pax_global_header00006660000000000000000000000064145405435460014524gustar00rootroot0000000000000052 comment=08eff926a6011ac84961fd2cee22d9fd4d4b1a88 httpx-0.26.0/000077500000000000000000000000001454054354600127605ustar00rootroot00000000000000httpx-0.26.0/.github/000077500000000000000000000000001454054354600143205ustar00rootroot00000000000000httpx-0.26.0/.github/CONTRIBUTING.md000066400000000000000000000201721454054354600165530ustar00rootroot00000000000000# Contributing Thank you for being interested in contributing to HTTPX. There are many ways you can contribute to the project: - Try HTTPX and [report bugs/issues you find](https://github.com/encode/httpx/issues/new) - [Implement new features](https://github.com/encode/httpx/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) - [Review Pull Requests of others](https://github.com/encode/httpx/pulls) - Write documentation - Participate in discussions ## Reporting Bugs or Other Issues Found something that HTTPX should support? Stumbled upon some unexpected behaviour? Contributions should generally start out with [a discussion](https://github.com/encode/httpx/discussions). Possible bugs may be raised as a "Potential Issue" discussion, feature requests may be raised as an "Ideas" discussion. We can then determine if the discussion needs to be escalated into an "Issue" or not, or if we'd consider a pull request. Try to be more descriptive as you can and in case of a bug report, provide as much information as possible like: - OS platform - Python version - Installed dependencies and versions (`python -m pip freeze`) - Code snippet - Error traceback You should always try to reduce any examples to the *simplest possible case* that demonstrates the issue. Some possibly useful tips for narrowing down potential issues... - Does the issue exist on HTTP/1.1, or HTTP/2, or both? - Does the issue exist with `Client`, `AsyncClient`, or both? - When using `AsyncClient` does the issue exist when using `asyncio` or `trio`, or both? ## Development To start developing HTTPX create a **fork** of the [HTTPX repository](https://github.com/encode/httpx) on GitHub. Then clone your fork with the following command replacing `YOUR-USERNAME` with your GitHub username: ```shell $ git clone https://github.com/YOUR-USERNAME/httpx ``` You can now install the project and its dependencies using: ```shell $ cd httpx $ scripts/install ``` ## Testing and Linting We use custom shell scripts to automate testing, linting, and documentation building workflow. To run the tests, use: ```shell $ scripts/test ``` !!! warning The test suite spawns testing servers on ports **8000** and **8001**. Make sure these are not in use, so the tests can run properly. You can run a single test script like this: ```shell $ scripts/test -- tests/test_multipart.py ``` To run the code auto-formatting: ```shell $ scripts/lint ``` Lastly, to run code checks separately (they are also run as part of `scripts/test`), run: ```shell $ scripts/check ``` ## Documenting Documentation pages are located under the `docs/` folder. To run the documentation site locally (useful for previewing changes), use: ```shell $ scripts/docs ``` ## Resolving Build / CI Failures Once you've submitted your pull request, the test suite will automatically run, and the results will show up in GitHub. If the test suite fails, you'll want to click through to the "Details" link, and try to identify why the test suite failed.

Failing PR commit status

Here are some common ways the test suite can fail: ### Check Job Failed

Failing GitHub action lint job

This job failing means there is either a code formatting issue or type-annotation issue. You can look at the job output to figure out why it's failed or within a shell run: ```shell $ scripts/check ``` It may be worth it to run `$ scripts/lint` to attempt auto-formatting the code and if that job succeeds commit the changes. ### Docs Job Failed This job failing means the documentation failed to build. This can happen for a variety of reasons like invalid markdown or missing configuration within `mkdocs.yml`. ### Python 3.X Job Failed

Failing GitHub action test job

This job failing means the unit tests failed or not all code paths are covered by unit tests. If tests are failing you will see this message under the coverage report: `=== 1 failed, 435 passed, 1 skipped, 1 xfailed in 11.09s ===` If tests succeed but coverage doesn't reach our current threshold, you will see this message under the coverage report: `FAIL Required test coverage of 100% not reached. Total coverage: 99.00%` ## Releasing *This section is targeted at HTTPX maintainers.* Before releasing a new version, create a pull request that includes: - **An update to the changelog**: - We follow the format from [keepachangelog](https://keepachangelog.com/en/1.0.0/). - [Compare](https://github.com/encode/httpx/compare/) `master` with the tag of the latest release, and list all entries that are of interest to our users: - Things that **must** go in the changelog: added, changed, deprecated or removed features, and bug fixes. - Things that **should not** go in the changelog: changes to documentation, tests or tooling. - Try sorting entries in descending order of impact / importance. - Keep it concise and to-the-point. 🎯 - **A version bump**: see `__version__.py`. For an example, see [#1006](https://github.com/encode/httpx/pull/1006). Once the release PR is merged, create a [new release](https://github.com/encode/httpx/releases/new) including: - Tag version like `0.13.3`. - Release title `Version 0.13.3` - Description copied from the changelog. Once created this release will be automatically uploaded to PyPI. If something goes wrong with the PyPI job the release can be published using the `scripts/publish` script. ## Development proxy setup To test and debug requests via a proxy it's best to run a proxy server locally. Any server should do but HTTPCore's test suite uses [`mitmproxy`](https://mitmproxy.org/) which is written in Python, it's fully featured and has excellent UI and tools for introspection of requests. You can install `mitmproxy` using `pip install mitmproxy` or [several other ways](https://docs.mitmproxy.org/stable/overview-installation/). `mitmproxy` does require setting up local TLS certificates for HTTPS requests, as its main purpose is to allow developers to inspect requests that pass through it. We can set them up follows: 1. [`pip install trustme-cli`](https://github.com/sethmlarson/trustme-cli/). 2. `trustme-cli -i example.org www.example.org`, assuming you want to test connecting to that domain, this will create three files: `server.pem`, `server.key` and `client.pem`. 3. `mitmproxy` requires a PEM file that includes the private key and the certificate so we need to concatenate them: `cat server.key server.pem > server.withkey.pem`. 4. Start the proxy server `mitmproxy --certs server.withkey.pem`, or use the [other mitmproxy commands](https://docs.mitmproxy.org/stable/) with different UI options. At this point the server is ready to start serving requests, you'll need to configure HTTPX as described in the [proxy section](https://www.python-httpx.org/advanced/#http-proxying) and the [SSL certificates section](https://www.python-httpx.org/advanced/#ssl-certificates), this is where our previously generated `client.pem` comes in: ``` import httpx proxies = {"all": "http://127.0.0.1:8080/"} with httpx.Client(proxies=proxies, verify="/path/to/client.pem") as client: response = client.get("https://example.org") print(response.status_code) # should print 200 ``` Note, however, that HTTPS requests will only succeed to the host specified in the SSL/TLS certificate we generated, HTTPS requests to other hosts will raise an error like: ``` ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'duckduckgo.com'. (_ssl.c:1108) ``` If you want to make requests to more hosts you'll need to regenerate the certificates and include all the hosts you intend to connect to in the seconds step, i.e. `trustme-cli -i example.org www.example.org duckduckgo.com www.duckduckgo.com` httpx-0.26.0/.github/FUNDING.yml000066400000000000000000000000171454054354600161330ustar00rootroot00000000000000github: encode httpx-0.26.0/.github/ISSUE_TEMPLATE/000077500000000000000000000000001454054354600165035ustar00rootroot00000000000000httpx-0.26.0/.github/ISSUE_TEMPLATE/1-issue.md000066400000000000000000000011141454054354600203100ustar00rootroot00000000000000--- name: Issue about: Please only raise an issue if you've been advised to do so after discussion. Thanks! 🙏 --- The starting point for issues should usually be a discussion... https://github.com/encode/httpx/discussions Possible bugs may be raised as a "Potential Issue" discussion, feature requests may be raised as an "Ideas" discussion. We can then determine if the discussion needs to be escalated into an "Issue" or not. This will help us ensure that the "Issues" list properly reflects ongoing or needed work on the project. --- - [ ] Initially raised as discussion #... httpx-0.26.0/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000006601454054354600204750ustar00rootroot00000000000000# Ref: https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository#configuring-the-template-chooser blank_issues_enabled: false contact_links: - name: Discussions url: https://github.com/encode/httpx/discussions about: > The "Discussions" forum is where you want to start. 💖 - name: Chat url: https://gitter.im/encode/community about: > Our community chat forum. httpx-0.26.0/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000010371454054354600201220ustar00rootroot00000000000000 # Summary # Checklist - [ ] I understand that this PR may be closed in case there was no previous discussion. (This doesn't apply to typos!) - [ ] I've added a test for each change that was introduced, and I tried as much as possible to make a single atomic change. - [ ] I've updated the documentation accordingly. httpx-0.26.0/.github/dependabot.yml000066400000000000000000000003161454054354600171500ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "pip" directory: "/" schedule: interval: "monthly" - package-ecosystem: "github-actions" directory: "/" schedule: interval: monthly httpx-0.26.0/.github/workflows/000077500000000000000000000000001454054354600163555ustar00rootroot00000000000000httpx-0.26.0/.github/workflows/publish.yml000066400000000000000000000011361454054354600205470ustar00rootroot00000000000000name: Publish on: push: tags: - '*' jobs: publish: name: "Publish release" runs-on: "ubuntu-latest" environment: name: deploy steps: - uses: "actions/checkout@v4" - uses: "actions/setup-python@v4" with: python-version: 3.8 - name: "Install dependencies" run: "scripts/install" - name: "Build package & docs" run: "scripts/build" - name: "Publish to PyPI & deploy docs" run: "scripts/publish" env: TWINE_USERNAME: __token__ TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} httpx-0.26.0/.github/workflows/test-suite.yml000066400000000000000000000014331454054354600212070ustar00rootroot00000000000000--- name: Test Suite on: push: branches: ["master"] pull_request: branches: ["master"] jobs: tests: name: "Python ${{ matrix.python-version }}" runs-on: "ubuntu-latest" strategy: matrix: python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] steps: - uses: "actions/checkout@v4" - uses: "actions/setup-python@v4" with: python-version: "${{ matrix.python-version }}" allow-prereleases: true - name: "Install dependencies" run: "scripts/install" - name: "Run linting checks" run: "scripts/check" - name: "Build package & docs" run: "scripts/build" - name: "Run tests" run: "scripts/test" - name: "Enforce coverage" run: "scripts/coverage" httpx-0.26.0/.gitignore000066400000000000000000000001701454054354600147460ustar00rootroot00000000000000*.pyc .coverage .pytest_cache/ .mypy_cache/ __pycache__/ htmlcov/ site/ *.egg-info/ venv*/ .python-version build/ dist/ httpx-0.26.0/CHANGELOG.md000066400000000000000000001432041454054354600145750ustar00rootroot00000000000000# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## 0.26.0 (20th December, 2023) ### Added * The `proxy` argument was added. You should use the `proxy` argument instead of the deprecated `proxies`, or use `mounts=` for more complex configurations. (#2879) ### Deprecated * The `proxies` argument is now deprecated. It will still continue to work, but it will be removed in the future. (#2879) ### Fixed * Fix cases of double escaping of URL path components. Allow / as a safe character in the query portion. (#2990) * Handle `NO_PROXY` envvar cases when a fully qualified URL is supplied as the value. (#2741) * Allow URLs where username or password contains unescaped '@'. (#2986) * Ensure ASGI `raw_path` does not include URL query component. (#2999) * Ensure `Response.iter_text()` cannot yield empty strings. (#2998) ## 0.25.2 (24th November, 2023) ### Added * Add missing type hints to few `__init__()` methods. (#2938) ## 0.25.1 (3rd November, 2023) ### Added * Add support for Python 3.12. (#2854) * Add support for httpcore 1.0 (#2885) ### Fixed * Raise `ValueError` on `Response.encoding` being set after `Response.text` has been accessed. (#2852) ## 0.25.0 (11th September, 2023) ### Removed * Drop support for Python 3.7. (#2813) ### Added * Support HTTPS proxies. (#2845) * Change the type of `Extensions` from `Mapping[Str, Any]` to `MutableMapping[Str, Any]`. (#2803) * Add `socket_options` argument to `httpx.HTTPTransport` and `httpx.AsyncHTTPTransport` classes. (#2716) * The `Response.raise_for_status()` method now returns the response instance. For example: `data = httpx.get('...').raise_for_status().json()`. (#2776) ### Fixed * Return `500` error response instead of exceptions when `raise_app_exceptions=False` is set on `ASGITransport`. (#2669) * Ensure all `WSGITransport` environs have a `SERVER_PROTOCOL`. (#2708) * Always encode forward slashes as `%2F` in query parameters (#2723) * Use Mozilla documentation instead of `httpstatuses.com` for HTTP error reference (#2768) ## 0.24.1 (17th May, 2023) ### Added * Provide additional context in some `InvalidURL` exceptions. (#2675) ### Fixed * Fix optional percent-encoding behaviour. (#2671) * More robust checking for opening upload files in binary mode. (#2630) * Properly support IP addresses in `NO_PROXY` environment variable. (#2659) * Set default file for `NetRCAuth()` to `None` to use the stdlib default. (#2667) * Set logging request lines to INFO level for async requests, in line with sync requests. (#2656) * Fix which gen-delims need to be escaped for path/query/fragment components in URL. (#2701) ## 0.24.0 (6th April, 2023) ### Changed * The logging behaviour has been changed to be more in-line with other standard Python logging usages. We no longer have a custom `TRACE` log level, and we no longer use the `HTTPX_LOG_LEVEL` environment variable to auto-configure logging. We now have a significant amount of `DEBUG` logging available at the network level. Full documentation is available at https://www.python-httpx.org/logging/ (#2547, encode/httpcore#648) * The `Response.iter_lines()` method now matches the stdlib behaviour and does not include the newline characters. It also resolves a performance issue. (#2423) * Query parameter encoding switches from using + for spaces and %2F for forward slash, to instead using %20 for spaces and treating forward slash as a safe, unescaped character. This differs from `requests`, but is in line with browser behavior in Chrome, Safari, and Firefox. Both options are RFC valid. (#2543) * NetRC authentication is no longer automatically handled, but is instead supported by an explicit `httpx.NetRCAuth()` authentication class. See the documentation at https://www.python-httpx.org/advanced/#netrc-support (#2525) ### Removed * The `rfc3986` dependancy has been removed. (#2252) ## 0.23.3 (4th January, 2023) ### Fixed * Version 0.23.2 accidentally included stricter type checking on query parameters. This shouldn've have been included in a minor version bump, and is now reverted. (#2523, #2539) ## 0.23.2 (2nd January, 2023) ### Added * Support digest auth nonce counting to avoid multiple auth requests. (#2463) ### Fixed * Multipart file uploads where the file length cannot be determine now use chunked transfer encoding, rather than loading the entire file into memory in order to determine the `Content-Length`. (#2382) * Raise `TypeError` if content is passed a dict-instance. (#2495) * Partially revert the API breaking change in 0.23.1, which removed `RawURL`. We continue to expose a `url.raw` property which is now a plain named-tuple. This API is still expected to be deprecated, but we will do so with a major version bump. (#2481) ## 0.23.1 (18th November, 2022) **Note**: The 0.23.1 release should have used a proper version bump, rather than a minor point release. There are API surface area changes that may affect some users. See the "Removed" section of these release notes for details. ### Added * Support for Python 3.11. (#2420) * Allow setting an explicit multipart boundary in `Content-Type` header. (#2278) * Allow `tuple` or `list` for multipart values, not just `list`. (#2355) * Allow `str` content for multipart upload files. (#2400) * Support connection upgrades. See https://www.encode.io/httpcore/extensions/#upgrade-requests ### Fixed * Don't drop empty query parameters. (#2354) ### Removed * Upload files *must* always be opened in binary mode. (#2400) * Drop `.read`/`.aread` from `SyncByteStream`/`AsyncByteStream`. (#2407) * Drop `RawURL`. (#2241) ## 0.23.0 (23rd May, 2022) ### Changed * Drop support for Python 3.6. (#2097) * Use `utf-8` as the default character set, instead of falling back to `charset-normalizer` for auto-detection. To enable automatic character set detection, see [the documentation](https://www.python-httpx.org/advanced/#character-set-encodings-and-auto-detection). (#2165) ### Fixed * Fix `URL.copy_with` for some oddly formed URL cases. (#2185) * Digest authentication should use case-insensitive comparison for determining which algorithm is being used. (#2204) * Fix console markup escaping in command line client. (#1866) * When files are used in multipart upload, ensure we always seek to the start of the file. (#2065) * Ensure that `iter_bytes` never yields zero-length chunks. (#2068) * Preserve `Authorization` header for redirects that are to the same origin, but are an `http`-to-`https` upgrade. (#2074) * When responses have binary output, don't print the output to the console in the command line client. Use output like `<16086 bytes of binary data>` instead. (#2076) * Fix display of `--proxies` argument in the command line client help. (#2125) * Close responses when task cancellations occur during stream reading. (#2156) * Fix type error on accessing `.request` on `HTTPError` exceptions. (#2158) ## 0.22.0 (26th January, 2022) ### Added * Support for [the SOCKS5 proxy protocol](https://www.python-httpx.org/advanced/#socks) via [the `socksio` package](https://github.com/sethmlarson/socksio). (#2034) * Support for custom headers in multipart/form-data requests (#1936) ### Fixed * Don't perform unreliable close/warning on `__del__` with unclosed clients. (#2026) * Fix `Headers.update(...)` to correctly handle repeated headers (#2038) ## 0.21.3 (6th January, 2022) ### Fixed * Fix streaming uploads using `SyncByteStream` or `AsyncByteStream`. Regression in 0.21.2. (#2016) ## 0.21.2 (5th January, 2022) ### Fixed * HTTP/2 support for tunnelled proxy cases. (#2009) * Improved the speed of large file uploads. (#1948) ## 0.21.1 (16th November, 2021) ### Fixed * The `response.url` property is now correctly annotated as `URL`, instead of `Optional[URL]`. (#1940) ## 0.21.0 (15th November, 2021) The 0.21.0 release integrates against a newly redesigned `httpcore` backend. Both packages ought to automatically update to the required versions, but if you are seeing any issues, you should ensure that you have `httpx==0.21.*` and `httpcore==0.14.*` installed. ### Added * The command-line client will now display connection information when `-v/--verbose` is used. * The command-line client will now display server certificate information when `-v/--verbose` is used. * The command-line client is now able to properly detect if the outgoing request should be formatted as HTTP/1.1 or HTTP/2, based on the result of the HTTP/2 negotiation. ### Removed * Curio support is no longer currently included. Please get in touch if you require this, so that we can assess priorities. ## 0.20.0 (13th October, 2021) The 0.20.0 release adds an integrated command-line client, and also includes some design changes. The most notable of these is that redirect responses are no longer automatically followed, unless specifically requested. This design decision prioritises a more explicit approach to redirects, in order to avoid code that unintentionally issues multiple requests as a result of misconfigured URLs. For example, previously a client configured to send requests to `http://api.github.com/` would end up sending every API request twice, as each request would be redirected to `https://api.github.com/`. If you do want auto-redirect behaviour, you can enable this either by configuring the client instance with `Client(follow_redirects=True)`, or on a per-request basis, with `.get(..., follow_redirects=True)`. This change is a classic trade-off between convenience and precision, with no "right" answer. See [discussion #1785](https://github.com/encode/httpx/discussions/1785) for more context. The other major design change is an update to the Transport API, which is the low-level interface against which requests are sent. Previously this interface used only primitive datastructures, like so... ```python (status_code, headers, stream, extensions) = transport.handle_request(method, url, headers, stream, extensions) try ... finally: stream.close() ``` Now the interface is much simpler... ```python response = transport.handle_request(request) try ... finally: response.close() ``` ### Changed * The `allow_redirects` flag is now `follow_redirects` and defaults to `False`. * The `raise_for_status()` method will now raise an exception for any responses except those with 2xx status codes. Previously only 4xx and 5xx status codes would result in an exception. * The low-level transport API changes to the much simpler `response = transport.handle_request(request)`. * The `client.send()` method no longer accepts a `timeout=...` argument, but the `client.build_request()` does. This required by the signature change of the Transport API. The request timeout configuration is now stored on the request instance, as `request.extensions['timeout']`. ### Added * Added the `httpx` command-line client. * Response instances now include `.is_informational`, `.is_success`, `.is_redirect`, `.is_client_error`, and `.is_server_error` properties for checking 1xx, 2xx, 3xx, 4xx, and 5xx response types. Note that the behaviour of `.is_redirect` is slightly different in that it now returns True for all 3xx responses, in order to allow for a consistent set of properties onto the different HTTP status code types. The `response.has_redirect_location` location may be used to determine responses with properly formed URL redirects. ### Fixed * `response.iter_bytes()` no longer raises a ValueError when called on a response with no content. (Pull #1827) * The `'wsgi.error'` configuration now defaults to `sys.stderr`, and is corrected to be a `TextIO` interface, not a `BytesIO` interface. Additionally, the WSGITransport now accepts a `wsgi_error` configuration. (Pull #1828) * Follow the WSGI spec by properly closing the iterable returned by the application. (Pull #1830) ## 0.19.0 (19th August, 2021) ### Added * Add support for `Client(allow_redirects=)`. (Pull #1790) * Add automatic character set detection, when no `charset` is included in the response `Content-Type` header. (Pull #1791) ### Changed * Event hooks are now also called for any additional redirect or auth requests/responses. (Pull #1806) * Strictly enforce that upload files must be opened in binary mode. (Pull #1736) * Strictly enforce that client instances can only be opened and closed once, and cannot be re-opened. (Pull #1800) * Drop `mode` argument from `httpx.Proxy(..., mode=...)`. (Pull #1795) ## 0.18.2 (17th June, 2021) ### Added * Support for Python 3.10. (Pull #1687) * Expose `httpx.USE_CLIENT_DEFAULT`, used as the default to `auth` and `timeout` parameters in request methods. (Pull #1634) * Support [HTTP/2 "prior knowledge"](https://python-hyper.org/projects/hyper-h2/en/v2.3.1/negotiating-http2.html#prior-knowledge), using `httpx.Client(http1=False, http2=True)`. (Pull #1624) ### Fixed * Clean up some cases where warnings were being issued. (Pull #1687) * Prefer Content-Length over Transfer-Encoding: chunked for content= cases. (Pull #1619) ## 0.18.1 (29th April, 2021) ### Changed * Update brotli support to use the `brotlicffi` package (Pull #1605) * Ensure that `Request(..., stream=...)` does not auto-generate any headers on the request instance. (Pull #1607) ### Fixed * Pass through `timeout=...` in top-level httpx.stream() function. (Pull #1613) * Map httpcore transport close exceptions to httpx exceptions. (Pull #1606) ## 0.18.0 (27th April, 2021) The 0.18.x release series formalises our low-level Transport API, introducing the base classes `httpx.BaseTransport` and `httpx.AsyncBaseTransport`. See the "[Writing custom transports](https://www.python-httpx.org/advanced/#writing-custom-transports)" documentation and the [`httpx.BaseTransport.handle_request()`](https://github.com/encode/httpx/blob/397aad98fdc8b7580a5fc3e88f1578b4302c6382/httpx/_transports/base.py#L77-L147) docstring for more complete details on implementing custom transports. Pull request #1522 includes a checklist of differences from the previous `httpcore` transport API, for developers implementing custom transports. The following API changes have been issuing deprecation warnings since 0.17.0 onwards, and are now fully deprecated... * You should now use httpx.codes consistently instead of httpx.StatusCodes. * Use limits=... instead of pool_limits=.... * Use proxies={"http://": ...} instead of proxies={"http": ...} for scheme-specific mounting. ### Changed * Transport instances now inherit from `httpx.BaseTransport` or `httpx.AsyncBaseTransport`, and should implement either the `handle_request` method or `handle_async_request` method. (Pull #1522, #1550) * The `response.ext` property and `Response(ext=...)` argument are now named `extensions`. (Pull #1522) * The recommendation to not use `data=` in favour of `content=` has now been escalated to a deprecation warning. (Pull #1573) * Drop `Response(on_close=...)` from API, since it was a bit of leaking implementation detail. (Pull #1572) * When using a client instance, cookies should always be set on the client, rather than on a per-request basis. We prefer enforcing a stricter API here because it provides clearer expectations around cookie persistence, particularly when redirects occur. (Pull #1574) * The runtime exception `httpx.ResponseClosed` is now named `httpx.StreamClosed`. (#1584) * The `httpx.QueryParams` model now presents an immutable interface. There is a discussion on [the design and motivation here](https://github.com/encode/httpx/discussions/1599). Use `client.params = client.params.merge(...)` instead of `client.params.update(...)`. The basic query manipulation methods are `query.set(...)`, `query.add(...)`, and `query.remove()`. (#1600) ### Added * The `Request` and `Response` classes can now be serialized using pickle. (#1579) * Handle `data={"key": [None|int|float|bool]}` cases. (Pull #1539) * Support `httpx.URL(**kwargs)`, for example `httpx.URL(scheme="https", host="www.example.com", path="/')`, or `httpx.URL("https://www.example.com/", username="tom@gmail.com", password="123 456")`. (Pull #1601) * Support `url.copy_with(params=...)`. (Pull #1601) * Add `url.params` parameter, returning an immutable `QueryParams` instance. (Pull #1601) * Support query manipulation methods on the URL class. These are `url.copy_set_param()`, `url.copy_add_param()`, `url.copy_remove_param()`, `url.copy_merge_params()`. (Pull #1601) * The `httpx.URL` class now performs port normalization, so `:80` ports are stripped from `http` URLs and `:443` ports are stripped from `https` URLs. (Pull #1603) * The `URL.host` property returns unicode strings for internationalized domain names. The `URL.raw_host` property returns byte strings with IDNA escaping applied. (Pull #1590) ### Fixed * Fix Content-Length for cases of `files=...` where unicode string is used as the file content. (Pull #1537) * Fix some cases of merging relative URLs against `Client(base_url=...)`. (Pull #1532) * The `request.content` attribute is now always available except for streaming content, which requires an explicit `.read()`. (Pull #1583) ## 0.17.1 (March 15th, 2021) ### Fixed * Type annotation on `CertTypes` allows `keyfile` and `password` to be optional. (Pull #1503) * Fix httpcore pinned version. (Pull #1495) ## 0.17.0 (February 28th, 2021) ### Added * Add `httpx.MockTransport()`, allowing to mock out a transport using pre-determined responses. (Pull #1401, Pull #1449) * Add `httpx.HTTPTransport()` and `httpx.AsyncHTTPTransport()` default transports. (Pull #1399) * Add mount API support, using `httpx.Client(mounts=...)`. (Pull #1362) * Add `chunk_size` parameter to `iter_raw()`, `iter_bytes()`, `iter_text()`. (Pull #1277) * Add `keepalive_expiry` parameter to `httpx.Limits()` configuration. (Pull #1398) * Add repr to `httpx.Cookies` to display available cookies. (Pull #1411) * Add support for `params=` (previously only `params=` was supported). (Pull #1426) ### Fixed * Add missing `raw_path` to ASGI scope. (Pull #1357) * Tweak `create_ssl_context` defaults to use `trust_env=True`. (Pull #1447) * Properly URL-escape WSGI `PATH_INFO`. (Pull #1391) * Properly set default ports in WSGI transport. (Pull #1469) * Properly encode slashes when using `base_url`. (Pull #1407) * Properly map exceptions in `request.aclose()`. (Pull #1465) ## 0.16.1 (October 8th, 2020) ### Fixed * Support literal IPv6 addresses in URLs. (Pull #1349) * Force lowercase headers in ASGI scope dictionaries. (Pull #1351) ## 0.16.0 (October 6th, 2020) ### Changed * Preserve HTTP header casing. (Pull #1338, encode/httpcore#216, python-hyper/h11#104) * Drop `response.next()` and `response.anext()` methods in favour of `response.next_request` attribute. (Pull #1339) * Closed clients now raise a runtime error if attempting to send a request. (Pull #1346) ### Added * Add Python 3.9 to officially supported versions. * Type annotate `__enter__`/`__exit__`/`__aenter__`/`__aexit__` in a way that supports subclasses of `Client` and `AsyncClient`. (Pull #1336) ## 0.15.5 (October 1st, 2020) ### Added * Add `response.next_request` (Pull #1334) ## 0.15.4 (September 25th, 2020) ### Added * Support direct comparisons between `Headers` and dicts or lists of two-tuples. Eg. `assert response.headers == {"Content-Length": 24}` (Pull #1326) ### Fixed * Fix automatic `.read()` when `Response` instances are created with `content=` (Pull #1324) ## 0.15.3 (September 24th, 2020) ### Fixed * Fixed connection leak in async client due to improper closing of response streams. (Pull #1316) ## 0.15.2 (September 23nd, 2020) ### Fixed * Fixed `response.elapsed` property. (Pull #1313) * Fixed client authentication interaction with `.stream()`. (Pull #1312) ## 0.15.1 (September 23nd, 2020) ### Fixed * ASGITransport now properly applies URL decoding to the `path` component, as-per the ASGI spec. (Pull #1307) ## 0.15.0 (September 22nd, 2020) ### Added * Added support for curio. (Pull https://github.com/encode/httpcore/pull/168) * Added support for event hooks. (Pull #1246) * Added support for authentication flows which require either sync or async I/O. (Pull #1217) * Added support for monitoring download progress with `response.num_bytes_downloaded`. (Pull #1268) * Added `Request(content=...)` for byte content, instead of overloading `Request(data=...)` (Pull #1266) * Added support for all URL components as parameter names when using `url.copy_with(...)`. (Pull #1285) * Neater split between automatically populated headers on `Request` instances, vs default `client.headers`. (Pull #1248) * Unclosed `AsyncClient` instances will now raise warnings if garbage collected. (Pull #1197) * Support `Response(content=..., text=..., html=..., json=...)` for creating usable response instances in code. (Pull #1265, #1297) * Support instantiating requests from the low-level transport API. (Pull #1293) * Raise errors on invalid URL types. (Pull #1259) ### Changed * Cleaned up expected behaviour for URL escaping. `url.path` is now URL escaped. (Pull #1285) * Cleaned up expected behaviour for bytes vs str in URL components. `url.userinfo` and `url.query` are not URL escaped, and so return bytes. (Pull #1285) * Drop `url.authority` property in favour of `url.netloc`, since "authority" was semantically incorrect. (Pull #1285) * Drop `url.full_path` property in favour of `url.raw_path`, for better consistency with other parts of the API. (Pull #1285) * No longer use the `chardet` library for auto-detecting charsets, instead defaulting to a simpler approach when no charset is specified. (#1269) ### Fixed * Swapped ordering of redirects and authentication flow. (Pull #1267) * `.netrc` lookups should use host, not host+port. (Pull #1298) ### Removed * The `URLLib3Transport` class no longer exists. We've published it instead as an example of [a custom transport class](https://gist.github.com/florimondmanca/d56764d78d748eb9f73165da388e546e). (Pull #1182) * Drop `request.timer` attribute, which was being used internally to set `response.elapsed`. (Pull #1249) * Drop `response.decoder` attribute, which was being used internally. (Pull #1276) * `Request.prepare()` is now a private method. (Pull #1284) * The `Headers.getlist()` method had previously been deprecated in favour of `Headers.get_list()`. It is now fully removed. * The `QueryParams.getlist()` method had previously been deprecated in favour of `QueryParams.get_list()`. It is now fully removed. * The `URL.is_ssl` property had previously been deprecated in favour of `URL.scheme == "https"`. It is now fully removed. * The `httpx.PoolLimits` class had previously been deprecated in favour of `httpx.Limits`. It is now fully removed. * The `max_keepalive` setting had previously been deprecated in favour of the more explicit `max_keepalive_connections`. It is now fully removed. * The verbose `httpx.Timeout(5.0, connect_timeout=60.0)` style had previously been deprecated in favour of `httpx.Timeout(5.0, connect=60.0)`. It is now fully removed. * Support for instantiating a timeout config missing some defaults, such as `httpx.Timeout(connect=60.0)`, had previously been deprecated in favour of enforcing a more explicit style, such as `httpx.Timeout(5.0, connect=60.0)`. This is now strictly enforced. ## 0.14.3 (September 2nd, 2020) ### Added * `http.Response()` may now be instantiated without a `request=...` parameter. Useful for some unit testing cases. (Pull #1238) * Add `103 Early Hints` and `425 Too Early` status codes. (Pull #1244) ### Fixed * `DigestAuth` now handles responses that include multiple 'WWW-Authenticate' headers. (Pull #1240) * Call into transport `__enter__`/`__exit__` or `__aenter__`/`__aexit__` when client is used in a context manager style. (Pull #1218) ## 0.14.2 (August 24th, 2020) ### Added * Support `client.get(..., auth=None)` to bypass the default authentication on a clients. (Pull #1115) * Support `client.auth = ...` property setter. (Pull #1185) * Support `httpx.get(..., proxies=...)` on top-level request functions. (Pull #1198) * Display instances with nicer import styles. (Eg. ) (Pull #1155) * Support `cookies=[(key, value)]` list-of-two-tuples style usage. (Pull #1211) ### Fixed * Ensure that automatically included headers on a request may be modified. (Pull #1205) * Allow explicit `Content-Length` header on streaming requests. (Pull #1170) * Handle URL quoted usernames and passwords properly. (Pull #1159) * Use more consistent default for `HEAD` requests, setting `allow_redirects=True`. (Pull #1183) * If a transport error occurs while streaming the response, raise an `httpx` exception, not the underlying `httpcore` exception. (Pull #1190) * Include the underlying `httpcore` traceback, when transport exceptions occur. (Pull #1199) ## 0.14.1 (August 11th, 2020) ### Added * The `httpx.URL(...)` class now raises `httpx.InvalidURL` on invalid URLs, rather than exposing the underlying `rfc3986` exception. If a redirect response includes an invalid 'Location' header, then a `RemoteProtocolError` exception is raised, which will be associated with the request that caused it. (Pull #1163) ### Fixed * Handling multiple `Set-Cookie` headers became broken in the 0.14.0 release, and is now resolved. (Pull #1156) ## 0.14.0 (August 7th, 2020) The 0.14 release includes a range of improvements to the public API, intended on preparing for our upcoming 1.0 release. * Our HTTP/2 support is now fully optional. **You now need to use `pip install httpx[http2]` if you want to include the HTTP/2 dependencies.** * Our HSTS support has now been removed. Rewriting URLs from `http` to `https` if the host is on the HSTS list can be beneficial in avoiding roundtrips to incorrectly formed URLs, but on balance we've decided to remove this feature, on the principle of least surprise. Most programmatic clients do not include HSTS support, and for now we're opting to remove our support for it. * Our exception hierarchy has been overhauled. Most users will want to stick with their existing `httpx.HTTPError` usage, but we've got a clearer overall structure now. See https://www.python-httpx.org/exceptions/ for more details. When upgrading you should be aware of the following public API changes. Note that deprecated usages will currently continue to function, but will issue warnings. * You should now use `httpx.codes` consistently instead of `httpx.StatusCodes`. * Usage of `httpx.Timeout()` should now always include an explicit default. Eg. `httpx.Timeout(None, pool=5.0)`. * When using `httpx.Timeout()`, we now have more concisely named keyword arguments. Eg. `read=5.0`, instead of `read_timeout=5.0`. * Use `httpx.Limits()` instead of `httpx.PoolLimits()`, and `limits=...` instead of `pool_limits=...`. * The `httpx.Limits(max_keepalive=...)` argument is now deprecated in favour of a more explicit `httpx.Limits(max_keepalive_connections=...)`. * Keys used with `Client(proxies={...})` should now be in the style of `{"http://": ...}`, rather than `{"http": ...}`. * The multidict methods `Headers.getlist()` and `QueryParams.getlist()` are deprecated in favour of more consistent `.get_list()` variants. * The `URL.is_ssl` property is deprecated in favour of `URL.scheme == "https"`. * The `URL.join(relative_url=...)` method is now `URL.join(url=...)`. This change does not support warnings for the deprecated usage style. One notable aspect of the 0.14.0 release is that it tightens up the public API for `httpx`, by ensuring that several internal attributes and methods have now become strictly private. The following previously had nominally public names on the client, but were all undocumented and intended solely for internal usage. They are all now replaced with underscored names, and should not be relied on or accessed. These changes should not affect users who have been working from the `httpx` documentation. * `.merge_url()`, `.merge_headers()`, `.merge_cookies()`, `.merge_queryparams()` * `.build_auth()`, `.build_redirect_request()` * `.redirect_method()`, `.redirect_url()`, `.redirect_headers()`, `.redirect_stream()` * `.send_handling_redirects()`, `.send_handling_auth()`, `.send_single_request()` * `.init_transport()`, `.init_proxy_transport()` * `.proxies`, `.transport`, `.netrc`, `.get_proxy_map()` See pull requests #997, #1065, #1071. Some areas of API which were already on the deprecation path, and were raising warnings or errors in 0.13.x have now been escalated to being fully removed. * Drop `ASGIDispatch`, `WSGIDispatch`, which have been replaced by `ASGITransport`, `WSGITransport`. * Drop `dispatch=...`` on client, which has been replaced by `transport=...`` * Drop `soft_limit`, `hard_limit`, which have been replaced by `max_keepalive` and `max_connections`. * Drop `Response.stream` and` `Response.raw`, which have been replaced by ``.aiter_bytes` and `.aiter_raw`. * Drop `proxies=` in favor of `proxies=httpx.Proxy(...)`. See pull requests #1057, #1058. ### Added * Added dedicated exception class `httpx.HTTPStatusError` for `.raise_for_status()` exceptions. (Pull #1072) * Added `httpx.create_ssl_context()` helper function. (Pull #996) * Support for proxy exlcusions like `proxies={"https://www.example.com": None}`. (Pull #1099) * Support `QueryParams(None)` and `client.params = None`. (Pull #1060) ### Changed * Use `httpx.codes` consistently in favour of `httpx.StatusCodes` which is placed into deprecation. (Pull #1088) * Usage of `httpx.Timeout()` should now always include an explicit default. Eg. `httpx.Timeout(None, pool=5.0)`. (Pull #1085) * Switch to more concise `httpx.Timeout()` keyword arguments. Eg. `read=5.0`, instead of `read_timeout=5.0`. (Pull #1111) * Use `httpx.Limits()` instead of `httpx.PoolLimits()`, and `limits=...` instead of `pool_limits=...`. (Pull #1113) * Keys used with `Client(proxies={...})` should now be in the style of `{"http://": ...}`, rather than `{"http": ...}`. (Pull #1127) * The multidict methods `Headers.getlist` and `QueryParams.getlist` are deprecated in favour of more consistent `.get_list()` variants. (Pull #1089) * `URL.port` becomes `Optional[int]`. Now only returns a port if one is explicitly included in the URL string. (Pull #1080) * The `URL(..., allow_relative=[bool])` parameter no longer exists. All URL instances may be relative. (Pull #1073) * Drop unnecessary `url.full_path = ...` property setter. (Pull #1069) * The `URL.join(relative_url=...)` method is now `URL.join(url=...)`. (Pull #1129) * The `URL.is_ssl` property is deprecated in favour of `URL.scheme == "https"`. (Pull #1128) ### Fixed * Add missing `Response.next()` method. (Pull #1055) * Ensure all exception classes are exposed as public API. (Pull #1045) * Support multiple items with an identical field name in multipart encodings. (Pull #777) * Skip HSTS preloading on single-label domains. (Pull #1074) * Fixes for `Response.iter_lines()`. (Pull #1033, #1075) * Ignore permission errors when accessing `.netrc` files. (Pull #1104) * Allow bare hostnames in `HTTP_PROXY` etc... environment variables. (Pull #1120) * Settings `app=...` or `transport=...` bypasses any environment based proxy defaults. (Pull #1122) * Fix handling of `.base_url` when a path component is included in the base URL. (Pull #1130) --- ## 0.13.3 (May 29th, 2020) ### Fixed * Include missing keepalive expiry configuration. (Pull #1005) * Improved error message when URL redirect has a custom scheme. (Pull #1002) ## 0.13.2 (May 27th, 2020) ### Fixed * Include explicit "Content-Length: 0" on POST, PUT, PATCH if no request body is used. (Pull #995) * Add `http2` option to `httpx.Client`. (Pull #982) * Tighten up API typing in places. (Pull #992, #999) ## 0.13.1 (May 22nd, 2020) ### Fixed * Fix pool options deprecation warning. (Pull #980) * Include `httpx.URLLib3ProxyTransport` in top-level API. (Pull #979) ## 0.13.0 (May 22nd, 2020) This release switches to `httpcore` for all the internal networking, which means: * We're using the same codebase for both our sync and async clients. * HTTP/2 support is now available with the sync client. * We no longer have a `urllib3` dependency for our sync client, although there is still an *optional* `URLLib3Transport` class. It also means we've had to remove our UDS support, since maintaining that would have meant having to push back our work towards a 1.0 release, which isn't a trade-off we wanted to make. We also now have [a public "Transport API"](https://www.python-httpx.org/advanced/#custom-transports), which you can use to implement custom transport implementations against. This formalises and replaces our previously private "Dispatch API". ### Changed * Use `httpcore` for underlying HTTP transport. Drop `urllib3` requirement. (Pull #804, #967) * Rename pool limit options from `soft_limit`/`hard_limit` to `max_keepalive`/`max_connections`. (Pull #968) * The previous private "Dispatch API" has now been promoted to a public "Transport API". When customizing the transport use `transport=...`. The `ASGIDispatch` and `WSGIDispatch` class naming is deprecated in favour of `ASGITransport` and `WSGITransport`. (Pull #963) ### Added * Added `URLLib3Transport` class for optional `urllib3` transport support. (Pull #804, #963) * Streaming multipart uploads. (Pull #857) * Logging via HTTPCORE_LOG_LEVEL and HTTPX_LOG_LEVEL environment variables and TRACE level logging. (Pull encode/httpcore#79) ### Fixed * Performance improvement in brotli decoder. (Pull #906) * Proper warning level of deprecation notice in `Response.stream` and `Response.raw`. (Pull #908) * Fix support for generator based WSGI apps. (Pull #887) * Reuse of connections on HTTP/2 in close concurrency situations. (Pull encode/httpcore#81) * Honor HTTP/2 max concurrent streams settings (Pull encode/httpcore#89, encode/httpcore#90) * Fix bytes support in multipart uploads. (Pull #974) * Improve typing support for `files=...`. (Pull #976) ### Removed * Dropped support for `Client(uds=...)` (Pull #804) ## 0.13.0.dev2 (May 12th, 2020) The 0.13.0.dev2 is a *pre-release* version. To install it, use `pip install httpx --pre`. ### Added * Logging via HTTPCORE_LOG_LEVEL and HTTPX_LOG_LEVEL environment variables and TRACE level logging. (HTTPCore Pull #79) ### Fixed * Reuse of connections on HTTP/2 in close concurrency situations. (HTTPCore Pull #81) * When using an `app=` observe neater disconnect behaviour instead of sending empty body messages. (Pull #919) ## 0.13.0.dev1 (May 6th, 2020) The 0.13.0.dev1 is a *pre-release* version. To install it, use `pip install httpx --pre`. ### Fixed * Passing `http2` flag to proxy dispatchers. (Pull #934) * Use [`httpcore` v0.8.3](https://github.com/encode/httpcore/releases/tag/0.8.3) which addresses problems in handling of headers when using proxies. ## 0.13.0.dev0 (April 30th, 2020) The 0.13.0.dev0 is a *pre-release* version. To install it, use `pip install httpx --pre`. This release switches to `httpcore` for all the internal networking, which means: * We're using the same codebase for both our sync and async clients. * HTTP/2 support is now available with the sync client. * We no longer have a `urllib3` dependency for our sync client, although there is still an *optional* `URLLib3Dispatcher` class. It also means we've had to remove our UDS support, since maintaining that would have meant having to push back our work towards a 1.0 release, which isn't a trade-off we wanted to make. ### Changed * Use `httpcore` for underlying HTTP transport. Drop `urllib3` requirement. (Pull #804) ### Added * Added `URLLib3Dispatcher` class for optional `urllib3` transport support. (Pull #804) * Streaming multipart uploads. (Pull #857) ### Fixed * Performance improvement in brotli decoder. (Pull #906) * Proper warning level of deprecation notice in `Response.stream` and `Response.raw`. (Pull #908) * Fix support for generator based WSGI apps. (Pull #887) ### Removed * Dropped support for `Client(uds=...)` (Pull #804) --- ## 0.12.1 (March 19th, 2020) ### Fixed * Resolved packaging issue, where additional files were being included. ## 0.12.0 (March 9th, 2020) The 0.12 release tightens up the API expectations for `httpx` by switching to private module names to enforce better clarity around public API. All imports of `httpx` should import from the top-level package only, such as `from httpx import Request`, rather than importing from privately namespaced modules such as `from httpx._models import Request`. ### Added * Support making response body available to auth classes with `.requires_response_body`. (Pull #803) * Export `NetworkError` exception. (Pull #814) * Add support for `NO_PROXY` environment variable. (Pull #835) ### Changed * Switched to private module names. (Pull #785) * Drop redirect looping detection and the `RedirectLoop` exception, instead using `TooManyRedirects`. (Pull #819) * Drop `backend=...` parameter on `AsyncClient`, in favour of always autodetecting `trio`/`asyncio`. (Pull #791) ### Fixed * Support basic auth credentials in proxy URLs. (Pull #780) * Fix `httpx.Proxy(url, mode="FORWARD_ONLY")` configuration. (Pull #788) * Fallback to setting headers as UTF-8 if no encoding is specified. (Pull #820) * Close proxy dispatches classes on client close. (Pull #826) * Support custom `cert` parameters even if `verify=False`. (Pull #796) * Don't support invalid dict-of-dicts form data in `data=...`. (Pull #811) --- ## 0.11.1 (January 17th, 2020) ### Fixed * Fixed usage of `proxies=...` on `Client()`. (Pull #763) * Support both `zlib` and `deflate` style encodings on `Content-Encoding: deflate`. (Pull #758) * Fix for streaming a redirect response body with `allow_redirects=False`. (Pull #766) * Handle redirect with malformed Location headers missing host. (Pull #774) ## 0.11.0 (January 9th, 2020) The 0.11 release reintroduces our sync support, so that `httpx` now supports both a standard thread-concurrency API, and an async API. Existing async `httpx` users that are upgrading to 0.11 should ensure that: * Async codebases should always use a client instance to make requests, instead of the top-level API. * The async client is named as `httpx.AsyncClient()`, instead of `httpx.Client()`. * When instantiating proxy configurations use the `httpx.Proxy()` class, instead of the previous `httpx.HTTPProxy()`. This new configuration class works for configuring both sync and async clients. We believe the API is now pretty much stable, and are aiming for a 1.0 release sometime on or before April 2020. ### Changed - Top level API such as `httpx.get(url, ...)`, `httpx.post(url, ...)`, `httpx.request(method, url, ...)` becomes synchronous. - Added `httpx.Client()` for synchronous clients, with `httpx.AsyncClient` being used for async clients. - Switched to `proxies=httpx.Proxy(...)` for proxy configuration. - Network connection errors are wrapped in `httpx.NetworkError`, rather than exposing lower-level exception types directly. ### Removed - The `request.url.origin` property and `httpx.Origin` class are no longer available. - The per-request `cert`, `verify`, and `trust_env` arguments are escalated from raising errors if used, to no longer being available. These arguments should be used on a per-client instance instead, or in the top-level API. - The `stream` argument has escalated from raising an error when used, to no longer being available. Use the `client.stream(...)` or `httpx.stream()` streaming API instead. ### Fixed - Redirect loop detection matches against `(method, url)` rather than `url`. (Pull #734) --- ## 0.10.1 (December 31st, 2019) ### Fixed - Fix issue with concurrent connection acquiry. (Pull #700) - Fix write error on closing HTTP/2 connections. (Pull #699) ## 0.10.0 (December 29th, 2019) The 0.10.0 release makes some changes that will allow us to support both sync and async interfaces. In particular with streaming responses the `response.read()` method becomes `response.aread()`, and the `response.close()` method becomes `response.aclose()`. If following redirects explicitly the `response.next()` method becomes `response.anext()`. ### Fixed - End HTTP/2 streams immediately on no-body requests, rather than sending an empty body message. (Pull #682) - Improve typing for `Response.request`: switch from `Optional[Request]` to `Request`. (Pull #666) - `Response.elapsed` now reflects the entire download time. (Pull #687, #692) ### Changed - Added `AsyncClient` as a synonym for `Client`. (Pull #680) - Switch to `response.aread()` for conditionally reading streaming responses. (Pull #674) - Switch to `response.aclose()` and `client.aclose()` for explicit closing. (Pull #674, #675) - Switch to `response.anext()` for resolving the next redirect response. (Pull #676) ### Removed - When using a client instance, the per-request usage of `verify`, `cert`, and `trust_env` have now escalated from raising a warning to raising an error. You should set these arguments on the client instead. (Pull #617) - Removed the undocumented `request.read()`, since end users should not require it. --- ## 0.9.5 (December 20th, 2019) ### Fixed - Fix Host header and HSTS rewrites when an explicit `:80` port is included in URL. (Pull #649) - Query Params on the URL string are merged with any `params=...` argument. (Pull #653) - More robust behavior when closing connections. (Pull #640) - More robust behavior when handling HTTP/2 headers with trailing whitespace. (Pull #637) - Allow any explicit `Content-Type` header to take precedence over the encoding default. (Pull #633) ## 0.9.4 (December 12th, 2019) ### Fixed - Added expiry to Keep-Alive connections, resolving issues with acquiring connections. (Pull #627) - Increased flow control windows on HTTP/2, resolving download speed issues. (Pull #629) ## 0.9.3 (December 7th, 2019) ### Fixed - Fixed HTTP/2 with autodetection backend. (Pull #614) ## 0.9.2 (December 7th, 2019) * Released due to packaging build artifact. ## 0.9.1 (December 6th, 2019) * Released due to packaging build artifact. ## 0.9.0 (December 6th, 2019) The 0.9 releases brings some major new features, including: * A new streaming API. * Autodetection of either asyncio or trio. * Nicer timeout configuration. * HTTP/2 support off by default, but can be enabled. We've also removed all private types from the top-level package export. In order to ensure you are only ever working with public API you should make sure to only import the top-level package eg. `import httpx`, rather than importing modules within the package. ### Added - Added concurrency backend autodetection. (Pull #585) - Added `Client(backend='trio')` and `Client(backend='asyncio')` API. (Pull #585) - Added `response.stream_lines()` API. (Pull #575) - Added `response.is_error` API. (Pull #574) - Added support for `timeout=Timeout(5.0, connect_timeout=60.0)` styles. (Pull #593) ### Fixed - Requests or Clients with `timeout=None` now correctly always disable timeouts. (Pull #592) - Request 'Authorization' headers now have priority over `.netrc` authentication info. (Commit 095b691) - Files without a filename no longer set a Content-Type in multipart data. (Commit ed94950) ### Changed - Added `httpx.stream()` API. Using `stream=True` now results in a warning. (Pull #600, #610) - HTTP/2 support is switched to "off by default", but can be enabled explicitly. (Pull #584) - Switched to `Client(http2=True)` API from `Client(http_versions=["HTTP/1.1", "HTTP/2"])`. (Pull #586) - Removed all private types from the top-level package export. (Pull #608) - The SSL configuration settings of `verify`, `cert`, and `trust_env` now raise warnings if used per-request when using a Client instance. They should always be set on the Client instance itself. (Pull #597) - Use plain strings "TUNNEL_ONLY" or "FORWARD_ONLY" on the HTTPProxy `proxy_mode` argument. The `HTTPProxyMode` enum still exists, but its usage will raise warnings. (#610) - Pool timeouts are now on the timeout configuration, not the pool limits configuration. (Pull #563) - The timeout configuration is now named `httpx.Timeout(...)`, not `httpx.TimeoutConfig(...)`. The old version currently remains as a synonym for backwards compatibility. (Pull #591) --- ## 0.8.0 (November 27, 2019) ### Removed - The synchronous API has been removed, in order to allow us to fundamentally change how we approach supporting both sync and async variants. (See #588 for more details.) --- ## 0.7.8 (November 17, 2019) ### Added - Add support for proxy tunnels for Python 3.6 + asyncio. (Pull #521) ## 0.7.7 (November 15, 2019) ### Fixed - Resolve an issue with cookies behavior on redirect requests. (Pull #529) ### Added - Add request/response DEBUG logs. (Pull #502) - Use TRACE log level for low level info. (Pull #500) ## 0.7.6 (November 2, 2019) ### Removed - Drop `proxies` parameter from the high-level API. (Pull #485) ### Fixed - Tweak multipart files: omit null filenames, add support for `str` file contents. (Pull #482) - Cache NETRC authentication per-client. (Pull #400) - Rely on `getproxies` for all proxy environment variables. (Pull #470) - Wait for the `asyncio` stream to close when closing a connection. (Pull #494) ## 0.7.5 (October 10, 2019) ### Added - Allow lists of values to be passed to `params`. (Pull #386) - `ASGIDispatch`, `WSGIDispatch` are now available in the `httpx.dispatch` namespace. (Pull #407) - `HTTPError` is now available in the `httpx` namespace. (Pull #421) - Add support for `start_tls()` to the Trio concurrency backend. (Pull #467) ### Fixed - Username and password are no longer included in the `Host` header when basic authentication credentials are supplied via the URL. (Pull #417) ### Removed - The `.delete()` function no longer has `json`, `data`, or `files` parameters to match the expected semantics of the `DELETE` method. (Pull #408) - Removed the `trio` extra. Trio support is detected automatically. (Pull #390) ## 0.7.4 (September 25, 2019) ### Added - Add Trio concurrency backend. (Pull #276) - Add `params` parameter to `Client` for setting default query parameters. (Pull #372) - Add support for `SSL_CERT_FILE` and `SSL_CERT_DIR` environment variables. (Pull #307) - Add debug logging to calls into ASGI apps. (Pull #371) - Add debug logging to SSL configuration. (Pull #378) ### Fixed - Fix a bug when using `Client` without timeouts in Python 3.6. (Pull #383) - Propagate `Client` configuration to HTTP proxies. (Pull #377) ## 0.7.3 (September 20, 2019) ### Added - HTTP Proxy support. (Pulls #259, #353) - Add Digest authentication. (Pull #332) - Add `.build_request()` method to `Client` and `AsyncClient`. (Pull #319) - Add `.elapsed` property on responses. (Pull #351) - Add support for `SSLKEYLOGFILE` in Python 3.8b4+. (Pull #301) ### Removed - Drop NPN support for HTTP version negotiation. (Pull #314) ### Fixed - Fix distribution of type annotations for mypy (Pull #361). - Set `Host` header when redirecting cross-origin. (Pull #321) - Drop `Content-Length` headers on `GET` redirects. (Pull #310) - Raise `KeyError` if header isn't found in `Headers`. (Pull #324) - Raise `NotRedirectResponse` in `response.next()` if there is no redirection to perform. (Pull #297) - Fix bug in calculating the HTTP/2 maximum frame size. (Pull #153) ## 0.7.2 (August 28, 2019) - Enforce using `httpx.AsyncioBackend` for the synchronous client. (Pull #232) - `httpx.ConnectionPool` will properly release a dropped connection. (Pull #230) - Remove the `raise_app_exceptions` argument from `Client`. (Pull #238) - `DecodeError` will no longer be raised for an empty body encoded with Brotli. (Pull #237) - Added `http_versions` parameter to `Client`. (Pull #250) - Only use HTTP/1.1 on short-lived connections like `httpx.get()`. (Pull #284) - Convert `Client.cookies` and `Client.headers` when set as a property. (Pull #274) - Setting `HTTPX_DEBUG=1` enables debug logging on all requests. (Pull #277) ## 0.7.1 (August 18, 2019) - Include files with source distribution to be installable. (Pull #233) ## 0.7.0 (August 17, 2019) - Add the `trust_env` property to `BaseClient`. (Pull #187) - Add the `links` property to `BaseResponse`. (Pull #211) - Accept `ssl.SSLContext` instances into `SSLConfig(verify=...)`. (Pull #215) - Add `Response.stream_text()` with incremental encoding detection. (Pull #183) - Properly updated the `Host` header when a redirect changes the origin. (Pull #199) - Ignore invalid `Content-Encoding` headers. (Pull #196) - Use `~/.netrc` and `~/_netrc` files by default when `trust_env=True`. (Pull #189) - Create exception base class `HTTPError` with `request` and `response` properties. (Pull #162) - Add HSTS preload list checking within `BaseClient` to upgrade HTTP URLs to HTTPS. (Pull #184) - Switch IDNA encoding from IDNA 2003 to IDNA 2008. (Pull #161) - Expose base classes for alternate concurrency backends. (Pull #178) - Improve Multipart parameter encoding. (Pull #167) - Add the `headers` property to `BaseClient`. (Pull #159) - Add support for Google's `brotli` library. (Pull #156) - Remove deprecated TLS versions (TLSv1 and TLSv1.1) from default `SSLConfig`. (Pull #155) - Fix `URL.join(...)` to work similarly to RFC 3986 URL joining. (Pull #144) --- ## 0.6.8 (July 25, 2019) - Check for disconnections when searching for an available connection in `ConnectionPool.keepalive_connections` (Pull #145) - Allow string comparison for `URL` objects (Pull #139) - Add HTTP status codes 418 and 451 (Pull #135) - Add support for client certificate passwords (Pull #118) - Enable post-handshake client cert authentication for TLSv1.3 (Pull #118) - Disable using `commonName` for hostname checking for OpenSSL 1.1.0+ (Pull #118) - Detect encoding for `Response.json()` (Pull #116) ## 0.6.7 (July 8, 2019) - Check for connection aliveness on re-acquiry (Pull #111) ## 0.6.6 (July 3, 2019) - Improve `USER_AGENT` (Pull #110) - Add `Connection: keep-alive` by default to HTTP/1.1 connections. (Pull #110) ## 0.6.5 (June 27, 2019) - Include `Host` header by default. (Pull #109) - Improve HTTP protocol detection. (Pull #107) ## 0.6.4 (June 25, 2019) - Implement read and write timeouts (Pull #104) ## 0.6.3 (June 24, 2019) - Handle early connection closes (Pull #103) ## 0.6.2 (June 23, 2019) - Use urllib3's `DEFAULT_CIPHERS` for the `SSLConfig` object. (Pull #100) ## 0.6.1 (June 21, 2019) - Add support for setting a `base_url` on the `Client`. ## 0.6.0 (June 21, 2019) - Honor `local_flow_control_window` for HTTP/2 connections (Pull #98) httpx-0.26.0/LICENSE.md000066400000000000000000000027441454054354600143730ustar00rootroot00000000000000Copyright © 2019, [Encode OSS Ltd](https://www.encode.io/). All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. httpx-0.26.0/README.md000066400000000000000000000113701454054354600142410ustar00rootroot00000000000000

HTTPX

HTTPX - A next-generation HTTP client for Python.

Test Suite Package version

HTTPX is a fully featured HTTP client library for Python 3. It includes **an integrated command line client**, has support for both **HTTP/1.1 and HTTP/2**, and provides both **sync and async APIs**. --- Install HTTPX using pip: ```shell $ pip install httpx ``` Now, let's get started: ```pycon >>> import httpx >>> r = httpx.get('https://www.example.org/') >>> r >>> r.status_code 200 >>> r.headers['content-type'] 'text/html; charset=UTF-8' >>> r.text '\n\n\nExample Domain...' ``` Or, using the command-line client. ```shell $ pip install 'httpx[cli]' # The command line client is an optional dependency. ``` Which now allows us to use HTTPX directly from the command-line...

httpx --help

Sending a request...

httpx http://httpbin.org/json

## Features HTTPX builds on the well-established usability of `requests`, and gives you: * A broadly [requests-compatible API](https://www.python-httpx.org/compatibility/). * An integrated command-line client. * HTTP/1.1 [and HTTP/2 support](https://www.python-httpx.org/http2/). * Standard synchronous interface, but with [async support if you need it](https://www.python-httpx.org/async/). * Ability to make requests directly to [WSGI applications](https://www.python-httpx.org/advanced/#calling-into-python-web-apps) or [ASGI applications](https://www.python-httpx.org/async/#calling-into-python-web-apps). * Strict timeouts everywhere. * Fully type annotated. * 100% test coverage. Plus all the standard features of `requests`... * International Domains and URLs * Keep-Alive & Connection Pooling * Sessions with Cookie Persistence * Browser-style SSL Verification * Basic/Digest Authentication * Elegant Key/Value Cookies * Automatic Decompression * Automatic Content Decoding * Unicode Response Bodies * Multipart File Uploads * HTTP(S) Proxy Support * Connection Timeouts * Streaming Downloads * .netrc Support * Chunked Requests ## Installation Install with pip: ```shell $ pip install httpx ``` Or, to include the optional HTTP/2 support, use: ```shell $ pip install httpx[http2] ``` HTTPX requires Python 3.8+. ## Documentation Project documentation is available at [https://www.python-httpx.org/](https://www.python-httpx.org/). For a run-through of all the basics, head over to the [QuickStart](https://www.python-httpx.org/quickstart/). For more advanced topics, see the [Advanced Usage](https://www.python-httpx.org/advanced/) section, the [async support](https://www.python-httpx.org/async/) section, or the [HTTP/2](https://www.python-httpx.org/http2/) section. The [Developer Interface](https://www.python-httpx.org/api/) provides a comprehensive API reference. To find out about tools that integrate with HTTPX, see [Third Party Packages](https://www.python-httpx.org/third_party_packages/). ## Contribute If you want to contribute with HTTPX check out the [Contributing Guide](https://www.python-httpx.org/contributing/) to learn how to start. ## Dependencies The HTTPX project relies on these excellent libraries: * `httpcore` - The underlying transport implementation for `httpx`. * `h11` - HTTP/1.1 support. * `certifi` - SSL certificates. * `idna` - Internationalized domain name support. * `sniffio` - Async library autodetection. As well as these optional installs: * `h2` - HTTP/2 support. *(Optional, with `httpx[http2]`)* * `socksio` - SOCKS proxy support. *(Optional, with `httpx[socks]`)* * `rich` - Rich terminal support. *(Optional, with `httpx[cli]`)* * `click` - Command line client support. *(Optional, with `httpx[cli]`)* * `brotli` or `brotlicffi` - Decoding for "brotli" compressed responses. *(Optional, with `httpx[brotli]`)* A huge amount of credit is due to `requests` for the API layout that much of this work follows, as well as to `urllib3` for plenty of design inspiration around the lower-level networking details. ---

HTTPX is BSD licensed code.
Designed & crafted with care.

— 🦋 —

httpx-0.26.0/README_chinese.md000066400000000000000000000107501454054354600157400ustar00rootroot00000000000000

HTTPX

HTTPX - 适用于 Python 的下一代 HTTP 客户端

Test Suite Package version

HTTPX 是适用于 Python3 的功能齐全的 HTTP 客户端。 它集成了 **一个命令行客户端**,同时支持 **HTTP/1.1 和 HTTP/2**,并提供了 **同步和异步 API**。 --- 通过 pip 安装 HTTPX: ```shell $ pip install httpx ``` 使用 httpx: ```pycon >>> import httpx >>> r = httpx.get('https://www.example.org/') >>> r >>> r.status_code 200 >>> r.headers['content-type'] 'text/html; charset=UTF-8' >>> r.text '\n\n\nExample Domain...' ``` 或者使用命令行客户端。 ```shell $ pip install 'httpx[cli]' # 命令行功能是可选的。 ``` 它允许我们直接通过命令行来使用 HTTPX...

httpx --help

发送一个请求...

httpx http://httpbin.org/json

## 特性 HTTPX 建立在成熟的 requests 可用性基础上,为您提供以下功能: * 广泛的 [requests 兼容 API](https://www.python-httpx.org/compatibility/)。 * 内置的命令行客户端功能。 * HTTP/1.1 [和 HTTP/2 支持](https://www.python-httpx.org/http2/)。 * 标准同步接口,也支持 [异步](https://www.python-httpx.org/async/)。 * 能够直接向 [WSGI 应用发送请求](https://www.python-httpx.org/advanced/#calling-into-python-web-apps) 或向 [ASGI 应用发送请求](https://www.python-httpx.org/async/#calling-into-python-web-apps)。 * 每一处严格的超时控制。 * 完整的类型注解。 * 100% 测试。 加上这些应该具备的标准功能... * 国际化域名与 URL * Keep-Alive & 连接池 * Cookie 持久性会话 * 浏览器风格的 SSL 验证 * 基础或摘要身份验证 * 优雅的键值 Cookies * 自动解压缩 * 内容自动解码 * Unicode 响应正文 * 分段文件上传 * HTTP(S)代理支持 * 可配置的连接超时 * 流式下载 * .netrc 支持 * 分块请求 ## 安装 使用 pip 安装: ```shell $ pip install httpx ``` 或者,安装可选的 HTTP/2 支持: ```shell $ pip install httpx[http2] ``` HTTPX 要求 Python 3.8+ 版本。 ## 文档 项目文档现已就绪,请访问 [https://www.python-httpx.org/](https://www.python-httpx.org/) 来阅读。 要浏览所有基础知识,请访问 [快速开始](https://www.python-httpx.org/quickstart/)。 更高级的主题,可参阅 [高级用法](https://www.python-httpx.org/advanced/) 章节, [异步支持](https://www.python-httpx.org/async/) 或者 [HTTP/2](https://www.python-httpx.org/http2/) 章节。 [Developer Interface](https://www.python-httpx.org/api/) 提供了全面的 API 参考。 要了解与 HTTPX 集成的工具, 请访问 [第三方包](https://www.python-httpx.org/third_party_packages/)。 ## 贡献 如果您想对本项目做出贡献,请访问 [贡献者指南](https://www.python-httpx.org/contributing/) 来了解如何开始。 ## 依赖 HTTPX 项目依赖于这些优秀的库: * `httpcore` - `httpx` 基础传输接口实现。 * `h11` - HTTP/1.1 支持。 * `certifi` - SSL 证书。 * `idna` - 国际化域名支持。 * `sniffio` - 异步库自动检测。 以及这些可选的安装: * `h2` - HTTP/2 支持。 *(可选的,通过 `httpx[http2]`)* * `socksio` - SOCKS 代理支持。 *(可选的, 通过 `httpx[socks]`)* * `rich` - 丰富的终端支持。 *(可选的,通过 `httpx[cli]`)* * `click` - 命令行客户端支持。 *(可选的,通过 `httpx[cli]`)* * `brotli` 或者 `brotlicffi` - 对 “brotli” 压缩响应的解码。*(可选的,通过 `httpx[brotli]`)* 这项工作的大量功劳都归功于参考了 `requests` 所遵循的 API 结构,以及 `urllib3` 中众多围绕底层网络细节的设计灵感。 ---

HTTPX 使用 BSD 开源协议 code。
精心设计和制作。

— 🦋 —

httpx-0.26.0/docs/000077500000000000000000000000001454054354600137105ustar00rootroot00000000000000httpx-0.26.0/docs/CNAME000066400000000000000000000000251454054354600144530ustar00rootroot00000000000000www.python-httpx.org httpx-0.26.0/docs/advanced.md000066400000000000000000001321371454054354600160060ustar00rootroot00000000000000# Advanced Usage ## Client Instances !!! hint If you are coming from Requests, `httpx.Client()` is what you can use instead of `requests.Session()`. ### Why use a Client? !!! note "TL;DR" If you do anything more than experimentation, one-off scripts, or prototypes, then you should use a `Client` instance. #### More efficient usage of network resources When you make requests using the top-level API as documented in the [Quickstart](quickstart.md) guide, HTTPX has to establish a new connection _for every single request_ (connections are not reused). As the number of requests to a host increases, this quickly becomes inefficient. On the other hand, a `Client` instance uses [HTTP connection pooling](https://en.wikipedia.org/wiki/HTTP_persistent_connection). This means that when you make several requests to the same host, the `Client` will reuse the underlying TCP connection, instead of recreating one for every single request. This can bring **significant performance improvements** compared to using the top-level API, including: - Reduced latency across requests (no handshaking). - Reduced CPU usage and round-trips. - Reduced network congestion. #### Extra features `Client` instances also support features that aren't available at the top-level API, such as: - Cookie persistence across requests. - Applying configuration across all outgoing requests. - Sending requests through HTTP proxies. - Using [HTTP/2](http2.md). The other sections on this page go into further detail about what you can do with a `Client` instance. ### Usage The recommended way to use a `Client` is as a context manager. This will ensure that connections are properly cleaned up when leaving the `with` block: ```python with httpx.Client() as client: ... ``` Alternatively, you can explicitly close the connection pool without block-usage using `.close()`: ```python client = httpx.Client() try: ... finally: client.close() ``` ### Making requests Once you have a `Client`, you can send requests using `.get()`, `.post()`, etc. For example: ```pycon >>> with httpx.Client() as client: ... r = client.get('https://example.com') ... >>> r ``` These methods accept the same arguments as `httpx.get()`, `httpx.post()`, etc. This means that all features documented in the [Quickstart](quickstart.md) guide are also available at the client level. For example, to send a request with custom headers: ```pycon >>> with httpx.Client() as client: ... headers = {'X-Custom': 'value'} ... r = client.get('https://example.com', headers=headers) ... >>> r.request.headers['X-Custom'] 'value' ``` ### Sharing configuration across requests Clients allow you to apply configuration to all outgoing requests by passing parameters to the `Client` constructor. For example, to apply a set of custom headers _on every request_: ```pycon >>> url = 'http://httpbin.org/headers' >>> headers = {'user-agent': 'my-app/0.0.1'} >>> with httpx.Client(headers=headers) as client: ... r = client.get(url) ... >>> r.json()['headers']['User-Agent'] 'my-app/0.0.1' ``` ### Merging of configuration When a configuration option is provided at both the client-level and request-level, one of two things can happen: - For headers, query parameters and cookies, the values are combined together. For example: ```pycon >>> headers = {'X-Auth': 'from-client'} >>> params = {'client_id': 'client1'} >>> with httpx.Client(headers=headers, params=params) as client: ... headers = {'X-Custom': 'from-request'} ... params = {'request_id': 'request1'} ... r = client.get('https://example.com', headers=headers, params=params) ... >>> r.request.url URL('https://example.com?client_id=client1&request_id=request1') >>> r.request.headers['X-Auth'] 'from-client' >>> r.request.headers['X-Custom'] 'from-request' ``` - For all other parameters, the request-level value takes priority. For example: ```pycon >>> with httpx.Client(auth=('tom', 'mot123')) as client: ... r = client.get('https://example.com', auth=('alice', 'ecila123')) ... >>> _, _, auth = r.request.headers['Authorization'].partition(' ') >>> import base64 >>> base64.b64decode(auth) b'alice:ecila123' ``` If you need finer-grained control on the merging of client-level and request-level parameters, see [Request instances](#request-instances). ### Other Client-only configuration options Additionally, `Client` accepts some configuration options that aren't available at the request level. For example, `base_url` allows you to prepend an URL to all outgoing requests: ```pycon >>> with httpx.Client(base_url='http://httpbin.org') as client: ... r = client.get('/headers') ... >>> r.request.url URL('http://httpbin.org/headers') ``` For a list of all available client parameters, see the [`Client`](api.md#client) API reference. --- ## Character set encodings and auto-detection When accessing `response.text`, we need to decode the response bytes into a unicode text representation. By default `httpx` will use `"charset"` information included in the response `Content-Type` header to determine how the response bytes should be decoded into text. In cases where no charset information is included on the response, the default behaviour is to assume "utf-8" encoding, which is by far the most widely used text encoding on the internet. ### Using the default encoding To understand this better let's start by looking at the default behaviour for text decoding... ```python import httpx # Instantiate a client with the default configuration. client = httpx.Client() # Using the client... response = client.get(...) print(response.encoding) # This will either print the charset given in # the Content-Type charset, or else "utf-8". print(response.text) # The text will either be decoded with the Content-Type # charset, or using "utf-8". ``` This is normally absolutely fine. Most servers will respond with a properly formatted Content-Type header, including a charset encoding. And in most cases where no charset encoding is included, UTF-8 is very likely to be used, since it is so widely adopted. ### Using an explicit encoding In some cases we might be making requests to a site where no character set information is being set explicitly by the server, but we know what the encoding is. In this case it's best to set the default encoding explicitly on the client. ```python import httpx # Instantiate a client with a Japanese character set as the default encoding. client = httpx.Client(default_encoding="shift-jis") # Using the client... response = client.get(...) print(response.encoding) # This will either print the charset given in # the Content-Type charset, or else "shift-jis". print(response.text) # The text will either be decoded with the Content-Type # charset, or using "shift-jis". ``` ### Using character set auto-detection In cases where the server is not reliably including character set information, and where we don't know what encoding is being used, we can enable auto-detection to make a best-guess attempt when decoding from bytes to text. To use auto-detection you need to set the `default_encoding` argument to a callable instead of a string. This callable should be a function which takes the input bytes as an argument and returns the character set to use for decoding those bytes to text. There are two widely used Python packages which both handle this functionality: * [`chardet`](https://chardet.readthedocs.io/) - This is a well established package, and is a port of [the auto-detection code in Mozilla](https://www-archive.mozilla.org/projects/intl/chardet.html). * [`charset-normalizer`](https://charset-normalizer.readthedocs.io/) - A newer package, motivated by `chardet`, with a different approach. Let's take a look at installing autodetection using one of these packages... ```shell $ pip install httpx $ pip install chardet ``` Once `chardet` is installed, we can configure a client to use character-set autodetection. ```python import httpx import chardet def autodetect(content): return chardet.detect(content).get("encoding") # Using a client with character-set autodetection enabled. client = httpx.Client(default_encoding=autodetect) response = client.get(...) print(response.encoding) # This will either print the charset given in # the Content-Type charset, or else the auto-detected # character set. print(response.text) ``` --- ## Calling into Python Web Apps You can configure an `httpx` client to call directly into a Python web application using the WSGI protocol. This is particularly useful for two main use-cases: * Using `httpx` as a client inside test cases. * Mocking out external services during tests or in dev/staging environments. Here's an example of integrating against a Flask application: ```python from flask import Flask import httpx app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" with httpx.Client(app=app, base_url="http://testserver") as client: r = client.get("/") assert r.status_code == 200 assert r.text == "Hello World!" ``` For some more complex cases you might need to customize the WSGI transport. This allows you to: * Inspect 500 error responses rather than raise exceptions by setting `raise_app_exceptions=False`. * Mount the WSGI application at a subpath by setting `script_name` (WSGI). * Use a given client address for requests by setting `remote_addr` (WSGI). For example: ```python # Instantiate a client that makes WSGI requests with a client IP of "1.2.3.4". transport = httpx.WSGITransport(app=app, remote_addr="1.2.3.4") with httpx.Client(transport=transport, base_url="http://testserver") as client: ... ``` ## Request instances For maximum control on what gets sent over the wire, HTTPX supports building explicit [`Request`](api.md#request) instances: ```python request = httpx.Request("GET", "https://example.com") ``` To dispatch a `Request` instance across to the network, create a [`Client` instance](#client-instances) and use `.send()`: ```python with httpx.Client() as client: response = client.send(request) ... ``` If you need to mix client-level and request-level options in a way that is not supported by the default [Merging of parameters](#merging-of-parameters), you can use `.build_request()` and then make arbitrary modifications to the `Request` instance. For example: ```python headers = {"X-Api-Key": "...", "X-Client-ID": "ABC123"} with httpx.Client(headers=headers) as client: request = client.build_request("GET", "https://api.example.com") print(request.headers["X-Client-ID"]) # "ABC123" # Don't send the API key for this particular request. del request.headers["X-Api-Key"] response = client.send(request) ... ``` ## Event Hooks HTTPX allows you to register "event hooks" with the client, that are called every time a particular type of event takes place. There are currently two event hooks: * `request` - Called after a request is fully prepared, but before it is sent to the network. Passed the `request` instance. * `response` - Called after the response has been fetched from the network, but before it is returned to the caller. Passed the `response` instance. These allow you to install client-wide functionality such as logging, monitoring or tracing. ```python def log_request(request): print(f"Request event hook: {request.method} {request.url} - Waiting for response") def log_response(response): request = response.request print(f"Response event hook: {request.method} {request.url} - Status {response.status_code}") client = httpx.Client(event_hooks={'request': [log_request], 'response': [log_response]}) ``` You can also use these hooks to install response processing code, such as this example, which creates a client instance that always raises `httpx.HTTPStatusError` on 4xx and 5xx responses. ```python def raise_on_4xx_5xx(response): response.raise_for_status() client = httpx.Client(event_hooks={'response': [raise_on_4xx_5xx]}) ``` !!! note Response event hooks are called before determining if the response body should be read or not. If you need access to the response body inside an event hook, you'll need to call `response.read()`, or for AsyncClients, `response.aread()`. The hooks are also allowed to modify `request` and `response` objects. ```python def add_timestamp(request): request.headers['x-request-timestamp'] = datetime.now(tz=datetime.utc).isoformat() client = httpx.Client(event_hooks={'request': [add_timestamp]}) ``` Event hooks must always be set as a **list of callables**, and you may register multiple event hooks for each type of event. As well as being able to set event hooks on instantiating the client, there is also an `.event_hooks` property, that allows you to inspect and modify the installed hooks. ```python client = httpx.Client() client.event_hooks['request'] = [log_request] client.event_hooks['response'] = [log_response, raise_on_4xx_5xx] ``` !!! note If you are using HTTPX's async support, then you need to be aware that hooks registered with `httpx.AsyncClient` MUST be async functions, rather than plain functions. ## Monitoring download progress If you need to monitor download progress of large responses, you can use response streaming and inspect the `response.num_bytes_downloaded` property. This interface is required for properly determining download progress, because the total number of bytes returned by `response.content` or `response.iter_content()` will not always correspond with the raw content length of the response if HTTP response compression is being used. For example, showing a progress bar using the [`tqdm`](https://github.com/tqdm/tqdm) library while a response is being downloaded could be done like this… ```python import tempfile import httpx from tqdm import tqdm with tempfile.NamedTemporaryFile() as download_file: url = "https://speed.hetzner.de/100MB.bin" with httpx.stream("GET", url) as response: total = int(response.headers["Content-Length"]) with tqdm(total=total, unit_scale=True, unit_divisor=1024, unit="B") as progress: num_bytes_downloaded = response.num_bytes_downloaded for chunk in response.iter_bytes(): download_file.write(chunk) progress.update(response.num_bytes_downloaded - num_bytes_downloaded) num_bytes_downloaded = response.num_bytes_downloaded ``` ![tqdm progress bar](img/tqdm-progress.gif) Or an alternate example, this time using the [`rich`](https://github.com/willmcgugan/rich) library… ```python import tempfile import httpx import rich.progress with tempfile.NamedTemporaryFile() as download_file: url = "https://speed.hetzner.de/100MB.bin" with httpx.stream("GET", url) as response: total = int(response.headers["Content-Length"]) with rich.progress.Progress( "[progress.percentage]{task.percentage:>3.0f}%", rich.progress.BarColumn(bar_width=None), rich.progress.DownloadColumn(), rich.progress.TransferSpeedColumn(), ) as progress: download_task = progress.add_task("Download", total=total) for chunk in response.iter_bytes(): download_file.write(chunk) progress.update(download_task, completed=response.num_bytes_downloaded) ``` ![rich progress bar](img/rich-progress.gif) ## Monitoring upload progress If you need to monitor upload progress of large responses, you can use request content generator streaming. For example, showing a progress bar using the [`tqdm`](https://github.com/tqdm/tqdm) library. ```python import io import random import httpx from tqdm import tqdm def gen(): """ this is a complete example with generated random bytes. you can replace `io.BytesIO` with real file object. """ total = 32 * 1024 * 1024 # 32m with tqdm(ascii=True, unit_scale=True, unit='B', unit_divisor=1024, total=total) as bar: with io.BytesIO(random.randbytes(total)) as f: while data := f.read(1024): yield data bar.update(len(data)) httpx.post("https://httpbin.org/post", content=gen()) ``` ![tqdm progress bar](img/tqdm-progress.gif) ## .netrc Support HTTPX can be configured to use [a `.netrc` config file](https://everything.curl.dev/usingcurl/netrc) for authentication. The `.netrc` config file allows authentication credentials to be associated with specified hosts. When a request is made to a host that is found in the netrc file, the username and password will be included using HTTP basic auth. Example `.netrc` file: ``` machine example.org login example-username password example-password machine python-httpx.org login other-username password other-password ``` Some examples of configuring `.netrc` authentication with `httpx`. Use the default `.netrc` file in the users home directory: ```pycon >>> auth = httpx.NetRCAuth() >>> client = httpx.Client(auth=auth) ``` Use an explicit path to a `.netrc` file: ```pycon >>> auth = httpx.NetRCAuth(file="/path/to/.netrc") >>> client = httpx.Client(auth=auth) ``` Use the `NETRC` environment variable to configure a path to the `.netrc` file, or fallback to the default. ```pycon >>> auth = httpx.NetRCAuth(file=os.environ.get("NETRC")) >>> client = httpx.Client(auth=auth) ``` The `NetRCAuth()` class uses [the `netrc.netrc()` function from the Python standard library](https://docs.python.org/3/library/netrc.html). See the documentation there for more details on exceptions that may be raised if the netrc file is not found, or cannot be parsed. ## HTTP Proxying HTTPX supports setting up [HTTP proxies](https://en.wikipedia.org/wiki/Proxy_server#Web_proxy_servers) via the `proxy` parameter to be passed on client initialization or top-level API functions like `httpx.get(..., proxy=...)`.
Diagram of how a proxy works (source: Wikipedia). The left hand side "Internet" blob may be your HTTPX client requesting example.com through a proxy.
### Example To route all traffic (HTTP and HTTPS) to a proxy located at `http://localhost:8030`, pass the proxy URL to the client... ```python with httpx.Client(proxy="http://localhost:8030") as client: ... ``` For more advanced use cases, pass a mounts `dict`. For example, to route HTTP and HTTPS requests to 2 different proxies, respectively located at `http://localhost:8030`, and `http://localhost:8031`, pass a `dict` of proxy URLs: ```python proxy_mounts = { "http://": httpx.HTTPTransport(proxy="http://localhost:8030"), "https://": httpx.HTTPTransport(proxy="http://localhost:8031"), } with httpx.Client(mounts=proxy_mounts) as client: ... ``` For detailed information about proxy routing, see the [Routing](#routing) section. !!! tip "Gotcha" In most cases, the proxy URL for the `https://` key _should_ use the `http://` scheme (that's not a typo!). This is because HTTP proxying requires initiating a connection with the proxy server. While it's possible that your proxy supports doing it via HTTPS, most proxies only support doing it via HTTP. For more information, see [FORWARD vs TUNNEL](#forward-vs-tunnel). ### Authentication Proxy credentials can be passed as the `userinfo` section of the proxy URL. For example: ```python with httpx.Client(proxy="http://username:password@localhost:8030") as client: ... ``` ### Proxy mechanisms !!! note This section describes **advanced** proxy concepts and functionality. #### FORWARD vs TUNNEL In general, the flow for making an HTTP request through a proxy is as follows: 1. The client connects to the proxy (initial connection request). 2. The proxy transfers data to the server on your behalf. How exactly step 2/ is performed depends on which of two proxying mechanisms is used: * **Forwarding**: the proxy makes the request for you, and sends back the response it obtained from the server. * **Tunnelling**: the proxy establishes a TCP connection to the server on your behalf, and the client reuses this connection to send the request and receive the response. This is known as an [HTTP Tunnel](https://en.wikipedia.org/wiki/HTTP_tunnel). This mechanism is how you can access websites that use HTTPS from an HTTP proxy (the client "upgrades" the connection to HTTPS by performing the TLS handshake with the server over the TCP connection provided by the proxy). ### Troubleshooting proxies If you encounter issues when setting up proxies, please refer to our [Troubleshooting guide](troubleshooting.md#proxies). ## SOCKS In addition to HTTP proxies, `httpcore` also supports proxies using the SOCKS protocol. This is an optional feature that requires an additional third-party library be installed before use. You can install SOCKS support using `pip`: ```shell $ pip install httpx[socks] ``` You can now configure a client to make requests via a proxy using the SOCKS protocol: ```python httpx.Client(proxy='socks5://user:pass@host:port') ``` ## Timeout Configuration HTTPX is careful to enforce timeouts everywhere by default. The default behavior is to raise a `TimeoutException` after 5 seconds of network inactivity. ### Setting and disabling timeouts You can set timeouts for an individual request: ```python # Using the top-level API: httpx.get('http://example.com/api/v1/example', timeout=10.0) # Using a client instance: with httpx.Client() as client: client.get("http://example.com/api/v1/example", timeout=10.0) ``` Or disable timeouts for an individual request: ```python # Using the top-level API: httpx.get('http://example.com/api/v1/example', timeout=None) # Using a client instance: with httpx.Client() as client: client.get("http://example.com/api/v1/example", timeout=None) ``` ### Setting a default timeout on a client You can set a timeout on a client instance, which results in the given `timeout` being used as the default for requests made with this client: ```python client = httpx.Client() # Use a default 5s timeout everywhere. client = httpx.Client(timeout=10.0) # Use a default 10s timeout everywhere. client = httpx.Client(timeout=None) # Disable all timeouts by default. ``` ### Fine tuning the configuration HTTPX also allows you to specify the timeout behavior in more fine grained detail. There are four different types of timeouts that may occur. These are **connect**, **read**, **write**, and **pool** timeouts. * The **connect** timeout specifies the maximum amount of time to wait until a socket connection to the requested host is established. If HTTPX is unable to connect within this time frame, a `ConnectTimeout` exception is raised. * The **read** timeout specifies the maximum duration to wait for a chunk of data to be received (for example, a chunk of the response body). If HTTPX is unable to receive data within this time frame, a `ReadTimeout` exception is raised. * The **write** timeout specifies the maximum duration to wait for a chunk of data to be sent (for example, a chunk of the request body). If HTTPX is unable to send data within this time frame, a `WriteTimeout` exception is raised. * The **pool** timeout specifies the maximum duration to wait for acquiring a connection from the connection pool. If HTTPX is unable to acquire a connection within this time frame, a `PoolTimeout` exception is raised. A related configuration here is the maximum number of allowable connections in the connection pool, which is configured by the `limits` argument. You can configure the timeout behavior for any of these values... ```python # A client with a 60s timeout for connecting, and a 10s timeout elsewhere. timeout = httpx.Timeout(10.0, connect=60.0) client = httpx.Client(timeout=timeout) response = client.get('http://example.com/') ``` ## Pool limit configuration You can control the connection pool size using the `limits` keyword argument on the client. It takes instances of `httpx.Limits` which define: - `max_keepalive_connections`, number of allowable keep-alive connections, or `None` to always allow. (Defaults 20) - `max_connections`, maximum number of allowable connections, or `None` for no limits. (Default 100) - `keepalive_expiry`, time limit on idle keep-alive connections in seconds, or `None` for no limits. (Default 5) ```python limits = httpx.Limits(max_keepalive_connections=5, max_connections=10) client = httpx.Client(limits=limits) ``` ## Multipart file encoding As mentioned in the [quickstart](quickstart.md#sending-multipart-file-uploads) multipart file encoding is available by passing a dictionary with the name of the payloads as keys and either tuple of elements or a file-like object or a string as values. ```pycon >>> files = {'upload-file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel')} >>> r = httpx.post("https://httpbin.org/post", files=files) >>> print(r.text) { ... "files": { "upload-file": "<... binary content ...>" }, ... } ``` More specifically, if a tuple is used as a value, it must have between 2 and 3 elements: - The first element is an optional file name which can be set to `None`. - The second element may be a file-like object or a string which will be automatically encoded in UTF-8. - An optional third element can be used to specify the [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_Types) of the file being uploaded. If not specified HTTPX will attempt to guess the MIME type based on the file name, with unknown file extensions defaulting to "application/octet-stream". If the file name is explicitly set to `None` then HTTPX will not include a content-type MIME header field. ```pycon >>> files = {'upload-file': (None, 'text content', 'text/plain')} >>> r = httpx.post("https://httpbin.org/post", files=files) >>> print(r.text) { ... "files": {}, "form": { "upload-file": "text-content" }, ... } ``` !!! tip It is safe to upload large files this way. File uploads are streaming by default, meaning that only one chunk will be loaded into memory at a time. Non-file data fields can be included in the multipart form using by passing them to `data=...`. You can also send multiple files in one go with a multiple file field form. To do that, pass a list of `(field, )` items instead of a dictionary, allowing you to pass multiple items with the same `field`. For instance this request sends 2 files, `foo.png` and `bar.png` in one request on the `images` form field: ```pycon >>> files = [('images', ('foo.png', open('foo.png', 'rb'), 'image/png')), ('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))] >>> r = httpx.post("https://httpbin.org/post", files=files) ``` ## Customizing authentication When issuing requests or instantiating a client, the `auth` argument can be used to pass an authentication scheme to use. The `auth` argument may be one of the following... * A two-tuple of `username`/`password`, to be used with basic authentication. * An instance of `httpx.BasicAuth()`, `httpx.DigestAuth()`, or `httpx.NetRCAuth()`. * A callable, accepting a request and returning an authenticated request instance. * An instance of subclasses of `httpx.Auth`. The most involved of these is the last, which allows you to create authentication flows involving one or more requests. A subclass of `httpx.Auth` should implement `def auth_flow(request)`, and yield any requests that need to be made... ```python class MyCustomAuth(httpx.Auth): def __init__(self, token): self.token = token def auth_flow(self, request): # Send the request, with a custom `X-Authentication` header. request.headers['X-Authentication'] = self.token yield request ``` If the auth flow requires more than one request, you can issue multiple yields, and obtain the response in each case... ```python class MyCustomAuth(httpx.Auth): def __init__(self, token): self.token = token def auth_flow(self, request): response = yield request if response.status_code == 401: # If the server issues a 401 response then resend the request, # with a custom `X-Authentication` header. request.headers['X-Authentication'] = self.token yield request ``` Custom authentication classes are designed to not perform any I/O, so that they may be used with both sync and async client instances. If you are implementing an authentication scheme that requires the request body, then you need to indicate this on the class using a `requires_request_body` property. You will then be able to access `request.content` inside the `.auth_flow()` method. ```python class MyCustomAuth(httpx.Auth): requires_request_body = True def __init__(self, token): self.token = token def auth_flow(self, request): response = yield request if response.status_code == 401: # If the server issues a 401 response then resend the request, # with a custom `X-Authentication` header. request.headers['X-Authentication'] = self.sign_request(...) yield request def sign_request(self, request): # Create a request signature, based on `request.method`, `request.url`, # `request.headers`, and `request.content`. ... ``` Similarly, if you are implementing a scheme that requires access to the response body, then use the `requires_response_body` property. You will then be able to access response body properties and methods such as `response.content`, `response.text`, `response.json()`, etc. ```python class MyCustomAuth(httpx.Auth): requires_response_body = True def __init__(self, access_token, refresh_token, refresh_url): self.access_token = access_token self.refresh_token = refresh_token self.refresh_url = refresh_url def auth_flow(self, request): request.headers["X-Authentication"] = self.access_token response = yield request if response.status_code == 401: # If the server issues a 401 response, then issue a request to # refresh tokens, and resend the request. refresh_response = yield self.build_refresh_request() self.update_tokens(refresh_response) request.headers["X-Authentication"] = self.access_token yield request def build_refresh_request(self): # Return an `httpx.Request` for refreshing tokens. ... def update_tokens(self, response): # Update the `.access_token` and `.refresh_token` tokens # based on a refresh response. data = response.json() ... ``` If you _do_ need to perform I/O other than HTTP requests, such as accessing a disk-based cache, or you need to use concurrency primitives, such as locks, then you should override `.sync_auth_flow()` and `.async_auth_flow()` (instead of `.auth_flow()`). The former will be used by `httpx.Client`, while the latter will be used by `httpx.AsyncClient`. ```python import asyncio import threading import httpx class MyCustomAuth(httpx.Auth): def __init__(self): self._sync_lock = threading.RLock() self._async_lock = asyncio.Lock() def sync_get_token(self): with self._sync_lock: ... def sync_auth_flow(self, request): token = self.sync_get_token() request.headers["Authorization"] = f"Token {token}" yield request async def async_get_token(self): async with self._async_lock: ... async def async_auth_flow(self, request): token = await self.async_get_token() request.headers["Authorization"] = f"Token {token}" yield request ``` If you only want to support one of the two methods, then you should still override it, but raise an explicit `RuntimeError`. ```python import httpx import sync_only_library class MyCustomAuth(httpx.Auth): def sync_auth_flow(self, request): token = sync_only_library.get_token(...) request.headers["Authorization"] = f"Token {token}" yield request async def async_auth_flow(self, request): raise RuntimeError("Cannot use a sync authentication class with httpx.AsyncClient") ``` ## SSL certificates When making a request over HTTPS, HTTPX needs to verify the identity of the requested host. To do this, it uses a bundle of SSL certificates (a.k.a. CA bundle) delivered by a trusted certificate authority (CA). ### Changing the verification defaults By default, HTTPX uses the CA bundle provided by [Certifi](https://pypi.org/project/certifi/). This is what you want in most cases, even though some advanced situations may require you to use a different set of certificates. If you'd like to use a custom CA bundle, you can use the `verify` parameter. ```python import httpx r = httpx.get("https://example.org", verify="path/to/client.pem") ``` Alternatively, you can pass a standard library `ssl.SSLContext`. ```pycon >>> import ssl >>> import httpx >>> context = ssl.create_default_context() >>> context.load_verify_locations(cafile="/tmp/client.pem") >>> httpx.get('https://example.org', verify=context) ``` We also include a helper function for creating properly configured `SSLContext` instances. ```pycon >>> context = httpx.create_ssl_context() ``` The `create_ssl_context` function accepts the same set of SSL configuration arguments (`trust_env`, `verify`, `cert` and `http2` arguments) as `httpx.Client` or `httpx.AsyncClient` ```pycon >>> import httpx >>> context = httpx.create_ssl_context(verify="/tmp/client.pem") >>> httpx.get('https://example.org', verify=context) ``` Or you can also disable the SSL verification entirely, which is _not_ recommended. ```python import httpx r = httpx.get("https://example.org", verify=False) ``` ### SSL configuration on client instances If you're using a `Client()` instance, then you should pass any SSL settings when instantiating the client. ```python client = httpx.Client(verify=False) ``` The `client.get(...)` method and other request methods *do not* support changing the SSL settings on a per-request basis. If you need different SSL settings in different cases you should use more that one client instance, with different settings on each. Each client will then be using an isolated connection pool with a specific fixed SSL configuration on all connections within that pool. ### Client Side Certificates You can also specify a local cert to use as a client-side certificate, either a path to an SSL certificate file, or two-tuple of (certificate file, key file), or a three-tuple of (certificate file, key file, password) ```python import httpx r = httpx.get("https://example.org", cert="path/to/client.pem") ``` Alternatively, ```pycon >>> cert = ("path/to/client.pem", "path/to/client.key") >>> httpx.get("https://example.org", cert=cert) ``` or ```pycon >>> cert = ("path/to/client.pem", "path/to/client.key", "password") >>> httpx.get("https://example.org", cert=cert) ``` ### Making HTTPS requests to a local server When making requests to local servers, such as a development server running on `localhost`, you will typically be using unencrypted HTTP connections. If you do need to make HTTPS connections to a local server, for example to test an HTTPS-only service, you will need to create and use your own certificates. Here's one way to do it: 1. Use [trustme](https://github.com/python-trio/trustme) to generate a pair of server key/cert files, and a client cert file. 1. Pass the server key/cert files when starting your local server. (This depends on the particular web server you're using. For example, [Uvicorn](https://www.uvicorn.org) provides the `--ssl-keyfile` and `--ssl-certfile` options.) 1. Tell HTTPX to use the certificates stored in `client.pem`: ```pycon >>> import httpx >>> r = httpx.get("https://localhost:8000", verify="/tmp/client.pem") >>> r Response <200 OK> ``` ## Custom Transports HTTPX's `Client` also accepts a `transport` argument. This argument allows you to provide a custom Transport object that will be used to perform the actual sending of the requests. ### Usage For some advanced configuration you might need to instantiate a transport class directly, and pass it to the client instance. One example is the `local_address` configuration which is only available via this low-level API. ```pycon >>> import httpx >>> transport = httpx.HTTPTransport(local_address="0.0.0.0") >>> client = httpx.Client(transport=transport) ``` Connection retries are also available via this interface. Requests will be retried the given number of times in case an `httpx.ConnectError` or an `httpx.ConnectTimeout` occurs, allowing smoother operation under flaky networks. If you need other forms of retry behaviors, such as handling read/write errors or reacting to `503 Service Unavailable`, consider general-purpose tools such as [tenacity](https://github.com/jd/tenacity). ```pycon >>> import httpx >>> transport = httpx.HTTPTransport(retries=1) >>> client = httpx.Client(transport=transport) ``` Similarly, instantiating a transport directly provides a `uds` option for connecting via a Unix Domain Socket that is only available via this low-level API: ```pycon >>> import httpx >>> # Connect to the Docker API via a Unix Socket. >>> transport = httpx.HTTPTransport(uds="/var/run/docker.sock") >>> client = httpx.Client(transport=transport) >>> response = client.get("http://docker/info") >>> response.json() {"ID": "...", "Containers": 4, "Images": 74, ...} ``` ### urllib3 transport This [public gist](https://gist.github.com/florimondmanca/d56764d78d748eb9f73165da388e546e) provides a transport that uses the excellent [`urllib3` library](https://urllib3.readthedocs.io/en/latest/), and can be used with the sync `Client`... ```pycon >>> import httpx >>> from urllib3_transport import URLLib3Transport >>> client = httpx.Client(transport=URLLib3Transport()) >>> client.get("https://example.org") ``` ### Writing custom transports A transport instance must implement the low-level Transport API, which deals with sending a single request, and returning a response. You should either subclass `httpx.BaseTransport` to implement a transport to use with `Client`, or subclass `httpx.AsyncBaseTransport` to implement a transport to use with `AsyncClient`. At the layer of the transport API we're using the familiar `Request` and `Response` models. See the `handle_request` and `handle_async_request` docstrings for more details on the specifics of the Transport API. A complete example of a custom transport implementation would be: ```python import json import httpx class HelloWorldTransport(httpx.BaseTransport): """ A mock transport that always returns a JSON "Hello, world!" response. """ def handle_request(self, request): message = {"text": "Hello, world!"} content = json.dumps(message).encode("utf-8") stream = httpx.ByteStream(content) headers = [(b"content-type", b"application/json")] return httpx.Response(200, headers=headers, stream=stream) ``` Which we can use in the same way: ```pycon >>> import httpx >>> client = httpx.Client(transport=HelloWorldTransport()) >>> response = client.get("https://example.org/") >>> response.json() {"text": "Hello, world!"} ``` ### Mock transports During testing it can often be useful to be able to mock out a transport, and return pre-determined responses, rather than making actual network requests. The `httpx.MockTransport` class accepts a handler function, which can be used to map requests onto pre-determined responses: ```python def handler(request): return httpx.Response(200, json={"text": "Hello, world!"}) # Switch to a mock transport, if the TESTING environment variable is set. if os.environ.get('TESTING', '').upper() == "TRUE": transport = httpx.MockTransport(handler) else: transport = httpx.HTTPTransport() client = httpx.Client(transport=transport) ``` For more advanced use-cases you might want to take a look at either [the third-party mocking library, RESPX](https://lundberg.github.io/respx/), or the [pytest-httpx library](https://github.com/Colin-b/pytest_httpx). ### Mounting transports You can also mount transports against given schemes or domains, to control which transport an outgoing request should be routed via, with [the same style used for specifying proxy routing](#routing). ```python import httpx class HTTPSRedirectTransport(httpx.BaseTransport): """ A transport that always redirects to HTTPS. """ def handle_request(self, method, url, headers, stream, extensions): scheme, host, port, path = url if port is None: location = b"https://%s%s" % (host, path) else: location = b"https://%s:%d%s" % (host, port, path) stream = httpx.ByteStream(b"") headers = [(b"location", location)] extensions = {} return 303, headers, stream, extensions # A client where any `http` requests are always redirected to `https` mounts = {'http://': HTTPSRedirectTransport()} client = httpx.Client(mounts=mounts) ``` A couple of other sketches of how you might take advantage of mounted transports... Disabling HTTP/2 on a single given domain... ```python mounts = { "all://": httpx.HTTPTransport(http2=True), "all://*example.org": httpx.HTTPTransport() } client = httpx.Client(mounts=mounts) ``` Mocking requests to a given domain: ```python # All requests to "example.org" should be mocked out. # Other requests occur as usual. def handler(request): return httpx.Response(200, json={"text": "Hello, World!"}) mounts = {"all://example.org": httpx.MockTransport(handler)} client = httpx.Client(mounts=mounts) ``` Adding support for custom schemes: ```python # Support URLs like "file:///Users/sylvia_green/websites/new_client/index.html" mounts = {"file://": FileSystemTransport()} client = httpx.Client(mounts=mounts) ``` ### Routing HTTPX provides a powerful mechanism for routing requests, allowing you to write complex rules that specify which transport should be used for each request. The `mounts` dictionary maps URL patterns to HTTP transports. HTTPX matches requested URLs against URL patterns to decide which transport should be used, if any. Matching is done from most specific URL patterns (e.g. `https://:`) to least specific ones (e.g. `https://`). HTTPX supports routing requests based on **scheme**, **domain**, **port**, or a combination of these. #### Wildcard routing Route everything through a transport... ```python mounts = { "all://": httpx.HTTPTransport(proxy="http://localhost:8030"), } ``` #### Scheme routing Route HTTP requests through one transport, and HTTPS requests through another... ```python mounts = { "http://": httpx.HTTPTransport(proxy="http://localhost:8030"), "https://": httpx.HTTPTransport(proxy="http://localhost:8031"), } ``` #### Domain routing Proxy all requests on domain "example.com", let other requests pass through... ```python mounts = { "all://example.com": httpx.HTTPTransport(proxy="http://localhost:8030"), } ``` Proxy HTTP requests on domain "example.com", let HTTPS and other requests pass through... ```python mounts = { "http://example.com": httpx.HTTPTransport(proxy="http://localhost:8030"), } ``` Proxy all requests to "example.com" and its subdomains, let other requests pass through... ```python mounts = { "all://*example.com": httpx.HTTPTransport(proxy="http://localhost:8030"), } ``` Proxy all requests to strict subdomains of "example.com", let "example.com" and other requests pass through... ```python mounts = { "all://*.example.com": httpx.HTTPTransport(proxy="http://localhost:8030"), } ``` #### Port routing Proxy HTTPS requests on port 1234 to "example.com"... ```python mounts = { "https://example.com:1234": httpx.HTTPTransport(proxy="http://localhost:8030"), } ``` Proxy all requests on port 1234... ```python mounts = { "all://*:1234": httpx.HTTPTransport(proxy="http://localhost:8030"), } ``` #### No-proxy support It is also possible to define requests that _shouldn't_ be routed through the transport. To do so, pass `None` as the proxy URL. For example... ```python mounts = { # Route requests through a proxy by default... "all://": httpx.HTTPTransport(proxy="http://localhost:8031"), # Except those for "example.com". "all://example.com": None, } ``` #### Complex configuration example You can combine the routing features outlined above to build complex proxy routing configurations. For example... ```python mounts = { # Route all traffic through a proxy by default... "all://": httpx.HTTPTransport(proxy="http://localhost:8030"), # But don't use proxies for HTTPS requests to "domain.io"... "https://domain.io": None, # And use another proxy for requests to "example.com" and its subdomains... "all://*example.com": httpx.HTTPTransport(proxy="http://localhost:8031"), # And yet another proxy if HTTP is used, # and the "internal" subdomain on port 5550 is requested... "http://internal.example.com:5550": httpx.HTTPTransport(proxy="http://localhost:8032"), } ``` #### Environment variables There are also environment variables that can be used to control the dictionary of the client mounts. They can be used to configure HTTP proxying for clients. See documentation on [`HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY`](environment_variables.md#http_proxy-https_proxy-all_proxy) for more information. httpx-0.26.0/docs/api.md000066400000000000000000000101361454054354600150040ustar00rootroot00000000000000# Developer Interface ## Helper Functions !!! note Only use these functions if you're testing HTTPX in a console or making a small number of requests. Using a `Client` will enable HTTP/2 and connection pooling for more efficient and long-lived connections. ::: httpx.request :docstring: ::: httpx.get :docstring: ::: httpx.options :docstring: ::: httpx.head :docstring: ::: httpx.post :docstring: ::: httpx.put :docstring: ::: httpx.patch :docstring: ::: httpx.delete :docstring: ::: httpx.stream :docstring: ## `Client` ::: httpx.Client :docstring: :members: headers cookies params auth request get head options post put patch delete stream build_request send close ## `AsyncClient` ::: httpx.AsyncClient :docstring: :members: headers cookies params auth request get head options post put patch delete stream build_request send aclose ## `Response` *An HTTP response.* * `def __init__(...)` * `.status_code` - **int** * `.reason_phrase` - **str** * `.http_version` - `"HTTP/2"` or `"HTTP/1.1"` * `.url` - **URL** * `.headers` - **Headers** * `.content` - **bytes** * `.text` - **str** * `.encoding` - **str** * `.is_redirect` - **bool** * `.request` - **Request** * `.next_request` - **Optional[Request]** * `.cookies` - **Cookies** * `.history` - **List[Response]** * `.elapsed` - **[timedelta](https://docs.python.org/3/library/datetime.html)** * The amount of time elapsed between sending the request and calling `close()` on the corresponding response received for that request. [total_seconds()](https://docs.python.org/3/library/datetime.html#datetime.timedelta.total_seconds) to correctly get the total elapsed seconds. * `def .raise_for_status()` - **Response** * `def .json()` - **Any** * `def .read()` - **bytes** * `def .iter_raw([chunk_size])` - **bytes iterator** * `def .iter_bytes([chunk_size])` - **bytes iterator** * `def .iter_text([chunk_size])` - **text iterator** * `def .iter_lines()` - **text iterator** * `def .close()` - **None** * `def .next()` - **Response** * `def .aread()` - **bytes** * `def .aiter_raw([chunk_size])` - **async bytes iterator** * `def .aiter_bytes([chunk_size])` - **async bytes iterator** * `def .aiter_text([chunk_size])` - **async text iterator** * `def .aiter_lines()` - **async text iterator** * `def .aclose()` - **None** * `def .anext()` - **Response** ## `Request` *An HTTP request. Can be constructed explicitly for more control over exactly what gets sent over the wire.* ```pycon >>> request = httpx.Request("GET", "https://example.org", headers={'host': 'example.org'}) >>> response = client.send(request) ``` * `def __init__(method, url, [params], [headers], [cookies], [content], [data], [files], [json], [stream])` * `.method` - **str** * `.url` - **URL** * `.content` - **byte**, **byte iterator**, or **byte async iterator** * `.headers` - **Headers** * `.cookies` - **Cookies** ## `URL` *A normalized, IDNA supporting URL.* ```pycon >>> url = URL("https://example.org/") >>> url.host 'example.org' ``` * `def __init__(url, allow_relative=False, params=None)` * `.scheme` - **str** * `.authority` - **str** * `.host` - **str** * `.port` - **int** * `.path` - **str** * `.query` - **str** * `.raw_path` - **str** * `.fragment` - **str** * `.is_ssl` - **bool** * `.is_absolute_url` - **bool** * `.is_relative_url` - **bool** * `def .copy_with([scheme], [authority], [path], [query], [fragment])` - **URL** ## `Headers` *A case-insensitive multi-dict.* ```pycon >>> headers = Headers({'Content-Type': 'application/json'}) >>> headers['content-type'] 'application/json' ``` * `def __init__(self, headers, encoding=None)` * `def copy()` - **Headers** ## `Cookies` *A dict-like cookie store.* ```pycon >>> cookies = Cookies() >>> cookies.set("name", "value", domain="example.org") ``` * `def __init__(cookies: [dict, Cookies, CookieJar])` * `.jar` - **CookieJar** * `def extract_cookies(response)` * `def set_cookie_header(request)` * `def set(name, value, [domain], [path])` * `def get(name, [domain], [path])` * `def delete(name, [domain], [path])` * `def clear([domain], [path])` * *Standard mutable mapping interface* httpx-0.26.0/docs/async.md000066400000000000000000000176141454054354600153600ustar00rootroot00000000000000# Async Support HTTPX offers a standard synchronous API by default, but also gives you the option of an async client if you need it. Async is a concurrency model that is far more efficient than multi-threading, and can provide significant performance benefits and enable the use of long-lived network connections such as WebSockets. If you're working with an async web framework then you'll also want to use an async client for sending outgoing HTTP requests. ## Making Async requests To make asynchronous requests, you'll need an `AsyncClient`. ```pycon >>> async with httpx.AsyncClient() as client: ... r = await client.get('https://www.example.com/') ... >>> r ``` !!! tip Use [IPython](https://ipython.readthedocs.io/en/stable/) or Python 3.8+ with `python -m asyncio` to try this code interactively, as they support executing `async`/`await` expressions in the console. ## API Differences If you're using an async client then there are a few bits of API that use async methods. ### Making requests The request methods are all async, so you should use `response = await client.get(...)` style for all of the following: * `AsyncClient.get(url, ...)` * `AsyncClient.options(url, ...)` * `AsyncClient.head(url, ...)` * `AsyncClient.post(url, ...)` * `AsyncClient.put(url, ...)` * `AsyncClient.patch(url, ...)` * `AsyncClient.delete(url, ...)` * `AsyncClient.request(method, url, ...)` * `AsyncClient.send(request, ...)` ### Opening and closing clients Use `async with httpx.AsyncClient()` if you want a context-managed client... ```python async with httpx.AsyncClient() as client: ... ``` !!! warning In order to get the most benefit from connection pooling, make sure you're not instantiating multiple client instances - for example by using `async with` inside a "hot loop". This can be achieved either by having a single scoped client that's passed throughout wherever it's needed, or by having a single global client instance. Alternatively, use `await client.aclose()` if you want to close a client explicitly: ```python client = httpx.AsyncClient() ... await client.aclose() ``` ### Streaming responses The `AsyncClient.stream(method, url, ...)` method is an async context block. ```pycon >>> client = httpx.AsyncClient() >>> async with client.stream('GET', 'https://www.example.com/') as response: ... async for chunk in response.aiter_bytes(): ... ... ``` The async response streaming methods are: * `Response.aread()` - For conditionally reading a response inside a stream block. * `Response.aiter_bytes()` - For streaming the response content as bytes. * `Response.aiter_text()` - For streaming the response content as text. * `Response.aiter_lines()` - For streaming the response content as lines of text. * `Response.aiter_raw()` - For streaming the raw response bytes, without applying content decoding. * `Response.aclose()` - For closing the response. You don't usually need this, since `.stream` block closes the response automatically on exit. For situations when context block usage is not practical, it is possible to enter "manual mode" by sending a [`Request` instance](./advanced.md#request-instances) using `client.send(..., stream=True)`. Example in the context of forwarding the response to a streaming web endpoint with [Starlette](https://www.starlette.io): ```python import httpx from starlette.background import BackgroundTask from starlette.responses import StreamingResponse client = httpx.AsyncClient() async def home(request): req = client.build_request("GET", "https://www.example.com/") r = await client.send(req, stream=True) return StreamingResponse(r.aiter_text(), background=BackgroundTask(r.aclose)) ``` !!! warning When using this "manual streaming mode", it is your duty as a developer to make sure that `Response.aclose()` is called eventually. Failing to do so would leave connections open, most likely resulting in resource leaks down the line. ### Streaming requests When sending a streaming request body with an `AsyncClient` instance, you should use an async bytes generator instead of a bytes generator: ```python async def upload_bytes(): ... # yield byte content await client.post(url, content=upload_bytes()) ``` ### Explicit transport instances When instantiating a transport instance directly, you need to use `httpx.AsyncHTTPTransport`. For instance: ```pycon >>> import httpx >>> transport = httpx.AsyncHTTPTransport(retries=1) >>> async with httpx.AsyncClient(transport=transport) as client: >>> ... ``` ## Supported async environments HTTPX supports either `asyncio` or `trio` as an async environment. It will auto-detect which of those two to use as the backend for socket operations and concurrency primitives. ### [AsyncIO](https://docs.python.org/3/library/asyncio.html) AsyncIO is Python's [built-in library](https://docs.python.org/3/library/asyncio.html) for writing concurrent code with the async/await syntax. ```python import asyncio import httpx async def main(): async with httpx.AsyncClient() as client: response = await client.get('https://www.example.com/') print(response) asyncio.run(main()) ``` ### [Trio](https://github.com/python-trio/trio) Trio is [an alternative async library](https://trio.readthedocs.io/en/stable/), designed around the [the principles of structured concurrency](https://en.wikipedia.org/wiki/Structured_concurrency). ```python import httpx import trio async def main(): async with httpx.AsyncClient() as client: response = await client.get('https://www.example.com/') print(response) trio.run(main) ``` !!! important The `trio` package must be installed to use the Trio backend. ### [AnyIO](https://github.com/agronholm/anyio) AnyIO is an [asynchronous networking and concurrency library](https://anyio.readthedocs.io/) that works on top of either `asyncio` or `trio`. It blends in with native libraries of your chosen backend (defaults to `asyncio`). ```python import httpx import anyio async def main(): async with httpx.AsyncClient() as client: response = await client.get('https://www.example.com/') print(response) anyio.run(main, backend='trio') ``` ## Calling into Python Web Apps Just as `httpx.Client` allows you to call directly into WSGI web applications, the `httpx.AsyncClient` class allows you to call directly into ASGI web applications. Let's take this Starlette application as an example: ```python from starlette.applications import Starlette from starlette.responses import HTMLResponse from starlette.routing import Route async def hello(request): return HTMLResponse("Hello World!") app = Starlette(routes=[Route("/", hello)]) ``` We can make requests directly against the application, like so: ```pycon >>> import httpx >>> async with httpx.AsyncClient(app=app, base_url="http://testserver") as client: ... r = await client.get("/") ... assert r.status_code == 200 ... assert r.text == "Hello World!" ``` For some more complex cases you might need to customise the ASGI transport. This allows you to: * Inspect 500 error responses rather than raise exceptions by setting `raise_app_exceptions=False`. * Mount the ASGI application at a subpath by setting `root_path`. * Use a given client address for requests by setting `client`. For example: ```python # Instantiate a client that makes ASGI requests with a client IP of "1.2.3.4", # on port 123. transport = httpx.ASGITransport(app=app, client=("1.2.3.4", 123)) async with httpx.AsyncClient(transport=transport, base_url="http://testserver") as client: ... ``` See [the ASGI documentation](https://asgi.readthedocs.io/en/latest/specs/www.html#connection-scope) for more details on the `client` and `root_path` keys. ## Startup/shutdown of ASGI apps It is not in the scope of HTTPX to trigger lifespan events of your app. However it is suggested to use `LifespanManager` from [asgi-lifespan](https://github.com/florimondmanca/asgi-lifespan#usage) in pair with `AsyncClient`. httpx-0.26.0/docs/code_of_conduct.md000066400000000000000000000110331454054354600173450ustar00rootroot00000000000000# Code of Conduct We expect contributors to our projects and online spaces to follow [the Python Software Foundation’s Code of Conduct](https://www.python.org/psf/conduct/). The Python community is made up of members from around the globe with a diverse set of skills, personalities, and experiences. It is through these differences that our community experiences great successes and continued growth. When you're working with members of the community, this Code of Conduct will help steer your interactions and keep Python a positive, successful, and growing community. ## Our Community Members of the Python community are **open, considerate, and respectful**. Behaviours that reinforce these values contribute to a positive environment, and include: * **Being open.** Members of the community are open to collaboration, whether it's on PEPs, patches, problems, or otherwise. * **Focusing on what is best for the community.** We're respectful of the processes set forth in the community, and we work within them. * **Acknowledging time and effort.** We're respectful of the volunteer efforts that permeate the Python community. We're thoughtful when addressing the efforts of others, keeping in mind that often times the labor was completed simply for the good of the community. * **Being respectful of differing viewpoints and experiences.** We're receptive to constructive comments and criticism, as the experiences and skill sets of other members contribute to the whole of our efforts. * **Showing empathy towards other community members.** We're attentive in our communications, whether in person or online, and we're tactful when approaching differing views. * **Being considerate.** Members of the community are considerate of their peers -- other Python users. * **Being respectful.** We're respectful of others, their positions, their skills, their commitments, and their efforts. * **Gracefully accepting constructive criticism.** When we disagree, we are courteous in raising our issues. * **Using welcoming and inclusive language.** We're accepting of all who wish to take part in our activities, fostering an environment where anyone can participate and everyone can make a difference. ## Our Standards Every member of our community has the right to have their identity respected. The Python community is dedicated to providing a positive experience for everyone, regardless of age, gender identity and expression, sexual orientation, disability, physical appearance, body size, ethnicity, nationality, race, or religion (or lack thereof), education, or socio-economic status. ## Inappropriate Behavior Examples of unacceptable behavior by participants include: * Harassment of any participants in any form * Deliberate intimidation, stalking, or following * Logging or taking screenshots of online activity for harassment purposes * Publishing others' private information, such as a physical or electronic address, without explicit permission * Violent threats or language directed against another person * Incitement of violence or harassment towards any individual, including encouraging a person to commit suicide or to engage in self-harm * Creating additional online accounts in order to harass another person or circumvent a ban * Sexual language and imagery in online communities or in any conference venue, including talks * Insults, put downs, or jokes that are based upon stereotypes, that are exclusionary, or that hold others up for ridicule * Excessive swearing * Unwelcome sexual attention or advances * Unwelcome physical contact, including simulated physical contact (eg, textual descriptions like "hug" or "backrub") without consent or after a request to stop * Pattern of inappropriate social contact, such as requesting/assuming inappropriate levels of intimacy with others * Sustained disruption of online community discussions, in-person presentations, or other in-person events * Continued one-on-one communication after requests to cease * Other conduct that is inappropriate for a professional audience including people of many different backgrounds Community members asked to stop any inappropriate behavior are expected to comply immediately. ## Enforcement We take Code of Conduct violations seriously, and will act to ensure our spaces are welcoming, inclusive, and professional environments to communicate in. If you need to raise a Code of Conduct report, you may do so privately by email to tom@tomchristie.com. Reports will be treated confidentially. Alternately you may [make a report to the Python Software Foundation](https://www.python.org/psf/conduct/reporting/). httpx-0.26.0/docs/compatibility.md000066400000000000000000000226701454054354600171120ustar00rootroot00000000000000# Requests Compatibility Guide HTTPX aims to be broadly compatible with the `requests` API, although there are a few design differences in places. This documentation outlines places where the API differs... ## Redirects Unlike `requests`, HTTPX does **not follow redirects by default**. We differ in behaviour here [because auto-redirects can easily mask unnecessary network calls being made](https://github.com/encode/httpx/discussions/1785). You can still enable behaviour to automatically follow redirects, but you need to do so explicitly... ```python response = client.get(url, follow_redirects=True) ``` Or else instantiate a client, with redirect following enabled by default... ```python client = httpx.Client(follow_redirects=True) ``` ## Client instances The HTTPX equivalent of `requests.Session` is `httpx.Client`. ```python session = requests.Session(**kwargs) ``` is generally equivalent to ```python client = httpx.Client(**kwargs) ``` ## Request URLs Accessing `response.url` will return a `URL` instance, rather than a string. Use `str(response.url)` if you need a string instance. ## Determining the next redirect request The `requests` library exposes an attribute `response.next`, which can be used to obtain the next redirect request. ```python session = requests.Session() request = requests.Request("GET", ...).prepare() while request is not None: response = session.send(request, allow_redirects=False) request = response.next ``` In HTTPX, this attribute is instead named `response.next_request`. For example: ```python client = httpx.Client() request = client.build_request("GET", ...) while request is not None: response = client.send(request) request = response.next_request ``` ## Request Content For uploading raw text or binary content we prefer to use a `content` parameter, in order to better separate this usage from the case of uploading form data. For example, using `content=...` to upload raw content: ```python # Uploading text, bytes, or a bytes iterator. httpx.post(..., content=b"Hello, world") ``` And using `data=...` to send form data: ```python # Uploading form data. httpx.post(..., data={"message": "Hello, world"}) ``` Using the `data=` will raise a deprecation warning, and is expected to be fully removed with the HTTPX 1.0 release. ## Upload files HTTPX strictly enforces that upload files must be opened in binary mode, in order to avoid character encoding issues that can result from attempting to upload files opened in text mode. ## Content encoding HTTPX uses `utf-8` for encoding `str` request bodies. For example, when using `content=` the request body will be encoded to `utf-8` before being sent over the wire. This differs from Requests which uses `latin1`. If you need an explicit encoding, pass encoded bytes explicitly, e.g. `content=.encode("latin1")`. For response bodies, assuming the server didn't send an explicit encoding then HTTPX will do its best to figure out an appropriate encoding. HTTPX makes a guess at the encoding to use for decoding the response using `charset_normalizer`. Fallback to that or any content with less than 32 octets will be decoded using `utf-8` with the `error="replace"` decoder strategy. ## Cookies If using a client instance, then cookies should always be set on the client rather than on a per-request basis. This usage is supported: ```python client = httpx.Client(cookies=...) client.post(...) ``` This usage is **not** supported: ```python client = httpx.Client() client.post(..., cookies=...) ``` We prefer enforcing a stricter API here because it provides clearer expectations around cookie persistence, particularly when redirects occur. ## Status Codes In our documentation we prefer the uppercased versions, such as `codes.NOT_FOUND`, but also provide lower-cased versions for API compatibility with `requests`. Requests includes various synonyms for status codes that HTTPX does not support. ## Streaming responses HTTPX provides a `.stream()` interface rather than using `stream=True`. This ensures that streaming responses are always properly closed outside of the stream block, and makes it visually clearer at which points streaming I/O APIs may be used with a response. For example: ```python with httpx.stream("GET", "https://www.example.com") as response: ... ``` Within a `stream()` block request data is made available with: * `.iter_bytes()` - Instead of `response.iter_content()` * `.iter_text()` - Instead of `response.iter_content(decode_unicode=True)` * `.iter_lines()` - Corresponding to `response.iter_lines()` * `.iter_raw()` - Use this instead of `response.raw` * `.read()` - Read the entire response body, making `request.text` and `response.content` available. ## Timeouts HTTPX defaults to including reasonable [timeouts](quickstart.md#timeouts) for all network operations, while Requests has no timeouts by default. To get the same behavior as Requests, set the `timeout` parameter to `None`: ```python httpx.get('https://www.example.com', timeout=None) ``` ## Proxy keys HTTPX uses the mounts argument for HTTP proxying and transport routing. It can do much more than proxies and allows you to configure more than just the proxy route. For more detailed documentation, see [Mounting Transports](advanced.md#mounting-transports). When using `httpx.Client(mounts={...})` to map to a selection of different transports, we use full URL schemes, such as `mounts={"http://": ..., "https://": ...}`. This is different to the `requests` usage of `proxies={"http": ..., "https": ...}`. This change is for better consistency with more complex mappings, that might also include domain names, such as `mounts={"all://": ..., httpx.HTTPTransport(proxy="all://www.example.com": None})` which maps all requests onto a proxy, except for requests to "www.example.com" which have an explicit exclusion. Also note that `requests.Session.request(...)` allows a `proxies=...` parameter, whereas `httpx.Client.request(...)` does not allow `mounts=...`. ## SSL configuration When using a `Client` instance, the `trust_env`, `verify`, and `cert` arguments should always be passed on client instantiation, rather than passed to the request method. If you need more than one different SSL configuration, you should use different client instances for each SSL configuration. Requests supports `REQUESTS_CA_BUNDLE` which points to either a file or a directory. HTTPX supports the `SSL_CERT_FILE` (for a file) and `SSL_CERT_DIR` (for a directory) OpenSSL variables instead. ## Request body on HTTP methods The HTTP `GET`, `DELETE`, `HEAD`, and `OPTIONS` methods are specified as not supporting a request body. To stay in line with this, the `.get`, `.delete`, `.head` and `.options` functions do not support `content`, `files`, `data`, or `json` arguments. If you really do need to send request data using these http methods you should use the generic `.request` function instead. ```python httpx.request( method="DELETE", url="https://www.example.com/", content=b'A request body on a DELETE request.' ) ``` ## Checking for success and failure responses We don't support `response.is_ok` since the naming is ambiguous there, and might incorrectly imply an equivalence to `response.status_code == codes.OK`. Instead we provide the `response.is_success` property, which can be used to check for a 2xx response. ## Request instantiation There is no notion of [prepared requests](https://requests.readthedocs.io/en/stable/user/advanced/#prepared-requests) in HTTPX. If you need to customize request instantiation, see [Request instances](advanced.md#request-instances). Besides, `httpx.Request()` does not support the `auth`, `timeout`, `follow_redirects`, `mounts`, `verify` and `cert` parameters. However these are available in `httpx.request`, `httpx.get`, `httpx.post` etc., as well as on [`Client` instances](advanced.md#client-instances). ## Mocking If you need to mock HTTPX the same way that test utilities like `responses` and `requests-mock` does for `requests`, see [RESPX](https://github.com/lundberg/respx). ## Caching If you use `cachecontrol` or `requests-cache` to add HTTP Caching support to the `requests` library, you can use [Hishel](https://hishel.com) for HTTPX. ## Networking layer `requests` defers most of its HTTP networking code to the excellent [`urllib3` library](https://urllib3.readthedocs.io/en/latest/). On the other hand, HTTPX uses [HTTPCore](https://github.com/encode/httpcore) as its core HTTP networking layer, which is a different project than `urllib3`. ## Query Parameters `requests` omits `params` whose values are `None` (e.g. `requests.get(..., params={"foo": None})`). This is not supported by HTTPX. For both query params (`params=`) and form data (`data=`), `requests` supports sending a list of tuples (e.g. `requests.get(..., params=[('key1', 'value1'), ('key1', 'value2')])`). This is not supported by HTTPX. Instead, use a dictionary with lists as values. E.g.: `httpx.get(..., params={'key1': ['value1', 'value2']})` or with form data: `httpx.post(..., data={'key1': ['value1', 'value2']})`. ## Event Hooks `requests` allows event hooks to mutate `Request` and `Response` objects. See [examples](https://requests.readthedocs.io/en/master/user/advanced/#event-hooks) given in the documentation for `requests`. In HTTPX, event hooks may access properties of requests and responses, but event hook callbacks cannot mutate the original request/response. If you are looking for more control, consider checking out [Custom Transports](advanced.md#custom-transports). httpx-0.26.0/docs/contributing.md000066400000000000000000000203671454054354600167510ustar00rootroot00000000000000# Contributing Thank you for being interested in contributing to HTTPX. There are many ways you can contribute to the project: - Try HTTPX and [report bugs/issues you find](https://github.com/encode/httpx/issues/new) - [Implement new features](https://github.com/encode/httpx/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) - [Review Pull Requests of others](https://github.com/encode/httpx/pulls) - Write documentation - Participate in discussions ## Reporting Bugs or Other Issues Found something that HTTPX should support? Stumbled upon some unexpected behaviour? Contributions should generally start out with [a discussion](https://github.com/encode/httpx/discussions). Possible bugs may be raised as a "Potential Issue" discussion, feature requests may be raised as an "Ideas" discussion. We can then determine if the discussion needs to be escalated into an "Issue" or not, or if we'd consider a pull request. Try to be more descriptive as you can and in case of a bug report, provide as much information as possible like: - OS platform - Python version - Installed dependencies and versions (`python -m pip freeze`) - Code snippet - Error traceback You should always try to reduce any examples to the *simplest possible case* that demonstrates the issue. Some possibly useful tips for narrowing down potential issues... - Does the issue exist on HTTP/1.1, or HTTP/2, or both? - Does the issue exist with `Client`, `AsyncClient`, or both? - When using `AsyncClient` does the issue exist when using `asyncio` or `trio`, or both? ## Development To start developing HTTPX create a **fork** of the [HTTPX repository](https://github.com/encode/httpx) on GitHub. Then clone your fork with the following command replacing `YOUR-USERNAME` with your GitHub username: ```shell $ git clone https://github.com/YOUR-USERNAME/httpx ``` You can now install the project and its dependencies using: ```shell $ cd httpx $ scripts/install ``` ## Testing and Linting We use custom shell scripts to automate testing, linting, and documentation building workflow. To run the tests, use: ```shell $ scripts/test ``` !!! warning The test suite spawns testing servers on ports **8000** and **8001**. Make sure these are not in use, so the tests can run properly. Any additional arguments will be passed to `pytest`. See the [pytest documentation](https://docs.pytest.org/en/latest/how-to/usage.html) for more information. For example, to run a single test script: ```shell $ scripts/test tests/test_multipart.py ``` To run the code auto-formatting: ```shell $ scripts/lint ``` Lastly, to run code checks separately (they are also run as part of `scripts/test`), run: ```shell $ scripts/check ``` ## Documenting Documentation pages are located under the `docs/` folder. To run the documentation site locally (useful for previewing changes), use: ```shell $ scripts/docs ``` ## Resolving Build / CI Failures Once you've submitted your pull request, the test suite will automatically run, and the results will show up in GitHub. If the test suite fails, you'll want to click through to the "Details" link, and try to identify why the test suite failed.

Failing PR commit status

Here are some common ways the test suite can fail: ### Check Job Failed

Failing GitHub action lint job

This job failing means there is either a code formatting issue or type-annotation issue. You can look at the job output to figure out why it's failed or within a shell run: ```shell $ scripts/check ``` It may be worth it to run `$ scripts/lint` to attempt auto-formatting the code and if that job succeeds commit the changes. ### Docs Job Failed This job failing means the documentation failed to build. This can happen for a variety of reasons like invalid markdown or missing configuration within `mkdocs.yml`. ### Python 3.X Job Failed

Failing GitHub action test job

This job failing means the unit tests failed or not all code paths are covered by unit tests. If tests are failing you will see this message under the coverage report: `=== 1 failed, 435 passed, 1 skipped, 1 xfailed in 11.09s ===` If tests succeed but coverage doesn't reach our current threshold, you will see this message under the coverage report: `FAIL Required test coverage of 100% not reached. Total coverage: 99.00%` ## Releasing *This section is targeted at HTTPX maintainers.* Before releasing a new version, create a pull request that includes: - **An update to the changelog**: - We follow the format from [keepachangelog](https://keepachangelog.com/en/1.0.0/). - [Compare](https://github.com/encode/httpx/compare/) `master` with the tag of the latest release, and list all entries that are of interest to our users: - Things that **must** go in the changelog: added, changed, deprecated or removed features, and bug fixes. - Things that **should not** go in the changelog: changes to documentation, tests or tooling. - Try sorting entries in descending order of impact / importance. - Keep it concise and to-the-point. 🎯 - **A version bump**: see `__version__.py`. For an example, see [#1006](https://github.com/encode/httpx/pull/1006). Once the release PR is merged, create a [new release](https://github.com/encode/httpx/releases/new) including: - Tag version like `0.13.3`. - Release title `Version 0.13.3` - Description copied from the changelog. Once created this release will be automatically uploaded to PyPI. If something goes wrong with the PyPI job the release can be published using the `scripts/publish` script. ## Development proxy setup To test and debug requests via a proxy it's best to run a proxy server locally. Any server should do but HTTPCore's test suite uses [`mitmproxy`](https://mitmproxy.org/) which is written in Python, it's fully featured and has excellent UI and tools for introspection of requests. You can install `mitmproxy` using `pip install mitmproxy` or [several other ways](https://docs.mitmproxy.org/stable/overview-installation/). `mitmproxy` does require setting up local TLS certificates for HTTPS requests, as its main purpose is to allow developers to inspect requests that pass through it. We can set them up follows: 1. [`pip install trustme-cli`](https://github.com/sethmlarson/trustme-cli/). 2. `trustme-cli -i example.org www.example.org`, assuming you want to test connecting to that domain, this will create three files: `server.pem`, `server.key` and `client.pem`. 3. `mitmproxy` requires a PEM file that includes the private key and the certificate so we need to concatenate them: `cat server.key server.pem > server.withkey.pem`. 4. Start the proxy server `mitmproxy --certs server.withkey.pem`, or use the [other mitmproxy commands](https://docs.mitmproxy.org/stable/) with different UI options. At this point the server is ready to start serving requests, you'll need to configure HTTPX as described in the [proxy section](https://www.python-httpx.org/advanced/#http-proxying) and the [SSL certificates section](https://www.python-httpx.org/advanced/#ssl-certificates), this is where our previously generated `client.pem` comes in: ``` import httpx with httpx.Client(proxy="http://127.0.0.1:8080/", verify="/path/to/client.pem") as client: response = client.get("https://example.org") print(response.status_code) # should print 200 ``` Note, however, that HTTPS requests will only succeed to the host specified in the SSL/TLS certificate we generated, HTTPS requests to other hosts will raise an error like: ``` ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'duckduckgo.com'. (_ssl.c:1108) ``` If you want to make requests to more hosts you'll need to regenerate the certificates and include all the hosts you intend to connect to in the seconds step, i.e. `trustme-cli -i example.org www.example.org duckduckgo.com www.duckduckgo.com` httpx-0.26.0/docs/css/000077500000000000000000000000001454054354600145005ustar00rootroot00000000000000httpx-0.26.0/docs/css/custom.css000066400000000000000000000002731454054354600165260ustar00rootroot00000000000000div.autodoc-docstring { padding-left: 20px; margin-bottom: 30px; border-left: 5px solid rgba(230, 230, 230); } div.autodoc-members { padding-left: 20px; margin-bottom: 15px; } httpx-0.26.0/docs/environment_variables.md000066400000000000000000000072471454054354600206400ustar00rootroot00000000000000# Environment Variables The HTTPX library can be configured via environment variables. Environment variables are used by default. To ignore environment variables, `trust_env` has to be set `False`. There are two ways to set `trust_env` to disable environment variables: * On the client via `httpx.Client(trust_env=False)`. * Using the top-level API, such as `httpx.get("", trust_env=False)`. Here is a list of environment variables that HTTPX recognizes and what function they serve: ## `SSLKEYLOGFILE` Valid values: a filename If this environment variable is set, TLS keys will be appended to the specified file, creating it if it doesn't exist, whenever key material is generated or received. The keylog file is designed for debugging purposes only. Support for `SSLKEYLOGFILE` requires Python 3.8 and OpenSSL 1.1.1 or newer. Example: ```python # test_script.py import httpx with httpx.AsyncClient() as client: r = client.get("https://google.com") ``` ```console SSLKEYLOGFILE=test.log python test_script.py cat test.log # TLS secrets log file, generated by OpenSSL / Python SERVER_HANDSHAKE_TRAFFIC_SECRET XXXX EXPORTER_SECRET XXXX SERVER_TRAFFIC_SECRET_0 XXXX CLIENT_HANDSHAKE_TRAFFIC_SECRET XXXX CLIENT_TRAFFIC_SECRET_0 XXXX SERVER_HANDSHAKE_TRAFFIC_SECRET XXXX EXPORTER_SECRET XXXX SERVER_TRAFFIC_SECRET_0 XXXX CLIENT_HANDSHAKE_TRAFFIC_SECRET XXXX CLIENT_TRAFFIC_SECRET_0 XXXX ``` ## `SSL_CERT_FILE` Valid values: a filename If this environment variable is set then HTTPX will load CA certificate from the specified file instead of the default location. Example: ```console SSL_CERT_FILE=/path/to/ca-certs/ca-bundle.crt python -c "import httpx; httpx.get('https://example.com')" ``` ## `SSL_CERT_DIR` Valid values: a directory following an [OpenSSL specific layout](https://www.openssl.org/docs/manmaster/man3/SSL_CTX_load_verify_locations.html). If this environment variable is set and the directory follows an [OpenSSL specific layout](https://www.openssl.org/docs/manmaster/man3/SSL_CTX_load_verify_locations.html) (ie. you ran `c_rehash`) then HTTPX will load CA certificates from this directory instead of the default location. Example: ```console SSL_CERT_DIR=/path/to/ca-certs/ python -c "import httpx; httpx.get('https://example.com')" ``` ## Proxies The environment variables documented below are used as a convention by various HTTP tooling, including: * [cURL](https://github.com/curl/curl/blob/master/docs/MANUAL.md#environment-variables) * [requests](https://github.com/psf/requests/blob/master/docs/user/advanced.rst#proxies) For more information on using proxies in HTTPX, see [HTTP Proxying](advanced.md#http-proxying). ### `HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY` Valid values: A URL to a proxy `HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY` set the proxy to be used for `http`, `https`, or all requests respectively. ```bash export HTTP_PROXY=http://my-external-proxy.com:1234 # This request will be sent through the proxy python -c "import httpx; httpx.get('http://example.com')" # This request will be sent directly, as we set `trust_env=False` python -c "import httpx; httpx.get('http://example.com', trust_env=False)" ``` ### `NO_PROXY` Valid values: a comma-separated list of hostnames/urls `NO_PROXY` disables the proxy for specific urls ```bash export HTTP_PROXY=http://my-external-proxy.com:1234 export NO_PROXY=http://127.0.0.1,python-httpx.org # As in the previous example, this request will be sent through the proxy python -c "import httpx; httpx.get('http://example.com')" # These requests will be sent directly, bypassing the proxy python -c "import httpx; httpx.get('http://127.0.0.1:5000/my-api')" python -c "import httpx; httpx.get('https://www.python-httpx.org')" ``` httpx-0.26.0/docs/exceptions.md000066400000000000000000000041001454054354600164060ustar00rootroot00000000000000# Exceptions This page lists exceptions that may be raised when using HTTPX. For an overview of how to work with HTTPX exceptions, see [Exceptions (Quickstart)](quickstart.md#exceptions). ## The exception hierarchy * HTTPError * RequestError * TransportError * TimeoutException * ConnectTimeout * ReadTimeout * WriteTimeout * PoolTimeout * NetworkError * ConnectError * ReadError * WriteError * CloseError * ProtocolError * LocalProtocolError * RemoteProtocolError * ProxyError * UnsupportedProtocol * DecodingError * TooManyRedirects * HTTPStatusError * InvalidURL * CookieConflict * StreamError * StreamConsumed * ResponseNotRead * RequestNotRead * StreamClosed --- ## Exception classes ::: httpx.HTTPError :docstring: ::: httpx.RequestError :docstring: ::: httpx.TransportError :docstring: ::: httpx.TimeoutException :docstring: ::: httpx.ConnectTimeout :docstring: ::: httpx.ReadTimeout :docstring: ::: httpx.WriteTimeout :docstring: ::: httpx.PoolTimeout :docstring: ::: httpx.NetworkError :docstring: ::: httpx.ConnectError :docstring: ::: httpx.ReadError :docstring: ::: httpx.WriteError :docstring: ::: httpx.CloseError :docstring: ::: httpx.ProtocolError :docstring: ::: httpx.LocalProtocolError :docstring: ::: httpx.RemoteProtocolError :docstring: ::: httpx.ProxyError :docstring: ::: httpx.UnsupportedProtocol :docstring: ::: httpx.DecodingError :docstring: ::: httpx.TooManyRedirects :docstring: ::: httpx.HTTPStatusError :docstring: ::: httpx.InvalidURL :docstring: ::: httpx.CookieConflict :docstring: ::: httpx.StreamError :docstring: ::: httpx.StreamConsumed :docstring: ::: httpx.StreamClosed :docstring: ::: httpx.ResponseNotRead :docstring: ::: httpx.RequestNotRead :docstring: httpx-0.26.0/docs/http2.md000066400000000000000000000050121454054354600152710ustar00rootroot00000000000000# HTTP/2 HTTP/2 is a major new iteration of the HTTP protocol, that provides a far more efficient transport, with potential performance benefits. HTTP/2 does not change the core semantics of the request or response, but alters the way that data is sent to and from the server. Rather than the text format that HTTP/1.1 uses, HTTP/2 is a binary format. The binary format provides full request and response multiplexing, and efficient compression of HTTP headers. The stream multiplexing means that where HTTP/1.1 requires one TCP stream for each concurrent request, HTTP/2 allows a single TCP stream to handle multiple concurrent requests. HTTP/2 also provides support for functionality such as response prioritization, and server push. For a comprehensive guide to HTTP/2 you may want to check out "[http2 explained](https://http2-explained.haxx.se/)". ## Enabling HTTP/2 When using the `httpx` client, HTTP/2 support is not enabled by default, because HTTP/1.1 is a mature, battle-hardened transport layer, and our HTTP/1.1 implementation may be considered the more robust option at this point in time. It is possible that a future version of `httpx` may enable HTTP/2 support by default. If you're issuing highly concurrent requests you might want to consider trying out our HTTP/2 support. You can do so by first making sure to install the optional HTTP/2 dependencies... ```shell $ pip install httpx[http2] ``` And then instantiating a client with HTTP/2 support enabled: ```python client = httpx.AsyncClient(http2=True) ... ``` You can also instantiate a client as a context manager, to ensure that all HTTP connections are nicely scoped, and will be closed once the context block is exited. ```python async with httpx.AsyncClient(http2=True) as client: ... ``` HTTP/2 support is available on both `Client` and `AsyncClient`, although it's typically more useful in async contexts if you're issuing lots of concurrent requests. ## Inspecting the HTTP version Enabling HTTP/2 support on the client does not *necessarily* mean that your requests and responses will be transported over HTTP/2, since both the client *and* the server need to support HTTP/2. If you connect to a server that only supports HTTP/1.1 the client will use a standard HTTP/1.1 connection instead. You can determine which version of the HTTP protocol was used by examining the `.http_version` property on the response. ```python client = httpx.AsyncClient(http2=True) response = await client.get(...) print(response.http_version) # "HTTP/1.0", "HTTP/1.1", or "HTTP/2". ``` httpx-0.26.0/docs/img/000077500000000000000000000000001454054354600144645ustar00rootroot00000000000000httpx-0.26.0/docs/img/butterfly.png000066400000000000000000024674021454054354600172310ustar00rootroot00000000000000PNG  IHDRMJViCCPICC Profile(c``RI,(aa``+) rwRR` b >@% 0|/:%5I^bՋD0գd S JSl): ȞbC@$XMH3}VHHIBOGbCnₜJc%VhʢG`(*x%(30s 8, Ě30n~@\;b 'v$%)-rH @=iF`yF'{Vc``ww1Py!e pHYs  %iTXtXML:com.adobe.xmp 2 0 72 1 72 1038 1 675 2020-11-04T11:11:96 Pixelmator 3.9 BW@IDATx`\ŵ޴*d[VV"ظaJA" !HBy <‹L 9`\q.\xI薥-wju33JqC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(:4M3E1@Qf@@$P`{wP[3:{o  8b^E@T@s |,ŬP^x-2 @0  z|ggof0*hQ5t#@` 8hG" @ K3fڔdU&,ϟ3b+N@bZAL^ "5~~a2ەdVFY%:GEB¶hi D-8Ik@@ ; NXqơuF0! h0+ͮ ~? p6*#Ā84@Y@3\vڂ^f:l%&2ɿA߯9wEs ; @t 0T!G@(#I_yۚ2 3k:dTRs&U]3{͙T@  Q^ DmΚ[{5l jUNWĢ3~x! Q{x8 3 UCIC@@ d ^3fIl6)ў?vw%h A:TY*졥a  ۷<ſ]Ҍ9e8K$ B\ 0p88ǚ" @hEW^.|JU~^4gڭcRU "  ЇԢ~x{/4 l2no9{g\q>B@K8R"6@@zQq7=y l*1˒ ,-9>ޟ]w2DAŽQ G-@ )@jtk2&`Dsc} @`BY'@߹s?T]t0e4Ѩ5fUW\qp|@ B B@ꟶMZ~ڐ8pHqNZjMg ,[Ǜ $@A,Mڂ|E}r6mϫi66Co(]r[2-=htTZrݏ<=7,! p884pU|;>zkO>Ќūd5E>!pm~ٖi4dTnfj0 F#i @ qGv!+`C9||OoO~F(>mH@:ZŦfw9gKʛ@CS]!"j۾}-KkVkV*!UVk^vٜ6ZݩNNYwUjR2{hRY@`` 8ǟ#@0knk#+PPdzg7} %Tڍ@ovݦQWcۓvsp+'?7ʧ @JA_I@  ,w N'3%V#^떍uJ*SF@vȟҔSݳ*?cY߹yG4" ?( X`W]X[+e4dhhXxǝq0MG hf\xήSN2M^{"g,yTy @ 8O}A`ͷ)qS|],v%v%g_5[{5Q$+鍷߿b sڽcЏ.y RU@@gm&ǚg^[U.-ԊGheڌ [~ryJ1?*sSƨ`qax[uޚg@"Eq 10\ٽn컓rIjhRWw=K?x_:pb@@M.ҸiKn1 @h  p0>MG8n;GϘp2mNpٟ[9ι͸  D>A*fWW98W+eJ:uu飻ؤifWIKQMXʯnr>isS"  <3&Y^H #MX}y&##I@}[k z%{0mr^d{I.   @ 蝞%x0M6 k%yʒvYث;0X@-8snjʋtb!3')UG@@(p}i FkrLY""ŴUǔqWe*Wйr VgF8@@@HM1~[k+rrjô⬑]oXR #>I@6sr99%hXMpԧ ˾scG~]_Aa yI@@B0֟ld|\Z%N./dx{秏|"?k6o;럎&@@@ HfT*WZhZ¢yhewy^}E9S/EGͩ%   Їzuǯ̃q9.g"   ,yqٸ|߸܌׮\2YcL#^hKPXpuɸ֜A/S   i;͚viٸœ\|ybz>/sΨA>eZMc?jT@@R@lK^_U\0yrTN&\2{ڙ wۮx  􇀞a wKiK<>T@ψଵEeEy;L곷ޚob@@@i* fKJ7i0i)~XqTyan ]s8=ЋS    j/VU0S=@_ g^uK市u yd}~@@@O@:|~'|x✩s9"P'Ψ(]^|Ң7ssKE)   R(0]se M.)u'NҳA?&;m|0?>@@@_=|Ve?:yقҁ#5H#@M)퓝@@@&ӚQʟ.)xﬓyqv޶<   wX9goa2~>&{=8uygf/9u ^چ  D>D+gO,.800?hr7Dۏ>:0fVo{DlE   .]pRW$p4ms긂&I9{ɖb@@@c.mj]1oSˊ>>iUZ2\}@eUƍٽzܛ={@@ٗϙ_޽ajȁfl6.^{#/>塖7L*{@N4;dTM-̽%lv}.| 0Ybl>k16vΎ@@@zW@~~~mCzw6] o^Q;g:,ti+  ĬtL'7{iYQ^Ǭ ?njG٣}/Pq팒qWzZ]퍒@@@T@lMb|anYϖ>=ѽ39~̽E{UO}H=   zU?(jX9q[ , sY=z3= ]G   @uCM(4g􇧯YT)B&{LZkFde?t`@S(   ;nVQ|EA߿ŒȨD'e礲·~X#uB@@zW@O=tú⊜&>fcJۮŷN*9xٙkf G6   _Q@:W/3p۬ʊ4m+O-/8u_i0;MD@@Y@j+47WjނGQ@JS'RU׼yӴ=0?@@h7eUYcN|R4VYNS$?q h   TL7(-=cmb0h͒e9釖͛O @   Y>@dXlq&ᳶ+/ɬ,ȩ[=~^lV!  |coQ]QYT Q# ~qգ+>X?5    }#wo򌲂Ǝ녧Oos/uO>R=ъœ+7ZmbJ  D(yw>;}ȎrZ gujMj=y3   @ z=EcF<~~^ % d^^xٸuK]ix @@@ HҴjɒ%~Ycߨ Vk>yyMWLewDVJ! @ 餤+%"Q@7Z,/gi^/jkk A?O8E̙\܋7-E@@8:Zl E֭ f;jxWYn_=E~p%ejue[XȮ5C@@hMi>Ch "TstjA'J r;ueH0}Ƽ   Ws3&}_۳Uv!5l?Gy#5nmQ3j   pO,<'?M֨j#kN>쩺'S MF@@+yqfi_=Q'o}+yٯL,qU%=   _O@S_҂粇ݳx̙dP󻲢婖7Lݳ+@@@\@:[FuM_VߗO>`JNˊv]Ƌ=EzEB@@@zUݓK~9vHԫ;Їgna5'-6O   D?mĊ2a3׬(,/yU9mѮ(@bA@N̚Vg@GN[W&Y9Æ J x)sd>=xm}?R@@ f+:Ę94^Ѳf-15oMLˇ^ͬ8|ܡ=}! Lq  }'g뫃9n "A@ۺ:s҄s N*{tlYiXWΛ>47i ܉m/R   @?1>v.@`o]Y^cH]oMߞZ8:YU?Q&e   , 󦄒 nj{U~Pcr3*\%hRq@@@Oxyee(H^:ClXr\Ei'-{q|x   $֚Ϭ^5|1cߴiSjU/j|U5^y SQ@@@L@[fUN>y\O1W˿ ˼djՆ.=#^.   / ]+3vͭA,ߪc=Hp9N)+vK4VQ8@@@_9,;Q#fE%Wο0C Z0uG/[    _}{nep7W]+TgwnXZpw@@@O=ŋgf.-̹Gۿٟ}pE{46~R7@@@zM@ۺ:z9cGwV~[mVx$kuyUoj\4f    4m(i- fN[wVzVƙkO_Q'-"  oaHQv cF{g=tެ@@5c5  p^XRV| ٟӳio:5mrf8;#@@@c&Q=raƈ!T3eŧ)_fߥ8f   @H:8ۙZ0u\=-uzJZQ/o)7˦,@@@Z@_lzyt QݠYyF3.;sqYAN)+%gBįi   1, }ycG#_{n5M+Yhnޞo   ]@ųe i~< ie &sAnڈ   +֩%9JժZ6S iN40ЊBۿ6o@@@@` e^kb |cǧ/w5הL[@rc x@5sêrǾ_=oa,"*6emX{Z]%**N%@@w#zǒR@ 5;a¢QwjG)F*_OZh   T@vڧ/` %H0!f;Xf]U]Rܶ3c&D<& G@@I\4$}ߊF9wr`G0@=HpɆ  7mOeS䇑F!  D(8yٜiG4{LZ~i q'Tn5jϭl,zfk@@@'[5)Ud T^+?mE6 'Ο}Bu8 oЗSU@8 sy@c"PP`k&N~ъyH:&;<z(eϾ;]'TPP?h@@@nZ78hk;͙rNuEOP @@@;gOXY12X7AWV3*vW,:oZ_>؄@@@@hGߙ347SdYã)ޫg̙6K/9יּ    ,'iU9/>x&D55fW?΃,8>@O~MOO@"]`Y*-+n3[_ߏ%Er%h21ljo$ח!   ,7Ҽ qD.kI8e噣6̙^>4@@ k-B.P_Zʲ'8dArU;5+1YK@@H pG:! mnβusУ-Iˊ2G\8{ڦh[-(@.Ճ  -«H@-599p8Xbօ}#   SIf|xRS]qq[$RN!A@`Bw@T…陙%{͍2+?X:/{;)뮽x3Q` D@zyj пzBB~ovkj>}cb9Ǧ{o_ "Ч'%zꅜ ,DGz 0[QQSükރWTuR__ekh=nj 55>?C@\ @ A'TQZ9{ċqMxŅWΟ9e.ʴ @@g|Q(k Ă =p˝ONIymz>}Fz~ D@DZ" p Æy*+o5L-c>Q1m| ||ZG  Qg@?h{U]>IcM2,ᵺ9ŞP8V\@@@%'LVUIKK[19gVZvm@@/@ nvw(^{SU.+F AEuB@ pп@ +֟n37<'%aݻn;Eq@@@R@:Ƶ+5q|-|I2?\>4m1їf @z_7D@zE@:8 O;7[[}gܽRRS3\θ̌1*5[eS   upꪥkM\55vUjՇ|G>o7k||^k?5# G |Ǒq@G@:k6j5:g֟Y5i-…f >kOK͆CRW2;?}    e0UU;V.{ʦM&(|͘k03ͭvrKGn}=fSW̟uG@,< y@G@;IOn>#Z]X6 M͗$j;\bNz7Ϭ޽EI,? O" #@ Q ~aoVȟt= AJY?5I$Yq*TTfk{ߙ_wXmRS:@@#}@"XsxKp?RM^V.2٬IpFmuѷnp|ZjjjlO_'  Y>K@@Ø17~J6[ߟkYG2[dP(NwZ.#D6jߩZ1I@@ D: |dzߦ:u~5ӕrY +WK;FI 5ѩjXO˼THwm:y~" '@dx@غ5՛6, ɰrsnK?Q2 dT7)w * +?M ilPRn1b 55p6*! @ 8Bu@"3  -mmmVKE's׫2فKbAZvemQ?4%Ν '@@O|*O@D K$&? {2 ,f TTuʺ5jtioW-twM,AIu*-;JK5@@` |]C P(p+HAPŹj\i,ح> Z8V?tgw @=n6bdSeӧ\Tmp ].; gn:P  #u- Ā--OYm*0)קrP@jjSMUZixy }$@AA@zKV3ڶ#p8 Mpũܼlo T|KdŢ< MFfoՃr@@``tJ@@ -a[K@]4H575!C b+dOrq ܢV /@Aj W4y_6fcUҠ$ѥ:j;U4)SS]>A\|2]|坱!  d1@@ :d٬FK?ةƦR +>ڹW54P&Q&IM&YѢ~@#pC@Lņ @cSB*֔WYnƖ:`wT]_kRSdAuxG7o{.K Dh9R@HMȤဦljTXtƩ.W%'(2(˥<^K=RLr̔XUO |e_ @Ggu,X&Mp>lUPP(Az Qa2(!9=k)=ێ9k p  @ 8#D@8B`W]f.TQٷ[_S$@hnSA͠>޷W&40fQM4^7]ÿhuR,+,a]@l³ D@|B ٚZ?dŠz/7 /T{{s:Ώ)_R'|{渚&uǤ^4M397I xm!)ͥE>:|5d$DgJ! Z! plKhn'n:2Ǩ8M,VuU65m,|谬{ xSyBeqZUAn=odLSKK3OYLEMư%yP|3y^eQObwīl*/ ~ji픷[57(׫lV U%hlU&E&Z*$9erŰ.a}G2e{Y1)eǎ.$wd+ѠO[ $@|2AP9%@?Pzo"$ZP ^d4%H̛Q[oco!  p02MDlzvNaNäͪSuj@P2ҹ$5 68AmRBT0[l=CLOL0HPA :w7`P&,`P(H  F .fBXaTӭ` BCOOԝ嗉 5k"s %k[3!esċR.(#!#y4Ik1[# @4 8ƣFO@!_ fn_mJk|_\㇚\fcJjY3NKxr;ێ5ԫiFON睠Vx|24@rxߨigji8H1uŊs&/ R*,F9mX)Y>3ߑR`CN*&uu^q(o6]0xG2|m.J4X9kTozw%VNeqU0.Ad(XTbt%g#n\mލj{vt0ɐK3x8Wr8l2icdZۻ\h@xУcھJ@'Rv8::>cۜ,v{M cBpjJJ Y5kltؒ݃%퍳L C.z.w3!)E,~S;Ny$Zeo3h]MKia{oF}wo .i2MN1H> iS%?jf΄Ғͮtn)\2sR0-my_MQe( 8I@$lΔ (cK H0B= <"?ՓA`"*>Tr@ ^_Up˗K+0[{exO2 ξCɐOhNCڵKUWS v$U陪ӻU6 Ʃ6>0(M+v_ JRWCP?Jcj`qBݝ=ԳO,ϱ( @@`@$]ȈηAFɿL避_y;;[ݦ)bkuǻKåK%ٲF%$ÒZ-)&9ɖL.{ͲĘt{dq\E qBOO&R]]VL4fuD`P HH&'~lrҭ2^gn[dS=`+_w*(RG]^-lh0\J3!)6`66ȄgPX |'G&;7<.ohw\&㚍Fr&Xۥ|Vq'Lv!)9g ۃ&cނg^n% 62ck VHBn5ظ!@ e볮8KW{u=TSGzQPXdyEy!V5xX{4`j%m}7a0@0p9\p|y,2i`;ί*qPJS9 W}뽎B  q"Fj$Kf=%jIڜ]Π6ueL4lCjPY+刏].lqJb'2fIm4^Wn[g{\ .sYv6=DI_]UO(Jг\;$LoG%7(ܾO6talj/q,'ܝqfzP*V.9cԐoPC~e3U?]z-(\ݓ<]rQʖ:xTwkĔA=3$1 i@zn Ҥ`u˒nᐶU*d4Thԉ|{4a$w.Hߙ{P Um9[@NT3)[CT!j[ճzVp48пs|=g4<]~<4A6 &J6}}L(S*%E% NPC҆]vIU< &PX;}h6~|~ߵkꄿב=8!5vʩg/Vg78U{ )-iқ;z YAܫUi7JO2@޹Qi)2I=n唴ڄAC z恾-Z$ɴ_>%H|rb3c,f@HHOF96zarJ²& }u,z@A!e7IVB L))&BL䳺N1)ZCȿb3׻Pӯ-O$'V2u߰h %kj!:^aY/\52NW$Fo[Cb0:%HR)ɩ2rID;e *wӢ4%贪G4ݚS X:z|J`βaҮvXy{$cq]'=W'C@=.NeM=S exYthC>R>e#f  el+^G@.Wj4][{gFCt{ۊ: qEAA3'XRa7;eak=p[UPd1 tÒV} r,&ɵrLH<>>ANe6+3I]w5P~R At$ש%%d+p/=YP}y''zgMmJBA$LMVRHXCLCrb-g)f&sC%$CM{&+*W%j PYH=ɳP%x&+ z=J&= ntKփ ΃5.Ue:y}97H,.zE=("ntgp֤ܠ=]q/g]+ת I>Z%m'uӇf$_p:=29DGb\? ̆(YU(d52>'96Feٚ|iu>m :[۠)]VwB3.A0[\ΐl %ZUkRr&KzaܶMfЧy%Cw|هio9T ^~S1[[yeD=+.B~L(|6LJ]%07diGM$ '-'^؞A]MDޠ`+T|OI]G҆U _Xt+'0  31+V@һe25?o{-*hnm*5h$i&[6%(W媿\zHVZk2#WS/'7pvL@ˌ):d0/sӇ X%-$;/WNPKA??@O7* n&'ޞ C@8%XV}p)O?i?Ճ|  2bO0' zJ>YzlQ~*[lR¢\*~M;zΓ@H@;Tʐ4.ͻ+K`erHE0 2D(O zX'SB~=#$a6zeId{ia(QVٍ%DZmv]z^;?>xO$SCg,&wXzB14^?p ֏rL=iZ'etG SSrԍA: Z&9,&-蔶'&[{qngSvHhuX΄w%6[-9-rħ&2+J%uD|JR{OhRnz-Pi'Yx :#sOHud.m 0n_wOOqj9>'(.~x%*S*Ttg^c~C~-jPLR˖-T&u]HVdLʰq|xUVY.>^6zݷ%,QU/)nmChUj$CZeHߢhig~7ToQ2e^a{!khnn6۷ٹǐ:0‘Mol{~Kjc DvjkָdwY l-feH~$W%Bfr dw>&?'L=ɹS*$m7>a|"K |;S۹#1:RX3_&AQ8g~]&ۓN\,')+ dpPH tH!ڥe,wO/+$ga$1^z!,'C:4\3HXF\ z'_tdVqU 'z&S&;&/UYL\ }>ALi A:s ЇGH?W'W I鑆$!ϕ+Q>ɈxKAED]qW))C$rX NIQcƤ!x,;@yZ(,SH%r'Þ= } i]r:QZtCS !W7Yc%GVg)RPOP'NDg=$=ηsw6 .HpIY%%N}K',UʱxeVId,Si&pIȋ bvwvwvrNf~J :+0t_x{?gkKУLx5o_i!?j_ #G툊9P|aM8&"KTjֶLـA5N;/Qr{XnCmsk5NjlɲШכ\콷cwyZ4ݘ hHƣ'4~8|̙Vj`(DGLzeu%ys\7Mul#u_j+W[(U7F[2JP"1d0 rf"# V.tZf̤vTyDGcBl`\ &S2u97j 6V[RG4T1@[B ŕ41/=MjW*6&6e^l مbp kwP.V;LboOP!#T[p'پsG@;~gn9C>й_3vL2}+j4d&]QngAԼخrKaY3=rz`D²:Z' @ycrH W|Ĉ_ Π,W>ێ9(MCs=1}<0xl}=e-Xx7C~>t/~qv'-+2>ypbkDMekd,707穓0&xm\Y[p8Gd֦d %M`SgWwX25-`:+5P\c}yeEU۪,Q\r\y5S(@V[녶Ω|>0Ա;йޠljS'|+dHF"e`o܈Kmg.Dm^[ +8zá#g 嫡FcXQY/}5g{.ƯքES+)6 N/kIsʇ"sІ̥D*:1P=}Qb6:+~~i۹|Oy}>z|^ ~7+^it7xSө72ٍ[cW*e퇭FHU*lMF7:rR43C!&Me*tTj.IwhjLFm#jRd@ގEZMGmէҴ J%֛o'Qa8rZf((2+kk+:TbZvYҚTt RSi>D)B-8ֶ(Rޮo6V&L5E׷b@ c8[-6 E}V+qjfMMzz=[?]``5\ζ3#} /439f'lJE WhP :#PߟcGc: N#GN% @Ag޴BX`lk\OM3pu<6֌i(u\ʄckhoh D ;1S4vR3aCax' 68rp_8C۞#Me,` TzL&Eg8~c} #@O} >L:BpzA lKΑ|:mf:l/) שwV w +:SyFnv:O %·L S&˜E`oh9@p?E20)9'XRe\qmy$ } LPh)D{Ʈ\ =6 s<\~ =Lk QT!46Tp5:hW4-9^M&K4Sm&*wo 96 H`BB,q1)}׌+L2'7ax~΅G/g'?/ O9&'VBdN5N!*f8yD)vy>;BP0\mZ9_ddq!v[~掻/SmglG:8bK Ifmo%_$XW\x챐xH<x  a2ZNFP:jC^6 ϥ}P"ѱE0*X^&P K+KoVJlmVD)o7{3 B)Xz%YWct? #Q=^eTI퉎pĵk« ;*Bu@res~Lc$I2_^XrgGN TZҮ?a޽˗/W^y%t#0܉{VGrN]Ƿ\ tdk4j*S)QqL;UY)H݇Y뮑kWFR젱g ͜ZbJ:FA܌b4XffZm6WLA\. \ŶR{Fp~wuE6 6ka\p<6ld?Z k? pcz @:K02waimee Vςb[rQ#稻;,MLk}CԽw< ^zi=]xX.P%g_O{dw’ӹD8Cl-a:sƹN%8ɩE-k1Mj8AOA&L쁫3@m :Vd77[uotwW'YjљnR#h{m+mPh&*PeiAj)6z 7b(͍DL׫L9!G²4yR;Ϲ "q6LSv#[bP3lNdG_<C8g6O'lkףc}б055¾~45lit; U/YV&Qc?h jz?M×tA;0~>0sӨ=}byUwEZ?C.FkpjȪ͂жY$[S`Rc+c瀪aw8^s&xeZXLpyZn {z[/ lE j5~K{Djζ3#}pHWK'_9 ='q%ҙ`ERk:_VFT#O:a s7qH*_jy74p7B[>2?J`PȋK/ =ze`hb  !47_r2GTXob|~صԷʂP^(GD1v(j 9RYkøo, P4E*5婐`]mwCgzE݂bm#NdZ0 H 0XQ~ 8i\׊VcǕ{gwR>2TzxS~Ҥ(ck-@"_"VxLty"=ӳ81053dhԨ8:OVcY&M."5:LKb}֙ Ͻ~!u 6L$[rDC sap`m-V1Z&dH0`ؠpvAbzHN%{=U6mK0-FqfƇ,|'{Vu/rk ȷSͩwӟAZ_c WْU-RJ \ka߁ }t)'>K#}#D?|6: CqQM&|[3酵ܵׯ7ىVw%a6nnWzé| ~fBzm7^1خMyt2?׆Lq9hi2XRܑ8{5:C .NZv}AQj'PVYPX-DOj]Y]V $#90z/C֪m}fkRKIzdZI,Sa0Zl: am)t P޺x%\ݴf(`.tץyj5y\}]g iV[ԩ8BVp,V)1~'J`Y#@jGނ#hb9) dn63{B6"|a-:\yp(`r&4t,C[dQ/I+ksFsXڟ޿wwyzH'2}“l;#2>/;۷<Լjſ7gee©|.w#\X,fq^Q*i2Gi`GpS;2-Xg=+bs8TYD+ h&AqQzZ#pl&4+ .2K!&6FUPY#ۀ[KAnm xebMåΟE^}QӐbb 1EQM]z8"RL7:XpF@Ph0nJ[ηeCTBilR5Cs/4xbBށEoǸeS}t\B7s\_ װ8OW0E{߮\j V›ݲWЇ/{({׮] ^vMG\])CYqSbd ,,,Ri%LJΧ=mXi 5VWXӤ\Æ'lhgvd=lLlB (vqt. T}=]?Q8tX ?i0lJGco] Tu^-Pw>#RT~zF l<\w7}MK8P48.\L:>zlx췿P#8⎹s|ӄjh_XDiuoΩsƟFTE{qqR1 gXrU"kܢ%ʳ=IPo(5:$Ke]h<&E<.Į ȑaP==t Dʞ8V̳,%Rne97020Z<%!C mJQ!jV%2dW8r3P2{ˁWo|cs|86??|׾wb|ú#LOqF)T`r[ʾz6eB`RnxsKIoc`kS㥝: XYi Lq̿:|;?/K7FO!pGQTRQ* K6 trdoü2< lSo"{P7x)3[ 6*:r}s+1r<=T[aHa,.Pz[A 3cii3 | 1ey-4o2ڈY ΡfB6ׯMrwqzj`SxX/2ܾ,66!9M_0`Rxg=㇙8rDw]pcӍ^DΟ[6M;N{,9Ö1}`Cc^X U;?l K̉$bI)jZki{H} /Di CA9t. ZpY{,Rmn>0RC E^^kͺLюΡkM1=&` B&5Vq&#,DC,^V_N^z[2+ZH!JuV]T輞$_'쇯>3gփPvt37bagGLLɯ?.g{cf&dQR( HQF ) Y[Al= ac_ dEl|ppl7p d)JD$#I 1)tSʼn)pRogHL1St\#/=L2.0g*/H[3B֘(Pq;wu8U4Rƈxo3*t(QS2U }QFFſzyDԳ6;: x|o{fGwv'gm*AE,N@~ ?Xoaen&]x= >DDz ܸz1,( TWq"61Y\kvCsu{#t)j޻`IGd7; (7LjƉF )6ɽ^R 5?GGqhH@ 3LޜvEA. )Nū]$Bfs~<u'cKr1szqo4kT;VrY)^$[p{ǺZ>kKi:~m <"Jocyh|4辡&$fdJ$ì3]׺$=S %Zbc8xhC,Q"yL̘%_0%alQ1똀F6Yu 7P2=A7]{ۧJ txDKeb"b?E[FܹGӗ6~]<:qS:2o\H#VoR'H\#HawtEǏl>1~5\y76G}Zhm"FǕ[ `Ϭ:s2|\LsSoGoR=hf<7}m@@Щ4p"ƸE}ܢs7Hz#dwA?v\7N(}V1T`/A!XdD+1yq~ΑF0g/篅^ νQVe|6C@͝QW槣#}|@8pDF #=TIbƧg_ Ig'}fרJxS:"sYEUVdѧ/D@IDATcKHjHh|]curHT[6Qdy#hh?y#atqu0<46I͸cmg8CtNaY^{paT 5Pw=or ];* :Wkchshnc1NCG5Gc>169`)8D^VchXk6%TCſ}>w3NxV(F}c-t%H]]^ݢp0>N$tt[w/# 7(F- g,V {_,^`W2Ioyk7` @<\F>Qi/swt a͙bzEٶ,Ы~3yvΡ2^nunb'h/m2]6³ J$[Wb1eg!`'ont36{S~ࡇxxczw?a_}맻J0z~<'~ Ā;޺4^9w!B'.L7c==`@PٕeDiksƩwQtYv{9x'&W1-"ak/`ABR@ҵol My">k( N4HzbtPpo* BM\ x;{褨ư⾂[FPQ8| UrS )~c6C+HU, s hs,xlǎT =f4{pRf3 sS TH)"ݫmdJŹS 0\ ts25CB>Qr/*w1~D* Fù7/gb( ǗRAjʌJ^ha^wQVW+-3wdH|3/-Phg@ۉtXz=&n,!ƥ6.P )ϒk +U]'VPIHB1i) -jYzNJQ_ Wތ(pޙp z,#W\lT,_ru+ks(CL}  5&9썹:EI42_#-DY7Drb,(b_UrɘmT50Bڭo9F]lsjNALigHܤ/0qdf]߶(q}}H۔*j<y·GŦ8Yւ91oUZبob-ɍՅ&]:(Ѹ^.=/9:zGa+s)gCڝXZߙ[9Q>>}F6Iҕ92;7]̘Y jo<|x<qiX% vB2g6-? !7Z"y>OZ >{ C{z'O8|ȿyG?8~os3] G[pN3wB_\S|jp~nlZ1?Ll׶ʹlӟ;TQN!T]gj"LS4$Sy86o^]'TUOa!N(6^@ikKx/-vdzrU`yC4 PykEGS^EϔŽ]u? +l[܅ɨ Jo5+_36PbM,2OAhanoyS" tp1;b $z.죝Àso ٵja^:puVm2m,"c({? Va-`dH a&Ў(k3#vAL~s8"y)Ï?:*$<im@Ҩ2)X)AD|4 ɐc=aƑc/|!\d\ylOfɌuPG& D[FkM^jF>m=ׇkpH5ݶLI:WdΏ=ӠρE1L8g ?ڬةd !s+}NHc آCmJ.` U† a!axx(w=.^T 1>+9rfSCք)qXیq07(gAyƺ' VXK4 ?30w}l0Ky&;۟hGSgWGA{pw79bD Ç<+)sjwhx/_/UZ!Kٶy" ˶ wxpɧKx%DqB:#R\EO7"-$!rQ!ii7=9g߀eWUR#:@ApKI\N QjhhD߶ʷ 8eW9FmHC gQj h [:1JӷBl]Gch ʠf%3rn:G lFA>B&JIL*hr>S K3QP*P;$7l#2HA Bnw0ŜmSymuy~ ]?m!Ia5QrU#8 k5Y{1P4J4q+[S_gI ؂)/µXP%Մ8^,#?{IJ16 !Ij4(ZF )0ҼgJ(={5>]i.(:;yhV  zu,pd,/sLa\0ma5Ѹ.*c`:|(Q0!8\v=D DCFϤ9>ۮ .#ޏ5M$d! 簝fgVDZLtyρCԘndjk ER-hw=`] 0 T>]74GH8I{`X)֭Ŏ 5ooy\f/q aϿY,f{n9~C?oaG4\z;~׾ٞ'E (D-124w~/~*tw"34n;q*D/~#vX F2"Y\jjXSu@MjkRe<Syb[~ŗ׾QA g:v |c5n 썡|?G?ʔ݁+vhn.gF'#g+eҺNx)S<)}6>g_g;CiUUUʿ-8Au#Φ]iKa{.ucV+2b_O4if_N($ZŘ`qUkx ΍:FfX{6602Sk8gdC޷UyȾV`&֜zg(}-NL _k"fC_p rcv\s|.U QBSY͜X7Demk`! dn~ ^^n2w=k  'qd|\ؽq V -^]_]J2Wp&=7{}~衅_ydV'=㹿ŵ;D">8NF>Q2 SIo/^'[O[6rDoMJJw^!KQ(JRV4|!̕Bua2vѐ>A -@!Q\xB+RAWjKgw@'Em+aj }C"[G9XMXSo$Yadem5ufF)Ӄ `FNtAtz:FAkC!ap8%Hlh,XT|RUv(ȷ%.Hɹ^,ʈ4{ĩPf%Jߊl8^D́5נfd " Z Ѐe*rNr$1(A5DN O6ť \-<$p׽Y Pm}d"ad?5 /ʯIq@kUfsܔ*(, ϛI(mQu^ñf6TqЋvPn2.h[(4D}n(h*桱D1R5bH[D5]Ã~icq>1TKNk r̭ -AЩHӷu 7&R߂P&~p…oDp`. O5Ǐ$d(a@Xd0) FK4ZlK_ZasbcM{'3' Z=jԷh3,"#A=ьӉV1vfAmrÿОskhu% NoG510l'Y^tb>3뾊!YRW-[5>NPz\jݽosx1D U۫Pߓ_<5>5j,Sdry¥33>Bh#=܏>8B5wḣσQgYsc37`R'&$*"Hlׄd87 Z1"hC]fn!?Fo}rvwCǏ"Ikk&<|=3a4FQ4$/{mqb2CQ΍J[_r-2FD|B9-د|bs!KļimL/M uH,eGHC` О2=a}Zs5c6%#AڑORMÊ92N@A^u'Gx(7uQ؞kQI4Bg#8Х0@tnH`~c6| @.O\ t)u2r>U-P٨CR?*PZD8p>$Eu y)CCE'F{li[sd-0_?G,Z :YjS/]2- ڂ  fBc&Ho) rVV xk ̰FV=ծ2S@:Ltnr_~RXv̐nKGfq<}-ikM w;7דk@]L/ߗ ps-U5L17&D6(*eۍj|9Ͻc fq]k9LO~r^߂is<\i[`d..57$5Ǐ=sߟ@~K<G /43ɍtO}ebdB{gV|(rXMl,i3<` 8?v!⥳υ׫ ufzRc)HQR 9hC^??@XNT8x}PDU>KIћT; 8-r1~Gm!?Ù<~ !M5rޚ9hKp ^JWjv-DEX X\1̭Ǣxm ~SAObulc&؜\+gbƔG|= &C^)o|̱ojyQM#JYsXއ~j@;6u:i!mՍ+L&Qk:8|țz3HϳOid(80wg't^8RWtJIGýw{{Xe_ ޢ' 2L"k[,ӱ#SIFr@uyvS ȔjVfSO<^ ®ݻq(Me·(B62X+}3S7./_=تW{njݒ,,V3Mٍe]@,6!0U1_@Ntv{21sFg8bg{t_1~l;0Їq2$=FTɎp\u]:6>? :\M2okt,BfL/Y}1R̵{/2"ս/f1m5bSp,Ϭ51.GKsn0k[:in{-Dd ( \5e:w,>%@ƅ#PH{vbL}5Azx<˳7zuJ0M2B<04'M݈ ";K]1@ϯq#6{B8Gg) Pɐ3@sVY\M M->3*k);pjؘnڃ;H݊8 p_)RydW浥 0eD ^g,7hc <9#Ch,5#Iř\]حE&"m W0!"."e-]`]ΠR|>n 1Њe0xZV<0ܓhN{ 3.^e|(w}/H3}7 {gyW=gz':{Jڳ>fU(3g~Dh>^,T&߭?c_<<,am +#8H Bqľ5 e!ˆom1 jEH5HDϣ.\l g|/LbyZx7K箆u7l]d"c@pPYMj'SLjӱ:=cA9yӐ1kpM 8[d @@[XQňB]al1>#,X(`a]ChcTrK0Qz:CS&P$b[81„#o~G1֩~(e>{ODWqF]$OnȞFsj= F~̶:2cQ SezjsӘ`pLwhs|\c筓#Zw3%"G LȮ|؍tS7F"ucNovsDz0-o9] 3s+k6 WYoE֗xF1MYd8au-hW0PF1|;PtXa}P<YIW͓͹x8I KQ@Fg`HEn0 kfc~4s>oxơie^y,tũBIa a=O s1OymDww;;CO' ur8قC;Rjx*C$`Q&xM5j apmϻ{q 3< m U3K N$T[R!ja]{ܢQ6T<ˤX1$)j qcj&u><3ڭ^ϔL>"2He@XY ״PAzQ8#4@ abӵ]8p_Y3uuii T8;u9Qh#鹴ad<?O}|ߎ j31s9 ςIFz=[v| LDl 32iVV>ȞVD)^q͕.:ײv!#/1Ѷ 5Ҡ $+V}؉c_'KKsپ#F@kgch~/O|GG(dw 5 ƹx, J!AWhmab' 'c{RG!L83S!1m"n]f_ 㰧Kj>("]ޅ!nv[By&8M}52\4AeWWCƼT9 깋ǿJ+>4HnRP((= ~X-jujiܤ&R۝{P?Oj-uT2GeX(4=݌ܴUQs TLFcGPi!nkTE[2Jbs:Q6 u<' k*])#' X.^y&MaRع hsO=H)fQTiUQb%:`fhYtqVV9e EPs4kQ5""m#SgaȞңQȱ@jݜ\&3JQD"K rDO9EtJy1*k~f6^Oy 6QenDq&J7goGg18=̘-ދXS5nbV$h0(2n\7F¾=ҁ|u<^I08 «>7i?hryүXau cY893,țKgYkԑ(]hYcm7emiLvIu*\/}'?3a[GSO?^]^dt^ 'Yo90JLAf[guNoԞZ0XYsnI  o`,s5$q]{KAHƦ[z?p8~ 1dr dX;'c7ƵEڿnFZP26]zvt ^P[&>*\3fjg9t=̃8;)R+P拔=ډ#&QW;[as]~78+{{X4փs9"\sO V 1%c>gu{Vze}S_MZ 4Y/!H{ofywu{WWUnɒ- y-x`BB 3f 扝g &1!0-13ےZtխ޻kvޫ&g}ia#,{TщkO F!~goU7`%Q@y6*C@dlVssCVKY@_cC]lz m<#[5U̾fͼw=cߣ{ qc,kq-Kq݇b`? ``'-t|wY.fzzz<2>3S\w;YO?SW/_IBƱ#\BSXu38l 2w)5w_x[Q?Hp /^L}˟m=}C[;a̤+;jKQچ44 hₕ`K,@{[6 4 :lc"^ 3F ֠g̀ٞ-f) 4Y:g/C֭еB9?sLlE p t Љpj%)Τ u10ŀ ]W:Q)'Xadil༌4l*跿+A1I;;:ڄNYΜ6 ^DV9la {"R\){Ɯ\9~zEMxYb]};liGL]+s%? $pJ'a_8'؀AXdgo,SWs:feV r621D_K) ;Qߨ@6+>9δ 0QȤSn`=Vc?la'묹#+{"uS$dBhL,쪣t1t} -6U-]@,Cugd53Qm)C2*+/箩sP.,1QD3ښ< @f^2#-u=d-n@IDAT]T#h*e1Sy.h=\~|h=D8|}e^l῕{eux2q=c(q#i~ "c33<\7)Wd[~@{gȐWH;EWWG行p(ti@r IWʐ_V(6s"+9?V=r'Ϫ?M'?PVU'*vŹŴ"* Y;{T*dxU߁y^Y"ql$`T0q2i4qF0xQ0gc6|U-aӌLiwu,!ŗu>beӲ2JHZ+Cmzq>m4> :910XA38t >d25:<'SO.^G@^Gge:ngYs:^E c&u?SϮ6s^ɮeAm_YMӀ+M3%xY"@ۢJI5tK*"Zۛ$sc455@4=v,oH`I3%d:46t6`dzoqHdXW ^s{g_)2ജF1D&0pV&FцVŵ^afa_+<P*fqzVa ɰ9~*lD} .qA6S9q%6܆˔IJZG/,z\Fp] ,duedChmM1ek6z]ߗ.RzՀS.k+ceX!@v=]|!'[xʗؠ8@p# ]UzRd*xdvSSا(͔;uF?B3i: ؔݝ,M)6yl_:6࿋> }lj9>mx +55_wԛW_+V wMt7 Ǿ׿gfq=4ڗoEj+" #ʼnE'Y?Μy?c[hY4O):Ĵv~A0@%1É!udRL~+{BO[cxZzl0 pf$TַTSr6)W ' .Py&HfMa5?O[3|[A$k  "0U:W`:c#:(5<6 Ñq`P:TNT\-lj5*ؠ3q<|P뀋bydD5N:d@i𯂗B)<] 6xpw HKdaP"@ױu1% [@L-2;AEEVhSB"v֚9XX-@g%:s 6NoG>zbh b~lh.4Q TU8/-/]^;ͬ!~Оi4>:ێX;Pav mS@pCeA0NbdPkjr #d~k#ɮ 'Q4\CgP KkkKmŵ~ &|YYz 2j;3Lȓnm@(!թqVW^87@ #8EKi |?}աo )mp9 toY1[]8/y 6Fz~_q^:{ @c&9q!۟&2m}Btey,D :O*i<7ș۬kmƀ"~ꋎM#V~%Ɍ1xZ끃"+a,XSSWqV0P$}NxY|8{RS0ZX3I]ZB&{#G=}z|P{cŗ>5/ />lX mYOɢ||r-e9wt*q4ԝ-ȁ34WGf%defgGXvOg{X᡺@q1nl5r(-[aF_Tz`:Cצ'8WVM,Nlٗ?{U1|(Ad ͔ W)l|@]]tZۦx̘S A? DS? wD+!0Q*}LFq- ;yAHK([]w7L3뜳x^jiڇ=yPĶȯcwc^lpVUJz{@UCc5xUk;N&2esVuAweVnKёN`*e3}Mf}vueBUnUI.Ӱ@KK7V P''聰gs3\_wd  ʹ:QTl Aj-̟@xmb0fZb`\t +_5 N3-pd֑#[-;6{e ~moVzr|,*c5@GdGB3gST< , {p Ɔv'3xdps/Nq:Rl F Z:vyd{6}Օb6 g4<>ah>R(tVvs?u2Ҭe2E s`|yV=?EP8JZv%ʃoHŗg$HoK汾TZnl@T0>4nYm0cqGБ0=`ٍ[_QXΕFϥ!(3LYb)MW)+ΔuX/b` 2ly>et<I2Uoʰ6&Ɨ,!u]Y+Z?v tM/N\;@)Q!G1ic+(K):hv$~Q+2?7M{f8F"e嵡|:FH3li5nѵo6^+` {Jv^Ա .h_wq JlxU쉔]íy~n0bD(-I!h3# "Q{}CRʼn02NN=hc$(IZNBKQNkϱXp~F`~F◟ GZd5G ݼl4T:,SUJи39"u\Z 4bm025b mgQ@4(5vt jtܥ`H< vJ-`$* a1e m-b}s#pɤftdlf8},?#8xrS!=ay3ʪNH+]ͨ1:pRT54ZaDjvg zu1ZEN[3rrϾΥe3 8͎;YL/{'e-RC9#9Ȳ-eq9']չ =2=fV lGWCس;NXgc4%?dj IoF6Vj}Tk}eMOi8%;)G @/X1po;/tmcSdYX580f)eO-Ɉ+J35 6}0:Z;08p3 cZ .5R! G /><]tEdCrwX(kqKJzAHF/Cw>_OG8: {ӿ_?{6ײtޱѮc3-E0M3ڕe˚) mkbg`d'/دĦMI _Fc9 Va6%-A~>G)mʮvӳ#o]lL&;i?$hvk,mhyr,` 8=ʎLJk{}`:R{Q7ZX"^zEM6`a gFB/hEy2Ӯ\~&C,6 ?lYϚ>oq8ҼK2?wQ򎷾f+`Ljw8= c1LS6_U;x߂hxpaZщ=BrVK`rLs3| r{q\ZXW^.!$xƐwΗ~w kR rBA{}*!>@^.,t4",:\ռSOq+ئ%1JAԽg{0hk))kL(,Cy4빭!X CY .a@seȵ3\ 6J a&l#7Wϫ^+*%UK!%[cPZLќ ">vh1&JknGì6lP.@C bpD p4L?sgDOg!U]1o`.Lx尧;Rlm,%u>(ftu,t6)d[K7 rf}^N=Lt7u@klEΗϓC@&@ 9_:&CP ؋n֭}OegyvLTW7~CnöZilvpa 'Bsa+heTag y(k.23 @C'y W/# cJ:HQ$vp7oGGхq"ayRV%z?tb&zOA'M_[Zx>wmBG{?G~ak>߻4^e_<u%R_p1 Q~3JĠ wS4Dzf d^j{xpx٧WBɦ^tL }fZ雷ݛpF9[?[!* v LF6(47#f9ed[Z2=5^>ć#q]Ӝ5?Y̖;|k7(8.ȗ5BQ^_5܄í'wcl OV&F]ǶڳŠkD7ՐY3p|(2KfU:u2qÀv_>:;ڴޟ~Ko<2uF%|\!['ghS .g_Pf+7P^ 8 lA>Kqʆq%;\ Ʋˬ>6idU` s9b6 }7,X30@~O#b{ٔ&twQhPt0qI6SxZCSZ^tjI|"PU3u:"A[A;xCྺXC[/1G֝-gW{QW} א]κ"^nJp6Y/vkMʤ >G ɓYW.`P?cVPx&W{oeao?JC-="j 2Q"СC NVN]]V'fK9{9|<%u ܚ:%X +q.y>KP o!ed'k} Lc iUUtG M;Hآ–zT?nφN=r" 9ʗGls;]΀{?Bo Lg΍_x۞{큋ԩ?}߳ʞ@%|ͰEfo{(k˷~0LߛmAQC YU%wvv(+ݒ¹_~Ψ@2 ;iZ4Cq,ph?5q|4dSpc6 9e( &ڎɛi|A/`7;ID6luv2 SdBJQҬ]uMd8L\eٹj-G9ˀOy.==R,fT 9p -СȚ%>@Gi:\)dWx`7cLDG5nbldTUX^>f rAuJkε2`cHG7etn_*חdb__󎃏33ɚ=`)7ڲ9^JlFKkzl JݶxFs. p٪5"ͪ賃^1 S364%2&TOy8@dhCLo(x/GHkS\Cu*RLtɗU!}Ko>ˏ}O^8WUcϞ-G_8!\nmH]^Ώh6_gtls _D͸ '!IOThda~(GNnj=4`# Pl*uyl4ACYNWAƧQ@0HZ NJ{ ,%1"i%(: +hRl$o+j̔A od XW@#<65D)/ h Kc͵DK1vZ)[Yz," (=hoIzI.hPl2#+ h::[e &rtlֹ$4M5XY$̽*nQU>QpZ:qr=L"< 2h5KWN f 6` o\^r =l֮܏b֋7 CZJ WQlkcQ{6nܥS-}Oz{x6|c}*}P1up\=gcdXCG59*s+EYRVA&}j,cgᙬ񗕔xڙ@)լlZO~-8$vUq`UyCx.~l;+Tb\o~W.8_q8I֤*W*Gƭf *Wg9m rPoY)GA7D^\243+ԗiֶo Gvȭaj[pfu6 J =W124t^!27֐bR@/ٸQ-\ Q} L]A"مKщ[hm%HsuS't,ړR%[HAl[[5@ Ek%7CC%ݠ1;u3}:@.W8w乾kWyk8-˟W=s=iMdpbm;C(h7t2v4pi  Crg>9aԗl=/u“+׮^>cg~A{F^8ZX!3=8fw`L,6,KATnIoxi׉$#P'uGmvj{+[N$)Zao<Yi2,d"Rc 8Y5G†JsבmrHguȦF4\=OY硡!XP3I0 #t[^=:ZVA$Wʞ #YBǷB YY%6͎b&<X+W7 |m^wiij5 M]5ww.:g_FwO^z)G"Zʼ#wIlV5DD V&f9 b0u/` @* 7CswS8r~pk&}nGi@\zuvƵtðaIt vYY31C@ˤ 흁0l 3ї =arpa83f­.?~ukۂ%|xl+zNUH|b)`TJYjftTBoޔu};AOq(%c0FBV{aR&د PӁ}lPR9#1w4@o/E(H߇QS o06_0/d c7W&16ٳRM,p^vvu-Y#@]|G+o\gB .A}=L{n"mlmj,=C˸[jsc"gG9=)Į `ewHД՜D' iwk^O}i٪,q2RA(|p U:֥lx6A-@("׀&v́eL;eACD\(P>wiG8cX&G@L&|@Ȼ_,+!S\,LŹ>kѲ~Wb"ebm,E`%{ a hbcI֕}x-70Ԙ XCc ]jFShU<;1^h~`oqk8;Yw2eȰ"18Mg$RB#о=)1:xwPC*KOJ `J{]R_\n p-b$ݡK=Oy] -?qLZc-}n )_*0pnׄ|10r턾~kxFc 9b/`WUC_y|G}voѣRĬSF,&p7舺'^M > mM+\y>Ur(DuILre\S'23yFZ=7e׈i2^o$kmJF@e::w>(p{,8ّ?0 K ~sNGGiu׽BɆأ&܌r|xǷ~kXĝ#3g 4ҭ!H^Ȋ3?Zt*emhWU4,:v^Y$4o:2R_gTL$)<2bYbBЌ *>2n0Nz-̅ _aMfqR]S_E;Vr;[@ qhadrwWWbYBw=EIVM ?A qP:MooSAP"{%g`0F ijl\E 8 R(r4u|h 6 U_ǟ~ 9leRZMG` 41,P9ְL"j5cMצ)K"1C%D /1*EPCSL\0RWgPf"hڈ:Bt)F@L]uNet@pvLT!.9t 86b2#`}Bu^^%;2˺8PA"i%3CMp)X}0 ;=H %+mh;$%3@5d|f5uiWp:[H> ]k#H+&[ sȣq@SGgנCɓ* ;YvպM2dYBUgZ*\ +1M 8<{416 j8:Zg1Nʝ|Fa6sNpyz͇9Żרg': `_,5u:+fq,t!΍?p~)>FT0R/1mY250|dE&j)-ug+/M{ F[PdhjwwOhY>gt/͇024NN¹=l@IDAT3g)A"f6p 2ij]%H7¦A3T:3u,0>υÇo,F)bG,6P[$%#[ǹNipwe~%L2eeمXmk=w.LN׮V:qPsIJ֑E.68WU'JʸPSfUs!xChzS_g{󻧸@|}O|=}ÑǩGn WYFf & p_%b'k'eP cKeapvџQvxw/u};xELߢ&(b-V 5ߔ*yM<.WMENX[,,^u?Oใ;>s> 3ؚf~n*@EXD+Lƛe -mv&/A=hfz !r0U2n"N>֖fзb,Nʌ3m>rfV􋼎e&A!.=<;)jeWھP Ddda&Y`u0Kj9`--NDO wCײ48\,ӥ V:&~ne$8 uO0ʲg$JaZ vѯZ؝􎒵c :[\=TAe% M*0G.޻u.Biq~gWo0IT֭ )N4vrqGŹ-b)` :-SIWb~S=~e"9,3Ծ:C9Uu5-/˿oS_ȇ~k?oۛxWײ\{wϞMd~HC֐i " MC.mfSR(+0Pi(ŰW&[asġKڙfIf=\HXu@/(3"=461[| vMa\3$zc!☂ fkqr`A ω׃`@ɜz-|ON?w5@lS2xbY5҆ǟ /2̌yz$xl3pc+1ܚM28  ;9)"ìFMGR @<8XFMU r 7Ϻ577R^UX~/ lCϏ]{YTt 8e(UdG'ѐL_>tYssg,oYZF8d,QNNVԭU}Î~yXhum>G"v F Ɍ ~e>X:&=˷ #2]r~ߩBRzjήyDcn fmwDW[>{}Y.3[o\'5Ŀȳ.iRѱGsTF#*l/Fwxqu.|K׽%@$J rdQٜ6;~);GwKC`x5gSN9;TjA3E"q0xχhpϊ"MԬѲƽ Ηt݀2=Ja&js.Lgmj1fمRg\I`CkҲRJзetkͿ"pT0Yv }#z;A?cJ;3卹R\()jV cE HqlaҶD9gPh2JW3gkQہ Icvy@ m͔Lr<288o؆FP0cI~kiN1h5X^!M-(=^v7Ep3F=ї xƨV1" ܡ}_ IFlwʬ@?:lq6WǚW }taz oAQA)4ؙ صJTԇLxi{5P&8S4k*<7G(KtP=`9lX, 6wE09W<3I @smy"i{=aZ#;Q5TMDz@/෽-|?񟿌(Z$Ú/7'snȤ 6Qn436@\&pul27m- 'LJ' @h& ́]P08udQ_⟄{x+ŒY޾pux.&H7\kDkq[Cgk! Mn.;r 43zg46F閠fp4(Tmz>d1Rw+)cQx2v(vffbQ 4jvβ~86=3K!.KblazlLtl #Zc:_ ttcG`Iu?`Og9|vNߋ`?͢Eӵ Nt"31_T pzp,5(Wce@EEcDQZ lXѐ3p~ߌ2JRp x :Z]GO!#d{q-x i?2ɕpS'`o"Rճ7ϨFq}Bm>20y))[Ծ>/3\$5S !p4hfݍ8'NGd䑩4ϖ4kniΤ7iS<`=N:2 Mwʎmtslޒg1kt TYh.&cnPR{~eFp20ڣA|p?Cv%6GRr=AM|}wA;" bA4b!͘5%Q n6r.캲DaZk?W&jŴ~fHaJ2Ԣ4(_^Uϩ |%X6 ]x(̾IQSX=)=dmXh }~ArXN4Ɋ$&&gB]_2L(-"Q,WL [ɀBu Vl[Ƨ=|WKq.1R?γ]Ylf+kFuyR!~ϵQZp?+#3} ۧ)a-26@ NhEd ]ulZ⪜Lp-EymD_Aho,Q%τ-/.w \ÅDD t#LK !fhDS"9 K=]4vl\|eARrfhb]qp;#uV9h5=?' Ĝq0~'4&#[(.(*_gF2Yg*ءi_灨݂QBY`7 dՁpuj1.R kb n 룑Qnޗu}*$rd1k8j I8vQ:&*|1_ӬCO`0eVVzi>ivQ:7Rqmߏ +^9ftA2ހKP iݺ5t="Te3h|N'-|r`}>,4cinikb,nv/Qx3+K(1HUEP OTeicsa /n&@u8Q@ "iC/\808:54SES7a% Tl8/ZgNGl!]x<#%+ztH u!gɻs.'| ~Na>E;Y+ ;Bg$:ʼFGh;^yDA`8tǰPuGcȦuнgp0G+O |` $";O:ڢXN9%ϏTgQJ粄Wgta7ٽVOfkhzU=22Pޚ뚨L%d0dH{ۻɅ=>8'wwݧpiʆS ϊsqVpb62͞snt_a&t-*'0Õ.찁[#:DqҸyiEG+3f0OܳřytAXK+0Cˆb28u}O[{٭!d}]u֩Ʋ3~d,] ёM祖FS}8|??9uرS+FXGM=63=K07"6rFR=Dm۴3w(mi c5Qԏ_|de/\ ʇw'P0_E(4F(g 2#0ԀDj{V7n$%T.] 5N-bB1`ɽhplp%d?j'd>Kn0,u6 mdO02߈l΄N}[y6 Yu8aP3ڈvuL ΙRWЯד]g`욧` _"ȅw?"ַXY^#5_<}>:q?m00BgUV,4al ڻ낞]{$p`Dܝ'S67^ t/MH%P6 ҔJ@VʓvE^ۦ B,s<r<4\ߨ͝-BVl%{4Qvi%dY.}\HHaVnȫw 8Y9 ԄG8#:]ko줯pÉP(I>A{b"'f@ j5ׇݭ=K\O y {>BlD Y0}=Ť@ѣ=$t)׫-+Nw˥ !gcGwl?V1<@zV ʱ&$(V5^o*i652ޯ_ H4 c+aF?*be=UJ ճciRP|buŒn}a\$@_F Ь3ACka{r}cP} 38VϩDHb‘eMlMN|tcKzG{衇f_.ī; |ĻZ{x3kĦ};/7@Ӹ :,HI͘K86iii"{VN+fav DsDQ6)H2 ʬݩ1*y/Fa[>*}8l6+P,-̆j[ٙi6sxQP6eYZ_o;X{nW/Xlg'aL[N$NbJ8.JI4h&t&OB'%R"YbrX.v踸ۛ缄f2/Iw/o<|SQH\"(+eq <:Vr42>醴݅~G@4 Ld`L x.ܼ qH)]̝ ?Fzv dy8fpʸgxUTO ]4e<)R0^&P*^ h#] ̑Jֽ1r_(Q~N` z8;LvQ"ͩDdmZ՘{}/q]crTXQ`/d.c8k|u&:BhG F3wTpi!\4"Ζ(7Ӱ.yapyTVNׯ  WWd LpvN/4[wyִf3er\zΣdA/AzrDhmT 5@n3Z'Dp(Yo[q^Yxu!Xӭ+@#?:>ɾYxdlJƦrh8 fkE s%=+j#\hꞁm#˂|^Y|doY._pՊe<.K5 49؊]%,nfszL 0h\jIYƕ P_sYʿvܿkdG^*GRh+G= (#| ,-DV51 Z{ooO;q](p%Q9ߣF 71Ν= 'cMmNkf$Z.Cr&@Gt3d{u+/ʓ2l``OmL8,ϳq-H^ < {& 4#V֑:ر.2 ¶S!G|1kl@o\[^,A\IT{m#wR,"g0M@ׯr$CO8F{f6y @VUR6 h]oxx٧v^ 73NW h䤀b.$d."E}S&cι28Zu.v"|P]3*AG.]w?2-cWJ鬌D ("|@`yKv0G\.+^a@y_ F2r̾l\#266(uqSr+tӧ nY29VB(v ^s 8KySuȕ>MyEaPDu<'KbW[Y{`a;tPr{,TmQrPIFE.?<:" <igMR;b :#dR?= 'ÉF߁tPP Nr@Yie{*i#9bx*5%J##4Eb} n/qXEX?j[ xq (g¶+6GZO>anHvEŲ!eUAI#e&&`L-pU*16صr\Sb0k^y저6@ '%!;6$#*T b8 yO)dL8@mu˩+/T/QU .1}~??LChZz :RU+8"s\q6|2yRΈJ`n%A1/sԳCnG fkjc0Fi1\9 fx:|f}7qd ?klJtގMgpr$3'" |Z{䨤0-' $[\I'/MPvZ =f:+~"UmCً>W}%sof҈nt5dPFh4~~ n0k+0  d=thxSiht@YڵUKD_7̤DZ8zR@ :2M*v K6Z_yi^vs{[>a`<\+iԠڑSUX0Tu5InLkS߿$g_nCᗪok7|8njLib.Q̳mFSz&ͺDۅYeD6)D"'>:2ݻX<)+yʮ8{tE4:pEܥٷfmGR:RgdkjҥaN̸`tHy:2vsf,osmk̜KQ0CqNVuDq4ߧTdg[~3G#:9JQ`NRTٳ=$,O=g_lz /O]<G0 KQfvgӱ(ru@A}5աb & 3+fwH]]]׎$`M%WʕK6M}4 掶9dԖq ФL/M&O3]ˑ@Vct샢 p;m:ل9粊ps6m}diEƅzF~)WoʜvQ}Yu4j'*籯RDkMO4V4eM.{?J"R !`x&׃щΫA>ʙ~PB}+ggP_%;(DYNWKKZ5i?}Б6N= ^&~UI0r%4u>c{" T47DߘK eGxv\k)M@`?ln0mb?o>:H)lSm ]7蓘8')("c1y}&L|X k~S̀5q-EF=SOԉN-l3:s׳D^y-C{ Ae}#2 sIXJrﺄy2YmN`!Wl[q ~q]aA6XwoOP>iSly=(t"@\钎qh[dF Ba[$X#C-<JLcVnu/Cw"[xVFjkNIg.GyᐡPEr :Y.pv`ra{ikG^2d q`"p(%3@<hP]HR.5%Q c~@t3 OFAݪAP9{"]&xqml[sF,,ƫbOedûNKϽtiGS!gڵ) '  !9)58e,PH+#6O`N~HiFNq {1pS 4G(&&&$nX{i\{u*'TG H8j'Yds-m@5h`bq:(o(d::x444C6VW{C2+dB]'kg((gy4i(u LYXMojzpא q \6+qET iZWN_Bf@rϞid1po#c*B#gsV9u@V!%5o`R3p0*CŌ!gkaqZK5[άp:O)3.QJY!9Etfr"ƮB)qK;b&{l4R^@!'0X_#Cl:o)GA )v]M! 'e9u $fsQ6s69{ mֆ]ύZ5A!zƦ,A;A3N9Dv pDʹ}[[e^x<3VQy47n}p8k{A=4@dk j( R:#Y W ẇ`ςf?gЩ+5~6?&{FǷsYђ.:םN _`FC0(@6f~z}vd˱7܋j->VW],t{i)&X9.:(As8kdSxأdF}R- l8MېuӱUȾB`Wnjhkr3ȧ['Tz}9*tXYL Zx8r_[VI`29`c*ͥ3ehkNWURfX[.0ণ ʹ0ϹD'r%Yc8mϹ˗N1&xNMN-KH:>5y*Z\E1Yn9eyC' $ mG)V.[.; } Lىs,jbOyĞkh<~^DB26<9ա=YPބji7ʵMojME~{?7=G_|r X&0gy ֌_5BEIc";uA0v=+]AedqEO-iR\{FmlYk"$P?`d;DyCхdM8./7a/ 7v):4d:Dݢ< ּ3p>{NЮ7Y\@Fښ})y4;0|FsJ䞸X`ܽ\t `uŴF Jٞ );r Y~Mav"u 1<b&ֹpa1q5"|z!&kϋ*ی.UBO&({oEqڈ_ȪK{g}=mWd6~_WZ^WQ\䒹ʐIaT0b @π ȢAT.BNUq^{IϏk `ݻ#:O?ph\s='Z;:ҙs')h%T< 54:8 :ו=ONstC]NfkXGu[܆g*G5fHz/p0-R8>>}L\76cÑte.<Ηj=#a8ȆNqhDWk&uGπG-ۥ *lRʙUhkk ]0J rm8#eq]#kɆl`nf*`<8C=˜ dM9:NKQ?oG4ZNemMi dn21ݫ:$^n 615kJ)w_bYEU_ dza:=|uZ8 A]Eg>Eý b/YBhчe tXKiS$6,NdK z8>'f 1ȟ1])ACu{G˞]V6/;,z5DXs|l? tLOkG$s&zG8c<,$% >[I6NX:git .ׅeW"y ]T/B)z}u xW7\h?aK Qdlyqo~brDh\BP?ksUiK&MUsyO=+umVwfuKm]1ŀ6\I$A (AKWV1ϕl.e*DcPV۰l2c ˢli636+iwʱ7ޛgשe596ؔ_Ɠ7hB@ZP c$~S8+͑E P(f釘L#2A>L÷?HLFԴZRYxV=;±bPKO?I@E ȓ+͖u`_ {iz${8?Z>y}dɜc,vn|6&]9q?-A4{] 0Zڿ%cYd7k+ߝP']&O# Q[֗P^6Fs0. `I ?KdCbI _Tʰz &[Ș\! qF:pM_ÏKrMNa,e}wy bF@sǽ7QUGDYЀL!L+kڠp>!JizZGW[y5\s_0 {lO-R8u4k8ui/]Ƈyt 4YM1J@Fd hHyD:~bcb_ %'Cdfo!! Sɣ~SϏ_K|G d-ybRZ9>9ӥ oB! ϥ`fu8]*|*Mڨ6G 1 P.}HGCR61ˆIo5T...ଃ@1y|^ G+bV9YcO,v"kRqq5TwYOxԟONhW`/qǠ}߾{PqAzo۷FIi|-:f%d΁'ˠ}¨0WL Y\}wal [+SWw3G(qm3?.AY( wuTOȾ}X7>޿}s/2֬9 s]20F8T` WvrϬ j3viP3k@"ۇf (xƆ >[q2j`7 Sнjt;Ra1z+͆*,8?<^s9(]Gm` ޥi}qق=vj̤d1@U8 dA-amAa/nFR7%ZL&X:! Fd~\p4ixlIvŸ+ld0[Z#nRcKkɶqt|dwwD22HAa(FlVK&3-|K]c/]*S7/AgAh#SdVThtڛS qfQNߺ^01nff,t"*\v2q*i+͖ T&i2ޞhJu\qcpyQktm]3fd*u *"~~W}x Qסv VV!s;eTM|?EBͽ.L{)F`o#vqF{Sw=L0|~m&=7<B.}/EFabdLy.D[L[N{`I".,jqjA6l[cfu+i{HMumUv `&Ur38˖g=,{ϋ Ϋpw< š)V޹FX2:Яsʁ3/!K68SEӀNCWɾqЂ6 v@fu%ѩ f{j1g+6wí 9\,<@2W(A`o;ƒOzJw$y όM eUG5W QR`s>X{Q,7pكmbxُc1d]+ϧ*t&ko[ϊ>MAϋs.lC2a0[-HTy.im*W}X4a(# .:En{{9u zk>0)K8KeȳB'Ē4/nS*H= 凷#aI!{U8;ޯrG!Nrx'ɵ ywk#+(ԸB<"} ,V({F,f6ا^'9CSVquQ5lNUp@ t#8 gno(& 8̋8Ec%s&tg]쁤 nb8rfUt9 d?F|t$}:8`:`RjE1p V9qc]29oooslB $Cw6L۹YZcdaADaSf1t[H&k À~XL"hچ|(@c>M>+1tf4E0t1o}ZM7BP :E͟ ٔ'\pW'Ζty\hJ4Ott#̍?f޻s6>:u: :5P>>ɂ(ԃAif۟yL`u-׬ӄs`i.``ba5+é0Ȭ9dH^}:IM36@Q6s1½QފqDu4hS,ЩvWr{`a^\ O7*G q10N!7j?5vT#dX\l߹Nݧ#.(5jE1m(2)`柳ߊn߳j:}^}WiWKuJV2e{ʒ0T߰;YDV3寧)P k ˫-9bM;(36|ܨS=%kAD~LbѪ}H֡H64UUMs^eS> @) 9y=BAE@G4_LC3C3SH6>}c5ʩFmWH.[d³-В-ǔlk:$,rJLVw_]ΜQg^,e o ksU+2nφW uJrh 3ӓW__ŷH~[MGfqo};7O-4.:n͠@CCȠsPt|XE(f X,ؚ E3(=@ȀTs m|rEg% R(la(9AqNnPEb3>>]jbgS.PKg麖T"^M嶎vTBƹ<kֲJ5o'q3*^>U7?y&H`MWWkXH==yv=}^1CX@r ښ3`, 8o(#S>B6M^C2+tzP0eܛtd3/^&#O@ 5K)$*2ADa 1JRLxw3k63QY4F$b!*'AaMONQH?7:Ck>drkd,i!LXs*`և$UsxムFл)p*}8Mtz҉޶t~]8K'1 +v@i/R5hGE[i7)%1Iy_*XE~A7׸I]}uԷs[^8>kQ S[e3ښFt ] A&;xqKe;ݛ/:,}1; FF^Y愙,Q0^'Iӽu~\ j }8&lh9N 3yG4yG#[M5o8Z&X3uH%qکCBdXתCSQAoWd%v?m2 MP|YS "4;= Ӌ~&p,YGL臊<`m8;ȷcZR ¦~pQc%0ϤK.<sNiFáBg ܿ= y l$Qj#fpLϸg3{|qmr6I6 C>*\le;o('3φoK .  F}=YB1::#2ٲ?oEG}GydA~n]Cc8:UY+S5FE`J,7_Aqs}1?u>v`;udM'C&}|GX:IGz57 ~md˝_v}0심A͝'>,MݭmAb lk:- 픊fUvE U!˚DҙmhM/~1=Ela_oS>3A6|,>WPGduv0s1id7uf`X#ٔ[ҋ/25Yu?ъ,pbl,bjm_C< H`)L3´D֛W`2q>Mcs"q-r[+~4~tTFa ,sNQQƆmu+\'lD \4E ysw}pbC]==铟~!=q$5ȑ!sQI~Lh;dX0Fnɡ]21ȏm,Ld{+Ae#Aڨ# ZS.Hr G8&{"d@^vwd+s%řqe4fA^mW pPx63O I%{ۢௐw:\ @yfgZg1:`d$*gdR칥 ꜒7H5Ŗ |:޿{=s k b;Cۺ\_t_ﮝy:KnFmk1qR8g8׎H@eOP^lo8slr`0HT[KoJyoxDۈQ<ͺqCpx@?jV.=p6Q"w!K`141d:}dR{N!=ޘLr7-3iu),!5;y?zWUG d#:Y숬 iBADPD@8DFw8{8>pvxN)A jDbPN06A4BAgx M0}x=Y#Kkƭ~2nr},'8)#c$-"knM#8n"k0I } {73ʭŻLB4=:LAI_ݯJn'kGr NzF^t~ς荷PS>hUMf,?Ƒ@"K 復_)hl%4ad/kPU) V84(i_e!]P\Q#! F2Z&gxuy8ʔJ֏]_~gna[q2LMDH-Ȭ]CPe2s㬮mDI۷#!Ȥ ً$IcYg!/Cӭ5]emZ8c>Kc6;8aF|+ ?ȒYxnӬMJYA9{RLal,]0)Ev`vGwܻ{a̸(u|+QY ;~PafDkXܣŪ*Ѽ\F_?S1e.:F:.f-2rȯ\Q( <q У, 0Yw[(g#VC2񔚘,ȗ͆ڳA `]8M5TZOQ%r- Pp@Xu:θ_J=` 87 ;4| O~20p++UpY]e٬ @3 o<׻>4 #6\Jg[~wfjWKtY+\I7Mz31TeN[چrdcL<7~ Yx_f!S*RB\ xEW"TIH-TJ=qӃw8g0Km?EE7Ҩx~86tCVrAX<:l77ч 8\,I}hH4}Vt,ёUǔx9'NC9.po};-aN#h}JsJ(I' c~g1 ،p Mj GJ י'aSe:Rб6y[ȸGT;k$T3 Mtg?e,wvLWd8, FҤ`sZ86Z| p\CRY0G b6y0cM@ÄPl4*`Y ]!Ѧ')$42Ԍt)[SNٲ #{{ԬAg'gCר_M/ul֫*xQk}x3No|gk`ʽ6-բart&UT5YiGj,2 Ҧ|6{%pHN<ڽ3;TYmʲTY0vs)_,1O'b`Apx+# g,M (%4%Uc"E֦1_w=$_0[/Xl t6z*|LDd#Ƶ!C\3LCa=x!Bc#D6t\1?,&m2*-ZX+ZR@mlz<=ŸOn˼,j&WҳTb"'RǙ"R1F ~un4ue׌͌6+LGF8U,X$)3@ 6ry839kdt' 3qxN8dD"=Wy:H}ue,_tE/޻s7 ?fH$0S]=cq{dBWKä[KkC g;s+'ϝdr:92b@+SDmCm~cU[[', |X fU6E`nS6MД)uG精'갯@i>g@R} *8{%'}V9,zʕ(j`aO|= ̓K0h]t8nȗ0x߉ts":9mm'@8;WPY\(:9u#`dCH3'iAGsBSY%SY=c1/}_wH$$ܳ`2v&1n]fBm*n?bA E_~fո73ugNޞ%_ƾ:oݛdz nؗ2R5uw!(I٭b ^,D:B- XB:~'1XJhEudrpk\}8'[al[ʹ)ᇮ߳]PIyNr wG;gP2=5JhI;ibe;ƏX̽gψE[̸`O" =g嵱 xv \T;mer:m> =ifbzX#Ӥ '{naiZLbݔ#YqՀGکeK ձgw>e8q6m,; 9TGrgJh, >xu;Sӄ~mioTﲆ~ԅO/鑹4|Oߪր2OeJF 8,uj۔.`'dt7`e:Q ^q1kKuiC.,/OZ|Y@_Sk00 m]ϾqۼlMu;S֮l'G z6b+gpRyΗ$WEAsWzE8uYЖSS9[op!ЖPH.|-de1vQi6 )dW;6cCʠMe?+"e'^5 >嵐GcEkgc[YKPYTC@{T>33q$.X~@& g`oB?}|rƉQ X0SQx{rpwq@ngDÃ'~qs޼[_?fyG d5្d\Uߚ @ՠc!%:usW9E:K T1*f(PìXZ ߬wq+L3r:PlNC#,^)[bF5$nnouuGP[R.?zx6Q;Z^$ݖlfש=ĭUTRC!huvD>gq@u41,}^\شX؎VGzCą゚~7~ϥ,}~ Ɖ21f tP,8TNиmO{[[‰ĩʙSǡڡ{k&fN>֝1lS3t߹|,S 4 2ZYX/)J:?E( a\562 jxEY#:@K)'DMΥm6Mj@kz_SQ Hwkgh`U 0"xI#cGdtaĜ;!@fvz`-*a! a,O)hYvY|Ƀy =2 Z-~2^G$(^R}5:YLӹVuB^lXJ)סlh +WydVl oȅ3fIΠk!xdp^T# tN1˻mmt CJ-t dL.L]Ӥ !"gaeEC'}7s/"e46cb>1H_꤬BӰWY#Yƭ3#c0~.-@dgcW~RGo{cPdmcI"\ e{f0ZzG䳂e?9(\Al thپ4H`Λ} 1١$ʨF*:CFǨ:ӧӥɆפ޸F}L%ȧLi_X^L9~ս%k+,ۘKIƍ{mXٸӿ>ϥ>Ϳ:W@ɂ<6،w=$vGw=ioIZ8(Aft&&#hmEiw[7G'$Skmi r( lK4c,}>+0% RƵʞi@/ˌf^W·3eI؜]##ؽa\pp%SXST2ɸug!/'!xogϟvb *tr:VsV7.=z4H6Xۚmsu+v/gsсȗehFp>d`٣tHy`)g]=%^.<_ אָ l?AxބiPBct *jV9yܚ|.ug^.%<gs=o+3lsOK 9- Ȥ ("6=e&hz87矼^>#z82Ie.BXPB_$ڱ=5!چMNa@S0b,2bP,Ohk,pԱ6vZ9Rg,rLۀknmj=܃ޠvHywCÈ(< oxxrwX796snii DtIRɖts}B gHy]l=n kc-[4+nT*.s9kGG#-]+7% i|`T9DPFڳج(Eo}PKf `#8~StާழZF?VxMX+^4z_Li2OPo>69B%&P'2dK |̂@~6:Ɍ-NuBlMXG<|d'\8+N+ @%^} S~,ۇay:5@-"ml] pTkNP7w?Mx#0u0Km֞ r{4~pf9,Tߔ"XJx{zp#ck%'SSOoʭmf Y#Kk/֊ːd:d-9֌-Ho@؉Lؾ0GYzm%vR,Q 8p[b9$6lPY&2gG66=هw `V/ U􁚊\dM[ؿ=do:vzX]×aѸV{?՗ /|n=\}?m_ /5vw,#|ҫ61pf$ AtdTYB"̇~;ϑ2ATea3Bnn$J80"XjJ l|~'Hum ,J]2ɨ|h,J@F j Ba%%΃P\lhiEQ FzݘyqX3c=dn&L[ݙʭ{ȼ 2hvUP2흎@dm\b=MgC `f="ֵ$i]aL1bn&\9ݛyY/;)1CUVfO pe]_3*]2@ֈau= 5m(вMvQ{^*|^!H< [w~.c Z tfρJ}ȥ{6F5Leίa\ Dj=v<E}Ӂ}.8A3ԇP0tJk14Q%㣺?qH~JA!Tmtm4i ꠲z2ܗU;^΀%: 4Na,RhY3Kq]g<ګY4yZ:ILY{Rͽ.q681TvBy=YRht,͝[Xpra@<}a&7Ka-Ϊ61, L*FxOc)>H4kyS/}I7Z%W@IDATf;ЗNjе47Sc*zf\7~|=.ӻE] @h)K g#J0zPR\a,q( m  {z >[?~dD~D;Kާ;) ?>˞@OA^{FZxC>WNTF0`g id)1=,Q#99"i'0zχ0dO^ 2dcj9LK!NdZS7rem߉NlQSA=-1UBi }{ee Gz24>ęgO'lM9` a)L?>C:{^y1ۜ]pv>l3E =91_tJ%@RSʚ/ۢ qя56Ҕw H`!{kbQuͬw#ӛ*rJw*Ư(cg@&Rk^OO߃#3ԢCΰ<W,kwf&a I"$ 2A6m\V"g\:=WUmfJ:;.HcFU{M!`w gj`L,p?G6-1uzoog`3}&x(3ɡ3% Nz{Cvul풛ʾPZR95vC7*[C;Xu9sxń\>2W | chk6D[Sm)r.upL=Z[l9q>5[AnѸs O(GG0̝T=ڠ,^ `Z}4~N\ɣ.Hd tɳ27&݊1G[+6h?}Wss+AUތ@~bgp^ry]{YN򼓠*d nݺ_d~&G '8l?S_~ƻ`xHY4[5>"cvH哂nikC;QéS4q@M k_!gB3߷@caXr¿Ev g|(437؉15d[Pp4CSvV6 %X ]Jck`s=>>޽!N@2۾#u'ɘ 24TZX\K?a6M 1 CGxQB/@ҕҀϠV'$]Oz:K=ґ<1HYי<څ҄am?F@kQ(U(@E޽0FsEjdΔAˠ(Y@w ]g踠}wqm>fF{N*b~{$V+ oٸ%:fH}T7ʏ 옙Iֺ̋ϳB}.z_H-W] re^3:= .ҌE0jFڇk_ZS2|!.:6Qr4oq E\[j#( ώ ܰWv@.vq lP{lPA6PU0[6ytNqШ1)4 m2_@,>3Ŵ29ԓ4FɎyw\C>Ν2 ̦4-4(/idj,\mg`N3>U`]l(Q k(@μpWXbc1ʹCHc?` 8vv mLCÃW'1kkxYdEaPRc'=3|fo.0VĞ 03þWw )A\DVƇF#c.AGw%u38FHAwNs"/~%JNs!9[a"rdlfrkGA,ڄs~\͠yƒ׼m I78ƞ^Mt1MD'v)0fFFRֲ=ٱ`kTvn芾2|gT.Ə'ƹV9tCcgQoOi! n/~cϼ^u䊌-PvVG}l%vU4$Rϝ?9_<ÀWDeV LA20F[=E9 ndh=8?~_"킥j~U`N=l52CϿO K2;κAdnLچm0f@&޾Y<ɬ`A#Q35PW (w4E>U0`NÎ03^HO<3 28Ï0K~'5g_wܥz58o~@}!HO= rbhI;o߈.e\P|icb}lme4&<ig ܴ9B)G Juľn2F 8_epթNsm6+` HFȶ]o|D@-( ^V@G;gG2 /_`( )A!%ΝM? $ u3c"R? 9?G&f+;~6BtȾ7tw3hn26bKХ8fM ` Hp=ڞxlmp[AҨ05U)&5(NGڈш4 JJb2U,ںiz~ }W [Lڷ{ POߣg-'ك!h BpH`N6YR!vW'$P+[ߧ"5qK ]j92P◺Wںbt&(O}9sΓgv6 $-ʥ*DR\eo\ 2 TKbeZ%HdHD,bfvNy:p;9wFt=yN9Ͱp #}Aa,|"G7.1р,$Hυ>~) 0j֞D=_y,=)!Qˮ%++H`#baHk:{ 0Fpz&("Q`(N&jzΩF}W97px@q&q&NJ/Z @Ǯqc$SAIBG+>x0ritSl2zam{յBgt蓻Lta* tmm/Фu\o7,"ac9GנK`l{By B0eɸVTKGuFr)džYo=yBEIy`f3H`]ov0$קCpBu =#XCha42'I@2 AHKʉY rU3_'gF*nb& 6f>؊cӔNR:LG PI/$P2!R!(S!-"֨WH)!C5d-:$<^)Z5d<1`165F&b' 8j59߃( P`FjXME`Xq]YMYzYFg: D k-Y΀Ԍv @Ej/..gq?<ݯ:vA':Bl?4J3:f {htlwQI`?xSLK7̘Ys$SL g@ u.ܬ'p8r)LΎBzt>Z:%ռg?°lwŻc2Qs(.׍wrwN|vzx 4?jLpYm~ iA1A;7S)A@1{WP8fj(agLd2\R1d[S}~l{ed{ogN@-?v*WV6YV)lҜM=<=-"(\rkG? `@{-Q9#fw'lW70'0=.}1]>BPmd2eu2rj(c `۬ z@ټ0N2ك/o|wLJ/͡}Id07T%֚%2qw퍠IǷptS 6|?H,SV> RmgVp2 y͓7rtb;{1tK+{Yc3]3J=35}DdA};:[C΃~QJ$U-/AFטz`yiK@8B* -x/̀)߄C%eZ7DL!P2UWɈQ&d`{ C=Dҁ b-0XM 6[Yi>cs솚_l`L=l]z0 r!9@W`(TmCJ6`@j|*L,X" &߁<ΘvSA8`Yvw`Yؖjsexuؔr#2Ɩ+y+=OagKa $Fc%6٣  eZr@4O(5IYBBF7wPvGScf|*i^_owkr=j:A#dٟˏ'{Nt2Џl'<*FwMt.-a-GRCó|3_cIL|JrɚS&2Tsv$}2,5&SgLao?kK}_'2]7a&8K&W[360ji [P^zoIcc>=|8]BŦ0.oϼG|ƅlGQΎ\6|?Ygqk?~_+49 )ё7Ŏ֤ )҉0H cBr]{6Q+κb!#lr N=dI%$#jVNAҝ Ԥdbs : t'!ۦd[-mu=T:`5(l+A6`Vp{(bQ pH؈˚3F3ax 0 "HC@Eǡ\Tw DR. ^?Dl%"1u2 ̋ sdMӡ4Ž@(dovvtAGo eyy98~s%T/h( nC׎>Y_ɱ:1%(c-)bgb_C| hm2dhM %uݝY|'OꆑMl ,i4އA5RouuJDWg,]Y;r| X5Ksg6T;MYj129?yJ!q+k9 !f|5tvve?OCC=Sf6ETEmRhoaּLNEϒ =xDi5 ( nm4@"YY1+k |]dÌzg߬D|56vxQ75S!/׈OȞYm~[v_ duE,K9,tJu3̩}Y#\1Twɢ%sNLrXX`zh {0(U>5R熽őAr gr˅1vdx(\ t=8iж3|(<Igt t=vw,Xڑ꽧\ HS<ݳMh1q*plBdAՇ5dp[p,Lܟ~ͱ)GMNVڸ5~6֐GЇ!>6TpfK"u4-m䍠`$Fp Jzg&=2)i`oCK8J'Z:;Ap Ա|BBNpxUG}@r>*ki`p{W(k{xFzK4;AƔ kvq0O\:fLI)M1b3J*Jtu%2<LCGm l|I3lv-՞O#v Y^xJ-aϮ\y/"`I}B.,nGw726;3G^>?`PosM}K- kgiXxA6uE|ᨠշ22tB-({ S=,JP_=g>G;L8Kiv=K7c!2, Z7o&xj6E09Q DcVm(L_'ԛaşTTJ@KS862ηuړ!(Ēf6{YbR uQ@YeiO3ML[rvG7;(CeL> ShX=Om 3=( j+;r6}^7bGn.<{fT+iᘞ Y]ҵ_&Sg;@aj|P$ -A6BmGx 6&k&zYX! +cA0#($H/{hxs/|JzϽ^}DƆK(aj QGulC{{gM'az2 hT%$Ke+v]6q j +r[qϕCnWyud[8qU-]h ^Q+Ns񴭜` Մ>g3g0B ِPtʮlYCC&ϑO+cNvE(tfܻoS',YsX2 ۿk;PʌB.h)R"\ * i;ݷ{Ӳʇ}?V7{YÆ $j4bȸ!*5b[`A!3<+Վ{ñ3` -mw8:$Ly+yA_"x:TP 3m5k (fGH~:t#t\8?O=Phё"qh9t6)MsAPKj`݃cTOЅ:ihd-AcWQ8>.b <* ִr :M{+njtB>o銂;yGE`I{:{P47t*<נ>_ZqdpKXHl4Vl)*pJ̇NA9#w$}p"ك%)p3:f]ȡ%>t*m'SUplQG 3՗_&6t=;)"cCJX#ܰ'8G0OSI1f q< ' ¨Ky \hFfޫd10m0Z(=$/\:*J3CҀbG/dd*Y94S7}$z@ p Mz\Lu.~kz)m--m 5G?fx8fF+r .B.vN1;${E¢Iiy: o3 }|hZƿK˽i ^=EzٟcWI4* Жk1Ay)㢉34hK>l0 Ø!H桯 رZGlM0b׮DA!GŁr"+8"isp{Lr )&rVANU FBgU3C5:ŠcˁnݭKҟ/C"6X%L*#ek 5Z. fm'w2EA}'&8SdœaX!( *e V1uMoeQ[SS}'1N$]z y,O\I,o%0=[ֺ>eObHS#c:+^ObـPA7 c=gdZ[77 %/ ?YE(N_O6bMJ}ȏNOׯG6Yfv3tt62r+4ӹ#:K5[ZLvP_O7? K3jR[:QI92U3:w"A= Z*yEHh99$@qiʗ_vvm 5Xgc'mΪ{SP_"&%񹳘NrV-P7|˿=#SOx@ʹ'0V#MTxP(Gԓ @suzlDk\JoWӀLj/#KCୄ_rN-91@X&dw!*F^#9>?wx/͸?t[<>CPJq'ٰyh󖶽juĈSuK),K݌#Oރ/s]{(hՓO)W/'A7cYQse9:==Ir]&`ľal",E| xL7a/KH6|n,pY2t)5v F{ͨ¹ =/[T'9=^MV@f jU<= d}5AkYO%DKd*~_ [ Y7_4}rsB9UYl A5 {i(/F($xB?& 0tv`L yt',% F;׿iO*1QDsFe0yR&`1d8+QҺ,.~p6O},C#`Cm,η ydC^-ѫʦ:2/]6rl³ʔcx $mWGCQ*gOVxJR,-EGImnFS?_CE@a5SRomcڅ4h"JI^ԷP¾0F?&wKgOz dF# =YDG[.@//E^#YcFPerH,.ǔN+9؁ LM{`\li{m&{Rbblbdt8 J'=8Ⱦ=,+\cK@^% ʹg<e$(d=Ì) EW ggKbYo@^p˼gRϩW @Sm]c}o][I?3p&?g"?ق x)qtRU(dg Cʆ[M ̮P: ]_&  wz'#Gժ8(ed[zz:嚆bR/#71IH٥e(8&:z cF3u؂с.R[ښs-/OHV9>+mzX3 Ax@R:4!=LHuR`0ΙZKrKބXJ:4tH[JRgǽ<=fo{{q<\ ƛ(VhYdI[gSptsDQd6 lT^@aV::Xԍ, J{I(hl̵I)r u[NvY+'0mh#k8 mܠUקϣt>cr88Y(244d珐?n^'-:_Zm􅓈gKH30kuBT|Z&Gr_'Dܱ<5bniЊ@{d~`ƈf ZpZpBK#0~ 6,-BYEt8Jq^p|zuKP֎A65hxg~fv6$FY/B(fxN+f4̦y9`JPBGY@Yu@jCKv͚9v Y12k~1* `=_>FƆ Q)|>,}KÕ2HfseoIA1wl:5ܭ`ט 6l s4tju"e$x$rJpn৺T!9[[!;TPhx -sdh˷G ;K}rF{,2u(~ ̵k^{e8'^}ϒjx,N;zMFBQPoKYg$(Yg3i,ߠ1 yfJAY":ȮgLP:*3?-,./ɒc7$gw.[o70% 2dC\ׯ'Hyr==NTXc SV7ÙV]oB2vl8Iqm2gN-wN4~+}̂&BP=?x&24hH4I[jb2P,`,4h$c۔SA n7s} ]vAM!geMD0k$TOMz{Η t:$`uu"Y;ԕcs8ś $Uu!ִs-v߷ dslpz/(市x@t|\p海b!:mZu3ܮav_Ifta~/[\| נpG?++6{3G@pחhha: -S@P⿸H==(OғC?2%WdعD6y}+md650^}B@.cjėxPnYK:s2[\ 2hdM,!/#^k&Ss:D'֗]ClP|r&Gg^p"`G`m#Yų"wޠrg;E|5L-^#SQWYECika*$B἗p+чK;fmhrj!23]I"3\Ȇls˴ ۠A5Pe2G>IV@_/2F) J3cH}2x'ƍhAF019r`yV[[+۩uhnG[Mg\X{1+D7@h:ɗȐp|ۧhwBlqTyܸmvS&dC .ۀdc'ٙm<(v{`H|_Ml.t 50ؿ~/6"{6@x|怃ّ;?pii D TEZjyc.G*J]S!ʅWڥNW+YO#(O;Xvt!n䝎W84maxUl MolKk)MA{^cfS6XKWf%Ɗ })gǢ9w$$Y9MpTP:!11iP5rL!Vϙsfj(kM*x/;L##1baY6)K-捖ϑ'52O&LSc47*1$Np|ׂcZ爐raFj9QG .d@xLc.QB1߀ X?}M+ރtNwv Xg '#D\ Gx PR2m U]w]nsAo&,#Q]Ed" h@=y?m 96Ȣ {"2Sn p4|86Q4˓>Hu"9&={ &5/p{w& C8t59^pWs6W?9E56C"'@&+?qy *ɞ!\8{12ko8ŌQ1=|r@ohTi#>3Jrf%B/BšL,L]o{9gƇ͏Z D L9ZGm9˜8Av,5~Yw36L55yy Bbu 28qvp\4QZw m 6罔-ft}kE 5r=j4Fpn9cqMT|6ۆbvf tgm+k):0Jh6`R,_W R^ju ccRƁTH7XcW14k]u:`6pCkueةfwu"֩F{ڶI=#d:=AN`&`@IDATDeSjj5F$kХ[ #`n\02_2/Y7{+CW*C; 3q> 쟥s/`3kYct,I[PF?tr:]n`A z&W`ʁHg3@0JK28Rxпv[]`))«ZaЬnwaY}3*{V6/ll\`~v QR+O4i;CF{ Bv;ֱi[?"C:)ji|27Ԕ0 ywAӭsm'UA-fgeHy}N<1{/:eJ}^z-]AoqFYbl"{f\o d K/GɵR?eE0=6I6F]pS A(~K5HG{;^g݃EA0vxsH `JS90va4:-5FM{ݍ bzf\Opys@ч% )#.#GIt:?G4F7/+?lkM7 =g0Ec6]8s1m=?${ _褺VW(g{.;bJFeoH=Om G% PWQT"H2/ gJzZ1yd8 yq N'OR#[d)Hݻ@f?;*Ko t޽҉`Udl8PbR뭱q]r UhyycES:*hyJ1H(iea4Tв':ZPV+Wۿ~u"HqDi8u Bc2leQѡvմn b`H؆ֵL;wA@/,Bdk[, tCvՊg6)Ihg1)G ?45R֧oz,"(Kj D{ewX" P\L ,e#50SuCs ,I! ϘT$pd=P]g)Kw&kDgx6~"6Y*x>v5ϙ&9CQFK_,YQ?^KXC-3_[Y= djqdyEyJCZ(%7pg lCN>* y(}"\E6@g1eV5mYQM^N ^L <9̠c%ŠfmR"`̴8ʞ'!{^nVc @ 8J%dxYnNƘ%#[`,l818q6y Ph[D>K0ǬK f_el{,\fj 9XexoQdcl_QvFS5X{:uޓGHRנ{:} aY xhoc }k8R86`VKR˪`R@V2:NCJt_76GSKz8k}ҌKPfa.ьB[gqy!hA#2.=P؍G:q3Xs{tZ#OӫO&=d[Y}s\N|IV@da@eil{#1J!ӗ=LNO\kk}gp>lmV-|TQJLx$C@`ǿG&SsؐȈ[x _rM#5q~ BU]e(nUM=v$ L9 T2֚YY߈6>vy/(eߗ`sjFr5U&]ϼ큉Z E+WH ֡O+W.P(T cyJ v-- Fx%b6-'Xϻdksy&>!ü _@r-_[4E:js[({F[w8yn}ܫzgfl`FJce}ŢK-Fk>es:T}'t)?c٠Oje'CzB*~ӻ32El1. x ,Z&1Ξ l"=n(ύo| :Te 0M@O?@VDy(S9`]=OB9{83Mi/Bz~PӅNDFzcQWM9-,93t:1{?n=fKk?$I`''pLɲ~r}//-crv9{Q[n'2WM9y⹞<=AϳhT@C#YR ErωƗތݧwHLa˨?^#ÅSM-`h lf)gaN*}VawYRpL)ken=机D?5a`Ÿ_ko0-&Ź؅1C@] ۔_lL$f+!(ĵc+cg_>D)e$ $}X}ʼZv M++"IflI(6qds,jLN@f8OK->i#<|X߾J3-]ϲ+"3q(@dD<"X"{@@4Z#M%:>7fR1uN<ʱSkw5pU tuw1e׺[f0<nt:wt4= T :T=+C5apLB> L,Ed=*QżfDzihr Hƭ#W xaXD"CY@:gvS{ >"K= `،YJ`o*KEtMm)d2}sbDQ#Ym91m}:tm28c0u|nO Щ&|Ok'1*c#$*=20se j& **F *Z32VF YnS#СmjmcIQw y^'MW+wGx? ;`k{o3uPH64E$Sg&hUGOh VjK_[c uMTR/SZՕ~[WdSae|Ar= ~µ1K{d8Q384+ao߼D mkILJzR#޿Y2~=[bO=VT}! E doBMC3DŜaiRg_ϫ ˈT'ZV8fl"ν6,ArgyS[_M`qʎ~GuK$w`A} YI`W` P?ۇf'#u 2XgNyv\OOe[~&>?Q6 Ii COOŽsKs$ȋU_ 쁁qqO=_e[wo*~F'.s_@ Gm?o$*Cƌ2rd'u3RFĝCIFZh5!`:Χ,MJ(#ϵ}<3!lhGhăgP~4>П(ԟfhBVgk}ʡVA3=m=lnK\ 04.l}x >PfgaeLMgɪ[qlUq2#طKA6uY$}d*{f!CQҕU& J`xFk`;7 |Z=]DU6ie_6u#Ab!Ʋ;CU4|O *Ua\&@L}S%bh==mq=CṼ'qB18+ CXAm/N#u @P<$s%Qi[t4y:S>׆強U3%& 35Fϋ;~mF$ͥ:yZiۜ^|<ݳA,4ڡF=CКا]ΙJ:ʺ4x]ct u40den(6ִ{Y'866 EKs5j ZrS2:\ V~=kߕΚNٳ!_-hd9@#2.xFF9:TQV861*@vٰ:虅FI9rf>J}FyT^P\:NtTa'9Q*/?p"I,|Ng;Q)KRqٗ.2=szo!q\3? k(rN9M, +vK7x[ ̍_ִ __8*oBc&TN7vw"{f ?};ڽކ<:_ t.9ydq e5sK! x{o֏=wcYLXceQ{w75_L/v%ac98þ0:FkS%eƘXr~+<:~I)f<;P+8 ̪Z>o&/ϴZw'ov x~-J0y>N`;d}w>l(<Z(ytiϳdكBߣ{|B׺CshooYi_y#@?׷='#L)!v {j =-K|z†r۝6: D;9biӖu ׮`6D3 c7ԣO^5n߾Gi#Թl8[VC h{  3Ƀ&OD{u=,SWzA@1Wѭ[jr"_#[c(<$=>_Z?Z>`p0<ˎd ym8+Fc/GԢcOPo_"L*xY';5 jgD 挞XAkcØ< * +-8TL!^^ZL~Azj#sߘ^xc|I fY#41\)HћڷBΔ,,xYV^$yʰ Y;6va+dQwG2ڑN~191# QzsLR.wRG%Zt vfvq k3:;2\9 fi:׋yl5v)c} [MY&_Fej[#%O2ͳ]򡿦3s|uled='/ڋEdI T+䟉5Ȓ{86FAƱ 5K~8/EVAϿ?ٸu||&ooWE֐?#,bA?j*_> v+(:з jvB- Hp# 4Z 4PCi,j\ 0:E4 ƙKMfz{u <)iũ*k"㋂S!:>ˀJsDAI۶syGAאڙ}xdkZ:C9|0&Ѥ-ԍq!yČ,LgwkRit*TGZMR 8|S\qb +7N<N-J4S~mib|C 5e"0QDlwBY7u_I;nɇ O%e%j|EYCgVڈl# M| u1g5:WG+"s%4AN'=9+3^%UtCt1s;A2,ÉYi;CyzE'C"G]yQZf sdEq^QMӞ٥\uI{s#TP.|!t4 n2dCΜ9bCc35sb3 <gE'^ 27dq:9fpdP)7އuD"`1aס$M<|&0uT m"NeW&U g5HyjQ" ey5õ߿9kGs^CX[ke>Di)$+ he)D>|`ߟl^Sp-ʊ93w` u\ h~n@G"sagSa3e8-(VvMqn4ޛR0kr k^)_Ø7 L06<__)p@"[8H3 P"ۉi ѱ56[S&^6Gi. L-7հ 9%QU 7?:pOc[ &òA&U*]f#\8lQw[fs@u"LdɵSVٛ_@G {2n)=kZ?̓ٺO}y?MSN:Ͳ8#:`m}C}b-9X >SZ'{nE9ikkU/fh Xnvs_k y2>OL 8$'v:}u6n:fc׎=΋6(RV5!W}t4WOmK.v>asǷÈOaͽ[79L`5CguV)8p'Ei ͱqC4DD(C#~^!e!z ~w^?G^-)cQ8K˕Gme)gxkȗ{y 6ck$;^XB/NYeMݯl/P39EK?y7L֙W/bsz:>i|rXD bkbX e{ӷZb_=yweG{>I#,#tZ4e-ad iCؓ}4=7Yy! MȺg5\59tc [=+W=w=E~ػ}2[xHm`L22ވO戴^>a9iJ1Cr?}b;Rs=ctI*ڵ4F;O2${~CA? )PKe[Uֆ R 2 p$05@{'/* ?t,v3>|(uAμp>}k_Kgm8uW,9qalx> |$kc>Ͼ0..nqk6XK;z{U9DX%z@lcc=#@6|>>} Nc'=] Ȇ@^{vO:9č '0wƇʉZ:($`2c9E8>;0&*h7.m?7t7kg{+VWW]/7]^{4=Pe?،?oUZv36иuxnATDہW:B !B5 Y P81i} $;#3='ƇғYSC2 J4GNՌM}icۅcAø[ǎTF 3ԱףgF՚Jy1S pT qlFu8C:r2?A߅5>LC31&p޵,M3Su6{n}wǬrb )OC'̄р|wdC|;F0j\x^1ALNs.Ϟ=A0{t4t:$lmdZ2$1D3}1b[Y!$y~t .S&ˀdcIhZqgGPl)[ـ#d4C,󘦓4zk,c@*Ḭ>'N2v#ɵF&T"Ced @ bS(jn9 ;rzXe`(Gz |M#۴sjjJdyFts_fWh347'uijcFaɾ-ʯR:y]. +[Ag4܂f dq >-)Sΰa=ҕ+Q⦓lݼiH;NpmąW_Mg_u?);i> f_zUY3Nq[SkjSY!;C[WnJv bC,ܡGmX EDC3}sna"?ޜaA%lS ,XyēX!Θ ` 5M^z@;:71YCN9EƳm+IP̯#@\đlfՋ>raU{m[^DW㠳339;+d'aE^M ZTq-̦7n~hdn ?]*q+H@Q JišocQ^[(ú3}nOW7})R@`wO3$BT^0 ^+MЧ5\Lowi -2E; ? `0,u*|RCV 4sL|NU/F?[?d~(3&Fmjo^^v$?I -b"_ Ce'޿: 4#l?@J4uQ _31=+2)P75:Jb{'>VB.\]P̠^, 􌾰>8^|@&K)G.Sל]g8M(E/ױd̤#k~Ak^pF+7 SGgk dGʍubʬ2cOY /1/'XGܷӧ.z/^, c/Xwb^{nϞJLYb`z{}c"gb"/$;m?ihN0:ce>oݻ:t]X4881>Cד4dƇ K̾cD e?[9oz~ %5@XIP [}6a676IZiu;Le`'6cYvؖaL"6\w >^ GC#KJK˭UN3ӗ2зñP`I&Y4foUn??ϐ<|W6>S  6` hMJ nyP2)x|ݛo~o|~x/|:.#G=? RJPJ+2QmPX"P nd*qNU3g8bQ m'Tl*dIn`h؏<12Ķ"G(TL%F 6 Vkkv0>887 `, T%27ߗV4!+^.;u=!BA6b b Hkҳ+q:[{J'~ތ7 ŌTS! L 4c<͛ӪR;+kH/]@N@9P|dZTeqwDPn3#d't{\mK_ L]#]pj\JOto nڵZ's~<\g g3t3U21'ކL5aCppbn*`1נ=Ϥk54H/m$#q _,x7׿iI`UNt"ݳqiQ-1lG°!am6t|qt2:P_x%d cL G^'oeRa8ߛ8ӫ tD+Y@Tfd uk~ZztHyQU7+i~ƨS70`~WOo| V >ԠOX-!RYSm:KjÁ mmCK2NZ)8sh"C^;S^I_tg(/I#-2C|fOˇ)t Cd$M1,Xa0O?9{oApb_~p Z `V(!;j]BN=;e`#, ?{ai:fc֕nvЕ}c@abFt \c&tK_d σQ!8uB:wsk5~,ׂ Y (A6wci{3#}eyo g#@VHЅtÙ+A @D@h(4l˥yBDutfF{e( K6 4=gH-An7:HSYU~lFttF#3n]̘]?&g[;zƟK8,+y}}gEu3PkϴYSϥ_s|+/%@yՑf/2,+tftb&KrO]L?$;>TAO]Lrp,HHٻDGsv]F(>'*:Agل2Y_ܘ63IV LJji\[>Ѡ,@xNȎZN&#ݝ moF4_k3}Et) l#&^.OG( 9:tKxZnΟ] unE-w{;ԛyL:efrq6fb-(ݱN}p/?"{зĀ wPop{dclC.z:KqdVT c͍$= ;7 gkd!\@6ϯ[?r#'8_gUiA{A{ȵ|QzD2AQVĵ]0r @-=[9 ~䳱YȐme'/hCJE0K)M5OiZx=[WO6f#c0`HcG6>F70k-3G>7\3zaOdJ x=!.N3AjvAWdi <2Q/*&\c&Ls *`URV8G6WV?+S4zL~k3-ρqI0q#Ell=QLmS3{>:?_4p@WGWKq>3ste4G@v;A8:r-j) dm3db ,Y625P9(uhPHP$*m&7݊uN.|u SuLhNU(eI;*zq|K謂zA՝l ߧ_ަV{:G?!sI'A_*HӾʃNWpEY,T}nnfv#ݸ>׌ba&N"=ӎ#DZxd p>A%e3:: Es妮硼`w1$dAqL`@ 7e:8Kv`le ٯ Q^qraeӝpͦRTeؾ^,h2Rh[[KtV#Kï# l0IG0~ͷ옲aGlqgR3!Mq:2R iڼ!:yK/< &b!JȚ͢:sf%ACv-7r6}rx鲉cf=63E @5fٕZZZCK]~^oǖWE,RuCG,zVR,4S32^}$Z/3XBYx!3f{)ߠ8FBcz8@$6YEB(l-[_KC2jG G|mVqt89[fK"8+ӑDCQ_l͂5㨜4bu|)\xG~ؕ*GfBuΛhdҞfH,{(A'L \YC0ϫ B (6N, A%k1y/,L3=ׯ]qk6} })Pi˛쿵< %؊Xb4ZB6 \ Q)K?'I1afiYEliP>JѥLAϝ%k"=|?K:z1}; Gp9RG*]c}+٥_O$(mTaUq K`RLb;Q}Yfb0%ÆŔ.[> K=_EE?M_K[gK*3fkf3\t@@#~ylDC'xJ-6zr̠7$Wd sm~r|&^i_n3`y5&|Lr'0a>Po`|hkA%-8Lkk' Z74lVXY g',iaE2Oeʖ5Vp,R~='aBM͎{\YGd?"@ٳ\{ƲʘM,M3^֮S{Atxkw{^a8`_68/6w+5!@CCj 3 YCEi%S8樘5 Um% Q 4/5]XK"9EQor46% 0Cv)2%g #wdSa~f~!GB0ꗊ΃}arznGn׮7oCQul3y̏`8%)>ͦjͭA1\ۀ | RMl*R"H4Xn D):*UiCJg D7X+(^n*QQ=pf\_ DJB)GfT(4Gښ:H8E:>Ā?ˮ \K]%#hiZBcQY{ ]!J?zp<EGyEΜ!j.J=ϤZjoRX"b#!K'>8flwsU^Ӕj\a5' ʅ͊W! JA9Fe=~(NX_HIfY_#U5m[ ,A_]OXp@ 6KuPXÚp:H6šnobcj>wİ ` cSx3O2&n@c?6te%d n7::+ޤDn}OڇљvWO 3lmkrj22;"c)PAu(4b7+}Nt6.%]ã5Jψz  BZf Z.N|K;w>i/ T|#TPf ,9pVkJW=FR~Cm O@4:]Dsgi3z.uNٖAT֎Y;ulJp qgF9|e恾"Cfs)IzGF27tӋ6MwI :3kvu}e(q(hvJDuPG0$!!xYMZ)XO?Lދ斳d~ ڱ~:ϐ5úF`6dy~Y۠pgʑ gٵ6 h636iOp< r gbjo;tP5|i8F_:,Kt}^38(༩fqRNp1zdsV (' S=& ݂QJ9e3א{ƹyu6ĤI,N4MF< V-/H'`|9a稦L虱瑴0t1^6]Ʒv3 4dTf _Y:v lo6~SncU)$0e2m#6uk$h&p{[gI$6%v}gC!qZ@12%HLaA,slfi2YFG&$urdZV3,83D3>dN'183=s,>2f1^DMzP2lf|y^tdL.aW'~Nt*;sLL@> щ0&&FfAObXq` h2j&(,WҸ(׏)o^0҇.R`vL]9Lw;QgڙL_ L3"*1݊׫ ,UP^uZ_E[7&'"2?D ~\z!3{dZ̳EΏ\=fz15t[$ùlξ%IUo?lU>K& ߖTbc/Ϣ'?ӗGLVl 9V{3Y'k{}&uя'% gl:8<ʞ\p.7[BR‡$؁`u)!rΌKɇGb2MwkXz_ޓY,.Wx;RR`4Dq]F\wvbTkgu,/{gi,yӇy! 'ddLvʢw=^VN,_<Ʋ,T({W&>T*GGRfcYfeTi+>Ȏ48?نJl7-3,M:OA5a(l]O/ڠD}RTuq* wbCֱ50T,U"M(Q:۩PdpwDH}t tЏͲ0RkwK:xS@o/_@+| X"(gi07 uKR<7hAqФ\<|KY83bB=P_k)pߵ5bܲpSOoTiry4{_nKx,5[ oFr`5|Rd]3="d̰/$hy#|k*Rku8hpnvD."%4+%]ŸM8P8P۹8t]e0wQ4PG+cl1]7Q+(x35)ȩne;1`Ye @wmIfg&KtԺ5Q8(Jƴ3~.=]iћjfdQ1ǦffUHE8I*ovVl4\ͦV,KOFw` fzE#;kqYBϸ}|Y#pv)|8XdNp>?DA7j rykECEJpry2.P.d~fȲ<"(x@wdX_.gc@pb28=/zmCsziqL }_'f=Ήgsl_3YN5ތ9[D6A`(ۊ,J^'PDsik4u X T3#!\8,:1- Hpt/0>@@g F쬵PKq?y ہuRqJ jnL4Efu{+E>:{6l`uf}SC @]ZxN}:tMadQaq|GRG3di(-G鉁:LKQlpݭlAc4 )+"gb~}@JTp8E6|4lH;f.1})ku`9QCƇmtӇwv07=Y4xxe}Cr5̀ӲB2kz]gaX?m)_242 PݹCK8\8T;8p'Is ۛ7üaz%d{eq!M 豧tT_IlY wQ2ݣs9L2U5QR675߾Ih65t:CR paY}DɌ"WÓjAaNfǗ440٠rW `TLU )$t;)].{,A7.l9tn6mr:/vU%j]Ko$]65S~F<_gq__OO턎03 V \bCtk @S@&ߊ}XbZc%|ԩ+OSО9FBpl4%ٕ57Chuk v2;1ΞI~qM>c;6( !] /aԟ)$5mmAw)MA+}l`)A/bw5l8FVg 0 tRKOmG.`%xeRݽ=魷^ܷdٽTڶE^4^$sp>U<d >)aOs93r|~։$2IJx;p{qޕ-nCYL_mAud#[e:R gs&Jȶ8Vt6Sڇ"cN}mCM쵲8}~&2e}3u3ؔQ_5&ŬA$L2cJ&Fs +gɘoRy= CK;q{ `,kK6hw4-r aL^#e v|{yw8|6071:$;w_ߔ`e^j?] e]NXӈ(% Vɞxet7tKGsEgl>a᜼_-C/߮ /,{:=95F۫_62d\l#{4ތ+=<3(CFKdJPByl)q,' ۊ8G;ḶBLxedb=+w49lz}ƺJſ/?]A<_??ޯ]Ɓh9rrv58|bOb5 ]pE ؈KtύSZ$n=_dM<8igޣlYb>;s(PTѐL͟ PI ,]z1t%xFlIȟ~۠.p48Yd>O]xtG!R\; <z=(f zjPdTZ`u3f6/)"qw=OoZfRVDסrg7i֦% KQ`&݌%VV H DȤ(ِ_㾨/}P"'613cifGgФӁ7ѸLiJ V9p=QL,"vu=u(oP =SxϾ: rpNP'8U=Ѹod&q=J݇rG;3d>?z2~ō4); g͐@.n}k8teؤJz$=@"*jwsZ&3ҙ9G]—CI PsU@ G&Du7"8YC*lTjt y>+泽g!D` @oZ~ϢT_R= +-XP\_1?)/ HGm-Oe RL20to]62vٵ&8d}[k),UGgO@\}Sq t  W EԒ(j/g GgB?(WR=MO30RP7^{"zH[%# jY}2jz>=>9>IwOG9.xlM]MiPG5>vaz_⿵6Stg-o2c`o3SP%3۰e[K,g3n0Ag߻uʕO&\{#(Џ2{VO+o_-:\>hG,?| "?,O86ֵ-nld8`5j ;7!kyDA GNrITXƽI%5zjwt==ee!Y,H8 }aX:bGޣ'La0;A7`{&m.8i=PN+il盱w_ iQ } k'%w_@|i͚G6rȘ2uV> "&g]}+Ƹͳp'Y;k "֐~xdGq! c&؞GYf qa#id,~[4)OBU8L3v T"ĖGsKF u:뷩!Lׯ RGTn{ĤhEa}AKveQiX 0S@d y6$ EĴ޾:PrDaت<U R2#ȇ$iTsRqs6T9;2iG>ZnF½W7;X@0[FX)/ME2jh* |P6s #Fvh4kmW^Avm̩!<롓FDIGoiz0pN=S4:Au83:3Uj'ŜgOaPESf. n QKAtwFkbzg7Ψ> 7RKJ{ N1zBF{kFMe6i#|fss+g\ւc;Ov?x dkr'0zdz}Cqks;) *:pg)ߚgiBZdq|fg]\ kOo֚,lHs&ا8 =g3J&Z2j Ruc4"5˂@St Yȁ\9[/!H)6vBCc=fG/N{췀!g3Wn=|CS==u_ z(=3'`DG3 ;=2/nz/>JzC::}QynG{8-8j*#\ho:24Y"ttO6Yњ -#n#9GSF O0M,쬄Nd zAh==x4CL+W^~A~M!o{֙]+h~*s3R,WdS_nA3H ?+c/Jbuu{a',wv:eZbn@:YF]d 3P%` GtEfIa>" ZOߊ;It)U"C i:) nF uB:^J~"*D` :8#Laϗ+Xwq_/E}S)%]2RVz^Y[ k)i\ VȦ쓠gF=7 ]߾"lim~Ly]b-7c}iCΎ !m(@QVUnϢ4A'd&}<1|  ̺G2Lq| mJi_cZ͚g;U}#a+,+!,@z@1Zsp Iߊףdž\;GZ,Ok]LJ:!Jʋ:G@?xϪ}3 h,7g3{ɦkYCFN'p/=Թ&lB-M77=`ltSdd mZop)2`;5 .MϟsYcEM ZfXPn\g%"m>>>ڟG947Q86ZeI_4RC&Nf(݁yܸ<3_xg,?/ƞ>x<گ\ڴfeiԴxt֎+LS#A0!P)8`qlBG p͌8=܎HlAF>fl RUVuhb:GR"MUr@Te?&a:*8@hzpq>}<,uVʄse e.Yc-Ԃ:[tu<@0Vah4ud*1^6nfec(g;[sʀNÕ]Q2 á14+=F eu2W` [cf ur=VZ] fEͽ_c,goZ,5Z*UF)NAy_wK5B(3^EByTVa-λ6UX^hg$BU<@8~dh>eR~7["YІLN[ l:礪(QƵm??:&3B8$>9Д֐rȅiHf ^@I kby_Zh/ea*qڃ~:uˠ33aqѨor GۏͰA>(&ܗzѱCӯ?U$\h;دtKJ/b% _\g0{g2 jsv(Iz2IpL#Ozb9}Ț i,rXzs2=8 \EfSl AS^~Iy wchWY(Ffl('q]{m.l #6#b.^O9(kob`,:Y*u5ua)ϰMQY])POIU΍`7(HgOa5^:ױf"<u=/}}ϡ Y})3JS䤔#ҩ2SFg3W[ _ǚ<,ΐ&;bCd$Pe n e&Lb ޏ~n5:0G="`>;~ Pʼu 6]p ) 3k/=qymPEF>>מ?ϮZγ/Vje6>$GA5I [o}U@\_9-QAueGZzgC7g`Dl طB4dQߞ.uO&]gV[d ;Mzu, 0%@ڒ 2 ) ؀颱.L;@Ē ]ndʞ0Tbzy1q=`o Nr[yUbBU;.ӹ+3q_eg\Ɔ+GjueGh78kc}XST`c/e+G\3|WqXβ";o ι/?<$Aq'ݿ}pwx`(3}gΦJ_}5()&SD{1)d`@1Ud#D6OB/ 1!XfE: AfV%(ϑ$PkZ ._Z[,wN*$8d9,@4́PAX#c(?S4A3Srw yf P|hκMP(4HjmkZS<@;XY> sz([M`Fzב`(-5χPt*ٸEEѕQ>h:fd)B bҚX"P3 6i\ۯ![5!GWNGZnMdu0J爀p(2%*7]I}+Ϭ}l7qo  pZkӛ]$nζ`$bx*l\ tȐMH}6(WmSˬ`1m) 9;ȚyQ vX"!f^49ͩH?M42 cBV*+u7V.34a)A!i 2a3ܿNEUCYJ.(FaAsaUCUzwҹK̀&dٽzTThdkϠl)ʕr76sD}Y(,r,m_֦pS#$o&L-HsOP\9& 8-8 z7Nנ Ѐ8 FLQeD h z6cd,{2,YQ*DX}r 0HV3'uOO 3e5Y9`Bf͜dD;k(YAYG '@O>SnS_VUȓS9dq増(818$;A@FɁmC+htv?L20lMCʹ6 E݁S+\јl(6%t:^0ޛ5!Y S @K[OWgvWMpVtI\ǡɂ~3 l,E}޹u?vLN/ Ud[sY>V>0L3fnZX.'F6P*2o6z_s.A暖mӹ{j*L P{6 U}q(HVyCsCҐI__A* |D0-h7C>u)(ڱF/L}d8)G8{,87]j 9:&4l>֑/>喗 B ̗YE2χ4kjӧ#UPQgӰM(-,a-J6u ~ŧ*5(oa|EI<8Ȭq`z{h;IH/7UYF f52BwQk6^{y;V2}LСeVM:\cAw 8*M Зb<+O K=mӖtIM)z̙>Zfj˹޳hu4B"|K}B~p(+/rW*UύHJvJD#L !e5t_]#ΩgyR37 rrȦ&5._:~]~ԫOq>9' V L2^]#.z+/؋<,gWUs~=9Pj}:Y?;M@r;/ZC~Ӓʽ+d/'Df|>>dFQL,jrP=`fA!eYklvpmYQgl #_/}i)Y~ׯ'3 ̏3EG t Ju!.4;GW\]fc,I_63̘D`\o#Xɞka3=yL_ @2lgq* fOQ,l(`|Jbq Bb ' NY|6kk"(jq?RȖgL%@^[ #JH(\3fב~-?fk_)5=X@Twz5S)x{8qg c?)eW .A⼡Grq>ɍOG}?ӕ i".-Gtuw#dDǠ|1D̠ %!v):n_"X ΃Jƺ-W!RҟèoDuRi6:TA~sY@[ BIoI:{fUf-x+i.tKm3cU[C& 4; X%c0_59 4i436B ,m'Byx+Xf㘨 Zۧ"ڐI'p2kT~fa,-`x;(]i6A7Y]qR$)2C8)E88fpͲڀI+gYVA/) )kۀHGD9BS'T ζAcrrʵqMV@fg9$^YCRs W ІeLV)3 ` Fe¸"K4ZbЫk8e [z &bfblIaFP'6wCfP֣S|Ƀ#|jA\Nkz"464sFGtb쑙9Lm4I"M=uյFX9It sTu+H7}}UDCHY(IDW~0+u [u8甂^觇vX MIr}'?ɡKȲSd$Ě1IO]6=bC$vr2!y]d||KEpQ9 `j_p{#7--b}F'{2\Zgx^:⫲?5bْQ_S}v>5FK3De 0}rr|sm˞+U|GY|{XR32Mle AZenl"kVVs >F^I=u{+'ٱ `^ό`|eŧ1%P}WzXB%@})X =y9(7U%GNPQڌtiKV4>/3x@͵lN\{QY N6~ g{nȁNX:׷ (S^y]Z0}@= Ish9zVΦ6f!f>%SK7}N5y۫,z?.?.Y@e{TO!ML!&;Mooof!?߆?OGGuE&\][&$:>yo]Fًs<{ %Dhll͏4'?1oE< *xQBojc+5fs4"[b|91 iv=K԰ډ4Q*@eR6,HP"vWԱ7ïlHfk{7S J#KP`ۀ2H]V~ FhZZMq(- n+wMM役9BfjAg9zJH$ӆ;8Β]ThFyhyu6یhϢ:TG&Ff(G18:@7 Y6Ή*)QPU}~* Ks-YC.ϒ~ɠ^GD/@Z>(2KsauW?X P<>i\ ws=OO|ct7x_|N3} K#TSNc˩}&|uQΊPe|e3d| o3H%I>JR(﵃",f2d06dwkf:,O:+fu;"otl2( ݏCO\<Fp~p6v2;_jkqdq}>Vz~{ 8SNC|63f#Y#fu%ܻ]@y&)Y2m shS4Yq}u2<,͎%gC|=iL]qsb1'b'0O<;f̤l:}BVBNW1OF~LpY (=ٷ\#Zpn"0v̓!fs=l圵Աf,PWݙф.&K FL&N3s8қ+/󬹰Fst >K}x ̐}f.)I@V+"Y)UQi. 起߀YTE kʺ3hGN*MikMPhl@^55XDpS,` {9Bö' ؟w"K_~%}OR ,jjIW\Pas]8^1R`SuNݓm2Oрg>:Ք!,--Bq"UQnF/gRFld@c"S$ 8iW&d&EH'd=Q~3梓\ԟFGFpY4Zr:lW{r9G7E|#:91NþW_|Ʃɏ Q}DоLR?Jm6MUPy- ?|N.9dp3xn{> TJ"$"M4Ca^ZXL=P<Dtd7aRMl%R\]Y<6pe.9$avk\.^ͭEMiy}2,}$7&_J~.ӵooGuS8_P)?ޢX >zF.fb h{<t' 4wa䪣YxlDD'Pz iِh1 W\iv<|J9ϒ "3$~*2A螌=E7me/`HLπ=xqZ^CBZ&4u!|[aOomຢ"KOdb'p#I? B/*0l0CJ;*Pcğj6_փg/_'_8AE\~YlOyBP?e 6F|!D6aN[ d `0Cbm&x?l)=Fdϟ&Ͳu|}WЛ24(gT'j{'O@?RXBn"=_'I,dG9ꮺZd=h?@]_?l&Ȅ,.M*%4u"vho.Yf m+_c9 } o(c{(yc3:^elXY;Qo\_<ه s7l!c @U Y@`!-jE@ӿgIY=\2&8 ?C~! JP2J<:7[| ~&hA@U!pN=:Ȩka HT8eY%)dҬS'#05c ɑGA +#8aΨޠ|gU,VQµ4 G-L 5fq̺DpRB;?{T"̸cttzȲP?pJxpbAo]#cF+fa5k 8"Pҿ'Rv ]8Ov/tDPPf5mÑsͶƚAFkl{Ae ʨqP,HKKШ4nfifat"FfRaz/4L'] @8ø3eX,A-/uq}mtmnDȉLH[PP~G: !ŦtK:q1e RәΒeNNk`g/pf8ʆtI@ۀ̷gyѐc]_'g)]!lwIo3Ze$N< l'۷B$={0&Z"prp2pڸNi߀} vd0RN$Y6҈3P{"#Y%2Hx# : 8YR1>Aa( t4d:, uOdot}8\@Rжi)"pPO 0EC#J8r-pq(rayFAz,"ߚ"D; avqٕx5NOt1,{q gQ]ȏ%ܼy ;S}X=-E^; P.vetHzA`0aMK+@i(Q}K[aPIA'.l76j|8Nr*cN7Ed >0<1g,,|'t3AQ5qJq9أ:J- Ԟ.Lϫfta?Mkiab`fKlulm fRП. JA`Q)gCsb+A>&=2ӿAdƈPb@&OIz|9۳m]gGn[!TuϰwϨd Vh)jJ: ^Ȗ܃]{ ͭfb!)vyȀ x SQ91x&CX0ᲃn^&g{Ӿ 5YG/`[crCm#h/{+.."nBM1[ ؓAUŦR ¥B2OGTXۨs"p8AP_ [1G% jxK=)TV\6BI&( ]Мى0|E^BHQEІ,`-'Lؔ5S{j@OVٖ [l4::JwZ^iy "Fy: vk>%s(3z = ufa1Ȭ{h+g[Q{45:BY "¢ ԱYV[FFp&vȂ@ktPzf z,#~X\ gsMI>1}Qi%A.(-`hpvUosL.gDwt]8Ylk adT8k_ 8؜s=Y xXQHeWِzm}eK? K7՘G(*㦌sd`:_=` `A|!`OyZ3w6~Uڠ-FuXYXx 6{T - ^)k[g.BTZK8rՍّ#C8X1,@BgŒf FW?Z_Fi7ߥY:gΥ7^}{CYW_%#څYC7o}nXS>}YFu`mP7^yjNj[[;AdX#sO/&J`*(,xY]T;x0Y`s͔]؏<`oM29#f /vO؝QG~CO, 4֊P;8p5hYZ#sJh&0%ǵr?A*C( T3q?̞[c:ڬڙ5ئ6%+P9>=nYF]7vamifyq{( Ga9]o<G(=JsVY׻1.ۅ@!q9aCr)h#aMMjQP^4#Xg> jI?=t3dF3G'[-Mbm)o=e$ϳ K/DnG4)`ώHlA1֙$M Sr)ƙGE<*Y_/+j57S=w" Ѥf.;fM; YA7WN`:kVٟtռ~+o;0 e 8gl2uM(Kyu wDΧ71Cx;EL"3JgIF6I㟰Od%p4l6_k!SZe @Y E;X u;aM /x}z!@I|V72vI^WKVAF>*Bb!X+okmϸ#16aV. xyhv_רf Ϣ6BӦ%&+Pp#=~ӌ-\_[_J } 2:>}{{NoݰGH&{)u}e=i3HuEϑ٧r /djj|l/o=~dS~ӿ\to<xe}q Q3}8K(R@ݾ wGp ]g/%g2T{q6bRAC0l!SRȼ qȢvmcGGo{([T8EEi\ɮ@ة "D</N#g/IQ1O!r Fp bRwg}ɣ&d "C`#m]4 M ֱk :Ϧ˯^m!Hj0Ve!0au4 8v B&km{ ,?Mo>KWWUcvbvY ".L ą 6`YR!u3==]MVz{o+Pɩ4Ӆ6i0)#ӣ]7L:{~F_iua(Rw<"xoK 0*nn-t޵+d֣f<k1 =]Qs,%`YjafUJȴŚ۬MAv\!k$YzcpT("<`t4y)(KwӻU?/of _T~r I9 > ҹh!0! Kh-5\Ҿ9]&k&3 CN8[Pgo4<<b|ro)'M4f t6|́~<}(s_*c4 NNdU5Jʩ{zV|9_6*;lQPs\Ρa.œE sya1Y^|#M:Loϟ0 @'.|k r<;z-_Ҥmj}N΂nӸX{ك <3LJ_;ApC#Oq{wU@%tր@'lPܳdG:K]iUO'Fp ދeHa먨è~S2&{^>g Ž?y n512嚽Yc6-_ݢM5[BPԅAG֜R31>`r4ﳻ';o)?d_>lMYFaLy>Lsd 4pܵ>t ZqCˣ@3H=)im]sri^:]HL樰3,,Vӌw9-LMl@\o=Qn9P,mi]CI, |v҉Z2_S #5ݼzYJ:rYo&si>DospB)-Gv+k~u9AXG2d PV29TϮS17~#-ӑmuAM#[ۣw{XsmLs.uG%u%D1X og:g믽u(wFJ[N2!;* l e䍥n@Z.9Πz5jہ?54K<ժ3^} G8p޵Xm;Ϸ{ko`/H{{vsC=__uYbrPX0~NzUyvW 'BjhW;}}$CKںQYCQ $1PKJ5 օ0u&(cYP*Frbe$ud;oMi05v&E gS?=ٮXT.zK- Vd潺۰ v) z7 ٽ9[7*9&{+fZi#\1 YSwii/ 34?p| l$]cMlY.B˧۱s2t7]Zhz""'MIJD%cmvq@&}ieG/?~;3㡼tj>/ch-cȴ*ȞuOGY4-ǟ3)i"J \>\^)@Sb3cT`*zE GAc0GfQ2ѐXv`W`auʀQA(T]#RVCSiRQa`w͇vyhBjhnC?KJr ZTM(=xk w x0[A'Z`3H6A:4sGs;2/CXC3k9vʅt*-pzg*Rz1K0(f&+!k"pPNkdFRTꝒʇmí<W.٬~Y4ˤP 5ΛdMXK;[cG@3+gӍ[1 ]Riw1 ѸP[RNngXV-ag_287>RFYo_GB)dMF.1Q,.f]6=>E}O8 fLnNTkUz*ݏCJfc,S0ptw7>dCyjwq/ |0 il &7pa,{o Ϝ=ゅL MC\S~R7a y¡PN m*d`rrg4@ *N?4uT'߲(K#eyP5u4>5/j)՗f 6^lUzDëv9ó7R D/`lm"SX\t46fe4 YN|GB硿0He̖E2ܣ9NZ&T"9 VG=%.mR{iB"܌è^YB\;;ӣá9pJ/<=EPVHI4f`AFke١`^HFf̀$RJb;~j,s_d}HWZ 8tfK-/`)pM|cl<ۄ6/F^8A޿s/L9.KkDa=~]<;a#V8{:^BgEC٢ @ >H<ls( ѴǵK&=R˯\KWY_j8Ԗs^iCv:,*=,Q9'˓MbL=gegY4O\`AƖ4b`g d-LXB)(Lp,rR:O@,aeUA 81A0Z}XE919q!=ÎIgpfc߲m{T O'O3zQ ؠfPSia~Uևןsj V=KC!YCbI؊KԒP:f&繧M!tzγ uUL=`kʸ6Ӻol`{f3`dz]2^ly VoEN#~]HS330Tuۻt[FՕ(⨑Ǐs=s )dJ]zp%4' 2dԃ-_cؓ]8x|C6C]g0') QĘTJe, v$]\N/slB3V~eƩ_[v.(;.Ic }Q.~dYb~$(WYF dE |fAa7zڳd`0~e߀R\!2(%a;;:x>s=6;s[J ZZn(`<gYi?s@ǺłQs%+j6T&$pq krf<-T8KeY&}Tu%glh_srd>/群Bُ?K3n:^bFpQ[!2s^24@UJ0vuJ43* nOLM]R2u-V1Z>DdyH|leK؄fDU8Θw4#/YA ZrtA9,HCGOmTv%u.X:(prBӃr]q|^!N^:tsKP_X ZبyKo.2PRu,vk|` YWǘ4=ɨɅ~)4|-0sasr" p[J9c _*rtΐ:n3:-158z)f"tHw.Ÿ*~AK;*|Ml 1:݌[s`Z#hO6I%`!HKkc}S?nC\:s~TL?CdpA,SCKK8} `9Af9`[%g2.0Cd̽, Dv{ϐ{Ӹ.Pc!Kfx_@%_GfR[W qzhv1=~4R`-Ycv@ Lo:mHQXdw1̖# R+p28,]\W p[881.磋ghַ %uNۻ!Fu 12Lffc=˽Ba68o~gb?2\#YC}Ò(BNP9J3Ϭ'5ž˦{0M>~)1ҙd;)M1\ɠ@\F IqZ4Z׮]Ѳ@zz m2@@a|״~mu-CL>>5إEfbp}c=_u:Dm&YݷNԾ6^ W.z B,}t92=7N3+؛o~5kS}դSh Y6 kvP\mt]m+`#K%eØʨ9ʑ[@<f 4Z#CSLC8-LϪC9 Q Ť5K,:%Gз a=Gk|;}„Q&(ؼ CC6N?ceކ~RpF"chկ-t Ԭg+&UG M6=kf)mc4/&"Umk=K:ʱ[BGjQa.|sfeϑQ~EjՇ!Dct>ѷ&E[{{drlG{%)2H@f,3}SGvWiGkyq7DIҋʦ Sg?|{@]uoE]h|)pY1xĎ<63<|>g=<ڤI 2g[JzJ@pd qLfW=O8L܄T)>ӁLKO=H`s*#%i޿HN'3`r/2ew012Cා?dA'f,K+W=d7kGu%إ}` Qd@ֱ6Dlڟe?sjJ} hp_okӼmD3  k.T"Z89>t12Z Y N o+J-CY J@#k#(GCՁ$*FAr| Uqح MQwn$IquZD yOG72c`+/dl[Ol#؆*NѲ1G? 6ȿO> ?Xn;n{9(:Q#Ԍ0 ؓ%VUT߼y\!w7~?Σdo[ceuD8xP*KWq#ЎW&;U/aU~mœ䨹]tAJl15^y0%dbT]Jgא˻A[o}f7CXrje'ƞ/k.d{piq)Ja|UT;}uU't;خ֗ 1M)ȳqH{̵bB[8DdT8:֖$N:ԾCݚBuv Fu@tl DX>a諔6,]-(vB ܎#(@- k @IDAT SCaŠ@G3qR>*A^^D@/86m(-^dUu T]cm*~ 1KlGQ`|N8| g<0˃ E9SBЁ(+/BN\s2iB4VEi,0F;66uyq42Lڛ 6`m@Ht>QKƦca '@(aQOuI8'-f=p͠3:6B:Ɉ iX 7e! ߛ 0Giy':4Fp8~g:.P\.:$s>OgL3JګwGe fi~4%de8Ӳ)6:Y:wf 8[d2/JWz}@%WPܿ5pܞL2Y1l46TB@7ut~eɩI۔[<2K4`7+92sfvqvY6 f=~!N5}sJ cFZ,,M? + (.i6nEsb9SZӫo3i WX]tp/=lP0 }[ 2~\gI_zg!--Qf\&F̄`{oD0 KͺsC+23>>Fo[4A-`1r`bYp}dou@a-J߾/~I|6BeHC97q p)H)6Ή ӆڴ7wNq+DUW Z~uη2bY T8z p=&֖T74b:kehPaJ(0NӕPZń7JT#Պw,`/f7#!0n10n?(`%x% Q օf6Țȶb?%o6Gs dۛbe3eH.xOL s3_Ja`DbǛk ơF˼{i=NI 5* wQr&'iFI0eI:=n,Q?f%W5f-J{3? nЙ" i;mU"=$Jn&@Eǧjw.ap`0٧fwR-y6N  P9l||ݿ@:_K mmBø.2Cy1 ֘']|u1˶uYOFenBV=ᄫ&J}/=zBg8p vh1 T{4Bl zIAXгTh8(O2 :5QFgt׮\D0,&b=;nt@>kZYZtrFa\|F41I;4TX!YM9ht(1k2u<Wѭ*ed2RvTtrgJg m 6lr,u+[ Nq 7*vc'dx$7>1~Ӡb&*5^[5N Xad m(1MAR\ mGZN[JC'7Aר7#^6a"#DcJG݀A3@ FCNpb_Lv&YzD_LLXbN8d03-|τK Հ|Scmuこk-(zd$:P݃BX#(J"QgiƖM lkuT<4c8ؽ3`4Dgѡh㭃c01gVaﲏ64/Աk tHʞ9)Ǻ.zϋ63c #GZN^8y1M&Mh B;֙ȾLLsdLfs20[3_fhu =V4 fOv*K`W+{=4 lģ_tQH\mnJkԐ#fJ6<9!7[POfD` Y~2A"kpq3k Ivl-*HXB.-=},=} JޏWoʙg%r{ęc ӓ;OӝݎTچ`P\Ȩ\(礛7ΰ0y~ޅ=Y!VFAP/eݩ9QVCs5[;'$doJ3.!5zRAݠAf=2M8.^3be-=~4m D84rL`>&DO=2ŽeɧجOhxT>s% jAO/1LYܑ;@7Bt)W~ !^W#"osp272lf-س􇆺MǏ&}XgoЏq"chWo}JAb b1 )hcn@#f)X!a9txjv cd)l{@2h76= )AɆmV_T䓏O7FَNd`,RA g@<9r0jΟR=hp3ݷ쫈}i 5/dFdCFv<2"wL T ="Jc}<̕[p%pU\u߂*0Ut#}an}| QtSv539uSNi:A/ͱ/H (z0\:frf129-򸴼np Nѳ%e#sw00"Xρ$o)NɅ:y{<ק$F`ȑ{<;✓V4k|F=z^dWx'k寰*w+7Xʜ\>|D^G{_G/;!hH2h.Ʌp,WcvC[k^EF>cZA5} 館*EϪ*'Um 2HO5|-)-ede7 _a2ܟvelL 9eMOS bcmC̀ ІF֟?ϵzBw'+\3U?[}E=`Bu3D mt*>at]p̦C__M\L[򻣽| Mi$R6>3]9߆kˀ7@P. OE8+2Y?ׯZ2dD>F]4p-].ꀙkCpM!` TѱH]MewqD`{ [šz͵76%8XȏBlƅ_yeh{PHO:P{c"Hup MODMmZYijh_ƞ&CKS9CKgߒPtm%$}$\8}Q*a6 44(j{lX*^v8GU]e!rs(tIӷ!`/AqMF]}f+{նOv @.446<W.=j@< Z[[ZymIh":"fE45* $3Qna73RX.t",QtN͢ 0ۭК!*ё5[Ca.jk"“Cs0PׯLu>yNzxS`MѧSt)Tk[' "R 8*͍uhM`kzrn"h$8QE?^z#OO'jNX3 @y_ۇ dooaMV4 T.UסTVB,s8(]c{=F'WY?8\FJ`'q'@H跖F׀g2D5}=Sǧú i=~8s=(c@˄+dTCh,}X{JL΀򳶔D"NQzE3`iD#?B uEuL$M=| l#!9f4t,oFW]rC&di-1K ȧ41 zg{, Rrkl% &Mo>ƽ?e:ͷ6Ӄ;҇ᅦý3)*a֭&G كV6> "k%($Q]Z:WEݲce|:>,28xj:EaP8ְEcA./ '`j5u;Gꕗjr qq&N!?[?!\ƿ z!P-1AgQ=̱@`?Pb#H|H 0p!T@IS7٘OfT±o7X>Qۦ piHSMGQWRltjj6r\@ &GdVe_'GYp|GaY=eȎIֹck>GPSR{Gk'͕j \w6|[Ѵ|rP!\@9X:(fWf/ĞuD?#CƵ!of+Ѝ8z 8N[ gr[ ;f' R^SoA5-e]k2%8.!@}<\KMt__I6!A-iP1?Ⓩ?I_GweRZ\M{B9"N眠4Ph \Lأͥޟ?8m& ˂ё at vsFΖl"kdϭ t(nY '\X\XkPXB_R΁ue )z^{!^:Z>> P߉ݫWiHL)Z+#f{kcOMQ8g,.^ZL !dl8&2<XC6$O_Ȗ)]cyycr@JZedzLH՗i|t)FY<" _=4kmO6)vMl:zI&pTRF-Ugrޖ 'z P(] P1c`:_W1e.4k$V`I^,<]GG칠$:_b>`75nEt khp WYX }cXOee2cOE\R0g5!W߅~0(!rƚ܂nDd2 ;0hb^!7 -R~qfXOD{cbiwa=&)OR.Ro\K>ʳPo&X֑mcldwC/=|h&/>n>}4[kPe', ݤr/c}uq';q"ǒpu^+ Z׽kȢCmtN&<)c9D< wSV~{iA"U#R嫻 hkWO_ҿ~wvOݿGs]ovNLM[;2HV\_XaыVg 7^JU  @h!ٕCPL,.ʘ\ V|5@pQfl@5 5hfcyAFZH`>uMdWp`͒gqDT*Z'qRh=#D6 40k_"0͂f&QDփeh>9ncth:Yk&(yD^`ixh(p-Aɹ/ǯelTcTO#ŵEOkug7=C)z;fvas0 }= 9vsg6N<"-5pqp{KИ[(7` 2ʄL*{kfB@=xll1U4XR " *#fsl(.RR7[Uf4= Z>]܃bkj) +4AZ҅Xe\M@*y y3iQy_j7\+c__aPOB62< ֈ 4f(#V{M2An@}zgB*#k {֚ TؕNJu0+bl똝]x/7F3S\I# BfsI?c9ԡF8E.PH &:ٳ>Ħm6v=!8=H "\XPϲ d5ف\}Ӕ93c%qOqCNQE`UW٥{s~rR:f{d۳d BAyQ˰Vƽq6, tˤ.Ӝ5H}b ^kiY.PW08D!6 %VdJJm->GAޣyz~$hzqTdk|p\`Pmzhv8=,C&C)e*2kiO}t {t$jޏ1\?Ncc]EueccG-,NK>>*,u"( 6xg wgzCR8mzA},`-Ι2Lq'5+;yV3_[G 3^J65FX%|2<7dm.)_F>!c^F+^nCNZ@dVEVC,alegYGoбf\lDifHk^7 K{IYh4t/iH3Ahޗ>gDfҼ٦,q%S{A9Vϵ%@#8k;K ,|G,,lTgI7"Xύ j(A  [m6n0s[Y pYߋ,ܴ654۽F)%2W&U(`$@d^g]]+*bܵP'l%8:tϥF%))T6([6PN!W]{4nb|/s6_X_< K &[}@8*_cFLY;=o 㟼OT\K&P({³C="hSe'j/R@8l<2;z@۹i@X9Ҽ5? sd*& CDf/JdRsFV6;~>VC{k3}*+_LRۓaI"2_?|%X_%/Wo &cT"[կSX¡:"Pȸ 9\}YeRcw,s(OkGT8"F3Fu FoǫG3^_!8?)P}ОW_C'oj"s|o`Ua² Li*PzS[gPHa {blk$nS:)78##K6\3S{ >2a? M>2'`@q>O_O},€ ׯ*biI1Fv`{{po^k/kge-A ]5[zuA}N|/O];}c|\O=s{x^jk~͍W6E(;m_?hfW N>T7~7w9R%K%P&@PYxCp DĿM ZRG_ט!^S EPilSPr.NU HKH: up;` u,4t0^ b Y@폢=: jS0jv]$cFG糑̂tBlM؉AOcR@~th=D0IkV3 = Fc!vvOpFumGwC Zx'ǔD/ ~)OPM%·UttǁЀ/Ш$%k'F'Kp@Ƌq:kЅqԲS^yZjzdWH/I+'#^>7U*^p=G ?9AAYCF`_D%{{XGf53 cGɯ=Fڿ8f4 yTG Ƚ!sc_|2lח+ȸɵ| /bMMyȪ(TDYU9Ƒ Bxd|QXh 1 {F:r9o٧@E^^XMKs5kfEpDɂTLTHp /5BBq?wZu`#V OpTTqخQS$e/AqvzvJu͒p'`RR>>7 5\姏>!M>β ‍ ;K '_{ƈƵ8>Q3 ȼϬ`2]$T⌸Ż%+؁?|CGz Wg{wzq} (v%_=y~n_sMбKV0rn.΄<-)6_3EvWrMwiho}73ΏYT2@Yxce&"+=Sgᐒ0~<$>' 3 ԭy5(GnR<>Gw!&]' #k@4TKξ#ks 4$qԮW{k'Xe`'\.0)3˵É A)->2b{;d~}S/xȵr+; 9Gd ۢ}gl{Gوٷ#X@G/^n?3Q/_z,dsږm'R# * !>pYbS:K+lUO?àMYsơp+e: ' @ e; $8Z?}R?2TiZMkx/i- 7n![M)(reo1t"j@ vį )$m`GA6R R ( "H 3F].\yNq-< L8iFyeLܸw6m~ACG uB*&Gr.yæƜS6J9TfeY·% /ϤerKqee1[0軅r^ՙQ_9PGh[2r}~R{YtI)T;bbNmz;aL8H/fƂU,%5QdXƞx%cĎY,'ȯTT ӎ S.veNv?=kt=d#al-Rxleu짶Z졙y|p/ւ#IY AfrXytJIJR4|wEXc+W~1'_6џ==pi?Kىl`q4?_^R?nVW7 ?˟_#?P߻?.rmb+1&*^ {V@ߍVLF6ƫT@~@hs_(7294 LA-A=YY3߹ʬXW___^Z1{<Yw}WT6B[z6'KBcDž ǠmۀU%&P[ߔnUO/`v#;3?{ xYªZmg@b*$)0p(A GY{'p WVP{g5ۣ OͻPN%Z@tgѣ4FùHP .: XXa,0;6d_`l y)GG4-`1r9UFYEAɁN !E#cnICJR'r}jpXKI,)2wdpPx*C1l0>ڦtxNYMpGeӪc:Xa ~$rtzMvQG㘙^$iF Fd ~P(lGTQqJc aGk: 8#Cn}qCTB^u49`^701g{ /ޠK;ϕ& 9Qe3Zq΃RTr[(т1q- 8/<':uD=s81yNgJ g@r[[GS :GZZE~#.Wp.P9@$)OvkrνYz6sbvجXg@Ƿa1J2PAo4l6u$p, 2k-38,8Hojq6 8:hأaS!vje:g;ѝ!fk}ZPRWkniv݇KʦW tFtMp๒mx'}d. mg/bifIٳL9}_$_u#ŦQзj9A==+%ıJY lkָ-?,ȕJɪcAZRn:$0kq bqZϮ,5d=+3^cpOO3t j_`hxNnCn,SC?RL8ĉ{k@MSŅ,ȶ[^y`bZp =n\GGl}.ncAy?C&_2IPRuVRr, |yNvn Jӷ|y&8YYKC#ht'S@rUF0 j,0+H95pI3Z`@O=5QY빯\; t)!5X5tJ uP)_l|9;J*>tiT˄ʧm^(@Y|ll^U‹_}d{{c|)]JˬԳ1&I>zkN)e6ᕏ;4t9Wߓ.ewsHj` $)Z9ﲫ=kw}I%0d_J* .P{W5S.&MD p)7_coǶ34kyNh"I^l4Ooj hFQF랦eJ⩱F*p\6{4O~6zg IH!sXZϗatq2ҳCo=kn&\̈́M۔!\ʃfP3)zIM0ɾn65vhjŬMq)A~0W?{>-*{/3 {Ÿcmxyj78@7'O~c 2.Ev;%&)ьl$NX ȱ ϝͨm+]dӨ^,M>$l:\=ϡ>kBF~!:Ffo@ }wu@PQ(RtM]+M ʿ)'/F:qJ@i KKJԨvba t+&YG @#u8H즙@;߷'q:Q:_@}"kRGO9ݩfMt&WS}[/YETQeg:ec:skNCȭKW_I=̬~7a(-hiR=8(wW:[>Gy :4p0Ffq̤z 욱0?V{.tegh>=Cfwnq)(K##ao>( \,PY,.{4% thIqBV掃03&=qZ iʹH^@aQ"RIos"*!",\d`( ܹ};2|>+#XF>RL×c`Pjhg43q@1v9+AA9/Jn;ۅpp4ߤelq9#8GdVY/F p] a+, u/ !01Ӯc!BX9dl<1^oHGkC["8` ]PT[]̾P1]s|a֝`ΗYvy88>P6ۥ. PS.G4,U-Ω{~N@)D.0.8 Q잣bmv\ŒRtYͮ&nut.4@"(@4ZapR%MxR^J6=OȘة9ϐܣks3M{9w$Ѷl۩ }Ơ3d{tZm( )P Zsq{ "sis9gt`0spȸ̉d:A+4n^% O.. ?)!p:s؏sd&IRpDDЋ Cg0VǞ;`q38"? pǣ_~d.NBg,(֤meH #pu.bm` f!]~& O[aCY;7:gN@% s[jYFiYX&ss묕z)aٙqN2;mО]v9uKiוu"%lOR`ty-:ޱ|5`hH(@*L~IJN {cBh'g܍lW dvг%;K4"lΕUn<>/br|: ۟q-C|0/?@_S'wIJ.Ss[z g]"|-F\K^<លPƾ6iozL?fh,*٣X2# KY{CAwssMp\">.a7 X^țk-멵'9>A@#]I]㣷rd gЍB /d"Д`jwJ VGn uO 5Rp"?1 (؎2#j?6z(yTvCF퉙Ee٦|N9|1N)!|turC&7ǘ(OAj1 ɋ\c;7hKLQ1 o7icC\}RL0zכ-d31Ui@cjt*sW o։(!\6 ̫d E!iE Pşsytdh()%4,>Π= :Za!vhq v="{bf&JrSI0{O0T 3Ed|;<1,:Į1_A?:sR 0A 9122Bp:utwzv&b\ukK$\&_Di@/MHѨp9 ]E6MS Nn~аW5^_h2M= TS.3^Onڭwr >ķχX짋 >Jkf1|Q#`U1Հit ni9s%krsay' ?F[d(誻OM€;(;86[_9^~@yLӇf&fӥwCɩA1e-1fZб&V=I2'&Vt]LM>i-H]mdp8) 4J=ø( EY|CoK78f VRdUoPٔtP%hbOo3m@>QR~1' i64Ia J3jȴ%̃FƂMNc(t5F@3-8E MlBZA!¡c ںZ"2Ifj4OأѿW:PA{l/.LK#5~Bfp*(~rZG[7)dƩP. c& rDrz| &G3-`ݣ,?Ki󦔍 3H]̳> ,hSv ZS8謈B[GyΌ=EeDz=.ʐb(1lETҬ, _uzNN0ku:L#c\N$2@@pu}w[eـ93f5 w :ҽ9kx>JdИ:n]k^=Di2 Y\A@(Yn:ι}^7 p( PWwA;Nѵ6sLCXs4[[PM@BCdhdx !Ցi.KYw?#s@P(NAd@sMt<{2T :+;dnm qĩ9=vWp3g(v B~id,_wa>/F9:yp!Ǭ]kZs't>s}yn {0gS#Xr\TL2o @ XT?rKgpym=?-LN?n2ITQBDzazX޴J_9` Y_Ew:1,OZY%ح ՉB%p =ߑmG?ogJ2E\>%S5(> G_Р:nZZ)O62=Öڤ&@'0ws: E=bd;h=~ _u8Ɩ`N3S|3$p7Ao S݌e_Y')3nHH:9ϙ_\vQM΁j:=Y'|ArQһ7`GW|99fl( ~RZXLQJGm%@ 3Ck`Kds@VɸBUXK6ӮA6z+C" `;zikUOӓa|TXѫÿ)Ndew9tTb)`Cc;[k0eOL94e\saAI!'#0՚!匋$ CSq\?ϊe(6Of«!c W_{;m٣Fq?M-a03SQY<$/Sh)&2FV AT]$Kajٯj{>[N>NTbIe,,> Mzl!ʗM01djj4<2FDLBO<@х%$.3TZޡg{8r&`CsIY576HFVZOLteZso"[ؖ)Ƙ3{#y2Lu! Ζk.]z/҃{N1_x?eƐ0uv leVZi_x|TqGHahҬ± L:C;39~e|z!d[JAI#1 _E[$`4d뀌TL&T@QkhF`e3 X;+)חZ̚Nw!݀f^oURJ) j aDu@GrRuőA9=GjáFYktPRЃgQr45GʬlݼԼ3NudfhHuJ-oN"qJmĵq[ ,XggOƿC'TS(f@NuBp=!;Ә`t$m m_R9}c85bh n\N7^J 8`:64ysy7cg8jK E#n͘ aoQf"deEC$:ju+4Z( / @5d(EU#p&mU]= ;ÑkCx;ѠͬU9JftԽ^^ Q6 NNNe(O8[0| %,ا>NJsp й +@4ŴUW\9J>@T:2uȍE mdljm:j8e p$&N_{zfLנ ={Vug: tlCBF{iv{2Wvh0 91҂ mJ{`(Q !i1b$*83 0Fh._YY{|R@߽ٙå8P~fGRI:Ֆdy]ӆSIP˽ʵ#:{62Ɓg{iG(|l9Fw!UgPj?h%{uk$r6Cȴ9a'l T6JgP[8xV.:gaDI{L:zZnzl =2 ѐSq{g?KiY*QVf9r4*,~'Fh$3 $(U\Ȅ v^|D6&\927|hOef׮2C Կ U+zlȁM> yq s}GY4z'l(,z/KW]ԩnk7>'Ux~xr %y4[EK\_GFQ}ص_l>y+yUd?A ٗ3A +$TwP ̐V"{w^{1Y;epTGiY0er+EG:ʾ!ȃ6:  p# ~X0X9{GFS1mc]70o@:ovq4{E?!  #xV! cvM(Şw@&g?FPeȠ+`^ "؃YAt޻uQ!VúFFB SϞ}C eވ<}Z`$ ak nS4u{~q2sLnM?32N3`C &P2 txtRWop,%Btt]}Z?}]1G6 CƾkdZs-)FP-mvJf@y @-!Ֆ >T*rS~4 *W9`wn.JSSͶivLP /_)ꂍkxa\c͌gSn|7I^ɵ뺶tkv]zaXǗ ^f] JeU3*w/`{w*Wyvf-٥HFJ]=~<C]z8Ksr@;!:eŸUVZz鐒R)pvѨe6t*z_[)dɚrVWeT2+A%ayhhrJ&fz4F|v9 9|=ڰRX|Zb@!NPN'>#QhKAHA1!o|%й<r` Oq6-USz!Q22/Nh ]Eik4ҟD=tmd1^)]Ǩtz0ءCl2Ӽ4? %98.1|yq& B~v]pUR |/Ir(0U  `Lm̌73^C'ڒ;4Z72:^єg 82Fei͇*[r@WVVpv-΋3gv朎[_fkz$5ζTmb:J{C2H Y=!X!dù|Ydur1::r2z.__ŹGsoϝ]~ݿ:"@/\Y ٳŸzB,ѱf:N΢cNV)P.aJvq,4C۪i|%Ԍ"#\,hR.g͞<l@(k&XTk:J$.~ 1gà,;y @g#Kw9fq`YYe58CH\?EUy= }v_k(:Ͳ"Q B \GE?\ @č&eCBO:>bͽo3">]\Hu,[8z$&e0y uٝ>Oamukm3fʃgfX<ŜKsїh®άso5tퟣ/ *Ϥ.,)^Cݢ4,%@!#~$Ȓ<3gޟA:MfA55o5AV)[3ITB41Ea]kt1G@h @A}~@L7,ڼA_exNln* #x>zoD ,-o|9@EQim]Xxzt @Hz/h4 䆠)t] c1gF=Ч,A7W~յ -`!I2˰\J|/|ѧUy(s3) iܖzsl6 m-:LokaPӁrt^oߜ@X '(hASA>~}ffBzK'lƳ{kV t MGa<*;Lu\4~B96VTLvwyiGx=lċ+E2v`Tώk)τ)6ZjHذRd;deX;Όg3ؠ<:䒠N 3}?UN졗Xr d`eUOTs?"-S0y2<-#GmW98溌/Tz#3Bb/Q4NFSg{5$)T*^Wtu +ys__j}Dĥ9H~\GT̬*FL  n:44X#6d2G6BpD*boPo bav2QG`e :pfy ]O%{0Js)N6x4fa3MLd-6Fkl񯫫Y KsBxK8d#5Ձy5@f#P4f-PQKaٌcD{esg-gJ\%%q.MhAUVU ˩V1;:r_p h@ /`{o#h5dal-.,: 1G>NOGR[饗`i0@uԙsyKO΁2l)6鞯sEBu <zT("{S&kG⚝S9Pꎾޘ3`k'cS3ļ@m@(3*)}1g R2Q薇aE1ɪ E׀b(NI tY7+` "dad"ikJ|(s:f3 2e03izf&Efgf9sd <ӒҮFnye]ϕ@MΡ_Voc2z3Z Xki8(^ '?Frz!"['9݁F@nyUm}m.A0Ǿ2:ɦI6 U?/4*"" /˓H3|Հ&N;<ſQ)~׌ ȇuθW/Ys 䳖PȬ0'<,l 3gȿ+@#fsq P20V˸9}ۿs$_j~2x1z 47wt K Ⱦ^.Dg~ v$~:lG L?{sHͣ1+xrL嚞s\٧DP8Kl |<8v|sD+vw]tvum N!ܱDžѱ00a d 9C6uL&ÀOpe.f eJ-Grޑk2e20ʻlpnRv~Yܠgg9vAb4.%]M?AOVZǑ2b6$s"m 6fy\SYx\B,gge Ȕ S-f-+W`qѵ1ʖ@Lsu?) !,c;{Xo0}alkhxfB@/eFXQR=ZXr.;)I6_ 0%zV8#O_ۥk_H`-ϰm}BX7O\}fOdTꅭl$^cL'!췑~z_߈vM>5;^pk96(g5NvCq9]kzH=Ǽo]]8Ss5o!~qȭ u܋U(ikz:) 0b<(kF3(YuP"Ʊ4|==1i_>??a_v P%@'ԆaK+[Ԃ05&'55?@_q(W0dcAN5p?ad{XsJ#́ԙ=0qݤhXL/4܆Q*3[E$ޏYOkGt:_L ɠo܂q-h;: g{UѠH/2}v55@94::3/\ =oʐtQ((5{63%64^\< gVu!kRCF=oW7MD{T]Ј0`Uq@]˒)[Ӥ $YIe*8A;gr e^s ї-UVHr T@x;3Fl:gf N 0+)os%m@Rϕ3+Poy'Nw~^u+|gdeؘMdvv^H-܁E&I]I$ӭ^JKcz<t"x4I/YJGȾAFV8AǙ6P>jpJGT*C_tB‘\ڦ)@gΰvP:=up¥p}ʆQp\Zh\wݳӠ^<1.:gU6аvb/;MD}wѯXmhxN.}#8-gAT :1f1u6m(go{hx]R{^I r8 xr Y;~wz1.Eط|#zZR L9ٹ!|8˻HȈ6e–":u6آ rh9{);nYg&| m`2h_ eFÆ`rHML7dJu=}v c];;9Y$fp^ݩur`r]DB.ga:[:R{X_(Ϙsc^Y!u_>nXsxΨqI2B6o.BMLZ a|lڃ m(qΖ͔g Kꮿ<8}OG榟I뜚/a,96 *!CJ~.*;$|{OFȬ1?OO>0\EjS3eMf5 3!_3O%H>+5_9P5 a<ͻ Q;W"gc> ̩tKW_I}706UPgiv7JH;: ֫cY-&xueQAO?z>k^*QeV@XG 3⽭ /%4U_M/SDˁ=ҙ!GvuYτtggƾR0 Dw|d(' F+9A` !І}#IoF40P$Vgumfɑ=:GAg/4.0M*% Bu 4C*{gK- mPT#+9YdW}a8YTz0D=!Ο>&ˆI>"Cy3P;4^-4"XJ3qրTwv  XCɳUX8VUFJ@YLZk8OZG 2a60N7*QuǘE6 \ׇ^|^w~XecH.An)`]OMeӑ3TWܚy,\>D >RL{"ܪ L@V0X,@ g+ҀM=Ǒlx{koyo[eC1a|954c nīE}k0(50( $(x r*=<^Y&5$Ǥ): "gy?ϋ]`s=Q\D".3!p\! !1,*ʯ˾^y77D{. }d3BcE+F+j' π^wQEԹ`̢"dQC*@Paf,+Уe#0*0=7,goj~OY3Kӣ+{(G['Ӯ ds6ɽ Vk 5qS`׿P{a3n>u|e}Pn4y䒒]}h0cO]m W;g?hWrϴrk_+~Lw@*}nz ז`3T#Ϲȴ'j򴲺 8@3a՟~dcܚxKi1eeo^66YRYJ;[ʢc] Ys=ž~Oeqw墂R Q8uwVN?ob<*` QKBWa{Ne:1|i }YzхS[̎>K#QbY33$F]F Ww7 ƛ&C6u*142V;$Rv~Ay[߈#rcc'`/T0Mj6u}#* AYG[~y`1qOorK=N1ٵg{TD# ~cp:"#pDϫ9+5Of6S aY+x1PklnHzaHk7X%m۽$pAo^ko>zZ<Cf1⨻=ݸv%kdUnAVw?jX˯Kt]qg{ޫ:E6nApf&2HL3 q>$kҵW_%s 8_2\Ctl{Yg=(emnp^W N˽fY]2/F~29i2">; q}o3ʟ@g3->3KoO=&LmU DPi{눘TUATb_{]q(Ң:Y:Va;;LSKNZe- HF5֕@v}ϗ\^;R<~=gPP!ӁdQ d syOgsљd6naluk)lc8oLLlƪ݉RyL< (#B Ivbvp_CVG7y;~a2֓Pղ?6"az6ɆjM "'܏gQf'S7ٚM$!l Ɔr+x*=12Ny6#(!{jjm'%2-̋xVϳ6Z!WFg?55~g#dS2 0^8^po:bBA[Ā3`4qͤwȎ_g?`L7ftedl 2Q6Z_>&rzI h c?}C4YUe]e Nbq> ݻR_loD=+d~nmDj v{>9>4>}Ux^MUg[=kl.H$+SmhN$M5e٪D/g=܋ou]VOLc㟎"z^7G1aSIC6A#p$ FIFc,*fԢշ2m-5Ў?D\ Β2TʐRaʅ2K%8]n  :&9N}@fٖl)mjO~\s5ΦqB0R9T)YXqt+ʦGh ڑ<0/5-o?>?omPҚ;8[|b#8 j0hV9$1E[86)5Qzp MV0CPgR*$;uvf)+ H6dg_hOY ;J 6 ] ZK{ztz;4JJ\Z'0PQJݔzāJa oS52g: f 4Nևz{ln$Y]&4k)x/u+k!S'gA)]n aUu&˴>"y"v0߆"+ <4t+uw3I uU(2/ PlzeDZYƏ5D[[`  a0쇥'i NN`Ξ̵7kuzQg"-}f4fFl..als&U=;O8cC xnD/xPJ X%=KY\Jm4H%Cc+JplE{* rl!:F{;|p1Y~N六0}fFЀ7@pt2t\gq뀉L)gy3D,DBCUbh}nD1k]V_ji&/ hQI0 Rt5;#g-/)~/v@:_) oScq> wǡ*G#rp^lt)kP9vg#3³OCZ FkA]k‘FoNpZDC;]!-Sd^y9}HUil!N ZEKAam%gCO[Iҏ<"3RY| AS>K[*T9VJ }8.O?:쭿tchRG?Hq]l`NV-;ad9Yk#{γ"چ\Yq>1@w f{_BGȉ<)h SoYSݬ>.{8u@9^gQ`AHxޓX UM&4-բKF^o'~ ŌMu~/Z5NNisb}|m4m }fflu{ !>&2*'ΐBM= `>kZ#63tw|zǵ4p ͽP=\:t*Bdog5S{ʁ u XЇڭm= ; k4S8}vvDvFVdܤ|4z`m-zbuT0ԯ9o2q2u^LEc -;U"d7?3M<% Giþ.-4L콙zY.!c"( >?>eM>7 DU}k1d(@Syn)C [`plF A25eں4o e0٧-09Z{o OdgWd$I`uXR/XW^~aV48[F6Yw%"b :]2*iưً,WRO<)ObY "γ5Ox^ʴ1G,#VJLX*nJʄӦ5f tH؂`0cW3ICȁP9eex XaVg .C'HD GK{6VpVX#i荃<χ1%@[fx MOφSAc'kY6rZ(''Q ކ=Fc@ % mVP蚸>"\:N5չ6(/`96rWŸXYkɼ_Y(6AYG38E~QEzQcbr9saQHзވ\#3J-+Ҡm҉ M!=2 >Wqc^BڛƎ>;3ܻ7 QʶcoGC'%͒ 8[(b3*n)Qzg;Jm 9$5<% \w`'zNzI2Aο`cp>qj15}P1~Gx9bfprpds`_J} ii$Oh+_ZzhLK!$:3~k8gD.l z kqP2+SM@-mmPYe\JϋӫˀgƵutjz;8ϓBqaR54hkW%,{/r]Oyܐm3{:{.<5W\M/ b4E#N,ћJ&A{ .Ta>V|1BQC[K5!5+ZzA@Rgʺ~C*QsX2cpB2#3X &@._9PF]#˪{2e5w_z^lr^lZ=6P 8`9\); *zsl;duѣӴ@`na{?Pc niJnɖd@SOi#Ӯi{>N#O69t$?D,3|h؊ƢyN5 (sYcf+,͔J,M9qO|vATۑc ɞ<A:X/03`4(==seE 46JF&9ٞ!~C6 K ~>1ʳrxyYkCW6քWUױӆwK;CLfr=f,Y ݙo-ܹ6ndВ?o};- a`G+Git$ HB;>!xe,|v LCA􌝇NuʌiޯeP?m\`Jԭae (&vuuG^'_k܏>QCMszVr&0}0i~a(ӘZlq OFPܙf?xP21$~8s$FziD>2~_ noY!e\K^&8cwh rӇ i/ɲRݑz`!sBC Ϟ>M}1q> 󲹝1wY/)l]&}_CO7NxL@j`jЎczΊ)̃}ACSEFLau:_9Of Zm$&}\{o|VJb>yrK qV *mq䙩"Lg(9:΄ЁduC4,O888Rvn>%)E 4,a3*b.3֠)Lub'QrG(Gp("@5hEMG=:ƨZH>&DƉV< 4oп<ͣplld48֪G sPSxuf/k j'L'm&K* Rf6|/dlȈaup|Zkԭ'(cD2k\#%q:2\{jr>MNP\W+ Rcг.A8*LQ40ktPL8gȌ]Z{&Jϵ`jU6:c ej8\|Yy5_1!6`9ۮͦdlųbrLZmGF.!So9=‘R'm9C6TiKFTmw6A[ivӴ1J;XvPAbt)? խ9dW}:|i% 0gRQ[ M9ټJݭ9ƐL`) l5*kaVEbPD)\GLfی2` zID ˩.\rJlN T ʜig5oP%SJX(KfNR{@mPLy̴ۣ4x"1p2f?+h"ue)}Rj FZG#Yg *JS;r=AKp;ҥtev]kK7{?y?YCs}d+w:z#g@(;J Sjb"[n =u]dkx"f=[8ڧ_jz1Gʱ~~4{!\gPuj3:\|Pƛ|R 1Dƫng _1U#s3򺅃V:_9,3)ӱ.G?p|g7]?xu(]z%+dOpЙm/AU(ٸ,@RBMF6Q9A28tYlM츶4rHPtuƏjGc1kGG4YE螥yY& 3KySc09%<+u5AAmgkۀm`\PTZ@56@fmk{K9fyQ֝4D#;N h*4%uS@gCa 8-2(3bߐ3rVX9Ȏ`  4nk1P: `a^֝%»>%=HΗ/۷nY)P&95bUY32\\5;hٝ0a<̰F۰Geat$ )[#d2 I6gEvt-' 4fz*\X{kԝɖa*HЬ 4yʂ>=NHPDL2d9p d@op=<1m)srf$mJ?0UW&9ȳ(3fW  R85mgTbK=o_fp%;H>ӎ_{בG4 o6qR)ڈΨp(!Hu_|`W@u1DT^^Ev Do^X&DZ'̮URǞ/Ӄ9$`~i9=l̫k)5 Ą44qDJد\֢='"l"bH4a) &J> ];+pV.ς=G;ʌgw>aZ¨6T ;m2;w _z?Y_+!?8>J; oex.5}oEֱ#1/3qJNE`.җ f(gGpIO[xLTR{h!?m==C^~6@+U{1  $<"΅L(C&by=}2#Xt EΛ"7ƞ:4(xdl%66^=#*nok_P߈J8|??/~K%x;EY[ EG hlF@Ea'ot>kRt6IC}:G4ʙ5s|л`jr6h\*&<3(2t߫6~=p;AH뻆S kcr{8W4;q1[?;>'۲I&B`cuVe_:MUġtC;,h4¨J+S)E ZE7zf7Z@jutP2;ۛ1tP:* |Y×&+ fG{;k>xv6a4}n}Xg?_ *Y58ڇj .ʃ(M ;)cn tę xi ح'a@HXph̃ƋC!xAX:^@ u4!QJ*u~WB&س6vt&})$y2z'Hc@"`\):Yq [xx z2t9N aɌ\y |]wు/3?v< XI@JM)Rw7U7pfh7H'aZ&''0ԑUɸ_t3&]}c|#sf[zx, rH"fvͮpFVI"ZM@_|@2ՠ@} csө,ZIR4ΞHCT `y W}XL [cL7J}%f?M|1,I%vtt驪!Q]AAIǼ~{)-r :LW 8oNK0+e+S& ٯF6,GHt̤$W4^~YK,>jqpmws`@ѱӿ>:FQ9Y^sL)dm&-4U"HC-8E!Y]pYfamc<_yCq+*7._F2CfS+/5I {zf0{/H+k)@J0g-αkXJY6K$g%mx猑^5:UeȀΏeiUK Ү2θ}b\54Ik{ kk@L-gh8[ekBR>ɒA VLL8 (%#ց#}isC}fn8S&+Ь QoK; 0MA{L C%ϛc*-K̀#m8bKXwf )~;^}C02{=8Ô|-䋠e ^ 2i= .jAi?7[;0^TGۀ#^~sLvU !S۵0x^O ȸ@PyIEUϖ?4`e2Q^ ˳ *i%: x6ه@-. h eX[v+&5iEϵckNl?jwp_rj(zO*;N 0y d erCySOMrc SDSƃ6 "&{pf6u797Ѡ>~{oj\k9llB7w-0fU\錌6 g9$6,&iu} Gce gmkkO ^e C@ 4,!0Sg{UTћB?Z@+/֊4Jv<&3TcEkpd̉ękS}SFu>d@ۘM'8sIAjllJEA,?%~RJGWٝcb#qU 4wYҘɐj@NT3g.sas)PМ* HŁ:ΌԨUvSGqplc\q4=1Ryj|VW@rf1+3il)]@ZIN? cТBMvԜo2%n-kQ$$;%ċVMdi* X T"8 qu7 qJ?HY&: M 4}]=ǞYk ԍdϒiK S@CU@bJDϚ׬+=oQ Q<87ʱ=:!&*p b84Yf8&a?[Ě9p0KJV+ 3\6.ϰk$ } $3Yf{WK[as^{p8~C5b^׌-c!pޫe-HYj<?T,Qб!.oLndM3b&YD`W0+@@~3-/RRB0-)@XY{o3&vU*rp0n q×hagWhH禮{~|dK_zxd[)Vi bE]N 2y_8ɔ,+6{$[xOL8S-?'U>):dIBلPƅ~%z οp6rcV]wY'KDزq[qF'^2iw;YLwCcGvgcm _i&fq/Nu{ (F6ӿЛ-6lH5z 46v&沎ywm nWW[nO]= s]=-y2::Z!(*PVY,JiXYq$*z~c8ex<'zG8~d2&s\==px=o}olo?\o}[{_yAEɓ)9I0̛ ^i'`36#ii ʌgyEvu4#w Bl=!E ӨRZUQz(bpBw|U ԋ806% ":M]t)n.hg#o%~s+"~: R5,*5*LKQrA\Eg@U-MMс@', ϩZQB/*}d0$"!u]]Y;\'JT% )ٺq_řXcd)z`gVYOEiuh:HX/oO0H :[0M_?q_"gOD}[I]@G$2&N[fY"h~u@>LH6jp{;Td G~P6p29Y!㾖~ m;._N/ߎeçr~rޘ]`w88Zӓ4 ^Zt8̅጖DPi59~ޏғGP/|txȱ{u &'ϼk8JK8sfȵlY:+pY#G1V G,1Ъd͔a+Q~rO-Ḽj@|Lolx:LeEH!@>Y{mv[d>ۻ̨fM*eh"I ?9~գt(G'g `p]B~@b2J!@ dYtbCl!4tN:lJzСCKt7>s, 8 t 1,-.:gbd9lص۷`ڻ4CrCz.G5苮t̜㐟$O^0}.Ȭ~@L(Ima?1$u&ْ֢5zh?ØfssCODcjDQgLt$PLߨ^Z=e?Ĩ)S{/==< Koa} D : 5Ia{;"Z?Ɩ553!,>Ssk~`{q=~kKPONǦzHhmlOa#\"d 0 A9NCsc}l~&Hx" giY#{r'22%Gv :PooxƕS+HLgd=\O":L2{ sLʪ ?>{ LFcx^&eȀk-FF~pe;$M`&GgL_a-cn."CPN! F(*qWUq1ldluW_Wbppd9k~Nwp"Fb`L^2Y5N!،Czͺ)㇩[9NchAFjf>&( [8YG(Zy Rz^[611 ?vooQe ߇`-c@`Y Q@8"wojn:N4ԉukBq̣L4:MZ85>of;Ή$zoكFU_VQd{v&Ͻ'D m4(9aC jYTis:dƇĢEWG,Pd#QKq eLj۱c8(J]E_R@IDATF.jq]7644GZ?ό>\CmC>?&dÆ;q# R͌I-+{5 2jZ5 Z3RA:-oJxw'Y4޷Qp@۷ϕ5=)ivaDhOO'<|?9}3,2gjVha<#>(PWNg1XoO'\cjpL EN SYsح6I}-KaXPkf[ǿ7 ЛK+4ǴL z]#`JDxN3XHVುs CT@g  ]NNЭB'8inŧ~g6G9:k锺G;_ P]ѩ4|煙8X1.>]MKCĦs}=wgqg'! 5@=:ONo$c4bYO#z՗ـ Y0P7a7}ҋX} cŘYX0P48D=./wT r*"U~,rLrMգݖ{&lꚎn"GΞDeYoKWt7DTJ+u0`DP޳*:#$Y>5ލZ3w3msg ,Axj'ԥ69t))Bn=':34ry32Wd7 gOL?}8xy2$BimlVdF@UB<iKWR˩8.~Kߍc^JȜII:q_`1ͻur>wpkL8B-h23gQ6{=_#  gl} sJo4@6LSKE}IXՅ/~q;(ddG}>5?F'?#IΞKΟ nߙ~8}{IQ7"8 AyF%DbHD93{EB قDZ0!~=s+3ޫIvL2σmlAvZ5vᛅ9)`@exџ:Ixv?e/L`(Q4?32 `Bdk3uYb Nibi,SAlA3ge"J* p-i:NФTwK\_߻.>>>>~`r(m$YVD!M.avakUa7kJitpB 57n Ɉ1}* UdoNk%p.BVXQ &cq(W 6aZ^aa8ښ[l^QR),9|#+QdbD6W.ßrL S=QyLCPɳ!:"fb˃y!2\HN#6~4WnqlClW+'Ե/ _ߺ<8<nD3)ˌ_S|@D+%Tq:![?815  ڌcNFƆAԠHP3M>T$+pS+39*kO#8A?QJGebpypWAaB٠ -1i@nS F} v eDKz yt69G.  mr>k"H'u%`fFqf CAr]\=DO0y744 0Kc|;㸠pp t"tltbrQtŀeG(.WהB%0mT>!`:UG+QVyi 2Ƒ:)!8RR,p ³19* X#OC@ fEfeؐ i~`Ħh36L )K'KȀWH- Cep,0Fd*Him``Z@;N}t翓FPNnNhd.#0*'1([uΠ5"O>8@e 7f2]L 5hbZA5} .PoC}+2:-dϜ yTzŋYI9{8֎m:rvJuԑMɲYj%.A#T4m8U-ҙΦ.kB>dFrFj>M?>9?0aX@ͦT6H]1N4h'&OQZL/T@P),PM7 {&3gpjq;oZ$F,#[z/̙9^tldu$KFu dixp8SuJPy\ O N 8_eXUKim$-.=9gm20fG7H|9\.K_Ou6K][Ξ:N2b{1ǹ/Tℏ?-{'8KR}ϣ,617y(eLk\w"YTAIMpgѯ1p?#f7יV4;~_ݿۦk+_5ӻɚR24]KmfuY@}"tm݆GgÎF",p]HdN{[0퉔z[a]Vx~oH4ju{، #S)A :lghJjJ <Ӎf 2q@\Ȭ5촼DTu{)  0Jv!68Z#W#AgslقZS["l&zң e9GeAG"}L 8;[ [3M99 `wصCMJnxA'g͡_/yEV4)c1S:Zf`3WÃi{Ƿq] VX63bL8C~= r7/~Xk.W{@*;M9a ˱m1 {4Pqiriq֏\ԃR%=4dюN2~+ ɪ) հN83A+ğ>"n|̬.Qè<ŸGMC;@%TKPLdžn_hd{Տ"SPw+:a&)uЈ`Ȥ };$=7ـ21TZ *q {_kGyp_t 1؍ً^Wߝ~ e}7_? yF釈b#Bܭ8 'Oep{X&O?޾A<97@V#CC)R )Y8JpX8xħV0\;ԑM9>zNMH>.Ŏ1sɀKgB3zX?A~)J@BC$ CHٱzX?5E('Lh,nSCsvD-".,8@̘^DfQC A`M#*3᢯\+cEhh?p/KPRFDFCsTNeEs1 $ c-.Wts~"LtMweǑ][ eg̀1}86ĉwptBj 3ㄬӛ`,B9̫J{2x}0l:;N<&כȬ;H3]4ϨFNM3k^>F( 8ֳ5 H | Ns9ѡ5Gi#z(f}/< ɭO:hLgNXH󳔋-](!K9q-Ȓ{/?SV =A16|p &2f8! ht4띃 ؼJw0q}K8q8V \_`ΧcV [[Z)9^>1GEȵe("}m&<,U\6,| 爌6@vߣ'izLG6( հoYka\01 `` R]SCDutG^VkkECM‹^D&Ƒ cr@vjkSn y`t@_ s^uu)%@޿vJ_|5_l @, ϞVI6;FI?'YǺ0 V|O:ƈQvi> d88;3p~'˰ BoFMDCe6:KYѽb B4 //E73q%=J=_r1׾F\6qZ iHte}tf(ii6$DZWE1_}(5\&2|QޔO}YcG03⹴Yg1 ?I*'F~`c`^; CPqwm2lǾTHTR [m9:)ȠO&§ cP[:B plnl|$d0# xQ^s o։툏Cz[ jRbYq.> Pp?V$ ڎ8(U*teP)=^ ʶ#>~ۈTAY =7BrL8uqkeu "DTxj|2DeF%Y4=6!Z:O 4@=KtF]c RC  YvRC 1쭾4z6SȕYu|"ҹEXcYh=~ڦm}T7Y?'6d;!` `+ oh_]? sA!dY~l >&Wy-D \{h G=k`v}L6)@2a שJ1:A {)Uƺ<6LG1B-ZKUN۸ZSv-#s\Ziźʺ}ˢZ&>kc+Q=d c W$2:$,IƊ zK 'J/IP5?:ExnJf/q~?~G S)aiV[SJA<~D+PUPRi yiI?MSE13dK[#9"6^Ry&!j~Yb̖F(wC %Ch}m8Rb@@gv>1yvk1ef>=Pyv2_E((]FP*|ds)Q8󁡗1`gf'J@w O[C0܅g=V"fqz3v}v^44a=taչgx U;26}@qy6 C::{:*=J[`$"7Q0fPThnfv;,@M  K%K-2}.VFЁQxDY34۰ لCAapbd"ft/Q7uNU(9nӕ,n~/]:3-k:>0ݻwχĩxF8wY'64acu3(ScdlVC%އsA6Lnf@>9Ϭmt!C'bcȄ ͙w#dXmo='6+̍A c >>i$`P}B ͭn}(it/3©Ӊؠ!$A/&B>Yk4Z^dLkG8>E]2Sl#{9#M! `E%iB:pٳd_a>lSsDFrÃ\Kp0@Yd')~u(mڡw( =O}w+N `a9l"SW遰'&+vqnI.Xk3A'HK~4J^K ǘ"8[fvdGse@E ڋ/&=wPjmhIլs7}>#CIU׫ e-!7:d7ye&Z86H04\$%܋afYK(;4`̪̌NrN|Ν9nݾ9;ȋ;|kUX5|6t?}/ݹ KcjZג% Skݱ:C}a^#SYkFŵ++/_# nB2cY*']왺F:kfAÎD3ÝsVN `[_arnQ8v-=k#'Ta .ᯰ}TH!L$LgFzg0&54 =d3:ڳnso`{?j`UH$E8$2ϥT/( r662ڥ{qeU%jeOؘzg9B^rj?5zx2 ,H{ii!u߱ޛ=̪UFL=}>}MF .e eXipV^JWyIEt ^4H%5;Z6îp~ vOͳ0/j(&}K#L Z`&  ˣi6#3k7 OSYlnb-Q~:B= l 3[ʍ w&2 3XZG<}p}};E3RRF͵6;ˉ<31N)l~HF' |UH<\:;[*925|  IQ2Bw#va[?wg)Hpf(;\cgZ ++Ϣ_e{zLߞM+JxO/Se\$;A!UWE}M>3AYL`+_,rRY%ዳ_[{$21 b\Cs= du?#Þs*XGg?}sòyWӆ_*ͲNcӎXK@j(@N a4  Mӆ7KhWƂ`[$kok?TYp kˆs:Ze6kSR\ZE=. E} b5Jz:eֆC#$+c5wܷM9F pΑsXO8`gkU<;(M)h0 fi VvAu~$nX_yG"%,"`V+*-5԰RHGVd=5Hct;S=aҨ^ڻ=D}Bq}3 A4Ikc$ dJ\j/M^f$dĤp_Kd Uʑ dR^H)f[BX807uª:)v-&Xfv,FGmQ6j?IM#@XގYم1hLҬn& ʦT PFVc*Ǚ̥9gJr0rXHfP(KΚP3tZTegw}ld𧣤o̪OhxęNʂ+RC«ӫ5 I) J߬2X_ ؀m@@E :::?^4QP{j~t=}xF,=M`0 Vvv}7KgF 6LQ^qٍp$0't@g2JŔ4Ʌ!;XC9؁mA'o +?=tT!k7s;L1> eo~FA^ἣ5ڋ/ ,S'Nlpx65Id51B.p,kO\Svi. .I$;i&#D0@i2=D'.ɢCFmҠgGbJ}b jO<1tD=1#e ̗!0hq >CTgBVb} 3ecϝ>ӳ-;t+KL@_j8ʡgrmu2qIƟCAk=iGDe'5z_u&kd54mYR.^)( udsQx,J#ojQJOP\g˦d(9;_?6`€QvV7FycY4xk}wt̀s+\3cAPEcܧQCqTn;BVS Y[WF&3cT6DYE_O 52YNYF`ɟyAFڳF@AԔ8+؛bdXaI`9^fzh@6+]X#;ol+t8gnq=-cS-nlG(`RfZSTU5:>5f8nn+? L'ˉE-aqt4M/ "C(EΟk42m?]Yz3)k,Nd;h 8aG!TJ]S%?ikKNKIdAHTqhr\}RYK.M_:Fz9 #KSnؠgqll: (Wkvakư4u' c\޸sZ!'sSrfHF_ e!X襺ʴ4(GҲO=F!%);G~;onŧgDPHD9Mu]kcCp6bHl?_KK5e/\~~j{)}D\B//['b:^Q%X_ 5V!h%o([X߀ )48Wv 11߮/9w6gPCfQBP(C#jP8Av|&]t$vn%T좨z(Ϝ.6EAZUӠ6[(7Y%ӠTdFD9*K=j ERgݒپqr]@f.IjTAE{_8=gדe ;.x%(Rz[ Ah5h?VYazPnCͼ_9FoE5l<}u HjoF!) r\DS-P_i~yu"Cm QKED{$Zfz-:Y8,XgMIzq/}r}_ %87YU[c,&uvmoh>bM-܉Nִng aЬ-bx[Ysؽ!͵0zV TȞΟpR9 @Ӏə#'.q̑oYAQVsXYEWIP*k5N0>>2bY.>11J`vE%XͳK1t#BiC3΅#ǟ liS@\#KoBܜ<.={q cĩe/HX$xH}#,skcx5΃qZ`Ѓ`fIݥU[*e<½Iwwpf##^N)ٕ'8ߣGJuQc`FI t'&bC=(5f.!;}:q{f8Yg-zOrDZ;3A @Aj@u@: }uvQb$ku3LJ2l=Ɣy]٩ jh{\漇 x:oJ=LYN8RMPl*d>A >uڝin0znRm_u2ÆtMGf쥐%l{Xz'/{O/x5:E̞C=i&{3'[R{w І}(4I~ZuG:+Cp ̥Wy,zQF#ep]hޔ{Hi`uv1Y)2`P'8 g "`ҵ ޜ69lk-Q0qb+YXBݜ>xFO8k:x.{g7ɞ=o N[ikmG}F ˎfQXJ`PpAjM&E&(Nŋ ~IOGu'&Ι^žH/!̠AٍO Ί,!7e(2 +á.ӼL3ucDI)P6vAڢ.}DN^H_t/9>n3ޒd ðHGX6ml1Ж-M?gBrRdF={H5{hȤS_cS"7 &T& ]L7>.Bgb a/MƇI@0cKcIMϵy~!$pnR#<`T $ߙCSYOn[;:!FH4,+9UAc@Ȋz-tI-W9qil(Eo5F.+R6>~M6Y|3ś'JuױY"qȚUGsDOcI8Pdz-P)$~lA/yQΠOIMd Y#C_98g "lh*X`e<~hߊX g)t*QrkL3*'ryniaIZ=8WkhJx]ᜇԲIz*,fѸGidI^2f+Ě-Ӵ zɎ-Gϩ_d\͡gYQVIצ״2--eok4^,{`Y &ϸ'˅0#wWr,#IUitق&Q=^pt[#94XA &{57W^^e/GF:o T#ZaD }vzr(rVQf tMFn^ _j㋌'+e8yX /4.I>!OD>AAαsVqȀލwq8WȆOSԅbPv(?¸uDu$7 {zHHFnJ0 :##cM K4 f=&=dӚ@6)(_,I@`Ay6=VR]w/%t<©2B"Np/ l8zڨ=l(q khB*zthaR Tp*\7kE\ԪMQic|ٵyttYYRGsK26D tttj ]';݆P:Tv`/-'X!Fj5kr?[Z`鵴m{e.F7"ͱ0@>'Ԗov! CBV0PMm6w)1myfkgWy|r@\ezT47$ӴGl*y"`ٵF@|:QX"=p,`w!ˈRFakU3@s}hlAN=c4R ARCʥڎ:7o^:l6BRM4| VE6?+)# ]X3m8L> #ʇryaKn EaD} ěZ6" $pMBb0<q7w39#:Cd7(q3QΤo&6)OJ?\/hSGNW!t @c<5eB~>CX7e2^Vp6,ᘙ!i8YJYfBqS-ͨpC&*=e@3o޶%Ę@>8[Ks[C'C/;HUeRS:X/pű1t4g66m-@$['GfLL 2YG9竍cz|<6͔M "l>de6=(l@&C$ SPƍ>zo/KxH?IAîT@ቴ9^ 40ЁܣN~1gkR  dW~tv}Kʍo?N6wfȨ gwon|T8b PHoG?>A @^^Ntĉ6ޟattДBNHTv!a2&ya]~& ` Ķ_N[bC`vgO'S:Js0ԥ#pO9R~i@N +FF`Bc.3ܨ%ep.lX)3e{ٵtr_zt)؆"a P\dKؿb fW}0S!{m,uPϡvx D'BdU֠`ɸUXS&SԏSt_PNcRm7+4;2M}|sjBhQec;7#>YMЫ|G}TfpZUeÀ.~ݳA!dYxkd3L`&ef' r˘NtJ[b?vQ3m&~[GgaCKؿW6 (y\~.[܋P8by?Cuަvo  8-)m9Iv%Fz5̶_!6Kmvx'Ib¢0f?% ٣y& oBj?&6gͭLNΝO:HOROl(-?6dnEy2ɚ|pE@ƆA БGV_G<!WFG3 SLdٳ'Ø֝kL\:r>36g~L. 2ml#CrП{FS NÇ}?iJP9؃m숳e9Jz3/|05teii!=&d_8IyJQ,u2{rU@4=ήS#HOMM~OAPB|v.` (KKki`_$%ęЯQZ% &?_O )LQjXԃd :ËY&US%a~}?X;"6J#оR-茮l@IDAT}i׏=h_{wrԓ;20]WPx~DWossk}x=OA/RJLff35 }(kDvqܤ3k oQohQ\؀(~~)CZj 5Ɍ 8lZr3.:F&-7D0CVp>vϨ~6IAθ=73oR X)5\2zLQL"֦pɖ'n͐觠Ia"Lᓚ t"VF`T䪹7NN{$HgeSws(>f>-\P jansr0XcͷsE5\~6? #8o3fʔSAEN"ٳrwҍX: %qKu üu~&^N"=u&^1{}$Be ,nC=B6Lq.ې߾qoTs7p_:M<i3-NUKo B:}u0ՀYcKI7X4s_9V ]V_d~gX:zoWdq2?'vR3Qnl;b,8 &]sGRXў.ዑjP3Ce.X["`%+ ܒ p=E+my/ )bA?DGPn0AX/&mr'=aoSz̷IgĞ'ZJƵ b7Ebֳ`|`pV>[[S/^z#Si o?Y&c8xA'EX F<F}s֝ۑQl\)sLP…] @o~V7a y>z>uډnJ`xfˊk0gEOM팻}3e"rN: K -dȳkcVW?443x3#B~ NNyGsGe YHu@)hCvl,-\ A5.8٧O&3}nZY*] >/ bbѓ7s!2<Ėح= 8͝ 39g€YelZnSYY6`WZTWKC:pرYѨnN jvmNWU6 Xr $ɤY5kOnz3z_ ;ߛW<&` n*:ug ,7g~S0Il>d=H S1X5y0VTPfcfl`SFbٮ`>e~N8yBn&g4\F)Llmo VʚMId!B⵱>INfMɂ!)&>-F6 9&p2\`@e>^O[Boa\?P;X;L^u%>cWퟥl ``yM&##C8ky>?ab<47H[(=A"Xgml>eV2͊z|l5zTNSr2z}vd (> (|=GG 1Ȍ 3IF[ r[uf2^]XWEWItJY);G-o=^O$b%ϓ28l69~}5`@s'7I5=b~xU7> W=p6}3 +ۿOXc_)&*m cQ@xTQ*3`0F`&D"YF- (d4N Љ3ƾTDd9(ukldC6/H`6d@l(( g[*HG!ˀ: ` 5>"Xxq404NJgS?ZΧpɦ46Ce `H9Y꽵@^4M&6ΆJuYhVa nm#Q(:0g Jdqvp [s Cbv޶3QUiu✝_J>Noy3wKL1dEu (C&J*BuoUܙsQXn{j>]ڣR 5R'`ɉ~>bxn`Hޠ4X2b)AKTl3"6+*d_$ITm)it "WY?NL'+F?ʹξTa)k=4鷂>`Ժ. Tg^cH%%dg7i&yCV({M8P+|S Vbw^ݦ!= ]H}Hgc316NwE@PJcs gVĉy:Ü3{>?ml{Ngõx]˽r~$M$ڲ~;wne]Ok[xݼE~ýK$Ԡ9A|oG7adY BNVr@k}넳}5sPpƆӇ>I iQoAgodW-݉\W{T"eSyU?%'aYf?F+(Ml2sg.{- ]]~XzK d-:W8Rf7|SAj{u%0|B]xxьȦϼƹshKCn75.ct汷M B?rk" It*F\y>YvS؈f$آD' ֿzɟ1:h} `GtbR[cojL 2w݄]#`@{S=#Q)/2(G>ݗ]А;:qZiU֥g^`M?ǹ"z_{rn <:꼡_8@ڸ'OѰ1}d #N6ի//Jz1 5Xp ħ s&ΟNϜ= fldmy=l칳Tq۽@s@,il^k3%0|I2Ǐפ._֞LF/^e00zƊbŰb&еEEsS xOgzlRY\TEؖ˜bB 7gG;¹7*Qg =`F2 xsvcsQ2,ss",,(29bG|[P5}Zmĵ`:lƮ-aSci> ET2}J@e&+J.mJ') \=Vio, #k+4@]'T=s,%1 =Q80/ #/E6}5e$`..ģb:@F12b5zn {_ )o=YAOw .pzc)Al=,יϠy2:FRMF=~&}Tw?;?{=Nsz'2 ?v7Y/2XV@B5=s>A66vޮ |"t:lLo_97:Ο8#XLLE0@N[2k˫#PVR,դ6_,{0jϵoީ,ħLVΥJЃ쑬)ew]a ϩ'A/~@ae| @*O,P:e`cSH0,-0bL"9>yLUR^3WY`i7@{npSy@* wt,8}?/ p7Vܵk_?:%o>s3Gs6RDooOT#)2Ù4+p 4_3cs( g%ik zթH:QmvDEd\Ntbԥq(?u\M EƊqˍCfUggٌU6XqIA}(DZ:$Ygpt0PgfKM0D't=ǒcd4))A98aQTzzvѓ;M aLT"љI6;W|,K`1MbᜧlCMwq@ؿͣK,zI}ʫ ;]\Kc d$ZRd'I(-N060 jjS"^ܘbOfDY=s V:rB}cscԮ.Rg{Oood,K0С(!0S"xʾ`nD~*hkpV"=K~z^<q^xWgPC&d`t8I#pH֮6+fDZ8-Z^ q 5X_[ #ճLVEMQ';l6R^ []I>xO߂vJψY$uQXͭpܲawYJDCT1(0#xh0? pb1B_s/6ͽ602sd)<6nJ,kʾ5ڰ ]W<42fA}8{>I`5'/9' OɡӺMßеg>fU$fr*Y{2qb׷o6MҼxg'miefΑhwAt7$Ӈ/d[<ǖpr!:1gnF6O,|Fy(+}XB}׻0`zr6}vf:u ̖7ܛ^k8)g1 |Qe4G[Y SFN`Z͛0ӝ8̌I~tjy؏DG=u*dҋtLPqM9J\K@!.|kۡ#bYRXsKS8څg 5jfl~> d` "/?^z&:zyll"utt]M h,9BNs67 B!锃 8"t-@f탙TI\[2GR{X]̎l)2`<@`ɪ""6@zJI 2lre`iѩhb쩲 W4=7w|TDw sW?e̞ ;F~l.51؟\;\;.~x6u:;z:|fo@m)޲gY`(RX`˗س ;<6ښ8;&w=؟$c:a?O#rVSYM}Zښmz0o(,Jc업pz)Kᚂzm0`Mc R9zs?rw.^4Yin+1yPeV3.it#6>I|)}xrY g Fis4_4Ib xn" S'شĢϖao1胅b le}eʳ c cտOy 1V6PT(jBү\TulkpU И푲UL8TЎr*!`t 8KKnf|J6uH)tH\*=u9Z2>G(2kF@1cF'p=q{G&ojJU3fjiLd|`pZjVنo{JהZ !cȿ7{4t&b}̮/t%x:.X>{oHRds l#p:'Oe/@*jqvRʌkuװWt@̸"!4 :?֍sqLgSgw7{O νٯUw~t#GT7F6n D(}u$gexe@Y$]pK]ƳOFQFb>w7z}x>#).AXY#Dζ AVצh_PZ)'x!YGb%Z)߅ RI5=8C[:(^,iqmt'Q^SٰfrqFp,ύN<ž9u,.0? g9,!3Euý }٫7gEEh͡Wg%֐x|zEmxtwn[e%"E-  'J q,@@`8NBJRm JDA8J,(PbDLK-ۗ{wo;{>6`J-w7y})=z׈lЮgncciwm>:#(bwtvݕ~l)ΣV#Hc[sƛGꗅR.|gKqa$Md f lDA2\Dt_> fm] =[Dp>GdmV7[O7 毕:RHut4͌_Ǿe)"KQF;z*!w߃ּ^zmef/{kǯBkJR=3[H7jи{Y͹vވƎgmG=k%w!<_:\KBvfN$hdhyJp54dU2heq:2Fp3@0ٿUC> 5SbttwwGy/(Beհζp3b$aH{FcJytO PYF|8%TB dL 3WTPgH9!c(75[^o*a([iHo6 y=x*n\RR+L9{ϼ]]ՀʲpsOȹ3񀵟pjDc[rO.F):cEݷr: 9ҐOx1 8"Dτ܃iȫ7.*:Lt8ϢMGGTpV˶t?=@X');@vzX10f;Is0LR@Vcdb^`y kM&mxޘr C`PQp]9u.6KCC1 ac7񳀸30ORWK3<+= _r?gD`T_pbO-ev6sd_ xeGOqq-~w_N$c:rj3>7W22y'g Z`.gfHͣ%{Қ%::YR֕؈y (dQm=:tv bt`³xxDo~83ـ 1XP&j8e +_~C]/}31cV|oOMm}o:#:Sy<eP {@a7fjɴҚTh=Kd[YQW[m0<c=aΝ((Ł>גJ޳,Gtt汏XcA"8-.;}綅K;t8=hT[FPg{o|bmT, *uu佱Xˢ[8[R!u)r ?.:y"./ԫP#dwڕ+0`veR'[_mO%2l` BibfVuKmsņv5m9Ԟr7ioĴq{L;=Pd{شMn.^!^_,~b̽(h]=A]Ӡ~V`Flᖖ !aέi.X)X)TƯ~^\}RWw?_|;JC_4'Uxx5<6Kf :BY# ".[;D +sA"&ULht1RF`X#g3@/_z9hTpʀXpGV!u&EJ$-pawБ02hAt|FݍVl{3]k(G$ ť(B$ J\w [SG[kz2$HhƆ:;BEm+*XF0Bk.>߳ %HyJlbu7*|DXe^8C1) I> b0ǧ0BA;Ɛ5`ħT6 7>^JYDGRqM31חWo~ RQI׾}Qڂ܀ʏXVza4qV,,/}M Q)Ġ:o]8wx=(=srG.&-9Q>#ixC텨ƾ.`m#yuNNzb\wD>(C1"3jFq d!x6|(řL, N#@@z54p-8>n% r 9Rͅ 8q>ek S$kƚ-ҕ+ݦhaH;} ;Yhb>sts-g9 dyY\L5T@?VE!I#j #jəw**F$5t +{'&| ɔPj5Ip\ʮ`ZcN5/ #\Ldž=c4k{ ea;wnݓz{O~+칼t>x7hm=#b0t=k 1ǝe xu !nas<'rVL1`F ka DǨi!J^L#5aFlƖNW:PVMc pν) #F4IS08ެCΚRh /QڂKa9Wgl?@9k c.$nj g#r.+F>~(jk|އijt0̯x"qa<(/FB0J5q 6ko}WWi"[f0Ocm-Ļtas=cd4vYk T+y.r:l0gώW8EQYurr 6FSy!A~ BC *# 9Ǫѥ"}lh e!l a C𨼟 aA*^3BNR rD^J7fd[#H#Cɜ@kR` IANעd% dg;0m4-2&Kas U*[4éPAJ++}j\kzb96oF5D讀AaBzgVѸ> \si \of*k{yre F1cwO[K}hM'U(;)~N#Yblt8 (#(} TQ<s-UZ>~e Xƾ@= 38Bv @7>Dԋ(@d}ЀS!f'39&¿  ;1G(A[JC zA FMTrumPk-^}Q{R'pFa²OVu8- ^֗b]rlϟq:ϣ_΃=_їFrsy BS콬/2XuHS02~M g|ԗ,[!qz~t2+9n|]lVUkP`z=_[ 3:9@БEeW#1*C DJt$:sM915MAar Iu>Ͼ5Wa@~$e +fdN|vhA֣K}V:5LLE7lnJ@UYU 5l(c[c{,M/` [,jR#UߴXB֖rlmJWfFpu)u/WA.+RqRo{ϢScTEuϗk:If)tZZ'-/%Pbs+88vgLvN@ϡ%~^@N"CF')0vm YO6覆s8oI}_EUVϡ{x@0WdԍnZ}O`ڔo lm L0ψN ,2MB5p?X ]-&ij~*-.@Szqb0FyObGp97U˺aht~]4Cѥo|;?dT׿kyRS@"x"Ynh2E?KJq|AL8Q7ڥ&3L+[}_rPTFzs;88FܥX}wǨ#}pàE\lnϠ4Fml/7Y!%4 xlUca j( O_<(@IDAT0D7tsk=pt54c ,_bgPàBnB{R*mg,\(>;R0ACȅ!aUksu nPHegNיY (bB#CHgnX=MQK>̏Ž5(“KDTD6Rv#fl G!GޕPI^dT=&VL$ŷ>~z5*~c9H7#ӎYǨʧ%St۠)rdTιKt*):!y uy?}L44njj*r(U=D5¼iȇ]% ٿ%TeN+Rq4Ro_w ed Ʀ=8$XFlѕz#4I:˃h,hXtĥ0lbNMrdv}X(xgVM2vBshe&~TQ|K_" @9uh<\!#lhPwwqJaRH5c M"FphhdgeƻQh_!0sag]$ Ŀc΍\z/ϛt=a+4MhA͚5}ӟHANϾ0<,.0:^GVyr}ܜ|L~ƺ@,kWO|id22=wv-|ƛiVL υ!C΅~iYQcJn.)#xyj^ǡhg?Y$5m߳3F_.;:F84Cm>=)xi*]ꡨK( ZFrq9i[wy=M \VXSAWgcy5K :GT(5CĚOeipN"Di*su#);m<{4OyPF ZE*ۗsF'gtثUQ:F,j!}j8<431524\O)n(=?: eƝΓϬ8,}Ha`g ei >9)E7_MOh Ba{:<Qڊ2/NT,eDJapmp~ϦyV}Ngnc|6Nl7ۇ^k k7SSJG}.Z9:)Vϡ,yjIX @0AR B5րrAavtշ_MA&赞L(^ 5\ks6(&c,juΌH1W5b$(]/8lmnSg8̖zc24/)F`5=5bs='[|ִfA2*<ϞÜ~{ 07юF v mhk9? V]rY6Ź쨡HvScvˑD9 =gȹuLIdyCs2aly|C6+# 4+J]O lٵ;scF%IzoE֊Tm:ې2lݭMR<;sI`v0QQə6f碀=< >ܐI ˏ)V,0(]}YpDrM!d Ƚ&l:t \`/- e%-Gl-#M})N J=&_k.pݺʳm=߹tg׿b~o7rrf AoaZArRqגQC[VcxWUUj hpDu,Vp:Pg3cZbJ&Y-b3DsȴO₭S* Qe7t4GgP@0Jn^n&/{hb\U+kkܑxCzXTڰΑ45,ej&u59Tm%;g](S:b4FhwPtvOh>[CĨC4WΎ."LkD4Шuȳ:H1sݟETKilil$6=D;bW]ksUBmfD\{3NE?yr@BI-Jeߵat"GgKLVJ  duigYø%pR0o@.נ 5ޕq 1Q\pEdFxOǘ 5\Ug,:FN& c >w&9? KNƗF !PN# L_'u0|O}az1 ܌;,_g9[ 7r>8Z@^MMMSs.+n"w81EW"b {N)hш𞅚>;ChA8Sϫ0>df0o@|5™XϨqQ,ȌAZ>8lfte ."XW dY1'P 08mc) TQ2lό~g34Mt$܏YGDB!`j? yF. V2It(`اvT}/)k˵Zr=?:<d%S^ЈWҗc]T]5R?`KY^||Eρv?;~}UTA0eMlh|K ޝAFE\~s9R K 1܄r<8~y;oUGSӍױ?ڐǛCfmvOO_0hm23MT^,+dl´[2u ú8 ̹?:#1k/^_u[aHȜS/ G|!Cth}A`Y׈SԶiySD*.`bs7aѢ?OMKœLx`w)0Peҿ?{:&)hGgu'r6]5ڑ/}`B R?#*C*>21 ؆Lr%VX/Tt`_y-)=`wL)ӓSup妦X? eE)"[ c`y#:ڟ + 0XT+kEjG=t9ueO%[<q"R)2[;9GکMina+ΦOyp[;>ͣU+U /TSO-&ηs%X,[;lݫ)KI}gS~3E΁pЖ:K!cui,k1Y?=q5BID|az@`87:EQώvL6iH{CbǶ6YК62>ӳ42Br:@X׭TG#}6r}4ӷe)4261 Yg+ݾu)rST `v299= h2qarL':+A_j!/]k6^?kmo?_/(!Y_AL C16ٰERE%[X6r@6U&qA+5%8*NZ/)LbJ/[ I+2G*=re9mjZ4` o"xsa(Ǡ`q>H0E5p#3fhe5vdn0P<{^sV( e4>Nyx?*((KϣTDAS]/c| r<:|;y|/rhnXR-EiO&9hR7(65 mq[9xlt$ P_{ܮg9WA~͢(( zoJk7Fh Oʹӽ>>CmŠИ5 ƅ |DQ.gA] kQ]Ow h7ևbDP[kp$1<91 H (sFx'IJ4;R.]L]2񵷶A'75!R !a/,=Q^[HXKZ)S6 5>ݾ}7Q{" i 54oe<~,pgeAGa*N΃o2UDL [uA%5@g,zѵÿYedEp\^hh6 HPǏJ>ЛL}?2# '􈽊 C  !?k833T um-ޢʲ0gA{y^P- B3z6we?dc{{Qttl0=}0O {]9,G9JZVkG;U8\t 2sYҗk<б3 qD4ƅEU*WƜMbq )Y}ΎB ?kԘo"l:tu drt<:µBZ3r3}n{KBȴWq0RkWwPoѪ (gimsv1@)]&. e瀹hpco`2h2+2oaxاmݱgx<"D8 @DVi;2J(K54n1أ\_L6yOYXA  F=ԍsknPܪ1=x ^n#sb>l;Cet4zT#"ӄ,/q:sy:+wwзZ Vw#maj Qjmo6.9FL#j&2 E?8Ado(;ի + NR9gϫeUpΕuKk&n܊oz2p5}s_8 v:P>ߢwUr 8US_ѣ*"-m!vpj~*@`G-iLK9)GΜ ܧ:QݔN=@W88pSݶƿKC/Wd0!KQ~,L!7Xr{f 5vEwWo=cH S{` lX|>S#v={uvXʼn_Nد\6 rj? s+"qlEI R(7aKg+E~jAMo]MVEZ u16xg/.B(A<"$tlPJ6 Ѩ\ _05~DyLCSHABΊBDxOEhr-JT;g%T٘@rOwU / ýOKEi^VGDvWv5̅*KqYkV []14?eNTR"7[[uχR(B8 UܗcL#ӵ۟ a4749;ADt8=z(= Χ^m { \^nA6lW(o(+ X(PlgH5Bfam#}"Iu6g0C+"".eԾWoBZM>`X\M"F;؟5Qڽil0niaWGW̹lq  櫉K3le1 2pP^q\(2P0{b g<{`etl$  :se%(Eo[,zI [CA;) Z)Mt.t4"y&C*=p-1}Uں 5;6ӽwSCY}Z YDF:Qn-¬cH tdȑ-5,F4;u~g 9$ʈ4)pc}(N?+}繻8[e;gD72ڛQ) -b~JasS'4i֕4?9k8/gFwep8F(L1"|h,7 Ukl{gn!G֤ c>BAvp.eh@Ft~)ɑx=#:R^S?:6l:r@y m1bEtb~vJf|il\<<yc]OϿ9iPvN # hoʓQ9L7v)%gt_փ.VC`;Y3 Hc픐ElV22۶blp7f~)k P **:ճk2#.[Aę`DKWڍpwȳu+D~!{.F ;qoeξgEYg\3Ga'YG5̳9[N]k0D\xghyi?24EZ+r]r: /Wgj|l܁σJ Zs|a{A3֝z:ȇG05 [8bJ(ue7#wucەtO3p*mқ￝htj82Q `seSC==5]C^o(ڏ_ƙrMau@{Kʻ죨M"Ho=-oVjW 8 .n{Y%)x4=xϴ=rmvv%arD6HT/Xcs.կ Ǜ=?aq/ȴ \יY>Kd :R%֎1tw]De UJoa*?Yd : _Yd n>m5C[˰iVX Ōz]._DNSc29Rj&&FIzY;Irv?qÁr+ۀ)C/z[K/)CyVÑB8IE @])"((ύt)Rs3Q<$Zt׃~?6 FŴ }aje d׮]dBfqOb?Џp=A(n9 \i|"pouDj\cgt !Oje*1 T hee?m|T=Is51`ѱ57FyU)UoߺJūԻM͘Owyc<C80>/4"GXG!F ,JQW^f| utm'};۴%S ЩTAs˗WCV2 S %(0Z͍BeQ_m>fzQ|L}c!dX}mR.-lI~fImwM1h|a @Z@piZF#w ֯1$0MH2I,0:pLSuI[fdqF-^(w{ꄲ_(2zd=Lб"xypN8VȢgK׮![H.#)EK@@0G=|9|y0ɓ A֞eCH M+ $:/ZQUD3Ks\sO9{N4ݻ̦S{s$P=:De[ϛFοU2n]SR9 k@8G1Ѩu]'õŗkQ}~~3(\4M8"/[^ٱhȎZ:E l#9Uٗ?/u,ׯks5?{ƏC gk)OSm]捛D/n cWmx BpИk1YЙΧ4.@[v*0A SSbkZ! L6zu縑4 b1j~V&Au0UmMv'wiVzE(*ӈ5"οv^LYKucr:βr/#k]',}}ZY Yo'B_gz[F= bXnCcN̦D_uħYz {Aj9FL Y_A=uIjgaABhMlMm([['g0?ׁ)Դݡ ([]Tk?̠ȉ`|ۿR~^^N2=]$ Ђ _UJ@gthPF&2;7&?dK3{:2GP>FaYSC[QF"ob,n :<4A~N/?O DU`DwEß<{F^=OQux9ZZP8 [!)ƲZ޶xT \0 ,G[2P{*P:d`fLAW @k :Ҝ55Bas r(ZRAiLMǼGWrb>ҐEhb@o@i~Vh8CyIw*cVt!@P\H:Ea]{BohM- 5ʵ-4G@pOl.Q-QJ6 9=7BaIvgVPckP7V)ga\6,l Euן=P5S ͕*=P%eU"e̋ JJ» JkD0p\s ,~'-MM_#Tƀ=i0>8DaߕWpbtW5[ӵ7o`s;+Wwzd^yQ+k+:^p}`*QTDt0 ؍aokJ3ilz" Uۚq4Q>D^*|..Duu"k;}vl|~"żM9x=i$[?c >طƲ g܉q=}.,U?h>wACTlIZZtϩ9K镗?&;oƳLѨ2ǀq5\`T/W ei\DTX5pˎF !3ϻn:X+@$iaxb>Z @Vѯ}sW5Z/2c!eqj;Ψ eG2@@M&s9'>Ɯ;EBA']CJS`uiQDba4C/#RgA! 7*K/r8:5k21cazDmPom+fHc Q=(p>"o:,``TYGyVw>=>8BOf6 #Ğ(pa-#RSd)btrW9㗺9L_uK]hq:ݿ{3 |bdv 8^9|8FuX}~eNOYͷVM}3e( 3QUtÍ+ב[7ފeiH8#MQӂZRح5=nf݀ '0'gnu& @4v @now?í.L4}rA̵D4wn(FhƒDP:=oj]H\k$oS:ZV8Ft O-ltGq96kdȺ}t5\2(L rljJ A-4Ep̔5c(y<= pst[ A7Me} x` ߅xI6*glî 뱌H˳fho*=we^!Fq+]#1/*uz5#UYU625g |&c1QKOɦ5 fto-#,s cbXC#A̼u s j`3e90[ΊV^b=s @4eX&#,쮽eI:: m'"Klc,0Y?c] Wܥ O06vc. -1Z]b6M eÆq|vYN ^3e{h9.CDS9&k@L?5R9u>m[Lgp_ۅu]C5l! *٨32" ┲0Hi)9K.uKttPj7G Ǧ*ǿ};F'~Bkg~>byu)M `*Fl1XQ|joKwɫI8{'=dQ\ն|K#oy|n)uHdxBa1p OgӰh36uw.Cua[zvދzKOݷOĉ6~yP#Gk a%}a{e/Aa)KFi!ҹIe>98ΑT9q5)FV=oGBN hK%rR8,<5Z;0`"pu9R̸j+8#cia7 *a!Q)N@oTaE~۳E`ܱ~)S{8̣s舲TWe/eڢ>~X S{wWɹ,إzCˠSɪΕ`:KT_Y[JJ n֎]Ưy#u MT7"טEݝMtIt= ʅmd)r5#['F)̝c5i0"N0-(jn2HL#g5R0(t;19ώC|1:[uh;?y8~/8t?)+1SRA g35Uk|yy/mU]ry| `ʀkABAڥ2#ZBJISBGtJz ]X\ g|\ k(cimeeg>=VtD9U]#hԐ KYMsTu1 R;GM}C,Wׄ*R0Aùht넴8k\*rJfu j@ H襇JfjK=TLc!wT35wp`5`5 Ec9VH!cbmTr-1gƛ-p<0P\ @ zr5QxiKaj1 r"O(M.0?{i*)s_ R<`jB^YF(P;)XYΌ0zv,:sRZ?xík/%W ϻ6V_s Q*F]1m1|AϦI%SP9Sw shs"`5M@gLo9ksx6e9Z*yx鈍c  ΐ5TQ0,FL< JXD} noC3[" P"3 !0 B'3x@SyWR-K!bz12_>p-b~:-$-|Z XRKS<"O' >좹(0)NxkonkNn^x`&ڝx-h; 72Jf0x”e|i|?pVm@] WVȂp0XG/=><$)"^456;'x_mhYۀ&gh&˩~1)WM@@OoO4.ۢ"U3Gi2?Zg-y׃~GEtY374@͌UYlo%cbs{õ(7R2zfxthsNY3,NmqAB]+38[D'oS3 GYwDlAAL]?sS Ku~bByi,Su_d<.sMT/Ѐ :ҥc9E@sJ~@EMt|t2ȗ[J)sx#x&m P $൸`%#)ja/N8eP&~j oY1~_#X6923Mb35Rؗ[ȱ%t{[[d:cl}~N5y+R_pKw$a^~=NdT^nK{"vhfYN. bj]hL!K.vc; [.|,MLoK v:]WF8vd]̿_ O"mwK9@@ 4؉ȺF _lBx1D]Vr 9$a-SgY1TzEyFX;Ȧjj9ms(io[cE(G2%rΔ:hsRL4#%A#~k0]%# Y]Հp⓾W?૯~yn4w~7W~b (ɍq*P"ENwN h?qOqI4:=D؜ ?`X꣊}6tOXFž@Ѭ-UEwt;~kŸPKVOdf ʞqY^AJE3֦vڗaKׯs׎QA`IE6pW±+u4/6UGu+KߎB !mL,vOaS ZgjaA=ʲk.ULmQ~=<1gT^=œRFS ʖ553$x.X#kf'"j+r(3}K#k:XsvI,㜾G  013:"8Ft4]G-? mp%V,H{#hnf` @{Md`jk鐍|éz(PP6 ch=@&/,0,qtl͕&IwWX$R(#𢹕,}tH!y}g5uOիVR3UXX: 29i B*9:Ȫ4Mw]ZľEgqq^+V'̽݃CS]eQ{A.Kv$qτ@e#(gԧy 0feʤ8aebHO=}!ֵH% BRQpࣴL7x7PԆ]Hi-#X;uc_eʏ~ iUKtk(>k%h+:+31@9u l\"1|Ylb~c'ui3)OݾZRȂ|)܈AN1806 .? c%tNLfZ4;x˹lyP{TC|du6k^$xS:~l' 43EBh` JkKVC~Fwe4'32Z SҥNt1,rB 0tf. X"?7hoqX91\ZW2fa)pu^ ɂ$ LP#Ŵg'kMkԸ:N, ck iՀedD6׆O/vYs t@)d5 Yטy hs9J= ~ؔ3 1{Fs8?)>`3"Yo#X\gLL$%#m~gb9m{xյ+?ix&+u hYxx OƀjKæF2Ě0y姀i ql/}5;v{ s^z1'ClB'p{YY@ruG?1Ȝ]9舳ctOޯZ}U7__Y`l;{WC«nx8g sB,,x!]rȶ(P{k'&JIImsk۳|rDU~*y":OU˅Fr[W|8[']8cOyʠcM(RC \chp5SCUVB9,Z}> TU5z LA#/*KQuE1R܈UȋdTPcRpA4Rid~.=Fk*x,nR ˺"ᘕ;3U`uvJ}vǧR4ҔE*Eqz?9+p[b c5(] O}K+t 1+s>9#`0zm /Ɩ FM0:|_&NQM{?zqƋpp >'}]ckS:GfHY428IyN8}kg򜈲7:0s@ 1A++Ew",#jum-e&M0{fjr:MR4ͽi4ϥG,fNtpڌjmp/g*(ZpF߱j1AQ#3mbLLZTٵX+/~FoP_ WkC۾z2R5DĘxɒX_bs3D6Ƃif̉]@SځXKЌ@s&ӳGB=ʷs(}#JŦP'9RzYL;z(a>Sr읖 51-lw >ĸ5MO$YdMwW},9dlh vA;Y.Lp{&&_{|obox-ڌ~t_!VL/R7<,kY^^HkOb- ={( R\'[VFfԿ#PeبK?Lx&b+nRƠ,vݲɀwa l̸8(,bw Z*)'$Vd:)T"K >}K<&4EbAz[D(uА pXh/b'RGWߝGƓǠ}mkw zɼNU~5 #F}r:| gjr&.sfɞ`Hpe"[$l+!٩)UShZ ;Ekssܟ ?,eaK>> \? l`Ժ` !cC2r_M5) QTY]'1,,R¨B/8:b};R[@5-x_ܛYz"iF?#"GIG7lpzHmG>F֒`F\¤-@ږl.G.,Ms::AF2 > ϝTd|.kg@0p` Tu?֤MWJA#xSdJk<?W'~)eȋ ]9V K^bbzKN+Vd+]Xm~b~V;vv9 8< Z܌v!HSB 7x4~6 >OP,"Q3Qkƪ <|no?vxqJItd Ȣ^o^4d7kkiklrFw)O4yP8] T*8:NivsY]e3cL,ΌŦvADq>\CEt^+Up^F`Jlh*mZGihaיшY W 9Yc&Q!B ؐfƭfw4: އ]=X\@o_Gۯ A{ +bY%UsrELqRyt# B3Y08m]3uϾҥd.R3x`U"hok^ ޻1MJn32MtV5{ pIeJ4JrSg :7ztr >$=s;(^'' O\FcP =ΟeTf)y&zp ַ(6R~lԍL8̫y/U3Z/gUZv`>64J#^Jx/g>sV{8a~ FUS`N~=7}P/9`7 7 dK użΠ_Ն[ gŌu̝27o{RJ)-01~T;VgvSgSˏZUܷwt`iatMJ=r3;XOW1yu!%cB-+lg Q:&s0h:Q[H ٤n@t̤: LG`A1ZlX˙xw@mտr3š^K—,eP3vUA"/fWtH>R&2[!V?Ȧ˺ڛ =F?1;Abwg;8EV'{*lp dg4$_, ;'#=j;m"qʋ4G iV5d3tyg% 32D#>G1CUAZmTP)j$jL{+8(gUiXTq=ؚ?^Jٷ.}l|,ݽKu8#t> G;t&.΄hϙeO<f K xNHy5,ՋWcjYqki2m$|TC#+;4=3[&;™٨X2^QKjyMl`A6#wʼsK81 }kf}첇6s]䩺%CLɓ8/6_&ßg y:r h$1AC'[U 춎.KJ]7v!` :FsVƸ/>5:NP_\2<6 N1DoWg&Cd/W4)R(>}'iCat6?vD'ldx> @wn-I)e]=H",KZhFX{a'cD;Z;3й,|Ty mzX9ʽ{"t*G'h0/.]̹də鴀okiM{xV"{і?zϸ2΂`LR*Ҩ3 8%E{e].S5<گ}&0AWׯ: UwB5g~anps4s,֡u 5QGnΎ VZYڰu2f:{:b e,.Ny8} |=t(Q^m4l陾\i\#3>ŀU@*+ΣYV '(?nkmp T-;Wa7aH6>JߨL=#(55qMy/C2n(;УZnq,ʦ;^/kK=+Y$1 ư2g:&نiP^jK7_'9R7Pۻ W0 {8=j滮*5p(Xc]Be>\{`=` N [|Ğ}S9vFϳ*Ȅ\ TaiVk[w{@O/#ӡK3GPY~:]؃r/[?j`ʮ_2O쾯oQ3{;IyS7( 5`_{9&$xobOoUy s;`|}rlir}L^Y~16l<ʐ )-F2ٓ42> Gw,NidG{irh ~멿yȾjV=Vhʰ3%O ZUٷKt9tHcs_5j ѱAL$-g4qN34tKo >ٚ~`o\CuCMp $%#4TEȂh e#ׂ>v?6[=֦2At}Ov^, M>QYYfH:n8W(S}aXwn>󏢦@f;D?>zMVCGjKgF֛/ h{Ag9'yFЕ6I)aYolP,_u" 9'A[1z<,4&B.zf,8~PCCS% Hɘ>zO[)Eޔ! =oGbG K`~-1@6X}Mtl۴ӽ!e>;^VVG >-_BY:#Ѝb9z-Q ƹء`=eySC-:Sf*h+)> & ȴ`E0`eVI">mlG=s {?ˍYab4?U@?Ma9{i- IE4L-7akv9lZ$ =]} SIy>E}-=Kl*32NMO0G@9x/2 2T{FB>MuShqJ{>~bF3iMY?0d=-؄ r| \V2>~0C֧iC^fZX8s->P~q̷ѿp璶)0If][3d&Oi@O^RȠFG<73;bv Ț2ǗZ:bp0j9k_зg7.OӉd`z#D`Oؐ}A*U Kk;uMsh Llz=4bjMm靷^}g(*IO~G9om^v87nF6l1M86<W˦Lq&qARkG!N;MI[53FY8scC lY26?%-&%4l`\2kRjB7`Z}g?QN /422ʺdt%G|S (B; KG-D瑑Ge,|{VNcL@A,y4+IH?8 431nq!deϳvq%&@Q)"7xnL\ԋl'Jc}ar#6\ϙA3"q 9b=ZKxظ|X>3'_Mb6&UיxNBYqli N̰TRVZQ qzqppĜŞXEs23GL[XkqvyJgӀ=5ڲ"ABJ")-D 98PAS\_QȬ.uSpR0(faKDa1FE`AG, d5qrͤs!E^IAcYӈV/0:2auv 7w Mr 8K65ד5C.@PNF$}F\f] sk ;nԺao#Tm,m@g Ë< ({>DυĝL-UO=OW4j2Bݭ^B_ı1<"6G6 c>ZgfMғMoǣhA[,glmLgNW{F鑅q̜M֖YA@'':Rsq.Nkfًd9vIAh"c$ p?$rx.*Fhi U<,oaN(A *A{g3C& UMFyvj}Q}蝁 ࣱԓV' Ovy`s M z[ADQm(!d-z  Zl &? (!BLW+ lH; }-2l>Q ~6 :є}S ˬ%{EUz-!aӜĵ:9aѐi~f '+? )7t5|X+GشdE|5#0ᄞ$vT,xwX]C9aQͺi' P^wZ7MX2h/g5"j>,*簶ͽOhl%}5|o d_r2?$0apW(i!`Roc!!4 Qfd"8~i Gdw\;@)V}xl[9>q'OCNzu/,5RFu5a0Yp{d6#9 cl,7{XXDffyp^El˲iГAC[yr|4l8k)Q6W(4TF7yQdL@nVM5˙ 5;l8sbvBdGC$'9ΐY&p,k%oOJAd3)39GٟtkhN{"WQ `3qLorf"(vttA#!Ц@|26\#lAEku8 a؜qAY&-|Kt*ɘ*NhMkJ~v+-"6uurKGd|~;Ύtk[ !@2甇۷?Mcχ12 ; `*}m}lQ,Cr qGgwX $WЖhhР.R?g'?4<sŀ]l71t&et>~ S/& U< EE="sga܆!gDʛT͟}idoyߑ6 ]ȚӲ:*СMtL7uJ.kekd/aQ'( NQ^?1zn5\=+{lvC9~CطPw"8d~A=IlX)7^r%}z4Ȕ[ /9kb3һoM&2bGՅ}-vۨfs3i= tN$',\2j[)E4E֖=ceV^F$P#YRdd19!AN4c d\jR36l s1%3-묷̀R^F*` ,<2G63uKDQ@Wv:va%/v`j`t|w=plyv ڬ/Ka+daus‡ǰVsk}HH/9n܅\][ȪgLAQedJVYVUN-u=`p+xә/sko uU9rN)=GfNl9``: A C#Q77An>& EN]SY{A&eDK{2_jBkgG?nIG=e[QJ˺0xAkL~];t |E6YBӧGЭg[Vu֑ϑ8C?ϘLFWe~qӥf!:Õ^ʛGiM"mʾu||bj;::衄,Y8ykȜ,cz3BI*%UPy8s|eO6(k-hbO& Յ8{OY99f3xpO>f\׸K;_і{/~e6 Xmkunnks8׾uVР5 & 5[rFLx?ԁ}pmwDR1vo^K!ˠ@>r͘r<{jG ;C&K~aT#}XJ`lU/+J؃< ˲*5b0g5p7hd}`'prpRY~ b]7E58ki \D û4 u#͛oZ#9>aD߸ p-dtWPL  LLsaXГcqwi#Iܲ_Po3N Tur(c!#h٧` !3d1uvD)U%j].]JѲ3۟ަ!O~c,]3:ud.7Lִ6Q!? ^ Ufʱ__)Ν>&r㗠O#Nd#L>| Q$\L7@fGs+t 3Ȏ_B}!m#и_8kcId~{<u/S9/Ǯ6o}HcEI)4 1pD*Sa*#x(mHrUtnܿs8 $9 - $2t{x*MAZ;?k^NMY [c YW2 ,pel id,<6nϰ2Gdpo>Ʀvl=&(qi\h,ӛr47^\}${:6CtIr@B'/ңiXuъ1Sh33;#Hyd*: rNXxr7 #cFE2 pEX5iNQu2L~/X 2􇀘Kf2b!6i#LɃu`C՟ǿ?O#w4_/?_w)}G֞M\~R/zwu94ᑮU@`'pPdpl9 b)1h0UBftL V1iUI~!U0bxyNQ-]`PDIB ̉:P\Zru̜M|e20ElܶB28fXN*< BӁձ l% {f="c ;$XCȆ~722"JX'5qM]\3,8k,3MY  \_'hfhpܚi)OͶ {6m-( Y ͅ4jfl߹:[(fS[eUM @e>F`&.i=\'J@UYK@Zk*ZU#̼eo4pLFӽ;QЯ1VkY1:dX'^Du*?(k,o6!S[ek YT<2QV291׈&xq\dP `EՕOG쎴s3F&NXRJ4PP9~˙i=<Oʏ%P-`%+ ٌ,tDۥ+?AL dHcߏX{$HI|0|8M Epwk.)0'mtfcjr<K\s MLA8R } %* C.8{5y6Ki83/]AEhO"^O6oGfeC=Q,&X2td95n8tuti+L}ݽև5jY3)Yn ]Nu~ͷbJΗ[10F~>!!{ޢTs҅g`Ǡڠg;4]|t@mtT$%=p[6͢Z=9<!63`YdO@zPjeYl`ƃ }VbȱL-Ag ~֠3e 8FV,6{K8[`)<90r{`Cpx )0s~`c\Л-KE,q/DiN8z6zs63eA3ǬgPq2QgE as憆GУ'4VI )Vy ޽Oǩ3[oTSʤYj(9<4/Sc@WBX7VSn_-6g^=_LP[+ilv2Vs{3c%nd p-Q1cUZHc&3- 0ldrî`bD;Zkr6Ƿn8K(=1ޱa$+~=8S}vg Ԇ ^ -_)$1Yr6@_Z'n#~8&[igS[BOgݑ:8Xʵɦ->~G5=2;@oj fԟ澕SΙrbobf_@ xr);-6W\N&LGK>rSn0A2MݟL)ͲdDsm}@|4Sd;"gu<7_Xӑ052d@_'%66gO_m*n/{52g|o՟}Selї_=PE4'FP6#W;2>kᵕ}MD o/*?#v,kaaYv a8F>Y)3 34P81+xpAE(4(A[Unfi?zIQ5~uuu0OzW"Kd˙w_:NU jPZQ9/ƌ,V"־ƎM#m65uO8}La ֖x)[:/>{mmm2(G/M)4yV6K8"j }-ϫlLd{G Y*275Cyf(2C vk/^GL@ݻAu$:QI&rGQ{ﻔuI]VZC9= >; lv \)/wxi KU X[uN0F`sfӴ鹙 _%1@lljNx靴0:ESC@):u:f ?mc35,f-)A7YS ?kҥoRE1ApAgy{셥 P\ ;T)e۹pD ;T㟤|ΐm 0+> zR` FFZG?G{Xuzu|ԥ]cޓ&(eSYT&(Gh=sjq==̏%jm#GnQ+Bq!#8q>ϺL&䠕'2Jޥr Nv:6<4ƾb1c'8\bc \;A|K,vtt ;F.qߣ6HчUkqK-͎-lD'Nϟ2=MKFSgKc\xa/ N,oK{z?KC#a);QƊ j򗿔:; c! >[f%.\g_?-)DI*2a'l=Y ^2mȬg %p7(hQ!Q > ~n%`7ޤ,F&O['po`jBԳu16ɘOc) >]/_HdIR#𧀃ٖH\:N:զ3J/ًP.aLrBCU\ (gDvS } ?%sKӊcJ{N?;d'jdDژ9~1fX2}L}2L!^c{FGm$K?\,F3fU?#Xf|~`Mƌ -X$m}M)RٴN&N`",3?|>J 0HKAS;IB_=GR 4 Y[ RE|)v|j,b&k}G1`SoI{X",{^^\K0VWW![RSkFtS|T?D9`I1 &eMb=y^]w=`+w+WO2&Ձ>cٷ#Qn̽{]XL{BZ66+!3R;և55}B˯+rßό<Ս-<}EДô#t4t kRpGtY'MM?G5^]C!#3S19W:e]|9,Q#,N⤙'b]P^ mb6cOv<8j*ꩱ[[tzN}*J&mKS﫩r:y8:L@fjkZ`M+cT"qÉ.eIOt_u<JS; 4%جW^\K=)NQK[#YZ;`L{d# R <mtlr렛@=ĭX k9~w^O\CՕj̬@<;24C0kt^E5ٜȎ?}N=O$=r<fu Z4L ac= ] (,̞/S_;yQQt4&28(驙:;bl'L{V$ exeyA;AY#?:2k2cԨ YװIaQYW @`P^߄IA!@̶c:krCCr`,r>IŖb'ORc3:,aؑypΆ2t 24ʟJh2g岷c8/d\D9H0tЃiT~I ɩ9uX TYcorZYi0+ D g`XPmr|q[i|٬ev\N[Q*QCb7kgojW'"Z<1:7@iUd-ئܑEȊ{N^;<Ӿz ztǸM:gͥY]A7d"6YPr4r!TymR4 &@/Փ }[wOn*\qF-'}2}o4Xi$  ; km 5t.딟`ofí"Ά!J0Þ++֑uv>^pl mqveBiYH>]G.9mULh=yD-]?:hE4f91"Oیs\Fi˛idz$ qYh'Γ y;2f2G t |% z*G =.03rNF 1\ϙe.8bg-rڌQ)#>dnjSQM|(% 3 бlP$qrѫ`S^;;kVW/(5y5O])[NJ>>QOeA\NnG`B[.Y'oD= d܀^- #f~EdS!4,RSҴZo :bWy7)(OIH?FdݑzHzyLr|k+dQTkė#9F]N>QteEAL.~@7/fD+{‰ِWҗglS+𳳠9!36?xa^{;ͦΎF pS'd49FxowQ[}󷕴_/#_~k x8+$Nɲ(OQ`c|E6Wc2i t*fr`=^3gT.f5RzT\2H:tI;h'`VDLG\d'ɉ49D3(-Ϧ9NlA5D1yNnk*cW29JꛙQEh3- 0)Qʱ #w-d`l`Ku(s&/L7"kfNGՆMvl/a Q:"<<.̘Q:ئ} aA{ޙM(NG3nugqEͥOٮ PAGl և#d/+ktsgދF4%?~5FuӨGjtī֔uךSlc 1^d] :|gz8#ԓ5[_ hj{<Bƽ VY&#쎎vhfom{Jm_>\@ٳ^_|W{'ע20G8+ 92ӣc4dD E2LxInA7wl9S<0dhW;::l3w=Dl|4t(fNI062:cPGecjj*TF}u:M<gѩ^6(r$\<R4AJxu ?92kPe.(tҳ'Ϣze/?;J ^;zvpVԩ[tIa-)NW_iϵЌke Vsp{{" \%o Ñ XKمJ {>UA7 "{ٲItu@sBb#iG z~s4!8q5/Ҁ SVO75 W8(z)m# L]Tuv(5{s`jTˑ&j ^@@^{ Mxqz:M&JH,UsvrzƿhÍ`WpUd 6Y|( ^-ے!Mݠ %zm>qo@%2`9s `L:HWΧK7r$xe ~ :;6,g(ǒ2#GVSFH&Gv0ˬ#g(kN|pnM#QAy#ϳoQ(j^w| ` ߗ!^w0Tǩ[sm˙rU?N9\;?e͑bM (r!>Whe1wrqQl-ϮeRi24x4Rt\>pjϠ߮!֟&}d;e}%N*@{߮G~b|s/~ek cK D<ٴcn`ah?=>:V- `YHC"+i H6>=SJ'4kC,W3c{۲WgI U@ 0 Wg,b"zGJ8&Plʬs(Ʋ:U:𳹎29·[*fgK2]li)9[Y]~w~{iZm>K_+|k~=uWcS oEUf03@W`޿3p8*ATP qp(oQHjoBX/0.Jh@-GʳjbD$v Ց[Lj9:OM@ TS>6 FAoʵffl~٨FՀ&*p5(xѨĆR6 4ޡf)ȵE㝅snX` ^\KȬ}o>K1|e ыYg`ɚRYC@/BMNviۜ[L04teI6멪\L *v\p "PR*z xiJ5A,RI | F_y(i/L"O$(a ;(5ܹEݥ1F~eֵTG3R2:hiL7$G{) .B[[ҹ&f.F rE x ̭/'XMl:H]ƟK-M83pf4#}Mpfz8^ϰS ::SγT8eFE|> qǦuaa:x<L/O{y~\G~; `k9FO3|zka +ft}4TeGG8 GUA:fWMﯫ; k2;g9죟N?Mc|f  troޏ5HP)| ϩ`_ lhȾ̱G9ކ4Z؜j(M<"Sҕpٔ ƅf2` J *QlDguXkԉN+b :emd> 9k<L]Gpq ZmmƠϓ 4s|,i)"Փ*s!dPGtm7fX_˼Α 9ve 4|#] [\~J`=4d | fj`,pV<xdsU_2>3g9x[8},#^'ULv\ W:{S5 x^#(9^;_l{Xf}ϭRWɻ;R%ِ!BH6``x-,X’>Pi ".z'tOOT9ne~nۖ Aah}0j{ys9o/_% hS|cXS JeӦ&rUIˀ g6 թ@IDATFUgؚi)A~Yceu׿Sӂ{L=_EבiTKzFMA;"?hl$1̽H~FgoY%ecU#7KEo=3/FYwnˎsʿm긏=O~׀ܦ2B#O>LAC'q,u%g$ 2?Ąb2‰^Nhk{GD(GOIgdiO,\,'frlq )rԣ8ϲˍU◢\zӹgi`K0zp{`ЫdH0!,@,ceB k~SK<E![,~=Rb4iz/_?|ٿS>fc vAGEY:?E)MV$zd ›/EQD'"p.k(5pxSEF, gSSS0{o=`h krk|lt KD1G\dVƄus̗]^i 3][shl8l i#8ZUUvj8m,vO5dg *1 jEmgF2^p=##a6YCBsߢ"ھt. H4^r6Yoa5$aZ:0vBu, *M A45{Y~ppʽn5HM=g+ sNdj6̠)(oB\M\:Z}&X=I2ibC5k5DeU:G*e<e9f* k &o`MgYV yYkc#(MSF)M%qV5t -B2]z 4Ǝn6f7160~eHJA E6=3Poll T~[MNѼQj<fW"H6Q߷FqwnJAR T}}"Jw<515K`ŊlY'[m8x`Q&j?][I5^6D64(.e?HsS^ICKFC'!ڗA@=mXw]'sdSf.z'kdGtie Neg g3p2-=@JqԙIvc\^L(x`?9F/3=@eU&M|v6QH \ @1\;FpУzqhZzD$B}Ze)=2s:53\/<~?K4F*+kؗF_6\A!=H,5ف.wst?2fMZm4:?;<|ffSWa&/,.Y{3Sj$Zfd9Z?ԜS0|rH]/"(i/E֤ 6n2vKnvwyV 6w2t 94,S;'g@,|ϑ}N"(omAb`YJu*fzs]Igv[`B/I?Nr4)N}>=<2)p.@ ui1͕OAЖ{y.vs/S[MFw/(iel%6.*/QHvT, u^njK_%ӼC(XG]vjBȷE&zVVA:ʆE I"{<99#@ŲJyVM\#E|]3ϙ{N= 9Z'x>Nϩg}1W]swDFKm&)?K>?~#P#jHn<`垬8̱&~% ^/]Ώ2bi!u zξBݶΞC 00>\#{Cq^Z<U:\6ςlQ5 o7hk\s?6Qlgm?p _4©19<㮃D냕G8Afj_{Pn=ǰQ}م, #A!#w=@`ɀbvz{Ӵ, Ku4djg޻:&,[ [|8Wڛa=^lLQBomm &e>`_5<A;w00uY⤚yRJOnZzA`T{6N h>eY=0=E jwqfN(rb?i80Oc/86',fO;:Z4xa rkv9o3re^Q6T, ҂cWÙ.}hQ sm@man:s! o53><{aT3?+Kt}v|bXjfK7Cvt J3&kCDPQ s)v{< }#u)*dPeP#'-TV 1 5_4G4Y3mO: ݬ5gUq@V 薷ItA6jYPy䈉:ܿeϯ]y%/_2z[Ȅû?dW95mdyhKH/Oe{62m9_)gYկ.%J aj|&G@bM_dEj`.( o̥"|ׯQyzldKI3˚{.#<-)QH7X?3<l{^qm[BY:nGczpu& (ŵ6$X鵁F976l@x9'ƾh$eII$Wz`4tQ"/a&5{{`uʺ"X$4i$+E-*^`XRױvkv7ʫ+;oտ R8 달߽@5$\!vVa`ELd htDu>T5ߖ:ܬ:~b[4=8lL& 9hdJnówXgdj`d:dM-yu(6ݴ)"tvjvf&v%Z] W&G09Ѥ8v3d +fݾHX2զ^E,`K1N=VG^z 1s%#D6Qu( w`'ؘܣ`e Z:bMhX=rz+_y'27?4"P5W/_L( Nir⬆pq^S#4cA2Ylm92 /]!ٳ>ʱgI@V{@3?l,`ތd_LY '~S `~(r}Xrc-{@'0|Zφ`>zO7Ѿ2R*w, ٚ~dzT6շpFDC0UpCA@VK=,s0u F5؂ y/Wh}GLz#zʩQ'4wd)zs#[ &@Ϩ?p|u+SDzL?|)1}@ Sa _=&weΖQ>׾_eybb^[|[흯405pG#xWQ:_*FD%ΫR80*5J`3fXϴALS{3-7ҽwqz1XP1""|>U(z.MO\qY۸GwK?@0R v-=ן|-fϦڨ=2hfTKjFgԈD<r#6x%" 0*@9k!4Kh]g?Wa=?r@a؋4":#:}ra{ 38ufA3y% EYlL^CchQ:Xf]r3J+8hLT{5'+; ȪRh4kr\]1Fl֗χO ě,fx45ȵ㜒kUl A8ad7H/#(0C`3%gpêY:p4RK@c졣uzJpp+j52,g@gDl{fWYy2W^ 0l1--(;dܧpAGCSb`p8qҁ k D`[v:a9 eY9 Yi2j4H2s܏ Sg@O?nʤ`{)xhCb{:ef[4ʛ$8>אu+ϑw̤yo3TZQ/|K1pF>[z^gPg '€G>nqK&ڢDԀ6)ZZ)ҮE-{gf'|.`/>ORC[gx!:/#|^qϳɞlGmPYO >v|v )Ov:z\1 N[8:{!GftB ?,q.Z{ץz\{1u@D>N+Ӝzg ] tQ(t|K@1藝pa;1RZ;"B%wqfݹ0='a3M4 ,5$77OOUp` -M@ťV ?7F8s[dX 8-koĵw4ckiي^ok mѶKȚڻ@zpqFO|E0;螚=h:f|,5t4[e3x6O`nت{i#=M,/}eTH^0+xf,m d|8me+rjk uX1uyƴc>t5|}XgM'ƹ>7{DNưzH@`_}ޱiAUHYʂz>R׹WxVTʛL?ANm,!HN:,[c/.YiKunu'ǮsGqIG2̈́`ewk\}6TD.*G "wYr}l'6#|WPVڏpOruwMC[ɤ<i[?ЧK$tV#F-r˗lI]\+fu g@jwI4<vX O5]gϭ HL3#2[umY (9#`c!}MG}kB<3r'Br=ʾ,2\HhX#2df zoB S}M>7GOtId1I,oRQ&[3Ym_#ډ r=ݏ=~o_/Cu% Ϣ_Ԃ]s,JK`l(mߩ<ӟg[9Ѹ%-+ŸQg /޻M+ bXoX%(dل>j"q]OR{ mc|S~ Np td{MM~_onVW_ZbGn}cJ cGHHJ)n^p@cVj oRkڊёiQG/˗ϥޞP>>tKʟ5?flbPr2g%Ga@>efb pD'&Ʉa0^P{/XBq{=~Q}d d3h-=t03)Δ7Xbx~e K[dd%zG̭:"o,1<2lZ@Kc#PE@i4o66S5ɰ 3>&O*('( YHy [3/@ Ep, SdDϤ/sIJ3;dg&GPmRf_03=؈,"}}XWyn?Z@')+N: <+%WB + 4G A iCmTt,  YNkog:F+:U #2v)o ;bȄ}mYc rc~Bmߙ8l P:iGG%]da7JmWϙ%fܹ,tӘ2ha%6ay^EB) [e9ZCJ;: :aqx6^tc;BR747Qʽ// 9ty|Z~FZ`dƆmdϾl8vΪel6Ξ:ګGc}V&L(EpZGb,{ sEq2lMz3c ,'}^ *P6܍fg6s 2lznr>|V2X]8:p7B T&YYǖ1z&@Q[߅74{ͣù&LLE6D5tS=уa}:$& D@F= < .j_{hhĵɮM-54(ggvi2 |>$9jVY5T53;͌yVˀB?կchVP.PAdH(Byj/Ы,?AKG;kWAeϔv"15☈ӟ+I*|D=eȇe&LL }bI ݈[~M=~D*2H2 !Z\c_gW^ܫP60w- Rvdw(_`s.),d%`'C;,;8czt62@Jde?M*36ߗ'dò} 2o|Х3Ul "CmGyn[-xmCZF L`?'`uZ_Bv'w?]]40?䁚f Njib4J$t4;_#KE*V9s0:VA砤KSX橀Dkޠ77mc 25+ :+YAV35(P/+,4}K5_y'}?yNb|T}tGfJet.؁gtƈ8!`ҠcmP "Zh`oC0A`JD.CPJ (:mU 3@s%ܓQvw&D34ThkJ_z5'w(5X w:D6'(qbLZ<|Y=GU>mpRu˩ 5A l8,uL9,A?4RtDswpgNS j&̋ ݗN7jBaNƨ QB4#GC)S!)mT8 /Y+:nY{+yX,ƈh譟R*8uu gm;ݹ{?҇ C1%5R >aYLc(e<6Avt j7{l!C5| = ⤆u Ayich3#bliKZګh6Ab@Z?*c:%w(pnu]SK$=@ xM]pGgY匳ٕ^vGgirt~inj:QlX{cϢ̊5ju\?mG.ihԀT,ڙ3wiq9qkEʈfNl9i#)B4d9n Ƴ?YoϾ̠]3lcNmkGfx^G*`7:pۧ^g\%C|YcYe52L2^e.}}[0`ə5O=Jۿ EͺRF Q}%xE7ԙID66k!/9FoМpt4eonc&Pku)w1O۰C4x"@\zԑ6gc mDYu Ю@r2>5F#)D&GQaI@M"@[e>wIgfߋTq$ b ѻ+a3Ł<. sf-}.- N˥ځRϜY<,'Z^JjIqۼpS Z}>c2Y8C Rn`\}if]`#ȇڗlbo_9 @a2gXv li 2V[Ԃ, LpdI>at-UĠBЮ,J3 [ 4ºw_[ _ 97<<a/ 2tr+ReRtb0'eOY Cb99dC|69CMp BB0Xf9>`ns,BL[ld;GMR}O|"Ǩ3,k. U G ͎@y}mr_ď6o[C vKugWz>,\HdXkk7AuϖU}'G %h}&VV zz Lx> }j' NOe8ZQiN|xG?ʰ巖-;ߏ{F+bRH8hkBV;'ߥϊLΧ?,ݻglQ@s i_p(w .2&Z WTL%o)Dl1KRou³/|(bWV`82EL]Ź9Twj|:1QߍNYr@26Jp w~kkBs|7@^RM?}<8o}oۏ?{x{nor5X6&t#ܡT@D SA![4 H]pJu^'Z>䁇(qLP6:REs6SmXs266\0Oa@1izi CBa\pʚ <_yXMa).,`Pօ>o(+=`lHYUVϙZs.?1:f ɼͣ6?0o:{@Rkg{4caȴ> IvpP#Tq3Kdk93:::嬕Y|3Џ<$Xُ #`@#DŽY }qqqCv'ʲ~dSH᳴F2hgdF3yA9aЀ[,kC'E#u [H=l, (-UrM %υu<:YfYW[ᦩ⌞ gi^e^3Fƽ>T*ǡnz2RN`8Cg qmZ*eg$=w6s}Ɓs| `Ql#YVSax{zATggfv *^t넯^2kΓ4)Fp]P[}'\ =k/uE'C&%m8Ϸúffbv銬6ec>fPECP=|$ݿs/>1BPzy*,`E?mY2dDѩ=Xz fLem8VpLOB8C)'xkJ׏-`}h_ Q'df%ؠGw园F}+fV5;w[8FΣkT<ĨB_^Mزyԃ[՘K􀲌c!4r6F9 &y2nNilP&"Y_'}I7`ċ5]>ԟy8E_zՐ ? < 8Rn0~}0 X{Yv7CW-g (cRl9"#e|hkemd3L>'ذ# )1wjB]#[coӃt+8Ui?+tu#R#^Mlζl6¹ #>11˺}av P2[B U2YI/_l ?") wVs P%'[(_u>cn cԯQBЩt)+T !6comj AlN13+]QVg:Ɩ1xg=k_s#> ?7m?t!kl G6ެĞ zo.!'IZ~AN .j=g}fxA6 `>!Cj@IT*g^}1:`fu"k>zoϧ)gLmO-Zτ!din૟! 2|R/@gsx}UX&L۫ wgX+|&{{Ϥ_{%zmqjՖ% Y&gNYk۞fN {]7׽pO+A52D]LiAНU3 0K^вEDMALBG< `Y{ ecm?oHfX76 }HȽvvtN]LNe˦oò\M4f\u^=F 隆 E! -نHc__ollx] ſ p|P槏"# %u\rHP5K t ڼOdfo%hUq;md[w:MJq >s~uY(YY .#a]{wݙQ:6k2;9::z2x"?fY?{|(:6ũxa:;z DE~Yg@dhdJ㲖w0CeXqV{%^^;*?U:m}2tL ,|G0BEK#/(nttY)3*P9 y%LvY38d}Z18?`%ήzCI{5cUVGfQMsCH.})5gD+Z#yz֦p&0GQ#@btt,̍']AAic5$0pR)MlnL/|4=$c6kYo^ɿ_?{cEcF+{8zg @XWpѺw: ,6@Ŋ@IDAT_mFlG=hP 3Юܯ/SvvOQ~hs:hiy"x=(\g!J9>S!Mu$TX$[ZaB)+K+ s>OOMsn=O48pDYt7CA~ÑѲJ嵚@KU`L[NjPc ?}'TM"×N7A'kBћ;ɏ Ӟ8dw͞;qj`&.Av 5/LGUH.]N+C+e Țwpu%Cm!ެg̠5Nxѹ5 U><:f;WAv-gl"ȏ{v +hjõxJ{Y v2mǧ A l@AZgk#(AWeM ?;R~_{d`)/á ~J~nr:jӹsQ {9f駦_2ìX$8/R Ȗ88t *l*ϳ>X@gw^z%Abok췥d2 :M@z:27HX4HoZL.0.ftwuRS ȉaXGXJcOA rL<=o9J:׬MCK{M1bQOUI:;;se]}e5HiMT8>/et684.|[Vn`?+I[92$htjJqvAL&@L/*|Z)ʿ~.̧/5??f76SfýTdy?rԳN g) 2rFյއ{1e+_$?;D?y޽Rbe\`S<"i6k3++lp>0GLoTXfS7, Sdu;8*i; J>| --a)ChlaE6^`6Qo`;=86KC8t& [=j <28ΙU5=g8^+&Ӏ96XpI+!T1i42@Z5ff۰{JϨBhVKjbƉe tC+> '^Z`Ɵa#w)m,M`W QM=Z3 k4reu 4@1de(@S3ZeѱYGOCn0ugfqpAnh|R MlLN!bW<{6jZͨ7BٵG{w(0mJzn,I54f|_v7 tI)::)\<`,Y15ft0 64f"3ůHTD8 I 'ZN oAV0. G@fwzF|!Lq2<ʍ58[5@[zUʕ2O Bg_~UJG:XO?m`Xgł%2U.sfc.P9(%q-.J -4TdyC]kο?-ۂuj8=vY 8jFv+3%fP/w} 64k4r.OR!.;dtӈ.Y5t C8Y$"{x~<7ӿ?uכ,p1evdal1nHzF P\^Q sd8CSSޣi,e|U}=;Og crBf{[0(Vmf `ɩ͂VY@g Ia ًR=36v53ݻ:!;|v;ۇ`Xy>@ k`b&>AdG[( =XGeZ8wɠݠNݓb4- ӐZjgcmCV2jvgaqOj} m:NݞXDmg}&cA!p ` k7Ej2N:T1Їa 2{kz2dg*}.=ʢA}\A!tU< vϼwv `-)?giի`:IGp 5l15n鯪Yk_ I`^L6s}B28&6xexxkLj qU\Ud"a>5[$,qQrYF)YHSe8H. H]@pr3Y>"#Xhmc9-3i_eIb ӷ lib?{H l |kuW_y_y`x; q۾oo^{.t6N'HlϿ)cL]} Ƃl7OA! b':iynwx~ѧAM|TZ:(PZb{Q{67;YNv؈` \9jE NLMV";€:0QhDQk󅞶tЀL:&g/QەV+%@`Zp✻m0s/`}kv`WSQC[:\%|ĺ*n30*kdQXHKTmj0-4pOMmmx w;WI]%9 @n0m0P&ѱ{-0x?>Fm_'\0(ŘW}WѸPCd~CMEyMe A;LA)"\8"C> df2f?·΂Mec=4.=ZPï/Y(54!f-mTG͑0(?ʓbQC l,FUy2)AD%=9jK{cdRh5O3 p]e} ޹gZc9lJZE\DVhomԉց}`κAI +B'HPehw?A}@d %2`cye3OsC(?}1KޏQ%@3'8HW:Bxչ64X3Yjc X@:]f_:*mi BMzscgIg ?'EřLe_o@vBD ̱kY-[@)@pgًz֨t할o|;Js;a&n J] rL?K1RTMd1 y ~NF@# A&#ΌQLlgOdfzEg6sl['(&PW_:A:NӳlKȓY ʡPD|H)%ý13bO[fO9Gv!/KyR def(g Q 2pnɊMː:a n*#xa"H$Di~= @+8- d5\3_s|OGcGRf7 ~}`t[EA 8NmK]URhX{H|L g񳧀Ugو/C6_:?22N euebR:ԑ_vG5†ĠFLϐ >ztS f$E>IR|V] Z: ?@``eG"YR;̵%@F&_z쬱Wlk~@Szneh|BǿR>^4lޣ6YdjKl[~km:YgrH_?*̓UKeyr#rB:;Q#\ϗM``v5t#L'ȇv`}!BM\'r{8Vl tu~s̓xTP`Ϣ(`A+zCnųUɪQ-ȩf &1Poxoq Q G6574:]졬QtOZm@c=)%2Rl$ksCe$ЦFet@={'>[˥)%YXÑ)o,4.J(Λm>G1NfY oPUdww&tL{Is,u3 SSirlGM tt6p=1 +ϧM& "Ս88*%d`g 3S 9|1N1Hy  E0qҎl;ՑǓ8pj=B=66BO1Bh{jng#1J2hM){mRLA38|_GWN82%,"@V||:t @?%dBN8\&zNXrq_'e6*)OxH4+cC@ljIY6 NVC^M 2n`àL8;Jkk۽_g'h|.IeoWz%4p r/ L~/+ Ǭ[.&̯POH-Aŀdz3i5Yz̥I:R̷3/K}P e2$N7chLG9,2mCc>8Lth`*ku %r`l0+dš2^|'j&#*ʫ֑sVᡧ||j|'C7 ? o`pY'n3@9-Q7N OaYipxq/DncyBsfdyn@zR62t;*i3{R)I'7#0xRP-Cw֓f9tHqRF| [۔HX0?a "6CS`n2 ilb=q ܓ@,7o}4ݥ!-6L' /Qs!l@iς@ȃSdCe+^M[; OVC{gؠO>n0`f3-pgXʀнs3@pJ:ғz0il#F.o`yi*< H$TLC 1 ];Е4sexYip`\6,EЀQcSQ<1JcdY%-CXCԮ}n N4:E]twd#xt$Ise, T4m&ڌwK[(}8*FVir KX XHP\z 5{GG9L[U׃!ٍ{4mO_c, ,`d΍2V:G _юB qRCY[? E^\_3_bLEM5MFq6lے;F(j%媂g'@y  }-7}VeJR?ĵ՗U_VH[2P-FƆ7fQ2*ZwhbJlX/|">= h  [%{3X ((/#_X!6ޗ[K+ P>́ZJ,9ڡQaصV|( qy-h!bν }R`R.3 HL<h_^2SP]yg3GnA$ic/K}(<>gⳕ1a)2ȓ*ؾ h keȐI;^gE\.=\Ưt17޼k/g߮j}g SNEVWߺG5eKbyB0"ҋ# uDG8纽eZpD9WLp~Cg3:&5Һ̄`h踋▁xoaTT*} g`lQ_?iNWRܚ)SnkZ TX//p]Ga lF8kʹ`Pl"h,0i dEݨfG0b<{>at08hdX[I)Ņ^JX@Z8j|lgG-ސ^| Dڑ0à}:% _<5\FN u8^%C1kj@9G{&8c$fEpdUgBHTa,IZҹHs&@={']O+JֲvI=j 'P1rp]=dыb 8 (6Qv3lcA 0=}|fK}cKE80tQ>>Bpg@[x2zol6WY.#dX*f%8u u>M u0ruYjʀdZϪI: )l2 yl=C`l #ke,>}ƒ-:ÔÆ/hq$*fEmX3~d^eyveȽK[XX ][<^Q_j=҂N iVG(悜lzKUѩ7k j8gX3[<"@8@,N;-)%@$Kߖ葲șw NI vXHoIrՇޓ:IP 2fKcΗGec Y4̵6.dW*4boV/glm-:4faa I9&e޲,'_92X@?P!SOd# G iO?mhIKO*jR r_Xid~nY~_}/N9tv_`@M,ud躷Wefx6_y5A }>w?ǀߗȬ@2;KV:n3mf s(W͊ Z^_\ [o^)w(܅˜d2O2Z B puTAIzEVmj_ozm`] 'DHjee>z9J&鮍kݽNY*΋caX[#K#L5E Bq eʤ$00i)e%##=RpeS_!fws ԚȰ8 =,5+:v.38΄f0 7q.D mtJjܼΖ㔔j2lNb[#kC5!d _{)([6<8&+L*HvAzMsBV%xť3˚ Q=Pp=:mQ~i97uFepQ=ε?"eZ4XRTI&6Um2-C' , y"XWu׵Y'EK 6i*IQ;d`!!)gfAUMIz˩^4mii$'gl|{n?#JV)zt|ßtvQpϾ<- Fr]4LQ"=X'W[gj/`-ys߼H8peH8%=a2l^s?Y>wA9Y=# & UK1!?obg20<*>ϥ!n촽tʶKgz ,G/ޯ}nOOuPIZ(E S31d51y(42(㽘E\Jyo6pقF8q#5 f ) NCbS`r1P8-CSFŚjjd5l@ʤ9  J5/8DTdaư Ԧw:"K"fQ̢:ciRsm`D\frf,-D24\p=]Ñ-/> 2%(j' bɑGG߃~<A Bg@87ʁÑm\csgPr?ֿCZB潮2([B"&XAkpqom}ttL$^C6K9J(6אzӢ)0ȉ5 x!JWΡTEV 71Jzym7x&NG #N\3D 45G@58,aiS>{wn_4rؕ`Gajg^;L BX#3h܃D iJkǗAƴ=}c?.]"P-X^ZqHȱF,Ђ,Ʋڔ?:).f32*ijk`ٱ]εR*A썍8@pIͽ:_]/ 2~ Tٯ|h(Bfs2dOuY4&)z%Yqc8cYz%p.c[6,uVrJ{)a4<:Jy9워RRd02 ʘ0󷉼*92YtA:v0|d;!gNY<43sO3~H|zpDı--usxqSZT-%KBdUs@/Ydk0,>֎kOF- nHM;79К:{d(iImmDZ $JVE@/!QҵacdnƘ=fkx6x L5k!`y6@pLVnuL4Md`8_ 1CXE-xtZ^ B]|m6(N)K͑jUHV3} iZj Za_2 Uƈ9I}nAΪŚ4`!s&{UVg{;)]`*Qā}?d>| xm_)vlFTh_GQ j=ː5?[@Lͣy@` XBt⦅֐w]7RKr1S$CDK;=2ϙ(E*ZژjD9^[w9S%諦l#- EϢ2=gm#lwV j|e/?S/X2(YLUY>ɤ lc`Z]`/4ذZdƇT ~uReFwkSQ841p|54>kg֝#ͺ8@ Y7n!X6AZ`` ;kA#g Q<gǚ6|U ܯfsoooOWORd}jf.@p9c ]ývߔlyv˒`{ZRGs5TulhЦB:6E z)*AA=o[a@נgk&$ ?@HPQїrsg GA!k*c ؃adYTԯe[e#)|Lj"A_3CEnKvߖ0~ςq76ݯ ~~EՎc>C7`thZ>P2x#La4aӿ!0MZ[t҇M``~>%&:[c2} c@IDAT (NiBV0d]|Wë}c{(1?lg9K^QZ! ZCG1}djky xAlR;/[qFu[` kƲDQ|-s}$=r3 sB 砮`?gfmm4?`[~+"կx7MMSl i>s9}M2 Y@vtq6g@0h/f jnyN:ZNe'::R%hS8p$rxKRG.- [:0y8:5lPoV%|))>:SOle_hp[\3"fDXtp dˎ~Pp|̺ٹc&_k!CPa$?hE2 PHt5+P XGDY:H9@Y8ؚJxՙ #c|^oLJO{0'̆g}K1!s'- 8cۺz6OpBFQ٠lpub@Y4+-9Q޳s# 0u,z(K PA_&khm䇲#x =  rUVe kXj<>AE4$~]y0ґ?%Sf lX:q};!&#ApQųŘ5~_ҙ溎:|ǧ~gpML1WdU`1uKq, }{)uzfk/ΐm >+40PUZŵO>9ZPVܖxONP\`63Q bi+=ʻB\@*J,M1"Vgw%uZ+v%A?/${ZD*Xb"lvg4dX++KS~%Ь$FU4}~[3R|۔R3=%62ϖ?@߀ڬ,/ '4)Lvyl-2:_?`Ė ($q^9L a*}Dd%4:ǴTyPTRe9B,"Lf|&%cCeoA0O,9g Z"}}|@eBtjQVNg.,z~I˪T^|Z06ǧ)>؍DW(G,D$a#6tZ&l#c)~]W{'I2=88,M:*8  I- ]|^Yr6M3dIb1 e]Lb <$AeA8DŽ/?FFNmh" DIH1I//]z_UxaSWyww_rU[[Sr>5 2?ϘCJ+)ȑC:'~8fh D6O㤡缇UQ{Ea=*,`ÁSL^*Oq k%7x (wҸk %uQ0+dfk]mITS@=#./:ʂIUxI̫@J˧֘9?98n]k}q0b#R3jRݢ֨mr2FC)?GTS׳mì5hmTw%ЉB 9vxGKS1Gppw]!kjp83@Ty\kTZprjȖ 𕩭cu̫4,윣@ b 鸇AH"K:~Vv=cySs {J_ c BC._TSk  ~Wa/d&D~f:0N8XZdJ tm٠܏ÚY-CΤhѦْ"ꞁ&XJCmcfwwwkj\}x6cHT|k`D"0,31^РϮ}u″uΒ> SÞu4_9C.eJq #'lj #ř|3`Q篥\JϾ|?g-12b@4]]@8IYZ vH2 Ͱ-LMu%,m v\P^v8#2xtwx_tݹEَei*F){:̴}mE-427ck/!G}ӟy,zȠ[PSok$G A@A 1oDQ9PX(;@#zA^tʉ}di}I 9N Z$KlL.:[;kHmLcV@ʵ~w@"32 k>xO虞ntW] n~qM罆}iec΂Fւr/l3:K=a} lϭN^'B_%\M4 ni'uM< A'q7oߡQ}$Vw/PEdC ,')2d>:ELR֭+XfRqӏC3D{f(Mj 'd} |?a}9fb 1^˺oL5ݗcgPo`^c[ A#8PwS0YYƆ|5g ~ʥ~-4}]xvh K1xmi !L=%x$_`O?X{mɁk?~LI~j+& *SY_~^xrpq 6"Lz0Nad 6::g3o0gιƖ}:Q*n5{s *}m0gU3JL-mďt{fR=|r@C}7X?*\S90~x ~#{@= S} m{<'BNyy!I?~dg˞Ia?R5@ A#nŸ,ʣ TmG9OH[fTYڠn cAB0'+ FJugAgvwJP%n'FFLeC@y>)|E%`vYv>,dg3/cp .7|vf] B$ر8mCJ4UcZz-{\;K GWgݴ ܚ7b6s:ۜLс:fNt40R 뚙%llIaq0惽̀9dl2Dt5*~ Dd}~ t(rMϵtCmV(֐aHc6߻BIsi]A(sD'`3 Wx(mh6^3V)  r[WbNe T30O^}Gh "{4LzA$޲OAALݧijbFE;sG7o1Y#Y C9Eww7%?ѐLCq$.9 ΐ sΫ2*˗.&v gi|OcU;9--4Own Ze<{##P*SWOwOkw>P3NpY\`plX&}a6A T ظ:d < xpHG>gٲ"~@@Ώ=?2+uGv\&E6sOL4 n`Ȟ -I[GfTrO:JN{TgiB<(:0wY4݆͡^~l3`i-+9vK'S,Gs5??upswz.kWȼP j_w}߾'Ⱦb3#YٝXKJL~R&V;wȾ#W d2!ȟ (m߄öFcJ32GSe&A@WD/ ,3@A0wEo#V|T3j2hZ(}c+# 'pT @Ow[6@kioD8N̰ٙ=ҍ dowgh;\íd o(n#uy5h=eejguaƅ\su+=!{o?W^nI%'0oyQ)wjS.: ׇ0,>+Jזw7hiN9<39W ƼoI. s6;0h( ~\$4Sա. A V*4|e,+R&6@!2D#\'MQ3ARe;H,RNjIن&̺! rs̉TʠtpmT.װ~s((EYF'9XKhlH}eF?xH j:4c h*˜JP *)&+!TuY󜜝3֗4:INӗdmw6EEyt-<ާS;VnQ@y;>%e_imH fcp62ڐ;챆r@A'l}Aώʧ )[0̮kk9&̨{[>"us._P e=.}vhKR C僩X,6罳{7 \Hw\lcvIj&(g'a3$j,54ϱ~<4ZR`OZZYd`;{-Ю Y ȻGN{mSsn$*0)| emk]@dr58xa\짯 d-bO/m++_ݯ?qc{/?+NMN_f1MK%Ct|AХQxֽ긪4,Nlj,UG!= ̦Ozi~!Pi(LBAgc~l+qsdC=a1*+id^ mvG0YW?I+So;ݿ i18U hڕ:u)7ڈO1frv6~8?UHS_J3u3J3<5DGmG?S l.+@L\qDs@!,E,mPUA"{L8Пv:I18!f(D|XoDkX;::?=6w5# XtLaӨ.vv\PHHO@,e("==;Yh/rpba{zsd-&Nw4I4J/="fsמeNxk Y'z@gnj 7o5ͣ.^3nߺsfg+)]>tS=4 SLmqy+Bm_[^62jeczdAA)vle48\Rn":*(Ue!}lʘ%)~v7ro8wBT_3:|.Nrqj QI&@ (r SS摳C> rp^} 7N[odbnUfs>DfЅ`v^6Q ;=mmi@NLN ٰgch:39KR(9y%64 {'\V4lpDu ga1pL+m#pE{ȍ%p:Sc#GKA dϐo( H7`p?,37s7|2:Q]O{Up;n¶$"nOݔ&8>-3¼#8Tϱ6S=0~p;O}sR/úe3| EF@5ڢPqRY Re ړ Qe(4`,N=Fjn2( D:6elY{f3 ]ju̗_{FThװ$,MXAx/jmJDBv'm::!|l9e^ۀX":#7Y#TԖqV# 3m尨W{ϡ?A+ \03m7 iuD/rM"UYy`?rHic1oQ>p~ 3t6,1oN3k*\,1{O Rz !@#Gcwwgʀ8TY "hQtn8` E[Of*j8NR5@*`!٩L'Jg~,FMYΠ@G\z/ͪlA 45d%4 k4x/wiTفC$2zsm>:7' ӓЋGpԈ8 MM2V>SA̘$N4 F/c8A«j@/>MO.<ƃoZ[Z1:d [ b#}j:S^] -d"7q;vci~i븚%T^)㫣(EI)6f\,{8S o0^t[H#{*'RewE!734pp1@d:v=`/,xfX ))9z"/MbM"zh:(:+}=kS`B Cۈ83ȞL̄ K?TLNM|8\820[<py6ka9z|{+2a`w> j~xxt#/SCb#VXyc ~".+tw,)Vv rUR@Νc%Z@d[ys,tN8N0yC@J:YX`bavY&@t*k]Ctf,8e G QY~OxT]Z^s ک mb2 ʌ<::v>9f`^uoYOuq8.n:f7[8|8fsWxVn #&8 Y ]K=:0q|<; 9%vy@`G)7U8vJ3P1|6:ьv`'maazij|4t!#7(zwq!{``0uuu?iƽ4Ԧg.aOÑХ m~k;N"rǎOWRcx`B=aW @_ ;pnY I.XթE>khf,7ʒZи6ڊ]졷X'РGYVq }:PL `Y^Z ^#YK0%Qlf 46yg}M!-d{75' .ybK34 @c,(YX.{ij#!2,* iXN2 Z,vR~s`Fg *9{]QK9`@&Ч]#(;`e3KmC:;Wblԯ=}ʌ_n6{R1pc=Gږ\Ǣ_#ί3ߍ=vo?Y17lp .ДA={9q$.1b!a| AJ|`@=_6Z?.T ,+6s P$<3G&Lot[sc .i C D`R0G+4:eK65hkE$hSwWo0Paxe RXx 55fg'ɓ |ZB:Qc5|P+ D􊟯=I`0#i(FdXF,8;}S_>d <~_9r9ZV3 z "FIypU4sPbtͲK%~볯^}@ECm1;1ɔ ,G˗IL>{lF,Yeԡ%I .7kIB@Lz(x&JUG%. @2["stȤQk4Xģ}<>p2b;TlG#t(UtwA|\S:/q)GyY&436a5~D )@Bug:[ܱRz@0dVi92es,};Y2mn4+0 CH)9Ao$kb/s8Pq,ר;ΞMͰ(%C1Lyv4Nr) 318n\):1`yd846:(`=(F=`GXGv;ن y%ngl"QflD&uT:,_f5Ͻkzыq3Y98-/`9FFGB50x]rG}jqج$N((f}$+W.񽪐.@W_@QY h}#k.s,AN[lLu V%_+Qy8=\C=O38d+\K5NԌCg;Hi&Ψh PGƺmޛ+م5MB-:s'Dy}k6dt$ *u";&`N+_wqTb8Z88ʊ{S耙i @b&M#k@2eu5m|δ7=W| ٣D9C\K` 027z1sdju ̪ث i-+ɑs+ȝ01Du\QdLv&ڛyRW-3zxKBYB=N׽w:,}:Ve*fcLϡ#\ʼ"1^ȞAKNe3p+MFUpֹ-Y4eQ4 4ECZ:YʈgV 9{`s;Km.'Ia7w eixr9a {\Z\J- {ePf~e3ScǷw+ukmzW&g& =G }plϩ38VP]^L9"{ Q5B`KHgKm"Vudm\+ {F6}S:A) A\̌?go>-1>iNȋoC8o8ٟ[SV/r}m2L*ǜaRf,|D[oŰvǿ-m]棽 FH@@#yJBM9 zAό{*zhc eEVz 05:| -l༃,ʀR<4&j1&P+Ohkd,hӾ :qA' 9e?~FP[4ÜC׬};#i?g'hLxe>ECR>kzqLN:A./Te'3SE<Ѵ躕tP1| P;X),MLD@`j.NBgl88ӄW u~@KwNyX!KHfZ^%GCL e Q #R\so-j%8T^~N?AKSu`iw蔾gY̺Sέɬd1ta] D&g5FD_ZÀ1: ҽ#ᬉ١dL:d6H]$Ty[e4WSN+of3 Bݗ_{W0` cDp>`fqe,iPۀ㿓= #+Ό'? 4Af{mŗ^BvqPȾ qp q,1dr lDSt(0]`-9lTFF!Fg5 >~̳#55|(|#0O~#(ޑ} @ l3Sc83ˌpۤQׯrjpX<@6opͨ=&kU\41 R2׎r$@(hwnu te's8{0>uW<]eMLD֣2UB۬tX]fms$fVKi--z{hSOa34c=X+:ۻ\ψ"u̓[D\2c_c=et{"|#O}!WMr?pnO ה `9۬UY*޻F/6o(8&X8lȖ~h'ҳ*/jb30ܟL,$Cf ,;P%t_91z YzFcvпx`+p}c9t>5W|mL_zS/RVn7Z8Oyi0'cgdF͈͆w̵8 ڡW<Ơrs&"b=|zC@Yݯ}DMƵd;)٬<^bΖ=%u޵6/ʓ_+k[@>@1E%C sȹxsyS -:1Ag<{Drj7.od` V2dtLϝ_o|՘woLX|#0}ޏJ.&2,|OلMN+鲯,߳D)\f"NMΓD\/D6,Q\Sπ\ߍ ?I5̲n}OzQSG?kʯlEY]K,4ibG]<a7۵ՀiL Ew1:h5N2k߬ (Nǁa;&J4Gٴ ն]F8J}g0Hz=3c(p@DCyҒڬ,2Yt4T> IE=T֢L ;vC#3GUt"ݛɚ~DA pobPKa<3p͛ g]}sPwpur[ág fqӰiP[-hj4))9%y&+K])%kfLi#90tz'T= Nmk?Nfw{pu=~+\-?O~?1ֹ4&;2~zWGPd#:16s:>JAYRAmAN\ K-'K/BtP+`6hy3YfelܥhC(-9δ$*-m͜ }k3F95=,а61;k5Zvz~&hd'\FԀbL:]뤪ӫbh`xmx1M1Rfe@7#Kq(!:Dcӳkh83Dԏld_{% ^~g~' ģhv#23{jN{=@S·>TnSdzSWoW8݀ jS3:Y) bEɂ~.֑pI:kE8IZe^Zά P5$l4fM2Of0x LFҔ  .1S@Z Xrȼ(gЫL2e@R FF7^`e78Gh</e)BzW8P9,'Gՙe Yƹl"(q 6Y˻]@kaGN" g#`]jI\:L$ "rAe,2ͺe8o6+.8gdx~ULHDI&YXAm%栫 #VW{~H@~ڎtu:J`7 `<5憞EuG^ygߌ`g jNoWz#Ph\Ȑ`~wՀ |A0]R18r- lj@}*s uaMI+=JLkhfL4A߰Bҟj@eҿJΔmG Qɾ`q^qA!Ϻ>EL3 1җ-{* pm6# Pl LLM1ŸM;r & @IDATWZ6؀p+`6Ead谶AO oN2oBowbC0vwgH&{}ln R-؍6Cw*\uޅ X&fcۊ4i|Fj!)xΏyl f)į#;]Ӏ@&țN l-s_*ÇћȍM;7Wq )`)2:̽:Y3_}_-m) 8-_RyHjkQbӔ3ʞ"Ԓ-dӸ|eRGb F#G 0Y[*#Ӳ;+M^f\Ͽ<4^`a pg$`~t'UhzP)֪\'JnȖ+w@ᔩ' a8} {LA'f)=&,^Ŏ;j,ooQ->JYY|(\ڏ't,: yEY-__?4= ܁ dş^ pxN?ۿ͓oLa]ή.PˉZ;(G*=g(Oy1`n'ȨfU5s=Ts _Ǖ:UԆvM2Ս8}CP 86Zc(||(x!#e>="gOQD֤i|ϙ*!Uycl5`ENtfU1X1ROE-w GSK[4:'-7F,K}& XF}_;W4N|ni$;!;Xb}ق84)7A0L=. 'G'2tN QJ!k [~UqjY LtE6P,а1A}W,ƙ_Zg{D- 5qW6Pw馽3$.%,y0FtdLTi٠R˿1.4u<T7>6r'G~FHE%=D,Jv. CSB݆tQG8e&YUZX.b3IW4aCje8Z2 ~8%~v7a߁90ݠI'iϮk @V/-0YaZ K,ySRp.̮ x/Zx%`~w;-{f*C Hе!^$P LI}Lqu]m/Xԧ^m;o^ @ioB G/OЃ=;|9#*)tXּ 6,sQeftt@pLh<C)aY#Ν zQ8HG-gi  kSx}EM%!UD=#ӹ9Q#jy)a-zMp`=5IoMu]- `\fg[+)OtzrMGriƥd 8۬UQ|A ۵8L ^I0ƎYayX(4y6x'h#L "W/sGmRW>2ێLϦҫÛaߠ8?yA' zJ-DG6R3?d{ɚ>AكAiu `V #9rfߕN6g׬2d#FE;ݰx={;EwaW]]e-ISN2y:!qm7 Al1i= 6x(bԔs@Xݘ]K\g*Ӄlߌl4)D:& Zl},YAx3.ʅ^Yҟ4LpS?h? rh";.i3ǣ}>}WcOS ;XUC=3{.%@{i6΅GTE RmrxdĥFq h&:f}4존%@ ހ1|usV`nNVv6ŒPA9M 04ևQ--Բt28wdi~o35=EZGyshko&شՍH*']ٗ 5XBeJ.+wTc96ʬ8=,ى93|޳A`I64v[0+S}xxN)û"<7ڠJTSfR|tGu!B0;Bq]B`t;Boy2M]YgQz6Ewjph\ljwoga`R胻b-+qvhPcbZM= ,6D@g7¾F;ZH~iO,t4.:^)PB ˪+Ϡ :1FǔV$ `ă{z ԉAF{=[,~elAqR.m<3'j69*";pM(-o<oR|.Xfg5<8 ±/5ܟN 3؈@u` a01!b=cY++j~ Z(9 E֢܊hbu+r'Ur0iɿt9tbgMe46C7އq,mЗj @ FeVJ9H9b Rswu(,a42 9L?iߵ]uܐ @;"]X׼ɚ+Yo&z 8s۰6 CjccՓ!&`mm4"@+վ # iYғuLldS/|t>:{=)Z"ᗃ.,5Sa Yd%t2lFBp/&au(ٱc x&g?Ng|vѨq.xuMCY+c̾ em(=H ?ۃR֜fgR.{%};Cp|xQϢ 9GA2">ٷzozֶ)a΂fu<`TZ}~A[@f nx їguwYxlki-O= Dˀ;CS`4ZxP}WѸWElyd:Ζ6(|_D%KNMNLx@]?>73OBURZ퀥v@wӧ^%fL-/ų$Z]@sϧGSc#k>v<6J%fe[]lݷ uJ!,*ޜmy{3z-Y }2Ҡe ʤvL!nD`9gd,*&u',J=rgmoR^=a!hdu w2l[)d/@Sڲc.AC>2e(+A*r{iB}-P j5W2ZBh_2R!54hOGY\2 -;(%/^ `Co ߆{[DDԀkh"o||@Yu|QyY?S{ .rN{LGlXIjֻFrÖn{07L(<,{- ΰ<mbB0X[e҂ FXْ8 H32nξ ,ZF*i6VNАRoBdr[./xȞn\U0h`iG#_SBcG7B.2jVl`9&чUˤVnn{mu.`Vq\ LǏdƆ,7a,)yqŵH8f;WпO-ϙMUA}Z'+Ts r`8k.?e xN^O?'񃸍? pfT6d2jqQ"W*_*TlQi}]3o]1?Oqͬ(jˆ:dܽqwb2fzc!LE8O6TahoxhHΏ{¤6i$C #U DzY]t5f> FlYg ު{c&3vB* <-FvJ$KKD]yA43E U/b:V Son .d0lY6R* `'ezc:Ls"}G98AR6` pY>MRxF =\"2K_(q) e|+z2G6.MLO@E6F'%0L~@IQR~ISs>Yz}tðDQYshłfɎ^Pp ʺ\䲆23ti5)c㈀j u&\gv3x<$:ܿ/td ,׵˷4#*lrkgϑrnKtrx޿}'dWKmzi'Nwppb͋PRdV+78e>#2hiYj|p3wA:v 7_'pln%Ffju0Ee=22JȅpsJ[8*hkq5 ?t+CƋ u1ؿqFdŽt8G\GXΣhBxh}TU]`# b̎f=}8d%cwt' ѥapXz"^kf):yT#3qF,;Ylt@sXDZl6) 쬣{\/`]miof˱=@"lE8Mi+unW}6J16Vk/Mi==З? PN\r1ϽES3;{yz={;6%ebqˀ A r̕81aĩeŀD%jTH.]rwgwf;k> @,sɻ3sys|9iJ"GPY_iIe8Wl*>(ucϳp֮lGgt2/8nƦOG.Kǒ˯Ȥo+okmJ׮]WêAwV_ZI{HUlxNyz 8CɄݰ/}4y  *YDb_ -8FcGN{ȈQ.sg'c<+0I),`> .F @ ~邝'}?ۿ;Y#pƿ9B$[ގ ͧDCX md{}fϵ, l$zR0=:$1df=􏪨UN ÷z &=dkޱGLSj++۔ʘ,_%R-q(>=igts|m"sny(xHhg#]˹/F ?5| 6> ;k05AlI@F 9 sGi(Lr䵙2ǚʪGjZ@}(@ػzv/V翾o. UfQBMՀrdJm!33W%G>YGgk~큯nh64 *Y@?02%PFqsP`Y<ñ7K#IЭ2wr>JW墒13ẗ́5]*:Rez{*)S 5V2$`kdfHaZ^6:3TfV!udYX^ͯ65:--"!14#f&EVoda2X#})%jɡ֡ȔRD 8\h4!i V' enk ƨYZ{p8~#lLতꦞ4Op!`:͇zZACi:fmvG]UNM ג228,D8F.-$YKG JЖqxtL Øᬑ!'^A8^lldYsA@NLqp-Y[ 0~/0{oYO;d찀\+[ Hg߰ɚBp++] T:4C4$vdO (w[m?u% FF".k^K4\\сU^ lENtٜ>OFz{jdǁY q dMg['0870̒f6bQƽ ~jx0qָv;}3:f'6<vΜ%<{:`:J՜6d q bdt"ZdEZg%z!QeI@ iW\"fO86ӭq?`y N1%8mpSf,jQ0*갡S#`\EMpa0@{tEQNo |+#8R^还ʐ :)&g]5L&h XYp9?C38ֲt ` pGV_7̺Џ͍-PO .8٨n$4d^ g x#,6kD-% ' 57@X,Aұ `2 *T2Bmpf7)1plB^SWc-%ˠ=&7n{BTf}PɄ = ԀR`/Y 侱k4Q^{;á@0+@%hSɴtA)kZ#=ѓ'J`2{U\w_<Azf&UMtr=%eچkbz(L?DGCìyq7 $=w0 B`k8rԇЮӣfR #{Rm\g,R²zmfg$`\0+$qq(jW._^FÉz%E~sցA zW\ar;aIczsRǧ(+ފ?ܗcX,ѹ&:y{|99 h l`FYZ {7DLFksdJ!r\<&f3(y`5o$H w qt= " 0w2a v)$˒qߖTlvW J6#*8!c~sJ?*JjŮ^}O~wA{?/͟,Ev ԕjʉ$H  z4w'.gɾ.vRdVK+]u@*,LN_GrZq37yB1>f[2`._ߓeG&%\G@3+:■W҉&QA7k,>!gVWWp]jSS/F8>rtg(|kO^c}(ivn&-E)s4s,/%R(*s rvQhCP}Es2M5Ls >(Q.7\D| MRM\)U⏛~,`7^nl< ؿ/u볯s'|;oz§8fjmv7xHA. W=ۀ *$ۈY$m#l]aO**Yمt&$r~DffNLLQQmU U=({_Pr(m3v 8 f8;(=C ʨPy%mQ;ut Pl^ p﵎p-C$3=J_OÖ8 w=ݼr=j|@8K&%|`ɰF6mP{ %UYi*¿#A`2Uhɽ]<=L#iw#Sg?ES+-Y[ &2='uk<9;Ѐp}UU^։l("2%4,}VsTb:0m< PbJd q8u87!_R>k;:Ȑ8H^neƓ.%x R7m ss{kF dzf}QvN_=d]*XmNB:8=a\U.DNO085J~~|3e6dQd`"_Υ7&AW &YON}O|2 ^mzNy&jS茅*p: /۳S'4ۂEBMM p ԗ5+A/gy͓Bb]k8_} -GW\NMݔ D`_&=99 :Ur-}w{؝-Jf'ёɾPZ r]@#>_]{YƁI k>VU= (, ϥL>[=l@ 7ff &`;ef+g(q`'9Ƚ1"G%cs'}V}BB6IVF }&nALj*^4_wZ1~ȥOS2vaߺڤO *06fX\MhYON ,ΝY#Uc4̈́;d/%΁~mmfٚ&W=-:l[G!INjf240'/*' r$ZthJ6s-+@fCca6NG}f;<})fm߱LI+s`t< ('C'{1hS$# euLPd_SӃpC0 S=Έ4RhȌOԉ<ʬx0m:j!cU~<!ٲ\5@8q%NiiΎ6 (6ӀwX!8l!#;8&]:jp7}_?j)Yr<JN?:d c 5dٜC oÆke>cCA1:: ΤB9K A !NbPJpN fpYv0"guzjYud{wϱNʵ`ތ/L&, Uh oQy);dNֹs*0ChaySKG'c;PO?pNdx^Ppt`FqLtGM`y0@9hNudNV.LGcEAVBftt" f}45FQյ:Ҝy's':- #aΩK%jg R譱I]J#EYUyvLI&L>Ns8 '#/ڸ"J>Y;Mv-jCv; }Y}J "[M]\͙dU20r_W461C ~+8BQʀl:AJdoaq&ZN&7Ղ/Fkm祖GjM?2QoNk g,/@&yȵq޳gR梍װN9doeFPw:S&k4Wd,O`q }]l~ʟӓj(xTdRCL;[W]iu7:9I?JSF͗Ћb(YXd}=e G ~%;2s^+޳gYMFeZ} m/[Ne? irhg=e}Q9ڵK !gB:`L::{Z1n²8'r}~{>F `~m`ziwΟ^KOH~{Ͼ~TWIz_7M7,-4I;?D9Q1_6Qut#>t+ 'I";`u@y ?7'30MM~fFP41h_EF^DǽYҶI6EMGh~R+Y3&l5k̭0 u8hy2q\_AuN88(w,D]2TCf߅kQ2LJ841G"Xbn?!CQ\NYzT+ٙۛo]3@hz530H9Ɓ:Rf6༷DĆ/3rl, {SRI0M-mrВ1: .%){Kil|,uoS3OUdoM2   |.VhiBF9(p/^LJ،r|}Y :d:-8ΌyZD0jfO'>6dr$Bӳd&n^5%6YXJ5b˳5lS B/V e 8WAO~9 FmZ*S$$`^0zzC75{ @=2&06O4U63%Η_-*kA3fs Nt7( [iSу̌mwܑ> эkF_(cSօ6<=/ gt6KP6u#™0@8-O P:1H=aOA1{8+Y*i4UvT2 e_ &EH$.lgw|m~ۑлʊkr\tg9Ӓ`-0a^V5gfE&2HL'LrStvCNX_hI)v D?Y9s\yj3-Rܳ ~f7Y_`F0=x>u_E?/g?{LRA lN _3F`]1В[!bB1>Rz<1 ߔ^|ئq=:-ݝ; G_Ľ|P  V3!fŽX*H}Bܫ<' 㣀7QzDI\{yxob2z{ij2m裎o/xg_?+x_~s}/Vǟ<UՅ( i*mPFR:*%.AgR[xёc(Uoc)k#R }T]zlV^[Qa:t~z  cА:8;*`hu(u &U8*mh⼘\ >e4HS4֎8$cVH3gƸ>uw#`vE]NKF@v'1\1tyLX# !rF .Z 6lzi[P"rƦL4gyi_[fv&;ҠۍJ9,-zPbs|"t #+8j41€:[ϧ0cd3 3]pV}ơtr.6yNN Tly,n.L>+VL㯧?G?f9N͢_9iBF9`>3<"&ȕ0tR0L)+5Ѭ(;=A F:q>Ytwř\%|>VG)@'+)]@GfhnJ!ֱ6K4 ”;~jwӨѥi\|p|3O8t~V'U\dߵS$315N奀l n̩8ƟsW.d@(!*:1󦻧cӂ^9%d }TϹf0".eRX@ <!3.īq._'g(mm@j+e(꜕&9K87O_hD:71نk|3c?q6ZBy3KˀqQj Л1 ?fS_E\StNg+Le<V2@LfN)LƓig_; a;,8:#Biy x:@IDAT8i*zﻄ|YDC># G&b谷ax+4 莿fdĞS!?;dW^'* 9 ;sc@£5P*A;)GjH^aof M:dɉ n=J L0.a`:RЉܯF]ֺ?xA٩iȫ{F(vd+W.40R͠  YϼFۄ )MB94Gyt`?fVrRH]@TΜ |h}K_p)2g>O}`&yiS݅oz oJ3iq9 Ò>8mM>r1Pob@Vne,T+w9k trKBx^Aɞ2W6]Ljz U'5G;HA R( rU.oswY?N䯁xEK+>_sт[+x?ajȆX^NK3d)}6?41d9@#u1-#a >sFz_\4һ+--2N2 _K,P|(;|Ka?ƒ} G.orB !o[kK,qNA'^[iHY&'-eeb]@41-C6[MIuu߁;uVa}+7b砼3Yluktd!z@cYEwxږdnfX9i.˲m 1(؀yN;Mowt G;)<,/+9Am7N/[n__e|q~\n}[ *n󃳳o|7*r0KԂ0dyۻۖil jY<趧 9J3wϿmEϜPkZo4s>81>vu@>N^XUSƽ0Ih΋{fffL:65Tt탖4|^;+}f :xeB:RT860@:-oP c(=,?`k4~)b@\@r,X D-.\WAg[_ I,wvGhg&W9v44h9?Y%άR ]Pƚfxnz)A%e8PM\ M2[ēoRbiu!";&sc"]uC{,5Dth'} q]x#Cl'Dt]_ji d/ s|,t wA GY9L#ZGфL:=d0GEq;3L6SvzLvFL8Kt\EZY^skKf`mxB]@Tu3ad\f&Xm_ %\*rg+d6se- gLz(2 lD^e;( e wȧ8}Xv R >;vH7tͶ8TA&3sk2BSuda{9IhZYomms_HAvA| j nU:O;mkׂ@zzQʦ:CtyOS7l/_"࿒w|@@LI]//\J8kKӓ&N⍴͙=Ap+]BSUn.ArG}Mb`.;"y{ydXB6iKHlF؏؞ =CFsFm T /eɲM gI'`Ii*|=> XrQܞ/\`bz3ir h,aj!V(ɺ.3ZF 2e'3vrŀ[0z244F;&Z/!eG9@rC^>t C5p k_dp`@ZྜJ$k3E4 ;@Hxkr5~H92>J/~1"2Z]> X[)6ij)u^#b<7cæj=#3'd` ^ ;*ll.W>hri~l $,ďhh_†j+j?SX2ߡ\^{{W98׏ RϾ~ZVW_{[otyjtdeeysmPY`ݬ;J{ҥB4k7e2RQ Ǻԓ`}Lw iRhVEf̍N:~NfŠD'3q'K\ Lg:'b(XX嗯uʹꚚ1-G\Kcc-0M^!i0ls8ud^0z,TɉֶNj{ {ZjO#FGp>i4..c=Y7˘]N rAA@z\{ֻ%W@]M"@y*Lx vcS+ ܯIO>05$hKM]"4 ƮG[K祃a )L!7*ƙA:T-: j`>JŎM9L'x_y-)/fYRf\s지1@6FQGMؚIN=, !`Th{/nCΏpzFItK_qdY EYnM{|-m٢?g8TpܨQ WE HSֲJNMA FXgZY 3x1uP300^Nclt#'M{h\gyl[zd΂SdX)UKg)Ϋ[ܶ ŜqBУiџ L| ։Rd:ImL2٧>xn4^z>+k2}ֻh5> >@g)4>JһPOLE\_XN9 2>6޿~oiT*d}n<P#ޖq`d!_:'ܫc/C)Cv޷rW;FOx6, eMs(L[N$3&JBbn;wru  a/UA)= Jm?&y{5rJ_Ue,32Lg<{4zLQ Y V rlrlZ*8. ']|526sjY4 ϖ8\8[>Q JЫwXtU_g $#˩=ΐ4Cj̴;e  CrfXq~6ŽԦ)YNi0%8ö]}ͩR2o|\q=oٝK{fe4!VT *mOG~ K$hs'|.S?p Ps  wx $X}66kw>v\_/A 6sfO~Lh}w@z %Oij]];syzTtMT;'2+ 6O# hnW6SXb wϒqg+NuHd,KAkE+m2 @O8 &e%yPh|&̝PpN?c͏B)@-xtJ=3P6]~>}Aȗ:󇱋$W&i}VNZ\|f׫{[]q oy2dc]^']̇ŗRЇGw׵e -_UKSWTIy+Jd}v? `F"%=l91g>H!sk{oc>`_OA˂ |.Y&u[9`n9O'}z_As 3/`vCfe-pX<s|ӄqmϚFsijfےzXlLGD Hfre2([0͉ߡW:6IE &қ?x'ݿeLVŦ7ӥڍ='oicbAl4>2Pp޲by @ ٘qf -aAlϟ+fQf@584JˬmNɄU(wèT_Nqp=M`w3M> m>e,iym6 *y=]y3ʏa9(j\,MRϾI]N=4f4d,5р<;r^'ZimYm-s!zb+R>;1:'wzz0d=278!K :8ZS s3,ӌY2AO38L380^$(..cu8<;Ӎ7ҟ~{D K/+ b$F0"kE9Jz镛3櫓TA|Yd9^9dt6t I 2wrl)=: rx_e}L9@,h!XRuGs 6`*tp/0!ps6 p7%0[tbLi^%X4 _Y^E(87qO>`7l.NxEDu94 <vB*DChl+A7&l G2 "igL?u`O[sf~4ٔ9d r4^*s  [xtyG_0JY4ΠŦr*qOAa rĴQܓMŠ.ڨԦqztChւLSFFҗ%sFG/k>A]s[@iKJɢʰ3;D K(v٭|l p-Α6٠͒n]9e~6>KCCF('YܚICF4c{ ;'JH Y(GѼL"/h`ukM`߽Q:YQe}g pPfjOi!e5™>"D@Az4Φ6v 󃅎>/7 s}}d@a0]F}q)Ŀtcqfynw9O̫k&y@R{V j3~ayV6Q_LH㶿g !j,־s]7;yKYQ%4a6 ك`S#Zy_a~f~.-ѓ !Ese$eE<{m#]=<_h>TV$ tUe[_; e1@gXV?f)Y97GQ>}Qzh|3c=k9, z@>NwR>fO. ?3E?$JS _ˋoͶ},/;UdA$̈UFxԎJRbbI @ {v Va,[Vg0%[&uTG3Ϭ !H+`!{Hla rLٯ>Kz-H?OC&$I#}{h?Ʈ&\YKhj>9= (\i#/SzoA0lBXJ :1|Uۋқ`r|V&? n*#Kކ~ܩ+ vuׯ?sz3_e{M_s?'cϾ~Vz;뙁ꪪ5,H%BC =z<~u~J6;oAnY=('(t!%l3n'DO4WEE`؟댊zZqþc^kp2lF)c̞"5{Csut&`Bzs#iLK9Ϳq|y*DSCWuBSj`@# lbʪ1PWx0};jppsy"9}UrCNI{;0HPio;0!\;g- "@A3ke)sUȑ;G8ߋ@PHV.;!ܡe> Ft<=vϚ !~j(6jp puS,RND%̃ b6wY`cALb9΁ pX*5G.ftN98KRM O fomOafre3>H7ac@r^:aI Ml5:?*_qGS hRƳ9滂@vҖtE!_N~4cYSxbbCMg-l8uڥ|#Si Ll-|2no guѹ-`p㜙=UG3kVz3`g]Yjki &~:23gu .@/C*kaO1`dDsjњ#k߫d(;ݓojngZ6c':̂Vcp.~3٭2{#:3= pH`@ >}&8 Wf ~>-R<ԠgY9ڱ/Eel@@uo`A`OB>:\Bz;]"]#h4?E2tyN5뀌N. p`tkArF[.T J 9!!]NWn0mDq]iRag @OJ;m1dr\fz^3dqpvjq H2Oh4K;U_-N",d;BY=5"fo-,Fy)fG9CkluQcs O3,BZ]ZG)N`ʡyK`Iz5S'&؏dLuEug) պϘUb3 fPc9SޕAulBtceq`dRi(XOIO,(2k&?mPS03,E:Fa-C] `3(|5 @ "kPLbG= L^@ķ L4Z ܇ExR;=ŇDVƦt6}YWisY29 %ܓ=iׄ)*>OaXFB0YԮ$hB2qImI6ʵ[Qqr0{g7yPg3Lū+y皬?f ! c2.xALPȐ`AY9gõ,#@Y!])Kn,4h?.8 F6~I! 4Pn=iʙY*eFCV:dS6K9|Ԡ hY5 CN2w3 =9c2KBwX;b٣&7M(BKE ~fjS1>,|eQtwDkzz{\Q?pTqfz$ ~6Y֬+(V̀ r:6joigAkZ5 q!FfP!Y*5mRo[jɤV=PpAgʬMKj_d=Z\B>OJtc5 {AѤ 㗁-d!pXiMNuRM;п (!& ZX.ߺSV99:gB`}c*fZN ]9c9CO53H7 )Axе-RE3;Aq{&3=~;UFkzHPdӿS\S`юԇ$XSMk2I_k%ęa`'Ul T0 AuSd'A3>tχclsoL9G}_DJE^z]YO3Y9LGJQ0yc92%v " m>d1:"`7nu? F +Ҵ5`װ r {'CPHhMz1Xva D0"ĈHQ[ qk!5vwd H@rJWYUz+WgeDA}T,%b3`m@gϊeawbȧ%Op罚eXb \ @F k`_wn81yG9I{1/|s]Ͽ:vzs=l)t2rYd$B-%n78JuD9=6t%T&<ϫ/ׁ`S))+֝FɔP1cx22,9 r +0VI*dsq$!kX Q1dCd"xh$llU/GУd;[fY90u YW6Yce\ ZG[ ʽk ?WlZb:@p dSӣ(z47oa藄mlN 92=d%Yl?2@Ʉ: n|#n;Za5hay*3JySUb=c/-<>hEGC9%nOn^A遶c@F{tG4<#H̐QrhÝQ:: K)i" a[ Ns8,P0eE'Zl) lPx:/U هp4iz'6ā7[n 1} ]Ujh (;vnn&{#\C2?q1hI#+zBG32y<+9P\G*fD}FǴ fH˖jL(֫0B+8!0=H#PѻEixt D#z}АQ=:VpvTCSmF1ZKC0J$(e]>As`"p9px͐ﰼ1OPBu0e'r^ UX%2xvCVM":A9*(BE:sגzd0-X#58,9Z:Fۡ~ &)o}i.AdMCsj$qrHcG1\5 %`p+8^8dy&J裁-27ʷ4]ޏTIbm5#3{;B :R/\:OPXKks-DA`IL#\2(,#JvЧFL i=@9ٲkX|դ͖TtDBnq2w X)9CHg bKs7yH@%S J d0ؙ]!'@Ws*fR \5(׶uѵ8Yy1zs36 vo{  z Crv|!wLPudX=/~GSy./"p]úSjfޜn>w>~ A8҅"OKGeuoomM 4]dMǖbDR#{vaϙ8Ta73%+ʆ@/ޒH.z:J] ||~^AjYY8لʿY@&Tww 2n_ ~ vsΎ)Pʔ ikw;f UMԤ)[`@i\.<v'ڄbvv:F~ @3zOOM9M2Ȱ{+'VGu7ʞ&`V 6>u R.RqSΆ@82\8,ڈ0e> >]w\t,IY S#$d Ȱ5FoQ6 xgtm;5O~}ϕLkm[*KM`@rی񊑽6yˈ@Ȫ);820|444zO0A.KƷ[b-DCu @I9^Hcó}aG8Gʞ>DKGfQ9e+\\UCJ4uD*kO*WT?ia}@VSN [#`@ b\%:ko2 N";x"6Rkus upOpww YVdsat/`E (?A0aj^L['lGg]X|iae~3{6s+ɢmCu˪Wqt 6bjX[* 5f8\\8Z#3Nmch8 p 52>]Af f kx0 YʽHE@4k]'65[ca}Q(2S[\FY`704OM(] g8O{ ؅ Rְ*!FIٰ3 Pc<0ҊY;{S `|λizhj5u:L@AcXO΂N7`q9[L&k!hhRlpͼLx2<#a:ByxI P"@X&(,hG-ٞUmjYv6+nfK'W]>,ȸ8,0ـbi <{W:b :B7 c38d 8m!: A'tA+WAU,TT":@/"xmu bm.|2κ},X]ίvS]߼@02cksW' \ϨV6ϡBSfdYg6k7&g.ҹȂUR9,֐!_c/TBjkdN+KKFW,`&;SgGi[ HfT+Yzl}m|9YhhΆc6A//yLdͤEu]ԁ^gy9N߰cgOf5] 9Y uJDh@?;Au520 ۧ|>#upy^#+d^y wsѻfE_|6h|!{chXZ6AoWGG4SX"3] |Q7B߅ Y ~GdܹF %>7k\7'#L;[zX*"L!#f^ }m*p{(K@1|aPP]`g1c&' |Grd_&\s\n%3"TFLLy/M2y]OyWŽ!u/"1wwh# @9Gm.PmvgH1˒|eK~X6X_i1eVd}#tI&T qW1͎Nƒޮo?Ug_?U+l+kq^'rKsT-mІ' 8er #%rf~ JW9N& :;AQnQsԩ ]uP6kߍf A2彧(A38:o^͗m4`A-N- #EZ:]8΍I23 3=2_Y:Y߆7aIي5#,m&OUu (lgc`T#,0Ko+PC{fafK\i]s;EHa\Իn]=8 4߬akc]mģQ1(N1Z{e#v&ӖAupl3/PBg\gX ʭٵhi%ZZfهwR <`_:Z뛝0kt<tjtjt52K ӹǩIRW?u'E!㖒id=KQ⋩8% 8dUEi飷D4h=ͽy@>kJb g_ #\t&V;gd4} ~ }O`埞eqNu-6Ser [? Nj;2goG]+~+@ɪ!9Q j ƅOK^,' .NK/3>@ZT4PQƮM'E>݆,tMf{m:cKk:g\~ʄIj' BQ> ]nX@IDAT6X |6kʩ=Z2_>Kx0"?TM\zX̥Z g"|,2e]Ճʝ'CD9 f gg>FG@]t1약~mg '&rΚO[ .p>EXנZA}3>"@T^TϚ"bn7[Ы7=KgIa<_(2E"!#@1+Ҩl.k`(s,_hTAm !Wk߃e$5f0,H8g&xz}1=2AGwڠ@ wrm+ΊFM[Æ8EbVoeX *!A Y>v2 :;M%8N2ilkllXÎZr3:4|6ϯ-J4N,{Tr~i%UN//Iyч{\K d#,iQ| D)gߥ DTwom% X .fE9 KM'_^y*> Y}YH#pMLB~=2ΨC"h9Aip ]X ()yd!'hYE φ'DMM `Z 1'xWw澕#<)[gOن}^?o|z3:4j>Pn96wZSe5DjX*ASp?U*ehc dUj<#*;aH-Ц1>Fil9>/3f9SZ~r>liϘLqBWq'P/8S11*:Ne{{-e_Tj{K﹵}骮{fznCJ#eI):@ F#(@NdDd $A+6N ;22Crk{kw0HuŮ}g99#yh ȡ'@7P!Εs}3.p*e¶Ko N:ʗfbL*s[4BN"a177Pڤ#'{cc+MϲVvB20 piGFuu4S\^gp j.A8 `"W\v>e0u̻ب@Ap@j"g-= ̗&\Tao‘=c(Pdi`CᮇnD36@M#XB/h(qrw ;@2:ͳabhs 8o?{EW /:6\cI98b*)<2':_}gq9`b絠FN*+I}쫗q޽hwvZX5mSr{MM:`e"rqAd':I<8F҂>N*Bg7-!9Ѽ-I50qVז\s F'_׿&9tCtV18VQ?m?#`8z6-/, s8{v9htt4ΝTN `EVi,q4"peq4j3Y;Ԓ^|N->_Ͼ|(ՙ1"Q9eΌzG;-΋lDt{ cl&Z#d7rCg*M"`)WG&e57Iw`LN٫;#YK_ٿYUoAm#C8qbչRzyz!N fPGpDJ?bTtqAot#5N(ȧmz{ē #`G5 L8dj8xaag lLG;U?$We5NQy hyA2j 7!/4^Py눠sm&0"3gia]Yߪޮ}Kx~ہXͺa5!s]wG+,y]{)~/^:~Fc[c(W'|VCϚ.sNd@f㎜}I.m"7VsMp.t<'R0 X)7 bT#fùI_ؑє^+鳟Lꣲ}/mC B9a,_`8|Qܴf+TW"}w(jO$(p剬|$>`Qd=tXLS'm}g/L-< q9kk3,d _X?;w i9G!Չ8J|Vu5P Xvh]%hd/q5rkHZb H9dh=zl]͸g y% ˥gA7AրJ?JٟtUk̗62bpMSIK1;q40f;.pt,bsϿF,{87mHKtwKH2y}:Ɉ4P,y$ShA?0UPP0=1Qg=Dk_LsmxaP,4Sk7B1 E&FSYŶeǼscKS!Lrm:RmyK )6X`ϗq4z,Ŕ]0E"ɉ'O#|d z= k_'^5~*XD]|:c<t[q8CS?yP z&RSI)dfׄ"gu,7gl;Jyk JϸM[&2{#]LX[_ G{lȕke[QR4??rTjP7v [Ķz8L8&+teZ?F0Ls1\Q=l36\+qp@;$+qsӈ `onk=lko߾[o—I+xHp#oko΋~wnT1 |Lqcfaq@R59fC# 0e #͟5VT~ gT/-BXX!M_@PD#:2Fr-0ur_c~cU"^СPVf!h7Q0 )7CEƧSڪCy{Q359Cǃ X&[Fέm1'4ȃ?YNP%cƃ5^M;GQj$*_)}E"lNQDYUU(4:vHxV9תFXJ(Kmw6op *XE% FXb=zYsd1AqyGDzS$ ZNT}.co80]E#57w[;aKw#%uZƔppk(iƤ[R+w@='[cjO:bG\ઃUX0EVaq*a (xɿHQhaoG˜Ts"-=Т}gh?F}:E TbH% }O16^-5zSZl::-PQ{{1"z쓙݇8*D:?ՀoFpRU8D{a`:55R0rȋCF)mJۖVHWƮO3]c[gg84y*|p0ƹ:,uW'Zyt?Y]yty~ݫ}Dܿ:I7?L" mqI|tƸR~@ie>?3b6hYNSSs5;@QQ y0 7FGy˳"m=eڋrI}6`[2qD^lE4blz߽q&[9=.-5Y8/#[wΠF4QW#íRĈ@R <QmSj:Υ|Ls@}뇑s.2#jvTS8ж<[Z>K)C~ϧg +'8ր5c8:ZA:7!|r>K:cn.:A&ZGSbM vޜӳt,+wVR728L:d@uSROlWW_ rnn)bDL.dK֝Qo* }x,g)g#xз>d]%d2GDz )|y{ؓtuzP eD#~o->J?T0m)+vըg""$W#F)j%-hv)a$=6͔F{u) _&\(i8 p `azsRܼM#ug:2pFFF#7T{`Ϭ@}9 s/T94z@ VIxznLqOu@!mZ1|a*?LMMqLZ)HwƞnjRTϏYk:dzn YAwș{ýXɒ<yUjZҩ F56|V Vҁ/ OY4?UlW+óg~#ln~ˆfÍb5XߩgOi{xB]arha8t:8299,F hZ\y+smY@1Ur8L㗩џf;&OYtvQ 6so8]iem;8جTy+_|V22]-5Xl])JqP1o<*2 J6udg_}jAWj8Sٹ q;,V@ߥ m؂5iYO5U3۫9~LC=o~s?ܿ˿ͽz \?~ ~կ_Bȿ93zj46s+u| UFG ;Nө_1*~*3ZMk5N;Fb9a)Fl)|`ƪzHnu~B^@aEC7 Ν SҽwTeg&f8Ֆ2cB_l㌉ DOdcX@\GFI!?lգ5UBtQ4X]=t&(PwO'F]]À12PJ|#ֺpBP?e^"4*H{="*:]>Zqm01,[0Zx/# /BbF sb  H4Y_N3 `qHǹ5*4>L5]L^{[b=,ԅC>X#+gwz+}-R vha9`Z%rfs1jInv?(K4"M:4pumȦ6XG 룥mYL 9Osy΄ԑ\zJ?@R1F = :1ePM~a\vܲq=;A:ڨ)c!C}Žc1xeDd^D~ uJ˹xZAU?E~E10Ƣ\*r (_glmKya^L 22g_ѬRpr^WCR#iE,o=x׵R}Ukkz0/L: J,ŗNsk p{oFp۞ @=3뀸VP2㟻;8"K'K9NRp]2oN&iGGgOXDS 7]C-cO _2[>/`،L ;!r Bivz>䌎KEfaX=P&2gl}QjI`b{3L&:(@#kgM{.GdpzL|ֱm,=|fu4ok\9iCs`+=M(:FeXHFGN$;{LLpT Ypº9r=OqJ/Bqm NA[dFTii:4^s7d'~Y#5b{ `  s+WYMX+px6:)AΩvr@A vd?opp m-pD߽v<o],f va%P;ϻg/gƀ:QЖ78--W i|&OJ$SF*(kk` ]Ngo7 :kGhOٚU恌 YdNa6@glcdl0yNtةY 4~>o;Ȥz7bx13/\z҈'==5N$VH8'3e~V8d@a *w fW [ؿ*ҝQ4t(V[4hpz RL8/1]F1#*cmFF9F;8RPr)9O2)SO1h *3V.FBRs FN{ %j/c] $T^D=4ΠU<0j-2p-Xǥ--̢Rf'CiV9Ky GLCQ[Jz4JsK*0FtLp$PVZޝdF\R cC FHBa|Z4 >Z3nT!3cɷciAj"S,hS"UE=bHc i^Fݿ^G~ "jQZj,V@ SY\X ƕG6CRl>OǠk4˱t/02vTMdъ|'^&y+c8*1YC.q-;zxyBD-X|r:qnH'u8@i2 ҋ|nt2yȔvdL,Djt|per6sz$a=E"t/윳{LmI@Zߔ|vm| 9aysF*IaX4Rm6I%_S4r88>{_`$:a=00Jݧ:]6 *n~i 5G9E] nq"+lHZdTڄ̽MF/gYμjRe˘D D-j*PܶuVviXg?L\l ?u<`sGd+ÎLu]%@  827o9.?cc>Lk3 C@}è|T˾/0!*Ynjjz:V3}Fd1& (N믿F_Nc5S &&82R@Qy&?})\j EqխL:.?@go/:x!{ M::3DzE3E}iӔ2̵I1Eؼ+V:@=Xgm%D^8v9 -?}y$S*|^*9 ̫:n]I`E PͥK[QX]d4z2 9d밑)|T@߭tU q6eAqR'冖:SֱS'(UN!^7>;g!K1ľ؞]|qgͱMGG=R-^͇CFV1AS[@*dut%`^d4DMzd5}-ݤ< tK}ZVOm}PM nTl\VEqFx#@ګ;4֭B6s":3 "V#WR/K<21Obw>ȳeh cHYLkGg;!6zW<i /K__y-:Y0Vj+X60pkk 5~wҥ~6x] _3/':,g~^gg֬F6Rak!yΣkP |D\F9gl~gDˈQR'#*iϿtrVX>89A¡:Wɘ@g SV6IFۇ.ÁL[@"RJ8S*y饗PYY EΡcFbpp ("hecy"@@ҹJ̯-dpO#1c6$؆ =n0V?bfŠ9ư1ȧci_E\De(*&v`Mt^>=qʍP})PsU·JwMj35;W9O5Ϻgșcm뎨O_@3 JX+)~2c Fc3G]@G8!N #G͌-x݈9 o^k" HTJ R#8P V\FqH}HkT| =yt>'2@]@n![|z1T_BqzZ_'δ$'Ai1`Rtv0ldr絢s83TtW5`\o)?.\NWƯDe ,jPy}//fB Stϲ+`E-#amܵ3b/{I@3W8j&ZZ 8MvC St`D:跕Zܼ!,#xƕ!Zg1eO/(g3 =5"(ɟ|uE"ʓ##'@`QL ho?EvٴD4Ҝ Cq-; f;縎枟3οz^<+ 5\Jǧ17Vt N[&I:K5LK+L`oO BYBGtgx[4:~N4^syYR}{E5+|8*&O/s{^aX;yϑb?\"@`s%?{F xDZlLI&$5ЗizD7H[،@9NNR,FX 8R8yd` , I~ν,-_G. 5}}&E+עi{69\!D7nI#cE6"EY6XlY "iL+k/ ə*1_CmDW[^Tc〝bd^r? N :+KbcWŹ$QR{XD}9r|Yc qw~ ōVʀl1mӣ-٧CbV5֥]E9Z9AR$؁-œryy;3 }uR/CݜM 84pzkڗA}}oF'g /~s1_^^\}e9ۭ'F+{1T8gChg ?}$ҼT#a w Fndp H~ye35#gJ,HEe1ƃC0T{x}p#Z]Fim07&Ae3 X mqi/ (hca e$edk]*.LOOEA.,;u^46R;W2ÎA*®BxsOo8GVgP3} ;?eS*LйasuD9Pfc Ku`5 }әi_ļX@J?HkkL1 Y% u: h捌vت ЖJEՠ78[ʬT \Q΍SsXEƅt˦Hp*`dY@Q-d%{z_y޼JC[HPsDx9c=o # WS;0bO=}\\"*1g<+Yh0uD?0oL8BM4P#׳|jBQ]]?WOL{#g~onQ]s?uô/"Е(1 _Y :pLj#ًx=WZk@u@ˤY]m,rjm<{D?yOuk b2%YD&XLѹy Kw_}8@kj=|+s*?NL 57p"``]Άl[Yj:WE731It[d "0i<Ҁ7Z:>6 AZ6P>nfƺ_-fwblQja-u%uo+k]ei(O;H}4;¾lܐQ{6̦lOfܣ$VC6dd)bsU3]t-r;#*/66dֿ,ocBqf>AJL eDA= ]C3Ug?!C$^;.@25 ;Ӧ1:A#3VL)*伾5]8knHW6cgs:{`f BDR Ȓ=`d $o:vfw42JaaDJj^9IZhPFɏ;Μ="VFqH-  Py ' <QZ=i*#\ʄybP 3X8P_l10Pd0T[0JnWZ@g fƜG4EhĪH_F3aA+: ZBqn@IDATa.Lc5sOcAZWkK r<:F U:.DNZa޼]EuSԜ7XJ%F5:KL`4f]"ǨҗtL_ UzXS0W8[~QUX {kBOkLj4rT|RWWCQfUls>GA4A>'hSUdzIo "Sm '?q!o~+a5mzY}Q"z[iݴǨ>QW_{ %=~ON3QV>̚ |iKe"'h_fqcz80 "byaLxipYkC-`z%~ x. M.NѥJC^f- two \ 2W UT┛jt[ّ": BIY'ST]1(#X7Xn-8xqz `KV s>DMB>g<=҈Zֻ1v*kXTWdpyw6*C#,{1{n-\ ej.K6m~5}/(&zHJ5)< b!˥<$9֨Xwkg A@EΌ{1\$#\sbX'T'X@mWLpSV9:KCb#"[䈲˂5RkzM?/[s.iou3qpj$JRJ3d:͹~~.2#+B2I&$ka_y{X'eD"_\.jTm(;߾B \r$0cXELe$߱;FrQlBkmEct`35G-R@4cU8+%dC@cmQY#-wZW *;^rz1ڂ8F䚍18mj@jy-줇&\[鐳>lqLbzt^ t6tݣ3\)#m@U꫰GZ`2h׃oe[dґ@i. Ƴ>H5\LgZBLrmko&mH[[Mdb)K[ZZ"*o ߙ&(tԄ2:Y7Q^E kc"ŹZ8=CQSS\a#¢9'-Q&[y4!O6!AcMr`GцӠYmAk[߿uoKŏ>җb q񺘁? |,P3S 12UUFot k4i4;_:* *8ƂBR!S) 0ZזDưA tn)^o:-tD1BQ4faw,(I#8^:EU 9ѤŴt}+n{ i_Zosi{\赹uDe"Q  9YR]Ak( DeQ4PIa+C[y129yұљhL׷xFʁ49?_뢡w`/iꚙXr:gg\ؔ#mNٚq )2i5i1or°Jq]phieuOɛpV1< ЂcA&3(UJ#T$8) QЁZ*>(c'yy9by=`O /b<գnY$ 4ϗ`- C&lT{Ckޏ0|zX@N='|#{ +0ev GQdM2چ3\`Y*nSmkӰ8Y0 ~K*.4q2s%K)WFVrMNDJ3#"8S?phND`tq3^*QyO^*,4Xlиנ9]#a]"٧`q7mCÇ@shzM82 jZp{:UP5ˆoM6V±u>5hM DnHQ'gD,jTT^LL{uܼ2C.EyQɏeo7׵t890|pVNyV1W]Mr' %L Fq8vݛAe 5>n3s ** oAH w{Mgqq !?{]CףL=U#qkXW!}nSwѨG8&AvZ(2iܭ#[%Ӡ"],b[2:6_Ce *tt46)xO&lG p7qڒųXFAgh yjTpftNHpXZyQ1Uoؗnϱ}=`& / 8qBQ兹@ou9jli/,ȿF˰٣p.B/rP3۾6`9u%lё~7 ~Dk]]dM9;|Cfߋ"%0t%I~5s0IKY9>cqb] eUB/Se3tb4*Tʌ&J'r~6_Ugރ79_m{vC!@y׏ZKG),ҵi*D-S݋Q$z6 33#[vFt>]jlA/"׹ ^zjFuy8̰ޏk~(h[ܛ&-< W [c.a8^e}6TNAl[֭:iG-ӥJ]֚)bak4'u΀sSCHm3lwYsgܬsY/jgK%o@ yMFV8k9J7Iۀ9535^5(cl4:68w uPik){b3x]n~j^^^~HqD PQpg|?YX!Ehwi~)X54J|55.54^tȚi!8e*#P5uT5~m@Z~V"9Dm4E݂qQBz+&:4iPHsUAWY\G%RQ,h+5blVa-k'Ru4Xab䔈qjPu Ja^O@Eb:\TQX2N7c,QĜ'=n";(nz=<9kerH%uZF1 8N9|6"׃2~npv8&O$˱OeAtXN AS4s6o:[Ql4Dï#h/k|͋=bwhgN[5@=*aDӖTR:^|Ӣ?L<$ZJ"F e> g?y {OcxcݮÈPa;`Ɵlz}$pXbY m 1g;f CieEH1PN F 72Z1O_% =}^8gQ~%\3. 6R!ܣޏ5O7~3w8ϲ,*ĵyv#-j'>ibͰY3OE'Ƹ{7ameБv| 0NL`8KS=B,nHSWd&)!B R4W` *2M>\3貁,hZɯ+_ħG˵x]}.^3Uٔ{ochcKkMΜy<ƀ4YK_'WLF!8ƔƐJRۤ;-,e^`D|ƈC搙sGQʶAbt4q!^$z3mdTrV!v,V3΍h6ݸJbUR}^#n00 +ccUW3s8DwYO#G(tDun _39_ ]`^:b^ rdu}w 9/`Js(FN"6S[w[qVvFZ~ը}uNjyUR0^ CVKOP5 ^bxv! FF#Ӝn]ɡ4/{ mGp󾍹y"8{8Y Mܐ5c/ӽš1GLs"ez|VbBD2ӵ_3m!oMWszVp-h_0-3Mf}]0-C\ {BGo"dM9-$kmq#N$S:=Uu~owH"!ş Z) ZgTTE5gkII2!~"R7Yyֿ=@猉ɶg K92̗TX@(>ŒX;֡Ǒ 𲙈p=R6: YXG =F[[@u#MhhڂVr6պ4dMFY֚he;s8B 7XsH"< F8IN]eLg" ̷y-ggRC",[cVX.T3 BꚃѾO0DP:&TfOa>M33P+,~{,س$W)eZ!`ϣmjEE])`:v@Phˏ^ gSML<~ZKFFȌ k)g_3kЄ}K&l"TBy1)3=cvܞ͗Qk xC o2EKgLz},AA!Aml## cmXcAY5RuotZGeK!v㸏n|77tF/w[__} --G_u1,?.#79\)|S?T]ZV#!̡+0: QH 𓑠֙Pj}g0Hdg˙V@1VqtWV7 Ðk=!ωN>wbq jVK940D5T-2D9 ̦*!Y8GܚPYz]LCyN( 9k*0M + qb}`6TV T@E< ߛ[]üVW*GNNDPbFK4rv 4h E{(3Z5qmPy&D&?ވ,Y E"ڎ=6f 2HC0 JH} #>4AHpxAc=)t!SAEt#+)H Fy45_ dJzl:cT+rK6#"*k45:yӹuZRZ1ӵDd^25]N@1/@~}ғgO&B Ǯ&Xָ¼E#in/c(DZd72O~!y Da\t`S4laz\l EɩW%> ",? T @sBr_YɥVZ|,]r+ko6]aV9{Pv8$Z !Q=΅V \whm#Co=s.m=Si{@c^KKE4 (˧yV:./d@!kXϤ_;Lh0<4(xF$Ǻa{Hf7_ jsrS/Ƴ 5piUNQ ݃;ˏpWSE+\C*c Bq9ZQ_tz-)}AjRFR9&HkJ&zXa:@bCssgX vr—0d|U6";124;;"gck(u zkK| j(t`Hh:SL8+篘y˟lkW?)@MSUtpbwϐ>B㼐^ę`Y壟)2n%2 mm?,MkWLwhV}H6eqɉ~ጳک>ρ){+_`°ߣj Tl+*D!fa7-J9OiB/\bs3( u(nW?l>(TseS9(zAeX#ugn"UhZE ϛp Z Y' &>vAH bӍױ7z`P/ hs5i ϫLP4rb)d=xi%)XyTi; ;ܯ 3.;tC,J5\XA==8 dT:g-#S |a+u{CgM7f4_@PX]JDZ۱ZʣGϐnw` [, xЎb3-;/eMS#*{ʿ9M 1?yE~52G'Ēm c8o31EAv'f_lc-R[,~l <"5Klm-6CV!=z8>~Ro(L-7?O\-i}񺘁? \ qlU3~~Ņ<+|B"Vhn OEgtCGK,UJXuk1*Iȫ(/jE US chh,f#GM2(0i?C^&i1v#}u;Yۢv)EN0(4ypURX5Dټg + 0-`*9|2]@b,/{PN!jrwvGg&֔uмJٿ锸>һ XBʿ<)F5vչ> ]fLRӍ` QPm&Ȁ\JuB;xWW#I?ƏGNrS1v-]}3}.i aku%-`.t5t@ǧbu0@+I,9/_{)⳧)-m,%m[q%EjJ& poig˱!V`y g\jEQJkt[Gk+.k!0W+ȕ8](ۤܠX_DJ 4GXX<1y{{)o-K׵H,#"Ǹ5óq7ҵe_K0X1|y4/rqS嬑@sX($2OcYTīPdX7 *ΣKoDN I ש/z> W07z..Υ}\P3<~::~;7ܝ~υs{K.R||YjIч$ZVy 4[[{;o|[j偠g_PqCM&^Y!>BQkh*Gb~/WVspڈZMo2hM=yιe'Ny΃C"P n=?瑹D^0ҙKvgY*(Χ8Ծ@TwsMq<Ũl>ٗ̽YAL#E9[ܾ(Ja(NBր%/sEbwD5#kaR/,DTvli C =j[0b^p%Vʛŕ0硞2.[H |˛K+R#D8(D:Q}l(UOn~> j-"VID]FyЄYZNJ7Z-Pފ6BR|-TeTO廛KD5:۠w|@X+Fd\;Z uV`) xN;p*D!IK섁YU/AQ2D,̝Qd#>_c";o~e!}[߇SZn1- \ YH.d򨆽slutd Zļ^:^o :c{1"cxFǩQ13.'X%4ZH D&CpVZ.ƖG-/@Ʈ0t N!N^sj )-{9Q.fZ;ks:z{oci\o7}\+kꮮ^g#{&10'~a0m 8cR- 3=Uw^Y\ŝ @=9y8q"Uh%E`\,:p&l2Hc:$C/z;w'0Ep·*j~!bJp+KChJerNEK-MBd-M)ǃ&#/dm |Y|YZZNnB.89>{=iȥN]"2O95sp;OA&΂w. 00IC׮~c=WY׵ X#\|JwMM7o%[4?2!j_^. 2dҴ3d󭜳ʴ R‚):Sٖ >Fx.Fp=*?WFj*oВgR\u贂, 5bx6ZI,L95_?3_Rlokqm2O ;09wkl,_Y4;6H -e1yBv} nˌq=z5Q`%MXwY=:(8qLA&MQ0 a`.OC0g ܣ"ߏX ӼJa1#EU2e cs]u-w8Km>#HO`Z2 >S5 ަ POjklJ SӜ\UZp,Y~cxG(c/b~:3Ss[>3?? <#CAƷU+pX00qfÑ4o T;f=NYbF s) 8}^ o|Ź*NA'^ƙ(qΝY#ʰu9]|:n^‘g/gDJ@IDW"ѓﵮJBv,xe P݃5ہ|tZ|4 FA9) 0oʌ(iUG3F>m1z(Y=l[JUgQߡdyn cY=^M(ؗv0 l"#h;Gk6]txdk\-vbtʔk =$8>qTnnPhoHwS/((-3^Өu̳ J~t߸ĹEEL!p 38^[ݦ<3?E @´H'ˆ^){2$2}6[ =9q*G~Xwzr*M]h5t1Xxe(~p_4DdpH5=/%!! Э wEc''sCWnMBm}X;MLEd{~6:cBQK(!%80[H:$ 5TV:a0jkIw#Xqc-,O'bNuHC2jrKuT A- Vi 'ݼq=یm09 8B-3Ιq`ݐ\OcIOΨ?kcqMl 5ZTѳB9zwtJ)msZ_ZO/"0˳/yASYB QHEs <w YwP<Ψ5 y=~`vcZm!L]tjl~iGDޟOeR/;v ٰsA@GzCv#@X(>2]{ eh_O'ps` g4 s sfaSNqb*v)&@o4QS9/▂ ~evO2lnj= k+`Z $=;~Q&m`qN:nx"޳} n/kh9^YK nڦ1Yyzz~o_ؼx]g0g06__g|wN;oY(lwk:j:"Ҩp5jY14rL+ݚ_wDtփCV㾵cQ=4]a54vmPkѩ3B !QBZsc*ųxT5@#F084r<@j`LqPL & Nl*h0ǘmmFѰ"!ƶ 9 up>Ɣ4<œ/p8@e/1%GRa1\1V~5̡i!|D/9|t ʈR!c!fmYi#&z+ƲFLy<错&pNӑ)۪Z:f: !Qi::%Y:Շc.~8l:'8X QuYЉձX[=sNc Z,c8"ZAk.2&M:Q6[J1Or7ift?\O/AҖNGmc#<:?t:D40Ro!:M?yala0k"Oҧ${9hTC۹@V^ Ƹ'ӱаBŐ# 6u/N䩇t(`qi!ϗΝ)*QBd":gd2 F]R̗"#O37ɑaƁsnXeRe:g] .<@Nc/z3r0]cTih~hנu;NY!ѱn0|^]m NM% Eg{cn!9.A-"Z Klpl5j)ϟ3z p#b bϖ( DT9g["$kU$γK`Sq.xF0SVB{Ns} 0}jO±<˳L@0skDGpQn OAA_}@s&ElL7(kwDu;(:XCH&[z n-qX'45[ ؈<㔡X?Gϻ&ƙb _N/gckC_/g_2 Z8:Μsl"ʂ{:K8쀦z}g H{b,S)L@IDATJ"xww[t&1i%:mORs307? n50gM}so[q-693.`#4BQ6SBx.4e. )@M3އ9@z⧮ma^e:8QE֛gj&OG^P *1tǣl=ׂv9AXXk4<:νL>L%5BPG0MxvgPh8n! mCEgYes>Ϡ ϵV"捻:~E"?o 54I .*)܍^+v1C8REg<9WrJʁQ^2P.ueYWTx^Hʊܜ۾<|f+ٍ:RK`)i9!%gWWQkw/lfmv񺘁3NJdZc UC)bee*m#?]8)*QQr6# ٢o===q xt 98FTgxցYj|BYxb :e Y8˘ ,7_Fl$ |{FAXXg6h=FDb6BUe6I1(חmFapa$itD߈Fj}!!蔣k[B`8k+ZI/vP~QVZDYGg0vs{4jYY[MC=U&#ضQp!~@T`7kocx733PC.[,@5 kh$R6ףjDBQ1ZǠrnn?b,.pL:EEe@B3 :#R9*̵P*G?Tso[LN`[5xT.r#:BFUWb;,r QfkSȗ ra|D~9c`,i=|u`.aIe8#*_X=z ~ #Qg6eּ)MQ\q8<Q8fR`찠- mcgTW8eFulY2u(Q=[3d^|y^o~~7˨q]ρutehDv?#44}lU^JoNP+ns>Ќve2 s6<}tdu_Fdžm*MP˲pIR(kYglj3E3Jh Ryߕ:3TzK?}# 8cPA'5pYҠ (f;;U;wohc5۶ Up3s^qp&Psg=7_HlZr5oppmGgk¿ŵ`T3x`w\Oe#qmtH2 hnZQ-s^:+EA"CehRd\@cRI֡[_%iD9w}^eRᔺ {wMG5`{->1*R+>}Y.`t)_i2s[S^NG  - ٵFl 98?FB)Ŭ cf*se^f' m ak׸D\TL!u|/]W0ZێG"8v26&@*<q8/J! R 5 Y~kY#R=mBzրaHd b;(ο]Qu>>Y+2u|!(}`seI2l!nz{ɪLjnkL7~4Il.lj.[/~Ϟ}tdzۈA/QT":`Uڍ8FsD)A7ށy0}L?%b;Պp(h Sshh\X圈X#Ã3a 5_V *>1!oU pphttM=}Mk/|NA'a(Tr=v5㤑3{PgD*g-Xqr2?:{ZO ġɡ1mNslα=$NF1TCZ p(AFg5TƁ]Ha)b)kWӝ7{*!.3D1葎o}(Sy nqӶF,=P@ C#JF6 Aǃ:jX@K-è`maYD#j`݁W\Lk@ݺva. Fj Cdtw k\U3f3"2PwigF5q4#Ç̢`,Y3FmGj$P:5 p,b9дfyȇbZg8D[+Kao͂j[E5[ :o:U8tez~hoDaȷ8Wombv.R'<I~}{G|6*jXAICѸ䫇NGϰ]t\6h Nַ Ys'sy9Gx jL|cC+gxl;ػ:dѸ7/ .zu|N4P^d95M>2lQh#q#os6" Q{#@g!v9 [L؟ccr_cZhMbJ~&sIc]#;QܲRcl^ef}6? u*}ȼ:DpA4tM@-a8B0F6ڶIn)$a#K@kyo?yl' ܛv)罙}ڎ6:o}4Iy%Wu1??hyƴ Q4BM*tjS|a5$j8GiuMu'ggpjpq7N N[9[)tl:'3a9a7C$!j4̱ɖ0oU愈;w_zj:)BDlߢ<8>8J((k`_<'9)Q_+ -?K)Z&ӈcTc#o3vPL1} std.tE]y:2y]ku\[M1LJ Eb]uH4#'nmKLa7bͱ~eY|N D d|B;n{F,5ZPʗuv1kDN xuʴ-TL[LR(a13!aܕkqykuv@LOW'̒]7h1F81hC~o$:'519};/uG#3s:L/@ٴȡLA/;kN0jp+K,&R1 .ިa,[kG?IKP|g8n1k,o\]:c^DNhcWbO L~9 /mdAr?ꌘ^q:͔ !҈6 ~i 6(hge~ GJՈ:`Ocu0[,4-qkө%2pyGGZe Pk:4]Ҧ.um:_ޱn`|K!-eØ۪+ k Nj ^e<s{N%ƀSLkB<zpneӂSr@GY;\~|o 04p}# \wG'M!P{uFhխ^ڱcۖ. Eac9|nsXwh㨙:ǵXQt]s#}ϾE)?UYvuge* 3:6֭Z)i6Յ5L[W_ր0H_P6Fif_ л'YtӵWaq΢ >u'ivVo_ ʝ$]iuQWQ--"<;3E" <J_ (/,\f: j)jY"gQ>YXI/`uu 8@-ֲ h 45rJ=N,S9o:ӹп;L]p\WL} k{hh˨CdwT0Rߔe>J 엱)/c/52Xr@Z!gi k2&bz̀Rc.c"v0QVd2=1mJbQpo>c}fG(l"EZf]܏^{tĽάžʳLr'{=yt@i3\@38U?:y,6[ȈofՐg:c__e I1A]_Iv.|٠5>Rhd ʣzUpu1jk;eisxOp\c9 ތA-neY*) B[X * @diYG7_zRߏ۪Ov3ӝN fn-N Jṕ*0LV hpPR"w>A!/!VAkEW/@(QB[aO{yh5}i ePp%P08< 0t:l{- KqHS]Z~êj"_NPHTRFJ{YCٖn}5EZAY(#z_ S~V48 CQX֖j0)_ǼZ঄r|(t3 ۅЅsu|P-/(㣊HLfˁsƊN5ѧ83O*Ŏ4^4<(\qFx 1U?%І)et/ᄛ a/,yګM#c Fhu95(!i;:2[[p K8I*4р{VCzR5ɟ# "3 #gׯ} - c(X 9ڜ VxʛoQm$"c%TɃt^ccM摁fy CyȂ2i(6 gIj9ۧ h0]0_Î*MSE-dX|= Ha)/Ex'*fOw󨀮cuH=7==pt,1g 5BLE Gy0Qaa.. ]B[bnvdBxk:,T_i#<\X_A4}ZtjV (eD\XDR o%{߫ {E4)Dcj:\9UH, \=Et\KҬ^w"s V#> j-ruoY`V\t;"dXPH|ߔT ]nRe 8t2)iV/e( jQ 8<2R_;G'u:@qF<rqcb kTq ObCP=nI/&һ?xK>/^QQ;eA=8vhq˘lj;Oִɰw9=Q>ZGL>.@g,)-.8V]tطLF)Me=Գ)vhWpxw̰͂W %pa*:H*)o!8rRR) {&P(5YX<ӓɳ眍 bUVK: p ʗ1os}3Z)}E+h?r "~`6J Ͽq]n\l"ޜ@-HSl=u(.ga{&Tg(`m ;&8*hk{d/L]}xp}ì ׶s@T߂=ζ g:ΐ`2.}Ȟ?AZzԻ伦>RM"' #Je LA$uS=SϼF2<\a Z\p|![7Npݝ/K @O9=+MgsX%!a@Ʊ*?E}m!RY_M"x]g7g7?W"{ƨv}ZdS1B~5 v8o*uoi]F,"DT1z߁hGQD#<6ߺvM 9Z'zzKI<;0J9(ġLJ ɹǵ`d6%= uB-~뻩u5ONs&PL bg pm#OIu8±)p1n@xq$ 2SQT==]qz/яfzo{1`bE( ~eDE\mV˨K1k#=ͭ1H+1T?v{}/Cmm2tI=^^&rNT Ci7cDq pNlSSA4NƋ4֐ZuUX8vX?&"Ot[4KD1(h簐FV7ebmq/ XW@B+tZI9i":"j= 2_`A=FUF_+ #NNF00b֭WA<|:Ȋ:kTָV0q1ROӕsPٯFww0=(j4swnNqr/2Jt#R`LvКV¬**9,gm?dF!_Dee8>{`JPp xhsu ߆ 4z543:NPG=f]iA__lIDpƽf baT_TҐ*pb|;]cqvܣd)^!n+;, cG7"5FiNz $,uU߭ъ _+Ӂ~)r]V> z"83'A]@=}mR#֏1Գղs1L-,[/s-s3fڅi)=M7=E6S0Oљ" I.*ũY@;S6sǟ}8MAO0:&XvQtV,fD܅ct(q LtU5R/eaTxXX:Y7{% )JkzSwzrf(/$̨©68x͹^y}*!FzN#UI,PNtFZ gaVaB6~ԟЕ^tPS ñYM̫N>{_Vlpe Ai&tQޤDŏy.ĈV 2z|DYPECP g 8E =qvW3iAG68ii3t^PaǬ{baW(t[ ˬ)΁LhS³Q}ō3L# a}|}ol& $iWuWOIm"2쳊*_ Vvl.:&Oŀ[i}FkgAf|@(g1{NF* ~f~tƙ`}P;`:ДMP3¸yx9AqL9L!^ugUx.At^$CQz ; en őZ1RE]v^S$t3ӟ ??W<8?֋i7vMCA%]F=i*d5ĄpeG}9q, uI%›{8FGFP-V ":E2rK!%uNFj(@QtBf|F<@5 ;?#u%G$9 eq jQ<15֌ryY)Lx+h۷՝9(w<`>1ee2EѥQs4Q%)<Ϩ uaH8;%H[Þt |vW)Xsmk-8B[*yKF1a,&MAlwM/_tVe$ *@I}H/g >330)ʇ126AC H?ql00 T(":Fʇ70cD=];,|ٍ|j{lUrx _y*ݾ}3?Z_9">q:ڦkHsc9aZeUenz:RGwkj&K/h٩^=L6//"gsq f 'FXIe^-UG85n2Yv(_!_@a9tlK5sq7Υpy:iiإ`k(!I2N"y[%F I2dĿ2d-S@jcj&7Lߎgv\ngO1k@A8 !jl˒8y,-e?+f\vЀ|U碠FN2`NuUkKF*n7>< ֑9Kŵu~)Vw_:y/_N/6uuDWX=}Q7:[` Y6O8ߟ5;:+w)Ft`2Fog믮u̱q%c= |emtU֥1^@^xnS/. Xdbj2XWPKΏ; U8?֖}솳BD=z0J,iD_˸>N z}KtDG= P[ ߒB̡'|B4+dkW<:1s!@or~f6x<H;OyeZc6t3Yko.0vio&%} Bn#%.XuF0\b_Padd Cg:t5ֳ qDYon/Εi<-f̦<:1"EDo%k\Ln`[S[TeKsrul2W8|Ȟc(4'`^e^;hq>/~3αc so[石\;b G>f~~LH Fr=It6`yC> 'k0 P_FC?1Y|@i]xB6ɂdS—A9۽_}\;'2~OڂGY+A um[ewܦK@MF(k*WB:LO%`Hю~ -07uV@q(; `pKr'%# s R |>,{9gg5ԅ%N 2pGs6E&./b>>y4ٽbxJ?jeFT?o92WWv= ^h.ғپù2UA^1Tkth745U8槕JW4ڻqy CPZAPQ4SlJo&е[%n\/ hgsګ8ilg]ʲ&@C_lj5o%ƃy:AX:V5/::g>)!!@}q[F6DGo@a~6"='9sDo 6<.-R'y|4wxXn(!t.TJGҚI8aF.NbL5)FNL]jumkhbltEQZI蝴XVI7w\ȧ1"zzv'-KId(_gO0x3ĞηZc;biҞfg-uYKj:ZYh&E*"sc^:ʵY6Rp2ZΰN09&(FzjIIi 9ҩyvMNL{}UC'a/ɾ}P  k]zM;Zc۬@*epeh}p"d3ƸNE?#25|PRj5N5J5Zb`._kϽg_|tXE0iHݻJjS>)Alx 6cߩˬbi5_2 ^@Ctlv~t8?;eA ) `{#.GkĒ"ܻ'R@|Gi_ ®F+yyT8XF^W)،" ˋ0>򩌰3rA_\YENd@1Ft@X8ʴwB=J:w1Mmcwt*kxt0-rz w,:OٺK= K0<2GWͼ=5q~1ݳ=-s{ +&'S PQ kq"tk"o*AT-kE`VnYUv\W_  L| S/%$x ՌN!#,Sy<I:1p30R]` ߣg,Jc8C5/ 3.-M5 ZqogΡ].f೜b>w9ztp+EcǷnE&;)5slQ8eP0'-z>ch潢QҺ,ewi'攡CA h,S849 dhs{ 4aTԩaJ"]T&笱HZ"Fqöz pyL>4McN,?! SЃ 0redH09 zKi0f%-MV#]'0Vl3_A刬I/&١8V`\hL`D=}HF*t#|v.cꂔ-'2pp 3oc DϾoqO#PVC+`qұiL֥.ȅNkWN({.| ]AB.00f#eG\]#jXQ#zoo3_867Zj*K| Edxe]du<2k'AgEcbÐ@#<xseXO.4e pwqdP :$#ô`HL%A*Ly9lxk|:38`>n(Bf23em"Z kC: (i8K }q|V{WY:~Q5FN/ShIƜP v₏A@=7?,#?#{s,J9/ytq[|1TB+W:~28=[L[>Fx񠏘XqZ+[2rK4pݕ:C5'o۷d{2B]O_!3Ț@ XwRć A<#2輆gT[\KW) 3oMt)>vr-,r9.DV4@VHP5̃m}%=z;ν LYl l&/czZv@ O=<($"O], ^wL{MWM0_kh(u&":+UV2o*~-^ |3p|~y;;?{O> P{|TVZvUqޤ!J[c odJ1KB&v6γψ~50R>a"BxAPpțyy@%8:稺 gU'o\X(_BC;bԐb U'VS"=n,N*ǩD co#h/]*)ők^߃qє 8V6s⁥mk,3PjiEpHFwa`Jrp{Rw{GkW@M9q<|&&Ƙ_tFĻc\~^O/RY!}ѻ2ƈP~hW7kUafe`#:݆j>6c]ڏ|ByZ&Cb +ʁ=̙LoiH93 ijR-g(u(k?s\aT?R zp\ %" ˀ5,PW_MWz{tAԡ^aNzH!@ 0MA(CGY(-8̻ΟtL[w^ fkuZm鹴KH[r:FWWbl4S@BWt&4txΫTk(jYNp]SI-kp)a3<ƛ`PN_Q|H㧏Zl1w#,zKkP,"ӒtDAk3Q SP2atS81+ʡ, g&8[M2r.t4tRC`9΁i::Q8 L/-(i2UL(Gf ]vr8!>'bΝwuM8\t3v|[yOF'%r>Fs`y EZq%F:XBq2t7 ]6W'GJT'y#2!W9'N>:C=@,ΑKMzMuP8g7F΃mb&CLVAY+xϪhJ-uzsY")X'1M[5ef2?8>k~x¢SGt"j]cܯڿg9/^33 g27y鉽.ƆfXeC[ùN UF 9l܌lYVRcD>AC\š6†C,T=s8Eho_V*aބASan-I#ʐ}P#R7*L[yAl֎.O1[6r꿕츠!315aItub5:]RJ$TcNxk,QFU,xiR](K-wH  h2QrlS qQ،"zZgVzFn܈Ϯ,ƺHkJ4Q 6bPHNC6_1ߡNF!|)D,H#\Hs:ۃC N/)nRe4$-N0׌Z:lF+"9'1KՖgU'Dtvb|:֛0jʫp|1p+Ϗe"&<,ه{| 袡99ethN7/wB@j7*$0Z|J#nJju `sW֍hG)_W܊ȆtE Y@@Wҵ[Ǿ@MMXD@5Ffgъ#[eq00e Uüto9Pcʖ=m)̧!|C>5f#A6p~^'z 9A@lR)Mԥ@'"vC NtE9?Y|*>BȾQ;cZ {{TzHٰfj1.N>&{=ʜ,~3|`CL%p`{1 gpm`O-cӈyXa]}!}Y^Wbn88: oϣt_>cUTDze:H'hz!Fom xU />dlUGX#y+A@^hs*d=}}#gÏ) 9:HݟW0X:W JI3>S>Y=Tr_읕ؿc5 p2gq[|pFM]GBFQl KceUZNM ./戣MF SWRDHs0D?Ky:_Yͳ+-sQ]& Wpq٢132 }ͧ%衘(LQ2g8Ui9ٍh J.1zD}-z/D֒QU͙{`P},(67ר0 ?JSPǵj-Ȳ7Fs%ā`Gy欔v0>M A>-|`PaQ?8d{sE(`wuxWH>lY2HRZ[V P 2*%t 5ѺN L9 >0XDgXG  ]> hzVSK=S(kA_6+,bl"Gȍ2oYJ4 p@C6I9py5l#C:NT0)X@,7 u&G풕#= =]lt@s@l#,S&vh'_ p?x="(70 ٓ֗1EuB&Te @XBpvQT/o;,b~63*x]f`}@oB lJX*\7;3$VHd834|44ZQ5N`3ZFsMSCV1c, ${ boDB4xkla^'w}CJԴ(loࠛ@{7N8UAZH΅6igyꮌ?y) )RxqAqyݘ{{3dɕntTL];44Щp$SFƛF$z )Za2Ouonqq#v ?K^ǀԨ0dZDmIo P=A^CeL~}J3XáIU"JdɖƿAJ}#]50V\ ntYJ vZi7Rm >hp"!z֝v!{GQb,plK|4LqERkAm{dtx$ ?}aM>ΐ:W|cK}@=MȟV4""ZQU-:t 8eh4*L  N"ۤƘl )m97el︼"]y9c%b:@`]\{:J:FeX5"+ 8qt*l>]Ե@w9'VHd&,SJ f)򿎣 T[oaBA5^Ԃ1SV#Bʌs`[HovQ 5fEGU1rB)0o9́ΓiU2G .ZXov<ۑ!t8kDth}o2&>]|%}Mò>xqz9lajLдo::CrAWsn{ºл;`2FdA 0W/~ >|;0o=RηCɳpז7C/prN42lGo :8c_}N`X H~Gw8iLzWw{GY,` ZȨP<1=}V7`QX |yQg4B4>bs)mq:u ꛔ%7W}:[3ݡD$FEP 43j.4Xc $Znmҧs`"s#RxJ6H $.@g`9g+xi~o)mN6X6C 0 {ir`P *jW uP?{m,@0uRj`)f>y'b-KFh 1X`*4HAN tX9`%[5Hp^-NfQ()!,Zju(ǩ0`9مP@^Zz~yo!Y:+Rs-FPLG3ve Azb".#Ys`DTj'^g`$mFd5 ^z5'[^6WGYFx?^c>sxDTD&2sJ?5LX7dn3`:IS c|l[pkGZa\և6%eE: tP3beYM;;?MP;;/,H~{X#ʸe G@2\2"[llAY|4(0*^]@Г*U0H߱]SsTMk֍{̃G~Ҳ=ۦL'ֿ +͕5NwD45! BV`2sMa>S EfgS!Ο)o+DI~_zy Cc-gj8j(OI_N7"y(s {_fZ`9r~+􉌫չ笚=HgtuR`AgEߘgp~י.{F9A n8#LOfQW< hQJҐzH:މb~㴨Rx]dWpbAa;D8aE*c6d%58)rsҜlH!(z l3  9=%GEXM0qZ)Y^ %TV{9 ե4m8v1୎=/ynqNOmc&RSB"fQGH2Dc`hPb\YӘ_Z9y6Q(ƸQ [0pTVD.86P͇"̝`iL?; X !˿7(`S cg~%@")Fub#ǁ{H+/c:x(hxh1gN $}d}=-g)ח9uNu${;bs7!]( >uu"!h#ՔΘ}~c Z(-u)}7oަ0 r#JNYyua`})j+`b[@#h-y͝1wh-aGbP/<̍M2ݨAa CpR9~,@̶rlTi'kaij~έF,q;S[w5AP\cNc}렧SM 4!Ӯ͕Q\(7V:B2ttjvL1}u@]ŵkWHUhavF.dLКێNL[+8pd7 zWU W%KDCWRFE+_+41TC+`q_E=i (#zcj>kt<"ȦOk$D G} {H6"̛〼]At,f:~0-V%<>L!=pq6^WzJBl6$SI,<.lql<γC\ƀh1c"X-f3qSJUӪuSyifmVc_ Pve m2;B$Lde(qkeN#es2e^-֟H>5̥v2!֗{T^A1g6yNr vKfvOs,o_/a}bY۠ %=:xyϊR]|'n/]ap'm^c%M˜X7,þض*1|$S}{@b[\@{8 c}5HbpX"CkFV`:,|t4^\2YsCDmA(דu[McAa 8b-Tp0r¿k?x;G@q6?xW?o\_?0Y;hgݾC&5|;,[WNp)kY9^σQf8h oNC , Bpf 6ㄉjʹO<mvmNjq+k;ɠA]5;&0 p˩ơ6 GAdUnAlЕPS>j"{[o}D7X"pɳ#K6j0~fZq@pYJ*.\q(0Ed""R2 ) (ar *Bet0& kM)`TLݿG&h.4 GEuc#(~9۠U`Hp9lwұtt73)ΠC\g'K40?%b> f|/֛4Xo^}ƪgU>jVuxNKoxZz3OHF`DK8(̕2@7 =U0ɰ ,'zn&M.;Ï":m*)!;sWe\Œi"%< gotôAm}s=]t$ݽQ pL57_C~wi4Y\ =aKFA 4\38BLڲ,Ɓ ǩPS=+=sT8m{7oXeu@& f)A5030r\~wogT'z3^8|/K ,[>$uqHf4\U-GM"zl3`ʣ\=^tWrPSYk\)2~⭛h\5dz/AWi7FdfWK(+5d 2e|yT=ҾqoܿBac>cAD{W;cݑ`K^b0>@dqܛ[&)`˂a"mEA26%; a2 C/nXlh16w2 l\MdY)9#Vp,'mkk/uɉ:91а>k` ]uͲ&9p6OjE Pe$ 1׉NYRe4M)}vMۜAX#._"J-+e]GO9v-#4LSZ8 x֛^*R+DzِLFU͗,׈~A~]%ԬrΨW/fw>2Joܑy(Tu;2떱O8NQW+KVǑZ|_A@I۠䓀 )$ hfcC{?ڟ+_z1gp#72:wVݿOlosNMòClJ,4;u,Y`ݢc8;MpaqE*b(咑#0W|Jzu־Cp qVqַpbv"CIu١&{Uz}k2dC昬ݕ$K3 ¾u^ k A@t+i{B{ 뷂L\Sl*.܋Z-izAm& -.8 \6F^Uט gyD[^XaSxRr™abLx4HvV~l*mb̥Odu~:(JN+ϺJϟB Mu[+.al>xO2 gܱzgNm#{=Κ4X_q-A_LdāGtT_i؏uʅ\˜Հ YcC/5Ou Zoٌ;eb5%Mtro`](Dُ& QZ{nh"{ҵ+C¹뫋'x7@h!KY3Pٓ]Eko!^.u`/L5ZRe sZN,`Y ?#P@4P׫~ :Fep/xA.L|o:Jnoo'_ſK>ڽ3Ѐ;{F 8 FmoMϏ=0=;XBRLUd]EgC:\&ę,rdnˣFRXr2hͪ HR\Bh |M8fe vGbckkG$S#t#dfJ'/_ڬc>oCSMKJq{BY;o: -8|RUS G8y~{"Rh:Pޯ e`mpyҏͬ]_ߺ{uJ2Ģ=xH-gw鹻fjQVoFZU ^N)m28:OdxOEC_Σ }וYqͪaR,;V<̎+ؙC)$;܄lJ:pr*v<c=$"tvr߭deFPq~qZx,M [ܠ*<difWT;J"VqP*^K miem*Bֶe:#goT֙znV%+8.\E|1CBSጯ죊 9-.7/uvrO-6PW>~`d f&u~w1'0 o>_:;8pPS3g{%drץW_dkڛeL Z<)i^b<)J`Cb{faaw?x[Z,Kw?C=-,!^:ݤ֕ OmF)@7ƽCgY>Ep9.( '|:l^ 3Ú?%J A0) [|6@(c=Os?b3qnܸcrt&y%>AΩ5nv|/_&0bb/:!ߤw[p@PǞ s[{5@8F`[hTtRRvQ/2X׮_Q2 m`wknm>jfN)W6C{ ʒL*m`؂ҌG!6 S{'5ϿEPutݮj2l&x\6@,БO{L/\E`|f} Cx7&'4^ 2Dب>+s` WM kAbF2v0mm zLgju=oKw=ee3@9 ٕ4> WL9T{i 0;K;bBk{H!9:j(ںÞ5@e'"<&z^"g6n{5Λ=yFy%A֔k2jgo[A𾋽!aYeYk$%TºJ4WEZ| <6Ⴧ3DU9s n@vezf.#@]raٳ2lY8 }Ym2 =CX%&'#Q/c #&'ԴƉh쩊 ŹQk= 55ͬ67Bn" ۃ-jwW4yf:uKI#J) sulREtz~`2a4v >XpϝlVk3Cy#kD0L6祉QX[!s6/>MօϐFl?*CLI۱(~?_$5^t8??C׿jU_Z_͔-aUz k+fY3]18 >Wd:q@rHbuͰp^({tH{TM.&E,ZeP=,+(VnMD0 \Lt^N*ۚF)'s@*qȾu{^Vjƶ!wՊEAAשP@* L~Gfn:EH=i C݆Pv 94BU' /B23I "~DdսOڹ/A 5|(sGYlzٿAf{TA, "\)\@6%PKaon~`98L ?WJh8S>NEk/w6Z䶧=J}x֖+ٴz<׆r>R.Cq~S!sSs6'b 1+iٳ4J&$98A*їA-=(7é2 XȠL(Ȝ`[: ևNA8YbJxQyvZ6dnAurTPkW-M)C C8eT@V+rEjOJGc| " 0dXQD0}ؓ^6(N-ײAu/G}K&&d&48\x3!>y2bn!lSjQQ9YE5eXC@Vӏ|a#qB.^=6`uA0/[>]C h}%e|/)Y "l`̊:^·{`D켛mplE>t*ֿ_-sDǾȣ)e2;)n,w @׶mhoQ"ÚΡ ;{Ƌ-z#L?xv6`!&5=naN9S7ߞ:%u6L4yLcE$dPs6QtCa5p̟bOm5ct Kt >Fa~v[ؗ$PXަxJ4~2V޽:j(b^w\3 wnDykQMtRhɽL v}#tUSeXq. }}s`vT,e!|2a}#z)HVằ\\^>,pK?݅;?W]W>*y8g# prr--W-,nQ]BO":: q@p[,lsCTl$z y2'{7ے_AtN}p25yAO_.E Aԓ"?" WE^t3qoƟ#Gm"83YXXfAve:Tb=Ŕxo[u;i:fβ)|0cb`mwl޿βzW٬dJ8PB1Zd;xU4F!tC{up sqQjPY3sϽudPpl9-kmZV9>q d>^aBA_C߻dwhCHk%0d;/e>9߀t;6st*̭[q >;2|azTpI0̑mW^Iz^x=o5Cg>AOou1NNYBY(ϰӊsh'K$c=x?ډEN߀!TVDM`div M=f|qFJ.\D J~r+`E,oG''Xq)N(z[kl5m=7}\*1A~ƌk u0, *fh?i@A-קԮ̓I_qmIg/%k{}ӆO5E(@IDATsL8Jo,9$ *leu2k+e2%ƀ3l K*:\'4_ {a%_Ocbb5v]Ary5P :0b^A%LO"yZF*-* Xsjl!)">Kmtވ5 0̴ 4*8/J^cl!x90̎N&k dp@Qj)XM*`J akCS{[AI G)ekaU_ùw{6Pwy|8Ρy:2$a͢tCtE}}63@";¡bT h|I*28m{Q_|uA26Ӆ_E0l= ^C w'G3^NxE2z !~3rƞrt`*=rZjEoL9ЍCeS\PKc.R)_U;"&ӓSOo}Ǐi'Vb|C6N.4RA&.AM gKWq `@ͩG =}o1 贇%܃bPX'ό"V &ŀ)yfD<)Pcn +7_&G411EI cGpv`G_rZi6U*c.X%2S331z:/`tՠug_ƽXN2lp*#@g@s:QFZ`ڵ 6h%aϡe'+,c)XރCiο+f4 Lq*piA s'p;ց@mayg`󢳓ps+g3%[%6͸s.s~t<-rkWmO*u&HpY_Kg5kU:_v,Apkmˍdln"Eo`N{)® t60`},%rk˳8#ϸ[R8~N*w&tC`?avv"9'qNtO)1% %t`ZMLhXO ~{&adٍ$A%>,PI5d*ֵ>@Pך~]Lf$kƳdD!]|l$mZg %v7P_'kglE̱+jh-jxJ=m r_{^wl>#p|&#om,-~anqEd`ש>m&zPk*m5g+0ʢM 4)TdEߨ33uG|Ay-Zg.yu tާÑ ŵQZ!H'PmşJ+Y+2PͺP gi~ܛJti6z+AnF̔ !N|W}$9ۣӺf>E_oВ*K  v;qV y{;ދt /{W1Ya?:M ΑsCJ|8{АyB˱px׶4\,Z`t*43u{[-5?GT;[i `WwzAho#egyn2YUidb245I=9s5bTK<d*.MXK0H@,Ic .D_j<Wr'!"Vȸ41>e8#pSy9ȱ]0N>c eOQR_'MZ;51C, (8d3y GL*,B?KƧnTR:{,e&=ݬѓ4I%עAv0|jZ$REFެuw \> 595D e YO 'uZWG`@v_ okIyS lim~:O8WdFy]k6 u.[:fY2!.{6{fҊCDf ÕlKRt&sOҲ)P js?:^qu :HƷ DZL Dty˹8$5\4-cN l-h/2N!ZXCĊZe*otYe]<둍ilh(uAǾ:u;MαYF}lSK=g='9ep{=n1Z_ aZ`@(#@ B)YD0+-G 8?p|^0[۱4Q8QO}_B Χn@G@1vЅ  9)zrřvJ]Wܧv]<| ]]l){rFOеvÇ""uMYxu^ WXFPȞHcm@s(k^@Kf}Z":e<]m& ?س >Ö] @5l \?BҳbD& 7z+4 hOFQܣ:ml$y_pїq|CcO-HeeVe+:̍ M! CnڨGl@zjSnH{F;9LǵǗvMQxca2TU,WJеG|F k>Ytv5g#??gܭXYusîo1Aee8dg\u܏CEA-9s:*f^ֿ٫w:q t+hVS٪5t 6 PVΐlKjg XH_*yS?#Z=iwad4-? Ffp>Bius4rhߢQ0;oWOo7ڍqHWϪf#ZQyѵx-"z9!S$E~zGǗ[! ZGo~?j4-OPqVT @"9^ u$v[7b.]Rgvg֜KTAGCG֌GT(8:edzRe=z#8KSwY3=D]-7Ύ> *աcNpQ߄HMs1:N8dfWU3'PVmZ0UL qjz80Z28X:1>iH|݇0C8)~U*+iZ4TRE68rС/Ai ^%2G1$ PuǧfhHe 0qtS©,&{텋ӟy9Dc8O=;12z\ /^IC|~in@5݇v(fOTﻠkw5ٶ[k{0_@߿dWmj:ڦ_C{&a@M`fǺf:D`0ºT(<Сe`nn@̌e*fh?X=ZLJe_VȀ 3@uku ȒSm~2#[y}^_ 113N>>Y^I;kh4`a+G 6Щ)*-=F3a رJ8_~lVQiqcWa2f`.h@ij^ =?[WSQah'K\Ya`AˣȚ@j(*,.P5zXG\Ͱ{2<ԭÂ* &X`K |k\$l[GζJiyĠF vMΑ]C,v[{39\;>l1!| }0t (ov7moЭ)[2̾(1( ۺpwKAYm.a Au%Xt8`^kgÖF,,,n{ހXe:݊Bp1#@ϥMO(fow>&18;06̱, >`{lgUSZ %Zтy<T쀖8,%#byqLyׅ`RW=p%gQZ n7~SkXfʸ`pXHC/A~.={OƜ`GⰤAA@K%E @(pO>\u@2-5jHzʓhK-R}#{{<Ģ1> x s+xoT˜#inn |kke`i0;QZwurs1̙spRUL{+dȁ6']OXzFɉ:ДI"PR TYVY( _ {ҼF|E]4p*g#37%g/:+ 3X1 >6֞yJg׃BDXHa>o} uE6(c=@AfvP00(l9O{ٰAPko9V2_3vg=%wwчLO%bK/;M\Qonn gSvS1lЛUuq.NAAA CX[]*QP\Yesxmut_I@K~hi VA$TH67ֵ D {C4PĿ"ejw-7鏬sF!膽 u4M5gG[kr"J-'Cˆ6YfMҩdjj*@먛k&(P4fեȖnW T\D=f/ʎy(5alR)Emo"X.` 5>[`rB)>45m@V le 6B2NM1RWe?(辑m1/Ž0v=Ƕȝ`4T'̙ l$(iۄű= CzeGL'mw9Oy"].v@#Qw#1 KC{3GF6FkUK*ljk&MXKVV.(' xMwmv%1s=(ָwHb?g cDiA"Vt,l/ώ6Yx] mK>P*_}F `j)Ic<._W'#d{4,nEd景R~vcv|kW;+6jz_:F> |L轁cϩp'GDhEI>D=DLt C?IF2um4Rg'AKQANj -99|M̥%R}-.]ovO$ܻAy9Dȃl'3]]+a<˸@Υ2f-j&(WqH[0_,( ,;۩O"8D^l^)@4[Rd( ~z#$;i:΃ׄ:U%8t*'뀪y`B6)`P?ր/OOaFb%{l6tl6Υ:W_ѣ;0νbltw.4~z-" !N ޡg3{U.Bct1dS UVր::RV=X m~zOgp@o?:fBIгCl4:t`]Z]K؋f-Օ%z :P\Ơ²]3|֎@Z!؟(C~[Cc8ma=% NmsY/f!ݔdc9"ƒAo5m@zM=zq//u΄z:c #4D -C P펱0b3W eTf|vMp~7m48d;9&bn[]㎹c%`j <n .A7vH{%Е .m'y)ƺpê3%\#Afk͏vRI>A0* FSSǹC+Tat)eOm.!H&Q1jXa{w]&\W8 Lq*:l*hf'/xOLE ֵplr@1hCbZ oq! PFkG?>Q0AP!h=5)qmnn/ CMڸX0h{ u1e޴TcSnl^ռʎC5쨶\F. GOЯt2سX0<|oڋ:ԊO{*N&F[ZY8dcmwp1e]!ΎDY:f5 YCֺzX3k-x \]o@GNF 0-eGz=uſttF0@D"x^rF~f2F ϢNJqR~ q6Nydgp޿C^٬$Y!vz98 ^(|[8>8AIu&!G(v$> TY(ș^TGk `b f;:Dfqe5E9ox 1#OwȒf~,ڡD݋i4 /Q~-hfg`B3;c+1 28ܢ󪛘ú)japSˠzi[HI{C&s!9u˗_/3gv3,*8fC‰g|J2$f*&TpS+du[vƐ p]#:gPuTWBJQxbY!:(Vg#!*M`2XkIܲ15u٣{,ԶA [R{XwX^t֋/ǽ:,9Zg, =rJXVp5Tr!JG;;Ϲ] ゖA53+Yfnي/m*OaXY${5>c 4+x{F"ʼ {hb E쌵+h lӁ@{)tLA ޯ߼Af,9`m(B %\[iv"@t %1U܀4Qy )w*:mXa8 Օ0QuAUӹ ̀H'lAz d+]@pW?bsdZi:!™Ґ&li{yd7:{{Sw9k'Pg=L|wO/!+:!dycX w~a:1Ի p>Ȭpjg mn (>ZkLSNt)OZ{{k0 =Z(fX[^Y0gs<h9* #*s`9j5!Shr5ukCMv]\ .m O׈\݄WII!`gW،>t ;+m] ɂY=Gq%=. V<kIG!v[PϷ(׉7\ ,q_1 3ײ7JAbrϼ@K]{: Rk<,R ]M( i(%~p% ^ds6m]FBJYOˀvoa-PIYT Vb+02UΎm1"pln2 a )|-ϰ>ؑ)"|iyxΈ ڥĂ  e2 tw8;Ls;cçVW&. P;ч|X=@򄃢׮83s8O):|k_{8xd_j"űNAb2 f# 0X~e``TRoB!jɰ5E.ʼnxЀC l+ nBp =TZ"ۀF\; hj!¹_E8o@{=q}AG,YQ;axaP~n`^GQ`A 21?zC34(V2e$>C NtNW[zb>-??AHLq؛:ᚳba IEtBAOHpBLL饊3p^"cMr88&Pjdp38S㚳"|eбtZRaygk-ѷ~Ϡy!"8ff*-XO Ut{5>5_gฬzZ=\^8E XM<. L[;!h=3=e`1'D;?L.nEIph~ Tra:[bI6xᱞq>k@!s!B0t< -(MmeKHN'0m_B[@pTq>ki3@U~ = ץ!M]WNY2Xag. 4ii´Ƶ 6g,sro W(;olmy}O2G8% l(d^IdHkWE(]{;LYE0H 365}.YS7A0d~,ZAC!eV߽#su|w-7xjgnSd)MxX;N<(&&kjN/jwnzh ۃy#k@!>_SL)?w`֢zLd7;"8A3 l`(c70%+vPD4ee;d,(iDk;ָϕť8;/v[Cr9`3& *_̙m  9[=>ndgK֏ W^+µaAn>~96[Z}s{ >eڕhp9J|PI jv$scMC tJ;܈ɣUcB ̬a GZN:jOe \{.ɱlwMf/,p@a ig7?;f\)o5 ;5 aMh;2d ,b^Gl,]J|`*,lQu02}ܷ%g=>(P絬Zޣo_|᯾ҋݗAMNs8=K>?#*:~sEp=mkT ]5w jDq.8#(V]=3T2%BfP_T|ř  !CV@\%uO;ܼc(i0ڪ-#svK(kS /ьNEP/p(hU#r7@kK k\zǸlY2[#eozLuITѶVm)'8|U  wOvp%u'pNp^>F ]5q$srz8!YL>x@F;=1SmH%iZ1hK 'pI.&9GZZ^y5z4ZYNJbT߀rB\s*,/ *zBM|l^Tl(E"K@,Hїͨnh׉e_t6ש>";# *mo֭67|QFojky,,NIA_& \cY*rM$tM[sj;3*2kft6C=}] Mè9f RIǟ'm 2QpClT,'OȌe':p8:Υt|"kK)p["V?79My(1 L11YSE( )ٵ-XÁyV/9 9?ㆧ\+s19y5~gVD<!w:abCNKHg͢3aAf¥ VJ>~6EQྲ.u֦p02e'xض;5lw̹s $Is YVYE<;_!%148/Os3ic~.pN?}ۀ75@:b )<ǝa@ +m.%9#%hp-{}m^sVelPn ^fmxP66."Uh eF4E?>R@m)k>vQ@RhKc+kF͛tiv|;؈0x xf{W/7/_^{|l~F 8񚯳eKo,ݍ%'qB :a f+2he a۾{P]i:7]|)c*fhM-f9X806CWϖFuDLA΍RU5p8-|t!q&܋ʪ.BCl #8uq*UXs8);vvdւz3a82ά,3O#KS!< tlsU=^NV8ƃ^0~yM::~錙/ÑAsz_B)K60C U84.TζVw)У ȆsRK1!TM~ś8WRH<*o3fJo= C G̕]Jw68Éz(K+̪C=J1'A~BftӪ2"zx>I2fIjSGm`%{ P:i UN1_ƿKlV2![)3Sl)|֧e= ԕRjR:Ue7TM OkkQzp>[k&Fr AAhMR֎6:IU' LL ݙs)g:z;H6t^2IqkƶK[q6 pK8޻lZF!kĵ#l#E_=l`X 9 "g;-Qef='Σ2r,;pLdn0,/vRZޒ6CezvfBeohϏ1#\+x l^w+Lb76:xXIt*/-F/ @P:&&*֢*Y+νBJ ӭմ xsߧ|lZ#nOrM昝=x-,SQFNbLCaoΓe5h1C]E3+q2,_zG=g [J~-D.͖bW 9ֱe,7v Zr'd=?KM|kUbef5NaIy0 XceUd ̸y9 \܇;#v T)lCJOG'W$YfdΥBKWw0=LԒ>UՌ] &P鈣m +, ac 5s]{%AQ,C7u/dC怤d@IDAT=ةOf^ kiYE+0Vmi-NZ0;DOVն r RPk܋Y,q?@Rʹd/iӁ zS z\,5J- >6_aX3LI@¢f(qEDZ N_yEL*e7(-iaqz1M'+tR3͍U3.f:1'CN@Lg_}_~?'L=Fu΀י~ejGkM[{-썁N5:ѢqrxhT{{ЭRāLaDaѾ[d Cǿ9٫!K (]ݽQf`hßC'c/rÏphUZW]}?  l7t~Q?%*ڞ*m-*8   ęqs Ϊɾ@ס~8e:+ZYoĪ- l3WK7o԰;uo|my~S'̦@dqx?Du$(`gR@G 2X7): >FiIOC:.vu{tƅzd~ Twވ@Livg(!#.JlD\ 5\U+%2| 8;fUXr,ǐ gO]m{Ot# V%`AKlJԫqT.6mLP!Ɵ<C>UQ : j)ѪG̩Y:[fC){SSm9z諲=,pŚmkup@WݭZۛ]^Uy3C;>6ksN-3Jpprݷ?X ̽{ X 썁A,N`/h#S@2=vsg ], W "8*d1h#ƇK90\y5`L-5;hbhd -{dЧY-@PX'k5YlVXc= \ {.j۔ @(k`Х1%v!2=$8uʺ |L0d8+ c:bр#13+0oض{3zrpmZ>}@[;U0hۋ~}X;`np2=m0B D dI鶜k{ۈNe5[\=(&<{F|z峟$Ǝ֗ ,ϖXҞʺ*b?v%M|zg Fm!엺;CCYbw_NmiQDUhY&Aۆ Ԁ}`)^\ ,szPU"1x6 ]>Xg?V`]v)'KV:4A0-bq3W}k>փV$Oyv.x6瑬뜗|:9f|dzל~> $RƷϭ4lh gjz̓M6#s~5_ {ęiŽ+m>) $NK<́hI}kCssq}$O#˘ϹK Nѕ,Iatws>D3p@ʓ (TkVMS6JrD7YHi4"B03[@WHamKeWR[v}xAz1},PƉ*C8{(sn8wly~;Nwy$R'$Ӗ[PPAw}K-M0%c\EG9XF kr#ήckJt륿/~^_ښ{?w/3?1;Nl~G 8?yKJޛ>ٙ}O}w BΐbFHTUL9T%8RʪDq$UDU(ŖiQg fo%}:D78}>u_u7m._8#[.H~ OD!(P f+Be=d#cSd-"P~5 R28f8Z$BH#, Ay!ż`gd}npa`4i`رu1%Μ%z" (hJ {. /cRVjr$ՙt0휨]XJe A~7BaQ.s^s5O EvE!JZV,D }H|0cOk˛9麮s@*1%\ksC ʨ$4wP`8ciބR HQP5⺓Dlķ{s׉“%1([L5 N,h䬓,7#>?:Vpc1U0! bTkzqa%6/j"{(l2`T Ml9i[*%ȬATRX*87堯a%J }:zSM['[j5CR4JXIs.it]RHQ2Tv rv@*deedw9g}2^{ b*vopbQP AkAL046u#K# pM?9`/`_Mxrb %尬=fy K'@)V*^I_\*NF13^C-,R&<Yt[kb>:gr:$V<rǣ~Eo1f! 38Po.AÜe֫I/L Zݥ ܣl2 !̞1|s9Te[:#*^4\Iw<`lnl}44^5&Waa 4,c];dxVK&uͰu: C` uomPPJHp{Ƹ]g'({/eY cc[Q6YFOI)aai_o&#_E8z 6P-*C bߖ\إ4Rq8ω{$$հ{a51~`0`_㏯ *P].C b DI (RK)lR¡sѮ H{]Te9Vb.(zOҖfr*)5pZ^l!$0C [OFQ"5 gFQ# ;YA wh@=`fš#9Z f^D(QF2f@Cg&HU2$~&CYQ?fGxu9_[J$9Nj>g227@TiD~^Af[ֽ[ Wom$H*fZp+9tiw j<[i%z AV'sd+7Ʌ5T9#k鎿p{+.L# @sm6$ÒbpXSO6пAFF0+D 3o/_y1ɫY 4KK0CPԈr$>ӇPϊO qGˌ8wMF*MSCAO2L9RGֹu jـLbR`ƻi%cscQUiWmK72О|\lHWM'7o)Dw,Ă37Ax2vݏzG(~Xz֕]F Ǥ.KiҪՍu.8MNLxrm,3_JJ$YdFt\ IBZFU5G̵LAʚm[ cqK?)*!HoܒDDY REEjfm6.r99,mPe^Zy7R3υ}TiY57("`eRle>J6OU:LYy6!TAg}O:VYt"o1`]ݩodv[·rggaM<AD1Ԃî[̭h^47>Fz34,A.("9˽W=3{%A զF8eozJm 4,v Ew؅3>!!e{C x2(bMqܧj~ƹ+y\43Z {s &eE+׭g;Cgdd; ؃pd#-CGYʕWXO35)mbc}HZ7g(!܂HXgf:Y?$ 3`2 fI6~ܟs߳_k:$=sc944<m,TLHIgRGgKU%NOFyO]}3e1-(Fb^~tt Q4裇/8 b ydJ\ځLqtso毱w3?<|_޷^boڀ` 1:&Ѳ1c\=zY%%GU#g{/iA 8%~nտ/oNLL4"aVlhD .]prJN,3?fjxBŹs+V6E}w{ =$}5"[ȉkK{B fl6٨{J~ז(SOHWHw"7͛^|gIWT=]Fht_ <_kS8Z@Z 0QJn`b$R_AYc NE|FC[ScJ0X:N%\[C𧋾,ƶflL֌S>nJ2z 4h7TMԄ5A@?3,2# n_d81dNJGݑ~486{YC|SsO *"6 2g:A`b>4R3G{&& ` fSJ}V{ SNR;;@֜8\Q `)om.z^]'>Ĵ _ |[[Sc6+!6;1u !% {  x@rdK~ *#&V+?N ;(3m5z/, "=3}<|vfw)HV,ٵ0q6օ03/s4%xeQ@$$i%UN9ͮ|%?F`CadHԀJb@Yjή.'%͹`L[2j&8,1n()ЀORg'!1>%@5/ZdV,rvI5e<#[5>UΘY`kMYǧ)0 A$HGYwE4^/ƋA4,Ӌ>9\>ϯwpH&V;,iUx|me9w:%{kwG ή։_,g1kxadbYc֊ijJցap?8Y&іn30.n v_â,b.Jg!$% *۪c$ ;Ӏ(+ᗤY% UppH`yz.sqI(z*\^ÇHI! ;HN 儔aBq0!4Dq\>a 6k̏KҘ뱣FmPrPB9I AqK+qd:?#qo cO8*gbJCt@eQ!.ͦWi<4F.}cXYr#DVcЛ{u9Zۺ ln聨΍kPNh43La s։flHP~yxDyH< Rb_W[$46NPKc^OIb~87Mxk`L?㟜8t8%~_mw{6RYȬ.:UnWZ,Dn !I-f@ sm{dL88{: #25鿕n ]yȁ~+ں(oкRy9"w\mG z:IU}!Y 8< _FjvJ7\|5HZ_K>(lGg.Aju=]"([ eo$JXPM`@Ra]A*.'eE3MC &JU ͚U]'pꄰ SF6fq~]6!#@wqH%ߟ~.$vxbag$xp-|?d,A% 3&y]qEZ@]/ؘ';84]Li*8m;D~ 14F*$1tJ)`fd2q-{P/ i/  fw@)0AӱXޓ//N7C\[ųY#J`ͮ*: C=Zf *3LEeTs\kRH}975R1`w%K/\\kJccCvޟ֓\4aG+ٰh?dx>KZ>C>A ̍*:0,$]f!T-8wΝ˚`"Aڊ܌׭"FTQGލefKqH lft4>G X 3{EVZ¿?9lSy qN L!$_AdJrel 2J Dg5j@5—Z zv0,`O0OKPm\k4ɟu\2*(Bue @0B,!UK;t_ugc~ kZqoܔ8 h~ BS҂oA~aV?,ljHR_9+ =5}ȦEKBMO<B5k񚚂f]Jz3{Vw&umH]WnY/aHI`zoE"go8jԫZrujqCJե4^'[`Gr{;+1;7-sw&Yt;*l, "{{u9cY~zE-sg3-<7Vj΍[(hwe1`sr lcx[RIPR8,C % U!_2$U s׹:^*u$fg^Q򨯯5[r uJ-{QSW|Լr=GsQ;DD>coP3 ˒QH"/{L%N򜻏kͧ~*g_Z{x$ ]%e%[ yyr_&wXcA~ лSFJx.Kie k{k`$϶L!Z,S oj29H>4xg%תekuͳ=RLu((i 6ĭYn mu,H^cמ Jv<O'*bt zմF*𥯌_#̍)q=gㆿ?'{z+dͻ p[n_I]8UBXb&yJ#ⵂf3(kNǑA@Q`~-E^$) S }@Z9? xwLlW {2{*) &%n y'ǵcןˉ>= X .?0o=bz׬?|O{ο.PnI:-Q`_Y:kȴw@_/ qi*ʢ8ԓ)Eb˓jW!XCT!:u!Mƻo)OYXn0e@X67;Žs~xz {5&oܗ +@פV}fQK=Q( Ym}edtDc@A@V3unl5ӱ͢We@.v}U✿x :4+B2xq#Ʈ&Ĉj7Uk-Nc5 T"y<˾:g;yPFXm ߯,qrfG&PtrNAp\_맶H޻,<fr&ax::ʍl% Ϝ/PuD'a>\l`y5{8ꀩWj! J%Z4qPO\J#$[:1<Ab9#Z5J#9`hJ.Yv:ʽ3*/rְ^M? վ8K0,/2Ė{g5dP- ՖP̱+_?x363Gl>qld\g:/3aK&aӺAr\2]šmVRc4b ]kR[Bbͨ e'**ѳwQLEWml$ پFZ\AY7H4/Ck1ym*'J`q_X@º@f<@4L(S!$^'ڻYyY 0=>YlN Uud0Y$ \)mՔs.3e6(&3mv[7݋>%}eJqUBc_c.T$a$ƅdtFцK(LkUe !{`K"qSE:::Z.7)e!7<t=x8V2pFfC#Ԥ0.fz4֬TY*E&PUJ~iFMl3NpsDJ]_׶QB"`$`Fb+J.[wл}6U !J 6SO4/2p͓b^&os[*=t NY܎4:A)`J Z8n H"dSa{eH-dA1&e̻'x21 I$I0W (C.2 g`q%SXe*bp}"2,ssbi/|5MCaKT[P6l۵h9Jty`= [.#jq}#p\?/.]OY`5ZPp 'X"`N@GTݏǞRƽ` pgQrH9c`f5,XZ\e1;*! fQF;̻4=>?zHZزܻ!S~d?h0CS#efdmӻ{;x#<[mF>Hj7C?GEs3ǬjנeQ9]\' ldDTg8k4jJ'%=g-򦸶]L[xpH"Chil'rOܿdzcT>-/2WyjFHUXRQ.5).O}ܿJB2rj0%%ҎΌm8I N-C|fT 5&(;NK50c-+F#MלƌѹNS ۬mfTzf뱵2wo@&f,Qjw M5MTA/{׈!ѰYJ ~cOlҎbL+,}1ţ'6{iYxz>h1}{yN1uz4> cW#~FA=i,DفN%#gi"у{A@G{I-''yUO!%V0z95fŚc%IT8k(# Qc.?WE,ɡdBn>Mi>-m>g=UFk ޟTHdRUo}k/=L OOGӯ<WO7 6E̓ ByjP5Xj^K`sC[ 5j3P] 搆8U߾u85bC[O4A$C8s@iF`̃{:@dYg:08Hv35L+$tDWD`I"9@,rAƍUdP R0i3dYD%5SufK`ZcK2ܭ=?G!W4!T;3 )[Av+A"P | +NIa3١j> X FH W w*8iXu1Wo>=L9ąu'),А`UNk,3>m@/H_S%dKQJq-,`D:F:@=|'#E?;Fz2>'Ox `ych.0(ƤΌjS Šh[^D{5kΡ G2Tk>Lөn ?!R7H4v 0.|H7"&㹇?C`̍cp)UOWW{א D:i$ I`6aA%H5+'&If;D e; >yBXgk}`]Xf͔| ՄJ $ky}j3N\__M6/u175U^HgM/`[ڡ{J?.O|6O|iM)$r܃ofS$2`q RedyT|."`'K̂*BI-wc@"^UH[H+>lUIrJk/C6{#5{t~ie?gKj. `{B ' xi*,SC`8EY:ĕ?Ϳ1xaɂJxT@.#R%{EزG݂*p˵j%*hu;n 7eQ[AM%!]|9&IX~ ާ~1_qj0O/3(҆{ٱ􍱖Yſ&F$ 5@<H! >kM:^3((g&Bw¬2{tB(<ߜ71{:~u-J6Q,-YGEpb̪P 7!f(8ژʲ$ 3)c!>q{&FMQ8r&Ψ=Α'OFBӛRݣ*k9qq(쯖k TK笶o7^o|]t`9:G[_,=3$PpaġSIm]R 0&l6:"mC| ΍zlRr3=Hd ̰nR_vd|߷&@p.Cnj]d mp%mɔ%@,$[fj,'ε#o^fe xTy(t" xya'Q[\$#Kԛ!IJ-]{Z_ 0,Z]$l&AS3=Pqǧ<i<[|nb(gpc{i Jjg|SsmU}ꚙ0:bG <*ҫx!cCÚsbEџt@A.@IDAT%:K޽u f02ox emK c1#c4)B-e&fuL~:(TfHz5u6EAT]U;a-7X+^fwz`qIt Dv{il_Le4v.91]v-~}oZw)SZoJL<>:RZ\I f~yz. e\)S0I+{@6 큛Q.T.Tg"XJC<2:Ͱ$5!FtwrgsQKF({ܳ%;zwj~ cwQ,L/p&~@1;fl,a*t @iF[\(I3$ [`IjydsTWh>ʃM]ݝzXbon uKKlCWDҭUW DЍN$[(I \* M8w l33NLXxquWk੼_:Fn:yv8HOrX-c${r_+<7Mف՗ظRvTٖo终ٝ!)ӇނLhl'Viol܍9T/coߩMHJqQTixJ"%GU[Q-sq_ߢ(琽ScEAhJ,!gDM1~'K#vF~`ߺҿӯxGp?pz[Wս;2e'%Y!JH'l$vrlԏD 0a;LHkFH% `ܧ''9kˋkԙ*E^ dw  $0DPɪX#~΃!C 0fej bo߾ twEjGދdB.q|Jr ^^E$¨)2 $so d 7 Ȟ{9 rak 5"ˌtlU4p:+ @#AwGI,NsDKL)ځ@ v `WŅ$YqY³ @[A#/^"d=aùZ͙J10&w*VT!.91.+8ɒ(ݨ 55sk`(x\Yico߯;? [GWbZqn&TXqNDG,tEPeNЩc1 ρ.A*2u9j[{յ |R*¼fCp9S/Dt`TX"aP(a< GwXJzE?-=a/͠|"ˬ٨c&Ѡ''A|2s/.86u;fOKw>8]'s`x~6r WMu{^ M ͬTg-!㮤QR{oxMGKƴ!]*@rU H n$vMײ|ƝS&TdPgn@^u<~ga'5΃Ug\4SO P%| y'#CeҜ&gf Ql9Ж4,T^Vq&Hpɑ ts$&LXE3PEِτ)0@cJ0@0-ջ\~7_su:x"~31.;7y';o] ;YMq§63.SsNz@C=2M=t"ύ8xf d 5CgΤty@{G]A$ΪBKf2\ɔIrAY7VS<j2d7d :jG@}\ GGGk=2Աp2\ P=*! %Q-"4@ ?RC`PL`Ȑx0Q>QhSuf[ ^˸!GxLMLJ,c]_~v;C9Y8ky6 Sg\l1eZ\\142'a$9 qQN^PzaemI}=Ȗ.UT0K3 ,݀/!#MLC͛\'pD}@qS*ߢgi"2uU(#-8 QZ`? Qٰsy]#kԜ޿=sffeeWؙ)d@N 5͏s߆&`*(/!>MI)`jWH[oGy x%W}=sv v$`gJHDFGGיX]3Β5Z nsZGPd?K $)DEdi>!  Kl d4oW/|{WW'$&f3Z~}'|1~^b^"f. $Y~޿?=WFn|b_MW^J] t3'. W? 7C`aYMEvuɪHsuy;>K?s*I dxP:)CPüW)Sg5vP'B"&hKg$JlyY_PUۜ*A$ $vwCUY{e*)9- ;Au"0B2  _=N8^}u:?~35Ctsοvt.WfxZPz&͐ЅVC\{k)GPoI')@6Pe05~t#5TTJF`V]v3!qP5yZo៣CN flūd`8 twָQȀzs3`e AbTb4vCYd2f`+!+GkN-N; .Z Ofjdl[;:nAױ v$dlӌ[9[kBI -ɑ% 22xf.e:w&9Gc|ӀSn[g@{6debj8*55Z" yb[iqbdv >ܠcp~`rWx߆W[kJ,m6zQ1x.Y+kӓb޸:ںx+U@tyf?e1$gd`ˬ~I pP dHmuJ \Wf)8L"_^gR+mrv"ݿ{Ljb#rAIAyk4}AQ2g0˝ԌRQi2㝘$ݻs  ~Yz<bQ҄kfP"ʌ}Ix?L\u5?V)k08%% yG[MJ$],~1ʥגM]ݘEѢr<0Fm^k'D>ùfGҽ{(5˷n܅Dn޺c&}x&YlNg} %iu#N(]|>}rͨ4_5 db61e$T 0hʶkPt:TK*ӹg92]yqiKMyO A@i ir u'h1؟kg_7(ypCPઉO}j*b){l׳'oӀO`M9c{n mczBcĸ eNX'_҅ ]H]H<`2d{_\. se0NKzTy㹠LBc\(ZPXYq\L$R<_RϿ Y7x/Z ˾||!Vc*ӎοheɹe (/8f<;oBgrv*}Bѷz:Sϸh&ǓӔc@@uSRbВ3쒑 @^auO$EU:-ҡsƔ-l?]m5 ys_0!2T3=@_C9@'[O҂ AOf>qb40|>k/'Bl8 y Xkv|a  ><Qm3ޅH,gzN 9Be<I(I 5=/\~e$k%5]8Ռwuuqss/%  t(DE(37oYcEW<}3z:0#PhH&(nwl>,4Cis"*0I4ka1W[2o*D`C@k (d tBD-zWG8Mrǩf{( DfE`C!߷{PZ'g [f땠4ߌ@Q5V.-vB`7pEE܌ɱd'>=%I!;$l * eWr5둔6A4a̓hDci4qvZJ 6"!H2R~bẹ!ע0v:QB@Jo ̐2OuBׂrgjz.}!u0tjOw|@C_Ȁ/qt't9WR`?xdøJ`rВBǶyydfȢ 6sƛN 4.dCE, eҗ*Pev <7c>:6ʺKÐ +^H)d=5Z@vN"/Rk^oc2@[?nVجXk12a3+ P5sn Oȭ߇*bS L"s8@EavhIEɔS ӯr/r#61bky,ܷl@>sThI?_J&0}o~2֮c ]K_zZ{> 0H3 ePY1kFef,̰WD5Dn| \=I6kjn6Ɛ~g'Y-#W޾s73 k$)Mpf VF5Df0/LO3'zgזj mfv`mfl3ǶQWeYlAA *%Uc}}>07*3 ؓTAr)9ヌ$J3Myػ_dk  9UB oAطPSʵi8OwW'0{፲-s;Lp֛vL:]fs}d,@a0P1WܧlYǙ3>[^™O p;&{\ Bpfj@ʘ;F(^l.e6 Gt5nH*WQ"aO噿hix,]{'ֲ=akks)\؀ e0_^S-k䂄g}TZ`^tam\wvkla?K@[c`3 N)KgU*FZ $64ͰS4Vaϰ|F CwdQKeh=U*\޹z 7:Z lg+׿?wiy#pJ۱838_NP y+__ {/^gs?퇣w/Enj׶iDִ8LUN"@ ^ y>M+9kww#-~ȕi"FPi@ɹHcgzm'y[N>Lo݀EA^2uk#-l')786EFxH C/ tJ ">`a2;o~+~i}~1ˌ{ b :.żwkKsar 4L&V ^νN0|lߤ\e%S.n @fF1$UJֶ R5 Qpz<3&PAL΍j+әg6cɌg T.G'R4´ aM4N`ك[[== V>jpGA s~ (*aMnU&өP |n KV53sʹLs], SJ$."H1gDGY Oy*cWBy<\wKqWQ!Yl{C=f|9ʅKSWOcz⫔sL6YB+RrJUw.hT.($ Dw֒1gX+q WJD}}`[Lm/UU`؋(YYylATL\w+ )<5(_~(A0tM;>Z-:U_f";q{7M ~%/C]lpG*Z;zLOF^>w>dTɗRb3 2D՚GVYE 9xv$WR`wd3d"4p ~{XiL#ΓAOO#,.7A3טeYeڲ] օw^̫NyD)i|br'cHP.81m;Xvx*%~I8[2@rC % )랒WYRSC A֟ '~79p~qi1scL0lmdNm 3y.Gt/3,8/ @02h)=-!.,rIȠ lƈ6X/E*t̩NinVZe!Ê;$/Dq>Djm _bVHZAto?Q0nvưtA"gJä҄:2>9>g:CƯUC 7W>4΍|Ǚ+s::ӯ8_~ݛ?cwn,L<ʲRm-X!.PM 5R{dR[RCyiJk 4= =z(JCRȟC R 5&,O|2I3M [i@B!\ȑ @ Q2cyV=A/ӆpVd8{ѻd6 pwQO UN(X^^@@ <]H7PjX,g,A=9w!6";q k:埐m濜`a{w6ҏOi-2r 466H`+?!@M=`ӱ:{1#6rDQ˿K4%>kbf6op/vQ@NN3? -g 㪋-7Qn<5h+Aou'O& ztF7SluQc]>FkP-u/ޟ:نM d:o߸Ƭ:ۉAwJTQAR*tNŀ;e )|Z{=Olſ? O+ ܓE'sj+. l}(CxeXϿGHW q0sFcThrhkU c C5ubJH4{cE=ϠB1{@~k~(=T0k+nx@,H:p(;K9v:f-'2+ ?ѥym04{k[W;g6mys7yHS"`UU^۶%vJRXOG*HMccs׸} ^_YZ45Pa[ʙIܐM\mcZcu4M%ɬC=JRSemm8UGxP^`& ۅ~^gwW(Tرw3g9/߀Xkq+D4;U90ԝQls9C̡([*5x}{($yP@xxOAM=~f5>uQ\- lnss?|9e_#p:8%]#somۓol,OgwT[kA-1AC] &P d׀]cw=4;4)<;m *l5O%fXT;nޛIy'k˪}ev"L :h FPlٲlchH i)J .H0`魺}߲*<0!,DdDOwUes{L#7Mƕऔuh\;(qyk@N h safj*fPܭ`Ƥ"@2 dFǠQ`&J .֐&Ff*ܽ{s$#Ub($}g.# Lm-4*>}p>~355$H+0"R(:v1%\^cuf>>8b ܾ&> #7BdKӬ"zTSav g5M:kر s萬JA> n axRLvy ds*j ֬uYJQOjpd6p 7^{#qR"ӝ:A&ȋ,& ҥcj/k!dܕsO< q,.,:AiJRfy?qo< EztVd+Iuٻ1 "DD7$˞gf~W;7EQ}P;ij $(ן!s>30֩kѲ=yV2ȡ$Jd b÷ v,%+Z2U4kdZ:hͺp5k[/z)En)+Or\"ƐFJf2% WH^#$xSD#u=Koܳ$$j٠ D>M[JƘm ^{q<[Edoʿd$It͹ lnm+A~aKkهH^%$zR?;İV$++ >GΡ:c>z `~Aլcӕ`.>bOk1qt :wYSL !(ɻ_xRm>^Y߁F]oN}Ē#WU/e(w܀)uԟƟI|H~|-(/NjQZVAo{#Lc{ρ,9:4&?ȴ 5sPch ZO\/ =}yZZa{ 󷌽 9Y͜Rc9RvS{ m-8~ay)LDR"95k|ynx˃\1HB7,DUB8df^z|_-3z=2rqnΆ/Ua5~e51?% KRވ d8:`->׮Cu敪q,$ 4Y9h5_ ʼn~Gz #P^P;5'eBgDASW 4@^GjC_[6 HC$ kN(/XчAFf }-3 \ x? p0z R\n}[a _<7Id8+C[ED"y v !!?th4vo, _ A2!&鰺8KJx `5eK2Ț}~>r :J ח!%Uy=n59! t((E>Y:@PŲmg,K{+$ ărncc.3;a{a+BAI\P$1c9 UU" @W Xiӏ58,'x1Adqӂ'@920ԏ^[8<<Inb*>)JҨJEft$,/==dN(0l,i$$)zl3 Ԍu^ z{_Y#4&$bM*sVs h9`>2Jki3*شstĎEc?1O ##9RGaA\L̯D*Qg־{-LH⸾Ԓr25sO3@Rwk!#R߻.0,٠^I GpLH/-Oɟ"'~{?> ׿_1ޥužT\l@0Q҃Qr9$/_Yh0AĖc= 3^}dd(<ܳݛo`ft,XZ)_VkV}R4?O6{-fH[&>|4@G-J,GCK֗cG=ruK -[g…+O9l`;mE<tӏ9t;Ĭ:uO[% Eh}g_tְO9P Z tYJH/׹wϫ3v\`OU5V⽂-TQ~X^;;9 r`QH!O [}Q4Lv ;g3vR#H?`QSDD_iXO5` C׌TbG Fs6tX<~.#Ks4H0q}x EqfLx\%() ]VAeExMTR4P$88-5SM"5dHZ~c{I& ¾R3DK3MtOkX5$y*9}@IDAT~#濓&͍cFXҎUR2zi??kҜF?`  ^R?<//:muv|nvn{60*6 P> 0UM8>.Ö-  >Bʣu;!<~$ n~+ (q+PEs Ƒ4Bj 0of&B+#T>"{oMp߻0)]/._D"n%\{[κ<5<j'1%:;P8- H Y|ۛp߲eι2bkƐJͼFg16 o.<$.TIl$!!Tm(-,kx~smAl>s)+E|AAI'(7yccǙ! .@a#P CSEaFीIv?Ŕ00v'!qQ&2ׅY49 11CWA`\<506^Gok҆;D,`@!Aw`˶MAc;,-̑JZ?Y`{|Av`rpg,kCh ,*w߻~e;1QMw d+8w FF{BJk -[iv@uB5Y6{d=bC쮮{o\ -ʐ70&!o"c &w~;̓"4U%P)`?fp Ȫkt !%L':B&9K-2cY*)463>*r%"!+pQ+հő2'h$D9k&֑r ͐{W_Jx '|BcgGu:' 5;^?Or}<9 G +' =#̱cq 38,?sBlraɔ8u9gH`=9}0]o$]8ǹ[dFPN҆Zi֨HT˜v܊ XJܓ8ǯbȎ ٿ]N&UP.u lA1/oScp0*w>^ OJ!%Tqcc7CJ׀x8)uɲVv_``6~3O$Moy'J,'g/ŖkHv5oe-D TxM+g S҅⥋ŏ~(WYzS""I /bl9z5SaESAnjwtDB/[X (Ođ|eLk${J&+W/V(UĈyu=62ԾZUnr=o} >̮mߨx:QSÚ?J6ߑGYwB- ٗQ)G.VmSLm{> P rGc@&Gb ϳNGOC[p/c K (igͮ,BZ;2w?eW5Q;m gn\ 9XȮa=h1l4Dx=M1sspp +*dT/~;Yx[r=ѯgV8$3> ݬwkL A!2OUPBWOI VORpNpϸV3*$7II H=^7>x|"$DSW\Ťp.ф2,o𙞧^Ms*[fvCF)Fu଍%{wF[tJp y` C^ ez7t|?w6>x.9T/i47?p'iT8.)P*1|U5,-Сdaf&SvvT:b9c{{s֘Si҂r`S?iUF@gO@myŢNHb7"P֩90|ȇ_L~(fC`:lKR[#7pvY Kx@2l޳L7HP$ {P\ gXOfui)LL<4p= &3cvaff6W_"':Fw)07W8Џb{k'4[ Ag?jI_<݉:TjL2c.0v<*:f @F痡g5n-o ,##Q֫~קdO 6k}b@8T0kNf fl>ŗ#Z }d5ݸ'&P@L2`Q/c_ǛDs]H*<~"I[%ګSc9CҡNdcNvC j-YcfU2Tա^Ms`2fP u3(,ɦm" w@#ew H6+N<9NY9r effh[ J̨6Y%p\dcp@a`WU !)ivLY,U,pY@[i0'>`>1+c Q9jZ~1U㾼}o ZO 筙5Uq -T?#c^ HJSavvJNuyf!c&_⚛ ]3^՜ e50om'+8N9C.Ox݇^p,seAÐg߻%1X=<fi- Gz%J<+ 76\+b'2⏸ \$Df%UXBc{!>,+H2&S#KUƳ ] PaTic5w63Xrl6IƋs8K09a'H#U[ֱ?@lr輚6xwdHc= $BQcI zZ"!bL>d/0  HVu@4A"i<15X ,D8kZXcn@Cfզx,cAs\J/^-P9]h`K渰f|Hզ%lym$O|P #GqG #x՗NWg/{>x0 ۋt76F/54H? cM3`[m,W=1 !gG_w10U.aJZ2a ~y8Z@Av {SFQ ͖*LX_Hop-{i*Gwe1:1PZ Kd{ל l9\\K} E@iP7W fLU-.:P&% ƈgɤN^a1#˾ 4Jŷ`q7ipaRt jH DM_qyWwފ@YBi4o=&5Д%c0ÿƀD'kaɩGPvj $Pd2(RfZIp XڹBHr. SYPj]22I$ZM{pEfqn G xZ{0o6dOPX|H<]PLVwbq^hp0!;Kr^;fLыðx<8ƶp4!|h,B,yO2EixO߽MUI2t~ԥv05k,:8ee#P5Z)@pk^3ZNkAeCp8 g"1FCFt9sL3=hR>sY 2K=Y͟<ހ˨^g4c (,H>ffXQq$\%"@ qIXǯ5Eu!`yĵgI9Kp\ gF KhqjrIc ȔSǒ(qjt9z]$ ]Ǯ? {*Fj;fDB2Sϳe1 X@}{VlN HƦd5/ئ 3)Ndғernq~uKQrOkP4 B]3 ڕY'P FP@5C-6H.ѠANɶz{&0T:<7x.-\y˵Nߋ"In%E=Ϛc<*eԢu1r8(a#D?/gkr G"H«+K!Ӓ/al- gh\n57o{Ϊ<z2A:qJF/=PbY* P5;d"<3kzMEUڥ a1Jf{DCjZ5ÅWİ{*Fu>׹aߗ2/fѝ\,BSCW)bw HecV˳=P|@ڮ-P;U@r@R R(vQdدc,]Gg- )dwyz(YmDokC[Q6^tcoJ&ru-|\z%\8tm251.DAxCPE_ P,!1޺nϦk(Jf!F#?' bgR:;s7$&|tYw +Oαj%i  ' S"݅g8`tBvm4N .ׂbv3 B5wubwy9dkRZtgG9=^#q Gõǵys% ٠R@$${45f]_7寄SAI :c @1W顪do>q2"ևi?먹QP[$>tiGn)hqdJɁAL8%-΍ciqa:kYlD&ƯtY![ĎS# 3yxyv( {Vq y|e̡b.zgN up6tY@lOnf_id@ue\,g}.YcR=zceg$*ƠZEe3N2T$<~.\l?Sُg;;["{|:*|ze^΀bPj}Gْ3K%n=MMEBlÉp;;?cWa # FO0ק__~R";f([Gf ,3A|@ /A`{$O  d4I &kfm|Wɚ㊲Ƙ!Phyb`ۇq   FBJ2ie?P5f37 ͐[HA0(Tlh[ʩ5ȚAY;O^ V,T;P(>^o0EUQZ:CY[YfC1aUBP^B|>KfcxnfAŘ.p^cA%%fxK *,5 ud)Zck2 59ZΩ(^Q<8l)Ԡ֝ș7P`jt T$FZF^ 9T@h Z + LyA)ydfϳ/Dž?0aVY"^$[hӮ IqC$?R"J@&[6a#RImB^e@c븵UZ=`dA1{YN E rmVӺV ]y 2J!a1 K)f/^vԣi2.2099^*ꦆ7z% Fpn˹*|;i 3Q5`TgRRZ#5cKyIO^ cÃP\Lʅ]p GX_dl&,M>.2HP>_ـqXzlé҄y &WyB*~p?K*e~dr´oՏ]M܋923J XE $g/s7*>OQ36 ?QX fGž~RNoBY㮣B1؋siNNǞLTGǀg/nZǜP QW=_¿a"v[?b5sQ e,*|>Kf%t,9b?!H80Pe(e= :KGy6WojnLNA@9H9iJ6xVn\ CCB/ ?7߹F* D{vĨ0RTEW;/|! #P?y #P?K{ {GHR W2l&`̐i\,Cg Թ`]e r@"[f`ih3Ze͞zYudȸ5a[O$ȶn|f|p~Hn%2"l-10XnoXE-6VP]{uڜS·_׈a|㇨[ogzDf5MA>0x.ѺO>;[ Gydl,Ve9#HHv^Dr|l} ckq~ Ic vۻQ=#Jj J+jnߤwqxohF2D̻=?.H^#֎W$d;s^Ufl˶4? !xwXH 'F? s4v:E3 Y>!)A5!r><Y:R(Ts.MMO$ik_F4pd'67tUP9WMns8wBx))?;JHWTick ]A ^$Xp?2|!j. L(V%a)J3pA 1SH͆peE_:J&\zpC3Bvl>bǽ/¬llUw/IR(҆(I}!Q}IeO#f)aK7@= >2YS#@ qIUA)/L79jP)JU HO<A0ePUO QPV8o>4`3כ ~ cM}6T=7P/0iSS#¸ ?.^ [ ʸ*rƙ3=ʆؕJdŧ\,q*)3KϘ$ƫ%is(fC13CsM#b BE/<[2˨z#ȼ؁#!]RT A躳$U gZ1B[7q:iG1>5~̚4-N%Ʊ53\ORZ5<[J"%Yi`@4 `"#}Xle M! 0CYܿT78UYң m[=Ya\A՗’D/ uTءmIhq^U`݆ώ јfz }m=L̇|0{?| YY38yϻHc\.t(amrш02"-yJLüeJ+v) y~n +v?y `LOg$&xLX(67op{J~P`.s A5oog k5E:+g ~s?G/T3 #(I(_@/Rwi?"KF-^=x@ ')SznYq#}{c`0Ԡn̾)=nG/PJUI{&<*͋z:,}7+i-ʈ8 Gn>g r5r)ko_pzg3&z//-` pdp dg,[mEZeΞ uRAV0xo%0!mCKhQ Zwd5$won̅]jx@lcizcz`$S5z᲎ҍ!'w{h[ ޢ|td, BnѠ}|4+g44TcFA oޣcJ,|lAY -\dTH1^ʍ@";(N8bODZr8f֭@$)jl9Tsrib2!^}7/`=}}};Ȏ;e Pt}L_ w$$cY#}ncܟ<^fwJZ@KtgU0r <_ːbSbccb+9s1)3+Pj窺S td/}+}"XD>:UМ*j3Mp+9AM:{2$AC] d>ͼώhTލSu]L3 !K(*$pdʊN{Zme- Ƀζ_|q;˃\Kq0n@8ndsB?{KoӟGw J.2f/Ww 47AP VCNHBfX̨ j<Hz#}8!l8 7 } 4/%̐KEwgWlh e~&xM&pυ(;,!@6@.SRէ{Ci5@:ܮ%1::#m@xaj2z3&\/\#8+F,2Z|PO Y4"[5O%IYͪ j ΠoC=u;º0x&~z[5 S)eHJYsn*Vs#:9,ǚ{")3 ,Y (dfƧQ8s;ol#7dHe n̏J"vtn#Gkc`!Iݨ(Ht3X9ao u ߖ 6Nϝ> ۷2UF[(`*BOZ6W('4܄ Ă TQn@t >\KXַvd;]]dڑJk|/Ekz ~UKk8NVP E9nK\%diYBĊYs9"d!Gڊdmͧg-9o51#NK1q=昇I92 } zi {M3TA|f9C/~8|{? Pb.TS 2y5rmI> r$엄'96``>f,aF"SCHp;|_9]DH=%KƐ% PA?] AQ a }怺X$$+$ *ܡ$vF˅5utS(.N|/ebNaɼ)[քu+OߜT3幙`#U)/A}n;Zw';O{BR& y&'&,%0Jt.%Ji,?'ʜ99PQ_eCK+&m |̡rb vʳdF1{/Wꏺ&" 1 ߹uT;I8OK!W{ 4K|q]c:yuᘱp33&.ӌE4q-xI@Ta:4]]JG7 1Uv, '=I1?{@) Y>¹͛a,S@֛oPu|ҔQT'pܩ\(E#uL/3ձ {-tk* Φ7on 7_ -t%SC?=X ]*%`_bғT;>,-C |aU*KanvjnQܯ+#k-csi`~OCWȑ kh؄{NT'#>|,5v@IDAT" XsLM %cs=RAR-gܿ0 s9!T& _{uK<'Bx5 \D@EA/<^_ò5RL矏%_+WeGNVyn%0s6jۄ݁̑ܓq^ *ge nb+na5y y.⯫CqsFGiP\:''`gdSi9`7*\X(Lq?,)Uq?U>x=$\db.ɱ*9P Tx7y֚]pWwW^jJpB=W?~[0@Aq]E]{(qOS? T2gFTAk7&) 0tt+5=>AC<Ū3QwoMT pHBDPDA.-pnF qj:Y)޳ ȤRf1 _*"L\qZZ]_bh,QI@oRrAzM}ߓ!馮,.SD8wq5b4~8|׶ZZ=Zj0kC!O&ݝ8SqQ+T^g 5zXiٹi5~w L(  [;{dmvE@^|%kkFa!JX!(nj0*L6aH&6K9CZЁü2ud3!,I(kBFs{ki}5ǥԕ(=I2ܓ3`@N=uԊ>J82ty@=9HT`+cT事q?o^YnTDB}#k  wut C*s jFz;fhYrmPS.p#.#s b6_-Hز6`1o*ɖ 8`q[o8PcUKp]g̀@R$D)f!>MFCFõo{m2Ij.F[7o;݉]^H s M % T!٢T;vdLs^ =Ab;Ou G1E?s<zQ|T9Od7K0DN&A` CyY6S ^![sR+*f A.s-/[̨{b)𶒳+' wׇ qŌj9ރ!l3@`Zۧ#DHxjI"c-9k֛IP#&^$ܧ,iYSP/*M 1 teqLrzՔe^IG۲} >%?UiL?DiK3[zAhkW}}HQ?o:kw] 'ruf9F:7%\IrL|I: > \7qQlP >5-y=M). ܲ,]oד|TH0CS9>d{9syh}V]נ༎rjX&z MK!>쾳\܆i<ChPM r]v|iDyS>h9$7;܋y柬Y~Y爱Wb^I?;žͨjWu %2% ۖ5*G"sB՜%UH PinMhXb?,%⫽$ TgŮ*|&IBޘA@t}'6&j#liG*Op18k. 64 K $8j4#[4L@hʷ.rm**vKF5`[9\۹T g1^"5:#AWyJJ>C^,c &P#?Kskzd[P:eJ Č䙿ETG6qm}16kOv7& jM^  *,[!K:5kwr1?+ YΛ2V]?ޮQ#i9[0<˱m X/dy@#~`A[P9-5Q*µ ! !XĹJ(>:HBy1)G1'\׳Rz AlCӲ/ߚ0,7:Y}D sŮ.b6ERWyRo^+Ylpcbr[c`^r?uoWb6޿+ 0T$-Q01)az] +Piuvb?ؗBO2v {,f%,bCYW܃|@Z*)؏49FSBU4d9Q*Cc`@̞|bSxJSVNB6Iv=:4iK܄2 $s~>cA!%aj'tR[Eƶ|;]j 1|HPjpǥoxeo볐̭C&BKg?OK?kk} a #=Oz~eo}$[׿S&j&G>d%/DNcL i`hx8<3da u1u_CXOǨ^`]'0lqS \.0@. ی`ј-Dʧ^2/c+D ?[.Z+(:z8%fBO>\B0qlkuPQnkԠ2z_{ جl]2%Y^6=;gA<66mϨ$%3^tB2ann`9 7 荐*?a$iUp3>*1T#p1 7@#(ͧffT$VsH^5 Xm{e{ű#dPLOEp%HIn8J #*Z$ٸ#=& [ý`r[l .4L\\=?GjYOsj<%N1Bh505~tpx";TV'`C jbXk!˹UڪPc(>~1ݥCr>'1Karʴ+$ޣIQo=2J0=Ƚ?˾-`2β|㺪K 乷'KX$9i1E yh ,'Zmsl&O>Ax)guɾ @ KL=@:eyA$H )If/`!'8(]%+I3(Qsî*\G}G>B2?qlv(X2*=D!SCfvJjZt5sLUtNqZokoӐUFPg, dssOQ$p*wh`f_u{FVN@0).`7a2V'y 8![,bQr>?9;BhVd'<'MߪʴJe\(cYTJ ?scv' Fhp %A*EvN8dOZYʍlךgG]L31J\C5Q=0=3n߽ rհ#ޤTf|r2эTUN="c{paZﱤ\|\{e(A8d%gx'uTUOHJ'- W1ncI{ isfrQL1QuT y9L߮&1|KPv]#}s/yiF?#7pG೟lZ\Kv0\Qek}\G@T[iE^@`B-f OyxR/NF.M6Ǭd Ao`DbU{ %|{<=';'  xQ1%$jB#u+u+'xԬj 6ɀ Vb\J$p$Gs`h(\%@m /]erʢ~03(^ڠH.4{ȋ,/DbZeQ/> ti~*ܹy20!. Y! Hz%, 1֐3d+]OA2ց)RIP]PY x&tP9˜ @5A-qHp*YYX,; fqQ\n֩KfRvF@z`fO!SK" 4  ݻbf,*\r;3c.=4 )9s\ @44|1*X T R!h2c@JwO pv8U $jcAsy)Ǭi9-i`*ݜ&a3GWT3n|@cͱ;{hd| 9=:k:F;MɎ4ʏ %Kvxz?B| (:⏠7'fq !Pa`jFhƼ{DE47;>i0low@2ow !N) 1f׳N.µ98kʮK$%+7A5s'TLoC*Qri`e-J<KpgĦ܂M/jJ}[2HBϲi \Cgwafz*'xeŮx|e1NeiTsWPD]҃zJ؄7)1h+IΒyy=sCv5Z0¼/H va>|xjn%YbKojII0Ύu `33809L?S< U+!O$,Z{)ՔZ/| 3BR^ *GmP¤CagYlP$ 9"kե߲DKl8,>,5x$p G/oӟ\co#S*@a@8vG vO!ݏ|?zt6 ]3#.ؖ$nn" @a HN+J;kd_ⱓ@ɚEABP`0OfU 4H\(IUXM$øP}Yhcɬ 7YU Mq~x~^P]CWvKfg#s4 ա Pa )}B泅]Fs>f-aX%>r7­wEX%hb¥g`0.{$E|M8kC="% vqw`dv@zP(T 3j}wܡ9ZW Hc6.x H2E2-ˢ%Ked"  ;i'LOA@t8}u_usdS!hc]b#yJc,D>PL^5`;Dz߫7"w8`~ 4UP]4pO6yZ Y>T** / L- nz&hZ$V2,$m]u'0H d)(q}m4?9ר\'P@HОHEov0 HOKƓه _N8o6ӷ>{ny~!k}ÜBm>sqNIъA2aĞ¿"*Am;9} :i>&mCAfb:d' [%8ClAndPdY}8(!hsc +Q TFZ)qEƝ݃#gj}`$Zt7 Ӂ֮-`5,`. ]vzX krœD4k5I1&vp=mgM FRH!- ŝ{l-Gm/qt^RtKYMRA:kJ.Y.AQ&p>LC!~UR8VeW㄂tIs]D2[@Q3<ĘӉG#Eg};ϓNEשX*Mp}iGbBs} _02iӧ*< YY__>ƸW3}N> ]gΑ#{OV3n HCH0:c!Ad& YtAcZ#\yQ_b mP\@5bl{ /}'Z-Ĺ5\@6~+0q`U 3-4N= ;.7favG CiGpdkf=Ź|` Џd` :&1T˔`=zBF~׬{&pc:$A$4*[#1 FPQpi@r\4~Yௌi|(x{g #`! L =v>qDs55$40,Cr?\*X1%pJDHTQghrs1ue#\y yFP!J ى(fQ7TC[RPbqoma}㞞 Q)0!îUlaKZZek/ƚ1frXqɚ yfp6ꃡԻ5Ƃ]9O jkK$睥xv?}VT$%e$bU)h~z_ýIYbzHi>pD#klPDbGcERglkH}/i_^2y/м{>gY Bnx&XA5J*B@ੱ3a9kJ^r/~y7 Gs~GION>#替_G_o;~oVJlj|L/ 7 tǽLZ;FREz*پ*@֞F9 fzQNPJId']9u.2(+,Po m@SQV#SY G5̝O9y"l7-_!PXNJ8f"[ۋ7<$OE-H/<!F' tX_|)\C..VH(V`: %ıq-f-/mWLB;%+?0szx֩fYh $X{zX{!\x7ΰõ _%0 /Pq8|$B7>ir25פؗm^<d l 6aЁR<@m8<$vv/^X@m"Jur*p*e3V|"Z2NF{$dw )ZD36e>rNdI&l/YA}<X5O;_C'昝:BH%!^E:%ܯv\Տ8 ,wq% W?#9H)uHr=9lwg*z~1z(cxeLte/,pvkғZ*>da#d!|N?=FwoH^`Ze.o}wS 덚2H#{!0佩8-DR, N9̊"Aڜ'Ӝ\+`:^'^,ۨcݯox 29JW+Վ!.z!C(4gRi'*kyl=Pd?k*?Q%O1TT`d̅X$QVṲIƁi:g4̋iJ.T)E2s/aA;e\.=|:%/\q1$"*,(pRLEc¨ p ÿΡdžg=\sń爪Qԝjg]2FIH i8(bPsDD(: =}myiܳI|nj٬=Sf5XKF &d$}"FP$.˹sxz"!VQ 88 ^<7C;3^tKy{ŵg$FL>:N*Bj8- NOxbl"_~?$;{ɽ&q@5?#;͏4Gx}{wͯtANyo:2xL80cco»|aG6.-JccSK/ɨXDm Ȍ\$= om@ Dɪ-cKk=VG8A36%'GdKHF֜k6L0.Lt?YV@ cfxcy osa*L]y!ܛ{v'X.!bưlT `,=)ϸ&wBr] :{6zA(--a){I>u C&պaAMsfU@_^m`Y.yo; 9T!o_sy׸Foxm[Ɖ̐i8Eb+; /_K3O>22ObEٿ1-h3"IafΠ\}Y:~\c'f fT08T(E>`AMèP@@a"<7y93MK &si()p8~ȁ9\ >ۀc`BDe+vP1Mƾ]tU5=H}}/kŰY qԬz,5VJdBO#> 43r*em?-cur>2hݿʔ}1싞R7]"S;Ɉͺ.7kU$RKʹ7h44Kžn@1yqQ[6z+`N{ʺv9HB:V۱|LּTUS9 .Bu Adl[zڙr-ŚepofBE?%)1gQMvv4=d7GR~O8NVδ^a>(p5Ev~}fۀ XYXк5RRq&;c``8|d30y9<08m:]*+ O(M*`V)^ΙU08yFa,頠dh㊒8n(skUhR" ed+r(A={._wLjdXv=o{N/IvA,>|xQpʍ8 }+W:&)/̖I}rϟѾv:%XЇR>#,CR00d0:iҪTN|YB Jd+J.GUy3uJmE#9Ǩ _ $>\}U84k͚*-W[3yI~t1V{Y_-~~hqFeY@ {r yv<&KmqY [kn^U3P2VJJ 1?}!'`y,C٩-N0ZV4c{[I9Rd2n4`?1n}OM}ka߅AkdOxa}`Df퐵PZr\2dX3WW@;1ۨB0˼/JȀ~7LLu zS/4+Tznyۼ:Fde^ u;Bu ~;ޖ8 PZX. SƬ,g kCr!I UV1ezNpKd$1o1@J>2Q əA(Ou%{f,a*pfda8n,Γ$g3ʾc3vz=l?8ABE@70: ags rt ={dj*Q gg"k+ u:⠂kA9,DSs8qmsySG(($}iK#gυiӌ"W@gݚ?AYU&ކof*CzHkOV(C!x+-50ח^zM*P4_lP#Y}K,Y 1īP&xuY ٵĖar {#/B/l;'$b$-6׭z arՙ?*gwz'* Ulnb(/blZ3|,u|r,,p|,$[#{I.!IQ:k̿~z/4*(z]8wwI͏4GC0MC0IK?v㍟|KgO~o~kcyW.^l~9|s.\ <, oKn-.Y2%%Yj(Y`ILDPH@Hp Qa3A @vXɨ5ߺFi{f PjPVnA` \t#,,>?CFDTRz~VWd:)^ɀ^z;G"JPQ 4:ƽ'd%%:P(h:i?[z7'R dx L&MFGx*,Y;?^[.g~ϐurIQ,pn'd`\plB(4hQkiKOjԷ|\KJSvO"ŎA5-3uX"gj r xX봿.Bz$إWVSxcy3y'ǚ*Uڨu& p֌cHq_ P^qؐD`nYc33PAI`Ҡ5v Gk m![\x8?4ɔ)X5c-)֜z" I\&q%7!HCŁAZsE9lŕ,=@ c |ׇ"5G1rly ksxiL͜Tp"J} =&0@FIYPwuAfJ6ٮџYz:\3 Dc|עs2%_z/#^K+9]Ba@YTAd() n`> ku0s@XL_):.lm$zZۯAŕ-31.g (4/Aй" Ʋ59|h;-2v=4ˣ,Q$9֗=3ˋ=hgg8_\ku֜f5g=14e cH.{Jl>lPJ3u -YXa)ᣧ& .$*H7yoؚu?yۜN "t8{,y8#mh@s~TF2!uf߾w5/OGw G!PcC('K wEx.NLOF0 TemS3E[+4 D7]+#VԕPlκG}M@IDATW ATq>${+fh^|`#Ma-2?:2VonHV j:%tr!3Tz" 0Bm!ãa慫1Ӭ׃A!I:/-?fbY .t#cJJZ*OC227 #a{2<-N $31+7(PPgKAk-\87P,,,3g+ތv={xv/&=`N`(\ _%k5)73όY4. l(L=.$A~_'gpJ?'~O|V}AT׹' >{˿0zB'+1@ k/Z"ݿ 8Hw(78׏ QǞ"`vfoULryddf,k1_Aы2C98t /P BjcMn!s~T\XЧr캙~s>e4(k6o-HR*=QmE޶kI5o Bꇵ>v+٣D=fOZ׮<}/dU}iJE\Ze~w'hAak=ΪCz$ R ޯuҎQLx-1iLz;n}^2S')Qt"I>{vYS+kӀu2T[z ;;Tr y712#YҫQTc=NNr|x~L٣8٦!jݍja2V!1YB.녩FGy>q~"C譒ɝS#IZЍ`r5ȹZԽxpccLZEuU% U@5mRfot߇Tc~mȡ|q6MwhG{֡] pB$ly%6 ą$9CDc>Gr#ób,g-'F/=a 'h6@p o">k,ETb;HŵFXXYapm*]W׌F  VS{?x{n|<ʮ6JK|&!<$-adxèDxXFgHg{A^N>L#T|fy/}ln,=R)wL`*wC#{7p2>u s6FQdkJu}dlE0p3fI~Mڛ99f<:ؘa0 ',&~VfkJ]8@ֽMG 3+(HR{B2ύd)Ⱥ ;82 h!zXm~DFQu[|Lb'ގ,uRR'*Fh3/@ۂ !4ҘguVviŅhrŀaw9Ld3[u)&0KY=AV\ȱ6fɜ߅`5a&kE@`ys% bW羿cvnLfi\}[ @-iQN!lQZl*LG4{l}Z*3>)?/ ~ IZЃ %"ĎQxpDϚT>(??]ʋ l;DbM)e:gX!{ ҆Ba2$1![|HL hsqJDg? y6)%@qX)!cbRy%vh@ 5 [\KRPO:0Fg~L^'k׮!]IdcDj;^ t˭6"ůU0Ie b DK#'ؘIp /{Ok/2Mi" phTI'hPFU ٞȍ`' 6H"{]$}JGH;Ɏ ݅` ٓc P_53W.d=}$5΍2k֤vH4>rG;BpܽXmo)[}LY gH YZ_k> CgYGܓ{,sYʡ8HBJRXeV6Gk^+ji0k` J2c^mo)Bqm )5dst8 LI XQ~0&sCv X[x؅g{{%T'\? ?V֣jַqvt%ͺmc}AI:ehtas 3VβrNV m Od3B;xtry2IK!5lgyE?-*ƧʣTYQ3X ]JAJY 2%F 9FDPDOboucd!׏ gΞc>T@SՏig*|5~/l#$>l3ּޏ ʯlb66U-/Tu2w} ;nFQ &۔*(l?C֔lv lW/y̽ yzZj(l$PƫږR|SO3M#zIc3g!5&ccp (#!QF-$2R2?2[t~dE zܿKۯ՘u[%3 x[絯^{&Ȏ Ǚ!CWMJ@fFLz6^0}{y=d F13OՍ|VBTf,}@Zk呭k&Bdזwó+i+}7E 0hQh'8w-9oSxCܳh_C q{xO.X{:N8i5^8ۖ1gpXD*8%kQ <$[tYa 3g:Úe߱_i@PF@٫ʨBrn+dQ$h}긩I4܁$Mߑ$g "zgj6)=BRFR{Ǭ8gSb}T-)˖S-.sέ!~1mJՐGvj*5뵕R;2 csXKEQx֎[ٵ>v9(s~YLx&,si[Օe:t3(PO"I*#azz<\<>lax~z :2*FCi~FEW̓AePݜ*llylb|+[N_;:hppҚ_F%Ϟ>DA˯}:9y LOadڸ4p. X>$lEe ,%JuVrt@˨J`.|[: $̼t0xwߊ-ɤ`P'.H!.TFq@l[l~ڀǷc3Lɩ9cAe7֨%=;x"-?zq={|'m ۹p?3Dxo[Л,'A!Q& eU9{a yc-TiJ ;c`qUb_ Ϟ@W9kK%XPlb:{p p@)ǜ^Ȥ䇔lb?>zQRD>7<^#=7dJ"p xh<b ?6{6\_t''e!px$% EN"Zsβf*?v ݶb+ -GVjmRv ( NY`T0&!^؉Y8kcϢ(l5IGs׮FP&}K]dZP $$STѐ 6ȒIVߺpdHOQ@N9ۓ{Dy>"HPf@+ӑi;ߡ P83ɬQ>u?UI@m@qvtFg\w 5~P?JI V]#fO'>pU3; L 6}uFs"s7 z EK;&y=iW*J  fgI@&Ͼv(V> `ZӍ'|䏹H>2ɼRxqgEZp֎Q`ȹ`{2ևXS$0>{6yU3k75[iӉ {FRDb0i?{X8Zwg ZKW؛B,I+p%Z['^|@$,s;af*#Ty=FՃ(뱄66znG[*_ogj D`η[cd z!Jmnkc SǶ>K/h4*|cnOǽr7O<}كlQ k%.,)+ )hƸ"`9#$,G ;%;S̿/U@^a~`gc'L+(Nq%15ߠTDr@GL,ZYZ o\9ʘ cY:v5>SBN%΢7v'NxKPڣLD;zwlx/` qecM᧥6>5C>-ٓLFe{8kJ"tA$@%/__͏4GC;MC;u ܓw (~뽷2olE2 (6Ï$Rlݲȉсl#@c03Jh@ںz3PdNd =d%f> j565]o}Hȯ(ڛ۞yW8ARuz!@0XyrU.Zr @RVl D\J,_I$ vd-UZMY '^Z <-)^`޶T)K(" !켠$3yB}=2Hia;P 1 gmwy3հ5%hMgX6N7bN0}:bKPx6(}m7ո&Vy=w%̄ˬ }WW*YV1on! aOTw' $sP&p")+> z@$l'<7C90 Ayp.HkYۧ],`Xcqt7 on`Թ&ki(23"kfeiD-&_JU 2l3ԁ =d jsK\4fg%K6Q~t0+DŽ*Ҕƍ?!\ n aljrY8(8#;0c֔t*;*d5}S ˼jRj<؏ L҈34K}UEF@O{ao#,2}&Ad>mh U' `@xM/pmMy@is/Ȋ-YST z,͇$kO=yzS0{F ɨ,j?vð ULU` yQc,_;( `h;a'tpA" kQO#z3o$*%MYd!v0ˣ-W̥>v+͓v v4z_~JPyWf(ZI5Z- @bllP<~}hd$SDy|b6bfԚ52ܹCyoJݛ?5sP83=ڭ%CO,s<@8ؤ- @ɑ) ridT`i-mdۑ'0kW&@LLeeֳDf {S~% >C )k}r^_}] 7Y[JtCpjPFBK:*;a<2Y֑qU2 ֌dɇۅ*E,G 'ă%+XPXYA Izq_DkR"ޑBͫ9]*q-ˀXr8XD~kp BT]P奘d1/EYgf51U94\Ez^-/*g; bsjIKf!G;vN4@.Ϻhg-$@b&Q17!(X4ЬquBRI =[dQZ}gN9] aӵ01d-1]Yz2=(M P|Y*"9"˦RM3Ւ;+Hz  3mLԍ"X㥙p qYY|0}#qOX{>BXJ1=%wMHwO <8]nL5:<9QfoXG׳|% Ms~C!egimH3Cd³gs]Er$r9º!9Y3ShDml+n⚵Ŀ[ZIJ ~E1^][Yj$N՗\h'שgDeB*9cm[*1:4r}-VhG"cɔ B_G N_6nAwwy2c߱ R6Ixr^Pޟ-%bNC- JUz3ʕ?s?_g>M84G?M?;s''գR YII$;P+d 5 7A?5w.Yɍms2!f4!F =TuF̊4R&Nvl:b`\xx 04/Y`g$z]G++͓5@r=z0 d oHZ S`()@c>]g^nͅ$}˱VKkTp;C==diFށJ:u} [gd 1Nܮ9Wp9U>Mj0Rd7^7b M(4T`HbBvXsɅǀ kP}2̹3*`2k4dZTBN}Wyp=p7%%Xk%J02 } .2uB<^ +"sok+f7;!%!Xǯ}3'X4{O ZzOI,ƍT-p9dM!`:6T}[FZQbE3-]U߳C{lFT%% ]D~iBfO=Wz#wy:$Ӌj?`Wl@ OG{5)#˱&! !;$"MFxʐ-i"S\;|5gx*kR܎bI]?l N~5qitfvJ^%2ۛ~y}:SW<ıAM;.Si "B%N閡d< Sflsu$RIfun?D5DyʙpWx:#.QrDDzi ^wqB&HܴqIlTT> b;BRo:!Ht1Wpn,T Gfo[>{m1f]z\]d."u IN:YXŌr3O$۫UũPѥq$X9J4;KZX >l*"m @f|7X#쁌>a ] 6UMqvQq[uY#Yt=hGdGd"sgn/h9$A;>jZ鄣yd rN{Cף㰵N].@6fK[kOș%"YbRd{~_z-L*I5cN]f@ A j1ؙ`'c,*µ_Tq @ν^5b_S}m;fh% */oD( PWE?W0an[Ck?mwQ/ZkG; !+dŶ& ۵ 8F`lGJ9lso#lPN :26M@K&1]\[`RԀip[rP 3tY;}{6. 2%V E *%/h×njuaոrdO|o= (d=d)1\Bp`6rkpe~eH o@b3a[]~Juuh0֯2p Pҵ4^)`!.|`@DvYJOz=hX)hLX_ Q2@d01|6j:;P>Vscb6SScuvP,< ŽP~#* vEְ= o w0 qGNB<t5 V>H h&=9kɸBWL?)G,0_N,I$dAr{$h郤C[YVDZx;3_(dJ+2}2D5סeFG'f/%Jw!ݺÚh2F Ji:K!ϟ _GeHkacd;$ˋXgHc@,m! zžD}ZFFCUр HۡSC/ {y!#dY=jp=ιg+8 ~5ېx2*=dCJR~zj6 P ERRb!9MsYCQ(p`UU"dg ]. U X $ajy4]^ȴs_>+9u5ǜg,W>oa_Es xf~#Ț) !lTY'VU.zXԤ)fZy/E 6kTNTXnK3gk-3_SH I0+bw-=$G=$]wRY^P%`$THjLsҐqW __~qJ9h@8hk>#+f I̜&$G@5[_NTNt~0sOLar ~NX%cT{aӴ{A$3Ke=/w|Q H< l)!JA:tԔ!-E={.*)c4L>y0,?=j2hkB b>,ץdXd d{i56=P2!3"8#`}P«o1^VZ_DYm/R]KW:ZiPhrL| ]'vWv R)Q{镗ECng!tx߹? /u-PVq"i 9 ;z$ Ȕ ۳ " g3 &cp>f X.g?2ɑZ/`Qoh/3^u&8lKp_h<꾰\F Z#UKGPOQڬuB Y5Yeکde| Lo`4̽WHp,[6E<}Qg_3d6=ՠAЫѝIA ׮:A׮IKN! |&:_;{ qt$,-SE?%1@Vz+*$(95oA )53=Xc]kx6XP+3FXM=~/OIIZvwWF}ٯΞ$ Gs>#$>“ۼ|o-|gVgBYdm +C%@lavOdE43&P^~# oV8w8Ѣ cx?l(1i{35Ԧu5f9\qxk$gFFcVG0dVD L/Ar,޶]f̢:S wE%` v Dڍ7|{O A.ɶ[j'kEmgg&&:R)b'iL>HR3畒B%MV/PI";KV;bP= ؞}(CG3<2Iy6%Q1S"@'y׌%;gKC YTmL f'㒀Tw D pg GØ#چSum$cph{BKw`6f@aVI@8(:$Mg5H%Sݐtրڻ[vB,.*"*ϪN?,<8F(/ mtÅKg7>o:~՛"Gs#Q&qQ}dG+-˺e㸞#.%] w"h39$@?x?!0& >͖Hh6mta6uХ9K as@w-R.''Bvv\):^%%?!N2}{{ &gsq!L/vAzzC`>,GPڅYzf 6l5dHćB\ӄF~=DA1<|pPz&UN\E[u@IE ?@o f fSy Ҹ=>/0y^"8`뼶AYPipAW& e+'047ȏ|hl:?k8rߐ gF2f]no^.n Pڬ}`C9y m|d[/uƁy fGnBH2F<)ߤ^'d )ղE^҅d͚`YFBJ_3ʟƪR?š6v$:,\b=1'dSx.q;3NIݯ9c-H@eO3`yi+Avb, !Z1~M2ofk|Ƽ[go:DN%Kn:=ͪR#kGC|[6;G!Zd-ePd4x>8C7.KBd3)X݅S$eP@r$*+h;쓉+H+R#J-!}J/f]E^6 ̊Y!FG |ݯi^k2 kA.`:HVG%/ϖ6O7x>>3b8*Xq/qݜ*"g\0KI1&*d-߷~ G_9! <.0ڏ1jq J-X{B}bMY9}60[]d]Hs}M]xqQ3>c3wD mVG0)zvYq/}aku `ކQS }CKZ\qZ/B^a~xچm`XC86(5+U$kd,JS`Vؒ׮E cS_e&u=|S$ Vx&Hm'dIRFqB&̲z*@3"lQqՉև 8'(QH^ljv(e ?dW3zS=@asv \$ミĩe/z\h6%$QQ^$Ͻ{|\"a)Vb%gpҵ0M`z }CC*$ja55(m+H2#ěcs+I2IQ~drۨkby?'Q|x:?_$D8V!4^UF#$>FݼՏo7g^'x[|NfX!@]zz53]!P_GepBX@&^!@-5 kp`v0~_c2k{.ǖ llІ&R]]=+] /A4Dޛ=I^y_feRYwUW6n HIѢMST|/ta##Lڦd),ږi6C%H0 0}_22F,r-G"A&w\0,c wڥR} 2s Hv F/&c =Q,P~BuC3EI',5jw1`ĠoCwjyLxt=1|-l!&sđ(c|^#87+5:٠@Up \CдM O3UIϕ0V&ZHdi9rWχ{{GG9|ޗ,c1$[y5rHh qEƇրLN~P pyi0Ō[%S&?j5ya`U#Tiqw*ad"O= ++?92B5L#e' L7(,ԡi`%!P>>v44cX 3WDu7=4 PpOb|6 AB/ -:{ Q-(Zܓ><@{`4o};~T/IM%ʪZ c-+zkXV\3b= ԉ'cYV xRT"v<H`ߍe@`?cW PHdkʵN Z< ށj7%݋eTZ@rFtҷgb,G}xb2|9MHx;}Ql.~fp3$eݫw# },⯣jqE},%*'a9,Y|SjuB)ܷPr ߜԘ,nK#kZ3ebt(AU# BoWŻWJn>m.<~wq6$۵F0KonE6nCgNЖP7F@0A`ev4fTQ{=08HƩ_.fduFΝ - fiẆ&PZkUGe$^@?F`|?=kȠW3de@&Y{>۱v{PF8'#A817f̴q`yE_7#!P`@$bv3Cd0C03H9~%^᏿g"v;BF~DP_ E1[fsC$t ^ k/LxQX .R =_w[}\XqfsƆlk\ dQ>f$%f$87C Нone7CB /fO Y@!$I2f$LƀJqhl{LH? ֘[(l7ii% BJR6>cˇrQq,So3(cfKPn`Y^L=:G|K9_|ElAϞlj CLGxd:hV i@/o^d{D^%)ϐ a׷Lu%-/7e f6[IG&O\Z>󩰊Cs~/X.9p`ЗAeKղN@P(Q jٛVcWSG%/WQb[!j)뀑b@ڌ|ӾH001P4*Q;34֬ջe h+9zn{g1G͡9֖VQ,Mc C5~ ^|5&Q P:wv@56 f;sq̝_#.8$PT,&ϵ<,N?l xK@51쫾OB6L!M Ȕ{\f~ PR"App^<Q}Y*C*}uL`C=|L7#Qv rPQP >ӿA.Qx3+-IfsM(yhZ Ãxh\A* Dc9ij-O\%h-c wlc)re-i4q,[QAlBY6ҁzl怇F05|tSǬ>D{jlt O|{G%Rba3\J螸g"<}~L43+ґã^zrB:6_4<3&yKs]3#$RbzӽĘ- `Q=_,-z;ߊO,{%ZVi,ws>} -ApJYP:ܷCR %G$ķ{Q !"G9DF9g6λ6pz! _+/^܏g ·nΎS./ǒͭո]utu}sҿ׀;G>_89_:}7W`_^X]^^% .^d'尼p-ހl@tB@Q OIУ.#2Q usD2ƛdvYa9A%d A!@Ö́u cev&,~rQ "%;pMd@2 lqRQ %#E'k$X KG;4GZ]^ό>~:/-LĠ{N\ rH0K| 5 hzlj^<|CYdId5~0?04-'PP%yݎ0j~o#dk.m2ax%^\Y !AyHG]/Z!9cfn1]Y ED|ж=67U60usH G@[/%ǐGJqڗ;&δSe';qc O|~e6 R2tYD)E+BHDC'l篝>x ӌ=ޏ_S:O U *$$ $ TDFR_% MO'2۳@RSJ=@}$`.6(RӆDR?mWn WϽ tmy* *6Q+"üI≖S}{GGח ?x##f3Sxl AU&o$5dɲe qfꕗ/1< JJdxQ4ҥ_GtoQ7IX"R1̵A5 ebhM@J5S)9`i{"AU^F<́xGdBme]-1k"K,ͭ!%%J`rG }A2V脠i/J fczόn)k;4Ѩ`gGxGW (Ctg["b4I6gC6475SNq;{|F@g up`J&;(57m/CElG\xܫE] iB  "*m3@qR3W.E5`vn&%*PQfkܯs%G6$tP|&>¥a٣67ܿQgG e< =}ː`(Q^lJGGs$]̮ Y 5+Oĵ\ao +GXFbKHYyGkmxZR" ˼D2w֢^`ʷ3M֘7pwA%!Ͼ!$YX3 J2>/giPŗ2EV;VIABMcNCР@@Lq 5rfAR6݇*UR c^pZBەA)v>^~HTK"{2(*7bd! _v|HT(UO0wVQV9˟$bnR~; ?x} o~;Pz0C aՈGI*! $v2M4gT&9KSeƹ<=ʣ8z E1_ o_c@)K& A1=M[Zβ>(7qi@[c"0m!<1iljÏE2R@'#9'Q™h})ib.ZlaOHDV=Khy)Ǽ{]!>R+ +~@m|)e <2#^ "]ҐX rî8z$jC%Tֿ/}aۆQE*w/D58@4Cw@)֬g!k0!t/D%%T"3zxh*=@ܞڤYmKM> [ [Qd-%<߲]@YjKC%8~lݹTo kiɇa.K#e4*ğaתL !oc}-Q(_{ʭG>rG>F u.D/'?^c2OB-d~UFd:I/Αɬ ve cښO0`9/M\db^zs1;df̭'eW5rU 9Jlu{ xfJm9@sdqMkDd\Z17_̋瀤pc{"iP MT2QOj@]ˀLW^O). jms'9W@z(;`k+8۹0rJd7`vGl(:l\Nr-qXА yLNZ9EGA6u܀l8`@eMs:Β,wȈZBqf C\t D`t4+F30[V@NX'N0)F.-Ɖ .^,d/9؅Z eZ(SO@sϟB`\]-{Gυ/V Zxޣ1j!,u!1TaPa^xvXve,n2p|ck2yϰ*q(q٠"Cgx[Y_a|pucu&wl&vn=Es@xl;Ⱥ $Q)P7ɼ'X 8G§Sy:t :%.(?v$(ۀ,>(QNbIxkw)kW F@?pd"!P'v}62*% S5u.@ߋ+H#KAp\LaM7-!ρJDƗ 3xZ<ؚ&c]r#5& Ad e6 - 'C@x;=97GEμj{WHQPCP4Ay2.P" (b >|5J^eF 27;vlc=)#Y*Ps4jrڌUx9d7Cs6={xjTiwyqa׳cHgG_XSYהKVc7-]X }{XLzyZyJ"e`)@3іlPZ^CU@gd,[kCs('Я#ߌrFr;.`5\ $sx. ĕD"qJQWcaOk 6CRWS$=Ǐ 9C[.ù@$iYWgVe_%A d7џr$˛$U4ܠlOr (Yxw8{2-|N֗DBuT5wb)~%nPϯ &׻Z&Acobi`RA&(>P:&lLa< Z^-ȰBvc֡5ʊ{R} ˆoo91dJ AӼN 8_IƍpY "dЯY 4?k@Q`E㴥y-'1oKl Xg9&Z;t)l :7˪D?E¿!9K˔(AR9v0Ozסe:9K-A86;غc>M`` vc<8;k idy w@ʞ*akyE<߶4 Zrvv 毙YI*͟I8%,Caqe pڈf #~ hdU4Se D_kUlY~o~dkoscZWI+rq>S7YQƳ?h䟑"u2ǘ=ּw7!kfbB$hO lecm.E ?&);׀cyY0Ĺ-D/L GA|eLezzHNZ8svF/gJ$GFSJx0܊.9EH׏'l.QbX=4hT} ϟE~Zs2v\0ϡ2;fV.cP, .Q@? H KUlurDɔ,h`K(Q ̴Sɾ "~q2*$`r/}L}Φ^c?\jId0I<˼aګjϢ<>v)idݏ;0ms{QB [\pK9sh)㣷D3duB?q sS$ל>ۅJD> 4qKYPbWQzxΔ{ڟ@rޝ0jsy7J%=I!?@shmi>|C)D$/ݸIהumwyp>@8N|?]#?;m¯f(~L͆y1Zmfe=k'sn1{8&`9O#pz •]ADa<) K'{n;*@>Ƿz3O?zVK nqٞ d.*;iipl﷾saҍpXw'Ȁ_eO\ ,/C(<'YX9BD=u0zb5&p?VLПp b[a Y!z a9{- s7kpeUV;{p4\7PG kPÔ5ܩupVm[SɀǏ>AaPPab૑yMȅRPJ64%eߌ^7 m\@L>qToցPJexJd4D@W {"fsɽ!.( JK;JH.X g UI켁j4w4;A1cRe~%C=5Fy~c֛B2DZ@:ۄ\ ȦB"\{7C?qAUHw5r[~b> $l81Y~ }fr>w釀JDW =C\YeKF~uԯ2]pέD+G(J\S(\ySfI>f kPuCO> mL_ qlK쥛'lh]\}'ٌO\ K<9O A:uҚFE9 R*b s-ZJxVc!֚;M u*g\֬2j'4 G^=ghu+$EemĞs^=*#|Vxr]ƴY*$]<,kuw4Ge9>Ɗm(s} 9mϩ}ާ9q_qNNBP^: |%e2HCaxc4ùZ&):`EC+A:O1?]ȑ;挑\(癓v!)F᱋Ist{:4Bô20>uQ̯>k W}#:qmF@%B~aߣ7wV2BuibRqmt6bj1OYK$Ma}y6Pfg5faUy} W `L$khv 7%4@ y(HEK"i` 㗇 -,Fm7^Ն@i{ߋ;UB#~cy&Ǩ {T֏'"s-iĚִPa\5q].EPoI`j>9Fkf8`'0- J/Ԓ`TQBYcf 0w5.`x)f]}sezߏ 37qRք\7kԵn6;`(4ؠvr]/AH-K_Yiΰfj[ց?"r 4`~T~qz[%s3ϳBsH]A:*IkW.rGI"ɑLCh:p=k} )Jiyq>vpU 4pmT!x< ؄$T _ (V9Ocσ}-Cpf{ƈܑ:]zsYg gϞ=QR:AuV[ t_^^y> CӗqdԳBѵkxgCrϠL؄X;wn",skW١$* A;q%_GhyFKJ,Dy˨~ɢ02n9q֬ϲf+<^zmoKWFۿONGqS|FN|f~5җK@rj(No̽:MMn\Rz~~1l~BC8=0`D9: r#)rԾQsxC+Cf?Cpu #[Z:*@W!J Kp-湚*MSkITN=}L֗( .gۺciWv2 {x BϓT>|[aSB$@(QUL9#t\)Rx%dP 7PvֶGI:tl8B>kvڹebu촭-2ȌKog\[י{L F,SM=2~:Ɋ.ӯaG6ֽW!:PаϏ?ĸ Br5/G0@]AO&cPbk @T{YF& oRQFnԐ$CA-EIJ^\K{a>i=h 01^o;ykDCc?o{J(g6C-~і-S0m2T(fw1`+fNdQ5#No}k]Kh*H׳4g(9'3ڒWV3#8c#Rsh5?p&4pSg[DE`s9Ʋ"TX!(Q4k&;p5d8gA FB[( v6VvY훯* C %CcΝ;5s E kx]`r1g\79܄@\\gXGgΔX_5 t:OS[>̖0h`BTDTŵ[@qeYsıHZ#%_,RkK]J;xT-j5sdgDPrNer0:čv-8%l%}APat⟐2mr;Uaxk`$|ϣ*bhƆ:8l4H$^w{X' Sԉo4Abxcau{dtN% B\yMp1iZXDʪ{d):7vVkrȜT7F֏x= Pk5k$(i:yGY/ rO̲cv⽢sui5_K&l, lf% [i.R|E1NMGJW{F@+_/QIvP5dY3cdG6J*tۀhhyIxpэfgE 8[_^eCL=ҳ@ހ*$- k F_ȝO\w D0^'~%ϣ=.(.An:lY}K s; dd ZZ BL"*1j4eWvȩcadaa9*JW?Ou6rT-2^ë=y㘒W}:.XZgI5@od80l+DR bӳOYȽ)SpxVܗd?AYEm`ɽpegUx^VEA9c]AbA,;U3g(߾u;̳Yk3J$BlɸXKbmKxVy D5(퇜{r8ws(y}>嗸_Hvؚ}6f^Ǐiy>to^~틶_ _g}8r_aT_<{1URK *f'̴%-yR[CkMqrvA@.]l Hq7XD&#:frugv!!_:#2C0'.\$& T˞{4`ς a5JjN*H :)h#˲|ޡ#VXQRq=O0Rkss7K5L5CȋJXa0 30#ybo`!ahՏQ.&n݂Ç,7@?*[iĸz5 2cC&Rvы_ hol1܃lq?0 ȋm`% 7&C_p{j~S* ^?lc) IA\{ۆ05'?g#]f_7Cd?<50H֍k;;tЂ }Py% 5>4| #ՕSUM0,Yq2m:ֹF}MJZͥyɸӖ{QU,5%poy"Q"] FJp[W\ |! g3)cۖ~toh6Aҭ^N f &vl ,e}Csw ZGkXʔcK4ʛS ^@*s•{e&YH!ٗfs{('uT(*{.޾t<^<|Y3!PJMIKTvH,!0%I֏$#[y{5du1<_8-o1mUBF3/< h.Ŷ-쩎a)a,YZw͸ƋRڡ*)"s戵ZBMMLIzp82v{c"Fs4s}ڝs$AM#ITVA@SVU2 <9 D"DUGȢU|jFg (xDv2#iuN"@LP;IrAp_ 5qK+W6B֋s3=&j/]kp{5Ěl]TJc͌9;(} 4VMRᗡAp Fש7.zU 4Ѳ`r,6qHURc (u=Z;3gF/ :MD @5tnNo~\ }\{?y$@p9Wsnj"F  [%܇Dٳ# fkyx<:Ej s?uS<ӓj3<ߠ,˭SVjG "]l1} ;:z\ojgWY@.뚐 U!^{,RkrS^I>whE 3O=y?p&2g9 lp~YbOEkC c-"YG!q =8d?x[a{e;Hdhʼq| }]-dZoZ0Ζ-SȗK30;i\@X< >iؑ@]K zNQ3ǾJ9 eiyqOe7?O`.&wmqgi {3/i ]+fH͠!rwm,CeƵm}Fa>{q }q4 017xH /}Rzm2̥%PZ\lX֢ݖCvR.ܒ*s;\A\ h# a4E`Ibo 3৥DN! /ٸFX{,/Υiқ֑ųiZv$Nw(L K9x4U]r3|?K9J1}5x{㼄d:/cTyb˳чBU]> ]ڑU9p{T؃G>7*NS2 ;YHD\Pc>Rܓgf< `UU0hf.X/y1R:'\/kӠP^^圤HT@1)楳]+MjucDi?C[N ?;XB@{sQ/ V;|5AV7.|s!vV!륁_w~`>,'G>r?ffqBSNfI @`##-@p4NdkzÊ7E p T`@Mop{,#(48y,#7WXAҹF8sJ+Bd̢KnXn6+l}&D)?5= [8'fB yAK8 t"YS ?@'&Q+&$ cC? `rqN-ܐRW~Fo+^J.jAAYFۘGJk$|ot( 3oGcGkU;j 'p *m$]8zp~'D|y%^K3f gf}3d[,B+oK?~ۻt395MiE9nYpmكFL43Xk@ qآq_PEN8niXGNiv.[ƪT Xa{ᴕ#8\7̸hr\,Ux>{$ӧe {Q`ֳ36ive׊mAw{:܏@X&H0[?d{+蜏ZHp t blGѬJvl˶,ΒOvc J h3^ی5{.-7=$M)qs *EΥ[sY$b<[S5 `+[pe>Asɠp-x;RgEݸMrn;lf!k+=ePei}³$lƾ/!oZv%؀,+妤D9 ;6,pƣ?{rrM=씼ⷰWD8Ր0FNb5')帧T>4s"Yx & Mκ]DؙAԇ~iei8.@~Hܘ\u/]v%\z5jC{vo?#ex$3(!{}ZP^AمóC%Z$ 5tSD"E֝۹@%J93ARHB{~ynHX6S5dsOZf~v?I;Ѻ6U]V&!Jv^='YuTT` Byq%Uu_YV@Y"bZ14@֗isĊdn\P/c K`niu>@8|Fp}y Z̠hhd$=Ym`]!>"9.U'˳N|{1̇FkJW+d[V]]qzsez(N($i&X"h2='._Ş hwkJ L cҠHk' !30{zd*')+m8&c745e֭am~@Ֆb~Ga8q,޳?\v xx0;?F/]]<s3s,_`ͥ9;:TI{%`Ob FpSeTp_"[;F @͙gUd"@{ #1$QP HI oA0u\JhIsdԷ7Kb90"yȇo |%.E-Z{6?TkyqKAPpI@YWFX"P$=m#K[F!e"ۂҬGoLPmA1('M{$'!,hCpd044grP bQY_̪jZ1 H$x _Zt?y(ǒ#b: 3CoGDc݂-Uypl}A@v΃m!mR7‹'ȓgó>SbE^?[VE3^p7Vfi<J y8~P{GZv `raFL` xJTN܋{+=V$\ecЈk}QAyt: r8R1JhE@$9,-'Dߵun HK? s Ϝ PaCY~JI08v NAt (٧j"o[޿{E8feG#8p]N_ʃAk:ā5 t8Dٹi:b퀹G;%k9$bn 30^3oC#?;a<طvR5T:Pkgb?sk[KFXuXYy? G>8:qP_ +˩O4XH' jb?{_ 휎0djeMيg/E.Vk`3 kaD絋Ǿ 3@}? Ϧa$ӈ6.~#08v6|&l,x7 _ȾmxuW 3dD{0r2e=6)97ɦZ S>>DLk ~Ot d@vl0ϡpY8!v>n}ô~ZWjb{SfvZ<J(!qC+? _4A77+ho%YwӿBЧDDTYRrTOH & M] mk]' RIId xyz϶6O%ǧ2{aTI4[m_sf|c+ID'9f['yY ȓԩM[0^~ANQ:>S=ü.BC[g/HEN[gw戺pOr8<܃,_? ;342!F[^ь3{}:Wr3Śpj٥YdQk IJ!C=;槞w؅dw kEb/4]/-/P"v 5tZSٮ/p.w2ZoCffȎ47%#I\ܿ>0L$z;X#AB>DAg4t2_INH&UcLJ[ˊT.NQH>|_}bv!޻(/PB1 gko'Y Kt,v ;OQyHII:T=sǷS8+vhQVv,'[ErPڛo?n>pRֿ#PO[>| QDooRS)c3Y| 4&k&coF1xfcP'ddZl?@69)̑|󯇛wh$YiY  /.\n Ȅ!KHaqi&iS~@+/Wwp@fA~aߵWN ghGJ0^;.`oWMȆqHx/7³38d^kyW^fz/ODl< }ms56e #OŒkaf#71`Xw"x^nu\F1uRfaI5,܂ J茝$( |`)ț4R%j @:l,҉= APɖD:U 'ꐘJ\^_Ⱥq 8p:ã߼x/ɏN[X4s,HM z &{p //(%Fn.Cp}sUW+Oy)֨zx";(|瘕>vMmӠ A"r0 ^Ӊ=Thޗ>.^F#"dZӲ new.OrxnlptAlq3!FGٵR&zFb\!|Tš+3gcbiL/]OGi|A^5<5e)QڪkNPQ ڴ:f9lx<,ǵcq=]e_Rt"Ir/EYgʜtGRxBrCrߵ Iev\ 6P(ܽ6k`TPR" p?~M K]uÃqtr>`D߹>5P"{%+ "ohHp 2F =(gךHX "ZE=9y)r6^[Fv3 AdɴԛbN2!Q&lVWpff,% 24AzG 5q1k +@SА x% __^u%0k2aW@&UbMpp5Za.p)(L[]g2J@,F0"Wr k_ct(: AoZNAP^ò")*q&{]&Ar/c.b БYnV9Ixg,ڟKH0+j(iF9Yh*Ck\Hl1c2 HA㪒AR蘵׆e I?ˑ!^9 Gx@XkI62+d!ؿ S>5k^c&w ,_qHޚP+2(,:)+:{jy_{lqu`Nc@zcԌ{k8Q?Xsvk*@)oܸM9sxI/Qd-ryH;A$@ Q@ lJ&#a҈$5Wk'1d>ɞ@:Mpqe$R78(PBdQØعBKKuԙ*K[K 2*c p^aou-LQОr:H%䁆~ĔWː/9TbtE2r=̜kx <̲Œ&?%i\dy>1ؠ>8W8;,TҫAbHl %IV՘JJ`u|c{ifUEX1@44xƸ-c{$XKrDK|v.J F(ДԱڃt#CRȎɬ-0U1rXcμ&S$PzүGo!??]>ER- aaniLo֟Y~?7Ǜ׿#PDG>H$'K/hiV%:!UlY6L7CKYھϷ܊F+$Ԍy6}` 45՛d tChƗcS6"=`; ] "MS/G j}&Ά{R~ h}ݐJ<ҷ ~ R LƪeM?$x^ZZӼn 9t09E{,佅B; i`ae#X"X|  1˕o$e fkd:rmZ%FwfjpݰE4m~D`<iW5m@zK2ͅYUr@/Fs3gc$ s +}o.-z/kὬ5$6X6UKY~ 4u dxLB[ǭ BoGk?"XG 8DC]!&Boۤ"xQx\)@>$y4hFK]D{G BD*<5"*Y;vh=CDxre\9:LSBbY.e"¤&Ǚ%#ykPUX~g9#%12>8[|%"fɏL,=CBlx8?闯S`0(qGG`051u49Th0K+ˬ.oY(۪&H<Ԓxt@:t-ttĶkQҸZp뽛uTDiwߎ>VY!Ҕk¥Ɵ= idW64Qb@6 [..L9 /c{ A&Ɣ&s$ښC;{D%7;*EY*=%B"^znY@? ek'C~pqB2NF_ 3O:U ƕ1De d%RJ' IНb!j8sO>@<cʸӻw$kt7D0S@̑/_{.>\ *= 5 \>+ `V(a2.մe-&ܪK,oeP)=g\?ƴI5\kB2_1{ɵQ#) }/ӓoGaPt϶XHJsDnCup2`s×>0|DV;zHkGDred_[+tTo12E0 FJcޥ7j:Ѽ ۮH}cEF{J,1vx{sr \fKXxjĎHl,z^kkq C{C%?jjkN]HKIrR&5:7wU2JcK2n^3;8 9h?AcSx0(4q,<&hSdkyz|}E+A4V@+01xf 4kȨ˾>j92CVg ̂뷡$^%m/Y" c#M ;lqQhts h3nR\ R"1.\+`EE rjLc|0;?C ڻsiz&еŸC^Ns ~k҂g mdczhW1߫P]Pؘ$Tqm:NAR99+{{h669v>Bv쁺z -ʗ Ƥ~!\{:=d+CЙ?<آpzR%}Z 6i-9_9D KӔp>Tњګ7BgK-}sȽϰTݢg Lw!QASe*9gXѐ6nĮ'f%0Q6ۼV?al@NZ# MĽy ]!#9ߙɘNeBdU%9 Q*ۻLR_ 3 a}nO&7_ycLؠ+t-,`x)'dO<_@}K)gh0xv !2c9^{wi8* Az:tߠ.FL] dzg` @ 7|m`ȵ'%}1 ln;f++19>mgDEG6_ÿT;d|`SW┾^$b!$]= @x9],iMC:\1ý2?N[=cd}KpZ& 8m&ı4 |5AV1W:sj"^ iy訫 ԧB=UYZ 4(ACB [w)ZXW~H)%|D~d`Ҁ %'4!/esȢWX*iВft̡+^ =1IN@Vi)ȇ"2UcIy(& H@EB3Jkl3>njhyq>^- iD٣Csc1)2l6zo2r "̾ct}SvCED8e\sqnK*1 oc ]qg Q<͇*:X^Wp0"2l\9d ,<8Av SPMk3OgyTqKPqDG eiC|Io*v0|N&r%%#_B!D矇w #ZlM;B~s˲)"iCHwUv)wx~Z¡z s- 8Gqs5UI50&JQ,c^Yi/Wa #P?9sF|xK?'7?^Z\J mmڲpiz]-6j;-ɝ[%70u6B {HMd!vn!Fi.`( 1{?I" c`hhoMFx6>4f7o=yJie<@Q)RX9Խ;o;Il΄ lԘG6&Q6 `H3 dEEYkk1CGȝ1K$mVQ]Fzރw@N˚0r2=cr?p5ЩǾf t--5JROfXB Lu0gwpnI&1~cc0!H ^{(ɞ}RS5nw`'rL@zEi7p@L-2_~3T* <&`,:V f dl׸L|: i7o[~9YVJdę?u2w*7C(y0@yu@vđ!SNlU\ kD.Cgϑ tKQ4P̢?Aq PR+k-?I"%4,cޛ%T oAT5(~GO8eTxh4Ϋ{n |Z'S>] W$5@UP My>= ,cHok Yeἠ]]Us\ ӣ#܃!w oM)Ȋ Y^WN  ]49$12yjyL k{b*I射Aj3׺Fc]@{{#\ ]xtg/=>c=dE0 WU ko[G,qJ0g5as~@fثLQU8Wv!zv$9˶UXzP<^Ն$%e'U!}sёl0(q}e o{{rialszjF+5@%&;8FI 8 #fӺ:N53($EC[54|O[-% m : VVVoGU?|~,.&zG<'i0GmtຕWϏ'Hc #Uzl8`+@1Ͻ5/:._>ѐO4``)Q${qrudE#@)Y :5|p60 `)~2c,j >H2ѩ"FffGcL(.tx-\x&,˨gHxg' %tP9PkW^~ Yjxߍ%d wj]L؞H59"f .ۛ86B?@G e^KXwgAl'\cl3FokT~2Et! 8dm0JGj$m&0BvW@]YĂZº^+ hC%@2|{ r1 mM!cavLFT慂 2=]5*7tQg,!o!\s֣ Ɠ8!l%5#0xdk75H5gI1Njx/m@LY/rL꾿kmqg)q̨8fD g$Sv`<Ƒ59N1+OD~;OҢr#f5a;~:KBYrkjajy9#M^ ' ##[BـNMmMPZe)15W8ӻ> C[gw`{{3+8n#kJ4=:nGV0LC<-T)-k>NJ N0Z>v:{"9'ȰDcDq?ڊN x"rnT#!SUѳ{J{:VAoa^rwŬHԐ!ǝe3GuXP; pⱖK/qd֗u=JsH@nkN(y`{ Z/)ǒBqkka} OF{V\bssu5yϮ/ɇ7wON)>%fn̛5<DA#_< Ye  XA_}cBK=K41 zݑPP`k'ssG[. 2S6Qz{ڰ81 )FT39]Taek}΁鸖Tdh*j&s_۬t8bgbqʤ&߉~2;sdLRNfGo Xz=̦d+pŐ7͔_d0{UgmT@IH3^J_C>/h܈GG]Ya3 nB \K,5 9U0gm5|o )@a #FӦU0ONN>)IR+M' k *@*X-+>g2͘b.'W)D\_==s?BY2iaqa&cZ̕D/ = U H(a2FE{k.L:ۣkB Aǎ$H෩'#%J|3L">sjb,3]d O+3-㦟QZ߅Xec_-juer37` Y 8XZg1`u% e>f;_:Pk!Zr[M= ʺ[:{cfvb~OPd//dsz yMOhklNF蕵FW#00>@^J&$ ^1 o3DY&A5C@ zZ|LX} S7L ˂vɰoU eɠ85PE QU_:j@X}!{A#3#Y#zb!EuRR%q]LY·| g%?[bRm='! 1e,jp fcyXL=Y~J#z62|3v9Pj<6( XGa:Lus֐ѷek Idž>>w$S3Ӹٯs.ƴ2HT54Lƽþ\ag{4SKu~b_b2H>=Pb=s[LLYf5,ј :g4%P;vHC .DeX\~=@YCr~E˳RV%C {:F0~}gϓw^,h8|Gakrvę{,#P9plIʍ2<:Tᐵ+!fg8bH:!2̒U .,Vq3k}`C~RR Qy뿐:PiRWGFkc__hX$1]$ǹU^nMvⴞc?+> MwoljjV@3H H }Mmk %{hPlC<.%{ky.2RTObY"8iomz|Z7}Ej! 5_0#pue azcSw䣛Lm(K{Hགྷin.e0as$45իVX[$MJ{j"݌#<0~}(Ǜ`6s`]c (5R9!#A0o/I/CGT(@ْd ujES6d@x~Ԕ6 a)@(16jJ{Qx s9=ƧGSS A'k&uPƎkVPINiD1xp_x>@!3~)v@u%gr q tC12^TT╆lg W (m x'OOCgc1ʃ2'"^,IcJ \Uߴ@HtPa7K., ^O bAs-A(?w C} bTŘ7ʸHi2t cSc ƣG%FY=(x?9z@Bf87*`=T(oҡ$:v[[aruJgO?e6ɨ#㢢S‚sDS2EYTKd(P)WI"΄chUU#jNGoRu]nWiָlJ!z,o9\x:dvÍPBD] U1*P[gLciDα5_|oZkh; $}9.1zCtE嬫 }!y{02;pg(媲" sJÂrX1c -p?ڏ^ba% T$R&-ː&{|*^]#+efȴ"G:sx9:J%*_xY~i2׀TғXܺ[8E'[>PG/leg{Y^xW]`ynû,4+!ċ#+@4#Km8gSs_|9tӥf PoN~(%,(,qs]R֮˴वa3w{}AjrZ5;@S ^  ]?&#ß^Z=# qW_}-q4%?NƨHP aLx?33g֪m>WxHs~uAtmc4u354 TݐbY^ `G+? 2P|x`uvY3s^A t%I3"@T hEsfF_2]>8g ~+g%-=, 5}$d<7r1tuuFȏ#;~NzOKvpZ 3 `SwAʧ˃ p0(NWa #:oswۚRMvɨ ֑̪6h/= a(Q^[% ]O WpleY+#@@[Ih N3sVY G dl`i]xU">!Xϓ+%3 X SSDIVWb3$OU107u%mՠCz 2Km)%Int>Q}@Pl`ݺm3ø+N$k Ѭ@|zmS`n4Rʱ1\ /7Q1kBi5/ fmSwKW_hR1:!TZ?dV%o{{\'CFp}[pŔZ?FξGk%0 ʉfƶ5fn. 0n,&)V&MO`5dJ[ _D= v1 :n{{Gl׹GWufxMhgVNPABv,%M<.ƪ뭤ㆠsˏ YwLs۷àYftwh6͕;2\ffJRe;lP΂1e 9Vz.1#$0vIƠ=UOY@cGecO<鵕Rߋ URƨ0{@$K+NA|K$ZL+gץkq\+Ӈե=-%m}_lm+cI>cN˿A1LB]~-fQݡ G7^{,gHDL3Ux.(#Xk0TRQN+${ a{][a2쌳[Fi{'#Xw_ ƙIK%bdtgTVHhiNڡD2'k̹Ҏ7c]0\ZǀLX`p\WfgYc@t%9%kP@mF!܇Y vPlhEQ&:OD{OD ` y2M~O+] f6$qߕqvvvt$vTaanc~Y"T]gd&_N0G)Jw]?GzG )@a #@8S/G_g=m/b$Xڠ;Ik@.]{>f rtD>0qD}ϻ=O jc G"$7#]6+ѣ0d_t74I{Ah Lcepo"Hoݾx` 8ҁ( igvb޾fq.\) [v:AO< bʅUI_8Ld ɪ8S~2mJ}kPeǘ@so3\ضlY?=A3#n Z#{fpc=&`iV\୤֚>* jQS7 63{yy=a7dG'&ՀxXI8cįGCւ cƣ IXLWercHNXV*ȱ! FGiQIFTIk }9Z0f k+J._DYN[QMcs?XD kl{)ccuT2:%(0Y WYkB5df8*ރ4H k[iA2b"ϞgYVVR,f+JXlsWp_5MW#Q@K㱲{]^|!zqḴ. >sY#ϲNNbJ)ue1[>V㨊ojvx޿'a9!Dsxq];9}IU-gaj QN`V< ư46E\wCKCAk3ͱac5^,;I$ %܃gGΠTh%zx4Wb,PR?5;3ssa 㼩ѱP˜RC*p-LBTV2 ֑gIj d2*H N e\2 iRm!MJpcG%q=s=џmhn/Th;eh5 o__D ʐY Kb0Kf5mɏct*2hF5gH߈6!B@{a'bJاO1tʀ8Km{3KK ;YzWAX/U".: 4N%ΌCO3[ύf Kj5?ܧ 9'-SafK,W`]?G q9ο"E@+@0YGqZ挪>uz?f5+d4]T70H &g]nSB{skՀbYS 6, av|`㺸><,ՉI$4AIr>6;V[b;xX9!aڨвف051C OK[X I/gkC.1hGZt=۬aۙ!a-s)cM9&Y6?c,o!3 h=+%{ߞ!>{BS^ Ψ 9cr tR\v1:L85,b#sSWTȹ@!v% =cKqth˲l kdh$/8T:;HYB>y%t;ԐRIKkҪ q+3 o\otǮK^n0(6F0#OcE`+=)* fAo'^ed㫑j쳦EoK{ggq ݡ 548ILzq5:{@&$NM؀Z%TGՁY.8Ka'[CH҄+y-bD{eY'U|8{fVrB5v g)E#k9fm3W~v㘲[3J\P%b L"Hc؛1k޽_җ*F\v^ =Cl/|Օ/}W cn$vRʜqIkXfCֹX#cש}s8zϞלgϞEf!V Y9=}%96`eُ`}jj8w\[8;1s~I؜-PkPюܟV/}9iZxRWA(aƏ=k"q,Q8=Gv(x Z3)[K@$e2U#(@*_OsyHpoq5e};s'2pADKτ2RS6rx&.ϡl* ( LRRܾ!gzXp)ݗ #W&Oպ(MxQP&Lōۡg L`L)܋z-_۴ۯ] qYP`=PJ(gt#C-CJ4() ~ o;Y,3\q_CV?3{U${kp g?! $k@~~w'AAl `"]N Jd.;'z+>e$!|^чm,q-Z?+1U<^2:0O0 ZE ? 4]hv!*~t;<Ѱ|+әn.4=v C~ (5$5ؚ/|$  (oPJ9|& qoU/Q^m[s7ҩ+W^{WA ($G@t#ʞnB6vZ'*>{8df5386Iw@g}qҧ6ʃh7˺opǾljL3! V2Jmpۡt'y3(d,*gx&GXIh|Qs~A8|=5{^J[c6`-1N947ȘdeV}z-$PYʐI{ݥnH4 ˾ Fx)2;{Zd+&!S%VSa~|"RS[ZQ~{~8jviM@fM/Lr}ffikzqZT382I5 fm舖<ֶ!ʈY9Vo,F0>;o}u3B9| Y5 L{)(hlC$Sd3 {[ ''ݟɇ{`+uߥ[B#cg[ou+p0-z+BGwh\XgnU,@BfNASeeƥ,3 MDyI Y<*](CG6{gI Ǟ(Bm{DuuCk]cl ptt7m2\)]gv3ػtr4בFMObIט(QP$gnf~@|Zr!1U*{Ue@xE x(c mjܧEyCg13ʌ5|?Prjbߒ[jx9ǹH+tMjd!]Mm]hsY5&~rA_[q$ pTd Us,QvV.x>TNQl@e! )N )+W@פT skm!ϵN#CZ'(X8c-E'2$X^*Ѡ: I=oN`@VS! OD9y<${x"`c>#4d[[ rˆǖ*ޑ?ww/Wa #P;Kᇅ(#G''vOaeܭqF ~p. x|1|̖Sdl7u:k7?G0W̃rh-O4[d­T}B ZnuS/Z0IFֱ*7)j3Ǝn33@&CU8HAÍMpVKʺj 5{7`f\=(5Ty~d~60k%c6BXދ9VUIP;0{9}+&3- ׽ξgBB~|6 YpH릦PPQ@ 2׀ mfԭ 66pVv1]1"t /,do` HIlʙo\ ; 2coLpo>,p$. ~HS٘ 1GLp58u{@sRh=2ȚKŹQ7yU6#*+ ރhUq)y% ?o;x(3߃(#+fliXXD 'L7[?}kbXA?#CI@eJb,k\vW8L6eC^-.anv<̲wA6T{ E(>W~O= <0p&R>H|-LWQ=l=~fq!IKfޑ(WaC:Ȍ *ȧ )Dy<ؒŨmX{p(Y}$Ȕ K!s2jgo@z9d6i" ઋP >7:@`+.(/$̲ zHrN)pd9+jlv@c$*;K,_ P,Pd[C֧ācn|d$JKbHՕ04M%߱J$f`kF˕9Oz]ꀵ-#8ZEw$|"D \Qa)0?KG7Yy($犘[_֯t!߻9CuH"1<ܥ,g>? X__ERK??_3gn OAT?\\ǻܛ]a!jUܔw4dT⩒:`,U"X6q`n󚵭J rATXJpr=G/ΉmVH;99!97ros  F03F@SUa~G@A99o?/'/N&e]9hg{q6~n]Kȴ4g;..#([{@뻴=$= "̓ o$o|Gq i'@ƌ49bCu<6Vw ά1_Y=Ro K+PcIJv)/Pmܱ^w '?3>A]ƵQC7 (1HW@Tq,Tg3m>}rbuYJ OX r*}F ouyם`erEe;9#%,nkCm˼D0$,jU%*%A L P,7~ePܯ^ؓ{D YQ%3Br0d1#bgS0%$Hչ6cb-FF2R??2HX!{2R.΅^`Er&& ^"מ% R2b,c>Z6JΝ&yהC'k\,F Uw@~2o#ɖa&!v gh-ǜ:LI[>C8S"1Ѕ e̖R 0TWUr"Hc`yS'!_<}Xy_.}ƶsZ^`iBRuKPP g}0?m揻/eUܖ9U寮+0I&uwea#8vjpߧ8 k S*(Tc2S!T炦-$JN.̄z1]JgTYkB8:3E"39Xz6J\4uȪHJ؁`}X{Ύ/BB *iLύ饩0:3N t&'&89?1b|%ٓY>'$|0`abMXat*,6ٳރ۴#`mm4?,G26#/DkK ,]Ie nHUs?4|VmnNxxYgdb)5z4h(h#cG m?x?fD5uސ(d!0<6PA=;�䏙ڋ la3lDQK޶YK H/zq#WwߦmZC٫7ɺWvdd׷2Hq[\L}Q&@`U43k˱`ykINjk[a`ӣ;wYk' u{iq>|+( O*b* x/\S?{2<H v2ʺgǮe: c&۱oPp-;iS0SfHu<=Q#^ qE1zd9e2:8_7GqrE)ܨB/$#Z9{i6`8v鞅ax5f)5L {۷,Yư=Λm4S2;C7 O`^Yz{!~%*f(! ,g>=xum0<8z/,rJdxQꂯb9}kWɾ8/9`%G,Cf!8ʪ4Tg@lK$@%O2=йeVw!UAd\{JұވuxATQФQ/)QYXU4^xύ=qYҥ4Z2hkY7eVЉ}%g sN#qR@\׃"8C" #Q0綉AGi}a&d&G I0d.l#5 =HC o㳦 bcso9=L\,g/fW>OVW[:.|tvxOW?7۔ԆO60~3+_ W B3 "ό ncَ )X½TXug/{o#y~}뾫{zkg%wlYmK'0k $1Aa81P].ޝkv﫺뾫y-r !KT^>k ԮVCP v5q6TQ*E&Wc?q`O_{;;KeKZtF3{: ;#@3Ϸ9B_tt C0w= rgΝ̻Ll{s)]1Ji HwI2}lw WMt}A2vuP8܀zSd OWɴ6ϟ>s ߲6N&SV֊qAvi)y<a*pU̦`82TԂjlEpҌ~i[Wl鵂dY0?{{?l3)P S'Zli5π79k;kjfe Hܟ~+-LX2uXvq#cbyQ2 d UL>i)O]E'/^$LGUph|UEn:]eT`.Q4`rA.(DP!PD!Wup,^ik?2@Sɣ$X{%0]|a3ALn%$RwN5@燀ݣ@ZQ8'InH'H |b}ɫ<,?=0he5zv䖲^&&^]BP;|\|/o,}}QUNeqyH@ B/{v'Q H`2S6YweԕUU `l<% @C.5p>iJX̋jZ_bWm ^2$W%Κ Ȕ-yGUeNdʋ $sP% 0CEDTHʬ5R[x|^XnFWZk5z3_U{9vڬk '/$>HRz}AyI2*2OzǚmKʓC-qt!]*?*4ܕBj"~ VuYxSW jB\Ay_,khq@H&۶*WjgS)K vKbfiAgy3r!s>>i]Ù 9_a0R /3'PR0?ѷ9bOQ: 54iC@e {eվJuwr-y$)›3 >7.AWHRF$pHO> % 9DB2De&'J%B~[uu}+;L輮3q=ןw4^{9u._mV&:h9x +fnބ8X#3O#z o+A5Nf0UIG@N9l%ɑQN 0L7-D,+= p%WzJֶ>Z٢B@nONQ7=`>I*#Ԏ?VY%6 Gfdɗˈ/I$[VKZWc5plp.[ʫb]K A!V}?Fn2d `Aׅr9ǘ!F=qrdQ?@=feKssf9sϓGƛ쒹X%q@@&muu,ܻg p,o0K -I0`u @6ϨЁ !id~ C-@[% Ȳo_u+tdi_$ HmN2Y<%<jyya9H&_\\} ^ &}q4 wo-pLI洪@s+ʀTG/̬;Rd(r">,emUnea WWW^ *dQt. _.b҉Ϻ.X.EoVF!<d` (Q,1C&nt6 3)/#Ո2 )l1I11@ ֈ)j%y V#3. ?紛M)uay~ E0A#sȺa i_U(Q*j:㹸bd2d>34\5[[HȪ鯤qg֗TS'L{8+R8! +OUrDf^)r~>|xf<.!αzlXpk PGy5L7VȈqD2Nh\zku]tkfKHD/ `Beų-wDJ`_9QhAGo H. j腰 @ZfL d+*=aDjI=@$\s͖1<< \[fdYRa1u6*" (E` BA\_To&S67yXWgF/x"n>^JM# (qڃ>eWD"FCHMVLj99u?2 ls.P'?^3yU) |l ۮVgJ1˿T[g>xU}rm;$uGe "t--h)֖a)!>7磖5>4&uـ>D+gGexT^"D H 34:$ɝ/]tF3l82;_@g>8K[_][nUOTӾq^r^"_Gچ٣,PZp>dH1[(^cIZ%Ki%|*YPKOjGdKq]^~ѴJHdɚOԽY$qN\\ҝAf"kxȌNaPsHv= hȲnхaw&`L`"UoC>(PF^W֐R@s1-<'"5Q;?[!>V @Q3P(s. Ҵ2_Aeȋ[~d.]@rּ+-cw*cjcic. d\L*.8 =(&Tׯܾ? xd`GR0RӋ:h uyL"<\_Nd.dU^!,R*#"n~FQw|]^lsgTE|Q?! N;+.[tBGrk撹ɝ $FFPge=l;P#َCȏ G 7 %ɻm?$7󶵵/H?s {8#P )2 f$eHtsYk"? 0?͡:Ki6ۏ`B2HI.%AQGH3\t> )fk92P*5E,iJAs·W URT`e^sKFlY2{Cg0n׫T3tO8`wF3 \N]׾յϧ{dUC+DI*yI2And6KK0,E0wR-k . ԬLi 'e*VP(GU 2p1ee0xSj\}R-2L `F|@Fm= jW} *#xOyÆG^jqmo,d<p Tws> JpBm[. 60v\xydoYWY]^2qǧ:ܶZƀ1GfK0Q0n]g BdJdu] 2ԂwHֻsco7eUJ Ɔ--c5A0u_ : puHjdɀz9KўSBmD8*pͫZс2yyYଐBRlaX$s%8@kS*0n/̜)Nv eD^'+υZ"uD@d~%5!&8PB!m 2-\_!ܐ'u[?bɃFAw2P7 /fR$`%[~j& =0nAy ˌY1Rs 9u5R^z IV1F6CD adn;cnݽcJʈqPM}:jSsA Pc ͜S2  )\5Μ`o_B`ApQH$?Tu؇Qfܾqq80n,qOmdj'Z>j3`NS(KcHML t}f^YJ8UÜt?@e08X<%YZwjYA@|ICz-<<{K-i)ayUÛ1btCz!i%xo'o&G!I[d=AQ1"ӌrSM'RSe 3kˏ"zPgyH8/{zz}16c畝qGtFSO8?gk#f TݹC I9ܨƣY]s|GZ^!^AKb526j2UfyٝV3iO̖ C:+WT|!.#~k+K@>N X}ӶC5;[l+ZO>a<]&B6s7^5eĩ`@ȌPu~jbʮ`2Q+y?r #}67oaRȢ&{BbSqLLk*c4ҟՅ^ϙ**'>Ǥ 41 DfX+/)3{\rF 3Q<{sewqrO'{h1zu]<F6.Zs ҍ$9$c#I-FQ05TYʒE+J~2t0'lIr).Z e0a}r$c*QɋdI3S ["DT)#HՒU{"GXS]f 25V #W2T 30[ɳO9y$L oT SZW{ԣr A)nԵD+\zV]xEXoۼ賂꣋g"D> ,C,%#/"d*UD;]iX.% .&M;SrUU ^o@{E9i> gΞ1fn~21uF96ij1 Am0oo30cyTEc!QDbA4"t~&_kɋWWg:#O5S [:# ''t%9I21P4.Е҄#@ x XkQ_(K "򩎖u̒SU,_tZUuȢGF̝p޳eRևYVe G?/5{l\pzɡz \L1PI!cIu 2N+ [o/˸!RCtǷ "HrB 3ԣU7*A*;8b;ijN8YB$g8f>5#3/c!ǭW$Z|1S"}8<z~|wfGMA S0m,Y-!)@"%d0~Չ (jq3mL$];8}(Ym H\@F ٢o\^ @L@ablE}elq#Wyͯb~f}A*9,BqL&X*繮+Czޮ~+/ΣX7DT֓"kU 6̦g1{vl&(/Z6$"1^]dc ]&/a: g:(*Ye"9S&B2$Jc^m:Q*"[4BIUvE9c;dPUTiZ 4:$`"YE΍]1K+jsG"xbAȹ $T hރ}:`tA q=JPD m~scHP ]{`Ъ/0g;~kSޟ0=D$&u^+]c&fΛ8E++b y_4i2MaX3 @jt}XU’GQ@+JEE<|g!, Ϯֆ /DyAaAf欜[,Qt8O & 3UOm=4Ypl}f=vUAdN: {(~ ^djѺǐ,NK64]PD#EA4cOJ#zCfd$Rc߱ X手Lrlq 29'eBR` @{,s$|ׇ(B* {^ە 2J-\9&ٶJϗ5HtLAUKC$,MGʹH ScLֈb|. QTc 724_<-۠'?@tF3i!wtF/?})Ns.61i3`|HV Ui.rHvlr椭F>y{d(MwoA7glʥ7^?jߛk6vֶ, VfT@vs{7?9L z~y(kT3ǧ cQ/qɯ=,ȭA-"TLd%h~y/&I6M DF[It;y/.nr1o"'ziHM$@ JYIz?{ i a>. F2fe\KNn+R5#˺ ,C08Xc2_!VH.MAs u $+]*X"4*J uP1УX}}_$n/ܟݡ IP'c<,)Tpc^BgjRr PJܳLTvLZ@PBWCN={Lvk~cڻg~ 5QW3.7 T.X u}A$q]93W 2&)DP%۬؍ 3khHg%ΑA"*)PRkfkmudH? .#cP^g:LPn1”ʡ͞u󯖕22"YZ5?E T[GB6fqT;I;>D&p i:av9dȉ".^9}+92-֕.R%CqQ2`C@ĩK5RP,UMJwYk@+-,FFdN*EKg"JփK0# ,#O%n^J7­ Y9-=Plz@35N֔-$0ZFS6ol` '9#=8 }dw$uw^9ڃ  ?3"OPlRBhS=&I)3hm1"T\tOzsp`C`P,xCԯ +6ڤܠҢc9J਴80S5vB \oZg^ _L~Mg7E=xt: ZԹc|XKIMKZ2>_>!Yp $իY\>n9,j7va]0M$۲٤&l J]^('OZs:!KVt] qom d(by͟@á du@Ƹ _bb&'cO]P4XJ[ +C֬Q)t^i9"G44>#~L k5%@UB`Ǝ(5S&SIt:sBB_N{(juJ~Wr$& "+pX%2]ƞ:sHn>T.CmIC6{BħJ4<(Dsl1S)r2sRӵ n0eeys͜:q3eo5 !=k_' $艨 1+Ӓ5RC@IDATHLК92in8JY2"U ~iJب+ f'ٻy23sL?e0Jpz3*/JHaQEP·! I՝Xx'хyJ3O?:#?}}o|H,<DB->d` ]C VB"Z ?eR2SP$oe׷7&uUS^Bt,uЫ:OL͍uj]s* 68s% dV!zׯq??qœ=fVPewi)(2c)g@ڴgIskflt_S\I˩EWs#7M9E6z<7Z{ξd#lP\JyK_4n3x>ʪ̅Ȳ"$ȇXX#*`PcsYǑ]RU(3)<8wr drX_SՏ˗AĎ:,Ti;?qr*C860n,#N'<%373Hfy)BEreMLxi :idz pJSݒr?j7OFQ%1˜j|!LȎWi*EB̹P<ྠ#ȝٓp5[| 2YBB2҄q X@̐xQS(2`_C 1C=ZÀnXL"E| 0=gŝZaI(;K tˡ}`J8Mu2c( ZcqR-41|g4YBSd*: b~ŐK?A3U@d^I͢_{n"h 20cTS6e9+zm{a7g'MfosC$cfosoۆYd!$07x;?}8y~d78p'sɽmLlr@A#S $0 Ah!B$֊iP1sy糒^< 3mEjpQ.\gVf^my@N(FQ hG6i.C<>\~"Yd)Ap2DLBD+:g~b8lrFyQdBMݏs}`Jف5znN\5<9~,C%4L'&"4t.1co fP-;&rR^@V[WQ!$1ੰhK9kKI38sεN앫f3r-ta0`:7m'2?O6"4_R1VI$|Pc)fDZHy"}2gP $Hd   /̋ @^c x+vhP=l+I9asݷ tQ>]&yÙm8CІUR3CYC^Y*r=&Ձ=S~_|lIJ%D桇.B$:)gL3!>צ'qH_#g_yM |0aPRIP rrpϠƯWϽ(|uF3Q3T"@gFFfwqTui 0t:bCY|{C9G dd( !0'#,[ nZ7db=V%Dn"uTX"󴀝A%:a K! @"=c;EZ.;,ɄŇ%R9tIbڦ;]_FdTJv?,OH.R=ao/AꈍE[Z ڧz p!nz*:0wn"Lۭl>*BCz>; 765e1n`I"g؞ #~ z L3N`"NeǦOخ+fylOx})ڼ^=(y`p@6Sstqp&Hf?inU2|@D@:2v2&L1ZʸKRj ˚i4U,hTF&ǐM T H.#;~UAD.@'Cxw2sF2a2ޓgO`G%/޲](8Rlja ՕK .6eI!KrS%;  M,AjhAgL/on@ύl^LuЃf^EA铀O;d޹w3H;6 -񵻼 dm3WRA8w[ 98 v`/1^2cdc2 :ٹ!2΢5y:LpmmN Mȩ*+BdeZug5jO@ƜxxOk?P]%Ău9r}ڄ1n%;/~Ez3=;wv(b/SJn =celHw!2ƺwr D,@EB1g!HHs[j 423~"ɪ;O!J^2""EyF/0˜?6^ǩL:.x -bqԙG% ɳgRkk'P%*iC@T*=/%Lv!=֏:ᦜ.AN<.IEsd!u?59k=0%ntHa@99ddU(=HJR7PŒG~wO}33@gt|׾t> %C +%ȌzM%VfM-iQ(5Xmdv\g=Im =2M%d9\y굕j vlM9!Z4:_S(o o>'6&lw,! R"`yL -%D8H`NzIJ N} Lg0bc(᢮Lc`N\}(IX[i!2=E4Cer?ÃU ~TKp{i 3cm{T7|\lpRdi! B? q %ECX|T/u9s?Y!~L{ \ʘLfdF.;UJrfIU,Y fI106d ɝ3Μ:y]b!Yg/F=\,[dԦN}IsYAa,%UcC=7a*FMR h+xYTW`GVWA 0yU(QN E`= < ((QtuH{Sc4n^AUX*#*VP0ude)"RNҾBٔp2̿:8(10:sʬ )Bgƥg:O s̏zFjw U_,t9*uM[B64C(ʐNΜōOxt^tFw:_@g~#='hP=Wȸ`F- Gzu9\'nR1;?\n[әM ːk#6$Q_`NX;5׋#Q rP "P\F~@g}f x 0+ॾ5AVo tkˋgc0}QL.}9TmLo>ZߩCY Hq9 6fЌ2QW_" @5eCnSz n!Z4(zC&TcU&cV|-[P)`]2}2.[eQ2qܬZP\oڶgh~plA$ћ3&riRFp6o!˓S`N;236R()G6C#/.tTBܝ$h'0Bj!Im1%T(PN zd%gORsl3!V < ;IF]AM֐", OW`WKs9t\4R V?lm.O]e%%YZU6W>!^ <eC6f&쥋뢎wD!,@  *{K#S^3U0c۴᫳- " ?ǼZrP#+ʈ6s 7 *,3Py$9H0MIAwHYzpGH)Ip0u1(s,JdШ}y-IaT ރI(Sؿd^i6La֓hLNCi~>Uh@d|'QZiBڰ| EJ ؓoO1[[+AzԴw/qȭS}P,xs p!-b]=kA {JeP]hbEΗlzG9^(<1tΈض"jxyG5&"GfLO%>/cQr>Tʚ} te9ي98De*ۯĜ:uޜ=wɜB}Ϛ}6w!z&Q#kQmk?,ܮ=c #W}vVTJ.)h_IkqM5)5CΥDk$$G?įZ3C cR6Ⱦ$>׾tFg?g?+vF3K0o?οOkOG\E]'/]dixmf6PZ d]Zb[Ys P" 6O"80Z::u[GSc ] {3W^'@v\s,NLʊJbEWA ;uH][y/hQQmm~FR*6`Sk蘻XOЅ13w놹m s=Iorx#b@ i搶WfMߋՠ[Y>R#p g<2M2y%0DW ۉ'l@NDL"ɽ2d̃ذY5yRw^u"kcle#cx52W!+{_^u!r\X7{/'bhe}IYz筂`vh<.=6`})) 3nas.H.?X(p\8 ̳nK*Zȇ/d2jZ:mmn< rmFY/ \ :|\NEXx@ўK$a@|J {N2xp/d]Ee=P%dqmztzuL5XPkdTG|ۅa& V.CוzB~ >ڿ֟Ҁ56k !_vQުtt]qB { )y0Ys( _a[V tKERΧ87(f{R@Y~w.ݜ5FPՠPwQΌp?S}Ԣ(+cS& UeUՂTDr RyBdHWm.C|ᏀۦU&m sd鑶CD!5d'ǑNIi"Nƪ{cW j:i\H g t^ ʸocu"w Kؗe~6ʉ,Qi٠r'ꁚTOϪSN FA==|ְGk*f~zG-Y(r3z2^"yCgmJ:O9!%?猕al3{$jWä/d ep)P/'oA}L87҅uJIOY@T<j .ZC@L5u`( l2w%J4 pT#4XY^611ԩ7X"`Wװg6&;?)m(%ԅV% *E R q6'Dg~\GW\T%(?(^LS^-er(SFQ*?sPFY緩P膄 v˃MD @^=v<:q E)@ώ*0 z:e#~GPSʸP TEq$GweXG5m_O{W^.Ai|QẔHK9FXqi='@e|)cOΘ} ̍w^)a0%1(%9y;m9jƱÔ'3TPW ?NZؓ&Flk9HrFYeQy961i%Z%B kMgFda ʽ9MF v+h.Dey_{VĽ5XQ;D8tx//?2&NrB<^{ɾbkQ=UJ&9k](DK٣RQS>AHxTJa`\m )j6 7 z3d| a"HPD)Ѡ\U8C,^&˘9!RDp(#6A KkQHK+Jh1ZTܗJYJ-u_£|ըSV7kZ;T$Gk:e,^`r%mbǐ6#Ho~񑑝,-- P&FW t x"dQ<ɹYD7!o3#f,VJ4"`iXeB-%K"mRW*Ja,%;YAC-jdU`[챶(mwuJaTKԅ}[g*($U{H(k' ghDnE戺7XM`jXKon( Q#C'Wz \2Ak7oN8͹_ZcG()K}xIy¾v~ V{PD(J*w33ɱ)szh!"=_:cueRx)܃(1N:j"?/,[ߧ,nGs1ţ_;#qp;o_xyGwk΍;&k+@@PTX=冯`PNnm"T]x:ǟ~ OkR 4KհKq^GG#"3אūYRhSGeإ\Pǭ H`@3@Hiuc5A6d^ZYef> `P4m,-\ ~xق 2`^9 _/ T۽iNyS.9!6ɄLW-3CفdX[Z2F'͓O~߆IoZौ Ș# bD'[&Ьn*` t5Ak6:# fh^dWb6ǽh5V!\Fmb0 O5ͥ PPM:r_1brNYcT<ꄡH k]FLM겕-fV oCHOͭwߵ&r6hetЀة@wҺ 8Jd7*NX~/GWWwwE2@ZB^8X>IX4RH0<{)|8(p 7]v07Mu)T _h#+/w]C6VCbxX"tbYT %O7-Ss 耸%pIJW܍}2vR0$l F QC{6s/5Y=xVoTs9`ZGwgZ@""Q-# By t;8`H") J٥l2tJ9/cRfڃZR`ީ7Hz7ᏲghA:4Lr*'Ħd^<BUCY@?^!Q6 e 7į5EW<]'8="4 {R>ev7iif ,y"tyCHUM;$-'66'OB@d\yۚJ .G'/8;Ko]HX[ ܬQ)c T !  EmMjrUj1"/^|.j{->yLMϘ^{-X>cҷ%V ] 6H!'8,hI~8aȼ5IQQo;Fw4E/gr?@@3flr]U8{kMddS-plH:@ FKNYnm{$cd@ X2 d %KA2i}mW .$?B/dՍc&S" J ||CƇ99Psh7q9'[eZt"6w$ۓ{PW,0v\G`2;~܎?F-:];=R`[0h܋{TPR*[Ahwf]w9"aTuLZ"sd&7  d d*hpؐ:2D!TZ >T M!s(HFPZw^^_uP-B6GoWBmck~?;f & +:$`q{6@q5Ҡ8v}?d-.d20b ӳyzJ{ib]1N/|8D ַ$ȴ0%u~$ !@z2G>mE8uꌹC)"CrD|g L,>@p,BAQ׃ahꄹ35I aVwl(A&pN}KN׏}2hRG |N+: CC,ݖ09}'@UyLݪeDdB>jn^ƠTj@ĔQ(A8YHd!?:% RΩ"c?E D(#{:!(p^ڵu5R;d!dN*9!@"GNֈV*=\O?m4˳LayqgY?DI%_ WQ q"5FЄI[zr~ܞ<,./ $]ggzؙ ,@ABL.;RJUe%vbDbrX Yoz8饮KdОha;.[+ D0.H;oAtN߾=Qۿ/}ֹ~k_"PG"5#1 E/F<_QڭiV`%$1NFNY@YF40`#Qdojdю#G2=ܶ1+с= wsGJ [&kz)]U#elVf2_`=O!} _"c, ,Z.F G{7{׭ 8y5zG̡_|ݏj[;%&[h0d[ٳ8}C9Rn9J@2&1d2%nf/< @wr(: g\C pyH]Ԏ>aiZ'\qE d3ȺK̕!pW nJ:2O8esAd:8'~0[۵^zߢ])(/e$2#@{HNO~).Ⱦ2&~k: Tҩ7]q>(d]D3 ޣ&O3Fl.PAFq+<'UC ~^#/ e3%{f!?Esb48r5RTE< C76d P1_'|Q),K5rl<Ko)/MP**V )N=sbe=8G oRBBԨu _dɹ5Ě"_5R׸u70{)Aģx51֫_v?&|A "l% !\Q+ ΣD1f]=u} 9qhq`0Ge 22GinQDPUlJZ5Y]R9771m9r\SWʈADKʦHK29B ֚.-Y[kzШ# !F+l8~֊ \oIE->'G|M V<% %pB ]y>?G +NE d6 ;D 9ƒioYXz:"DzQH.ZV`Sd9Ty>èP%-^Nq}j}C#ΌvmFioH\s(04k3̻4^,فۧKH?m .-o}ᓴ\G5C+ȄOsm-vQȝݼ~cuA Sa^D ۝+׭_ut}?#ϘWe.R@-<pZ}"P@-?}oϿ/.s8or`q)kMmHՕK*ٮ1 L'j[G'%^>g-Y@a,S,/~nkƵ ^֝A @O@\FdWL84 ydIA^LJȕV9]Щap"0ljX!p _I9PϽ?`xeytdKKԗWfE6T dڒJ^p=7yϙtrp?46AuZy) LUrIqg;@IDATo?@%o;OOSO6o^;l;cˋs9k >/Px92 BF}]АMNRO7Y6} uvNr1* ή|.? ug(ᘙwV}4A"VԚ|eoDQ ~KԦC(ugO'Q ]`sx`-68(Qj{_Ey'"KiKtpykyS*0Gh/!.cPݢ!<6*e2Q*j@ P孊8P?)2t_ d$H]=w:q|V{6V\,QE,E&pk DY_dD)Ksd&1,ܠÂ-ϢZ¼Z L(h0D?ɡ 3)*CRl.ˁ_ealQưݿ}5^gg/aaNb,)o "D!R+<;DB{ W4D554ҼS]Lxm ?w VfAiS 3Z *Qǁ14lx>$> vQ~ A'Dq粇ԈzjI8|8JnDT uD{WJ1@@у#N.7N@)%O(Raڿyv0ab/֪s<1Ԟh)>Ohsa];_HdTyT R߾ǜ\FBP6x(uӾ8q>zæ&!=Ge.[%;Cg?7n-"@8 FVjW^y??MΞڏ_v#vV" -p+R)9!**sY2:yGqSzcǏp,y咭Ȋ:IdLsp,.q(Ԛo G\VR3&@1{P`!\.~bK\B(h?dG{0 eҧ:A;ˀ.Gf7 rp#Kĭwh?oD ,2Ya!=a@ +;.YKl!H5q7 {z;Ki(:H yGUxA/`,(Xo1v!$^@|kWhbYZT9dļrL/ 2]I$>鳫VdvVW9ә#[oG)A2%T-vߙZH(\Ѽq ~{ GfR>d)Q\T-6,''us t yA-/4e-i7L d;=Q`~?Oq<_(rw6$  2V2L"w@J.GkʱGΒynqN~ u5H^llsČ ]e3zČ%J~Dk01j&L47;w>pkX}tGϝZS mxVX2 XACYT=B`R>y)u  Cu0;e }Xc~_շP:jWwlBU`zB%g/sơվ_/[*<}l|9H3f;O [ah/JC~d!&d@<)eh?0WPi`s)#k,.࿶"$<:D CjĨQK:hC(VӔ dM )s] EԲO>ܩsm5,)(Y_gP|=!a#e1ʃ}#w7!щ@"Ҧ JIGD(j+Ų)"}3doQ4!(d &lC&wb :y]mRr9G5~e^f]dC`aqVٙ[UHUܵ{Ϳ~v}y7hfԾjE\j !P-"@WWxҫHʒzHX D45̇]:ev`/7o\AjځnKbE;UrX?}GW؎8CfhKtH Y /MjɊ+ۙ5` !WsYeZ_^jgGɖyk}4:W@Nݳ\ի]~r|aX ]t 3*6V`N2˹Xr @?L"v43ECCJt(W~?i$.s,3Q2f#rh$ąE}x,xe蜪\?i>QU}?@)ٛkSn"gtʁ5RD~ eB,nB5RHD J&?ð$GGmjefiXO=ǚ֚lq&p?bݺ~&o]gIk_ IV_zځBL2 ߯Ro@ɖbX$1_Bq"ZPa  v/uXQϾ a&7\I\$Nu>Uԇ5{N$IŅA] (%s6QRBF-ddpֶQ,Y2_X}jvyNm'ȷcwkJ\ %"] *ۙ_7\q7v4۩'x|p3NORHYҔĎ:kI*SRYda2J`(H7*@8K{F Q;1Ggn -`e6,%+q\Q P2Btkk2[x/ pWBܳ/aܹˬ?܏X3tmD NZ}L7AF7`آہZ9;1;BkIYd& "n*u׶BQ뭫o"B {Ou?s:-sէ{Ү|->w-c2C. Vb0 eѺ8{ZvDbNMTIŀoD+/(&%(؃4\Ϥ7F}FQYxBf) |ܳBG~= M?⃠#%ڔۖfOLi a_ģF(t?NHtka#D>x O_WOus]Zj"P#X@-?p9ShtAЛ& -ҔIMK#o36iQH{w#O,⫗.٭'ڢ #:ds_3% g,[r\xՖN&[I>d_-BsaCzŋCj]gʗ@e'yȖ'u仵-AJ:J$:}$Kvc#" bOܑxtb-tʼn]z FP m%1#}ث+d%L1S8OAR6 evQm(&1$@qx3ZI[O 1G%AH> Q':(^ޫlҼLC*v:)K#~}5$šnd R():R }H4%Ќ2xPf,6̞㱵UJXSJ'LiLu!ճg :`}(@ B*Z,G@2ce׆Y4m#^yl;z]yd)`T)$D|>I72Q bؗ }(hO1ƠIqC{u/ʢeJ X'PL Qr4j$ݷJVdRm0[H1H)Y8mȰ߲ӧϠhjrn}ݸu>ɗ#;؟'(<  1UZ2 ǚXYm JTӔ#?VD<\1X\0켬c:dQ\Է;¨eu*B2O4{ 3$L( xR7]1((*Zb0gMؑҧ^5 EvjG{|jwW_=o=Nx6-kg9J~yV¡OD#P,B wf\{[2Gt oN;z]{"#;F.'^#"9FYY:\b73 ɜ*<Oe9@ pRBrêڢ5cQZ b~ݡgu2+U~~f\|JɊ9rEGs/la>.^'+`2Gx2wh|==7Q;lO51P+u⩖^6p:A~12k;67;R M{E8Amw׵Ux5`#cvk^yq(<09".Nj?HTsޱO90W,NAիu&sV?߼wsvdpfC2 VsNJRH׬%]8ڧ{frΝÐ2ˑtnSd'׾ n: B2=1nM(aȼcRDR~Ł~{3.N 3sWfvPdHR Z_yb +AD@lBz[&9>M1W7yQp̏D{!PD@I"B/'Y;sI3>%eJpYW哏5/ epMerM|G=90S~9X2(B>8mȶ>H"T>H=*  gL{ϓDA EXI}PԪCJ؅!f Hx5jŦ9!HDV"Rʕ3U@:4̩\F szq"3z(}C 5yƯp dckE5"7 Ǝ^0͏v Y)ܦrIfKfM~!;8|ffgҕ+x`,%Fz>E v޼e9ư=~g IG}Br(ܪsUHa憇ύc+eS,J%%PUs<~YWDF=^)qe4?C]<o 1J1mҷTٵCm<9vҽԾjE~(}Zᄑ~^-;ێ١>lT)p,$m(.'3p[!:3=adn ;lqqf{5H w@՚la~ >d24gZdX]U*' ֺÁPDVÁBHݛzK!y2Fkqc#lV0usHTg|yae޽R#{ZWVSAj-p-"GL| AVNJeܨփ<*<fewݾt6VUAH}/[ nϒU E,٣1T%1g |<BHg|nzL01*3ye"8RjR+Ckl` ^+D9(\;'G A"}9'iS>]<乧tAT93sBNC$%W BfrfE?h'OY`r6vb2oG6k[5k'{ƚhZTl! qC8\dFɩ^1 O*%1K+|)К4P+H*#r e#(vYCx!K;B0\rVJg(($Ϣl0O!&JjkPmBawo,Яv2CԷ&زA>(Ϻnn?b=y! {#]uXV֘l5%5:C9xpՀ2b'=oso5LB"f:h G^H2 a·*|F1u'ITAb_gY؍U ~meSIa!jޑ{왧ls˝9|PyzE!ȁrZ9gOdS{N3I ILeHF ܘ˔oA FSYc*Emd8}YW\ɖ^zb W-+p%@'dw ~$3dLmGC VtKդɺɶ]`,hçPpi.\tU*2Fھw|L" b ej嘮֘9ӗA9U);$UɆ[ںW/^:c<P(,AdJ,c}L @ AGE@p@/lMILvAfrFA;}N8f+Ё=Pd?iQk'Bp!@[4A^'!IzT0ebч= !ۚFSo !ʙ=A)8h9E9Ooocp~ߩO5j?zpʆ\Fڕ0j)UJuBObو""A8etJaS336fZZ\k+3Ȝ׀o \0%-ʺ;k_0Nf!X6cQ'MP0dG+rߔ0E6  e#$t*2CJM̗)nS))rxѵ 81\ܗ&:@~}_Mqb}ԳOC3xm$c"3Wa|A|Q;eҡ8s#q ]C$̄ar5) aݑwFu8bG! AX]iRmH"Bsp9?aƌalsu;w o& byaƿՄ>񎘝5܂*"#I<Ʃْoe20L2dBQvĀULC҉ GU5'U&%E eoa_=vꤝ8sxDZ2p 0.{_$w!Fy``!_a@.E ~7Ϧ;ZHWoi׾jExk_"PxT4Ҭ[74/%/_wgm:(*CCfc38 NY;d8W܁6 PvY{-'Wx9Pu/[;y ^H"^>Nfl1דwuu2,IUUʐ ,9|y)d9p։133k Yjalawq2YT)P^Hŗ9$Է> "f+OZr085UCpxcv->}p7?@ 8tkѶ@_1L0X ɵÀ//^ֹ@̜{;1foݲ{x;ACJ8"FǤrJB_ZMCwEܢ~oSAmW 6E:Qs?ݿjϫ21l;w)A>=4Y9,,ZML׉E GgE$, ODQBso;Y":@F@~/u`&ȤI*<()FIQdjn,-"Qq# #%ŋ8*#֫,E rGk˳PbXgP;)KܼB?mR!@ e][Qb,Aak>B|fKՓt3J^I6x!@>o Frux(9]`B t|''F~Ayddd|A$^J@dn@ٱ0$a~ɴ?eE:Ƞp7Av喭>gؐu Wy D GP0Wd(s5S-u@8` b_ۘq#Ѯ4@Y7u&gr?:v$ ه+_ǥo?Σ~鑣>\9 dPKH>{GpOeldL<B2B.푝Y ͜|rcf'N3_"2d9L*e¿$ڀ:H>ރ2"i ;OvWBOFz62a_ ըo{kP hV* oV5V@YW&1`yE R%PZEW0Ji$ITRrJU=JF Y㬙 I!cUW!Ju'R?sx}Mh^yRJv6h}q(",df0el!!U/o2e1D3bӳv@":щGk׮*dj2JmLur?Ęa0'e)7Ҷ+1Y Hm*}-iݰSȎFV跽I%r2_t^xE;4<N}RZ" XQc{&:,&Uَ>ewOс-̑X2$^*u۶0@/i[liyD{{mKBv45??#kVq@"aFiB,@{K\}h䑑Q@+ԩԯ,ĸxP]=Vas% W _l5籶& B޸qK Qt)\ :Ȯ5m0s<9Vt"q%IT\Uן'[`]J#?a-:H2h1} ZT:^/OƖN'+s @t(]EP68q l^C( lQ4.BƧ*7c Z RWȕrDtAX<&d d_2it Sg  DȤKIaRikœS92kGm$gӴSIqˁi` /釞{-?n &0$1qy,Qfs%׵d,rjڅ$ўzHR{0*SP;KFeg" XhX**|aPZRTAK!JwxB3dkqA^fkp}$d2[QDeG|G>W=#YEZ>Ԉ%"PÎwma__W,Q}tew8y?!>ZC5$12Hjz["( %vݷ0E&b :p\Vӏ4L W䂟ð$J˨86S[C%o̓VWGlzqn޽\#E]8b Sz=P~?oJ`Vˋl ~)D>%zÕiS}q4?S=ρ3_> >_HqP՗0W 09SdCy8roF(P S ]T'|f{dL0n޾-*[Y 22C/ (VtqaV{5Ï"g6 % uA@Pzx49dxZݵ6m=zFĴO&/jFOByφm$J^OS6oG?8s2zljUϯRM2\ NK})j˳\#>;y2\Yf\p-PXʢG9mYȆI9){R3`'p7GJ U{fJP"îV*{^{M }e +ھT*_,(CLlMeN+( UT<_އ)ђkl xUxCˈK9Q RDYT9e|(5=r_+Jesa3&R>ŊIA=;Z C  r"MGL |RmlX+{okEp!IwLaYGE!üsϑ\\A$q|.s4XK{Gd R@mU&Q(gNR݃Nµ8"Y$&+Y!N !Ȇ&GB7!>#~Zjx;"P)&$_olo.?z0:qgܹArQ33/@RƕC.ŵdP BAy[]ɄKFXdzKb!GdʐhiWN6m1S8pD9ȠFwi>O.:)5lpR W#GPB ?wd651es6OVs.<6QrAz1]%sjx(S&zcH 4#n$[[A ڹC9!SːzACg2u 0U"$dk9CL5 Z[ڬQ8tRh#thnyG # ҏ0 FЉ$I 19(WPw {$%N}o IQuk9/4> ෛnُ~einɩkR2xw)( ^ I- \-Gc26s < ԶX2Aۄ,.ٗ&TžuQjaxSd *u|`|Ͼ}/0A&UZd)UZ^*y} " EbNPoP)ֈH%WJJg1jlQv֖  u`je(ū E"#חgA^J)ʲ6w(h>눝yJJQ9L#E&sŪ[*QQQǵRɂbB* [ۻ{*rɎgp"P@-Ԉ@nZ#_|ma?g?ݟ^6%1ٙ.wKd"S-qoln 8~rQMdmwvkl1T~͐Uѧw}^>[ZTu@9e$)T+-, ўyEg uiǛusi*kCfk368vZQkd~7pi!(Y {{Eub\yVMP =scK]s` Y}E!>V̋/SZaN&`^jC[mwdUj) 8hWU&8+k*Gv@=Iѿ׺ Ҝ/l(1'0<I%/@Nl LY`T du"u_ ēCG6P%Tw@<3 J`%q& `F^5oeЈ_5 `?M|pz}H(N7?_YC6.> -BV4a'8Eͥ;yd=̕ .j ny)%5a摈<>e2*2k(ITP)pƿNPqؘd0 847H." kː6B Kd.("Fca}EG(摔M Do4s 4P:l%Jg4dVB@mlf㨍(+``L؃I}jz"uWdїbeiFg>#|<"&k c60r-;xXt63F8,2:ڇP%@Oɑu<[եr>GwDeB%)Jm3 fL {R|p`}WdH"$GrK <%8ߊy#r@D&"u3W2d*BىZ^}BWg+GU90j_"P*5c5\E|HVO}Ggn^=Jsig|Α*bvؤ5^C ڑɪB$$$(ɲ@:MwWL7,,?ԼD(qpvrR6!U]vR]z=82}Y : ,d6 [&l2!%2jCѰC:%|t+iqmYA~n=c sΡO,|\). %w@,o`tdPF}m2AHbyLMYC$bE#J /KJ,z/! $l~9 ZN޺2u((^zɹY=4;rODv 8Ā/'6?XP :!\jkeʀ  ews59|oX< 3N yMǏg[]t$i}}M~Z),@+/Y0dN YL߭X.Xh 9:eVQ +|FFSɖfۚ-҆Oj R-Q$3z0ZG0Jxz@ M(ɱ6(-ZWޥ:;UQpe\[u-"+|tfspuq3.[8p(W6D4:ɪ3=80(Ԫ#gMAFHYEΪ<9%W>m5 |mTKcORwN~hNT1(7?20_xUV\؅  i2@Ad8c8CrEd#= .J5AYY@h+Xuid~`n^YRe20S?A@CRpՏ]mEpQ7Ms}@j94g?TMyqZY[cNμKƳJv5 R Bj!|0eۡ"=w,gf qfXeD*]-8H-$ۦ`jxmaau/Q|'I=ydȇ!B0/Ńx?ŷ. ۣc%"sUO&琹;~LkS,bIU!{DHgY&wa9?9c[[^X))9~^@&J * $,L6Zw_'#y{ew& sEU-Ig>%+(yM\0H s Y u: }*мe*#\q}3fQ:t@#~᪍vʏiZw6!DP5Qg*%5>5gS syIE2: _fUF90SсcXB CFd`PP>8 O4P:R=2%sgɇr TtPd\YD2/$l1ئ,G){Z 0/ure(pTȱv4mUg'w(榇"r(c') ۯ"ԲQf#H,*0jȌWB$r"u}P}"P@-at-y"0_7xsG0Lv p+]X4R`+ pazC29Q2{HCMu]XLsX=AN=sRO}iMu 4Z^FwhcLO>@Ll8/NYly(ڽi{8d+++w7ƨ&VK6woO&x` D:$9qi<~-Mk|HarHnhs, A{~9-z}DP9 LR;;nH6Ncu`d%^ӳ򦭻޽.]BM.[yȚW\Ln{@v@"$)0-3K{@ښ҅P{ j#\=^R{(.K'(ɾd2K; X3="Yn;::j2_oiiyyMwe6P)M=% ԷŦkI:,HZuHDGk;QyN?-9:bNU)W\e`~S?ln|`i[m Ծ xֶX*gP.@9J_ Ύ!iu ή-[ji,AR!}8*)Q MN)pB,SBGP"I 3HLF3dE<̓c%CDK?]S:T:`c;1ZVFP#yp:`ؑZKnͷ޴x2JQ/)-ȹ"m䫰/&:<)ZdTY_2NTM X .e7 .!iX' yڬu"ъ p  @83A|#2jȟ!ty [)8j(u0 $G9ABSD)LPǺ ³=)dϾ2V.!G"4spJj}g!o:4P/mc2A0a`OаKk_"P65c;tE?O"X>W~=魵e| T x+6P"FxBNHʖqr\(I* I0x|vC"YV7eG J6>3K4'Q7 ErO-St{XTbŕF 䔥ڭI8ۺFՓ8`d>gM\ }ϡTX;o_'4NQ~%$ϞTYy^U ŝ9_EDGf_fvRd݄a@LG1fR&g!98d%!Rg)b!ce29yX.t^є!kxr ?~6lib@ sJ&}w(K!kT· aN$C@hr\D$G&*|iR2F@ZHpoK]}٥кݤ[Gw5"E EޗX!EP8e(AKXbֶQk[D]BZ>pd}"P@-G΃_xK~Ͼ9Ƚ 2Oॉ.+"/"G`#s8t39&Qܪ#/ST;g;gYkdHC˿$nJU;ۮX9%c"& m&g!2שG ߰]aζc[ߵK0|P~j?OQ ϒ_gdw%V:^r2Q$Cv1@$vvd旗 ؖ]Z5E)!@]sŏ{YՂ850w0̗W^yFbW쏿zsCb[U:t8)aQ 5b1Ɓzr=I+ M/@0q /*}jW4cQ4wtSz b2F3KW7mqMSf%-#"kJ dS0Ԟ{#:$Ǐiko=0D1#̹ږCBu_a||Ŗ9)J$zuG!~-F|j2R-a:,98`+< HJFs* Cj+[ӓM]}`r7a}&R,?xu1ek 3o"V>Kh4GV3*-N]-r9B#+W܁Z vp&9#Wznewse9C #V<B6vt3=W:;9k/"`/pߠ=s1͘;b ף^ 0})@ )}+#e=('AF =ڼ1rIz󒁖_C0 A0,\CK1Q9=@2aB=2 (2t'U7XidfU{k3hhMh`OdgOFlvjoOQy4ɜ 5b@m/̛Ĉx)K,`[=PXN=Ϛ\319>)0b>*eAI`Q==?b,T  OZ Z?~H\[\ +c''gd֞S6;~϶ &jV"䰙2c23ȟR!X2vq/m e/? Ys|=3H ]Lcnv;PwYLQIa2)/zS/v(9 [bSJ vtMG^dTK@94l'Jkӂuݎb :?E =H!4A=G]ԲS@Z.D[/J )*G+qĩ|DTOab ^_ECJ䭛kk3#k95|; CaU i~ȣχ(݅0FF`ö64{'1Ϙr@ZjGF|쇰"W6Y{g'q;E ؠO{V](Hg5i:o ֟Gvv};&R_x} .Y lbaђMmd$ޚUd3\qW- 9; N圾6mÊxށ'j)@k^d{( C6=0_ LɄ"hgVDeQOƌuL LAdէ^f)jˆ[7,ݩΞT.B TO[;mS+ګ_'T }(j-Po[$p)R('οh`9e^#?dnfc&`!P*w/pF+sygQJex!Vܭr%iefç! ]) x(s.B@ EOH<1(u\WK:&.1saf3)eRuP-5ӻ[A !_=h6^$!Ff_P85]Lr2֚`6rW-SF\g/]-]蘓.;p d ,+bp1[_'b7e˴4-+kϚ XVe|N%- ~ IJPD)LN"b ҧA ͋&N^19AGa^$k9mPU*LL cG6?i%rAkJt!좌RSs%*EʸhP8ZlCC=O k#o,S$;_aN]D!!BUדtr-Oe)X(+[_I6 /Eʹ)=Xbqb|y2JGZ2F]iCwƲIםFgVWʛ{kMa7-4׉39'y#<< "*]Mm U%-)fBrޜofy]I&@7✽o}[51( ~&^ uOx^^"v{y"E~穕|$"2+'#$)'}'{/ Pqpʪ *kNaL$q'`Yc6kH (cnzƂdJCd%qU ;_*h`C6e9<8ss\Fq BYM 2Wq[ Dv1c2f2 q u>j+CvP[ʄ> ZCeٵm#9[K{.Q0pƶK_E^9J)P F]cW54Yl]tOgsO KGa~˖_JC1Duw֌K 3pKe ]͹K%B,@lǽ"c=epe>2ɨA8 Ĩ5ucc<')vB%^ǐF>hTFO‡?g;Zο>]\t3Nc@7 G,@舟X&"MrS9& +HM/kյ;E曲jmda'HRdxO=uʕ.c8i/ R?p\cX֪=Id(յe*}B#mA^*CHhm1iYRn76ӎuLb@i^+Ґ٧,rWSHͱ&^fUx T٢\g|lFs OAL1DU /%%HV:^ ` 13@f~=cQ4~2APީH\ P2-AlD$cJ).]@MC.PB)yDr\gH,D;RDRAʼ g.=T% *M4mۍ J:^!4sA-QK2cPux~Nq!('?ZVBIm!r*u#leC Vh%\23K}^^xxD#^6һ/^%Poo^/Y XI'sl(Xf /AWq :@[q@#F6.c(v~[k3S-@p k6$QqКMmR3egE8.@2귮M"Şq@b cNNu!BC,j|$p+S$ 6IE(ӚbS- ڐ8LYueD"p GXq_Y0ok64XW5dw\nm㘪5wlvȃDE67&&mzz֨Gj';i2-ȑ LJqudɥU(\3K#ӊ:I@w?%}Uk/ Ȣ4ɝ@ޣe&@_ 'rd{KA )$IKL?7>;|}8px׾7X]YSfmSN& pĒrj_'In^]-J uU܏]~.#H#,Υw k0^d+tUHrU+%$AU'[uOPR;02?WE1'VpE,mUյDSj bd`F<7d;V#|>uNJmW]>Ts"UhGHkKQƴZcݥm뛝CĚ/ -Q7V?=%qޘ(c耜 3yIY2TTjMQ1t_\KBہ<ѼA'eDũH-7+9\xU"Te"X)2" x@OG܉(S'(Zz-j!W`98ZV!"A/KAgDDQlJPEp2'|#`M(zzGG*S2P._ /إsWāL 5|nt(k:1#f.լ2l?=oE!\?x"E@xEWTFn>xri#H>6%F~-AE0f+,LѮPd9KR o6n, XW> h5j2d;k˓sm.Xunn*;9 6lrʜFTsȆ2"I+UY2gIӔ@`@|^dj*OzP5M=y\xմT2qdp 1 ϡƫ\JX{#xE^[<-09jl׾r*pMO qLOYkcݸ1akOV=MDa-ɨ߱iݷȮBiv|9Y2\2B:ga$V' Bʤ)egΡj@aS%x8F$|$6Fw=V+!wL8%Mȗ%?'qIM5e7%qFE7ql{۾ yq^Gߛ$Zu+t~:`TЉ I}Xˊ]ZDD4ē:RU2 .BbT ~kEΉHme9A  j-Lw+gR BF`]5~^OR(on#cvۭc8:laݨ5@󓓖X]BprܝY k`DvōcL9~ZQ2E)xHa I|^yTLE}j+eO;Zz5ν6=oWhߘEiG @Etb #ˤ#^D9gs%őX7 ֚uCuֶЂqJUiO>#3("I>=xRTJJG@H"A5)7uO VKtD "\!T*S}Fl}siD 9 F=cEtl9LyY®]Jۤ^ ̱z uc(Ƶ0&_tVĤgjڶOm-g?0q ^^xxE#^vԻ /^"씽/wCmfj5.]9C:*`MdϜLomjdTǮvu.g.HˆɬHo"CkTS=y<3P 2V-j&{q~ 8Dڙk3^,l+8PTy]<߫T@_04I&M as?OI竦M #JȌᲁߴcG8vD_{,O:9l.6zg{ƣW no";ꬣ:otɮ/Oxx(hlv"PT}H_=ER+燐Ľ:A%GTϱd8D@co`  ()2QysO ~I퍮$AhGjM CkNjzn\Z__&MM*/n()9' P x$i ͕!RJLL e~+[SsS/OX-5>sZ2g?M0W症H8@|*+R F]9V9;{ё^]FC:Ft7exlMTf)-sY3\a(4kp=iJu"ZAU$3"̵I:lqKINy֖:0W^cjU(! HjB|*_f1Ե) !|Wpe=`\ R&Էa[e6tt[iLW-#ʠ!k]@ħT *amIF|)> aqS45 =L[ʅ4O,qTk+6wGiX%L.T _$پBǗM֪Fm*!гM2A|"G*D۟|;~ӷzE#"Ew$q w/^^*`'Xh_w}W7z¹z2{[Ƭ։돁4YUzyK+>q=l[[eCKB6*Ԧ?\!R/5KKsl1!t 3N)3Ϝy" J%Vȫ]aW>U@JuY6qAٮ\)&Iw̝6[(fg杺ZZlrBWʹ2U0.)PKf˨ 0u* | JZx!@ 0Tc>ٚ2I Y`3LVYLP:") nsqUoD> HD1j{;"kkkk_}7x:dTrw\EGHu&*A$)b#L#۵$ҮN]toUS.jQFP]WXN}ßP۟|&jW9@צ9D#AFqC,.3yXRIu5~5GK12;| s.m_0f)I 02"R8B%9"(A5N3 >7ܓ@`m?`ͨ*vUƨT1Xw*J"חa}1 8eBB1Upϱ`2y-:t7tYr8m,>ђۣ6V7W'(pgH?H:Ho@ ?qH~g)svV4po%z)TJRdx3Z gPN_ Už5vn<"!)@|v́(9"AsB㤵']Ux>P D9Mui{.b, d̚#6^K_>bؤ(׀fIs΃W+);!)Mhjh"|MߘD% O!=+^1*Q U:h[M{ŶfU=]__cz]XˋWF?EW\.?n#'?r(hH^ 2PI7$HeP]td&zܧ3LUPnlfW*(Qv RaWNR@ {Ψ>`a2[|M$Z%f! d\9`c;qU,08GEmMAș]s5#Wdb,52 !M)ɡ^1ިUa(BGY0j76X7,777|o}K>_t=/~7Ljb-P\fNfU`FY % "sICR֥HN^J$SX|i4*~0^Myz1Ki˺By)jme (J-dȩrJv[g + eؘx,@…˶J% s:"Ŧ:.;EF-?J-8o R*Odlbkf1p%G@5Xj"B|J?s=qd5H" @IJe Yt)"ǦYJZFLkes]`#.`5` UCrޘ{>(h$C-Tl> m@P-QG/`1`lE88cqv4m⨥DHk-Bb62uQDj.aX6Ə3$R ]BsJ@^ FƝXS0-_L(/SKa:!! 1aln/:Po&{_mϝE2G*}-7ӥꞶGN<`\J}f2\皳'@a|.[ F6eCDY`ʽkj{mln&j$(~dȹPL3kAex^DWo@|D0h~ʾo~2>$E(,1JHq6c@^O bAȽxU=WyD=] D0~pHnHui=Mmz$q%3y]gܣ6@Ҋ 43raQLKJHnp~36i3ۣϞ#a 習ی Vd~,ro3۔Y"mVw]V8:Z-WȜ+S(t[ݻO~~h楳*q$7˟>X_Dof0I3@U{sicbV@J0 tKUDK~?z$[֎^jKHh'Z:J(fQ@v8nV4279n8߫sIώ 7߄ؠ`̖<>&*TB^%F|(. Hxg9vvGCICO'|"1msp"ʂ<1™g$}hHvmKO.7uwᄑ~G6fvO _ҫo~~ox"gˋ/| }]]YI * ٲ,YTf~6\@u.ثf)S-S;PP>αؤBT@m>SzbEˤ7#mwY<`A-?Fg.ȹ#55 t9- vǭǐW#ݦ+*Zy#TɊ .r~WvRlCHsȄ7/UZTL2(iΪvy28L}>&2KШLpO7@Nu٭wi@H~}s eWʬ2PS0R{^D>~5+Gj;Ne0 H瞪{¢ u-YN]H'eu]R4艫rY0) aį_uԮ%>3/M=؉Í--Aռ'"-T%!#}=\ 0^n- @IDAT7T07Q0ЯC%IׅLJ " ,$9)$e;VvqG^(p ;C2UnLk%q(Y]BtR?qgcH.b>e#c ,ńGRiA!-l#(*YX.҉q5[ 781 ooT2ljY_f+KNiVUv ec!ڽ&P 1M6(P;0#F;W֜Rkiw~{`/gbZړG蕫(ܺ慼vPhqrڵ:;š5jQ_lynԨMM^ΞޯO}//?×K=}hό gO/E/ߊ8/^㣓[>o"%6UM%G9Jϫˁ3K?hq4EojGֈqaΞdij]E$6Ġ"#dGo>rЧ:::_Pvq_oph/mlmcz[5sD):UOd!PGEE!ʲFXH>d\fη|ݢUuO,%7^ S"#ׅ$D"S_2~֢$+h`n>c>LԴ2u6|dv:/zģ\ ɧu0N@ l-:loQ^ۊ::\D2AwT.(Ҭ=F|σo@K vYow?Ǣ_ 5{Nnם2C!-m欹.\q b.⤒ }oC3uDTKYGTOOh\(ƍRrV׆TBStnܙX#3F؉oNX-J+g/P:`>!֑JJD[%{ѓvlVv Lfkt9O{ʥQbiÇ\c_|;Snv?(I՝^^x"G#x"E6צ 6ɚ6rgΦ =Y v$ @p(jSIer*Z dܥjy|;=2Jv`{聯b*HkB.d.Y$ Lc\`f\[Y[2^nGl?5> TR18OFFzQ %\Z>m:LPh[ 7*WSF*O?Vv'S bB*wL@ Զ\ĉTY)I'zwRpd8bo\FٵM- by3::~ _ -VCvDq D%[s#g=}8 ^:$ԃ( r("dA⊮l7Ӏޏ"R\sW.X g)@OEƮDQMB\AOW?{yVW~GFf2} ZaVPBS^XjyaU*J()⫡sYm PvZ8{o@^2v9U#*Y>d9;xͶmflN<$u.'@[sʩXrOF<nh|@q:hMsRbV=j x(V̛m[1ː!:DٱiA8铏Qkt@$4%b!J{R!*|>K O!]zI林@u97-X!tmMpHr XU,b%a+M`;Bnf v{ꩧ\UnqL5W_-84.JdL5#t`<2W.2`DM4:}ֻ-_?=0bI]^^x"?W?{/^^18c={u nV80fQ%*;'O@^j&c>e\}]I;~!ȃe'mW? Ё7C.{ء#GC6hӋN-C T*c(ix^\$.~wt3Z=@Ԍ#vVV@[ )*lWC?q;s]w$EKjV %Y!Ktv@2Į aGy^ OpG ߩ<Y\e,>129:Jp*ѣO=4r ~槍7LzX Qi+j(gS crruʚ(bhcASo@Ѻo^o#{P=Ln,XjK]-)VFwy'&K￿|量$zkkoGϤ {Ț4$ tp@VE*25 -p(VA,@Z~閛lpO~B־A{i`Ϯ\bUc3gLT,wTCR EƮeh>Ϻc[]ZEaDlz~:i33 eZ-bgf.e|Hxh,0f<*Ad ` Xhmq?)TV!SA$Y#i"J -R˩6(ZAsV9Ky@Dʪ9e-RB V@y9I)8@*3si%ZSfMCVTmm-gáȌU*gxN_"rNU56*cC`)q8ZGg[c?\O~Nོx"E_Oq𯍜9/^^v?g?Ɔfijj.q." dJNKf$Y6jN xfȼohcArel+^B5ENbFo uݷM% N$I!{ni.x hD&21AM5@["lc_=pЙcp`C0=@iFւ!{$%!ZJmN*㖻,C]^8gV$r*2Y6izg( {HNi.)!QfZ]vj1i꒵6JdixQ">Kx0-.:!yQ+!"@R@-S&ۺ anII>H@o?lMVaAPtO~4x,xBOr/}g~5 zzf2tjwX|T/I%[w@~G<7Do3h9dFi Vr"CֈEV}OO(gQ[Ϟ>Yc{(rO5葹f}s+JoHC!dL\p)֟橘7Y;tjݖ) Х뙇˸( @&LX5j+n":(gRI;, 5TRf42džsl5#M"d(SBɷG!*fⴹΏ/j*S=qmj)tTKnD9#2%*a+Oej騮2꜡ ]X:Ektb7C3DTm] **\] :дwL#?%EU]EK9qR;ؼxGM&{򵓏ԯ҂,* 8&b [?@BflA@ڞue %@m [HDYreն m2fl6=ukib롣GT47b8BB27uc}]OYY[tS-|f, 2ju2z&&:{;LI0Тw8w#6zuj̃S6592]-+ԋ m*By18BVPj˸5T -P|4P܀KvЇ[]/8]XĿ_Q|ȤqT:YOuP9M*hrO476Џ)`{eA~D={ͯ.PC@ :}*J*P K;:[/θ-5_F@ØE鏼oG.L g*mn~i&{:RF30PTu摲)d~ccs:;豣ixGS(_`u{zme9)tv_ˤ^9>ڤ2!J ^@?CKA&A { ɣq W(ro9yeiAeFDN Y%Zs*Q>H9L9Sd\j(r!9e듇=5g |i\k骅=䶻ft) %sWD&g#c3`l]8RG2l^:{ ~}J鯮.BK\YOS;uVז^}~2Y?NOd@ aԶNw 'ruvt؞AG! eyO<$ zRцj8ke2 e+3` .3 FՑ?mJu1!xӑc#k1EϺۺ\;I 3 $ HuIIq(/)[ xT* pAI;OZ7%I,@%' )7Jd@s"#뭾y>ٹwŝ oh@@%fv @$M~2'$i׾UQwa< }Q]3 nnpE{mo`+ߤ>LYZEPz PRC=>e)RvG0(fk7,Gur7ӯ%Aƚ(Wd:9L-w*pPHsP$s}:IM!(7KY E@:w<h!(xg Ƚ'rB D(-jInHs !Ry.Sp:-1%DRNI3F?9oNǂu$: KA܅ ʅ^Z7 Nf C4"e⣿՚Q@/ųWLj?-]URLXsR<0hL.,1mNCIϹczx"E'q퉣w/^^fx;~llsjGybu}iV쓝KlmZ- _T(aw3sPmZm;+EK\nWe%2.^G:mî\zMN<2}gU3zLo72ɴ:B6;;]{ƮM`I(owƖ=NVa_,_̢^y{S(6[ZCe`]ȆLgH *۔e\A& U+ϒ)QGLL8BAp}/MLuW'3w@ ;l+MoazїIee?qr0k!B;9~$[}=vdd]NcV#.Ily#J[DRY#*}(E2y CC+XВK?кl1"xtF+3)(xՑ2 9a'B 9!)"@]g$QMQz)5EcJB$|K<7J! 9ŜAP4@"g,a@4Y]uY*yBě)5|i3a{[ohnHs 6V*df)2<wt.ſSW&gZ9Wj*œR!>遣>3Վ4p"Eoc<LP^"PӳqO~3/Wj~J ǎZ@BW6v@JL)oU %@ul;(2X$@ЌU[ˀqbrP=(3ZZlpp]<{ ,ǦhPd!(pz/P  (߁8s |:B{|t 9e ?^Σ^؀40w``aje D)F!xʀm*: 390X֖HOJ 2%B>~mHz.H<+(r{#uI3ո{.>P"\k ׾yyv]xު*{guO^/Ө"{P 2 \N@ʨ+~w-Dȩs=^UCGR2|d5UԸt9 [g&ܠ! :ȉ(h)Q[(?7~mBdYR2h{}ƞd*g: @O5$C%1 eUg)]ڎE~ SVuPK er9.Oq !<JLv Xyy zN3Jȷ<%c ҇8UJ!`.bLBB$Hz+Sj2H@<68o#oSGfX Yε̈́S`ir,.Dkzk+(weWy#K7&_|ԊU*(;:)D }8l3 KPAc č+JeΙ_3}##=>9qkz}km|?򛣗/.-->^Kt/^OZD/sַ3+lows0h1r>;gsBYTP\vʕ*T&=qRvJ[o2s\HꃘmbyfCjvv[&:$}r i*x;"!҂XRƫ9()*yp_^Eߕ_೑1QH >[9%En%;\Q Xc5Ք_qΆ!ҮXƗjHYĜ/3v6j|" cH -]d ($dC:D} ssE>(P7.[ < *QTm3<*_6=Wk9)Rb0.Q_R"mk׮͡L +8Dbo}%gˋ/^^x U^,#T$Bf 6?7ƽLmTei}]Ȑ k(zaSP$lѢo\ܘ d} -Ykjv ir EdBͼ.To+ ف(4LJT/IaɒXZ\^`j}2cWן;?`W>r2]\oG}GXڦa!4~}[Z5b828b0D6rFDRxds] sM[˅>ySbFtPI,e8l~ZzZډQ2AeEz+( t%ιS֯[VV|MקbɇO| GF9zy>ؕ/K@?g/^0 /^ߟfg<1 BlϳD𩬫 hadVSW)ң# Pc!_|jeqqfEo+l&K Yiy$~e@Z,@;,|#H֬L}PL<Dt*CCi [oq@dǰtXߞ!ke@`هUU ˀँzl++["=2( eczrɰÒ"dطEUFNUн%vRf%1j!px*l CJwEKM 5=r/}sW޾nv9q]ɧAEys?s=Bzz7)G0Tgy|tښZ/Ay{Ǟ!>K^/Lb EC[G jN1PʐuZSC"81w85k1J]ue5j떢(dEH7 yP<޻ ]=yƚd^٦Bž{Yvm+RPw_;x&;l7 59E|r Dc-GYkt$c{wf&ڿʫAJdʥ1"@J$PiTFbulCISJG ZLʓA$LMT:kj;˳-d)* gҮ@2Puc*a⹡֧~\&dHL:_w3F/^^x%IxxD9}fvaЩ +[wK#H*kj67.|/ _xq%Ϳ⡕塹Tzrgܷ87vmWOV@O-" j(꒰E}#`ZmOgJ6Nn%MN:kh3A}lyLo'q~ԍ1(}y$@,0d!L̢cdQs4BĂH -t.`-Ժj_糆ZLW^()B2#I@5 )8@uvZaQ'(S)P"wsySžëBD@W1OC0?%^?k|_ngr'G={BuwR٥y"Oe8}Cl3&J?7Iw]DJG7;(ld9+@ƠONԮ0O>T>xXP3P߾~J"$™<`Fi<:b@d/uaՉ^jQZ9fxA(~-:~T,[ZWi'u^MSa:P@BUڥI#oWyz̪*"(._g(@qpl>vrmm ]".2"Brvy'0Ju٢MZ)i n/-S#u G5]\Ȅde|v‘zRh z)vI&Rbg'H)Dh}~\E"";1"; {O"+^x"F#^z"E6C))'O>wq#O\`k)2yrfYZg6a*9POweҷٌHI]H ` mdmh7 "P*0LmkX%Ȅ;d{F3G{" j1@Peӛ6 Ri Gl͜ƞP Q׉j 4Vr@YAg* |%YkM!+0e KFOK) tx~رcYz_;F#W^O5| eeut8͜G_VlcA./NU ELEu4` a'HƗ@yy{\K.ޕՈJo9PA.0gJy'P32s2'" 6_P E@/0Z3RjURF? CͲRu[p|Q R!{@TsL(dW* >QW8o>G^/E/Cg& Ov~o!4gBF-р!eGkMJN ,aGeŌ3kۨQ(!I)Yz93w&(EJGHn14b`Ǽ~ bN~(A~@!PTdc)3K3ػo?^ W)r ~S *߇E$0?KTlnveWi:4j- ekE%V ;x-mvfڕutwH!i{e'RI$F\:BdCEuhP b 6?,\IO!% €;b{OdcjF$GK?F2Oy% {y"E;8;/^-hn:oo~3>:113ɺG( @' ݝW2{iwPW65U(HՖ&_Y{r$ +e6}I Y fa$^%k- ڪuo'nbS>n:}pDH @gxH)GsY!ȍ ez @H^.AxK&ɱqEչr]0Zt!|*| u _oii3i𯟾.g9]]PNmV׷XS-|j!HES&N" * "]e3x!Sā|( 4w@zF`[~|Y眚j۹Fj_z1z/yUSK+QPy>W+i.jZJ%:mBȬ76Y'H([)P6le~u}X#\..$TQة¬\is 4b5tw 3t9 *OhCGl}k{n'=(bvP)P؀IcҚ[liaޕEJ׭I"7őrt/dj(rz+SLK7 w,Lg;šTZG4Aut>Kx^x"G|Bȋ/ߞ(H$/8X 6nAH[J]jmsjTRDW6m tu{e-*.((W3?f]nH,nű)U֦g0ҍ) `&}o%h`!qvp<8; Lw_޾}{ou-KdYdacA0`\I{&She(Э-Yr k)4Y?|Vp[sdToeRlE|[ϭbBO]h{sF* :Exnr͎;?ώQ>fu;v ob6{ݮjsx3Q +ed3sB91 +ܭtszz]gfF?ӠI ig5;IX+y/ EJS8%#[hZ',v420ƞVDjpOX,m 4'uFZ4̬BdbƓ~%T)`T1#:gǽnFat/A(@ce\ 6TSHfh0pLSܢ3\'ꃣH$(OcC+q\%V[nzr2 lr.3CA0ks8K Ѡ{x۱{/ӌe(kiP`͕2梦4p <><1AFh/vށ>{>ƒEx70sk4 $\Yb3=ΰϋE80yx4C5gµhPr܍jiչk/_ ^LGXs\n\{VG2Jhv MR,Z1xŅ} [59MkqI-ՠiUN "|2o,V-Z_oF_0Y0gP96; GDf QuV@V $FB48拐!ntq~EOfږSxrvJ43 ~ħfglLFG(HVk0|nmǛ@fM.x&[8{G(`>HQi !F91SXot{{Oxi`(|eEg?j)ì[G; QF[^b5 zc:w>Xm^ػڷuuvM[63rׂ=u 1  6Ρ@hsM _:>>A <%1Sʐt mK s RY#D5R۵YFbHq^m+y]=i"qњ P4د v3NdI$[a^yʤ ' τ{ Z5:hJyM6`%h*6E  RׅP/#ο[S5www}W{׮]?E@D hT" "pXȰ/|zٷ6nb6WYc8/uwk1Ls?R,yP@ f(WÉ :fV4}aϐЊ.VwDpLh/ƊxT#?fK\_gck-8TP^ ѴH-_zE3~k~r'?fr 49Kf>ڵ( fj/N [%I-ǼuHiP0/5o\\h`Pdn$Z{[-O׿_;k>>Uo5kٻi˃ֹߌl>sw/wE{z34J34(\_MbPAoJkb >E4(0Ba͉>"3 Cd06dD; ??I-^ CmXm%RWAGDN0u8rsY}F jiP(Q]7ME.N4ҽ]w> vMD@DPpQE@D%*\S۷m\>E9 n-O1#$B~Pf^fE:z7u')4E[V)@I$mMy+:qS%)na{ڊy?\Uo?:p=_[6?r>u69=j8c+̔#kN2mELLŎvHA nIz|pT[1^{GW;lŊ NJ??_q p3ݩ7ol,t~MS=д g^ 1(G'3Y3')Ca֋ase<ךb6w猩.[  } Dݧ޶L-0y017-ˆDbS:28" 6f`֐`7T1 KPxXEF8 YvF\GQ+[> ^779"v=ӍbʣY$3.LIsq"31Q&3/5EO`)xyXj QFcQ,yn1@\H|P'&rG^W|nժ Əí]8-`[E@Dd&@T۶m۝ml⧟~u xqE./ 8ll~/ ;EXBgi(E_4"ȉĬYrA _P!˯w%Jw"QHv{p+2 Аo}`A@K.y͛sw9v6e#c?:6[16 Zcbst>jf[*~eh_MqӦM/ۖ.=o8- oK[Qwvtt b!G3+4BB_U@`+Lx75RX!k#Vt)0U w$ A n Hb.lh\L!F`4B4:Y}{ov3c40g@ -1+*J+i5mG$H<,͜Q%&" "B`ڵ$;}oP73!3NZ)JocUX!k&&E5RqVn<$F11dڊ@0g9|+>ص`pe]6INu߈u֭-qg{t7=߿E/_>:oK3ٹ u-ȴ"?Gz竬vNμ>-^o{ s"vWN}7w[fi ) .jo_QH Zg/n|gJ+K(E^C;øΊ׺%+W'~еP$0ߵǝfqwp\~Ug762v. l?P0$kπ}P% !n 0$tETjPmvJ岟_TOd ,5~mt$DŽ d\5DM MDԆ>O*hb9tnޭR(h'A<}P6֟SoG˜<`Nb LO-ҲDJGI0P1Zr[{M&/2 ?/̈~~iIǔ$F|ДHq.0´zOSXtϊ+EP?yLvqb8j6Ӝ7lo:͑Os67u]<ᅕJse6?w.i=W-Wliiήh{X0шimM6q"y0 >(".yiQ|^ O4]Pk;nւ޽FP6<fH8L:=B3AOm8AUL6b` k~P^HcSI y ,{M05;5d悥@V`͚!ó4  V׭qh%%&ey \wGzsي zY{VUX\pߴ:.K8DOgf,qmƂ`ʚ1*QvWQnؘ^kV.;3ֹ oZ8|N7kx q3E@D@D@^ &_~fsp8=w~'lanūǗ,*vuUCr˻-[4_ߵo j-2A*m[P)>Ժ\;! zs*dbgT pBb+\|Ǜozק?hkQ㉧ oƊ3POGSLY V *xob\gd!@SpL)_P@C F]e,Οk1W I1ڜ V1ndcg_|Y8 ?u4mBO?f+~˃lfK'-wfl2up3mH$c흹tG)<]-ȄEК8oxfɊ [4p i:e_O`Ӧfȑۇ_Mr[\.S0 ,|\̗R77|cǎP>==ӑW^7m9=u˿`k녯o tTx$(#g sc 6N1M& d!e@|;:#CJ%I:0=,Ba k"PaԡBj矷o}?W/*lqfbb㽭v҇̀?n_k&" "pP{t" " " %f'?sEb>940(Uzɒ%O)1+ſ N":ӑL.)}_w= c%VK4-ɡF4# 33saJc4L[Ow`.\HK㱀Qyh"^SY8& Bd0eBŭYu[xW]~ eUW] ~E@D@N!jBoNUD@D@D#3?Iy%;绯|g!Sjnv6OÀXH9K| U< ,rvΚ22`S8 jH` fX"b-1 6|* [3Qr F4]sjp;w% _G(" " " f;"Ǜoёя4QJbql6GBFLe3 '4 P |0C9`~ 6Ax"͂ʃ:X2K(ETVDoqs1-^d'']y?wTD@D@ϋE_:7}v+}f2 39H5 Ѽ LeH'({?SXB6StA? ATd8STP X\#I0AC@tnmQpdYCK/ڰC6\~ezH@]5wf"xmٵk׿0xƮL62+$AUFOP<ż@m@&uMIb!i 4Wh4%reܒa7tF? E>*O,9s}M}WGw:50G]IHA{d2ᆬPȽ>@ag y'Ny 8|#Dm4Z\* !%W6Kg\w[ܥ]2BBCu&B#^}4M8  88%)Oҭ?~_IW'.q*WȰBB -A\>fs.v8^jB:0FGHY(d]_w /w\"'ڻ:ze^t^=sPjP:BFX1rغFӷ`Z5 <B[:aMθYWEhp(N2B6sQbd*!b{\v_~OK)" Ǚv/" " " L&۶w{Ϸ/{`ulq>ZX |i&3{^E:1՚>7o'U"`{OL[3=]w-ZtƑs4 *|<]D@D@~j.Z4}Gcl~ /o겾uwnY=2:zsV=o|s+:Go | i" " " " " " " 3T3mL_WD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@Dd$ ]9iNh@`M_9z;up#\@ 烣)Jl=bE@D@D@D@D@D@N4PMz:Jls8ͦB@8 _ 'eIENDB`httpx-0.26.0/docs/img/gh-actions-fail-check.png000066400000000000000000007433041454054354600212250ustar00rootroot00000000000000PNG  IHDR 8g HiCCPICC ProfileHWTS[RIhH "HB U@B!!ؕe\"um,?,(bʛ;?g~/wjT+ɗŅ&H&/cc?Uh 咋*z q@υ7bTgKx22 R%Tb%NW MB]i<,&g3!u]%2|Oq#rs+1_d3}\TB˥9g9(}F"9ú]Ϟ4{$1CN,PCRED=jʗs`bW/$bS$9Q}z8 1\!h8X(pV˦ [ϓ*O*"!wu(!Y3F-'EC 1SlDA"N ľBIx! rbEbnW"4< pcx|X`<493nY=`Cn| oh"Wf-?r;+ Q1ĢRǚ>TWȷ9_UZZbi8v;5vkZJ<VѠ8U<ِG?Ƨr:n׏|a8ӥ3eLQ> BW9 ;~Mb]1|J2g G0|Yc YZ+;907 @@ H)`*gf`-@#8?y[ptg:@ qFo$ E8$IC2 @f#2dRlFj_q,ҁ@!K45CQ7F#t Eh1 @k]hz=^A;gh0-Yb.7bT,asRf?_:=N8 w+8Ox>_W;$~ t)K&2 3%r6)oD"hO1EE\J@C H$c3ɟCI%].;قF#%rNEcr?EbKP唭fJGSY j=6-| ZgiӜhdvvNу|2z-.6C{6W[=OJAs[gNN~ :=];].OwnAk}z z1zzKv{Oҷo?1qe@47d6h357cdXhXexذ1\fs9s*0aaaK8p #Q+FYơ+&N&Lfl49e3`p4EMLLgn1m5337 77;ac422_c~ļۂa`!Xcq)ːf*X'Y ͖mVVV XݱZ{[gXno3ۦ-Vd[;{dso;j.;78;NN"* Ψys5#\..u.F2GF\8qQ6RGuzgW׭F7z/ݜnUnaܛ_q#qux=Z<>yzy<=lҼyxz/>C s罯o>߿\v=k?V8vV<:-y5AۂY]o99c!XHxHiH[~hbhe0̰pY"+#q͸|n-w׸9NF"#+#G9EɢǣǍ_=vm$1pcV܉͋}qB섪 F͎;ψ3MBp[Ė$IIoCW%wN5q)&)┦TRjRԾIN1d)S j25gi:xҒv}jx}^>L$X# W ggx韹:[(*9J񋬈MYocg$%K%'O/!uH;|"e|)[  HPPR:i撙Š~jm9{{ss6Emg=x^;Pd/sU _/J^\lV<?ԕhJb%K/\*(=WZV^q)鹟FTem=o\A\!YqueVzz55k^lM:+*۬_cJUp՞j%o76\~٦M~|}s--[mMz_jl+id{玸'kjkw\^)wMվ;dwSK==e{^ާzu_侖@i0Qٔqpf}!CU /?B=R|dhѾcc=3?hrON8v*ԙ?8q}3=x\y @g[ M>c;\ xRȥ?.s/}j&_.F΍7 nߚpwk=kg?v??*lۓCaO'=z&}S_w߭{^^ \c^}m;w;{?!I+>9~j@'㩎lhF/@Ogv< 껩 wAx=D3Fl!Pwyo 2582 1160 B-iDOTD(DDmC@IDATx|U#EzwQJ/* @zQA@@@@@@Pl@@ F@@@@@@@ ZF@@.@0? .@@@@@@RTq@@ ,@@@@@@&@0 @@U`a28       h@@@,L"      '@0l@@ q @@@@@@ / >F@Rw@@@@@@H S@@( X[C@@@@@@ XяG@"W`a>;@@@@@@[`at?_@H S@@@@@@@ ,L>  p^(y΋      -@0n" $deX@@@@@@@     X87B@@@@@@[`ar 3>  @@Y؈      \pp  @ X:;w      )_`aF\!   rS       Q,\lL1G^!SLIi\TZ)~D@Hʨ       @R*X} oL0AbtF@#@0<}J+HKsdӦ)#SLRh{^7X+$_3g'v(C@@@ \tE9sfɚ5O._/ #pi9|=zT?gs^uċ?~(lc_ЁV쫹@- E@T _8Tlۑ'PtIy :  I`JLmvYrUMnu.YR *(rCmdݺ ㄉrUT_cr]eǎrp ڳG7_p{'7lwM7&w Z6lyǯ?O" 6iZ6oGu״AŊI澷Fzod]I,捪 /UH͛eگeƬI>   .6mɛ7/ N:%9oخ i0.~>D@T }^|R2yر~n!^pY@@8?,a|ƛ>ə#G/X(>Y.hv   O@&@@'N{> p6X_XB+  @^`aF GsIࡉz׷N-cu 7do!B'7^n茙;ɞ=G>ػj®{:}B,͛GF}2Ҟzy܋/{ :ݷOz?Gw~Cn }a*,z5/gkƛt'{DҧJvIve޽q >@@@$ ǹsL( @ػo9\WR`'Xx!97 Vhv|\>vyf X =BX"֦S>3&ܷ"T|_ɐ!_:0 RZ瞑:kVo@w(Xxcy7|%u``fMdsS;9[-ډ>4iҸkw6F;X7lv?iB<>f:%Jk^j\хȆ}   >B JZ{@0goߑIul0|N<[ Ν! @ Xl*pXred6vzYjl2 kb,],P@*N~z"E I/FgCJV-~ >3S,X(<ԿJ<{\3o=}r\ 婾ϻ}5m˖b*wwh"RRi9֠6xAw+ՕY2KҥKٮLU-YbטJr7ltp_s!ժUeJKܹLemv:k={@ƎR2e,o@@v~0֧r=۶d{$O9.n8!,م_.^殝K6]:^㭠XPӄ93TzjP.ivUM4|g}l iZ eɂ9Φ_|}%?XحG/ˢ Ӧ爠}qٳ @I\:y;JWO>sZ7履!Z]*c u1WbU*kl!  $M`a8: oǑ @j`4o~رsS`io%rC%wyyƙNWxC;y%`8 Oz VK  )@PDCZP[YzY:zu\Ï?Te]gV}tƋ/5_lxmu:;U ,`KoZWu׶0Ͼ.5Sӆ2v˟iNf7cbN)9s&n :e 6rfME+9Ma&wTgsS={v9C盝 z`P)V>|X%c,Wc*@ 4 YZL`R>z?VuſϖY#'ʸ1_)K(<|ڵvwk+ڍVܷ-lsV-[N!m+LLHRPN*Z u, 1jX3Rh I66tGlKȊe˖NUu:cTW5s;}2w!MLڵlE!  $e ۰.@0醌@DUCe z6eK{ޑc{7{~/>+ڷKI>n;UB7Zxs /b0v0ot9zT.s}SV-ZsS}Hqiuo@@ @j^:sR7+a^<+׳G7_l#&;|(tY@׳;E<ݺ}S~+1H bSnظI4,8w<:_r zчq{%S~r_:kt!o<2b`ɚ5>˯#3mB1ꓑss/ TT{s:Ϥ%ߌN|9wA+ENӟ/YYÇ&gMuó/,<xu: {oӀG2K9)7i$)\;i·m%K\o%@B B#\ujՔPwq/ @NaY#=׆pZ{Ι;_խ!>_ߡl޲5~D@@H¤qt&ގ#@ ~"rpQ_+>[r戩𑠃y2/t.˜{3+A'CHw{vewSlT@G}"9s})7ɇV 7僑P+X[ژin=mdㄉ>}.tP页% ASNI鐽mE۽XF@@02\ C#$B`a"8(9XTv)Դ3ϽV66|:MVf K>Au:ğ&,3ݯj y2ed*+^+u͇+ʕ+cr2w^6A*7)SZ˒޳Gʑ iδ:o.02FK.0Z5mN -;kw[I?JŜh {*'Mvօ@9C{tuls2uQ'yIx,ޯӿCߋ9fb֊}3*V,twlˁtB"ժVU~߅):     X^OF ]`aVD ,LG ! @{V ShayqpnO_w!^p#m:Ǡ7Hy++Di*W(Zř6/tK ŊI3mZApd>ǵr+g.)TZ[8wfJ?2Mmg̒gNyLECoAS8;LR9߿Z BrvY;q⸼i} S5&f*"H;gvlrٶm-[FgS<[xE@ R{p߉VcNHfy!*V7^0ħŋȄISmxuI ;wuH:ja#޷ՠuB ythι^C¡4vW6|nqoªy wΓ|z܇+ba6)ǹ/Fh,lwcJ9ccO ynX#PL|E:wN,tw;Mɰwv7މ   2fAM嗹CiK̙̕3]a7GLy:[TxÏ}~?sa@@@ ,  X4ALEG^ AB}A#dR]t_0"<|.Ч> >}/A۸ݲf*r׽ =7^04o`t.vOLoNqՅUYW=hGr<5XF|02Pw; x0@0#}ڄbK1!'zs`9/>uVC~L';hȻnJnwog˯+ޓԺ7u$iVʌwsr:{q۶pdgVPo,PO?+k֮ 8N[Z}KiBt7IoF'O>&6X蝞, vaF;X7<*^` Nks =Z]w}7LR9s-wts׽ !tr7z뮳   ^dnEOH„q*`"l2.:Wָ~]m`,|cu酿KpMUvrx7+m ;vL.O}4j}fxo[n'$~t@@ t F2d`:=o*V^m@W`S V*+I޼y|gP/֛J52i.{y)K{kie7kFMSeOՀ=ҸQLս2nZ~|7.8yB4juOwis5#LH ,L0ǎ&Hb媐j x\% "tͷwb  5ڼU|=g ^~U> {+)%XE>{ylvWԩu@?o7tw8!  $N`a8*[A>k0js$8XG;vL1g g%͛;.kj Ξ3Onn5/o0o۾C~> iizg4Ӫe )bQ :e͞VY+h#GTꆹs岇4kXMPNS"{NcܱC;Sa7˽BNcw>ʐ:MYYeT+jo/ q%֥A+[o6?Tߺm~׹oI fʔT{VҦI# tj2Ϊ86I>ޅ~/>N%`a:|܄ou̲I]vC]<\`aR \LWj{M;v;}^Z O>+)y?]OhBNXNdVי[M5w2cO;ˬ91&w7i:5:_QG~;}.ntkkںޅ!JfMM'N~]g@@@  h , ݊ p 7U Q'N 2\TZ) !¥V{8/\Ҹ~d̴?9 t:-pd :7^}i-_!j߀7stڪ\Z˧Z)h"n7,FWoҽgowNsx|?N{򙠽47iPZh. Լo;X[ETzmަĆZ.bwJF})ϿTw  DQrKm,s_1A.ԫ[ h;~@AGdLvohN]w}l7X׹,З~Dɤ?ws;w`ḩצ]LHJjl]oun4_羏>n~l7%6X8˯bJ,!ÇvN%>V[d̘A**ZI߳f͞^%GP74 贓&zqΪ|(ykw?Xb2,by31&~4tڡ&_~ٻwݖŸƏ=ic0h+￯;zTh׊;Ք}+/'cGco[+Օ衆㰌   Э3;'1!cYdtۂ"װ2daeP8+@op,ԃ5x7/q%U*Jۻl+ #7Z Mv7y3y7b]c:u]O.W  {es[7Vttz 2XaL e:UU_j>o;X@@ ohpȻe}e5.W_~7僑psZylYv1߽6ꓑ>SQz]50zMH@@@G 9ٲe… ې[LpiѣfְR:o#-v+g|p yVW0J'0)C},a'e@DCXRPٶul۲swѷXhq)TؾMlZ}7]PD %@ScMEO`a7VO?1-]RyG]aJп:FcU5ԋ3w 6½g|Ln)&lN6kLZfJfJZ8z}SndEq+TL{… jqgՋJy~#w؈df㴉?|'e˔vVyE@ 37JPY֟~YrWLwd`ǝI?{>}_!˞-TVŭrh5hoeAociEC -kh1V+񩢶y;ξ%{lrIj>Μ>-?,OԐt׵։VpR{ oumΡrYd6};Unree[oQ s}_;uǟ+/qnjkyZYƸߜ?-=$ƍr8X"_}#:p {_~=4LE_r 6;sn2͘;c=YNZ]wg,p`F_CC@@H>p u**IB|~G^~lɓ'~9w\ k>:7PՂ&ㄉa?, &c!@ P)҅o1kԬcSpaT=q3I T/6HN\۷i%M|J$EًHL{̀4R2cǎKg x]B(ľqo(4wG{^N9ܬIcDJ9-Bg|}spƬ9vڹ~7Smuvj@4o`B ۶h ńpk UoެI(] @ x;q,jx>Tq5 _&=O@c0?v {m)]ݻwK[׊VvmquqicQV#~큒3{YEKNZvsBw_Mջ~ p7ie;o55hGV1q- fuK^= j?uNJ4j-B_{A:Ͼ3vH`N@mwcm@ջoɂ96Ll7w鶘j6=_; rЎ@@@H@fkX*S0KHsAm̐FK'O`k ^HzCcVSoCxRhJ Wc\ʅ. IHRPרA}{؋^3g9]w*5|y {ٗ`^NM讦O@dΝRNSi0QvVf tw[eIn*VĻ]@\3EN b`C{WgN G^f*{|嗩:dWnvgACY#g:i&ž5wOw̐!O_9ϞTv؋g?cq,T>ߓƥJqY+׼UxհbnaSJF})Ͽ=SůZ*vY [npEfMÌϛB5lp<$3SXS4o֯v$]o\Puk:ӑ﹛fϙ'yʂ>'[+)?\&o b?5ӧOg*k>=)N͆|5 tm۶ ^7k6   M \BJE`!S}X? 3ǹZCgfH-`&XW R;‹BG+V t n&\BVd]VZyd&,)͡ʚu쥔+SRnN>CwkLHX0!}+m &١RJew=؂!oԩӢ\&M"_ ;vvxismkw| ._BڶWB%dq>}uEsoBܵ}qO}ECG˯ʧnNEg nOO_uEH|؏ @D x;7 )S&SwFlS0-RD , G1M?N3={ %Tԟ.$gk+ n߱Stj] _dI󁥋O~'/^v 6mNilz?4)ϘǎiߟS5K=TϽk߯g䀩 aFݰqc3tJPVN)+4#q   @-[4wgRO_0EԮy0ojө'4%`hH,` +*t>BGp $9X΋I.[!#>:J9"bVNsrn妄rZ5d] eؐA1k0i;c}t= '9;7nϏ]-;e'~V5v6ah)W+ RT MGea9t萴5EݫV|pe5|QSL5k'wo3XٲIƌEg"Й4qڵTv]ϕ8~awATmX\cvǏ53O1_ +yO?pk>ֺն0&"gvVlHG?Ⱥxwɓ[riV[s̲43u6aɝ+9>4a>KC!iBB:s,G ꃅɗcdނ%`5mۻ?mCLg|hkִ iE3*U U*Wr3=^Je>+Ց?eბ˫]NհYK]ḴS5N4ʢDUvfZwSR?yx0Okm׷N^%wYO-^|{.{q @,'} ?=YSBӊ}T@=UoS5s    dNW vJK&&X{X4Wj6h؊֯e׋),*T -s諷5iІ4xѩӤ97s_L;k3ޙ3glE+V:PgnYKaf8r|B ռ2ɞ={4м,2U'e $z9uꔝEBr&^Ș1yؙ6;{EA;*.+VӅE@ $H *HK*#tw0-KB"REP]V]/NU$ ܟ~j/ᴵ֋NӑI:?f<~Tp'yΧ^d[o8?w|cz?IP{i\@Rpa7H:u1?lϘ5[ש~;Z-3|,@I`a4=M+Рٟ|{Lw[٣<ػWkE[.@@@$`{Mn@N jtre5W޾-[{zŊD}_+GB#kbf8˒9=LËAovR Namݶo`)}Kxݲu 9.nw9`VFPV`Ee]>ݴ`%}>۽+ZQ+:}B}߰alS ,zu H@ Cw퐍J}GK,]pa< |&X{uGZ?H"E{}龊}tiuUW0@:yWF}2|2wkԾ].ԿJpĹw<]g>eEwjPÅNl5ŸL^?pHtԟ|6*&w@IDATV-ˮru6ysAÀ'`# ,@0VO7O)-Pp7E?CC@@@ +XxE'wn7  :qݰVv O^ʙU4p0{\tcm'No~Ud w x n޲T6y箝vzc /j5CZ=Q>J8̒%&}꠆ yv~Y~;~Y)_[mQ34Łv,t2j 6nܸNasRJPׂ"Vn;eM*n߾CN9mE.]TТ7XUu9mz~oS{GYN3ΒFC+ @ OIÅO=}lc'c⽐ց`a xIh]>s7Bt;&bGOtiuuswݻ7^Te_ԝ}k֬7t s8Wq>T_XwYHȴ'/LLeEoAg`^|Ntz7oӰ^_۽^|Tb|ݔ`Sik g"kU§>Sѿ&gJG^@4ĸH\T^Kџ7nl~^#   p,٫Ґ^SpݲP_& L{x!1sv u\rY/BmzަM`,Zd~sh%D i۳g1U jm9>9E-2w^ʌޱ iA?-3*orNk`aҥDMC}_ Pkaڵk+Wɚ1UtUWۙu}͖-\Ym`e5." f`_WedBlIxQiH@J̝GʖޚV*$Tr …kVqDoϭ 2L ygw|=g,, 1Tʖ.)#!$XoAvz`lڴY~I;-%]}rl|_q?N٥^t:MV@6W9$X8rϞcS˯1:䖛뺠`4`BoK^={ȵ}|e@H XiOE@@@ +Xcj5ܪ8Z pZۜPn5{O5BNǫFm:?9}kԠu:dyÀ-_a:Wo00jZrVԪڼklCg|%դxbvU!C'+6?EwlƨUiprvYLvn<[P7ycϜ3,2 T,̛׹Ok`5d?{|;Fڢy3U1U[T歝XX'  E. ҧ̙2IUm#GMpZ`tS))(^\.sZO\`ac˖)m &Kk`a&)gϝ)L]$WZ%䂵k[r +/g*Fs_7iw ,[*QSW ¹(TFoй#{)PHP?ШY7v z)x GÅSϑ56Y+6iPOW)ggv"  ] @@@@"P 9^,Y2KP3gNw] gڭ}n]q-ϝ?gJ߂ H%$[l6PظS~%`%Aoվ&T" vО?o1\kLci.JcOӔNGaL 'j@Sa$)mŶ] ;]7Xc7n 8w؋̫3] H@$  ~ҩ9T"GN|S!c|.*BVFȃ2@@h XmOA@@@R@r :qWfrBj:e^Ҳsvƥfv!`w6Ȳt.Ӆ zÂz-?\R97͢Bl԰d3%Va֚6idCfBݠ3UR̄V@Ҙ6 zAS-Ve&)B@P/سKBEocW|7N y|R)pY  @ ,'!   -p>*!7 VFV^-ݿKs.9sOe׮.h†,Y۽B -K& ,tw¥>T,k*@DbP35 &;cB X}@@.@0     p,,hekN۳g,\DNi[mEBۅ z5lڼY.jUE6w|m7l Yf\rlٺ>|zC,NǬ. Ÿ}$veriqM&Bj_~Oվm[7˶-1A`ۋ-.soc zS* E`!l F@    X-"   4p ʕ˽= 444_vܽg̝{.x꺆)y3fh*尯]kU44 ۿ_N8!s9,`]WIءt}%{l5KV7̙VݻBXoB]WÇbBYQ* zj_m ]_V߯zώ ϿٻW+'s2~cMg{6@,Ի O>%K~QF:mL(Pa<v  Sr@@"@0; zu%O>ۼ+;1LuEm Zj>!I\̝Y]`VU2s:|c_qRiuJLYۜŋJe%[lv7X1cP3glm15$Ϯ'˜J.BBJe޻so>{*\kٽsl'/`a?Bn@Lܸj@@@@p J%ECl֬]'onӐbKN`;t9vl{JH=BrRD S(;cDZ.nalm SqQq~+v</ZUr!ӥwwg3ۿOVXV*tvj4iʮݻe|jN" pe ~{ξ^5i,2eӧOğ&FEL3?&[lUc@mS u @@@dH`a^4w4ؼic{^SP.Z,;MBV|y[Pks)]uG i @[\r@@ )XXd)i3UJf;?^iQ2r۝Lcs`~w{r-PQZ_?ӏmH,s̕K)oM6ȡJ^k(c'7v"E6dԼP$Zײ8oDT| Ɏees   F`ayIMؿ@\vݻVʇ%K0S$rW޺m,Z$y aA`a( X%@@"M Zӧ&L4dЛf5tax=lٳˡÇaCɵPj5iѲ?۷tkOʕo?._oP:$ZC> AIo>m ײ?>Hy!CFw̿ߎө_;)U{o;vȗ>e@@@+@oP+*Toc;vLϜ5  XNMB F@@`aZu~F96ShJMJf)`mܸAƎ*Rz v;’E eԟNv J΍4jkÇ}n&Ϟڶ&Z7,X$Mü3OKfS- ce @@@ F`! pa %烐;v+VѣGb-,E0b2.@0  D@ []{TX>x}H"%XxwNC{.`W#u/5S0бpTu ָhRɓ'1-[z4i]`,'O   , 1ElYکu 1A={ȡCC`aHLtBD ,L$! rK  @$DKMvR\9[)W((ǏKT1`,(;wlOP ȁ>>ɜ9lڰAFU&ݙkLϫٳ<=}i-p;Gcv9AB5:r|BӥK/yK?i۾m@&9sQn;;32dЛAV8e;wӧOy`@@@ JF郍"XKD F02  @h,lס+V\4,.j`mfwURÄ2x9O"0 8.wt!ٲeF};N|f-Hc ۂd6BH{9q⸬^Ro&-ZݿӐ_=hXl_䧉㽧KrbUQHeuz!l$?lCG)ZÆȱδm^J,m :=rfZ6Tiw/gLٽZ]F>=HkZ9שBJҴY 8C[Oϯ0{Lɕ'Ԩq Priܸ9bۿ u*2e)sC{L25?S˘1#Nq,4kR]R5s7߇ֳ끂~P4lzԄ(N4n"_^97}\_mx񒮙mۗ@@@ X}4R`a<) XύF 9&*c" +Ž]n…cHY ie3mu^!W\U߿F muT3}G+XxT^ 6lX/}"EJ|vw6ݖ`=bCVsgϒ9gGxX\j:x{r[:|H6pխK/iLuX/FKa4>4&Vޕ6@ CT;wzm&.p߫DZߠԬ]g'=7.L]>;ή1koӀf%E"9WCJV袋 cr]{OÐ#.W^ `o{Q.T4m6$X֣ fՀMFC@@N\#FS\r-@0ܢlc'LSg7X~{-fJWkMJ(c@R@ *V^kjG%KaZMyNg4s̒Jɥ5."[l> 6n*]^!)&J|+WM~7~:+V,M0)X!S٢@@2Q@#vFR@иdI`a22ln6k}Cϻ'ذi&=neKXH^-Lՙ Rt=#D@ Ҧm;)S 3=پ*TH`ys@|@I.O;ݗ`3NW9 /S_;^ʈ1[0Z‚ K7q_4 jqq޾I_.M%>=Lj9P"ҩMvu \~gڮ̔鐯F$ y^4-P NGt;wϓ'~q}#fZ`oN;yU̥K 'MHt:` iѭȑ҄涛>mΑfZ(_%6m u5\t>\V q?Xb jeH^Tش+gdʜY;MN%D]ع.RTu}Re҄ f:v/   %@0g$ HzZ\+'@0W@r ,L.Y °&yϿ+-A?@ u `a|O /PV3{n ḙsԹ 0NKL};m_.{8PTTk6VwK/a4 e͚M:j|ZUNێ>q}Iks:ڵS>#{46oUB]w1xQ.սM:gb`aMTkLʹZO!ܱCF}w؀ ov;{5 <5yO޶cdؐA N&S25eYrAVZwNj׷3TO5ʉ? :    4wJ "pj}h(@0~ޝT.QVEHIBvJ+B-hO?=)% i/-R",ɾDvƾ0}9}=vgsu3="Xrq¸J1@ @F jPnzRdiaBZYglYImXKۤ&4XDwI[.;W\-5U{Kf>VZtο ry+f\ԫ/p=%Kx83)ZjuVh9rJlY%kf= yzO'm\ִ'`.~YV]/w};(۶nſ-]^ _ٲ@=[vjfx~DwI#  bŊ1@2@ęr@:VR]:4f#"/%R%{'N)RPM r5ϲ{>)^D!@,^bZ?t͓T~Iܳo6 a qY?``ўB0Z A  ; ZHiILVJ:uc߱Ç 5fg%yVv3Bܘ>[9oS&MMlb{$,EKѐ.N;dE7\3K,Ң-RF(?^-̙ Sr[i7XTuC{1|=oXris(6۴K.`c~/`aski`7ܧ-wKP{ sx~6/>d߫3W-jԬe-ܰ{:}JfLݳw    i[ wR3C~f O#gh. 3gwfB\!v'*7m5"Y2UBڴI wosvzȲe5&Tx9,U*U>v {F\,R8slPo d%Ŋv+#|OSJ,!wL7T4DM`ď&DWvn^H͝tVm[k7tyWZo$yX|y5ɰczD@WG#Otv_N_~i]wwEĴ7pwTݵ;O~'L d'mcԹ># T # 6k.6>y>i{N[ĉ-pbW]s4j{K_.ŋsn{`!9ko"W\n&e[eqƏk[tZ2'd=W-juJrr1MJtV:X`q!?4Qx}'A^qTTTG,b;nbBiSh??[a2L7/D"V \ois|T̛A,-fZ:Bokkf\IqoݙRN]{HҥO2;?gE+cj+g]nZwkr+V)Tk]ʔ-+;w+/ysu h?Lü%s?q89\@@@ҶU c Z^2hP]O_KՊv6VNG;իОwCʔ*? i6q?vý{IGȟ+WӠY^k*KC|mלc9{B{_5#_t%gp{SdͶ`topqcnPO~w##/`˕ VCCs+S&I/2gong.T@^ O?l2?hIO5տÞ;@ d`}|}?`u߃7!;YŋʒŋѮzJ2} 2[m1[ZfCuen+3f~k'ۻ#1su*7뻕z=KA:Yf3AŧKUծ\yVz˕//:vc/M7^+u %9vc$"<<,Y ucftiO3aG}*"zoRBޱo߾Ms;L)j+1j2 /~[08g_ F XtIvcۊ~z[Y1{F:czҳK;r_{6v~U 7]&4UYt5/Ki5^mzl_ӊl*Wj3~uK͛G^}Ir ̥DЙdUm|fFZr3,ϥc),ww @d 7-u~ «oJm7ʈK%|_1)*2n{ǶriZm䏿{٩5kr3G~VKw.T9)ߙwUv*Ni3lT _s\O@>=,9Mi7GZ: Zͮ =zs>|H&s8A&6a*7n0坷p;+7YJ*%O۶V:n`auq 6Ti˜ٲrr=ognL*zOH\9СCċz56 ֚W+J6=U uDDmpy#;nQND ;./9j̙;z>o&7卮mZ^Rg@zߔIˡC^26R*X/+UGLso˾}{keJe.ݤt0_J,%v;zTosHڴm/L˫ I{c7_+?`*    @߭h[dXYd N@'LmXB ,L[UACh~Q>pF#_rZYnKOiE[jML+{{ttY2ZߐnѬx=t 1z^C=Xآuri]@yE аpOPRi/E[xQ-d;*+#O< ꁤ۲k^[塏PO?;_ 185(y>]֪nZfw"aarrri,7{- &V-۲yy~Af7:uJLP*5x/RX1*TW{O?ɝ'={.9OwSn;^`&{,A*,]b&U@e&nv=/ VX[dtI}ӺV%XP; u]`!*UY;{\_OR-syCi=a;v\t_/`z\/f4sh֭JSpNf-wnǖ-W^ +W*kokvޜePl.ƦHcnjr.gJ c9x7WaZAio߯˖-eU+>4hVyf4.?4LXmC>iyMK]~>M6nXo    d I3/.?2=N C}='׾')}}}Pɑ#r=6T&8#nVk,J,!C>'Oɓ թ)jC9Xox!ʳha#LU|c$і|c n׽Ayޞ(n2&N|Vbc}z_~]b* hӏAR}j"Z1`alBGI # +Ul[~n*kE 5v_;rBsO~rgh u~܃fE#)y4B=n\s9_P1A+`KBꭠx]B zAƿm/%N+b@n0ihp3{3"0ga lk4Kb`PѡTX)4w[, ֭vŴV oo+ժpG?~`5)AK7c@@@@Hm &/4C U\Eʘdϖ݆6թ'{) kelb[]4z֗f[ڣK,6D3KH j,\=enV\#i+<>t_Vusow>5Sq>mx(Md/?TwSyW{cM뵦.`aB?JTz]qfcVY?̞=zw< ] V@ @0h"VmvZOʌ裏r0ݷ#n氰ZV,_5) 'YreBn9      D`a ʘqjT,oC\/9C^ j{E ٰ cpC |HJ,7zg_|ԊZPq?k7ɓۮ .HxD*Bm/p]ydOsvV8[]_Wgu?ce#K _kKmfOd {z9E++:ˬt)^7I̸k^[oP `NiŬ|LV^kݗzvj4-^Egv~ic~aᣝ! =@IDATpvN6@"@0 @@@@@@@ X/!N˛~ ڢ\j*6mr~K(9AmZI믊r\Cq5 CN;[ ~T ;i#?yr璾Zq0|ZvrVQ,zLӮ(xw#;v}i;^6$]Lxk_NOZ/x\Hâ.[QzRfUїv7X;`fUDcŊnU+9C4 ATأRB9stc݌hem̂ @l c8       : S=^wP#ǤBҢmjc pa\oiCo*Ll^Jմx.l*iݤZ ]/SL-k؆=U%ŋsd*5U+b 'Iݴy)WTދsH+l9z\ ȗ`SyD 3{)@@@@@@@ ,L{,df,X TNiq*bOJq & !#@0d^A@@@@@@qP nL8=Vq\&,Eu      dT'sj0 -E/A0E @ , T@@@@@@@BXopԨZY 7Ԗ,YXA@ = ,LogC@@@@@@,@0-= ai1u@@@@@@H @@ X!      @ X?O T       @ c   @r ,L.Y      $N`a8@@  i       @2 ,Lf`.  \`ap"      -@0G@2 yl@@@@@@y!   >S!      @ X!O Ii1i@@@@@@ 3K@@P Xo9!      " .@@HM@@@@@@@XJ@@ X\@@@@@@Hr@@,L       ) @0  @TQM؃      Px @Ȁ 3K@@@@@@@ M,LI" O`a{<      =  @ X^F@@@@@@ "@0h@5F        Xw  @,Lvn      *@0V"  $P       @&ސ+  $@`a8@@@@@@H)-@@ ,j@@@@@@@ [`  @ X_:      iB`axML@H ;@@@@@@@ },L@@Ҝ4ʘ0      dE  @ , 7|@@@@@@@B@@RE`asS@@@@@@@ V1@@ 9&*D@@@@@@/@0\@@  )       @ ,Ldn  UyNQw@@@@@@@ +`  @ X1;O      /@03D@ҥk@@@@@@@ ,L/G@@Ң´֘3      d-  @ , ”@@@@@@@#@o@@T X*@@@@@@U`aD @@Hɡ5@@@@@@@ dھs_+   ?f[F#      a&   EF@@@@@@BC S>XY  JnyyX@@@@@@@ ,L+oy" L`a:{<      U   @ XE@@@@@@#@0k@)!:        ,t)XA@HI)ͽ@@@@@@@ ,#@@P`abr)@@@@@@@ &!&B@¸[1@@@@@@HI)ͽ@@\.+       @H , d@@#@0k@@@@@@Җ´-  nWɃ       @: X^( iM1O@@@@@@h 3y@@ X"/i        @D@H)]@@@@@@@ ,@@D`a0r@@@@@@@ &9)D@¸(1@@@@@@Hy)o@@B @@@@@@@ XY! ^`a<       Qi1m@@ ,Lo#      @z X^,υ AL@@@@@@2 yp@@ u?wG@@@@@@ X @@U`arq@@@@@@@  Llj   X=E@@@@@@O`are@@ƀ!@@@@@@@ ">F@2Œyv@@@@@@ev  ˣ!      @ X_G@Ү´yxҮm L{euo~ԗ5 ?M5       ӧO˙3gR{*~N KA\G"6\@I`a2f˖+[FTREʔ.%y䑽Ν?7Ӧg@=roX)n'te;oʍMݷ_yB/y      @ )[VZ)Yd͚U2edry9~4ٵsg/9oL09u)5KvɪOzʹev7֯ov@&EjRxɑ5{l!yT Oc.U+kݲ$vF7g%ڜ @t!Xx[;dϳ䩓=&YOJEwM7˃}4LdҷR.\eN%ťS•;H<&      @<:Xg%pXǥ S=ykqy睹e=[=H ɧK1M`RLB#k3s'tVd{ {#[}zo9%~}AKܙ "s~+ elXwK۬  ,t<=*sf͔۷9Lbnm%^9HO^?.y__v_7"##eʈF NA1c.aw     %J*Kw)14=*UJ:tfZ'gx7$<<ܻ+d ૈK05CJ`P4,zhg¿M1ɛ#6t9|:j04_V%UK*,XBn+"6O5,`~Z&?h|XجN^Z^)7l!K%?-л|.[6̨#\n=%\K>/?:fw7[Je eʺ2}s^\?}\W=7{aAOw^>{cj{@Zm.Sjoy`Uj%|D~o^3>e HBAK:S+]|f.Mrv,,/^/)^ ~Ő^yu|q׉i9u `ܹs%UVZ 1 >ط향;#"娩jx)ɗ*TH%N ߈)\ڡB} u쌁Euq ~4O>[;{T.`gIui%ٝ_v>+l{/8(oUN : BQFnd;l2G>Ǘ>_]`ӂzӂxi.M3> k|h+BzLo= ὦ.n;--%s @R d`E0ZprER4TG1ɔ+?)ܛ*Л\XӲl Y/}˼oUFvP&{4Կ{lw"NYS.[=Eg^ 3%GT kkKdm;W.YSɖ-sHf4[<:ݎn%`?1b9wi}|JQL|A:wӝv6?nnDd_eFfA@@@@@BY ,Yߓ|w̎vҮMh7{,5MȢw$ XDp/Jlayhʮ^:,Oii€L9qZyPsrzJw6զ2ɘs2[ ;~} :oݶ_;ޅfKaWPtg{ygv׸1$ep]ҾSw[MQyUoU ϟ?/]qs[tBoe=oCs/1_߷mG,\vty;@/{-V@@@@@@PyRhQ;M7}7"EI^P$  bÅiVP`oTs+=oZ_ޑ]JK|l>]Ҧ+ykҲMwֹV N~]VsΞkol9}<)lJyV~,Ezo~&ujrwox%S?RQN0;5h#{FʤeӾ)/XЯ]r' @"k0„.\ \95- -j)KTvo5W￝4RYP V}ikW_y{肅K/  f7^la,%M5sN w˄M>@H@z n6U4YD٤9,"Kf/}e%CZuLRJ+mظ)  [0my3|?!+-vkQon[j'O~K`a`vZ2)L:uЧ{׋m;Dy~}uϿEv肅}ԪYÞuceCD( jyu;Ç(nٱ3jrw+      @* T^]ni}dΜY4TUqHbrɥFZ;b[6o:*,'Y ?]rާKc_5Hp7X;}^z|pچxZt!lfr|1UZv~`OHJ>wK} ʃjem7Xx,7|ˏ,.mw~??9]zm9ōA+> Z[GNł @R`ѣGe/sDO+K%%srLwQ…*Tѯ*r뿼5iR"_~Կ8탵u9q4ht;Y)Yd˖nzo{y ~uN3U>#|A=Ɂ}^#`᧟)Ͼ;VWfN*VKX/`ᛣ_[\ }hz㶝^/K{,#^-ߟ䞫sgIHUr8+      @+_^udCZPaO?ɚW%xz5l$Mnhj׶};J &nk  jYF:7SS#\,<}S2U;e$9ލT&5} ?-=$ޠޭz)v=M[L`Kt%Uj%rS.3]cU`+'Bg;o(b7d'^t7,ivrQ>5/*/Q_o4N;(H@H@z> Yb,2# 8{L9D zPy#v6n, 44xWҷ}˵74ƍ&_{wDN/uCsN Qyݱ3fΒ>V4tYq#jreF GH" V,0FIS> V]ݝAV ]?5=c>ܶ} eX[b%I|(:Ҏ :uZ>La=w+h^{uҶjV@@@@@@T(Ytтyȟ˖&jFy{-ONh}wGpL0Ac\LBz :ggSqlϲvY#;m=(Cr~p%/8Є'ctʗkH¾J5mF#6ZJPﭺ:k;Ժ߻|ٿ4Ĵ_hg}2W9YdHx>@@z/QRGq…:\=I\B99=%,J5PxU*K.R|=8qfwӿRfѪǎʕ*J\?,уZ-:wwiwuHpܝ].߆2TBx`}1U,tDAI LƶD,+ juH.^CK淸`=|0d,Y(;ÏOb@@@@@HU\}q'>ٺeK9%_^Q<̖ꐷFS2{@C0gKKÅ:P:i-#(!5+sl~}ex6J^-?/y)]3RixfTS hAE)Xw>)YDؐc\+,1@A;O>-OyVrxcK׺sN`1u$GL~P_v됪T,lX)4=i_5WeC{ @b&F/i ʡ\0_y >(W\@X i`'MJn {!8Sƾh%E+^馦 ?x4A>d櫌}9ٴy^ZL/<#.VX'W_u{=F+WeZd#{cZ:ݵtٟ2Qml3ed>+5&4{u@@@@@xJzϞ=+oq1X ;td~;h3dtD0]׽K\Bpa;3T#=Z)|f9;,~m{&TNND`aeհR0/m~»3@{cy}<;XI}N]vķ*κ*R礪rzؼn>[aosH9p-ݻvv/WzZcAC +/D#H`{Ь3ͳFDs}Wݷ'      .d"UU"EJLᅃsU /`W#ֻ4.( y܃2dx ~iqRJ.I,[x/Ģۑ&#X穋-uwW. |ZQ 'di٫>],kxS=aYA\.EJ;3_V@޿I-n!oUS URaF%waÿ/#~+|NW}٦5sp#rTf+i_Jަ{3a{>+ $V`ab9? ,L^TGk2|Lr1hr      @ Xa>Ar ^BmY̝5'mvJݲ9iվzC6}I, ѽt}7'ENJ`lm%V&ËnW1=ʸ︼6Z0epi5rkʑ11@b XH`V ~7[ڴwC      .טtӠҰm%[-p6ڦw_qR`VyeqiWYt/XXd?d˒I;!w-e*7S  iN`a{eL@@@@@@2 yL@@ a>       O`!   "@0Uع) c@IDAT      @3g#/:  $@z%       @R,L E  o&@@@@@@@ E37A@ X(6        C=0 @@ ,pF@@@@@@4"@0( 7<  ++[ʮ"BfJ$ QR**D(2#{dnq_~Ly=}+|u!    qIr  @, X      F`ay(  Ƭ       B[O@@*@rs2@@@@@@@  Lņ  Q)@0*59       u Β#! C`a8@@@@@@ "6B@ Xd       Ƥ  H`a3=zL,[cEk=u_(O@@@@@@  ,KG@bbƵwNRHbn CȞMn; 6XVlme|lhۺ\͛h**_jmcEk=~TR#Oyώ_x1ə#d˚U]&d?d۶rh. vx #w;;H\:vxU<]W2gڙs;ˢjINnTJ F/ 񻞅     1S٤FZ>CF B[O@+q%Xh?Ǐɼ9">Y, p:ɓ'VEti~ٻW\4_U9|x[BRmQF-#:FT.n3:K'wIyүӤrYs"f?>iiL}I0Y~1gB(i<LȗOiPOʕYy&@@@@@b@K\ t[JVe 7T$UyV+Z :G" @8ZPoV-ٸa^Jp ap K6;yVՀϼ%?Q"zQy U.V<' zZm٤Vf֭&4TRy)Vܺ(ߧvLh8f-냒ƪvY9lo>PH<g2k`i|Ps5=g?6}Y?_^)[vLZCC[իW|y5\B{#۷m_2%aަNa=a]ם;wNv[a{*g^KA%UTV9rT~2U8l; M@+_&U=QD-Jǎms&^Cժ$00Pƌ 2.;HEw/*hۧ{Ybkޮף[Wiۺ.@br>&e/sjX{^GZlfYaF{޽GMNBk_~_֩[UQVK: fϰ~0YA=s6pا(ujt'ZO>topҴI#nfZmu gϥpǃ ԯzӖk jԩ4mظs6$w贐v_µ_ ڽX֬\T cw_{z 3C߭𼛺V*Y9/MPޛ~W(_NZ;vȂe&uj9q?~BfMbGS} վӣҪY_\3j+S٦u+t;ot' Rp!g?wY     @OP<4jjb;o$׮]/#X B.%D@$sڹ/Ydιb/ 2'M7dO{qca 5Ҫ穸ؾpYD[v      @O]$:_&NGWZFҦMk(z%f["(~7:Th_ ^\H4$.ҦѺ[RON%߽=Zuٴ?@v.ߖ//s17|Whu׬/zb5) @B}׭0Zblݼ)f?0^ Q@:x,Ԡ%FZ]L۶Fb`VY#O)l"_ͽ^YӜŋgS+RtI)dP{Vmm!>fLu`cՖZ!ݸyS+9ΐ!SMkټeܾ}[>K -X8gu Y_дn԰u odeW\쵃Zp7FȾu_~ɳmd/ٻ=2,Qjb]?mo^eK;4]uvy ,f>le֪v6Q|z'}{K:`9Պ[xUtCQqꩮZ{.5h@^eӅ+7mmGmW zM[2t>"B/閭p5Qc_k$%YbwK7vRxiC Xzѱ}[ڥ<     G ¤IJ m)aRR%Ytܺ}+F,]BF΀`}Ji'Dz&3&Mt/<~!Pǜ\k! dJ VfRxaKJ)'²6, 3uf@/BsʌiSAp*- wZny,}FTlAR7*U_ "}O/[ j0!_.^-ڂ K0vhOg >PXM]N}п4_F߹Q;V+g;N7ZJ(.7nܐǞx{O:vEKu*QCOB RVU7X{kϺuj?qŽ6FM@@@@@ f 5X>}F_17sY;}c~`,hUy)֬"R.P^z$EWXݟ U%XU +Ϫ ؂IrJ?N#S=ea7$OB0,Vl pg,xK6nX+Vit'" ;݇V nB} %gʃSE+΅whԩRItisv&,jK7g!T+je*TuLlmۼ,Y1 ^zL%RSW.q4T**zS?Q9oX]O vuwZ]vBPom׈RulٺM5mum['y yBwRksvα:mUٲL\+V1lS)[< O+d iiXzj)r[V,ݷX'd҄BuvujtNЫO_Ѷp]OϗW܁j{ VE?Lh }m4ṌGɵC5m [WHCK*]~,ݷLBݭ>K~Yv \2 'Or-ݞA-=Hjլ}wD NOgOTXA*П3MG@@@@e -VBJ-tNre%0{q&XE, O/B숞3[KPp,F},ѐ_l *[ϽWYEC]J3$O 74z@ee bg2hվ}iA·duv@{Ig3K79j *䫕9Jߍ|L~[u2H:Q,t)4SPbn# ),p,]P?cHZI@"/?,\CRPihK[ =+̟=^-[nFM=A]:7v54 AA{[ nkӊy~=+[Boxkc_:Dn]mV:izy3འp[.Y0[ejsWLP_pU,~dΔ^mjAtW@7^ld갃g:lղ<߸Y -M }k֮ڸOi W0*VPE3j=|=Pj[a:e}4gTI0d:cW7ocEJ3oZU~tgh ڥ94# -k6I/5{m@r{{UĴw*~Xl=     O B+T\,Ҷߏ^c Fѣ'Ik.Aw-g.{.<=i0eN͝&} Ho:A`;X rXYUtEs&CgolE/ygHQeK$*%!e#N]#ɜ{_{)eܫQF?`1ʢIrJi_Cx>T++Rn0h;f Q)l޴QVZLl&82ܗ4apaluhB <͞1E%J<P6:A!mm:2ɒ*UJRp!g5Rʖ)jBߖ*7v6`@|qUL/V4gU!Z7{]?cyaL]*#Bm >LyKva|kdUЙg ɵȔ* )f%պi%ՒySrՖo1n91=+'g,$ d`֡-wZBz7OL..ʰEgd+6?\Od>UqG 򬭞`cdzRF,>cSH*5 #k B0S,rDO˘_P8ًd k$`` c],k c<ӨsOqڣ: C`awߖ-<; \ڸ& }:wPCr5m|I:vѣǤRu_YHl,lܴ )X}cy':_.Iz^BWDh7Jrz_׺{#u74mۛ9HeQ^@'Phon>UT%S׊'h*=y_Na[X+n=V5U!ڥsyc{2ڵkz^w`SpϞ;'Uk<6%M42ۅ;Xm~*NXaojUGgj#6s/N_53e({wdE2f__Vu۶q{o/ͷzʌ?f     1Hi<͒ܟD(iի*Bbm[ȕ+lΜIdEVg"OG["ש[O2 ӡ_~> Fo£>{ڢXm:ܡ! .T,$X-[8dTL'7쬳'eu( 'w%yZLҮ}V(ѭvFy jb.Hy7 :X5Wfu^ޯ2!,u\}M%LlSβ4A0F| :v] ?$GyeIH6[:}YY;{W o*!j~;!-=kÃ?>/ot,wXю+foH]0V w\斕j4?3/M%_ 'mIFcT~=!y̞~"|JP8>@@ XhKOwP&W*6Y.[adr>?=yigV6_O}Kѣ2zx)Q*ZdlS2iXg{mXjk'Lw;]ǤOwpM?-$ZSUɓRwe< &~ao)dq' '?XJ> X]juO׫#q|ʪݭE=>;=ɳԗx~SOi0sվ(hո7x  jhS':/Ysʩx2mn|42yVP3ZO] |jQCOSNȈ%VDʈ!=vV]W *lTO+;Bp2קּ;ڏGe f7=e7jUTt >xnjp @t,Ոbra{ȞM잽{< [T<ϦDNznwpNۻk,]Lѷ2{e p;~!}nϷ-bm[\eMBjxiH#C]TP H z껕ܺo d*_>vM>yJYej;~vL颩廗uWC@  M N?*|h1{<[< <޹T^իŲ1k9#     BFGNSPÄ:YDC! mu퐵^7wV%M>-ͶVPÀZIP+ ^J pRWny$ceMeiw^ ;`i0ǓbZڽmhܒGmSji@ *F"@J勜[~{H< ԩ]Srf.Yd_Y ɚ"\3q+     Q`¶ADC~Ge5'Xd͒)l'9C;;X]`jnfyKfaS{팾Ix+F$XhjιB+Vd>~\>y$Sz-[[U"ulW2 ./k<K-#[QЀ@ F-FK@[~" @}2 @@@@@@  u!jJtakG;r'*e iڰޝNe֟9{N̜l۶td&2Xב]rmSpWnA|6E`{7}Ϙsy6>u {>cZGwP޼)BdrؗDr5v)e]H O] ZaH@,GA@@@@@@@H ,4`$^*a 8Enhz)Sf9X™ˍs`;ϙri\8GR~/,|hjll+]N㏚fJH~79t͗hO)_s`( I[F?^ZWߩCHG ͪg/7@/       } քZa.VKWzZ!W*wVȾ$crQ,%GK'HlIJO :U[Y홷&#}tjJ)cpM^u}٨ꁺ|L~TIȔrI!+x,sz~BZqg⿯Ha&YyЪ%x‡Y%tTT+Bb@ F-F@@@@@@"%@0R|wp _6 07gH$o2K/_-y @8\Rԥ@d)ujR^'Xx-yI vWI/}켺M GEÊqc)_VgTt>vT1<6ZϬ\N3S4g2!ۅpc1M,`|M|֐|Y2^e;+@ :D@@@@@@ @0 H$¸*T{3J2D@@  ,C[A@@@@@@8%@0o0K8ԫUEҧKCO)?,?'5N@d$y:xWo! @F@@@@@@@h XmAl0 ΋kA ">IUI^4 cs       ޥǣyW+WuƔ)RH*bMB#.VJ'6l@       @ X3K;.˩R,g2I@@\ ]L"      1H`a z\   Ƨͽ"      @l X׊ !qar+       Ʃ  G`ayV\)      /ys  @ Xc      x ,`@@n ,[Ҝ@@@@@@y5  @ ,"H      D(p  a X6'B@@@@@@»-@@B^@@@@@@@ f ,υB@8A@@@@@@ c@@.@0?A@@@@@@¸d/@@ ,C@@@@@@x+@0>zn@ ?gG@[@IDAT@@@@@B X @@U`arp@@@@@@@  #Lǎ   X=E@@@@@@O`ard@@P*@@@@@@@ ,@ @@@@@@@ & ,OkC@8p5@@@@@@ c@@+@0>;@@@@@@¸|;@@ , C@@@@@@x.@0>  p+y΋      .@0t" Dh       @$F@@"&@0bn      D  ~ea!       pG  S`a|5      |1q  @ X'+7      q@`ax  Ƨ5#      @| X2 @1pI       %@@@,'@@@@@@;  @t,U      D^`a 9  @F]@@@@@@@ @. s @@ @@@@@@  cS@@x(@0>tn@@@@@@bXH@@ ,{ϔ;B@@@@@@!@0ndU+W,Y2l;w߈%      iX   S7~sv"E 7{V:|DG6nwY`İ-{r[Yf=+?۶n%=u5~fVn @q!Xtgeтyrꕘpǖ 8q;ޙp/k֭m إL gN}he7RUvrjg>6N5Bʕ)m.}ŗmdɜI:՜|ezׯ#PvիV1!V֯Z.iҤ6cc0OG]WFj"y` tߍ"PI2!2|^˘A@@@@ K voߖ3ݻ '# T . v[_&+V,7'{/;BCLרi lۖ/, hg^'J/&_XRJ-׮N]Zgm\#I&52tȻ~7~N> pת9'_~_[˗hr&6 _lLU~p$ԾACI.jgϖt`a0     @H"m >tH:(zH;T Q788@@ ĕ`-~17g9}^g4 TsH<*ҥK +OkY| K0h[gmlz4JoC$XLؖ`[ސW[Uܱs$ѪH.~1ie)Y"K}.f`owDW%XaZvD@@@@X(PRWsZiә7E uqa`a\x   ZP[qZYzƱH;Xt iӾe֪Q]W'JqZξҋ0ay #^WZY~(YzZ3#{6Uu0v<+TT^-*nʾ}3t/,(5kTlYZ3gaڦ#5/WF->EN>#Ysۯumno\dyrj:mL<Rt)3}u8i=ӪW*摇kj?X_-h|mҸY 3ao 4e7J?8+^ w{1A{ٝ>5TTZi1&g KҮmkIb|Ǎ7G+PkӢy|7+UڶnhgZ'4> +|Wthnf8riIϽXZ]:yFj4j8ѶƂ3$Wf|LCl]:udɒ9;u$Im]2mf]fMOs'T4׬\Tݜc__{!Z6w)8V&Z ].1}߳chȰ2jwҥJs6ٸi<<(D+5b>/5Sw],jh e+d9,sV6i.Y_jԩ/pubڕ2eJLe*Vu~nBzSV%I:,t(@@@@@8.(Qb4w|镶gMFMK gf\ A0&> @q9Xh?;K4s^'>dN,ɚ['nȵ_ Kp쨑VuU",@=kPrNж֣ZNw{ɔߧ;zB?_*C V(WVFTWsJH&V:׫;hKý:ݭc[=ujՐA_~q{ #v: ac2޽pIGHO9p YkfKKL@BK}L E$Xh#Oߠ\DlwpW%n޲ 2{~>!SUS'6 0(}$Y6uᅥ5l ܎~=+z֙)J>$[V=Պ &&@@@@@  dy04kǎ -VB*Wfo޼i:wÇ˗rҮkkrW%U4V 崦ˆoWb%,4.Zs_R.]ߋ*e QO6/3  wQ > F+V,7E; (%M ߒCEp; VZD9G^T 5k"M[dքq/VfMsm/^2֟ʔ.)%,-_|1u=j={E r +9ΐ!ԬCL۝j_Wh ]r?s] -0Z5l`  &|;l/X_ʕ-#ix9NTRéϥzo}Kq+堊wn#`/l!|ن,ժT75-1{֬Z=2֡U̙ܧ9{F 'ڢvR`v^-˖cVV ꈪI2H֊ǟʏ?^iUCL=}Gq-jZ׻oK/ثL;cmm֡JdCJP47u6:- u6@!'NsRVPELja0jU+Jv;~g ?_`g>K}?׭(/|9b_ X+<    /"5k6>Lbйֿ >5fڔd߾f:iҤvi m)aRR%Ytܺ}lӾ, ODC3-7nFlI$z5.;! @L/B?w̘6UX$cp v[Ɲ'"߸Q=zL}iPJ\ʖjkk·oxHVV˩{=fn j=3j~i𥉉4gwu7mKZ'OۛɄOOy<ִI#gK2{|3=Ӻ. )Xu߻~àr 8m 0r9)U 3V%O^VU;[7v醍iVf~l|?:u׶V"O(^L'M;傅iRr%Y}uQ?9kVf{hlu݆[o|*iٶ/g^'2X.SW>?gE&|\["c̨|a4d90l%v7=O ΟTpW|-yz Ó[avP3̻ OݡD iƎ y} st?m!V{t~=kBj3 w3XUkXCCt+yV;*+7^xim/t UkzUYVh<; VMGELۣ{ FAF=3/Uiw7X VԩSwE6Vwms*BkO;Xp3GvVj{*f6iP}l_ྭG0V[J TX    AbRVw]v! y -lذN-^$i(5bYCFǵξի{ ̹0N, #TD6 &IlUʃfVÛ7 F) T,{&L#    qR C; 50aB?+'O0V)ߥƍ舆K-ŋ2fֿmt/1 QDUо4…  bp[E̳ڽ^*it0s >+19T`"Y|ye_~&^r}ߎ^4빹c ` y5M^UkȶmEZl!Yo{; y#a.ZUI y 绽~[C]!_Q?8dujՐ_ p_iAh<ԫ'0    E yҮCg5s$Ef9}'ҧ(?>jCwE&t ]a UE"EA(**U:R)Kh':&&s3gڙ{?/sʖ=_,=]b.X͹|7լCm$]tv,5?E?cDB .\0G4hc5 Z:gV|gϒ,Y2Q#}KiGjh-׭LJ~|=unMK[9nW2rXg=|`iѼ2in8t `a-eGqf?blS찱uL}-?=ց,N@@@@@g:HBg k׭'U=h>xPΙ%"pإ{OX 2VB8.߅GF>>`a4Tx5u sO4'Y2-u|.l!u<$G*y畞 \K39!Wy<0w;%`V);`?Oz:e#8 mT4*e]Dv@@R͗_Μ{u|:Fjo " =m#Ono9RTI{? _ }W:u|ゃCJӸ#gP_-rV j9#k,zn'O: uPZMf[Pt ye槎>}z_rb, B{PtIݦ[_#6=CwٷȗOJ.6`uѣǤ19s0|v};Pj2cdnh9yU9s`~Ҿmks"ډ(Xu:?u0i^y h8>PU/):[' {w/u~$U94X`>wp͜ٵ\Fۙ?jR_Yf"ӧ .l5Щ ?o|qmj8WC5p @@@@@"EMgtڹCXY6nl.>u?w(ZiѪ7AZXyLDnD3*Lǎ~i89zyiH&$WλH-<\rER^oB #oyZ}b 6B]b8^.!;.*5JE=ٰ}U:N֊|* d"D=xXVz WR}/լZv;ZйsDB {:Mvo]v 39o3mnkABlknyL֊iwV^M0 5%Ƶjc\5+pY)3g, O>@@@@HNOn#㾺U}KHPi;9l#S*3LbA%7e:儹S0GAIѥP3|x˨>EAW W+WQ J932a+1]xF卤t@ }N8ÅzW*^lƵvnCޗg۷WZ-]{jk}ܪ˝8yXVw-_Jmn{le̓ؼ~dv|4xpە*+57@V;cAr$8$X^ݼN=Z=48h`vRO?]^>lt`+}lT/ُse U|Uy]駚-wƲÌeoW^<ݬ4ixRK@k.E`,J`oe4|QݱXVbjzv֬L<>OZC hEWyȬ$K9Æ 4/:a7a7o s.o۽Kgiذ ]XMveYw1?j9?Kj)Sdc`gPzFt>B]+R~:, zsir>r{UG\`p]d1+.zi\[Dة}mKß&`v\o},O4}dԘ׎n˔ ?3Dm5==?:X rLi#    IZyRdIBn=e_üV&lݮ{<'ߧ/]P>mq4`atB~1 c̈^9*BRm>yyRҚ _sUK:d1BnޱeːRtiko=WoNiح_ WF%FU>m*jnkr"0T+^V-3臆3BbƵ"1V}q4D>" KZ!&2obVݧt׻QndHyV8J:5bӐ_b *UGAUnRg42ü~qDVu]rIw7rkվR!` I/ݖig JjYû٧ίfC։H|DF֥xCʾ{?.+ώ?"[)':%ϥƒ;BvUzS2㏋fwOȃF) $yrGS}@ , #@dΛmH7]".(X-Xԯ[GV}@2*jj.\$,?5l*ArѺl4 @@@@@ XG1Xڷ'凍LAg{W]U S\*NFY{svP1FGidsfc7 Z .>[#{C/O>.u%LC+}ף(- W!zz vHvW,ӻ xL4Wrʨ^ENYqzs]\*=VBԊ* ߾ q!@0.x*s,ХpuIKJ%88XZ}6 9S ՑK޼y*% റq9tlظ)9q     (@0cGe]t,(mt-;xY)Yal"]>n?Z:j1kT;vl7ؾ^Cr]j}fI-uߜ ̓Ə]搒ƒNߐ e1 jj]w~vvٌtl?{`|9ѥiU=FԎVкMbE3ˡ2ny_A=gIkb04Bp#r߯\\kh_^ߜ+0zqD6@qDI@4V<(/iI5X,O.^Ǻ @@@@@!@09 O^ ۡ3]Xmڜ?o!;Aѭ47=ˌ%;Nfm8}OT";+^; yt^V/F(#$ۏq 5m`i3h`l48ZuֶV\hD\uO'v/bVuM[Q=Y3 WCm7(y&w=:\@ ,&C? ;R%K.|ZZ*! GT.\hVFOs ~TZ fʎU>o^s_xuIy٭a~Yyqԫ n?,O:bW&;IBfH)nU ?WTXYC4@J`a\Ir@@@@@@@ nƑ/B~ t #{t,(OUc<+⨬몼%ltnG7XH2w1{X;KeoY.urV`WIK|:/n 97yy+B}S!2hON5sX^?5$Z{`ds# f_愜Z :GT{H3`@@  ũ       @< ,#l_"/YPÄZj 2e~РKRڬ吵^7  , O>@@@@@@@ 4w2c9ڏ<(b̈ kT4Bg1mZ#rȿuE^|xnX0n˜ pTvUMJ1U{Cʾ8/%[_:bo#׍*v.-y]<ߏG+N0.*5Jy_{@N6Yw- X`a@@@@@@8uZ6k,rFٿk[̙}fQ 2%]:cBGʆ{{]^׳G32ay+oV;5Ǿj›7Ŭٱfv{o#7K^Nҧ gbc4up-8Y;g-\xFYFN{1 D @0!       (@0Ͱb#_H0B] y:RujFg0m#$j!ƨj\ )}t|tiDXP<`4ܵg:7PX_w]喾O/ˬ|rP.*kWz5[–WW>Qz}ϮSO>O_ +VL‰}>3K)[?*-Y3t<{Cj&kxQ۰GVu?@.@л G@@@@@@@ X1 Fu8:X1_9dԬȯQ^Rͱ\-eПL'mgKr &ΪUs3:"qQn޺D{1_ Vc\K}fi'H5j`Jn3r][gWSw#!PKB<[T"Esg.ˤUF@IDATPa&#˨ؘKD} @,"      '@0}.PR"X8ay?-X2K{? 8ܿBQO #@Q˒>yT2`>ka|j!m+&ό;j}(P_sTvxiReӅw>@b$@0Fl\      \`:\_Bh:l;lѯȓ6BWߖRo߭@8b`P]5PR+Xx-wy:e3_&^/:o9o|{R4lZůὙelBV=;uݬbxjTy.\=E3>Ǣf_)k H#`2aM}|H6R2|rxJ漥"HkZ䠖%[F/%&@@ z        @| ,t\ 3T# Z%y5wX(?Ӑ cRKZ#竦m.K17_m,OM<߾X8`[5w?kµے7[*P0;Qn'$cZUחa  +b@@@@@@@g }F{Ʊ &Py» "+rv X`a2|^@@@@@@Z`a $^w9      $mI{~y;@@o00@@@@@@H G@J`aB\@@@@@@@ bG܉"   5rG@@@@@@@X ,5!7@@˜q        {B1O@@GA @@@@@@~0 @H        &Yb  @ X'WB@@@@@@$!@0IL#/ $>o1      $cyK@@ݔ0 @@@@@@@ X@@ A&;MU_ʕ-cstrs;SƌҢy3-Y&~L7βq{ ogKR̝M[^Jt4];(o=ql      o(*V2_2i¸_7WҸISɞ=yޱGy?GxMb>H01cG@@R>iYl\ g"}_J4XzܽWL|ygܹ# i|/d< 1o,Gs+n     ȑC:Lڭ[d@BҨqɕ;)¤4   B>Yvؾ-'S]V2h6l˶] X=]_JR%ѣҭgoѪ4@@@@@/w3*f_[A&r_ l#  GI%Xhq%~Y]|X`!K!+B0      ITˣ눮BumI:x lNǔrl޴^7lb,L_^ @@ aZP5oޒn K͛ QM%[%$04n@zdɒY9*+V-n*(_ȟ_nN˶EKkr)ujՔ:'>f9y8\pQV^c^Rhɓ'\$Ǐ?6l 7;XXd U)[\65뤶.G|je-Ѩa}P*Yv;eͺ?S #54ϟ.]n)f8KάX:00оsbњ5lҒ7o9yw,}EiFRbE)P ٳWAv#Q jE@hѢ@XAz㵌J*i9;w^-ct6ilwӜp\[7_rUd߻۶[     @ KNu ߿ iz >Ѭ͗OT>$2e=zcJPZנ,TH2fh^wu 4Q޺e;cyK!GGs@@L ) -K.KaV>(X_N?dϖ WhS}#C?̭2˛׭9z츼йL[}Pϋwzv7zˋ/ti}΍uFݜ]> vY^NY>cb=,,R|'r_nZ;+V7z-O:>b۱،Wos͛2ۙnw1t5}J{?&sһWɐ!}/熆O_6     "L$ߔ/F.=(X9 ( wԩRyEAПf  H ) iܳoYrfu%ϔHr~٨ #38ܖ6k ʺѣǤc$:B ƽ-~Ξ;O{x\W,|}G |~_lWvVk$sBRyC>Ҩ*yDO5250Y Yl}3gwzpvRR[x 䤉_+Ĉ7FSb3^OcBQ0sG/=CÐy>yz>     (SyNTn`KKBO΀V{݊(s~gNLiW:3Ͻ(AAl6*k[>e,z(cA.m/\XZ✟BrҤQCzR4up;w.rYcr=:wC~h,ҾV|h.olۯ̚= /K"2v ԗ4iVO\x~~԰2NK֦ӢGtQX j4T8n*FRuȺU[>7!N X<@@@KP…@Y0o?w.Qϼ3Tx'O?+OLwN6jX_ƍi{Ү[*ݻlkY#^'!vmZɠw :n֯>}}.k1&5nhJY\ n|2t 5]'֦ _Chg ݖ kڹsFz4lt|kWC<,<~ℴj~n/U o߾-Ui.sKWm,#l>3־.:mA~-\ Ŋn)~|9y)RZ{,~bt>SgE Vt}L6-ۙ?HCI} mj[06s=)RFO\~5nܿ~|`     RS-df3 /hU0W<ŗga}~,LLX@@$$Bo?7u_E+oBwTbqWݾehxJC-mϊ/_1*-UM͠yǏ =.1'O[fiڤt}.#eޯH]۷Y9x[+WY3gاj8rnL7ڮ, z ÏYݮ Z_5^tia[rUk ǽB'{e}gP/:w˳ ޸B2o`3Xl_M6Y5kx2wN72}W%ھy[06s`uWED}ֱ' Dnsv@@@@@W Jg;̟{w  ;3u%s7mX/ Xt FW@@D  ;&_dcP il΀.Ug9gP7GI&FZE{PTu"ǑU, ڴzZڶn)GevӾ xx Q=ZϮhus>֮,lTsx@?*+T6O \J ͷe%nKH["ۙa)1kV,1{Z*#ٰfn^Zgɓ5{p=([O ue P3X8Ҡ^H?߿W 9:ނk}fWzH_izOs~9     @,ʔ)+O4ʼŋ%I)[NRL)Z`bctyNLkW)C~>P}W.__O2aAB? $G,<`˖K^)M6ʗVjkɂ\2VyϨg,c>r<.Ke[mҳ֮sF/Jg=VNpK pڬ}1^7ߨY\Y4}o@8? c3cԱQC}UCqt~ϝl#     WV,{,Z[7{pnкI\yRlfDes]$XW`@@#/V]O,-$eTr'O?&\BuUPQڮ#gΜk6o/,YzutY<:[{_+j89Wqr/on=FN׍*E`+.koܴY:om)\ܼl/, oy =ŊY ;~X`4jXe˟[}ɔ1٧X-A?7Y }<::/v(}{7AFo~raitcG}fVڴitJ2tGadmGfnW(_X]Z5V 4@@@@@|%PTiyYsO:},44yr߹`UU:u]e'M<7 f*  B7ߖ۶:zQ.1wEyLRk^tXnӎ5#> fϝ'ߦ2d`EKe^`ի=Z'h%;m-n|`W3Z{2XXoZ9qO4nÆ 7,VJ@ܭ[{ fϗWO#GJæO۞B'Gʔ3ixS\(60^#֑Olٲ!9*+VRHa;u*@:ծ!ɑtҙǝ՘sbjF k|[v]2[PPM%#;vV:ن HZ=ڕoZڝl      UҦM+{MކBG=%+Mg&T?„  @2H ¼˙v& dGRO鵚/?bwz{K/*iX̝z51m}L7n 5mLGiPL;VK20sUB}ƌ;'ӱ<3X!A1$%SJ)Goi2橞BzoG\m) /ѣǤQY :AFGj߭.Ӡ^Ud7eA:i1gP/K[KNgϞM rUtֳ,_܍xbJoߖWٕPUΙ3751ʀZOw7nI*soa/;ti)mm]zxႹv>/nT>3_WɨƬ"wCkd?-۲vͺ :/ tVf<[B}A}*J ._".3v>u̺Ts*'6 _[ܮ@oԥ 2[#G:G/#X!}ǜ˖,;\BLغ];3ګ8Ͻr,]P>m~5 @H> kp*1 KOC}FGeh Z   ,؇       @B ,L(y $s #      ,۩a`  @ X痷C@@@@@@+@0#G@D=} @@@@@@$<   yv      $gyyw@@ & >F@@@@@@" X@@|'@w@@@@@@q-  @Ƙ @@@@@@@ ,)/7G@&@Л        @ ,LX $[vyq@@@@@@s~>A @H ^       &d  @" XH'a#      @ X䧘D@S` B@@@@@@@@H C@@@@@@@HFJ    X U      ^`a   @ K@@@@@@@x X<@@ °&        @f1  P`a2t^@@@@@@D1M @Hz ޜF       4&y-@@D'@0MF@@@@@@d"@0L4 Bƃ      M@@H C@@@@@@@HFJ    X U      ^`a   @ K@@@@@@@x X<@@ °&        @f1  P`a2t^@@@@@@D1M @Hz ޜF       4&y-@@D'@0MF@@@@@@d"@0L4 Bƃ      M@@H C@@@@@@@HFJ    X U      ^`a   @ K@@@@@@@x X<@@ °&        @f1  P`a2t^@@@@@@D1M @Hz ޜF       4&y-@@D'@0MF@@@@@@d"@0L4 Bƃ      M@@H C@@@@@@@HFJ    X U      ^`a   @ K@@@@@@@x X<@@ °&        @f1  P`a2t^@@@@@@D1M @Hz vN[N--%,P&eh͸qjډѼ6ZJf'ׯ[Gg]G[cZ*c.5 4GH…eҥF|xce֭P9v?lݶ=ss$G~]H^]sk^;nW2rX{ߗǍ w'"WOJGo4K,ax2O|;Gܗ-[ZJ(!)9>vY :^R{ R|9xw|ܶ{rehѢrٷa,KqGb:VZY^#[ЩNZn:O91ȟ_n/O˶;ingf#ˡ~ 0FC{d󖭢!9m7@W<-}M-o/m{v"i>(%u딽~' 2;+EVYg9^~I$H\[bnߩYϗ'L2٧ ?? __0V.Y O[}UkARH)֒I]׮_2oU>n֣vIVv5 su{n\Z4kʚnzqU=s{deg]3~  kkd+w×V[zĝ>ұ}[iX?X]'XϺwWN/ە:SzW;ORzyrj/uݞNm$M߻]tQO1mI!f .rבq`ڵi)M7WB~^+tUα,      `V+tܸySKyg6kd5V2ۃ>doͪ,2q+ּ,5CEG@@%W:* s-S&MׯL} cBwBa}G!6m,tWkkŽ&iZPFԢ,`3M4N^ɗ^Bw5Df~݄t_5gHl/WJAkhh}ٶi{!O0ge)2aoU]tR%s>k6tgYK,۠l۾9ջ⟾.^*͛6[p!Jݨ _fhNׯߐ$I{eæ-p}ckrيiVٹk@@@@@n dx1la֌Ac;*[3g%1,_}i)9zgٵc={`^!X̣C@@8,I#u5${,Z G~>lwP JHhI-\oP+ h#pBnUݷ;,mS'I!;lLcр_}+Z.Urw_xҼfzg=wP+_}p者`wʇT8!J$}J~}/^0GI?lU~QƎ-YF@@@@@!Y9⥋2~tZ<|≧UzӪxxѪ|u9Om`aA@@\ e~:v;r,Yc[0 I, o~wxO]aKٲI;ݳ+9 6h\6o澼|N)ݩ`}/GMUfζ 8E>Y!pʄګ̽=;j~c֔՜ }&,aVXXN-ܱ}xWtvXp o8嗲ܙӝmvpä-WSuiK/&=uq};oOmo@@@@@hmH0惘9s+w~o>@g>ص'gl(V4yٷ+PZL 1L }s[/oPvk^Nk2-9|嗲ܙӝmfL(3>0wܵǮ%_<=e2i<9:U]YD@@@@@ hH1C|b]O=Pv-8Q"m3M?g[0-, Ѡ/  @< X;[i3Wߴy4l^;EjTl߰i4nY/VYܱL$wSjJsZqN[/S̲~^|g]vo,NmM1SzʚKݼÏB ~eδ)'O#_}\n]R^#Kׯ[[>v rɓK ]˸-VSy}իW!a?۷Hԩ̵0)F!zAnWԍz:Y_x^2e(9#{V/Y*o-:6 :7П=Mnpႌ8YO=v>=RuLc\[f3Yd¹εZn'֬w=J7KJT!G{?S MU-ߓ:岻iҤ˃qѳ2Y}պe3)QGB=PN\@@@@@@'ro-If9_.jjeJUZE,;cpvZ ʇk\)9T j8   Ɵ OcL?)cCcsc+Us镫֚ПZpOS}Eə{_,>$IX[k0V0Se9|ߖwOd$}DK;\@@@@@*P)ӓM]~9vDo(a"ɜ%<6$KL~w9uU DЭ2   XxǨA%Jݴa>2SVx-)iUֳۖm_IFU^@@@@@@;-@@B , m⃀VۺiL"ǽq㆙ZÅ4@@@@@@;'@Ys'@@B39^#Kԩ|(?(s/ v      Șq  ,q\XrE+.Cr-I0L@t@@@@@@x;<8  pw]      %@0,# Ĩ       @F@@"@0*z      Ĝ˜  , ]       ] Xx5  @@@@@@@ 7@@  ,Ãˣ!      @ X# W`a;z      q[`a_@ZA;4t @@@@@@x@@%@ns_@@@@@@@ |@@ ,E@@@@@@(@0  9s,@@@@@@@ ƴ0G@)@' @@@@@@@.@@@9<5      #z IqrXy(@@@@@@   @l XG>#      @| XFgD@P`a ]B@@@@@@, @@»M@@@@@@@FH  1!@0&T&       uQ7    X 4NA@@@@@@;-@@B , m@@@@@@@ (@@  ,##      @ X+N" qO`aS@@@@@@¸1<  ƺ!       OƓ1@@` Xl#B@@@@@@@@@»M@@@@@@@FH  1!@0&T&       uQ7    X 4NA@@@@@@;-@@B , m@@@@@@@ (@@  ,##      @ X+N" qO`aS@@@@@@¸1<  ƺ!       OƓ1@@` Xl#B@@@@@@@@@»M@@@@@@@FH  1!@0&Tf I&T׮\r%v6=cGI)eҧ_ב;xgǹgJҤ{J^}~Y_z̙/f|E8@@@@@8(@0* a=#K3f]L8. š3*]^zto9q̞;W,]69ovĉ[RfqwkH#~WX&Ӣ! c :4~m߻[Sa@ .$45{C@@@@@ ()@@ ,[cUJYJ2fzB&L<܍7dЎ1H L|o1ڣʕ*J.Fx;wJExĜ oNjksΕ|(Q1fx|pl 7H@@@@@M`aA@¸3O>NE@t,ŋe2oYb$JHҧO/&Ms؈2~Dg;+ЪEsI2̝7?FonV dɢB+H%mjn[#      c# %@0,ط=[XW]oFr-I$`{zim.[B:wqS&I̶:,VJww+XRbSF0nwy*@@@@@!@0~3O  Hw瞗"EK]ݻuZnk׮N;e4vz=O(X7O?v9ի%2e$;`[UWY=A֒ȨcECjvkۦҬicy_-?/=zsۧDkɥQR.]:I4 ݾ}2{<ٽgOJz͛5,Y?&ɒ%?K9* -K:瞓7ۧϜ%.\o|y^+r(O&B]СÜXigj5w͝[c5E9pL4Utjkw+[T(_lJ ʕ,_~C-۶ɤS~pYN-TfIKyijT:F׮2z }蘸cMU*Iv뽗}mzq?/$ukՔ,y=رS q}/=dʔIRN%,3" A(@0%?q\[okokDO=) u=Gng`2bS$TVAvfS}eS'Kl/'O@~~o+9JK Dնm.͚FjҺ{&kcdK(&>oXJ *(ɓ'8FW.^"{r/WVz 5k۫Kzl^Ѱ^}]4PaZ:ue߾;kݪ4W,/[R:5s"3&vP z A&QffstЏ?I-Lx{m.IYנ㈑!A^^pϤզmڅz|A@@@@@  ,#! A`al16 5 5"4x\t)֙ U";T%| u]BeW徔)X" AsCt"͚H!5U5sҤ$r)_j\dNW;v_e*淪{ kC7U缃XUk׺{\szM[ș_H+V\?a„}+/^+4/Zqy'p#w <*^T7Xezs[br1{+;Xh_GÀjd"ZnUה٫"yR͒^Fw,_tߊK7J[3g$CLUɇҦ*U![nQҾ/     Uqudy.@@ E{=Xh?O~lذkXB BYoUK>s]q,8H~(+\ZmݒԦV[yU]9r{\WW6]->_sC槞3IҤICUƍ/׬ YҬic}̸ѡ o;XpޣWx/`[6ԩSV˙.gEO׻-[^u^5 ٍ3.*Γ'xœ۲u[ٴ9js1BT~}~*6u]UD# 5tNCBu$U*W86u搗_~IN`o^ |{_x%KGݺۇ     @ XE@G`aEL$ O<)={]wG;Xl ܵsmwJH.^\rQ]孧UmUn3Nl^[n˹ڛט58ֺUK{'YolPn42eQcdq.z^#2-`ᔩdࡡngI$+ԩ;B=DҨaCy,4`ظ{aNm6:X+QVoq鰂jZryOɘџCiM_a{ Jus|珺ʲ+u@@@@@/ H  @ , Ķ`kdOkׯGFxBs0S枳̓w3gXN)kŋIpvU^S:Wxլu`5zUolgh0vvϿ $Xh_I\Ңtem[nZxubm]Ky^ʘHI^cM#Gyw)uX ?ЩB}Oo ƶjUCtT:}:@@@@@(@0.*τ `, z}6HN:'Ԉ`իWdrΔ`e˥KWiYT)bnBʚM6TgϜ˺Opn s^ iON\juwDĉR|#D~Wy[1-`Vc'Z1af] w}W[$YdrMT9z,YH]sgt*C@׬m+     B`af@>7&٣,\bk-衮QPOp̝'}T-tWb;w/Uƹc2)w!Xܞy̙jd.ezI:Yk:uC]n ͚m۷~~}zK2̺AkL+WKz&E y"Eސ!?3u*2o}=R^ɗll 6P1L0M4%4iRӕ-歡CN<^Σƌ|ymaMW칳ð^ jXQie!f/     ayF@@ DK=(͛5t9`9$Ɇd'NJ J_reo"YZΝ;]jT&>hl[frOH Hl/JvZ",,T22| ~y׬JVVTI߯Y/._!CIYYU*W j?9ֽŴ)Y&w?yv5ǎe+0꿒+GPmyu\Z>}ydfۅ?E{o%c`EfҸQӥ7ny_[2f(y䑒ִ{5A03YY_LĉL>]coH7K4a "իU;v0ϲm?      Gс@@` X#X*Wa Ǐ"<..OPwΞ3O~lk~kSV$,ԀWxmEңg1L >{NBfټakjo,!,YNuBgGo$Rt}"ŋ5ª>{92c`{I={6nZýYҤqCI0{r B=q&˿TpႮ@@@@@ p  @ , ޱL*U&gǏ" Ύt@ٲ_^摴[|U*I;}gϜ:ǹa͛dƍҡNȊs&-yr6U_^X|dx4h+T7G֭G u(̕៏ ϽA5mb vo~lܴ \~*U@1,?q\6myrΝ;J槞 u :|dͱ&MFxS// =>n`@@@@@X*@0F@b>N k_3YAtʿ^=1?H&sr_Oa#F ͳfjB5-k!+2e 9tCM+m߿GoYHڻ"zDG=w_ 9w8u2g~ >ܳV?G>Z#     Q@@  X@@ `_€/rNI,\~]ʔ+Os@@@@@¸0<   A )X 'M&._1z       @@@ X\ @l )     qO`aS@ c0I(T $ίWTQjתa]C>$E?c;S$O.͛5{VҦM+ &0M)ssjv/oy$Ib[ϜP'о̑Cm8з@֬/H JիWrA||l՟/U%J$gϝ~6}/.\qd6UZEޭQ՜r]@@@@X,@0]G@b|^ jЦf~;cႆ _>pSݐ[F|  Ə\r9r#I1?/dAPW?DѠះ=ޭk)[Tk7'M"C󣣵{ԩ]\IdΝ_6*ߛ#Gݨ<pBE'+Vv   @| XFgD@P`aJTFMy a^eͲk0LJQ /_˖-05kD<,tHbX3TNGDYҬicskׯ˾ɱ_~1k׮3/IqtgxMV:4'mZK:Q #F{&#GO'Lm(u*L0zturU:o~ÐBqÆH\9ݛ=7n$o-+,~Ԯ En<)Eڗr]   qw" ¸>\<桴b3ʩӧ$y >*ۿ&w,lBw̬/ ?G&,@Z4)S៏y{uЀOXѢfNb*zmjZURg>^GUal 4oCӫVX[uv~?gj9dκ.tTRղ=5ә2VJ珺:De`aT;7}v,o\9 @@@ n ,[  F`a;5iL}|MY0:y<Y޴`+U"42#X-{ ƞ{h>/S&9W w*Pu۴n)1>Y4lG4sW^=o3ziCB]{d9X X׌m] =Ǐ5@@@!@0~3O  HwL̳ϙwZSeMy['o+u4p u)RH޼y=/^$~<$Sΐ[Fx@zB_9^Ҧɓɕ+/Ǐ[Ӧ!COxM[J%yyԪ@a~M\ٵ{~~ITᱯuŋm"-[?6,<ߤx"b֬r=ȉ'eE2u0)tۺjOg 2Mkۣ~;vʠ!C<ѡR)S&I:?riYf̘1#Ԧ*6:˘HJ뽬mނ~Ws.D ڵjȳ<+!ο6IDATݗ҄w%׮]:CmޢUq֬/H&?3Q>9fʘIw1M8Yڪnޮ*ɬP{7'NgVECCu6ƒ2jcM}z~8-]Z[[2e4g3g_:S9k6},X <>^៏ݺu"yr甌g\~2iTRܛ,uA5z&Mѐ'2©Sdu' at3 VGe˸ÜJ>&Wɖmd>O)eO8q\d?tLT$+m3UQgU`b>+C ٫W$zR=h볯d$^]nϭ}~9VVυ a!AҺU OC?c-Zۯ1,A'yD}| jg}&h5w͝[c>8tP&[CZ5ߕ7 4߸Q[?{K+9gΟظ ܹ,    l mD  OƝjɭ_iid0,( |6pp)$XhakN]B=wwʿ% $7yjsyc}O`VVp^FS<΍m+ z#GqB_7jX yMD#}PI}{-`b҄Vp sVנ Z֐﷖DD2|vEfLÆ 2糳F jPqs>YPí@`fg{ACL!?{Ao$T}@-+O=9իr(n~mҬ[l.R>w&$]͚66oٺlG,&z`o<+.$IB*aٻw#!uSvT|ms-Lŋv,VڰqվjDm=-ʄTugמ½ZMQۑGŻ傅E?Ξ'4lQKVr]sKo@>"불Ddž5ǪF3VʫV5rZIDI"E ;ߟ |_J/f u$U-38C.j*eޡ2}߰I]vӖ-Nߜ9s1C|ٲenf)SuQ#;:%VUOwsP5ګIIժU$!ޟ $f|*fժ-(9'Gr!2c:)RغЕ+U49bfUV^k`WzTY+m-f^[+Tjkv٦?0i.FEGoK=y&Ҵq#]4exY4i2nU̞=ڤ{iwL7;Yl :nU~|yͿq   A)@0(N! q_`am;_j0UTfZ ܅ { ;, %ZnӧL~Y>05`ttzQw5ƍ{yWXv7 UR :jcvBRSjM>L(l_",t(4tBIARzM@%ã!A# Di0n@?w (iF:&HjC FVm<*=;thkMcJ?YvC 5l#`3ꔠ:E{::])MuH ov0cRΐ/W['$Ԩ.;7 5Ŭ2 <4)fʨVPZf;Ħv?~c._,ZJ8V,u*ii5ݲ67ڼ> ͅtig}UxթGzI2t^aҪEssI}|^ 鱯N̪L ޺iFURM4n>xGؽe@@@A`a0}@@¸1ZnޢhӧNI"ƴ6 N<9w2hrqڽ{\~) 9O)dV|D*ZUcj/"Ru i[TgqڵjJ!U4o!ߴ^̩.]yfxi@$f'4LwoҐo!Y;YwUl vaO/յrSSʕ-cBڼqܟ:٧ B ,UVŪp9՟?p1yzo: mǶ-T1X~o M\X!6 TQ#}ͲeKK!?3|M?,ND{%Ks]=t=հ==o/۾m Y_d>=]UNus?BNCuW>ӍZTi@-Y\>gqvUc;بar{`^a3 ;X+h5l*:}nSG6}v4 'u5 ;{_ b"ɕ3GZ~u.Bd?ߛGs,T/3J[ $cƌΞ1=.ŕ@}y9y8*/s  ?2.[>:p   wA`]@  " ƻ UTfL;4تe ҩ' [;q?J~%{ wpÆt_  4X'W.yǪUtɽ zerĉͥzVQ[׏:K!}?hJհ|5\Φ*XHjZV kWI >=etd}+WI]<{>=F;:e6wuU{}ђҭ{Os4M+S(],,tUšB}\ ~G_i ί Xa}+yl|ąQ~oΜ5ۃ52B}klҥ u]e^_,ClZn3ǸA_ZTZN;X2VӺl'z\zl ᜨ;Ӣe";g>@D) ԀW;vȖ-۬ +i>ݾڲL5!bٻ_٧ ZRY++Y:T`?WB}T:%6H`rt:V^-M{o#%=TrW[|t(*{@7e;*`j6;~}9v. ֠`R!>H:b~ߨhb^=o3vzٱkܵ -^4ߏ_~ʪ|DP3&ƈk"   @  ] XxWc\w/ԩκ.x5%e6mϞݲyzwk;XRbwsWy $ x_wА2y4g1$_ސi4l"ʃ|9"T w´bX m!VprE Pd}BVwwnu3ns>IXA ;/I̩:}`, tC/]":P올XXW M&<}W'teBh8- 2&ޜ:mT6 dg߿Jq!)^1?oM{ 5ͻ;^X˾걁s:&:eNfU-lU٪Jl֨|v Z_V}^X~]͘!&O ՟`J"EufvWG-\t|}Ƹ]wչsݗԲ;X֖[27~ |s]t yX oЀOXѐjyT'?6Cn+٠?\Yj6}|6p]p\u=Gf%:$M> 4XzezI: u]Rw&L,Z2Z >yﱙ3Yo' uVR7~|Ӣ,ҽGAg&}1R]3 ؀   @4 ,FL.  Bm;&:A! Y/d|ߩe {TiSH!ϟQcyt⥋zZmZKy7{NݮªhoPIjZvۻ[nr rMɓ':5zcCMMijkPz>C{5}EG>-M1+1:{͛JD= aQ0kP/2>VJV]mG+l޲}Zɪl5_>3skP'6x /^(w9BǶr\Fj1c?=oO&Z {?S Q,5)}~OK ";&Qt+ioNPÃ7n4:/]dNkݪVUV}@K,ǎƄ:ƽ]W6`N>ןz@9Q}M?,_ 3k^s^ɽVGe_(1uHMkito6ZJUYkOpRj5u5q̙&Ԩ`Vժ7S" 6oD6֩a_ 仛J`vd玝bª>{YÊK og;}&9E֩M-qw}Lˑ{}@SN=`AgS!RݶncGIh%#)AMZw5> 6iyǎ #FU=*T`EPhoS' ϛkι}UCEŋRJʓO<2txjo~ 7]->F1^ΕCdBl%΅"XаyQ`z} 4T]IT@Cj@;Î̺Vʕ5+CZQV=R^ky\ s?V"3&ޗ@>[w8°|žE5q*YB/&ixl=",|2ޔ0AlgxE@@@ ۈ@@ ,;ݰIszV,_[0H  K/*> g!>ίHd͛#Gu;XUڕV;g Eª //G}Dan;ӱ괬ڶ(kyܽd+'W.0>at ˗++{05xzu*Y-~T0TX2"̚=G43M+i~"֯)R:/_٥7`aEKJ}GU{ Ub$4)WAY4uA*uݕKUCWڐl% .JJI0A@s<9id2̙?sfg~1^ GsRJe'NHmbkҸMꣵnZr^|[^   9,@0;# yU`aMIwnG).Z%#yџ*۷&͚b y`^ chʏմʖVҶfZyjHkף?$kuZέm3;^mִ̜>zg Aj km?jdU,A,N4d֣N櫏BQpE{xtI&*:͛4j<ġ3\XMC$ǎK:t t8O_d*ifu6N3]lΐJ|NEZN\cV]J5=nQ#L}矽;7O›s !)KBB_nL`/5f3hBϪxwW-fm#;G#K.UCt^:yrggfgxi^nQM4^#k֮:k8+tXo,y A|¸>2̳O.^ %K2̗fɨՍ9*t9gOf}rc;vV,[,71DyZ<.]vZ ְߍ4u=/    @,t  B0t^paaafekWjVjվ͜!{g͘&'o1"f̔Hwq3;[Ν䟣8PM_R!mVYbԗ>{Akna U˖*ڇolKtժH3C#1,az?RP!sLu _հ*6폥˖ Sf(:t1V&Z+bZH>ߜ?_<(eʔ͛˽mf*;0L~9chGXySAk`S6*VBY~tse4pi-s jH٬n\\gH N&a=s0\i ɽgrylT\f}pGz)T[!u u_ǎ#uRsLfޥ,=rtQn&}V~ܻW¯*j~=Ե-z kٴ_>jÞá: E)K-jg6 4h~=yJZii+nj^73,>B-[!W_.C$*zwk`|ƋDzGV,:Z/q'\ sZ>9zj>:766V^;OvVڵm+:,rt9dwFUfL\[P+qp*THu; d4X;qVay3`ꁂp/>ΐTfB.=z u~A`mtV*VK+X?\Dʔ-cuwk\5 :limg-s]Fr\tT&ׅW;9=Ǫ`Vzչ Z֐S`tǬm :+yn;=g0zLsԬܻ| v)LOs?jpOg2mj65 6C+gzө}pnwA4r~ Vs ZB=;zLکWƍ%[ mWt9yk}"O>=ܞ,xL2s_ |v`P߽x|;aEϖY_jU1R[lK{Vؕ+zon Mz_i   ` @qoo(Mjj6+jRџ;fGQ|NhhV@y4(kVvIٲe "ǎho۹SGJ@kyz_-+!uXemQSCq+9&t׏CW{s̗`gkڲBu@|ZOk^j/^uVjLCJ/,MjpZ}jrU:쬆M ]:䊛ߴmtZzfԯWWJ*eߙ'M0Wb gsB^7l,u@jƱ?wuiu_]VѽHժΦZ0jTW7x}9wN{2 c7:W3+Y[Ҭ)Vȴ{^;Mg,( &WMO }Rbڗ果 7ŻmZ5kjO0:Өxڰx?XMZY?~AkT 75{B[+WΦt,XP&OnӉ[6YJ$˝͜2Y_C pe˕:SNWC@{-a^͚u^k9t9sӦ}W'Z1nj@@@f;   CsK^Zݸ+X9zh^ 7H5%>1L6?1]q*c}i,TCg wXtx>ڟUcC) yfSZ>(+$^zxyp`J,aV_LiS@7tB,"4CyB}Y(jEJm+a3֜vըQCJ'СE¡ֲrʬV󛯃ؽ?et} ֬^Zsڌ#;׳:J4n|ر3ßrS y^-Rro>[F[b,#jU#FH|_GmJ*)_4Ҭ72\P14uX@@@ X|}! yB`af.@<#pqc}佦Cv %gP  3{V-[ʔNEZ'`}? [v   B^  9"@0G9( dVzӾ}?¤MV~SyϽ^)/.]BڢEsv-&s:s%, .@@@!ӕ\  l@@ u+XIII2(YxIj0 ,|2r)={w~fS Ys$@@@¼\/  $ #8 @Ȳ@xѢ2q8[m)^sIlO5ul= rZ`7[/ Ҳu }˘geQz?q fMQ掟" .A#   Iy۹h@@ |p   ,!/    @`a9  Bo        @0zs@@<\2       8I@@ ^rE        C @@ ,u] #      @ XG:D@M`a      $ ,䕀  # s"       ,L@@C`avO@@@@@@@  n@@| X        Xd  -@ۄ9       @0, ^@@<(@0v:@ +R@~ȥI!zsYe+{E@@@@@  *  > ,􉍍@  .]/GOy I"$%i1gZHt%Iv^$_ΜGn)     @`֛! !@B -*O+!!vU8#'XÏ{SL?7q4j <}2{+h=sH >Z۳'(QM~.a6y:er-> ɉiR qD =ϕxn x+[$J *OwCGCo??\roәӄ+9(@ P(@ P(@ P 0XC_M Pb1 z^ܭ c_}S4\Q@̞T)7[d&gg>t+g¦?G/Jt>`?\ٲ!޷i^j,#Cڴ@HU8yͩĉa萁(_M`O?M_g~hV4qOE;oF"O.>s0f*cgrEȒ)-H*)7U܏ (IWڇ-&Mjlٸ^^9N82XѢ6f,J~e^#>xT`-g.B 5X(mR r=x*V($K7e)aKȘ! 8AU9)Xsu {hz q0Iw &gkz. Ͼ s4HiVE{< D  P}Tp{*$ nj_=SꟿZO]s" Eq.Yov5;ܸO P(@ P(@ P g(@ P(`a4⿦;t f͘'7̦k)S&}S:pAfN" ΝBԕz'NDVmghڤyl,ܶeN.%xil~eYƐ`^jYysE;QT/?gˊ˗SUGV*2X_/K)ok:`$ূ|z#yx3& ݑ! @ /zэ^WUp;n˿'>xL"լ\ TT/TAo*Tc5C@ %8tQU }p\ a>xMᙶمg(@ P(@ P(,oF P\XB~9NZ Q级ǏaiN]dΔׯ߾uT[@n] 0[H3p`<5`Ÿ"6W v"OS(@ P(@ PqUA)@ Pk 0XZٳiyK^w{`^6"_ѥSG}5@h }U4!\9Xx}:+9&OŋvktR0vn߶}z۔IP'ٺ5X8x0^V>???TǏ2eJ޺yKK، r\e7wΘW,oa|H_%^jfaTB0TBw7u^RIBtr@G"y%Qm T0㥃Xjf-imI" P(@ P(@ P@`0d>"(@ PpE ]8gNڣS0vs:^ܹ͟?==ljuF$OL7k'O2jP :UPE %) c?:U01*(ԕشjQtχ(@ P(@ P(@*`a\}|n P( F uIVXkWFhNZ8:pjm` ]H7Z5{&Lrr//O<|%K 6k,RF  mܴ .]{`  TM8|$lz(Q9[H/ &o'C*>2D$Jy\Bja@W& *(B+TaC r M^_`ظewLL\vQ`(@ P(@ P(,a/ӥ(@ PE&m#u4hܬn|L ^;8a,J('Ν8&ӡ]ċOWV#xݻvFV-uOĜy\йkwGE.]:Gupo݌4om`aby]{?mA4u  M2 gβҥ=<_{aF?ܼ\T?拧cIϰJE/fE償4'T$JJ "Z9.#l?}7吏bqg*vN0vH P(@ P(@ P iS(@.`aL_^CdʜY:\>Wc|BTnO#T0G8U$J#6W_`xDP(@ P(@ Pb1(@ P@`0fWͺ[P1}$;39/`3wL(Ovurxi}=[6-[Z/|E-]VPuC}Ǣs;G'(^ݥN9pwCxn ]eC pWGUT[ќѭZ| ]J F~~ʼs/@CUL UP}竖HVtW5 =?_?~X&L__gq]Y~(@ P(@ P(@ P1]˜9 P(C,/.i*1,x͝33ԐQz7mFN({Xz>'AYaIkή߸YF9Fj{܂]"G >Fv;+j)R`EH:uSqkd`O2\b9/]RBcn(˖ κ}S3Ф><`:^5> s TU%E7, TC*`(X7P!_ ̂sp8<(@ P(@ P(,os(@ P1XBz6 Gx,O |Ԣ~UaTnmƾ)@ P(@ P(@ P1I˜8W P(,E/ *)S耤TS ϖ?>Kׯɓskes̡ln}6.hS1GyӸ፤qKx ) &O㥯9 #q K 7>Kı='xUP?Op/c IPM_~Dv(@ P(@ P( k(@ P@`0c>! }uHA-CB|QS뽬)?=ߏտ/U%—T,UY9z4}]I(@ P(@ P(,/L P\ABWx (@ P(@ P(@ P(@ 7a (@ Pk`5 s P(@ P(@ P(@ P`0h(@ P  Fސ=P(@ P(@ P(@ P  B}R(@ RW P(@ P(@ P(@ P"`asP P(@ (@ P(@ P(@ P( {(@ P@`0ֿb> (@ P(@ P(@ P(C,/Ӧ(@ P1]˜9 P(@ P(@ P(@ P 0X[,(@ .8= P(@ P(@ P(@ P 0Xg_=(@ D)@ P(@ P(@ P(@ $`aH2l(@ PR S(@ P(@ P(@ P(@ P`02z(@ P(@ P(@ P@ 0Xu(@ P  C) P(@ P(@ P(@ P(`a4sh P(,oN P(@ P(@ P(@ v87 P(,/F P(@ P(@ P(@ h c)@ P@`0;Μ(@ P(@ P(@ P ˧(@ P.+`˾L,o铧uJ)RC޿w9Sfd͖ҧÓOp5x#}6ܩ9׎汱=[V|Uo-Rh2?%8}l,]lsNѣ{WWaإSGkZv{5N|.TfLi__?(qv6D@T];u:u~|K4j@Ӣu[?~"}FefD~ߦ͘)S7;XB׮Bԩ=w<+4QN@hc`GPk( z`l͛GOU=ޙrt P(@ P(@ P *,J]M P(!M[RյR8w w,]w W8!}zY $0ӥkݿ<hrRB۾c ݿI'߾uGU5f\hBXZֱC{P(,4D^gT  mf͚Y}ժ,ؾ:vhSqe}cNkO5i3ggwNE1uDk0}8+ʁxAN,%`s;Gz"E3ooI98bjbбKX[, (@ P(@ P@`0v_>(@ PpY ]Մ{bLruMm;tB$IuKqUp nݲɓ%_{C{9 n޸UuBن}?WƏ?oAԩa`_S٣;>}}ԩ)S&\pعkwؑ*3hQ+֦b%{tCYd'_3#;KG۶Ql(KSҰSOk#ǎ97A˷ +W~sfN:|g2oؠ={vO ]ؑi~_*j%y[nO6'O~*Y͚~DҤIR7kԥpjϗh԰߀oQZ7OnN޽?7lfXU3|ZgˆԩRɓ'7n5k:u?"¼yE&ȑ#;ҫ?.^~;1|g;"ѣUk֘ @9k%\x7?aRK4O`!?0صk-_a˩׮QCZ*]PA#wE?ȓ;72gΌd˾_~ClKm`aj%廗1cF5%Jo|9Ssux/Ϟ{cQSpZl k='6nެO?x/@>_֝jʗ;?[QREQlZ>(@ P(@ P(,OG P\VB}5Xm[oޅcGѥOM4^/ls ~*Z hӶZhŋ9 Λ=ls-;=;̀*AsPvA6oXC5u{ovx o&O/ D?,,c!S{lYaZ%rӦ-lcGreˆ8Z㢒ŋcqp90iqJ2maN6=wH?"XX=B='h萁uG"`aжM+~g :u Y[΄o#eG}'NDVml>βR9#C$`تm`C Ӿmts٘4en5vÿ}r{9cO ~շ?9bs*2c =*V`&1m(@ P(@ P g(@ P.,` pN''A!GBBwV?i s(ܺTwUAt&v[6o0Èߑ={[ej)RHULЂҟA$MDU˪|nz KhӺy%]USJU(W 7}Uz1#3nYrɓᅲl_DOQÇ1pT`>?ޕꅖ~L)R(@ P(@ P\Xx(@ PU,t7yխP*IjDoBi٥K->]z<}j^,Y YM=V3}U+g<5 9{\89\vTRZ+a=v\z,S*Kb|=,+:g|/?'Ls^\H&uT0XǒhhKN0JнVQG/m&3h$ blq._FZAr>:d٦MSGT CJI6H`l30^ؽ{>';"}꫃Yn`}Pq_x>,4H -,ll]rJ@uX8o\4 ~yGo>Cj3w> ۪3s/UF?ч)K.I/{'Y獛ڷmΝ:KeIcY ukV"[֬^wV":,!=|1c|\yl EdՊefpE5& 4,˗f#w(@ P(@ P(@8!`ax|H P(z ;ʔBBpMkKٻ'dyX٬7kRr~a>x=9 IOBQE6LG鐥TTQg<(h)}s&usޱ|;7nuz X']X>z1J]YO;wlVmiHF٢#Xh]^Z6~zBo0pPɨv0ud ?}&͛+VAo֥4j⴪|8a Z d.aCzwƼߝ,ܰq3vͣY9Uc"MTBڬ!?w۸V~7ث|ºV&w 1XxykDL"vjeW2q޼y`n#9D~"ي) [ ?)@ P(@ P(@"`a\y|N P(b  t<=иY MrlR筛q*U1H hp:*Xz)|S#Ϟ!iNcR(ʼ ;0U,nݼe>ZW/իRqѐu%H9%Sw؉¡G`qmd?ϧ~VZ YQϗkY fz%kE޳WW϶m߁ު6eȻu8Ǖ-:~ݧCRIbA";BY@̞5]vR2njB2u0CGN|>8fG~͘)Siߧ% il*۰ hc|ƅ`ðzZ{򕪘AdkۨX}XC~Pqϯ%Yf KRBJ(O*i6aR1x߷{'%{Cc EZ%21݅IxV~R(@ P(@ PqC¸(@ P,tW R,ٲQ!& HpqUCWؖ/]ՕifKkQB#$J%/z6LթUwww9:e^ٿ?\9XXbyœut fP 6cG*͜5 ۶b4Eo?~|hԸ)&%KJ(PPfTkҸK-Y #~ecHUF(ACvր*UaakT {mvX!K%E٬V\wrU!G. ssX[Uڵ GwEٱu)dG߭@A?!@kNToզ#6m֐5g\k6V Z}0N (1cfsDƬVe?t *Nc}T\ #m3?NcZ>(@ P(@ P(,OH P\RB|-T_?N,8X f :q;qyk,lm2$T&}5Q~Xܭ,{hk߶ :wO͘9LutY\=Xx~]ITn}^_tGfM ZNdu~k%[kQNۣCiZ2?+w~۳kL\7[=7X~L#x)1ו-[&-w(@ P(@ P({,=OB Pb1u8*pղuPu'OUpZMyQ|%ݻw di؅ T2jiRƏ=ժl g΂5qT\5X-7EAaBk`*؅l`Ⴙ!AB YF)߶}fy;>1AXqSb |%{C/]h25y` JZW^Aul4&:٬BGDkU°Ӻu.rN6mT =g&e/Ldu_4)>Xr+V(Q?U$=|BFt .[BW،X6Z֥, &Tĭ[!.\d3nH ɧϞ⥂u?gtTK`1[5y]-sذntuLu'6;)ֿO P(@ P(@ \ c)@ P@`0F>K!˒OųgOmo9gȨ8;~R0W&OŋiZ+I58'ǎx]2 /ȥNۢ+X8b0H>٤2ThsZ モClG2HZ>y^A6յwضmq*Ÿ>m1_/^Ti ? wF`Lr͝5 ;o>N>gˆeK咯Wk nO:Ƕ-vڷu*dnă!N/YKh׶>s|?yL>TRjK形J:  }ǏOOO/;wC!aV~;ta(S EY~i&nV2g oײ%;_Xhdݷ~ʔAO+鐳u ͟kk (XZj+l ֪wX8iI(Wxӗ/]VRߴ4,4$I P(@ P(@+`a}|2 P(  Rx M[&VRR AUb 5@c&Ke?~c]5 y2B#aXa-zke2M߀1}5^pQШvոf: ]H>hԮYCwmTRM[XB-V,]d@ܸyu5 &Ew4o`ǯ  a}'% di`esWG4'ߴ)uuG˗,XXz5 <1`5f\3*zuj;ߏK-wx.%ǤZrfP\vmlcOz3֥ǰ?vVP0n J {ۏc=FD*hX3Uao?qBC(@ P(@ P w'(@ P.-`KpO.m\<ؽ~8y8윫6q$*/׺M{9v,T%ֻWO|\psYsl( ü3uLBMJմls-BT)_탂VڴiЕTi:{$ԧOo\ u FĴ3p ݻӊ6]Zy TUMN!t_k֭Wšz_ݲiޗe4#IяmOݳg/,ThoIsiܽ_B_ַ_]θgxINf8OyGUM#֢u[?~Pj޵&7MU獐4iRϞaZZTK]&SSm!6[iTH~]fL¨׿׮!zekҼN]?Y:<$WPׯZ&RǨYFT9?{4*XRQb-n^[Ryfz6]2ݺtq?qkԳR"3!C˗/,3q&ԮUCWT}% }\7q8<ٗ^;p&B .ZwBUW;^} P(@ P(@ P f 0XgO Pb1Յ:*P)SRgϼq5ܸ~={bI g;Ƞ}䙪x&(ӟ>ӤCk7&MjdΔYUL->j+nsLׯ߰ 961yN@ϑGB !GDI4e:e vF𢡄^ BΜ9}Zk ɵNs̥Bq]\~ivw.Qq>͓ɒc*%2W;g?p(?wղq={Xky{]o7$IZ;"'2^…t(ol6' P(@ P(@ P N 0X'_;(@ D8 P_@U*[Z51otйkwKxL P(@ P(@ P ,2ZvL P((@ PqE`Ƕ;p)x?|*dƍK3t+$|N P(@ P(@ P,t)P(@(`a\||f P~RLil6|շy P(@ P(@ PCס1(@ P 0X (@ AoEbE>]zp ,X+W6۹C P(@ P(@ Pu 0X9(@ P6<(@ PȐ>=<<(@ PpQ ]pZ(@ P(@ P(@ P@`0@ PGq(@ P(@ P(@ P^%`᫄x(@ P J,VvJ P(@ P(@ P(@ P  FP(@ DDˆ P(@ P(@ P(@ PQ/`as P(@ :@a(@ P(@ P(@ P(@`^@ Pq)@ P(@ P(@ P(@ `aLxK#(@ P —G(@ P(@ P(@ Pb5!(@ P@`03Θ(@ P(@ P(@ P ƍ̧(@ P.'`˽N(oN3v8Q"trDʔ)uᢥXrʅ'ӧOQFmЩ|>F \b5.^_Y޼y-K$H7ną pƍW+/Ep ] (@ P(@ P(@ P 0X((@  cȋ 4?R 9ypssC@@^x3Υ*\vRN[ .TfL v 8X3J. cG뮖-_#~pFUh%KFkۇ#G95`xQ=Ή'ѼU`ciϑHs*s箰ܢfO>TpwIVPYdzP S\y'u(@ P(@ P(,[OK P\FByNH4iYl޴>qDбC;>8}4.]w؉4BVyܱC{P!c[MV֥v] ;-`ɓЬekGvֳGwhTkߡ;wxC m\4rȓK?E\y'.89 P(@ P(@ Pv p(@ P n 0X{{7@~8z7\zٲgGҾܶꅱ#$cFDrtG}ǖ?eKrŪ`'٩^ ę3Úuq,Y5>k3gaia B#F :fб [)@ P(@ P(@ P*`΋(@ r c ҽ'-]o2.S,S>=,7<;e˖Aiu~).?WUqHSXpUBrRٮb媸sA}s@ # ó(@ P(@ P(@W`C PEѻ~gϞbmNH$^uq v4_ Yd'Тu[O+s8o޼y|G3eg՚5V0 OPJ@|y*ej$Jquƍی/K„u+0|6g˦NzA)У{W+rͬ8?0ƬU3 ѣ(Q;4_5hds>`ጙ8KMK_1hw6˲Եkmnn(P ޗO:es0wmH >Ξ#;L\_U>ۼ? =e8Ϟ-+?xu7Y&@Ur>|(هH%F]zg6פI  Ua,sd|ow1;iJ{:U*^_US}Ν?~YW4/V;y'F?Ӹ(@ P(@ P(@W` D P%U6nXp~kySKNo\Wi`a1I+òIm !^` 3 ~շ $`?BIH{^6˽0Cs6 q _xE7B[EE—/_lCz8x;u5z}͛55Cپ2(+׽}X^\b6[ٲf2_cihsh߱Mxpά(X ̑zòߪi t+aȡCKۜ` SƍAR% } -2DȘO P(@ P(@ Pp5 ]p>(@ P 0X;^txÿGuPµi|U Ixfl߱&gsRD$Xx%9?ܼu &Drvڷu׎]! [}?A=pU97]j ٤߮ݻ*Tl7n@AUtcVHe:Vts7PbyGWsC}Vn7P?Rxw U%A&Y}XH,Uzu}eOzq1l۶8DݕMP… Adv!\rU>h 5bw>U4 */gVJ+᭷Rm3n<_w~/5Գ %#ETN6:(Uq㨑߫ `}xqt&rR|}^a3oq+$5:@f42V ,qmD>BSLDEuse!f-[[O/Eʇ C۬hؤtd펖琊bj%tضj&$\s.(@ P ƞߵGOx<ܽ{|LNas̙Fp\?A|Ǎ+ҳ9:wަ- [ُ`cT'dq,\=+ٜā `]j-G{_tF0HF3X8~$̞;f>W.;2ltӁRݺtB֭t<=A'c˝5'*yZdTG٬$vm履%ca {:cWNP(@ P(@ P^Q(@  0X{ *TB Ơt|1cu 7l܌oh^kX+m}rʥVЗ,^\/+~27ضm>' cG?LJAv~d߅ӧG-l%l}9o}`a|ϖ-A`˓原Rn-_fjC''Xh+mK+ԅcy8B/cc(@ P(@ P(* ʛ<(@ P@`0jA,e|ղwq?QtY~َ'WVEU] WH83m3fs" [֊;CO8S܇? *hNg ?~b.+SKoڼռ^vnܼ%KW؜?x!$(wCe>5 c5zei,ZSpF(Pljc';1-Xةc{thV?Â0j8瑃… aƴf5Q4ڴE+9`:!])GR2C+/ʕ+!k,f7OĜycNDFӸ(@ P(@ P(@W`UA PqwSW1 q!Ť`Ⴙ7oMZH >{O F?gt,X@,V\|)rG5j7qD8x`>~1J[Ҽ \+Wvݿ ydn`ׄ?:z y l,_,[}_BwݚȖ5QȩS&XѢf͘+GCGw݋n{}gX4%/ԯ&O3gYOGxPlPu6ہwⰓ:fh}(@ P(@ P(@ P :,uI P( ƗU釽|"֪P+o1)X8b0TQUd4e*f̜]H4>g@,U$&c`Td[h&L_rwՊexϙYj#fq:KB)R| իW4e}>IXXNmw/wʐ/_#G8Nq즷h:s K-[4Ѣz㪰6_g e)pr|T,]N\%KF9C^ʕd8^uT4jP}*8-''OBta!oزu-\ƋC]:v4Doڴ:wǡ4FJ|?v؅&P q?lq޵35il^qC۷؉S&S޼e,..D>J*!ŋTݐ78nZo~Zn=:}Ċ-Q61A? y9 >g @    Y @X|_Q(Q,EL;,w fMK4Y !͙9C.^9syL5rj[ʮcFW\#,ƎIŋm޸qjnݒzt |P? {Xl?\^CKW:gUB]gkbc}тy!}:c]TV.\`9;Fy5k3B:IIJڜ_ҐaDᆬ>ۯsjԮ޷|d~bb\V+fW BT?rʹ*Z7;DwG@@@@@@@@@@›}?DRFߺ'N\z)Z.? $]ǔM8c׽zpvK<9;rwE:kQ_R2v;p -^Txa#F5V]&NIN>F6%LKTO24ިo={vj I&Nrh֔x[oaFى6O{vJ0zp+/EUv RÆ)w~c+WXX˶?`g2Z3VBL[kՒ@. N]љTu܉X4ˉ9$URm6ԪeSS)A=۸t2UZݡ9zݓʗ+KѣGKcrm|c[*iRi;5.F4Ǝ;$4             , W@@@"/ #޹O(1(%kNϟG}SL) 69bٲe#dI;t,DKQ+9}6D]C%{,\L6͂8"Gdw>_ 2'֤WpA_ |eȘһ"+Wۃ >3g ,tF    JPŋA"(+aa=T@80k ,g ) =%@@@@@@@@@@@!a;P@@@@ @Xb(@$"aa$:8TG#|t    A<%0w,ʒ%3ݼuJi3@@@@@@@@@@@$aax@@@@ @XZd.xGBao @X!8             LPA@@@ @Xh               , 3A@@@ 0x6O   @@@@@@@@@@@@@~G   o% ӆADFC_$a/ @@@@@@@@@@@@@ ,U    . , @@@@@@@@@@@@@%aaP@@@@ 4@XT&xOB@X4             a@0.@@@@ @X%               ,􅳀1@$$aa$<8doi A@@@ 0ӷ̛K1cF}RC1ljbČ)p֭p :X%J=}>zR݈VUFܛ* ˗/ts}ܸ;uF'Oz:ԩRӏ?؞e .EKzڔɵ^%sfJ65%Nn߹Ms8^ OLĉKǎ~ v͝CcǢз}H{׮8!551Cz>l<9̥yF#C·\a    @Xۧ3q$T|EJ&t\@!ATZMOB=<|qv>rpiV\Ҕ6MZz$M6eJE FqԆ54)z )F5|m'Nn#ҥJtwޣ%\RR٩UTH%ܭItaWz'ի[ǥ~E{mŲ%$IbY*qQ#S2e̠}]?Zj]9ԪQ5kL쨧/^PnzQpwu}.,d̟ǏFXĂ'_ImZN~pjԪCgΞ{ecnzrѼӪ_ wԠ{ZD2tn&@@@@@@sz{xAB/Ү˖9sYmN"-$ݻwDžs{!S&r]y̲*Tm!,t \RJ%wl׾#F~7*U>ΖQ6n܈G.^B|ﴮ%k|YXȢ8=E: U/o^2y1Os#΄=w. d?6i4bWJS\9eP2~XToԪB;^px6m7ouəNðozuj8},9&B+s/s(Z4_'OQ``?JŜ9rP*EXaQ;2SF@BXW/CghaahE      > g=@@@@B!1YNFz=ڻg'*S^%,L-׬]W{!M?Np?8MxSʜ5c2- g:Arm!k%4ȼub'.W&]Xx]<㏳˦}YX8t°묖-Y(Bы 7_KI$u7/]&|.dr* 4S4-b, ֮ZN)RyZY]Yxa;ul/a(YJ%76U qciO@BXh5_zK0l0l8pPB'aa#U_dizpʼnZR^Ƈ-7#ŊKscGѳgόQmYX8iT9rDG{v7nʳoF;u͝h߾7^8 J?M^;;KKPnx"]v]U/_R.GFNQZu6-&µEO1cĠBg>aP>gX0zpNzuӮMÂQ(QdP.*͛;d,eӠwCfTpDc>{n[ݻe4jV& /knw҉e90.\ 8']+3(2e$ziZv-:7^>@Ξ;OvFU|-kۚrII&ѣGk^q>'O&C<\&v|9`}"ϟRLEݧ?OangLU7cnj8bǏC.nץ }˰]:uY-Xo4]TX~ds( NPc?Щs v::}_aBw {BTX.aZ#6c&hf lXX\+BTsv)_IEJσ-> E|ABkj. &,t.}nQLR@;v*Ԯ%W&LL ԥbN`chȰNf_dqՅ\rl0>g~ÏTz5ʗϟ2O/=F06J(NM>kHd9ڽg/8tH:qaFsϛ%.o8N$_._м:/< <ڶiM3>eʔt=C(H*l} {(<9[ն7z&:FW-^ԯG L?˯v_}\ jGmܡO'8ϘkoPJ(ޟ:yD գ%QlsZ+tݵ3C7kژ2KGĦ}]d؟ƫsNkޖ7onÇfinV×(^J#/O ISERoz<"d}*z$ޅx ?rCDR{-[QHd"W8u4߰dNPڧxx3}FE=6y\;~iߝu{!wYh;_W-[60ܨ3wqC)"~Vx뇟wߑjdйSiRw˗/ӱ?֭[ݒܵsyO^ wC]Xq8R4     ]u\ؙbD!# Q 9pʛ6Bx+I}| 笏oΝԶ]X"4N$]IׅKc? Lj>/]>JV#\aڔIC1̜N9r|̛- O?s$>VFPU(ˬR,,dW9N1~Ѐ2o% ,*ѣGFGN.߹c7g!w~њ>o`G6;|Pel^ oqiDycBiيF\оCg&zSݩasfɏj_Zuy9ix!*D%OV՘~sUDXm Y3_k ;F |8YC_|ފlFn_j jgLLQ0Y7oQ2ԪWg9ׅ.fϡa#,#Μ=+B֕y0S~Y'L[H ?Z١|r>ҡ XdݴIc;]jH,VѽWEի;۵HBR]/DgE8q!qPV"+r%)(4|z<6G*Wbm~,׽yP 2>g²tjdA=_V)ժVsϲ 9f6u25v}\2g.vO;SZ]9'}wd]zmfa/,Κ\,OPWa{Jh 5B댬į#ҥJ}VdAbE}rNF5si7Yohc>^W.ٛ>y1FP8ko vϷ~}X>K!{'On=b8%H_/vCX       , S @@@@@PݥŽ]KgOi"AԬek)6y. 1ж-}"k3d5z vkբD+Wqya1 TbXlj|TRv޻xᢪF/c}PrҶۅ".-S Y ĉmc2ԩ×+תc'JTm)~&vYR_U쒒AqJ& 8x2pm[6RBqq!s2~ w.?,acmfLrehnҕep-v99GO&O$(ĉseĉp.J禉yn?#}l?bXɎvliƍðT a!{V+BYD)c}i#;vn>$?uQbrٸ),ݫկgs(/q;Ѣٜ[Y'_Օ2vlnf6&[: =iI 3]NeUTMQÇRR%.5 Yȳa&z9b vtQ# CŊ~XUa!} mڼ<}"qsTˤ ;+\O%͓oΡ!3<߳ӾE2.6O<7˔.%]ظ,LyҾ][jyKnR2( Oo+TsV2SpsgK\r*,t>Q}zd[6 y~9|8X;ap9s&)EKHV\\}Ƴ]2]r{2Jlȡ99Yuv-UA9n߿/ʼaWJ#ys q #o;HNsb~u5{GNj RN<[OO;=I$B~>x Ip >ew yqxy:wy';>'c1~/{ّPyN ٞ7 _˗,2[+VT:r+_mיwْ/gbX1cZhT5880'aa#G    LB߿\vC~$B;N?NX{%C ':!E r®|I>g ]~˙&3ױZg dbGrxG91XT.q?7š8q?4[9Smp^ܸqJ-ob>u8@r=E(:"#Փ.J+ڴ&p57;TvvcqJkV-R| W"!hoC+mظ)hB)~xrvtR?~pѷyׯ牓]TۘV!qx2v"݅u7TM-CBX alfH[o.BVi8uϯd]uc?e>*ībnL5k0Dp%J3'AZ!2wh]A9*Q}1%J>\F8\É~=Ø+jv|R}R$.iV3~q0EĐϳf#5RH Y Y8;?{m2ƺ8&w5 (T:.^zh$]XxGܫńIOn ݒ%K,dJ5aަR92]ʂ[yt1m8Mq%4qV\I(do4ٺ Y.7;ib"&5toܞ_e'T gYUFmZ|jJ,+w~+* JzK6]Xh%w/b-NfGZվZz",\b}m_Մ\*'J^ɑv9Fo+,ӎmeV!;y] Gih*Z }.;s~삨RPό^= LզZqB?nea =]6lZo5m?הSܷD",T ݽGOʭ]B>uѪ1fYcĈ!Qr]%TBw.olGj!]@=z~{ӧO|TPڧVN3Ni6z9m ΝKAXA@@@@@ža=e0~Բ͙9|QnܸNgL3QOᅤl9xі\n\f%vՊN/aXXZ-;'.TTrɔW)pRYىi$V-Ӆ{8rcneV9 ̢Nfϡa#l!y]a2Њ1+."r8JOfV.[LRUYV8Yٻ_|*\uaUhfȡ{dE]Mj]P%Kk:+\i8JҝuDze]X{&Ծa}7&]rv n.9E|K+Wc.,dJZ5eJ9n좧_ӑQXĂ{_fSY$:Ӷ@tA?7qF uQ]+ g"r,9Q*AG@ap#!),u>[jן e+Tr~JٳTV]G;5hP85͉8,tEzqB|I"z>wGXثDXu"ui1vaYD|pRŝg<7'NB?Iۓs"H IITRs'CO!4nߦlnzӦLxyd~gd3wk$.{ʃP*eʔbӣ Ϝ9M˗,Wm>#6̶J]hܗX;Hz͛5.:S؟?&}?~LʔqU߯/U& i7eUaaڵݲŅ6!IeO׶euќ1#xQF]7oN]kըN,(2'ˢ'u8,1v.,Ѳk͝#WYɂ4gaPw"U}t2Uj},*+"va#qJ6 quN,x/T̫]Xhܼ!@yO'_}"UL2TvPFVɓ \xޖ䎰P*%6̓'7͘:Y\yt+W;}{rN;jpBW9g2,4xN繝ջ:SP:Z>t0-csV*aNQXܥ % )m4KEtkY^.Y4_<?UsFO ,      aO°gA@@@ }2pUXةWńQD{N=p)V}b)>t6mX3>lZ}?* vm6m+΢I~2Q5n©kڏ?,YIѣGN\*V1T^z",1(g"wq_o+\8YgѣgMɺϴE;yerӅm8_"t잽{ժ\ _M({lS9,ܴ3bp4|hEф '/۵!v6ĎjƂqrE++zc֨UG8%vhAL#/ 'JL3eυ՞}{C.wTqd券oN-0UUX/o^:e<➯[!}խ 5n,z5(NԅVO'B{JX .]$k]Qd>W}*a!xrew' 4nDݻv5 UuoN=__#,T[{^;g<'+q~9Q {mNϻx?᤿(1~ !,t&T<u~9Pwq~D~YMZ4k* R$UUQ]}E$w5v|{-_J.V_Ib@@@@@–a&a_ w*HьMiZ.]z}fڷw-3̗꣭Vta!eq~}z"͙{,DlaQVBw|;wl#l?=DwTgd3.Xkը.!󶀀kjuԦoze!,7X (wBZk)i$ޏ+y]g*[w a}uLX?0үwQjn۠J劲]'B       , {@@@@@/WS% 'ON6wy=zHǏWmaڶ@;vth A%]XhvaKI79U\Kw3yժ[_]4ŏOv;r>ct8ȡr#G]n})cVu?sJUq5bHČS[0 ~ g7YY`ر?ժ6SԨQeY,$Bn|xwo1.TejZaUǂ 8=yJ.gCV0[%Tu'Bo*0tpG~f.K@vagm;Gcd[BJua{|v׸h庪~C5W]͚6; aϮeu=qDrxUN w'JB(3i4c ܆J<|'ru=y뎅p ,wiɲ?㙣r_Ґa9+ZG.כ4oIn'oɖM){TlyyA֖Vﴪ~\9Ϝ='tY~VWWʜ)Bn26B?UTAF,TI'3 !UBxsVP|_ZVTV*{%8Л>6vXTVMYlvEVΝ-vݻgqXsHl;Ρ@@@@@@ @XvFB e3g&܆lcD=z<`ccꏣGhj{iM>Q" kQrIFruԸpbbg#\ݾuvm_"EhQrӧOi{_O6 yƋC]:vd'7mL}e¬?իWԡc(W(_k ֯$I: 5ɍ\鍛6I;rڵ{oYGXʝ]uh=)sFj߮q ookyKZ(UT!|2K|O)ju_NYdJ*P޼e?[%o,ja1륋|u5N[uKW`!-K "T0KT)]$%H_.E8LN,`FnVmRB=$i"{\2 P%]m].Óڵ֮ 0g9Z. 򠜜ta!={y=}6iDyp1]vM:ʕ?,p*.j!Wox%֥hR6_:;m޼'ML;!y;${{N~=gM{o߾%ê>}9}Yp ydty'e+?0Ť @~>='z }֨;J%,YcNJ>u6\OYsEٳeak\Wx]O_m|h"ܠ}8nZO8Ѯ]N>Mqb&|yAz26?pЏ4Bʤ ڹ߃,]N\%KF\/iR2 \̊;&u؁y      > , @@@"= }h۾1/nڰ:dTa"ŊKPܽ{fL$?jU" ® dŖXhXlǹh< >Zjم6 aQO,:Y(0pqݷTMa$kԮk4_i)_XujeC`߼18'gΞvKÿ ^LmCV2Ъ^ƮhfB6*t^W$q9 nYx\DXà*q34g}[mNXX^]ݫtiWtO}_w!,1M,J,Nӷ WYz~m-VurK%rK*F,,46h 8-Ytd@WNUr?-7"5;ݯ]ze%SW!!,tyVcnݾM5ks*BPC3qg'[a~=LY?~Lmw:Tan|v>ƻFm,,̑#;MgC8UˆЮ+(Z ]zU>(aVUϵA Ia}ꮗ"pgrYXswn]}@XUl'aa3F     ,EmXЮA gC::z䍰OEBr;ܼyfϘƫ> `\)c%ҁt:ԩRS捩D ~|ýp8\X˶?pv\*rHe˗SZjŋpQR*щ.mzRms&nlV,~(:FeTByJ&]{ȄGNIaJ4wi.͍h֔Z +opmݺӘQ#(w\vǤ*u3qdpsΒř+# ]ኘ"E y:w. 9(肩;B0\DijeӦL2xcPDO7/A1b0ÕaMgֹ}vy]?s2 \nDB >(1/#F %iܨeȐ^:q̝;wѻ"[>ܙ] y^.%Djyz2I1Ѹczs>]Գg?!Cb+!,5}l}҉EΑe0$ Y_99u{}|Lޞa}!'z7qG|t8C޻~7RfN{g&>{ľ,mvPƱ{n2K]|Psp#fs>_m>t0ξ*;C}b'`N?vO6n,<>9w a#F:gx?x۳92?3zwZWUb_xK4 @@@@@@ |@X>+DzFK/eΚn I/^GEXjvċC VP9t頁n':IuDLrc\,?NtсrYAOc$vʜ)3߫DK$Oݹ'\*/9Uү+utaqii?J J+%vя8͛MJ(8Df p N$q)XBÊ׮k kU[*"L6 s/ˉK5GN:DrN(|<汹r޻Y}aUVrI<|D +_Yew;C8y>VdI;tkYܚ.G/c($!a @@@" #+aa4 aNEr½6m˖ġ%+сosK/4\eX,P~Pv" NCs~qzH}jհ9*a>LNfa /]D.bb%}`&Y! "a"%@0Lq@ f4$w~.72 ORj\r4q6WE Oު$,Hr:q       @p.A@@@ ,Uka{Oa𡃩lv^|}۷]y%<tŲEv޽G-?o B;*X6_KÎC^?,[$MXh5xbۜѕ|uQ @@@@@@@ @X#HIHyq^;geɒn޺EVەEh8vgOTb3gI7?wg.`d΍6SzDŊ 6~K׬\NQDёGit G%,V.[L~!=}?A ,+W{_uJ5O^"//zukSZ(}(jԨr~0<HKH{q     , _@@@@@@@@@@@@@* C/ @X1:     }A@@|;bpQ_/_ٲr?+`         * , h@@@@ 8GA@@F!)tғ/n(bE}F+li zxgxN9R1Q +Ș,tV]B?_ivo|p> \OGnCXh1eFFw=2U+'z ,e    . , .w8I*W"%LHsI6V.[ѣGbR ;H)fN~P e(2Ct=,m*\ ;vN?0ԘQ(g.#D/|NwDY/QfNuS>9t*̡RO̡3Pq^)}ds\g1Йwi %Kz(" Z4 Piw-[B<)a6^|BF1hs?E0;㩰0G5MYuSC13s/|qs[aa44`Y1}\FQMKʵjA/3~/ K*}ňigThc'aa@@@"% }'O-W'Ij77oҬS8qR )U4E8jQժO/7bƒcuwנB,ɩ5Rl(W܉Ь¥eə{wֵT@8M.XRu޶NÖG6v@K)@ew6G! 3OH guA }m@K ,l.3uɚ8gsQ!2fQ]D@wnSƺ9cfaЛLoCsbFkj߄?g^!         , A@@@ |)G\ JX6GiZvB",-tvWMyV'3Cs˽r+W,9yrߑigNPyp;4䏃4I\+ P7tABǍ'Od8Ӱvg`D 58OAHs B Af>IG^ A녰0HFvM ߺlo m|BRF@@@@@@@  GB;5ԣq{hT-(a9rQryʓןoPw<%\k\ܾAnhѝkmYK'EEtVf"!pύi#8zL&טn`77|bEDq$g"(>j)G a@Xz'4A_sN$ л2xJBOa?@XPٹrj,mڸ.?G޸u/e_A 3eBJB}{;uyaGqQ<|ĩY:2R_Fm2d"ɒ2v/.=|@{FY$cĤ<|{h=| [(']~M~y*,.Aj*4>~Dn\MW.a BʖKBǥQꇩ_nm yR41 V\/'ݿO3EX%88F j&#HG9KB>_mWW_*pa'^Bb\TLJo;Osvy]Pc! >n3ڿ0z}mp#h3vo~ \OsKs:-p!Xd$JJUĵ_J\_BغZz,}\.g>dQ wq(U;gCYI!(mC+y}X'J;GtLz mmhuzǝsŽ/ң.Sv4C8>{8/OJ;EOP? oΏ9S AG=ab:|&|?m}_<YO\uX[{ŵG%̮_DbSAkJ5X/nrqO*HM+ۅS5Z[хŌEe='AYspbp"MͧO)#`s5ǖwNJMM>('y''4cZV峴uϢW/G3qL!ܝG-3V۴J;uۜυu,^y/Bxޮi]N%W(Ī;]Q ]mJݭt<Vե|='|OZϥ1JF!4L1!Zrv3a!Qy[86߱7eFmל!R?Q,,BBo b]._    NP1'#<2}L3fukv,2 *h+ Y%,/-*Qaf.&С낰ΐ:da ả#4GCШhQ|XbM5E7E,4+nelVⰠYX.Q;+ԠQz[7m.[ͩ[JX/M+TRUq ia'|<9' 7 ng!d:$6tB+Ow :g}>nw,gBla}Vn?.lv mP%N;yoCOUU*zsfV{o Qaᦧ6!R\s bU6 y^œizdˀ2U fa7AvF ݀         , @@@@B߿ "Fʴ"_b[Y 7Dc(p&3Qt!kostMWl>qrG) !;`Xhp Ο±/cJt(po+B/N΄WD)["hzrUXȢ=7QvdXf)dE;Sp,$mpO*VB!LZ|8|(v,|OsEB2I鮋f3aS>Dh`cpϜ!VU2fN7-)i/<#(=pX/DoNyKJrSMbZj/6sJgZ5ƉDz(MU߲V\Ŷ!^B- kv,CbpK3&-.QQ"~rYXxMjBJ8'9ѓ;Bad%cwy\lR">FIO%y7BEURպO+K"k !s9ܕ8Ri"H+P6!"J!_eI<$H<z0-rc6 };]JX_;]TUrT\]z3>X?Hlm=qW{8 )d3řШ 2y](ίJ|dh]@O.4[3YXHޛJodua0 E"\4     ʖ",VtbJे]q5]xd}熝A%e5vj&};A?1ϸMAt !PڨV Y PJN2f\pWy%KEеKdxj'qF:$M!-,TS}1? VߺVo֋[]^!DS^󋕥, + BTJ$越\O?qX󪮡2;^U. Eb'P9{RXJ76U/lx %^^>OB]ĕ,aW&`9gb1۟iu ĈN0 =Vlu^:!ͅRy CBX@tdϜBvWĽ84PM (<,j-[%@IDAT$oߞrQ#jNzB|k >73!*ͻJ8վ~7`rovBo+Ó2 =}@@@@@@@@ @XvFB f#0IEhށg`}  Txq=B(~X*v\(*m2 )n_E'Ga;U&w.56gK˝Ylɕdڹv߸tךRoBZܐZFBk}|nq&ZqűO{o]w|84邲yPN9e.5D(C>CmU'+=};9Bvw=9&D~܆t3,,04aakYX ;g.ܺ ϫ3qGXhv qW.vw!kw'p6?!֔}ɞ5;l!RJ/"B٥Td}cW( 93wf^=4| sc\漕FMe@:[1ikr%Ig.}}WRT,do?th*wU)ʦ]Le,:b?[m6d?j`zHH[ǵf A'~Fb_ &V@@@@ , /wG@A`a 0A;5 ݁kn%J{uކcG!. .nZrd "&d/`!SHU:O oxU~4L ބ.7X-r6~{ V۾}Ky3ۘh%ΝZzkܯjXc1w_T:A\-ãF[֚5YxZ~ 7UܺQ1AZJE|ޛ}B|*/ꏏsrδu[R dv.^&,PRoCYieh%ΡٛQ^3Iy3۵$$X3"͝5CstU4ŒL?SI^^0J=#yMQ{sW(X]&t^7?&~B ]+2_ZsgSoww0=8Jq    < ǝ" i^`aRs%DC$ϖLķ{䰩@ӳo6Mɒ]/M )S0 q{vӥIA+]O򣇭u/ XdrVDk?#f M=w>dp2ѝpibLgoK=-wJj7 Mw~]]1TZn TO[re*. h4 ?#΀#u{Wyw**oUa3AҸ L6dsȱ؎hj ~]ߢOZ{[ w[XFʛ7&j/SW77}^kFk;KVtvg4EM88c՘9 ZK-B*S:n\ە0_eVj OPZMS4n+^#]n))ϗ5ywl,ʩC{S2#jZO^|d1_ s㮢yGүJ-m{sD,fi{̑%      Xxu=  @<*OKBeoL#2jCg|Z^-[67vUM`Qoc%!J9rڍ[] -3U ˅ %J׭DYix I,@Ԫm% ϚU2]%S9oS,78V3RWKMLdhR2z|ltS~Ps\WFsw0U/Msj*r 9̉yjc|5߄u|ᦒݺgjs|e(Z|nnj ?Z[-s'V-P$w; ϻ2]hlIOEP 0s9N}MR u|~1׺[MtynrϒVPt/yOp #hϾ^+kG}ΟuoY|Z!vtkmÿ[7XH̟ޯ]E+sX2s1x>e/a:S׻" ̟Kh5YG@@@Hq5   eʔ/2f(Uf=ٳyc7uǖ7S^ (( ^t[|3+ۡCvrf]#LKK:-/I; .M5=&P쎶1a?>Ot7IHP[Tʙ;[EٗBL S٫O+a(ê5wz\=XxcHfפUL,>6[wJ*6 wފ]]Ӿo\RTtƴ}g}sn?}@ cz(('vjѝokª KdLɘٳ&ZھMW+Xr>Ϫg̟gv7i"mںyj+Z}nÆŹ}ʤzͤufW=@W,guDs?kvSAS^D?:_}d|(dJ8M{kt$ݧ?܄uvlV´znV!|ULwPK+b{NlF0zUJϲe(,B@@@@ ` Fˍ@@b XN3I6oRɪCMJ[ʘnp`~a·1N/VMKO]@}&X˻?GmɨݼU f0AWژ*Z7KBכYaUs'j"K]SY,ima\6մ,VlzJFv{\Btrj[0kR^ӜJuz7XӵVI$UPm7éZ5bu`ng1g'`{yY }~ۤegW+XXTtX강 ޶vfNj o>|mt1-,qu[݅:o 3UJ?hx+ھPQyB5gW S@*PXzf6t/KL֯;xj&Fے}Mt1 g.3]46g%G}~[]ɛ%rTfIZ%Ӷ}[|~B]T,{}!m0YҮKK|*8O>e㮬h.`3[-}ݭ.l]/sL竽든91u-9md٧ʴjUӎZ.lzZ?XyTNyljA5>x[YiLWkT`}k k{di۹3>ZYܴb9u?KBrӺKSW7if5o7Z{]^bbS^f˭Ƚ-gݭWgؾ>Wlhkke<=Pg)=dw}lf\/LvlnvoKuYOב4km/ܴ Ujٛ֫;z]Ӧ=ϱ6vmzMPTH1S:_69Se(O${ԿJm+[6Fw ??1mV-u:![Tu/}0li71}n}:mY@@@@«@@)@0PjocGM**u^ N]!d0a3&t.\ƇW%vt$ ;xjk%$4zyIPkij|PNBdwefzS[stQN^mX)3lf.\w67:̦%ls]z ϚϝVk 8u泐T!|;'qyqo֬Ir^bt^8HTb;k}gta33cxNΛPKu$HFt0FeVghY_.3ϟ{+iQ9_KW$q>     s*@@D ,L$ xo~CUzJ9X'iG `a"    `Ɔ bxrykе/:b*r5;51|}sN`al3     @&ސ;  !@4.I]=bFػh7I^v˅Kв 4 f*     @4 Aa  @ޘ' +KB89{      )@09y6  #      @P , ap  @ Xzw      )[`aʞ?F X)v8      r|y{  @ , ֙a\       O@H&c@@@@@@@8a@@, +wE@@@@@@+@0\  Bظ@@@@@@€@@F>@@@@@@@ &0@@ M ,LΛF@@@@@@ @0LCD@R8'@@@@@@H  S,@@(@0NCF@@@@@@4!@0ML3o@>7'@@@@@@P|@@E`aP@@@@@@@ Nqq  @ B{"       XxC  B?и@@@@@@HI#@@ ,j@@@@@@@ ,0@@ ,L[F@@@@@@!@0ELD@R7#@@@@@@H S<.@@'@0MF@@@@@@4"@0L4o@66#@@@@@@ X'@@ Y& ;E@@@@@@ X''  B`a T'       x7  ~,K@@@@@@@$ X<@@ ¨&A@@@@@@A`a0c@@Ҡ48e@@@@@@H S41H@@ ,L}s;B@@@@@@!@0u#@Hq Sܔ1`@@@@@@H# D6@@` Xl3x@@@@@@@H|@@E`aP@@@@@@@ Nqq  @ Bտ{R3e.TBBB$w<֍9"r %,       9" A)@0y%44TjԬ-EL!LxDٵK-/񺆓@@@@@@@ ,Lysƈ@@T!@0FRJx #ՀdՊCl#      @* X & DI?k2ewZ#8q i;0AmDdjJHhu%֫7o^      )_`aʟC  "&iH}|:x@V@BRT;W{"      @ Xr玑# )Z`aMV*|'|Bη3 m\A#R r( V@@@@@@H S1z@@ ,L?iS'ŻJaLԪZ-B2Yh[qcGt:@@@@@@@  ,LAP@@$@0iff:Rô/ mq|[2mWXfowz]ڴKK0sg;5[TBCʏfK_J o+Aw}TEr%ǎ]aeG|\>_q@@@@@(YԪSWe.ҧ-2qIYhm:A== @H ?M)e˕U ZK rj]UBZ ue3{u_!UgϞc'? nظI:vzȺ`a EhX}D:z(`ab@@@@@ - +4nL( .]Y3Ν;K;d  @  XZabZ ae.uԟgZpȠO}b#B} 1Lk>Jz\x۲hR~ cgM9rfHYc:}ԩVԇ,     *5k6ēN阥= )"y差pA… +$Xf" D`a`'XҲM[!'NÆ@opu-#]9mnO,aa;\mop͐AT,+*^yGHM@,]5 [h.q> 7aׇ$xBj(r@@@@@(мEK)U+'~0typCk{ӆp/񸏻NKei b՚N%[JΜ۲Yv}-kռZ?1:msu$[۫׮m۷[ jպF Ie$s̲~FYl*:uZ6[<_ʀ;1t^V7u9ߤvRV VY~c羟}RPAɝ;9sVXZV^>5ʺ-Y+ZTҥO'fyLqVsc tc? דjUM7Nyw6oTn-Wκnx2ٱsԯ{+V:u0Yt2kHRvM)Yɓ[~uN;?~B;&֭5ߓ9`A0Xfq  iL`a`'CD[O䄄 vZ]%`>#6Du8In6=O^{t1۱uı㾑wޏl WG}ʎ_y7^wI|@Vmp¼?J^^<(M1eUŏG9T얢VҥJF9;v.u_LB7ix)zs=Zf͞#={Zװ7f.o)z壾/00ޏfP>aEWZڥj^5L'%cƌ>uC}D]T7qcF8?V[P=Kb?_}{[ڙit~?'`kgAC?(e˔oaޯ%~볟 @@@@@R Ck >HWaOE~ޗ7o^io'ɐ>+>(a`ƀ A>,DVv7v5$4Tg3ug3,԰SLa>ް3 a ߍ &g׌^/;&O{$/3Sdn尩:جEk`L Ǚ[xÌevNfܹso~3h4 5pxG}Ήny ;eʍ_jxnيUҴqCI(#[F01L뻯ǘJcݯ|7gY&j8n%""Bja     )o>#+kRRa#k… VW6t>}گsWJf M-\fzS.߽$&XrmʕDًVFM{.gϰM2M+eʔ*mշ|z CiѼ)O1SBNx6zc像>΍.Xu{{?>y0䞽ʄ2e T#Ԋ?b]۳S9ȴ>bZVU9hVB73t9oدcǏI%D[aۋbnܼ竆=< @nϯ 1!/m :c&[ZsL?7l YVn

^@@@@@H**HfٷoL8V=*&q| |%o֐N|%Z 1=cGPA˲Ǟ>]z],_X;^ t0@@ , \KLPߍ?W,OF 2ܤ jUڏjt?ٰq`7c%w\9 5Xa,{= ])j;^{%t]ǢeЀY4i i%kW5\c;yiQPޜ$sj)-v2n 9{y:ھdotVsfNunitZ[&誵x??`5h/Ԁ|V~k7Y|kvmwތrΚuM+^{n9;>y*Y¹}{pGb WF'~K{px {S|٢˜e1V@@@@@HJumE~_ɬӥ=JBҥK2rPiܸ)Yaɢ~k9s~Zm9,)~UE0r@@ ,LXPɝ; p|Z!'6T 2n 8g{a]~ElPv[qy |΍i#`s/,ZQ+UXQ ,$'BmYAk}iΐ۶ EDV3wk:4:uJ-Y(vw+  ~[ٸ~,Z8?^P޸~FRJ8 ?*W.͛5:oNYI,|䕗z9. x,zw;;ϱWA9 m3%u;ϏzKG+WEwI} <$LdwdV(ɔ)Syw2Ku#g^YhS鱵+Xzdy7c==ZYGZ\ս]v pB} 1:{{$!/o5d/ۤm܄|4ٿo)]*etoرҹˣ{Otه     @ ٩P@-hj9Nt<7Fv;z/qi8F:yRF./^puA3 @H[ ;ŊmZ9i64a@=-2g(gǣ]LkZ]O,aa  u,0noRMN{_Tֲkf{jpuhyguEkp|O_5vsx,p{.;yҽ>ծܵ F.[Rvk4VW@@@@@R K֬x}m2stgcݞYY۟sе3gn)o:,YZ;lL2 WA5 @H; ?O>S2DVz^rP rDx ls@'XôD^neȐƉ'jۭuw{` ՕYm֍k|%&X譠mvѠ{Һe g? 0}ڶn)}&Zw8k|%y+!D觕/>/ty޴ƫ.R̝5;yOʖ-cmݻ ;XǏ QÆ8EѣR^cukuw, »ڴ|}I ًN5|^rXSã-.Æ~朢尽(aF= Fϗ3g1vWcyWGkEς=zS:K.]:yj]@@@@@K@ _+.} E"ZupЀαV*W&G~/B;s bpl'1Fσ@@-@0n|x֬U*[d bÒ;Ohb1>ݱ 5TjyRx1zwxl­ z}1lUywߒwqӕ zwM8IzZ!g{Ϟ=#_ R ^7H&4A@ XL2ɣ]9U -/"K*UE[* G t .^<ҮP츼-mNamkr=ĸ`4^.]$_t7X辿wرRYegW~N=gBwu.`{9pmz}o+㿋G;f #Imm+ܤy+]?|kZ䖶ʨ3gl0+`M7sfF|;X͛%sNR`q ~}ߵ6tx+!ƧpBR7E[fk츖| /gL3:QgK'0^'> [\pQ~ٶ]I2%{!aTy6+     $s~_gܟd떟l ҸiS #_9+T^,^t:fӖ[8x`)rs X!X@@(@0ifݮJh?-!׮Z\VXu7XM*课 hies~tzv  l 7Xa0w8̹Y^{ VK-F/ 5s͗z<)Xs㔉>Ug̜%zYD~Ϲ{E;Xٲfu_fY^ /ydm{sZ}־Y)WZCǼZaqo$[lC>͡"ɞ|~yT.j??˃Nj-&A*8agr[e=Y}hQke`a@@Ҙ¤uܹo.ӧLC$j*l٦d s2nD3!ԫ['K4u9|Omk-[rnreE,Q9v5mƫK՝s֬Xpx 똶hVώ[/}4nXߪʦG 0nܴYzTܷ_O#b|ݵmsl1r)iצ*TگػwzoJ iM[?MggeȲ靭ʴmOn4g-:l\rlm=WTv-yV-Ԋ~gD=8N@IDATXtoZ{6 i׶Sp9܏ uh֪Ӽ]ae eܙR u u>Hʕ|8VZ-CbŴhezv7Ǧ>H=3xRcZU(P@>ߧ2bm%lnOb3*Y'`x){b^+3&]m6r}h3~]ʙZp_@@@@@@ Z[nB>Zn&?1H2aM,>GO̝=Kk WA7% @H n-ɋ|fQʦqzMR@rJ/&ع+!}.\0DVc ?B˦[5F i+Zƣ!&vm ˄5Kfsc oVCrVW&`^^+s~>'^P#'gDìzOm~G7N{_b?_:> >}:Ac糠N Sj~jm^@@@@@6ŊIe޽&wQ-ŋK\$sHf9v)rмgB7B  I&@0ɨ6:sd U wWRY2XۿlU?cECt6mKI<%<<\.^״DC._!~       @4 Aa  @8OpaQ8Դ:֐a7Zjc =rD@H S1l@@@@@@H S@@ X¨@@@@@@@|@@E`aP@@@@@@@ Nqq  @ B{"       XxC  B?и@@@@@@HI#@@ ,j@@@@@@@ ,0@@ ,L[F@@@@@@!@0ELD@R7#@@@@@@H S<.@@'@0MF@@@@@@4"@0L4o@66#@@@@@@ X'@@ Y& ;E@@@@@@ X''  B`a T'       x7  ~,K@@@@@@@$ X<@@ ¨&A@@@@@@A`a0c@@Ҡ48e@@@@@@H S41H@@ ,L}s;B@@@@@@!@0u#@Hq Sܔ1`@@@@@@H# D6@@` Xl3x@@@@@@@H|@@E`aP@@@@@@@ Nqq  @ B{"       XxC  B?и@@@@@@HI#@@ ,j@@@@@@@ ,0@@ ,L[F@@@@@@!@0ELD@R7#@@@@@@H S<.@@'@0MF@@@@@@4"@0L4o@66#@@@@@@ X'@@ Y& ;E@@@@@@ X''  B`a T'       x7  ~,-@R3e.TBBB$w<֓9"r %,       9" A)@0y%44TjԬ-EL!LxDٵK-/񺆓@@@@@@@ ,Lysƈ@@T!@0FRJx #ՀdՊCl#      @* X & DI?k2ewZ#8q i;0AmDdjJHhu%֫7o^      )_`aʟC  "&iH}|:x@V@BRT;W{"      @ Xr玑# )Z`aMV*|'|Bη3 m\A#R r( V@@@@@@H S1z@@ ,L?iS'ŻJaLԪZ-B2Yh[qcGt:@@@@@@@  ,LAP@@$@0iff:Rô/ mq|[2mWXfo      )T`a 8 tP.N Ĵ?iIuRdhɑGda&9sl@@@@@@,UZjթ+ٲg ŋɓxBٳ',>Hq,LqSƀ@@!@0شٝR\yAZPkP*W&U%ԪZP_n9gx_r[qq0hnB& />d˖Ƥ)Se-:n#O>5 k~B:#<@@@@@C\[qfr5DyKd֌is(R)}?  B~uƩVwbE'>%V-2S؈o~}ʨ͠{҅sq|1|+;wzy/[l     vYI'tB-QHɛ/5\8xpB X7 bJH6m8qRF׉T.t&YO,aa;\mo7T(E y޹s靭G|` Ɓ     \hޢ*]ڱo^<{`G 7䰶7mX/ say  @  XIsA) oH*UlM;Xx)\,Q\~bzK?ZmRrޖ-|/SԪy_d:!ʟ̓MI۪IdpY~sMl+[y=;-\Df͞#L b*W(U+WŋI,YdϾ}cN,(9rm[KB%w\ri9|,0cݰqsWRniѼL`t?hRgԯ{՚@|rʟG={䫯o6@@@@@@dxt˔)D3߳|'NUPc.]:kTgϞ/2B=ޠQgg%sx9~lXV:`A0Xfq  iL`a`'CD[O䄄 vZ]%`>7^uW/_$9nZm{>+_~Qc( sfFqWc.gW>IVw9{_m۷w=xdΜgt Ѫty(8!jֵkšeJG9OwhoɬF{      @ dps*Z|CUX$2O%<<<ɺ`ap@@ , w~aɝ'qcG#oP>DE `a'OGt,~- ;?hjk,1 c[Ξ=' i*)Nk~G_kb̪ Κ6I%FDD]m:Jc=      @0 ܔ7kH]^rU߰~n :XN>e_yJ#"?sgMPBC>g)A, )a@  @ Xy~K?fşP}i_ gM,n)>}eq O4whHR >>mcaؖ^-r唦#jMK.ɇ}S>_[&}VZQ&J :ՊsnhI0xngTZS v0|uK.?LLi?ժʸ1#ƈV4l.g_rV7cGIV0GzBĵdge=햣[Ο?/׮ ?LYWPOӏR`Cƛ@V2dA@@@@@R@U~O쑛擐!rir~}dǯ۝ٶ})R$SNɲ% eΝ|%X @@/@0sܴٝR\y!ׯE G*oH*U;ŸγR@~vZ5M3{3yʙgczV-[Hɭ9m#.>Bʕ*J R &Y*?ɏun+      Yfǻ=3n3;d͚߇~JΜ|[dҢadڔIfP, `0  @ X~鞒)$!?%g  GG8 Jl+o?Ǐu8ۺb|ɝ+ RBdEHLv/#F>}}+!j+dm3gRZֺn#^{߬W ڋ;hXtiyKRr%ڛV[d v}iYdsto^yIҥKgciNk@@@@@@]dzJ:ΈpYUz=V>İ% (phw, ̙)^~9\>0ޔߎ F֝a#eoI8JR Ctml/*_ )_FY . k;lv;ٷ>-ڶv~kmwhVg>>? H (EA*Mz""E@E 6_PJ "="UNsf7$CvNI:.ZlJÉzGZ4kbkn/{Jj @n\ :tXԬ\@@@@@@ 6o)Y|tշZa hfd挩z$pءSwK.ʈRA K" D-@0jwT-\bhv.RYV8a֧Bo-½VTԕ>9ҥRѪ uYFV:X߹G뮻Za\9e̩4iRx9pI2ӾҨY+rBi:qB̙2I.):]_.E)`'q>իdҸy+iҨK}W\'+iӦuM9[|       nܸ!˖ EWPTw?v>uylrHUbߨN}:%rZG|O+ i4   `U 7%V_?Hׯ ebt|TB¹3ExN̦V[xTq:4,2 Vt3d[NҵKGTqSvKoLSU~}O1'7;wSSl൯+      C@H 7lJ]VzU u i      "@0@n" &@0aGT5J jP+Z* ;|@@@@@@8 X\@@ " sZ:֐a L'tc #      @b XFgD@P` ]B@@@@@@, @@D`asS@@@@@@@ JQq  @\, U      ^`a   @ S@@@@@@@x X@@ °&        @F>  P`a"t@@@@@@B`a@ D@O`a)O      !@08Ƒ@@N`a F@@@@@@D"@0 4 B      xN@@H M@@@@@@@(FI  q!@0.T&       {7   1 X4NA@@@@@@A`a< s @@ ÚЂ      B $Bpyd@@@@@@1Lt@>7<      G@87dt@@@@@@D2<&  o mD        X;@@ A&{7͕;M^RH!2f4ǝ^ ݐ!@@ q,qnܴźd[ =!kwg\.1 VZEӵI..]{_/\d~q(q0PF|=4i`~}PCu ͽֻםNofΞ+ݬx /RAO?ݜ V8{Rn0ڠzefݷ<=fRԵHv회>ݼaܕ,izz$M{=KYG@@@@@~OL{opsD ?soJ̙Q4Ivư_8* @H v[n'2f478~q;u괙ZZ7䳲|j?$DVY'9s>,KHnk ڧjS?W!\Oo֪WVMSҾ_ˀMq/X?|~Gqq `vg[y=zzjk3&L+WɲEzW.?h~zxj t.,ްaOmWw0.}/@@@@@@#DRF q9mdҹkw73gNKUm0sKfϘn 6uYPA_y.$w&fh*/V7{ 2@Hd vcMP&&o0|g2~WL7ٖ͝:ͱ,]8 Vx?m^TӰXMZΌ)Jz͚u)}uesW̙.yrUt,a)gOGx_~](kͷag}֮\K-p3ZY fs_@IDAT/;R#jլaM?|S>M~KZYpڌYf_];K.MYlte&Mם~c85;0J:[6q} ,Usm .Y8޶iC`"+@Wc~Nu[Ñ%\jT9es՚u{AØʴk=;d C{,     ^eʕK={vysQf5[vqㆌfTRCriYrlݲ٬w_i35n^ 0J@Bq;ڴ 2Dg*؆ B>L76Nv }+ZLQkw^j%;{,XX`~:y}L2Uz}𱳭+:Nk/B@}6~M0իz]*噒zVzhsW{{X g;4t x3hW$tsm$mIFu5Bʔ~5)[ji7[)Zu _V\j}U6Vq;)ˈ;X^z>7u 3fiӦիImteXS5ǟ:J6ot oX:7a@@@@@U$E>ivUv% 51[(W,4\kȦk0ztټq?W?@@ H6n\wroP^XE7X{߱'jr5Yh)odɒ[ 6nX_>}Z:K…dU^otŚw}yi׬Yp¤a^DŽ6]ޮ»}H<t#[qO|!`=~R%f*#F u2etpNikOU4 +}Y9{J_w&9rH;Ĵ¶[;o{P7ks>tn      x .RL*Tt8x<9HB.^ # 16n;YV`ٻgsKjv8uyYz߷nW~9,t @~q;j<-Oon-rŲpox;Bz +KŢ_A;X?|k߱^TwU[ V /c?/L1~QUC6|vxHq%+U0MZ=|ݻ#\߼~sfVӰ2|@\}vOׯ^&_WeҩKmJ|>fN_lvFDي ;Xmk׉w{'N2ػS&929sF4g/ll^pA^}mSޯ@ RzU8KVZ-,r}W+_QPt֩埫Wgk[ZĿLvfj2~v+hg[WW"iq1MXA@@@@@/TSK]% u^Nlr}$yEk/9f؛~JЯ  G`a܏u/K͍›o8M= rP:KqB*s[YjE0_tMF7XargϞbr+:nƍL~ri& S!4\xQ ?YڬTɒ%3MGs ޺U y;fqGZ?H{~07 >R|+mQmh&jhL?mܶZlݷTdԆGJ굜}s唅sg:ۛ6(>l+YzЬ^tT+ԍ ;vh/=_n_F?;~jBߪP{B:y~`/n==xE@@@@@_"4 sНw);0U}/"Ş*CtfoF G01  C>rL~MK.kJG6U ljN2dh&mv 5@p?Xt|1 Y랪W!_ 0زyy7$iҤK._,d闞;MV{s7%% y# TRmwC|Ekd}PQ+nSiN/6F O?uwb7I$NhE_zV[0gUYN6kNPt`bt}sgNuBڦU ϝ;'9!)SzˆھҨY+]t񭾨;w^ҤI- ={vԬm997n3->fJ/uVZs=_YmWa$w9rxoԘqҷ瓄 VTA{hXT]|w~:~{HJ\e7f     \=s=cْ Jj՜;JN:he˖C5l$G V.`6tJ䚵j;E;>d9ϟVh@@  ,w oJd{߭s7_'֯[ TU': &[$͟mN;ܭK__>"u4 i]::?ຏO:-϶{^B~;`7ES+O4+$Ske!H;ܴi@wzE;42ʚ>Se:-V^%:B=n^-,ctۅ;̕gz'`nk      @59rjݷg̟7kΜ^N)`@HjmdͮtIɯ^ p@@ ,nզdȐJ;k=r8VPagK)uNK&kɾFv֟~fښC.d9kOC~ MӄI>}S'OB %KK8+ +^$fLOX??IF>\/ Ŋ1zʟVG:}|sWDqV‡ZerނE2ĚY+ʢz:LPpH| Y|ei({KR%%j?4nTt_7/Øoۺ<\[ߔӧȔӝ)FHR%Me{׫>WV"7mQ~|=3uW{^g{TRY>U2u~޶]֬X7X;b,     ^u5s*=w {ZQӦARy>dB9tw^ ݐ!@@ q,qYr5-O1pkJZ9/ЖׯQ+gWĻϠ׿rȑ[ KVg[L!G+W.EY>5s*k nK?"{j>y>&I>,:ᷴO+)GZ2cxeZ5~7?#~}c؁     @"ș;d͚] z$w&\y}/)SӧO[@XY= # ěx67`Ujkܤ$Oܹ+XqúhW/**Vhp/e_WU`%[ևi5þYsIT)M۵>xi${wYA@@@@@Z`a\ s}@@pZqδΝ=+!!7kPkd;$TǹO^oz`NF@˜q        ֗# D @0@@@@@@@ X@@*@0<ύ      .@G! A*@0HB@@@@@@ XC  )@00Ǎ^#      @ , 1 @@ XB@@@@@@@!Xț@@ A&;7E@@@@@@ X%  ą¸P       @ސ+  @`a 8@@@@@@-@@ , kB         a  &A@@@@@@@ 0I@@ ߘD        cy @@ ܐa@@@@@@H$ @  ,?       G`!@@ X @@@@@@R`aD   Bk"       X{C  1@@@@@@@@ 2@@+@0 -       ?,Q  @" XGF@@@@@@ XD'@@ X|c!      @p, q)@@ XpCF@@@@@@@ ,L$c" &@F       @@D`asS@@@@@@@ JQq  @\, U      ^`a   @ S@@@@@@@x X@@ °&        @F>  P`a"t@@@@@@B`a@ D@O`a)O      !@08Ƒ@@N`a F@@@@@@D"@0 4 B      xN@@H M@@@@@@@(FI  q!@0.T&       {7   1 X4NA@@@@@@A`a< s @@ ÚЂ      B $Bpyd@@@@@@1Lt@>7<      G@87dt(R|%K䕞o6mP$Ibeyrҥ=2J̹W^g:q׮]͈r@@@@@J`aP ' +i֭$cƌvOOܹKB~;1صsGI:u]~9zL&?-chZ`ЁRBygu6;ہx޼2{wNןY֬[lJmW_qN)Q9s߾V>ޮΕS>d~ޮݻ_'Zy};)d1ɑ=}r 9tL9K-_W     @ /B}Ϛ6E^sQ`֜y2ijS`W(_V:Xo u 7mZv>,Ư}KZh术S/"IFjת)ŋuib!V@@@@@[Y}z9}=zL̛/G׈ UVEɓ[g&\C[{<[t¨K0bU'OoV.ׯߐ1&HMHV5v ͍y^iTr6CMUǏrGmY _+vj:U*(y2r2clc^0l-T)\UL=s}Z" I1]*k<({s²aN!6}Ti/Z5kXߓ7ͳ:ZǭlҦZISo>jw)Y{"iF}6o~?Ѭ?ez#)S4m'{UkyYN<ѪTy}NzIkWYǬ=\9|wSÌU17n+ǎ7Ӿ( xc]Z-sϞnt:-2      ]$ɓ03 8Jh;c]tIF uU%˃JBwţG9_H@@ c³gɲ% a;vzgwŷr7̔v5@[AO>z_2ehzQ/QF^|vtu@R0Ϧu+p`_uӕw|]ڶny&҆;'~+uEm54}nt}5%x=;~h=ߥfݷUK=^3A[W om˹ 1& |äk/]tY~}pd^t:imhXK9oHEߋ }&|h_|Yo_ ,Ν| >r_ҬGխ]3;Xl7>}g9Uv)R8+m}d^哧NIrWTAik߱BkW.=X0~.ZsחkxJ 'wn91Y| +gN-S'[͹&/G޲M~O_0i+cG2J:m57ْ]=v/oCڷk4u j;    @Ҥɬ0= yh݋p/ZxQ4Iw0W ,QO  @"`=|{vիVŋ즠x3S2I>?r+F'lhV-Q_zUjYS ەt* Ds\v ǍiUT~t  "[Zii5ܷ)\}s7T=^Nt?W¹3c>baox WZKK3d sfL1o!S >E{ӼfRԍ߬J5j?cArqֶCVUɷha1;    H󖞿g4 2P*W􄳴AfCYH;YtHk܋o/]"K.7-51&> Ξ;4d-]Rgf_v* z*Y,?e5sB!k ֻeڌYI'n jK]ԨP>{vUYO9 iM+$U"}f~t:MW/i֪3uL:U{&F qŽ[TZl}颁47ki775;bOnyʆ4XꄾACV܌j)'ם~Q~@@@@@/WPըav9mdևֻ߃9s[ɜ;3ˁ!xG?ܮ 9%3)_^֭Z%o\&[ݐ!@@ q$`ִ̔S'OC^!ǟ]Mg*l;cǤbէEmy3VIװSPCzZ=ձ{ngnФ3U^t aՃ5f_|%#lG~V s}5x9E(}Li)cRL\СRfgv 5见?]|GjڲsV:O\OwOZe/;ZٛRf S L<ŚfDؼ_|}4Zru'HSԼ2Q@9yѐ.[Y/Z ZUOPUagt^zݴ|;̙n͵Sp>]m7XhW崯iy\ߪvP`vU}?Pҥ15\ǟN l/}KZhfoP#{΢A@{YltٴC{~F4E%Kf^@{۞qfJv=ItOͼEy veQgإ3NG]ԫrZg1/2iW^|lBN     eʕ=޳g,7W5i&Ye7#F3\T!9rz\^Bn 2Hvϙgԙzƍ׷ }EF@,aUںGٰ~5xq[Pz,]<%?`+ՠVu2uDgV{PuZT{iOuSߊZmoނaMtcyktmὺ56[*tv Lm--LgU{k&,Pߢ%˚ku vYŮHhoϵi<1}?h7]Q06`K VU u4nWFv֜JVŒlq[qOD3Mȭ_h5Q F>rbwg{>sN/}FkOU+u 7jͺ&{\/!Gz55BʔrH?)[הz(c]:XBvګ3;8bA_߬,h 5$aA])5 NP sF'f^ cstV|7\G    @h'MwUv% 51[(W,4\kȦ띇|`~ 7 7ӱh,&! ^`;zD/[U u1T̴.J_wD_HBVqN= N1;{rWd>{E}{ߌuWE'fktU+u}U z=w j:ƽT-<tvy^tZsRlk\,)Y+`a}^nwVQ06`aEz[ww`Ilq6zzm?Nϭ:V xY|6]w{꾯,覵Яlh4*V8!e+Tu7uC&{xӤ:].:%x"%z\ ÄffvJksj{jEPK]>ug*jZdNlO|ҷ3mECƍ̙p7l,l    @"ŤB% B2g)Sŋd!7m!ej̛#{yF%GO5Cu+d}v_,aS  @ k0J]Jvlf PY9"}sH6ot5Ĵdrg[W|5p.իVz#w˯;wI7 t^~V}e+VC /<9%KKޡAyߌ'¹5RJ,PYӜ|6ჿRV q>YΗG,7XtvWs uzqN1KS9kk,T0Su3%,gxmӰ={m'y5o^JnӦI N.Ç ;v5:Nî]=u5LXPkIz^`/?ժf"nkJ~5pi[>7J>i5);S9녢3%sCV@@@@@?ȞaB$Ibqr_-m+3yV3~(9}i8d2lBϝk׮f` A@@0 CKO)hhr$t\+V9Tݟo)%Ԫ&SjKvy ^}VfGP)z`*vլ^UZӎ,ߪ0`KgU]~Ӌ mͱ*(yf[wu4{],itu:U!RgamS~v;:ŴEÃ6m*s'ZA0BwJw>eMU{渨D?`al/jPKuԒR%K,Y~={Uqyrəe*ػ k:]|y?\u6J+}*ҬU[a#    +*ujعW% u^Nlr}$yEk/9f؛~JЯ  G :$$Ŀ˕]e;>Uu\2LC,ze9ή0iF@wHR:kJ >mF'}yWsN g%g8h^ _L29䟫W剂?oɓ;mq,0y dڋo;wx,t\{zj::.F~x0>oB2|y&Xh5H7h~}3-byuU|jۆMLbUg)6ndӗM[6iP/S!..^Oh}1JG3ͷZmVRTIvVTYvWF `ѼNx_pfvUAܩ':A=ms`v+بY+mv 5tYtؽ #G;p*6B4<^ߓ~8Gv9|A-۴=m@@@@@ ih:+yjA_Fo?E=)+x>$"3 x`aG@@0 _l[JYa@Z" Fϟ1]TtXwئe&[oHҤIe._,dUgOG6ʪ߸3ld>bO62s]q/g¹3|CQӾh*+>]4(4rЪdHxv5.vZ=Q(j@ ;}q 5P7kdùa=ߔ+Wsuzjf/3CݎDB=? JU6m]1K>JMK?,2C݋t+V:{-d19lJҜ&X[s7M=_'… :JZv̙e(Θ!}[YhtwJ` >o{DCF |O<;ffzHvm}Z)/&+h׼icyԃ|/p:pskڌmw8;0UIXǍ6Kͬ^wa%O}گ:t j{zu>XW@ћaL{gxB 4|*9' p}^@@@@@@hڼdy!Uj*T* $ZUC/Л HUBh Hǀ %KH'ÝL29k{>mq!܈n!/7q㾌+.mzizh\$XI м@5 -H޻LZ0u^ L]:5:a ]s}LA+;wn)3Nei_|60_Xycog\K{|@IDATqM O,R5LKef͍5R8>m.8<.;M.olb-i4`qob 5B gLm9昽Np+ܶW Kפ9-4Xuf{ͷގEue Ko~L[Up͟JS2]‡|Ԗդ쟽{e^:˜=D\yUH}ֱ'~8K꼣glPJM__g|mq u5  @ @ Pw_"kֽߌtKʪG6}b@bGXbgcL؇<`fҒ[nM,BQ#֛WN;T }!@Ԑ@5 \ÅiL*Ll.lij|ԮM3[ X`bT?%y~xͷ6474['w;0{Lq販i6%U2Xz\sY:ĩqY8n7|xgF7Թ9A-&X> ۃN?+p}vT:dniV#W'`Wz>5:SkM0=/wPXR[ƞ?rmFCX||!:>[8L36^ry1s>X{5N+\l{*t.;kFf,/y9/{2g~j4KȖ+.}S=;otӑf <ḣ ~N1yˮȗ/qz31֟!tf^=cu~Ͼ‹/|ԙ }l|6w)xgN:eO{pF;".Jl{M0u7wޤ{[1(_Z?J3΅;[ߍK/c}cwJj_ʡ3 @,,ZÅW*l WZSXuZ8)dX!4 1rTUSLi}OSϙs)r'\)qz='9MBOV˄B=]oezW>u\'1lBN`ش̄Y|~˼Fjx݌Lҹ a߻S 5kl7}LZa? Lř Jޏ ˳=\ѭ03h %>  @ @ @`,ѽ1w Viѝ;ue[._`ڥk;6{ر9Ka8 K5 @`aQ{5 P:cec3=C 1-ݽݶ[峟Nmg-5 @ @ @@ch'@hS6pjL`Y1ט@mwu~H^0Cϟ-w=:fk9rTOgCij8-|7qŗƵ)W`W39l Vw @ @ @XuDͶfA?'O+|*A+ @ `/}tL01}tH BW8b]v﫯b}f0*ܧwr^;K,_uE,21z8CgRm!@ @ @N`CcF1GŒK-,X6.¿EU&XXM4 @@ TKH{ƠG~Xl?\}Ǝ8>X5:X{l1,=I;>㼭v"8¶I[U_= @ @x-6V\i##Fzsީ}; w瞍j1 @*Pڂ:}xcRFR9~võƏ~wabqB ם|q 7ŝM6(VYyXfG3og:i +k -7?Y{/sZkm^,r/qWg7|km\{]6pWΝ:Bh'=ν`ZsK-d:B -`f z:v/޽[Uo;>ө.-iMbVeY&zRK/gCIcu>U|tgzk65TuI|%cDa_|y*}} @ @ @6vD:klK.{ޖvR`o%ys瞏]'oOK ?s9MIsς'+=~#Wg=λ͚vu+nkaޞ?jm; i @ @ @@ ,ȢSw/nl?Zcxg_ {^_|ﰘoQi8qBOcq %.,)-lY|?I @ @Ԇzn?Ok1cǝvK,'OryE,5C~(}_/{bl?k2ۯ? +ZJ"ZNN3=tioi|9n\ޅ\|k׮Yo'?o @ @ IـJ Zqg=m+YvG2qCj8L3͔4oǿ|"{cV:8N'  @f@ 3ft<0UBO'p\a)?=//O֧q)/1ŝwݓ4`}]tyh4XfK4_՟QOm2;TO[o \i2K,ѽs:SO.i.XkNiq - J f>*{{SbUVΚ?X׿1 @ @ P?Zcxg#1|x,Ȣѥk/ `\yX=wevرO,Ԕ _&&ѡ[oYl.O²,N @_Z'LG/BG^r &4ޱ=*M!{;-K WX~[q̀ʎK8sfT_:?(nIK)?Cy[鬆`O y;% ֯EsN"MX5+y!qPtWǏZ3kOKQ) .@ @ @TK}?0;wߍ]|~6'-GuLR8]tӞ>_bҤ+r> @jPof<8xP[J^.;oߟ+*LlQn߉-پxsby^~DeOZލ7 - S0m,L K(^yU8KJs»o%V\a1ivOq_z%F57,rMАq?ˏkMc֬aâg]:;\rޏ 6٬5 @ @ @m㠃37^-qyہ>Gv|gwXm +owq[> ˪:Cj l>@vyOW^E<ߪ09ACi6[<:dpQ)t~/3o>|>u/]8~1Dzk#X[o={駞w虷xq_oΎKsK/W<>L5=?}$?2KoϏӱ>ŝ/~9n| f>=v-^~մm?Y{ګ/λ!@ @ @jK .f*Lĉҋ.:uL3͔:xYcc7.I"K v @j[Gi/|<Ȑg+*7l\9C[KW]sm/(dKznd?/ .@T\|qES~x}םcg9;?~XgMqy=0X߽#MamwoV֧\i~9cO<wP~{?DZ9m}zl?bڞzoynrD>L w[(;?r~c4,L׷f>YFÎu W[usbEI,$@ @ @jL`]wE[<u 7gZ?΍>/-{ߛ - ƛn} @ @ @'x%λfRK7:7_=:^z٫wޖB 0*ªO}a~]9S5 PCSpa7&+gyO<>v}&Cb.[V97L3ܵp\VR?W_9evCa-c?SN,,1+;N6oMM{l^x^~]ylĉ^s\s~qagb%̚nli9O;%ZG1묳R'.2z}/zW4;?+^}n]do=λpڦ/K(]̖ч}?ǻWXzXf.,|9e @ @]z/L ҿ>쵸 `̄;sa(/>A #)m.}²* @jG@j] ^UZTV[CLf{0Ka~6J+_O1 `s35wPcR`pYgɖnKKK^)<-- IWZi\Q ͽ됾Ƒs X`fi?q5' @ @ @Xze{%c;B߭*;w,\̿ѵK;vl=YCT> @@ U@S FfT<أ3#mmq'H @ @  @" X!^Z,ܹOI'ԩwF[ @ @ @m  @,lFsM  {1MR5%2x @ @ @ ,A 0o`u>~-t_|X0O?4F V 6F @ @ @@ ]It PQg$@ @ @ @ +fzL ª(A @ @ @ PUXTC"@T`a%TI  @ @ @EZ1 @@@  @ @ @`TP4 @`a{ @ @ @Z" X5 @Z@Մ@ @ @ @6,lV%@hN@9!  @ @ @ 1 @, @ @ @T@L [ @j,  @ @ @* XXo @@ Vxu @ @ @, @ ˻>zG @ @ @@ n퍜 С @ @ @hT@Q' @R@-u= @ @ @-,l;  @Z! X < @ @ @ @  ף  @,l @ @ @t`aG{7 @ kN @ @ @@Y uyt P[[##@ @ @ @ +~zOXŠ- @ @ @ PU^`#@`aVF @ @ @uZ? @ ;k  @ @ @ Ќ`a3@N @`a۸z* @ @ @Z+ XZA @H@Eln"@ @ @ @@ 9 @LM@pj* @ @ @ _= @Ԥ`aMݠ  @ @ @ (. @Q@jL @ @ @T`a5T @( XXEe @ @ @jB@&l @,, @ @ @` @@v @ @ @ @Yf\@ m @ @ @h`a = @-@s  @ @ @A@ @`aC- @ @ @(r> @jP@n @ @ @T`aEI'  @' XX}55" @ @ @C@:h @,0 @ @ @5" XX#6L @@ [E @ @ @S } @:D@Cؽ @ @ @ 6K @,l U$@ @ @ @@ [o  @-,l[ @ @ @  @  h!@ @ @ @@9C P5XtC&@ @ @ @" +L:I>ꫩ @ @ @ PQG @T`aŕL  @ @ @)a @M@*? @ @ @" X@ ! @ @ @hV@Y" @`a[z& @ @ @Z/ XzCO @h`a B @ @ @v,ld @h( XD  @ @ @A@ @,2 @ @ @! XXeI @@ V_M @ @ @,: @ +d:L @ @ @@H  PnV!@ @ @ @B @,v/%@ @ @ @@ @- B3  @ @ @ zz @@  [ @ @ @`a; { @@C†&Z @ @ @ PP} @Ԡ`a ݐ  @ @ @Š(N @O@jjD @ @ @T`au( @' XXq%a @ @ @jD@F m @r,, @ @ @& @t`a{) @ @ @,l @m! XI @ @ @  @Z X4 @ @ @ @ + @ 64B @ @ @r,,* @ kL @ @ @@EVDt P}WS#"@ @ @ @: FA8Š+ @ @ @ P#5Rh$@`aUD @ @ @ 0E@7 @C ;K  @ @ @ Ь`aD. @h ¶PL @ @ @^@@  @ @ @ X^A P@ @ @ @`a9TA @5( XXE7d @ @ @*B@"ʤ @, @ @ @! XXu4  @@ V\t @ @ @,B& @ ˭"C @ @ @)  @" X!^J @ @ @f %r @@[g @ @ @ @7 @- @ @ @hv@  @ M @ @ @ @ ˡ @A,! @ @ @ PQ&$@T`aԈ @ @/=TIDAT @ꨣQ @*N@J @ @ @Ԉ`a0  @& XXn @ @ @L,M @aR @ @ @4+E`vIENDB`httpx-0.26.0/docs/img/gh-actions-fail-test.png000066400000000000000000015003361454054354600211240ustar00rootroot00000000000000PNG  IHDR "~t HiCCPICC ProfileHWTS[RIhH "HB U@B!!ؕe\"um,?,(bʛ;?g~/wjT+ɗŅ&H&/cc?Uh 咋*z q@υ7bTgKx22 R%Tb%NW MB]i<,&g3!u]%2|Oq#rs+1_d3}\TB˥9g9(}F"9ú]Ϟ4{$1CN,PCRED=jʗs`bW/$bS$9Q}z8 1\!h8X(pV˦ [ϓ*O*"!wu(!Y3F-'EC 1SlDA"N ľBIx! rbEbnW"4< pcx|X`<493nY=`Cn| oh"Wf-?r;+ Q1ĢRǚ>TWȷ9_UZZbi8v;5vkZJ<VѠ8U<ِG?Ƨr:n׏|a8ӥ3eLQ> BW9 ;~Mb]1|J2g G0|Yc YZ+;907 @@ H)`*gf`-@#8?y[ptg:@ qFo$ E8$IC2 @f#2dRlFj_q,ҁ@!K45CQ7F#t Eh1 @k]hz=^A;gh0-Yb.7bT,asRf?_:=N8 w+8Ox>_W;$~ t)K&2 3%r6)oD"hO1EE\J@C H$c3ɟCI%].;قF#%rNEcr?EbKP唭fJGSY j=6-| ZgiӜhdvvNу|2z-.6C{6W[=OJAs[gNN~ :=];].OwnAk}z z1zzKv{Oҷo?1qe@47d6h357cdXhXexذ1\fs9s*0aaaK8p #Q+FYơ+&N&Lfl49e3`p4EMLLgn1m5337 77;ac422_c~ļۂa`!Xcq)ːf*X'Y ͖mVVV XݱZ{[gXno3ۦ-Vd[;{dso;j.;78;NN"* Ψys5#\..u.F2GF\8qQ6RGuzgW׭F7z/ݜnUnaܛ_q#qux=Z<>yzy<=lҼyxz/>C s罯o>߿\v=k?V8vV<:-y5AۂY]o99c!XHxHiH[~hbhe0̰pY"+#q͸|n-w׸9NF"#+#G9EɢǣǍ_=vm$1pcV܉͋}qB섪 F͎;ψ3MBp[Ė$IIoCW%wN5q)&)┦TRjRԾIN1d)S j25gi:xҒv}jx}^>L$X# W ggx韹:[(*9J񋬈MYocg$%K%'O/!uH;|"e|)[  HPPR:i撙Š~jm9{{ss6Emg=x^;Pd/sU _/J^\lV<?ԕhJb%K/\*(=WZV^q)鹟FTem=o\A\!YqueVzz55k^lM:+*۬_cJUp՞j%o76\~٦M~|}s--[mMz_jl+id{玸'kjkw\^)wMվ;dwSK==e{^ާzu_侖@i0Qٔqpf}!CU /?B=R|dhѾcc=3?hrON8v*ԙ?8q}3=x\y @g[ M>c;\ xRȥ?.s/}j&_.F΍7 nߚpwk=kg?v??*lۓCaO'=z&}S_w߭{^^ \c^}m;w;{?!I+>9~j@'㩎lhF/@Ogv< 껩 wAx=D3Fl!Pwyo 2594 1662 1iDOT?(??&Ք-@IDATx|UC{D* EEbBQA(" E *{}0nI6$Sܙ=7 @@D(]J""      C A`02  @\"U@@@@@@@!@1i<@H@@@@@@@ L"Ƀ6@@P OF@@@@@@""N@@HT@@@@@@@x D7!  G b|8@@@@@@H| @@ Y DL֏G@@@@@@0 [@@BY b(?=@@@@@@!Ȼ@@ Q"&*?'G@@@@@@-@1ބ   X@@@@@@@ "&3 @@d-@1Y?~n@@@@@@@ bJre UdEs$ϑ>}z)\u7mN Wfɝ;u+Wdiq@@@H)R 2HL%MIz@@lK/gٳٛ#ԭG̭=Y.}~LaD|{pٽwX:# _ ujגt c}n8j)QϟOg&N={֭3+U c}$ȹ5h^=ַ[l۾#ơ4nh> {ilX~ 9̐ 86nJv㬇E |}&$ݸxzFVujRŊ%Kf}s.}\`a    JRrE1p2z"$A.ɑ#GʕvuvOݜ4m&`%2H~΃ χΝ/w   SڵD|||,R5D|hTvd{I/|-o츷kҩs萏>=jA{FDϜ9#w\۬v{lxWyr|{5!Z9Db˖p -Xf y񹧥\2n &0:oA{l͊g%[֬~[lڛyV}؁   <7ץ ހ @" \pQi @l>SZolq  A "6n@{)!M1S>:<ǝmn{'&aC\Խqۢ20=3C bz9|3}-[ ss%B\9e֩.Z"V =cǤʒ?ٛчfM۷ҟwKNATo\:o~;p}msGy٧%M:pnA=ݐC@@Nǜ#{x $ǎ[4'+J@ "'D ,׈ &A.D 5kLɓzdG֘n:Uos|Mu=uY& ۦO%UT֡Ν?ϖC%QҢy3I.bKfj:V,V]# [62KmM^YGxWo7L\:NݰiKyCDv{dw۫kr "Ο3[ܻ.\rE6m"{yN#~W{D!VRE(Ϟ=g7V%;uuob@@@ TC 2(!$СC?3sOH][rzg+ADΝ" @ ?_yIt Um>)N5Q#S"tJgلE*W7_'iӦ}ͷQkQ †D|՗f!;t&O.}v!ϟ͙3T,_^t`*0d/ ͚6C"Z+Sڊ>)S:kҏ6F}lݶ]z='}}hyd| mӮu><,9spsΆ :3}p6k|[zS~}< :Ű!9&OI>yN{ǐiuVD_{we˔{ÝcWM`c   @p , Lj4@ oj?R%O3ap0ADa660c,/`G{>#>̾6g, 0Uml*"jŊ_~]Yq*呇{J"S}֙0H?`mz;RB{wWn˽Dk;8Byw|uit}{-kN#/CJ;Z[> \5=" Dlk&{W1W;cs.s*ujr߰[|lfŸx3T>zEhQvOgb7 O^S-kUM4jya{yd k7vYj"{oǍ~i" x-w|:oO>.MRx6:%v঵{䍷ߕoq)yڼ5hkNôz̗c&^xi-&L,Ͻϻu SvxOF;;B9$K&!:,    "@1AX4 , b́ hҥVҥK1W\Iji[YkIBR+V(Q%׽w>iд3ldq:   w"N/;wܭ|f*7$]tQ5TPHM%{{06oau`zWW*8ws)5 "a2s/u^IַY6V߾ "j%/>fFVzˣ&j7wHަ# &8~7͇~L܁>gBtAD='M!O{h{^nѾj5]}ϟGv*sY0Q3@FYn@C_}hʺF+L7m65Q*F76@@@'@1~~wqHY bF@O"|eϝ;/}_:n=uqM?~5q=<xRy|ЦkwV| $Ni<^rX<:  DрVDԦq 7[?k0S\cW_o;oTv~1kz+Wi3Sְе;Ukoc]uZY2Z>j d*hZ?^>g贿Le#u ˽]8 2Ut im۷'NX͛6g7ZS P=;H,Y'1;uåpBrii{w瀏MQ߉0'dKןyTQsdʘѹ'~NN!S&~oM]h3gCV&N}ihm4hucOxv}زEs)Mv Ֆi!bwQУ{/_b*TROaT?bǶجh@P[̙Nl7:nÈmѽΘ:ɚ.?z~il׮}[`UvTk   @ DLX_F/@ѿ {@ o$7 "4\gYD1y:&!;?гQ\W}q=<-Y@dខU>O>s뮓'HQh0ۙg妚uqu\Ub!댜ZۯFK >{6zX2zOE Ch} |uvf;W.kN_pzr`C;[E#ٿ³}aQթr).\dy]/=SҨaDu?ٿfr^ݎ:%;t!W2jPɔ)}w 3nl1vh됅ȫo "NT(_{m/)R& /ׯWG40i7YjUu!nxdwYwQ|_쀟bl,Q>ĚB^̔;{&VhQ+4];ǟ|fjɈ<.+>l Ю{{tEJZ5;Dt;w]Dۏ    ??Aĸq$,@1f#z @#GY9J kiM8߳}$[ֈ "1tkɨ/8?]ʔ+V'@P"t|={qdzx@>aaڌ򿧞K+~6?p0ʾ9rSLŚQgNg8);w.isGwF}ŧ Qu{W@#܃yӄ®tzOǎlٲYyE'7OD+j7~|6Kk9?Ds=^i{Gk3n޳wL8Y~>ãObujZɓ'kN}ڷSgh4 jTې>X1ލUo>>lTF&M*<*ݻ#/qwP==[S._|Yw:ЦwղE~kҥK;uzfw[|tݽe@@@ D 2(,@1`*:"@"CH"7^w5EYvZ=+hzl\i񷹋dڪThdϞQ6|'U3Yj׌Z+Iܹ6+xkvqf˕-#?ך~0M֔nZWtj_xVZ6Rs!@r"c=ҁ?4w|:mV~݌g3k "yҧOo*7&̗1J.iJADöeʐ%K'L:Z"߾ݝWUg\֊Ə t7 :x6e_F_CϽ-+UUy߅:     \OF \ bVD DG bDT0 MYdB>Ec |YC(-oimxk׮֮L5Ph{)VZ-۶ӧO[)\X1w GzLgVzL7kl%||.?qB׮o>+cszO'7w|岵?螊>HtJi,^ܙY??kV)[S]p^>x4J15s%GYV'JT4־.^@7D1uhش&'}aR\Y^? ˭\JϜTs1˵fnUSjլTsUmZ;}?;Yaͭ۶KGbW-W1s^44>cWfgGXW ͞1~qqsĴF bۻ;{|s_=vQ3O=aw1|/7׮TAD{|YhҸCgN) a@>]:+ةUFg|]S~ mŒ!CzVVl(!ٯVP>KϜAX@@@AĠ02H"C@ `S )7db[6E= #&vKAD 3eܕ+W|>{>(?trM~*2a@ FA0Z;2e$+.p |rr}k;Px1yd{=eY.ߋyS.k"mUՒg9Zx'it> Qݚyc < !v1^민dBxիP]>0[֬_٫d2cҥg/s[+Tt(Vʏ=%O>={۴s g{z_6>-6!_zE6osXFo8Vۄ/Z}n'L^~^u^DtO fuzrz0 >*D~i_IwZ]w'ADn-osrӏRDqgӢK=u~)M^8,   W bp=-p[b/@1f@rSQv{V_kTզt{r "51:t?Gq]Ҳu[xb\A`ϝ;'Ta~h1Zlױl޼%yṧcG@BYP_SQ:iM:|O丩@S[q5%w|JL TP^r;w-z!v"]:u钩wkvֲ;_K^{瑇[[Z"ޏfMSkݞ)i0߀xT~섶n.ߍ>D`G)o>c|v}׭P]aO(sSͺɈaIuC/z*kX)_o[I*AD=ջNS.jN}؆   7qs nrO "&#'8l?L.[4c>Tk1.Z">sj7YHݷ_~> in}|c 7ӲEs)hu :-5ͳV =gΞsdnҴI#i:5Nn:rmMQ>\ws/"z:c<*Oi3d.پOHַYlM>͛'h%^nS&~/:" @ppw:1 g#K…[ڛ>C_qu_t.B{DL>JR4X/@h_dwU+ ;vu3m0MH9VԶq&yel?SNtz8_A2x3}1`?aNmmkDj_ƣ1S?]mEDXvd{Mk9do?[=S,}5PqVQѾ.>zn{Q:wٯ[nm㬻 ,͛6q6M1SԳ:     \OF \ bVD DG Dpᢼ;:IJlO q "^΄-ɦ-ۣ%Iz4,O5A? y`{uZ>8ۇn]'w^>[2w鏵UG5gOB :}0TFYTۜ?g>~*Ύ&8E}e4 $7n@Z4o&;h]qEzmM[8:Ѡ{~'Wg  arKmDt{?3A.ԮU tM3%~Agd|/vwN~g{l5w1s_5!1҉ ~w Fz_*9S;t׹?kCⳑ ֦~7.J`x2rPT/Z_q6\] jԐtҊJV'֮ y竿m D vфIK^1_7묻_g|^dk1sMCl5GZ:ɢgm|s2Y~4ൢN5ߜe˔yX7}ѿ Vv-qOh=    D *='vyoLEcl#c :uӧ5lC1AX D䭀WQOAQ_|q+;{lK앸}[LLTz-!rۻ#oiT>pPKJZ )RcK.;S+XAD=o%|s. Vv_w!1|^u^5 ~Fg<>vv @;q ᰏG<ʍUowz>nlκ.t{V6[nheo&nvwFTM;|t)jEC|9g ZytRVWCÈGC/gw~-Y}%h.K,RrEզUK*)Ç5`柵@Z:7 =Qm׮8ǎ,Y2+{Tr<+ShSCvigl*Z!b =cDهʉ'dԽeJ r\ѣ,oWcԁ{X3jqsض "{T+Uz;vJS3]oǍf\[0ן]0K > :hl]#?LQR[J#+=yfʕ>vm<4@@@fQgbXϟwD'ùx{W/Ȟ] cG͗] ZE>#s@d, Bd>?Y|-zj5" >F GR7 NCA]Ҹ~ķPD\cĒ-;w^7lr "&R?Ԧ{ 4^yѩWk/6lnQ^} hXg~ygчRDq.>-V0GGFG\KAfACW5[cDTF*+ǜcwI+>^נb?LtiaM4lݺMz=xL}O ?}eszW_Ltn"x}'wny=vL^zu)CB5WF R]j&M}-·%K{io ͓U?,qvd   @D[zuMČ]ɓ'y."z>I!@pB9!}{LJb.Z\+\2*#: ,\JHX-yckr$P{(11 c}.D|)Sc;l\ =mT}pB \boCboD>\g z X! NJ ׳{2ohx{Q;W.~ZO6T)5uVܱ UL8pj$tw{iؠ5}9h~?:ֽ}ݺ Uwov5L٫SպȂ>'\O)|^# f}{?fUL&yR>̙;ϻV|лV@y'HA؀   4`U *\ǭ/6_J߇ ٲFVע:Cri=4ADO@ DؿOv\$:Z%L1r&0b}ZyYA "jefڲ<>*b$.n.tbҵC[ə#t_pal:W "6B };R κ[+ۥKE+̜5[L8,zmi}[+gZ]NڴhZTbESaD[Z11.>6\f"2$co(UDj9iOn}תSMf:=}M5Æ8#8eYΘ}©lt-xWӏR4VY4j5"r:lBT)tR* $K%7?aBԩSҮC$uZEM7VgLUt4=:   @03f :B!Ov ]w4kXRHimkg/y7-˧2e4_X=/:GcM/fɜYҥK':ӁqOe2 rMR~AOXkb}Q g c ?s%rO{9j֪-V!矦;DlYY2#m?O=ƽ#g=[6k*n/׬,L?{u,ks3M|Y鹓Bӊ{TX:u5s    $e"6gwbK2"x(4XV0{^*oݶ{^`)_ 'LnkD_ݭqVN|+Wj:eș6n1@%YA}\bU_nz" 7P e;kq̬Wܛc\)j7(Yd9=IꦪeLF .]f+[ pvyҥKkL]=8kktuaH >ҢKJ<LP*li?Lm(Ӿ?VԀwrl[n&W?Z5kwQ-5kdѩ//Ge͛٧~oߩc z&W@#޴yj4ر]RfM},ϾQQK3smu/*|R([DcD9'V_S@ɓv2Dy:ܯ͑}pQeoer @8 D ɽ׫#/=~qN޽z}r~8p=e(=؀   Dqom iB- SX=麿kn3=… YF\+I̠1CF0 ;z AիI>{{Pj "jE !j蚺,_R_ADݮ_dSaQ@ J;x~ٱ-Ul;\kXR偆}$ bl#}9C-&oPΣu_edv7XwZ/ /:}ua;7:4XFgݽPn|Td`Ͻ{Yy{| H{_]kl?꒏>!czlj8Z&^m5M}*@IDATSD'`# !,@1Voo3O*WqECC@@@ +xsZ3Go  ){~tjF 9<̦2IFJ閵i@ac733T.\ ZqرWYVbElQD5kS91bX-kQ%MR:VzԀbƌFU 54D6?8.۶sYEYʔ.Ts{c<3mi1ܯ_;v촦T9KŜ0kw]5M6۷_._lM\x(!GwQHlvz:U˗[>gm:  @(}oc?&v\r#3fv؆c8i >"GxBBAh;8?t{?}9Т1 O>L69r-͜u¸ߊlse7o}7o6wuدwWN 4i fy}_K(.*4e=-RQF\~lQKtv۰q5S3g:k;aB"X)Xn vl,?UR7={ք0[@R"fˑSJ.ܚVB$p8 ˆ7ǎ8}qAuqkC!>^VǸny =شR%!9|5ݱAv%O=5Mw=eW.)7}T0gYa2˯;:Eg#uOq |΀W4\')6ߦz7eO=viч{Z:m~hPN|S.<||i*~7n /<+V@~ɻ(^LKn3%c*}}, AP{b\/    [ XADSh7VT-t^JXU yT;xԦcM+W[Nl7wx*>$ZVFP>"\ *6߭Jk+K…Uh ~Y ]{hZQ>jӠ傅e%JXvƫ&w{ "ƶqXF+ԃr給 -+u9zg0[[d* }kjԬZa b4su2ouw2%G-?ZQnesqv-YHBEuHM+7kJh.lO6.r GNofVlٹk9sV , Eʜ/4 H7>*__I_i &ujo^kcTPf;@;aH!@@@@ Y 3hx ۵JٯZ%˝ҥfMػeβD>ǪGH7ui%uԒ!}z\YDwqwdĔq)"W8]'ewJ0SGsm_iFΔ /vܽt_y_U߰A6Zt>u˖)m*Rv_wi D[*ZQ X #BdBT7(^*/4l]c^@ C0osۣׯ-U*E㎶3;@@     !(AD7Cƌ$o?^ɖ-3qr6Sֈ=Ftˋ.b8_޼RXQɜ%@wltAٿR*.+;vw]mл; f&)RZy/~iĮؠ^]b h[bUZ{jwQnԠ)̫=} @( #~9"}yX{NLS3_c<.*V"v@@P jOE@@@p $t}.j*fvP$v 7loz@@%2y柵XADwPe%|ib$s)"~3֤qCS}2D :[Lky% &j 4(\oKw_@DFLU=B]4XISdȰ]~_1~/ wD # .@1ԟ ׏   $okDTi iPMKֶqfٰqCz{EV+Ww rA9s\pѪ*UJVj  bR%\ٲZOCi{)z=E>i3~nFjekdmֲ?v}5aĜ9rHΜٝرc2"{W@ Dԛ#ؿOv-tB"@@ G@@@@0%KYv;wFZf ɕ+g=%+Ӧόv jOyzw1rsZ /7dtO+D~6$f]pŪUL쫹QCVRE)V|QYhãB`3Rٲe&i/t]1" ޝw/9 -!yw6!Dk @ s @@۰@@@@ #>}Z~cn7ެicI6G!jUDm-74iXvDk" IiD+mzt׭ l:J)+fmK1c ҸaCg%;wvŋI Uw/15dU ԋҩ7ߺ>?սYefmjK\f-*XPP?Cκ.hJƌ SIm%DèTDiO!ĕ+WK2$sfw1]RV3`3TEԨb^_8//u*eFa \ ԃz yS݁|_׼r~ٷ75OdQs  @ 4 W    @ʔ.%ŋ j2ۼel۶nkPEt g۩ӧ̱;dΨSTqe˔bEJϝ;'\\ZiyKs+@A?s5L7QNǫ ZJ$k&ugdݺ N%D{UM^I2QB%}NuCs{eƈ*>65PX f=q{Q9x9sV7lL"x9S]"jů;wY_!Hv@@8}@ "&-##  @1$    $Y`jQdzMH/er9ke96MCoZ]jYo, LRt/2d0g0A!UOÚ2f4Ay>Ƅvk˳կڴib D޶ 4%{@ BCl䰩h@C@@@ T**u& 5idu6erT@ne˔*v Μ5ۻh " A`2/@11w $ip "-V\ZLݒÏ>niI''O>$V2QZ(S5د4S be..^7=>yժ7Io9|Dl$׭{L|v)U\6ѐ3S GJ 7iS'sje˕{aٷo~ +Iy4Je}a:ٽ+V>`#   @XD xMnYֿ4dy9zUR+++VLٜߙy޽b*F/ ;@ $3s  @R Vret,vөX?^k&3]N^c3|aɜ%:}J>1ٞP +U-ZYWXλڛD-a]8vRfm+}sɸ_ɱcǼwkvڊ͉볊p#PF-[~9#g_B,,UZZ6ơ=*_~G?vslqI;~; @@@ "3)\H\'xC=lNL[uA`j2C bx%  d%XzMנ|L2k8Ut?J^Simǎ2yήP "ɓWڵ(ҧs_^FRF ߅ 筩3i̴5ԩ ":䉾u!dBYxQ^SZN1C2=uz17iPX?rhETWϝ%!    &]il2.m俙ϥְYn={ֽ+2A($l@ D "&C!L"&m" IU \-o]ʕ`1tǃ\B!nVénxI::[ro6?Yls 77V֏t9@1harH[ZJ˗d+}/{RE3˞ݻT)Sݝ:KZ-̚i-   @ D gwV`ɜ)5Uά3&xxa9ut@&@ a$cs  @R b6md>v:kLſsq ,DPT|}ʦ O<._.=.S3?YX .Z8_-. Ӵy |}&;L\>qs(}٠1ҁuٲʿW9Uy#r.o2xΜ%MԲ<@V%̖-{yMVgyO;HѢ칳2rЀ~ɖ#qc{ 2*Wdؐgbv=t2   @D gnWJ1ܞ(@ W@(D 5" a,AD 3.\ĩJwΟ7S 8ծSTIҺ]o:04%J$srA՗֘GLAĦor+Zܶlk[gk!srݝ%K,ν77S!-ZY櫀fD<{0n9rHo=J^T纪ŬYzhۻwuJ*-oieRHqu*ݳV2eI%Du>#i@孭%w:9{挙zߨtSuk(ΰlu[k)R;߫e9}Y@@@ *?X@x$ADA~x\:  Dй(1 VCVrsz]u }6j99JGLUرg8} "k0۷ɤ]P!i۾$iVKmwiٶ+QZְewrvݱ,T ~:(}mg€:nAuk@Am˗ {jnV(zfv%ͿZe??;w!{vﳦ;g^Gz<-Uu?6n a4UM^7_VfLj-q=y3dhCÿӦNm   IT b}0"&-"S#C%˞<}ms(vi!mzH?ub@] ԃZu0 61#:Xm?e^2t] 8u^ҩZ-Z km*hMӬٽKnLbDl`*xS5SO3dΝVFJSMۏ˶m[e겆1DŽ0UU^G- na}L > 7=mZqݻ}.kޏ=.Vۺu,]ЄjK2e+"I+0qǎՐ r`D@Ѿ\sK{۲iL<[ZUʛAE[Î~+$XH3y/k9?z?AU+WH:S}nRXa J"U(-[fZoʗL|s潙9w}H\:=sM}gsl]V6\l3Nt v_Qթm[HqfNQ}.sItp{CjO 7Kagw tt]}t9y+xoz8j/?[W&͚[fZQZU   C9UD ǧ=!t"&g *CIq X~45ge]ʔ*c!aN:-v5䦕R%&@ B=h?mJҥ ⇃؛KCԶd"@__I:5{qtJ]a3=W,YY“gW+ Thk]Ge瑕u:wש(AzI5kؿoUuZqaWMޡAW7[ok#eʕT NRF-k:uΜ9S2mJDCC=Tf͜.P6Y+ m[f ΝÆXZN׭;@A;۵WZe OjR^.Z0ߣkwS)3=C2ZuoJ bq3iny/ׇz=b]2G'+1B ܱcL?Q7yR@ZɓdMv+<Զx(OxwZ:t" &-Qy?Ա͜>ݚZ@@@$/@1?@ah1A$BJ bH=..V"&7'%˭mjһ@@ I $ bL ɛϪч "Ժ:Ůs*9]]@a^s-o]ʕ@SQ@) "*(* RR%Ky{3;5.oα{|3aʸ#0Dt \/MŻ;wJwd`}u*=jÇy7y^70d&]tҳW_e2oovLSP4Уzo FxjMq߅ ڃbGmSFSR>|ONnh#i]p6 ٸ j[cm8hZJS`.p_gjA`^?)ZСQ"}u;ؾݼfP.{v6L>1\WI[`ٚhPqp9qTR͆K3yk{[xLihp @@@ q ,X@RHo# `;{voՂqq2aζ;]/[&ީlr $A=:o&V쓾=\ Ҡa#;y[36el۶ݟ@@@h 3G(#D@ _Aw(^r!&O>d b?l }<+Yahϙ2dH/!unYzE;ÝeɲeٿgJu [f :,yw1i6S/^_AglٶC 'j$?6zo߸ "[Yb3w7 McOؑZת;)>V4m$\;zgٷ۲f,wԫ-˗޷l_ɝV'L9n>w&m[wCҹ*W=KnYäީD"@ؾ8YN_u>@W=y@ $ b}S>vڹC SOPW *"֪}\{ 4_Dx$. /m#kM\N]ƛ2Vh~޷omu?6"b;{}ҭyc&O8T yj{f~e77Yb~MjH"{A:Ӭd8A_ _{w1]; 0 2ec Vi2u$;ñ::ݼj@ӴSdAC)+5L͛Lpb1~E7m 1FTQ {=s,=j] _+r|xTl)n vH}g^ٲf_}w*eKp6E\UW?`י^c*}:uǟ|UG).2NVh7wC@g )wr6{U;[cnr|lFus͠z/I?]ή˙#2ICO]9o_6Ab|E+$?ф](??Ӱ@W 9~d.g@@;\ EMUvuh8&ZVviOM@ݽ":i`m8y[OXTf:+ppwi+f1_9'+v]7PߴIbc5$y_v]`QWkSɦlUR~' ;׿TZnJͤ\vS̍[*Ub9AD]p\S%ek b&ͤ|>=J:x4i~- ?]9mN_m bդp1'L+F#W}`S;Ӻi]W_UJ'pJV" F Qۊz@ަwpZYv ={Ξ}-|R '8^**c+'OMv5I}k~Z7wE6㽞Vkrg}eΫLE֬dϜ935`ADgʕ k[k Mu/'O@֢O 053N{?"ZAЙ^~[ Qylvx?O3BD6̯ };GU`H.Ԡ-v,8>h[H}yC59~L6+nNRt:}F&NfC>ԿhO9- D(={\қwg3g.nLZ3JJzvc{]Ght7-Ϝ>m[ +0Μ9).5j$խgϯw}ti~Hogzτ զ-[Kɒ/,^P̟wz7(o`gru ``AD'v3f$v풯<չ] Ν_{g26Q}wlBvH®#2dytJ/ j;a p6AD\7쇗Fm 87y$?N)~om7cУwב˿UtDlT6ia3{'ng_! '+u?m<_v[oشE8ڞXBݼohP7F7?@kϽ?;^i}TBY»o58pHJ/"Lkpgs9xE@j!~\lƍ2HҘN1 "ުxoâ:Kbu7X&ܭG/ɘ6۵k̘6Ut|w4mQEQT S}NǮ-[a-mVw꤁G?fGY̆/]$7R۴BVfSg׭]c*'MŋDӖmwpufuMM劁ZyqߛGE_tjhϯ~ɲ{nk^ɚ-{mo1W.{}{l&ZNL {n-[vy 4N)YդKnӄ@ A~WQ/ݳO_ImM0-H%VܣF^ z+fK,%bbؙ0)o4j0ӧ˪/SS絅f?s\Μ9umcbB@@@@%s)D+ހRBz"~ RNqw[5x t@S0 mL '?'O3/V*/ݺ> 7pU{߮h* rqZ\kw`T3O; z~Ѳqp\Sg^x*@aπ@^yL%ß^~ 7xl}8aF`ݏ?Eudsy2Y4ް8idܨދΘ-ZQ:W@ЊŊmouj^ @+TMP;o PzuVNCA/_Tefߝ3dŒM uoЈƥ2eJ<Ἤ_6A ?sJ>#@@@@@@P OhGce݆Ͷƈ7^ :eQ&m=E*^nPAoYZ;X?o*"bZ[M;n/sd_BBYIMf͜azs vf/ lP<u'm-u*[TRGrr+gvZU?Vvڊ7ը.]*:  "܂b1K@]>dqa!{*EmgL*֮͵jK-ӶY#fL      *@1D',[dG!= N_}7E/ˮBW*XpAyoa7h]_BYP';?MSq^ɘ! }pǍr>T[SVD[Ge`ռ*iǽڴDVOdU([Jz=zT>+V1ׯ9ӦM#o?AD@k x hnUJ*m,PtV1.nBJrM^v{i#gN)Xϐ٘Qq^3.s"     ĽAĸ7+۸YFk-WyΛju6.H`(,&ADm;W`$ t=nvVLʉ:=^]g%Sv^\tIz]΄uDԶ}{Նd$C^z33Y鿭TK|v5Oce+CS.xEtY댶}/Ifs?ko2ڵlf ރXlaЗM_N, -˯Tk;2 @)0@IDATAPX(t}Xr}2u$w9Tg4m!e˗pxPeLYrE@@@@@@ y D .!V1s_lYMm|4K9y7ܧ+``fwJ>_&GsOt7}<+Ѫw:=Q)^-zV~q]9eZ10e,Z!}zʍ4s<ОNys&lwc+UB%rZC뼆.{}.?J/*z=lU+Z57aLu2zr9d'oEkuڸy|ӥ(K,f7 Z涁N6  >A)/h態{אh>b-@5hmʄ @T"FE}@H…eǶE20l;ƢEmuJ$Mr%}{ٳgͽ0P@@@@@@ Qd#EF4.X {mv ">1U/ wM7H6-тs= i1mjhӪa|'WN[O VڛU )EU*-rfwVɈn439h=`Ԫ˕Z7^/ZQ'o)M?µޱk[hNNd bU~!==tҵcks" jcO8lɚUK/AD]q-NS~:ӯn˓;thm.j_5hFNZ s{D"v~܅2y/uifB@j&v@@@@@@@ "9& mU:yN+h $x˖*!Zj^wi9TV59v)SHԩ[Zp7ON;i BbnS1o\/7 s86n" Dh{lB=&u瑣%[,l/ C bx%      $]I۝ "#2o'E&oE- b  כ!      -@1EB5rzwQz"ZpKDi߸ډ b\r^@P O!       D܇Q bRD `@Q bƄ      D] bԭ@@ "*D@@@@@@Q b      AD   *@1A8       c1&  1 =E@@@@@@^ b?F $ks       "&-  Y bb~z@@@@@@!Ȼ@@ A"&(?G@@@@@@b,@1Ƅ@@ &cDZ       @ DLg@@d-@1Y?~n@@@@@@A$@@ 1 DLO#      "y  $A       @"Ƙ  D bL8@@@@@@Hx   "&#      @ " $f1v@@@@@@@@ "@@ \WI{˾ŗ_y p]U8 ~}8@@@@@@ de&Ogφ̘z  p \W,=ޣdב1>'@@ IjE G*KB HLd޽cN1aҔ|1reO?Ntϱtri~wZg>]n{^8@@@@@H0B K[n Jԩ%Ev,/^ǏɌiSe 6P0APx !8EK#3dŶ dFֿ[#sRؐ9]Jyn.)/̛NҥN!M䇿gbt3KMZp9l9pV:#:ss0  $ b_fS'#MDZڿEt 7J}d &Ɣ?_^Q{K.mb~ H:xcL @@@@@@ UGE2Tw O&yiχʠu:j启^ `RPAD#.țMH\tR9{tJ~3{4-O5+23p_=]֙47^]ҹk _W]j\-SZ2`-[dݺ2e4Xə3Խԭs4i|Oƍ#y`3E ;a7e̸/֩C{IW!|_ܖ+T[jh?x0ihՕbEHtleΗC;oD+kF2e:wꑁڷX dEqSK9*U(])+U*2      Kfk/s3pL2ޠ,TH2f}v6L<(K%;vlwLb[A1{] }7gwQNwH^[[eo*=|֭\_,]%2`8qok] {im*Y;xh;iXJMEĨOqWW!hӾr6=us z!,>.3 @Lb8z:slݺYk, 4kX:=/&=zug9dϜMuؐҢySu΂==@VYcWu@gs#׬U'z]:ɀgrW5l<\ov޲/zN4 @Sʗm{F4xi9rzpdzpy2~Az淏.l߱Szz\0!     IDrO6vGg7cF7 HM+T~ 9sƻ*DLG0bB$*ADݯX4nQLc9]Jij*to h~(AJUzΙV\lP1li5砝w^QE2˭e2K̩dӾ0Y,2\m@_rrYTs.V<~L]q̮TFk* ΑF<'kv)}ۜcr[Lv#:݋]UmM>Qh]Pzk-:Ys+&e>tl/@@R":Z}￙o'UI5e4mN眜6b浊㯄 5_E2z'ԩr{m/: .H r v?t{`O>DtWF0s ^C*#Fj@@@@@M;7*YRO7n={n\2,5UO>%Yd9rVKY"AD : Q " 4}2}Ұrг]w%)MA/&kJ*Yٕ?v>'Uk=(_DR>: N\HZ\ >h0e/vAC/R&xɴDcZ"Oyd7U;HwSIpyΤ!r|>?}4Š H8qU/?S!SPFtc@HAD5 3`?|Yl&4sI!\enRVNk2!ɂgR~ƂV3dIK`CZtZJgԄ]2z93M)vɲm C i>|HLA^8yXw 'e}v}˺=av[Ѯ0?Vl;#DtnЩZJq"ҪJFSyRɴ.0 Tjرk5AD]oO/n?m[Cwۯs6㋽gƺW3aQ ;zsC6P+d2"OJexĄ @l $ dߋeLBtދ-i.Br|j|-vtC{+,23ݴb^}yooZWJ_74lmsK _ow]Ve5rc?Ȇs˭7twiZqf^;D|nӏ'HUkrJf@@@@@@GCVz;*i#om(,yFYh_Ġ%•C #&dQIlY+jscv@aw 5tu2/ϔgjZQ]n!ow(d}<|e ;|ЊZNN:ƙO(e'W<,=ܿ高-\DcڐW&; "={V*Ux x) Ф/      @Bxs-}k{.c?5ʽH%]0?~\M6~e2^Aw'6]- rKFy$cZ_2KdACo[Sg/IktL7s!h*4rA8׋٦y婻} =klwtKyW U}e ⫓=Gf;!;_49>Q]1o lpkƧ&qZ̊W6k-{1sʆa'KjS-2_EU;Hb @$ b c͟?WY,:shb!jeʘQn|<~)U ʕ+[F~q>*3(LgB%XbpC o>XDw噈#9g{iUE N _iD"\.3     @դw*/^|%;wD^kͷԖ}̼s1;z?λ:DLG, )!È VJ;Sـ3N}Ֆm"!:5#峋s֞#s6]'6nqs& sM :yw3H& =yOI{S1XSCgz]2j!gW@b$ͷf2Ӵ=#88}\2j9!7_nB9U ,`޺±i 񏹳̺m'dڶwsh5œ|f10|WBwF&o {.89J=w=S[.(8oBr}KWZ>;n CViDve+Uwq_ ~EZ]nپ#|5twf@@@@@@(SݴLR4OU0Wp[Nyv| ⌧JIcw7} ܍jgm7Xe@1 "ڋz~hweu~<2?9ĝVE]A+Jf[[YNń @l$ ѣGeoE!L{痔S%; #rQ4i|ֿmp%~TV},N;cmͬaFN<)ռǙɟ/I.zrAGs5uc>!C}AC=O# W_+/̚6Y+残J/ ߔ] >P7Yp{n~p`/_񏴹 "ꊡo?!ѹgJ֬YK7ۙA@@@@@BEHѢҲu;B f̐U+W\QS֫o6ͣ> DL,k/~Bf_a^B]:eiޕ;Щ{ ~۽ )!u%co0O[Wzn; ⟦ݦ"a) H|!Fni…1RrCq_OM 3!m #rEPY5>eqiVt^{5-/ߛ߮_B{pH@&D|ɧdb>.xUk‰lаKnI>U0bOһgwWjnPNCw =?w>^C|D }»qq{ӮNE;vLJ(.2WnO_|3Ν ӵ~~;\^ЀfJWl?g]d}"z`,6ED+,jIG'ݡÇ~û0f``~hx2UT/:}x?1*@@@@@@` AѵX @DI!ѽ%aD{͛{-\}{2i*[QWnsׇe&ߗ~e*XгӢf:~-}ZheHg5z9 osc}E^@@@@@@(Pty gϟw,JɒEV-`Z6I׍|ؿY(_ "cܺtk־N;戆Pa"~paiwSv{z@z4m絵s7}o1܍%3ʴ%Қǫ|Urtk3~<ݱD:kD%I:4lX(X5JdO\47? S劐9$O˽3 D bLbXoQʕn4nr 8`|Z 1ؤǿ0S[R_ ~.hI+*v!-n?x|큻]Β6 dMk'|C]\dAĆk/?/UTv+8;vVKAl+_|9]af4+/-nrhLWmf1#Lw5/[[qSAqiuQ:(D1*WJ90JgSvvL2{Y­Vg_2Oai1sbp9ɞї2^i0\pÀ/G\5hNۛesuF+6ܿkIx)mI*6V>flo{5o}dZ2U5{Lό  1ыc09T1Gv2KK…$}tc.-*Fv*+I,Ydu2'ObGdǖ+[Fre}W;AIӕX͝X?~,hh)LjUۯp "LkXh9gӞU"     IR UTRLɕ;dHj8(;o7 aDj}7gm}IE.N*Z U1nC~'C} tld,*9#rT~36.qM2~pvxf@AĘ r|r,x-zS}Q2fܕ`ⵜc@@@@@@AuqD")/=s'.Ȝ';f[J*ʉz/]?&7jE~NuD:a V|TZdB@ "ƶ(KqD2m̤!     ĢAXT 1|@aSdՑ5wT6u u|_԰_iQ|y9`{4i ˝Ve3iHO^WtZe2z2U ⲭr@vnǑS gΜRBy{'O˖]Vr&,Losh       h"&GrR(G;MUT%L|wň@@ c*       @ DLX$ڦxlnK(uKe$ " "&-       @ !%_~zk~۽JRvyN?d˚{(sYEBM䕾>O,NR>1v:@@@@@N9sI$S,xiBwkq%r(]U+(4[0b8@VDer\\ntRqE4Ziֲc8˞-XNMV֬['zj{ l۸V'On12f'Q Qy7'(p;aZڵk>]:fYi*~,>KdspA@@@@ԓ%yY>_7h0-' Dd9r)p`Oʔ)U.cU+kD *pNٰWY#iui5|h̨6Qqy7<䛩˙3g̅Zb…iǤc$QDcτ&2]c.ؒee?JB |m->Yg@@@@@hIɗ3+׭uF_CIX E9UAa}\@@\ "*q:Yfpw5^]D\|t-׫S[>n*S {i+a*ժY]NYv7O\Rnm| b$2^*YR_}O3g996_4TNMɕ3*>}F[Μ-ϧAʕ*H%Gri9p̙Kt9rHz8y͛2cl_PAXY|L]MC^kהB Ƚ.Y={9_ eiަϘe=dƮΞ=+p_}})g]ǥ oܒ&m+pvV9*?L.OM*W㽋hRKcD]6} "{TJ+"hoY oޟ{ɖdŪ_}owFujTF{oۦk:}Jsi'O{ʯVesjodʔ,o{I]߹zb ,⡾[=Ž:Ms/t[e#|}gj%>7nܔϿJ{`ڕNqҺm<3fVQ{*yzv@@@@@^G6ٲE $U\ϿIE$0aBQ̕KRHin+rƚyo:t|GF1PQ}]ˆ  b~FΝEY!v1 p ^aC8Wc*>;k搡2ig]~[y~O[Iv 81w菥{NtKLG}$kKpp|dywaE:ul/OMky3f -?{Pv{Imm쎪U*ɐ7@pcC~M+ͱ#GJN„>x<Ҡ^o=V&X0fW[8w[y& Md4_s/o; 6 IM݇e 2v5L TGߓ sv_/+$S c"p4L6iҹngwuvE?¸-kW-uγ=^j{~}EÏvw+2֮eNK +U*WVvpb)fKVN}B?!sfNi̱=_|Ʉp_[m_?0^*U(ҝ?g ;Rx18w(d@@@@@LQB4mao_7re_ b > !C$hK qI .sb+s %3ʍOc"D8se& V;?V(zNVr*k/:@4s:},|4rI^ "VMd$HBJ]:Vϴ`!_LZ׹kACwmwr|.juC MÄbULkwܱs4~EmD~ЭϋKφY?5[Lo&|!ѦO2AvmZK>PGA;!z46S4`3\;Un|TZݾi$K羿~̲V=L$Y_IMĻeXF@@@@K 2AN]{HJﳵ]rYY3)] d|:ɐ!)0rb`["Az;hN/_)WR%O(Cz o?s\ȧ 'ul$;^ WnHɤXdR>*#7BkApH.x3"!OL+W.7$bH n,Fѿ킈 ZtA@V/id+5kC%iw+ޮ:93P߿*M .Je!OhN1kQo{)su Yf^&G(Μ9SMNOkټeܸqC}Uq$}q e-XLgܴIc'F+?|> i@L4ZگM]0veRں`}uٝP{KfUeWq:]MϘWrNMoݶ]Bo|YSR֪yiiݭ\NuȷfO4q69553OUeEXS]f^=1hɧ> oj`i*k*捛6NmW#~wm6]JQ軩] jt—͘f8ՙ"lb?vI&)uPP/]9D+ޮuQzӎ=}g@@@@@h1y*MCcG)QDRZ5Yl\q=p| b*hN /ٗ.eBy gr2ܛ%}b`yhsJSʏ=%c*]' dM brygd5> /")D2  "_zgϞY3SBpBy}uJnkw"=zLFkƢj}Y)+EgܹZzNV-t pkA15g~ft+@eYI=X31-lf&LAvj_ٳeK<ڡsX]/==;ȥǕ_}s?p+Wn Dz8o؃}V 𛶭8tM&f6X_:ok#3{S>||N?Vt*iml2䜙?J6vg( z_~]Jlwq5ʹNkӾE ۫"Eyf =uTZO Tt7:ƪAGCt߶lc\5Hi7~W^hoGEKK̺ӕNl("ݮӠ O:D7jhN n{kji;"Ns)[\zUxas=uS/]fMx* jVGLm߃H2pNXa@@@@@h1S,߻?kn̙32OctuhTC '?_bNH&u*_wb:Xdn4*]ken޶a%i292KڙÜ# bwYE-T+|>h2pg5/"I "FĊ}@n/׃ dULw[Q0wvoVkʝAD{ZW{ eJ)WʆE+EiEǴiHƌ{N&\jW6CVLԦ*T"Oo;}b /^d# /حsBnksO)׮[o*:j_xbdmZ-[ICFWh>yADwhRO|ҽK'\N1˪YLӯ+;ҩD*FX] $M% ྜ0TveݿUEQ܁C6UGc"hۻC?N,ŋ=hoWI Cߒy UjE457957|'fKdԈfh{CoWD@@@@0^}r?ʺ5cvǷ.AEj)? -i$Ұ^ d-ˆ-nK<(JTX0[4T}:qtCYS=~U 3T(s[,,ѡjFyi0{LJ R=rjIdplR`*+pS /wLӬ@%oP­/ˤ_ l]gʚ}XD$": @zCxOn !"DԊ_*dAD_!<"D`k ת+YANHLA% H\fڷ-ܻrٟ ^q/سU-[HO6l S(ǖ/WV&Y"~4] s>WICU}VD[O9x;L;Fۃ, XFuho_<h0ON׬; e+UAD rjSi[xd󣻪eehϔ H t,iΡ_2LZmZf?]:rẍ́?&I"% @@@@@ p"D|i3lNKϟ˗Ȟݻ$͏ӯ:glҰnBz@Tz8ұ͓wszΞ,9Oc#ʉR% _T;"zfnWYə!}hc&w#OU0 {R=eK-_vf:@@\ "^8+W.7E:n !*;,,5v%sH˂f%:;u+V٧6u "jqrC_N"u3V{3^{p4$ݞmF^nOq]R%':sImP{A߅N#l75u{B0TyADU1ݼ+ADo1-k.KL2VkhU:L{ /:nHU}3aSX)s}T:>Kmϵo'/~,._dfOJj]j)>TխLCXU΁-TZEF[% W_#~{W@@@@@L 2ADHܷ{?k[&͏DL(0AD~Ty[HQ?w<\~ӜneR [RS)/Y&yBk7j~R$`+Lw Yttdt2E$ $UO[x5vE9r&XI. N!vު \<:6ۭ`U>G/Kќ%#2c1O'N4'6xY'hES˻UQo Ve! ]q1 [O貊$oIfO,;#7NBTwqԲ5X =27j<ԽAD_֯^.ylmҬg:kؑ:%:c6\vlkV\[+u߽PS3Wug`^K+i{Ol bzudÜ3.Y\~3Y^Р_uCĞ[wXOksON"j%LnSw߃o$͞xܜҮpzu<={J^/Y wH;~??t' _©J:bXk*n_z4ܾ_M!C;}     & }{2eb%KE%egܻGf4- ? "Fcj(0Pdu%#9UNcW;L_ efחc]?hCvNV?_f Xl"iK9({N\ 5m?|*4))MzO9"5X2ѪݪOvbDnay]޿c2l()]|~.vSu}=&_7rO "3뤌X੆t!YG@/D9׳\{!!5w{Z!j0aRp!:uN;S>lG "zWd^O-^j}Əڧ1Sj:mQ "t#?x9|+oRgm7P.pEt&5DX\0SzO/ Üe䓏GKʔ)͹u%AD=]1Pչt dfҗ> <9V7 #O "| 3Eʘ1L?F|~~b$y]O:N=ͻk7ms.*ԐyMSX#~4]yAPV+WIjUC)Sew {wVJuOP銏AAT0:4+뙶n̓2j^exahgm>/??l+L)?'ꂇN_9kU P[4x^OD4/A[SD=qUޙ}RκêZA}z^SIIdþ Yk)wZADzM)' O*>>ƟO:5-󜭞 b?cN[/9mNӰD=5x@q!5[vDO˻WQG, EBy}u*LĻnD1z~߱SkܙӜZpb:8՗MkOPOAִIBt;~Y 5…6m촣GIڡZo^o]#.hYV3 зFpkq_rE'wTgE wpRϥ Yqv4hĬÂ[m'le|jq>$I\*~ׂ{jgխJ*V~dYfS-QvccZ {=w];Ð˗/:m09{VjZdItft.]-VmۺE.^`VG?T8 ˖.f>pt4,toS'Ah~l-x`yxgb2Yp!gvOu=={Zf""C%AD`첪jл |v ]1;.SnP"bxS?/qAZYVjݟڄJ{Pq1̑ߛR>KX#LX1{4!u@[ -0nhm\ -[Қ|Tκ{]lܨrɘ!ϑG/'IR%ˤSמfR%':(;˭ߌT 4y9d{b> *ŋ=h* j9?xΜ5G.9UNTzc}ԋjWZ-  /AV5G6l杆gUj%=>+}{5 = 4ȹߚNx@Ѫt/<+ H+2%>Ϛ@׽_:3V|f.Y\F';v4*7S;5k (}2KdI޷݁@:nܧ s/ݟ-Zڶi%mN>#SQ>{:ȎQ2eT1:6v8WРk)V#}v;w_pp*Bznno>Q;baƤ'cY5Hgljκ{a5Bm{3k_@@@@@bWK7+"mp/m'>6)p`\9/ww@.D ykʴٿ,1iXIE:wrր[!n~@ϳ{\پ^ yO잖rdDgdx8_9k7x+vB/V^ KJrlDQg7w1Z9)͊I._9> =>*~;gѯaynHF.3.&Mi ĄAĘP90n9wx#%:ힽ{#TYUXix*G&4e_MCGC}Aޮaқ wE~ѵ˕3 |;~'j]֦[.W.k C#]Ծh"(aB9p`;9V}RZcrj_x , ggw>&Vv@~NK^,)3Z!K ;.|"     & J̙%Eri9lӁ]эFѭ 1 ݰb $Q:U?     @ D6Jω 5,}|RPOvb۠ bj[:|/!W*ڶ )(YD~:垓wk=S?7*V>iK5D@ c,7_7AAA2 f      ,@1Aݡ& JwʏEO .MTҢI2m|gߎmtY K•r⮡=%w IT NM[-9m=ҹF0;{H@؈)c:U]Sup|~WvyBT> `)!D? @DVN      1L&MD֭0)䪦ͬ:U*i탈B=\"rD|Ŋ#|L\">Z2|.WۤY&o s 혵tS1SDۅb:xo?$M3M_ÊH$VGsOwo7մSHG MN+ k8@G ?z      ľAh~&/T0Nͼlgjjn?5w1i+X/bLjrt&k./sumZfeәe/]FytD !ReOF=g:GCOkO]vڀY[ʉ1Dl2vdJfs_=!BooV#㖞*S 3eC!n\P4IC@ "ƴ0G@@@@@@bV b F5ѡtQAD=g_'i$>}nH!+$h"9II\ɥFϔUY3ZEo?|Y&\~S7)dKLW$O2y2&~d2惗ݟ'Bl6.m+{?x}㽃ڧÄ2{yxq! ĸA'       @ D!ޘ #މDqܒ2hߎxbˎyu_ q5~PAD=QoVV-M2G>)f-z@V o7t/㢴{Yo^.lYXf'YΒjXA11Fˉ@@@@@@@;"@1;xBJ`~t0: ܗ%Rܐ/T8B>){_[`y{Ia9*NuOԅૻ9N%S\# z& 7[ eU!0E+ժOvb$QkgUNR2o ݪsKwPU%̐DFX*šx/y䲤JPtyZU'G?: DA|        F!Ę"qWK2Z8—n4x5dOXZjzVhkjtЙ簾S0noqT*|0w2)=-yu3-wb#  @1й$       3SF !DybYaS?_G@x$@1=ln@@@@@@A;XÈQl$Ia)cwM9z|LX~\;QB=IcI. ~ D􋏃@@@@@@@X xa@ !*m{MYSL.@@  D[G@@@@@@8!@?F #_J.\+NJ֨0+9`;lVXQh'  y @@@@@@@ -})7KiLC@\],"#)@IDAT      (@1CF@Aĸ4@@@@@@S@@H ]0        Q@@@ } @@@@@@ 5@@        @@ D Ơ@@#@1YD@Sq!her;u\;l$Iz|/j`g𐡲vowǽK qǣFNWd5z .|9aTP mdϖUv~\͛ް#8̫]>9:̭zKb@SgNZ*e0hzCL0N~tux4n0Y4J}Y>V@@@@@,`Rn}I Aۼq̝=Svf[| _4 ܥq!ثreYrlݼ.ÊhQ]z4 bg#dg;Pt)y[6MZYntb큸mZI<G#Șqx;m;Vιh/|Py.\ %V s7D|UKyO/I,Y:w_Il[S&@;WPcaH@@@@@8,*UjعB<|>tPs;T #QDF1|  D?&͑ӧN]|ư;ӕtRL!w3d5={=/>D$|tinn k#I1< K_ڇTܱs|TѪv˘1ء-2%ˤsnQ /ĉ}W%eZD@@@@hȣRf%ι;J dζ@1>=m@ ZQ_ɚ5%8ӝ|AeWJB]^wCMP yZ%JheB9tHkլ.ޓm}Y,ɝKխm_!_L$'իUR%Ko~i04EJ:5%WԲ3r?|:ʕ*H%Gri9p̙K?OBg4K- k3g… J+WdVvM)Tk ݳOپw8UP6},!3vvYk=W_ۗg7wnI69sV9*?L.OfC}Esz¥r:&7yH, rqYt7ή^Ǖ5k9zk,XgO=*ZHN'N3t xG%S&_^l{ݎ'gm?3=-[oС0ZA@{b@cq1h?sVXfyVlg .<۱X̝Ra!CÄt~[yf䛷lf-[e 1,뗑?];9д7\$d=v>5TV _~5YA=wNKR+ݮ^&_[wYR-Ժ])o^ұ}[g[K8˺!oi_x_{E4MCzs>ǑGCn}njx4[wR _~%:ʹp,ɗ/٤>;ig."E Ͻ?M=ߣ$M{T*3flj\ {BUӽvR<+(ޡv߯ms?Ӿsz 0E/?4|ݴ^=o>{}ώ-NרD?4Ԡ˯ʤ/>uvٸi<*$tݚ0~>/5nP"j~vlynʻφUZA,fxMK4S[ j4a&xY eKܩH#L:Y{: u]شnNixB՚ͳVtrҪ;uD8      'Nb.fK"ɛgǯC雋HqO{~:>.U "j5XVV} שP˯i?tvsN #c}"DRLdS%MVeQgsDǫh3#}@S ŗ9y7WGF|m;اWOuBמL"3$#R.;vҫO?ʥ $[VOUeW }M&E%h#O`]Tm~6;8aflϞic[`>3(5ɓ'{,kqг9%JH*U&-7 A;48{zZ4iiXa(q ܭ%gϞY3ikz@n%SrD7:AģGɈўi\vZRٵ`zmwhG#35wH߭VSV-t p3po |͙nX+inq:MjŪ1-lf&LAvֵYM_u ҭXYji^{ ڝFMBו_YS&LPO#gΞrewi}*׶}'Yz9v53ݰqh>OmgL%u_nW✮O)]JE6fjRʕ+2!fs֩?N߭Nv'=!oI4JmYׅ "zO?Bnҭs! AD\hۗƋN-l7;$?ZSt|`!U?}w .HɲjoO ;lֻo5j?sm~6̝9M /'[*WcnEPJ4(HB0ks'|پi Ʈmj9N׮[STTc֦SW,{!-:    JUIٲ2w,iڼɛvqRv}Xn͔7ϿdʔEڴ]3gdY6wBIі@@|"^.7իVo2m!D>po}U̘5:jMmv)*bdZ2Zѻwd•zX|es?j8mAAARJM'}pء$kZV͟ 4f7 i>7FUS^;]1g.ңkgT}wA+{ gɞ#$O\.^ |;";o! O} ,?LvO:-t YI4SkrW/҅'{p'->,̰{-yNuş ݡMF5M6}/TKb$1j_ ~d2=T3AğΓzޕ ?w12?}GQ{zGD)"" Rņŋ b"QT(U:R7%P2즒d7&3g̜υVL7m"[BV8Q ~?lԮZiY t?]K6ڽGh Z8{!2]G@@@@R`vD HBOɉwnɕscGE(RaƇf u;gם~OыSP!Dk- # @ bq[K 3SevI'\8_n|9 Ye_%MuYZ-D6jys͜6r{[!8IÆ+W͛^hV.dv=K*iG,y"/ ":}zܞ!DV5k$h=@}FRXF:kKs}Vn5'QQ/o^zU'iTy L`{imtAu(LR}pwzܵ[4kmhVtw{"S}@@@@t]F+!v:dɓ'7WIfwobwةPԬZFiaPuH 5ԻFl4pl8j=2}FHg1kvrc0yՊɔ zw}'IqG\RA|Rv!nJeoI"0 [V!R lܰ^VK1A!̠a,QB#!D.A3sMVOvl^oQ2ɒ1cvWRr֥ Q#UϳBmҩsΠP`7ݪͺn/ut $ED:*opyoe7oj.-'DJ}¼~ҧߧ3w]ʏIC,@d*օj~ si\3y&VwtN^w~n jvmϘ` Z6o*=g3>,􈑣͹[4{ھ^w "9{V2@wRV%M6Jz.DԾZ-6zϿc뮹s)f]>R8iI_Ǻ I1>[h&|׬/l.B M?zNi`tXMwϱu"6KD    IQm$o>W4j5jՖ2Y+ӦNVPإQx,+cu#D1'"!ċ.yAmɘvȆ0bɖW"{t6׫q.Z׵TTqlg4|м9z9") bOFD[Y2ϏFOF1rdl1u< w$A\ȉw޾90/],]ry%\BǟP-W! 3 uvy3gϘ*ŊvW}!h.4tj*0vpH+kK32eʨcRclݸ^:Z> $FDԾ_ 'O7~ʺzMn׶ڿ$nq "z'^{+^%nztF"k0=CVgFm;~ڽGɝ[!0<2|d˚ռFhPudʕdQyvm2g޽V-Dw]1t~ncT](yh8}<\v.L["[YϽѽYCCCJ}5 >w͐|G゚ȏ~fѥ|dʘQ3Ǐacq \kTۭ?g慎/o˜׮y5F1:!    @ ܛl3ϕ-7}eK BǎӧN &[axĒ ՄNtFO<)9ot־DL4e\|ټkTɆ%{?xq*<]|YPaD />v5cvAD]8Od_!{ɦáni Hb4[/In/&ZpIR"^ 3|[N_ 7loRxz qSn$l.ӬK(o_Bҥr4G&˘egVjZٍPi6 O_O8!]ʨ\,1; W 5=È:&!8c "j0MCzS;?fuԒ.3]f6]:ײ"X>5Bx9&k3K:s{߯\b=f Jԫj?t [ "?!0ƌ`V ^شFeG36[2w}e؈AKHk][uVvϭ/dvVdTioph>#Sh 1s2BpfU< ohD5\yILs6Ѿ3fޜ7Ҡzfr6ZP:7 5i~;8N-xkO+(TׄWmW?EHш @\"E{XaD}//- *XP4K']\{hQɦώ:ZT*rٲf1&>|y1ǂ3gJj}Z:d|*'H5dzVEǮJO]2%,^,:lJ ЪSAVǯ-!+*efޞtEZ5XH_]<ʮ;?+) ; +[ kfMsKD}DîjeC{|L&}l(hs("ݼFâ?|"zs _zIS=gtU/|tAĄ~yNZ5bi2?s䍷߳w gvxyR]22]ZfC@@@@@ "&|R "QeySY゙%WU ioRfA;!Tw ɡ3ԭgFv%©GY^lЊ?_KlG'{O^=_H:;TAd|'dk+|[Uu[Y}Q9O), VZԊϟNS   !@1!D%UV-[h/wKIa 3hKhh4k\.>I~֮)#r4 IpqcIòoYzMR]@@@@@|P bOJR "6怱 ᐶyC?qR,8e y$|=gn(G6-$VPv. P]Gn2 rΊIKqc)NJQc=ǯɧNY2;+ʻ[Rd4YdI% :%4nZ5pQ1Dn~˨H@ 9y!L.<-[nU4>zo],tW#$&WY126zv8ƨXD}M8bWxjAvGv@A8qJ@Xf_ }^b9VND ?%a]     NNOjAģ¤rvHML nΐ`T3;e9Ի/= %ێ8d\#k>g8mO(:k6kP;03HyO\ҹvv!Z2'Pno?Sy<D ߆i>tȵ5<}GZ}rKF`s+r5,'%Y5Nns/yB^ ݴb;男~;y}@J bT2#(VYAOr,8ث+U Һ~alr̙X~W_s̪I?ON2aX#@@@@@ ;]ggy2FϹWvj6y.\YR b JNڡ<^S%9Æ?:'ot\.s͞Jg1vIV- qЃxWV.$_'9w]!_>)#G)f)oW@"FB       ?xDx͓̚ kK c=>3|ܲg~@R&6q9aTsyf̭dAmZ4ݒēᛷ%?n檮vN+.jŨWnU:j"JݜAY"rdwܟ?{}6L]w޼,Fī2 U 7 ؕR$L˹pJgϐBKKkh @ P@@@@@@H P`LC3AĘ!m3EzX2pfͳ`ʒ~KWDJޓ; ">R,Hv/v`s[U9W\ҭʉ"6|@bre+wis2|^<0cO# :V@4C)]rޓפu*h}+ Q Dچ3       ?D,5ۡx;H ޳jdhFW%eܛB )aT4Ҫrf)/.loQo⬊ZQ1\WdzM=%I :`|vqi>gϖJ"T2&76"qBm <}] U1] s_ɤ9aٌR {j{BLo!EQQ D-"      '@Ks0!*7N⏕ c;淏#q:A DL4m&rFPѹy;a}s>sYr[ AD>        D풜& I c]f6@@!@с.       p2  Hi6y@@@@@@H   D`(       @"K@@N bYr'@@@@@@@ 1"&:D@"       ~)@/A# #@1p7A@@@@@@)@1i;o AD       I bظ@@ "&$A@@@@@@G bT@@[(       -@ѿ# ~/@類@@@@@@@$.@1x}@@ "& |@@@@@@@ ~   O@.G@@@@@@Y b"OG@AĤ @@@@@@@" 2~@@"2|@@@@@@HG@@ q"&?OG@@@@@@+@1\  /b@@@@@@@ "&0@@ i DL#      D9 @@ @@@@@@@!ȇ@@ Q"&*?G@@@@@@-@1ބ@@ >ǵ       @ DL9`  @ G@@@@@@Hvpx^@@Oo#g       *@  @ DLT~      [M @@#Z@@@@@@@ "&0@@ I DL#      @D I@@ ϳ@@@@@@@| @@U bp@@@@@@@ M @@#@1>z\      $AğF $iIzy;Rd 󊓧N AAҤ[ gΜyߟ~5 jը.yc}e5~:"*VMHn'g 0     @H:dȐ7I꽽%}@@b%@1VLtFW:K6osGOiPv ?!k7˔.-ӧlG" lX}>AV]gs)^yf?ҦK~GөËo:||=[@@@@@A O{vz5k6Ie'On͛7%<_EH b0&M18b(     $@G_&#*W\l9ɟ?o-2wqR!fE@|L oxY|lڸDŽ8DlݲެsyV8>;k!K3+VD<(vɆ     @ hjG%(.|옜=sVnWHQɖ-]!S2~h_HbҤYs>t@@((AD,8̛_PADf;ȟAߌV@@@@@K@bN2\3zn3e^boܸ!³qW_4iӚJm,ADn@@@U/<,\FVZ)aׯ]$肈-7̙3*s-3o5_W#Ӧ]κvRpH&YAr3g"\o5*XPVUJ(.r唣GɎd_".!>֗re=wWɶ%6AD8;(P<]+W]ײ'x-Ŋc#N9s9sn:6~mjK\[7_xIenV7#     /Q?cĉ㑎OIeD7 + "jv7_> Jdz9}Z֯[kPFfb  @ bњ_V߽ ]q'4~ ɒ9ݦ;7oޔ1&ȧ^[rn!CχHdɜa׍k# dvnB_8%>}a2Cn75&j$ŋ3OYi[7}گʙӭ]Œ`먱eWgz":}].y11C8Z>\/tKξsGê/u|>     &n>}ÇАca{/?矵FQ0pU_TA{GZԬ]GJ*c+2t{/wjQBCCewGkD5 2~sb'd͚9ˆaJeY"ADSw@@DH ADjKe bv9%Yr\ NG~wD$;/ o>P-$ DiŽW_]e*|/o+%* msϴ4(.W>{1cSFY} ~לYr̺>C'eʔ u*TnAĕKJ٭ˉ'e+1JN2}Nw}?͛5p89<߮ܲug2y40.ѬVUխ#R~Cv|nZoRD iI]=e{b9,4U]&E]عygϘ*ŌMg-mʗ^h'iӦ5O<Ѹxu&͝w t?ʻ.׹|[2r+ub#l6\)jwf@@@@@/ 4mJd*Os=k۷7ÇnU?>u=1g+Y 8HBլ)+,O i+  I%Sw9}>uʯgBy%\Bǟǯ';I݋~׫#Cm{Һo&]:lk9#@<c7GHa#dͥ_U Y7=XZېoԳ~v8-!M<%~Z%A CkfB޺U۩Sj:47 P6IZ>< ">rDnk?ZՇeC*7nܐ U3j~k}_]J{};K3i뒿33`-/G?F*W`;-.ݺ}۷}N`mz_nq<ۺuKq/һoo^L<5U1>s=iTe-K_~~ԯk_zU>;      ߐ4]]vM&-ϟZ5Q 1yr(Bq湘*"fϞSڿW3nHC1fA@L )e?kd~LBԏ{lz]q?!׭ [w~iDs߳" ezZ3gv %siT 6^ZmP "Uڥz2+3 v+@r2yD);>֝Cە AE }2y۵B`aK[۫-.]0K/LO"Ϙ)Z]t?뵉 @@@@@Dhɔ9RS*#VRLaE$̛l*Pa m%g\Gj/SQwRȚU+%8uN1`A@S Ѓ*Ӡ]i9]4}nWΊv .q;}ꯒ˧ܱs+̞v:AĖ͛JͤpB9s&{8%dqgSO؏hm*{=C;Yv{lv)ov "F\z[9ܖE}O]9Х-o?bʴ]Z'Dfb:ZqR+Ovηnq^hro|kX |*~V"}F%un@@@@@Hl:uK]+ςF_n뾲cnXobDlڢ*Tŋ|"ٽk9= 3Ǹ@@ +Wdiㆀ)_ !*nl?' m>ƍ^Zlsazf*{ln8l&M[^.86AD嗝VqnZ㬠`hP?Zu*'cرAȞ~&]TmiҳWo3Aeُ%>v/-5A kZbeg(ҹxL*gvK:u(wseGN      ef-[Ķl\,ZإdȐQ0Vʑ#yx9 >vTN:%kWPI~M֭].^ cG aac~@O&a" *A=o--\0XO[ږ%yr3rx{+hM^QcI"4u/G1c "V5ºTIXXlgΜ5YZN+Y[ʞZw婭 Ϲ%K?+C:ofufgɧ[]W:>:t*K&K%fb>w`.cKw[ k7C4p{)mmmzrQs'8Y%P2^nQųtk.\RHDD\[QFͪU/k69w     (]>y'G9|H~'ssW%((}bpo#={N)W~)Y}Oi$/38@@ eɢD/[ky$yr3N8!!DuVQT] 1lٲ[*83fBqFgcWeeVWܱx}ɀec4UJȥ;uxQy 12~Oҷg5)^ "jsiv5k /N{󙻗CBe=-= )Tu0ݡGd௥~:v^uuG'}P:MY\2eh&44TVy "ؾ|k2dp0Xw3-[VMg-vЗf%O!F/':-9_rDD\[~a{~ҥߓCsʕZ @@@@@TTY¡C_\A/$=s|ɓ'n2~hϮ+T,5k~40bh>@џf" (AzG6nX/+/0?mfа}I6E0?A?OŋSycg064z ~2mqM~=gzksZ#E+Ĩׯχvu=3mB+<8E+3~Ͽc u "%[V_åK0VΥ]RSg1,,L>?|n?'od/gΜ]Y7^<_4|6vJg->nxK:j̙3)ss˕O$K> bIr(dBiDs'\t,s}yv  !FwAD9#oQ2Cn S~a 9>>}M j(Z3U!7Z ,)Sg>v{|[#1kIi D>%ټe]Q;e5QJu ? "     ^ bԩcWʿO;D,R4iܾ|~L"[ۏjSNq ?cF@H L3JЕsd=n2{!CoY߇7X֮i6 #+Ҡ~= z^5a8QKRXzW3p~l٤QMVߴӠk_]K5k{ǛK~گhy]j~.<{4b?]764b_ΨʬRwKd/--ܬsvpͺ / oծ)VgQߡ_^r.]:ۅ eF0uw.]ƒ;k{j6|^|F;`. 7zзҮͳfKdrc)nKXN7A&Of5;^5#yrEUo|J˯ C5:euk :;kVCt(+Upנ?s$      xAY֒X(e+_9s%,]PnlvjG᪮ [6osgʇ-Z6>^-⥋2l9/ "1h@@ p"\ZaD//|4ϨjTQ6LaD"Ez+WB% SwXke,KFQ3XLy=5 w9tӎiSÓ;w펩{k4$s\j\HpYv/EABvC0+gN9}0Qp^>     Ț5W@d"R'NC弱•SH%{.m:i㙇]Eѩ>  ] xy &]1Ń@@@@@@-@1ބ@@ >ǵAD/F     V bl  ^aAD     [ b   @|"Gk/lٲ}K"7l`       DF@@%@nI@@@@@@@;]@@b)@1PtC@@@@@@|T N B@AĤ2Ӽ'      A@Y @~2Q @@@@@@B b04# wǙ        -Y  +b       }vj  4"&y-@@@@@@@ p"f  _Dib       @   x7y       =޳    $       >,@ч'! IA bRe@@@@@@Y b . AD?$      D#@1N! x_ y       M  1 D       O Dap  @ D 9 @@@@@@@ "v  D)b       @$  "z[#       ]_  A8      AD  A@a@@@@@@] b0 AD        @1 N# xW w};       m   D       D)b  @` D @@@@@@@ "  O Dap       @c$  7"zS{#       }c  Ahp8      AD?$ A@] @@@@@@AĤ0˼#  }xr        @   "zϖ;#      wC P  Q D       _Dib  @ D ܹ@@@@@@@ iDL[" >+@g!       +&:! xK d/       pw"g  A(`hF@@@@@@D LD@U b,      IE bRi@Q>:1 @@@@@@AXB @@;]@@@@@@@%@nI@@H"FB#       7f(  s^y+@@@@@@H:\  O DiaP       @"ƚ   U      =wϚ'! D"@1@@@@@@@? GP@@@ ;!      @R fwE@|P N CB@@@@@@@ `@@ "&)wo:jJ<͗ؼetK$"*VMHn˙3gsR~}${wJ0{1Yt]ClSd~      W"z" V bltGz:<"'7l5{d͒ogwp)_>ΈEŎj0 kȳvݷ_>g9'z>;V     TV]HRn7qtb-Yü  D|qSY`\ځ9m#Rv-}? ׮obvXrdΜBtA#G'P}Mɐtf:ozeUn}}6?     Q ԩ[_ʔ-g|)[cF'ڜe/<&ɒ%s67nܐٳfȮ];#K* L  B+Wdia6ׯIgʶ}$ .}إB<|>tP *$gBÈC|c(hAD% UVJXQs,]./w?s[JUC~/>NRHnϝ@>v}:pfۖe5~{I2f)TԪTxA {3fFwQoBot,"tQH*#(ذA4EwJtA>ww IH|27;e=ᾙ1Oˏ50_}PJ%ɑ c LR3g]ykn횒-[6ӻ]z: XLBܱd^)]y̍7eYԳVjU+K瞕iȱ'du9eJK"%Wr߸i'w.óyWD^6|J\'OaZaU" "*ar!XpeR=S${?ȡGgck]<-}Y1Vr6\n:1>f˚Un3kv<2     &еG/#xDV,]"!ҢU[ɔ9Sog=L.i~h|4zİpl^XT)S7oݔ.ȎیGN;*"zۈ_@@|1h ѥKd%r18*JmvS:Fan禿kP/ü]{Фw~ٶ}hN[nEu?,}A_ MY1Aĭ۶K O |G9Spaq'.{ŶAġհ`~fhU'JAŽ/'N2=~     @t.鬛{аu>}lNtRMI'vVG"7np6b@1_"ZC^YffUħ_qz 9{[n̺o qceCgӎZ!u_EgV\Þ0sbD6|h2lE1{h^?k8nygtj#`KsGiFͺ8mb0錎cG.j[rհݏ:hĺ={ 1:%e]N8)kԲA@@@@@_N1kGi&?iSr%Bf\IwFիW̲Ե ޼!U+K3&x~axͻK$h9@@HADuiӆ ];SC)[fD)$ v#*akKukד#Ռ5ysa]ٹ鬈f䬊|IJnr{:}Z*V}w$c RJ/ZK_ 2zѝQ׿[|t,V$JHM;f%dq~wm͓[JPZ<-| uh7`c.77I:kRRHa62frW+ةc{jO rXf{Uwdl,=g{HW:XRq3]g)~k̚6@@@@@NLs+<8O.s;;JT!9s2+= 2fά &g5 "`  w$ bpPelڸB;Q:o+z~uFS&ht6D1-A;wHJDj6ewRs֮l~3mѺٮНT7CmiRPA|M)g,]m0hV?6]!3e2wD,^̘6:]M$YT|fաGdQDlӾlܴ>}FA}~@v(nMCqA+u&šKArI{e0uckHsYnlٺZ     @BN\J3Ϛ& M֭^%u^/5~ް^l s2GdMrv"H  zɓj2Q_/O !jD кAD=Ogsnξ= #GEc_A9 YsYD>cѧm'OgK. "n^Z2dHou] ʕ*h1Z3"6jPO>Cxѵ竲|*{?3J˺DO^6]Nξn&r~v}͙)ɒ&O 8xPƌh3F      @tŊ * ǎ)SȵkW5L x|9x`Va#ə3tD288X\"֭ÇY^Iѫ# /Aě7nȆ ];':~kZ*$Yf1Úή0 3ؾSWY~g%u{PA]H-\ѣkgٽ]WAı']g 4n~yogaMŸضuKf_tqn "le+Vu9hB2kT "vTXޮ`ܯOhc/l^|;vfۻO5 [Rܪ@@@@@_N1G3 j0qĢ~?e9y69KR' 7IK.co䴼rL?Vn;L놌# %A#_-ZXVF/k1󢄜O!*3vtd^ogou7=8rX4dݮmҙuΐ_*dE%hly2o/aOe4N}Lt)l FgiI/۷}w/={Nl.'NE~Li)Rsod̸eŝm@@@@@%SN-twy WtԩӘ~a׻2d$|^~?rXϝcz'AD6: //]$kWE[T=I>paDO!݂6t@3te6nlΒ'3GY0ڕݿMf,W=nOAq&ɀ\g5|ϫұ}!o"vv^G Jf2m} w "-[e۰%b.`^?7NLm[~on^O 1Jik!uT>#fŋ!p^LzUc̖2qhɒ9}߀˥aCZOg@1}Zr_(}zǾ@@@@@|U :AD}v7wo޼!# ItR mO(9o\gt+/񬔯Pɬe:r;+v "z0I@@w|!eX9vij zAV%Q c y075 ̑$IC\=;_ui篿*%iӦCY'' .ܺ]G剭-.֗`Ӽ 5Nm.mm'o'     >+ Mˣ=n:φXBEysf۱G93(v!Xim u; A@/3g*;CQQ&eL(ܹ,'7[ϤnvΤ/$OB x捷ߕ-'aD@@@@@/H&,T~EI4#ƪF?r`>?"4z"+/*O,"UUQɅͲȞ=mPN]J.^`5kIV;:y8}zͺ)\frD:)"     ŞyF*T\~]F};z IΜ\;E 9$W?=`ޏs._\ ~3ssFKKۼelڴcݾ$>_V}Z:U*n̤Wd/X97oJb@=w.CZ2fCI\o~fJwkc ٳ˙?_vyHW{nDuA!Di]xQ?QƎ;mӏactYu̲#ߓyeOkuG._a5|Xs{իGV z?'Nž@@@@@|@hRd=Ό8zİpMu֗mπhPgO\(:a×_6&He<+|I?+r4  ;=k,0ʓc+' k>r\8p38 XX˭f_rE|=:;,=)I$r5!1w\59|h[>Ⱦ̑C{4\7o>vqWGG@@@@@Sr#O@t@u><      AD_a@p>@t@@@@@@B b@4# ĭAĸ       @\ Dka  AHyhD@@@@@@<^ D@|[ o/O      /@ǘ'D@GNnk@brf칿lŪqQkTkѺlٶBeaK#)h`̑#3gΚ֡ߎ5;F@@@@@ bJJ\$M괒8Ibv횬ZL9b'AĄ8<3  AD]ZL^ لӕ}IDgϞϾ(KEyltp"n <<  "{uiӲ=3SLg|Y+9y괳 "F.     -ɓ%wa|g|PΛq^IGC@<\ׂ,;~*7o c>p׮ :wsauCjzoۺ$Ng/]"r+Uawl޲,g͒YW3csCN1O\RLiɗIqlٺU֭(ʽ C}e_Eev{?BKͦ0i茍zbE'O7m#fU$=MҥK'.\S. ⼈ޫz*f3Grݘ!~7o ŋŊؗ߱sw,_n@=WcrGΜ9#yԨJ R,Y2o0glr#I:׬]Db32cr!Y(VQ7F=J{kEj/Fnt}/O/s#59pPK˻z$S*psdQy      ć@Yy6碱wg|WSrUyo޺)/\۷ǜ wUD  b"}%r18*ܳcH¼?IuͲdȔi}-3]Т+[FƍaGd5~TANK]%I$֏/ӥwϰ0etK^7%mڴ֥O}˯1. aHݫ&N&_ ݿzU~!CpmZ^ VH3 bOԉ$U>L>{}{h;vt;\P}q8y̠5FG\~RN-:kG}'﷪8ų>k`Vݾ$c}Gfda!_w+l[1g2IG 9Z {8jH1iR} ׮gWyӧLKÈ6 gZ!Dmw"Θ6ɘhDuץ1{ lp{˜?R٧Ϛ{C{?ؼ_:ڕK0v^ki  :%eʰu=Tqye@@@@@@r\^:WIR%_[MұswYnDD\b,={TyXڦM!~+_~ԫVn2}h,5h_{HW:OPq3{gn'O     @|z<_p>v4'l5* 2I]]Yi&$sC! %lb;~*6nd "G|=sf>AW{vft_X4f0crZ4, ^ Zh&{3ϯFƌ`; :{+];I2f-R\EztlfxhWZK4iͪV!3 x-]A:t^ᾆҦ}Hrx%i=[reQs~|ܗ2vΈ{fce5إ A… ׫_ٕnեsFF9.`ɓ'y/'L)v]lޯE aUbt.:uh'}_ MwLw}FD}4ی     @ ΓWWd̈'R$ɒ}HN !!!vzyÜB'8ٺy=1CFg@@X׃NU+y,ybQ "8qRNՒ8qbs/O0Vf9{De~u_k+BE{6D= ~ ?Ιk]%̷A3 ,B$$M>Yp/uԲ(b#+DDĺ^IcƒO=|Vi۴j.U-=_{],ɼpvD Y&#;v).K::|DRN%=}?̔>/ׯ Bޫ,]>&BlޯF g|h_V妝[bEe1YV1}43VRܷzW     G1VjJg󓠠 Ux )UH"\ە˗eƹõySADo- /j2cYk?b)eI̋r._n<9 "V\-]z7#ceАa.m:y8]:n=Ҩi \l7z}3\^Yg^,[y{ ҿv=9QZp_6&AϿZOr]7QzԮ.km6ܴeٳW.צU f3oKfMggj*2y.mVIC3\AЙO38Ze ?S*\{ElޯU*ɈKֺss_Z.:ի E 2M5:     x@.%Ufwʐ!*RXo~̟;yCADo% //]$kW4Q!K#=D\SF:G'X j=,֬N]{ o{aР6m}> iι\H?] .[nZciP]K)eU3/;vJm\n3xb_N]ewA/n֫(euI6@@@@@e+Z~܃qg?vE{rEnڤq>0ӽ_?[)2f<|h2,tM˻o);4>_ 黰hly2o~.]6_nb9g/x%Jh^0ɓy]˱ "ꅧN+%{g????c'AD85סs7~o3YR~$KYm ֹϐuzL4]EϿv}9v]]8wKnQMm5^*)RG=Dti{d3'w.Y,{{ses)SڗrMnp,_,{rcGgߒõWjX%u:[nYa]u1y~ԭ]Ӻ13Uٻo <%Ɍ%퍷ߕ-vD@@@@@ )W^}\pAGCRyd)y*;ӧNVyʞ=mPNߑ]ʘo]ٿf-ɔ9qqFBk" D[~X>=]=uw4ܬr 2jk388X4eGQg8n<.vΜS}4 >gBtˑߏ5ys-~5X7cDs눎R&NfmFDmǍ }OeYoKfMK|lz/AD==c?8O;T'tEwYwuΟ -vM>5x61KRȑk7_~:cΜb.r:dƌ W޸ii)\=     < ">\(ouMnr۱Z\yn!!!bLR$qbiS&F p2  K=g4aD핧τhزXF9a[n3ECCtY:Xf_N9#'Nŋ..;ܩkO93١9 Ji`J7UNgMg_,[?4WhBԘMgo˹ei7=NjJ2b`kWzR_7o޼);wzGΞ>V >-O *h.lgru0nK^P,;hHv]€~carp -]45H[۫=K]{CZln,u&`s6~}(O×}L5X0ԓn޲4Y:lA vTw4fA=Z /o%6>tzI"zE5{ֱ} j[Ý^KuGأCIFt̸ ]Г}գTZeDmm2v$eC@@@@@ ^r#U֐R1}f/aD|Wd9~r^Ik# !@ѳ #j(@Gzxg<+.O:      AD^@@x @@@@@@AXr@@D"      /@1ǀ   Z b~@@@@@@|@  " xADo=      D-@@W@@@@@@@X D5!@@Aq.          "&@@@@@@@"   7 Dѣ       AD@@x @@@@@@AXr@@D"      /@1ǀ   Z b~@@@@@@|@  " xADo=      D-@@W@@@@@@@X D5!@@Aq.          "&@@@@@@@"   7 Dѣ       AD@@x @@@@@@AXr@@D"      /@1ǀ   Z b~@@@@@@|@  " xADo=      D-@@W@@@@@@@X D5!@@Aq.          "&@@@@@@@"   7 Dѣ       AD@@x @@@@@@AXr@@D"      /@1ǀ   Z b~@@@@@@|@  " xADo=      D-@@W@@@@@@@X D5!@@Aq.          "&@@@@@@@"   7 Dѣ       AD@@x @@@@@@AXr@@D^mDKY"A2/.8q:x=݈@@@@@@ IJ)+ԫ A  @ v%Phݰ{N:u$'OG~;wEx       D%E& {Ie1oyUҤ WΙ;Ov}+WTT?+ps@@@@@@A OAnk"k0] wb o  T f,c#YTF7};H6i!ܟKf͒Y֯^n_l!2zx{?>  kz{L|t{"     "ЪM{ɐ1yoq re)RΓǬ0aGݎ>M "p@@ D :O "^~], 0*UJ)|)I#.:lLb.uCѓF      @BxmWL2A.$j(O,d^¥=DL(#s" *A:uKyI[2qXz=G4-Aĵ6H\N^ EK}ziXddʔQ\*gϞUkɎaK{2ym5T>:oY>xH%5g-kV$gϝv`_      %EJUݘb.=~?1̥]wbcIn dmrpx[ADo1 ӤM+mvɒE{d֬^!;%?# I$HF]*EKl\lqzgEC*=… :`|ϛvjЮERLiU|jQ}t:+QͥݹrZܭYUl%KC򉓧ׂAO        T/ 6{ufٸnm^vK'O!<禓P4l\$Nv)>DnܸRm;m/  cD(3RbxQ 9cֹlr'C=숧o "N7X(<3:ؾfd/] k :Ϲ bTdʥ.CK+ۿ_6hbWj(Q".μwD夗-pu'NJ]>@@@@@@p "n$7 g+ RsԵ2r%zMN1}G.׮9O2AD2: /If$md6YΝ;aQCUQ!޸f$I6zr=x_[h2Yg}f?zɘ1TR٪2g@ܵW/jfQ18\x1onݲh0ڜP\$g2g|GG/i6]Z_C/tYg ]r`/;{*ݻt-2gRRjh͛A_ 5WJmZӻt~]Wq3^s_gz)~;r43R@@@@@@t6_1t[}3ȥj(O,d-Z0O<`gȐIZmg/^(gk6<  eDT*K%"+/ˤ [{ReD!D8+sFDw 7~W-Xdr?rֽ5?kuv¨EYӧڗٱs >C%yf38m8yٰw2w #0 /_1fh 6ȖpK'A@@@@@Dupv5y:c)@)XΓ),^(Nؠ !%2W:j,|.AD_E@b_ "&MLZm/iz(܈9*C<ԭ-kiauK'ogkKe "|'.j'o"!͚4]9֭[evsh*̔dI?<(cNEKµS     x@YI8Ix횤JlÇeh7  FRQDF}67wvH\B.*۶}/nO^bmRn.7%K.eI bdub!uJ bV-whro-SG:J%cƌ!Z5s{cmK |rWv61     D 7i&_$oKrW_mG[+;jƍ95OSsv@@  vI$*sƏ#M<'h}=AD mm3n3UҥKg2_FMLD|c4dXml\Z."_H{ZիȡTv2uWZ- ߏҠV:\ kViP/WVn\yuoDNXV)vM6>}7_}m5!xD@@@@@RWoDԩ)X={v['~.4TfB~EGGVRD15mG@Ҁ@Z "f3o2Z=V7VX*n=N0}Sc "iUޢ\{5d<y_HQAC]y[ 2vH" xu߆O6JVmW]ig;WC7=v̛… S}{J%u}=m8 7?pR~ތwn9rǻ<"͚&s-      YҜ9e6:tHƎ~3^St\Wi|&DN#Ch  p aRP2w̙#[7aMx1{#-[Qϖ G "j ћbxUth)SgoeC~޾g#ǝ@}fȆu+%%ӧOKkߝ8A.˓.ڵ[׮o nd_!/s w5;?ݯ8p ҰA=ɘqo Β ˇe_n.{~.׾ 9sWߧef@@@@@@,`vfhm>\Pxd:t;O;*FqAHڅ #i5wyDtON>o_|BaEclADm+/=/w57髯;7͛- cI ^6JFSQӝ4ؤ}69>}:knEŕK üo~~ryFWOR*Wݰkm^|Y44C={ӑ#GD3e, (?$=z?)sA@@@@@"] w. "ٲe?ai9|H{44kZ܌bun!k׭'rGس{̜>5Զ@1E@Ҙ@Z"oziyd8F 'o\AD Åǟ%.VлN<)YdR*8b Y ޝmPW:ttlg[?CQ{BZYv+D:w&tS'WYR7.[Tcl2qyLࡱC:@@@@@@ ΛW7'f:̞9]~駀}+ ;s挜1&2On~ץh3  "\_h`S"ϗOf f.^LEhGYz@Dݨ'`;=      @*ȑRl_w'ѣG݉V>lܬ)zòEkT9O1UvF@ҎAĴӗiNJ[o?!#4U5 &^Ѝ>]:ٵ{wڮ\e7w\r 5B]7uJ`f1z@@@@@@ he+Z2g,p;gJҧK/ Ks,ȁ={cꮂ;ADWy@@ \@@@@@@HRI@@ #      %@1  As˹a@@@@@@HcXr;  @j z"      =XB@Ha) @@@@@@@$ Ġ@@ <y7       i#Gh  p D<:E@@@@@@4'@1u)7 .h-       ,@1Xe@@ \ @@@@@@HrIN @@ "      '@1! AsY@@@@@@H`rK  @j z"      "F7a   @ DLAl.      $Ad@   +D@@@@@@"Q b$ mB@!Pgs       &"n@@#@1-E@@@@@@B D :@@ b\@@@@@@HI@@+@1R      DAZ 3ϙF@@@@@@@ DLm! E bj)ډ       څ  )$@1        L " O b @@@@@@T3 @8G"#m"      @ fC@RAO@@@@@@I bL2G@H)E@@@@@@@d l@@ >>       @ Dܾe  9!@fn@@@@@@ҰA4ܹ  "^       @ca   @ DLd.      $Ad  q Dۈ=@@@@@@@H ɽC@@s@ 9"      ii{9@@ "F~B@@@@@@@ 6 @@ "&;q/p%'}.N6.ȚU2elo}ORJ,a'i{nQ14ڹ9"6>%V>I ^C_Ox{̚='F~, |ٶk)2m̈k# B@@\ɒ%KCէoX&5r]k+]{gm 9rIzfF'FyD@pA4@H#V!'..3x9z,7zo@VbSOɨBnjq_T8mͷFBblYMm.˗qްt"ɝ+rkrرdRx1{%J')RTVۜIߍ~Km+aɘdWrdԛ#Lx{ <$%z\@@!8(O?=byo??uңGw G+SN rCmNm;=*֯uF߷.]Zr%w-[> ׂ3cL˃N1.5# %@1  ANJbm϶K)VT^#`]JYXV9b DA Z #5>]z9>9t\~rUWJ,Ym5P8kTٳ{nС?mDgN<)sfN^1)vJ ₹%o޼:=Y֮(n/YΓAN}w.tY "ƷO"@@F =w3#>c{q;oW]uug)tv-eWƎ~SʘJ)%cƌ.vǝ;]m blRlC@"O b -B@)YLu1 ۰Qcɗ/mmɂ7W._&n f"IwԪ) xwKQZw;џ{^@@F ӦLÆ, &52,-嫯ݙFw6sWy7صˣҺrѻ[tNZjh'tV":0" @ b*$ ews#lee )l#w\~u!;Ogࡆ!ZQk 2O?$_}krx NIb$gcǎ>SrM2z8ٷoQÆvIR%uV?YnN:]Np?d?YpU*ֶ6D9rXn-_^ҥK'lJ7$gN 7ʣugRUSϵmvcϿtw AjT& 9M%'G:t~fΑ{:,?NF|ӿ$k3Xp? ~7ϣwD[c=93qRgW+[{yq|4xHV]*VIJ(fN-Yf]s.~6Szޞ ݥ'}c0t~Fٸy̞ӼprΝdwey 0tx΢3BodΔɴo|b~PtUw{8]>s|bo  )AąߓMC^xiL>3MK?|߾Е{Klׅ U?_."ߤyoD׷4i|}/RV]x82qd}\32qi@,@8".BR^~o '3SeF+SN أJ6 <޽liM@n%K,݅Gc]䁖{>.YL=3`\3΂~A$ew:[E4@xŶ0^8%O2r0)h\#͇SE{/I͚5B.8͇DL>цzEkt-v$G,mj@pib_]+m^%]ta]|C=6ڶCm[PqfVh¸E=z5-Y ZvDL.=>֯[mOg[%{l?ת>yM yx&3$uCO8!L1x@sЭY`C=J6X7ݫO_yчf@@U Q}~I!C׬Zo"/ %}jR*U`D|4Rl227|uZv}_F1Xe@@ "Fv:@@ DL=]\RvmlvjٸanɓyvȇoDL&۵^+ʖ-۾clڴ9̕o_ysfaB^bJ;mUN?Ԯ?Ngƍ%K봂fTe]zrKrV5z\rj*vY jb>RxRo>&'p`APM7UV";T'I+m~+v]T9q3M |eԬQ.k%ĥ˖Izs/(י~IÈu7V5瞵Ǻe=?w ">٧A'e՚5cǏ/ujSjvDL>i0KpY\,]!+%M/kw^+R6HDLkӿ0gC׬]'byE8(Wbk֬._ӊ0>/^"{/h+YMH ^vev~]ո#ูsf}WZm*^f1A}ݥ'uEw5pNJ-bB{ yw ";zy]g˖VL:0!kˀWʻSZeqάvQVdB@@ Ziq}4Ǻt^4_\|%Cm Q+ש ]G /z_ 5kT3_Dе=hѢr;6_ҿ4oD֩c3MxpߗDteG@"_ b-D@ҴA| H*$ e˞aig!NhD  6mX|~]CqeȰ˭i3p׀Y3M1ÔСU?]B.0ݦ:ʾ曀]V$k`іzRvʤwTQ+ڵ bnO<7FJ(n*ꮡexҐS%}vX.]TJ3sQ{8/p4o{}]_Lҡteܠ~]yg)o Izp)'nu^CZN9h~$ƧLR2v({B[uPرU ;G/=VtjN4|7əRE ʕWDu1~̛Y3в\8k_5C)W FCDݨ? ݥ"j3nIש7\R<ݯ{-Z(97JU'vm5Pz}h{t&-UY_,3  G چO=)w6o[벾tqC7Z^F1|ok7;:uʾ'?]wJin{!/#2 DA#Z i۽ +TspD7C-=SR<g "zg85 /Ɍ"C3:U66d˯luK@@H d\b[_;r9uZ7L+dG @IDAT"]wG}qP+h1Tuˊ+e{suX'}AX؈ DAĈ [SOΝGjTIuoejHm2!kB[ "z?7;vh'۷nE{sg"usZ "}vz2.5 '}N7W1>/>ԫW' r\{caA6]$^nx;ǫAYy5{O/iڤϏ+VJǻ̗?/V̾@g؋9?eNwvc@@ "F`$@@\ z;[Ҧ]SNɰ^U cߒ?#ǦԎᄝԯ+?ULUv:̛]%UTEϼ4C*cAD=Ab/Z M'OJb "jG?:D6u\)jXGj ǜ$v7'+W 1Oqn0ɭLIoo,k, "ISOn,DL 5Cm  n $|htE8͐'J/<) FYf{X@ ꎟ~l 9A9m)S)C}q Q2E "r6mw/|b8Ƹ:G~ࠨ߼S.U.vlx\ 1I;.T;G@@H [ĉRNh/ M>C^xeɓ',}ZНJ+nŮ㏲_mY&v?˕3f͖>cFKR%&MmpߗD IJ@@ b"Fl0@@ }GpMeN-[Ks治{ola[|M ;o<6*̒j-n;JmEϣXWO w\ Z;>zW7˞N$̙;=_t6*kжcnj+W]8Kan>p&/aݒen' '>V ~:Rx1 Vx.ʹ6C + "<ܩ[o"nőPw7,ݐ\EФDL]nQɽtڢUs(-G5t6P' fj듄>̈́>f@sO 9{c (*$*7i|ۮދc` K-[.gCʗ7FjqRRV]3υ}_F1&y# )@12V! A՝LP(S̶pNpɜ%C?x&۷BV'SGOL YwBO'z/PrԶ{^T\&U "A2@aъQW_u[8NZvVQLSJIp^y{TH|Jrb}bOh5W%#uDU nC~NQ>`<(k4+T(/\g^ٳgM V6fom/=nQI.=>A> ADmvfI lES=am?) .{11a O<zKm}Aj}%P<= Dt 3 2{4)?]7qw,6D*U`]i̯(mcre /y}Ah<@@"Z bDwC@ҾA U2e/]~MrTʔEn,T?SoO_%_~q߿Or#en)/ ^o_|U.?.flS]˖/ :}ac@8l22`7OW#7TT,#sed-q.\Թ)U/"wm`CxwRhIHZS@+C&n-C(6&&֍7\oO?#ПILNRZA7x<~ :\vSnnQǏkq }I'UV "2b !5mXUuw̿_tJ>u~8qRSbNg#`nxf)$σ'yx{@p3י6eF{cǎ*[${!}=(ďp/J\%o)+eJgghȬB@RATށ4@H#5X-q62+?fvk!;͸v;=Gzxؗ^~ULо^=˽4Xj!T1~>&Ӥî𫡦%KI'78jo]kU 6m,jcb:\a3x uUIsrW{b| "j͑#L4wTC @y'TcRO6fL`u~ûN@ >Vup_; ^ vMVLko "jUA3ADݜ]inADzRS-IBOy^B}<<" $wQGol{jmϜϺMq> 荑DOU2*"2# /@1" iZ bduoF;$ swyv%ϟmY/v }_,pQ푶Rվɝ[.2I8={v+۵uQoVfxŋ۶租d[eުܜ\p~_Pp\Bp{uzjNCmE+핹%j&Ze>xUKyKgTjZ|]p =w&ʈC6t.U?Nk֭ dҥKoތ Zf ѡIϡU*SMw7EӴ\~~=}fMErgn[O;m*"6!>X=MH4S֖-aJ.)fLi}ɒ%dvsauHp\^}>֭Cu~j8hp&2#>ۖO?s['=Nw6&}MZݩSE_s:a~h1xJ.>Yo5 {II >ys@ önG7xn-F;^1)Smik,5W۴moFwӮ{t&U(XGXG꫃+*LE2- @  #h   "FfKN64 \$ǎ_LNc>}tΔ9_P.$ 3fC5ٵS1ii)"?S9\{*s/X2Cڽ'cB'u\^Ҵ\*Iհ\…pCNv2e7|!ڇۮ{pC1)B_p;>G\𶧶>IO"%<[ ds}߾Czʚ7pd7u6?W 5<wgZ]$)!9)矲}Ǐg\=LzG Qtp*^@@@@@@@ m DL[  N b2      D `@@ "8C@@@@@@V bzr6@@0"        @ D9  &@\q@@@@@@ҚAĴ֣  "       @A @@RV bzs5@@@@@@@ "&(C@K bX\      DAĈ [ϭn@@@@s]`%KfyOyuYʚU%C %V>I   DH,YWbᚼuBuXv#}5S'c)ȑCV.[rnja#FF[ @@ B@@sF buuj5|$%}~Ϝ9#G;~_jʒ%K>|X-+{ uY_loq_T8mͷߞ6րM[6o۾]/_ۮɺmE;W.֊czĜcxb7(Sǖ-SFƼ))Uo1E'Ej5io@@@ xAݼ矓^Nz.˕vN =VLm6W]yefsϿ}Vtiɝ;l߱Cl4`{\ Ό2/z~;Aĸ؎ DAZ s#;u*2fa[?"˗. O{[WukW'y^Y­2rxTeːa#vbn۵Aĺormlִ˞~-ҺmT79aKzuuuǻvÝ6i3i~@@"K "~iܴy7N+ Θʙ3sˆK-<9sIS@uFDOJ_*V] "G}@@ 9}AK@@sR buӧK/~]'/\.Jj*ꤕf͘*{v&ڮ |'IgwW\!?Z'7D KB$̝-ywβvG 9,9-$)\F9[A Ac@@H"͌pǏyEG~ꪫ;H!3N-_{? ӧex?de68mdɘ1c>ΝǶ bl:lC@"[ bdC@ҼA,mب˗6z۶dȜ92{tiO`PQiրbN"Q2 j(o^6:RWەփ AH~6@@HD6e6`&52,-嫯 z;tn{O}dڏcvvώoE YD@RATY4@HSWΝGk6?ʄ[\C77?2C0IXEM͝;_Ȏ;nA 5|yx׊]{dȐA~'oW_[?wNJ+&9s;v\J7ncɾ}6睗NJ*a֭[tfͺu2~B^3A }' .СMȑrk6i0`|MrTXذq<1Xwn,e]>\۶oc0Ԩ^M , ry7E O/^{sx w5l wa'sÇv\;̚=-p+"ThG "YLhX%_lwf[ǺhWo9r\b_MԟM%u2bu&)^' cA+zۅ 1UG5Ft7FLg79=͛I[ _/kli6\3gϖ}"E Gn|e]vQog6燾n\)>wLvN\odu?PmaCvB&Ն Ke+me؈7|+WT0ϽkkL@{v%dr'{o.+#w/Ϛ~Y3mB'z6y6i,w7ӶMR!溻'j>!}A  AąߓMC^xiL>3@}Kܹ=zboco 7دooin .z_|e|$';  +@1b! A7XHk`߯2y h5D fhb>3 rME̗^~ULo*@WFǻ0!O6]or/Yd X. >RƘ07i0聖{>.YL=3`\3B,N{Ln;bC/`]l MHՁ]4@4r0)hr#͇SMy/I͚5^DԠsժ//2ˡf "dh[B;x]wD 6xU@4خ۶W `lW/U6ڡ+.K/!{+خa,|5io!2ih_֯ ~kX1{l&uABS ܳ<_~{!ϹjR;^[?L{h9+fϽߕC_-`]7~+>Y |y]dSÖ?w8:< 7U66E5p~}d1-_ᶘ6>}AX dg@@D/,Y^[~;ߐkV-_ԕUDlzO i/!{4R]%e˔1oa烿+5lzZ=A`@@#@1-E@ҤAӭ \/5kזL]Z6nohGMx$CMŧ?e -e].ӧc&twϲhaZݮZ[]K}d*~9sE2ޤaysfa}zን+pD_ZKYjmfǍ%M3fTe]z饦WY[@+č=?4 Uj3'VI+;h/cBpgA?Pt e^Qܹ>3 u ζIb7癊61RFu.[&M%L?aDĩktgLh! }z>te՚5Tj*ժnu[jޛ "dh4 %Kk$Yjݻv{`گC6=?8p@ T\tхDLkmw^=noɆ ؊xZ{궤 "Θ6T ,ǏˇKʟ)ëੁ&1~y?b }g^_j;Ը=6ǭ^L."{nw j %jBwx81)S3ʞJ?R5z:f(옆}mzѝ iST}_n8O5]NhE͚J^QC9kM(y)urCvD`rg]oX_3pl}{fMHuyҠoGS כ?}WTuTm&8ys3t܀&Kf3lJ?Λ "GfͺL6ix[˞brܾڄnrZW:v6vg6.>l׵j_SҡCv}ʑ#.U"`;s$OA} 8^2^ر"ݝb "zh'zݭ:w{?C {CoKw& ADWy@@ u DL]Ek@@4'@1rБ5pf3gʜTN<_kB&Z-Q' !j ,pNn`UjթP@OC")8e0HZ}@;DLkj_S!mo%oz+Z wnWX /ԧ!9wrvMjgvW*\qLCI/\]OJ^(OZZ0xZ8o\}vu{ZTtB\ZɱT*wߔ:s\ADwp} qQnpS\ caȠrU!C\p\yETӤ "=zF iηkhʷ)8CkM,3+o*awǶ-ZCkpk %~4AD4c| u-oGkWI .7 {%1sVp^(`cUS%ukS=qYzuÝ䡶.xKIl}۶dN c)D .RW|_ 4xZUdO6n6AoV?(h& bR\S+7{ EilD,_6:RСkGuyzt&-Ǯ{q+2u;hJɖ-[@%E.Bu+$DthO/ue_v2wo11 bJI@#͂.+7 mЊK.Os}6>S8/}LHh}e* F ߝTAĕ˗HK.ъMU'﹧y.cuph/[>z}*8: YDId0NUEkn?xr ֯'s疜ftS7uDV!Ϥmao%G Izj{J'7Un^ 5\{J,xVOG,k֬Sb$!σ· Dԑ F /9zTΜ:"/W #?h?j1TCbJ8 bD DAĈ SO?ΝGjTPN,ӿSߕ~/L;!2o6o(W, ᄝPL|VuR&)xkeQqV 7|vh'mw!]q^c]䁖QC{ĎIa^ʭsp:xpP:0" v>fLC8AĔආDLϋ=kAss7U5GX C |p-j#tn8)n̻FlI{rwϱk.j4[mwtZxΕKZ l0{oV2h4lRR%ZfyʎF.8 =֝0 xV=t:TRծvް^8d2ah{N;wLkEQ8yr+1>'yf   @Dt l`d?P_ܿ ,2_ٻh͚H:uM0_|RX1j RGC=2ߣnja#FzxD@pA4@HSWg˖V>o:uJ ~Ϳ.?a}2(jJ)TQ]s2gf*wgc>[JС?eUTk@K)Z?LthqVE{ 7'H5E $cƌrIY^PAǺt[[ 2=hW 93IQA'n== ܾE_beiDTD8AĤYp}ঈu|X>lkm"fseL3unu) W̭S_2̻TG{A6m,jnu?H*դt2l {̧~&np{/Rk*`.hذtRv}{)Q][f}:tȮktWC56ў nͷF7Fbm]bB:N6\rPpZU.Jn BϿ={K% [+0%sT&mc5`8'ީ}x  p "3N8!ԏش3䅗*uGn+Q~ͷҷwOS9=S}rYedRThmKV6C@HSG?J@@ DL}]۾#?Tţ]C/6 <0ڍ]sm>i8ӿL{wb} 7l2vx2lDMr޼Sym uB ԭ}Vd5 Çm:ĮKH;YB 3Uwh^/Aħƍ 4]hŶ҂_*kW)UJƎ '\Z:dv7GHrtV*nvE? J%G'w7$ bRhe*Huxb~Q!ආ >6eWi=J<88vRtr[[6~lnQ}n4ERe|ѴIMq>jw5l`4xTԨ^.?sцMsg u^ "6nVo>_hnZCL1xbo{hz_z:h:Zoӆ-5HQ6[*W7k?tk{p ת9K 8:`eUooݻϿc|L5;W9r_  DtGQb\h2vlct&K-[.gCʗ7FF}Jf^bSRV5yz  Nh5  f"dB2e 6xo۾dϞkED S2YIUq[a InA;iA1{s9l0tνTHQua#i4xN祋?tNE++-1j;CB%DT?|WA׻yz?>~Z<Ȩarj38BD#V\*EMߧY2~]*U,q%],Mj֨&ێHLqw>fϘ&v֑٠{bW~+\oٺZH$SUUfb*zw42i+[*z7zU8ukkkn .^HK+۠aU{B̙3тewl5񇉥ڙZ%˔729ޱ&|O&5?e(۶W(g?$$mZlYTr=s X*w&fA4 0y4?A2сzmݍoۚ6iljT 3wԗ=[|Wz_D,a%Ds*Wn}Ԣe:26mB]vwTMwl.AyE[ i4` 2M8"!Wm&    r.(Q,}P,k悅[k^:I[6lꢾFa$2o;rT ],t/TA ؝g׻6YbonWE%{vmhѢ2zkeŋBWԿ.3fͩU[vK.0#DEg캴BLb~}PlUxmFr&էWb*(uR,,\iLՆ-jHA0t */q` uYdlY.gdf.ufa ]6#]: we5Ѫu; YW._l\V!R d}1YW_VIQy:r`+#O.^QYSE'%ع^r%] },.7U~[q&t3dE GhR2>煄]#K;wv;ɸ;keLōǡ>{R65}t7wmĕ֝[Q@@@ 2M!oDG/Y-_ҦI#Qϙ7)T8 esq߻J9[+wjתI=}'6._BZ"'4Į9vH   ^CBD*L@@@"&=k_ PX.|}@IDAT/te%J!2ddX!y:-^8X@ѨpBFwN:r,/Y,}悑cG7QSyN[m#u06[ASX%M~EʓO$ԳwZn <|֭@{s|ٲ+WY]X`sЏ̢,Y2ˬg=z(_p4cu;QsӅEJ[S!X"G9>2L泠ixzO*U!~%6@]0K=v]|+" EDK͘:`bBw)Y&uj*^t|UXzjkTF{ڬ>w~:tؗ/Љ'e}zJ̙׫_arpw(#[v=./r*UN獛k+צ ~j#lf:Zl&uKjf"6iԐ:o+1vx}.(Q!rUkE.gN3f̢WPx ( ?K'\% ym"Tk\=cl:xmJ:2~4U'TYPV]U7$Y&ܵbƊË́%̙2>O2kߩt9s栙Ӧ6 y֨^=*t'.Ek4\ 0x(-^ԘWʞ1ys7!@@@ M!"3 LwQCaqK9\6d+[ž{֭? eȐ*bƈ!Q<,这omNE͝[6kfg   KBD;@@@"=kYUÀfW4ex[fUpBesMy,H%۳[VuU 6,\d޵ թ]˔(H訞׳VeJӏC;,޼e+uQf1u+GZXZ'+D,/5Bݖc.j/įzu.^8RHg;[luox!"qX_e^r%@!"[| S8~2ca'$Ȳ%(]Z -[F+Ujr.%DY4ڰq3bA鬟U4,X۶l4Y=Mh"r=Ŏms{!DyoߺKuU9bʯTק.o-(!$<.ֶ.ِ[C+DTcXDys7!@@@ m!"[/'^^%^ (XQM^^^sTw{k~5k׵f˴ܔoz<"zޞ`F    @Y۝:mZ*U,Z[Zvʩ\PB -ܶN<<ؤq#i %TЭ^<>ݺu1,elp4Q,b~*=rdn_]q&MB3?שSKŋg1׭Yiub= I۴nI-5%E eo!`͝ QĖAF"MzÐ}shDxXP'nΕ(gQnaAZ&˝dͨ$"ܶgnTt)ò*>؊ZaRw#ӣ{71Gbu={O_6Er!cV Ν<Ç֍><Sر4oa)4%ii$M}@ ո!["aV!"!~0]׏?2gӦ(ɤCH۲H$\Bªy M@ÑCeG\[?͞)'4oa{w27&rLG;ptfUg,&\+Q&u_V2׫+,VYdѕ#GM\=sbvn}1bOx.OP%d7rѴd\Yaسg\mבvcr7$rSz-sl%qQ&zYY3, = yq7޼YiASo^6,KrO >x9/XD8@$%i$ /~7..֥ELDwPE^-!cwAu Wy']t\lΊE:3g&ItME9GC91ާ?׮Q?2f hegΞf̕VrY2e t@my?|Jw{P[.caXiIt%l Um{.̙3Q<~xt=y[Ŏ'Y,y2:s :p ^Y xnj,\K.ڝ90>M ={nGPd-R$? AY OZ|[=rH׈~k* +'OҤI#X߀: w>>I(zhrhCBbOxOPσ֍2PBD {^zVߦɓ}LO>/*x>Iޗ]߉{a DA@@@<?Dx"F- ˂{i/_WO{|*WH1q=a d۶펊LyA"yxBwEcNjߩ;90!R{y&     l߲>/$aU4uD=?2Ջ1t^ N-G.X#xm0_` D`D8 /ѣn}޸ ]Yk8Ͻw>n E3g`3gvõr-u"b`P'"          D֝üA@@@ 1l$ L@d:QmQ? FJ0w5}@'!b?@@@—@p @\h    ," @1ܷMBȽX=D6;mD|`Z+Ly%/n\ڽsEݴi<$@@@@<7D "z6/~O3  Vr:h)W~E5j je̐&kWٳgTr= @@@@@<})N8)߰e ')?OS>>ׯӉ'u(uT[[tEqfںR)QDc&&SN'vL"z`V    i@y[]D)J:5ŏEfL͛7s&~t႑"mwR@{vm'NZ/+x76qڮ{3a=ƫ'Wxmvچd-6O$QE!}5{4)"}'?R<_EFP$sLT0~9{y۵{c.U>M)9CF@ GQd7N\9a|lB~횱vsE?N&ز#Ϊ[>I ~=K/.eG;[4'r7OӰ?ÇMߺUsʑ-%NX{%(>BSM7T,Gr!lyɓ[yܽw/͘9۔ WǴ@l֮݇`"={J#v}1:tp9y>Lw2:w%:/Ҕԩ_x T.]Z(Q鳴n*'ēٳgumj_W RiR&$IӧtQ ֬eWjNZD = CqbǖsO6 }2~MX7{[N 7[Fˇ :3'J?ҍ7%ͽҒ>NH\zZs 5̖?ɒI.;@]|~5 Dt 8pFW5يΔ)#/iR|*-ۨ^=wΜtH\/*Ŋ[\$-ldC)Zh}NZh޻f͚PLJbsGShtQc<>irȻz\ᶰҳF] DYYa%'wnʛחRHI|~4͜1?p0]v:|9:B[nJJ!r4d]'ezT(,hKW!(:n*L̚Aq1뉱i#йSjPJxܼe+u;c:p̹.D*}qի)/ĜyiFI}b.GEO# GÆPҥ53Y,8aTmb[^ lٲ Qu?FKnKilٺ5,JBvV#|' cAkb&=XvAsnt܋3Țޯ+Bİ# z~%[v>y_>!wA a죏P0{d"N\"^ӧǏ)Eb.DaGu7^<*W >6m.znquIe{t!z_Xd+"պU jټ+_GZ;entSmd6nd+T(OĒLSIy Ա#!"{My%hؒ₹edr2iYbA@@@"  TF_uS_a~mvBQ aݜp` +زiKWgzgnBK.Kd[Q$~Oɒ% ňXX—e,._fuP#9{BD     DmäA@@@ s2uڴTh *Db.%߽s͙ɷlMOO(S~٬L>p#G  A 7\h9Ng~jӧM";ߨ.crTTt!bO9˺l1o΢y2tB-tkۡcgf ͊.N .D1yG.ܵ3e À2Hъ$e!bXeRȖ 9h̑q&8||kiSmnBh*Y烳鬟[E._²E!LU<XaúUd2nX4?p[dȵpWo*_U~ª*;-q݆7u.\18.v+\`91cѴ3e\}[8z *磺E6A^nubY*D0i2M8٨qΰv]v,Fݹ} ŌSX%b4*!    )!7}e%ݚӯ_6~%-:|F~pz.[Nhaw[ U+-ߖl9wQ8xk0[p D-"_W7W,7[6#yTV6eG|V|%;w좓]urP.B>`oel1$9G*Q.sXc QOw[UXD&U@]|enuk%[7ɩ|/d[4TǕR-ZTZ=45uWP)dvuM1JĖsB/XQ*% J`JiW@; .Dd\:7wאּXfm O*֮ njAŊ tcH s]0x(-^ne*D $yr]XUXN"y߿ UMmڥLZTA@@@"" QÅ̙2:/_KO{ѻGȟ ko^5b kiCUiڵ`bPT A@@@@}{@"!ngշ"bT;Ŋ˘:s} RN]{vѡ6azD.& ""[[ ]v\Fn$N, +WQUh2eJfW?QX!8*A ,W!1')?KgϨT (,â%Jˇ; H*:,.Z,Ǿ;(~&Kl%N 9@X u1T{y|h՚*i:"D =1MR$tqa`B<eV:$u۹ׅf<džMؕ.>㊎vΧ}m6̛c<T]}^=SdVH{пb7k[lCD C:, '\Zz]cǎM{ݶ]GrE ɀ+7޳ͿE3%*w-!z'\Y&K;~ȖoAWjăBh"z`r     @={㓔V sgк5@fw;K]> Fxb];B,꒶pKnڳ'h۹*D 1uҜyi%ȴ.DTΝ:P6WJتesjբl:ӎ;Xj(j/YdKZiw\"X1|@+NA V QބISZF\v_Vߎݳ;ըn :*m߾:|Efo!XIզy&Զu+ !65F@G뽋,S l rԩiV=.1$IK/XHCkm0{.r-2ʕS{ @"J onw!$d>{n+.d+=zM]Ǝf\٥s歈-/֪Y*/o~ a4){l/ =F7L0etﯕ"      D@@@@ ѻ69~ԤyKc5/Ft <_ďϋuZS \;}Y0fь\j'O5,*Z5nPdliVXnZϜ쎮 6mXK1%U\E1GBNS:"EE *;b"J&TV=a"Aotk̥;wY,$sN!"wV{bZH"D >KfMRY"['Nڕq+צ\z'O! Ae]XsaYǙN DmL?A 7U ta~{;oGv;n8q9c.j[|}.[N_18I;(ԅfϡFu!r%͕M3g^רU{ii8g@ 2A@@@+@ۄI@%!mVm)nxrF~v-RzK/5WNGSn hl yBTPAӧTp1M[5qZQ;cBݵJT!}zQ*_nJ[[6IK o޼b]cBuBv@͋&|yrTZtP"1":PW'ֱ]"$I}UPgfX`mwֹrmZۺօ&N'MfMM떲)h녫V,OSYʺ^/ #-:+mPo&g71$]wΜ9\TTI׬]שUWw'w~X=G6[o?׮]oJ ]Ջe\ ?yB+׭2 1#LJU| 8 'OfxCF-bXzIbk/^$F&1ǘ =qwLow\B@@“@h Ɨ._DzWJ}zYwS'S\9e>{ְy:ý3+v,գ;mݺ/]f GdsvͼYXV,T(^\?Сfđ!!f    ޷P(Vr~G -8S_?ޚ]#Nקb{wɬ'OBEm?u܉V̸#aW $t ʘSԠ׮:68BD#yʥ%Jw>(UV΃nܹKʚ].D&5k\HLu fϘ&v\/ 1V@ƞXӅvF[:w|yԪYzv*XTr؈rmqUGhf+dA~ʤ 7*` eMMrR| P+SԦ]lVAu!bhݻxpdѪ5kMsRfPj߶55m-s&8օ\_ ̙3тeq9\xѰ!;ǬS)GFYDqP'26|WD͋a=fpǞ;7Ip\B@@“@X ܾC,-?xZl#ODs񁃆!,]; j5jѹUdcwI+UWЀ8 D4@@@@^],D<"z֞ݨQJ7fY BRY䚹jZOd~69ӓtQ˩S c tiev;bh٥aF9 Y~w#",ڳk͑Nm/^ 1^Sz=ΘZ4V-ˮ-qon#DEgvX=|_>T+yx!j& 6oĉ?utN[}PA@B2VR4jR$ONY:x[cA{bCo.6|?k#\>F4\su1ۈצiWuuB˙Kq G6}XEJHd?XMS<#g>vS^H%Gh֢@fcOx쉻czmXIp}ވ@xM!"-^5:zI}μ4|HC gV&LʁRVM;^"ٹ{/9 DA@@@޳W)DH"zֶ(\|}W^QDo/(CL壛7.}.-z4h҄qR9lAѣmݶX.98x$NKS'sV\M&MJY?"*'I'֭@{s|ٲ+W9ޭ[l/e9(K̲3RC)Jp*Ap~w(!"V.oܼIӓR%7ڠu˗/iqt!z*Bl}OgLbg1 !;ql&ujႴtw{UXZH~Ԩ^zY}k`ڛ7ѩ_~!v!pիW]EgΜ^E~mqr#w(#[#D[ K1F9Jy&ڽ'GWMnۺ5O@-=ϧRʔ)e8q☬%kVSΚhɲ⾛z|pyZP2^N*'gX޻/1LI;w,TP!THʖI.vl4٪ҥ歛ۣMtpUp?{\ u/WYzڦ{-WA\r^HZUcGwhy@ wts@+   BSk[`.e̐A._^9k^}$|7oX( je1.;~͘=?}F}sQw.;"k"A믿6"y7wnYĐ'!!V   ^MBD>"Ez+2a<[f_Ѿc!1}JyR>{"뼆 N .2ewڅԮesp$DtTOc+[lmY([48t[ReJcd88SbpQjܬﲃ+D,/5B}׫9c.jfO:/G)RPYNV!"[z?^H}GZ tktzn=-D/[ҥMcUM壄- 6l܌XP,zm:'(_p@@ e u1**D|w]NiGaʕԯd_ckV.7,HuwD*DTX,է5H[Ǚ9A0# Ђ#&ڎ =qwLw0'o:Ծ  M axy1VX.uŪԷSaCQeLySf [YlmQ2u:@@@@ޱO%DX"z֦NJ*Kq+J(vcO׮]ֻV9uܨi ze[7Ӊ&ݓPBa-@q[.e7ٻ&Nl~葔#{vS7h)z:?שSKŋg#c[X[z9*hӺ%h֔Ҟ6mZB;ADSZ"M^zÐ os0fM# Ǝܹr,i%r޽/N\ʝ;<+h٣)]U޼yClabpb.M!}GƾGn;N"Szmv_r]54n؀7j(]Y\ϝ;w;tLSq-ь-mY~mj"rŦMSk6]YrÔ(q`n7Q?WD/ w=@?$AT.` b]:K_c;Y/XhW&*-ӌmzqM9:vҙ /ݘAٷi Oc _]^odW":"<\"z`f    )@5jTJ*5%0$/^-;c~gNf"̙3O$c!leOzݜX)4+cVP0PNsTVМþY,%S& Y]N;l67b#cM`ɆeAݽwʻg=q+UsmvGE!bO2Mѝ%.Z0ز+g"RwE'}&@+Wрg[Ly~'Rwd`57v sLBXZ -%I,r&o_{w9. $TB!bJplE6'TiTrO>e+Eհ'A@@@@@@@@@L     D C @"0޻G%KH:"Guϔ$M3 X:A@@@@@@@@@ @1= @@=3gXnf~1]tٽAC.4d(-Z4GDE 1FH?I, 2SիWtZb]>Q@@@@@@@@@޺s7D"F2@@@@@@@@@@@@@"-#c     D},@@@@@@@@@@@@@@]"K@@@@B!@1c`&!"n"za     D-@@@@@@@@@@@@@"9# @x(h?@IDAT1w@@<~h     L" @817Ã@d'!bd?~o'!    ^NBD/@L@@@@@@@@@@@@@ 1ҟ   KBA@@@@@@@@@@@@@  D .AA@@@@@@@@@@@@@ @[ @&!b@@@@@@@"6S>0-{يȒ7.޹GnZq4utS    KBD @@@"=?|^rgOѿr[4 Vr>ۛr!WTVk hv}={*Vb޴'ac'8o7ʼn46RLy!$'>C:Jć._BǏ/^ɒQ {tyzjbDhMvULN~     D}@@@@ xR*uj/E͘7oM0|#)Te͞bĈAQDů_ӺG&fVol]3g>I =zH3M1Bø4[M#Zo\,Yn\gMT1,ʒ9'aݏ-\x4ܑD1C4'=zt!~4lOCS?*IOuCX$H$lK#,Q>|LNwUե*mDJrelyɓF=޻f̜mㄫcue,Z0W?P]\_ gO)|5jT:r :~ߋf޼~Mv;w;u\yiitԯz*YҥKK 9}m@x2{lj&F_RYV*M$ =}.sa՚l jOxPҤMC\5a{ƒx:vE|Xˮ1sDȱ)ݸySXK's$$MS.$Zs 5\J7/3v]ᅮ ĮWC-L}-KЁi1zUSܝ`#Zt:|䨜F/;w3w=I&ǥh˗/ۙkzujTFU|%<~_@?\WV]ճE?dgرba 搸64_rirܩedtUU#M!g{Ŷ,\RVQsm%X/;CܧW^dF5aOhyF~`#r\"z`f    )@]ۜ>CF*_K9wnӼ9oԔ>C޵c;=r(H[!4Mτqc诿2Wb",XTh"ԿoCe* |ۥ+;vT̚a6MOSQ4_O% 1Ҩ4tB(?4B/qNZԽkArmn߾c +3~ݓW"^|F d"gpמ=!    = DLA@@@ B{5mϨtrBT[Nz]t~c/'OKkrLl˗4qX]xGRJJZ<9]tIXz纈XEϜ ,[b!&dk`w .$oqś:d m~N2r ^تQ!T*ұy(EBܤ)S߶ ʗ7//^Tٺ [oY]ڴiJʣ;c:@,pp$ԅl-3Nȁ?ϝl’]VVSLjRR%e-!nٺ5,}*+Tlg5R z _N9s1Y{v'>8jte%lАhR: rOx,v K~8u5c=|Zz\{})z%c*T %LY6х >}FX{L)R3u! -Ŗ+[F ɸM6Sn=TyH'n^XgBJhd[\ѣGTc%DTiW?Kΰ6e5k5/9ϝ۱lܼ?zLCY8eq^ŽO>ˌoi2(o~Xa0"v{IVŖ-֎]; ʑZݴάM˷|R$*Jos/PBt lo#GQgchY2ީC{j԰˂yR9߳y= ~i;kKm'Oߣ/Q,Y(F%Բ/ѰuZ5SoL~@@@@@޵_-D8"zN-AQH,pe7޹#!TI?8?VJ N*{/]X?m ITu{~Mt>߳s;U5sz`KO6r+A ؕR`!$1tWM? ;vmNO9˺{GsgQa>gBDEB25 ؟*U*s< k .na6Gn׎m))Z-Qr\6>keyiJCLP~pXYs`! q?=tqDluk佘,R]U6gqu( .D3vM14Բ% +JXfTTY]@eF%D@@@@@h l-rС]jҸJҚW2{? >T]NTFC3g1ac)vQ#$FZ?TeUk҂~CQu DT$p#!f    iҦ"Ŋ Q)fX+f,cHbʌ5}S!}8bο]3[l%qut;K`'u1Q`ua[KP 7DI&.W\ŨvrJ2L7ҡG;#&F% 1$DX\|<"J)p1_².:,*>Q T^.76!?EVoJVYN OqTXQj?^r>d}?ZfJrOL ]\18|t(ρnٲspʵ x 4 .劎ΟKj&_z }fasBDv^R\֠ {[,Y|('9{:-LJF>GtkKhZ|9kVunɔOw޽WgVhUu!\}ACheF3 {hߩ3رSKf>8jd>@@@@ ߥ!횙Xņ[n'ŝ>>M~b"v֝6mbTue=ёC}KNz;=!Nq."z~a    @=[㓔VCZY;{֭yg%*)UrA=_%yG #Hӂ+b']uX]ҲTvj ,ٵgO S CbW_G܇BD%ܩ5osĉZ6V-fJ@[\8o>YXAݞ_vl z;5/[)q>b$Wa'ֹꂨ3xX^(UB7a0xޮ\u֯ooGٝjTa;÷]2w]hu:;*$욙]4"jgxx8Q8;NJlMQzߎAW}8|dkpՊiTvMحyLa* {QԩC{2u:WETZUӫLl@>I˯\S :-Dd K/ҥ waC lq-F病bŊ%_N͞++Z5SMك6!>L&5eϖ-{/`} pR#!Nq."z~a    @][?~jҼ%EU~'_~Mƍ~]MSل'm[7m=%I?_`oO_ד'iuz-Z7OYd64 ,8agRYvG% ;Θllӆ3fL←tNc,axmR)i+.4ieM]ģ5#.-ұű;w,$sN!"wV{b]+BĐST &),u*RܼUsQpt<]8q0).tCi=?{\=t/*-q|I;w.2Тseve˔u.}ԠqSYG}&DzEv 7jQ7 j]aQ0qڱk8?®̝[m6Y7ܷg'ŏk%&1#T1wgh    Bȫ-L>N&w~:Y߻Ob Kxݨf2dr{x?d+ueGX0#^{SP\92~y]Ȁw; KBDR\!0j0y#joٺ?}NzgIf,gn|m.@o޸N:&^ǞRe߲f_SQR')5N_*T!K"qfν;s3g?_3ϷUn~4PTd U+[TղtGjB "'5BM9ݏ}_l/{Q{ܜN$hE:i%҂V :+RDƏV^#ݞy0 vt~RD rY?vQSu6$ ɖM+-ujՔ Mbtyo3r(̀'q;8rbhС][ҹgAhncl߆k̩Zz^3s:ܛV :U1!f^F!u wbD4'kJipE)R<':Gm_ʕ5\J0+,]#y'Z 2"ZC3, o7t{`V+] o_v3TXSP{<.Xrĸf\}owg!Af'q}'ApNA$2lbI|WxDRDek $T-Sl :bPɧ}qWы/W't~XT)1ͼlRbEs`}Kѭ<  Y#h-  "F^vBi`>|P2[U/:mG ,(+W3>|H>2)nv>y퍷9y򔔭 =!,@Pt}{5~.\ҧO/Zz 4>AHΝL C2ϛѣRJu~ :tXT }"&z5JFgLovzl&bb;5E^ }goY|.qNj4nPeVivz|(Mx̄D*C|AkjL=4ZZM ?kWo2`ǹc{ͷe)DtNhD+6 |ܻy [|!+jRd@Ϟ=gyw_]5UtX t g]|ЙiŶǏ;п{]L?<.ݽ{>$t4kE} c|z;o)5D(9yTZ !^JC.^@w`ܹs2䗟G)o'kq۾s9$WΜRb3|V徺{'>4|SAY*y.]|ㄺO|)/w 9se׮E+$qqC{Y[C QP!W1xWgN6 ZSyAmRM&u]/U,i`K>6q&ɓ> Gyerj5˭]%k֬ZD@sMm>&N,?dHAX'jX^kbﰞ>Q_lj=O(E&9C.ɧPC LY>C:y[75VX)|){QwH>'8ݶ\f||#XkFRyWx'_'fB$Ͻ$k3$𫀵.AD}5kĉ#=潀@F'}QACzAIS2?ۻg)RiJRJe0Q>cŪRdq)Vٝ@l@xՅD,^d:y;r\pWÊ[vA+>idɒ9ٳ[͞,یJo|(}zM(跓ϊ^Vp+TZUyn^lx7l tMw-[Jv|_oQ.3$=k4OE?{O$w驾iDԪ{Fp/u?0}}b8ro\U|ߎ@sN`FC-[vP_.Uq "ɧNhUy0 "tk3 =V kZ 6itMmkNyFϩ8s(h39ԐB׾Omڷ+/qw޽x]||# kEOk'15qf$I|qI}b}k&߮N܋Ob6#O X D=?9̜=oE  u%@1;gRJuIk Ak}~ 8|snjKƌ7ۇ8^W&kVpօL֭Fjͪ 1MN3$swNe7{>ju7Ȩc}P)T8 nj")I?oڴu.]:/X(/j4\8so`Һ_,ҹthV^vB£hqZgw3ʖ5y 9rx]O9iʇ2"jz{AC<&EW*kׯTC+Z<*lgؾ/jU8C۴ҤVqX`U rMzPHgS 'ګCvɪHQتܙT m [|0^KnÆTuP_z_Cz=SOIV-Pcj\z9S\j"sۭ+ٳ}ݞ=#&~Iׯ2nߴa ȭ߰A:u~>Q>蓀O9geb<"Oڌs61$׌Ob<"O)3IJ"gjmO>7 GQϥ~~\oY3lW=Cߖx>#gΞ;.Њ^={HEk}oAKy~Ǘ)-4o9A@C@W b -C@ ظ瞜LV&5YWcҿ16:MH,V=vu|IlYğ'd߼*?2|rz}c<&yBY5kת!2؜~?JMCUWrx m;tt(V Emjߗ4'On]rAٳ{oH듸d*O>>t<:l3$G"7O^` {ag^Cyv(PוZv˖-~jH0US?߾cGkyn9m巠˽YfVQ{Vg;_jK40zر3]r ^pQUi>L  -`wҧU%s[nżd'ԩ;]M~~b(AD_@@ C@@$/@1w17ƍq* ۊ'nڒ:M;r̪Bb [su bxjU b}ƍb5~=r  @B DLHm  '@яV̚%iSt6Uxc##GJ%kXHkWD'ն5Xp!)Tya)\3v2/:r_     y#h1  "&f@DpBm#Gr bvD|7JJ7_^?k      @ D מ]  u"@:hnH|4qg «w "^Ltְ=}NΙ,0m}ReshZr%\\f5 ]T     @B DLhq  %@ы@@@@@@@ "F\`@@ i DLZ       '@s@+a4@@@@@@Y bd  p5"^MM΅      $AĄ7  .. f@@@@@@@ F@@$@1)&      ףA׹g@@ "Qg@@@@@@@ !  WO ճL       @bDL u  Dt(A@@@@@@"R bDvF@AĤӗ       \~@@ 6]AC@@@@@@@8 D! \-WK    DK%-x5u92p+^뮗t7(kW)SzDɸֱ  ÷oh  p]D n`ܹr!7V=!%_ǏuI.d=KMJ[ϛWFx\OuO' xWDb~5fLzV   @d lrM&>_X}kZgNaƐN[T)t?p@[HvL2ɪKv;n 州  )@1'}[wZV'=5kvU|jVڳGVX9-Y$Yd˗/e˙gڡ^hR`sCzx+&ƌvE)RX>ɗ)æ9S?8-^cF+Q#Gf@@"\";v\Wq>X/[ҶukyN-'=CtuݟUj<٠{ac~RxQye~1EYȞ{e۶nE%$u4-jnv%@@ ~}B@@J buwnHim؎dŲ~Y2d^[`veJ?,Qx*ۍ0Q>"nίwHVmܛlQ }l&۶OkB"_Ԯ]iN̗<Dm(uj2Cd@@"C"niаqFk%ZKjU%uT^kDۧ$O8{aoC.~?J^{WNj/ʂ5kT3 ?0b{[ğb3SL`0kL  @ DL8k  @ bD^AS1W'OJ.]nL{iVtٿoG*V+[6}e̕K .|MuD0S8̝%wu]ɺ_Q7Z}2y%=*#:D >  \mX8On.a+Iԩͱ7mH o 6TR#GxWhM̺skxd!fjOV0ʙCfLȹd?}{Uc$b@@ l"m0@@ ~\uk 9s2d9 tAӦNpu=Ra#);i bhQݪv4l:$I=JDL^lF1R  @ D|? u.ɦ|~Z ͼ3읷bGVǜm:|%sfn2kgdL2ɪK}$Γg[|J.]$^+}):͛};u~Zo AĘ؎ AZ \#f&Ohie <۳?s洌?q%} C(k961g4? YfqOٻgWC@yJ{)S;rq :RNP9KfsٳUr-2v9t谽^ݺf9YRH!3v3kׯxӅPw׊Ӧ{U}_5,Um"RLU-۶o /(=\gnܼYWfuEާ={/\Ν^gNR{ondd?E,XBE},:խar)YdKXυY^jEĄmIn0͕;rf~U#f^~{~Ct鶸hWe3eEO%N%~ͪ^FD2k>Wl/ev9s,YPBMfV a}',U 䩓l^ RJJa5`C'Dk\QJ& wHlP=p7ޒ3>1w~"mڴwd֭f|r2fRZMg/$ZܲenA{ Q~]pGyb!@@ }C@@B bdusKڞ_>tP>pٳK'[yz-nIDAT5jNhٲ{͉6єIcu|[Mᵯ6Z h|g/ٶkMY'O^;X %0=x<բe˥pc\iX nV͞=,},o|١;e˖U>.Za@Vb}agțKժUܫuKJ+}Xzb! bB"Hcԭ/->>@`atSZzKڌZמݓOÔ4p3?aNZS8*U RN N\3G]~FߵY;Lfmͺu6{OҴIcd91!  @lG6h_R##}ݓiGְ̪]:w4 .2?:A5yfsqyrUR_y~=뇃Wkq3E]}`U–fA@+a4@"FN}TQCҤTS[vlZ' 5e> s=Rx1.Hf͞Ѱܼ30V/\j\tߤFSɄh"fV jzRDq;Lc9Ǖ*Q>YNZOhrOZ`ɒeUq \ ~S;U~LfU'5O?dUa{*X̪8Go[y ZΊVB\|V?aZu:_:A:k&iRpaП{ "ԷA'jڵwϦ/*YV_2ܧ%\ 1ai=sݶJ~M~uOq ;vZ_Z۳&e˖o b|^v25j&uyJ8ϝ;gV#V:-;w~cK+Vڶi-ݺv6|J֌{FMyt<  ׳ǟvK#ADGh'O*S׮UC^{ee? yq:=4CfC'->|U qWuܱm3XC3c6YltXH&8ޖ۬J$uWM7y.)R?ëRɓa=U,gϝ'\ qvpʇSePO"5tXmf^}Lu?SK^4y℔4+| %}LJJ:u%1)f =~hs*ZʚP|6 vֻrgJED=Fƌٞt(w1+"ꗇ;?-!uevNEWzrI*?ub{r}?JMM<"  KZ鵚N~٢ϟ;[2gUN<)~:Sڵmm5g  (?u]%Q'ի%Vo:5=J=kH{C~m~~_F-<  ÿh!  "o,UZJ.__Ϟy q2uHÇ9u=Rjw{vys<;;Lal4aKuY}2p֮[/]24_Лn/ˁPPWwyK*UTTЀWBV=d뮶`?TO+iH=vWԀתK̮Ze݇V=jξJv(OjCirwUz %}{?{)7T\*5j6%P_10/FQj> W cHO3q[o]r){n{oy :kSaAZwo@@DepBfeu 4?g `b՚5ҭ=XѢfGF3?nF J "~adU;%kDԒ+g.SМe2m'~ߗDUxD@"C bdD@A\ﵪ]U*"&71Cڭ=vL2 AldU{ڝ}˦r>a}\pQW0}z %fϼ?f+ʒ9Yvvz> Β,1ӧOKj5D,U:&1\JҧOUIQ$jDu5+%US'wmv}/郙<@_`/z=DL>jD; m˖-Ms}5$ylP^9_}_x] bJ>^cnEߦ/4m]\ʪK/ӈH68'b@@X ?[2ahM]NRN={V5wQߥKu=};ݩa@o +W2cv{1i@/@"FNg͚MoPn&:.Y8 tڞkpI޳m_*ihU+ː7!i[iU2Ir]nDE D7D4n3ro\][(AĄߛ %_ڵk6ΛoUk"!pu5s3&$́^c+3M5ְ//onV_<6mXi}x}   A;n]>__I\DGDc3"{$`C34Ӭ9s_1:L'}scڴҸRfM: +|3WN)XA0("fA@"F bt E@A3Hͯa՗ 0͇<\T^J:AMWsɓ'dU&p?>gf{ $2ad{cAD=V[5%Hԩ5j  ">۽jGtA+zU3&{?aH>|'q ÔʡG|Z^rUC "IOnZ%x5|V$ڶ<Hlߩl߾o\+PeYl6/\(Eӊ5"~wҴj.;Jvm͢V,ժӦN|0biG@@WkDTS~0~$@{H|Yj˦ :U*υ +)/[5|lAW~:s[L7V)dyJO4o   @x D u  @ y]ܡU0C z)* SN}j?{_3A?^Moj]1,{!MK,!jTre˘MxZP#AOe/І\.cU{'}_l/{Q{ܜV$̞;+-1txEŊFUHg znۥGp*=e8]==ADK{}L׺O|Jjd˖ :jJa۵*F6, xX,\L?=i2t{^GvYڶimDቋ*u|lADwqimJZUqh^Kڇ3ǏKO?p@j۬TUu7sF~o`3Z`^,k9Bb\ӷzw >}l\>q͸$F  pmu>}:B&EyPPY~!֏+==?8'yf}vcRJ5+f:?X,]nӡ.Y&e˖J=?R0pp "G@"K bdE@AVP(MLÇ[\kLO[)SǴ>;UQCc֯1O<%elخϕ3̞{tCA* 8'f&6]sIoK_y^Cu߯A bvmkNB0{!L%K&GJUZ'\taR{(`qz;_4jgD(=v?S&7_EOLClƵ븃-˖{XO5j׭̇tÌ;8By_ VADL:Et7lqRPAgUL!Xw=Ě} [jR` EbQ={8JG##G1?۷nrz؆RM '5ouAH{1cDfBhI>5  0vPǟvKc}юINU tW,O6otrMyZi'۶}m˗+'GG\OgMV.fy-Ҧwhњ^R'{T_jܜ1|fUdU" DA+Z $Iխ:n0Zv_Vf~hh@Ua?h6w̞u%hhZ4{UM `Z @'wa g7mv1ҝt[fHlsXK%-ٳ0^5fEnݡ3Ii5{п{&94n$/~,?۰CZ3Oя  @D  @ ^Z\y)V?vLן#)ӭRDI{N5Ou_nGHܹprR_|Yƍ)Ou\8-lnT۴| ѠW7{l+&\ hslٲC~ߗɂyj["ټu~Y)RKZ@|dɟ?٤UyTܽ{he{5&Z Qx}nsΚ!I?%'O*U+Y!+þv+L-@~yܓ"8ncV8oΝ\9sJŊͿZ>h6R_O}ίrlڼ˲oD)ħrsw}ohUt8ظ؁?,pgpY(Rԫ vXDz髳P^O˕kWo2{Zm jՑY:gVADe?s-lk C9 fDhD%_Z4E >| B/Bdl:u~Y3ޢ y`->GV }k" mQ7YL}Ͽ"_RG.kNs8b4i:+%mڴҦU+V*sL4ENYT\Iӧ|ܟ|wbj)U+ZGOU} v]# $Aij  Azhx16?er@=uyqz7uke jK}}ͷe^ӫ4mk]@A@,[ժ[o\e˥UvYd&5U l*ur/.{(`VYNauaq4r+sVn֐Iɝw^pnQaHmG' ;g֧3Gaf^SuJ>1g3ܹ|zԭ5v\} bRC-[*wP_vdzݭ0^wAĺujˠ !uqj]}K3gqE|b}5C}g#٦蓸^3ͳ@@lZ\+fY!oz#.G\VmEQ߫N?FϛY瞹p?V?2j{IL٨I3f b@V" !@1"F" IW bxmNa*%sda}~ 8|sN]$]~ipqy/{6[I$U̮?`̞;ϯ!y=nd1^_?l*Xqcʼ UAM[*`٧smb^ qsn|u@ ]:wZK.vBP狈V-[uHײ+z _z`@sҔeDԨ@6sNZ~K{-Z<*w~RjѡݓC8,XN{߼>6ٳ;;TB_#2e]:Y) [;VӨ^_-.>:| {˃3km S)RB}m;OLyMbU'ؾ}Uc냅>2ɺrI)W9sQng-aZo19,Ǿ_>sF.S>ADVez=i؁Wn? k OߤHΝvMeW= CeI^m}o?a׺@ >s mNk'1$״<" @AD`WEw[7X8_ 흃WxN-iJK뿥=>Q -\ĩ۵jk֏4WX=y"5J7 }Pz2RI1B{fOsR1ZZ6" a'@1캄! חAɓ=Lfn(gϞ߭u/mu9sYԇ]UNQ?ϗ/d͖ENXèWE@UoYNYCo:O(BfZ5WGiظi(*jX.H w.Qx1SsWXݦ'-VP<({v 1]i}W|,PӧÇou?$ ?}=ku׬>AD;}#=:w] y>߈nw!  v ObۭaˑGe֭!]B+Dg95 vthv/ۃ  +@@ C@@/@11wƍq* 컊'O4N&Ml9fU! GD@APA9>3H :@@&rA{5g :{0?$\rLv^  h # ADV̚%idU"uI/6_xc k=*a鯗)>AfO61BThV-[I>@@@@@ A(B@H8 g͕@, #GrID3u)iӮ=TX@@@@@?_s  @X D 1 @D 'O={{|NlX._lTp̋̓ɓSd7HTh~׮P.Ͼ     IP bTn @$[@@@@@@ o@@ \ @@@@@@*D@A['       ñWh  p D:[E@@@@@@$)@1Iv+7 DA+Z       Hu   &@1       pM"^VN  [b?@@@@@@@ <"g*@@ xt57      IT bXn @S@@@@@@,@1 k@@H bAs@@@@@@@ DF@@ vc^       @ D מ]  u"@:hn@@@@@@A$۵  #h%       L b0# $AaERL%mw}iͲa͘1ԩ[OnfI:\tIΜ9#}31OJ@@@@@@M4@H#o4j*wy},^Yg2eUlXۏ;wlKۋ<"      @ :[@@"Y b^Μn^ DԵp fߓ'OoUFE͓G%Kfy@@@@@@\w@Hÿ;[4VP: "}Oנ~*W&>T,;zTLlc@@@@@@"[ bdG@"^ bxwaZu$ȥKdۤp6nl_r|usstiӚ˗/Ka&       DAĈ: $ ۏdf-Z!n,/\%K "vIF4h8wK}+U&TCvŲŲcv{G@@@@@@`y4@H ÷v,2dsɨeEDlOI"D?Xƌe^_rm׮^)[6or1      +@1r# IB bxuc%ͷlV9+jCʔIvo붩S&1b=CS&f#      DA3Z $)ӝ)'%J2 wE _X )[Y[ 1{ҨisI,(z@@@@@@Hm4@H:#/c "t{HԷKHlY%uf֭ef@@@@@@@ "F~r  @D DMQ")WT> tg'OIǘamg      DA3Z $)ӝJJkål|El "2te9v|8iBcX      +@IDATD" KދtWAD.H]" " (b ̜ٽݻ-w[>y^&I2yOvo}It{‚  @,+sٸȜ9͗O:wN/'/@@@@@@@ "AK" X- V@@@@@@@ F@@#@1%w       S bw@!4@@@@@@I Ol  [cK        w  AD@@@@@@@ "wz@@ "}r       "&G@-@1=@@@@@@@"  ~ D@@@@@@@ D rpy@@ DLO      .@1{# a.@1;#      @ @@ D ?WG@@@@@@ # %@/>F@@@@@@.@1]@@@-@1a?w      /@1;@@Z bXwG@@@@@@ "  @P"#      ~ D  #@=E@@@@@@/@1}@ @@-@1Aw?7 wܑC+  "nټF[˺[7K)}Fq&Zڊ Ŵ:yJ֬Pm塚yֲg^6jת!?PZfֻojƎ%JzʆMe=0CYԷܼySe}&OB57}UE{{x)_ݔ#   đA8   D)yL6hWAܹ :̓"" @88'M'`y췏8hܳ'iުT޼RJ%IF.]:b*c?3gezj%Aęf 7ڪK~xqI(nߙ3gtH>u=zHuX^ش{32,?]d[ϿH֬IIŊ>?@@@@ D 7WC@p ])Sʭ[DMWAħ >+Vo޺)?.\$KL"j~  @؃FT+Ss^tɟ)]( "V^a f̘ #Zں={]Ns/4FWP5]t…dѝ}    q @1P9%  = FHާݻwݑBWA'>%+U[dGvܮt|s\@ 7nw˖Izt~ADuS&N"E [3n;޺=_+[,#9YA@@@A-@@A2Imh6;wFȝws%u]] ADW*! @ D,VL8Nm˙eİ$ J=i?S~} "ZT2Owe@@@ @HCw"ҥׯQåT.Xؘo1^uƍG>2~h)Z޻'F/WV:oqa#d/M%e{%=bPN~M_}RN>'>Oܼ >KğϮ'=+胇 sy;wdQ[L5~O:Mo$)S߭Jz>1D\[ɖ-A/ϰnD߬}%+V,>uZ&˖ޛ|p݋~O|}/^K_`O&`~^S'  @l DmQ·  ADV:, //e˔#z="Bw,3O{ulvbrҲEs34ܳ{WݺuK(%}z 5}I:MğkSۻ>q {3>// â8g6ccm2c@@ ":)'D@F 7Z:M`8qb9}̜1M_8>p^w)U'X5R|Z*^Ţ鑔<=ʕ+' \N*}5éO|}N8Ayn}n+{D|$#h|}S'OI՚z6Gz]n ۷E5jsҤI{{ 1Ji+Ϝj~oMKDՆ޺ukQ{[ğ&+\߿_~KU06j/}}f>|^~yN}ZR@@ @@g>ف[L3?N7Z#ͨ%> # @X ؃7oޔ۹[n;;vh']tE-psRJuaQ%t:մ?s#) .$ח/#27'KZumV@@@@#@10\@@AD70A*_Z=?%kVZBѢ`@⹀=x)_ьgL" >~|RKkw v6~9ufjˮ^F^׹ 2n()Y.ڭlشI\D<'u!u7{]Ns鑟Vp퉓&𑣽>    .@w;D@JI6ܻwO~9Ù3f$3fe/^S'O9c4m[7%ɒ%;wȈBbKIs|5ٕPQλ-_MJ$Ibi֋ bdgMޯGi=إkwٴ{]DR>}F?c2q8+l9zVc3h?IŊtў=?IVm컽^}{\%\K~3?pXC@m-@@ WWԥN\vUƍ~˖)##G u~W;GDHeiR@~WUܖnA*o٢:v7^ƌ/{vpm٭[hRҧWπ_W>'>Oܼ˂ >K7Q~ٕPĽ`{| "6lP_+ 5<(5u[7Ač6˫zDi˔HB\=wvjgZ5z7nܐ^m#jFT˙grzOyouo۟>9wTsog6('(E@ 9@@| 3]زu[p.ϝ8qbQݻ/^/NvY_ztɒ2fwc˶mW>zʚj-+T[l2nDٽcG#,'~(-']tN}sw>|S9n}NmS>+U_#r?Fڷ@kұ$O\׬]W?* bbd1ڻw ڶҎfϔO>˛6k.?肈3$Syqs5EUQtn }'NJZuKğ&+\w߿_~KU06j/}}f>|^~yN}ZR@@ @@g>ReJJ߷W/]cB=nc{ .kDuh^߾n y{TO|"# F >QϢρǙ>x@>|^ւO\xZ-7+VmoT߰o޼)jֱD޵MVƎhj;b&h-ҹK7ne7溛L`I K_@9O\'`yM_YvoM0ojn}b>Ǽ" ĮAl  ^ D,= ">py8GNōb$Im*#r1k@@  "/_No3RzMԮmUoҦ}^p!WjU*[F5≓'Oʘzj>rTd]JnرC]JS//g1;Z\$]t(穛c "zɝ[?yGu{q]nGT}X"vǩQh*4j=:h64VS3ːae/M^@@@@ @1\@@AD6Ǔ b/A16#2Q@/A ^hyM4OnY0wy\E=rvmEr$VYۡ=ƪիW7ՖfϒdɒYta E+œ bzu!*pBr iݮCXK(5~QRD &O+b"D/͚2Jz3 S.igeM^7u RH!}\BE>>s`"-z~YkұC;}n=z ʖ}RdIN1N9)    D  q!@1.Tc$9rN^YtV^yJʡyĉ2gtb@S=#?l qӦJ޽{Lb~)<6ثgiݪN*[m -S9\o)2l(J5ρ=Xtِ@M>zJ&ADSW@@@#@18\@@_(mС_!)S;wS'̙47%WPl۷n͛fd"  ` h]Hڴiycl/b#ؠ^]ɛI~ j&}"].\HW/0iT9}L]83A8   x%@+.*# ĶAuCRL)nS.+ "6j9}J6_+VB#z@QNJ  D* @ -F1 kD ގa/    Hm  E b*Q}*ܽ{W~ؽK   "^ĉ?#Ç :@YvҠn]}|DHBz;?:w2eeFWHEGHt~oʸEMniҸ4lPOΞ]~]1lr֡|Dgm?34iRcN\:uZۡ 5<#w5iLK_ j}?^?75>cl]^:Rx1}W]ˈQc't"FR F&G{T>~QOuJzfW6o}8>/OCn&f+`ܣZ2g$9s/\CuDŽ]N-=A8i~ULCa9{θSǎ &IK$CY䉓2x0YbyO,Eݳ1SLw _dАb]XQ`իZ]zw:ceZT>< "IZW*>/O><)$OL.\(ɰ#FyUwN*W`<%=o˅ˏ{ȜI݁ʑGSW]=z:ϒs? U*W4O7.im&$O\-[6ܹs޽2k\aV^-9r>lm+ u{f9RHɝQW\֟&N={ܾDtK@@@.@1\@@.@ѮZ?&7oF%J$;wF%+WDJ1z Kk=UUo8U>'̡ܸsrYd/Wv^Q_L9bs5g0P*]pϤRKVc |1eZTiMZjeǺ=NJo,X x=n2wmse߾ҬyKsҡF :w(ڷ·WyKW91mTy1U?3#5ǡ< Vp(37 !ꍏ +_!O%> қMqx=w/ƛknrHCgwا6֮Z!>NV3Qxs< by#;|`Q>p@e7-/ݲyܥwޖu_*08 6U~lyd->1Ÿ)xT t?uAD櫷AD~VnPUj=?֭hKNJ?UyfEʔV-Xi="fW^S#Κ9B뙳gr>s&:lL:Mͺ7m6FR=%=WBrբBf+ERE=K?Gxq)j.S#gF.8ӏj5ի{\kթ24~D4%xE@@@ @HCK~r~ԏjj@ܱ]6[7N@⥀9 l.{|ift*Ԯ+#G,S!Wg9ShwEiW\m2cT#Ttݓg G؜m:0 [sfENs:|XzTu^*j7wˮz肈cUM)բ\*ݲtBɞ-2 B*|i.jsg력~E+Q툭EMq;zp}IȰ>c "XfEqUN-_5h,~3n;^}bLY޺mQAE8mDcjN|k:s`?V{DT×^|QThydus|[vS'?_yҔz_QDG|*8~*=ղA}.ӿ/[pPUωz^E *SmurZqҭ{ί]ttjqnYt5kJޑAUfҷOȋAD{ۼ^gFoT8KȂj }$hG& 3zǥFnA- ;@@@AĀsA@@ADFh7oF2eάa`]K:uKD2Q.\7J+@dDukVZ#1 U]ffy(^W?W*ϟj{Wp[ƍ)ywȯc >ZM#XL9:\r1oFݼ7eLa\>|Ԯ95l&/:܃=Ftk.r ژy\a'uݓ'N˛}6T_|H?A@/F}}j_xC9œ?>gΐ|OSa#0عKڶop "֭S[*/8Ib}ҬyK5{w{} YjlݾMmva5z+HjZrE`Zf}9]{JwaA{QؾkFzt|UqP>曻~$”*T?Tf*u߸NҦM+jǢKFoD4%xE@@@ @HCxFV]fJf*MiȊ*j2|  (3SQh.e2\`Ε+)Ν˘&K2("GnTSիM5V\oRFH1 i]>31x6e¸1Rx1ٮ}'ع'A!?J+s;h^pzom|W   _ b   Z bhuW#_и2IƌtŋZ8wDlPOmҼU[I4޷uf#ر)J= @ʊ)hOݹsG m yQS67W͘A]SRQk3 "ڧ=8iܸySTx\Μ9glHASAı'1ýz }D:5 ݆_e{DW폮r3g͖?d>jd;5Zvl^'Onٴ~ONU=}T^SU?b ",ՊQ:ߕ^={HV-W=,Ǝ%JCJ.8mD)TY]O̷x~?xHo]֠~]yGz6D}ѽ4uT]z}݆ ;/ŊI#Sɋtͽ__UvكGDb$yg\݇Åb$8b)L#;_0oe[v]9v    U bP8  Az:u*SQ׮]qG:O&1gLf[-{~AV\P @)`b "6mݼ]JnS2)_T!*+KFIj'O܁" @J$-ZD.[.իUSTK-cƍ1cu=:,f;/jjۘoh:WO9~$9zLLDgh/WGۻwԢe;iX)Vvb4`h+.+WHF?U7FKT+\0_UTW9bP1s=5ݻwZQw'vȰ͑'Aķ%'{FUu^Q7>[nk E    A .  @ Z߲u[p.FDREAP V)SHHYx@!`tj*y_͖'LWiުٳ7OEͷm7m2q)RHy0ooGDgFTKo۾ش{.Zj~ kc9h0FD9.l[dDD6/]vAD*#CD8.CYtQߑwJ]=;w(_騯_QC'AĎYȷ!г앪Tw{Uni؁   @" " "5B{TR?8߷WII8|H̟k: A0zvhvVո4mHs1 EMcz%9x谵[M:U*S~Ҹa]EK`g_ P.ܥl޲ž;}6we)]^jhVec%XAƔ*,5]ݢcْo%@*PVtIY}5+Ij]u2菏}dʟ~+/lsENYKN| czFy}*ؤqCٱs,[R~wI*-VD5m|Vcj<8=TF7k9~ܹsG.(j*XTӏ?Nv:ѫS&YBfjAreZV+jY9sF~^W?nݼ^aF,~7oȝ貇yer%ə31Un*#@ZtY1Q> CWY#*TBjٺ-!|ʊ+ۢFpzO7z]Xa^uDDu>*ĸZE=3gΑDI-Pguתk9kZztj>r;#*Uz/GtADoxDTU~FYb|v}o[iLn_jt՜9:rOɞ={ySuh5LlU_W4w;M&N,GvfҷOo]d >\.S/f|)wmc]}j~/\qz5l֬٬s5lXO>b رwֽ~5{5ΫcǏQ KRj%#X:sjVD    @ Dsb.  AtBk_LAS;z cG˕+>u@G9tg?iHU蝷[#]C֏q^ngɒY}k4EyO^UhVՁ|Cz`Ur`ƗAz/AD(hy{u || #v8mS56#a:'ɬsPC LT8x;5yZ_}TjJ_w˽{dȰ2ut**fr+hߩpI&EUou< "7苞,4w qg}{FbKQ}L0NrLsqƴtc1竹G"5!$E*o=#G@ua h`@@@ D rpy@@ D 'd2\Һ{#+;N ׽DLģ?f\zţTB@ 6T套^BƈiҤD.ZDuGr>"<%h !30RW5QZ)i'NlQ$|HQ*mڴIy옞ԹK]CG*0Vr5]>0r^}ސUNYl= |bZӿTW\D)T뫝X’9Sf+1"bZumJ#O^UpqF /6 ڵm#5W,3K Sx=Y[k[l߲eաҿ]vMu>Fż8ըW̿ѧ}ivώXd@IDATB}q.^GJm${F#qŗ<DTӤ_|h_g^;ȘV HjwqeC6s]UMs^xe͖:reQ(1-fTkּ۷!cdF6UՔjy[z129_ƸOEu1z$OB7S~én5GCsWXALoc5y篪͏.'NHIk/`>*\ b @@@AĀrs1@@g"lRq>].eoz}lsy}:kԨ2,^31ә3g 1Fe\30:} FzɓgOBD/PY07#&*Uf ~txx/k֨#t<1 !? ;41cFMʂ1g QCd/ݤ~嬀A/lvH{=O}<;|{}z}s?}}$>y͚#@@g>q   @lD Eᫀ};oqI67>yjn̝;z6Mc[S:Ǽ{~͘[F0kC4ρH EMUjJ2Od7<0̝3K4FeEcjת!%Uy\˗/KU+1I*W`  _`@@"+$ %UT0y}R:EV'&}#PğPgrJ |OgwwO`e)cFݻ{˂ZeFσ{wFR nY0$w{(>gΞU}Y<>\@Gk@GQg.\ȧVG(W}Yj*W{ƨ|ekIZ^uS'Nq_ğk:OOBs]ğkÏoR-?8")X\ <y0wFS~F./Z~aQ~[@/{~?>+X$/CGd/  }@@@ @@@@@@Ase@@C "       ûh=  þ @@@@@@H#         h@@?"        @"<  "&'G@@@@@@p =H@@0 H@@@@@@@ DL  @p"ן#       DW@@ #      A .  @ G@@@@@@ }  a-@1#      B@@ @@@@@@@"M @@ ^h&MZI$\t9J@@@@@@@/~q0   I&v;zUˮe&?]Y)TpQ/$JH{ܾ}Kv)[w<l       @X D n  @ }٨K#GKXjŗZHlʜ7:wV:ٹm@@@@@@cay4@CyL6hPwA,=$.^SO $M4#%]?%kVt8       ÷h9  /"~7vCRL)nݒɓ "4ܸq /T^S|L;e= @@@@@@@ "_b@@ ^ D Q}*ܽ{W~0F2,\n bLwҽgI41dPLُ      a"@1L:f" U blLy6zJ;#;R⹒'N,zzYq!{ @@@@@@ @@b[ blw"ҥׯQåT>3g"k֖3fԍ;y̞9#ʙ@@@@@@@ @@"3PwÅ_ϗC~*ئm1?iHҤɬyL@@ >]1eʔҹkzؿO<('NTRKbşɓ뛽yㆌ9,|n"      @a'  @\ Dk;'AĘtl9vϘ@@@@@@D btD@Aْs%Ki\j|ҤɤE붒>}zI8Un_9,]9s^:      A0@ ApϚ-dΜE21⩓'#rØ@@@@@@Aק  Vêh,       E b @@)@1\ @@@@@@}o@@ U@@@@@@@ B@@$@1!6      Q b|U @#aY4@@@@@@p!@ E   8k      ąAĸP   D       @H D nQ  @ p;E@@@@@@)@1~+w Aİ*       蒅B@@@ D 4A@@@@@@F bܸrV@@"zE5@@@@@@@ D"h,@@ DL(=}"      @| _{B@D btD@@@@@@DtC1  @`"ƙ       q%@1d9/  G=b       Ckh  0"&~.@@@@@@@ D}˝! a!@1,F" P|9[d˖MRNpMiK>-&ujI2W7~ zWDŽZx@zIɑ3ܽ{WN>#cǏZSisfIʔe࣏ޕg) W^_jA I%Kǎٛhﰂ 8q,\8VGr>">G2e|P%J,'_~Uf|d%\]tlLTȗOr>CΜ=+;vw׊OW}-C[mC@@gYr;  @ D K4IԫZv판-7yf/̨>uR}5ۣ㨄@8 x%#pZ~3BCk֬ [ȟ?)UJqƗ3>jm[=lVBE]SKsyWˆ\ޓ?"wzuK.Kr:&*{y%KfykRJe#T(J=*&O س{ni߱_9}(_)T_犫r/>+,E r<;{|gbj{go(ݺ X >Ϙqennk߶`S 3NƎ^F J ]_a #S'MĉݓLaG* =>;->oVeV@@@^ bw!7 AFM_9rXݿo,_vRh1)g#ŋeqS@ ~QZiӫgiݪncW^F~zI&>驓d]ru~ |ˋS)]JFc)2l(O~׮]J?!qVl'jsf#{E5juңWw)J. M2I|qܹ#o,^~o 7[6|kk:[۞'FءTVU'Nf&L,#F67^\ʗ+Pq_Ҩi33+qyT\ c<_eb'} 5WXSa: %,PAWw={En_.4iH ,:pϞSW/0l#  L bi׶~owK[o~D\[ɖ-ztAA|$%K>'۶o7BɓT%E+WޯaSm-[y_/~\m{ĉtk_en{o_( :̝}Ҹ>zMvUoA_MTeǎҶC'GW:JNv "D?l!3OoMKd:jC@@@i!=4@Ct!)R[nY\$ش˒-D 9ѥK1Gۘ;katjPi;xye= ` q^+&I1Y&; b]D^wDF@]ix^OT޼2g Ћ-eWrhԛaDu\&SEDtpc ޻ʙ3gr6K4kRoӺ=bJ<>=Xv(AEw'tɟ) 2Kz]V: ,j4 "x%yO/]CRa[='j1U@@@'@1)w AHާ?T{.RT78 c=!uuW._*UyYMQCQX)6D,,4齃tTz JW{i(6:T*{o,޲,ndd~9|YrM6CYt _ligʶ;< -!GLI1oI@7۽LL\y.KoQkQ =9.ߺ랡8 }kx`TTqOW[J\9%sG$uԂ?/#GΟ #ͳ%۶mʝL w>H&3kn?IQsi7eA55/WVn|(ZΝKYθEXҫynE7A ={ݟI`EWP'Y<2UJrP9~uk-DYR㢔V? MyRJH._(mF }<+^ :@u 5kVG2fNu7)/ʅ{eg3Jbc2mp#3JNRL!/>, 8z]U*0[׵˻$ۙE^v~rfi_KmfWeHU~8|?]Tf ǎ/R{l&u ]|ݷ2i'~Fs(g9l KK_iT͹Q} Ѹt`=TN=C{r@QW^˳xC~*=w/.g_C&-9rdyWjFK^BD[ثٴII)C4n\ ez~zs*qHHHHHH 1 ;J$@$@$@w\(1Kz %I$c6UyIRl%K>^,>"y]׋BDQ5ʼFe ٢ek]E];;.whܹ˽K 6ۧGx"3>Ӝyn9}$QgoܰmJg-\X:uGg Ҭ$TQTPޫ)^OY0dW-%h+]~{jkrR^ݠ""Ak&!dh;|½O6/}tQ0^vЌ 4equ} ;d]ܹr_-2l='I䩧ڰ ={t;[! $Da'ѥ:Ȟ={"}>R‚iNZ UN&Ы~Ҳߜ~> wAC w><`ByáX2~qގ:@;v(5#ATz5>%7I.aj}T>pܴ:|%@X|惹ݛZPL ho2"w#w^gW0h {=O̾P1cVw|DcBhy\;H -Q"z+ 4W%JM9t7+C*=4nj6ˍ80^#P0[Ӡ1>bCG=^5b.1P8w~!⊕Z(,٭vDCJs^{<+Y4"yKW2xt~'ʽ/uq drNkNasY'sQN$@$@$@$@$@$PƋ%   DGB;Mny5b !PPB+c?]ǏDk{!"W P)i%,z駴WW^0ϙ|xÇ5ʽBBʭ9\ق _%}\J2h3#D,U.}NiԤ,vQHNB@iҌiSDzM2Aog!>"cqZ/z~ 5BD]8M1٭2!"Wƌn" 6J7X.@˝]JIɣġE. t3h'8j._Βp]cFEqJ QBy%roHh!89|a}b#Zu+gTʩiv" &pI1W&[ u!H4(n6l$'OyHٶhĔ.RFgS$(ەI _$cb f݆ rA5]vu5} {__ ,Edn!bgϙ'tA~)!{hlq-SZDe=Rr]uaz=h 8F=9H_l[,Wxf`J$fo.)pڄ=og+SKu}Og5WTɘAw}Ep*gNL 8"A|4iRnz#2yڵK2fʨ&}~<˖\6u$D1+Q<٭< ˒E n!b$s9N8KrD'NHJVR ^űt=.<,B<&LgϜݭ!"喨k.P#8~B֨OƇw`;p;~.9Chr^_`a^BD<7'}'o*[Okw$!"prQv6Gk֬ /LK"\}緅:u~k  9kV=o\r>׮m+ۥp͛=SUN+UN^BDs_G? JzuϘB~z[Ʋ˵'W&      EBĄ5^- $:"!ͯD]u?7{1]Rڥe{eER|wDDx a_ Tv5D8R*+ۼkxN'.)(sEGPh\ H(^]UTe N4n]n]Q"r>bv5U}.`151 f?D=Wx1-իeܹ>.qv!-˘Hz" |*s8%D$pC60'~!þGݮ*95lPO2}oJP`)p5g;owTcv!\%jG}O>U6`I(w?oHU9pPӟP")1Ca>hVGYzsJ{=m-\/wΜ2vH "Ţ1ZAJ8JcEdS.a ؐvzyw}pS&IV-uj>=Ӕ^F3f$c9<7Q.dǶۥq(w;ebr+\ fQjߨ~LN(ٲeVuXA؆w!;anQzωra=]7mk>g#26kי]2.ֽ̞;OlDPFT8c#Z7C$gs8آHW1g3Fn!ƦL~ mJ@.̘?dtMGpqW|KϽlUiܨP >6y@BDS~W7.Z?LX,Q\gV)& QBe= 3f9Z 'nUU)?OFJ端 [u      KB;6 (D NZ اS&Nrm+AzpBDȃ{zk87*}@~H^m!0_X]JuHj;ۿO!E @ᢺ-DZ A]'u|3S(+iCW/JJHSyP Њ&?҈O"F2&[qg ԧ@ G½O?|;T:v1{eB"BPrUSM/и^`("]vCwZ4dȐAgIQL%zYwgo{v+Drӫ;߳b-߹s +BM.숅ǂ-u`a Nry=KȺez-.q;E:&C8M]AHFh73؆#nFɒ%/#ԙ֟`\֑o'D&Cm?ATd uPn#u"+gs[0lr瞻Lz衇:Ո1}HlܙGB[ )cPBDG<?j1P UDz%#[l㢈ElFumy;sN90bSs<,!D,~sח_9bRnqju3 1.WLBaބ`?z옔hkG'DĿך_pD=@bOTɒΏ>t+WɧNa)% @ @!bHHHnX"ƿSMN=r\xQw2&!bE$g\Z>blb[@'[E<ǽUȽil/Q-bMMbb;X-? K㞂|3l!bf-<݈P.%[|f7},?)4`v+oذIP#'^BɛBPfΜYW V f]WNB-в7j\/c`("}h"Nu3{;+$;w& uJ[Sȵ9 y3X!bݗ_7ۿsǥ.];Λ~ Ytv{ a1I=/(Q31P~BD?=RjڼTX!F!>p]<[InY% @!@!b HHHnH"ƯaϚ)U];eN"lL0֩8ɒ:n(y_l٨K8|.oPUnV(O~&?WE}-L8}n{e9~m##@(cbߏv`^QyJ7|hp1PVhi-BEv_Ȕ 6ǁʯv>Mvةus=w-^8 M9$#IfzqN^{9z.b13K8]q%?/ulۥ̔X?ŋӛvXYP#G u" >}:_*/I#=̫Bu`Vؼiy+n/u>#˖B Hdt5# F(A6L~6THvظl!b(B4gS]*6%*uucs!إ-9z~}pr*C!M%R S`\;jt!>Okq(JH)ӲEs ){U$s9N0Kz7q,_JorB-pŔF&y<&p &"z8\qO"})9cbD`7ŗuxwi}6m#3[yebzG̙39e ;gύ[7obG-¶LT Iз*Urjw%BGAs> O"qaHHHH!@!bz w+{a?w7y.[q=$I$7U2CU(Ldsn3-R@跂EDMS$93g8^9!D97͜q/&Cs !"hJc3A(U**ܳD]v‡W|6}GaFxRlWn ۥkwbz6ҰA=/Р XA,cb.Kp[)قGE)@@IDATKXX C~CBPvQ:l=FCjת)pB:rT\ճI[x"_<u`w X!"~GW-2wάNSEP+vի\b:Wh;ZZR=_sJ1&<7M?]J.xL};{~2c*dSM5\rsz=k"Frb+WI7;~'+veزQ'OC˺7Qv葒+WN]-!b(s/1mV!P&C7nPڶzw\QiS#PRևwS>w85R?Ngܲ wwYghicǍ}v=[xQ)_0(g .=M{%D;zぃ:-Z0quLw~={}1=: &IC#@>'g|س;?qB<$mhO2If^ǜr1I׭oO74n* o|JNp\x~v9N$@$@$@$@$@$PƄ="    g/PH9BE|^YdQP[6<~Ƞe!KN<ʳ=[ ͜Yg'B2QĮuܦB^tgW$ [8`7 ʶH 7jbWs֟}pgh"#0JMjs ~tefRlYG4MK K%KGۯH1)U=vaKWSDxo8 ١^= pӞ$Dsb?1(pnz,W.syڼN֮]gvBPuA ]ju?68GO o,Ty{Th:].ù"S,DKH^8zɟ?R<@|P~5rU}t.T8۶]l}Dz\"&"u(q E:&h;&ꇒz a3;d*D^ա$ivA(,:v Fuw cGCB8L aqCx:k\kz(sS)z]є[HFwe%.mZ]uڝ9sT ^±M2z8/G¾ɓ;>|m3]kmuu\~lnpE7 b%}nPvME][jsa_(QYD$@$@$@$@$@$0P0Ɖ$   DKBĄ3YexP(L_ ,(+w bn5cF w#霹m-)ʔq?~\ʔؘP"+Wx^$S&4!(E^=žAo wLL#<7M.mQ.l͚urO{֭$]t)/q-DD!w6m">YZjd ມuN\yC4ؿo)Qnʤ)Pl:}YryP.FȜ2q>KbN_=[[nqZ $DDp.Vlԭ &y5G*Q9]/XħU/wk)0O 5&H6lWcek4=OCC3VKbmgمt!٥ ~zu!+if٧0PmʙC]ŜNyDO{ga @}cti]NJRI20iǎ]>1[v~m9MAӃsbU$<^mV6nlKNYt*siLm$DXB|,Y2]?PXf~6nPn%>r 3oV .i}w?$@$@$@$@$@$@ na   H\(DL8؅] $V{yUb[F'+p04iӖ-Ңek,Wt@\ot!mRyFڡJMy yn}m{?͘zsq݀#/е} 9J@?}GU?I/wGqBD71׈aC0Өׂ"z5yp6h'g3KwZu`"DD[dZz y:wJ(2!bLۙ^H*|ompĴBD?6)P}ҢUf."̺4eBH<8C ;("P(sh+pF`RtBp`.qָ'puU/YźWUGi2e ]Kjsr9f%!bf,]&~g7eY>y6U]1P9'\؝0.֬tM[{-sv8"7WsNs䥗\!S(JF]whjP?6$DD;px8vjہ]$@$@$@$@$@$@ k[   Ht(DL8C/ɛ/ޯȊeK-ʝ ӆtVWd[zm)Sf 2m η!^С"fF4B9ڢ igVѷGn&~_W4ɤ ryBEz9/T[+h*%X4 .w:IgL*О֕,]8 X.}Hga ^W[H\9sg:'1܇ʔ#~>AS8i2vx;s"ݻJ9>Sc2vx%gB0¹[^; tȰF;U}tYgux.g3t9z;P <;AJ98= *Br.T~+:9_pc!@L .de˔m;nwwC̛lHaF K#VSzzؠ> g}57rhAR\J*'/̱cb8!{ԯWW;kըskTk gLЋHџo&vCI8u|(}BHt܇< `m}G7gdʘQE爈\K*W-^P+:wyLZmZso⹷s.BG%*Թ+yʑqCӧOK>jbNA^:xE_((l7Ȍ֧ՍPan>gM83}ϝl_\<,(Q~uE9fW!N^ȁmt~a#'OR*x KBnfڱw6~Lѯ Yjn}/C4i)'p&/o7lHj*W![;aQʱ<0HHHHHH q1q'φHHH ܐ%(Daҥ?,G@cs֬Y%]JtyVIy>S22>,_$Ǖ%snNuLpeQӥK+IoYxvlb>/pɔaǟr1*Wᝏ)(q]}^1=rwMD Z5VM<}g3FĵOHԩrQ׸e;SΟ= j+< -ɩv8ׁ]?.},xZܽ;y'o?}~e..EuYts9zXΨv!x/ Q ;C2ƹM?/g56vfq^'=W_Cdp-:;?援iҪ]D:x(n/3gʤ[oLhsFqW=.^Cڻ7z++      ]".OF$@$@$@$" C$@$@$@$@7mB7y$IHHHHHHH& 渱$@$@$@$hPh'B$@$@$@$t Yd%;|!ϙHHHHHHHHH 1 E$@$@$@7 oi DKK2~TV#Q;if $8"&!cIHHH q1q'φHHHH <]+U*Wr*z|wGN>WHHHHHHHHH >1> D$@$@$@7 o橒 $J"&aI @!@!b+HHHHHHHHHHHHHPEy$@$@$@$@qFB8C 5!@!5FIHHH%@!bXHHHHHHHHHHHHH' 縰W$@$@$@$pj( @"%@!b"X $"&b?IHHHHHHHHHHHHH\K$@$@$@$G(D#< \#"^#lHHHH 8"ljHHHHHHHHHHHHHH 1 E$@$@$@7 oi $Z"&ڡ剑 @ @!b'HHHHHHHHHHHHH1  3B$@$@$@$@$@$@$@$@$@$@$@$@$@׌ -&   Pb             (DcÞ ABby$@$@$@$@$@$@$@$@$@$@$@$@$@xpyj$@$@$@$PFI$i[qzܱMlG}LJ+޸9t;$@$@$@$@$@$@$@$@$@$@$@$@$@ xu   H (DLXK!C|W-YlcgsH%}d@&            H(DLǮ @b @!bGyT*WјΝ/˗e~             H(DLcǞ @ @!bƖJɵ[oIv*ٵs{?9HHHHHHHHHHHHH b"F DBBH]eW'/w9sRx$@$@$@$@$@$@$@$@$@$@$@$@$PPPF$   DJB;iҦ:J$Idǎmr+'o>a ︱g$@$@$@$@$@$@$@$@$@$@$@$@$(Dk<  }pī&[Jԩ?C -D|tS}>믲lb              P9C@$@$@$@$ #w W箺Λ=K1$!WyM^G$@$@$@$@$@$@$@$@$@$@$@$@$@ P@&   BB7)S nS'OʧS&N?T)SwީB#dڧĉ#             P6V"   -"kN6]:ŋ񘄈R&iҦÇtƗ^'o]_pAƨvHHHHHHHHHHHHH 8,HHHH 1~ ]lH2etv)Wp:)b-3"QY$@$@$@$@$@$@$@$@$@$@$@$@$@ qg   HD(D_rmu9IV={VN8.lۺŧ\&Z8Ǝ~-PQ $ "&bWIHHH 11~j$eTAwҥ2rؐkH*d?w @&@!bHHH= C,xǝwyvꦛnҡɤ <˻3[VH /IHHHHHHHHHHHH  ࠱$@$@$@$PpF$O||W-YIo+WŅf!EQf>uA$@$@$@$@$@$@$@$@$@$@$@$@$p Ppǎ='   DABĄ31 ۾?^~G< OtKn%^̒1I$>ٯ얕˗&gOIHHHHHHHHHHHH%@!bxHHHHZZc"޾C;="r,@$@$@$@$@$@$@$@$@$@$@$@$@$pPpƊ=%   DIBĄ3pŲ%>o޲L'lsv1$            H(DLcǞ @ @!bF$%O&3g[RLC5=|HN8 @"@!bO $8"&!cIHHHHHHHHHHHHH>8A$@$@$@$(Dk< . c'[#   !cq             g(Dg FBmy$@$@$@$@$@$@$@$@$@$@$@$@$@mDy>$@$@$@$P%              ]@I$@$@$@$(D[< 6 c(#   !ba             w(DwC EBky$@$@$@$@$@$@$@$@$@$@$@$@$@oLyF$@$@$@$P%             ?"!a @\1.iX$@$@$@$@$@$@$@$@$@$@$@$@$@$(D}lHHHH "EIHHHHHHHHHHHHH 1 D$@$@$@7 o湒 $F"&Q9 @"@!b,vHHHHHHHHHHHHH<PY$@$@$@$@qGBĸc# @!ⵠ6IHHH&@!bШXHHHHHHHHHHHHH% 尰S$@$@$@$pk) ܈fL?N$:|7Fs&#J޽G{[n8:2C$@$@$@$@$@$@$pFx$@$@$@$p Px w!/_$@iS%y[믿މ]W}J2l\xqI&tR4yT>cf>3gɬ9s厸#0qɞY}S7~]*YBYN'zg6^~ItW$E׵˻CΎ9ZضMX,Q\ҧO'KΗICr"&       kBBk KB`I]rI"5W4oٹclٴ1` -.?HR hnʅ ԇyrĉuldy%~Fx^W5k]WڮwKQyߏk~ޜ.]:0I>8/d<;5\oBQͮX_&{3 ~GRacϚ.*.[.ou׫T$ݻuNex6L|`B/͟#2d-׫#@gwX!jXttx;@X)LHHHHHHHH v P< @(D u*^KQtᛯʲ%<{S:rxC榍Ϸמ„*P@| y$>=zT} 6BΜ9s; ^ ^!Cy}]tӳ{TÅBĘǡEff=hG+d\Zl%{3 kcO飴Q/_yD =03q9Djels.Ǝ|;&+pCI \_"^_<: (D#<*Vh !b %X| O8.~:&7>%P_l$۶R475m,4kygSβiKP?{S\  }xmGJ 0֋,*ww޷fͺhE N-֊>Q93މ'tۦ1 @\av|BD6u<ʑZj#7mC$@$@$@$@$@$@$@׊׊,%   AaZj+ɒ'˗/˭ު%DL4oZb?2{t9vOEC``Rh}p瞯7|#/^< >}ZJ.ׯP?_#aPkv˗\tɫuKh֩[RVM}h5P1@'|[B+H4+WI7;$|<       xMBx=< $~"1.ܛx?Z<宝#g.a/!bǣ\W˛UfC^:tN}|7>lۦ4n@ >RF %#oym=T6I,:tHض]>O[*+뼙gtukz[r{Gl*|4Rti塇83z8O78AֶvʔayL&}~ORa*Ŋcl_={dmsx3I$g(1_ݻw;尲a&?aO^8<{+Y>)~],Y*k׮ߐG3?"_sB[cSVPAɑI&LB.]C>, 88 1|`Iv˭v-ɗ7<|_uMO>TkŤ脈jV%K$ۼnlӪd͖U.]({˯ݻJر{?ҲE33&m}ѩӧdG'Ng}F{G3< (&?* cuGI֐u/U)ZةoV,\ZkuOtTqEz/<(#7˕--+WT~ru^+y~Lz.ژ23}VTQT!؄z!BS7m̚1MzQ{DU͗-wqr9rT7s.<ԯrw<j:lS׾^ݫ gbύgΒ˖½ާO_g Mܹ52O??~^b]?^8p'C;<.=wlڲY{>\\Yن>#wyx͗v }4sf9w75/-"՜hNK1O?-U^,sR>>P=7lSל#2C}-!"ilzU-Qʧ        &@!ble{$@$@$@$@!1$\qZ88[^CI$رMCͧ%D">Bt3qW,fkV.{[~:\0̛3S2e(Wڽ;{<)^믿$Ydzg^iޢ#W޽_Ku:>[R;mB43g'&h_  ~6gDTݻvB W7 h|[œf 6BVP׺IR֯WlF-7S&)aP3^ٺn}YF.୎(6"bԩoJNVoHwsL#".b' q& y\Cp`}6s~.t'O/)Rg2 &cѝZ4o&M4r8WZ ( Cp܆-,lvS>}lgufp| zwܡS8i+_yOqxbŒe =K*!}D "Haخݢ4Θ^$^ٴav tI8BV(q*DSݻuN<%%˖7UgNQ8 IXQ B0]S`GlHμoaCQ%ѝLAH{߽jceȰv$+>O̜F jw'H˗JN @P\>Eh>)x^U|⥜9,|nˬ˯<:=où *$7MǸ^|3ɞ=J]ttxٳxiԴ>G=6el q kW;SZ GE$@$@$@$@$@$@$@CBVHHHH$@!bZ-(ehA|Bko(a-rV}]ty >F?[(Pc2U*)[!-05ۤQCҩ|rr4m 4V\'q (V&   6+sW͞>oꏸ"~] z̯v6ׯ1)'h1еM7 xdi"ZPQ}~۷nΒ8Pt kXtҸ+N~qf?A cF^vS+n!"]UxѕV9 '[aGD; 8%lrv sň"n\Fa[pH۷ocߒEn f|1!ݜ_QQ"\/%ƌrs]מpרWxF A = \iybC!m;lj{AuER$cu`X";v)gS+֗0-N8Md|طSKx8PکT>::̷ڷ:/C\ܫz̽u^zs5oD^m5WE](7Yc~z7T/PШnyb<k 9!{hlZpv: @)mBD?#F#F9-bY#®] 3 5uBYx1:5wE.\U¹l!""hc~lX ۶@M3X<[>*I"pzRQgƳs6™(\T:_Gm_x \+"^+lHHHH (")N rC3̩')sDLH- "ĉ||*r# ZT5ad?`=<[rKRGu|?{TVq $D⅖hNvr;E]۷j78.WL60n7 ^eLF|BDBKdBJ# fu>'L;);[%Xp \˼7\67w@hc3K8Bĝ>w\>BLɾNq5jEz ->ŕ?f̙]ӥf#sF$ly""B$Uo3&\v?lphu;5kB@a®\A6}D= [v $^GyV#\EpI+VP჻͵KQa GJ{|c&,ZMՁJѢEa#)ZҨA} "Ĉ&sBĞ 3fΒ I=tƝr7#Z[8B0HНpȶS=wyxz4sfsۡΗi1daaj$@$@$@$@$@$@$@$3 cf$@$@$@$@אnMשPҦKCڍ9L,脈~4nڅW.ԅP gkĈp9vv1;pF\g;܎V.[H^L~=i l7ۿ!͌4i^w -nD;p4)I$zf%(GBz+UϿ*[#"1⓸"Qݔu8i8faAKS{ZvV &cƎ-0].Bb;.!yx!%h.]#w6w0g=s!/靰хԌK!"{rjN^coz(&bHp%Yt)1 :c ,\]ݱzu_3J:uOɒ%q@8Eh96}EVZ il޽_kOjܛCjt85]cy-9{٥oڠC p3]+ժD^? iDmD"DlҬk} >O87j̩u`_[;:K/.FsvC;"l8%-D}}bNH־ֻNpm|i~ΗvS)A'      bY    X'@!b#ٞRe6v)WpڋNB؎;lcd۱c_g?7 Dz<*3B~% sD(d ~6'mv۩Q 1"K$]ڴgJ/T^2˔>H ܡH!7ʰa#Qj֨pLgZs@IDATK!"kc꫽rX6a!:.E:&\v(]7u8ڢ#"Trp;Ahr E jq%J& 8 Ɉ?Ħdr=wkXQp}gdXMg{i<1sޞ={N>M"GNv(]FaWP-\TYqۉDXx7ccz-tu?¹l!q,T C#N̑#ɈmG#?#-D]MP+7ĵ|iڎe{KQ󊍶 P&m    8%@!b`M_i)ݖZþvO4J4&MZwY9y¶mݢھ Q!OV)s5Cen_#v(z  rF y" 4t@)X GHsgϐG2e^bJJ(w2/wCpu¥pK۵Kߨ^J{=ffө_cΝY"m۴NR)Swu/!]ȈOBh4?*a_ի¾1 -^i&-J|%g~;#\GrDH }iԴ@ +yd:6gϝ+ݺXKFHh=^neD"Qz-[V?qp#7a_M7lty|ZׅIpR@쳗ܛgym2/1- 1j >zlIׁ {=}vJ:f#q'8nڼENYwwJ&>r'nwR%2MDz YWýsܘQ+g aϷj\2u__]M7}o˓GF۲u)牙q1 m3[p￯Hƈw5ru9w[K&4G{]6lC;tWv8{)uD 2bq)OsngYh^       (DT& @(D Ul޲ *c]tQF˷~ %عE Q0Ǐi:U`FH>XXe܂w"U*WyUՐ:Z4dȐ!%""2>>\ʖM;2L=m]g".;vI&QHʖ.%%wP:~xf*D,ViځNZ^iImAqaeLBD#Z7\Ν;/ 5Lqi7wQo-P(S4xNP(/n.9K$ivwlg~3J(~t42,N$g[Ȝ8zH -NHer ThbǏSb%mZPmiTѓ"PiaC8n5{RgN.9lr?֚@@@@&!Ba^WMXD d?|p|ڴxL8zʓ7cz uiz1C_Qر;5iܐz0H"5fH9[LB vD;w͆Es,NI'.K1Yie4l(kdĂ%J٬hf֮` %>Pu7ZZǏ'tEx~zӧTH C9]8V^:DMz犋Ns[N=fYKHY+m.u-28&$!"WIoyzsQ)tQ=EN˗.I!Xʊ ėBssqvњv-X!Dtn|Ų%ݷdvz _,|nMٳyfԯG}}0JZf}w=.z7SrԩeQ V!-34Շqhb橋Uww3sVT&R+o/X)|J*c)sm!G)>{hԽgoؙ}}~:Stn!bH˄4G}#Q@@@@@@@%!P@@@@ Dt+PPb$6*Yz*R8ӧhǶ-z11q2o.8vԬG`Պ.mZ)d ']Xܷb8[BDKT)SҺ5+C*TjUL| a? ɫ~NM .&Z5搫GE]֭fyL1T_KZly}>cX  4ÖΎȃBD+蛯Si{}"2T(e* ?TCZ"pRmYб_-`bouRɅ;ug> .H۶ue~Qk;~|Z.caYKז3&NY|i۶9ÌWBd\C8 |8a!8K&e;M4),?aYpfnJ#|5!yKeׯ_jZz{ XU| Ui}+/mgfQ۷"Rt{]` _8do I"vK-7c3ԸY \T^gr44ncaiZuy2U*;/ս]=֪Q~_vHDjh       @h A@@@„a-7 I-j4(Byk"!ط="]\ʚ-@ؘ] DuD1lڰXz2;>P+ᠽ~IsDB-55B;\fg+BDߜY3w8̝G>E2tR%db?BZw/;Ҳ%(CdWEBDEGBBďݩ$DN,%kr+kDEל~ٿtaBEsf͐g>Թ/U,B~G߼ӧNogPԶm;d5So vO<^>6v, ܹpx?B]eYѴxb+.ӫ5jjkkBDF5H!8V(_FfehJRX  rc[<&R-nd)jّ(PK!"jќvU}fnT\ǹkVC #;EѣGWz}kr=]isQw$S}:p')糧n!Փ$qϦYcy.!"̚rl}b>3{\w=웝-c0wgV -ϟ?VU/SU|%Cتꨣ˿ȝOe(qDdl ڴ6} ^yBDz"Dd15U )D37so!2;CKϝș}El,":3e7nP5A@@@@@@@a": @@@@IBDw ݾ .B ?4mߺ sG3—JohϮB1 =ʖ)-HC 9uNچ;d7*߮C f¤)4ڕح>O$o ZvqN)B{0T>n4m bGYBE/Tq|1-]&M3lphFPNZ3nܸwԯGq\PBEK" C㢏OKJ"%\Zae''.Y;usL1֭ߨYX%C RvUڳg1[[ILfXBEmU!ƧOB_+E.[l >B&Y(`!l[]"Ñg&^%>;'TJ%jMI&n̚t:{dр0o>,woʚ5#jIm {wq3Q{tU`]aiwbӷG>"UpCˋoe,o(,]Y2\4o$\}w~Ro9VFG .r@.Tp7MsK(1ϘI =]tn޼9#akVǎOo ">}L, +B3.C(e1A8YY~MyRzp]?rj1+$K^x%Wm:=ۑf˖ERGG:?<J΋0`wG,/賄ѣd9 3P<aݸn׳Qϙmz.޽t9&^Cѳ~& <ִBk:zCXTӸt]ÿ:ؕYkS !} ~װw )ϙIH}FrXfʔ޼}GgϞ յp7ΧOĿ[n zf1u7uO        LBDJBď7dMhܹ#Yj{!byEsu B;OE ד9 llj   o\7o͚'L4nHs?TlyVZb 'VG?o׮@G>x QKĿw!@X1,(    6 @h @ TA#%ݵY!" E \r!}ǃ=@@<;qٲR" 3g!ߺ:5QjF          @Ws !,) pHٳPoQD('E R8"vn0vV8vH*[\fzqH@a}fS9n1m]"޹{ʔh6?\LBĐ@(1kp)c *q4pUR޽{G/]{Ѥ)~n7oݤ'N#*H2)L+ɓq/^^u RJE?Orv&qo1'N\:4j@cO8L @@@@@@@@  @p5sFY)E/݁uT!iƸtԩ""ؼƍ#yݾ}NzZ!>/^)ʑ`F}XDSgvkޝKvlӡ"Κ:2gH߿Bx|,ӱ]kjܰ֋;nY%k#reKP& }T6x>oRu<9@1lyn    BBDY`Z8eUXѬ UN5Y="wlz^sB[!89'+WP SA;aȫySp_"@s|pm+o)ڽ(sk֮wm@+`԰Aġ9onnr /Sg|Aa        aFB0Cx=i5y+V,zňSV&DڔݽKV :@ Bm!b|yiuhԘC7;wEփu1^>P[~!UZ+L9B3ijB.wCjՋ@@@@@@@@ @hW    ХJt~+ ٳg)k֬r kժMI&mmBW\G/Z .HٳeSرt pMA?9իRexB>>|.^Lw7m+/CU+Uk7lmweIm(C2kqt y>v0$'tF"pU)K,2GiȱzWAS|nAiӤ/SO>>zDW._cݸek6dѕr& q.ZJǎ("|ٳOVoNjrA|1ۻw%–Y3dI&eҋ/{飽[ЪoۚҋwWSQME?OlsЩE&TXJ*#HakQ>vwZz#z^TҚ#{697oaya kJb7q?nM~ɓO? lOݷԹC;yl*Y^bʛ;'^~94c g)Xcv\j,w>(];ݷk`Or{bٟKվ{Nb=ǏQ~P|)k,ZDݭwH\+k Un4@sٻqt9QO38rNńd\9(ARyQ8ewJQt5c\NF*ޱtuG߼i:A@@@@@@@<0@1t{ĉvR@u)zx.٥#BѢS //5tUʰ 5BO RoTp *ER+TQb,n(S',ټnŌ;6)!˗ vxQң4;rHm|Ь@إչjU:e݄ti1kBD <ҥ ږ;c..MLLB 7(XE㗎oɴbjp־"2BqS~,adX0{RW\I֮$O>2ޝ[)ԮĨ X[HA)6*|8Yi 1߷7UPθV'KX`#F{CUk綿S(^fwҏ,w@ iSQ }{iǹ?ɫu 1#΋~LRՙ>xV }tU# +͟#y_ lZ{WInTF5yikϩDs}̝%Ћ/)0p/UPV+UMѷi]w6 ,r'/Y?Ϯ>'w!krP5>  lݡwʢ"y4~_5;S{I;@@@@@@@@ l@6q#!-6ƍP\BR"*\X8e=_xvخaI@ \Jqn޾%NϓɡXCcdW!y!,}MQGyP ,Wl:[6Mi͍A:C͜XU,9+ݐTjV/u)s c3 WCM*UJ*/7%ۻU\Qޛܵ^zIEdDd>&D?0C8=| G5O#6kcfp/)+Wݯ2p0=~?;ck!B5{s… H8nwSyjiefvBf["E Г'O?&"5 L!9&TIY epSv2kpg`6g4[Yާڳo\CX֍3+MI -1ɂ93 Avc;vlT]:uhCL➦{乯^X Yt9ӝ9u%JP^[ 9+ tWعx)[Wָ`|4npy9?`𭪾GG7d`*]IfGf롋,ד*_e}?U'EUO%qݦCg#ر&X }V0a)`cp? PZE^fML3gBX]Xn˱ E~VZˬkܰŧ,Ft4 &o=Yض75oHjM4bXj֤k-vbUK s\~',7K~}N<Nsr\;vC,ՠX wQUGGjDžf|nh;ޗ]@ժZ ";[XIwtsb)D/+ 5{w6b= 3+kp?^RuYSUG!!F     D Cv*v8ԸIjeW-qDd1Fj&!Ǐivš.a Uj%Œ6;vͪ,i12S!ؑVf]\i.h~BDNmUgzjkB7]d)DTR9YzB*W,YNQae{G~!&kW^ bK]r\N4p Igkj/Y[[mg% Y(quCT6l*Y%T,j٪4-DԅvȮi*eJmͱԲ#B8R8qX\9 w-B#)@֟sg3/T}!u&>g dUvގEi1yT{#׭ZFljCz:=qR"N={S,)Y%vޝ2qdR*D"Z~?}B:`Ŕ8= fCJ}"[##"T].%70 ?&{tFXF Jyr#t G`DʕS)f Sфµ]8M9-XdJw9cԑD8am C̞62e ҝ};#i4q4y~(aͭ[xD2fHO3ih3ʔ.I"oU{w7V-d3g5=Z u;"NgDH,)d6g'OsD<^Oxðexl]湲5>ɄX҅jZzAxbqvJ#U[uTB?ޯ!9c6|tTK]h߮dW"rj G>S*$ KVw<'q4}ݮs}NaW؟Ė~]B%0#!bƍ@@@@<Dg%A=s/TBĨBLJ:+3gxd#hFLE  q擧Π[0J,/_ȼXzUYIWXҠq \5=.m,bJ-OKRQFAZ!:65s'6ܲA9sjڪӓ. ~(!UbxEObRYƑ.XIҨD"N3Ȟhr2|0Tb;vTS{oB,xs4Qr36KwU{W'*d|hH{FgJIuXpPe*\NtSuuW[Ӡa&;.7GpDt443ޗ%I!947'%UpTwes%%tV3m|EB^-@&nq7n\b zM$%J$ 7;oӿ_O4.O9s唗nߢuk֨"?HO%vYb )rng͙GWUcF ~ڔ>0 wQs/-J/۱yWqTjMʙ#1DV kڵ&v4_8] C7Q^{] Y'ğPd!~vM6;nڲMoӊXd;ɩK`2U/sc/vtlYm[?ةQnd* MЩBZsԅoy:B[L<~)9ݻ}oJa-DT.3ÀA3p n)DN_~9_HDžg%ϑwAn;vRw(W4G"MYӳrnElOr{EKVCkB'sמ SOg~͘5Ǯ)7i`z׭M]:Yn$]C-1\׋׍=v5^X͂lGw/ü,k lXɔŐ,/_p&kn;rxZvY7xNt!" 4Zx)X@6?ɏ.7:?"5ÈA@@@@BD7@tcuգ[1jԨ22Gъe˂O8 ժSG7>1F6J3*Sj~LG+"'GDP#Dŋ6lJC/2Ïғ ?yŮx%Xb'O\%ExAlY3)ewXnCˮz]J%̜)BSHh.mYӮ,BlXX=zWakW,dɒfC[ZB%̫:f|JK8s$ʒ9ObK͗jը&:uCCԤQ}={;mǹ?ɫu uc'L+W]޾YSucpBDGqcqy_b΃}WTZ9)fPSr굂89qq5kI\ q=8lvzz'        ABDX @@@@ @ĝ_(W\݁6;\ Li Ҟݶn%mZ駲OK8]x,VC ;xH?Mgݩ T1kuAkšH!VS޽A$jlYHNJxv<]RUSuǏQԪ]'5TG]@d7(ZS{lM^5SmΛMiZ^pL?nZJ'kuwr>rCfg3k!?qATha9m/VEg,lд]K*e :rr˱A:۱WمBD~WZHzG 2Dȟv'T\NɒҊE)f̘2!o҅?hؤ%]qC5%]f}*:T>\ Vb ϝ}Qs+B%*DgCD8?P՚Z|# DtZc"sDӊ?~,G/?#P nFtpAA͚41b3"Nzv-]!PnXV #(rEJթ. RyFƮd֒CXB8kškR7ߎFжDx2tU(S ҭ]\MMysD7?6c6xխe{X Yâ%vtU X\&ܶ>ƲeJKgpͰ"X'g''|IGŹ.Ns/p[۔,iRʜ9#U(W&IL -vp5XĘ*UJڷ~B ,H+UըZtWӧP&o*{N+t%kExQDnٌ|Z67[dMn\g,ʔ1ꂲdH-5,\?׼{Y _ݹC[j(BIsbҚu[™ =0pꤟ)Gl> u@IDATYSoJ-LyB @ܙF~&:z%}V r;Zï!{2*{ꕜ.vjӒZ6k"ew5k։==yL_[˔,.CwP/ZF C6o/(qBjߺ%MDY{'5 /=2^-dX^#SyF:yBcwoidxTUpX XT+}ŏ)uTԯOO a4Ăc嫂8өz j?o* c&a{YTv)R,s f:mMeJ?7ꪓǏki,eBzuj w,7N%yv4$v'$Ķ,TV,=TpӻdϠ^O?gEv\'F`h?ާ2+: 鞅=RRōp?;wב9n)Y$ߊwQ͜1g#ZLEʕ#;M8NVK>wzh^nzJߣiROL:ij3!;.\B ޼i#*Cih!/@݇zhB|=q}A=BHssRX ԥգ+ImQzYWk[u=S~Z)V,Sp.ιZ{x=c0 0&!b@@`/S!GBݒ OфH&]WϞ=+ݼn-|v c;*p)wQȍC3f;RE3|G,иҋ_S͛OǪ{!c "lbzY7!yo!B*['4Ew !|]tӸtG.ĝˆ3wm!~1&ʚ%xţ5ўt<=aI׻lw|OT} &~_No @"!bZo@@@@@ rޥt@3,}eɒ٩8x(L_N #6Ɵ[q iH!;"GBb>}F*W?@#e i$4;L@@@@@@@@^"K @@@@"#rb2 `FâfϚ Kٳe5v܍Nzʬ..@cѵ3ծpjɴB~CZa;~!en DY@'!b 4J(f6 fHBЃ!bE          `֨ @@@@ 1/1& U*_޽O/_#1LS $LNS;u7EFS:<: @@@@@@@@@@ 1@@@")#c             n'!ۑC@BJ#@x !bxX%@@@@ Dt;Rt             I @INBȾ0w]$@"𱅈               H ʫo{0$HBBHИ&@%!b]ZL @@@:a              ` @@@@ L@&q5"Zt     `:               Dܵ@@@@ R1R,3&               @S@BJ#&!m6("d@@@$}&J8D9<f*U*Q e.جv@^-e '9s kc߰4xqġҗ)Sƍѯϓ (zt^ͺ( Dk@ !bX&Gݺrh{"(R:в.?GM(-ԮM ėY;w+Wisfy.ʕ:;(R]}6wm*1Aboxu554$D7u9ޫ-Q)z˶(f̘r7]"ō *Hŋ nX82f h߱3?#@@@@@@@ b1b+f   T;R,+㏓ք˗hbmu4B5O7Z  8P 1! KGX1̛#KzǏ#\y6˔.MƌdX8"1";s״i\z5ٍ };w$-yڶh3spWB$l߱\uD0"Ft@@@@ ѳWb媔!c&) ʕ;5!" č+˗, lrڶO?'/]L7_3+JC &G=zty}옹֭ԷF]uRf *Q47lmvG.)cF}Jyrʜ9#=~6 {Gn.mz1Z~` iګc)oܔVԍ/_~xϘEVjPtK6-E^yC.^"4cF}+W"K9GBO6ø7 Β9O,)NZ~zbqEx )l)Ds-SJ=b_~VZCS&gYzu%JTʝ;< :e~9sL@?L.-%3Yv5 .]gόӦPhߜ_QL;z#hӖ-h>+k"tOEũYF24d؈ u\pTثGw2u 3fUwlVX( 8qbYww ?vlr;w½M<^xaV p." QT2h UZ9H>rXcC@ϲu'nfb.d}Zu)(cAA;J*$_elذ)Rg4K#&NS屉BN|5kyҏ#G%KC:-;o*͘9՗7kj\wbڂkʪVmt*v\!pXKXTrN$&LLX%._j9} rUգBčVӗ_~䶖ϔޞM}i!WVdv׳B ŴjNπu5Z(^|)}+U?U}r˙ :W6N,My!8!вlbn=zщ'-?!57(<~"kӚZxrOZh.~Jc"rJ%ď߼672ӎv25kץ. U@@@@@@@"#*b     @蹋Ӧtf{9M2 )F  *B z͝=1SfP,Sy1JϓWKc+WO\:.[n 8t!*dǯbET)SP\&g;{./^iҨp^|$Ypip!KSR%dQR:Ǐe8Ny 5.vOdi>鵫9x'Y䩒5!"sgMvdC8.Up4yx-kcK:},w<|U3"(8Ȟp%Ӆsl?rH8d+UđPvCCgpixջ²O%D۳s;ƊeJq"Dttl7e-y[4-bŊJX> o،i~fԐ{oBD]dh}vx mN=CIWt +&ɒ%]chf`[egL3? 7۪|FB7"z|׮ZI.]Q3Sf=z$qdHS<\e77eB2 {DYކ\fp! 9\bb%ec1|d/v䟊ȻU[9]Lx]ikq?H5?jm۴\?w0I~L!V/_BkιL9"D*邅sNU\9㴷#GOvVZnj ɺ,Xv5%IX^oĦD(YKoɢMΊhzK!⁃]NF?@j56;'o/YakHŽY(ÉE5 Z釣BD۷֭L\C"gY!gSK^s rgX6r3r8+WVvq Թ bw&|È>7lтy%Kfw+ 7o\K)SזKK@FM;FYMv4?uixjwkgGZ<EBĈ ;"zޒJ+Ȯ^ آCrDT3))(irSy||#B-_n[9qܺy}p޽Tr~˖, #v5j$4S =zmw`w-K:v#*R,OZ჋0̢];.^zW]hBDZkڌGH9KK. Z:k׮Qvnp g-9"vۻ"DPRS%rغId1^مӫUhTvIX ˳1zXׯSj5miS]9իVΝ;ʼAz;wsp劺qϾ}BUwGh O;,߿/_qc8 9Yb5kp-Ncd:uAȪ:<g`Heu޲ۨxO_p z7VXx޽]wD^-ˬi?       xq15 DUjҬ%%ؽpt?zdHBhQQc.q$>pV"BFs>nHO,# B@X8.]L5jՕP.YoܠUMtJtuUZw(aBنߊDb?O<JSDqXMrѫQGMH,fӆ80qț:MRQ"orF\u"޹s,x\sиǢUYR2q'4z&ThlzQ{oY[ ]ԣwf|TLiY}54pɮƌOsC")v:}lo7;:h%;51<';:,N.f6nD={'S{O;7Pk֭ *U*ѰlZ;{R -_AC,BVI*O?B9D."FlA@@@@YK9Kv*Wԩ'hC""Ӥ,\@/^P,F4^ "&q&Rݝ͟>{f֗c.w~rb̨Tl:@'!b_c@@@<<ڶO?G,zfK4)%IT=x@Xw=|Pv)9sЩ'֬#_"GD ,EL .\Hԗ5c*G فnm7i1jϊ |#D4pըVU𑣴wmWSCvM2%ծe3Vw\4fHݥ]~q3.֋Η.2ȼ? 7@@@@@@@ 1-f   Lmw8q=gϞt;Nj$z1!-S٨l27Ӳ%&Qe=\xx>,yTXF *oHB?EK-W4wLos%?Q b+I5 _N 2u]X^騩Wbq4I=IʔKv̑#;J(z)޽ǸSM!blY 'O+宊}o뎬i VtIM"iCڷg̜MZ˝>?gIfm]9Y ߿'Ǐ'j֮+/8 D@x !gR^ೄV5jTxȅ^>͟O%LH-[v!ⴠB9rP2e;wnE$ B c9s&ru;Zl }m:g-ٻ 86a `# Et( ⋀J `]&("zfvfwjagwϻs3~slM@?|/Z}X4\rIn3Yr:A@!F;J ~/m=ŋ0' ΰvziݦ}8$Z6A`D;w£;I&̻{%K-*vwZUlʲo>W-_*9rd7:9i{+gN3t2e[j `.m(\,x۱TQy&M;hwE-Y4;Wý7z W7;BFO<]ikf1-9rTg:ܽi_zJŹt {^85}b{y(AD:a o}G:]U+PCJ%ڔ[Ygtz[}gv΀   G b9)  *"Qw[B[e<.ݮ58j09|v>\qUfڗY7@ʴSsڄnCtJ8vqڸYMJEWQH_xdɒ,Z3fV(v5!EGUngLu,kdڔIf-[>zۈ制'aA u; "._H.rZ1L !{طe@]va=>kxPz??s?e۵PɦIhΦ-Z Ȧ ♸7p"ItUVU}>X1{te}R:qUleA${ܛv qM8MR%eӅ#G͎xa"g3L:p}B "jH|rUj,\ll*y˝W'O*9s^,ڶܹ(:|,]*o0nDtz< "yjsL%w$"ٵq6}l;~L>yR.\.SQ':uJzYn/phuJdӅ;hzzJZ5ͼw,5 :ADze6ZR%J۸#o޶ɞ={%MmAoǵIn.X.w.u~ ΋t.רURڃ>>\B2d`&U֮YiMTH\vu<{뺫Vqə/?;g/ZΕKzuX |g+ݺ=U[$ߵךKモ?Ԍt>wݎ}4iss6++kAB{J|F{ qr ]y^*۷*&'t'/: QA@@@4)@1MV @s "^tYpvaU߻acvT]c@ ߬SB4X\E{tY4n3-Nmӽ޷QCq ]֮S?Q@ۣq3 V/"_h~j~o`+*y%܀;nWҀ4`:bS1TbuiaŪUұӣ "{h &N_|) Lܛ3Vnqm I7t(͚464eO0ʿM3Mk5_ =|ʌm apkرcrG{g|u࿡pMjmS"gXi%Y3B[ju)-tz=zU K6nf!Fe .$cG4~'R@1 @@@ҰA4|r94@@ "YJhc{cll,Z0/Q/ TqAy'>)|\4<& Rhڴ*YRrdu+r$ضuvIӧk;_C:7n QG r?]+VzNBt+/IeܷO>"K/ǜM:<);oHfMR rSE1G}i3fziQ :LF||ˇ~H 9]kg͚ dϚ=ǜ [o4d>UhaZn n=GT3tq;G*zEk ~ku뤻-e0qg=aT}ϩvݨisH.lw>,w<美xsumϿpg%zN4o[cߑx7;^V<=wd9\n׵:Z ނH^{f0]NX۾v]s%t޳2{\3^ڢ][B͸7tyA)QgrH{}w<{S=zt݄ WY+o"rϰ#3LäJPk 7kt{=*bvh'hjNwcZݷ}Ve{w]Jf"@@@@ DLD@RA}~"m]6Oйc{ 1c>O{N/%T} )ظy0= HlYe/{凟~B)u:)ZTCI ygJ̙E^vR3@@@ҨA4zb9,@@ ^"˙ I P15įs%gΜuҮC=r'+W^+ٲekDASEoMSt{L/_E@@@@4 D<@@W @E b(J,(_vhXe%@@@@RAr&h  N"a#D%@1*>VF e˔D9,D@@@qsh(  6"Q!W,[,3g%KQM-e:! .\(e߾}y    @\ DEc@@'@1S@@@@@@җAu9Z@@ DLu!      a D @@b-@1֢l@@@@@@8O7{C@ [@@@@@@@ "   @Z (ǃ      M bz;/  "Bs@@@@@@@0"    [O      n[! D        w`@@ m DL[瓣A@@@@@@'@1s@HUS1       @&c@@X D&B@@@@@@NAo@@,       @ DÓF@@$@1-rʁ`       iTr   @| D9YҼUkW>ڼQ֮Y+W뮿Y6dȐA9v|3YrEu      +@1~-G@҄A8=,W]u/>* ޻#-Zlٲo~m̙=#t&       @ DsG@@4!@1kN׬@AK 1}lڰN~6_>)Td̘[8A       @ DSG@@!@1v:9+}٦:wJ/\|HF {#сlN??:uJ`b      ĝAĸ;e4@H[S̙+4hT2d 7oO-wU4?xeC42EvpCYӧ_'Z        b@@ M DLEv-[69z 1 "^B6nXz!      @CbA@@ o'txǿgL";wnO2{tf>tODht͜YO?H.^h&       @ DsF@@4%@1fN5Č3ʞ_~'tTED=]Jgzw+ؾ]fNg@@@@@@W b;Z  46hTr->T>l\L rmeoٴar͵P&w;wʴܷ"      @ DG@@ @1uł7&+V4c%u\QWjݮw^րuaz~¼O>X-Yp9&"      @| DEk@@4'@1uҖmgSNW۾i\\$g\fځ䗟wo&ׯYkyiN7{囯Je9O#      ĿA?  SKa9rXhdʘɩxA3777^~޽+zLD@@@@@@ _" iN b:4\Q3f坱c.?cJ;xf}ex      '@1-F@ҔA9w[Bio+Ko1sL:)uY@@@@@@RA}~h  ")%جeӏMoJ뮓E/SdarПs@@@@@@@IDAT $3@@RZ bJ n;w}B\zl\@@@@@@@ "ɣ  @Z ?g=]1 Y`^Ʒj^f=?93gL4        z@@ ")Lt]t\sm>ɑ#ݻG8q"rL@@@@@@@!@1mG@[q{h8       `"r!  Qg#      Q D  D#@1=E@@@@@@μA3h  "#      @ N" ijAx>{@@@@@@!U  pF"Q~v      D-@1jB6  AhX@@@@@@89  @ O?      i@ b8  v@@@@@@@@ "W   xF9       AĨ   @4c]@@@@@@@ D<  Z b><      i$r  @< DG@@@@@@@\  gT g       @&d  DFu@@@@@@@3/@̟Z ks  @\ ,?W."Yn9NcHK=x\jת)GjԒ}X@@@Kqyh4  v"sɑ  <ֽ.TH;&M u{oo)t&P~׋f3hf=<9sM9|HJX"r ˱G]eƍ7gtQS{8uJuv7IWZY_,ӻO߰MrélfyU oM2xWZy?y2m7VE{YqYt Ȱ7oCI5 Ee@@@'@1S@+tPIn_ Ɇ?ȑC9?T]prg?#ϷnkV\ 5R)dBE=x J5xaUmے\w-l?#ec53,X&Mƿ^!p}bugb;W,ٳ]W)[ҙhFܧ 9(_2eF lΚ5[^7O.мEkٸyϲIЮj,ұsWYreRy y;dea㢋.ygH,Y̽Y\dXܛ>/:8^8e4\\&5Nsw+&F 3n"M.}x\ɝ;tXF9$"]t<Ҩd|Vy:a˧ȒE c"pe萄 =Ǽ%$V,BI XkҤqCm)p}o!>S :ا 7-[LKoJ(!? i2)W,d! U"zOA-o2'J I3!?v$M42KNr=ɮ{3eJ# Dǿ=ֹGnSN  {Svȋ |'m۴[͞=Wzz 3~;mZ.BIA3qmyE@@ҪAĴzf9.@@ N"ew{eK&׶Cg9.3< _}SB>~ɐ!Y~'Z  ~j>XTm;z>0qb oCrcH'cI [ONHאJiV[0ws9ȴR&6r/wQLW&~=QѦx{7hB .$˗38RMq)rTZ^|b,p6*,2Ï6jV-L-[r<6ú'&8tE_ld+ƃIjin,Q1]g9Z-@@@RJ bJɲ]@@"tZ)}_tUWv]#e*&-_Anv3~wƎy,RE(0\X3 R̔/ܧ9۝.vk֮3-PߟvVۉڃv\N@q=g< φRHe˔Nz͇ҮC2ܛ!axH4# b4NF{t0qlm7}[~G2u3n3}u֖k5`ƌ7'֭Ώdƍ>ˇ+g$ts8oBHƌnYa 9[|k%cL{9~t i6w\'O3ksNw1:rRv(5Dn[媫NU>}iնH^z '^p9~AՌ럓#]UzƧNZRɹON9{͑R~]$WΜϿg./5=.RӦ!ޔ>k;r$Y7\Lٮ7S/ כVOsۣZEVElٲɓ'2:}}_nq}vԮ+kVnNt{^="/?kOٮm9?;Y }Bq굼D1I :a/-{̓4@ 頁NGi׶ӥiK ~Vi^ 45)UDk| ?͛=ӄD?.J x /7(`Dϧdf>/\{H:wl 5E^~heҴpsfN xout+V ϶[ t/M>H,5E/n8OC!㳯&ߛ:+e8 ח,U纎h[~~ҽBˮ?N"w|e_dTs@#uܪ,Sbj}L jx;N08 z0:;^a?K^e)Stsݝfrt ugW]-:}y/P^fF2'*,glwc?ki_[I>Mb9h9'{ ж~ 6D٥Ր<lO>3~9zoֲyzol8   "3" L b*;!Ns v|.jݻd9)S&9q:(!\#GiҼSQ%p* Tya ra"?k V+lwZPEʗ7?v/_!r`4ɩ|8Uȭ,zҺM{o5 hh@*eW#^}EJ;ujcƾmϪkJ]w)W]Pi,؏ZO#?spRԩmQrC 9i{]:<>dtWt)9?kV3,Uwשx̸9+QM6'0pJP?\+ٜ*ze˔7T,?SBeɒPQqU?qa cC4>AģG%KEJ;aދ.f˖ϤA.Q#hf|6s+|je!γs;4|ay̩òe˥sfKuЪZ N;v,]B?&˕U^N |6IgG@@ғAt9V@@  DL}'"j gO.?.NzC̼&[ʅNwشqU3믶ɜY3| =tW8ënWMn9P@OjބkToXwUw%Qe'G\ZBex;xk2̾tY3yA ^i8gNUѶw9ۯSϏ.p%.F֨^v56t 3id=\t`~Jhݲo,㴽pcO 4iPM kS>vQ6NO oO7Vgfvq fx4ũtv_=Ot˜JJ;vuXf 1Wwb ٝe^uEz-_%?pNܕ& ^vgT ڳi{n];˫ ov[I^BռEknDvmӭA{ysf'X%I皆QnX> z4K{npDꍚ&מh\zw$T-?-{}}=. `Aݝ~+֬caGV!s]5 W5iTշǎB5yn4?>/{y"acp}[p2I׿#G]%7πM?4#t7dNeeMҼeg9qqDmgkWq&ڡRvO=ԫ&ھ=d^жSY5W,>SfOS4_`oz=n;:m}=XWYn_0# ۡ<4دߣB^B{mwxZѪ:;qgާzݘ[~3'z}""  @z ޯ@8 {7CNŠMeXn8t@SK7qJ ?NEBNeRvd9x_rU]?(?H\hH1 :P=vHRs/Tdiny]ϳSzMo=DZ[W7x΋t1kh`ͮf:EM`Uݶ㴻RpC.f.p} EDV݊k\rɥEm^7Փ'{$WvvH<~쮤5hUBkYV$5/@ ZR>]KRlBwGAD: }ZxپRj39Xp>H8AD ͚1lFۮ@ {IJ:By^v,NUw9 kn_dkK֥sGi֤ߥ{ ~^zMcBEC "jެן^v[Gai}H09̳gU^C+Ussϒ%^be/4g9Aw-n3KGי%:|xVMR;fS:hjZ3s\uUfs YsOYu r]|fZb?xzs/;t^@@@&@1q@HeS qs aNwpWIuVfϞ3ˁ cMNG~Uƍ#7ܐAɟwgoqb*PZUlܹ%]L ݺ{wߠW9E=ӷ<@53[w[x۰^ok˖,4\ etn;N tYC.rjoU=Hs;ۛi:Oq^)uj%@vիv#!M&Mb\an- 8,]N]mB({e;,J 6W0]i75ju'G}Fx>vQn&6Jߞ͸U8Cvݗ]II+i7ǫVqޔ"jkfY%JNXICA ~/M3R'ŦNה"KMSܮZgΒ{'TŠyiv7q񧟤J2vR(Ϯ@ yהiӥ3ϙ͸f͞#OJӦ͘)<#ќ7; TWOwD d47ϓ~j[?Zr3b*˗.Pu*"tSuz2MvX-trT젝]1վ7dvd1gL._T!l>Ѽhd}R@/¥]5`N}y2u׬VM.[rp߻t>pO$ <   ^"3q" T b*=1AuMSF9[h%E+Ç'hWHܱcV[b$a1#{Sڬ]UEӊ@ V9jTBr/T]+.]ah/{\*_:c' 2v5EXG&wޑ-@ l\F9 'U d-"/;    AD  n[nYrd˖۴VջP 7-[zGB qCф\2}Fx>vѿRD TOˬ$g΋>˗/%1жt9#]_Eը]7`1FH"͢ڵuM1 9rT>w3kׁ]ar戄*ކ*ل79vY4y>'5|6lhyi D7oX'gl*Uý7нqe4h\lYlϮS54vzycsg͸'եO^fSv;{ہ.UO iD Hj#ڵV-E::V8^C-}6frHG "]궂w<{]~ yWAhɴ)ʿך]j~|GיVRPc/q jCj"j[׭YeE;Zjuv4vtBp:PuNI̖˸>v[wѾtNR^SmZ=%"~Ǩ]4dWѴ u "jpP꺡<40IR bg@@@+@z7@@?~ 5d*4mZ.3OWyK~7^nq4y>A ;<ݳiu4{8AESrAD{Ez\z(3v]N"b@T11 ݍKc=~Sv:xɑ#h@Z٩]~n4uhI 8moGeH`6>I6idv~%!5#\;8ut9r mnu믲~Vy{nU硠ըJMfOR˅~h'a%1ay'`jϜ%OpU˗]=?[c uׁݕf8ǡϵŋ ڰ`ϧ7Ѯ,鷊6 bre/u= D7-=/|¹mhPp@ yWAhɰM5\{ =xLrL`L*Rۨm gVEέL LnZmG:ƿ+ZEpf"ngOrzNűf?|/ժײgq iM`gm(A@9fGIK.`!_׺^Jd"'Ou;hsv`'؆Cyv7)G DcD 9h΄&˹gjױSFA@@ҀA4p9@@ ")c&9ɀ pI*^U`bw}%K/2pCSȑ2|w5^]gRt9m]% /{N ۥsO…}o4bƳg_/=g=ɌGo+= SwGڞNE)Ӧ"~mYv]74d0 st7>A}P~׳߲3iи=;xaD cB,iwa]4j,!\;U*Ts=}VN5CC$2e2>w,k֮'o,b*Qo{$ HʕA <'vhft9{۳݉~Th7ѮfzN@uz{WkG k1Q5X }W$|UَӶj5JQ93s5[ٛ= F󼴷v2*8.} x5 t86ޛ›sJ*,>s褂r$Ѳ_/_LCp"ڡ?D; |n8M﹥.n| oU:>;T9}ƴ)^'v~/ re7Iz2y3c٥]8XVCŻ5Й`W%vZ.дP]vZKe߾}6UW^)z, b8wu߇[]W@@@ DLkgA@L b:a^ o{ȖO>AS2WlBE8m)ow@G{?ml,]Pr;Sj:Ƴ>,yFYlzA Vnw= CqHԽQ+ J[Qr)y}^7nuuC ^TTiM4DJe˔1.q+mܰIN8 >"2 +D w4'VyI5j1?^?v@" _hewx7q!TX= إδ풥KeSO:[h`f>k2 ns*T5 uDw~z{ӜƍH"f+e+$tz<}əb3q=''gM|^8A'.l=͸CVujɦ͛eE5yRX_Ty~2qdM4w!CEXa2wsm_7hP[nN}ygx>wϘ!_}~6)tZlu>!!w?v-?}Ds;d˄UO]vRփRD ^n7oWۼgX֤Sd5N?LI}VT(Wʱp+z qF|sA3I+iH|}&T9ޯn/3ĩ<+gNlup> xνGt1VDEzN; ɐ14mP ]7o+7m";uJ2˃T3ORADy ̑]H Z:U'O*v;҅薛orslM^TD`ۼ9f[o˷'ٲf3 *9]z'`[ WWjK=*Cgɓωvm[;PEQ,½Ot5`|9v.z8a Km5+s|yqGrŊRH!&\5&*gΜ,.R)sRb@[f֩Sd͇k?|SDwH]Xϯɖ-f{ҥL;m@,tٯG#+2Xr Dt4 ?hS3>￘yo/f h1#UW]p:Q "Kj>X:Iㆢڟf 4hWBs+ع_zE`V y s$V7^8>ADm{s/Th"f@YڕqV}B b8A3z]!L1]Ԯ濎>2zOi83P&.~C' //(hUh v7'kQQje>3}cWkUUݸjP '/-jwoM 0ADrMĿ`t(͚46'Mje#y^DD}FrNt=v}?hpIڭ=h8ˮg{ O%Du"}^ g\?wgMU`brIQ?#C£ "~>O Fg449>A{ye:Ua "{۵A\ O!n16]^9PwwO|J[`hױ՝ Rnw|*3g\n c1h>lJ.{uJxsjl:A aDfIVgy%N9?6zRhQs>o9wdޜrWJ֬N5V0Hmܹr{UN:+VU P} VTs+vd5$.uylwU+[igqhxMCl0p2z[$3vN'XϾ>,w[Ҭ a3f} ;it vAMF խZE^ w._„YhHپ}[owڵS卡ojxETH<묄jZw쐚y1T&$1bWt@_3*^I?|/+VroZABNY 2d0ψz[+jek2Pfc~B7uH׭1Pe㮥[N+j%P{}֣{wgk^r_.ϔgȠACE!=y^4&7Z9iӆRdIɑ=WAǟ~*ْ͖-IMę*ݵ[yx a^7ri:ݛim3}z9a[5Yb?]s*'NunI}¹O,^8%z^.H_Zwۤ#e9+RDz!ZYj9Aa2^'\JyLh/zDrW}tVp7y@NEIwjиlٲ]żG>G箻Ӥ  ,s  @* :ONꫯ^ 3e]v8&gd_N. "Y`Ak\cNa0;wN9v/Cate]i&t+꾣YN|_Ln 똣/ƟDt8/X&暼}^iiNWs2iB@O=)tw]XpM7 .>w7N7Y+LiGs HlYe5?d6ns&,~;+"M>{Rù5WˡGzhrfӮdjq굣߽48qƐW>Pb~͟:qNy6@@@"Fnǚ  1 D6F`ӭ 2nm4W Pѝǫ@2e Kҝs%gΜuIVLw00Y@j'p}T>P#궧y@@@t)@1]v@H=SϹ% @*$yӕ5yh׶+VIj@һAĤMV|Q!um֙    MirT  @DSEC@ E @IDAT%SK¾<'ft'@ P=yc> }m4kފp o@@@@@"g   x%T`rW/id1C u*HN:%>$;v~W*}=4@@@@@@HV bD,  SRm# @zhڤtlz&ϿH 3)0ruɗ_nG5 smG@@@.@1_?  p"@ TZY_8Wf{LMWWyfGˎtl pF&Y>^ΪqlΓsgKeRtm ċ.Ȭ19|Hr߷o_ˆy~/>gV ״)̢_}ԩPi6غ5? }lيѦKC,{(N=;wa%A> bR%e h˖Ҡqq!   @"! '@1<ӱD|K![o+u\>#)\uYB1dFD DLt'Dz ".KNzxzϿz DS];JbE3!~'Ygy'DIM1S5l r{9wɆŗ^y޽zi[nN UVիYz,{Z HBfj>SͬZF4MX"/ߵ-[6ٻw|c 1J@v۲es)[~ɝ;{KOl '͛Uԉ~dΜߴt/쑞5 OJʕ{Jk9dfZ^¥c+Y>)\6ɕ3w^9r|7ߘsuۦuD-߶+*tI jծm+)tm3WNݳwlt MW\!'O׭[/ t?{gхC)-.ES@pwwRCww^-R9ݻ͒&yw]_aWǙ2fIz=kׯ~؛3? H̱X6WIO{&²OxsÒ)޼T@>J&-1NsY#l!xݮZp?*!;[meW苝Ϙ> ( T^S)R$YʼiѨ̕}mOq "]?o۶Cu]ò&Z'"٥owzf[˾0Ss atM`Ȋ-Lv؁Β2O'σk׮љ~jTɓG“'4e`˭YegOR=,\]v gց.үOTZU3z8p8SSg*"       i@i7   IBD[7WFw!䁀BKtC< [M,{>&UR\`qVS4i,S!޳wUyRgU`Kj%zhI "l5Y6v׬ZN3dU_|Iq2uvHE7n맕.]@ Q8Whf.}];kfE,x+,~ |`>,^3Q_p!jۮV\pa H*_E/XHǎWI5NrviL8bw_?ׯp\],zҭ8qZɓ>Xcĺ,YLM̓߬wlO>I*'s>{jѴI#_ܵPiَ,UԴ\        @w   ^EBD[.ٳ;vB*ˍiOBDQ"8D`b8WvlmޜY|ǟ,b+mr~]phK1%H>=ȟO=YZ[z-~,Kˋ/h= !*IǏ/ٷ:wڅ%"r?oߡ&W&c˄&jCM:XaĨ1h#leq2',V|}}D5:%{*nꃭZZ&ӻ}9mݾ &XmYXv]iaMծmkj$`1VQa2GB\6UiEEZ|r,]f7UBęb;^`eq[(|y&OLZb"^xQq&}$~%Jg&%dAa PH+4 !       5 @5w    CBDY m"z!PdÚ5t%]qBDc.W 4oڄ: 6® fMK7\Y b][j%\r%DԷcױS'{fϡISVqիWԸY )&9rdsevZXq^x-#,)׽zAC&6E9! [?Wbw וقs5 J555yujע޽L7ܽK[1s=p@?Zloj?y솳HBHD.D 7ƖVd̟ݻwmnT_*DX>f1{wk,ࠡCZ 7!!{Nџ54!=)a/#/t~w3W޼q-JiZXr)hb6B>uV 9^*38m?YdlU؛6lɑ ^Yhpf-?mL6}6ԒE 蛯ȴegIyvN]Si?陷[ Q $v;B~ m:Wf13X3]'u{{`,:Wg$,gq";S"uH8 D9J}7x<ƌ.&'`ycND>Xbbk욽cB,AeZ"K֙$ u"`       QQtq    ) DoJk^oď >N@ &*b5- !d@{k֭~]~Jբ-ȼGJZ%=Y#"}}Y!OE/2Vȕ׬Մ^f$[|fRڹ}LZrWU^"(zmw껒ָl\/,bYųЄfj"ڲb^ºc&nj mQΔ;B` kl2 <*V(/%hWTDz.酈Ͱ'z!޽/%ӧ',G6UEW QpEXL63*[Q.|[L.${ӆf=K+W-_AA/Dtu蟩!DTgٳKW‡"*<4YYڸu}}ChIi;徕]VQjɊ,-[6)ShG?"E10h6M2bFIXJeLNɒ'8cˊ,(3OY;xYDܰv&Tc!!*;rpE~̦`M/< 0TiX/zv}ǎtDgϢ%UA/Ddjle^?M^ /Fn>O?"]r93yYGqsY{]A'OWӐA&8#Jfw݁90vH@":O𡅈a9:3?q54p9sS_@^) lpt՞ cĊYZr5Y_oAזUb垛3_P[|U5KC}!xc0K DT\9OStk}1[ 0'(%{}'ݢHS}'&UG O!A=_r ` ,&R"H?R޸1#d2A%f M4P>X,VXƁE2ΧqZd|AAV-+Fw~azƑO, VOwM+6xUPNKL fj"TU]3[>z*"7#B{뾐](QBlԗx?QjUUf &Π,QZ5ŻVH4:muAk^,9O,C zvYUZd2bQ 5 !$D9Dc"%N[ڔBл0ֿlg^d BDW\3       QQ`q     D1[.ݥ5!"4iXJs!D 4kXe d7 v[ ۴ufmk4#0H[]Shd1M//!bMż h̸ f\fͤyr˼N]['={+TĬeB \B":>Ӳ?--DpYѿ裏iUU$d^E%)Dlޢ5=~jNmZQ֭,2p{=z-˗W)N>Sfju" O1jָe˖UdA" fUYPV)ۯE㜰xԬ_ j٢}ef|N U6o׆Zl!ٲT/DtuoFq4v|Vd)NHA3ɽq!{d{j90n /ClXc~~x=y/^0Ovv 1:BDG ?g~BDUq2.cRlamU +U,YdaӶ?|9IS"w:Ie+RLd|hBDe-4.okwX&/]UkX4X 2@@@@“I=cu?س{ƙ BD[d(Z0MdαQ/^<ڴy+++2 Wmy&[uمz+S^"D#[ctXwagwf ~l^PЄI+9ײK_I3ש]>U!bΜRԩT7S ٣mEFMթK/dI#wtQ́/[),\c*T&E,03pM:M+s6"Er*\U,_ue,q̨^h YէɕJhU5:TZZf̘[`5n@`g˅̈́+X͘>E?uBS#J <'(ɥTFm-"N шoRς .}[t͉߯V]G,Fv}n o*WF+[ԟ1\A"eo8욞eJH+v>֯G ;|?N D6"F,F߷^MNݽ{GXcXOeBH %|b3׭:=De<#"Eڽ9w`P"Z2H*Ie[۷Xӏ=vfF( m&q.W>{fTMc/1%nܬa]#:VkqmW _w٭g/vNQnd9!~ %D< D $SRb.5bEҤq*I" Z *gw[6I.厕(T mn.5oqիW|ܽaXdeKYVA#{P ݱ7YxԽM܋ՙ}"r!BwK.˗.d~*fӤ)SEXUfmm-egW͙uѲ94!ԱK7Ԯ%DtfMrvi7>BD^psقQ`WGKvuEWbwt@TJejզVE,WAޞ1,{ڸ~ IZ[ru|岚kҬV$U;\A@@@@@@޻v9D "z2~37;wnS'骰c~3CɓkP/^0ԩP4&a\jq>|Vt5-sM5gMY+jۺQΛOcǛ[.e{RUիtq`c'5)\]6rQ3;Nc'>BDng/X>N:kwM\.[v\RЬ*ih\ʖ-,Yi{_seQMKμp"͙3.^D 'p ՗i՚54`- dҦIMK=…+W)UTHXVϯL9u ݺtF Ⱥl9]q{Z?Hx JU`7_jެ)ŎKŊwܡCGhEPu 6nLGw7_Mʔ,ݸqCZ":._؝ǏUMRWZfwz^M yrjժh-[Q^Cm۶S?؛zWlutB,3kr\gTκfy-Kr5歛"E ɹp}64V^#?\"vԑ4nfܖegք;w천 :ٕw!"ϵWnTni[-  P8q w2YUy}ԕEb=!"7 w~2@hIiz Dzk;"!G-K*VBb6ׯio.:)P~hᲰJ@\#Bvn-o߲Ii">H5Ri“Jۻ G&Vakte˔ɓSD : kiiȖ94h܄NU+ *YXϬ"kQ)V,p_^; ͱA7fBR^:Ki?>EMֳJ,4fdU>__xAE YџʔS~.=& ݴiC)V%LUXewFaI3*:WFusˉ'iq6T6elSܹsQ@{}-Vgqbr ˌnFeuë́U Mn=\Ǟ=5+6x8q&L,ݭ2݊ϚL'USݱ7<}[ʗ7 \ y"-jB͓RL!-Z5zrTqM.瘅,~VЋ-]t^2e(6jpM]'ּTqS4:&+gj [-T6;)dlٖSnyeWАaYLlagnuRSž3f? P|:K>l0e̐AMlA4XX-2uYJz!fgh-Z4T)SI UTMMj2κ}3[ul#}6Ժe %!.&   $t2P$)fХÇ9a @tg-&p/,YEn5m!#ko(CtBnK6plՐ@ɓ*Drm0pai;w#BE99%G¥*f!&WY(xn תW] O&ܼ~q|sAuF)w>nѾ#^\3=7t-b&Bp;?_Yf)у , 78 C;r 1{ԩnںr4ovWA(JB(m"zJ`  y %Jи1& 1_ig@}0lѿC{9~FM̙"l.H~9 kW cj[1W=         @W   @BDXL@"WS"_p\p!7$3#0ȦHIBD\L @@@@@@@@@h &!bxx   *D[6سϞf[yF"F w         Z     v"):(O`yY{_yTX'߼uNQ> bER1QcѢK>@@@@@@@@@@e" A@@@ABDwPD              q D8@@@@@x7{0{z"z@@@@@@@@@@@@@8&!bD1l@@@@  D #@4&!b/NBĨA@@@@@@@@@@@@޾?x9|1}(OB(D,#?F1@@@@ L D >4'!b/&   QQ{q             OBD_Cx5z0y D(#?01@X@z6GQ1ɓǞ=Q@+ | ;fi^y6KSܸ矏#~ڵ_IYw`-^Ư]Nt*ׇҥM+MHGuj_2KhEtiQ?yPo7x+J*%L߼I@\eIjYQ=0YTRRdtEYQbM&B ҿKW]#>@@@@@@@@ 1(@@@`~җ_e;{ I0.CgرcSe9+:yY$@@U ӧsӸ ve؎<^-X>{fX/e>i:YעU[oȠTbyYmԣWoZ OoߺM~eMuNōVS4id!Fв&b8l?d)J"9hLr/i3h@7kбcJ$V7tC"{zFGN^Y<+P0kN0Llךb͛RI__J(۷)Si VeFXk* v'Kyr碘1cl4rhڶ}x;}1r"z֨UH'Oits@޸q.o  0-Dҩ#5iPΧu䈅8'!Dc mZ6ҥKQX&4& Pf ݫ&wufBQ#Q1jֲCb+Q_@cM 5uӻWXBĜ+{`bY՗;|}o@ڰqa92A@@@@@@@@m+@$#!-^xㆱ۸;²&߶}G/.񏪷oݤ;wn/)} )GjiD@@"B-m D ;Cwe:J{BDIٽCjxQڹk7%n[lAbM1Muϟ?woNwޕbF HWy&._Qkgiۦmʬ(2{MP;Oѥ+W(٧HAu$ctYFm&f|]'Kn]P~)O>reJ[@@@@@@@޾?x9=oBcF:O)'E&Su4OZ ۵7쒙j(W{TdE @@@@@@@^p6D"zJꅈϞ=رп׳OťuF'*ujUl4>@ [VōGJرbi@l _xAW̙h"#F v4B.: a"b4n+hLdΎ8 4fLso~إSm*[ 0ƌ@IDATqNԸaޥ juGV C~, >ԫGeJ"v|ZigYƎI~%K|%BD }q#Yv_1HE1,dB4'!%LVI:>%Jѽ{d         D֕üA@@@ R Ǐ۷g+:9@ZJ jEA3-΄AQʕMϚL';;r),f ǧ{I(bYY!e{˴#cZf m۴Ul_В ˜ 5mNN5g![Ȯ'NWPQ+Vف׮mkbJhȖb4Y{&FeUiڧw0nY>r[>U88x'-"UMvˁZ֪SO tYˁS<t/, zAZu5j"}gBD8 ӵR)3š òOfN|y2bԵ;l%Krw߿V"za    I@y n 7@GRNCUkX2gi*VL_dJ 2 Z5B3O\6h܄NՌ^d$Dd[){lY,y6 4n߾#ZB9jۺSp :Z,wGY!""EgH#GeTb,f',*a#hV\ j5jkBE~7O,2⚰`y^liqlٺzmAk}"vѓ l97kٚN8I֮i5D  SDBDZͯJeU~DX7nۺNAժ۶Я;]7قD+Q~eYXX4l Yn)Dd#F VÇagp"u׬m5;.zJV\`'i"EZ.]GDŊIt9([F۵kU;3"HmܹsbqLb]H`{7D{jܴ7 2]w ENӪ|h!"քŻgQ4i$3g~ iUkZe1,D)!rXf8:DCvn#^+p,1@@@@@@@ @ V|cN`rhyI$i~>toY iI@o)HQt)5bl"`m͚ņBB[Y;vlbl 63BDwi8LԮYàv"Cxh AZBl#7Ihތ7l@%4" &WÆ)2w gscOa"8"DqZ.:v͖9͚Mke/hvP %L@عXjX.GW_kվȐR|BstU6bVHT[>̢,]rmh(Ś"2@W^䩞]Kf>ؑC;V,:wT5\A@@@@@@@k @K@ !cN]{fv-0n ď15mޒb ӿ۷ZC#wk䲲Aԣ[Wم^Xr%8?_ԸI3M;v[S/+[_<9׵GچuJR-M: ,(\jTx2=yu07 DE=Ī׬CiәDwޑVwTE)6oZ ˬK/U1  Qn&᳥6te:^"6kҘ:u ڳoul6^fOv\`[1&JB V|}+ːZ%D&,=fֺBr4l f_rZ+Q݄ofEq`!Yn'LHre0a O?VGh`V yvSXOD<;t 8*D[}9,ͻI9\zW oޜ i3c͵ZE'"͛6!va4fs?m Uքa[nk&,N|`ML\'zǶ͔2@ ~ݺr sSկW[٩s7:#ڲi%JݿO>~.) yio]@+WS5)WR;d_Psh/׮_~:=I6]gN7j0rP*?UAd2|d@D9}*Ō޾}K:w€}(mrzӦ͠ǏNR4diYޥhq8f֬Q5'G'p24vH9 e+<vf"Erڼa|/^DְSE   FBDO[@@@=oJ/bwbC3=GNʕ;7%LXhѢ^~E'?tpY$@@ 28qgyu zY~#-q i?20+ըBcǎSɜ@ʓ'l#W^چWeoXw`#gr|9/]L_}Y6kۮ8t.P? ȟ/P2~2i/#CԪes9jňŀ %{U\ҵsGjܨuta c/]$n5'&NvٰknC-\&O ͚M'O[,pb-[Q^ejJ4p@?}65Ց|/ /Rj5hzY;4U@7d6mJ*T&rظ~ IZNWq[7QɥvnμSfMe~{? ;Mz>Ǝ&_>F+}ح@@@>?[     UjԪCiҦ;'OitkHLi?ߥyA!D tHMG\3Y;uYYް&Xs)Gl;6({c.=MlnTaTf ʢ6<ڶiMI$!bWg3d90iw];RxTLyuWz1ԩ_QS$D3r8*'ouF`M:m;b L͑=;U`HBFT'"mӊڶn%ga&$0Z?1"`^F+V s@@@‡ ! 0"޸aK{ܹ}v*Yуt-z ܛ8>K$L(-Yp_N];s@"5Luޮ!"~QczUWժT,Y_k7ɝqM\'K>>䰡Yqenh ,Y: dY8Px n"JذA}MLyVOe]SukVJϞ=~?h~{cp%Dd5?qɷS6n#"G|K/<|K@@@U"J@@@@BBD`tk'z!1#/ g͖]X1Yy1M. 'L`(zSWԼqM;qU?j۳K E?D(V*@"]mЈΜcBkoTz5&K.a#F}`En$.!"OIF}ѴxR7v!}UXb3LZí[m+UxZHϨ#VTZnCa=/",Ϟsݫ})=|:wA͚4DX=oܼY^ /WV6 MVݘ]ǎ),?cMnVDeʖL3Rdt^-W+WW5yݧ|P|y)qDĢјqmGfI֬ٲҳO%˪|NH]N ,VjTT 'goѤ) )wBR"E(cL˛7o5b}]6iܐ2gQ1{glr% 2"IF *1ڵ:ux̵XѢԨa=˯wďKtz5nP2OPAtiz&;pؾV^cu];Z b?]:u ?yCĿ8s8qgj՗_'>/(|RW&NVյkX&##W^},?zbITDp^0eϞMf]U Z=Y5JkMC,7gͪ{ 8,_XezG6l2*r8O9gVvF|n޸IW*׋Qee`qN,eZ|awdG ' Ǐ-͛6hb]˶g~wh& pnY_^!D!Ϣ-p`ؘqd\NpV/v*&qj3Isd-v酈,P~}_^hֲMk)4fH;Z3Zey5^GiK QEGFai43pQy"vxqذqdq ^hи >*kcGQ __g3iGxPž(, \yʚz^[ufMT.c;8l\Ҥ6.3{4[vu;Q=ӥsG!7%9X Y d`/%;v;-N,w%;w. 7湮"9UL>8/dvUהthTy   CBDY @@@$=oBgJqfK97n\7:5SPraՉMO[OCtЌi:~>mh_"A‘(;~8]݄h8_|#I`s!pV4y2azA傰7oGB'E}ɖ0r6FT$t'r kv bҧqt>YVwShd5?LU:EĉC"@1b1}}}eܞQ>uzpdE,:YSB!J f,f֤"bM,E.|lTܧ N5hT2SuFȂ|rZ,]\u-Iy !ߛf-lU.h4p\X4>B$wET"- oba%w9P)!JƍҪf]'GR@BėB\NE YϧWnb^Y ?>G.\b*ܺt ۫|TU_z)EO"|~r@XK#-Bzq8+g ),,]l&KXaUҝ$jyF~z+[u彠^P޹{J*i cǴ9q{lۺN96fЖ, >}ziA,ʺjZ3HŻ/_P)YR)-Mm?.3 8^.6}}}TPbdi>G۶PI3*st-hRtp+Gn׭H}zklBj2]>AP NR_T,DV@ETs;ݝ}c_9og#'"07 Z۳SCx'J[z2=g>>|Qk ?H4֦֯dɒ|rS:y^Gϗϫ|D!a>8>˯ՇiWBJ >1ɚ?ԿSQ) GTz Zs+(3aXڽG)A( >crV͵?tR䵏S31kR  D7BD#A@A?s"SaϝuXH+w ڛ! ;k&]S)-د O4?5U( 1uj$h'ҁZfPƒZ@Mڷi fņ>Ipͪʕg.hYN=I*MKxjRHHӺU j\ٟ [ Q.EL9)LF4u 6yx2N۶lHUr@\i5܎1KXNA]=go[aJ;wTHQ?V:w"aگc TDDqz[}Y 4w G 6Kf=v4e}X{okc|'ډ|(w# )/Ln1ozu+jެߞp:i85slM^NDԮ:,Y>Rx{sOϷ[>V uuA iȃ VG ?׮ԩ׵Գ.Á}/ۃ#}2*fΘK"<)oPj d\),"b̦ G) l+cQJu_RJc%˔3vs=>(Q:pZCO"}&<{ AK_Mri^{A~gi%>sbʕԇP=u֏G3xC]w**[4.=u?W0(cb;jE0A8[6ŗ_xU3/]H)RPC98+SOl<Ps  DBDg"-A@AB@ jW?j=](7z cBѾ`3П>q(*Yڠ3mz*(W-DDFӾcg/Ľz{>pAZ~6 dTDq}n7(92V""W聲\Y !1C\+"!ȡmt!acmZN:1+䵫Modn9&\zH0{<1 웶Ǽ5GsD1 |0(cGm۴fMnTtBcڇP)[LzjDvŬ1NgvCq7dOդhޓ "Ԯ["6m[|KVݵcH꤬`l5dӷ]1u5rdCX͑;/qw vts] דPt`?[f|uNGr1lVOD`Hh^ŒT9 TpQ6MfS/'It{v2JwE*YSan|>z~"ż;cVKCM2@ȁyK?H/hڕ:;;vn*/0BO"}&᎗>@ɉ'țkA($G{q¡{r5DD2(Biyyߏ0SQG,uo\1|5ʮčrΚA9rՃQűqL!lY4~$}.?  1zLA@[!"FcN!R,Lո *k SONkҘFM[诱[.X}l/pyWYmCDS- cj׍iӦ\.&OB=s).V7.H2EK֛9[6tܝRR@23ҥ{Ҩ:~qظ hYO˔.EÆ nGpC+""'AR8>ЃV&? scf @TiU8$ip033 1 Gݻwrz, ?~`0DDf_P.4 ;nvl"MѢE%}wY\78w"AqH\o$6'm(jAD\;zS~s̉dPӜ8ikq-o|'F}o3O:^oہۧ#yDľUyZ]c&*DD}\k2·:FHJD`oyﳈ 9/A`5.;Yڮ>;En-ٶ]T'$9,gx3{kHsPl 3R>'K NDD#EgV|{2ҦMϱ;j' gߩN f#?""HEz"Ht[t\?0 H[ 9  !"&g%-A@A?c}gL ѿ^fL %rɩ"x8cj|рLũ^ڔ3g9BDA fyՐUʌ_Z qb U6s\5q:3ȢتW0N t/ 9".|c_<ĶX6CB'UcD+p6ݬ!p W2ENd#QbtsH઀nȾѱ0|0r(\UӉȉ2ƭ7=vJ{^=9-kf"uȰ>q2Cp*p1^UADmZsRe@IsX8$2g"}Ox_"2pϹ?p7i]/؏9d@5pR35iC]w+:QinYӧ#<jO318M:9  @ DyA@A@nI;.2H>njt}-{+uؼٳw7>QJ%g>$ FA v]iK'(Dݫ6pCPu\1nVg5*&fmCcFaPUkp b{Wn.S=Py AD5cΕS.\{zU.I~ J>i?0rE(D… tf~a*ʘ1Ej dp-" 7N1Z<>6σ'tPT 1~:'Pトxa=}ޗ}߻^m'W9_^rΥ˴OPuNoh'd"/yc"7O"L7D6[RfMu.գt? wuC%":NDD|qG;A,\nK>={ը媨R%`SGw $6oƯ{gTy ]z݃jT B˖{cGj}#njQtsVTLO=]U ^.P+>PؘB}&᎗<>gk^8JFF9b#_tV/NDD"!lc.z.a+ە=ƄCYw*ƹYD35|=b'"r7ۻΞ;O?+0QnШ >L  k2X{҆MA@A J"b>i   BDL|Om=3sƎyE5(/wA'u-^?+Rʕ+KOD5k[j&+)SL E }"֦BŋL҈̛N'""R# Ï+J{1aѱ0sm\M枃QH/K:~yN`U ~Xaćs0NDt" 򬗸Ǒ`9xs\.PL4oք>cJuםR1Ԫ%KJ|ݿ;L>pH ;9a?Z9'e*ZT8IGw"*Rܧ~q"bJag6!W;| Vj `V8xDD17j) 7Youg(Dz&}wwҗѢi&GA@A@pF@θH  @aЂ$زqKNɶM|A}ɉ\v4slE<>F e`W#\ Oʗ)wKnÆ ""8qݪ5D?DPgvz/炀  1:JA@[!"FߣNr[udžUQ2f(|%s?yk{wIM$I=y-|u:r\b Ȏ\ 3ѹ`IЮuuWZ&Җ/]oJoؕ+cT;hEqAD\վC;`ST"C!Z6mݸN2e<>й""ӯBfUDpI$D_~J-;WFӷ?R*-6+Uafrz4K4qTh 7wX_'^ݔJԉ vH?\""'pK; }ə TZqCca>cV6[B9Կ_sybtwi҄q&HC2u>m g 癄;^FL}OyWb-1FE_ 6-^4/+6\w"Q0hAA(ܚý1a]t޻ڶ{dG_ "b(kpNE3޾On{ E: &<#novz+ZƄ뷯ix:3AY\c=1A@A@~HZ( !"F}?& ڋtݓRzW/#,RD|VY>켾gӵkWGyߨllŗM?PJFō [a-U[n@"F.Ï|J:vrai݊R~;;ljs" ΛO#GFTV*ΞyrQƍ NDD& onGfLB5%ӟJEَX1(@X̶iVM*x4sfV e\Pײ\}{( 2֘1kpmkNMX.]=m,"66oZ,yhS;SѓO>S`l}&}N"!p}YxM8JyC%"6iԐڷ{]̸ …KTxQȸ$"֬Q]3{jt qJDD~NfHޓ\˄yz R3TLj6y㋈h{QmZ{ lz{>b3O[*/+`]'ߩPdhh񢥔"e Ю:QcAܨ搟L[k!i?"b(3AGiA@A :"bt>i   BDG "b_H;Dܸ~eV5Tn6+?)?B\޺%KDDJPpj̮fSHa7ڕItSz{X Yʞױ>;r'|P[d)Ϯg\K@GNY^=-₈y&shh5^|c+vEkV9b bbelݼ̟/MQ<>DZHW6EY}#9/~` 61Ik?ž`d0(M4riُ5);T"" \˔#6&qIDD]\6(Q̥u ntRgN.j| tRO8iEۉ5V$UkBo^`ѯ b,ys`Yl9 <'p-""XS,z۴ND44FGe&Nm;͛ Q q_:ԥs']T_՗@IH9|(,Q\7BS )΄lظȠ >/̇jX.[" $V WQgv ʢ>mVmt>>Z1]k|#c'$9,gx3=IȵL$]dY|7: yEcႻT'""'kEnZ^aT0;+Ca'"Bqyݘ?""ic̙̜諯+sA@G@  "bt=LPW*S -ߴg:޻^QI& +7wmg.y:h(@ л[ƭIŗ_PnOvC:x\# 6vۉ>p (Q{ sݦ:M9q$R05do0ǿru&iEyr礴iZ?l)_ WvjVW*>-~02vޭ #\/búRW|5 vRqCd F͘=g]њ&Jyl`ڴ^}w~z:L+2 ۞:zc daowVMt94Vy'dw]aoukS;QoHom%'Weoi\+s<@imݚ]{PBރ{׮JY1iލ?QQՔP?m`,Yũ>l%y j=gtW*U\ " 0`P\4d>pppIe8$$!21i}VW]-]sTN"i#}TM;~jToؤs{=?HzuJր;U@?U!B7d-YbM'OFhC#aSB=غ3|b㙌9\շH=ߧ  @t Dx A@A@nY^EHɔ) s߽T}=rQg;6aE gUtKEQDLp-".tQ p '{(#(j*6y){z"8m,̒%s&z7V)]rՆخ\ Hgt3/<jF3Xz\b 2>cC.O1C\7'΋K,Y2oA\"h <棟B>>n\3}"˧dرc~F`0ukr!x&[7oTS".RY>6[m]6UQ "Xuםt]9DtVj߸&<%҄3LbknLIJ dXغ^7:0c`V Zn 7eK-Xm5T_Mg}YJ`}& 2Cf'# oMA@Amȥ  r8\Ǎիר@azIbi [8k){r l4Bb@|^ñ={+i96u}kFWjT_}n* ثR+}?=yrGcNWi%Qlr?(R"N^P){vRTt0oĮp{}r-}`t&ڵ[A@DÒ   _D@ŧ*$  $PВ@# B9Sf*Y8eɜY,ܳ*SQEC%KCv˥1:n9TRC)_s7-Rj˾*\\'&kdSm낹s[|mڳou-'  BDtBEA@A@ !"R  D)Br#D b;۶Pԩ_o^ 'BDh͹q?STTY 0߯4n(Jrm,ܴyjFA@A *"bT>i  BDuܩ  8#fjTfm:w3*kvNI&wNovu kWQ ??>M+V 6S̙8qdhE&5W$5D$e|?OA@A@# DI A@A@8D@q-      @< DxYA@A@c#1       $QA@0BD?\5A@A@A@A@A@A@A@%"-&A@A@^FZ&      %I#  g1ΠA@A@A@A@A@A@A@/0K%  "?d$\A@A@A@A@A@A@āsV   E@G+7&      BDEܦ  ъHA@A@A@A@A@A@A@p$A@A@!"R        hFA@A!":"       $XSA@(BD>X-A@A@A@A@A@A@A@e"-FA@A@NEZ%      [)I'  '1N`BCDΔ))yAst߂ { |t&PZֻO_:Y"~)qCu5 .Vu˷?P=e /(av}:~ب3P[!.Ʈh$PIy_̭̙;?غ|bJv:v$7 P' ۵^61^6sۿyM@n |=dg\b%\&ܢb5P Pt]ww7%JJA@A@P"b(hIZA@A@XG@i,]x\VĈ Lc"Z x;Zl#dɂ篿/ N@ VTf WuڍbbJJ[͚,mw{8f1O1mOC^|'<KSLՀ,3jظo :-]+tEޣIzś &~,Y*n԰ѾWUWs.ZvW|$|ǭ"^oہg]۽zӺM>ٹ9Զ&ì(wVzӮnڰ2Oo&.cb= 76iL^omE:/Yj]p)ή;ѳ>c#G}L? oղ9jܺt2y4wڽu(yq 𑣃x ڴnI->;f͙X=GXz-9C4iR]xmI  @ D8U A@A@p"׬M(@v56eB$:.gp1Ͷt3'S@ Φٳ,:-6,~@ʝ8a!T>†E`Iȍ͘9M&iԥ+5(̈A#)$ˎS8!a8B$!̝(vJ-mGu?9)ըQwU*B}7lz4p᎗nؾԤQCɭt&MigZDGysob)g  $BDLԥNA@A@ !"ZPD '"~7vgovjѦ%MQb "BƟ\3DGA |8$'N-l5 o0"STIs9IkK-g~J 9N"_ie#(#3GM4EwQ]_֬Rƌt_~eζQA&ĉV]8ANDHyVڶ}MZhFsiԦm{}^|Yd͚.//2Ic9q"Kܝ*=!_zEY]tI=u۳5ȋy^onn?@!c6S4ityhC/ߞz TO> OAE\g;w܄O+!9: ZV"%"֋Z y?S"VU:}FFr;wDD].l/!f;~yih  !"&&A@A?Qr"Cn`:R0AJE;1\ dp"],o=<䚙A k`cL}zwiuЖ1ԥ[sbރDD ap"E 6`Z|ΉZ*qTLi$i6{*Q]|٫\s?_>M7vQ0E֩ϡٵ[<Џ~*.Z>vZTH!jz;U7z֡B ңY2S? t!Zpqq,XTPAʙyJ:-Ly_v}JcƎKE{k֨NժV 1R6rgYڢª5kmYZjN9RInދ.ѣhr:.,\""kլNٟϮ$o=fVPV۬w {+iyVcJ9{qP~t{+u5vx)ݔjpf:=>fH>s5&C[e;y|jDs7ߨye-T}odE\rQ̙իoFAh._,^z,Zɓ[t劚 ҈Q}!Teʖ֪PL_ܹvZjO2jzL=]{rϕacnjT│"1i@DuC>93KNzh>ʀ]m|4iRÏ>G<䙪ɒ$<-]| M?s,mڲEHk c@7?ZF > 4G֫]Vˆ mV W.WnK/WcTD1zg{_~wkhuU< |X< _qNiu"|EUy5&f):F2^Zp<DP/}3Okeﯿy%wSuFU8惡Ph}Y5zSSu׷W_AVO:Y81Ꞹwa{j5]֭۠cO A@A@p]C% A@A@!"Dmd)=ivoF 1g#[ p'mظYz:&ٸnrO\i=>NyA=R)>cNEx A wncGdn?DD\`&1< L4\1lXrH--7 *TR 9$B U@cNDD?&]U%K=vPdI ġEK  wUBU+W"Ì_2@gǏFMP.CW;t{ˑ4n"p#|=dUqrqǙq& EF  &V.rj7k $~Ϸm:ys| sUȍ7DD{*EƼ,&  BD ?-  !BD8ΉvM4$''2hohk-_=S:?~O4DDX }]o5`H D'"BFN{z&"A)/׮ғ?N $IbMaCf⊈|bzu}Pںm;]銪;E(FoZu9 p{G;Tt{d<$""w?9[Z0""0Pd? (/٩&c@r՚ljόiYYz-&]# }4l\ճО(?;J=K*!9sA;+bX @)ߔ^YӧRn ,~xz)ڭh :c?p} O~3;SN)؎pWAX"ꌴ!Ao-:@wx\οbʒ9N/4ݾDD$b~ߕ,Q"AqqVY8lz  iӤy(Ԛ`ʼn# Q=cx@܆Jj>4m[=vd'ӟПbL6DD}c~S\)|B=6p8{M[1PAUzx˖)qG\L6ܵIU W.[>ć XڷmCM7շjٜ2RZ߃x3֭^ivڥ`S7oɲ+=؉-Cc0}J޸\/_R.[c/'|[XAy6wJ>@ND40_p^z)/SL}d*WG+Ɓa{fƒH>_gϐ>?"b$% wXj3NiRԩəO{A֥[ڲ5Fn"sctDH0}|8NF 믔i" 1A@A@"bIA@A@XD@f,ʼnNEbcoÚ5嗟DM խ܏?(ߞ>7b9sn,DNA .D@1 `W2(GVs=yu[QfMtL\￧&M[Z5T zVdqA8T _kd@;jH- щ ;tzSK .[Tg9tȠ:dwlڍ?ok`O:=$lȃTiwg|_( 1R+}+_`, QҸH˟ a νw}Mڱc'ˉ(`<>`\R7O&񍓖@RvoMy5l={AvW()7viݪlL_q$ ʽw̶wLuܷ{'}w*}5OZq8;׼' 9.g͙"S1 ijiZ}-%˟ׅ.Pm5VH1zR#)m^y|r%|"`Xr0:i5SsjGn{gK)w{Qޫs.=?N&M`nYk)}:No%B%` sc4 s;SIS'Oa 6n‡c'-9}R]47b`E"+/AF/NݮhWmciڼh x>MWnz16X$kc\M?JU<ʂE.Y-b'&#A$㥮 4C46=ѮM1={Qs2R1C}7M Pp߼>snuKD4ptL !DaXTZCC7.,w31:15H7~0TT +;37nؠ>Y3tr.  A@A@A@!"&(ϐ)7WA[ P5FP2|Ӵq͍BP<͡-J->k m{^ȅ p""\Z}s5cS+ PBʖ9 .ˌeȓ/!xk"۴B*"u3np"Kqøu:^ח3,UE+ N8ԸG^[""'nM>5\A3pܝJMcǎk+DŽnSjǼO:e'R4P8?Nع=r%Lam?ڊW\eq8 /ɭ"X!,?SJ@ٳw]K)ۏW,ծ A/T"b\zc%aJ6 %WJ0% 9u"̘9K+ρ8{cǎ(ZnlX2f̨@>ۢ͑u^<`׆ݷQP>.Xh$":` w(Q\ҹ{C3.`iWsM4},?qOsƥ8ΡV)&qwj+av2i)RSI=F:?g&fڊsӾ$ɒjc?? \(]Im&M\@.A@A@ DȃA@A " D~ Xp@IDATY*sc׫Ҍ) ? 6iޒn6Qm ϛ3ӺDD gQ9XG6:U !CjCihcODDoPE"4 ɇ A=,Mĺ fWHEnM[\ytNfguw)e6̄q"#Ɛ#y7#;TXZ4kj}$p!"1A@A@# DI A@A@8D@qnݾ㛚p7snjԵR*e}q}Rj?AN|ɧ56.Ο;K+e1[4 }#ϗ7/AbYG8prm;8~Sd'79>o.^ޡe7@onY+uꨁ3=烿`Xkoد+WmШ ̸bk/ 矯кuN{ }RJܹtDDW|4|·b-q"'e;^"o(fCDzF+(ljN_C8wX0n|DH߼܌_3Lk N[`"b$f$ct0"QtR 6rHL7Gpόc!7|d:TeA@A@# DH  @# D88oۡvQu pٜ9k&-&DhyApU*BPA95nW1uADĦ`Zڴ~%Sn)"W=o(n]:k{8[Bі Ҡup/eʿ]# CiZTPQwsL@GN.b㛈hXI)TU &aP ]Բk)}:)\MlZx _|N\GD4iA+Y-[dli"g"ĔTl*T.'O]˯OB!$6"?OAa۶e>6^'`?|~w?Hjܵorr{N9 iI'a<%0wOEpiRW3mL0i29V˖,ixoZڎc]{.g@?~5Vu@NDꫯ+U|rp"z⃈Ջ X"IAD4u3^gjg9̤7fjC}7MyDDc%7o97c}8e%1w31z)'GYIaCj7{Ks0x*>ⲏXܵVXeZ7m  A@A@ bI&#a*I=JG˖T}(i$:D 8Qي"b< i 3)|q |i^?f7TN=BW,[BPu'^ }8y"TaCg7h9uش`uOTᖀTz5}_~%UT5[GDDYJ anpиJD<'[BCd9W]A۶}xYEE1D4W"u9]Ǚ""6Zv *S4}&XTuAoE6eCڈ ݌dc}.su EP0apR ˊ݊}i\k֮+W9}2H  BDC.A@A@!"7Kr[uDŽPȘ)Kz1! 67\H^rfp?ɒ$HG!"ryN.lfu\ HPρAD''u_"xWLAƂԅMbcPAڲqR,n@4@DĪ+Q7:wMp"薀f7`$={ц E/^W(灈vES.' ߗ*V(YD぀VHq@D,Q8!T\EM,*g9&~B\._ʑ [$DDs8b,{\9sZ*oؤ8qM!]tj1:/fΜv+?s;v߳R򼷆b,\;\1*"9M^rp? T{*Oar6o%9qao+2^i=/#* u@Ɖp AcxO֭YAQ`u%MӧN/zo3clp52i8];W_I`-[s*ى@ʩTWl#2hW&C%u|8WeϟbyMX㏗"Bw岥|;z8=jה3g3sćc[q:kL6.JpQ5VNB{_8*x\NZړvCDD[wlߪI(hRJ3A(J쪬#/іP,֛ ds:ܗ\ZPM+#; x5:5c}pHhc)v>19z!t؁Կwv|-}UIRA@A@n9x=raA@A@ !"FxTXqt"z$}T^2dȨ-PڴZ ^r9}yIb""Ȱk^A |!"3T.LwK+͚4Rp""BYV2Q6׏;aŝÊP'5kT'l _AN͛ӽܣӞ3={.}TO(we;UkPt:p l/^RLAڵnpMh""boKLj_:ʘ3 eɀk7ͭhw թ= *=džHQG2(2}F kF5Y ""r)9{j?m4z8mH DD.[HPhȄxIHh]>޽{SݪUwhՂ83StN?|!-[)*V1/_ҤNEDDE[7=O4c,tW;)R["}u۱-sgQzZ:}C)Ȅ11۽wvѮ(Ju'Ѯ=o;vRN7dż %Tڄ [6CQERݗ-YCx0a$/TTqEB`mrCvnxg+滧Nz>(+VDPmT?xP99(bn_(cƌZtljh㤉4)돶ꃰ=A b2 &[X~@$z-Xȃou5k_%ryI'\f}w; eWJʗnOyΞ;:BO>Vߒ0vqB4W(7|nOJ]օjת*ezM b7aN>_:ԥs'Rx/Oj?ǎQf7ve8&T'ZP2 q{y髯gwb4 <䄟=M7:wuxND4avKb3=l`;y'eqGz‰X/ɋNdxz~*p Q$""'u.wn"3^J 7u$?¥oM;y^ۉƌ]Ӛk"uu!pNP2i>c?:? e/7kN AZt1NN`b6=ۧU!^U^k,\?#~A[ZmoÃUksU(' Gisuu0太p጗;[$fuqe} R4unvОV#Ppƙ 1gn"_c4 WEY0vz ""҇2C9}~PNPʑ   A@A@G`*S,Tʔ=%];{ڣ^'S8l ^Qhڤ({=~OC*Cۍ6idq˱.:n:KmpE roWCÇVuئ`?jT&^oqLYy֩[^}Nu%}@M+حGO{^=#xWo𐡢C:G´vrҊS_=ek״a`L,^oL~ԪDRvQN>f򵏥 [[Cnݶ^\>/1~n~G>O5ꫯg]JK$wg+]\YN#ۙVͱ۫WtNhP c3^m%{LW\n7ۼv{ WK^e^wY}Tfso]ǎ:_WA$vE\ r~B:ϸ~w\Zڷ3;xߣ4+%K2ft~~zz_|N{KWKs 4\:LnOqc~({=,Ix{S+J@L7$u^ii>6|8޺+L`b ݮ{ igÈ>ѣƍHLeơ|+  @dD~*@@kV bdv͙2IΜMnԩRɡɟ۷Z @?ȕ+t&X`OӈZ;\瞜r?}۟>GРKzځj'MaS5}qk8_ 5k()<;Z]O' dfͲ'oj ~c֫χ|Pt(؆"ly'V:t__f2Λ'h9ݱkU](5vT)@+1ȗ/d==rTv uEgOzkX`>>9 9ߵkO6ŶyqvE ߿s7&h2ٳg~->/  )@1:F@Adӕ  D bF\Vpz.[(ð..wDSp8@@@D @@S K   @b D_mkuϺ~!cƎ khۉ b׋  \] Սh  C#  W x7D  bpNB@@I b4׊ $CɰS%@@1+e+DuGr-r9ú~~Ѹ,/S I7;Fmp   .. f@@_ bsF@@@@@@@ >"Ƨ&B@Y bd      DAĈ.@"^{}#      @ A@N bu      xD`@@ "&8C@@@@@@W bzr4@@"Fs@@@@@@@ "FXp9  &@Zq@@@@@@A֣  eø\@@@@@@@K   +@1q9       [! $@1$.#      '@1⺄ B@-Vs       "&>@@ U"      >}HX  Ss!      /@1M9"  @CJe?#>$cF+y^p {5       t@@ 9D^bM+GX/S2dP?6?*Sc˗WϽW      Q,@1;KG@AEwqϞ~/h\m cGԩSuܹs2ex@@@@@@@ }Ǖ# B bu;س[נ/D\pla}@@@@@@W bW $ ׍#O"@@@@@@"Y b$׆ \# "F^pE      DAH @"F^'O4iʥKSgn3{ߋv|9I2iw?r!wr @@@@@@W bW $ ׍ ;{̜:Uvc; 3YRVZo3@@@@@@@ J"Fiq  @r y=i'ŋr 7ʍ3:{ުx8_oS)^i5xq$$7[Sf/_q~-{w@@@@@@\ bw  DAlٳ)kGx\\wkHיEf͘ɐ-sf:>Cr='x 7<        r@@ YDn||Rbes'NZA 5f2ܻu\-          !@11۾i.\}M9UG "G*.} "      @D Db@@kO by6m̡V6Wz[fsӧN}7#      ADV  $AԎRN4ٳȀ>h%]t}=AKC@@@@@@\7\  pMDnN2\tUQSriz]q%ysfJ@@@@@@^w\9  ,"Ff7ޜ)yܔfI*}*6MVr-2"Oojןwvc      DA(<.@HC/r       p- D{{G@"@ bt      A b@@ n@@@@@@@ @@@"       -@1G@^ bw!7      ׸Ak@@ =@@@@@@@ D{# Q b@@@@@@HbI@"^O      .@1{G@\ bw       ׼Ak@HZI@@@@@@@ D # I b@@@@@@HrI\  pm DG@@@@@@ }  Q-@1G@@@@@@ "  @ DLR~N      Y b 9  @\"E}@@@@@@@ }  ״Aky@@@@@@HA'r   @4 D o&9s挜;w.hu^ҦKgQw傇 (2 ?|ir[G d˖UnϜE="[n_lr-@<7UTsN_%>;ܟkW7۷G #5 xkՔl_jt~] FjRnmsHk     ޘ3  "@1$T3rC2fW۔xɛWҧ^RLi]tIN8!gN{7)7h1ብ˖G|xu[֭p$?wdɜY._,W:}Zʕ--}}ͷ>#iER<*gF[> fúՒ:uj+?U՚_3#}g&52JM7eHdڌ>۪=<\Uɟ!I"v3wtK0M7FܟUwJÆJBM lݲEsi'~iՀ%Ԇ-[H ᛿JXP     A#3@@Z y^ŚrW^ةdȠ~~Ԭ]G̚6]bRYzUIؓ'10|HݷR^UϽyzfӦ^FWm ^zV's~=/GIÏ&RV&sжMkJ]Ck-d՚5!sDO W}k_Q]~{'Gh2۳x^ؿo^o.7pV0qR'F$pAD|_blacdVo B9n8`r3RX1yr%zHǷvKwqV}~/2pd޼y̙g|0Ǵyh@@@@K b|Ir@@"Ŗ;=u \ҥW4a.dԮ;}F/֭GXU8PrEyjU"EJ)Tc?NgZQ_yӅPs׊qcF{UyWj=y{(poy"ru_M>SKtr(2nf''>yH's3\/R۷jk@à]ҦOg=ߛezzgwTSɢEKdf[O 0i X79!o/2jW>=} 鯗SgNKV1Cz?n֭pv0q̝Yeޑ{2adz/WQ>ϻGj*!7Y{egcg "ӕ+V'Ϡ9s-2d_|vҔwnzJW' ba%zukKȍ7 S֬Y+ΝW 5[\zyE@@@@!@1y#w DApZ QL/^>=Eލo%?`j _d{:!2=D4ض}ᇍ}|HI>zB~dFvov@/vov9=ZxhQ8Y ]V>[׷뫿 hLL 45XTy&q}0c٥Jj>U*[FZuP=|ZAZ/DŽM\QҢkNz-[vm7+ {!)&u͞#: I P v[cVkÏ>6\iLX_oF._nor^;uh/k4gDÐ4dp7`k>g*7h:5C7Z'̼7۽!uްa4hua& b˵b=5=i pޫr~S1ﰺ/זwRTI!-2    W b[ @ M ӧ$Mf8ӧNɞ=eY~/eV:9z~<wiB O{w3+_Q]r[tNJ۶T#WAD}+E6@uShkb}թqf~V3x^2viR:_f#>s)wy9tme+U{U%yfw>Zms=Kqg#@kYnܱKN:)yr^{_t)_9=U%S,*UL baw3użwwٸqܕ.ѐ{"`@@@@-@1y/w DA"w՝=wVfN*;v鱹u7M8L3ftbFg`oG[C3\#cn]?rʚU7` XCV6{+#F}i%,Ͳ6*U ;iӏRA#>qN=VON}HJfV1QRC&T1Mj5tENs }fxHB2|XZdqX3 zP@ eNg`ú, ☱LQlhIÏ mݲYWQSSÄ}nzi5slQ\ֵYJxUMhºN]ߔTADb{?{T lɘ1c}V]Y}# B m Dt7C{Nҋ1AqwD۵D@@@@ Y DLM! #@1"j5ēV Vnp=?w 6t]timUA޵KRɑ#4+UL&L$+WO?\[ϻɷVxJSѮj羾PdyrKLޕ(uhkL:;@C36d# b|Oۼ;x1)^s8rwXs柬j M~Y[om65]l>ZPTk߱OE@v=WѺ4eVM:tֻf@̜3tlm+/1Us@IDATvApÂ7kRVZlYb\}z      $kɺ{9@@ "F^e=e |Ԫ&瞲gK^ 5#&01MҨ*g'w`z *6:ie];wHJ{aT)Ef65l=,kU_ifCYn5z*ZN^39PMɓR|Š7 ;\lڮUɴsu d5u0S(A0 ;AN6U!˔.-=u5" pNv*.}b?21upW`ԡlM b|ObD;w^65Ufõŋ~}{:lruja5trߧ6ӿAQ7PAըrmҡSg3۶sVvz>aayXS*m"`Nݽ'5[eɟ!ɒ%d&.]z3 DwؚO'|-O{Ҭ' @@@@Ad۵  ||Rbex 6hIhљ0[ٵk3*Tza:YhHX%R̵{Ws˲tr0` wCZVzs~{ܳUeh5Jq҄q\ִҟigX߆Tt 9p"idÉZnvpb};rn+wU3gl "Ĺ fADH)e/\ ycY3άwu0kՔNڛu=Ă5ܩNhXpjXiӺt%λ D|Z ٺm{PT.pqydLe@2w,WXj.YC+|A+kE`"eG@@@@ y DL! /@1[}T@L^ݝz 3њqsL8޽9"C =[|wm i;vTϘq%KԓgULMX^CZu߸SCGsgϔ4i҈V/+LX}k %HףeC/Zا[Iƒ>5شY Q7S(ρYAVoŋ^tqcF~\O.ޡ9O ^H\'>7x _}-{crUaU {lo5yIcnie$_ͺp+lzςFԬU7 /:u^%ڷ35xڭGPúb.]:ټRC.=G)':t#3Xv/V~?W*B cǤxjM2qX-\H)P [SGJ|]> _:\ xA8ADua_'~D " ڎqy.S -+    _ bc@h=>:uCΞGRo4۴"S"S%JU[~̶@+Fw*!6{{([VtUկ.5^}99 7 /^^xQZ;]oI^zY q9gWJךCPȭ۶ko+|%Mf[ʊU*wٮA/T FgΜ  P>>' cŤ $}1Cz=;߲V,\pC31Wz 4i4{F&؂>/)AD8ޯW Jn:mΊ3݁sVkk͝e{(ygE,3ޕ1Dt__uX{ڭ b(FL;9scG{kxdtptߞ?ҥJه J1 @@@@Hv]rC  @t Dy=R4i^e57ݮ+ ~L|jU% Ǻ6_3Vn\{(SMw KuީgW|*4xڽԧW)#Ƿ7ܵK*g̲W|}hQ]u%C N_h)sΚ1չJ4ӠA])Yܔ1V=jx[|нv# jŵVEIgO:T[;J|6tշޯ>|--IZU48!" /UTũbanG )Ν;'?)R 6k-LDwe[˗yʸ1M;yTc O[M+ԚUUuzlbFkUI5,xԩM:v!?3UX'M*|{&1'96i$7of/تV|tN󅭊Yfu?|;ftYo O޻Ϝ{}Iue~Z> H{b wyrl';L{NRͪ4~oj8|U׮YQ˄    O bS@*]7g$9s#7eYRJ%>$n*ǬpK-*yxj~YܶUQNCZ,gGΝz?;fVW'1sV|G[~M^Y;3 1sXIKٷolc:}:dž r`AXac]âYYj?>z妛3+LD1Do >B6e}A:w 5_z\ƸϮ _ٳe\rYt&4l13}pZn͛t`3W@@@@@ "FZp=  5&@pn7KGݍ$WRYҤMY.\~<CS7uD}XS~PC{@@@@@ 6;" ćAP$Vf˒6su6$܉Z9lՊa]e+/;%?\TO,[3۰q!    DAĈ.@Hs$G<(e=Y0 "jHxƴIgvlݶ=K,ŋK>C36Sp̳gN)SʱeO?ɀ-[ڟF     ħAX  ! D @@@@@@@ Q  מAkϹc@@@@@@H^Wr7  @ D.@@@@@@@,  $A|       @ D_O  Ah      DA.@"^k="      @r zA@L bu      x Da@@ q"&7gC@@@@@@[ b|r<@@"Ec@@@@@@@ "F\pA  %@o@@@@@@Aק  UX@@@@@@@G  +@@S bbjs.@@@@@@@ "ƿ)GD@A bX4E@(R?sڽG֮[^4I s'ݻu57~bb6Qz5W9oo/[$5\''cE|n}Аa2vx敁؋ɓ'ref@@@@"Ʀ6@@ !lg W 'K15YrEjܒ)DtHA@@@ "D@@ pDܳg@-Ś%H 4e͚ltC.^)@@ H[nE|7CҦMk8p5b { 7c0UTÇD 4!DLHݫ;%K>=UW "ߎKe@@@U b>%鍄xr!ssD ΉV    )@Ӄ%@@D A.!/}E~9eq%4A@t8ՅHM:s<+_P(~5mѣ}vһO?{Pڵim֏0A+\X+?~B5+YfǾ: Uu)RB yG\iي2rW* Rv,O4Y[lQ֜ACD{4y_\r1y]iX+Â׫[zȍ7 S֬Y+ΝW5͚J[=iBꗔ)S dm2c,2mws 9hk=YS,%Gf#|fCyvÝr-)Sr=wK̙…9+Wߌv۳HIk9s!SZU'S[)SfH    PJ" %@1(DmAԩX`Ni(ݿODN @rp4@X2Aߪ{@;b ܪM[o3˧؋~_5\G˴3hӜf_ l-^,>Bl yuhάOd)ua҄q\?JJ>mtEp}޻ [6zlтһGw馌;8c$>b*iּ(q=HݗkK[_SJߌ bKR57fN:ش|(ɟ!0~ 3v\mB٨/|&YY3?@@ll\hnC?k˗M?m[48U\9z:-^DZeA%˖={H’{:}Zʔ`^uY$.U5''Ԩ^̟8qBhվsۋn95c#o*iu /_ ")j\xUE2{lPߍT}X6eU=nexRI.+WTgyW嵦1a6_o:o+W@~SZاSw3[$SjkƍrWɢEswQ+!jJ{G5 z^mHpkT7!T=Vr5,ٞt^CUݺ~f˚~Vug ӄqcs^ʈQ_reKKϻC֐u_i v6 ݣH,gT'quH#Gy- ZzWok(}[7n$4lvoH:/;AĹ͔;lW7'quǜCsPx@>tG۾xi]̡4Tdaԯg^P>3f3zṪUSEj֮c Ou    Rc# \U UDj'*E.^oQnxexYmvٳ%5j6M;&Z&& Z;l4ta+ Du=2eرTI}pP<> "CJ(nU{acZ|`UTԡK ;n$yM tw8׊O4g4]>]Aw=k@@*@1  'qKe.aZtO*|z I:_ag>KVYc.\|]Gjb^c](k!K[CMj5Jʤ>q|ч&/vov1TZMȗlР^X>sK>9oFz|YW$@&{3Z?n]\2fÐå߀jU/K,rۭJT)lOԓYtZ;e7s^7mXk_޿o}=J->h bd5m6:=ٿ3$|mf;rA͐ǺPyzGub|?=y*Z}ozYv䳯!k(}f2<}tWhtḹK|u`5~Utn9H ┉z+Wu*c& shUְ^tM.{SaL'cF׌:fN߿akVâw~;̫]ߩI>90WfW\+}߿]"  U  '@1L2d~#plq;qOǕ8b`뮻 0R:˖-f;5tl}ߗ-^(7ݔgXgC GD,YS}M.Wwe)K{5w$gQÓc m~ea2wv5>ѐܪKn,_)&iG_ݕ!A:/R\@Ϗ{PLnsAĵ8z sS0*JGj1)~z|*y?هwjROrN;=׸JoOq@@"z  ;^Nֺ&\x۫{c>Ys@%{3D?|\+Z,것=DemrnYTsנlY"~ҽgocrU1P 79t\[l+9 ezOv1PسU*~`1|Q>cY7sdɑ#xP|S=>z@ #nR+RٜZu{=lhE ݎ=*%iG_}ԨS%DlXiӺiqf:> "{9sF?ߪn/{^CvB6\xۻONZb…5|9D4Vz}5kzsiܨ~ [z_2۰a4hcİ!RУ{ QgcYk[`O:5>Z.UDtYg̜%o}eY|9N|<D=kdSZP&|gM5Ia R~׬ 98l/p%s1D>7֪"   F "  @ DLROD "t?2o$ݖ%r:+gj-og@i}/ӻy_͘yc)THl-_R4(xsbƌ7ՁS>_ݽYCxv{n kD5گ~TY2vg5EUuJ 9?Y}y1c{FBgMY3TZM>;y>4Dò:ρ;}}PӐA32f츫J+_ڤi׻o>b>BE\o_|hX-|5r<æIl؎6@@@"^{}# %@1\L⥋~/Z#gNV ?;ߟde&@X&ҼEK'ʠ!1UțWƍm9|䈔,U?lԭ(ڠYb*;7sw833teT}sPtڿo}9{l2m$g("'+Ϝ端GKsg*庵w˖-!.{!5.]:*>:,>_ս}rsIΝo_k(}һG7yf&lOʕn],\8O4oF;YxT\Q>C| y*ӔI7oI9w|4{4{9EY8|ir)wߝSXfzɲeҲwuW "B v:0P n   &@16! $A'?F(-͛6O@ ͞9 vihio 7(!z˔)-nN\f͚-ǎаvɾ؂'O^Z32eKKj/wKy|ffZ?r\tIc~/nh/B['LnU7{$s ">V 29V2uݷתwUdɜY:~Z59qtҦUK=gQ9.P#[R⩧J+Ͳ*Kx OZVͳߌe˖K-;ϣnwusRuVΜ9#%h(1]I]I1>؂vWC(:Li͎ڽZ^Wc ";uh/kwuADު*"E v D+8z^zwfZ`]?2dD6l;ŋ%UTfu0AĪU*ˇY-':y{=ޗ U:i @@@"^S" '@1$HgD}uϟVE?n,7h|fyтyi6f@@ at֏>x_mta8y0^e^2]u]QWP"<{WnluVϘ%nYf5 1ҽgog]'ڵkJA^+eUZICY6m'SowMo%*G%i`xbұc{+{v:d!kn[%;XAF؞ZcNJ٫@k؛FVR\Y`Ǐq'Hܫ·'oI3?ew'Rڬ)i!dHEڵ-vZPYB"IvIJ;E}}hB6ek뜞;3w[>˝̙5=+~6/Xpnj']_zm     @@ D ^7Ҵ>EZ/x{pۧk;W9鴼] sΑ? 6@IDAT?/^\5iW|*ߑW:z)@@HTzh7  A"߅Zf"gn9⽐딯p3_d͚UN:$?#YM$KEJg؄Ͽ &M;h{ͷzHJɉsxdr٥F_܍_\ݻ!ז)#2e7UEKv9M= wu͛XV-Z>טw=w _'ٲeKW_.VXYi|pUo)t6DL޽G*#Hvvk]+s>9zΝ[4o&nӪuYd?Vi׮2Auo믿ϖHzq rᘱv]NZv|GSO?pE3͛7ԩe,~ciؠ+箴x<ɞ=QRuRT)<w,Ztԯ3$o</FXI﵃KDw.|f Y DCx]u%{!x{O~/Jz?b0,x[e>Tx]ԡ32}VfM-ujɩj00ٺ5#+b}?IK{nJnQsu}㱾z5o.ǼkYRtdn`+]1θ{ "F4TpG}^rpTAH>YM aD4ryTe|SsrSUVۺO^svJkpím5b {~z7CO?t)Vh~}{{Qå2=ZB4{0]ڵkjղ DI Y}Z%pvrU׏4ݧo?ZjueVXۯlEzJ|&cutt͛Hu y8h >_zXObmO7?KiXbyMϡz ׳Gt!N:|0rzM5޻gw6=   <@@ D+oLy}P\ vR;~.W4]~g*,^)>yo.4բtK|vwˤɓ8i? &cAD nܹ#`[oϿ oZKfMblАRb/t{c vQxŮR!MQ+|[*l2o:)[9+gN}nTvya?L͟Jz8$%K JqwQ ]loMwr-j Pr<f >̛W|23w0ݑ?hqe͚Ta3Խ4qu^7L rfΔYO^w}Y\jP( S׫W3w|b[YhT=2uxyɪzq#= bZ%>b "jnL蟏hF 65T(_΄OX#^o|$:!CgqlNK眲7\WlSzraB[P{wt3`͏M&F1-+b}?'nQC .7M%ۥT.gy3?iʗ_~%#?P2In^ZB) "߷O>ﹿ-#   $@Dڜ+  Aķujo(ƍ=PZzBJ18Xfm ׭arbޤ}6uOw_ꗬкU i`R y1Dpg/vmcDj,皐!Qʀo:uE5a^oɍ哪 vA3ZVowDckH裏n, AO9ԻbBFF!Ip٦cBUBNwx}םv?7u^L507\_B/uӧȿw?.uPAđW\nw˨థ9k6$?auruך*uߦwt'LtH+62x/gE߸{ϓUs5. _THGM; UW]i'}/K͵|7khGI"Iʜ)l߾]֭F#۽{ʩ k_v^TuY9xɧ|Nh0N/*lkϲ_ kUH4VfۋlI+m0l'׸äi<#kHjI?3nt}1)}?qbٷO/\"sE'|:_otذaVz%;O?oɹP "oؐrٹ&sC~nA@@2A ~9=@@ "5xfK -?OV,_pr}TffS4HX4-_.K5PƑVz5L_t2[-ʕW;=;x'L7{?{ŊҸYR%E h#=3Os=Ƕ#nJ[xPZ|n~ya uC[)J\B:^W:o=rSj:x3Tc "zE`50m$y}kRSӭ Jw^yvJ->TO>44Ut'*xzJ߫5zyCZujxꩧuCէ 2aHCj=~~Nj4XU^lmպMyO:]:vJ 1 gxAUVKgQ]Jޠ͛5 {Ze뇓b&Ǐ ?t萜l[j,УnOgobbh:+x=޷N1!u# >]GG:KGwu |gg4тj:_P>TU7ZϚ9v?ĸzQhC5:fzs+ Y@cznFM'WT0݋Þ͛vxpqɈw~nAC8}.   p D<.6 ģA*nq}-ɶ "B6u7~WN_Rfm^!3SDԪ^t} RADmCi/nJlԮXMpeȰwWHuFzgz2EiS&omS2s֜Ki%;ʟM*aX˚5gj㘡m` xRDʖUTK`qp%Jo1ʖAU"ժV>jh- JReh,(kLڕNʂ% ϱUBWנ]w?;X5YnH nB2lٺ"VVT{_]_+LZE̙L/;SoXD}i0yErWٷ:=yggF7wa 7\guZmu{7CÕkLuK/Ćwu[ޛnJV1r޹|r6*lҰAR;4ƍsyy!^yUF86LADu;xPnr!᧟Uk,w'}3Uv]dhҲn V)e3   &@D/  g삘AP;!j;ۼdm5i lUBy'3]&}lq0# Gy [9# bv,n$T;u>}yͷC1IH SXl>|}FpcJc~ ?Θ6IݻV  kbPumiʤ ;oɘ1lE6=>yv" z]E;͵,O݀VTzɂykë\⍦ku)A " ~T7Aunu_<{Ap|yXj´AD t6 Ϟs$ϣbŮ Y:]tw]XD]4]KnIgh ^K:hQ澱g6 ZiNʬ?(c^ԅv%]RUoyi #=Y~2w<[Ԓ_H $G\70#f{ѽ_~U>>9Lev.{n¤vA?D 6K=뤓NE7{Lx>{,>_H]]2)ºb%Jn]_ǽg@@8"WsF@H b] ^gdg?4հzJgp ?/Q"x_ QЕmpfD -tnk"_Mn=F'y)Dl`:Ze'xx][ilQp<{yL@ZnoҠ]~"RK_/AjL/by T7f"իCuXCr5 7]*Vl`vp8ZAw%}m绁7D,Y*dZΝ[vzBgx4HprWɺ ј7nd*629I2##=֛KJI2_=oUJ!?oPϝBUs^Ž{?$0߻ۦL2=hzughU<*np{ͿԵԩ|u_XDU+ACٗ\\jp[dv[/k/U{oK?9J^}VԪ:!`0#n> υ9[ D7?rN";v5]-gPý%O.~"z95iXk~(CpUz0n=}>iEP{(c%܋DtjC@@N$'\@@8 <ӵ> ;r[KV;o˴)U2=7s%'e,Y:hEDyt<5BaOI@ VAD n.tH{oaԃO L 6l/wu)o\p_z@ZZѫΫjR U%yszV`t-lUKfqqLXZScv]i/:,SY"eyvV/Ξ=G{puBٞs9^p՟È[ك{ɕl֛v^LhUϧ~:Qgɒ?4B1%!w %C^jg=7lB?-_1dQf͚^+vv@@@D x?8@@8 D< Rfm{A{|~K~ez:\srG/t_&CAD=#G]g}qt۴q#{3L`BH >Vlظ[NH}C+Z(xpf~o=)GO ~ۯO/[eP[/4¥VAëZY)=<_C:hM:"wDD E̓nIwmeE FrWɞ=g^Yͅ4z@z֪݌2! |>5)ݩjprN[ DGz<7p3czh#?Ҳ Au8xعSjcnj|=+n{ۛ2uOd+nZȲ+Bn^Yn?7uo=O=A.}c˃0HJ]s]b;USk׮)/w}?e4ySg;r'XZFMSabRUC6(ʙnQzְ^َaV X6o|iX{^ "zNi o'}ޜ7{}vRsC[nZu^`/XfW.z5]O^A?NY0 s_+j{ʕ&Ie)ujU+KfK/65`dժOS5ׇtѮ}co: 4pvuJkHlB]AVH 8zAHi7\Yۙ@5s9kF5h5o|f"s.z1S5Y=kP8ytK#ng##俅&n1T]7W7tj;7PWkuGб齰\ٲRVM_b^nӏ{ljDt?GSԻc,A|qwh~ nuт+=޽ym4gΐyU;L W{]+7QF{ݐ?   @ A.$ $Aĺr@ 4],9ꍛ&U ٮ`\]TNڵk0oQ\=_jjw-Z>}w~Vn5?""j׽ ('R̙:.P;\.v]  zG@CsϱBu225WX(tm,yU Bxy>5mZm;g"_n;n/ec h l'kݦmTݯ8#n3gOIDgBWV~2nP ң{7[Ne:2] O|>#yg IѢWq s_ntJgvAmwATD|u+yySW*\ #6EtP5w? ld:OPl uU_?{ XRސFnEs8x`{D̒5 D, vMQu{5V:cz )]7]O6#'f:c fϑǟ8RY{56=k׽_D+v_(xYun5s2HJ(n%_|UpT62P9Z :>hHCY/RB-<)].:=yg.58 "{Vmш̀2  d0r:  @ D+9Sf?!VR`A짟vY+%z۷[dywv|گ˄X,AD=ӧ2#6e\pvaTXtG;DD@{CIo'7ǫ9>+>摨LMQVp#)m;f<۬N=/L?}Z醻 xuԖ֮ TԠѣlIիO_Ѱ꩕H ͟3׮N )KN=Tܭ\hgmL/_2ЭU4uGml"n-$&s5̴L>S 7ʽ&WB_[/w}X n j.oY׮ڛCulFεC kh#noks~~s,^4FqlKkc&CM,rmB׮.-{_ko "yVsZKR꺼𢌟8)pSiyOg͉8붺H石s {AsZ+<2w^~[/WV6jsPv-}Aj7/ ϝwf͗2g<lڸd5tN}&3Oj} hu⫯*& uY \Νl{ػ?dk8m s?B~'˥fRT Mpo x.th5Ç5_~ ݐUC[ g9[iLWgK`Hunj\{Mep?oyj='.[K;v3۠5eHuӥݐwXD6رˣmJsO5A o䌩>`$i|}~ua8EdB=6Ͻ!~jЮ;u,5}Z醻6E :n&wHC-)rGn{{Gs ?#ۭ̈#="RQwm6uh3\MMQM`]8# @oxgv"uSI2 6i"bz/ꔆP&83t0h@? ^A{zz]Ν[Y­6es7KmQ^HD. uM`{&A7}pv{Dt<σFM'[m~Z ΛA_ /&2G MݿCj֮k~-`|I8Jʕ>{D5ח X7~ hDk,]gVG=TGYNJADG'wyu>   @F Q, $AP/,$unUfa\ ϕ5W\~ZMJZ,7םpl':mFLUtz8Qk YMRtCEb7xM*/Ws3:*iC[Ju>Y6A Nwi/sH2)]Te!4oK$[֬W:yE~=_4{7tR_jt/}>Q+hWг2xPwVMm/w)U`ӮIHe-xmF:fg; ^.{|H]֭#^r i%!Æv)<,]k2wZ= +Y]{RUSSZ˴+vmHܹuZSsjެ}T0NjUvm%5|p+71_klm7mD}'ڡWRxqBSeiz_ySRTR(jC@@2A {i91@@ 1"uyYR`!qVNɒ967m0]U/ Pn /۷mm O(Z )TBdxh#Z(GUBxXC-P}vn&M!Y"=}lEg!E۸]D; td_GK. O?v׽t#/4@v!λcjVC`N_A=h o昫VN1ysA"즛;v跤x?I5=빔z9s5);w}_qEæQomG̕'OӥkOC.b;g75`^@ӧLUZ]k!?ů?[tY3   @F . $AH4@HAL’v/nu46Cl^ 6\ړ9?mDLsG\m"   +@`@@ D<@8Z .o.<捉=R.ZUn=[/F|8V+\=׭z]   @ 'g $AĄd4@@ "#&B@@@8n=F@P<@@Ndyv\&8|Z: FxO.޳G*Wq@@@@I b:A@@"V       @D+A;@@T z9m@@@@@@03̥D@@ ׍V#      ADOG@@"@sP@@@@@@@ "%;B@E b,jl      ďA@8!"F@@@@@@ $@1]LN@HDxh3       pD  @@A!@@@@@@@t @@ So       @< DA[@@P x9e@@@@@@P3d@@ x׌#      ADWq@@c.@s@@@@@@@@ ]"+';C@HAԊ%9:K~j4E@@@@@@T DL+# AMVY.Hٳ[Fx/:5j֖/Td"'t>|X< kR>Y 6D@@@@@@ ׎# B b] ذ}{ɀ}ӬEkɞ={ތoׯiS'y<"      @ ." $Aznqm!k.7gf*U%Ky,_lټY.*\XJ,-2e@IDATf~4VG ؘ @@@@@@HX {h8  1"utou{->1ɚ5]_mޱG.z ӻY6_      $Aľ~@Hxw c ">){2Nvb[3.Cd0@@@@@@O b]3Z d(w9c "{r=ۓٵs?d'vI)'w}lf       @ DLkF@@ %@1.Dܿdv>|X'۷ogLK?Y@-,~      '@1-F@2An1TyHN(7y?d`t9Yիgq       @b DLG@@  "j5Ľ! f?LVJfy1ɒ%|akNo(pkx?dq4#       r@@ CDx> иϿ@n~z6eNե-˗~.[nB%KKLu߸Q&O3      +@1q-G@2Aĺ_QTjԬmyPP-Z?,vzȓڷw~FҲU+Wʼ93CL@@@@@@H,uh-  "&%mV=d'p˭ʉyoƊ̒U+H-3@@@@@@@ "&5  @ x#ِÇg7ž@LM3ԾVFȏ۷ݖ       8ZR@@ C DL˚%KV {F}nQ+)j@@@@@@_ b_C@Hhw? ٰz  e?KF;4z3ը)E~F0~L*L#      @ DL G@@"@1KJJe׮fJٲy~)_͛oqcdӦ4iRm"+W,I _|,}]A ؐ @@@@@@HX {h8  1"u b*USlԷ߬iS&%[cOHLB\"Y˙      )@11F@2A/,$unUfa,?W֬^rO?#ٲCi'VPL"3@@@@@@@ "&%  @ 3YgI$Y9%K̲ o\ΖB9r.YN4Ȁ      S bƼ  0RP@@@@@@@ AĐ,D@8V4A@@@@@@Aģ^@@ %!      q*@1N/ B@N'ʕ<@@@@@@@ D̨WB@D b\(         F q(        xd/  @Tbb%@@@@@@@ n"a  !@ĸΜ%      d\rf  @BDLD#@@@@@@@Ұ@@XD<@@@@@@8z-{F@B bH      ıA884 @8"WsD@@@@@@,@1#_] @H ph"       A b! }Gߘ#       GS e  ) DL@@@@@@@ ח! _ bƿƜ!      dlrv  @ DK70W_ÇAHLiS&駝iѪ|ۄuRe;wnɔ$#Fʇc[sz{NyYdtNGDǤdrAiԴyUYA^YJ/&;7U{GѢE%od9餤?#w,r?9̗u.9s攬ٲ}dWkdOBnL@c+r9sdmڬ,["Qje)ta!|/ U Ѥ c%o޼ɶ:=ygd36!˗&[(J+Q:U۲r|k{YY~}Ć0+⥮n.̗/{\{gd{o$/ ou{-"xH,Y-kV9> Nv~E:jIbWك w])dTtJm/F6}={,T/#!Kr̖dyGiDW7P ҷOR wҳwr"/bᨈp!ҫOK l/Z4ܠoJũJfLAf˖]_}o7h_~54/^jyo`}oʼ_]+G)V 5eHBIabW]%ujײy4E^!2ҼEKJd@@@K bzI@@"v7jp;9Sq2Am[O.@>;xdptwͺu2Yrv_EŏOu_M-3@7 bwRmkۃ5kV.b "~k]O8M1UӰw6'ۊp2ݐ JFz HpVhef|Z* |rs8aDXF֛cƍ뿑3sPl⋕z5aM m0nD‹uܻ\D"py=F1&+ /[\6o*gVF@@@ %) @@ D<1WK5M$ ؗv_ֺCA&mӷJrUvz?{Ò*+0 p)8ݡ~V2!P -A=1S&- ʫⱩI-ŸVaN!JYn~FKn]oQ"{Ttmԩӥc͛=)2u<ө,FiƄ{CGϱ"L7ƞ{õMxgrk֖;wŕA@@Hl}h=  6kZgn6t_jw'Ο7[VXorꩧinoAݩj塂 ڮ-[YG \yGCQ Pdt߲T|ҠIX//Ru5t{˽ LRvKח?xmuo7W]$y?C6cN2Uƍ;Q[V͛__gǸbE)S̑C{ŋHoɞ={ڵ`UkHs[9j5M6p2s1)).(`ڹW\ 4|)_n36m,\"{Oܵkoyg Yj^޽ޒSNN*˵mBy[f"˖ϏW.To}$1RDh5Ν:`N,YVs;v`RCVHLmayY:r5eγ_~}NSrc7w-zw̘̟PڷL.6ϧCƛ_oL>=fz6س{7ɔ%s<$0ϛpɨ1c$YjJreѢ-[67~7|Rʢ?tx' ]:{__O?4MtR&9ןdCHfC[Z|qy嵩]^mo.|vR+z=Gyy+sQa!]]3׾6yo._*w6z"E.<=Aeݺo[=^cJq otr䈤~9\2̄?cȎ{4dK.ftX~t}ޏ. YJܹ#;,Bݶ/RZigO   @"Ƙ  D bLb\Hn*dղSO5ۮx9?vY֪m{.ˮ;"E=? ˖.ڞ nD>/TԮ{XEY>{/{.۶OVW^*)R0=muoY6&83|Dڶ{Rпh:C@fo!XõIG}NaL i Q "FW+oiT<_`w@Q6AVw=z>uΝ9'ݰjED}+Qcey1=^3n7h(T_'q5D&辖v5e O4@jhNmPbͮt{~qB^u Ǝ23:Uze8lҨhڳͣ>@=Z "^dȐ|*BbGRffZL+ك@NQAj T렡dI-3ӱեY ~OFܘ/\|s#ҥKC0 y[iӪgNG1y9b*QoofL|oWeZ -\XXUQZ?C wvEvM7Dla9Ơdr}VנoFG:{Z#}F|zTVëe{3gɠZCj֑ "k/?ٵc|ʭEZ2l_qKHQy &cFwh+ ,;s@@@ c*  1 #X߸U!`S,[9N٭/#+\=_r˭Ҷb)+0cdy&cWO̕+TM-ӥ/Y$IDv0>VwuꑑX+̝9{Fxu`d71[/'vuAu|y[ϊ䘑/ ;h]<+n{Z }]0kGT<{˳qfVn N:VsNt^3m`s'L,ƌ;͛v7!]N)R[ol z~guoqUN/x d`G裻kRe+06+^-A/[a9^+vZbځ?]PZMZQ "FnW\c:6C)$@iDDʉx]}O4"E scű6 /߳;{ }6oƫkdxmU/],%je(!:|ŗҲMMn19b "*Vf;cc:_OeOw8&y}۵ʨȫ;gk~DcFd0Ԡ{$lTvZ1ѽ"zzAi'꠯͛6}dթ]Sۊ: "F2gև'w.û+]kUlC  #19rÂ_PjLOσg@@HH ϱ@@bρiIkaS'OʔIaT.3AĈ7{w/iSieJ_,\L8ެ"f1jL<ޥykm[6Iԩ%skiCh9xTQۯu VG/ 0 ^t#w\ӡDNqpV=j9a@|6S5XQsf}`*kۺDUxmj7?/>We sjoIN;C-:@IROF|+aW~{{gvwEΣ@ڮqב>Z%|~{mk"4AD_[|$IDΞ=+ 6{w1Dw}uNUh X͛IϚkHkU    C1ds@@ P1f~q]⅋2nC4lT2gjϛ3SZUtpw٬nf?E;f韎>iS'y-sVbL`$UT4op~=h w.s*U o TgZvIVx1~/`*r cƾ+'L4FOT;ivi][VOuhof5WW7uyݶu+]Qg̛3K4CJPfFh$)-:wklwI+•XEN8k[o1앻uyZe[ 'Of/z5ډ5aW w;l16^'D|꼸" X5wp-Xѽ]nm~!ݝh73ʳg,:llv!6^y>(lo;4jW sAoED78n()ZٷU@6^xZzYc:;wGSCޛ0IFG7|}tl߱Sw^lƷnh*kU}~˻>Yڵm5]NcNyMCi])YH*՜ݺ&;+`$>lt~י +x-# "G*^;DIfM=dW籣GBluE@@@^ @HX M ׺;{:xk.vy*UPǥxRfܷbLa榒d^dU`qcA5Ǒ? ~v `T78ZWB+[6*!z47>v츔)_ўt+/+CTspSMoMWMٲf5]M;_jq̨RXQo8N-Y8D沥fB;:?UlTnUVZ۩o\v׸ ֟`{yt\4bT'{[nTi/{twKV:{]1w?#ҥKz,h:AxDTqŲ)s&@m\xUVi4(gZ5@ADwR otSr?g^0lH2}{~+?Ht3߷ ΂kSrz% -^;t}׳ tu?ly~OWnsT5]y{Wt2u; EZw5y] "ܕ}?G*J$Pb ϧ*;Ld޻t[9gy3̡OXK) _DADw5Žd}s@C'N0HVԮdwF@@@ J  -@1Ec\r[]|2;|,\0W:d‡42x8q\M,Y27_VZ R.o6?ll\6 e$7+R=~#Ϙ!Jw}-]Z*W(a2!.\ njduߙW:=yEퟆ}=g} _?/)Vݻj=g2DZmY sݺJV-~4 9w|K${ltNrw8puժ,1=yh%Ȝ9r7l/nլeʔiH4$w\Rr%(dGQ.S/۷yr3[ nxO{dт9O{v} ʕͪ1&QԮ!uӪ;oSM+;Lyk;Me@R ֮ {o%`3Gq·"bͯ[yۿ_jЃӞ畗~:㛃ߖf;b ~4U*NJL鵣HNA뭾~FjU4D'uڥ}"Tyݕz~YymQMd]dE5.m]T ppdkV&$IݕT+,B$ghqܘQ+|7Vw*;4    Y)C@q+;Qy_8JV^`U)h!)^$K+ǏS'܆ ^m^C o/ y^+Vś V>qXc'̨U \cboXSm^oV>xWwuV,}?߰i(Vը~}^ qzWguO9PxDV+Oi`S+G~2g<ъq:l߱S[_ؿS%^G+m}vn")R7V1s6Ĉ5VRu mҳg>iHnܻoԩ^EbrMX#jܺusϒr-8j]U{*׷'7N^ǟ,n׉;p7dpy''kݯkCfaaRxqʓugk ?|OA>{¥۱ut y˧90uLV6ujՔY/hX'_s2X:rhi׮dɜ+@(}Ұ{:Ȫ|oΜfoW:ݽNkԊU{U1biMZ1O+Evhۦz+84])\?A(Zl5q6Fn=O8!1XVY^݌~; WfueM*SECV!2DC--輯>=z5z;޽[gC3牆^߽I`?xz*n{ЪfϕQcڳbjGޥ;k,ђjE2`ḳV٭g|ҏY'M)SZ[ќ{VԞ.WJ'i/ڡGWϞ^*u~L    cC}  D[ bmlٳK֗~#Z02C %σq}'W^f -_Γ[2g$'E2tC Tds/ַV0ٷwoQm>˲  mۯ۸$ZN+E4hU9oV PFZd@+bU|@IDATڵ9:{?1&}xBN8?"Yf=Vrw ^̵tlXڄlRe5S q=`Uo#cFu{5nj8=-i9cZ~gO{~ i>r户g PϡyJw Gm~sG@@@BK bh]Z poK #"]b9rXoTZ>bUk:0CAph7mD jEjZ19kSi7:_A>}@@@@9!wIh  pc D7gćVk\xuUUy*yR\9`u+_tEb+1X@btzI69%f[ێ!&MY ~)VT۶(;?,.>@@@@5FɎ@@#@1:jl D իWe[Cd9V 1 ;@bY@_/gΐo]b,;oz%Ko^@@@@@ "UM  $@؜* Oz|ns}ːaϿp㈞u%yf:ѫw8mF 9p@?QhXzeM2jDg !   $NrV  @D KEC@PНw% G s     APB@H@@@@@@@ DLD@B[ bh_Z      \O X  㔗#      q.@1Ή9  @D#a       CB@@ Q DLԗC@@@@@@@ p9E@@ "աm       "^߈5@@P bk@@@@@@@ "2@@.@1 K@@@@@@@p W6" X b"      oI" +@1t -C@@@@@@"#@12J  g㌖#      "@1^9  @0dBo~wȩS'ի8Z đ@sK}Б#Ge߾}r8:" e^=ˣ /JC 6}d˒ENZw8pM&@8NU"M76X=?M88  A04@w{&M*֗)SH$ILcsE?&L7|XIb;LP| "~WҢ򙶷sݤe^M^Qɓ[.\(Fx^;&*/+CJ~,^˯٪Xl%A}b/Zݎ?VŊQÝi^1^'>ZzO/ooҔVDB`@@@O  3@@S b|jGXyzĪjXɬ|}ڔ_Fv]׹r*Y_[sy`!馛$\xAD $~[6vs0mw .,ɬ{۷.2  Lc<D2+93/_XdVfBPe$l*:wS 7o[ƌ "jo:ƫZ*: ":+2   pC D.7' Aл&:vtҙM:y2R̝RlٹcڹlLaD1)k}A5ݘ,Q\r%wul/O:%?Y+1r{Wr߽9_0yLxvm=27qÆRT -}gzC'DZ5o&dɒE\"Em.C[  9^8YUr՚Z䡼3dKgnOXSu0ad'Ĩ!:5k+(wyHSezÎAH/ W;wJ91X# דujIVBԩ޽եEݫ͸DdUN$$O\%N<ӦspႤJʌ ":D&vK=t@^}RLiɐ!8m9y|{vg<IR%ewL5[b'9)Xq\yoL8IvkkI*/Xhh_W^z.Tкo/% n`˖2d(;,gka-tn7[nIgUu( _jܺI9tl޲Eƌ}7={HY 2TJ,aO=;^ oa[? U>c]7nB^zyi԰ }n)^io1}~ʀg@´ICHZu'XS_ǟ,n ? _EϳjZ2uS+$URt)szADٿ+3`kRǭ3g*=@F:6ltStǏKLxbr뭷H K굑 "vG͟ntiZ2L>/LauZolb3eU qU LwK)Gj [q@@Gxh3  "̕;O[eS̙6ر?egSQH4]5Oe~K "JM5 votG ?a"j$Үm|E_mZu|1ݪm{ |bɒV{ϝe/W4oiyD@ @S̽?4?ض}|rGue#ͬIȈQ<ױAg{kɴ@f^zY40j@cE͝ǨS7rU*X@VZ#FAj5jɆkLHծ:jDDt YnjcѢ8TS9xp&>!Z /'+W~͙ei7ݞ!7o.l~\aQRԪҧKk׬ܣ1ΞiBzV:իkɓVex;[^|lnz5:Xn}yzs3 , 3w^h隬Yuڶ(;],oݾ]|BjP:TZmլi viцًLڕ W+빃ZU˖d/ G b%[gI34X"Fuz#R?^Dt}K?r[l4Ӿ=w:w=lٸNҥKgfDt0  (@1mF@Aк%J*xԖ,[id٥^O?Wn8[QӬ|oS(XED ҥJI,Y!C{/; ]ݨ\ٲ2t`]ݽK[]~76Dƻ3:݂-ZTTv1+@$UjըautSrm׬]+xoΈJ(]Hʖ;tXl9q<ۭiϞ>xT۹i5OmMXH=?u:,}В䕾$8p@?Sݸ]xQV^+vlVG Nd+b=v:Ɏ;{={HS1-5{{tzIkuy-L>B\+j:ԭ]ˌVtMu@U=t;8ad5fzX?Ϟ;'+>jHlUDD__N}Zz޻J( "Tu }[?BkB:Xw#G uh&1  a*@1L/F@Aк.J]L,m})rUFvmfd+ӧO{-wOc]FMI v6;z $U]m瑣z-:|k;vujՔ v;4T\9\WD Zj2܆@A@WADuVԴك]5۞} kb?t>/K:"zv+XKՐ?#K>,U̝7k#E̋J7{yph X}͊-*իVq޴y<ݥ~qDԃܶERH!JwT)|~<@@@0 f" M b]n{/n.^(ƌk`M%sOysfֱgkQۿl"ґ}>h [XO8,ڼS/܃VKZao%mYՊZc[v)%* Ŀ@ڵ_Ẃ׮]'wq9ƠֱgEzǴ]ni~C)FZe#f;էoY#vMq#G^С}[ / #{#K3?1)[{KRn3oFҦM+*Sޯ/ 30oכA0 =g^PvatւN5l ZTUwM6o%2z;{:4lwI&CRl ,A#gz;aU/<݃;Pc#U_>YDRLi+; A-ZDVZn  I:vςv5;s7Bt*Zn戻w-Zzt}CLf11zo:U*.hu;d2yo?VCBZ@.e/ʕp&3?.yi_~%wZmҥɊf=wRz-9qcп_ѮuViQ޽?e=]*wӞt?9}/Y1fb~uv{H1}Eoι>H2e;o`!c\{z>2ܹkmp3Zl.ݟb#AD@@ca|h:  "U̕+TKp\9| 6jLʐ4ĉ2mw%YIlٝz",Y2VܾSg}:3hd#_;3+> מou,fцMdٲriY5]lu_/ʴ+:vN_={vypahu )Z`=<" @pm[6Iԩرjj^3%KfiPܛ3&[ {5kךPՙ3g̶۶tPD1u]Ϭ*i^I**\P7lh t$s~AD*{|Ѱ=mUl/ 7:̒ٲʺ_},^\WWR*vMܡ/=?,+ҾKYLR/òŗ3Cɓ;>t3ֺKW(넶taǧ@@]Gk:5 cw> #Nrn}+eʔ27jUѫYS=, b b|N`>ߖ~|g/}Q ( ur*k^r_F)Sfg^ݺTf3dϝe?/=bw'oKE:=ŒE7~7tԬ^FZ'h  *@1\F@AмMiV=L4iS?y:Ra+k^* (^]/ئUKy[65YM ƴ) `DzD%xD@ jvz[`5䝠 efvl#{L=Z?KP<c#_޹CpDSDÂE׼V kҼYSyκguB&|EÆH)n߰QZ؃ ݺ>#m[rkx2δV{wɘ*tAĈtX   @1mD@Aн5jו9 jkϟ?'̷ݯ4l;_s=_.vlnJnuwI =dCo\FnVL+Xũ^3_zyW_*s,*\͛VK߰T`A4qٟ]ݵݲg.tc Iкtf_?U6l$Cwf@")e˘WZw n&L.nۦTTQ2ZUogytlκw[ ?QԬөcTtz׺U +Ux2A+G昺jժHch!Cyɟ=ֽK媞~5}jW\*{%eʔ6uTdʜo:#peUhE{/۷o5}z:F:t3]{VGzaђҷ{2cԩ{KE|^華[2ke:nҲEs{{pƀ}U]ϿZjӪ[j]k߯ ػ:j> >jhwƙ*MO 1,4])\ D~/_XXU@Jc:W\Q7k&Xm֭V}k\u13@@@0 &f" U b_lVw9_Zi>}:-/4+2%ъ.yrtȑ?ʁC@A@?[B(iZIzz@2dK[K Z=͹ojːNx~0]}_ok?ɚ5<~Rc}>E4O^zAIkݻ/R>/mUL<# EuMɛA뮻{#ZϹ_CC_ǿ;t Rl c@@@I b8]-ڊ $BrJ    `4x>4֟YȒEM3(m/@@Kayh4  x"&kə    IdMc{K֭;қ'M*#Fސ)@@@ "  @b خ(   ;oړ~ڝtu3@@7vh/  "&    #аA=W߽,Y23G5kʠ82  Apz@HE@@@@ӧoU   n^@@ DLdA@@@@@@N w9a@@ "5       @T"FU@@bU br3@@@@@@@ ";9D@p Dtk0      Af@HTd@@@@@@@ x^tN@%t5h        uQ7c @@X  @@@@@@H !@@ c       @8 D ǫF@@D$@1]LN@@@@@@nH7e@@ :ׂ        5A@5FɎ@@@@@@@ @@ hKcwȩS'իjlԩ%YdrHJ       j@@ D K4iRUdpHB$Ib{+r1`TƧ%+QJrWnfu⥿/ɶ[wym      A𿆜  CMNh%aC{-z鮒*U*ypl@@@@@@@ "ţ  @b W3$eʔq/_o4iHl;NO[ۤJ)w9z}oɑ3ܝ)m[e4#       z@@ "%#RR%Ӱɴ)ŋ^ nePA#9zٸa{/Ux?w7n:@@@@@@@ ׍V# F b]v;KtLæLzON<+ֽhʕ+2rؐX';A@@@@@@ ׀  7Aлx^$I"N)Z ?Vq8AXeG      $A@"3[o62oС>}zU9guwʎm[,YJFM6pRCX@@@@@@b] bC@@DVܯ+wZ9&2gxcS'\hf$-E!ׯ @@@@@@@ "E  @b ZWb%'x5ɓrI&dΒE&Mjv*uM.SN?Z,:sL?6j 6/MԒ"eHf}ĉ1.!1_ayO>4Fwh+T]칶OB<51+AB<85%?>4©7k3IWs@@@ ׇ! ^ bh]HF,[șΖ=kL_犌>Yh5kK$Iիr 6ʠ_D[´/m1)[GTo~[Μ=#o:0V^#=z I9mu|y[ϊtM"?OL_\%   @ D kC@@B bh] JL\"G 5Bw+[(v5y»ribgRSNY[TYVJ2tBj * KV*eTz Cy1[h!Yre_3It9kEPp&Axl<{$~nOt?O^&/܋7]unLe2+_5   +@1t -C@nuqԩW4*X7ʵԗkYbyp.Zɓm"[l֚;?%ɓ%tN8)?P}R >Z ?Y!_ujEiN֮]' ԓ3fW+L}GgO{%ILN$&I]B6~cG%a|Ducz^kUڟ|6}gXki;𞙋  Aо>@HCMN?4ՅI5J;σfeǶ^IVZm/7|/eͪ^0      G b⹖   Cut|E7f_6n*d5͙)pI2mHN@@@@@@A{m93@@ ,"ejڼd3.v\4|зիf\QRNcy,?׌@@@@@@A{m93@@ ,"eʕ+TQ4Kp\9| 6jLʐ,;qL<9:mf/Y}.gȿufYL!      @ D KG@@!@14cf-%w;ӪI&1m?3s=%YdtD#+gϞh!      @D E3@@*@1tlu%g{?~j|g b7FΝ;=       j@@ D K-{vyr9}t7"      @ D7j  H b !      #@1|-E@ADyY9)@@@@@@"@SE@BQ b(^ڄ      D^ bX@@ "*D@@@@@@Q b  @ DUNv۵c$A TRj4|3(| @ @ @. D|܅ @O!S @ @ @" @Gc @ @ @h( DltO&@$ Dif!@ @ @ @B͜ @X( D\ @ @ @ P D,iIDAT@w% @- D-G @ @ @D!bL8H@x2= @ @ @BĖkh @>B}va @ @ @GԜ!@X& D\F @ @ @ P" D,aw) @% D$%@ @ @ @@1so&@# D pcx|X`<493nY=`Cn| oh"Wf-?r;+ Q1ĢRǚ>TWȷ9_UZZbi8v;5vkZJ<VѠ8U<ِG?Ƨr:n׏|a8ӥ3eLQ> BW9 ;~Mb]1|J2g G0|Yc YZ+;907 @@ H)`*gf`-@#8?y[ptg:@ qFo$ E8$IC2 @f#2dRlFj_q,ҁ@!K45CQ7F#t Eh1 @k]hz=^A;gh0-Yb.7bT,asRf?_:=N8 w+8Ox>_W;$~ t)K&2 3%r6)oD"hO1EE\J@C H$c3ɟCI%].;قF#%rNEcr?EbKP唭fJGSY j=6-| ZgiӜhdvvNу|2z-.6C{6W[=OJAs[gNN~ :=];].OwnAk}z z1zzKv{Oҷo?1qe@47d6h357cdXhXexذ1\fs9s*0aaaK8p #Q+FYơ+&N&Lfl49e3`p4EMLLgn1m5337 77;ac422_c~ļۂa`!Xcq)ːf*X'Y ͖mVVV XݱZ{[gXno3ۦ-Vd[;{dso;j.;78;NN"* Ψys5#\..u.F2GF\8qQ6RGuzgW׭F7z/ݜnUnaܛ_q#qux=Z<>yzy<=lҼyxz/>C s罯o>߿\v=k?V8vV<:-y5AۂY]o99c!XHxHiH[~hbhe0̰pY"+#q͸|n-w׸9NF"#+#G9EɢǣǍ_=vm$1pcV܉͋}qB섪 F͎;ψ3MBp[Ė$IIoCW%wN5q)&)┦TRjRԾIN1d)S j25gi:xҒv}jx}^>L$X# W ggx韹:[(*9J񋬈MYocg$%K%'O/!uH;|"e|)[  HPPR:i撙Š~jm9{{ss6Emg=x^;Pd/sU _/J^\lV<?ԕhJb%K/\*(=WZV^q)鹟FTem=o\A\!YqueVzz55k^lM:+*۬_cJUp՞j%o76\~٦M~|}s--[mMz_jl+id{玸'kjkw\^)wMվ;dwSK==e{^ާzu_侖@i0Qٔqpf}!CU /?B=R|dhѾcc=3?hrON8v*ԙ?8q}3=x\y @g[ M>c;\ xRȥ?.s/}j&_.F΍7 nߚpwk=kg?v??*lۓCaO'=z&}S_w߭{^^ \c^}m;w;{?!I+>9~j@'㩎lhF/@Ogv< 껩 wAx=D3Fl!Pwyo 1376 424 QiDOT(o@IDATxxEzw?VlEQR* +v{5o{soy3oϜ2I-YVV|*zaS         H?V٠SzT *Tcc          HHHHHHHHH :p$@$@$@$@$@$@$@$@$@  E) `u(HHHHHHHHH.@`/S"        H(Q \(^D$@$@$@$@$@$@$@$@$>PMׁ          P/*OHHHHHHHHH }>GA$@$@$@$@$@$@$@$@$pHwl|DXo*9}9GVDW,իHjU$V5ɜ77HHHHHHHHH;(ۻ_[,UGQ*scɡY X?OskRWѵkHMoM* @%@ևKsxrlRzKJOI$_5HHHHHHHHH @lqV*zIy<\.( Oy'lI$@$@$@$@$@$@$@$@$f(- l9@9i7˔'TOljMq'lH$@$@$@$@$@$@$@$@$&(ace[怒e5)ڦzdȒ9žIHHHHHHHH""@6\gbO=EUYT2N2:wHHHHHHHHHsGNjsG:QT{{dʝ+!       l;'?)QY3Kљ"ə=}P 5è}[SM}U2dz ^{\^rKRٓ=c6JrKL$?/?:nQJW7KJ%^P3&N'c?pi^yuI{].f8KZڹ>}>(&wNUm;ˑMfڟ Rqt5&A 9{=Ȋ}qq=ٳ[ܦ :Nl,v푌ٲI$k¾ߥ#e$@$@$. yzlo-%MIvvMhK9>Xs-;+SeiJ6K03djݥub?r 1k7H̚urbVɒ/RQVZ} J>ksk\)>h{+$@$_#oe=V,ߥYH$@$@?¡9A 3K`4%=(LE׮!{X8n Zn5A8+vʙi>Lyrwݶ\rt`~{?i˟Gx>zL'w{Hz|C'SbGJJj9-{z6j9v2}ܙeZҠ\G[k,yo|}R A<2^7s lfuM; P>xY^`pW{mO%pؖqU%9޶~j~y>A*4 -\*+^/;/_y]v>UL҃I5>~[kVIkRޯnZ%{wmgb$Ft79$@.j`/k;ʔjJ& le$@$@$)Nt]IU&b-VdSQʪ6O~ ˗MQpoXN;nW(]m)dWu\1e'6l*9+B>[K rHL^MmwMއhDwǫoʡ?%*WR]r4IM팪XN`[jAgd?ʱEKW;u2jU$gR&d~2ag98Ŭ^ ߲--9U\⢭PqW '7oޒWKCj%je)xm뒺$C dqT^{Z#+U&}͜;-wOP̝/'lWxQQd)8ƶѯJo3ė\q{p,QM wi/jr}g~Ij7R+A#Ge7E lA _0N%%<ƙ: ''eR&ϐ1![69/[))9VRӷ 2?tXI-Y}j^ZVY?gܨ>'w띤pagS?؍䶝 iRP%T YmeHbmwڻkVBaoWRܦE?~R<'pܯ*$)u_d̚E-,Jjܫ{f|3Y'g1Ӊ-nqym}ZHHHI` )8k*G]'n켍riEg8<"!>jMIwQDB05 x f>D ;,Jw(zZŪ_YʪKDD)+"kn+lORS`EA*LuaJ*ubkZAnz*W6_eG[&cEŃX0&rϔwsWkkskqsLyrrL+i" T1wV hx0mZı\nPu^X?f\U63f&{]rTw^耊>7Ysܠq$`SvqZ 4[GNp/ѱmh޺[Xh6 vUU/!meKbuJ5!Ԋ5[31 _:XRmڤ*bRVJꩣ#{3H>&%"N=Eʿ7h^a]$F, °~Q8eJSM+D+)̓v-$ʃ6V*ÀWߨD$|NZW D` 3k^.n%s]vT{gcq%$5dvvy=[5.Kn1>lU}saRMl4B |y:2=JG܍ z8?Y>f,2 fYa-O#bvrJc^W^ꨶ;Ԯ=vY]-_io+"Շ+pi/SZՏr9@֩xq{l{\ZscɭM}OP ]j$@$@$@M+vUE%!Z-^NGúʡUqOSky@FMkzk$ hD`1" f/cug/!Rh {ZjcMUcոӴH-R"*<]aUonEÛGM. v¬OXX/]ldJ -W/KwUz"Ux__Q5; S{n7zJ̓G*ϭ#>%s~x릕-?&-3DŽGۛ9D*ӷy~G5/›6eȚUj}hx nJ2\'\p-XȆpc, SWW)H3G}[=ϔ7z0Uu;su;a<6z}-~Q$'@\zgs9qٕ+7]շ/Ivr+ kj>\2kS/yÎ2l4\6uVq&EZ>[LVpbXA4x`>qVDKŻ*3|X6|ÇpnH+ +2SxnǏ25˜/3ʩ=)}$@$@$@~0X,%gU`Qf+/GX(Q^xjZ<(>Hf.I?'u*@$,#qr@:8p,^wĘo+;&,jLA4Թ ʫ?>E7 yUêJ\o{e ުzUZ%~FV%\׌>Emմa&𷮉Gkbɻ |;n##y,VpZ ƾK>"ob/:VrK/_}/}i笢6͏)`#~˙αaZN"vͺY ~ ~=~^+ 7ȉMʓ|\%Mw^ [S݄w6wiᰘHHH?F`Íj h ug+Xŗm!Y(h ei)>5uHL x)|_uR޳0SW^eFج5q^ecûy*A=,N)k #-ݧԞok\/Z:4.+Oa68D~54a:8eGF0b.G-q9\,f_/1 Io2}۬>!i/QDXs)"ՖՃBKNşlD@./mN22ĩ3vӴ`;O. sǚlB0yX-(cˮk%ibtgd_k)wUG x.)&ÔP"(W4{L%u OrIR1'!(+,Sgxq^t@/QqRYW + LA>_%EZ^bdANRQVaGb`^^J^! 25׽![mL%hm .I^^,`!#b@! w:UwPDnu5& קmO8i>?$Cf/%$k;_|ӽ*6}JI^sk\ixe'v?GZq ($)'_k׵Vƴ/>'߫-p?zzO kvc(2Rel2Ip >̺.k7>Y9_AtӐoӀf\jcں߃#1$  o8,b|.aVh0/MPlٸ<`Q^r̩RlϋPADD)W%}<?-XC]I"CHT%sq{+5MGLUFdEb/uE\H`!޻Ni*%g_#CuD 8_F6<U}AidGS$Vi:iT$m"u+ZȌXNFA¤{i函K$wX%4=MU%2=N:Vva<"xkUU{Q^Ly)m s{UV1)s7ǕQ },-.xߠ4gZR:[\p-!;|͏^=hPG"&Icx !GU*oUKrKt{#µg&}>l! >X`w_#)ib~&zYmAÄ-xnU}kc%_/0qKg8iAk >ן=K5^PXp/77cC`Su xLwϷ} +~t~=~R歲f糁wNA$ϵA.]LF   4 p.XS$DT/V xlC%nPl"FVʓ6X9 C,ҿ^v7Sai)">.nK>XFW8-f &nvȔ~qUõ+,PE{+_.<oT@J&&Xv}Wx*toQp}AΏ=GZ{'WiTp/pKM 0t t,B57vay  PuSj*̰oZJP̭zT/1a^"Qex.zߛ? B `4:`J3١_t<,hj t31޴!j:ħmgS-::M]OUޤ f=dP_v#fՖQfnhaUxD^S5=|GB ^Cmbnz8zpr<PB[0Xe񎱚q9;G7)P V7kRU󄸸B3Hҳ쮇%fZ[xּI`]w2/3Lot-sjt K2erf87f@@fgNoV{Vr:cټ*3C4X[q_ Y7~pFl㍽%{h6Q$c(4N$@$@$7s!b̍[NɑQ_\ꖉ {NЯw˲m P-"Sn Sޱ̟*)ɿx[**s! ,&Gh+-X$\HwoRXsu8baCvoyynjXt` T Q*kQt }wNpFUlwW~%TEܻi@,;Y͒^u=`Q>}Owe˜A z">*WW^ ǚ>WJ/3Ye91 97~yP%.-~#Aҗp C]>H^R<V;vqx`Vч[K<#V*7;gKS{v/ZF+z s ٲzw߯VyKSM{倐-#$@å~  W?U$L浢f@X[}daL-gdCρcK;9T27HHH|&puOJg!AhVf6 EYT 2W%-c{%2\+Z1UXf]o.$}iYjXLߐuiͶi<*Lkױu?ʕLEn#d!1);V!Wu6UR.x!KK uxpO4`v!HvЅLEj9z+)ʫ1 s{VW ]/֯wï;+wi~⸏wq$g?f ɺ}vǛͣKtxT&xnV: S/QЬp,O}}ğ.@e+QL<ePwRY]"W>~ uKWػLak !,vMPΝ/qb7YK%Udina)LhbmJ.w|wՏ_#ܭeJ9[E%=}!T fY ztNkߥL,   Sی|9ЮS>X֮C/Nic6)oۛޞՊg:Wմv+m 1}4*yӐ <&#ɳu,-Y w#O1MGexξHRH3jV^K$zV!tfDp8ݷT-Z `1!Pm`-_,?n'B\;呗՘ @`G26+)׃啉~:ﰼM|/y,޹XHٝ)9.YzFfz&z/=3F 3K9$Q]z3jϨզKI6V*OnNZIojT,oZ+%n@ ,Χ=%Х_P~ ~?-) F2݄ 4On.ެk;cg xv'u} x.MK@ÁMVFf'6lܚ b_ʆ/a ޗi Ej>[Vna2ץ `W4o+.QmKop[1m9=\=cfNvnIan +buKSGnv$v:~TwĮh9l~|Hkߥ(`,    @<]=ADC:6$En'[*J45W(FϜ5t{_ gʫ8\C\ݭNI uMʪ)H?bS[ɽiu(&vK|ɵMa^uV2`g,R\t]rjΤ)ߟ=cṧ[QHtH Wx],>~\y?!;eSд`!oYUL(KV&)u2ʛW 2ÂhqӀi۩borv86Ace:>/TjLvb' 89Ւ3>[kR0ˬ'OJ֦d.r>[V W6%JDT/?tXMNÎщ;Fyze?4ki1QwKY|J4/6 V?,᩽·M j;[(o`F R?$[b)Տ_#0 ǒN;&%LrT0r&,֯k{ DֺZMNAc#%BG7I"O=&^LvǭC%:K&UzewC#]eX{n[hcЙW-ZԙP/\~suL,S͐H46je\Gy0&w$/yTp?dU뎎Юt1-Ø\uc{Z_f1czYQ[yfzˆ ܛ %!VbnHo1]WĮ]ro2`x$g+Gc{رs: k,3/lYmS* ݾQyUӳM7^S=BYٲ啚OE H:쮇$ +0vEpqꎝ!6l7Q52z%3.ώ6/ m[?}g-(@j;:w|UM/#`ޥsHHHHH@x#,PS[R@Ӵꀙ qBՏdyf;L-, g%*vG4iLOno ?T 4Q{_J Tnq*\/pO{EߍIV_e֫i~ROs>[jYMǏ`ql|tXDk^BĢe'v%_@={B`ٹ*R0A21|{YO\hZksǏ\l=-XX?1ߴHXچ.5u     PMw! z93=WP*xJJ44!)Qzmc_~hRw7O0s <[۹[³Ox)Rޚk6jiH\Q"W:J]2l eY(Se>s<ƪX2ɚ3n9@O7RBV1%tΞovbZa ~MkcC[cU=}1Um v1]JA *QJh-$QJ̉T^Tb p==!Wr"GHrrv!e$^[LĈY N^ӠϏz_qOŮ^ GU,/QJlf}@9%b"R<8IR%$CLa:׳8ַWu$vYER.1HkCܯjL7"޳﷬ŊΙSK]kx_cz\9C6}xOP Xf/_.5TG˱+#NTLG_[}j;HE!cFa3kVe$@$@$@$@$pxSױڴIaz3_Vz21T tDXHHHHHHHHH b`>4Lt("u]{ˁD<*`yυ:8 EFqWl/G]h$Z{G\+A5e]qNMuܗ5LUHHHHHHHHH|"@MXE5%7YyJBftGscrlѲTR%*ޮuDmXHHHHHHHHH e(jxF׮.q)Vgp+Q7#ޟ3ur @(~=U晢$f: Y2Kw'Kt8럲C/pMRa۱ @PuqÔ~L7-s\R92oYXϔ3ZϘ"Q;8:z=y2⮫Tah$@$@$@$@$@$@$@$@$@XΫZu#sdʤؕktLGMgQƨRi0s>mg~=u*[7#n$@$@$@$@$@$@$@$@$@)'@փ`7*ɭ=j.*\')C+E 6"W%GJIHHHHHHHHRClz'donh$y$_9DصdcQ8VRw1cSz<#        H @6ȝp1YrwgȚU4Gj&YKKQ#vF659ïFiY EGޘ-HHHHHHHHHREl|G^=F*5WH$k"PZdȘQu#sy ~XFIFW         dm2-Zswx6sp \(&wϞ5ɡY绾TrC$@$@$@$@$@$@$@$@ a\3'Nʊ¨}DU 5>xS2Fe?HHHHHHHHH"&@6̋zĬXfS-%u򤑒)W3HHHHHHHHH&@Fٓ'em6AJ1%C֬ɟ k 9 )@eX{)hvMj.{vIg         PYB-}AIa4ZE}Y:d/$@$@$@$@$@$@$@$@$@ 7-R[Gɘ#*坜qqq1cFɔ)/G;||='ٺ}˕J|Sw\|:ٹkjTUI,uym7[ŪlL~kdɒU:}DcJd6m*4K7z;$u $C чǜ{Z׭%8g>˙F)^:?ʶKqlH$@$@$@$@$@$1 # lpeW%viPURG%giл?]Z^^{sS"u8aYfeKKKܹSt9؉SٳvKHW>otvu}\_'|nԣSRf:H A|z뾻nKQ?lM`ĸI27'h!֪ټ͓zvjҳVq/w͕m"U~=fj>r4~ٞHHHHHH |`gl,;^*1W%[7%7Ao-9TJIs`:)kݾT`Hrť )Pl0lJiK~/۝[}MmX5  \l(?a{rrT!ZyZ)p͒TTu.ߜ}U+K_s1zL58"OXh߹n;WN8z/a 7={u &"wfYT +@j~UN)sQ]IHHHHH @6;=bZ%^Mi?}>vq*htj*@ Q1I %kծ:ܫ{'U=| xg?ٵ{.ktVr RhC\&/&Nkcm,Xn&vD$@$@$@$@$@ O<խ>D5&]9= %K V0ob95o!XU]llYIe$GT`*}RL))\`q;׬۠ըV,NQ%ZT N:ek#U|K$\LoԻ %&vzɲh2BM5.OSr{aLx!:3aܱ'5nJ|h#hWZxk6HHHHHH 4 pL|22=W&ֻ˕#z?B TA(kr*flY/T&^|_>z<M\A~+V^?n:i]6lR(ؑ=x6㭉{_z@ʦ=i-f/VT  G >[ٵG?-Xe%e+uqoC4rwۻ{+%o P+?rmC ~ϠʮVY:yq7ptTeSߘ82+OϾ.+U7Ah:wr     P PPl:=ɆBh!C EXLͶDƍkL7)^RޔH{2w(~ݚp:<ǎ `O]T%S! Lye?`Qq.kX_bbbu;Lu1aDEe= *)XEJSKا+ n.mPW [/\b zu**XK .[[ 9rdW^Oagn' ױ ¯e76V+1Ͽi>,`6zjXxϞ>,BsێxLBr9]s)\PG{*[n`/VD{E-RX ~<.o(O)[,`kQﳵ0h (U>O 's'_|c ,%{>)ϙyetLO{o}nZj̞+7oyX!@L.MRNMuR4f]O0^+<+kzLwq_HO/-:z[?қ8>h\uEC~7s;+/+&ЕHHHHHHXO,,L @#G@|ĒEKH>iS W aX/m`}V6k9 0 iXW%DXz`` u-f2a۶3X/O._~+.O>.*A0}a`q v+3-<;ta{N;T-}6q.Rzw`7x&~lph 8GWp9Qa F$@$@$@$@$@$|'U¦#N5H,960]Ӷa}X{zZ ^ӿq_~S mzܧ<a/c-d- W[ ծ)uM-SOЅ +Vbv hb`SxL ۖCXv]n-<~`!b!Y9vYNgn&ERZ賯!-6B :O:ygA*5~A:ڦD OC{c75ky統zZ;g&0S?q:7v2}MSEZq[0Ol܄Xֈ[ vާ0~Y ޟ z5n3?;SIHHHHHPMb4"I%';o!E"B\"ѣGvFY:!&[JuONx݆w`gNK7B u<%+w٫؎(6`SY ӮVz)}}~|ž|\szcdނź| -UbxuɝK&bH¶Yy?;1]YsFGx #IJ;wV Kz{a:OӳDBk|'*|,Raګ>XF-iyۡK8m f*[g!ȌS%]ûXօzYr[JOK =XH }E3\x1*IHHHHH @6 Hr @܂yMpXx?K `؛8D]ku{;mnѵ+wm'Wx`)Z"Y>oPLt>XLa^Fʻ1i:&cm-/Yc<+$\7,P& 'hc,δwn m[бc}xQoO?2ZUa)uKi VֲSt[k۽8lL@fA|FW_E,YqHHHHHHX(,D=IZr)YǀW%+>_1\65I"`۫)Ya. ׮~/(ٕG\ |J^>!30wV]ŷ{9;U"fUlKErWL} ?L!U񅽚֛] P{: *JOɽ3b$+'eƂ:w_l8kTSsbX2bN~kNh%uv|MHת% \(^w@?vzDSE:9ţux ޶U*Ui1 xC@Ig0Yq31Q@J+th"5$y`SA%W&C@'Xk o2d7&tkɲ2ddB-XS23[cm:tϗT޶p0˥WɟþuzST޹\RuZ0V}{O1J4m頼ᑋ`ʄ#*gr+ goZ;{VɰbcOHE[oUqE`)2$EkXa=Rz3K>"c ;x>Va Su4tw.HHHHHH 8 pO J%FFF˩SqvY,NVr؂_,+5|` xq}._~؎P1k!RZ+:=o2?b,_LwmO<G[6_1N#ۓF7ΰժQMzuO}k5 v/C`Jخ=ɮ{t=\4Tª1*DCyuP;-${gl/Ξݞ54KWA/}^4v39:.Lwd)?ѹ[EN믻Z (p!A܀`b Y$Z f" Ink$;DǞ`~ ߓ_øt (7{*~/<U!}6M{Ι@R _,11<*1SᩉiHeiUű>kokẎ 'i{&ە|<3;}Xmىp |6 B/mB(qmi}/ٳIA!^U\a;7v~]t!{b5"x"_fuGk^ؑޟ7}`%21^ȖGU%Km )b: @tO IL &]{|Ҷb:/Cc BXplOM}Ӯ!rgʋ2x2xîYAf"U*U;F>a{ͺ :iC &`RPA} 5J4Fc$*彃*?s˅؃ۻoH-k`U#?:ݛl *Oe6̮XHHHHH.Z`/KOo {egG".N\I2F6͛7L 0&`L 0&`&/3P$g8bP/?q&`L 0&`L 0%l3|e'yY\IPC'0&`L 0&`L =,s5bs H>0&`L 0&`L x`=dqU`L 0&`L 0&,,z2&`L 0&`L 0&AXUeL 0&`L 0&`LYk`L 0&`L 0&`փNW 0&`L 0&`L 0"g/-`L 0&`L 0&`DX:Y\U&`L 0&`L 0&< uL 0&`L 0&`L x`=dqU`L 0&`L 0&,,z2&`L 0&`L 0&AXUeL 0&`L 0&`LYk`L 0&`L 0&`փNW 0&`L 0&`L 0"g/-`L 0&`L 0&`DX:Y\U&`L 0&`L 0&< uL 0&`L 0&`L x`=dqU`L 0&`L 0&,,z2&`L 0&`L 0&AXUeL 0&`L 0&`LYk`L 0&`L 0&`փNW 0&`L 0&`L 0"g/-`L 0&`L 0&`DX:Y\U&`L 0&`L 0&< uL 0&`L 0&`L x`=dqU`L 0&`L 0&,,z2&`L 0&`L 0&AXUeL 0&`L 0&`LYk`L 0&`L 0&`փNW 0&`L 0&`L 0"g/-`L 0&`L 0&`DX:Y\U&`L 0&`L 0&< uL 0&`L 0&`L x0'~32&`L 0&`L 0&x̜>Bn|079-``" &`L 0&`L 0&<@`ӥNaL 0&`L 0&`L 0kܐaXũL 0&`L 0&`L x`=q`L 0&`L 0&,zȉj2&`L 0&`L 0&yXs5fL 0&`L 0&`LC!'`L 0&`L 0&`ט 0&`L 0&`L 0!(&`L 0&`L 0&`GX;g\c&`L 0&`L 0&< rL 0&`L 0&`L x`=q`L 0&`L 0&,zȉj2&`L 0&`L 0&yXs5fL 0&`L 0&`LC!'`L 0&`L 0&`ט 0&`L 0&`L 0!(&`L 0&`L 0&`GX;g\c&`L 0&`L 0&< rL 0&`L 0&`L x`=q`L 0&`L 0&,zȉj2&`L 0&`L 0&yXsq5.}O(G#z}(w`L 0&`L 0&)`S>|[mkÃań 0&`L 0&`L `C󧹓ћ7oh֬YM7nɓ'N:QÆ )J(_ ;eL 0&`L 0xiZ}>_^W{E~W*K1b|*5 r,9R aܿG%J˗/ (ҥ͛7SDD8v '+`L 0&`N 57^| gx.1bP-(Q= n`-L\ȿ;wn:vW 壽{lR3&`L 0&@PXl5;y&(6rdjWFk *,Iގ9gQ-ٳva:\&`L 0&` M2?_DFzw8)`(X ?9r$@Ȑ!)RdBI&1cgbD/^Н;w̙3g:uT+W.ڻo啘`L 0&`L Ԯx?H{xP;:$?}č?z5ѣGMiӦu͛7i̙4uTZb+Ovy.`L 0&`L 4C~,<# !M_H:Rx6nܘLsksϟiĉ-e:'z? glL 0&`L 0 뙵?.`y|K,~g5 ;l8qh?I8@5jԠ=`Dz._GYRl曯iÚ>|l*D֙8i =W )˷߆~{'gΞ|FQ)jԏ{N#FHp%r -XHW]UΛ;.U28mVܡ9Cn93{**PLe,k֮c'NJKj׬Y>͞|n4mXb}ҜKĀR o(;q,\R&OJ ~0-;ރ?(wTP>䓝©d!?:r ֤~0^U7=/J6b?Q8-I,8P! =DwltvA~<3.s/W|sF" 2R]^ˮ¥iltײhq_ċ6E)%s'iϟ'+Y…Kwp,J) O)~#ts\=`mD=zDQ"AShV6>GF?7# ,St%&N/>m>'OPN7lٜnUGCbt%YT)SPƍ\U2T=i˖mzb7YNm=)#G#2]A}hƍ2;\4|@U4ħ׬}lue=jCtYFeV#E>wųMs.mh\P*+~}~.>7p0El֭S͝eLGm%?ʖ)E# qNHf!^f6$DuO4|1NY,uLw8mz)Z-D޹GUT ZY5q\nڦ }Vf@P/\eOAi ѧE>j&Z>:m(BᔙБ㪨,[{aAk*nXثoQ\v,8_=i¥N'yj]2`~h{O;OG8r@w N=cYA 'Cۮ_`xL+EQiBBYDT#!ra=;K]+ ]UrĤIu2l0_}f)(^ꔨ{{vAl&]4%_놅Ȣ{-ٳZ08V@ ^_rrt OU\]Tlf23U׺[ƎN%Kp_1'LsWjU"ncMsIϜ5]p(T ?M`ٌXl#yv~ gCx1 xA-c%c+<ijU+;J]:}U#/^Ke֮T~HO !}fGM| fNBua6TܧWwY3>|8?U*O pBB4mXbj9<`O9'EɒR1BKb/Q-!+ViS^< .=^veT1J<e˒Q=w.^jU,W*/m,35JGk[\1hߺ)e=>F͛I`7s^9bŤwp2._s-ikX?u/eBuL`PTׅ=pVgٰ\`Ԡg9ұ0S`}Mpu bF;LB !xJdNUs ]7D UlQUOOekT%7*QFQΝXD ڹs'(PtBez=4-ڵFI;v젌3ɓ'J̛76lhB2M*S칳v-,^SED/azvi!X_/ ե"E RtqfZaqHz~+r0pku<ct[ԿU䷈f`U lgt)ZؾM; $N9'x{i㆔?_,w +V6zܽڴ`W)WCZv_ȇ#, iK"a ԯÒ!`q. "~?;cw?1}Zѷ0rJ<u9zT@j\m+V$v3 /3WoLZUx &M%ezG; swhl~)4ݸ)+sꄑtϯkc`-ZF;vX2KC:C۳EB^ݕ$+hXX^4$0/\ 7Nl!г?`3\sR7-?!8{P!+Rl"Y|/vo4LMEW_ef6NdGkSH"tOK A6,Z\n{ӓˌwDXRd; +V&<_UYcP 1`F,Ą/&MJ5Hq@IDATYE8+V06nk/'Ehь4Spaڷad`yt'eaIT S"\BKZ6˚/7n"tX%]u 7ݿatmZ7{9[3o>mTgw/SףIe 9N@N*>HTH#:f6Ĕ}LRKPG>jН?|^yMLдs&L /-fÀ7nܐl{JJXM?9լkw6>̘ gVۼu;uX1I+ߌ/ `riv횼_3{يگKW/n_Vv0fp=yz( q߂5QYJqk4"v4b t%s.E3a„Q"1 =Op?~DXe# l∞)51m,?ѷq#c |m,J*~KcT*a'Q⹟ZN~cǢ rUyOv[\{#Eώo $ a>U+PŬb  P,O;ه|vx{ IAk[vEKl!s(Yo3Vct;{.>0lTou^y[!lÿ@|&H@~xbB5[X`1XvLzbh.s=C 1UÇ`*dlP%=[v׽q 6kژ5m!{ ㄰ROv9ѫ=}b͗77hġ:?t̃aڴrX  ,in XgȰ%julSΧc}j~9boբ {WÃ?,0,ĝuW/lմ>۸u-Ynڱ eLFbfv B8*Gb"(l)\^B QDblf¢aΔm*ɒRm^p8QC"~N5sbuԩQ mlg:rԱqQ@؇B³iq*a:.}ݦffn"׮&H!B1-Yxd^ށ`;yp2slf{+q#Z׀f%?u-ZJ/>4ND~(VU.n֣Fz5*Qq+;x-ZB1}+ ݺsO6"jgszx*9{᲌7xQ"GExEa!udM2GOOdN-νTeHǵ9=',qN Cjd͔^}Cųaȁ2Ec&/H2VUW6u )l'~.@\I)V|o}D]3c{o`!t _kߊ:')zd?v`{ww8?zK%QWYl,8l@wV-DX2,YM$L˨]믿Uy.<#glٲeӦX-KrZ^G׬2{bE D2/]!e,lDYxu-]4߮~~m#"Y ۧ@nVhEǜUgi*U5, D1wXkB<+/  _\Y0w0xCO03oo*t[v=G1!4F/[-3e]v9YYCն0DreswQ|+_)@-GU?+W<-1vthp=\ѧO`"6<ٌ NͣaM}> wa"ŏbih4+cE*1qͻ#.?pm)CcWr"=jN*"CgazRBZA .[RUS#͟1(C}?4Bf'{m޾/]'CD ߮#pLV?qL#BϛK CFwI<'YMSQ6;t9`,a)!OOk^B* ؉S`8{zIa 3&_ ;ԓ]ȱ3}<4 ֱMs9 ԧ%fE6-Xх ޵}Ч{GٚnGh ՝.w( .MJE QݚU6മIg l !)%ŬKS 9,N[N;F3B/>] 7oߥm=Fu yYjE߷o}=+Ƌ8z9gzlھo!7ټA-\N+cH9dΐ7m).mJg@5+DsbpvLI7`d5+S쾍Ɗb"? *IꖃA~$re \z X+XU?5-8]8Ӥ`l\1;!F(GύPN"FƇbӢ_B˥=Ăfq5RL=yAٞ;'lI|\ w~D\=E{U% >J, &:y fk׮4|p/ѻ:r#g 1bƌC^^^vɡ-?f̚m BkŊew?4^쏄0bG{p,Yn', #o?3Ƈ/噔-k0h ʗ»̙hL: ׯn>Z]gL,1 !֯[G0o:$+s;X'y 6͙A9 w]{Ц[-,(UθpO;D+@~,Gah`UE2f ę3F[1ꁏKBI1J!l(K!ݿGTr:rȫLU҉Fc'Neuݙ£ed2:p谱4d^&EуAR[t 51Eafb%(ہx=Se`( .x~J)ټdr3&$ɓ%E_ J .nwZU*Bsqq?߳Czͣz,yUtIfR C\jɈey7 mƉ4x@_ѠWtu\KVlPO*;f*~|99x;1ja`24(V3J?1UDXOf! A@UgS=Bҷ,w!Epn5gt3m!}VŽ^oтoG4y= oP]F+jh-=a=ɣ<,O;i;³&מ.bTbY)Ha}ּ1<˖:!]vCޗ 3{][(.hH{CE ySǏQ!|Φ͘yζ fmm_jr4g^٭v A%BX@j ýsp"pb'Ul6Mguw8ɫ CvB[ ӢӔ_v՞[.ͼ0bc0ۯg'!&yOA#DC=ةm _u08(AہcMdc_۽~& :V)s3Cc˰=eA%֮V=_>W?R\UMN L%B[odvs%Uy"ŋA4"E|1,Z^},W_}%c9S pat) M>@qU!HlC7S&.)ժ.A!b.z8W|lu,XPա{PjUe%3{μ7[6kJm Hse!e6Yq筫uTYqW42C>.~+C,gނPd^e"zu@ SSȪ 3C1c6b^岟(m42,z*X,j ӥ.RT4K_uk״Khz6sF9XԞ}kv\_qU}tgp]6ݦ#2*ӓWugwT90 8V^Ǹ(e'h~O+FVGL^ۀe-ɟ/ҭ|U#мDy. 7dž  +)t3X VlO]mc [#`^^a3XA&7_UYPN!4)ֵ';LTcu+7>?A=`᭹Rx̻!s*W{z*9~ ;q^/iXߟ=f*mL1 16X`bг(<ṬXrB_FXeDÁ x_趏 {f/X"^ΖaὭmn|=Ѭ6N*lw||^/f#vۮ =?^)*bۂ%hA= /Vs8xb ~ѿoq>dX$GJ}`WoJ[-e[6dhlK$Bf"j)wj5D^ߕʕbF&7,<]zVnhb@6a>@7=m+J_1`GnxBND(t蛧Dxz#ƍ$"&t޾ĉHGk#wEhj>wwl1gv`C}YX7E˧nݺu+*UJO VZ( ɓCS5wq GدU\QfUyts&ΓKƼTyTޱDž*ںmCwoUS#ˡ-=v4nHlb b4n(sgRx(2ȃ&8H*k^qġ="*쒈1ZZMQ`wKvP[^zȜ\2fvFJKلe]ͥ+ָ CMN}q2[W'u;DxM> {um/GJC@<27J@DD(~eO9'~Z^-ՠN e\e1x h+t֜/2&yoeBoپ|ᾞ6֠@Ԛlz`M`pxÔذ!| 93UH"L[7~w]L@X:":vgp76G+ލ=к4T l6}PT.g97(B.+խx|i.})YPK.Pw-Dz, :?,b^zG/=֟! !pʗsK* }I(a6[ ?"V`O{UiL.]J5kz8q"nWT^Z-ALKtVn⭛.@""_֨Q}jҰQ 'ON6l0<-3ށʂKU'5ka78/L?~Kf~" ǡl},U,fɓk23r'`Qߔ)RR^Ҽic!<j@b=".U9L[} ^ދ,cve5cJ߾mkyÐ`UΜ=K54PRX1QciμF#dƲA,sEiܨƲ˗H> g@6h![6\0E)%^8(o:'Ԩ46qU~2K"bUΫ?8+l$?U1M">x2k&a\ OH;lͫzg#ĉZ0/KV?3n]i. :tcھm / N=V9"l`5>ޗa.\49=tGyX#(/+]Ov`H.FRH wUnjYt;r@w#=X0ld5[,XX`JE Tt$mQ X))q*bBue`/Up0ƊHţJ0g2 !,"nDXt?z}YP +W *8Qtiѥ`'LLSvPHv38~ڽax;`nذD"~//+3{A E{V=~$kDΛEٲf5;Z)#셳']٦[xZeZf1IޔP1>b<Ʋ nͮv'C @1(sJ݊k]3z Utb$!B0 9r7**b*3puϬKc6^f,+7a<aY ̳,Bp)ޘ8`= gFYSH71:~a5k"6[73f>vB0 +;wZ i@X C>bK/BE 73?E^Y k,Ԥu'q#3B|@F0wLT%"x+c?lZZyPB|wM ;}B4r=~TϚIF/q13C8Sgϋp8qjFD_RHJZ62 ѡ f |f. 2]65ʺ{!x+X`v3enځYoM rIJ͆qB[}%[-bFSRzm`5yOc"Ā_kr~ v?~+m6bȟ ),.1൏7U: oJf < !DJ|M2ܻCG lĉ(wHzJqD*׭!+H~?eX>}HMEeřPtg葰XbɁao>ʙb uVdC;ބwlFP0{c1T+!vfIm0_OQWe1p2^ɟAbsNyNP nN]|ݽhpЉ'Ekkf^T,1H ź+(Ed.ku=Z x25ߣ|@ ]Yȑ=_`zÐYu֨7 !-jL".[)M6O 7}u_(vOvM){GrY³C:}p )9D 3me.1w ݻ`.iCS"E9Mv7;v%+dCuJZP 8^Oathią_+\댛ֿ;p!nεqW}!,n.MJѥ%$ a^q/A0x{?X1VEPh8+B|Tx5^~Oc,ϣ?GY)smXhˤ.6WfNoM W">`= P0|_w !x;HlٸeLZ@\LmϏh^;@4ӲIdUo?r &M*DeuL`u( ۖMĤ@\T7ӊc/zJF ) !A`J|Uw(".>bĈט[uڵr`fKwZ `u M`e]EDH(*-ۨH,{oI2/CYuPi[J/F]x (e׮]]{kU6ʖ)%ݰA$K"De`-bm<Ҽ93fj HY:[jTPG.NW0aQegދZ<1w2wV?ч͘e^>EŨ2m4x#"M덗]QépF\\MwU+OYթwO۽|I#\ߣF Gz+ պ[5=&<ڛ6om+g.9klb[8S']1W-P >T͡ХvЀ~U.AC=²g3郾ajJ C.G:agQciނ ڵfMˈ_\J5#l甯`QY6ϑ7K5l3h܁A4*E%ujX cӈ"4O+l=eJ/DeDlZN|]T*= ݴ] wK $jT*knP ԥ 7A֝hmjQo2P\\TA H6sRj6 j(,D܃\[v1T#Ӿ^(X质7M D=?d<D !` Z e=XX֭[xP);w@{⡾}v*Rm5Wx,1clU /3[y1!_@ELylZ]˳eBߓ]QÇR%UQQ: -Rȩ=} ժ]%Et;. FTڥKRf:t%0,~0D N$8jvUgHA-Lq|'OSS\hKBlM_jf@z!ꆆ"Sy aS7s(=ټĪPߎD6ߏɓ%kl(a.o†(96[X`Q׀>;d+uy0>!_6vO܌-As%1XeD7n2CL` qkɡ .]H|T\xˡak]BT?fW(m2q|%эguY2e Q FC# Mt>m2xтR¨Wy|(W(Wrp={N'N{aZ7o$PX*ʝGj)WaFyú F)޹1.ZADbM[vᣪWQjam,YtW!3pҙuFD^i,|£0!]Vdx"^0se#NDŽg9 Џe%n{8S q]ЫIFy}ƈGl̘13OwdպFC xڵ** _vG'{oʗU,cp?^CD{unDxBz~lvѰ٨NUV1R5{c'r{bz#[wѨ " ݙ>4ʼϘl%?;XUOuBjѷ{􆉨|vGx2coWR`vJ_t~hj<]M'".*}L{k7Z1[L\%ݾ2= 6E:]jGe\=1"ޓ6uGW>,vЁƎk>\-5vmlK*_Z>ZiOSs93 o7`0-_+T^4Ѕ8Jo016ͤI.^`xjY.gG=tBC/}AT]<ON߄G3kҰ͜3l`8Ȏ–-یg,Q*-i H ̳2ǧ_Fm?xc6kن8*٢ [!- W i@XϠt[||93t ,CR](ҰN Zl#Z ¥o;vL \jAzst9z8t*4XgC4sbU5rJPJʸs݇eMf0,oHo|Zȶ:|==߿!? 3mx~PH,*^Z}w]Xn/K*F#*-I~И0`hR$s 7,8ծ#͕@P<ʷdk Wx(AXU\T/^"P Hޡ5ʶ".tt".p?uĨ[^fvFя98XxҹU+Zx:/bVzHj^TKl/Bh?i̦'vB`IL rjbR<_R8z"^/)QHWcS#qncS-QoD]v\|FomnX6ħOeklU6YqQe,~%lypC/_LqG!/a$///:t>htÇjxȘ1#Ax-XbBL=A,ć:7klThONC6Uu`]񓤷ꚞ]p\0w^<;jr5W-X/>S+t d l94{Z'8Sro4 @l޳+ͺ_.<+Cwt6P}QZt{ Vuv{C ȑ'Yneͼ]b`]x۶y=%Jht%wXm{1PpA(_;vv 2@v[I,Y 7) IDAT]ҥBL: Hp&ҚQxYBc@ұQdwi>]q9PF&D Lq=#|n >KΣ} v  oxMEL^CM7 UeWhqu +sa3bhhAgN4fcrE݃{uJ/_5 y6ヷj^}cWy8ϭ[6ߩ45EISZ ȸ5mDxvcc}觥I^7у{9c`Y!4wkw2c.1 ޼u~z|Y:AΔ>~k{e ޅ]a-Ֆ`NaԠpqnڰe'YZɨ^rB D/ӦNAU^}7/*bPνmQɌ~Nr|}9/:9WI eec<|e2!E ^56:/yHDUVpeKdN[ myoaNaB `lgŭSwmtgJpvCY~ϟOuԑU]6>|vJ͛~]]$w!ŋ[VjժT@*\W- }Hܼy3.]ڡHp _TA,~캓@tL?]g@HbEM@CkatJG>tVe\Mѝ;r_<]_'IZynݺ%DW&M~ h=U=nbiBg:}&auc઀~ eY6ىckWL)S$wwr]1!ܽwb ]\CD׷6\6nwޥ_Ġɒ(ՀdUG|`\rUtNg`.\B!P>pcAgw_XC qs }o c ulFS|2a :x6`pD]aq_0!8qbLS?Φ1pW(Qa4-PXfԧWcfpl`^%QxBݮrPʢ C15 4QϿꍛ>\x9x_D7 `xMtAsg"ј"ERXV~%I;Y/}JiG1wRy{YpڳZ?i C*Ć.[oτc<1>Oڞ;lP<[8\;3*} jM`;c6V5 * G"L4׉E4&?w~F;W(S/l(IH>adq#}#UϹOwuPx(" XtGsz-ab!BUHQ1(H9+N,j))eOU㏊[ ay|m{'^1>kKS> `C;+B9qQу6l@&Lpھ}{8q%. ,Þ'O:~ ?-UDhx1?C dцv~Z87 A7oݖ׫]vڅթɕk C3.\Fvo!7R0vW *ڦunZg78]U- Zzz""bNrdڶl Cۣ "l![}Og 6+z+=}[4$Ď^`GiJ}R%x̙ o~x=yb ]"]mֲ X81%#w~cS}(^nFF BFMB[`fO}B5݄6={vl% |4 ۵aWB*S`P۶MO~?o`],bg7ѱg|nF&0#˅bDʼncjaG i`? ʡ{,.vXt)޾};,XPEe˖kd) 꼈/ XWvGtDHgvZR/_>)Za֊ b6jbU:ؿgC\ڀn; zVmۦ%l!>^h\qa-[4V͛yO`ۡ;=rYvaY/8|8w|ymԩ SYc~~)ӱf[s\ = (>#"$7zJU=Vp=]\'TD@IDAT]FPHR\ JqwCq);wwm)T,7{|$c&g ;w᪬>M /Z!;Jرi޽>}zYfȐ!4h ?1gܺu sܾsϟ޽kwr@hG3T~#y"D4SSSBq}YooZq4o؇sSV\|ϞcduО$ol #lڶ6n~Č֫EY2 @hFGtC J(hŏ'4?@}5Z=uddoܺC޽hhҨ>72xH P&`슀Ə6oLYd :q(@(P%&ثWRR͛.3x_6Le#8$>F` ot\(IO>A#0@` й)xg/cOҨ!}>#C X;8xW#`QҴiӨvv}-E.ͼqmJ$]ƍAst &`P4F`F`F` ٟ)|b,,!xb([Ԭa/Z㪡&`CY },jz޳+VQFQ6wQH\5d'N,ܿzA .tYGeF>Um`F`F`FxH߼ Ny@>~=;RT7Nhk g#CyYf͚ԴiSfe\\ݴi*5k$^3gNڷ9`F`F`F x,YI7ܥ?x}ȑ# ԠNu!>~qY&ow;5{6իW]1gF`F`F`F`F X!!_/Xg2={t!_6m1#0#0#0#0N`)4-ݥreŋm'ӦMKlڱ|870#0#0#0#X (;޾}K ,cЍ7|װ?ZBp:RG\`F`F`F`Fpn!#0#0#0#0# &`bF`F`F`F`F-L 0#0#0#0#0#0 n\`F`F`F`F`0".0#0#0#0#0@`6`q-F`F`F`F`F`"[#0#0#0#0#0C ؀ƵF`F`F`F`Fpn!#0#0#0#0# &`bF`F`F`F`F-L 0#0#0#0#0#0 n\`F`F`F`F`0".0#0#0#0#0@`6`q-F`F`F`F`F`"[#0#0#0#0#0C ؀ƵF`F`F`F`Fpn!#0#0#0#0# &`bF`F`F`F`F-L 0#0#0#0#0#0 n\`F`F`F`F`86Fhn;F`F`F`F`F |Zv3s^u7y¹ Weu&`A2#0#0#0#0@HB ӤIp_F`F`F`F`F0!N K0#0#0#0#0! &`C 0#0#0#0#0ǃϹ#aF`F`F`F`!pwF`F`F`F`FA ؏\0#0#0#0#0@C vB;#0#0#0#0# s.HF`F`F`F`F !l;!F`F`F`F`Fx`9|$#0#0#0#0#`6#0#0#0#0#|<0K>F`F`F`F`Fa0Nw`F`F`F`F`>x% #0#0#0#0#0 a'0#0#0#0#0L~<璏`F`F`F`F`BLaF`F`F`F`&`?sG0#0#0#0#0! &`C 0#0#0#0#0ǃϹ#aF`F`F`F`!|$lX '?7λdF`F`F`F/#o}͙3ƍG7n=Z7"E ر#5hЀ"DHecF`F`F`BoFKWw*̝t@()YTr93ׅ9@ ؏4̃x>,Y._":>}zڲe %H(D;0#0#0#BoiikW8/"=Z4ھE)wS)./ ف-&`}|V%_UwB; ;vlZp!,YRW˃R͚5na-D*޼E_RcԬe+IEڴn5}'i*HL4Lr 嫯dѪ5nPֵEqG^ aP-벻yr2K:ԩ};!7M3nϪ+RLm^ ][<);>]ZSf<"_UB3 뎀M"mݺRJE 8~z* k2ez1u_?M}Rv؁cƢݻ(:.]L&M_.\6Dhܸq(oԦUK#Hv_[FS&B!i幐Wѥ PVmʖQ'sZ$VX.mZNfy8-+W>{9goct^$SҦIC۷v{>xڱc`JI LS s!r_wc4BXX9Ŋl5r3z@(?Md3!~ X"_[uE&N8 >m%uZ>} (@/_vڤ/ vھ |ܝ8`h&>6ΝTAccp Z YCEqUaIPȔgu +El\4b`Si~ ;/=1艁8e-7ɒMcٶC'ڱsO[7R`\a Yo0:iZyRXaU)翳銼/+'XbR:ޟG]{m^;k)gKB Sgyԛb PGct}ް1zƭn/\pԴAʝeS`o)WT"U]CQ]@/_vk<[41% RxjX?y0O{]6)kflx7|]uGuQ(owIcA%c'0 TO ۻbرLSʜSʚSJ/s+W(GNW X? `SuVyҳO?ZvïaTT ˻+BhN<΋i5W%;f͝g$r׎+:P0>:y۽Ec)'kV%vX+ fc"`ZoUO_TZO/(X86_cI^&` fGM͚1 ua6̘\ Z5A2jT9-WS O ˩n[VTBiT_ZqE؁7o\6̟2:k(@q R`0&lXe{F2r$n#M! Wx>|?)w~zՏv]'`!x"o߾3gl<Z5lbL݇Ҥ]:4v(z!f&ݕ=㛬H<ß={N O> KGh6øI3zbf&M *%_߈QMm eK&F:#`GI:u;%JЮ](Թsg*[]ݻwӈ#hΝ1cF:u]SÆ Ԇ/S}sM/ZLRV.G~W.-6%`>|DEK6_ 'i󖭴q<4*x y.|87| }Itjץ 6>v X\fb;0 L0g }_"`1AX(QhA^ Խ kTV^-!XB:A7KVp4cRꖅ2]IrAEDHU?WT Ţb*-AWѬƉ}<${B"QLM=`m0g إ6 {4+Y#SggeFtu%IX5+r!aiE*#UME:reȐNt I(Ĉ%KFYvÇiժUF3x)~8#AB*ToS+ `U[rJԫӧLEmH(}4&u# C-_qa(`%GYE's0_Ŕ6nNnߖ-@oqrӈzօjR ,Z6Iמ|$)b(NqO<1M5KPE7͇b[o|KSٴk #>rWt e_gpj?^\sQm/TV=ξ]?Y(aL^8gO;cFUh;Onky)<7'Og~ҦMC -O14hgڵk~(e+K)n^aY̘1%6CG}Jo2?s6o):w-["t^ʏBsAF򾢱nԬE+X~6VLx6TǠs{B.f))]t۽{6q`E7shT{tAx$>%H|Y.}綘%LP "&bM7:A'NQ!Il#gv[Jѯ3gUQ -N YDAF+g^}ot["rZwĽח K= RR$K޽HjӤr dȕkiS]?Ζ  u^ X?dϘ78; /9Eɓ&'zV.]7 ѣf)tQ G,vtkVHeJu(djں\B7og{J$GM; ! XMu aM雬UWˀ@T)tw@<"3C1U> Y1XM,S۰ط{GHp4mY<ϱ4ch;כ=LaNj#5xmt'w[ELßl?swRƁLЧ^h8X+L@3,7.Jx; zvcM;x0 Ê?R*Udo[C?~|񉶱ǵB1&D.;zP 4 S<|VZYj*)SW^V93-]4Om:]I ~*4eNm14C|]`NFa2pPZG9=e !A0>s42 h+f2sMSK,kܘ$, Ʒo`ޅ',*k;_yp[uPah&AF"`jvmZQ&,._Bmwz8{tޯ{slִ15jBjJ =z.?г6r:o\ԢYaRݻsHCGˌ5Ed6VFOΗi3V=P8,RȉWӤie0UKQd߈~'Iȸr[,xC^jϑ,o;ʜ1l>I;y$U֩Qƀ9Sꃾ{&u3|!}% SfY1H,GL/;i^1taGH/H0uJIzޗ] ruǞr;&=»veS4os4rze5Xha.fk7nl kм')jD7;ؽ'##PX3â Ob X/! X%`݀CWu3T|3 fK0!=zdht;y)<8NCHDUe? qM@3ݭlMa}99pۭ#٣ DŽciXrޢFPE QݚU<_7rxFEiLz~@۵kW6lڐJxSY y)ϟ'f=z4u.9 ر's>hT??\c ԪWr F]ʙ=;{p-Iyn^|Fg£Y/;YAV*I.p3Ny Ǝ-e$tiѽTC+ED {._$H;\Et Z'z!]C}:,qm.^Dn?iQ A"tocX f}٤?_ێ7}EX ˇ&A:9~NxʢMgo\eAMKEvj݄p2Vzr A{bM^iixgJnO~lf_).5/l6>O*>򦹈]0mZӶH]!UW6A"hF%_RǥI`g,H8!p h1%LZhE :nٲ%M>!= 7́~ZnIB{pRFw}8w4 '.\(ݒUF]Ǝ6A6v@b]$ [jxnɨHBTFUHRz0LO.ORR6{4ʝwl OЮ{l?xbyB)RAsLfŹS~BvA&}9-T ,HKJSO[71 Z I?yk 4%Q#&MYslR4ryadxM؋.x*8Y 2YΜ3 YeW۞,횿p1hU_۵h$+V׬ܮCg;ے%ؑe3m٬)lx‼y.xȝݵ޻g7%W` En͗l촯̓>&ZoԠvmjef9#F Q 4a-<5kTʓ+vX{8Ta<+!>ad?a< M7x}:t$OOWR3QߧN“mR7GdJm޾V& Q[jt~hO:y23=%`9g؏FV4H 6>AORxu<]骸sUV 3L@mU;v]}%o Hw5=vʒ\+7`)P$%LQ\UK%ɂ S&`D Xkuaw  A+ú%SB`J; =kҥ,8 X_U{4)>xAEIn4S')TUK_tK*A m+eM,X՝jVflc^y$aӦy4W m~Eex޺gN,cZjаF 3dd(RjRA S uQ& lNw.LL>᭧һHo\"(TZYL`=X(Rh."rbc?+徭,ݙԭWmx-P܍#PwԛY{oܤ^&_۶GxXs)Cb0Z X<Ǜwt)9uh¾$`h?SbÈ:4yaf_\/ h1K̝>ܱun|< 210Myе6uvpnbIAy~*L|,Ab]yKzC*FM;ǻ)c,(=hƘa-<%`U?ﭬE&E@V"`ϮQ^H҉,HV34 Vֳk;iO¥+e2c?L'`++oLx~+KrFQ^ቩ6Ow9i;\QG ~C"`q4{.N=0Up4$eO)f孞~󄀅^*ͦKG@7Sl+D3EA]3,Yd'zYxkw<˗/Kn633j*SF,,Lܶ\t)lXCO@:yZz&壾 z}"5u:UӧwbݺvukjL_R o4!]{d &Ç ǣVy.ӿq*sBhTоU-hkP#d56VG˖0҂ű@rlc2޿[bWBbvZ'xv1JTŵ{^ڷ3>힂&(K2fUB> KWGaTUWѬƉU˅_PdMS6; l.w"SSR LyaK>w.@?VJkbW?;RT],UuvuuhF# eull{EB 8t_W\b^MkL[-[uCydAm!]LyԪm,w޳S+#) ؽҊ5ckdcƼɆ=;O=~95bCt43'lRFv:-',Asfx=y7zt[x&CD., l ʛ:2}El?@&wL`qmT\vn}kח:/_>ڷoC˗/Z<  aĉԪ^5QreZv VXD@F& 0~a&r ڦ K^ZUF<ǯ{am8qZRݑf#[.|Y4%N:3TnJJz5oi3zPGL+._]v]&C"b̈at! 5`C>d*kvmmbN߮M+1ÂU};{ժ@mJ^]`Ŭ9KӃ+U f&`:BsLB2́3S=b17F?V@>}7 ]o|nUOrFmܷKxP&8c=z*z7//UΟ.q g*#uh7 ]'/C' X}{NUӆ7Lcn`YtY)9Î|A0 2QfZ ǏG֓%˜Flޝ̙f[(dz抨51ٺcYҿ-[TU!uHxJj8Ք}%?MVhZY`ؗ%mw=` ^8A"D) miXըXa?揮\DQYM>;lTH iޠ6eΘӹn6>֤~ #W s/Mj\Ql-fJL2oHm3whÊY`R.y45eݽp&fbۊ1K~D 4߽{O=;$MfaM(yKb0A8EG"`5uO#VT!1~nj;vwG09b!i _q UAB)Yc_.ɍ az^P3%A> N&Nܹ[ xʰl_VgΜ1h~/RH""Gbƌ)Y#w~:zp+3OE*sfZh,سCeyԃ7"Y9Ҭ:"xK f&#K*=վ9J<G!@aY|dNy¹jǗ;cg?G.4dv)!?Qq X3(@S9 @>8LJEp'xDfbU2ErY$X׭3RܟEKiZxW?ACӒeˍCSmχHE2 ؒ%ؑ/f2FuǮ݌!^':a!lص\[lNz\0gBp>ފܿx+Exp*` ~ty% Rl^fZtvfx;l?VH].[Q/>FuڹG GuHkߺdJjX@-9i 8o Qx=ށ ,^-Z4᭺~z$ɓ8P#t 0צ;'kl;sS&H[DE@ efO'3yS'r4N+?U%=87u%(vuݘtT;=N'=wA^@?K Zhb Qhd6LKu A@)nBO;,=T;,ͤ8{1-GC nfe`-;~d>s{xIO0NxEi %AN*O[6/3Ebz5#Q b DW]|ԮYzݛτ@=q}>AyؓOPQ62sk5s6b&`@(AftmcGYS+p/_T._A3b%$yOjë$H%tW9~ؑB'tnCE ,`K4 ݾ}W̙:x1Cgd{X?uvR.0ݷ{1ک[_CrE: vzBߞ=LPpE O-wQ`p(o Sf O+0h-7vqhzxxbyYqQ6UH +:l߾s!?-"vʕk/Xk;v…G7 X݂E?fΞC 8b4Yy2!_H5#w~UM.1Y{r"ؐ9r*[QwjZc+ h.蔌 9{jk'u/)SWyx!^TڥKrZmUy` X3ITH$>׭Z! !k,0a|EL/I'”qؕ Ve>>tE{,S}ATL֮l&1^ҧ"Oh#+9 A]T1C}F+VD~$` yzx(VH蹉NgΰysIMNS^†ةV9sgA 3{"oc&`o=ɓ+- O9G[~eC}iݼQVu͞+Iص~p(O X]3vӶ|:JN~vm ~`U(mTt yψ04}A] uDnk/);'X 3:u'IVrgy~,c:8 VQW\wmٶӐ!o#ʮbK7]#uK\ּ]ha7zݏŋJ:d'v%U|C2SZ1P !`AD/Y֎SѽIΘI'MUYNcFR%+]M Xa!1ߙy, =ؑFV}jѬ m]V`ў}lc T0>#oA6Es.s 2_ybs} Xh3o^n}`Bb]:ڽW4}I4k<#)G m1tTL}:sA_NUg,.X#ؽO5c0O` GAyZUi{T~O Xo  t uG #b$} l)"`.=_Fpaߛu^'uG,Eb$`q̃GW$3QU,{|gX/gf0HW<;'N@Ib'J RmOSYʵ4h8Zru+-_+Wгm,:_ڷ'g68>~BF9^9T)'Θ/o BzJi0zό$Eb-(v "t_hެeOQEZs^jl~́IsVƮ}KE _?h"3fOXT|4 *0䆑ԼT[N;hMfWsFcP U]ȯ7%~ [~2oX]5/j|!o4ms:q6X&g4Ib _KRt E? {{%+4ʕTL&n޼)˗)(%СCԥK:|<[ f]6"1cF[P4@A"~C^s͛5c4ah՘ݾMkLQw𾅷&p\8o^:7}W: 0U`{ny^2V+A-sdAڲ1۞шM~UHl"oӲXhkZ˖LEwJ=ћwX^) ء@$0JzF,,X@u*թS9B]v͛4$IܹSK,1jժQPB\[n2eP"`cP[}>K|\~]J1S7Njg7=D/C2zI8aZ%ZaJwԋW/Ŵ$IbJ,U= í[1ҦM~mA&`^Џ7o 2 > 務-W ]I+rU*OVup+XԎ [f%Jªe'ZVg"RLᡋkgmڸ)PܽK?Fɒ'(jɪܸrK|PYv^nJ*GI## sRIx4 JG_<qN8/QD,6Iō2\ -yVHjT=BS!ޒk?x'ʫ7ಸ>\]Ӏ߾}'~;+C&WAċ6j) J/:|̦9>\Ϣ:Hw ϰxwsژ?3p_|UW=pƐ@ 6 96y6t)[x(AXSA^"(9XK"/7ŷ}7?Hҥv̀G{7m+ݣͳaÆKwkvTԗUiXpm(<_CWycZv%0,l FU>@.9 $+RK TJ4r}Sd-Y$?J:?kOЃ"ƽFԻB\ lL"aC# HTc8Ĉ#~0wN6m &8hk׎&NrOۅ I̝;78a [T܅9 jDֻ@i tѼ /)t(Vֵ3կ슀 z;G{ǎ q@()&o rFfmkT끣k@p:lO X_/4 ?_)uY~G̉Dď@q>]sn~+/}+% XO򠜯IJ*+}~aUȑ#ޞ}x=}j ϚS{A+iԧvP@FM-ЏsfPo .hCޝelF6Cfk:ʕ-m,iU -iLmצ5o8X`. oQN/,УKېUO0"l0n6?+&`}|}E†f:#`1%qǎTMrԲeK9=2EIE3֕UnΈ(ydU&`Pᴀ"-FMlx;UIq4J!XpA;wwwww9!ݝ=@BzY=y#;._KSU]֭ZPM9!t"~<͛PfMzH$`{[=IWgW"zWE5K%`sISLIS$F%JcXUllBm~J )KuL ~ܰ~R!&` + uF"/Fg#ѐ!ChРAde M(YhzΌ Xgpzh@@'`J(^nh8N>#cH 4aaDPx,/_Af;,!h"#0@Ceо0a"ed@/>rGGh(+DHf}WHJ@'?}&tv$_wN.V~_zXt6nH3f{!@Vy:3իTxqP>ΐЂ}W6pB˱q0#0#0_ z /z~)ɯ װ"R!} !0'ʿ$lH%_O,DNJ5kZ #vsKD$O ~z_>Ao'c'8`F`F`F :k: -}#[G뿂X%SjڠV?(>0gݺH,Z0w|Uݢv/Zuiȑ XǏ :L׀wу,Xઊ%Jz+#0#0#0@pD@=xzMpɟD@B7LdG'w.:v+WNM4Ѻs.tA`̙x~li.LF`F`F`F 8 Kh9ݸ}}pD%NתJѢEgk\=$ lH8K!ͣM˞Ϝ5ԩ,ƝbF`F`F`F]0g:zFfJ ]>F`F`F`F`b/C;TT)xb7 J6nDM\`F`F`F`F L-.k޿O ϧ1cF}]ܫ}Tn]{yb#0#0#0#0#`V!KF`F`F`F`F`<cF`F`F`F`F@!B#0#0#0#0#x&`= (70#0#0#0#0B X/F`F`F`F`F0LzPn`F`F`F`F` ^2#0#0#0#0#a0#0#0#0#0#0 &`dF`F`F`F`F0a@9F`F`F`F`F`L*$x0#0#0#0#0`Àrs#0#0#0#0#(UH`F`F`F`F`#F`F`F`F`FP0%#0#0#0#0#0F X1#0#0#0#0#`V!KF`F`F`F`F`<cF`F`F`F`F@!B#0#0#0#0#x&`= (70#0#0#0#0B ѢFQ}%#0#0#0#0#0!^gH_LE0#0#0#0#0 `GI48}aF`F`F`F`F; &`|."#0#0#0#0#3 f'0#0#0#0#0&`CϹ#aF`F`F`F``pwF`F`F`F`F l9|$#0#0#0#0#`6#0#0#0#0# =璏`F`F`F`F`LaF`F`F`F`Ѓ\0#0#0#0#0@0C `vB;#0#0#0#0#z`6K>F`F`F`F`Ff0Nw`F`F`F`F`BLsG0#0#0#0#0 &` 0#0#0#0#0@A s.HF`F`F`F`F !l0;!F`F`F`F`F=0z% #0#0#0#0#3 f'0#0#0#0#0&`CϹ#aF`F`F`F``섄|W$?A`Aw%#0#0#0#0_cj!_x5 +l#0#0#0@@͛t=zgk"F@ħjKS(]P4σ5k;_$M4)uЁ4h@ÇO'l)#0#0#0{6f*zWp@ j(ԥ]sỐa`qEW|-d߻KE˗/*hyiҤ͛7Sx#F`F`F`?!pj:vr@?SCFg~F X?C]!9rбc\ ܹs޽{ 6Б2#0#0#ރFқ|[ˇ "GH{u A=&`9gQ},fϞMj ]>F`F`F`h׭e`E`wߐy[0L\ȷ˛9jO?D 3Rĉ)jԨ+}69sCNSٳg.WbF`F`F` &` A` @ G?k_G4i"N-nܸA3gΤSҋ/ܪBQ.p `F`F`Њx-&`CY mn5AQXܪc.K0`M0_s0?z #_:t(5m%u„ hÚ7-:azie)?nhogΞֿ[w;r'aR8? wo)L0m~߶}l3N+xüFok)Cѣr;kTL)#WBgϝWNG.u!X?=?>9 'TZ%J"M[ez1LFh峦I}F^h]htMz=%ԨZ+!>Eh{^xcS+ծ\a6oph pBa!`cĈA ,bŊyP޽{> k?'r>:>.]' G`+VLʝ+'jA195lҌw@ݺuoyxO2%uh ?J"޽R4!:uJjڋ~ΐU>={ +i}VԤQCF{S⥍]݃U.r壷o_ cFey%d!WqbeAr#Mg/^D+sBmUk7ɬbr¨!FVk1p1b2voH~Β)m +/^.ʾ fL 5)kZU+Qԡ,OoYy6R~1 S sM V&ҦJAyrewX&hx9w!;@]™ 5_aS -'N_7%|o)CԸ^-:-L<9R믿-; QJcS ?| yL'6iҤyfI jQj#kɒ%qe `fjN"DЅdR$O'"Tn=h˖mNQetґծ6=>r 8m^ l~Fߐ*+З׬-b Ϝ8"^vُf-[Ѿ]Q+];STG` ۷PgVT,i:<5map"i(ߧ&ZҁCe1 غ>Y>ΐ y 0bEPBbɲ\z%KĮ\@'4 `O%O{ws\;W (A|ꩿl: !䭚'؍6ݭY"MڨۤZuć^.˄LwhQPv^_xO{?yJ-U([RLa״خ`Kz:a@B Гb;<{ ,"7_Sn)gi/,6ʔ<fr=zg۷BzD}M+Ʀ1)/uDʛҳNp Kn?~|ڿ ,Bɓ'/_>|ӦTRtQ)ӚKb,g~jZgv飇{SEBHNL4qWL !u=f<͜3H:感+?iߑ%kLcK!`X$i>>X+ jr*WIUTr^P|)Q37VvM!Imx"Uf%+zJ5Ws~@d6RvIx=#[@>8~]N (#]?QS!W<UH8#n@Pmg ZUևfkҪAO5ڇ=!ObPX33K:y5i,;T+HVepx/QwG >ת 'NqfbK-lWEc@]GqЂ9Qti1?F '˹YY4˛+ŋGʱ;pV1M9=a5P!`K+D%j9^$i8B+nv\ ؝"|?jM}?=77D~ OLSߊ`r=۴evh4F㴹(+gJxnA0?4LEjWxjOzk6Q%)Ѡ7팀*,Yx /)?կ\Bٲes3+@@IDAT)FpϞ;k3=p'/D_r:uP(m4t ڸi3߰(Q+܅[q)kNlد7UXǺfVUOӉ6xzZ;fvY4v$c6iԀIųe_XrH0k#F9~g7m~X9-}=۱Kwڴy{Eء+LPv@evm{OzY*B' H(Bh>켅Ki}x~$ጀ|O<|,ߌg#~&8CzdIS=ݗJOiRQl`HLث %JdfSX8*ۉSgɔȑ"xAAs W*.WeKO 3\sW!nY Op޹!.W(cnjahA^a?W?E*٢zlL W逃*q"J2J Sr"Ur?tF1:v}1*Z(ܹK:uRJuvÇӎ;(]ttDJ͛74p! Q'WD7MHyX#C[u! 4B1e W߸Iw`ŋ2 O`XЁ'jШݼuKͶ6[iHYnvjXz)--Ӷ'?\|d<4e<~" '@ e}$ڀa:S 1{K誘Z?~A4eޓ,0ʌW^qK\ᥜBszv-8ϘÇlA2N)}M/Q/?q=){3HNX4u;c~ UX\)oLtgytqӰNu!]s/ш_vM| ~!`/_NOa ZNCOu Xlo"^^eQiX6-ZKf6!Ac.WԿ|l^ `X L:z'YxCšJP$5!|UVpTʕV6'Nbdx)-$t2 b /`#Z_6P@o(,Vc'}U:u! T 1T>ثV(A3e:\sݶXQL#5H5UӮCg9"NC%dܩcFiӅTc#)s3af&9ҸB9ظ h H|AlݴNUwXԮS'C(ipTоԾSgnGT XxyIl&մqC>׺]G9`s߻G7u`&5n ?4~ wݾsWzBN7mlW|?wMАN:ӄ6̜>rng %lxR㙢NGuܿO/"+/ZHaV1\Y6$`u=ߖ["GR%hP aXدeȜxiҸ`o} 2oٸNDglce~`[*ԥ{SUqӘq#c6FK.SŪpz^-WfF~O&5Xb3 ;ݣ3-<njʁd]͝C%%Q)4Vr]ڷ26AS2a/_>heKJi *:B@ޟ0]nVI m[Ker Oi畞JH&LYWް XH0љF{. 3IΗ2 ~.Q*)e ARvhLk<ϙjJ5*ұ;,!:! `إ+d`o&Id9~6YmY-lwCF <yyB/XZ܀s s~UzE10 j;*_lIq-Y}<|`o %C(Yq__?}X|KaIǵG_(AF 5`TO'HX2!|~f6QDrJǸqÇwBeӖ2qiƬ٪;b0UPˆeWx=.'5uU=kV+.^̘׬AZi'F3gBN kmhS SeW1Js>EN:>F׮]#>“?u1mL?r5hl%@֫S[طSؕcy I̠`L)SsQ熵(IDApO;d3uE7d`*_ C3+w&@j"RtʫR 1G1Mt]ڷjR.LN4hN7e,1%}xR1uQő科`x)BTȯtOBDT1!^|U;:Ұ+F )%N@kDXXH􀕝')T0 tg5A\)odT tO9j6Og8#{Vʗ7;q!oل# ^ykvB; xoaE+mhwKuqɒ%jTl?+,\Y>0K}ٺc7xLQYد⼦ݹyLع"`p f-ZsF#x(RQ >}[)k(EȞte%z0xU,[R\tUyw ػBgQZ onE|Ȃx9#Wvrj4oܲ|f! "f  񟿥w;^C2Bpo*@VChtiᙻI\kLYWR2S((`sfKw@~Mr_dA#;@1ipJP q}Vfv^vSQa/H+x\]Yf9VmץkoɌk6D( OXX[&%cS0 Y$5d<,^x5H&uBhCH b0E zHUv=9[mJR2^ 0dIZI(ET(Cl}ҕ) 1uA`ISg<`qon7ۺSOΚgj$rQ3aޢewŻ*[Q(,)jo;{Szu4og0NxʢMg A, X_}؎KW=ϼϐ1ғW9%r<>6UmӷSSu(kF{ƶypH[y'{B3< bDFֈKGRyEmޗi;&̉,HpE~u{.icղGAP!kl oGj$]^'_ҥ y{[_2Y7\5:wl,7urnd8Y'hR?xxCBwP!}=y8NH@Aٜ({j مu6杻?`h&`A,]ST9ym1^A*;vkDm-ka9|a9q9gQT4{"T]sm 2Ζg!r5UtwVVO_1LVC mN6Z6f[/z9s0? tܽW5EŊ,$H$ i<_UT)iղŲyfE= ؼem6\`.ŎKtܱg^Y~#ua!n j"t@TӲjsRGuF"YRjJCv7AW+۷GuĦj:=)Gg$a qa[#F,-[%)OH 3YlKW.U<UiN&H-lec@ky1qclA&YM+ ߬auu7]шuYYúb{$N1.|-UU*OݯDߟNdbAϸ!4oxuFJQuϣo4`Q>Ck-*agSa ;y?rEX'`,3{}iNڷZbߐ>A{xBeurB E:*͎mZH2Q)V@\\ٳ,yBxO+(pn-\=)7[6c#k=s"+ ҋ u *pyx-OBkZ1(`^0H0@Z@nݹMS eg^;ۜHUˠ&`/´g4ype\urwYbQ?sw>P "FmTlZxT.Zt%u}" 8NH083nI ڹAeL"vD a1$|&!U8+fo.F-ZiӦ٥%90yL'[P @)=TAr0>}D1E>Jr@1v,?PvXxQ鹧{AM9LMUX%3K\֢ijݪ^:4DGy޺9Lq́<5NW̐i BEn2gR( $c1?oqU_Fo&`́@6+dK+< O;Xre;s]ujհ d.h1sɿ%uf.O& 84׷3vW2df&`$8:əGxBJvb'g/9r2 eIHn@zC' X (L87ʤ)ǎSFMU2^Tpw7,S6_oq;'BU9O-S{foVWlL+VoE CX@^^遜Q R6z챦OXx*+a%")*KOm;~5y+QGk@jd/z >\wڐ[@=kAB%Ax؏B$[گ0GQUT#^iXje9czje}[Fym!P!l=:Ȅz%`au6`^IZ>Եw L\U]s+Y,HCF,dS,~ xu47-ۊ gzv>'%$ 3.Ҧuk9K m~Ck5vTRWa1Hב{ f9XB+oFU%]av3iԋE"tEfOV-bDC+Bn[阔/eDoZum -i A4nh+iӡ3_!b Y,2@ܙ On!uFpMMKyfUOڟO3IX3ˊKW Qq2 _Uw&uh߆7ol"t@ u]'rdH%+HBUYmS-Iԥ- ʿ UTmL OG8jCAb|cIU3ݝvuѹqYj:/ӯZIfkmv=Aի%:ǜ]rT/i~i8v^z(V+,MԽLI'ٍoXG18T~M.QV,,1eQ2-@Dyp#.LUC jSzSë:y6 ĊYM{tP\>m4a u:u {~f\[#7,fOkhWTSeqEr to>+=.N.G$팀Uo|"-B 6{Oݿ':v=?c! "pՃoNjFF]6 V d C y䡽{4K,5j۞X0ayyYGT+VիWM"2=J?q2Mn|.v8Avﱋ_r%:˿,c6,#3k"7<`:k&WU[ 'NRծy(s&TD#+:1XFuٽZ3Z=}Ր(ܤYKē't>}$7]M;Lt=s+'eyr粓wPy:RjU*|9ae*[3'\BUI$M֯Yi*a/Ayzas=uMIGGf/vmiF{SO:.[_ϕ3M<@v܅ 䣉="2KQ4 ~0* lf@/\@xoڲ.h޺KW7#gH2TtzMلP \;DsU䏹A?{N;pTWf;z(hӖޥYdh 9ȑܩK7ŇgސڍE<4;[(^_Hڶsᩈ|hB6_WGǶunm Q-uuv8"`"AKHJ4oTW6{zV`ut ? f3 ̦88ӬvV743E.`wRm} ?Q?.^"3ÌSg tԨNUrfM-EԮEC# vb/4s*tjuG|xM9@#2vctԳZܰ7oQ7AD Nj6S'˽GzCb?`K>}/UlqKĢD1g6|&W(!au=j}+苄+WRj,YRhn6҃((sF=zm eb|`|h}PLv!\dI Xzԡ86390l!ɈE$E) y Z /gd 8 E9^^|OfG4'k3k},#HQ`8LJD`'xDfb,iY$X-A"l? +i$;"`ew4|#-W^w:y ㇭ڹX"4fKÇPQo^Rz¸GA*sTLgֿLa0_: ])8eJm) n=ue}SǴ L=2'vl)b5GF=ȫy3c['`K*AÇ6+2w;Ty.}KD  ~ԩ̘0 s;"L?ȱ4iY%`wFX9';Iu٦SO>L7.MLE.,UdIw^Z6WL+XAO/[ x/]\ ޫ_ ~S%dB;~>Y|Iou_ XX7Yd?$VC֡{' ndgTH@ٙ m6ҭ0.VJ)` 8cJ^ g"XQaU 7U 1`Vn߽ONUr٠V%Sz#M'`׭N25& WtiOS,C0H}ݱ wNS9Z4MҤi\ĥ xOe\Dt$fk0tj` هM"Vw:`E>ٶ.ImDNw|EJH|C@KFğ]"֠½U:qo:#5rvy bp~#4O:-sti#9( Xh/TԘ Bc6RÆy-4rp}6ظGK bR \[9 Co&xVf&`M) kJy2 92H(@JA{((*- %ttѐ'b=xtW>tE X\ 3<7ĉDD\x"Y73I줩hi-+ q+5^N"hnH*{x˶m[CfoH=߼nC/4usD"^ \m;;gk\f3ƹ7Nb$W6^(ӟ2A XkЄ Iex6gϑ^9{Φ**Rd=S 62E :{6Q\k$4_y j\[ ?V`"S]A'2~qbŤCG+ eδ#B}0e"UD? j6@V%`u ŋtIx\.Zf_ XhBkkZDV(V֝ I$>/-˞ ,S_v9@s~[,լVПM6?%^b*\0.t:kq=O!/:wU,Gٳe' OOu^Gk_WgDž4|jW$$E 8F*^wȗ'2$0&gޠ# ߺ}z4gS - sbz8x˓0_Y@k\bottkhbиJW.'Kra1y]/^WT1*[qn۵XkR` O Qvm#1WޛsgJ,yAZǎ "Q`x\E-Sx7Y2T$k N_Ɣj7:bt A:Ͷ$~ˆklAId1Oq.-p!%N2#Eoi_ϤBi# ljo8^&l*y; b&sLL/L0vĪUul&auǷuVWou̧N9r /F۷o %<_[Pk٪ϩM_olĊ^^_fQ#l~,/^Hҋu5% :)SZG H182)_ፅm\X)bOG&2}M8Ee9]S>k״'}j,44nf[2Ŕg%`oxH6jm|T:돣I-[{-KO4ͣ6 i/Y\%רшb:ղe@tXU26{|mد *ؤeOl2tWZmElp䥪c3gI:5kS^}| ͜3H6խS!a4M0ظz.Œ 0W !U +3<$WyrBQ.Oɟo$w XgsE3a>w^ﺱM>8w b&v+WW4mÆ C&1Ҏrʌaedh+x׽$hUrp!`W?=f@)6"x̝ \E_WWQp`jz> Uw5㌀EߗMvbթ$ڿ i,N= ggN2̞7:  OX7}GCOvYx*YyIDATjU)Gg1`} Lx дWQP[qM>O"$X.VTzFxoG6u5&Urp4Y$OYK-h Kx:G[=1sA:}~T/2HZ]AN8yN~/Ӧ7Ge3Yv+//iQa::/+۾yQmԉ?G}v"5g^ԵsM(ڶy=ŋצ͋/ 걁DNtDD;v6G]աi*M-C l5j^ gu6^0Te@vjN^* ?Vu%~Κf'ooȳ:whO:zp͋=A~bv^8xN82: /{F6h4tʒ=q P{J:*7K}U*'nfדCĺ_!2y>k̜g hb3Gʨ%y`Xm0*P"lpv_z"4tB mKM#[jPˠ^z_ʺ; &"zv ;]+itF>N6կY  7nޡk7˚ X p "w)}kZL5oXKYNaqqnڰ@GIT1{z=!)^i<#Xw\ tem.V5rD5Z|_:w=] S}KQaU\7j|Fmzb &b3M+e?UG9Q U]ȯ;>m [ BTX]5+j$}q-M߰?f7vK @Oe ILTY!fi&`Gqwe)t+RΝСC:Fxz{{;ECI.S"`?E;k׮IO8qismF˗R҃*K^P(tmūB'*'N,㨎"͛J*i^BiG?n)/1Dk&s=uL?Ѣ*rVY~ eY7ɓ vrJ.w04/ ܽC >>Եq-}E'I$Q1qUJ$ EԮ%eɽAv1PCWݐwdI ( n . ZqI{  VϞhѢRR@:^wX5wRhWb`FX4Vg(3Ax‘Z&?iG^; ]o|SC#?[֝}QG 'm9[ zYHl kFhXMXuK/[4]$E?,ڜ \Xonz%3bl|{0Ŭ]wsl q묭H7vڲ;jբÇS.]YfF/]D;vDEm(XJʛ7/(P@Fe+7o%Kk#Nb, s4;(ei˖mۼz p1Co3o\~\Lp[B#nwz*"_tAw ؀GPE\:l *S9( xPDD<1 ޷GGCF .sEAV&t[Ǯ!N`)z@=OyCnB_HnɛOecה(f8J5IGlҎ\͹G_}I@xv/ XGKz/a:"`A|mU*! | I4Gxީ"hV)K:(Zjξ\}5 X(1ɅeF"x1};"` vNL =?^zƺm3SgvZPsd2L:BB :)RWf?K7+رS%2-0BzPrw4ݫ ==?Xӽ\'g@-^nY5(*X>B1bLVS,p>ab$Q{:GϖCŦO3%V5qܻ|Y^_Vk7^?@w[^wVxUTwuss{;NOSo `+>jx e=k׮ gϞ]~pp0=z4ܺuk7m,6&Qņ9 ؅d*eDJYU8 PrcWk,6|vcT :RMh׮\qsNΝዡ|͚̫ؔZn] [ÖdvVŎe@? aŎs܏s^ @ @@? O)GUӯmNQCG(HK& ]2ǻN{{{v횇U[>Q|rذaü:u*==oxK @  Sh{jyxrs@-3nAA]l]'affqkر# ր-7==M:]j50::Zs~} @Q`؀O>oȱ<55)бjU`hChM`3*+//zhmmmaΝHm^{R###൑cߜۿ @ @ k_KL7r(I M Xtxfлf&{sy+`[aZ'N}|g,kS @ @@՚ϬFSpƭ܃ @ @@%X2+W&›==… KvF:޼ys;s&_?FY @ @`نɓرOŋ>a޽+A @ @ ` @ @AuG @ @( Z @ @$& @ @6Jh  @ @ X@Tw @ @(%@ @ @@blbP @ @ @ ` @ @AuG @ @( Z @ @$& @ @6Jh  @ @ X@Tw @ @(%@ @ @@blbP @ @ @ ` @ @AuG @ @( Z @ @$& @ @@v6- @ @ZZkoy~SSXwq4Ï?.6Z @ @r.m6 W- @ @<fsdO6[=FO @ @@N؜fC- @ @TJ@[4 @ @r4j!@ @ @RJM @ @ 6P  @ @Vj:  @ @9͆Z @ @Ri0 @ @$ i6B @ @@N!@ @ @ 'lN @ @*% t  @ @9 `_(^j:IENDB`httpx-0.26.0/docs/img/httpx-help.png000066400000000000000000013103741454054354600173000ustar00rootroot00000000000000PNG  IHDR-k$BiCCPICC Profile(c``H,(aa``+) rwRR` Ĝ z>@% 0|/W_ͧ=2S= JI-N8%1V./)[l" v:NՄ9Wl $Ć vGyI6ǒ JR+J@s~AeQfzF#0R 1842 2180 1 ;@IDATx ]E{{N:deVʎ"Ȧ0(2 GGf:`$BH !Iwsn}SNUzN~c0ÿy¹l  =eK?J QfvKQ_Bٟd æ? uۓ|K.|x&;a0 gEAgA Ǽ&.!ADx8@ }n-?6_B $5hFRҿJGР5So|&/HoQoaE=Pf2C "/.!eI'ٟf?'f54L"K!V8+wP6  x ɀnpb>84*_[oTqLC!]DWOAXj!GK3+0lO*ܰqC󟂴D/tGͿ| AO?)d ,4,hTh_CPƆߚ KA[?PNrױe 7u%_+̗Imx g1‡bCW20y8 3[l(cÛm "4Xcb0jDj? HFd8Q 碓Ij68SaK}+C/_ҿ˜Px_x)Yx3ͶA" -ÙxCqJ-[oa,KvAD0ZHЪ!];Hxu"9~jIyG#tؓ-a2+CsRv_1 NO'$@"]0h O1M@*a+CG!?ҿBT5 ##5 (?!5p7Od֙6MC* Lwd/ͿwͿ5F[oͿ1<;b<*lIsד汆@;/ӊ.(\)^Ē%%uZ=EfgδĂ;+!Dz|TԒh!DF;ͯmx’^\;ȗZr'i6@O)-WİںnxҞ5vmzL.hf>h<9mU o_G'???$%%hm߶8onjZ'Z{̺I+ؑYI)ԙե:툪V[cdڿvg[?J+H6HP'o{+V,g.leR!":c{ j8ɯ~ÒٓO، 4+( f]kko:O9汿u2 1 q--fo?f&'mBUYbزHXs[6lꌃ-f_ O4?ޚ`Lw^PVI;?ZW obqKԕZyuPd*eE:[;,eO=Λ}R3?e~{^~*T/$'ϮB7ۛ7^wXϛڟ_fV5ee{nt;l ɍV[3<9/u?oJ:4ilH0D GG`#x~!4bV/E$"=-"\{.0? ?H8I,e9ta' Q0(ASc܅2 qߟ-q6Jka/(x].g]MͶ쬿G|j^=DA8BCVesV6*8|p6T 6[Njε xOb=:1?Ǯy5-aՓj,Q/_{+ݐ w57uMX܉0_U~̧&eSS7~iMF;o}`Gwq~wZ< 0BPa #hu]/"yd,,[lRI4+`凛D^kh_/4 a?e0AZԿa \D/z@f?s8o1#r}t}ì2xqjU6ڰai*H[bR8@rċ{w&v߆5vvmJ0w_>v8o}F[]8ȣl]wA[ʿ{^_M gy)R H C__?H/*fP mҿ{Zsiĉ']l|vNFp7Ȳf%?<:NY΂xL Z_[b]-7{ΐpzQPe,&ŊtxM8dvjkx:fV38IgP8UGg!_o_m?]uUϛ?y77 ̓+:Tc Nա~l|~$h_勿I@we@3 f tWÒ#>o=51[fVYg&am 4#aUV&谑.QB,W)Kn>4COW!Jt4NTYWRXhCueyܘ#=?Hy~{K<`: qBNQI7R*_Ѹ$7vAG lʔZ +MV%:+v$ܑw7%q )Lm\Ywp!9e#{N&Of|4H?g֞gIYNa]P# o71Sqfy^8x7}=m-G P鿐(`t &Szq%"k_0^*;͞Xlex 9A ?px pHy!O[g8폓mYf4V >^Y,KcAciq\"$/Aqa/ϑhlWۛwx??_?p^1P.HSOaZ~l3o_?C`GH 3NXT%K5UGBIYz@y1ϵ0dFV<к{u7dXMí'H(B*I1H\ K<Iqc={c:DpÓRƴP?-'57+CU?'m*HQFx#S'B}"9/.q# R:`M O s>竄 M8%`iF \ٮhJ~өe-wm-gx";3fz-^W7Ϳg\>;omt>cMMve4k^~+w6L[ۯ+[tiԋ%$Qv{y//blv}s|?]6wR yϝ;3pqQ|?ؖ3 `MGO[%/?n!# Q,%]g~M?W\%+^sQ*rtqVUYHq 4aQ:!U0:!H~=Oq~Q^U1Sh5/g6hO|ϖe?doj?0vc6fdûzþkhk=di8k?b8nl~.9ckG-P峢Oq>5̞yV?v?8>r8SO;ݖ=ك-"uݼNd~nF#9sg#C]s?%CkG?svfТ$%$?__?>k!Kg?[q#@9+3?zu-!vs>u2pN!&DQ/̓,3-=ﹺ#,{TԪ[]-f,Dq=;@ׇ X(!7mJceOwS987>4Q5Lf|qqueχ#F̢ 6;m~Y{ƌCh?|W .WlwpAth-LQȟg7yHA8ؠGWދW&[ڝ3TC9G0/w@\ ^YO)>DQ-A8 3.s5َ6`udd aiBII?q;GilWH𨖹s3lΜv!`?۞ySN=]vf ;#lmsf8.2;ȣ#rz֭[gmmq69/cbK1k׮zvX%~HSLbO?WWC=kV ඁg.Ll _vg"L/o/ Ge D0e f&#>7$eI$Ou^x3ϟC$IxtN%ă/I:B*fKH_πӍnm ~a^^?A56 ^ۘms3ѵc2%6h>9_aL3r>CGY̓yV>?L|/j?X@ixl ~_38e_r0/-w)A>0,@ {:|P.K|SG˅ރheg?k͝=3쨣O;5^{mס̦MnSy|<ΦOT++-k7m4Kq46uMxO/O`.R;ٌ3lv .H<3x^ΝwYt"?]w gpï|OO姭Kh6I떷-g/B$Lj Clc|̐_e|WSA>jeCx%lLSҿ7l 1nl@x_<-ZYۈ️+l.(N (^v>q֙p>ydr77V4w͟7?=/9Ӡυo?D?tS&^mOOOO"]AFD_O-?HiO)mf?Abe06k㡼c!OϛI?$Ĩ 0J' W?~NtQ~Ɔ|r4 p&MnÎfyXҖyV>'O70*l_OOrRׇa8tPG?VVkWW@ID[ NsxZ%putG Lكy3}pF=;9aoVkUQQiUU6a]ΐ/+ͺ1X/ ۮMd WVV?Þ9tq4k>J2_/0-$$$$$5hҿh?puS}Q*J%OC4F' ь˝ZXi[n {wxE5{2: eOx> ~>8Dhei=&Lőp 3fsǂ(Iylb:P9^IgUyt{+JEfV~|̆QG ?????4jC5S¼^\|DKz.|i*6Agx%VH L>[)+GSYOosypUlSc^U}̿SI8Wg$?<:.Ku0qx l$d< CȺ6J|NwƳNy6aouA )D1-4S (o *bvxF }-F~,F!}ܰq[^yw{.ʯYxp^ ?TgBQWS1>i1#ԿIh#B25O韣Կh旜_bF>ç!x7ݒ9:~p~L˩*W21Ҕ/"ӡħL#jH.@㱱?A2Ny3Wx/DZט<|?uװuf^bi&\g۸qL&mRP~TƋ/`߃HpoZ4ohѰJńb{5Ug'q>HOQtD/?GRHO'k,+cxѭJp<__y1_pG/RA15)'@XZisha>2p+>i ?pegϊ.|jnBJcTϳԃsSk.&.~E ix0D1ܴ,W5yyc`͢*fLюs찺X˦fϿFezQգޞסul'>@凩/+kGU>dwgh c#+G1r ?y_ֿ2_ J=:W rDiC0<q%H?$kbG'ø- br)teb_j;#{nFfussV²?BQcI_CKjҿ4JK%\?7VC'D?6pO#E>sI߳+;k05qLk(yRִwXBUP"x\&]O5K.0cBQxqS7?|{',ߩ?7/Z& W9pdWteU#9Ek3ù#iY;{)!`?[B T?*?~?GV _$r@KA 0HHHJGcק\?(8Ʉ):pFt)\Gp&zDGд.%Q0,9_UgQ vFEs5}ʫLo|r*sV,HW#}/ͼń؞$B_.!ƟV MIb僆J~Qd(EaʍT?+Rô"({K0;XaM`Yl$|ÞaxgeOefyC)9{`UNeϱƍX߼xU#Ƶ̃y1O/1e]> V:@Xį5W9.IkmlYu9{=~;-ek~iT |WS0;Wwt?4hw8t Vp4>sb0\Nt(C;vЖkG,AfA{- I?G>t3_7-{v6Mc"OyC=l+W(^[x~.Yb/~-m|I_~_[KsK)Xn{qa!-9퐅 B@@9i/G[IQSSc/68J}%X?=ͿS/Z0?gBA݃g_3ysNeJE)A|1uW c ig554:,mu14bhfW7~4xQcڒ XE9JBqE,':Պuc6ik\b&f]+E2죊<[Վ$O6>c)Kǝ@J~|~NkdTlNcz?|fmh_勿ڟ__R8`bmܜCӑ P?ADr]:d*$2xxT`_W^ W,o!\)̳+0gG9y$*ū$ʑ0Vz'Hzs틕;KKxVbCq .vq^~M=k;L:ZPWbRWU8t<6eT?o^Hd"ix566س>k˖-c?a?<֮}J!pB{kK/ۓO=i,]b 6ڼR%v޹N;f<'?uyvїh5~ϓjk^Cx$D>PؤSl+%Bu€4ctտ~͝jeOX\_im>i?eGz+?ӈ}KY_xΚ~6Lk߸ZwZ8w$Q^/V7NDuSEαJ}9'O_CqL2)C_eg gIVX$B ;\{ R?o?83_Ū;|y8gd95NbÏARpbϼqHO #.h8<=FBCr,1 (?SRʸc}0'#ۄ?%Nl_p?/^li8a9 nF(*o8|}VZx^nF{vs؈{;w}Xs~of~ǟxMw'lKWbɒ%~A13ti,qw+6tHϚ7)[fTUXUeeX $z0p)Է:,p9rx-r] +_}?i&FUxR1V5h(Kg-m69eʁ}e'V~"ExYja{}nѦ,QWjH2YYԯ ]vH3>j;: ]__H*3?b?nH1R/_?۱+lyVQUnE:{<ƺ=܉ g:._=&JĔ OYq.0rdG5[igXeEE?fdJA%k51ǖ6J5oyaWa#V)SX)<,ez /\5W`/d`2 W)K1?X?ͺg(?#@BBV3$%5hW%Y?_E!GòaP%x_Eg֬gWWXbۖhiqgXf],>3**ΰ1?jd V_ `q4 3/zSjNh!k{?O>؇}w>'C"7lX06 .:S{VE˄EOh_̀LOB \vJK4h!ҿ 2T'?(14Ϳ4w}:__lZ}9c _ަ!LR4H/?Z#ҿe6l?}AB{jUxY]x n5Q]:R1$yb4+x/;]x 3[a '*_F7(T1N{[IOGW_ҿR.֞k64i=nYsg^ ڂ=pcDG-?_1"7+B?&Xب#dMG9x{@k0_ 6??)XRHI 5dr&a?NiۍCW4[odI渡FײzH-; ⾁i!?ZGQsK/FZE|/?RdQBG(HVt3*Jy"]'.sb$^m\)v*?dq̨U1CFSu*$b8N&>njPI4HJMĝ$8FHhKY7x`(x nj͡`H@3(t=F_q}Ѡ1'`cFE|_8 ? yKbh m#*IpL|= hm"$}1_4h(Z H_d.ZAZz?V!ytQaĜ 0Wt.ϓ_/J?Ec?I mv17]R/?wa-f=Fٿ Ϳ5A_ s ٟdI'ٟd̩ڤeTEtp:$ۀdS&m-aIT<۹)C:/lw]Ua9P( " " " " " " " " " " " " " " " 9lj," " " " " " " " " " " " " " " r(P@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@?r>3XD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@ J  \uU=u " " " " " " " " " " " " " " " "ϿC+JQ? '`/,Ad֭^D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D` ~W12'Md~IUUp.UکS??[2Q始[syٱi]tuuuy^" " " " " " " " " " " " " " "@vu]cwqlŶb [|⋅sc1cqm{{?#*\m6 !9R)`GS6{-r{FeX͂RƜ%\b]vY!)SҥK `qEpc]z-;cBx[ K~ȃ>hzx;蠃jX>B~3OG?+Wov.5kۓO>YG3fl'|r!=ꨣL^m)++/}K /?owy3*9O?yq,ϸWR !Aǃ˿ vUWO<1.noy!L`7||q`555UHA+8i!L'ޏ|1|/6{w+*j?~z©NK.)]v'X+S\}V[[cy/F~bF'O7qv͝vovU~h?#-[׉(>{-vS#w__iscGĎ L?sC\Ί+ܩaڴiq{vihllT*#nGyĎ;*>ۮ70FQ|ׯ)S3^.=q=~ط-OGgŎ8{Wzn= tƉ7r=9~c[%_=N瞟qq9s 1c~"E@D@D@D@D@D@D@D@D@D@D@D@D@D@)<>J䳟r>o,)))8~ZN9}]v?;0c_wf[\2Vg}ѶtR?|-$M$~(@:;?K/.Bkn{50CVt˗E]dqq*(F`gkMea ﭷj>;V{G̚5}d9\yϷ7|G^|FVQQQ|h7n,O05k U>ˡRzokW^y{z!bgӶl27Q8}hHEy⩧3XSHunu?4Sh{cm(;q$0,փ\gG=v1ELy@{E|ǾN _-iٳHG-ZN>83:lm}kEʧ"#m?{Wq6vl L6wܭ1 lJKKK* \SO?tLr/ 񾯴Zܒ%KZŎ,vI'80;W_}6f6x?Ʋg=Gq\Y?}GWohjj*N6a:wV4iM^ !cO콺ʕ+{')nvWEr 7ء::,4*փv975ᴟq23ɱUEEEm WVVf|d|*[Vt}}=#ƣ{ow}q^]q]wX[[&Md|H?֯_o`a EaÆB\}+^o|c>_qtVs﫯 *SO=c=}g>͜91>~Pee Νv4/?%/ޏ磰A_쵾ꪫ cEA2ٽHHEv!Qo/bS1Ps= _|pȇr!} _tM[utꨩst\?[oծjχtR^Yk:A}~>O -!:C{={vF~Kq" " " " " " " " " " " " " " دw=:z7n+OЩo7<{t({o{衇ilۍ+_pkii0Q.thµkqgse2ާnf{뭷8W1V0;pO|.\X8կ~^~qq.ŋ?p mϫjGu;?[f̀N%mt63|u;O *Oa哟w_{׆ö+'Mzy7Q"v&j͇Wk4@m?ӛ; |غFq-أ>jlm" " " " " " " " " " " " " " " " [?f͚_c(" " " " " " " " " " " " " " " "P ,xN oڴnݺm޶F@g[DTz(*SI" " " " " " " " " " " " " " " " cI@}KKD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@29le*ND@D@D@D@D@D@D@D@D@D@D@D@D@D@D@ƒ?ƒL@[$P2)/())J++-e,i4^YL.oe3T%Ʉ*+Ti哥֙N[gGe2]CG E@D@D@D@D@D@D@= Tim ]F" " " " " " " " :d*e,?R5VV5r nmpᆆĊrXg꩖,?XI"m.khm"" " " " " " "0Zc8VD@D@D@D@D@D@D@ƀ@MU2kkiGºi첿}-Ѽvxn}:3VV6e|K`{XnEs&tVVRa? XE@D@D@D@D@D@D`" mPUD@D@D@D@D@D@D@xK`6ZܦY`ճvd.V?X^_(Dky-MR$^Š"{jGhى-Znˁ?[&M^D@D@D@D@D@D@D`;$ CSE@D@D@D@D@D@D@o 6#_R#I[E:ˮn|u%gd?y+y_xf͛g555FǏ5k͛mĉ6k,w iJ"?o]m,=&|,8TXzmֲӖj"-GJKK~S T8{u" " " " " " " /ٝ:;;6nh?ߚp{W]~vZK0_,{ʕ_zL9ӽz566z}{׉{ge˖C}ݷ{}i{ﵒ#ğg?t"y״mvw[`ټe,] K9_mu[ V )HuDUUVX)R|6cv]`ujp9寬S,*K7d+fo=ksO{d}l~vaVVV SLۯp8pTWymܹ{̙3}%d2i}w,X0&0/nXuWΘ4i^^|E;7,30as1WWqK_>36m#Бeoh9kظ,DY.W3@g!gU:GGkE+)8lf:&wϷɧ[cuSa~7Y + g nGYW" " " " " " "-| ruWC7j•6zowMa<fNbK.81ʈ\.gͭlSdϲklj$,9rytd#Gٔ[+j6/ӦNI2Ѧf +lee92i{>e ++5Vr*RyknC6@ϵM{QE@D@D@D@D@D@D@FA^?vءRȥ^EΟԧ___{ihh3f:իh~o}[h"Wbv 'O$vUWnVוW^i7$e]GG0{W:n|ޚ,UK$S_o3Y l {X$aƜ{e?`<ղ.;[\Z /-<Ҟ\Y7@yVt`6흀?OP1"ЂljK*2Nqw>6m4&7pbXvvmg>cE:j= GK.-D~2]KvuZI<ڦԺ޲VRdz$*΄4g)|bKxvgm2W6n ֶ;x,-|cֺp]9X]/lstuXK'j&[s5{WK$tϛe9Ox}4arLe̚gS&" " " " " " ".! w:+Wn`…=⮾j[bE8cVzoof˗/=m*JQB[U!" " " " " " "h x',ZڶxUݴ~>o鷿m_g/l|<8f<V|6X9ARyF9Jvp9[1xLL܊| V`z^˰/[i5 f ֺG#" " " " " " "01|cxGeewBPpMMyxx{Ƿgc=fO?taF珎4ԛq/%|OsCQ-ixq# ' +kVyt+goKWY2 ׏*+w%pAz^-1s։8MD@D@D@D@D@D@DA@Qw!" " " " " " )]vcŌ&;裷u9眳E|N;… ;T5l.gN+k~۪{_E>|I'!@hWATt vTUew k]Ďm-(_QNB}3:ܖp$\̙3g|g.ĔIeWf1Rdh:{lI$xv#yңdcHtӾoHa\ڞ+K>bQ@@@@p%g   ŋ]vAj74o\Zj%d6ll޼9iUBnOOO[n%䶺ljfofoiFvzbIe#Qd()1/3}KeS#1F*KcyLh*-[KyeL}HiWR~oI2 *,ɢǣ    @sn    ZD l߾=Ua ihdР+B(+V{Gu3&vp 7HNl:Rڵ iҬazHE )IyO*z ^"%> IiF b[bioږ*sLS"-N'iVq!g"uN   +`~AA@@@%h"3g,]T/_ne(-5.jPzj[%''ԩSeܸqն))ɒ,Q|R!%RR*rLf oenɫ4fQQ\(KHrrYE[)%KL33d!ܴ5A#11 JVDR̔2{;|G@@@( G\   {&oʴi>uIM?;<XҦ2d)=.@@@ :r    PI{AL"/,^8hۈ#OtL3S %R̔.f3eKnh -CJeeٹ3K .V}h;-6ǘ-^vIH!   > csh@@@6mt^^yn)hVh"U_X&e[V.)R,>237K 0bzW &wdʲ [elٕZJ߮fӦj3A! D*J˥S/&2    Fs)9@@@'p]wI̓6_fkO? jӿ˃#YQVR*qqS!MĚZJٺ%]˿RSEsV-R3KE.)YeZ?*4#>IKҲ%96^ۑ"   @1g[nsJ    =ؘXiRRbD:JKvIANKb/eR)X0Ur6r#wNIelt$fI٦/o<HE#v#   c    Аb2,)^|eRi2ĦMJe0sVuWVIR,Iev)dY+%&|DM@@@hX4    bcbYdI43h@GLeIIֱL;GЙƙ}Z$HJ|?UJ )Mb97*@@@@+xJ1N@@@h<&$Ƽt.& (3Ӽz S~1fr|&rpd#   y?< 9@@@@@@@h&(@@@@@@@@x1n@@@@@@@@m       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<       =       xX_<   @cHKKz7!\d@@h,9I@@@h2{l1bdddȨQdŊ 8/p%Xn3-))JBmEa&;vWþ+Rf͚MluQ"uaN   @ mW    4kL;8N?t_S"#ЦMǸ^Fft| @ZtoSԘj{m;nKbcc'O?4oze+^{vmΨZn-/vk?ި+!  ^ KW"  @HÇK: _oܸ1>T"w%27p{A1B{1c;w:¶m۬Hc~;?4`W^2~xkx++ѴiDpUeeeٓ좁+*|."%I?   7uc   ,i5n@(((}9]a~BWVVʎ;7|#<NSꫯ:,    Xh,WD@@ 详O<ĐgA!:,ɲRdggpbbbK.ҽ{wчK,=14@ЇEEE{|ʑvRnD3%]V6l >^aGصkxhm~>;u$W5kP/\}rZ{lw?!!Ao. %33ӳW$ھ= @@@z 9  DV@!HKKs:知!CEu,T%C}|mYZ㩨oVYh3P OPSwUV_o]III_K&MMyyyrYgY#ێ9Rxky9ѾгgOdذa?Рĺ:̜r)iӦS[g,z-kJ 8eҥrˤI_~R\\,G}= 8r>#CڶrVc]uQڶm+ؿѣ_~ T~7 p>+gT/ R׽Zu9x;ײ~ڵkP/\_:~.>}J   @TF@@v/Gg}tI2{:= 0ѣuth;f8ꨣd֬YVHFFv{EE>sLԡJ޽ߖ;:_w |ku_z%9SEO좙D|I+8F-[& .7[w؁+;vti:*|c+ \QsW3U g=f4]wA>}l1Z'O@me f:ӭ $w"f pg~g&UVAu*t7|@IDATL2EB;z >\+`_=H_P.F$@@N fzyLu&+SgvLCہ=w 'X6|sqmذ!LPFz}fzm^|f: O233ڹ-ܲ&d_ͲoΝθ}aW1>njs4^w=O᜻muVW\Pio cdNM66v߶u]?!sl7.&CO?wy^Cw;L3Nm׶cvyڴixa}f*s È#u5 lSb fc,?>3͑FhrkF~Ǜ:u SqwLpJ6L_&(}k>.7X߃=EmP/rlƍ>3}?:0PvfEVjzκ66g @\]G]?yȭ_&;C9yiFMvYw]ݲ׃?6msu٥^wo<~Fm_4Da]~o{{{{{{{{{{KӾEA@@o viͯZ;w{ l^:°aÜb2385]}hx'ZSR+&FLPHm҈#t/Yw/H&HJӭAon\ + 4k*}Dza}w]tpQmN#m߇@@@q Ѹ7g  @0CuG>m6oEjɓ'ۛ],4"U ~Ǐ#G銙K.!?#<"; :KD9R ^ZtucnL)2{l{y=zlR*++dpu3tMyꩧu//>󰧢 jӧOmuCm{rŋeaۣy^# UL K3Q3Y_4xYB}zՑq#   @G4\ƀ  {,QZZwu?ڷo/~|{|=ݡXx≐v Zڙib  ~?CfO?96`ds{z~yfٵ)u]m}ِDKzt;kv|yI۶mpC-3+Tno{Nb#TUQQ@/5筷ޒ3g[]3_f{Rcm߇xG@@s?܌=@@@ PΝ@עE QjxXWt~  KjR4IUO жg}R4.k֬.+iq;W d1i}5.P=p_溻az^{M^|Eɱ2 yC.Hs[#  vVCG@@%ЬY39c'|Y/P.0رceӦM{5>G Cy嗭irssWUzzz= Cꫯ;ӪFrJgU}4sںs*YhCdֺuk;D47a@@v? 1>@@,vYlhP;nf%+ ,:iڴiGʁȑ#eҥNݩ*z]z^k:0`hVwiٲ>{ YO<Ġ{P9shQ {#.ЀPEwϩdQ }on_bz=ھܐu񽡟K/Tڵk>   @ A\FN@@#/@.07 N233q*hR^|EgD]Afs셶mʭje1cƈ{Z3fk&:u_,._cWCC8T+~{5jTVY&OC>Hԛ󫋤_ǵ\u9O>Y>ÐN7o \G{{9СP>rZ̚5˯ +Wl۶+'.:%S 9;EB}y"S}w/bre@@@^?Ə  K@Ν@jj vТS=i/ $h>>묳F0bYd|gO?ImZoO7>}EtMm㥗^4DC>hٱcνjy9X՚A>z֌ zmsh6.]X]?Xc>蠃 =?wfK$ܛhϳ>kvϸqdȐ!RVVIo#<9mlmݺYw/#ȦMiP{ 7om{mYU||V jժ\p}ghwQx@N;4{P%==^ }3f?~|,7A~H_كJEuֽp6 x?/s/_tꩧf \Q+ P۩mR5uWQU #ھN!^y0#   B@?q8-N@@hC9DufMkaYnY&dF}ZЩӚ-BIzɱn^4hL:5NQE̶kNU%ڜe<@vIJJI.\(=D޶{;v>_ k.ES=i:X3اW{QGh <׽)yƌ#=z^߉p:   ?p#   YeC4;f(Ѣi@@@@,/ rn   @xeҥ2i$E>uT'C@۲    @C GC    ЀfΜ)#G0//Ϛm۶Yp ҵkWG@hMT    @o)!  4@UfdȐ!˩t-dddyG˄E@@@@+gN{z   @C裏d͚5}~7nG}T&N(ׯwob@@@@+/ rb   @hڴҽ{wIII~ll'Ι!    B(T!       ^@'        @&         3"       P       xF\*        lB         ?EoSu["     xZO_|۶mg#8BZh!۶mO>D?AF(eµ{|ˮL3 vhj)X\|%AkETHbtIlQMj"۶H )1RQtZwt/AUyflG@@@@@@&L.:EɓÞ裏O2E>m:t:djjtؑGa.=};Y Mbbb0_B2x8脻L$iǞ &[d(!9]~4]zzy^bB|͘OeIl$IJEAAqRz7!V_R)ڰ^Vr˂{"&>VCtmqQq} *\ ~]!&A=ojnkdg)޴Ar/%76/!ÂkZguսl|a퍏~.Z8p2Cadm!Tԃ.'Jr6~EV we@@@@@@ x*R{[EEEִݶs[Ymڵ9sXHJJڵK+5jD=:h#iԱ$nm|ң^H6 f-1qqd$IZIrr> kij^mO9C~MRe. HNObLvoC;WPrl&.iG'=nCb⃿ҵ.;n0@ػSZxeciҥWۓ~͛'q{|WiMG?{'H! yl ԩX) $]-/=N\Jz\rrz*@@@@@@@†{>Щd ⌢M6r)85]T?5="'3?Y)=kӟKYvF[=6Hz|PM%/Mvu/-l%l.ƫLͦjM5ۇNVMU6sti)n*i-.5wQ++ lw旲L{.|4pc׻S䞽ㅗ;3<%Œ`Y4xiBꕲ)~_]@XA@@@@@| o ,|y؝vԱfPǛ`x . 5Kv-̫yHNjY@~9czl3Y"&#dwIIڞzru, IhУQA]8Hz NWidv9ByN{z_>~ 뮿;u?" iB]43S4;p[}]WG;CfxYm|巳Ky}YA@@@@@ht?nt #@ 읒۲|8)=p=;S.H?/Kyvi5l$&9U.l)X~ltW%U?u_yWҧf._~tmb5 @@@@@@49NIOOɘöILLJDęi ZuڵwqyhѢVN[|jG)))r1u]'r3yٲbСr 7Ȕ)SdѢSPF@l.yBk̃PT9yT2?묻}Yk*-B'HѺ5.p*h.}4#mȰ=>ĶΕ@(       i_4ϗ믿^ttVw=bV‘G):t RXX(YYYӕֲngذaҹsgꧬSNM6JN?W_mn矻\ꪫ{ عs\ve2o_Wsm|衇 ?^,XPGGnO:$1ckUdܹg&$$d…V ƍmM4ŋK=nǯ*Ç-[8}5Jz)iժ_a̔c 1~Mt5f]YUCX7 ګ83ՉNѡ0|:ʾٹG9 ׂfY۶ju~jQŒm[${Ok&]{|}в}t: `iLͤ3T̜!%5ޟ      {zj0Z׼ys9DKT1}t+"T_A!\yXkEǎj_-[̙3LNcB޽ߖ;S}QזЋ`Y5<)e|hPE}'|{O?YͦM&#FN:9lqiR̚5Kx≈Ӿ}{ї]RSSE4lg>x`E֯_/fzw}WnFhٳg/&BIf͜vTAI_SW pyc%.s%sc!4UfUD{޴;L 6|EDS\BasYBi{֦VϮܵ}ynu u:ZNI.f)a32[NGRz{}CwKmS      @5Ckh}K~~P^3tbcKssseٲeVЇ>xw?t |k.**KZ"ڏNR] XvA>l+E3Mu]VȺuRǮ%&e ?!'|t!jn4H>\UFo>⋭*FU] bnׂ9s#c9\G};14$@mSiv~i=oʄ iLeeViޞкMmm:tr6l,GB],B|4:珕yv&%~Ej޴O?sÒg56       aʼn' $tMrwfЬAK/u.~~:U%\bM}*vl z5}fo8{VMqe3gunCK*;vv7|snWo}_lݺ xSӡim{_'jƑ .f'8^xCOhͬ(o)$p qr]>G^zC:_~_Eך)C :}׌]<-}"e6{\e EZIhQS)ڽ\Quݵ3gnNb붒~zu %2d}Ke`xǍwH{I&BA@@@@@@`O5Grr3>]=BPVfxVի.w*++3ΐtwĉUVUW]%=.P0q=jco~W4ȢE_״^uzI@N=Tk& ͖ۺvjM<+=_[]9묳4;q@+|5E_3<~-tj LZfUe3f|AM'}YyWUu\L%۶ʦo0[8Ƙq`ɞ?OKOfmxm:D&QUc43Fu#vfSJC$ob)\YY^))Nݹ_ޕ QS]; _C~=/ߙ#[ɄS\h      kǼy)Dyy7ߔ׌;wv.ݴiӤ6:tPa}(_>Xzmw#?_A.M̃6mHff4l۶M^{x0ziKpzZ43}"oB.GJ= -hSO8kO;_|vmDU~I&MTUmY&)q#A{=YL--Y}OZtoA ZHLl}JϿ*Dݠa 12I;iN ${)fM&gp/ԥbKIa-Kξ@6G-odqyՒ6gXa9X n%N,      4JzL-[o?ygϖ3gŋgy]}mȑ#>PtԩFE, ]tRm},x~Ѹ3Ǩx4C:}]ttzw4QGޮSiLqqFA[7k{xQ^^ad}A #Me+A e;ö2Թ3L~4+T)XB=t_ȩtBWuuwSon"k0\yDI_AYuǍfJB@@@@@@B ϽU /*eeeV`=mV+}cС>}~K,YR!ټy):um2|f,qۢuYyi& ,3G_C5#_ve!fhG1rKoH˯A*ٲIVY$7BxUg]k^uibwM.$7dsd3Ky~^ [Ҏ c=Ue;NRUqo/1 5-;!+nZJ6et}֮>|ܙ>bH|~,|l5C4@.MW`      @Xj3}znog5T@ner9_/x.r!2w\1ch ]ڷostrDT|'09@ twoݫauJpk8{Lkv;C *~z{ΓG}T4Ȥ.Jry*>ކ'58~ϻN@ w}$-}.M:w5f/[g⮮e;WT ݮ%4}@_"H$NPYf(iߧoIH-RCǻzʩ_|*koyn JwhK< ,:}K#ڜxfm}7k/["~fW?!>I@@@@@@F#Sa/?tzpEJt}}r[Sf4iafRi7nZhOWUmuT5I`ƐcʦMt[_T?4)T (O?Uh2sV`SNNNvPr|+x"10ŐiR~l|qaU3;˽cjWgаY&KʆN=-Cڟw3)5SK1A-tOغMC旞O?&@nIh{BV67R3^ ^n/Yrg*mჭ/ Jjy5h;KYjPW>}{;      4j}q,>ܹ93_ ,X W\qO|Aѩa۝;:}pW2Ԥt6m_?+_ՠAWڔkk7&)D={ շ]wwڋ{VV55SaeΜ9ҴiSwurn䥗^ ֲPl򟗥" cvܭw{yI=АG( o;)&>Aۤ۫λ#TW֮65MHWNx huB~h7M\zd}^~OCNӤkwIiϩl + *69 -~XA@@@@@@wj?]t r xsMq͚uQi:+       T O{zݦZo'T揍7ZA:NYG|fwqgHKK|'ˇ~2PyN;]pShЉ r衇G}~x4_t֬#/9uB۶m[o VT}w?.5ʓ;wPSL:  \r7N."+FF~>2e̜93pt-z=E7~xws%???h}'w\P}+jc?sg%!/)P`ؤߦek\]{KPeK$THPCSQYR,O=jt5S]DI'ˀHɷJӤZЇ=v§xW]/MLwI2L8שY8_*v9 y|4)e;:UTR?Ô@@@@@@~NbݺudZ8ywUVYcǎ]wgxꩧBvO:$rJ+kfٺuhB8 9ݿ\@ZS؁$0dk)8XEj旞-Fe޷=Ls5渦eۯYU:5ɠ.;y$]Kbz{{zﶩV]G[gb:;k!P_%۷JIѺ5ֵ*Ͱ+u}]|\ݱ      #PmoiAܴi<#V h / [ 8P~g{avtYe ~-Z<<_K۽ҳgOkw *Zj[4HpL'^/7pҪU+WMKi;('hr˫l^{-hz =zN S̚5K4(n p"TtwmD_JgYUUc%. gp/awĘ`)}42?x peVUΦ7;>3e˜h^HtĥbolK!?˧,+Sv3V5) lZvTe#6"      `E6ole,Je?,sCG{ҡYrW^ڮ:uNt\yN,YlCtwSkyΜ9"h^xA*Y^z=dƌR\\ԻtLmhPӄsT?U_3hƛ^zɯ\rJJ/_o*͊fiA Kƞ-[IyAfn7JC앷Lk\í&G׶o)O@IDAT]W4@_R3S6Zi-WCJEϱtv)7Seo,\|<#tl2#T0kʴjU*kio4ف@}񘩁=:^ ~Hgΐ7]m <7@@@@@@PoO(tZ?ʤѡCk歷޲kҗN}S*ڵkY=tj$3pB PU)zNڟhLkc9Fg4 A6hpHUE3Xr!ҭ[7k 67Mf3fCtGU57Zi5iPd駟ʼyj|-Ƣ:^4ue˖-A/}rB| iqI]tj }x_e~5]JyN`7~hǫv/~u5YILԾJkUfMҟpRpm'69E7Mv-E)ߕcMTS/Z!{l)ͽ_+       G`?ʩkN.C}䤓NV5P+*C  B b3kˆ@@@@wpSLJ*H!~ػXφ YN9ٻXb9ųr_ l=F'f=gwϼ^l2IީO73  -0k4m뮻̃>>b׷I&.?4޶bCU̖O&w-'NӲ?_&3S,OteC[Mд;j.Cn|D"$@@@@@@%Pg?իgZk-sכ/cرf^w-{챇С4h q ԫ_ߤ+oj7kmŴ}ٮ+      P;u6&QԢE N;y8sʔ)O>f}y駟^v\|F?ߜzf̙I^B[[ocZ$5l,HOM͒_K&, @Xc5̀LٳyW+Xˁ-[+V .̚5bֽZVj76oڷoo͛g{Gys5lclC6moo:vhƎkFm-ZիWϬzSNsΦiӦf櫯2&M2˖-+?&FTԩS*^A W(.+'7*b@Y^bjyY7b-̘1c UW]5i\9~Yti09^k׮ދ(w7kuixIX~StY4ysLMKۘ.nk,_n̜a&yeXzG˶5˗%?0n,jYf?blX)Y,=L}hiaGZz 9o0SݑZ^YƦ*x۴tO{n3|4mۛuO;4^m"O]JSMMY43&%r-fۛz%}YaV$DcfYlh߿9C׼?oF /=_fxǽ.\=#9/4Æ 3_up꫍AܿSt;~#ves-saIz~իWN3{lAvai/oz8gw'N2_|E`_tv]UN6_|^zɨW=~h@CՒ UIװ_~95]~n̠A{͒%K9>QŮO^K{,3*Fa.ⴓ^t}:s.'+8C|y}PQ^a? @]H.I [6V@۶mO?8SІ9rݻwo[mn*1*ML65-L JY6;nV&<ؠϟ0@MFMdif8ZZk׶i?heV%tfof'j4*yy$4E[o+L 54Ew1x̢I5l4:P4h4Xg]d#Zaf3n5&b#{jHgKsы#8|E=>`̆7e&tS~ ~[;qﱏߤx&ּO0{/ [nJ S_&I+ BRRM?R>|CZTk^ğ~So٘-\vex$__T^-~ن3asXD]bw(UxjuR@RNa󧻮>fĉ^ c n+yŋ͂ wޏ{챦Yf˶wWOq:d?g٥6`pdKjuM^y5?ᣖ?./b7_mGqr s?@ xCr@ZoC &fůlh C-d%.wVfr]fӏmVOT얧&O}=n_&Yܛlw)-~(.3FksiI7lܬuaf}w'~ީfټj5m{1 $mv}o3k+Y"ӧOTx/f~˓B DV@n^/j}M Qm)SS݈j:T+Ke2w߽zwS Nn+q^ tbN>ds^FZ]: uã_}U/"s{W[m5+)8#<2);SmE0r_A|㜿ʧVKj#]u몺1y\7Atߺvm7"]kE1u(٨ey d̰ Y8C>U}9ܤeڤX0p~ᣀ:P%|S.<->9,o!D#@G4@ (ն;97vk`EǯSx[ڄ=VCKNx]:>/C=iڡiIG35K2YaLO1Ʒ L 4Y̬D0*N@hUs' T~mY}׫[q #Tjī&Za!KڄSVs)St5jy7͠AUUac=Wj&V7{z7|W0HYr4tД|oZGuL+hVww5-,zWѣ͟'ZtZc1>|߂b4՜>*`O>r_qB?}O,P}0S\3 Pkw/]-*)iӦ^ƪ}tG:׋/~u3(߹sg/Bk1<j6Ӫ%T[7NkR-;O<ѫ֍G.y*?hP;veئ vҦ._b[eƾ,iŒ%f/&|CDmv~^' Wi4|h#@ dذao4 WCkժUɳu߳QYgiKjQEωQJO;x+vM>=cףOzҶ{IDZ Ul*yuf7n>=~ܼ9jyy:SVU-U~$MėX}Q|wާIȏrXjX|u?Wa)]aXشŎ ~j?Z?ۧg=#!}0|?4q(wyoy5CAEfF"?TOx_`@Mͪe~=ʬX0i/ƚ%?M7l4^C4j|-̂> Q PGڤN{^0<_}׍jTAjSyU.]դoԩS,U$ĀqUX/ܦt)r:(`6JYAFoQf9'ȶ=o9䩧2n/{UW a) |BK/{j޼j}^P{wq PPq׮]}cT/?f:/9bbϋ8wi_y[>r='NhFVlU̯[ow]fm@n3̍77Nur[j7C UG .E]w}tvh}wnWX lHƒx " X,e}VMt쨵25j=Yܤg"~ڨR/Ij_bZ9rg3'IHB{^D}MS(h3Q@S時?9~–[̸n CIǮ̯̓{Ħ_vZp>M:li?2%~)x:;o1Ow}g'3t+Y$\=L:w6쳏Qm)x]}\\歿)}]/xTvUa D}mɁ}9K5]\>3f[3JXض߸R>ǷW?ݸٯDø2GmXǒDz^ǝ&la@%?rpljz֭ lR!W_mͧf;UQn+E/TU.aI/BՋ?]s5kh}^HY3C77l|sFfh)X'TY;tд[ P^{kJM~UW]LJK^Ey(`.7bW/lR : T>E;ZSI\u f l>Qj= uLDM:e5~(xW5pmNԽB>ӽ`c[}NfZe-Ѫ,Zhal~Ǵya(΋b6^+mE_)@G-(ؿgϞf 6=i\ORfE~{ANȿ /CUR9!}gV~O@A6Rs~7~Zm~ uЦ^x~~m„H2s3E8uUФm ^WnW<>3?CHu[ `.\r/iQ`Zx㍽WENε++7y>9՞1 @mT}ǜWN%E'YMӫ+`RV~>Tp2Zհ-MW7=SMӦMIӸENz1mպ`-"M"j!䠃ZPЇN@ռ&(@P5R ZR/8}ߛoih"ؕI>mκf{2˲ys¯&y,<18FѦfS`}amS05jZpT԰y悃|GPkjS]٤Zj3<(hCI?^j AjH{&Ι3$]zPAr0{ۺGB7JPl?nfx-ahm\>h/A^͜2@1 8|tgɓ'{]YzVTM\%i6i/ 8#ZQ=eh3gL y[1Q,?8$=%` %̄ ߋ9~L"P|,嶖BL-;i5it?IQ$$ѿYPV3z^VfpEe.+۶MRS}^jZ r0  @aUhˠn?>Ô'w.YRI/zSwVFb\M67Kg,Y^@laiYFgXZsԂH>i uy4o~e*H@~ݟՙ[W^}>~Vli* Pᷭ-R *@T[jXρaItI9Qg]͊ϟ?۰Z15~vAN=SD}. 8}T=lB *hk?`7[/-Ak^z>;o=+7y[1Q,?8 ~{jYu ԤB\e[뮦WZq[f%MSN-tm 螒su}%$RYf^-/g5~OT#iwq絘vWc[-o\yJ\ʩ*T _?"};{ne&=CER.|sXu-ٿa\r>މf8`5.RGny,km.7>{(}0s. &PS-LtUa _%E۫`㣏>2~ɼ^{W_nR LM{ӖpT>Q4)Ya@5Ea`BW:ڨCTkN/2UKU/{/7/F5 Т~_*î_6|& z5)p%,$7On[|Rr'"@ t=tzI-Ҩa =+X?%Z_qjvB_-k\kq_n z54.?(]^j3DGA6ۘM9̎S7>61k~w?5Cl ]vۤr;/u/v8upw?:T;TSrjIF|6+tKi}ߔ6@`Ŵ a[GˮkjE(حs= RKuLk?Vtt3{p~;RAnOw Q7|鳐UM_m)=~JJjDqIMn*th9..|s-5,.[9]VNP^ܼjk8}Wo[S`nw[ NFP$ٮFy}_9@@rӧ>B\F?ƎEyIr]^mMOT:on6 n{L7]BǛogcG>`1۟{X*Qv;zF`'[v <*E&dZ剮 f:,egM2L(] '~m”u⑧ZsfGyhiT nbG@Asق2?@ Lq_*qe\tI]ńSnR'n/uQ`gmK۠gLո-A|ШE.&uPZ f}U*ҽ.+.{^ |av:7 }OŨAJ\00 Q|y.ԭa>`;ݢ r_n µ}'{ꇺwsxaZzrݯ^Hp;Kl3x9i$ n)mKTأJ ]r,d˺WzWnUM:OTLANJ*Se\=EҳI0znJlTn'*=O87|\ep"Jmއݷ}~Q>WFbs}e#.ZYa[Fa/F]q,٭OvZ6ikG`3*Tqe ]Jj$({x[DZ`MDtiy|?̜a>tٕt|Mu!*@#M~ ]tݸ_67R">Q6)/?/e#@2t⽈:S0}HB+UKQnڵѿlI}d? LQmAv*W+nw:3_nJD%t)8wY7%J s= 4(t.JcsvZs3u[nyr;/u+v =;Q<z?}Y- yr_nm-0aǻ/>ZXrd ưJ1)[{~uZvg {U8u3/wj>g 1l0?C 똎^C|ڪU[}#]oZ]3igߔ_A\r0 @n% Pj@;vL)XwWY0_=6݋Jlz4*,9]GK+wyoMNpXP5wnAzGԴՅ w$u6l8%*[u|pz:t tr[k p+ T=AsꞐ۪]>ױ }OcQݠ+f}FׯK}~#@X)뮻u*(ӵ`?|]V/S] 8SS7ik|Ѡ^}I/˃} D&ZwE"E]I[v7sz#e5[&ӒD6[fo2˂cT^ޟs9歷VmZ\8qb_jO*e{ ~;nP[k緟}Qm T͋j#\I/Tk2~9#cԆϬYҵ6g}N Gu^eg1ETZP\Զ}D9Np´麓k*f庌lө oݫ}'d P1z6'xߨ6cw7=;*SNy7Y r}N@jM~- /2t;USh Ըqc*e5M6ۤf55.4j8P?<-I7_/ wK rSLXawi,eO? Nw@H{5WpwwBپirvk}Jyh[h{o޽L CڮQZ@]쨐[oM=ݧOtyU&=g_8}tN{A|ڧQr|{^DumqHAfjS.ǏZ:묳6U$ ɢQӦMKޫW/-Ȫ1S$#GQZmB`wdl| zp;ru+M6u<-3C^{mR-o&H>XiQO 1y>y=C @m ve1̑GL`z -<.bKegXr=q}Z J@IDAT~A6Knᨣ c[zjF85$4%IkuڏfŒ_zY/f矚]dS )k0z4{2݊eKͬᯤO7٦gߙ_n6#@ \I-aF/In\uӬYdYtlI󨦆^d* n լT>Qm KmݦI 2ҥ>t_>|]Yw؄%I4.~ .0w}Q@TSET绶駟 t :?"xmֵCnkDvۃ,:_?Ϧ +e; *x(~a?PMÒZiɒ%_l˖a4dvmaE1ՊM_|+ynI?D=rJuN1U1Km?] åQ[IXB7j8,v{b;^ m6jCzx/ zkt*Q_R솫i?%~  oj_E?-TTh53'x9cMӦM]} tؖ;zaΔأ><w;&ݚY)`Č燚O=|r޽̘0_^rY,705e:}iұ7N:lJ?3v){[Ԯ];'պURy/O)TS*зQ:m)60A>h}uq} 76: @TER/*,?sUWy0]tQpXGq^DukCx≤2{ÂT]<c+ sѺǛ=Wa/2y-:U&Ej&^cZR9QX1¸]Z)P'X1A+aÆ7ARW]eO\r?Z<~Zn)e)(M uworvi5OZgWtͲI{:_\[g𺪮 FiaQOwSe/]wM.6\y; }0~YB|,bygҸ7j8̴ͥ(.Herj\-FRBa)R :t]Uz?s,pM7#8"yY͡~,X`~')NVĩ% ͧ_|kWz9`@ͣZ_hҋ[n\yIYLqΝ37fС^k3co=0Sߛt{iWf?N6Tij?e:$3ԠfO24YS~S)?m&90sz#7F"@ ^k骐P`P ^^_E݄7M\[ꅒ5w/b-*҅ϟoԇVN:$YI/m=^L)Rzg Sp ItOֳAV<_0K^$kˁh^z%/@SԢ {[@)-*gh{饗zlŋ{-}IAji"X-O"s͎y<[QQ*hV#{mPƩX箮[zvSL1oQ?J: `ik0XW4iܠVؔz= L\WP|bi582XaYӭpVP5j:bQ978 bryH+I  _zf8Ž^)jSPǮۇmŹ^MT]aSN^d:ŨX&٤?dۤ-B8;m%}f|Ѱeޜ/`nc/i='O/ x _ψe& .Y*H@ İ'|wo݄iS<1cԪvQ5鞬݇{? tO:s|T#qM7MZ u&2(K+[8©L͘1èI`m Q`ܒmr=*gwo_>lw5aW? :΋` &]s;8Mߣ8/<ߵmѥ.)jy]wEkԩ^m ^뷂l*SnbE1sPu׿B'VMr8O֏Tet=T*~CQyVFJմ@/,}yJmCse =~SBUyIa`d]v=Ϩͳ(֧ŘF9 U!7iT> W sIQ>oq62Miz B@`@j++!LiaRtɾK{5YzA,*\Qme՜HpB2[LM¶W-G6iX/T[1[0V`U\N0xeh}n;}aݸX(cv+nY[~1,Ow|W,[jjv g_M\CL}ASS+joF]I])e 曹cƟZ"+2n;? P>K [lO5i;^/LjFUA"/$w:լWkuUh{jZ+w^wX'Msɓtb2sqW3iX ?M^ZI?|~QK"bY+>wtϻQ8Y{tm >ߵԍ4Ԛ qlir=/[7ou})_hEu^DyH￿Wgݰ륂&WOr w{kj^/um⋕aDQB!˶~iaYCgz5=ǫ%?dNeV7 >O=]>Opz7||<þ2}m?v*w{aB?ݼ_ V;\Zt1Qǡ;;l->Gy쮻 ޣu'!/K‹ϳse] =PMvk^\lGibq„  jP"{QaxW?5wϫqЩ)ؗrXA7F=zj(O@-躕if]L&M̲/>7oYՄDHxFm k&j+9hռPWs }mT=zjkzR[+¶i-[MUxf箋;\vi}eMv^g)zPjۗ,pm+=Z3fK\S"|v3s$Gu^D}kvtu;PD P]/պ] HT+JF37Z@TWzJ$"odR5S+Lvai뾧ڦzFsVElq~Vҹg2UѵPV8y$GEUs_gjUR圍rK҆ S}0VF}fu,y䑦s^n߃$@饾^Iyuw<  @ Qv!Au5"<DٰJsim)r#>?um9uϲ]  TT/nTө &JB@@PN7t??UZ{쯼 *~&{ZZg pr(  𛀺}ݽ$KOt?$I>##uHQh蒁g!9< |Gyh&Ѭ-y:r[Ro:__8ƹ׻lcw\888"o/J:h#ԟzۗW{6/   PrDpp Oc1-*z@H/yަaf\r[ HeOej][jݳl @._̛7(;4]t1|ML TԩSM_~a(͸qn%uf&NXU`y E4 P*4{Z_պպg.@|%fP$@@@@@@@@  i2        `|"       (@G4V@@@@@@@X >@@@@@@@@  w       X?        @ Q;UF@@@@@@@@C;'  @| 40ZN 13giriӦfUW5g6& @nϑ_d P@\(9u! ԯ_߬9aTߣ9m,! U&@GP6@SओN2v[+׳gO3~/ {os駛=z6mxl23c ?}\V7i=;8^{%_~WsgKQ|.иqc?}f޼y>裏[@ךtь;֌=,Z(֫WϬzSNsFA 'O6_}4iuSÆ SO=]ۦLbzm&LPԦTu gf"֭9>sGs 8дlҬX\pf֬Y/4%q=hՊʦZH>Gqys>ze{|gB@@ <k U.|^ڤCz8}Ż J _~Z 9SB 0-SK vm7`4]x^t׵*9SgaZk_|yI/Lk:͇~O޿s衇 /lL_?VYpWB/ 6|R~ꫯ6lQM 5QM.At첋[onHT?C٠6(8:ےp_sNC NM7h׮]S/&c=gԛo?ղ]^nEFEy  @V*h,@s5jZu T}-_C?9T*,u-8 0 i‡mf5Lu{^1"j%:{lFi`Z Qk!&i7k~w^ kI޽mW^yT4dȐ|G1aۚ^zx?Oj_uUi*T T 9sV;߂wjλprܛmuղ]q<+_yg'̸};?" 忏XC@2wyǜ|oŋ͂ BuۤլY3s{-Tk=2Z"Q짟~/m۶^jk:sͥ^ꯞVsŤ5XèUjyB^{ͬ>O?Ck[oQAqX?33ٳg'\lpS' _ PK Rnug0UE-7 8g}Yt,*d=0|M0[.}Y3b/x-ڨ{v̄3asX˭)榛nei:asx_s; VWQ\ \|lUvzfk ;[6  Pgj[? 8888888b<q̟?qu+^z~K$ kN;DPE4}k<D%[v1mD]roժUەh#ֱ6~O$'x&Lʶc3Qh[e?> lەpYwuSp ~ZD9)hDPJ̶NoD]x@ױDFMDYM?a}o$ZԩI{$MsE+n-wOkW0;ֱu)yԥZvr/'Z=`ʔkK9[hYn}^G^c΋b}Vi8c|?PT(叄 @Du3m4ѣÍm F]hS׮]E$ رc TZkzVfZ5Ǧ?qjAI I߃3\F5jy7͠AS9=]~Wtu76ztj/7j!MjæCc:ۦ`K!;    P~F  9|f믿qULILut6~xƍ5ͮORQ7J%vꩧ&-/KtgaeEA] fPRU ~v3;v4vzG'I͏O Gy{W]l ?21h:}tT8K)lL/ =/~~ڴiSwtɇ.>ZkUmsbIn>|Sr9~u{j?uj̞{uVvyD˅Ӆ.;=/m,v}l>|" T-T~d+@@sM7&P4[oʨLguVR&ꫯ L%#r%t$0li׮_pB3k, w7p7J-QtnHzA:o<;?Wgi/C-Z$(ɺ'v^ۅf̘1+1D[.4i__\poa׿L.]LMM9ꨣDPs1&fQ0 ]j3M4+$:qWW^1n]Z2eQRےD4NA&6C1_5n$LÆ8#L!AzQ]磲-~m>Q_Qޗ$dҤҥK{ΧS·Qlۺ~d6蚨떞yjK.O2 iȑ椓N2?fǒ~& 4󟽯jI+a-t$F)OߣLQ_8jtmx饗Lk3ﺰ뮻zAb^z9Mͽݱ|rC{wu)p$ѽ9 'N4#F0j+b[pBwA!Ep|; .2]S4~?Ssίs^7F}>u` Ү&Fyu٦+~-|l307x O݇sA7#iTuw{Aڎݻ{ aqݗu(fXY=~m6S .~s}8{jiuzu+8j.u[- Lx'V:usoo b vjoDe߳>KG1mGk0q׍a@@ '[ u\>?YgP`^^kUW]X-%0dɒsOJZ/lh"e~MXV8]$NűK{w\\q-{駛/wPiyeM6j11x`?C-ܒt~&_~-d'U0mo_ l5b[m) /ThBVO*S-7.RB:my^bίbO`7p}.ZkFA:uXRۥ@VaZ-QSG6 ,"X<]b>umzV۔׌3d%tSK (?v>d[U;s}gԢTX:u%STCWaTvuRp]S,6}^wEA}y$}*Cܹs@ỤVz1@1)2RynBC0  @u Q]A@:.64^n*TW"*RR-?^! Y~w -pK78 PGMmUBA|In5m<%xY6͙3L6~-S-.?mjA@u%٦*C]uC=0m vO`ՎVt5-8J0hРE : 9s[؀{۶mS&Q2l֭[u?fS]बt`XŔ,Yx?GyeyLSBϯ(S9W_}O{ޤ{n?CQmۺ=veR-V}9Bh 3ZqBh:! D'@Gt Ժۿ 1G@ zB`^v-,~M?f͚.bU L0B-3ؗߛmYRziT3.,Oji*n`wZ;.}PV'-5~饗^t)mV^=jB=[R6m)o֬{/j5tǡ]U{j{)]ԍ … mu3|TXj_Qܗ 05AdtVjlC 믡+8ˡ+SQFC9Ŀ((kQv*\vQ/8~^unݺyZ?*-ԩ7?7\Equ3=lwP TK6C'ju,ܪIu cSO=ZѿJHQΨQO%س   /|VD@(76o-2-~ۡPĠ`7{lgw]eĀZ*XwuQ m Q*ミ&UW5՜z) UjS R&sv|>UPjÈ#|?n#G&MSƪE}Ey*$RSnlqkkǝ 3j^~jeM K[]v^rEWTeFn>c=VQm6}&90uUop8YϺg+=}Ȑ!^L6;A3EǏ.{ʻ׼^er8,m@/a&7Ǝw?:ԂM΋QO@@ -d7b @@bT{&&5!&|Wd[Քzσ>؟]۫izR ئ`okidǹ:=XwTp]jCVulR7?钂yhMW-I-6%ƍ9~]G}dt} v-'7˃=xFXjmG-+*l3^J_r~Eu_ֽ\-C()K-Ffj *tmI]*ՀgzmYx.TYg٣_Dy 6̻k_eKz뮠_ۊFIT_qxejV|j?:/F>+Xe@@<@@rppkjk]v5-i>5ur ?3dɒA~ (@&(0]}/n vt Pud dlҥL6~_. PaS?$ kȝl ĝkvaӿ jѣ '`'峄p(~Ԓ{QRG߾}T5Զ¤{OmvMPUq@Ajީ2`fXǨT)]Oy0IG@?g_%  qk /k2լ)49p;i_6 ZvWMwd /4jRRuU@mD^ǂٮKy>~~iV$l\y_~I0OPf|?).ku:/[\db@@ QRn '={ xa ֯Ɨ*j_T{Ā[Pnn?U6S ><QղYfCOI53%udS*;M9}|k|RA"6cw7:XTETè'@@j]~+  ^k*t_~5nmRqi߾}UJ-XXE*$Mkۜk>ՂM76WiڴimʻW^Y*u[ksKQ~ѽ{wZw>d9ߪ>nYm  >> 6 ;_J#4kR/BwuǑ)Eu?jҭ ;SB[o5ՠ>}_IK.{Hs/:~M #I\rDGpNRwۢ;v:F(1<;o©/NaРAK/E8`R.hŽ=XvaSI8$1B;TsI)j޼`j\`p 6qIJ&]uS +Io7+pڙgYS!+Pwa]vMZ~~KX}~J_`7 @RW0)`'Xcг>kzk>tQmIpu+?113@@ hXy#k  j@k hxꩧ;QX;#G 5tSDIf"UlOZW@uGڀE5ֿT+CW-[ǹKsjDqi~Pl%_ ]gMMIJ~sO{^ Ujpp G=P?' Zz}iO1¯>A @*e]‘iQo T{ KN-=l0QmjklRo2(uk{ ~l+h~~?.ܛrQT8t>}wߙXkWOL}`ʼnء7M1(矯UzQ+b˺wys> uL Of*i{]vS3'z^ML>@ǿj q)p4Si9S +bjAz%)j2E0"'?]tnVj0vm֝0+zŕXȕ;0&uEh_[?r<q0jx  )@Gun7r + q~TA钚?2d_FϞ=TЭfDʝTԪa% y_b6xcO`SNIj"_?1\ƍVEI)Խ{״ Q~\ H 04@.P *[nQ QAjPA Mn>TA @pRQ;vlxPI_uUތuI',K j@D+SR \|.5;0tP>))C>9 ړE1c"#E%n8 JRGv/C?8tAzq^OX/]qG'ӧ(;벛_1o喑X|6|"'* ڦT )a)R^qAA R@Utv.+cqqOۂ@@*[\@(X`ѢEUWb*ؼ7_=PL S z+XqkN7fV+CY`wp~/"?CZ;TŹڰW^>N:%]jEP &x㍦I&OlB)|*OzX.9 wM濱1jg\_ofJ>{m7|vi'Nr3iۅ:moMo뮉0u߃&nڸ?y vTuLi~ϷC9ĞyTGI*5!|\Hp +;K #؝˴q"h>Ab8˺h_u>Q"* 6!i륀V?tI]u]RmR\lI73?oL  PTv  Pzkߵ׮:蠊X)*Xc Zx57U T.M4CQ|QCoЪ{~HԸOoZ`g˓j8m5~T h6m*Tjz[o7ٻ֭6joz?4̯F^5ZPii nj.Jj~Hǥj1cTj{jn!8+}i^ul+MK p5ؙ0aR~tڵmt4iRbIh|uϢ{@<ش],zm7?}'S0'ecR{`mBcV_վ&[##@<nm"c6d[hQ<3g. A]+{f]t92r=@|w KB@$@G&! 1 yO4jI_`ĉ6a{sƿԒ)SUV~m ,\ؕA@aÆو#VexÇH  'PrMe#    @m Zk-k޼M6;KS @@@כ!        ԏun @@@@@@@@!        'sC@@@@@@@*@GYY        z27@@@@@@@@!        'sC@@@@@@@*@GYY        z27@@@@@@@@!        'sC@@@@@@@*@GYY        z27@@@@@@@@!        'sC@@@@@@@*@GYY        z27@@@@@@@@!        'sC@@@@@@@*@GYY        z27@@@@@@@@!        'sC@@@@@@@*@GYY        z27@@@@@@@@!        'sC@@@@@@@*@GYY        z27@@@@@@@@!        'sC@@@@@@@*@GYY        z27@@@@@@@@!        'sC@@@@@@@*@GYY        z27@@@@@@@@!        'sC@@@@@@@*@GYY        z27@@@@@@@@!        'sC@@@@@@@*@GYY        z27@@@*hӦիWJsOk[G@@@`hr>k Wm۶[ka|hѢf!$ 4lІn;S}w>4N5|9uŋNKF ~7pjVXagq͜9kfCvWXm֬Yvie    ^ia>Htc`kZoNַ ؜^oo*1XS6;XUZXwWs$}~'z֨];W,_fK~Ѿɓ՗;f]>yK"o/:j-KaWY.]^Fے?ki &|bwպ _ B=Mɾ"[¿~ŸVYUVg|B7vts]S̀Zزys'OO?2In^zq55hh5v}qɞwn |?t[L3S)+a:Vj:,ݻw[*7ntI6qb|牕Gb-lĈ;߫;<0mvW]uU;wn9`٦ ۄ j3;y-?yt7`=z?\;y H{ :g3fLƠ+Ҷj+ܳ>^{5[zew}w{CǛ<7vX{G2g7t? %KgI7  T5T#T@nYYmزu䇸\j[Akҥ5`w&:']~ck}5kCDGݭIͯ^ʺ[~Iu#}F[Sow1Mnz*ӌQXzYCHhim o H}_qck ﭿ" J:y4ٴgoOkk'Q)S)+*[?i]Vpyon/駟Ӎ9t?jΜ96dȐb|겳wTIw ԕ'(WzҽrT:X>}|li<7sΉan ):<޵kפy5i҄H)z"  P=']*j7kn-696[ 쟮gvn#gYQDy,-y^Y5|Q)+Pu_ lMasƼw2  K*dF- NIzث/ȕJ?ֳgD?:@ 7516l㿵T@]vV/_~M2^y?/OEꩧj~W뙨+Op;=tuy>{Ӻk#GpIx<#  @揺-Y*^e~ By&|TjӫAī1dDK.[+W*N|ϵcwm‰Cs=}yL ^ +o8-tNyUMjQ3vXRǙgis?}v '_;@'WIMx5#PHS@M~g raԤᄏzq.y!  @ PGn@]~Zͷ8m-2NOZk6ZR͒6ñ)m&Vqr@FͶLwΘC4R) +@߾}Md]R HK'pl͚5K|@@$-O0.ط~}РAn:@@@n ԩ?VYetM?^{5Oތ]ՖJжZd͘1Êiz5ְ-o^z6qD{o^SR1Ѵ[oOO>zT.]l֮];;wO~iӶm[ 6̺wn ,?yNW-Z~Yb(csOf'8PM~?^m l%12w~ijE5x30V鵁5j}M|v;Qļ@`%:thbD@-bߧu~<tf=zˏ?ؿ^DS ڤIz(]yUVG-{4yҦzG[رcMK:u>3:uTafPڴicݺu+u_O?VYUby+k5?q/\|Z?u=n8={vA 6Z~;U{׺~7Ju曏RS:_^zU3J^b|IqZzdW0ډ'F$@@X9.Cs4P{}…sϙڸTV=Fmpe*pOYРj+S+Ru_~mi<-5: qmٱ?4u+d62NGᇭcǎ~Uxl2{p >?~~Iq{` /кv:ao_Ãk{=ǯ);ku:Hnis~lEjiѧ5l"`>^rr.UͬAVy֬ZlLV1}z}0i{?jX2s-rbp2) ?TҊE m(dTŲK/?wA꯷|$y 8ԵRu}6]R1?k~ ͔z)[{kj,OCSN9_IhJv|~ TE>3+ҿG8w}{iwk֟Q7>l:4)a7O?_cgΜӨ[ãR1Q+$? ruՅ_ve~mu`fѽ??0r"m:t,A~qv  Wѽ~ӦMY:wg<D#FC?QْΟ/xnڛ fG}U~iݴƌm<ٞ{iz {ڣJ;DϞ=oo %fs~ 8N3>AeIABo&Y8+2u]mʔ)nug,xY v蹙K\ܸ|"  @u T] 5>~0Tm9A'OUq':Xn`G^U@A ˭ᠠb7Yz[-*0Lᤇs0C) kl&v>:u=pk|D6?>DwW;j3^~.()# IZm~AyۢVyxnC8s9`֢Ixɞ߿"j9eUԣ冿jKhuy*Z Z[z`gQGӟQoڣZ4f͚FSz`tI׮|TT딚qQ@Zo*)ϧv_X5 x{%˭W!ie #8"qϧϸSΝy6m_>t˔jvm?7D%J=nb}c=*4*Uvwy<ze;IkqqWRn?OSuO^L"!  !PuQ%Ezx~zT@1wqGܡq$/ۼʙuӧSoMڨހ֛z|+2j.#w9+9Oֺ)㦫"PM(CMTcRM+Z[7~hMLtힲjsGO=J*ٸcgyFHnZȲ?TR/lR03@ 5?B@P˖TD0Q뫦)u Sgsz~CT^D`=3wDPЃKjnA7Bk|Do1^M)}(Pe˖Q헯spFqG}-C5Tws_{T~ݶWQV}.]GéF¹bTYjQ0K9r@ Wt\GJTs b=p~}%~6@s>vRNj/tT QM/>L+Q~:o\|IPS/*u~͖Jqf[fJO8w\ 5Z0bOTBW\~cb.ģ6Qm:.hW=裵    P'?nz7p;֐!C7XZ[/Ww>{wxzOE* *&`UzvVO0z`}D&zBv-8߭z*T~”K#E'yMcdeqi}׌jIF^m =Zm5l5Aԍ}W3 MMjo?eexM|n3^y~lJyV=Y<ރ? eR:,{䳽ObKgʹF # XE=9jƌs1$D Txm{ ' Tc+Tْ 5Lb T^|.r{'^*Un(~:j%S&)3(GNZoM*3Z.T`c= ՜ !TUK*MB8?.R{7 ڮ_}~wvȑְe5 $/!5!L`A*+NJB`(So*0CIh\->zk[`u]fp(pTAJ f?uD5?4 4h_}u.E~T ^[)mC?pvűW&BT~T#?QU| ;|LhLM:Fr\Rx0C_x?XGӽj#R&ՔOzfw'?Mj{Q0. >s߃ _5$@x^7[RY k\{T^ $${!++h^Lw\us1FqOTIM#& ]A "$!  #P=x[kz#zX.-Y 7nnB\=LWv&Qx=t˭q5(|n‚?4:PK̏ [o+CWcGVTFmgu.xi-c`pɖOnfCMW~yic`Վ=58WC* >8$pG.] ,"]/vNHmy OWkHfԍYRO~k;8Lh_6ԤK7pCOj s D5MLOA\Ioܫ3,G{o Ÿ~%?z!wvtWy\(@HI( %0l>G ׸Dw{i:]mK.krl~1Qq:uoUA1Qk 6UP'5S\xR\:uz>7}l|qW\Ǘ.3R>j.)UklTRs|{  uK 릠`aB`uQ1U޼Л%|Ug\>q'%_gӏ?h_}wU]"j7xc)uG%*,U~~vmIoSz#8&qUk[GA)59kZ:Ge&iԮCF^0 ޲͞e >̯]#8][w7]앱^S_Y5Q)\/~1e`=x]8$e/%0G?:er8,z 矲/+dO/d5$bu,V`۬K';ɒ`RP '}L >@s*[ᤚCtSp˄ ƒg{1<{7T&u\O)ղ 5in_qBg}#u ťt?ݲ,e~ ^ʻ~3DR:0oAb`jKo5hLAQ/%N`j޼y߽$I%wL]c\ /$8-$?TycWt5lBqW\WXk4xz*>[/S}wp8   P7KSm)*&3w.hSֻ49^Exƭ@pZl;ﭦfԴJ05jޚ-"Q- xoK˽* X2'ٛͮ 4zS8F-sp4) )AzbWx /Yk?h/6@+sIZS՞)@pM uX8Ha 74eKNͳdJ,8qba pTJ 8CH}hͫ4|WpK*W7XX[55w~~iI e{r?LP_JBB`۷u?s9TF6m$lknY{+}S`Xs~/@w^suN TK..>矩S\sS)ty/wbr5^p^y>r~Ƶ^G]k<3 vgq_C&&MW!Ǝ7{d3Mj%5.rSs x:zS0uO!UӪN5שF`G$Ք%j>~+OOc#e)#SPY.q矯,8_g* bJ+fark:qO]j׶lڡr=TCؐ!ClM}֡İkϹ  u[j /,Fb8E/~q5\-s֭Sf~;V# rJOpt}l&;(4 UФ%>y߃ZPZ:Md~Ѹ=;զ[d r3vz,}h`i$*胴ƿo酨+ߜѣR?9wLj-rZ~./\2G࢚[Jknu?k5MΝcSf%iWz~j}z8p=iWR]  n|32pnSL4IYiDp V@\Ќjo{衇ʒl ז2iҤIҥ``Kq_i)~oPMS6TAyV[mׄ{[O^̢63gjCRR8ԔK8uS#̚5\`)Z;O@~R>+8uy˟q:zu|uǵ^}ڟMUh")pS)#CA"r_K ٣>j{t?  T@rտ>58ݮCUU[f]p*M6N;HWZ~"Wt]v]Uuqr!3ڴצ=r-\fki\xݝ֢o}~լiV4nxfaMv/-9=rجٿ{,%γwv)sx~_pAʨ [kwHetQ}{sp["?1+##'d:fe+ꍹz褚IƎkj:Ekx@.nv3ڨ}Ӿ|M_gG뢂@^7ũj:/ [}MKr ֽ*ub92K&j^%[R-l\5G#xԣibb?/˽jШƤ&H{7c6sܤeS-骫'^w 7SxZ j1v;b}~z~5nZSAMW5tuzW{ְma5T|6z~yꩧ{W{C5p.^ Lлwo曓2uYe}EͣT&wik:p[fk˥'x"o]>Xmp-.qDoՔQBbǏnzJ|v(A:/ssu'xQIj2ԄO?5Хzb=f}N=싳OI7IW/1o.sQNTZ ߤ?AVƩg6#sQimxc㴳qD@Em}hU'}#˾m#O}kWi+:oa'NLk5jj~HLc=6}v0 ġwߝVO1W5tbסYg_3{o"K[BrM7Z WkJ'}d~%Y3]#sǵuuǵ^q_qq?+8&lEt 4yZ{`KTn=3n-/  GaySڥl営kBQzzI'%=H Hoe&뮻M}=jگg=T.9cLْ NmǑºB ћ ZRG.]Rsϥ+U[}j8hsm[k#s-gϨZ^ IÈvp#k 3 i^؂8LGe%6F'bR;Ӓ3lᗟ{[\j%*-pﯪf;o7]M,_kf[۫zr7 :jԦ}sO$u䳽l8%5DV{ﰙyVv߬u#aZ=8z-ERJOR 5 g=oo߾v''t|V]5ɓ-[4ϣ:ʿ7ہ.ƨLAOo{w"ew6U=rH裏kT5ʑ~&{mcIP`+bR]Mog ۵4I(y6``>R}\b?+-?ZCmո7[sOv^x/ۧQB[m]OpޅtPS  ?` 4ZrbuO} gu62ȩ ڵ[|/2XuV^LXUkέIo+@^;va~?/GA\_}՜sy`SV\ם'|TjQ8p}S@]j쩴YE}bsմy=xƱ^OJ؟C )mf3 SP_-⏛?հyZU|L]ՐS aW_WTFM\jOp՞n}ᇱǑ,YjٳgVASmTKW7L|,uIRT-Gp v5zt|K71G:-_0hE}7-#7B\έo6>àF5ٶZӮ\V;̑/A$Q2'N6I rrM6\] `s뭷>Ϯ\TR-88z`})$HTXqkfJ 2į-]kT(j+!)PAo+Uϖ=k PkTZ& US\RSw|mo%>'G*~lvF2a"?mXPNx NpTpx8_uU+/N]mQ[IR<JuU0 ,(v~")-wW뺣4 lZ?t;ÿ84pwm?|ei<zu|ukX/7/`% DՋ< 7T M RV oSM]KQsْ v㖪*7>@@@uٗm+]{opPd[oeN0tӎPG6g=o(&yB05NAyqaQg)uypn}z5J*y7t fz¨ɓ']LJkϖٖyKfdb/R"ãrJpZMԫM#D5[H>xkWt wjVɔ"4[!)j'45xE6ͧ`6Qpgd 'OʶV?xLҔq oY?ٲٳlWGo3GxoX[+2\i dNt*AQ޲ӛ~QM8)5oT V(=n>ꫯjf%xp7XUoG2\sQO :i2ϼWjBٚP{K.MZHw}wg}z'MQ>{+uĵy4Ք1bĈ}F^:*W~ \sTm1 .RB\~iLJ8kV@E՚uP]}Zr.1 Nҍwy:ݹW*lv {+*ܢ tF06]ʴu|9䐔58L>q?,7/Q:4jT;'0"s~\Kuy榚uEmS)ii+oqQ]ŮWKfݗL0!ru^VtNTo:+(RO=TIZ韪4  PGyA ^LGrj-C{߼_-֥vY=ۊ}}9/ ?W6jO-XW{DY;4/#qqSEAc;x;pIopR{$@@ NaÆ%iV C^h"Tͼ/Lm[njOF@@@@@MJZ{QZRTk'! q ?LT;_-^N8[tiZw 7XVlŊvg̙3k=Of?o:t`W\qկ_f͚evZI@ׯ~z?ޮꪪYj>?W 2E@@蕯, J!C{[V04Tb-5ӦyyMkӮePkԶ7YgW|-}sEˉ\t5_{=ߤ}_l;[^"5h`kn/oܦٱƖf|ٖϟz%Iygy:v옴K,_~Νk&MѣGۓO>4_@8b 1bDbwqG.ѳ :N;tUWϭiGg6Q(&LPoueoӏnh"ԩSJ"0d[ս %UZ'  G?R*PscY>}y6o<5jdf7,z5]mukܮ} &XcOI֤cSolMjyX:s5wE5hZmuxDN8]Z_l-unl2:MN:$[<q* {3g=rĹG`+7nZ5ݪ݃T~\OWc;   @6? 1 Ȁ맪{wuj2|jZ9"ySlo\mP+bBkвu94cyZl*3z5s&Fйkƌֺuk z~ qWuomEajYȋZH]^^vj/>S?:z6lذDf۷ooj^TZ\OWc;   @6? 1km[FZV.5x˽fV?^)8&84Kh?=uop(j{o74l"i|~/XgSS JmڴAoݻwV߫iŊw!q 7UsZt"x#PH@@@@vw@X/xw_J.[f1o[#iaLۼ{Mw=뛤^)T /~a6m=s~U#H߾}yj"E@@@@@2TGvl뭷6vԩ6vXl!^rQsÆ O>ҼLbo}W) nͽ%gm5jȾk{Wm֬Y^c5l-^z٢E죏>z+\\)k~+}^S0V;䤬)zFk/)wߒ4._@R3&i;wN^-_իgï?sz۶mklO?ُ?7kTz΢{g5kOMU7fϞ] 6U)U0H&{)Q6 m\۽(Z  ]\i/q?gwf8>9sf^k~wIow|UF0r\uf]t%K_|ao+I7zmZ򟓨|RJ1`\@@@ K/?pGd?=vYg'ҍGh8n;馛J2fwyǎlĉA)K8NS2Gmnf  T/ uoVQ%N?t~Mv* WZxq;1rb4̻w?yP&:ϫ7yYSO=ekq=PwF?j~qk~Ts2_ުY(K&.?8X/W{u]e7s\,D ՘虝+4j(;ꨣL/meJq^O3?\K߇w@@@?6|s>|xCC @f )wbq90QA.'2-C_UKz &Xx Q>glM6ɓ'ï yw5pRp!zP`z^ N *X~XG_~yb^ ֵmng_q͖٫%_a  @Q|[Z5Soqs tp颋.JR4nyj~5So?Qiuֱ~;T󏚮~nvmeKk'H =_WB27Vwi'Sr({4N:A< 80i\_5C"}]J^^Ih|9UDZka\R\=b ֱ yW3%_r%~HxI/ 2U-+Y /}6'b>iWmڃg AR槚(Mjrzz5M<?jD.tי`_ZvpMTӀ w_V6]?|?o :n|I5u̙3ЛALe*?U9S9/Pn{okZlisM6-c-cjK PP f>obJ^^Ih|9IL?ۄ 7Qvw8uOѽ~0HVHt-UyRl~نyer\( /}MY)=)S}Z@0Ԡ&Ibk:y+;jpI|j3G)]짂qtu4?5cUjjS`s8y=-f><|G@@J%P͸5ۖ3ժPLWkEͿG}oj`H .w~p~xm٧l(QW3-k 3v/GfJ^KW}?2&_b{&)sꫯ&mU9WMfNpk6e?{/Euw\zQ`^KcMnl1b* ts=޽g^>r̝9S*~u6SYZwyGg-37w㟳u ӆ7ӕm܍ʻ|+õub{/ǻ"M>Ƥ紼wAEur>_z饆6(_Ha]àA2|cu^)'@@od=P׈+QD,o >RUKbp|A"fAW0i4ͥӃ^ŝ:Æ?Ze7n\PaN9唬y7 ~flsM o)ףn= Z7RPG.2 ް a 뮻FjKAo-x+wf4ԩS3tuK[>8?}桇_VN2K{(@ḑx>Ak"ӫm{Uc|?}?>+_ٟU&in˳gn8] UWn+G)bhոݓA A7eo,W|_>?|+"*Z)kM'i}iy3.-Cz9&ߑG]AAH}O}?*=>>>>>>>>>>P}ݾlDo~JO6#d+d̴N;e|ח ? JϚGgcLj:=x#ctoX߾}3ky+?#v񩳪Q55gͻp°Y oqjW\qDsdRjԕ#9]ߛ^ieqAR+[Us]m_eAD$@R,h,nD%MW3Jj \M'c7]K%&N6[np)hf RlH%Sͅ75yuԽ૯f|OѣG[/4gw_ Z'|r؅Z[þ(\ _|KE5\ H B®eu?Tu2Sv{$ZNw]m2u>Ϩ$_@@@2 T4CA)h5|_``B@_>kg)?YX›I1O묳Nks{駣i4Q>SbGjvz>uZ|dVOW<4x0:xt[٧6oܘi;Zm wMh /]&e:-KX۶mÛ{l{"%SM;ւI~q>╂V;,-7|s4{ h"#K?/A$ゖKA%Y@<%~}\T2/>ᤠ[,߃wiuWrm殗_|kr}>RoUrE X%g]hto#ja+(!4^pX+=ze˖'|/[)þ20h (4-b\rI譀߷zKj6p A"&Χ>j    ȼX_$-@RH|8Fc>^Oh8m|)apWGk@-f覫&MIRf^<_{YUEӦؤn(d^z|ogM{_x7.D@@=@э}tۏ|t5fGqD(0KޤWhZh2+-o&G]\|+R@N%R 1_1}u~nrlj/kQ6y}>+/nZ\*t=8N ]w+eTYOS;{1gk\W|_*HU jMl5ֈtee ?}٦j-z/k{'͋&<:~nn\}Q}9 hM縴}P!^)n_~e|tps+ -*?9њ TwQ/mt^f@Jy[}ìԊF<@$kz=$83‡RЈKԸ~&.rW_TuK1ׅ:5vNOO.L5ד󱽪^qNŧ'MZƕ}/rIŦ~8-,Z\eo)@Ŧ&_u|5U/omRV-ExHG?Au?VR*C/ 4yd72OOnO\0   h0 ehw5=c ٳgr?3&>||8YfM7|OK %Rɔ/ )^I&ſFzp؛(^,RLj:e{ɼ֦Svͦm3-C=4=ꪫk `<J+Ν&Ҕr6<Ivaؔr;޺_q3[r_ό_sEo/gljޔ۩|sv+/u-/lO}-\m\+gSw&-u^}H VGzkSKnVCl :uѸ|͵?+S|ZO>$|kq+u˟O@@@@+T:L?w|/AsZSLzCc7Oqe5Bͬ&Sv}CcIojWqԫjڴUEӧv!Sת 8C "TGݯJwuWF=WFF%xpWhJ^#l.Zo!MojIhM6/<Ҷ)^.'TӨ|?]u?rH;lSL?(8OK-aZ)ǻ^/_ǻz^x;cLA]vY5G?L9`)#_DczǓ'^6_<F@@| d,N:DߍM9L믇]˙QF嚽ŏod9޶z/(xgРAYj[+&CZ 6]{OѣG[Ι-H$)RU5g}~ﻼYnW/#Ae]oj]7' Pq~DyChw ꫣуu# E-eӐ!C_&}W=յXs&5ʢqd}[gu׌O˹q?[r>j|㴔ǗoiA{n5c]ok￿рj]ͨH Rnw_u|:}KOԊZ+]M-kѣ稰yw_q}eu|k  ?0   P@My睖g '`~{۲JW?W4.'^}A\vn;sⳮ0>d= 0 tM3b9`u2+HZ\pAѡjGu|ֱcǰ8jo*M%:~RU2uoTv>g3~̬&ݞ~s'ox@rk6p({6N&';69:{|qggP}}xfuGuMӧ)8^j˯OƯ_U'-wuU>IY"]r-֯_,6|p⋣qz X;Jg)ǧQ)y8NKY|xK >;d!AmfGaÆEy\em)K9}^/_ǻzi8qbx@r5Ȝ9s?[rvє뺜zpgm:sL=du>$:yy"ZS˹&!   뱔˼zggϞYkzcVMcDc=NݳgNޒGp>s׿uӢEl֬Ya OO+o1J%`d Su#P7Woz_7p[(ڷ2СC… ÇrjB_Ÿ}Uc*iD׍7!^Ж~='kУmv_|7//|M=;|?&ʸѧؼ1Fy%m&\sM,zE+eZ_|a]t 矇]ܢULh^]L0QO?t8#>*n^~<  ZP5{志Z@8][R|I{wlW.Q2j\;ʕTf_^`AQ ԹܝSO=f ?Yg#v.X <`Pͤ5򗥒WԺ\ w ՚{{Ucrb0gO EotQ]TRؤIeCE݀8ueӧxOQ ŻpuܩY|[n-w)VA-yē&x7Mo廤9Z!d%uy ֫UW'}V/bwE5n1cDZ2dnu|:ޅ^'E~{ԪuGnL(2GEsb6qAd7tS~ۨ`T^;#Vϫ>U8ew <Թ!hHB@@hSͽnFgy&C2^xO5﹒W^y%,-v6hР8n= эW5?֛'zZ7IAEiEyࡷ2œn2Jԫeiյkomv '0zwl3_x&#C3LFSW/u`fI[p  E,~h9u]a<ϲaXW@ C|(S7vkΪJzȫ%zzPvۅ )וW^ OZT${2#kF#Zr4T4ұ.˩nOi1"ckm0cdEO9唨#i=4%ۆolk@EtҐm^|ŜJs8TgqGݧ4zZuOz9Ν%7uj $_4c0684_z RSz/ƃC5SZ땯N[`~֢˖,FҖ(eIJs.O˂uN7LĦ?pmeMkDZ WjfD)IVN1W. +4Cy)k\,ɓmv [EK;sZ$IKjbv0i\;}4͗ڇno[]{{UkR}?ꑖҦW˱K=N񬇱R`ͯksREuokOd>ŁQ3wW荒UMwusr?.oUm=Cm*j,wGԵBYk?϶;ZWk,?7oM2:nU4ei p8lqKۛ  "P,\ݾ$+2A֩Z^P"ƍ $׃UZ^$SMHɇނSlILnbitQs%[6l&'̀\So}X5\3l]VusҩzU@0V^s5: Bur77[ Tg橖6m6 t4AM*jaLo>=D }.l }k@Kj)NAYܩ%n/Z/ۥT۩|_7Koz^jK%妛nv = :mڴWEW,xUŖKWcǗ(\:i*xwZ/G]BZE>$x9{$ͽ?kM5)V`ŦRϧ?M-pݯ5ju/&5̏  +@ 㭷Np3&@h}zHtإ^ %a  @ %.uxoAʏ  @n_|oq~EI͆@@j0`=ۡ**h@@+uxݴT @@#ЦԤĊ.cI͂=:>a@@bgyu-l{ֳv!EP7&?OH*V V  u "  -L6;UG¶=A@8蠃rv?wEٓO>Y  Ԗᵵ(-  w{1clĉᛳ mȐ!6~x@@>w}K/rQ@@9&Md3g [J7o^su \ j"  PuAj@hÆ [}}M<>#  Oْ3  G+        P}3+A@@@@@@@#@Gy\@@@@@@@af%        @y(+"        "̬@@@@@@@(q%W@@@@@@@@"T         <       TD0@@@@@@@@<Ǖ\@@@@@@@@QfV       G+        P?*J@@@@@@@@QWrE@@@@@@@*"@GEY         P?J        @E3+A@@@@@@@#@Gy\@@@@@@@af%        +@IDAT@y(+"        "̬@@@@@@@(q%W@@@@@@@@"T         <       TD0@@@@@@@@<Ǖ\@@@@@@@@QfV       G+        P?*J@@@@@@@@QWrE@@@@@@@*"@GEY         P?J        @E3+A@@@@@@@#@Gy\@@@@@@@af%        @y(+"        "̬@@@@@@@(q%W@@@@@@@@"T         <       TD0@@@@@@@@<Ǖ\@@@@@@@@QfV       G+        P?*J@@@wnuuuTdZE?U1(     i[lw>}ٳW^c=֦M֒]\qrV E \{ֵkW[lq6}"sb*ЦM{l]v?Fiƍza pB;mi}\--e.rkժ͘1N=T_Y5+0|p;[vWL]jf)(   P^ek(a^T73u-_}{.Q=,gwM7ʖ~3f=}v}Mǝbݿ_OϮ¾~Ԓ~gwֶgOk.ESk[0ᓬezímοxp)ְdIm!^iVgum/EӦ؄kƾgvV>( #Mb^q}]ӭYNLr\N[k:^z0J5+ ]ࠃn)d`ZI\+Ɣ@@(E 32X ^6lۜ9s ʬPn5vDjӥ6G3ju\}-ukkrk;M؞bW]תu0кo}Ѿkgy~u;Xֵ7ٯzr_V!ȣmd~ь9_%VcF׵mkm7]jӹh& c}ֵkgvZWR]A TgG Vq_-^smSy Y}j^ieg%3SiSR h Xϫ0g֬Y>-!ziV< 鵘HF@Kr-xדCy@@XQXQ| [7kF@M w 8ӗhPyKur}?NKcS?znS썎kD |9єf\_F*6ڦA6uMY/?tʼJFTz{UI)zyܹ4Rl-Zs:jK@)nmX0KJ]\veaookk?쬳ΊޫW/S 'Ԓx=^1؟WL-@@@UuSBíK[U߮ln$RA "A!.Z Iݷ: Xpy7VG:^!g3 6#2ƕ˜7_eV-I dR7m>2ͱ R\@h?fTk3.Z|#UF%?b-    >Ž@vtх6yeID~=nSj%5,Zhs~=]7eZlyg\8霺F"      @hQ-i%Hǎmҥ-z5g|9ZPPG]O6-l꾹VmP?dm>b{M˲UE-.`#}zVR۽|׫I%̾ս{w߿? 󬺦&z^s;M}>6"E@@Q? b]t֩SFI3zUrl~ӷzkSnœ{f?#[}_VB_<| [ZhXfłr-l Ϛ-+<( Mι wBRY.]msqA,V5~Ek(HkciG<9^ZRU"Pv#FQ١Ch} JxW3h4ܮc{CSN9]w(O (Cmf馛K/^x{l5 ivΝk7|AHLC=zprkifo*a ַ0KA-78g7~E-|MR5HVu?Z?c8=m]~YgGmRs9^~F?Y+HgK.&N5nQ:, G5=(~7%ǩ=X;餓c=>~OG{{=d}:y\T gyfE5lwP>}+'e{ؤI\ǻzwE+:Zkn@9:}ՍϞ={/~ ;L .=sZ|O;~ӟV;޺z}^qnnvw   @i.m=eYg?]y ֲLC kX]0nF}M/vef$͘1#c믿>cZȬB_Xf;Ek}Eù: hwæ=`YƧ0$g nut+In=.(cSKfϲyo[?a/  n*urDt}jJ7Nւ:Q+㺬?D]4+x 6gq  !H2Uw@779K]NFޞ=SÇ* oAZQR>Z 8 놿ۣFҨ0>'p7 @uϴk7-zP&`]y%w{q/'O)>s.NZVj9BRnlWgU7`:~jU"y|rưZQU˘!u}WxYJK|qVP򗿘x%_*q\SUԺyu\(HpM6{v}0(1SOjtƃ?|> ŇU?:7+.ʵ?'SaÆ6~yvmSϧ?Ňu\<? }W # @@@t [ HK ?@"&[nnZJz(+>n,%@TJZz=WGS׹OźmMּZ(4C ZLji%Ѧk76CКI~6iDSWV#kkyR"{8 ު|'묳mO.];ɓ'rs}ⒺfQ[neF"nzSi[z3w6sͯˑT/8#kuMtvtue=dRFs%B%W jA%WGUΦYrMmر,`;3#CA Q>joRV#ӲԼZR+xwe)P^x9-Y-=P})|^3Gt=0\R%oka+c_-p.S꧂qEnt%(PL>ϧ? PѵkI/xW58.d@B@@(]&?VL&5fbv6M_>fLC'=hʕ=ݍ\|GyrB>O$.Wm+oAET,~8_: lf&[]A4%7 .p')@A 4'\Rxzk℺P%`-I#gZ>.CzW75 Ѓ<0|ݚ_u6mZZv%Sw5w^jio4]#4sׇ̼{WC&5%Fj%=l뭷׬b[egU/_ǗO뮻FEQrjCɤ\[i؟({;/])C Qkj <.2?RO@EM9N\R/M@@@i5qUW'UO=T|4%pVhM&=6y]7D ބ'Oz_f4<.$cW_ڤۮY/>sgʹ3[C`ℜ˸ ݶ}鼹6񇳂?Zw. 9o=}G6UMLZ[װ`\uOW(b^l1^_JjpL9 ь#2;k[6]f ԨGO?t6k|N;-lލSd䨺{" jeE0Yr RbEuz5=VT ۽z: WǎbhXi)_ZܟR̸_|tOC/() .h#|cy7ߴÇuPfpРA< aC@@(]40Be\iѢEa`oav)?5G>}I&=$*4CƟvSG7ԧwcWy[O1 \oGKsǾg=|MЧ}65oA C2~0dq?:vPh:~3?~~AV?dUY6?Y6sf TƤ\J3τlO=VZip[lQP<\E Izfu_ok+fZ*w,YBݛz>U/_Ǘ.WT.D/s5 &tߨTu2 p [2rV[m57)u>(N(-Żyî @@@doΗMa(#~,|V߿_NZO>|d#_i}?kY6WG}|ŷAA#S{ۺ 0c={g|O~it{6oܘur7>u3z.o;,+Du2fSw! >4,cD#f+ppV}/)j`k/e[ 笕6ӈbW?m Ar!")suuk&SAZɕ\]kXkVYzVIoʫU1vZѮ5&]*4Ouy.)[L-SuӜˢ2痿eVPu]u׻sСѰTRw| !Qy'Z'ǧUp)O5Ǖzs[{1S_u|9R?}K=$ĥk%u.R_h+p*N TX-ut׍O?< v-7 3   P@+{kVަKQWrNG× \SPGH+/R_y}IfM]Vyr$Ӳ%m/ՌV={YZ7?\ܴjq+- oJǢiSnonȕ]ǫ 4Q)hisǼkK~-.sJ0.xۮ/yz?p@^z% .SݣZ(xf% :|THs Yޭx_|Q|}݂(.*gSƗ{nJY9]P@\d'=?Ы.]uHϥɇ믿_cI˩;ZH?\>݋9y^*ԂKz2M蟂?>lShk\)m]y>\~a p*=9sAНt.\D@@HhP #F05W/Uӗ3Եk|G> '߾sVSy:l+0k])g?*sNol¼ٯh6[g|ctpI&1W Gv& \s?xϺmi2{Cs]o(H Grziڶs/s li\uuېЪ}vO5D2~wA j?;3uqu3H I]TA.rea=.6jcfYrjVܥ? 63O^*uRmi2h}2̞w@rٴe\cA_},_R~"4_`Rjc)^W|__r $oq5ZyQ ?ϛeWަ|{1F9y(q)SϽkjqa8∨@@@h@E?ԗ^B֭[k8M<3nG/B9cJ4>Ty %;rǶ>uij ?\k_ @![[ r ;:}>en[04f9ofmL[z鹬~9Ֆr9qK&k61-JiE-=-v'p.(--=˾-6-8jA`6k,%A/k0yZgv]>Mo'+WSgSܸZG1ck:%3Gv<(%6ٝ/RO|5xꖺ}xU>u[o us!SN??hڟs(1!٪'||kq~tUWE/ݣoJ+}n>@@@< J|fVIQp\ /BdMSOM5Nyv,ٯwZ(Oz l76wiK.Zjۚ^aV鍍xSN֪mۂMqj־_fn>Eӧ3~<{|:hY:~*pgWr3ϥ,o>-ۦkv]]֮wv -K ڰO?+5CA=|C~mcqs |bh89*8ft^u)?LU+/M5C/.>餓2I^q35;tru76_)1 +͏]9rviyX\ql1>@L,X42cKuW^0@., ~VZ/ P/]wݕY?h~%   _ unW!bܛrnB>uQ-a)gԨQ,圖Ϟ{i;wԷ#<-[<Y7=RڴWZWS2h [+mbn#`UK%̙mcy'9[[ᄠW)-r-[0,ୟc4j1 9o9|Iq✷4'jԦsʪ;7̒4ou-<)c>/_n6۠~azf?j n:qlz֦Gq-T[>^xP_.}߷uY}Cb]R|97%~߄[kfF5dx>u5ې!CLM'[?H^qP < M(OnlR/ٟӥP7W\z 7hs)ǩ~[PIXm0$R&(-u^%n2mڴ+"eV6k9フ46K;W_}u4ja-nD1]}lD@@H\GWa6lcjVn|/UƪՍvn;s-"rNG^{e/'aQ7n֤5}XZ C=Ԏ:(;cǎ(+B@Wlk]ts ZO@M̚góNA/Ҕn{ȝ3[pAE~~ɗf|2;g1 IKAw'VٙYn꾐5c#Z;n~ :uK hUazn>V@[2ݺؾКU[>M*<3WT@M@F=r/ Ç/8nWoG^. C.> 6,5G+qw>pڵk,;-g}vփzS .r]gz)bn\o[{'!R'kso_~e;;hz YHE|.8Uw~{TswK&1zol=%YZ^-u^&N^L&3g54oHհ?(Z43ΰn->sLo~}wΧW.yw瞳cǺ}wy=;M-L   &P7_UƍUW|#]E/-{/k=~Ou3aSh#}9\$fJov!֜nfr ZX~VLʓU@O#Zu8hU`n>5wsȌSuMh\^mMwY'[4uJؽLwcN>|irvʙ+xHOjbʃ{mw/lk/eY窛~p[_zziѶgkXȾmAk#d-sDNm?R6,>;u`c/*H86}QzzeD˭?Xo{D󻁏0/}mm2>şnOYvi *r޸162OW[>1W@-&KmYx}/SMuYz@,Xx]fy2׵͘1csS 5XPg}YzWB<` Tv-& g:|ͨN[:umCa=܈g<|-۫C+uiJtcmŪ[~뭷w}-^ϔ< J(^Zj.GTI&E)ꡇnI~PW-?~|֬7w u{キ=SY ~OwI.aZ7^TtZ\GF[n-<\YխZ܉'_ǩTI>>s{'Cm;Me]֝'YR{<.qr>uG|_wGOkU ,߾x z裏֢9Ss 8᠃n)\JúQ+Z:{q>1~xR? <5\

קMkhQc|ſ킠!KKӟ|4##m7.oy^եM[kն:.TWeZnk>+*n|Y@ pBկ~%=48·Fn=Vt)٭:額Ըj5.-3zTy/Y$Sbm.˩nOc衦M.WzFlMOiISr)6Z7[PTwT/Z(<kRARs?J9}{S^/_ǻ^.(霜Χ:{ݿq)hH58mx`f,WkW9 @@@FZH93&d Yor$[Pӣz /- _|1mR89C YcKZRɅ^)'W_zcqv͕Na\Z.D=LN[2k[,6Ų؛_.[eLK; \-9:x>k1ׂ.[gNѰX㸋eTbRI14`Rj/]>E$>5 q׶5H2]tEaZ'VNRMo{3y{dL*_$'Y9ʓ"GR/sϻۗfrPrZX5[k?t)h=|0絴U%?.}j>=͕q6]瞛u|]w6a„/Tv!/X<:VopVΔZg}:{Wmw 5-|ԫ㫱:޵RWjB-J:wGc| oҖq1 m ?_BKDž[FtHr}d[$@@@l5ӈiU?FM>FƗG1imgy&k7&#|9E5gޜTG)צe-¶f5uO#S @@@T֛!       ^+'!        ެ @@@@@@@*@WN2C@@@@@@@*+@GeY        Ud       TVz6@@@@@@@@^9 @@@@@@@fm        W?r        PY?*@@@@@@@@x$3@@@@@@@@T֛!       ^If        @e7kC@@@@@@@ ᕓ@@@@@@@@ QYoֆ       x +'!        ެ @@@@@@@*@WN2C@@@@@@@*+@GeY        Ud       TVz6@@@@@@@@^9 @@@@@@@fm        W?r        PY?*@@@@@@@@x$3@@@@@@@@T֛!       ^If        @e7kC@@@@@@@ ᕓ@@@@@@@@ QYoֆ       x +'!        ެ @@@@@@@*@WN2C@@@@@@IDAT@@*+@GeY        Ud       TVz6@@@@@@@@^9 @@@@@@@fm        W?r        PY?*@@@@@@@@x$3@@@@@@@@T֛!       ^xͭ2^zY]]͟?ߦOn˖-ܣGpHa֬Yl;P @Zcǎk3fXCCCe޽͞=I93xZA9    ТZTǞ{iwmF֦Mftɒ%6f{>kQ)Źm۶n/wƎKuQvCmsّGi-ʘ@XqvubM75*pʔ)6yd;Clĉ@{l]v?FiƍK7>C s .O</^FBkֺvq 曫<-eUݻ]~֪U0SOmj̏@>|viaz-+k\3@@VHօXD'tBҺk|A!2OBTm& Hdk7xp :{=QK"5w=h-fzH;źoGkө5,>> 7RWs!G[۞=UkkXM>mO˞j%F/^d>}5풩M6+M hpom{\>=,)7hק >~APT!)4|·9 9r֪}fPT`sO?no.~Z6sJ+Y]6z̟ޅ?~mo2P9hw}wUcRpn ,hlV7"p14 dM6?05-{h-=dF z6jԨ)ߎZeU–Dr!PSmy̙Koy`jso)/סCK/f=W YIGrM7 :>Z+kŘr"  )>jB]JfRvFG T~Z^}z#͇-t\}-ukkrk;M؞:k: hݷ־L ho< ZZW_q=F`r_V!ȣmd~ь9_%VcFl;ԤLB!k[ Xdw2iݱI(à3i۳w=VƅZs00)>qRp*@ mo*ڷoOGIJgk·S‡%>}ć`"^qr$v;ux1GOu~y)؟[Tr?q|!blgj  Ԛ@t*',i7ߴ~oNV 4ϋa3_/O>:vhK^|E;2˗ѣG[n ʻ  8ӋΰUywr}?NKcS?znS썎SXjR A'K:\#sG+ ʴxt[xy'|if`TxjAdi?c}Mpf?̐K s欁҅YN&^"E$ ``@Ĭsoͮ 05֜#ꢘEQPâ$ 9ݯ;wzjnթsY+3f8|W[6뮻nJ1}o\N>lsQZlidI& W;Sܔ r?ɔ7\=˥ʹf>׌L)!@ WMsA1cꫯQ8$89_r%F*#Z6mOi)&oel1^ڴ۶mY,,\d#{l8Yd;Ց7 qy.TƝ> !/ƝqY+[w Qnt a͊+Lřzhr,uZ\~E1C o?3v؄F2T3)XlY:,fȥ)s}r?G7C @ G`V-[lO?4PHI@Nz'\=vHlܿ4 b(1a\ nv>$ŏ_ER @ @ P?Xc$~mR(g2 zl&Fe?Lصul6]vfL:5EQMw5s>xry]433Ri7e{ K'%CzX2Il~3~xO?uY֭k~g믿z^R7ݻw7r;5j(x*Lk|͍g'O%i޼yܬQ|fܹAy=mۚ6mn~ZicjRVMT+/e.qk.]Lz.+8rTﯲi1}e%U*~\P=\)rZ)K]|WeIq\AN4?ѴiS~qR, @ʕ@+#͙3Ǟr@[nmо}{EXWkE^mYge."8]'N4{yne:5\c^{8 &}Q3eBި-9<嗊͜O>Gg|Wnn6nl/#MniꬾYMg#MiwcҰCGp#SO 7So}L4fTE{\Z-Z84Oa]|`?qOy'3_xfIY[ג"E/)ݻڕ?ѪfC6ud S4hYs}̌aٷL._Z~ۙ#l՛5fqS56lK[ tfw9(N<ꛥ@(E-^EcwݟXg G Y8s| s"w^ %Q:zUP5Q{+YKL=ϗzw} ;yo:v^hP"KdD_|Es嗛[o5*vm-աnݺEU1pYbn;Qc"H4{?R^gYтO>+UY,=㾂oN8e)cm5!wws=W%*5kV %=trꩧ뮻.7Q)}etqw{qw]څ3I&fСfʔ)U?Q;dĊ\HϞ=3aR;"[ne87?%ߖE(Q87.a!9BMPǰ6dDc}&+@&L5}OWCnjc>sJ-lA3@kEt_f?]y*ꏔyŏF "RĒ8dsAEfU RvrǤ]H r[Nq%2jՋ5I6 q/7kɵ<8ۻM3v!˕اOX±X{Bȧ_\qG>#)KAߠ8ӦMm+E YBEXO?RPQo>}پ9ץwY* @ L?4'|L;*VǍ& ҹHqVŹLkKX~i3`&bxnewAB;â84‹Z GZ+c/?{.$sRfuOy.,ntO3wJ47ߴ۶Vz eIw4빣wҠ]{G_>oYfƛBJ+ނdX͘fSY Q]U%S&efz-%R];vi;._-p]Xڱ)$Z䴢~,*u̮g>L~?᝗QX>wZ+UbaOkZUz˸%j\|I-K1Dcvi[ݰoأ~X\k()LKy*E+;?,U.*ꏾs/k&)}IYcWk^Qx~*~HQDa%,YoƱQiCS]yAVT4V{ٳg'X.Ws,Oyqwٶ /˞/Uڗ-OǸG?X9_>yםƇR=z5W)DV٤*ٟQduUv$?u]Q}Y˗p{8B @)JNCڵn}N賢mZt v,gڍ-~Hc…n竮*ɴ#W L&_M_%%O5[6g|aO\f=}X0|$: &oe}12].4ӺOfW5WxuL풣xa7-(G5Δ)>s?,a\vQ_zҢǛ'jZ۴=8SI3@);cw}׷;s}S6L]kǓHCV!!H_~%Lqe=B?T:uTn)|Eزn`w~>'1vQe̙ᠢ>3|i*~膬@|=?q(S^\G)zйsEZ4YEKUz龢uW\(ҡ9ڋ\Xyꩧ|%/{ R8o?x6Uj_/\OG%S'hQ[\)KWj_.|*W`U|~6.eޫDGGi6_~j<+Rp]C~)}<9 @ P TC=P2ë?:SLqk/0#G&.˔I9䐄ݐ R)5O\#筷:֏n)QLEub'5!IWO>1^x=<9ƭ>]I*~+Z +깃" ^" n{챜?l_4Gjd[.hf/^~9rվ,|qK/'BLZ\y-vNI]?HU~$~0u_#ai9 @ b PP)}"Bl/xq+RV|nѵbwDF+PT]NKWdFevZJoF3j(7Jg1uJ~uM1viugX3:|QsӨ`3{ٳ̂ko[ܠ$Xil%U"+3t[n5:c*9mO5K~bM,*B8zga@^}&%<%.J ɠ0D~ȜIBaU + Jx.e)nRWd , >NǍ8$ou׬k-[EpjLExb]Rcǎ×Te(&\rIrg]ؼ6jȞ.]rʹlٲTO~[=}B=O)TsyO}}G)|\W=U.0SO=5I Pqq6HdMו8/?E0Yp:thЏo>~w}n8 @ Pc $X A'(L[s%+3/"KXs衇dF1Jcʤ?>F~&?rYI' ˄hءisѦNSݷ?Fn}degf۬ehp ,ut:?Nݩ!W1 a>ٖn{.tu&@=LHŢf/,w0=1 bq,>vb,S?kpZ@URY;wnIC ® =bBw1f#x2 Uŕ8Mzy:ƭQiF/Tm,i}žl/82oE\%\m_*˧TeM;rwϥ_\q|}>rʩet}<\{0ciG~ٸ3X&iFn^o7MPDzTOnl%^: ha"ײ0k,Ӣş#k:?9faBmW)%vN'͚5 nShׯ_K_'UѾ:5ʴԩTN~WU.TE?X]-Wհ9gWS=[iTȴFk福> @@'oCr#?DIqL^f6C ZsG4V.ZhZt})yG*~Ho4_|U?BKz2۵:ѭ[\I}s=7V6mڴm۶{EA H'Uݾҽ˧Ŭ\{\劫}*WO?X 9U]tQ$eەӸꏛ{,AUN9 ?  @ ? M2ɨQ|,rѿ'N>0  /4n8`#j&--BTda57Mn4,:G|IDU2\ef:7ۯf7*f)f%~^Vx~iX~7n{=m:{"y1>sIui;$*Y)tE=:xu޽&l\'ZծH+s6c⌻YcWO-]YZ1co㦛n Bde W:u^=w7"L[Q݉M7… QJ;w6w}w'Չc]^6x3*پs@>=uS=rվjqK$~s6o߾FJc~?\|RHX{_Rɴ6ߜtooe͘n~lrT^fjt=]Ǵ}oCϘ\hG(TT҇[ۣO4xȴ=8Ӧaqyy~4qJbKR9B߷2fJP:nY`J\ㅇz(ȸ+r5qkXZje'D.zO8h|Jd̊+e\^zixLoԨE5i^x kc]wݕXRJ)L\ǩSIIOwm7l\K=T=uCÆ 3]v NugJ S\{\劫}*jL`1L-7>`Ms]w]pmOO?6_8tPGm7nxWswqEV  @@["l瞾EDmfM^OX >WorMǼvUV )yHa7w^B2_9M.]EbeC&ǵ*s2ny7|EН3gG6ml+U}b@~ ӺNv :b>.;+7S?Dfٛx$u#425wǦt1 Ǎ\lT,[j&?gm䩔qz^lxn|6iYhYS0f03Sz4cx"u}9g& :m:U=w0κ >&?|7յK MIc-ZI6s>x7^T@Bj܉]|kb {;[h@oIr1w&M Ϋz*)Zw$ Q 2xU{akW_}5tOe[iܢɼvS%5kfB4nӻ: uyk+QU֮l!@ @B"RCXq~&HkD1 ˆk;ULi&2Iwi'Ld:=ӮhM`%!~Zy}A`}gɘ_~%EJ _Ly+?ŋ2ٙloN}1nWx7ieΧy_~lY\ۓ:Vqb'Dg\$*\ ?#75u«'+&psuw9 }qOp~š&C٥ӧ3f2~~f[偕+գZWxy;wgtI d>th7E4\St s3[,|u=w-qdA;`eArq>2J}}QY(j,[2;.iqKq321~[R cرf}5@E(Q=E(n|W\qEEE;4ƨ#s߯ssG$ Rl嗎O+S_۲U'|smqؾ3 QlW|^\]iQs*S֛nPs\՟f[oXgLj4>s +j܃@ @('XNˡ,;S1bDғr?#вeK뮻7pCՋJO݄2I =z5\ӷOGg̘Q~( o{f=v45KM5ySkA/ⱤbK')L|,3ƟԮl*& 뭷B&L]d"k rk"h"%ȕ8n\K2-p<.,G2 -iM;RևOsGP;5Wd#'ݻw-O>c|W}]^U@ @ @ ;~xJ4Ç.!bA @pׇoĉR2dԩ?~|  @ $4i={oa@L;ӷo_3hРR$@ @KW-% @ @@׮]MǎMF̔)S̏?hh@ @@vPȎ @ @ @ @@QKQ~2@ @ @ @#Gv@ @ @ @EY @ @ @ @Ȏq" @ @ @ @(J(g!S @ @ @ @ ;(dljX @ @ @ @( QLA @ @ @ 'bA @ @ @ $GQ~2@ @ @ @#Gv@ @ @ @EY @ @ @ @Ȏq" @ @ @ @(J(g!S @ @ @ @ ;(dljX @ @ @ @( QLA @ @ @ 'bA @ @ @ $GQ~2@ @ @ @#Gv@ @ @ @EY @ @ @ @Ȏq" @ @ @ @(J(g!S @ @ @ @ ;(dljX @ @ @ @( QLA @ @ @ 'bA @ @ @ $GQ~2@ @ @ @#Gv@ @ @ @EY @ @ @ @Ȏq" @ @ @ @(J(g!S @ @ @ @ ;(dljX @ @ @ @( QLA @ @ @ 'bA @ @ @ $GQ~2@ @ @ @#Gv@ @ @ @EY @ @ @ @Ȏq" @ @ @ @(J(g!S @ @ @ @ ;(dljX @ @ @ @( QLA @ @ @ 'bA @ @ @ $GQ~2@ @ @ @#Gv@ @ @ @EY @ @ @ @Ȏq" @ @ @ @(Ju2WyfN:iӦ~*+W4s3E"(*A ͛GTTTCq(C P A @ Sys=gZh|?# 9ɟgH  \ ԪUˬ:Cf7 64̈́ ˳Nz50mYoرcn-Z;𕄥 |盙3gZo[yꩧ{a~7ӧOW[O%Kif-[uJKo4k6f2sN\IJV[me=\?G67|sɔK2 @ Z޳e6 fm/hù΍s>#͚4u63Jf٬fw9oZisS[īUN*V,7KO3nhÁF66W[Ϳ^dY8]`@<:@IDATdVh/nW,5|Y1~  2 pM7>eI.{良R4hҥKd<)~5m>cJ&)Xb_|a8 w=|fȑ#gmo%2_tEwMSȀٳg-Jv[3nܸBw={z+,%piBb)r?)+N%oOXZkU2C~{ !eRR}. @@>G#8y:-Z:!;jk1ngVkdjMM='fN7u62HL-5x |}kk,db-WK Pvj/k.-?\*⊴q 0=W^R4ükf3|MR 70(#C"zn\ӤUVfС͜9s|Aʵ\6qn!H Kqɕs{wy @}ߙRB @NcȐ![n:u i+8ϲbcI#2OgcfO~|]LzRm`fYhӤis13dO33ies1SJ!Tɓ'ӧ'][la. ~nĈxGeF\?ҹ}s=}ekB;_z%ܿ^;/)nf{NdAwQj|\Z˵\Nr2x`_QGO_KNd/ݲeK#H(R*A\33 @ PS ?lvqǚ= Vn8{o5SFKSQ ƛt1m% k}e qfEn_͘fpJz9JӹsY:K+W9 6,)=մiӤp +Vc(wyn:r=s饗[haN;4##D R>|xh܃@ꪫȅXbIZJ4JzXy6lR q|{rҽ{ /OJn0;w6}r!2,A#!A @ @UǖSXc5Emƴk7U?fSx*9X;L4iy|)]$'4ohaMW駟;cf͚ĩ '+=W0Sxجsҙ ŕ+^ljvVXn&=tOB\. @ ~۷߃ʜwqAŞC=\'sOѬY3s$ӧyUgh!WX~Ey晥KZ{Ŗ| cC8aÆ~zE(gϞSTtUMf[0cƌ*mj2묳С_YU*[./̙3+b뭷omK3Wߩq+U&r\j޼i۶iӦF"}W?-S.ߗr@ @j%裏8cM"D&V4[oQqKO .R85\c^{/neMb?#.殻2lI )h_B뮻y<(OZ/#FO?h!!Mz棏>ro_44h.[p鯼`LN K@N;'z V%O70Gp힨T&]ve楗^2r'Ss=FJ3͒%Kl[l9]\ !Ŗ8,wrf IJfȑˡViժ'A&>`w߹k?>UИU_|9L}lj/~idZn׿eo?lXL81|;k}~:ʷD&XBoN:j~I'xWAN/yg}ݤwP'βƕVT@z,S(nY SNošmyG:l6ҥڅfYtKOr %hhqK+6FG戫ok)65M4e>0MVNtOhm*n۵Z˿q-RYIFRؼp-@hQ9J(.̈[9vezQIcǚߑO~R&ZqK̤諅.-E;w}wE/-&=(][u1ezZFd%gMh'4zJx\n?+H*M}gԶRީ=\(,^ IgOL )c8ک?1Z1{[jwQU6OeƏjNo=3¡X͛dCs9WRݣR-YLn]司{\=W9T7G)TU}vϹ,jֺi7?4;Syi~8ͿƱvl&EF @'P~ԡɶ"E!ge!E(}GwgT5W&Ҏ%d׵&5@$j!W&q} *9gko5egY`~܀ hGtEa-…2&EL;HL$.h׳,e /_ͅڄ 5´Lrw&-2ɅEZXR:M4I_D,R7?)3ZqSNzm4&>|%nzV[4CǪ& 8ƍKfQ;m^9ʅ#*i{n {) <:ׯP>-Ş o$ qL8߃)sy q8ƉF(8c1ry4*~׀]tI(p[q)&Ϸ,+w{ YY[eun ꊧ(ޛoSzW_}u̐S+Ĥ{nOQƷz)s^g ڙ}=N=%]*gmSq<=7?Uu^'rsiz͊mW::ujg9+T6NTWh_qY _H5,TDU{>Ѷ ?䓊-үq<6:tHhqqbWBN;Z~whvDE.]NcrfLʜl)IuL5ޤYkYiqf"1{ G@_SSvLxJx 檫 ,$D.d%o!ĽL:wkvY=ztp-8P)U0O)bƊJU0x of]嫌r [uᣧpqKj4"a2|kTӧO7boDy}K6eEFSO=2PvkGx&k>:v|qAe[`4cEVVdlOKkqd*@D[*zد_?ߒ{6Wj_98q˝OyxE.d)J>G/?xxJs"_0aTWO?o/,*֭KȭM؃> @ PP/RM\xM%K.5/ȑ#SE+ĕN\p5?]R-RY&p3 ip& ׻un?y.D C>ǏU޽7J20ÄdmLu;DE=͔LJ`?2CB!G7{J-WoY0rS5nâ=ϻqu. VIB ڞHwm⸖bˮ+=XZo6^N;jLD8qg܅}w&NDtP\NqKʶVFa>3{p|Zk凫?s qB ZR BW-fz;ݠ,2_W;ırw$(~p)Y:l1G\Vm.AKK>H(v:%WJxqKYP[$hu]gyyls6&֤,V5;&$WgHڴiavW^ywP0. @ @ gU҇; m埾26M't#uwx*m)hx&=OhsZELRߤ0d[xmxLAY yw`w`HdlưlL f&s}]ki}fc p@@&L`=PXeEŠR wAY]ѮpX"vjwqG?v⫏/~ˆܝyD6mZ4tRl e/KwG}d<*lg]iw}Zx7{'7`$q-V~'{Z飛N:w/ư~i-?iT Ϧzsi6ZKgѭp=Eh:KG3SleqOJg$y\劫}u\3fz} $ZGRY=YULnempLW)xTX_F˽~63Y:ƆVR)L!@ @ !\sMsYCO\č]S3o[҄ޫ Є̜Ι3hÕ(+"s) Xc^fM:'=||Sw -wLYhp. @ 3ƍSϟ1dD!iڴO?Կ֤TѫW/V(2 ~Y"СC7k,Huү_E}7 oEIeF:?Yd9()̙3uN^:ti=)?Ϛ55Ěίr ڮRJ8?ٝNO; }Q2KWt2=N.*W\+W:qܼ蟬i@n4hDS,7uW]uUsGSe*W>am6l0 Ԫ[ϴ=椤KgNt!S۱S@ 옏 w1>8_9#pNOǎV$ӹݕ[+m۶ G-6 y:&.>DXj~FO/rA=z'Rӭ[ }.,2ޠdѢE1Jc=ܨ[AX69v*됮Cn#s'q]ػr=<C}XDE]JCvfO?n{<)'rʪy)~h@ @@FY&5jEG4k׮M_{[k^nc²ΝSz衑;MگY*o3Ÿ'uVMӭQ9B@dk\-_=ARTU-n3CJȧWEi"w\q{\Rn5E3Y馛`YJY 9l}YLs%Dv|Ӹͫ˖-70)$xrq1cZnm@ @!(D#>3bUd51/$O>Bظ ٳgM"iL[SnQ3u]?> }vZ@2d?— iԬ?d7}˘ 3vǞjC UQ;P)$=*ps(w/+{?1¸3n$EJw-[FM+#zG!^wZ [m6lڵk"H9UN{oJ亸ۻBVF<۴"?6|K.0{587On.Ix +.Nảr#%!lǩSIU'\nF (_9vz ƣ=VZ /|'r@>}U*w\q{\R8qxT"V4PݚJ>ʛ U՜DWW oСp,э7.Zn5gwwa5nB @ @ @-/(_>D;X&GeBD 쳏y40w512&^T;d^m$[.cwW\a%֎dkz2kK/mf̘1 i(/Zt &41Fmڽyӭ5!)1G`V1/)=Urlx޲fi/<sYUI/<,kLnu~}Vt;ʵ\K9 Pl!Rn(!3<ӸoeZ_O?mo}'g/ 'aZDU?tk)Hisȑ6 . .ԿuN=T裏&7@/vZb,LvQX s]ͳLkG<\7smTŏ:(h;]p{UmU'H'K[?UebŦE3 6 r(%Tc R'RSՑI&KYW_ ꈾDKYL%L)/JY Y V(.K񑒌;6jQ b&Lµ&VfU ʧߤI?H~mԳgOoo6["r$7x=>|GNcՒYwR 'rlݿ۠{(W\+.qK鸮A#"r~Yf3B6hNrҬ̽?{#FcEg7NP*SO7{=qq՟pt}y)n" J{.C\EC)H @ Du/KJeɒ%ᠤkMMG5!2Wt 6pεX6o}כ:f>J;jr]J*~ԤsUZW3u6ong4"AC' wR+lKV-$D0@5)Gq嗇#.-=$E)MF@k޵H*7-aÀrL<ȤIZ4?!-|( nY+RqENZB]ܖO:-h.Tk]4wwϫ*?;9ϵ\z7XеgLR#!ޅY%({?1СwI!F:.}ώ;]h ڗ\/4_u\T CYSHKM!W^JWq+W{W(M'O.k)P ͋ND%Ӑl*=GW*ƂZ+iRѸ2*٪vU| @@1H6PD#!I>Cf'SFa7*YڙEL"k>?/$D׎-BuQh&o!тv؆-a̟??=5Ѯ0i}\xQR+/3G:z.]|{o_k7JsGhal-)\Q˦\@D+&8D}vտi?ZvgKUvBj%tG%8∔ n鞇Ӓ9rwng+{-sR4d:])~?U>p@_#Z銛vv v{[RBtz+Ka&,U;rΧ\* i7~D;e[n]aꪭC ڇgc駪6w_ߒTRJ?6/u>cU?Pn_*wisO#c\TZJ^vw}~BYPR_RՍ?z_\k{\o eq+)/qw'rwqC3,V21)l&:h&gqR(L}F}&|eUX k@ @HrIɰk)Ȝv6;hLk@.V5ѣGMvpv Θ1#++Sݺu}xԳLmi 2G.Y/ d=6r !7A FJY 4"\ZhJTݻ َ-rHWldL cnʜk[l?ZuY˴TUL͵\6M^zk$ YE@JF"!wZ›vPUP>ΫސLV?C]cʃ22zy"~6M S\;-W%% k+qwfR~Mgԏj\oVYosHOJiS|IY%FgDCc_7aT| @ Te!ZѾ[9眓7d<\D5'88Tv @ P]U!кuk u$W_}4hP@ @(BeeIb?Q$԰2@W @ @@9aÆVZT.Ya{ʩ @@Q[ʐ)X%*_M&=)nRx8@^3tuI%3^xaBXM 5 @ @5\#kΝ;^z.Tv);}n5e @ PJR}/TEŋ~e~vKR} |Fês9l @ @8SK8p>|xMCBy!@ T t`***_|af矧koĉR2dԩ?~RUA @ "!0i$3{lyLIFL߾}͠AJd @@eԲݰaCӱcG_{M6VZF.^>#ɓ'Z.p.OB @ @@Qڵ?OרQ#3e?)! @ PX%QXD  @ @ @ /tR8 @ @ @ @(,? ˛A @ @ @ X +N @ @ @ @%Gay6@ @ @ @ +?bIb @ @ @ @P(,o@ @ @ @b%G8I  @ @ @  @ @ @ @@P'A @ @ @ @y @ @ @ @$1@ @ @ @ PX(7o @ @ @ @@#V$@ @ @ @ Km @ @ @ @ V(Ċ @ @ @ @@a QX޼  @ @ @ JXq @ @ @ @(,? ˛A @ @ @ X +N @ @ @ @%Gay6@ @ @ @ +?bIb @ @ @ @P(,o@ @ @ @b%G8I  @ @ @  @ @ @ @@P'A @ @ @ @y @ @ @ @$1@ @ @ @ PX(7o @ @ @ @@#V$@ @ @ @ Km @ @ @ @ V(Ċ @ @?{fE3`f9) "b\1 &p]VTt]/fU0-HE$ǁ!ֺ޹3SUoWu       H,$7K#               ha' @b #Y %@8HHHHHHHHHHHHHHHKHHHHHHHHHHHHHHHH(Ie$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$X4H,oF$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@F (N*#               Gby4               0JFqR $?˛ Q40HHHHHHHHHHHHHHHH hX,HHHHHHHHHHHHHHHQTF$@$@$@$@$ \IIIиlK#HHfQ$@$@$@$@$@$@e@zIku5gN8Arrrd˖-2c JZS,2i$ݻEAA̝;Wپ}{R;VHHM+}zs1b:tsq'N0Aȑ#r7K^^^qW)7'=o}jݺuҿKէ@^pIދ]I.z2n8IMM;vM7TU#EU@:U˟HHHHHHԺ_SvdѢE~۷OҸr{ ti۶,]TOz 8ԺRILT)ڻGJN|UjkoܓzKzJr;M>Z4ߕ U{:_%UJJj-:,n_KY:Z߳!Qo}VcnVcHJzHn*k?${/j}Δڗs)p$۶U~}~ 7-Om%EJsrimpHyoÅ7e{S\DY)jL|d֬))ir׮`o@vN*Ʒ |*̕E߷ íW_}%cƌ 7{{eˮ_m80C1عs{.]dX+HtMOQFlIt%~СCjΙ3'QG}$Uw7ȭ*_~M.{=>nJë*M4Q޽{mC5\RM&?o+*4i*9vޔ4)WdVjRf-L)_xl0(W񇾔rb)[R2jXmZ#RґQ`Ů_J9KNȐtkJeD QGJ-S23i$j?U6YF ^)g#Y^})6 HO$TIUw%?Ν;KʕîhI00EdZϚH^z%;lL~~\ve7QRlq'mڴ(![d򿽳(MI}:TZ$ˆ MQewI֭6..>|kp $x_5IsźMe$@$@$@$@@jl[E$P |uLK%vԑۭgz*UwJ9dK7}~:    E?fkITܮTv-U{;uT˃dcy<B#]GeϴTlʷʾukdCn$_yrĚZ&;onL]ʓ 8W4U\ҷo_:u/ v. +xWPH B{%$[}Kiof;v +O>/G-[yLyKe[Z5iڴ\uUvJIIq B۬[N;$x_MZ .4(]瓭!2CdE]{ۭlyN?ɱg*IZaSJ=x@ }/O;IJf9~# '6J3Y% J`Ϟ=?_/ L+Ա;Է~+_~L8ї o^y6WHHC@IDATHHHHHH.Re%;v.]b^Z>sپ}{=qhy1{QFr'J-/^,_,p^X8w41qN+T EEEg]J1Xa8bcߊ+o_ :J*ҪU+Az-Z$hyf.6ܞ$֗!5H? ߩXxэ?DYDmX_} }J*h-9jӷ,oݷ>\!#Vϗ;wwύ֭uV$hiً77K,)n{Ovv?'V>\SzҲ\x[j/15nɓ'_o߯m!~-X@&1}_5՟cnbg~*q B\[Ԯ]~N\~:WqbyIv%eOnvo!    @bC7q0oi~ήBJPBA+fڳ@~kbSNo65/Ν;W3gNȪcᮻs=W6lʏAJ~aqΈwe"O?}$=l0O-³a09cdԨQҫW/;<!xv`c):tѣKk~"㏷Cg<޽{~;ֱ?ꁱ=.b=XLG}zi;h}EE_G@ M_cRl~aiٲeg @n喐US9D}];~A.r߿~Y<'qb7Gϗ: j.vo=Jz z3e'J2`pfJ>fw>Qv~Ib *V~UiR*,˞?HVmlxa}vyŃPm9owj|pYӒW4@0999ҤI;K͚5oz~#0m(̇gg8O!`Kޓ;Sx ,}QK1O{gtŢJ{kp ە<:/K.{Nee`Z;zt r>}d֬Yr 7o"MWeP,tcIws+:u$o6Z}LT`n&ۈC/aPȐ''u܃p̀h}5XlC2]_κEm?ІP׻D70j]^C$@$@$@$@$`@0Do?R}@w4@u<` wΈ4iR@e܁B f[73&&u ֶ=zxqpub>Uc#Һ8D4rp "\(D LIxZqgHmeͤ\_{67^= +5j1-4)'/ ? ?~g{3m!X?^.Bx3!??ƌ`VzOŜtCP/A! H>8 ?*08sVpwF Oyꩧ\y=l2{\r*]vfjB_z@^d ia>(뮓oW! % `۫W/륗^M6Nhz7|J2CEN(N?DȁcJ=cj?zS4.K|J%7nlA(P% x1@yݻ/ V wi zQ]zӮD]_zLG۟QnvџM1     1tP=*By肏a D.O>dWSL\C>Lp?B72dm,d0Lڴicv恫|+LQ*F? 4 ǚjm_Wiܸso߱٥ kp>YmV2U\V^d)W+_~M"gw")VZ3Kg^v~0 loZR o0^d ZuL<9 +ƄHׁMЎ<ɨ?L#b<%h<=͚5;a gga^|<`(/pu $':fs=*YwgyFWsΠw{?0}Ĉ#>S^?^r9 !l>å,\Pmz.M1g40:BxH8G =z_PyLKC >GJp>>%G$T TNС=8}.P6'N2p!2:=4&c`n] ?[90\e9駟K~{5wSUZ@?hM=wmW/N&ףϦ/S׻)&ezG6ʼnzHHHHH'P?3Y j`D2`%zrFa#t`c 8qK );^y? }_|\hWB`_~m, oKcq`fDvf)U׺h_M9]=%oG.㏴ YR]G)?uWSkX&뺽kVEkx`{܌?`o N9]{矲 [z$߲p\Oxr+}WҫJϖIzl7$W0Pn10tw?R0V Fh%of@- D/;Of < Ԧ/]x ?^V0U~?]Da/7ǔ'V' 5ߪU+*'4uɺ?#;\BB`o2LM`u+}aVbŊK޽}=.PauV_bj?h(m]tKKĺw:8XH8'ams'Ty}`LG4ez־Hj=9&K$@$@$@$@$`@B?Oj@8|p?̝zqD}Q\} 6ь6S|LjU?x ]4C \; n[^[T d=\ GbQ^=9tEda]8`Ɍ3hf2fy~ԏ1&`XGBKʉ3dӭp6 u\ː)& '!\جS} iQvxjܥ>PȗxsvU$Y5C}GIާJ3$Lza8ᇪ!“n֪UK^|E=tbWj cߌ>#ʡm[dERM{C2VvndXa< !{~\f{ЏCM|\O )ڿOWzaT2MO.d_:vLȷXԾxKc.t_7]ٮ*=_ȇJ'092*4)Xr?Bk?YYYFnڗ3HVNӫfU/?Oa 6ш)>Dӆpn8.q)yϙOmG{?ɸD>} $GtO!jbOhn?t6u_5՟MLK?jFxo=xZ|sE=`ꫯ Rd C$k_umW/ވ?L]戀joz7ŝzHHHHH,߿ V.059U: DYhq<\7o:hѢ=Yxii^[9y/[LH0 }]O/)8po)Ç>,2B؞>~U9'OՕcr8CR;fZE$YKٻq{O5;Y"18}@➎vih}-ݻlz<8 CB5;2R|ZF ӤZeChI(# ? u"0oܸQ0C.m۶`P"ޯkɒ%QǔArssmuv.u$0 $\[2x-Ph  K/aTw} ⇚<>H~h]^J+VxD\w!xZUз?L~D%M"dnk$O>gSחSB}Jn9 @Y$P 8f05jeDLux3a AL14΁@^z%W`SJg,czҮxCFM6.S{4:T|6rI$@$@$@$@$9 رc#e9SzL`QqC͈7uڕOOW'1]M˩6 &Ol!66fvviЀJ{v4̚J,rԺ`<9\㣜'֬M]GUKvnAȔT˰Rjӷ`YޡTn=Fd? Γܪ^%uZY. q{mgI+ڻו uT.w#j@=w owܑigu5 A fgC? իkF$j9#gϖ5jQ ݧ|8qθJ4.]g;w|9s? Ewck=$ɱǥR^j\iϛ+/;uKޒ_om` H7E~2YxQ?Yп,YyH9r`C>_Iݻ]`xI#"\y{WZli4W˖xWpRӤj~ŷMc$à>ДV^I .FXu"={R;_鉨e 믿n?gUS1#A]'*:r>U0 k}۽{S |}&%}x?P;vO>DڴiὊ/ۉR $^SvFԳ}m'>U-{YYYO2o*ڧN Ilk ~^ӳ[W,XL0u_5՟u=MdX~1 )'|`P !]믹_(nx 2ey1tꩧJv*#.]B0 fĠB8>p&m[lԺ`U`9gT=8^ Φ{eː$ˌ kЯ`RץbֲgFzXb{TsA 71plۋIeᔃyeO?:ge2Q=po'>riYx\ idٿW`eVQ}mӦDrr7LF3I>ovIPAj[I?],tJH6=^uLts=3fDgЫjz}Sm_ن}p+/^,0` Rgu/.00ٿ#8|Sim׮]Rre{@?\ݺue`Fy睂Y<,X`ckgAP!0 @+K,?\RC -^tQ?Æ ={nչAsf]&:~76,x!;<9餓|EY\}N|SʓlP+֥vMvAdvtn @ wƘHAaAa9V*g cVq(bН3=;w,-0KmN O?~i1&ڥuA( }cQ%ӊ8F "*%}Բ I+dˁ0 q`|z^ٍs)=eER ~JC)9]Q)Qcսqx4 eU00qpDQB&GR{w_Wx_EKLP zK/US}DLu ^mbf~qI$c8N*OCUX&ez7 &&ڥ(#dS׻z)eEPHHHHH%. fᇗ.%g쇋E}~_-iH@K[iΘ)N5?׮]CAѣG Bx رcmzQƬPgP@K/Ohy+M/۹3gڳho-'xYƹ;ad dVؽK[ox8ߟ7*vDI*y+RdRd_|%g*\0 ryeUtqg~ xFOc<=Xy|MqVz8'0Zy_dա,GbfF]3m[B9s8Y2"ɛnd?}OsU" EV -hU+U" xQ?{~u|qYg%z!{0<@w}빋6?SlxV=>gY3h W Q @`|VZe{@wGxPAh;xxo.H Pe˖v{SL1Y@9s܆3x>}z ՟7 xkꪫl3:b3o:ˍu;vꇱP: ]&h =&WM+{ !dFPHHHHHCS-)SnҖr'W_}Bf%vժU^zҏ;8ۻΚ56^~h eZ?P&0Pxpn211w2oS*4l,QMnvp~eT; ˓KOLܺYv|1] #xC e=0 N:kFMDzw|̘1~i                d!@>4hw^ ~;A$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@I@e˖륰P`1~xiڴZ* N@$@$@$@$@$@$@$@$@$` dΝ={VO}$@$@$@$@$@$0)VIGV "               0J?2               H,$7K#               ha' @b #Y %@8HHHHHHHHHHHHHHHKHHHHHHHHHHHHHHHH(Ie$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$X4H,oF$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@F (N*#               Gby4               0JFqR $?˛ Q40HHHHHHHHHHHHHHHH hX,HHHHHHHHHHHHHHHQTF$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@%@fi$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$`?2               H,$7K#               ha' @b #Y %@8HHHHHHHHHHHHHHHKHHHHHHHHHHHHHHHH(Ie$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$X4H,oF$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@F (N*#               Gby4               0JFqR $?˛ Q40HHHHHHHHHHHHHHHH hX,HHHHHHHHHHHHHHHQTF$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@%@fi$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$`?2               H,$7K#               ha' @b #Y %@8HHHHHHHHHHHHHHHKHHHHHHHHHHHHHHHH(Ie$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$X4H,oF$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@F (N*#               Gby4               0JFqR $?˛ Q40HHHHHHHHHHHHHHHH hX%*UHժUTvB  HB5cI=tKnB        ҃ޒH3ϔ[oUZh!iiij*yg^92m493|:6n(}˗ҸB$@$@$@ffiF9[ʆ dZA۷\qvMO.'OVo t[N/?cz }K8 #FCy. &Hvv9rDnsLuի˸q;v쐛nɔj!       HrRy4EH஻W_}U F=d֬YC`T2|pW:#PRK%=3Sh+Y;1('aP6Yԣk|W^$TG\~dXZRRha9u]j1% ˻Ag[9F9z+zni:1)_gXfCgRL}P>G]m[G?p~ђIXVRo~?.'׍ܞQ9\/[yS7uHͤwHf͚.G{Yy gϺb|P'YΗ\!RJ\si]Nܹsm͛7;w'6 Mo6N0su&0$Q2i$5j䲔(-矗YN:$9KrG) 4uСTdmLi?:|z \63[I$@$@$@$@$@$#9C?%*(-#] EUXv.jyc,"ǐCVp$kwȁ왖ב[]ٷn,~hٍ+\0OX3qS˕ӗcYVt -bKy$Jf $=Ԯ]ۧ?VZrڵk}y Ki\Zκ缤wH+4S%1xH gB$@$@$@$@$@$@$@$#kW |Uԭ#豹݂FVؔ"GE߻ݾdYx|~%CշJ*ҪU+9^z@٢Eo͛7:/1 xh޼ ;/Sz*<7rjɒ%7wuڞ[<(+W[Jwq/]1P}}TVMϟ/;wT"Z}uk۷G#3m04ûxbD7UpQB H^^^#~gwիm/ZaJL+@IDAT+T}o]9.G#      D,y홸ݻeڴi2fKSN9E&Nh4)  &?so۔B&M{'͚5L;GQQQΓu_̩ya`qgF1^oQnVcW{Wʌ3vulcJ:u< <8/#l{Q/kFQw0fՠ@Y\ڴJ\zB6$bE) sfyv$r* ~o'R%·n`v WUH J@@"ȑ}{pT{VG={NO>b)m۶R|yB;w|a㫀 &O,0Ur… 5j=50`wˊ{{ nz{.?/ԓ]8pJNk9sqI GYRAlCcpnJ*>V\8Ws U=[]w%{4lЕ_}ﮦ夓N~Vz㷃 )ݻwK;cdԨQҫW/9O2X1q}Pvr^~/[n y]$yW}]iڴ=~A\̖-[lrulW F6 gy=9D'׻vb% F4j׮]7<|饗ʋ/3o]CGU|܁ |}.{iJR b5>H|H A^|plp>0 Q:5ŕe̔b dw>Qv~mdo*O1M۹;˞?HVmjx%NX7jo~m;1c-%JXKX]0KN=(%uZb/ aDAФO>2k,g3Mҭap>=gyg4W{jkvz$gpg;l;Sx }O>i%j`ݩS'p#oԩt|Ѧ-0ر#CC`dL.>)1u}SV<;>׻^  ^}쭷ޒ~Fqj=Yλ~śn6S% $6lWK㺅gP%wS9qI$@$@$@$@$@$@$M]: !>zb \!c~,s-10 ܕ`3Fңy-])0P^2v%?U:>B68 0e bC<`Z.3qY}>"-!ŧaӥ+o @!B!`Jӊ#=;G*l+X$-o&s5`׮4$ċga%01F-9斻F %F 8 >쳨_wuRgnd#Z/k6?+W^zI6m$|6`3GkVZǏwJ}c~^6|JB8 ?E.sﶍ@~Wnݺ~`6͛7OƳ]t6%;qν?q[7}Q²ˌnO{0^x?]2??6#ܠvIm. xI8&/Ѯ'k=8׻uؿu2Yλ_~?i{QpTL]_ .Ms09V6<HHHHHH2m?aǸql0;Ȉ# >b)p *x@xч.مjJ߹ޱcGf9D ڈ]1-X='|dO2Ej{@3ME8묳\:0k0TQj!Ǿ5{ªZfR ʋ,j{t{Y*6m#SIIϰBKQu;ɱ۷P2a_|{8rG =F\vx?Muӹ}G"SxpOT4B+?``Ctիo& WeGXޝu ]0)%~=ko`F erhM xƫ?GˇǑ @Y!P}Å }ĔmۺCH>7o0Fh߿(圵B,Wm; ?A }Y%.K~ <^6lgN%0ymAȞOO<62ؼ7+HrhٵtTnVxO;wȞ \ qEчb1H7N$߱)qoXN9r|[GFjլ]y]d-Y3I5k6㏃۷ʆ?| ڗ U}qٵ0z#{/}+9' *4 x8 Y؁&?vX*9:;qxnɬQs&X9W=s?g_Jw#ECR{s^Y)#HxG8zW^'4<$PXݻ>$;B=C:yG<֙x07gyH4ߜv20-[xZh t<=Zt8^>y饗G9ϊ{$:#_p?Y`8D{ 2q\ڵ}:ZqXhb?WciWI80TLi7.4=U$      @{0N-GlcƬ݄ޱcTZկ>Ώ~;p/QW GŔ`|guUN&MDS,a4yd邏NgޞviF4W^y=M %^9@j]0Pj?@.Qq}kV&Ȯ*z%sFRJqeQM[brk;*SNO#^{ IF#grxձ`kK8{NZ޽lzxp疸屦ɧI!HKL+au H*YgG^^F Zj*,j+x@{N̴ã}xӣ%;Hu {w )O*rH> `Jyރ[HX]вeb>Ȑ˃3h袋<ձ񸾔n.Cz-jn]zs. @i&Zm, ^{ҙ^.e1@ҥ3Y~G;͔W',Yĵ ?iѢk+Wzb1D̙33ΐ:ufC V-+^yA @61Y,O%NШ7QiR]G~]%;g~22dw"AO4RA#)W"y dOeY_;]NjsW(=ulJzdVw{h9l]M,.m^xSFk5N HHÏ *.N`x'ƍG\%yڵk׀FN|㐨oǢW=/RJo߷.Xۢ)oZ`#.K.Du W%0_n=S\#u%k%QFymݺշ^n]ߺRfM7nZ* n _i=e2ujWs0sv1HHHHHHJ2m믻gŊ#5ΓVZQ`2ǯPm>j*U(f 3a֬YN3f`P(<np=(71&ei61i$#X``*[r@1eN7ɑYvX ,%QpܠUŃAkx'vJzRڈ3QMMǾ gHHQJfUYq}o tzbIdɣxxW||,\З4nb!MߎE\"$ /KA-xeqRg. iGDdg ]6mo]yZx [ojckOq+{5^^~gz5=jn]%x2dԪU+$@$@$@$@$@$@$P i>|pymCuoyr 7K}0oHzySܹtAbJ߹>b{ƙz-}N~d59VTj>b187y-2ٝl}-V6J r/d{Sk.ȢKϑ#:$%ڽ;ΜN4.R˕wUΖF#oqe۽lg_pe 7!5M'm_|K4F2= *M;ji5E;hԾR?lU)۳W-%* 'cB2s[nPf06PD3i$ޘ;AbkgLS؀Ŵi|03Ԟ/<xǂ5ԨQC`05^>ׯQR.g Ogzo= ë}ݲ[.W+<(?O3u.]^}UA|E{twrꩧ ,:C>p'J0̆.`'[֓Vxr 890{yڵv^g~Ԯ]Uf\:(Ƅ YR낁WY[QiDB,QD ,DU_zbw` *ݒ?YS=7|.gvvv;3LM:Bhԩ?4⡽j(C:Qkժ\05tRG8LZcrh0?(o$j_:q?lq,_խ`_Fl/[l D ZA } ё (G(/ }6Iy-ZpԎ|.TIVoIXA8,La'!f֭[܁bjvJv|ǎ 3"Lekr4x0 ߪU++e[kڋi@ {٭S{C*A?ge͜Y&MT]֤_‹_TJŵ.Y۰ryکcRKG}[!NKZ>*IeFIJ@탥Z& 鮢~a_6=+.Bn^*Uʉ}VQUY<٦ʖ& Z[@Ν4sK}j@8H7,COmœ`~|Gx dwq<)3fR `pI'9c=676l#K堭 ;KAP< /WM: Kg_a 1-6TZK7<Aj n8s={v#L~oPiK%ܓN ǛظMǗ/rxOt8/BGr!r]vlcs`h)]gH7{~-faa.\蘤C8@ 4>r<쳂@Hi9h;;蠃-n~)=6UxmRꆎ_kKY=Pyw$U;Xa8"cS9m:vd:v"?p:fX#hƃT.旎Mߩu޼ϊxwn;_q+wӵLm+)-;c#_Qg/; }LG$@$@$@$@$@$@$Tƿ ݢLEA{0jӦAP N']P b @DД)Sxr%>bAcguw޼U&%jr왎]Y$bf,2q"]~)M.+-3ŲvYpY%i-$-l0"fXt -I y#F\t6s`rfŻ0Wg+\uxhnLU&8`Op›S0y?Ȉrx#17n`QFegk8BH!,I]l<']fi@ըQC:u䘆A7Mr.ϼL l{O1O{|ej_&Ԛu*Ұu|a{0l}^zI˖-| H$@$@$@$@$@$@JZ7 @4HHHHHHH KA33I$@$@$@$@$@$@$@$@$@$@$@$@$@$@$(%|  D13$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@JRf"       $0sL)..7ʕ+2)|6 @WydHHHHHHHHHHHHHHHH o K-3F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q< - m2c$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@P# @G-3F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q< - m2c$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@P# @G-3F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q< - m2c$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@P# @G-3F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q< - m2c$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@P# @G-3F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q< - m2c$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@P# @G-3F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q< - m2c$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@P# @G-3F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q< - m2c$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@P# @G-3F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q< - m2c$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@P# @G-3F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q< - m2c$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@P# @G-3F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q< - m2c$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@P# @G-3F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q< - m2c$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@P# @G-3F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q< @LԩSG*T0Oy+1HPD?W^]իDZCTr/gvIHd-&F ח{LvuW]̝;W>c9b%BM8ViPjlqgڸT((/??5ٰ!vI/*/[d!0$@$@$Pzz!)..7_. .,I$C{URJ2l09dƌҳgO=bݻǭYF.Yn2+9_ꏭJ[Ƚ+EEEh"KlExH< [J-e˖EiӦ!SN{(Qx3ݩS'|RY}@`$+ٰ^Ο'S& ^h&ڰT#N.A[nN?(d/L&n2a„BC{t"Çw#|'K/u'|Rz2͚5K^s}Ηc۶m+#GtüO lExH {}݂6 0zh.ϖ/-]vE&N6L\.Bhh Yd#PYJ?|+w:rPVܲ&Pwʚ?|V's5' 6W^yEڵkm,[LkgWTyStWmTWߍRRo\\P#QeIǞ$MO=ۼ-96ltZBO7)QTkL ?s}+ש+՛5w E+K_C?oR̞<_6*RG Tߪ4886.YG){ UM:]9?lk+IH 6m8sä|:>hDG$@$PqСP, tIyqRܜC]ȗcnA 34 80mBPl=zp<[ԳfժU 3RY҃rQO_q@Ʃ4MD,v}w7EPu!y@VmI'E kΖuKH:Ke%0RAOh uê~2˦'HeJLwҾ1ϼLhKJ`d;z G:]v9/%Vyي'eByHHHH,v囐:G_~;ҏ/W;͓hK1s{7 oyvk-<սk_Jv:th(t/ghv-[`yO?M͛7/7Z?t7ر)].Nr[֯I NX*L?X @C י/)(nVIe>4*֨)[=cLO6AӆqI{HNNz+լ%utO)l6g>,CVG'5۶$O\sUm&=x%IGVJSI%bl dGogn:V**mtC OSH J/Fe>äh!P\\_h6gj`~?rܹ`2NqJO>{yL/ @~$Fya.H +5['>26Xo -V /^$ {S&=CT%4;Y(F}+\{L^{^yRswg9YR9[e+T? @~V^~e_\)1w;{$^,'0]YkSz29 j!]jU^vb.Br.)Sȧ~CzU )o딠E\%xۯ&$rqJTβHiIpEx*pH*1V< y (Cuԑ&MHFĉe޼́9ڛұSҥKClKV[m%1ӕ%|Vzuvmnj#^;>zav}wU^F~g 礬7=6~6חÇe|wqYټ;ot7o<)^D=뮻䯿Jc=Gyĉu305vi:g> 8 \}Ւirl6}a!r!2sLWq<= n%Q3mCYCk׮OސpE]ܷR+ホ ɠA䠃raӀvb\)wom{mw|'Dѯ|n6y=^9δ9 IDq,xy<&p- @ɪ :;nuX,R-@E:#x{pC |u[(Q;&Oy7Ҍ?|`bhXV;JTg8Y>vtG eɷ_'knde_㿋S.iNVyCw!u2SȒoHJ3=HH *Tc.8? «sxx7npãE`8^r%p_X,z1Ӳ&Ah套^r,8ey 2c r9& ~cJ/L j޷v~u ⬟eEyrw8 alx^ٳ]v/~3f QCY{xv! ]Zx :Ax ځ Dc:A:a￿#d6ꫯz?nD$ JZ ܵC;IOgyOhiu)֑T |f_}>Q{"YO% A8S m縼\4 G|~q6*a|+󸔻N~f2/F5?lw[ 3N@YEUu=(g} @@ާv0tg*w?{Vtyx88CuFGaC] OlpL5vuhDB9o z˥VZᅲ#>ul{mwtڂWe`_E9'}j#~۷kQmSXj6?am:(/O]84K&@碂{v/G)vb"]*ұ/HQD!*GiT9^TmϢ/>?KXRqӤ箙nݓ•]0 $'alţ VW h"< DMK. U8n8m@&,29&3G}3.B!SfG@ v0S4H__!D3$~@ ~̀c9{N`O&}` m6?m0 i(8znkoOH`%(/h(Mɒz˭sx6? zL ch IJV{4 -w|ChpB މmhUv؝ 3ndo%Tv:tP0N6 K=]4}L l?ӓxi-Tg #dGZ4J45[9.ﯸ֟kd.j[o={q)D#L?o+_ڗ_WqE}#{ W06A*WgciܑA[3~ZF`@`Lb]|ŎFGd;7Z|0/-a~N2嫬cuޢy=Fѯ8Fw~i6iTX|ټ8SGhLW CeDԀC;0Ew \iל9sO>:vHP`14\6BMMIߚ3dҭJJv%zL݂jM>teKd˂ޑUq~RI[0/ɿ4<.Q .@]R} Mإ뙜b.@ ޝXdڴiX… q~G P1nxcǎ?S͉'L2B {}nQqvM>xt湛nƳ xG]"x$1Mf ph1B h^([m@xpv\PAfr̅}V6RA&?Y;O>ۇ ju:1hz{P1D|NM[.-Tm|0L[[D @ fB`fR=?8VxL.s y>+;iO_}D]+*(ǽA;67~5_ aU~=hNǂ}6ƙH|7l'U~8!vn c+V!wH򇇭 )N> /KJiR^IA$@a 6v87?UN^d) ж].aq6[c=ىt5|Gpg9N)_`O; @8ײ=B 6}CdsaӒ1 >A bQBpXl=#Xl'P)7b̏-Ta:mZ*ParTOpnj.YS!MsS8we?qEyiBh^5gw v0%ݰaECB!fwg>%Flwd1u܃e}ym+_a H9( 4E`g9r|ͮfz LgĻz\A0CG0?X~G!-zlѢㅅzʼR"`ܣy@e *߷v+߃Z[4~,Xecȕ~FzQ?ăgLrP1cȨQوմz3rL"mg? P7a"1:I&F] 3MkΖ,udGȯ^+$ :NjAp!,*($?7d_5:dixRq̵͒uA&ES.^dɈds/Njw.$w} O0\ޛw3RDZ`tH$`&BBpw8;0nN z!Wy?0saj׼G`}t<ëP5v6kL{WRu@N #])LJ'js/ >x|9ŵ{䫯?(,{'_xG31m#69hHSx?̲6<`'MSU=r5׸&;w^{/h_Oǚng`=[5lueapl總*0FlwoZ͗wާ{|j_ VU}FqqHx;;MLfb  \qr{I-ZOja ߕ^xwy11>0'=y~/V=zߥ(ǽwlA_qB~~fmӨ0y {qO~c,vAd F&cݷV yÕJ4{2Q8)-N[^L$J{oP\|1_bRƵzd|@'f[okz9KUW"`([wMs[6G7d9\ HBI @0F s&L`Z;k]ZKAt0u^%Y!tx4 ݓN# kGԨQޮ;#stHgC ;дK%%g\g-/9-@F wY?"haMK&g O:!C8zC9ނ0p7hL1wpZt{=LdQr2 ,hĵm7Ji`l總bD&f/=,/[K{/#8!l^0084Qhyjh&;S@]_7AǙ6=߃`o;ߛlY{С{)Qpk߾Q2%vIf2S^G9 މ;|'W8(Οq 6 IG KHi_vEiNgy caz]_AY }̞IcԷA{O*\>nr^oi||oiԫwv͔C // ̧񻔓_O?.N=;\&)>(K)2d'(}S[ rxdoh T[Ojl}o<+l<%*? U O&'F!oa7 @ T7`q  jd>v뮻.T]8erT޻J1? s m.?^ՄҶ'JΩҜ6L6lNK>8[9n(&L"=%_yPAy[վl|!=a T+̵{V|٨aۻN{x09UMckqq5Lvv:={:"`| o4uf8}1+nP+ף/.^q `+W\k:lgo=9N5OQSJx<{~Vl/8lK'8ASHGY#䥗^w:c_M.aƙ=_߃+hԛ%.rg飃%q/XO[Af;cm"U׽0188!Ljwֹ/2)4׽_q7e}j߈JUnTyw}v>is2Iaॻ,a{9 %VMJFJ_?$t]{lXln(@Qd e8?͗q''!ͶNVK$?v &FJ;ɢ/?TNi%#yP65VIGm%2'L+p^˥|j_ڻ|u(8٤P'׿79HG3]6 Ssmf\18}ۘ1M;찃sAht'Nt{ aڙi?lʫ!vku&8p6ݥ!te'އFK/4mRl總f:O.ikʗeW8'LOi{En:c33m{ރ`eK-[!t@!{ЯJeWy}S2{fk*%3dS/Xsz衢wv&2S~R"ы 0Զs21L{B~엕HVͭv;˖&ƏJ5k ̠nډL^3;]k2u9=/Y;?Y~q]e=)$zLxp#V7U^Y}v{YZ\_M^̥G5(,;"v[_]tqL&")$"1h tv ۔bfm/ۣꖽyz* xv9n|`ܦM"@[DzY.&$H8e=p_{$ӔfCo]uNmF<^!_*a/;cǺA;0n KS;>ghW!4S}X٦4}^{YGs>OxU屜(qojnAgӯw~'j/X>Aۉ}ƫ83nY~m)B 1Mz!#GKIGe֬d ۷?cR$)I7#'ORzIQzl\xt#} ?s+J.]5Wd-&-: OQE^\#U6ߤ*L7>L<' RMӼ a\=~?/Ga3L8oܸ;v]!Xb BgIH0k1Q '$8s~{vRMC5s.nL0ւ8:t?PڵkEŸz)^ew3hHx?<~)N]^U(g=r'p3l`ZnV߃]w] %ێ7:]q:bjWV.H&lcΜ9nG8s@+0Nl總,in J|j_ڻ|'v}馛ᅲz(^i9|'`>Hr'KwL`8tP 7^0O0@!{mAfޓmj\>L;[?fk >6ƙqlfR81.ɲs9GaA"ZMNm)N}wIR~G s]aV4+G-2'HzIEYmx@ƟKΝ-)5Z&z۬vãӧJu%4RIYk_e`cuW `rD9RTﴋTRcǍLdI7'%ʬgyo 3Ӟ/_I6 kSJ)6/R;ĥ-kQ#0f۵ Qu)-% !h,H ԩSet]wUz-G°Ed裏Aa!hBGqD>⨣mp҈[LV6jȹmj Bؽ.z\wYn۶KaԨQnb a$N_nAn}љm߾+\4(>D}G+h1 POzMζڻx-)И>H; 0 i/t`nݺMvFSձ1 }1ln9#@]АIJd{FqJuD9_- z]e.1B\z6VAcQ!3f̐>,Taa Z;Q cs>ᮻ3*zá;̝=:9h0i}>t1 UPUh#}`Ź2gd~ Y`Ҷy亅 d}eմ)P2Gi6-egJT!=]q_pˆW'F k3g:{3O^9$rd5fXMi?%}r/}e[ [e#ɵdE2{eijg :< @HqCcG:0py睗t6 ,:{M)8bJ3&Mr-`|ݏa zaƁss,9xäzjwܒjJ5^4vODa&ӯ^nР{n>_?K_ԿyԿ ^g7 3mlt!t+X.Tn9>3 mc~ꫯPC+ѣ]?򅖞:W{ @!v- ?W>|D:qm7>67=PG@~q6#&RtuCoq*ԽSZfDﷅ0YS]\ƙFg|"NgcY_G3\_刲1w*G,k<&ݹ گ8!\U~oT){Oُe!mWm3mR<+<T*$J މ>PmlM4qa/5[]{r*+):ATbpm 0ɟO>Q=kd>WyRܱToBkfϔe?to_8eP%K.ݤzLI- Xt,,;Zœ`12 "0%Sy7R.zaW0zRSLqqTenV 5F`R)lN68ʆ@{JfkW])ĥ}eeBmqlkj{YYklf6)a&"    (W# A(HHHr%G2|%qfٔ4vC[:n&1|* UWdd$@yJ;i2[$@$@$@$@$@$@$@$@$@$@$PPm?t?G-(, @aTgIHHHHHHHHHH1.;찃>f rw$Y\'a"LDrXxq˝ߞK?2{%je޼y,r֧t-?~a9+ 9餓z7|pֹuF%&Lpy^xg't1y]vVeb+n|~4ƵƇ=ov!62- ǩL $߅.)&։txMJC:     E~2tPlÒ%KD-يiӦky.<uYfalzg e(s5*U$ x+E~72dHÆ0|.N8AGy믶1>WFDsمYȧJO&#@+sHHHHH BPI{:OȷŃnI;eurf&^G`_~;3߲@z뭥_~n Y~'^|2`a3ي'2< "T _V-LߣG;R;2gB,|Sv%'@G9sL$@$@$@$@$@@e}O?4H =oYGG$P{「_ 0Au iWbE}V<9=IB~XGԾ}{G#_x |yR'r| -3F$@$@$@$@$@$`IHHYIʕ+5+L7 [⢵/m#  (PGT' d PF aX~'Y`A;/c!Xl]?P:uH&MQF'Ny楹xcv[iڴL4I&O{$>wl喲V[IJdʔ)2}t))) tm悅իW*E_[P'9(其ЩS'P=Zo,iР`=Ϛ5tbO畗:t={ v6q6=hB6n(ǏKzիWwE#e…স52]0}0f̘$:\c_[ޮG}/k~a߃y[+ hcIn9sF# DF l#7lP,88!0.<B {y-/[e/ o|e;߾wla/lNO\1[f09ڻzx0[?2```````\{Gu-Q%s-Y|(!ʠcǎ%8Zv7jԨqO>D-iQ%y-ܒ2ģTa;7n_,/;~}^Q̟??!oȓZ.iժ}~x jᷤm۶NSN9LMN8sڴi6N<,A|/vP?9~c1s&ս{wz%[ouZtyvNz'KsmѢE%jWg|P6(K]WPιW*5n^tpcfz?C7,ڌy<Zf8YMΔ۷d„ nu^Ͻ;e^i;Lg+A>'j2gϞ^C@?߹sc0c=ܾ㩧Jw%Y~mpaރGKƎIp;cKlCfJ ޯWBG}u{a tJ2ti.o=[N8& r}}/tIn0|p'aǫ6,#oJ*W[=AϣAcs̯Ε->f”{Tfr9;f?fG/ݧ>&? S'Aё @d%qE7Q>:]?LQ2c R¹ZHs9'O.+i)o?D-`IGhe]#Lj?f:8լYSԢNsD^*GͶZ,HlrEɫF{l6F:/9cj- Ə? &5kv='ly =(S%B+pW 2ruɻsm9uhrcyl_ayh@?C{ӻ@IDATFG} r~,L1 VJK?J5D$@$@$P09[o B*>\`T݃rYg G"Ih& 0!,TժU+.]$ā jY.0Ybcev ӹoγ <0EI |éQwy97̪( –9-*d :Quǻ[0L4t ~{Bz"+rP^(t6ꡙޠ|l8l.w[Bx0|.B-{=3^oA=) fj` Jp\slIdnWwg裏vP_L:5]_/$JKT1E0p뭷:f|EY~a߃Hڵ%JLBߑ)ٔ;c978|ZO<PGTsu?`o' ^։ D6yc}!(8oYDir2HQ0 9? >[BZ[n8N-޽{5W~M)azEvWUa<- T(ƽٌҍml7lJ3'M;ceܳ/4olғ] Ge+_:]8iΙ3.LVT_?ajVM%0ţh"a(/}VF+>+ )A+mJw|t)(5]w;f싍rG>mrVB9 Ei1qLeh0'd֛|prB8G?4~ydz&{Vt=*a7_~eTn8~ ~J}Z} 7/}e3b])a%P&wMUIl?a˶ރyeqn̖T{lYæ# y2b+orm>+%Jԭz_{9_i7~/zKs*6Sxo+&lk|hkd\7^Fo~ Mf<зrRS}_x( kx~FAzl}E{R'F};MHߤG}Tt$ZpwRJEuD v ^qn<:Q6M0S:\?s ȫE^С[n}{d 3^7#jw\BLJˋ,vʹRuQ^^e᫴QW&k{ ku~lS ^arɬk{T*th.@#t6϶y̘1n>p[/k v%]V& 4'%;I]'\ޱ\ٚGa߃޴A&yB_I\jTڍN9Ɓ2fl=hG[&g]8}arW of= .%HǖІxo| *cGez)efQCW0.W_ݿj>3]ieԷNy6o3<mfSx f}^wUAf4=v4l|2y,5dȊ< }P&dժU sT]?+jG; s30Esǻ*݋N5i{+,Av difj^L8B1Lh׹sg}طo_Q aTqbX*x+( j(`~dnRXQߙꛂQ&&3f#6G(<*w[wi'Q>C*;Ԥ{[ SO>7ۘk{'|i/snyFl]-`'<>/Xyl` ѣs.`[;V79F^NH=hGzl(9ҒCz;S=̔lgBc>^"?~\yL'7 c|hfW^?ܠj=Yp Of;m0oOiW_}5}'O=oUg[-xfoՏ٪?l+UĭJ'%PS DIjD#`ȄS;yo/<\O0Mlp߱ cǎmxM^Z "ʌC9D`GSiq~c1p?i"~+JkF A]pm;a۱J+KB~!"zYZR;r۰a(OeC{'L>'6D^|#X . cdÂT/PmV>a!+5n3{GǙoǰ(yd[JYB2j߾ LCi"?Q D b %z|1#<( eom6WTF:ׯM8w=]4'qi%Z<`;j޽(1>mM4ԍ͝;WF德!к?.lu70/:[:eRnF3阯;Q{}ޒG [cV'n/K&@d&!   ~G9rdx+W&Ӌ.k&\Ǻu >hhժ{ReLaT.lԦm?u1{v?o}ET C9F}QmxFZ=2o'=zp\LشyƇQ0y}|]9tI~}9\ux{ *x_<ԵkW7oF-3ǽUR \c }$Y:y4{5Å9Ƌ]8 ,/.U&f?f㽓3c(lB&Sqlx?aTKg}d`<^{Ƀ2?e*~ c^ޫÇm_xmGq~N _rqq;]Xt&QgČq裏vG8o0zzԙPcGf:/OAu޲2߻&}n^ޫØǰ 3ؔM8QN<Č{[vfj>Ѽ q<o>m30_WNqj~食? s/ ns79aa;1:| YOw̡0oNmxg<>(HSiX] * v׆PW .b/*Vu]. + bC|M̙3g&ssy{''$dL2CkeF;y[C/^, @ױcG/ȣ\͠kb$vx]KCc}-WR>xXhBZ rQr r!+Aer*_v?jܱVWl[v?Aӌ 2~-]T4AZ*&ŠH4N:IvӧOՠV).>FYi/לQߗ_~ơڥnNxCXv|7n@^{mMO;%¥QY4\TkE:555{@ alN.+q.WX†&~6:.yoԗz/UQ]cڏN/WbsEܒ @8묳L/|7l9h$'"wG__9R@նv ޒrӱ8GoFL:UVcv١]Ϟ=Š6̄י@8զMyrڡP_qU˗d^7Ui?Vi4?#Oڢ'b-HS.Wًӏ;\?A[AN9唠S%K&X{ǯZ$-Z$s[.]oMX%Dsc )5f(rBğ~iҶCm|<ԇk]gCcWV[RtM~#5@+<̣\Cx;CYv_-^{mq}ix v:n7|\uU:Z"q_7}I& ;{lP M:u2L]_]uj_uU:i2hsC})W|AvxF:C=Tm6mRN⋅x3>"ڻc߷%4r7K;<\ aJp :ˑG` ]2~&uK[!`[^ aש-c^8~3qhwao]v*Sl`'.H]v%0$Ҩꘇyv xh h >|塾\˺\y9/@{.^YSr#"\;4_.V[M 6L\wuʴw@$ DI   Ȏ&vTS^ve0or饗SN3̣}n޼=sU"^۷7?#ȞtdH&Nh*.%υFrsy/;yƳ>䱓mWJM4XdݻxlxPmBСC¦'b3dQi9cal=ڬTU]@쭷ڵS?HP9]-<wt~P?P}ҋW\q2dXdիΪ!\Q5\#>3 .lcx_Xln˖-x~J?iAgCaZLyriڡrϗʋhmmT>yW]nݺ |`H;(>A(!" y,\Q(v.ݣ>EGSn&8{Zq9?7C}u<: ѡCOV;<0yuSiVgY\_A|\+(]a؀HuzM eC  8nx`A*xN/"ӑ$ rGzA 7Ӣ4.\hΗʛ_40wtj#K~|+GA~\6&y4X.tW_?&Ha( ?믟^{lH%?nrM.sr.5;v4\厤”)S=u=Rɋ>JSF^c_?j(so?qΜ9)w*zҤI&}3nkązuR;#BwA;,F<:9:)!PYtRuv|9u'm}inؿu}GG+;aeg 2<`gN`N(zwohIs~]?tQ.ԑ\iˣP<\U'J;iV{]t&gɛo_]:9mRMx)RxHH hMs?2``````pZn]x7 Rjџ(]XobOQ)*^]#?z.¼yŋ~BϞ=c4.M~cƌ)Qs%\[h_6.v[5Cu7Tq_~x:ݵZK0ɛf1~vx58潾+>3S.` 22JA#umP{ =\, 'pBA1iɏӅۮX3z!uhw?:D O\yqQkx~w>io_f\]M7duޢW]ufذa zO:)I:G}a6eʔBӦM 7wg}1m;tt]N#-E!*?싙=3='y?i;رc K.to4Y1!RX{ xm.6z뭷ns-*뮑evϻ3,zJ>666[HHHH +ڵkhrA*}B.Z.]6m$ѷo_; b-wuvmŜ9s<#6i{'x1w\9?P쪇0IB[@/_<4N{.S,7ns}*9h^(k6>}7ӁaFlfK-%#4r_Çͧضm[ӞP޽M6K/>}D>C8ꨣKvi\ъh/;B: M:Z³dPKA}KUhse=YgL;찃xСCo{u릴 <~J HIX9 .EiEt3?z8@x5RH9RS_}GC7gz894zBϥ ++|]Ci"q b[Ji\|5Sh͂0`.w<(=RX]x+,`12ZCԇR|B[l) >^z'K0|Gg{sJ[.i-i~O㗚Z"?g%^{eҵ=~|;{̤@dĈJd֬Y!Dg79%?iC矯>?HhCXS!ܬY3Uޟz? }CkbҥK=ԇ_iӁ:iCh w |ZOhcQ:f%H#5* g8hܕW^)A *aK9Yr\yNkcqYiniǼ m.Z|E㲾KEr-SOU~aNj0`#.cԻ~b\ݻJ⤓NƍH.Ce~4pVcvx0:LL {ᘤ=10O+s3Kg9.HHTs%y2```````pGOT.jɐ dzQYTr 5$sr<0măi;{Ev\P[)YP {碟w=.'k^=%a`Gm]*3aj $Y  33òX.U6{`a3m;H(RC@4=m&\u%*W:Yǎ՟TlxpvJڞvm}_;/,JCK{ ZtṧTOovRۅ<g !_,> R~Q:t~MG78RC y;ȃmo&&VK-E朝woxEgvZ?".iVzϪz|Ϫ\_|]_i9u\:-}LR&<}N[ (M~qL=.iҁ+Fu)b(M&8GK EqyJE;t1l.򣙺$M;?<ܟ4ϗz+oͼM0LI)o-n=`635D̫zߕسgO

Y;=ooWI9\r&Os?N;qYP_믋)Sd`Ej0G hOj2]zV.6rH̳r!H!é2fjSn;t5j\>a$ w5LrR$J7=n>xow41Ӝyޫ\}4fc~GvrZO9W|rPF$@$@A2HHHH 墏ȭFj(*m6+ճH+w$(I+r9.isK'.VO4q"0G)۬6X;uNjl~K-o4`Q^ZRJm!v쯸 !w !7J&6([ƍRM;,`o[jQl H5&==X}嗅Nia<7c.94"sոV_$$r˙wR>IeO;o. D -KjO<u 7`ιTs?#j\SO=U?޼@U e"M7odzIڡqE;t?$|iv~ޥM:/nY{]BJ9\7mڴRRG'OMC/F"w}go--[9_w0`ZRZ`Qh@e… vc8_2{tg lZ[ ~Gd7x7`W,r,Sy.]44|׾朶ͣ?INilᏡC=䓉5dD"<^0p8X*M ݯc,mzIڡn3J]Ce$|.i.FyxPzI²$qqXP~Ҵg.Wvr=iQڜϮYa\v]&7c Y[ԟ~)zs{272D=TbLO^w*?Zc8J'~|W_}U;ViF{6 hv$@$@$@$@>1{1; Ln 7x`[o rJ|

*͚5SAW\q2dXdիu^MyWL6M]Fa,PQ\Xl!guw]l>cW4/X޽oI{ m&^"@{n׮:p;kA~Z /P?TǮeZtB3~z뭕p~&q+"za._mՄ-PqmB Cc&is@R?p_!I;jwgm^PB.wVYev=s9VwqLwXy{.\;꽶EX-D&YsƋq9*In'e˖(槶="Gt0">0nV?q0M;"?YUDw1?,UrJ3iy*w5[׿]2ظ3tPy- G @-X2eJ1&P (XX/eÇjuiX9hly ԩSi|s [ O;~F'p q*$;ܥ?s)'y|.\;.꽶Etm>ѹeca\mz`"8{`ܷ5E7\Vǝ?GI@!A jBXGIW1q0M;"?YUFw5?*K9餙4Ž<_Ta w1 J.ò]x4y$ l4Rܓ TT?K.?1G_Ӈ[>H.G}T >2cOC<,n9m!}'F}Qf0`={2|v\AT>A-8Z t\}tY_qM)c9[Ug Ԫȿr|J ԕyhUhp(7L@@ K.D ٲbvuW2t6m_{5B&~)<?!va-?AU:I& P^u'Ѷ#Ԟ8t;ѣGgN4I'>Sd9޳/-Q|u9K:.4:JNScs#oFS1GL'zO3*zҜeu<ʏ+>v4p?j~O7I~A}\ջ'~폓e߻nv:v4ok(ӎ:0!7:  #@(d8 @Gcj߾Z`vT^ ɚ~@Sª ]kҤ|͕6,@#4 T*V[mLi۶mbVN$߀yB)%/ehN:)s?~5k1 h7n*o) X4nX Ma04,N<9r>,M<_0ygF=}'5W3iꫯQFʴ c]sZyWυbI[y/ST0^$)Sq?gUY{ra1cƨd0ڞ˥-Cy fm~x'I3/AVic:ӎ0i~.]lh# syHH<(c @viЙ.vh  >[BL$@NjzY,4 8%ah傐(E]$J`b$@$@$@$@$@ٗ$@$@$@$@$P6cNJӧOj(  AEg\83D-ٷ 6@WC0#0deF @GHHHHH 6B`6kLlZ9sAqbB/ /KM$LխZAxĉH$@$@$@$@$4:bIHHH!:Jwq⥗^ -ܹsۡx"{_ 6 {={+2mRHHHHH 4}Kaf&    &дiSes΢I& }HHH8^ "н{wѵkW57og}V2'    JbIHHHHHHHHHHHHHHH ;a8 T T@%1$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$FadN$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@PI" G @GTH$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@a(F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q, @ a8 T T@%1$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$FadN$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@PI" G @GTH$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@a(F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q, @ a8 T T@%1$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$FadN$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@PI" G @GTH$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@a(F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q, @ a8 T T@%1$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$FadN$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@PI" G @GTH$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@a(F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q, @ a8 T T@%1$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$FadN$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@PI" G @GTH$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@a(F$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$P(Q, @ a8 T T@%1$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$FadN$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@PI" G dJe˖Aރ y-?.3     tW %kܹҥXiٳŇ~(f͚%/_77vXѼys믿aÆ 6﫭5j-'|rnʌ@hذ0a߿3gk_bI 7u _O?_OzV,|QwݧDaڴQi~^&~tQ@$@$Pq#JaWj_-8 ףG1cƌu3yd~Ac< @6z%y-b>b@zH&fQ୷*oP;vK, =Dm<@1n8=_ LG;jmG}8TAL)|UW޽{gux[o=q߶`BCh'sO3Ao* T 0@,[Ny-?_+@R?,Gv\[\]I2 _GY"x5 6nجhem$5oq QUJ״qMMF늦{i瞸VYMء kxEtuEy-? zHH$h1bD$ H@#]:[ǏWf$/^,a*@5g, nVO$12 T8FYgѽ{wu94r]۶m9;\'3gV۷oIqU'yK0(FmIHHrC f. Ə0[YŌ?E]f& @o8sL1<IR.rQf_LkU Ǐ=Ɍ@5gx9rК>}3ȄI>|#O:$qgq0o[%ѲeK)vݺu'N[o;w}6o[~o6   @ᏺ{( D-26\hk+. @ y䑢 4GO=TQkjjD͋@$@J /#HOp?60u8$P @}jc>Ozb 6PX 4뮻SCU-yO}l,3 @M3<@˿^$z_b \P* c "T@`aB_# "F)BH/㏥Be OI%/Om'F  CtkܹObɒ%_iĺ+oԩoG:nM۪U+eҦi!惝ӦM .,+[뫬Lj9+柟|Z3t]WW_]kNR_Ќ`&( ݠAoQ%I&j7[⫯JUڤs7:tP3gL^oq=/㗮ϻqP'oǴ`#<"?x9M%=yc ׌Smi ?-Dv~?t]JGsHAy/R- wuWᦛn*,[LuJo/|*-9gΜyW0_ȏ?X^EmiZt1җB ^s+X%i߾ w?V=qkʏH<_:thA./_IcWa믿 ?8kpݢE guVh|8GXg=뎼>0n_片V~'FVƱ8-z.jVj|S 9m\30,WRep 'f̘aEB.4}c;SxUX@_T?7.k\x/o۶m`wC۷wGsSL)M\}֞eF`z,y+?lz`-J64xgT<(q0UҰ4`9|Fe}j[U궈9kaѣMe]LլYx:~mӨyyKQu>9~xʞzԼ%m:./\ˮ]E4E2!joVvO;) @ K:rXW̞=s^.V H)ejԨIם{Wi>vdE[w}!IDif5a!rMȗ1ibK/$O4=X! u9"1d;\ d4ߴ)|?CHHbxgո \sMcC=ԣB9nb_ !%^_Ç^{mQqCtEiF`JglB. )j1?y?nߗ\r\ޑq@mfP-zH[_֭$O`RXi :\ڏ]VMxڡ C[ ⤓N2߅(FMX7pX'ɓy6#8"tEًZeЊgr˙fL[ȃ~^űѽ{w>dsF88=,yᓔkMbR)i)F3][8(ήhVE0~E:./#WrwMU::=IH z+M/aXĄRJG,6b$a .(:-5sv@ľQ&MRaAGjN/W^yZp{=w߉}WH%ʴ  T2vXW?xB:D4n`2Y* ( @~@c rv)(rr(S q2F@fIsarGj N8>&˥^9y!0w Au yJ (8|/VApY_A üPj3I|&I (\yi?.~ԮǥtR%|:\9^oqꩧ*as1#~uRN&RcY⠯ ;J̓ֈW-ǖ~!˺τ6@Ko`vxՕ 6QlvjkB+maE ls/ ~0of_zN[6J\}0}]9?nCWCWh?.eȏtȀmmQ ?n cW.l@`„? !w2QR1>Rjs,NAyvTk(,~7*|nPsw w8dY%g-Ƀ.l?uxAF:}Yll;ՋSN5o ~xr_؇:tŇA?>BpEǑ $' ; _|!:Ë򛔏TK_ ]tR@A佔rh?.? *4dŋ Tot՞+Nm ϔTX&9Ç|i#0}$Q |.5{=t-ᏼ'hq駟.cy ?CNo\tElSpڬ³㢭y7¥ku ,GGN}N6Xsy?o]ջ~ޮ4./;/i.wW`k]3'>Y o&ެ./\q~\.ߑW -ۀ6P#5'.!!}q3fLAM("tlC-ԡKu2d/P|P:-R{pm8qm ;?8ъ~[O, GxLΛAݬm>l~ ׈OF^( o  (Ծ%z)䢪: zʨD?6xc!5 3l8Ϛ80uQN * q[ z.9a>9vwy1Aj(w[s窿9s[$Ͷp!J|fRR- ' `vQUW[qU.pAՐdB i+6(V9Q礖A1e]V[{ R>(̈́2iʏ`Բ'ote>ީS't~~;ꫯ6L$v/,6nWrץ)׿9k׮|Nfp}Qe\sOhIAW]yw9wV`7>Iƹ`:M;bٲe:(Ǽ=yG+/s<˕>t@~p~hpu~?tNrۏq;*0F ' r 4,4YOG7-J[/&tLGj,Tn9+Kx='>§vR[tM}ub[@b뮫ID-cvwXԂPT?~jRRaoV6˥t~]̪$@$@9 0k,!) 63M0+ͼ ΄#5qx~ {&MK,9|0G\l'?ս_|<;|=G\>. &%3p@ѪU+! ]sUv~\ #(-O{+o%~7p4#אiIjݎ;(y} 7ܠO9?6iBXo4“@(? +1>nZ]"5@/-߰eNSPkFm(UZAGyDoz Ƈ REpڴvRSV1|_`[]gyw9Is}ჺlsy>|/W`K_QIU* *Iڏqt1HT'I4K/TTFApvR%a]/ c-aS z$"=N* KU'Tc-vx)%srܿ,:rdekwqcy9 @Rֻwo;;\c7Ўu(WiӦFÇ?\EG/zy4 WQ;uK94/#y{\+oU 8-Yib@`8s TӚ4+:t)ʓO>&@C]D[~LEH&IBk-[ښi744ikkoZB<8h[UT{|B5P1q}I$87B$w;uᷟu\cGp<iƋ QIf?_iwt[\D4\>_]Ĉa$@$@ @NZY.Aٿoq}? ?ÀYI@klm': Ǡ4 bv:PA} [\pj&e*p>#}m"k~75W^s,(3QggħD^[~߁H+v\S{1W( @0ׁ_q=j꣓=W^y%݂L !ܑAMv3gު:E}wjU~\Kz7?hF=hGjh8AtZy9?܈#T+yQmd5k-vi2E z~ϝ7o>z,?[tZ|h{Gh׹-5l0%4Ai}7$ug׫8y9{?iw?w̼ԙG~fJ w #.h,;ᠩ&*\SY^Qvm5ڟG:oi߰/tCM~Ҽ餙J'Pi~\J'HH\*5_|qy,*8 nw p ~/hƍG5WXaq rxAj І]Y_(ٚ*u?~qQ~zW~! ^(/-cңHHb\O#0\b)SL rrh2j8;EiBrUnWUvG9W94Z~Imi|`y /о4_WYgZ`Q|N:IFv0iF|baY󖟸ekۮNT zsa#Q 0)M ~gwqldioGcƌQx=4mwuJg|.U?\H~<8σu57|cp䱅?`.OyG2*n^9~O$w"xg];V~Ҽ餙JǮ4,eWIÇג x 9IÇaZkm,^z' ԴiSO 5? ^7P%Ӱ Vk%-&⋇ﳃ bcO. g "UڵSiCziu_|a3կmAvu]_v^]Ummoknՠs:Utz/TbȑОu-ZPAi4w"Npo]%"w<Yge4 dšfu&Pz @NCl6;w.ڸ`_oN %0aNF;~ jrj_zwϻ*W置?Qe,g=FԹkx0E-H]j;/mrU~Wr~]PABHGp %\Q|t ОMfǞC^ZZL`*kgx! [<-?q(l5Rxl, Jluv|ڦ}:.RR qakї)S$&_ u衇mۚt)5pWԻ~U=o2y]aHq0o| ih rz, 蔫K.!n&a̙FZ3^$K*Wr:q}N'ͼU:q_*qh߻wW_|H$/,BgYG \veՂ,vA%{┾'>avt8#OsvA@}᥮G@IDATO>` _9? / yKVS53fE(ݷG"ʀ_Q̹X0vi@@aӷ{X`cVŬqlݺ83N謄/c&z*PgV~,*M=ܢP :ϮrU>Wr~ϟo-G}ݯ_?~*;w<0׾}{s w=Jό3&?yGI3glp5O@y4;v:i-҉.u.eWS ^H4-TVqc;LR>ٳŚk Ƣĉ=aQ?F!HwмV[M@? $kVЍP[l0jfh/ 7X!)laZR J'iz,t)޽lWOgtZ*J~e}A7hSſԑ:tw uօ喿|!#ҢGoK)sza,Hˬ T/hڽ>S c24qa[nbС9Ę1cg]Yav t0׀HvԹS'03P[ZLJ)T|9|M>c;M&@;6h#3"y虵ޙ2?js%0" vxCv =:Nl\;p+j /z @(EA;7lZ@QzV]4" Hx3ffϮg9_d2MZYaÆ ‹/v5BQp |Gr!{yb vbָA0me\طoߴy?~`l;"S Ď c8 ;B0m-8[#ĤI|2{zsG˨Q4/E`?vۂ݂wq{ Yf͚ LAqm1vx_;kwixISa&g}vc=V~i;ZV?γ AR8W Ar ӧO hwl\eҋzt])b߃.s`~]M8Q -}8>a ;vaq|Ÿ;M(l_Φ1_ ]0=fK1`:=r/dV9 ?5 3W/61\WeW]cXѿ/O$P Q֕SSSFNJ#-1'c0fJMN~H.YJ-`EW)óoִxP H)%kScz}?sJ XyVNu~ڜ5ė/%zoͦ|j5kvzTMqG|鰛}riT1u:g(6cRG`~Jh׮]O?;=eۗݫ}ׂmJ xqu%@]+ZpL)U Gi:W){nX>\0騏,Wv'rj?Qũ^zyF{TFRؽgejw&\ TU|۞j16mRZs#,j%#/%x1͋.(}૴nJ y [!aIʏٴ\RB7wܑ3_ʬYZ;Y yɔdI

dZ_981uu.ʕoɕGyvTЇg3\'x֢Sv>C#rŶ\{cȑ#}u1.[}#,]V؊vMlP}XnϦȋT'iV Tv0*{:*v{gh-#p`5vC|,4W*/:@ӦЈ͡\v{C{ζc=,-jA?/s5pZqޤ#|+[[eTB|Wb߃.3ʒ$>b4i3G;ǘ:p@;qTJs5Evsܞr>sh2a‚lΗAEϣ\8sq0j/쾐O MyB9ʝo|۸Jw~A&< '} /:29TɢY$īvUP=8 Pwv'|^L|m̾VQҸG/׺TSW p=K|,xeY(GtIHH R@&G`~aw ,LO<9Z`Ps,mڴfV `bE`څ|M׮]) <¥/yƅiwzY ,  MIb힨~ Dv,Fan!|9jُڀ[i?o`@iƙ?r0 kw x666JSj?Xv{c6SOI)WA9?,8?,W'666 )}Q.;e\&L -[EĮ(Cw'$@$@$@$@$@$@$`-+&VM%8 @o] 93;ԃZ *m6\3@9 snFQ8?,zcIHҡY'p%A0;RP/i WO$@$@$@$@$@$@I phkİV[I>}I0 oO:$m& yeHH#PZ5Yguk!ChbSNsjs0ٺuk/q>;'?'J>_G! @(Q8J2#ڵZ.L^}լqxHHHHHH@6xЬ`7 @  !U{mذKygƌrGPb%xI'ak# (@_eҥZ W\)g.a租~K/T’ YQFzW^ $Pf.\(3gNeСk|" srK~gϞϜ9S~=z0]ȹpfy燅0^M$@$<TN^ 6Ȯ*]vGq?l I$@$@$@$@$@$@СpY~}ё TN 4&^ڶm7 } g7Jb$@$@G|: Jz3q                X P#VLHHHHHHHHHHHHHHH%@x2u               ?bIHHHHHHHHHHHHHHH ^/S'               X P#VLHHHHHHHHHHHHHHH%@x2u               ?bIHHHHHHHHHHHHHHH ^/S'               X P#VLHHHHHHHHHHHHHHH%@x2u               ?bIHHHHHHHHHHHHHHH ^/S'               X P#VLHHHHHHHHHHHHHHH%@x2u               ?bIHHHHHHHHHHHHHHH ^/S'               X P#VLHHHHHHHHHHHHHHH%@x2u               ?bIHHHHHHHHHHHHHHH ^/S'               X P#VLHHHHHHHHHHHHHHH%@x2u               ?bIHHHHHHHHHHHHHHH ^/S'               X P#VLHHHHHHHHHHHHHHH%@x2u               ?bIHHHHHHHHHHHHHHH ^/S'               X P#VLHHHHHHHHHHHHHHH%@x2u               ?bIHHHHHHHHHHHHHHH ^/S'               X P#VLHHHHHHHHHHHHHHH%@x2u               ?bIHHHHHHHHHHHHHHH ^/S'               X P#VLHHHHHHHHHHHHHHH%@x2u               ?bIHHHHHHHHHHHHHHH ^/S'               X P#VLHHHHHHHHHHHHHHH%@x2u               ?bIHHHHHHHHHHHHHHH ^oӦMYfzub 3%  *MI&RZ*̀' r P^=i޼9r,H)Wdb$@$@e+kU<"H#q# ʜ@2_V-ye=?n&_}F MZ QnPlPV2_}0^~\> @j֬)O<2c 9蠃oLD9XXBN?tYree@${k׮pVyٳ2s*ɆN.-0ýk&7Y pꩴkѢ >\_:ҖK.N:u?1bDQWEqӊ.WQ\7U_ePtf Q*[ESUgϞ2~G)vZZ8ʗ@וv_'ui%ՔO>.OY6GvșJO}KM6\"YGը):O*ԪPoC68LAvR)Y6{>Yn{7iRlU!իys.?NKa>JFUµޤ֬.Y)>HH\wyrkV{~{ c.=dx$^93&ŋ3^JN>t"~mU² /Ps AӓN: r,&Iʟ| l2YG}k#R8eԨQh,iE:.{⪯r(;X pܨu\UKH]w]y'CR~}Yd.B\ڵÂVU[j4l$6lV4dsEVOVRw uM7% 4鱓ltJ^o"]{|wYl(fwW.zaժVP9!u7l-5HuZ*a$@$(o[֭[gu…kgp89Y{e̘1ZrѢExUA]~~TYczױ]>h_v탮 V|0#_peH*p9U4~U񹲖E;LQ\g(`իG iaÆɠAvW^-\y啅$øY,)4kdtZY*cb/4=T#fYLjoK`6V쁲b,5sR^}YkNwl}/pRmޅs0  (TGqoQ $|ruEy !N;-䱉?GF7o.PcLN'IU f҄y_~E8<f~xH*~Z!Єp/8_Mxe3{$PI *Q\*\YV~(o.3Ǎn }f̦+]tjj \v)kuqi? ɒ>G#;ї ֒u?DfnNu馵s!Z#+gn9O>"56W'kkm^Zkzڈa߽xdz! 2!p9W_[|] 6wܴ{R&BV\)Ђb\,LI@֨~'SNak (Si1$@ :>Wr%A2$PI pܨ[ŋE*XA^v`- 3k(- sPHY=d$g*&{OlS}frY1k]%'ߖH*]tPo; q' ([o?0MûH 8&@@]%WNN;$[ޓe˖I˖-O>ҬY3Yx~tgCp6mG[4vٻ73ok֬):t³g͚%|ԉIkX_O h@_xWאF]+ᐠG OIHLvҵkWVLYg=/6Hc 7md!h|es~!CL 6ШQ#Yd\äqI&z7h02o_\>uzG믍c\nڴiO?U9IxRSL\ВTZ^4lV]$0TFޣ?_RMj6m*۷ZjygW;Dz`R`4ijŎ ԇG+Rʆ|Z<+J}꯷ϽWw6vHKVW?t:xZ <>Wܵ:vJ,o_O)ۨsj4lx^m?뿜ۀ2߇x'O T^{m^T H)Μi(Rc=Vb7nR?VR{oJ k>WR J}W^ZlHwW^7|35|_:J4O6x^フmO?q'L1[zPƵw{e?to&ev(=;wN=)e4>r)%Ә4iRM^^9ڏG}j]5W'J($⺮/1K)3_1nO]uU9Sov\\sM2wQW7#GoLg!/R 'rE;tO]ߋb]?._rVyr'xW\wu{G_)ԳGL|[EX{u0cFx\QƱ`>kV/srO]´#|8r/8Q8fwy/\՗]㆝ Iў]֗ Qڳq#in~ TYÇwBF!,] $_yG;ԷZFoαJ z7`gmVPH9%\! :<v}Y4s<;xaaW^!C!_|\ve&{]2'x /xaƃ9HK/TnV5s&QLwA ux׌s)b L}IB5ya6r=Ύ؉QGZn-dӂ 'wD&YÜSN9%`C(i_s誾L\CV_D)}D ُOt%\f$ޑ'OKgo={{chom@&Z.)xB')j+aG]hT"]wL]nocǎRL@|0%t5⻅ 3zTI'vh粟Fy(a]?_I9F-y@3~V ·X=SY!gz;'O>^6pe9>a2nܸ(yH57B\6,VۥqiaJT AHi@$@N `4ka”>0γ>[ݴd1]P&=':˵۵Z\TD/\]o46l(cƌ,(&gcl'0!1zhA}@-pL&wꩧzpЩi0!>"&8s]eIRpƤڠ (J{|GtRޭ[Paq9& u2 7YG\~ 76L> Q*Li ~@P (!-"rHhֻ~ s>Ŷi,&2ÇF8|?]9;0qlZ&^G|sym)6I` 0,(4E@\W]{++*,8$LVC-ng>W_}tAXQ)2r1(qT2ix=]ԗ](eLO*`v0!3ln;v\㪋q%;[ |+W{vU_Q9j.ǍֻI vR q.źz+ky`%1C=4=9PO9,2(KHm5򡴿Mju ifR}ɔzekiW:=/n#Fo j5kg4q Ҷb̾-Oi9x^|ss=1ׁ3qBJ»8Vl=}+YJPK&Gy9Mș|(Ӵt"Lљ{ǴL:c~d{| [9|`3B?W}lJzב&LkMySe|q|ΎcU;쪾.S_D)}RZ6 |T1IR0Ybj>G 0li0/sI|)ӷj;ȿs[Myx69 ?j絗ž]S˫ڤQƏ?ػslʗzd`ՔǡCze1erytVo>Hs50/k{`MmI+vh..)SX|w㏫WOE(y0fSû6JN kifw􁠩󢜻xR཮Cr9/{48i1*&?櫘StA-ZLm&y~Q L㪫qôG[LU}=bƍ{XVI]]eJ:Vvx2̩bL[o4K&0?lhHŇG `rNjл`&&Z\ : .Hiv¼ v˜{(.>-BP_X[-u[?aNcMT'Z$WanEiՔh1qtsA_* ^D5HH`=v]&g`Π Fn|РAƫw~,a77vwaw6wgZdo#נsiB~ag;z2 f`8Mk juh 8mV\z +xxx\1l0žwT +CEbiz{91vͳM2^j_r5n婘0$[,rW쪾\p=ys^O9(L`7*\,L2E&M"\=a|t{Jܗ ӵ?!v v !aTu \[&T1T c}܏rP_Zh:ժ%"eثq0t?('ϴxd9 @ ]KVZ7 QZ$tf3-n6>ܷ~OÔTi1^FJZ y &܊< 2[X޽muuf/<̙3]=&t&O,'N]0 .žq?T:` 0k]u\=ڡj?I  +@aqIwӌS;W;v] %x_Ю9̆ jǤ]0޽{{yE{j8@Fs[gϞ'3dwuWAᏻ۷{ΗRjz~,vmy&4l@b7Ooac!WU݂w^U k8;[MAƳ^qeȳV͆BK)IURy Iz/NohKI2Λ}aW]x$qbɷe}l) {1K[zSO=%,drN;Nek_;AezpEBO<$gc^l3.W-Z(ꫯX rݚU+e:?5m)|Y=w0M TL |j/jeap1fᾏ?XGy9{N=UUšC0LJC۬?/Þ}ykXN01+{r8( m>i_.h΃&L\ֻ43s=x! msVvr@Gralzp 3-[LFcv38l3w=A@Tq<$e3vᅴ`}S_]!sWG $%\{B ̺DuԻyD}f~4Ir[c;_8vX3f{4?,'/$a4L-R3{y~c0̡yҨ_!kӧOmjtA\KLvFܠ Źz9&|c]8h2{~v2{}=x?8!h&Bxp& c^2~z^(I'ˤcRʅ*z/=iR+ߢI)B[ޱR.+ f%?v:KetQ7u ɞϾ׎t+vw.SA6vϾ׎4鯺J*W_}udڮɖrml7h#ɵqѢE0S1A8{`3qs&N0ޢZ_E6xӚdK|WnEK(Hݟ.AՕ`Z ^ւZ ۇ2oK~~p9HH.{Z;E!EƮi{I{IӞyI[бe}lA;4+_|QSBƍx/?>˹rc)` Bڏ~Fѧ~# <@[ qrWzaK2$#%wOQx[㤓Nx54p@~gxmrgyFk1b.Cڵy}GL+OE j16mhqC8^h#9TD̔O@IDAT!J&q(r5O_U5֖[n8Nd(~)C=qqq, grwL$㨯$<'ۡv+./\<i1nDɛN-Q/"selyUWޝʂ5vqx߆f U qtai@R[nގfD??޼\e GS?MդRM휰]m^ۍ 77Mתv=z:'* 9hg]Ӽ%[qܥ‹}x=47h3BUÇ{QGva^X&S 0o,Y D湶j+}ˡޡ}ʰZkU{{J /JlG;/=J(4◺3#Wx\%zr9OwcqOm&֗}oarE⮯ \`G|~Yg>|x1G'J` Qy{]weޒ7EtY_.8OB{ns PC~ԇR|{n lݐ!Ciuax?\!-5'OOv^YLs6+S}̢yel5%Mze{\l׬Z) xYtKЭZX}o闟!Fd @Y{*4hPp>"900h}Fp/wu=#.l&ا%{yЎ` 3g\c= e{'vv{\bˑ(nQErU}4/ZM7ez7y,昴z/ qGGA!qҥKӐB#X.~5}畧E a\/O)|~~ꩧ4`_D)}o)~n6WXKsvmAR;r9O|8袋i]S uc.+|;Ҩ"35M7({g+D-J"‰q#B6|x$q+d'.gIhP=ϴb"LUW]mZcOQ 5X|x7~9r6}6E<+-vAJ6&z:gdoK`d^u>gv`PH5Q_HH*?,n›gfr~i9k>c1zhiժ`Ndذa^v<9i4A:l&#az2hܛ~ꢾ\qq9.Wqe}ec{'[uu}UT9x~}35^yСCڣw"8/<^'rp'$[\qY_.8eJB{Nz'ai' Q'Ǝ+Ap^LGG<ԲamKw*>9qlWCI*Y}sOC`{'ԎA Ln|i`5M-҂"Ds5Co& 6E[}]qRʑ\tm)%weW 4:sfI ۦ1G:NamfvE{<-/4m//[ "HH)cΚ (^x&:xlw?\/v}gҲeK} FP+l!Q}С:xm!9`ľ;m|­'t,^XoF́0 "9} @# >84;dw=?p&]̇'3KI| l \zԛqXUp|Zay7,ioKuG~-.xgMrw?w=w!'iz Ɲ7'xvo390~/r;j+ozρ $lahR \. m3gF<]of;c y뭷Jg.ꫨBdx\Q1eE}tŽ w|=·k!r짟~Z.Rolӧ|zNѱcGo ֆl͢c ys5nʓN-/2ٞ7^IguF P AuXtpHcsYq `'vҺuk_S@:>!~q狎2@P$u 2=w }G0xl߅Zkx37~y晞6h y >LaŸ|1{A[$t\B8 o &ɰgA0?`ŸyC,£>q h0g:u%%30]֗ṿ(EpQẾ0`y+Iw/ExTEd?[(m.7A0WNo 4 n~Xo@ g0| ٣Gli&O,DžQE,2_u]5Ի,.`&R^w}\. (!8Av=sS@]#=E},0r;/:{ǤvWؽvX!seťrx.Ib^~w㛍#bQ Wlp7WN۠jvwq1cƤqݾe}_byvYB˗D^,ُzp ðKq^Ƴh{ƛv\GF KqʹfJI# D~Tt-ܘ`1<\Y?L!^ h0`@]׷o_ͣӎ@mvpβL/1~GoaʜPkΧ p>rHߣP|5\? ~}՗_%4Ä}g!-Lδ.E; c԰(UZs,M_桇vM7KjcT;e ~=3S\{~ƍ*nMZdMހ/kŸ&\G|2= -M$hZ.Wдy<~=J־Lrq2eID,])͘*ya[kiδ(y(pn誟w1Q(㘋6_B)UѥKAAmXAN;U9CvG}zźV_rV4z[iRMݴ%W_ȯ!|ȚHHHCfRH̕fE\nݺ #r9u]_ڡ뺉~ WqU_HZjOiӦgZQ'ޣ#]{~ꪜ$F c^%x]BLs<;\:=f~̥͟gj`؅9DE3'犯/׬qqU}mފM/*6?I~ҵkWUC g?qn뮻JYbHHHo]5j$k֬s9G,X5k֔'xBv}w1ctA7d $PjR#BओNn)nv_?)c8ptU6mj*7o̞=[/3gLJv}8c+V駟.+W ̰@ѣ?G}$˖-˘;LFzn&'N HHHHHH " DIHHH2ׯ@*.~mzkH  iI/@@ڵ *y[O K,ZBL"/R |2b;ڏ &޽{kL;sL׫BaäO>yury؈}+Bb V u7 7 헵jҦHHHHHH cɔHHHH"XpB|7*3f^[h}ѕT+9'N+1::%8h3ر9 =xzG жQJ}kNkb]L {vo^:t7) x/a޽⋲~_|K?<9#A<'     pL29    ˍ7ިpu"JBEN;ıZI0E.9GFXa L0A P/_.K.fUjԨӠA92bh{=$`A>J֭o’?)CռysOb7xCy'08q{ć~&]Rĉ+L0?ӵkWµ?pv0r˲e`IHHHHH*?*x   M` 76mݖӦM~IRTN(PI{۶m`k}9vҨQ#Yd矙 bYӦMOĂ@zd72e,\0g"$\M4*[l j͛a(Zm?5~E,-N8ر|?G9 ]1z1y^HjXؾ}{U3t&lrnҳgO7n\֌h믍7ұH07cn6hAlZO@h_}*7>X~a_8OHHHHHH*?*?N$@$@$P<3&h#c^xA sٞi{޳\`Ş'-?Ŗþ/ce]unήCwޑ믿^fΜv pu &bAݸ(wQ.l/!+h(x`RnfKN:믿/oVI~11 <  =z0Q^{E=$@$@$@$@$@$ HF=0$@$@$@졥n֓:K/ 籀ʥ^*zkX/즛nB$^_8dFriɵ^7lBڵ6qX,htThB?!DŋG}T ̘1þ*8hLSnc=<.wEY&/^xah]!vMƏ/??9X8g1]vw]?piP &=E=|ӏҿ1Kv;CԯN*sOEOD+Bgh70V逸GNWZ%|A~EmH&c={oo,祗^_~wCXL U\.~b.f+J,1n`^bkъ.1vZ+; HHHHHHB PB$@$@$@U&@ q0XX511(Мab -\~Zd;H&c!6la|[!,tR=䫯 #itX8 |A_[nC9$, -\va ~@Ƨ~*}ֲhfmZdfy|Mд[Hom>f={aG;4l`jt|hIl=gG_A0i>4d|$!,jq X4Ei*hvmU- \ ~`"+Emhas{`4[&]S:a?̝`ca\8]-|BA_&~p  @<Ȁmmmmmmm 6*RJ7gΜ'R;.5wAݻLՅZ#?v {QJ}y5{zqX:}q6_G;Q -\0iRj!˗Me Z+5򾴂qy{̳pSB2<^<v\2y-xyV)oY&ќBy G0vLk4zsϴps:R|Q-.s՞2Dw_~Icjg:*G>tt~\rꫯJ)!zQARj}J-]K$eРAk Ep,˭4yQBiqFL}Wڶ|J(˻* @m (1o޼Tw.)Sx?Lޕv/oXdR68M ;*J0j/O:tʎw\mG,E ,n:-Ϲ"IG} 4 #6/^PCה=XS&cz6`/-E{UBwW 2?ec1cB±Tq]WQ;WO{KUyN?%^1hHSiO<=S>wߓ&ᲟouMAKz),<jK,~+2^+?YxJBǠpg6Fl>ܴ}Q-HHHJI@-\iS3;S2-xsoW :V=LhJ@Cw>|p|=0_3!=â4E ?ZJJQZM|y۩4Q ^P˅:E{y% J D~i|;h>>2dQ ?:{SOQ"#G4le@,$]tEi5_P`Fe;Ҟ2ѣGO>W2۞?p DiЗZ`}4h!sq՞2Gd%@=(U_ݞxIZAqT~aw"РA/mvXYͼ!@̮?_z% ;e+R"q@vر^ *>^8欶w      #@ C TEsOhp*%k[o/}^%?vb");V` Fp%[5['@+o /vb#4iw3foe&ygCÕ"֎MڳI/UD_QcOZ~L~k裏'т9pvXY;XWE'xWSN2la6h3s%eMy/ Ab̭HHHHHHCɩ HHH (#yPHaҤIy 4qs6s/UHx&md&Osr!g2rmř1cvVmZ:9z^s_&Ƌ/6Q۞>N'J* Y&-?Y3[ŤA~JèI&`k 9&Vwޠ ¬p.]@gciuK4mTas=> _D T Tv>HHH'~ʬYO17nxVs;l zoQ4,$%\ʀ r 'h,uޠ~+,X -h` ka 2.SU{.aw;(+,%/WOmZ!5kl喥BHm{w;=,WPY߿0Ӓflm\He8|`~M#FӍ 'Az=> TD+|0 @.}Qw;깍[ow38\d',"@mx9r)ׄ O,2x0q[ϟ`/vgg\]gyA=t_vVZ֮][𗯋#?>;xq(QV[` \uU>AǷ~W8ڡ6a\:uw<蠃dRDȣgt͗dPw1>#[lwn{hݦM/Ⱦ tq՞dE't/\(a;|]1nѢ6pm Kh?Q87|EG;N]wHi%-H^a˸oF&NhN1v{@'(LHtܹUK;jXF#;)\w/9ԨQ 32d|iNe6lMk/yCa;;@tIۣrsŖ+8勅]w5cZ-Y$mcP_G܌zX<^.=ڳ<[D_vXM+]|iY҆w}W.rm~ .<6c' gszef;3 X`L1y7x o׋ $-Vxv6l3  ]{ij0 W}Μ9^6Zk-9S]vEz4Q/B̞4=W"n>`FjرZ×IYyc1zw6q~ҥGraya? @TSI%+K T._~@#4/`Psƍ5nƌog}&-[v}w4̂*_}6{=`6}&Y4iت{!SNC Kǎ ,Fٚ W_}tYp qg͚E /a87vuB4bG傩Lo^ 6 ,5nX;zqh9`x9tPsPLGuԫWϻ1/w~j#@HA A;C{> E<'zgW+X1c!n ЃAvA>s/^\`ۡߡ~lʋ@&.\g]/Y}21A,⒖N!y a2k/0ڜ{y9c G;9rO?nǹx?۰aCXA]x@#qxߛs,f` i^w\.j?5&BИ6e}aa?)`lEXFrap7{E6"'`:B2}0s3Ǹ$@$@$@$@$@$@j1HHHH i^裏֋oJ` _[nEk1` \@,t'b K}Ha;DXtv0s=1rbH8Ccu/ s#F4:tXЁ)[#Ź"H#z՞]` ~`k/c $gA'O6Ah?r65:0FA c;L|G[H0_ECV&/;3f1va9.}KQ}?b Ш ^Pb%b.* ޓX0jlb{4Aآ1{ݽ;w|ٙ3g3;;s7M.sXPЂ6=zt *>y 6HLTJ9_F^ __5mRks*a_WzW_/֞rK?To5Էأ.*NYK5t~?p,]/*Ts     @c KcnZ Нd%pݬL8ѥTW ~+B]^袋.yK wꢰiRj_}UޅZ(3!O}n5z2]TjvTRv]7nVIy[W[JmJ+LeXuU [ZSnr]9\Y)c޳ хruy7?kXUvm7;㎿5qVOv;n_]Fk{?lMQoE2yUYu(uվOz_bhQ?dy1.rY%+X]~|:tz岿)hM] l/H/t  #@G>Ԃ  `;[P׽ʛo.4|*Xi3<^ +ruZ#ШY^@G #mm@@J`Z0E@@Fҫ_r%fȑw.O>9P}FZڂ@:ud /AL@@]+ʔv#e(V#JJe   VR;  @2,F]5 : <ب+^{ueu6l3k..?9tu2|pK{N:6?s=KL}$b"U *-^   (@GD̀  (Wk׮f 6p``ҤIfw73g 2@hiӦ"WԔ~*}YW   S`?1 Xk@@L.];lk/Yes|Y0v-N;O<ь=\xfƌz}YuYMjQ3!Pѣ:>ӲeF@@@(ߊ9@@:AK^LΝ]/(     "@Gl)ډ       dt(@@@@@@@@& I6D@@@@@@@Ra        $4Ɇ        @Y*C@@@@@@@D&P4@@@@@@@ #Kq        @$f"       Yd0@@@@@@@h?dCL@@@@@@@@ K,!       M"@Gl(       d 8@@@@@@@@Ih E3@@@@@@@@,?T       4Mh&        %@G @@@@@@@@& I6D@@@@@@@Ra  F@IDAT      $4Ɇ        @Y*C@@@@@@@D&P4@@@@@@@ #Kq        @$f"       Yd0@@@@@@@h?dCL@@@@@@@@ K,!       M"@Gl(       d 8@@@@@@@@Ih E3@@@@@@@@,?T       4Mh&        %@G @@@@@@@@& I6D@@@@@@@Ra        $4Ɇ        @Y*C@@@@@@@D&P4@@@@@@@ #Kq        @$f"       Yd0@@@@@@@h?dCL@@@@@@@@ K,!       M"@Gl(       d ̖5q? t2,o5}!X{nUOξۊ!y̘1DQW5,*;ξPT *qQ B@@@!#c/0`2dYml%c?`x ۛ'fPr!O>fJTe*'4կ>ɫNC`ȑf63 ,p4f_| }=cO2eb-̛oc@j/nlfҤIfv2ov{oY~w3&'UOү_?w߷o_\}OԩS͠Aɓs]'ו\Fag ~qǹ*n/DZbx@@@@CgpXr-ۍ7XBV%W=S VZ)sX Ո/>>>>>>>>>>>>6@2 K/$32gṛUOmP2sdPZh!sw8RϜ9e]@{챇;e.^Ge5j;Q`עb9y un3'ڠOv[s'Z S?g*y9UO֓z#^cN@@@8U>tť]Vaя\oyMϞ=k&{.~u@';&ọ>6 +M.+yS~ƷҨ!Zyk٨C#8Ou4a„;H}꫉EtwKx$еkW3~x^Wؔʯmԅ?/ssi_}ѮfcTr:gGfرGȫ"7h}\/ J]|?Gs^bTkVCXnxAEy^U3   T$@qm^4?n87Jqw}~r >Q*W='lGAh-"*2PگgiEaڪɫV-/h^v~F(y9UO-֑:+cci    @}:wqUW]q? &2@P@]@dm&k4@e(#     P?T7H*Rk pW-~y'￟[71e5$zXb :m8,z<.M,V:udu],rouiz]^/onmKF{K1nˤ)S_|};mڴqر +_fE5_ S7;}Q@%_~ UPȕW^9YFj]vYw,9Ͽpkc︎\eIq^rgy̙32ϟW\ѨKeSu+Rii>:b~jJj_׶J{-b{ĉ^c^۫W/!pƌ~.o;t*R'j:v,"fv[;W[/G@@@!#Gϯe7l?P=)#-R-k}ɬkG=]/{cd/8{%z"gd"gqGヒ셜^pvFH^BMt5T}7mZΤISO=5)35Rb/je9猎??/ZoS6>zk_:o 2ru#{-6k)Q}:w >Ώ^z饸 ^t:^}L)uv_\› w!1cƔ;6^?h/F6Hzm@h4l0w)||W᣶#^jG}8.sǾ6[_ԥK]pk;ؚ#F>CmZjokkUOkwP9|l@mDj~ov7.Kv/[60-gРAXO5K/]-6(+:#7|3އ|:6n&E_^uvף֣yk>5Oj>/+ⷑ>S{謳Jl'zmǶc```````````s谙?tՅ^h6|swWM#< 课c446@!r9Ӎe/޸l[n)6kCvFuQ]}q֠|3~#cMѻvj~C5T6{ĨRE뢻kâsYoêT;`FuQn,eЎ{M޽M6Ԇr-g6vEOǞ{i:wg 2[n~^=j26(؀%s7?i;?<6$&O-{iԝ~`  ._K.1W_}q8e6xMJu>c/Q?C8 3COtW/:=Y, \JǶOyOJ2\uU&4Jסsu]'dVF#_GM8Ún;*B- Ή1L? {rGmxpUPav|6u[M6$? 8ּJZqQ;>h{djrY}19׿՜vi%yC53Y>5O5ռ>/^jl Z5\}ٛ 3@@@@ E W((A8]2d-~Tj^+W~EuAY~ Xz)-.|EA *@1,i݆u1(nk93Ci嵏p9縋_TSvTP#ػM^}T۳Sz#QjM˚{=Yw(ղJ YP;>) @((pA}mf8P! re9Ëmj>A*a9 NuR QԩS]]~QYs{YmYݰ: tEIjO>u~gk.j ?[Okt^-u?V*Dˮ֧ԭM Zgs8y5[U㴽e/]tΘ+̶|^z~TV[m( r=JsԵd>jK:CJ=;y]7V:q.dYո:}z :oT`xDZSq5 h?tn`ۘ^xks$g@@@ڷ@Ljwʋ)}禋zXeU|ob$=R q]v7E]j;e3c!X}@]n;ػ:n+:.|B.kg_OyK=ػ]nuwsi]"&qi#P X.mřW8~Yz34ͣZF8 H̓>'\eۀDV릴|Lobl@rdL' ?'9_z*}mbrzY ڒ+mX/u=mpol5_x_c3q㳌_:(Χt7+Z ‹k>.R$]"2<xG[]de@o8/&=nqLm$z_ytfJ)'n}n3c ˵]:Xxa/3+|lzЛY0QZl: MN7|'%?^z饸?lxiӦ%c3GQ hKPn_f6r黕fqcە]k^f̘1G)b0 UV_OTYwu &+>o=~mIb^뭷&5“ϦیJK^>.,`Fdku M{N]ժ؋q6B=|=ڦP uKeB\]   +P]* !=z Xve ^`.d;Zs71ީx(OX/J2>1Yk7]*q(C۔W^q}dkϖxԏĸ'n.N;|QSOO-|+r-Pػ$MR`Mm C.<ڮ:ػg_ WE(ve'7cxMf5VO?Y>d6=c]u?tl؅S>_u,n/%<7RVg{v\=X3jԨIAA 媫 QV4*@+*vh-߄Aڵt{`;~`3΅On8=mlW dc͸?j$~aT#G?n?Rرc\$u!   @;kG{3_gYn6x4_"H6ki>36ts1G<5`HŠz::(-û UḬa^0YA6~_}3{6QЉn~lO ow^d?2Yaگ@Cǐtf]\`;s*'+R0ہ*JLk^zƅSjk_k"`s֔-p 1*:4h se ӝ*ڗlWnQz)ۂ~,:f*u,뭷QFs,*}[ y@gA^/jĔ)Sj&^hmqU.9lYʐꋾG뻄}[ٶ(    @1B2ؾ=#)qJ4>y'k?$_n5X5mXMYW:<ZÞoI.5?"R;-ł<,:u/IDu7xho>rβ`IQ= :43Dm;ta2h6\h;0CǴ0 Zխ[D4k/'*o/~XF3fYJ>/{Ig4cso;Ü|E;]Dolh  ?Y _5[K-lwV*bw/SyWv7n:L`f'ѲSÔ跿) Z>@@@h.|ϮZ(zm<>}IgetQ@C<׫]m݊b9zmZ:\?M˺ FGBZծ{k.*@w pҝxoy|wq&uiW^fyWI>TBTFoV` }[jۗjn9wEf*yh8vxAdwy;.a@@@@  #h݀1|oQt8/Of8*y;1R#^SO>C;;=G?Ӫj]vYT](;J5:r-ڥKV;O>kZ8N)_8^ú O^9$GA) б}&NN;îb4"fܠ -eI,>QF,RӒcǎ X* VP_qy<~q53M]wSkt]Cr_A#ySbBcY9 +0|]_V{8/;j~^?ºSY>.x2j ^g|w}B -f@@@کW"ܰMx71zko߾"勺hĒz PozLeH9cTJޫ`ɺ8}qI?0 OY+; }e?̟ܻ8˩c^>j#YR=P9Fk?"GivhJ}Ygͯ{oe~W_z?s.G׬ #_+cڵ.(}>}ݙ\r_ 裏$dx7l3s]wU|0}| sPw,z   [`z_;PsO?=0ӧOwW:0}k"Oå~u]Ec=GTO^4YWsOQ#a̮Z?t@(~ fYTnvsg҅M74pzkeN׵~]d%KC塻8P.r)C]!Gtp{5t;찃SNTݪI|ݩ?UOhX믿~"|『M: 4!)ݿ! U]vuTx3fuY'g>w):2we7vmK]`V(«W;ezI'qZOWz=L)cE?,euP.6`w+K3fL>5vae9/ ģ2V)Ho[(j+bH E}Vu4iyGzjW 肪/>Ӳ[[pz ZW^:Z" P1Y?|;;Y$rKw9:T']uAʪG*N/&JLd|r*9/j05 j"~^COte9o |֭ۗ7pxn(e(J AA@@@-[F:Sf,|Y.BCdm?=>N8dbO/(1dHԬޑVTd"\흸U0e]Vrݪo'LP<`P^z(S#lxYXjj,#dד?gW? g>kǯ-3wD6 72+u~Fln::g@;l?{Ѯcϯ @t_?#crO>kwG6Q_WvPP Y7\^_kmЋf/p%)kl4\OKAQ='Dij|ux;KCu3_f={ ꫅<`v]Y`0\3:أRq[wNceI]c?]4M6<̮64`zE]~y+Vw-_쟫Z~XAHfwwx^l\J5>z:yp^{ 0eSVѺU 3jk8.zTz꽑o˯prW+ky9WSO^vp,H:?m\>ڋ.[L:<\6yy ׺+(,_u kוmkߦj=VylUv[ɮt[laݩhz=@@@ڷ,v |^Ϻ[W*5\g뇺f-u.H&mo3.[#׏Y?+J %,. /R򫛞f/믔J`Vw/rEƲwq:KսgPEOuVAJ~Vd]U0ACmw{w]eCL@jfuVT.)2 u㠺QW/ S7)RVW6S;KXҽ{w׵>tQ`Ŏ啴ZJҼ Zw{tVk.ʧ6k)wWy^^׫:W2M]hj3ȹZ@>~x%H9AMjo߾F{ͯsdߝX%hy ׫jX[ywuţc\~Qgnw\ty   CY @@:JꢩYge=m#    @ lk@@v)袋.O FYh(     @G#$  GN0ݺus fM7u]i խ@Gܬ     !@GĤ  #0p@Kf6hСGɜH@@@@@ ^,  @x뭷I'dz֬*     ؇ @@@YVZi%ӧOӹsg3uT?YO;@@@@@ȝ @@@@@@@@ tߢX        @-J}        @#6B@@@@@@@ #oQC@@@@@@@(@GY        yR        PG?͢@@@@@@@@[@@@@@@@@: QGl       -@Gޢԇ       Q:b(@@@@@@@@ o?>@@@@@@@@E!       y (!       u , @@@@@@@[E@@@@@@@ufQ        @-J}        @#6B@@@@@@@ #oQC@@@@@@@(@GY        yR        PG?͢@@@@@@@@[@@@@@@@@: QGl       -@Gޢԇ       Q:b(@@@@@@@@ o?>@@@@@@@@E!       y (!       u , @@@@@@@[E@@@@@@@ufQ        @-J}        @#6B@@@@@@@ #oQC@@@@@@@(@GY        yR        PG?͢@@@@@@@@[@@@@@@@@: QGl       -@Gޢԇ       Q:b(@@@@@@@@ o?>@@@@@@@@E/н{w3|N۝;wl[l1⋛XYw Ԉ Qw^3,tgPzg?3=zXRO{ْ    <5OSi)? >{1GN2l7ߌU20`3djfK5(2?y7oo&NXI̋ @̖[ni&Mdvi'o續zTꫛc9-jر /lb{ogva?O@ ̻kƏUY)gYS@-3r۷Q0u?3uT3h 3yע= jґ4醣    @;zAS믿(,_~y/Ș[U}q}}},HSOE}\wOlOFm2J<5ʝO>V="   UrԵ9.)_c6gyfEҥMNӏoy嗍.rng}֔i+@6m+¬Cp^FKiYs(_u3lذ:̸:ʜtIèPV]uUs'ǫԻ<믿6 .Q9N-@IDATv+yS~N {Ν͒~fv0JZ,wމǥjO޶|>5`Ӗۆe#   T&P4i}Xй $v޼9gXq+ma G|pd/&4hP ʫۗl?ˈ#u1cFԿCԼΛ9M>y3`="k׮E.*)V?_`Wϛ^{-~    4ݾdlCD/nG}|sR }77O<L8n^EۍTtNn3#^:h_o{>Oب{e],VS]SX/QW@@@@%Д)K&ݶ/h„ ;%ߑ]xᅑ繠+cAD뭷^n믿ې'A RK-UjKWO5T]vY϶xg\O<193w!GVL4)}'^.ޥ}7]rzj4ybUmbtu#cg=?_HT a{ȑ# o/#Zfjm瞻qmⱺ6~4>Pۗt`9n <8 Dcǎ6!A ^{}2G=cYgUVkFtGovd>U63n_lltyEzmئѣGG6Hyݾ؋G曉vMi&ՖU2 ӪUOtrUW czį92_v_▣I9=6mZK'ڒۄ] :4L?OccaÆ贋۠h \*uۗZl#Yx>ux|0Z{1@6| vb?QG*of546p$r9Ki~n˖[n%# UilJ +X%K/5OїQ;ʾa5Χ 9^?_9l.ӂGeN2#jml6264=9馛Uz׿՜viK.ɚ%q>Gw}f}u#*YH^TZΫ2IE.6UϞ=ͯ~282˸l1j}f=ӂ2\s, w;3=֭[i4r뭷M741WFǛo؛j~\M,'    5YY?E/S_ې!Cf06U?`#3ڥ>`Brվ:/>~w&ػm.0($ ٳ\` /`_Zk-SN R{%PSЇڵkYW*hus/1`+7Lm$/vK9n/ O3]{ei}N.w쏯R0.#tw_?Zү+繺j2_bKy40gYOzyltIl#@%@ݾNA*No/ε9a/.^"~w]Nmcnc/~F`wLo/&IݾgDKOS264tt~ףYro]w].ԍoT?C.xhǶ]ۻ>͗9͗ha97S7s96Gb9.a08b3mgl0?l){k[=?ԞZ(R[ouLEM)E3~}hN4҅{c<.p<wH_K_ ͠_ӹH8-k5U.0lhqYBDף Hך]N:e L/+|^MK//Ka_;?gڴi%_S)>x~*WAib˫F ]%X[*pyl6Hsn/[ԗRTO TkZ^'aխ.( iY[;裏h9jtUN zbLLe ;u=ke.K.|[b%ʨYlЯQdui2E=Q5yT7k6lfme:ucz !>gH UO6yj{ι+0s|f3:Ko20,6Iqu6{a<'Ok@ݖ9u ߳aT}]ب-_q?fftu\H' _??ԝUXlj30    @s tVGcyeW=Q}`Y,񰽻 /8?Ə6Å7ݗn%E}zB7wlt0~͌N ]-}F?  :Q[mjl+_OnG!ĵ]h '_xᅝub}Cy бt.t.w9ȑ#c3nɌ;bmx=u=Nt .Uw̓{'|1lvqz2s&ٌq5Ǐoc 6݅yMlw9Vö۝8C c1h_'ŏ *]vuWT`͢n n*^Z*nH/(8駟6-7f(Lϒx~'i\6b    4@]?]F.D3tYJt.li<5W0pw;rrE 8c j\?!Z?>+ُzm(Yq>,6E_SnH4Yo?q5P@] ry.*Aw/qJ 8S>*˫jU/dN|܆A%+_KESUtax3}ݢtm79e5%zZXfyx 5~#t<0ԩSk 0n8mKލ+Ľk%=,nK^J2x=¨T ˴t׃U|wrYj5N{ BUwBߵ߯_?|9oW^TgoYOگ7xIŲr}c6ǟ*Wꗧ޿kT6|-    'P>쳫VʫjӧOw$º!(D(×<몫r69,H.c7UMOh޽{DvG4嫯rwY@6!zxV SwS eP7a2YM6͜y晉ft-~7>ξQmA頒};'*xqP*HGey1sUԢh9|uu{㨣2GqDu%X,M3nxŚh@Y(hs-d5j}$hv>K|,~,@@@@ctYJ٬ (;Zkhoc~@ $\ryx8ZpzGӟiiݯz3s̖fc: @8묳LxASY~isA]=󌺆ew'|/"p8!~x8dַČ''xb K:#Y8p^ZF-)@O|s=]]wՏ*fh\ (C// 81F.RǞN:5\3n^x$    R*7K/TPooVXa=+1NO^|łqy HɦyD|I3eʔ <=;](kɀ._Zb: 1Yg (0Ҭ <.WV3e I<}fP7#]tRK-eDfr;l6pxֻKxb * @s1V"jK- ,W󪧒e5ox ʞ3su٬=\_t8ӲkqQQXt w;vlm0#̈́YlP*f2@@@@u-~Qo袋J}'0l*yGJVW`NOweytob~S' O}+ϟ]?W_]}'@ 袧q) [DQT3ɓ'7߼2zOS֪t{L ;9sj+d^T$;\{K Յ]۪KYa|ʜfFQW^y%1[^$*m'of[0shmmh;p- ~UqH;YAiDq:Ƅ|bN9唂6uN b+.1;ߍ>Fic^'KԚ!Cތ1(<(    #0[49[ ({9+J+5>} PztQaZ<+d6ˬJ+»$3 6(]+ԿW_Eu#h 8E._-1Tw/Sע] 袋^jXDh2e#gT:S_/;O~~ϯw_<вY?u:g裏\3`(#].]|&l& T8.l§PtJ.8hL;gqr-ͫjT i iEG}8q]IܹxV]_c5~4GH I黚>EmO= @(D}^)5e7E p+j;E&HQP/l|w"l. K$뮻.sC=ܥ5E)aq~X>jYr%hu}>QbʄR3(5;ˣbu. dMk;*3]KQ{V+yg>qGW 21J *:F(p'Zk]|KՖJ|.Bw`#8 PhU2YYx@@@@F0E۴K\fU3Kyu'h]k3f3uצ~T7)(j36-ͩ 5Jy]e ѝiTe _p9/M}YӳK=j/ fs3,  !P 5L7p˴1hР>/J},S(ԅJ][l]YeС.#s!uͲ6o/OZH~@tm6b~V(6]n5jT"cH8M]i>eEQe{ZrK[vyK85W\xy%:%[IXgzrIXG8^_N{4`swe "SFtSeDz衇2:YIZ-CY2c~Z?."3쳛3gqaUQ3ݻ ^Tm/     @cہV4~~饗R3SO5g}v8a@@@@@@@r #WN*-y'\pO>-va@@@@@@@*0?]@<QcV*( QF@@@@@@?jJYs=J#ݽa      w`rTW;L wQCo4PCJ[L'0`Slj(6f Fjuѝ?giUF3?iYi4 R?BjWono       @G8.$2˘uYǬ W^f̘13?5jT*](d@@@@@@@T("}        @@yB@@@@@@@(?JH        %@,!       %GwC@@@@@@@<@@@@@@@@T("y        @?t       \%A$@@@@@@@G@@@@@@@@ P;!       YTa        Pr*|<@@@@@@@@ KY:C@@@@@@@J.@叒        d P#Ky        @QD@@@@@@@@,*d0@@@@@@@(?JH        %@,!       %GwC@@@@@@@<@@@@@@@@T("y        @?t       \%A$@@@@@@@G@@@@@@@@ P;!       YTa        Pr*|<@@@@@@@@ KY:C@@@@@@@J.@叒        d P#Ky        @QD@@@@@@@@,*d0@@@@@@@(?JH        %@,!       %GwC@@@@@@@<@@@@@@@@T("y        @?t       \%A$@@@@@@@G@@@@@@@@ P;!       YTa        Pr*|<@@@@@@@@ KY:C@@(Oo&dҧ"~M9唦O>|w;AA@,PTy#p2@ LVg\ve׿ݻ<`عuY͊+hV_}uKi|W3wuy?й3I@(X@&{nӷo_3|=xomFa~ǂS Xi'+0~x~f=3dVbS%~c1?pGmzh8 smP4\{QI ۨb*[o7얇7\sѿ3dȐ8ylџoi-L86:e߯} 4(6LY~6QN=@@FW4"O 4#m[he:M7Ej>k4-*fn.bij YRKM6|50@*/ }UPKB>}=t!޼iEts`'Zh2JlYAZ+ZUpЇEY$#kzT)B!T*'*djqjt6?7:*FrJŨ06f̘_^S>ꪫ-'3 @Xfeq_ӛo<#oԺIJ.}3N#*k't6Ss۴ώ*zKd 0sc3Z_-}oRUPE u9YEZpQGmC{;TGc6`*-_>*?B}rZ@q>ZLyWbCjyHݮ7O tOFW)1I@+@OO<=4s&  @QHd@ Tw\L?on6T-7   p7V|= Q7%@:R@R/9[/T<.~iSOE/-OUk&[laYghQcI]N&ZԴ%\vCuZIIVp"   @>*=Yq}{=5MڙSOmZUYj}kV=zt4&  ]k8!h[s=۷oTqW_5_~efGrJ"Dտ QWoơܾ(JQsz W3ndYK;oƼʾjM]B,O|M?f906?~|ԝ'|k_V}W;xW<,QW_}*hߟqqեЇ~nvD}B\e oRCwޠP[C\OuJװaodYf1K/m>xz3Tޝs9;c}z>!\TZ-2 C9xt~ZT7aޗOQ獎>˺g tW~vuo+ gO1YֵoԬg]{xl[2a„{_We]V7kҧ }0t: h;Hm3mMUς>gs p tc6]uM~+S뤽^9蠃*ÇU)+kfu7*ۊ-Z>r)Qc[ w}~ՍO?墋. (?fWƭkl*mC>yW3iod[o5Oʫe]*>lo[9B Yǭ}PSP7+{؇_~9Z' /{;WWδ il%Zogls}7jnۥSTu}u{]ѵsEe2ͳU6djV9?i=]mNEm<Ǐ__e!򕧼{Lq?m=x]Y:zi3=~U>-m\rI|Y&k銭TB㛆8o9h<'~OE7B>&@َZ{[7&X5Tn[9Cqwb)MK6k+DnJ5I*Y]jԴĮJ7-y̡ZQ՟_Ob@n-Cgsww=jYYq{#*uU4'x j7|Mכ*\f֪Z2+rt_c5ȑ#8-i ie2!>IFeưݢz>=z0/馛̆nhlHsL\xᅣb;0;ثWr[0d:~9tUcX($.j=P'?C /4UUGǏB<YxQs͆9 ,@u3:|uhc_?73﷭G;+h&Y6K8pQk 믿~4oq|͎'u){=u^P}?)kkh[?գO*_yʫjnw]:e֌sJj!9ʐdB|λCgu;EOOH7elx[o\wjپE-ooVlxZSjbš͗n= &﵎?/xKWInm۶VWL_01f̘>S~W:2i+TB?RRG}f8/[1 ^NǣC˶oK'uc R_!|8_{g8ݾmZsfvn_K5Vn@IDATLǂ7|x=ueohd<.4z\g> 9ߡ380PV+n5Ǎm#?un=m{j u(P ?yC]C+oyU}n+7WlŞ}*3F5˕)_ysr=Tpvo>[+'W}VP:o8sOUİFH"Dcc{gUPA7dSYfԊʲ.[h*w8-l6)YQվTCœUC}ZmiIlqJ&qzwUI[i{~gs p p PY!onlB'\Mg^ǹ!qso)˨Os7 ZFjYSܶ4Li+n~va{TЍ+MRPx>*% qڏ uY/=t =lr߯yC:IK+7[|Wpb#^CsmK[OyNvz_u^L[޴c9* /V_ʇm-'p mr>_5Lq}6KDžzj'ysOUİFH"D<hc]}QO3)V5W/O{7m}٪BS/&Nh~}k&5oP~ᇨugPۆ>ĥyKj|W/ ?!jZ/}3¨VCNg@ׯ_&lgQM̫ ub+a["FleԪlԽJ27 I*؛!%G~Ǩ?j} cMxV3.;8:*yT.6j(a>\6PrtAQ~|j,ʧlڊ~Q-TauMҾqA]7̡/Dwye._o]wygc;[ 5ζm&<8&F:6zޠP)Zn]Eյm!Wy/-5ysϹUëJ_V҉~7˄:~B7 q].:_͖W fywxԵ&˸RH25FʖbLB Xb۪elk .c_UZ'y#9G/~w>C4mG@ZC>yǝ*e*?<ꨣ?OJ{g`Gl U?d/tq?n][njVX5Ml6fa&  FalkC*̶]_"*mz-qiD}ofU6y_5M"U3;ῖIl$Ujۮn7w$˅E`Įrm530ÇW?%,ֱD ?gF7^Ҭn3uV'k a[o;3lEFiA/:iJ]5vf9x^x 9^(eDm+^UK%z`M7('TWQ%J :K۝\PͰ]Ѫ|_F-H4v\$ .Vʫ_ƕ?Tp۸2_|˘8q9GBI*/u=Z۪T4ɶ\f[Fsj[XBvX@2ڵGF:J1K?*-q즗qZO]WXacC7Y۪7Zj){SSG7Fӂ`wTl_FZh'Y.,bS|7Rkb| /%}݄֟Fo!wPVf|(﬊ ?XT:*Y/dv e瞪YصNJvmWS_/yrBW^]9h3YdYsZK*B7B/u|R^lҦ_C/sZn]\_.V; !m}n}fE\/}p-[-j#K,fECswC:VVZ}(O{َ.v΍7h_| 0Ygh}KaWZq;Y-(bk 9o!ݑzi]$u0i엫2П\_.x2͠ԕR&'%x҉'rh{۷ ŋzѲ@#lZ}SA_~vOm1?2,5A-r;m|:~SL1Ej6j+sᇧsCŗ>f}1-9쳫Z'~퓋W}.ʹ*cއ<>^46x t 5>hzJ*BquSΓ2Wt([z뭘"쬖{_~xYx/#y$>7{].kt>V.QjɅz]`j~Yz~/|1O=iV}LJ䃷mKWVZ*_UJv!/n.bHa|iY-[ qi7pl+[oY}n.Rm4uh#Y sFB IKᄏuYf3 @ P#Q!#SN93ڒfuuJ7䬨9?t=ęfinns @@ ur**Ho "+RU.6uַ͖3lo~*_o©|ٮ;e]{f%tmaujj.͡X*3fL5[okmtcJR򥍏5ʨ:%92Ǔ+STɑ2ϡ>I;"ijǵ V~{ B0}Q3`* HD SZ||PzW,;[O?Q뮻.sGy q].c~SGy}pW~!)sims|~UԾr?7gqx8o46sQ!{Iy}s{ <ؼTM@:u,qapwd[lQX7wsθ"~bM RXy啣4z@H7 zx2FO=R@QKZS򺎪o#GU@P`|gyb&Tv#R7rK [o=ꫯ|0,2lE4=Jdo(-bԅk22/tK/t\ nyC{l6Q7l3sw=7<*栨jWD0#DB?j!믿6N;m3_mբ@Tq][2z`~gwthW-yU u)(OeG}dt̪KceY&\Jjgg4 //wqqiy2(e˗ bXc /JKoBCnKSyE\S>+䉧FVZb7<˶R7bZM}  t*K1$RPh{z=Jn_7sOs5$g~V\mZ tU=+k5trvZ3EH͐wPU[#QQ*~Om-liWK*-X\QFEl3gW2my>WG798T%gw? FrT(+ȗW<ܭ]Y?ƶ^u9OMǀ<3Vhx[iq&NL: ށ[ћnMn+KVH@teaÆe.UT:|ejeנAneIS2=uH+>y*-_UE[Uu4O/eΗfCC~ʨӂMpQmqh+͍{)h>ZF?MrJG tnTA|1Ov [fzTfͥB~lɵ*5MWK-[Jɐsr~gZy t ѣGG-sL0!3*iuUq;cСCEƎk.hd9CgWWqvez5;G,u4ԃP5ͫ7Tm^<Է7F_ov!ͻwTqf[7D=~JQ)K?./uj^oQjV\_9(ߐFgҒ;̋ٷhk?/kU[6]xq?>:nUCZP-۴x6UJ|e]L?\>z^ yP^C\wBcܥ%OcOvisu}U|޻nkjk62wjVaGar|<}'s%TE2bj4i˅ʇiittUWLȟ%[ްxB7By?{=}d\!9ǏG]$[7 E@8T׀,):3jHϞ=׿C=? i++ģ@ztI]F!_q@/n)TC- gEe=ۼm5_LZS;o͊u^ow{u_ +f!ڮZ)oe zcG]g W:˲B7o:~Tµ+ݞӧOG-Ψ"T!ouy4Gᅎ{uʹ(Vwg&t"K> IPKAL믏*/SE;>/}^uby;. ˖/u٤ϩ+%CVC,>eWz]-_{ZFK#r}Օ~M1QE}uHOڶB7ҶʴV?{+inuZqi7|l @gGgKM1#  I)Ok &2˭ގUD ĤL ,橧fbZ$  Jjjk)ii㬄 LvR@r@@@:믿nԪZHux)?4ߵ\HGf1KL   !0Y   )L2eYifu!kE]t[.u53f4^f7 ,իW:JŌ;tU@*$s=۷o6#F0?cY-5L3s9Ì7va"d@_ +`fahq[>3zh.QFF3dnzfȑf2of]w5ZǟL0MbE(ώ9tMg~'sGFL^|5*8(YE@ ^Ө䋢믭 *a2?K_s5fvj3O_\g\3j0L1f=Loy!KO>LbՕuFh+Lk3̨?jM#O02dLp>ndfq#4Heff}z1oYgeXb<ʰa̺뮛: h<ц;3@쳏4hP&/ozeVZi%s7?lvf+zAg?fu#o|X7]]euS," OFCX -BL:tfʹ6Il\E&Rc3N9USL{zӫ|Uq&kιiѶZ$L)fL1s&15\}m3t6`쨢Z!PKmCWF*"k#? tOWmcni*ZПZ VЃQ?L>ǺܗKS7g>!0dB]]eiq<&4@ P#_][];j~g4=Po3u;o¸ `'cL5x>xժDŽ}8QK$WUtveYwqq6t#}K/f7g>!0dB]]eiq<&4@ P#_]{mMB}OA1B ?hOڥ0ZtV4 8j>˖fbUPW5ܣ&ML@JK^Z͗{5YփM@@ ʔ2fmVlV8䓍 fvINYV·άmvsW_Y2<| > D@@jÅo1롊í@Z*s=WS#   B?RvdM[;S',=I/fUW5.?4>ywl]ydG{_nԕ˸qrL}beKm+ͼ, @k6flp#Ő*6ZsmUdyW͗_~|;ʅ,HTxرcJJ}w^{g>ʭ5ӛ96lq[o-5*.wC|Ls9gTW9OpǏ,xLjf0 f%~A+ge_W^:;zz`Wh ٸo.1 *+Jw2.-Z-Sy,2uvyuZr 5TCeuw߅xB_򖟛@+:~Lu<8lw@6  6B[p+_}믿7om`+wԘmVI]6W@*ږonߠ|zB?Ox{㽢iJP]MGqCx틷bڭ:wذaAE'x_~*R&?}?FxZpK_WJ_ʗ3{*Nj:CwVSοPe5int;ۗ8I.3+^)\/9vݻ&ņ m*d|\11+*_r\rUc7*(nQYA׾g}j;]vYEF,=x#<2u{SrAUӥ>䮬暩5VYlt؇Mm>|׵u͹)R=zts=7񵒭ꢍzk5l<?Os' .t>2L3MZpAz۵7_Ma+Zj6*7tMf 74RO|,>.= /p\afva7jثW| /niE9>juYJ4VΉZSVYVO<GY3_ߕc1z|eu5?9?eCH3|Egev(W^\wuQy>-=$K` 1\aftdoٌ5j2矼+q:_U;0VfC}8W4h}V o_kvV3s?)ZN5!#6C]ߵEB@ݾ}՜s9OYA7?,b[0ƉnP)٫Bc=flkFX`߄16?)dMv9 ƭZ~Pő/8s^W\qETqƟ]KCd|F@ M@:꨸Rz!UH[޴!C<,W**K}ȨBhZ5#*sZGӖ4U\CGnE?tzoQ*G 0 2bĈ8BLPzUM O>dfҚTUPȳoPqWJyS[(y}>.ǀm9l8M]k>niUBFj3"N՟*Av|cP7rnY{f9["TC]ٖEe?2i.'}q=5kGԶKveF?2t@?_Wys}S^2fO|`|2K?4Nq.>ӕ_WQ|*ǡJ۷oնUZtquexVஊC˵rhn0 G]8k խ_Vwۊr[PP+q2_n* _y/_5n߆O=%a+wlr]Y m[|b8 uh<!wC?zΊCea+uubZWlŶs LZ9Vχ!_<9?8~l }~~W\zUU=nwq˹5le<:<o'y,OY];ؾZSO`ĉ=wzV[ۿ&MP3-ll[,ۼq4'uTNt]y].fJshGA?.tcXHݹ֫mUZdZX#+?76;ɼ| lFfQ|p;vlEurGs7huuMTEG[?lqھ 8ٶ/i^x!^F~};?^O?Mݖ[6P?D}MMOݤSŁdɪP&Zؖ1*;U#Tvp wv5Oi[y8'Ųy9=qyX^<_lΡV{Z93g[[خS-U#+T99<5vR2ۧo%eykx.8Lϭ:f"@W?ڵ[ٶoEڶ7=P[x0yg ڭ_WCUm/N5m8|WFݫoE?h[nş(+$"fU5l+:Ft}wRWyL ᣾ԶR5j7=kR@ ~u1W0۷qI{-duYWZ/22l03Dlur%DM?a暚DjlK U=~ScoBFG_UAezU-͆P矢Wa|5-:8Kw[C櫭m5:V֌o㚞G#E}: + m{㰨F.5k`9:~YotqYs&R~Z~9쳣n7f-wW%;rZe<Cu 6@@+kUh4 h6Bx7N8}lh",f\O>n2BV5f?rM^/uQg=LUB(=I7MS]tF{̱G0?~m.>m?oIf8>k;aX#w<& ]I`Ĉfvn$pۄk=onVcy[ &Gl+qU ULqvg^xF_|mFtm6mi詚YJf:*[7dGnaO?TSF /&oE҆u,^q3όuך^wX@IDATz&}YTi)YB˫N}+$~E&-DOvMuoFw*c9>aTƶtle_Mg"eW0%6)u0+D|JSWWZ8l<֞Vxijչ|:6~ٖZ*zE\Z-?To~Gq:th\e]F z<8,  @n;չ<UJ[7;r&mMMc=ıMD^ O?}ldgnx2~2n޼ B(=i_6 LH, 3ߏ|?O[wg}X @`=`ݛ>:ٳgEۅͪMEU ̶bjgTquϯq۾{R[qZj){ZU~RE~9*Y >ɷ\>x 7Z3 /=L1RyXǤT7j*򞿎@ȯ02_W ]''&fh7&yѲ3B+q: "dB+SN\|6skX+e=fSsg#D<{I;Vݤt5T_|I¡&xZ3#Vi{xu`VY7hf^"W3iO. IrY˾7{)7/<㡯JKW/?~,߯_Eun>~H_}cLa{\!QŬ;/&\/,%o1]w]lS㰈Lwy' )У#7ޑN{4j<83iMcu2荃W\19ټѴ_}UD]ML:1=O#k7vXj\᱑xa" - +?,Ǩ87!+S+ x[,_DA`ڈ !?v[7n'Z ZZ~:zD-nJ-rXf<,:_O>QE^U 8߾s1<᭷ފ?f=z0*o9l֧J^7|<2/OőwR]qtqa/^aʛ~_e0.8,y;28qt* E]*?s5\Sb^$^, 2y,p˓~E@ݶeY,"Gu6Vr^?FoY|ūo߾UaذaѴ4\/dUN{L哶6xc34DPw}wѴxZa6@%rZs~Kfꩧv .5qwW/ڈ j'0SL1E4I,Crn۔~xMܲ=T?ȦC}XWXӥǹOV*3 lU]+|5] KlIT*t_M 5 rʗvA15l˲\ʸBőw:7?nrq2(5L3u+pڪv`Jaa("{4捧 E?y]BK`,BU*R*&>s\w;w„ Ϗ+5۳˗8->e9[JՊ8Ŗw:u @@1vn(AȪj{~r30}?)1&%5:zsWG*V5dAj'm=tMO?mfy9u~!f  SN97; C*+T-濹駟p =ܓzcCۯTqTL][ȸ+MVjNW]ǸVGTI>?VQ&q?ʡSM5U&r[+2N|5*:k>{j u[vUWEզS8CiC/D5wHY+f?AlUfֲs\gyjTIڶZ~tI5†כ ) [l_~I{H)H}7݊?YkK/yݬh)zȑ !̧ZHm M-/7r9# ᣷=UqЪ@PJ.!{mh)_,ve5=#߯^o¼k]zY3ٴA_Ia& %C>Tߏ̈́qqkx+b8P5#>-nuo3۶;ǟHf<ƛv @N-7\+X|믿nF]u=#]t9c zݿ꺨K,/Vu3+x!od627P}UE-hUQUyǪZ;STiUux[ou硛Efmͨ]w=[@jA7ث/'K-:^QeWR9w(eQecbX5Bwez;W-3ƨҮZ[}b{N;d.ho^|Ũ$ *h"T,{t ū5ZqAC'j;۪9롊;Xx衇6['Bx`Wy /?P\ryӝuYQV} ?R;3\oDHGC<]CBaUQR~PA^!aX׹㡣C?!{k+;+NѽQ{upoiP]~UaW9ō*Auﺙ ug}gftf3| 3t3g& YTToReU,Ud" 8=<<ݤt,r?b?qTzV-J"ڞw樚W?h[i3'C|)t,'g?:y֟qUReP4hq-MPtA *gKdŏ|jRΪB.6uZc5x/?y?e_.oy3 y ʓn|8;Ph34T-zX/ĺ*.~2:;!"{eG;utZA<Z;TYQ.!n2ik0+o9+o<~Խ~-UoJv_mF]k?Z uK$[ @{ 6G)f7 'G%jwUVpeS|\͉O3kj^оf]wݨz՛r*E<0j$;mCoϩ;/u!>!WjsLTE7qu:שR[{͖m\yWХIüju=Q2$ @fPMK.\Uk/۰zӰIQjSM;ZO={(mJ}|7d +pyL֛7bba: ]tq@][ ]oiӦC=pN y5'&`uSGMYdUWu +US"dUn.䮇1zLt*ֶ|j',c9KMfluѢFӔ)SZvV oEX  r1u<;5ݯu3S%>YeteY4-A=Lу;~菇ֶQ++]J?TJvjX_mGzXJl߯}G~K]+5|- u7}4:~深Vª=H-7R%_ռ~#5ե^HPW,7`&-^KTyL-p 0ݯ; @3 L{"  kA)8 @{ @@@@̾Xs5]&'N4{n& @N?t׭vYwuvmTFCq89XCF]$<؜q+J֨k1uگ_?*$%C&A@ 9;F@@@(S`뭷N?>uTQ@Pn_*du@@h9so֬Y_ ɓ͕W^izeLTj__;k:?.B ?psGѣG]jƌL0r@@`!Soj     u*гgOꫛN:{ϼf̙uZܹ{E}蟺!! ^/@@@@@@@C}ÝF@@@@@@@@/@`       ԡu(2         @@@@@@@@: wEF@@@@@@@^!        PN         K0D@@@@@@@P:i@@@@@@@x         @ Q;"#       ^/@@@@@@@C?pQd@@@@@@@@ %"       u(@G4       x?C@@@@@@@@ÝF@@@@@@@@/@`       ԡu(2         @@@@@@@@: wEF@@@@@@@^!        PN         K0D@@@@@@@P:i@@@@@@@x         @ Q;"#       ^/@@@@@@@C?pQd@@@@@@@@ %"       u(@G4       x?C@@@@@@@@ÝF@@@@@@@@/@`       ԡu(2         @@@@@@@@: wEF@@@@@@@^!        PN         K0D@@@@@@@P:i@@@@@@@x         @ Q;"#       ^/@@@@@@@C?pQd@@@@@@@@ ,G" {6\rٳYdE;cFe  է Dի9餓\^+K& P=:W^t] O6ͼfԩK/mjX`O<1s9&"*p>x|9ͼy2c8   1:r13$/jY`fȑyE|gM߾}@Jn6tSkf9V+[lᖻ̈#Z]g~,kmz̘1ȄM(ze]f[o™v?Ǝk_0_{W_nݺ,@nF3`E\i̧~Zt+C@@@b GlQC@B -ZƺkN?tYxo:u-Ō.2˸Z&'5Bjzr)oq,Eb& &ЈEѪ=bX( y    %@G @@ vygs뭷͵_~Iz. 淀QkJ0:+9\Tvwz|u?u &h=Qs 'wIK-QumMivY@@@R(U@@6t]$,"n-hO&fԩ#C@,;tѭ߻ny䑂bLg sTG?mʧMea@@@ @eQ@@+O$Kov$уםv)VCH @jç;d~hC} @@@@W?wmkUW5oY{[ѯ=ztE7fmfzioϺ7uCԹsgӻwo?c|Iҵ}%\̜9_2oQۥ%X¬fM61+k{3f*5S-  FA첋PV d2$|d؈~V^yeӽ{wv„ O?-xӕ~S6e;wSNwL?,yZPo㮵Z7Pov wլ f3~y7g=Q}b?iF>~Uz_~̙3M_X>|  $z*]ni\Z*W_Brk?Νy-R~0Z -PNiKӧOcE}[1_o\is9'7cƌbY뜽)8p`r?|C4]efmr&Mre@A 5Xh[νYY$tk.h^18qg?DuYk<<26H!soao=ɓu|lnmmq}-7qĜ ɭzn? /i skf^oܣ>_y*C=Ay-2=_ m0e{ɭjao|oرc)/ؙ4hPypWx%>[m7tSѺ@ 8uڢ˩.묳Nbl|Z\6]gIywꕮg-|d~}Ԧ}:C6ʭo {w\~ӧm{Ksz9tgSWzV%_.͘>Ŷj}Oc?vb/^ԯ5OVLk'wW+~ź =Uϥմw2XG}e Mr ώ֍t-:}XYkoȍet ,iӦeD"/+C!%cξW&۲Fs-SA+ouӋY70s'sd_8jRtԩ9~de V0/ov~٬p EP^z~s_}Oz@ˠa:CqDrz8}O?=:q?v >LX0ܼR'?IS?=Lyj觧vXA>ZWګ>:O+*ROZ*k:Cdᄐ|m(8x~7Aip@2]eQpvmrMt~QGy>+v*=:z^qyDZ7YC}]OVmVi+h#V>m5ZQnv^GF*^+J}}2Ϳ/@]u?؇cǎXd1w9dhߊ[V3lo$0R(YȾkbvvg/u]e5n&\/>ֆqݸƾ, .H>u1cJT}g{uOɮGُjYy-f2Y&"uudgy&YN]7<@25jo%-my؇f=tw7{,YȈmM֩6uhZJZ>FݫWRw9C#<Ҝ}$@}캇-̺tbFiC\׭[#*L-ouK/s_6tSceTùضZ˧2cIizk-.lpQzsOQ#ըWʼnzQsJP]-tI;lwmlvɺ*Ѿ5E]dcd?RnՕ!y"L;o1IFQJ 7Wc zA+/<^)Fbkni+7};RRΫ4SjqF:~jW?K}W6H F/(@@7FlkrmV"C}WMt:Szrt>#һ}_ꚞ[jv8%oaovq:GRRYǎZQ7zGoĦJ` 2ᄏ&q>JǂZi9̗<_/s yo2$ ~ z>k{ߛo5Ubz#/?13-I闟5kVN4ߨ%ᛋ~} njO궫ߪ<^޽{^b;3YJ.[چ _qhUj$]p~L0rcz_k޸ԡI=SkJ׳V>@ wgj$,{fpsW L:V]8lOLz+27.rk/o㕞WXզnIj?_ L^1cc?ϓ}}.~_'̯Xߋ>{?4n_ S-Wc|b]=s9n᣼}edX??Wgy_cL?'w͛tjէV鬾7sO/o%S~7ܱXnܹ/(&Ɗb:ɜo>}љrW^ye2}]2oPlӹ6^_Kcv_|1y0a„7@'L7_NӸkܾ,˧oۖ:r3װFao:̾7_]_6d>/VN KeԅL[ۊ,w'C\ۂ^}ezU~nvyٳ/‚nXC Rr ݺu˛x%ndZ}ĩ| {WWz^cnyV[mY UXJ?cL:蠃L)ҴsAA P~ɶ~aVq7:T˗ 77bfĈFOyZVݝVE ɛ?r-F]ԧO? úwT]`K%NP+#vnecd^Ƽ1cny|o~r]_Z\1衇7sR0<뺥m e=m oq9mTYIpߗ>٠7?jvqG7ӹ}цz^uJhb[t4a P;Ī<_kwcl\7lFb:11t9s#?-u^U*'is8b}O@@,òֲTj.`7Y|y5C}7ypZk%kD7pR)O|b8.P2Ъa{ؓ=ctS':{c6ao^}U׷58p'@M74sKjl$aɾ|T},4,6o:F2&o="]@\O=dv6EAJYɾQ7پUkG:m'FZJ ],_6nό}+`~8f$7Amsږ Z|g?|Ppmf07\V7S̥^7j(+Wӹ`c%LS"?uS GRn 3ɂv䬳*t@ S㹥^k>lYډ꫍V@R|-x9X6 l]6^h|  H GWnӘO^#?żyUeYΥۖ V   %G,˽]خC\''%C=ty7ό.9V7PKymymӠFJM =zt;v,6w\ ? MCopCt҃<ݨ?úA4it P~r˹1dEԲR:hb7Zzƍkq믿>s~&s&*tWooaKvsؒ>t7o Q+!Z26~;=V+#YYkiZl5?{2h[N;׼{vٶUT@W/@1?XdzlW5FkN뜪7ߕt{6MBX9eVWc¿3}]{UXVU/"y_;_[8 M{)׵k㧘#  P@9clF~7ۯjQ"~h9MNj/8o5=@c=L~ða ڄX>> 4qkwҟumn&[2St_Sj}16YA چwB-}F+!->حֽha0鍤7=[))z 4|SGp~z]]_jqK{?_rVWj%} 7/CtYgO|LK\-?r]@\rN/oZ7<QNJy*o߾nQG/bn\A]NԽZk._9YW({j~X;q@@Q]?E]s$&u3M29O|dRs/pܣGVΏe%@՛L|{1\XI'褓nzg&z#S,R: 4|kIR,AZ,z/ndʔ)I1~{Z+B;2V767b^xa9蠃\n^xa2M#'|`R,`T5hs*d[3nQ^Z:Tsyz-)?u1!ӷ#'y,FxZH[jm\i5_F6kTiWK?1Oc9TSq@@E`z 6{g>܏2l@oF0ӹ[P2^,50'XgyfR6>g_-i0oqn^21cD;\++_~k/{dXka=+ꫯ:;N:餬Y꓂@&?akO֫R뫫0h㱎:Z-|(}gF-)=Cn]wd<=Y#?~RVX!GufN*U008/eń0IROVyK{ZrzSWk?~Oc9ˤ @IDAT>_t@@Mn?#:7A> `jdرF-3{d-T*q~g\W)i38,5Yvۂ b\}n0k7eu&??uAL#W"zTή4~k}Vm86t93Z{ukswuݢr+IqwuWk'.} ZjBv+/XK_7֚sXJ|·ɳĦ?8o5X#sJ9~^:h]vJY~56B] :8t-[Puh>jimdRK c}bKq+ZXbRKv[΂Yc|<~ʩGӨO,O{}J{YVcYef  uĉ?bZ_f_|uFdsiuF^gXcIo/ob^jٳͤIK/^jHoX5`j .Hm8:^V\qE6lX uuӜ9sn*?5? G}"(P,hCo9YF-IYf 1cƴp/0)bn$Weuͧ` Q}7pk*Yю+/Ro~"n|ƌ"lQ%ZIk9ϬY|]G|ׯQ`Nc@=4 Pwu:u2jQ$!elRz7ƈ#ʣp4hP^Vz 0V󫯾^,XsCe :o޼Cb7u^|#={J^*p|Xj4]NFeN}si-寗eiW?~Oc9+>1Wnz,]>#  Pmvjon܄ްnߔ\Ny̓>9[O?͜ +qVjb+oZPSzXz[N޴i\;<ȑ#G7ԃ$h s;///}q`9…~_OZVǜ[[.ۣ?9ɔ@z4Ç:gu[ް~+F{؍oB~ uY݌MnfV^ye7Y-J_J/}(VIAƍs{~ ܡjԂVV҃w,=pT]r%>cYddZʺfϓe|SBV[m,M+b:.s ]_͜9tAA2ҵfmKdSR@EdFtM^{%p}][t̫k &$:~j^IQ+wz0(D7oNwq yC9:wqyW]uUQ5QZb*= z+odz2>qqtfs.gWeXyUq:'sC9}7`a=rZܥ߯Rb0J:Kg} /u'ju<4_oSzPҐWppamoGr^UYb|b]<1~OcQ}c @@PGsƕ}P%׫o߾SͰgbe|@Q۵I{Vz26 }8;37rfaه(O? /Sr~Ab˹%C}Ǿc7H ꫯ?~|nOJ+[g.S no^'gmOA9bAeꫯn5?~vwS4><|}0Z4X-:/ hǶr-eZmptζZ}CD^^1ZW/=l0FEzu]n{.g>J5hKeɲuص.RloA˹XmGVj,}͢}eo;-t>2jF=裙ww%?\/u)I_{%5_|kD-إ @v[ǍsT9RBsZ_UkW}bo W\$.o;=Qy_j| kKWuVijKjxW04AY;LX3lGt^mW[b}>^  }/T>k] ˨ "U.Qv[,V²USy_o05!fR<Mj5jߨv7 ̞b߮vux㍍ꨇJj"[ǓnֵH׃>}ncPUQ~akY\RaY@E*4u[@C-ۼVPSQ-Djܤk.իcǎF]HwY&Y+u٧i)jٗ)H@ݐė%8p ]1:n 7~ynՕOǏ_8L=?9e=~Ռ3խA &VDjWzQ>{v/2wԓ|7dn_º~UZy_׶:1jKAߒ\emZ>Yۚ*=~Gc?)WzTuV+_>Zea  @H 릵 j$@@@ nne* P@n@@@C}+ ˿Ә       Ԃ?u>$r&L 1       Ԋ? }yEI_y3       Ԁ5P(kff̘a[l13o   @#̙3ҬYJ9s7_|E]ցB#"O)ʉ  @} tw(=        мtҼ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*        @ Ѽ#       @;*  Ծ@׮]Mj("y @@@@heYs=fƌ?75\3vl^xG/"ܹsʹimf~Ϸ2a@L@WYe[#(c}musK,OZ]@@qe[/`};v߿|3f7]+ݺu+X Ty63>hRntIgF@̙mfɵ]*XP@@@,P"曖`. ԭ)b?˯w2l]@|Rk[ϵ%8Lj0 sOoP%Xu1ښb9u-OZj)/9s洶:gfZZ_eTU@@@@I gt\:}嗹+2gOٷqsun-(jB N;\0}\ů77[\ww̽{y>ߞrA^^s=Zחa}Wsʎ|7yҤI9d[/vַ9s r[ ӧml9ܚAIc̙{'jeSO&N?~|> Mt{s .`2OǐmͿ>Yg>6pMۊ2^yC& j6K_X$u3w=}~}MpXc}G/;&nFw,l.u]>{챹ɓ''y)mݶ躾l|b˵Fn믿AIlB /j]ꪫr:vl0Co|lyp+Wa>EUu>Ry·%?·ʣ%gLjsL,bK/|Ww޲.Yv-YNm]rck%bVL?8888888888888Jz>ȫ 0o޴V[3~wiؠ3fWk"wy2WյN;dlI|I??3l>4w뮻x7]k}V:G7~`6lS͢.j}'cd.oV1Twn&?7;_7-s=  `]φZ3\f 몑~_>|Q]T tYEtuQ DJJ>YmX++0~x"MW 6(;opQGK._V^@:rN[J|=U+lAEùhmQ袋 'lU]vo]3c2:?vg!|x'rfma[ws ";wz_nIAA:FO6?OӓͺW GҁjGu.[9GSN Ww|bBe =`y0_IMfԥ`MZK1[F[6K8l0^{e3sfeLtwyf7Nr~.vn$C糧u VVA@@@F yW[ECu.Txp#(XF׿eN'&jGڽn_}o~>裼mq,|n111Pc@Z@]ܚkooIׯ[lk I^왳-$˨K;{x^W2O?tC&xɼz+27.r:$^,[bCuǓv,tk0_Lk[HiET; GR_D䮗g?|'r-\9'6 IiouQ2Ur|bc[ɫQ/z25}.s{Zra70Y?s|~ST罬2rʻizA:JddXsVyVlcn ^Mݠ tIhnh|v:./sǧٷrY7{N5?Ν;rf ʣ !̰9w;@uw97{켇nz /0!vmQ#wgϞyw-oAo&yv;찼l+ rzh2?-$j _y*POիW^C]7ٮpܿv!ٖ駧rrΪO9M#'*;k{?l /pR>y:zUWul?mc_& tRjOϊYPj]I}_s5@};@@ C=dc bvudj_]i=Dks]VUa+~I]cP]؇*wO(>OuI㗳qU"u7ߘ3f$:Rs[ sǺEԍ}XmlrP+D%"me}ʹiܸ 6dֈ# L'! _&O gal/bK$ e,&Nvmƶd˓b:Io 026!Y=sa# r]&٠?W2uuYg%0a9Ӓ ŅJ>    /Юd2)opDnb7e}ooK|gIT/=u@L:nO܃]=<]$o}P& #z{锾n+~{xÌmMR[϶vbjc[qǺ5_1kgۺYb%\s 7K/.ͨQ+se rA(~A]cv'd%BMdۚmB -7Ͷ̗'/~񋤼 Vu9I>H^}[mg-'wN:9/ >Tc 6(/R`hUP VE@@@ mܦnI7n\ł%t\o|xñcǚѣGdձcǂis-@+-\|f޼yI{n5xT+dpϻn+Zk׮I<}t }K]ո H]ѯ4fsq:Mo<$ HαCnm7?yY/R樣r-BUm&o~5?8ĉy(h_}ӿ X>1ǹʥVm%w5eĹX!W%>am09̳j/}Rhd*UJǺ    hז?ԍ9clіUM5߫f{챼V?l| H/rLO[*IgefʚuZ]zX 7$@u}s=gV;`صD9+Mg}uѷo_Z2Ylܸ]<+ٳ3g4BRw/aP_>~ZZ֫p;Ŏpbay*q.[Wk1{ n5&,    6v P]tQJt|2n3gfӣGVߨ\&!AVYb *V@Ԓ+)B-2n1uSAmq!Ō?~a͕97~Gn^O-u,Im: ׭߅^LőtKx)vM]jcT/ZJa>_|EE_%d-T :-W%>nTvJ_^Put뭷2J *Ȥ t~@@@@htR!onr:s Bj6 +FcWJ>} ,`6xd~&AjC>3/衇Px{tU|ύ2|gafYgsu{|5պ_Z:J|+B2(; ҼCR֭:thux 6ʄRUO+)yv))Ź `0x,nzB]ssu]?˰F@@@@")u3XcXLJ~hW\TK- 52N:tܹϔ)S:tt,yu(0_ߨ0|Z*\0ӹ 2&ħMg˘{)0,"N04iRR]v^g 8,U    Ԭ5 ƔZK K/-3YoK/t%(}u=83ͨQ VR3\pAt&  @eРAf*'bcԡ|w ./^z/8oF?|/?oV݇ b~_YwqG|`n^ƢOjFXڒD7vt{ǜ|-f曛oPϺ=X_1@$'x;︇o >}O~b;8*$OrɄ#jlذawu 74׿\p .f}1,Hճ:e0ڠ u~hcy^{嶭7U|-qlo„ IkD`̙$kJS;j6f2/3TzH h/t ۻ}!?-rn:Z)<.}cw]@>l.*l^0n IQ(mvfܸqFSlI–m|;> c9y;˧+9O1~W^3vZYǍ[4}ury)gY .R@Y3#u(0BI-=\0)@BGu(X.+(\׏<0Y@+H    @3 4m/a^æY77|MjZKZJѨ.aBog%5tZ[Ϩk֗@ dKJ~2亥_d]h]C=[jabw6}ð뗧~` ;vl2ZG}4_%0tո/>U_[2GמM]2YۨtZXt]gߥߖQEj_3& (D˩޽{VB䠖>tP۷H V7SYA6S>J|*-_%gV+=?+=z󺺽߼$@@@@Yh=j^Z7I   P PZCW Hu`    4@vҼ#  @ 1L4t9Z AW$@@@@hn@@:nݺ38u4qD3{l-N~*XӇ|f@@@@S@@jP %ҥr-ݿdb02}t{>,(    4ݾ4^ܹsoto5^Ւ   И~9ѣVpƌL0r@@@@@`5O)   P;wv]ttu>O$@@@@@ %"       u(@/u(2         @@@@@@@@: wEF@@@@@@@^!        PN         K0D@@@@@@@P:i@@@@@@@x         @ Q;"#       ^/@@@@@@@C?pQd@@@@@@@@ %"       u(@G4       x?C@@@@@@@@ÝF@@@@@@@@/@`       ԡu(2         @@@@@@@@: wEF@@@@@@@^!        PN         K0D@@@@@@@P:i@@@@@@@x         @ Q;"#       ^/@@@@@@@C?pQd@@@@@@@@ %"       u(@G4       x?C@@@@@@ | FIDAT@ۻ{ר0o(*h#A( $V(؉_`c'6]O b# )2Ewo8ƌ9sy}ncG ~4- @ @ @ @* W @ @ @ @@ G2 @ @ @ @" Qp%@ @ @ @G ~4- @ @ @ @* W @ @ @ @@ G2 @ @ @ @" Qp%@ @ @ @@{+<<<ܐvGFFRG @ @ @ @@G  @ @ @ @ XW  @ @ @ @h? @ @ @ @` * @ @ @ @'@ @ @ @,@`JxM[n-x @ @ @ @^z_쌎ח/_^o @ @ @ @,@سgOsٳgQ,c||<{ @ @ @ @j\2._<g;{_˗# @ @ @ @ j  ~l۶-A J @ @ @ @+PSɓUXwEG5kĎ;bժU= @ @ @ @)144-J/^zj @ @ @ @@zElyGE\ @ @ @ @)199wk׮|l@ @ @ @ \O<ɻ .D{{M' @ @ @ @4^Ǎ7ׯǎK.s @ @ @ @xy?~ѽ{?[ @ @ @ @H+Ps#k۱}~z弳vZܹs'u @ @ @ @ZSNř3g~ꬿ?FGGc?ݳ@ @ @ @ xTZSeXu~ŋUk& @ @ @ @iξ}X,Kw|n@ @ @ @ F!᏷oӧc``  @ @ @ @hH#kիWU.]jnB @ @ @ x;wBVM @ @ @ @/0o;>|/_g֭['Nxu>7 @ @ @ @H#8t(ULOOǒ%K*?@UvnHQ @ @ @ ly\.LUs?޿Jj @ @ @ @`V}>شiS E___lܸ1V^]]]?͛7 @ @ @ @@Zy}kÇǕ+Wfooٲ%&&&za}iB @ @ @ @D`c_~-8_4 @ @ @ @H.0/sup֭xi嘜1 @ @ @ @ dR5  @ @ @ @ؗ O @ @ @ ^@# @ @ @ @?*L @ @ @H/  @ @ @ @dmU @ @ @ @IGR^  @ @ @ @i?N @ @ @H* Wq @ @ @ @@:B|U&@ @ @ @$XbE,ZlYM'@ @ @ @h@Xvm, H @ @ @H%e=Gyzc_6l @ @ @ @)e;Gh|?rwk+gaIENDB`httpx-0.26.0/docs/img/httpx-request.png000066400000000000000000006211741454054354600200420ustar00rootroot00000000000000PNG  IHDRBiCCPICC Profile(c``H,(aa``+) rwRR` Ĝ z>@% 0|/W_ͧ=2S= JI-N8%1V./)[l" v:NՄ9Wl $Ć vGyI6ǒ JR+J@s~AeQfzF#0R 1460 1226 4;)iDOTe(ee:ͳV@IDATx}\Ulz&= JХ) (AzJP@, ^H^}ٰٙ!n9=s97&"]2f5jxۈҭKT#~Xz1<:"P&Ryr!GyĤ^4Rb|w<Ű|OIοՓQ_\rM/?FZYV.+>_% ,%ˤN %րâa`>gʹ+zs 0D/z=Z x;.IǺ8 "^ތX (ɑ$lE0W((8pUA 0Bݩ)!*oԿSnO J?PC!6htLxt,=)PܠwUGzuuRc')qoz#fi,2:g6_i#^8;?_ @orTĤ>E4Kаsן\lt +i  m5ퟘ;/h&m),*w~O$7O@_qrWKyyxj68ڭq˦#c N,B 4\S݈@X!;/PIt1ߴ?lDoxG7 lXw@ݏXU8 y׿J|՗5Bqn/G'}E-~`¬i՘"]%O }GZs`U/O/_tO\`,?_\rMID_T&66Wh K{qv( 32 x@F5.8`ad3DtJ4v>yj C pxߧdY},d708/ο?Q_PįH`6E/|4h71̢KUv\KOzYbqw=hT\m\6FoML >YvtcJh-'jcٜPIAgpڤ[3P$a?FןN6'\sMC;@ïҥKSfӨ /'Zq7!X?,5*!/",،͝#jȶ"VYR! rf|䨲j(mXfVBe%gUmzx]$CxuxM0 7| m#+~jX=u~ťOk]KtTM[,俴uO_j+7n7:KEn+y*%+k%/_uZOTJ.%O]N߱6ן)?PkP%炂-\ثU.r;^0{0]w]`6:xx_Tr^zQOqw ˒׫NV+*duyA#;T $2._)ߪwؾ.ֆ?/]-G:hrQ^uZZZ^-k77}o"҇Ti7"_CYXDyykTuϗŽEs;_i*P#- /oeA &F/v00? ϦP>ϑ%ʫS}R[+It)E'Ʈ_5o{RlMͮ`~S$((o:Sn S4H #?`g`6kO?;U^]ҡ]8pJݫc ,E0O= (̗.Ԉ -K歲Jw}xGG=z6;*}}W!Ϟ뤠k3be.lQvrYA B7U>v۷ƨgP'k+$.(5bұkĢ86ůl6_/'>*m*|U`p,}?#?? eN6mB\Ug P,<`?;ض\r6WJT=:ݐK/ {C۵|Ќ9؎O?0m??ܼ<5h/XxVW 0Eհ0#`l{%+ҥ[ ޱ,Ir]P'7n'$)i4.+_A1)zXtQ )gţ@@SQ-֕g7L hyn*感5uw,On~^:v,nw`.مY5V]^%eȅ]No 8ú0Mo(YS|b'??a'+ . 7Ӿ矊 ybM')?ȌzSqv0>Ueu6_P[U8} AyR.K<(:W1]bU2LuzUUU嗏42vrgvVt'OajGC G/Z?rqe_B&)qbosM=PF#XqQQrK*ء #x07PFYp}t];b>s/~"auF6 =OۢrW7J`e?Gkig]O>#WP=-xVWVmu/pAfMd7%RK)0=4 -,MImٲzq(+'hS]ZzMS'X!Kv|<?AAD$?vR= ?PU <{ރ%,3NF۽7{a_ҁ0㪮uix*.C29s|vIK߰A^|yGL ce]#].+oL%KJΝgmDbVQ7d ܠ^+;n ~lM]J)l+Kέ?ؙ];q!]zp/`8UU)tv7K}H9|ˇXt0m[.y_/PwfB@8U,~h⎫Z.ڑKd 'SFQX{xn"}_\L.u *ngv1;R3EJ,0jcqV\VQ7Q~@BQAZ}0Za ʠA8叛)'?;[^^!![bú^jcv vTy8$WV"uu.PL׭%1muh~좄1Fqh;ѫ{oB_FYyPyWU]-]~3H}367W=w>@O$Œ2|D7M'B&KٳIY/߃0M`F?N88mNpB\ rUpbkAGH=hz~.n|ٶh_9WQ{wbjo2+evik ]~Dqh Z9<56ڃeY$?"S7}on՚R)Xb^{kXCBu-zWo o|Gs)Cx?/ vTjQ+% fӬJcvɁ(hbvrm@skӖor~\oVw`8'9TL/ ?f>/v//{JI?~[y6\`o۬5XNt0nרz/.d[6uk؅C{!ȊWHmuMRo]v+~K;i$y|}L+ᲊw2fac5hVk;h:w ɣ&3GҷO|,Oc=[o2ݕ늟\!캋EIF\}Һh=I]Rr _0192/ .o=mЮV=U14u Lgi@_SZ1m3;b}vj1[fwџgi|\3UI*7q2 IJnA 6V_-[>XJ յ`e|~͏"1LDzG{\<˥l`4t7ZihWu0WfPo%f;ǻ~Ў˦iYG܅ThMj,|.!xpc& 矀ߜ b_ІA[:~C  ڡ窱5O"U0g*Wh8ȋM姶C>1R.G.ǡC//7_N8xW"Y/,N?G*@7ɼhZ੧*pصk7ˏ55أ|tEJKSwLz 2} W \끃~LC޸JKK3w&wܡhIio}5jm((7 OdGwu&#??w숓%\rq_Ua,妸@u1տo|!؅ߦ-?iŢ  b619uH.紹p 6; i7"GdA[I--5)a}hI7SgkğGCg+/kzHIަ@%z* i>au UÕ6sCjwpC'Zpcl[֮+nBšm??"w?uxN~Mygc?5\.̝-ߧ!4=w#顐zPȟ؄`՘}5I׮]=癉oh99oiZRx޻p r 'wʲeK9r:r^ Zx| :[յSSXRW bBDeLD9a?8RTQ蝪F|=_&6wF )Tgʀ(QmҠvPdħ˟vmYo /z;ޠ?-k+32h 9Ԫ Ǎ0hW4[sJphO OkF̨}0WN־P.d /#ѽ|\P2o,8(Tן08s>nO$+>5hu+5فY'j|퀁cjَ1nKFؽ]=z՚[)Wh$65ԕe3]} 2j.zC2hjO.B3h'ws,?_zeDvh8qYg?#wByun֣۵N[oU_ٛt?J<;oP'$=FoZb*LJSq?ܑ6*5EMg9/#;o>gϞa*)؆Xe~ w3p3a2wWɰB]p95fcg6~H+ w}P# j_YR#Wz:s@F?uҷM\_Y(գtMMC K|pzOU]XbENCAf9]ͨhSmˑ1>:lB?"&o ?O/[Q^..]؊䫪PSM0 u5Gnj4٘:W{3Lz~>ݻ!W~.W $LW2R ڗ֨w.vRJ]V^!{w\|饡5wmU.weZRw˂H=>&<*ӧ4:aIпzALxA'sfϕ/OUp4ZaZQf?dMP2u5Q܌_ynv~6U$#-.MRt]2lڤBQg?;}j ڷ6ZJ Տ6.z(jiuk\e *V?s> /Y&B6DN ݸ|,>33}v/e^\4mG ݏ_xZ3i.Jeǡn wFS.;. xtCh cLp?f?8bg:IM򇅍Z5<5Z5:XmZ۸aC{,ze8_DUՇ&HT^ HwcQ zYe5'(՗k=K(Y]̙-݇ڒrDc+ ՠݻh肾e C{ІPX>R!SOAwœ[ԏv^=?Yd3ƛoBO1Yo ]epKXA[RqqƢNO!0ÊǗ640H(MnYߝYǡ~v_:0],:hw<IRJ%}(W?{[6l;\4.ި}k]!kɊ#NN[+h~25 $J;cwew? Gp 5 d]-m]E>|>Mɥ.qE^.,\=%yURg5r·v:)A|#7٨Uܾ`MRE2? kMY߁ߍ70B)'{+tG:K~?=$/mۅjOE`1kܓ<cwȧ {bݡmMnPuT:+g}>/J [`ڗ\dn6|hweԨQy`~H޽?AۢB z(z!F Z?m蟷~gZ9qDy? ˿Gʞ{ȪƜ8$4|.79Oqǎ`|PRRI<;9g{5zlpro:BX1]\X!z`Ͱ4 01uwdΘ;-Vں冷Qv ,&u[uWgzʇZ=]}dhNζR8z>fTut0W ?\is7JՁI}eG}%ދ*ųon{Y}ٓJM V;{}6ίh«y:oZ6Z4ЏHX> #AyՌo Gucğ2JWwܦqۄ.5Ai6VTT=+J瀡E^*T$ܫ5F`Gg69a0"͌vwzD(S[W.\ W.C!C[iTWie>vhk׮W_ء\#ݡ Z!ꡐ0hkyGX=wBm$3gj޽G\FSw}2w$sfHa]hZGJ˿k=\#_7Tn,/4Mx3d;\/X݂OS.V?ni5j[!СZ7#G(4EޚomY>'Ձ %'i\]ܳ.?ުPm;|a[a~jVpM8oM<-kԠ=n@ !Ϝ! 4*{>皫-[ʞ{%?%Cy~S=P-CIwu_P:w$iQˑrOO8۰qܨ.Dkua_m{ӦMұc'9tYGwm-q򃊠|_@x "9z5692WDQxL?/(K8?_gfcv/va0E߂0`u `'gD}8a.=pg^yuR߷ k|HP%'X3>Hb:%T IU,XZ#L0i :+ D\9-X!";JAuѺX%3%flWWTI͒2wM2ho[AR?W%DM fmlRqqQ`xam*MЍ$3.,ꪟJii_{GjuL1􏣎>F80'ァɷ/@%wq,_Ë.ʷ1&Xظh/o?>Ƹ`J}17D'͆Mg &|6[/οw_~~>FwhSʦm?@FV5m{J :?D^"x T:<ϵ5Y}n<,s(Tfo|+WkwwBc1WP=-xV_w mk9 *km(uoC[}GHțB:i?nYQ.||<+MTֶ+o(?c^BOwR,w?·Vk=u>emܰAz t!3zGСäcIX{ySw!H?u7t&m )XnxAT])gB]HElZW&&ՃNjM@3B?eb+ұ{g)(v;'#0dURaW|ָM[~O_?'!%)(05ǐjv90~j<)+uup5 jsSi@2$/W߱F-ȃ \wh_.G`Ў y((ګ[6K,QI*_ʘ ˟_?¿d=FRzʿ<ַ%FaUުFK\ᆛTw瞓_֚?@7KOl?_#^S~g"G9C m!/(98_;|hm= qrޠ\td} ;AoG ^H~NPk08%م,MfVYVY-է.cCL(9囑jØn"~ߔjZNa8CnߩT.HXꖼMCFaGOtß~"?٥^]wNFEFG-gy%A,]w{}J)Ԟe~Zsy>L5)Sțo)Cñkwj=C[]u(;K{Y5kވf+sOC8vo>zV3ˤTV-*.FCwmNihU%5q?x~P  8ShG<3Y^/e\_Лq gl;28 =g )|).ҟq(-45RWWJ~z*xЊm֪VW#IrʗJᲿJWT ~0nղv{$ONhSo|g weiIquC+3k^)I{v,\_*^]i*P#_r>Q2[[ֆ7~߶Ouԙ xm9pqQ$C다SAv@#܂`gvUz3; wh& 6*e-Kϸשʙi (gxuϱy"9w5kUA[Zf}j\~Xq8 _#&<*3gNrzuW]S-ݻpi:uL^ __z:t<ݱ[ռK_o?r}joOc?q_jOg\ (lpov $z0rU0􅻯|M/z oy_˗HG$o|Y-mۃ}vpg0Fwrvk| C|NR0C ~&^jɩj;ItMz ]|mSq\SXQOU,~(͓ϵ~~]rKoɨNC*,u*ߖ!ֶ2v*W*KCC}8soeWV.ZBjs>!m9j]ٰL}]scujV=H]cEqF9۪ ɘR=^A:T{Lfm{C}aF/sOrqg#dGm#F\=b>Vں쩑@,bof t};i}84.,3O΁' ,-/tbK˪՚o2PWx!J]%%%v`" 6jy]zL>m*/{Q\ @p56ߴ?bM٤iTꟾBަq"?9ڰ쀴vDSpx[a@]y$yO > 5HTHKS8lzv3w??_HHE_P#jc9 ͢qm@tuMm%-Q N֯H` &ݬ3]Lm ?tlsC/ThdcE?Ȏؤ ՛?!/p؇}p72[8Ë)eaȺ΂5%v܍w|#gݧ7AgSy?OYƝr_(;(f?X/: ԩSeRTX$'r*o?,s3—X?`OS@~?O։͜;24 F߰,PO}"SY ϣ-Oҿ ym_ƛMkȰ|p'`F$@X?8RpTX_?D/?[?௣i7 ?~Y쯅裏*7UPCXMAҙ\`  "&pkW 4!k;Y>WfyG _?)WTYI \qeߴ?ki_hG_RkaMթ|c5@? &TXO95̽ iW{` PuY>'apQ/CyB)h!#zE+Ca Ar'O6}Ec oԿm#(zW8UGhFe_ Z@wM>ݫ=YySoeij}4 i1A2;:ɯ5Խ"P-$s%$d06 `'?>gs _ pqDN/꟦QF__ UH*' +>\:bg?hG~A3h eD7|Cau8vLF=7=& w#Ay,H7AӨ8(LCæu >4%7a-$3f6ο?و R7&LP6[pp[Hq+M[S*+ u/UװMz sKgB=А Ey.Zi-aB|@IDATğ V .)(9pr}!'o?lGoh7:Hg˱:otpw^/QlKf_IT釻onywջTf zq#! Bi:8puz fZ J̞ԿLϤo \z/2 o?] ?b\PE?ՠ}xGIi~"@ D"@ D"@h-v/ D"@ D"@ D$ pҠ _ D"@ D"@ D"SX%"@ D"@ D"@h ڍ1a D"@ D"@ DChn*"@ D"@ D"@@chn C D"@ D"@ D"@v;V"@ D"@ D"@#5/=ѣeժUKc Dlwv*7o{,} #%%%e˖Q!ւ"@ D"@@d͠o~S&L`w}e…Vez)wu`a[F+ w 9r} SLiӦ5;o4a*:(J7nE̜9SƉ2˓{N9Ylvi2w (1K{@ jnr<ҧO}{Mea< D"@ Dv ڢض.'?^uo֭3X)mn}k5kִiYͭӥ%Wjl()..fϞK.$q=}{!&Mdst!ެNVskI7_6A[MՇm'Ėؒy<@ ;-;vΝ'-vz65W^ޫo~-:_&Fd?z7tWoF<=}A{ĈaB.?ImI7jӝw+*A_75:C|y<@ l@F\oq ;#{-húu2^gN6:h fpus_X_>?<#~o=VmM7͙3_ 80m/1M>n >Mh<{WO>Ļk4fy<@ 0~{=_ OC"͈b545*/}WtX5EҠj,2<}'|_ˎW+y<@ y<@FlŎm=24h6,cXKl|_zj8fWZ?q:Nvz|Z:/|7g|}˶p,y<@ @SI>ܛs1w7mڴ-Q\5S̳A٩̇sHy<@ t<v ӧOtͻx O<_w_Ypaߖjw}׊]˟gQlb#_ENJۥ8lioǸDDžeG5h߸qg1W^9dٲeAo6°wyGN8 Æ "ottDپ_TwQQALԸFQN:zL:U ,-%#-~wlCNSq'M]-/5(H4UNKu\uU\SfUë9`L;-O:K9眔G%^+i/˴u 2 -_Aߢ ^P9rdҸ  . xMy&hS+0Y[F D"@ eK X0k;2h֊4mP盡Vw.Af/zНHM<0Qkҥ#%چ5kֈ>+ձpucF! co۶m3Լy|(_+k ơ?L/ݝ* +x-%t d4[]]]8nݛA3 wygHLtu} ƧkkԠ9|+!_AV@|aymATt%+#$50/s/,2hݓ&M HJMM|ᇢV*A;hk>  D"@ D|a-ء5hϐ#FVKˎo:tx^^^\Կw5@Y٢eޞmٲ֍7#j ӡ}jзtw}w\Tl?wk_MW"/r\tM)/EAeDt==>쳰Ͽ53/Yלw_@6;ͫZ~}fc >*۰aCF.;$96$h๥+ȗl诩%%H ]ܭxdFqstFEy<@ lٲ31h0.^8\` =.Ոd ^y}ăpucK'EG6fN2|‸(v%N%.>H ?w`C5\#\]$Ɲռb/$nO]x]tQ#M QC?]TqalheˠکSx*Zd.eFr`Sw"IEhM_4C=4.@LWPV{K >%sF&_ze2mŇe8sy<@ y<}y΃Ԡ΂W]XK!em٩ ^ (cǎ"KHǮ qi[C'-'vf3U}/0]>HʛpW+[t်L;:=l+W( 믿.uRNEOvI&2%zqN}]=?"i9hwK ڙmA; ]2/=U6&Tn&Wa%ě<@ y<@xU;"' حѴ|N\^|IRߪuSߦIӡn1DG:.kQ#rKtO?P拶5/sTh^_>?>Δ=}xdà\Q3}ʸ+2-^H6jО8qb4W=Q~ |wĠJUvv~~~{`.ǯԇy*잭Tn&k+èPy<@ Y3h 8cv[untvڴDw23mgkD \oVvE}^}iv9ng!h„ iDg ;S:VZvj-w5]pS.3:YyQرcI/뮻:!iĠ 6hΞ1?fH÷J̉9y<@ y<)AX'7i ^A%>I&lW .HxAwUoK2wWqhsCf׭~OQv6;l(OGq23L˿v[deE ڇvX4aO=TXFÁt7נݚ-/sK ڠk">uQ6-F2|F%<@ y<@ X<&m8#M!2eXFwVMCuk pYȐ`2a]wpd4}mC?W+[ωpLh=}xyG7h˖- ږ.L+$MZ63/0pǜέ_hF21hGk_{1M7ԨM꯶vyRX_/y<@ y V A2E~Eo5X{KÊ5tkq]u:8<2~4ȋ>4o@#wW+XMA' ڭ~O>2|?1%㬄Yfii[ko~7i!{*vkW=֠!Ш vA=[r##Ty<@ !YDp|[ ğL瞍aiO{IYO4=nMfk/V O{bNK5t2p]qަM:`^z%9v0`vWy!Al_ΰ${|xN9a٠~O} ڙs~իWo{}iED`Z9/s{5!>+hW{K ژ?{GuTQ=Pؾ˗7Jj mwNŗ~'y<@ <v jtlR .auu[er1ٳu+hVTT;%}I&jdx=Q,X2O>)gqF2Խ%D}([Tt.!S:jG}UVVgD$s-#F5Ey' ÂvM&O,%%%94K >x5hX_jnL_80:vF>d[&NhQ|a3YҴa٢~O:^ZZjQ+V=ꫯC[Wz]{ruU49WeݻwRUug"O&;b$ռ`_uK;ȋMKaOIy(V|u>bDy<@  K/`.|_z%.tWi҅n6HG{ʕVO6-l7I}x^nOx𓝮L4e~„ )}ɢ\KYW4?zwq)7TSph?'?I/t78觊gSO=5T8s̔!Ǔkj)?'Ow^7sM)JV砃j2}4oYw+{psuكh\MJ6WNɞ/2Y C/)Z34xGC鯶àS9'y<@ ;vr ?V w@,h67#ɾH%t.>C?uW%n `i /QP?#^{MSV?=@4iRʴ"E']ٌkI+%tڢQ~Q-T}b|;) 6JfQ\ HeQW]]eWUUou/~iuH)pV-\-Z$;]FqUD"@ D"!`.G`֚FkРAں|GwhAx?ۚ'_m?mEsC W v6ti2.ah69wy<@ I,0`Iut kP< ?v߰w~]I].{[o 0jr-_!o #[ctv1~gy<@ QȚ%+L}Q1E$m_FtǠ~1)۵|O6j6w'f=xW,Gy/bC5J[]\b聗%p'~E2N(H; D"@ D1XO^S֋_;Vel!cڢB6˖-3>f4VԩSʌ3Ra D"@ Di/ɓ'7vڔZ쯝5"cǎry'/_\x yǷaϷC'uy2eeى|'D"@ D"!@e0 D`܆{!Clojn߿OJKKN֭['͓UVmz "@ D"@ m m0"@ D"@ D"@@VA;+0 D"@ D"@ D54h5¤O D"@ D"@ YAH"D"@ D"@ D"Р> D"@ D"@ Dd#"@ D"@ D"@@[#@v[#LD"@ D"@ D"h $B D"@ D"@ m mpG)GTSLiӦ5)RUNj6K6.'V`tʫj:/mt٢v*>X O>r5ٙ"@ D"@ D|AkH^YSeóE'$ʇ'}oQ GX,Rjj|LYvR5wn}K>rsծo] KaO&HnYD횵3"@ D"@ DІzRm|F_za=bt.'?&4٣r_%[t,94xMyPUSiN7,W^y%3g|_ڤY<,]:Zy[sW=C} ?M6Zf,i r˘aJRY~iE'e-rI2$2guӥO)e}j×>F*fhWKU? WvD"@ D"@ D 3ՠj ڎNdԠ][W&u^*9 IxVP^p, Z N*Nɓ'7"{EHwTrW%ȺJY")NKNG.!foWw ߃r/ /tH\ShWl~I[|^RvjGЉOI,o׿J~y#9&,vFz0 1h=\OqEgG/D"@ D"@ D |!ܜWIp5,݂keҜe+kW52fNPA{s՝ Ceq@;-3"j>g {/uQ^ .Q^%A%IbmnoٻmR]IBQ,dֻs{ъupn-y_S0Qώ_bvCj^0>x^k﻾xdyIB}BJ6|_kw<4e[*#|Sz|+>ycJ݆ qtB D"@ D"@bNU]?h.~eVii3ʠ-g|ۍ:ijv4IϧzQwHeu=VF% أύ:YEqb|9~뽷GhH#tTݸlĆh}8x)k/VÎoY&>7K-[=;(2A[j%)޸ʦ_%^ΔέMbT+C;cFwkbui‹"@ D"@ D%4hGmA{ngYk-}/GH%}L<NIӦ " cHEJy}RI> ,cKi5kB$N/#[tByP#>VA&N$]2_|UOI%!B*6 "Z.^V]WAQ`Q*{-$?gpw'̝;}*nvtxJVͬwtzZ֙fݫC@@@@@@@@bAF5TAk,l=oc?Z͊ѣ_ϕx [NԡĒ"h?D]j#K>@Qu%W: xiԖSȶeߏMʎe/}rf&Zg^`u53O\۶S.])g\l]kWʟ=G݃Ċ@TCsi"q5u i)~ʅHs_;Fj'An}!fE1)/Ը_N|zꩴnݟ ~Něo;ߩ4!Kx1E[!JWݣ3:qjr&T,vqKBUON#{e̲Wv#Q۶QV cgM7Q^5O,Pϯ8탼c>J;QXjQp+ vݪ78pډA18|g^z[x}vq,DOj`n7$/iq|&sA!WCk_N+sy<ヴbT95]lyHNn^QGYֹ WVnM?t|iW:͚SSVplZԪ~ e)fhYilzo-RjUJٕ/e1;Нl\z5G vxɟMXQY^Vh֒Y#Yg*]Lg4,>4/?ET\#΅EMT%^1]PGÔ-[Q֭YT?-vvc@T=_`o7FҚKS|A'Z;)/Z;~.'Ydt?SzJmq1[b28m.nmjWZzge/_Yd~/Ҥk^Q(ΦyyŠnW)SԱP{)iD .[nQfYC; UPX0mNm̚uVӚ7fSLG'i[ozmP)g&W_} ?myep'jIubؖ-wަdbji((^FfδX5g%Æq6[8h @F+h;|W'ZxR0>c6ߦ XVxq Ug˾":R?.M=U>>]rIz _ϯƋF2W:{,j'AE)%2qp/M]u9:4]sqփR9$^h9/Q(ܔƋJ6;˗W6{/cuDK lAQFoj]p~T%y}sYo]P\G vw bvj4Fu.-ƍI:tHV]k(aݳ|딷顀~s5ƽ[ws^)9d7yY>sMNԭz-۔sm+iw,k^qڍf>T)!9D;hر>DJN;yAK7.s[k[$^,xA lAۋF˪{ڶmkv>q@ Lt:ҦhZBO!I5R11ɟ|Ҿ ٷ)Mt署یNڷ '|:lN~qhL^(6 5h^b#AP!h@Ў(6 5h^b#AP!h@Ў(6 5)hr)ƬY{A@@@@@@@@@@ 0C;xa@@@@@@@@@@+" ;          1%A;xa@@@@@@@@@@+" ;          1%ARٳcGYf԰aC]6+WvM;vy3Q턄[.5hЀrss)==֮]K˗/5kPAAG-N3Ըqcsj֬I{졅 Ғ%KѣauZjԩS'V3gR~~~X6'|RSSuԶm[*,,iӦҥK6QV[j[g#z߾}aWڵ+rø@@@@@@@3SjgSDvEET?I̡}cБupTnf?i)B_Lǎp|޷o_1 8Si$›l| A<3ԩZ_kSN~Bk<饗^VZZ1{֬Yt^/'իGݺu3:t@";7K B=PPѿK.SOQm+]wpܽKl>Z>GW^kmâo|}{=\LBnڶmy٫e+d?<5*     D@mTHi-[vvvod7K4}=h4@>5Ō?2a[Օw~I-ۮX/{|7B3Dmc7olLlF ɧ+V?g̘~`/# 6_^#g/Y{I&F(n헳W⇈[KwOq(>#4vk5f^}.<8c1 N@ b1(-;#,hSɓxoEST*%$%Y~ϨѴ[xVi4l#G(vNk2SfZ_|A={} o^馛hȑdkF99wԈ<4#+W$@tvIq+I&ѥ^cQh׮?RRRLaW_}E'Nڗ'|93[~ 3OQ2S2}QO?6 ; K}]tEg0ܹ&_o4w#NC^#vg{'Y4yd3ň凼@,26*F2MڵzYxCIދǍGjղ\4@ɯ0$]v)ʭT6^}.t׫- o @@@@@J#ghˌm)HZz-fpWGbA[fbi{ۋs&֭[ I+·3 3{ĩ|Zd my"8qjS[;UTqUɿ!9uk{,UVu/hGƵq;̦s TΗnqz,^bSfخ[lǫxvnG13>@ܯai~6FY-P|z8O]yl^}.WP|ϑZ|V]~@G7b1@ b1Pb4J9mP_N6n۪3gw@ж_Eꪫ\l-ۗ` A3X”cRP`\xᅶ'~u׭ړz?Æ Ur@IDATS %݅ /(Kpz:%s

T^=d"a{=Xb1@ bxbLm ҁ;sh r-ڮp!J(WHQÐ} _<ugeTْr:}qsV_pݾ8Ly*ۗtLNJJ2Z }ݰaCW,I'd/pS"}FNL1J>_K)>bjڵg}ֳ8}4O4_OYFFg~z@1}|{Wu^{31/?!h1Eb1@ 1e1VK(Q;~K3dAIK o~b\Ŝh+A[޽)?,Oݨ~8;4va~ qs ~Pݾ8˂s[ُ֗lAoؾ}ƍ ιPܖ;ϟ?X`9M"d?Ӷ " '?%]O}>^ w,Bg… m?rYٳgs>f=gE+)u,;Qs#$c=΂h\^fZS(Pb'//?+t9(Hj8]E[G4.~X{3G/>-?{1@ b1P|1;AEC?TpC?3es^|Aճc{^2{SFW_1r?ncwkr͆ph(/mo32YWNKK3m9Yڿ̨}衇l?ǷM6+GkՕ"n:gYej*.ϒCIޫV??#vLG#իQ2^U<{뮻N_f{իWhh믿*!/:h뛌.x]E@ yXKp?2_󊏞*Bޓ6eysяymݤICj$Pp­ﺭH?m@.@;b1@ m&/k5zA% 7cQ~䜂qիg4zjuvw;ߟ[9f{ffq̲v\ki۷%XfZcYEE)ܱNA7Z׿oٲ>|/ Dԯvmќ9sL[_}> ]v5 Cf ~7dѱX3hڴn)fl}YP袭F |낶䁇++Wy/Wr'{Iבטu]b_Wmg9xv +>({ b{θ0}^-3C/^Ne_$P8H"\vrep nb1@ 1Y ;nWpE"ne,X"W61f866ڮu} 7lUo@#A[t-Q#ŪN]{3x≐ d3kgiY+Cǎyɣ=eu ڒArZ6DqZC͛7:'O]mْ7c\_(;ҮNi*c-9u>8=OJJJq49VmQʘ D^郾aƍmBocWu["KuCfm낤Ļ8^QfOr$łU[n<0w}:' Nfk^YlbE|0`c gnծ_|ot˭r$P}饗TlDڥ?ncsCb1@ @iʑ7\_mhQj Ck[LNf/%'t=ν%?%KY-2nMiqV=}/)q7㎀-_{aܹS}{LuKfe%Ⱦ}}z+VM1P3wJl\KA[RƮf͚ƥK.>3e"1VlHY1SHz뼵w%׺={K.ǖe3GxQ\_$nmoz]kLe˗kr_( `㏛ֹHٺ?|x'gyF]䣏>R}~N@݃s?;b1@ 1M9yJmt_/k-/2xq@A(.AZk?"78|_Q>\N ,'6Lٕ:->׭o//1Gצp~w]s91,&0_%6"6O>d[ߜ=flwoE8{ c#<TL7x/iHHgK{ρڲyͧ!)jТ߿~[~b/tt?OIVY[_K"Mn q>lEjtEЎsٍ m|q C\ b1@  O*oE!J]k˞pq 5g+Kpr,/۲se45\?g nNd~1BЖ~WXј5kb,%'iSRYHg=>f> uB-A'Mdד Xyo$Dz0ѣ]Ӫ8mK>{ӳ’=k]_ˑpc6DZ#6ſ xÆ &a) J#A~q`˭ꗳ_%5ĺ읿\,gK"myND>$3/z A;esA_T1cb1@ @Y 2~Mۺ=-Zb޹(^7#Y,43SeK˶\zK qkԨa{>yheH.ho۶vM'et%7>mڴ cuV<4t6z?B%ޙ]_XeCnUϫ}Nl!d}4#zJu!~ӦMjWo?Q?v{Whłn_u.Z1?g)\y ?j%Ү&_~k\8׀$hH>=m^i:m{We&%8S L$xJQ:mo":.Bv֘^g2\j9TA[-9g^(qwYXPRGdq0a!W݆S({lץme=8m/Wgڴi>S1&!H*+*8 eE:u|:tߣ\v|ƺ9E b1@ O DJ 6g;|^HPPR\PձDm`J^V?M[IZf!yQ{7[(Yu]رc?um}1,I"qQqK,`׋-iS>_7->^ o,CMo+{Gݙ*Dt,[LՑP| EvcyWm1J;yͪ_^DmuY~{Qu_t#xү{nS/*6^q<'EtGR,}rʶX%6Qze_%¸W^תva-v#\vsڡ̍΁b1@ bĀgҩMՊJ!j6Eֿթ3y+_t-'~ť* ~h/\AJnF K9ԽV9#K4$Jɓ ѝvoW݅/v`e1=OζO6VXϙ3~mL%_.BxcݰaCc~H{=z/uӞ~i#PUGĸ,ṭW_Μ~al @C?+$s6_7<-wH͝;WAA6[VFo~(lK8xv9/H3@/ϒ,a:ل>_Z53,~+I]\rС~99˱:U7x_UH 6'ځvp9b1@ b A;A={63 lI&ORB*:|*TPžQimϞ)9锘^c(۰3fRZtxBu,0CڬUJJRv>/XIȘ-6(AdբͩS"וmQvtlFUYX"K<U]1cwy8VOSu<2$)Lڵ3Bz4rHu 裏cN@_|gXhtuk!6Piϧ5kڮ, )NiAGWl+xbvN7nܘNql?q% 9Zi̙,VkÇSN,YB< ׯO7pIkcx*^:RX&i!8:FM6ロիe'^hxf6^bO'Ok^OimY $U49&~bU%0gS҈#9 oUf.uV:,7USegך/lh:雗xϺoі#>kQ5cyĉi#?! {l2Ny"?/gy-,)B{97e_C )9'P-ѓgnis/6^.ф9? sc׮]:      PMdNYOܡ,hf1[@V$!%ů,vuwߚ3[\UzZF)U}˖sֺrCٶ~,9v0tm,v7,N]Kgo^#>|wAoӦMEKP}}>ח z/8_ö$a3F1C;cp fb1@ ].7זvenj1! :iݲ& ^z!.ѷ}3t!%66 *$^?m6nPZ}ˌ^4ʟ򗠾?W Mu$%?ϼ6VZYe?k,CeKJ I uņzrM, oyp '?mj?k<ڧ}[Yۑ_'yF^ݎWeyj$"9IG#b#꓈&@r[{YQrz> ڒ.bSxFHpPϹ>jC!7[ҥ{NjxhGG &{.@k$_bD1׻i晶~ǽ,+^Pq>vO\t^j_WT)`Xa_1Ø!b1@ 1 ZvX)G[RժT}{JL-GEI҄8u;'󚒪Vc6!NaR?ecaOjG֣$:]KG$?MpOY2Shl=㵞L_Ri=X-6KkmrV%}`!Cg3A^^^RĢ&3رcLk5"n%Mď$)8ĞSRjmz7Ik#|ijjns!i X"ΥM 8=2r?I#')}$8d}^^ Fޯ5ϹT:zz~oF}_}L)$ F8/F@ܗ we h#        pb0SN9E;1z^I !=f$./Yy$88       L38 ݻڲګJ{MCZtBĉo,Q8@]@ hG/DH׃VٳgGh@ `v@"LĞ3F          D=, {h@#PjUڻw/q2W^!݇J       P D-h'VDno5}XEEthLZ*ز:N8jKU"o}%wߏA"0dꫭC}:u>ر#7N$f%ةS'*((vy%~׻woU3Ϥyc@@@@@@@D$` ڜH'rS ̄ZSTcC:f5%gdRQK/*MvZl_E~ vci.t&Uqm7>8(q#XR=B !ըQΝ#O})[-hf$KFFFT)k|hܸ1M6qJ..28qb[lٰaC裏矷]"^2wgTcҺ"Uɜ]?Ux.+6%ݯDxwbڎ~91 6>Iժ"meoS&$`}'=5ܫW:\us|?oYWѣ^flykn㜼W 6XtB"h"c[.k^^/ ~0X!ʎ}J*; ν&^'cD^x<6,F,oQڏttYV>HׂcF4~c/³ Napi> /a'cĹz駟66oެƏ?hvi~m;/l͙3 SE6}g,g%Uo_wJ&M^O^ΩƏRhg,K.D}{ 4h}V/$ŃY/+m,wM_/t-?/$W_|AYh)H̴n1묾Zu,PTU}rx6M> gXT J\ɼM|^4:vLG lᆬ;ciI'y=T't ڶ#b)d=Vqd.?\4'qw#jS֭[gc&ݻxV6IK*i'-KJ雵I* u>^zYU̽.hGcf"322￷ݔ&Y["˃ k4eZ|9e655jd^'hG;^Ҧ>/W߼ӻwoz饗yK3Mg9C{].M]yMk[b|[lJoV{}!ѣGlwqxQeG`vG~?7nj/;o<9s&8pL=""g ApVE@@@@@@# vX)Gj?Jj加?fu$oh1o"nK. i϶b[l{IGQsOH0$5uoI-b]u蛯}|VA IbHmhdS5N<})GJ睧xem9 nk_R;\q6X`avE=u+ ϖ5N:$n֭ ΃IJ ĎM)Gv䘅gՇ9[sL\Xld/0Xyz55e} VfaO~FG F۰8mki[ڐɓ'ۮ/r[?$y"udxֶ'?`PC^z!fOd;cƌ}+Sk}mHJ g7qZ.b1@ @Y6]o %JHHk]@,)jr^U&Zss(X CV_ .յ;߲OYӧk4BmkkGfZv}j&z"_o?/V\⋶NA{⇺ )W = yaݫ/) O/ֵHX5\cʼnCm4p/W1#b1@ N[yE%Z4/ YԖ8y!Ҫ[]74l-ec4vi:q!>;V/ G*muneNhk+o}i6ub<#!%E)397^35]C:V]=ML^V_}U%PO W|~9iG `##sN{5^xm1*aÆ)#Gu wyeKf낶3UBΝ;=]tqku-@,k֬18Jxw\;q##b1@ N[z~%ʌUi7SR*ʆU*ssK0|Ⱥm]vKݡgؖkfG]~WP9WMЎ~o(hWm%5ű֣k~M ڒĺm|Ϻ>[]ݭݒ<'a-aY+A{ҤI~M]{衇luuA;;R.iA;99ِ|o/~I UVU\:syyy}v5nķ~, ~_r8jyy!H哵2߭o;1ǘ#b1@ a ΙU]8Pp%_[ՑyoSU}YgM>ST}ᇪѣmz-h;[#aHmݖ4h!uA[O!EdDުW\aW=P9hE+hKŽ醾h/PF|Z,pc^e/^SNUBؐ!CTuNz $^'T!WI_m ;M)ǃ=~x-[>9 vx4iD%c/~Or$?|Ol1%q`Um-x…̴mvk]??s,b1@ 9"k=ep!KJ*fM]mH:[XΔ(i-Z WTZ.S|XB!]46`#-d~bn ^r9A[JXd*{4l}曍,}wo4?#% XT#+VPu,q|6?CC{ei7mI3N^nɦ%ׯ[Dab#@֮ڰFŌ^KA۹-y؃c)>љ(9?b1@ bċm[tȗI/ F|f6ڬ_l4]f#g~\Pi>}YX>^V`>&`'i-\fe=W_i"M'O2DD~yYBЖqhdo4z`v>mmUveaH79b>SJݻwwmh_-_%\*fKZHo;}}{Qm.&eh[)GÁ~p*ԩcH~q9ūm)3-x>> Pf(G"h׮]غuaʔ)Fvv'|ߜ9s|R9rG:32F_|qERXaz+sc1G b1@ A;A={6s/bHFTu3hoի)f&?d񏛩\z3%x!=Ѓܱ-[hW#J^]}5%뫯65<Lѱm)r%JkڔRUu0h?{Ӟ/PۓrŊEN ~wy8;w.PYl;vXTCSNĩ1 {LJ3ċ Ԍ_O,N¹W^4bu*xeDzgYL&Nqb $~Z~zGÀ{l}ŋiLK,TzuѣǪp5ט>ZDzeϋ5kex:rJUMѣGcǎ$zcA>{`6B&믿*N:9#vu≳7`-N9c֬YaUns^zjp}ۍs}JmO|MЖz64E\|m|Wvbr~)F[dQ8~m7 i?%uw]D\g-?9DhZjf=NACUB:R(dν{&Γrv,aܵ'qE{uXlR~g^pnemNA[{1^v_MnyvmI NCC<3y_ ^{v^塂|^֭[״/>=>myqgב<83;_Isq!Y>Ad6G' (2ؖA7,֫V4kUW{%~+kHnjmHZ]ck}?agm iuJ9aͦFA}R6U35 >ₒK)_z(WQiytбqmlg̻jGO9boaQxw#qw3AUIЯ_r9/('~H1:^tG5g8pȖ^ٱYʕ+,q„ XyF_;wuWHv$5,~ayX;/~IzgPkǎx-Iv~.Z><+`.Z)o>Cπ\im8uzT#ݼwʋP$=X8H݊>}-e ɞ>C{utBlmדEeN(mCIтS #I]XIZ@[4Ȯi׮EPRH\ 0pqgT )))$A$XDDuj۶y7n\DvBIO!3yˠɯ9xJ3f$n8qZ͟92;8#X͸B0u $ge-9;}bgh7{r^j#앝X#=ϋl_|1׍b1@ b1@ %l#ѤE%cϘҖZӖT I]JR i/nampJU !9iVt}ZQR\xWv"j7@ ̘1hѢE9srөj[bSN{UbeHQ!Mݶ=G^y9ڮXթvC9~gQZL~m6lnԫWufuЁ|(=dz衇u|+е^Kis}vo_~mn+fhԭK ?AiMO.=L:̳KÖ̳5H$[y暛n. n1^UK(㏔y PQ0`W/Lr6c j޼˶SLk/O[~>|xP[Gn  A@@@@@@@  קG)̆6 v젝|HG֬L*R;r饔BINc)&"AW;' [5^A;fN4ASN4f~*h,lE^bt-_|1~wq)\ M6z*\ BWMKKXV|%+U,3A8ף/6֗iØ7o~O<oѿN:N>dc?zv.?#:`VUV:9^@ b1@ ]kW% 2#D#$$^A;7hD_{5`l P^[Y>q/Vs]hӦLz\9#woy+MKi;חxH^Ў7Db^3ϞeݺEigƫ-?ġ mmFq?;4va8^vquO,,(˖-S3Ga 8PG;C9bY{l';墨2s~e2c@ b1@ c UuaǷuwE?: o3jGY>H mFG֬nBj*Uv%Ud&>/p]f&^es2/xlȼNX澈ӌ^ àԆ$)p)h{/꫎ Ė}&Vk*FYۺu:e߽{w:tj}ɩxvԂm"AP^=Zp:Wn]*TP8͐z:@@@@@@@@ Da ڵYd!Zo6jbSjIS3e;3W6CTzォfN7w͐.ȶE'p2=*_xYoNA,62V8ܪ|3}uzW_{US5F}D]R~+A;8cƹכNO ))&yX1BESPBryH⧈saYwmԨQiFThfB+#aj֬IӧO'-о馛̲+B~=N~ԳgOӾNyB^xzgUhԷo_y@paЮ7x,y$ǵOZO=N[nիzz,ٮVK&NkV/RE CV_ .յ;GCGQ>6}g?x/yYVu>N[>>R6qg b1@ b1|UOzHI@BO 5" VPq#b]{UAAQQz C!duf޼W&~$s-~΅C!N2+V 9F^~IrRǎӦ=[Jf P GeʱoRHT]J:4cj#HTݒfͩdvum.H3~ѫ:uͷ}QIͦhClj믪ݒܦ$#֥ő:ΥET4m7"ÍstF:f*SԽWFΡaitt&aUH&ɗ=n8uJDQK4qL>zA?јm1~xSjS0I&Mߗqr#WԷܳTo_}]hINǠTp5q4t oWvk8j\v~-ϯ]g{'n/{[m EHLctA8&I;SU-\m]b]DVz)BƗ A;8׸/{Y}+{)o&X9|e~.ڵu,,%goj?ˆ bdlhi-bUW]Ee=++&L`͝!Ɛd        gnqVc*ݿ?Y5φn}:O=EiwܮWmfᷔ#)խg8ܡ"h@kzPZR#8r7~4p[NvqkE|#-h𶞊I64ɓ'{lxg(͜Μ9Fs]ۏ+oQD߀v oL۳gO*<=$B[6;U'SNW^y["iF{陋#G;<ځ' m۶͛{do}ߌ(zujjqIq#aT뮻۲yBRa~YZTa"<@>l84g** y m]b{dRՐ8HYGi!5Ys#B;87|]JB f.h0쯬#k zzΏM1}{B)t[;!"LJ3RtQ466q{j:㧟~RQĿޠ,:=]caXm~~eT[Vc mrÑ#T۬/eWky8ږ#sKvƸsW}eØ:uon2rƦY4^yJ_4?,fgEsl ͛-*:>>^[hSիWqkmW_}Gl-yܲ ,>|>-0{D%mݢ6l8>x{Hق--.I59}9qgX\q}ۺ̶ZvC7 z9S&;>ZVve ڡayO=111ZJJϟ?P ?-|>p9EMhD6"Z%r:.7qR}^Yڕp)Q,s"th|"?{Zdbf7e~_m9qXqNauE X͙6U1|Wv(~Xc^OS,ڵk[inSeR CjѶl٢ھ^ۆ;Oۿ7,B |>msNswiX8JA(:ZMٓ'i6Uڴњ/]4͑і6"ܱ-7nP6z=y#/"8mAk?p+eO=/}4dS˙>M|2BTHhזK7S̡NżYt4Jhsո6h@+:I/L`֭9WTzEWO% )Jg]޴յXR7k0mJیٴoR\n.AQɴKW:xL?slҬ,LBEQLto֔vFVyh~jRƅX`A2?Pr!cԵi-N#uPlzb~%;vPV("*J?f 5n,؉Z`'7]z5%&&*SsUוY`AZN9BO>9]tqƩ{¶v*Hiƍ_5ggԩSi߾}TN:묳' 39?G        ֲ)(A[KI&E-pEsTw/ݵю^hW^GS TfQcrpo:IYc>Lnu%h.à e qp Zs‰3oH ~N1{ }()/vwk y7Mloq^ _ł:te˖Ywtg["x4qD-\@ $A[((KU}cnT~~rT')&-a6}r˂q9udNZԩ^rzhI#%nCG "7`*GsFDG[J>|mg\DRC)oTs WOp5B>ץd!#W߽뼶'ɗ\L_US*x|EUM{KZ-[յS!?,O裏.S>K/,ϩQ^p4}4i${*%ºM6b>W\I{c         mcI+tY$BZLF?@,ΝKfRjSNM8?؞=J;sl=m缦d]/3J%UUڴ tѿx&*ް0uʲۼ™SB۶h%ǨSrȇ-rȷV/kfeƂ?G<*HRidk}6=T=rrraÆS>IRPg*7@@@@@@@!' *=|4ud~1U;|䔗T<8@@@@@@@@@#BCۿ) N~{:/5J -Z~ΛF((V(P 4z=Jb}=].ZJoXNAQkWN9S_Mpt6Z~zG*:8@@@@@@@@@#A?Nh> HlQy3՛/^Os8N6\\ H)W\N^KIQOXΨFԁ@8mN͛7/m pq[ҋHȄ"G9*["Y p#M!GH9          Fv=          H)G@@@@@@@@@@  B;ܞp$A *A@@@@@@@@@p{"@@@@@@@@@@mG,@Tr2ۿHv ~HII} /?IN5A;"6[LEΣT`۽$x ./:2GDպu͛iWӑNA/ϧ믿^>I0+9r:9Bwq=zϺh~}3F{ӦMԽ{wZb>        ȪU-}fS3 Υ7L%[zGʼnI Cʞ0^s(|F!x?0=#"j7г\ 9zuz^xѱcG3cĈt}8)K $A;~}l gg pE3eC#F ~(2Kodq9_U]~DG]<ÇWNs+h\ 8};KA@@@@@@@%۰!5Ť+x%;wҮwߣ#Qt4JhӚ/"bbTiM)w/aQ!ْ裔z5txR?rHǹ6lM6M[xiӦc[hK[lWƖk]vug7quWzu׶mfk„ Z:unch+VXVmK.m={v6 2iۊZS~햵zKrY/ 4ȱO(ƿN|>|>Dlj_,l1/FT 7uuP#FkHx"8Jq|@WM93w4g5̏?D;ƕQnЭq$eI: ,[xv? m NqMkNe<E%%1ToSv* EЮw1WQ,G67RgX}%tUaFb5uTKuyʊn~0n8[M=Y$ôT=z4y ֖ _}U8o}G| 01THg]!!Kw^)Q&lvff<*\@3gv[2d=zYl8h-ۑll)G޽o4[@lh۶6oy#(+(ZUؼTar;gd8q cjIOv(.+Km92ƘAװ@m>k֤"vE<ⳳUgn mGI`7n⥢_6Gbvml8^yznjK˙-b:N?GR=ҡNlhh(q̂逄ql߾D 2}駟-b4)_,cK&IůU|Jkkp%GNx z?,v 68*[-ϤUVz*sPy,A@@@@@@@ "hrοVX+lXQ7Rp4}Ƣ_ / ɞ#}1gItN?GDhŸd[MQsɜ ~K!ƍ˗6_{M3g[ҤvYRPdG{2>ɰܓ"e Mg|b5vbǎ~ cZFp_ks+:o)G4-=#^m-mGs=nÂHw"g֌T)-[#?8߷Mf-sԽŦ|+ט_f{}#׫VRsi$EaoAAbc?Ic0`G;7>\>|>}@$h71%tE5 :UE9s$DX]k^D2Nd$|n#W0v=w䚣5Nߠ;ڭުq_< In׮i&%@9p@vI~lCY6T;v88Nĉ=tMBP˰s$(d)ʚ9N4A[mc|>} `A!|X;s/ߍSd}q8E|Rն?iikm;w"btZ6nSh >rhm'&q9ٖv"Ci`p{N:ݙYm* [nmi/Ѷ=977ҎS_Xڹ5]^`c00l((핲DIsNp~D.]X}w;;mYO?&M:Es)^X[݉=|Q|>oA;M!>,ۗr]hIN^GQecO_:DQ(K'MuWTmYVBJej$zvUZV5NM/~Dr.ΝUlTYpB_Ehn?zYz!cɘr9B`cI{R7v=w=smD=)s=C|ݫW/"cѢEm6R:,u-1جǜC[?I6t:d#C#/oXinb+˟~lVNNN K/Q~.YfT\\1 Ģ/jSSŖßFWɍiמ={6?/ş$w7n=w(81ڵvMOƪ(d5D \}gng`Yg?s9*[~_~\%ymncО6me|R>G[{Yҋ7n믽?#ycMmj}޼~njcgs? |>|>Gh#|3f,?թ媕Æ~i_k{!aT뮻͛iY69ի ,h^^־s$q5N0Cs檲BGp<$">7!ChEܪ*;B;{*9B[ r}UWɓ}cCΞ=g{C=Ds1.ɭq-NGJJ qpu;_]K!))8z-[n.:DohܹVz?h 6RgZ"Om[3l0)GEnjѢ%2?S٭D@@@@@@@\"v`9ҹ#>-׮Qilp6/,m-ڛ7Ym03B;q_USmub*5VW^6_,[ B/ 6tf1QE׎9RZe?=؍7hS7 fncO,vu0vՇyyoxkOv)o5,9݉ױf8㌀Ʃ^ƩT-7Pu1zNBᅪ>|>|>.V8f=qZnb6*M^tWm9m ډ,<iBr{s6snqA%5ib-"66*]Ж}Q%Dn:-''M)88׶8 ǏWv_^ ތ3<8mڴ٣ O%"hM]Mj;wTu7p㺥[e||>|>%h׸&0ʛ6zF= W"rŹR}^Y 7AsCh/R6gOYLL썉qdu.qqE79Y FnEӧVvIЖ~ek.]թS>^W\O>]%ɭqEt77n ^_k1ߓ\\ă V^m|N6oti׮]7xCPkq빛ep'|>|>R@#E͙:"f {Y:tiS'Cki#{$-:#2Fltjt,M6K4?԰Yxf3|~YCtZ&lL}-y2V^` cpJ{i񢙏B" Qyɂ]k8<nx %Ind4NumGl]k^i.8/txNc?ٚA>%hsgm޽jm1eŭk/6FJ /t]:\eC8 byH2duH_7/V3|>|>}@5|fЮ-5;"TC^u(V%9j؇b4Ϥü)oxtV+*=rRjϞY겮WoZ ,hSiz]8l )p*lҬn,LBEQLto֔vFVyh~^6ujœkT%{RБի)2 UiӚ09\y%ɛѹ){wf&|OZQ!&y=zⴢKW:xjT`Ab[l T]&ks!.)ˆKͬn&{. #ӌ3ZosΪN Ubٷ82 'MD8ߓ KW͇㰠Mo>Ç9 qi}sƌ 5i:88-\yUv:zqQ'ivN:b S zC6f9g$m-[F#Fw}W0]t9Ƣ۶mߍs MA 2W";} e$hG8WF^>k%%.m171R\fNmiߢ5kNMuj+K(x3nE}vAPi@no6 z)g5VX½'Usk4:Dhs~d#Ghy۷TFJ r-Q#\}|2g/ffj[jb9d}-7خr5cTjVVbJMrJ'-V3q97N@쓴$%oVZk ~1ymRn:gG㙧~{vsI?#AR4 8̵8l݀T8Y[dj'vr$D6ܱc~#_|Qk׮ccP115e·zK߸И",Pkwpu#鍾 l [Qj4sjq2e5so.,fy* n|>!͛?$Hg JSPΝKf"˲ίLU8FDL4;p~SV¶$~bNPa,RѵjQ|ӦzIBmtx*(k`ΓMUZ"MQ)tSΙKܫp&}YRNI2s3aÆz:cHD=ۗ}ck*w[9Pe}-Qbm\t2'l 湇b` KS J,h`,yq@$H9 ANMOU hMx        A@ʑ @` h A@@@@@@@ Bۙ jA\$pEћo8uT]C* h*O|8U@>U4          '8'          p}viǏXnͶ\og5Y^{5?{<YE]͞=[ۿݻ~Ikڴi )%؂-|>|>eGȯs?ZC=Vf۶-l p2#O5ĂqsxiL˗/ףK1DҶ,{wi[!;;FM,zkt 7V[+f,/QFQLLWF;vK/,Y nDhGmV Utpt*-,*y6jn|]D˸=8 ::]{#Zo&Mt \r M:&uzG|zciӦѢE}ڵk/>}k fo}$ix8x M0.\Hv]yhm:si͚55~+*HގZwxd|aNUZ w|׿T#=;32?lSV-_~iѢyPfgjsΖK/~L|>|>prd XΙ2Y ćSD$ċzϓ[(t֭G_;G}7u"?9G#iժw^5?΍njX;籴ټyVJvnx|>A -VRvƓO'"+++ϯYk׮ZÆ 5Nnr.]AyEm?#SNz'xB-KNIIQmE8q vƍ 7{K/ֽ}vĉU'?< |>| JnJnp~ոwMg]">Lk`t<-E;izݵZc߬5iƬ?z_/u{V 2T;vܩH6lRom˻^U9& AK[bxb?=?{;8ӵ]o7sLv_}Ez)m˖->Ex;=Ɛy4 l2l7 tW_gxo¨K.^2H9Gcͷr|G@X-a|>d?ȀSxE$fO"q(rlXxm%Ow]w |7 ָsst-o'K<ڇúG||&"!yܸq;uvÜlܬY3Zogg3''G|O"sI)o";Vڵk5H>cq:hSuvטKI>X&もMxQol^ ]v);|>$B;B~pqٔ3glؾ}y/U?)3T#Ӂ~8J VUS 6֫WY7VlëVRSd|^txrN.zǛoQ#BcCś6ѲkKTZjit#i aIÀ7LUTTDLGnEQ;t@Yw}WH\:=sm7o^U>i;̷uo>GawfՔL8o>8?8 . 7.},),Jk͗/Smg1mÖ7h5nY̖"=s{-ׯ"&9%sqN2l2CXeݽ{̔(;Sli-m#:TΒ^Cr=i+{%NoeU@"e>{^aIǼ-QuԱܫ^&vkk6½%-mƘb~Tlafܳ?/sFnp;YWsK=^b^He!_裏:O6eIn\=[[Rk4oܹo>M?|>p*@P9 P.@ki Ֆ-e֖F)lc6ڨv͛ | U45Tsո&ծ,|WhN2(׮][2d{[o,%Ư,A[Ҋԭ[bS˖-&dUn_Cv>|>NIЖ۰krΞYpS%/G'.'.fMvvA;媫<Ɇ}msfn]Xג7wJ>|CþeNP+pem8gt6vDh5J͵n::+u?W8SШ> ={h'_mYnr6o)dʚq)>PAS蛗떳@0>ԦN%u9[˝{ X6tJߑz?,msN2?x7vUڴq9̂vslqm-KjWXtZfxƺ#,m8˼._V"lͦpH!#I֨Q#v VО={k̘1ecg>Ka}_}c[G9ZN5fE#nqoyEymu=DmeJٰѼ1aBI#b |Xd@sh+_j/pJkݸ|>|#-_Z-JXrc[ڱTk@KC(.\cɵYqݩMuQQZ34l|>Y_}5,庘yYh|rvUc8-c00~=5~JJb,5\sߪDYǓk͛I:qgԙm79F>,` s0^DkPI#4IW#m$G!7d[ ``WΒ7Vu}ݧ ;u.|,,|>||]Ap*9vKN@,)·!˹ЮecL%'׹ֽX &,|"I`C?~41 )6v:W'IlUWF W917y|(llRWgff:d`mxgLLŖX-??_=;rreim͛xld;喝ӦM0>nx|>|>EЖΛ`{r a%hGja[^.gw%\ [7~JQ+"!.hw]ݟ9sWy'U;k)՘#mae}7mڤƸ{}1Xq7mFɩֹ݁!h;yW+:eNm+1g7|Lηv2ɑH9 |>|>P> z"nMRuk%8kڃ3ΰܗա햠-6{eeے{UA޻W[y]uȑ#7c Gy=^ƙ7o8f[8Qɓ'Ƃq(YaO`K/^X}??1r CU6/YDv\-F0Yfbk03T=KO2Eq9KZ㾜n}s[!|>|>>ڦvGJE "h{ a!EMĠE 7xΈЖs-ŊZD\w;x]g$G]HZCٖS9B_UmvA[^lbCМSĈl"hK/zN"LcgyN}zI{٘ϩ]8 %ԕ-EjJc<^iO.],w^SܼNsD3q|j>|>>pʑȪUakgUD^]k2;%m(~~F15s[mq45I!c;9o,n?fy]bYW"gE;v=Ӵٳg[]ɱ[d9pkOA[ļիW[>|&FڟMznA dCm۶1~-##FxY`2n8 _}Zl~mi/!!AHwg 7|P{kko%iٳpB~5jdae΅.}]};\(|>|@5|n[פ 5ްx&tx2rdbggSwPljÇӖdžkKMU53xf:0y -^D1)YSڭEr[9浦Q`Ab/\ѝNn \ (sGŴiTm~JJJ"1)11Q=gbX]g!..Xԣ&|ǎǟgDӋLʕ+5, dV;vLϛQǎU;7--M.))!W9碢"t' H散M6ͷ=ʜCe˖FA}qqf8-]IN!M,H=SHQ?0=##?ÇSk%8}N|fA[=/x>2nqu~џb~=ʳΝ;[nZ1hb;w徬_}ԪU+4uT謳"'yQZZJeN͞[nlݺu G099YG" ?* D' ZYђ%Icʢ1R\fmYsf[3f m*u]"dkJ8E5Q.urFul:\>Ƒi}Q0a>We gy^mº-ϬIЖ8] q…7ϴ hҕ.k{}7A?@wC>8*2GӍ7H'NT4?\qZѣGuF ۨcJ6_e}u%]9-wzFMRoDTRQ7Y6blqVju{VKhܙ3U__]yk5I6 #\U ZW 4mcΝګUVMF9e4cIbƂƑGc|F?㜕qh'g-xuVڛS-"2G6k!׻wXdrssǑךͩlQ^(~տ]ve7g7872Z?ѣ՚8&X@90瀷t41z{'ں袋<}q38|>|> > Zv@ E?"&Qծ])>7kQTr5*ٹ7n Jp@J֜Ep IcRaᯨGGK"]%B&GW{=BEeAXӀHDd! .9$o^IGѯ$MINsOm$ o,govB_K*E}}BR6,Z ZT)111$S~wbAܯ҈-~)`77%԰aC=+_,((`_/1/^lСqԨQ#Zx1͜9unn28mPe֒Z8:$׳ҕCO@@@@@@@@@&A~zO6"$#ڣ{M6tSSWڪ9o1]zKWO{!imۦj8sA>'8@@@@@@@@@NmO_᫗mүy7quPW48 @>o-.11zAz"ؼy35JOIr"mZԁG{,1RDܖ"5=DeOiii9N>8I@>I$         ';'@@@@@@@@@@$!A$yX hO.hmV7oI$,@@@@@@@@@@d$bM          p}>T, @NQtl~"M 军=aF h T."6[LťT`۽T6:ڭ=ڑ#{H;z~8W. gVnB;RlTd)r*i/:2GDNj7oW_MGVoy 7{c!Ez+EFF֭[?qDt8U "hPk][o˖kN>UR[R)V-jT8w.f*aGh(N(3J%`7Z[T" P(.7"""ԼH…{Ȋ" :PjFQuE͞^?5oޜf͚7ݻw/կ_ߟnh      x?H`U[?M+2?C=W5쳴5 '"ggϤ˗.DQ÷"!c,O8 _{$ v0n˭q=Y/_oSDL%IkKzmljj]~DG]Wt!{ N;vLuQ^^-#ԩC=oc@@@@@@ !GhGVM+WR$0EhesKO" RQLzZZ}_G5(MkJb];M)w/J9-Ǣ:uO 5ٜ꺲`7Z[('ayQGRӐӋ7NJRT;|={h.kU]y}R 6LG9HefOe8 hT#jg$"w׮]K/_~NE dA;˩;#=Yך{ԣ&9S=o},XlvѵkSeSCF>LtTrJU]ق[n˭q=q"%?}%Gخ՛ZY(#(5 .IM/(bzhȐ!:Fw 4`ux#-mCηGx' j;e~𾲼p|Z}e>N{zno%D5N,ߙdiS$C6 G+/qN%[TFQ8W:XOMhAe((=3*9c1N="sjM%wmخ]t y2W5"PRI;RLGVumυ[3S/][+GEi~3:) 9r/#J}hJ.䯻K>lŗ$eKDtq=oDBN |Ju}íu5,]x^eD97sTYJ%AYYDƱhǟ~~]5zE1FU*}lw N5Ժuk1c4J}s90GwqRW_3@5n$UBܹT0*3GTpC3kҘuj^(/k֝wQ|\˴"UrE(|* 8>~hWޑx=MKӊ&Ux4TS:0m"6w޷w췴_Sގf/XUomC}]Ȇ"Ͷkmݵґ1U){1?k7;(6)1;|I=?ݻoɓ'+ܾ}{0an}ҙ3gRiÆ [BЮQڭ hOS76zsu yZ B`oMT+Sksq$Hb![xv?ޚPW_{yo8|ٸ85VsڃRm` {oDZh}i/Gُ)w*fuS["}dJ(oJȠjT\(ZvJڞPUW=}{qLqC[2[ iW%&"hˇfrTu5,tAAZ uǩ_jrדuwz͙K/ÄP_Qys=5*V_| 7үsMU穧|_naqWXA[*15u%~|A(m_G H駟 /@      ! ̧ t;G-OZ\Bb|Cn듲9SX#t#E؉IOv(.+KǛ89",fKd~8J VUC"Зw8":t պGEth<}01};=rۗ8ʐ 2o%,iђJn jD!!_?8e L񹹔l=ڸ$V y%#kPdjÑ!m]R?m无et5,9fNlkX5;ZƌH e >jㅐ[`!^aֺB'%g*uտY1 *x10jWhSOe7~IqPsާFy#e!u]&5'6=B5t(qrܑ/]".+$eq_naqNgdsFظq#8 *"pD{ <{9S `ln$ac;y%       Ŀ$o@?ZkkIE窮u>nD_#Weak\>}e }Lq84NccqRk|jѓꞙ_6E؎S h28fۂ-sTZS5\Q7|.Ex.PnFI?[Ǹo>X%|9ݪ _7=1-mqV5Si'6m->=ƙ[5b5}ʭu;ϫ3Ϩg6`z.͗-U̚ΞC U3Ɩ9[9~nP9۱m uqd7cGykN4m۪qz),cH:u7{zsgرځСC-sfݿo5Fk0RlGjkX >|>t-iڃ\Vh}7ިE ڭױmi^Z[4Gf1ۘf~M͎Ubwlg8՚M }m C$sB;g.+,s: A-V,xdϑweN~%ۅV7i;[%h\ qBv}l[ v7|W~g|H̯PM_-~6m,eLetW>\# K?VٛcxJysSvmmȐ!;CzZBB:QM2Ey9j\׳fL\\+67և1p|>|>Py> Zv)#(MÞ/oќNCr_uy`ǁ9R{~K9pcJɓԛ9r鯿vKrg6,R֧#k瞧}yX՗Upk~ةɹ/h֐sF\~^7_[#ǸGgSEQRGx-v:$K (V-IiqrhKYJ:ělDjqZҬ9l߮¤U)ܢ:uͷ*p6ȓNyΟGq Sn, F,7luyx0ƒsH2 8n\II%)GXT-ߧMw߭ał#nu0mPׄӋ-Xߖ*;;;̂      ' I9i?tQXޯ6.(}{(UjCC^NʬsckA L<-^LGHZL8FE Zl✚MBAݴioUB:.֗5i,"s~SahR'>,5чJ›n}E)]?ijkYɢ9Z[K^mK?}㾣}xþJh! ->1`+}ǭ 8BY1Ǎ%b#G ^Ҹ 5bA9e뼝sd?~_QYgQʹ, WK6͞87=/>Ui*76̶4*# ׸/{Y} 0`iVTy/xS¬P^=Z&HS֞d      9{9}Iq$'JTKL.0uoyh߬"&_|I8 G{Zo,RwFR\f3 Y2 :Qʾ7 Uj?zH7U jF%'S˵k_qm>S\;n׫Y6]z0-[ϸq۹CEd.k߁9bp[^>885&RVn d:BYiZf&| D6=0e*Rә~@#[Ƥi]kK y?xX͛o.X&:~Q{7Я}i}]8)uڜ8]>dq~o`mxhAۭ1 8Ipʑ#Xz9:ĂtާqV5m_7=5NP3W} (?B 5z=+vvxzEN<=EO=۝l'gQO CI@h!$ 3nvv,v;I;:l¾^A%F{ҚiHɤI|3ӪWdot_.Supg4otWHgKS{u 9U=!bC;wo'ʪ1ׇ(zmz6! wyY ۦN#۞"onoޯ lp`>:YnWz^ :ujvu-5vͫm HJ>I6b^O}wl9k-|"+.Fs}_ԨPW4&흷Vu[5JŗZZ+TWS1sn3    hgsh*NR=<&_*w&gf3 6*ת:i6ӮիsO^P&# :T56pkMղBSwh$sgk瞓cosF"sn fpw^8'gzsΫxuZV:h%Tu͵Q7Brz˽ٚ_rR5ևaR-b 6`;M9溻ˆ'qp5* wӒyVu;54rњq0fm   4@~)Xgإ-X뤃+矗ߛٹOjٳ$!;:q쬳J 4TTԺ[;GydrR61U=~6~-8A?&I&רhɞVxlz5{Q" j.:v=ސ)W>m<}Cܼ:J1\r~}jl>2DAi YIz=& vĝnČ`d`ט\ݭXYϟ#Kt ߓ~uff hA8D?H,**;'@@@_L@[?I_|ObXBxSj yNSo'= :Z^vOUU=ޯ-]'ᓸNjoƧ$>s_߯w\mvَ<弪>fدzM{N\?vї:dH ?p7`*_}#C?LqOh@۩c~v&v٘wο^qT6ih?}Рe^]7}^5y-z/{p׫jl=^]/p_3~(祗hZn/{s{Z֫A%KdK|rq%3$c2uU׍q5Aڃ}MJr㏲ˮ|oFR5uL+GZB#p.,!'I2S4$))Nw0tOmנd@C9l,^$SssbΫ=QqgFޞۿNʜb \L$v:pzO\fɢäl|g9S]9ٱ30 O=mHJ0@\?y)K8S)Ѽx_V]pryP w}ndرm>+6lsN1: ʗ-$eϴgymScX_=Ҝ&?Yf@@@UЮw@=0YpᵞwO/)6ސ_}]gH{}PmS֋zt$u5 h(Xkb䤓e' 7崣 X[}&eֶ Y =V\ASV {5gE$^;0`L&K$H=7L[:pzuSIT˚o1&&ZW.k`>X&ʫ-~l.tX>k+)=X"p?w@;p[D9R?Z|~:@oڳD>   @li^ʹɧlMPz,@ 6?p4? ˓57$C󢞸Lߙ\ fX:peɤI74fΔ3ϔf'(5d')E=$Á`W;ufEs2:+2Bkt$h.p2=W% 8Ulh ZX +nWON?c&Ӌ|Gn+|Noi'?\:O`ű͚ AK~C|) ˋz½^nIZ^zu J{OV@IDAT^5p̺ۤن[:V%Ksn۷˪kGV 6ycIdiݝ7S6Y2L|I4zo**TSrdy>)Eم>If`*P @@@] ;(GN8ƌsRWt6@@@@ :hGu y%I2X6<Booed~oT0w,3   M+@@i9: >KqѬF'{yBHt1"FhNNkv#*MĄ   !@@;:@mϴkɿ2);>)   H>0 M+&-~yd^|]kJ!* F!   p0 XAf@ 0m^ĤMM^d6= T@@@ؿ衽]/Z    Kω#    zZ@@@@@ }^zN@@@@ؿt5o&*Y;y/]_{Udך5 |HZA}   A/ɠ-ܶ\5:)[YfmLZ_=JZ_{$m[Md\%5"d~ȃML&꼼 !E]3-:X)[pGR Ovdw#=4ԏ  Di~@_*E<,3s` $t$'QO6m3ʒYq:/Z tz11CMnsëP^5_^>ǒzCUʫws#=m׋/(111R?.$R@@Nڱҥ'i9xq"@b.}GUƍRKR"_[CJgHLB~ճ1wo7yUiZ9;8縿TqZIp:WU=:s dk@XwHߺ/knUvk}5>t>}uߙ   ~&v@;s$jCkkg-uV>U,|nLIϒM.U;vţ@P4l\˖bIMyyU|.vާ ha   xV@[iuvr\v̳SKח44o,=l9y*U=N0G:u ЮKho}ڜvh   'ޠqqVϸ2ۦNWc}}Vĵh!iʊxXAvIeqq}v+v=2cGI3ȡIҘOBN|廤|R=~mςWXt{mi6bi 'Ι3F}ܳeT|otUfǘx\V>T逶L 8=kjyU ^WXӃUM{4 NsgfJ~ķs48q{9x5r&FӓAFm߮] ?O[iJʷ~+&GSLhwұ3ϯx(5_FZJ|G&7iC>VǶlQT  @X)G҇w'9s&/kp$ lʭ4D_Wlļ @&~_tq#jڻKGKҿ&';͎~co N{8VKN< dg6VZH\zURJI֍s`3^$uϵ_qR6d^r ܻag#86Y'>/Au7tWE=^=>L5 fՅG)f2oW,EÆs՞Se< O{vg􍒮Y:3II{JIcӞh{% 3&xRho"S;Lx~ggYURiTYfڦߧyz=#Izls+嫯4"͋+ݻwE]$w.LnkgwOehdgP𩧞M>﫮18>teqz=njOǮZo~#̱of2e{5   pnHZL֮?Y:?öruR[rAO>8뗝wl2YvxQ՝i5P]p=C>*.4v{CE,9^U=5*nǫnA6ֲjwN??hCMڃoM7Kɤe^Ӫ?TޔsJ_An5fJӣDs,Q{:`-=L6\K뫯ݽa*T*ާZ?OEIK6=MoybD_^Im{ة?Ν+\bUs~)q͛Y0=9Bv\YROvvSnHLSnܮ-U=NC˜i{Jw:5_* ̘@R0ĞWO)8Hr^>|,kUQe$ysIdC+ea^k@gvMiCRnSl)^iGe^83n (pxn©'M3|uJګ[y7<7fR3ۚ/z)ӟynF{ն=f֙ceXSuȞOͶpmϱ֭%WnK\}~0 ,v  @e5ߦJq{d@;?Oϗe70ɤjHXRw}'rJ]mO֭ŋˑG)&oH?g;mR|3M7 X1!  !`zhgD5 ,K1ڿ[o9ױCӯ7;M}hk_]| klӿ&=ȑ~m?}Gs< N.\ޓ6_w8eOAiJ U=5v^{:oҐmL߾w4Ӡ_}O=g2=o9~`/םr=`Zgs{F{6oU+}gSSδ.xcj99CO$^=ynU^Wczu~ڴow|gfl3[o8뽺f^0x|6C ?͕R> 9qԫDs̾nUA8y\*g2>onƾOym~h=7ntnCm'O> hרw54ho=2į.l_{h;6o+qʘy|)4[|S' Z7|{e7&[?D/HAYomv !hye~eGbȲ!zUO;1`}^vM؝2ؗЩSrv^'T Ygs26 ]|`akჂer-~KrA-< %Yv<ֿf'wL{}km݀5}iw^|8Y>Wz^ݹɒzrֹC5sٞr~ۧ^0x|.C6{lP^'Zcu3 h}fr͇&xˀv~kww4ŇoѾx^-֟_Ww';]fddl_`@{>!W~_g̘ᜏwm뮻)avex00׸S/>Cv۲|09ak>5b-Q3k rKЫoE6ɡԳrz3;+tF;ʗ/-Un߮]fG/u׺s5u|-9Z_-%x]+r?P+fڦk^`Igϒжyu:h=i ɡm֙#=Ovh&VM 3O_X]ę^oe3(ܜmC,|yԥUe`*|۫[kPO{=`}\/v]5rUz^f0I{:pSOL:wBݤ0ZM񩧥5P*`ݦp^=̀}QgW_:]IS1;{}SA6s'T'e{FEd~:/t1g7JǞ8q߉ONN.R)G(|Sw:v4EO:=u6k^@@`eKښ .+G]-%k/JO>ݚgM&xhfڢ#ޯ`\E=_$]<ԁv |j55hp̙~mIHMM":{شI6l~ 9k{Sy =k6Dցܓ@3̇zrovs:=r./ ->ھ/%+j{kL2p_ u@{ˇɊ#k4)WO72 .ZL䕏N3؀׋seO᜗]yml=^\/6Bs.9,&&z͑?Xrߝ$Cʮ5kdCm^\/vƼ/z>zt_f -U{9f_7ژvW]eUc~{4؇2SM4{T*r5'뭿`ӧO#jPHsܧ~کыe{&IA{2P(@@@hT@[AHGLUxX_mt|C֮qz z٧3%އ _~lwH{ *uy9k+{T[k/&/"J[Mzv˭='!/sNwuc76Z]o.`=AUee2CG{SC6npzd.CMjO>& hw4hm_~%/]3/^mӎf  hwtisڱt5'`r$S8 SOx>3DvlYz~#\ ~zvǀo=kG !  ~'`ڢ{03ހu`OB[ĩ#-u_ŜGiGmeҎ<'}f @;ǮYY> ;m7R}崇SG:F༻f[jΩCSB4|۬W]m`}XnWz^\ ^;󩃪Yiμyn=n'Wg]_-]suʙ`y=s ǽ-Լ{3pjrSq֯҄,kh4i^ŵ::{PHM:~_9m.}sSn5s.nuЁCuF=`b ʡq94:K? XUU! =L*5tC'/qfm U>U+isu7i]W[j`뽪'XݡֹMꃅG2u:W?ڼESД-A'}''I/=wӿw3;}мN 3D'ij5b^Wcz}tдKr6=XM>FH[o7[KN;]J{un"WxZ2?jN˻xD7vx֌`1=3lOsWʹYUs^StI;f6Ag>ul)~kG8zh*"ޭw] =(dczhz4b/A M^ vO{|Ϊ:;|)   4 G)xSjazu~et eJԹΓzbc}}q/|iiu;hܯ;2=Lz=4mfsMu:3^lΩÜ3jy%~"ѳQ%~Lok9ܞ^3um/s[W+}p{9ᗯ5ĵhqx1nG k:{w??Ns̿^'Zcu3]C-jw<w=0}ZDioAW_vjmxlGWmzu۽ jߴ)cw ;MKkc4ԄuFMqXFrD tž79 E'T4N= x&WN[^vObX=i7|۴iӾvyNWufWc_Ib?yr^c3W=Nqm!Cj% XʩW_ⳳ?C ͱZ㞈D |`j\̇8ݯͶm;|دa xܰɼzu^ǫe}gn=K~e.ɼw/L=^<3/ϰo;e~kQ#Q{9f_7ژvָ;;>s6?dml^M>5Dw^Mp֤lXџ_`k]*U~%n@gϞ Vv.\=T@ximC6}>?ظhPʑa$wAoKK.֙##~et}oY_QR";gϖK%69ER dNY{ƋzbE{fKJ>v`۾";ΑvYܧ4;ղf@ٽvSrْ%|yTI\Fs+Y1U=N̤>Hrz&%9A?wٕ_o#:Օ#t!vJƌo)tؔK/=i HzMʣA!M}F2+C9l,^$sfȢ#l\;IZ^ֈ̎^8 3 #ۿNʜb \L$v:pzO\fɢäl|g9SjOu jh Ջ9 /12QӶ]ذJ|21S}՝rlBٵnd+5AǠ??Ub~TUv *SpѰR6oOL8H>KSNٵ#/Ot/^7E=qXd^p_3@:peɤI74oy8L8Liv=3&XyRCK?6yUO]gP4+㬳^/SZ| !ϯ=M7rDBLpbF׫{wy=,qړ|K`Ce_= vg x5> hL/-}$ko=s~LKN>9aUk8>uj9MR 2V"1EyyQOK-抷.A{ʫFոv?zkTZ߽|_|6qbA׼s潽u(U۶ײ>3ύ|Ӟh}9(:cI!'z]o^Ƿ; [ʆa%$]?$5S,5pާyꫯg4w?,矗;N\>@nV))hzf2O|C[&]-CN&iio8ilv=j˺_͇E."T)Mּ9w_Q)+@@@ D`q4L+: 0HU.,\_E=&Paҝ$vlmw]w\)!^礽rIJʖ.&Z"h@4h^V&v,Æ ̘ںJz!ct^TyC,)%&!^*5slܼ"]@d[iLظV T"_:FvcWzy~jRg͇/Ym_Ej0|8)4u1hSR4U3p4NU۷mi~p?sDcU M=&mRG?L k-&nu2C=Ttb_j̈́  @zh\4-     @4 ЎA[@@@@@B I@@@@@h MW      %Fھ3f,@@@@@ZM}8>     @h׋B     M-@@G@@@@z1Q@@@@@G@@@@=D!@@@@@ W#    Kv(     V@[i-@@@@@       $@ʑh@@@@@ 4l@@@@@&RDՠ-     !      $@@;mA@@@@)@@;$ @@@@@Iv4] ڂ     RvH6     Dh@@@@@ 4l@@@@@&t5h      @H!i؀     Mj@@@@@CҰ@@@@@ hGՠ-     !ha     @4 XA]@@@@@?zhq     .@@@@@?~,     Dh2 @@@@@O@ǃjf̘᷁@@@@@It5h      @H!i؀     Mj@@@@@CҰ@@@@@ 2mA@@@@)@4l@@@@@&t5h      @H!i؀     MV@[i]@@@@@?`@@@@@ ZH9Wv!     `@@@@@ ZH9Wv!     Cۏ@@@@@hh@;33Ss߸q|hu]     Q.i@裏[oUz-ڵDG%'NtA@@@@@!Zy衇B{̘1+@@@@@j$,kҥl2ٲej3g:ۙA@@@@@!M%SNu{˽,3     @*'Ovڒ#23     +I@;77/a&&     ^ xNHHIJJuWȤIj#      _|!C H}Q;E@@@@@3&LѣG[ /T     gkF~aKtr1Ǡ     gǍ'cǎ7iY#@@@@@+=h _^^^5rrrdڴiҢE GyDL @@@@@C;;;[.[={E]$)))VdyfH=     H|nÙ3gȑ#e#      h0*@@@@@@-ШvVVrGr%8)G #%%%0     @X:hT7cƌFWd%33Ӫou]@@@@@hTJqdر֦iӦ駟@@@@@hgm@gϖc9Q b'@@@@@ xО0a=:G}$]tQ@@@@@F x/dȐ!V#{1; vB@@@@@ 'B&$$HAA$%%Y9r;:@@@@@%I\9sS%Kef@@@@@WСCeN[rrrYf@@@@@p< hJN/w}23     +`5///u%''K~~;u,^X-[&%%%ֺ'xBf͚lg@@@@@x2(9ѣe„ !=fyWBng      xr>#[n;L222Qdĉ~X@@@@@@MLLRZ >]y@@@@@-Yʑz     4B b=vA@@@@@ 4l@@@@@&t5h      @H!i؀     Mj@@@@@CҰ@@@@@ hGՠ-     !ha )ƍ    D#Mڤsj/:Y+K%dw3$3uPj+JeMĠ곲c_KVW?uTgzilIoVM/~H.-/Q ~X ޷Mu? >ZnVݻkNÎ5J&Nl{Ʃ@@@@F n[;uʼDw~)8uR[yYgg !8^i7Nd_jwUlurjSsǕ#K]n ~RY,ϻ3W֠eT9g@u-;ߗ~^{C<̘1cW^      !iCeX8ؕɊh>Ѐ3cVJ\lU异hÞ'6gD (99Y%==ٺtRYllٲJ5̙3    [NM̑Sym0n[NuԊjAu11 w,4 'm*jtos!3V_/Up?ZgΨfMa8uTg/{     @ Ў5I%#*Kù֑b3%C"Ԃ՞տH⚇}oыZ~LCɓ~{"''Gxu A@@@O h4ȗ^M]C+$9l-[ /4UGl>U-;Yfh{/}6bz?{u5sss҉vabR0!   D=#x-d۾o$=jg!t1z`_w0F~nժ 8P[)//a dtWȤI¬@@@@ f@]Gty]:䭾:,3i~,*zP5JsUF<^Rkl*me3K6n&wL UvxDSe/YwTVjlq%vvZvMӲY*V]vP&tQmz| =Sw|' U, >P)I϶Hc$1lnLnTʜcI#i%3Pz/YoKv:hrB.E+sH,ӝ ֥HpmtYmfٮ믗{ oڴIJꫯM_ȐG@IDAT!Cc?rTmqP@@@@!Cy>F6l"붾)啒r-yW_;ʹI!Ge l`Gۋ66}!6J5c7v^x%輚`=s>((ִ5_Ȏ]nL;W@?ҵ(k'{K|7!W\&k,ou孾.dop3mڴe˖WZ% vk*={s1U     xQmߌ3<0#s^*Q/S 5*NocتALXجoH@_ .3\/kJ;IfIֺ`qT܂q:_e-'ŷH>+q gw@YmKvΒ 6O4$ufp%Zd5?ZeoysZHfrT7¢d~=\MS2kgk3k%;t;6eqNHͼrq9?V gĚ7NƎkoN; Z!@@@@B C;Lw>.))_.9ʓV5u@Gd@XbzeOY2,h:ڿiճa2mYu؍dpݭz`b_=u] {["+`]9)>]E>eo^6;Q5_UK>YGS+c*5Р\쵿z֟$5֛+6G:Os|acm`nĚڵ#[n2}ty嗥\jSNNL6MZhaGfB@@@s-j$={~'u?ll)IWbPi7̶ڱ1Vℸ ST٧ˆ54Pbp h@}] NR{WT$2ivf3fnֺ5^8Ƿ:/UyGkY) 䴾K5O_qlT]c:B1bYTб&k^W^eo?ҳ-t+w:e^{c7 u^mo~5JbYXWMWG1h[-?U?8թ@qv̙3eȑ|rj@@@@@v\ښE伢=lQ 9YA;銦 hwmuV`k6u7?[F]CCZ6_>_d >{5,{@gam4`SDˍ3u\Jabzl]9ZM޳G]Ӽ'˲Oˬ7Я??ϟC@@@GOZfHJn/_;l2ݧ8V;WA ڝ2/4Sz~\uص̽o5?T[@ڳ:ejvμL>gN.-/MUN^qI2}evۚ# ~=dxϭ^3QX⊬,'H=K.qRZ)GJJ"K@@@@@H C;R7#yx@o?5n*#7e@IXm\aMqG&ŷ |5=k i6L1V{BNa࿆:{>7w)E۪1)nu)9ͷ}S=漂t#&rWFaU~ڱrV񯗞|s0͘A!k̴NouW"   ,@@;N-mMO;\ɦ-kډ_ײW hiwЮb=2g8=)~u*}xhj%q gw~I:e^h6ASYO4"X۶t-;h!ֺDk{5ozg?#E߸qdر֩O6MN?􃑁sF@@@Vv^5c eHgֹcSi2vZ*6WͶݿViGY+ hwo[9Vۍ4Pbo6^z_ʙ9lYW5N5S%r,k,޽{G!|5} ݝW{r1     PO+}yyy܅bJA6')> zXKցZν)-S=r-͊zoTSv./XEM:4?j-7KmiWX3^M=' 9ϲ^sx=cs}%,I# (ּ)ξ'[';movwWTvVFpo>~EE\uU2iҤ'L G ~GrEս%@@@@B3MK*&GM/X;w4#-]4xIoeU^^v@\kvMOQu~TV`]XtTP/>*jrAw."k$9'Zf]'[evi]_HI,䰓nPBޝ* gڦ]/ͲIͲbKR'AoQf|FH8?ئ?[:~.1Y;k. ,.T@;1ߖiAȠYYW@}m hci7Nz]j]㵢r5d^;ƛJc_GVKb| &K7s>PWJ7Z'eN9f&[=IwϬJ_\>ImF@@_v_2/smxǷ9R9B/pT9g@u[vΓ/~@z=ȗ[6{zᥒ7^^ k%Y7͵ϡ?=MF])s+eٲ238l9Fwɏ?st^sRZZr{6T@@@h7A}iCeX8.+;vkdhdgsڱҳV/벊BY_5s>B{g_sMsyb3g|wηzn;u&''U>c.,, v]gtrs$>i1>bmov{%QJ"`E^;TĆ&j^+ ?bETB IHfrΞm)d<ə3}3#-ظmْU_)>_O|׀gOvVOH> X{XISSJ6e*'w/_L$H੷uA{\/rOy_~%22*h@?zr'B,%x?)ϞsJJL9 [͞u`@ 6s7N%wP2b-.*)E-v[]į#^_tyE83zm)=ttc(=@W]u@DpAQ=~جbb`Gmbh       h;ƴi'x_ϳ7K{ݢ)=o<7Eo- kLo5}2[DݻwSeeq흹fr&9}m?x0TNtt -Xx4<O^#9J픜JxMϧ{5<K*LÔ]A}s݂{/Qpa`܁Q'E*r3T\HbMywӧ… ͍hɴsNs˰kpOJ<](U( ES籨rĸB#wCu014bc{9IV&~Yy %?N(nCӘW4xRD!ؗ1{sNW/ԃm[YV2;W|¨K6<udf \8aBGݠk˼PA'Ogg3)vSz$Nw k~UThik'K&ԥI4`(vJY/eH^[޵w #)7PY^OddG KhH:խ?,\Ҫ4v2֠(c0(Z.?81⩸4mOHHuC*'7"bHWgґ3jʳTXq ܡk߸AeYcS^^ۭ'71zg>.m¿q|u}xr"FRtȧA[;ݝY~v[nvb4Yio&L@E|T _El.+_kSGٙk?a"Gv[GNBhTK{M4|x=5C}JI)*SzÓr(8Xti C0劗ҡSDȘQN/rܸ]"h7KeM~9G'Wۏ\\tUJg+[|u      к Pֽ~\H59d}| ̾M])h=J>n=94$EO3j,hZ LVV-Y-,Y3SbRQs1{ld6\f V;;\Zfr-LSLnL(i4bNN +)s8c %h+mj:$$Μ9c S>}u<؟f>JXw +*j(!HXyt u0@l/^0O2/.=I$7'hMR"-KEhݽK,h[%}xy[#),fG- 7sM%e$?0gC3,Y      @C؇:!7frf?m"u:u"mkդrra:tqv[,編["_O;i?WF}Ga׋,~OʝyJ;3LqʄRЖ+ˑoEU?1|H7ۼy3?/[LXtk͍X \ömYɆs,6?r ŇTq ?zrz4nW,sضH4.s[_~V$oG!!(ns=ww=o;w $sڝgdTHC5Vd%ZA; e6֭R`8< #      @6Gyk("!1W +y,lëym7&7JSz5E2ğ{Vo~}mai ;Z;AiǛ? @ <\+_v#-L ڵ7n&hvm7:E#u򾴇_+v\D=;|;ǭ_ǚmkz7Uо@.n]*xN4qb'>^zT w,GăBG%0,S /Srλz!U=ErQ;PQeHS8sɘJA{ˉ泝nR%XAX|Ҟ=c~7<<{L^Ru{:AOP"><&LEsg}I:{6ִ]mkz$*Ɵ3٨>+_@T oU-oN۷)wPt!0}<ӘRUE+/4Q O{@Y,<ҘӴ=\fvS1=dغg'RV6iϱwث9%w۞!I 7V3[zlgÏ-G-a.!xS=Y<,IVFi3MVO2o]eKA[9o;&DX2[qW9MmH5ULSDJ]5)TYeWEE xk:H@]`9R9,+"6Q;2&surr=GQfNvɬ;iO]&9~".>Aۉt{c P<鶸\A{H)<>ϱ ()m(ɡS׀{D/QUm$vϰF~m~,-v0>z!{Ǟ`6:tN ڱ4l0ںu+eee)jړ'ӸqĚ/rΟ0a`mfm ڥ{+CsfLjvN 2p2 <ήq[qVyC5yb>A'I UNn""IM5 v&ZNAڞi) >ڟͩ V6g|Q`ѩc93 Xt.IɠȂ hL FC>h]hSSh$ϯ<{@>XܱGjYqKSq+ձÁtT1mݖMǎIܧL`!"LCSmPnχm_'[ ..Nzll?-ҽPbF ԵkWyEђ%Kg$@@@@@@m̬\l8luRaQ[[C.0%#{HZI=0%+E=F^n"\-GCaQlˢGVv!0~vCB'hu$mWW6P.]y(5cދb:tUA^2*;$Yf yxq?gO XTTM:aނC9$&hJ/&/O5 "}:w{NmX \{]g/M2u!Cg$U|wڷ/_zlqo1w>_T@ݢ1xS=GZA?I].ͯz.VWf-)hEr$(Ƃ/32ʅ\CE۟cE!~rmڴnVy:ϧ+Wϭ5ѣ6FӏP)n5rd =pWEP+kStR2$}+呵rY co^9mKΝ=D?IgΔ541t? @||8'LήT=MӉ|o*/G35[joEG ˇ Y) 鯩uv!|L8}Qf!        h;`J#Vy~ US^^Z1Ľ⹬m7sjniK9z7UL9َHus=:/j&$:l81ɢ؝ZJ%% ƹmF||IS]KIɼ% ڠ|)0\RjaAҒsk\KZ){_}]~OG)^IH[9TVZ       @n5.W/ `/ ŭn_fϮo߾g1Tk9a      ]?#1"7/.f&_ 4WV [o e߼y3]s>^|zۡ@{@ 0qbGT [.]=(/2u~itY;VԢkV#V=zy$$$رc^ޢ       #AaP @@@+WPCp&b52k,={VNN]{"Mw'A7B}|9mtmlN\޲e \ "A@@@@@Zڭ`0Eh =X .dVP^^uk:      J@n%i@{' ǷwX?@o          'A[)&Aہ7Sg`ASk:@@@@@@@@@@;DhO mm#jCTSYy ž0#yxFS(y̢RM jm\ϚD'[9jIKiyXG2iO썵mk EJI-#@r=kSDc~}:hmD?~|݋(55TXXMλg(7N;FQQ401=kk b!?MkiTl{NҥJZ4.\hspma{}v}@@@@@Gآ:t kJrKwSx4$C9AT\yR~&1.M;#4'gk6wщdI)"Iʕ@zǃ Nzh?5cqׅu‹ M~QPxAcQb&OЂQ4 mN;Lee5-M;~ɦ>J{iο@{%A| ;jgyNҪ=&Gh7fBsE"ɹ96EgO)tXB|T/pΝ{BDnH4L3fDIXg+f O>ӍT*b s#__v? wJ ڝ:Ӳ}~0U~n [~O?;3@ PȦ3DVtz#iX{X) z[ +M[V9~b좊#qSor68_ze]=o&ENG/4CY#X:|bZ&Qwѣeoo>βJzi"E>4{)&uxbċ=A=s51=X+h+f>w`$:¸g^CSHI}r"Lq8I-=| sb+z8;D]B:zn\B}~Q7->[G_8}ߝLI9ſх|"'G?:_]*]ηt+"6PPKU@a4$|&7(Jm'c By*'76"]^IG4+=VŠңɝseMxjٗzW\smřN,6Pj׮]t-͕DŽN,r{'< aSJh~rw*B3Yu ړ&x& 7z"ZZ#=.F\8PY#U3юxsu^>m\ ,e\$!\.Tڻ=xN0*:X@x|l~hܹ'MB><{RJsUYI\SSKO2|m(ikmkVw'?/)wD~nH[7/z(, Ef9Ԗ|lՃ|½_d}eXTTMg=m      rZ7OI^HuMbv"]t%A #"&gO&s վڍ\u"9A{\QqR'wPO"-o۪*IDATLfVt4&f#[ܝEOd(tY=6BgΜ#,Y'4l:M7L(U^\9wLΡ~j/]S"EdT4t.\#t >٤H '&1wn#W>RH.,j{@<.1ΩjȐV/ ~(\n[QQ#Ksgw͉Fa'C>ض->p!U]G) 0vW"-0Fݻs #!h7e>.'yٺrOITfޱKK5" U*",L7%AQcR_F3,[$m      Ь h7+n fK\sEjjJPt(`<]A4.) ʫ/IOE?NtGmnur]L<9gt%yql|-_WeѫoY׏gQG^ȣ"޹g-̛\vMwO##jjڻzDhptٖם9L6a6c9A{/Y$<ҥ~ǎ 3Rz˓ lP)h[3y hsOrY-]bƥ:wGAV/s63ƙ2;VxQx;@[>yEgΧfKvV}ҙvO=Y~ r(UE'MSSٽHzJ%mId>ի'[\ݧ͞#ǟL=X)BFFzs?]i΃?,[WFOL4 Ø]d-?u$^ H[fцBIF}s-X s0> s'%h[;yb hx2F=q/'g%k\=57wkm[}mΗ۶OAr'Bݐ@@@@@@,m @`Sg Rɥ-'dAΤf jAcQ-؅9˹Z~V&t\([/3h|ZfgFW\ ʎ-%K㙎&h/XpN'?mG!>.{ G#K^x:\@+eMc/G5_Ƃuŋ4_qXHp{mo..Dߖl9uZACg.#矕ݛG{+ h>ՏJ*- оjLz+*[%hKg)5maKОx[GΖb1[_`ܚ/O5Y3Pngi<8]u$ߴˑmsyY=@(2ymZ+2{jnmR Ym0XaY斃<+vŋEW<6[tšE|Jom^xs޵O]jk_v| ?JUg 3d3ϰhࡺh`K+J-C:G.53W,|(rS,G$ QRt߸YokܚTZ:A̳C>},{Ӕms;<G&AۑwsH`@w):x(?2瘭J:A*OQnl1}(;>7GiqRZFNƚ35Fu&ΦNʳ8 M@y afc܂+ QP?p>_po޷VQH[W;Z9{R޾bMiQ3pBp^|)A_x95l҉<)v}1 b[7gFD4 BGsڶ~A6#pdyw079DެB)bO1^>a,hzv)dgⷮ;4r'S^}^B)gIL{\~і:P-՘e>RQxb:|̍aÆö2[wՉnBr!13RpX- JR8\R9V#\`wGy"+s*\^n? pu%ZbG6*o89r>]+H5kSh׮\L~J!DؑM7ݛEpEpsS+; b]-[+h7d> ƟŖоPzq -${jnڶ~A;88&MDsNoaD@;!Alt[[fpcfPJ:#yvl,\J ڑiPbڕn^q]оuB8Sb.0cGwGZǟ?gǸ8_>?AARkGC;>m!3ByqVq}}|*-ӿDtrL ~+V&9 G؞Ra<=byRS诿L_^]3~9=n8o SwC     Ц @n۶9¨8V8tMFuXJe{)QczٿNG*&wgB1)Sfl>bVvUӕQG^W(M7HgϞe~z $HZe|ly-]W6yd%KωŴyG\ї}V׮MX+ ^~(m9A uc{^7^ʳ_LAفu]\=;\ˑkR?-ۧ9<{6}zNFOn|meOsa4R WžϩX{\|lrtA{}v%.=z4Ǜ#@@@@@M0s " 5Et{z1bYTtofWߝzEtމYKYtڠ)2a>>7JUN4{"[23 3eކ6Rg*'w6?n)_WeP:"bW~ߴiٸUgrJ5%i"S/UWk?r2֬ h.N>Beg~~v#92 Ϧ)͍X/3h溅[/O5=d4e %y|-Zx{t# #y{~C H?zL.ӎd6/ߕ <*Y${CI̛{eoϿȠ￯eClL4(}ټ2z !_rVXt[oʼn_it1t?=Lw7J*<-u͠>׊~jk5o-Ne/a}Yj*ۊ]i…Fyyy4ydڹsTlw͆c;Ʉ둔S](,O'2p2y1w9\"{4Zh\,%=yVо~:ML <]#芈 9\A^]69*R99˾(em.Mݝ)00Pʢ]v-"?7Wvs8       |j'+\J4,ʸ,J1bOv9DNrb"[cmO"\ڦ"Uv&%A;:hߑ̣ܝE}OdfjR^r 3gΈE~өO>c!h7j        Ў @nǛڗᑟeVoP&dYn!ª"\}CD\sD:12 2b\q) ڞt]L<93_WRB<Ҋg7tuKA{P(2h'w&|ߊҽ+Y/ KY꿩P:u*EGGӾ}hÆ TVV'xS5nAۘA@@@@@@@ h۞)zl&n=h|Qydֿ@γ&҂'ەx|J^jvu *'WO:D?D9%%zˎJ%xWdVAo        *@nۄIZ"0>gHJ(>Rv-)hx 1=ҖI[[avu m~.̡jPxjBs%<ym邠ݖvkpTug0t+"7RsmQ6i2ZRЎ BӲd"͹.A4< j?G%I&dVAo        *@nۄIG z;*%gй'R&e2ZR:zJ]|E^]v׀ih:QVKe-,8(VQfm٠6A l"        h;a!B|™rQxW_γhIA{@w):x암94ݜC^'Y)ʍBFѨDYEu6t"l?fڂc;j;ڎ3@["A-&"Pw Ämp3M\R%^sYNNDM1;_R' rҙn,o;هE^mh g[Q(;yebm"cA4mO_/!kKh,5sLWOyƂ6/5B;yq1ZdƖp4l0ںu+eeeٲAP@@@@@@@& [ @Ku 3 d>Vpô3J-)hz=v9|n8ؒg8ZDodžΒ˥9A44#Q2sKM >n¦W 8 deƂ h̙FG}[+{m١%4"J '-GtjGCnQ^}ٌS86ܜ, 5J:9`%ItxAQvC*GSYoP&_Y龓EVulM,.'/A.ۭx6'h+GaEK~#ڕ|cD{ϵ쥀;g .c/1M{{{Srr2yyy]8pƎ+?7Wvs8       |ڐeUߒFF[TouI6W1Gړz"  `ӦM+V4CҩSp6TvH @IDATxTU7=!$@C""*R-kZvE}{]YQbY+*"k#Jh)97͝$dn)ys۹\}{B T&@'&]\^^.I    ڕ @@@@@|S@Ų h*@@@@@me@@@@@ CC@@@@@F@[%.OMM     O (O A@@@@N#ɰ@@@@@hp@@@@@H9R qD 7Z~)//<@@@@`w~\@ r)r]wIJJiF"##{7N>s    (@@;G>ĉe֬Yk2wjs@@@@@ HZ ::Z%..͛e˖-kyeq     @UP!]h٧'xB{1s    "@@;XF~ef%;;ܦ    @~+н{wt"r    &@@;F@DDdeeITTkF͛w    x+@@[AG.\('xqg}VLw    mZ[3gʤIc~\ync'    ,@@;G dFV\)Æ @@@@< !ЄSN{h?(g}v[#    4Ɲ"@rr,^Xkyn^    `qڵ#GJ֭W^rWHLL={Ȑ!C>    F@{婩vM} Pkl˗/c֭[)#    4"P]@{ٲeF@;==_B;@@@@UTm۶5SS*3ݻ#999߈@@@@3~6`47?$&&塇 >z    #?L:U/s9M@@@@U@)!*]fkT Xj\R f_Ԅ    0COf̙3eҤIg}&W\qEp{@@@@ NM`…r'~.^@@@@ 5! а%QQQƍƎ+}Qޔ@@@@A>8(4 @e.nڴܦ    @(d4[Ç˂ '''KvvM@@@@``v4[.Zl?.ӧO7)     ,e DGGKzzř}ظqlٲErrr}/X}l     h, h#JB 22HAjW/Y^^}    +@ʑ{z    m.    )Gw9     Wᢱ     @ ޱ     _ ᢱ     @ ޱ     _ ᢱ     @ ޱ  @l0)(,rm" C@hM-@;n7¬$).+w̓eyQ'j,\&w/R5_ v{ّc u\|iZȑ*>dgK|`mhQ/7!wf1aRo)d?kTXXyG0 ^/On]{FqYwOW! |o1~/)*56.KsrB^?Hי ]o'g(!ƭ~vlyoklrlmkHtMF+xy p%Rlc>x͞YRrM7u+dpѽ{_ZZ.=NʌM )66~|4/‍^rq;Ҋɒeˋ/X;U!P>5os耮~{jٱ@]-n3N~8l7 odvَ6F\VN>yg"w5z9 +@@;pǖ!cˈ_r]?fm?Yփڡ;$DBdl;y}] -ܾ$,"P&aٰ:VSAО~MжwvIvR'LH6Čj!3&I]_LYk'xtcly~A|IrZYG-^_^z9(m;5-ECCB$?D~fK;sac=_ 9^~O=?2m; W_}o Z~|Y&ϵnmD@ CL6uj%u;ȩ; ׷#zr8We_wͿn+d' b:@ Dʅs$DFU9pejvltU3}&uIIEpuAq*ȘIF۾rvһws wal5l_}5C_<Ϯm$_ pUW%/ή'_}ޯY8 [c|~w{>! @ 19}2$:Ϊ#F^$Uk zZN=]kjkQQk3)뮯!/^ʮY{H|.WwsnkrA@C(;W\ue碮| xW+(Wonl# @pq?Jb7[qfLY#qQ$;txsuvWvձUV*mYd{z;ʎ޽rkсٸ<2m}[O[eC$11BSw\!Oؼr≉F;Wɞ=9<kv j,<\sQnW\\rֆzZg6I=a}{q1_Gz[gG;\qyUol) (+J,O溰t[5SOkc  F@{婩Kz'0{!"\I>߈_KSeÞd J}U2G:*=zvEtQyoc&]U@D_.{g>8nW] 7 ӦM(9pZHZ}}sfacj9N#_ss>6mln\!9DrJVc6X-Vu֭^;#ߤ%z*_RRwTLYgBv\uUG=gXw>9o,ozLk/TiptV{x-C~gkŽ~u#OLktCt'L\&wSkk3V:Tv=_>_Z ?F9VB[cxYrޞUg]x;^v>O'_rMjANw_~F{x]C1)S7U @@v 2]Dg3RVJ;kvm5|bN&!R9336 Fyж= &ݭD~֬2PFthE?)|[E6YjwcQ0cN?x 6!f̎ק]ޛ2S0[eY"W"T߇R"up,F29"A5jv=vжi߾bymj!#]w㏯t[s[ѩ"{WrD?eqzm9|mG[ Ago5^{[r;ˮ][^$ֿ/=S5;CP ;-ST̠ӳmF@Y:+ZUx4 :.W߀nγx64!|[ݾf>˫\:#g#\l| ֹgd$wkX:g$˖w|OVG@[/Hy=Kuuw/2u1N3=*(w~,ǫmǻm7 )~mɃܷos#w.-4VмK *yL˽ff,T~=]NgN'9N7,CJm FנeDDze:)_}Uf8fy׬9$ đZ/s;ի}v=v5gUObSWw8**T^mn\.g|sǙijUBMm/׀ j1]ukrmxQ]vcxi"ow}N_>K}9|PczUڵPgQ@@!ԉ~#`w9 1dL%QsZnS[xe{dkZΒ;x$&F/J*E5s;3~~1Ƶ:.(Q׀tQQyuup/ݍ5>m[ U:xpz*#e&Y0|iNG7ݛ_ -ZT;dg[+Wʌ'v=v5L⋪_P_J}뷫T3gZU~neVg=sł+үY;NQ_SσY>O}a@q)*5@yy,XZ$7{~˼^TTv)!C[{8Yt]&@knާ+|^yNu:6B%,))?}~jfYެu%R㵩Y̎lwq ޸<2m&S߫E/UW\\fӞW xVJo܊ܻz[o?msag h[r8ռϗ5¡u h1^־[ hlW=vnP6I'o+;U,zw6S$%E3OgT|E5Qed7߲i<@#<巨|ӟ*ݽ^;BᚱN JoRWc_M>*ʃ'? ZsԦ kK04k&gէnFLWй~\/-ˑ6;rӍc9~ h5^f-m^6lpr›8xz[޽d$c]H鶼,&5o7\4G^{  , i'! H\<$&_Kж=Y2&ݧ2庾jV\@||BX}/TXEɞ3Bw#]*f /V "tU?/cܩ = h.\|q뼼jvr/=%%NN|"?ƚeb`׮"P*M:Toz|¸I,+rK[wk%3$^6384<_YL:{RR5}k>@@Sfh{*y -aRRV :Fʥ}6olg{m[i{.ʺݏɺ=e_#%%EhBKM-|s4?;y :Ǵ5m}Ygp抋+#:Ո0'$T,qiN\N."58>.2fLR&tʍq":T.Uk6{>j[/sm1׿Htt`}'͖77t_Clpͳ^=Bz<ҋݫrYˊSNi)7P9sWeѢ욪1; eW@CU|1+YYŦQllLQ3;wvNж6;`xB}v9UyyzQHw\M/kR5]{Zn-cǎ.]w}'F"@zq!iJ|L_;nVvT]1",A־`m;S߀v+dH7 fsw;ͣRʻfCn7GyD꒒ΞiQg,V9ޞҿI{䭷ۺ;T~O^{}.oZ!99:(sZ*ܹPtÇ~dGkʧ:s֦*3[NcmTum}kf/W,T+`jq[ӪU=о@Ջa\r}rjWAK3AP9^}rlaDEU32 :xѵk3Ξh"5\υ]+}갖2yr:e~&tnbtT_\ϗm;˵z>m[=򅐝]ycW6~^Ywѣ*,(( S]z\_ߣ^$U=j/2CUիWKNf>2c s m?Z6iWIisQSYQY~ٓIh5cNk;$\*nfqל^g)LuhG&G@XdMu:\Iv}ϺqJJgVٯ %`4$͕MDŽ˥MӤD>^zy⁛%66ּof1`MO۬Tּ;j;Fׁ;أ5NQRZЗ^ёZBuk$3P͗5bO%))yay|*Ayo}T02@guRAm %QZ3oudg1bWA^}eTlE}:*-ZTb-}HgKnn4SvmH/t&d|ujn>.q:. yօңG̹; VSSS}4hrr%)nd_TkemYsl#mQL~ʸ̱Y=2?2*\w4f@e˖jQ­gӕ)"6m$4{ߤd>"ph\w}Ϻ]{-믕_8kyc],fz&j׫f[Os'6S8WԳ7WۦM{OON7sh˭)_ywm0 džIas{O/wuڱ]dZгvP-ɧk:cv=vˮFsO$Ogwu|жkt/k@ۺ_3ͳgٓz~f<15]ˌ;\eeQ7ϻkGssC|䌾˳/1 邏NRT=j([ Bd_ 4$Ru|јZ9;Nh!CY6_û#6m9v{u]9N iϮsƟCCO)ҵx#ϸ GvHJEy+^zyf~XfϞmnK݂2>V_ vO/gt;'韊^YFy }CwLsvꊟh[SXo),3M_W)NT'0Oe0?Uw˖|y)AW5kVip>jvO7fʺᭌ5NOٕ7MkaD_,]#zdu]W_I:v%F5ӿ_v>K"gg,l7:ŮԸnsQ_LVP{;T^yx']ϝw{+sm[one B>z=v:[ݱ_UV*v9VOLLZ3`yn^!t=Ucy2$A Iě_pZeՏjfgUs9ǞQ9Mou6袋 (# rOf#@HʧOGRp$SRjTԹaV_iOXh$ بd 0MOP7JQ111r嗫ܳ]Ռ_!*Bt{r:HJSMEEM9]ƪ x1$:P'RiU4#͛K]is~]6Y:ϴNgYzqL|7nSrr3#L3.̩qeҫ˕ޘ}^/ϼ{XQRQ^Zˎ1k'wLUZ/^lWEexy/ Z/)#è^ /nǰSZ:7,G]א f=t]D@@B6@@k@[QȴEB-M0,lп-8}]=b u{[csK~O?dTYMu\ >$@  )@@7DžV!5goTZ"_7ȗ]A;yO>͒inShZP5}2rH!/}M(  0C6J*B@@ #K*pm:yƶTEI~[8#Suj#z:Ȝ9sT ƭW^-cƌQSM~  @j@@ phXj3‰/VomK=js~y[۷ON;4IOOo[s@h$ڍm@@5ys[3j AtRZRR=7;|>do@,궓~/՗ %77O{B@@:ɰ@@Z@"Q:fD˃# M&@@1     @]hEs@@@@@Lvsc@@@@@Ю"    4&     u ]-E@@@@h2MFύ@@@@@"@@.Z     d#@}b#IRC dߙ3OQg88ݒQ ?.*2ϳ0rd+ux=Z.!n[wUNWqw@@@F@{婩@x پEO%9j9?_$ym uTK.i/_Ng1k͒شʰSZU[ˤvW|@@@3@/Z=2>$]-û/03C1wHJQnv-`/; =1cZuHƌIqw1O֘m0Q:SܵzOv㸿8;   VV  "c+g^2QʋyTCIi_]VDE4*Z'lTݩANg_߿wo/I޷Zv(;{oq斘vB$:*Ԭ6y̞4mW==#   ` mՠ~!)ϑ9R#ng;"4^(oWkhWOdswi#Ȩ78iJf}%%eruiR^{ ko qqKǛx6/m=O@@@Svp;F!muVHXh;Ho9~Ю.ҸGԬ_H\w}рyFybU0oюz[8;   @p %DE*}ps{=feo޷sfF⢺Iwd Q]h¿loժ 0@,Y"CV~%66\-\ ?KhhlxX 0),,hGc|m@@@ 0Cr\M*0{!"\I>lˈ_KSeÞdn;L:%^aT[p$S6}[4?C_`lʙ'{kEt^m2?N&cON`aےquxmz{$$4?Mb#%S\'ΐҲڪ7dڴi%kV;F{xܹlؘڳsHܜ ݺ5k'=zĪk#T8R+1Җɽ#o`G=vi"   PGut 0ٗ:4lTrk%>8ٙo-$ōcWhHM\x4KVzY/*E+m,>n[aqDKatY=ni#{,4'IOhf1{4zs]A;q>st_2`9zgeÆ ҲeKТE3pIҾ}dfw7o{m J_X~bPر3qs?ei9DQ]>U؃   wjC3RVJuj}5;"]Zاlu#ݳ"~7~k@[/1r*a-I2u۵#_涵ЭD~ܕ[J}*V庥0+c!))Ilb`֗gffJ߾}Xo>a|ک1%}GDEI6QF vw@@@|MA+g^jm,xZr[K3Kwms*;1[H BwS-ѽS l/Q2%,2YN*͌ΖYSݿv TGCn̟?_Fm⩧2R;0xpq{*gfȯY:={V&@@@-BW$#h|_Ö?e?JJѲ\*]12cʯT9'",Q՘!]\_>_Cʋw[~6VS֩Rwܼ)Rpt :$ɭunӶYrJy9?ˢ͕fcgѦM0atME~m)(=w6U#}8i*Ҹ6?D>NS}vi@@@Z]+' @ wQHI|t9fyy|a.8lHEk?(o;K͘t5gfӅX_րvIi|qps#4sJ]2qHbɘ^KUT_K n7봶^Yy}9N+;V~sۚ*Y./tejRsӂ]xz?C@@@1H9Ҙ |N Dv_KwGN>ɸ>=5lΒ>m+\>ټYu{toQeݦ\ڎJc":F:\L}ǻ=G43*Zly*vMn&^ڈ͛7Klly~MƌcnCecPvIIitTDشgsk$3v-׭ϓG*g~Y(>_.I@@@_ +#A;@C]?5aZ"!rFeFXWv W~sZ55GwNSiIZ)]#-cO<}1-[[af6m$"{]vi{6{Æ<= j|h׸]OܱPo*vSbv    }`h4@hH :uPM.r[>jVƱ3]=ϱseӾBD Rvm5TH2#ywQ:.0ٳm*}V^9SD+7KJKU.ޒR1_wWŘ0y곞eK<:.eq[9;@@@hbM<|K D\ͣP#Sf2"̔*!֪\׃kqCY^ OTuDo#꭭XI,Qjxot&Gե]n˥k׮믿 CUհ \allV$" @=uD4?ʕ[u*ȿnd؏   8 v` H]@;;gYn9Xԣ:'% S}jlny_Vqw@@@@m E@S<*ECKWQKxz9!   Cv=и@@@@@h79wD@@@@zq      @ 6ݹ#      0CC(NC@@@@hZM@@@@@< !!    48 DFFJ||P>t @@@@Y@)!*]>}tMf[dΝvZ֯_o    @ 0C;F̙3eҤInXZZ*wn@@@@@ #LJ /?_BCCe˖ҷo_i۶هe˖Ɉ#m     `mwaaaoAnx=K[/4@@@@oh{+4Yg%~yN:INNM@@@@``Q`i]vFRmh8    `v=и6m~-ɡݘ @@@@hڈ\>3s!W^yEN3D@@@@ 8h8K?Xv5yd;w#    P#iֿD @=Z.]`b@@@@|YE!}ythJ`ǎoX\uU'    @P r$(N_3fUV.V@@@@l m # pEIDDq}/ӑ̟?_Ԍ    rGf PjGW۪A@@@@ ȣKFO?̥mme@@@@@ ȣKB_~?8y̔#zHRP @@@@ZhaZ(ի3dQȦ    $"%!!ꫯ6jD@@@@ phXғɑ0wnݺ;Vt"}̛7/@    @ ԑ_#vZԩџɓ'ܹsܷPJ }Q1cF@@@@JvSs_<dĈٯy^Yyg!}QU*,,=zȡC    Ց].0m4ۍ49rdmN:$믫\7j(IMM    m_ڄE.7xؓ/m۶7СC.袋d…N@@@@@Wh.~8묳?4=tlPd}^Æ /¼TٳgM@@@@_ ˣCۂ^ ,,Lz- 2iӦ˦_~O?fddHU!    B{"P\wy*-[}JͳWX!z]sf^zIT    4&8 ̜9S&M-=;[/^xM;u9sHϞ=V^-cƌš.    >%`\S 1?.7|uqtR1clܸ!!]hُ'xB{1s    "2o. ,0۟,6@@@@E#2owNdSB@@@@ hۈ_,2~5ȼy4@@@@oH9 # .O<Ѹӳ>+SLir @@@@|Kھ53gΔI&>S+ݞN@@@@Yv .}  &ٳ\R 0}#    x*@@S)C N*sтQ>&l F@@@@ih7;wEcdYx$$$<3ܼ@@@@66ڵk'#G֭[K^+{!C}4@@@@h-J}x)`͗mj2vXٺuu7e@@@@Fv 5˖-3ډ    m2h۶rgϞrUW)GvmFԀ    '$11O?-=PAc@@@@ A`ԩr=M]xs9lڈ    m2FW{ʕ2lذ"    }xph3gʤI>L !@@@@A3tԟ.\('xх{N|AmG@@@@^F@{婩@a"""$++K;V>裆)#    AIXw.˗/7wvӦM6@@@@Ev4[Ç˂ '''KvvM@@@@` ,#M?V@?-2m     `iђ.qqqf6n([lc / +V0S@@@@@ ziii?@@L4IfΜYm_&O,sέ8@@@@fh(҇5jy2p@wq>p    &@@;F@dd$44^$<(N'@@@@Wv==G@@@@J_ E@@@@WE!w9     Wᢱ     @ ޱ     _ ᢱ     @ mH<555x9     ( D@@@@s @=¤e˖]]^^.\NB@@@ݻ|X 6$ō0[uh;sѲ\ $Zd\Jk:cup;ƫoS'N(fC {|>'"   )G=B?x EO%9j9?_$y >%4$8m;u{x=nӧ{|O>YV^   v` @up+_#Gլ2s'z4C;F\gC_J#/[jЮƫz~V   Pht=feo޷sF⢺Iwd.g@;D74QCWVdd)..n~ބ   4vh ]ޓ J ]FtZZ?{_U${ Dްk]* tXE( u- XpWW)PBK(BI !ϙ̻yyyyo#wܹS3o=ȋ)Lt`oOl6W, g덩cLIJ4)hh%yFum0_^GGN.]BS\2?țzx"m/2~"ֹbGuF쾟N*V'g i 2DGk4VM NFY?v풞 *R>J< ѣGi?v]aH@@ ":|'J\fu[X*Dzس74뺤DLT#FiXsh.;yj'gr{5'L,.VV-$uk+;ykv]SNeVlZ֟QppMiCֵJ.h)D,_)wyOe:_>תU(::n+*AHp P- \)A-YhG"r SA T'C>(  1EtJ5{vt # miCUfއKUtuuNoenGzf1yfS $EXhs&W˖-+jb̙QA ̀Y@@@Ff1}gVm>Xʴ3WpܞM4Z7/guJ]"˰P"A.hXBw#^eeݝwdQP@^StkuCN+"66z!j۶-^}].[ A ~p&Aۙ@)om/A!j]ue*=CZ[O6`OսQ޿zSLotfs]G\ ڑ•01᠒yg2A6VT,)>u"1uqg]뉮MtC}!FۺzKZ1ήJΔz4-}mnʫD/S}ʤ~u 8,YRm+*# ARP ʯ  ~N@FY=N heHtio-Աtwt ju"tzӗM=^ͅmQ8/8M;,CYSFz ق:*:ΕBdvhZо6n3E!r-ݠ +zWSƓ),7V˒۷SDDؚ5k_~uE% hWi      JA@@~Dkilhp'y],lcKAfHCgb3*Jж:3w |S󢣣iΝb՝LZE+8 hWHVїz}?SA5-Ck9;)\x|B Zy G}G"s}:qju;VWZyUye5J7J9={!1iAV>'b"&QQ "vh?+M7d5yd3gu]Q Em(A*E:a)((O٫KGmBHpկGhMA"-ܞvzQծT׌j3DŽuj>QmTyڵ;6m!CT!hZT       . @v   P:ڥ3B 0IA!MD]  Պ.hgdd7|Sق|tȑ{vwA@@D]b!\@Z       e!A,P@@4ٳgk9}[y/       vDp    {TF<"B       P2)h Gڅ%d YA@@@@@@@@@<##qB)J&A'̓xF.G#RS7\3X>uoA:DʓhΓj(7OVֿ3m@@ @iB'A@s֔nwrD=u̙2ԥ<ږ5% H!/ڵAgҤ[@^RDDMI^Ys>_&-ZԦuӧ 聁 g%`r2wC,1zL"gV5Ŧ<竣-'OC[{k@lbU`95hPS7+Va Pj (W/*'p~VOF7fR~1@(7'Ll ֪R弗wЪUdbhguupzvjY_SdP0~\9_Mŋ1/OpQ4rFEL '酹;Ew4oj"Ƕ)#`bߙ7R  P @Ю3T;ݻGјq+w4VCήAB|a=-+YϾNs%g2 AUm&O C 4/n@{[o#NkpyZ4y؟W@_4n&ܕBC%%ѦM'hp  PL?;A@h1TAIZ4kfeVgz֒:?!=(܊"Fۃλ{ezNԩS _?'_K^0~9]!h[M dh"| gZ6!(Ou=n^}^߻@$`bߙU*  P) hW v4  G9wuz5蕗{|6lb&aUÞSC6gsmۜv]c&ZAжpUEh lBP}֣_枡QO%ѣye ,/ά`10 'A‘A(J>t=1!\ wPppmۖEO?XG=#j#wYGݹ3]vۙ5jFl={w6eg) STE;[7Z A sEP2~\ :Xx+hִ6EGנb檬'yjFuxR~s2ܯP- ~TVļ Zk)D Ouʖ|vL}aG{zuLJz_#Co&{50IK-NJ/_i͜ѕ6 ~>ZG]37RG4PXv䜡۪K7J|T/m o3n&./L<)&of'zGi!w)S|q_LJ,]|Q&86Rsi˖GP2e.msU\zj&{m?d:ݶm};Bt NNerM.e߰W|1y_:xL~ AE ~Fj!ȱgOç5wSۺ5VqX29e> $_{iQ9ۥ :Tn ȣ!C[CQ#;PnQV=VS&IAN@1qbt Tiej:vK=H US{\,]yez 7BO<ў:(sEe ҩe<[W5nKAO:ٓMcmyC9p &7 / J:2q)jU.:kn7p'גm_]v_gF^@bi?&KKoOԥGg!:_Ӝj}_]b/\otJԚ.7$QUyWyc. ZypVW5(É5'?[+_ou2_z=&&~Ǘy7|yLs@@7)hӧ0>>zA@ً:Gp[ φ !w^$gih[}va:EnLt!ׯ?NS$ⰵ&b:6l8Ng$KyR,+p-f|2]ч]R'L$fuU a}q>^͢+w׮ԦMJpKC6[Z?&TQfKL:YZ:Z+ԛugt^>B|޻7[EbE˼ 7.=z4 +ݎ#IY19_l=~\'5[})Φu}>NwI⋋g}avI'/.=')WX˳ ]}LM? ׮=F/udӾp1c3qEFvv>/.j/Uux"huPuٗ16{e_bnrLJ4T&XhW&}  ~H@Y\sצDYh^Lg=aѽjQNkDheç7wƍw텋_ݣGpѪ]XqȺV .Os[Y]! n-]ݯ_ =8շ?J H?̜9]W[4U [l ;vd ;gX=:̧V-kӈ-K_7¶nPx>U0Rd:kå9ԥ!װx?AXW7Pşj?;xp)/E . 4O8u>‹gL|a)};8|675_m\q^YmSMcbErDg.Y}l]"p/-72z9[vꥬަJ=W/|8$pwwCw->}5:حBhV}SڪlY ~R:s|WS|L̻dž@@m@3OwAK|Ϡ9@'8, qѢ4vClRXkZ] aN>j[ 1us]-YW,)-+cN@zC~:+|ȖǎYgĖ,YWcn1籿q7[b*w#~, rulɗ,,(`A鰰7l|b}_.ܒP~,¶>o`lj?^ x= i*h׺rӦmG(Mu º}'ÝmjT[[AgS/`WvQE/w`W: 0U{/ ^4X=>fA~*Y$^صq?,6H/3s{X{3t e7xΗ(J|u_:L15&a#‚>~0]qyL,/?@{v_i^B"Ӟ$qaapR,Dřsg-{RX+&lKrR k]fWV|ۀ3b9.̝uQuŊ"^Y(!qJ>tA[f?-||w¶ٴ)Ⱬ瀅eŮ{/V1gWxztvhe^^z}\arj7)Φ1=_-I?M˦rўS~uA]F|ξEXe@eSKt7C5>_]/#>K_}}X e7LWajy(F8@e]3A@l ]ZWP&\bpH%N gJ?Fcݹ ysF<ߜ|W?bG8Y$- US~$? @JSeLwM]zIz6Vf:;wv0{^`׮lYLp؊zM',(p;0jdW+sйn,mj:'EE9}lյbg]av>!ʯA`l|?/ wy˚5h_䰿qvNNvr75_zTAgS/f㫠/('No;Brv}>forlŸE/˫kq?TtU@ݮ^^x#h{o/_ϛ:}WM1=<>_gl"$ U0!l!q  P>kmRM"\@IDAT }z1c}Jhwʨ{Zq$h_xayty7[ni*"aW7qv'fLH(]"\{C-1_?C {*<,l_¶؎.B V]o9[[7EBe"]0: XY-P)Mp'hw56>˴iIՈ^*nomSMcz A-@XTޏ&>i=fH2MpX]E_y#h{o/߾MU?|WM1=<>3T&XhW&}  ~Ho_kXQ)"[Bf>?jvæDٳYdpv\N,~{}]񠑪_EHnu;LtOY*{-_ҺSV [(Ue9f [.(WV'OY&Odd(Z/,%w-m_)# 7/h/rJ ֧N61>˳ω/6M61_z7)Φ1=_ǔ,b~4xccj"\Go0'&1!A+~' z2vOʰOM_(o-UfIPHo }WM1=<>Sb3TڕEh6<ũw9"w4rdQ@3.?ӂ6WΖƒy}.:u@X*yghc0];6Ve-Ҷg."M띂e˻.o .[oib),T-"~ ؉ς{Y|?p}U.GV {7~/ajY2Cڪ61V"bj>7)Φ1=_F ߿)]#ࠌiOYdjSA.YJ~Zň*WgKoYߒ=^rK61_z}M~czy|(n8@E]uCi+EֱիKvst 7ȭ4%$ X>`hOT^ص^[AHTe"i8+U"[YpXȾHxa7.M84(IV6~=9:tծ?F/P74򚈉q=[/Z>F0i ?;s:uBe9ļ[‹Һ̔TW8|1&Mh ]C !k\},:⫅W zuc;%>QJ c%]u+>I?W74O?YU7K61_&Φ~/w_y?   P hWe FXbwB٧3vSB^'#8];n&ڽ'G;׺NM\N.#Cs9߿&\TZEUU+g}UT z=쇪_=}\XjƊǶ~8ľ|q?L&'czo_UW_MS999Ծ}{wvNq  P- @ЮӎA{z5]rICY(/=݋/?plJHtS[^z'vX89L-]=Wy!]V} #puvzbJ1!ܘX?v>YZp>Fou72sD_pa sz& ԗ*)3LyW}T&>}wŪ˅Kb&A@@(U1qfڹ3[]3YݤPV<~B ,9"gv$:ї_3g*+!eYXt "-/n?t K_}]d%kɌ3?֖;/ZC[/ӥK@+!/)zÄ7upq=-DEg\Y&,]![ܚË?KX99gh뽤ɑ/ \λ^׌]Eɤ[և^]|[|>'U~/>2-ueQyM~r1[OzֵKuO%ϯ2{Ҵן*>دٓz]񖳿m/TO]ʬXq~&: udg-[VF7y6{7>]ga2rJo󜪼[w(R S!@@ \!a,Rd mDPLÚ$\Xb d}^Y֭åS@))'w»۵bx #OޞEü&ez:Eĉq_tw/x]GEՐk_4~/ w5Eyog$׾rJw;\5YkӜ}?=!\VvW[ /en|k޽Lq袋˙V9xEu @@ p૩S:S}!&2 (,b_iEz1=z&U BR٭[7e|{)O6@u&#y1v0l;~\'ˍyĈD!#QǎpEŬ*7nhl]|o>ʐ0Wrk(X|rl2d5C  Ov!F U-4!nEM݅Y,v7n4{@5"vtٯyl#AńQQµOE$##F1  @{rUv52ot@@@@t@z.khe/_~vd=OS)--*g:QN(ߒЛo6CmڄӍ74=uGh>:tIJʢ;OV~Ѓ 0hP+ BB]x&;DOhO={֥S4}F2}1s*?5Fvip@m5x]y|Osl u)CfMk)Rv"hЃd34i*(Bwkϗti]ez``Y \rImmˢZ 3Q5ew{o/}` tRhr?ԁ;o!t=&3+=򜯎eqV[+?DoǺ6&Z^u(ˇ+jJ#p~VOF7fR~1@(7'Ll ֪R弗wЪUdbhguQupzvjY_SdPS~曚ȎߟCcm&~1=n9_Mŋ^~)~JRԥsp6**eBpP} TJ@@*@Q4ftGJ|ݻ.|utO ?B|a-+YϾNs%g2 AUk7#BCeǞD6NioL~:D(BkyhF_܀ˡMGN{B>k=!Ѐ*k,_cA@@,{~;(3&MjѬEdSXM6’zYK|t[=(܊"FwS:V_>y}Z…)2 AUkG?Ձz+;zQziN~,k"| g'AۗDžk&Aۿ2`oq|N]]^ z2Z Xݷ܄!`s_t|:^WvU~Lzm{߮s&?ZBжpUm}a'rsШ<頟~Cu۽@Z}}˿5ށW})zbC-988J ǟS?/G@;OI[~<:~2?N^{/ezēS2NЮY3X#|oܙMYYήOT;%fMkStt : SmT>Py8p_FawgSv2u?44HU1yyE VEPr6 ,6JIɦ'6eQ#8kR=Ornlc3gt ?G˖pY֞Y֡}L\]ozSjdWO/s\[Z+22rs _Uh5~\c"wPݖ~ZlyϗjWΪzTg_˴wyj.u#; mO΢oKqF ճ.%ye0>]X)hqEŋw[N/ .MI'tZ=;i!L.8?Z`3/2dj>֭;WUڕvkSw|4N:[>$}e._K~Q"\H|=+Y-tTuUb@ԫE?.&xtE Rsi˖G<2e.mOy@.=5z˵?[֡>.o&CckأYBұ}5y{}RU[llxCc5JA!!J䋚5ZA޴ѫa9 9/l{sKkl,VYl7~#/QM:<)&of'zGi!w࠯)S_Mǂ@@@ px$T„ 8S W Ŷ={rǟ>7ؘ5֭YcÖ/.Y? *|dsObe.ukPFF *g'فu 25I z>YYCa1˒!&.z#V*>)|"2FEMW@o3""x=u+Q4 [Sgx˯Po!6kV[ݖ‡e5t߳'Ǝs8 G8,폞8G&l)`cCc۵$M}s ,Og=:2Da:yݪkA0=2VlryLO֏ F6d*jUuh ̇ab+뾚'~_:{[[Um_֏/n}U0C /l 1eץLJIIYң ܐz|{iNϾ毸zg1+]3zW}F z N-u^'6HK/m(-"yE~}~ZQ.'{g]xaqt9EVkH1\=aq>#Y]Zg=$gqbbYZҪP $Bҕ=aB''1Ĭj8OXT F|0Ñ#7ҡçUuՋYB,i.3gn"la᫽`.UDM\Д6|S-T_/hx::vɓrtg0۷\a/-:Kw~䋠]@k:|e骶~ǼWy?9}/b~޽ro%. <>~ztAhܸ+GOScHi19_l=~?cz|wq/Sl<9'/RŘzU   U1#,) l!QZA-e[kgrXtZu潼.X"q)zݴqcXd{!t$"9[A)9َOUS;<ή"Ep7좄3Oi>}]?ztA[o|a)}Ň.hsySeE6T=&_|/YtFқE0g˕4@!A%F F:q[xV.x=O6 4Agyϛ!': ڦKMq6Ub v%hsߧF@W\Lʔ׾@@@j]5 Jt12Ų4Z-Z[^s4vEios&`zs8)uPwiS&='DW/aYXqP모Dž"$\'/Uz Hщ%WQWu~hjv_(d/^sEe_AczA}Iarj7)Φ1=_נUWs<GA!ޜbD  ZYwXK ٩#.s޻Z}F:xuѲe{.f7nHa%2`/=p[rgVp;dqx׮lYLيzآ ',lp1jdWj^.n,m~z+mKvX[`y3ٴE*gr:Yϼ\Uס1垉>fb_]sMD/xJr &֏?tA{ڴ$Jt;&^F6T=*hs<Gvs@W* %+nsICljBx _륺A/ +qXqKuik[=~N2n-h|t-MiSL~J7Z9O.TudwqcမjF7D.wULٙ` Tcvrs]bFNi-A/?Q{֏jrT"K}UIUY%CS}U0΢C}VX?V"᫠mj>7)Φ1=_F Ŋ]YeWZ?ʃ>)h Gڅ%`#@ݺ4"h~nҼ NNչM /G:D^(SocbdYek: ·Bvg]I'Yݛ7or,/.: G&ή5JU=ǏH]D5ӅqIjjx'Db4g&hV^#3~˕+[[3u;X uۇWKJ# CY5@?:K~hj3>ho p.^ا?ߍxm.hX?n>*h/O*퍠mzLi$f0 A;ޫ VZ(   UBV @@o/>y; =gY?L /bAF _*ޞG򂅻矏E%N"}|ͳḫ.TMhP+D3FVO vvSRެ= i䒪w_ס>fj_hz䑶 v*|_$ qayC&mMqF'{lr^.]{L~ѥL |y\?Iv՜W @|"XpLK˵s"Ps”uY;v~_uTq8xd? ? vġA4uJJuYn9T_,*eY?>l9rZ7%h~ZDuAڕrRȧ!ԬY-"cxOI.-|N;^d>C;:\pyBwDg8]w6u$\.k$ 2cyA.=F 9>!=$3vMYE:g ab?nLb_5lp}OZ[/˕aB65_O 刘}\yXk?Lq?;Tį@Uf;}Jm{rT1y}թA\T p9R%pk䒆Ҽz``{_Aٔп].);XD[eɁ#=o+aRU[aĖ.>}YCnau,-ٕ:Fl/,KU^B_U3 ԯ/H_--}ٹ$^6K/";/H _׺E-2pUFoIPٗ*ӳc|y}sIOQ:T2q6r?Lc&~_,fϜL3w#v +A}Y?:LڦKIuA[3dIt:I=/CO*5ɍSąRrlOutz9gWvEz_lCA@\:]|8i3ܙٳfG]t_O2ÆooEDrァխ…)-٭^2Jd1Nk SddH-U9h*aw8G()"pB"+_%}nLf,rEcmx;?zċ4#N1u:4y~s6=_-LVW|~O|+%)ΥM̗^2dH[-zZ+sf2Kݫ}U3@s@%h[ӜS@)­EV֙C6Ӱ& 駥xhi8xHS'Ta=GYו/|&ov]:/ |~RAVJWxֱx|ėNn!5Y?R)vU[%o>۵SRQ,Y._y 5)S)&NL(;{=̮xM,^4Vjk&Aۿ0HN.j~UfQxMa2v;tR{M,;u8@YEq,'N#[ԃ  Pk'RJFZ)-٭*7nhlu]H}oʐ?#A&0C[ue"[Ԧ·+Ͼ7n4LQ xbx;:2Φ= |QLu%\UYk@#AM)   F\€X  Bzr9s=9GHriϡkځ?T 4c           hb          P-@ЮӌA@v>} 4@% *;T-|b4 Pe S <_aa!{T@@@@@@@@+5;3-Z1V^qyCA{뮣_(        DݺF@@@@@@@@ @Ю9@@ Vо?wENNoߞ233q        Py hW{  `O}]\~_,        CvpG @[ArJ:zu- #Aأe|+]tX9xu@]:A ݺu](%%wnw @@@@@@@@W}%A*@Ϟ=iȐ!nۺ]wui`Zl]vekFF*1@+6}Gjd޼yԡCYbb"׏rrr           Pq`]q hT- 9C~!t@@@@@@#=„B D f[RZt*g,VH4w'm0IcTDS>./Ȧ}qy3O{.khU|ڕMO>M\DDDuI11awOmqN.p@HH=9=YOɔ )n_o&atKpx @mՁ_EGNF-K\d:qju]މZM]QpPljhoGݬU؉Թ8ZO?J_njgUX_W֔nwrD=u̙2ԥsu;Sf(((*_@veE)ր ѱC$Mgd護Xׁ0m/@$ 954Хk-]]j V=FPSn}&B)$|tSdJ:4xߟαㅠ=e{)h/ë˅uC~~6ڸ1'L,- [oz4tH[ )̣m{s2@Ӧhnֳ?._X0l.@5&AO>J fkk"SAa. ?s%(iA-2霒z߶>qIR~ S|OPP PUuShHUmrWݻGј^H[[|utxu'`7|{5kzr^Yųi-t)+ ft h֛)g>* i$!*uS)+vU ,"be]]DQ*H&!{s=''77rys̙37罓w剟 @@jSO\7H͐_&mjm -7R{(geU9܍}K_D=9_n-[ˬ+}Ǎ_+YYEߩLxN25n<8mjtf-..UzuJ_{mkݍb\vD}{cd4=s؄xu@@B#i$&&z24U+{%Ip@8 #Dfw_^%U>OChW|UW|7+G1߼yFYo:x]Cyֵ'=wwsΉ6N 宻7QçB@@@f"!0lF~[Kexf ,)'}c  W{z< %;HIګ$4_ɓ&:zO(>cGL>l|r%-sשIrrf{wOkSKLLld2ONΖ?3V҆VvǎWjt\}@@@ H}Gu@6Vm8_e@)=aWTiۿ'~.xQ)*ryʚǹ_OtTyKh` <xdۑ[Sevu@cA| 3Ozl)ګ,i=%<_tzޤ>)Sz'b-RTЃ] 7j&?V'@@@/ %0@@T|9H_d]=J"COXwVv+l'Hq9ࠬ?*gSsp}XsΒ[x\s'wMs@9ܵqSLE2Jd ۷Kt# b ꪫJ6#˿=f=[ItTlۖ)+U+{}gdUw̔:V}xc6F%*:C*42Jo/4Z. eQ6 *=ͪr: Gxq)fc{vy1ם?M5u'K.av_YMt(WZ .8/Nڞ|/mF sK8݀vM|&=]0=[me„ r ǒɂittyё}Ѣ?D@@+4m r\ {s@Y`'G63~Xv->ʎ A-.K%"q}Um(-CZ9sĪhN{YYyÆ; y$kV$2͊nj =mV_5zxl#={盟ҧЮq0> U>[H2-S}QWCu \/G~Q@@@ n3{#Єc*j MxZ\KA)ks<>+)fjG3] \xϲbWinR常8;vtY^V%SV˻6Ng=T[w߳^N,Fk}Ε=-V0-::KfmSn-MQY@ۓe.Ю}/ڶ fq hoT<o)#ٻ{~˽   h{.@{< ;mN@'P~;Ewl+hr0nwM4#G^1Y}6Txfs84@}%-vUz2AuslW cs}|ߺ/˻MMjͷEo|t/:=]]s[p^<^Ý'|) p\/ $"±}}â7twY+yy$R#  MDvh^\ x:CΔa6xL\[{f֍?%%}*%TM-]U*k۾iސ񶑉e {b2vmo P+uExEG0FƏ/ݘ099[N*?ҳg醑ڀfzurhݹ3Y{}? h{Ǟ;=+Pƍ_'67VWݍmnޜ.j .ov\6r|T9/Y:_obtd@&j=ӧOLzlھG^{uk%+tVI-dȑұcGY||Ue@@@hם5OB*pq1*y1<x ho{9땔j{_ڇίk%Hw{'\^ʩSĉ e^t{~Vi*xB6mKͱ GGS'䥗*_-oH>_U_ZnU7"N)viGDi3>;Jmheݓm=B h[= /_fH槨/fXuE:+:?u@&ܵ:͂Ji&ꤽӧˌ3s    @} ЮO} BW$!c,%$9Ls%"mlSmҔ ӗTkDO h惏)2_i1R/{.G2,+voP>Gm&$44_~aÆYRйuNe8y2_>_zXWc t!:ɴlsy~4 )]͢e12~\y6LafK/?e#]v2   !@@>y&4(p97~Ć t\6ƞV@۹_op'c僧OI7>Zyг]sˀvttٳGJ;w?4o<ܠi2ծ{bn;.α[_+{*,#V  uЮ{ж_?\m{gS *@fQ k^oj_숼n5,s9lٲr袋$11\=   @] Юkq R'Pl7WJl?@lAQJCP֥ޯk]lԅ]PiϕɷS㹪~ wl<I7;W9 ^H|#x$'?URT* $#oZ;_`1'ٳg[V1ܨR}Gnn=v)K;o<8eٛ]a{ aa~H`e(UU|rus3zK۶!Ƶ'Za;7WPY2z1 W>v!CZ\8|iSKG[uPOo޵^+_2   P/F@{% LGU>>S9R(MIPCn( I|O$)I?귤.IgM7$j*ccbDu>=Pu =%Hum3%))\=wm||Ķ_#ʑ#y)Pј}?|9:7njO@@h<nM: Z<]2$F=3e%IRTTS}:;ԗ9>@@@ rĮAB}oZc]9tVmgJFV 4Vo#7Ww75={$I3O=9aB^LV*n^T?f    h5(#WPw[{IV^j{\eUVX+[NC|=^sѼH;5!7˰arV)[V +ŝn@So(>xD@@@.@e f+?%% &5ޡ(Km*M+Qы˵NsWϬisC7B}5G$rЃݬ wS sO|$86,_f?:n@Sn(>xD@@@. me _@oH~Q|1H!SmWЮȓ?n,fv,Ochs5'   @ ݴ矷GkvA #{~kYRN,X'^ )gLL_~G˳_kP9r$O\޻GvȔӶx}$$Orr櫦hs觶|1   ݕ>WA?ͯU8Η}c LZ] ϔ͇+*Ў =_G6;?EvY#Ku@r$,t{(I|(G7;G_Z':ɜ5}I҉U{ XBUBIY'dz'ێ̐쪺O90aL6Mĉ2j(Y|y>}tLPn=9$**PVjdѢE2tP3g4RX^R8L|5l3דdmUh~ՆEA@@@hMǍ A*G1|jyZˌERP|ʹZ+'hԧ\(Rn+&/JX!WxL>UKvکiU#UҀNraϭnId\lt9߻xVy?6YV* 0G\\;V:wTyIvvչkqHݵ<'11ƽYY[9h6-7    P*hYM!MrqUiII,~d0/]c~mfGW++}JRT>.c.2yuNQ#e^q45}ӌ:xs{=TOwp<%s@@۔@@@ %=! 4_N֑Wor}ae$'l*-I|t!.,ʒv ,l7:eJ]2߼$CΔa7xL=:zfulR+s)W"pr% O*{ ЮK   )@@M8nC!vtn+ "r[?<6lJ(c-8"KtQKsITcC>;$|[ni'Wun]RX aa+֪ 3RJWjVy?6Xf:o]Kex裢ߨF|f}V&$$ȠAdҥr[Ͼ.rYQƽYYrϽ$/Ky|J4o`;֔iW:jO<>@@@h,0WG:́@rAQyZ?KesjIUsqG1%_mJiW/gu|ۨ/Q-V>,NW%Hw{'\^ʩSĉ eǎ/jy7#Z[]Qyd2fLrl}KZZusShO<>@@@h,0W^G1LR7.S+s%"mlSۑ^uZP7;Γe'vFvI>@7LH߫-EyÞ])_i1ܨ+.Η=_#_KZzi^;k~ą_Ɇ2IXXڵKBCCG/2l0 fpȕ¢bޑD_ع3Su LYRRrss z )/]?G,pޗI@@@"@@@z sJlؐJǰhclmZ#h;;JUyve(,ʔ~'G3JKB΋D]i;}.ѲgWΝ;Eێoh#]צaoߞ!_-F_OoW@sy=O@@@@ GJ֬Y@ 3[罶E钚P֥ޯk/,[jU-Ƶn>qά*|bA)**Q{HBcGLEU!!~go{w/xUoUJT@ ֎%K3߫n-v_ nIeժUƐťi5}+r>RM"I9(@@@@B@)>*]f͚*rC)Mdl Y3@@@@]> '͛7746"    8h7y@ZZoDF4     i >m2n@nl"۷7zwv< @@@@"@@L@"ŋ˯<5@@@@F-zzy 0m4yWћ21    i Bɸ6%Z4@@@@2 .rYpuYEr     h7}JO{=1b1b\z    'J]j W]uJtt[ڴic~z s     4%6lJͻ6xYf]Su*@@@@hi3y3<#s5f Çe2c ٱcu    MMvSq޷A JDD1F';33A!    PKm     +ݦF@@@@@ ]< @@@@@mnq#     @] ЮKm     m@@@@@.hץ6B@@@@p[t܈     PR?WbbbPRR"ǎV[!    @ 4A7,oFr%ʕ+ݞ     иh7mPow뭷ܹs=+B~j!    4nڍ{~ 0@JǤWqmSO@@@@9hP۷o6mc"ݠ     P} ]]2    KC@@@@ Vh{45An:s͛"    pOW*@@Vy@@@@ O@)o    h{J~<"@@#t    @PAjYQ /]k-    u) YU Ю    4YMvn¨@@@@h,0KEA@@@@h;pZן#    А!N&82    `v5hV7ƙ     q h7@@@@rgjnѢ9R:v(˗/?س7@@@@W#i$&&@x8Z݀lڴIڷooAN>]f̘aS@@@@@`SHF7zwڗ^z?)㑓#]v2     w r;ю݀9#˖-+rE }P @@@@RWN[m-W_ɠA\{_@@@@S#9ov5 hk?_.]j#)     B{Q>}O?d$%%I߾}/    @S g޹r]wU[nź~W?`WUEɐ!C8[RZmW:KC{~2dH O?=${Ź~V >>"11Ҳe_P9g{h5!12%WAAzR0qwkGUcds;~]NTctf!~R~y'E23 +hݝp9癙E j0"ja ­   @+bm M.Y?J?o:a/vdmkZ.C,G|Kk3qjun/6WYWMܠ3W_+}ܨc]&zGxm'=Z  ^!@@+ E2֋}dUʅ]XnlUھҽD_-<$'޳?݂own>l?ivxz=S\>>ڞ/W/cv;dt6,VѪ2er۪p*|s;iir_h5㔭}kz{@^[>mX~{L^#:D5Կ@@@2ڕpv{dC\ JK-,ʒEJAT4_`IrzVj5V}5^IY#kMjg6x||7. h{rʼ\=!>3"YZ'NNЩS3TKTW-%7X"#$>z#O{^+x.]Tʆ^ۛڞwm bd_jV;o{mmOWch{COl   PR|TTd͚U8W'P&>*i~Q|1H!SmW@k@s7xzcGLVFzűDcC99ERXXrZ}{t UEv ) J*RR8QP~uЫ]iO%#u*Wz2`(&&PZ 2V''g1q_:_9F/7X?n UY@;0Wڪjl̬ =/ڷmC>{Xc   h79o0o<Ҷjo5]I dᙲV}EJ},*xD@Y@Gni~ƫ`NgO1=5_f&LiӦIPP QFu3Cf}Gv/'QQr yq޹ҫWQ}T~*8_;wn&W_Zv Uc0RJm* sr;ge;e\KUVһwam_PP,:lL*7\F.$V/t꡽{eٹ$$-og2l֮λ).SUNzޤ>wP_L8_,4OPnV?Jŋ Oϻ>z K7t~i٦e:WWz~e-ң҆bE6_mᇺI>/ /ӷ˾}W! ׿ Rѡ37d~{NJ!CbdX]}g^ǛoaW'^mV[5   Pl Yt]{&lnJqtihP xXvq*wS9pW*GyVBZyrJ>Z(ݻ)))j%hZxZvW@?=gU:;)O'Nct2V@o.}*-HP:yTA]WA{$>>Լohm:׿9iS/ڶ 6V~9G[j#Z7,&Lϋ]!YI3coEGo  x+i%P]2Vys@Y`'G:6,qdl:z+ ,$5mQ?-Z$C5sL#UEBS*= PnzW8 lSzϗĭ(m'd׮,cY?*ju3jCK3vukhKQ^M*wv!#ݭKTn*yeAdwz ÆZiP5h*Hx<ϊnjZnZM|}s0Թ];M/wЁ>H/<8+Cs;u6ׁp}͸?@@@ @@LC8} XڱQ6Vl#+o|2KA)ks<>+)fjG3] \xϲbWinR常8;vtY^)SU˻6>8#Rsں_V[[~VNh'˝{:macS ^}8t?ojIݍʽm+]u3vyaC[wtrt5k]W߱lg#|b\6\zͱUoƼTk5wAǹ/wz-*QU@1Ηvzz̾gJd]o5nsf_rǓOm5x2OQSRґzcek7zes3XƒS2׿Sb6  xmo-Rӛ0жq'(흢GC~r4s}FYo#,\6@Telu+,Q"K*='}:m:|\3~ ,WyXNc59P,31ラ"_~yļ\݀mN͌Ufz575OOfcs=sQ-ܝw硸܏>w'7 b?k>@?S)G|9gCƩ#(WzL7D̊'!=z8oޜn`^_.(wfOI0TG>5uؿсGRmϯ7TտMWtZX)#  u)`U"ĺ|.Bc 7v3eX-SA^zS[}!JKr)!GoUq۵+)N`΁GuK.qlSraaI'W77{tfw>JG69~`4suS|AÊ6&z Fo/={:Z]B=yw>sw:ةA{ 'Owvc/)ti/po\̟Q1AwaǦ`GLEB5Co7|Շ=ΛFq)irdFff|d"'ݿѸ?@@@o`SHo5\FvM9'r[?+Yqم\sMkfD++ns?=e4R' h??0))2iZ֮:휻׺kr/~䓃Msw*:Fa jD*j4Hәw܏>w'mˬ/9*:* h7Ji3@k=O^{ uec%vr$zTzxwݽ^fsoMTgޝᮏs?ܝ}g9Voْ.O?UF]e:_h;ϱrKUq-*omy}eSzHB7Ɛ>>H0ld鿛cv2K>?$ e@@@Q7c.#@@ q"t Q-8"Kn,V55-pMmJcUv̲>;$|:dn*5@'G]{=V駷@1B`qk]7ۛC/j!ct2OU*b߄Ϻ UͻpqGel^ !׮MYrյ{n}Wgs:_hk4o5@g+N97=hZ)Co 7ԇ^mxrޝ%^.,θ7dd4@@@ rOCudbc]UMsh{zWǓOm- ÞAo7+6N5i<Ӆw sE=8V|yשRu}Ձ9/W:Nb72.4?w܏>w'}mk]y<(A:ۛ=zmTN:U喞ht]XX(G?6Uk} xן0ՆRNEztw-**;Ƭ_sݬR$曣[Ƹipfz#]]G\ؤױZ\zxc菚lpCƐ|;˭70h!VVyw~FM|r'}r睥TBfҮ#mym}1Η2Km4'%e'O:.k?Ѓݬ/ʕ??Yo槨/Xug]W:U~bu   qs9^Gx`X&EŹV`m7gڨUܕ璵~V KSL_RM=93]T'>^3vʡe'WZE w˞ˑ̯%-{4 l/ʦ]$.b).)O68>jV(P_~E f{Cu k ڰر| 6+$#endڐ9uKokRXT,ڗ՛! tI7KJJqOmeoR J3o6Z),^zVIe@@@,@@OCoPbÆTzӢv+\lom{fSҍi@r^%:rל+2-{QK~ΝAجθSR'Jaa*KoPs{0۷glkw}ƥ_OoW86w} y$4m[5]ցW~#..Hs7+ VVE@*w/{@^~s `Y;}|6_ h/F( O+; ˧jXWԧkWG>ӝeW_X9>C@@>C>rfJl?߲tdK_׮<]P.2Vٟ/ל+=5z@hI7fVKVS$>fgܬ7?sS%E"I9@2յ`fc'|RfϞm{C!Xֿ߳g*ո3la++: KRVرc199Y@U% @ @ ϣ%tٸuVU @ @ @Hyƍ8~xVÇqɘ/ @ @9Vh0۷oݻjqxiۑܼy3*J#Q @ @W@]uuue!#W{k @ @hv#G\.W^]@Z5 @ @j kzСCqΝvZuˑH[J3 @ @v@I]}(Gĉ,]  @ @v@|Y۷/tܹ*A @ @% .`:T*e] @ @Hv:33Y/ @ @Ysbb"J144T@U% @ @ p fѣTU @ @;K@]|XViqq1  @ @v@r\C @ @ jeT+WӧcQTK @ @P@ԇjNhjjTkw @ @4*C!Ϝ9Nhmmhkkֿ~twwWvA @ @#[T*իW;}NJML @ @tVr\D{{{UvA @ @6+-Gj닱[[j @ @ب@.+cpp0mN @ @ P@.D 6 @ @ @n\홙HN?1>>^4$@ @ @h@Jޱcbrr @ @ @r ?---Yѳgƭ[ @ @ @\7ndzz>'O|=!@ @ @u h>|8n߾wΊӧnGrͨT*u H# @ @ PK @;+ WY]̾ګ5\ @ @ @@#Gr\K{`ګ5\ @ @ @@#ڇ;wȵkת[Dr @ @h>ѣGq B @ @r%~Y۷/йsC sN @ @ @ hETʺ_- @ @xYzjjgff={`` ˋ @ @ @@.+'&&;tt4jr @ @4,K=<< ѣ ȋ @ @ @@.v___e/..F[[[Z @ @ @r {zz\.WC @ @H΃]I:*OT+WӧחcQT; @ @ @Whuooo455Ekkktttā?x ? @ @ @yl8i}ݚ$@ @ @ l8оxb\pZ/=˗199/_'OT @ @ @y l8nnn{f}~ @ @ @>rݞ= @ @ @9 lxvuE @ @ց_|Qr{F @ @[@@L@{ & @ @! [PhgIENDB`httpx-0.26.0/docs/img/logo.jpg000066400000000000000000000363501454054354600161350ustar00rootroot00000000000000JFIFddDuckyAdobed   #%'%#//33//@@@@@@@@@@@@@@@&&0##0+.'''.+550055@@?@@@@@@@@@@@@^"!1A"Qaq2R#Bbr3CѲScs$҃4D%5£U& ? (Eh((((HHk4## {˰ :HsB&P@[< zRh=_ϓd-H[scRb{kZaEpg~] :fSX_mBnAQUXRqs(gg .;5c7E"PIEPQEXAW n,xWflr?yM[5A>BΛmmq]fč$" ! ҊUUͥoT]؍,YaQEQ@VT t UB$sX'^ώ44 Wt.k{d:vv׭Yʼnvw9U &ռqkJ4UQ`(((((~T v `5[/OG=( AuEs 6xhg`qAESAo.b> Xe |TuQE_- e1>t nV><@UT"|;`dC lHFkyO^a1fpH#[^f$. k-{z:zX(]ʼn \S|\QFc ^4P^jnqP "Lĕ_8O1EK=poA5/ צ` aZ-#RItoҺC8arbo$tPU?6*G:wƦvaox!dPr1]ˡ#xX/Ҽa av[KJwc1[̌nW<\aGh"vV2,x wRހ8M/6}exvH=|mi2AZ>ov +-?dh fKr?Lgvz}AiC [hud`d\yI$ BoSpߦ9%ko5fgšo~&G9 -oq 8P)(0cMwI1]M.yK Wc0nS};?YN(qrj=mP74k"$Ѹ܎ t"GWPC# pAGLH?B 6 + rg((T~7cF2O-$mYhLsdJ61fRoNPQEECs&U?>~d遉$FMk7rX99ʙ!AVA͒aL_vL6.SgdDtOtoKPk7+y9VHF${WeۃgJÂQn0]/o}Dgf?Gs/j 9\/ı~'?ʲggrhA+OhY}UDPb6iw.@^NC/l\?ߞrd#ۚgcqQj+輬%9*#cD ;WO]t+ Nd0S-77j9I )mS5M~N2x80bq024F&12\Z(asq7R+8^3-3IF$7ݠ̖uĆvÝÐ1P._Pp-qbH`~c#7DVErV5VRT2õ/BՅLѱeV 0Sܮn}'yUC6[a|/Zӭ d.&:פY?o.ovٷv(-y89 N7,H-ҽ U'8&y _dy;(8^3Ζ`SiY,KW1FC]^?Qcg\fiUm-VLfGŤJGw5 ry2~IPy@Hn8xoݶ$s4ܿ&L{sAr'ȿ;o_'ȿ}e#mWFŶ.'@ nMʈq0VIF_d̈N6{hb}Tm?;>ߗ4d`A}g)mE4X`p%ȹ(G9x8<3$1۹мmgU'$Y2H2dRW ϐM?Ġ~*y柂KG=/E8.NčXߛ=Pp܌W)NL U.D/x}>vEaECikRKI\lXTCvSŪ rT$m eD)"FeapGOu,6!: |]ORZAВ}91$"ƸS9hdq?;>)KFdOsüP!&*<結b[+y49#^3'<8=3qgn>TR? 7)֛ Vc6v%_VHLl(Ҙ[i z^@r9Ksl z1O2WPqm$*{q<܏(kxOyBM2e IQ풷Ii2sXfq"ɉI(ԠtF^]c?=l6FhpBtPH7ԭL' 1Nj2IQIEϺZ-&t(]aU% N?')sl'rF28 {xw^b4Rbfs%2YIP:(SBnt\p DTfE!N'|ua4NEȒ ٶˎٲFClyJqE:tr}AMȇ FZW{;7Z9X2qO'+M M!C \] =zړy\cd0KyFRͱNqٖӒ'ZY~Mh3B2\kFSTG3>u9I6Fl2z>V#ؐd.h(}~YjUp7lmZ/}O.n,Xe4aK; P7!͑,rc<(oMb]-VclKKk%b@U+5.?#pgǓ+IbInUUؓԙnM񲾹Rd_ɋcɦ6DHP}Ԭ3fEŅm+ԇf>iXb|?uϟuD %Hdy.Z6tۺ>{R_1yyKZ"&gEy4NaX`z$.r5w S'~N:;? tΉzXUأ5%o*|2!C[]$CĨ>4TSd7M*D=.M_o$ 񯑿,ii~cf3v>yR qJf:zCğMb]I#m\tcRq?9J w.ԟeB:R 8 I+0%: X5̲XX椣AvMC,hR׎(7\z ?5#9V6E!OUG(njVHb΁fTmE˗"6yU#XГ)q}C $f(Y4f1pqNƒa!@ŀeGmu#O]GRJa[l6۩N@f`8@>GAeT)"N&Ui͉dsC9:Zk~;}UKڏ ROgd-݀뾾.4x 0$BɌ6`lJ (rK.67ƂŊq>*Fv,HVBƚAL|RAqp4 6o5;gvǙ#!Y<{0#ÌΜnbm<KWT^Zs[w!Ž6m W>,X^a0j,'ֿSq0W2 pzAZ0yh{:&DJޏa_->ƕHݳzGuPQe`eH _[CA)%0 B O} V>ꝷiʹ5Q43 h&CFw`ϊ|wz/riB$: \: x?;YIyx4Ɇ<kv7) Ƭ |o6\,stY_똛f X! _HN>t:dw<,mSƒ!$]yuO!>w&;nZW-8̸ o$zobZ&Jw>:(ܫXsъci±||5> y/i܌|ddJ'_Us}Eq>k"K  ; \w;Iq0%s=7KgrOcP/9j|1 6}}O؂0 $YAm\4 .>$N 5]iZǝmÍϠO_}\X( NJ['v #@Qp|AS"FX3e R{[m$ǎW%TDd]׊q` BGCOq= %SuYE j4PG6Vq2ة/O8a\L%ErhV]?L4M}կoWZWaH`yJ\ ]ߡkC7 l^5Va) 7`Mg[SipnޓbZf% )N\YPRcزE wbjmvDF2E$f'@PK) #};w8MXxiqU[4*pV7PމC(gcX4Q槉V>Ѿ(&=Ou4`gb/ؔlCz<)GPz ' |vJÐߵP6̨n'`򝾍ȿI9Or4cDm61/6Zg?.ǷK_xqWڥd͆"U,v)̓cn!Fj1xaHGϊOl6?(6|?+ja82ǧ}Z70اo'㐿u [3ȦݪS#C k9qMFŏKiAr˝4r,C t*UQ`Kq u/+KZn( ((0Jb5Y.4s6V9 dڍ8Du/oP-//9mإuU˸ZB~C9$HP<5OeQ,p&Ek[@܊+I;ykF!I۸SAE&o#Jd !ie{1-b4zxUڪ"A`i0?Ԉ1`[(ha1[v"ک%A=m3y轴U+ űI%V =BzjG΄9guHo}怹/2zGk~ } d;^hQ?+Ԙ@lhmQM+xNvlsyAKde?vY`֧.ॵ}ԳȰ z:h+BLjYXn#ׯ~?1:y'ͽ7Ԯ-.7UBn7a\uGB";~ >!mǨ&9T}ۤ`w  ~LuyY,rXiWL%hzTpb9#H>/tQcSp,V1EUYuCtfZ꬛;%'(ö* qW\Rf7!!|{} J%d1"^P[~5N"&fy$rݕ;Wk)^>UD`lP;&Hk*c7xT '-Xghm *4vXV#PLAy#MN,9y^l؈Ǎ#_r32fqP*+bGeڣX%6O>M%b:3SqH#B"誢Vq H"{CS,ϤPTrI+6iIXoPڥH.Ō?+z\&A`rfUwm@HP-V5K||s9m,Ic-4ԙ|Ѹ?*L>;2Xi@)YZXxEQ_yd>f z|=m[G_#g2=|h٦"-YÉKdiFG4o9VSЃKϘqa/ Ő(|oτۏ*ilY,`t޹ co{P/1d;İHmOT\FSdl{JPr)܆!(4񍃶H]77E0䨻B*F=b'C:LH7,c8a6_cX[4(bB"*#i? q#MK4+0Yup.Erh$koa =4q2>aHQQ=JVZd!EFT M9TO%Jq roCBs@<.NKeHlw|*$ɡv$`}>-O"xBF fTױV=}?m)~ni|T%#]5R5t /H8ܒ8ݖڧ7I'$ݚ D߲z a9Dit zs>fY7BRǰXvß ydB BTg#KZנYZI6+Hm@iO`Q$X@[r]v55}P1qe8rF ͵Ъm#A7 x -nT͍ F2Y;MrnS֐xq&䴘2>3џ!<[n \cgc!b~9;%rX.}> =# { qX[U>k-3pAeT}J .k;G#2 $L?+_2q!@uNCVH||<\ \:w#>| 9v0T5+ x& ~N|n}cz6d9@bǐYӣ/i[ffp2da]NG30@$ȆLlF>4RdcLqețC yاc:zE]`fdr2+gL|c6VL}9o;@ [U]O[QEQ@QEQ@QEQAȌ. 􃡪^"Y~a3mw=yUd{(ų]X1ed]eCWv}¬8ie`,z(6$sR4bXtmGzCʺ90WI?=UOoEg͐Km5p.14GY.a89 , o^mPaC4,=$>$MM@'q05!_+?i2fg:i7?y1À3/WB=s}k@-3NћJ#ܤF{SBA DQjW6e⏇yO݆GsJHlv>42yFM B#jA݉D&ǝlVԆUYQ+HkǑ&?˗(5.3 Wx%LL8#*Ⱥ E@ d2l I|cO/\  ~1fuh»LX ,I,no~lIlLҤk`ƿ2.!JZ*^D8j $ay*.eZ.;?\Z03 Xڽ98rƣvo,͋F)S?m֍5?E%L=}Ht`?[i.1dR݂zf/@U=I7,lw%md컔x]/eˉ2G'ݶǝW ]<1ܷ^"/+<`e^cL_i=7-b4<#3xP}L.(4 |~ܠI2YXt> 8sO%wJfm??X{k|,cO-=ZwU{)Tʋc4R CM7q"αL=}Eo1#beG܄@ &M~ &I7c䀹p۸2'tyH>k(Ŋ;xγ0k_/ &[:@7Ӂ632^cSQʷ0ƋKSƑƱ 0$Wf,}A?yR,qaq Y?/KBY؂s%csu<__&4H7-!Y@ srq d-'dgYR5l5x~*s*9۳ѝŌ'xT^3i_M#o]i>CGbėA(>9Yd^I'j֬YwRLv?Y7նADwNvi*Gu]J8&ʁA,_ƽí4'<# p}u/j~H$EL2%ÔÝ:e:n H[OJPx}{ &;R1P?Fu׵uxN W|G·_b\dEoƓ|P&;G(%ŝrqzJ踽LI 8 la-Yo0o~䟚Ztr)iXmt5js>odC'HXo;.ɐH0GV X\H5Y$|fb拘.Σ"oUaLqN;"46TM_;01\K+&P߈ߐ峄1cR:ǡf~1ƅaB0"gmevF((((f( (]ёՁ = bc*UR]HuλmAf"NA#ɍ. :jWӡW]Q SpC هCAOaqt[EEىJr+a9")%p{O^p;4/ћ\t*oݘL&>4YQG w }Tb끆NVZ#mgXxq,v] `L7(*PP)Oa¯$jq N=i] 6Y/njlx?S*Z Vh( (Vhx9g*á;1 sj7324es:|[6u-u,}|z'~Y4i)tpyst' % %#N 2W&ϣ'}ey޸  Ny6Eؑ*Tú`,ȣpAG@`e1G$TǯIG kOj;FQHK`4J8I{Ee[r薤s;6QaKցfTs7-:ЀYH$-x0G™ O =7d9OF?GmWz11WV6u^Ԫ`XJ)aQUDXwg /' 6.$x(G/?1 8$R%Z"pXDw1AJq"xN ٌFyA5/ VU Kr#YWA}Ī$0 Mn3x0e{Z =O(١+*GHnG)*gH+d*X %9PwZ4u;̱̋,6}pݐaZ9DPR@ B1L"31 d yX0ލ$y27Rficcn<#% <*0wb-#`FyöDIk\ Q{\HC)欗T69Cl^)>t@h#%ٱu @{upl Pj @V+W~,>fqز:H( bRSyB u;c5TT5He5Q(* >9oaHN9q˪\;!0*QĥUC)8GgA:gHJ5 `3H >ʁ>+k ؉̉b$K*f4, L$Du`GKNb[ &ՑLWIuljUo*Zmd5k[˺sVBtHR.nz.xKOMz 3+/~J  @lC, [87| s mGLz(NX'~g,8֗s'@2#L"HNrv&;YTL~(SXv.`sL2OhNsf3opLϹxg πMЈ&.ѐ/#M ?ҘN3inӠpG OE lU:~Ya^koMl ڱlMq=eS6-msKq[Y>u\Moo]c~c ;VpF-_s'gSr-7<!! ImageMagickgamma=0.454545,; ###$$$)))***+++,,,333===JJJNNNWWWYYYZZZ[[[\\\jjjnnnrrrvvvzzz|||mpHf$HAY*R54쎉!Sļ`8XW& BU 8%1_..7(O- "l&DB 13 T&#*9T1TIA!! ImageMagickgamma=0.454545, &/###$$$)))***+++,,,---...333===JJJLLLNNNQQQTTTUUUWWWYYYZZZ[[[\\\jjjlllnnnrrrtttvvvzzz|||K,/I6IJ.!K>K);K5)7D%K**7<ď2Kɧ)ϸI"ʦ׋ڎЫ)AR`TBEDgP vm*)@!E)|x>Kc:P)oCE 0M3\Xg> AN4ӧPJJիXjʵׯ`ÊKٳhv !! ImageMagickgamma=0.454545,x***:::@@?GFFOOPOPPVVV_`___`_``gggpopwwwNJ\ZWSa^+C=QCV-H>?N@S}k_gsx׌ܑطҽʼȽ͒Ӧ٦ܻ׃).CCABBABAC@C@Ƨͦծؽ̷Ýʸϼࣇᕪ򳱾ϭ伾ц v/6_X-hfmAQ.SY2Żb-jL(Hb uT)#NJ@?EH(BɄ|Z앱OKs(՝VLΜL2hʓO]%ISNi6嚶.c iXCh1gQm=BBh/<ڊt hCt>|^DW|i婕/ o6nosq,:cUĤ[wiMUV89vʾKxƹ?ۻЎ<{ $__ܑR*^oNdYkyRSJіy՘] UTT5HIvM8'W\[чc,ťzm3႞hi0ƀf=~6Z$gbD~f=dXl S&(d("]'^G )fZݕ)ؙTf]b)TpHuG!Rߠ uVJWi}'!K' ˖PSn$aJݭZ[YGT+**l:aV&NkW_bӨXԆb޴%#G|E^ k_;bI[fkn*.;[ _:ʼB~'K=Wv{<@CÂN38@@f`#&ԃ p@ڱ^\l  ]њUcS]>7*G! ?ӥ\$F?UխoK!<7N:HBp&:щd4(B` a)ǶX<&'Ejv!\c(^WX60(Ab/C6Lo ȶ"zpFEA I %dЀ) @-h* H[Vb#q0syIZr$3:7Dnjڼ   FbacPj2sB(=g2l'5kr;OdҖk1gLOPd%'*M.]( ϒFsLiTJ20- VWB̩Nwd@hPuьHMNm:O}O `H) @ di`B?:!Y*5 g̪ԀeY@N |xͫ^׾ ,O%PJ`L3pҁ6}`JʹҲ@`ٟvv2QES̒LSU :5P Y%@P &jd5^ЀT0pu>iKz=eG(޾%zA;UΎv^֗1`2~'4N@{`V6B*I^-;W gvVf'F?,V5YvHaAs @Vm, )ؙU]}2 [@j ΩR8@Uev2uV*P%wy.^k8 vY,a??y0W,cŌVq\h:ь3=fH×Е.Cli?cZ6} xBU >A`ͪcJø}a8kg9YM_ٲ/iXԝv V o(f+;6l%@j0fW}`0@jPV x)&6@t H%,[0 o{W dzHڞ*vfmn&k~+;7=t 7{jpcxԎF}@XVGDϬ:{3d`j;酞ׇ^{j?x;lÎ<\bgwԕsu+w(fф5s,pLY8PK<0jtkh[}{tcN ^fח^o~|7z6yĦv&G zkgv&x`Vawvz׀7wxWg^@8z*8'xfRDy,_V@8xk\eb#y8l`tx'ca&ywwʆyQ(xnc^yws,WWlHH{V{v8{&ll3hyO(zQ8ߔ{#0goU:|[ur;pZyvٖm7tP)0%bggr&0|kts6vwXikwuqZ8rvȋ^f({XvGKXxXGr؆ʼnhx;J*wyRYqLXGȆarXUx lׅXhxg yG({)׈w7{lW x,Y(x2 $M;IM2@:V@~gfS(h (dwمɘoh)P)U{EiȍI+Y y1Ԙ{91Ɇ(. gG"xtx-혘-Y*7$W)9 1H>S0Џ$W(,G8&c%/Y_^h7)[i7Vyl)霻)Icْx3yp3@#9Az;pR>E@pd5fUH9: up :Ug֠O~Ry9)iyɜɢ(h\sy˙y' }2ʝ̉6ZKZ<Q35iZO=p` Gt}JwDJiɉy::c*E:*YI> i驗cVI 0@Y8VثGu dj왪jbj鉪* jv) )HjAٚʭjJz񹪬sڪ𚫠y[{ uʰ{[{˰ڱ ڊ[G&Kh,kڲV0۱:+65<[;B;DK[{HI˴ NN S{J;ZV\KW^d{c[he{jo۶h˶ruKt{xoKqK}y{+۲HD+dKBk\|^`-0|i,VFihmʕJL= `V^埐 ׇՀ Όş`nnMk]}қ׃  U ~|~.llGt`-p!N([oWN!mV P-m- q+=C*}ε=nNϼ>_߈<ѐ, p?,nz Yԫ ,̽MND[[l~}p(-_FD]nM~@)G^OO+[DnpL szOrջx_Y?\/M?ГopzRY%P{N;%@. ;/ֹO kQd?į_<;Rя[S-p??__?__q 8HXhx)9IYiy *:JZP +;K[kxz ,N^~)`..?O_oL <J … :\ĉ+h1ƍa2ȑ><2J\+[| Sɘ4k48Ν<ߡ 4Pv9=YѤL:ԩTAE5V[z *رd-6-ϳjۺuܹ!ҽwݼ|7`{>L 3~ Ȕ+{9ɚ;~{ѨB>Ԭ[KZ:|kݓ`7ᘅ?8刕39xS:hs;Yœ?/57ٻo>~t?WWH XW`!! ImageMagickgamma=0.454545,&***888IIIVVVjjjwwwI8ͻ`(dihlp,tmx|pH, rl:ШtJ #+n+P(+ounI10kP7,+r/t  /~zckX [ \ ~\Ǭ    \x} 0 _7 !@UH&$oBC-+0.9Ʋ˗U(vhY- xĐ)  2Lai1G)`$$1@r 'gvQ`j郕UV%k" 8u`nM0 LX+ @%/qjܼ<&dԟ=ֆA[a @gleLb@_L*g"C,ȓ+_.B׎3Җ[B_疍dj@w^62B'NR^kPC? 0gMZxC^haVV*e5A.|mu7[  6ɨ%AUZB"f"߄<ŃsH&ILe!cIF`6Aj>=!?!2H;dEDYT^"d 䠄a(` Y%M?uVh`"ԍ;.9O(L΍|WdrEv8HY"h9UA) p#&l `@ H @UM@!0X~0~Z+nGiny5PV \r|KT  P:6,`ҩAx`m;BȺx̋ɼ\Ip@ C,4AC ;) \H]ʼ4MG1'mV*LM[-4em@$\Ah*f]< mtr ^Ϙn}} j F $+Wn9* =T9r.7d96Ң'$*.Ү~: 񮗭ȓ7/=O?B@l[_}Onw/{ǿwob\F,D$!2! ImageMagickgamma=0.454545, <<?N@S}׌ܑطѽʼȽ̴ִսٝ(@))-,98=;;<ͱ?9@? :΢::!#& #%# 98a# UHD%@sP89qDZ BjTJehR ~E=MrOU@mب!`E R"2Aǡ9-Yt :$GpIAINd%uC6@(lK_M7Babx*^P#PD"F^ Y a".Dr ؝amv (  XC :7@ чc:Fl邏 RZy; 4p+¦ }KtO1ȓ9لD͐(yE>1C `=0$i5Ib"b&PS Cr PSs'%|&#`LP@w@pv_u_u@$v *JBTZ hJ x: h 67SQ"0TET !$kB6́>@6 8Pm@rUµ#8 b>0%W h b P@4@@QuJԡ@S<@$&y&Z+=n7uW^{/Uab`(N!sʿ"')Sr/w3Us*²Λ@CzCQBY0#b r)nڶ<Ѐtݵ^W:d 0dp0p Y 2"_Y LE3o#@R̜ l`]@`.W9ipN= ejځ-'Z/} آ)k<.NVZ SMWݻ^|ˮ/3O} }"ξ7o_?}㷯s,j@5m3; ѯYDn+XV0૔^2,Qv){QJ@*V*: a(/:=D%z ~hoWQJ$P ohT_8D<@,+@x#|U<1 B`D{3Όd|'Gыi|8G7wbģF>QF#2A@g?@.B԰ jHD64q*tSEes`UCH N61)_k(X ::I9$~ ApV:A:xAwlas<qӟ" ІrEDXQ1:fh-yƢER 8$L')FnD$3z"$]iY-1>Gc tkY彛a&:I6 y?tNV0脇mDb QX!T#2JyK`ףLm7YtA޻1psJ1HWen o!"y$GEYVa^khpmws!{JJJSSShhhyyy$(+-!/"1$"&'+,-//11335$&(*,./135Ƃ@(&F(@'Ĥ@@D ڪ(%AD7??; 1à ?[#B@0°ŋ`Ш# 2jԠtHHH:ᑑF5mA(Cu0bĀ +\((O (|PUTg }hǵ7BƷPd"&א b\!0j$AfT@H&%p mr6n:. ,R 0|-TLPD 1B!_Ã})b!Ë_(A25qS+~+z룉&j.)۩j*jk-bjR*{+z͸빻{¢Ki:2 d!2(HD 10Âr"'q̈i3 `@#lJ !)$[ppa&!gN`@GG'v2#pC "`B n wrmv6z߀w=xaDo~ߏ.uS.y?9ysn}{ޟk5 &ǟA2 {(qРN {t̞ȦmT F 4uUH E *,MA `%v6<7p6`78p 6p@3`A  7NpT`Kb"dWP,wp*[8D2a3ĹQKWh?)fh@b QeHZbFց1e%"ƘF h |Ldc3%G7 9`,XW `BzĈzA蠒@ 蓠 (U1TI(0Cq<%ODfJAȠJ-Jhe#$!'h#qe2 7Jq507vLh," 3ĐX)ɞ9ǜ3(eD X@ U hZ"@>CQ?F" JI! LgJ%&HbtJ@-Mv2, FpS,5JF#@u1%(Y)@!Ƭ r4Ӥ%e+P!T lB"D :Aj:"HvFPPzjvfJU1#;و%g)PBSyq 7omYpE`T-M)hp{tK]j !]F 'Ӯ"p@^PpqKͯ~L@!! ImageMagickgamma=0.454545,, ' 5 = ' ) 25<& %43><&&&:::E PWhr}!@>HVen o!"y#FDXVa^khxt{ xJJJRRRnnnzzz$(*,!/"1$"~VmXv&(+--//11335#&(),./12j5ƃ)D(EHD):C=;< CɿծD))KFJ58 4787 745Qc"qh Z3hИA$ /2RTEJp"A=t2 b|BK@rbϟ@ ma3pt  6X$G;0xUpy56w %pZ7hl`a /*Pbأ, L̈Đ`C2bC#G&D('H̹gs p44ih|аPUq~#[ϲθy//zO~{;zwGo;<{#}WM ւ,]S}7:Gp ZӔKݪBx*pP"9@4E(S4B ,Ka࣫i T$IY4"P?T 6hi Z+!& i0'e #H6kXGpET#hGQ블I6D!qCUq#-g2"8=%: Rb4Z,pFi 8'!!! ImageMagickgamma=0.454545,, * 4 ' ) 25;* )76>=&&&:::HXjsz B%@>HVen o!"y#FDYVa^hevr{ xJJJRRRnnnzzz$(+-!."1$"VmXv&(+--//11335"&()-./13dj5ƃ'C&DGC' ; 8: B ΨC''JEI߄216355652dȊ!CFPŊTP!B؁CvGdI !`뭷B +kKB6ƒ Vk^vm~+rHdPaDfC)rl2xZk/q C|) *@b*:`dq]C!-$lr",+,"hzN .bɛ %wE#I-!1l 4 H( 2A  8\6? 1;rM@dwr7}7q0߽ԍr7r7M9y w}7/}Mxzg^9ݗ;8媟Dzܣ;>{_.9}.w췛9>zo^-7GVen o!"y#FEQNYWa^jgvs!{JJJRRRnnnzzz#(*,!/#1$"VmXv&(+--//11335$&(),./12dj5ƃ*F)GJF*>E<< EЮF**MHL 5898 586888$p5h| 0XTEAz@p0B%RBɓT0a JPI͛`4˱ A z! F n䘅x!ha`I ^Ǣ"QDYRI+^̸q76*)&W.*(}9>{hJ7Ad[sonA C@%X*NH/)Y9ؐ#7xQtӮ>7l8d{‹ApA$Po@W > &t#}_ >'y5R Y XAB?@E%C#tDix睆 Lќj(*`TI#"-l9)@tP)m>iו@zGYLW! ,\ P'>$Baxr8w=SNypx7ny'8+>柷>>9 nx9쒿^;k~{{> ﲜzm}3Ny/n{z;Otw:9GcFNy0yqt#Qa:_1Li e jơvQRï]0>A܁#F( `;xeDqCPQ1Bh\y$ZbsA!a!؁܊! '0ҠDjLUZIQ2UhXQpK2%b<***777C PWjrz B%@>HVen o!"y$GEYWa^khqmws~ zJJJSSSgggwww#(*-!/#1$"Xw&(+,-//11335$&(*,./12dj4ŋM+LI(MFHLFMMG+MJKM*LHK*)(L݂*ťJLLϛ" kRX'K ,aM ]l8PEH8/[1|Dz˗0cʜI͛T۷sd%MT?Fvh6E$ٔt!"A.mWAJU0BH6 PIPbݻx˗#)&)AQ%G$P K@ -\ydɔ-؄Tyd"ё'OL835#nbȓ+_%&V#RT]Q<<,&=#w駄%H D^tD% 6LHL,XxxhRVP, }q2VBl7@>YzBE$3GPF)e8]u\v`)dihlpƹZZCx;|ӧ6n(*rSE8C!@馜vA96 j   B B6 8P+7j+6P @C ~*3`B4,7 -T@?hC E n. 50 6X#lk T2 Ԁß [CܐCrLB 1P M/`0PE8PE@Ps @Թ@4ïppt!JS,Bo$Y56\u6Py2M ,Lr%pmr6-p' E7PA7r` l b}*p$Ɗv*-لP_3+ lA@Rܑ{61\͐`B;C2 _g}AWɟE 0 ~ԏwU~;jG~_r> ֯ L'"QT>ApK7|2Bp4 !Bp}z GS@֏%`PJ! CR ;B%0L! B#}Iaqh2PmadB>򳚶6(XiPڟ>eJؠv\>ـ4 PH !ipI f6IZ  G\BjL a#5@bL2LD"Ќf P jZҤf5yMnb7iMr3茦9ՙmbs4)v̧>w3g=OhjNUz5`cD&H bQpXˤFC6`a[@[!Z%e,jHRAF{QITT jU~/>#bE}m\Lhv k d-]ٲ,ʧJffq( 7׼@)@!! ImageMagickgamma=0.454545,, ) 4 > #' ) 25<) (0 .86=;IPYgs|!B%@>GVen o!"x#IGZXa^hfvsJJJSSS$(+,!/"1$"Xw&'+,-//11335"&(*,./12dj5@pH,ql:ШtJZجvzx,8PQeU 6j6B?}oR/ EP0332K2hD0C.23P.L/D0f.//.nK'D(++*P*ѣH*]z兇 8jP   Y.؋3<Q\"9a"#VDpRA86D1cA!˘3kL|EU=8҂O^;#h^Bab &XPAL'9oÇ@ǣ?^xLe(# I|I̗c}gFs8_Y| *!~ 7a 5 #~X}^_Z (J,}, %hX *XrI$F $:SXGfRh0Ex` .C:(P^B=jpd ZN W@DK$m]7 5B 01*무j뭳0a %k ꫰첿&mJN[,f[-؆-Ӟ+k.vn|ѯPE1 'Hx Ł(LW'eFTAѬBs2 6 `78s>ʹ6GH#nG/J3tRWݫV?5PO}Ru` Ymjov[su]6q=uT}7|ݷ{=vv 8$𻚿7q_ T%e ZRН_A] .( @202VB 6ԠCB;g7+ZK|'[9^T1 k m3qBPMzT=1Y &? Ydpp<:Bz; BGTo5iMY2= +_*v 䗜!Mh !@~! c<p&>ovҀZŀLQ* \.RDy؊(@+ΘFdQ2`ʵou.`@,҄tj@FBF%B8  !#A7!Hr  (GGq6;%*Ԩ-y*m#S,AXZ~BNc=T'P4K83y-s26`fFnzD+V!:0N~(``:!! ImageMagickgamma=0.454545,, ) 4 ? #( ) 25;% $0 /75>C%A6i%[(U%\9&Ke+By&jZfcRdu$ "CiX75t'ê30r #ԠMTr=VtUEe#ZP >" ķ+k~{ '`B&Ko/[o&<pN\Jpn6<g r'7|: 0i5M̘ni }E.TפcT"Z *H} ,L`H A0HEo pMwvם7sݷ#8GS.;ny7zo䔇^:ꠧ9;:s:nz~{^ۋ @{(,(K2y![s紺=/Mw5 lx -PA0H7|:PʛIԢAԠfh  fM`&|]@7  8ǹNN jpA0$\$Q5gj8JvBg"`A$Q`kP=!Y@!B $++ !1L HG @O @E&+aAϤ.I 4+D !! ImageMagickgamma=0.454545,, ( 5 #( ) 25;' &65=;IXhs}!B%@>HVdn o!"x#FDYWa^jgvrJJJSSS$'++ ."1$"Xw&(+--//11335#&(*-./13dj4@pH,Ƥrl:ШtJZجvzX)hz amNe3kE,D,,PJ/gD+00-C/MMCe+kJ&(('F%O$'18842<6 _0 D--OD0B.0 ,B2B~K W ^1@( !K'H !<@7L~I͛8s*a8200<ݐYCxP:TU $\`1#DetBD6޸ #x˷v Pd셢F RSd,<ɧ~p6 )PpZ&!0 1xS>oŁ#`ϕ#o=8p" 0@wܽy<هt|Mo}پ~||uG_' W} ^ yށ)8z I !!FxR "#a|(ZF~,jh ab~ؕ5cIdbT^] ٓ-EBU +pХ L)`&D(@GIY@%ԥ)̐Ԗ;D*餔Vj饘f !!|iZꩨJꫣꬰ*֚jJjjkk,*2lʚDD@fXdipbi`)a F<D@{6/ &@ѠB`G 膃?bcgq!s<%Bfr0\.3̠m3\3BltD|G uH/sM }5IOmO'A{=6\{mT6f\?BfKk]<XS CuǣgեO ;!YY  AFb4QC|C6\FtJz0;Cg@'ŠB1L)0)YQ;^@drdA1aC!-B 09#gH0'[< p o1EJt%xE'GA%peN V !K@@`iy>': !!w7̣A O_!ZAY#$1|!$( 9B2x%E phB.FhO XgIZetn+x%N>$A!! ImageMagickgamma=0.454545,x* 3 > #( ) 25;' &0 .86><***888HPYfs|!B%@>HWen!p! o!"y$HFZWa^ifqmws~ zJJJTTTjjjwww$(*-!/"1$"Xw&(+,-//11335#&(*,./12dj5Ɗ¼LNQMOPOOPNԐPۍQ91'\G8%Ĥ@}#v.b&r $Hh (L Ad KR*ZY.O 75aYɤǟ@5uhMQ<OrQiЧ 7ϐCW,儧EW~brSSΞN]ۯ-XL4BDHd<:Ys%SKx:5BdUU(Yv&\`9O3&Z]"&ds)֠|c@כgGY(g1Q^tb=MmB cb6b$QmdZTlK3sN1NZF$Hב7$eba~}KX(Qv^J.J67y"뷵=ܕQ~ћobL)aP9:Y}Eq.%ڃxw9,'_1*tƲ;&\VeI#Gn~(lYײemvi]~w[,u+i:2M;1RXR'+3\ڳӏoogrԧt$|-+)u~n'7>'WNg~gy褗n騧7:袿NN;/o'7G/Wogw}/o觯o-`HLH=N0>H@|+ jpzdGHc{"){X/ H ޖCE( H"O8{La oC U.z`^ ȻiH D `k]7Gmwu4^0E:/yw,HBD`xdJ;%@A~,a E2R.x+( OT>VVR-ٓ17\O< 氱,F#|"Xu~ӧSb; ,Lλ5!LAP,*3!Af6 ReAuuf*iB6;7\,gfO2U(YY3N7#."y3җh1wx2EjWJnSmxrxZa漄P!!r*:؛s]%l+ P¾@{Q+~gLo*~ wXpta) s&d)oD9; Az`#B5HAԎHT*6bD9F(Tl8 9YHɎ ُh`ɐh ɑ"+ $h8iAec)DْYG8*9Hq; ht7r;4(XIAh9@|8`h90'@@T(@=@%P<`9Yyil*9yșũٜiЉI9ؙyٝ9 C:` yI< Y7dq;;lq؟(<ȟRW086V{^v##ēw3R;.10~w~x@#م?pB0@ D0CWw5<ʣE?ڣ@>:BjE GIJ;:EyqIn9VIY^Uj]z`fci*gZhʥa VncڦgڥX*aAnڧ_[ZtڦuʦsvddeZi k yꦃzzzV:l; pu8x<zf|y&(m4{ m!`g 8(Z<0}1y`2h}.w<+ ʤ\3ʦʪ<ʮʎ˲<ʴ|˩l˸ˠ˼˗<̐,|̇lȼ~̲B]CFJNR]յlXF,\B`BI@a]!! ImageMagickgamma=0.454545,, * 4 ( ) 25<* )76>=???HYht|!B%@>HWem o!"x#GEQOWUa^gdpmws{ xAAARRR$(+,!."1$"VmXw&(+--//11335"&(),./13dj5! ֈ?l30$@]#]"##H⡈9D6Hr4X7ֈc6=A8 iH*d5'TVT2R dP[!\ 34ǦpB&* I\ rȆ_$H"FRvx C =# ĩꪬ꫰*묭j學l3 ) usiͽs44+\Xa85\"&2L]')Qj40^C7|H/,?\Lp3 C'C`1 &,$l(,0,4l8\$ª@BeRjf%q8Liqj曲)C5!2Lb'PL1/pK@K^|߀.#n$nȚ8%H}pW}Ao.9"0h0WYqI R@Ia " ÿ4)0 #?R%o)H|@<@ @X_⻟) /=Cا?;_W>%oy_g@p >| Ǿy{D!@*xP50{4^GHu~k3FC~,A@Qƍ#mVS0g)d"ԆK@m8A &xJ )An-Q>JL " 0>ҁ\@XH*@+L"qh"iI(j;. wbGA s +T|!D1$tbЌ4m2:pGX DNk@V"dͻI0  8:to@$ˋ\Dm!Ef2[MDQ,QJ Y"m@ 2f!! ImageMagickgamma=0.454545,, ) 3 > ( ) 25<& %76=;???IQXhr|!B%@>GVen o!"x#FEQNYWa^jgvs!{AAARRR#(+,!/"1$"VmXw&(+--//11335$&(),./12dj5 XCe6 7"RZA\TtAx$ -p| !їسk߮LD)R`QY}Y. ̍fnֶR 0sА PP)}!8 $ #b`$b*"'#+"2֘9H$ݐDi$nD>2h@ yBm@9@ 2l%$l%& \p@m EɀVB-, 0B 0D="0@ 8=2Vj饘f馜v駠J"Fj,U AWXHV YVҊ#elin`YSn9. QF ":𐈇?#`n/[/nþ ' 7G,WlgwGy ,Mb 5b+a093@#2t%ц63ة \$Z A ,BL49<  mhlȎG p尐")^ea 2|ݘ5x} Ufov m ,0 ?B 5; ^@Cb^;!{f0 {00<n?|P;k;oO?C߼㏾5}_=/3`˗o} t_{:ؿY0cdĈ 2 6DJq+>d~M3\ l#EBA3Af@LD .  *"x!QKDp $$BMPoLe 7fd6(!(C Wx1([D "*`NB AhC b @J m̥.w˖|FY@M$DT&}h5,p (jXÉ8!,l dpF! 9[ D@:Aw@T U/~3`UG1ztYAYP(%d#Jr !! ImageMagickgamma=0.454545,, * 4 " ( ( 25<' &0 .75>HVen o!"y$HFYWa^jgxt{ xJJJSSS$(*,!/#1$"~Xw&(+--//11335#&(),./12dj5@0$l:ШtJZجvzxL NUdG^ #537B 45B>vV-122/G-.Q.tB1jHG11RO.G.h-..-I&G&&''&Q(**)B" :9F;|F74 >E8"  0^u! ˄xBAN2| xYN!cB.! D rIME#(@(%"(PB#! aׁǾXjʵ -LQ'2 cAcF\pH eNĻ,y dA'41`ul: *  p㆑< ;u^S^ͺk1,U0 JL#1 ueJP;-(2":a vr2 }U@$B`h_}Gxp F(x"xX"!1qb%H%~V"Q8aAy )ֆ9bwbCcG9"V)8%Ez)ZɢJָ&>Y<"$(֌&AXȴlqh Hȕo-h .Q>( *A ʤUݔFU A :h40 :|O ñ&6F+V,B@jm~ z[nK nʋ.ۮk/ ,]LL,p( q(a1؍ vXD plا,BEIBTD6A3fzH{D,4pDhakq<_lA$DlUĠ\M@ZU09SN`6R]11J@=#( v/~P obQ9~#F-a rN Q7 K g(8B*H  `0@ x|{>6pL2 @x@E:(&w ` !Q$`jA p TT W,jPf`%p bu@& |7%'!! ImageMagickgamma=0.454545,, ( 4 < #( ( 25;* )76>=E PWjsz B%@>HVem o!"y#FDYVa^hevr{ xJJJSSS#(*-!."1$"Xw&(+--//11335"&()-./13dj5@pH,rl:ШtJZجvzpX +PQeIj ^†:~oS.3/ F/ RJ2hE.230BPM/De./nK'D'++'tM'*+*C ??x86!?9# 20E N3C2B1C /:AA@]f`(#Cb(E 3d9bX"*Nœ! `,4i?.AcrɳϟV8(P^a`թUʺ&\Yb!0aG!V4k JDM?=JÈ-AO0fLTzE}zIA$X$(t"g}!T )B+$(O {hAУC@:խGn:o]: mZ[-6-bkmݒ[,";Z;m.ݎSU bL')C9xv#<.l@eQI))֤!5]BEs, ;phD--=]FMtH3MCA'CT`5WOuN-Yo>ͮnp wvv|ݷ|wm7rxހ;>7Gnx[8k>wLP(0YMn:AQM(;9=b)AZ칃Fu>U ., w2znɠ L& d7԰bc@=s#S˯Tco6CEBܒ?=GXPOT0&&zBn0bx}(d~R f,'X4\2V%qCt 6; )) 2QI#gq`H2%y~)`vuhڨ#My( \i4 0@%!@`$ь Q$P<WV `7 3䈖Gӈ J ).u!bK,3{:vVA瘂 YГ$BjH3(NBI"t!! ImageMagickgamma=0.454545,, ( 8 > #( ( 25;& %64>HWfm o!"y$FDQOXVa^ifqmvs} yJJJSSS$'+, /#1$"Xw&(+--//11335#&(*,./13dj5 #A 88AӠ052 4ڋ41 24511021`pHŠ-XH04 &T8CqCF;JPIɓ(S,A4d P#Ck)SaWc {0wR%]S5f0E#F 5=B@-B5V-A=8 ~IÈ+^ CAhbPtE0сQ544 Z4ǦOn5\35 n  AZ7a+0Nؙ&3(m?D٨X';,i^]Qk0u ۧ=6I-A[ۀC=%9 nhn!!rH""pb+H""*2"5袏7c%XbEb0h.3S %b˔SbTv)V@pJd~eQir%^ڙgVI`)~Y'm" b*}i&oY霄fg.Jge柃6@ @Vl"gT9ܘ" 6U 5|U @SkH hd$.4/A`$\52+k{ '| #l /p;0lBGpgqq 1+Sq\0+L@CjbS!hmPr߯{Y#Qo55#0lp,evy[7q_l:è+nϞ;[;~;{^{ɇ,|:ވcvM3mcߌ"}A4zAq y~T,M@4چز)B7dD_p `9B";zX j/"|z@,1Gw^(:{0\!;6?LA$-@ZED0 AEPI] So5U+WFA ^8^1Nzq"&Ѡ+LKyǮ? 5nI\4 zKSh -H"؅+P 2E, 4)7 r =HXgs|!B%@>HVen o!"y$FDYVa^ifwt{ xJJJSSS$(+,!/#1$"~Xw&(+--//11335#&()-./12dj5@pHҐT:ШtJZجvzxL.VeOE8U~Vuz7 B 35B =yJ-C,1- TN0lE1.01S,P-Dj,--,tJ&))(%TE }B! :8B53 =I8*f 0R -/qAZ1d ¿T Ob P/}ه~H xp1H8xN(@F8axx!Gl8ǃi\ JHwpz F8"B(AȢIcBTXcڨ#=Hb'6X02 # q9f$!*D /fj E W,Dz Š$Z[ 1lm0՚YS@B3B\yI_@ &!9,$*̠<뮼+k&쮶1#D mJ;m^-r[v nώᚋ.˭Ҳۮn>l/SN8A* LA\T.q-,ŵi 'D_UV1j6=tЀ`6s( < av93`GH/tN75KK]5OVg]sZO]g{ aͶѽ2tCk7ލs[~wރ޷x|';^{#O޸G9}.z{/ f)AF&DW [o^p}&|pG,$ TLt)F1355E C0CPses;/؆&x=-BР}_`T1"x̣HɉS.O$@\`0$"$IO 2NL$BR,P\0' %x* ˜!%: 46{8@fp*09X!Ibo2Qiw '`1!4#EmzQ1P)x@G |(+ y/Bp`h @J2$@RBj E@Iх#"tB!! ImageMagickgamma=0.454545,, * 4 < ( ) 25<& %76=;???GRYcr| B%@>HVen o!"y$FEQNYWa^jgvs!{AAARRR#)-!/#1$"VmXw&(+--//11335$&(),./12dj5;B99 Bύ2 3564ԑ3ی5ӈ166߇2ҩ1321\PQ@RXa: 8$  CIR ԁ[`#Aq H6 fjXpsE#`t Ѱ l܋$aEu6Z(A!Qɻx˷亂6$A @ @VdĆYePiKA ԥAfSH{Hj֒T\@@Fs  Zh O eОYBo9FܽCJӃh5J0/iQ؂Ç!JBP7 $`b.`6! JX! frNX'z!)h3,m61A?Db\*P"3wu X F`e3@I$R`O`CV-'{e $* ,<@B%ܐ##a衈&袌6裐F*餔Vj饘jȍvjUv7d2ސS6Ԓ T7k:r86CUJwZUh%#k",WX 9쐈>䠑#!Kn斛..zk. ü ڋL (4G,Wlgw s#iiC ]8ّOкX3͎*ULV{Ȳj7-L :(?ؿhlv'] df 20#8V}7/#2uҗItF lB0v 6٨%@@z{辻쵿>@;[6Ͼ:#{:'OSC@ "qv44fjta$ HR#p2,`P|tEx\x#(Xh (G9 B,#.p+rV.b? F:#Dl`Dx؀:RgFxin['$M̤:jPQ;IJU6}+-oKAx%M, p@ 0#f:`,@KAԭ՜Mjr/#`@!! ImageMagickgamma=0.454545,, ( 4 = ( ) 25;' &0 .86>:> ;=!EҒ 5 ը699875݃ 896455jtp( UńGX0d1(bh H"E DE@NL[ɲ˗0cdVFip#"(Ӑqv"G8T}QS e0ȝ)56tϑ B0f- -q*3+^̸Ǔj8$YCl`FY/kAPHv(uiW!HA8S7&PlCM=`A)!ËI* DOjGAQAcލm,r~}vQUyp8f#!Q /8bAҁC `HWA,"0b2H7#;X#4b9>" dK$F&yRVE2[")%5AMkؠ!i A@ 7AUvȜuޙ'#4Xt"  6, &D>2.'İC$"꫰*무j뭸뮼K"ckxegVq0Q]2r-  4Wἓ"*Đ ! p B!(A!A 0#< 'p ?3<C|C\ {q#oLq$r0\2'Ӝ#, <@-DmH'L7t@2T{p:;HgOa [k@eѠo6D U  VEupEpWBӔWngQ?]H8T eY_ :#9hIhp/lU0Ɇc$ 2B g=#00@ @` @o>_瓿7/|{_7os$W|wBOTD!aTY х.uK@jftA<"U}E7#Ix(DV@_8ۋHǀ` S9EJ<;uMʚ6nC J7IAL $%6B\ Ѐ z3<h Z\Qi $ hJ; )\zD| L2wpEv 1DS5Ӣ5"p3)89p, ^';'C&b0$TZ0ȥplD̂D9 D9UP0YD !! ImageMagickgamma=0.454545,, ( 5 < #( ) 25:% $0 /75>ZѢ @aCC0x˷j Q !# npyq|"fyFP TX@m!T 4C!74$!Z19@$OId[Z H aF%P IjyrTjyJY2CyWBSEZa47i<&c)4 Ld.RO0) 5A+P `# kiP >W '#4Bt+k覫{ )ԛ k /#̯(87p 0lt0w ȥju xp7*;9kOut8I)B!P$-<ͬ"' 1 -@ d]vhmvjo6s6lA1佷vw܃]8~7~}#NxS蝓^頳>:ꩻˮq찷n봷︋~{Ë7 r@AB%̂r:>&bM܃j: :$;HS?~+? 0 õC u8TFF1ӋNn4%XO20\:QD&=[R^@" HL%t%:7@OT\T*I˹L#Vbj)W2ѐ&H4bXvk@ 5CF:/X@2"eTKReNMoa7c6()%eAҔf, SIZ!,P.P WbF -XA0A? rA8@ #nzsG `l (D HWen p! o!"y$FDQOXVa^ifqmvs} yJJJSSS$(*,!/#1$"Xw&(+--//11335#&(*,./13dj5  #A 79A˔1 45513܃021ڦ0210) hAPEH)HBЇ !R( (Ǐ CIX Rnv1J` .]aM wĠˡ2xAXA lUY+V*DЃ_XJ˷߿- 5l.x gA.[\r:?AkhP ZxU4EHZH"=d փȓ+_μyr˜)Ƈ3ErKT  | ȋțG5P,-BA 8`C6@ 2X6aN(BxRl! b'~8b((c4"+آ/ yH ,dG*MMD.Y)Xy%U*ideQ.MI&yd0ɥDY%^N`vi&e9feyU>T唂Ȓb5`+@Ax6P!M_d0Lu*u&65 çAN7 PV@H@ Q#!Vkfv+kn rºn Kƛ|¿<0 Kl0+z CkZvӼwHhPuʬˬ0 vkj֜!B \I-D`HAP@=L/Tm?dZou\a=UwCh6kwbmm-7|7s]wznO.9;yb>y囃y_>{>:sGn:;ވrk-}}Az 8ɣ&:Ӕ{2bԄT0(V;" 288XCps`8ـ jYθ;5 af٣XۋUi HO$"b97Bą;vd4EBPob*3PfdM)4k1 JsGpHED4`nacx̣,@ 7d " 3iơE${.Q#r0 d"`R!gC+,2Y#PF baƖX Z.tL2?R sP0$!fE,Ra"D~xfjPMyV^4L5gCx|O.)8MԖIЂHl"0@&x"%:R1H ~!! ImageMagickgamma=0.454545,, ) 4 " ( ) 25;* )86>=HXgs|!B%@>HVen o!"y$FEQNYWa^hfvs}!zJJJSSS$(+,!/#1$"Xw&(+--//11335$&()-./12dj5@ $P:ШtJZجvzxL.'32=en56n>ߎ 46B > rH .120H.TI1lH/-22SJ.Gi-..-qO&G(*UC6 FC y64 >F9"c 2- qO22B,dȆ 09h!! bI&4%ւ!0dB<`("\ nB|p3Dv@ JQ)-^ kExBic 2(񠤓*L9>>8  |vpǐ#KI XŌoA~LTUNR 14iRuDH/>Ahac+Ν;߻}xWֻ?_~ߣϞ'`}!؟%BX`w)E0pOp!!֑zĆfht(a(D5zbѡĊ1)XcRJ.-X0;$Ub9/hC Vʛ-n 6UbdW=^R>4l[m"{mn+,~kWx T ˜IV\sj-dC a,@oI%^&\M 7 s |ufD,<2 s4|9-C@ 4Ct:3E4TOm5KݴOsRc]Wܰhmjvl=oݶrqݷo۝7~xkW=$T6YCPTf(UeI9ZU ep~:UUiy JMO!A^$j!3 Ly$L4OL&?qg=j ;' 1 !@f/_Q)FjznL&@41IPAv0ў7 B 5܁P8Ϥ'b0,Pa?p;X<3S'BpPx9w.R5!.z`,G9KKO6T&)s\  X"t\.h}DG( !! ImageMagickgamma=0.454545,, ( 5 ( ) 25<% $75>HVen o!"y#GEYWa^khqmws~ zAAARRR$'++ ."1$"VmXw&(+--//11335$&(*,./12dj4 9@@9 68@ Ң 034340030چ/140/4Z!Ŋ( +T0 C"Iɓ(SL@ER]8C"30pFx4.T;']Mk8 9]b85sP 8' >{E쨥È+^ F FfZ` aQAhhāИN5iӏܽr+qz tŢ< x@0NIMՒ)x|gTZ6? @#wLK۞@J@+D0#kE^ ܀C @PC$dt~a 8%xXA,"/Xc&⨢1h#@($7ʘ;">C*YdRnhevXBR7RCVpSOV64x@ /#/@IЕm Ebom5`p!LG0@,?ꪬ꫰*무j뭸뮼믻将g71VK"ꝧAmqí#@E$0!) i7C9\(Я 37 qO,C|S>l r'0)` _Hb3?} ?_Ǿ}_/1Ձ "Z7D6\CɆGsD|TXȘxRQ$L !! ImageMagickgamma=0.454545,, ( 4 = ( ) 25;' &0 /75>h :2=n$cFfZAެZ"A^:b ?`hGW= _УKNz3yۀc#pdfѠ,0W{QqϦCLyh k=H/&Z[T `A!90HD !0r `'b(b.#+X#/"6=򈣐:XGA6IS"YT.[ByZ~ɥ^u-y#kH nBM)50O'O @{6SUp$@mqP @0#B 'aH@0F 0Ĭj뭸뮼+k&R} bjyfytx \ C#!d R +HP`"'! A4ۗ GS,qOk\1{1 2|"Lr/3*6<)ܳ?s;\ALtF3t1 TWmXg\w5(8R}=ybV7DKH}hÉm9vvg74"t4̰)* @Z !VV 6DX+0 n:b|ꬷ: s?O~_ЀS @B3 ?;)X6Co3% jrlTy.4M#`(BmvpQ)dq  7@vЗ@6}c.V'O`d50stCXGّ(t:@Mk̼Qh Z0 q+po!ES!!<DzxL*a4Bg\-C(va jCQ!_r]|!inrLI6 r\nWsJ3Ew.#0@/}"!,, ) 4 < ( ( 25:& %64>HWdn!p! o!"x#FDQOXVa^ifqmvs} yAAARRR#(+-!."1$"VmXw&'+--//11335#&(*,./13dj5 %D" ;< D̆448874 7 3578҃43543,(`HYd`.Ad."z 1BIɓ(C}X҆ AphH`!58tA 2aá hdnR&]6ALݠVHZxp VȀ LA ҋo) LÔnUh|x41 R,b<;-*TӊT*"5FT,p|ȓ+פ^/#fXa ܫY^0ut==4l%x1"@ ` ^ࠃ >aFX!Z!*(v!ȡ^+H%-878X?Ҹ> BY$,GE @BxSt`]6Csa0ft|#5Tv ޹wĤ$% @] !C!@`Q# 馜v駠*ꨤjꩨꪬ꫰*:Ij{BM; !j* ,<;|j6[=3<Vx׫!}#* @6 zH2믿B p#| 3,D 1?q s_1$l2[ܱ"\'r6Ϝs8o )-DmH'L #1! PZr `:`nٍ} q@͘1i5Clu5.R]* <6AbG.94mgn9 @3h#@q0He| @<6>" AܩU~1b_$ B>@g`@y=2ޓo~kO>[?ϾGrK6LB5ct5baD?P< 5#w:[8A G7=\$./؞H""M:]'X`cKHt#"S( B)>rxP;r[@j@Fbb!?y@` [@:A.z̤&~E0`(8!EAPڠJвɕ5Rw?ATYv'S nYmT2s!ciC]c)!Z@_̦6MO@hrZBY 8Y ( ) 25<' &53><***888GQYgs|!B%@>HVen o!"y$FDQOXVa^jgqmwt| yIIISSSjjjwww$(+-!/#1$"~VmXw&(+--//11335$&(),./13dj5Ɗ¼LNQMOPOOPՐ߿PN܎QN{D?N.ǰy .?jܴ95 Z"2 BPr¤咓xsS]Z"ɱOM#ZS1DA\z dQqE<4 R4 ZOLpj {i*ӳhV[Œx {H(Ŵx98 $U'K^ aj6YKY Ҥ[i2y’4%M,I?jr*&XqO̎*8J| wVtp٭VrãzɗXW |VQ"CY9 x]{k"3j|5ސdU+Y}۲yM*n-1OP檊Qn'"-z߂ /N"-_fU9(`nT|" ~hԛ|ǭQ#v9 nHǰdoko8MIIJR4i>I W&U)g2=1"^k2;XO]n*pP>t=N&Ǣrٯr.!!7G.Wnf暷.z枏y馧ꬷǮ:Z.T:/o'7G/Wogw/_|觯/O h=`L:</P@Rqp{P;J(L WB뭠  I@#@X( a{)$HL(PxH0o(p=!f/ ZdH2{,(hy\lG(0c"$G=!F: t"x̡,*QR54N@ nzK$B,r@I(DDu(DX MZV$g 좘 'P `K(?eXPO04Fq+IEp0$)P]g+i?}$' Ғ)@YNJ:BRpPM|L%pM'"R@U/.UAt+uRVOx;W>Q)Je׾|fڙҵ ^I~ ^2=jXxp)L?RVx(Iz $G+3XLj<ή M&64%^ˉFaw}'(iU?h(-ZEtA :A ls3+l-AqFb׹^ͯ~(gjm #:-Yn@ 9:1Gf'[tMunb&T큃׾UaGࡔ\0#y9T 3yaӅGo aQûh9Zиεws9F`#5|Ϧzlmn{>&3W K+s'4w< ,]qT~]L[38.[|87QC@q#Oh< ;/cbNj||r< 2AׂX#'/^^.Ћgy Ha(B0!=( `8_@~ Pb.ot嗝+?`O^ 3pD˓HX8x먎Ȏ8 Phȏ؎؏x )IY ɐɑ 9) D}:}ɣ uă8ڣ=?B "TGFHʣBڤNʣ>F<ʗCփ<=~px%v3£u7vx:}i:k: u<|t :SЧ2yt-@zSrG3Gij+_Zxvڔz<.Y^Xp:n(bh3*SGdMzy+xtJuVt+h{vZ7u|gvԗc<}0}[r Ȕ׷^z<@ypWzЩ2kJ/`ji<.0d(JwJ'ȇ><Du{~ȉ=[`ucv>HjK۔G#s3{&\F|ΈJt{pLPqBT\7VZkX^4`'nB],HVen o!"y$FDQOXVa^ifqmvs} yAAARRR$'+, ."1$"VmXw&'+--//11335#&(*,./13dj5 !@ 78 @ С443ג03އ/1߃400/0'TXQ`U|0@>R( Ǐ CI;u2H3$6 3%0B?CCm4tP da=+N(a+LlPV^G  Pɻx˷ 01sЋ`l8fA0FdvnJ0 `A'P,:qk؋>D`G!o1:Kȓ:yŌA-iڅ*31e ; 5'ȉ~QR`mQ/~F7K  6 B`>HZ!jX!R8b+v"&x2%;¨c7=dB"IL$M} %vAxkt74cA%5N)1ISXj\0geA `#j`"pH?t駠*ꨤjꩨꪬ꫰*무j뭟ڥW61kx2"% ˶&ND;'A]5 +B&G )¢n&Du €<Ѓp/ #3<>Ll kq_ q {r,2#\'nj+2/s?6=33B L7PG-O? ' ԫ eM >u>m"f 2=0mqs! !! ImageMagickgamma=0.454545,, ( 5 ( ) 25<& %64>HVen o!"y$GEYWa^khqmxt} yAAARRR$(*, ."1$"~VmXw&(+--//11335$&(*,./12dj5 :AA:8A; 79Aȶܢ 155125 1454 4120(@҆2#F j)Ŋ @bI(BH@;.x@Y|ㆈ vƳϟ@ sF f(!=RPf @'C m }֙VD5jF N:!F`q@ "UXx 4"H3E$p`3MӨCeo\E J4RB1:`[h놳54 \xmW \]481X1٩HA77UMߚRo]U<%ɂY8  TB.&'@f - A`$䨣>c@9E"y9iAL"$O.YeFbQNi%`~)&WJ[^cYfrYgti'Q@6r q U hȐ!x(*2 \ @F)BB[ Usf%(`PuLX2AzAP2> #pC p$!Vkfv+k覫+L5[( 4`nI[ 2dOѭE)lPC\Uy ఩dju#tDxB x8$ 97*Be>kH/?B tD#}I3=CP 5S?uJsU_5dm6[[ݵ_b]gvvϝwx m8U '78( 20P!6nk&Pe)X\uc!Ňj*3x r%v m",2xp|G/OBgx @q `X U,BTZjF >$#0l@;~aT$ (b0&8"20%,=:x^6zp4F8B R(X!1B(,DRHVen o!"y$FDQOXVa^ifqmvs} yAAARRR#),!/"1$"VmXw&(+--//11335#&(*,./13dj5 $B! 9:B͕ 266263 52݆1܆562ۦ12* J`A(X(A!"v )LjxpƱǏ CiL  2Ԩ'( [@\#-lHp)@KB rC7Dbxfa~衈!r8%x",b3H(b4c@X#7;ɣ?2$C. eS>)Jfy$[jd`!h5Na(j0~7lC 3 {ȟ{T4P% Ri( -x9Z[f<BH . 'BD Ī꫰*무j뭸뮼+kl>@ 1d` w 4!b Tm<ҭ'OL;D@A[ B-((p&{-r6K[6KD`#P$-  BT no>0.7ނ * x~|7rbGԤAQj͈4< NԲlQSA aA )`j"(ZBr8DʅXOp 05!DqP yC(Z$MxXL)$]\, !,K & 6 = ) 25< *( &0 .65=;***777B QThr}!@>HVe1@%n o!"y$IGYWa^khpmws!{IIIVVVhhhwww#(*,!/#1$"&'+,-//11335wYek$&'*,./135ƊNLMMNLLŬMʊKƘډݧKLЂJMKI-ۥ̜] :P\#z*ŊKįԼJ)t_$z:ȲKM wEij&F/sQETd^$HMRH ʜ㵪Qh5D+V^WKØ6`ٷpe5;eўeRmu$wj衈̢ h(|%*餔Vj)^馜v駠*ꨤj"-ꪻꪪ*kJƊ뮼 ,Mú*l"걵F+Vkfv+k覫N+@k,l' 7G,Wlq41*4Po [@ *&_,r,NB8BNn |n/mH'8.M34+DDJw`w݈Nlh{RoO7Y;+@-m>Íwu_;w؄nBf1: ήЄ )tv,ڼ47P@+D*VuLD 05#:,PՄ:j7 wom- L"7/,D]+ 3<#Ȟl1\>۬}B V@ |ط0$j/d9KB6/`qNuDr#ojٶּuz!ԇ6A Hյ8iӗx\$Q q|ANj}w2/g\kc<{ I4Yu ;-~i%AH?2/$ėZ#: zFƠǴd+Ji-.uX[- 24@왿$f?`:".Izkcd#/Ng-uUEFt2KeI-%bps4;/a gc"5ƉN`H|Plz{.>.NLgj'&am0T3>8 W?fMq)3fL+HߐT6:!dfSeS~MjU3ƄTPxU}r>}g iJ׺ZHJ-o,e6'o0IH=yPk5)b9K!SlTJg5JV"d `;лu%-Z$jp7trĕ[qGvʄtUК8ݕNr|x;ӌYXx R/]Wͯ~L^"p-n - c°t7 2Epg@,F1 Y0$c 5H@h@ kH W8E>r el)A Ł̋5 Bge.x,@2p<t?K#@` Zь@|PF`(豦Y2P);KԤ6P]j pV?l@>Sf`ֹ7,O 58c0 P /(``YAtLb#Y=0B *hnt;F  a.p Bn9耮 Za--4?k7s`Ǻຎu0pS!p|9 2 @ - ~5#8+zA |;=Jo!<c:P1WKW:sO]dz=a֓&{[ - Y%gh4!~po F BՀ{}?/уGEz֯/ZȞ}cz޻qO}{G~|'?֟~C~G..q4 Nr_r?hwv~GterW7r4 qrg1,2b |w-10c;KG3`,(/؂p=E@$2<B8DXFxHJL؄NPR8TXVxXZ\8~9&z'd8ehX-h(e҆j8hXzfc{q kd]kP0gfH-0,,Ks$=P.cFXnD@*hpHX8xȋ苹8:PhȌ؋ш،x֘(HXۈ娍ȍ䘎Ȏ踎8H((:rRkJFk 8-p, Gv 9'I(fvl46bs,g/.06Gs҉0X#tH_t,iƔNuQvO U 7-KٔW^Ib7-Mib)wjwgrHl10x"x2`3b(F~n6tE@EpcBI٘RBqRv<hv-R9G-A8pBfhjx'r-rbՂ@2:F`FyB t2I] M dDB8v")dǕ k9dמ y)l -l4`V-s 12)bpgҶh+tBBС7tB@&p.:]Xdn'1Z(p,6<1p)R39JEiE2ǖVv-1g1@~{֥2rg03x/\ٙdי- shv)bbl:m*:Zz*S2کG,zSڪ1LӲZj01s-zSGWZzȪ/c8ҫ.4ʫ~ؚ>-ΪݒGQ⚮z-{j:@T-JiOJ-sS1Mz*y;ʰ [۪%躱 $z%;httpx-0.26.0/docs/img/tqdm-progress.gif000066400000000000000000002471621454054354600177760ustar00rootroot00000000000000GIF89aw***888IIIVVVhhhwww!! NETSCAPE2.0! ImageMagickgamma=0.454545,w K& ,P+1!D 2IdLΙ)%9NR$p(P4X`8T!MkV#M%Lz4̟SJՀl$Z3IX*cfj &eIAl ~4i`<-fe ϊ@Zӭ`αAԦE Db !W//#&,Hcލɑ*Z&W6n ޼B P3Ȏuؙ9jTg}ν4ٷr'> "ϼęgΡP`%<]nuG `MFg1߆wsWQ6R}!(DFǐ: m%+HȄPAD}Zq<&EFXˉbn M=WYC>cMT%囘XI31x''KU*>x zh裐F~Vj饘f馜v'ꨤjꩢ*j*무j뭸뮼+`&6F+Vkfv+k覫+km l' 7WlgqD."@ .K1/o,4l@+@C\L7P@n;u?n|\{cGmhu$W^lM-_ 7 tށOz7[vj7',HC+$ < ݤLYO` D[?; ;t;p:W3s<5;k=//~P5@@)t>L@-4f 78D~&:@ ( ǿ 6@ @?Q `wA~78VHЀ9c` v9nI{~V;'P*`($^O&@LV͋}" 4K'rGlr>@}Dİ%~>8=9[#)?1s̃GMp0))c\!ḁ.1ʹrHd #б^|#y<%"eϤ^(h3У1Urw]:VAJ̓z'yʁ󛔛!V@KPkYBxݕ`% 7طQN45FtꥱG12s˧LgJS&SD$hQo\aFB:~0є72ӅHQv,>c(,F Ռ" h|*dqBdaMJ׺+h@Zw\ o+泶hI) "VDoƱc6w,5VA:`nXc @dHHzyWfdVۻ[o6V;m'nw,ЍnT=ج[:U xS,Gv.HYt| `Л׼LN;'L [ΰ7{ GL(NW0gL8αw@L"HN&;PL*[Xβ.{`L2hN6pL:xγ>πMBЈNnF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^MbNf;ЎMj[Vp!! ImageMagickgamma=0.454545, 0@@@0  DB`4HD2T,LFt<PH4"L'TJb\/XL6 !! ImageMagickgamma=0.454545," ###$$$))),,,333===JJJNNNWWWYYYZZZ[[[\\\nnnrrrvvvzzz|||CD??CǼ==֗Ɛ;=D;­8;'C58Cܫ88j?v5TC 쐍?\XQG=j\A6rȲKNZ0˛7cЁC6q u!RxXzaИ~`ӫ:x%"`}"+TW f(PC۫#@p) Je !! ImageMagickgamma=0.454545,)***:::FFFOOPVVV__``_`gggopowwwMJ\ZWSa^+C=QCV-H>?N@R}k_gsx׌ܑطѽʼȼ̑͒ӥ٦ܻ׃%%=?@@?ġòɺҶ٩̓ğ⸧™ݭ߰ݚCnղzjᣡÇ#J|p"Ċ1JуbƆ=ĐQxH#WfRK6S3DB>iz%ћ=ZlvGImw^k҇}%v on7][܁1ĐenW_}u}(w tbxn!nW6Ⅳ5H4x删t:8c|'F }YX^g $bX%iet $TZyޟy7cѭvB 0Ѐ dbBPp r*H0`b|ܕ*r$Jክ*( ꭹ*qJ앷6$l^@ tA >젮2,R"lr+6۱q9.ˮznzjkjBkxƾbgpJ+94 7CCr,"ڻs\+/.ѫ oñ*m*/ 7}C4m٨ ]!Ʀm.Y ”xg 3&\2HopOZџ,ZEm 2G[OZf]Y.tei[{\ˢ_,n%m;RN6iw5o]!Vŵ{e-g7(/F[Q,@UYnjdEfPm<n6gdr/hE#GyǵtثefҒ.K>9%R8wqr㜢#g莟wha^\Ry~褏4wȭNigmg>F6yV`6yTz'8waeE8p}xsewWDKK+K+T"mZdy˧yuiFGst&\ nRX|w{x0DžF:7p|'XjHR]Q}P\)G)~*:;,^}:+~^1~^Xo:xFww}xsVy׊xLEvXysHqs:ʸ$HveEN LYLJt2xƴxu4WpLKKdVUV&E؋'v8yT7(Yԏ8XIwY1pqXXXYf&(b\TfTi(9(2)!f Q!]8ؓBY2*;pF:Zrl l溮ڮ: !?@l [{ ۬!P ;wP۱Z J@ *@0Z(۲/ˬP4ΊΆl ۳>@Z.PDp<@Х qʬ UT bB`b;J>,!@}݊*@ P+ֺ Y@ \{d;k+Q +vK;zl괄{;<rJwò  JD:k#%>pY |K K)>ͫr^jk  ZǶۿ:}^x@@{ˣfܪ pk?p PGvs `7=`P;P,˜ 6ԩ@&' py`ӻ<];T\VL8`:P+ǫ <p]:@Яl̫ 1 7"{\z< n[xĹJ`\0 ꋮvŜɞl~|+ ʲ; l;ʭ,LZ4MrR̭s7C< @m pӉ|LIJPLR *;} |LˢL%P`^:}60;Vvm|{w 'l ڭm<M❬*+}T` *rK-d i:=^ZηܻM ~?N@R}׌ܑطѽʼȼ̴ִվڝ**ACDDCĠĺ˞Ҩ˲Ϧޤ׿̸Ƚ=.CBHс@# Ł%FtNjB,豤APpʕ!+%ƔuTs~ EI'QALxTΦPF%UV .jɮv[r+X^Ӧթٶ#G@mt)ŋ  ҹa".ఐq^@3nU<ٰVb=%1fM_FL:reWƼygٍk}5ŅOZ۳'.6nф&KNY[Szzp#b^஥+?|5?7{ڝWmyv} gG&`mמpVt5`zH q f_U߈fg}1xၫ=h܋2`!*^אL` I8Z- ޑ`B\ VzfqR\Jyf&kS‰'CIF'}禚o9gouy'~zZA7\&onR&}g!mhc)ߠ)giJ٬uIB (NI皾9箁Z겘:(Csz+Ȟ 'Ԝy +a( ZY !̢ ;rgrвK(f]W$?3-q_6c=TͶi|W@I D /-_^E(CsگU.jojpK.ԥ u˂y9{>kP C  4^#PD<>3P<~BϹ` ܻ٩~-]B:޾ϯ>j~oڱ5IF 7(A"/-AM :& GH6H WB 7c^T!%P I!@*fp><~9 z )qo@ tNp$)@D8Ǔa'AWEBr{(?WA> gi1P $eHpD73cZ$g `c@H8>)X @)%>x@\&mBЄ3)ХB5) K0 `(9kȐ#\Z)WΥS)XHΦ)+ARN]  l$)Jh^ _O4 /6Ьg}1*=ͪCY`VqUJPzU*4郰^ՌADYZWU dBЖ74`*H@ ʘA (pN+$QgwYe`@pRЃ@T`#;DAB (H@f 6P"> Z+"*9VukVK՛5S~צ֯k U$W]׭)_VrY`zRx>c}suE*zwI؀HĨb2L!Z ME#4yb;Xm"^V61;aZE- 1G} O_\p` KKYF<& A8sQ hbٯΐ%KiJmFl3-G3m&M( zF  {*2r*Hw`պjMCUD%mmOR9D2e ^.Vt;l oN.0o1/Nr!5(Foq= F _/ zeL~ͪDufEx\p!Yp;_~1_d+]yt_v@zߜ@Hz8vh@RW/JlQ \=6 'c~TQ0CR+!8k]P޿͚an,(p@ `No\G AݣQ7bzPpOsd;3za_͘19Z2m}c5r?gXK'O<~*U?DcU$tKDt}WZr>@ .W"A38HI\e?v/&y0E?v"}sjFetUGهu/ȂwV=Pef=nf^7Uwؗs;n=@8pBWw~'fvvkW70_eD 0`y>Pf{ʵDfOCJ'XM4f5 CݦfcV^¥DDuw|qejM$R#<SM \nXhfz_^PF"EuGj6m)|w|;30$PFEdZoKee2xQH>xGec"XgqC)/ȌuiC|Fq8F}gf2~cY$D=f=8/vJ4F""y X)h0t7؀%m˨UK 鸆m?+9&كiSXx燓Zјe6 4gk;uv4p~;ֆjFjXhUhz|('eND䄀 08!`YQ&RmP>Z`\%0OyLQD?ju i?zvVwR&&$wਏ')*=hGyx35I!eiA!(@ɔɗyN긛ْIBȒjE#pǔyIa7@c1@t000cS;j. )YI8 Xjy2E6ɡx**) Yvy4Z30;@g7)8jEyHhYW$>$׊>TF<p%jYotW$pb"=ꪮt)J)ij :i*Cߊ˯jڰ욑ٍ J:20$[%;;z[ʊWTȰW4:K D1[1E˰LZ+XoG Gm*ʮj +7+6?;3 i A +;K @ja _{V˸˸A브ˤw;-1I KPW,벐:۲E [; .0_.00.0; KYں{1N[ 뺷uRE[ gݻjK++˹9⻹ۿ;[{+ W2!0ڼ| "< 4C̚nȿ*0|'G#1:<>y'F|HJLNPR@% +DDpD L$ӧlB^`C.҃;Y;$@,T \R\b|~ۜ$&CpMoS ̏=̉}zؓm̆-\ـڢ=ڤICPC {ZB@`)@ rD"*B ȜZpՎ]DpMB>C ̍M݃D0עLخ]α=ۃ&]]}= 7L ׫˧p =#pD? `!nWN^^DR=R>z#J;PMC=㖅HJΜB4pRmP<%ב-D R bN2^ \hݿDe>mgNiC1$>.m \L>^-v>N\>׼\.֌D nx-թ>? uBP>.~g]spW->^}D ~nw.ղL*Κ.ܴN4}k]~n,^^;`CP>_<,ļi|~W]+CΊ\1vb^ٿ>6/]^31~O!/Q>?T_Cpo6wOY`om_+L] )-I``]0\ݫ 0?*M ~ N?O8B ] LP}ڿ?͒N&~GQ-o?/0Bp)9I(@(RX *:JZjz ;zٰ8DD!I(D4[l| M-+0] а0n^_|N/o_JΟ BH"юB"@⃦A wQr'(HA= d3.R$R, @9 Դ(9O`LE]6@%i(t>[""~VzZ`].hzv g1j(@ y d{IX6禚(-< $:$, tE]z[" HL&akl wf=kgbYJ`]ˎh@X5,Xn#)X= ᩇgH'[4ҤgR@@= &hD 3NU$wgL°ߘiq1v ,_t\0j`qy))rg.sBG04,_h]g!IƩdh 0P6o5zzmз@}?7]H98/sX{S0H fz_SRc6.kt!N菎;x>EO|7h9X{#M~AC"@pld~P,-u:9DK&@? [R( Q T4P(5K'@ vUd%$B@hg6e`(X[\iS @fP< r $`}q⧘Y`WbT "W&bl0 7@1H?"p0+*6:ѹ8dp?d#"I򑐌$D!! ImageMagickgamma=0.454545,,(((777FFFWWWeeewwwI%˻`(dihlp,tm߸5SIP+Ȥry?J`GBԏӲU`4:&uˣs%Ӗ k,Wɀ8H yAB L+ "  B B~ <vxR B y o||<=ZŰ  ) Bw  2" tP@  8ZaC &z`C+p4@B!E=SCG59>$rMFAA1Zm p`At}^ipP nSz~pʝۏ^ زP폺LVPyYD~փf/oxtiVAu^Ύ+0V_a1ٲneSȓ+^[+8D(R4`pg—^`CI@HO D<}!J ?xIqy 80Yj^+H4spЛV G0oQPN=C,g(q"T3AK);:@, @6 d!w<4J6HdAvdqޏP)%TV !pidSjY%LC5`,„bK]x @`,袌՜P% ~ rw!lV '# ?Ǒ}^4!*kښ!8@:{+SQTS'8tZژyVEA6"2QuaBHTjYŕg]ن@U@>G<|O +'"P JD[c9)A!mQ\W))[Ƶ+D~]X! Gq`% Ec\ Bd|5EK @5PMs@f6>6gdSTRAяu4Dn&AJPh<ܯNcv~T^ل=Do@+uɯ@0gt-ALf Dc؁0P4M|e?mmG :$h@ngq#98QTC[xndK+#'mP Mb84Jvz &z&ڤ) 9'ɌYzPTR&YyP˔3/ac!@f:s.DZu̦6Y/ `&GD!! ImageMagickgamma=0.454545,,(((777FFFVVVdddxxxI7Rzŀdihlp,tmx|I@Ȥk:ШtZ2qS_/ ]aB5U,x|0`0 FJJ s+ D% IDwA r wB H H  ~~A\ȶ̱Ϸ{&yy.wy # ^x "  HPH&KA' @N^H8d[b'6BdG(UlDЕzh@A$P@UvV:t "̓=좠P"K&mר332.pTm @p$-&>`bk0A?Gܩdsi@  3[/p Q@=Ϝ yA$УKOqzZ)y!=WЂ@#1^$!W3*NP~"z\  ~,[C|5V UBp7 )~@\87݊,P'#4T. pތttqqψFO,L/ )ϒwdfTI¤=O>@AG`!p!geYd_GȂXxA3qV4 IrG"#(餔> $H(-Ҁ- eNjN`\ ,R˩Qy6+&*^ƺ4gꥭ,Z0p h'kр=p!MR49\q6{"@9b$I]EOۥ&'=.qZ.7rk,#lr.gL:߰&A5 Bf8eO0Hg/skXV $yٵxqXT x!Buv N>/1(} 5 GyB_kH:2Yn:֗!y0 92Jayƻ{|.y_yC9D,_яfM# DB{b8ඩ>&&h#C(d hTY`9 l2Y|BXA}@ @Sq ?bKuu{UmX"BWAPNAB i5DܣIQQF@/c?L7*Íp)P 4D脊0$8`1-/ 2p3VԢ*WirVM^0ROf ĩPf@+@( `rfm _ 34R+N-0L'eTnzY0@LU@(e"!! ImageMagickgamma=0.454545,,(((777FFFVVVeeewwwI8]C&dihlp,tmxLA'!Gl:tJZ`.0θH2vRf{Mm/[`X]T  @NN M OX&# M ! Fa D@ LG w  ?EШ#ϼY% ێP-L|L   J.=@G~*\Ȱa&{$"A@ ]&8xpgD4ٖR^vAH #U0KN`@'?c))S@E?Pyu PXXς  `3+\2@uKdd\$brg T 0%@)xR̂n4jw.=dZ'(ܣOӮ` Ie`;Gҭ$ ¾سkߎ:pQ#H#oܞߥAP`ߟσ 2# DC@ҷ I*!L-RIEG-,%݋ ݌4*)Lba $n>MIl5>,Va#. =e䆭O>"erTRdj٠F_&#9'{H)# ԣg*`V)AY:q&@B'WA0 tf)ޑJ$) اb (hӑ/@QJR \6AqP\E6+,~z+~EHZ~Jgw,pZҥ+S`tf DJVtlj ʤ%!wI*2yat+eU. $<yl(!#¦&g02I(;[|iSA2sh?[sKɟ6ӝ!¹I! dVnT*C(xj}"z]v &vd @2c9$t&@.8^J-6 T^ґou_\&CĩCaZ@Z.+lo%{jE I,nBp΃+K{AO.Ǝk6Al(o<~vg:d?bUx:`P 6 E:4 )r`ZA@e?(E N1 AV!&|lȖCBڠ('LaFچ]h%׎ 5pDUX.87H{Ǡ:K%,ZË԰,@0R0C `ԣH9Cn)*' ce$] #M`"ARC-M`Rɢ*Wd \ P  K|Ka@0AJa , by .\`GE6zXc6Ms&f%D!! ImageMagickgamma=0.454545,,(((777FFFWWWdddvvvI8MC!Epdihlp,tmx0JAN~D@2 >S^A :keIC53utOCy9` v5[`=^<( %8T-[I ʝK $uu׫ L#-(C_ 'ӟé 7=I,ʸo8 N-3t UK$A ӣ[<_%|7*+5JsMڝN:u%z~:CvRcnzc >PaF_'8W~PLDZy~tg_U1P`Q?Wo &$#[-7 1X0b $Sc 0̔;I}O?. ـ|ԀvAfǓP`QL"5>QjynrIdj GC Eƹ$Fo P''${h饘րW & 9Z- ,%9>yJ%C`(,Q*F+*lZ ӯ*B>{RPzfѓIα \+)XAH$*,rΒ $9ǤbJ8XA2IO]),/wT@RV?)B:nJBog4<*_=@Y'x (\u^z=mqp_01hv+(^]5]BAzθ rJ-BmJTAIV Uņr@j{WmOltIk~>I)ӨuڧbJK@03B#XRZAb@)9x f|1!c aeB6HU  SqAPn: %Ao@'XW`2Dib "N``I)v OCp 'JYc hBÉt!X.N#PDIP&!E9$iBwl`(V T uɁYz8P@b % pfS3s!cॼ~ԑ; \ጸsqE!! ImageMagickgamma=0.454545,,(((777FFFWWWdddwwwI8]Cpdihlp,tmx(#N|a<aGZl  &q1@tG}q  SNQQ Q }-a   P ` Cv>?O Q #gG ,MQ   P.y4 2ŰÇW8P\ 8hA%3 H8IH;LnXL潌󁁚`(Fia͛FtWCP_ (Y  p'p5!i!ĻxȖ^Ȥgy,[ V=% L~P@٘fWg4;35,XJٞF-uݙ-8鍂82 dl$-j3kQ!D ڴ2x wu(=a8KH+SxlShJP@< r"bMzHuhvQݍ8x&X x4, cAURXc".@,$Ty%acME&e> XhɑP؈&e^9B0=ptgq @c.Mt@O 0@C~V4hݦR駠 !R$a03$Q~0=c0bG+a.`^3뮽 ]L:¯p 5B;O|rJ*޻D!ށ2^ (< Q Jx@rl0WS%(2tBxtg"4֨U!! ImageMagickgamma=0.454545, ,(((777FFFWWWdddvvvI8ͻ`(dihlp,$ Lp 0H,F(D:kШtJZz2tk* gKo.(.dwp<  6  V}~J   C {|@j  ;<Ђ  8$a[p`w"`4H@@LaX#%< ꀫ(S4aA%p;@ ߾ (ؙ EJ$(ܢσ}> @atw71hmjaUڶp@[%( @ o2*I<(`jbaH˥0oUkϠSFheT:o8-u0(Č%(5nZn$޷QF\ ߽kNA`gyڐO4DyG ^8QtE`!` T <!-BȀ7qb.}Ȋ1̸aRAe :RF0I$-b$3e`(fal%PD A4BD\V67|<DJMQVT*j(-Za_J=4袩":j#<ƀ#j7yjig&a!HY1۟ImVk%ptH- ቌݪn'X#y6p.-ĉ"ẫh˩ z89,ȩUS" KLO| Q(xqAK#_ssnprj;*C㵥;0< $"M aO+uQ &Y2u>0b`}a1ypP57e [hXm^Uh|͎&ǾPFdDMXy_`8$K!^F0:@0x=ʖ\EsCkA>3;LNpLX#Df}%,D%Lp[G}º,XŁrTv4;Mnu5fE AEG1|"r;ow@>摪mnrC6>F_g9f0Nb#Xp3R`8ȰlHv#aO @ `x 0=8< G%R3#2 RLgI<(෪`Sc 9%U$"SpLeV 6&+<1TB/KX R`= )%6K1\*V~󟫡p+&sAѳPG`HOA3pL "fT@|8h (@WҖ$7_b"!! ImageMagickgamma=0.454545,,(((777FFFWWWdddwwwI8ͻA|dihlp,tml0Lg!HXY*q9 vzANӎ9PU@ Z.}tӾWN.:|g   #@ X_  F |D    ?@}ъ ((HÒû$( L,@ Pd*U[u d)XR\F  p-C9Pd$ xp@M|H$ځ}HBmҨ2sf bKkuIp@xRX8!İ2iV)@Ж1畒OF>eT9[jY~R(`(gN5/dV k X) }⺓pDpBh sx mK`` N YNg%S]~53wϿ\cGuQk)C(sN "5oY`P'!Dք(]Xb.x!CFQ`)l@( X'AieRXf% KrIhC%O(U^EaIV%&5P$CJO]jEI :Lq-_6A蝏J;:b 0c ;-JL5r@ѨWm {MR듻F딼זkQWjpTqw\NS1 Ě* Bzm PK E~J^VTط~dI^̂@u ۶Fη~8zW+Qx"PX_~,r$[y(Vxr@D%V.ER"DhK7R)@8:.@)tQؗtJ gӔNK<0% CĖo];,R}{W),)NoqإQqP DaOޡ{9+[?"&?rezꜳݨo*Lq]RvW7߀3wɀN`x?7HPF C0ѝ@t oa~?oP?- n dF$p@]) 1+H;޻[Ny}OVB\/ q9 6 (QȒ10q< `Df2"Q. /q(7,1#PuY")JщX Ո 2N0HhDW)Y"_!:$xaD .T> [RĺEsVD FTh4I% 7[<-9s *+WgI,`rSDBD* j`B#!nZ+fRe`x:B|3QiL,9P!a98No04BPx"k(080[D!! ImageMagickgamma=0.454545,,(((777FFFWWWdddwwwI8ͻAA|dihlp,tmߤ hC0;2(E!q 0"ٜ vzgO=ΙT٦\A8} # #V X__ {  F C M?   >Ëŕj ס`M5Tm`p +^-*&S:і˗0c~a  R m:4HЪSJHN# WZm:@,Pf:QSR &h;3)% (ec kf+U¼Y*ϰ M,$&im<%Õz[ iQr(+)@E8^çn<2P'\|߽y[:{NHIӖ 3sXĒih }@LTcLrT0JAA5Zh 0_$"*2@0X-ℹ9@#0J@Q{%}Qd $F20y ge`&-vh遖%XTSƇEdT)KGx0hw>P"DHWEhh*zh?("ϥRXJ)vR'fԦb .!t4(p@PMuӠߗb"K%1Kҳ)&T8XF'p((\*je _Q.on+f5|F`8蚔x$xSXhdž m1"8<.CEDBLQ XT$AwTÓMJ{)f)ԅJ CmD' `SU 6s~ـMSF bIInx@|EFr5dmO*+T@[([a䊥gA:sN."hK`zLyC1Pl|/wqu@*n-G[>.˔C.󀙷>c$@.(aݸ{b`I4,b W8(GL,P,`CꯂqGZA ;|Jc(cr蛜HD {Ȃ 8P wꑑ`tr: OՓI2vA#M`xF6NCA## )#H k pE>@Ȉ3@ p@B(8@ɄV9V/L,K$B(4i.M0'#Ő"镟m ,.~ل]<@+Hdل[^&6 l&YMbE!B`F @W$6 \ @fB\A9+ $G, 4Z!( ##'4@/@m0 @QG,TM-"!! ImageMagickgamma=0.454545, ,)))666FFFVVVdddvvvI8ͻ_!( `lp,tmx[003L#@)a*h.)krjcL.#xz =_r?, X~K|qzG{9v > d G c  bed c  ·c m0K L ~J c  FMkְ̙c0IBj H9)ܐp`Bh M8PpsW}uЙѣHRV: ^ӑ5Nug ;IʨVY k5=[%N +Hw/H W *IQvcˈWxP  ̈́F'PBaZKv힯MʻRB!qԘ;'3@zggc9S|3,`PЭ#r;i5G?x 淳U #:0A5b#mcRL5[lf.ao$h"fz* ^QL xXcDW<$u/J@dJ> ;s72Ɋy3%,`f @d_-JOȜ袌Jq>Kv ΙYf0WPzgZ@=tEA*n&9W@N9)2a# V)tB҄> Ӏb' 0@ g![kP˛ڣ"-7 -u :ypRgp+=o,ʰҸ0qd3YI/vEK).x=C+@AF.RW5#<,Uм,=cKSW`Ysgk4)A̚fKw݂WH ,]lA,qbdS~u}d`f8ʺ([(ظpKoJSx T1? qMH:9FuOT ״n!! ImageMagickgamma=0.454545,,(((666FFFVVVdddvvvI8ͻ_!hlp,tmx 'IG VRhA&̋ӸF' Uzn+4f=;sJE@ywrzB@mIsin H ^  dX__ ^j ]` b F  A EX  'I^B$hk@Pl !3a@bDPA(  x @4-V']e%J*cy͛hDzH+ܰ|430!48G L%8%B^U֮D-ЌYp6*۴?&MŁ0(H tJB@BP瘟YS4Ӧcɺk:QL0;Wl`S=-0X,N3`꺡̾'Ι;"nis@0UG^rIDh]"Ki`j 6kF(z_Qt#ys*x GЕus]8]MbSm"x4H\(ã>x$AP'D$7NQ*^Rf)Xk"&i24xFx )㗏yFeTUacyTPBG 4nMT>әbZWɨ^4FRa͖e @ԊC|$%%gF@or@4:ǟjƙ-nj{Z䖛FD˝4>ی[j)@)WA'q%CnYʼ[KVNp^K=P[ Q'h CLpz,c 2\Ժ@ŀZ>)D)@jm&~t_kL 8QJXlĉ&.FpBTRP쫕EekB\#)5zunh-qi-q?,FXmvy[XJA)aZZYAWdtĺIk}ў(騯ne,P|qD0YU \ ${$/h0@7OMBRePU\T)УϿ/IX3n*FDY"FTN# yn[`@ v D /A 3L0XP ͇/8+> $Y/Q]2K"x?%t?)(IyO}MI]6pYˌ4LyVL &hJ&ᄨFD0@A&GpLS]#$>Gy۾)gA <@.nb:@$^`?G2.Ӡ]tPgt(O@@ <`1$IxTb h@c$~T@B)*G>P}GD YaP @2\`S)F '1 H15}팦{#)IBS"$EqHI(Q|tΕr8ľx9ȰaBnYFE(;1JN}R9 Pb,idg#^)_h Žx5¶B4y  `iY2LebkX\K `=ڤ_̔e`_ K_aV\Y BрHV9(RX'l,hho06(2rM-+u%l@S}.uʑE]WU `@5d$ZI0ip9Ҫ}u fg-PK@vX% )ER,z"3}@&i"(讽 ܣ+R {'vN7 +a"ZLobpVrE@V+8A@i@ <.ʨ@1Iȥm+L,l0/h$PINpR:!(ln5ak6ڑ9AB&ʁ,IX Sn̟j ^3q,;+eHd~ikpҁӤPǽII#@E q)=Vq ]'J6+oblG/}nwm0 \}l0P}cKV! oYa6}7Y%eP F6췾]J3 p7mh#)[Z24 p*5Є%VBP` ' z7 )V$)~ 6!qb28zfY%ľ<0 TAN*qp]cp ԳQ;O}ptj$5*CT[0 b8<] VU6ax+XX D֑xͫ*duJ!! ImageMagickgamma=0.454545,,(((888FFFVVVdddwwwI8ͻ`(dihlp,ϭ0lC0wD$08T-ħ)E:is`GF.^ʖ#^M Cid6&   ch2!=  B? Eb;    :Eqw.[D$4ġ1Xp`h,@@@ (UW/c&L2k)i@~Xe=!AH0IBAp`BKN: nd\Gc u7,\NJ]@]b5cS 50 "G;aM( pkgNOmujק} M{62HbZt[I yDP kj(zn30}ԣ/޻sȇY^o?Dp!3`guYf=bۂj2 iXۆ 8~cCľZ`z@8]=WD dJfaw:6p! cz0| X&$ݑ +p]5 kM^% SWbX[$"0q lJ3E8 3)_RXg )4=hL7@$M!\[$ɳ\YYAz0Ifó]c ZV6M7.gI {KVcViX/F]ZH "C,gD۴Ӭ.D Q^YS09WQWF $ ;g0rQ^0@mKe\y@5K>wRdҀz4^z_O\Gj(RD02Ne=I7;afDwrwDp#hv'&'P¬hQ4Ѓn() MEON38GFƒSG?*]UJ dL  *Jt;wퟆ|%O]g-5phMg$%ؘ H iJzŒWKb+]ʄ2L4oSƳO (? Cmh';c P*8݁"<uZm߂+0s7RaK |A 8b܌/͞%#J1&>08y"Usң_Q TZҝ{{`C vG~|F[Lrhqah@hRLqۈ$$Mww8>*b0:Iy\(=nO(4` dy]8^a$P?4 }#,fqpα7 ;Kxp; ,܂( G_\# I#ЎbaEx|]T84!Q6" +Uc -Ht10y LpEʴNn$C8I%xIT*AKɁ IIXzH[5#k @&Ӏ]Ȧ.a›_'ĩm3$v&c(*p @I59O!* ?0@%}Fm"QZPC$MphCJ1fb ]jw- :ŷ0Amp"5 89;q4@L45UO]0F=#cJeJ}jCPAX@0thM+NaM'\J׺i V~ `K_!! ImageMagickgamma=0.454545,,(((999FFFVVVeeewwwI8ͻ`(Qp,tmx< AK +#(ǨB&irOR}zVz|W9!' cLH|3F{r@w k o imj mmlklkjŭks! Gݑ C P jG   -⹃'Iv-B)@"ЩPN|kL8},@2@95.hܙ'0=yilhH*h5HlSQe%I(=V ]e`a-?e`넫/3@_YMŁXɚ$.Faj@,()C%Lu렰S^1ۨi/=t3a3Gn@B(E_`@0 ?&{;̝Al.Yʚ˦Ei@\vkoEw'J$v\IcNABHJmeku~(b$ƚFۊ,Pav0`G% -ȒHuT32]I<=捄sHNF5@TePd\єhFl- UЙUW#d(V'! (bFbYYiIOՕ&|~K?*}uR@6-䪯wi`t,rjl1KqxCD %HC/^h;b"*o(bbr,]ձtH9)*`"fD*|aiqc o&;-T,12TJ:RI@u_g&?[OKl<ֿ*- =bHI,,KXP3K,&ycG2 wǷxnk7boǂڈӸv8,VPđbuR25ՇRNԩhIQZy  ' URu0pf>: Tytn;|Md?g`yl1.kϾ_)f@{JhSm Ҁm'?6R4J}EKB &8! Y> ag{z0<lE>1!|g @вJpPЊ#^!& >&ZR6K&`L˞oyxj?,{ ;iJO ҂Bq Q`3CT60cCJ0ƿgL) :j/A:`@LS)olz` -TD}TcPYbVvC\z!! ImageMagickgamma=0.454545, ,(((888FFFVVVeeewwwI8ͻ`(`PEj@p,tmx|.I@p cr(Kg9J)uzlRjjzV|4OQȩ[0XD0Iv wo wmk j mmlkjø̷kqjG A     '^}͋A K^p*|{H10~.%p&4X P8 Ix TQC%-VQO_F* T&0  MQ1';@䡳dm~ ,%yA^l5L ;V܌oaNe˞)\i n'зSUȦP͛c}GVpÍ?l:\ FS ^ P[;OԤBo?I~`U(^kd;L^Hbq#:݄'!VzwN4f @Mԫ*8pe@}밿bl<77k2ଶ 6+Lۖ-! Yr+l`6A d6HXݖio"¡2\)sVcp /^> RS" h6oy06L+V-rwD#ta3c kl4G  : Qt0l SV`<$r0I|ߝ0|}72ljv`@k"\њ+Y2nZgmM7O˺>삸g Xy@3Uƭ ~q} >LjLORl!T^wjKIO5~[ 4th j( K +:I}<׸m =ٰ8CAC}@Ʃ> ң._#E(=: OxV^0(ZI/^ɰ'xE$>$ t K>r!'0|{$ uXN &k Rx hH58 tb$ le@G.C 6 $TL):p' (iJdJS"ۮ ,5Ն֧$*V4E}T?ڢmp$vu֩ KXV֌t ꃓ5@ /'KAVP8h@,T  K% Bi#$AZd3q^AO&JUpmjUdҫO-BX9xMǃ%0 y5H{@ j $"6"\ 9VyMb3t2pF!! ImageMagickgamma=0.454545,,(((888FFFVVVdddwwwI8ͻ`(dihlp,5S \8K?0{š/WI:P/x XrFkఘʻ *wtyNFD|h2f)   ca    i ?|= > F 8@Dgn\?&gJ4M,@@@ (h)*]'yZ%+-ct L5ar:O#=K@p@K$axIT҈;#nXزbV. 5f5,p0/:‚;x!ޏ]mk4ժ_n]?s tp@-I# l52YK9|R;g@:n̍5/R;l7_!p D(GMGHIۅբrh[lbbn(Ao15u @(rHWS%PUcAt8Eҙd[?P$$˕@I&KV)0# h%-4L'g֕g x .= 0rNޫh]s׌h;ii54U@-G6KVnS+Gj7GH7:[8e%qtdЪkG;~]=Hs@ ]+l_ A~'Q^a#[lt MҴ\sbn(*"s+"r4hc'J%ݎQulhU<=@Ԣz ؈THU>dd}(pMZ^yIJdh>'A'/AfwGXnYڔD[.1I_t8H2Vꢦ0bz"n(*Uv`LJp/'J2'Ak 8]cNkEGVl M  Ԁ#LYA겋AJY˺Q GIfi pT6\oLPǢawO: j8Vv1+yȦl߻ KA4IJާ](,1P6#2wii@8%=癰(<Y{0t: JzCt՞gEQG4bT2!h AB8 ?PD ?h* .ABg\Bg:|-[JBdTxB0 1p/C =5#8L^FWHA Шhr"̚IKs3*$KlT-Kh>JkLbpv Ц65mqT=P^<h@ 5>P*~Z\@?@UzVi_+[d+f#\u :CIMlUQ*8Øt"!! ImageMagickgamma=0.454545, ,(((888FFFVVVeeewwwI8ͻ`(dEZj*p,tmx<(A`V$Ѣ(M}R15zڭK08j|p^V LB}LF%TD'#G! s   tt sƹrǼξxs J pI r DuJ8@``N7! >Px"v(WETj 4H@a&iŪE:ѠFUZtӦP>UY09p,)[vb[ʑnf 8n w0s]H `HI)VjsZ#Z7p cr7|$.SW}_~r=6#Wl`Y]0D58{nݗ/x.cVnN$+bWxf&yW,Rv?Z(Rb`4"`w@ j `t1m)@|4ōz3*D/|['E"YEFZp+٬u|-'@2:~HPФ'.K^H-bP أ!m8hF91L, 'Ӑ!?MSXp @NE|;&3IbғG9>P =ie(`9b5Qy,E p 8~|lIOɔ pRф&Ne&i;@b` 6Ch( vFHL:LLpfIЇ&AI"}LhL| ඳ$Q=yq8qfa&0BZ.ZAǘ!E  sS"K  5JI]0P^K)GpCB:Ʃ]STXOUx`DYzrFfŏ&¸1{88լ3K"M jA8U (Wf!! ImageMagickgamma=0.454545,,(((999FFFVVVdddwwwI8ͻ`(dEAk)tmx|$0+㐒('I.WcvZاx frTM%|N~f"|2LH2 Ez&  w us r utñĹȻʽϿs׫  r GB P N  0 F}WB HwC(a8Ȑ9Lw`4H@'ф9ۙgf=.OhG ETPW@NxN- 0$83@`ܟnƖ}I߁gqQⅨwf%HLAp$|7–0v,|,d+ lp-vRMqKe)߾>\xV߀́A?#jR[a!9ɇSP>ב̿^~1ĀG)tNDYE,/բsqfTn#V܉%q"/"1ڂr8lu,XAwby0$UJY7!$wBP aC$!yfBYԠ@Br_ 2"*ZJ#8 \9ZÎ0x>L cG $2=_5ºM/@79Vܺ`&,5밲LR׎B;7֒h gr"{B,Vy*Wgz kzIP4)ZP /Ц\Kr$kl2|( 1r>S <=37A 4L/ǚG` l9q2v@* &)t,7u+|w jĀg@*F y5fci(nNU΍o.w]neKA-ny+Gԥ?~:gzu +9 K7 Ooc}MovJp96l c@Aftbc?xGp#]lhṚ |Ɔ@jK*ѕ VV:Ms)'D+¼n. g>{8܀ !)#DW:_0ADz@x@D) U0cH SC/DAmjZ6lB+AQ:Sl=Bn/!"eH-0P xX1q@iܗ`, N`S 0P铡\װ3.!I xra>2m<|t'A9^~Gd vp K<@%zT3v@ZB~qLd:Nӝ" 9zyO~sgQɂ h-lje.3_A>ʓC*䀈β`P0H0 %dP GbR#PF).mʚA r*M@04})?(Y2Ub^WVv }`vp֨+׾^ `A 0s@R;!! ImageMagickgamma=0.454545, 4(((999?@?@@???@@?@FFFOPOOPPWWW`_`gggopowww+B=QBV-H>?M@R}ֵʼȼִ̳Ԟٌ&`dBdBZ%gZ0+z^b﻽ 8 F))(u ""  %3%vxQQ 3 3. B!  -3 b  1B  B 03"03- !Y- ! ul{ x矿F),#PA4MA СDɒ#BBrm4FDPˋĸ aڴ3ӏ? 2F"Z(& ^h-'J1hyc03pB Z8@N[  hЂÀ`P}Lp_"8qߪZ|(aUa-4 2(h@!1Z -YBt2cͅLJ.8c~γW0~#K,3d{kν6?> @Q!0Ta"do!?YЁ tЀ|PYg * 1I eiY, 5Ȱ2C 0$`Y8P@ 7 B4 *F23 B p|&,jCBX~1 `+b1 H3LgUp$1.X%TtgY!2ZS DApQuIZLjP<&.00 @w$Á !p1†Ŋ8А8ĒMǏs97^cÙ&q^d%E0 F+^:"p(4|nZO{Qh!{ 7Ю;Oi1Ko 2p+ @AykPi}-% F\=u`D;acEJ4p<)J (,  y(Dpȅ% * bhI+`?R@b!*HbT$_a<B,{s]ۅz2~~x֑1rf9qwGϳHQ{$_P ( 6)I։ :M0h_NJP< Y JK Qʫe/eK`e)KdȄ1{Ke3ͤ+Opɯ5x@kP=(}PWzy7(Xyhyy yy#yW 02X|@ 4 @ pQ` 4P!y G 4X"ydq PXRy3 ЃD@pM(y(y^Sy [x,Xy5x9fy?83XxHz4`-5p!X%\ȅ G/ 5@755Q Ѐ/@0: UoyXH6舐(,Hڸ(X:Ph"8H(˜ i؄GyDЁ :X=Dy5HH/ x|ؑwHY!x} ȂIyxg84?P g2IȊ hx'Gw\ٕ^Y}I5{.Ǔ8¨Iy Psxؓs)soYnl y4T9u)di_9Yɷh5=5O97h 0yy' 5TyM8ך{ٙh҉{G%yXD CPȎyiH"8y}Pi7AX*-ȉ  5`ى98Q@`Qh8nxn gYm'JK)z `zHJɁФ(T WYjPꁟɤ7J:d9yxgژNQYr:ѹF yKHIjI)Y*\*ڨ:ZzYyh[p(&h7z.(Xzz ꪰځɫšJZHqʕyy*7-XJzwZGJ*z*׬odəkZ?ȅ*ʯ{*[;ਰy ۰;ʰ۱\xy Kx=)jyeȅ( YZ3pX`2yY]HjFmIDjʳ4Xڲz ڳlj?3}_! 4KyHCey!QZI: z ۷{˅{{~[+ "ۑ$yxL} y3dE)戧qۘo'P8}+q;2@yI׻ Gۻ;}!BkǺ똡 WP3Ø-9GXH<K ;˿ +kK{Ⱥ3Ф8yysPXsɠg$ !刀+\ y(•Oy- y/ ǹ9l;>RW7'lyH  3|mH'X ^؃g *G |m \l|ǀqs+ۨƙg0yذT;j0|1`  6ےۼRྈiު<||ו'Xjx .X靎&ȉ@8zzΎ&Hl/OQnܕy8Im.yc.ym!kJp)qϝUؽQSOa5@"` =ya٠V)yGyA2:ߧ@ C*$<0ЈX=h=/D^ כc] x'8_]yxO"hNJ"xi8y_\-&ҟpHb,iyɈ)@d bQh%9=ߔ' yB%ϕ_G~@0@Ec``T.JD5 &*C(Ze"`f%9U\;P>~I*@1Qq2rNfA2Ssӓ1eET36VvVwwA#xiXy92;;*!, ,(((777FFFVVVeeewwwI8ͻ`(diS+1p,tmxL'!#<+DRNvrҦS*`7.Lcp_}"}IB'WP' @~F    Eww t v½Ŷǹиsݵ޻y 飥 t Fd DW sk ]Js(QDkPp"x&lHP@c$p9%e6բr uժXRzkVM3YE=ԤY'@)$Q8LEwCS=xw X lʇ7` S \}`2☦5 @.ݏCxkfPNY^A Xמwm>]W^SSط./ [rV+ʸ xǣPf gqIFA0@QxŃFؙNy]@%{Ap=\!a,-M-awޑBV$wD"=YUQ htm=z $-"1a;d(a0fɹhi*{ ZG{pN`?pYA1-6yC>YOXrRꐪJ:Vg >SJL`PVp> f£U0mJFK=~ !䮫b)Ol ?7u   0"*LbFBٱr$RVY܁+O0ZT.0 3"O:/,s47B}$-A۳M3R<@"<@LrBM5F=JlO7Mdw.PA/Kh:rr%o,̱{6fLݵAp'OwȄ- >l术RݲTLZ鹓z=j`:K9 K'Zp~䀊8Ȅ~7^+w*rρmN ܨ] @)*`@&@h9p2 ؠ:sv&i 8#n@Z›"V4 `C7G4"ށaB>Y0R@eޯI(?fbkU0#Ϙ9, `Qxh!-Ra=$P`B ꙧL+K<(R|Yxm\$J(]w &SŸ#0(F Įɔ1騌 3D!1)RS\ 6#24@Y ?N@R}׌ܑطѽʼȼ̴ִվڝ**ACDCDŚʦ̮ǟþسᵴ仳ޫC=.HaC.LŁ /Ɗ-z Ǎ'tP`ɏ/St)bL7ODYē#qO!FY 4eҞOU.58TѫXjʵׯ`V"ӲhӪ]˶۷2ɞS :wo^ 3phUgmR& |޺f%E ز–{S.cϨ;o$Py9֨"z FWKͧSR؋7͜Co븓tIɃ)rqտK[(nzǸ=՞k5 Vqz`x%_fiG{Z_~'] V7y\~!݆x% c|2Xz@X D l-0IF/d9ggE+9㘝rgɠb&y|B7 i(fF]烼 zkh:]'z{~jݩf}>z'r:q:)vt6f :⎭Xj_`v:lg*K$ô 'pB &f'~:Lc#01{q(44+p"\G/-pNKLZSH/tb;_ovb+7 { x5h򾥒w+ob]^o+5{?nx㔧Jg L5ph>7蠰)tۃ3&7<. 4 .0 . u;< =(zw{s^v;x{oɟ9yy F p-9P%o&H Z̠7=6GBx  @A>6 @@B  ;؁b/]D*P T Рa'EMvp t1@|Fy 7 B0O?8#y> 9ؒ@ lnx$m]`WN?>Gl'=|)+J b#) J Q$̥ LD@X @L 8`I KI#X0@@%O 0<@#p@p4j@` Dx`p&wMgRb>3g"yq 4@@ZRl,RՔ0LSٽr9N(=q*PlM\1$V5\0IblByòzq i8([A#\*`n-%*QY}JXz-A(BƎbT< *(gX( Ha,/im 6$Pb @p^x!B`)`@Yt Fz"Eq  vt'@̚[`x@ab .;u{l`{1+)azZ\yE[L9>a3 ພNl))8 !wa^KLujj{(URY pW%Үb cź }@7 ={C`?8xC x- F2Pk&Q Mi;Cq^;SS$ 8JDI D `@:YVWu Xknӳ:uNsG=`w.uW;Ս{=o?o}NW~ru'vi7uadg~~Zfxdf+P@rVd@ 4.Ubf&c"AwZHguV+W|(fe+Xe[ff-xZ,e+oxs3#Vsddd,t>V^g589hJ;8p?V74t(u7wdXw3xww@@z,'x>^"rE^v9聃Zvd3MjDzfpWGgf:ikfRj[GMe;@B?P P| 0vjfL.&87}gP3Az@VCHZJL؇ePd[^Ȃ7d@\׀,xFv~KMXʈRGȃ=(ZXsDhbfeYX|xtK6=drB@rtV/@R.5H?cҐgE}*hY@)+I7q37.pE= 7ه,710ȏ-W')-G!Yfe5)Y映X}\G5dfXyɡ G Z *J}' "xJi:3w:3ЇG٥_ LE5{x11"ʘ PffޖCPCfPvP6FF| Pq8OFz!P*p4 0% xY("*18YJԧ5ڢJJJz3.C;G2PȚEjzh]CjE4犳:JȰ!۲)KEꚲz,ʯ K:Tk˵(W-K[[1۰`+8d; ,+jl+Q) > kQ;+,kV) [[HKh[˹[;ۺ930 xI{+; [Ht6kΛkF&]:C/˻jϻۭ۾⋺뾞 ;뻻̻gқK[|G <\ MZy #L‡[\#"*,.02<4\6|8:<;>@B#0 C p7KM) 5  lk`գ]ڧ݋@BpA0١M̝mӤM]A 9=]˼؍Ԑ-"M}؝ }'L=sE P7#p=; D0MCDD_@Ym] p]]n;Dj@.0. ^Ҋ}'0̤}=u}D >7FP<h- MZYDmt-üc>Y(UlC ?Axz.3\~l*0*%0q|V@-AߏN,x.:N;>sYnD9my叞>劾}^^%c^lkm.*  ্ժ>͈׳n~Nݽ$n>=.߫]DN6^K}bNB>.ʬɍB tF ONO9mÌ^^| 68OQ] ,^<YMEa>mPD=̍ѤNoI[/Z]=X_BO9z\NRN~,7R.mՐ ֎ >̛o>B0ĭn @ (`D|--9Լ?ȍ0_|Ŝ)p|,̋l]Cp}_ 8HXhx)9IYiy *:JZjz [@[[+ ,KP\< [kl) 80}M@-^Hm.~~^n.N#8_xtw 8} qi)ѐG,5+;$u/sSmH@Z B8`5 `P!zzbuJlس(Y[X_e֮Soݦ-w۶j5\lຈG62YHA*2(3f(#!f!tN N!Y&Q !S/JAdvs۞][Q6}jy7g7ZHrJl"AVwF)huHA)| BG'N菑 D^ #!@B@He]Ec5&cU2!vW("d%:uH06#6_C%x  4~X" gN^%JfH ;R%ߔ%|Tae.&u9ȝ@ w@ @A, K@@f"4@~ pG `8C0.:ȍ`:"1n(_"zW+k.+D싳X"#X ›`2 2D ܶpZPk/.|{ OW^SVC @y'e*x`Mc-' `8J֧R 꼗,| & *E#-MGB1r˥ a,M|Πב UqV8E/ؤNfhMB kH#.8}k<3`v!de,$"d 2 6F!dcSc]MLBxW5p?<aWмOM<|N;mWV}.y%l6A~T #CMɫ bA}F_N$_?:p _UAA#W h},s~W,I! !fPIR mWeIP9WLz;Zfb=xDӮHE0*Y]b1:kܻ$tA8`%(OQGHCe9'0폩S$>gIl " %Z+d%;ySt٤*9:hRr4&v21`}̒B܏R9xk83&!S6%ʄ(,a$<3yԢgv8k#ƮV8!|>tMmhw1J8SU:LJ9gCXС !Y3Y+G#p+u hzBˣ%D0`A:%dQ%X( ORA1g+c"7AumĦVLdeizgeYVpjȪ"ݕ6@ѮNl#NA[ 0` c79 &b5 ~\R݂ÍVnM֦YҒYv1ڄ@d0߽*,:"PEMlp(粍ACXnhEcwFr}v4zj!]D ZH|104]!JM+"~Di/.g9C-I<&XU C'Qp*~y`LLC,*T$ꪊWߖ)w^l\ݺם2Ov h  w j2A]{Il؀`R\W@gV͒lg,5Ν+v-=RDu$:Ъ"4! 8@LJ A1p- A<z @62Yb!CPcǨj$fL&KG( zYo\l:;=̳JmlW]8Gw_crd yuar FĂh[7!-|;| "v(?Q{{q"tSTWAmV H%o`GL%pX@9D~_JOHP z\V:D>u{7" z&-|=C7[ẃ^ $%D#~p@RlA ~"J~;o(Oԫ~o_~o~ /+oKԯk/Ϗo(Hh Ȁ (Hhȁ!(#H%h')+Ȃ-/1(3H5h79;ȃ=?A(CHEhGIKȄMOQ(SH0UhWY[ȅ]_a(cHehgikȆmoq(V!! ImageMagickgamma=0.454545,,(((777FFFVVVfffxxxI8ͻ`(didPʢp,tmx 6@A1d6%%9DiutvƭjN/bs+xGCWO!<"nD~( B}' v C {uxw v x¶vȻοֵ: z ߾v HE A vS@j2#!\C@{IQ\BVpe_e9(p}y{Iz蛀9p{2 &L詁=}AM"yOJ*&jSZ+tV^)CR_f*5 p[ 7jiS>-;䀵 ,rV<L[td<޹9bSZV.*aJ&7obq4@}5RD*$"z& Ycz bRv0"@H D1J 58<-M F_=,]mt87-Z@P-lW=0,]ֺ͓[P =6a{;}"J%2-Gx,O.y2 w"6Q>*sT~ +VMh~6<P}U@rA 3~A85|%_(vHXqCkIhx ޑF&K*O:3]U=ͷZK X쒻H{6J &Եe#yԭE 1v"{lVyZi@ @" `"@]:87a`'})d}tl5pa[#B @Vגe_̍,%*+ᏓGc#΁|G"sOdĠ +{_~+M3<{N˥SAɥ)]~q}w L*AT>6y*.4<UK␟lr;~Ǐ2!Aq fIp<@tp"uq`ޱ ӕ(PP`@A>gbD#pO;(B +-$vx-1( Y^sTP>9qMGEMъ<|(洰!UpA@}Cpc#D@4xG9±YK!FG[lVD8OhH!.k:Z@B&WI~X"`9KY>ѕA`9L@,)itG"@th(*]L%ILMټf(z',ʙyfj@gI͍J,^ÎY+q2~ҖFk[F%yv f`z@;LKQ  @DS<Z"(0b d@Ӣ̥R5cVX86P'p\}` ]mZ4q4ںž@ȫ {k `d "8tu׻z - ݕhWWQ<cl!! ImageMagickgamma=0.454545,<(((777GGGWWWhhhwwwlDMal&C;|6jӅlZhXesiп4@1BDv\JHk|0Pmэ%%ƽP/ѐ(ОSݵS7HMT"#`f`! eFBW^6߅X(Dh7v"B|TT}zFx97UD\cY BuQ%@/\cW"Q/Ih0I$X`pF"!$r=:>,Ʃ4TS5VFXـFGsև j&!m*'W7NU/)+xĂ=s|x7+ B4\z'~jj5ãUVD,fݨ Zk ) ʶ&P}c,w*/ 'K JGfX~bW 6lL㑧8[xCzݒ>{߯7;Ӿ9!/o'7G/Wogw/o觯/o JHL@ "|@ڳ`GH(g&, @D|@ `j/0LH"7|xo4rؽ0{T<.zz+@(&yP^ A3ύƃ pEyg$ߘGeqyw IB0a'  ^ G@` C3KKЎedW^%0eA< @qƒoN<2aGF % /ijZ2MMPpHGs@P3! 2`:Sy uw3 Q@6PཱིL 5=c&8̙͒(=^PӀyf <+ $ӊ 4x 5 HǠL@&Dr?&P'AՎGǤJiF`)\ER5&0%0!}LcOHugQ3"5l^yqN<`Q ̉N6!ͩoISJIEJ@NVx-M Q^fa~r O Tþ`fW<$;s@t+RF5@,| '8o4,1yH*ĮtѬ#CtHZ059+k:= H/}p~#_&(Nݗa,( D'υgdN0&3%05yTD.mO ށBC F1aA r}iQhhN7@hzP7[o!PM1cᑠDH7I5{Ӡv\Gᴛ#{aAXzծon[C p^qn! Ў6#\MZ& )n{ۧ npNwMz÷=ƛx轺NAi8* E<.͎k?Nr%W\gy-uc \isHcܸΡ.?WO:pF#d+m 48sU>@t;( H}t?w] FLHy{ܡ6@{WP-H>"<_g$o >[:I<=o[h0*}G`„@)K(@%՝cO~F<~ች@Wc:}#W?Y>lK2ҏx= d$a\[%0Oy5%`gxx'x w7 wxxO#zX (w><5B}6g e'XsgO $NP=gbT#ţL6sUh Yx[℅QVdH>U=hd }COxAJ0a<v^ ,&< ]D `HE(]xO9O5P pqY`bSvGCw]LDqFE9i}@L<MTSPLLH ="{6$EhAG8k`陵Xx/Iy),*ɚYhȈ.꒰9 8ڟӡ/ Oa k*ISmIS_:|] Me[;% kg;gO@$}vj~4<*v=cJNCاtVk odtbbΖoևγD  yDYiRiTIgOӉx"w49|2 yy)4jJ (2)r3ȣZgdY=IY /B نIbRKCkQc^ڏSH s3XG@W3cc$tԸ}8(AA BMX`* "TpCƅ.zM842FQBt'#%xp`@AB  x @8hmdݠZSgMjTU^lXc*:J=S'OD7$( MiOzVR<@`ޡ>Gx 7d 7R@_`p0` 8H`ƀ! ,olh  %U-؅xBjW$wD&9F*$HE!U` !K%tĄa=j+вӚzТ cn<nWCʛ 4~d|jg4~B(#@AN{ÜQ>j~ǪPFu)ǔ:ꁩP$@QӍ f 7TF-PfK=)?m&MiBJ,%y.o"b'0 ɽUJ䭻!q%|2hC/T/HtE zl:P.bLtp@=[)HM5K]JWMoE^0JK sMjK5%mNrJ'_hE)∯$C㌛8P~|E.},Pqf*ߚOC   F[_>|;>{I_T$b,nLy㕫oGy:!_<:1B`s(I{p@˘KKPǗv/e`'D0`%DACM*|` M@lZʽV7`f8X`fȭ|Kb>&"qP  ȇ" \ȟ`@f0:6.L#At#hccҨ!̣5v/(,R.P\xT01BEƨMCIQ҈;%y9dD`i E ! x$ՃR7bQ ܇Gi2uUPw< cRK05 iS3'6ǹ  &  1Io[ T!EBϲ[4tCD3щ>(u4Z£csD*ь6Ǣ Z?.uZ=N25oP /)Q:aTUNmթLSs&]`FGZU% -RFx+̧nk޺ A4lꄿ@w`l~ H@fkX`A[ ҚM-^+d=E [l!! ImageMagickgamma=0.454545, ,(((777FFFWWWeeevvvI8ͻ`(dihlp,Ϥ C0wK?y46;JLB!ru./\lU)v},uJ8+ |AR#9}D=&R ';-    w ºķƾʠ۽໷{1 A*Aʔ;~fX@:4ta…4~ࠁɒ 6tc#H +Lq={xd%jB )[&N]Ufz֮Ц:vkY̦Eص_zB,P5'@@)$4 lD8XgąBLR ,P.T?,! 6te(6ME'$( c=`w42{H, Ժ% wY߽wO~ߢg=σ'n<+V:- (0 2D>(>o!x+rX" @.2+ ;yW./{J6O:|QY1)S;}iu#Dcq $EAȝbaJqYp5_~CN8gg9UgN@hr 靃&&C.J@@p ^]NdU*J+z4*rNH^c ~r@^$” ;AR-S>`>Br! @G!r &,RvKA.8т|ۮKA,[RԀ w @|D 0#yZY$ /\+ɢ Y ƛv܂ À+ ZvิR%{ADKj]/AL븣c0dzD 7դ`k % !E,@GK~̐3&,y0cnyw95p ^I{A'_14IXl.! ֎;blK|KwL߭؇#$Ì"E }=SrONׯz yA20*jQ` ht"a{y@: JST T0*Ԇ PB&B:M(LŐK(eB`Ed*}.~_h%:QPld?..2!جpMQS#b) `MDi>XƴQ,-@ f0@@d F%/O(DRҔQD(%׿.EaH^Vq0c XKB'HEren&m< rI13ּL7Ld۬2ǹ̞c(0")]FkǬC fx#>EBqaз,tCm5$>4..Qtp' iE;J*"*Ptr !L*'@] /dJBħS<$fHTA'@ӤĀ(2ԣB|՝V (KmPq@@2p\J׸U0[KKžpa} XU(D$k=Lȋp̺z hGUB,2~6GslgKڶn_0"zk*Mmn:!! ImageMagickgamma=0.454545,,(((666FFFWWWdddwwwI8ͻ`(dihbA*tmx 6Ē NE0y M::2XT'z)jjZ~ccyK<B <)#?=D&p )G:C C  ~ Žǻρ > 哠A+$pD>SAr@+b I0 B2@GLRd"~m(9񟒖,'('H(=,@@@Jk98 9x`.촮g5[Mmڱoˮ-h+.]`u8>K8D3 Q0 Pp@Ϗ0*AbT=LOP<` Ewo=Qnۭi# 4$rk{G$$ڋ-ӷ;'Wq? ,0*G(M lGV(Q-dF!8[VX8a/*ec$4u (@,dNjQWq[bH&kS ,n8RB'1>0'ph(@ "zˢQ0D^dwnbF j2UjC. T10eH&IB9ǶlBleRk*&yKxK!i>*^%J@UW-{>{ [[+սI(>Ъp2|pK WLls,.P <7cYV>s;O{?^-IPI(RM@PBl/Kz"/%q <'u/Tԑ@qd;@ tWvfK-މ=rDx!CiA21.m4CKzϯ׾6tw@DEIe/Sf@\.U&$D,;fQ<> pVp}S=aO㲐O~o' 49@ g%$Bw̠*vy`]#t9Tؤ3Ig'eF3*>(IUGQIf"!:az(, D|41!.0C&A4x5/F5Vplc(Dz%iXu#8P[ATȡ=N z +JxCV|HylܲFGZKI(h` K(*>`g e7I#p3ؠBւ#; Ĥ1cꂃ`$T$Q49 .JQ*2lʀ IƇsLlD>!DW!LI9YMs&QkE࠘HܜpA40k*U,) @đ/@ʗ-Sdʟ34hӢQ>:uծcÞPsѷU?)Ar)&,a8b'5~ w~0uq<- ƭ &!;pqN0Q#Kq0U& Y9vWs={p-`~|#54@"P$'A9"f"Vl7H񨛏6:hd; XD W)v!8U)%^%,dZ٦HysVPN9x)uZ9B_b]4 X͂2f`p&`xt3(b:OEvG㪩jꐱ:kޚI@Ih8:T8kRhWȂl4jALl*JKz.pYL# &zR k@8-W8;X9ϒxGA8Lj QώX$bQTtsa N&~%yU"b$$I ֩I4,kZ jV5|YjP#*^t]ZռUD'4|V+7L6k^ʨlY˚Kcs`(,\޸/Yx=qo 0Q":hlЀGR\[NdWmYx~wA/Gt^HdT"/mr&  {R-6K`la+MYBW$ ] l`_sHx/Vr܂mI=a<-_059 _IHNW`d9DqGd;E1$f$ -CF3/$ss.xγgh e[AkMEF;"(2bd#~E,WN{ӠG}ԧ&WV0p7`MZָ^ YTNޘMj[ڍvb@[icPbsNnTMzx^0Y|g7gcyOY/ 'k-ݦ7Gk(6;N< ѶÍ0BLi ;8ϹiP'||@Goy|HOGp;PQ[}!2, &!!'0CD0'&,BBC0!!D,,>&'&B&߫0,0300ȋ>ࡄ>ЕGNHiÇ#’5kPEB4N2i/&ztN-9PѴ Jn,BtXʴ)ӛxl0׷!d$atPj5ls˷_F,.U:xiOF:nj0@PD 6VW x>e +:%'2D/Mc*_|ސ}z;:N#c#M!BWFet 9nC `\}q]:Hsfa+IY4E bؙUU&XrD,OÂ-C >(eaKW G\u/v鸛vDK.6">Z@ 4cx6lEidfaAf¡Q'?w%̦`*_b^FW7"'(D~8Dylx X/:eW4g.zpH4[*"@3 ^5d%&ZL' .klB4cjQAh>s0/*mG9߫-$8tHBWHbmٕ'kAjE&E r3۳(?3܌77&DU,ar;httpx-0.26.0/docs/index.md000066400000000000000000000077451454054354600153560ustar00rootroot00000000000000

HTTPX

HTTPX

---

Test Suite Package version

A next-generation HTTP client for Python.
HTTPX is a fully featured HTTP client for Python 3, which provides sync and async APIs, and support for both HTTP/1.1 and HTTP/2. --- Install HTTPX using pip: ```shell $ pip install httpx ``` Now, let's get started: ```pycon >>> import httpx >>> r = httpx.get('https://www.example.org/') >>> r >>> r.status_code 200 >>> r.headers['content-type'] 'text/html; charset=UTF-8' >>> r.text '\n\n\nExample Domain...' ``` Or, using the command-line client. ```shell # The command line client is an optional dependency. $ pip install 'httpx[cli]' ``` Which now allows us to use HTTPX directly from the command-line... ![httpx --help](img/httpx-help.png) Sending a request... ![httpx http://httpbin.org/json](img/httpx-request.png) ## Features HTTPX builds on the well-established usability of `requests`, and gives you: * A broadly [requests-compatible API](compatibility.md). * Standard synchronous interface, but with [async support if you need it](async.md). * HTTP/1.1 [and HTTP/2 support](http2.md). * Ability to make requests directly to [WSGI applications](advanced.md#calling-into-python-web-apps) or [ASGI applications](async.md#calling-into-python-web-apps). * Strict timeouts everywhere. * Fully type annotated. * 100% test coverage. Plus all the standard features of `requests`... * International Domains and URLs * Keep-Alive & Connection Pooling * Sessions with Cookie Persistence * Browser-style SSL Verification * Basic/Digest Authentication * Elegant Key/Value Cookies * Automatic Decompression * Automatic Content Decoding * Unicode Response Bodies * Multipart File Uploads * HTTP(S) Proxy Support * Connection Timeouts * Streaming Downloads * .netrc Support * Chunked Requests ## Documentation For a run-through of all the basics, head over to the [QuickStart](quickstart.md). For more advanced topics, see the [Advanced Usage](advanced.md) section, the [async support](async.md) section, or the [HTTP/2](http2.md) section. The [Developer Interface](api.md) provides a comprehensive API reference. To find out about tools that integrate with HTTPX, see [Third Party Packages](third_party_packages.md). ## Dependencies The HTTPX project relies on these excellent libraries: * `httpcore` - The underlying transport implementation for `httpx`. * `h11` - HTTP/1.1 support. * `certifi` - SSL certificates. * `idna` - Internationalized domain name support. * `sniffio` - Async library autodetection. As well as these optional installs: * `h2` - HTTP/2 support. *(Optional, with `httpx[http2]`)* * `socksio` - SOCKS proxy support. *(Optional, with `httpx[socks]`)* * `rich` - Rich terminal support. *(Optional, with `httpx[cli]`)* * `click` - Command line client support. *(Optional, with `httpx[cli]`)* * `brotli` or `brotlicffi` - Decoding for "brotli" compressed responses. *(Optional, with `httpx[brotli]`)* A huge amount of credit is due to `requests` for the API layout that much of this work follows, as well as to `urllib3` for plenty of design inspiration around the lower-level networking details. ## Installation Install with pip: ```shell $ pip install httpx ``` Or, to include the optional HTTP/2 support, use: ```shell $ pip install httpx[http2] ``` To include the optional brotli decoder support, use: ```shell $ pip install httpx[brotli] ``` HTTPX requires Python 3.8+ [sync-support]: https://github.com/encode/httpx/issues/572 httpx-0.26.0/docs/logging.md000066400000000000000000000101661454054354600156640ustar00rootroot00000000000000# Logging If you need to inspect the internal behaviour of `httpx`, you can use Python's standard logging to output information about the underlying network behaviour. For example, the following configuration... ```python import logging import httpx logging.basicConfig( format="%(levelname)s [%(asctime)s] %(name)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S", level=logging.DEBUG ) httpx.get("https://www.example.com") ``` Will send debug level output to the console, or wherever `stdout` is directed too... ``` DEBUG [2023-03-16 14:36:20] httpx - load_ssl_context verify=True cert=None trust_env=True http2=False DEBUG [2023-03-16 14:36:20] httpx - load_verify_locations cafile='/Users/tomchristie/GitHub/encode/httpx/venv/lib/python3.10/site-packages/certifi/cacert.pem' DEBUG [2023-03-16 14:36:20] httpcore - connection.connect_tcp.started host='www.example.com' port=443 local_address=None timeout=5.0 DEBUG [2023-03-16 14:36:20] httpcore - connection.connect_tcp.complete return_value= DEBUG [2023-03-16 14:36:20] httpcore - connection.start_tls.started ssl_context= server_hostname='www.example.com' timeout=5.0 DEBUG [2023-03-16 14:36:20] httpcore - connection.start_tls.complete return_value= DEBUG [2023-03-16 14:36:20] httpcore - http11.send_request_headers.started request= DEBUG [2023-03-16 14:36:20] httpcore - http11.send_request_headers.complete DEBUG [2023-03-16 14:36:20] httpcore - http11.send_request_body.started request= DEBUG [2023-03-16 14:36:20] httpcore - http11.send_request_body.complete DEBUG [2023-03-16 14:36:20] httpcore - http11.receive_response_headers.started request= DEBUG [2023-03-16 14:36:21] httpcore - http11.receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Encoding', b'gzip'), (b'Accept-Ranges', b'bytes'), (b'Age', b'507675'), (b'Cache-Control', b'max-age=604800'), (b'Content-Type', b'text/html; charset=UTF-8'), (b'Date', b'Thu, 16 Mar 2023 14:36:21 GMT'), (b'Etag', b'"3147526947+ident"'), (b'Expires', b'Thu, 23 Mar 2023 14:36:21 GMT'), (b'Last-Modified', b'Thu, 17 Oct 2019 07:18:26 GMT'), (b'Server', b'ECS (nyb/1D2E)'), (b'Vary', b'Accept-Encoding'), (b'X-Cache', b'HIT'), (b'Content-Length', b'648')]) INFO [2023-03-16 14:36:21] httpx - HTTP Request: GET https://www.example.com "HTTP/1.1 200 OK" DEBUG [2023-03-16 14:36:21] httpcore - http11.receive_response_body.started request= DEBUG [2023-03-16 14:36:21] httpcore - http11.receive_response_body.complete DEBUG [2023-03-16 14:36:21] httpcore - http11.response_closed.started DEBUG [2023-03-16 14:36:21] httpcore - http11.response_closed.complete DEBUG [2023-03-16 14:36:21] httpcore - connection.close.started DEBUG [2023-03-16 14:36:21] httpcore - connection.close.complete ``` Logging output includes information from both the high-level `httpx` logger, and the network-level `httpcore` logger, which can be configured separately. For handling more complex logging configurations you might want to use the dictionary configuration style... ```python import logging.config import httpx LOGGING_CONFIG = { "version": 1, "handlers": { "default": { "class": "logging.StreamHandler", "formatter": "http", "stream": "ext://sys.stderr" } }, "formatters": { "http": { "format": "%(levelname)s [%(asctime)s] %(name)s - %(message)s", "datefmt": "%Y-%m-%d %H:%M:%S", } }, 'loggers': { 'httpx': { 'handlers': ['default'], 'level': 'DEBUG', }, 'httpcore': { 'handlers': ['default'], 'level': 'DEBUG', }, } } logging.config.dictConfig(LOGGING_CONFIG) httpx.get('https://www.example.com') ``` The exact formatting of the debug logging may be subject to change across different versions of `httpx` and `httpcore`. If you need to rely on a particular format it is recommended that you pin installation of these packages to fixed versions.httpx-0.26.0/docs/quickstart.md000066400000000000000000000342131454054354600164270ustar00rootroot00000000000000# QuickStart First, start by importing HTTPX: ```pycon >>> import httpx ``` Now, let’s try to get a webpage. ```pycon >>> r = httpx.get('https://httpbin.org/get') >>> r ``` Similarly, to make an HTTP POST request: ```pycon >>> r = httpx.post('https://httpbin.org/post', data={'key': 'value'}) ``` The PUT, DELETE, HEAD, and OPTIONS requests all follow the same style: ```pycon >>> r = httpx.put('https://httpbin.org/put', data={'key': 'value'}) >>> r = httpx.delete('https://httpbin.org/delete') >>> r = httpx.head('https://httpbin.org/get') >>> r = httpx.options('https://httpbin.org/get') ``` ## Passing Parameters in URLs To include URL query parameters in the request, use the `params` keyword: ```pycon >>> params = {'key1': 'value1', 'key2': 'value2'} >>> r = httpx.get('https://httpbin.org/get', params=params) ``` To see how the values get encoding into the URL string, we can inspect the resulting URL that was used to make the request: ```pycon >>> r.url URL('https://httpbin.org/get?key2=value2&key1=value1') ``` You can also pass a list of items as a value: ```pycon >>> params = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = httpx.get('https://httpbin.org/get', params=params) >>> r.url URL('https://httpbin.org/get?key1=value1&key2=value2&key2=value3') ``` ## Response Content HTTPX will automatically handle decoding the response content into Unicode text. ```pycon >>> r = httpx.get('https://www.example.org/') >>> r.text '\n\n\nExample Domain...' ``` You can inspect what encoding will be used to decode the response. ```pycon >>> r.encoding 'UTF-8' ``` In some cases the response may not contain an explicit encoding, in which case HTTPX will attempt to automatically determine an encoding to use. ```pycon >>> r.encoding None >>> r.text '\n\n\nExample Domain...' ``` If you need to override the standard behaviour and explicitly set the encoding to use, then you can do that too. ```pycon >>> r.encoding = 'ISO-8859-1' ``` ## Binary Response Content The response content can also be accessed as bytes, for non-text responses: ```pycon >>> r.content b'\n\n\nExample Domain...' ``` Any `gzip` and `deflate` HTTP response encodings will automatically be decoded for you. If `brotlipy` is installed, then the `brotli` response encoding will also be supported. For example, to create an image from binary data returned by a request, you can use the following code: ```pycon >>> from PIL import Image >>> from io import BytesIO >>> i = Image.open(BytesIO(r.content)) ``` ## JSON Response Content Often Web API responses will be encoded as JSON. ```pycon >>> r = httpx.get('https://api.github.com/events') >>> r.json() [{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...' ... }}] ``` ## Custom Headers To include additional headers in the outgoing request, use the `headers` keyword argument: ```pycon >>> url = 'https://httpbin.org/headers' >>> headers = {'user-agent': 'my-app/0.0.1'} >>> r = httpx.get(url, headers=headers) ``` ## Sending Form Encoded Data Some types of HTTP requests, such as `POST` and `PUT` requests, can include data in the request body. One common way of including that is as form-encoded data, which is used for HTML forms. ```pycon >>> data = {'key1': 'value1', 'key2': 'value2'} >>> r = httpx.post("https://httpbin.org/post", data=data) >>> print(r.text) { ... "form": { "key2": "value2", "key1": "value1" }, ... } ``` Form encoded data can also include multiple values from a given key. ```pycon >>> data = {'key1': ['value1', 'value2']} >>> r = httpx.post("https://httpbin.org/post", data=data) >>> print(r.text) { ... "form": { "key1": [ "value1", "value2" ] }, ... } ``` ## Sending Multipart File Uploads You can also upload files, using HTTP multipart encoding: ```pycon >>> files = {'upload-file': open('report.xls', 'rb')} >>> r = httpx.post("https://httpbin.org/post", files=files) >>> print(r.text) { ... "files": { "upload-file": "<... binary content ...>" }, ... } ``` You can also explicitly set the filename and content type, by using a tuple of items for the file value: ```pycon >>> files = {'upload-file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel')} >>> r = httpx.post("https://httpbin.org/post", files=files) >>> print(r.text) { ... "files": { "upload-file": "<... binary content ...>" }, ... } ``` If you need to include non-file data fields in the multipart form, use the `data=...` parameter: ```pycon >>> data = {'message': 'Hello, world!'} >>> files = {'file': open('report.xls', 'rb')} >>> r = httpx.post("https://httpbin.org/post", data=data, files=files) >>> print(r.text) { ... "files": { "file": "<... binary content ...>" }, "form": { "message": "Hello, world!", }, ... } ``` ## Sending JSON Encoded Data Form encoded data is okay if all you need is a simple key-value data structure. For more complicated data structures you'll often want to use JSON encoding instead. ```pycon >>> data = {'integer': 123, 'boolean': True, 'list': ['a', 'b', 'c']} >>> r = httpx.post("https://httpbin.org/post", json=data) >>> print(r.text) { ... "json": { "boolean": true, "integer": 123, "list": [ "a", "b", "c" ] }, ... } ``` ## Sending Binary Request Data For other encodings, you should use the `content=...` parameter, passing either a `bytes` type or a generator that yields `bytes`. ```pycon >>> content = b'Hello, world' >>> r = httpx.post("https://httpbin.org/post", content=content) ``` You may also want to set a custom `Content-Type` header when uploading binary data. ## Response Status Codes We can inspect the HTTP status code of the response: ```pycon >>> r = httpx.get('https://httpbin.org/get') >>> r.status_code 200 ``` HTTPX also includes an easy shortcut for accessing status codes by their text phrase. ```pycon >>> r.status_code == httpx.codes.OK True ``` We can raise an exception for any responses which are not a 2xx success code: ```pycon >>> not_found = httpx.get('https://httpbin.org/status/404') >>> not_found.status_code 404 >>> not_found.raise_for_status() Traceback (most recent call last): File "/Users/tomchristie/GitHub/encode/httpcore/httpx/models.py", line 837, in raise_for_status raise HTTPStatusError(message, response=self) httpx._exceptions.HTTPStatusError: 404 Client Error: Not Found for url: https://httpbin.org/status/404 For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404 ``` Any successful response codes will return the `Response` instance rather than raising an exception. ```pycon >>> r.raise_for_status() ``` The method returns the response instance, allowing you to use it inline. For example: ```pycon >>> r = httpx.get('...').raise_for_status() >>> data = httpx.get('...').raise_for_status().json() ``` ## Response Headers The response headers are available as a dictionary-like interface. ```pycon >>> r.headers Headers({ 'content-encoding': 'gzip', 'transfer-encoding': 'chunked', 'connection': 'close', 'server': 'nginx/1.0.4', 'x-runtime': '148ms', 'etag': '"e1ca502697e5c9317743dc078f67693f"', 'content-type': 'application/json' }) ``` The `Headers` data type is case-insensitive, so you can use any capitalization. ```pycon >>> r.headers['Content-Type'] 'application/json' >>> r.headers.get('content-type') 'application/json' ``` Multiple values for a single response header are represented as a single comma-separated value, as per [RFC 7230](https://tools.ietf.org/html/rfc7230#section-3.2): > A recipient MAY combine multiple header fields with the same field name into one “field-name: field-value” pair, without changing the semantics of the message, by appending each subsequent field-value to the combined field value in order, separated by a comma. ## Streaming Responses For large downloads you may want to use streaming responses that do not load the entire response body into memory at once. You can stream the binary content of the response... ```pycon >>> with httpx.stream("GET", "https://www.example.com") as r: ... for data in r.iter_bytes(): ... print(data) ``` Or the text of the response... ```pycon >>> with httpx.stream("GET", "https://www.example.com") as r: ... for text in r.iter_text(): ... print(text) ``` Or stream the text, on a line-by-line basis... ```pycon >>> with httpx.stream("GET", "https://www.example.com") as r: ... for line in r.iter_lines(): ... print(line) ``` HTTPX will use universal line endings, normalising all cases to `\n`. In some cases you might want to access the raw bytes on the response without applying any HTTP content decoding. In this case any content encoding that the web server has applied such as `gzip`, `deflate`, or `brotli` will not be automatically decoded. ```pycon >>> with httpx.stream("GET", "https://www.example.com") as r: ... for chunk in r.iter_raw(): ... print(chunk) ``` If you're using streaming responses in any of these ways then the `response.content` and `response.text` attributes will not be available, and will raise errors if accessed. However you can also use the response streaming functionality to conditionally load the response body: ```pycon >>> with httpx.stream("GET", "https://www.example.com") as r: ... if int(r.headers['Content-Length']) < TOO_LONG: ... r.read() ... print(r.text) ``` ## Cookies Any cookies that are set on the response can be easily accessed: ```pycon >>> r = httpx.get('https://httpbin.org/cookies/set?chocolate=chip') >>> r.cookies['chocolate'] 'chip' ``` To include cookies in an outgoing request, use the `cookies` parameter: ```pycon >>> cookies = {"peanut": "butter"} >>> r = httpx.get('https://httpbin.org/cookies', cookies=cookies) >>> r.json() {'cookies': {'peanut': 'butter'}} ``` Cookies are returned in a `Cookies` instance, which is a dict-like data structure with additional API for accessing cookies by their domain or path. ```pycon >>> cookies = httpx.Cookies() >>> cookies.set('cookie_on_domain', 'hello, there!', domain='httpbin.org') >>> cookies.set('cookie_off_domain', 'nope.', domain='example.org') >>> r = httpx.get('http://httpbin.org/cookies', cookies=cookies) >>> r.json() {'cookies': {'cookie_on_domain': 'hello, there!'}} ``` ## Redirection and History By default, HTTPX will **not** follow redirects for all HTTP methods, although this can be explicitly enabled. For example, GitHub redirects all HTTP requests to HTTPS. ```pycon >>> r = httpx.get('http://github.com/') >>> r.status_code 301 >>> r.history [] >>> r.next_request ``` You can modify the default redirection handling with the `follow_redirects` parameter: ```pycon >>> r = httpx.get('http://github.com/', follow_redirects=True) >>> r.url URL('https://github.com/') >>> r.status_code 200 >>> r.history [] ``` The `history` property of the response can be used to inspect any followed redirects. It contains a list of any redirect responses that were followed, in the order in which they were made. ## Timeouts HTTPX defaults to including reasonable timeouts for all network operations, meaning that if a connection is not properly established then it should always raise an error rather than hanging indefinitely. The default timeout for network inactivity is five seconds. You can modify the value to be more or less strict: ```pycon >>> httpx.get('https://github.com/', timeout=0.001) ``` You can also disable the timeout behavior completely... ```pycon >>> httpx.get('https://github.com/', timeout=None) ``` For advanced timeout management, see [Timeout fine-tuning](advanced.md#fine-tuning-the-configuration). ## Authentication HTTPX supports Basic and Digest HTTP authentication. To provide Basic authentication credentials, pass a 2-tuple of plaintext `str` or `bytes` objects as the `auth` argument to the request functions: ```pycon >>> httpx.get("https://example.com", auth=("my_user", "password123")) ``` To provide credentials for Digest authentication you'll need to instantiate a `DigestAuth` object with the plaintext username and password as arguments. This object can be then passed as the `auth` argument to the request methods as above: ```pycon >>> auth = httpx.DigestAuth("my_user", "password123") >>> httpx.get("https://example.com", auth=auth) ``` ## Exceptions HTTPX will raise exceptions if an error occurs. The most important exception classes in HTTPX are `RequestError` and `HTTPStatusError`. The `RequestError` class is a superclass that encompasses any exception that occurs while issuing an HTTP request. These exceptions include a `.request` attribute. ```python try: response = httpx.get("https://www.example.com/") except httpx.RequestError as exc: print(f"An error occurred while requesting {exc.request.url!r}.") ``` The `HTTPStatusError` class is raised by `response.raise_for_status()` on responses which are not a 2xx success code. These exceptions include both a `.request` and a `.response` attribute. ```python response = httpx.get("https://www.example.com/") try: response.raise_for_status() except httpx.HTTPStatusError as exc: print(f"Error response {exc.response.status_code} while requesting {exc.request.url!r}.") ``` There is also a base class `HTTPError` that includes both of these categories, and can be used to catch either failed requests, or 4xx and 5xx responses. You can either use this base class to catch both categories... ```python try: response = httpx.get("https://www.example.com/") response.raise_for_status() except httpx.HTTPError as exc: print(f"Error while requesting {exc.request.url!r}.") ``` Or handle each case explicitly... ```python try: response = httpx.get("https://www.example.com/") response.raise_for_status() except httpx.RequestError as exc: print(f"An error occurred while requesting {exc.request.url!r}.") except httpx.HTTPStatusError as exc: print(f"Error response {exc.response.status_code} while requesting {exc.request.url!r}.") ``` For a full list of available exceptions, see [Exceptions (API Reference)](exceptions.md). httpx-0.26.0/docs/third_party_packages.md000066400000000000000000000052451454054354600204270ustar00rootroot00000000000000# Third Party Packages As HTTPX usage grows, there is an expanding community of developers building tools and libraries that integrate with HTTPX, or depend on HTTPX. Here are some of them. ## Plugins ### Hishel [GitHub](https://github.com/karpetrosyan/hishel) - [Documentation](https://hishel.com/) An elegant HTTP Cache implementation for HTTPX and HTTP Core. ### Authlib [GitHub](https://github.com/lepture/authlib) - [Documentation](https://docs.authlib.org/en/latest/) The ultimate Python library in building OAuth and OpenID Connect clients and servers. Includes an [OAuth HTTPX client](https://docs.authlib.org/en/latest/client/httpx.html). ### Gidgethub [GitHub](https://github.com/brettcannon/gidgethub) - [Documentation](https://gidgethub.readthedocs.io/en/latest/index.html) An asynchronous GitHub API library. Includes [HTTPX support](https://gidgethub.readthedocs.io/en/latest/httpx.html). ### HTTPX-Auth [GitHub](https://github.com/Colin-b/httpx_auth) - [Documentation](https://colin-b.github.io/httpx_auth/) Provides authentication classes to be used with HTTPX [authentication parameter](advanced.md#customizing-authentication). ### pytest-HTTPX [GitHub](https://github.com/Colin-b/pytest_httpx) - [Documentation](https://colin-b.github.io/pytest_httpx/) Provides `httpx_mock` [pytest](https://docs.pytest.org/en/latest/) fixture to mock HTTPX within test cases. ### RESPX [GitHub](https://github.com/lundberg/respx) - [Documentation](https://lundberg.github.io/respx/) A utility for mocking out the Python HTTPX library. ### rpc.py [Github](https://github.com/abersheeran/rpc.py) - [Documentation](https://github.com/abersheeran/rpc.py#rpcpy) An fast and powerful RPC framework based on ASGI/WSGI. Use HTTPX as the client of the RPC service. ### VCR.py [GitHub](https://github.com/kevin1024/vcrpy) - [Documentation](https://vcrpy.readthedocs.io/) A utility for record and repeat an http request. ### httpx-caching [Github](https://github.com/johtso/httpx-caching) This package adds caching functionality to HTTPX ### httpx-sse [GitHub](https://github.com/florimondmanca/httpx-sse) Allows consuming Server-Sent Events (SSE) with HTTPX. ### robox [Github](https://github.com/danclaudiupop/robox) A library for scraping the web built on top of HTTPX. ## Gists ### urllib3-transport [GitHub](https://gist.github.com/florimondmanca/d56764d78d748eb9f73165da388e546e) This public gist provides an example implementation for a [custom transport](advanced.md#custom-transports) implementation on top of the battle-tested [`urllib3`](https://urllib3.readthedocs.io) library. httpx-0.26.0/docs/troubleshooting.md000066400000000000000000000041211454054354600174570ustar00rootroot00000000000000# Troubleshooting This page lists some common problems or issues you could encounter while developing with HTTPX, as well as possible solutions. ## Proxies --- ### "`The handshake operation timed out`" on HTTPS requests when using a proxy **Description**: When using a proxy and making an HTTPS request, you see an exception looking like this: ```console httpx.ProxyError: _ssl.c:1091: The handshake operation timed out ``` **Similar issues**: [encode/httpx#1412](https://github.com/encode/httpx/issues/1412), [encode/httpx#1433](https://github.com/encode/httpx/issues/1433) **Resolution**: it is likely that you've set up your proxies like this... ```python mounts = { "http://": httpx.HTTPTransport(proxy="http://myproxy.org"), "https://": httpx.HTTPTransport(proxy="https://myproxy.org"), } ``` Using this setup, you're telling HTTPX to connect to the proxy using HTTP for HTTP requests, and using HTTPS for HTTPS requests. But if you get the error above, it is likely that your proxy doesn't support connecting via HTTPS. Don't worry: that's a [common gotcha](advanced.md#example). Change the scheme of your HTTPS proxy to `http://...` instead of `https://...`: ```python mounts = { "http://": httpx.HTTPTransport(proxy="http://myproxy.org"), "https://": httpx.HTTPTransport(proxy="http://myproxy.org"), } ``` This can be simplified to: ```python proxy = "http://myproxy.org" with httpx.Client(proxy=proxy) as client: ... ``` For more information, see [Proxies: FORWARD vs TUNNEL](advanced.md#forward-vs-tunnel). --- ### Error when making requests to an HTTPS proxy **Description**: your proxy _does_ support connecting via HTTPS, but you are seeing errors along the lines of... ```console httpx.ProxyError: [SSL: PRE_MAC_LENGTH_TOO_LONG] invalid alert (_ssl.c:1091) ``` **Similar issues**: [encode/httpx#1424](https://github.com/encode/httpx/issues/1424). **Resolution**: HTTPX does not properly support HTTPS proxies at this time. If that's something you're interested in having, please see [encode/httpx#1434](https://github.com/encode/httpx/issues/1434) and consider lending a hand there. httpx-0.26.0/httpx/000077500000000000000000000000001454054354600141275ustar00rootroot00000000000000httpx-0.26.0/httpx/__init__.py000066400000000000000000000062121454054354600162410ustar00rootroot00000000000000from .__version__ import __description__, __title__, __version__ from ._api import delete, get, head, options, patch, post, put, request, stream from ._auth import Auth, BasicAuth, DigestAuth, NetRCAuth from ._client import USE_CLIENT_DEFAULT, AsyncClient, Client from ._config import Limits, Proxy, Timeout, create_ssl_context from ._content import ByteStream from ._exceptions import ( CloseError, ConnectError, ConnectTimeout, CookieConflict, DecodingError, HTTPError, HTTPStatusError, InvalidURL, LocalProtocolError, NetworkError, PoolTimeout, ProtocolError, ProxyError, ReadError, ReadTimeout, RemoteProtocolError, RequestError, RequestNotRead, ResponseNotRead, StreamClosed, StreamConsumed, StreamError, TimeoutException, TooManyRedirects, TransportError, UnsupportedProtocol, WriteError, WriteTimeout, ) from ._models import Cookies, Headers, Request, Response from ._status_codes import codes from ._transports.asgi import ASGITransport from ._transports.base import AsyncBaseTransport, BaseTransport from ._transports.default import AsyncHTTPTransport, HTTPTransport from ._transports.mock import MockTransport from ._transports.wsgi import WSGITransport from ._types import AsyncByteStream, SyncByteStream from ._urls import URL, QueryParams try: from ._main import main except ImportError: # pragma: no cover def main() -> None: # type: ignore import sys print( "The httpx command line client could not run because the required " "dependencies were not installed.\nMake sure you've installed " "everything with: pip install 'httpx[cli]'" ) sys.exit(1) __all__ = [ "__description__", "__title__", "__version__", "ASGITransport", "AsyncBaseTransport", "AsyncByteStream", "AsyncClient", "AsyncHTTPTransport", "Auth", "BaseTransport", "BasicAuth", "ByteStream", "Client", "CloseError", "codes", "ConnectError", "ConnectTimeout", "CookieConflict", "Cookies", "create_ssl_context", "DecodingError", "delete", "DigestAuth", "get", "head", "Headers", "HTTPError", "HTTPStatusError", "HTTPTransport", "InvalidURL", "Limits", "LocalProtocolError", "main", "MockTransport", "NetRCAuth", "NetworkError", "options", "patch", "PoolTimeout", "post", "ProtocolError", "Proxy", "ProxyError", "put", "QueryParams", "ReadError", "ReadTimeout", "RemoteProtocolError", "request", "Request", "RequestError", "RequestNotRead", "Response", "ResponseNotRead", "stream", "StreamClosed", "StreamConsumed", "StreamError", "SyncByteStream", "Timeout", "TimeoutException", "TooManyRedirects", "TransportError", "UnsupportedProtocol", "URL", "USE_CLIENT_DEFAULT", "WriteError", "WriteTimeout", "WSGITransport", ] __locals = locals() for __name in __all__: if not __name.startswith("__"): setattr(__locals[__name], "__module__", "httpx") # noqa httpx-0.26.0/httpx/__version__.py000066400000000000000000000001541454054354600167620ustar00rootroot00000000000000__title__ = "httpx" __description__ = "A next generation HTTP client, for Python 3." __version__ = "0.26.0" httpx-0.26.0/httpx/_api.py000066400000000000000000000326321454054354600154170ustar00rootroot00000000000000import typing from contextlib import contextmanager from ._client import Client from ._config import DEFAULT_TIMEOUT_CONFIG from ._models import Response from ._types import ( AuthTypes, CertTypes, CookieTypes, HeaderTypes, ProxiesTypes, ProxyTypes, QueryParamTypes, RequestContent, RequestData, RequestFiles, TimeoutTypes, URLTypes, VerifyTypes, ) def request( method: str, url: URLTypes, *, params: typing.Optional[QueryParamTypes] = None, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Optional[AuthTypes] = None, proxy: typing.Optional[ProxyTypes] = None, proxies: typing.Optional[ProxiesTypes] = None, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, follow_redirects: bool = False, verify: VerifyTypes = True, cert: typing.Optional[CertTypes] = None, trust_env: bool = True, ) -> Response: """ Sends an HTTP request. **Parameters:** * **method** - HTTP method for the new `Request` object: `GET`, `OPTIONS`, `HEAD`, `POST`, `PUT`, `PATCH`, or `DELETE`. * **url** - URL for the new `Request` object. * **params** - *(optional)* Query parameters to include in the URL, as a string, dictionary, or sequence of two-tuples. * **content** - *(optional)* Binary content to include in the body of the request, as bytes or a byte iterator. * **data** - *(optional)* Form data to include in the body of the request, as a dictionary. * **files** - *(optional)* A dictionary of upload files to include in the body of the request. * **json** - *(optional)* A JSON serializable object to include in the body of the request. * **headers** - *(optional)* Dictionary of HTTP headers to include in the request. * **cookies** - *(optional)* Dictionary of Cookie items to include in the request. * **auth** - *(optional)* An authentication class to use when sending the request. * **proxy** - *(optional)* A proxy URL where all the traffic should be routed. * **proxies** - *(optional)* A dictionary mapping proxy keys to proxy URLs. * **timeout** - *(optional)* The timeout configuration to use when sending the request. * **follow_redirects** - *(optional)* Enables or disables HTTP redirects. * **verify** - *(optional)* SSL certificates (a.k.a CA bundle) used to verify the identity of requested hosts. Either `True` (default CA bundle), a path to an SSL certificate file, an `ssl.SSLContext`, or `False` (which will disable verification). * **cert** - *(optional)* An SSL certificate used by the requested host to authenticate the client. Either a path to an SSL certificate file, or two-tuple of (certificate file, key file), or a three-tuple of (certificate file, key file, password). * **trust_env** - *(optional)* Enables or disables usage of environment variables for configuration. **Returns:** `Response` Usage: ``` >>> import httpx >>> response = httpx.request('GET', 'https://httpbin.org/get') >>> response ``` """ with Client( cookies=cookies, proxy=proxy, proxies=proxies, cert=cert, verify=verify, timeout=timeout, trust_env=trust_env, ) as client: return client.request( method=method, url=url, content=content, data=data, files=files, json=json, params=params, headers=headers, auth=auth, follow_redirects=follow_redirects, ) @contextmanager def stream( method: str, url: URLTypes, *, params: typing.Optional[QueryParamTypes] = None, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Optional[AuthTypes] = None, proxy: typing.Optional[ProxyTypes] = None, proxies: typing.Optional[ProxiesTypes] = None, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, follow_redirects: bool = False, verify: VerifyTypes = True, cert: typing.Optional[CertTypes] = None, trust_env: bool = True, ) -> typing.Iterator[Response]: """ Alternative to `httpx.request()` that streams the response body instead of loading it into memory at once. **Parameters**: See `httpx.request`. See also: [Streaming Responses][0] [0]: /quickstart#streaming-responses """ with Client( cookies=cookies, proxy=proxy, proxies=proxies, cert=cert, verify=verify, timeout=timeout, trust_env=trust_env, ) as client: with client.stream( method=method, url=url, content=content, data=data, files=files, json=json, params=params, headers=headers, auth=auth, follow_redirects=follow_redirects, ) as response: yield response def get( url: URLTypes, *, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Optional[AuthTypes] = None, proxy: typing.Optional[ProxyTypes] = None, proxies: typing.Optional[ProxiesTypes] = None, follow_redirects: bool = False, cert: typing.Optional[CertTypes] = None, verify: VerifyTypes = True, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, trust_env: bool = True, ) -> Response: """ Sends a `GET` request. **Parameters**: See `httpx.request`. Note that the `data`, `files`, `json` and `content` parameters are not available on this function, as `GET` requests should not include a request body. """ return request( "GET", url, params=params, headers=headers, cookies=cookies, auth=auth, proxy=proxy, proxies=proxies, follow_redirects=follow_redirects, cert=cert, verify=verify, timeout=timeout, trust_env=trust_env, ) def options( url: URLTypes, *, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Optional[AuthTypes] = None, proxy: typing.Optional[ProxyTypes] = None, proxies: typing.Optional[ProxiesTypes] = None, follow_redirects: bool = False, cert: typing.Optional[CertTypes] = None, verify: VerifyTypes = True, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, trust_env: bool = True, ) -> Response: """ Sends an `OPTIONS` request. **Parameters**: See `httpx.request`. Note that the `data`, `files`, `json` and `content` parameters are not available on this function, as `OPTIONS` requests should not include a request body. """ return request( "OPTIONS", url, params=params, headers=headers, cookies=cookies, auth=auth, proxy=proxy, proxies=proxies, follow_redirects=follow_redirects, cert=cert, verify=verify, timeout=timeout, trust_env=trust_env, ) def head( url: URLTypes, *, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Optional[AuthTypes] = None, proxy: typing.Optional[ProxyTypes] = None, proxies: typing.Optional[ProxiesTypes] = None, follow_redirects: bool = False, cert: typing.Optional[CertTypes] = None, verify: VerifyTypes = True, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, trust_env: bool = True, ) -> Response: """ Sends a `HEAD` request. **Parameters**: See `httpx.request`. Note that the `data`, `files`, `json` and `content` parameters are not available on this function, as `HEAD` requests should not include a request body. """ return request( "HEAD", url, params=params, headers=headers, cookies=cookies, auth=auth, proxy=proxy, proxies=proxies, follow_redirects=follow_redirects, cert=cert, verify=verify, timeout=timeout, trust_env=trust_env, ) def post( url: URLTypes, *, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Optional[AuthTypes] = None, proxy: typing.Optional[ProxyTypes] = None, proxies: typing.Optional[ProxiesTypes] = None, follow_redirects: bool = False, cert: typing.Optional[CertTypes] = None, verify: VerifyTypes = True, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, trust_env: bool = True, ) -> Response: """ Sends a `POST` request. **Parameters**: See `httpx.request`. """ return request( "POST", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, proxy=proxy, proxies=proxies, follow_redirects=follow_redirects, cert=cert, verify=verify, timeout=timeout, trust_env=trust_env, ) def put( url: URLTypes, *, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Optional[AuthTypes] = None, proxy: typing.Optional[ProxyTypes] = None, proxies: typing.Optional[ProxiesTypes] = None, follow_redirects: bool = False, cert: typing.Optional[CertTypes] = None, verify: VerifyTypes = True, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, trust_env: bool = True, ) -> Response: """ Sends a `PUT` request. **Parameters**: See `httpx.request`. """ return request( "PUT", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, proxy=proxy, proxies=proxies, follow_redirects=follow_redirects, cert=cert, verify=verify, timeout=timeout, trust_env=trust_env, ) def patch( url: URLTypes, *, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Optional[AuthTypes] = None, proxy: typing.Optional[ProxyTypes] = None, proxies: typing.Optional[ProxiesTypes] = None, follow_redirects: bool = False, cert: typing.Optional[CertTypes] = None, verify: VerifyTypes = True, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, trust_env: bool = True, ) -> Response: """ Sends a `PATCH` request. **Parameters**: See `httpx.request`. """ return request( "PATCH", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, proxy=proxy, proxies=proxies, follow_redirects=follow_redirects, cert=cert, verify=verify, timeout=timeout, trust_env=trust_env, ) def delete( url: URLTypes, *, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Optional[AuthTypes] = None, proxy: typing.Optional[ProxyTypes] = None, proxies: typing.Optional[ProxiesTypes] = None, follow_redirects: bool = False, cert: typing.Optional[CertTypes] = None, verify: VerifyTypes = True, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, trust_env: bool = True, ) -> Response: """ Sends a `DELETE` request. **Parameters**: See `httpx.request`. Note that the `data`, `files`, `json` and `content` parameters are not available on this function, as `DELETE` requests should not include a request body. """ return request( "DELETE", url, params=params, headers=headers, cookies=cookies, auth=auth, proxy=proxy, proxies=proxies, follow_redirects=follow_redirects, cert=cert, verify=verify, timeout=timeout, trust_env=trust_env, ) httpx-0.26.0/httpx/_auth.py000066400000000000000000000273751454054354600156170ustar00rootroot00000000000000import hashlib import os import re import time import typing from base64 import b64encode from urllib.request import parse_http_list from ._exceptions import ProtocolError from ._models import Cookies, Request, Response from ._utils import to_bytes, to_str, unquote if typing.TYPE_CHECKING: # pragma: no cover from hashlib import _Hash class Auth: """ Base class for all authentication schemes. To implement a custom authentication scheme, subclass `Auth` and override the `.auth_flow()` method. If the authentication scheme does I/O such as disk access or network calls, or uses synchronization primitives such as locks, you should override `.sync_auth_flow()` and/or `.async_auth_flow()` instead of `.auth_flow()` to provide specialized implementations that will be used by `Client` and `AsyncClient` respectively. """ requires_request_body = False requires_response_body = False def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: """ Execute the authentication flow. To dispatch a request, `yield` it: ``` yield request ``` The client will `.send()` the response back into the flow generator. You can access it like so: ``` response = yield request ``` A `return` (or reaching the end of the generator) will result in the client returning the last response obtained from the server. You can dispatch as many requests as is necessary. """ yield request def sync_auth_flow( self, request: Request ) -> typing.Generator[Request, Response, None]: """ Execute the authentication flow synchronously. By default, this defers to `.auth_flow()`. You should override this method when the authentication scheme does I/O and/or uses concurrency primitives. """ if self.requires_request_body: request.read() flow = self.auth_flow(request) request = next(flow) while True: response = yield request if self.requires_response_body: response.read() try: request = flow.send(response) except StopIteration: break async def async_auth_flow( self, request: Request ) -> typing.AsyncGenerator[Request, Response]: """ Execute the authentication flow asynchronously. By default, this defers to `.auth_flow()`. You should override this method when the authentication scheme does I/O and/or uses concurrency primitives. """ if self.requires_request_body: await request.aread() flow = self.auth_flow(request) request = next(flow) while True: response = yield request if self.requires_response_body: await response.aread() try: request = flow.send(response) except StopIteration: break class FunctionAuth(Auth): """ Allows the 'auth' argument to be passed as a simple callable function, that takes the request, and returns a new, modified request. """ def __init__(self, func: typing.Callable[[Request], Request]) -> None: self._func = func def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: yield self._func(request) class BasicAuth(Auth): """ Allows the 'auth' argument to be passed as a (username, password) pair, and uses HTTP Basic authentication. """ def __init__( self, username: typing.Union[str, bytes], password: typing.Union[str, bytes] ) -> None: self._auth_header = self._build_auth_header(username, password) def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: request.headers["Authorization"] = self._auth_header yield request def _build_auth_header( self, username: typing.Union[str, bytes], password: typing.Union[str, bytes] ) -> str: userpass = b":".join((to_bytes(username), to_bytes(password))) token = b64encode(userpass).decode() return f"Basic {token}" class NetRCAuth(Auth): """ Use a 'netrc' file to lookup basic auth credentials based on the url host. """ def __init__(self, file: typing.Optional[str] = None) -> None: # Lazily import 'netrc'. # There's no need for us to load this module unless 'NetRCAuth' is being used. import netrc self._netrc_info = netrc.netrc(file) def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: auth_info = self._netrc_info.authenticators(request.url.host) if auth_info is None or not auth_info[2]: # The netrc file did not have authentication credentials for this host. yield request else: # Build a basic auth header with credentials from the netrc file. request.headers["Authorization"] = self._build_auth_header( username=auth_info[0], password=auth_info[2] ) yield request def _build_auth_header( self, username: typing.Union[str, bytes], password: typing.Union[str, bytes] ) -> str: userpass = b":".join((to_bytes(username), to_bytes(password))) token = b64encode(userpass).decode() return f"Basic {token}" class DigestAuth(Auth): _ALGORITHM_TO_HASH_FUNCTION: typing.Dict[str, typing.Callable[[bytes], "_Hash"]] = { "MD5": hashlib.md5, "MD5-SESS": hashlib.md5, "SHA": hashlib.sha1, "SHA-SESS": hashlib.sha1, "SHA-256": hashlib.sha256, "SHA-256-SESS": hashlib.sha256, "SHA-512": hashlib.sha512, "SHA-512-SESS": hashlib.sha512, } def __init__( self, username: typing.Union[str, bytes], password: typing.Union[str, bytes] ) -> None: self._username = to_bytes(username) self._password = to_bytes(password) self._last_challenge: typing.Optional[_DigestAuthChallenge] = None self._nonce_count = 1 def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: if self._last_challenge: request.headers["Authorization"] = self._build_auth_header( request, self._last_challenge ) response = yield request if response.status_code != 401 or "www-authenticate" not in response.headers: # If the response is not a 401 then we don't # need to build an authenticated request. return for auth_header in response.headers.get_list("www-authenticate"): if auth_header.lower().startswith("digest "): break else: # If the response does not include a 'WWW-Authenticate: Digest ...' # header, then we don't need to build an authenticated request. return self._last_challenge = self._parse_challenge(request, response, auth_header) self._nonce_count = 1 request.headers["Authorization"] = self._build_auth_header( request, self._last_challenge ) if response.cookies: Cookies(response.cookies).set_cookie_header(request=request) yield request def _parse_challenge( self, request: Request, response: Response, auth_header: str ) -> "_DigestAuthChallenge": """ Returns a challenge from a Digest WWW-Authenticate header. These take the form of: `Digest realm="realm@host.com",qop="auth,auth-int",nonce="abc",opaque="xyz"` """ scheme, _, fields = auth_header.partition(" ") # This method should only ever have been called with a Digest auth header. assert scheme.lower() == "digest" header_dict: typing.Dict[str, str] = {} for field in parse_http_list(fields): key, value = field.strip().split("=", 1) header_dict[key] = unquote(value) try: realm = header_dict["realm"].encode() nonce = header_dict["nonce"].encode() algorithm = header_dict.get("algorithm", "MD5") opaque = header_dict["opaque"].encode() if "opaque" in header_dict else None qop = header_dict["qop"].encode() if "qop" in header_dict else None return _DigestAuthChallenge( realm=realm, nonce=nonce, algorithm=algorithm, opaque=opaque, qop=qop ) except KeyError as exc: message = "Malformed Digest WWW-Authenticate header" raise ProtocolError(message, request=request) from exc def _build_auth_header( self, request: Request, challenge: "_DigestAuthChallenge" ) -> str: hash_func = self._ALGORITHM_TO_HASH_FUNCTION[challenge.algorithm.upper()] def digest(data: bytes) -> bytes: return hash_func(data).hexdigest().encode() A1 = b":".join((self._username, challenge.realm, self._password)) path = request.url.raw_path A2 = b":".join((request.method.encode(), path)) # TODO: implement auth-int HA2 = digest(A2) nc_value = b"%08x" % self._nonce_count cnonce = self._get_client_nonce(self._nonce_count, challenge.nonce) self._nonce_count += 1 HA1 = digest(A1) if challenge.algorithm.lower().endswith("-sess"): HA1 = digest(b":".join((HA1, challenge.nonce, cnonce))) qop = self._resolve_qop(challenge.qop, request=request) if qop is None: digest_data = [HA1, challenge.nonce, HA2] else: digest_data = [challenge.nonce, nc_value, cnonce, qop, HA2] key_digest = b":".join(digest_data) format_args = { "username": self._username, "realm": challenge.realm, "nonce": challenge.nonce, "uri": path, "response": digest(b":".join((HA1, key_digest))), "algorithm": challenge.algorithm.encode(), } if challenge.opaque: format_args["opaque"] = challenge.opaque if qop: format_args["qop"] = b"auth" format_args["nc"] = nc_value format_args["cnonce"] = cnonce return "Digest " + self._get_header_value(format_args) def _get_client_nonce(self, nonce_count: int, nonce: bytes) -> bytes: s = str(nonce_count).encode() s += nonce s += time.ctime().encode() s += os.urandom(8) return hashlib.sha1(s).hexdigest()[:16].encode() def _get_header_value(self, header_fields: typing.Dict[str, bytes]) -> str: NON_QUOTED_FIELDS = ("algorithm", "qop", "nc") QUOTED_TEMPLATE = '{}="{}"' NON_QUOTED_TEMPLATE = "{}={}" header_value = "" for i, (field, value) in enumerate(header_fields.items()): if i > 0: header_value += ", " template = ( QUOTED_TEMPLATE if field not in NON_QUOTED_FIELDS else NON_QUOTED_TEMPLATE ) header_value += template.format(field, to_str(value)) return header_value def _resolve_qop( self, qop: typing.Optional[bytes], request: Request ) -> typing.Optional[bytes]: if qop is None: return None qops = re.split(b", ?", qop) if b"auth" in qops: return b"auth" if qops == [b"auth-int"]: raise NotImplementedError("Digest auth-int support is not yet implemented") message = f'Unexpected qop value "{qop!r}" in digest auth' raise ProtocolError(message, request=request) class _DigestAuthChallenge(typing.NamedTuple): realm: bytes nonce: bytes algorithm: str opaque: typing.Optional[bytes] qop: typing.Optional[bytes] httpx-0.26.0/httpx/_client.py000066400000000000000000002072311454054354600161230ustar00rootroot00000000000000import datetime import enum import logging import typing import warnings from contextlib import asynccontextmanager, contextmanager from types import TracebackType from .__version__ import __version__ from ._auth import Auth, BasicAuth, FunctionAuth from ._config import ( DEFAULT_LIMITS, DEFAULT_MAX_REDIRECTS, DEFAULT_TIMEOUT_CONFIG, Limits, Proxy, Timeout, ) from ._decoders import SUPPORTED_DECODERS from ._exceptions import ( InvalidURL, RemoteProtocolError, TooManyRedirects, request_context, ) from ._models import Cookies, Headers, Request, Response from ._status_codes import codes from ._transports.asgi import ASGITransport from ._transports.base import AsyncBaseTransport, BaseTransport from ._transports.default import AsyncHTTPTransport, HTTPTransport from ._transports.wsgi import WSGITransport from ._types import ( AsyncByteStream, AuthTypes, CertTypes, CookieTypes, HeaderTypes, ProxiesTypes, ProxyTypes, QueryParamTypes, RequestContent, RequestData, RequestExtensions, RequestFiles, SyncByteStream, TimeoutTypes, URLTypes, VerifyTypes, ) from ._urls import URL, QueryParams from ._utils import ( Timer, URLPattern, get_environment_proxies, is_https_redirect, same_origin, ) # The type annotation for @classmethod and context managers here follows PEP 484 # https://www.python.org/dev/peps/pep-0484/#annotating-instance-and-class-methods T = typing.TypeVar("T", bound="Client") U = typing.TypeVar("U", bound="AsyncClient") class UseClientDefault: """ For some parameters such as `auth=...` and `timeout=...` we need to be able to indicate the default "unset" state, in a way that is distinctly different to using `None`. The default "unset" state indicates that whatever default is set on the client should be used. This is different to setting `None`, which explicitly disables the parameter, possibly overriding a client default. For example we use `timeout=USE_CLIENT_DEFAULT` in the `request()` signature. Omitting the `timeout` parameter will send a request using whatever default timeout has been configured on the client. Including `timeout=None` will ensure no timeout is used. Note that user code shouldn't need to use the `USE_CLIENT_DEFAULT` constant, but it is used internally when a parameter is not included. """ USE_CLIENT_DEFAULT = UseClientDefault() logger = logging.getLogger("httpx") USER_AGENT = f"python-httpx/{__version__}" ACCEPT_ENCODING = ", ".join( [key for key in SUPPORTED_DECODERS.keys() if key != "identity"] ) class ClientState(enum.Enum): # UNOPENED: # The client has been instantiated, but has not been used to send a request, # or been opened by entering the context of a `with` block. UNOPENED = 1 # OPENED: # The client has either sent a request, or is within a `with` block. OPENED = 2 # CLOSED: # The client has either exited the `with` block, or `close()` has # been called explicitly. CLOSED = 3 class BoundSyncStream(SyncByteStream): """ A byte stream that is bound to a given response instance, and that ensures the `response.elapsed` is set once the response is closed. """ def __init__( self, stream: SyncByteStream, response: Response, timer: Timer ) -> None: self._stream = stream self._response = response self._timer = timer def __iter__(self) -> typing.Iterator[bytes]: for chunk in self._stream: yield chunk def close(self) -> None: seconds = self._timer.sync_elapsed() self._response.elapsed = datetime.timedelta(seconds=seconds) self._stream.close() class BoundAsyncStream(AsyncByteStream): """ An async byte stream that is bound to a given response instance, and that ensures the `response.elapsed` is set once the response is closed. """ def __init__( self, stream: AsyncByteStream, response: Response, timer: Timer ) -> None: self._stream = stream self._response = response self._timer = timer async def __aiter__(self) -> typing.AsyncIterator[bytes]: async for chunk in self._stream: yield chunk async def aclose(self) -> None: seconds = await self._timer.async_elapsed() self._response.elapsed = datetime.timedelta(seconds=seconds) await self._stream.aclose() EventHook = typing.Callable[..., typing.Any] class BaseClient: def __init__( self, *, auth: typing.Optional[AuthTypes] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, follow_redirects: bool = False, max_redirects: int = DEFAULT_MAX_REDIRECTS, event_hooks: typing.Optional[ typing.Mapping[str, typing.List[EventHook]] ] = None, base_url: URLTypes = "", trust_env: bool = True, default_encoding: typing.Union[str, typing.Callable[[bytes], str]] = "utf-8", ) -> None: event_hooks = {} if event_hooks is None else event_hooks self._base_url = self._enforce_trailing_slash(URL(base_url)) self._auth = self._build_auth(auth) self._params = QueryParams(params) self.headers = Headers(headers) self._cookies = Cookies(cookies) self._timeout = Timeout(timeout) self.follow_redirects = follow_redirects self.max_redirects = max_redirects self._event_hooks = { "request": list(event_hooks.get("request", [])), "response": list(event_hooks.get("response", [])), } self._trust_env = trust_env self._default_encoding = default_encoding self._state = ClientState.UNOPENED @property def is_closed(self) -> bool: """ Check if the client being closed """ return self._state == ClientState.CLOSED @property def trust_env(self) -> bool: return self._trust_env def _enforce_trailing_slash(self, url: URL) -> URL: if url.raw_path.endswith(b"/"): return url return url.copy_with(raw_path=url.raw_path + b"/") def _get_proxy_map( self, proxies: typing.Optional[ProxiesTypes], allow_env_proxies: bool ) -> typing.Dict[str, typing.Optional[Proxy]]: if proxies is None: if allow_env_proxies: return { key: None if url is None else Proxy(url=url) for key, url in get_environment_proxies().items() } return {} if isinstance(proxies, dict): new_proxies = {} for key, value in proxies.items(): proxy = Proxy(url=value) if isinstance(value, (str, URL)) else value new_proxies[str(key)] = proxy return new_proxies else: proxy = Proxy(url=proxies) if isinstance(proxies, (str, URL)) else proxies return {"all://": proxy} @property def timeout(self) -> Timeout: return self._timeout @timeout.setter def timeout(self, timeout: TimeoutTypes) -> None: self._timeout = Timeout(timeout) @property def event_hooks(self) -> typing.Dict[str, typing.List[EventHook]]: return self._event_hooks @event_hooks.setter def event_hooks( self, event_hooks: typing.Dict[str, typing.List[EventHook]] ) -> None: self._event_hooks = { "request": list(event_hooks.get("request", [])), "response": list(event_hooks.get("response", [])), } @property def auth(self) -> typing.Optional[Auth]: """ Authentication class used when none is passed at the request-level. See also [Authentication][0]. [0]: /quickstart/#authentication """ return self._auth @auth.setter def auth(self, auth: AuthTypes) -> None: self._auth = self._build_auth(auth) @property def base_url(self) -> URL: """ Base URL to use when sending requests with relative URLs. """ return self._base_url @base_url.setter def base_url(self, url: URLTypes) -> None: self._base_url = self._enforce_trailing_slash(URL(url)) @property def headers(self) -> Headers: """ HTTP headers to include when sending requests. """ return self._headers @headers.setter def headers(self, headers: HeaderTypes) -> None: client_headers = Headers( { b"Accept": b"*/*", b"Accept-Encoding": ACCEPT_ENCODING.encode("ascii"), b"Connection": b"keep-alive", b"User-Agent": USER_AGENT.encode("ascii"), } ) client_headers.update(headers) self._headers = client_headers @property def cookies(self) -> Cookies: """ Cookie values to include when sending requests. """ return self._cookies @cookies.setter def cookies(self, cookies: CookieTypes) -> None: self._cookies = Cookies(cookies) @property def params(self) -> QueryParams: """ Query parameters to include in the URL when sending requests. """ return self._params @params.setter def params(self, params: QueryParamTypes) -> None: self._params = QueryParams(params) def build_request( self, method: str, url: URLTypes, *, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Request: """ Build and return a request instance. * The `params`, `headers` and `cookies` arguments are merged with any values set on the client. * The `url` argument is merged with any `base_url` set on the client. See also: [Request instances][0] [0]: /advanced/#request-instances """ url = self._merge_url(url) headers = self._merge_headers(headers) cookies = self._merge_cookies(cookies) params = self._merge_queryparams(params) extensions = {} if extensions is None else extensions if "timeout" not in extensions: timeout = ( self.timeout if isinstance(timeout, UseClientDefault) else Timeout(timeout) ) extensions = dict(**extensions, timeout=timeout.as_dict()) return Request( method, url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, extensions=extensions, ) def _merge_url(self, url: URLTypes) -> URL: """ Merge a URL argument together with any 'base_url' on the client, to create the URL used for the outgoing request. """ merge_url = URL(url) if merge_url.is_relative_url: # To merge URLs we always append to the base URL. To get this # behaviour correct we always ensure the base URL ends in a '/' # separator, and strip any leading '/' from the merge URL. # # So, eg... # # >>> client = Client(base_url="https://www.example.com/subpath") # >>> client.base_url # URL('https://www.example.com/subpath/') # >>> client.build_request("GET", "/path").url # URL('https://www.example.com/subpath/path') merge_raw_path = self.base_url.raw_path + merge_url.raw_path.lstrip(b"/") return self.base_url.copy_with(raw_path=merge_raw_path) return merge_url def _merge_cookies( self, cookies: typing.Optional[CookieTypes] = None ) -> typing.Optional[CookieTypes]: """ Merge a cookies argument together with any cookies on the client, to create the cookies used for the outgoing request. """ if cookies or self.cookies: merged_cookies = Cookies(self.cookies) merged_cookies.update(cookies) return merged_cookies return cookies def _merge_headers( self, headers: typing.Optional[HeaderTypes] = None ) -> typing.Optional[HeaderTypes]: """ Merge a headers argument together with any headers on the client, to create the headers used for the outgoing request. """ merged_headers = Headers(self.headers) merged_headers.update(headers) return merged_headers def _merge_queryparams( self, params: typing.Optional[QueryParamTypes] = None ) -> typing.Optional[QueryParamTypes]: """ Merge a queryparams argument together with any queryparams on the client, to create the queryparams used for the outgoing request. """ if params or self.params: merged_queryparams = QueryParams(self.params) return merged_queryparams.merge(params) return params def _build_auth(self, auth: typing.Optional[AuthTypes]) -> typing.Optional[Auth]: if auth is None: return None elif isinstance(auth, tuple): return BasicAuth(username=auth[0], password=auth[1]) elif isinstance(auth, Auth): return auth elif callable(auth): return FunctionAuth(func=auth) else: raise TypeError(f'Invalid "auth" argument: {auth!r}') def _build_request_auth( self, request: Request, auth: typing.Union[AuthTypes, UseClientDefault, None] = USE_CLIENT_DEFAULT, ) -> Auth: auth = ( self._auth if isinstance(auth, UseClientDefault) else self._build_auth(auth) ) if auth is not None: return auth username, password = request.url.username, request.url.password if username or password: return BasicAuth(username=username, password=password) return Auth() def _build_redirect_request(self, request: Request, response: Response) -> Request: """ Given a request and a redirect response, return a new request that should be used to effect the redirect. """ method = self._redirect_method(request, response) url = self._redirect_url(request, response) headers = self._redirect_headers(request, url, method) stream = self._redirect_stream(request, method) cookies = Cookies(self.cookies) return Request( method=method, url=url, headers=headers, cookies=cookies, stream=stream, extensions=request.extensions, ) def _redirect_method(self, request: Request, response: Response) -> str: """ When being redirected we may want to change the method of the request based on certain specs or browser behavior. """ method = request.method # https://tools.ietf.org/html/rfc7231#section-6.4.4 if response.status_code == codes.SEE_OTHER and method != "HEAD": method = "GET" # Do what the browsers do, despite standards... # Turn 302s into GETs. if response.status_code == codes.FOUND and method != "HEAD": method = "GET" # If a POST is responded to with a 301, turn it into a GET. # This bizarre behaviour is explained in 'requests' issue 1704. if response.status_code == codes.MOVED_PERMANENTLY and method == "POST": method = "GET" return method def _redirect_url(self, request: Request, response: Response) -> URL: """ Return the URL for the redirect to follow. """ location = response.headers["Location"] try: url = URL(location) except InvalidURL as exc: raise RemoteProtocolError( f"Invalid URL in location header: {exc}.", request=request ) from None # Handle malformed 'Location' headers that are "absolute" form, have no host. # See: https://github.com/encode/httpx/issues/771 if url.scheme and not url.host: url = url.copy_with(host=request.url.host) # Facilitate relative 'Location' headers, as allowed by RFC 7231. # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') if url.is_relative_url: url = request.url.join(url) # Attach previous fragment if needed (RFC 7231 7.1.2) if request.url.fragment and not url.fragment: url = url.copy_with(fragment=request.url.fragment) return url def _redirect_headers(self, request: Request, url: URL, method: str) -> Headers: """ Return the headers that should be used for the redirect request. """ headers = Headers(request.headers) if not same_origin(url, request.url): if not is_https_redirect(request.url, url): # Strip Authorization headers when responses are redirected # away from the origin. (Except for direct HTTP to HTTPS redirects.) headers.pop("Authorization", None) # Update the Host header. headers["Host"] = url.netloc.decode("ascii") if method != request.method and method == "GET": # If we've switch to a 'GET' request, then strip any headers which # are only relevant to the request body. headers.pop("Content-Length", None) headers.pop("Transfer-Encoding", None) # We should use the client cookie store to determine any cookie header, # rather than whatever was on the original outgoing request. headers.pop("Cookie", None) return headers def _redirect_stream( self, request: Request, method: str ) -> typing.Optional[typing.Union[SyncByteStream, AsyncByteStream]]: """ Return the body that should be used for the redirect request. """ if method != request.method and method == "GET": return None return request.stream class Client(BaseClient): """ An HTTP client, with connection pooling, HTTP/2, redirects, cookie persistence, etc. It can be shared between threads. Usage: ```python >>> client = httpx.Client() >>> response = client.get('https://example.org') ``` **Parameters:** * **auth** - *(optional)* An authentication class to use when sending requests. * **params** - *(optional)* Query parameters to include in request URLs, as a string, dictionary, or sequence of two-tuples. * **headers** - *(optional)* Dictionary of HTTP headers to include when sending requests. * **cookies** - *(optional)* Dictionary of Cookie items to include when sending requests. * **verify** - *(optional)* SSL certificates (a.k.a CA bundle) used to verify the identity of requested hosts. Either `True` (default CA bundle), a path to an SSL certificate file, an `ssl.SSLContext`, or `False` (which will disable verification). * **cert** - *(optional)* An SSL certificate used by the requested host to authenticate the client. Either a path to an SSL certificate file, or two-tuple of (certificate file, key file), or a three-tuple of (certificate file, key file, password). * **proxy** - *(optional)* A proxy URL where all the traffic should be routed. * **proxies** - *(optional)* A dictionary mapping proxy keys to proxy URLs. * **timeout** - *(optional)* The timeout configuration to use when sending requests. * **limits** - *(optional)* The limits configuration to use. * **max_redirects** - *(optional)* The maximum number of redirect responses that should be followed. * **base_url** - *(optional)* A URL to use as the base when building request URLs. * **transport** - *(optional)* A transport class to use for sending requests over the network. * **app** - *(optional)* An WSGI application to send requests to, rather than sending actual network requests. * **trust_env** - *(optional)* Enables or disables usage of environment variables for configuration. * **default_encoding** - *(optional)* The default encoding to use for decoding response text, if no charset information is included in a response Content-Type header. Set to a callable for automatic character set detection. Default: "utf-8". """ def __init__( self, *, auth: typing.Optional[AuthTypes] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, verify: VerifyTypes = True, cert: typing.Optional[CertTypes] = None, http1: bool = True, http2: bool = False, proxy: typing.Optional[ProxyTypes] = None, proxies: typing.Optional[ProxiesTypes] = None, mounts: typing.Optional[ typing.Mapping[str, typing.Optional[BaseTransport]] ] = None, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, follow_redirects: bool = False, limits: Limits = DEFAULT_LIMITS, max_redirects: int = DEFAULT_MAX_REDIRECTS, event_hooks: typing.Optional[ typing.Mapping[str, typing.List[EventHook]] ] = None, base_url: URLTypes = "", transport: typing.Optional[BaseTransport] = None, app: typing.Optional[typing.Callable[..., typing.Any]] = None, trust_env: bool = True, default_encoding: typing.Union[str, typing.Callable[[bytes], str]] = "utf-8", ) -> None: super().__init__( auth=auth, params=params, headers=headers, cookies=cookies, timeout=timeout, follow_redirects=follow_redirects, max_redirects=max_redirects, event_hooks=event_hooks, base_url=base_url, trust_env=trust_env, default_encoding=default_encoding, ) if http2: try: import h2 # noqa except ImportError: # pragma: no cover raise ImportError( "Using http2=True, but the 'h2' package is not installed. " "Make sure to install httpx using `pip install httpx[http2]`." ) from None if proxies: message = ( "The 'proxies' argument is now deprecated." " Use 'proxy' or 'mounts' instead." ) warnings.warn(message, DeprecationWarning) if proxy: raise RuntimeError("Use either `proxy` or 'proxies', not both.") allow_env_proxies = trust_env and app is None and transport is None proxy_map = self._get_proxy_map(proxies or proxy, allow_env_proxies) self._transport = self._init_transport( verify=verify, cert=cert, http1=http1, http2=http2, limits=limits, transport=transport, app=app, trust_env=trust_env, ) self._mounts: typing.Dict[URLPattern, typing.Optional[BaseTransport]] = { URLPattern(key): None if proxy is None else self._init_proxy_transport( proxy, verify=verify, cert=cert, http1=http1, http2=http2, limits=limits, trust_env=trust_env, ) for key, proxy in proxy_map.items() } if mounts is not None: self._mounts.update( {URLPattern(key): transport for key, transport in mounts.items()} ) self._mounts = dict(sorted(self._mounts.items())) def _init_transport( self, verify: VerifyTypes = True, cert: typing.Optional[CertTypes] = None, http1: bool = True, http2: bool = False, limits: Limits = DEFAULT_LIMITS, transport: typing.Optional[BaseTransport] = None, app: typing.Optional[typing.Callable[..., typing.Any]] = None, trust_env: bool = True, ) -> BaseTransport: if transport is not None: return transport if app is not None: return WSGITransport(app=app) return HTTPTransport( verify=verify, cert=cert, http1=http1, http2=http2, limits=limits, trust_env=trust_env, ) def _init_proxy_transport( self, proxy: Proxy, verify: VerifyTypes = True, cert: typing.Optional[CertTypes] = None, http1: bool = True, http2: bool = False, limits: Limits = DEFAULT_LIMITS, trust_env: bool = True, ) -> BaseTransport: return HTTPTransport( verify=verify, cert=cert, http1=http1, http2=http2, limits=limits, trust_env=trust_env, proxy=proxy, ) def _transport_for_url(self, url: URL) -> BaseTransport: """ Returns the transport instance that should be used for a given URL. This will either be the standard connection pool, or a proxy. """ for pattern, transport in self._mounts.items(): if pattern.matches(url): return self._transport if transport is None else transport return self._transport def request( self, method: str, url: URLTypes, *, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault, None] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Build and send a request. Equivalent to: ```python request = client.build_request(...) response = client.send(request, ...) ``` See `Client.build_request()`, `Client.send()` and [Merging of configuration][0] for how the various parameters are merged with client-level configuration. [0]: /advanced/#merging-of-configuration """ if cookies is not None: message = ( "Setting per-request cookies=<...> is being deprecated, because " "the expected behaviour on cookie persistence is ambiguous. Set " "cookies directly on the client instance instead." ) warnings.warn(message, DeprecationWarning) request = self.build_request( method=method, url=url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, timeout=timeout, extensions=extensions, ) return self.send(request, auth=auth, follow_redirects=follow_redirects) @contextmanager def stream( self, method: str, url: URLTypes, *, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault, None] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> typing.Iterator[Response]: """ Alternative to `httpx.request()` that streams the response body instead of loading it into memory at once. **Parameters**: See `httpx.request`. See also: [Streaming Responses][0] [0]: /quickstart#streaming-responses """ request = self.build_request( method=method, url=url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, timeout=timeout, extensions=extensions, ) response = self.send( request=request, auth=auth, follow_redirects=follow_redirects, stream=True, ) try: yield response finally: response.close() def send( self, request: Request, *, stream: bool = False, auth: typing.Union[AuthTypes, UseClientDefault, None] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send a request. The request is sent as-is, unmodified. Typically you'll want to build one with `Client.build_request()` so that any client-level configuration is merged into the request, but passing an explicit `httpx.Request()` is supported as well. See also: [Request instances][0] [0]: /advanced/#request-instances """ if self._state == ClientState.CLOSED: raise RuntimeError("Cannot send a request, as the client has been closed.") self._state = ClientState.OPENED follow_redirects = ( self.follow_redirects if isinstance(follow_redirects, UseClientDefault) else follow_redirects ) auth = self._build_request_auth(request, auth) response = self._send_handling_auth( request, auth=auth, follow_redirects=follow_redirects, history=[], ) try: if not stream: response.read() return response except BaseException as exc: response.close() raise exc def _send_handling_auth( self, request: Request, auth: Auth, follow_redirects: bool, history: typing.List[Response], ) -> Response: auth_flow = auth.sync_auth_flow(request) try: request = next(auth_flow) while True: response = self._send_handling_redirects( request, follow_redirects=follow_redirects, history=history, ) try: try: next_request = auth_flow.send(response) except StopIteration: return response response.history = list(history) response.read() request = next_request history.append(response) except BaseException as exc: response.close() raise exc finally: auth_flow.close() def _send_handling_redirects( self, request: Request, follow_redirects: bool, history: typing.List[Response], ) -> Response: while True: if len(history) > self.max_redirects: raise TooManyRedirects( "Exceeded maximum allowed redirects.", request=request ) for hook in self._event_hooks["request"]: hook(request) response = self._send_single_request(request) try: for hook in self._event_hooks["response"]: hook(response) response.history = list(history) if not response.has_redirect_location: return response request = self._build_redirect_request(request, response) history = history + [response] if follow_redirects: response.read() else: response.next_request = request return response except BaseException as exc: response.close() raise exc def _send_single_request(self, request: Request) -> Response: """ Sends a single request, without handling any redirections. """ transport = self._transport_for_url(request.url) timer = Timer() timer.sync_start() if not isinstance(request.stream, SyncByteStream): raise RuntimeError( "Attempted to send an async request with a sync Client instance." ) with request_context(request=request): response = transport.handle_request(request) assert isinstance(response.stream, SyncByteStream) response.request = request response.stream = BoundSyncStream( response.stream, response=response, timer=timer ) self.cookies.extract_cookies(response) response.default_encoding = self._default_encoding logger.info( 'HTTP Request: %s %s "%s %d %s"', request.method, request.url, response.http_version, response.status_code, response.reason_phrase, ) return response def get( self, url: URLTypes, *, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `GET` request. **Parameters**: See `httpx.request`. """ return self.request( "GET", url, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) def options( self, url: URLTypes, *, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send an `OPTIONS` request. **Parameters**: See `httpx.request`. """ return self.request( "OPTIONS", url, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) def head( self, url: URLTypes, *, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `HEAD` request. **Parameters**: See `httpx.request`. """ return self.request( "HEAD", url, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) def post( self, url: URLTypes, *, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `POST` request. **Parameters**: See `httpx.request`. """ return self.request( "POST", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) def put( self, url: URLTypes, *, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `PUT` request. **Parameters**: See `httpx.request`. """ return self.request( "PUT", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) def patch( self, url: URLTypes, *, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `PATCH` request. **Parameters**: See `httpx.request`. """ return self.request( "PATCH", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) def delete( self, url: URLTypes, *, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `DELETE` request. **Parameters**: See `httpx.request`. """ return self.request( "DELETE", url, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) def close(self) -> None: """ Close transport and proxies. """ if self._state != ClientState.CLOSED: self._state = ClientState.CLOSED self._transport.close() for transport in self._mounts.values(): if transport is not None: transport.close() def __enter__(self: T) -> T: if self._state != ClientState.UNOPENED: msg = { ClientState.OPENED: "Cannot open a client instance more than once.", ClientState.CLOSED: ( "Cannot reopen a client instance, once it has been closed." ), }[self._state] raise RuntimeError(msg) self._state = ClientState.OPENED self._transport.__enter__() for transport in self._mounts.values(): if transport is not None: transport.__enter__() return self def __exit__( self, exc_type: typing.Optional[typing.Type[BaseException]] = None, exc_value: typing.Optional[BaseException] = None, traceback: typing.Optional[TracebackType] = None, ) -> None: self._state = ClientState.CLOSED self._transport.__exit__(exc_type, exc_value, traceback) for transport in self._mounts.values(): if transport is not None: transport.__exit__(exc_type, exc_value, traceback) class AsyncClient(BaseClient): """ An asynchronous HTTP client, with connection pooling, HTTP/2, redirects, cookie persistence, etc. Usage: ```python >>> async with httpx.AsyncClient() as client: >>> response = await client.get('https://example.org') ``` **Parameters:** * **auth** - *(optional)* An authentication class to use when sending requests. * **params** - *(optional)* Query parameters to include in request URLs, as a string, dictionary, or sequence of two-tuples. * **headers** - *(optional)* Dictionary of HTTP headers to include when sending requests. * **cookies** - *(optional)* Dictionary of Cookie items to include when sending requests. * **verify** - *(optional)* SSL certificates (a.k.a CA bundle) used to verify the identity of requested hosts. Either `True` (default CA bundle), a path to an SSL certificate file, an `ssl.SSLContext`, or `False` (which will disable verification). * **cert** - *(optional)* An SSL certificate used by the requested host to authenticate the client. Either a path to an SSL certificate file, or two-tuple of (certificate file, key file), or a three-tuple of (certificate file, key file, password). * **http2** - *(optional)* A boolean indicating if HTTP/2 support should be enabled. Defaults to `False`. * **proxy** - *(optional)* A proxy URL where all the traffic should be routed. * **proxies** - *(optional)* A dictionary mapping HTTP protocols to proxy URLs. * **timeout** - *(optional)* The timeout configuration to use when sending requests. * **limits** - *(optional)* The limits configuration to use. * **max_redirects** - *(optional)* The maximum number of redirect responses that should be followed. * **base_url** - *(optional)* A URL to use as the base when building request URLs. * **transport** - *(optional)* A transport class to use for sending requests over the network. * **app** - *(optional)* An ASGI application to send requests to, rather than sending actual network requests. * **trust_env** - *(optional)* Enables or disables usage of environment variables for configuration. * **default_encoding** - *(optional)* The default encoding to use for decoding response text, if no charset information is included in a response Content-Type header. Set to a callable for automatic character set detection. Default: "utf-8". """ def __init__( self, *, auth: typing.Optional[AuthTypes] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, verify: VerifyTypes = True, cert: typing.Optional[CertTypes] = None, http1: bool = True, http2: bool = False, proxy: typing.Optional[ProxyTypes] = None, proxies: typing.Optional[ProxiesTypes] = None, mounts: typing.Optional[ typing.Mapping[str, typing.Optional[AsyncBaseTransport]] ] = None, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, follow_redirects: bool = False, limits: Limits = DEFAULT_LIMITS, max_redirects: int = DEFAULT_MAX_REDIRECTS, event_hooks: typing.Optional[ typing.Mapping[str, typing.List[typing.Callable[..., typing.Any]]] ] = None, base_url: URLTypes = "", transport: typing.Optional[AsyncBaseTransport] = None, app: typing.Optional[typing.Callable[..., typing.Any]] = None, trust_env: bool = True, default_encoding: typing.Union[str, typing.Callable[[bytes], str]] = "utf-8", ) -> None: super().__init__( auth=auth, params=params, headers=headers, cookies=cookies, timeout=timeout, follow_redirects=follow_redirects, max_redirects=max_redirects, event_hooks=event_hooks, base_url=base_url, trust_env=trust_env, default_encoding=default_encoding, ) if http2: try: import h2 # noqa except ImportError: # pragma: no cover raise ImportError( "Using http2=True, but the 'h2' package is not installed. " "Make sure to install httpx using `pip install httpx[http2]`." ) from None if proxies: message = ( "The 'proxies' argument is now deprecated." " Use 'proxy' or 'mounts' instead." ) warnings.warn(message, DeprecationWarning) if proxy: raise RuntimeError("Use either `proxy` or 'proxies', not both.") allow_env_proxies = trust_env and app is None and transport is None proxy_map = self._get_proxy_map(proxies or proxy, allow_env_proxies) self._transport = self._init_transport( verify=verify, cert=cert, http1=http1, http2=http2, limits=limits, transport=transport, app=app, trust_env=trust_env, ) self._mounts: typing.Dict[URLPattern, typing.Optional[AsyncBaseTransport]] = { URLPattern(key): None if proxy is None else self._init_proxy_transport( proxy, verify=verify, cert=cert, http1=http1, http2=http2, limits=limits, trust_env=trust_env, ) for key, proxy in proxy_map.items() } if mounts is not None: self._mounts.update( {URLPattern(key): transport for key, transport in mounts.items()} ) self._mounts = dict(sorted(self._mounts.items())) def _init_transport( self, verify: VerifyTypes = True, cert: typing.Optional[CertTypes] = None, http1: bool = True, http2: bool = False, limits: Limits = DEFAULT_LIMITS, transport: typing.Optional[AsyncBaseTransport] = None, app: typing.Optional[typing.Callable[..., typing.Any]] = None, trust_env: bool = True, ) -> AsyncBaseTransport: if transport is not None: return transport if app is not None: return ASGITransport(app=app) return AsyncHTTPTransport( verify=verify, cert=cert, http1=http1, http2=http2, limits=limits, trust_env=trust_env, ) def _init_proxy_transport( self, proxy: Proxy, verify: VerifyTypes = True, cert: typing.Optional[CertTypes] = None, http1: bool = True, http2: bool = False, limits: Limits = DEFAULT_LIMITS, trust_env: bool = True, ) -> AsyncBaseTransport: return AsyncHTTPTransport( verify=verify, cert=cert, http2=http2, limits=limits, trust_env=trust_env, proxy=proxy, ) def _transport_for_url(self, url: URL) -> AsyncBaseTransport: """ Returns the transport instance that should be used for a given URL. This will either be the standard connection pool, or a proxy. """ for pattern, transport in self._mounts.items(): if pattern.matches(url): return self._transport if transport is None else transport return self._transport async def request( self, method: str, url: URLTypes, *, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault, None] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Build and send a request. Equivalent to: ```python request = client.build_request(...) response = await client.send(request, ...) ``` See `AsyncClient.build_request()`, `AsyncClient.send()` and [Merging of configuration][0] for how the various parameters are merged with client-level configuration. [0]: /advanced/#merging-of-configuration """ request = self.build_request( method=method, url=url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, timeout=timeout, extensions=extensions, ) return await self.send(request, auth=auth, follow_redirects=follow_redirects) @asynccontextmanager async def stream( self, method: str, url: URLTypes, *, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> typing.AsyncIterator[Response]: """ Alternative to `httpx.request()` that streams the response body instead of loading it into memory at once. **Parameters**: See `httpx.request`. See also: [Streaming Responses][0] [0]: /quickstart#streaming-responses """ request = self.build_request( method=method, url=url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, timeout=timeout, extensions=extensions, ) response = await self.send( request=request, auth=auth, follow_redirects=follow_redirects, stream=True, ) try: yield response finally: await response.aclose() async def send( self, request: Request, *, stream: bool = False, auth: typing.Union[AuthTypes, UseClientDefault, None] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send a request. The request is sent as-is, unmodified. Typically you'll want to build one with `AsyncClient.build_request()` so that any client-level configuration is merged into the request, but passing an explicit `httpx.Request()` is supported as well. See also: [Request instances][0] [0]: /advanced/#request-instances """ if self._state == ClientState.CLOSED: raise RuntimeError("Cannot send a request, as the client has been closed.") self._state = ClientState.OPENED follow_redirects = ( self.follow_redirects if isinstance(follow_redirects, UseClientDefault) else follow_redirects ) auth = self._build_request_auth(request, auth) response = await self._send_handling_auth( request, auth=auth, follow_redirects=follow_redirects, history=[], ) try: if not stream: await response.aread() return response except BaseException as exc: # pragma: no cover await response.aclose() raise exc async def _send_handling_auth( self, request: Request, auth: Auth, follow_redirects: bool, history: typing.List[Response], ) -> Response: auth_flow = auth.async_auth_flow(request) try: request = await auth_flow.__anext__() while True: response = await self._send_handling_redirects( request, follow_redirects=follow_redirects, history=history, ) try: try: next_request = await auth_flow.asend(response) except StopAsyncIteration: return response response.history = list(history) await response.aread() request = next_request history.append(response) except BaseException as exc: await response.aclose() raise exc finally: await auth_flow.aclose() async def _send_handling_redirects( self, request: Request, follow_redirects: bool, history: typing.List[Response], ) -> Response: while True: if len(history) > self.max_redirects: raise TooManyRedirects( "Exceeded maximum allowed redirects.", request=request ) for hook in self._event_hooks["request"]: await hook(request) response = await self._send_single_request(request) try: for hook in self._event_hooks["response"]: await hook(response) response.history = list(history) if not response.has_redirect_location: return response request = self._build_redirect_request(request, response) history = history + [response] if follow_redirects: await response.aread() else: response.next_request = request return response except BaseException as exc: await response.aclose() raise exc async def _send_single_request(self, request: Request) -> Response: """ Sends a single request, without handling any redirections. """ transport = self._transport_for_url(request.url) timer = Timer() await timer.async_start() if not isinstance(request.stream, AsyncByteStream): raise RuntimeError( "Attempted to send an sync request with an AsyncClient instance." ) with request_context(request=request): response = await transport.handle_async_request(request) assert isinstance(response.stream, AsyncByteStream) response.request = request response.stream = BoundAsyncStream( response.stream, response=response, timer=timer ) self.cookies.extract_cookies(response) response.default_encoding = self._default_encoding logger.info( 'HTTP Request: %s %s "%s %d %s"', request.method, request.url, response.http_version, response.status_code, response.reason_phrase, ) return response async def get( self, url: URLTypes, *, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault, None] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `GET` request. **Parameters**: See `httpx.request`. """ return await self.request( "GET", url, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) async def options( self, url: URLTypes, *, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send an `OPTIONS` request. **Parameters**: See `httpx.request`. """ return await self.request( "OPTIONS", url, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) async def head( self, url: URLTypes, *, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `HEAD` request. **Parameters**: See `httpx.request`. """ return await self.request( "HEAD", url, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) async def post( self, url: URLTypes, *, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `POST` request. **Parameters**: See `httpx.request`. """ return await self.request( "POST", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) async def put( self, url: URLTypes, *, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `PUT` request. **Parameters**: See `httpx.request`. """ return await self.request( "PUT", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) async def patch( self, url: URLTypes, *, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `PATCH` request. **Parameters**: See `httpx.request`. """ return await self.request( "PATCH", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) async def delete( self, url: URLTypes, *, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT, timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, extensions: typing.Optional[RequestExtensions] = None, ) -> Response: """ Send a `DELETE` request. **Parameters**: See `httpx.request`. """ return await self.request( "DELETE", url, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) async def aclose(self) -> None: """ Close transport and proxies. """ if self._state != ClientState.CLOSED: self._state = ClientState.CLOSED await self._transport.aclose() for proxy in self._mounts.values(): if proxy is not None: await proxy.aclose() async def __aenter__(self: U) -> U: if self._state != ClientState.UNOPENED: msg = { ClientState.OPENED: "Cannot open a client instance more than once.", ClientState.CLOSED: ( "Cannot reopen a client instance, once it has been closed." ), }[self._state] raise RuntimeError(msg) self._state = ClientState.OPENED await self._transport.__aenter__() for proxy in self._mounts.values(): if proxy is not None: await proxy.__aenter__() return self async def __aexit__( self, exc_type: typing.Optional[typing.Type[BaseException]] = None, exc_value: typing.Optional[BaseException] = None, traceback: typing.Optional[TracebackType] = None, ) -> None: self._state = ClientState.CLOSED await self._transport.__aexit__(exc_type, exc_value, traceback) for proxy in self._mounts.values(): if proxy is not None: await proxy.__aexit__(exc_type, exc_value, traceback) httpx-0.26.0/httpx/_compat.py000066400000000000000000000030331454054354600161220ustar00rootroot00000000000000""" The _compat module is used for code which requires branching between different Python environments. It is excluded from the code coverage checks. """ import ssl import sys # Brotli support is optional # The C bindings in `brotli` are recommended for CPython. # The CFFI bindings in `brotlicffi` are recommended for PyPy and everything else. try: import brotlicffi as brotli except ImportError: # pragma: no cover try: import brotli except ImportError: brotli = None if sys.version_info >= (3, 10) or ssl.OPENSSL_VERSION_INFO >= (1, 1, 0, 7): def set_minimum_tls_version_1_2(context: ssl.SSLContext) -> None: # The OP_NO_SSL* and OP_NO_TLS* become deprecated in favor of # 'SSLContext.minimum_version' from Python 3.7 onwards, however # this attribute is not available unless the ssl module is compiled # with OpenSSL 1.1.0g or newer. # https://docs.python.org/3.10/library/ssl.html#ssl.SSLContext.minimum_version # https://docs.python.org/3.7/library/ssl.html#ssl.SSLContext.minimum_version context.minimum_version = ssl.TLSVersion.TLSv1_2 else: def set_minimum_tls_version_1_2(context: ssl.SSLContext) -> None: # If 'minimum_version' isn't available, we configure these options with # the older deprecated variants. context.options |= ssl.OP_NO_SSLv2 context.options |= ssl.OP_NO_SSLv3 context.options |= ssl.OP_NO_TLSv1 context.options |= ssl.OP_NO_TLSv1_1 __all__ = ["brotli", "set_minimum_tls_version_1_2"] httpx-0.26.0/httpx/_config.py000066400000000000000000000301161454054354600161060ustar00rootroot00000000000000import logging import os import ssl import typing from pathlib import Path import certifi from ._compat import set_minimum_tls_version_1_2 from ._models import Headers from ._types import CertTypes, HeaderTypes, TimeoutTypes, URLTypes, VerifyTypes from ._urls import URL from ._utils import get_ca_bundle_from_env DEFAULT_CIPHERS = ":".join( [ "ECDHE+AESGCM", "ECDHE+CHACHA20", "DHE+AESGCM", "DHE+CHACHA20", "ECDH+AESGCM", "DH+AESGCM", "ECDH+AES", "DH+AES", "RSA+AESGCM", "RSA+AES", "!aNULL", "!eNULL", "!MD5", "!DSS", ] ) logger = logging.getLogger("httpx") class UnsetType: pass # pragma: no cover UNSET = UnsetType() def create_ssl_context( cert: typing.Optional[CertTypes] = None, verify: VerifyTypes = True, trust_env: bool = True, http2: bool = False, ) -> ssl.SSLContext: return SSLConfig( cert=cert, verify=verify, trust_env=trust_env, http2=http2 ).ssl_context class SSLConfig: """ SSL Configuration. """ DEFAULT_CA_BUNDLE_PATH = Path(certifi.where()) def __init__( self, *, cert: typing.Optional[CertTypes] = None, verify: VerifyTypes = True, trust_env: bool = True, http2: bool = False, ) -> None: self.cert = cert self.verify = verify self.trust_env = trust_env self.http2 = http2 self.ssl_context = self.load_ssl_context() def load_ssl_context(self) -> ssl.SSLContext: logger.debug( "load_ssl_context verify=%r cert=%r trust_env=%r http2=%r", self.verify, self.cert, self.trust_env, self.http2, ) if self.verify: return self.load_ssl_context_verify() return self.load_ssl_context_no_verify() def load_ssl_context_no_verify(self) -> ssl.SSLContext: """ Return an SSL context for unverified connections. """ context = self._create_default_ssl_context() context.check_hostname = False context.verify_mode = ssl.CERT_NONE self._load_client_certs(context) return context def load_ssl_context_verify(self) -> ssl.SSLContext: """ Return an SSL context for verified connections. """ if self.trust_env and self.verify is True: ca_bundle = get_ca_bundle_from_env() if ca_bundle is not None: self.verify = ca_bundle if isinstance(self.verify, ssl.SSLContext): # Allow passing in our own SSLContext object that's pre-configured. context = self.verify self._load_client_certs(context) return context elif isinstance(self.verify, bool): ca_bundle_path = self.DEFAULT_CA_BUNDLE_PATH elif Path(self.verify).exists(): ca_bundle_path = Path(self.verify) else: raise IOError( "Could not find a suitable TLS CA certificate bundle, " "invalid path: {}".format(self.verify) ) context = self._create_default_ssl_context() context.verify_mode = ssl.CERT_REQUIRED context.check_hostname = True # Signal to server support for PHA in TLS 1.3. Raises an # AttributeError if only read-only access is implemented. try: context.post_handshake_auth = True except AttributeError: # pragma: no cover pass # Disable using 'commonName' for SSLContext.check_hostname # when the 'subjectAltName' extension isn't available. try: context.hostname_checks_common_name = False except AttributeError: # pragma: no cover pass if ca_bundle_path.is_file(): cafile = str(ca_bundle_path) logger.debug("load_verify_locations cafile=%r", cafile) context.load_verify_locations(cafile=cafile) elif ca_bundle_path.is_dir(): capath = str(ca_bundle_path) logger.debug("load_verify_locations capath=%r", capath) context.load_verify_locations(capath=capath) self._load_client_certs(context) return context def _create_default_ssl_context(self) -> ssl.SSLContext: """ Creates the default SSLContext object that's used for both verified and unverified connections. """ context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) set_minimum_tls_version_1_2(context) context.options |= ssl.OP_NO_COMPRESSION context.set_ciphers(DEFAULT_CIPHERS) if ssl.HAS_ALPN: alpn_idents = ["http/1.1", "h2"] if self.http2 else ["http/1.1"] context.set_alpn_protocols(alpn_idents) keylogfile = os.environ.get("SSLKEYLOGFILE") if keylogfile and self.trust_env: context.keylog_filename = keylogfile return context def _load_client_certs(self, ssl_context: ssl.SSLContext) -> None: """ Loads client certificates into our SSLContext object """ if self.cert is not None: if isinstance(self.cert, str): ssl_context.load_cert_chain(certfile=self.cert) elif isinstance(self.cert, tuple) and len(self.cert) == 2: ssl_context.load_cert_chain(certfile=self.cert[0], keyfile=self.cert[1]) elif isinstance(self.cert, tuple) and len(self.cert) == 3: ssl_context.load_cert_chain( certfile=self.cert[0], keyfile=self.cert[1], password=self.cert[2], # type: ignore ) class Timeout: """ Timeout configuration. **Usage**: Timeout(None) # No timeouts. Timeout(5.0) # 5s timeout on all operations. Timeout(None, connect=5.0) # 5s timeout on connect, no other timeouts. Timeout(5.0, connect=10.0) # 10s timeout on connect. 5s timeout elsewhere. Timeout(5.0, pool=None) # No timeout on acquiring connection from pool. # 5s timeout elsewhere. """ def __init__( self, timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, *, connect: typing.Union[None, float, UnsetType] = UNSET, read: typing.Union[None, float, UnsetType] = UNSET, write: typing.Union[None, float, UnsetType] = UNSET, pool: typing.Union[None, float, UnsetType] = UNSET, ) -> None: if isinstance(timeout, Timeout): # Passed as a single explicit Timeout. assert connect is UNSET assert read is UNSET assert write is UNSET assert pool is UNSET self.connect = timeout.connect # type: typing.Optional[float] self.read = timeout.read # type: typing.Optional[float] self.write = timeout.write # type: typing.Optional[float] self.pool = timeout.pool # type: typing.Optional[float] elif isinstance(timeout, tuple): # Passed as a tuple. self.connect = timeout[0] self.read = timeout[1] self.write = None if len(timeout) < 3 else timeout[2] self.pool = None if len(timeout) < 4 else timeout[3] elif not ( isinstance(connect, UnsetType) or isinstance(read, UnsetType) or isinstance(write, UnsetType) or isinstance(pool, UnsetType) ): self.connect = connect self.read = read self.write = write self.pool = pool else: if isinstance(timeout, UnsetType): raise ValueError( "httpx.Timeout must either include a default, or set all " "four parameters explicitly." ) self.connect = timeout if isinstance(connect, UnsetType) else connect self.read = timeout if isinstance(read, UnsetType) else read self.write = timeout if isinstance(write, UnsetType) else write self.pool = timeout if isinstance(pool, UnsetType) else pool def as_dict(self) -> typing.Dict[str, typing.Optional[float]]: return { "connect": self.connect, "read": self.read, "write": self.write, "pool": self.pool, } def __eq__(self, other: typing.Any) -> bool: return ( isinstance(other, self.__class__) and self.connect == other.connect and self.read == other.read and self.write == other.write and self.pool == other.pool ) def __repr__(self) -> str: class_name = self.__class__.__name__ if len({self.connect, self.read, self.write, self.pool}) == 1: return f"{class_name}(timeout={self.connect})" return ( f"{class_name}(connect={self.connect}, " f"read={self.read}, write={self.write}, pool={self.pool})" ) class Limits: """ Configuration for limits to various client behaviors. **Parameters:** * **max_connections** - The maximum number of concurrent connections that may be established. * **max_keepalive_connections** - Allow the connection pool to maintain keep-alive connections below this point. Should be less than or equal to `max_connections`. * **keepalive_expiry** - Time limit on idle keep-alive connections in seconds. """ def __init__( self, *, max_connections: typing.Optional[int] = None, max_keepalive_connections: typing.Optional[int] = None, keepalive_expiry: typing.Optional[float] = 5.0, ) -> None: self.max_connections = max_connections self.max_keepalive_connections = max_keepalive_connections self.keepalive_expiry = keepalive_expiry def __eq__(self, other: typing.Any) -> bool: return ( isinstance(other, self.__class__) and self.max_connections == other.max_connections and self.max_keepalive_connections == other.max_keepalive_connections and self.keepalive_expiry == other.keepalive_expiry ) def __repr__(self) -> str: class_name = self.__class__.__name__ return ( f"{class_name}(max_connections={self.max_connections}, " f"max_keepalive_connections={self.max_keepalive_connections}, " f"keepalive_expiry={self.keepalive_expiry})" ) class Proxy: def __init__( self, url: URLTypes, *, ssl_context: typing.Optional[ssl.SSLContext] = None, auth: typing.Optional[typing.Tuple[str, str]] = None, headers: typing.Optional[HeaderTypes] = None, ) -> None: url = URL(url) headers = Headers(headers) if url.scheme not in ("http", "https", "socks5"): raise ValueError(f"Unknown scheme for proxy URL {url!r}") if url.username or url.password: # Remove any auth credentials from the URL. auth = (url.username, url.password) url = url.copy_with(username=None, password=None) self.url = url self.auth = auth self.headers = headers self.ssl_context = ssl_context @property def raw_auth(self) -> typing.Optional[typing.Tuple[bytes, bytes]]: # The proxy authentication as raw bytes. return ( None if self.auth is None else (self.auth[0].encode("utf-8"), self.auth[1].encode("utf-8")) ) def __repr__(self) -> str: # The authentication is represented with the password component masked. auth = (self.auth[0], "********") if self.auth else None # Build a nice concise representation. url_str = f"{str(self.url)!r}" auth_str = f", auth={auth!r}" if auth else "" headers_str = f", headers={dict(self.headers)!r}" if self.headers else "" return f"Proxy({url_str}{auth_str}{headers_str})" DEFAULT_TIMEOUT_CONFIG = Timeout(timeout=5.0) DEFAULT_LIMITS = Limits(max_connections=100, max_keepalive_connections=20) DEFAULT_MAX_REDIRECTS = 20 httpx-0.26.0/httpx/_content.py000066400000000000000000000176551454054354600163300ustar00rootroot00000000000000import inspect import warnings from json import dumps as json_dumps from typing import ( Any, AsyncIterable, AsyncIterator, Dict, Iterable, Iterator, Mapping, Optional, Tuple, Union, ) from urllib.parse import urlencode from ._exceptions import StreamClosed, StreamConsumed from ._multipart import MultipartStream from ._types import ( AsyncByteStream, RequestContent, RequestData, RequestFiles, ResponseContent, SyncByteStream, ) from ._utils import peek_filelike_length, primitive_value_to_str class ByteStream(AsyncByteStream, SyncByteStream): def __init__(self, stream: bytes) -> None: self._stream = stream def __iter__(self) -> Iterator[bytes]: yield self._stream async def __aiter__(self) -> AsyncIterator[bytes]: yield self._stream class IteratorByteStream(SyncByteStream): CHUNK_SIZE = 65_536 def __init__(self, stream: Iterable[bytes]) -> None: self._stream = stream self._is_stream_consumed = False self._is_generator = inspect.isgenerator(stream) def __iter__(self) -> Iterator[bytes]: if self._is_stream_consumed and self._is_generator: raise StreamConsumed() self._is_stream_consumed = True if hasattr(self._stream, "read"): # File-like interfaces should use 'read' directly. chunk = self._stream.read(self.CHUNK_SIZE) while chunk: yield chunk chunk = self._stream.read(self.CHUNK_SIZE) else: # Otherwise iterate. for part in self._stream: yield part class AsyncIteratorByteStream(AsyncByteStream): CHUNK_SIZE = 65_536 def __init__(self, stream: AsyncIterable[bytes]) -> None: self._stream = stream self._is_stream_consumed = False self._is_generator = inspect.isasyncgen(stream) async def __aiter__(self) -> AsyncIterator[bytes]: if self._is_stream_consumed and self._is_generator: raise StreamConsumed() self._is_stream_consumed = True if hasattr(self._stream, "aread"): # File-like interfaces should use 'aread' directly. chunk = await self._stream.aread(self.CHUNK_SIZE) while chunk: yield chunk chunk = await self._stream.aread(self.CHUNK_SIZE) else: # Otherwise iterate. async for part in self._stream: yield part class UnattachedStream(AsyncByteStream, SyncByteStream): """ If a request or response is serialized using pickle, then it is no longer attached to a stream for I/O purposes. Any stream operations should result in `httpx.StreamClosed`. """ def __iter__(self) -> Iterator[bytes]: raise StreamClosed() async def __aiter__(self) -> AsyncIterator[bytes]: raise StreamClosed() yield b"" # pragma: no cover def encode_content( content: Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]], ) -> Tuple[Dict[str, str], Union[SyncByteStream, AsyncByteStream]]: if isinstance(content, (bytes, str)): body = content.encode("utf-8") if isinstance(content, str) else content content_length = len(body) headers = {"Content-Length": str(content_length)} if body else {} return headers, ByteStream(body) elif isinstance(content, Iterable) and not isinstance(content, dict): # `not isinstance(content, dict)` is a bit oddly specific, but it # catches a case that's easy for users to make in error, and would # otherwise pass through here, like any other bytes-iterable, # because `dict` happens to be iterable. See issue #2491. content_length_or_none = peek_filelike_length(content) if content_length_or_none is None: headers = {"Transfer-Encoding": "chunked"} else: headers = {"Content-Length": str(content_length_or_none)} return headers, IteratorByteStream(content) # type: ignore elif isinstance(content, AsyncIterable): headers = {"Transfer-Encoding": "chunked"} return headers, AsyncIteratorByteStream(content) raise TypeError(f"Unexpected type for 'content', {type(content)!r}") def encode_urlencoded_data( data: RequestData, ) -> Tuple[Dict[str, str], ByteStream]: plain_data = [] for key, value in data.items(): if isinstance(value, (list, tuple)): plain_data.extend([(key, primitive_value_to_str(item)) for item in value]) else: plain_data.append((key, primitive_value_to_str(value))) body = urlencode(plain_data, doseq=True).encode("utf-8") content_length = str(len(body)) content_type = "application/x-www-form-urlencoded" headers = {"Content-Length": content_length, "Content-Type": content_type} return headers, ByteStream(body) def encode_multipart_data( data: RequestData, files: RequestFiles, boundary: Optional[bytes] ) -> Tuple[Dict[str, str], MultipartStream]: multipart = MultipartStream(data=data, files=files, boundary=boundary) headers = multipart.get_headers() return headers, multipart def encode_text(text: str) -> Tuple[Dict[str, str], ByteStream]: body = text.encode("utf-8") content_length = str(len(body)) content_type = "text/plain; charset=utf-8" headers = {"Content-Length": content_length, "Content-Type": content_type} return headers, ByteStream(body) def encode_html(html: str) -> Tuple[Dict[str, str], ByteStream]: body = html.encode("utf-8") content_length = str(len(body)) content_type = "text/html; charset=utf-8" headers = {"Content-Length": content_length, "Content-Type": content_type} return headers, ByteStream(body) def encode_json(json: Any) -> Tuple[Dict[str, str], ByteStream]: body = json_dumps(json).encode("utf-8") content_length = str(len(body)) content_type = "application/json" headers = {"Content-Length": content_length, "Content-Type": content_type} return headers, ByteStream(body) def encode_request( content: Optional[RequestContent] = None, data: Optional[RequestData] = None, files: Optional[RequestFiles] = None, json: Optional[Any] = None, boundary: Optional[bytes] = None, ) -> Tuple[Dict[str, str], Union[SyncByteStream, AsyncByteStream]]: """ Handles encoding the given `content`, `data`, `files`, and `json`, returning a two-tuple of (, ). """ if data is not None and not isinstance(data, Mapping): # We prefer to separate `content=` # for raw request content, and `data=
` for url encoded or # multipart form content. # # However for compat with requests, we *do* still support # `data=` usages. We deal with that case here, treating it # as if `content=<...>` had been supplied instead. message = "Use 'content=<...>' to upload raw bytes/text content." warnings.warn(message, DeprecationWarning) return encode_content(data) if content is not None: return encode_content(content) elif files: return encode_multipart_data(data or {}, files, boundary) elif data: return encode_urlencoded_data(data) elif json is not None: return encode_json(json) return {}, ByteStream(b"") def encode_response( content: Optional[ResponseContent] = None, text: Optional[str] = None, html: Optional[str] = None, json: Optional[Any] = None, ) -> Tuple[Dict[str, str], Union[SyncByteStream, AsyncByteStream]]: """ Handles encoding the given `content`, returning a two-tuple of (, ). """ if content is not None: return encode_content(content) elif text is not None: return encode_text(text) elif html is not None: return encode_html(html) elif json is not None: return encode_json(json) return {}, ByteStream(b"") httpx-0.26.0/httpx/_decoders.py000066400000000000000000000233211454054354600164310ustar00rootroot00000000000000""" Handlers for Content-Encoding. See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding """ import codecs import io import typing import zlib from ._compat import brotli from ._exceptions import DecodingError class ContentDecoder: def decode(self, data: bytes) -> bytes: raise NotImplementedError() # pragma: no cover def flush(self) -> bytes: raise NotImplementedError() # pragma: no cover class IdentityDecoder(ContentDecoder): """ Handle unencoded data. """ def decode(self, data: bytes) -> bytes: return data def flush(self) -> bytes: return b"" class DeflateDecoder(ContentDecoder): """ Handle 'deflate' decoding. See: https://stackoverflow.com/questions/1838699 """ def __init__(self) -> None: self.first_attempt = True self.decompressor = zlib.decompressobj() def decode(self, data: bytes) -> bytes: was_first_attempt = self.first_attempt self.first_attempt = False try: return self.decompressor.decompress(data) except zlib.error as exc: if was_first_attempt: self.decompressor = zlib.decompressobj(-zlib.MAX_WBITS) return self.decode(data) raise DecodingError(str(exc)) from exc def flush(self) -> bytes: try: return self.decompressor.flush() except zlib.error as exc: # pragma: no cover raise DecodingError(str(exc)) from exc class GZipDecoder(ContentDecoder): """ Handle 'gzip' decoding. See: https://stackoverflow.com/questions/1838699 """ def __init__(self) -> None: self.decompressor = zlib.decompressobj(zlib.MAX_WBITS | 16) def decode(self, data: bytes) -> bytes: try: return self.decompressor.decompress(data) except zlib.error as exc: raise DecodingError(str(exc)) from exc def flush(self) -> bytes: try: return self.decompressor.flush() except zlib.error as exc: # pragma: no cover raise DecodingError(str(exc)) from exc class BrotliDecoder(ContentDecoder): """ Handle 'brotli' decoding. Requires `pip install brotlipy`. See: https://brotlipy.readthedocs.io/ or `pip install brotli`. See https://github.com/google/brotli Supports both 'brotlipy' and 'Brotli' packages since they share an import name. The top branches are for 'brotlipy' and bottom branches for 'Brotli' """ def __init__(self) -> None: if brotli is None: # pragma: no cover raise ImportError( "Using 'BrotliDecoder', but neither of the 'brotlicffi' or 'brotli' " "packages have been installed. " "Make sure to install httpx using `pip install httpx[brotli]`." ) from None self.decompressor = brotli.Decompressor() self.seen_data = False self._decompress: typing.Callable[[bytes], bytes] if hasattr(self.decompressor, "decompress"): # The 'brotlicffi' package. self._decompress = self.decompressor.decompress # pragma: no cover else: # The 'brotli' package. self._decompress = self.decompressor.process # pragma: no cover def decode(self, data: bytes) -> bytes: if not data: return b"" self.seen_data = True try: return self._decompress(data) except brotli.error as exc: raise DecodingError(str(exc)) from exc def flush(self) -> bytes: if not self.seen_data: return b"" try: if hasattr(self.decompressor, "finish"): # Only available in the 'brotlicffi' package. # As the decompressor decompresses eagerly, this # will never actually emit any data. However, it will potentially throw # errors if a truncated or damaged data stream has been used. self.decompressor.finish() # pragma: no cover return b"" except brotli.error as exc: # pragma: no cover raise DecodingError(str(exc)) from exc class MultiDecoder(ContentDecoder): """ Handle the case where multiple encodings have been applied. """ def __init__(self, children: typing.Sequence[ContentDecoder]) -> None: """ 'children' should be a sequence of decoders in the order in which each was applied. """ # Note that we reverse the order for decoding. self.children = list(reversed(children)) def decode(self, data: bytes) -> bytes: for child in self.children: data = child.decode(data) return data def flush(self) -> bytes: data = b"" for child in self.children: data = child.decode(data) + child.flush() return data class ByteChunker: """ Handles returning byte content in fixed-size chunks. """ def __init__(self, chunk_size: typing.Optional[int] = None) -> None: self._buffer = io.BytesIO() self._chunk_size = chunk_size def decode(self, content: bytes) -> typing.List[bytes]: if self._chunk_size is None: return [content] if content else [] self._buffer.write(content) if self._buffer.tell() >= self._chunk_size: value = self._buffer.getvalue() chunks = [ value[i : i + self._chunk_size] for i in range(0, len(value), self._chunk_size) ] if len(chunks[-1]) == self._chunk_size: self._buffer.seek(0) self._buffer.truncate() return chunks else: self._buffer.seek(0) self._buffer.write(chunks[-1]) self._buffer.truncate() return chunks[:-1] else: return [] def flush(self) -> typing.List[bytes]: value = self._buffer.getvalue() self._buffer.seek(0) self._buffer.truncate() return [value] if value else [] class TextChunker: """ Handles returning text content in fixed-size chunks. """ def __init__(self, chunk_size: typing.Optional[int] = None) -> None: self._buffer = io.StringIO() self._chunk_size = chunk_size def decode(self, content: str) -> typing.List[str]: if self._chunk_size is None: return [content] if content else [] self._buffer.write(content) if self._buffer.tell() >= self._chunk_size: value = self._buffer.getvalue() chunks = [ value[i : i + self._chunk_size] for i in range(0, len(value), self._chunk_size) ] if len(chunks[-1]) == self._chunk_size: self._buffer.seek(0) self._buffer.truncate() return chunks else: self._buffer.seek(0) self._buffer.write(chunks[-1]) self._buffer.truncate() return chunks[:-1] else: return [] def flush(self) -> typing.List[str]: value = self._buffer.getvalue() self._buffer.seek(0) self._buffer.truncate() return [value] if value else [] class TextDecoder: """ Handles incrementally decoding bytes into text """ def __init__(self, encoding: str = "utf-8") -> None: self.decoder = codecs.getincrementaldecoder(encoding)(errors="replace") def decode(self, data: bytes) -> str: return self.decoder.decode(data) def flush(self) -> str: return self.decoder.decode(b"", True) class LineDecoder: """ Handles incrementally reading lines from text. Has the same behaviour as the stdllib splitlines, but handling the input iteratively. """ def __init__(self) -> None: self.buffer: typing.List[str] = [] self.trailing_cr: bool = False def decode(self, text: str) -> typing.List[str]: # See https://docs.python.org/3/library/stdtypes.html#str.splitlines NEWLINE_CHARS = "\n\r\x0b\x0c\x1c\x1d\x1e\x85\u2028\u2029" # We always push a trailing `\r` into the next decode iteration. if self.trailing_cr: text = "\r" + text self.trailing_cr = False if text.endswith("\r"): self.trailing_cr = True text = text[:-1] if not text: # NOTE: the edge case input of empty text doesn't occur in practice, # because other httpx internals filter out this value return [] # pragma: no cover trailing_newline = text[-1] in NEWLINE_CHARS lines = text.splitlines() if len(lines) == 1 and not trailing_newline: # No new lines, buffer the input and continue. self.buffer.append(lines[0]) return [] if self.buffer: # Include any existing buffer in the first portion of the # splitlines result. lines = ["".join(self.buffer) + lines[0]] + lines[1:] self.buffer = [] if not trailing_newline: # If the last segment of splitlines is not newline terminated, # then drop it from our output and start a new buffer. self.buffer = [lines.pop()] return lines def flush(self) -> typing.List[str]: if not self.buffer and not self.trailing_cr: return [] lines = ["".join(self.buffer)] self.buffer = [] self.trailing_cr = False return lines SUPPORTED_DECODERS = { "identity": IdentityDecoder, "gzip": GZipDecoder, "deflate": DeflateDecoder, "br": BrotliDecoder, } if brotli is None: SUPPORTED_DECODERS.pop("br") # pragma: no cover httpx-0.26.0/httpx/_exceptions.py000066400000000000000000000174261454054354600170330ustar00rootroot00000000000000""" Our exception hierarchy: * HTTPError x RequestError + TransportError - TimeoutException · ConnectTimeout · ReadTimeout · WriteTimeout · PoolTimeout - NetworkError · ConnectError · ReadError · WriteError · CloseError - ProtocolError · LocalProtocolError · RemoteProtocolError - ProxyError - UnsupportedProtocol + DecodingError + TooManyRedirects x HTTPStatusError * InvalidURL * CookieConflict * StreamError x StreamConsumed x StreamClosed x ResponseNotRead x RequestNotRead """ import contextlib import typing if typing.TYPE_CHECKING: from ._models import Request, Response # pragma: no cover class HTTPError(Exception): """ Base class for `RequestError` and `HTTPStatusError`. Useful for `try...except` blocks when issuing a request, and then calling `.raise_for_status()`. For example: ``` try: response = httpx.get("https://www.example.com") response.raise_for_status() except httpx.HTTPError as exc: print(f"HTTP Exception for {exc.request.url} - {exc}") ``` """ def __init__(self, message: str) -> None: super().__init__(message) self._request: typing.Optional["Request"] = None @property def request(self) -> "Request": if self._request is None: raise RuntimeError("The .request property has not been set.") return self._request @request.setter def request(self, request: "Request") -> None: self._request = request class RequestError(HTTPError): """ Base class for all exceptions that may occur when issuing a `.request()`. """ def __init__( self, message: str, *, request: typing.Optional["Request"] = None ) -> None: super().__init__(message) # At the point an exception is raised we won't typically have a request # instance to associate it with. # # The 'request_context' context manager is used within the Client and # Response methods in order to ensure that any raised exceptions # have a `.request` property set on them. self._request = request class TransportError(RequestError): """ Base class for all exceptions that occur at the level of the Transport API. """ # Timeout exceptions... class TimeoutException(TransportError): """ The base class for timeout errors. An operation has timed out. """ class ConnectTimeout(TimeoutException): """ Timed out while connecting to the host. """ class ReadTimeout(TimeoutException): """ Timed out while receiving data from the host. """ class WriteTimeout(TimeoutException): """ Timed out while sending data to the host. """ class PoolTimeout(TimeoutException): """ Timed out waiting to acquire a connection from the pool. """ # Core networking exceptions... class NetworkError(TransportError): """ The base class for network-related errors. An error occurred while interacting with the network. """ class ReadError(NetworkError): """ Failed to receive data from the network. """ class WriteError(NetworkError): """ Failed to send data through the network. """ class ConnectError(NetworkError): """ Failed to establish a connection. """ class CloseError(NetworkError): """ Failed to close a connection. """ # Other transport exceptions... class ProxyError(TransportError): """ An error occurred while establishing a proxy connection. """ class UnsupportedProtocol(TransportError): """ Attempted to make a request to an unsupported protocol. For example issuing a request to `ftp://www.example.com`. """ class ProtocolError(TransportError): """ The protocol was violated. """ class LocalProtocolError(ProtocolError): """ A protocol was violated by the client. For example if the user instantiated a `Request` instance explicitly, failed to include the mandatory `Host:` header, and then issued it directly using `client.send()`. """ class RemoteProtocolError(ProtocolError): """ The protocol was violated by the server. For example, returning malformed HTTP. """ # Other request exceptions... class DecodingError(RequestError): """ Decoding of the response failed, due to a malformed encoding. """ class TooManyRedirects(RequestError): """ Too many redirects. """ # Client errors class HTTPStatusError(HTTPError): """ The response had an error HTTP status of 4xx or 5xx. May be raised when calling `response.raise_for_status()` """ def __init__( self, message: str, *, request: "Request", response: "Response" ) -> None: super().__init__(message) self.request = request self.response = response class InvalidURL(Exception): """ URL is improperly formed or cannot be parsed. """ def __init__(self, message: str) -> None: super().__init__(message) class CookieConflict(Exception): """ Attempted to lookup a cookie by name, but multiple cookies existed. Can occur when calling `response.cookies.get(...)`. """ def __init__(self, message: str) -> None: super().__init__(message) # Stream exceptions... # These may occur as the result of a programming error, by accessing # the request/response stream in an invalid manner. class StreamError(RuntimeError): """ The base class for stream exceptions. The developer made an error in accessing the request stream in an invalid way. """ def __init__(self, message: str) -> None: super().__init__(message) class StreamConsumed(StreamError): """ Attempted to read or stream content, but the content has already been streamed. """ def __init__(self) -> None: message = ( "Attempted to read or stream some content, but the content has " "already been streamed. For requests, this could be due to passing " "a generator as request content, and then receiving a redirect " "response or a secondary request as part of an authentication flow." "For responses, this could be due to attempting to stream the response " "content more than once." ) super().__init__(message) class StreamClosed(StreamError): """ Attempted to read or stream response content, but the request has been closed. """ def __init__(self) -> None: message = ( "Attempted to read or stream content, but the stream has " "been closed." ) super().__init__(message) class ResponseNotRead(StreamError): """ Attempted to access streaming response content, without having called `read()`. """ def __init__(self) -> None: message = ( "Attempted to access streaming response content," " without having called `read()`." ) super().__init__(message) class RequestNotRead(StreamError): """ Attempted to access streaming request content, without having called `read()`. """ def __init__(self) -> None: message = ( "Attempted to access streaming request content," " without having called `read()`." ) super().__init__(message) @contextlib.contextmanager def request_context( request: typing.Optional["Request"] = None, ) -> typing.Iterator[None]: """ A context manager that can be used to attach the given request context to any `RequestError` exceptions that are raised within the block. """ try: yield except RequestError as exc: if request is not None: exc.request = request raise exc httpx-0.26.0/httpx/_main.py000066400000000000000000000366471454054354600156040ustar00rootroot00000000000000import functools import json import sys import typing import click import httpcore import pygments.lexers import pygments.util import rich.console import rich.markup import rich.progress import rich.syntax import rich.table from ._client import Client from ._exceptions import RequestError from ._models import Response from ._status_codes import codes def print_help() -> None: console = rich.console.Console() console.print("[bold]HTTPX :butterfly:", justify="center") console.print() console.print("A next generation HTTP client.", justify="center") console.print() console.print( "Usage: [bold]httpx[/bold] [cyan] [OPTIONS][/cyan] ", justify="left" ) console.print() table = rich.table.Table.grid(padding=1, pad_edge=True) table.add_column("Parameter", no_wrap=True, justify="left", style="bold") table.add_column("Description") table.add_row( "-m, --method [cyan]METHOD", "Request method, such as GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD.\n" "[Default: GET, or POST if a request body is included]", ) table.add_row( "-p, --params [cyan] ...", "Query parameters to include in the request URL.", ) table.add_row( "-c, --content [cyan]TEXT", "Byte content to include in the request body." ) table.add_row( "-d, --data [cyan] ...", "Form data to include in the request body." ) table.add_row( "-f, --files [cyan] ...", "Form files to include in the request body.", ) table.add_row("-j, --json [cyan]TEXT", "JSON data to include in the request body.") table.add_row( "-h, --headers [cyan] ...", "Include additional HTTP headers in the request.", ) table.add_row( "--cookies [cyan] ...", "Cookies to include in the request." ) table.add_row( "--auth [cyan]", "Username and password to include in the request. Specify '-' for the password" " to use a password prompt. Note that using --verbose/-v will expose" " the Authorization header, including the password encoding" " in a trivially reversible format.", ) table.add_row( "--proxy [cyan]URL", "Send the request via a proxy. Should be the URL giving the proxy address.", ) table.add_row( "--timeout [cyan]FLOAT", "Timeout value to use for network operations, such as establishing the" " connection, reading some data, etc... [Default: 5.0]", ) table.add_row("--follow-redirects", "Automatically follow redirects.") table.add_row("--no-verify", "Disable SSL verification.") table.add_row( "--http2", "Send the request using HTTP/2, if the remote server supports it." ) table.add_row( "--download [cyan]FILE", "Save the response content as a file, rather than displaying it.", ) table.add_row("-v, --verbose", "Verbose output. Show request as well as response.") table.add_row("--help", "Show this message and exit.") console.print(table) def get_lexer_for_response(response: Response) -> str: content_type = response.headers.get("Content-Type") if content_type is not None: mime_type, _, _ = content_type.partition(";") try: return typing.cast( str, pygments.lexers.get_lexer_for_mimetype(mime_type.strip()).name ) except pygments.util.ClassNotFound: # pragma: no cover pass return "" # pragma: no cover def format_request_headers(request: httpcore.Request, http2: bool = False) -> str: version = "HTTP/2" if http2 else "HTTP/1.1" headers = [ (name.lower() if http2 else name, value) for name, value in request.headers ] method = request.method.decode("ascii") target = request.url.target.decode("ascii") lines = [f"{method} {target} {version}"] + [ f"{name.decode('ascii')}: {value.decode('ascii')}" for name, value in headers ] return "\n".join(lines) def format_response_headers( http_version: bytes, status: int, reason_phrase: typing.Optional[bytes], headers: typing.List[typing.Tuple[bytes, bytes]], ) -> str: version = http_version.decode("ascii") reason = ( codes.get_reason_phrase(status) if reason_phrase is None else reason_phrase.decode("ascii") ) lines = [f"{version} {status} {reason}"] + [ f"{name.decode('ascii')}: {value.decode('ascii')}" for name, value in headers ] return "\n".join(lines) def print_request_headers(request: httpcore.Request, http2: bool = False) -> None: console = rich.console.Console() http_text = format_request_headers(request, http2=http2) syntax = rich.syntax.Syntax(http_text, "http", theme="ansi_dark", word_wrap=True) console.print(syntax) syntax = rich.syntax.Syntax("", "http", theme="ansi_dark", word_wrap=True) console.print(syntax) def print_response_headers( http_version: bytes, status: int, reason_phrase: typing.Optional[bytes], headers: typing.List[typing.Tuple[bytes, bytes]], ) -> None: console = rich.console.Console() http_text = format_response_headers(http_version, status, reason_phrase, headers) syntax = rich.syntax.Syntax(http_text, "http", theme="ansi_dark", word_wrap=True) console.print(syntax) syntax = rich.syntax.Syntax("", "http", theme="ansi_dark", word_wrap=True) console.print(syntax) def print_response(response: Response) -> None: console = rich.console.Console() lexer_name = get_lexer_for_response(response) if lexer_name: if lexer_name.lower() == "json": try: data = response.json() text = json.dumps(data, indent=4) except ValueError: # pragma: no cover text = response.text else: text = response.text syntax = rich.syntax.Syntax(text, lexer_name, theme="ansi_dark", word_wrap=True) console.print(syntax) else: console.print(f"<{len(response.content)} bytes of binary data>") _PCTRTT = typing.Tuple[typing.Tuple[str, str], ...] _PCTRTTT = typing.Tuple[_PCTRTT, ...] _PeerCertRetDictType = typing.Dict[str, typing.Union[str, _PCTRTTT, _PCTRTT]] def format_certificate(cert: _PeerCertRetDictType) -> str: # pragma: no cover lines = [] for key, value in cert.items(): if isinstance(value, (list, tuple)): lines.append(f"* {key}:") for item in value: if key in ("subject", "issuer"): for sub_item in item: lines.append(f"* {sub_item[0]}: {sub_item[1]!r}") elif isinstance(item, tuple) and len(item) == 2: lines.append(f"* {item[0]}: {item[1]!r}") else: lines.append(f"* {item!r}") else: lines.append(f"* {key}: {value!r}") return "\n".join(lines) def trace( name: str, info: typing.Mapping[str, typing.Any], verbose: bool = False ) -> None: console = rich.console.Console() if name == "connection.connect_tcp.started" and verbose: host = info["host"] console.print(f"* Connecting to {host!r}") elif name == "connection.connect_tcp.complete" and verbose: stream = info["return_value"] server_addr = stream.get_extra_info("server_addr") console.print(f"* Connected to {server_addr[0]!r} on port {server_addr[1]}") elif name == "connection.start_tls.complete" and verbose: # pragma: no cover stream = info["return_value"] ssl_object = stream.get_extra_info("ssl_object") version = ssl_object.version() cipher = ssl_object.cipher() server_cert = ssl_object.getpeercert() alpn = ssl_object.selected_alpn_protocol() console.print(f"* SSL established using {version!r} / {cipher[0]!r}") console.print(f"* Selected ALPN protocol: {alpn!r}") if server_cert: console.print("* Server certificate:") console.print(format_certificate(server_cert)) elif name == "http11.send_request_headers.started" and verbose: request = info["request"] print_request_headers(request, http2=False) elif name == "http2.send_request_headers.started" and verbose: # pragma: no cover request = info["request"] print_request_headers(request, http2=True) elif name == "http11.receive_response_headers.complete": http_version, status, reason_phrase, headers = info["return_value"] print_response_headers(http_version, status, reason_phrase, headers) elif name == "http2.receive_response_headers.complete": # pragma: no cover status, headers = info["return_value"] http_version = b"HTTP/2" reason_phrase = None print_response_headers(http_version, status, reason_phrase, headers) def download_response(response: Response, download: typing.BinaryIO) -> None: console = rich.console.Console() console.print() content_length = response.headers.get("Content-Length") with rich.progress.Progress( "[progress.description]{task.description}", "[progress.percentage]{task.percentage:>3.0f}%", rich.progress.BarColumn(bar_width=None), rich.progress.DownloadColumn(), rich.progress.TransferSpeedColumn(), ) as progress: description = f"Downloading [bold]{rich.markup.escape(download.name)}" download_task = progress.add_task( description, total=int(content_length or 0), start=content_length is not None, ) for chunk in response.iter_bytes(): download.write(chunk) progress.update(download_task, completed=response.num_bytes_downloaded) def validate_json( ctx: click.Context, param: typing.Union[click.Option, click.Parameter], value: typing.Any, ) -> typing.Any: if value is None: return None try: return json.loads(value) except json.JSONDecodeError: # pragma: no cover raise click.BadParameter("Not valid JSON") def validate_auth( ctx: click.Context, param: typing.Union[click.Option, click.Parameter], value: typing.Any, ) -> typing.Any: if value == (None, None): return None username, password = value if password == "-": # pragma: no cover password = click.prompt("Password", hide_input=True) return (username, password) def handle_help( ctx: click.Context, param: typing.Union[click.Option, click.Parameter], value: typing.Any, ) -> None: if not value or ctx.resilient_parsing: return print_help() ctx.exit() @click.command(add_help_option=False) @click.argument("url", type=str) @click.option( "--method", "-m", "method", type=str, help=( "Request method, such as GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD. " "[Default: GET, or POST if a request body is included]" ), ) @click.option( "--params", "-p", "params", type=(str, str), multiple=True, help="Query parameters to include in the request URL.", ) @click.option( "--content", "-c", "content", type=str, help="Byte content to include in the request body.", ) @click.option( "--data", "-d", "data", type=(str, str), multiple=True, help="Form data to include in the request body.", ) @click.option( "--files", "-f", "files", type=(str, click.File(mode="rb")), multiple=True, help="Form files to include in the request body.", ) @click.option( "--json", "-j", "json", type=str, callback=validate_json, help="JSON data to include in the request body.", ) @click.option( "--headers", "-h", "headers", type=(str, str), multiple=True, help="Include additional HTTP headers in the request.", ) @click.option( "--cookies", "cookies", type=(str, str), multiple=True, help="Cookies to include in the request.", ) @click.option( "--auth", "auth", type=(str, str), default=(None, None), callback=validate_auth, help=( "Username and password to include in the request. " "Specify '-' for the password to use a password prompt. " "Note that using --verbose/-v will expose the Authorization header, " "including the password encoding in a trivially reversible format." ), ) @click.option( "--proxy", "proxy", type=str, default=None, help="Send the request via a proxy. Should be the URL giving the proxy address.", ) @click.option( "--timeout", "timeout", type=float, default=5.0, help=( "Timeout value to use for network operations, such as establishing the " "connection, reading some data, etc... [Default: 5.0]" ), ) @click.option( "--follow-redirects", "follow_redirects", is_flag=True, default=False, help="Automatically follow redirects.", ) @click.option( "--no-verify", "verify", is_flag=True, default=True, help="Disable SSL verification.", ) @click.option( "--http2", "http2", type=bool, is_flag=True, default=False, help="Send the request using HTTP/2, if the remote server supports it.", ) @click.option( "--download", type=click.File("wb"), help="Save the response content as a file, rather than displaying it.", ) @click.option( "--verbose", "-v", type=bool, is_flag=True, default=False, help="Verbose. Show request as well as response.", ) @click.option( "--help", is_flag=True, is_eager=True, expose_value=False, callback=handle_help, help="Show this message and exit.", ) def main( url: str, method: str, params: typing.List[typing.Tuple[str, str]], content: str, data: typing.List[typing.Tuple[str, str]], files: typing.List[typing.Tuple[str, click.File]], json: str, headers: typing.List[typing.Tuple[str, str]], cookies: typing.List[typing.Tuple[str, str]], auth: typing.Optional[typing.Tuple[str, str]], proxy: str, timeout: float, follow_redirects: bool, verify: bool, http2: bool, download: typing.Optional[typing.BinaryIO], verbose: bool, ) -> None: """ An HTTP command line client. Sends a request and displays the response. """ if not method: method = "POST" if content or data or files or json else "GET" try: with Client( proxy=proxy, timeout=timeout, verify=verify, http2=http2, ) as client: with client.stream( method, url, params=list(params), content=content, data=dict(data), files=files, # type: ignore json=json, headers=headers, cookies=dict(cookies), auth=auth, follow_redirects=follow_redirects, extensions={"trace": functools.partial(trace, verbose=verbose)}, ) as response: if download is not None: download_response(response, download) else: response.read() if response.content: print_response(response) except RequestError as exc: console = rich.console.Console() console.print(f"[red]{type(exc).__name__}[/red]: {exc}") sys.exit(1) sys.exit(0 if response.is_success else 1) httpx-0.26.0/httpx/_models.py000066400000000000000000001237361454054354600161370ustar00rootroot00000000000000import datetime import email.message import json as jsonlib import typing import urllib.request from collections.abc import Mapping from http.cookiejar import Cookie, CookieJar from ._content import ByteStream, UnattachedStream, encode_request, encode_response from ._decoders import ( SUPPORTED_DECODERS, ByteChunker, ContentDecoder, IdentityDecoder, LineDecoder, MultiDecoder, TextChunker, TextDecoder, ) from ._exceptions import ( CookieConflict, HTTPStatusError, RequestNotRead, ResponseNotRead, StreamClosed, StreamConsumed, request_context, ) from ._multipart import get_multipart_boundary_from_content_type from ._status_codes import codes from ._types import ( AsyncByteStream, CookieTypes, HeaderTypes, QueryParamTypes, RequestContent, RequestData, RequestExtensions, RequestFiles, ResponseContent, ResponseExtensions, SyncByteStream, ) from ._urls import URL from ._utils import ( is_known_encoding, normalize_header_key, normalize_header_value, obfuscate_sensitive_headers, parse_content_type_charset, parse_header_links, ) class Headers(typing.MutableMapping[str, str]): """ HTTP headers, as a case-insensitive multi-dict. """ def __init__( self, headers: typing.Optional[HeaderTypes] = None, encoding: typing.Optional[str] = None, ) -> None: if headers is None: self._list = [] # type: typing.List[typing.Tuple[bytes, bytes, bytes]] elif isinstance(headers, Headers): self._list = list(headers._list) elif isinstance(headers, Mapping): self._list = [ ( normalize_header_key(k, lower=False, encoding=encoding), normalize_header_key(k, lower=True, encoding=encoding), normalize_header_value(v, encoding), ) for k, v in headers.items() ] else: self._list = [ ( normalize_header_key(k, lower=False, encoding=encoding), normalize_header_key(k, lower=True, encoding=encoding), normalize_header_value(v, encoding), ) for k, v in headers ] self._encoding = encoding @property def encoding(self) -> str: """ Header encoding is mandated as ascii, but we allow fallbacks to utf-8 or iso-8859-1. """ if self._encoding is None: for encoding in ["ascii", "utf-8"]: for key, value in self.raw: try: key.decode(encoding) value.decode(encoding) except UnicodeDecodeError: break else: # The else block runs if 'break' did not occur, meaning # all values fitted the encoding. self._encoding = encoding break else: # The ISO-8859-1 encoding covers all 256 code points in a byte, # so will never raise decode errors. self._encoding = "iso-8859-1" return self._encoding @encoding.setter def encoding(self, value: str) -> None: self._encoding = value @property def raw(self) -> typing.List[typing.Tuple[bytes, bytes]]: """ Returns a list of the raw header items, as byte pairs. """ return [(raw_key, value) for raw_key, _, value in self._list] def keys(self) -> typing.KeysView[str]: return {key.decode(self.encoding): None for _, key, value in self._list}.keys() def values(self) -> typing.ValuesView[str]: values_dict: typing.Dict[str, str] = {} for _, key, value in self._list: str_key = key.decode(self.encoding) str_value = value.decode(self.encoding) if str_key in values_dict: values_dict[str_key] += f", {str_value}" else: values_dict[str_key] = str_value return values_dict.values() def items(self) -> typing.ItemsView[str, str]: """ Return `(key, value)` items of headers. Concatenate headers into a single comma separated value when a key occurs multiple times. """ values_dict: typing.Dict[str, str] = {} for _, key, value in self._list: str_key = key.decode(self.encoding) str_value = value.decode(self.encoding) if str_key in values_dict: values_dict[str_key] += f", {str_value}" else: values_dict[str_key] = str_value return values_dict.items() def multi_items(self) -> typing.List[typing.Tuple[str, str]]: """ Return a list of `(key, value)` pairs of headers. Allow multiple occurrences of the same key without concatenating into a single comma separated value. """ return [ (key.decode(self.encoding), value.decode(self.encoding)) for _, key, value in self._list ] def get(self, key: str, default: typing.Any = None) -> typing.Any: """ Return a header value. If multiple occurrences of the header occur then concatenate them together with commas. """ try: return self[key] except KeyError: return default def get_list(self, key: str, split_commas: bool = False) -> typing.List[str]: """ Return a list of all header values for a given key. If `split_commas=True` is passed, then any comma separated header values are split into multiple return strings. """ get_header_key = key.lower().encode(self.encoding) values = [ item_value.decode(self.encoding) for _, item_key, item_value in self._list if item_key.lower() == get_header_key ] if not split_commas: return values split_values = [] for value in values: split_values.extend([item.strip() for item in value.split(",")]) return split_values def update(self, headers: typing.Optional[HeaderTypes] = None) -> None: # type: ignore headers = Headers(headers) for key in headers.keys(): if key in self: self.pop(key) self._list.extend(headers._list) def copy(self) -> "Headers": return Headers(self, encoding=self.encoding) def __getitem__(self, key: str) -> str: """ Return a single header value. If there are multiple headers with the same key, then we concatenate them with commas. See: https://tools.ietf.org/html/rfc7230#section-3.2.2 """ normalized_key = key.lower().encode(self.encoding) items = [ header_value.decode(self.encoding) for _, header_key, header_value in self._list if header_key == normalized_key ] if items: return ", ".join(items) raise KeyError(key) def __setitem__(self, key: str, value: str) -> None: """ Set the header `key` to `value`, removing any duplicate entries. Retains insertion order. """ set_key = key.encode(self._encoding or "utf-8") set_value = value.encode(self._encoding or "utf-8") lookup_key = set_key.lower() found_indexes = [ idx for idx, (_, item_key, _) in enumerate(self._list) if item_key == lookup_key ] for idx in reversed(found_indexes[1:]): del self._list[idx] if found_indexes: idx = found_indexes[0] self._list[idx] = (set_key, lookup_key, set_value) else: self._list.append((set_key, lookup_key, set_value)) def __delitem__(self, key: str) -> None: """ Remove the header `key`. """ del_key = key.lower().encode(self.encoding) pop_indexes = [ idx for idx, (_, item_key, _) in enumerate(self._list) if item_key.lower() == del_key ] if not pop_indexes: raise KeyError(key) for idx in reversed(pop_indexes): del self._list[idx] def __contains__(self, key: typing.Any) -> bool: header_key = key.lower().encode(self.encoding) return header_key in [key for _, key, _ in self._list] def __iter__(self) -> typing.Iterator[typing.Any]: return iter(self.keys()) def __len__(self) -> int: return len(self._list) def __eq__(self, other: typing.Any) -> bool: try: other_headers = Headers(other) except ValueError: return False self_list = [(key, value) for _, key, value in self._list] other_list = [(key, value) for _, key, value in other_headers._list] return sorted(self_list) == sorted(other_list) def __repr__(self) -> str: class_name = self.__class__.__name__ encoding_str = "" if self.encoding != "ascii": encoding_str = f", encoding={self.encoding!r}" as_list = list(obfuscate_sensitive_headers(self.multi_items())) as_dict = dict(as_list) no_duplicate_keys = len(as_dict) == len(as_list) if no_duplicate_keys: return f"{class_name}({as_dict!r}{encoding_str})" return f"{class_name}({as_list!r}{encoding_str})" class Request: def __init__( self, method: typing.Union[str, bytes], url: typing.Union["URL", str], *, params: typing.Optional[QueryParamTypes] = None, headers: typing.Optional[HeaderTypes] = None, cookies: typing.Optional[CookieTypes] = None, content: typing.Optional[RequestContent] = None, data: typing.Optional[RequestData] = None, files: typing.Optional[RequestFiles] = None, json: typing.Optional[typing.Any] = None, stream: typing.Union[SyncByteStream, AsyncByteStream, None] = None, extensions: typing.Optional[RequestExtensions] = None, ) -> None: self.method = ( method.decode("ascii").upper() if isinstance(method, bytes) else method.upper() ) self.url = URL(url) if params is not None: self.url = self.url.copy_merge_params(params=params) self.headers = Headers(headers) self.extensions = {} if extensions is None else extensions if cookies: Cookies(cookies).set_cookie_header(self) if stream is None: content_type: typing.Optional[str] = self.headers.get("content-type") headers, stream = encode_request( content=content, data=data, files=files, json=json, boundary=get_multipart_boundary_from_content_type( content_type=content_type.encode(self.headers.encoding) if content_type else None ), ) self._prepare(headers) self.stream = stream # Load the request body, except for streaming content. if isinstance(stream, ByteStream): self.read() else: # There's an important distinction between `Request(content=...)`, # and `Request(stream=...)`. # # Using `content=...` implies automatically populated `Host` and content # headers, of either `Content-Length: ...` or `Transfer-Encoding: chunked`. # # Using `stream=...` will not automatically include *any* # auto-populated headers. # # As an end-user you don't really need `stream=...`. It's only # useful when: # # * Preserving the request stream when copying requests, eg for redirects. # * Creating request instances on the *server-side* of the transport API. self.stream = stream def _prepare(self, default_headers: typing.Dict[str, str]) -> None: for key, value in default_headers.items(): # Ignore Transfer-Encoding if the Content-Length has been set explicitly. if key.lower() == "transfer-encoding" and "Content-Length" in self.headers: continue self.headers.setdefault(key, value) auto_headers: typing.List[typing.Tuple[bytes, bytes]] = [] has_host = "Host" in self.headers has_content_length = ( "Content-Length" in self.headers or "Transfer-Encoding" in self.headers ) if not has_host and self.url.host: auto_headers.append((b"Host", self.url.netloc)) if not has_content_length and self.method in ("POST", "PUT", "PATCH"): auto_headers.append((b"Content-Length", b"0")) self.headers = Headers(auto_headers + self.headers.raw) @property def content(self) -> bytes: if not hasattr(self, "_content"): raise RequestNotRead() return self._content def read(self) -> bytes: """ Read and return the request content. """ if not hasattr(self, "_content"): assert isinstance(self.stream, typing.Iterable) self._content = b"".join(self.stream) if not isinstance(self.stream, ByteStream): # If a streaming request has been read entirely into memory, then # we can replace the stream with a raw bytes implementation, # to ensure that any non-replayable streams can still be used. self.stream = ByteStream(self._content) return self._content async def aread(self) -> bytes: """ Read and return the request content. """ if not hasattr(self, "_content"): assert isinstance(self.stream, typing.AsyncIterable) self._content = b"".join([part async for part in self.stream]) if not isinstance(self.stream, ByteStream): # If a streaming request has been read entirely into memory, then # we can replace the stream with a raw bytes implementation, # to ensure that any non-replayable streams can still be used. self.stream = ByteStream(self._content) return self._content def __repr__(self) -> str: class_name = self.__class__.__name__ url = str(self.url) return f"<{class_name}({self.method!r}, {url!r})>" def __getstate__(self) -> typing.Dict[str, typing.Any]: return { name: value for name, value in self.__dict__.items() if name not in ["extensions", "stream"] } def __setstate__(self, state: typing.Dict[str, typing.Any]) -> None: for name, value in state.items(): setattr(self, name, value) self.extensions = {} self.stream = UnattachedStream() class Response: def __init__( self, status_code: int, *, headers: typing.Optional[HeaderTypes] = None, content: typing.Optional[ResponseContent] = None, text: typing.Optional[str] = None, html: typing.Optional[str] = None, json: typing.Any = None, stream: typing.Union[SyncByteStream, AsyncByteStream, None] = None, request: typing.Optional[Request] = None, extensions: typing.Optional[ResponseExtensions] = None, history: typing.Optional[typing.List["Response"]] = None, default_encoding: typing.Union[str, typing.Callable[[bytes], str]] = "utf-8", ) -> None: self.status_code = status_code self.headers = Headers(headers) self._request: typing.Optional[Request] = request # When follow_redirects=False and a redirect is received, # the client will set `response.next_request`. self.next_request: typing.Optional[Request] = None self.extensions: ResponseExtensions = {} if extensions is None else extensions self.history = [] if history is None else list(history) self.is_closed = False self.is_stream_consumed = False self.default_encoding = default_encoding if stream is None: headers, stream = encode_response(content, text, html, json) self._prepare(headers) self.stream = stream if isinstance(stream, ByteStream): # Load the response body, except for streaming content. self.read() else: # There's an important distinction between `Response(content=...)`, # and `Response(stream=...)`. # # Using `content=...` implies automatically populated content headers, # of either `Content-Length: ...` or `Transfer-Encoding: chunked`. # # Using `stream=...` will not automatically include any content headers. # # As an end-user you don't really need `stream=...`. It's only # useful when creating response instances having received a stream # from the transport API. self.stream = stream self._num_bytes_downloaded = 0 def _prepare(self, default_headers: typing.Dict[str, str]) -> None: for key, value in default_headers.items(): # Ignore Transfer-Encoding if the Content-Length has been set explicitly. if key.lower() == "transfer-encoding" and "content-length" in self.headers: continue self.headers.setdefault(key, value) @property def elapsed(self) -> datetime.timedelta: """ Returns the time taken for the complete request/response cycle to complete. """ if not hasattr(self, "_elapsed"): raise RuntimeError( "'.elapsed' may only be accessed after the response " "has been read or closed." ) return self._elapsed @elapsed.setter def elapsed(self, elapsed: datetime.timedelta) -> None: self._elapsed = elapsed @property def request(self) -> Request: """ Returns the request instance associated to the current response. """ if self._request is None: raise RuntimeError( "The request instance has not been set on this response." ) return self._request @request.setter def request(self, value: Request) -> None: self._request = value @property def http_version(self) -> str: try: http_version: bytes = self.extensions["http_version"] except KeyError: return "HTTP/1.1" else: return http_version.decode("ascii", errors="ignore") @property def reason_phrase(self) -> str: try: reason_phrase: bytes = self.extensions["reason_phrase"] except KeyError: return codes.get_reason_phrase(self.status_code) else: return reason_phrase.decode("ascii", errors="ignore") @property def url(self) -> URL: """ Returns the URL for which the request was made. """ return self.request.url @property def content(self) -> bytes: if not hasattr(self, "_content"): raise ResponseNotRead() return self._content @property def text(self) -> str: if not hasattr(self, "_text"): content = self.content if not content: self._text = "" else: decoder = TextDecoder(encoding=self.encoding or "utf-8") self._text = "".join([decoder.decode(self.content), decoder.flush()]) return self._text @property def encoding(self) -> typing.Optional[str]: """ Return an encoding to use for decoding the byte content into text. The priority for determining this is given by... * `.encoding = <>` has been set explicitly. * The encoding as specified by the charset parameter in the Content-Type header. * The encoding as determined by `default_encoding`, which may either be a string like "utf-8" indicating the encoding to use, or may be a callable which enables charset autodetection. """ if not hasattr(self, "_encoding"): encoding = self.charset_encoding if encoding is None or not is_known_encoding(encoding): if isinstance(self.default_encoding, str): encoding = self.default_encoding elif hasattr(self, "_content"): encoding = self.default_encoding(self._content) self._encoding = encoding or "utf-8" return self._encoding @encoding.setter def encoding(self, value: str) -> None: """ Set the encoding to use for decoding the byte content into text. If the `text` attribute has been accessed, attempting to set the encoding will throw a ValueError. """ if hasattr(self, "_text"): raise ValueError( "Setting encoding after `text` has been accessed is not allowed." ) self._encoding = value @property def charset_encoding(self) -> typing.Optional[str]: """ Return the encoding, as specified by the Content-Type header. """ content_type = self.headers.get("Content-Type") if content_type is None: return None return parse_content_type_charset(content_type) def _get_content_decoder(self) -> ContentDecoder: """ Returns a decoder instance which can be used to decode the raw byte content, depending on the Content-Encoding used in the response. """ if not hasattr(self, "_decoder"): decoders: typing.List[ContentDecoder] = [] values = self.headers.get_list("content-encoding", split_commas=True) for value in values: value = value.strip().lower() try: decoder_cls = SUPPORTED_DECODERS[value] decoders.append(decoder_cls()) except KeyError: continue if len(decoders) == 1: self._decoder = decoders[0] elif len(decoders) > 1: self._decoder = MultiDecoder(children=decoders) else: self._decoder = IdentityDecoder() return self._decoder @property def is_informational(self) -> bool: """ A property which is `True` for 1xx status codes, `False` otherwise. """ return codes.is_informational(self.status_code) @property def is_success(self) -> bool: """ A property which is `True` for 2xx status codes, `False` otherwise. """ return codes.is_success(self.status_code) @property def is_redirect(self) -> bool: """ A property which is `True` for 3xx status codes, `False` otherwise. Note that not all responses with a 3xx status code indicate a URL redirect. Use `response.has_redirect_location` to determine responses with a properly formed URL redirection. """ return codes.is_redirect(self.status_code) @property def is_client_error(self) -> bool: """ A property which is `True` for 4xx status codes, `False` otherwise. """ return codes.is_client_error(self.status_code) @property def is_server_error(self) -> bool: """ A property which is `True` for 5xx status codes, `False` otherwise. """ return codes.is_server_error(self.status_code) @property def is_error(self) -> bool: """ A property which is `True` for 4xx and 5xx status codes, `False` otherwise. """ return codes.is_error(self.status_code) @property def has_redirect_location(self) -> bool: """ Returns True for 3xx responses with a properly formed URL redirection, `False` otherwise. """ return ( self.status_code in ( # 301 (Cacheable redirect. Method may change to GET.) codes.MOVED_PERMANENTLY, # 302 (Uncacheable redirect. Method may change to GET.) codes.FOUND, # 303 (Client should make a GET or HEAD request.) codes.SEE_OTHER, # 307 (Equiv. 302, but retain method) codes.TEMPORARY_REDIRECT, # 308 (Equiv. 301, but retain method) codes.PERMANENT_REDIRECT, ) and "Location" in self.headers ) def raise_for_status(self) -> "Response": """ Raise the `HTTPStatusError` if one occurred. """ request = self._request if request is None: raise RuntimeError( "Cannot call `raise_for_status` as the request " "instance has not been set on this response." ) if self.is_success: return self if self.has_redirect_location: message = ( "{error_type} '{0.status_code} {0.reason_phrase}' for url '{0.url}'\n" "Redirect location: '{0.headers[location]}'\n" "For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/{0.status_code}" ) else: message = ( "{error_type} '{0.status_code} {0.reason_phrase}' for url '{0.url}'\n" "For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/{0.status_code}" ) status_class = self.status_code // 100 error_types = { 1: "Informational response", 3: "Redirect response", 4: "Client error", 5: "Server error", } error_type = error_types.get(status_class, "Invalid status code") message = message.format(self, error_type=error_type) raise HTTPStatusError(message, request=request, response=self) def json(self, **kwargs: typing.Any) -> typing.Any: return jsonlib.loads(self.content, **kwargs) @property def cookies(self) -> "Cookies": if not hasattr(self, "_cookies"): self._cookies = Cookies() self._cookies.extract_cookies(self) return self._cookies @property def links(self) -> typing.Dict[typing.Optional[str], typing.Dict[str, str]]: """ Returns the parsed header links of the response, if any """ header = self.headers.get("link") ldict = {} if header: links = parse_header_links(header) for link in links: key = link.get("rel") or link.get("url") ldict[key] = link return ldict @property def num_bytes_downloaded(self) -> int: return self._num_bytes_downloaded def __repr__(self) -> str: return f"" def __getstate__(self) -> typing.Dict[str, typing.Any]: return { name: value for name, value in self.__dict__.items() if name not in ["extensions", "stream", "is_closed", "_decoder"] } def __setstate__(self, state: typing.Dict[str, typing.Any]) -> None: for name, value in state.items(): setattr(self, name, value) self.is_closed = True self.extensions = {} self.stream = UnattachedStream() def read(self) -> bytes: """ Read and return the response content. """ if not hasattr(self, "_content"): self._content = b"".join(self.iter_bytes()) return self._content def iter_bytes( self, chunk_size: typing.Optional[int] = None ) -> typing.Iterator[bytes]: """ A byte-iterator over the decoded response content. This allows us to handle gzip, deflate, and brotli encoded responses. """ if hasattr(self, "_content"): chunk_size = len(self._content) if chunk_size is None else chunk_size for i in range(0, len(self._content), max(chunk_size, 1)): yield self._content[i : i + chunk_size] else: decoder = self._get_content_decoder() chunker = ByteChunker(chunk_size=chunk_size) with request_context(request=self._request): for raw_bytes in self.iter_raw(): decoded = decoder.decode(raw_bytes) for chunk in chunker.decode(decoded): yield chunk decoded = decoder.flush() for chunk in chunker.decode(decoded): yield chunk # pragma: no cover for chunk in chunker.flush(): yield chunk def iter_text( self, chunk_size: typing.Optional[int] = None ) -> typing.Iterator[str]: """ A str-iterator over the decoded response content that handles both gzip, deflate, etc but also detects the content's string encoding. """ decoder = TextDecoder(encoding=self.encoding or "utf-8") chunker = TextChunker(chunk_size=chunk_size) with request_context(request=self._request): for byte_content in self.iter_bytes(): text_content = decoder.decode(byte_content) for chunk in chunker.decode(text_content): yield chunk text_content = decoder.flush() for chunk in chunker.decode(text_content): yield chunk # pragma: no cover for chunk in chunker.flush(): yield chunk def iter_lines(self) -> typing.Iterator[str]: decoder = LineDecoder() with request_context(request=self._request): for text in self.iter_text(): for line in decoder.decode(text): yield line for line in decoder.flush(): yield line def iter_raw( self, chunk_size: typing.Optional[int] = None ) -> typing.Iterator[bytes]: """ A byte-iterator over the raw response content. """ if self.is_stream_consumed: raise StreamConsumed() if self.is_closed: raise StreamClosed() if not isinstance(self.stream, SyncByteStream): raise RuntimeError("Attempted to call a sync iterator on an async stream.") self.is_stream_consumed = True self._num_bytes_downloaded = 0 chunker = ByteChunker(chunk_size=chunk_size) with request_context(request=self._request): for raw_stream_bytes in self.stream: self._num_bytes_downloaded += len(raw_stream_bytes) for chunk in chunker.decode(raw_stream_bytes): yield chunk for chunk in chunker.flush(): yield chunk self.close() def close(self) -> None: """ Close the response and release the connection. Automatically called if the response body is read to completion. """ if not isinstance(self.stream, SyncByteStream): raise RuntimeError("Attempted to call an sync close on an async stream.") if not self.is_closed: self.is_closed = True with request_context(request=self._request): self.stream.close() async def aread(self) -> bytes: """ Read and return the response content. """ if not hasattr(self, "_content"): self._content = b"".join([part async for part in self.aiter_bytes()]) return self._content async def aiter_bytes( self, chunk_size: typing.Optional[int] = None ) -> typing.AsyncIterator[bytes]: """ A byte-iterator over the decoded response content. This allows us to handle gzip, deflate, and brotli encoded responses. """ if hasattr(self, "_content"): chunk_size = len(self._content) if chunk_size is None else chunk_size for i in range(0, len(self._content), max(chunk_size, 1)): yield self._content[i : i + chunk_size] else: decoder = self._get_content_decoder() chunker = ByteChunker(chunk_size=chunk_size) with request_context(request=self._request): async for raw_bytes in self.aiter_raw(): decoded = decoder.decode(raw_bytes) for chunk in chunker.decode(decoded): yield chunk decoded = decoder.flush() for chunk in chunker.decode(decoded): yield chunk # pragma: no cover for chunk in chunker.flush(): yield chunk async def aiter_text( self, chunk_size: typing.Optional[int] = None ) -> typing.AsyncIterator[str]: """ A str-iterator over the decoded response content that handles both gzip, deflate, etc but also detects the content's string encoding. """ decoder = TextDecoder(encoding=self.encoding or "utf-8") chunker = TextChunker(chunk_size=chunk_size) with request_context(request=self._request): async for byte_content in self.aiter_bytes(): text_content = decoder.decode(byte_content) for chunk in chunker.decode(text_content): yield chunk text_content = decoder.flush() for chunk in chunker.decode(text_content): yield chunk # pragma: no cover for chunk in chunker.flush(): yield chunk async def aiter_lines(self) -> typing.AsyncIterator[str]: decoder = LineDecoder() with request_context(request=self._request): async for text in self.aiter_text(): for line in decoder.decode(text): yield line for line in decoder.flush(): yield line async def aiter_raw( self, chunk_size: typing.Optional[int] = None ) -> typing.AsyncIterator[bytes]: """ A byte-iterator over the raw response content. """ if self.is_stream_consumed: raise StreamConsumed() if self.is_closed: raise StreamClosed() if not isinstance(self.stream, AsyncByteStream): raise RuntimeError("Attempted to call an async iterator on an sync stream.") self.is_stream_consumed = True self._num_bytes_downloaded = 0 chunker = ByteChunker(chunk_size=chunk_size) with request_context(request=self._request): async for raw_stream_bytes in self.stream: self._num_bytes_downloaded += len(raw_stream_bytes) for chunk in chunker.decode(raw_stream_bytes): yield chunk for chunk in chunker.flush(): yield chunk await self.aclose() async def aclose(self) -> None: """ Close the response and release the connection. Automatically called if the response body is read to completion. """ if not isinstance(self.stream, AsyncByteStream): raise RuntimeError("Attempted to call an async close on an sync stream.") if not self.is_closed: self.is_closed = True with request_context(request=self._request): await self.stream.aclose() class Cookies(typing.MutableMapping[str, str]): """ HTTP Cookies, as a mutable mapping. """ def __init__(self, cookies: typing.Optional[CookieTypes] = None) -> None: if cookies is None or isinstance(cookies, dict): self.jar = CookieJar() if isinstance(cookies, dict): for key, value in cookies.items(): self.set(key, value) elif isinstance(cookies, list): self.jar = CookieJar() for key, value in cookies: self.set(key, value) elif isinstance(cookies, Cookies): self.jar = CookieJar() for cookie in cookies.jar: self.jar.set_cookie(cookie) else: self.jar = cookies def extract_cookies(self, response: Response) -> None: """ Loads any cookies based on the response `Set-Cookie` headers. """ urllib_response = self._CookieCompatResponse(response) urllib_request = self._CookieCompatRequest(response.request) self.jar.extract_cookies(urllib_response, urllib_request) # type: ignore def set_cookie_header(self, request: Request) -> None: """ Sets an appropriate 'Cookie:' HTTP header on the `Request`. """ urllib_request = self._CookieCompatRequest(request) self.jar.add_cookie_header(urllib_request) def set(self, name: str, value: str, domain: str = "", path: str = "/") -> None: """ Set a cookie value by name. May optionally include domain and path. """ kwargs = { "version": 0, "name": name, "value": value, "port": None, "port_specified": False, "domain": domain, "domain_specified": bool(domain), "domain_initial_dot": domain.startswith("."), "path": path, "path_specified": bool(path), "secure": False, "expires": None, "discard": True, "comment": None, "comment_url": None, "rest": {"HttpOnly": None}, "rfc2109": False, } cookie = Cookie(**kwargs) # type: ignore self.jar.set_cookie(cookie) def get( # type: ignore self, name: str, default: typing.Optional[str] = None, domain: typing.Optional[str] = None, path: typing.Optional[str] = None, ) -> typing.Optional[str]: """ Get a cookie by name. May optionally include domain and path in order to specify exactly which cookie to retrieve. """ value = None for cookie in self.jar: if cookie.name == name: if domain is None or cookie.domain == domain: if path is None or cookie.path == path: if value is not None: message = f"Multiple cookies exist with name={name}" raise CookieConflict(message) value = cookie.value if value is None: return default return value def delete( self, name: str, domain: typing.Optional[str] = None, path: typing.Optional[str] = None, ) -> None: """ Delete a cookie by name. May optionally include domain and path in order to specify exactly which cookie to delete. """ if domain is not None and path is not None: return self.jar.clear(domain, path, name) remove = [ cookie for cookie in self.jar if cookie.name == name and (domain is None or cookie.domain == domain) and (path is None or cookie.path == path) ] for cookie in remove: self.jar.clear(cookie.domain, cookie.path, cookie.name) def clear( self, domain: typing.Optional[str] = None, path: typing.Optional[str] = None ) -> None: """ Delete all cookies. Optionally include a domain and path in order to only delete a subset of all the cookies. """ args = [] if domain is not None: args.append(domain) if path is not None: assert domain is not None args.append(path) self.jar.clear(*args) def update(self, cookies: typing.Optional[CookieTypes] = None) -> None: # type: ignore cookies = Cookies(cookies) for cookie in cookies.jar: self.jar.set_cookie(cookie) def __setitem__(self, name: str, value: str) -> None: return self.set(name, value) def __getitem__(self, name: str) -> str: value = self.get(name) if value is None: raise KeyError(name) return value def __delitem__(self, name: str) -> None: return self.delete(name) def __len__(self) -> int: return len(self.jar) def __iter__(self) -> typing.Iterator[str]: return (cookie.name for cookie in self.jar) def __bool__(self) -> bool: for _ in self.jar: return True return False def __repr__(self) -> str: cookies_repr = ", ".join( [ f"" for cookie in self.jar ] ) return f"" class _CookieCompatRequest(urllib.request.Request): """ Wraps a `Request` instance up in a compatibility interface suitable for use with `CookieJar` operations. """ def __init__(self, request: Request) -> None: super().__init__( url=str(request.url), headers=dict(request.headers), method=request.method, ) self.request = request def add_unredirected_header(self, key: str, value: str) -> None: super().add_unredirected_header(key, value) self.request.headers[key] = value class _CookieCompatResponse: """ Wraps a `Request` instance up in a compatibility interface suitable for use with `CookieJar` operations. """ def __init__(self, response: Response) -> None: self.response = response def info(self) -> email.message.Message: info = email.message.Message() for key, value in self.response.headers.multi_items(): # Note that setting `info[key]` here is an "append" operation, # not a "replace" operation. # https://docs.python.org/3/library/email.compat32-message.html#email.message.Message.__setitem__ info[key] = value return info httpx-0.26.0/httpx/_multipart.py000066400000000000000000000214551454054354600166700ustar00rootroot00000000000000import io import os import typing from pathlib import Path from ._types import ( AsyncByteStream, FileContent, FileTypes, RequestData, RequestFiles, SyncByteStream, ) from ._utils import ( format_form_param, guess_content_type, peek_filelike_length, primitive_value_to_str, to_bytes, ) def get_multipart_boundary_from_content_type( content_type: typing.Optional[bytes], ) -> typing.Optional[bytes]: if not content_type or not content_type.startswith(b"multipart/form-data"): return None # parse boundary according to # https://www.rfc-editor.org/rfc/rfc2046#section-5.1.1 if b";" in content_type: for section in content_type.split(b";"): if section.strip().lower().startswith(b"boundary="): return section.strip()[len(b"boundary=") :].strip(b'"') return None class DataField: """ A single form field item, within a multipart form field. """ def __init__( self, name: str, value: typing.Union[str, bytes, int, float, None] ) -> None: if not isinstance(name, str): raise TypeError( f"Invalid type for name. Expected str, got {type(name)}: {name!r}" ) if value is not None and not isinstance(value, (str, bytes, int, float)): raise TypeError( "Invalid type for value. Expected primitive type," f" got {type(value)}: {value!r}" ) self.name = name self.value: typing.Union[str, bytes] = ( value if isinstance(value, bytes) else primitive_value_to_str(value) ) def render_headers(self) -> bytes: if not hasattr(self, "_headers"): name = format_form_param("name", self.name) self._headers = b"".join( [b"Content-Disposition: form-data; ", name, b"\r\n\r\n"] ) return self._headers def render_data(self) -> bytes: if not hasattr(self, "_data"): self._data = to_bytes(self.value) return self._data def get_length(self) -> int: headers = self.render_headers() data = self.render_data() return len(headers) + len(data) def render(self) -> typing.Iterator[bytes]: yield self.render_headers() yield self.render_data() class FileField: """ A single file field item, within a multipart form field. """ CHUNK_SIZE = 64 * 1024 def __init__(self, name: str, value: FileTypes) -> None: self.name = name fileobj: FileContent headers: typing.Dict[str, str] = {} content_type: typing.Optional[str] = None # This large tuple based API largely mirror's requests' API # It would be good to think of better APIs for this that we could # include in httpx 2.0 since variable length tuples(especially of 4 elements) # are quite unwieldly if isinstance(value, tuple): if len(value) == 2: # neither the 3rd parameter (content_type) nor the 4th (headers) # was included filename, fileobj = value # type: ignore elif len(value) == 3: filename, fileobj, content_type = value # type: ignore else: # all 4 parameters included filename, fileobj, content_type, headers = value # type: ignore else: filename = Path(str(getattr(value, "name", "upload"))).name fileobj = value if content_type is None: content_type = guess_content_type(filename) has_content_type_header = any("content-type" in key.lower() for key in headers) if content_type is not None and not has_content_type_header: # note that unlike requests, we ignore the content_type provided in the 3rd # tuple element if it is also included in the headers requests does # the opposite (it overwrites the headerwith the 3rd tuple element) headers["Content-Type"] = content_type if isinstance(fileobj, io.StringIO): raise TypeError( "Multipart file uploads require 'io.BytesIO', not 'io.StringIO'." ) if isinstance(fileobj, io.TextIOBase): raise TypeError( "Multipart file uploads must be opened in binary mode, not text mode." ) self.filename = filename self.file = fileobj self.headers = headers def get_length(self) -> typing.Optional[int]: headers = self.render_headers() if isinstance(self.file, (str, bytes)): return len(headers) + len(to_bytes(self.file)) file_length = peek_filelike_length(self.file) # If we can't determine the filesize without reading it into memory, # then return `None` here, to indicate an unknown file length. if file_length is None: return None return len(headers) + file_length def render_headers(self) -> bytes: if not hasattr(self, "_headers"): parts = [ b"Content-Disposition: form-data; ", format_form_param("name", self.name), ] if self.filename: filename = format_form_param("filename", self.filename) parts.extend([b"; ", filename]) for header_name, header_value in self.headers.items(): key, val = f"\r\n{header_name}: ".encode(), header_value.encode() parts.extend([key, val]) parts.append(b"\r\n\r\n") self._headers = b"".join(parts) return self._headers def render_data(self) -> typing.Iterator[bytes]: if isinstance(self.file, (str, bytes)): yield to_bytes(self.file) return if hasattr(self.file, "seek"): try: self.file.seek(0) except io.UnsupportedOperation: pass chunk = self.file.read(self.CHUNK_SIZE) while chunk: yield to_bytes(chunk) chunk = self.file.read(self.CHUNK_SIZE) def render(self) -> typing.Iterator[bytes]: yield self.render_headers() yield from self.render_data() class MultipartStream(SyncByteStream, AsyncByteStream): """ Request content as streaming multipart encoded form data. """ def __init__( self, data: RequestData, files: RequestFiles, boundary: typing.Optional[bytes] = None, ) -> None: if boundary is None: boundary = os.urandom(16).hex().encode("ascii") self.boundary = boundary self.content_type = "multipart/form-data; boundary=%s" % boundary.decode( "ascii" ) self.fields = list(self._iter_fields(data, files)) def _iter_fields( self, data: RequestData, files: RequestFiles ) -> typing.Iterator[typing.Union[FileField, DataField]]: for name, value in data.items(): if isinstance(value, (tuple, list)): for item in value: yield DataField(name=name, value=item) else: yield DataField(name=name, value=value) file_items = files.items() if isinstance(files, typing.Mapping) else files for name, value in file_items: yield FileField(name=name, value=value) def iter_chunks(self) -> typing.Iterator[bytes]: for field in self.fields: yield b"--%s\r\n" % self.boundary yield from field.render() yield b"\r\n" yield b"--%s--\r\n" % self.boundary def get_content_length(self) -> typing.Optional[int]: """ Return the length of the multipart encoded content, or `None` if any of the files have a length that cannot be determined upfront. """ boundary_length = len(self.boundary) length = 0 for field in self.fields: field_length = field.get_length() if field_length is None: return None length += 2 + boundary_length + 2 # b"--{boundary}\r\n" length += field_length length += 2 # b"\r\n" length += 2 + boundary_length + 4 # b"--{boundary}--\r\n" return length # Content stream interface. def get_headers(self) -> typing.Dict[str, str]: content_length = self.get_content_length() content_type = self.content_type if content_length is None: return {"Transfer-Encoding": "chunked", "Content-Type": content_type} return {"Content-Length": str(content_length), "Content-Type": content_type} def __iter__(self) -> typing.Iterator[bytes]: for chunk in self.iter_chunks(): yield chunk async def __aiter__(self) -> typing.AsyncIterator[bytes]: for chunk in self.iter_chunks(): yield chunk httpx-0.26.0/httpx/_status_codes.py000066400000000000000000000127201454054354600173420ustar00rootroot00000000000000from enum import IntEnum class codes(IntEnum): """HTTP status codes and reason phrases Status codes from the following RFCs are all observed: * RFC 7231: Hypertext Transfer Protocol (HTTP/1.1), obsoletes 2616 * RFC 6585: Additional HTTP Status Codes * RFC 3229: Delta encoding in HTTP * RFC 4918: HTTP Extensions for WebDAV, obsoletes 2518 * RFC 5842: Binding Extensions to WebDAV * RFC 7238: Permanent Redirect * RFC 2295: Transparent Content Negotiation in HTTP * RFC 2774: An HTTP Extension Framework * RFC 7540: Hypertext Transfer Protocol Version 2 (HTTP/2) * RFC 2324: Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0) * RFC 7725: An HTTP Status Code to Report Legal Obstacles * RFC 8297: An HTTP Status Code for Indicating Hints * RFC 8470: Using Early Data in HTTP """ def __new__(cls, value: int, phrase: str = "") -> "codes": obj = int.__new__(cls, value) obj._value_ = value obj.phrase = phrase # type: ignore[attr-defined] return obj def __str__(self) -> str: return str(self.value) @classmethod def get_reason_phrase(cls, value: int) -> str: try: return codes(value).phrase # type: ignore except ValueError: return "" @classmethod def is_informational(cls, value: int) -> bool: """ Returns `True` for 1xx status codes, `False` otherwise. """ return 100 <= value <= 199 @classmethod def is_success(cls, value: int) -> bool: """ Returns `True` for 2xx status codes, `False` otherwise. """ return 200 <= value <= 299 @classmethod def is_redirect(cls, value: int) -> bool: """ Returns `True` for 3xx status codes, `False` otherwise. """ return 300 <= value <= 399 @classmethod def is_client_error(cls, value: int) -> bool: """ Returns `True` for 4xx status codes, `False` otherwise. """ return 400 <= value <= 499 @classmethod def is_server_error(cls, value: int) -> bool: """ Returns `True` for 5xx status codes, `False` otherwise. """ return 500 <= value <= 599 @classmethod def is_error(cls, value: int) -> bool: """ Returns `True` for 4xx or 5xx status codes, `False` otherwise. """ return 400 <= value <= 599 # informational CONTINUE = 100, "Continue" SWITCHING_PROTOCOLS = 101, "Switching Protocols" PROCESSING = 102, "Processing" EARLY_HINTS = 103, "Early Hints" # success OK = 200, "OK" CREATED = 201, "Created" ACCEPTED = 202, "Accepted" NON_AUTHORITATIVE_INFORMATION = 203, "Non-Authoritative Information" NO_CONTENT = 204, "No Content" RESET_CONTENT = 205, "Reset Content" PARTIAL_CONTENT = 206, "Partial Content" MULTI_STATUS = 207, "Multi-Status" ALREADY_REPORTED = 208, "Already Reported" IM_USED = 226, "IM Used" # redirection MULTIPLE_CHOICES = 300, "Multiple Choices" MOVED_PERMANENTLY = 301, "Moved Permanently" FOUND = 302, "Found" SEE_OTHER = 303, "See Other" NOT_MODIFIED = 304, "Not Modified" USE_PROXY = 305, "Use Proxy" TEMPORARY_REDIRECT = 307, "Temporary Redirect" PERMANENT_REDIRECT = 308, "Permanent Redirect" # client error BAD_REQUEST = 400, "Bad Request" UNAUTHORIZED = 401, "Unauthorized" PAYMENT_REQUIRED = 402, "Payment Required" FORBIDDEN = 403, "Forbidden" NOT_FOUND = 404, "Not Found" METHOD_NOT_ALLOWED = 405, "Method Not Allowed" NOT_ACCEPTABLE = 406, "Not Acceptable" PROXY_AUTHENTICATION_REQUIRED = 407, "Proxy Authentication Required" REQUEST_TIMEOUT = 408, "Request Timeout" CONFLICT = 409, "Conflict" GONE = 410, "Gone" LENGTH_REQUIRED = 411, "Length Required" PRECONDITION_FAILED = 412, "Precondition Failed" REQUEST_ENTITY_TOO_LARGE = 413, "Request Entity Too Large" REQUEST_URI_TOO_LONG = 414, "Request-URI Too Long" UNSUPPORTED_MEDIA_TYPE = 415, "Unsupported Media Type" REQUESTED_RANGE_NOT_SATISFIABLE = 416, "Requested Range Not Satisfiable" EXPECTATION_FAILED = 417, "Expectation Failed" IM_A_TEAPOT = 418, "I'm a teapot" MISDIRECTED_REQUEST = 421, "Misdirected Request" UNPROCESSABLE_ENTITY = 422, "Unprocessable Entity" LOCKED = 423, "Locked" FAILED_DEPENDENCY = 424, "Failed Dependency" TOO_EARLY = 425, "Too Early" UPGRADE_REQUIRED = 426, "Upgrade Required" PRECONDITION_REQUIRED = 428, "Precondition Required" TOO_MANY_REQUESTS = 429, "Too Many Requests" REQUEST_HEADER_FIELDS_TOO_LARGE = 431, "Request Header Fields Too Large" UNAVAILABLE_FOR_LEGAL_REASONS = 451, "Unavailable For Legal Reasons" # server errors INTERNAL_SERVER_ERROR = 500, "Internal Server Error" NOT_IMPLEMENTED = 501, "Not Implemented" BAD_GATEWAY = 502, "Bad Gateway" SERVICE_UNAVAILABLE = 503, "Service Unavailable" GATEWAY_TIMEOUT = 504, "Gateway Timeout" HTTP_VERSION_NOT_SUPPORTED = 505, "HTTP Version Not Supported" VARIANT_ALSO_NEGOTIATES = 506, "Variant Also Negotiates" INSUFFICIENT_STORAGE = 507, "Insufficient Storage" LOOP_DETECTED = 508, "Loop Detected" NOT_EXTENDED = 510, "Not Extended" NETWORK_AUTHENTICATION_REQUIRED = 511, "Network Authentication Required" # Include lower-case styles for `requests` compatibility. for code in codes: setattr(codes, code._name_.lower(), int(code)) httpx-0.26.0/httpx/_transports/000077500000000000000000000000001454054354600165055ustar00rootroot00000000000000httpx-0.26.0/httpx/_transports/__init__.py000066400000000000000000000000001454054354600206040ustar00rootroot00000000000000httpx-0.26.0/httpx/_transports/asgi.py000066400000000000000000000125541454054354600200110ustar00rootroot00000000000000import typing import sniffio from .._models import Request, Response from .._types import AsyncByteStream from .base import AsyncBaseTransport if typing.TYPE_CHECKING: # pragma: no cover import asyncio import trio Event = typing.Union[asyncio.Event, trio.Event] _Message = typing.Dict[str, typing.Any] _Receive = typing.Callable[[], typing.Awaitable[_Message]] _Send = typing.Callable[ [typing.Dict[str, typing.Any]], typing.Coroutine[None, None, None] ] _ASGIApp = typing.Callable[ [typing.Dict[str, typing.Any], _Receive, _Send], typing.Coroutine[None, None, None] ] def create_event() -> "Event": if sniffio.current_async_library() == "trio": import trio return trio.Event() else: import asyncio return asyncio.Event() class ASGIResponseStream(AsyncByteStream): def __init__(self, body: typing.List[bytes]) -> None: self._body = body async def __aiter__(self) -> typing.AsyncIterator[bytes]: yield b"".join(self._body) class ASGITransport(AsyncBaseTransport): """ A custom AsyncTransport that handles sending requests directly to an ASGI app. The simplest way to use this functionality is to use the `app` argument. ``` client = httpx.AsyncClient(app=app) ``` Alternatively, you can setup the transport instance explicitly. This allows you to include any additional configuration arguments specific to the ASGITransport class: ``` transport = httpx.ASGITransport( app=app, root_path="/submount", client=("1.2.3.4", 123) ) client = httpx.AsyncClient(transport=transport) ``` Arguments: * `app` - The ASGI application. * `raise_app_exceptions` - Boolean indicating if exceptions in the application should be raised. Default to `True`. Can be set to `False` for use cases such as testing the content of a client 500 response. * `root_path` - The root path on which the ASGI application should be mounted. * `client` - A two-tuple indicating the client IP and port of incoming requests. ``` """ def __init__( self, app: _ASGIApp, raise_app_exceptions: bool = True, root_path: str = "", client: typing.Tuple[str, int] = ("127.0.0.1", 123), ) -> None: self.app = app self.raise_app_exceptions = raise_app_exceptions self.root_path = root_path self.client = client async def handle_async_request( self, request: Request, ) -> Response: assert isinstance(request.stream, AsyncByteStream) # ASGI scope. scope = { "type": "http", "asgi": {"version": "3.0"}, "http_version": "1.1", "method": request.method, "headers": [(k.lower(), v) for (k, v) in request.headers.raw], "scheme": request.url.scheme, "path": request.url.path, "raw_path": request.url.raw_path.split(b"?")[0], "query_string": request.url.query, "server": (request.url.host, request.url.port), "client": self.client, "root_path": self.root_path, } # Request. request_body_chunks = request.stream.__aiter__() request_complete = False # Response. status_code = None response_headers = None body_parts = [] response_started = False response_complete = create_event() # ASGI callables. async def receive() -> typing.Dict[str, typing.Any]: nonlocal request_complete if request_complete: await response_complete.wait() return {"type": "http.disconnect"} try: body = await request_body_chunks.__anext__() except StopAsyncIteration: request_complete = True return {"type": "http.request", "body": b"", "more_body": False} return {"type": "http.request", "body": body, "more_body": True} async def send(message: typing.Dict[str, typing.Any]) -> None: nonlocal status_code, response_headers, response_started if message["type"] == "http.response.start": assert not response_started status_code = message["status"] response_headers = message.get("headers", []) response_started = True elif message["type"] == "http.response.body": assert not response_complete.is_set() body = message.get("body", b"") more_body = message.get("more_body", False) if body and request.method != "HEAD": body_parts.append(body) if not more_body: response_complete.set() try: await self.app(scope, receive, send) except Exception: # noqa: PIE-786 if self.raise_app_exceptions: raise response_complete.set() if status_code is None: status_code = 500 if response_headers is None: response_headers = {} assert response_complete.is_set() assert status_code is not None assert response_headers is not None stream = ASGIResponseStream(body_parts) return Response(status_code, headers=response_headers, stream=stream) httpx-0.26.0/httpx/_transports/base.py000066400000000000000000000047161454054354600200010ustar00rootroot00000000000000import typing from types import TracebackType from .._models import Request, Response T = typing.TypeVar("T", bound="BaseTransport") A = typing.TypeVar("A", bound="AsyncBaseTransport") class BaseTransport: def __enter__(self: T) -> T: return self def __exit__( self, exc_type: typing.Optional[typing.Type[BaseException]] = None, exc_value: typing.Optional[BaseException] = None, traceback: typing.Optional[TracebackType] = None, ) -> None: self.close() def handle_request(self, request: Request) -> Response: """ Send a single HTTP request and return a response. Developers shouldn't typically ever need to call into this API directly, since the Client class provides all the higher level user-facing API niceties. In order to properly release any network resources, the response stream should *either* be consumed immediately, with a call to `response.stream.read()`, or else the `handle_request` call should be followed with a try/finally block to ensuring the stream is always closed. Example usage: with httpx.HTTPTransport() as transport: req = httpx.Request( method=b"GET", url=(b"https", b"www.example.com", 443, b"/"), headers=[(b"Host", b"www.example.com")], ) resp = transport.handle_request(req) body = resp.stream.read() print(resp.status_code, resp.headers, body) Takes a `Request` instance as the only argument. Returns a `Response` instance. """ raise NotImplementedError( "The 'handle_request' method must be implemented." ) # pragma: no cover def close(self) -> None: pass class AsyncBaseTransport: async def __aenter__(self: A) -> A: return self async def __aexit__( self, exc_type: typing.Optional[typing.Type[BaseException]] = None, exc_value: typing.Optional[BaseException] = None, traceback: typing.Optional[TracebackType] = None, ) -> None: await self.aclose() async def handle_async_request( self, request: Request, ) -> Response: raise NotImplementedError( "The 'handle_async_request' method must be implemented." ) # pragma: no cover async def aclose(self) -> None: pass httpx-0.26.0/httpx/_transports/default.py000066400000000000000000000321641454054354600205110ustar00rootroot00000000000000""" Custom transports, with nicely configured defaults. The following additional keyword arguments are currently supported by httpcore... * uds: str * local_address: str * retries: int Example usages... # Disable HTTP/2 on a single specific domain. mounts = { "all://": httpx.HTTPTransport(http2=True), "all://*example.org": httpx.HTTPTransport() } # Using advanced httpcore configuration, with connection retries. transport = httpx.HTTPTransport(retries=1) client = httpx.Client(transport=transport) # Using advanced httpcore configuration, with unix domain sockets. transport = httpx.HTTPTransport(uds="socket.uds") client = httpx.Client(transport=transport) """ import contextlib import typing from types import TracebackType import httpcore from .._config import DEFAULT_LIMITS, Limits, Proxy, create_ssl_context from .._exceptions import ( ConnectError, ConnectTimeout, LocalProtocolError, NetworkError, PoolTimeout, ProtocolError, ProxyError, ReadError, ReadTimeout, RemoteProtocolError, TimeoutException, UnsupportedProtocol, WriteError, WriteTimeout, ) from .._models import Request, Response from .._types import AsyncByteStream, CertTypes, ProxyTypes, SyncByteStream, VerifyTypes from .._urls import URL from .base import AsyncBaseTransport, BaseTransport T = typing.TypeVar("T", bound="HTTPTransport") A = typing.TypeVar("A", bound="AsyncHTTPTransport") SOCKET_OPTION = typing.Union[ typing.Tuple[int, int, int], typing.Tuple[int, int, typing.Union[bytes, bytearray]], typing.Tuple[int, int, None, int], ] @contextlib.contextmanager def map_httpcore_exceptions() -> typing.Iterator[None]: try: yield except Exception as exc: mapped_exc = None for from_exc, to_exc in HTTPCORE_EXC_MAP.items(): if not isinstance(exc, from_exc): continue # We want to map to the most specific exception we can find. # Eg if `exc` is an `httpcore.ReadTimeout`, we want to map to # `httpx.ReadTimeout`, not just `httpx.TimeoutException`. if mapped_exc is None or issubclass(to_exc, mapped_exc): mapped_exc = to_exc if mapped_exc is None: # pragma: no cover raise message = str(exc) raise mapped_exc(message) from exc HTTPCORE_EXC_MAP = { httpcore.TimeoutException: TimeoutException, httpcore.ConnectTimeout: ConnectTimeout, httpcore.ReadTimeout: ReadTimeout, httpcore.WriteTimeout: WriteTimeout, httpcore.PoolTimeout: PoolTimeout, httpcore.NetworkError: NetworkError, httpcore.ConnectError: ConnectError, httpcore.ReadError: ReadError, httpcore.WriteError: WriteError, httpcore.ProxyError: ProxyError, httpcore.UnsupportedProtocol: UnsupportedProtocol, httpcore.ProtocolError: ProtocolError, httpcore.LocalProtocolError: LocalProtocolError, httpcore.RemoteProtocolError: RemoteProtocolError, } class ResponseStream(SyncByteStream): def __init__(self, httpcore_stream: typing.Iterable[bytes]) -> None: self._httpcore_stream = httpcore_stream def __iter__(self) -> typing.Iterator[bytes]: with map_httpcore_exceptions(): for part in self._httpcore_stream: yield part def close(self) -> None: if hasattr(self._httpcore_stream, "close"): self._httpcore_stream.close() class HTTPTransport(BaseTransport): def __init__( self, verify: VerifyTypes = True, cert: typing.Optional[CertTypes] = None, http1: bool = True, http2: bool = False, limits: Limits = DEFAULT_LIMITS, trust_env: bool = True, proxy: typing.Optional[ProxyTypes] = None, uds: typing.Optional[str] = None, local_address: typing.Optional[str] = None, retries: int = 0, socket_options: typing.Optional[typing.Iterable[SOCKET_OPTION]] = None, ) -> None: ssl_context = create_ssl_context(verify=verify, cert=cert, trust_env=trust_env) proxy = Proxy(url=proxy) if isinstance(proxy, (str, URL)) else proxy if proxy is None: self._pool = httpcore.ConnectionPool( ssl_context=ssl_context, max_connections=limits.max_connections, max_keepalive_connections=limits.max_keepalive_connections, keepalive_expiry=limits.keepalive_expiry, http1=http1, http2=http2, uds=uds, local_address=local_address, retries=retries, socket_options=socket_options, ) elif proxy.url.scheme in ("http", "https"): self._pool = httpcore.HTTPProxy( proxy_url=httpcore.URL( scheme=proxy.url.raw_scheme, host=proxy.url.raw_host, port=proxy.url.port, target=proxy.url.raw_path, ), proxy_auth=proxy.raw_auth, proxy_headers=proxy.headers.raw, ssl_context=ssl_context, proxy_ssl_context=proxy.ssl_context, max_connections=limits.max_connections, max_keepalive_connections=limits.max_keepalive_connections, keepalive_expiry=limits.keepalive_expiry, http1=http1, http2=http2, socket_options=socket_options, ) elif proxy.url.scheme == "socks5": try: import socksio # noqa except ImportError: # pragma: no cover raise ImportError( "Using SOCKS proxy, but the 'socksio' package is not installed. " "Make sure to install httpx using `pip install httpx[socks]`." ) from None self._pool = httpcore.SOCKSProxy( proxy_url=httpcore.URL( scheme=proxy.url.raw_scheme, host=proxy.url.raw_host, port=proxy.url.port, target=proxy.url.raw_path, ), proxy_auth=proxy.raw_auth, ssl_context=ssl_context, max_connections=limits.max_connections, max_keepalive_connections=limits.max_keepalive_connections, keepalive_expiry=limits.keepalive_expiry, http1=http1, http2=http2, ) else: # pragma: no cover raise ValueError( "Proxy protocol must be either 'http', 'https', or 'socks5'," f" but got {proxy.url.scheme!r}." ) def __enter__(self: T) -> T: # Use generics for subclass support. self._pool.__enter__() return self def __exit__( self, exc_type: typing.Optional[typing.Type[BaseException]] = None, exc_value: typing.Optional[BaseException] = None, traceback: typing.Optional[TracebackType] = None, ) -> None: with map_httpcore_exceptions(): self._pool.__exit__(exc_type, exc_value, traceback) def handle_request( self, request: Request, ) -> Response: assert isinstance(request.stream, SyncByteStream) req = httpcore.Request( method=request.method, url=httpcore.URL( scheme=request.url.raw_scheme, host=request.url.raw_host, port=request.url.port, target=request.url.raw_path, ), headers=request.headers.raw, content=request.stream, extensions=request.extensions, ) with map_httpcore_exceptions(): resp = self._pool.handle_request(req) assert isinstance(resp.stream, typing.Iterable) return Response( status_code=resp.status, headers=resp.headers, stream=ResponseStream(resp.stream), extensions=resp.extensions, ) def close(self) -> None: self._pool.close() class AsyncResponseStream(AsyncByteStream): def __init__(self, httpcore_stream: typing.AsyncIterable[bytes]) -> None: self._httpcore_stream = httpcore_stream async def __aiter__(self) -> typing.AsyncIterator[bytes]: with map_httpcore_exceptions(): async for part in self._httpcore_stream: yield part async def aclose(self) -> None: if hasattr(self._httpcore_stream, "aclose"): await self._httpcore_stream.aclose() class AsyncHTTPTransport(AsyncBaseTransport): def __init__( self, verify: VerifyTypes = True, cert: typing.Optional[CertTypes] = None, http1: bool = True, http2: bool = False, limits: Limits = DEFAULT_LIMITS, trust_env: bool = True, proxy: typing.Optional[ProxyTypes] = None, uds: typing.Optional[str] = None, local_address: typing.Optional[str] = None, retries: int = 0, socket_options: typing.Optional[typing.Iterable[SOCKET_OPTION]] = None, ) -> None: ssl_context = create_ssl_context(verify=verify, cert=cert, trust_env=trust_env) proxy = Proxy(url=proxy) if isinstance(proxy, (str, URL)) else proxy if proxy is None: self._pool = httpcore.AsyncConnectionPool( ssl_context=ssl_context, max_connections=limits.max_connections, max_keepalive_connections=limits.max_keepalive_connections, keepalive_expiry=limits.keepalive_expiry, http1=http1, http2=http2, uds=uds, local_address=local_address, retries=retries, socket_options=socket_options, ) elif proxy.url.scheme in ("http", "https"): self._pool = httpcore.AsyncHTTPProxy( proxy_url=httpcore.URL( scheme=proxy.url.raw_scheme, host=proxy.url.raw_host, port=proxy.url.port, target=proxy.url.raw_path, ), proxy_auth=proxy.raw_auth, proxy_headers=proxy.headers.raw, ssl_context=ssl_context, max_connections=limits.max_connections, max_keepalive_connections=limits.max_keepalive_connections, keepalive_expiry=limits.keepalive_expiry, http1=http1, http2=http2, socket_options=socket_options, ) elif proxy.url.scheme == "socks5": try: import socksio # noqa except ImportError: # pragma: no cover raise ImportError( "Using SOCKS proxy, but the 'socksio' package is not installed. " "Make sure to install httpx using `pip install httpx[socks]`." ) from None self._pool = httpcore.AsyncSOCKSProxy( proxy_url=httpcore.URL( scheme=proxy.url.raw_scheme, host=proxy.url.raw_host, port=proxy.url.port, target=proxy.url.raw_path, ), proxy_auth=proxy.raw_auth, ssl_context=ssl_context, max_connections=limits.max_connections, max_keepalive_connections=limits.max_keepalive_connections, keepalive_expiry=limits.keepalive_expiry, http1=http1, http2=http2, ) else: # pragma: no cover raise ValueError( "Proxy protocol must be either 'http', 'https', or 'socks5'," " but got {proxy.url.scheme!r}." ) async def __aenter__(self: A) -> A: # Use generics for subclass support. await self._pool.__aenter__() return self async def __aexit__( self, exc_type: typing.Optional[typing.Type[BaseException]] = None, exc_value: typing.Optional[BaseException] = None, traceback: typing.Optional[TracebackType] = None, ) -> None: with map_httpcore_exceptions(): await self._pool.__aexit__(exc_type, exc_value, traceback) async def handle_async_request( self, request: Request, ) -> Response: assert isinstance(request.stream, AsyncByteStream) req = httpcore.Request( method=request.method, url=httpcore.URL( scheme=request.url.raw_scheme, host=request.url.raw_host, port=request.url.port, target=request.url.raw_path, ), headers=request.headers.raw, content=request.stream, extensions=request.extensions, ) with map_httpcore_exceptions(): resp = await self._pool.handle_async_request(req) assert isinstance(resp.stream, typing.AsyncIterable) return Response( status_code=resp.status, headers=resp.headers, stream=AsyncResponseStream(resp.stream), extensions=resp.extensions, ) async def aclose(self) -> None: await self._pool.aclose() httpx-0.26.0/httpx/_transports/mock.py000066400000000000000000000022331454054354600200100ustar00rootroot00000000000000import typing from .._models import Request, Response from .base import AsyncBaseTransport, BaseTransport SyncHandler = typing.Callable[[Request], Response] AsyncHandler = typing.Callable[[Request], typing.Coroutine[None, None, Response]] class MockTransport(AsyncBaseTransport, BaseTransport): def __init__(self, handler: typing.Union[SyncHandler, AsyncHandler]) -> None: self.handler = handler def handle_request( self, request: Request, ) -> Response: request.read() response = self.handler(request) if not isinstance(response, Response): # pragma: no cover raise TypeError("Cannot use an async handler in a sync Client") return response async def handle_async_request( self, request: Request, ) -> Response: await request.aread() response = self.handler(request) # Allow handler to *optionally* be an `async` function. # If it is, then the `response` variable need to be awaited to actually # return the result. if not isinstance(response, Response): response = await response return response httpx-0.26.0/httpx/_transports/wsgi.py000066400000000000000000000112751454054354600200360ustar00rootroot00000000000000import io import itertools import sys import typing from .._models import Request, Response from .._types import SyncByteStream from .base import BaseTransport if typing.TYPE_CHECKING: from _typeshed import OptExcInfo # pragma: no cover from _typeshed.wsgi import WSGIApplication # pragma: no cover _T = typing.TypeVar("_T") def _skip_leading_empty_chunks(body: typing.Iterable[_T]) -> typing.Iterable[_T]: body = iter(body) for chunk in body: if chunk: return itertools.chain([chunk], body) return [] class WSGIByteStream(SyncByteStream): def __init__(self, result: typing.Iterable[bytes]) -> None: self._close = getattr(result, "close", None) self._result = _skip_leading_empty_chunks(result) def __iter__(self) -> typing.Iterator[bytes]: for part in self._result: yield part def close(self) -> None: if self._close is not None: self._close() class WSGITransport(BaseTransport): """ A custom transport that handles sending requests directly to an WSGI app. The simplest way to use this functionality is to use the `app` argument. ``` client = httpx.Client(app=app) ``` Alternatively, you can setup the transport instance explicitly. This allows you to include any additional configuration arguments specific to the WSGITransport class: ``` transport = httpx.WSGITransport( app=app, script_name="/submount", remote_addr="1.2.3.4" ) client = httpx.Client(transport=transport) ``` Arguments: * `app` - The WSGI application. * `raise_app_exceptions` - Boolean indicating if exceptions in the application should be raised. Default to `True`. Can be set to `False` for use cases such as testing the content of a client 500 response. * `script_name` - The root path on which the WSGI application should be mounted. * `remote_addr` - A string indicating the client IP of incoming requests. ``` """ def __init__( self, app: "WSGIApplication", raise_app_exceptions: bool = True, script_name: str = "", remote_addr: str = "127.0.0.1", wsgi_errors: typing.Optional[typing.TextIO] = None, ) -> None: self.app = app self.raise_app_exceptions = raise_app_exceptions self.script_name = script_name self.remote_addr = remote_addr self.wsgi_errors = wsgi_errors def handle_request(self, request: Request) -> Response: request.read() wsgi_input = io.BytesIO(request.content) port = request.url.port or {"http": 80, "https": 443}[request.url.scheme] environ = { "wsgi.version": (1, 0), "wsgi.url_scheme": request.url.scheme, "wsgi.input": wsgi_input, "wsgi.errors": self.wsgi_errors or sys.stderr, "wsgi.multithread": True, "wsgi.multiprocess": False, "wsgi.run_once": False, "REQUEST_METHOD": request.method, "SCRIPT_NAME": self.script_name, "PATH_INFO": request.url.path, "QUERY_STRING": request.url.query.decode("ascii"), "SERVER_NAME": request.url.host, "SERVER_PORT": str(port), "SERVER_PROTOCOL": "HTTP/1.1", "REMOTE_ADDR": self.remote_addr, } for header_key, header_value in request.headers.raw: key = header_key.decode("ascii").upper().replace("-", "_") if key not in ("CONTENT_TYPE", "CONTENT_LENGTH"): key = "HTTP_" + key environ[key] = header_value.decode("ascii") seen_status = None seen_response_headers = None seen_exc_info = None def start_response( status: str, response_headers: typing.List[typing.Tuple[str, str]], exc_info: typing.Optional["OptExcInfo"] = None, ) -> typing.Callable[[bytes], typing.Any]: nonlocal seen_status, seen_response_headers, seen_exc_info seen_status = status seen_response_headers = response_headers seen_exc_info = exc_info return lambda _: None result = self.app(environ, start_response) stream = WSGIByteStream(result) assert seen_status is not None assert seen_response_headers is not None if seen_exc_info and seen_exc_info[0] and self.raise_app_exceptions: raise seen_exc_info[1] status_code = int(seen_status.split()[0]) headers = [ (key.encode("ascii"), value.encode("ascii")) for key, value in seen_response_headers ] return Response(status_code, headers=headers, stream=stream) httpx-0.26.0/httpx/_types.py000066400000000000000000000064771454054354600160220ustar00rootroot00000000000000""" Type definitions for type checking purposes. """ import ssl from http.cookiejar import CookieJar from typing import ( IO, TYPE_CHECKING, Any, AsyncIterable, AsyncIterator, Callable, Dict, Iterable, Iterator, List, Mapping, MutableMapping, NamedTuple, Optional, Sequence, Tuple, Union, ) if TYPE_CHECKING: # pragma: no cover from ._auth import Auth # noqa: F401 from ._config import Proxy, Timeout # noqa: F401 from ._models import Cookies, Headers, Request # noqa: F401 from ._urls import URL, QueryParams # noqa: F401 PrimitiveData = Optional[Union[str, int, float, bool]] RawURL = NamedTuple( "RawURL", [ ("raw_scheme", bytes), ("raw_host", bytes), ("port", Optional[int]), ("raw_path", bytes), ], ) URLTypes = Union["URL", str] QueryParamTypes = Union[ "QueryParams", Mapping[str, Union[PrimitiveData, Sequence[PrimitiveData]]], List[Tuple[str, PrimitiveData]], Tuple[Tuple[str, PrimitiveData], ...], str, bytes, ] HeaderTypes = Union[ "Headers", Mapping[str, str], Mapping[bytes, bytes], Sequence[Tuple[str, str]], Sequence[Tuple[bytes, bytes]], ] CookieTypes = Union["Cookies", CookieJar, Dict[str, str], List[Tuple[str, str]]] CertTypes = Union[ # certfile str, # (certfile, keyfile) Tuple[str, Optional[str]], # (certfile, keyfile, password) Tuple[str, Optional[str], Optional[str]], ] VerifyTypes = Union[str, bool, ssl.SSLContext] TimeoutTypes = Union[ Optional[float], Tuple[Optional[float], Optional[float], Optional[float], Optional[float]], "Timeout", ] ProxyTypes = Union[URLTypes, "Proxy"] ProxiesTypes = Union[ProxyTypes, Dict[URLTypes, Union[None, ProxyTypes]]] AuthTypes = Union[ Tuple[Union[str, bytes], Union[str, bytes]], Callable[["Request"], "Request"], "Auth", ] RequestContent = Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]] ResponseContent = Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]] ResponseExtensions = MutableMapping[str, Any] RequestData = Mapping[str, Any] FileContent = Union[IO[bytes], bytes, str] FileTypes = Union[ # file (or bytes) FileContent, # (filename, file (or bytes)) Tuple[Optional[str], FileContent], # (filename, file (or bytes), content_type) Tuple[Optional[str], FileContent, Optional[str]], # (filename, file (or bytes), content_type, headers) Tuple[Optional[str], FileContent, Optional[str], Mapping[str, str]], ] RequestFiles = Union[Mapping[str, FileTypes], Sequence[Tuple[str, FileTypes]]] RequestExtensions = MutableMapping[str, Any] class SyncByteStream: def __iter__(self) -> Iterator[bytes]: raise NotImplementedError( "The '__iter__' method must be implemented." ) # pragma: no cover yield b"" # pragma: no cover def close(self) -> None: """ Subclasses can override this method to release any network resources after a request/response cycle is complete. """ class AsyncByteStream: async def __aiter__(self) -> AsyncIterator[bytes]: raise NotImplementedError( "The '__aiter__' method must be implemented." ) # pragma: no cover yield b"" # pragma: no cover async def aclose(self) -> None: pass httpx-0.26.0/httpx/_urlparse.py000066400000000000000000000426421454054354600165050ustar00rootroot00000000000000""" An implementation of `urlparse` that provides URL validation and normalization as described by RFC3986. We rely on this implementation rather than the one in Python's stdlib, because: * It provides more complete URL validation. * It properly differentiates between an empty querystring and an absent querystring, to distinguish URLs with a trailing '?'. * It handles scheme, hostname, port, and path normalization. * It supports IDNA hostnames, normalizing them to their encoded form. * The API supports passing individual components, as well as the complete URL string. Previously we relied on the excellent `rfc3986` package to handle URL parsing and validation, but this module provides a simpler alternative, with less indirection required. """ import ipaddress import re import typing import idna from ._exceptions import InvalidURL MAX_URL_LENGTH = 65536 # https://datatracker.ietf.org/doc/html/rfc3986.html#section-2.3 UNRESERVED_CHARACTERS = ( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~" ) SUB_DELIMS = "!$&'()*+,;=" PERCENT_ENCODED_REGEX = re.compile("%[A-Fa-f0-9]{2}") # {scheme}: (optional) # //{authority} (optional) # {path} # ?{query} (optional) # #{fragment} (optional) URL_REGEX = re.compile( ( r"(?:(?P{scheme}):)?" r"(?://(?P{authority}))?" r"(?P{path})" r"(?:\?(?P{query}))?" r"(?:#(?P{fragment}))?" ).format( scheme="([a-zA-Z][a-zA-Z0-9+.-]*)?", authority="[^/?#]*", path="[^?#]*", query="[^#]*", fragment=".*", ) ) # {userinfo}@ (optional) # {host} # :{port} (optional) AUTHORITY_REGEX = re.compile( ( r"(?:(?P{userinfo})@)?" r"(?P{host})" r":?(?P{port})?" ).format( userinfo=".*", # Any character sequence. host="(\\[.*\\]|[^:@]*)", # Either any character sequence excluding ':' or '@', # or an IPv6 address enclosed within square brackets. port=".*", # Any character sequence. ) ) # If we call urlparse with an individual component, then we need to regex # validate that component individually. # Note that we're duplicating the same strings as above. Shock! Horror!! COMPONENT_REGEX = { "scheme": re.compile("([a-zA-Z][a-zA-Z0-9+.-]*)?"), "authority": re.compile("[^/?#]*"), "path": re.compile("[^?#]*"), "query": re.compile("[^#]*"), "fragment": re.compile(".*"), "userinfo": re.compile("[^@]*"), "host": re.compile("(\\[.*\\]|[^:]*)"), "port": re.compile(".*"), } # We use these simple regexs as a first pass before handing off to # the stdlib 'ipaddress' module for IP address validation. IPv4_STYLE_HOSTNAME = re.compile(r"^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$") IPv6_STYLE_HOSTNAME = re.compile(r"^\[.*\]$") class ParseResult(typing.NamedTuple): scheme: str userinfo: str host: str port: typing.Optional[int] path: str query: typing.Optional[str] fragment: typing.Optional[str] @property def authority(self) -> str: return "".join( [ f"{self.userinfo}@" if self.userinfo else "", f"[{self.host}]" if ":" in self.host else self.host, f":{self.port}" if self.port is not None else "", ] ) @property def netloc(self) -> str: return "".join( [ f"[{self.host}]" if ":" in self.host else self.host, f":{self.port}" if self.port is not None else "", ] ) def copy_with(self, **kwargs: typing.Optional[str]) -> "ParseResult": if not kwargs: return self defaults = { "scheme": self.scheme, "authority": self.authority, "path": self.path, "query": self.query, "fragment": self.fragment, } defaults.update(kwargs) return urlparse("", **defaults) def __str__(self) -> str: authority = self.authority return "".join( [ f"{self.scheme}:" if self.scheme else "", f"//{authority}" if authority else "", self.path, f"?{self.query}" if self.query is not None else "", f"#{self.fragment}" if self.fragment is not None else "", ] ) def urlparse(url: str = "", **kwargs: typing.Optional[str]) -> ParseResult: # Initial basic checks on allowable URLs. # --------------------------------------- # Hard limit the maximum allowable URL length. if len(url) > MAX_URL_LENGTH: raise InvalidURL("URL too long") # If a URL includes any ASCII control characters including \t, \r, \n, # then treat it as invalid. if any(char.isascii() and not char.isprintable() for char in url): raise InvalidURL("Invalid non-printable ASCII character in URL") # Some keyword arguments require special handling. # ------------------------------------------------ # Coerce "port" to a string, if it is provided as an integer. if "port" in kwargs: port = kwargs["port"] kwargs["port"] = str(port) if isinstance(port, int) else port # Replace "netloc" with "host and "port". if "netloc" in kwargs: netloc = kwargs.pop("netloc") or "" kwargs["host"], _, kwargs["port"] = netloc.partition(":") # Replace "username" and/or "password" with "userinfo". if "username" in kwargs or "password" in kwargs: username = quote(kwargs.pop("username", "") or "") password = quote(kwargs.pop("password", "") or "") kwargs["userinfo"] = f"{username}:{password}" if password else username # Replace "raw_path" with "path" and "query". if "raw_path" in kwargs: raw_path = kwargs.pop("raw_path") or "" kwargs["path"], seperator, kwargs["query"] = raw_path.partition("?") if not seperator: kwargs["query"] = None # Ensure that IPv6 "host" addresses are always escaped with "[...]". if "host" in kwargs: host = kwargs.get("host") or "" if ":" in host and not (host.startswith("[") and host.endswith("]")): kwargs["host"] = f"[{host}]" # If any keyword arguments are provided, ensure they are valid. # ------------------------------------------------------------- for key, value in kwargs.items(): if value is not None: if len(value) > MAX_URL_LENGTH: raise InvalidURL(f"URL component '{key}' too long") # If a component includes any ASCII control characters including \t, \r, \n, # then treat it as invalid. if any(char.isascii() and not char.isprintable() for char in value): raise InvalidURL( f"Invalid non-printable ASCII character in URL component '{key}'" ) # Ensure that keyword arguments match as a valid regex. if not COMPONENT_REGEX[key].fullmatch(value): raise InvalidURL(f"Invalid URL component '{key}'") # The URL_REGEX will always match, but may have empty components. url_match = URL_REGEX.match(url) assert url_match is not None url_dict = url_match.groupdict() # * 'scheme', 'authority', and 'path' may be empty strings. # * 'query' may be 'None', indicating no trailing "?" portion. # Any string including the empty string, indicates a trailing "?". # * 'fragment' may be 'None', indicating no trailing "#" portion. # Any string including the empty string, indicates a trailing "#". scheme = kwargs.get("scheme", url_dict["scheme"]) or "" authority = kwargs.get("authority", url_dict["authority"]) or "" path = kwargs.get("path", url_dict["path"]) or "" query = kwargs.get("query", url_dict["query"]) fragment = kwargs.get("fragment", url_dict["fragment"]) # The AUTHORITY_REGEX will always match, but may have empty components. authority_match = AUTHORITY_REGEX.match(authority) assert authority_match is not None authority_dict = authority_match.groupdict() # * 'userinfo' and 'host' may be empty strings. # * 'port' may be 'None'. userinfo = kwargs.get("userinfo", authority_dict["userinfo"]) or "" host = kwargs.get("host", authority_dict["host"]) or "" port = kwargs.get("port", authority_dict["port"]) # Normalize and validate each component. # We end up with a parsed representation of the URL, # with components that are plain ASCII bytestrings. parsed_scheme: str = scheme.lower() parsed_userinfo: str = quote(userinfo, safe=SUB_DELIMS + ":") parsed_host: str = encode_host(host) parsed_port: typing.Optional[int] = normalize_port(port, scheme) has_scheme = parsed_scheme != "" has_authority = ( parsed_userinfo != "" or parsed_host != "" or parsed_port is not None ) validate_path(path, has_scheme=has_scheme, has_authority=has_authority) if has_authority: path = normalize_path(path) # The GEN_DELIMS set is... : / ? # [ ] @ # These do not need to be percent-quoted unless they serve as delimiters for the # specific component. # For 'path' we need to drop ? and # from the GEN_DELIMS set. parsed_path: str = quote(path, safe=SUB_DELIMS + ":/[]@") # For 'query' we need to drop '#' from the GEN_DELIMS set. parsed_query: typing.Optional[str] = ( None if query is None else quote(query, safe=SUB_DELIMS + ":/?[]@") ) # For 'fragment' we can include all of the GEN_DELIMS set. parsed_fragment: typing.Optional[str] = ( None if fragment is None else quote(fragment, safe=SUB_DELIMS + ":/?#[]@") ) # The parsed ASCII bytestrings are our canonical form. # All properties of the URL are derived from these. return ParseResult( parsed_scheme, parsed_userinfo, parsed_host, parsed_port, parsed_path, parsed_query, parsed_fragment, ) def encode_host(host: str) -> str: if not host: return "" elif IPv4_STYLE_HOSTNAME.match(host): # Validate IPv4 hostnames like #.#.#.# # # From https://datatracker.ietf.org/doc/html/rfc3986/#section-3.2.2 # # IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet try: ipaddress.IPv4Address(host) except ipaddress.AddressValueError: raise InvalidURL(f"Invalid IPv4 address: {host!r}") return host elif IPv6_STYLE_HOSTNAME.match(host): # Validate IPv6 hostnames like [...] # # From https://datatracker.ietf.org/doc/html/rfc3986/#section-3.2.2 # # "A host identified by an Internet Protocol literal address, version 6 # [RFC3513] or later, is distinguished by enclosing the IP literal # within square brackets ("[" and "]"). This is the only place where # square bracket characters are allowed in the URI syntax." try: ipaddress.IPv6Address(host[1:-1]) except ipaddress.AddressValueError: raise InvalidURL(f"Invalid IPv6 address: {host!r}") return host[1:-1] elif host.isascii(): # Regular ASCII hostnames # # From https://datatracker.ietf.org/doc/html/rfc3986/#section-3.2.2 # # reg-name = *( unreserved / pct-encoded / sub-delims ) return quote(host.lower(), safe=SUB_DELIMS) # IDNA hostnames try: return idna.encode(host.lower()).decode("ascii") except idna.IDNAError: raise InvalidURL(f"Invalid IDNA hostname: {host!r}") def normalize_port( port: typing.Optional[typing.Union[str, int]], scheme: str ) -> typing.Optional[int]: # From https://tools.ietf.org/html/rfc3986#section-3.2.3 # # "A scheme may define a default port. For example, the "http" scheme # defines a default port of "80", corresponding to its reserved TCP # port number. The type of port designated by the port number (e.g., # TCP, UDP, SCTP) is defined by the URI scheme. URI producers and # normalizers should omit the port component and its ":" delimiter if # port is empty or if its value would be the same as that of the # scheme's default." if port is None or port == "": return None try: port_as_int = int(port) except ValueError: raise InvalidURL(f"Invalid port: {port!r}") # See https://url.spec.whatwg.org/#url-miscellaneous default_port = {"ftp": 21, "http": 80, "https": 443, "ws": 80, "wss": 443}.get( scheme ) if port_as_int == default_port: return None return port_as_int def validate_path(path: str, has_scheme: bool, has_authority: bool) -> None: """ Path validation rules that depend on if the URL contains a scheme or authority component. See https://datatracker.ietf.org/doc/html/rfc3986.html#section-3.3 """ if has_authority: # If a URI contains an authority component, then the path component # must either be empty or begin with a slash ("/") character." if path and not path.startswith("/"): raise InvalidURL("For absolute URLs, path must be empty or begin with '/'") else: # If a URI does not contain an authority component, then the path cannot begin # with two slash characters ("//"). if path.startswith("//"): raise InvalidURL( "URLs with no authority component cannot have a path starting with '//'" ) # In addition, a URI reference (Section 4.1) may be a relative-path reference, # in which case the first path segment cannot contain a colon (":") character. if path.startswith(":") and not has_scheme: raise InvalidURL( "URLs with no scheme component cannot have a path starting with ':'" ) def normalize_path(path: str) -> str: """ Drop "." and ".." segments from a URL path. For example: normalize_path("/path/./to/somewhere/..") == "/path/to" """ # https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4 components = path.split("/") output: typing.List[str] = [] for component in components: if component == ".": pass elif component == "..": if output and output != [""]: output.pop() else: output.append(component) return "/".join(output) def percent_encode(char: str) -> str: """ Replace a single character with the percent-encoded representation. Characters outside the ASCII range are represented with their a percent-encoded representation of their UTF-8 byte sequence. For example: percent_encode(" ") == "%20" """ return "".join([f"%{byte:02x}" for byte in char.encode("utf-8")]).upper() def is_safe(string: str, safe: str = "/") -> bool: """ Determine if a given string is already quote-safe. """ NON_ESCAPED_CHARS = UNRESERVED_CHARACTERS + safe + "%" # All characters must already be non-escaping or '%' for char in string: if char not in NON_ESCAPED_CHARS: return False return True def percent_encoded(string: str, safe: str = "/") -> str: """ Use percent-encoding to quote a string. """ if is_safe(string, safe=safe): return string NON_ESCAPED_CHARS = UNRESERVED_CHARACTERS + safe return "".join( [char if char in NON_ESCAPED_CHARS else percent_encode(char) for char in string] ) def quote(string: str, safe: str = "/") -> str: """ Use percent-encoding to quote a string, omitting existing '%xx' escape sequences. See: https://www.rfc-editor.org/rfc/rfc3986#section-2.1 * `string`: The string to be percent-escaped. * `safe`: A string containing characters that may be treated as safe, and do not need to be escaped. Unreserved characters are always treated as safe. See: https://www.rfc-editor.org/rfc/rfc3986#section-2.3 """ parts = [] current_position = 0 for match in re.finditer(PERCENT_ENCODED_REGEX, string): start_position, end_position = match.start(), match.end() matched_text = match.group(0) # Add any text up to the '%xx' escape sequence. if start_position != current_position: leading_text = string[current_position:start_position] parts.append(percent_encoded(leading_text, safe=safe)) # Add the '%xx' escape sequence. parts.append(matched_text) current_position = end_position # Add any text after the final '%xx' escape sequence. if current_position != len(string): trailing_text = string[current_position:] parts.append(percent_encoded(trailing_text, safe=safe)) return "".join(parts) def urlencode(items: typing.List[typing.Tuple[str, str]]) -> str: """ We can use a much simpler version of the stdlib urlencode here because we don't need to handle a bunch of different typing cases, such as bytes vs str. https://github.com/python/cpython/blob/b2f7b2ef0b5421e01efb8c7bee2ef95d3bab77eb/Lib/urllib/parse.py#L926 Note that we use '%20' encoding for spaces. and '%2F for '/'. This is slightly different than `requests`, but is the behaviour that browsers use. See - https://github.com/encode/httpx/issues/2536 - https://github.com/encode/httpx/issues/2721 - https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode """ return "&".join( [ percent_encoded(k, safe="") + "=" + percent_encoded(v, safe="") for k, v in items ] ) httpx-0.26.0/httpx/_urls.py000066400000000000000000000526151454054354600156360ustar00rootroot00000000000000import typing from urllib.parse import parse_qs, unquote import idna from ._types import QueryParamTypes, RawURL, URLTypes from ._urlparse import urlencode, urlparse from ._utils import primitive_value_to_str class URL: """ url = httpx.URL("HTTPS://jo%40email.com:a%20secret@müller.de:1234/pa%20th?search=ab#anchorlink") assert url.scheme == "https" assert url.username == "jo@email.com" assert url.password == "a secret" assert url.userinfo == b"jo%40email.com:a%20secret" assert url.host == "müller.de" assert url.raw_host == b"xn--mller-kva.de" assert url.port == 1234 assert url.netloc == b"xn--mller-kva.de:1234" assert url.path == "/pa th" assert url.query == b"?search=ab" assert url.raw_path == b"/pa%20th?search=ab" assert url.fragment == "anchorlink" The components of a URL are broken down like this: https://jo%40email.com:a%20secret@müller.de:1234/pa%20th?search=ab#anchorlink [scheme] [ username ] [password] [ host ][port][ path ] [ query ] [fragment] [ userinfo ] [ netloc ][ raw_path ] Note that: * `url.scheme` is normalized to always be lowercased. * `url.host` is normalized to always be lowercased. Internationalized domain names are represented in unicode, without IDNA encoding applied. For instance: url = httpx.URL("http://中国.icom.museum") assert url.host == "中国.icom.museum" url = httpx.URL("http://xn--fiqs8s.icom.museum") assert url.host == "中国.icom.museum" * `url.raw_host` is normalized to always be lowercased, and is IDNA encoded. url = httpx.URL("http://中国.icom.museum") assert url.raw_host == b"xn--fiqs8s.icom.museum" url = httpx.URL("http://xn--fiqs8s.icom.museum") assert url.raw_host == b"xn--fiqs8s.icom.museum" * `url.port` is either None or an integer. URLs that include the default port for "http", "https", "ws", "wss", and "ftp" schemes have their port normalized to `None`. assert httpx.URL("http://example.com") == httpx.URL("http://example.com:80") assert httpx.URL("http://example.com").port is None assert httpx.URL("http://example.com:80").port is None * `url.userinfo` is raw bytes, without URL escaping. Usually you'll want to work with `url.username` and `url.password` instead, which handle the URL escaping. * `url.raw_path` is raw bytes of both the path and query, without URL escaping. This portion is used as the target when constructing HTTP requests. Usually you'll want to work with `url.path` instead. * `url.query` is raw bytes, without URL escaping. A URL query string portion can only be properly URL escaped when decoding the parameter names and values themselves. """ def __init__( self, url: typing.Union["URL", str] = "", **kwargs: typing.Any ) -> None: if kwargs: allowed = { "scheme": str, "username": str, "password": str, "userinfo": bytes, "host": str, "port": int, "netloc": bytes, "path": str, "query": bytes, "raw_path": bytes, "fragment": str, "params": object, } # Perform type checking for all supported keyword arguments. for key, value in kwargs.items(): if key not in allowed: message = f"{key!r} is an invalid keyword argument for URL()" raise TypeError(message) if value is not None and not isinstance(value, allowed[key]): expected = allowed[key].__name__ seen = type(value).__name__ message = f"Argument {key!r} must be {expected} but got {seen}" raise TypeError(message) if isinstance(value, bytes): kwargs[key] = value.decode("ascii") if "params" in kwargs: # Replace any "params" keyword with the raw "query" instead. # # Ensure that empty params use `kwargs["query"] = None` rather # than `kwargs["query"] = ""`, so that generated URLs do not # include an empty trailing "?". params = kwargs.pop("params") kwargs["query"] = None if not params else str(QueryParams(params)) if isinstance(url, str): self._uri_reference = urlparse(url, **kwargs) elif isinstance(url, URL): self._uri_reference = url._uri_reference.copy_with(**kwargs) else: raise TypeError( "Invalid type for url. Expected str or httpx.URL," f" got {type(url)}: {url!r}" ) @property def scheme(self) -> str: """ The URL scheme, such as "http", "https". Always normalised to lowercase. """ return self._uri_reference.scheme @property def raw_scheme(self) -> bytes: """ The raw bytes representation of the URL scheme, such as b"http", b"https". Always normalised to lowercase. """ return self._uri_reference.scheme.encode("ascii") @property def userinfo(self) -> bytes: """ The URL userinfo as a raw bytestring. For example: b"jo%40email.com:a%20secret". """ return self._uri_reference.userinfo.encode("ascii") @property def username(self) -> str: """ The URL username as a string, with URL decoding applied. For example: "jo@email.com" """ userinfo = self._uri_reference.userinfo return unquote(userinfo.partition(":")[0]) @property def password(self) -> str: """ The URL password as a string, with URL decoding applied. For example: "a secret" """ userinfo = self._uri_reference.userinfo return unquote(userinfo.partition(":")[2]) @property def host(self) -> str: """ The URL host as a string. Always normalized to lowercase, with IDNA hosts decoded into unicode. Examples: url = httpx.URL("http://www.EXAMPLE.org") assert url.host == "www.example.org" url = httpx.URL("http://中国.icom.museum") assert url.host == "中国.icom.museum" url = httpx.URL("http://xn--fiqs8s.icom.museum") assert url.host == "中国.icom.museum" url = httpx.URL("https://[::ffff:192.168.0.1]") assert url.host == "::ffff:192.168.0.1" """ host: str = self._uri_reference.host if host.startswith("xn--"): host = idna.decode(host) return host @property def raw_host(self) -> bytes: """ The raw bytes representation of the URL host. Always normalized to lowercase, and IDNA encoded. Examples: url = httpx.URL("http://www.EXAMPLE.org") assert url.raw_host == b"www.example.org" url = httpx.URL("http://中国.icom.museum") assert url.raw_host == b"xn--fiqs8s.icom.museum" url = httpx.URL("http://xn--fiqs8s.icom.museum") assert url.raw_host == b"xn--fiqs8s.icom.museum" url = httpx.URL("https://[::ffff:192.168.0.1]") assert url.raw_host == b"::ffff:192.168.0.1" """ return self._uri_reference.host.encode("ascii") @property def port(self) -> typing.Optional[int]: """ The URL port as an integer. Note that the URL class performs port normalization as per the WHATWG spec. Default ports for "http", "https", "ws", "wss", and "ftp" schemes are always treated as `None`. For example: assert httpx.URL("http://www.example.com") == httpx.URL("http://www.example.com:80") assert httpx.URL("http://www.example.com:80").port is None """ return self._uri_reference.port @property def netloc(self) -> bytes: """ Either `` or `:` as bytes. Always normalized to lowercase, and IDNA encoded. This property may be used for generating the value of a request "Host" header. """ return self._uri_reference.netloc.encode("ascii") @property def path(self) -> str: """ The URL path as a string. Excluding the query string, and URL decoded. For example: url = httpx.URL("https://example.com/pa%20th") assert url.path == "/pa th" """ path = self._uri_reference.path or "/" return unquote(path) @property def query(self) -> bytes: """ The URL query string, as raw bytes, excluding the leading b"?". This is necessarily a bytewise interface, because we cannot perform URL decoding of this representation until we've parsed the keys and values into a QueryParams instance. For example: url = httpx.URL("https://example.com/?filter=some%20search%20terms") assert url.query == b"filter=some%20search%20terms" """ query = self._uri_reference.query or "" return query.encode("ascii") @property def params(self) -> "QueryParams": """ The URL query parameters, neatly parsed and packaged into an immutable multidict representation. """ return QueryParams(self._uri_reference.query) @property def raw_path(self) -> bytes: """ The complete URL path and query string as raw bytes. Used as the target when constructing HTTP requests. For example: GET /users?search=some%20text HTTP/1.1 Host: www.example.org Connection: close """ path = self._uri_reference.path or "/" if self._uri_reference.query is not None: path += "?" + self._uri_reference.query return path.encode("ascii") @property def fragment(self) -> str: """ The URL fragments, as used in HTML anchors. As a string, without the leading '#'. """ return unquote(self._uri_reference.fragment or "") @property def raw(self) -> RawURL: """ Provides the (scheme, host, port, target) for the outgoing request. In older versions of `httpx` this was used in the low-level transport API. We no longer use `RawURL`, and this property will be deprecated in a future release. """ return RawURL( self.raw_scheme, self.raw_host, self.port, self.raw_path, ) @property def is_absolute_url(self) -> bool: """ Return `True` for absolute URLs such as 'http://example.com/path', and `False` for relative URLs such as '/path'. """ # We don't use `.is_absolute` from `rfc3986` because it treats # URLs with a fragment portion as not absolute. # What we actually care about is if the URL provides # a scheme and hostname to which connections should be made. return bool(self._uri_reference.scheme and self._uri_reference.host) @property def is_relative_url(self) -> bool: """ Return `False` for absolute URLs such as 'http://example.com/path', and `True` for relative URLs such as '/path'. """ return not self.is_absolute_url def copy_with(self, **kwargs: typing.Any) -> "URL": """ Copy this URL, returning a new URL with some components altered. Accepts the same set of parameters as the components that are made available via properties on the `URL` class. For example: url = httpx.URL("https://www.example.com").copy_with( username="jo@gmail.com", password="a secret" ) assert url == "https://jo%40email.com:a%20secret@www.example.com" """ return URL(self, **kwargs) def copy_set_param(self, key: str, value: typing.Any = None) -> "URL": return self.copy_with(params=self.params.set(key, value)) def copy_add_param(self, key: str, value: typing.Any = None) -> "URL": return self.copy_with(params=self.params.add(key, value)) def copy_remove_param(self, key: str) -> "URL": return self.copy_with(params=self.params.remove(key)) def copy_merge_params(self, params: QueryParamTypes) -> "URL": return self.copy_with(params=self.params.merge(params)) def join(self, url: URLTypes) -> "URL": """ Return an absolute URL, using this URL as the base. Eg. url = httpx.URL("https://www.example.com/test") url = url.join("/new/path") assert url == "https://www.example.com/new/path" """ from urllib.parse import urljoin return URL(urljoin(str(self), str(URL(url)))) def __hash__(self) -> int: return hash(str(self)) def __eq__(self, other: typing.Any) -> bool: return isinstance(other, (URL, str)) and str(self) == str(URL(other)) def __str__(self) -> str: return str(self._uri_reference) def __repr__(self) -> str: scheme, userinfo, host, port, path, query, fragment = self._uri_reference if ":" in userinfo: # Mask any password component. userinfo = f'{userinfo.split(":")[0]}:[secure]' authority = "".join( [ f"{userinfo}@" if userinfo else "", f"[{host}]" if ":" in host else host, f":{port}" if port is not None else "", ] ) url = "".join( [ f"{self.scheme}:" if scheme else "", f"//{authority}" if authority else "", path, f"?{query}" if query is not None else "", f"#{fragment}" if fragment is not None else "", ] ) return f"{self.__class__.__name__}({url!r})" class QueryParams(typing.Mapping[str, str]): """ URL query parameters, as a multi-dict. """ def __init__( self, *args: typing.Optional[QueryParamTypes], **kwargs: typing.Any ) -> None: assert len(args) < 2, "Too many arguments." assert not (args and kwargs), "Cannot mix named and unnamed arguments." value = args[0] if args else kwargs if value is None or isinstance(value, (str, bytes)): value = value.decode("ascii") if isinstance(value, bytes) else value self._dict = parse_qs(value, keep_blank_values=True) elif isinstance(value, QueryParams): self._dict = {k: list(v) for k, v in value._dict.items()} else: dict_value: typing.Dict[typing.Any, typing.List[typing.Any]] = {} if isinstance(value, (list, tuple)): # Convert list inputs like: # [("a", "123"), ("a", "456"), ("b", "789")] # To a dict representation, like: # {"a": ["123", "456"], "b": ["789"]} for item in value: dict_value.setdefault(item[0], []).append(item[1]) else: # Convert dict inputs like: # {"a": "123", "b": ["456", "789"]} # To dict inputs where values are always lists, like: # {"a": ["123"], "b": ["456", "789"]} dict_value = { k: list(v) if isinstance(v, (list, tuple)) else [v] for k, v in value.items() } # Ensure that keys and values are neatly coerced to strings. # We coerce values `True` and `False` to JSON-like "true" and "false" # representations, and coerce `None` values to the empty string. self._dict = { str(k): [primitive_value_to_str(item) for item in v] for k, v in dict_value.items() } def keys(self) -> typing.KeysView[str]: """ Return all the keys in the query params. Usage: q = httpx.QueryParams("a=123&a=456&b=789") assert list(q.keys()) == ["a", "b"] """ return self._dict.keys() def values(self) -> typing.ValuesView[str]: """ Return all the values in the query params. If a key occurs more than once only the first item for that key is returned. Usage: q = httpx.QueryParams("a=123&a=456&b=789") assert list(q.values()) == ["123", "789"] """ return {k: v[0] for k, v in self._dict.items()}.values() def items(self) -> typing.ItemsView[str, str]: """ Return all items in the query params. If a key occurs more than once only the first item for that key is returned. Usage: q = httpx.QueryParams("a=123&a=456&b=789") assert list(q.items()) == [("a", "123"), ("b", "789")] """ return {k: v[0] for k, v in self._dict.items()}.items() def multi_items(self) -> typing.List[typing.Tuple[str, str]]: """ Return all items in the query params. Allow duplicate keys to occur. Usage: q = httpx.QueryParams("a=123&a=456&b=789") assert list(q.multi_items()) == [("a", "123"), ("a", "456"), ("b", "789")] """ multi_items: typing.List[typing.Tuple[str, str]] = [] for k, v in self._dict.items(): multi_items.extend([(k, i) for i in v]) return multi_items def get(self, key: typing.Any, default: typing.Any = None) -> typing.Any: """ Get a value from the query param for a given key. If the key occurs more than once, then only the first value is returned. Usage: q = httpx.QueryParams("a=123&a=456&b=789") assert q.get("a") == "123" """ if key in self._dict: return self._dict[str(key)][0] return default def get_list(self, key: str) -> typing.List[str]: """ Get all values from the query param for a given key. Usage: q = httpx.QueryParams("a=123&a=456&b=789") assert q.get_list("a") == ["123", "456"] """ return list(self._dict.get(str(key), [])) def set(self, key: str, value: typing.Any = None) -> "QueryParams": """ Return a new QueryParams instance, setting the value of a key. Usage: q = httpx.QueryParams("a=123") q = q.set("a", "456") assert q == httpx.QueryParams("a=456") """ q = QueryParams() q._dict = dict(self._dict) q._dict[str(key)] = [primitive_value_to_str(value)] return q def add(self, key: str, value: typing.Any = None) -> "QueryParams": """ Return a new QueryParams instance, setting or appending the value of a key. Usage: q = httpx.QueryParams("a=123") q = q.add("a", "456") assert q == httpx.QueryParams("a=123&a=456") """ q = QueryParams() q._dict = dict(self._dict) q._dict[str(key)] = q.get_list(key) + [primitive_value_to_str(value)] return q def remove(self, key: str) -> "QueryParams": """ Return a new QueryParams instance, removing the value of a key. Usage: q = httpx.QueryParams("a=123") q = q.remove("a") assert q == httpx.QueryParams("") """ q = QueryParams() q._dict = dict(self._dict) q._dict.pop(str(key), None) return q def merge(self, params: typing.Optional[QueryParamTypes] = None) -> "QueryParams": """ Return a new QueryParams instance, updated with. Usage: q = httpx.QueryParams("a=123") q = q.merge({"b": "456"}) assert q == httpx.QueryParams("a=123&b=456") q = httpx.QueryParams("a=123") q = q.merge({"a": "456", "b": "789"}) assert q == httpx.QueryParams("a=456&b=789") """ q = QueryParams(params) q._dict = {**self._dict, **q._dict} return q def __getitem__(self, key: typing.Any) -> str: return self._dict[key][0] def __contains__(self, key: typing.Any) -> bool: return key in self._dict def __iter__(self) -> typing.Iterator[typing.Any]: return iter(self.keys()) def __len__(self) -> int: return len(self._dict) def __bool__(self) -> bool: return bool(self._dict) def __hash__(self) -> int: return hash(str(self)) def __eq__(self, other: typing.Any) -> bool: if not isinstance(other, self.__class__): return False return sorted(self.multi_items()) == sorted(other.multi_items()) def __str__(self) -> str: """ Note that we use '%20' encoding for spaces, and treat '/' as a safe character. See https://github.com/encode/httpx/issues/2536 and https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode """ return urlencode(self.multi_items()) def __repr__(self) -> str: class_name = self.__class__.__name__ query_string = str(self) return f"{class_name}({query_string!r})" def update(self, params: typing.Optional[QueryParamTypes] = None) -> None: raise RuntimeError( "QueryParams are immutable since 0.18.0. " "Use `q = q.merge(...)` to create an updated copy." ) def __setitem__(self, key: str, value: str) -> None: raise RuntimeError( "QueryParams are immutable since 0.18.0. " "Use `q = q.set(key, value)` to create an updated copy." ) httpx-0.26.0/httpx/_utils.py000066400000000000000000000333651454054354600160120ustar00rootroot00000000000000import codecs import email.message import ipaddress import mimetypes import os import re import time import typing from pathlib import Path from urllib.request import getproxies import sniffio from ._types import PrimitiveData if typing.TYPE_CHECKING: # pragma: no cover from ._urls import URL _HTML5_FORM_ENCODING_REPLACEMENTS = {'"': "%22", "\\": "\\\\"} _HTML5_FORM_ENCODING_REPLACEMENTS.update( {chr(c): "%{:02X}".format(c) for c in range(0x1F + 1) if c != 0x1B} ) _HTML5_FORM_ENCODING_RE = re.compile( r"|".join([re.escape(c) for c in _HTML5_FORM_ENCODING_REPLACEMENTS.keys()]) ) def normalize_header_key( value: typing.Union[str, bytes], lower: bool, encoding: typing.Optional[str] = None, ) -> bytes: """ Coerce str/bytes into a strictly byte-wise HTTP header key. """ if isinstance(value, bytes): bytes_value = value else: bytes_value = value.encode(encoding or "ascii") return bytes_value.lower() if lower else bytes_value def normalize_header_value( value: typing.Union[str, bytes], encoding: typing.Optional[str] = None ) -> bytes: """ Coerce str/bytes into a strictly byte-wise HTTP header value. """ if isinstance(value, bytes): return value return value.encode(encoding or "ascii") def primitive_value_to_str(value: "PrimitiveData") -> str: """ Coerce a primitive data type into a string value. Note that we prefer JSON-style 'true'/'false' for boolean values here. """ if value is True: return "true" elif value is False: return "false" elif value is None: return "" return str(value) def is_known_encoding(encoding: str) -> bool: """ Return `True` if `encoding` is a known codec. """ try: codecs.lookup(encoding) except LookupError: return False return True def format_form_param(name: str, value: str) -> bytes: """ Encode a name/value pair within a multipart form. """ def replacer(match: typing.Match[str]) -> str: return _HTML5_FORM_ENCODING_REPLACEMENTS[match.group(0)] value = _HTML5_FORM_ENCODING_RE.sub(replacer, value) return f'{name}="{value}"'.encode() def get_ca_bundle_from_env() -> typing.Optional[str]: if "SSL_CERT_FILE" in os.environ: ssl_file = Path(os.environ["SSL_CERT_FILE"]) if ssl_file.is_file(): return str(ssl_file) if "SSL_CERT_DIR" in os.environ: ssl_path = Path(os.environ["SSL_CERT_DIR"]) if ssl_path.is_dir(): return str(ssl_path) return None def parse_header_links(value: str) -> typing.List[typing.Dict[str, str]]: """ Returns a list of parsed link headers, for more info see: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Link The generic syntax of those is: Link: < uri-reference >; param1=value1; param2="value2" So for instance: Link; '; type="image/jpeg",;' would return [ {"url": "http:/.../front.jpeg", "type": "image/jpeg"}, {"url": "http://.../back.jpeg"}, ] :param value: HTTP Link entity-header field :return: list of parsed link headers """ links: typing.List[typing.Dict[str, str]] = [] replace_chars = " '\"" value = value.strip(replace_chars) if not value: return links for val in re.split(", *<", value): try: url, params = val.split(";", 1) except ValueError: url, params = val, "" link = {"url": url.strip("<> '\"")} for param in params.split(";"): try: key, value = param.split("=") except ValueError: break link[key.strip(replace_chars)] = value.strip(replace_chars) links.append(link) return links def parse_content_type_charset(content_type: str) -> typing.Optional[str]: # We used to use `cgi.parse_header()` here, but `cgi` became a dead battery. # See: https://peps.python.org/pep-0594/#cgi msg = email.message.Message() msg["content-type"] = content_type return msg.get_content_charset(failobj=None) SENSITIVE_HEADERS = {"authorization", "proxy-authorization"} def obfuscate_sensitive_headers( items: typing.Iterable[typing.Tuple[typing.AnyStr, typing.AnyStr]], ) -> typing.Iterator[typing.Tuple[typing.AnyStr, typing.AnyStr]]: for k, v in items: if to_str(k.lower()) in SENSITIVE_HEADERS: v = to_bytes_or_str("[secure]", match_type_of=v) yield k, v def port_or_default(url: "URL") -> typing.Optional[int]: if url.port is not None: return url.port return {"http": 80, "https": 443}.get(url.scheme) def same_origin(url: "URL", other: "URL") -> bool: """ Return 'True' if the given URLs share the same origin. """ return ( url.scheme == other.scheme and url.host == other.host and port_or_default(url) == port_or_default(other) ) def is_https_redirect(url: "URL", location: "URL") -> bool: """ Return 'True' if 'location' is a HTTPS upgrade of 'url' """ if url.host != location.host: return False return ( url.scheme == "http" and port_or_default(url) == 80 and location.scheme == "https" and port_or_default(location) == 443 ) def get_environment_proxies() -> typing.Dict[str, typing.Optional[str]]: """Gets proxy information from the environment""" # urllib.request.getproxies() falls back on System # Registry and Config for proxies on Windows and macOS. # We don't want to propagate non-HTTP proxies into # our configuration such as 'TRAVIS_APT_PROXY'. proxy_info = getproxies() mounts: typing.Dict[str, typing.Optional[str]] = {} for scheme in ("http", "https", "all"): if proxy_info.get(scheme): hostname = proxy_info[scheme] mounts[f"{scheme}://"] = ( hostname if "://" in hostname else f"http://{hostname}" ) no_proxy_hosts = [host.strip() for host in proxy_info.get("no", "").split(",")] for hostname in no_proxy_hosts: # See https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html for details # on how names in `NO_PROXY` are handled. if hostname == "*": # If NO_PROXY=* is used or if "*" occurs as any one of the comma # separated hostnames, then we should just bypass any information # from HTTP_PROXY, HTTPS_PROXY, ALL_PROXY, and always ignore # proxies. return {} elif hostname: # NO_PROXY=.google.com is marked as "all://*.google.com, # which disables "www.google.com" but not "google.com" # NO_PROXY=google.com is marked as "all://*google.com, # which disables "www.google.com" and "google.com". # (But not "wwwgoogle.com") # NO_PROXY can include domains, IPv6, IPv4 addresses and "localhost" # NO_PROXY=example.com,::1,localhost,192.168.0.0/16 if "://" in hostname: mounts[hostname] = None elif is_ipv4_hostname(hostname): mounts[f"all://{hostname}"] = None elif is_ipv6_hostname(hostname): mounts[f"all://[{hostname}]"] = None elif hostname.lower() == "localhost": mounts[f"all://{hostname}"] = None else: mounts[f"all://*{hostname}"] = None return mounts def to_bytes(value: typing.Union[str, bytes], encoding: str = "utf-8") -> bytes: return value.encode(encoding) if isinstance(value, str) else value def to_str(value: typing.Union[str, bytes], encoding: str = "utf-8") -> str: return value if isinstance(value, str) else value.decode(encoding) def to_bytes_or_str(value: str, match_type_of: typing.AnyStr) -> typing.AnyStr: return value if isinstance(match_type_of, str) else value.encode() def unquote(value: str) -> str: return value[1:-1] if value[0] == value[-1] == '"' else value def guess_content_type(filename: typing.Optional[str]) -> typing.Optional[str]: if filename: return mimetypes.guess_type(filename)[0] or "application/octet-stream" return None def peek_filelike_length(stream: typing.Any) -> typing.Optional[int]: """ Given a file-like stream object, return its length in number of bytes without reading it into memory. """ try: # Is it an actual file? fd = stream.fileno() # Yup, seems to be an actual file. length = os.fstat(fd).st_size except (AttributeError, OSError): # No... Maybe it's something that supports random access, like `io.BytesIO`? try: # Assuming so, go to end of stream to figure out its length, # then put it back in place. offset = stream.tell() length = stream.seek(0, os.SEEK_END) stream.seek(offset) except (AttributeError, OSError): # Not even that? Sorry, we're doomed... return None return length class Timer: async def _get_time(self) -> float: library = sniffio.current_async_library() if library == "trio": import trio return trio.current_time() else: import asyncio return asyncio.get_event_loop().time() def sync_start(self) -> None: self.started = time.perf_counter() async def async_start(self) -> None: self.started = await self._get_time() def sync_elapsed(self) -> float: now = time.perf_counter() return now - self.started async def async_elapsed(self) -> float: now = await self._get_time() return now - self.started class URLPattern: """ A utility class currently used for making lookups against proxy keys... # Wildcard matching... >>> pattern = URLPattern("all://") >>> pattern.matches(httpx.URL("http://example.com")) True # Witch scheme matching... >>> pattern = URLPattern("https://") >>> pattern.matches(httpx.URL("https://example.com")) True >>> pattern.matches(httpx.URL("http://example.com")) False # With domain matching... >>> pattern = URLPattern("https://example.com") >>> pattern.matches(httpx.URL("https://example.com")) True >>> pattern.matches(httpx.URL("http://example.com")) False >>> pattern.matches(httpx.URL("https://other.com")) False # Wildcard scheme, with domain matching... >>> pattern = URLPattern("all://example.com") >>> pattern.matches(httpx.URL("https://example.com")) True >>> pattern.matches(httpx.URL("http://example.com")) True >>> pattern.matches(httpx.URL("https://other.com")) False # With port matching... >>> pattern = URLPattern("https://example.com:1234") >>> pattern.matches(httpx.URL("https://example.com:1234")) True >>> pattern.matches(httpx.URL("https://example.com")) False """ def __init__(self, pattern: str) -> None: from ._urls import URL if pattern and ":" not in pattern: raise ValueError( f"Proxy keys should use proper URL forms rather " f"than plain scheme strings. " f'Instead of "{pattern}", use "{pattern}://"' ) url = URL(pattern) self.pattern = pattern self.scheme = "" if url.scheme == "all" else url.scheme self.host = "" if url.host == "*" else url.host self.port = url.port if not url.host or url.host == "*": self.host_regex: typing.Optional[typing.Pattern[str]] = None elif url.host.startswith("*."): # *.example.com should match "www.example.com", but not "example.com" domain = re.escape(url.host[2:]) self.host_regex = re.compile(f"^.+\\.{domain}$") elif url.host.startswith("*"): # *example.com should match "www.example.com" and "example.com" domain = re.escape(url.host[1:]) self.host_regex = re.compile(f"^(.+\\.)?{domain}$") else: # example.com should match "example.com" but not "www.example.com" domain = re.escape(url.host) self.host_regex = re.compile(f"^{domain}$") def matches(self, other: "URL") -> bool: if self.scheme and self.scheme != other.scheme: return False if ( self.host and self.host_regex is not None and not self.host_regex.match(other.host) ): return False if self.port is not None and self.port != other.port: return False return True @property def priority(self) -> typing.Tuple[int, int, int]: """ The priority allows URLPattern instances to be sortable, so that we can match from most specific to least specific. """ # URLs with a port should take priority over URLs without a port. port_priority = 0 if self.port is not None else 1 # Longer hostnames should match first. host_priority = -len(self.host) # Longer schemes should match first. scheme_priority = -len(self.scheme) return (port_priority, host_priority, scheme_priority) def __hash__(self) -> int: return hash(self.pattern) def __lt__(self, other: "URLPattern") -> bool: return self.priority < other.priority def __eq__(self, other: typing.Any) -> bool: return isinstance(other, URLPattern) and self.pattern == other.pattern def is_ipv4_hostname(hostname: str) -> bool: try: ipaddress.IPv4Address(hostname.split("/")[0]) except Exception: return False return True def is_ipv6_hostname(hostname: str) -> bool: try: ipaddress.IPv6Address(hostname.split("/")[0]) except Exception: return False return True httpx-0.26.0/httpx/py.typed000066400000000000000000000000001454054354600156140ustar00rootroot00000000000000httpx-0.26.0/mkdocs.yml000066400000000000000000000026411454054354600147660ustar00rootroot00000000000000site_name: HTTPX site_description: A next-generation HTTP client for Python. site_url: https://www.python-httpx.org/ theme: name: 'material' palette: - scheme: 'default' media: '(prefers-color-scheme: light)' toggle: icon: 'material/lightbulb' name: "Switch to dark mode" - scheme: 'slate' media: '(prefers-color-scheme: dark)' primary: 'blue' toggle: icon: 'material/lightbulb-outline' name: 'Switch to light mode' features: - navigation.sections repo_name: encode/httpx repo_url: https://github.com/encode/httpx/ edit_uri: "" nav: - Introduction: 'index.md' - Usage: - QuickStart: 'quickstart.md' - Advanced Usage: 'advanced.md' - Guides: - Async Support: 'async.md' - HTTP/2 Support: 'http2.md' - Logging: 'logging.md' - Requests Compatibility: 'compatibility.md' - Troubleshooting: 'troubleshooting.md' - API Reference: - Developer Interface: 'api.md' - Exceptions: 'exceptions.md' - Environment Variables: 'environment_variables.md' - Community: - Third Party Packages: 'third_party_packages.md' - Contributing: 'contributing.md' - Code of Conduct: 'code_of_conduct.md' markdown_extensions: - admonition - codehilite: css_class: highlight - mkautodoc extra_css: - css/custom.css httpx-0.26.0/pyproject.toml000066400000000000000000000070441454054354600157010ustar00rootroot00000000000000[build-system] requires = ["hatchling", "hatch-fancy-pypi-readme"] build-backend = "hatchling.build" [project] name = "httpx" description = "The next generation HTTP client." license = "BSD-3-Clause" requires-python = ">=3.8" authors = [ { name = "Tom Christie", email = "tom@tomchristie.com" }, ] classifiers = [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: AsyncIO", "Framework :: Trio", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Internet :: WWW/HTTP", ] dependencies = [ "certifi", "httpcore==1.*", "anyio", "idna", "sniffio", ] dynamic = ["readme", "version"] [project.optional-dependencies] brotli = [ "brotli; platform_python_implementation == 'CPython'", "brotlicffi; platform_python_implementation != 'CPython'", ] cli = [ "click==8.*", "pygments==2.*", "rich>=10,<14", ] http2 = [ "h2>=3,<5", ] socks = [ "socksio==1.*", ] [project.scripts] httpx = "httpx:main" [project.urls] Changelog = "https://github.com/encode/httpx/blob/master/CHANGELOG.md" Documentation = "https://www.python-httpx.org" Homepage = "https://github.com/encode/httpx" Source = "https://github.com/encode/httpx" [tool.hatch.version] path = "httpx/__version__.py" [tool.hatch.build.targets.sdist] include = [ "/httpx", "/CHANGELOG.md", "/README.md", "/tests", ] [tool.hatch.metadata.hooks.fancy-pypi-readme] content-type = "text/markdown" [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] path = "README.md" [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] text = "\n## Release Information\n\n" [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] path = "CHANGELOG.md" pattern = "\n(###.+?\n)## " [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] text = "\n---\n\n[Full changelog](https://github.com/encode/httpx/blob/master/CHANGELOG.md)\n" [[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]] pattern = 'src="(docs/img/.*?)"' replacement = 'src="https://raw.githubusercontent.com/encode/httpx/master/\1"' # https://beta.ruff.rs/docs/configuration/#using-rufftoml [tool.ruff] select = ["E", "F", "I", "B", "PIE"] ignore = ["B904", "B028"] [tool.ruff.isort] combine-as-imports = true [tool.mypy] ignore_missing_imports = true strict = true [[tool.mypy.overrides]] module = "tests.*" disallow_untyped_defs = false check_untyped_defs = true [tool.pytest.ini_options] addopts = "-rxXs" filterwarnings = [ "error", "ignore: You seem to already have a custom sys.excepthook handler installed. I'll skip installing Trio's custom handler, but this means MultiErrors will not show full tracebacks.:RuntimeWarning", # See: https://github.com/agronholm/anyio/issues/508 "ignore: trio.MultiError is deprecated since Trio 0.22.0:trio.TrioDeprecationWarning" ] markers = [ "copied_from(source, changes=None): mark test as copied from somewhere else, along with a description of changes made to accodomate e.g. our test setup", "network: marks tests which require network connection. Used in 3rd-party build environments that have network disabled." ] [tool.coverage.run] omit = ["venv/*", "httpx/_compat.py"] include = ["httpx/*", "tests/*"] httpx-0.26.0/requirements.txt000066400000000000000000000013321454054354600162430ustar00rootroot00000000000000# We're pinning our tooling, because it's an environment we can strictly control. # On the other hand, we're not pinning package dependencies, because our tests # needs to pass with the latest version of the packages. # Reference: https://github.com/encode/httpx/pull/1721#discussion_r661241588 -e .[brotli,cli,http2,socks] # Optional charset auto-detection # Used in our test cases chardet==5.2.0 types-chardet==5.0.4.5 # Documentation mkdocs==1.5.3 mkautodoc==0.2.0 mkdocs-material==9.4.14 # Packaging build==1.0.3 twine==4.0.2 # Tests & Linting coverage[toml]==7.3.0 cryptography==41.0.7 mypy==1.5.1 types-certifi==2021.10.8.2 pytest==7.4.3 ruff==0.1.6 trio==0.22.2 trio-typing==0.10.0 trustme==1.1.0 uvicorn==0.24.0.post1 httpx-0.26.0/scripts/000077500000000000000000000000001454054354600144475ustar00rootroot00000000000000httpx-0.26.0/scripts/build000077500000000000000000000002471454054354600154770ustar00rootroot00000000000000#!/bin/sh -e if [ -d 'venv' ] ; then PREFIX="venv/bin/" else PREFIX="" fi set -x ${PREFIX}python -m build ${PREFIX}twine check dist/* ${PREFIX}mkdocs build httpx-0.26.0/scripts/check000077500000000000000000000004021454054354600154460ustar00rootroot00000000000000#!/bin/sh -e export PREFIX="" if [ -d 'venv' ] ; then export PREFIX="venv/bin/" fi export SOURCE_FILES="httpx tests" set -x ./scripts/sync-version ${PREFIX}ruff format $SOURCE_FILES --diff ${PREFIX}mypy $SOURCE_FILES ${PREFIX}ruff check $SOURCE_FILES httpx-0.26.0/scripts/clean000077500000000000000000000003201454054354600154520ustar00rootroot00000000000000#!/bin/sh -e if [ -d 'dist' ] ; then rm -r dist fi if [ -d 'site' ] ; then rm -r site fi if [ -d 'htmlcov' ] ; then rm -r htmlcov fi if [ -d 'httpx.egg-info' ] ; then rm -r httpx.egg-info fi httpx-0.26.0/scripts/coverage000077500000000000000000000003131454054354600161650ustar00rootroot00000000000000#!/bin/sh -e export PREFIX="" if [ -d 'venv' ] ; then export PREFIX="venv/bin/" fi export SOURCE_FILES="httpx tests" set -x ${PREFIX}coverage report --show-missing --skip-covered --fail-under=100 httpx-0.26.0/scripts/docs000077500000000000000000000001671454054354600153310ustar00rootroot00000000000000#!/bin/sh -e export PREFIX="" if [ -d 'venv' ] ; then export PREFIX="venv/bin/" fi set -x ${PREFIX}mkdocs serve httpx-0.26.0/scripts/install000077500000000000000000000005451454054354600160470ustar00rootroot00000000000000#!/bin/sh -e # Use the Python executable provided from the `-p` option, or a default. [ "$1" = "-p" ] && PYTHON=$2 || PYTHON="python3" REQUIREMENTS="requirements.txt" VENV="venv" set -x if [ -z "$GITHUB_ACTIONS" ]; then "$PYTHON" -m venv "$VENV" PIP="$VENV/bin/pip" else PIP="pip" fi "$PIP" install -U pip "$PIP" install -r "$REQUIREMENTS" httpx-0.26.0/scripts/lint000077500000000000000000000003071454054354600153430ustar00rootroot00000000000000#!/bin/sh -e export PREFIX="" if [ -d 'venv' ]; then export PREFIX="venv/bin/" fi export SOURCE_FILES="httpx tests" set -x ${PREFIX}ruff --fix $SOURCE_FILES ${PREFIX}ruff format $SOURCE_FILES httpx-0.26.0/scripts/publish000077500000000000000000000011201454054354600160350ustar00rootroot00000000000000#!/bin/sh -e VERSION_FILE="httpx/__version__.py" if [ -d 'venv' ] ; then PREFIX="venv/bin/" else PREFIX="" fi if [ ! -z "$GITHUB_ACTIONS" ]; then git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" git config --local user.name "GitHub Action" VERSION=`grep __version__ ${VERSION_FILE} | grep -o '[0-9][^"]*'` if [ "refs/tags/${VERSION}" != "${GITHUB_REF}" ] ; then echo "GitHub Ref '${GITHUB_REF}' did not match package version '${VERSION}'" exit 1 fi fi set -x ${PREFIX}twine upload dist/* ${PREFIX}mkdocs gh-deploy --force httpx-0.26.0/scripts/sync-version000077500000000000000000000007251454054354600170400ustar00rootroot00000000000000#!/bin/sh -e SEMVER_REGEX="([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?" CHANGELOG_VERSION=$(grep -o -E $SEMVER_REGEX CHANGELOG.md | sed -n 2p) VERSION=$(grep -o -E $SEMVER_REGEX httpx/__version__.py | head -1) echo "CHANGELOG_VERSION: $CHANGELOG_VERSION" echo "VERSION: $VERSION" if [ "$CHANGELOG_VERSION" != "$VERSION" ]; then echo "Version in changelog does not match version in httpx/__version__.py!" exit 1 fi httpx-0.26.0/scripts/test000077500000000000000000000003631454054354600153560ustar00rootroot00000000000000#!/bin/sh export PREFIX="" if [ -d 'venv' ] ; then export PREFIX="venv/bin/" fi set -ex if [ -z $GITHUB_ACTIONS ]; then scripts/check fi ${PREFIX}coverage run -m pytest "$@" if [ -z $GITHUB_ACTIONS ]; then scripts/coverage fi httpx-0.26.0/tests/000077500000000000000000000000001454054354600141225ustar00rootroot00000000000000httpx-0.26.0/tests/__init__.py000066400000000000000000000000001454054354600162210ustar00rootroot00000000000000httpx-0.26.0/tests/client/000077500000000000000000000000001454054354600154005ustar00rootroot00000000000000httpx-0.26.0/tests/client/__init__.py000066400000000000000000000000001454054354600174770ustar00rootroot00000000000000httpx-0.26.0/tests/client/test_async_client.py000066400000000000000000000266001454054354600214700ustar00rootroot00000000000000import typing from datetime import timedelta import pytest import httpx @pytest.mark.anyio async def test_get(server): url = server.url async with httpx.AsyncClient(http2=True) as client: response = await client.get(url) assert response.status_code == 200 assert response.text == "Hello, world!" assert response.http_version == "HTTP/1.1" assert response.headers assert repr(response) == "" assert response.elapsed > timedelta(seconds=0) @pytest.mark.parametrize( "url", [ pytest.param("invalid://example.org", id="scheme-not-http(s)"), pytest.param("://example.org", id="no-scheme"), pytest.param("http://", id="no-host"), ], ) @pytest.mark.anyio async def test_get_invalid_url(server, url): async with httpx.AsyncClient() as client: with pytest.raises((httpx.UnsupportedProtocol, httpx.LocalProtocolError)): await client.get(url) @pytest.mark.anyio async def test_build_request(server): url = server.url.copy_with(path="/echo_headers") headers = {"Custom-header": "value"} async with httpx.AsyncClient() as client: request = client.build_request("GET", url) request.headers.update(headers) response = await client.send(request) assert response.status_code == 200 assert response.url == url assert response.json()["Custom-header"] == "value" @pytest.mark.anyio async def test_post(server): url = server.url async with httpx.AsyncClient() as client: response = await client.post(url, content=b"Hello, world!") assert response.status_code == 200 @pytest.mark.anyio async def test_post_json(server): url = server.url async with httpx.AsyncClient() as client: response = await client.post(url, json={"text": "Hello, world!"}) assert response.status_code == 200 @pytest.mark.anyio async def test_stream_response(server): async with httpx.AsyncClient() as client: async with client.stream("GET", server.url) as response: body = await response.aread() assert response.status_code == 200 assert body == b"Hello, world!" assert response.content == b"Hello, world!" @pytest.mark.anyio async def test_access_content_stream_response(server): async with httpx.AsyncClient() as client: async with client.stream("GET", server.url) as response: pass assert response.status_code == 200 with pytest.raises(httpx.ResponseNotRead): response.content # noqa: B018 @pytest.mark.anyio async def test_stream_request(server): async def hello_world() -> typing.AsyncIterator[bytes]: yield b"Hello, " yield b"world!" async with httpx.AsyncClient() as client: response = await client.post(server.url, content=hello_world()) assert response.status_code == 200 @pytest.mark.anyio async def test_cannot_stream_sync_request(server): def hello_world() -> typing.Iterator[bytes]: # pragma: no cover yield b"Hello, " yield b"world!" async with httpx.AsyncClient() as client: with pytest.raises(RuntimeError): await client.post(server.url, content=hello_world()) @pytest.mark.anyio async def test_raise_for_status(server): async with httpx.AsyncClient() as client: for status_code in (200, 400, 404, 500, 505): response = await client.request( "GET", server.url.copy_with(path=f"/status/{status_code}") ) if 400 <= status_code < 600: with pytest.raises(httpx.HTTPStatusError) as exc_info: response.raise_for_status() assert exc_info.value.response == response else: assert response.raise_for_status() is response @pytest.mark.anyio async def test_options(server): async with httpx.AsyncClient() as client: response = await client.options(server.url) assert response.status_code == 200 assert response.text == "Hello, world!" @pytest.mark.anyio async def test_head(server): async with httpx.AsyncClient() as client: response = await client.head(server.url) assert response.status_code == 200 assert response.text == "" @pytest.mark.anyio async def test_put(server): async with httpx.AsyncClient() as client: response = await client.put(server.url, content=b"Hello, world!") assert response.status_code == 200 @pytest.mark.anyio async def test_patch(server): async with httpx.AsyncClient() as client: response = await client.patch(server.url, content=b"Hello, world!") assert response.status_code == 200 @pytest.mark.anyio async def test_delete(server): async with httpx.AsyncClient() as client: response = await client.delete(server.url) assert response.status_code == 200 assert response.text == "Hello, world!" @pytest.mark.anyio async def test_100_continue(server): headers = {"Expect": "100-continue"} content = b"Echo request body" async with httpx.AsyncClient() as client: response = await client.post( server.url.copy_with(path="/echo_body"), headers=headers, content=content ) assert response.status_code == 200 assert response.content == content @pytest.mark.anyio async def test_context_managed_transport(): class Transport(httpx.AsyncBaseTransport): def __init__(self) -> None: self.events: typing.List[str] = [] async def aclose(self): # The base implementation of httpx.AsyncBaseTransport just # calls into `.aclose`, so simple transport cases can just override # this method for any cleanup, where more complex cases # might want to additionally override `__aenter__`/`__aexit__`. self.events.append("transport.aclose") async def __aenter__(self): await super().__aenter__() self.events.append("transport.__aenter__") async def __aexit__(self, *args): await super().__aexit__(*args) self.events.append("transport.__aexit__") transport = Transport() async with httpx.AsyncClient(transport=transport): pass assert transport.events == [ "transport.__aenter__", "transport.aclose", "transport.__aexit__", ] @pytest.mark.anyio async def test_context_managed_transport_and_mount(): class Transport(httpx.AsyncBaseTransport): def __init__(self, name: str) -> None: self.name: str = name self.events: typing.List[str] = [] async def aclose(self): # The base implementation of httpx.AsyncBaseTransport just # calls into `.aclose`, so simple transport cases can just override # this method for any cleanup, where more complex cases # might want to additionally override `__aenter__`/`__aexit__`. self.events.append(f"{self.name}.aclose") async def __aenter__(self): await super().__aenter__() self.events.append(f"{self.name}.__aenter__") async def __aexit__(self, *args): await super().__aexit__(*args) self.events.append(f"{self.name}.__aexit__") transport = Transport(name="transport") mounted = Transport(name="mounted") async with httpx.AsyncClient( transport=transport, mounts={"http://www.example.org": mounted} ): pass assert transport.events == [ "transport.__aenter__", "transport.aclose", "transport.__aexit__", ] assert mounted.events == [ "mounted.__aenter__", "mounted.aclose", "mounted.__aexit__", ] def hello_world(request): return httpx.Response(200, text="Hello, world!") @pytest.mark.anyio async def test_client_closed_state_using_implicit_open(): client = httpx.AsyncClient(transport=httpx.MockTransport(hello_world)) assert not client.is_closed await client.get("http://example.com") assert not client.is_closed await client.aclose() assert client.is_closed # Once we're close we cannot make any more requests. with pytest.raises(RuntimeError): await client.get("http://example.com") # Once we're closed we cannot reopen the client. with pytest.raises(RuntimeError): async with client: pass # pragma: no cover @pytest.mark.anyio async def test_client_closed_state_using_with_block(): async with httpx.AsyncClient(transport=httpx.MockTransport(hello_world)) as client: assert not client.is_closed await client.get("http://example.com") assert client.is_closed with pytest.raises(RuntimeError): await client.get("http://example.com") def unmounted(request: httpx.Request) -> httpx.Response: data = {"app": "unmounted"} return httpx.Response(200, json=data) def mounted(request: httpx.Request) -> httpx.Response: data = {"app": "mounted"} return httpx.Response(200, json=data) @pytest.mark.anyio async def test_mounted_transport(): transport = httpx.MockTransport(unmounted) mounts = {"custom://": httpx.MockTransport(mounted)} async with httpx.AsyncClient(transport=transport, mounts=mounts) as client: response = await client.get("https://www.example.com") assert response.status_code == 200 assert response.json() == {"app": "unmounted"} response = await client.get("custom://www.example.com") assert response.status_code == 200 assert response.json() == {"app": "mounted"} @pytest.mark.anyio async def test_async_mock_transport(): async def hello_world(request: httpx.Request) -> httpx.Response: return httpx.Response(200, text="Hello, world!") transport = httpx.MockTransport(hello_world) async with httpx.AsyncClient(transport=transport) as client: response = await client.get("https://www.example.com") assert response.status_code == 200 assert response.text == "Hello, world!" @pytest.mark.anyio async def test_cancellation_during_stream(): """ If any BaseException is raised during streaming the response, then the stream should be closed. This includes: * `asyncio.CancelledError` (A subclass of BaseException from Python 3.8 onwards.) * `trio.Cancelled` * `KeyboardInterrupt` * `SystemExit` See https://github.com/encode/httpx/issues/2139 """ stream_was_closed = False def response_with_cancel_during_stream(request): class CancelledStream(httpx.AsyncByteStream): async def __aiter__(self) -> typing.AsyncIterator[bytes]: yield b"Hello" raise KeyboardInterrupt() yield b", world" # pragma: no cover async def aclose(self) -> None: nonlocal stream_was_closed stream_was_closed = True return httpx.Response( 200, headers={"Content-Length": "12"}, stream=CancelledStream() ) transport = httpx.MockTransport(response_with_cancel_during_stream) async with httpx.AsyncClient(transport=transport) as client: with pytest.raises(KeyboardInterrupt): await client.get("https://www.example.com") assert stream_was_closed @pytest.mark.anyio async def test_server_extensions(server): url = server.url async with httpx.AsyncClient(http2=True) as client: response = await client.get(url) assert response.status_code == 200 assert response.extensions["http_version"] == b"HTTP/1.1" httpx-0.26.0/tests/client/test_auth.py000066400000000000000000000627431454054354600177660ustar00rootroot00000000000000""" Integration tests for authentication. Unit tests for auth classes also exist in tests/test_auth.py """ import hashlib import netrc import os import sys import threading import typing from urllib.request import parse_keqv_list import anyio import pytest import httpx from ..common import FIXTURES_DIR class App: """ A mock app to test auth credentials. """ def __init__(self, auth_header: str = "", status_code: int = 200) -> None: self.auth_header = auth_header self.status_code = status_code def __call__(self, request: httpx.Request) -> httpx.Response: headers = {"www-authenticate": self.auth_header} if self.auth_header else {} data = {"auth": request.headers.get("Authorization")} return httpx.Response(self.status_code, headers=headers, json=data) class DigestApp: def __init__( self, algorithm: str = "SHA-256", send_response_after_attempt: int = 1, qop: str = "auth", regenerate_nonce: bool = True, ) -> None: self.algorithm = algorithm self.send_response_after_attempt = send_response_after_attempt self.qop = qop self._regenerate_nonce = regenerate_nonce self._response_count = 0 def __call__(self, request: httpx.Request) -> httpx.Response: if self._response_count < self.send_response_after_attempt: return self.challenge_send(request) data = {"auth": request.headers.get("Authorization")} return httpx.Response(200, json=data) def challenge_send(self, request: httpx.Request) -> httpx.Response: self._response_count += 1 nonce = ( hashlib.sha256(os.urandom(8)).hexdigest() if self._regenerate_nonce else "ee96edced2a0b43e4869e96ebe27563f369c1205a049d06419bb51d8aeddf3d3" ) challenge_data = { "nonce": nonce, "qop": self.qop, "opaque": ( "ee6378f3ee14ebfd2fff54b70a91a7c9390518047f242ab2271380db0e14bda1" ), "algorithm": self.algorithm, "stale": "FALSE", } challenge_str = ", ".join( '{}="{}"'.format(key, value) for key, value in challenge_data.items() if value ) headers = { "www-authenticate": f'Digest realm="httpx@example.org", {challenge_str}', } return httpx.Response(401, headers=headers) class RepeatAuth(httpx.Auth): """ A mock authentication scheme that requires clients to send the request a fixed number of times, and then send a last request containing an aggregation of nonces that the server sent in 'WWW-Authenticate' headers of intermediate responses. """ requires_request_body = True def __init__(self, repeat: int) -> None: self.repeat = repeat def auth_flow( self, request: httpx.Request ) -> typing.Generator[httpx.Request, httpx.Response, None]: nonces = [] for index in range(self.repeat): request.headers["Authorization"] = f"Repeat {index}" response = yield request nonces.append(response.headers["www-authenticate"]) key = ".".join(nonces) request.headers["Authorization"] = f"Repeat {key}" yield request class ResponseBodyAuth(httpx.Auth): """ A mock authentication scheme that requires clients to send an 'Authorization' header, then send back the contents of the response in the 'Authorization' header. """ requires_response_body = True def __init__(self, token: str) -> None: self.token = token def auth_flow( self, request: httpx.Request ) -> typing.Generator[httpx.Request, httpx.Response, None]: request.headers["Authorization"] = self.token response = yield request data = response.text request.headers["Authorization"] = data yield request class SyncOrAsyncAuth(httpx.Auth): """ A mock authentication scheme that uses a different implementation for the sync and async cases. """ def __init__(self) -> None: self._lock = threading.Lock() self._async_lock = anyio.Lock() def sync_auth_flow( self, request: httpx.Request ) -> typing.Generator[httpx.Request, httpx.Response, None]: with self._lock: request.headers["Authorization"] = "sync-auth" yield request async def async_auth_flow( self, request: httpx.Request ) -> typing.AsyncGenerator[httpx.Request, httpx.Response]: async with self._async_lock: request.headers["Authorization"] = "async-auth" yield request @pytest.mark.anyio async def test_basic_auth() -> None: url = "https://example.org/" auth = ("user", "password123") app = App() async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": "Basic dXNlcjpwYXNzd29yZDEyMw=="} @pytest.mark.anyio async def test_basic_auth_with_stream() -> None: """ See: https://github.com/encode/httpx/pull/1312 """ url = "https://example.org/" auth = ("user", "password123") app = App() async with httpx.AsyncClient( transport=httpx.MockTransport(app), auth=auth ) as client: async with client.stream("GET", url) as response: await response.aread() assert response.status_code == 200 assert response.json() == {"auth": "Basic dXNlcjpwYXNzd29yZDEyMw=="} @pytest.mark.anyio async def test_basic_auth_in_url() -> None: url = "https://user:password123@example.org/" app = App() async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: response = await client.get(url) assert response.status_code == 200 assert response.json() == {"auth": "Basic dXNlcjpwYXNzd29yZDEyMw=="} @pytest.mark.anyio async def test_basic_auth_on_session() -> None: url = "https://example.org/" auth = ("user", "password123") app = App() async with httpx.AsyncClient( transport=httpx.MockTransport(app), auth=auth ) as client: response = await client.get(url) assert response.status_code == 200 assert response.json() == {"auth": "Basic dXNlcjpwYXNzd29yZDEyMw=="} @pytest.mark.anyio async def test_custom_auth() -> None: url = "https://example.org/" app = App() def auth(request: httpx.Request) -> httpx.Request: request.headers["Authorization"] = "Token 123" return request async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": "Token 123"} def test_netrc_auth_credentials_exist() -> None: """ When netrc auth is being used and a request is made to a host that is in the netrc file, then the relevant credentials should be applied. """ netrc_file = str(FIXTURES_DIR / ".netrc") url = "http://netrcexample.org" app = App() auth = httpx.NetRCAuth(netrc_file) with httpx.Client(transport=httpx.MockTransport(app), auth=auth) as client: response = client.get(url) assert response.status_code == 200 assert response.json() == { "auth": "Basic ZXhhbXBsZS11c2VybmFtZTpleGFtcGxlLXBhc3N3b3Jk" } def test_netrc_auth_credentials_do_not_exist() -> None: """ When netrc auth is being used and a request is made to a host that is not in the netrc file, then no credentials should be applied. """ netrc_file = str(FIXTURES_DIR / ".netrc") url = "http://example.org" app = App() auth = httpx.NetRCAuth(netrc_file) with httpx.Client(transport=httpx.MockTransport(app), auth=auth) as client: response = client.get(url) assert response.status_code == 200 assert response.json() == {"auth": None} @pytest.mark.skipif( sys.version_info < (3, 11), reason="netrc files without a password are invalid with Python < 3.11", ) def test_netrc_auth_nopassword() -> None: # pragma: no cover """ Python has different netrc parsing behaviours with different versions. For Python 3.11+ a netrc file with no password is valid. In this case we want to check that we allow the netrc auth, and simply don't provide any credentials in the request. """ netrc_file = str(FIXTURES_DIR / ".netrc-nopassword") url = "http://example.org" app = App() auth = httpx.NetRCAuth(netrc_file) with httpx.Client(transport=httpx.MockTransport(app), auth=auth) as client: response = client.get(url) assert response.status_code == 200 assert response.json() == {"auth": None} @pytest.mark.skipif( sys.version_info >= (3, 11), reason="netrc files without a password are valid from Python >= 3.11", ) def test_netrc_auth_nopassword_parse_error() -> None: # pragma: no cover """ Python has different netrc parsing behaviours with different versions. For Python < 3.11 a netrc file with no password is invalid. In this case we want to allow the parse error to be raised. """ netrc_file = str(FIXTURES_DIR / ".netrc-nopassword") with pytest.raises(netrc.NetrcParseError): httpx.NetRCAuth(netrc_file) @pytest.mark.anyio async def test_auth_disable_per_request() -> None: url = "https://example.org/" auth = ("user", "password123") app = App() async with httpx.AsyncClient( transport=httpx.MockTransport(app), auth=auth ) as client: response = await client.get(url, auth=None) assert response.status_code == 200 assert response.json() == {"auth": None} def test_auth_hidden_url() -> None: url = "http://example-username:example-password@example.org/" expected = "URL('http://example-username:[secure]@example.org/')" assert url == httpx.URL(url) assert expected == repr(httpx.URL(url)) @pytest.mark.anyio async def test_auth_hidden_header() -> None: url = "https://example.org/" auth = ("example-username", "example-password") app = App() async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert "'authorization': '[secure]'" in str(response.request.headers) @pytest.mark.anyio async def test_auth_property() -> None: app = App() async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: assert client.auth is None client.auth = ("user", "password123") # type: ignore assert isinstance(client.auth, httpx.BasicAuth) url = "https://example.org/" response = await client.get(url) assert response.status_code == 200 assert response.json() == {"auth": "Basic dXNlcjpwYXNzd29yZDEyMw=="} @pytest.mark.anyio async def test_auth_invalid_type() -> None: app = App() with pytest.raises(TypeError): client = httpx.AsyncClient( transport=httpx.MockTransport(app), auth="not a tuple, not a callable", # type: ignore ) async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: with pytest.raises(TypeError): await client.get(auth="not a tuple, not a callable") # type: ignore with pytest.raises(TypeError): client.auth = "not a tuple, not a callable" # type: ignore @pytest.mark.anyio async def test_digest_auth_returns_no_auth_if_no_digest_header_in_response() -> None: url = "https://example.org/" auth = httpx.DigestAuth(username="user", password="password123") app = App() async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": None} assert len(response.history) == 0 def test_digest_auth_returns_no_auth_if_alternate_auth_scheme() -> None: url = "https://example.org/" auth = httpx.DigestAuth(username="user", password="password123") auth_header = "Token ..." app = App(auth_header=auth_header, status_code=401) client = httpx.Client(transport=httpx.MockTransport(app)) response = client.get(url, auth=auth) assert response.status_code == 401 assert response.json() == {"auth": None} assert len(response.history) == 0 @pytest.mark.anyio async def test_digest_auth_200_response_including_digest_auth_header() -> None: url = "https://example.org/" auth = httpx.DigestAuth(username="user", password="password123") auth_header = 'Digest realm="realm@host.com",qop="auth",nonce="abc",opaque="xyz"' app = App(auth_header=auth_header, status_code=200) async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": None} assert len(response.history) == 0 @pytest.mark.anyio async def test_digest_auth_401_response_without_digest_auth_header() -> None: url = "https://example.org/" auth = httpx.DigestAuth(username="user", password="password123") app = App(auth_header="", status_code=401) async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 401 assert response.json() == {"auth": None} assert len(response.history) == 0 @pytest.mark.parametrize( "algorithm,expected_hash_length,expected_response_length", [ ("MD5", 64, 32), ("MD5-SESS", 64, 32), ("SHA", 64, 40), ("SHA-SESS", 64, 40), ("SHA-256", 64, 64), ("SHA-256-SESS", 64, 64), ("SHA-512", 64, 128), ("SHA-512-SESS", 64, 128), ], ) @pytest.mark.anyio async def test_digest_auth( algorithm: str, expected_hash_length: int, expected_response_length: int ) -> None: url = "https://example.org/" auth = httpx.DigestAuth(username="user", password="password123") app = DigestApp(algorithm=algorithm) async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert len(response.history) == 1 authorization = typing.cast(typing.Dict[str, typing.Any], response.json())["auth"] scheme, _, fields = authorization.partition(" ") assert scheme == "Digest" response_fields = [field.strip() for field in fields.split(",")] digest_data = dict(field.split("=") for field in response_fields) assert digest_data["username"] == '"user"' assert digest_data["realm"] == '"httpx@example.org"' assert "nonce" in digest_data assert digest_data["uri"] == '"/"' assert len(digest_data["response"]) == expected_response_length + 2 # extra quotes assert len(digest_data["opaque"]) == expected_hash_length + 2 assert digest_data["algorithm"] == algorithm assert digest_data["qop"] == "auth" assert digest_data["nc"] == "00000001" assert len(digest_data["cnonce"]) == 16 + 2 @pytest.mark.anyio async def test_digest_auth_no_specified_qop() -> None: url = "https://example.org/" auth = httpx.DigestAuth(username="user", password="password123") app = DigestApp(qop="") async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert len(response.history) == 1 authorization = typing.cast(typing.Dict[str, typing.Any], response.json())["auth"] scheme, _, fields = authorization.partition(" ") assert scheme == "Digest" response_fields = [field.strip() for field in fields.split(",")] digest_data = dict(field.split("=") for field in response_fields) assert "qop" not in digest_data assert "nc" not in digest_data assert "cnonce" not in digest_data assert digest_data["username"] == '"user"' assert digest_data["realm"] == '"httpx@example.org"' assert len(digest_data["nonce"]) == 64 + 2 # extra quotes assert digest_data["uri"] == '"/"' assert len(digest_data["response"]) == 64 + 2 assert len(digest_data["opaque"]) == 64 + 2 assert digest_data["algorithm"] == "SHA-256" @pytest.mark.parametrize("qop", ("auth, auth-int", "auth,auth-int", "unknown,auth")) @pytest.mark.anyio async def test_digest_auth_qop_including_spaces_and_auth_returns_auth(qop: str) -> None: url = "https://example.org/" auth = httpx.DigestAuth(username="user", password="password123") app = DigestApp(qop=qop) async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert len(response.history) == 1 @pytest.mark.anyio async def test_digest_auth_qop_auth_int_not_implemented() -> None: url = "https://example.org/" auth = httpx.DigestAuth(username="user", password="password123") app = DigestApp(qop="auth-int") async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: with pytest.raises(NotImplementedError): await client.get(url, auth=auth) @pytest.mark.anyio async def test_digest_auth_qop_must_be_auth_or_auth_int() -> None: url = "https://example.org/" auth = httpx.DigestAuth(username="user", password="password123") app = DigestApp(qop="not-auth") async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: with pytest.raises(httpx.ProtocolError): await client.get(url, auth=auth) @pytest.mark.anyio async def test_digest_auth_incorrect_credentials() -> None: url = "https://example.org/" auth = httpx.DigestAuth(username="user", password="password123") app = DigestApp(send_response_after_attempt=2) async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 401 assert len(response.history) == 1 @pytest.mark.anyio async def test_digest_auth_reuses_challenge() -> None: url = "https://example.org/" auth = httpx.DigestAuth(username="user", password="password123") app = DigestApp() async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: response_1 = await client.get(url, auth=auth) response_2 = await client.get(url, auth=auth) assert response_1.status_code == 200 assert response_2.status_code == 200 assert len(response_1.history) == 1 assert len(response_2.history) == 0 @pytest.mark.anyio async def test_digest_auth_resets_nonce_count_after_401() -> None: url = "https://example.org/" auth = httpx.DigestAuth(username="user", password="password123") app = DigestApp() async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: response_1 = await client.get(url, auth=auth) assert response_1.status_code == 200 assert len(response_1.history) == 1 first_nonce = parse_keqv_list( response_1.request.headers["Authorization"].split(", ") )["nonce"] first_nc = parse_keqv_list( response_1.request.headers["Authorization"].split(", ") )["nc"] # with this we now force a 401 on a subsequent (but initial) request app.send_response_after_attempt = 2 # we expect the client again to try to authenticate, # i.e. the history length must be 1 response_2 = await client.get(url, auth=auth) assert response_2.status_code == 200 assert len(response_2.history) == 1 second_nonce = parse_keqv_list( response_2.request.headers["Authorization"].split(", ") )["nonce"] second_nc = parse_keqv_list( response_2.request.headers["Authorization"].split(", ") )["nc"] assert first_nonce != second_nonce # ensures that the auth challenge was reset assert ( first_nc == second_nc ) # ensures the nonce count is reset when the authentication failed @pytest.mark.parametrize( "auth_header", [ 'Digest realm="httpx@example.org", qop="auth"', # missing fields 'Digest realm="httpx@example.org", qop="auth,au', # malformed fields list ], ) @pytest.mark.anyio async def test_async_digest_auth_raises_protocol_error_on_malformed_header( auth_header: str, ) -> None: url = "https://example.org/" auth = httpx.DigestAuth(username="user", password="password123") app = App(auth_header=auth_header, status_code=401) async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: with pytest.raises(httpx.ProtocolError): await client.get(url, auth=auth) @pytest.mark.parametrize( "auth_header", [ 'Digest realm="httpx@example.org", qop="auth"', # missing fields 'Digest realm="httpx@example.org", qop="auth,au', # malformed fields list ], ) def test_sync_digest_auth_raises_protocol_error_on_malformed_header( auth_header: str, ) -> None: url = "https://example.org/" auth = httpx.DigestAuth(username="user", password="password123") app = App(auth_header=auth_header, status_code=401) with httpx.Client(transport=httpx.MockTransport(app)) as client: with pytest.raises(httpx.ProtocolError): client.get(url, auth=auth) @pytest.mark.anyio async def test_async_auth_history() -> None: """ Test that intermediate requests sent as part of an authentication flow are recorded in the response history. """ url = "https://example.org/" auth = RepeatAuth(repeat=2) app = App(auth_header="abc") async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": "Repeat abc.abc"} assert len(response.history) == 2 resp1, resp2 = response.history assert resp1.json() == {"auth": "Repeat 0"} assert resp2.json() == {"auth": "Repeat 1"} assert len(resp2.history) == 1 assert resp2.history == [resp1] assert len(resp1.history) == 0 def test_sync_auth_history() -> None: """ Test that intermediate requests sent as part of an authentication flow are recorded in the response history. """ url = "https://example.org/" auth = RepeatAuth(repeat=2) app = App(auth_header="abc") with httpx.Client(transport=httpx.MockTransport(app)) as client: response = client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": "Repeat abc.abc"} assert len(response.history) == 2 resp1, resp2 = response.history assert resp1.json() == {"auth": "Repeat 0"} assert resp2.json() == {"auth": "Repeat 1"} assert len(resp2.history) == 1 assert resp2.history == [resp1] assert len(resp1.history) == 0 class ConsumeBodyTransport(httpx.MockTransport): async def handle_async_request(self, request: httpx.Request) -> httpx.Response: assert isinstance(request.stream, httpx.AsyncByteStream) [_ async for _ in request.stream] return self.handler(request) # type: ignore[return-value] @pytest.mark.anyio async def test_digest_auth_unavailable_streaming_body(): url = "https://example.org/" auth = httpx.DigestAuth(username="user", password="password123") app = DigestApp() async def streaming_body() -> typing.AsyncIterator[bytes]: yield b"Example request body" # pragma: no cover async with httpx.AsyncClient(transport=ConsumeBodyTransport(app)) as client: with pytest.raises(httpx.StreamConsumed): await client.post(url, content=streaming_body(), auth=auth) @pytest.mark.anyio async def test_async_auth_reads_response_body() -> None: """ Test that we can read the response body in an auth flow if `requires_response_body` is set. """ url = "https://example.org/" auth = ResponseBodyAuth("xyz") app = App() async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": '{"auth": "xyz"}'} def test_sync_auth_reads_response_body() -> None: """ Test that we can read the response body in an auth flow if `requires_response_body` is set. """ url = "https://example.org/" auth = ResponseBodyAuth("xyz") app = App() with httpx.Client(transport=httpx.MockTransport(app)) as client: response = client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": '{"auth": "xyz"}'} @pytest.mark.anyio async def test_async_auth() -> None: """ Test that we can use an auth implementation specific to the async case, to support cases that require performing I/O or using concurrency primitives (such as checking a disk-based cache or fetching a token from a remote auth server). """ url = "https://example.org/" auth = SyncOrAsyncAuth() app = App() async with httpx.AsyncClient(transport=httpx.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": "async-auth"} def test_sync_auth() -> None: """ Test that we can use an auth implementation specific to the sync case. """ url = "https://example.org/" auth = SyncOrAsyncAuth() app = App() with httpx.Client(transport=httpx.MockTransport(app)) as client: response = client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": "sync-auth"} httpx-0.26.0/tests/client/test_client.py000066400000000000000000000351721454054354600202770ustar00rootroot00000000000000import typing from datetime import timedelta import chardet import pytest import httpx def autodetect(content): return chardet.detect(content).get("encoding") def test_get(server): url = server.url with httpx.Client(http2=True) as http: response = http.get(url) assert response.status_code == 200 assert response.url == url assert response.content == b"Hello, world!" assert response.text == "Hello, world!" assert response.http_version == "HTTP/1.1" assert response.encoding == "utf-8" assert response.request.url == url assert response.headers assert response.is_redirect is False assert repr(response) == "" assert response.elapsed > timedelta(0) @pytest.mark.parametrize( "url", [ pytest.param("invalid://example.org", id="scheme-not-http(s)"), pytest.param("://example.org", id="no-scheme"), pytest.param("http://", id="no-host"), ], ) def test_get_invalid_url(server, url): with httpx.Client() as client: with pytest.raises((httpx.UnsupportedProtocol, httpx.LocalProtocolError)): client.get(url) def test_build_request(server): url = server.url.copy_with(path="/echo_headers") headers = {"Custom-header": "value"} with httpx.Client() as client: request = client.build_request("GET", url) request.headers.update(headers) response = client.send(request) assert response.status_code == 200 assert response.url == url assert response.json()["Custom-header"] == "value" def test_build_post_request(server): url = server.url.copy_with(path="/echo_headers") headers = {"Custom-header": "value"} with httpx.Client() as client: request = client.build_request("POST", url) request.headers.update(headers) response = client.send(request) assert response.status_code == 200 assert response.url == url assert response.json()["Content-length"] == "0" assert response.json()["Custom-header"] == "value" def test_post(server): with httpx.Client() as client: response = client.post(server.url, content=b"Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" def test_post_json(server): with httpx.Client() as client: response = client.post(server.url, json={"text": "Hello, world!"}) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_stream_response(server): with httpx.Client() as client: with client.stream("GET", server.url) as response: content = response.read() assert response.status_code == 200 assert content == b"Hello, world!" def test_stream_iterator(server): body = b"" with httpx.Client() as client: with client.stream("GET", server.url) as response: for chunk in response.iter_bytes(): body += chunk assert response.status_code == 200 assert body == b"Hello, world!" def test_raw_iterator(server): body = b"" with httpx.Client() as client: with client.stream("GET", server.url) as response: for chunk in response.iter_raw(): body += chunk assert response.status_code == 200 assert body == b"Hello, world!" def test_cannot_stream_async_request(server): async def hello_world() -> typing.AsyncIterator[bytes]: # pragma: no cover yield b"Hello, " yield b"world!" with httpx.Client() as client: with pytest.raises(RuntimeError): client.post(server.url, content=hello_world()) def test_raise_for_status(server): with httpx.Client() as client: for status_code in (200, 400, 404, 500, 505): response = client.request( "GET", server.url.copy_with(path=f"/status/{status_code}") ) if 400 <= status_code < 600: with pytest.raises(httpx.HTTPStatusError) as exc_info: response.raise_for_status() assert exc_info.value.response == response assert exc_info.value.request.url.path == f"/status/{status_code}" else: assert response.raise_for_status() is response def test_options(server): with httpx.Client() as client: response = client.options(server.url) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_head(server): with httpx.Client() as client: response = client.head(server.url) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_put(server): with httpx.Client() as client: response = client.put(server.url, content=b"Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" def test_patch(server): with httpx.Client() as client: response = client.patch(server.url, content=b"Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" def test_delete(server): with httpx.Client() as client: response = client.delete(server.url) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_base_url(server): base_url = server.url with httpx.Client(base_url=base_url) as client: response = client.get("/") assert response.status_code == 200 assert response.url == base_url def test_merge_absolute_url(): client = httpx.Client(base_url="https://www.example.com/") request = client.build_request("GET", "http://www.example.com/") assert request.url == "http://www.example.com/" def test_merge_relative_url(): client = httpx.Client(base_url="https://www.example.com/") request = client.build_request("GET", "/testing/123") assert request.url == "https://www.example.com/testing/123" def test_merge_relative_url_with_path(): client = httpx.Client(base_url="https://www.example.com/some/path") request = client.build_request("GET", "/testing/123") assert request.url == "https://www.example.com/some/path/testing/123" def test_merge_relative_url_with_dotted_path(): client = httpx.Client(base_url="https://www.example.com/some/path") request = client.build_request("GET", "../testing/123") assert request.url == "https://www.example.com/some/testing/123" def test_merge_relative_url_with_path_including_colon(): client = httpx.Client(base_url="https://www.example.com/some/path") request = client.build_request("GET", "/testing:123") assert request.url == "https://www.example.com/some/path/testing:123" def test_merge_relative_url_with_encoded_slashes(): client = httpx.Client(base_url="https://www.example.com/") request = client.build_request("GET", "/testing%2F123") assert request.url == "https://www.example.com/testing%2F123" client = httpx.Client(base_url="https://www.example.com/base%2Fpath") request = client.build_request("GET", "/testing") assert request.url == "https://www.example.com/base%2Fpath/testing" def test_context_managed_transport(): class Transport(httpx.BaseTransport): def __init__(self) -> None: self.events: typing.List[str] = [] def close(self): # The base implementation of httpx.BaseTransport just # calls into `.close`, so simple transport cases can just override # this method for any cleanup, where more complex cases # might want to additionally override `__enter__`/`__exit__`. self.events.append("transport.close") def __enter__(self): super().__enter__() self.events.append("transport.__enter__") def __exit__(self, *args): super().__exit__(*args) self.events.append("transport.__exit__") transport = Transport() with httpx.Client(transport=transport): pass assert transport.events == [ "transport.__enter__", "transport.close", "transport.__exit__", ] def test_context_managed_transport_and_mount(): class Transport(httpx.BaseTransport): def __init__(self, name: str) -> None: self.name: str = name self.events: typing.List[str] = [] def close(self): # The base implementation of httpx.BaseTransport just # calls into `.close`, so simple transport cases can just override # this method for any cleanup, where more complex cases # might want to additionally override `__enter__`/`__exit__`. self.events.append(f"{self.name}.close") def __enter__(self): super().__enter__() self.events.append(f"{self.name}.__enter__") def __exit__(self, *args): super().__exit__(*args) self.events.append(f"{self.name}.__exit__") transport = Transport(name="transport") mounted = Transport(name="mounted") with httpx.Client(transport=transport, mounts={"http://www.example.org": mounted}): pass assert transport.events == [ "transport.__enter__", "transport.close", "transport.__exit__", ] assert mounted.events == [ "mounted.__enter__", "mounted.close", "mounted.__exit__", ] def hello_world(request): return httpx.Response(200, text="Hello, world!") def test_client_closed_state_using_implicit_open(): client = httpx.Client(transport=httpx.MockTransport(hello_world)) assert not client.is_closed client.get("http://example.com") assert not client.is_closed client.close() assert client.is_closed # Once we're close we cannot make any more requests. with pytest.raises(RuntimeError): client.get("http://example.com") # Once we're closed we cannot reopen the client. with pytest.raises(RuntimeError): with client: pass # pragma: no cover def test_client_closed_state_using_with_block(): with httpx.Client(transport=httpx.MockTransport(hello_world)) as client: assert not client.is_closed client.get("http://example.com") assert client.is_closed with pytest.raises(RuntimeError): client.get("http://example.com") def echo_raw_headers(request: httpx.Request) -> httpx.Response: data = [ (name.decode("ascii"), value.decode("ascii")) for name, value in request.headers.raw ] return httpx.Response(200, json=data) def test_raw_client_header(): """ Set a header in the Client. """ url = "http://example.org/echo_headers" headers = {"Example-Header": "example-value"} client = httpx.Client( transport=httpx.MockTransport(echo_raw_headers), headers=headers ) response = client.get(url) assert response.status_code == 200 assert response.json() == [ ["Host", "example.org"], ["Accept", "*/*"], ["Accept-Encoding", "gzip, deflate, br"], ["Connection", "keep-alive"], ["User-Agent", f"python-httpx/{httpx.__version__}"], ["Example-Header", "example-value"], ] def unmounted(request: httpx.Request) -> httpx.Response: data = {"app": "unmounted"} return httpx.Response(200, json=data) def mounted(request: httpx.Request) -> httpx.Response: data = {"app": "mounted"} return httpx.Response(200, json=data) def test_mounted_transport(): transport = httpx.MockTransport(unmounted) mounts = {"custom://": httpx.MockTransport(mounted)} client = httpx.Client(transport=transport, mounts=mounts) response = client.get("https://www.example.com") assert response.status_code == 200 assert response.json() == {"app": "unmounted"} response = client.get("custom://www.example.com") assert response.status_code == 200 assert response.json() == {"app": "mounted"} def test_all_mounted_transport(): mounts = {"all://": httpx.MockTransport(mounted)} client = httpx.Client(mounts=mounts) response = client.get("https://www.example.com") assert response.status_code == 200 assert response.json() == {"app": "mounted"} def test_server_extensions(server): url = server.url.copy_with(path="/http_version_2") with httpx.Client(http2=True) as client: response = client.get(url) assert response.status_code == 200 assert response.extensions["http_version"] == b"HTTP/1.1" def test_client_decode_text_using_autodetect(): # Ensure that a 'default_encoding=autodetect' on the response allows for # encoding autodetection to be used when no "Content-Type: text/plain; charset=..." # info is present. # # Here we have some french text encoded with ISO-8859-1, rather than UTF-8. text = ( "Non-seulement Despréaux ne se trompait pas, mais de tous les écrivains " "que la France a produits, sans excepter Voltaire lui-même, imprégné de " "l'esprit anglais par son séjour à Londres, c'est incontestablement " "Molière ou Poquelin qui reproduit avec l'exactitude la plus vive et la " "plus complète le fond du génie français." ) def cp1252_but_no_content_type(request): content = text.encode("ISO-8859-1") return httpx.Response(200, content=content) transport = httpx.MockTransport(cp1252_but_no_content_type) with httpx.Client(transport=transport, default_encoding=autodetect) as client: response = client.get("http://www.example.com") assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.encoding == "ISO-8859-1" assert response.text == text def test_client_decode_text_using_explicit_encoding(): # Ensure that a 'default_encoding="..."' on the response is used for text decoding # when no "Content-Type: text/plain; charset=..."" info is present. # # Here we have some french text encoded with ISO-8859-1, rather than UTF-8. text = ( "Non-seulement Despréaux ne se trompait pas, mais de tous les écrivains " "que la France a produits, sans excepter Voltaire lui-même, imprégné de " "l'esprit anglais par son séjour à Londres, c'est incontestablement " "Molière ou Poquelin qui reproduit avec l'exactitude la plus vive et la " "plus complète le fond du génie français." ) def cp1252_but_no_content_type(request): content = text.encode("ISO-8859-1") return httpx.Response(200, content=content) transport = httpx.MockTransport(cp1252_but_no_content_type) with httpx.Client(transport=transport, default_encoding=autodetect) as client: response = client.get("http://www.example.com") assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.encoding == "ISO-8859-1" assert response.text == text httpx-0.26.0/tests/client/test_cookies.py000066400000000000000000000115171454054354600204520ustar00rootroot00000000000000from http.cookiejar import Cookie, CookieJar import pytest import httpx def get_and_set_cookies(request: httpx.Request) -> httpx.Response: if request.url.path == "/echo_cookies": data = {"cookies": request.headers.get("cookie")} return httpx.Response(200, json=data) elif request.url.path == "/set_cookie": return httpx.Response(200, headers={"set-cookie": "example-name=example-value"}) else: raise NotImplementedError() # pragma: no cover def test_set_cookie() -> None: """ Send a request including a cookie. """ url = "http://example.org/echo_cookies" cookies = {"example-name": "example-value"} client = httpx.Client( cookies=cookies, transport=httpx.MockTransport(get_and_set_cookies) ) response = client.get(url) assert response.status_code == 200 assert response.json() == {"cookies": "example-name=example-value"} def test_set_per_request_cookie_is_deprecated() -> None: """ Sending a request including a per-request cookie is deprecated. """ url = "http://example.org/echo_cookies" cookies = {"example-name": "example-value"} client = httpx.Client(transport=httpx.MockTransport(get_and_set_cookies)) with pytest.warns(DeprecationWarning): response = client.get(url, cookies=cookies) assert response.status_code == 200 assert response.json() == {"cookies": "example-name=example-value"} def test_set_cookie_with_cookiejar() -> None: """ Send a request including a cookie, using a `CookieJar` instance. """ url = "http://example.org/echo_cookies" cookies = CookieJar() cookie = Cookie( version=0, name="example-name", value="example-value", port=None, port_specified=False, domain="", domain_specified=False, domain_initial_dot=False, path="/", path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={"HttpOnly": ""}, rfc2109=False, ) cookies.set_cookie(cookie) client = httpx.Client( cookies=cookies, transport=httpx.MockTransport(get_and_set_cookies) ) response = client.get(url) assert response.status_code == 200 assert response.json() == {"cookies": "example-name=example-value"} def test_setting_client_cookies_to_cookiejar() -> None: """ Send a request including a cookie, using a `CookieJar` instance. """ url = "http://example.org/echo_cookies" cookies = CookieJar() cookie = Cookie( version=0, name="example-name", value="example-value", port=None, port_specified=False, domain="", domain_specified=False, domain_initial_dot=False, path="/", path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={"HttpOnly": ""}, rfc2109=False, ) cookies.set_cookie(cookie) client = httpx.Client( cookies=cookies, transport=httpx.MockTransport(get_and_set_cookies) ) response = client.get(url) assert response.status_code == 200 assert response.json() == {"cookies": "example-name=example-value"} def test_set_cookie_with_cookies_model() -> None: """ Send a request including a cookie, using a `Cookies` instance. """ url = "http://example.org/echo_cookies" cookies = httpx.Cookies() cookies["example-name"] = "example-value" client = httpx.Client(transport=httpx.MockTransport(get_and_set_cookies)) client.cookies = cookies response = client.get(url) assert response.status_code == 200 assert response.json() == {"cookies": "example-name=example-value"} def test_get_cookie() -> None: url = "http://example.org/set_cookie" client = httpx.Client(transport=httpx.MockTransport(get_and_set_cookies)) response = client.get(url) assert response.status_code == 200 assert response.cookies["example-name"] == "example-value" assert client.cookies["example-name"] == "example-value" def test_cookie_persistence() -> None: """ Ensure that Client instances persist cookies between requests. """ client = httpx.Client(transport=httpx.MockTransport(get_and_set_cookies)) response = client.get("http://example.org/echo_cookies") assert response.status_code == 200 assert response.json() == {"cookies": None} response = client.get("http://example.org/set_cookie") assert response.status_code == 200 assert response.cookies["example-name"] == "example-value" assert client.cookies["example-name"] == "example-value" response = client.get("http://example.org/echo_cookies") assert response.status_code == 200 assert response.json() == {"cookies": "example-name=example-value"} httpx-0.26.0/tests/client/test_event_hooks.py000066400000000000000000000156351454054354600213470ustar00rootroot00000000000000import pytest import httpx def app(request: httpx.Request) -> httpx.Response: if request.url.path == "/redirect": return httpx.Response(303, headers={"server": "testserver", "location": "/"}) elif request.url.path.startswith("/status/"): status_code = int(request.url.path[-3:]) return httpx.Response(status_code, headers={"server": "testserver"}) return httpx.Response(200, headers={"server": "testserver"}) def test_event_hooks(): events = [] def on_request(request): events.append({"event": "request", "headers": dict(request.headers)}) def on_response(response): events.append({"event": "response", "headers": dict(response.headers)}) event_hooks = {"request": [on_request], "response": [on_response]} with httpx.Client( event_hooks=event_hooks, transport=httpx.MockTransport(app) ) as http: http.get("http://127.0.0.1:8000/", auth=("username", "password")) assert events == [ { "event": "request", "headers": { "host": "127.0.0.1:8000", "user-agent": f"python-httpx/{httpx.__version__}", "accept": "*/*", "accept-encoding": "gzip, deflate, br", "connection": "keep-alive", "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", }, }, { "event": "response", "headers": {"server": "testserver"}, }, ] def test_event_hooks_raising_exception(server): def raise_on_4xx_5xx(response): response.raise_for_status() event_hooks = {"response": [raise_on_4xx_5xx]} with httpx.Client( event_hooks=event_hooks, transport=httpx.MockTransport(app) ) as http: try: http.get("http://127.0.0.1:8000/status/400") except httpx.HTTPStatusError as exc: assert exc.response.is_closed @pytest.mark.anyio async def test_async_event_hooks(): events = [] async def on_request(request): events.append({"event": "request", "headers": dict(request.headers)}) async def on_response(response): events.append({"event": "response", "headers": dict(response.headers)}) event_hooks = {"request": [on_request], "response": [on_response]} async with httpx.AsyncClient( event_hooks=event_hooks, transport=httpx.MockTransport(app) ) as http: await http.get("http://127.0.0.1:8000/", auth=("username", "password")) assert events == [ { "event": "request", "headers": { "host": "127.0.0.1:8000", "user-agent": f"python-httpx/{httpx.__version__}", "accept": "*/*", "accept-encoding": "gzip, deflate, br", "connection": "keep-alive", "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", }, }, { "event": "response", "headers": {"server": "testserver"}, }, ] @pytest.mark.anyio async def test_async_event_hooks_raising_exception(): async def raise_on_4xx_5xx(response): response.raise_for_status() event_hooks = {"response": [raise_on_4xx_5xx]} async with httpx.AsyncClient( event_hooks=event_hooks, transport=httpx.MockTransport(app) ) as http: try: await http.get("http://127.0.0.1:8000/status/400") except httpx.HTTPStatusError as exc: assert exc.response.is_closed def test_event_hooks_with_redirect(): """ A redirect request should trigger additional 'request' and 'response' event hooks. """ events = [] def on_request(request): events.append({"event": "request", "headers": dict(request.headers)}) def on_response(response): events.append({"event": "response", "headers": dict(response.headers)}) event_hooks = {"request": [on_request], "response": [on_response]} with httpx.Client( event_hooks=event_hooks, transport=httpx.MockTransport(app), follow_redirects=True, ) as http: http.get("http://127.0.0.1:8000/redirect", auth=("username", "password")) assert events == [ { "event": "request", "headers": { "host": "127.0.0.1:8000", "user-agent": f"python-httpx/{httpx.__version__}", "accept": "*/*", "accept-encoding": "gzip, deflate, br", "connection": "keep-alive", "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", }, }, { "event": "response", "headers": {"location": "/", "server": "testserver"}, }, { "event": "request", "headers": { "host": "127.0.0.1:8000", "user-agent": f"python-httpx/{httpx.__version__}", "accept": "*/*", "accept-encoding": "gzip, deflate, br", "connection": "keep-alive", "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", }, }, { "event": "response", "headers": {"server": "testserver"}, }, ] @pytest.mark.anyio async def test_async_event_hooks_with_redirect(): """ A redirect request should trigger additional 'request' and 'response' event hooks. """ events = [] async def on_request(request): events.append({"event": "request", "headers": dict(request.headers)}) async def on_response(response): events.append({"event": "response", "headers": dict(response.headers)}) event_hooks = {"request": [on_request], "response": [on_response]} async with httpx.AsyncClient( event_hooks=event_hooks, transport=httpx.MockTransport(app), follow_redirects=True, ) as http: await http.get("http://127.0.0.1:8000/redirect", auth=("username", "password")) assert events == [ { "event": "request", "headers": { "host": "127.0.0.1:8000", "user-agent": f"python-httpx/{httpx.__version__}", "accept": "*/*", "accept-encoding": "gzip, deflate, br", "connection": "keep-alive", "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", }, }, { "event": "response", "headers": {"location": "/", "server": "testserver"}, }, { "event": "request", "headers": { "host": "127.0.0.1:8000", "user-agent": f"python-httpx/{httpx.__version__}", "accept": "*/*", "accept-encoding": "gzip, deflate, br", "connection": "keep-alive", "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", }, }, { "event": "response", "headers": {"server": "testserver"}, }, ] httpx-0.26.0/tests/client/test_headers.py000077500000000000000000000156651454054354600204440ustar00rootroot00000000000000#!/usr/bin/env python3 import pytest import httpx def echo_headers(request: httpx.Request) -> httpx.Response: data = {"headers": dict(request.headers)} return httpx.Response(200, json=data) def echo_repeated_headers_multi_items(request: httpx.Request) -> httpx.Response: data = {"headers": list(request.headers.multi_items())} return httpx.Response(200, json=data) def echo_repeated_headers_items(request: httpx.Request) -> httpx.Response: data = {"headers": list(request.headers.items())} return httpx.Response(200, json=data) def test_client_header(): """ Set a header in the Client. """ url = "http://example.org/echo_headers" headers = {"Example-Header": "example-value"} client = httpx.Client(transport=httpx.MockTransport(echo_headers), headers=headers) response = client.get(url) assert response.status_code == 200 assert response.json() == { "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br", "connection": "keep-alive", "example-header": "example-value", "host": "example.org", "user-agent": f"python-httpx/{httpx.__version__}", } } def test_header_merge(): url = "http://example.org/echo_headers" client_headers = {"User-Agent": "python-myclient/0.2.1"} request_headers = {"X-Auth-Token": "FooBarBazToken"} client = httpx.Client( transport=httpx.MockTransport(echo_headers), headers=client_headers ) response = client.get(url, headers=request_headers) assert response.status_code == 200 assert response.json() == { "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br", "connection": "keep-alive", "host": "example.org", "user-agent": "python-myclient/0.2.1", "x-auth-token": "FooBarBazToken", } } def test_header_merge_conflicting_headers(): url = "http://example.org/echo_headers" client_headers = {"X-Auth-Token": "FooBar"} request_headers = {"X-Auth-Token": "BazToken"} client = httpx.Client( transport=httpx.MockTransport(echo_headers), headers=client_headers ) response = client.get(url, headers=request_headers) assert response.status_code == 200 assert response.json() == { "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br", "connection": "keep-alive", "host": "example.org", "user-agent": f"python-httpx/{httpx.__version__}", "x-auth-token": "BazToken", } } def test_header_update(): url = "http://example.org/echo_headers" client = httpx.Client(transport=httpx.MockTransport(echo_headers)) first_response = client.get(url) client.headers.update( {"User-Agent": "python-myclient/0.2.1", "Another-Header": "AThing"} ) second_response = client.get(url) assert first_response.status_code == 200 assert first_response.json() == { "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br", "connection": "keep-alive", "host": "example.org", "user-agent": f"python-httpx/{httpx.__version__}", } } assert second_response.status_code == 200 assert second_response.json() == { "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br", "another-header": "AThing", "connection": "keep-alive", "host": "example.org", "user-agent": "python-myclient/0.2.1", } } def test_header_repeated_items(): url = "http://example.org/echo_headers" client = httpx.Client(transport=httpx.MockTransport(echo_repeated_headers_items)) response = client.get(url, headers=[("x-header", "1"), ("x-header", "2,3")]) assert response.status_code == 200 echoed_headers = response.json()["headers"] # as per RFC 7230, the whitespace after a comma is insignificant # so we split and strip here so that we can do a safe comparison assert ["x-header", ["1", "2", "3"]] in [ [k, [subv.lstrip() for subv in v.split(",")]] for k, v in echoed_headers ] def test_header_repeated_multi_items(): url = "http://example.org/echo_headers" client = httpx.Client( transport=httpx.MockTransport(echo_repeated_headers_multi_items) ) response = client.get(url, headers=[("x-header", "1"), ("x-header", "2,3")]) assert response.status_code == 200 echoed_headers = response.json()["headers"] assert ["x-header", "1"] in echoed_headers assert ["x-header", "2,3"] in echoed_headers def test_remove_default_header(): """ Remove a default header from the Client. """ url = "http://example.org/echo_headers" client = httpx.Client(transport=httpx.MockTransport(echo_headers)) del client.headers["User-Agent"] response = client.get(url) assert response.status_code == 200 assert response.json() == { "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br", "connection": "keep-alive", "host": "example.org", } } def test_header_does_not_exist(): headers = httpx.Headers({"foo": "bar"}) with pytest.raises(KeyError): del headers["baz"] def test_host_with_auth_and_port_in_url(): """ The Host header should only include the hostname, or hostname:port (for non-default ports only). Any userinfo or default port should not be present. """ url = "http://username:password@example.org:80/echo_headers" client = httpx.Client(transport=httpx.MockTransport(echo_headers)) response = client.get(url) assert response.status_code == 200 assert response.json() == { "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br", "connection": "keep-alive", "host": "example.org", "user-agent": f"python-httpx/{httpx.__version__}", "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", } } def test_host_with_non_default_port_in_url(): """ If the URL includes a non-default port, then it should be included in the Host header. """ url = "http://username:password@example.org:123/echo_headers" client = httpx.Client(transport=httpx.MockTransport(echo_headers)) response = client.get(url) assert response.status_code == 200 assert response.json() == { "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br", "connection": "keep-alive", "host": "example.org:123", "user-agent": f"python-httpx/{httpx.__version__}", "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", } } def test_request_auto_headers(): request = httpx.Request("GET", "https://www.example.org/") assert "host" in request.headers httpx-0.26.0/tests/client/test_properties.py000066400000000000000000000040301454054354600212020ustar00rootroot00000000000000import httpx def test_client_base_url(): client = httpx.Client() client.base_url = "https://www.example.org/" # type: ignore assert isinstance(client.base_url, httpx.URL) assert client.base_url == "https://www.example.org/" def test_client_base_url_without_trailing_slash(): client = httpx.Client() client.base_url = "https://www.example.org/path" # type: ignore assert isinstance(client.base_url, httpx.URL) assert client.base_url == "https://www.example.org/path/" def test_client_base_url_with_trailing_slash(): client = httpx.Client() client.base_url = "https://www.example.org/path/" # type: ignore assert isinstance(client.base_url, httpx.URL) assert client.base_url == "https://www.example.org/path/" def test_client_headers(): client = httpx.Client() client.headers = {"a": "b"} # type: ignore assert isinstance(client.headers, httpx.Headers) assert client.headers["A"] == "b" def test_client_cookies(): client = httpx.Client() client.cookies = {"a": "b"} # type: ignore assert isinstance(client.cookies, httpx.Cookies) mycookies = list(client.cookies.jar) assert len(mycookies) == 1 assert mycookies[0].name == "a" and mycookies[0].value == "b" def test_client_timeout(): expected_timeout = 12.0 client = httpx.Client() client.timeout = expected_timeout # type: ignore assert isinstance(client.timeout, httpx.Timeout) assert client.timeout.connect == expected_timeout assert client.timeout.read == expected_timeout assert client.timeout.write == expected_timeout assert client.timeout.pool == expected_timeout def test_client_event_hooks(): def on_request(request): pass # pragma: no cover client = httpx.Client() client.event_hooks = {"request": [on_request]} assert client.event_hooks == {"request": [on_request], "response": []} def test_client_trust_env(): client = httpx.Client() assert client.trust_env client = httpx.Client(trust_env=False) assert not client.trust_env httpx-0.26.0/tests/client/test_proxies.py000066400000000000000000000300521454054354600205020ustar00rootroot00000000000000import httpcore import pytest import httpx def url_to_origin(url: str) -> httpcore.URL: """ Given a URL string, return the origin in the raw tuple format that `httpcore` uses for it's representation. """ u = httpx.URL(url) return httpcore.URL(scheme=u.raw_scheme, host=u.raw_host, port=u.port, target="/") @pytest.mark.parametrize( ["proxies", "expected_proxies"], [ ("http://127.0.0.1", [("all://", "http://127.0.0.1")]), ({"all://": "http://127.0.0.1"}, [("all://", "http://127.0.0.1")]), ( {"http://": "http://127.0.0.1", "https://": "https://127.0.0.1"}, [("http://", "http://127.0.0.1"), ("https://", "https://127.0.0.1")], ), (httpx.Proxy("http://127.0.0.1"), [("all://", "http://127.0.0.1")]), ( { "https://": httpx.Proxy("https://127.0.0.1"), "all://": "http://127.0.0.1", }, [("all://", "http://127.0.0.1"), ("https://", "https://127.0.0.1")], ), ], ) def test_proxies_parameter(proxies, expected_proxies): with pytest.warns(DeprecationWarning): client = httpx.Client(proxies=proxies) client_patterns = [p.pattern for p in client._mounts.keys()] client_proxies = list(client._mounts.values()) for proxy_key, url in expected_proxies: assert proxy_key in client_patterns proxy = client_proxies[client_patterns.index(proxy_key)] assert isinstance(proxy, httpx.HTTPTransport) assert isinstance(proxy._pool, httpcore.HTTPProxy) assert proxy._pool._proxy_url == url_to_origin(url) assert len(expected_proxies) == len(client._mounts) def test_socks_proxy_deprecated(): url = httpx.URL("http://www.example.com") with pytest.warns(DeprecationWarning): client = httpx.Client(proxies="socks5://localhost/") transport = client._transport_for_url(url) assert isinstance(transport, httpx.HTTPTransport) assert isinstance(transport._pool, httpcore.SOCKSProxy) with pytest.warns(DeprecationWarning): async_client = httpx.AsyncClient(proxies="socks5://localhost/") async_transport = async_client._transport_for_url(url) assert isinstance(async_transport, httpx.AsyncHTTPTransport) assert isinstance(async_transport._pool, httpcore.AsyncSOCKSProxy) def test_socks_proxy(): url = httpx.URL("http://www.example.com") client = httpx.Client(proxy="socks5://localhost/") transport = client._transport_for_url(url) assert isinstance(transport, httpx.HTTPTransport) assert isinstance(transport._pool, httpcore.SOCKSProxy) async_client = httpx.AsyncClient(proxy="socks5://localhost/") async_transport = async_client._transport_for_url(url) assert isinstance(async_transport, httpx.AsyncHTTPTransport) assert isinstance(async_transport._pool, httpcore.AsyncSOCKSProxy) PROXY_URL = "http://[::1]" @pytest.mark.parametrize( ["url", "proxies", "expected"], [ ("http://example.com", None, None), ("http://example.com", {}, None), ("http://example.com", {"https://": PROXY_URL}, None), ("http://example.com", {"http://example.net": PROXY_URL}, None), # Using "*" should match any domain name. ("http://example.com", {"http://*": PROXY_URL}, PROXY_URL), ("https://example.com", {"http://*": PROXY_URL}, None), # Using "example.com" should match example.com, but not www.example.com ("http://example.com", {"http://example.com": PROXY_URL}, PROXY_URL), ("http://www.example.com", {"http://example.com": PROXY_URL}, None), # Using "*.example.com" should match www.example.com, but not example.com ("http://example.com", {"http://*.example.com": PROXY_URL}, None), ("http://www.example.com", {"http://*.example.com": PROXY_URL}, PROXY_URL), # Using "*example.com" should match example.com and www.example.com ("http://example.com", {"http://*example.com": PROXY_URL}, PROXY_URL), ("http://www.example.com", {"http://*example.com": PROXY_URL}, PROXY_URL), ("http://wwwexample.com", {"http://*example.com": PROXY_URL}, None), # ... ("http://example.com:443", {"http://example.com": PROXY_URL}, PROXY_URL), ("http://example.com", {"all://": PROXY_URL}, PROXY_URL), ("http://example.com", {"all://": PROXY_URL, "http://example.com": None}, None), ("http://example.com", {"http://": PROXY_URL}, PROXY_URL), ("http://example.com", {"all://example.com": PROXY_URL}, PROXY_URL), ("http://example.com", {"http://example.com": PROXY_URL}, PROXY_URL), ("http://example.com", {"http://example.com:80": PROXY_URL}, PROXY_URL), ("http://example.com:8080", {"http://example.com:8080": PROXY_URL}, PROXY_URL), ("http://example.com:8080", {"http://example.com": PROXY_URL}, PROXY_URL), ( "http://example.com", { "all://": PROXY_URL + ":1", "http://": PROXY_URL + ":2", "all://example.com": PROXY_URL + ":3", "http://example.com": PROXY_URL + ":4", }, PROXY_URL + ":4", ), ( "http://example.com", { "all://": PROXY_URL + ":1", "http://": PROXY_URL + ":2", "all://example.com": PROXY_URL + ":3", }, PROXY_URL + ":3", ), ( "http://example.com", {"all://": PROXY_URL + ":1", "http://": PROXY_URL + ":2"}, PROXY_URL + ":2", ), ], ) def test_transport_for_request(url, proxies, expected): if proxies: with pytest.warns(DeprecationWarning): client = httpx.Client(proxies=proxies) else: client = httpx.Client(proxies=proxies) transport = client._transport_for_url(httpx.URL(url)) if expected is None: assert transport is client._transport else: assert isinstance(transport, httpx.HTTPTransport) assert isinstance(transport._pool, httpcore.HTTPProxy) assert transport._pool._proxy_url == url_to_origin(expected) @pytest.mark.anyio @pytest.mark.network async def test_async_proxy_close(): try: with pytest.warns(DeprecationWarning): client = httpx.AsyncClient(proxies={"https://": PROXY_URL}) await client.get("http://example.com") finally: await client.aclose() @pytest.mark.network def test_sync_proxy_close(): try: with pytest.warns(DeprecationWarning): client = httpx.Client(proxies={"https://": PROXY_URL}) client.get("http://example.com") finally: client.close() def test_unsupported_proxy_scheme_deprecated(): with pytest.warns(DeprecationWarning), pytest.raises(ValueError): httpx.Client(proxies="ftp://127.0.0.1") def test_unsupported_proxy_scheme(): with pytest.raises(ValueError): httpx.Client(proxy="ftp://127.0.0.1") @pytest.mark.parametrize( ["url", "env", "expected"], [ ("http://google.com", {}, None), ( "http://google.com", {"HTTP_PROXY": "http://example.com"}, "http://example.com", ), # Auto prepend http scheme ("http://google.com", {"HTTP_PROXY": "example.com"}, "http://example.com"), ( "http://google.com", {"HTTP_PROXY": "http://example.com", "NO_PROXY": "google.com"}, None, ), # Everything proxied when NO_PROXY is empty/unset ( "http://127.0.0.1", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": ""}, "http://localhost:123", ), # Not proxied if NO_PROXY matches URL. ( "http://127.0.0.1", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "127.0.0.1"}, None, ), # Proxied if NO_PROXY scheme does not match URL. ( "http://127.0.0.1", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "https://127.0.0.1"}, "http://localhost:123", ), # Proxied if NO_PROXY scheme does not match host. ( "http://127.0.0.1", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "1.1.1.1"}, "http://localhost:123", ), # Not proxied if NO_PROXY matches host domain suffix. ( "http://courses.mit.edu", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "mit.edu"}, None, ), # Proxied even though NO_PROXY matches host domain *prefix*. ( "https://mit.edu.info", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "mit.edu"}, "http://localhost:123", ), # Not proxied if one item in NO_PROXY case matches host domain suffix. ( "https://mit.edu.info", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "mit.edu,edu.info"}, None, ), # Not proxied if one item in NO_PROXY case matches host domain suffix. # May include whitespace. ( "https://mit.edu.info", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "mit.edu, edu.info"}, None, ), # Proxied if no items in NO_PROXY match. ( "https://mit.edu.info", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "mit.edu,mit.info"}, "http://localhost:123", ), # Proxied if NO_PROXY domain doesn't match. ( "https://foo.example.com", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "www.example.com"}, "http://localhost:123", ), # Not proxied for subdomains matching NO_PROXY, with a leading ".". ( "https://www.example1.com", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": ".example1.com"}, None, ), # Proxied, because NO_PROXY subdomains only match if "." separated. ( "https://www.example2.com", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "ample2.com"}, "http://localhost:123", ), # No requests are proxied if NO_PROXY="*" is set. ( "https://www.example3.com", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "*"}, None, ), ], ) @pytest.mark.parametrize("client_class", [httpx.Client, httpx.AsyncClient]) def test_proxies_environ(monkeypatch, client_class, url, env, expected): for name, value in env.items(): monkeypatch.setenv(name, value) client = client_class() transport = client._transport_for_url(httpx.URL(url)) if expected is None: assert transport == client._transport else: assert transport._pool._proxy_url == url_to_origin(expected) @pytest.mark.parametrize( ["proxies", "is_valid"], [ ({"http": "http://127.0.0.1"}, False), ({"https": "http://127.0.0.1"}, False), ({"all": "http://127.0.0.1"}, False), ({"http://": "http://127.0.0.1"}, True), ({"https://": "http://127.0.0.1"}, True), ({"all://": "http://127.0.0.1"}, True), ], ) def test_for_deprecated_proxy_params(proxies, is_valid): with pytest.warns(DeprecationWarning): if not is_valid: with pytest.raises(ValueError): httpx.Client(proxies=proxies) else: httpx.Client(proxies=proxies) def test_proxy_and_proxies_together(): with pytest.warns(DeprecationWarning), pytest.raises( RuntimeError, ): httpx.Client(proxies={"all://": "http://127.0.0.1"}, proxy="http://127.0.0.1") with pytest.warns(DeprecationWarning), pytest.raises( RuntimeError, ): httpx.AsyncClient( proxies={"all://": "http://127.0.0.1"}, proxy="http://127.0.0.1" ) def test_proxy_with_mounts(): proxy_transport = httpx.HTTPTransport(proxy="http://127.0.0.1") client = httpx.Client(mounts={"http://": proxy_transport}) transport = client._transport_for_url(httpx.URL("http://example.com")) assert transport == proxy_transport httpx-0.26.0/tests/client/test_queryparams.py000066400000000000000000000021131454054354600213570ustar00rootroot00000000000000import httpx def hello_world(request: httpx.Request) -> httpx.Response: return httpx.Response(200, text="Hello, world") def test_client_queryparams(): client = httpx.Client(params={"a": "b"}) assert isinstance(client.params, httpx.QueryParams) assert client.params["a"] == "b" def test_client_queryparams_string(): client = httpx.Client(params="a=b") assert isinstance(client.params, httpx.QueryParams) assert client.params["a"] == "b" client = httpx.Client() client.params = "a=b" # type: ignore assert isinstance(client.params, httpx.QueryParams) assert client.params["a"] == "b" def test_client_queryparams_echo(): url = "http://example.org/echo_queryparams" client_queryparams = "first=str" request_queryparams = {"second": "dict"} client = httpx.Client( transport=httpx.MockTransport(hello_world), params=client_queryparams ) response = client.get(url, params=request_queryparams) assert response.status_code == 200 assert response.url == "http://example.org/echo_queryparams?first=str&second=dict" httpx-0.26.0/tests/client/test_redirects.py000066400000000000000000000421121454054354600207750ustar00rootroot00000000000000import typing import pytest import httpx def redirects(request: httpx.Request) -> httpx.Response: if request.url.scheme not in ("http", "https"): raise httpx.UnsupportedProtocol(f"Scheme {request.url.scheme!r} not supported.") if request.url.path == "/redirect_301": status_code = httpx.codes.MOVED_PERMANENTLY content = b"here" headers = {"location": "https://example.org/"} return httpx.Response(status_code, headers=headers, content=content) elif request.url.path == "/redirect_302": status_code = httpx.codes.FOUND headers = {"location": "https://example.org/"} return httpx.Response(status_code, headers=headers) elif request.url.path == "/redirect_303": status_code = httpx.codes.SEE_OTHER headers = {"location": "https://example.org/"} return httpx.Response(status_code, headers=headers) elif request.url.path == "/relative_redirect": status_code = httpx.codes.SEE_OTHER headers = {"location": "/"} return httpx.Response(status_code, headers=headers) elif request.url.path == "/malformed_redirect": status_code = httpx.codes.SEE_OTHER headers = {"location": "https://:443/"} return httpx.Response(status_code, headers=headers) elif request.url.path == "/invalid_redirect": status_code = httpx.codes.SEE_OTHER raw_headers = [(b"location", "https://😇/".encode("utf-8"))] return httpx.Response(status_code, headers=raw_headers) elif request.url.path == "/no_scheme_redirect": status_code = httpx.codes.SEE_OTHER headers = {"location": "//example.org/"} return httpx.Response(status_code, headers=headers) elif request.url.path == "/multiple_redirects": params = httpx.QueryParams(request.url.query) count = int(params.get("count", "0")) redirect_count = count - 1 status_code = httpx.codes.SEE_OTHER if count else httpx.codes.OK if count: location = "/multiple_redirects" if redirect_count: location += f"?count={redirect_count}" headers = {"location": location} else: headers = {} return httpx.Response(status_code, headers=headers) if request.url.path == "/redirect_loop": status_code = httpx.codes.SEE_OTHER headers = {"location": "/redirect_loop"} return httpx.Response(status_code, headers=headers) elif request.url.path == "/cross_domain": status_code = httpx.codes.SEE_OTHER headers = {"location": "https://example.org/cross_domain_target"} return httpx.Response(status_code, headers=headers) elif request.url.path == "/cross_domain_target": status_code = httpx.codes.OK data = { "body": request.content.decode("ascii"), "headers": dict(request.headers), } return httpx.Response(status_code, json=data) elif request.url.path == "/redirect_body": status_code = httpx.codes.PERMANENT_REDIRECT headers = {"location": "/redirect_body_target"} return httpx.Response(status_code, headers=headers) elif request.url.path == "/redirect_no_body": status_code = httpx.codes.SEE_OTHER headers = {"location": "/redirect_body_target"} return httpx.Response(status_code, headers=headers) elif request.url.path == "/redirect_body_target": data = { "body": request.content.decode("ascii"), "headers": dict(request.headers), } return httpx.Response(200, json=data) elif request.url.path == "/cross_subdomain": if request.headers["Host"] != "www.example.org": status_code = httpx.codes.PERMANENT_REDIRECT headers = {"location": "https://www.example.org/cross_subdomain"} return httpx.Response(status_code, headers=headers) else: return httpx.Response(200, text="Hello, world!") elif request.url.path == "/redirect_custom_scheme": status_code = httpx.codes.MOVED_PERMANENTLY headers = {"location": "market://details?id=42"} return httpx.Response(status_code, headers=headers) if request.method == "HEAD": return httpx.Response(200) return httpx.Response(200, html="Hello, world!") def test_redirect_301(): client = httpx.Client(transport=httpx.MockTransport(redirects)) response = client.post("https://example.org/redirect_301", follow_redirects=True) assert response.status_code == httpx.codes.OK assert response.url == "https://example.org/" assert len(response.history) == 1 def test_redirect_302(): client = httpx.Client(transport=httpx.MockTransport(redirects)) response = client.post("https://example.org/redirect_302", follow_redirects=True) assert response.status_code == httpx.codes.OK assert response.url == "https://example.org/" assert len(response.history) == 1 def test_redirect_303(): client = httpx.Client(transport=httpx.MockTransport(redirects)) response = client.get("https://example.org/redirect_303", follow_redirects=True) assert response.status_code == httpx.codes.OK assert response.url == "https://example.org/" assert len(response.history) == 1 def test_next_request(): client = httpx.Client(transport=httpx.MockTransport(redirects)) request = client.build_request("POST", "https://example.org/redirect_303") response = client.send(request, follow_redirects=False) assert response.status_code == httpx.codes.SEE_OTHER assert response.url == "https://example.org/redirect_303" assert response.next_request is not None response = client.send(response.next_request, follow_redirects=False) assert response.status_code == httpx.codes.OK assert response.url == "https://example.org/" assert response.next_request is None @pytest.mark.anyio async def test_async_next_request(): async with httpx.AsyncClient(transport=httpx.MockTransport(redirects)) as client: request = client.build_request("POST", "https://example.org/redirect_303") response = await client.send(request, follow_redirects=False) assert response.status_code == httpx.codes.SEE_OTHER assert response.url == "https://example.org/redirect_303" assert response.next_request is not None response = await client.send(response.next_request, follow_redirects=False) assert response.status_code == httpx.codes.OK assert response.url == "https://example.org/" assert response.next_request is None def test_head_redirect(): """ Contrary to Requests, redirects remain enabled by default for HEAD requests. """ client = httpx.Client(transport=httpx.MockTransport(redirects)) response = client.head("https://example.org/redirect_302", follow_redirects=True) assert response.status_code == httpx.codes.OK assert response.url == "https://example.org/" assert response.request.method == "HEAD" assert len(response.history) == 1 assert response.text == "" def test_relative_redirect(): client = httpx.Client(transport=httpx.MockTransport(redirects)) response = client.get( "https://example.org/relative_redirect", follow_redirects=True ) assert response.status_code == httpx.codes.OK assert response.url == "https://example.org/" assert len(response.history) == 1 def test_malformed_redirect(): # https://github.com/encode/httpx/issues/771 client = httpx.Client(transport=httpx.MockTransport(redirects)) response = client.get( "http://example.org/malformed_redirect", follow_redirects=True ) assert response.status_code == httpx.codes.OK assert response.url == "https://example.org:443/" assert len(response.history) == 1 def test_invalid_redirect(): client = httpx.Client(transport=httpx.MockTransport(redirects)) with pytest.raises(httpx.RemoteProtocolError): client.get("http://example.org/invalid_redirect", follow_redirects=True) def test_no_scheme_redirect(): client = httpx.Client(transport=httpx.MockTransport(redirects)) response = client.get( "https://example.org/no_scheme_redirect", follow_redirects=True ) assert response.status_code == httpx.codes.OK assert response.url == "https://example.org/" assert len(response.history) == 1 def test_fragment_redirect(): client = httpx.Client(transport=httpx.MockTransport(redirects)) response = client.get( "https://example.org/relative_redirect#fragment", follow_redirects=True ) assert response.status_code == httpx.codes.OK assert response.url == "https://example.org/#fragment" assert len(response.history) == 1 def test_multiple_redirects(): client = httpx.Client(transport=httpx.MockTransport(redirects)) response = client.get( "https://example.org/multiple_redirects?count=20", follow_redirects=True ) assert response.status_code == httpx.codes.OK assert response.url == "https://example.org/multiple_redirects" assert len(response.history) == 20 assert response.history[0].url == "https://example.org/multiple_redirects?count=20" assert response.history[1].url == "https://example.org/multiple_redirects?count=19" assert len(response.history[0].history) == 0 assert len(response.history[1].history) == 1 @pytest.mark.anyio async def test_async_too_many_redirects(): async with httpx.AsyncClient(transport=httpx.MockTransport(redirects)) as client: with pytest.raises(httpx.TooManyRedirects): await client.get( "https://example.org/multiple_redirects?count=21", follow_redirects=True ) def test_sync_too_many_redirects(): client = httpx.Client(transport=httpx.MockTransport(redirects)) with pytest.raises(httpx.TooManyRedirects): client.get( "https://example.org/multiple_redirects?count=21", follow_redirects=True ) def test_redirect_loop(): client = httpx.Client(transport=httpx.MockTransport(redirects)) with pytest.raises(httpx.TooManyRedirects): client.get("https://example.org/redirect_loop", follow_redirects=True) def test_cross_domain_redirect_with_auth_header(): client = httpx.Client(transport=httpx.MockTransport(redirects)) url = "https://example.com/cross_domain" headers = {"Authorization": "abc"} response = client.get(url, headers=headers, follow_redirects=True) assert response.url == "https://example.org/cross_domain_target" assert "authorization" not in response.json()["headers"] def test_cross_domain_https_redirect_with_auth_header(): client = httpx.Client(transport=httpx.MockTransport(redirects)) url = "http://example.com/cross_domain" headers = {"Authorization": "abc"} response = client.get(url, headers=headers, follow_redirects=True) assert response.url == "https://example.org/cross_domain_target" assert "authorization" not in response.json()["headers"] def test_cross_domain_redirect_with_auth(): client = httpx.Client(transport=httpx.MockTransport(redirects)) url = "https://example.com/cross_domain" response = client.get(url, auth=("user", "pass"), follow_redirects=True) assert response.url == "https://example.org/cross_domain_target" assert "authorization" not in response.json()["headers"] def test_same_domain_redirect(): client = httpx.Client(transport=httpx.MockTransport(redirects)) url = "https://example.org/cross_domain" headers = {"Authorization": "abc"} response = client.get(url, headers=headers, follow_redirects=True) assert response.url == "https://example.org/cross_domain_target" assert response.json()["headers"]["authorization"] == "abc" def test_same_domain_https_redirect_with_auth_header(): client = httpx.Client(transport=httpx.MockTransport(redirects)) url = "http://example.org/cross_domain" headers = {"Authorization": "abc"} response = client.get(url, headers=headers, follow_redirects=True) assert response.url == "https://example.org/cross_domain_target" assert response.json()["headers"]["authorization"] == "abc" def test_body_redirect(): """ A 308 redirect should preserve the request body. """ client = httpx.Client(transport=httpx.MockTransport(redirects)) url = "https://example.org/redirect_body" content = b"Example request body" response = client.post(url, content=content, follow_redirects=True) assert response.url == "https://example.org/redirect_body_target" assert response.json()["body"] == "Example request body" assert "content-length" in response.json()["headers"] def test_no_body_redirect(): """ A 303 redirect should remove the request body. """ client = httpx.Client(transport=httpx.MockTransport(redirects)) url = "https://example.org/redirect_no_body" content = b"Example request body" response = client.post(url, content=content, follow_redirects=True) assert response.url == "https://example.org/redirect_body_target" assert response.json()["body"] == "" assert "content-length" not in response.json()["headers"] def test_can_stream_if_no_redirect(): client = httpx.Client(transport=httpx.MockTransport(redirects)) url = "https://example.org/redirect_301" with client.stream("GET", url, follow_redirects=False) as response: pass assert response.status_code == httpx.codes.MOVED_PERMANENTLY assert response.headers["location"] == "https://example.org/" class ConsumeBodyTransport(httpx.MockTransport): def handle_request(self, request: httpx.Request) -> httpx.Response: assert isinstance(request.stream, httpx.SyncByteStream) list(request.stream) return self.handler(request) # type: ignore[return-value] def test_cannot_redirect_streaming_body(): client = httpx.Client(transport=ConsumeBodyTransport(redirects)) url = "https://example.org/redirect_body" def streaming_body() -> typing.Iterator[bytes]: yield b"Example request body" # pragma: no cover with pytest.raises(httpx.StreamConsumed): client.post(url, content=streaming_body(), follow_redirects=True) def test_cross_subdomain_redirect(): client = httpx.Client(transport=httpx.MockTransport(redirects)) url = "https://example.com/cross_subdomain" response = client.get(url, follow_redirects=True) assert response.url == "https://www.example.org/cross_subdomain" def cookie_sessions(request: httpx.Request) -> httpx.Response: if request.url.path == "/": cookie = request.headers.get("Cookie") if cookie is not None: content = b"Logged in" else: content = b"Not logged in" return httpx.Response(200, content=content) elif request.url.path == "/login": status_code = httpx.codes.SEE_OTHER headers = { "location": "/", "set-cookie": ( "session=eyJ1c2VybmFtZSI6ICJ0b21; path=/; Max-Age=1209600; " "httponly; samesite=lax" ), } return httpx.Response(status_code, headers=headers) else: assert request.url.path == "/logout" status_code = httpx.codes.SEE_OTHER headers = { "location": "/", "set-cookie": ( "session=null; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT; " "httponly; samesite=lax" ), } return httpx.Response(status_code, headers=headers) def test_redirect_cookie_behavior(): client = httpx.Client( transport=httpx.MockTransport(cookie_sessions), follow_redirects=True ) # The client is not logged in. response = client.get("https://example.com/") assert response.url == "https://example.com/" assert response.text == "Not logged in" # Login redirects to the homepage, setting a session cookie. response = client.post("https://example.com/login") assert response.url == "https://example.com/" assert response.text == "Logged in" # The client is logged in. response = client.get("https://example.com/") assert response.url == "https://example.com/" assert response.text == "Logged in" # Logout redirects to the homepage, expiring the session cookie. response = client.post("https://example.com/logout") assert response.url == "https://example.com/" assert response.text == "Not logged in" # The client is not logged in. response = client.get("https://example.com/") assert response.url == "https://example.com/" assert response.text == "Not logged in" def test_redirect_custom_scheme(): client = httpx.Client(transport=httpx.MockTransport(redirects)) with pytest.raises(httpx.UnsupportedProtocol) as e: client.post("https://example.org/redirect_custom_scheme", follow_redirects=True) assert str(e.value) == "Scheme 'market' not supported." @pytest.mark.anyio async def test_async_invalid_redirect(): async with httpx.AsyncClient(transport=httpx.MockTransport(redirects)) as client: with pytest.raises(httpx.RemoteProtocolError): await client.get( "http://example.org/invalid_redirect", follow_redirects=True ) httpx-0.26.0/tests/common.py000066400000000000000000000001401454054354600157570ustar00rootroot00000000000000import pathlib TESTS_DIR = pathlib.Path(__file__).parent FIXTURES_DIR = TESTS_DIR / "fixtures" httpx-0.26.0/tests/concurrency.py000066400000000000000000000005041454054354600170250ustar00rootroot00000000000000""" Async environment-agnostic concurrency utilities that are only used in tests. """ import asyncio import sniffio import trio async def sleep(seconds: float) -> None: if sniffio.current_async_library() == "trio": await trio.sleep(seconds) # pragma: no cover else: await asyncio.sleep(seconds) httpx-0.26.0/tests/conftest.py000066400000000000000000000216311454054354600163240ustar00rootroot00000000000000import asyncio import json import os import threading import time import typing import pytest import trustme from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.serialization import ( BestAvailableEncryption, Encoding, PrivateFormat, load_pem_private_key, ) from uvicorn.config import Config from uvicorn.server import Server import httpx from tests.concurrency import sleep ENVIRONMENT_VARIABLES = { "SSL_CERT_FILE", "SSL_CERT_DIR", "HTTP_PROXY", "HTTPS_PROXY", "ALL_PROXY", "NO_PROXY", "SSLKEYLOGFILE", } @pytest.fixture(scope="function", autouse=True) def clean_environ(): """Keeps os.environ clean for every test without having to mock os.environ""" original_environ = os.environ.copy() os.environ.clear() os.environ.update( { k: v for k, v in original_environ.items() if k not in ENVIRONMENT_VARIABLES and k.lower() not in ENVIRONMENT_VARIABLES } ) yield os.environ.clear() os.environ.update(original_environ) Message = typing.Dict[str, typing.Any] Receive = typing.Callable[[], typing.Awaitable[Message]] Send = typing.Callable[ [typing.Dict[str, typing.Any]], typing.Coroutine[None, None, None] ] Scope = typing.Dict[str, typing.Any] async def app(scope: Scope, receive: Receive, send: Send) -> None: assert scope["type"] == "http" if scope["path"].startswith("/slow_response"): await slow_response(scope, receive, send) elif scope["path"].startswith("/status"): await status_code(scope, receive, send) elif scope["path"].startswith("/echo_body"): await echo_body(scope, receive, send) elif scope["path"].startswith("/echo_binary"): await echo_binary(scope, receive, send) elif scope["path"].startswith("/echo_headers"): await echo_headers(scope, receive, send) elif scope["path"].startswith("/redirect_301"): await redirect_301(scope, receive, send) elif scope["path"].startswith("/json"): await hello_world_json(scope, receive, send) else: await hello_world(scope, receive, send) async def hello_world(scope: Scope, receive: Receive, send: Send) -> None: await send( { "type": "http.response.start", "status": 200, "headers": [[b"content-type", b"text/plain"]], } ) await send({"type": "http.response.body", "body": b"Hello, world!"}) async def hello_world_json(scope: Scope, receive: Receive, send: Send) -> None: await send( { "type": "http.response.start", "status": 200, "headers": [[b"content-type", b"application/json"]], } ) await send({"type": "http.response.body", "body": b'{"Hello": "world!"}'}) async def slow_response(scope: Scope, receive: Receive, send: Send) -> None: await send( { "type": "http.response.start", "status": 200, "headers": [[b"content-type", b"text/plain"]], } ) await sleep(1.0) # Allow triggering a read timeout. await send({"type": "http.response.body", "body": b"Hello, world!"}) async def status_code(scope: Scope, receive: Receive, send: Send) -> None: status_code = int(scope["path"].replace("/status/", "")) await send( { "type": "http.response.start", "status": status_code, "headers": [[b"content-type", b"text/plain"]], } ) await send({"type": "http.response.body", "body": b"Hello, world!"}) async def echo_body(scope: Scope, receive: Receive, send: Send) -> None: body = b"" more_body = True while more_body: message = await receive() body += message.get("body", b"") more_body = message.get("more_body", False) await send( { "type": "http.response.start", "status": 200, "headers": [[b"content-type", b"text/plain"]], } ) await send({"type": "http.response.body", "body": body}) async def echo_binary(scope: Scope, receive: Receive, send: Send) -> None: body = b"" more_body = True while more_body: message = await receive() body += message.get("body", b"") more_body = message.get("more_body", False) await send( { "type": "http.response.start", "status": 200, "headers": [[b"content-type", b"application/octet-stream"]], } ) await send({"type": "http.response.body", "body": body}) async def echo_headers(scope: Scope, receive: Receive, send: Send) -> None: body = { name.capitalize().decode(): value.decode() for name, value in scope.get("headers", []) } await send( { "type": "http.response.start", "status": 200, "headers": [[b"content-type", b"application/json"]], } ) await send({"type": "http.response.body", "body": json.dumps(body).encode()}) async def redirect_301(scope: Scope, receive: Receive, send: Send) -> None: await send( {"type": "http.response.start", "status": 301, "headers": [[b"location", b"/"]]} ) await send({"type": "http.response.body"}) @pytest.fixture(scope="session") def cert_authority(): return trustme.CA() @pytest.fixture(scope="session") def ca_cert_pem_file(cert_authority): with cert_authority.cert_pem.tempfile() as tmp: yield tmp @pytest.fixture(scope="session") def localhost_cert(cert_authority): return cert_authority.issue_cert("localhost") @pytest.fixture(scope="session") def cert_pem_file(localhost_cert): with localhost_cert.cert_chain_pems[0].tempfile() as tmp: yield tmp @pytest.fixture(scope="session") def cert_private_key_file(localhost_cert): with localhost_cert.private_key_pem.tempfile() as tmp: yield tmp @pytest.fixture(scope="session") def cert_encrypted_private_key_file(localhost_cert): # Deserialize the private key and then reserialize with a password private_key = load_pem_private_key( localhost_cert.private_key_pem.bytes(), password=None, backend=default_backend() ) encrypted_private_key_pem = trustme.Blob( private_key.private_bytes( Encoding.PEM, PrivateFormat.TraditionalOpenSSL, BestAvailableEncryption(password=b"password"), ) ) with encrypted_private_key_pem.tempfile() as tmp: yield tmp class TestServer(Server): @property def url(self) -> httpx.URL: protocol = "https" if self.config.is_ssl else "http" return httpx.URL(f"{protocol}://{self.config.host}:{self.config.port}/") def install_signal_handlers(self) -> None: # Disable the default installation of handlers for signals such as SIGTERM, # because it can only be done in the main thread. pass async def serve(self, sockets=None): self.restart_requested = asyncio.Event() loop = asyncio.get_event_loop() tasks = { loop.create_task(super().serve(sockets=sockets)), loop.create_task(self.watch_restarts()), } await asyncio.wait(tasks) async def restart(self) -> None: # pragma: no cover # This coroutine may be called from a different thread than the one the # server is running on, and from an async environment that's not asyncio. # For this reason, we use an event to coordinate with the server # instead of calling shutdown()/startup() directly, and should not make # any asyncio-specific operations. self.started = False self.restart_requested.set() while not self.started: await sleep(0.2) async def watch_restarts(self) -> None: # pragma: no cover while True: if self.should_exit: return try: await asyncio.wait_for(self.restart_requested.wait(), timeout=0.1) except asyncio.TimeoutError: continue self.restart_requested.clear() await self.shutdown() await self.startup() def serve_in_thread(server: TestServer) -> typing.Iterator[TestServer]: thread = threading.Thread(target=server.run) thread.start() try: while not server.started: time.sleep(1e-3) yield server finally: server.should_exit = True thread.join() @pytest.fixture(scope="session") def server() -> typing.Iterator[TestServer]: config = Config(app=app, lifespan="off", loop="asyncio") server = TestServer(config=config) yield from serve_in_thread(server) @pytest.fixture(scope="session") def https_server(cert_pem_file, cert_private_key_file): config = Config( app=app, lifespan="off", ssl_certfile=cert_pem_file, ssl_keyfile=cert_private_key_file, port=8001, loop="asyncio", ) server = TestServer(config=config) yield from serve_in_thread(server) httpx-0.26.0/tests/fixtures/000077500000000000000000000000001454054354600157735ustar00rootroot00000000000000httpx-0.26.0/tests/fixtures/.netrc000066400000000000000000000001111454054354600171000ustar00rootroot00000000000000machine netrcexample.org login example-username password example-passwordhttpx-0.26.0/tests/fixtures/.netrc-nopassword000066400000000000000000000000601454054354600213000ustar00rootroot00000000000000machine netrcexample.org login example-username httpx-0.26.0/tests/models/000077500000000000000000000000001454054354600154055ustar00rootroot00000000000000httpx-0.26.0/tests/models/__init__.py000066400000000000000000000000001454054354600175040ustar00rootroot00000000000000httpx-0.26.0/tests/models/test_cookies.py000066400000000000000000000055451454054354600204630ustar00rootroot00000000000000import http import pytest import httpx def test_cookies(): cookies = httpx.Cookies({"name": "value"}) assert cookies["name"] == "value" assert "name" in cookies assert len(cookies) == 1 assert dict(cookies) == {"name": "value"} assert bool(cookies) is True del cookies["name"] assert "name" not in cookies assert len(cookies) == 0 assert dict(cookies) == {} assert bool(cookies) is False def test_cookies_update(): cookies = httpx.Cookies() more_cookies = httpx.Cookies() more_cookies.set("name", "value", domain="example.com") cookies.update(more_cookies) assert dict(cookies) == {"name": "value"} assert cookies.get("name", domain="example.com") == "value" def test_cookies_with_domain(): cookies = httpx.Cookies() cookies.set("name", "value", domain="example.com") cookies.set("name", "value", domain="example.org") with pytest.raises(httpx.CookieConflict): cookies["name"] cookies.clear(domain="example.com") assert len(cookies) == 1 def test_cookies_with_domain_and_path(): cookies = httpx.Cookies() cookies.set("name", "value", domain="example.com", path="/subpath/1") cookies.set("name", "value", domain="example.com", path="/subpath/2") cookies.clear(domain="example.com", path="/subpath/1") assert len(cookies) == 1 cookies.delete("name", domain="example.com", path="/subpath/2") assert len(cookies) == 0 def test_multiple_set_cookie(): jar = http.cookiejar.CookieJar() headers = [ ( b"Set-Cookie", b"1P_JAR=2020-08-09-18; expires=Tue, 08-Sep-2099 18:33:35 GMT; " b"path=/; domain=.example.org; Secure", ), ( b"Set-Cookie", b"NID=204=KWdXOuypc86YvRfBSiWoW1dEXfSl_5qI7sxZY4umlk4J35yNTeNEkw15" b"MRaujK6uYCwkrtjihTTXZPp285z_xDOUzrdHt4dj0Z5C0VOpbvdLwRdHatHAzQs7" b"7TsaiWY78a3qU9r7KP_RbSLvLl2hlhnWFR2Hp5nWKPsAcOhQgSg; expires=Mon, " b"08-Feb-2099 18:33:35 GMT; path=/; domain=.example.org; HttpOnly", ), ] request = httpx.Request("GET", "https://www.example.org") response = httpx.Response(200, request=request, headers=headers) cookies = httpx.Cookies(jar) cookies.extract_cookies(response) assert len(cookies) == 2 def test_cookies_can_be_a_list_of_tuples(): cookies_val = [("name1", "val1"), ("name2", "val2")] cookies = httpx.Cookies(cookies_val) assert len(cookies.items()) == 2 for k, v in cookies_val: assert cookies[k] == v def test_cookies_repr(): cookies = httpx.Cookies() cookies.set(name="foo", value="bar", domain="http://blah.com") cookies.set(name="fizz", value="buzz", domain="http://hello.com") assert repr(cookies) == ( "," " ]>" ) httpx-0.26.0/tests/models/test_headers.py000066400000000000000000000126431454054354600204370ustar00rootroot00000000000000import pytest import httpx def test_headers(): h = httpx.Headers([("a", "123"), ("a", "456"), ("b", "789")]) assert "a" in h assert "A" in h assert "b" in h assert "B" in h assert "c" not in h assert h["a"] == "123, 456" assert h.get("a") == "123, 456" assert h.get("nope", default=None) is None assert h.get_list("a") == ["123", "456"] assert list(h.keys()) == ["a", "b"] assert list(h.values()) == ["123, 456", "789"] assert list(h.items()) == [("a", "123, 456"), ("b", "789")] assert h.multi_items() == [("a", "123"), ("a", "456"), ("b", "789")] assert list(h) == ["a", "b"] assert dict(h) == {"a": "123, 456", "b": "789"} assert repr(h) == "Headers([('a', '123'), ('a', '456'), ('b', '789')])" assert h == [("a", "123"), ("b", "789"), ("a", "456")] assert h == [("a", "123"), ("A", "456"), ("b", "789")] assert h == {"a": "123", "A": "456", "b": "789"} assert h != "a: 123\nA: 456\nb: 789" h = httpx.Headers({"a": "123", "b": "789"}) assert h["A"] == "123" assert h["B"] == "789" assert h.raw == [(b"a", b"123"), (b"b", b"789")] assert repr(h) == "Headers({'a': '123', 'b': '789'})" def test_header_mutations(): h = httpx.Headers() assert dict(h) == {} h["a"] = "1" assert dict(h) == {"a": "1"} h["a"] = "2" assert dict(h) == {"a": "2"} h.setdefault("a", "3") assert dict(h) == {"a": "2"} h.setdefault("b", "4") assert dict(h) == {"a": "2", "b": "4"} del h["a"] assert dict(h) == {"b": "4"} assert h.raw == [(b"b", b"4")] def test_copy_headers_method(): headers = httpx.Headers({"custom": "example"}) headers_copy = headers.copy() assert headers == headers_copy assert headers is not headers_copy def test_copy_headers_init(): headers = httpx.Headers({"custom": "example"}) headers_copy = httpx.Headers(headers) assert headers == headers_copy def test_headers_insert_retains_ordering(): headers = httpx.Headers({"a": "a", "b": "b", "c": "c"}) headers["b"] = "123" assert list(headers.values()) == ["a", "123", "c"] def test_headers_insert_appends_if_new(): headers = httpx.Headers({"a": "a", "b": "b", "c": "c"}) headers["d"] = "123" assert list(headers.values()) == ["a", "b", "c", "123"] def test_headers_insert_removes_all_existing(): headers = httpx.Headers([("a", "123"), ("a", "456")]) headers["a"] = "789" assert dict(headers) == {"a": "789"} def test_headers_delete_removes_all_existing(): headers = httpx.Headers([("a", "123"), ("a", "456")]) del headers["a"] assert dict(headers) == {} def test_headers_dict_repr(): """ Headers should display with a dict repr by default. """ headers = httpx.Headers({"custom": "example"}) assert repr(headers) == "Headers({'custom': 'example'})" def test_headers_encoding_in_repr(): """ Headers should display an encoding in the repr if required. """ headers = httpx.Headers({b"custom": "example ☃".encode("utf-8")}) assert repr(headers) == "Headers({'custom': 'example ☃'}, encoding='utf-8')" def test_headers_list_repr(): """ Headers should display with a list repr if they include multiple identical keys. """ headers = httpx.Headers([("custom", "example 1"), ("custom", "example 2")]) assert ( repr(headers) == "Headers([('custom', 'example 1'), ('custom', 'example 2')])" ) def test_headers_decode_ascii(): """ Headers should decode as ascii by default. """ raw_headers = [(b"Custom", b"Example")] headers = httpx.Headers(raw_headers) assert dict(headers) == {"custom": "Example"} assert headers.encoding == "ascii" def test_headers_decode_utf_8(): """ Headers containing non-ascii codepoints should default to decoding as utf-8. """ raw_headers = [(b"Custom", "Code point: ☃".encode("utf-8"))] headers = httpx.Headers(raw_headers) assert dict(headers) == {"custom": "Code point: ☃"} assert headers.encoding == "utf-8" def test_headers_decode_iso_8859_1(): """ Headers containing non-UTF-8 codepoints should default to decoding as iso-8859-1. """ raw_headers = [(b"Custom", "Code point: ÿ".encode("iso-8859-1"))] headers = httpx.Headers(raw_headers) assert dict(headers) == {"custom": "Code point: ÿ"} assert headers.encoding == "iso-8859-1" def test_headers_decode_explicit_encoding(): """ An explicit encoding may be set on headers in order to force a particular decoding. """ raw_headers = [(b"Custom", "Code point: ☃".encode("utf-8"))] headers = httpx.Headers(raw_headers) headers.encoding = "iso-8859-1" assert dict(headers) == {"custom": "Code point: â\x98\x83"} assert headers.encoding == "iso-8859-1" def test_multiple_headers(): """ `Headers.get_list` should support both split_commas=False and split_commas=True. """ h = httpx.Headers([("set-cookie", "a, b"), ("set-cookie", "c")]) assert h.get_list("Set-Cookie") == ["a, b", "c"] h = httpx.Headers([("vary", "a, b"), ("vary", "c")]) assert h.get_list("Vary", split_commas=True) == ["a", "b", "c"] @pytest.mark.parametrize("header", ["authorization", "proxy-authorization"]) def test_sensitive_headers(header): """ Some headers should be obfuscated because they contain sensitive data. """ value = "s3kr3t" h = httpx.Headers({header: value}) assert repr(h) == "Headers({'%s': '[secure]'})" % header httpx-0.26.0/tests/models/test_queryparams.py000066400000000000000000000067571454054354600214060ustar00rootroot00000000000000import pytest import httpx @pytest.mark.parametrize( "source", [ "a=123&a=456&b=789", {"a": ["123", "456"], "b": 789}, {"a": ("123", "456"), "b": 789}, [("a", "123"), ("a", "456"), ("b", "789")], (("a", "123"), ("a", "456"), ("b", "789")), ], ) def test_queryparams(source): q = httpx.QueryParams(source) assert "a" in q assert "A" not in q assert "c" not in q assert q["a"] == "123" assert q.get("a") == "123" assert q.get("nope", default=None) is None assert q.get_list("a") == ["123", "456"] assert list(q.keys()) == ["a", "b"] assert list(q.values()) == ["123", "789"] assert list(q.items()) == [("a", "123"), ("b", "789")] assert len(q) == 2 assert list(q) == ["a", "b"] assert dict(q) == {"a": "123", "b": "789"} assert str(q) == "a=123&a=456&b=789" assert repr(q) == "QueryParams('a=123&a=456&b=789')" assert httpx.QueryParams({"a": "123", "b": "456"}) == httpx.QueryParams( [("a", "123"), ("b", "456")] ) assert httpx.QueryParams({"a": "123", "b": "456"}) == httpx.QueryParams( "a=123&b=456" ) assert httpx.QueryParams({"a": "123", "b": "456"}) == httpx.QueryParams( {"b": "456", "a": "123"} ) assert httpx.QueryParams() == httpx.QueryParams({}) assert httpx.QueryParams([("a", "123"), ("a", "456")]) == httpx.QueryParams( "a=123&a=456" ) assert httpx.QueryParams({"a": "123", "b": "456"}) != "invalid" q = httpx.QueryParams([("a", "123"), ("a", "456")]) assert httpx.QueryParams(q) == q def test_queryparam_types(): q = httpx.QueryParams(None) assert str(q) == "" q = httpx.QueryParams({"a": True}) assert str(q) == "a=true" q = httpx.QueryParams({"a": False}) assert str(q) == "a=false" q = httpx.QueryParams({"a": ""}) assert str(q) == "a=" q = httpx.QueryParams({"a": None}) assert str(q) == "a=" q = httpx.QueryParams({"a": 1.23}) assert str(q) == "a=1.23" q = httpx.QueryParams({"a": 123}) assert str(q) == "a=123" q = httpx.QueryParams({"a": [1, 2]}) assert str(q) == "a=1&a=2" def test_empty_query_params(): q = httpx.QueryParams({"a": ""}) assert str(q) == "a=" q = httpx.QueryParams("a=") assert str(q) == "a=" q = httpx.QueryParams("a") assert str(q) == "a=" def test_queryparam_update_is_hard_deprecated(): q = httpx.QueryParams("a=123") with pytest.raises(RuntimeError): q.update({"a": "456"}) def test_queryparam_setter_is_hard_deprecated(): q = httpx.QueryParams("a=123") with pytest.raises(RuntimeError): q["a"] = "456" def test_queryparam_set(): q = httpx.QueryParams("a=123") q = q.set("a", "456") assert q == httpx.QueryParams("a=456") def test_queryparam_add(): q = httpx.QueryParams("a=123") q = q.add("a", "456") assert q == httpx.QueryParams("a=123&a=456") def test_queryparam_remove(): q = httpx.QueryParams("a=123") q = q.remove("a") assert q == httpx.QueryParams("") def test_queryparam_merge(): q = httpx.QueryParams("a=123") q = q.merge({"b": "456"}) assert q == httpx.QueryParams("a=123&b=456") q = q.merge({"a": "000", "c": "789"}) assert q == httpx.QueryParams("a=000&b=456&c=789") def test_queryparams_are_hashable(): params = ( httpx.QueryParams("a=123"), httpx.QueryParams({"a": 123}), httpx.QueryParams("b=456"), httpx.QueryParams({"b": 456}), ) assert len(set(params)) == 2 httpx-0.26.0/tests/models/test_requests.py000066400000000000000000000171021454054354600206720ustar00rootroot00000000000000import pickle import typing import pytest import httpx def test_request_repr(): request = httpx.Request("GET", "http://example.org") assert repr(request) == "" def test_no_content(): request = httpx.Request("GET", "http://example.org") assert "Content-Length" not in request.headers def test_content_length_header(): request = httpx.Request("POST", "http://example.org", content=b"test 123") assert request.headers["Content-Length"] == "8" def test_iterable_content(): class Content: def __iter__(self): yield b"test 123" # pragma: no cover request = httpx.Request("POST", "http://example.org", content=Content()) assert request.headers == {"Host": "example.org", "Transfer-Encoding": "chunked"} def test_generator_with_transfer_encoding_header(): def content() -> typing.Iterator[bytes]: yield b"test 123" # pragma: no cover request = httpx.Request("POST", "http://example.org", content=content()) assert request.headers == {"Host": "example.org", "Transfer-Encoding": "chunked"} def test_generator_with_content_length_header(): def content() -> typing.Iterator[bytes]: yield b"test 123" # pragma: no cover headers = {"Content-Length": "8"} request = httpx.Request( "POST", "http://example.org", content=content(), headers=headers ) assert request.headers == {"Host": "example.org", "Content-Length": "8"} def test_url_encoded_data(): request = httpx.Request("POST", "http://example.org", data={"test": "123"}) request.read() assert request.headers["Content-Type"] == "application/x-www-form-urlencoded" assert request.content == b"test=123" def test_json_encoded_data(): request = httpx.Request("POST", "http://example.org", json={"test": 123}) request.read() assert request.headers["Content-Type"] == "application/json" assert request.content == b'{"test": 123}' def test_headers(): request = httpx.Request("POST", "http://example.org", json={"test": 123}) assert request.headers == { "Host": "example.org", "Content-Type": "application/json", "Content-Length": "13", } def test_read_and_stream_data(): # Ensure a request may still be streamed if it has been read. # Needed for cases such as authentication classes that read the request body. request = httpx.Request("POST", "http://example.org", json={"test": 123}) request.read() assert request.stream is not None assert isinstance(request.stream, typing.Iterable) content = b"".join(list(request.stream)) assert content == request.content @pytest.mark.anyio async def test_aread_and_stream_data(): # Ensure a request may still be streamed if it has been read. # Needed for cases such as authentication classes that read the request body. request = httpx.Request("POST", "http://example.org", json={"test": 123}) await request.aread() assert request.stream is not None assert isinstance(request.stream, typing.AsyncIterable) content = b"".join([part async for part in request.stream]) assert content == request.content def test_cannot_access_streaming_content_without_read(): # Ensure that streaming requests def streaming_body() -> typing.Iterator[bytes]: # pragma: no cover yield b"" request = httpx.Request("POST", "http://example.org", content=streaming_body()) with pytest.raises(httpx.RequestNotRead): request.content # noqa: B018 def test_transfer_encoding_header(): async def streaming_body(data: bytes) -> typing.AsyncIterator[bytes]: yield data # pragma: no cover data = streaming_body(b"test 123") request = httpx.Request("POST", "http://example.org", content=data) assert "Content-Length" not in request.headers assert request.headers["Transfer-Encoding"] == "chunked" def test_ignore_transfer_encoding_header_if_content_length_exists(): """ `Transfer-Encoding` should be ignored if `Content-Length` has been set explicitly. See https://github.com/encode/httpx/issues/1168 """ def streaming_body(data: bytes) -> typing.Iterator[bytes]: yield data # pragma: no cover data = streaming_body(b"abcd") headers = {"Content-Length": "4"} request = httpx.Request("POST", "http://example.org", content=data, headers=headers) assert "Transfer-Encoding" not in request.headers assert request.headers["Content-Length"] == "4" def test_override_host_header(): headers = {"host": "1.2.3.4:80"} request = httpx.Request("GET", "http://example.org", headers=headers) assert request.headers["Host"] == "1.2.3.4:80" def test_override_accept_encoding_header(): headers = {"Accept-Encoding": "identity"} request = httpx.Request("GET", "http://example.org", headers=headers) assert request.headers["Accept-Encoding"] == "identity" def test_override_content_length_header(): async def streaming_body(data: bytes) -> typing.AsyncIterator[bytes]: yield data # pragma: no cover data = streaming_body(b"test 123") headers = {"Content-Length": "8"} request = httpx.Request("POST", "http://example.org", content=data, headers=headers) assert request.headers["Content-Length"] == "8" def test_url(): url = "http://example.org" request = httpx.Request("GET", url) assert request.url.scheme == "http" assert request.url.port is None assert request.url.path == "/" assert request.url.raw_path == b"/" url = "https://example.org/abc?foo=bar" request = httpx.Request("GET", url) assert request.url.scheme == "https" assert request.url.port is None assert request.url.path == "/abc" assert request.url.raw_path == b"/abc?foo=bar" def test_request_picklable(): request = httpx.Request("POST", "http://example.org", json={"test": 123}) pickle_request = pickle.loads(pickle.dumps(request)) assert pickle_request.method == "POST" assert pickle_request.url.path == "/" assert pickle_request.headers["Content-Type"] == "application/json" assert pickle_request.content == b'{"test": 123}' assert pickle_request.stream is not None assert request.headers == { "Host": "example.org", "Content-Type": "application/json", "content-length": "13", } @pytest.mark.anyio async def test_request_async_streaming_content_picklable(): async def streaming_body(data: bytes) -> typing.AsyncIterator[bytes]: yield data data = streaming_body(b"test 123") request = httpx.Request("POST", "http://example.org", content=data) pickle_request = pickle.loads(pickle.dumps(request)) with pytest.raises(httpx.RequestNotRead): pickle_request.content # noqa: B018 with pytest.raises(httpx.StreamClosed): await pickle_request.aread() request = httpx.Request("POST", "http://example.org", content=data) await request.aread() pickle_request = pickle.loads(pickle.dumps(request)) assert pickle_request.content == b"test 123" def test_request_generator_content_picklable(): def content() -> typing.Iterator[bytes]: yield b"test 123" # pragma: no cover request = httpx.Request("POST", "http://example.org", content=content()) pickle_request = pickle.loads(pickle.dumps(request)) with pytest.raises(httpx.RequestNotRead): pickle_request.content # noqa: B018 with pytest.raises(httpx.StreamClosed): pickle_request.read() request = httpx.Request("POST", "http://example.org", content=content()) request.read() pickle_request = pickle.loads(pickle.dumps(request)) assert pickle_request.content == b"test 123" httpx-0.26.0/tests/models/test_responses.py000066400000000000000000000726671454054354600210610ustar00rootroot00000000000000import json import pickle import typing import chardet import pytest import httpx class StreamingBody: def __iter__(self): yield b"Hello, " yield b"world!" def streaming_body() -> typing.Iterator[bytes]: yield b"Hello, " yield b"world!" async def async_streaming_body() -> typing.AsyncIterator[bytes]: yield b"Hello, " yield b"world!" def autodetect(content): return chardet.detect(content).get("encoding") def test_response(): response = httpx.Response( 200, content=b"Hello, world!", request=httpx.Request("GET", "https://example.org"), ) assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Hello, world!" assert response.request.method == "GET" assert response.request.url == "https://example.org" assert not response.is_error def test_response_content(): response = httpx.Response(200, content="Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Hello, world!" assert response.headers == {"Content-Length": "13"} def test_response_text(): response = httpx.Response(200, text="Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Hello, world!" assert response.headers == { "Content-Length": "13", "Content-Type": "text/plain; charset=utf-8", } def test_response_html(): response = httpx.Response(200, html="Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Hello, world!" assert response.headers == { "Content-Length": "39", "Content-Type": "text/html; charset=utf-8", } def test_response_json(): response = httpx.Response(200, json={"hello": "world"}) assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.json() == {"hello": "world"} assert response.headers == { "Content-Length": "18", "Content-Type": "application/json", } def test_raise_for_status(): request = httpx.Request("GET", "https://example.org") # 2xx status codes are not an error. response = httpx.Response(200, request=request) response.raise_for_status() # 1xx status codes are informational responses. response = httpx.Response(101, request=request) assert response.is_informational with pytest.raises(httpx.HTTPStatusError) as exc_info: response.raise_for_status() assert str(exc_info.value) == ( "Informational response '101 Switching Protocols' for url 'https://example.org'\n" "For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/101" ) # 3xx status codes are redirections. headers = {"location": "https://other.org"} response = httpx.Response(303, headers=headers, request=request) assert response.is_redirect with pytest.raises(httpx.HTTPStatusError) as exc_info: response.raise_for_status() assert str(exc_info.value) == ( "Redirect response '303 See Other' for url 'https://example.org'\n" "Redirect location: 'https://other.org'\n" "For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/303" ) # 4xx status codes are a client error. response = httpx.Response(403, request=request) assert response.is_client_error assert response.is_error with pytest.raises(httpx.HTTPStatusError) as exc_info: response.raise_for_status() assert str(exc_info.value) == ( "Client error '403 Forbidden' for url 'https://example.org'\n" "For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403" ) # 5xx status codes are a server error. response = httpx.Response(500, request=request) assert response.is_server_error assert response.is_error with pytest.raises(httpx.HTTPStatusError) as exc_info: response.raise_for_status() assert str(exc_info.value) == ( "Server error '500 Internal Server Error' for url 'https://example.org'\n" "For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500" ) # Calling .raise_for_status without setting a request instance is # not valid. Should raise a runtime error. response = httpx.Response(200) with pytest.raises(RuntimeError): response.raise_for_status() def test_response_repr(): response = httpx.Response( 200, content=b"Hello, world!", ) assert repr(response) == "" def test_response_content_type_encoding(): """ Use the charset encoding in the Content-Type header if possible. """ headers = {"Content-Type": "text-plain; charset=latin-1"} content = "Latin 1: ÿ".encode("latin-1") response = httpx.Response( 200, content=content, headers=headers, ) assert response.text == "Latin 1: ÿ" assert response.encoding == "latin-1" def test_response_default_to_utf8_encoding(): """ Default to utf-8 encoding if there is no Content-Type header. """ content = "おはようございます。".encode("utf-8") response = httpx.Response( 200, content=content, ) assert response.text == "おはようございます。" assert response.encoding == "utf-8" def test_response_fallback_to_utf8_encoding(): """ Fallback to utf-8 if we get an invalid charset in the Content-Type header. """ headers = {"Content-Type": "text-plain; charset=invalid-codec-name"} content = "おはようございます。".encode("utf-8") response = httpx.Response( 200, content=content, headers=headers, ) assert response.text == "おはようございます。" assert response.encoding == "utf-8" def test_response_no_charset_with_ascii_content(): """ A response with ascii encoded content should decode correctly, even with no charset specified. """ content = b"Hello, world!" headers = {"Content-Type": "text/plain"} response = httpx.Response( 200, content=content, headers=headers, ) assert response.status_code == 200 assert response.encoding == "utf-8" assert response.text == "Hello, world!" def test_response_no_charset_with_utf8_content(): """ A response with UTF-8 encoded content should decode correctly, even with no charset specified. """ content = "Unicode Snowman: ☃".encode("utf-8") headers = {"Content-Type": "text/plain"} response = httpx.Response( 200, content=content, headers=headers, ) assert response.text == "Unicode Snowman: ☃" assert response.encoding == "utf-8" def test_response_no_charset_with_iso_8859_1_content(): """ A response with ISO 8859-1 encoded content should decode correctly, even with no charset specified, if autodetect is enabled. """ content = "Accented: Österreich abcdefghijklmnopqrstuzwxyz".encode("iso-8859-1") headers = {"Content-Type": "text/plain"} response = httpx.Response( 200, content=content, headers=headers, default_encoding=autodetect ) assert response.text == "Accented: Österreich abcdefghijklmnopqrstuzwxyz" assert response.charset_encoding is None def test_response_no_charset_with_cp_1252_content(): """ A response with Windows 1252 encoded content should decode correctly, even with no charset specified, if autodetect is enabled. """ content = "Euro Currency: € abcdefghijklmnopqrstuzwxyz".encode("cp1252") headers = {"Content-Type": "text/plain"} response = httpx.Response( 200, content=content, headers=headers, default_encoding=autodetect ) assert response.text == "Euro Currency: € abcdefghijklmnopqrstuzwxyz" assert response.charset_encoding is None def test_response_non_text_encoding(): """ Default to attempting utf-8 encoding for non-text content-type headers. """ headers = {"Content-Type": "image/png"} response = httpx.Response( 200, content=b"xyz", headers=headers, ) assert response.text == "xyz" assert response.encoding == "utf-8" def test_response_set_explicit_encoding(): headers = { "Content-Type": "text-plain; charset=utf-8" } # Deliberately incorrect charset response = httpx.Response( 200, content="Latin 1: ÿ".encode("latin-1"), headers=headers, ) response.encoding = "latin-1" assert response.text == "Latin 1: ÿ" assert response.encoding == "latin-1" def test_response_force_encoding(): response = httpx.Response( 200, content="Snowman: ☃".encode("utf-8"), ) response.encoding = "iso-8859-1" assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Snowman: â\x98\x83" assert response.encoding == "iso-8859-1" def test_response_force_encoding_after_text_accessed(): response = httpx.Response( 200, content=b"Hello, world!", ) assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Hello, world!" assert response.encoding == "utf-8" with pytest.raises(ValueError): response.encoding = "UTF8" with pytest.raises(ValueError): response.encoding = "iso-8859-1" def test_read(): response = httpx.Response( 200, content=b"Hello, world!", ) assert response.status_code == 200 assert response.text == "Hello, world!" assert response.encoding == "utf-8" assert response.is_closed content = response.read() assert content == b"Hello, world!" assert response.content == b"Hello, world!" assert response.is_closed def test_empty_read(): response = httpx.Response(200) assert response.status_code == 200 assert response.text == "" assert response.encoding == "utf-8" assert response.is_closed content = response.read() assert content == b"" assert response.content == b"" assert response.is_closed @pytest.mark.anyio async def test_aread(): response = httpx.Response( 200, content=b"Hello, world!", ) assert response.status_code == 200 assert response.text == "Hello, world!" assert response.encoding == "utf-8" assert response.is_closed content = await response.aread() assert content == b"Hello, world!" assert response.content == b"Hello, world!" assert response.is_closed @pytest.mark.anyio async def test_empty_aread(): response = httpx.Response(200) assert response.status_code == 200 assert response.text == "" assert response.encoding == "utf-8" assert response.is_closed content = await response.aread() assert content == b"" assert response.content == b"" assert response.is_closed def test_iter_raw(): response = httpx.Response( 200, content=streaming_body(), ) raw = b"" for part in response.iter_raw(): raw += part assert raw == b"Hello, world!" def test_iter_raw_with_chunksize(): response = httpx.Response(200, content=streaming_body()) parts = list(response.iter_raw(chunk_size=5)) assert parts == [b"Hello", b", wor", b"ld!"] response = httpx.Response(200, content=streaming_body()) parts = list(response.iter_raw(chunk_size=7)) assert parts == [b"Hello, ", b"world!"] response = httpx.Response(200, content=streaming_body()) parts = list(response.iter_raw(chunk_size=13)) assert parts == [b"Hello, world!"] response = httpx.Response(200, content=streaming_body()) parts = list(response.iter_raw(chunk_size=20)) assert parts == [b"Hello, world!"] def test_iter_raw_doesnt_return_empty_chunks(): def streaming_body_with_empty_chunks() -> typing.Iterator[bytes]: yield b"Hello, " yield b"" yield b"world!" yield b"" response = httpx.Response(200, content=streaming_body_with_empty_chunks()) parts = list(response.iter_raw()) assert parts == [b"Hello, ", b"world!"] def test_iter_raw_on_iterable(): response = httpx.Response( 200, content=StreamingBody(), ) raw = b"" for part in response.iter_raw(): raw += part assert raw == b"Hello, world!" def test_iter_raw_on_async(): response = httpx.Response( 200, content=async_streaming_body(), ) with pytest.raises(RuntimeError): list(response.iter_raw()) def test_close_on_async(): response = httpx.Response( 200, content=async_streaming_body(), ) with pytest.raises(RuntimeError): response.close() def test_iter_raw_increments_updates_counter(): response = httpx.Response(200, content=streaming_body()) num_downloaded = response.num_bytes_downloaded for part in response.iter_raw(): assert len(part) == (response.num_bytes_downloaded - num_downloaded) num_downloaded = response.num_bytes_downloaded @pytest.mark.anyio async def test_aiter_raw(): response = httpx.Response(200, content=async_streaming_body()) raw = b"" async for part in response.aiter_raw(): raw += part assert raw == b"Hello, world!" @pytest.mark.anyio async def test_aiter_raw_with_chunksize(): response = httpx.Response(200, content=async_streaming_body()) parts = [part async for part in response.aiter_raw(chunk_size=5)] assert parts == [b"Hello", b", wor", b"ld!"] response = httpx.Response(200, content=async_streaming_body()) parts = [part async for part in response.aiter_raw(chunk_size=13)] assert parts == [b"Hello, world!"] response = httpx.Response(200, content=async_streaming_body()) parts = [part async for part in response.aiter_raw(chunk_size=20)] assert parts == [b"Hello, world!"] @pytest.mark.anyio async def test_aiter_raw_on_sync(): response = httpx.Response( 200, content=streaming_body(), ) with pytest.raises(RuntimeError): [part async for part in response.aiter_raw()] @pytest.mark.anyio async def test_aclose_on_sync(): response = httpx.Response( 200, content=streaming_body(), ) with pytest.raises(RuntimeError): await response.aclose() @pytest.mark.anyio async def test_aiter_raw_increments_updates_counter(): response = httpx.Response(200, content=async_streaming_body()) num_downloaded = response.num_bytes_downloaded async for part in response.aiter_raw(): assert len(part) == (response.num_bytes_downloaded - num_downloaded) num_downloaded = response.num_bytes_downloaded def test_iter_bytes(): response = httpx.Response(200, content=b"Hello, world!") content = b"" for part in response.iter_bytes(): content += part assert content == b"Hello, world!" def test_iter_bytes_with_chunk_size(): response = httpx.Response(200, content=streaming_body()) parts = list(response.iter_bytes(chunk_size=5)) assert parts == [b"Hello", b", wor", b"ld!"] response = httpx.Response(200, content=streaming_body()) parts = list(response.iter_bytes(chunk_size=13)) assert parts == [b"Hello, world!"] response = httpx.Response(200, content=streaming_body()) parts = list(response.iter_bytes(chunk_size=20)) assert parts == [b"Hello, world!"] def test_iter_bytes_with_empty_response(): response = httpx.Response(200, content=b"") parts = list(response.iter_bytes()) assert parts == [] def test_iter_bytes_doesnt_return_empty_chunks(): def streaming_body_with_empty_chunks() -> typing.Iterator[bytes]: yield b"Hello, " yield b"" yield b"world!" yield b"" response = httpx.Response(200, content=streaming_body_with_empty_chunks()) parts = list(response.iter_bytes()) assert parts == [b"Hello, ", b"world!"] @pytest.mark.anyio async def test_aiter_bytes(): response = httpx.Response( 200, content=b"Hello, world!", ) content = b"" async for part in response.aiter_bytes(): content += part assert content == b"Hello, world!" @pytest.mark.anyio async def test_aiter_bytes_with_chunk_size(): response = httpx.Response(200, content=async_streaming_body()) parts = [part async for part in response.aiter_bytes(chunk_size=5)] assert parts == [b"Hello", b", wor", b"ld!"] response = httpx.Response(200, content=async_streaming_body()) parts = [part async for part in response.aiter_bytes(chunk_size=13)] assert parts == [b"Hello, world!"] response = httpx.Response(200, content=async_streaming_body()) parts = [part async for part in response.aiter_bytes(chunk_size=20)] assert parts == [b"Hello, world!"] def test_iter_text(): response = httpx.Response( 200, content=b"Hello, world!", ) content = "" for part in response.iter_text(): content += part assert content == "Hello, world!" def test_iter_text_with_chunk_size(): response = httpx.Response(200, content=b"Hello, world!") parts = list(response.iter_text(chunk_size=5)) assert parts == ["Hello", ", wor", "ld!"] response = httpx.Response(200, content=b"Hello, world!!") parts = list(response.iter_text(chunk_size=7)) assert parts == ["Hello, ", "world!!"] response = httpx.Response(200, content=b"Hello, world!") parts = list(response.iter_text(chunk_size=7)) assert parts == ["Hello, ", "world!"] response = httpx.Response(200, content=b"Hello, world!") parts = list(response.iter_text(chunk_size=13)) assert parts == ["Hello, world!"] response = httpx.Response(200, content=b"Hello, world!") parts = list(response.iter_text(chunk_size=20)) assert parts == ["Hello, world!"] @pytest.mark.anyio async def test_aiter_text(): response = httpx.Response( 200, content=b"Hello, world!", ) content = "" async for part in response.aiter_text(): content += part assert content == "Hello, world!" @pytest.mark.anyio async def test_aiter_text_with_chunk_size(): response = httpx.Response(200, content=b"Hello, world!") parts = [part async for part in response.aiter_text(chunk_size=5)] assert parts == ["Hello", ", wor", "ld!"] response = httpx.Response(200, content=b"Hello, world!") parts = [part async for part in response.aiter_text(chunk_size=13)] assert parts == ["Hello, world!"] response = httpx.Response(200, content=b"Hello, world!") parts = [part async for part in response.aiter_text(chunk_size=20)] assert parts == ["Hello, world!"] def test_iter_lines(): response = httpx.Response( 200, content=b"Hello,\nworld!", ) content = list(response.iter_lines()) assert content == ["Hello,", "world!"] @pytest.mark.anyio async def test_aiter_lines(): response = httpx.Response( 200, content=b"Hello,\nworld!", ) content = [] async for line in response.aiter_lines(): content.append(line) assert content == ["Hello,", "world!"] def test_sync_streaming_response(): response = httpx.Response( 200, content=streaming_body(), ) assert response.status_code == 200 assert not response.is_closed content = response.read() assert content == b"Hello, world!" assert response.content == b"Hello, world!" assert response.is_closed @pytest.mark.anyio async def test_async_streaming_response(): response = httpx.Response( 200, content=async_streaming_body(), ) assert response.status_code == 200 assert not response.is_closed content = await response.aread() assert content == b"Hello, world!" assert response.content == b"Hello, world!" assert response.is_closed def test_cannot_read_after_stream_consumed(): response = httpx.Response( 200, content=streaming_body(), ) content = b"" for part in response.iter_bytes(): content += part with pytest.raises(httpx.StreamConsumed): response.read() @pytest.mark.anyio async def test_cannot_aread_after_stream_consumed(): response = httpx.Response( 200, content=async_streaming_body(), ) content = b"" async for part in response.aiter_bytes(): content += part with pytest.raises(httpx.StreamConsumed): await response.aread() def test_cannot_read_after_response_closed(): response = httpx.Response( 200, content=streaming_body(), ) response.close() with pytest.raises(httpx.StreamClosed): response.read() @pytest.mark.anyio async def test_cannot_aread_after_response_closed(): response = httpx.Response( 200, content=async_streaming_body(), ) await response.aclose() with pytest.raises(httpx.StreamClosed): await response.aread() @pytest.mark.anyio async def test_elapsed_not_available_until_closed(): response = httpx.Response( 200, content=async_streaming_body(), ) with pytest.raises(RuntimeError): response.elapsed # noqa: B018 def test_unknown_status_code(): response = httpx.Response( 600, ) assert response.status_code == 600 assert response.reason_phrase == "" assert response.text == "" def test_json_with_specified_encoding(): data = {"greeting": "hello", "recipient": "world"} content = json.dumps(data).encode("utf-16") headers = {"Content-Type": "application/json, charset=utf-16"} response = httpx.Response( 200, content=content, headers=headers, ) assert response.json() == data def test_json_with_options(): data = {"greeting": "hello", "recipient": "world", "amount": 1} content = json.dumps(data).encode("utf-16") headers = {"Content-Type": "application/json, charset=utf-16"} response = httpx.Response( 200, content=content, headers=headers, ) assert response.json(parse_int=str)["amount"] == "1" @pytest.mark.parametrize( "encoding", [ "utf-8", "utf-8-sig", "utf-16", "utf-16-be", "utf-16-le", "utf-32", "utf-32-be", "utf-32-le", ], ) def test_json_without_specified_charset(encoding): data = {"greeting": "hello", "recipient": "world"} content = json.dumps(data).encode(encoding) headers = {"Content-Type": "application/json"} response = httpx.Response( 200, content=content, headers=headers, ) assert response.json() == data @pytest.mark.parametrize( "encoding", [ "utf-8", "utf-8-sig", "utf-16", "utf-16-be", "utf-16-le", "utf-32", "utf-32-be", "utf-32-le", ], ) def test_json_with_specified_charset(encoding): data = {"greeting": "hello", "recipient": "world"} content = json.dumps(data).encode(encoding) headers = {"Content-Type": f"application/json; charset={encoding}"} response = httpx.Response( 200, content=content, headers=headers, ) assert response.json() == data @pytest.mark.parametrize( "headers, expected", [ ( {"Link": "; rel='preload'"}, {"preload": {"rel": "preload", "url": "https://example.com"}}, ), ( {"Link": '; rel="hub", ; rel="self"'}, { "hub": {"url": "/hub", "rel": "hub"}, "self": {"url": "/resource", "rel": "self"}, }, ), ], ) def test_link_headers(headers, expected): response = httpx.Response( 200, content=None, headers=headers, ) assert response.links == expected @pytest.mark.parametrize("header_value", (b"deflate", b"gzip", b"br")) def test_decode_error_with_request(header_value): headers = [(b"Content-Encoding", header_value)] broken_compressed_body = b"xxxxxxxxxxxxxx" with pytest.raises(httpx.DecodingError): httpx.Response( 200, headers=headers, content=broken_compressed_body, ) with pytest.raises(httpx.DecodingError): httpx.Response( 200, headers=headers, content=broken_compressed_body, request=httpx.Request("GET", "https://www.example.org/"), ) @pytest.mark.parametrize("header_value", (b"deflate", b"gzip", b"br")) def test_value_error_without_request(header_value): headers = [(b"Content-Encoding", header_value)] broken_compressed_body = b"xxxxxxxxxxxxxx" with pytest.raises(httpx.DecodingError): httpx.Response(200, headers=headers, content=broken_compressed_body) def test_response_with_unset_request(): response = httpx.Response(200, content=b"Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Hello, world!" assert not response.is_error def test_set_request_after_init(): response = httpx.Response(200, content=b"Hello, world!") response.request = httpx.Request("GET", "https://www.example.org") assert response.request.method == "GET" assert response.request.url == "https://www.example.org" def test_cannot_access_unset_request(): response = httpx.Response(200, content=b"Hello, world!") with pytest.raises(RuntimeError): response.request # noqa: B018 def test_generator_with_transfer_encoding_header(): def content() -> typing.Iterator[bytes]: yield b"test 123" # pragma: no cover response = httpx.Response(200, content=content()) assert response.headers == {"Transfer-Encoding": "chunked"} def test_generator_with_content_length_header(): def content() -> typing.Iterator[bytes]: yield b"test 123" # pragma: no cover headers = {"Content-Length": "8"} response = httpx.Response(200, content=content(), headers=headers) assert response.headers == {"Content-Length": "8"} def test_response_picklable(): response = httpx.Response( 200, content=b"Hello, world!", request=httpx.Request("GET", "https://example.org"), ) pickle_response = pickle.loads(pickle.dumps(response)) assert pickle_response.is_closed is True assert pickle_response.is_stream_consumed is True assert pickle_response.next_request is None assert pickle_response.stream is not None assert pickle_response.content == b"Hello, world!" assert pickle_response.status_code == 200 assert pickle_response.request.url == response.request.url assert pickle_response.extensions == {} assert pickle_response.history == [] @pytest.mark.anyio async def test_response_async_streaming_picklable(): response = httpx.Response(200, content=async_streaming_body()) pickle_response = pickle.loads(pickle.dumps(response)) with pytest.raises(httpx.ResponseNotRead): pickle_response.content # noqa: B018 with pytest.raises(httpx.StreamClosed): await pickle_response.aread() assert pickle_response.is_stream_consumed is False assert pickle_response.num_bytes_downloaded == 0 assert pickle_response.headers == {"Transfer-Encoding": "chunked"} response = httpx.Response(200, content=async_streaming_body()) await response.aread() pickle_response = pickle.loads(pickle.dumps(response)) assert pickle_response.is_stream_consumed is True assert pickle_response.content == b"Hello, world!" assert pickle_response.num_bytes_downloaded == 13 def test_response_decode_text_using_autodetect(): # Ensure that a 'default_encoding="autodetect"' on the response allows for # encoding autodetection to be used when no "Content-Type: text/plain; charset=..." # info is present. # # Here we have some french text encoded with ISO-8859-1, rather than UTF-8. text = ( "Non-seulement Despréaux ne se trompait pas, mais de tous les écrivains " "que la France a produits, sans excepter Voltaire lui-même, imprégné de " "l'esprit anglais par son séjour à Londres, c'est incontestablement " "Molière ou Poquelin qui reproduit avec l'exactitude la plus vive et la " "plus complète le fond du génie français." ) content = text.encode("ISO-8859-1") response = httpx.Response(200, content=content, default_encoding=autodetect) assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.encoding == "ISO-8859-1" assert response.text == text def test_response_decode_text_using_explicit_encoding(): # Ensure that a 'default_encoding="..."' on the response is used for text decoding # when no "Content-Type: text/plain; charset=..."" info is present. # # Here we have some french text encoded with Windows-1252, rather than UTF-8. # https://en.wikipedia.org/wiki/Windows-1252 text = ( "Non-seulement Despréaux ne se trompait pas, mais de tous les écrivains " "que la France a produits, sans excepter Voltaire lui-même, imprégné de " "l'esprit anglais par son séjour à Londres, c'est incontestablement " "Molière ou Poquelin qui reproduit avec l'exactitude la plus vive et la " "plus complète le fond du génie français." ) content = text.encode("cp1252") response = httpx.Response(200, content=content, default_encoding="cp1252") assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.encoding == "cp1252" assert response.text == text httpx-0.26.0/tests/models/test_url.py000066400000000000000000000613301454054354600176230ustar00rootroot00000000000000import pytest import httpx # Tests for `httpx.URL` instantiation and property accessors. def test_basic_url(): url = httpx.URL("https://www.example.com/") assert url.scheme == "https" assert url.userinfo == b"" assert url.netloc == b"www.example.com" assert url.host == "www.example.com" assert url.port is None assert url.path == "/" assert url.query == b"" assert url.fragment == "" assert str(url) == "https://www.example.com/" assert repr(url) == "URL('https://www.example.com/')" def test_complete_url(): url = httpx.URL("https://example.org:123/path/to/somewhere?abc=123#anchor") assert url.scheme == "https" assert url.host == "example.org" assert url.port == 123 assert url.path == "/path/to/somewhere" assert url.query == b"abc=123" assert url.raw_path == b"/path/to/somewhere?abc=123" assert url.fragment == "anchor" assert str(url) == "https://example.org:123/path/to/somewhere?abc=123#anchor" assert ( repr(url) == "URL('https://example.org:123/path/to/somewhere?abc=123#anchor')" ) def test_url_with_empty_query(): """ URLs with and without a trailing `?` but an empty query component should preserve the information on the raw path. """ url = httpx.URL("https://www.example.com/path") assert url.path == "/path" assert url.query == b"" assert url.raw_path == b"/path" url = httpx.URL("https://www.example.com/path?") assert url.path == "/path" assert url.query == b"" assert url.raw_path == b"/path?" def test_url_no_scheme(): url = httpx.URL("://example.com") assert url.scheme == "" assert url.host == "example.com" assert url.path == "/" def test_url_no_authority(): url = httpx.URL("http://") assert url.scheme == "http" assert url.host == "" assert url.path == "/" # Tests for percent encoding across path, query, and fragment... @pytest.mark.parametrize( "url,raw_path,path,query,fragment", [ # URL with unescaped chars in path. ( "https://example.com/!$&'()*+,;= abc ABC 123 :/[]@", b"/!$&'()*+,;=%20abc%20ABC%20123%20:/[]@", "/!$&'()*+,;= abc ABC 123 :/[]@", b"", "", ), # URL with escaped chars in path. ( "https://example.com/!$&'()*+,;=%20abc%20ABC%20123%20:/[]@", b"/!$&'()*+,;=%20abc%20ABC%20123%20:/[]@", "/!$&'()*+,;= abc ABC 123 :/[]@", b"", "", ), # URL with mix of unescaped and escaped chars in path. # WARNING: This has the incorrect behaviour, adding the test as an interim step. ( "https://example.com/ %61%62%63", b"/%20%61%62%63", "/ abc", b"", "", ), # URL with unescaped chars in query. ( "https://example.com/?!$&'()*+,;= abc ABC 123 :/[]@?", b"/?!$&'()*+,;=%20abc%20ABC%20123%20:/[]@?", "/", b"!$&'()*+,;=%20abc%20ABC%20123%20:/[]@?", "", ), # URL with escaped chars in query. ( "https://example.com/?!$&%27()*+,;=%20abc%20ABC%20123%20:%2F[]@?", b"/?!$&%27()*+,;=%20abc%20ABC%20123%20:%2F[]@?", "/", b"!$&%27()*+,;=%20abc%20ABC%20123%20:%2F[]@?", "", ), # URL with mix of unescaped and escaped chars in query. ( "https://example.com/?%20%97%98%99", b"/?%20%97%98%99", "/", b"%20%97%98%99", "", ), # URL encoding characters in fragment. ( "https://example.com/#!$&'()*+,;= abc ABC 123 :/[]@?#", b"/", "/", b"", "!$&'()*+,;= abc ABC 123 :/[]@?#", ), ], ) def test_path_query_fragment(url, raw_path, path, query, fragment): url = httpx.URL(url) assert url.raw_path == raw_path assert url.path == path assert url.query == query assert url.fragment == fragment def test_url_query_encoding(): """ URL query parameters should use '%20' for encoding spaces, and should treat '/' as a safe character. This behaviour differs across clients, but we're matching browser behaviour here. See https://github.com/encode/httpx/issues/2536 and https://github.com/encode/httpx/discussions/2460 """ url = httpx.URL("https://www.example.com/?a=b c&d=e/f") assert url.raw_path == b"/?a=b%20c&d=e/f" url = httpx.URL("https://www.example.com/", params={"a": "b c", "d": "e/f"}) assert url.raw_path == b"/?a=b%20c&d=e%2Ff" def test_url_params(): url = httpx.URL("https://example.org:123/path/to/somewhere", params={"a": "123"}) assert str(url) == "https://example.org:123/path/to/somewhere?a=123" assert url.params == httpx.QueryParams({"a": "123"}) url = httpx.URL( "https://example.org:123/path/to/somewhere?b=456", params={"a": "123"} ) assert str(url) == "https://example.org:123/path/to/somewhere?a=123" assert url.params == httpx.QueryParams({"a": "123"}) # Tests for username and password @pytest.mark.parametrize( "url,userinfo,username,password", [ # username and password in URL. ( "https://username:password@example.com", b"username:password", "username", "password", ), # username and password in URL with percent escape sequences. ( "https://username%40gmail.com:pa%20ssword@example.com", b"username%40gmail.com:pa%20ssword", "username@gmail.com", "pa ssword", ), ( "https://user%20name:p%40ssword@example.com", b"user%20name:p%40ssword", "user name", "p@ssword", ), # username and password in URL without percent escape sequences. ( "https://username@gmail.com:pa ssword@example.com", b"username%40gmail.com:pa%20ssword", "username@gmail.com", "pa ssword", ), ( "https://user name:p@ssword@example.com", b"user%20name:p%40ssword", "user name", "p@ssword", ), ], ) def test_url_username_and_password(url, userinfo, username, password): url = httpx.URL(url) assert url.userinfo == userinfo assert url.username == username assert url.password == password # Tests for different host types def test_url_valid_host(): url = httpx.URL("https://example.com/") assert url.host == "example.com" def test_url_normalized_host(): url = httpx.URL("https://EXAMPLE.com/") assert url.host == "example.com" def test_url_ipv4_like_host(): """rare host names used to quality as IPv4""" url = httpx.URL("https://023b76x43144/") assert url.host == "023b76x43144" # Tests for different port types def test_url_valid_port(): url = httpx.URL("https://example.com:123/") assert url.port == 123 def test_url_normalized_port(): # If the port matches the scheme default it is normalized to None. url = httpx.URL("https://example.com:443/") assert url.port is None def test_url_invalid_port(): with pytest.raises(httpx.InvalidURL) as exc: httpx.URL("https://example.com:abc/") assert str(exc.value) == "Invalid port: 'abc'" # Tests for path handling def test_url_normalized_path(): url = httpx.URL("https://example.com/abc/def/../ghi/./jkl") assert url.path == "/abc/ghi/jkl" def test_url_escaped_path(): url = httpx.URL("https://example.com/ /🌟/") assert url.raw_path == b"/%20/%F0%9F%8C%9F/" def test_url_leading_dot_prefix_on_absolute_url(): url = httpx.URL("https://example.com/../abc") assert url.path == "/abc" def test_url_leading_dot_prefix_on_relative_url(): url = httpx.URL("../abc") assert url.path == "../abc" # Tests for optional percent encoding def test_param_requires_encoding(): url = httpx.URL("http://webservice", params={"u": "with spaces"}) assert str(url) == "http://webservice?u=with%20spaces" def test_param_does_not_require_encoding(): url = httpx.URL("http://webservice", params={"u": "with%20spaces"}) assert str(url) == "http://webservice?u=with%20spaces" def test_param_with_existing_escape_requires_encoding(): url = httpx.URL("http://webservice", params={"u": "http://example.com?q=foo%2Fa"}) assert str(url) == "http://webservice?u=http%3A%2F%2Fexample.com%3Fq%3Dfoo%252Fa" # Tests for invalid URLs def test_url_invalid_hostname(): """ Ensure that invalid URLs raise an `httpx.InvalidURL` exception. """ with pytest.raises(httpx.InvalidURL): httpx.URL("https://😇/") def test_url_excessively_long_url(): with pytest.raises(httpx.InvalidURL) as exc: httpx.URL("https://www.example.com/" + "x" * 100_000) assert str(exc.value) == "URL too long" def test_url_excessively_long_component(): with pytest.raises(httpx.InvalidURL) as exc: httpx.URL("https://www.example.com", path="/" + "x" * 100_000) assert str(exc.value) == "URL component 'path' too long" def test_url_non_printing_character_in_url(): with pytest.raises(httpx.InvalidURL) as exc: httpx.URL("https://www.example.com/\n") assert str(exc.value) == "Invalid non-printable ASCII character in URL" def test_url_non_printing_character_in_component(): with pytest.raises(httpx.InvalidURL) as exc: httpx.URL("https://www.example.com", path="/\n") assert ( str(exc.value) == "Invalid non-printable ASCII character in URL component 'path'" ) # Test for url components def test_url_with_components(): url = httpx.URL(scheme="https", host="www.example.com", path="/") assert url.scheme == "https" assert url.userinfo == b"" assert url.host == "www.example.com" assert url.port is None assert url.path == "/" assert url.query == b"" assert url.fragment == "" assert str(url) == "https://www.example.com/" def test_urlparse_with_invalid_component(): with pytest.raises(TypeError) as exc: httpx.URL(scheme="https", host="www.example.com", incorrect="/") assert str(exc.value) == "'incorrect' is an invalid keyword argument for URL()" def test_urlparse_with_invalid_scheme(): with pytest.raises(httpx.InvalidURL) as exc: httpx.URL(scheme="~", host="www.example.com", path="/") assert str(exc.value) == "Invalid URL component 'scheme'" def test_urlparse_with_invalid_path(): with pytest.raises(httpx.InvalidURL) as exc: httpx.URL(scheme="https", host="www.example.com", path="abc") assert str(exc.value) == "For absolute URLs, path must be empty or begin with '/'" with pytest.raises(httpx.InvalidURL) as exc: httpx.URL(path="//abc") assert ( str(exc.value) == "URLs with no authority component cannot have a path starting with '//'" ) with pytest.raises(httpx.InvalidURL) as exc: httpx.URL(path=":abc") assert ( str(exc.value) == "URLs with no scheme component cannot have a path starting with ':'" ) def test_url_with_relative_path(): # This path would be invalid for an absolute URL, but is valid as a relative URL. url = httpx.URL(path="abc") assert url.path == "abc" # Tests for `httpx.URL` python built-in operators. def test_url_eq_str(): """ Ensure that `httpx.URL` supports the equality operator. """ url = httpx.URL("https://example.org:123/path/to/somewhere?abc=123#anchor") assert url == "https://example.org:123/path/to/somewhere?abc=123#anchor" assert str(url) == url def test_url_set(): """ Ensure that `httpx.URL` instances can be used in sets. """ urls = ( httpx.URL("http://example.org:123/path/to/somewhere"), httpx.URL("http://example.org:123/path/to/somewhere/else"), ) url_set = set(urls) assert all(url in urls for url in url_set) # Tests for TypeErrors when instantiating `httpx.URL`. def test_url_invalid_type(): """ Ensure that invalid types on `httpx.URL()` raise a `TypeError`. """ class ExternalURLClass: # representing external URL class pass with pytest.raises(TypeError): httpx.URL(ExternalURLClass()) # type: ignore def test_url_with_invalid_component(): with pytest.raises(TypeError) as exc: httpx.URL(scheme="https", host="www.example.com", incorrect="/") assert str(exc.value) == "'incorrect' is an invalid keyword argument for URL()" # Tests for `URL.join()`. def test_url_join(): """ Some basic URL joining tests. """ url = httpx.URL("https://example.org:123/path/to/somewhere") assert url.join("/somewhere-else") == "https://example.org:123/somewhere-else" assert ( url.join("somewhere-else") == "https://example.org:123/path/to/somewhere-else" ) assert ( url.join("../somewhere-else") == "https://example.org:123/path/somewhere-else" ) assert url.join("../../somewhere-else") == "https://example.org:123/somewhere-else" def test_relative_url_join(): url = httpx.URL("/path/to/somewhere") assert url.join("/somewhere-else") == "/somewhere-else" assert url.join("somewhere-else") == "/path/to/somewhere-else" assert url.join("../somewhere-else") == "/path/somewhere-else" assert url.join("../../somewhere-else") == "/somewhere-else" def test_url_join_rfc3986(): """ URL joining tests, as-per reference examples in RFC 3986. https://tools.ietf.org/html/rfc3986#section-5.4 """ url = httpx.URL("http://example.com/b/c/d;p?q") assert url.join("g") == "http://example.com/b/c/g" assert url.join("./g") == "http://example.com/b/c/g" assert url.join("g/") == "http://example.com/b/c/g/" assert url.join("/g") == "http://example.com/g" assert url.join("//g") == "http://g" assert url.join("?y") == "http://example.com/b/c/d;p?y" assert url.join("g?y") == "http://example.com/b/c/g?y" assert url.join("#s") == "http://example.com/b/c/d;p?q#s" assert url.join("g#s") == "http://example.com/b/c/g#s" assert url.join("g?y#s") == "http://example.com/b/c/g?y#s" assert url.join(";x") == "http://example.com/b/c/;x" assert url.join("g;x") == "http://example.com/b/c/g;x" assert url.join("g;x?y#s") == "http://example.com/b/c/g;x?y#s" assert url.join("") == "http://example.com/b/c/d;p?q" assert url.join(".") == "http://example.com/b/c/" assert url.join("./") == "http://example.com/b/c/" assert url.join("..") == "http://example.com/b/" assert url.join("../") == "http://example.com/b/" assert url.join("../g") == "http://example.com/b/g" assert url.join("../..") == "http://example.com/" assert url.join("../../") == "http://example.com/" assert url.join("../../g") == "http://example.com/g" assert url.join("../../../g") == "http://example.com/g" assert url.join("../../../../g") == "http://example.com/g" assert url.join("/./g") == "http://example.com/g" assert url.join("/../g") == "http://example.com/g" assert url.join("g.") == "http://example.com/b/c/g." assert url.join(".g") == "http://example.com/b/c/.g" assert url.join("g..") == "http://example.com/b/c/g.." assert url.join("..g") == "http://example.com/b/c/..g" assert url.join("./../g") == "http://example.com/b/g" assert url.join("./g/.") == "http://example.com/b/c/g/" assert url.join("g/./h") == "http://example.com/b/c/g/h" assert url.join("g/../h") == "http://example.com/b/c/h" assert url.join("g;x=1/./y") == "http://example.com/b/c/g;x=1/y" assert url.join("g;x=1/../y") == "http://example.com/b/c/y" assert url.join("g?y/./x") == "http://example.com/b/c/g?y/./x" assert url.join("g?y/../x") == "http://example.com/b/c/g?y/../x" assert url.join("g#s/./x") == "http://example.com/b/c/g#s/./x" assert url.join("g#s/../x") == "http://example.com/b/c/g#s/../x" def test_resolution_error_1833(): """ See https://github.com/encode/httpx/issues/1833 """ url = httpx.URL("https://example.com/?[]") assert url.join("/") == "https://example.com/" # Tests for `URL.copy_with()`. def test_copy_with(): url = httpx.URL("https://www.example.com/") assert str(url) == "https://www.example.com/" url = url.copy_with() assert str(url) == "https://www.example.com/" url = url.copy_with(scheme="http") assert str(url) == "http://www.example.com/" url = url.copy_with(netloc=b"example.com") assert str(url) == "http://example.com/" url = url.copy_with(path="/abc") assert str(url) == "http://example.com/abc" def test_url_copywith_authority_subcomponents(): copy_with_kwargs = { "username": "username", "password": "password", "port": 444, "host": "example.net", } url = httpx.URL("https://example.org") new = url.copy_with(**copy_with_kwargs) assert str(new) == "https://username:password@example.net:444" def test_url_copywith_netloc(): copy_with_kwargs = { "netloc": b"example.net:444", } url = httpx.URL("https://example.org") new = url.copy_with(**copy_with_kwargs) assert str(new) == "https://example.net:444" def test_url_copywith_userinfo_subcomponents(): copy_with_kwargs = { "username": "tom@example.org", "password": "abc123@ %", } url = httpx.URL("https://example.org") new = url.copy_with(**copy_with_kwargs) assert str(new) == "https://tom%40example.org:abc123%40%20%25@example.org" assert new.username == "tom@example.org" assert new.password == "abc123@ %" assert new.userinfo == b"tom%40example.org:abc123%40%20%25" def test_url_copywith_invalid_component(): url = httpx.URL("https://example.org") with pytest.raises(TypeError): url.copy_with(pathh="/incorrect-spelling") with pytest.raises(TypeError): url.copy_with(userinfo="should be bytes") def test_url_copywith_urlencoded_path(): url = httpx.URL("https://example.org") url = url.copy_with(path="/path to somewhere") assert url.path == "/path to somewhere" assert url.query == b"" assert url.raw_path == b"/path%20to%20somewhere" def test_url_copywith_query(): url = httpx.URL("https://example.org") url = url.copy_with(query=b"a=123") assert url.path == "/" assert url.query == b"a=123" assert url.raw_path == b"/?a=123" def test_url_copywith_raw_path(): url = httpx.URL("https://example.org") url = url.copy_with(raw_path=b"/some/path") assert url.path == "/some/path" assert url.query == b"" assert url.raw_path == b"/some/path" url = httpx.URL("https://example.org") url = url.copy_with(raw_path=b"/some/path?") assert url.path == "/some/path" assert url.query == b"" assert url.raw_path == b"/some/path?" url = httpx.URL("https://example.org") url = url.copy_with(raw_path=b"/some/path?a=123") assert url.path == "/some/path" assert url.query == b"a=123" assert url.raw_path == b"/some/path?a=123" def test_url_copywith_security(): """ Prevent unexpected changes on URL after calling copy_with (CVE-2021-41945) """ with pytest.raises(httpx.InvalidURL): httpx.URL("https://u:p@[invalid!]//evilHost/path?t=w#tw") url = httpx.URL("https://example.com/path?t=w#tw") bad = "https://xxxx:xxxx@xxxxxxx/xxxxx/xxx?x=x#xxxxx" with pytest.raises(httpx.InvalidURL): url.copy_with(scheme=bad) # Tests for copy-modifying-parameters methods. # # `URL.copy_set_param()` # `URL.copy_add_param()` # `URL.copy_remove_param()` # `URL.copy_merge_params()` def test_url_set_param_manipulation(): """ Some basic URL query parameter manipulation. """ url = httpx.URL("https://example.org:123/?a=123") assert url.copy_set_param("a", "456") == "https://example.org:123/?a=456" def test_url_add_param_manipulation(): """ Some basic URL query parameter manipulation. """ url = httpx.URL("https://example.org:123/?a=123") assert url.copy_add_param("a", "456") == "https://example.org:123/?a=123&a=456" def test_url_remove_param_manipulation(): """ Some basic URL query parameter manipulation. """ url = httpx.URL("https://example.org:123/?a=123") assert url.copy_remove_param("a") == "https://example.org:123/" def test_url_merge_params_manipulation(): """ Some basic URL query parameter manipulation. """ url = httpx.URL("https://example.org:123/?a=123") assert url.copy_merge_params({"b": "456"}) == "https://example.org:123/?a=123&b=456" # Tests for IDNA hostname support. @pytest.mark.parametrize( "given,idna,host,raw_host,scheme,port", [ ( "http://中国.icom.museum:80/", "http://xn--fiqs8s.icom.museum:80/", "中国.icom.museum", b"xn--fiqs8s.icom.museum", "http", None, ), ( "http://Königsgäßchen.de", "http://xn--knigsgchen-b4a3dun.de", "königsgäßchen.de", b"xn--knigsgchen-b4a3dun.de", "http", None, ), ( "https://faß.de", "https://xn--fa-hia.de", "faß.de", b"xn--fa-hia.de", "https", None, ), ( "https://βόλος.com:443", "https://xn--nxasmm1c.com:443", "βόλος.com", b"xn--nxasmm1c.com", "https", None, ), ( "http://ශ්‍රී.com:444", "http://xn--10cl1a0b660p.com:444", "ශ්‍රී.com", b"xn--10cl1a0b660p.com", "http", 444, ), ( "https://نامه‌ای.com:4433", "https://xn--mgba3gch31f060k.com:4433", "نامه‌ای.com", b"xn--mgba3gch31f060k.com", "https", 4433, ), ], ids=[ "http_with_port", "unicode_tr46_compat", "https_without_port", "https_with_port", "http_with_custom_port", "https_with_custom_port", ], ) def test_idna_url(given, idna, host, raw_host, scheme, port): url = httpx.URL(given) assert url == httpx.URL(idna) assert url.host == host assert url.raw_host == raw_host assert url.scheme == scheme assert url.port == port def test_url_unescaped_idna_host(): url = httpx.URL("https://中国.icom.museum/") assert url.raw_host == b"xn--fiqs8s.icom.museum" def test_url_escaped_idna_host(): url = httpx.URL("https://xn--fiqs8s.icom.museum/") assert url.raw_host == b"xn--fiqs8s.icom.museum" def test_url_invalid_idna_host(): with pytest.raises(httpx.InvalidURL) as exc: httpx.URL("https://☃.com/") assert str(exc.value) == "Invalid IDNA hostname: '☃.com'" # Tests for IPv4 hostname support. def test_url_valid_ipv4(): url = httpx.URL("https://1.2.3.4/") assert url.host == "1.2.3.4" def test_url_invalid_ipv4(): with pytest.raises(httpx.InvalidURL) as exc: httpx.URL("https://999.999.999.999/") assert str(exc.value) == "Invalid IPv4 address: '999.999.999.999'" # Tests for IPv6 hostname support. def test_ipv6_url(): url = httpx.URL("http://[::ffff:192.168.0.1]:5678/") assert url.host == "::ffff:192.168.0.1" assert url.netloc == b"[::ffff:192.168.0.1]:5678" def test_url_valid_ipv6(): url = httpx.URL("https://[2001:db8::ff00:42:8329]/") assert url.host == "2001:db8::ff00:42:8329" def test_url_invalid_ipv6(): with pytest.raises(httpx.InvalidURL) as exc: httpx.URL("https://[2001]/") assert str(exc.value) == "Invalid IPv6 address: '[2001]'" @pytest.mark.parametrize("host", ["[::ffff:192.168.0.1]", "::ffff:192.168.0.1"]) def test_ipv6_url_from_raw_url(host): url = httpx.URL(scheme="https", host=host, port=443, path="/") assert url.host == "::ffff:192.168.0.1" assert url.netloc == b"[::ffff:192.168.0.1]" assert str(url) == "https://[::ffff:192.168.0.1]/" @pytest.mark.parametrize( "url_str", [ "http://127.0.0.1:1234", "http://example.com:1234", "http://[::ffff:127.0.0.1]:1234", ], ) @pytest.mark.parametrize("new_host", ["[::ffff:192.168.0.1]", "::ffff:192.168.0.1"]) def test_ipv6_url_copy_with_host(url_str, new_host): url = httpx.URL(url_str).copy_with(host=new_host) assert url.host == "::ffff:192.168.0.1" assert url.netloc == b"[::ffff:192.168.0.1]:1234" assert str(url) == "http://[::ffff:192.168.0.1]:1234" # Test for deprecated API def test_url_raw_compatibility(): """ Test case for the (to-be-deprecated) `url.raw` accessor. """ url = httpx.URL("https://www.example.com/path") scheme, host, port, raw_path = url.raw assert scheme == b"https" assert host == b"www.example.com" assert port is None assert raw_path == b"/path" httpx-0.26.0/tests/test_api.py000066400000000000000000000042701454054354600163070ustar00rootroot00000000000000import typing import pytest import httpx def test_get(server): response = httpx.get(server.url) assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Hello, world!" assert response.http_version == "HTTP/1.1" def test_post(server): response = httpx.post(server.url, content=b"Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" def test_post_byte_iterator(server): def data() -> typing.Iterator[bytes]: yield b"Hello" yield b", " yield b"world!" response = httpx.post(server.url, content=data()) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_post_byte_stream(server): class Data(httpx.SyncByteStream): def __iter__(self): yield b"Hello" yield b", " yield b"world!" response = httpx.post(server.url, content=Data()) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_options(server): response = httpx.options(server.url) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_head(server): response = httpx.head(server.url) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_put(server): response = httpx.put(server.url, content=b"Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" def test_patch(server): response = httpx.patch(server.url, content=b"Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" def test_delete(server): response = httpx.delete(server.url) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_stream(server): with httpx.stream("GET", server.url) as response: response.read() assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Hello, world!" assert response.http_version == "HTTP/1.1" def test_get_invalid_url(): with pytest.raises(httpx.UnsupportedProtocol): httpx.get("invalid://example.org") httpx-0.26.0/tests/test_asgi.py000066400000000000000000000162001454054354600164550ustar00rootroot00000000000000import json import pytest import httpx from httpx import ASGITransport async def hello_world(scope, receive, send): status = 200 output = b"Hello, World!" headers = [(b"content-type", "text/plain"), (b"content-length", str(len(output)))] await send({"type": "http.response.start", "status": status, "headers": headers}) await send({"type": "http.response.body", "body": output}) async def echo_path(scope, receive, send): status = 200 output = json.dumps({"path": scope["path"]}).encode("utf-8") headers = [(b"content-type", "text/plain"), (b"content-length", str(len(output)))] await send({"type": "http.response.start", "status": status, "headers": headers}) await send({"type": "http.response.body", "body": output}) async def echo_raw_path(scope, receive, send): status = 200 output = json.dumps({"raw_path": scope["raw_path"].decode("ascii")}).encode("utf-8") headers = [(b"content-type", "text/plain"), (b"content-length", str(len(output)))] await send({"type": "http.response.start", "status": status, "headers": headers}) await send({"type": "http.response.body", "body": output}) async def echo_body(scope, receive, send): status = 200 headers = [(b"content-type", "text/plain")] await send({"type": "http.response.start", "status": status, "headers": headers}) more_body = True while more_body: message = await receive() body = message.get("body", b"") more_body = message.get("more_body", False) await send({"type": "http.response.body", "body": body, "more_body": more_body}) async def echo_headers(scope, receive, send): status = 200 output = json.dumps( {"headers": [[k.decode(), v.decode()] for k, v in scope["headers"]]} ).encode("utf-8") headers = [(b"content-type", "text/plain"), (b"content-length", str(len(output)))] await send({"type": "http.response.start", "status": status, "headers": headers}) await send({"type": "http.response.body", "body": output}) async def raise_exc(scope, receive, send): raise RuntimeError() async def raise_exc_after_response(scope, receive, send): status = 200 output = b"Hello, World!" headers = [(b"content-type", "text/plain"), (b"content-length", str(len(output)))] await send({"type": "http.response.start", "status": status, "headers": headers}) await send({"type": "http.response.body", "body": output}) raise RuntimeError() @pytest.mark.anyio async def test_asgi_transport(): async with httpx.ASGITransport(app=hello_world) as transport: request = httpx.Request("GET", "http://www.example.com/") response = await transport.handle_async_request(request) await response.aread() assert response.status_code == 200 assert response.content == b"Hello, World!" @pytest.mark.anyio async def test_asgi_transport_no_body(): async with httpx.ASGITransport(app=echo_body) as transport: request = httpx.Request("GET", "http://www.example.com/") response = await transport.handle_async_request(request) await response.aread() assert response.status_code == 200 assert response.content == b"" @pytest.mark.anyio async def test_asgi(): async with httpx.AsyncClient(app=hello_world) as client: response = await client.get("http://www.example.org/") assert response.status_code == 200 assert response.text == "Hello, World!" @pytest.mark.anyio async def test_asgi_urlencoded_path(): async with httpx.AsyncClient(app=echo_path) as client: url = httpx.URL("http://www.example.org/").copy_with(path="/user@example.org") response = await client.get(url) assert response.status_code == 200 assert response.json() == {"path": "/user@example.org"} @pytest.mark.anyio async def test_asgi_raw_path(): async with httpx.AsyncClient(app=echo_raw_path) as client: url = httpx.URL("http://www.example.org/").copy_with(path="/user@example.org") response = await client.get(url) assert response.status_code == 200 assert response.json() == {"raw_path": "/user@example.org"} @pytest.mark.anyio async def test_asgi_raw_path_should_not_include_querystring_portion(): """ See https://github.com/encode/httpx/issues/2810 """ async with httpx.AsyncClient(app=echo_raw_path) as client: url = httpx.URL("http://www.example.org/path?query") response = await client.get(url) assert response.status_code == 200 assert response.json() == {"raw_path": "/path"} @pytest.mark.anyio async def test_asgi_upload(): async with httpx.AsyncClient(app=echo_body) as client: response = await client.post("http://www.example.org/", content=b"example") assert response.status_code == 200 assert response.text == "example" @pytest.mark.anyio async def test_asgi_headers(): async with httpx.AsyncClient(app=echo_headers) as client: response = await client.get("http://www.example.org/") assert response.status_code == 200 assert response.json() == { "headers": [ ["host", "www.example.org"], ["accept", "*/*"], ["accept-encoding", "gzip, deflate, br"], ["connection", "keep-alive"], ["user-agent", f"python-httpx/{httpx.__version__}"], ] } @pytest.mark.anyio async def test_asgi_exc(): async with httpx.AsyncClient(app=raise_exc) as client: with pytest.raises(RuntimeError): await client.get("http://www.example.org/") @pytest.mark.anyio async def test_asgi_exc_after_response(): async with httpx.AsyncClient(app=raise_exc_after_response) as client: with pytest.raises(RuntimeError): await client.get("http://www.example.org/") @pytest.mark.anyio async def test_asgi_disconnect_after_response_complete(): disconnect = False async def read_body(scope, receive, send): nonlocal disconnect status = 200 headers = [(b"content-type", "text/plain")] await send( {"type": "http.response.start", "status": status, "headers": headers} ) more_body = True while more_body: message = await receive() more_body = message.get("more_body", False) await send({"type": "http.response.body", "body": b"", "more_body": False}) # The ASGI spec says of the Disconnect message: # "Sent to the application when a HTTP connection is closed or if receive is # called after a response has been sent." # So if receive() is called again, the disconnect message should be received message = await receive() disconnect = message.get("type") == "http.disconnect" async with httpx.AsyncClient(app=read_body) as client: response = await client.post("http://www.example.org/", content=b"example") assert response.status_code == 200 assert disconnect @pytest.mark.anyio async def test_asgi_exc_no_raise(): transport = ASGITransport(app=raise_exc, raise_app_exceptions=False) async with httpx.AsyncClient(transport=transport) as client: response = await client.get("http://www.example.org/") assert response.status_code == 500 httpx-0.26.0/tests/test_auth.py000066400000000000000000000116101454054354600164730ustar00rootroot00000000000000""" Unit tests for auth classes. Integration tests also exist in tests/client/test_auth.py """ from urllib.request import parse_keqv_list import pytest import httpx def test_basic_auth(): auth = httpx.BasicAuth(username="user", password="pass") request = httpx.Request("GET", "https://www.example.com") # The initial request should include a basic auth header. flow = auth.sync_auth_flow(request) request = next(flow) assert request.headers["Authorization"].startswith("Basic") # No other requests are made. response = httpx.Response(content=b"Hello, world!", status_code=200) with pytest.raises(StopIteration): flow.send(response) def test_digest_auth_with_200(): auth = httpx.DigestAuth(username="user", password="pass") request = httpx.Request("GET", "https://www.example.com") # The initial request should not include an auth header. flow = auth.sync_auth_flow(request) request = next(flow) assert "Authorization" not in request.headers # If a 200 response is returned, then no other requests are made. response = httpx.Response(content=b"Hello, world!", status_code=200) with pytest.raises(StopIteration): flow.send(response) def test_digest_auth_with_401(): auth = httpx.DigestAuth(username="user", password="pass") request = httpx.Request("GET", "https://www.example.com") # The initial request should not include an auth header. flow = auth.sync_auth_flow(request) request = next(flow) assert "Authorization" not in request.headers # If a 401 response is returned, then a digest auth request is made. headers = { "WWW-Authenticate": 'Digest realm="...", qop="auth", nonce="...", opaque="..."' } response = httpx.Response( content=b"Auth required", status_code=401, headers=headers, request=request ) request = flow.send(response) assert request.headers["Authorization"].startswith("Digest") # No other requests are made. response = httpx.Response(content=b"Hello, world!", status_code=200) with pytest.raises(StopIteration): flow.send(response) def test_digest_auth_with_401_nonce_counting(): auth = httpx.DigestAuth(username="user", password="pass") request = httpx.Request("GET", "https://www.example.com") # The initial request should not include an auth header. flow = auth.sync_auth_flow(request) request = next(flow) assert "Authorization" not in request.headers # If a 401 response is returned, then a digest auth request is made. headers = { "WWW-Authenticate": 'Digest realm="...", qop="auth", nonce="...", opaque="..."' } response = httpx.Response( content=b"Auth required", status_code=401, headers=headers, request=request ) first_request = flow.send(response) assert first_request.headers["Authorization"].startswith("Digest") # Each subsequent request contains the digest header by default... request = httpx.Request("GET", "https://www.example.com") flow = auth.sync_auth_flow(request) second_request = next(flow) assert second_request.headers["Authorization"].startswith("Digest") # ... and the client nonce count (nc) is increased first_nc = parse_keqv_list(first_request.headers["Authorization"].split(", "))["nc"] second_nc = parse_keqv_list(second_request.headers["Authorization"].split(", "))[ "nc" ] assert int(first_nc, 16) + 1 == int(second_nc, 16) # No other requests are made. response = httpx.Response(content=b"Hello, world!", status_code=200) with pytest.raises(StopIteration): flow.send(response) def set_cookies(request: httpx.Request) -> httpx.Response: headers = { "Set-Cookie": "session=.session_value...", "WWW-Authenticate": 'Digest realm="...", qop="auth", nonce="...", opaque="..."', } if request.url.path == "/auth": return httpx.Response( content=b"Auth required", status_code=401, headers=headers ) else: raise NotImplementedError() # pragma: no cover def test_digest_auth_setting_cookie_in_request(): url = "https://www.example.com/auth" client = httpx.Client(transport=httpx.MockTransport(set_cookies)) request = client.build_request("GET", url) auth = httpx.DigestAuth(username="user", password="pass") flow = auth.sync_auth_flow(request) request = next(flow) assert "Authorization" not in request.headers response = client.get(url) assert len(response.cookies) > 0 assert response.cookies["session"] == ".session_value..." request = flow.send(response) assert request.headers["Authorization"].startswith("Digest") assert request.headers["Cookie"] == "session=.session_value..." # No other requests are made. response = httpx.Response( content=b"Hello, world!", status_code=200, request=request ) with pytest.raises(StopIteration): flow.send(response) httpx-0.26.0/tests/test_config.py000066400000000000000000000147321454054354600170070ustar00rootroot00000000000000import os import ssl from pathlib import Path import certifi import pytest import httpx def test_load_ssl_config(): context = httpx.create_ssl_context() assert context.verify_mode == ssl.VerifyMode.CERT_REQUIRED assert context.check_hostname is True def test_load_ssl_config_verify_non_existing_path(): with pytest.raises(IOError): httpx.create_ssl_context(verify="/path/to/nowhere") def test_load_ssl_config_verify_existing_file(): context = httpx.create_ssl_context(verify=certifi.where()) assert context.verify_mode == ssl.VerifyMode.CERT_REQUIRED assert context.check_hostname is True @pytest.mark.parametrize("config", ("SSL_CERT_FILE", "SSL_CERT_DIR")) def test_load_ssl_config_verify_env_file( https_server, ca_cert_pem_file, config, cert_authority ): os.environ[config] = ( ca_cert_pem_file if config.endswith("_FILE") else str(Path(ca_cert_pem_file).parent) ) context = httpx.create_ssl_context(trust_env=True) cert_authority.configure_trust(context) assert context.verify_mode == ssl.VerifyMode.CERT_REQUIRED assert context.check_hostname is True assert len(context.get_ca_certs()) == 1 def test_load_ssl_config_verify_directory(): path = Path(certifi.where()).parent context = httpx.create_ssl_context(verify=str(path)) assert context.verify_mode == ssl.VerifyMode.CERT_REQUIRED assert context.check_hostname is True def test_load_ssl_config_cert_and_key(cert_pem_file, cert_private_key_file): context = httpx.create_ssl_context(cert=(cert_pem_file, cert_private_key_file)) assert context.verify_mode == ssl.VerifyMode.CERT_REQUIRED assert context.check_hostname is True @pytest.mark.parametrize("password", [b"password", "password"]) def test_load_ssl_config_cert_and_encrypted_key( cert_pem_file, cert_encrypted_private_key_file, password ): context = httpx.create_ssl_context( cert=(cert_pem_file, cert_encrypted_private_key_file, password) ) assert context.verify_mode == ssl.VerifyMode.CERT_REQUIRED assert context.check_hostname is True def test_load_ssl_config_cert_and_key_invalid_password( cert_pem_file, cert_encrypted_private_key_file ): with pytest.raises(ssl.SSLError): httpx.create_ssl_context( cert=(cert_pem_file, cert_encrypted_private_key_file, "password1") ) def test_load_ssl_config_cert_without_key_raises(cert_pem_file): with pytest.raises(ssl.SSLError): httpx.create_ssl_context(cert=cert_pem_file) def test_load_ssl_config_no_verify(): context = httpx.create_ssl_context(verify=False) assert context.verify_mode == ssl.VerifyMode.CERT_NONE assert context.check_hostname is False def test_load_ssl_context(): ssl_context = ssl.create_default_context() context = httpx.create_ssl_context(verify=ssl_context) assert context is ssl_context def test_create_ssl_context_with_get_request(server, cert_pem_file): context = httpx.create_ssl_context(verify=cert_pem_file) response = httpx.get(server.url, verify=context) assert response.status_code == 200 def test_limits_repr(): limits = httpx.Limits(max_connections=100) expected = ( "Limits(max_connections=100, max_keepalive_connections=None," " keepalive_expiry=5.0)" ) assert repr(limits) == expected def test_limits_eq(): limits = httpx.Limits(max_connections=100) assert limits == httpx.Limits(max_connections=100) def test_timeout_eq(): timeout = httpx.Timeout(timeout=5.0) assert timeout == httpx.Timeout(timeout=5.0) def test_timeout_all_parameters_set(): timeout = httpx.Timeout(connect=5.0, read=5.0, write=5.0, pool=5.0) assert timeout == httpx.Timeout(timeout=5.0) def test_timeout_from_nothing(): timeout = httpx.Timeout(None) assert timeout.connect is None assert timeout.read is None assert timeout.write is None assert timeout.pool is None def test_timeout_from_none(): timeout = httpx.Timeout(timeout=None) assert timeout == httpx.Timeout(None) def test_timeout_from_one_none_value(): timeout = httpx.Timeout(None, read=None) assert timeout == httpx.Timeout(None) def test_timeout_from_one_value(): timeout = httpx.Timeout(None, read=5.0) assert timeout == httpx.Timeout(timeout=(None, 5.0, None, None)) def test_timeout_from_one_value_and_default(): timeout = httpx.Timeout(5.0, pool=60.0) assert timeout == httpx.Timeout(timeout=(5.0, 5.0, 5.0, 60.0)) def test_timeout_missing_default(): with pytest.raises(ValueError): httpx.Timeout(pool=60.0) def test_timeout_from_tuple(): timeout = httpx.Timeout(timeout=(5.0, 5.0, 5.0, 5.0)) assert timeout == httpx.Timeout(timeout=5.0) def test_timeout_from_config_instance(): timeout = httpx.Timeout(timeout=5.0) assert httpx.Timeout(timeout) == httpx.Timeout(timeout=5.0) def test_timeout_repr(): timeout = httpx.Timeout(timeout=5.0) assert repr(timeout) == "Timeout(timeout=5.0)" timeout = httpx.Timeout(None, read=5.0) assert repr(timeout) == "Timeout(connect=None, read=5.0, write=None, pool=None)" @pytest.mark.skipif( not hasattr(ssl.SSLContext, "keylog_filename"), reason="requires OpenSSL 1.1.1 or higher", ) def test_ssl_config_support_for_keylog_file(tmpdir, monkeypatch): # pragma: no cover with monkeypatch.context() as m: m.delenv("SSLKEYLOGFILE", raising=False) context = httpx.create_ssl_context(trust_env=True) assert context.keylog_filename is None filename = str(tmpdir.join("test.log")) with monkeypatch.context() as m: m.setenv("SSLKEYLOGFILE", filename) context = httpx.create_ssl_context(trust_env=True) assert context.keylog_filename == filename context = httpx.create_ssl_context(trust_env=False) assert context.keylog_filename is None def test_proxy_from_url(): proxy = httpx.Proxy("https://example.com") assert str(proxy.url) == "https://example.com" assert proxy.auth is None assert proxy.headers == {} assert repr(proxy) == "Proxy('https://example.com')" def test_proxy_with_auth_from_url(): proxy = httpx.Proxy("https://username:password@example.com") assert str(proxy.url) == "https://example.com" assert proxy.auth == ("username", "password") assert proxy.headers == {} assert repr(proxy) == "Proxy('https://example.com', auth=('username', '********'))" def test_invalid_proxy_scheme(): with pytest.raises(ValueError): httpx.Proxy("invalid://example.com") httpx-0.26.0/tests/test_content.py000066400000000000000000000375141454054354600172170ustar00rootroot00000000000000import io import typing import pytest import httpx method = "POST" url = "https://www.example.com" @pytest.mark.anyio async def test_empty_content(): request = httpx.Request(method, url) assert isinstance(request.stream, httpx.SyncByteStream) assert isinstance(request.stream, httpx.AsyncByteStream) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == {"Host": "www.example.com", "Content-Length": "0"} assert sync_content == b"" assert async_content == b"" @pytest.mark.anyio async def test_bytes_content(): request = httpx.Request(method, url, content=b"Hello, world!") assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == {"Host": "www.example.com", "Content-Length": "13"} assert sync_content == b"Hello, world!" assert async_content == b"Hello, world!" # Support 'data' for compat with requests. with pytest.warns(DeprecationWarning): request = httpx.Request(method, url, data=b"Hello, world!") # type: ignore assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == {"Host": "www.example.com", "Content-Length": "13"} assert sync_content == b"Hello, world!" assert async_content == b"Hello, world!" @pytest.mark.anyio async def test_bytesio_content(): request = httpx.Request(method, url, content=io.BytesIO(b"Hello, world!")) assert isinstance(request.stream, typing.Iterable) assert not isinstance(request.stream, typing.AsyncIterable) content = b"".join(list(request.stream)) assert request.headers == {"Host": "www.example.com", "Content-Length": "13"} assert content == b"Hello, world!" @pytest.mark.anyio async def test_async_bytesio_content(): class AsyncBytesIO: def __init__(self, content: bytes) -> None: self._idx = 0 self._content = content async def aread(self, chunk_size: int) -> bytes: chunk = self._content[self._idx : self._idx + chunk_size] self._idx = self._idx + chunk_size return chunk async def __aiter__(self): yield self._content # pragma: no cover request = httpx.Request(method, url, content=AsyncBytesIO(b"Hello, world!")) assert not isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Transfer-Encoding": "chunked", } assert content == b"Hello, world!" @pytest.mark.anyio async def test_iterator_content(): def hello_world() -> typing.Iterator[bytes]: yield b"Hello, " yield b"world!" request = httpx.Request(method, url, content=hello_world()) assert isinstance(request.stream, typing.Iterable) assert not isinstance(request.stream, typing.AsyncIterable) content = b"".join(list(request.stream)) assert request.headers == { "Host": "www.example.com", "Transfer-Encoding": "chunked", } assert content == b"Hello, world!" with pytest.raises(httpx.StreamConsumed): list(request.stream) # Support 'data' for compat with requests. with pytest.warns(DeprecationWarning): request = httpx.Request(method, url, data=hello_world()) # type: ignore assert isinstance(request.stream, typing.Iterable) assert not isinstance(request.stream, typing.AsyncIterable) content = b"".join(list(request.stream)) assert request.headers == { "Host": "www.example.com", "Transfer-Encoding": "chunked", } assert content == b"Hello, world!" @pytest.mark.anyio async def test_aiterator_content(): async def hello_world() -> typing.AsyncIterator[bytes]: yield b"Hello, " yield b"world!" request = httpx.Request(method, url, content=hello_world()) assert not isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Transfer-Encoding": "chunked", } assert content == b"Hello, world!" with pytest.raises(httpx.StreamConsumed): [part async for part in request.stream] # Support 'data' for compat with requests. with pytest.warns(DeprecationWarning): request = httpx.Request(method, url, data=hello_world()) # type: ignore assert not isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Transfer-Encoding": "chunked", } assert content == b"Hello, world!" @pytest.mark.anyio async def test_json_content(): request = httpx.Request(method, url, json={"Hello": "world!"}) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Content-Length": "19", "Content-Type": "application/json", } assert sync_content == b'{"Hello": "world!"}' assert async_content == b'{"Hello": "world!"}' @pytest.mark.anyio async def test_urlencoded_content(): request = httpx.Request(method, url, data={"Hello": "world!"}) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Content-Length": "14", "Content-Type": "application/x-www-form-urlencoded", } assert sync_content == b"Hello=world%21" assert async_content == b"Hello=world%21" @pytest.mark.anyio async def test_urlencoded_boolean(): request = httpx.Request(method, url, data={"example": True}) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Content-Length": "12", "Content-Type": "application/x-www-form-urlencoded", } assert sync_content == b"example=true" assert async_content == b"example=true" @pytest.mark.anyio async def test_urlencoded_none(): request = httpx.Request(method, url, data={"example": None}) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Content-Length": "8", "Content-Type": "application/x-www-form-urlencoded", } assert sync_content == b"example=" assert async_content == b"example=" @pytest.mark.anyio async def test_urlencoded_list(): request = httpx.Request(method, url, data={"example": ["a", 1, True]}) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Content-Length": "32", "Content-Type": "application/x-www-form-urlencoded", } assert sync_content == b"example=a&example=1&example=true" assert async_content == b"example=a&example=1&example=true" @pytest.mark.anyio async def test_multipart_files_content(): files = {"file": io.BytesIO(b"")} headers = {"Content-Type": "multipart/form-data; boundary=+++"} request = httpx.Request( method, url, files=files, headers=headers, ) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Content-Length": "138", "Content-Type": "multipart/form-data; boundary=+++", } assert sync_content == b"".join( [ b"--+++\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--+++--\r\n", ] ) assert async_content == b"".join( [ b"--+++\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--+++--\r\n", ] ) @pytest.mark.anyio async def test_multipart_data_and_files_content(): data = {"message": "Hello, world!"} files = {"file": io.BytesIO(b"")} headers = {"Content-Type": "multipart/form-data; boundary=+++"} request = httpx.Request(method, url, data=data, files=files, headers=headers) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Content-Length": "210", "Content-Type": "multipart/form-data; boundary=+++", } assert sync_content == b"".join( [ b"--+++\r\n", b'Content-Disposition: form-data; name="message"\r\n', b"\r\n", b"Hello, world!\r\n", b"--+++\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--+++--\r\n", ] ) assert async_content == b"".join( [ b"--+++\r\n", b'Content-Disposition: form-data; name="message"\r\n', b"\r\n", b"Hello, world!\r\n", b"--+++\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--+++--\r\n", ] ) @pytest.mark.anyio async def test_empty_request(): request = httpx.Request(method, url, data={}, files={}) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == {"Host": "www.example.com", "Content-Length": "0"} assert sync_content == b"" assert async_content == b"" def test_invalid_argument(): with pytest.raises(TypeError): httpx.Request(method, url, content=123) # type: ignore with pytest.raises(TypeError): httpx.Request(method, url, content={"a": "b"}) # type: ignore @pytest.mark.anyio async def test_multipart_multiple_files_single_input_content(): files = [ ("file", io.BytesIO(b"")), ("file", io.BytesIO(b"")), ] headers = {"Content-Type": "multipart/form-data; boundary=+++"} request = httpx.Request(method, url, files=files, headers=headers) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Content-Length": "271", "Content-Type": "multipart/form-data; boundary=+++", } assert sync_content == b"".join( [ b"--+++\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--+++\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--+++--\r\n", ] ) assert async_content == b"".join( [ b"--+++\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--+++\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--+++--\r\n", ] ) @pytest.mark.anyio async def test_response_empty_content(): response = httpx.Response(200) assert isinstance(response.stream, typing.Iterable) assert isinstance(response.stream, typing.AsyncIterable) sync_content = b"".join(list(response.stream)) async_content = b"".join([part async for part in response.stream]) assert response.headers == {} assert sync_content == b"" assert async_content == b"" @pytest.mark.anyio async def test_response_bytes_content(): response = httpx.Response(200, content=b"Hello, world!") assert isinstance(response.stream, typing.Iterable) assert isinstance(response.stream, typing.AsyncIterable) sync_content = b"".join(list(response.stream)) async_content = b"".join([part async for part in response.stream]) assert response.headers == {"Content-Length": "13"} assert sync_content == b"Hello, world!" assert async_content == b"Hello, world!" @pytest.mark.anyio async def test_response_iterator_content(): def hello_world() -> typing.Iterator[bytes]: yield b"Hello, " yield b"world!" response = httpx.Response(200, content=hello_world()) assert isinstance(response.stream, typing.Iterable) assert not isinstance(response.stream, typing.AsyncIterable) content = b"".join(list(response.stream)) assert response.headers == {"Transfer-Encoding": "chunked"} assert content == b"Hello, world!" with pytest.raises(httpx.StreamConsumed): list(response.stream) @pytest.mark.anyio async def test_response_aiterator_content(): async def hello_world() -> typing.AsyncIterator[bytes]: yield b"Hello, " yield b"world!" response = httpx.Response(200, content=hello_world()) assert not isinstance(response.stream, typing.Iterable) assert isinstance(response.stream, typing.AsyncIterable) content = b"".join([part async for part in response.stream]) assert response.headers == {"Transfer-Encoding": "chunked"} assert content == b"Hello, world!" with pytest.raises(httpx.StreamConsumed): [part async for part in response.stream] def test_response_invalid_argument(): with pytest.raises(TypeError): httpx.Response(200, content=123) # type: ignore httpx-0.26.0/tests/test_decoders.py000066400000000000000000000205021454054354600173220ustar00rootroot00000000000000import typing import zlib import chardet import pytest import httpx def test_deflate(): """ Deflate encoding may use either 'zlib' or 'deflate' in the wild. https://stackoverflow.com/questions/1838699/how-can-i-decompress-a-gzip-stream-with-zlib#answer-22311297 """ body = b"test 123" compressor = zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS) compressed_body = compressor.compress(body) + compressor.flush() headers = [(b"Content-Encoding", b"deflate")] response = httpx.Response( 200, headers=headers, content=compressed_body, ) assert response.content == body def test_zlib(): """ Deflate encoding may use either 'zlib' or 'deflate' in the wild. https://stackoverflow.com/questions/1838699/how-can-i-decompress-a-gzip-stream-with-zlib#answer-22311297 """ body = b"test 123" compressed_body = zlib.compress(body) headers = [(b"Content-Encoding", b"deflate")] response = httpx.Response( 200, headers=headers, content=compressed_body, ) assert response.content == body def test_gzip(): body = b"test 123" compressor = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS | 16) compressed_body = compressor.compress(body) + compressor.flush() headers = [(b"Content-Encoding", b"gzip")] response = httpx.Response( 200, headers=headers, content=compressed_body, ) assert response.content == body def test_brotli(): body = b"test 123" compressed_body = b"\x8b\x03\x80test 123\x03" headers = [(b"Content-Encoding", b"br")] response = httpx.Response( 200, headers=headers, content=compressed_body, ) assert response.content == body def test_multi(): body = b"test 123" deflate_compressor = zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS) compressed_body = deflate_compressor.compress(body) + deflate_compressor.flush() gzip_compressor = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS | 16) compressed_body = ( gzip_compressor.compress(compressed_body) + gzip_compressor.flush() ) headers = [(b"Content-Encoding", b"deflate, gzip")] response = httpx.Response( 200, headers=headers, content=compressed_body, ) assert response.content == body def test_multi_with_identity(): body = b"test 123" compressed_body = b"\x8b\x03\x80test 123\x03" headers = [(b"Content-Encoding", b"br, identity")] response = httpx.Response( 200, headers=headers, content=compressed_body, ) assert response.content == body headers = [(b"Content-Encoding", b"identity, br")] response = httpx.Response( 200, headers=headers, content=compressed_body, ) assert response.content == body @pytest.mark.anyio async def test_streaming(): body = b"test 123" compressor = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS | 16) async def compress(body: bytes) -> typing.AsyncIterator[bytes]: yield compressor.compress(body) yield compressor.flush() headers = [(b"Content-Encoding", b"gzip")] response = httpx.Response( 200, headers=headers, content=compress(body), ) assert not hasattr(response, "body") assert await response.aread() == body @pytest.mark.parametrize("header_value", (b"deflate", b"gzip", b"br", b"identity")) def test_empty_content(header_value): headers = [(b"Content-Encoding", header_value)] response = httpx.Response( 200, headers=headers, content=b"", ) assert response.content == b"" @pytest.mark.parametrize("header_value", (b"deflate", b"gzip", b"br", b"identity")) def test_decoders_empty_cases(header_value): headers = [(b"Content-Encoding", header_value)] response = httpx.Response(content=b"", status_code=200, headers=headers) assert response.read() == b"" @pytest.mark.parametrize("header_value", (b"deflate", b"gzip", b"br")) def test_decoding_errors(header_value): headers = [(b"Content-Encoding", header_value)] compressed_body = b"invalid" with pytest.raises(httpx.DecodingError): request = httpx.Request("GET", "https://example.org") httpx.Response(200, headers=headers, content=compressed_body, request=request) with pytest.raises(httpx.DecodingError): httpx.Response(200, headers=headers, content=compressed_body) @pytest.mark.parametrize( ["data", "encoding"], [ ((b"Hello,", b" world!"), "ascii"), ((b"\xe3\x83", b"\x88\xe3\x83\xa9", b"\xe3", b"\x83\x99\xe3\x83\xab"), "utf-8"), ((b"Euro character: \x88! abcdefghijklmnopqrstuvwxyz", b""), "cp1252"), ((b"Accented: \xd6sterreich abcdefghijklmnopqrstuvwxyz", b""), "iso-8859-1"), ], ) @pytest.mark.anyio async def test_text_decoder_with_autodetect(data, encoding): async def iterator() -> typing.AsyncIterator[bytes]: nonlocal data for chunk in data: yield chunk def autodetect(content): return chardet.detect(content).get("encoding") # Accessing `.text` on a read response. response = httpx.Response(200, content=iterator(), default_encoding=autodetect) await response.aread() assert response.text == (b"".join(data)).decode(encoding) # Streaming `.aiter_text` iteratively. # Note that if we streamed the text *without* having read it first, then # we won't get a `charset_normalizer` guess, and will instead always rely # on utf-8 if no charset is specified. text = "".join([part async for part in response.aiter_text()]) assert text == (b"".join(data)).decode(encoding) @pytest.mark.anyio async def test_text_decoder_known_encoding(): async def iterator() -> typing.AsyncIterator[bytes]: yield b"\x83g" yield b"\x83" yield b"\x89\x83x\x83\x8b" response = httpx.Response( 200, headers=[(b"Content-Type", b"text/html; charset=shift-jis")], content=iterator(), ) await response.aread() assert "".join(response.text) == "トラベル" def test_text_decoder_empty_cases(): response = httpx.Response(200, content=b"") assert response.text == "" response = httpx.Response(200, content=[b""]) response.read() assert response.text == "" @pytest.mark.parametrize( ["data", "expected"], [((b"Hello,", b" world!"), ["Hello,", " world!"])], ) def test_streaming_text_decoder( data: typing.Iterable[bytes], expected: typing.List[str] ) -> None: response = httpx.Response(200, content=iter(data)) assert list(response.iter_text()) == expected def test_line_decoder_nl(): response = httpx.Response(200, content=[b""]) assert list(response.iter_lines()) == [] response = httpx.Response(200, content=[b"", b"a\n\nb\nc"]) assert list(response.iter_lines()) == ["a", "", "b", "c"] # Issue #1033 response = httpx.Response( 200, content=[b"", b"12345\n", b"foo ", b"bar ", b"baz\n"] ) assert list(response.iter_lines()) == ["12345", "foo bar baz"] def test_line_decoder_cr(): response = httpx.Response(200, content=[b"", b"a\r\rb\rc"]) assert list(response.iter_lines()) == ["a", "", "b", "c"] response = httpx.Response(200, content=[b"", b"a\r\rb\rc\r"]) assert list(response.iter_lines()) == ["a", "", "b", "c"] # Issue #1033 response = httpx.Response( 200, content=[b"", b"12345\r", b"foo ", b"bar ", b"baz\r"] ) assert list(response.iter_lines()) == ["12345", "foo bar baz"] def test_line_decoder_crnl(): response = httpx.Response(200, content=[b"", b"a\r\n\r\nb\r\nc"]) assert list(response.iter_lines()) == ["a", "", "b", "c"] response = httpx.Response(200, content=[b"", b"a\r\n\r\nb\r\nc\r\n"]) assert list(response.iter_lines()) == ["a", "", "b", "c"] response = httpx.Response(200, content=[b"", b"a\r", b"\n\r\nb\r\nc"]) assert list(response.iter_lines()) == ["a", "", "b", "c"] # Issue #1033 response = httpx.Response(200, content=[b"", b"12345\r\n", b"foo bar baz\r\n"]) assert list(response.iter_lines()) == ["12345", "foo bar baz"] def test_invalid_content_encoding_header(): headers = [(b"Content-Encoding", b"invalid-header")] body = b"test 123" response = httpx.Response( 200, headers=headers, content=body, ) assert response.content == body httpx-0.26.0/tests/test_exceptions.py000066400000000000000000000034251454054354600177200ustar00rootroot00000000000000import typing import httpcore import pytest import httpx if typing.TYPE_CHECKING: # pragma: no cover from conftest import TestServer def test_httpcore_all_exceptions_mapped() -> None: """ All exception classes exposed by HTTPCore are properly mapped to an HTTPX-specific exception class. """ expected_mapped_httpcore_exceptions = { value.__name__ for _, value in vars(httpcore).items() if isinstance(value, type) and issubclass(value, Exception) and value is not httpcore.ConnectionNotAvailable } httpx_exceptions = { value.__name__ for _, value in vars(httpx).items() if isinstance(value, type) and issubclass(value, Exception) } unmapped_exceptions = expected_mapped_httpcore_exceptions - httpx_exceptions if unmapped_exceptions: # pragma: no cover pytest.fail(f"Unmapped httpcore exceptions: {unmapped_exceptions}") def test_httpcore_exception_mapping(server: "TestServer") -> None: """ HTTPCore exception mapping works as expected. """ impossible_port = 123456 with pytest.raises(httpx.ConnectError): httpx.get(server.url.copy_with(port=impossible_port)) with pytest.raises(httpx.ReadTimeout): httpx.get( server.url.copy_with(path="/slow_response"), timeout=httpx.Timeout(5, read=0.01), ) def test_request_attribute() -> None: # Exception without request attribute exc = httpx.ReadTimeout("Read operation timed out") with pytest.raises(RuntimeError): exc.request # noqa: B018 # Exception with request attribute request = httpx.Request("GET", "https://www.example.com") exc = httpx.ReadTimeout("Read operation timed out", request=request) assert exc.request == request httpx-0.26.0/tests/test_exported_members.py000066400000000000000000000005641454054354600211040ustar00rootroot00000000000000import httpx def test_all_imports_are_exported() -> None: included_private_members = ["__description__", "__title__", "__version__"] assert httpx.__all__ == sorted( ( member for member in vars(httpx).keys() if not member.startswith("_") or member in included_private_members ), key=str.casefold, ) httpx-0.26.0/tests/test_main.py000066400000000000000000000126351454054354600164660ustar00rootroot00000000000000import os import typing from click.testing import CliRunner import httpx def splitlines(output: str) -> typing.Iterable[str]: return [line.strip() for line in output.splitlines()] def remove_date_header(lines: typing.Iterable[str]) -> typing.Iterable[str]: return [line for line in lines if not line.startswith("date:")] def test_help(): runner = CliRunner() result = runner.invoke(httpx.main, ["--help"]) assert result.exit_code == 0 assert "A next generation HTTP client." in result.output def test_get(server): url = str(server.url) runner = CliRunner() result = runner.invoke(httpx.main, [url]) assert result.exit_code == 0 assert remove_date_header(splitlines(result.output)) == [ "HTTP/1.1 200 OK", "server: uvicorn", "content-type: text/plain", "Transfer-Encoding: chunked", "", "Hello, world!", ] def test_json(server): url = str(server.url.copy_with(path="/json")) runner = CliRunner() result = runner.invoke(httpx.main, [url]) assert result.exit_code == 0 assert remove_date_header(splitlines(result.output)) == [ "HTTP/1.1 200 OK", "server: uvicorn", "content-type: application/json", "Transfer-Encoding: chunked", "", "{", '"Hello": "world!"', "}", ] def test_binary(server): url = str(server.url.copy_with(path="/echo_binary")) runner = CliRunner() content = "Hello, world!" result = runner.invoke(httpx.main, [url, "-c", content]) assert result.exit_code == 0 assert remove_date_header(splitlines(result.output)) == [ "HTTP/1.1 200 OK", "server: uvicorn", "content-type: application/octet-stream", "Transfer-Encoding: chunked", "", f"<{len(content)} bytes of binary data>", ] def test_redirects(server): url = str(server.url.copy_with(path="/redirect_301")) runner = CliRunner() result = runner.invoke(httpx.main, [url]) assert result.exit_code == 1 assert remove_date_header(splitlines(result.output)) == [ "HTTP/1.1 301 Moved Permanently", "server: uvicorn", "location: /", "Transfer-Encoding: chunked", "", ] def test_follow_redirects(server): url = str(server.url.copy_with(path="/redirect_301")) runner = CliRunner() result = runner.invoke(httpx.main, [url, "--follow-redirects"]) assert result.exit_code == 0 assert remove_date_header(splitlines(result.output)) == [ "HTTP/1.1 301 Moved Permanently", "server: uvicorn", "location: /", "Transfer-Encoding: chunked", "", "HTTP/1.1 200 OK", "server: uvicorn", "content-type: text/plain", "Transfer-Encoding: chunked", "", "Hello, world!", ] def test_post(server): url = str(server.url.copy_with(path="/echo_body")) runner = CliRunner() result = runner.invoke(httpx.main, [url, "-m", "POST", "-j", '{"hello": "world"}']) assert result.exit_code == 0 assert remove_date_header(splitlines(result.output)) == [ "HTTP/1.1 200 OK", "server: uvicorn", "content-type: text/plain", "Transfer-Encoding: chunked", "", '{"hello": "world"}', ] def test_verbose(server): url = str(server.url) runner = CliRunner() result = runner.invoke(httpx.main, [url, "-v"]) assert result.exit_code == 0 assert remove_date_header(splitlines(result.output)) == [ "* Connecting to '127.0.0.1'", "* Connected to '127.0.0.1' on port 8000", "GET / HTTP/1.1", f"Host: {server.url.netloc.decode('ascii')}", "Accept: */*", "Accept-Encoding: gzip, deflate, br", "Connection: keep-alive", f"User-Agent: python-httpx/{httpx.__version__}", "", "HTTP/1.1 200 OK", "server: uvicorn", "content-type: text/plain", "Transfer-Encoding: chunked", "", "Hello, world!", ] def test_auth(server): url = str(server.url) runner = CliRunner() result = runner.invoke(httpx.main, [url, "-v", "--auth", "username", "password"]) print(result.output) assert result.exit_code == 0 assert remove_date_header(splitlines(result.output)) == [ "* Connecting to '127.0.0.1'", "* Connected to '127.0.0.1' on port 8000", "GET / HTTP/1.1", f"Host: {server.url.netloc.decode('ascii')}", "Accept: */*", "Accept-Encoding: gzip, deflate, br", "Connection: keep-alive", f"User-Agent: python-httpx/{httpx.__version__}", "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=", "", "HTTP/1.1 200 OK", "server: uvicorn", "content-type: text/plain", "Transfer-Encoding: chunked", "", "Hello, world!", ] def test_download(server): url = str(server.url) runner = CliRunner() with runner.isolated_filesystem(): runner.invoke(httpx.main, [url, "--download", "index.txt"]) assert os.path.exists("index.txt") with open("index.txt", "r") as input_file: assert input_file.read() == "Hello, world!" def test_errors(): runner = CliRunner() result = runner.invoke(httpx.main, ["invalid://example.org"]) assert result.exit_code == 1 assert splitlines(result.output) == [ "UnsupportedProtocol: Request URL has an unsupported protocol 'invalid://'.", ] httpx-0.26.0/tests/test_multipart.py000066400000000000000000000412321454054354600175560ustar00rootroot00000000000000import io import tempfile import typing import pytest import httpx def echo_request_content(request: httpx.Request) -> httpx.Response: return httpx.Response(200, content=request.content) @pytest.mark.parametrize(("value,output"), (("abc", b"abc"), (b"abc", b"abc"))) def test_multipart(value, output): client = httpx.Client(transport=httpx.MockTransport(echo_request_content)) # Test with a single-value 'data' argument, and a plain file 'files' argument. data = {"text": value} files = {"file": io.BytesIO(b"")} response = client.post("http://127.0.0.1:8000/", data=data, files=files) boundary = response.request.headers["Content-Type"].split("boundary=")[-1] boundary_bytes = boundary.encode("ascii") assert response.status_code == 200 assert response.content == b"".join( [ b"--" + boundary_bytes + b"\r\n", b'Content-Disposition: form-data; name="text"\r\n', b"\r\n", b"abc\r\n", b"--" + boundary_bytes + b"\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--" + boundary_bytes + b"--\r\n", ] ) @pytest.mark.parametrize( "header", [ "multipart/form-data; boundary=+++; charset=utf-8", "multipart/form-data; charset=utf-8; boundary=+++", "multipart/form-data; boundary=+++", "multipart/form-data; boundary=+++ ;", 'multipart/form-data; boundary="+++"; charset=utf-8', 'multipart/form-data; charset=utf-8; boundary="+++"', 'multipart/form-data; boundary="+++"', 'multipart/form-data; boundary="+++" ;', ], ) def test_multipart_explicit_boundary(header: str) -> None: client = httpx.Client(transport=httpx.MockTransport(echo_request_content)) files = {"file": io.BytesIO(b"")} headers = {"content-type": header} response = client.post("http://127.0.0.1:8000/", files=files, headers=headers) boundary_bytes = b"+++" assert response.status_code == 200 assert response.request.headers["Content-Type"] == header assert response.content == b"".join( [ b"--" + boundary_bytes + b"\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--" + boundary_bytes + b"--\r\n", ] ) @pytest.mark.parametrize( "header", [ "multipart/form-data; charset=utf-8", "multipart/form-data; charset=utf-8; ", ], ) def test_multipart_header_without_boundary(header: str) -> None: client = httpx.Client(transport=httpx.MockTransport(echo_request_content)) files = {"file": io.BytesIO(b"")} headers = {"content-type": header} response = client.post("http://127.0.0.1:8000/", files=files, headers=headers) assert response.status_code == 200 assert response.request.headers["Content-Type"] == header @pytest.mark.parametrize(("key"), (b"abc", 1, 2.3, None)) def test_multipart_invalid_key(key): client = httpx.Client(transport=httpx.MockTransport(echo_request_content)) data = {key: "abc"} files = {"file": io.BytesIO(b"")} with pytest.raises(TypeError) as e: client.post( "http://127.0.0.1:8000/", data=data, files=files, ) assert "Invalid type for name" in str(e.value) assert repr(key) in str(e.value) @pytest.mark.parametrize(("value"), (object(), {"key": "value"})) def test_multipart_invalid_value(value): client = httpx.Client(transport=httpx.MockTransport(echo_request_content)) data = {"text": value} files = {"file": io.BytesIO(b"")} with pytest.raises(TypeError) as e: client.post("http://127.0.0.1:8000/", data=data, files=files) assert "Invalid type for value" in str(e.value) def test_multipart_file_tuple(): client = httpx.Client(transport=httpx.MockTransport(echo_request_content)) # Test with a list of values 'data' argument, # and a tuple style 'files' argument. data = {"text": ["abc"]} files = {"file": ("name.txt", io.BytesIO(b""))} response = client.post("http://127.0.0.1:8000/", data=data, files=files) boundary = response.request.headers["Content-Type"].split("boundary=")[-1] boundary_bytes = boundary.encode("ascii") assert response.status_code == 200 assert response.content == b"".join( [ b"--" + boundary_bytes + b"\r\n", b'Content-Disposition: form-data; name="text"\r\n', b"\r\n", b"abc\r\n", b"--" + boundary_bytes + b"\r\n", b'Content-Disposition: form-data; name="file"; filename="name.txt"\r\n', b"Content-Type: text/plain\r\n", b"\r\n", b"\r\n", b"--" + boundary_bytes + b"--\r\n", ] ) @pytest.mark.parametrize("file_content_type", [None, "text/plain"]) def test_multipart_file_tuple_headers(file_content_type: typing.Optional[str]) -> None: file_name = "test.txt" file_content = io.BytesIO(b"") file_headers = {"Expires": "0"} url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} files = {"file": (file_name, file_content, file_content_type, file_headers)} request = httpx.Request("POST", url, headers=headers, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Content-Length": str(len(request.content)), } assert request.content == ( f'--BOUNDARY\r\nContent-Disposition: form-data; name="file"; ' f'filename="{file_name}"\r\nExpires: 0\r\nContent-Type: ' f"text/plain\r\n\r\n\r\n--BOUNDARY--\r\n" "".encode("ascii") ) def test_multipart_headers_include_content_type() -> None: """ Content-Type from 4th tuple parameter (headers) should override the 3rd parameter (content_type) """ file_name = "test.txt" file_content = io.BytesIO(b"") file_content_type = "text/plain" file_headers = {"Content-Type": "image/png"} url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} files = {"file": (file_name, file_content, file_content_type, file_headers)} request = httpx.Request("POST", url, headers=headers, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Content-Length": str(len(request.content)), } assert request.content == ( f'--BOUNDARY\r\nContent-Disposition: form-data; name="file"; ' f'filename="{file_name}"\r\nContent-Type: ' f"image/png\r\n\r\n\r\n--BOUNDARY--\r\n" "".encode("ascii") ) def test_multipart_encode(tmp_path: typing.Any) -> None: path = str(tmp_path / "name.txt") with open(path, "wb") as f: f.write(b"") url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} data = { "a": "1", "b": b"C", "c": ["11", "22", "33"], "d": "", "e": True, "f": "", } with open(path, "rb") as input_file: files = {"file": ("name.txt", input_file)} request = httpx.Request("POST", url, headers=headers, data=data, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Content-Length": str(len(request.content)), } assert request.content == ( '--BOUNDARY\r\nContent-Disposition: form-data; name="a"\r\n\r\n1\r\n' '--BOUNDARY\r\nContent-Disposition: form-data; name="b"\r\n\r\nC\r\n' '--BOUNDARY\r\nContent-Disposition: form-data; name="c"\r\n\r\n11\r\n' '--BOUNDARY\r\nContent-Disposition: form-data; name="c"\r\n\r\n22\r\n' '--BOUNDARY\r\nContent-Disposition: form-data; name="c"\r\n\r\n33\r\n' '--BOUNDARY\r\nContent-Disposition: form-data; name="d"\r\n\r\n\r\n' '--BOUNDARY\r\nContent-Disposition: form-data; name="e"\r\n\r\ntrue\r\n' '--BOUNDARY\r\nContent-Disposition: form-data; name="f"\r\n\r\n\r\n' '--BOUNDARY\r\nContent-Disposition: form-data; name="file";' ' filename="name.txt"\r\n' "Content-Type: text/plain\r\n\r\n\r\n" "--BOUNDARY--\r\n" "".encode("ascii") ) def test_multipart_encode_unicode_file_contents() -> None: url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} files = {"file": ("name.txt", b"")} request = httpx.Request("POST", url, headers=headers, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Content-Length": str(len(request.content)), } assert request.content == ( b'--BOUNDARY\r\nContent-Disposition: form-data; name="file";' b' filename="name.txt"\r\n' b"Content-Type: text/plain\r\n\r\n\r\n" b"--BOUNDARY--\r\n" ) def test_multipart_encode_files_allows_filenames_as_none() -> None: url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} files = {"file": (None, io.BytesIO(b""))} request = httpx.Request("POST", url, headers=headers, data={}, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Content-Length": str(len(request.content)), } assert request.content == ( '--BOUNDARY\r\nContent-Disposition: form-data; name="file"\r\n\r\n' "\r\n--BOUNDARY--\r\n" "".encode("ascii") ) @pytest.mark.parametrize( "file_name,expected_content_type", [ ("example.json", "application/json"), ("example.txt", "text/plain"), ("no-extension", "application/octet-stream"), ], ) def test_multipart_encode_files_guesses_correct_content_type( file_name: str, expected_content_type: str ) -> None: url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} files = {"file": (file_name, io.BytesIO(b""))} request = httpx.Request("POST", url, headers=headers, data={}, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Content-Length": str(len(request.content)), } assert request.content == ( f'--BOUNDARY\r\nContent-Disposition: form-data; name="file"; ' f'filename="{file_name}"\r\nContent-Type: ' f"{expected_content_type}\r\n\r\n\r\n--BOUNDARY--\r\n" "".encode("ascii") ) def test_multipart_encode_files_allows_bytes_content() -> None: url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} files = {"file": ("test.txt", b"", "text/plain")} request = httpx.Request("POST", url, headers=headers, data={}, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Content-Length": str(len(request.content)), } assert request.content == ( '--BOUNDARY\r\nContent-Disposition: form-data; name="file"; ' 'filename="test.txt"\r\n' "Content-Type: text/plain\r\n\r\n\r\n" "--BOUNDARY--\r\n" "".encode("ascii") ) def test_multipart_encode_files_allows_str_content() -> None: url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} files = {"file": ("test.txt", "", "text/plain")} request = httpx.Request("POST", url, headers=headers, data={}, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Content-Length": str(len(request.content)), } assert request.content == ( '--BOUNDARY\r\nContent-Disposition: form-data; name="file"; ' 'filename="test.txt"\r\n' "Content-Type: text/plain\r\n\r\n\r\n" "--BOUNDARY--\r\n" "".encode("ascii") ) def test_multipart_encode_files_raises_exception_with_StringIO_content() -> None: url = "https://www.example.com" files = {"file": ("test.txt", io.StringIO("content"), "text/plain")} with pytest.raises(TypeError): httpx.Request("POST", url, data={}, files=files) # type: ignore def test_multipart_encode_files_raises_exception_with_text_mode_file() -> None: url = "https://www.example.com" with tempfile.TemporaryFile(mode="w") as upload: files = {"file": ("test.txt", upload, "text/plain")} with pytest.raises(TypeError): httpx.Request("POST", url, data={}, files=files) # type: ignore def test_multipart_encode_non_seekable_filelike() -> None: """ Test that special readable but non-seekable filelike objects are supported. In this case uploads with use 'Transfer-Encoding: chunked', instead of a 'Content-Length' header. """ class IteratorIO(io.IOBase): def __init__(self, iterator: typing.Iterator[bytes]) -> None: self._iterator = iterator def read(self, *args: typing.Any) -> bytes: return b"".join(self._iterator) def data() -> typing.Iterator[bytes]: yield b"Hello" yield b"World" url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} fileobj: typing.Any = IteratorIO(data()) files = {"file": fileobj} request = httpx.Request("POST", url, headers=headers, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Transfer-Encoding": "chunked", } assert request.content == ( b"--BOUNDARY\r\n" b'Content-Disposition: form-data; name="file"; filename="upload"\r\n' b"Content-Type: application/octet-stream\r\n" b"\r\n" b"HelloWorld\r\n" b"--BOUNDARY--\r\n" ) def test_multipart_rewinds_files(): with tempfile.TemporaryFile() as upload: upload.write(b"Hello, world!") transport = httpx.MockTransport(echo_request_content) client = httpx.Client(transport=transport) files = {"file": upload} response = client.post("http://127.0.0.1:8000/", files=files) assert response.status_code == 200 assert b"\r\nHello, world!\r\n" in response.content # POSTing the same file instance a second time should have the same content. files = {"file": upload} response = client.post("http://127.0.0.1:8000/", files=files) assert response.status_code == 200 assert b"\r\nHello, world!\r\n" in response.content class TestHeaderParamHTML5Formatting: def test_unicode(self): filename = "n\u00e4me" expected = b'filename="n\xc3\xa4me"' files = {"upload": (filename, b"")} request = httpx.Request("GET", "https://www.example.com", files=files) assert expected in request.read() def test_ascii(self): filename = "name" expected = b'filename="name"' files = {"upload": (filename, b"")} request = httpx.Request("GET", "https://www.example.com", files=files) assert expected in request.read() def test_unicode_escape(self): filename = "hello\\world\u0022" expected = b'filename="hello\\\\world%22"' files = {"upload": (filename, b"")} request = httpx.Request("GET", "https://www.example.com", files=files) assert expected in request.read() def test_unicode_with_control_character(self): filename = "hello\x1A\x1B\x1C" expected = b'filename="hello%1A\x1B%1C"' files = {"upload": (filename, b"")} request = httpx.Request("GET", "https://www.example.com", files=files) assert expected in request.read() httpx-0.26.0/tests/test_status_codes.py000066400000000000000000000013071454054354600202340ustar00rootroot00000000000000import httpx def test_status_code_as_int(): # mypy doesn't (yet) recognize that IntEnum members are ints, so ignore it here assert httpx.codes.NOT_FOUND == 404 # type: ignore[comparison-overlap] assert str(httpx.codes.NOT_FOUND) == "404" def test_status_code_value_lookup(): assert httpx.codes(404) == 404 def test_status_code_phrase_lookup(): assert httpx.codes["NOT_FOUND"] == 404 def test_lowercase_status_code(): assert httpx.codes.not_found == 404 # type: ignore def test_reason_phrase_for_status_code(): assert httpx.codes.get_reason_phrase(404) == "Not Found" def test_reason_phrase_for_unknown_status_code(): assert httpx.codes.get_reason_phrase(499) == "" httpx-0.26.0/tests/test_timeouts.py000066400000000000000000000025601454054354600174070ustar00rootroot00000000000000import pytest import httpx @pytest.mark.anyio async def test_read_timeout(server): timeout = httpx.Timeout(None, read=1e-6) async with httpx.AsyncClient(timeout=timeout) as client: with pytest.raises(httpx.ReadTimeout): await client.get(server.url.copy_with(path="/slow_response")) @pytest.mark.anyio async def test_write_timeout(server): timeout = httpx.Timeout(None, write=1e-6) async with httpx.AsyncClient(timeout=timeout) as client: with pytest.raises(httpx.WriteTimeout): data = b"*" * 1024 * 1024 * 100 await client.put(server.url.copy_with(path="/slow_response"), content=data) @pytest.mark.anyio @pytest.mark.network async def test_connect_timeout(server): timeout = httpx.Timeout(None, connect=1e-6) async with httpx.AsyncClient(timeout=timeout) as client: with pytest.raises(httpx.ConnectTimeout): # See https://stackoverflow.com/questions/100841/ await client.get("http://10.255.255.1/") @pytest.mark.anyio async def test_pool_timeout(server): limits = httpx.Limits(max_connections=1) timeout = httpx.Timeout(None, pool=1e-4) async with httpx.AsyncClient(limits=limits, timeout=timeout) as client: with pytest.raises(httpx.PoolTimeout): async with client.stream("GET", server.url): await client.get(server.url) httpx-0.26.0/tests/test_utils.py000066400000000000000000000215601454054354600166770ustar00rootroot00000000000000import json import logging import os import random import certifi import pytest import httpx from httpx._utils import ( URLPattern, get_ca_bundle_from_env, get_environment_proxies, is_https_redirect, obfuscate_sensitive_headers, parse_header_links, same_origin, ) from .common import TESTS_DIR @pytest.mark.parametrize( "encoding", ( "utf-32", "utf-8-sig", "utf-16", "utf-8", "utf-16-be", "utf-16-le", "utf-32-be", "utf-32-le", ), ) def test_encoded(encoding): content = '{"abc": 123}'.encode(encoding) response = httpx.Response(200, content=content) assert response.json() == {"abc": 123} def test_bad_utf_like_encoding(): content = b"\x00\x00\x00\x00" response = httpx.Response(200, content=content) with pytest.raises(json.decoder.JSONDecodeError): response.json() @pytest.mark.parametrize( ("encoding", "expected"), ( ("utf-16-be", "utf-16"), ("utf-16-le", "utf-16"), ("utf-32-be", "utf-32"), ("utf-32-le", "utf-32"), ), ) def test_guess_by_bom(encoding, expected): content = '\ufeff{"abc": 123}'.encode(encoding) response = httpx.Response(200, content=content) assert response.json() == {"abc": 123} @pytest.mark.parametrize( "value, expected", ( ( '; rel=front; type="image/jpeg"', [{"url": "http:/.../front.jpeg", "rel": "front", "type": "image/jpeg"}], ), ("", [{"url": "http:/.../front.jpeg"}]), (";", [{"url": "http:/.../front.jpeg"}]), ( '; type="image/jpeg",;', [ {"url": "http:/.../front.jpeg", "type": "image/jpeg"}, {"url": "http://.../back.jpeg"}, ], ), ("", []), ), ) def test_parse_header_links(value, expected): assert parse_header_links(value) == expected def test_logging_request(server, caplog): caplog.set_level(logging.INFO) with httpx.Client() as client: response = client.get(server.url) assert response.status_code == 200 assert caplog.record_tuples == [ ( "httpx", logging.INFO, 'HTTP Request: GET http://127.0.0.1:8000/ "HTTP/1.1 200 OK"', ) ] def test_logging_redirect_chain(server, caplog): caplog.set_level(logging.INFO) with httpx.Client(follow_redirects=True) as client: response = client.get(server.url.copy_with(path="/redirect_301")) assert response.status_code == 200 assert caplog.record_tuples == [ ( "httpx", logging.INFO, "HTTP Request: GET http://127.0.0.1:8000/redirect_301" ' "HTTP/1.1 301 Moved Permanently"', ), ( "httpx", logging.INFO, 'HTTP Request: GET http://127.0.0.1:8000/ "HTTP/1.1 200 OK"', ), ] def test_logging_ssl(caplog): caplog.set_level(logging.DEBUG) with httpx.Client(): pass cafile = certifi.where() assert caplog.record_tuples == [ ( "httpx", logging.DEBUG, "load_ssl_context verify=True cert=None trust_env=True http2=False", ), ( "httpx", logging.DEBUG, f"load_verify_locations cafile='{cafile}'", ), ] def test_get_ssl_cert_file(): # Two environments is not set. assert get_ca_bundle_from_env() is None os.environ["SSL_CERT_DIR"] = str(TESTS_DIR) # SSL_CERT_DIR is correctly set, SSL_CERT_FILE is not set. ca_bundle = get_ca_bundle_from_env() assert ca_bundle is not None and ca_bundle.endswith("tests") del os.environ["SSL_CERT_DIR"] os.environ["SSL_CERT_FILE"] = str(TESTS_DIR / "test_utils.py") # SSL_CERT_FILE is correctly set, SSL_CERT_DIR is not set. ca_bundle = get_ca_bundle_from_env() assert ca_bundle is not None and ca_bundle.endswith("tests/test_utils.py") os.environ["SSL_CERT_FILE"] = "wrongfile" # SSL_CERT_FILE is set with wrong file, SSL_CERT_DIR is not set. assert get_ca_bundle_from_env() is None del os.environ["SSL_CERT_FILE"] os.environ["SSL_CERT_DIR"] = "wrongpath" # SSL_CERT_DIR is set with wrong path, SSL_CERT_FILE is not set. assert get_ca_bundle_from_env() is None os.environ["SSL_CERT_DIR"] = str(TESTS_DIR) os.environ["SSL_CERT_FILE"] = str(TESTS_DIR / "test_utils.py") # Two environments is correctly set. ca_bundle = get_ca_bundle_from_env() assert ca_bundle is not None and ca_bundle.endswith("tests/test_utils.py") os.environ["SSL_CERT_FILE"] = "wrongfile" # Two environments is set but SSL_CERT_FILE is not a file. ca_bundle = get_ca_bundle_from_env() assert ca_bundle is not None and ca_bundle.endswith("tests") os.environ["SSL_CERT_DIR"] = "wrongpath" # Two environments is set but both are not correct. assert get_ca_bundle_from_env() is None @pytest.mark.parametrize( ["environment", "proxies"], [ ({}, {}), ({"HTTP_PROXY": "http://127.0.0.1"}, {"http://": "http://127.0.0.1"}), ( {"https_proxy": "http://127.0.0.1", "HTTP_PROXY": "https://127.0.0.1"}, {"https://": "http://127.0.0.1", "http://": "https://127.0.0.1"}, ), ({"all_proxy": "http://127.0.0.1"}, {"all://": "http://127.0.0.1"}), ({"TRAVIS_APT_PROXY": "http://127.0.0.1"}, {}), ({"no_proxy": "127.0.0.1"}, {"all://127.0.0.1": None}), ({"no_proxy": "192.168.0.0/16"}, {"all://192.168.0.0/16": None}), ({"no_proxy": "::1"}, {"all://[::1]": None}), ({"no_proxy": "localhost"}, {"all://localhost": None}), ({"no_proxy": "github.com"}, {"all://*github.com": None}), ({"no_proxy": ".github.com"}, {"all://*.github.com": None}), ({"no_proxy": "http://github.com"}, {"http://github.com": None}), ], ) def test_get_environment_proxies(environment, proxies): os.environ.update(environment) assert get_environment_proxies() == proxies @pytest.mark.parametrize( "headers, output", [ ([("content-type", "text/html")], [("content-type", "text/html")]), ([("authorization", "s3kr3t")], [("authorization", "[secure]")]), ([("proxy-authorization", "s3kr3t")], [("proxy-authorization", "[secure]")]), ], ) def test_obfuscate_sensitive_headers(headers, output): bytes_headers = [(k.encode(), v.encode()) for k, v in headers] bytes_output = [(k.encode(), v.encode()) for k, v in output] assert list(obfuscate_sensitive_headers(headers)) == output assert list(obfuscate_sensitive_headers(bytes_headers)) == bytes_output def test_same_origin(): origin1 = httpx.URL("https://example.com") origin2 = httpx.URL("HTTPS://EXAMPLE.COM:443") assert same_origin(origin1, origin2) def test_not_same_origin(): origin1 = httpx.URL("https://example.com") origin2 = httpx.URL("HTTP://EXAMPLE.COM") assert not same_origin(origin1, origin2) def test_is_https_redirect(): url = httpx.URL("http://example.com") location = httpx.URL("https://example.com") assert is_https_redirect(url, location) def test_is_not_https_redirect(): url = httpx.URL("http://example.com") location = httpx.URL("https://www.example.com") assert not is_https_redirect(url, location) def test_is_not_https_redirect_if_not_default_ports(): url = httpx.URL("http://example.com:9999") location = httpx.URL("https://example.com:1337") assert not is_https_redirect(url, location) @pytest.mark.parametrize( ["pattern", "url", "expected"], [ ("http://example.com", "http://example.com", True), ("http://example.com", "https://example.com", False), ("http://example.com", "http://other.com", False), ("http://example.com:123", "http://example.com:123", True), ("http://example.com:123", "http://example.com:456", False), ("http://example.com:123", "http://example.com", False), ("all://example.com", "http://example.com", True), ("all://example.com", "https://example.com", True), ("http://", "http://example.com", True), ("http://", "https://example.com", False), ("all://", "https://example.com:123", True), ("", "https://example.com:123", True), ], ) def test_url_matches(pattern, url, expected): pattern = URLPattern(pattern) assert pattern.matches(httpx.URL(url)) == expected def test_pattern_priority(): matchers = [ URLPattern("all://"), URLPattern("http://"), URLPattern("http://example.com"), URLPattern("http://example.com:123"), ] random.shuffle(matchers) assert sorted(matchers) == [ URLPattern("http://example.com:123"), URLPattern("http://example.com"), URLPattern("http://"), URLPattern("all://"), ] httpx-0.26.0/tests/test_wsgi.py000066400000000000000000000125631454054354600165130ustar00rootroot00000000000000import sys import typing import wsgiref.validate from functools import partial from io import StringIO import pytest import httpx if typing.TYPE_CHECKING: # pragma: no cover from _typeshed.wsgi import StartResponse, WSGIApplication, WSGIEnvironment def application_factory(output: typing.Iterable[bytes]) -> "WSGIApplication": def application(environ, start_response): status = "200 OK" response_headers = [ ("Content-type", "text/plain"), ] start_response(status, response_headers) for item in output: yield item return wsgiref.validate.validator(application) def echo_body( environ: "WSGIEnvironment", start_response: "StartResponse" ) -> typing.Iterable[bytes]: status = "200 OK" output = environ["wsgi.input"].read() response_headers = [ ("Content-type", "text/plain"), ] start_response(status, response_headers) return [output] def echo_body_with_response_stream( environ: "WSGIEnvironment", start_response: "StartResponse" ) -> typing.Iterable[bytes]: status = "200 OK" response_headers = [("Content-Type", "text/plain")] start_response(status, response_headers) def output_generator(f: typing.IO[bytes]) -> typing.Iterator[bytes]: while True: output = f.read(2) if not output: break yield output return output_generator(f=environ["wsgi.input"]) def raise_exc( environ: "WSGIEnvironment", start_response: "StartResponse", exc: typing.Type[Exception] = ValueError, ) -> typing.Iterable[bytes]: status = "500 Server Error" output = b"Nope!" response_headers = [ ("Content-type", "text/plain"), ] try: raise exc() except exc: exc_info = sys.exc_info() start_response(status, response_headers, exc_info) return [output] def log_to_wsgi_log_buffer(environ, start_response): print("test1", file=environ["wsgi.errors"]) environ["wsgi.errors"].write("test2") return echo_body(environ, start_response) def test_wsgi(): client = httpx.Client(app=application_factory([b"Hello, World!"])) response = client.get("http://www.example.org/") assert response.status_code == 200 assert response.text == "Hello, World!" def test_wsgi_upload(): client = httpx.Client(app=echo_body) response = client.post("http://www.example.org/", content=b"example") assert response.status_code == 200 assert response.text == "example" def test_wsgi_upload_with_response_stream(): client = httpx.Client(app=echo_body_with_response_stream) response = client.post("http://www.example.org/", content=b"example") assert response.status_code == 200 assert response.text == "example" def test_wsgi_exc(): client = httpx.Client(app=raise_exc) with pytest.raises(ValueError): client.get("http://www.example.org/") def test_wsgi_http_error(): client = httpx.Client(app=partial(raise_exc, exc=RuntimeError)) with pytest.raises(RuntimeError): client.get("http://www.example.org/") def test_wsgi_generator(): output = [b"", b"", b"Some content", b" and more content"] client = httpx.Client(app=application_factory(output)) response = client.get("http://www.example.org/") assert response.status_code == 200 assert response.text == "Some content and more content" def test_wsgi_generator_empty(): output = [b"", b"", b"", b""] client = httpx.Client(app=application_factory(output)) response = client.get("http://www.example.org/") assert response.status_code == 200 assert response.text == "" def test_logging(): buffer = StringIO() transport = httpx.WSGITransport(app=log_to_wsgi_log_buffer, wsgi_errors=buffer) client = httpx.Client(transport=transport) response = client.post("http://www.example.org/", content=b"example") assert response.status_code == 200 # no errors buffer.seek(0) assert buffer.read() == "test1\ntest2" @pytest.mark.parametrize( "url, expected_server_port", [ pytest.param("http://www.example.org", "80", id="auto-http"), pytest.param("https://www.example.org", "443", id="auto-https"), pytest.param("http://www.example.org:8000", "8000", id="explicit-port"), ], ) def test_wsgi_server_port(url: str, expected_server_port: str) -> None: """ SERVER_PORT is populated correctly from the requested URL. """ hello_world_app = application_factory([b"Hello, World!"]) server_port: typing.Optional[str] = None def app(environ, start_response): nonlocal server_port server_port = environ["SERVER_PORT"] return hello_world_app(environ, start_response) client = httpx.Client(app=app) response = client.get(url) assert response.status_code == 200 assert response.text == "Hello, World!" assert server_port == expected_server_port def test_wsgi_server_protocol(): server_protocol = None def app(environ, start_response): nonlocal server_protocol server_protocol = environ["SERVER_PROTOCOL"] start_response("200 OK", [("Content-Type", "text/plain")]) return [b"success"] with httpx.Client(app=app, base_url="http://testserver") as client: response = client.get("/") assert response.status_code == 200 assert response.text == "success" assert server_protocol == "HTTP/1.1"