././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1713285830.559115 aiohttp-3.9.5/0000755000175100001770000000000014607525307012616 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/CHANGES.rst0000644000175100001770000025670214607525266014440 0ustar00runnerdocker.. You should *NOT* be adding new change log entries to this file, this file is managed by towncrier. You *may* edit previous change logs to fix problems like typo corrections or such. To add a new change log entry, please see https://pip.pypa.io/en/latest/development/#adding-a-news-entry we named the news folder "changes". WARNING: Don't drop the next directive! .. towncrier release notes start 3.9.5 (2024-04-16) ================== Bug fixes --------- - Fixed "Unclosed client session" when initialization of :py:class:`~aiohttp.ClientSession` fails -- by :user:`NewGlad`. *Related issues and pull requests on GitHub:* :issue:`8253`. - Fixed regression (from :pr:`8280`) with adding ``Content-Disposition`` to the ``form-data`` part after appending to writer -- by :user:`Dreamsorcerer`/:user:`Olegt0rr`. *Related issues and pull requests on GitHub:* :issue:`8332`. - Added default ``Content-Disposition`` in ``multipart/form-data`` responses to avoid broken form-data responses -- by :user:`Dreamsorcerer`. *Related issues and pull requests on GitHub:* :issue:`8335`. ---- 3.9.4 (2024-04-11) ================== Bug fixes --------- - The asynchronous internals now set the underlying causes when assigning exceptions to the future objects -- by :user:`webknjaz`. *Related issues and pull requests on GitHub:* :issue:`8089`. - Treated values of ``Accept-Encoding`` header as case-insensitive when checking for gzip files -- by :user:`steverep`. *Related issues and pull requests on GitHub:* :issue:`8104`. - Improved the DNS resolution performance on cache hit -- by :user:`bdraco`. This is achieved by avoiding an :mod:`asyncio` task creation in this case. *Related issues and pull requests on GitHub:* :issue:`8163`. - Changed the type annotations to allow ``dict`` on :meth:`aiohttp.MultipartWriter.append`, :meth:`aiohttp.MultipartWriter.append_json` and :meth:`aiohttp.MultipartWriter.append_form` -- by :user:`cakemanny` *Related issues and pull requests on GitHub:* :issue:`7741`. - Ensure websocket transport is closed when client does not close it -- by :user:`bdraco`. The transport could remain open if the client did not close it. This change ensures the transport is closed when the client does not close it. *Related issues and pull requests on GitHub:* :issue:`8200`. - Leave websocket transport open if receive times out or is cancelled -- by :user:`bdraco`. This restores the behavior prior to the change in #7978. *Related issues and pull requests on GitHub:* :issue:`8251`. - Fixed content not being read when an upgrade request was not supported with the pure Python implementation. -- by :user:`bdraco`. *Related issues and pull requests on GitHub:* :issue:`8252`. - Fixed a race condition with incoming connections during server shutdown -- by :user:`Dreamsorcerer`. *Related issues and pull requests on GitHub:* :issue:`8271`. - Fixed ``multipart/form-data`` compliance with :rfc:`7578` -- by :user:`Dreamsorcerer`. *Related issues and pull requests on GitHub:* :issue:`8280`. - Fixed blocking I/O in the event loop while processing files in a POST request -- by :user:`bdraco`. *Related issues and pull requests on GitHub:* :issue:`8283`. - Escaped filenames in static view -- by :user:`bdraco`. *Related issues and pull requests on GitHub:* :issue:`8317`. - Fixed the pure python parser to mark a connection as closing when a response has no length -- by :user:`Dreamsorcerer`. *Related issues and pull requests on GitHub:* :issue:`8320`. Features -------- - Upgraded *llhttp* to 9.2.1, and started rejecting obsolete line folding in Python parser to match -- by :user:`Dreamsorcerer`. *Related issues and pull requests on GitHub:* :issue:`8146`, :issue:`8292`. Deprecations (removal in next major release) -------------------------------------------- - Deprecated ``content_transfer_encoding`` parameter in :py:meth:`FormData.add_field() ` -- by :user:`Dreamsorcerer`. *Related issues and pull requests on GitHub:* :issue:`8280`. Improved documentation ---------------------- - Added a note about canceling tasks to avoid delaying server shutdown -- by :user:`Dreamsorcerer`. *Related issues and pull requests on GitHub:* :issue:`8267`. Contributor-facing changes -------------------------- - The pull request template is now asking the contributors to answer a question about the long-term maintenance challenges they envision as a result of merging their patches -- by :user:`webknjaz`. *Related issues and pull requests on GitHub:* :issue:`8099`. - Updated CI and documentation to use NPM clean install and upgrade node to version 18 -- by :user:`steverep`. *Related issues and pull requests on GitHub:* :issue:`8116`. - A pytest fixture ``hello_txt`` was introduced to aid static file serving tests in :file:`test_web_sendfile_functional.py`. It dynamically provisions ``hello.txt`` file variants shared across the tests in the module. -- by :user:`steverep` *Related issues and pull requests on GitHub:* :issue:`8136`. Packaging updates and notes for downstreams ------------------------------------------- - Added an ``internal`` pytest marker for tests which should be skipped by packagers (use ``-m 'not internal'`` to disable them) -- by :user:`Dreamsorcerer`. *Related issues and pull requests on GitHub:* :issue:`8299`. ---- 3.9.3 (2024-01-29) ================== Bug fixes --------- - Fixed backwards compatibility breakage (in 3.9.2) of ``ssl`` parameter when set outside of ``ClientSession`` (e.g. directly in ``TCPConnector``) -- by :user:`Dreamsorcerer`. *Related issues and pull requests on GitHub:* :issue:`8097`, :issue:`8098`. Miscellaneous internal changes ------------------------------ - Improved test suite handling of paths and temp files to consistently use pathlib and pytest fixtures. *Related issues and pull requests on GitHub:* :issue:`3957`. ---- 3.9.2 (2024-01-28) ================== Bug fixes --------- - Fixed server-side websocket connection leak. *Related issues and pull requests on GitHub:* :issue:`7978`. - Fixed ``web.FileResponse`` doing blocking I/O in the event loop. *Related issues and pull requests on GitHub:* :issue:`8012`. - Fixed double compress when compression enabled and compressed file exists in server file responses. *Related issues and pull requests on GitHub:* :issue:`8014`. - Added runtime type check for ``ClientSession`` ``timeout`` parameter. *Related issues and pull requests on GitHub:* :issue:`8021`. - Fixed an unhandled exception in the Python HTTP parser on header lines starting with a colon -- by :user:`pajod`. Invalid request lines with anything but a dot between the HTTP major and minor version are now rejected. Invalid header field names containing question mark or slash are now rejected. Such requests are incompatible with :rfc:`9110#section-5.6.2` and are not known to be of any legitimate use. *Related issues and pull requests on GitHub:* :issue:`8074`. - Improved validation of paths for static resources requests to the server -- by :user:`bdraco`. *Related issues and pull requests on GitHub:* :issue:`8079`. Features -------- - Added support for passing :py:data:`True` to ``ssl`` parameter in ``ClientSession`` while deprecating :py:data:`None` -- by :user:`xiangyan99`. *Related issues and pull requests on GitHub:* :issue:`7698`. Breaking changes ---------------- - Fixed an unhandled exception in the Python HTTP parser on header lines starting with a colon -- by :user:`pajod`. Invalid request lines with anything but a dot between the HTTP major and minor version are now rejected. Invalid header field names containing question mark or slash are now rejected. Such requests are incompatible with :rfc:`9110#section-5.6.2` and are not known to be of any legitimate use. *Related issues and pull requests on GitHub:* :issue:`8074`. Improved documentation ---------------------- - Fixed examples of ``fallback_charset_resolver`` function in the :doc:`client_advanced` document. -- by :user:`henry0312`. *Related issues and pull requests on GitHub:* :issue:`7995`. - The Sphinx setup was updated to avoid showing the empty changelog draft section in the tagged release documentation builds on Read The Docs -- by :user:`webknjaz`. *Related issues and pull requests on GitHub:* :issue:`8067`. Packaging updates and notes for downstreams ------------------------------------------- - The changelog categorization was made clearer. The contributors can now mark their fragment files more accurately -- by :user:`webknjaz`. The new category tags are: * ``bugfix`` * ``feature`` * ``deprecation`` * ``breaking`` (previously, ``removal``) * ``doc`` * ``packaging`` * ``contrib`` * ``misc`` *Related issues and pull requests on GitHub:* :issue:`8066`. Contributor-facing changes -------------------------- - Updated :ref:`contributing/Tests coverage ` section to show how we use ``codecov`` -- by :user:`Dreamsorcerer`. *Related issues and pull requests on GitHub:* :issue:`7916`. - The changelog categorization was made clearer. The contributors can now mark their fragment files more accurately -- by :user:`webknjaz`. The new category tags are: * ``bugfix`` * ``feature`` * ``deprecation`` * ``breaking`` (previously, ``removal``) * ``doc`` * ``packaging`` * ``contrib`` * ``misc`` *Related issues and pull requests on GitHub:* :issue:`8066`. Miscellaneous internal changes ------------------------------ - Replaced all ``tmpdir`` fixtures with ``tmp_path`` in test suite. *Related issues and pull requests on GitHub:* :issue:`3551`. ---- 3.9.1 (2023-11-26) ================== Bugfixes -------- - Fixed importing aiohttp under PyPy on Windows. `#7848 `_ - Fixed async concurrency safety in websocket compressor. `#7865 `_ - Fixed ``ClientResponse.close()`` releasing the connection instead of closing. `#7869 `_ - Fixed a regression where connection may get closed during upgrade. -- by :user:`Dreamsorcerer` `#7879 `_ - Fixed messages being reported as upgraded without an Upgrade header in Python parser. -- by :user:`Dreamsorcerer` `#7895 `_ ---- 3.9.0 (2023-11-18) ================== Features -------- - Introduced ``AppKey`` for static typing support of ``Application`` storage. See https://docs.aiohttp.org/en/stable/web_advanced.html#application-s-config `#5864 `_ - Added a graceful shutdown period which allows pending tasks to complete before the application's cleanup is called. The period can be adjusted with the ``shutdown_timeout`` parameter. -- by :user:`Dreamsorcerer`. See https://docs.aiohttp.org/en/latest/web_advanced.html#graceful-shutdown `#7188 `_ - Added `handler_cancellation `_ parameter to cancel web handler on client disconnection. -- by :user:`mosquito` This (optionally) reintroduces a feature removed in a previous release. Recommended for those looking for an extra level of protection against denial-of-service attacks. `#7056 `_ - Added support for setting response header parameters ``max_line_size`` and ``max_field_size``. `#2304 `_ - Added ``auto_decompress`` parameter to ``ClientSession.request`` to override ``ClientSession._auto_decompress``. -- by :user:`Daste745` `#3751 `_ - Changed ``raise_for_status`` to allow a coroutine. `#3892 `_ - Added client brotli compression support (optional with runtime check). `#5219 `_ - Added ``client_max_size`` to ``BaseRequest.clone()`` to allow overriding the request body size. -- :user:`anesabml`. `#5704 `_ - Added a middleware type alias ``aiohttp.typedefs.Middleware``. `#5898 `_ - Exported ``HTTPMove`` which can be used to catch any redirection request that has a location -- :user:`dreamsorcerer`. `#6594 `_ - Changed the ``path`` parameter in ``web.run_app()`` to accept a ``pathlib.Path`` object. `#6839 `_ - Performance: Skipped filtering ``CookieJar`` when the jar is empty or all cookies have expired. `#7819 `_ - Performance: Only check origin if insecure scheme and there are origins to treat as secure, in ``CookieJar.filter_cookies()``. `#7821 `_ - Performance: Used timestamp instead of ``datetime`` to achieve faster cookie expiration in ``CookieJar``. `#7824 `_ - Added support for passing a custom server name parameter to HTTPS connection. `#7114 `_ - Added support for using Basic Auth credentials from :file:`.netrc` file when making HTTP requests with the :py:class:`~aiohttp.ClientSession` ``trust_env`` argument is set to ``True``. -- by :user:`yuvipanda`. `#7131 `_ - Turned access log into no-op when the logger is disabled. `#7240 `_ - Added typing information to ``RawResponseMessage``. -- by :user:`Gobot1234` `#7365 `_ - Removed ``async-timeout`` for Python 3.11+ (replaced with ``asyncio.timeout()`` on newer releases). `#7502 `_ - Added support for ``brotlicffi`` as an alternative to ``brotli`` (fixing Brotli support on PyPy). `#7611 `_ - Added ``WebSocketResponse.get_extra_info()`` to access a protocol transport's extra info. `#7078 `_ - Allow ``link`` argument to be set to None/empty in HTTP 451 exception. `#7689 `_ Bugfixes -------- - Implemented stripping the trailing dots from fully-qualified domain names in ``Host`` headers and TLS context when acting as an HTTP client. This allows the client to connect to URLs with FQDN host name like ``https://example.com./``. -- by :user:`martin-sucha`. `#3636 `_ - Fixed client timeout not working when incoming data is always available without waiting. -- by :user:`Dreamsorcerer`. `#5854 `_ - Fixed ``readuntil`` to work with a delimiter of more than one character. `#6701 `_ - Added ``__repr__`` to ``EmptyStreamReader`` to avoid ``AttributeError``. `#6916 `_ - Fixed bug when using ``TCPConnector`` with ``ttl_dns_cache=0``. `#7014 `_ - Fixed response returned from expect handler being thrown away. -- by :user:`Dreamsorcerer` `#7025 `_ - Avoided raising ``UnicodeDecodeError`` in multipart and in HTTP headers parsing. `#7044 `_ - Changed ``sock_read`` timeout to start after writing has finished, avoiding read timeouts caused by an unfinished write. -- by :user:`dtrifiro` `#7149 `_ - Fixed missing query in tracing method URLs when using ``yarl`` 1.9+. `#7259 `_ - Changed max 32-bit timestamp to an aware datetime object, for consistency with the non-32-bit one, and to avoid a ``DeprecationWarning`` on Python 3.12. `#7302 `_ - Fixed ``EmptyStreamReader.iter_chunks()`` never ending. -- by :user:`mind1m` `#7616 `_ - Fixed a rare ``RuntimeError: await wasn't used with future`` exception. -- by :user:`stalkerg` `#7785 `_ - Fixed issue with insufficient HTTP method and version validation. `#7700 `_ - Added check to validate that absolute URIs have schemes. `#7712 `_ - Fixed unhandled exception when Python HTTP parser encounters unpaired Unicode surrogates. `#7715 `_ - Updated parser to disallow invalid characters in header field names and stop accepting LF as a request line separator. `#7719 `_ - Fixed Python HTTP parser not treating 204/304/1xx as an empty body. `#7755 `_ - Ensure empty body response for 1xx/204/304 per RFC 9112 sec 6.3. `#7756 `_ - Fixed an issue when a client request is closed before completing a chunked payload. -- by :user:`Dreamsorcerer` `#7764 `_ - Edge Case Handling for ResponseParser for missing reason value. `#7776 `_ - Fixed ``ClientWebSocketResponse.close_code`` being erroneously set to ``None`` when there are concurrent async tasks receiving data and closing the connection. `#7306 `_ - Added HTTP method validation. `#6533 `_ - Fixed arbitrary sequence types being allowed to inject values via version parameter. -- by :user:`Dreamsorcerer` `#7835 `_ - Performance: Fixed increase in latency with small messages from websocket compression changes. `#7797 `_ Improved Documentation ---------------------- - Fixed the `ClientResponse.release`'s type in the doc. Changed from `comethod` to `method`. `#5836 `_ - Added information on behavior of base_url parameter in `ClientSession`. `#6647 `_ - Fixed `ClientResponseError` docs. `#6700 `_ - Updated Redis code examples to follow the latest API. `#6907 `_ - Added a note about possibly needing to update headers when using ``on_response_prepare``. -- by :user:`Dreamsorcerer` `#7283 `_ - Completed ``trust_env`` parameter description to honor ``wss_proxy``, ``ws_proxy`` or ``no_proxy`` env. `#7325 `_ - Expanded SSL documentation with more examples (e.g. how to use certifi). -- by :user:`Dreamsorcerer` `#7334 `_ - Fix, update, and improve client exceptions documentation. `#7733 `_ Deprecations and Removals ------------------------- - Added ``shutdown_timeout`` parameter to ``BaseRunner``, while deprecating ``shutdown_timeout`` parameter from ``BaseSite``. -- by :user:`Dreamsorcerer` `#7718 `_ - Dropped Python 3.6 support. `#6378 `_ - Dropped Python 3.7 support. -- by :user:`Dreamsorcerer` `#7336 `_ - Removed support for abandoned ``tokio`` event loop. -- by :user:`Dreamsorcerer` `#7281 `_ Misc ---- - Made ``print`` argument in ``run_app()`` optional. `#3690 `_ - Improved performance of ``ceil_timeout`` in some cases. `#6316 `_ - Changed importing Gunicorn to happen on-demand, decreasing import time by ~53%. -- :user:`Dreamsorcerer` `#6591 `_ - Improved import time by replacing ``http.server`` with ``http.HTTPStatus``. `#6903 `_ - Fixed annotation of ``ssl`` parameter to disallow ``True``. -- by :user:`Dreamsorcerer`. `#7335 `_ ---- 3.8.6 (2023-10-07) ================== Security bugfixes ----------------- - Upgraded the vendored copy of llhttp_ to v9.1.3 -- by :user:`Dreamsorcerer` Thanks to :user:`kenballus` for reporting this, see https://github.com/aio-libs/aiohttp/security/advisories/GHSA-pjjw-qhg8-p2p9. .. _llhttp: https://llhttp.org `#7647 `_ - Updated Python parser to comply with RFCs 9110/9112 -- by :user:`Dreamorcerer` Thanks to :user:`kenballus` for reporting this, see https://github.com/aio-libs/aiohttp/security/advisories/GHSA-gfw2-4jvh-wgfg. `#7663 `_ Deprecation ----------- - Added ``fallback_charset_resolver`` parameter in ``ClientSession`` to allow a user-supplied character set detection function. Character set detection will no longer be included in 3.9 as a default. If this feature is needed, please use `fallback_charset_resolver `_. `#7561 `_ Features -------- - Enabled lenient response parsing for more flexible parsing in the client (this should resolve some regressions when dealing with badly formatted HTTP responses). -- by :user:`Dreamsorcerer` `#7490 `_ Bugfixes -------- - Fixed ``PermissionError`` when ``.netrc`` is unreadable due to permissions. `#7237 `_ - Fixed output of parsing errors pointing to a ``\n``. -- by :user:`Dreamsorcerer` `#7468 `_ - Fixed ``GunicornWebWorker`` max_requests_jitter not working. `#7518 `_ - Fixed sorting in ``filter_cookies`` to use cookie with longest path. -- by :user:`marq24`. `#7577 `_ - Fixed display of ``BadStatusLine`` messages from llhttp_. -- by :user:`Dreamsorcerer` `#7651 `_ ---- 3.8.5 (2023-07-19) ================== Security bugfixes ----------------- - Upgraded the vendored copy of llhttp_ to v8.1.1 -- by :user:`webknjaz` and :user:`Dreamsorcerer`. Thanks to :user:`sethmlarson` for reporting this and providing us with comprehensive reproducer, workarounds and fixing details! For more information, see https://github.com/aio-libs/aiohttp/security/advisories/GHSA-45c4-8wx5-qw6w. .. _llhttp: https://llhttp.org `#7346 `_ Features -------- - Added information to C parser exceptions to show which character caused the error. -- by :user:`Dreamsorcerer` `#7366 `_ Bugfixes -------- - Fixed a transport is :data:`None` error -- by :user:`Dreamsorcerer`. `#3355 `_ ---- 3.8.4 (2023-02-12) ================== Bugfixes -------- - Fixed incorrectly overwriting cookies with the same name and domain, but different path. `#6638 `_ - Fixed ``ConnectionResetError`` not being raised after client disconnection in SSL environments. `#7180 `_ ---- 3.8.3 (2022-09-21) ================== .. attention:: This is the last :doc:`aiohttp ` release tested under Python 3.6. The 3.9 stream is dropping it from the CI and the distribution package metadata. Bugfixes -------- - Increased the upper boundary of the :doc:`multidict:index` dependency to allow for the version 6 -- by :user:`hugovk`. It used to be limited below version 7 in :doc:`aiohttp ` v3.8.1 but was lowered in v3.8.2 via :pr:`6550` and never brought back, causing problems with dependency pins when upgrading. :doc:`aiohttp ` v3.8.3 fixes that by recovering the original boundary of ``< 7``. `#6950 `_ ---- 3.8.2 (2022-09-20, subsequently yanked on 2022-09-21) ===================================================== Bugfixes -------- - Support registering OPTIONS HTTP method handlers via RouteTableDef. `#4663 `_ - Started supporting ``authority-form`` and ``absolute-form`` URLs on the server-side. `#6227 `_ - Fix Python 3.11 alpha incompatibilities by using Cython 0.29.25 `#6396 `_ - Remove a deprecated usage of pytest.warns(None) `#6663 `_ - Fix regression where ``asyncio.CancelledError`` occurs on client disconnection. `#6719 `_ - Export :py:class:`~aiohttp.web.PrefixedSubAppResource` under :py:mod:`aiohttp.web` -- by :user:`Dreamsorcerer`. This fixes a regression introduced by :pr:`3469`. `#6889 `_ - Dropped the :class:`object` type possibility from the :py:attr:`aiohttp.ClientSession.timeout` property return type declaration. `#6917 `_, `#6923 `_ Improved Documentation ---------------------- - Added clarification on configuring the app object with settings such as a db connection. `#4137 `_ - Edited the web.run_app declaration. `#6401 `_ - Dropped the :class:`object` type possibility from the :py:attr:`aiohttp.ClientSession.timeout` property return type declaration. `#6917 `_, `#6923 `_ Deprecations and Removals ------------------------- - Drop Python 3.5 support, aiohttp works on 3.6+ now. `#4046 `_ Misc ---- - `#6369 `_, `#6399 `_, `#6550 `_, `#6708 `_, `#6757 `_, `#6857 `_, `#6872 `_ ---- 3.8.1 (2021-11-14) ================== Bugfixes -------- - Fix the error in handling the return value of `getaddrinfo`. `getaddrinfo` will return an `(int, bytes)` tuple, if CPython could not handle the address family. It will cause a index out of range error in aiohttp. For example, if user compile CPython with `--disable-ipv6` option but his system enable the ipv6. `#5901 `_ - Do not install "examples" as a top-level package. `#6189 `_ - Restored ability to connect IPv6-only host. `#6195 `_ - Remove ``Signal`` from ``__all__``, replace ``aiohttp.Signal`` with ``aiosignal.Signal`` in docs `#6201 `_ - Made chunked encoding HTTP header check stricter. `#6305 `_ Improved Documentation ---------------------- - update quick starter demo codes. `#6240 `_ - Added an explanation of how tiny timeouts affect performance to the client reference document. `#6274 `_ - Add flake8-docstrings to flake8 configuration, enable subset of checks. `#6276 `_ - Added information on running complex applications with additional tasks/processes -- :user:`Dreamsorcerer`. `#6278 `_ Misc ---- - `#6205 `_ ---- 3.8.0 (2021-10-31) ================== Features -------- - Added a ``GunicornWebWorker`` feature for extending the aiohttp server configuration by allowing the 'wsgi' coroutine to return ``web.AppRunner`` object. `#2988 `_ - Switch from ``http-parser`` to ``llhttp`` `#3561 `_ - Use Brotli instead of brotlipy `#3803 `_ - Disable implicit switch-back to pure python mode. The build fails loudly if aiohttp cannot be compiled with C Accelerators. Use AIOHTTP_NO_EXTENSIONS=1 to explicitly disable C Extensions complication and switch to Pure-Python mode. Note that Pure-Python mode is significantly slower than compiled one. `#3828 `_ - Make access log use local time with timezone `#3853 `_ - Implemented ``readuntil`` in ``StreamResponse`` `#4054 `_ - FileResponse now supports ETag. `#4594 `_ - Add a request handler type alias ``aiohttp.typedefs.Handler``. `#4686 `_ - ``AioHTTPTestCase`` is more async friendly now. For people who use unittest and are used to use :py:exc:`~unittest.TestCase` it will be easier to write new test cases like the sync version of the :py:exc:`~unittest.TestCase` class, without using the decorator `@unittest_run_loop`, just `async def test_*`. The only difference is that for the people using python3.7 and below a new dependency is needed, it is ``asynctestcase``. `#4700 `_ - Add validation of HTTP header keys and values to prevent header injection. `#4818 `_ - Add predicate to ``AbstractCookieJar.clear``. Add ``AbstractCookieJar.clear_domain`` to clean all domain and subdomains cookies only. `#4942 `_ - Add keepalive_timeout parameter to web.run_app. `#5094 `_ - Tracing for client sent headers `#5105 `_ - Make type hints for http parser stricter `#5267 `_ - Add final declarations for constants. `#5275 `_ - Switch to external frozenlist and aiosignal libraries. `#5293 `_ - Don't send secure cookies by insecure transports. By default, the transport is secure if https or wss scheme is used. Use `CookieJar(treat_as_secure_origin="http://127.0.0.1")` to override the default security checker. `#5571 `_ - Always create a new event loop in ``aiohttp.web.run_app()``. This adds better compatibility with ``asyncio.run()`` or if trying to run multiple apps in sequence. `#5572 `_ - Add ``aiohttp.pytest_plugin.AiohttpClient`` for static typing of pytest plugin. `#5585 `_ - Added a ``socket_factory`` argument to ``BaseTestServer``. `#5844 `_ - Add compression strategy parameter to enable_compression method. `#5909 `_ - Added support for Python 3.10 to Github Actions CI/CD workflows and fix the related deprecation warnings -- :user:`Hanaasagi`. `#5927 `_ - Switched ``chardet`` to ``charset-normalizer`` for guessing the HTTP payload body encoding -- :user:`Ousret`. `#5930 `_ - Added optional auto_decompress argument for HttpRequestParser `#5957 `_ - Added support for HTTPS proxies to the extent CPython's :py:mod:`asyncio` supports it -- by :user:`bmbouter`, :user:`jborean93` and :user:`webknjaz`. `#5992 `_ - Added ``base_url`` parameter to the initializer of :class:`~aiohttp.ClientSession`. `#6013 `_ - Add Trove classifier and create binary wheels for 3.10. -- :user:`hugovk`. `#6079 `_ - Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes — :user:`asvetlov`. `#6139 `_ - Started shipping platform-specific arm64 wheels for Apple Silicon — :user:`asvetlov`. `#6139 `_ Bugfixes -------- - Modify _drain_helper() to handle concurrent `await resp.write(...)` or `ws.send_json(...)` calls without race-condition. `#2934 `_ - Started using `MultiLoopChildWatcher` when it's available under POSIX while setting up the test I/O loop. `#3450 `_ - Only encode content-disposition filename parameter using percent-encoding. Other parameters are encoded to quoted-string or RFC2231 extended parameter value. `#4012 `_ - Fixed HTTP client requests to honor ``no_proxy`` environment variables. `#4431 `_ - Fix supporting WebSockets proxies configured via environment variables. `#4648 `_ - Change return type on URLDispatcher to UrlMappingMatchInfo to improve type annotations. `#4748 `_ - Ensure a cleanup context is cleaned up even when an exception occurs during startup. `#4799 `_ - Added a new exception type for Unix socket client errors which provides a more useful error message. `#4984 `_ - Remove Transfer-Encoding and Content-Type headers for 204 in StreamResponse `#5106 `_ - Only depend on typing_extensions for Python <3.8 `#5107 `_ - Add ABNORMAL_CLOSURE and BAD_GATEWAY to WSCloseCode `#5192 `_ - Fix cookies disappearing from HTTPExceptions. `#5233 `_ - StaticResource prefixes no longer match URLs with a non-folder prefix. For example ``routes.static('/foo', '/foo')`` no longer matches the URL ``/foobar``. Previously, this would attempt to load the file ``/foo/ar``. `#5250 `_ - Acquire the connection before running traces to prevent race condition. `#5259 `_ - Add missing slots to ```_RequestContextManager`` and ``_WSRequestContextManager`` `#5329 `_ - Ensure sending a zero byte file does not throw an exception (round 2) `#5380 `_ - Set "text/plain" when data is an empty string in client requests. `#5392 `_ - Stop automatically releasing the ``ClientResponse`` object on calls to the ``ok`` property for the failed requests. `#5403 `_ - Include query parameters from `params` keyword argument in tracing `URL`. `#5432 `_ - Fix annotations `#5466 `_ - Fixed the multipart POST requests processing to always release file descriptors for the ``tempfile.Temporaryfile``-created ``_io.BufferedRandom`` instances of files sent within multipart request bodies via HTTP POST requests -- by :user:`webknjaz`. `#5494 `_ - Fix 0 being incorrectly treated as an immediate timeout. `#5527 `_ - Fixes failing tests when an environment variable _proxy is set. `#5554 `_ - Replace deprecated app handler design in ``tests/autobahn/server.py`` with call to ``web.run_app``; replace deprecated ``aiohttp.ws_connect`` calls in ``tests/autobahn/client.py`` with ``aiohttp.ClienSession.ws_connect``. `#5606 `_ - Fixed test for ``HTTPUnauthorized`` that access the ``text`` argument. This is not used in any part of the code, so it's removed now. `#5657 `_ - Remove incorrect default from docs `#5727 `_ - Remove external test dependency to http://httpbin.org `#5840 `_ - Don't cancel current task when entering a cancelled timer. `#5853 `_ - Added ``params`` keyword argument to ``ClientSession.ws_connect``. -- :user:`hoh`. `#5868 `_ - Uses :py:class:`~asyncio.ThreadedChildWatcher` under POSIX to allow setting up test loop in non-main thread. `#5877 `_ - Fix the error in handling the return value of `getaddrinfo`. `getaddrinfo` will return an `(int, bytes)` tuple, if CPython could not handle the address family. It will cause a index out of range error in aiohttp. For example, if user compile CPython with `--disable-ipv6` option but his system enable the ipv6. `#5901 `_ - Removed the deprecated ``loop`` argument from the ``asyncio.sleep``/``gather`` calls `#5905 `_ - Return ``None`` from ``request.if_modified_since``, ``request.if_unmodified_since``, ``request.if_range`` and ``response.last_modified`` when corresponding http date headers are invalid. `#5925 `_ - Fix resetting `SIGCHLD` signals in Gunicorn aiohttp Worker to fix `subprocesses` that capture output having an incorrect `returncode`. `#6130 `_ - Raise ``400: Content-Length can't be present with Transfer-Encoding`` if both ``Content-Length`` and ``Transfer-Encoding`` are sent by peer by both C and Python implementations `#6182 `_ Improved Documentation ---------------------- - Refactored OpenAPI/Swagger aiohttp addons, added ``aio-openapi`` `#5326 `_ - Fixed docs on request cookies type, so it matches what is actually used in the code (a read-only dictionary-like object). `#5725 `_ - Documented that the HTTP client ``Authorization`` header is removed on redirects to a different host or protocol. `#5850 `_ Misc ---- - `#3927 `_, `#4247 `_, `#4247 `_, `#5389 `_, `#5457 `_, `#5486 `_, `#5494 `_, `#5515 `_, `#5625 `_, `#5635 `_, `#5648 `_, `#5657 `_, `#5890 `_, `#5914 `_, `#5932 `_, `#6002 `_, `#6045 `_, `#6131 `_, `#6156 `_, `#6165 `_, `#6166 `_ ---- 3.7.4.post0 (2021-03-06) ======================== Misc ---- - Bumped upper bound of the ``chardet`` runtime dependency to allow their v4.0 version stream. `#5366 `_ ---- 3.7.4 (2021-02-25) ================== Bugfixes -------- - **(SECURITY BUG)** Started preventing open redirects in the ``aiohttp.web.normalize_path_middleware`` middleware. For more details, see https://github.com/aio-libs/aiohttp/security/advisories/GHSA-v6wp-4m6f-gcjg. Thanks to `Beast Glatisant `__ for finding the first instance of this issue and `Jelmer Vernooij `__ for reporting and tracking it down in aiohttp. `#5497 `_ - Fix interpretation difference of the pure-Python and the Cython-based HTTP parsers construct a ``yarl.URL`` object for HTTP request-target. Before this fix, the Python parser would turn the URI's absolute-path for ``//some-path`` into ``/`` while the Cython code preserved it as ``//some-path``. Now, both do the latter. `#5498 `_ ---- 3.7.3 (2020-11-18) ================== Features -------- - Use Brotli instead of brotlipy `#3803 `_ - Made exceptions pickleable. Also changed the repr of some exceptions. `#4077 `_ Bugfixes -------- - Raise a ClientResponseError instead of an AssertionError for a blank HTTP Reason Phrase. `#3532 `_ - Fix ``web_middlewares.normalize_path_middleware`` behavior for patch without slash. `#3669 `_ - Fix overshadowing of overlapped sub-applications prefixes. `#3701 `_ - Make `BaseConnector.close()` a coroutine and wait until the client closes all connections. Drop deprecated "with Connector():" syntax. `#3736 `_ - Reset the ``sock_read`` timeout each time data is received for a ``aiohttp.client`` response. `#3808 `_ - Fixed type annotation for add_view method of UrlDispatcher to accept any subclass of View `#3880 `_ - Fixed querying the address families from DNS that the current host supports. `#5156 `_ - Change return type of MultipartReader.__aiter__() and BodyPartReader.__aiter__() to AsyncIterator. `#5163 `_ - Provide x86 Windows wheels. `#5230 `_ Improved Documentation ---------------------- - Add documentation for ``aiohttp.web.FileResponse``. `#3958 `_ - Removed deprecation warning in tracing example docs `#3964 `_ - Fixed wrong "Usage" docstring of ``aiohttp.client.request``. `#4603 `_ - Add aiohttp-pydantic to third party libraries `#5228 `_ Misc ---- - `#4102 `_ ---- 3.7.2 (2020-10-27) ================== Bugfixes -------- - Fixed static files handling for loops without ``.sendfile()`` support `#5149 `_ ---- 3.7.1 (2020-10-25) ================== Bugfixes -------- - Fixed a type error caused by the conditional import of `Protocol`. `#5111 `_ - Server doesn't send Content-Length for 1xx or 204 `#4901 `_ - Fix run_app typing `#4957 `_ - Always require ``typing_extensions`` library. `#5107 `_ - Fix a variable-shadowing bug causing `ThreadedResolver.resolve` to return the resolved IP as the ``hostname`` in each record, which prevented validation of HTTPS connections. `#5110 `_ - Added annotations to all public attributes. `#5115 `_ - Fix flaky test_when_timeout_smaller_second `#5116 `_ - Ensure sending a zero byte file does not throw an exception `#5124 `_ - Fix a bug in ``web.run_app()`` about Python version checking on Windows `#5127 `_ ---- 3.7.0 (2020-10-24) ================== Features -------- - Response headers are now prepared prior to running ``on_response_prepare`` hooks, directly before headers are sent to the client. `#1958 `_ - Add a ``quote_cookie`` option to ``CookieJar``, a way to skip quotation wrapping of cookies containing special characters. `#2571 `_ - Call ``AccessLogger.log`` with the current exception available from ``sys.exc_info()``. `#3557 `_ - `web.UrlDispatcher.add_routes` and `web.Application.add_routes` return a list of registered `AbstractRoute` instances. `AbstractRouteDef.register` (and all subclasses) return a list of registered resources registered resource. `#3866 `_ - Added properties of default ClientSession params to ClientSession class so it is available for introspection `#3882 `_ - Don't cancel web handler on peer disconnection, raise `OSError` on reading/writing instead. `#4080 `_ - Implement BaseRequest.get_extra_info() to access a protocol transports' extra info. `#4189 `_ - Added `ClientSession.timeout` property. `#4191 `_ - allow use of SameSite in cookies. `#4224 `_ - Use ``loop.sendfile()`` instead of custom implementation if available. `#4269 `_ - Apply SO_REUSEADDR to test server's socket. `#4393 `_ - Use .raw_host instead of slower .host in client API `#4402 `_ - Allow configuring the buffer size of input stream by passing ``read_bufsize`` argument. `#4453 `_ - Pass tests on Python 3.8 for Windows. `#4513 `_ - Add `method` and `url` attributes to `TraceRequestChunkSentParams` and `TraceResponseChunkReceivedParams`. `#4674 `_ - Add ClientResponse.ok property for checking status code under 400. `#4711 `_ - Don't ceil timeouts that are smaller than 5 seconds. `#4850 `_ - TCPSite now listens by default on all interfaces instead of just IPv4 when `None` is passed in as the host. `#4894 `_ - Bump ``http_parser`` to 2.9.4 `#5070 `_ Bugfixes -------- - Fix keepalive connections not being closed in time `#3296 `_ - Fix failed websocket handshake leaving connection hanging. `#3380 `_ - Fix tasks cancellation order on exit. The run_app task needs to be cancelled first for cleanup hooks to run with all tasks intact. `#3805 `_ - Don't start heartbeat until _writer is set `#4062 `_ - Fix handling of multipart file uploads without a content type. `#4089 `_ - Preserve view handler function attributes across middlewares `#4174 `_ - Fix the string representation of ``ServerDisconnectedError``. `#4175 `_ - Raising RuntimeError when trying to get encoding from not read body `#4214 `_ - Remove warning messages from noop. `#4282 `_ - Raise ClientPayloadError if FormData re-processed. `#4345 `_ - Fix a warning about unfinished task in ``web_protocol.py`` `#4408 `_ - Fixed 'deflate' compression. According to RFC 2616 now. `#4506 `_ - Fixed OverflowError on platforms with 32-bit time_t `#4515 `_ - Fixed request.body_exists returns wrong value for methods without body. `#4528 `_ - Fix connecting to link-local IPv6 addresses. `#4554 `_ - Fix a problem with connection waiters that are never awaited. `#4562 `_ - Always make sure transport is not closing before reuse a connection. Reuse a protocol based on keepalive in headers is unreliable. For example, uWSGI will not support keepalive even it serves a HTTP 1.1 request, except explicitly configure uWSGI with a ``--http-keepalive`` option. Servers designed like uWSGI could cause aiohttp intermittently raise a ConnectionResetException when the protocol poll runs out and some protocol is reused. `#4587 `_ - Handle the last CRLF correctly even if it is received via separate TCP segment. `#4630 `_ - Fix the register_resource function to validate route name before splitting it so that route name can include python keywords. `#4691 `_ - Improve typing annotations for ``web.Request``, ``aiohttp.ClientResponse`` and ``multipart`` module. `#4736 `_ - Fix resolver task is not awaited when connector is cancelled `#4795 `_ - Fix a bug "Aiohttp doesn't return any error on invalid request methods" `#4798 `_ - Fix HEAD requests for static content. `#4809 `_ - Fix incorrect size calculation for memoryview `#4890 `_ - Add HTTPMove to _all__. `#4897 `_ - Fixed the type annotations in the ``tracing`` module. `#4912 `_ - Fix typing for multipart ``__aiter__``. `#4931 `_ - Fix for race condition on connections in BaseConnector that leads to exceeding the connection limit. `#4936 `_ - Add forced UTF-8 encoding for ``application/rdap+json`` responses. `#4938 `_ - Fix inconsistency between Python and C http request parsers in parsing pct-encoded URL. `#4972 `_ - Fix connection closing issue in HEAD request. `#5012 `_ - Fix type hint on BaseRunner.addresses (from ``List[str]`` to ``List[Any]``) `#5086 `_ - Make `web.run_app()` more responsive to Ctrl+C on Windows for Python < 3.8. It slightly increases CPU load as a side effect. `#5098 `_ Improved Documentation ---------------------- - Fix example code in client quick-start `#3376 `_ - Updated the docs so there is no contradiction in ``ttl_dns_cache`` default value `#3512 `_ - Add 'Deploy with SSL' to docs. `#4201 `_ - Change typing of the secure argument on StreamResponse.set_cookie from ``Optional[str]`` to ``Optional[bool]`` `#4204 `_ - Changes ``ttl_dns_cache`` type from int to Optional[int]. `#4270 `_ - Simplify README hello word example and add a documentation page for people coming from requests. `#4272 `_ - Improve some code examples in the documentation involving websockets and starting a simple HTTP site with an AppRunner. `#4285 `_ - Fix typo in code example in Multipart docs `#4312 `_ - Fix code example in Multipart section. `#4314 `_ - Update contributing guide so new contributors read the most recent version of that guide. Update command used to create test coverage reporting. `#4810 `_ - Spelling: Change "canonize" to "canonicalize". `#4986 `_ - Add ``aiohttp-sse-client`` library to third party usage list. `#5084 `_ Misc ---- - `#2856 `_, `#4218 `_, `#4250 `_ ---- 3.6.3 (2020-10-12) ================== Bugfixes -------- - Pin yarl to ``<1.6.0`` to avoid buggy behavior that will be fixed by the next aiohttp release. 3.6.2 (2019-10-09) ================== Features -------- - Made exceptions pickleable. Also changed the repr of some exceptions. `#4077 `_ - Use ``Iterable`` type hint instead of ``Sequence`` for ``Application`` *middleware* parameter. `#4125 `_ Bugfixes -------- - Reset the ``sock_read`` timeout each time data is received for a ``aiohttp.ClientResponse``. `#3808 `_ - Fix handling of expired cookies so they are not stored in CookieJar. `#4063 `_ - Fix misleading message in the string representation of ``ClientConnectorError``; ``self.ssl == None`` means default SSL context, not SSL disabled `#4097 `_ - Don't clobber HTTP status when using FileResponse. `#4106 `_ Improved Documentation ---------------------- - Added minimal required logging configuration to logging documentation. `#2469 `_ - Update docs to reflect proxy support. `#4100 `_ - Fix typo in code example in testing docs. `#4108 `_ Misc ---- - `#4102 `_ ---- 3.6.1 (2019-09-19) ================== Features -------- - Compatibility with Python 3.8. `#4056 `_ Bugfixes -------- - correct some exception string format `#4068 `_ - Emit a warning when ``ssl.OP_NO_COMPRESSION`` is unavailable because the runtime is built against an outdated OpenSSL. `#4052 `_ - Update multidict requirement to >= 4.5 `#4057 `_ Improved Documentation ---------------------- - Provide pytest-aiohttp namespace for pytest fixtures in docs. `#3723 `_ ---- 3.6.0 (2019-09-06) ================== Features -------- - Add support for Named Pipes (Site and Connector) under Windows. This feature requires Proactor event loop to work. `#3629 `_ - Removed ``Transfer-Encoding: chunked`` header from websocket responses to be compatible with more http proxy servers. `#3798 `_ - Accept non-GET request for starting websocket handshake on server side. `#3980 `_ Bugfixes -------- - Raise a ClientResponseError instead of an AssertionError for a blank HTTP Reason Phrase. `#3532 `_ - Fix an issue where cookies would sometimes not be set during a redirect. `#3576 `_ - Change normalize_path_middleware to use 308 redirect instead of 301. This behavior should prevent clients from being unable to use PUT/POST methods on endpoints that are redirected because of a trailing slash. `#3579 `_ - Drop the processed task from ``all_tasks()`` list early. It prevents logging about a task with unhandled exception when the server is used in conjunction with ``asyncio.run()``. `#3587 `_ - ``Signal`` type annotation changed from ``Signal[Callable[['TraceConfig'], Awaitable[None]]]`` to ``Signal[Callable[ClientSession, SimpleNamespace, ...]``. `#3595 `_ - Use sanitized URL as Location header in redirects `#3614 `_ - Improve typing annotations for multipart.py along with changes required by mypy in files that references multipart.py. `#3621 `_ - Close session created inside ``aiohttp.request`` when unhandled exception occurs `#3628 `_ - Cleanup per-chunk data in generic data read. Memory leak fixed. `#3631 `_ - Use correct type for add_view and family `#3633 `_ - Fix _keepalive field in __slots__ of ``RequestHandler``. `#3644 `_ - Properly handle ConnectionResetError, to silence the "Cannot write to closing transport" exception when clients disconnect uncleanly. `#3648 `_ - Suppress pytest warnings due to ``test_utils`` classes `#3660 `_ - Fix overshadowing of overlapped sub-application prefixes. `#3701 `_ - Fixed return type annotation for WSMessage.json() `#3720 `_ - Properly expose TooManyRedirects publicly as documented. `#3818 `_ - Fix missing brackets for IPv6 in proxy CONNECT request `#3841 `_ - Make the signature of ``aiohttp.test_utils.TestClient.request`` match ``asyncio.ClientSession.request`` according to the docs `#3852 `_ - Use correct style for re-exported imports, makes mypy ``--strict`` mode happy. `#3868 `_ - Fixed type annotation for add_view method of UrlDispatcher to accept any subclass of View `#3880 `_ - Made cython HTTP parser set Reason-Phrase of the response to an empty string if it is missing. `#3906 `_ - Add URL to the string representation of ClientResponseError. `#3959 `_ - Accept ``istr`` keys in ``LooseHeaders`` type hints. `#3976 `_ - Fixed race conditions in _resolve_host caching and throttling when tracing is enabled. `#4013 `_ - For URLs like "unix://localhost/..." set Host HTTP header to "localhost" instead of "localhost:None". `#4039 `_ Improved Documentation ---------------------- - Modify documentation for Background Tasks to remove deprecated usage of event loop. `#3526 `_ - use ``if __name__ == '__main__':`` in server examples. `#3775 `_ - Update documentation reference to the default access logger. `#3783 `_ - Improve documentation for ``web.BaseRequest.path`` and ``web.BaseRequest.raw_path``. `#3791 `_ - Removed deprecation warning in tracing example docs `#3964 `_ ---- 3.5.4 (2019-01-12) ================== Bugfixes -------- - Fix stream ``.read()`` / ``.readany()`` / ``.iter_any()`` which used to return a partial content only in case of compressed content `#3525 `_ 3.5.3 (2019-01-10) ================== Bugfixes -------- - Fix type stubs for ``aiohttp.web.run_app(access_log=True)`` and fix edge case of ``access_log=True`` and the event loop being in debug mode. `#3504 `_ - Fix ``aiohttp.ClientTimeout`` type annotations to accept ``None`` for fields `#3511 `_ - Send custom per-request cookies even if session jar is empty `#3515 `_ - Restore Linux binary wheels publishing on PyPI ---- 3.5.2 (2019-01-08) ================== Features -------- - ``FileResponse`` from ``web_fileresponse.py`` uses a ``ThreadPoolExecutor`` to work with files asynchronously. I/O based payloads from ``payload.py`` uses a ``ThreadPoolExecutor`` to work with I/O objects asynchronously. `#3313 `_ - Internal Server Errors in plain text if the browser does not support HTML. `#3483 `_ Bugfixes -------- - Preserve MultipartWriter parts headers on write. Refactor the way how ``Payload.headers`` are handled. Payload instances now always have headers and Content-Type defined. Fix Payload Content-Disposition header reset after initial creation. `#3035 `_ - Log suppressed exceptions in ``GunicornWebWorker``. `#3464 `_ - Remove wildcard imports. `#3468 `_ - Use the same task for app initialization and web server handling in gunicorn workers. It allows to use Python3.7 context vars smoothly. `#3471 `_ - Fix handling of chunked+gzipped response when first chunk does not give uncompressed data `#3477 `_ - Replace ``collections.MutableMapping`` with ``collections.abc.MutableMapping`` to avoid a deprecation warning. `#3480 `_ - ``Payload.size`` type annotation changed from ``Optional[float]`` to ``Optional[int]``. `#3484 `_ - Ignore done tasks when cancels pending activities on ``web.run_app`` finalization. `#3497 `_ Improved Documentation ---------------------- - Add documentation for ``aiohttp.web.HTTPException``. `#3490 `_ Misc ---- - `#3487 `_ ---- 3.5.1 (2018-12-24) ==================== - Fix a regression about ``ClientSession._requote_redirect_url`` modification in debug mode. 3.5.0 (2018-12-22) ==================== Features -------- - The library type annotations are checked in strict mode now. - Add support for setting cookies for individual request (`#2387 `_) - Application.add_domain implementation (`#2809 `_) - The default ``app`` in the request returned by ``test_utils.make_mocked_request`` can now have objects assigned to it and retrieved using the ``[]`` operator. (`#3174 `_) - Make ``request.url`` accessible when transport is closed. (`#3177 `_) - Add ``zlib_executor_size`` argument to ``Response`` constructor to allow compression to run in a background executor to avoid blocking the main thread and potentially triggering health check failures. (`#3205 `_) - Enable users to set ``ClientTimeout`` in ``aiohttp.request`` (`#3213 `_) - Don't raise a warning if ``NETRC`` environment variable is not set and ``~/.netrc`` file doesn't exist. (`#3267 `_) - Add default logging handler to web.run_app If the ``Application.debug``` flag is set and the default logger ``aiohttp.access`` is used, access logs will now be output using a *stderr* ``StreamHandler`` if no handlers are attached. Furthermore, if the default logger has no log level set, the log level will be set to ``DEBUG``. (`#3324 `_) - Add method argument to ``session.ws_connect()``. Sometimes server API requires a different HTTP method for WebSocket connection establishment. For example, ``Docker exec`` needs POST. (`#3378 `_) - Create a task per request handling. (`#3406 `_) Bugfixes -------- - Enable passing ``access_log_class`` via ``handler_args`` (`#3158 `_) - Return empty bytes with end-of-chunk marker in empty stream reader. (`#3186 `_) - Accept ``CIMultiDictProxy`` instances for ``headers`` argument in ``web.Response`` constructor. (`#3207 `_) - Don't uppercase HTTP method in parser (`#3233 `_) - Make method match regexp RFC-7230 compliant (`#3235 `_) - Add ``app.pre_frozen`` state to properly handle startup signals in sub-applications. (`#3237 `_) - Enhanced parsing and validation of helpers.BasicAuth.decode. (`#3239 `_) - Change imports from collections module in preparation for 3.8. (`#3258 `_) - Ensure Host header is added first to ClientRequest to better replicate browser (`#3265 `_) - Fix forward compatibility with Python 3.8: importing ABCs directly from the collections module will not be supported anymore. (`#3273 `_) - Keep the query string by ``normalize_path_middleware``. (`#3278 `_) - Fix missing parameter ``raise_for_status`` for aiohttp.request() (`#3290 `_) - Bracket IPv6 addresses in the HOST header (`#3304 `_) - Fix default message for server ping and pong frames. (`#3308 `_) - Fix tests/test_connector.py typo and tests/autobahn/server.py duplicate loop def. (`#3337 `_) - Fix false-negative indicator end_of_HTTP_chunk in StreamReader.readchunk function (`#3361 `_) - Release HTTP response before raising status exception (`#3364 `_) - Fix task cancellation when ``sendfile()`` syscall is used by static file handling. (`#3383 `_) - Fix stack trace for ``asyncio.TimeoutError`` which was not logged, when it is caught in the handler. (`#3414 `_) Improved Documentation ---------------------- - Improve documentation of ``Application.make_handler`` parameters. (`#3152 `_) - Fix BaseRequest.raw_headers doc. (`#3215 `_) - Fix typo in TypeError exception reason in ``web.Application._handle`` (`#3229 `_) - Make server access log format placeholder %b documentation reflect behavior and docstring. (`#3307 `_) Deprecations and Removals ------------------------- - Deprecate modification of ``session.requote_redirect_url`` (`#2278 `_) - Deprecate ``stream.unread_data()`` (`#3260 `_) - Deprecated use of boolean in ``resp.enable_compression()`` (`#3318 `_) - Encourage creation of aiohttp public objects inside a coroutine (`#3331 `_) - Drop dead ``Connection.detach()`` and ``Connection.writer``. Both methods were broken for more than 2 years. (`#3358 `_) - Deprecate ``app.loop``, ``request.loop``, ``client.loop`` and ``connector.loop`` properties. (`#3374 `_) - Deprecate explicit debug argument. Use asyncio debug mode instead. (`#3381 `_) - Deprecate body parameter in HTTPException (and derived classes) constructor. (`#3385 `_) - Deprecate bare connector close, use ``async with connector:`` and ``await connector.close()`` instead. (`#3417 `_) - Deprecate obsolete ``read_timeout`` and ``conn_timeout`` in ``ClientSession`` constructor. (`#3438 `_) Misc ---- - #3341, #3351 ---- 3.4.4 (2018-09-05) ================== - Fix installation from sources when compiling toolkit is not available (`#3241 `_) ---- 3.4.3 (2018-09-04) ================== - Add ``app.pre_frozen`` state to properly handle startup signals in sub-applications. (`#3237 `_) ---- 3.4.2 (2018-09-01) ================== - Fix ``iter_chunks`` type annotation (`#3230 `_) ---- 3.4.1 (2018-08-28) ================== - Fix empty header parsing regression. (`#3218 `_) - Fix BaseRequest.raw_headers doc. (`#3215 `_) - Fix documentation building on ReadTheDocs (`#3221 `_) ---- 3.4.0 (2018-08-25) ================== Features -------- - Add type hints (`#3049 `_) - Add ``raise_for_status`` request parameter (`#3073 `_) - Add type hints to HTTP client (`#3092 `_) - Minor server optimizations (`#3095 `_) - Preserve the cause when `HTTPException` is raised from another exception. (`#3096 `_) - Add `close_boundary` option in `MultipartWriter.write` method. Support streaming (`#3104 `_) - Added a ``remove_slash`` option to the ``normalize_path_middleware`` factory. (`#3173 `_) - The class `AbstractRouteDef` is importable from `aiohttp.web`. (`#3183 `_) Bugfixes -------- - Prevent double closing when client connection is released before the last ``data_received()`` callback. (`#3031 `_) - Make redirect with `normalize_path_middleware` work when using url encoded paths. (`#3051 `_) - Postpone web task creation to connection establishment. (`#3052 `_) - Fix ``sock_read`` timeout. (`#3053 `_) - When using a server-request body as the `data=` argument of a client request, iterate over the content with `readany` instead of `readline` to avoid `Line too long` errors. (`#3054 `_) - fix `UrlDispatcher` has no attribute `add_options`, add `web.options` (`#3062 `_) - correct filename in content-disposition with multipart body (`#3064 `_) - Many HTTP proxies has buggy keepalive support. Let's not reuse connection but close it after processing every response. (`#3070 `_) - raise 413 "Payload Too Large" rather than raising ValueError in request.post() Add helpful debug message to 413 responses (`#3087 `_) - Fix `StreamResponse` equality, now that they are `MutableMapping` objects. (`#3100 `_) - Fix server request objects comparison (`#3116 `_) - Do not hang on `206 Partial Content` response with `Content-Encoding: gzip` (`#3123 `_) - Fix timeout precondition checkers (`#3145 `_) Improved Documentation ---------------------- - Add a new FAQ entry that clarifies that you should not reuse response objects in middleware functions. (`#3020 `_) - Add FAQ section "Why is creating a ClientSession outside of an event loop dangerous?" (`#3072 `_) - Fix link to Rambler (`#3115 `_) - Fix TCPSite documentation on the Server Reference page. (`#3146 `_) - Fix documentation build configuration file for Windows. (`#3147 `_) - Remove no longer existing lingering_timeout parameter of Application.make_handler from documentation. (`#3151 `_) - Mention that ``app.make_handler`` is deprecated, recommend to use runners API instead. (`#3157 `_) Deprecations and Removals ------------------------- - Drop ``loop.current_task()`` from ``helpers.current_task()`` (`#2826 `_) - Drop ``reader`` parameter from ``request.multipart()``. (`#3090 `_) ---- 3.3.2 (2018-06-12) ================== - Many HTTP proxies has buggy keepalive support. Let's not reuse connection but close it after processing every response. (`#3070 `_) - Provide vendor source files in tarball (`#3076 `_) ---- 3.3.1 (2018-06-05) ================== - Fix ``sock_read`` timeout. (`#3053 `_) - When using a server-request body as the ``data=`` argument of a client request, iterate over the content with ``readany`` instead of ``readline`` to avoid ``Line too long`` errors. (`#3054 `_) ---- 3.3.0 (2018-06-01) ================== Features -------- - Raise ``ConnectionResetError`` instead of ``CancelledError`` on trying to write to a closed stream. (`#2499 `_) - Implement ``ClientTimeout`` class and support socket read timeout. (`#2768 `_) - Enable logging when ``aiohttp.web`` is used as a program (`#2956 `_) - Add canonical property to resources (`#2968 `_) - Forbid reading response BODY after release (`#2983 `_) - Implement base protocol class to avoid a dependency from internal ``asyncio.streams.FlowControlMixin`` (`#2986 `_) - Cythonize ``@helpers.reify``, 5% boost on macro benchmark (`#2995 `_) - Optimize HTTP parser (`#3015 `_) - Implement ``runner.addresses`` property. (`#3036 `_) - Use ``bytearray`` instead of a list of ``bytes`` in websocket reader. It improves websocket message reading a little. (`#3039 `_) - Remove heartbeat on closing connection on keepalive timeout. The used hack violates HTTP protocol. (`#3041 `_) - Limit websocket message size on reading to 4 MB by default. (`#3045 `_) Bugfixes -------- - Don't reuse a connection with the same URL but different proxy/TLS settings (`#2981 `_) - When parsing the Forwarded header, the optional port number is now preserved. (`#3009 `_) Improved Documentation ---------------------- - Make Change Log more visible in docs (`#3029 `_) - Make style and grammar improvements on the FAQ page. (`#3030 `_) - Document that signal handlers should be async functions since aiohttp 3.0 (`#3032 `_) Deprecations and Removals ------------------------- - Deprecate custom application's router. (`#3021 `_) Misc ---- - #3008, #3011 ---- 3.2.1 (2018-05-10) ================== - Don't reuse a connection with the same URL but different proxy/TLS settings (`#2981 `_) ---- 3.2.0 (2018-05-06) ================== Features -------- - Raise ``TooManyRedirects`` exception when client gets redirected too many times instead of returning last response. (`#2631 `_) - Extract route definitions into separate ``web_routedef.py`` file (`#2876 `_) - Raise an exception on request body reading after sending response. (`#2895 `_) - ClientResponse and RequestInfo now have real_url property, which is request url without fragment part being stripped (`#2925 `_) - Speed up connector limiting (`#2937 `_) - Added and links property for ClientResponse object (`#2948 `_) - Add ``request.config_dict`` for exposing nested applications data. (`#2949 `_) - Speed up HTTP headers serialization, server micro-benchmark runs 5% faster now. (`#2957 `_) - Apply assertions in debug mode only (`#2966 `_) Bugfixes -------- - expose property `app` for TestClient (`#2891 `_) - Call on_chunk_sent when write_eof takes as a param the last chunk (`#2909 `_) - A closing bracket was added to `__repr__` of resources (`#2935 `_) - Fix compression of FileResponse (`#2942 `_) - Fixes some bugs in the limit connection feature (`#2964 `_) Improved Documentation ---------------------- - Drop ``async_timeout`` usage from documentation for client API in favor of ``timeout`` parameter. (`#2865 `_) - Improve Gunicorn logging documentation (`#2921 `_) - Replace multipart writer `.serialize()` method with `.write()` in documentation. (`#2965 `_) Deprecations and Removals ------------------------- - Deprecate Application.make_handler() (`#2938 `_) Misc ---- - #2958 ---- 3.1.3 (2018-04-12) ================== - Fix cancellation broadcast during DNS resolve (`#2910 `_) ---- 3.1.2 (2018-04-05) ================== - Make ``LineTooLong`` exception more detailed about actual data size (`#2863 `_) - Call ``on_chunk_sent`` when write_eof takes as a param the last chunk (`#2909 `_) ---- 3.1.1 (2018-03-27) ================== - Support *asynchronous iterators* (and *asynchronous generators* as well) in both client and server API as request / response BODY payloads. (`#2802 `_) ---- 3.1.0 (2018-03-21) ================== Welcome to aiohttp 3.1 release. This is an *incremental* release, fully backward compatible with *aiohttp 3.0*. But we have added several new features. The most visible one is ``app.add_routes()`` (an alias for existing ``app.router.add_routes()``. The addition is very important because all *aiohttp* docs now uses ``app.add_routes()`` call in code snippets. All your existing code still do register routes / resource without any warning but you've got the idea for a favorite way: noisy ``app.router.add_get()`` is replaced by ``app.add_routes()``. The library does not make a preference between decorators:: routes = web.RouteTableDef() @routes.get('/') async def hello(request): return web.Response(text="Hello, world") app.add_routes(routes) and route tables as a list:: async def hello(request): return web.Response(text="Hello, world") app.add_routes([web.get('/', hello)]) Both ways are equal, user may decide basing on own code taste. Also we have a lot of minor features, bug fixes and documentation updates, see below. Features -------- - Relax JSON content-type checking in the ``ClientResponse.json()`` to allow "application/xxx+json" instead of strict "application/json". (`#2206 `_) - Bump C HTTP parser to version 2.8 (`#2730 `_) - Accept a coroutine as an application factory in ``web.run_app`` and gunicorn worker. (`#2739 `_) - Implement application cleanup context (``app.cleanup_ctx`` property). (`#2747 `_) - Make ``writer.write_headers`` a coroutine. (`#2762 `_) - Add tracking signals for getting request/response bodies. (`#2767 `_) - Deprecate ClientResponseError.code in favor of .status to keep similarity with response classes. (`#2781 `_) - Implement ``app.add_routes()`` method. (`#2787 `_) - Implement ``web.static()`` and ``RouteTableDef.static()`` API. (`#2795 `_) - Install a test event loop as default by ``asyncio.set_event_loop()``. The change affects aiohttp test utils but backward compatibility is not broken for 99.99% of use cases. (`#2804 `_) - Refactor ``ClientResponse`` constructor: make logically required constructor arguments mandatory, drop ``_post_init()`` method. (`#2820 `_) - Use ``app.add_routes()`` in server docs everywhere (`#2830 `_) - Websockets refactoring, all websocket writer methods are converted into coroutines. (`#2836 `_) - Provide ``Content-Range`` header for ``Range`` requests (`#2844 `_) Bugfixes -------- - Fix websocket client return EofStream. (`#2784 `_) - Fix websocket demo. (`#2789 `_) - Property ``BaseRequest.http_range`` now returns a python-like slice when requesting the tail of the range. It's now indicated by a negative value in ``range.start`` rather then in ``range.stop`` (`#2805 `_) - Close a connection if an unexpected exception occurs while sending a request (`#2827 `_) - Fix firing DNS tracing events. (`#2841 `_) Improved Documentation ---------------------- - Document behavior when cchardet detects encodings that are unknown to Python. (`#2732 `_) - Add diagrams for tracing request life style. (`#2748 `_) - Drop removed functionality for passing ``StreamReader`` as data at client side. (`#2793 `_) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/CONTRIBUTORS.txt0000644000175100001770000001263614607525266015330 0ustar00runnerdocker- Contributors - ---------------- A. Jesse Jiryu Davis Adam Bannister Adam Cooper Adam Horacek Adam Mills Adrian Krupa Adrián Chaves Ahmed Tahri Alan Tse Alec Hanefeld Alejandro Gómez Aleksandr Danshyn Aleksey Kutepov Alex Hayes Alex Key Alex Khomchenko Alex Kuzmenko Alex Lisovoy Alexander Bayandin Alexander Karpinsky Alexander Koshevoy Alexander Malev Alexander Mohr Alexander Shorin Alexander Travov Alexandru Mihai Alexey Firsov Alexey Nikitin Alexey Popravka Alexey Stepanov Amin Etesamian Amit Tulshyan Amy Boyle Anas El Amraoui Anders Melchiorsen Andrei Ursulenko Andrej Antonov Andrew Leech Andrew Lytvyn Andrew Svetlov Andrew Zhou Andrii Soldatenko Anes Abismail Antoine Pietri Anton Kasyanov Anton Zhdan-Pushkin Arseny Timoniq Artem Yushkovskiy Arthur Darcet Austin Scola Ben Bader Ben Greiner Ben Kallus Ben Timby Benedikt Reinartz Bob Haddleton Boris Feld Boyi Chen Brett Cannon Brian Bouterse Brian C. Lane Brian Muller Bruce Merry Bruno Souza Cabral Bryan Kok Bryce Drennan Carl George Cecile Tonglet Chien-Wei Huang Chih-Yuan Chen Chris AtLee Chris Laws Chris Moore Christopher Schmitt Claudiu Popa Colin Dunklau Cong Xu Damien Nadé Dan King Dan Xu Daniel García Daniel Golding Daniel Grossmann-Kavanagh Daniel Nelson Danny Song David Bibb David Michael Brown Denilson Amorim Denis Matiychuk Denis Moshensky Dennis Kliban Dima Veselov Dimitar Dimitrov Diogo Dutra da Mata Dmitriy Safonov Dmitry Doroshev Dmitry Erlikh Dmitry Lukashin Dmitry Marakasov Dmitry Shamov Dmitry Trofimov Dmytro Bohomiakov Dmytro Kuznetsov Dustin J. Mitchell Eduard Iskandarov Eli Ribble Elizabeth Leddy Enrique Saez Eric Sheng Erich Healy Erik Peterson Eugene Chernyshov Eugene Naydenov Eugene Nikolaiev Eugene Tolmachev Evan Kepner Evert Lammerts Felix Yan Fernanda Guimarães FichteFoll Florian Scheffler Franek Magiera Frederik Gladhorn Frederik Peter Aalund Gabriel Tremblay Gary Wilson Jr. Gennady Andreyev Georges Dubus Greg Holt Gregory Haynes Gus Goulart Gustavo Carneiro Günther Jena Hans Adema Harmon Y. Harry Liu Hiroshi Ogawa Hrishikesh Paranjape Hu Bo Hugh Young Hugo Herter Hugo Hromic Hugo van Kemenade Hynek Schlawack Igor Alexandrov Igor Bolshakov Igor Davydenko Igor Mozharovsky Igor Pavlov Illia Volochii Ilya Chichak Ilya Gruzinov Ingmar Steen Ivan Lakovic Ivan Larin J. Nick Koston Jacob Champion Jaesung Lee Jake Davis Jakob Ackermann Jakub Wilk Jan Buchar Jan Gosmann Jarno Elonen Jashandeep Sohi Jean-Baptiste Estival Jens Steinhauser Jeonghun Lee Jeongkyu Shin Jeroen van der Heijden Jesus Cea Jian Zeng Jinkyu Yi Joel Watts John Parton Jon Nabozny Jonas Krüger Svensson Jonas Obrist Jonathan Ballet Jonathan Wright Jonny Tan Joongi Kim Jordan Borean Josep Cugat Josh Junon Joshu Coats Julia Tsemusheva Julien Duponchelle Jungkook Park Junjie Tao Junyeong Jeong Justas Trimailovas Justin Foo Justin Turner Arthur Kay Zheng Kevin Samuel Kimmo Parviainen-Jalanko Kirill Klenov Kirill Malovitsa Konstantin Valetov Krzysztof Blazewicz Kyrylo Perevozchikov Kyungmin Lee Lars P. Søndergaard Lee LieWhite Liu Hua Louis-Philippe Huberdeau Loïc Lajeanne Lu Gong Lubomir Gelo Ludovic Gasc Luis Pedrosa Lukasz Marcin Dobrzanski Makc Belousow Manuel Miranda Marat Sharafutdinov Marc Mueller Marco Paolini Mariano Anaya Mariusz Masztalerczuk Marko Kohtala Martijn Pieters Martin Melka Martin Richard Martin Sucha Mathias Fröjdman Mathieu Dugré Matt VanEseltine Matthias Marquardt Matthieu Hauglustaine Matthieu Rigal Matvey Tingaev Meet Mangukiya Michael Ihnatenko Michał Górny Mikhail Burshteyn Mikhail Kashkin Mikhail Lukyanchenko Mikhail Nacharov Misha Behersky Mitchell Ferree Morgan Delahaye-Prat Moss Collum Mun Gwan-gyeong Navid Sheikhol Nicolas Braem Nikolay Kim Nikolay Novik Nikolay Tiunov Nándor Mátravölgyi Oisin Aylward Olaf Conradi Pahaz Blinov Panagiotis Kolokotronis Pankaj Pandey Parag Jain Pau Freixes Paul Colomiets Paul J. Dorn Paulius Šileikis Paulus Schoutsen Pavel Kamaev Pavel Polyakov Pavel Sapezhko Pavol Vargovčík Pawel Kowalski Pawel Miech Pepe Osca Philipp A. Pieter van Beek Qiao Han Rafael Viotti Raphael Bialon Raúl Cumplido Required Field Robert Lu Robert Nikolich Roman Podoliaka Rong Zhang Samir Akarioh Samuel Colvin Sean Hunt Sebastian Acuna Sebastian Hanula Sebastian Hüther Sebastien Geffroy SeongSoo Cho Sergey Ninua Sergey Skripnick Serhii Charykov Serhii Kostel Serhiy Storchaka Simon Kennedy Sin-Woo Bang Stanislas Plum Stanislav Prokop Stefan Tjarks Stepan Pletnev Stephan Jaensch Stephen Cirelli Stephen Granade Steve Repsher Steven Seguin Sunghyun Hwang Sunit Deshpande Sviatoslav Bulbakha Sviatoslav Sydorenko Taha Jahangir Taras Voinarovskyi Terence Honles Thanos Lefteris Thijs Vermeir Thomas Forbes Thomas Grainger Tolga Tezel Tomasz Trebski Toshiaki Tanaka Trinh Hoang Nhu Tymofii Tsiapa Vadim Suharnikov Vaibhav Sagar Vamsi Krishna Avula Vasiliy Faronov Vasyl Baran Viacheslav Greshilov Victor Collod Victor Kovtun Vikas Kawadia Viktor Danyliuk Ville Skyttä Vincent Maillol Vitalik Verhovodov Vitaly Haritonsky Vitaly Magerya Vladimir Kamarzin Vladimir Kozlovski Vladimir Rutsky Vladimir Shulyak Vladimir Zakharov Vladyslav Bohaichuk Vladyslav Bondar W. Trevor King Wei Lin Weiwei Wang Will Fatherley Will McGugan Willem de Groot William Grzybowski William S. Wilson Ong wouter bolsterlee Yang Zhou Yannick Koechlin Yannick Péroux Ye Cao Yegor Roganov Yifei Kong Young-Ho Cha Yuriy Shatrov Yury Pliner Yury Selivanov Yusuke Tsutsumi Yuval Ofir Yuvi Panda Zainab Lawal Zeal Wierslee Zlatan Sičanica Марк Коренберг Семён Марьясин ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/LICENSE.txt0000644000175100001770000000111414607525266014442 0ustar00runnerdocker Copyright aio-libs contributors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/MANIFEST.in0000644000175100001770000000063514607525266014364 0ustar00runnerdockerinclude LICENSE.txt include CHANGES.rst include README.rst include CONTRIBUTORS.txt include Makefile graft aiohttp graft docs graft examples graft tests graft requirements recursive-include vendor * global-include aiohttp *.pyi global-exclude *.pyc global-exclude *.pyd global-exclude *.so global-exclude *.lib global-exclude *.dll global-exclude *.a global-exclude *.obj exclude aiohttp/*.html prune docs/_build ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/Makefile0000644000175100001770000001212014607525266014256 0ustar00runnerdocker# Some simple testing tasks (sorry, UNIX only). to-hash-one = $(dir $1).hash/$(addsuffix .hash,$(notdir $1)) to-hash = $(foreach fname,$1,$(call to-hash-one,$(fname))) CYS := $(wildcard aiohttp/*.pyx) $(wildcard aiohttp/*.pyi) $(wildcard aiohttp/*.pxd) PYXS := $(wildcard aiohttp/*.pyx) CS := $(wildcard aiohttp/*.c) PYS := $(wildcard aiohttp/*.py) IN := doc-spelling lint cython dev ALLS := $(sort $(CYS) $(CS) $(PYS) $(REQS)) .PHONY: all all: test tst: @echo $(call to-hash,requirements/cython.txt) @echo $(call to-hash,aiohttp/%.pyx) # Recipe from https://www.cmcrossroads.com/article/rebuilding-when-files-checksum-changes FORCE: # check_sum.py works perfectly fine but slow when called for every file from $(ALLS) # (perhaps even several times for each file). # That is why much less readable but faster solution exists ifneq (, $(shell command -v sha256sum)) %.hash: FORCE $(eval $@_ABS := $(abspath $@)) $(eval $@_NAME := $($@_ABS)) $(eval $@_HASHDIR := $(dir $($@_ABS))) $(eval $@_TMP := $($@_HASHDIR)../$(notdir $($@_ABS))) $(eval $@_ORIG := $(subst /.hash/../,/,$(basename $($@_TMP)))) @#echo ==== $($@_ABS) $($@_HASHDIR) $($@_NAME) $($@_TMP) $($@_ORIG) @if ! (sha256sum --check $($@_ABS) 1>/dev/null 2>/dev/null); then \ mkdir -p $($@_HASHDIR); \ echo re-hash $($@_ORIG); \ sha256sum $($@_ORIG) > $($@_ABS); \ fi else %.hash: FORCE @./tools/check_sum.py $@ # --debug endif # Enumerate intermediate files to don't remove them automatically. .SECONDARY: $(call to-hash,$(ALLS)) .update-pip: @python -m pip install --upgrade pip .install-cython: .update-pip $(call to-hash,requirements/cython.txt) @python -m pip install -r requirements/cython.in -c requirements/cython.txt @touch .install-cython aiohttp/_find_header.c: $(call to-hash,aiohttp/hdrs.py ./tools/gen.py) ./tools/gen.py # _find_headers generator creates _headers.pyi as well aiohttp/%.c: aiohttp/%.pyx $(call to-hash,$(CYS)) aiohttp/_find_header.c cython -3 -o $@ $< -I aiohttp -Werror vendor/llhttp/node_modules: vendor/llhttp/package.json cd vendor/llhttp; npm ci .llhttp-gen: vendor/llhttp/node_modules $(MAKE) -C vendor/llhttp generate @touch .llhttp-gen .PHONY: generate-llhttp generate-llhttp: .llhttp-gen .PHONY: cythonize cythonize: .install-cython $(PYXS:.pyx=.c) .install-deps: .install-cython $(PYXS:.pyx=.c) $(call to-hash,$(CYS) $(REQS)) @python -m pip install -r requirements/dev.in -c requirements/dev.txt @touch .install-deps .PHONY: lint lint: fmt mypy .PHONY: fmt format fmt format: python -m pre_commit run --all-files --show-diff-on-failure .PHONY: mypy mypy: mypy .develop: .install-deps generate-llhttp $(call to-hash,$(PYS) $(CYS) $(CS)) python -m pip install -e . -c requirements/runtime-deps.txt @touch .develop .PHONY: test test: .develop @pytest -q .PHONY: vtest vtest: .develop @pytest -s -v @python -X dev -m pytest -s -v -m dev_mode .PHONY: vvtest vvtest: .develop @pytest -vv @python -X dev -m pytest -s -v -m dev_mode define run_tests_in_docker DOCKER_BUILDKIT=1 docker build --build-arg PYTHON_VERSION=$(1) --build-arg AIOHTTP_NO_EXTENSIONS=$(2) -t "aiohttp-test-$(1)-$(2)" -f tools/testing/Dockerfile . docker run --rm -ti -v `pwd`:/src -w /src "aiohttp-test-$(1)-$(2)" $(TEST_SPEC) endef .PHONY: test-3.8-no-extensions test-3.8 test-3.9-no-extensions test test-3.8-no-extensions: $(call run_tests_in_docker,3.8,y) test-3.8: $(call run_tests_in_docker,3.8,n) test-3.9-no-extensions: $(call run_tests_in_docker,3.9,y) test-3.9: $(call run_tests_in_docker,3.9,n) test-3.10-no-extensions: $(call run_tests_in_docker,3.10,y) test-3.10: $(call run_tests_in_docker,3.10,n) .PHONY: clean clean: @rm -rf `find . -name __pycache__` @rm -rf `find . -name .hash` @rm -rf `find . -name .md5` # old styling @rm -f `find . -type f -name '*.py[co]' ` @rm -f `find . -type f -name '*~' ` @rm -f `find . -type f -name '.*~' ` @rm -f `find . -type f -name '@*' ` @rm -f `find . -type f -name '#*#' ` @rm -f `find . -type f -name '*.orig' ` @rm -f `find . -type f -name '*.rej' ` @rm -f `find . -type f -name '*.md5' ` # old styling @rm -f .coverage @rm -rf htmlcov @rm -rf build @rm -rf cover @make -C docs clean @python setup.py clean @rm -f aiohttp/*.so @rm -f aiohttp/*.pyd @rm -f aiohttp/*.html @rm -f aiohttp/_frozenlist.c @rm -f aiohttp/_find_header.c @rm -f aiohttp/_http_parser.c @rm -f aiohttp/_http_writer.c @rm -f aiohttp/_websocket.c @rm -rf .tox @rm -f .develop @rm -f .flake @rm -rf aiohttp.egg-info @rm -f .install-deps @rm -f .install-cython @rm -rf vendor/llhttp/node_modules @rm -f .llhttp-gen @$(MAKE) -C vendor/llhttp clean .PHONY: doc doc: @make -C docs html SPHINXOPTS="-W --keep-going -n -E" @echo "open file://`pwd`/docs/_build/html/index.html" .PHONY: doc-spelling doc-spelling: @make -C docs spelling SPHINXOPTS="-W --keep-going -n -E" .PHONY: install install: .update-pip @python -m pip install -r requirements/dev.in -c requirements/dev.txt .PHONY: install-dev install-dev: .develop .PHONY: sync-direct-runtime-deps sync-direct-runtime-deps: @echo Updating 'requirements/runtime-deps.in' from 'setup.cfg'... >&2 @python requirements/sync-direct-runtime-deps.py ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1713285830.559115 aiohttp-3.9.5/PKG-INFO0000644000175100001770000001642514607525307013723 0ustar00runnerdockerMetadata-Version: 2.1 Name: aiohttp Version: 3.9.5 Summary: Async http client/server framework (asyncio) Home-page: https://github.com/aio-libs/aiohttp Maintainer: aiohttp team Maintainer-email: team@aiohttp.org License: Apache 2 Project-URL: Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org Project-URL: Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org Project-URL: CI: GitHub Actions, https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiohttp Project-URL: Docs: Changelog, https://docs.aiohttp.org/en/stable/changes.html Project-URL: Docs: RTD, https://docs.aiohttp.org Project-URL: GitHub: issues, https://github.com/aio-libs/aiohttp/issues Project-URL: GitHub: repo, https://github.com/aio-libs/aiohttp Classifier: Development Status :: 5 - Production/Stable Classifier: Framework :: AsyncIO Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: Apache Software License Classifier: Operating System :: POSIX Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: Microsoft :: Windows Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Topic :: Internet :: WWW/HTTP Requires-Python: >=3.8 Description-Content-Type: text/x-rst License-File: LICENSE.txt Requires-Dist: aiosignal>=1.1.2 Requires-Dist: attrs>=17.3.0 Requires-Dist: async-timeout<5.0,>=4.0; python_version < "3.11" Requires-Dist: frozenlist>=1.1.1 Requires-Dist: multidict<7.0,>=4.5 Requires-Dist: yarl<2.0,>=1.0 Provides-Extra: speedups Requires-Dist: aiodns; (sys_platform == "linux" or sys_platform == "darwin") and extra == "speedups" Requires-Dist: Brotli; platform_python_implementation == "CPython" and extra == "speedups" Requires-Dist: brotlicffi; platform_python_implementation != "CPython" and extra == "speedups" ================================== Async http client/server framework ================================== .. image:: https://raw.githubusercontent.com/aio-libs/aiohttp/master/docs/aiohttp-plain.svg :height: 64px :width: 64px :alt: aiohttp logo | .. image:: https://github.com/aio-libs/aiohttp/workflows/CI/badge.svg :target: https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI :alt: GitHub Actions status for master branch .. image:: https://codecov.io/gh/aio-libs/aiohttp/branch/master/graph/badge.svg :target: https://codecov.io/gh/aio-libs/aiohttp :alt: codecov.io status for master branch .. image:: https://badge.fury.io/py/aiohttp.svg :target: https://pypi.org/project/aiohttp :alt: Latest PyPI package version .. image:: https://readthedocs.org/projects/aiohttp/badge/?version=latest :target: https://docs.aiohttp.org/ :alt: Latest Read The Docs .. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat :target: https://matrix.to/#/%23aio-libs:matrix.org :alt: Matrix Room — #aio-libs:matrix.org .. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat :target: https://matrix.to/#/%23aio-libs-space:matrix.org :alt: Matrix Space — #aio-libs-space:matrix.org Key Features ============ - Supports both client and server side of HTTP protocol. - Supports both client and server Web-Sockets out-of-the-box and avoids Callback Hell. - Provides Web-server with middleware and pluggable routing. Getting started =============== Client ------ To get something from the web: .. code-block:: python import aiohttp import asyncio async def main(): async with aiohttp.ClientSession() as session: async with session.get('http://python.org') as response: print("Status:", response.status) print("Content-type:", response.headers['content-type']) html = await response.text() print("Body:", html[:15], "...") asyncio.run(main()) This prints: .. code-block:: Status: 200 Content-type: text/html; charset=utf-8 Body: ... Coming from `requests `_ ? Read `why we need so many lines `_. Server ------ An example using a simple server: .. code-block:: python # examples/server_simple.py from aiohttp import web async def handle(request): name = request.match_info.get('name', "Anonymous") text = "Hello, " + name return web.Response(text=text) async def wshandle(request): ws = web.WebSocketResponse() await ws.prepare(request) async for msg in ws: if msg.type == web.WSMsgType.text: await ws.send_str("Hello, {}".format(msg.data)) elif msg.type == web.WSMsgType.binary: await ws.send_bytes(msg.data) elif msg.type == web.WSMsgType.close: break return ws app = web.Application() app.add_routes([web.get('/', handle), web.get('/echo', wshandle), web.get('/{name}', handle)]) if __name__ == '__main__': web.run_app(app) Documentation ============= https://aiohttp.readthedocs.io/ Demos ===== https://github.com/aio-libs/aiohttp-demos External links ============== * `Third party libraries `_ * `Built with aiohttp `_ * `Powered by aiohttp `_ Feel free to make a Pull Request for adding your link to these pages! Communication channels ====================== *aio-libs Discussions*: https://github.com/aio-libs/aiohttp/discussions *gitter chat* https://gitter.im/aio-libs/Lobby We support `Stack Overflow `_. Please add *aiohttp* tag to your question there. Requirements ============ - async-timeout_ - attrs_ - multidict_ - yarl_ - frozenlist_ Optionally you may install the aiodns_ library (highly recommended for sake of speed). .. _aiodns: https://pypi.python.org/pypi/aiodns .. _attrs: https://github.com/python-attrs/attrs .. _multidict: https://pypi.python.org/pypi/multidict .. _frozenlist: https://pypi.org/project/frozenlist/ .. _yarl: https://pypi.python.org/pypi/yarl .. _async-timeout: https://pypi.python.org/pypi/async_timeout License ======= ``aiohttp`` is offered under the Apache 2 license. Keepsafe ======== The aiohttp community would like to thank Keepsafe (https://www.getkeepsafe.com) for its support in the early days of the project. Source code =========== The latest developer version is available in a GitHub repository: https://github.com/aio-libs/aiohttp Benchmarks ========== If you are interested in efficiency, the AsyncIO community maintains a list of benchmarks on the official wiki: https://github.com/python/asyncio/wiki/Benchmarks ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/README.rst0000644000175100001770000001222614607525266014314 0ustar00runnerdocker================================== Async http client/server framework ================================== .. image:: https://raw.githubusercontent.com/aio-libs/aiohttp/master/docs/aiohttp-plain.svg :height: 64px :width: 64px :alt: aiohttp logo | .. image:: https://github.com/aio-libs/aiohttp/workflows/CI/badge.svg :target: https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI :alt: GitHub Actions status for master branch .. image:: https://codecov.io/gh/aio-libs/aiohttp/branch/master/graph/badge.svg :target: https://codecov.io/gh/aio-libs/aiohttp :alt: codecov.io status for master branch .. image:: https://badge.fury.io/py/aiohttp.svg :target: https://pypi.org/project/aiohttp :alt: Latest PyPI package version .. image:: https://readthedocs.org/projects/aiohttp/badge/?version=latest :target: https://docs.aiohttp.org/ :alt: Latest Read The Docs .. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat :target: https://matrix.to/#/%23aio-libs:matrix.org :alt: Matrix Room — #aio-libs:matrix.org .. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat :target: https://matrix.to/#/%23aio-libs-space:matrix.org :alt: Matrix Space — #aio-libs-space:matrix.org Key Features ============ - Supports both client and server side of HTTP protocol. - Supports both client and server Web-Sockets out-of-the-box and avoids Callback Hell. - Provides Web-server with middleware and pluggable routing. Getting started =============== Client ------ To get something from the web: .. code-block:: python import aiohttp import asyncio async def main(): async with aiohttp.ClientSession() as session: async with session.get('http://python.org') as response: print("Status:", response.status) print("Content-type:", response.headers['content-type']) html = await response.text() print("Body:", html[:15], "...") asyncio.run(main()) This prints: .. code-block:: Status: 200 Content-type: text/html; charset=utf-8 Body: ... Coming from `requests `_ ? Read `why we need so many lines `_. Server ------ An example using a simple server: .. code-block:: python # examples/server_simple.py from aiohttp import web async def handle(request): name = request.match_info.get('name', "Anonymous") text = "Hello, " + name return web.Response(text=text) async def wshandle(request): ws = web.WebSocketResponse() await ws.prepare(request) async for msg in ws: if msg.type == web.WSMsgType.text: await ws.send_str("Hello, {}".format(msg.data)) elif msg.type == web.WSMsgType.binary: await ws.send_bytes(msg.data) elif msg.type == web.WSMsgType.close: break return ws app = web.Application() app.add_routes([web.get('/', handle), web.get('/echo', wshandle), web.get('/{name}', handle)]) if __name__ == '__main__': web.run_app(app) Documentation ============= https://aiohttp.readthedocs.io/ Demos ===== https://github.com/aio-libs/aiohttp-demos External links ============== * `Third party libraries `_ * `Built with aiohttp `_ * `Powered by aiohttp `_ Feel free to make a Pull Request for adding your link to these pages! Communication channels ====================== *aio-libs Discussions*: https://github.com/aio-libs/aiohttp/discussions *gitter chat* https://gitter.im/aio-libs/Lobby We support `Stack Overflow `_. Please add *aiohttp* tag to your question there. Requirements ============ - async-timeout_ - attrs_ - multidict_ - yarl_ - frozenlist_ Optionally you may install the aiodns_ library (highly recommended for sake of speed). .. _aiodns: https://pypi.python.org/pypi/aiodns .. _attrs: https://github.com/python-attrs/attrs .. _multidict: https://pypi.python.org/pypi/multidict .. _frozenlist: https://pypi.org/project/frozenlist/ .. _yarl: https://pypi.python.org/pypi/yarl .. _async-timeout: https://pypi.python.org/pypi/async_timeout License ======= ``aiohttp`` is offered under the Apache 2 license. Keepsafe ======== The aiohttp community would like to thank Keepsafe (https://www.getkeepsafe.com) for its support in the early days of the project. Source code =========== The latest developer version is available in a GitHub repository: https://github.com/aio-libs/aiohttp Benchmarks ========== If you are interested in efficiency, the AsyncIO community maintains a list of benchmarks on the official wiki: https://github.com/python/asyncio/wiki/Benchmarks ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1713285830.503115 aiohttp-3.9.5/aiohttp/0000755000175100001770000000000014607525307014266 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1713285830.507115 aiohttp-3.9.5/aiohttp/.hash/0000755000175100001770000000000014607525307015267 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285826.0 aiohttp-3.9.5/aiohttp/.hash/_cparser.pxd.hash0000644000175100001770000000017114607525302020516 0ustar00runnerdockerf2318883e549f69de597009a914603b0f1b10381e265ef5d98af499ad973fb98 /home/runner/work/aiohttp/aiohttp/aiohttp/_cparser.pxd ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285826.0 aiohttp-3.9.5/aiohttp/.hash/_find_header.pxd.hash0000644000175100001770000000017514607525302021313 0ustar00runnerdockerd067f01423cddb3c442933b5fcc039b18ab651fcec1bc91c577693aafc25cf78 /home/runner/work/aiohttp/aiohttp/aiohttp/_find_header.pxd ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285826.0 aiohttp-3.9.5/aiohttp/.hash/_helpers.pyi.hash0000644000175100001770000000017114607525302020527 0ustar00runnerdocker6682a22524b9d4fc442e123672622be7bdfb6238d9709b7b15b2113b7ca6d52b /home/runner/work/aiohttp/aiohttp/aiohttp/_helpers.pyi ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285826.0 aiohttp-3.9.5/aiohttp/.hash/_helpers.pyx.hash0000644000175100001770000000017114607525302020546 0ustar00runnerdocker5de2db35fb795ffe227e2f1007c8ba4f2ad1b9aca28cc48edc80c779203cf6e3 /home/runner/work/aiohttp/aiohttp/aiohttp/_helpers.pyx ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285826.0 aiohttp-3.9.5/aiohttp/.hash/_http_parser.pyx.hash0000644000175100001770000000017514607525302021443 0ustar00runnerdockerabaf11ab4e8ca56f90c0bc6b884de120999620a73895515a587537725b077786 /home/runner/work/aiohttp/aiohttp/aiohttp/_http_parser.pyx ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285826.0 aiohttp-3.9.5/aiohttp/.hash/_http_writer.pyx.hash0000644000175100001770000000017514607525302021463 0ustar00runnerdocker6881c0a7c838655e646c645d99971efaf5e310bc3633a7c62b226e39d81842ac /home/runner/work/aiohttp/aiohttp/aiohttp/_http_writer.pyx ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285826.0 aiohttp-3.9.5/aiohttp/.hash/_websocket.pyx.hash0000644000175100001770000000017314607525302021074 0ustar00runnerdockerd57b8e48d0c26f20ebcc5e6e300da2b2a6aeb12b3c9768d64cb0e53432ccf48a /home/runner/work/aiohttp/aiohttp/aiohttp/_websocket.pyx ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285826.0 aiohttp-3.9.5/aiohttp/.hash/hdrs.py.hash0000644000175100001770000000016414607525302017517 0ustar00runnerdockerbb39f96a09ff8d789dda1fa4cba63464043c06b3de4c62c31abfb07a231cb6ca /home/runner/work/aiohttp/aiohttp/aiohttp/hdrs.py ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/__init__.py0000644000175100001770000001712214607525266016406 0ustar00runnerdocker__version__ = "3.9.5" from typing import TYPE_CHECKING, Tuple from . import hdrs as hdrs from .client import ( BaseConnector as BaseConnector, ClientConnectionError as ClientConnectionError, ClientConnectorCertificateError as ClientConnectorCertificateError, ClientConnectorError as ClientConnectorError, ClientConnectorSSLError as ClientConnectorSSLError, ClientError as ClientError, ClientHttpProxyError as ClientHttpProxyError, ClientOSError as ClientOSError, ClientPayloadError as ClientPayloadError, ClientProxyConnectionError as ClientProxyConnectionError, ClientRequest as ClientRequest, ClientResponse as ClientResponse, ClientResponseError as ClientResponseError, ClientSession as ClientSession, ClientSSLError as ClientSSLError, ClientTimeout as ClientTimeout, ClientWebSocketResponse as ClientWebSocketResponse, ContentTypeError as ContentTypeError, Fingerprint as Fingerprint, InvalidURL as InvalidURL, NamedPipeConnector as NamedPipeConnector, RequestInfo as RequestInfo, ServerConnectionError as ServerConnectionError, ServerDisconnectedError as ServerDisconnectedError, ServerFingerprintMismatch as ServerFingerprintMismatch, ServerTimeoutError as ServerTimeoutError, TCPConnector as TCPConnector, TooManyRedirects as TooManyRedirects, UnixConnector as UnixConnector, WSServerHandshakeError as WSServerHandshakeError, request as request, ) from .cookiejar import CookieJar as CookieJar, DummyCookieJar as DummyCookieJar from .formdata import FormData as FormData from .helpers import BasicAuth, ChainMapProxy, ETag from .http import ( HttpVersion as HttpVersion, HttpVersion10 as HttpVersion10, HttpVersion11 as HttpVersion11, WebSocketError as WebSocketError, WSCloseCode as WSCloseCode, WSMessage as WSMessage, WSMsgType as WSMsgType, ) from .multipart import ( BadContentDispositionHeader as BadContentDispositionHeader, BadContentDispositionParam as BadContentDispositionParam, BodyPartReader as BodyPartReader, MultipartReader as MultipartReader, MultipartWriter as MultipartWriter, content_disposition_filename as content_disposition_filename, parse_content_disposition as parse_content_disposition, ) from .payload import ( PAYLOAD_REGISTRY as PAYLOAD_REGISTRY, AsyncIterablePayload as AsyncIterablePayload, BufferedReaderPayload as BufferedReaderPayload, BytesIOPayload as BytesIOPayload, BytesPayload as BytesPayload, IOBasePayload as IOBasePayload, JsonPayload as JsonPayload, Payload as Payload, StringIOPayload as StringIOPayload, StringPayload as StringPayload, TextIOPayload as TextIOPayload, get_payload as get_payload, payload_type as payload_type, ) from .payload_streamer import streamer as streamer from .resolver import ( AsyncResolver as AsyncResolver, DefaultResolver as DefaultResolver, ThreadedResolver as ThreadedResolver, ) from .streams import ( EMPTY_PAYLOAD as EMPTY_PAYLOAD, DataQueue as DataQueue, EofStream as EofStream, FlowControlDataQueue as FlowControlDataQueue, StreamReader as StreamReader, ) from .tracing import ( TraceConfig as TraceConfig, TraceConnectionCreateEndParams as TraceConnectionCreateEndParams, TraceConnectionCreateStartParams as TraceConnectionCreateStartParams, TraceConnectionQueuedEndParams as TraceConnectionQueuedEndParams, TraceConnectionQueuedStartParams as TraceConnectionQueuedStartParams, TraceConnectionReuseconnParams as TraceConnectionReuseconnParams, TraceDnsCacheHitParams as TraceDnsCacheHitParams, TraceDnsCacheMissParams as TraceDnsCacheMissParams, TraceDnsResolveHostEndParams as TraceDnsResolveHostEndParams, TraceDnsResolveHostStartParams as TraceDnsResolveHostStartParams, TraceRequestChunkSentParams as TraceRequestChunkSentParams, TraceRequestEndParams as TraceRequestEndParams, TraceRequestExceptionParams as TraceRequestExceptionParams, TraceRequestRedirectParams as TraceRequestRedirectParams, TraceRequestStartParams as TraceRequestStartParams, TraceResponseChunkReceivedParams as TraceResponseChunkReceivedParams, ) if TYPE_CHECKING: # At runtime these are lazy-loaded at the bottom of the file. from .worker import ( GunicornUVLoopWebWorker as GunicornUVLoopWebWorker, GunicornWebWorker as GunicornWebWorker, ) __all__: Tuple[str, ...] = ( "hdrs", # client "BaseConnector", "ClientConnectionError", "ClientConnectorCertificateError", "ClientConnectorError", "ClientConnectorSSLError", "ClientError", "ClientHttpProxyError", "ClientOSError", "ClientPayloadError", "ClientProxyConnectionError", "ClientResponse", "ClientRequest", "ClientResponseError", "ClientSSLError", "ClientSession", "ClientTimeout", "ClientWebSocketResponse", "ContentTypeError", "Fingerprint", "InvalidURL", "RequestInfo", "ServerConnectionError", "ServerDisconnectedError", "ServerFingerprintMismatch", "ServerTimeoutError", "TCPConnector", "TooManyRedirects", "UnixConnector", "NamedPipeConnector", "WSServerHandshakeError", "request", # cookiejar "CookieJar", "DummyCookieJar", # formdata "FormData", # helpers "BasicAuth", "ChainMapProxy", "ETag", # http "HttpVersion", "HttpVersion10", "HttpVersion11", "WSMsgType", "WSCloseCode", "WSMessage", "WebSocketError", # multipart "BadContentDispositionHeader", "BadContentDispositionParam", "BodyPartReader", "MultipartReader", "MultipartWriter", "content_disposition_filename", "parse_content_disposition", # payload "AsyncIterablePayload", "BufferedReaderPayload", "BytesIOPayload", "BytesPayload", "IOBasePayload", "JsonPayload", "PAYLOAD_REGISTRY", "Payload", "StringIOPayload", "StringPayload", "TextIOPayload", "get_payload", "payload_type", # payload_streamer "streamer", # resolver "AsyncResolver", "DefaultResolver", "ThreadedResolver", # streams "DataQueue", "EMPTY_PAYLOAD", "EofStream", "FlowControlDataQueue", "StreamReader", # tracing "TraceConfig", "TraceConnectionCreateEndParams", "TraceConnectionCreateStartParams", "TraceConnectionQueuedEndParams", "TraceConnectionQueuedStartParams", "TraceConnectionReuseconnParams", "TraceDnsCacheHitParams", "TraceDnsCacheMissParams", "TraceDnsResolveHostEndParams", "TraceDnsResolveHostStartParams", "TraceRequestChunkSentParams", "TraceRequestEndParams", "TraceRequestExceptionParams", "TraceRequestRedirectParams", "TraceRequestStartParams", "TraceResponseChunkReceivedParams", # workers (imported lazily with __getattr__) "GunicornUVLoopWebWorker", "GunicornWebWorker", ) def __dir__() -> Tuple[str, ...]: return __all__ + ("__author__", "__doc__") def __getattr__(name: str) -> object: global GunicornUVLoopWebWorker, GunicornWebWorker # Importing gunicorn takes a long time (>100ms), so only import if actually needed. if name in ("GunicornUVLoopWebWorker", "GunicornWebWorker"): try: from .worker import GunicornUVLoopWebWorker as guv, GunicornWebWorker as gw except ImportError: return None GunicornUVLoopWebWorker = guv # type: ignore[misc] GunicornWebWorker = gw # type: ignore[misc] return guv if name == "GunicornUVLoopWebWorker" else gw raise AttributeError(f"module {__name__} has no attribute {name}") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/_cparser.pxd0000644000175100001770000001033614607525266016610 0ustar00runnerdockerfrom libc.stdint cimport int32_t, uint8_t, uint16_t, uint64_t cdef extern from "../vendor/llhttp/build/llhttp.h": struct llhttp__internal_s: int32_t _index void* _span_pos0 void* _span_cb0 int32_t error const char* reason const char* error_pos void* data void* _current uint64_t content_length uint8_t type uint8_t method uint8_t http_major uint8_t http_minor uint8_t header_state uint8_t lenient_flags uint8_t upgrade uint8_t finish uint16_t flags uint16_t status_code void* settings ctypedef llhttp__internal_s llhttp__internal_t ctypedef llhttp__internal_t llhttp_t ctypedef int (*llhttp_data_cb)(llhttp_t*, const char *at, size_t length) except -1 ctypedef int (*llhttp_cb)(llhttp_t*) except -1 struct llhttp_settings_s: llhttp_cb on_message_begin llhttp_data_cb on_url llhttp_data_cb on_status llhttp_data_cb on_header_field llhttp_data_cb on_header_value llhttp_cb on_headers_complete llhttp_data_cb on_body llhttp_cb on_message_complete llhttp_cb on_chunk_header llhttp_cb on_chunk_complete llhttp_cb on_url_complete llhttp_cb on_status_complete llhttp_cb on_header_field_complete llhttp_cb on_header_value_complete ctypedef llhttp_settings_s llhttp_settings_t enum llhttp_errno: HPE_OK, HPE_INTERNAL, HPE_STRICT, HPE_LF_EXPECTED, HPE_UNEXPECTED_CONTENT_LENGTH, HPE_CLOSED_CONNECTION, HPE_INVALID_METHOD, HPE_INVALID_URL, HPE_INVALID_CONSTANT, HPE_INVALID_VERSION, HPE_INVALID_HEADER_TOKEN, HPE_INVALID_CONTENT_LENGTH, HPE_INVALID_CHUNK_SIZE, HPE_INVALID_STATUS, HPE_INVALID_EOF_STATE, HPE_INVALID_TRANSFER_ENCODING, HPE_CB_MESSAGE_BEGIN, HPE_CB_HEADERS_COMPLETE, HPE_CB_MESSAGE_COMPLETE, HPE_CB_CHUNK_HEADER, HPE_CB_CHUNK_COMPLETE, HPE_PAUSED, HPE_PAUSED_UPGRADE, HPE_USER ctypedef llhttp_errno llhttp_errno_t enum llhttp_flags: F_CHUNKED, F_CONTENT_LENGTH enum llhttp_type: HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH enum llhttp_method: HTTP_DELETE, HTTP_GET, HTTP_HEAD, HTTP_POST, HTTP_PUT, HTTP_CONNECT, HTTP_OPTIONS, HTTP_TRACE, HTTP_COPY, HTTP_LOCK, HTTP_MKCOL, HTTP_MOVE, HTTP_PROPFIND, HTTP_PROPPATCH, HTTP_SEARCH, HTTP_UNLOCK, HTTP_BIND, HTTP_REBIND, HTTP_UNBIND, HTTP_ACL, HTTP_REPORT, HTTP_MKACTIVITY, HTTP_CHECKOUT, HTTP_MERGE, HTTP_MSEARCH, HTTP_NOTIFY, HTTP_SUBSCRIBE, HTTP_UNSUBSCRIBE, HTTP_PATCH, HTTP_PURGE, HTTP_MKCALENDAR, HTTP_LINK, HTTP_UNLINK, HTTP_SOURCE, HTTP_PRI, HTTP_DESCRIBE, HTTP_ANNOUNCE, HTTP_SETUP, HTTP_PLAY, HTTP_PAUSE, HTTP_TEARDOWN, HTTP_GET_PARAMETER, HTTP_SET_PARAMETER, HTTP_REDIRECT, HTTP_RECORD, HTTP_FLUSH ctypedef llhttp_method llhttp_method_t; void llhttp_settings_init(llhttp_settings_t* settings) void llhttp_init(llhttp_t* parser, llhttp_type type, const llhttp_settings_t* settings) llhttp_errno_t llhttp_execute(llhttp_t* parser, const char* data, size_t len) int llhttp_should_keep_alive(const llhttp_t* parser) void llhttp_resume_after_upgrade(llhttp_t* parser) llhttp_errno_t llhttp_get_errno(const llhttp_t* parser) const char* llhttp_get_error_reason(const llhttp_t* parser) const char* llhttp_get_error_pos(const llhttp_t* parser) const char* llhttp_method_name(llhttp_method_t method) void llhttp_set_lenient_headers(llhttp_t* parser, int enabled) void llhttp_set_lenient_optional_cr_before_lf(llhttp_t* parser, int enabled) void llhttp_set_lenient_spaces_after_chunk_size(llhttp_t* parser, int enabled) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285826.0 aiohttp-3.9.5/aiohttp/_find_header.c0000644000175100001770000055626214607525302017034 0ustar00runnerdocker/* The file is autogenerated from aiohttp/hdrs.py Run ./tools/gen.py to update it after the origin changing. */ #include "_find_header.h" #define NEXT_CHAR() \ { \ count++; \ if (count == size) { \ /* end of search */ \ return -1; \ } \ pchar++; \ ch = *pchar; \ last = (count == size -1); \ } while(0); int find_header(const char *str, int size) { char *pchar = str; int last; char ch; int count = -1; pchar--; NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto A; case 'a': if (last) { return -1; } goto A; case 'C': if (last) { return -1; } goto C; case 'c': if (last) { return -1; } goto C; case 'D': if (last) { return -1; } goto D; case 'd': if (last) { return -1; } goto D; case 'E': if (last) { return -1; } goto E; case 'e': if (last) { return -1; } goto E; case 'F': if (last) { return -1; } goto F; case 'f': if (last) { return -1; } goto F; case 'H': if (last) { return -1; } goto H; case 'h': if (last) { return -1; } goto H; case 'I': if (last) { return -1; } goto I; case 'i': if (last) { return -1; } goto I; case 'K': if (last) { return -1; } goto K; case 'k': if (last) { return -1; } goto K; case 'L': if (last) { return -1; } goto L; case 'l': if (last) { return -1; } goto L; case 'M': if (last) { return -1; } goto M; case 'm': if (last) { return -1; } goto M; case 'O': if (last) { return -1; } goto O; case 'o': if (last) { return -1; } goto O; case 'P': if (last) { return -1; } goto P; case 'p': if (last) { return -1; } goto P; case 'R': if (last) { return -1; } goto R; case 'r': if (last) { return -1; } goto R; case 'S': if (last) { return -1; } goto S; case 's': if (last) { return -1; } goto S; case 'T': if (last) { return -1; } goto T; case 't': if (last) { return -1; } goto T; case 'U': if (last) { return -1; } goto U; case 'u': if (last) { return -1; } goto U; case 'V': if (last) { return -1; } goto V; case 'v': if (last) { return -1; } goto V; case 'W': if (last) { return -1; } goto W; case 'w': if (last) { return -1; } goto W; case 'X': if (last) { return -1; } goto X; case 'x': if (last) { return -1; } goto X; default: return -1; } A: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto AC; case 'c': if (last) { return -1; } goto AC; case 'G': if (last) { return -1; } goto AG; case 'g': if (last) { return -1; } goto AG; case 'L': if (last) { return -1; } goto AL; case 'l': if (last) { return -1; } goto AL; case 'U': if (last) { return -1; } goto AU; case 'u': if (last) { return -1; } goto AU; default: return -1; } AC: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto ACC; case 'c': if (last) { return -1; } goto ACC; default: return -1; } ACC: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCE; case 'e': if (last) { return -1; } goto ACCE; default: return -1; } ACCE: NEXT_CHAR(); switch (ch) { case 'P': if (last) { return -1; } goto ACCEP; case 'p': if (last) { return -1; } goto ACCEP; case 'S': if (last) { return -1; } goto ACCES; case 's': if (last) { return -1; } goto ACCES; default: return -1; } ACCEP: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 0; } goto ACCEPT; case 't': if (last) { return 0; } goto ACCEPT; default: return -1; } ACCEPT: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto ACCEPT_; default: return -1; } ACCEPT_: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto ACCEPT_C; case 'c': if (last) { return -1; } goto ACCEPT_C; case 'E': if (last) { return -1; } goto ACCEPT_E; case 'e': if (last) { return -1; } goto ACCEPT_E; case 'L': if (last) { return -1; } goto ACCEPT_L; case 'l': if (last) { return -1; } goto ACCEPT_L; case 'R': if (last) { return -1; } goto ACCEPT_R; case 'r': if (last) { return -1; } goto ACCEPT_R; default: return -1; } ACCEPT_C: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto ACCEPT_CH; case 'h': if (last) { return -1; } goto ACCEPT_CH; default: return -1; } ACCEPT_CH: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCEPT_CHA; case 'a': if (last) { return -1; } goto ACCEPT_CHA; default: return -1; } ACCEPT_CHA: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto ACCEPT_CHAR; case 'r': if (last) { return -1; } goto ACCEPT_CHAR; default: return -1; } ACCEPT_CHAR: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto ACCEPT_CHARS; case 's': if (last) { return -1; } goto ACCEPT_CHARS; default: return -1; } ACCEPT_CHARS: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCEPT_CHARSE; case 'e': if (last) { return -1; } goto ACCEPT_CHARSE; default: return -1; } ACCEPT_CHARSE: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 1; } goto ACCEPT_CHARSET; case 't': if (last) { return 1; } goto ACCEPT_CHARSET; default: return -1; } ACCEPT_E: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto ACCEPT_EN; case 'n': if (last) { return -1; } goto ACCEPT_EN; default: return -1; } ACCEPT_EN: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto ACCEPT_ENC; case 'c': if (last) { return -1; } goto ACCEPT_ENC; default: return -1; } ACCEPT_ENC: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto ACCEPT_ENCO; case 'o': if (last) { return -1; } goto ACCEPT_ENCO; default: return -1; } ACCEPT_ENCO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto ACCEPT_ENCOD; case 'd': if (last) { return -1; } goto ACCEPT_ENCOD; default: return -1; } ACCEPT_ENCOD: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto ACCEPT_ENCODI; case 'i': if (last) { return -1; } goto ACCEPT_ENCODI; default: return -1; } ACCEPT_ENCODI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto ACCEPT_ENCODIN; case 'n': if (last) { return -1; } goto ACCEPT_ENCODIN; default: return -1; } ACCEPT_ENCODIN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return 2; } goto ACCEPT_ENCODING; case 'g': if (last) { return 2; } goto ACCEPT_ENCODING; default: return -1; } ACCEPT_L: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCEPT_LA; case 'a': if (last) { return -1; } goto ACCEPT_LA; default: return -1; } ACCEPT_LA: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto ACCEPT_LAN; case 'n': if (last) { return -1; } goto ACCEPT_LAN; default: return -1; } ACCEPT_LAN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto ACCEPT_LANG; case 'g': if (last) { return -1; } goto ACCEPT_LANG; default: return -1; } ACCEPT_LANG: NEXT_CHAR(); switch (ch) { case 'U': if (last) { return -1; } goto ACCEPT_LANGU; case 'u': if (last) { return -1; } goto ACCEPT_LANGU; default: return -1; } ACCEPT_LANGU: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCEPT_LANGUA; case 'a': if (last) { return -1; } goto ACCEPT_LANGUA; default: return -1; } ACCEPT_LANGUA: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto ACCEPT_LANGUAG; case 'g': if (last) { return -1; } goto ACCEPT_LANGUAG; default: return -1; } ACCEPT_LANGUAG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 3; } goto ACCEPT_LANGUAGE; case 'e': if (last) { return 3; } goto ACCEPT_LANGUAGE; default: return -1; } ACCEPT_R: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCEPT_RA; case 'a': if (last) { return -1; } goto ACCEPT_RA; default: return -1; } ACCEPT_RA: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto ACCEPT_RAN; case 'n': if (last) { return -1; } goto ACCEPT_RAN; default: return -1; } ACCEPT_RAN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto ACCEPT_RANG; case 'g': if (last) { return -1; } goto ACCEPT_RANG; default: return -1; } ACCEPT_RANG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCEPT_RANGE; case 'e': if (last) { return -1; } goto ACCEPT_RANGE; default: return -1; } ACCEPT_RANGE: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 4; } goto ACCEPT_RANGES; case 's': if (last) { return 4; } goto ACCEPT_RANGES; default: return -1; } ACCES: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto ACCESS; case 's': if (last) { return -1; } goto ACCESS; default: return -1; } ACCESS: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto ACCESS_; default: return -1; } ACCESS_: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto ACCESS_C; case 'c': if (last) { return -1; } goto ACCESS_C; default: return -1; } ACCESS_C: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto ACCESS_CO; case 'o': if (last) { return -1; } goto ACCESS_CO; default: return -1; } ACCESS_CO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto ACCESS_CON; case 'n': if (last) { return -1; } goto ACCESS_CON; default: return -1; } ACCESS_CON: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto ACCESS_CONT; case 't': if (last) { return -1; } goto ACCESS_CONT; default: return -1; } ACCESS_CONT: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto ACCESS_CONTR; case 'r': if (last) { return -1; } goto ACCESS_CONTR; default: return -1; } ACCESS_CONTR: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto ACCESS_CONTRO; case 'o': if (last) { return -1; } goto ACCESS_CONTRO; default: return -1; } ACCESS_CONTRO: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return -1; } goto ACCESS_CONTROL; case 'l': if (last) { return -1; } goto ACCESS_CONTROL; default: return -1; } ACCESS_CONTROL: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto ACCESS_CONTROL_; default: return -1; } ACCESS_CONTROL_: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCESS_CONTROL_A; case 'a': if (last) { return -1; } goto ACCESS_CONTROL_A; case 'E': if (last) { return -1; } goto ACCESS_CONTROL_E; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_E; case 'M': if (last) { return -1; } goto ACCESS_CONTROL_M; case 'm': if (last) { return -1; } goto ACCESS_CONTROL_M; case 'R': if (last) { return -1; } goto ACCESS_CONTROL_R; case 'r': if (last) { return -1; } goto ACCESS_CONTROL_R; default: return -1; } ACCESS_CONTROL_A: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return -1; } goto ACCESS_CONTROL_AL; case 'l': if (last) { return -1; } goto ACCESS_CONTROL_AL; default: return -1; } ACCESS_CONTROL_AL: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return -1; } goto ACCESS_CONTROL_ALL; case 'l': if (last) { return -1; } goto ACCESS_CONTROL_ALL; default: return -1; } ACCESS_CONTROL_ALL: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto ACCESS_CONTROL_ALLO; case 'o': if (last) { return -1; } goto ACCESS_CONTROL_ALLO; default: return -1; } ACCESS_CONTROL_ALLO: NEXT_CHAR(); switch (ch) { case 'W': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW; case 'w': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW; default: return -1; } ACCESS_CONTROL_ALLOW: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_; default: return -1; } ACCESS_CONTROL_ALLOW_: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_C; case 'c': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_C; case 'H': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_H; case 'h': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_H; case 'M': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_M; case 'm': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_M; case 'O': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_O; case 'o': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_O; default: return -1; } ACCESS_CONTROL_ALLOW_C: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CR; case 'r': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CR; default: return -1; } ACCESS_CONTROL_ALLOW_CR: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CRE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CRE; default: return -1; } ACCESS_CONTROL_ALLOW_CRE: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CRED; case 'd': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CRED; default: return -1; } ACCESS_CONTROL_ALLOW_CRED: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDE; default: return -1; } ACCESS_CONTROL_ALLOW_CREDE: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDEN; case 'n': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDEN; default: return -1; } ACCESS_CONTROL_ALLOW_CREDEN: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDENT; case 't': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDENT; default: return -1; } ACCESS_CONTROL_ALLOW_CREDENT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDENTI; case 'i': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDENTI; default: return -1; } ACCESS_CONTROL_ALLOW_CREDENTI: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDENTIA; case 'a': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDENTIA; default: return -1; } ACCESS_CONTROL_ALLOW_CREDENTIA: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDENTIAL; case 'l': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDENTIAL; default: return -1; } ACCESS_CONTROL_ALLOW_CREDENTIAL: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 5; } goto ACCESS_CONTROL_ALLOW_CREDENTIALS; case 's': if (last) { return 5; } goto ACCESS_CONTROL_ALLOW_CREDENTIALS; default: return -1; } ACCESS_CONTROL_ALLOW_H: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HE; default: return -1; } ACCESS_CONTROL_ALLOW_HE: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HEA; case 'a': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HEA; default: return -1; } ACCESS_CONTROL_ALLOW_HEA: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HEAD; case 'd': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HEAD; default: return -1; } ACCESS_CONTROL_ALLOW_HEAD: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HEADE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HEADE; default: return -1; } ACCESS_CONTROL_ALLOW_HEADE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HEADER; case 'r': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HEADER; default: return -1; } ACCESS_CONTROL_ALLOW_HEADER: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 6; } goto ACCESS_CONTROL_ALLOW_HEADERS; case 's': if (last) { return 6; } goto ACCESS_CONTROL_ALLOW_HEADERS; default: return -1; } ACCESS_CONTROL_ALLOW_M: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_ME; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_ME; default: return -1; } ACCESS_CONTROL_ALLOW_ME: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_MET; case 't': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_MET; default: return -1; } ACCESS_CONTROL_ALLOW_MET: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_METH; case 'h': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_METH; default: return -1; } ACCESS_CONTROL_ALLOW_METH: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_METHO; case 'o': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_METHO; default: return -1; } ACCESS_CONTROL_ALLOW_METHO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_METHOD; case 'd': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_METHOD; default: return -1; } ACCESS_CONTROL_ALLOW_METHOD: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 7; } goto ACCESS_CONTROL_ALLOW_METHODS; case 's': if (last) { return 7; } goto ACCESS_CONTROL_ALLOW_METHODS; default: return -1; } ACCESS_CONTROL_ALLOW_O: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_OR; case 'r': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_OR; default: return -1; } ACCESS_CONTROL_ALLOW_OR: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_ORI; case 'i': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_ORI; default: return -1; } ACCESS_CONTROL_ALLOW_ORI: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_ORIG; case 'g': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_ORIG; default: return -1; } ACCESS_CONTROL_ALLOW_ORIG: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_ORIGI; case 'i': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_ORIGI; default: return -1; } ACCESS_CONTROL_ALLOW_ORIGI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 8; } goto ACCESS_CONTROL_ALLOW_ORIGIN; case 'n': if (last) { return 8; } goto ACCESS_CONTROL_ALLOW_ORIGIN; default: return -1; } ACCESS_CONTROL_E: NEXT_CHAR(); switch (ch) { case 'X': if (last) { return -1; } goto ACCESS_CONTROL_EX; case 'x': if (last) { return -1; } goto ACCESS_CONTROL_EX; default: return -1; } ACCESS_CONTROL_EX: NEXT_CHAR(); switch (ch) { case 'P': if (last) { return -1; } goto ACCESS_CONTROL_EXP; case 'p': if (last) { return -1; } goto ACCESS_CONTROL_EXP; default: return -1; } ACCESS_CONTROL_EXP: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto ACCESS_CONTROL_EXPO; case 'o': if (last) { return -1; } goto ACCESS_CONTROL_EXPO; default: return -1; } ACCESS_CONTROL_EXPO: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto ACCESS_CONTROL_EXPOS; case 's': if (last) { return -1; } goto ACCESS_CONTROL_EXPOS; default: return -1; } ACCESS_CONTROL_EXPOS: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE; default: return -1; } ACCESS_CONTROL_EXPOSE: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_; default: return -1; } ACCESS_CONTROL_EXPOSE_: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_H; case 'h': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_H; default: return -1; } ACCESS_CONTROL_EXPOSE_H: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HE; default: return -1; } ACCESS_CONTROL_EXPOSE_HE: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HEA; case 'a': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HEA; default: return -1; } ACCESS_CONTROL_EXPOSE_HEA: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HEAD; case 'd': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HEAD; default: return -1; } ACCESS_CONTROL_EXPOSE_HEAD: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HEADE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HEADE; default: return -1; } ACCESS_CONTROL_EXPOSE_HEADE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HEADER; case 'r': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HEADER; default: return -1; } ACCESS_CONTROL_EXPOSE_HEADER: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 9; } goto ACCESS_CONTROL_EXPOSE_HEADERS; case 's': if (last) { return 9; } goto ACCESS_CONTROL_EXPOSE_HEADERS; default: return -1; } ACCESS_CONTROL_M: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCESS_CONTROL_MA; case 'a': if (last) { return -1; } goto ACCESS_CONTROL_MA; default: return -1; } ACCESS_CONTROL_MA: NEXT_CHAR(); switch (ch) { case 'X': if (last) { return -1; } goto ACCESS_CONTROL_MAX; case 'x': if (last) { return -1; } goto ACCESS_CONTROL_MAX; default: return -1; } ACCESS_CONTROL_MAX: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto ACCESS_CONTROL_MAX_; default: return -1; } ACCESS_CONTROL_MAX_: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCESS_CONTROL_MAX_A; case 'a': if (last) { return -1; } goto ACCESS_CONTROL_MAX_A; default: return -1; } ACCESS_CONTROL_MAX_A: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto ACCESS_CONTROL_MAX_AG; case 'g': if (last) { return -1; } goto ACCESS_CONTROL_MAX_AG; default: return -1; } ACCESS_CONTROL_MAX_AG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 10; } goto ACCESS_CONTROL_MAX_AGE; case 'e': if (last) { return 10; } goto ACCESS_CONTROL_MAX_AGE; default: return -1; } ACCESS_CONTROL_R: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_RE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_RE; default: return -1; } ACCESS_CONTROL_RE: NEXT_CHAR(); switch (ch) { case 'Q': if (last) { return -1; } goto ACCESS_CONTROL_REQ; case 'q': if (last) { return -1; } goto ACCESS_CONTROL_REQ; default: return -1; } ACCESS_CONTROL_REQ: NEXT_CHAR(); switch (ch) { case 'U': if (last) { return -1; } goto ACCESS_CONTROL_REQU; case 'u': if (last) { return -1; } goto ACCESS_CONTROL_REQU; default: return -1; } ACCESS_CONTROL_REQU: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_REQUE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_REQUE; default: return -1; } ACCESS_CONTROL_REQUE: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto ACCESS_CONTROL_REQUES; case 's': if (last) { return -1; } goto ACCESS_CONTROL_REQUES; default: return -1; } ACCESS_CONTROL_REQUES: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST; case 't': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST; default: return -1; } ACCESS_CONTROL_REQUEST: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_; default: return -1; } ACCESS_CONTROL_REQUEST_: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_H; case 'h': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_H; case 'M': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_M; case 'm': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_M; default: return -1; } ACCESS_CONTROL_REQUEST_H: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HE; default: return -1; } ACCESS_CONTROL_REQUEST_HE: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HEA; case 'a': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HEA; default: return -1; } ACCESS_CONTROL_REQUEST_HEA: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HEAD; case 'd': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HEAD; default: return -1; } ACCESS_CONTROL_REQUEST_HEAD: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HEADE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HEADE; default: return -1; } ACCESS_CONTROL_REQUEST_HEADE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HEADER; case 'r': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HEADER; default: return -1; } ACCESS_CONTROL_REQUEST_HEADER: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 11; } goto ACCESS_CONTROL_REQUEST_HEADERS; case 's': if (last) { return 11; } goto ACCESS_CONTROL_REQUEST_HEADERS; default: return -1; } ACCESS_CONTROL_REQUEST_M: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_ME; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_ME; default: return -1; } ACCESS_CONTROL_REQUEST_ME: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_MET; case 't': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_MET; default: return -1; } ACCESS_CONTROL_REQUEST_MET: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_METH; case 'h': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_METH; default: return -1; } ACCESS_CONTROL_REQUEST_METH: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_METHO; case 'o': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_METHO; default: return -1; } ACCESS_CONTROL_REQUEST_METHO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return 12; } goto ACCESS_CONTROL_REQUEST_METHOD; case 'd': if (last) { return 12; } goto ACCESS_CONTROL_REQUEST_METHOD; default: return -1; } AG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 13; } goto AGE; case 'e': if (last) { return 13; } goto AGE; default: return -1; } AL: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return -1; } goto ALL; case 'l': if (last) { return -1; } goto ALL; default: return -1; } ALL: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto ALLO; case 'o': if (last) { return -1; } goto ALLO; default: return -1; } ALLO: NEXT_CHAR(); switch (ch) { case 'W': if (last) { return 14; } goto ALLOW; case 'w': if (last) { return 14; } goto ALLOW; default: return -1; } AU: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto AUT; case 't': if (last) { return -1; } goto AUT; default: return -1; } AUT: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto AUTH; case 'h': if (last) { return -1; } goto AUTH; default: return -1; } AUTH: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto AUTHO; case 'o': if (last) { return -1; } goto AUTHO; default: return -1; } AUTHO: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto AUTHOR; case 'r': if (last) { return -1; } goto AUTHOR; default: return -1; } AUTHOR: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto AUTHORI; case 'i': if (last) { return -1; } goto AUTHORI; default: return -1; } AUTHORI: NEXT_CHAR(); switch (ch) { case 'Z': if (last) { return -1; } goto AUTHORIZ; case 'z': if (last) { return -1; } goto AUTHORIZ; default: return -1; } AUTHORIZ: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto AUTHORIZA; case 'a': if (last) { return -1; } goto AUTHORIZA; default: return -1; } AUTHORIZA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto AUTHORIZAT; case 't': if (last) { return -1; } goto AUTHORIZAT; default: return -1; } AUTHORIZAT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto AUTHORIZATI; case 'i': if (last) { return -1; } goto AUTHORIZATI; default: return -1; } AUTHORIZATI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto AUTHORIZATIO; case 'o': if (last) { return -1; } goto AUTHORIZATIO; default: return -1; } AUTHORIZATIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 15; } goto AUTHORIZATION; case 'n': if (last) { return 15; } goto AUTHORIZATION; default: return -1; } C: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto CA; case 'a': if (last) { return -1; } goto CA; case 'O': if (last) { return -1; } goto CO; case 'o': if (last) { return -1; } goto CO; default: return -1; } CA: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto CAC; case 'c': if (last) { return -1; } goto CAC; default: return -1; } CAC: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto CACH; case 'h': if (last) { return -1; } goto CACH; default: return -1; } CACH: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto CACHE; case 'e': if (last) { return -1; } goto CACHE; default: return -1; } CACHE: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto CACHE_; default: return -1; } CACHE_: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto CACHE_C; case 'c': if (last) { return -1; } goto CACHE_C; default: return -1; } CACHE_C: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto CACHE_CO; case 'o': if (last) { return -1; } goto CACHE_CO; default: return -1; } CACHE_CO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CACHE_CON; case 'n': if (last) { return -1; } goto CACHE_CON; default: return -1; } CACHE_CON: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto CACHE_CONT; case 't': if (last) { return -1; } goto CACHE_CONT; default: return -1; } CACHE_CONT: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto CACHE_CONTR; case 'r': if (last) { return -1; } goto CACHE_CONTR; default: return -1; } CACHE_CONTR: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto CACHE_CONTRO; case 'o': if (last) { return -1; } goto CACHE_CONTRO; default: return -1; } CACHE_CONTRO: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return 16; } goto CACHE_CONTROL; case 'l': if (last) { return 16; } goto CACHE_CONTROL; default: return -1; } CO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CON; case 'n': if (last) { return -1; } goto CON; case 'O': if (last) { return -1; } goto COO; case 'o': if (last) { return -1; } goto COO; default: return -1; } CON: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONN; case 'n': if (last) { return -1; } goto CONN; case 'T': if (last) { return -1; } goto CONT; case 't': if (last) { return -1; } goto CONT; default: return -1; } CONN: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto CONNE; case 'e': if (last) { return -1; } goto CONNE; default: return -1; } CONNE: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto CONNEC; case 'c': if (last) { return -1; } goto CONNEC; default: return -1; } CONNEC: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto CONNECT; case 't': if (last) { return -1; } goto CONNECT; default: return -1; } CONNECT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto CONNECTI; case 'i': if (last) { return -1; } goto CONNECTI; default: return -1; } CONNECTI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto CONNECTIO; case 'o': if (last) { return -1; } goto CONNECTIO; default: return -1; } CONNECTIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 17; } goto CONNECTION; case 'n': if (last) { return 17; } goto CONNECTION; default: return -1; } CONT: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto CONTE; case 'e': if (last) { return -1; } goto CONTE; default: return -1; } CONTE: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTEN; case 'n': if (last) { return -1; } goto CONTEN; default: return -1; } CONTEN: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto CONTENT; case 't': if (last) { return -1; } goto CONTENT; default: return -1; } CONTENT: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto CONTENT_; default: return -1; } CONTENT_: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto CONTENT_D; case 'd': if (last) { return -1; } goto CONTENT_D; case 'E': if (last) { return -1; } goto CONTENT_E; case 'e': if (last) { return -1; } goto CONTENT_E; case 'L': if (last) { return -1; } goto CONTENT_L; case 'l': if (last) { return -1; } goto CONTENT_L; case 'M': if (last) { return -1; } goto CONTENT_M; case 'm': if (last) { return -1; } goto CONTENT_M; case 'R': if (last) { return -1; } goto CONTENT_R; case 'r': if (last) { return -1; } goto CONTENT_R; case 'T': if (last) { return -1; } goto CONTENT_T; case 't': if (last) { return -1; } goto CONTENT_T; default: return -1; } CONTENT_D: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto CONTENT_DI; case 'i': if (last) { return -1; } goto CONTENT_DI; default: return -1; } CONTENT_DI: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto CONTENT_DIS; case 's': if (last) { return -1; } goto CONTENT_DIS; default: return -1; } CONTENT_DIS: NEXT_CHAR(); switch (ch) { case 'P': if (last) { return -1; } goto CONTENT_DISP; case 'p': if (last) { return -1; } goto CONTENT_DISP; default: return -1; } CONTENT_DISP: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto CONTENT_DISPO; case 'o': if (last) { return -1; } goto CONTENT_DISPO; default: return -1; } CONTENT_DISPO: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto CONTENT_DISPOS; case 's': if (last) { return -1; } goto CONTENT_DISPOS; default: return -1; } CONTENT_DISPOS: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto CONTENT_DISPOSI; case 'i': if (last) { return -1; } goto CONTENT_DISPOSI; default: return -1; } CONTENT_DISPOSI: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto CONTENT_DISPOSIT; case 't': if (last) { return -1; } goto CONTENT_DISPOSIT; default: return -1; } CONTENT_DISPOSIT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto CONTENT_DISPOSITI; case 'i': if (last) { return -1; } goto CONTENT_DISPOSITI; default: return -1; } CONTENT_DISPOSITI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto CONTENT_DISPOSITIO; case 'o': if (last) { return -1; } goto CONTENT_DISPOSITIO; default: return -1; } CONTENT_DISPOSITIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 18; } goto CONTENT_DISPOSITION; case 'n': if (last) { return 18; } goto CONTENT_DISPOSITION; default: return -1; } CONTENT_E: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTENT_EN; case 'n': if (last) { return -1; } goto CONTENT_EN; default: return -1; } CONTENT_EN: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto CONTENT_ENC; case 'c': if (last) { return -1; } goto CONTENT_ENC; default: return -1; } CONTENT_ENC: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto CONTENT_ENCO; case 'o': if (last) { return -1; } goto CONTENT_ENCO; default: return -1; } CONTENT_ENCO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto CONTENT_ENCOD; case 'd': if (last) { return -1; } goto CONTENT_ENCOD; default: return -1; } CONTENT_ENCOD: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto CONTENT_ENCODI; case 'i': if (last) { return -1; } goto CONTENT_ENCODI; default: return -1; } CONTENT_ENCODI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTENT_ENCODIN; case 'n': if (last) { return -1; } goto CONTENT_ENCODIN; default: return -1; } CONTENT_ENCODIN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return 19; } goto CONTENT_ENCODING; case 'g': if (last) { return 19; } goto CONTENT_ENCODING; default: return -1; } CONTENT_L: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto CONTENT_LA; case 'a': if (last) { return -1; } goto CONTENT_LA; case 'E': if (last) { return -1; } goto CONTENT_LE; case 'e': if (last) { return -1; } goto CONTENT_LE; case 'O': if (last) { return -1; } goto CONTENT_LO; case 'o': if (last) { return -1; } goto CONTENT_LO; default: return -1; } CONTENT_LA: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTENT_LAN; case 'n': if (last) { return -1; } goto CONTENT_LAN; default: return -1; } CONTENT_LAN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto CONTENT_LANG; case 'g': if (last) { return -1; } goto CONTENT_LANG; default: return -1; } CONTENT_LANG: NEXT_CHAR(); switch (ch) { case 'U': if (last) { return -1; } goto CONTENT_LANGU; case 'u': if (last) { return -1; } goto CONTENT_LANGU; default: return -1; } CONTENT_LANGU: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto CONTENT_LANGUA; case 'a': if (last) { return -1; } goto CONTENT_LANGUA; default: return -1; } CONTENT_LANGUA: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto CONTENT_LANGUAG; case 'g': if (last) { return -1; } goto CONTENT_LANGUAG; default: return -1; } CONTENT_LANGUAG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 20; } goto CONTENT_LANGUAGE; case 'e': if (last) { return 20; } goto CONTENT_LANGUAGE; default: return -1; } CONTENT_LE: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTENT_LEN; case 'n': if (last) { return -1; } goto CONTENT_LEN; default: return -1; } CONTENT_LEN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto CONTENT_LENG; case 'g': if (last) { return -1; } goto CONTENT_LENG; default: return -1; } CONTENT_LENG: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto CONTENT_LENGT; case 't': if (last) { return -1; } goto CONTENT_LENGT; default: return -1; } CONTENT_LENGT: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return 21; } goto CONTENT_LENGTH; case 'h': if (last) { return 21; } goto CONTENT_LENGTH; default: return -1; } CONTENT_LO: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto CONTENT_LOC; case 'c': if (last) { return -1; } goto CONTENT_LOC; default: return -1; } CONTENT_LOC: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto CONTENT_LOCA; case 'a': if (last) { return -1; } goto CONTENT_LOCA; default: return -1; } CONTENT_LOCA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto CONTENT_LOCAT; case 't': if (last) { return -1; } goto CONTENT_LOCAT; default: return -1; } CONTENT_LOCAT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto CONTENT_LOCATI; case 'i': if (last) { return -1; } goto CONTENT_LOCATI; default: return -1; } CONTENT_LOCATI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto CONTENT_LOCATIO; case 'o': if (last) { return -1; } goto CONTENT_LOCATIO; default: return -1; } CONTENT_LOCATIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 22; } goto CONTENT_LOCATION; case 'n': if (last) { return 22; } goto CONTENT_LOCATION; default: return -1; } CONTENT_M: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto CONTENT_MD; case 'd': if (last) { return -1; } goto CONTENT_MD; default: return -1; } CONTENT_MD: NEXT_CHAR(); switch (ch) { case '5': if (last) { return 23; } goto CONTENT_MD5; default: return -1; } CONTENT_R: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto CONTENT_RA; case 'a': if (last) { return -1; } goto CONTENT_RA; default: return -1; } CONTENT_RA: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTENT_RAN; case 'n': if (last) { return -1; } goto CONTENT_RAN; default: return -1; } CONTENT_RAN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto CONTENT_RANG; case 'g': if (last) { return -1; } goto CONTENT_RANG; default: return -1; } CONTENT_RANG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 24; } goto CONTENT_RANGE; case 'e': if (last) { return 24; } goto CONTENT_RANGE; default: return -1; } CONTENT_T: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto CONTENT_TR; case 'r': if (last) { return -1; } goto CONTENT_TR; case 'Y': if (last) { return -1; } goto CONTENT_TY; case 'y': if (last) { return -1; } goto CONTENT_TY; default: return -1; } CONTENT_TR: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto CONTENT_TRA; case 'a': if (last) { return -1; } goto CONTENT_TRA; default: return -1; } CONTENT_TRA: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTENT_TRAN; case 'n': if (last) { return -1; } goto CONTENT_TRAN; default: return -1; } CONTENT_TRAN: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto CONTENT_TRANS; case 's': if (last) { return -1; } goto CONTENT_TRANS; default: return -1; } CONTENT_TRANS: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto CONTENT_TRANSF; case 'f': if (last) { return -1; } goto CONTENT_TRANSF; default: return -1; } CONTENT_TRANSF: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto CONTENT_TRANSFE; case 'e': if (last) { return -1; } goto CONTENT_TRANSFE; default: return -1; } CONTENT_TRANSFE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto CONTENT_TRANSFER; case 'r': if (last) { return -1; } goto CONTENT_TRANSFER; default: return -1; } CONTENT_TRANSFER: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto CONTENT_TRANSFER_; default: return -1; } CONTENT_TRANSFER_: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto CONTENT_TRANSFER_E; case 'e': if (last) { return -1; } goto CONTENT_TRANSFER_E; default: return -1; } CONTENT_TRANSFER_E: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTENT_TRANSFER_EN; case 'n': if (last) { return -1; } goto CONTENT_TRANSFER_EN; default: return -1; } CONTENT_TRANSFER_EN: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto CONTENT_TRANSFER_ENC; case 'c': if (last) { return -1; } goto CONTENT_TRANSFER_ENC; default: return -1; } CONTENT_TRANSFER_ENC: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto CONTENT_TRANSFER_ENCO; case 'o': if (last) { return -1; } goto CONTENT_TRANSFER_ENCO; default: return -1; } CONTENT_TRANSFER_ENCO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto CONTENT_TRANSFER_ENCOD; case 'd': if (last) { return -1; } goto CONTENT_TRANSFER_ENCOD; default: return -1; } CONTENT_TRANSFER_ENCOD: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto CONTENT_TRANSFER_ENCODI; case 'i': if (last) { return -1; } goto CONTENT_TRANSFER_ENCODI; default: return -1; } CONTENT_TRANSFER_ENCODI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTENT_TRANSFER_ENCODIN; case 'n': if (last) { return -1; } goto CONTENT_TRANSFER_ENCODIN; default: return -1; } CONTENT_TRANSFER_ENCODIN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return 25; } goto CONTENT_TRANSFER_ENCODING; case 'g': if (last) { return 25; } goto CONTENT_TRANSFER_ENCODING; default: return -1; } CONTENT_TY: NEXT_CHAR(); switch (ch) { case 'P': if (last) { return -1; } goto CONTENT_TYP; case 'p': if (last) { return -1; } goto CONTENT_TYP; default: return -1; } CONTENT_TYP: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 26; } goto CONTENT_TYPE; case 'e': if (last) { return 26; } goto CONTENT_TYPE; default: return -1; } COO: NEXT_CHAR(); switch (ch) { case 'K': if (last) { return -1; } goto COOK; case 'k': if (last) { return -1; } goto COOK; default: return -1; } COOK: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto COOKI; case 'i': if (last) { return -1; } goto COOKI; default: return -1; } COOKI: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 27; } goto COOKIE; case 'e': if (last) { return 27; } goto COOKIE; default: return -1; } D: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto DA; case 'a': if (last) { return -1; } goto DA; case 'E': if (last) { return -1; } goto DE; case 'e': if (last) { return -1; } goto DE; case 'I': if (last) { return -1; } goto DI; case 'i': if (last) { return -1; } goto DI; default: return -1; } DA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto DAT; case 't': if (last) { return -1; } goto DAT; default: return -1; } DAT: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 28; } goto DATE; case 'e': if (last) { return 28; } goto DATE; default: return -1; } DE: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto DES; case 's': if (last) { return -1; } goto DES; default: return -1; } DES: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto DEST; case 't': if (last) { return -1; } goto DEST; default: return -1; } DEST: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto DESTI; case 'i': if (last) { return -1; } goto DESTI; default: return -1; } DESTI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto DESTIN; case 'n': if (last) { return -1; } goto DESTIN; default: return -1; } DESTIN: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto DESTINA; case 'a': if (last) { return -1; } goto DESTINA; default: return -1; } DESTINA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto DESTINAT; case 't': if (last) { return -1; } goto DESTINAT; default: return -1; } DESTINAT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto DESTINATI; case 'i': if (last) { return -1; } goto DESTINATI; default: return -1; } DESTINATI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto DESTINATIO; case 'o': if (last) { return -1; } goto DESTINATIO; default: return -1; } DESTINATIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 29; } goto DESTINATION; case 'n': if (last) { return 29; } goto DESTINATION; default: return -1; } DI: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto DIG; case 'g': if (last) { return -1; } goto DIG; default: return -1; } DIG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto DIGE; case 'e': if (last) { return -1; } goto DIGE; default: return -1; } DIGE: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto DIGES; case 's': if (last) { return -1; } goto DIGES; default: return -1; } DIGES: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 30; } goto DIGEST; case 't': if (last) { return 30; } goto DIGEST; default: return -1; } E: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto ET; case 't': if (last) { return -1; } goto ET; case 'X': if (last) { return -1; } goto EX; case 'x': if (last) { return -1; } goto EX; default: return -1; } ET: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ETA; case 'a': if (last) { return -1; } goto ETA; default: return -1; } ETA: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return 31; } goto ETAG; case 'g': if (last) { return 31; } goto ETAG; default: return -1; } EX: NEXT_CHAR(); switch (ch) { case 'P': if (last) { return -1; } goto EXP; case 'p': if (last) { return -1; } goto EXP; default: return -1; } EXP: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto EXPE; case 'e': if (last) { return -1; } goto EXPE; case 'I': if (last) { return -1; } goto EXPI; case 'i': if (last) { return -1; } goto EXPI; default: return -1; } EXPE: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto EXPEC; case 'c': if (last) { return -1; } goto EXPEC; default: return -1; } EXPEC: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 32; } goto EXPECT; case 't': if (last) { return 32; } goto EXPECT; default: return -1; } EXPI: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto EXPIR; case 'r': if (last) { return -1; } goto EXPIR; default: return -1; } EXPIR: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto EXPIRE; case 'e': if (last) { return -1; } goto EXPIRE; default: return -1; } EXPIRE: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 33; } goto EXPIRES; case 's': if (last) { return 33; } goto EXPIRES; default: return -1; } F: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto FO; case 'o': if (last) { return -1; } goto FO; case 'R': if (last) { return -1; } goto FR; case 'r': if (last) { return -1; } goto FR; default: return -1; } FO: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto FOR; case 'r': if (last) { return -1; } goto FOR; default: return -1; } FOR: NEXT_CHAR(); switch (ch) { case 'W': if (last) { return -1; } goto FORW; case 'w': if (last) { return -1; } goto FORW; default: return -1; } FORW: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto FORWA; case 'a': if (last) { return -1; } goto FORWA; default: return -1; } FORWA: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto FORWAR; case 'r': if (last) { return -1; } goto FORWAR; default: return -1; } FORWAR: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto FORWARD; case 'd': if (last) { return -1; } goto FORWARD; default: return -1; } FORWARD: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto FORWARDE; case 'e': if (last) { return -1; } goto FORWARDE; default: return -1; } FORWARDE: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return 34; } goto FORWARDED; case 'd': if (last) { return 34; } goto FORWARDED; default: return -1; } FR: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto FRO; case 'o': if (last) { return -1; } goto FRO; default: return -1; } FRO: NEXT_CHAR(); switch (ch) { case 'M': if (last) { return 35; } goto FROM; case 'm': if (last) { return 35; } goto FROM; default: return -1; } H: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto HO; case 'o': if (last) { return -1; } goto HO; default: return -1; } HO: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto HOS; case 's': if (last) { return -1; } goto HOS; default: return -1; } HOS: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 36; } goto HOST; case 't': if (last) { return 36; } goto HOST; default: return -1; } I: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto IF; case 'f': if (last) { return -1; } goto IF; default: return -1; } IF: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto IF_; default: return -1; } IF_: NEXT_CHAR(); switch (ch) { case 'M': if (last) { return -1; } goto IF_M; case 'm': if (last) { return -1; } goto IF_M; case 'N': if (last) { return -1; } goto IF_N; case 'n': if (last) { return -1; } goto IF_N; case 'R': if (last) { return -1; } goto IF_R; case 'r': if (last) { return -1; } goto IF_R; case 'U': if (last) { return -1; } goto IF_U; case 'u': if (last) { return -1; } goto IF_U; default: return -1; } IF_M: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto IF_MA; case 'a': if (last) { return -1; } goto IF_MA; case 'O': if (last) { return -1; } goto IF_MO; case 'o': if (last) { return -1; } goto IF_MO; default: return -1; } IF_MA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto IF_MAT; case 't': if (last) { return -1; } goto IF_MAT; default: return -1; } IF_MAT: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto IF_MATC; case 'c': if (last) { return -1; } goto IF_MATC; default: return -1; } IF_MATC: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return 37; } goto IF_MATCH; case 'h': if (last) { return 37; } goto IF_MATCH; default: return -1; } IF_MO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto IF_MOD; case 'd': if (last) { return -1; } goto IF_MOD; default: return -1; } IF_MOD: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto IF_MODI; case 'i': if (last) { return -1; } goto IF_MODI; default: return -1; } IF_MODI: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto IF_MODIF; case 'f': if (last) { return -1; } goto IF_MODIF; default: return -1; } IF_MODIF: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto IF_MODIFI; case 'i': if (last) { return -1; } goto IF_MODIFI; default: return -1; } IF_MODIFI: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto IF_MODIFIE; case 'e': if (last) { return -1; } goto IF_MODIFIE; default: return -1; } IF_MODIFIE: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto IF_MODIFIED; case 'd': if (last) { return -1; } goto IF_MODIFIED; default: return -1; } IF_MODIFIED: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto IF_MODIFIED_; default: return -1; } IF_MODIFIED_: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto IF_MODIFIED_S; case 's': if (last) { return -1; } goto IF_MODIFIED_S; default: return -1; } IF_MODIFIED_S: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto IF_MODIFIED_SI; case 'i': if (last) { return -1; } goto IF_MODIFIED_SI; default: return -1; } IF_MODIFIED_SI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto IF_MODIFIED_SIN; case 'n': if (last) { return -1; } goto IF_MODIFIED_SIN; default: return -1; } IF_MODIFIED_SIN: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto IF_MODIFIED_SINC; case 'c': if (last) { return -1; } goto IF_MODIFIED_SINC; default: return -1; } IF_MODIFIED_SINC: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 38; } goto IF_MODIFIED_SINCE; case 'e': if (last) { return 38; } goto IF_MODIFIED_SINCE; default: return -1; } IF_N: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto IF_NO; case 'o': if (last) { return -1; } goto IF_NO; default: return -1; } IF_NO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto IF_NON; case 'n': if (last) { return -1; } goto IF_NON; default: return -1; } IF_NON: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto IF_NONE; case 'e': if (last) { return -1; } goto IF_NONE; default: return -1; } IF_NONE: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto IF_NONE_; default: return -1; } IF_NONE_: NEXT_CHAR(); switch (ch) { case 'M': if (last) { return -1; } goto IF_NONE_M; case 'm': if (last) { return -1; } goto IF_NONE_M; default: return -1; } IF_NONE_M: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto IF_NONE_MA; case 'a': if (last) { return -1; } goto IF_NONE_MA; default: return -1; } IF_NONE_MA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto IF_NONE_MAT; case 't': if (last) { return -1; } goto IF_NONE_MAT; default: return -1; } IF_NONE_MAT: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto IF_NONE_MATC; case 'c': if (last) { return -1; } goto IF_NONE_MATC; default: return -1; } IF_NONE_MATC: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return 39; } goto IF_NONE_MATCH; case 'h': if (last) { return 39; } goto IF_NONE_MATCH; default: return -1; } IF_R: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto IF_RA; case 'a': if (last) { return -1; } goto IF_RA; default: return -1; } IF_RA: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto IF_RAN; case 'n': if (last) { return -1; } goto IF_RAN; default: return -1; } IF_RAN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto IF_RANG; case 'g': if (last) { return -1; } goto IF_RANG; default: return -1; } IF_RANG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 40; } goto IF_RANGE; case 'e': if (last) { return 40; } goto IF_RANGE; default: return -1; } IF_U: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto IF_UN; case 'n': if (last) { return -1; } goto IF_UN; default: return -1; } IF_UN: NEXT_CHAR(); switch (ch) { case 'M': if (last) { return -1; } goto IF_UNM; case 'm': if (last) { return -1; } goto IF_UNM; default: return -1; } IF_UNM: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto IF_UNMO; case 'o': if (last) { return -1; } goto IF_UNMO; default: return -1; } IF_UNMO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto IF_UNMOD; case 'd': if (last) { return -1; } goto IF_UNMOD; default: return -1; } IF_UNMOD: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto IF_UNMODI; case 'i': if (last) { return -1; } goto IF_UNMODI; default: return -1; } IF_UNMODI: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto IF_UNMODIF; case 'f': if (last) { return -1; } goto IF_UNMODIF; default: return -1; } IF_UNMODIF: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto IF_UNMODIFI; case 'i': if (last) { return -1; } goto IF_UNMODIFI; default: return -1; } IF_UNMODIFI: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto IF_UNMODIFIE; case 'e': if (last) { return -1; } goto IF_UNMODIFIE; default: return -1; } IF_UNMODIFIE: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto IF_UNMODIFIED; case 'd': if (last) { return -1; } goto IF_UNMODIFIED; default: return -1; } IF_UNMODIFIED: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto IF_UNMODIFIED_; default: return -1; } IF_UNMODIFIED_: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto IF_UNMODIFIED_S; case 's': if (last) { return -1; } goto IF_UNMODIFIED_S; default: return -1; } IF_UNMODIFIED_S: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto IF_UNMODIFIED_SI; case 'i': if (last) { return -1; } goto IF_UNMODIFIED_SI; default: return -1; } IF_UNMODIFIED_SI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto IF_UNMODIFIED_SIN; case 'n': if (last) { return -1; } goto IF_UNMODIFIED_SIN; default: return -1; } IF_UNMODIFIED_SIN: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto IF_UNMODIFIED_SINC; case 'c': if (last) { return -1; } goto IF_UNMODIFIED_SINC; default: return -1; } IF_UNMODIFIED_SINC: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 41; } goto IF_UNMODIFIED_SINCE; case 'e': if (last) { return 41; } goto IF_UNMODIFIED_SINCE; default: return -1; } K: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto KE; case 'e': if (last) { return -1; } goto KE; default: return -1; } KE: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto KEE; case 'e': if (last) { return -1; } goto KEE; default: return -1; } KEE: NEXT_CHAR(); switch (ch) { case 'P': if (last) { return -1; } goto KEEP; case 'p': if (last) { return -1; } goto KEEP; default: return -1; } KEEP: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto KEEP_; default: return -1; } KEEP_: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto KEEP_A; case 'a': if (last) { return -1; } goto KEEP_A; default: return -1; } KEEP_A: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return -1; } goto KEEP_AL; case 'l': if (last) { return -1; } goto KEEP_AL; default: return -1; } KEEP_AL: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto KEEP_ALI; case 'i': if (last) { return -1; } goto KEEP_ALI; default: return -1; } KEEP_ALI: NEXT_CHAR(); switch (ch) { case 'V': if (last) { return -1; } goto KEEP_ALIV; case 'v': if (last) { return -1; } goto KEEP_ALIV; default: return -1; } KEEP_ALIV: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 42; } goto KEEP_ALIVE; case 'e': if (last) { return 42; } goto KEEP_ALIVE; default: return -1; } L: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto LA; case 'a': if (last) { return -1; } goto LA; case 'I': if (last) { return -1; } goto LI; case 'i': if (last) { return -1; } goto LI; case 'O': if (last) { return -1; } goto LO; case 'o': if (last) { return -1; } goto LO; default: return -1; } LA: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto LAS; case 's': if (last) { return -1; } goto LAS; default: return -1; } LAS: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto LAST; case 't': if (last) { return -1; } goto LAST; default: return -1; } LAST: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto LAST_; default: return -1; } LAST_: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto LAST_E; case 'e': if (last) { return -1; } goto LAST_E; case 'M': if (last) { return -1; } goto LAST_M; case 'm': if (last) { return -1; } goto LAST_M; default: return -1; } LAST_E: NEXT_CHAR(); switch (ch) { case 'V': if (last) { return -1; } goto LAST_EV; case 'v': if (last) { return -1; } goto LAST_EV; default: return -1; } LAST_EV: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto LAST_EVE; case 'e': if (last) { return -1; } goto LAST_EVE; default: return -1; } LAST_EVE: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto LAST_EVEN; case 'n': if (last) { return -1; } goto LAST_EVEN; default: return -1; } LAST_EVEN: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto LAST_EVENT; case 't': if (last) { return -1; } goto LAST_EVENT; default: return -1; } LAST_EVENT: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto LAST_EVENT_; default: return -1; } LAST_EVENT_: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto LAST_EVENT_I; case 'i': if (last) { return -1; } goto LAST_EVENT_I; default: return -1; } LAST_EVENT_I: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return 43; } goto LAST_EVENT_ID; case 'd': if (last) { return 43; } goto LAST_EVENT_ID; default: return -1; } LAST_M: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto LAST_MO; case 'o': if (last) { return -1; } goto LAST_MO; default: return -1; } LAST_MO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto LAST_MOD; case 'd': if (last) { return -1; } goto LAST_MOD; default: return -1; } LAST_MOD: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto LAST_MODI; case 'i': if (last) { return -1; } goto LAST_MODI; default: return -1; } LAST_MODI: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto LAST_MODIF; case 'f': if (last) { return -1; } goto LAST_MODIF; default: return -1; } LAST_MODIF: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto LAST_MODIFI; case 'i': if (last) { return -1; } goto LAST_MODIFI; default: return -1; } LAST_MODIFI: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto LAST_MODIFIE; case 'e': if (last) { return -1; } goto LAST_MODIFIE; default: return -1; } LAST_MODIFIE: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return 44; } goto LAST_MODIFIED; case 'd': if (last) { return 44; } goto LAST_MODIFIED; default: return -1; } LI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto LIN; case 'n': if (last) { return -1; } goto LIN; default: return -1; } LIN: NEXT_CHAR(); switch (ch) { case 'K': if (last) { return 45; } goto LINK; case 'k': if (last) { return 45; } goto LINK; default: return -1; } LO: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto LOC; case 'c': if (last) { return -1; } goto LOC; default: return -1; } LOC: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto LOCA; case 'a': if (last) { return -1; } goto LOCA; default: return -1; } LOCA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto LOCAT; case 't': if (last) { return -1; } goto LOCAT; default: return -1; } LOCAT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto LOCATI; case 'i': if (last) { return -1; } goto LOCATI; default: return -1; } LOCATI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto LOCATIO; case 'o': if (last) { return -1; } goto LOCATIO; default: return -1; } LOCATIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 46; } goto LOCATION; case 'n': if (last) { return 46; } goto LOCATION; default: return -1; } M: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto MA; case 'a': if (last) { return -1; } goto MA; default: return -1; } MA: NEXT_CHAR(); switch (ch) { case 'X': if (last) { return -1; } goto MAX; case 'x': if (last) { return -1; } goto MAX; default: return -1; } MAX: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto MAX_; default: return -1; } MAX_: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto MAX_F; case 'f': if (last) { return -1; } goto MAX_F; default: return -1; } MAX_F: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto MAX_FO; case 'o': if (last) { return -1; } goto MAX_FO; default: return -1; } MAX_FO: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto MAX_FOR; case 'r': if (last) { return -1; } goto MAX_FOR; default: return -1; } MAX_FOR: NEXT_CHAR(); switch (ch) { case 'W': if (last) { return -1; } goto MAX_FORW; case 'w': if (last) { return -1; } goto MAX_FORW; default: return -1; } MAX_FORW: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto MAX_FORWA; case 'a': if (last) { return -1; } goto MAX_FORWA; default: return -1; } MAX_FORWA: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto MAX_FORWAR; case 'r': if (last) { return -1; } goto MAX_FORWAR; default: return -1; } MAX_FORWAR: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto MAX_FORWARD; case 'd': if (last) { return -1; } goto MAX_FORWARD; default: return -1; } MAX_FORWARD: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 47; } goto MAX_FORWARDS; case 's': if (last) { return 47; } goto MAX_FORWARDS; default: return -1; } O: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto OR; case 'r': if (last) { return -1; } goto OR; default: return -1; } OR: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto ORI; case 'i': if (last) { return -1; } goto ORI; default: return -1; } ORI: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto ORIG; case 'g': if (last) { return -1; } goto ORIG; default: return -1; } ORIG: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto ORIGI; case 'i': if (last) { return -1; } goto ORIGI; default: return -1; } ORIGI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 48; } goto ORIGIN; case 'n': if (last) { return 48; } goto ORIGIN; default: return -1; } P: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto PR; case 'r': if (last) { return -1; } goto PR; default: return -1; } PR: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto PRA; case 'a': if (last) { return -1; } goto PRA; case 'O': if (last) { return -1; } goto PRO; case 'o': if (last) { return -1; } goto PRO; default: return -1; } PRA: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto PRAG; case 'g': if (last) { return -1; } goto PRAG; default: return -1; } PRAG: NEXT_CHAR(); switch (ch) { case 'M': if (last) { return -1; } goto PRAGM; case 'm': if (last) { return -1; } goto PRAGM; default: return -1; } PRAGM: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return 49; } goto PRAGMA; case 'a': if (last) { return 49; } goto PRAGMA; default: return -1; } PRO: NEXT_CHAR(); switch (ch) { case 'X': if (last) { return -1; } goto PROX; case 'x': if (last) { return -1; } goto PROX; default: return -1; } PROX: NEXT_CHAR(); switch (ch) { case 'Y': if (last) { return -1; } goto PROXY; case 'y': if (last) { return -1; } goto PROXY; default: return -1; } PROXY: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto PROXY_; default: return -1; } PROXY_: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto PROXY_A; case 'a': if (last) { return -1; } goto PROXY_A; default: return -1; } PROXY_A: NEXT_CHAR(); switch (ch) { case 'U': if (last) { return -1; } goto PROXY_AU; case 'u': if (last) { return -1; } goto PROXY_AU; default: return -1; } PROXY_AU: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto PROXY_AUT; case 't': if (last) { return -1; } goto PROXY_AUT; default: return -1; } PROXY_AUT: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto PROXY_AUTH; case 'h': if (last) { return -1; } goto PROXY_AUTH; default: return -1; } PROXY_AUTH: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto PROXY_AUTHE; case 'e': if (last) { return -1; } goto PROXY_AUTHE; case 'O': if (last) { return -1; } goto PROXY_AUTHO; case 'o': if (last) { return -1; } goto PROXY_AUTHO; default: return -1; } PROXY_AUTHE: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto PROXY_AUTHEN; case 'n': if (last) { return -1; } goto PROXY_AUTHEN; default: return -1; } PROXY_AUTHEN: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto PROXY_AUTHENT; case 't': if (last) { return -1; } goto PROXY_AUTHENT; default: return -1; } PROXY_AUTHENT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto PROXY_AUTHENTI; case 'i': if (last) { return -1; } goto PROXY_AUTHENTI; default: return -1; } PROXY_AUTHENTI: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto PROXY_AUTHENTIC; case 'c': if (last) { return -1; } goto PROXY_AUTHENTIC; default: return -1; } PROXY_AUTHENTIC: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto PROXY_AUTHENTICA; case 'a': if (last) { return -1; } goto PROXY_AUTHENTICA; default: return -1; } PROXY_AUTHENTICA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto PROXY_AUTHENTICAT; case 't': if (last) { return -1; } goto PROXY_AUTHENTICAT; default: return -1; } PROXY_AUTHENTICAT: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 50; } goto PROXY_AUTHENTICATE; case 'e': if (last) { return 50; } goto PROXY_AUTHENTICATE; default: return -1; } PROXY_AUTHO: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto PROXY_AUTHOR; case 'r': if (last) { return -1; } goto PROXY_AUTHOR; default: return -1; } PROXY_AUTHOR: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto PROXY_AUTHORI; case 'i': if (last) { return -1; } goto PROXY_AUTHORI; default: return -1; } PROXY_AUTHORI: NEXT_CHAR(); switch (ch) { case 'Z': if (last) { return -1; } goto PROXY_AUTHORIZ; case 'z': if (last) { return -1; } goto PROXY_AUTHORIZ; default: return -1; } PROXY_AUTHORIZ: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto PROXY_AUTHORIZA; case 'a': if (last) { return -1; } goto PROXY_AUTHORIZA; default: return -1; } PROXY_AUTHORIZA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto PROXY_AUTHORIZAT; case 't': if (last) { return -1; } goto PROXY_AUTHORIZAT; default: return -1; } PROXY_AUTHORIZAT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto PROXY_AUTHORIZATI; case 'i': if (last) { return -1; } goto PROXY_AUTHORIZATI; default: return -1; } PROXY_AUTHORIZATI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto PROXY_AUTHORIZATIO; case 'o': if (last) { return -1; } goto PROXY_AUTHORIZATIO; default: return -1; } PROXY_AUTHORIZATIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 51; } goto PROXY_AUTHORIZATION; case 'n': if (last) { return 51; } goto PROXY_AUTHORIZATION; default: return -1; } R: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto RA; case 'a': if (last) { return -1; } goto RA; case 'E': if (last) { return -1; } goto RE; case 'e': if (last) { return -1; } goto RE; default: return -1; } RA: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto RAN; case 'n': if (last) { return -1; } goto RAN; default: return -1; } RAN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto RANG; case 'g': if (last) { return -1; } goto RANG; default: return -1; } RANG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 52; } goto RANGE; case 'e': if (last) { return 52; } goto RANGE; default: return -1; } RE: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto REF; case 'f': if (last) { return -1; } goto REF; case 'T': if (last) { return -1; } goto RET; case 't': if (last) { return -1; } goto RET; default: return -1; } REF: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto REFE; case 'e': if (last) { return -1; } goto REFE; default: return -1; } REFE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto REFER; case 'r': if (last) { return -1; } goto REFER; default: return -1; } REFER: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto REFERE; case 'e': if (last) { return -1; } goto REFERE; default: return -1; } REFERE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return 53; } goto REFERER; case 'r': if (last) { return 53; } goto REFERER; default: return -1; } RET: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto RETR; case 'r': if (last) { return -1; } goto RETR; default: return -1; } RETR: NEXT_CHAR(); switch (ch) { case 'Y': if (last) { return -1; } goto RETRY; case 'y': if (last) { return -1; } goto RETRY; default: return -1; } RETRY: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto RETRY_; default: return -1; } RETRY_: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto RETRY_A; case 'a': if (last) { return -1; } goto RETRY_A; default: return -1; } RETRY_A: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto RETRY_AF; case 'f': if (last) { return -1; } goto RETRY_AF; default: return -1; } RETRY_AF: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto RETRY_AFT; case 't': if (last) { return -1; } goto RETRY_AFT; default: return -1; } RETRY_AFT: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto RETRY_AFTE; case 'e': if (last) { return -1; } goto RETRY_AFTE; default: return -1; } RETRY_AFTE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return 54; } goto RETRY_AFTER; case 'r': if (last) { return 54; } goto RETRY_AFTER; default: return -1; } S: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto SE; case 'e': if (last) { return -1; } goto SE; default: return -1; } SE: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto SEC; case 'c': if (last) { return -1; } goto SEC; case 'R': if (last) { return -1; } goto SER; case 'r': if (last) { return -1; } goto SER; case 'T': if (last) { return -1; } goto SET; case 't': if (last) { return -1; } goto SET; default: return -1; } SEC: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto SEC_; default: return -1; } SEC_: NEXT_CHAR(); switch (ch) { case 'W': if (last) { return -1; } goto SEC_W; case 'w': if (last) { return -1; } goto SEC_W; default: return -1; } SEC_W: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto SEC_WE; case 'e': if (last) { return -1; } goto SEC_WE; default: return -1; } SEC_WE: NEXT_CHAR(); switch (ch) { case 'B': if (last) { return -1; } goto SEC_WEB; case 'b': if (last) { return -1; } goto SEC_WEB; default: return -1; } SEC_WEB: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto SEC_WEBS; case 's': if (last) { return -1; } goto SEC_WEBS; default: return -1; } SEC_WEBS: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto SEC_WEBSO; case 'o': if (last) { return -1; } goto SEC_WEBSO; default: return -1; } SEC_WEBSO: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto SEC_WEBSOC; case 'c': if (last) { return -1; } goto SEC_WEBSOC; default: return -1; } SEC_WEBSOC: NEXT_CHAR(); switch (ch) { case 'K': if (last) { return -1; } goto SEC_WEBSOCK; case 'k': if (last) { return -1; } goto SEC_WEBSOCK; default: return -1; } SEC_WEBSOCK: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto SEC_WEBSOCKE; case 'e': if (last) { return -1; } goto SEC_WEBSOCKE; default: return -1; } SEC_WEBSOCKE: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto SEC_WEBSOCKET; case 't': if (last) { return -1; } goto SEC_WEBSOCKET; default: return -1; } SEC_WEBSOCKET: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto SEC_WEBSOCKET_; default: return -1; } SEC_WEBSOCKET_: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto SEC_WEBSOCKET_A; case 'a': if (last) { return -1; } goto SEC_WEBSOCKET_A; case 'E': if (last) { return -1; } goto SEC_WEBSOCKET_E; case 'e': if (last) { return -1; } goto SEC_WEBSOCKET_E; case 'K': if (last) { return -1; } goto SEC_WEBSOCKET_K; case 'k': if (last) { return -1; } goto SEC_WEBSOCKET_K; case 'P': if (last) { return -1; } goto SEC_WEBSOCKET_P; case 'p': if (last) { return -1; } goto SEC_WEBSOCKET_P; case 'V': if (last) { return -1; } goto SEC_WEBSOCKET_V; case 'v': if (last) { return -1; } goto SEC_WEBSOCKET_V; default: return -1; } SEC_WEBSOCKET_A: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto SEC_WEBSOCKET_AC; case 'c': if (last) { return -1; } goto SEC_WEBSOCKET_AC; default: return -1; } SEC_WEBSOCKET_AC: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto SEC_WEBSOCKET_ACC; case 'c': if (last) { return -1; } goto SEC_WEBSOCKET_ACC; default: return -1; } SEC_WEBSOCKET_ACC: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto SEC_WEBSOCKET_ACCE; case 'e': if (last) { return -1; } goto SEC_WEBSOCKET_ACCE; default: return -1; } SEC_WEBSOCKET_ACCE: NEXT_CHAR(); switch (ch) { case 'P': if (last) { return -1; } goto SEC_WEBSOCKET_ACCEP; case 'p': if (last) { return -1; } goto SEC_WEBSOCKET_ACCEP; default: return -1; } SEC_WEBSOCKET_ACCEP: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 55; } goto SEC_WEBSOCKET_ACCEPT; case 't': if (last) { return 55; } goto SEC_WEBSOCKET_ACCEPT; default: return -1; } SEC_WEBSOCKET_E: NEXT_CHAR(); switch (ch) { case 'X': if (last) { return -1; } goto SEC_WEBSOCKET_EX; case 'x': if (last) { return -1; } goto SEC_WEBSOCKET_EX; default: return -1; } SEC_WEBSOCKET_EX: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto SEC_WEBSOCKET_EXT; case 't': if (last) { return -1; } goto SEC_WEBSOCKET_EXT; default: return -1; } SEC_WEBSOCKET_EXT: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto SEC_WEBSOCKET_EXTE; case 'e': if (last) { return -1; } goto SEC_WEBSOCKET_EXTE; default: return -1; } SEC_WEBSOCKET_EXTE: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto SEC_WEBSOCKET_EXTEN; case 'n': if (last) { return -1; } goto SEC_WEBSOCKET_EXTEN; default: return -1; } SEC_WEBSOCKET_EXTEN: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto SEC_WEBSOCKET_EXTENS; case 's': if (last) { return -1; } goto SEC_WEBSOCKET_EXTENS; default: return -1; } SEC_WEBSOCKET_EXTENS: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto SEC_WEBSOCKET_EXTENSI; case 'i': if (last) { return -1; } goto SEC_WEBSOCKET_EXTENSI; default: return -1; } SEC_WEBSOCKET_EXTENSI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto SEC_WEBSOCKET_EXTENSIO; case 'o': if (last) { return -1; } goto SEC_WEBSOCKET_EXTENSIO; default: return -1; } SEC_WEBSOCKET_EXTENSIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto SEC_WEBSOCKET_EXTENSION; case 'n': if (last) { return -1; } goto SEC_WEBSOCKET_EXTENSION; default: return -1; } SEC_WEBSOCKET_EXTENSION: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 56; } goto SEC_WEBSOCKET_EXTENSIONS; case 's': if (last) { return 56; } goto SEC_WEBSOCKET_EXTENSIONS; default: return -1; } SEC_WEBSOCKET_K: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto SEC_WEBSOCKET_KE; case 'e': if (last) { return -1; } goto SEC_WEBSOCKET_KE; default: return -1; } SEC_WEBSOCKET_KE: NEXT_CHAR(); switch (ch) { case 'Y': if (last) { return 57; } goto SEC_WEBSOCKET_KEY; case 'y': if (last) { return 57; } goto SEC_WEBSOCKET_KEY; default: return -1; } SEC_WEBSOCKET_KEY: NEXT_CHAR(); switch (ch) { case '1': if (last) { return 58; } goto SEC_WEBSOCKET_KEY1; default: return -1; } SEC_WEBSOCKET_P: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto SEC_WEBSOCKET_PR; case 'r': if (last) { return -1; } goto SEC_WEBSOCKET_PR; default: return -1; } SEC_WEBSOCKET_PR: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto SEC_WEBSOCKET_PRO; case 'o': if (last) { return -1; } goto SEC_WEBSOCKET_PRO; default: return -1; } SEC_WEBSOCKET_PRO: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto SEC_WEBSOCKET_PROT; case 't': if (last) { return -1; } goto SEC_WEBSOCKET_PROT; default: return -1; } SEC_WEBSOCKET_PROT: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto SEC_WEBSOCKET_PROTO; case 'o': if (last) { return -1; } goto SEC_WEBSOCKET_PROTO; default: return -1; } SEC_WEBSOCKET_PROTO: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto SEC_WEBSOCKET_PROTOC; case 'c': if (last) { return -1; } goto SEC_WEBSOCKET_PROTOC; default: return -1; } SEC_WEBSOCKET_PROTOC: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto SEC_WEBSOCKET_PROTOCO; case 'o': if (last) { return -1; } goto SEC_WEBSOCKET_PROTOCO; default: return -1; } SEC_WEBSOCKET_PROTOCO: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return 59; } goto SEC_WEBSOCKET_PROTOCOL; case 'l': if (last) { return 59; } goto SEC_WEBSOCKET_PROTOCOL; default: return -1; } SEC_WEBSOCKET_V: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto SEC_WEBSOCKET_VE; case 'e': if (last) { return -1; } goto SEC_WEBSOCKET_VE; default: return -1; } SEC_WEBSOCKET_VE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto SEC_WEBSOCKET_VER; case 'r': if (last) { return -1; } goto SEC_WEBSOCKET_VER; default: return -1; } SEC_WEBSOCKET_VER: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto SEC_WEBSOCKET_VERS; case 's': if (last) { return -1; } goto SEC_WEBSOCKET_VERS; default: return -1; } SEC_WEBSOCKET_VERS: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto SEC_WEBSOCKET_VERSI; case 'i': if (last) { return -1; } goto SEC_WEBSOCKET_VERSI; default: return -1; } SEC_WEBSOCKET_VERSI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto SEC_WEBSOCKET_VERSIO; case 'o': if (last) { return -1; } goto SEC_WEBSOCKET_VERSIO; default: return -1; } SEC_WEBSOCKET_VERSIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 60; } goto SEC_WEBSOCKET_VERSION; case 'n': if (last) { return 60; } goto SEC_WEBSOCKET_VERSION; default: return -1; } SER: NEXT_CHAR(); switch (ch) { case 'V': if (last) { return -1; } goto SERV; case 'v': if (last) { return -1; } goto SERV; default: return -1; } SERV: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto SERVE; case 'e': if (last) { return -1; } goto SERVE; default: return -1; } SERVE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return 61; } goto SERVER; case 'r': if (last) { return 61; } goto SERVER; default: return -1; } SET: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto SET_; default: return -1; } SET_: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto SET_C; case 'c': if (last) { return -1; } goto SET_C; default: return -1; } SET_C: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto SET_CO; case 'o': if (last) { return -1; } goto SET_CO; default: return -1; } SET_CO: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto SET_COO; case 'o': if (last) { return -1; } goto SET_COO; default: return -1; } SET_COO: NEXT_CHAR(); switch (ch) { case 'K': if (last) { return -1; } goto SET_COOK; case 'k': if (last) { return -1; } goto SET_COOK; default: return -1; } SET_COOK: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto SET_COOKI; case 'i': if (last) { return -1; } goto SET_COOKI; default: return -1; } SET_COOKI: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 62; } goto SET_COOKIE; case 'e': if (last) { return 62; } goto SET_COOKIE; default: return -1; } T: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 63; } goto TE; case 'e': if (last) { return 63; } goto TE; case 'R': if (last) { return -1; } goto TR; case 'r': if (last) { return -1; } goto TR; default: return -1; } TR: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto TRA; case 'a': if (last) { return -1; } goto TRA; default: return -1; } TRA: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto TRAI; case 'i': if (last) { return -1; } goto TRAI; case 'N': if (last) { return -1; } goto TRAN; case 'n': if (last) { return -1; } goto TRAN; default: return -1; } TRAI: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return -1; } goto TRAIL; case 'l': if (last) { return -1; } goto TRAIL; default: return -1; } TRAIL: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto TRAILE; case 'e': if (last) { return -1; } goto TRAILE; default: return -1; } TRAILE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return 64; } goto TRAILER; case 'r': if (last) { return 64; } goto TRAILER; default: return -1; } TRAN: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto TRANS; case 's': if (last) { return -1; } goto TRANS; default: return -1; } TRANS: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto TRANSF; case 'f': if (last) { return -1; } goto TRANSF; default: return -1; } TRANSF: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto TRANSFE; case 'e': if (last) { return -1; } goto TRANSFE; default: return -1; } TRANSFE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto TRANSFER; case 'r': if (last) { return -1; } goto TRANSFER; default: return -1; } TRANSFER: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto TRANSFER_; default: return -1; } TRANSFER_: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto TRANSFER_E; case 'e': if (last) { return -1; } goto TRANSFER_E; default: return -1; } TRANSFER_E: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto TRANSFER_EN; case 'n': if (last) { return -1; } goto TRANSFER_EN; default: return -1; } TRANSFER_EN: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto TRANSFER_ENC; case 'c': if (last) { return -1; } goto TRANSFER_ENC; default: return -1; } TRANSFER_ENC: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto TRANSFER_ENCO; case 'o': if (last) { return -1; } goto TRANSFER_ENCO; default: return -1; } TRANSFER_ENCO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto TRANSFER_ENCOD; case 'd': if (last) { return -1; } goto TRANSFER_ENCOD; default: return -1; } TRANSFER_ENCOD: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto TRANSFER_ENCODI; case 'i': if (last) { return -1; } goto TRANSFER_ENCODI; default: return -1; } TRANSFER_ENCODI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto TRANSFER_ENCODIN; case 'n': if (last) { return -1; } goto TRANSFER_ENCODIN; default: return -1; } TRANSFER_ENCODIN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return 65; } goto TRANSFER_ENCODING; case 'g': if (last) { return 65; } goto TRANSFER_ENCODING; default: return -1; } U: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto UR; case 'r': if (last) { return -1; } goto UR; case 'P': if (last) { return -1; } goto UP; case 'p': if (last) { return -1; } goto UP; case 'S': if (last) { return -1; } goto US; case 's': if (last) { return -1; } goto US; default: return -1; } UR: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return 66; } goto URI; case 'i': if (last) { return 66; } goto URI; default: return -1; } UP: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto UPG; case 'g': if (last) { return -1; } goto UPG; default: return -1; } UPG: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto UPGR; case 'r': if (last) { return -1; } goto UPGR; default: return -1; } UPGR: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto UPGRA; case 'a': if (last) { return -1; } goto UPGRA; default: return -1; } UPGRA: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto UPGRAD; case 'd': if (last) { return -1; } goto UPGRAD; default: return -1; } UPGRAD: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 67; } goto UPGRADE; case 'e': if (last) { return 67; } goto UPGRADE; default: return -1; } US: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto USE; case 'e': if (last) { return -1; } goto USE; default: return -1; } USE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto USER; case 'r': if (last) { return -1; } goto USER; default: return -1; } USER: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto USER_; default: return -1; } USER_: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto USER_A; case 'a': if (last) { return -1; } goto USER_A; default: return -1; } USER_A: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto USER_AG; case 'g': if (last) { return -1; } goto USER_AG; default: return -1; } USER_AG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto USER_AGE; case 'e': if (last) { return -1; } goto USER_AGE; default: return -1; } USER_AGE: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto USER_AGEN; case 'n': if (last) { return -1; } goto USER_AGEN; default: return -1; } USER_AGEN: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 68; } goto USER_AGENT; case 't': if (last) { return 68; } goto USER_AGENT; default: return -1; } V: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto VA; case 'a': if (last) { return -1; } goto VA; case 'I': if (last) { return -1; } goto VI; case 'i': if (last) { return -1; } goto VI; default: return -1; } VA: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto VAR; case 'r': if (last) { return -1; } goto VAR; default: return -1; } VAR: NEXT_CHAR(); switch (ch) { case 'Y': if (last) { return 69; } goto VARY; case 'y': if (last) { return 69; } goto VARY; default: return -1; } VI: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return 70; } goto VIA; case 'a': if (last) { return 70; } goto VIA; default: return -1; } W: NEXT_CHAR(); switch (ch) { case 'W': if (last) { return -1; } goto WW; case 'w': if (last) { return -1; } goto WW; case 'A': if (last) { return -1; } goto WA; case 'a': if (last) { return -1; } goto WA; default: return -1; } WW: NEXT_CHAR(); switch (ch) { case 'W': if (last) { return -1; } goto WWW; case 'w': if (last) { return -1; } goto WWW; default: return -1; } WWW: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto WWW_; default: return -1; } WWW_: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto WWW_A; case 'a': if (last) { return -1; } goto WWW_A; default: return -1; } WWW_A: NEXT_CHAR(); switch (ch) { case 'U': if (last) { return -1; } goto WWW_AU; case 'u': if (last) { return -1; } goto WWW_AU; default: return -1; } WWW_AU: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto WWW_AUT; case 't': if (last) { return -1; } goto WWW_AUT; default: return -1; } WWW_AUT: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto WWW_AUTH; case 'h': if (last) { return -1; } goto WWW_AUTH; default: return -1; } WWW_AUTH: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto WWW_AUTHE; case 'e': if (last) { return -1; } goto WWW_AUTHE; default: return -1; } WWW_AUTHE: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto WWW_AUTHEN; case 'n': if (last) { return -1; } goto WWW_AUTHEN; default: return -1; } WWW_AUTHEN: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto WWW_AUTHENT; case 't': if (last) { return -1; } goto WWW_AUTHENT; default: return -1; } WWW_AUTHENT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto WWW_AUTHENTI; case 'i': if (last) { return -1; } goto WWW_AUTHENTI; default: return -1; } WWW_AUTHENTI: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto WWW_AUTHENTIC; case 'c': if (last) { return -1; } goto WWW_AUTHENTIC; default: return -1; } WWW_AUTHENTIC: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto WWW_AUTHENTICA; case 'a': if (last) { return -1; } goto WWW_AUTHENTICA; default: return -1; } WWW_AUTHENTICA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto WWW_AUTHENTICAT; case 't': if (last) { return -1; } goto WWW_AUTHENTICAT; default: return -1; } WWW_AUTHENTICAT: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 71; } goto WWW_AUTHENTICATE; case 'e': if (last) { return 71; } goto WWW_AUTHENTICATE; default: return -1; } WA: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto WAN; case 'n': if (last) { return -1; } goto WAN; case 'R': if (last) { return -1; } goto WAR; case 'r': if (last) { return -1; } goto WAR; default: return -1; } WAN: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto WANT; case 't': if (last) { return -1; } goto WANT; default: return -1; } WANT: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto WANT_; default: return -1; } WANT_: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto WANT_D; case 'd': if (last) { return -1; } goto WANT_D; default: return -1; } WANT_D: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto WANT_DI; case 'i': if (last) { return -1; } goto WANT_DI; default: return -1; } WANT_DI: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto WANT_DIG; case 'g': if (last) { return -1; } goto WANT_DIG; default: return -1; } WANT_DIG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto WANT_DIGE; case 'e': if (last) { return -1; } goto WANT_DIGE; default: return -1; } WANT_DIGE: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto WANT_DIGES; case 's': if (last) { return -1; } goto WANT_DIGES; default: return -1; } WANT_DIGES: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 72; } goto WANT_DIGEST; case 't': if (last) { return 72; } goto WANT_DIGEST; default: return -1; } WAR: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto WARN; case 'n': if (last) { return -1; } goto WARN; default: return -1; } WARN: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto WARNI; case 'i': if (last) { return -1; } goto WARNI; default: return -1; } WARNI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto WARNIN; case 'n': if (last) { return -1; } goto WARNIN; default: return -1; } WARNIN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return 73; } goto WARNING; case 'g': if (last) { return 73; } goto WARNING; default: return -1; } X: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto X_; default: return -1; } X_: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto X_F; case 'f': if (last) { return -1; } goto X_F; default: return -1; } X_F: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto X_FO; case 'o': if (last) { return -1; } goto X_FO; default: return -1; } X_FO: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto X_FOR; case 'r': if (last) { return -1; } goto X_FOR; default: return -1; } X_FOR: NEXT_CHAR(); switch (ch) { case 'W': if (last) { return -1; } goto X_FORW; case 'w': if (last) { return -1; } goto X_FORW; default: return -1; } X_FORW: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto X_FORWA; case 'a': if (last) { return -1; } goto X_FORWA; default: return -1; } X_FORWA: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto X_FORWAR; case 'r': if (last) { return -1; } goto X_FORWAR; default: return -1; } X_FORWAR: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto X_FORWARD; case 'd': if (last) { return -1; } goto X_FORWARD; default: return -1; } X_FORWARD: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto X_FORWARDE; case 'e': if (last) { return -1; } goto X_FORWARDE; default: return -1; } X_FORWARDE: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto X_FORWARDED; case 'd': if (last) { return -1; } goto X_FORWARDED; default: return -1; } X_FORWARDED: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto X_FORWARDED_; default: return -1; } X_FORWARDED_: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto X_FORWARDED_F; case 'f': if (last) { return -1; } goto X_FORWARDED_F; case 'H': if (last) { return -1; } goto X_FORWARDED_H; case 'h': if (last) { return -1; } goto X_FORWARDED_H; case 'P': if (last) { return -1; } goto X_FORWARDED_P; case 'p': if (last) { return -1; } goto X_FORWARDED_P; default: return -1; } X_FORWARDED_F: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto X_FORWARDED_FO; case 'o': if (last) { return -1; } goto X_FORWARDED_FO; default: return -1; } X_FORWARDED_FO: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return 74; } goto X_FORWARDED_FOR; case 'r': if (last) { return 74; } goto X_FORWARDED_FOR; default: return -1; } X_FORWARDED_H: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto X_FORWARDED_HO; case 'o': if (last) { return -1; } goto X_FORWARDED_HO; default: return -1; } X_FORWARDED_HO: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto X_FORWARDED_HOS; case 's': if (last) { return -1; } goto X_FORWARDED_HOS; default: return -1; } X_FORWARDED_HOS: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 75; } goto X_FORWARDED_HOST; case 't': if (last) { return 75; } goto X_FORWARDED_HOST; default: return -1; } X_FORWARDED_P: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto X_FORWARDED_PR; case 'r': if (last) { return -1; } goto X_FORWARDED_PR; default: return -1; } X_FORWARDED_PR: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto X_FORWARDED_PRO; case 'o': if (last) { return -1; } goto X_FORWARDED_PRO; default: return -1; } X_FORWARDED_PRO: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto X_FORWARDED_PROT; case 't': if (last) { return -1; } goto X_FORWARDED_PROT; default: return -1; } X_FORWARDED_PROT: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return 76; } goto X_FORWARDED_PROTO; case 'o': if (last) { return 76; } goto X_FORWARDED_PROTO; default: return -1; } ACCEPT_CHARSET: ACCEPT_ENCODING: ACCEPT_LANGUAGE: ACCEPT_RANGES: ACCESS_CONTROL_ALLOW_CREDENTIALS: ACCESS_CONTROL_ALLOW_HEADERS: ACCESS_CONTROL_ALLOW_METHODS: ACCESS_CONTROL_ALLOW_ORIGIN: ACCESS_CONTROL_EXPOSE_HEADERS: ACCESS_CONTROL_MAX_AGE: ACCESS_CONTROL_REQUEST_HEADERS: ACCESS_CONTROL_REQUEST_METHOD: AGE: ALLOW: AUTHORIZATION: CACHE_CONTROL: CONNECTION: CONTENT_DISPOSITION: CONTENT_ENCODING: CONTENT_LANGUAGE: CONTENT_LENGTH: CONTENT_LOCATION: CONTENT_MD5: CONTENT_RANGE: CONTENT_TRANSFER_ENCODING: CONTENT_TYPE: COOKIE: DATE: DESTINATION: DIGEST: ETAG: EXPECT: EXPIRES: FORWARDED: FROM: HOST: IF_MATCH: IF_MODIFIED_SINCE: IF_NONE_MATCH: IF_RANGE: IF_UNMODIFIED_SINCE: KEEP_ALIVE: LAST_EVENT_ID: LAST_MODIFIED: LINK: LOCATION: MAX_FORWARDS: ORIGIN: PRAGMA: PROXY_AUTHENTICATE: PROXY_AUTHORIZATION: RANGE: REFERER: RETRY_AFTER: SEC_WEBSOCKET_ACCEPT: SEC_WEBSOCKET_EXTENSIONS: SEC_WEBSOCKET_KEY1: SEC_WEBSOCKET_PROTOCOL: SEC_WEBSOCKET_VERSION: SERVER: SET_COOKIE: TE: TRAILER: TRANSFER_ENCODING: UPGRADE: URI: USER_AGENT: VARY: VIA: WANT_DIGEST: WARNING: WWW_AUTHENTICATE: X_FORWARDED_FOR: X_FORWARDED_HOST: X_FORWARDED_PROTO: missing: /* nothing found */ return -1; } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/_find_header.h0000644000175100001770000000025214607525266017031 0ustar00runnerdocker#ifndef _FIND_HEADERS_H #define _FIND_HEADERS_H #ifdef __cplusplus extern "C" { #endif int find_header(const char *str, int size); #ifdef __cplusplus } #endif #endif ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/_find_header.pxd0000644000175100001770000000010414607525266017371 0ustar00runnerdockercdef extern from "_find_header.h": int find_header(char *, int) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285826.0 aiohttp-3.9.5/aiohttp/_headers.pxi0000644000175100001770000000372714607525302016566 0ustar00runnerdocker# The file is autogenerated from aiohttp/hdrs.py # Run ./tools/gen.py to update it after the origin changing. from . import hdrs cdef tuple headers = ( hdrs.ACCEPT, hdrs.ACCEPT_CHARSET, hdrs.ACCEPT_ENCODING, hdrs.ACCEPT_LANGUAGE, hdrs.ACCEPT_RANGES, hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, hdrs.ACCESS_CONTROL_ALLOW_HEADERS, hdrs.ACCESS_CONTROL_ALLOW_METHODS, hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, hdrs.ACCESS_CONTROL_MAX_AGE, hdrs.ACCESS_CONTROL_REQUEST_HEADERS, hdrs.ACCESS_CONTROL_REQUEST_METHOD, hdrs.AGE, hdrs.ALLOW, hdrs.AUTHORIZATION, hdrs.CACHE_CONTROL, hdrs.CONNECTION, hdrs.CONTENT_DISPOSITION, hdrs.CONTENT_ENCODING, hdrs.CONTENT_LANGUAGE, hdrs.CONTENT_LENGTH, hdrs.CONTENT_LOCATION, hdrs.CONTENT_MD5, hdrs.CONTENT_RANGE, hdrs.CONTENT_TRANSFER_ENCODING, hdrs.CONTENT_TYPE, hdrs.COOKIE, hdrs.DATE, hdrs.DESTINATION, hdrs.DIGEST, hdrs.ETAG, hdrs.EXPECT, hdrs.EXPIRES, hdrs.FORWARDED, hdrs.FROM, hdrs.HOST, hdrs.IF_MATCH, hdrs.IF_MODIFIED_SINCE, hdrs.IF_NONE_MATCH, hdrs.IF_RANGE, hdrs.IF_UNMODIFIED_SINCE, hdrs.KEEP_ALIVE, hdrs.LAST_EVENT_ID, hdrs.LAST_MODIFIED, hdrs.LINK, hdrs.LOCATION, hdrs.MAX_FORWARDS, hdrs.ORIGIN, hdrs.PRAGMA, hdrs.PROXY_AUTHENTICATE, hdrs.PROXY_AUTHORIZATION, hdrs.RANGE, hdrs.REFERER, hdrs.RETRY_AFTER, hdrs.SEC_WEBSOCKET_ACCEPT, hdrs.SEC_WEBSOCKET_EXTENSIONS, hdrs.SEC_WEBSOCKET_KEY, hdrs.SEC_WEBSOCKET_KEY1, hdrs.SEC_WEBSOCKET_PROTOCOL, hdrs.SEC_WEBSOCKET_VERSION, hdrs.SERVER, hdrs.SET_COOKIE, hdrs.TE, hdrs.TRAILER, hdrs.TRANSFER_ENCODING, hdrs.URI, hdrs.UPGRADE, hdrs.USER_AGENT, hdrs.VARY, hdrs.VIA, hdrs.WWW_AUTHENTICATE, hdrs.WANT_DIGEST, hdrs.WARNING, hdrs.X_FORWARDED_FOR, hdrs.X_FORWARDED_HOST, hdrs.X_FORWARDED_PROTO, ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285826.0 aiohttp-3.9.5/aiohttp/_helpers.c0000644000175100001770000133631214607525302016237 0ustar00runnerdocker/* Generated by Cython 3.0.5 */ #ifndef PY_SSIZE_T_CLEAN #define PY_SSIZE_T_CLEAN #endif /* PY_SSIZE_T_CLEAN */ #if defined(CYTHON_LIMITED_API) && 0 #ifndef Py_LIMITED_API #if CYTHON_LIMITED_API+0 > 0x03030000 #define Py_LIMITED_API CYTHON_LIMITED_API #else #define Py_LIMITED_API 0x03030000 #endif #endif #endif #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.7+ or Python 3.3+. #else #if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API #define __PYX_EXTRA_ABI_MODULE_NAME "limited" #else #define __PYX_EXTRA_ABI_MODULE_NAME "" #endif #define CYTHON_ABI "3_0_5" __PYX_EXTRA_ABI_MODULE_NAME #define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI #define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." #define CYTHON_HEX_VERSION 0x030005F0 #define CYTHON_FUTURE_DIVISION 1 #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #define __PYX_COMMA , #ifndef HAVE_LONG_LONG #define HAVE_LONG_LONG #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX #if defined(GRAALVM_PYTHON) /* For very preliminary testing purposes. Most variables are set the same as PyPy. The existence of this section does not imply that anything works or is even tested */ #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 1 #define CYTHON_COMPILING_IN_NOGIL 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 0 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_GIL #define CYTHON_FAST_GIL 0 #undef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) #endif #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #undef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 #endif #elif defined(PYPY_VERSION) #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #ifndef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 0 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_GIL #define CYTHON_FAST_GIL 0 #undef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) #endif #if PY_VERSION_HEX < 0x03090000 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #endif #undef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 #endif #elif defined(CYTHON_LIMITED_API) #ifdef Py_LIMITED_API #undef __PYX_LIMITED_VERSION_HEX #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API #endif #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 1 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 0 #undef CYTHON_CLINE_IN_TRACEBACK #define CYTHON_CLINE_IN_TRACEBACK 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 1 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #endif #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_GIL #define CYTHON_FAST_GIL 0 #undef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS 1 #endif #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 1 #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #endif #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 #endif #elif defined(PY_NOGIL) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 1 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #ifndef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #endif #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 1 #endif #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #ifndef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 0 #endif #ifndef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 1 #endif #if PY_MAJOR_VERSION < 3 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #ifndef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 1 #endif #ifndef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 1 #endif #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #elif !defined(CYTHON_USE_UNICODE_WRITER) #define CYTHON_USE_UNICODE_WRITER 1 #endif #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #ifndef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_GIL #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) #endif #ifndef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) #endif #ifndef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 1 #endif #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS 1 #endif #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #endif #ifndef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 0 #endif #if PY_VERSION_HEX < 0x030400a1 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #elif !defined(CYTHON_USE_TP_FINALIZE) #define CYTHON_USE_TP_FINALIZE 1 #endif #if PY_VERSION_HEX < 0x030600B1 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #elif !defined(CYTHON_USE_DICT_VERSIONS) #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) #endif #if PY_VERSION_HEX < 0x030700A3 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #elif !defined(CYTHON_USE_EXC_INFO_STACK) #define CYTHON_USE_EXC_INFO_STACK 1 #endif #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if !defined(CYTHON_VECTORCALL) #define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) #endif #define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) #if CYTHON_USE_PYLONG_INTERNALS #if PY_MAJOR_VERSION < 3 #include "longintrepr.h" #endif #undef SHIFT #undef BASE #undef MASK #ifdef SIZEOF_VOID_P enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; #endif #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_cpp_attribute #define __has_cpp_attribute(x) 0 #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifndef CYTHON_UNUSED #if defined(__cplusplus) /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 * but leads to warnings with -pedantic, since it is a C++17 feature */ #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) #if __has_cpp_attribute(maybe_unused) #define CYTHON_UNUSED [[maybe_unused]] #endif #endif #endif #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif #ifndef CYTHON_UNUSED_VAR # if defined(__cplusplus) template void CYTHON_UNUSED_VAR( const T& ) { } # else # define CYTHON_UNUSED_VAR(x) (void)(x) # endif #endif #ifndef CYTHON_MAYBE_UNUSED_VAR #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) #endif #ifndef CYTHON_NCP_UNUSED # if CYTHON_COMPILING_IN_CPYTHON # define CYTHON_NCP_UNUSED # else # define CYTHON_NCP_UNUSED CYTHON_UNUSED # endif #endif #ifndef CYTHON_USE_CPP_STD_MOVE #if defined(__cplusplus) && (\ __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) #define CYTHON_USE_CPP_STD_MOVE 1 #else #define CYTHON_USE_CPP_STD_MOVE 0 #endif #endif #define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) #ifdef _MSC_VER #ifndef _MSC_STDINT_H_ #if _MSC_VER < 1300 typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #else typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #endif #endif #if _MSC_VER < 1300 #ifdef _WIN64 typedef unsigned long long __pyx_uintptr_t; #else typedef unsigned int __pyx_uintptr_t; #endif #else #ifdef _WIN64 typedef unsigned __int64 __pyx_uintptr_t; #else typedef unsigned __int32 __pyx_uintptr_t; #endif #endif #else #include typedef uintptr_t __pyx_uintptr_t; #endif #ifndef CYTHON_FALLTHROUGH #if defined(__cplusplus) /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 * but leads to warnings with -pedantic, since it is a C++17 feature */ #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) #if __has_cpp_attribute(fallthrough) #define CYTHON_FALLTHROUGH [[fallthrough]] #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_cpp_attribute(clang::fallthrough) #define CYTHON_FALLTHROUGH [[clang::fallthrough]] #elif __has_cpp_attribute(gnu::fallthrough) #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] #endif #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_attribute(fallthrough) #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) #else #define CYTHON_FALLTHROUGH #endif #endif #if defined(__clang__) && defined(__apple_build_version__) #if __apple_build_version__ < 7000000 #undef CYTHON_FALLTHROUGH #define CYTHON_FALLTHROUGH #endif #endif #endif #ifdef __cplusplus template struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) #else #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) #endif #if CYTHON_COMPILING_IN_PYPY == 1 #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) #else #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) #endif #define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) #ifndef CYTHON_INLINE #if defined(__clang__) #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) #elif defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_DefaultClassType PyClass_Type #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #define __Pyx_DefaultClassType PyType_Type #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, PyObject *code, PyObject *c, PyObject* n, PyObject *v, PyObject *fv, PyObject *cell, PyObject* fn, PyObject *name, int fline, PyObject *lnos) { PyObject *exception_table = NULL; PyObject *types_module=NULL, *code_type=NULL, *result=NULL; #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 PyObject *version_info; // borrowed #endif PyObject *py_minor_version = NULL; long minor_version = 0; PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 minor_version = 11; // we don't yet need to distinguish between versions > 11 #else if (!(version_info = PySys_GetObject("version_info"))) goto end; if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; minor_version = PyLong_AsLong(py_minor_version); if (minor_version == -1 && PyErr_Occurred()) goto end; #endif if (!(types_module = PyImport_ImportModule("types"))) goto end; if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; if (minor_version <= 7) { (void)p; result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, c, n, v, fn, name, fline, lnos, fv, cell); } else if (minor_version <= 10) { result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, c, n, v, fn, name, fline, lnos, fv, cell); } else { if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); } end: Py_XDECREF(code_type); Py_XDECREF(exception_table); Py_XDECREF(types_module); Py_XDECREF(py_minor_version); if (type) { PyErr_Restore(type, value, traceback); } return result; } #ifndef CO_OPTIMIZED #define CO_OPTIMIZED 0x0001 #endif #ifndef CO_NEWLOCALS #define CO_NEWLOCALS 0x0002 #endif #ifndef CO_VARARGS #define CO_VARARGS 0x0004 #endif #ifndef CO_VARKEYWORDS #define CO_VARKEYWORDS 0x0008 #endif #ifndef CO_ASYNC_GENERATOR #define CO_ASYNC_GENERATOR 0x0200 #endif #ifndef CO_GENERATOR #define CO_GENERATOR 0x0020 #endif #ifndef CO_COROUTINE #define CO_COROUTINE 0x0080 #endif #elif PY_VERSION_HEX >= 0x030B0000 static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, PyObject *code, PyObject *c, PyObject* n, PyObject *v, PyObject *fv, PyObject *cell, PyObject* fn, PyObject *name, int fline, PyObject *lnos) { PyCodeObject *result; PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); // we don't have access to __pyx_empty_bytes here if (!empty_bytes) return NULL; result = #if PY_VERSION_HEX >= 0x030C0000 PyUnstable_Code_NewWithPosOnlyArgs #else PyCode_NewWithPosOnlyArgs #endif (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); Py_DECREF(empty_bytes); return result; } #elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #endif #if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) #else #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) #define __Pyx_Py_Is(x, y) Py_Is(x, y) #else #define __Pyx_Py_Is(x, y) ((x) == (y)) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) #else #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) #else #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) #else #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) #endif #define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) #if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) #else #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) #endif #ifndef CO_COROUTINE #define CO_COROUTINE 0x80 #endif #ifndef CO_ASYNC_GENERATOR #define CO_ASYNC_GENERATOR 0x200 #endif #ifndef Py_TPFLAGS_CHECKTYPES #define Py_TPFLAGS_CHECKTYPES 0 #endif #ifndef Py_TPFLAGS_HAVE_INDEX #define Py_TPFLAGS_HAVE_INDEX 0 #endif #ifndef Py_TPFLAGS_HAVE_NEWBUFFER #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #ifndef Py_TPFLAGS_HAVE_FINALIZE #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #ifndef Py_TPFLAGS_SEQUENCE #define Py_TPFLAGS_SEQUENCE 0 #endif #ifndef Py_TPFLAGS_MAPPING #define Py_TPFLAGS_MAPPING 0 #endif #ifndef METH_STACKLESS #define METH_STACKLESS 0 #endif #if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) #ifndef METH_FASTCALL #define METH_FASTCALL 0x80 #endif typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else #define __Pyx_PyCFunctionFast _PyCFunctionFast #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords #endif #if CYTHON_METH_FASTCALL #define __Pyx_METH_FASTCALL METH_FASTCALL #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords #else #define __Pyx_METH_FASTCALL METH_VARARGS #define __Pyx_PyCFunction_FastCall PyCFunction #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords #endif #if CYTHON_VECTORCALL #define __pyx_vectorcallfunc vectorcallfunc #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) #elif CYTHON_BACKPORT_VECTORCALL typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames); #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) #else #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) #endif #if PY_MAJOR_VERSION >= 0x030900B1 #define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) #else #define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) #endif #define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) #elif !CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) #endif #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; } #endif static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { #if CYTHON_COMPILING_IN_LIMITED_API return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; #else return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; #endif } #define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) #if __PYX_LIMITED_VERSION_HEX < 0x030900B1 #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); #else #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) #define __Pyx_PyCMethod PyCMethod #endif #ifndef METH_METHOD #define METH_METHOD 0x200 #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) #define PyObject_Malloc(s) PyMem_Malloc(s) #define PyObject_Free(p) PyMem_Free(p) #define PyObject_Realloc(p) PyMem_Realloc(p) #endif #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) #else #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) #endif #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_PyThreadState_Current PyThreadState_Get() #elif !CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_Current PyThreadState_GET() #elif PY_VERSION_HEX >= 0x030d00A1 #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() #elif PY_VERSION_HEX >= 0x03060000 #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() #elif PY_VERSION_HEX >= 0x03000000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #else #define __Pyx_PyThreadState_Current _PyThreadState_Current #endif #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) { void *result; result = PyModule_GetState(op); if (!result) Py_FatalError("Couldn't find the module state"); return result; } #endif #define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) #else #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) #endif #if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) #include "pythread.h" #define Py_tss_NEEDS_INIT 0 typedef int Py_tss_t; static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { *key = PyThread_create_key(); return 0; } static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); *key = Py_tss_NEEDS_INIT; return key; } static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { PyObject_Free(key); } static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { return *key != Py_tss_NEEDS_INIT; } static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { PyThread_delete_key(*key); *key = Py_tss_NEEDS_INIT; } static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { return PyThread_set_key_value(*key, value); } static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { return PyThread_get_key_value(*key); } #endif #if PY_MAJOR_VERSION < 3 #if CYTHON_COMPILING_IN_PYPY #if PYPY_VERSION_NUM < 0x07030600 #if defined(__cplusplus) && __cplusplus >= 201402L [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] #elif defined(__GNUC__) || defined(__clang__) __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) #elif defined(_MSC_VER) __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) #endif static CYTHON_INLINE int PyGILState_Check(void) { return 0; } #else // PYPY_VERSION_NUM < 0x07030600 #endif // PYPY_VERSION_NUM < 0x07030600 #else static CYTHON_INLINE int PyGILState_Check(void) { PyThreadState * tstate = _PyThreadState_Current; return tstate && (tstate == PyGILState_GetThisThreadState()); } #endif #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) #else #define __Pyx_PyDict_NewPresized(n) PyDict_New() #endif #if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS #define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); if (res == NULL) PyErr_Clear(); return res; } #elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) #define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError #define __Pyx_PyDict_GetItemStr PyDict_GetItem #else static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { #if CYTHON_COMPILING_IN_PYPY return PyDict_GetItem(dict, name); #else PyDictEntry *ep; PyDictObject *mp = (PyDictObject*) dict; long hash = ((PyStringObject *) name)->ob_shash; assert(hash != -1); ep = (mp->ma_lookup)(mp, name, hash); if (ep == NULL) { return NULL; } return ep->me_value; #endif } #define __Pyx_PyDict_GetItemStr PyDict_GetItem #endif #if CYTHON_USE_TYPE_SLOTS #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) #else #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next #endif #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) #else #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) #endif #if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 #define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ PyTypeObject *type = Py_TYPE(obj);\ assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ PyObject_GC_Del(obj);\ Py_DECREF(type);\ } #else #define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) #endif #if CYTHON_COMPILING_IN_LIMITED_API #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) #define __Pyx_PyUnicode_DATA(u) ((void*)u) #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) #elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #if PY_VERSION_HEX >= 0x030C0000 #define __Pyx_PyUnicode_READY(op) (0) #else #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #endif #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) #if PY_VERSION_HEX >= 0x030C0000 #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) #else #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #endif #endif #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 #define PyUnicode_2BYTE_KIND 2 #define PyUnicode_4BYTE_KIND 4 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #endif #if CYTHON_COMPILING_IN_PYPY #if !defined(PyUnicode_DecodeUnicodeEscape) #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) #endif #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) #undef PyUnicode_Contains #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) #endif #if !defined(PyByteArray_Check) #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) #endif #if !defined(PyObject_Format) #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) #endif #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) #define PyObject_ASCII(o) PyObject_Repr(o) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #ifndef PyObject_Unicode #define PyObject_Unicode PyObject_Str #endif #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_PySequence_ListKeepNew(obj)\ (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) #else #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) #endif #if PY_VERSION_HEX >= 0x030900A4 #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) #else #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) #endif #if CYTHON_ASSUME_SAFE_MACROS #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) #else #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) #endif #if PY_VERSION_HEX >= 0x030d00A1 #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) #else static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { PyObject *module = PyImport_AddModule(name); Py_XINCREF(module); return module; } #endif #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define __Pyx_Py3Int_Check(op) PyLong_Check(op) #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #else #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t #endif #if CYTHON_USE_ASYNC_SLOTS #if PY_VERSION_HEX >= 0x030500B1 #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) #else #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) #endif #else #define __Pyx_PyType_AsAsync(obj) NULL #endif #ifndef __Pyx_PyAsyncMethodsStruct typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; } __Pyx_PyAsyncMethodsStruct; #endif #if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) #if !defined(_USE_MATH_DEFINES) #define _USE_MATH_DEFINES #endif #endif #include #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) #define __Pyx_truncl trunc #else #define __Pyx_truncl truncl #endif #define __PYX_MARK_ERR_POS(f_index, lineno) \ { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } #ifdef CYTHON_EXTERN_C #undef __PYX_EXTERN_C #define __PYX_EXTERN_C CYTHON_EXTERN_C #elif defined(__PYX_EXTERN_C) #ifdef _MSC_VER #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") #else #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. #endif #else #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #define __PYX_HAVE__aiohttp___helpers #define __PYX_HAVE_API__aiohttp___helpers /* Early includes */ #ifdef _OPENMP #include #endif /* _OPENMP */ #if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) #define CYTHON_WITHOUT_ASSERTIONS #endif typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_uchar_cast(c) ((unsigned char)c) #define __Pyx_long_cast(x) ((long)x) #define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ (sizeof(type) < sizeof(Py_ssize_t)) ||\ (sizeof(type) > sizeof(Py_ssize_t) &&\ likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX) &&\ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ v == (type)PY_SSIZE_T_MIN))) ||\ (sizeof(type) == sizeof(Py_ssize_t) &&\ (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX))) ) static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { return (size_t) i < (size_t) limit; } #if defined (__cplusplus) && __cplusplus >= 201103L #include #define __Pyx_sst_abs(value) std::abs(value) #elif SIZEOF_INT >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) abs(value) #elif SIZEOF_LONG >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) labs(value) #elif defined (_MSC_VER) #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_sst_abs(value) llabs(value) #elif defined (__GNUC__) #define __Pyx_sst_abs(value) __builtin_llabs(value) #else #define __Pyx_sst_abs(value) ((value<0) ? -value : value) #endif static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) { const wchar_t *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #else static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { const Py_UNICODE *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #endif #define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) #define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); #if CYTHON_ASSUME_SAFE_MACROS #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) #else #define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) #endif #if CYTHON_USE_PYLONG_INTERNALS #if PY_VERSION_HEX >= 0x030C00A7 #ifndef _PyLong_SIGN_MASK #define _PyLong_SIGN_MASK 3 #endif #ifndef _PyLong_NON_SIZE_BITS #define _PyLong_NON_SIZE_BITS 3 #endif #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) #define __Pyx_PyLong_SignedDigitCount(x)\ ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) #else #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) #endif typedef Py_ssize_t __Pyx_compact_pylong; typedef size_t __Pyx_compact_upylong; #else // Py < 3.12 #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) #define __Pyx_PyLong_CompactValue(x)\ ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) typedef sdigit __Pyx_compact_pylong; typedef digit __Pyx_compact_upylong; #endif #if PY_VERSION_HEX >= 0x030C00A5 #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) #else #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) #endif #endif #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII #include static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = (char) c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #include static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } #if !CYTHON_USE_MODULE_STATE static PyObject *__pyx_m = NULL; #endif static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm = __FILE__; static const char *__pyx_filename; /* #### Code section: filename_table ### */ static const char *__pyx_f[] = { "aiohttp/_helpers.pyx", "", }; /* #### Code section: utility_code_proto_before_types ### */ /* ForceInitThreads.proto */ #ifndef __PYX_FORCE_INIT_THREADS #define __PYX_FORCE_INIT_THREADS 0 #endif /* #### Code section: numeric_typedefs ### */ /* #### Code section: complex_type_declarations ### */ /* #### Code section: type_declarations ### */ /*--- Type declarations ---*/ struct __pyx_obj_7aiohttp_8_helpers_reify; /* "aiohttp/_helpers.pyx":1 * cdef class reify: # <<<<<<<<<<<<<< * """Use as a class method decorator. It operates almost exactly like * the Python `@property` decorator, but it puts the result of the */ struct __pyx_obj_7aiohttp_8_helpers_reify { PyObject_HEAD PyObject *wrapped; PyObject *name; }; /* #### Code section: utility_code_proto ### */ /* --- Runtime support code (head) --- */ /* Refnanny.proto */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, Py_ssize_t); void (*DECREF)(void*, PyObject*, Py_ssize_t); void (*GOTREF)(void*, PyObject*, Py_ssize_t); void (*GIVEREF)(void*, PyObject*, Py_ssize_t); void* (*SetupContext)(const char*, Py_ssize_t, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil)\ if (acquire_gil) {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ PyGILState_Release(__pyx_gilstate_save);\ } else {\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ } #define __Pyx_RefNannyFinishContextNogil() {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __Pyx_RefNannyFinishContext();\ PyGILState_Release(__pyx_gilstate_save);\ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil)\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() #endif #define __Pyx_RefNannyFinishContextNogil() {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __Pyx_RefNannyFinishContext();\ PyGILState_Release(__pyx_gilstate_save);\ } #define __Pyx_RefNannyFinishContext()\ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContextNogil() #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_Py_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; Py_XDECREF(tmp);\ } while (0) #define __Pyx_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_XDECREF(tmp);\ } while (0) #define __Pyx_DECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_DECREF(tmp);\ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) /* PyErrExceptionMatches.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); #else #define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) #endif /* PyThreadStateGet.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; #define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; #if PY_VERSION_HEX >= 0x030C00A6 #define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) #define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) #else #define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) #define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) #endif #else #define __Pyx_PyThreadState_declare #define __Pyx_PyThreadState_assign #define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) #define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() #endif /* PyErrFetchRestore.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) #define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) #define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 #define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) #else #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #endif #else #define __Pyx_PyErr_Clear() PyErr_Clear() #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif /* PyObjectGetAttrStr.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif /* PyObjectGetAttrStrNoError.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); /* GetBuiltinName.proto */ static PyObject *__Pyx_GetBuiltinName(PyObject *name); /* TupleAndListFromArray.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); #endif /* IncludeStringH.proto */ #include /* BytesEquals.proto */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); /* UnicodeEquals.proto */ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); /* fastcall.proto */ #if CYTHON_AVOID_BORROWED_REFS #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) #elif CYTHON_ASSUME_SAFE_MACROS #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) #else #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) #endif #if CYTHON_AVOID_BORROWED_REFS #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) #else #define __Pyx_Arg_NewRef_VARARGS(arg) arg // no-op #define __Pyx_Arg_XDECREF_VARARGS(arg) // no-op - arg is borrowed #endif #define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) #define __Pyx_KwValues_VARARGS(args, nargs) NULL #define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) #define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) #if CYTHON_METH_FASTCALL #define __Pyx_Arg_FASTCALL(args, i) args[i] #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 static CYTHON_UNUSED PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); #else #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) #endif #define __Pyx_Arg_NewRef_FASTCALL(arg) arg // no-op, __Pyx_Arg_FASTCALL is direct and this needs #define __Pyx_Arg_XDECREF_FASTCALL(arg) // no-op - arg was returned from array #else #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) #endif #if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS #define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) #define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) #else #define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) #define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) #endif /* RaiseDoubleKeywords.proto */ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /* ParseKeywords.proto */ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name); /* RaiseArgTupleInvalid.proto */ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /* GetItemInt.proto */ #define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ __Pyx_GetItemInt_Generic(o, to_py_func(i)))) #define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); #define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, int wraparound, int boundscheck); /* PyFunctionFastCall.proto */ #if CYTHON_FAST_PYCALL #if !CYTHON_VECTORCALL #define __Pyx_PyFunction_FastCall(func, args, nargs)\ __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); #endif #define __Pyx_BUILD_ASSERT_EXPR(cond)\ (sizeof(char [1 - 2*!(cond)]) - 1) #ifndef Py_MEMBER_SIZE #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) #endif #if !CYTHON_VECTORCALL #if PY_VERSION_HEX >= 0x03080000 #include "frameobject.h" #if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API #ifndef Py_BUILD_CORE #define Py_BUILD_CORE 1 #endif #include "internal/pycore_frame.h" #endif #define __Pxy_PyFrame_Initialize_Offsets() #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) #else static size_t __pyx_pyframe_localsplus_offset = 0; #include "frameobject.h" #define __Pxy_PyFrame_Initialize_Offsets()\ ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) #define __Pyx_PyFrame_GetLocalsplus(frame)\ (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) #endif #endif #endif /* PyObjectCall.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif /* PyObjectCallMethO.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); #endif /* PyObjectFastCall.proto */ #define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); /* PyObjectCallOneArg.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); /* ObjectGetItem.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key); #else #define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) #endif /* GetTopmostException.proto */ #if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); #endif /* SaveResetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); #else #define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) #define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) #endif /* GetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); #endif /* RaiseException.proto */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /* KeywordStringCheck.proto */ static int __Pyx_CheckKeywordStrings(PyObject *kw, const char* function_name, int kw_allowed); /* GetAttr3.proto */ static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); /* PyDictVersioning.proto */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS #define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) #define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ (version_var) = __PYX_GET_DICT_VERSION(dict);\ (cache_var) = (value); #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ (VAR) = __pyx_dict_cached_value;\ } else {\ (VAR) = __pyx_dict_cached_value = (LOOKUP);\ __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ }\ } static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); #else #define __PYX_GET_DICT_VERSION(dict) (0) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); #endif /* GetModuleGlobalName.proto */ #if CYTHON_USE_DICT_VERSIONS #define __Pyx_GetModuleGlobalName(var, name) do {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ } while(0) #define __Pyx_GetModuleGlobalNameUncached(var, name) do {\ PY_UINT64_T __pyx_dict_version;\ PyObject *__pyx_dict_cached_value;\ (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ } while(0) static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); #else #define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) #define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); #endif /* RaiseUnexpectedTypeError.proto */ static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj); /* PySequenceContains.proto */ static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { int result = PySequence_Contains(seq, item); return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); } /* Import.proto */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); /* ImportFrom.proto */ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); /* GetAttr.proto */ static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); /* HasAttr.proto */ #if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 #define __Pyx_HasAttr(o, n) PyObject_HasAttrWithError(o, n) #else static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); #endif /* IncludeStructmemberH.proto */ #include /* FixUpExtensionType.proto */ #if CYTHON_USE_TYPE_SPECS static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); #endif /* PyObjectCallNoArg.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); /* PyObjectGetMethod.proto */ static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); /* PyObjectCallMethod0.proto */ static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); /* ValidateBasesTuple.proto */ #if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases); #endif /* PyType_Ready.proto */ CYTHON_UNUSED static int __Pyx_PyType_Ready(PyTypeObject *t); /* PyObject_GenericGetAttrNoDict.proto */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr #endif /* PyObject_GenericGetAttr.proto */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr #endif /* SetupReduce.proto */ #if !CYTHON_COMPILING_IN_LIMITED_API static int __Pyx_setup_reduce(PyObject* type_obj); #endif /* FetchSharedCythonModule.proto */ static PyObject *__Pyx_FetchSharedCythonABIModule(void); /* FetchCommonType.proto */ #if !CYTHON_USE_TYPE_SPECS static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); #else static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); #endif /* PyMethodNew.proto */ #if CYTHON_COMPILING_IN_LIMITED_API static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; CYTHON_UNUSED_VAR(typ); if (!self) return __Pyx_NewRef(func); typesModule = PyImport_ImportModule("types"); if (!typesModule) return NULL; methodType = PyObject_GetAttrString(typesModule, "MethodType"); Py_DECREF(typesModule); if (!methodType) return NULL; result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); Py_DECREF(methodType); return result; } #elif PY_MAJOR_VERSION >= 3 static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { CYTHON_UNUSED_VAR(typ); if (!self) return __Pyx_NewRef(func); return PyMethod_New(func, self); } #else #define __Pyx_PyMethod_New PyMethod_New #endif /* PyVectorcallFastCallDict.proto */ #if CYTHON_METH_FASTCALL static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); #endif /* CythonFunctionShared.proto */ #define __Pyx_CyFunction_USED #define __Pyx_CYFUNCTION_STATICMETHOD 0x01 #define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 #define __Pyx_CYFUNCTION_CCLASS 0x04 #define __Pyx_CYFUNCTION_COROUTINE 0x08 #define __Pyx_CyFunction_GetClosure(f)\ (((__pyx_CyFunctionObject *) (f))->func_closure) #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_CyFunction_GetClassObj(f)\ (((__pyx_CyFunctionObject *) (f))->func_classobj) #else #define __Pyx_CyFunction_GetClassObj(f)\ ((PyObject*) ((PyCMethodObject *) (f))->mm_class) #endif #define __Pyx_CyFunction_SetClassObj(f, classobj)\ __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) #define __Pyx_CyFunction_Defaults(type, f)\ ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) #define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) typedef struct { #if CYTHON_COMPILING_IN_LIMITED_API PyObject_HEAD PyObject *func; #elif PY_VERSION_HEX < 0x030900B1 PyCFunctionObject func; #else PyCMethodObject func; #endif #if CYTHON_BACKPORT_VECTORCALL __pyx_vectorcallfunc func_vectorcall; #endif #if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API PyObject *func_weakreflist; #endif PyObject *func_dict; PyObject *func_name; PyObject *func_qualname; PyObject *func_doc; PyObject *func_globals; PyObject *func_code; PyObject *func_closure; #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API PyObject *func_classobj; #endif void *defaults; int defaults_pyobjects; size_t defaults_size; // used by FusedFunction for copying defaults int flags; PyObject *defaults_tuple; PyObject *defaults_kwdict; PyObject *(*defaults_getter)(PyObject *); PyObject *func_annotations; PyObject *func_is_coroutine; } __pyx_CyFunctionObject; #undef __Pyx_CyOrPyCFunction_Check #define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) #define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) #define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); #undef __Pyx_IsSameCFunction #define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject *globals, PyObject* code); static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, size_t size, int pyobjects); static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, PyObject *tuple); static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, PyObject *dict); static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, PyObject *dict); static int __pyx_CyFunction_init(PyObject *module); #if CYTHON_METH_FASTCALL static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); #if CYTHON_BACKPORT_VECTORCALL #define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) #else #define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) #endif #endif /* CythonFunction.proto */ static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject *globals, PyObject* code); /* CLineInTraceback.proto */ #ifdef CYTHON_CLINE_IN_TRACEBACK #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) #else static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); #endif /* CodeObjectCache.proto */ #if !CYTHON_COMPILING_IN_LIMITED_API typedef struct { PyCodeObject* code_object; int code_line; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); #endif /* AddTraceback.proto */ static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /* GCCDiagnostics.proto */ #if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #define __Pyx_HAS_GCC_DIAGNOSTIC #endif /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* FormatTypeName.proto */ #if CYTHON_COMPILING_IN_LIMITED_API typedef PyObject *__Pyx_TypeName; #define __Pyx_FMT_TYPENAME "%U" static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); #define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) #else typedef const char *__Pyx_TypeName; #define __Pyx_FMT_TYPENAME "%.200s" #define __Pyx_PyType_GetName(tp) ((tp)->tp_name) #define __Pyx_DECREF_TypeName(obj) #endif /* CIntFromPy.proto */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* FastTypeChecks.proto */ #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) #define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); #else #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) #define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) #define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) #endif #define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) #define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) /* CheckBinaryVersion.proto */ static unsigned long __Pyx_get_runtime_version(void); static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); /* InitStrings.proto */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /* #### Code section: module_declarations ### */ /* Module declarations from "aiohttp._helpers" */ static PyObject *__pyx_f_7aiohttp_8_helpers___pyx_unpickle_reify__set_state(struct __pyx_obj_7aiohttp_8_helpers_reify *, PyObject *); /*proto*/ /* #### Code section: typeinfo ### */ /* #### Code section: before_global_var ### */ #define __Pyx_MODULE_NAME "aiohttp._helpers" extern int __pyx_module_is_main_aiohttp___helpers; int __pyx_module_is_main_aiohttp___helpers = 0; /* Implementation of "aiohttp._helpers" */ /* #### Code section: global_var ### */ static PyObject *__pyx_builtin_KeyError; static PyObject *__pyx_builtin_AttributeError; /* #### Code section: string_decls ### */ static const char __pyx_k__3[] = "."; static const char __pyx_k_gc[] = "gc"; static const char __pyx_k__10[] = "?"; static const char __pyx_k_doc[] = "__doc__"; static const char __pyx_k_new[] = "__new__"; static const char __pyx_k_dict[] = "__dict__"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_name[] = "__name__"; static const char __pyx_k_self[] = "self"; static const char __pyx_k_test[] = "__test__"; static const char __pyx_k_cache[] = "_cache"; static const char __pyx_k_reify[] = "reify"; static const char __pyx_k_state[] = "state"; static const char __pyx_k_dict_2[] = "_dict"; static const char __pyx_k_enable[] = "enable"; static const char __pyx_k_import[] = "__import__"; static const char __pyx_k_pickle[] = "pickle"; static const char __pyx_k_reduce[] = "__reduce__"; static const char __pyx_k_update[] = "update"; static const char __pyx_k_disable[] = "disable"; static const char __pyx_k_wrapped[] = "wrapped"; static const char __pyx_k_KeyError[] = "KeyError"; static const char __pyx_k_getstate[] = "__getstate__"; static const char __pyx_k_pyx_type[] = "__pyx_type"; static const char __pyx_k_setstate[] = "__setstate__"; static const char __pyx_k_isenabled[] = "isenabled"; static const char __pyx_k_pyx_state[] = "__pyx_state"; static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; static const char __pyx_k_pyx_result[] = "__pyx_result"; static const char __pyx_k_PickleError[] = "PickleError"; static const char __pyx_k_is_coroutine[] = "_is_coroutine"; static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; static const char __pyx_k_stringsource[] = ""; static const char __pyx_k_use_setstate[] = "use_setstate"; static const char __pyx_k_class_getitem[] = "__class_getitem__"; static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; static const char __pyx_k_AttributeError[] = "AttributeError"; static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; static const char __pyx_k_aiohttp__helpers[] = "aiohttp._helpers"; static const char __pyx_k_asyncio_coroutines[] = "asyncio.coroutines"; static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; static const char __pyx_k_pyx_unpickle_reify[] = "__pyx_unpickle_reify"; static const char __pyx_k_reify___reduce_cython[] = "reify.__reduce_cython__"; static const char __pyx_k_reify___setstate_cython[] = "reify.__setstate_cython__"; static const char __pyx_k_reified_property_is_read_only[] = "reified property is read-only"; static const char __pyx_k_Incompatible_checksums_0x_x_vs_0[] = "Incompatible checksums (0x%x vs (0xeecf561, 0x545205d, 0x770cb8f) = (name, wrapped))"; /* #### Code section: decls ### */ static int __pyx_pf_7aiohttp_8_helpers_5reify___init__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v_wrapped); /* proto */ static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_7__doc_____get__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_2__get__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v_inst, CYTHON_UNUSED PyObject *__pyx_v_owner); /* proto */ static int __pyx_pf_7aiohttp_8_helpers_5reify_4__set__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_inst, CYTHON_UNUSED PyObject *__pyx_v_value); /* proto */ static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_6__reduce_cython__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_8__setstate_cython__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ static PyObject *__pyx_pf_7aiohttp_8_helpers___pyx_unpickle_reify(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ static PyObject *__pyx_tp_new_7aiohttp_8_helpers_reify(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ /* #### Code section: late_includes ### */ /* #### Code section: module_state ### */ typedef struct { PyObject *__pyx_d; PyObject *__pyx_b; PyObject *__pyx_cython_runtime; PyObject *__pyx_empty_tuple; PyObject *__pyx_empty_bytes; PyObject *__pyx_empty_unicode; #ifdef __Pyx_CyFunction_USED PyTypeObject *__pyx_CyFunctionType; #endif #ifdef __Pyx_FusedFunction_USED PyTypeObject *__pyx_FusedFunctionType; #endif #ifdef __Pyx_Generator_USED PyTypeObject *__pyx_GeneratorType; #endif #ifdef __Pyx_IterableCoroutine_USED PyTypeObject *__pyx_IterableCoroutineType; #endif #ifdef __Pyx_Coroutine_USED PyTypeObject *__pyx_CoroutineAwaitType; #endif #ifdef __Pyx_Coroutine_USED PyTypeObject *__pyx_CoroutineType; #endif #if CYTHON_USE_MODULE_STATE PyObject *__pyx_type_7aiohttp_8_helpers_reify; #endif PyTypeObject *__pyx_ptype_7aiohttp_8_helpers_reify; PyObject *__pyx_n_s_AttributeError; PyObject *__pyx_kp_s_Incompatible_checksums_0x_x_vs_0; PyObject *__pyx_n_s_KeyError; PyObject *__pyx_n_s_PickleError; PyObject *__pyx_n_s__10; PyObject *__pyx_kp_u__3; PyObject *__pyx_n_s_aiohttp__helpers; PyObject *__pyx_n_s_asyncio_coroutines; PyObject *__pyx_n_s_cache; PyObject *__pyx_n_s_class_getitem; PyObject *__pyx_n_s_cline_in_traceback; PyObject *__pyx_n_s_dict; PyObject *__pyx_n_s_dict_2; PyObject *__pyx_kp_u_disable; PyObject *__pyx_n_s_doc; PyObject *__pyx_kp_u_enable; PyObject *__pyx_kp_u_gc; PyObject *__pyx_n_s_getstate; PyObject *__pyx_n_s_import; PyObject *__pyx_n_s_is_coroutine; PyObject *__pyx_kp_u_isenabled; PyObject *__pyx_n_s_main; PyObject *__pyx_n_s_name; PyObject *__pyx_n_s_new; PyObject *__pyx_n_s_pickle; PyObject *__pyx_n_s_pyx_PickleError; PyObject *__pyx_n_s_pyx_checksum; PyObject *__pyx_n_s_pyx_result; PyObject *__pyx_n_s_pyx_state; PyObject *__pyx_n_s_pyx_type; PyObject *__pyx_n_s_pyx_unpickle_reify; PyObject *__pyx_n_s_reduce; PyObject *__pyx_n_s_reduce_cython; PyObject *__pyx_n_s_reduce_ex; PyObject *__pyx_kp_u_reified_property_is_read_only; PyObject *__pyx_n_s_reify; PyObject *__pyx_n_s_reify___reduce_cython; PyObject *__pyx_n_s_reify___setstate_cython; PyObject *__pyx_n_s_self; PyObject *__pyx_n_s_setstate; PyObject *__pyx_n_s_setstate_cython; PyObject *__pyx_n_s_state; PyObject *__pyx_kp_s_stringsource; PyObject *__pyx_n_s_test; PyObject *__pyx_n_s_update; PyObject *__pyx_n_s_use_setstate; PyObject *__pyx_n_s_wrapped; PyObject *__pyx_int_88416349; PyObject *__pyx_int_124832655; PyObject *__pyx_int_250410337; PyObject *__pyx_tuple_; PyObject *__pyx_tuple__2; PyObject *__pyx_tuple__4; PyObject *__pyx_tuple__6; PyObject *__pyx_tuple__8; PyObject *__pyx_codeobj__5; PyObject *__pyx_codeobj__7; PyObject *__pyx_codeobj__9; } __pyx_mstate; #if CYTHON_USE_MODULE_STATE #ifdef __cplusplus namespace { extern struct PyModuleDef __pyx_moduledef; } /* anonymous namespace */ #else static struct PyModuleDef __pyx_moduledef; #endif #define __pyx_mstate(o) ((__pyx_mstate *)__Pyx_PyModule_GetState(o)) #define __pyx_mstate_global (__pyx_mstate(PyState_FindModule(&__pyx_moduledef))) #define __pyx_m (PyState_FindModule(&__pyx_moduledef)) #else static __pyx_mstate __pyx_mstate_global_static = #ifdef __cplusplus {}; #else {0}; #endif static __pyx_mstate *__pyx_mstate_global = &__pyx_mstate_global_static; #endif /* #### Code section: module_state_clear ### */ #if CYTHON_USE_MODULE_STATE static int __pyx_m_clear(PyObject *m) { __pyx_mstate *clear_module_state = __pyx_mstate(m); if (!clear_module_state) return 0; Py_CLEAR(clear_module_state->__pyx_d); Py_CLEAR(clear_module_state->__pyx_b); Py_CLEAR(clear_module_state->__pyx_cython_runtime); Py_CLEAR(clear_module_state->__pyx_empty_tuple); Py_CLEAR(clear_module_state->__pyx_empty_bytes); Py_CLEAR(clear_module_state->__pyx_empty_unicode); #ifdef __Pyx_CyFunction_USED Py_CLEAR(clear_module_state->__pyx_CyFunctionType); #endif #ifdef __Pyx_FusedFunction_USED Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); #endif Py_CLEAR(clear_module_state->__pyx_ptype_7aiohttp_8_helpers_reify); Py_CLEAR(clear_module_state->__pyx_type_7aiohttp_8_helpers_reify); Py_CLEAR(clear_module_state->__pyx_n_s_AttributeError); Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); Py_CLEAR(clear_module_state->__pyx_n_s_KeyError); Py_CLEAR(clear_module_state->__pyx_n_s_PickleError); Py_CLEAR(clear_module_state->__pyx_n_s__10); Py_CLEAR(clear_module_state->__pyx_kp_u__3); Py_CLEAR(clear_module_state->__pyx_n_s_aiohttp__helpers); Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); Py_CLEAR(clear_module_state->__pyx_n_s_cache); Py_CLEAR(clear_module_state->__pyx_n_s_class_getitem); Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); Py_CLEAR(clear_module_state->__pyx_n_s_dict); Py_CLEAR(clear_module_state->__pyx_n_s_dict_2); Py_CLEAR(clear_module_state->__pyx_kp_u_disable); Py_CLEAR(clear_module_state->__pyx_n_s_doc); Py_CLEAR(clear_module_state->__pyx_kp_u_enable); Py_CLEAR(clear_module_state->__pyx_kp_u_gc); Py_CLEAR(clear_module_state->__pyx_n_s_getstate); Py_CLEAR(clear_module_state->__pyx_n_s_import); Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); Py_CLEAR(clear_module_state->__pyx_kp_u_isenabled); Py_CLEAR(clear_module_state->__pyx_n_s_main); Py_CLEAR(clear_module_state->__pyx_n_s_name); Py_CLEAR(clear_module_state->__pyx_n_s_new); Py_CLEAR(clear_module_state->__pyx_n_s_pickle); Py_CLEAR(clear_module_state->__pyx_n_s_pyx_PickleError); Py_CLEAR(clear_module_state->__pyx_n_s_pyx_checksum); Py_CLEAR(clear_module_state->__pyx_n_s_pyx_result); Py_CLEAR(clear_module_state->__pyx_n_s_pyx_state); Py_CLEAR(clear_module_state->__pyx_n_s_pyx_type); Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_reify); Py_CLEAR(clear_module_state->__pyx_n_s_reduce); Py_CLEAR(clear_module_state->__pyx_n_s_reduce_cython); Py_CLEAR(clear_module_state->__pyx_n_s_reduce_ex); Py_CLEAR(clear_module_state->__pyx_kp_u_reified_property_is_read_only); Py_CLEAR(clear_module_state->__pyx_n_s_reify); Py_CLEAR(clear_module_state->__pyx_n_s_reify___reduce_cython); Py_CLEAR(clear_module_state->__pyx_n_s_reify___setstate_cython); Py_CLEAR(clear_module_state->__pyx_n_s_self); Py_CLEAR(clear_module_state->__pyx_n_s_setstate); Py_CLEAR(clear_module_state->__pyx_n_s_setstate_cython); Py_CLEAR(clear_module_state->__pyx_n_s_state); Py_CLEAR(clear_module_state->__pyx_kp_s_stringsource); Py_CLEAR(clear_module_state->__pyx_n_s_test); Py_CLEAR(clear_module_state->__pyx_n_s_update); Py_CLEAR(clear_module_state->__pyx_n_s_use_setstate); Py_CLEAR(clear_module_state->__pyx_n_s_wrapped); Py_CLEAR(clear_module_state->__pyx_int_88416349); Py_CLEAR(clear_module_state->__pyx_int_124832655); Py_CLEAR(clear_module_state->__pyx_int_250410337); Py_CLEAR(clear_module_state->__pyx_tuple_); Py_CLEAR(clear_module_state->__pyx_tuple__2); Py_CLEAR(clear_module_state->__pyx_tuple__4); Py_CLEAR(clear_module_state->__pyx_tuple__6); Py_CLEAR(clear_module_state->__pyx_tuple__8); Py_CLEAR(clear_module_state->__pyx_codeobj__5); Py_CLEAR(clear_module_state->__pyx_codeobj__7); Py_CLEAR(clear_module_state->__pyx_codeobj__9); return 0; } #endif /* #### Code section: module_state_traverse ### */ #if CYTHON_USE_MODULE_STATE static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { __pyx_mstate *traverse_module_state = __pyx_mstate(m); if (!traverse_module_state) return 0; Py_VISIT(traverse_module_state->__pyx_d); Py_VISIT(traverse_module_state->__pyx_b); Py_VISIT(traverse_module_state->__pyx_cython_runtime); Py_VISIT(traverse_module_state->__pyx_empty_tuple); Py_VISIT(traverse_module_state->__pyx_empty_bytes); Py_VISIT(traverse_module_state->__pyx_empty_unicode); #ifdef __Pyx_CyFunction_USED Py_VISIT(traverse_module_state->__pyx_CyFunctionType); #endif #ifdef __Pyx_FusedFunction_USED Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); #endif Py_VISIT(traverse_module_state->__pyx_ptype_7aiohttp_8_helpers_reify); Py_VISIT(traverse_module_state->__pyx_type_7aiohttp_8_helpers_reify); Py_VISIT(traverse_module_state->__pyx_n_s_AttributeError); Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); Py_VISIT(traverse_module_state->__pyx_n_s_KeyError); Py_VISIT(traverse_module_state->__pyx_n_s_PickleError); Py_VISIT(traverse_module_state->__pyx_n_s__10); Py_VISIT(traverse_module_state->__pyx_kp_u__3); Py_VISIT(traverse_module_state->__pyx_n_s_aiohttp__helpers); Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); Py_VISIT(traverse_module_state->__pyx_n_s_cache); Py_VISIT(traverse_module_state->__pyx_n_s_class_getitem); Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); Py_VISIT(traverse_module_state->__pyx_n_s_dict); Py_VISIT(traverse_module_state->__pyx_n_s_dict_2); Py_VISIT(traverse_module_state->__pyx_kp_u_disable); Py_VISIT(traverse_module_state->__pyx_n_s_doc); Py_VISIT(traverse_module_state->__pyx_kp_u_enable); Py_VISIT(traverse_module_state->__pyx_kp_u_gc); Py_VISIT(traverse_module_state->__pyx_n_s_getstate); Py_VISIT(traverse_module_state->__pyx_n_s_import); Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); Py_VISIT(traverse_module_state->__pyx_kp_u_isenabled); Py_VISIT(traverse_module_state->__pyx_n_s_main); Py_VISIT(traverse_module_state->__pyx_n_s_name); Py_VISIT(traverse_module_state->__pyx_n_s_new); Py_VISIT(traverse_module_state->__pyx_n_s_pickle); Py_VISIT(traverse_module_state->__pyx_n_s_pyx_PickleError); Py_VISIT(traverse_module_state->__pyx_n_s_pyx_checksum); Py_VISIT(traverse_module_state->__pyx_n_s_pyx_result); Py_VISIT(traverse_module_state->__pyx_n_s_pyx_state); Py_VISIT(traverse_module_state->__pyx_n_s_pyx_type); Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_reify); Py_VISIT(traverse_module_state->__pyx_n_s_reduce); Py_VISIT(traverse_module_state->__pyx_n_s_reduce_cython); Py_VISIT(traverse_module_state->__pyx_n_s_reduce_ex); Py_VISIT(traverse_module_state->__pyx_kp_u_reified_property_is_read_only); Py_VISIT(traverse_module_state->__pyx_n_s_reify); Py_VISIT(traverse_module_state->__pyx_n_s_reify___reduce_cython); Py_VISIT(traverse_module_state->__pyx_n_s_reify___setstate_cython); Py_VISIT(traverse_module_state->__pyx_n_s_self); Py_VISIT(traverse_module_state->__pyx_n_s_setstate); Py_VISIT(traverse_module_state->__pyx_n_s_setstate_cython); Py_VISIT(traverse_module_state->__pyx_n_s_state); Py_VISIT(traverse_module_state->__pyx_kp_s_stringsource); Py_VISIT(traverse_module_state->__pyx_n_s_test); Py_VISIT(traverse_module_state->__pyx_n_s_update); Py_VISIT(traverse_module_state->__pyx_n_s_use_setstate); Py_VISIT(traverse_module_state->__pyx_n_s_wrapped); Py_VISIT(traverse_module_state->__pyx_int_88416349); Py_VISIT(traverse_module_state->__pyx_int_124832655); Py_VISIT(traverse_module_state->__pyx_int_250410337); Py_VISIT(traverse_module_state->__pyx_tuple_); Py_VISIT(traverse_module_state->__pyx_tuple__2); Py_VISIT(traverse_module_state->__pyx_tuple__4); Py_VISIT(traverse_module_state->__pyx_tuple__6); Py_VISIT(traverse_module_state->__pyx_tuple__8); Py_VISIT(traverse_module_state->__pyx_codeobj__5); Py_VISIT(traverse_module_state->__pyx_codeobj__7); Py_VISIT(traverse_module_state->__pyx_codeobj__9); return 0; } #endif /* #### Code section: module_state_defines ### */ #define __pyx_d __pyx_mstate_global->__pyx_d #define __pyx_b __pyx_mstate_global->__pyx_b #define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime #define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple #define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes #define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode #ifdef __Pyx_CyFunction_USED #define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType #endif #ifdef __Pyx_FusedFunction_USED #define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType #endif #ifdef __Pyx_Generator_USED #define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType #endif #ifdef __Pyx_IterableCoroutine_USED #define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType #endif #ifdef __Pyx_Coroutine_USED #define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType #endif #ifdef __Pyx_Coroutine_USED #define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType #endif #if CYTHON_USE_MODULE_STATE #define __pyx_type_7aiohttp_8_helpers_reify __pyx_mstate_global->__pyx_type_7aiohttp_8_helpers_reify #endif #define __pyx_ptype_7aiohttp_8_helpers_reify __pyx_mstate_global->__pyx_ptype_7aiohttp_8_helpers_reify #define __pyx_n_s_AttributeError __pyx_mstate_global->__pyx_n_s_AttributeError #define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0 #define __pyx_n_s_KeyError __pyx_mstate_global->__pyx_n_s_KeyError #define __pyx_n_s_PickleError __pyx_mstate_global->__pyx_n_s_PickleError #define __pyx_n_s__10 __pyx_mstate_global->__pyx_n_s__10 #define __pyx_kp_u__3 __pyx_mstate_global->__pyx_kp_u__3 #define __pyx_n_s_aiohttp__helpers __pyx_mstate_global->__pyx_n_s_aiohttp__helpers #define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines #define __pyx_n_s_cache __pyx_mstate_global->__pyx_n_s_cache #define __pyx_n_s_class_getitem __pyx_mstate_global->__pyx_n_s_class_getitem #define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback #define __pyx_n_s_dict __pyx_mstate_global->__pyx_n_s_dict #define __pyx_n_s_dict_2 __pyx_mstate_global->__pyx_n_s_dict_2 #define __pyx_kp_u_disable __pyx_mstate_global->__pyx_kp_u_disable #define __pyx_n_s_doc __pyx_mstate_global->__pyx_n_s_doc #define __pyx_kp_u_enable __pyx_mstate_global->__pyx_kp_u_enable #define __pyx_kp_u_gc __pyx_mstate_global->__pyx_kp_u_gc #define __pyx_n_s_getstate __pyx_mstate_global->__pyx_n_s_getstate #define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import #define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine #define __pyx_kp_u_isenabled __pyx_mstate_global->__pyx_kp_u_isenabled #define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main #define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name #define __pyx_n_s_new __pyx_mstate_global->__pyx_n_s_new #define __pyx_n_s_pickle __pyx_mstate_global->__pyx_n_s_pickle #define __pyx_n_s_pyx_PickleError __pyx_mstate_global->__pyx_n_s_pyx_PickleError #define __pyx_n_s_pyx_checksum __pyx_mstate_global->__pyx_n_s_pyx_checksum #define __pyx_n_s_pyx_result __pyx_mstate_global->__pyx_n_s_pyx_result #define __pyx_n_s_pyx_state __pyx_mstate_global->__pyx_n_s_pyx_state #define __pyx_n_s_pyx_type __pyx_mstate_global->__pyx_n_s_pyx_type #define __pyx_n_s_pyx_unpickle_reify __pyx_mstate_global->__pyx_n_s_pyx_unpickle_reify #define __pyx_n_s_reduce __pyx_mstate_global->__pyx_n_s_reduce #define __pyx_n_s_reduce_cython __pyx_mstate_global->__pyx_n_s_reduce_cython #define __pyx_n_s_reduce_ex __pyx_mstate_global->__pyx_n_s_reduce_ex #define __pyx_kp_u_reified_property_is_read_only __pyx_mstate_global->__pyx_kp_u_reified_property_is_read_only #define __pyx_n_s_reify __pyx_mstate_global->__pyx_n_s_reify #define __pyx_n_s_reify___reduce_cython __pyx_mstate_global->__pyx_n_s_reify___reduce_cython #define __pyx_n_s_reify___setstate_cython __pyx_mstate_global->__pyx_n_s_reify___setstate_cython #define __pyx_n_s_self __pyx_mstate_global->__pyx_n_s_self #define __pyx_n_s_setstate __pyx_mstate_global->__pyx_n_s_setstate #define __pyx_n_s_setstate_cython __pyx_mstate_global->__pyx_n_s_setstate_cython #define __pyx_n_s_state __pyx_mstate_global->__pyx_n_s_state #define __pyx_kp_s_stringsource __pyx_mstate_global->__pyx_kp_s_stringsource #define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test #define __pyx_n_s_update __pyx_mstate_global->__pyx_n_s_update #define __pyx_n_s_use_setstate __pyx_mstate_global->__pyx_n_s_use_setstate #define __pyx_n_s_wrapped __pyx_mstate_global->__pyx_n_s_wrapped #define __pyx_int_88416349 __pyx_mstate_global->__pyx_int_88416349 #define __pyx_int_124832655 __pyx_mstate_global->__pyx_int_124832655 #define __pyx_int_250410337 __pyx_mstate_global->__pyx_int_250410337 #define __pyx_tuple_ __pyx_mstate_global->__pyx_tuple_ #define __pyx_tuple__2 __pyx_mstate_global->__pyx_tuple__2 #define __pyx_tuple__4 __pyx_mstate_global->__pyx_tuple__4 #define __pyx_tuple__6 __pyx_mstate_global->__pyx_tuple__6 #define __pyx_tuple__8 __pyx_mstate_global->__pyx_tuple__8 #define __pyx_codeobj__5 __pyx_mstate_global->__pyx_codeobj__5 #define __pyx_codeobj__7 __pyx_mstate_global->__pyx_codeobj__7 #define __pyx_codeobj__9 __pyx_mstate_global->__pyx_codeobj__9 /* #### Code section: module_code ### */ /* "aiohttp/_helpers.pyx":13 * cdef object name * * def __init__(self, wrapped): # <<<<<<<<<<<<<< * self.wrapped = wrapped * self.name = wrapped.__name__ */ /* Python wrapper */ static int __pyx_pw_7aiohttp_8_helpers_5reify_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7aiohttp_8_helpers_5reify_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_wrapped = 0; CYTHON_UNUSED Py_ssize_t __pyx_nargs; CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[1] = {0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; #endif __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_wrapped,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_wrapped)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 13, __pyx_L3_error) else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 13, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 1)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); } __pyx_v_wrapped = values[0]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 13, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._helpers.reify.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify___init__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self), __pyx_v_wrapped); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_7aiohttp_8_helpers_5reify___init__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v_wrapped) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__init__", 1); /* "aiohttp/_helpers.pyx":14 * * def __init__(self, wrapped): * self.wrapped = wrapped # <<<<<<<<<<<<<< * self.name = wrapped.__name__ * */ __Pyx_INCREF(__pyx_v_wrapped); __Pyx_GIVEREF(__pyx_v_wrapped); __Pyx_GOTREF(__pyx_v_self->wrapped); __Pyx_DECREF(__pyx_v_self->wrapped); __pyx_v_self->wrapped = __pyx_v_wrapped; /* "aiohttp/_helpers.pyx":15 * def __init__(self, wrapped): * self.wrapped = wrapped * self.name = wrapped.__name__ # <<<<<<<<<<<<<< * * @property */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_wrapped, __pyx_n_s_name); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_self->name); __Pyx_DECREF(__pyx_v_self->name); __pyx_v_self->name = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_helpers.pyx":13 * cdef object name * * def __init__(self, wrapped): # <<<<<<<<<<<<<< * self.wrapped = wrapped * self.name = wrapped.__name__ */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._helpers.reify.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_helpers.pyx":17 * self.name = wrapped.__name__ * * @property # <<<<<<<<<<<<<< * def __doc__(self): * return self.wrapped.__doc__ */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_7__doc___1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_7__doc___1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_7__doc_____get__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_7__doc_____get__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 1); /* "aiohttp/_helpers.pyx":19 * @property * def __doc__(self): * return self.wrapped.__doc__ # <<<<<<<<<<<<<< * * def __get__(self, inst, owner): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->wrapped, __pyx_n_s_doc); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "aiohttp/_helpers.pyx":17 * self.name = wrapped.__name__ * * @property # <<<<<<<<<<<<<< * def __doc__(self): * return self.wrapped.__doc__ */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._helpers.reify.__doc__.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_helpers.pyx":21 * return self.wrapped.__doc__ * * def __get__(self, inst, owner): # <<<<<<<<<<<<<< * try: * try: */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_3__get__(PyObject *__pyx_v_self, PyObject *__pyx_v_inst, PyObject *__pyx_v_owner); /*proto*/ static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_3__get__(PyObject *__pyx_v_self, PyObject *__pyx_v_inst, PyObject *__pyx_v_owner) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_2__get__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self), ((PyObject *)__pyx_v_inst), ((PyObject *)__pyx_v_owner)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_2__get__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v_inst, CYTHON_UNUSED PyObject *__pyx_v_owner) { PyObject *__pyx_v_val = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; int __pyx_t_9; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; PyObject *__pyx_t_12 = NULL; PyObject *__pyx_t_13 = NULL; int __pyx_t_14; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 1); /* "aiohttp/_helpers.pyx":22 * * def __get__(self, inst, owner): * try: # <<<<<<<<<<<<<< * try: * return inst._cache[self.name] */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { /* "aiohttp/_helpers.pyx":23 * def __get__(self, inst, owner): * try: * try: # <<<<<<<<<<<<<< * return inst._cache[self.name] * except KeyError: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6); __Pyx_XGOTREF(__pyx_t_4); __Pyx_XGOTREF(__pyx_t_5); __Pyx_XGOTREF(__pyx_t_6); /*try:*/ { /* "aiohttp/_helpers.pyx":24 * try: * try: * return inst._cache[self.name] # <<<<<<<<<<<<<< * except KeyError: * val = self.wrapped(inst) */ __Pyx_XDECREF(__pyx_r); __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_inst, __pyx_n_s_cache); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 24, __pyx_L9_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_8 = __Pyx_PyObject_GetItem(__pyx_t_7, __pyx_v_self->name); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 24, __pyx_L9_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_r = __pyx_t_8; __pyx_t_8 = 0; goto __pyx_L13_try_return; /* "aiohttp/_helpers.pyx":23 * def __get__(self, inst, owner): * try: * try: # <<<<<<<<<<<<<< * return inst._cache[self.name] * except KeyError: */ } __pyx_L9_error:; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; /* "aiohttp/_helpers.pyx":25 * try: * return inst._cache[self.name] * except KeyError: # <<<<<<<<<<<<<< * val = self.wrapped(inst) * inst._cache[self.name] = val */ __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_KeyError); if (__pyx_t_9) { __Pyx_AddTraceback("aiohttp._helpers.reify.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_8, &__pyx_t_7, &__pyx_t_10) < 0) __PYX_ERR(0, 25, __pyx_L11_except_error) __Pyx_XGOTREF(__pyx_t_8); __Pyx_XGOTREF(__pyx_t_7); __Pyx_XGOTREF(__pyx_t_10); /* "aiohttp/_helpers.pyx":26 * return inst._cache[self.name] * except KeyError: * val = self.wrapped(inst) # <<<<<<<<<<<<<< * inst._cache[self.name] = val * return val */ __Pyx_INCREF(__pyx_v_self->wrapped); __pyx_t_12 = __pyx_v_self->wrapped; __pyx_t_13 = NULL; __pyx_t_9 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_12))) { __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_12); if (likely(__pyx_t_13)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12); __Pyx_INCREF(__pyx_t_13); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_12, function); __pyx_t_9 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_13, __pyx_v_inst}; __pyx_t_11 = __Pyx_PyObject_FastCall(__pyx_t_12, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 26, __pyx_L11_except_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; } __pyx_v_val = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_helpers.pyx":27 * except KeyError: * val = self.wrapped(inst) * inst._cache[self.name] = val # <<<<<<<<<<<<<< * return val * except AttributeError: */ __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_v_inst, __pyx_n_s_cache); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 27, __pyx_L11_except_error) __Pyx_GOTREF(__pyx_t_11); if (unlikely((PyObject_SetItem(__pyx_t_11, __pyx_v_self->name, __pyx_v_val) < 0))) __PYX_ERR(0, 27, __pyx_L11_except_error) __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; /* "aiohttp/_helpers.pyx":28 * val = self.wrapped(inst) * inst._cache[self.name] = val * return val # <<<<<<<<<<<<<< * except AttributeError: * if inst is None: */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_val); __pyx_r = __pyx_v_val; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; goto __pyx_L12_except_return; } goto __pyx_L11_except_error; /* "aiohttp/_helpers.pyx":23 * def __get__(self, inst, owner): * try: * try: # <<<<<<<<<<<<<< * return inst._cache[self.name] * except KeyError: */ __pyx_L11_except_error:; __Pyx_XGIVEREF(__pyx_t_4); __Pyx_XGIVEREF(__pyx_t_5); __Pyx_XGIVEREF(__pyx_t_6); __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); goto __pyx_L3_error; __pyx_L13_try_return:; __Pyx_XGIVEREF(__pyx_t_4); __Pyx_XGIVEREF(__pyx_t_5); __Pyx_XGIVEREF(__pyx_t_6); __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); goto __pyx_L7_try_return; __pyx_L12_except_return:; __Pyx_XGIVEREF(__pyx_t_4); __Pyx_XGIVEREF(__pyx_t_5); __Pyx_XGIVEREF(__pyx_t_6); __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); goto __pyx_L7_try_return; } /* "aiohttp/_helpers.pyx":22 * * def __get__(self, inst, owner): * try: # <<<<<<<<<<<<<< * try: * return inst._cache[self.name] */ } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; /* "aiohttp/_helpers.pyx":29 * inst._cache[self.name] = val * return val * except AttributeError: # <<<<<<<<<<<<<< * if inst is None: * return self */ __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_AttributeError); if (__pyx_t_9) { __Pyx_AddTraceback("aiohttp._helpers.reify.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_7, &__pyx_t_8) < 0) __PYX_ERR(0, 29, __pyx_L5_except_error) __Pyx_XGOTREF(__pyx_t_10); __Pyx_XGOTREF(__pyx_t_7); __Pyx_XGOTREF(__pyx_t_8); /* "aiohttp/_helpers.pyx":30 * return val * except AttributeError: * if inst is None: # <<<<<<<<<<<<<< * return self * raise */ __pyx_t_14 = (__pyx_v_inst == Py_None); if (__pyx_t_14) { /* "aiohttp/_helpers.pyx":31 * except AttributeError: * if inst is None: * return self # <<<<<<<<<<<<<< * raise * */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF((PyObject *)__pyx_v_self); __pyx_r = ((PyObject *)__pyx_v_self); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; goto __pyx_L6_except_return; /* "aiohttp/_helpers.pyx":30 * return val * except AttributeError: * if inst is None: # <<<<<<<<<<<<<< * return self * raise */ } /* "aiohttp/_helpers.pyx":32 * if inst is None: * return self * raise # <<<<<<<<<<<<<< * * def __set__(self, inst, value): */ __Pyx_GIVEREF(__pyx_t_10); __Pyx_GIVEREF(__pyx_t_7); __Pyx_XGIVEREF(__pyx_t_8); __Pyx_ErrRestoreWithState(__pyx_t_10, __pyx_t_7, __pyx_t_8); __pyx_t_10 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __PYX_ERR(0, 32, __pyx_L5_except_error) } goto __pyx_L5_except_error; /* "aiohttp/_helpers.pyx":22 * * def __get__(self, inst, owner): * try: # <<<<<<<<<<<<<< * try: * return inst._cache[self.name] */ __pyx_L5_except_error:; __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); goto __pyx_L1_error; __pyx_L7_try_return:; __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); goto __pyx_L0; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); goto __pyx_L0; } /* "aiohttp/_helpers.pyx":21 * return self.wrapped.__doc__ * * def __get__(self, inst, owner): # <<<<<<<<<<<<<< * try: * try: */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_11); __Pyx_XDECREF(__pyx_t_12); __Pyx_XDECREF(__pyx_t_13); __Pyx_AddTraceback("aiohttp._helpers.reify.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_val); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_helpers.pyx":34 * raise * * def __set__(self, inst, value): # <<<<<<<<<<<<<< * raise AttributeError("reified property is read-only") */ /* Python wrapper */ static int __pyx_pw_7aiohttp_8_helpers_5reify_5__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_inst, PyObject *__pyx_v_value); /*proto*/ static int __pyx_pw_7aiohttp_8_helpers_5reify_5__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_inst, PyObject *__pyx_v_value) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_4__set__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self), ((PyObject *)__pyx_v_inst), ((PyObject *)__pyx_v_value)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_7aiohttp_8_helpers_5reify_4__set__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_inst, CYTHON_UNUSED PyObject *__pyx_v_value) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__set__", 1); /* "aiohttp/_helpers.pyx":35 * * def __set__(self, inst, value): * raise AttributeError("reified property is read-only") # <<<<<<<<<<<<<< */ __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_AttributeError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(0, 35, __pyx_L1_error) /* "aiohttp/_helpers.pyx":34 * raise * * def __set__(self, inst, value): # <<<<<<<<<<<<<< * raise AttributeError("reified property is read-only") */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._helpers.reify.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_7__reduce_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_8_helpers_5reify_7__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_8_helpers_5reify_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_7__reduce_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); if (unlikely(__pyx_nargs > 0)) { __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_6__reduce_cython__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_6__reduce_cython__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self) { PyObject *__pyx_v_state = 0; PyObject *__pyx_v__dict = 0; int __pyx_v_use_setstate; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 1); /* "(tree fragment)":5 * cdef object _dict * cdef bint use_setstate * state = (self.name, self.wrapped) # <<<<<<<<<<<<<< * _dict = getattr(self, '__dict__', None) * if _dict is not None: */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_v_self->name); __Pyx_GIVEREF(__pyx_v_self->name); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->wrapped); __Pyx_GIVEREF(__pyx_v_self->wrapped); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->wrapped)) __PYX_ERR(1, 5, __pyx_L1_error); __pyx_v_state = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":6 * cdef bint use_setstate * state = (self.name, self.wrapped) * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< * if _dict is not None: * state += (_dict,) */ __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v__dict = __pyx_t_1; __pyx_t_1 = 0; /* "(tree fragment)":7 * state = (self.name, self.wrapped) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ __pyx_t_2 = (__pyx_v__dict != Py_None); if (__pyx_t_2) { /* "(tree fragment)":8 * _dict = getattr(self, '__dict__', None) * if _dict is not None: * state += (_dict,) # <<<<<<<<<<<<<< * use_setstate = True * else: */ __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_v__dict); __Pyx_GIVEREF(__pyx_v__dict); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict)) __PYX_ERR(1, 8, __pyx_L1_error); __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; /* "(tree fragment)":9 * if _dict is not None: * state += (_dict,) * use_setstate = True # <<<<<<<<<<<<<< * else: * use_setstate = self.name is not None or self.wrapped is not None */ __pyx_v_use_setstate = 1; /* "(tree fragment)":7 * state = (self.name, self.wrapped) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ goto __pyx_L3; } /* "(tree fragment)":11 * use_setstate = True * else: * use_setstate = self.name is not None or self.wrapped is not None # <<<<<<<<<<<<<< * if use_setstate: * return __pyx_unpickle_reify, (type(self), 0xeecf561, None), state */ /*else*/ { __pyx_t_4 = (__pyx_v_self->name != Py_None); if (!__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->wrapped != Py_None); __pyx_t_2 = __pyx_t_4; __pyx_L4_bool_binop_done:; __pyx_v_use_setstate = __pyx_t_2; } __pyx_L3:; /* "(tree fragment)":12 * else: * use_setstate = self.name is not None or self.wrapped is not None * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle_reify, (type(self), 0xeecf561, None), state * else: */ if (__pyx_v_use_setstate) { /* "(tree fragment)":13 * use_setstate = self.name is not None or self.wrapped is not None * if use_setstate: * return __pyx_unpickle_reify, (type(self), 0xeecf561, None), state # <<<<<<<<<<<<<< * else: * return __pyx_unpickle_reify, (type(self), 0xeecf561, state) */ __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle_reify); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 13, __pyx_L1_error); __Pyx_INCREF(__pyx_int_250410337); __Pyx_GIVEREF(__pyx_int_250410337); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_250410337)) __PYX_ERR(1, 13, __pyx_L1_error); __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(1, 13, __pyx_L1_error); __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_3); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_1); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_state)) __PYX_ERR(1, 13, __pyx_L1_error); __pyx_t_3 = 0; __pyx_t_1 = 0; __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; /* "(tree fragment)":12 * else: * use_setstate = self.name is not None or self.wrapped is not None * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle_reify, (type(self), 0xeecf561, None), state * else: */ } /* "(tree fragment)":15 * return __pyx_unpickle_reify, (type(self), 0xeecf561, None), state * else: * return __pyx_unpickle_reify, (type(self), 0xeecf561, state) # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle_reify__set_state(self, __pyx_state) */ /*else*/ { __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_pyx_unpickle_reify); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 15, __pyx_L1_error); __Pyx_INCREF(__pyx_int_250410337); __Pyx_GIVEREF(__pyx_int_250410337); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_250410337)) __PYX_ERR(1, 15, __pyx_L1_error); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(1, 15, __pyx_L1_error); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_5); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5)) __PYX_ERR(1, 15, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_1); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error); __pyx_t_5 = 0; __pyx_t_1 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("aiohttp._helpers.reify.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_state); __Pyx_XDECREF(__pyx_v__dict); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":16 * else: * return __pyx_unpickle_reify, (type(self), 0xeecf561, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_reify__set_state(self, __pyx_state) */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_9__setstate_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_8_helpers_5reify_9__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_8_helpers_5reify_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_9__setstate_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { PyObject *__pyx_v___pyx_state = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[1] = {0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 16, __pyx_L3_error) else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 16, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 1)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); } __pyx_v___pyx_state = values[0]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 16, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._helpers.reify.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_8__setstate_cython__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self), __pyx_v___pyx_state); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_8__setstate_cython__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 1); /* "(tree fragment)":17 * return __pyx_unpickle_reify, (type(self), 0xeecf561, state) * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle_reify__set_state(self, __pyx_state) # <<<<<<<<<<<<<< */ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 17, __pyx_L1_error) __pyx_t_1 = __pyx_f_7aiohttp_8_helpers___pyx_unpickle_reify__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":16 * else: * return __pyx_unpickle_reify, (type(self), 0xeecf561, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_reify__set_state(self, __pyx_state) */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._helpers.reify.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __pyx_unpickle_reify(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_8_helpers_1__pyx_unpickle_reify(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_8_helpers_1__pyx_unpickle_reify = {"__pyx_unpickle_reify", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_8_helpers_1__pyx_unpickle_reify, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_8_helpers_1__pyx_unpickle_reify(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { PyObject *__pyx_v___pyx_type = 0; long __pyx_v___pyx_checksum; PyObject *__pyx_v___pyx_state = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[3] = {0,0,0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__pyx_unpickle_reify (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_reify", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_reify", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_reify") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 3)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); } __pyx_v___pyx_type = values[0]; __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) __pyx_v___pyx_state = values[2]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_reify", 1, 3, 3, __pyx_nargs); __PYX_ERR(1, 1, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._helpers.__pyx_unpickle_reify", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_8_helpers___pyx_unpickle_reify(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_8_helpers___pyx_unpickle_reify(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_v___pyx_PickleError = 0; PyObject *__pyx_v___pyx_result = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__pyx_unpickle_reify", 1); /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum not in (0xeecf561, 0x545205d, 0x770cb8f): # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xeecf561, 0x545205d, 0x770cb8f) = (name, wrapped))" % __pyx_checksum */ __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__2, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "(tree fragment)":5 * cdef object __pyx_result * if __pyx_checksum not in (0xeecf561, 0x545205d, 0x770cb8f): * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xeecf561, 0x545205d, 0x770cb8f) = (name, wrapped))" % __pyx_checksum * __pyx_result = reify.__new__(__pyx_type) */ __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_s_PickleError); __Pyx_GIVEREF(__pyx_n_s_PickleError); if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(1, 5, __pyx_L1_error); __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_t_1); __pyx_v___pyx_PickleError = __pyx_t_1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":6 * if __pyx_checksum not in (0xeecf561, 0x545205d, 0x770cb8f): * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xeecf561, 0x545205d, 0x770cb8f) = (name, wrapped))" % __pyx_checksum # <<<<<<<<<<<<<< * __pyx_result = reify.__new__(__pyx_type) * if __pyx_state is not None: */ __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(1, 6, __pyx_L1_error) /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum not in (0xeecf561, 0x545205d, 0x770cb8f): # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xeecf561, 0x545205d, 0x770cb8f) = (name, wrapped))" % __pyx_checksum */ } /* "(tree fragment)":7 * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xeecf561, 0x545205d, 0x770cb8f) = (name, wrapped))" % __pyx_checksum * __pyx_result = reify.__new__(__pyx_type) # <<<<<<<<<<<<<< * if __pyx_state is not None: * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7aiohttp_8_helpers_reify), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_5 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_5 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __pyx_v___pyx_result = __pyx_t_1; __pyx_t_1 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xeecf561, 0x545205d, 0x770cb8f) = (name, wrapped))" % __pyx_checksum * __pyx_result = reify.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) * return __pyx_result */ __pyx_t_2 = (__pyx_v___pyx_state != Py_None); if (__pyx_t_2) { /* "(tree fragment)":9 * __pyx_result = reify.__new__(__pyx_type) * if __pyx_state is not None: * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< * return __pyx_result * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): */ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 9, __pyx_L1_error) __pyx_t_1 = __pyx_f_7aiohttp_8_helpers___pyx_unpickle_reify__set_state(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xeecf561, 0x545205d, 0x770cb8f) = (name, wrapped))" % __pyx_checksum * __pyx_result = reify.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) * return __pyx_result */ } /* "(tree fragment)":10 * if __pyx_state is not None: * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) * return __pyx_result # <<<<<<<<<<<<<< * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v___pyx_result); __pyx_r = __pyx_v___pyx_result; goto __pyx_L0; /* "(tree fragment)":1 * def __pyx_unpickle_reify(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("aiohttp._helpers.__pyx_unpickle_reify", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v___pyx_PickleError); __Pyx_XDECREF(__pyx_v___pyx_result); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":11 * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): */ static PyObject *__pyx_f_7aiohttp_8_helpers___pyx_unpickle_reify__set_state(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; Py_ssize_t __pyx_t_3; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; int __pyx_t_8; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__pyx_unpickle_reify__set_state", 1); /* "(tree fragment)":12 * return __pyx_result * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] # <<<<<<<<<<<<<< * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[2]) */ if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->name); __Pyx_DECREF(__pyx_v___pyx_result->name); __pyx_v___pyx_result->name = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->wrapped); __Pyx_DECREF(__pyx_v___pyx_result->wrapped); __pyx_v___pyx_result->wrapped = __pyx_t_1; __pyx_t_1 = 0; /* "(tree fragment)":13 * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< * __pyx_result.__dict__.update(__pyx_state[2]) */ if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(1, 13, __pyx_L1_error) } __pyx_t_3 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) __pyx_t_4 = (__pyx_t_3 > 2); if (__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) __pyx_t_2 = __pyx_t_4; __pyx_L4_bool_binop_done:; if (__pyx_t_2) { /* "(tree fragment)":14 * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[2]) # <<<<<<<<<<<<<< */ __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_update); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 14, __pyx_L1_error) } __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_7 = NULL; __pyx_t_8 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_6))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); __Pyx_INCREF(__pyx_t_7); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_6, function); __pyx_t_8 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_5}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":13 * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< * __pyx_result.__dict__.update(__pyx_state[2]) */ } /* "(tree fragment)":11 * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_AddTraceback("aiohttp._helpers.__pyx_unpickle_reify__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_tp_new_7aiohttp_8_helpers_reify(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { struct __pyx_obj_7aiohttp_8_helpers_reify *p; PyObject *o; #if CYTHON_COMPILING_IN_LIMITED_API allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); o = alloc_func(t, 0); #else if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { o = (*t->tp_alloc)(t, 0); } else { o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); } if (unlikely(!o)) return 0; #endif p = ((struct __pyx_obj_7aiohttp_8_helpers_reify *)o); p->wrapped = Py_None; Py_INCREF(Py_None); p->name = Py_None; Py_INCREF(Py_None); return o; } static void __pyx_tp_dealloc_7aiohttp_8_helpers_reify(PyObject *o) { struct __pyx_obj_7aiohttp_8_helpers_reify *p = (struct __pyx_obj_7aiohttp_8_helpers_reify *)o; #if CYTHON_USE_TP_FINALIZE if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7aiohttp_8_helpers_reify) { if (PyObject_CallFinalizerFromDealloc(o)) return; } } #endif PyObject_GC_UnTrack(o); Py_CLEAR(p->wrapped); Py_CLEAR(p->name); #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY (*Py_TYPE(o)->tp_free)(o); #else { freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); if (tp_free) tp_free(o); } #endif } static int __pyx_tp_traverse_7aiohttp_8_helpers_reify(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_7aiohttp_8_helpers_reify *p = (struct __pyx_obj_7aiohttp_8_helpers_reify *)o; if (p->wrapped) { e = (*v)(p->wrapped, a); if (e) return e; } if (p->name) { e = (*v)(p->name, a); if (e) return e; } return 0; } static int __pyx_tp_clear_7aiohttp_8_helpers_reify(PyObject *o) { PyObject* tmp; struct __pyx_obj_7aiohttp_8_helpers_reify *p = (struct __pyx_obj_7aiohttp_8_helpers_reify *)o; tmp = ((PyObject*)p->wrapped); p->wrapped = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->name); p->name = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); return 0; } static PyObject *__pyx_tp_descr_get_7aiohttp_8_helpers_reify(PyObject *o, PyObject *i, PyObject *c) { PyObject *r = 0; if (!i) i = Py_None; if (!c) c = Py_None; r = __pyx_pw_7aiohttp_8_helpers_5reify_3__get__(o, i, c); return r; } static int __pyx_tp_descr_set_7aiohttp_8_helpers_reify(PyObject *o, PyObject *i, PyObject *v) { if (v) { return __pyx_pw_7aiohttp_8_helpers_5reify_5__set__(o, i, v); } else { PyErr_SetString(PyExc_NotImplementedError, "__delete__"); return -1; } } static PyObject *__pyx_getprop_7aiohttp_8_helpers_5reify___doc__(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_8_helpers_5reify_7__doc___1__get__(o); } static PyMethodDef __pyx_methods_7aiohttp_8_helpers_reify[] = { {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_8_helpers_5reify_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_8_helpers_5reify_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {0, 0, 0, 0} }; static struct PyGetSetDef __pyx_getsets_7aiohttp_8_helpers_reify[] = { {(char *)"__doc__", __pyx_getprop_7aiohttp_8_helpers_5reify___doc__, 0, (char *)0, 0}, {0, 0, 0, 0, 0} }; #if CYTHON_USE_TYPE_SPECS static PyType_Slot __pyx_type_7aiohttp_8_helpers_reify_slots[] = { {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7aiohttp_8_helpers_reify}, {Py_tp_doc, (void *)PyDoc_STR("Use as a class method decorator. It operates almost exactly like\n the Python `@property` decorator, but it puts the result of the\n method it decorates into the instance dict after the first call,\n effectively replacing the function it decorates with an instance\n variable. It is, in Python parlance, a data descriptor.\n\n ")}, {Py_tp_traverse, (void *)__pyx_tp_traverse_7aiohttp_8_helpers_reify}, {Py_tp_clear, (void *)__pyx_tp_clear_7aiohttp_8_helpers_reify}, {Py_tp_methods, (void *)__pyx_methods_7aiohttp_8_helpers_reify}, {Py_tp_getset, (void *)__pyx_getsets_7aiohttp_8_helpers_reify}, {Py_tp_descr_get, (void *)__pyx_tp_descr_get_7aiohttp_8_helpers_reify}, {Py_tp_descr_set, (void *)__pyx_tp_descr_set_7aiohttp_8_helpers_reify}, {Py_tp_init, (void *)__pyx_pw_7aiohttp_8_helpers_5reify_1__init__}, {Py_tp_new, (void *)__pyx_tp_new_7aiohttp_8_helpers_reify}, {0, 0}, }; static PyType_Spec __pyx_type_7aiohttp_8_helpers_reify_spec = { "aiohttp._helpers.reify", sizeof(struct __pyx_obj_7aiohttp_8_helpers_reify), 0, Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, __pyx_type_7aiohttp_8_helpers_reify_slots, }; #else static PyTypeObject __pyx_type_7aiohttp_8_helpers_reify = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._helpers.""reify", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_8_helpers_reify), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_8_helpers_reify, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ PyDoc_STR("Use as a class method decorator. It operates almost exactly like\n the Python `@property` decorator, but it puts the result of the\n method it decorates into the instance dict after the first call,\n effectively replacing the function it decorates with an instance\n variable. It is, in Python parlance, a data descriptor.\n\n "), /*tp_doc*/ __pyx_tp_traverse_7aiohttp_8_helpers_reify, /*tp_traverse*/ __pyx_tp_clear_7aiohttp_8_helpers_reify, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7aiohttp_8_helpers_reify, /*tp_methods*/ 0, /*tp_members*/ __pyx_getsets_7aiohttp_8_helpers_reify, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ __pyx_tp_descr_get_7aiohttp_8_helpers_reify, /*tp_descr_get*/ __pyx_tp_descr_set_7aiohttp_8_helpers_reify, /*tp_descr_set*/ #if !CYTHON_USE_TYPE_SPECS 0, /*tp_dictoffset*/ #endif __pyx_pw_7aiohttp_8_helpers_5reify_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_8_helpers_reify, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 #if CYTHON_USE_TP_FINALIZE 0, /*tp_finalize*/ #else NULL, /*tp_finalize*/ #endif #endif #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, /*tp_vectorcall*/ #endif #if __PYX_NEED_TP_PRINT_SLOT == 1 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030C0000 0, /*tp_watched*/ #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 0, /*tp_pypy_flags*/ #endif }; #endif static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif #endif /* #### Code section: pystring_table ### */ static int __Pyx_CreateStringTabAndInitStrings(void) { __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_AttributeError, __pyx_k_AttributeError, sizeof(__pyx_k_AttributeError), 0, 0, 1, 1}, {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_k_Incompatible_checksums_0x_x_vs_0, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0), 0, 0, 1, 0}, {&__pyx_n_s_KeyError, __pyx_k_KeyError, sizeof(__pyx_k_KeyError), 0, 0, 1, 1}, {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, {&__pyx_n_s__10, __pyx_k__10, sizeof(__pyx_k__10), 0, 0, 1, 1}, {&__pyx_kp_u__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 1, 0, 0}, {&__pyx_n_s_aiohttp__helpers, __pyx_k_aiohttp__helpers, sizeof(__pyx_k_aiohttp__helpers), 0, 0, 1, 1}, {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, {&__pyx_n_s_cache, __pyx_k_cache, sizeof(__pyx_k_cache), 0, 0, 1, 1}, {&__pyx_n_s_class_getitem, __pyx_k_class_getitem, sizeof(__pyx_k_class_getitem), 0, 0, 1, 1}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, {&__pyx_n_s_dict_2, __pyx_k_dict_2, sizeof(__pyx_k_dict_2), 0, 0, 1, 1}, {&__pyx_kp_u_disable, __pyx_k_disable, sizeof(__pyx_k_disable), 0, 1, 0, 0}, {&__pyx_n_s_doc, __pyx_k_doc, sizeof(__pyx_k_doc), 0, 0, 1, 1}, {&__pyx_kp_u_enable, __pyx_k_enable, sizeof(__pyx_k_enable), 0, 1, 0, 0}, {&__pyx_kp_u_gc, __pyx_k_gc, sizeof(__pyx_k_gc), 0, 1, 0, 0}, {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, {&__pyx_kp_u_isenabled, __pyx_k_isenabled, sizeof(__pyx_k_isenabled), 0, 1, 0, 0}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, {&__pyx_n_s_pyx_unpickle_reify, __pyx_k_pyx_unpickle_reify, sizeof(__pyx_k_pyx_unpickle_reify), 0, 0, 1, 1}, {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, {&__pyx_kp_u_reified_property_is_read_only, __pyx_k_reified_property_is_read_only, sizeof(__pyx_k_reified_property_is_read_only), 0, 1, 0, 0}, {&__pyx_n_s_reify, __pyx_k_reify, sizeof(__pyx_k_reify), 0, 0, 1, 1}, {&__pyx_n_s_reify___reduce_cython, __pyx_k_reify___reduce_cython, sizeof(__pyx_k_reify___reduce_cython), 0, 0, 1, 1}, {&__pyx_n_s_reify___setstate_cython, __pyx_k_reify___setstate_cython, sizeof(__pyx_k_reify___setstate_cython), 0, 0, 1, 1}, {&__pyx_n_s_self, __pyx_k_self, sizeof(__pyx_k_self), 0, 0, 1, 1}, {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, {&__pyx_n_s_state, __pyx_k_state, sizeof(__pyx_k_state), 0, 0, 1, 1}, {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, {&__pyx_n_s_use_setstate, __pyx_k_use_setstate, sizeof(__pyx_k_use_setstate), 0, 0, 1, 1}, {&__pyx_n_s_wrapped, __pyx_k_wrapped, sizeof(__pyx_k_wrapped), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; return __Pyx_InitStrings(__pyx_string_tab); } /* #### Code section: cached_builtins ### */ static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_KeyError = __Pyx_GetBuiltinName(__pyx_n_s_KeyError); if (!__pyx_builtin_KeyError) __PYX_ERR(0, 25, __pyx_L1_error) __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s_AttributeError); if (!__pyx_builtin_AttributeError) __PYX_ERR(0, 29, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } /* #### Code section: cached_constants ### */ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "aiohttp/_helpers.pyx":35 * * def __set__(self, inst, value): * raise AttributeError("reified property is read-only") # <<<<<<<<<<<<<< */ __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_reified_property_is_read_only); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum not in (0xeecf561, 0x545205d, 0x770cb8f): # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xeecf561, 0x545205d, 0x770cb8f) = (name, wrapped))" % __pyx_checksum */ __pyx_tuple__2 = PyTuple_Pack(3, __pyx_int_250410337, __pyx_int_88416349, __pyx_int_124832655); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ __pyx_tuple__4 = PyTuple_Pack(4, __pyx_n_s_self, __pyx_n_s_state, __pyx_n_s_dict_2, __pyx_n_s_use_setstate); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4); __pyx_codeobj__5 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__4, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__5)) __PYX_ERR(1, 1, __pyx_L1_error) /* "(tree fragment)":16 * else: * return __pyx_unpickle_reify, (type(self), 0xeecf561, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_reify__set_state(self, __pyx_state) */ __pyx_tuple__6 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_pyx_state); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(1, 16, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6); __pyx_codeobj__7 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__6, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__7)) __PYX_ERR(1, 16, __pyx_L1_error) /* "(tree fragment)":1 * def __pyx_unpickle_reify(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ __pyx_tuple__8 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__8); __Pyx_GIVEREF(__pyx_tuple__8); __pyx_codeobj__9 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__8, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_reify, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__9)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } /* #### Code section: init_constants ### */ static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 1, __pyx_L1_error); __pyx_int_88416349 = PyInt_FromLong(88416349L); if (unlikely(!__pyx_int_88416349)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_124832655 = PyInt_FromLong(124832655L); if (unlikely(!__pyx_int_124832655)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_250410337 = PyInt_FromLong(250410337L); if (unlikely(!__pyx_int_250410337)) __PYX_ERR(0, 1, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } /* #### Code section: init_globals ### */ static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { return 0; } /* #### Code section: init_module ### */ static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ static int __Pyx_modinit_global_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); /*--- Global init code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); /*--- Variable export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); /*--- Function export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_init_code(void) { __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ #if CYTHON_USE_TYPE_SPECS __pyx_ptype_7aiohttp_8_helpers_reify = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7aiohttp_8_helpers_reify_spec, NULL); if (unlikely(!__pyx_ptype_7aiohttp_8_helpers_reify)) __PYX_ERR(0, 1, __pyx_L1_error) if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7aiohttp_8_helpers_reify_spec, __pyx_ptype_7aiohttp_8_helpers_reify) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #else __pyx_ptype_7aiohttp_8_helpers_reify = &__pyx_type_7aiohttp_8_helpers_reify; #endif #if !CYTHON_COMPILING_IN_LIMITED_API #endif #if !CYTHON_USE_TYPE_SPECS if (__Pyx_PyType_Ready(__pyx_ptype_7aiohttp_8_helpers_reify) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #if PY_MAJOR_VERSION < 3 __pyx_ptype_7aiohttp_8_helpers_reify->tp_print = 0; #endif #if !CYTHON_COMPILING_IN_LIMITED_API if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7aiohttp_8_helpers_reify->tp_dictoffset && __pyx_ptype_7aiohttp_8_helpers_reify->tp_getattro == PyObject_GenericGetAttr)) { __pyx_ptype_7aiohttp_8_helpers_reify->tp_getattro = __Pyx_PyObject_GenericGetAttr; } #endif if (PyObject_SetAttr(__pyx_m, __pyx_n_s_reify, (PyObject *) __pyx_ptype_7aiohttp_8_helpers_reify) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if !CYTHON_COMPILING_IN_LIMITED_API if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7aiohttp_8_helpers_reify) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_modinit_type_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); /*--- Type import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); /*--- Variable import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); /*--- Function import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } #if PY_MAJOR_VERSION >= 3 #if CYTHON_PEP489_MULTI_PHASE_INIT static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ static int __pyx_pymod_exec__helpers(PyObject* module); /*proto*/ static PyModuleDef_Slot __pyx_moduledef_slots[] = { {Py_mod_create, (void*)__pyx_pymod_create}, {Py_mod_exec, (void*)__pyx_pymod_exec__helpers}, {0, NULL} }; #endif #ifdef __cplusplus namespace { struct PyModuleDef __pyx_moduledef = #else static struct PyModuleDef __pyx_moduledef = #endif { PyModuleDef_HEAD_INIT, "_helpers", 0, /* m_doc */ #if CYTHON_PEP489_MULTI_PHASE_INIT 0, /* m_size */ #elif CYTHON_USE_MODULE_STATE sizeof(__pyx_mstate), /* m_size */ #else -1, /* m_size */ #endif __pyx_methods /* m_methods */, #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_moduledef_slots, /* m_slots */ #else NULL, /* m_reload */ #endif #if CYTHON_USE_MODULE_STATE __pyx_m_traverse, /* m_traverse */ __pyx_m_clear, /* m_clear */ NULL /* m_free */ #else NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ #endif }; #ifdef __cplusplus } /* anonymous namespace */ #endif #endif #ifndef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC #elif PY_MAJOR_VERSION < 3 #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" void #else #define __Pyx_PyMODINIT_FUNC void #endif #else #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" PyObject * #else #define __Pyx_PyMODINIT_FUNC PyObject * #endif #endif #if PY_MAJOR_VERSION < 3 __Pyx_PyMODINIT_FUNC init_helpers(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC init_helpers(void) #else __Pyx_PyMODINIT_FUNC PyInit__helpers(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC PyInit__helpers(void) #if CYTHON_PEP489_MULTI_PHASE_INIT { return PyModuleDef_Init(&__pyx_moduledef); } static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { #if PY_VERSION_HEX >= 0x030700A1 static PY_INT64_T main_interpreter_id = -1; PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); if (main_interpreter_id == -1) { main_interpreter_id = current_id; return (unlikely(current_id == -1)) ? -1 : 0; } else if (unlikely(main_interpreter_id != current_id)) #else static PyInterpreterState *main_interpreter = NULL; PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; if (!main_interpreter) { main_interpreter = current_interpreter; } else if (unlikely(main_interpreter != current_interpreter)) #endif { PyErr_SetString( PyExc_ImportError, "Interpreter change detected - this module can only be loaded into one interpreter per process."); return -1; } return 0; } #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) #else static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) #endif { PyObject *value = PyObject_GetAttrString(spec, from_name); int result = 0; if (likely(value)) { if (allow_none || value != Py_None) { #if CYTHON_COMPILING_IN_LIMITED_API result = PyModule_AddObject(module, to_name, value); #else result = PyDict_SetItemString(moddict, to_name, value); #endif } Py_DECREF(value); } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); } else { result = -1; } return result; } static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { PyObject *module = NULL, *moddict, *modname; CYTHON_UNUSED_VAR(def); if (__Pyx_check_single_interpreter()) return NULL; if (__pyx_m) return __Pyx_NewRef(__pyx_m); modname = PyObject_GetAttrString(spec, "name"); if (unlikely(!modname)) goto bad; module = PyModule_NewObject(modname); Py_DECREF(modname); if (unlikely(!module)) goto bad; #if CYTHON_COMPILING_IN_LIMITED_API moddict = module; #else moddict = PyModule_GetDict(module); if (unlikely(!moddict)) goto bad; #endif if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; return module; bad: Py_XDECREF(module); return NULL; } static CYTHON_SMALL_CODE int __pyx_pymod_exec__helpers(PyObject *__pyx_pyinit_module) #endif #endif { int stringtab_initialized = 0; #if CYTHON_USE_MODULE_STATE int pystate_addmodule_run = 0; #endif PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m) { if (__pyx_m == __pyx_pyinit_module) return 0; PyErr_SetString(PyExc_RuntimeError, "Module '_helpers' has already been imported. Re-initialisation is not supported."); return -1; } #elif PY_MAJOR_VERSION >= 3 if (__pyx_m) return __Pyx_NewRef(__pyx_m); #endif /*--- Module creation code ---*/ #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_m = __pyx_pyinit_module; Py_INCREF(__pyx_m); #else #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("_helpers", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #elif CYTHON_USE_MODULE_STATE __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) { int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to _helpers pseudovariable */ if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) pystate_addmodule_run = 1; } #else __pyx_m = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #endif #endif CYTHON_UNUSED_VAR(__pyx_t_1); __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_d); __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__helpers(void)", 0); if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pxy_PyFrame_Initialize_Offsets __Pxy_PyFrame_Initialize_Offsets(); #endif __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pyx_CyFunction_USED if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Coroutine_USED if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_StopAsyncIteration_USED if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS PyEval_InitThreads(); #endif /*--- Initialize various global constants etc. ---*/ if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) stringtab_initialized = 1; if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif if (__pyx_module_is_main_aiohttp___helpers) { if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) if (!PyDict_GetItemString(modules, "aiohttp._helpers")) { if (unlikely((PyDict_SetItemString(modules, "aiohttp._helpers", __pyx_m) < 0))) __PYX_ERR(0, 1, __pyx_L1_error) } } #endif /*--- Builtin init code ---*/ if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Constants init code ---*/ if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Global type/function init code ---*/ (void)__Pyx_modinit_global_init_code(); (void)__Pyx_modinit_variable_export_code(); (void)__Pyx_modinit_function_export_code(); if (unlikely((__Pyx_modinit_type_init_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) (void)__Pyx_modinit_type_import_code(); (void)__Pyx_modinit_variable_import_code(); (void)__Pyx_modinit_function_import_code(); /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_8_helpers_5reify_7__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_reify___reduce_cython, NULL, __pyx_n_s_aiohttp__helpers, __pyx_d, ((PyObject *)__pyx_codeobj__5)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7aiohttp_8_helpers_reify, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; PyType_Modified(__pyx_ptype_7aiohttp_8_helpers_reify); /* "(tree fragment)":16 * else: * return __pyx_unpickle_reify, (type(self), 0xeecf561, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_reify__set_state(self, __pyx_state) */ __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_8_helpers_5reify_9__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_reify___setstate_cython, NULL, __pyx_n_s_aiohttp__helpers, __pyx_d, ((PyObject *)__pyx_codeobj__7)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 16, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7aiohttp_8_helpers_reify, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(1, 16, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; PyType_Modified(__pyx_ptype_7aiohttp_8_helpers_reify); /* "(tree fragment)":1 * def __pyx_unpickle_reify(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_8_helpers_1__pyx_unpickle_reify, 0, __pyx_n_s_pyx_unpickle_reify, NULL, __pyx_n_s_aiohttp__helpers, __pyx_d, ((PyObject *)__pyx_codeobj__9)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_reify, __pyx_t_2) < 0) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_helpers.pyx":1 * cdef class reify: # <<<<<<<<<<<<<< * """Use as a class method decorator. It operates almost exactly like * the Python `@property` decorator, but it puts the result of the */ __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); if (__pyx_m) { if (__pyx_d && stringtab_initialized) { __Pyx_AddTraceback("init aiohttp._helpers", __pyx_clineno, __pyx_lineno, __pyx_filename); } #if !CYTHON_USE_MODULE_STATE Py_CLEAR(__pyx_m); #else Py_DECREF(__pyx_m); if (pystate_addmodule_run) { PyObject *tp, *value, *tb; PyErr_Fetch(&tp, &value, &tb); PyState_RemoveModule(&__pyx_moduledef); PyErr_Restore(tp, value, tb); } #endif } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init aiohttp._helpers"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if CYTHON_PEP489_MULTI_PHASE_INIT return (__pyx_m != NULL) ? 0 : -1; #elif PY_MAJOR_VERSION >= 3 return __pyx_m; #else return; #endif } /* #### Code section: cleanup_globals ### */ /* #### Code section: cleanup_module ### */ /* #### Code section: main_method ### */ /* #### Code section: utility_code_pragmas ### */ #ifdef _MSC_VER #pragma warning( push ) /* Warning 4127: conditional expression is constant * Cython uses constant conditional expressions to allow in inline functions to be optimized at * compile-time, so this warning is not useful */ #pragma warning( disable : 4127 ) #endif /* #### Code section: utility_code_def ### */ /* --- Runtime support code --- */ /* Refnanny */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule(modname); if (!m) goto end; p = PyObject_GetAttrString(m, "RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* PyErrExceptionMatches */ #if CYTHON_FAST_THREAD_STATE static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; i= 0x030C00A6 PyObject *current_exception = tstate->current_exception; if (unlikely(!current_exception)) return 0; exc_type = (PyObject*) Py_TYPE(current_exception); if (exc_type == err) return 1; #else exc_type = tstate->curexc_type; if (exc_type == err) return 1; if (unlikely(!exc_type)) return 0; #endif #if CYTHON_AVOID_BORROWED_REFS Py_INCREF(exc_type); #endif if (unlikely(PyTuple_Check(err))) { result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); } else { result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); } #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(exc_type); #endif return result; } #endif /* PyErrFetchRestore */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { #if PY_VERSION_HEX >= 0x030C00A6 PyObject *tmp_value; assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); if (value) { #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) #endif PyException_SetTraceback(value, tb); } tmp_value = tstate->current_exception; tstate->current_exception = value; Py_XDECREF(tmp_value); Py_XDECREF(type); Py_XDECREF(tb); #else PyObject *tmp_type, *tmp_value, *tmp_tb; tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #endif } static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { #if PY_VERSION_HEX >= 0x030C00A6 PyObject* exc_value; exc_value = tstate->current_exception; tstate->current_exception = 0; *value = exc_value; *type = NULL; *tb = NULL; if (exc_value) { *type = (PyObject*) Py_TYPE(exc_value); Py_INCREF(*type); #if CYTHON_COMPILING_IN_CPYTHON *tb = ((PyBaseExceptionObject*) exc_value)->traceback; Py_XINCREF(*tb); #else *tb = PyException_GetTraceback(exc_value); #endif } #else *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #endif } #endif /* PyObjectGetAttrStr */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #endif /* PyObjectGetAttrStrNoError */ #if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) __Pyx_PyErr_Clear(); } #endif static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { PyObject *result; #if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 (void) PyObject_GetOptionalAttr(obj, attr_name, &result); return result; #else #if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); } #endif result = __Pyx_PyObject_GetAttrStr(obj, attr_name); if (unlikely(!result)) { __Pyx_PyObject_GetAttrStr_ClearAttributeError(); } return result; #endif } /* GetBuiltinName */ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); if (unlikely(!result) && !PyErr_Occurred()) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } /* TupleAndListFromArray */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { PyObject *v; Py_ssize_t i; for (i = 0; i < length; i++) { v = dest[i] = src[i]; Py_INCREF(v); } } static CYTHON_INLINE PyObject * __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) { PyObject *res; if (n <= 0) { Py_INCREF(__pyx_empty_tuple); return __pyx_empty_tuple; } res = PyTuple_New(n); if (unlikely(res == NULL)) return NULL; __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); return res; } static CYTHON_INLINE PyObject * __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) { PyObject *res; if (n <= 0) { return PyList_New(0); } res = PyList_New(n); if (unlikely(res == NULL)) return NULL; __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); return res; } #endif /* BytesEquals */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API return PyObject_RichCompareBool(s1, s2, equals); #else if (s1 == s2) { return (equals == Py_EQ); } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { const char *ps1, *ps2; Py_ssize_t length = PyBytes_GET_SIZE(s1); if (length != PyBytes_GET_SIZE(s2)) return (equals == Py_NE); ps1 = PyBytes_AS_STRING(s1); ps2 = PyBytes_AS_STRING(s2); if (ps1[0] != ps2[0]) { return (equals == Py_NE); } else if (length == 1) { return (equals == Py_EQ); } else { int result; #if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) Py_hash_t hash1, hash2; hash1 = ((PyBytesObject*)s1)->ob_shash; hash2 = ((PyBytesObject*)s2)->ob_shash; if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { return (equals == Py_NE); } #endif result = memcmp(ps1, ps2, (size_t)length); return (equals == Py_EQ) ? (result == 0) : (result != 0); } } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { return (equals == Py_NE); } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { return (equals == Py_NE); } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); Py_DECREF(py_result); return result; } #endif } /* UnicodeEquals */ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API return PyObject_RichCompareBool(s1, s2, equals); #else #if PY_MAJOR_VERSION < 3 PyObject* owned_ref = NULL; #endif int s1_is_unicode, s2_is_unicode; if (s1 == s2) { goto return_eq; } s1_is_unicode = PyUnicode_CheckExact(s1); s2_is_unicode = PyUnicode_CheckExact(s2); #if PY_MAJOR_VERSION < 3 if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { owned_ref = PyUnicode_FromObject(s2); if (unlikely(!owned_ref)) return -1; s2 = owned_ref; s2_is_unicode = 1; } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { owned_ref = PyUnicode_FromObject(s1); if (unlikely(!owned_ref)) return -1; s1 = owned_ref; s1_is_unicode = 1; } else if (((!s2_is_unicode) & (!s1_is_unicode))) { return __Pyx_PyBytes_Equals(s1, s2, equals); } #endif if (s1_is_unicode & s2_is_unicode) { Py_ssize_t length; int kind; void *data1, *data2; if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) return -1; length = __Pyx_PyUnicode_GET_LENGTH(s1); if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { goto return_ne; } #if CYTHON_USE_UNICODE_INTERNALS { Py_hash_t hash1, hash2; #if CYTHON_PEP393_ENABLED hash1 = ((PyASCIIObject*)s1)->hash; hash2 = ((PyASCIIObject*)s2)->hash; #else hash1 = ((PyUnicodeObject*)s1)->hash; hash2 = ((PyUnicodeObject*)s2)->hash; #endif if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { goto return_ne; } } #endif kind = __Pyx_PyUnicode_KIND(s1); if (kind != __Pyx_PyUnicode_KIND(s2)) { goto return_ne; } data1 = __Pyx_PyUnicode_DATA(s1); data2 = __Pyx_PyUnicode_DATA(s2); if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { goto return_ne; } else if (length == 1) { goto return_eq; } else { int result = memcmp(data1, data2, (size_t)(length * kind)); #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_EQ) ? (result == 0) : (result != 0); } } else if ((s1 == Py_None) & s2_is_unicode) { goto return_ne; } else if ((s2 == Py_None) & s1_is_unicode) { goto return_ne; } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); Py_DECREF(py_result); return result; } return_eq: #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_EQ); return_ne: #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_NE); #endif } /* fastcall */ #if CYTHON_METH_FASTCALL static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) { Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); for (i = 0; i < n; i++) { if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; } for (i = 0; i < n; i++) { int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); if (unlikely(eq != 0)) { if (unlikely(eq < 0)) return NULL; // error return kwvalues[i]; } } return NULL; // not found (no exception set) } #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 static CYTHON_UNUSED PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); PyObject *dict; dict = PyDict_New(); if (unlikely(!dict)) return NULL; for (i=0; i= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } /* ParseKeywords */ static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject *const *kwvalues, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); while (1) { Py_XDECREF(key); key = NULL; Py_XDECREF(value); value = NULL; if (kwds_is_tuple) { Py_ssize_t size; #if CYTHON_ASSUME_SAFE_MACROS size = PyTuple_GET_SIZE(kwds); #else size = PyTuple_Size(kwds); if (size < 0) goto bad; #endif if (pos >= size) break; #if CYTHON_AVOID_BORROWED_REFS key = __Pyx_PySequence_ITEM(kwds, pos); if (!key) goto bad; #elif CYTHON_ASSUME_SAFE_MACROS key = PyTuple_GET_ITEM(kwds, pos); #else key = PyTuple_GetItem(kwds, pos); if (!key) goto bad; #endif value = kwvalues[pos]; pos++; } else { if (!PyDict_Next(kwds, &pos, &key, &value)) break; #if CYTHON_AVOID_BORROWED_REFS Py_INCREF(key); #endif } name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS Py_INCREF(value); // transfer ownership of value to values Py_DECREF(key); #endif key = NULL; value = NULL; continue; } #if !CYTHON_AVOID_BORROWED_REFS Py_INCREF(key); #endif Py_INCREF(value); name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS value = NULL; // ownership transferred to values #endif break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = ( #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**name, key) ); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS value = NULL; // ownership transferred to values #endif break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } Py_XDECREF(key); Py_XDECREF(value); return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); goto bad; invalid_keyword: #if PY_MAJOR_VERSION < 3 PyErr_Format(PyExc_TypeError, "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else PyErr_Format(PyExc_TypeError, "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: Py_XDECREF(key); Py_XDECREF(value); return -1; } /* RaiseArgTupleInvalid */ static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } /* GetItemInt */ static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { PyObject *r; if (unlikely(!j)) return NULL; r = PyObject_GetItem(o, j); Py_DECREF(j); return r; } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS Py_ssize_t wrapped_i = i; if (wraparound & unlikely(i < 0)) { wrapped_i += PyList_GET_SIZE(o); } if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, wrapped_i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS Py_ssize_t wrapped_i = i; if (wraparound & unlikely(i < 0)) { wrapped_i += PyTuple_GET_SIZE(o); } if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS if (is_list || PyList_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { PyObject *r = PyList_GET_ITEM(o, n); Py_INCREF(r); return r; } } else if (PyTuple_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, n); Py_INCREF(r); return r; } } else { PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; if (mm && mm->mp_subscript) { PyObject *r, *key = PyInt_FromSsize_t(i); if (unlikely(!key)) return NULL; r = mm->mp_subscript(o, key); Py_DECREF(key); return r; } if (likely(sm && sm->sq_item)) { if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { Py_ssize_t l = sm->sq_length(o); if (likely(l >= 0)) { i += l; } else { if (!PyErr_ExceptionMatches(PyExc_OverflowError)) return NULL; PyErr_Clear(); } } return sm->sq_item(o, i); } } #else if (is_list || PySequence_Check(o)) { return PySequence_GetItem(o, i); } #endif return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } /* PyFunctionFastCall */ #if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, PyObject *globals) { PyFrameObject *f; PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject **fastlocals; Py_ssize_t i; PyObject *result; assert(globals != NULL); /* XXX Perhaps we should create a specialized PyFrame_New() that doesn't take locals, but does take builtins without sanity checking them. */ assert(tstate != NULL); f = PyFrame_New(tstate, co, globals, NULL); if (f == NULL) { return NULL; } fastlocals = __Pyx_PyFrame_GetLocalsplus(f); for (i = 0; i < na; i++) { Py_INCREF(*args); fastlocals[i] = *args++; } result = PyEval_EvalFrameEx(f,0); ++tstate->recursion_depth; Py_DECREF(f); --tstate->recursion_depth; return result; } static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); PyObject *globals = PyFunction_GET_GLOBALS(func); PyObject *argdefs = PyFunction_GET_DEFAULTS(func); PyObject *closure; #if PY_MAJOR_VERSION >= 3 PyObject *kwdefs; #endif PyObject *kwtuple, **k; PyObject **d; Py_ssize_t nd; Py_ssize_t nk; PyObject *result; assert(kwargs == NULL || PyDict_Check(kwargs)); nk = kwargs ? PyDict_Size(kwargs) : 0; #if PY_MAJOR_VERSION < 3 if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { return NULL; } #else if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) { return NULL; } #endif if ( #if PY_MAJOR_VERSION >= 3 co->co_kwonlyargcount == 0 && #endif likely(kwargs == NULL || nk == 0) && co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { if (argdefs == NULL && co->co_argcount == nargs) { result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); goto done; } else if (nargs == 0 && argdefs != NULL && co->co_argcount == Py_SIZE(argdefs)) { /* function called with no arguments, but all parameters have a default value: use default values as arguments .*/ args = &PyTuple_GET_ITEM(argdefs, 0); result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); goto done; } } if (kwargs != NULL) { Py_ssize_t pos, i; kwtuple = PyTuple_New(2 * nk); if (kwtuple == NULL) { result = NULL; goto done; } k = &PyTuple_GET_ITEM(kwtuple, 0); pos = i = 0; while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { Py_INCREF(k[i]); Py_INCREF(k[i+1]); i += 2; } nk = i / 2; } else { kwtuple = NULL; k = NULL; } closure = PyFunction_GET_CLOSURE(func); #if PY_MAJOR_VERSION >= 3 kwdefs = PyFunction_GET_KW_DEFAULTS(func); #endif if (argdefs != NULL) { d = &PyTuple_GET_ITEM(argdefs, 0); nd = Py_SIZE(argdefs); } else { d = NULL; nd = 0; } #if PY_MAJOR_VERSION >= 3 result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, kwdefs, closure); #else result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, closure); #endif Py_XDECREF(kwtuple); done: Py_LeaveRecursiveCall(); return result; } #endif /* PyObjectCall */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; ternaryfunc call = Py_TYPE(func)->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); #if PY_MAJOR_VERSION < 3 if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; #else if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) return NULL; #endif result = (*call)(func, arg, kw); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectCallMethO */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { PyObject *self, *result; PyCFunction cfunc; cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func); self = __Pyx_CyOrPyCFunction_GET_SELF(func); #if PY_MAJOR_VERSION < 3 if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; #else if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) return NULL; #endif result = cfunc(self, arg); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectFastCall */ #if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { PyObject *argstuple; PyObject *result = 0; size_t i; argstuple = PyTuple_New((Py_ssize_t)nargs); if (unlikely(!argstuple)) return NULL; for (i = 0; i < nargs; i++) { Py_INCREF(args[i]); if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; } result = __Pyx_PyObject_Call(func, argstuple, kwargs); bad: Py_DECREF(argstuple); return result; } #endif static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); #if CYTHON_COMPILING_IN_CPYTHON if (nargs == 0 && kwargs == NULL) { if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS)) return __Pyx_PyObject_CallMethO(func, NULL); } else if (nargs == 1 && kwargs == NULL) { if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O)) return __Pyx_PyObject_CallMethO(func, args[0]); } #endif #if PY_VERSION_HEX < 0x030800B1 #if CYTHON_FAST_PYCCALL if (PyCFunction_Check(func)) { if (kwargs) { return _PyCFunction_FastCallDict(func, args, nargs, kwargs); } else { return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); } } #if PY_VERSION_HEX >= 0x030700A1 if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); } #endif #endif #if CYTHON_FAST_PYCALL if (PyFunction_Check(func)) { return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); } #endif #endif if (kwargs == NULL) { #if CYTHON_VECTORCALL #if PY_VERSION_HEX < 0x03090000 vectorcallfunc f = _PyVectorcall_Function(func); #else vectorcallfunc f = PyVectorcall_Function(func); #endif if (f) { return f(func, args, (size_t)nargs, NULL); } #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL if (__Pyx_CyFunction_CheckExact(func)) { __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); if (f) return f(func, args, (size_t)nargs, NULL); } #endif } if (nargs == 0) { return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); } #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs); #else return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); #endif } /* PyObjectCallOneArg */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *args[2] = {NULL, arg}; return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); } /* ObjectGetItem */ #if CYTHON_USE_TYPE_SLOTS static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject *index) { PyObject *runerr = NULL; Py_ssize_t key_value; key_value = __Pyx_PyIndex_AsSsize_t(index); if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); } if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { __Pyx_TypeName index_type_name = __Pyx_PyType_GetName(Py_TYPE(index)); PyErr_Clear(); PyErr_Format(PyExc_IndexError, "cannot fit '" __Pyx_FMT_TYPENAME "' into an index-sized integer", index_type_name); __Pyx_DECREF_TypeName(index_type_name); } return NULL; } static PyObject *__Pyx_PyObject_GetItem_Slow(PyObject *obj, PyObject *key) { __Pyx_TypeName obj_type_name; if (likely(PyType_Check(obj))) { PyObject *meth = __Pyx_PyObject_GetAttrStrNoError(obj, __pyx_n_s_class_getitem); if (!meth) { PyErr_Clear(); } else { PyObject *result = __Pyx_PyObject_CallOneArg(meth, key); Py_DECREF(meth); return result; } } obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); PyErr_Format(PyExc_TypeError, "'" __Pyx_FMT_TYPENAME "' object is not subscriptable", obj_type_name); __Pyx_DECREF_TypeName(obj_type_name); return NULL; } static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject *key) { PyTypeObject *tp = Py_TYPE(obj); PyMappingMethods *mm = tp->tp_as_mapping; PySequenceMethods *sm = tp->tp_as_sequence; if (likely(mm && mm->mp_subscript)) { return mm->mp_subscript(obj, key); } if (likely(sm && sm->sq_item)) { return __Pyx_PyObject_GetIndex(obj, key); } return __Pyx_PyObject_GetItem_Slow(obj, key); } #endif /* GetTopmostException */ #if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate) { _PyErr_StackItem *exc_info = tstate->exc_info; while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) && exc_info->previous_item != NULL) { exc_info = exc_info->previous_item; } return exc_info; } #endif /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); PyObject *exc_value = exc_info->exc_value; if (exc_value == NULL || exc_value == Py_None) { *value = NULL; *type = NULL; *tb = NULL; } else { *value = exc_value; Py_INCREF(*value); *type = (PyObject*) Py_TYPE(exc_value); Py_INCREF(*type); *tb = PyException_GetTraceback(exc_value); } #elif CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); *type = exc_info->exc_type; *value = exc_info->exc_value; *tb = exc_info->exc_traceback; Py_XINCREF(*type); Py_XINCREF(*value); Py_XINCREF(*tb); #else *type = tstate->exc_type; *value = tstate->exc_value; *tb = tstate->exc_traceback; Py_XINCREF(*type); Py_XINCREF(*value); Py_XINCREF(*tb); #endif } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 _PyErr_StackItem *exc_info = tstate->exc_info; PyObject *tmp_value = exc_info->exc_value; exc_info->exc_value = value; Py_XDECREF(tmp_value); Py_XDECREF(type); Py_XDECREF(tb); #else PyObject *tmp_type, *tmp_value, *tmp_tb; #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = type; exc_info->exc_value = value; exc_info->exc_traceback = tb; #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = type; tstate->exc_value = value; tstate->exc_traceback = tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #endif } #endif /* GetException */ #if CYTHON_FAST_THREAD_STATE static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) #endif { PyObject *local_type = NULL, *local_value, *local_tb = NULL; #if CYTHON_FAST_THREAD_STATE PyObject *tmp_type, *tmp_value, *tmp_tb; #if PY_VERSION_HEX >= 0x030C00A6 local_value = tstate->current_exception; tstate->current_exception = 0; if (likely(local_value)) { local_type = (PyObject*) Py_TYPE(local_value); Py_INCREF(local_type); local_tb = PyException_GetTraceback(local_value); } #else local_type = tstate->curexc_type; local_value = tstate->curexc_value; local_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #endif #else PyErr_Fetch(&local_type, &local_value, &local_tb); #endif PyErr_NormalizeException(&local_type, &local_value, &local_tb); #if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6 if (unlikely(tstate->current_exception)) #elif CYTHON_FAST_THREAD_STATE if (unlikely(tstate->curexc_type)) #else if (unlikely(PyErr_Occurred())) #endif goto bad; #if PY_MAJOR_VERSION >= 3 if (local_tb) { if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) goto bad; } #endif Py_XINCREF(local_tb); Py_XINCREF(local_type); Py_XINCREF(local_value); *type = local_type; *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE #if CYTHON_USE_EXC_INFO_STACK { _PyErr_StackItem *exc_info = tstate->exc_info; #if PY_VERSION_HEX >= 0x030B00a4 tmp_value = exc_info->exc_value; exc_info->exc_value = local_value; tmp_type = NULL; tmp_tb = NULL; Py_XDECREF(local_type); Py_XDECREF(local_tb); #else tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = local_type; exc_info->exc_value = local_value; exc_info->exc_traceback = local_tb; #endif } #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = local_type; tstate->exc_value = local_value; tstate->exc_traceback = local_tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_SetExcInfo(local_type, local_value, local_tb); #endif return 0; bad: *type = 0; *value = 0; *tb = 0; Py_XDECREF(local_type); Py_XDECREF(local_value); Py_XDECREF(local_tb); return -1; } /* RaiseException */ #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { __Pyx_PyThreadState_declare CYTHON_UNUSED_VAR(cause); Py_XINCREF(type); if (!value || value == Py_None) value = NULL; else Py_INCREF(value); if (!tb || tb == Py_None) tb = NULL; else { Py_INCREF(tb); if (!PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } } if (PyType_Check(type)) { #if CYTHON_COMPILING_IN_PYPY if (!value) { Py_INCREF(Py_None); value = Py_None; } #endif PyErr_NormalizeException(&type, &value, &tb); } else { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } value = type; type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } } __Pyx_PyThreadState_assign __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { PyObject* owned_instance = NULL; if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (PyExceptionClass_Check(type)) { PyObject *instance_class = NULL; if (value && PyExceptionInstance_Check(value)) { instance_class = (PyObject*) Py_TYPE(value); if (instance_class != type) { int is_subclass = PyObject_IsSubclass(instance_class, type); if (!is_subclass) { instance_class = NULL; } else if (unlikely(is_subclass == -1)) { goto bad; } else { type = instance_class; } } } if (!instance_class) { PyObject *args; if (!value) args = PyTuple_New(0); else if (PyTuple_Check(value)) { Py_INCREF(value); args = value; } else args = PyTuple_Pack(1, value); if (!args) goto bad; owned_instance = PyObject_Call(type, args, NULL); Py_DECREF(args); if (!owned_instance) goto bad; value = owned_instance; if (!PyExceptionInstance_Check(value)) { PyErr_Format(PyExc_TypeError, "calling %R should have returned an instance of " "BaseException, not %R", type, Py_TYPE(value)); goto bad; } } } else { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } if (cause) { PyObject *fixed_cause; if (cause == Py_None) { fixed_cause = NULL; } else if (PyExceptionClass_Check(cause)) { fixed_cause = PyObject_CallObject(cause, NULL); if (fixed_cause == NULL) goto bad; } else if (PyExceptionInstance_Check(cause)) { fixed_cause = cause; Py_INCREF(fixed_cause); } else { PyErr_SetString(PyExc_TypeError, "exception causes must derive from " "BaseException"); goto bad; } PyException_SetCause(value, fixed_cause); } PyErr_SetObject(type, value); if (tb) { #if PY_VERSION_HEX >= 0x030C00A6 PyException_SetTraceback(value, tb); #elif CYTHON_FAST_THREAD_STATE PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } #else PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); Py_INCREF(tb); PyErr_Restore(tmp_type, tmp_value, tb); Py_XDECREF(tmp_tb); #endif } bad: Py_XDECREF(owned_instance); return; } #endif /* KeywordStringCheck */ static int __Pyx_CheckKeywordStrings( PyObject *kw, const char* function_name, int kw_allowed) { PyObject* key = 0; Py_ssize_t pos = 0; #if CYTHON_COMPILING_IN_PYPY if (!kw_allowed && PyDict_Next(kw, &pos, &key, 0)) goto invalid_keyword; return 1; #else if (CYTHON_METH_FASTCALL && likely(PyTuple_Check(kw))) { Py_ssize_t kwsize; #if CYTHON_ASSUME_SAFE_MACROS kwsize = PyTuple_GET_SIZE(kw); #else kwsize = PyTuple_Size(kw); if (kwsize < 0) return 0; #endif if (unlikely(kwsize == 0)) return 1; if (!kw_allowed) { #if CYTHON_ASSUME_SAFE_MACROS key = PyTuple_GET_ITEM(kw, 0); #else key = PyTuple_GetItem(kw, pos); if (!key) return 0; #endif goto invalid_keyword; } #if PY_VERSION_HEX < 0x03090000 for (pos = 0; pos < kwsize; pos++) { #if CYTHON_ASSUME_SAFE_MACROS key = PyTuple_GET_ITEM(kw, pos); #else key = PyTuple_GetItem(kw, pos); if (!key) return 0; #endif if (unlikely(!PyUnicode_Check(key))) goto invalid_keyword_type; } #endif return 1; } while (PyDict_Next(kw, &pos, &key, 0)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyString_Check(key))) #endif if (unlikely(!PyUnicode_Check(key))) goto invalid_keyword_type; } if (!kw_allowed && unlikely(key)) goto invalid_keyword; return 1; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); return 0; #endif invalid_keyword: #if PY_MAJOR_VERSION < 3 PyErr_Format(PyExc_TypeError, "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else PyErr_Format(PyExc_TypeError, "%s() got an unexpected keyword argument '%U'", function_name, key); #endif return 0; } /* GetAttr3 */ #if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 static PyObject *__Pyx_GetAttr3Default(PyObject *d) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) return NULL; __Pyx_PyErr_Clear(); Py_INCREF(d); return d; } #endif static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { PyObject *r; #if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 int res = PyObject_GetOptionalAttr(o, n, &r); return (res != 0) ? r : __Pyx_NewRef(d); #else #if CYTHON_USE_TYPE_SLOTS if (likely(PyString_Check(n))) { r = __Pyx_PyObject_GetAttrStrNoError(o, n); if (unlikely(!r) && likely(!PyErr_Occurred())) { r = __Pyx_NewRef(d); } return r; } #endif r = PyObject_GetAttr(o, n); return (likely(r)) ? r : __Pyx_GetAttr3Default(d); #endif } /* PyDictVersioning */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { PyObject *dict = Py_TYPE(obj)->tp_dict; return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; } static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { PyObject **dictptr = NULL; Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; if (offset) { #if CYTHON_COMPILING_IN_CPYTHON dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); #else dictptr = _PyObject_GetDictPtr(obj); #endif } return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; } static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { PyObject *dict = Py_TYPE(obj)->tp_dict; if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) return 0; return obj_dict_version == __Pyx_get_object_dict_version(obj); } #endif /* GetModuleGlobalName */ #if CYTHON_USE_DICT_VERSIONS static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) #else static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) #endif { PyObject *result; #if !CYTHON_AVOID_BORROWED_REFS #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && PY_VERSION_HEX < 0x030d0000 result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } else if (unlikely(PyErr_Occurred())) { return NULL; } #elif CYTHON_COMPILING_IN_LIMITED_API if (unlikely(!__pyx_m)) { return NULL; } result = PyObject_GetAttr(__pyx_m, name); if (likely(result)) { return result; } #else result = PyDict_GetItem(__pyx_d, name); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } #endif #else result = PyObject_GetItem(__pyx_d, name); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } PyErr_Clear(); #endif return __Pyx_GetBuiltinName(name); } /* RaiseUnexpectedTypeError */ static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj) { __Pyx_TypeName obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); PyErr_Format(PyExc_TypeError, "Expected %s, got " __Pyx_FMT_TYPENAME, expected, obj_type_name); __Pyx_DECREF_TypeName(obj_type_name); return 0; } /* Import */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { PyObject *module = 0; PyObject *empty_dict = 0; PyObject *empty_list = 0; #if PY_MAJOR_VERSION < 3 PyObject *py_import; py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); if (unlikely(!py_import)) goto bad; if (!from_list) { empty_list = PyList_New(0); if (unlikely(!empty_list)) goto bad; from_list = empty_list; } #endif empty_dict = PyDict_New(); if (unlikely(!empty_dict)) goto bad; { #if PY_MAJOR_VERSION >= 3 if (level == -1) { if (strchr(__Pyx_MODULE_NAME, '.') != NULL) { module = PyImport_ImportModuleLevelObject( name, __pyx_d, empty_dict, from_list, 1); if (unlikely(!module)) { if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError))) goto bad; PyErr_Clear(); } } level = 0; } #endif if (!module) { #if PY_MAJOR_VERSION < 3 PyObject *py_level = PyInt_FromLong(level); if (unlikely(!py_level)) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL); Py_DECREF(py_level); #else module = PyImport_ImportModuleLevelObject( name, __pyx_d, empty_dict, from_list, level); #endif } } bad: Py_XDECREF(empty_dict); Py_XDECREF(empty_list); #if PY_MAJOR_VERSION < 3 Py_XDECREF(py_import); #endif return module; } /* ImportFrom */ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { const char* module_name_str = 0; PyObject* module_name = 0; PyObject* module_dot = 0; PyObject* full_name = 0; PyErr_Clear(); module_name_str = PyModule_GetName(module); if (unlikely(!module_name_str)) { goto modbad; } module_name = PyUnicode_FromString(module_name_str); if (unlikely(!module_name)) { goto modbad; } module_dot = PyUnicode_Concat(module_name, __pyx_kp_u__3); if (unlikely(!module_dot)) { goto modbad; } full_name = PyUnicode_Concat(module_dot, name); if (unlikely(!full_name)) { goto modbad; } #if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) goto modbad; value = PyObject_GetItem(modules, full_name); } #else value = PyImport_GetModule(full_name); #endif modbad: Py_XDECREF(full_name); Py_XDECREF(module_dot); Py_XDECREF(module_name); } if (unlikely(!value)) { PyErr_Format(PyExc_ImportError, #if PY_MAJOR_VERSION < 3 "cannot import name %.230s", PyString_AS_STRING(name)); #else "cannot import name %S", name); #endif } return value; } /* GetAttr */ static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { #if CYTHON_USE_TYPE_SLOTS #if PY_MAJOR_VERSION >= 3 if (likely(PyUnicode_Check(n))) #else if (likely(PyString_Check(n))) #endif return __Pyx_PyObject_GetAttrStr(o, n); #endif return PyObject_GetAttr(o, n); } /* HasAttr */ #if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { PyObject *r; if (unlikely(!__Pyx_PyBaseString_Check(n))) { PyErr_SetString(PyExc_TypeError, "hasattr(): attribute name must be string"); return -1; } r = __Pyx_GetAttr(o, n); if (!r) { PyErr_Clear(); return 0; } else { Py_DECREF(r); return 1; } } #endif /* FixUpExtensionType */ #if CYTHON_USE_TYPE_SPECS static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { #if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API CYTHON_UNUSED_VAR(spec); CYTHON_UNUSED_VAR(type); #else const PyType_Slot *slot = spec->slots; while (slot && slot->slot && slot->slot != Py_tp_members) slot++; if (slot && slot->slot == Py_tp_members) { int changed = 0; #if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) const #endif PyMemberDef *memb = (PyMemberDef*) slot->pfunc; while (memb && memb->name) { if (memb->name[0] == '_' && memb->name[1] == '_') { #if PY_VERSION_HEX < 0x030900b1 if (strcmp(memb->name, "__weaklistoffset__") == 0) { assert(memb->type == T_PYSSIZET); assert(memb->flags == READONLY); type->tp_weaklistoffset = memb->offset; changed = 1; } else if (strcmp(memb->name, "__dictoffset__") == 0) { assert(memb->type == T_PYSSIZET); assert(memb->flags == READONLY); type->tp_dictoffset = memb->offset; changed = 1; } #if CYTHON_METH_FASTCALL else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { assert(memb->type == T_PYSSIZET); assert(memb->flags == READONLY); #if PY_VERSION_HEX >= 0x030800b4 type->tp_vectorcall_offset = memb->offset; #else type->tp_print = (printfunc) memb->offset; #endif changed = 1; } #endif #else if ((0)); #endif #if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON else if (strcmp(memb->name, "__module__") == 0) { PyObject *descr; assert(memb->type == T_OBJECT); assert(memb->flags == 0 || memb->flags == READONLY); descr = PyDescr_NewMember(type, memb); if (unlikely(!descr)) return -1; if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { Py_DECREF(descr); return -1; } Py_DECREF(descr); changed = 1; } #endif } memb++; } if (changed) PyType_Modified(type); } #endif return 0; } #endif /* PyObjectCallNoArg */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { PyObject *arg[2] = {NULL, NULL}; return __Pyx_PyObject_FastCall(func, arg + 1, 0 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); } /* PyObjectGetMethod */ static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { PyObject *attr; #if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP __Pyx_TypeName type_name; PyTypeObject *tp = Py_TYPE(obj); PyObject *descr; descrgetfunc f = NULL; PyObject **dictptr, *dict; int meth_found = 0; assert (*method == NULL); if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { attr = __Pyx_PyObject_GetAttrStr(obj, name); goto try_unpack; } if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { return 0; } descr = _PyType_Lookup(tp, name); if (likely(descr != NULL)) { Py_INCREF(descr); #if defined(Py_TPFLAGS_METHOD_DESCRIPTOR) && Py_TPFLAGS_METHOD_DESCRIPTOR if (__Pyx_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) #elif PY_MAJOR_VERSION >= 3 #ifdef __Pyx_CyFunction_USED if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) #else if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type))) #endif #else #ifdef __Pyx_CyFunction_USED if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) #else if (likely(PyFunction_Check(descr))) #endif #endif { meth_found = 1; } else { f = Py_TYPE(descr)->tp_descr_get; if (f != NULL && PyDescr_IsData(descr)) { attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); goto try_unpack; } } } dictptr = _PyObject_GetDictPtr(obj); if (dictptr != NULL && (dict = *dictptr) != NULL) { Py_INCREF(dict); attr = __Pyx_PyDict_GetItemStr(dict, name); if (attr != NULL) { Py_INCREF(attr); Py_DECREF(dict); Py_XDECREF(descr); goto try_unpack; } Py_DECREF(dict); } if (meth_found) { *method = descr; return 1; } if (f != NULL) { attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); goto try_unpack; } if (likely(descr != NULL)) { *method = descr; return 0; } type_name = __Pyx_PyType_GetName(tp); PyErr_Format(PyExc_AttributeError, #if PY_MAJOR_VERSION >= 3 "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", type_name, name); #else "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", type_name, PyString_AS_STRING(name)); #endif __Pyx_DECREF_TypeName(type_name); return 0; #else attr = __Pyx_PyObject_GetAttrStr(obj, name); goto try_unpack; #endif try_unpack: #if CYTHON_UNPACK_METHODS if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { PyObject *function = PyMethod_GET_FUNCTION(attr); Py_INCREF(function); Py_DECREF(attr); *method = function; return 1; } #endif *method = attr; return 0; } /* PyObjectCallMethod0 */ static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) { PyObject *method = NULL, *result = NULL; int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); if (likely(is_method)) { result = __Pyx_PyObject_CallOneArg(method, obj); Py_DECREF(method); return result; } if (unlikely(!method)) goto bad; result = __Pyx_PyObject_CallNoArg(method); Py_DECREF(method); bad: return result; } /* ValidateBasesTuple */ #if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases) { Py_ssize_t i, n; #if CYTHON_ASSUME_SAFE_MACROS n = PyTuple_GET_SIZE(bases); #else n = PyTuple_Size(bases); if (n < 0) return -1; #endif for (i = 1; i < n; i++) { #if CYTHON_AVOID_BORROWED_REFS PyObject *b0 = PySequence_GetItem(bases, i); if (!b0) return -1; #elif CYTHON_ASSUME_SAFE_MACROS PyObject *b0 = PyTuple_GET_ITEM(bases, i); #else PyObject *b0 = PyTuple_GetItem(bases, i); if (!b0) return -1; #endif PyTypeObject *b; #if PY_MAJOR_VERSION < 3 if (PyClass_Check(b0)) { PyErr_Format(PyExc_TypeError, "base class '%.200s' is an old-style class", PyString_AS_STRING(((PyClassObject*)b0)->cl_name)); #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(b0); #endif return -1; } #endif b = (PyTypeObject*) b0; if (!__Pyx_PyType_HasFeature(b, Py_TPFLAGS_HEAPTYPE)) { __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); PyErr_Format(PyExc_TypeError, "base class '" __Pyx_FMT_TYPENAME "' is not a heap type", b_name); __Pyx_DECREF_TypeName(b_name); #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(b0); #endif return -1; } #if !CYTHON_USE_TYPE_SLOTS if (dictoffset == 0) { PyErr_Format(PyExc_TypeError, "extension type '%s.200s': " "unable to validate whether bases have a __dict__ " "when CYTHON_USE_TYPE_SLOTS is off " "(likely because you are building in the limited API). " "Therefore, all extension types with multiple bases " "must add 'cdef dict __dict__' in this compilation mode", type_name); #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(b0); #endif return -1; } #else if (dictoffset == 0 && b->tp_dictoffset) { __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); PyErr_Format(PyExc_TypeError, "extension type '%.200s' has no __dict__ slot, " "but base type '" __Pyx_FMT_TYPENAME "' has: " "either add 'cdef dict __dict__' to the extension type " "or add '__slots__ = [...]' to the base type", type_name, b_name); __Pyx_DECREF_TypeName(b_name); #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(b0); #endif return -1; } #endif #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(b0); #endif } return 0; } #endif /* PyType_Ready */ static int __Pyx_PyType_Ready(PyTypeObject *t) { #if CYTHON_USE_TYPE_SPECS || !(CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API) || defined(PYSTON_MAJOR_VERSION) (void)__Pyx_PyObject_CallMethod0; #if CYTHON_USE_TYPE_SPECS (void)__Pyx_validate_bases_tuple; #endif return PyType_Ready(t); #else int r; PyObject *bases = __Pyx_PyType_GetSlot(t, tp_bases, PyObject*); if (bases && unlikely(__Pyx_validate_bases_tuple(t->tp_name, t->tp_dictoffset, bases) == -1)) return -1; #if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) { int gc_was_enabled; #if PY_VERSION_HEX >= 0x030A00b1 gc_was_enabled = PyGC_Disable(); (void)__Pyx_PyObject_CallMethod0; #else PyObject *ret, *py_status; PyObject *gc = NULL; #if PY_VERSION_HEX >= 0x030700a1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM+0 >= 0x07030400) gc = PyImport_GetModule(__pyx_kp_u_gc); #endif if (unlikely(!gc)) gc = PyImport_Import(__pyx_kp_u_gc); if (unlikely(!gc)) return -1; py_status = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_isenabled); if (unlikely(!py_status)) { Py_DECREF(gc); return -1; } gc_was_enabled = __Pyx_PyObject_IsTrue(py_status); Py_DECREF(py_status); if (gc_was_enabled > 0) { ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_disable); if (unlikely(!ret)) { Py_DECREF(gc); return -1; } Py_DECREF(ret); } else if (unlikely(gc_was_enabled == -1)) { Py_DECREF(gc); return -1; } #endif t->tp_flags |= Py_TPFLAGS_HEAPTYPE; #if PY_VERSION_HEX >= 0x030A0000 t->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE; #endif #else (void)__Pyx_PyObject_CallMethod0; #endif r = PyType_Ready(t); #if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) t->tp_flags &= ~Py_TPFLAGS_HEAPTYPE; #if PY_VERSION_HEX >= 0x030A00b1 if (gc_was_enabled) PyGC_Enable(); #else if (gc_was_enabled) { PyObject *tp, *v, *tb; PyErr_Fetch(&tp, &v, &tb); ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_enable); if (likely(ret || r == -1)) { Py_XDECREF(ret); PyErr_Restore(tp, v, tb); } else { Py_XDECREF(tp); Py_XDECREF(v); Py_XDECREF(tb); r = -1; } } Py_DECREF(gc); #endif } #endif return r; #endif } /* PyObject_GenericGetAttrNoDict */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { __Pyx_TypeName type_name = __Pyx_PyType_GetName(tp); PyErr_Format(PyExc_AttributeError, #if PY_MAJOR_VERSION >= 3 "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", type_name, attr_name); #else "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", type_name, PyString_AS_STRING(attr_name)); #endif __Pyx_DECREF_TypeName(type_name); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { PyObject *descr; PyTypeObject *tp = Py_TYPE(obj); if (unlikely(!PyString_Check(attr_name))) { return PyObject_GenericGetAttr(obj, attr_name); } assert(!tp->tp_dictoffset); descr = _PyType_Lookup(tp, attr_name); if (unlikely(!descr)) { return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); } Py_INCREF(descr); #if PY_MAJOR_VERSION < 3 if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) #endif { descrgetfunc f = Py_TYPE(descr)->tp_descr_get; if (unlikely(f)) { PyObject *res = f(descr, obj, (PyObject *)tp); Py_DECREF(descr); return res; } } return descr; } #endif /* PyObject_GenericGetAttr */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { return PyObject_GenericGetAttr(obj, attr_name); } return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); } #endif /* SetupReduce */ #if !CYTHON_COMPILING_IN_LIMITED_API static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { int ret; PyObject *name_attr; name_attr = __Pyx_PyObject_GetAttrStrNoError(meth, __pyx_n_s_name); if (likely(name_attr)) { ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); } else { ret = -1; } if (unlikely(ret < 0)) { PyErr_Clear(); ret = 0; } Py_XDECREF(name_attr); return ret; } static int __Pyx_setup_reduce(PyObject* type_obj) { int ret = 0; PyObject *object_reduce = NULL; PyObject *object_getstate = NULL; PyObject *object_reduce_ex = NULL; PyObject *reduce = NULL; PyObject *reduce_ex = NULL; PyObject *reduce_cython = NULL; PyObject *setstate = NULL; PyObject *setstate_cython = NULL; PyObject *getstate = NULL; #if CYTHON_USE_PYTYPE_LOOKUP getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); #else getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); if (!getstate && PyErr_Occurred()) { goto __PYX_BAD; } #endif if (getstate) { #if CYTHON_USE_PYTYPE_LOOKUP object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); #else object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); if (!object_getstate && PyErr_Occurred()) { goto __PYX_BAD; } #endif if (object_getstate != getstate) { goto __PYX_GOOD; } } #if CYTHON_USE_PYTYPE_LOOKUP object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; #else object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; #endif reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; if (reduce_ex == object_reduce_ex) { #if CYTHON_USE_PYTYPE_LOOKUP object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; #else object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; #endif reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); if (likely(reduce_cython)) { ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; } else if (reduce == object_reduce || PyErr_Occurred()) { goto __PYX_BAD; } setstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate); if (!setstate) PyErr_Clear(); if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); if (likely(setstate_cython)) { ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; } else if (!setstate || PyErr_Occurred()) { goto __PYX_BAD; } } PyType_Modified((PyTypeObject*)type_obj); } } goto __PYX_GOOD; __PYX_BAD: if (!PyErr_Occurred()) { __Pyx_TypeName type_obj_name = __Pyx_PyType_GetName((PyTypeObject*)type_obj); PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for " __Pyx_FMT_TYPENAME, type_obj_name); __Pyx_DECREF_TypeName(type_obj_name); } ret = -1; __PYX_GOOD: #if !CYTHON_USE_PYTYPE_LOOKUP Py_XDECREF(object_reduce); Py_XDECREF(object_reduce_ex); Py_XDECREF(object_getstate); Py_XDECREF(getstate); #endif Py_XDECREF(reduce); Py_XDECREF(reduce_ex); Py_XDECREF(reduce_cython); Py_XDECREF(setstate); Py_XDECREF(setstate_cython); return ret; } #endif /* FetchSharedCythonModule */ static PyObject *__Pyx_FetchSharedCythonABIModule(void) { return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); } /* FetchCommonType */ static int __Pyx_VerifyCachedType(PyObject *cached_type, const char *name, Py_ssize_t basicsize, Py_ssize_t expected_basicsize) { if (!PyType_Check(cached_type)) { PyErr_Format(PyExc_TypeError, "Shared Cython type %.200s is not a type object", name); return -1; } if (basicsize != expected_basicsize) { PyErr_Format(PyExc_TypeError, "Shared Cython type %.200s has the wrong size, try recompiling", name); return -1; } return 0; } #if !CYTHON_USE_TYPE_SPECS static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { PyObject* abi_module; const char* object_name; PyTypeObject *cached_type = NULL; abi_module = __Pyx_FetchSharedCythonABIModule(); if (!abi_module) return NULL; object_name = strrchr(type->tp_name, '.'); object_name = object_name ? object_name+1 : type->tp_name; cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); if (cached_type) { if (__Pyx_VerifyCachedType( (PyObject *)cached_type, object_name, cached_type->tp_basicsize, type->tp_basicsize) < 0) { goto bad; } goto done; } if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; PyErr_Clear(); if (PyType_Ready(type) < 0) goto bad; if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) goto bad; Py_INCREF(type); cached_type = type; done: Py_DECREF(abi_module); return cached_type; bad: Py_XDECREF(cached_type); cached_type = NULL; goto done; } #else static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { PyObject *abi_module, *cached_type = NULL; const char* object_name = strrchr(spec->name, '.'); object_name = object_name ? object_name+1 : spec->name; abi_module = __Pyx_FetchSharedCythonABIModule(); if (!abi_module) return NULL; cached_type = PyObject_GetAttrString(abi_module, object_name); if (cached_type) { Py_ssize_t basicsize; #if CYTHON_COMPILING_IN_LIMITED_API PyObject *py_basicsize; py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); if (unlikely(!py_basicsize)) goto bad; basicsize = PyLong_AsSsize_t(py_basicsize); Py_DECREF(py_basicsize); py_basicsize = 0; if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; #else basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; #endif if (__Pyx_VerifyCachedType( cached_type, object_name, basicsize, spec->basicsize) < 0) { goto bad; } goto done; } if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; PyErr_Clear(); CYTHON_UNUSED_VAR(module); cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); if (unlikely(!cached_type)) goto bad; if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; done: Py_DECREF(abi_module); assert(cached_type == NULL || PyType_Check(cached_type)); return (PyTypeObject *) cached_type; bad: Py_XDECREF(cached_type); cached_type = NULL; goto done; } #endif /* PyVectorcallFastCallDict */ #if CYTHON_METH_FASTCALL static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) { PyObject *res = NULL; PyObject *kwnames; PyObject **newargs; PyObject **kwvalues; Py_ssize_t i, pos; size_t j; PyObject *key, *value; unsigned long keys_are_strings; Py_ssize_t nkw = PyDict_GET_SIZE(kw); newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); if (unlikely(newargs == NULL)) { PyErr_NoMemory(); return NULL; } for (j = 0; j < nargs; j++) newargs[j] = args[j]; kwnames = PyTuple_New(nkw); if (unlikely(kwnames == NULL)) { PyMem_Free(newargs); return NULL; } kwvalues = newargs + nargs; pos = i = 0; keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; while (PyDict_Next(kw, &pos, &key, &value)) { keys_are_strings &= Py_TYPE(key)->tp_flags; Py_INCREF(key); Py_INCREF(value); PyTuple_SET_ITEM(kwnames, i, key); kwvalues[i] = value; i++; } if (unlikely(!keys_are_strings)) { PyErr_SetString(PyExc_TypeError, "keywords must be strings"); goto cleanup; } res = vc(func, newargs, nargs, kwnames); cleanup: Py_DECREF(kwnames); for (i = 0; i < nkw; i++) Py_DECREF(kwvalues[i]); PyMem_Free(newargs); return res; } static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) { if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { return vc(func, args, nargs, NULL); } return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); } #endif /* CythonFunctionShared */ #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { if (__Pyx_CyFunction_Check(func)) { return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; } else if (PyCFunction_Check(func)) { return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; } return 0; } #else static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; } #endif static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API __Pyx_Py_XDECREF_SET( __Pyx_CyFunction_GetClassObj(f), ((classobj) ? __Pyx_NewRef(classobj) : NULL)); #else __Pyx_Py_XDECREF_SET( ((PyCMethodObject *) (f))->mm_class, (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); #endif } static PyObject * __Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) { CYTHON_UNUSED_VAR(closure); if (unlikely(op->func_doc == NULL)) { #if CYTHON_COMPILING_IN_LIMITED_API op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); if (unlikely(!op->func_doc)) return NULL; #else if (((PyCFunctionObject*)op)->m_ml->ml_doc) { #if PY_MAJOR_VERSION >= 3 op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); #else op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); #endif if (unlikely(op->func_doc == NULL)) return NULL; } else { Py_INCREF(Py_None); return Py_None; } #endif } Py_INCREF(op->func_doc); return op->func_doc; } static int __Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); if (value == NULL) { value = Py_None; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_doc, value); return 0; } static PyObject * __Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); if (unlikely(op->func_name == NULL)) { #if CYTHON_COMPILING_IN_LIMITED_API op->func_name = PyObject_GetAttrString(op->func, "__name__"); #elif PY_MAJOR_VERSION >= 3 op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); #else op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); #endif if (unlikely(op->func_name == NULL)) return NULL; } Py_INCREF(op->func_name); return op->func_name; } static int __Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); #if PY_MAJOR_VERSION >= 3 if (unlikely(value == NULL || !PyUnicode_Check(value))) #else if (unlikely(value == NULL || !PyString_Check(value))) #endif { PyErr_SetString(PyExc_TypeError, "__name__ must be set to a string object"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_name, value); return 0; } static PyObject * __Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); Py_INCREF(op->func_qualname); return op->func_qualname; } static int __Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); #if PY_MAJOR_VERSION >= 3 if (unlikely(value == NULL || !PyUnicode_Check(value))) #else if (unlikely(value == NULL || !PyString_Check(value))) #endif { PyErr_SetString(PyExc_TypeError, "__qualname__ must be set to a string object"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_qualname, value); return 0; } static PyObject * __Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); if (unlikely(op->func_dict == NULL)) { op->func_dict = PyDict_New(); if (unlikely(op->func_dict == NULL)) return NULL; } Py_INCREF(op->func_dict); return op->func_dict; } static int __Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); if (unlikely(value == NULL)) { PyErr_SetString(PyExc_TypeError, "function's dictionary may not be deleted"); return -1; } if (unlikely(!PyDict_Check(value))) { PyErr_SetString(PyExc_TypeError, "setting function's dictionary to a non-dict"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_dict, value); return 0; } static PyObject * __Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); Py_INCREF(op->func_globals); return op->func_globals; } static PyObject * __Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(op); CYTHON_UNUSED_VAR(context); Py_INCREF(Py_None); return Py_None; } static PyObject * __Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) { PyObject* result = (op->func_code) ? op->func_code : Py_None; CYTHON_UNUSED_VAR(context); Py_INCREF(result); return result; } static int __Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { int result = 0; PyObject *res = op->defaults_getter((PyObject *) op); if (unlikely(!res)) return -1; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS op->defaults_tuple = PyTuple_GET_ITEM(res, 0); Py_INCREF(op->defaults_tuple); op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); Py_INCREF(op->defaults_kwdict); #else op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); if (unlikely(!op->defaults_tuple)) result = -1; else { op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); if (unlikely(!op->defaults_kwdict)) result = -1; } #endif Py_DECREF(res); return result; } static int __Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); if (!value) { value = Py_None; } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { PyErr_SetString(PyExc_TypeError, "__defaults__ must be set to a tuple object"); return -1; } PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " "currently affect the values used in function calls", 1); Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); return 0; } static PyObject * __Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { PyObject* result = op->defaults_tuple; CYTHON_UNUSED_VAR(context); if (unlikely(!result)) { if (op->defaults_getter) { if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; result = op->defaults_tuple; } else { result = Py_None; } } Py_INCREF(result); return result; } static int __Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); if (!value) { value = Py_None; } else if (unlikely(value != Py_None && !PyDict_Check(value))) { PyErr_SetString(PyExc_TypeError, "__kwdefaults__ must be set to a dict object"); return -1; } PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " "currently affect the values used in function calls", 1); Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); return 0; } static PyObject * __Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { PyObject* result = op->defaults_kwdict; CYTHON_UNUSED_VAR(context); if (unlikely(!result)) { if (op->defaults_getter) { if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; result = op->defaults_kwdict; } else { result = Py_None; } } Py_INCREF(result); return result; } static int __Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); if (!value || value == Py_None) { value = NULL; } else if (unlikely(!PyDict_Check(value))) { PyErr_SetString(PyExc_TypeError, "__annotations__ must be set to a dict object"); return -1; } Py_XINCREF(value); __Pyx_Py_XDECREF_SET(op->func_annotations, value); return 0; } static PyObject * __Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { PyObject* result = op->func_annotations; CYTHON_UNUSED_VAR(context); if (unlikely(!result)) { result = PyDict_New(); if (unlikely(!result)) return NULL; op->func_annotations = result; } Py_INCREF(result); return result; } static PyObject * __Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { int is_coroutine; CYTHON_UNUSED_VAR(context); if (op->func_is_coroutine) { return __Pyx_NewRef(op->func_is_coroutine); } is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; #if PY_VERSION_HEX >= 0x03050000 if (is_coroutine) { PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; fromlist = PyList_New(1); if (unlikely(!fromlist)) return NULL; Py_INCREF(marker); #if CYTHON_ASSUME_SAFE_MACROS PyList_SET_ITEM(fromlist, 0, marker); #else if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { Py_DECREF(marker); Py_DECREF(fromlist); return NULL; } #endif module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); Py_DECREF(fromlist); if (unlikely(!module)) goto ignore; op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); Py_DECREF(module); if (likely(op->func_is_coroutine)) { return __Pyx_NewRef(op->func_is_coroutine); } ignore: PyErr_Clear(); } #endif op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); return __Pyx_NewRef(op->func_is_coroutine); } #if CYTHON_COMPILING_IN_LIMITED_API static PyObject * __Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); return PyObject_GetAttrString(op->func, "__module__"); } static int __Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); return PyObject_SetAttrString(op->func, "__module__", value); } #endif static PyGetSetDef __pyx_CyFunction_getsets[] = { {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, #if CYTHON_COMPILING_IN_LIMITED_API {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, #endif {0, 0, 0, 0, 0} }; static PyMemberDef __pyx_CyFunction_members[] = { #if !CYTHON_COMPILING_IN_LIMITED_API {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, #endif #if CYTHON_USE_TYPE_SPECS {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, #if CYTHON_METH_FASTCALL #if CYTHON_BACKPORT_VECTORCALL {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, #else #if !CYTHON_COMPILING_IN_LIMITED_API {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, #endif #endif #endif #if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, #else {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, #endif #endif {0, 0, 0, 0, 0} }; static PyObject * __Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) { CYTHON_UNUSED_VAR(args); #if PY_MAJOR_VERSION >= 3 Py_INCREF(m->func_qualname); return m->func_qualname; #else return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); #endif } static PyMethodDef __pyx_CyFunction_methods[] = { {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, {0, 0, 0, 0} }; #if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) #else #define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) #endif static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { #if !CYTHON_COMPILING_IN_LIMITED_API PyCFunctionObject *cf = (PyCFunctionObject*) op; #endif if (unlikely(op == NULL)) return NULL; #if CYTHON_COMPILING_IN_LIMITED_API op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); if (unlikely(!op->func)) return NULL; #endif op->flags = flags; __Pyx_CyFunction_weakreflist(op) = NULL; #if !CYTHON_COMPILING_IN_LIMITED_API cf->m_ml = ml; cf->m_self = (PyObject *) op; #endif Py_XINCREF(closure); op->func_closure = closure; #if !CYTHON_COMPILING_IN_LIMITED_API Py_XINCREF(module); cf->m_module = module; #endif op->func_dict = NULL; op->func_name = NULL; Py_INCREF(qualname); op->func_qualname = qualname; op->func_doc = NULL; #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API op->func_classobj = NULL; #else ((PyCMethodObject*)op)->mm_class = NULL; #endif op->func_globals = globals; Py_INCREF(op->func_globals); Py_XINCREF(code); op->func_code = code; op->defaults_pyobjects = 0; op->defaults_size = 0; op->defaults = NULL; op->defaults_tuple = NULL; op->defaults_kwdict = NULL; op->defaults_getter = NULL; op->func_annotations = NULL; op->func_is_coroutine = NULL; #if CYTHON_METH_FASTCALL switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { case METH_NOARGS: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; break; case METH_O: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; break; case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; break; case METH_FASTCALL | METH_KEYWORDS: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; break; case METH_VARARGS | METH_KEYWORDS: __Pyx_CyFunction_func_vectorcall(op) = NULL; break; default: PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); Py_DECREF(op); return NULL; } #endif return (PyObject *) op; } static int __Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) { Py_CLEAR(m->func_closure); #if CYTHON_COMPILING_IN_LIMITED_API Py_CLEAR(m->func); #else Py_CLEAR(((PyCFunctionObject*)m)->m_module); #endif Py_CLEAR(m->func_dict); Py_CLEAR(m->func_name); Py_CLEAR(m->func_qualname); Py_CLEAR(m->func_doc); Py_CLEAR(m->func_globals); Py_CLEAR(m->func_code); #if !CYTHON_COMPILING_IN_LIMITED_API #if PY_VERSION_HEX < 0x030900B1 Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); #else { PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; ((PyCMethodObject *) (m))->mm_class = NULL; Py_XDECREF(cls); } #endif #endif Py_CLEAR(m->defaults_tuple); Py_CLEAR(m->defaults_kwdict); Py_CLEAR(m->func_annotations); Py_CLEAR(m->func_is_coroutine); if (m->defaults) { PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); int i; for (i = 0; i < m->defaults_pyobjects; i++) Py_XDECREF(pydefaults[i]); PyObject_Free(m->defaults); m->defaults = NULL; } return 0; } static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) { if (__Pyx_CyFunction_weakreflist(m) != NULL) PyObject_ClearWeakRefs((PyObject *) m); __Pyx_CyFunction_clear(m); __Pyx_PyHeapTypeObject_GC_Del(m); } static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) { PyObject_GC_UnTrack(m); __Pyx__CyFunction_dealloc(m); } static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) { Py_VISIT(m->func_closure); #if CYTHON_COMPILING_IN_LIMITED_API Py_VISIT(m->func); #else Py_VISIT(((PyCFunctionObject*)m)->m_module); #endif Py_VISIT(m->func_dict); Py_VISIT(m->func_name); Py_VISIT(m->func_qualname); Py_VISIT(m->func_doc); Py_VISIT(m->func_globals); Py_VISIT(m->func_code); #if !CYTHON_COMPILING_IN_LIMITED_API Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); #endif Py_VISIT(m->defaults_tuple); Py_VISIT(m->defaults_kwdict); Py_VISIT(m->func_is_coroutine); if (m->defaults) { PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); int i; for (i = 0; i < m->defaults_pyobjects; i++) Py_VISIT(pydefaults[i]); } return 0; } static PyObject* __Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) { #if PY_MAJOR_VERSION >= 3 return PyUnicode_FromFormat("", op->func_qualname, (void *)op); #else return PyString_FromFormat("", PyString_AsString(op->func_qualname), (void *)op); #endif } static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { #if CYTHON_COMPILING_IN_LIMITED_API PyObject *f = ((__pyx_CyFunctionObject*)func)->func; PyObject *py_name = NULL; PyCFunction meth; int flags; meth = PyCFunction_GetFunction(f); if (unlikely(!meth)) return NULL; flags = PyCFunction_GetFlags(f); if (unlikely(flags < 0)) return NULL; #else PyCFunctionObject* f = (PyCFunctionObject*)func; PyCFunction meth = f->m_ml->ml_meth; int flags = f->m_ml->ml_flags; #endif Py_ssize_t size; switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { case METH_VARARGS: if (likely(kw == NULL || PyDict_Size(kw) == 0)) return (*meth)(self, arg); break; case METH_VARARGS | METH_KEYWORDS: return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); case METH_NOARGS: if (likely(kw == NULL || PyDict_Size(kw) == 0)) { #if CYTHON_ASSUME_SAFE_MACROS size = PyTuple_GET_SIZE(arg); #else size = PyTuple_Size(arg); if (unlikely(size < 0)) return NULL; #endif if (likely(size == 0)) return (*meth)(self, NULL); #if CYTHON_COMPILING_IN_LIMITED_API py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); if (!py_name) return NULL; PyErr_Format(PyExc_TypeError, "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", py_name, size); Py_DECREF(py_name); #else PyErr_Format(PyExc_TypeError, "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", f->m_ml->ml_name, size); #endif return NULL; } break; case METH_O: if (likely(kw == NULL || PyDict_Size(kw) == 0)) { #if CYTHON_ASSUME_SAFE_MACROS size = PyTuple_GET_SIZE(arg); #else size = PyTuple_Size(arg); if (unlikely(size < 0)) return NULL; #endif if (likely(size == 1)) { PyObject *result, *arg0; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS arg0 = PyTuple_GET_ITEM(arg, 0); #else arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; #endif result = (*meth)(self, arg0); #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) Py_DECREF(arg0); #endif return result; } #if CYTHON_COMPILING_IN_LIMITED_API py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); if (!py_name) return NULL; PyErr_Format(PyExc_TypeError, "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", py_name, size); Py_DECREF(py_name); #else PyErr_Format(PyExc_TypeError, "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", f->m_ml->ml_name, size); #endif return NULL; } break; default: PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); return NULL; } #if CYTHON_COMPILING_IN_LIMITED_API py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); if (!py_name) return NULL; PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", py_name); Py_DECREF(py_name); #else PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", f->m_ml->ml_name); #endif return NULL; } static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *self, *result; #if CYTHON_COMPILING_IN_LIMITED_API self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); if (unlikely(!self) && PyErr_Occurred()) return NULL; #else self = ((PyCFunctionObject*)func)->m_self; #endif result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); return result; } static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { PyObject *result; __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; #if CYTHON_METH_FASTCALL __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); if (vc) { #if CYTHON_ASSUME_SAFE_MACROS return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); #else (void) &__Pyx_PyVectorcall_FastCallDict; return PyVectorcall_Call(func, args, kw); #endif } #endif if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { Py_ssize_t argc; PyObject *new_args; PyObject *self; #if CYTHON_ASSUME_SAFE_MACROS argc = PyTuple_GET_SIZE(args); #else argc = PyTuple_Size(args); if (unlikely(!argc) < 0) return NULL; #endif new_args = PyTuple_GetSlice(args, 1, argc); if (unlikely(!new_args)) return NULL; self = PyTuple_GetItem(args, 0); if (unlikely(!self)) { Py_DECREF(new_args); #if PY_MAJOR_VERSION > 2 PyErr_Format(PyExc_TypeError, "unbound method %.200S() needs an argument", cyfunc->func_qualname); #else PyErr_SetString(PyExc_TypeError, "unbound method needs an argument"); #endif return NULL; } result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); Py_DECREF(new_args); } else { result = __Pyx_CyFunction_Call(func, args, kw); } return result; } #if CYTHON_METH_FASTCALL static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) { int ret = 0; if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { if (unlikely(nargs < 1)) { PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); return -1; } ret = 1; } if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); return -1; } return ret; } static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } if (unlikely(nargs != 0)) { PyErr_Format(PyExc_TypeError, "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", def->ml_name, nargs); return NULL; } return def->ml_meth(self, NULL); } static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } if (unlikely(nargs != 1)) { PyErr_Format(PyExc_TypeError, "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", def->ml_name, nargs); return NULL; } return def->ml_meth(self, args[0]); } static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); } static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); } #endif #if CYTHON_USE_TYPE_SPECS static PyType_Slot __pyx_CyFunctionType_slots[] = { {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, {Py_tp_methods, (void *)__pyx_CyFunction_methods}, {Py_tp_members, (void *)__pyx_CyFunction_members}, {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, {0, 0}, }; static PyType_Spec __pyx_CyFunctionType_spec = { __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", sizeof(__pyx_CyFunctionObject), 0, #ifdef Py_TPFLAGS_METHOD_DESCRIPTOR Py_TPFLAGS_METHOD_DESCRIPTOR | #endif #if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) _Py_TPFLAGS_HAVE_VECTORCALL | #endif Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, __pyx_CyFunctionType_slots }; #else static PyTypeObject __pyx_CyFunctionType_type = { PyVarObject_HEAD_INIT(0, 0) __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", sizeof(__pyx_CyFunctionObject), 0, (destructor) __Pyx_CyFunction_dealloc, #if !CYTHON_METH_FASTCALL 0, #elif CYTHON_BACKPORT_VECTORCALL (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), #else offsetof(PyCFunctionObject, vectorcall), #endif 0, 0, #if PY_MAJOR_VERSION < 3 0, #else 0, #endif (reprfunc) __Pyx_CyFunction_repr, 0, 0, 0, 0, __Pyx_CyFunction_CallAsMethod, 0, 0, 0, 0, #ifdef Py_TPFLAGS_METHOD_DESCRIPTOR Py_TPFLAGS_METHOD_DESCRIPTOR | #endif #if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL _Py_TPFLAGS_HAVE_VECTORCALL | #endif Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, 0, (traverseproc) __Pyx_CyFunction_traverse, (inquiry) __Pyx_CyFunction_clear, 0, #if PY_VERSION_HEX < 0x030500A0 offsetof(__pyx_CyFunctionObject, func_weakreflist), #else offsetof(PyCFunctionObject, m_weakreflist), #endif 0, 0, __pyx_CyFunction_methods, __pyx_CyFunction_members, __pyx_CyFunction_getsets, 0, 0, __Pyx_PyMethod_New, 0, offsetof(__pyx_CyFunctionObject, func_dict), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, #if PY_VERSION_HEX >= 0x030400a1 0, #endif #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, #endif #if __PYX_NEED_TP_PRINT_SLOT 0, #endif #if PY_VERSION_HEX >= 0x030C0000 0, #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 0, #endif }; #endif static int __pyx_CyFunction_init(PyObject *module) { #if CYTHON_USE_TYPE_SPECS __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); #else CYTHON_UNUSED_VAR(module); __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); #endif if (unlikely(__pyx_CyFunctionType == NULL)) { return -1; } return 0; } static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->defaults = PyObject_Malloc(size); if (unlikely(!m->defaults)) return PyErr_NoMemory(); memset(m->defaults, 0, size); m->defaults_pyobjects = pyobjects; m->defaults_size = size; return m->defaults; } static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->defaults_tuple = tuple; Py_INCREF(tuple); } static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->defaults_kwdict = dict; Py_INCREF(dict); } static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->func_annotations = dict; Py_INCREF(dict); } /* CythonFunction */ static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { PyObject *op = __Pyx_CyFunction_Init( PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), ml, flags, qualname, closure, module, globals, code ); if (likely(op)) { PyObject_GC_Track(op); } return op; } /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { PyObject *use_cline; PyObject *ptype, *pvalue, *ptraceback; #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif CYTHON_MAYBE_UNUSED_VAR(tstate); if (unlikely(!__pyx_cython_runtime)) { return c_line; } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); if (likely(cython_runtime_dict)) { __PYX_PY_DICT_LOOKUP_IF_MODIFIED( use_cline, *cython_runtime_dict, __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) } else #endif { PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); if (use_cline_obj) { use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; Py_DECREF(use_cline_obj); } else { PyErr_Clear(); use_cline = NULL; } } if (!use_cline) { c_line = 0; (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); } else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { c_line = 0; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); return c_line; } #endif /* CodeObjectCache */ #if !CYTHON_COMPILING_IN_LIMITED_API static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = start + (end - start) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } #endif /* AddTraceback */ #include "compile.h" #include "frameobject.h" #include "traceback.h" #if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API #ifndef Py_BUILD_CORE #define Py_BUILD_CORE 1 #endif #include "internal/pycore_frame.h" #endif #if CYTHON_COMPILING_IN_LIMITED_API static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, PyObject *firstlineno, PyObject *name) { PyObject *replace = NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; replace = PyObject_GetAttrString(code, "replace"); if (likely(replace)) { PyObject *result; result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); Py_DECREF(replace); return result; } PyErr_Clear(); #if __PYX_LIMITED_VERSION_HEX < 0x030780000 { PyObject *compiled = NULL, *result = NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; compiled = Py_CompileString( "out = type(code)(\n" " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" " code.co_lnotab)\n", "", Py_file_input); if (!compiled) return NULL; result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); Py_DECREF(compiled); if (!result) PyErr_Print(); Py_DECREF(result); result = PyDict_GetItemString(scratch_dict, "out"); if (result) Py_INCREF(result); return result; } #else return NULL; #endif } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; PyObject *replace = NULL, *getframe = NULL, *frame = NULL; PyObject *exc_type, *exc_value, *exc_traceback; int success = 0; if (c_line) { (void) __pyx_cfilenm; (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); } PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); code_object = Py_CompileString("_getframe()", filename, Py_eval_input); if (unlikely(!code_object)) goto bad; py_py_line = PyLong_FromLong(py_line); if (unlikely(!py_py_line)) goto bad; py_funcname = PyUnicode_FromString(funcname); if (unlikely(!py_funcname)) goto bad; dict = PyDict_New(); if (unlikely(!dict)) goto bad; { PyObject *old_code_object = code_object; code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); Py_DECREF(old_code_object); } if (unlikely(!code_object)) goto bad; getframe = PySys_GetObject("_getframe"); if (unlikely(!getframe)) goto bad; if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; frame = PyEval_EvalCode(code_object, dict, dict); if (unlikely(!frame) || frame == Py_None) goto bad; success = 1; bad: PyErr_Restore(exc_type, exc_value, exc_traceback); Py_XDECREF(code_object); Py_XDECREF(py_py_line); Py_XDECREF(py_funcname); Py_XDECREF(dict); Py_XDECREF(replace); if (success) { PyTraceBack_Here( (struct _frame*)frame); } Py_XDECREF(frame); } #else static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = NULL; PyObject *py_funcname = NULL; #if PY_MAJOR_VERSION < 3 PyObject *py_srcfile = NULL; py_srcfile = PyString_FromString(filename); if (!py_srcfile) goto bad; #endif if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); if (!py_funcname) goto bad; #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); if (!py_funcname) goto bad; funcname = PyUnicode_AsUTF8(py_funcname); if (!funcname) goto bad; #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); if (!py_funcname) goto bad; #endif } #if PY_MAJOR_VERSION < 3 py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); #else py_code = PyCode_NewEmpty(filename, funcname, py_line); #endif Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline return py_code; bad: Py_XDECREF(py_funcname); #if PY_MAJOR_VERSION < 3 Py_XDECREF(py_srcfile); #endif return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject *ptype, *pvalue, *ptraceback; if (c_line) { c_line = __Pyx_CLineForTraceback(tstate, c_line); } py_code = __pyx_find_code_object(c_line ? -c_line : py_line); if (!py_code) { __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) { /* If the code object creation fails, then we should clear the fetched exception references and propagate the new exception */ Py_XDECREF(ptype); Py_XDECREF(pvalue); Py_XDECREF(ptraceback); goto bad; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); } py_frame = PyFrame_New( tstate, /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; __Pyx_PyFrame_SetLineNumber(py_frame, py_line); PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } #endif /* CIntFromPyVerify */ #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) #define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) #define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ {\ func_type value = func_value;\ if (sizeof(target_type) < sizeof(func_type)) {\ if (unlikely(value != (func_type) (target_type) value)) {\ func_type zero = 0;\ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ return (target_type) -1;\ if (is_unsigned && unlikely(value < zero))\ goto raise_neg_overflow;\ else\ goto raise_overflow;\ }\ }\ return (target_type) value;\ } /* CIntFromPy */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if ((sizeof(long) < sizeof(long))) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS if (unlikely(__Pyx_PyLong_IsNeg(x))) { goto raise_neg_overflow; } else if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_DigitCount(x)) { case 2: if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 3: if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 4: if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; } } #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if ((sizeof(long) <= sizeof(unsigned long))) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_SignedDigitCount(x)) { case -2: if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 2: if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -3: if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 3: if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -4: if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 4: if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; } } #endif if ((sizeof(long) <= sizeof(long))) { __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { long val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int ret = -1; #if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); #else PyObject *stepval = NULL, *mask = NULL, *shift = NULL; int bits, remaining_bits, is_negative = 0; long idigit; int chunk_size = (sizeof(long) < 8) ? 30 : 62; if (unlikely(!PyLong_CheckExact(v))) { PyObject *tmp = v; v = PyNumber_Long(v); assert(PyLong_CheckExact(v)); Py_DECREF(tmp); if (unlikely(!v)) return (long) -1; } #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(x) == 0) return (long) 0; is_negative = Py_SIZE(x) < 0; #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; is_negative = result == 1; } #endif if (is_unsigned && unlikely(is_negative)) { goto raise_neg_overflow; } else if (is_negative) { stepval = PyNumber_Invert(v); if (unlikely(!stepval)) return (long) -1; } else { stepval = __Pyx_NewRef(v); } val = (long) 0; mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { PyObject *tmp, *digit; digit = PyNumber_And(stepval, mask); if (unlikely(!digit)) goto done; idigit = PyLong_AsLong(digit); Py_DECREF(digit); if (unlikely(idigit < 0)) goto done; tmp = PyNumber_Rshift(stepval, shift); if (unlikely(!tmp)) goto done; Py_DECREF(stepval); stepval = tmp; val |= ((long) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(stepval) == 0) goto unpacking_done; #endif } idigit = PyLong_AsLong(stepval); if (unlikely(idigit < 0)) goto done; remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); if (unlikely(idigit >= (1L << remaining_bits))) goto raise_overflow; val |= ((long) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 unpacking_done: #endif if (!is_unsigned) { if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) goto raise_overflow; if (is_negative) val = ~val; } ret = 0; done: Py_XDECREF(shift); Py_XDECREF(mask); Py_XDECREF(stepval); #endif Py_DECREF(v); if (likely(!ret)) return val; } return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; #if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); #else PyObject *from_bytes, *result = NULL; PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); if (!from_bytes) return NULL; py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); if (!py_bytes) goto limited_bad; order_str = PyUnicode_FromString(little ? "little" : "big"); if (!order_str) goto limited_bad; arg_tuple = PyTuple_Pack(2, py_bytes, order_str); if (!arg_tuple) goto limited_bad; if (!is_unsigned) { kwds = PyDict_New(); if (!kwds) goto limited_bad; if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; } result = PyObject_Call(from_bytes, arg_tuple, kwds); limited_bad: Py_XDECREF(kwds); Py_XDECREF(arg_tuple); Py_XDECREF(order_str); Py_XDECREF(py_bytes); Py_XDECREF(from_bytes); return result; #endif } } /* FormatTypeName */ #if CYTHON_COMPILING_IN_LIMITED_API static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp) { PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, __pyx_n_s_name); if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { PyErr_Clear(); Py_XDECREF(name); name = __Pyx_NewRef(__pyx_n_s__10); } return name; } #endif /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if ((sizeof(int) < sizeof(long))) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS if (unlikely(__Pyx_PyLong_IsNeg(x))) { goto raise_neg_overflow; } else if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_DigitCount(x)) { case 2: if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 3: if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 4: if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; } } #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if ((sizeof(int) <= sizeof(unsigned long))) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_SignedDigitCount(x)) { case -2: if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 2: if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -3: if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 3: if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -4: if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 4: if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; } } #endif if ((sizeof(int) <= sizeof(long))) { __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int ret = -1; #if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); #else PyObject *stepval = NULL, *mask = NULL, *shift = NULL; int bits, remaining_bits, is_negative = 0; long idigit; int chunk_size = (sizeof(long) < 8) ? 30 : 62; if (unlikely(!PyLong_CheckExact(v))) { PyObject *tmp = v; v = PyNumber_Long(v); assert(PyLong_CheckExact(v)); Py_DECREF(tmp); if (unlikely(!v)) return (int) -1; } #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(x) == 0) return (int) 0; is_negative = Py_SIZE(x) < 0; #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; is_negative = result == 1; } #endif if (is_unsigned && unlikely(is_negative)) { goto raise_neg_overflow; } else if (is_negative) { stepval = PyNumber_Invert(v); if (unlikely(!stepval)) return (int) -1; } else { stepval = __Pyx_NewRef(v); } val = (int) 0; mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { PyObject *tmp, *digit; digit = PyNumber_And(stepval, mask); if (unlikely(!digit)) goto done; idigit = PyLong_AsLong(digit); Py_DECREF(digit); if (unlikely(idigit < 0)) goto done; tmp = PyNumber_Rshift(stepval, shift); if (unlikely(!tmp)) goto done; Py_DECREF(stepval); stepval = tmp; val |= ((int) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(stepval) == 0) goto unpacking_done; #endif } idigit = PyLong_AsLong(stepval); if (unlikely(idigit < 0)) goto done; remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); if (unlikely(idigit >= (1L << remaining_bits))) goto raise_overflow; val |= ((int) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 unpacking_done: #endif if (!is_unsigned) { if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) goto raise_overflow; if (is_negative) val = ~val; } ret = 0; done: Py_XDECREF(shift); Py_XDECREF(mask); Py_XDECREF(stepval); #endif Py_DECREF(v); if (likely(!ret)) return val; } return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } /* FastTypeChecks */ #if CYTHON_COMPILING_IN_CPYTHON static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { while (a) { a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); if (a == b) return 1; } return b == &PyBaseObject_Type; } static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (a == b) return 1; mro = a->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(a, b); } static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (cls == a || cls == b) return 1; mro = cls->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { PyObject *base = PyTuple_GET_ITEM(mro, i); if (base == (PyObject *)a || base == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); } #if PY_MAJOR_VERSION == 2 static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { PyObject *exception, *value, *tb; int res; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&exception, &value, &tb); res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } if (!res) { res = PyObject_IsSubclass(err, exc_type2); if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } } __Pyx_ErrRestore(exception, value, tb); return res; } #else static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { if (exc_type1) { return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); } else { return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); } } #endif static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; assert(PyExceptionClass_Check(exc_type)); n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; i= 0x030B00A4 return Py_Version & ~0xFFUL; #else const char* rt_version = Py_GetVersion(); unsigned long version = 0; unsigned long factor = 0x01000000UL; unsigned int digit = 0; int i = 0; while (factor) { while ('0' <= rt_version[i] && rt_version[i] <= '9') { digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); ++i; } version += factor * digit; if (rt_version[i] != '.') break; digit = 0; factor >>= 8; ++i; } return version; #endif } static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { const unsigned long MAJOR_MINOR = 0xFFFF0000UL; if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) return 0; if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) return 1; { char message[200]; PyOS_snprintf(message, sizeof(message), "compile time Python version %d.%d " "of module '%.100s' " "%s " "runtime version %d.%d", (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), __Pyx_MODULE_NAME, (allow_newer) ? "was newer than" : "does not match", (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) ); return PyErr_WarnEx(NULL, message, 1); } } /* InitStrings */ #if PY_MAJOR_VERSION >= 3 static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { if (t.is_unicode | t.is_str) { if (t.intern) { *str = PyUnicode_InternFromString(t.s); } else if (t.encoding) { *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); } else { *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); } } else { *str = PyBytes_FromStringAndSize(t.s, t.n - 1); } if (!*str) return -1; if (PyObject_Hash(*str) == -1) return -1; return 0; } #endif static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION >= 3 __Pyx_InitString(*t, t->p); #else if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } if (!*t->p) return -1; if (PyObject_Hash(*t->p) == -1) return -1; #endif ++t; } return 0; } #include static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { size_t len = strlen(s); if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { PyErr_SetString(PyExc_OverflowError, "byte string is too long"); return -1; } return (Py_ssize_t) len; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { Py_ssize_t len = __Pyx_ssize_strlen(c_str); if (unlikely(len < 0)) return NULL; return __Pyx_PyUnicode_FromStringAndSize(c_str, len); } static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { Py_ssize_t len = __Pyx_ssize_strlen(c_str); if (unlikely(len < 0)) return NULL; return PyByteArray_FromStringAndSize(c_str, len); } static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #if !CYTHON_PEP393_ENABLED static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; } #else static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (likely(PyUnicode_IS_ASCII(o))) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif } #endif #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { return __Pyx_PyUnicode_AsStringAndSize(o, length); } else #endif #if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { int retval; if (unlikely(!x)) return -1; retval = __Pyx_PyObject_IsTrue(x); Py_DECREF(x); return retval; } static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); #if PY_MAJOR_VERSION >= 3 if (PyLong_Check(result)) { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " "The ability to return an instance of a strict subclass of int is deprecated, " "and may be removed in a future version of Python.", result_type_name)) { __Pyx_DECREF_TypeName(result_type_name); Py_DECREF(result); return NULL; } __Pyx_DECREF_TypeName(result_type_name); return result; } #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", type_name, type_name, result_type_name); __Pyx_DECREF_TypeName(result_type_name); Py_DECREF(result); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { #if CYTHON_USE_TYPE_SLOTS PyNumberMethods *m; #endif const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x) || PyLong_Check(x))) #else if (likely(PyLong_Check(x))) #endif return __Pyx_NewRef(x); #if CYTHON_USE_TYPE_SLOTS m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = m->nb_int(x); } else if (m && m->nb_long) { name = "long"; res = m->nb_long(x); } #else if (likely(m && m->nb_int)) { name = "int"; res = m->nb_int(x); } #endif #else if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { res = PyNumber_Int(x); } #endif if (likely(res)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { #else if (unlikely(!PyLong_CheckExact(res))) { #endif return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) { if (sizeof(Py_ssize_t) >= sizeof(long)) return PyInt_AS_LONG(b); else return PyInt_AsSsize_t(b); } #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_USE_PYLONG_INTERNALS if (likely(__Pyx_PyLong_IsCompact(b))) { return __Pyx_PyLong_CompactValue(b); } else { const digit* digits = __Pyx_PyLong_Digits(b); const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); switch (size) { case 2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; } } #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); #if PY_MAJOR_VERSION < 3 } else if (likely(PyInt_CheckExact(o))) { return PyInt_AS_LONG(o); #endif } else { Py_ssize_t ival; PyObject *x; x = PyNumber_Index(o); if (!x) return -1; ival = PyInt_AsLong(x); Py_DECREF(x); return ival; } } static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } /* #### Code section: utility_code_pragmas_end ### */ #ifdef _MSC_VER #pragma warning( pop ) #endif /* #### Code section: end ### */ #endif /* Py_PYTHON_H */ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/_helpers.pyi0000644000175100001770000000031214607525266016612 0ustar00runnerdockerfrom typing import Any class reify: def __init__(self, wrapped: Any) -> None: ... def __get__(self, inst: Any, owner: Any) -> Any: ... def __set__(self, inst: Any, value: Any) -> None: ... ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/_helpers.pyx0000644000175100001770000000203114607525266016631 0ustar00runnerdockercdef class reify: """Use as a class method decorator. It operates almost exactly like the Python `@property` decorator, but it puts the result of the method it decorates into the instance dict after the first call, effectively replacing the function it decorates with an instance variable. It is, in Python parlance, a data descriptor. """ cdef object wrapped cdef object name def __init__(self, wrapped): self.wrapped = wrapped self.name = wrapped.__name__ @property def __doc__(self): return self.wrapped.__doc__ def __get__(self, inst, owner): try: try: return inst._cache[self.name] except KeyError: val = self.wrapped(inst) inst._cache[self.name] = val return val except AttributeError: if inst is None: return self raise def __set__(self, inst, value): raise AttributeError("reified property is read-only") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285827.0 aiohttp-3.9.5/aiohttp/_http_parser.c0000644000175100001770000475341114607525303017137 0ustar00runnerdocker/* Generated by Cython 3.0.5 */ #ifndef PY_SSIZE_T_CLEAN #define PY_SSIZE_T_CLEAN #endif /* PY_SSIZE_T_CLEAN */ #if defined(CYTHON_LIMITED_API) && 0 #ifndef Py_LIMITED_API #if CYTHON_LIMITED_API+0 > 0x03030000 #define Py_LIMITED_API CYTHON_LIMITED_API #else #define Py_LIMITED_API 0x03030000 #endif #endif #endif #include "Python.h" #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyFloat_FromString(obj) PyFloat_FromString(obj) #else #define __Pyx_PyFloat_FromString(obj) PyFloat_FromString(obj, NULL) #endif #if PY_MAJOR_VERSION <= 2 #define PyDict_GetItemWithError _PyDict_GetItemWithError #endif #if (PY_VERSION_HEX < 0x030700b1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030600)) && !defined(PyContextVar_Get) #define PyContextVar_Get(var, d, v) ((d) ? ((void)(var), Py_INCREF(d), (v)[0] = (d), 0) : ((v)[0] = NULL, 0) ) #endif #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.7+ or Python 3.3+. #else #if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API #define __PYX_EXTRA_ABI_MODULE_NAME "limited" #else #define __PYX_EXTRA_ABI_MODULE_NAME "" #endif #define CYTHON_ABI "3_0_5" __PYX_EXTRA_ABI_MODULE_NAME #define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI #define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." #define CYTHON_HEX_VERSION 0x030005F0 #define CYTHON_FUTURE_DIVISION 1 #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #define __PYX_COMMA , #ifndef HAVE_LONG_LONG #define HAVE_LONG_LONG #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX #if defined(GRAALVM_PYTHON) /* For very preliminary testing purposes. Most variables are set the same as PyPy. The existence of this section does not imply that anything works or is even tested */ #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 1 #define CYTHON_COMPILING_IN_NOGIL 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 0 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_GIL #define CYTHON_FAST_GIL 0 #undef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) #endif #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #undef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 #endif #elif defined(PYPY_VERSION) #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #ifndef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 0 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_GIL #define CYTHON_FAST_GIL 0 #undef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) #endif #if PY_VERSION_HEX < 0x03090000 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #endif #undef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 #endif #elif defined(CYTHON_LIMITED_API) #ifdef Py_LIMITED_API #undef __PYX_LIMITED_VERSION_HEX #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API #endif #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 1 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 0 #undef CYTHON_CLINE_IN_TRACEBACK #define CYTHON_CLINE_IN_TRACEBACK 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 1 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #endif #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_GIL #define CYTHON_FAST_GIL 0 #undef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS 1 #endif #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 1 #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #endif #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 #endif #elif defined(PY_NOGIL) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 1 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #ifndef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #endif #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 1 #endif #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #ifndef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 0 #endif #ifndef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 1 #endif #if PY_MAJOR_VERSION < 3 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #ifndef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 1 #endif #ifndef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 1 #endif #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #elif !defined(CYTHON_USE_UNICODE_WRITER) #define CYTHON_USE_UNICODE_WRITER 1 #endif #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #ifndef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_GIL #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) #endif #ifndef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) #endif #ifndef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 1 #endif #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS 1 #endif #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #endif #ifndef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 0 #endif #if PY_VERSION_HEX < 0x030400a1 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #elif !defined(CYTHON_USE_TP_FINALIZE) #define CYTHON_USE_TP_FINALIZE 1 #endif #if PY_VERSION_HEX < 0x030600B1 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #elif !defined(CYTHON_USE_DICT_VERSIONS) #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) #endif #if PY_VERSION_HEX < 0x030700A3 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #elif !defined(CYTHON_USE_EXC_INFO_STACK) #define CYTHON_USE_EXC_INFO_STACK 1 #endif #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if !defined(CYTHON_VECTORCALL) #define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) #endif #define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) #if CYTHON_USE_PYLONG_INTERNALS #if PY_MAJOR_VERSION < 3 #include "longintrepr.h" #endif #undef SHIFT #undef BASE #undef MASK #ifdef SIZEOF_VOID_P enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; #endif #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_cpp_attribute #define __has_cpp_attribute(x) 0 #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifndef CYTHON_UNUSED #if defined(__cplusplus) /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 * but leads to warnings with -pedantic, since it is a C++17 feature */ #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) #if __has_cpp_attribute(maybe_unused) #define CYTHON_UNUSED [[maybe_unused]] #endif #endif #endif #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif #ifndef CYTHON_UNUSED_VAR # if defined(__cplusplus) template void CYTHON_UNUSED_VAR( const T& ) { } # else # define CYTHON_UNUSED_VAR(x) (void)(x) # endif #endif #ifndef CYTHON_MAYBE_UNUSED_VAR #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) #endif #ifndef CYTHON_NCP_UNUSED # if CYTHON_COMPILING_IN_CPYTHON # define CYTHON_NCP_UNUSED # else # define CYTHON_NCP_UNUSED CYTHON_UNUSED # endif #endif #ifndef CYTHON_USE_CPP_STD_MOVE #if defined(__cplusplus) && (\ __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) #define CYTHON_USE_CPP_STD_MOVE 1 #else #define CYTHON_USE_CPP_STD_MOVE 0 #endif #endif #define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) #ifdef _MSC_VER #ifndef _MSC_STDINT_H_ #if _MSC_VER < 1300 typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #else typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #endif #endif #if _MSC_VER < 1300 #ifdef _WIN64 typedef unsigned long long __pyx_uintptr_t; #else typedef unsigned int __pyx_uintptr_t; #endif #else #ifdef _WIN64 typedef unsigned __int64 __pyx_uintptr_t; #else typedef unsigned __int32 __pyx_uintptr_t; #endif #endif #else #include typedef uintptr_t __pyx_uintptr_t; #endif #ifndef CYTHON_FALLTHROUGH #if defined(__cplusplus) /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 * but leads to warnings with -pedantic, since it is a C++17 feature */ #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) #if __has_cpp_attribute(fallthrough) #define CYTHON_FALLTHROUGH [[fallthrough]] #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_cpp_attribute(clang::fallthrough) #define CYTHON_FALLTHROUGH [[clang::fallthrough]] #elif __has_cpp_attribute(gnu::fallthrough) #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] #endif #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_attribute(fallthrough) #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) #else #define CYTHON_FALLTHROUGH #endif #endif #if defined(__clang__) && defined(__apple_build_version__) #if __apple_build_version__ < 7000000 #undef CYTHON_FALLTHROUGH #define CYTHON_FALLTHROUGH #endif #endif #endif #ifdef __cplusplus template struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) #else #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) #endif #if CYTHON_COMPILING_IN_PYPY == 1 #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) #else #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) #endif #define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) #ifndef CYTHON_INLINE #if defined(__clang__) #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) #elif defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_DefaultClassType PyClass_Type #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #define __Pyx_DefaultClassType PyType_Type #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, PyObject *code, PyObject *c, PyObject* n, PyObject *v, PyObject *fv, PyObject *cell, PyObject* fn, PyObject *name, int fline, PyObject *lnos) { PyObject *exception_table = NULL; PyObject *types_module=NULL, *code_type=NULL, *result=NULL; #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 PyObject *version_info; // borrowed #endif PyObject *py_minor_version = NULL; long minor_version = 0; PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 minor_version = 11; // we don't yet need to distinguish between versions > 11 #else if (!(version_info = PySys_GetObject("version_info"))) goto end; if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; minor_version = PyLong_AsLong(py_minor_version); if (minor_version == -1 && PyErr_Occurred()) goto end; #endif if (!(types_module = PyImport_ImportModule("types"))) goto end; if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; if (minor_version <= 7) { (void)p; result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, c, n, v, fn, name, fline, lnos, fv, cell); } else if (minor_version <= 10) { result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, c, n, v, fn, name, fline, lnos, fv, cell); } else { if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); } end: Py_XDECREF(code_type); Py_XDECREF(exception_table); Py_XDECREF(types_module); Py_XDECREF(py_minor_version); if (type) { PyErr_Restore(type, value, traceback); } return result; } #ifndef CO_OPTIMIZED #define CO_OPTIMIZED 0x0001 #endif #ifndef CO_NEWLOCALS #define CO_NEWLOCALS 0x0002 #endif #ifndef CO_VARARGS #define CO_VARARGS 0x0004 #endif #ifndef CO_VARKEYWORDS #define CO_VARKEYWORDS 0x0008 #endif #ifndef CO_ASYNC_GENERATOR #define CO_ASYNC_GENERATOR 0x0200 #endif #ifndef CO_GENERATOR #define CO_GENERATOR 0x0020 #endif #ifndef CO_COROUTINE #define CO_COROUTINE 0x0080 #endif #elif PY_VERSION_HEX >= 0x030B0000 static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, PyObject *code, PyObject *c, PyObject* n, PyObject *v, PyObject *fv, PyObject *cell, PyObject* fn, PyObject *name, int fline, PyObject *lnos) { PyCodeObject *result; PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); // we don't have access to __pyx_empty_bytes here if (!empty_bytes) return NULL; result = #if PY_VERSION_HEX >= 0x030C0000 PyUnstable_Code_NewWithPosOnlyArgs #else PyCode_NewWithPosOnlyArgs #endif (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); Py_DECREF(empty_bytes); return result; } #elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #endif #if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) #else #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) #define __Pyx_Py_Is(x, y) Py_Is(x, y) #else #define __Pyx_Py_Is(x, y) ((x) == (y)) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) #else #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) #else #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) #else #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) #endif #define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) #if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) #else #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) #endif #ifndef CO_COROUTINE #define CO_COROUTINE 0x80 #endif #ifndef CO_ASYNC_GENERATOR #define CO_ASYNC_GENERATOR 0x200 #endif #ifndef Py_TPFLAGS_CHECKTYPES #define Py_TPFLAGS_CHECKTYPES 0 #endif #ifndef Py_TPFLAGS_HAVE_INDEX #define Py_TPFLAGS_HAVE_INDEX 0 #endif #ifndef Py_TPFLAGS_HAVE_NEWBUFFER #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #ifndef Py_TPFLAGS_HAVE_FINALIZE #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #ifndef Py_TPFLAGS_SEQUENCE #define Py_TPFLAGS_SEQUENCE 0 #endif #ifndef Py_TPFLAGS_MAPPING #define Py_TPFLAGS_MAPPING 0 #endif #ifndef METH_STACKLESS #define METH_STACKLESS 0 #endif #if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) #ifndef METH_FASTCALL #define METH_FASTCALL 0x80 #endif typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else #define __Pyx_PyCFunctionFast _PyCFunctionFast #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords #endif #if CYTHON_METH_FASTCALL #define __Pyx_METH_FASTCALL METH_FASTCALL #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords #else #define __Pyx_METH_FASTCALL METH_VARARGS #define __Pyx_PyCFunction_FastCall PyCFunction #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords #endif #if CYTHON_VECTORCALL #define __pyx_vectorcallfunc vectorcallfunc #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) #elif CYTHON_BACKPORT_VECTORCALL typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames); #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) #else #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) #endif #if PY_MAJOR_VERSION >= 0x030900B1 #define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) #else #define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) #endif #define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) #elif !CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) #endif #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; } #endif static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { #if CYTHON_COMPILING_IN_LIMITED_API return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; #else return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; #endif } #define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) #if __PYX_LIMITED_VERSION_HEX < 0x030900B1 #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); #else #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) #define __Pyx_PyCMethod PyCMethod #endif #ifndef METH_METHOD #define METH_METHOD 0x200 #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) #define PyObject_Malloc(s) PyMem_Malloc(s) #define PyObject_Free(p) PyMem_Free(p) #define PyObject_Realloc(p) PyMem_Realloc(p) #endif #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) #else #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) #endif #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_PyThreadState_Current PyThreadState_Get() #elif !CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_Current PyThreadState_GET() #elif PY_VERSION_HEX >= 0x030d00A1 #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() #elif PY_VERSION_HEX >= 0x03060000 #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() #elif PY_VERSION_HEX >= 0x03000000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #else #define __Pyx_PyThreadState_Current _PyThreadState_Current #endif #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) { void *result; result = PyModule_GetState(op); if (!result) Py_FatalError("Couldn't find the module state"); return result; } #endif #define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) #else #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) #endif #if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) #include "pythread.h" #define Py_tss_NEEDS_INIT 0 typedef int Py_tss_t; static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { *key = PyThread_create_key(); return 0; } static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); *key = Py_tss_NEEDS_INIT; return key; } static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { PyObject_Free(key); } static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { return *key != Py_tss_NEEDS_INIT; } static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { PyThread_delete_key(*key); *key = Py_tss_NEEDS_INIT; } static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { return PyThread_set_key_value(*key, value); } static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { return PyThread_get_key_value(*key); } #endif #if PY_MAJOR_VERSION < 3 #if CYTHON_COMPILING_IN_PYPY #if PYPY_VERSION_NUM < 0x07030600 #if defined(__cplusplus) && __cplusplus >= 201402L [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] #elif defined(__GNUC__) || defined(__clang__) __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) #elif defined(_MSC_VER) __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) #endif static CYTHON_INLINE int PyGILState_Check(void) { return 0; } #else // PYPY_VERSION_NUM < 0x07030600 #endif // PYPY_VERSION_NUM < 0x07030600 #else static CYTHON_INLINE int PyGILState_Check(void) { PyThreadState * tstate = _PyThreadState_Current; return tstate && (tstate == PyGILState_GetThisThreadState()); } #endif #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) #else #define __Pyx_PyDict_NewPresized(n) PyDict_New() #endif #if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS #define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); if (res == NULL) PyErr_Clear(); return res; } #elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) #define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError #define __Pyx_PyDict_GetItemStr PyDict_GetItem #else static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { #if CYTHON_COMPILING_IN_PYPY return PyDict_GetItem(dict, name); #else PyDictEntry *ep; PyDictObject *mp = (PyDictObject*) dict; long hash = ((PyStringObject *) name)->ob_shash; assert(hash != -1); ep = (mp->ma_lookup)(mp, name, hash); if (ep == NULL) { return NULL; } return ep->me_value; #endif } #define __Pyx_PyDict_GetItemStr PyDict_GetItem #endif #if CYTHON_USE_TYPE_SLOTS #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) #else #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next #endif #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) #else #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) #endif #if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 #define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ PyTypeObject *type = Py_TYPE(obj);\ assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ PyObject_GC_Del(obj);\ Py_DECREF(type);\ } #else #define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) #endif #if CYTHON_COMPILING_IN_LIMITED_API #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) #define __Pyx_PyUnicode_DATA(u) ((void*)u) #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) #elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #if PY_VERSION_HEX >= 0x030C0000 #define __Pyx_PyUnicode_READY(op) (0) #else #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #endif #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) #if PY_VERSION_HEX >= 0x030C0000 #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) #else #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #endif #endif #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 #define PyUnicode_2BYTE_KIND 2 #define PyUnicode_4BYTE_KIND 4 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #endif #if CYTHON_COMPILING_IN_PYPY #if !defined(PyUnicode_DecodeUnicodeEscape) #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) #endif #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) #undef PyUnicode_Contains #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) #endif #if !defined(PyByteArray_Check) #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) #endif #if !defined(PyObject_Format) #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) #endif #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) #define PyObject_ASCII(o) PyObject_Repr(o) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #ifndef PyObject_Unicode #define PyObject_Unicode PyObject_Str #endif #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_PySequence_ListKeepNew(obj)\ (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) #else #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) #endif #if PY_VERSION_HEX >= 0x030900A4 #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) #else #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) #endif #if CYTHON_ASSUME_SAFE_MACROS #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) #else #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) #endif #if PY_VERSION_HEX >= 0x030d00A1 #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) #else static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { PyObject *module = PyImport_AddModule(name); Py_XINCREF(module); return module; } #endif #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define __Pyx_Py3Int_Check(op) PyLong_Check(op) #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #else #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t #endif #if CYTHON_USE_ASYNC_SLOTS #if PY_VERSION_HEX >= 0x030500B1 #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) #else #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) #endif #else #define __Pyx_PyType_AsAsync(obj) NULL #endif #ifndef __Pyx_PyAsyncMethodsStruct typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; } __Pyx_PyAsyncMethodsStruct; #endif #if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) #if !defined(_USE_MATH_DEFINES) #define _USE_MATH_DEFINES #endif #endif #include #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) #define __Pyx_truncl trunc #else #define __Pyx_truncl truncl #endif #define __PYX_MARK_ERR_POS(f_index, lineno) \ { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } #ifdef CYTHON_EXTERN_C #undef __PYX_EXTERN_C #define __PYX_EXTERN_C CYTHON_EXTERN_C #elif defined(__PYX_EXTERN_C) #ifdef _MSC_VER #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") #else #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. #endif #else #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #define __PYX_HAVE__aiohttp___http_parser #define __PYX_HAVE_API__aiohttp___http_parser /* Early includes */ #include #include #include "pythread.h" #include #include #include "../vendor/llhttp/build/llhttp.h" #include "_find_header.h" #ifdef _OPENMP #include #endif /* _OPENMP */ #if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) #define CYTHON_WITHOUT_ASSERTIONS #endif typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_uchar_cast(c) ((unsigned char)c) #define __Pyx_long_cast(x) ((long)x) #define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ (sizeof(type) < sizeof(Py_ssize_t)) ||\ (sizeof(type) > sizeof(Py_ssize_t) &&\ likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX) &&\ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ v == (type)PY_SSIZE_T_MIN))) ||\ (sizeof(type) == sizeof(Py_ssize_t) &&\ (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX))) ) static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { return (size_t) i < (size_t) limit; } #if defined (__cplusplus) && __cplusplus >= 201103L #include #define __Pyx_sst_abs(value) std::abs(value) #elif SIZEOF_INT >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) abs(value) #elif SIZEOF_LONG >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) labs(value) #elif defined (_MSC_VER) #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_sst_abs(value) llabs(value) #elif defined (__GNUC__) #define __Pyx_sst_abs(value) __builtin_llabs(value) #else #define __Pyx_sst_abs(value) ((value<0) ? -value : value) #endif static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) { const wchar_t *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #else static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { const Py_UNICODE *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #endif #define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) #define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); #if CYTHON_ASSUME_SAFE_MACROS #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) #else #define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) #endif #if CYTHON_USE_PYLONG_INTERNALS #if PY_VERSION_HEX >= 0x030C00A7 #ifndef _PyLong_SIGN_MASK #define _PyLong_SIGN_MASK 3 #endif #ifndef _PyLong_NON_SIZE_BITS #define _PyLong_NON_SIZE_BITS 3 #endif #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) #define __Pyx_PyLong_SignedDigitCount(x)\ ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) #else #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) #endif typedef Py_ssize_t __Pyx_compact_pylong; typedef size_t __Pyx_compact_upylong; #else // Py < 3.12 #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) #define __Pyx_PyLong_CompactValue(x)\ ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) typedef sdigit __Pyx_compact_pylong; typedef digit __Pyx_compact_upylong; #endif #if PY_VERSION_HEX >= 0x030C00A5 #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) #else #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) #endif #endif #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII #include static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = (char) c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #include static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } #if !CYTHON_USE_MODULE_STATE static PyObject *__pyx_m = NULL; #endif static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm = __FILE__; static const char *__pyx_filename; /* #### Code section: filename_table ### */ static const char *__pyx_f[] = { "aiohttp/_http_parser.pyx", "", "contextvars.pxd", "type.pxd", "bool.pxd", "complex.pxd", "aiohttp/_headers.pxi", }; /* #### Code section: utility_code_proto_before_types ### */ /* ForceInitThreads.proto */ #ifndef __PYX_FORCE_INIT_THREADS #define __PYX_FORCE_INIT_THREADS 0 #endif /* #### Code section: numeric_typedefs ### */ /* #### Code section: complex_type_declarations ### */ /* #### Code section: type_declarations ### */ /*--- Type declarations ---*/ struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage; struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage; struct __pyx_obj_7aiohttp_12_http_parser_HttpParser; struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser; struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser; struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr; struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr; struct __pyx_opt_args_7cpython_11contextvars_get_value; struct __pyx_opt_args_7cpython_11contextvars_get_value_no_default; /* "cpython/contextvars.pxd":112 * * * cdef inline object get_value(var, default_value=None): # <<<<<<<<<<<<<< * """Return a new reference to the value of the context variable, * or the default value of the context variable, */ struct __pyx_opt_args_7cpython_11contextvars_get_value { int __pyx_n; PyObject *default_value; }; /* "cpython/contextvars.pxd":129 * * * cdef inline object get_value_no_default(var, default_value=None): # <<<<<<<<<<<<<< * """Return a new reference to the value of the context variable, * or the provided default value if no such value was found. */ struct __pyx_opt_args_7cpython_11contextvars_get_value_no_default { int __pyx_n; PyObject *default_value; }; struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init; /* "aiohttp/_http_parser.pyx":327 * PyMem_Free(self._csettings) * * cdef _init( # <<<<<<<<<<<<<< * self, cparser.llhttp_type mode, * object protocol, object loop, int limit, */ struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init { int __pyx_n; PyObject *timer; size_t max_line_size; size_t max_headers; size_t max_field_size; PyObject *payload_exception; int response_with_body; int read_until_eof; int auto_decompress; }; /* "aiohttp/_http_parser.pyx":110 * * @cython.freelist(DEFAULT_FREELIST_SIZE) * cdef class RawRequestMessage: # <<<<<<<<<<<<<< * cdef readonly str method * cdef readonly str path */ struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage { PyObject_HEAD PyObject *method; PyObject *path; PyObject *version; PyObject *headers; PyObject *raw_headers; PyObject *should_close; PyObject *compression; PyObject *upgrade; PyObject *chunked; PyObject *url; }; /* "aiohttp/_http_parser.pyx":210 * * @cython.freelist(DEFAULT_FREELIST_SIZE) * cdef class RawResponseMessage: # <<<<<<<<<<<<<< * cdef readonly object version # HttpVersion * cdef readonly int code */ struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage { PyObject_HEAD PyObject *version; int code; PyObject *reason; PyObject *headers; PyObject *raw_headers; PyObject *should_close; PyObject *compression; PyObject *upgrade; PyObject *chunked; }; /* "aiohttp/_http_parser.pyx":272 * * @cython.internal * cdef class HttpParser: # <<<<<<<<<<<<<< * * cdef: */ struct __pyx_obj_7aiohttp_12_http_parser_HttpParser { PyObject_HEAD struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *__pyx_vtab; llhttp_t *_cparser; llhttp_settings_t *_csettings; PyObject *_raw_name; PyObject *_raw_value; int _has_value; PyObject *_protocol; PyObject *_loop; PyObject *_timer; size_t _max_line_size; size_t _max_field_size; size_t _max_headers; int _response_with_body; int _read_until_eof; int _started; PyObject *_url; PyObject *_buf; PyObject *_path; PyObject *_reason; PyObject *_headers; PyObject *_raw_headers; int _upgraded; PyObject *_messages; PyObject *_payload; int _payload_error; PyObject *_payload_exception; PyObject *_last_error; int _auto_decompress; int _limit; PyObject *_content_encoding; Py_buffer py_buf; }; /* "aiohttp/_http_parser.pyx":574 * * * cdef class HttpRequestParser(HttpParser): # <<<<<<<<<<<<<< * * def __init__( */ struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser __pyx_base; }; /* "aiohttp/_http_parser.pyx":638 * * * cdef class HttpResponseParser(HttpParser): # <<<<<<<<<<<<<< * * def __init__( */ struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser __pyx_base; }; /* "aiohttp/_http_parser.pyx":147 * info.append(("chunked", self.chunked)) * info.append(("url", self.url)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< * return '' * */ struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr { PyObject_HEAD PyObject *__pyx_genexpr_arg_0; PyObject *__pyx_v_name; PyObject *__pyx_v_val; }; /* "aiohttp/_http_parser.pyx":244 * info.append(("upgrade", self.upgrade)) * info.append(("chunked", self.chunked)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< * return '' * */ struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr { PyObject_HEAD PyObject *__pyx_genexpr_arg_0; PyObject *__pyx_v_name; PyObject *__pyx_v_val; }; /* "aiohttp/_http_parser.pyx":272 * * @cython.internal * cdef class HttpParser: # <<<<<<<<<<<<<< * * cdef: */ struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser { PyObject *(*_init)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, enum llhttp_type, PyObject *, PyObject *, int, struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init *__pyx_optional_args); PyObject *(*_process_header)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); PyObject *(*_on_header_field)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, char *, size_t); PyObject *(*_on_header_value)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, char *, size_t); PyObject *(*_on_headers_complete)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); PyObject *(*_on_message_complete)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); PyObject *(*_on_chunk_header)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); PyObject *(*_on_chunk_complete)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); PyObject *(*_on_status_complete)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); PyObject *(*http_version)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); }; static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *__pyx_vtabptr_7aiohttp_12_http_parser_HttpParser; static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); /* "aiohttp/_http_parser.pyx":574 * * * cdef class HttpRequestParser(HttpParser): # <<<<<<<<<<<<<< * * def __init__( */ struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpRequestParser { struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser __pyx_base; }; static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpRequestParser *__pyx_vtabptr_7aiohttp_12_http_parser_HttpRequestParser; /* "aiohttp/_http_parser.pyx":638 * * * cdef class HttpResponseParser(HttpParser): # <<<<<<<<<<<<<< * * def __init__( */ struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpResponseParser { struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser __pyx_base; }; static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpResponseParser *__pyx_vtabptr_7aiohttp_12_http_parser_HttpResponseParser; /* #### Code section: utility_code_proto ### */ /* --- Runtime support code (head) --- */ /* Refnanny.proto */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, Py_ssize_t); void (*DECREF)(void*, PyObject*, Py_ssize_t); void (*GOTREF)(void*, PyObject*, Py_ssize_t); void (*GIVEREF)(void*, PyObject*, Py_ssize_t); void* (*SetupContext)(const char*, Py_ssize_t, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil)\ if (acquire_gil) {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ PyGILState_Release(__pyx_gilstate_save);\ } else {\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ } #define __Pyx_RefNannyFinishContextNogil() {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __Pyx_RefNannyFinishContext();\ PyGILState_Release(__pyx_gilstate_save);\ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil)\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() #endif #define __Pyx_RefNannyFinishContextNogil() {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __Pyx_RefNannyFinishContext();\ PyGILState_Release(__pyx_gilstate_save);\ } #define __Pyx_RefNannyFinishContext()\ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContextNogil() #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_Py_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; Py_XDECREF(tmp);\ } while (0) #define __Pyx_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_XDECREF(tmp);\ } while (0) #define __Pyx_DECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_DECREF(tmp);\ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) /* PyErrExceptionMatches.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); #else #define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) #endif /* PyThreadStateGet.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; #define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; #if PY_VERSION_HEX >= 0x030C00A6 #define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) #define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) #else #define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) #define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) #endif #else #define __Pyx_PyThreadState_declare #define __Pyx_PyThreadState_assign #define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) #define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() #endif /* PyErrFetchRestore.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) #define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) #define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 #define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) #else #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #endif #else #define __Pyx_PyErr_Clear() PyErr_Clear() #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif /* PyObjectGetAttrStr.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif /* PyObjectGetAttrStrNoError.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); /* GetBuiltinName.proto */ static PyObject *__Pyx_GetBuiltinName(PyObject *name); /* GetItemInt.proto */ #define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ __Pyx_GetItemInt_Generic(o, to_py_func(i)))) #define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); #define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, int wraparound, int boundscheck); /* decode_c_string_utf16.proto */ static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, const char *errors) { int byteorder = 0; return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); } static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16LE(const char *s, Py_ssize_t size, const char *errors) { int byteorder = -1; return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); } static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16BE(const char *s, Py_ssize_t size, const char *errors) { int byteorder = 1; return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); } /* decode_c_bytes.proto */ static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes( const char* cstring, Py_ssize_t length, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)); /* decode_bytes.proto */ static CYTHON_INLINE PyObject* __Pyx_decode_bytes( PyObject* string, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { char* as_c_string; Py_ssize_t size; #if CYTHON_ASSUME_SAFE_MACROS as_c_string = PyBytes_AS_STRING(string); size = PyBytes_GET_SIZE(string); #else if (PyBytes_AsStringAndSize(string, &as_c_string, &size) < 0) { return NULL; } #endif return __Pyx_decode_c_bytes( as_c_string, size, start, stop, encoding, errors, decode_func); } /* TupleAndListFromArray.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); #endif /* IncludeStringH.proto */ #include /* BytesEquals.proto */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); /* UnicodeEquals.proto */ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); /* fastcall.proto */ #if CYTHON_AVOID_BORROWED_REFS #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) #elif CYTHON_ASSUME_SAFE_MACROS #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) #else #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) #endif #if CYTHON_AVOID_BORROWED_REFS #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) #else #define __Pyx_Arg_NewRef_VARARGS(arg) arg // no-op #define __Pyx_Arg_XDECREF_VARARGS(arg) // no-op - arg is borrowed #endif #define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) #define __Pyx_KwValues_VARARGS(args, nargs) NULL #define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) #define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) #if CYTHON_METH_FASTCALL #define __Pyx_Arg_FASTCALL(args, i) args[i] #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 static CYTHON_UNUSED PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); #else #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) #endif #define __Pyx_Arg_NewRef_FASTCALL(arg) arg // no-op, __Pyx_Arg_FASTCALL is direct and this needs #define __Pyx_Arg_XDECREF_FASTCALL(arg) // no-op - arg was returned from array #else #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) #endif #if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS #define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) #define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) #else #define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) #define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) #endif /* RaiseArgTupleInvalid.proto */ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /* RaiseDoubleKeywords.proto */ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /* ParseKeywords.proto */ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name); /* RaiseUnexpectedTypeError.proto */ static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj); /* RaiseUnboundLocalError.proto */ static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); /* RaiseTooManyValuesToUnpack.proto */ static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); /* RaiseNeedMoreValuesToUnpack.proto */ static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); /* IterFinish.proto */ static CYTHON_INLINE int __Pyx_IterFinish(void); /* UnpackItemEndCheck.proto */ static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /* ListCompAppend.proto */ #if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { PyListObject* L = (PyListObject*) list; Py_ssize_t len = Py_SIZE(list); if (likely(L->allocated > len)) { Py_INCREF(x); #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 L->ob_item[len] = x; #else PyList_SET_ITEM(list, len, x); #endif __Pyx_SET_SIZE(list, len + 1); return 0; } return PyList_Append(list, x); } #else #define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) #endif /* GetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); #endif /* pep479.proto */ static void __Pyx_Generator_Replace_StopIteration(int in_async_gen); /* ListAppend.proto */ #if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { PyListObject* L = (PyListObject*) list; Py_ssize_t len = Py_SIZE(list); if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { Py_INCREF(x); #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 L->ob_item[len] = x; #else PyList_SET_ITEM(list, len, x); #endif __Pyx_SET_SIZE(list, len + 1); return 0; } return PyList_Append(list, x); } #else #define __Pyx_PyList_Append(L,x) PyList_Append(L,x) #endif /* UnicodeConcatInPlace.proto */ # if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_REFNANNY #define __Pyx_PyUnicode_ConcatInPlace(left, right) __Pyx_PyUnicode_ConcatInPlaceImpl(&left, right, __pyx_refnanny) #else #define __Pyx_PyUnicode_ConcatInPlace(left, right) __Pyx_PyUnicode_ConcatInPlaceImpl(&left, right) #endif static CYTHON_INLINE PyObject *__Pyx_PyUnicode_ConcatInPlaceImpl(PyObject **p_left, PyObject *right #if CYTHON_REFNANNY , void* __pyx_refnanny #endif ); #else #define __Pyx_PyUnicode_ConcatInPlace __Pyx_PyUnicode_Concat #endif #define __Pyx_PyUnicode_ConcatInPlaceSafe(left, right) ((unlikely((left) == Py_None) || unlikely((right) == Py_None)) ?\ PyNumber_InPlaceAdd(left, right) : __Pyx_PyUnicode_ConcatInPlace(left, right)) /* KeywordStringCheck.proto */ static int __Pyx_CheckKeywordStrings(PyObject *kw, const char* function_name, int kw_allowed); /* ExtTypeTest.proto */ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /* PyDictContains.proto */ static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObject* dict, int eq) { int result = PyDict_Contains(dict, item); return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); } /* DictGetItem.proto */ #if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); #define __Pyx_PyObject_Dict_GetItem(obj, name)\ (likely(PyDict_CheckExact(obj)) ?\ __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) #else #define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) #define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) #endif /* GetAttr3.proto */ static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); /* PyDictVersioning.proto */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS #define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) #define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ (version_var) = __PYX_GET_DICT_VERSION(dict);\ (cache_var) = (value); #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ (VAR) = __pyx_dict_cached_value;\ } else {\ (VAR) = __pyx_dict_cached_value = (LOOKUP);\ __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ }\ } static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); #else #define __PYX_GET_DICT_VERSION(dict) (0) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); #endif /* GetModuleGlobalName.proto */ #if CYTHON_USE_DICT_VERSIONS #define __Pyx_GetModuleGlobalName(var, name) do {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ } while(0) #define __Pyx_GetModuleGlobalNameUncached(var, name) do {\ PY_UINT64_T __pyx_dict_version;\ PyObject *__pyx_dict_cached_value;\ (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ } while(0) static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); #else #define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) #define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); #endif /* PyFunctionFastCall.proto */ #if CYTHON_FAST_PYCALL #if !CYTHON_VECTORCALL #define __Pyx_PyFunction_FastCall(func, args, nargs)\ __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); #endif #define __Pyx_BUILD_ASSERT_EXPR(cond)\ (sizeof(char [1 - 2*!(cond)]) - 1) #ifndef Py_MEMBER_SIZE #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) #endif #if !CYTHON_VECTORCALL #if PY_VERSION_HEX >= 0x03080000 #include "frameobject.h" #if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API #ifndef Py_BUILD_CORE #define Py_BUILD_CORE 1 #endif #include "internal/pycore_frame.h" #endif #define __Pxy_PyFrame_Initialize_Offsets() #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) #else static size_t __pyx_pyframe_localsplus_offset = 0; #include "frameobject.h" #define __Pxy_PyFrame_Initialize_Offsets()\ ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) #define __Pyx_PyFrame_GetLocalsplus(frame)\ (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) #endif #endif #endif /* PyObjectCall.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif /* PyObjectCallMethO.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); #endif /* PyObjectFastCall.proto */ #define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); /* PyObjectCallNoArg.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); /* PyObjectCallOneArg.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); /* PySequenceContains.proto */ static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { int result = PySequence_Contains(seq, item); return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); } /* RaiseException.proto */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /* UnpackUnboundCMethod.proto */ typedef struct { PyObject *type; PyObject **method_name; PyCFunction func; PyObject *method; int flag; } __Pyx_CachedCFunction; /* CallUnboundCMethod0.proto */ static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self); #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_CallUnboundCMethod0(cfunc, self)\ (likely((cfunc)->func) ?\ (likely((cfunc)->flag == METH_NOARGS) ? (*((cfunc)->func))(self, NULL) :\ (PY_VERSION_HEX >= 0x030600B1 && likely((cfunc)->flag == METH_FASTCALL) ?\ (PY_VERSION_HEX >= 0x030700A0 ?\ (*(__Pyx_PyCFunctionFast)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0) :\ (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0, NULL)) :\ (PY_VERSION_HEX >= 0x030700A0 && (cfunc)->flag == (METH_FASTCALL | METH_KEYWORDS) ?\ (*(__Pyx_PyCFunctionFastWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, &__pyx_empty_tuple, 0, NULL) :\ (likely((cfunc)->flag == (METH_VARARGS | METH_KEYWORDS)) ? ((*(PyCFunctionWithKeywords)(void*)(PyCFunction)(cfunc)->func)(self, __pyx_empty_tuple, NULL)) :\ ((cfunc)->flag == METH_VARARGS ? (*((cfunc)->func))(self, __pyx_empty_tuple) :\ __Pyx__CallUnboundCMethod0(cfunc, self)))))) :\ __Pyx__CallUnboundCMethod0(cfunc, self)) #else #define __Pyx_CallUnboundCMethod0(cfunc, self) __Pyx__CallUnboundCMethod0(cfunc, self) #endif /* SliceObject.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice( PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop, PyObject** py_start, PyObject** py_stop, PyObject** py_slice, int has_cstart, int has_cstop, int wraparound); /* PySequenceMultiply.proto */ #define __Pyx_PySequence_Multiply_Left(mul, seq) __Pyx_PySequence_Multiply(seq, mul) static CYTHON_INLINE PyObject* __Pyx_PySequence_Multiply(PyObject *seq, Py_ssize_t mul); /* decode_bytearray.proto */ static CYTHON_INLINE PyObject* __Pyx_decode_bytearray( PyObject* string, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { char* as_c_string; Py_ssize_t size; #if CYTHON_ASSUME_SAFE_MACROS as_c_string = PyByteArray_AS_STRING(string); size = PyByteArray_GET_SIZE(string); #else if (!(as_c_string = PyByteArray_AsString(string))) return NULL; if ((size = PyByteArray_Size(string)) < 0) return NULL; #endif return __Pyx_decode_c_bytes( as_c_string, size, start, stop, encoding, errors, decode_func); } /* GetItemIntUnicode.proto */ #define __Pyx_GetItemInt_Unicode(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Unicode_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ (PyErr_SetString(PyExc_IndexError, "string index out of range"), (Py_UCS4)-1)) static CYTHON_INLINE Py_UCS4 __Pyx_GetItemInt_Unicode_Fast(PyObject* ustring, Py_ssize_t i, int wraparound, int boundscheck); /* PyUnicode_Substring.proto */ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring( PyObject* text, Py_ssize_t start, Py_ssize_t stop); /* SwapException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #else static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); #endif /* GetTopmostException.proto */ #if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); #endif /* SaveResetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); #else #define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) #define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) #endif /* PyObject_Str.proto */ #define __Pyx_PyObject_Str(obj)\ (likely(PyString_CheckExact(obj)) ? __Pyx_NewRef(obj) : PyObject_Str(obj)) /* Import.proto */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); /* ImportFrom.proto */ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); /* GetAttr.proto */ static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); /* HasAttr.proto */ #if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 #define __Pyx_HasAttr(o, n) PyObject_HasAttrWithError(o, n) #else static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); #endif /* IncludeStructmemberH.proto */ #include /* FixUpExtensionType.proto */ #if CYTHON_USE_TYPE_SPECS static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); #endif /* PyObjectGetMethod.proto */ static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); /* PyObjectCallMethod0.proto */ static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); /* ValidateBasesTuple.proto */ #if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases); #endif /* PyType_Ready.proto */ CYTHON_UNUSED static int __Pyx_PyType_Ready(PyTypeObject *t); /* PyObject_GenericGetAttrNoDict.proto */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr #endif /* PyObject_GenericGetAttr.proto */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr #endif /* SetupReduce.proto */ #if !CYTHON_COMPILING_IN_LIMITED_API static int __Pyx_setup_reduce(PyObject* type_obj); #endif /* SetVTable.proto */ static int __Pyx_SetVtable(PyTypeObject* typeptr , void* vtable); /* GetVTable.proto */ static void* __Pyx_GetVtable(PyTypeObject *type); /* MergeVTables.proto */ #if !CYTHON_COMPILING_IN_LIMITED_API static int __Pyx_MergeVtables(PyTypeObject *type); #endif /* TypeImport.proto */ #ifndef __PYX_HAVE_RT_ImportType_proto_3_0_5 #define __PYX_HAVE_RT_ImportType_proto_3_0_5 #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L #include #endif #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L #define __PYX_GET_STRUCT_ALIGNMENT_3_0_5(s) alignof(s) #else #define __PYX_GET_STRUCT_ALIGNMENT_3_0_5(s) sizeof(void*) #endif enum __Pyx_ImportType_CheckSize_3_0_5 { __Pyx_ImportType_CheckSize_Error_3_0_5 = 0, __Pyx_ImportType_CheckSize_Warn_3_0_5 = 1, __Pyx_ImportType_CheckSize_Ignore_3_0_5 = 2 }; static PyTypeObject *__Pyx_ImportType_3_0_5(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_5 check_size); #endif /* decode_c_string.proto */ static CYTHON_INLINE PyObject* __Pyx_decode_c_string( const char* cstring, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)); /* FetchSharedCythonModule.proto */ static PyObject *__Pyx_FetchSharedCythonABIModule(void); /* FetchCommonType.proto */ #if !CYTHON_USE_TYPE_SPECS static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); #else static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); #endif /* PyMethodNew.proto */ #if CYTHON_COMPILING_IN_LIMITED_API static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; CYTHON_UNUSED_VAR(typ); if (!self) return __Pyx_NewRef(func); typesModule = PyImport_ImportModule("types"); if (!typesModule) return NULL; methodType = PyObject_GetAttrString(typesModule, "MethodType"); Py_DECREF(typesModule); if (!methodType) return NULL; result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); Py_DECREF(methodType); return result; } #elif PY_MAJOR_VERSION >= 3 static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { CYTHON_UNUSED_VAR(typ); if (!self) return __Pyx_NewRef(func); return PyMethod_New(func, self); } #else #define __Pyx_PyMethod_New PyMethod_New #endif /* PyVectorcallFastCallDict.proto */ #if CYTHON_METH_FASTCALL static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); #endif /* CythonFunctionShared.proto */ #define __Pyx_CyFunction_USED #define __Pyx_CYFUNCTION_STATICMETHOD 0x01 #define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 #define __Pyx_CYFUNCTION_CCLASS 0x04 #define __Pyx_CYFUNCTION_COROUTINE 0x08 #define __Pyx_CyFunction_GetClosure(f)\ (((__pyx_CyFunctionObject *) (f))->func_closure) #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_CyFunction_GetClassObj(f)\ (((__pyx_CyFunctionObject *) (f))->func_classobj) #else #define __Pyx_CyFunction_GetClassObj(f)\ ((PyObject*) ((PyCMethodObject *) (f))->mm_class) #endif #define __Pyx_CyFunction_SetClassObj(f, classobj)\ __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) #define __Pyx_CyFunction_Defaults(type, f)\ ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) #define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) typedef struct { #if CYTHON_COMPILING_IN_LIMITED_API PyObject_HEAD PyObject *func; #elif PY_VERSION_HEX < 0x030900B1 PyCFunctionObject func; #else PyCMethodObject func; #endif #if CYTHON_BACKPORT_VECTORCALL __pyx_vectorcallfunc func_vectorcall; #endif #if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API PyObject *func_weakreflist; #endif PyObject *func_dict; PyObject *func_name; PyObject *func_qualname; PyObject *func_doc; PyObject *func_globals; PyObject *func_code; PyObject *func_closure; #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API PyObject *func_classobj; #endif void *defaults; int defaults_pyobjects; size_t defaults_size; // used by FusedFunction for copying defaults int flags; PyObject *defaults_tuple; PyObject *defaults_kwdict; PyObject *(*defaults_getter)(PyObject *); PyObject *func_annotations; PyObject *func_is_coroutine; } __pyx_CyFunctionObject; #undef __Pyx_CyOrPyCFunction_Check #define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) #define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) #define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); #undef __Pyx_IsSameCFunction #define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject *globals, PyObject* code); static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, size_t size, int pyobjects); static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, PyObject *tuple); static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, PyObject *dict); static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, PyObject *dict); static int __pyx_CyFunction_init(PyObject *module); #if CYTHON_METH_FASTCALL static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); #if CYTHON_BACKPORT_VECTORCALL #define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) #else #define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) #endif #endif /* CythonFunction.proto */ static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject *globals, PyObject* code); /* CLineInTraceback.proto */ #ifdef CYTHON_CLINE_IN_TRACEBACK #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) #else static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); #endif /* CodeObjectCache.proto */ #if !CYTHON_COMPILING_IN_LIMITED_API typedef struct { PyCodeObject* code_object; int code_line; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); #endif /* AddTraceback.proto */ static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /* GCCDiagnostics.proto */ #if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #define __Pyx_HAS_GCC_DIAGNOSTIC #endif /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); /* CIntFromPy.proto */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE enum llhttp_method __Pyx_PyInt_As_enum__llhttp_method(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint8_t(uint8_t value); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* FormatTypeName.proto */ #if CYTHON_COMPILING_IN_LIMITED_API typedef PyObject *__Pyx_TypeName; #define __Pyx_FMT_TYPENAME "%U" static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); #define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) #else typedef const char *__Pyx_TypeName; #define __Pyx_FMT_TYPENAME "%.200s" #define __Pyx_PyType_GetName(tp) ((tp)->tp_name) #define __Pyx_DECREF_TypeName(obj) #endif /* FastTypeChecks.proto */ #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) #define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); #else #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) #define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) #define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) #endif #define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) #define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) /* PyObjectCall2Args.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); /* PyObjectCallMethod1.proto */ static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg); /* CoroutineBase.proto */ struct __pyx_CoroutineObject; typedef PyObject *(*__pyx_coroutine_body_t)(struct __pyx_CoroutineObject *, PyThreadState *, PyObject *); #if CYTHON_USE_EXC_INFO_STACK #define __Pyx_ExcInfoStruct _PyErr_StackItem #else typedef struct { PyObject *exc_type; PyObject *exc_value; PyObject *exc_traceback; } __Pyx_ExcInfoStruct; #endif typedef struct __pyx_CoroutineObject { PyObject_HEAD __pyx_coroutine_body_t body; PyObject *closure; __Pyx_ExcInfoStruct gi_exc_state; PyObject *gi_weakreflist; PyObject *classobj; PyObject *yieldfrom; PyObject *gi_name; PyObject *gi_qualname; PyObject *gi_modulename; PyObject *gi_code; PyObject *gi_frame; int resume_label; char is_running; } __pyx_CoroutineObject; static __pyx_CoroutineObject *__Pyx__Coroutine_New( PyTypeObject *type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, PyObject *name, PyObject *qualname, PyObject *module_name); static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit( __pyx_CoroutineObject *gen, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, PyObject *name, PyObject *qualname, PyObject *module_name); static CYTHON_INLINE void __Pyx_Coroutine_ExceptionClear(__Pyx_ExcInfoStruct *self); static int __Pyx_Coroutine_clear(PyObject *self); static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value); static PyObject *__Pyx_Coroutine_Close(PyObject *self); static PyObject *__Pyx_Coroutine_Throw(PyObject *gen, PyObject *args); #if CYTHON_USE_EXC_INFO_STACK #define __Pyx_Coroutine_SwapException(self) #define __Pyx_Coroutine_ResetAndClearException(self) __Pyx_Coroutine_ExceptionClear(&(self)->gi_exc_state) #else #define __Pyx_Coroutine_SwapException(self) {\ __Pyx_ExceptionSwap(&(self)->gi_exc_state.exc_type, &(self)->gi_exc_state.exc_value, &(self)->gi_exc_state.exc_traceback);\ __Pyx_Coroutine_ResetFrameBackpointer(&(self)->gi_exc_state);\ } #define __Pyx_Coroutine_ResetAndClearException(self) {\ __Pyx_ExceptionReset((self)->gi_exc_state.exc_type, (self)->gi_exc_state.exc_value, (self)->gi_exc_state.exc_traceback);\ (self)->gi_exc_state.exc_type = (self)->gi_exc_state.exc_value = (self)->gi_exc_state.exc_traceback = NULL;\ } #endif #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyGen_FetchStopIterationValue(pvalue)\ __Pyx_PyGen__FetchStopIterationValue(__pyx_tstate, pvalue) #else #define __Pyx_PyGen_FetchStopIterationValue(pvalue)\ __Pyx_PyGen__FetchStopIterationValue(__Pyx_PyThreadState_Current, pvalue) #endif static int __Pyx_PyGen__FetchStopIterationValue(PyThreadState *tstate, PyObject **pvalue); static CYTHON_INLINE void __Pyx_Coroutine_ResetFrameBackpointer(__Pyx_ExcInfoStruct *exc_state); /* PatchModuleWithCoroutine.proto */ static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code); /* PatchGeneratorABC.proto */ static int __Pyx_patch_abc(void); /* Generator.proto */ #define __Pyx_Generator_USED #define __Pyx_Generator_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_GeneratorType) #define __Pyx_Generator_New(body, code, closure, name, qualname, module_name)\ __Pyx__Coroutine_New(__pyx_GeneratorType, body, code, closure, name, qualname, module_name) static PyObject *__Pyx_Generator_Next(PyObject *self); static int __pyx_Generator_init(PyObject *module); /* CheckBinaryVersion.proto */ static unsigned long __Pyx_get_runtime_version(void); static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); /* InitStrings.proto */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /* #### Code section: module_declarations ### */ static CYTHON_INLINE double __pyx_f_7cpython_7complex_7complex_4real_real(PyComplexObject *__pyx_v_self); /* proto*/ static CYTHON_INLINE double __pyx_f_7cpython_7complex_7complex_4imag_imag(PyComplexObject *__pyx_v_self); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__init(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, enum llhttp_type __pyx_v_mode, PyObject *__pyx_v_protocol, PyObject *__pyx_v_loop, int __pyx_v_limit, struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init *__pyx_optional_args); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__process_header(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_field(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, char *__pyx_v_at, size_t __pyx_v_length); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_value(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, char *__pyx_v_at, size_t __pyx_v_length); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_headers_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_message_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_header(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_status_complete(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_17HttpRequestParser__on_status_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_18HttpResponseParser__on_status_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self); /* proto*/ /* Module declarations from "cpython.version" */ /* Module declarations from "__builtin__" */ /* Module declarations from "cpython.type" */ /* Module declarations from "libc.string" */ /* Module declarations from "libc.stdio" */ /* Module declarations from "cpython.object" */ /* Module declarations from "cpython.ref" */ /* Module declarations from "cpython.exc" */ /* Module declarations from "cpython.module" */ /* Module declarations from "cpython.mem" */ /* Module declarations from "cpython.tuple" */ /* Module declarations from "cpython.list" */ /* Module declarations from "cpython.sequence" */ /* Module declarations from "cpython.mapping" */ /* Module declarations from "cpython.iterator" */ /* Module declarations from "cpython.number" */ /* Module declarations from "cpython.int" */ /* Module declarations from "__builtin__" */ /* Module declarations from "cpython.bool" */ /* Module declarations from "cpython.long" */ /* Module declarations from "cpython.float" */ /* Module declarations from "__builtin__" */ /* Module declarations from "cpython.complex" */ /* Module declarations from "cpython.string" */ /* Module declarations from "cpython.unicode" */ /* Module declarations from "cpython.pyport" */ /* Module declarations from "cpython.dict" */ /* Module declarations from "cpython.instance" */ /* Module declarations from "cpython.function" */ /* Module declarations from "cpython.method" */ /* Module declarations from "cpython.weakref" */ /* Module declarations from "cpython.getargs" */ /* Module declarations from "cpython.pythread" */ /* Module declarations from "cpython.pystate" */ /* Module declarations from "cpython.cobject" */ /* Module declarations from "cpython.oldbuffer" */ /* Module declarations from "cpython.set" */ /* Module declarations from "cpython.buffer" */ /* Module declarations from "cpython.bytes" */ /* Module declarations from "cpython.pycapsule" */ /* Module declarations from "cpython.contextvars" */ /* Module declarations from "cpython" */ /* Module declarations from "libc.limits" */ /* Module declarations from "cython" */ /* Module declarations from "aiohttp" */ /* Module declarations from "libc.stdint" */ /* Module declarations from "aiohttp._cparser" */ /* Module declarations from "aiohttp._find_header" */ /* Module declarations from "aiohttp._http_parser" */ static PyObject *__pyx_v_7aiohttp_12_http_parser_headers = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_URL = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_URL_build = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_CIMultiDict = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_HttpVersion = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_HttpVersion10 = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_HttpVersion11 = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1 = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_StreamReader = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_DeflateBuffer = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser__http_method = 0; static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_extend(PyObject *, char const *, size_t); /*proto*/ static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_http_method_str(int); /*proto*/ static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_find_header(PyObject *); /*proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser__new_request_message(PyObject *, PyObject *, PyObject *, PyObject *, PyObject *, int, PyObject *, int, int, PyObject *); /*proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser__new_response_message(PyObject *, int, PyObject *, PyObject *, PyObject *, int, PyObject *, int, int); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_message_begin(llhttp_t *); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_url(llhttp_t *, char const *, size_t); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_status(llhttp_t *, char const *, size_t); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_header_field(llhttp_t *, char const *, size_t); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_header_value(llhttp_t *, char const *, size_t); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_headers_complete(llhttp_t *); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_body(llhttp_t *, char const *, size_t); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_message_complete(llhttp_t *); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_header(llhttp_t *); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_complete(llhttp_t *); /*proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_parser_error_from_errno(llhttp_t *, PyObject *, PyObject *); /*proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage__set_state(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *, PyObject *); /*proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawResponseMessage__set_state(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *, PyObject *); /*proto*/ /* #### Code section: typeinfo ### */ /* #### Code section: before_global_var ### */ #define __Pyx_MODULE_NAME "aiohttp._http_parser" extern int __pyx_module_is_main_aiohttp___http_parser; int __pyx_module_is_main_aiohttp___http_parser = 0; /* Implementation of "aiohttp._http_parser" */ /* #### Code section: global_var ### */ static PyObject *__pyx_builtin_range; static PyObject *__pyx_builtin_MemoryError; static PyObject *__pyx_builtin_TypeError; static PyObject *__pyx_builtin_BaseException; /* #### Code section: string_decls ### */ static const char __pyx_k_[] = "="; static const char __pyx_k_i[] = "i"; static const char __pyx_k_r[] = "{}:\n\n {!r}\n {}"; static const char __pyx_k_TE[] = "TE"; static const char __pyx_k__2[] = ", "; static const char __pyx_k__3[] = ")>"; static const char __pyx_k__4[] = "\r\n"; static const char __pyx_k__6[] = " "; static const char __pyx_k__7[] = "^"; static const char __pyx_k__8[] = ""; static const char __pyx_k__9[] = "?"; static const char __pyx_k_br[] = "br"; static const char __pyx_k_ex[] = "ex"; static const char __pyx_k_gc[] = "gc"; static const char __pyx_k_nb[] = "nb"; static const char __pyx_k_AGE[] = "AGE"; static const char __pyx_k_URI[] = "URI"; static const char __pyx_k_URL[] = "URL"; static const char __pyx_k_VIA[] = "VIA"; static const char __pyx_k__10[] = "#"; static const char __pyx_k__12[] = "."; static const char __pyx_k_add[] = "add"; static const char __pyx_k_all[] = "__all__"; static const char __pyx_k_dct[] = "dct"; static const char __pyx_k_new[] = "__new__"; static const char __pyx_k_ret[] = "ret"; static const char __pyx_k_url[] = "url"; static const char __pyx_k_val[] = "val"; static const char __pyx_k_DATE[] = "DATE"; static const char __pyx_k_ETAG[] = "ETAG"; static const char __pyx_k_FROM[] = "FROM"; static const char __pyx_k_HOST[] = "HOST"; static const char __pyx_k_LINK[] = "LINK"; static const char __pyx_k_VARY[] = "VARY"; static const char __pyx_k_args[] = "args"; static const char __pyx_k_code[] = "code"; static const char __pyx_k_data[] = "data"; static const char __pyx_k_desc[] = "desc"; static const char __pyx_k_dict[] = "__dict__"; static const char __pyx_k_gzip[] = "gzip"; static const char __pyx_k_hdrs[] = "hdrs"; static const char __pyx_k_loop[] = "loop"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_name[] = "__name__"; static const char __pyx_k_path[] = "path"; static const char __pyx_k_self[] = "self"; static const char __pyx_k_send[] = "send"; static const char __pyx_k_test[] = "__test__"; static const char __pyx_k_yarl[] = "yarl"; static const char __pyx_k_ALLOW[] = "ALLOW"; static const char __pyx_k_DEBUG[] = "DEBUG"; static const char __pyx_k_RANGE[] = "RANGE"; static const char __pyx_k_URL_2[] = "_URL"; static const char __pyx_k_after[] = "after"; static const char __pyx_k_build[] = "build"; static const char __pyx_k_close[] = "close"; static const char __pyx_k_errno[] = "errno"; static const char __pyx_k_error[] = "error"; static const char __pyx_k_limit[] = "limit"; static const char __pyx_k_lower[] = "lower"; static const char __pyx_k_range[] = "range"; static const char __pyx_k_split[] = "split"; static const char __pyx_k_state[] = "state"; static const char __pyx_k_throw[] = "throw"; static const char __pyx_k_timer[] = "timer"; static const char __pyx_k_ACCEPT[] = "ACCEPT"; static const char __pyx_k_COOKIE[] = "COOKIE"; static const char __pyx_k_DIGEST[] = "DIGEST"; static const char __pyx_k_EXPECT[] = "EXPECT"; static const char __pyx_k_ORIGIN[] = "ORIGIN"; static const char __pyx_k_PRAGMA[] = "PRAGMA"; static const char __pyx_k_SERVER[] = "SERVER"; static const char __pyx_k_before[] = "before"; static const char __pyx_k_dict_2[] = "_dict"; static const char __pyx_k_enable[] = "enable"; static const char __pyx_k_format[] = "format"; static const char __pyx_k_import[] = "__import__"; static const char __pyx_k_method[] = "method"; static const char __pyx_k_pickle[] = "pickle"; static const char __pyx_k_reason[] = "reason"; static const char __pyx_k_reduce[] = "__reduce__"; static const char __pyx_k_rsplit[] = "rsplit"; static const char __pyx_k_update[] = "update"; static const char __pyx_k_EXPIRES[] = "EXPIRES"; static const char __pyx_k_REFERER[] = "REFERER"; static const char __pyx_k_TRAILER[] = "TRAILER"; static const char __pyx_k_UPGRADE[] = "UPGRADE"; static const char __pyx_k_WARNING[] = "WARNING"; static const char __pyx_k_after_b[] = "after_b"; static const char __pyx_k_aiohttp[] = "aiohttp"; static const char __pyx_k_chunked[] = "chunked"; static const char __pyx_k_deflate[] = "deflate"; static const char __pyx_k_disable[] = "disable"; static const char __pyx_k_encoded[] = "encoded"; static const char __pyx_k_genexpr[] = "genexpr"; static const char __pyx_k_headers[] = "headers"; static const char __pyx_k_pointer[] = "pointer"; static const char __pyx_k_replace[] = "_replace"; static const char __pyx_k_streams[] = "streams"; static const char __pyx_k_unknown[] = ""; static const char __pyx_k_upgrade[] = "upgrade"; static const char __pyx_k_version[] = "version"; static const char __pyx_k_IF_MATCH[] = "IF_MATCH"; static const char __pyx_k_IF_RANGE[] = "IF_RANGE"; static const char __pyx_k_LOCATION[] = "LOCATION"; static const char __pyx_k_data_len[] = "data_len"; static const char __pyx_k_feed_eof[] = "feed_eof"; static const char __pyx_k_fragment[] = "fragment"; static const char __pyx_k_getstate[] = "__getstate__"; static const char __pyx_k_messages[] = "messages"; static const char __pyx_k_protocol[] = "protocol"; static const char __pyx_k_pyx_type[] = "__pyx_type"; static const char __pyx_k_setstate[] = "__setstate__"; static const char __pyx_k_FORWARDED[] = "FORWARDED"; static const char __pyx_k_TypeError[] = "TypeError"; static const char __pyx_k_authority[] = "authority"; static const char __pyx_k_feed_data[] = "feed_data"; static const char __pyx_k_isenabled[] = "isenabled"; static const char __pyx_k_multidict[] = "multidict"; static const char __pyx_k_pyx_state[] = "__pyx_state"; static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; static const char __pyx_k_CONNECTION[] = "CONNECTION"; static const char __pyx_k_KEEP_ALIVE[] = "KEEP_ALIVE"; static const char __pyx_k_SET_COOKIE[] = "SET_COOKIE"; static const char __pyx_k_USER_AGENT[] = "USER_AGENT"; static const char __pyx_k_pyx_result[] = "__pyx_result"; static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; static const char __pyx_k_CIMultiDict[] = "CIMultiDict"; static const char __pyx_k_CONTENT_MD5[] = "CONTENT_MD5"; static const char __pyx_k_DESTINATION[] = "DESTINATION"; static const char __pyx_k_HttpVersion[] = "HttpVersion"; static const char __pyx_k_LineTooLong[] = "LineTooLong"; static const char __pyx_k_MemoryError[] = "MemoryError"; static const char __pyx_k_PickleError[] = "PickleError"; static const char __pyx_k_RETRY_AFTER[] = "RETRY_AFTER"; static const char __pyx_k_WANT_DIGEST[] = "WANT_DIGEST"; static const char __pyx_k_compression[] = "compression"; static const char __pyx_k_http_parser[] = "http_parser"; static const char __pyx_k_http_writer[] = "http_writer"; static const char __pyx_k_max_headers[] = "max_headers"; static const char __pyx_k_raw_headers[] = "raw_headers"; static const char __pyx_k_CONTENT_TYPE[] = "CONTENT_TYPE"; static const char __pyx_k_MAX_FORWARDS[] = "MAX_FORWARDS"; static const char __pyx_k_StreamReader[] = "StreamReader"; static const char __pyx_k_is_coroutine[] = "_is_coroutine"; static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; static const char __pyx_k_query_string[] = "query_string"; static const char __pyx_k_set_upgraded[] = "set_upgraded"; static const char __pyx_k_should_close[] = "should_close"; static const char __pyx_k_stringsource[] = ""; static const char __pyx_k_use_setstate[] = "use_setstate"; static const char __pyx_k_ACCEPT_RANGES[] = "ACCEPT_RANGES"; static const char __pyx_k_AUTHORIZATION[] = "AUTHORIZATION"; static const char __pyx_k_BadStatusLine[] = "BadStatusLine"; static const char __pyx_k_BaseException[] = "BaseException"; static const char __pyx_k_CACHE_CONTROL[] = "CACHE_CONTROL"; static const char __pyx_k_CIMultiDict_2[] = "_CIMultiDict"; static const char __pyx_k_CONTENT_RANGE[] = "CONTENT_RANGE"; static const char __pyx_k_DeflateBuffer[] = "DeflateBuffer"; static const char __pyx_k_EMPTY_PAYLOAD[] = "EMPTY_PAYLOAD"; static const char __pyx_k_HttpVersion10[] = "HttpVersion10"; static const char __pyx_k_HttpVersion11[] = "HttpVersion11"; static const char __pyx_k_HttpVersion_2[] = "_HttpVersion"; static const char __pyx_k_IF_NONE_MATCH[] = "IF_NONE_MATCH"; static const char __pyx_k_InvalidHeader[] = "InvalidHeader"; static const char __pyx_k_LAST_EVENT_ID[] = "LAST_EVENT_ID"; static const char __pyx_k_LAST_MODIFIED[] = "LAST_MODIFIED"; static const char __pyx_k_max_line_size[] = "max_line_size"; static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; static const char __pyx_k_set_exception[] = "set_exception"; static const char __pyx_k_ACCEPT_CHARSET[] = "ACCEPT_CHARSET"; static const char __pyx_k_BadHttpMessage[] = "BadHttpMessage"; static const char __pyx_k_CONTENT_LENGTH[] = "CONTENT_LENGTH"; static const char __pyx_k_StreamReader_2[] = "_StreamReader"; static const char __pyx_k_max_field_size[] = "max_field_size"; static const char __pyx_k_read_until_eof[] = "read_until_eof"; static const char __pyx_k_ACCEPT_ENCODING[] = "ACCEPT_ENCODING"; static const char __pyx_k_ACCEPT_LANGUAGE[] = "ACCEPT_LANGUAGE"; static const char __pyx_k_DeflateBuffer_2[] = "_DeflateBuffer"; static const char __pyx_k_EMPTY_PAYLOAD_2[] = "_EMPTY_PAYLOAD"; static const char __pyx_k_HttpVersion10_2[] = "_HttpVersion10"; static const char __pyx_k_HttpVersion11_2[] = "_HttpVersion11"; static const char __pyx_k_InvalidURLError[] = "InvalidURLError"; static const char __pyx_k_X_FORWARDED_FOR[] = "X_FORWARDED_FOR"; static const char __pyx_k_aiohttp_helpers[] = "aiohttp.helpers"; static const char __pyx_k_auto_decompress[] = "auto_decompress"; static const char __pyx_k_http_exceptions[] = "http_exceptions"; static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; static const char __pyx_k_CIMultiDictProxy[] = "CIMultiDictProxy"; static const char __pyx_k_CONTENT_ENCODING[] = "CONTENT_ENCODING"; static const char __pyx_k_CONTENT_LANGUAGE[] = "CONTENT_LANGUAGE"; static const char __pyx_k_CONTENT_LOCATION[] = "CONTENT_LOCATION"; static const char __pyx_k_WWW_AUTHENTICATE[] = "WWW_AUTHENTICATE"; static const char __pyx_k_X_FORWARDED_HOST[] = "X_FORWARDED_HOST"; static const char __pyx_k_HttpRequestParser[] = "HttpRequestParser"; static const char __pyx_k_IF_MODIFIED_SINCE[] = "IF_MODIFIED_SINCE"; static const char __pyx_k_RawRequestMessage[] = "__pyx_d); Py_CLEAR(clear_module_state->__pyx_b); Py_CLEAR(clear_module_state->__pyx_cython_runtime); Py_CLEAR(clear_module_state->__pyx_empty_tuple); Py_CLEAR(clear_module_state->__pyx_empty_bytes); Py_CLEAR(clear_module_state->__pyx_empty_unicode); #ifdef __Pyx_CyFunction_USED Py_CLEAR(clear_module_state->__pyx_CyFunctionType); #endif #ifdef __Pyx_FusedFunction_USED Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); #endif Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4type_type); Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4bool_bool); Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_7complex_complex); Py_CLEAR(clear_module_state->__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage); Py_CLEAR(clear_module_state->__pyx_type_7aiohttp_12_http_parser_RawRequestMessage); Py_CLEAR(clear_module_state->__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage); Py_CLEAR(clear_module_state->__pyx_type_7aiohttp_12_http_parser_RawResponseMessage); Py_CLEAR(clear_module_state->__pyx_ptype_7aiohttp_12_http_parser_HttpParser); Py_CLEAR(clear_module_state->__pyx_type_7aiohttp_12_http_parser_HttpParser); Py_CLEAR(clear_module_state->__pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser); Py_CLEAR(clear_module_state->__pyx_type_7aiohttp_12_http_parser_HttpRequestParser); Py_CLEAR(clear_module_state->__pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser); Py_CLEAR(clear_module_state->__pyx_type_7aiohttp_12_http_parser_HttpResponseParser); Py_CLEAR(clear_module_state->__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct__genexpr); Py_CLEAR(clear_module_state->__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct__genexpr); Py_CLEAR(clear_module_state->__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr); Py_CLEAR(clear_module_state->__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr); Py_CLEAR(clear_module_state->__pyx_kp_u_); Py_CLEAR(clear_module_state->__pyx_n_s_ACCEPT); Py_CLEAR(clear_module_state->__pyx_n_s_ACCEPT_CHARSET); Py_CLEAR(clear_module_state->__pyx_n_s_ACCEPT_ENCODING); Py_CLEAR(clear_module_state->__pyx_n_s_ACCEPT_LANGUAGE); Py_CLEAR(clear_module_state->__pyx_n_s_ACCEPT_RANGES); Py_CLEAR(clear_module_state->__pyx_n_s_ACCESS_CONTROL_ALLOW_CREDENTIALS); Py_CLEAR(clear_module_state->__pyx_n_s_ACCESS_CONTROL_ALLOW_HEADERS); Py_CLEAR(clear_module_state->__pyx_n_s_ACCESS_CONTROL_ALLOW_METHODS); Py_CLEAR(clear_module_state->__pyx_n_s_ACCESS_CONTROL_ALLOW_ORIGIN); Py_CLEAR(clear_module_state->__pyx_n_s_ACCESS_CONTROL_EXPOSE_HEADERS); Py_CLEAR(clear_module_state->__pyx_n_s_ACCESS_CONTROL_MAX_AGE); Py_CLEAR(clear_module_state->__pyx_n_s_ACCESS_CONTROL_REQUEST_HEADERS); Py_CLEAR(clear_module_state->__pyx_n_s_ACCESS_CONTROL_REQUEST_METHOD); Py_CLEAR(clear_module_state->__pyx_n_s_AGE); Py_CLEAR(clear_module_state->__pyx_n_s_ALLOW); Py_CLEAR(clear_module_state->__pyx_n_s_AUTHORIZATION); Py_CLEAR(clear_module_state->__pyx_n_s_BadHttpMessage); Py_CLEAR(clear_module_state->__pyx_n_s_BadStatusLine); Py_CLEAR(clear_module_state->__pyx_n_s_BaseException); Py_CLEAR(clear_module_state->__pyx_n_s_CACHE_CONTROL); Py_CLEAR(clear_module_state->__pyx_n_s_CIMultiDict); Py_CLEAR(clear_module_state->__pyx_n_s_CIMultiDictProxy); Py_CLEAR(clear_module_state->__pyx_n_s_CIMultiDictProxy_2); Py_CLEAR(clear_module_state->__pyx_n_s_CIMultiDict_2); Py_CLEAR(clear_module_state->__pyx_n_s_CONNECTION); Py_CLEAR(clear_module_state->__pyx_n_s_CONTENT_DISPOSITION); Py_CLEAR(clear_module_state->__pyx_n_s_CONTENT_ENCODING); Py_CLEAR(clear_module_state->__pyx_n_s_CONTENT_LANGUAGE); Py_CLEAR(clear_module_state->__pyx_n_s_CONTENT_LENGTH); Py_CLEAR(clear_module_state->__pyx_n_s_CONTENT_LOCATION); Py_CLEAR(clear_module_state->__pyx_n_s_CONTENT_MD5); Py_CLEAR(clear_module_state->__pyx_n_s_CONTENT_RANGE); Py_CLEAR(clear_module_state->__pyx_n_s_CONTENT_TRANSFER_ENCODING); Py_CLEAR(clear_module_state->__pyx_n_s_CONTENT_TYPE); Py_CLEAR(clear_module_state->__pyx_n_s_COOKIE); Py_CLEAR(clear_module_state->__pyx_n_s_ContentLengthError); Py_CLEAR(clear_module_state->__pyx_n_s_DATE); Py_CLEAR(clear_module_state->__pyx_n_s_DEBUG); Py_CLEAR(clear_module_state->__pyx_n_s_DESTINATION); Py_CLEAR(clear_module_state->__pyx_n_s_DIGEST); Py_CLEAR(clear_module_state->__pyx_n_s_DeflateBuffer); Py_CLEAR(clear_module_state->__pyx_n_s_DeflateBuffer_2); Py_CLEAR(clear_module_state->__pyx_n_s_EMPTY_PAYLOAD); Py_CLEAR(clear_module_state->__pyx_n_s_EMPTY_PAYLOAD_2); Py_CLEAR(clear_module_state->__pyx_n_s_ETAG); Py_CLEAR(clear_module_state->__pyx_n_s_EXPECT); Py_CLEAR(clear_module_state->__pyx_n_s_EXPIRES); Py_CLEAR(clear_module_state->__pyx_n_s_FORWARDED); Py_CLEAR(clear_module_state->__pyx_n_s_FROM); Py_CLEAR(clear_module_state->__pyx_n_s_HOST); Py_CLEAR(clear_module_state->__pyx_kp_u_Header_name_is_too_long); Py_CLEAR(clear_module_state->__pyx_kp_u_Header_value_is_too_long); Py_CLEAR(clear_module_state->__pyx_n_s_HttpParser___reduce_cython); Py_CLEAR(clear_module_state->__pyx_n_s_HttpParser___setstate_cython); Py_CLEAR(clear_module_state->__pyx_n_s_HttpParser_feed_data); Py_CLEAR(clear_module_state->__pyx_n_s_HttpParser_feed_eof); Py_CLEAR(clear_module_state->__pyx_n_s_HttpParser_set_upgraded); Py_CLEAR(clear_module_state->__pyx_n_s_HttpRequestParser); Py_CLEAR(clear_module_state->__pyx_n_u_HttpRequestParser); Py_CLEAR(clear_module_state->__pyx_n_s_HttpRequestParser___reduce_cytho); Py_CLEAR(clear_module_state->__pyx_n_s_HttpRequestParser___setstate_cyt); Py_CLEAR(clear_module_state->__pyx_n_s_HttpResponseParser); Py_CLEAR(clear_module_state->__pyx_n_u_HttpResponseParser); Py_CLEAR(clear_module_state->__pyx_n_s_HttpResponseParser___reduce_cyth); Py_CLEAR(clear_module_state->__pyx_n_s_HttpResponseParser___setstate_cy); Py_CLEAR(clear_module_state->__pyx_n_s_HttpVersion); Py_CLEAR(clear_module_state->__pyx_n_s_HttpVersion10); Py_CLEAR(clear_module_state->__pyx_n_s_HttpVersion10_2); Py_CLEAR(clear_module_state->__pyx_n_s_HttpVersion11); Py_CLEAR(clear_module_state->__pyx_n_s_HttpVersion11_2); Py_CLEAR(clear_module_state->__pyx_n_s_HttpVersion_2); Py_CLEAR(clear_module_state->__pyx_n_s_IF_MATCH); Py_CLEAR(clear_module_state->__pyx_n_s_IF_MODIFIED_SINCE); Py_CLEAR(clear_module_state->__pyx_n_s_IF_NONE_MATCH); Py_CLEAR(clear_module_state->__pyx_n_s_IF_RANGE); Py_CLEAR(clear_module_state->__pyx_n_s_IF_UNMODIFIED_SINCE); Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); Py_CLEAR(clear_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2); Py_CLEAR(clear_module_state->__pyx_n_s_InvalidHeader); Py_CLEAR(clear_module_state->__pyx_n_s_InvalidURLError); Py_CLEAR(clear_module_state->__pyx_n_s_KEEP_ALIVE); Py_CLEAR(clear_module_state->__pyx_n_s_LAST_EVENT_ID); Py_CLEAR(clear_module_state->__pyx_n_s_LAST_MODIFIED); Py_CLEAR(clear_module_state->__pyx_n_s_LINK); Py_CLEAR(clear_module_state->__pyx_n_s_LOCATION); Py_CLEAR(clear_module_state->__pyx_n_s_LineTooLong); Py_CLEAR(clear_module_state->__pyx_n_s_MAX_FORWARDS); Py_CLEAR(clear_module_state->__pyx_n_s_MemoryError); Py_CLEAR(clear_module_state->__pyx_kp_u_Not_enough_data_for_satisfy_cont); Py_CLEAR(clear_module_state->__pyx_kp_u_Not_enough_data_for_satisfy_tran); Py_CLEAR(clear_module_state->__pyx_n_s_ORIGIN); Py_CLEAR(clear_module_state->__pyx_n_s_PRAGMA); Py_CLEAR(clear_module_state->__pyx_n_s_PROXY_AUTHENTICATE); Py_CLEAR(clear_module_state->__pyx_n_s_PROXY_AUTHORIZATION); Py_CLEAR(clear_module_state->__pyx_n_s_PayloadEncodingError); Py_CLEAR(clear_module_state->__pyx_n_s_PickleError); Py_CLEAR(clear_module_state->__pyx_n_s_RANGE); Py_CLEAR(clear_module_state->__pyx_n_s_REFERER); Py_CLEAR(clear_module_state->__pyx_n_s_RETRY_AFTER); Py_CLEAR(clear_module_state->__pyx_kp_u_RawRequestMessage); Py_CLEAR(clear_module_state->__pyx_n_s_RawRequestMessage_2); Py_CLEAR(clear_module_state->__pyx_n_u_RawRequestMessage_2); Py_CLEAR(clear_module_state->__pyx_n_s_RawRequestMessage___reduce_cytho); Py_CLEAR(clear_module_state->__pyx_n_s_RawRequestMessage___setstate_cyt); Py_CLEAR(clear_module_state->__pyx_n_s_RawRequestMessage__replace); Py_CLEAR(clear_module_state->__pyx_kp_u_RawResponseMessage); Py_CLEAR(clear_module_state->__pyx_n_s_RawResponseMessage_2); Py_CLEAR(clear_module_state->__pyx_n_u_RawResponseMessage_2); Py_CLEAR(clear_module_state->__pyx_n_s_RawResponseMessage___reduce_cyth); Py_CLEAR(clear_module_state->__pyx_n_s_RawResponseMessage___setstate_cy); Py_CLEAR(clear_module_state->__pyx_n_s_SEC_WEBSOCKET_ACCEPT); Py_CLEAR(clear_module_state->__pyx_n_s_SEC_WEBSOCKET_EXTENSIONS); Py_CLEAR(clear_module_state->__pyx_n_s_SEC_WEBSOCKET_KEY); Py_CLEAR(clear_module_state->__pyx_n_s_SEC_WEBSOCKET_KEY1); Py_CLEAR(clear_module_state->__pyx_n_s_SEC_WEBSOCKET_PROTOCOL); Py_CLEAR(clear_module_state->__pyx_n_s_SEC_WEBSOCKET_VERSION); Py_CLEAR(clear_module_state->__pyx_n_s_SERVER); Py_CLEAR(clear_module_state->__pyx_n_s_SET_COOKIE); Py_CLEAR(clear_module_state->__pyx_kp_u_Status_line_is_too_long); Py_CLEAR(clear_module_state->__pyx_n_s_StreamReader); Py_CLEAR(clear_module_state->__pyx_n_s_StreamReader_2); Py_CLEAR(clear_module_state->__pyx_n_s_TE); Py_CLEAR(clear_module_state->__pyx_n_s_TRAILER); Py_CLEAR(clear_module_state->__pyx_n_s_TRANSFER_ENCODING); Py_CLEAR(clear_module_state->__pyx_n_s_TransferEncodingError); Py_CLEAR(clear_module_state->__pyx_n_s_TypeError); Py_CLEAR(clear_module_state->__pyx_n_s_UPGRADE); Py_CLEAR(clear_module_state->__pyx_n_s_URI); Py_CLEAR(clear_module_state->__pyx_n_s_URL); Py_CLEAR(clear_module_state->__pyx_n_s_URL_2); Py_CLEAR(clear_module_state->__pyx_n_s_USER_AGENT); Py_CLEAR(clear_module_state->__pyx_n_s_VARY); Py_CLEAR(clear_module_state->__pyx_n_s_VIA); Py_CLEAR(clear_module_state->__pyx_n_s_WANT_DIGEST); Py_CLEAR(clear_module_state->__pyx_n_s_WARNING); Py_CLEAR(clear_module_state->__pyx_n_s_WWW_AUTHENTICATE); Py_CLEAR(clear_module_state->__pyx_n_s_X_FORWARDED_FOR); Py_CLEAR(clear_module_state->__pyx_n_s_X_FORWARDED_HOST); Py_CLEAR(clear_module_state->__pyx_n_s_X_FORWARDED_PROTO); Py_CLEAR(clear_module_state->__pyx_kp_u__10); Py_CLEAR(clear_module_state->__pyx_kp_u__12); Py_CLEAR(clear_module_state->__pyx_kp_u__2); Py_CLEAR(clear_module_state->__pyx_kp_u__3); Py_CLEAR(clear_module_state->__pyx_kp_b__4); Py_CLEAR(clear_module_state->__pyx_kp_u__6); Py_CLEAR(clear_module_state->__pyx_kp_u__7); Py_CLEAR(clear_module_state->__pyx_n_s__8); Py_CLEAR(clear_module_state->__pyx_kp_b__8); Py_CLEAR(clear_module_state->__pyx_kp_u__8); Py_CLEAR(clear_module_state->__pyx_n_s__9); Py_CLEAR(clear_module_state->__pyx_kp_u__9); Py_CLEAR(clear_module_state->__pyx_n_s_add); Py_CLEAR(clear_module_state->__pyx_n_s_after); Py_CLEAR(clear_module_state->__pyx_n_s_after_b); Py_CLEAR(clear_module_state->__pyx_n_s_aiohttp); Py_CLEAR(clear_module_state->__pyx_n_s_aiohttp__http_parser); Py_CLEAR(clear_module_state->__pyx_kp_s_aiohttp__http_parser_pyx); Py_CLEAR(clear_module_state->__pyx_n_s_aiohttp_helpers); Py_CLEAR(clear_module_state->__pyx_n_s_all); Py_CLEAR(clear_module_state->__pyx_n_s_args); Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); Py_CLEAR(clear_module_state->__pyx_n_s_authority); Py_CLEAR(clear_module_state->__pyx_n_s_auto_decompress); Py_CLEAR(clear_module_state->__pyx_n_s_before); Py_CLEAR(clear_module_state->__pyx_n_s_begin_http_chunk_receiving); Py_CLEAR(clear_module_state->__pyx_n_u_br); Py_CLEAR(clear_module_state->__pyx_n_s_build); Py_CLEAR(clear_module_state->__pyx_n_s_chunked); Py_CLEAR(clear_module_state->__pyx_n_u_chunked); Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); Py_CLEAR(clear_module_state->__pyx_n_s_close); Py_CLEAR(clear_module_state->__pyx_n_s_code); Py_CLEAR(clear_module_state->__pyx_n_u_code); Py_CLEAR(clear_module_state->__pyx_n_s_compression); Py_CLEAR(clear_module_state->__pyx_n_u_compression); Py_CLEAR(clear_module_state->__pyx_n_s_data); Py_CLEAR(clear_module_state->__pyx_n_s_data_len); Py_CLEAR(clear_module_state->__pyx_n_s_dct); Py_CLEAR(clear_module_state->__pyx_n_u_deflate); Py_CLEAR(clear_module_state->__pyx_n_s_desc); Py_CLEAR(clear_module_state->__pyx_n_s_dict); Py_CLEAR(clear_module_state->__pyx_n_s_dict_2); Py_CLEAR(clear_module_state->__pyx_kp_u_disable); Py_CLEAR(clear_module_state->__pyx_kp_u_enable); Py_CLEAR(clear_module_state->__pyx_n_s_encoded); Py_CLEAR(clear_module_state->__pyx_n_s_end_http_chunk_receiving); Py_CLEAR(clear_module_state->__pyx_n_s_errno); Py_CLEAR(clear_module_state->__pyx_n_s_error); Py_CLEAR(clear_module_state->__pyx_n_s_ex); Py_CLEAR(clear_module_state->__pyx_n_s_feed_data); Py_CLEAR(clear_module_state->__pyx_n_s_feed_eof); Py_CLEAR(clear_module_state->__pyx_n_s_format); Py_CLEAR(clear_module_state->__pyx_n_s_fragment); Py_CLEAR(clear_module_state->__pyx_kp_u_gc); Py_CLEAR(clear_module_state->__pyx_n_s_genexpr); Py_CLEAR(clear_module_state->__pyx_n_s_getstate); Py_CLEAR(clear_module_state->__pyx_n_u_gzip); Py_CLEAR(clear_module_state->__pyx_n_s_hdrs); Py_CLEAR(clear_module_state->__pyx_n_s_headers); Py_CLEAR(clear_module_state->__pyx_n_u_headers); Py_CLEAR(clear_module_state->__pyx_n_s_http_exceptions); Py_CLEAR(clear_module_state->__pyx_n_s_http_parser); Py_CLEAR(clear_module_state->__pyx_n_s_http_writer); Py_CLEAR(clear_module_state->__pyx_n_s_i); Py_CLEAR(clear_module_state->__pyx_n_s_import); Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); Py_CLEAR(clear_module_state->__pyx_kp_u_isenabled); Py_CLEAR(clear_module_state->__pyx_n_s_limit); Py_CLEAR(clear_module_state->__pyx_n_s_loop); Py_CLEAR(clear_module_state->__pyx_n_s_lower); Py_CLEAR(clear_module_state->__pyx_n_s_main); Py_CLEAR(clear_module_state->__pyx_n_s_max_field_size); Py_CLEAR(clear_module_state->__pyx_n_s_max_headers); Py_CLEAR(clear_module_state->__pyx_n_s_max_line_size); Py_CLEAR(clear_module_state->__pyx_n_s_messages); Py_CLEAR(clear_module_state->__pyx_n_s_method); Py_CLEAR(clear_module_state->__pyx_n_u_method); Py_CLEAR(clear_module_state->__pyx_n_s_multidict); Py_CLEAR(clear_module_state->__pyx_n_s_name); Py_CLEAR(clear_module_state->__pyx_n_s_nb); Py_CLEAR(clear_module_state->__pyx_n_s_new); Py_CLEAR(clear_module_state->__pyx_kp_s_no_default___reduce___due_to_non); Py_CLEAR(clear_module_state->__pyx_n_s_path); Py_CLEAR(clear_module_state->__pyx_n_u_path); Py_CLEAR(clear_module_state->__pyx_n_s_payload_exception); Py_CLEAR(clear_module_state->__pyx_n_s_pickle); Py_CLEAR(clear_module_state->__pyx_n_s_pointer); Py_CLEAR(clear_module_state->__pyx_n_s_protocol); Py_CLEAR(clear_module_state->__pyx_n_s_pyx_PickleError); Py_CLEAR(clear_module_state->__pyx_n_s_pyx_checksum); Py_CLEAR(clear_module_state->__pyx_n_s_pyx_result); Py_CLEAR(clear_module_state->__pyx_n_s_pyx_state); Py_CLEAR(clear_module_state->__pyx_n_s_pyx_type); Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_RawRequestMessage); Py_CLEAR(clear_module_state->__pyx_n_s_pyx_unpickle_RawResponseMessag); Py_CLEAR(clear_module_state->__pyx_n_s_pyx_vtable); Py_CLEAR(clear_module_state->__pyx_n_s_query_string); Py_CLEAR(clear_module_state->__pyx_kp_u_r); Py_CLEAR(clear_module_state->__pyx_n_s_range); Py_CLEAR(clear_module_state->__pyx_n_s_raw_headers); Py_CLEAR(clear_module_state->__pyx_n_u_raw_headers); Py_CLEAR(clear_module_state->__pyx_n_s_read_until_eof); Py_CLEAR(clear_module_state->__pyx_n_s_reason); Py_CLEAR(clear_module_state->__pyx_n_u_reason); Py_CLEAR(clear_module_state->__pyx_n_s_reduce); Py_CLEAR(clear_module_state->__pyx_n_s_reduce_cython); Py_CLEAR(clear_module_state->__pyx_n_s_reduce_ex); Py_CLEAR(clear_module_state->__pyx_n_s_replace); Py_CLEAR(clear_module_state->__pyx_n_s_repr___locals_genexpr); Py_CLEAR(clear_module_state->__pyx_n_s_response_with_body); Py_CLEAR(clear_module_state->__pyx_n_s_ret); Py_CLEAR(clear_module_state->__pyx_n_s_rsplit); Py_CLEAR(clear_module_state->__pyx_n_s_self); Py_CLEAR(clear_module_state->__pyx_n_s_send); Py_CLEAR(clear_module_state->__pyx_n_s_set_exception); Py_CLEAR(clear_module_state->__pyx_n_s_set_upgraded); Py_CLEAR(clear_module_state->__pyx_n_s_setstate); Py_CLEAR(clear_module_state->__pyx_n_s_setstate_cython); Py_CLEAR(clear_module_state->__pyx_n_s_should_close); Py_CLEAR(clear_module_state->__pyx_n_u_should_close); Py_CLEAR(clear_module_state->__pyx_n_s_split); Py_CLEAR(clear_module_state->__pyx_n_s_state); Py_CLEAR(clear_module_state->__pyx_n_s_streams); Py_CLEAR(clear_module_state->__pyx_kp_s_stringsource); Py_CLEAR(clear_module_state->__pyx_n_s_test); Py_CLEAR(clear_module_state->__pyx_n_s_throw); Py_CLEAR(clear_module_state->__pyx_n_s_timer); Py_CLEAR(clear_module_state->__pyx_kp_u_unknown); Py_CLEAR(clear_module_state->__pyx_n_s_update); Py_CLEAR(clear_module_state->__pyx_n_s_upgrade); Py_CLEAR(clear_module_state->__pyx_n_u_upgrade); Py_CLEAR(clear_module_state->__pyx_n_s_url); Py_CLEAR(clear_module_state->__pyx_n_u_url); Py_CLEAR(clear_module_state->__pyx_n_s_use_setstate); Py_CLEAR(clear_module_state->__pyx_n_s_val); Py_CLEAR(clear_module_state->__pyx_n_s_version); Py_CLEAR(clear_module_state->__pyx_n_u_version); Py_CLEAR(clear_module_state->__pyx_n_s_yarl); Py_CLEAR(clear_module_state->__pyx_int_1); Py_CLEAR(clear_module_state->__pyx_int_4084195); Py_CLEAR(clear_module_state->__pyx_int_21004882); Py_CLEAR(clear_module_state->__pyx_int_83803150); Py_CLEAR(clear_module_state->__pyx_int_209127132); Py_CLEAR(clear_module_state->__pyx_int_213037754); Py_CLEAR(clear_module_state->__pyx_int_257960607); Py_CLEAR(clear_module_state->__pyx_tuple__5); Py_CLEAR(clear_module_state->__pyx_tuple__11); Py_CLEAR(clear_module_state->__pyx_tuple__13); Py_CLEAR(clear_module_state->__pyx_tuple__14); Py_CLEAR(clear_module_state->__pyx_tuple__15); Py_CLEAR(clear_module_state->__pyx_tuple__17); Py_CLEAR(clear_module_state->__pyx_tuple__19); Py_CLEAR(clear_module_state->__pyx_tuple__23); Py_CLEAR(clear_module_state->__pyx_tuple__25); Py_CLEAR(clear_module_state->__pyx_tuple__27); Py_CLEAR(clear_module_state->__pyx_tuple__29); Py_CLEAR(clear_module_state->__pyx_tuple__36); Py_CLEAR(clear_module_state->__pyx_codeobj__16); Py_CLEAR(clear_module_state->__pyx_codeobj__18); Py_CLEAR(clear_module_state->__pyx_codeobj__20); Py_CLEAR(clear_module_state->__pyx_codeobj__21); Py_CLEAR(clear_module_state->__pyx_codeobj__22); Py_CLEAR(clear_module_state->__pyx_codeobj__24); Py_CLEAR(clear_module_state->__pyx_codeobj__26); Py_CLEAR(clear_module_state->__pyx_codeobj__28); Py_CLEAR(clear_module_state->__pyx_codeobj__30); Py_CLEAR(clear_module_state->__pyx_codeobj__31); Py_CLEAR(clear_module_state->__pyx_codeobj__32); Py_CLEAR(clear_module_state->__pyx_codeobj__33); Py_CLEAR(clear_module_state->__pyx_codeobj__34); Py_CLEAR(clear_module_state->__pyx_codeobj__35); Py_CLEAR(clear_module_state->__pyx_codeobj__37); Py_CLEAR(clear_module_state->__pyx_codeobj__38); return 0; } #endif /* #### Code section: module_state_traverse ### */ #if CYTHON_USE_MODULE_STATE static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { __pyx_mstate *traverse_module_state = __pyx_mstate(m); if (!traverse_module_state) return 0; Py_VISIT(traverse_module_state->__pyx_d); Py_VISIT(traverse_module_state->__pyx_b); Py_VISIT(traverse_module_state->__pyx_cython_runtime); Py_VISIT(traverse_module_state->__pyx_empty_tuple); Py_VISIT(traverse_module_state->__pyx_empty_bytes); Py_VISIT(traverse_module_state->__pyx_empty_unicode); #ifdef __Pyx_CyFunction_USED Py_VISIT(traverse_module_state->__pyx_CyFunctionType); #endif #ifdef __Pyx_FusedFunction_USED Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); #endif Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4type_type); Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4bool_bool); Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_7complex_complex); Py_VISIT(traverse_module_state->__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage); Py_VISIT(traverse_module_state->__pyx_type_7aiohttp_12_http_parser_RawRequestMessage); Py_VISIT(traverse_module_state->__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage); Py_VISIT(traverse_module_state->__pyx_type_7aiohttp_12_http_parser_RawResponseMessage); Py_VISIT(traverse_module_state->__pyx_ptype_7aiohttp_12_http_parser_HttpParser); Py_VISIT(traverse_module_state->__pyx_type_7aiohttp_12_http_parser_HttpParser); Py_VISIT(traverse_module_state->__pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser); Py_VISIT(traverse_module_state->__pyx_type_7aiohttp_12_http_parser_HttpRequestParser); Py_VISIT(traverse_module_state->__pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser); Py_VISIT(traverse_module_state->__pyx_type_7aiohttp_12_http_parser_HttpResponseParser); Py_VISIT(traverse_module_state->__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct__genexpr); Py_VISIT(traverse_module_state->__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct__genexpr); Py_VISIT(traverse_module_state->__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr); Py_VISIT(traverse_module_state->__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr); Py_VISIT(traverse_module_state->__pyx_kp_u_); Py_VISIT(traverse_module_state->__pyx_n_s_ACCEPT); Py_VISIT(traverse_module_state->__pyx_n_s_ACCEPT_CHARSET); Py_VISIT(traverse_module_state->__pyx_n_s_ACCEPT_ENCODING); Py_VISIT(traverse_module_state->__pyx_n_s_ACCEPT_LANGUAGE); Py_VISIT(traverse_module_state->__pyx_n_s_ACCEPT_RANGES); Py_VISIT(traverse_module_state->__pyx_n_s_ACCESS_CONTROL_ALLOW_CREDENTIALS); Py_VISIT(traverse_module_state->__pyx_n_s_ACCESS_CONTROL_ALLOW_HEADERS); Py_VISIT(traverse_module_state->__pyx_n_s_ACCESS_CONTROL_ALLOW_METHODS); Py_VISIT(traverse_module_state->__pyx_n_s_ACCESS_CONTROL_ALLOW_ORIGIN); Py_VISIT(traverse_module_state->__pyx_n_s_ACCESS_CONTROL_EXPOSE_HEADERS); Py_VISIT(traverse_module_state->__pyx_n_s_ACCESS_CONTROL_MAX_AGE); Py_VISIT(traverse_module_state->__pyx_n_s_ACCESS_CONTROL_REQUEST_HEADERS); Py_VISIT(traverse_module_state->__pyx_n_s_ACCESS_CONTROL_REQUEST_METHOD); Py_VISIT(traverse_module_state->__pyx_n_s_AGE); Py_VISIT(traverse_module_state->__pyx_n_s_ALLOW); Py_VISIT(traverse_module_state->__pyx_n_s_AUTHORIZATION); Py_VISIT(traverse_module_state->__pyx_n_s_BadHttpMessage); Py_VISIT(traverse_module_state->__pyx_n_s_BadStatusLine); Py_VISIT(traverse_module_state->__pyx_n_s_BaseException); Py_VISIT(traverse_module_state->__pyx_n_s_CACHE_CONTROL); Py_VISIT(traverse_module_state->__pyx_n_s_CIMultiDict); Py_VISIT(traverse_module_state->__pyx_n_s_CIMultiDictProxy); Py_VISIT(traverse_module_state->__pyx_n_s_CIMultiDictProxy_2); Py_VISIT(traverse_module_state->__pyx_n_s_CIMultiDict_2); Py_VISIT(traverse_module_state->__pyx_n_s_CONNECTION); Py_VISIT(traverse_module_state->__pyx_n_s_CONTENT_DISPOSITION); Py_VISIT(traverse_module_state->__pyx_n_s_CONTENT_ENCODING); Py_VISIT(traverse_module_state->__pyx_n_s_CONTENT_LANGUAGE); Py_VISIT(traverse_module_state->__pyx_n_s_CONTENT_LENGTH); Py_VISIT(traverse_module_state->__pyx_n_s_CONTENT_LOCATION); Py_VISIT(traverse_module_state->__pyx_n_s_CONTENT_MD5); Py_VISIT(traverse_module_state->__pyx_n_s_CONTENT_RANGE); Py_VISIT(traverse_module_state->__pyx_n_s_CONTENT_TRANSFER_ENCODING); Py_VISIT(traverse_module_state->__pyx_n_s_CONTENT_TYPE); Py_VISIT(traverse_module_state->__pyx_n_s_COOKIE); Py_VISIT(traverse_module_state->__pyx_n_s_ContentLengthError); Py_VISIT(traverse_module_state->__pyx_n_s_DATE); Py_VISIT(traverse_module_state->__pyx_n_s_DEBUG); Py_VISIT(traverse_module_state->__pyx_n_s_DESTINATION); Py_VISIT(traverse_module_state->__pyx_n_s_DIGEST); Py_VISIT(traverse_module_state->__pyx_n_s_DeflateBuffer); Py_VISIT(traverse_module_state->__pyx_n_s_DeflateBuffer_2); Py_VISIT(traverse_module_state->__pyx_n_s_EMPTY_PAYLOAD); Py_VISIT(traverse_module_state->__pyx_n_s_EMPTY_PAYLOAD_2); Py_VISIT(traverse_module_state->__pyx_n_s_ETAG); Py_VISIT(traverse_module_state->__pyx_n_s_EXPECT); Py_VISIT(traverse_module_state->__pyx_n_s_EXPIRES); Py_VISIT(traverse_module_state->__pyx_n_s_FORWARDED); Py_VISIT(traverse_module_state->__pyx_n_s_FROM); Py_VISIT(traverse_module_state->__pyx_n_s_HOST); Py_VISIT(traverse_module_state->__pyx_kp_u_Header_name_is_too_long); Py_VISIT(traverse_module_state->__pyx_kp_u_Header_value_is_too_long); Py_VISIT(traverse_module_state->__pyx_n_s_HttpParser___reduce_cython); Py_VISIT(traverse_module_state->__pyx_n_s_HttpParser___setstate_cython); Py_VISIT(traverse_module_state->__pyx_n_s_HttpParser_feed_data); Py_VISIT(traverse_module_state->__pyx_n_s_HttpParser_feed_eof); Py_VISIT(traverse_module_state->__pyx_n_s_HttpParser_set_upgraded); Py_VISIT(traverse_module_state->__pyx_n_s_HttpRequestParser); Py_VISIT(traverse_module_state->__pyx_n_u_HttpRequestParser); Py_VISIT(traverse_module_state->__pyx_n_s_HttpRequestParser___reduce_cytho); Py_VISIT(traverse_module_state->__pyx_n_s_HttpRequestParser___setstate_cyt); Py_VISIT(traverse_module_state->__pyx_n_s_HttpResponseParser); Py_VISIT(traverse_module_state->__pyx_n_u_HttpResponseParser); Py_VISIT(traverse_module_state->__pyx_n_s_HttpResponseParser___reduce_cyth); Py_VISIT(traverse_module_state->__pyx_n_s_HttpResponseParser___setstate_cy); Py_VISIT(traverse_module_state->__pyx_n_s_HttpVersion); Py_VISIT(traverse_module_state->__pyx_n_s_HttpVersion10); Py_VISIT(traverse_module_state->__pyx_n_s_HttpVersion10_2); Py_VISIT(traverse_module_state->__pyx_n_s_HttpVersion11); Py_VISIT(traverse_module_state->__pyx_n_s_HttpVersion11_2); Py_VISIT(traverse_module_state->__pyx_n_s_HttpVersion_2); Py_VISIT(traverse_module_state->__pyx_n_s_IF_MATCH); Py_VISIT(traverse_module_state->__pyx_n_s_IF_MODIFIED_SINCE); Py_VISIT(traverse_module_state->__pyx_n_s_IF_NONE_MATCH); Py_VISIT(traverse_module_state->__pyx_n_s_IF_RANGE); Py_VISIT(traverse_module_state->__pyx_n_s_IF_UNMODIFIED_SINCE); Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0); Py_VISIT(traverse_module_state->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2); Py_VISIT(traverse_module_state->__pyx_n_s_InvalidHeader); Py_VISIT(traverse_module_state->__pyx_n_s_InvalidURLError); Py_VISIT(traverse_module_state->__pyx_n_s_KEEP_ALIVE); Py_VISIT(traverse_module_state->__pyx_n_s_LAST_EVENT_ID); Py_VISIT(traverse_module_state->__pyx_n_s_LAST_MODIFIED); Py_VISIT(traverse_module_state->__pyx_n_s_LINK); Py_VISIT(traverse_module_state->__pyx_n_s_LOCATION); Py_VISIT(traverse_module_state->__pyx_n_s_LineTooLong); Py_VISIT(traverse_module_state->__pyx_n_s_MAX_FORWARDS); Py_VISIT(traverse_module_state->__pyx_n_s_MemoryError); Py_VISIT(traverse_module_state->__pyx_kp_u_Not_enough_data_for_satisfy_cont); Py_VISIT(traverse_module_state->__pyx_kp_u_Not_enough_data_for_satisfy_tran); Py_VISIT(traverse_module_state->__pyx_n_s_ORIGIN); Py_VISIT(traverse_module_state->__pyx_n_s_PRAGMA); Py_VISIT(traverse_module_state->__pyx_n_s_PROXY_AUTHENTICATE); Py_VISIT(traverse_module_state->__pyx_n_s_PROXY_AUTHORIZATION); Py_VISIT(traverse_module_state->__pyx_n_s_PayloadEncodingError); Py_VISIT(traverse_module_state->__pyx_n_s_PickleError); Py_VISIT(traverse_module_state->__pyx_n_s_RANGE); Py_VISIT(traverse_module_state->__pyx_n_s_REFERER); Py_VISIT(traverse_module_state->__pyx_n_s_RETRY_AFTER); Py_VISIT(traverse_module_state->__pyx_kp_u_RawRequestMessage); Py_VISIT(traverse_module_state->__pyx_n_s_RawRequestMessage_2); Py_VISIT(traverse_module_state->__pyx_n_u_RawRequestMessage_2); Py_VISIT(traverse_module_state->__pyx_n_s_RawRequestMessage___reduce_cytho); Py_VISIT(traverse_module_state->__pyx_n_s_RawRequestMessage___setstate_cyt); Py_VISIT(traverse_module_state->__pyx_n_s_RawRequestMessage__replace); Py_VISIT(traverse_module_state->__pyx_kp_u_RawResponseMessage); Py_VISIT(traverse_module_state->__pyx_n_s_RawResponseMessage_2); Py_VISIT(traverse_module_state->__pyx_n_u_RawResponseMessage_2); Py_VISIT(traverse_module_state->__pyx_n_s_RawResponseMessage___reduce_cyth); Py_VISIT(traverse_module_state->__pyx_n_s_RawResponseMessage___setstate_cy); Py_VISIT(traverse_module_state->__pyx_n_s_SEC_WEBSOCKET_ACCEPT); Py_VISIT(traverse_module_state->__pyx_n_s_SEC_WEBSOCKET_EXTENSIONS); Py_VISIT(traverse_module_state->__pyx_n_s_SEC_WEBSOCKET_KEY); Py_VISIT(traverse_module_state->__pyx_n_s_SEC_WEBSOCKET_KEY1); Py_VISIT(traverse_module_state->__pyx_n_s_SEC_WEBSOCKET_PROTOCOL); Py_VISIT(traverse_module_state->__pyx_n_s_SEC_WEBSOCKET_VERSION); Py_VISIT(traverse_module_state->__pyx_n_s_SERVER); Py_VISIT(traverse_module_state->__pyx_n_s_SET_COOKIE); Py_VISIT(traverse_module_state->__pyx_kp_u_Status_line_is_too_long); Py_VISIT(traverse_module_state->__pyx_n_s_StreamReader); Py_VISIT(traverse_module_state->__pyx_n_s_StreamReader_2); Py_VISIT(traverse_module_state->__pyx_n_s_TE); Py_VISIT(traverse_module_state->__pyx_n_s_TRAILER); Py_VISIT(traverse_module_state->__pyx_n_s_TRANSFER_ENCODING); Py_VISIT(traverse_module_state->__pyx_n_s_TransferEncodingError); Py_VISIT(traverse_module_state->__pyx_n_s_TypeError); Py_VISIT(traverse_module_state->__pyx_n_s_UPGRADE); Py_VISIT(traverse_module_state->__pyx_n_s_URI); Py_VISIT(traverse_module_state->__pyx_n_s_URL); Py_VISIT(traverse_module_state->__pyx_n_s_URL_2); Py_VISIT(traverse_module_state->__pyx_n_s_USER_AGENT); Py_VISIT(traverse_module_state->__pyx_n_s_VARY); Py_VISIT(traverse_module_state->__pyx_n_s_VIA); Py_VISIT(traverse_module_state->__pyx_n_s_WANT_DIGEST); Py_VISIT(traverse_module_state->__pyx_n_s_WARNING); Py_VISIT(traverse_module_state->__pyx_n_s_WWW_AUTHENTICATE); Py_VISIT(traverse_module_state->__pyx_n_s_X_FORWARDED_FOR); Py_VISIT(traverse_module_state->__pyx_n_s_X_FORWARDED_HOST); Py_VISIT(traverse_module_state->__pyx_n_s_X_FORWARDED_PROTO); Py_VISIT(traverse_module_state->__pyx_kp_u__10); Py_VISIT(traverse_module_state->__pyx_kp_u__12); Py_VISIT(traverse_module_state->__pyx_kp_u__2); Py_VISIT(traverse_module_state->__pyx_kp_u__3); Py_VISIT(traverse_module_state->__pyx_kp_b__4); Py_VISIT(traverse_module_state->__pyx_kp_u__6); Py_VISIT(traverse_module_state->__pyx_kp_u__7); Py_VISIT(traverse_module_state->__pyx_n_s__8); Py_VISIT(traverse_module_state->__pyx_kp_b__8); Py_VISIT(traverse_module_state->__pyx_kp_u__8); Py_VISIT(traverse_module_state->__pyx_n_s__9); Py_VISIT(traverse_module_state->__pyx_kp_u__9); Py_VISIT(traverse_module_state->__pyx_n_s_add); Py_VISIT(traverse_module_state->__pyx_n_s_after); Py_VISIT(traverse_module_state->__pyx_n_s_after_b); Py_VISIT(traverse_module_state->__pyx_n_s_aiohttp); Py_VISIT(traverse_module_state->__pyx_n_s_aiohttp__http_parser); Py_VISIT(traverse_module_state->__pyx_kp_s_aiohttp__http_parser_pyx); Py_VISIT(traverse_module_state->__pyx_n_s_aiohttp_helpers); Py_VISIT(traverse_module_state->__pyx_n_s_all); Py_VISIT(traverse_module_state->__pyx_n_s_args); Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); Py_VISIT(traverse_module_state->__pyx_n_s_authority); Py_VISIT(traverse_module_state->__pyx_n_s_auto_decompress); Py_VISIT(traverse_module_state->__pyx_n_s_before); Py_VISIT(traverse_module_state->__pyx_n_s_begin_http_chunk_receiving); Py_VISIT(traverse_module_state->__pyx_n_u_br); Py_VISIT(traverse_module_state->__pyx_n_s_build); Py_VISIT(traverse_module_state->__pyx_n_s_chunked); Py_VISIT(traverse_module_state->__pyx_n_u_chunked); Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); Py_VISIT(traverse_module_state->__pyx_n_s_close); Py_VISIT(traverse_module_state->__pyx_n_s_code); Py_VISIT(traverse_module_state->__pyx_n_u_code); Py_VISIT(traverse_module_state->__pyx_n_s_compression); Py_VISIT(traverse_module_state->__pyx_n_u_compression); Py_VISIT(traverse_module_state->__pyx_n_s_data); Py_VISIT(traverse_module_state->__pyx_n_s_data_len); Py_VISIT(traverse_module_state->__pyx_n_s_dct); Py_VISIT(traverse_module_state->__pyx_n_u_deflate); Py_VISIT(traverse_module_state->__pyx_n_s_desc); Py_VISIT(traverse_module_state->__pyx_n_s_dict); Py_VISIT(traverse_module_state->__pyx_n_s_dict_2); Py_VISIT(traverse_module_state->__pyx_kp_u_disable); Py_VISIT(traverse_module_state->__pyx_kp_u_enable); Py_VISIT(traverse_module_state->__pyx_n_s_encoded); Py_VISIT(traverse_module_state->__pyx_n_s_end_http_chunk_receiving); Py_VISIT(traverse_module_state->__pyx_n_s_errno); Py_VISIT(traverse_module_state->__pyx_n_s_error); Py_VISIT(traverse_module_state->__pyx_n_s_ex); Py_VISIT(traverse_module_state->__pyx_n_s_feed_data); Py_VISIT(traverse_module_state->__pyx_n_s_feed_eof); Py_VISIT(traverse_module_state->__pyx_n_s_format); Py_VISIT(traverse_module_state->__pyx_n_s_fragment); Py_VISIT(traverse_module_state->__pyx_kp_u_gc); Py_VISIT(traverse_module_state->__pyx_n_s_genexpr); Py_VISIT(traverse_module_state->__pyx_n_s_getstate); Py_VISIT(traverse_module_state->__pyx_n_u_gzip); Py_VISIT(traverse_module_state->__pyx_n_s_hdrs); Py_VISIT(traverse_module_state->__pyx_n_s_headers); Py_VISIT(traverse_module_state->__pyx_n_u_headers); Py_VISIT(traverse_module_state->__pyx_n_s_http_exceptions); Py_VISIT(traverse_module_state->__pyx_n_s_http_parser); Py_VISIT(traverse_module_state->__pyx_n_s_http_writer); Py_VISIT(traverse_module_state->__pyx_n_s_i); Py_VISIT(traverse_module_state->__pyx_n_s_import); Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); Py_VISIT(traverse_module_state->__pyx_kp_u_isenabled); Py_VISIT(traverse_module_state->__pyx_n_s_limit); Py_VISIT(traverse_module_state->__pyx_n_s_loop); Py_VISIT(traverse_module_state->__pyx_n_s_lower); Py_VISIT(traverse_module_state->__pyx_n_s_main); Py_VISIT(traverse_module_state->__pyx_n_s_max_field_size); Py_VISIT(traverse_module_state->__pyx_n_s_max_headers); Py_VISIT(traverse_module_state->__pyx_n_s_max_line_size); Py_VISIT(traverse_module_state->__pyx_n_s_messages); Py_VISIT(traverse_module_state->__pyx_n_s_method); Py_VISIT(traverse_module_state->__pyx_n_u_method); Py_VISIT(traverse_module_state->__pyx_n_s_multidict); Py_VISIT(traverse_module_state->__pyx_n_s_name); Py_VISIT(traverse_module_state->__pyx_n_s_nb); Py_VISIT(traverse_module_state->__pyx_n_s_new); Py_VISIT(traverse_module_state->__pyx_kp_s_no_default___reduce___due_to_non); Py_VISIT(traverse_module_state->__pyx_n_s_path); Py_VISIT(traverse_module_state->__pyx_n_u_path); Py_VISIT(traverse_module_state->__pyx_n_s_payload_exception); Py_VISIT(traverse_module_state->__pyx_n_s_pickle); Py_VISIT(traverse_module_state->__pyx_n_s_pointer); Py_VISIT(traverse_module_state->__pyx_n_s_protocol); Py_VISIT(traverse_module_state->__pyx_n_s_pyx_PickleError); Py_VISIT(traverse_module_state->__pyx_n_s_pyx_checksum); Py_VISIT(traverse_module_state->__pyx_n_s_pyx_result); Py_VISIT(traverse_module_state->__pyx_n_s_pyx_state); Py_VISIT(traverse_module_state->__pyx_n_s_pyx_type); Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_RawRequestMessage); Py_VISIT(traverse_module_state->__pyx_n_s_pyx_unpickle_RawResponseMessag); Py_VISIT(traverse_module_state->__pyx_n_s_pyx_vtable); Py_VISIT(traverse_module_state->__pyx_n_s_query_string); Py_VISIT(traverse_module_state->__pyx_kp_u_r); Py_VISIT(traverse_module_state->__pyx_n_s_range); Py_VISIT(traverse_module_state->__pyx_n_s_raw_headers); Py_VISIT(traverse_module_state->__pyx_n_u_raw_headers); Py_VISIT(traverse_module_state->__pyx_n_s_read_until_eof); Py_VISIT(traverse_module_state->__pyx_n_s_reason); Py_VISIT(traverse_module_state->__pyx_n_u_reason); Py_VISIT(traverse_module_state->__pyx_n_s_reduce); Py_VISIT(traverse_module_state->__pyx_n_s_reduce_cython); Py_VISIT(traverse_module_state->__pyx_n_s_reduce_ex); Py_VISIT(traverse_module_state->__pyx_n_s_replace); Py_VISIT(traverse_module_state->__pyx_n_s_repr___locals_genexpr); Py_VISIT(traverse_module_state->__pyx_n_s_response_with_body); Py_VISIT(traverse_module_state->__pyx_n_s_ret); Py_VISIT(traverse_module_state->__pyx_n_s_rsplit); Py_VISIT(traverse_module_state->__pyx_n_s_self); Py_VISIT(traverse_module_state->__pyx_n_s_send); Py_VISIT(traverse_module_state->__pyx_n_s_set_exception); Py_VISIT(traverse_module_state->__pyx_n_s_set_upgraded); Py_VISIT(traverse_module_state->__pyx_n_s_setstate); Py_VISIT(traverse_module_state->__pyx_n_s_setstate_cython); Py_VISIT(traverse_module_state->__pyx_n_s_should_close); Py_VISIT(traverse_module_state->__pyx_n_u_should_close); Py_VISIT(traverse_module_state->__pyx_n_s_split); Py_VISIT(traverse_module_state->__pyx_n_s_state); Py_VISIT(traverse_module_state->__pyx_n_s_streams); Py_VISIT(traverse_module_state->__pyx_kp_s_stringsource); Py_VISIT(traverse_module_state->__pyx_n_s_test); Py_VISIT(traverse_module_state->__pyx_n_s_throw); Py_VISIT(traverse_module_state->__pyx_n_s_timer); Py_VISIT(traverse_module_state->__pyx_kp_u_unknown); Py_VISIT(traverse_module_state->__pyx_n_s_update); Py_VISIT(traverse_module_state->__pyx_n_s_upgrade); Py_VISIT(traverse_module_state->__pyx_n_u_upgrade); Py_VISIT(traverse_module_state->__pyx_n_s_url); Py_VISIT(traverse_module_state->__pyx_n_u_url); Py_VISIT(traverse_module_state->__pyx_n_s_use_setstate); Py_VISIT(traverse_module_state->__pyx_n_s_val); Py_VISIT(traverse_module_state->__pyx_n_s_version); Py_VISIT(traverse_module_state->__pyx_n_u_version); Py_VISIT(traverse_module_state->__pyx_n_s_yarl); Py_VISIT(traverse_module_state->__pyx_int_1); Py_VISIT(traverse_module_state->__pyx_int_4084195); Py_VISIT(traverse_module_state->__pyx_int_21004882); Py_VISIT(traverse_module_state->__pyx_int_83803150); Py_VISIT(traverse_module_state->__pyx_int_209127132); Py_VISIT(traverse_module_state->__pyx_int_213037754); Py_VISIT(traverse_module_state->__pyx_int_257960607); Py_VISIT(traverse_module_state->__pyx_tuple__5); Py_VISIT(traverse_module_state->__pyx_tuple__11); Py_VISIT(traverse_module_state->__pyx_tuple__13); Py_VISIT(traverse_module_state->__pyx_tuple__14); Py_VISIT(traverse_module_state->__pyx_tuple__15); Py_VISIT(traverse_module_state->__pyx_tuple__17); Py_VISIT(traverse_module_state->__pyx_tuple__19); Py_VISIT(traverse_module_state->__pyx_tuple__23); Py_VISIT(traverse_module_state->__pyx_tuple__25); Py_VISIT(traverse_module_state->__pyx_tuple__27); Py_VISIT(traverse_module_state->__pyx_tuple__29); Py_VISIT(traverse_module_state->__pyx_tuple__36); Py_VISIT(traverse_module_state->__pyx_codeobj__16); Py_VISIT(traverse_module_state->__pyx_codeobj__18); Py_VISIT(traverse_module_state->__pyx_codeobj__20); Py_VISIT(traverse_module_state->__pyx_codeobj__21); Py_VISIT(traverse_module_state->__pyx_codeobj__22); Py_VISIT(traverse_module_state->__pyx_codeobj__24); Py_VISIT(traverse_module_state->__pyx_codeobj__26); Py_VISIT(traverse_module_state->__pyx_codeobj__28); Py_VISIT(traverse_module_state->__pyx_codeobj__30); Py_VISIT(traverse_module_state->__pyx_codeobj__31); Py_VISIT(traverse_module_state->__pyx_codeobj__32); Py_VISIT(traverse_module_state->__pyx_codeobj__33); Py_VISIT(traverse_module_state->__pyx_codeobj__34); Py_VISIT(traverse_module_state->__pyx_codeobj__35); Py_VISIT(traverse_module_state->__pyx_codeobj__37); Py_VISIT(traverse_module_state->__pyx_codeobj__38); return 0; } #endif /* #### Code section: module_state_defines ### */ #define __pyx_d __pyx_mstate_global->__pyx_d #define __pyx_b __pyx_mstate_global->__pyx_b #define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime #define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple #define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes #define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode #ifdef __Pyx_CyFunction_USED #define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType #endif #ifdef __Pyx_FusedFunction_USED #define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType #endif #ifdef __Pyx_Generator_USED #define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType #endif #ifdef __Pyx_IterableCoroutine_USED #define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType #endif #ifdef __Pyx_Coroutine_USED #define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType #endif #ifdef __Pyx_Coroutine_USED #define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #define __pyx_ptype_7cpython_4type_type __pyx_mstate_global->__pyx_ptype_7cpython_4type_type #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #define __pyx_ptype_7cpython_4bool_bool __pyx_mstate_global->__pyx_ptype_7cpython_4bool_bool #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #define __pyx_ptype_7cpython_7complex_complex __pyx_mstate_global->__pyx_ptype_7cpython_7complex_complex #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #define __pyx_type_7aiohttp_12_http_parser_RawRequestMessage __pyx_mstate_global->__pyx_type_7aiohttp_12_http_parser_RawRequestMessage #define __pyx_type_7aiohttp_12_http_parser_RawResponseMessage __pyx_mstate_global->__pyx_type_7aiohttp_12_http_parser_RawResponseMessage #define __pyx_type_7aiohttp_12_http_parser_HttpParser __pyx_mstate_global->__pyx_type_7aiohttp_12_http_parser_HttpParser #define __pyx_type_7aiohttp_12_http_parser_HttpRequestParser __pyx_mstate_global->__pyx_type_7aiohttp_12_http_parser_HttpRequestParser #define __pyx_type_7aiohttp_12_http_parser_HttpResponseParser __pyx_mstate_global->__pyx_type_7aiohttp_12_http_parser_HttpResponseParser #define __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct__genexpr __pyx_mstate_global->__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct__genexpr #define __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr __pyx_mstate_global->__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr #endif #define __pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage __pyx_mstate_global->__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage #define __pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage __pyx_mstate_global->__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage #define __pyx_ptype_7aiohttp_12_http_parser_HttpParser __pyx_mstate_global->__pyx_ptype_7aiohttp_12_http_parser_HttpParser #define __pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser __pyx_mstate_global->__pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser #define __pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser __pyx_mstate_global->__pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser #define __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct__genexpr __pyx_mstate_global->__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct__genexpr #define __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr __pyx_mstate_global->__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr #define __pyx_kp_u_ __pyx_mstate_global->__pyx_kp_u_ #define __pyx_n_s_ACCEPT __pyx_mstate_global->__pyx_n_s_ACCEPT #define __pyx_n_s_ACCEPT_CHARSET __pyx_mstate_global->__pyx_n_s_ACCEPT_CHARSET #define __pyx_n_s_ACCEPT_ENCODING __pyx_mstate_global->__pyx_n_s_ACCEPT_ENCODING #define __pyx_n_s_ACCEPT_LANGUAGE __pyx_mstate_global->__pyx_n_s_ACCEPT_LANGUAGE #define __pyx_n_s_ACCEPT_RANGES __pyx_mstate_global->__pyx_n_s_ACCEPT_RANGES #define __pyx_n_s_ACCESS_CONTROL_ALLOW_CREDENTIALS __pyx_mstate_global->__pyx_n_s_ACCESS_CONTROL_ALLOW_CREDENTIALS #define __pyx_n_s_ACCESS_CONTROL_ALLOW_HEADERS __pyx_mstate_global->__pyx_n_s_ACCESS_CONTROL_ALLOW_HEADERS #define __pyx_n_s_ACCESS_CONTROL_ALLOW_METHODS __pyx_mstate_global->__pyx_n_s_ACCESS_CONTROL_ALLOW_METHODS #define __pyx_n_s_ACCESS_CONTROL_ALLOW_ORIGIN __pyx_mstate_global->__pyx_n_s_ACCESS_CONTROL_ALLOW_ORIGIN #define __pyx_n_s_ACCESS_CONTROL_EXPOSE_HEADERS __pyx_mstate_global->__pyx_n_s_ACCESS_CONTROL_EXPOSE_HEADERS #define __pyx_n_s_ACCESS_CONTROL_MAX_AGE __pyx_mstate_global->__pyx_n_s_ACCESS_CONTROL_MAX_AGE #define __pyx_n_s_ACCESS_CONTROL_REQUEST_HEADERS __pyx_mstate_global->__pyx_n_s_ACCESS_CONTROL_REQUEST_HEADERS #define __pyx_n_s_ACCESS_CONTROL_REQUEST_METHOD __pyx_mstate_global->__pyx_n_s_ACCESS_CONTROL_REQUEST_METHOD #define __pyx_n_s_AGE __pyx_mstate_global->__pyx_n_s_AGE #define __pyx_n_s_ALLOW __pyx_mstate_global->__pyx_n_s_ALLOW #define __pyx_n_s_AUTHORIZATION __pyx_mstate_global->__pyx_n_s_AUTHORIZATION #define __pyx_n_s_BadHttpMessage __pyx_mstate_global->__pyx_n_s_BadHttpMessage #define __pyx_n_s_BadStatusLine __pyx_mstate_global->__pyx_n_s_BadStatusLine #define __pyx_n_s_BaseException __pyx_mstate_global->__pyx_n_s_BaseException #define __pyx_n_s_CACHE_CONTROL __pyx_mstate_global->__pyx_n_s_CACHE_CONTROL #define __pyx_n_s_CIMultiDict __pyx_mstate_global->__pyx_n_s_CIMultiDict #define __pyx_n_s_CIMultiDictProxy __pyx_mstate_global->__pyx_n_s_CIMultiDictProxy #define __pyx_n_s_CIMultiDictProxy_2 __pyx_mstate_global->__pyx_n_s_CIMultiDictProxy_2 #define __pyx_n_s_CIMultiDict_2 __pyx_mstate_global->__pyx_n_s_CIMultiDict_2 #define __pyx_n_s_CONNECTION __pyx_mstate_global->__pyx_n_s_CONNECTION #define __pyx_n_s_CONTENT_DISPOSITION __pyx_mstate_global->__pyx_n_s_CONTENT_DISPOSITION #define __pyx_n_s_CONTENT_ENCODING __pyx_mstate_global->__pyx_n_s_CONTENT_ENCODING #define __pyx_n_s_CONTENT_LANGUAGE __pyx_mstate_global->__pyx_n_s_CONTENT_LANGUAGE #define __pyx_n_s_CONTENT_LENGTH __pyx_mstate_global->__pyx_n_s_CONTENT_LENGTH #define __pyx_n_s_CONTENT_LOCATION __pyx_mstate_global->__pyx_n_s_CONTENT_LOCATION #define __pyx_n_s_CONTENT_MD5 __pyx_mstate_global->__pyx_n_s_CONTENT_MD5 #define __pyx_n_s_CONTENT_RANGE __pyx_mstate_global->__pyx_n_s_CONTENT_RANGE #define __pyx_n_s_CONTENT_TRANSFER_ENCODING __pyx_mstate_global->__pyx_n_s_CONTENT_TRANSFER_ENCODING #define __pyx_n_s_CONTENT_TYPE __pyx_mstate_global->__pyx_n_s_CONTENT_TYPE #define __pyx_n_s_COOKIE __pyx_mstate_global->__pyx_n_s_COOKIE #define __pyx_n_s_ContentLengthError __pyx_mstate_global->__pyx_n_s_ContentLengthError #define __pyx_n_s_DATE __pyx_mstate_global->__pyx_n_s_DATE #define __pyx_n_s_DEBUG __pyx_mstate_global->__pyx_n_s_DEBUG #define __pyx_n_s_DESTINATION __pyx_mstate_global->__pyx_n_s_DESTINATION #define __pyx_n_s_DIGEST __pyx_mstate_global->__pyx_n_s_DIGEST #define __pyx_n_s_DeflateBuffer __pyx_mstate_global->__pyx_n_s_DeflateBuffer #define __pyx_n_s_DeflateBuffer_2 __pyx_mstate_global->__pyx_n_s_DeflateBuffer_2 #define __pyx_n_s_EMPTY_PAYLOAD __pyx_mstate_global->__pyx_n_s_EMPTY_PAYLOAD #define __pyx_n_s_EMPTY_PAYLOAD_2 __pyx_mstate_global->__pyx_n_s_EMPTY_PAYLOAD_2 #define __pyx_n_s_ETAG __pyx_mstate_global->__pyx_n_s_ETAG #define __pyx_n_s_EXPECT __pyx_mstate_global->__pyx_n_s_EXPECT #define __pyx_n_s_EXPIRES __pyx_mstate_global->__pyx_n_s_EXPIRES #define __pyx_n_s_FORWARDED __pyx_mstate_global->__pyx_n_s_FORWARDED #define __pyx_n_s_FROM __pyx_mstate_global->__pyx_n_s_FROM #define __pyx_n_s_HOST __pyx_mstate_global->__pyx_n_s_HOST #define __pyx_kp_u_Header_name_is_too_long __pyx_mstate_global->__pyx_kp_u_Header_name_is_too_long #define __pyx_kp_u_Header_value_is_too_long __pyx_mstate_global->__pyx_kp_u_Header_value_is_too_long #define __pyx_n_s_HttpParser___reduce_cython __pyx_mstate_global->__pyx_n_s_HttpParser___reduce_cython #define __pyx_n_s_HttpParser___setstate_cython __pyx_mstate_global->__pyx_n_s_HttpParser___setstate_cython #define __pyx_n_s_HttpParser_feed_data __pyx_mstate_global->__pyx_n_s_HttpParser_feed_data #define __pyx_n_s_HttpParser_feed_eof __pyx_mstate_global->__pyx_n_s_HttpParser_feed_eof #define __pyx_n_s_HttpParser_set_upgraded __pyx_mstate_global->__pyx_n_s_HttpParser_set_upgraded #define __pyx_n_s_HttpRequestParser __pyx_mstate_global->__pyx_n_s_HttpRequestParser #define __pyx_n_u_HttpRequestParser __pyx_mstate_global->__pyx_n_u_HttpRequestParser #define __pyx_n_s_HttpRequestParser___reduce_cytho __pyx_mstate_global->__pyx_n_s_HttpRequestParser___reduce_cytho #define __pyx_n_s_HttpRequestParser___setstate_cyt __pyx_mstate_global->__pyx_n_s_HttpRequestParser___setstate_cyt #define __pyx_n_s_HttpResponseParser __pyx_mstate_global->__pyx_n_s_HttpResponseParser #define __pyx_n_u_HttpResponseParser __pyx_mstate_global->__pyx_n_u_HttpResponseParser #define __pyx_n_s_HttpResponseParser___reduce_cyth __pyx_mstate_global->__pyx_n_s_HttpResponseParser___reduce_cyth #define __pyx_n_s_HttpResponseParser___setstate_cy __pyx_mstate_global->__pyx_n_s_HttpResponseParser___setstate_cy #define __pyx_n_s_HttpVersion __pyx_mstate_global->__pyx_n_s_HttpVersion #define __pyx_n_s_HttpVersion10 __pyx_mstate_global->__pyx_n_s_HttpVersion10 #define __pyx_n_s_HttpVersion10_2 __pyx_mstate_global->__pyx_n_s_HttpVersion10_2 #define __pyx_n_s_HttpVersion11 __pyx_mstate_global->__pyx_n_s_HttpVersion11 #define __pyx_n_s_HttpVersion11_2 __pyx_mstate_global->__pyx_n_s_HttpVersion11_2 #define __pyx_n_s_HttpVersion_2 __pyx_mstate_global->__pyx_n_s_HttpVersion_2 #define __pyx_n_s_IF_MATCH __pyx_mstate_global->__pyx_n_s_IF_MATCH #define __pyx_n_s_IF_MODIFIED_SINCE __pyx_mstate_global->__pyx_n_s_IF_MODIFIED_SINCE #define __pyx_n_s_IF_NONE_MATCH __pyx_mstate_global->__pyx_n_s_IF_NONE_MATCH #define __pyx_n_s_IF_RANGE __pyx_mstate_global->__pyx_n_s_IF_RANGE #define __pyx_n_s_IF_UNMODIFIED_SINCE __pyx_mstate_global->__pyx_n_s_IF_UNMODIFIED_SINCE #define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0 #define __pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2 __pyx_mstate_global->__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2 #define __pyx_n_s_InvalidHeader __pyx_mstate_global->__pyx_n_s_InvalidHeader #define __pyx_n_s_InvalidURLError __pyx_mstate_global->__pyx_n_s_InvalidURLError #define __pyx_n_s_KEEP_ALIVE __pyx_mstate_global->__pyx_n_s_KEEP_ALIVE #define __pyx_n_s_LAST_EVENT_ID __pyx_mstate_global->__pyx_n_s_LAST_EVENT_ID #define __pyx_n_s_LAST_MODIFIED __pyx_mstate_global->__pyx_n_s_LAST_MODIFIED #define __pyx_n_s_LINK __pyx_mstate_global->__pyx_n_s_LINK #define __pyx_n_s_LOCATION __pyx_mstate_global->__pyx_n_s_LOCATION #define __pyx_n_s_LineTooLong __pyx_mstate_global->__pyx_n_s_LineTooLong #define __pyx_n_s_MAX_FORWARDS __pyx_mstate_global->__pyx_n_s_MAX_FORWARDS #define __pyx_n_s_MemoryError __pyx_mstate_global->__pyx_n_s_MemoryError #define __pyx_kp_u_Not_enough_data_for_satisfy_cont __pyx_mstate_global->__pyx_kp_u_Not_enough_data_for_satisfy_cont #define __pyx_kp_u_Not_enough_data_for_satisfy_tran __pyx_mstate_global->__pyx_kp_u_Not_enough_data_for_satisfy_tran #define __pyx_n_s_ORIGIN __pyx_mstate_global->__pyx_n_s_ORIGIN #define __pyx_n_s_PRAGMA __pyx_mstate_global->__pyx_n_s_PRAGMA #define __pyx_n_s_PROXY_AUTHENTICATE __pyx_mstate_global->__pyx_n_s_PROXY_AUTHENTICATE #define __pyx_n_s_PROXY_AUTHORIZATION __pyx_mstate_global->__pyx_n_s_PROXY_AUTHORIZATION #define __pyx_n_s_PayloadEncodingError __pyx_mstate_global->__pyx_n_s_PayloadEncodingError #define __pyx_n_s_PickleError __pyx_mstate_global->__pyx_n_s_PickleError #define __pyx_n_s_RANGE __pyx_mstate_global->__pyx_n_s_RANGE #define __pyx_n_s_REFERER __pyx_mstate_global->__pyx_n_s_REFERER #define __pyx_n_s_RETRY_AFTER __pyx_mstate_global->__pyx_n_s_RETRY_AFTER #define __pyx_kp_u_RawRequestMessage __pyx_mstate_global->__pyx_kp_u_RawRequestMessage #define __pyx_n_s_RawRequestMessage_2 __pyx_mstate_global->__pyx_n_s_RawRequestMessage_2 #define __pyx_n_u_RawRequestMessage_2 __pyx_mstate_global->__pyx_n_u_RawRequestMessage_2 #define __pyx_n_s_RawRequestMessage___reduce_cytho __pyx_mstate_global->__pyx_n_s_RawRequestMessage___reduce_cytho #define __pyx_n_s_RawRequestMessage___setstate_cyt __pyx_mstate_global->__pyx_n_s_RawRequestMessage___setstate_cyt #define __pyx_n_s_RawRequestMessage__replace __pyx_mstate_global->__pyx_n_s_RawRequestMessage__replace #define __pyx_kp_u_RawResponseMessage __pyx_mstate_global->__pyx_kp_u_RawResponseMessage #define __pyx_n_s_RawResponseMessage_2 __pyx_mstate_global->__pyx_n_s_RawResponseMessage_2 #define __pyx_n_u_RawResponseMessage_2 __pyx_mstate_global->__pyx_n_u_RawResponseMessage_2 #define __pyx_n_s_RawResponseMessage___reduce_cyth __pyx_mstate_global->__pyx_n_s_RawResponseMessage___reduce_cyth #define __pyx_n_s_RawResponseMessage___setstate_cy __pyx_mstate_global->__pyx_n_s_RawResponseMessage___setstate_cy #define __pyx_n_s_SEC_WEBSOCKET_ACCEPT __pyx_mstate_global->__pyx_n_s_SEC_WEBSOCKET_ACCEPT #define __pyx_n_s_SEC_WEBSOCKET_EXTENSIONS __pyx_mstate_global->__pyx_n_s_SEC_WEBSOCKET_EXTENSIONS #define __pyx_n_s_SEC_WEBSOCKET_KEY __pyx_mstate_global->__pyx_n_s_SEC_WEBSOCKET_KEY #define __pyx_n_s_SEC_WEBSOCKET_KEY1 __pyx_mstate_global->__pyx_n_s_SEC_WEBSOCKET_KEY1 #define __pyx_n_s_SEC_WEBSOCKET_PROTOCOL __pyx_mstate_global->__pyx_n_s_SEC_WEBSOCKET_PROTOCOL #define __pyx_n_s_SEC_WEBSOCKET_VERSION __pyx_mstate_global->__pyx_n_s_SEC_WEBSOCKET_VERSION #define __pyx_n_s_SERVER __pyx_mstate_global->__pyx_n_s_SERVER #define __pyx_n_s_SET_COOKIE __pyx_mstate_global->__pyx_n_s_SET_COOKIE #define __pyx_kp_u_Status_line_is_too_long __pyx_mstate_global->__pyx_kp_u_Status_line_is_too_long #define __pyx_n_s_StreamReader __pyx_mstate_global->__pyx_n_s_StreamReader #define __pyx_n_s_StreamReader_2 __pyx_mstate_global->__pyx_n_s_StreamReader_2 #define __pyx_n_s_TE __pyx_mstate_global->__pyx_n_s_TE #define __pyx_n_s_TRAILER __pyx_mstate_global->__pyx_n_s_TRAILER #define __pyx_n_s_TRANSFER_ENCODING __pyx_mstate_global->__pyx_n_s_TRANSFER_ENCODING #define __pyx_n_s_TransferEncodingError __pyx_mstate_global->__pyx_n_s_TransferEncodingError #define __pyx_n_s_TypeError __pyx_mstate_global->__pyx_n_s_TypeError #define __pyx_n_s_UPGRADE __pyx_mstate_global->__pyx_n_s_UPGRADE #define __pyx_n_s_URI __pyx_mstate_global->__pyx_n_s_URI #define __pyx_n_s_URL __pyx_mstate_global->__pyx_n_s_URL #define __pyx_n_s_URL_2 __pyx_mstate_global->__pyx_n_s_URL_2 #define __pyx_n_s_USER_AGENT __pyx_mstate_global->__pyx_n_s_USER_AGENT #define __pyx_n_s_VARY __pyx_mstate_global->__pyx_n_s_VARY #define __pyx_n_s_VIA __pyx_mstate_global->__pyx_n_s_VIA #define __pyx_n_s_WANT_DIGEST __pyx_mstate_global->__pyx_n_s_WANT_DIGEST #define __pyx_n_s_WARNING __pyx_mstate_global->__pyx_n_s_WARNING #define __pyx_n_s_WWW_AUTHENTICATE __pyx_mstate_global->__pyx_n_s_WWW_AUTHENTICATE #define __pyx_n_s_X_FORWARDED_FOR __pyx_mstate_global->__pyx_n_s_X_FORWARDED_FOR #define __pyx_n_s_X_FORWARDED_HOST __pyx_mstate_global->__pyx_n_s_X_FORWARDED_HOST #define __pyx_n_s_X_FORWARDED_PROTO __pyx_mstate_global->__pyx_n_s_X_FORWARDED_PROTO #define __pyx_kp_u__10 __pyx_mstate_global->__pyx_kp_u__10 #define __pyx_kp_u__12 __pyx_mstate_global->__pyx_kp_u__12 #define __pyx_kp_u__2 __pyx_mstate_global->__pyx_kp_u__2 #define __pyx_kp_u__3 __pyx_mstate_global->__pyx_kp_u__3 #define __pyx_kp_b__4 __pyx_mstate_global->__pyx_kp_b__4 #define __pyx_kp_u__6 __pyx_mstate_global->__pyx_kp_u__6 #define __pyx_kp_u__7 __pyx_mstate_global->__pyx_kp_u__7 #define __pyx_n_s__8 __pyx_mstate_global->__pyx_n_s__8 #define __pyx_kp_b__8 __pyx_mstate_global->__pyx_kp_b__8 #define __pyx_kp_u__8 __pyx_mstate_global->__pyx_kp_u__8 #define __pyx_n_s__9 __pyx_mstate_global->__pyx_n_s__9 #define __pyx_kp_u__9 __pyx_mstate_global->__pyx_kp_u__9 #define __pyx_n_s_add __pyx_mstate_global->__pyx_n_s_add #define __pyx_n_s_after __pyx_mstate_global->__pyx_n_s_after #define __pyx_n_s_after_b __pyx_mstate_global->__pyx_n_s_after_b #define __pyx_n_s_aiohttp __pyx_mstate_global->__pyx_n_s_aiohttp #define __pyx_n_s_aiohttp__http_parser __pyx_mstate_global->__pyx_n_s_aiohttp__http_parser #define __pyx_kp_s_aiohttp__http_parser_pyx __pyx_mstate_global->__pyx_kp_s_aiohttp__http_parser_pyx #define __pyx_n_s_aiohttp_helpers __pyx_mstate_global->__pyx_n_s_aiohttp_helpers #define __pyx_n_s_all __pyx_mstate_global->__pyx_n_s_all #define __pyx_n_s_args __pyx_mstate_global->__pyx_n_s_args #define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines #define __pyx_n_s_authority __pyx_mstate_global->__pyx_n_s_authority #define __pyx_n_s_auto_decompress __pyx_mstate_global->__pyx_n_s_auto_decompress #define __pyx_n_s_before __pyx_mstate_global->__pyx_n_s_before #define __pyx_n_s_begin_http_chunk_receiving __pyx_mstate_global->__pyx_n_s_begin_http_chunk_receiving #define __pyx_n_u_br __pyx_mstate_global->__pyx_n_u_br #define __pyx_n_s_build __pyx_mstate_global->__pyx_n_s_build #define __pyx_n_s_chunked __pyx_mstate_global->__pyx_n_s_chunked #define __pyx_n_u_chunked __pyx_mstate_global->__pyx_n_u_chunked #define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback #define __pyx_n_s_close __pyx_mstate_global->__pyx_n_s_close #define __pyx_n_s_code __pyx_mstate_global->__pyx_n_s_code #define __pyx_n_u_code __pyx_mstate_global->__pyx_n_u_code #define __pyx_n_s_compression __pyx_mstate_global->__pyx_n_s_compression #define __pyx_n_u_compression __pyx_mstate_global->__pyx_n_u_compression #define __pyx_n_s_data __pyx_mstate_global->__pyx_n_s_data #define __pyx_n_s_data_len __pyx_mstate_global->__pyx_n_s_data_len #define __pyx_n_s_dct __pyx_mstate_global->__pyx_n_s_dct #define __pyx_n_u_deflate __pyx_mstate_global->__pyx_n_u_deflate #define __pyx_n_s_desc __pyx_mstate_global->__pyx_n_s_desc #define __pyx_n_s_dict __pyx_mstate_global->__pyx_n_s_dict #define __pyx_n_s_dict_2 __pyx_mstate_global->__pyx_n_s_dict_2 #define __pyx_kp_u_disable __pyx_mstate_global->__pyx_kp_u_disable #define __pyx_kp_u_enable __pyx_mstate_global->__pyx_kp_u_enable #define __pyx_n_s_encoded __pyx_mstate_global->__pyx_n_s_encoded #define __pyx_n_s_end_http_chunk_receiving __pyx_mstate_global->__pyx_n_s_end_http_chunk_receiving #define __pyx_n_s_errno __pyx_mstate_global->__pyx_n_s_errno #define __pyx_n_s_error __pyx_mstate_global->__pyx_n_s_error #define __pyx_n_s_ex __pyx_mstate_global->__pyx_n_s_ex #define __pyx_n_s_feed_data __pyx_mstate_global->__pyx_n_s_feed_data #define __pyx_n_s_feed_eof __pyx_mstate_global->__pyx_n_s_feed_eof #define __pyx_n_s_format __pyx_mstate_global->__pyx_n_s_format #define __pyx_n_s_fragment __pyx_mstate_global->__pyx_n_s_fragment #define __pyx_kp_u_gc __pyx_mstate_global->__pyx_kp_u_gc #define __pyx_n_s_genexpr __pyx_mstate_global->__pyx_n_s_genexpr #define __pyx_n_s_getstate __pyx_mstate_global->__pyx_n_s_getstate #define __pyx_n_u_gzip __pyx_mstate_global->__pyx_n_u_gzip #define __pyx_n_s_hdrs __pyx_mstate_global->__pyx_n_s_hdrs #define __pyx_n_s_headers __pyx_mstate_global->__pyx_n_s_headers #define __pyx_n_u_headers __pyx_mstate_global->__pyx_n_u_headers #define __pyx_n_s_http_exceptions __pyx_mstate_global->__pyx_n_s_http_exceptions #define __pyx_n_s_http_parser __pyx_mstate_global->__pyx_n_s_http_parser #define __pyx_n_s_http_writer __pyx_mstate_global->__pyx_n_s_http_writer #define __pyx_n_s_i __pyx_mstate_global->__pyx_n_s_i #define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import #define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine #define __pyx_kp_u_isenabled __pyx_mstate_global->__pyx_kp_u_isenabled #define __pyx_n_s_limit __pyx_mstate_global->__pyx_n_s_limit #define __pyx_n_s_loop __pyx_mstate_global->__pyx_n_s_loop #define __pyx_n_s_lower __pyx_mstate_global->__pyx_n_s_lower #define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main #define __pyx_n_s_max_field_size __pyx_mstate_global->__pyx_n_s_max_field_size #define __pyx_n_s_max_headers __pyx_mstate_global->__pyx_n_s_max_headers #define __pyx_n_s_max_line_size __pyx_mstate_global->__pyx_n_s_max_line_size #define __pyx_n_s_messages __pyx_mstate_global->__pyx_n_s_messages #define __pyx_n_s_method __pyx_mstate_global->__pyx_n_s_method #define __pyx_n_u_method __pyx_mstate_global->__pyx_n_u_method #define __pyx_n_s_multidict __pyx_mstate_global->__pyx_n_s_multidict #define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name #define __pyx_n_s_nb __pyx_mstate_global->__pyx_n_s_nb #define __pyx_n_s_new __pyx_mstate_global->__pyx_n_s_new #define __pyx_kp_s_no_default___reduce___due_to_non __pyx_mstate_global->__pyx_kp_s_no_default___reduce___due_to_non #define __pyx_n_s_path __pyx_mstate_global->__pyx_n_s_path #define __pyx_n_u_path __pyx_mstate_global->__pyx_n_u_path #define __pyx_n_s_payload_exception __pyx_mstate_global->__pyx_n_s_payload_exception #define __pyx_n_s_pickle __pyx_mstate_global->__pyx_n_s_pickle #define __pyx_n_s_pointer __pyx_mstate_global->__pyx_n_s_pointer #define __pyx_n_s_protocol __pyx_mstate_global->__pyx_n_s_protocol #define __pyx_n_s_pyx_PickleError __pyx_mstate_global->__pyx_n_s_pyx_PickleError #define __pyx_n_s_pyx_checksum __pyx_mstate_global->__pyx_n_s_pyx_checksum #define __pyx_n_s_pyx_result __pyx_mstate_global->__pyx_n_s_pyx_result #define __pyx_n_s_pyx_state __pyx_mstate_global->__pyx_n_s_pyx_state #define __pyx_n_s_pyx_type __pyx_mstate_global->__pyx_n_s_pyx_type #define __pyx_n_s_pyx_unpickle_RawRequestMessage __pyx_mstate_global->__pyx_n_s_pyx_unpickle_RawRequestMessage #define __pyx_n_s_pyx_unpickle_RawResponseMessag __pyx_mstate_global->__pyx_n_s_pyx_unpickle_RawResponseMessag #define __pyx_n_s_pyx_vtable __pyx_mstate_global->__pyx_n_s_pyx_vtable #define __pyx_n_s_query_string __pyx_mstate_global->__pyx_n_s_query_string #define __pyx_kp_u_r __pyx_mstate_global->__pyx_kp_u_r #define __pyx_n_s_range __pyx_mstate_global->__pyx_n_s_range #define __pyx_n_s_raw_headers __pyx_mstate_global->__pyx_n_s_raw_headers #define __pyx_n_u_raw_headers __pyx_mstate_global->__pyx_n_u_raw_headers #define __pyx_n_s_read_until_eof __pyx_mstate_global->__pyx_n_s_read_until_eof #define __pyx_n_s_reason __pyx_mstate_global->__pyx_n_s_reason #define __pyx_n_u_reason __pyx_mstate_global->__pyx_n_u_reason #define __pyx_n_s_reduce __pyx_mstate_global->__pyx_n_s_reduce #define __pyx_n_s_reduce_cython __pyx_mstate_global->__pyx_n_s_reduce_cython #define __pyx_n_s_reduce_ex __pyx_mstate_global->__pyx_n_s_reduce_ex #define __pyx_n_s_replace __pyx_mstate_global->__pyx_n_s_replace #define __pyx_n_s_repr___locals_genexpr __pyx_mstate_global->__pyx_n_s_repr___locals_genexpr #define __pyx_n_s_response_with_body __pyx_mstate_global->__pyx_n_s_response_with_body #define __pyx_n_s_ret __pyx_mstate_global->__pyx_n_s_ret #define __pyx_n_s_rsplit __pyx_mstate_global->__pyx_n_s_rsplit #define __pyx_n_s_self __pyx_mstate_global->__pyx_n_s_self #define __pyx_n_s_send __pyx_mstate_global->__pyx_n_s_send #define __pyx_n_s_set_exception __pyx_mstate_global->__pyx_n_s_set_exception #define __pyx_n_s_set_upgraded __pyx_mstate_global->__pyx_n_s_set_upgraded #define __pyx_n_s_setstate __pyx_mstate_global->__pyx_n_s_setstate #define __pyx_n_s_setstate_cython __pyx_mstate_global->__pyx_n_s_setstate_cython #define __pyx_n_s_should_close __pyx_mstate_global->__pyx_n_s_should_close #define __pyx_n_u_should_close __pyx_mstate_global->__pyx_n_u_should_close #define __pyx_n_s_split __pyx_mstate_global->__pyx_n_s_split #define __pyx_n_s_state __pyx_mstate_global->__pyx_n_s_state #define __pyx_n_s_streams __pyx_mstate_global->__pyx_n_s_streams #define __pyx_kp_s_stringsource __pyx_mstate_global->__pyx_kp_s_stringsource #define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test #define __pyx_n_s_throw __pyx_mstate_global->__pyx_n_s_throw #define __pyx_n_s_timer __pyx_mstate_global->__pyx_n_s_timer #define __pyx_kp_u_unknown __pyx_mstate_global->__pyx_kp_u_unknown #define __pyx_n_s_update __pyx_mstate_global->__pyx_n_s_update #define __pyx_n_s_upgrade __pyx_mstate_global->__pyx_n_s_upgrade #define __pyx_n_u_upgrade __pyx_mstate_global->__pyx_n_u_upgrade #define __pyx_n_s_url __pyx_mstate_global->__pyx_n_s_url #define __pyx_n_u_url __pyx_mstate_global->__pyx_n_u_url #define __pyx_n_s_use_setstate __pyx_mstate_global->__pyx_n_s_use_setstate #define __pyx_n_s_val __pyx_mstate_global->__pyx_n_s_val #define __pyx_n_s_version __pyx_mstate_global->__pyx_n_s_version #define __pyx_n_u_version __pyx_mstate_global->__pyx_n_u_version #define __pyx_n_s_yarl __pyx_mstate_global->__pyx_n_s_yarl #define __pyx_int_1 __pyx_mstate_global->__pyx_int_1 #define __pyx_int_4084195 __pyx_mstate_global->__pyx_int_4084195 #define __pyx_int_21004882 __pyx_mstate_global->__pyx_int_21004882 #define __pyx_int_83803150 __pyx_mstate_global->__pyx_int_83803150 #define __pyx_int_209127132 __pyx_mstate_global->__pyx_int_209127132 #define __pyx_int_213037754 __pyx_mstate_global->__pyx_int_213037754 #define __pyx_int_257960607 __pyx_mstate_global->__pyx_int_257960607 #define __pyx_tuple__5 __pyx_mstate_global->__pyx_tuple__5 #define __pyx_tuple__11 __pyx_mstate_global->__pyx_tuple__11 #define __pyx_tuple__13 __pyx_mstate_global->__pyx_tuple__13 #define __pyx_tuple__14 __pyx_mstate_global->__pyx_tuple__14 #define __pyx_tuple__15 __pyx_mstate_global->__pyx_tuple__15 #define __pyx_tuple__17 __pyx_mstate_global->__pyx_tuple__17 #define __pyx_tuple__19 __pyx_mstate_global->__pyx_tuple__19 #define __pyx_tuple__23 __pyx_mstate_global->__pyx_tuple__23 #define __pyx_tuple__25 __pyx_mstate_global->__pyx_tuple__25 #define __pyx_tuple__27 __pyx_mstate_global->__pyx_tuple__27 #define __pyx_tuple__29 __pyx_mstate_global->__pyx_tuple__29 #define __pyx_tuple__36 __pyx_mstate_global->__pyx_tuple__36 #define __pyx_codeobj__16 __pyx_mstate_global->__pyx_codeobj__16 #define __pyx_codeobj__18 __pyx_mstate_global->__pyx_codeobj__18 #define __pyx_codeobj__20 __pyx_mstate_global->__pyx_codeobj__20 #define __pyx_codeobj__21 __pyx_mstate_global->__pyx_codeobj__21 #define __pyx_codeobj__22 __pyx_mstate_global->__pyx_codeobj__22 #define __pyx_codeobj__24 __pyx_mstate_global->__pyx_codeobj__24 #define __pyx_codeobj__26 __pyx_mstate_global->__pyx_codeobj__26 #define __pyx_codeobj__28 __pyx_mstate_global->__pyx_codeobj__28 #define __pyx_codeobj__30 __pyx_mstate_global->__pyx_codeobj__30 #define __pyx_codeobj__31 __pyx_mstate_global->__pyx_codeobj__31 #define __pyx_codeobj__32 __pyx_mstate_global->__pyx_codeobj__32 #define __pyx_codeobj__33 __pyx_mstate_global->__pyx_codeobj__33 #define __pyx_codeobj__34 __pyx_mstate_global->__pyx_codeobj__34 #define __pyx_codeobj__35 __pyx_mstate_global->__pyx_codeobj__35 #define __pyx_codeobj__37 __pyx_mstate_global->__pyx_codeobj__37 #define __pyx_codeobj__38 __pyx_mstate_global->__pyx_codeobj__38 /* #### Code section: module_code ### */ /* "cpython/complex.pxd":19 * * @property * cdef inline double real(self): # <<<<<<<<<<<<<< * return self.cval.real * */ static CYTHON_INLINE double __pyx_f_7cpython_7complex_7complex_4real_real(PyComplexObject *__pyx_v_self) { double __pyx_r; /* "cpython/complex.pxd":20 * @property * cdef inline double real(self): * return self.cval.real # <<<<<<<<<<<<<< * * @property */ __pyx_r = __pyx_v_self->cval.real; goto __pyx_L0; /* "cpython/complex.pxd":19 * * @property * cdef inline double real(self): # <<<<<<<<<<<<<< * return self.cval.real * */ /* function exit code */ __pyx_L0:; return __pyx_r; } /* "cpython/complex.pxd":23 * * @property * cdef inline double imag(self): # <<<<<<<<<<<<<< * return self.cval.imag * */ static CYTHON_INLINE double __pyx_f_7cpython_7complex_7complex_4imag_imag(PyComplexObject *__pyx_v_self) { double __pyx_r; /* "cpython/complex.pxd":24 * @property * cdef inline double imag(self): * return self.cval.imag # <<<<<<<<<<<<<< * * # PyTypeObject PyComplex_Type */ __pyx_r = __pyx_v_self->cval.imag; goto __pyx_L0; /* "cpython/complex.pxd":23 * * @property * cdef inline double imag(self): # <<<<<<<<<<<<<< * return self.cval.imag * */ /* function exit code */ __pyx_L0:; return __pyx_r; } /* "cpython/contextvars.pxd":112 * * * cdef inline object get_value(var, default_value=None): # <<<<<<<<<<<<<< * """Return a new reference to the value of the context variable, * or the default value of the context variable, */ static CYTHON_INLINE PyObject *__pyx_f_7cpython_11contextvars_get_value(PyObject *__pyx_v_var, struct __pyx_opt_args_7cpython_11contextvars_get_value *__pyx_optional_args) { PyObject *__pyx_v_default_value = ((PyObject *)Py_None); PyObject *__pyx_v_value; PyObject *__pyx_v_pyvalue = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("get_value", 1); if (__pyx_optional_args) { if (__pyx_optional_args->__pyx_n > 0) { __pyx_v_default_value = __pyx_optional_args->default_value; } } /* "cpython/contextvars.pxd":117 * or None if no such value or default was found. * """ * cdef PyObject *value = NULL # <<<<<<<<<<<<<< * PyContextVar_Get(var, NULL, &value) * if value is NULL: */ __pyx_v_value = NULL; /* "cpython/contextvars.pxd":118 * """ * cdef PyObject *value = NULL * PyContextVar_Get(var, NULL, &value) # <<<<<<<<<<<<<< * if value is NULL: * # context variable does not have a default */ __pyx_t_1 = PyContextVar_Get(__pyx_v_var, NULL, (&__pyx_v_value)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(2, 118, __pyx_L1_error) /* "cpython/contextvars.pxd":119 * cdef PyObject *value = NULL * PyContextVar_Get(var, NULL, &value) * if value is NULL: # <<<<<<<<<<<<<< * # context variable does not have a default * pyvalue = default_value */ __pyx_t_2 = (__pyx_v_value == NULL); if (__pyx_t_2) { /* "cpython/contextvars.pxd":121 * if value is NULL: * # context variable does not have a default * pyvalue = default_value # <<<<<<<<<<<<<< * else: * # value or default value of context variable */ __Pyx_INCREF(__pyx_v_default_value); __pyx_v_pyvalue = __pyx_v_default_value; /* "cpython/contextvars.pxd":119 * cdef PyObject *value = NULL * PyContextVar_Get(var, NULL, &value) * if value is NULL: # <<<<<<<<<<<<<< * # context variable does not have a default * pyvalue = default_value */ goto __pyx_L3; } /* "cpython/contextvars.pxd":124 * else: * # value or default value of context variable * pyvalue = value # <<<<<<<<<<<<<< * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' * return pyvalue */ /*else*/ { __pyx_t_3 = ((PyObject *)__pyx_v_value); __Pyx_INCREF(__pyx_t_3); __pyx_v_pyvalue = __pyx_t_3; __pyx_t_3 = 0; /* "cpython/contextvars.pxd":125 * # value or default value of context variable * pyvalue = value * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' # <<<<<<<<<<<<<< * return pyvalue * */ Py_XDECREF(__pyx_v_value); } __pyx_L3:; /* "cpython/contextvars.pxd":126 * pyvalue = value * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' * return pyvalue # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_pyvalue); __pyx_r = __pyx_v_pyvalue; goto __pyx_L0; /* "cpython/contextvars.pxd":112 * * * cdef inline object get_value(var, default_value=None): # <<<<<<<<<<<<<< * """Return a new reference to the value of the context variable, * or the default value of the context variable, */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("cpython.contextvars.get_value", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_pyvalue); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "cpython/contextvars.pxd":129 * * * cdef inline object get_value_no_default(var, default_value=None): # <<<<<<<<<<<<<< * """Return a new reference to the value of the context variable, * or the provided default value if no such value was found. */ static CYTHON_INLINE PyObject *__pyx_f_7cpython_11contextvars_get_value_no_default(PyObject *__pyx_v_var, struct __pyx_opt_args_7cpython_11contextvars_get_value_no_default *__pyx_optional_args) { PyObject *__pyx_v_default_value = ((PyObject *)Py_None); PyObject *__pyx_v_value; PyObject *__pyx_v_pyvalue = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("get_value_no_default", 1); if (__pyx_optional_args) { if (__pyx_optional_args->__pyx_n > 0) { __pyx_v_default_value = __pyx_optional_args->default_value; } } /* "cpython/contextvars.pxd":135 * Ignores the default value of the context variable, if any. * """ * cdef PyObject *value = NULL # <<<<<<<<<<<<<< * PyContextVar_Get(var, default_value, &value) * # value of context variable or 'default_value' */ __pyx_v_value = NULL; /* "cpython/contextvars.pxd":136 * """ * cdef PyObject *value = NULL * PyContextVar_Get(var, default_value, &value) # <<<<<<<<<<<<<< * # value of context variable or 'default_value' * pyvalue = value */ __pyx_t_1 = PyContextVar_Get(__pyx_v_var, ((PyObject *)__pyx_v_default_value), (&__pyx_v_value)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(2, 136, __pyx_L1_error) /* "cpython/contextvars.pxd":138 * PyContextVar_Get(var, default_value, &value) * # value of context variable or 'default_value' * pyvalue = value # <<<<<<<<<<<<<< * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' * return pyvalue */ __pyx_t_2 = ((PyObject *)__pyx_v_value); __Pyx_INCREF(__pyx_t_2); __pyx_v_pyvalue = __pyx_t_2; __pyx_t_2 = 0; /* "cpython/contextvars.pxd":139 * # value of context variable or 'default_value' * pyvalue = value * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' # <<<<<<<<<<<<<< * return pyvalue */ Py_XDECREF(__pyx_v_value); /* "cpython/contextvars.pxd":140 * pyvalue = value * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' * return pyvalue # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_pyvalue); __pyx_r = __pyx_v_pyvalue; goto __pyx_L0; /* "cpython/contextvars.pxd":129 * * * cdef inline object get_value_no_default(var, default_value=None): # <<<<<<<<<<<<<< * """Return a new reference to the value of the context variable, * or the provided default value if no such value was found. */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("cpython.contextvars.get_value_no_default", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_pyvalue); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":74 * * * cdef inline object extend(object buf, const char* at, size_t length): # <<<<<<<<<<<<<< * cdef Py_ssize_t s * cdef char* ptr */ static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_extend(PyObject *__pyx_v_buf, char const *__pyx_v_at, size_t __pyx_v_length) { Py_ssize_t __pyx_v_s; char *__pyx_v_ptr; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations Py_ssize_t __pyx_t_1; int __pyx_t_2; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("extend", 1); /* "aiohttp/_http_parser.pyx":77 * cdef Py_ssize_t s * cdef char* ptr * s = PyByteArray_Size(buf) # <<<<<<<<<<<<<< * PyByteArray_Resize(buf, s + length) * ptr = PyByteArray_AsString(buf) */ __pyx_t_1 = PyByteArray_Size(__pyx_v_buf); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1L))) __PYX_ERR(0, 77, __pyx_L1_error) __pyx_v_s = __pyx_t_1; /* "aiohttp/_http_parser.pyx":78 * cdef char* ptr * s = PyByteArray_Size(buf) * PyByteArray_Resize(buf, s + length) # <<<<<<<<<<<<<< * ptr = PyByteArray_AsString(buf) * memcpy(ptr + s, at, length) */ __pyx_t_2 = PyByteArray_Resize(__pyx_v_buf, (__pyx_v_s + __pyx_v_length)); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 78, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":79 * s = PyByteArray_Size(buf) * PyByteArray_Resize(buf, s + length) * ptr = PyByteArray_AsString(buf) # <<<<<<<<<<<<<< * memcpy(ptr + s, at, length) * */ __pyx_v_ptr = PyByteArray_AsString(__pyx_v_buf); /* "aiohttp/_http_parser.pyx":80 * PyByteArray_Resize(buf, s + length) * ptr = PyByteArray_AsString(buf) * memcpy(ptr + s, at, length) # <<<<<<<<<<<<<< * * */ (void)(memcpy((__pyx_v_ptr + __pyx_v_s), __pyx_v_at, __pyx_v_length)); /* "aiohttp/_http_parser.pyx":74 * * * cdef inline object extend(object buf, const char* at, size_t length): # <<<<<<<<<<<<<< * cdef Py_ssize_t s * cdef char* ptr */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_parser.extend", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":92 * * * cdef inline str http_method_str(int i): # <<<<<<<<<<<<<< * if i < METHODS_COUNT: * return _http_method[i] */ static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_http_method_str(int __pyx_v_i) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("http_method_str", 1); /* "aiohttp/_http_parser.pyx":93 * * cdef inline str http_method_str(int i): * if i < METHODS_COUNT: # <<<<<<<<<<<<<< * return _http_method[i] * else: */ __pyx_t_1 = (__pyx_v_i < 46); if (__pyx_t_1) { /* "aiohttp/_http_parser.pyx":94 * cdef inline str http_method_str(int i): * if i < METHODS_COUNT: * return _http_method[i] # <<<<<<<<<<<<<< * else: * return "" */ __Pyx_XDECREF(__pyx_r); if (unlikely(__pyx_v_7aiohttp_12_http_parser__http_method == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 94, __pyx_L1_error) } __pyx_t_2 = __Pyx_GetItemInt_List(__pyx_v_7aiohttp_12_http_parser__http_method, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 1, 1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 94, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(((PyObject*)__pyx_t_2)); __pyx_r = ((PyObject*)__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":93 * * cdef inline str http_method_str(int i): * if i < METHODS_COUNT: # <<<<<<<<<<<<<< * return _http_method[i] * else: */ } /* "aiohttp/_http_parser.pyx":96 * return _http_method[i] * else: * return "" # <<<<<<<<<<<<<< * * cdef inline object find_header(bytes raw_header): */ /*else*/ { __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_kp_u_unknown); __pyx_r = __pyx_kp_u_unknown; goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":92 * * * cdef inline str http_method_str(int i): # <<<<<<<<<<<<<< * if i < METHODS_COUNT: * return _http_method[i] */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("aiohttp._http_parser.http_method_str", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":98 * return "" * * cdef inline object find_header(bytes raw_header): # <<<<<<<<<<<<<< * cdef Py_ssize_t size * cdef char *buf */ static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_find_header(PyObject *__pyx_v_raw_header) { Py_ssize_t __pyx_v_size; char *__pyx_v_buf; int __pyx_v_idx; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("find_header", 1); /* "aiohttp/_http_parser.pyx":102 * cdef char *buf * cdef int idx * PyBytes_AsStringAndSize(raw_header, &buf, &size) # <<<<<<<<<<<<<< * idx = _find_header.find_header(buf, size) * if idx == -1: */ __pyx_t_1 = PyBytes_AsStringAndSize(__pyx_v_raw_header, (&__pyx_v_buf), (&__pyx_v_size)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 102, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":103 * cdef int idx * PyBytes_AsStringAndSize(raw_header, &buf, &size) * idx = _find_header.find_header(buf, size) # <<<<<<<<<<<<<< * if idx == -1: * return raw_header.decode('utf-8', 'surrogateescape') */ __pyx_v_idx = find_header(__pyx_v_buf, __pyx_v_size); /* "aiohttp/_http_parser.pyx":104 * PyBytes_AsStringAndSize(raw_header, &buf, &size) * idx = _find_header.find_header(buf, size) * if idx == -1: # <<<<<<<<<<<<<< * return raw_header.decode('utf-8', 'surrogateescape') * return headers[idx] */ __pyx_t_2 = (__pyx_v_idx == -1L); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":105 * idx = _find_header.find_header(buf, size) * if idx == -1: * return raw_header.decode('utf-8', 'surrogateescape') # <<<<<<<<<<<<<< * return headers[idx] * */ __Pyx_XDECREF(__pyx_r); if (unlikely(__pyx_v_raw_header == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "decode"); __PYX_ERR(0, 105, __pyx_L1_error) } __pyx_t_3 = __Pyx_decode_bytes(__pyx_v_raw_header, 0, PY_SSIZE_T_MAX, NULL, ((char const *)"surrogateescape"), PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 105, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":104 * PyBytes_AsStringAndSize(raw_header, &buf, &size) * idx = _find_header.find_header(buf, size) * if idx == -1: # <<<<<<<<<<<<<< * return raw_header.decode('utf-8', 'surrogateescape') * return headers[idx] */ } /* "aiohttp/_http_parser.pyx":106 * if idx == -1: * return raw_header.decode('utf-8', 'surrogateescape') * return headers[idx] # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); if (unlikely(__pyx_v_7aiohttp_12_http_parser_headers == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 106, __pyx_L1_error) } __pyx_t_3 = __Pyx_GetItemInt_Tuple(__pyx_v_7aiohttp_12_http_parser_headers, __pyx_v_idx, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 106, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":98 * return "" * * cdef inline object find_header(bytes raw_header): # <<<<<<<<<<<<<< * cdef Py_ssize_t size * cdef char *buf */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("aiohttp._http_parser.find_header", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":122 * cdef readonly object url # yarl.URL * * def __init__(self, method, path, version, headers, raw_headers, # <<<<<<<<<<<<<< * should_close, compression, upgrade, chunked, url): * self.method = method */ /* Python wrapper */ static int __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_method = 0; PyObject *__pyx_v_path = 0; PyObject *__pyx_v_version = 0; PyObject *__pyx_v_headers = 0; PyObject *__pyx_v_raw_headers = 0; PyObject *__pyx_v_should_close = 0; PyObject *__pyx_v_compression = 0; PyObject *__pyx_v_upgrade = 0; PyObject *__pyx_v_chunked = 0; PyObject *__pyx_v_url = 0; CYTHON_UNUSED Py_ssize_t __pyx_nargs; CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[10] = {0,0,0,0,0,0,0,0,0,0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; #endif __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_method,&__pyx_n_s_path,&__pyx_n_s_version,&__pyx_n_s_headers,&__pyx_n_s_raw_headers,&__pyx_n_s_should_close,&__pyx_n_s_compression,&__pyx_n_s_upgrade,&__pyx_n_s_chunked,&__pyx_n_s_url,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 10: values[9] = __Pyx_Arg_VARARGS(__pyx_args, 9); CYTHON_FALLTHROUGH; case 9: values[8] = __Pyx_Arg_VARARGS(__pyx_args, 8); CYTHON_FALLTHROUGH; case 8: values[7] = __Pyx_Arg_VARARGS(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = __Pyx_Arg_VARARGS(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_method)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_path)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[1]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 1); __PYX_ERR(0, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_version)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[2]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 2); __PYX_ERR(0, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_headers)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[3]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 3); __PYX_ERR(0, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_raw_headers)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[4]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 4); __PYX_ERR(0, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (likely((values[5] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_should_close)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[5]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 5); __PYX_ERR(0, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 6: if (likely((values[6] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_compression)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[6]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 6); __PYX_ERR(0, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 7: if (likely((values[7] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_upgrade)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[7]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 7); __PYX_ERR(0, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 8: if (likely((values[8] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_chunked)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[8]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 8); __PYX_ERR(0, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 9: if (likely((values[9] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_url)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[9]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 9); __PYX_ERR(0, 122, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 122, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 10)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); values[6] = __Pyx_Arg_VARARGS(__pyx_args, 6); values[7] = __Pyx_Arg_VARARGS(__pyx_args, 7); values[8] = __Pyx_Arg_VARARGS(__pyx_args, 8); values[9] = __Pyx_Arg_VARARGS(__pyx_args, 9); } __pyx_v_method = values[0]; __pyx_v_path = values[1]; __pyx_v_version = values[2]; __pyx_v_headers = values[3]; __pyx_v_raw_headers = values[4]; __pyx_v_should_close = values[5]; __pyx_v_compression = values[6]; __pyx_v_upgrade = values[7]; __pyx_v_chunked = values[8]; __pyx_v_url = values[9]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, __pyx_nargs); __PYX_ERR(0, 122, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage___init__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self), __pyx_v_method, __pyx_v_path, __pyx_v_version, __pyx_v_headers, __pyx_v_raw_headers, __pyx_v_should_close, __pyx_v_compression, __pyx_v_upgrade, __pyx_v_chunked, __pyx_v_url); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage___init__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self, PyObject *__pyx_v_method, PyObject *__pyx_v_path, PyObject *__pyx_v_version, PyObject *__pyx_v_headers, PyObject *__pyx_v_raw_headers, PyObject *__pyx_v_should_close, PyObject *__pyx_v_compression, PyObject *__pyx_v_upgrade, PyObject *__pyx_v_chunked, PyObject *__pyx_v_url) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__init__", 1); /* "aiohttp/_http_parser.pyx":124 * def __init__(self, method, path, version, headers, raw_headers, * should_close, compression, upgrade, chunked, url): * self.method = method # <<<<<<<<<<<<<< * self.path = path * self.version = version */ if (!(likely(PyUnicode_CheckExact(__pyx_v_method))||((__pyx_v_method) == Py_None) || __Pyx_RaiseUnexpectedTypeError("unicode", __pyx_v_method))) __PYX_ERR(0, 124, __pyx_L1_error) __pyx_t_1 = __pyx_v_method; __Pyx_INCREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_self->method); __Pyx_DECREF(__pyx_v_self->method); __pyx_v_self->method = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":125 * should_close, compression, upgrade, chunked, url): * self.method = method * self.path = path # <<<<<<<<<<<<<< * self.version = version * self.headers = headers */ if (!(likely(PyUnicode_CheckExact(__pyx_v_path))||((__pyx_v_path) == Py_None) || __Pyx_RaiseUnexpectedTypeError("unicode", __pyx_v_path))) __PYX_ERR(0, 125, __pyx_L1_error) __pyx_t_1 = __pyx_v_path; __Pyx_INCREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_self->path); __Pyx_DECREF(__pyx_v_self->path); __pyx_v_self->path = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":126 * self.method = method * self.path = path * self.version = version # <<<<<<<<<<<<<< * self.headers = headers * self.raw_headers = raw_headers */ __Pyx_INCREF(__pyx_v_version); __Pyx_GIVEREF(__pyx_v_version); __Pyx_GOTREF(__pyx_v_self->version); __Pyx_DECREF(__pyx_v_self->version); __pyx_v_self->version = __pyx_v_version; /* "aiohttp/_http_parser.pyx":127 * self.path = path * self.version = version * self.headers = headers # <<<<<<<<<<<<<< * self.raw_headers = raw_headers * self.should_close = should_close */ __Pyx_INCREF(__pyx_v_headers); __Pyx_GIVEREF(__pyx_v_headers); __Pyx_GOTREF(__pyx_v_self->headers); __Pyx_DECREF(__pyx_v_self->headers); __pyx_v_self->headers = __pyx_v_headers; /* "aiohttp/_http_parser.pyx":128 * self.version = version * self.headers = headers * self.raw_headers = raw_headers # <<<<<<<<<<<<<< * self.should_close = should_close * self.compression = compression */ __Pyx_INCREF(__pyx_v_raw_headers); __Pyx_GIVEREF(__pyx_v_raw_headers); __Pyx_GOTREF(__pyx_v_self->raw_headers); __Pyx_DECREF(__pyx_v_self->raw_headers); __pyx_v_self->raw_headers = __pyx_v_raw_headers; /* "aiohttp/_http_parser.pyx":129 * self.headers = headers * self.raw_headers = raw_headers * self.should_close = should_close # <<<<<<<<<<<<<< * self.compression = compression * self.upgrade = upgrade */ __Pyx_INCREF(__pyx_v_should_close); __Pyx_GIVEREF(__pyx_v_should_close); __Pyx_GOTREF(__pyx_v_self->should_close); __Pyx_DECREF(__pyx_v_self->should_close); __pyx_v_self->should_close = __pyx_v_should_close; /* "aiohttp/_http_parser.pyx":130 * self.raw_headers = raw_headers * self.should_close = should_close * self.compression = compression # <<<<<<<<<<<<<< * self.upgrade = upgrade * self.chunked = chunked */ __Pyx_INCREF(__pyx_v_compression); __Pyx_GIVEREF(__pyx_v_compression); __Pyx_GOTREF(__pyx_v_self->compression); __Pyx_DECREF(__pyx_v_self->compression); __pyx_v_self->compression = __pyx_v_compression; /* "aiohttp/_http_parser.pyx":131 * self.should_close = should_close * self.compression = compression * self.upgrade = upgrade # <<<<<<<<<<<<<< * self.chunked = chunked * self.url = url */ __Pyx_INCREF(__pyx_v_upgrade); __Pyx_GIVEREF(__pyx_v_upgrade); __Pyx_GOTREF(__pyx_v_self->upgrade); __Pyx_DECREF(__pyx_v_self->upgrade); __pyx_v_self->upgrade = __pyx_v_upgrade; /* "aiohttp/_http_parser.pyx":132 * self.compression = compression * self.upgrade = upgrade * self.chunked = chunked # <<<<<<<<<<<<<< * self.url = url * */ __Pyx_INCREF(__pyx_v_chunked); __Pyx_GIVEREF(__pyx_v_chunked); __Pyx_GOTREF(__pyx_v_self->chunked); __Pyx_DECREF(__pyx_v_self->chunked); __pyx_v_self->chunked = __pyx_v_chunked; /* "aiohttp/_http_parser.pyx":133 * self.upgrade = upgrade * self.chunked = chunked * self.url = url # <<<<<<<<<<<<<< * * def __repr__(self): */ __Pyx_INCREF(__pyx_v_url); __Pyx_GIVEREF(__pyx_v_url); __Pyx_GOTREF(__pyx_v_self->url); __Pyx_DECREF(__pyx_v_self->url); __pyx_v_self->url = __pyx_v_url; /* "aiohttp/_http_parser.pyx":122 * cdef readonly object url # yarl.URL * * def __init__(self, method, path, version, headers, raw_headers, # <<<<<<<<<<<<<< * should_close, compression, upgrade, chunked, url): * self.method = method */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":135 * self.url = url * * def __repr__(self): # <<<<<<<<<<<<<< * info = [] * info.append(("method", self.method)) */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3__repr__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3__repr__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_2__repr__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */ /* "aiohttp/_http_parser.pyx":147 * info.append(("chunked", self.chunked)) * info.append(("url", self.url)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< * return '' * */ static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___genexpr(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_genexpr_arg_0) { struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr *__pyx_cur_scope; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("genexpr", 0); __pyx_cur_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr *)__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct__genexpr(__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct__genexpr, __pyx_empty_tuple, NULL); if (unlikely(!__pyx_cur_scope)) { __pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr *)Py_None); __Pyx_INCREF(Py_None); __PYX_ERR(0, 147, __pyx_L1_error) } else { __Pyx_GOTREF((PyObject *)__pyx_cur_scope); } __pyx_cur_scope->__pyx_genexpr_arg_0 = __pyx_genexpr_arg_0; __Pyx_INCREF(__pyx_cur_scope->__pyx_genexpr_arg_0); __Pyx_GIVEREF(__pyx_cur_scope->__pyx_genexpr_arg_0); { __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator, NULL, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_repr___locals_genexpr, __pyx_n_s_aiohttp__http_parser); if (unlikely(!gen)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_DECREF(__pyx_cur_scope); __Pyx_RefNannyFinishContext(); return (PyObject *) gen; } /* function exit code */ __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__repr__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_DECREF((PyObject *)__pyx_cur_scope); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */ { struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr *__pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr *)__pyx_generator->closure); PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *(*__pyx_t_7)(PyObject *); int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("genexpr", 0); switch (__pyx_generator->resume_label) { case 0: goto __pyx_L3_first_run; default: /* CPython raises the right error here */ __Pyx_RefNannyFinishContext(); return NULL; } __pyx_L3_first_run:; if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 147, __pyx_L1_error) __pyx_r = PyList_New(0); if (unlikely(!__pyx_r)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_r); if (unlikely(!__pyx_cur_scope->__pyx_genexpr_arg_0)) { __Pyx_RaiseUnboundLocalError(".0"); __PYX_ERR(0, 147, __pyx_L1_error) } __pyx_t_1 = __pyx_cur_scope->__pyx_genexpr_arg_0; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; for (;;) { { Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); #if !CYTHON_ASSUME_SAFE_MACROS if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 147, __pyx_L1_error) #endif if (__pyx_t_2 >= __pyx_temp) break; } #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely((0 < 0))) __PYX_ERR(0, 147, __pyx_L1_error) #else __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); #endif if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) { PyObject* sequence = __pyx_t_3; Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); __PYX_ERR(0, 147, __pyx_L1_error) } #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS if (likely(PyTuple_CheckExact(sequence))) { __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); } else { __pyx_t_4 = PyList_GET_ITEM(sequence, 0); __pyx_t_5 = PyList_GET_ITEM(sequence, 1); } __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(__pyx_t_5); #else __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); #endif __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } else { Py_ssize_t index = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_6); index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L6_unpacking_failed; __Pyx_GOTREF(__pyx_t_4); index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L6_unpacking_failed; __Pyx_GOTREF(__pyx_t_5); if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) __PYX_ERR(0, 147, __pyx_L1_error) __pyx_t_7 = NULL; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; goto __pyx_L7_unpacking_done; __pyx_L6_unpacking_failed:; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_7 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); __PYX_ERR(0, 147, __pyx_L1_error) __pyx_L7_unpacking_done:; } __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_name); __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_name, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_val); __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_val, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_3 = PyNumber_Add(__pyx_cur_scope->__pyx_v_name, __pyx_kp_u_); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_Repr(__pyx_cur_scope->__pyx_v_val); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_4 = PyNumber_Add(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(__Pyx_ListComp_Append(__pyx_r, (PyObject*)__pyx_t_4))) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_r); __pyx_r = 0; __Pyx_Generator_Replace_StopIteration(0); __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); #if !CYTHON_USE_EXC_INFO_STACK __Pyx_Coroutine_ResetAndClearException(__pyx_generator); #endif __pyx_generator->resume_label = -1; __Pyx_Coroutine_clear((PyObject*)__pyx_generator); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":135 * self.url = url * * def __repr__(self): # <<<<<<<<<<<<<< * info = [] * info.append(("method", self.method)) */ static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_2__repr__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_v_info = NULL; PyObject *__pyx_v_sinfo = NULL; PyObject *__pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__repr__", 1); /* "aiohttp/_http_parser.pyx":136 * * def __repr__(self): * info = [] # <<<<<<<<<<<<<< * info.append(("method", self.method)) * info.append(("path", self.path)) */ __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 136, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_info = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":137 * def __repr__(self): * info = [] * info.append(("method", self.method)) # <<<<<<<<<<<<<< * info.append(("path", self.path)) * info.append(("version", self.version)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 137, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_method); __Pyx_GIVEREF(__pyx_n_u_method); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_method)) __PYX_ERR(0, 137, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->method); __Pyx_GIVEREF(__pyx_v_self->method); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->method)) __PYX_ERR(0, 137, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 137, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":138 * info = [] * info.append(("method", self.method)) * info.append(("path", self.path)) # <<<<<<<<<<<<<< * info.append(("version", self.version)) * info.append(("headers", self.headers)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_path); __Pyx_GIVEREF(__pyx_n_u_path); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_path)) __PYX_ERR(0, 138, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->path); __Pyx_GIVEREF(__pyx_v_self->path); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->path)) __PYX_ERR(0, 138, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":139 * info.append(("method", self.method)) * info.append(("path", self.path)) * info.append(("version", self.version)) # <<<<<<<<<<<<<< * info.append(("headers", self.headers)) * info.append(("raw_headers", self.raw_headers)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_version); __Pyx_GIVEREF(__pyx_n_u_version); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_version)) __PYX_ERR(0, 139, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->version); __Pyx_GIVEREF(__pyx_v_self->version); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->version)) __PYX_ERR(0, 139, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 139, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":140 * info.append(("path", self.path)) * info.append(("version", self.version)) * info.append(("headers", self.headers)) # <<<<<<<<<<<<<< * info.append(("raw_headers", self.raw_headers)) * info.append(("should_close", self.should_close)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 140, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_headers); __Pyx_GIVEREF(__pyx_n_u_headers); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_headers)) __PYX_ERR(0, 140, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->headers); __Pyx_GIVEREF(__pyx_v_self->headers); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->headers)) __PYX_ERR(0, 140, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 140, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":141 * info.append(("version", self.version)) * info.append(("headers", self.headers)) * info.append(("raw_headers", self.raw_headers)) # <<<<<<<<<<<<<< * info.append(("should_close", self.should_close)) * info.append(("compression", self.compression)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 141, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_raw_headers); __Pyx_GIVEREF(__pyx_n_u_raw_headers); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_raw_headers)) __PYX_ERR(0, 141, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->raw_headers); __Pyx_GIVEREF(__pyx_v_self->raw_headers); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->raw_headers)) __PYX_ERR(0, 141, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 141, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":142 * info.append(("headers", self.headers)) * info.append(("raw_headers", self.raw_headers)) * info.append(("should_close", self.should_close)) # <<<<<<<<<<<<<< * info.append(("compression", self.compression)) * info.append(("upgrade", self.upgrade)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 142, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_should_close); __Pyx_GIVEREF(__pyx_n_u_should_close); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_should_close)) __PYX_ERR(0, 142, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->should_close); __Pyx_GIVEREF(__pyx_v_self->should_close); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->should_close)) __PYX_ERR(0, 142, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 142, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":143 * info.append(("raw_headers", self.raw_headers)) * info.append(("should_close", self.should_close)) * info.append(("compression", self.compression)) # <<<<<<<<<<<<<< * info.append(("upgrade", self.upgrade)) * info.append(("chunked", self.chunked)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 143, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_compression); __Pyx_GIVEREF(__pyx_n_u_compression); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_compression)) __PYX_ERR(0, 143, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->compression); __Pyx_GIVEREF(__pyx_v_self->compression); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->compression)) __PYX_ERR(0, 143, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 143, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":144 * info.append(("should_close", self.should_close)) * info.append(("compression", self.compression)) * info.append(("upgrade", self.upgrade)) # <<<<<<<<<<<<<< * info.append(("chunked", self.chunked)) * info.append(("url", self.url)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 144, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_upgrade); __Pyx_GIVEREF(__pyx_n_u_upgrade); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_upgrade)) __PYX_ERR(0, 144, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->upgrade); __Pyx_GIVEREF(__pyx_v_self->upgrade); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->upgrade)) __PYX_ERR(0, 144, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 144, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":145 * info.append(("compression", self.compression)) * info.append(("upgrade", self.upgrade)) * info.append(("chunked", self.chunked)) # <<<<<<<<<<<<<< * info.append(("url", self.url)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 145, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_chunked); __Pyx_GIVEREF(__pyx_n_u_chunked); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_chunked)) __PYX_ERR(0, 145, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->chunked); __Pyx_GIVEREF(__pyx_v_self->chunked); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->chunked)) __PYX_ERR(0, 145, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 145, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":146 * info.append(("upgrade", self.upgrade)) * info.append(("chunked", self.chunked)) * info.append(("url", self.url)) # <<<<<<<<<<<<<< * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) * return '' */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_url); __Pyx_GIVEREF(__pyx_n_u_url); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_url)) __PYX_ERR(0, 146, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->url); __Pyx_GIVEREF(__pyx_v_self->url); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->url)) __PYX_ERR(0, 146, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 146, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":147 * info.append(("chunked", self.chunked)) * info.append(("url", self.url)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< * return '' * */ __pyx_t_1 = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___genexpr(NULL, __pyx_v_info); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_Generator_Next(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyUnicode_Join(__pyx_kp_u__2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_sinfo = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":148 * info.append(("url", self.url)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) * return '' # <<<<<<<<<<<<<< * * def _replace(self, **dct): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __Pyx_PyUnicode_ConcatSafe(__pyx_kp_u_RawRequestMessage, __pyx_v_sinfo); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 148, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyUnicode_ConcatInPlace(__pyx_t_1, __pyx_kp_u__3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 148, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":135 * self.url = url * * def __repr__(self): # <<<<<<<<<<<<<< * info = [] * info.append(("method", self.method)) */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_info); __Pyx_XDECREF(__pyx_v_sinfo); __Pyx_XDECREF(__pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":150 * return '' * * def _replace(self, **dct): # <<<<<<<<<<<<<< * cdef RawRequestMessage ret * ret = _new_request_message(self.method, */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_5_replace(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_17RawRequestMessage_5_replace = {"_replace", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_5_replace, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_5_replace(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { PyObject *__pyx_v_dct = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_replace (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); if (unlikely(__pyx_nargs > 0)) { __Pyx_RaiseArgtupleInvalid("_replace", 1, 0, 0, __pyx_nargs); return NULL;} if (__pyx_kwds && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_replace", 1))) return NULL; if (__pyx_kwds) { __pyx_v_dct = __Pyx_KwargsAsDict_FASTCALL(__pyx_kwds, __pyx_kwvalues); if (unlikely(!__pyx_v_dct)) return NULL; __Pyx_GOTREF(__pyx_v_dct); } else { __pyx_v_dct = PyDict_New(); if (unlikely(!__pyx_v_dct)) return NULL; __Pyx_GOTREF(__pyx_v_dct); } __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_4_replace(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self), __pyx_v_dct); /* function exit code */ __Pyx_DECREF(__pyx_v_dct); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_4_replace(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self, PyObject *__pyx_v_dct) { struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_ret = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; int __pyx_t_6; PyObject *__pyx_t_7 = NULL; int __pyx_t_8; int __pyx_t_9; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_replace", 1); /* "aiohttp/_http_parser.pyx":152 * def _replace(self, **dct): * cdef RawRequestMessage ret * ret = _new_request_message(self.method, # <<<<<<<<<<<<<< * self.path, * self.version, */ __pyx_t_1 = __pyx_v_self->method; __Pyx_INCREF(__pyx_t_1); /* "aiohttp/_http_parser.pyx":153 * cdef RawRequestMessage ret * ret = _new_request_message(self.method, * self.path, # <<<<<<<<<<<<<< * self.version, * self.headers, */ __pyx_t_2 = __pyx_v_self->path; __Pyx_INCREF(__pyx_t_2); /* "aiohttp/_http_parser.pyx":154 * ret = _new_request_message(self.method, * self.path, * self.version, # <<<<<<<<<<<<<< * self.headers, * self.raw_headers, */ __pyx_t_3 = __pyx_v_self->version; __Pyx_INCREF(__pyx_t_3); /* "aiohttp/_http_parser.pyx":155 * self.path, * self.version, * self.headers, # <<<<<<<<<<<<<< * self.raw_headers, * self.should_close, */ __pyx_t_4 = __pyx_v_self->headers; __Pyx_INCREF(__pyx_t_4); /* "aiohttp/_http_parser.pyx":156 * self.version, * self.headers, * self.raw_headers, # <<<<<<<<<<<<<< * self.should_close, * self.compression, */ __pyx_t_5 = __pyx_v_self->raw_headers; __Pyx_INCREF(__pyx_t_5); /* "aiohttp/_http_parser.pyx":157 * self.headers, * self.raw_headers, * self.should_close, # <<<<<<<<<<<<<< * self.compression, * self.upgrade, */ __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_self->should_close); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 157, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":158 * self.raw_headers, * self.should_close, * self.compression, # <<<<<<<<<<<<<< * self.upgrade, * self.chunked, */ __pyx_t_7 = __pyx_v_self->compression; __Pyx_INCREF(__pyx_t_7); /* "aiohttp/_http_parser.pyx":159 * self.should_close, * self.compression, * self.upgrade, # <<<<<<<<<<<<<< * self.chunked, * self.url) */ __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_v_self->upgrade); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 159, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":160 * self.compression, * self.upgrade, * self.chunked, # <<<<<<<<<<<<<< * self.url) * if "method" in dct: */ __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_v_self->chunked); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 160, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":161 * self.upgrade, * self.chunked, * self.url) # <<<<<<<<<<<<<< * if "method" in dct: * ret.method = dct["method"] */ __pyx_t_10 = __pyx_v_self->url; __Pyx_INCREF(__pyx_t_10); /* "aiohttp/_http_parser.pyx":152 * def _replace(self, **dct): * cdef RawRequestMessage ret * ret = _new_request_message(self.method, # <<<<<<<<<<<<<< * self.path, * self.version, */ __pyx_t_11 = __pyx_f_7aiohttp_12_http_parser__new_request_message(((PyObject*)__pyx_t_1), ((PyObject*)__pyx_t_2), __pyx_t_3, __pyx_t_4, __pyx_t_5, __pyx_t_6, __pyx_t_7, __pyx_t_8, __pyx_t_9, __pyx_t_10); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 152, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; if (!(likely(((__pyx_t_11) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_11, __pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage))))) __PYX_ERR(0, 152, __pyx_L1_error) __pyx_v_ret = ((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_t_11); __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":162 * self.chunked, * self.url) * if "method" in dct: # <<<<<<<<<<<<<< * ret.method = dct["method"] * if "path" in dct: */ __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_method, __pyx_v_dct, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 162, __pyx_L1_error) if (__pyx_t_9) { /* "aiohttp/_http_parser.pyx":163 * self.url) * if "method" in dct: * ret.method = dct["method"] # <<<<<<<<<<<<<< * if "path" in dct: * ret.path = dct["path"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_method); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 163, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); if (!(likely(PyUnicode_CheckExact(__pyx_t_11))||((__pyx_t_11) == Py_None) || __Pyx_RaiseUnexpectedTypeError("unicode", __pyx_t_11))) __PYX_ERR(0, 163, __pyx_L1_error) __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->method); __Pyx_DECREF(__pyx_v_ret->method); __pyx_v_ret->method = ((PyObject*)__pyx_t_11); __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":162 * self.chunked, * self.url) * if "method" in dct: # <<<<<<<<<<<<<< * ret.method = dct["method"] * if "path" in dct: */ } /* "aiohttp/_http_parser.pyx":164 * if "method" in dct: * ret.method = dct["method"] * if "path" in dct: # <<<<<<<<<<<<<< * ret.path = dct["path"] * if "version" in dct: */ __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_path, __pyx_v_dct, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 164, __pyx_L1_error) if (__pyx_t_9) { /* "aiohttp/_http_parser.pyx":165 * ret.method = dct["method"] * if "path" in dct: * ret.path = dct["path"] # <<<<<<<<<<<<<< * if "version" in dct: * ret.version = dct["version"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_path); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 165, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); if (!(likely(PyUnicode_CheckExact(__pyx_t_11))||((__pyx_t_11) == Py_None) || __Pyx_RaiseUnexpectedTypeError("unicode", __pyx_t_11))) __PYX_ERR(0, 165, __pyx_L1_error) __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->path); __Pyx_DECREF(__pyx_v_ret->path); __pyx_v_ret->path = ((PyObject*)__pyx_t_11); __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":164 * if "method" in dct: * ret.method = dct["method"] * if "path" in dct: # <<<<<<<<<<<<<< * ret.path = dct["path"] * if "version" in dct: */ } /* "aiohttp/_http_parser.pyx":166 * if "path" in dct: * ret.path = dct["path"] * if "version" in dct: # <<<<<<<<<<<<<< * ret.version = dct["version"] * if "headers" in dct: */ __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_version, __pyx_v_dct, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 166, __pyx_L1_error) if (__pyx_t_9) { /* "aiohttp/_http_parser.pyx":167 * ret.path = dct["path"] * if "version" in dct: * ret.version = dct["version"] # <<<<<<<<<<<<<< * if "headers" in dct: * ret.headers = dct["headers"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_version); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 167, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->version); __Pyx_DECREF(__pyx_v_ret->version); __pyx_v_ret->version = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":166 * if "path" in dct: * ret.path = dct["path"] * if "version" in dct: # <<<<<<<<<<<<<< * ret.version = dct["version"] * if "headers" in dct: */ } /* "aiohttp/_http_parser.pyx":168 * if "version" in dct: * ret.version = dct["version"] * if "headers" in dct: # <<<<<<<<<<<<<< * ret.headers = dct["headers"] * if "raw_headers" in dct: */ __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_headers, __pyx_v_dct, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 168, __pyx_L1_error) if (__pyx_t_9) { /* "aiohttp/_http_parser.pyx":169 * ret.version = dct["version"] * if "headers" in dct: * ret.headers = dct["headers"] # <<<<<<<<<<<<<< * if "raw_headers" in dct: * ret.raw_headers = dct["raw_headers"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_headers); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 169, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->headers); __Pyx_DECREF(__pyx_v_ret->headers); __pyx_v_ret->headers = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":168 * if "version" in dct: * ret.version = dct["version"] * if "headers" in dct: # <<<<<<<<<<<<<< * ret.headers = dct["headers"] * if "raw_headers" in dct: */ } /* "aiohttp/_http_parser.pyx":170 * if "headers" in dct: * ret.headers = dct["headers"] * if "raw_headers" in dct: # <<<<<<<<<<<<<< * ret.raw_headers = dct["raw_headers"] * if "should_close" in dct: */ __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_raw_headers, __pyx_v_dct, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 170, __pyx_L1_error) if (__pyx_t_9) { /* "aiohttp/_http_parser.pyx":171 * ret.headers = dct["headers"] * if "raw_headers" in dct: * ret.raw_headers = dct["raw_headers"] # <<<<<<<<<<<<<< * if "should_close" in dct: * ret.should_close = dct["should_close"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_raw_headers); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 171, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->raw_headers); __Pyx_DECREF(__pyx_v_ret->raw_headers); __pyx_v_ret->raw_headers = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":170 * if "headers" in dct: * ret.headers = dct["headers"] * if "raw_headers" in dct: # <<<<<<<<<<<<<< * ret.raw_headers = dct["raw_headers"] * if "should_close" in dct: */ } /* "aiohttp/_http_parser.pyx":172 * if "raw_headers" in dct: * ret.raw_headers = dct["raw_headers"] * if "should_close" in dct: # <<<<<<<<<<<<<< * ret.should_close = dct["should_close"] * if "compression" in dct: */ __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_should_close, __pyx_v_dct, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 172, __pyx_L1_error) if (__pyx_t_9) { /* "aiohttp/_http_parser.pyx":173 * ret.raw_headers = dct["raw_headers"] * if "should_close" in dct: * ret.should_close = dct["should_close"] # <<<<<<<<<<<<<< * if "compression" in dct: * ret.compression = dct["compression"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_should_close); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 173, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->should_close); __Pyx_DECREF(__pyx_v_ret->should_close); __pyx_v_ret->should_close = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":172 * if "raw_headers" in dct: * ret.raw_headers = dct["raw_headers"] * if "should_close" in dct: # <<<<<<<<<<<<<< * ret.should_close = dct["should_close"] * if "compression" in dct: */ } /* "aiohttp/_http_parser.pyx":174 * if "should_close" in dct: * ret.should_close = dct["should_close"] * if "compression" in dct: # <<<<<<<<<<<<<< * ret.compression = dct["compression"] * if "upgrade" in dct: */ __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_compression, __pyx_v_dct, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 174, __pyx_L1_error) if (__pyx_t_9) { /* "aiohttp/_http_parser.pyx":175 * ret.should_close = dct["should_close"] * if "compression" in dct: * ret.compression = dct["compression"] # <<<<<<<<<<<<<< * if "upgrade" in dct: * ret.upgrade = dct["upgrade"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_compression); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 175, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->compression); __Pyx_DECREF(__pyx_v_ret->compression); __pyx_v_ret->compression = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":174 * if "should_close" in dct: * ret.should_close = dct["should_close"] * if "compression" in dct: # <<<<<<<<<<<<<< * ret.compression = dct["compression"] * if "upgrade" in dct: */ } /* "aiohttp/_http_parser.pyx":176 * if "compression" in dct: * ret.compression = dct["compression"] * if "upgrade" in dct: # <<<<<<<<<<<<<< * ret.upgrade = dct["upgrade"] * if "chunked" in dct: */ __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_upgrade, __pyx_v_dct, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 176, __pyx_L1_error) if (__pyx_t_9) { /* "aiohttp/_http_parser.pyx":177 * ret.compression = dct["compression"] * if "upgrade" in dct: * ret.upgrade = dct["upgrade"] # <<<<<<<<<<<<<< * if "chunked" in dct: * ret.chunked = dct["chunked"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_upgrade); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 177, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->upgrade); __Pyx_DECREF(__pyx_v_ret->upgrade); __pyx_v_ret->upgrade = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":176 * if "compression" in dct: * ret.compression = dct["compression"] * if "upgrade" in dct: # <<<<<<<<<<<<<< * ret.upgrade = dct["upgrade"] * if "chunked" in dct: */ } /* "aiohttp/_http_parser.pyx":178 * if "upgrade" in dct: * ret.upgrade = dct["upgrade"] * if "chunked" in dct: # <<<<<<<<<<<<<< * ret.chunked = dct["chunked"] * if "url" in dct: */ __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_chunked, __pyx_v_dct, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 178, __pyx_L1_error) if (__pyx_t_9) { /* "aiohttp/_http_parser.pyx":179 * ret.upgrade = dct["upgrade"] * if "chunked" in dct: * ret.chunked = dct["chunked"] # <<<<<<<<<<<<<< * if "url" in dct: * ret.url = dct["url"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_chunked); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 179, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->chunked); __Pyx_DECREF(__pyx_v_ret->chunked); __pyx_v_ret->chunked = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":178 * if "upgrade" in dct: * ret.upgrade = dct["upgrade"] * if "chunked" in dct: # <<<<<<<<<<<<<< * ret.chunked = dct["chunked"] * if "url" in dct: */ } /* "aiohttp/_http_parser.pyx":180 * if "chunked" in dct: * ret.chunked = dct["chunked"] * if "url" in dct: # <<<<<<<<<<<<<< * ret.url = dct["url"] * return ret */ __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_url, __pyx_v_dct, Py_EQ)); if (unlikely((__pyx_t_9 < 0))) __PYX_ERR(0, 180, __pyx_L1_error) if (__pyx_t_9) { /* "aiohttp/_http_parser.pyx":181 * ret.chunked = dct["chunked"] * if "url" in dct: * ret.url = dct["url"] # <<<<<<<<<<<<<< * return ret * */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_url); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 181, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->url); __Pyx_DECREF(__pyx_v_ret->url); __pyx_v_ret->url = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":180 * if "chunked" in dct: * ret.chunked = dct["chunked"] * if "url" in dct: # <<<<<<<<<<<<<< * ret.url = dct["url"] * return ret */ } /* "aiohttp/_http_parser.pyx":182 * if "url" in dct: * ret.url = dct["url"] * return ret # <<<<<<<<<<<<<< * * cdef _new_request_message(str method, */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF((PyObject *)__pyx_v_ret); __pyx_r = ((PyObject *)__pyx_v_ret); goto __pyx_L0; /* "aiohttp/_http_parser.pyx":150 * return '' * * def _replace(self, **dct): # <<<<<<<<<<<<<< * cdef RawRequestMessage ret * ret = _new_request_message(self.method, */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_11); __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage._replace", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_ret); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":111 * @cython.freelist(DEFAULT_FREELIST_SIZE) * cdef class RawRequestMessage: * cdef readonly str method # <<<<<<<<<<<<<< * cdef readonly str path * cdef readonly object version # HttpVersion */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_6method_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_6method_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_6method___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_6method___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->method); __pyx_r = __pyx_v_self->method; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":112 * cdef class RawRequestMessage: * cdef readonly str method * cdef readonly str path # <<<<<<<<<<<<<< * cdef readonly object version # HttpVersion * cdef readonly object headers # CIMultiDict */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_4path_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_4path_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_4path___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_4path___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->path); __pyx_r = __pyx_v_self->path; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":113 * cdef readonly str method * cdef readonly str path * cdef readonly object version # HttpVersion # <<<<<<<<<<<<<< * cdef readonly object headers # CIMultiDict * cdef readonly object raw_headers # tuple */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7version_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7version_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7version___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7version___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->version); __pyx_r = __pyx_v_self->version; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":114 * cdef readonly str path * cdef readonly object version # HttpVersion * cdef readonly object headers # CIMultiDict # <<<<<<<<<<<<<< * cdef readonly object raw_headers # tuple * cdef readonly object should_close */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7headers_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7headers_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7headers___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7headers___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->headers); __pyx_r = __pyx_v_self->headers; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":115 * cdef readonly object version # HttpVersion * cdef readonly object headers # CIMultiDict * cdef readonly object raw_headers # tuple # <<<<<<<<<<<<<< * cdef readonly object should_close * cdef readonly object compression */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->raw_headers); __pyx_r = __pyx_v_self->raw_headers; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":116 * cdef readonly object headers # CIMultiDict * cdef readonly object raw_headers # tuple * cdef readonly object should_close # <<<<<<<<<<<<<< * cdef readonly object compression * cdef readonly object upgrade */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_12should_close_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_12should_close_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_12should_close___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_12should_close___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->should_close); __pyx_r = __pyx_v_self->should_close; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":117 * cdef readonly object raw_headers # tuple * cdef readonly object should_close * cdef readonly object compression # <<<<<<<<<<<<<< * cdef readonly object upgrade * cdef readonly object chunked */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11compression_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11compression_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_11compression___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_11compression___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->compression); __pyx_r = __pyx_v_self->compression; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":118 * cdef readonly object should_close * cdef readonly object compression * cdef readonly object upgrade # <<<<<<<<<<<<<< * cdef readonly object chunked * cdef readonly object url # yarl.URL */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->upgrade); __pyx_r = __pyx_v_self->upgrade; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":119 * cdef readonly object compression * cdef readonly object upgrade * cdef readonly object chunked # <<<<<<<<<<<<<< * cdef readonly object url # yarl.URL * */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7chunked_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7chunked_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7chunked___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7chunked___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->chunked); __pyx_r = __pyx_v_self->chunked; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":120 * cdef readonly object upgrade * cdef readonly object chunked * cdef readonly object url # yarl.URL # <<<<<<<<<<<<<< * * def __init__(self, method, path, version, headers, raw_headers, */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3url_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3url_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_3url___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_3url___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->url); __pyx_r = __pyx_v_self->url; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7__reduce_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_17RawRequestMessage_7__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7__reduce_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); if (unlikely(__pyx_nargs > 0)) { __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_6__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_6__reduce_cython__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_v_state = 0; PyObject *__pyx_v__dict = 0; int __pyx_v_use_setstate; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 1); /* "(tree fragment)":5 * cdef object _dict * cdef bint use_setstate * state = (self.chunked, self.compression, self.headers, self.method, self.path, self.raw_headers, self.should_close, self.upgrade, self.url, self.version) # <<<<<<<<<<<<<< * _dict = getattr(self, '__dict__', None) * if _dict is not None: */ __pyx_t_1 = PyTuple_New(10); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_v_self->chunked); __Pyx_GIVEREF(__pyx_v_self->chunked); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->chunked)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->compression); __Pyx_GIVEREF(__pyx_v_self->compression); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->compression)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->headers); __Pyx_GIVEREF(__pyx_v_self->headers); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_self->headers)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->method); __Pyx_GIVEREF(__pyx_v_self->method); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_self->method)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->path); __Pyx_GIVEREF(__pyx_v_self->path); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_v_self->path)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->raw_headers); __Pyx_GIVEREF(__pyx_v_self->raw_headers); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_v_self->raw_headers)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->should_close); __Pyx_GIVEREF(__pyx_v_self->should_close); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 6, __pyx_v_self->should_close)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->upgrade); __Pyx_GIVEREF(__pyx_v_self->upgrade); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 7, __pyx_v_self->upgrade)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->url); __Pyx_GIVEREF(__pyx_v_self->url); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 8, __pyx_v_self->url)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->version); __Pyx_GIVEREF(__pyx_v_self->version); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 9, __pyx_v_self->version)) __PYX_ERR(1, 5, __pyx_L1_error); __pyx_v_state = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":6 * cdef bint use_setstate * state = (self.chunked, self.compression, self.headers, self.method, self.path, self.raw_headers, self.should_close, self.upgrade, self.url, self.version) * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< * if _dict is not None: * state += (_dict,) */ __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v__dict = __pyx_t_1; __pyx_t_1 = 0; /* "(tree fragment)":7 * state = (self.chunked, self.compression, self.headers, self.method, self.path, self.raw_headers, self.should_close, self.upgrade, self.url, self.version) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ __pyx_t_2 = (__pyx_v__dict != Py_None); if (__pyx_t_2) { /* "(tree fragment)":8 * _dict = getattr(self, '__dict__', None) * if _dict is not None: * state += (_dict,) # <<<<<<<<<<<<<< * use_setstate = True * else: */ __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_v__dict); __Pyx_GIVEREF(__pyx_v__dict); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict)) __PYX_ERR(1, 8, __pyx_L1_error); __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; /* "(tree fragment)":9 * if _dict is not None: * state += (_dict,) * use_setstate = True # <<<<<<<<<<<<<< * else: * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None */ __pyx_v_use_setstate = 1; /* "(tree fragment)":7 * state = (self.chunked, self.compression, self.headers, self.method, self.path, self.raw_headers, self.should_close, self.upgrade, self.url, self.version) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ goto __pyx_L3; } /* "(tree fragment)":11 * use_setstate = True * else: * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None # <<<<<<<<<<<<<< * if use_setstate: * return __pyx_unpickle_RawRequestMessage, (type(self), 0xf602a9f, None), state */ /*else*/ { __pyx_t_4 = (__pyx_v_self->chunked != Py_None); if (!__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->compression != Py_None); if (!__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->headers != Py_None); if (!__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->method != ((PyObject*)Py_None)); if (!__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->path != ((PyObject*)Py_None)); if (!__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->raw_headers != Py_None); if (!__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->should_close != Py_None); if (!__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->upgrade != Py_None); if (!__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->url != Py_None); if (!__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->version != Py_None); __pyx_t_2 = __pyx_t_4; __pyx_L4_bool_binop_done:; __pyx_v_use_setstate = __pyx_t_2; } __pyx_L3:; /* "(tree fragment)":12 * else: * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle_RawRequestMessage, (type(self), 0xf602a9f, None), state * else: */ if (__pyx_v_use_setstate) { /* "(tree fragment)":13 * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None * if use_setstate: * return __pyx_unpickle_RawRequestMessage, (type(self), 0xf602a9f, None), state # <<<<<<<<<<<<<< * else: * return __pyx_unpickle_RawRequestMessage, (type(self), 0xf602a9f, state) */ __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle_RawRequestMessage); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 13, __pyx_L1_error); __Pyx_INCREF(__pyx_int_257960607); __Pyx_GIVEREF(__pyx_int_257960607); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_257960607)) __PYX_ERR(1, 13, __pyx_L1_error); __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None)) __PYX_ERR(1, 13, __pyx_L1_error); __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_3); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_1); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_state)) __PYX_ERR(1, 13, __pyx_L1_error); __pyx_t_3 = 0; __pyx_t_1 = 0; __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; /* "(tree fragment)":12 * else: * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle_RawRequestMessage, (type(self), 0xf602a9f, None), state * else: */ } /* "(tree fragment)":15 * return __pyx_unpickle_RawRequestMessage, (type(self), 0xf602a9f, None), state * else: * return __pyx_unpickle_RawRequestMessage, (type(self), 0xf602a9f, state) # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) */ /*else*/ { __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_pyx_unpickle_RawRequestMessage); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 15, __pyx_L1_error); __Pyx_INCREF(__pyx_int_257960607); __Pyx_GIVEREF(__pyx_int_257960607); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_257960607)) __PYX_ERR(1, 15, __pyx_L1_error); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state)) __PYX_ERR(1, 15, __pyx_L1_error); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_5); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5)) __PYX_ERR(1, 15, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_1); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error); __pyx_t_5 = 0; __pyx_t_1 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_state); __Pyx_XDECREF(__pyx_v__dict); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":16 * else: * return __pyx_unpickle_RawRequestMessage, (type(self), 0xf602a9f, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_9__setstate_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_17RawRequestMessage_9__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_9__setstate_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { PyObject *__pyx_v___pyx_state = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[1] = {0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 16, __pyx_L3_error) else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 16, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 1)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); } __pyx_v___pyx_state = values[0]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 16, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_8__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self), __pyx_v___pyx_state); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_8__setstate_cython__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 1); /* "(tree fragment)":17 * return __pyx_unpickle_RawRequestMessage, (type(self), 0xf602a9f, state) * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) # <<<<<<<<<<<<<< */ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 17, __pyx_L1_error) __pyx_t_1 = __pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":16 * else: * return __pyx_unpickle_RawRequestMessage, (type(self), 0xf602a9f, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":184 * return ret * * cdef _new_request_message(str method, # <<<<<<<<<<<<<< * str path, * object version, */ static PyObject *__pyx_f_7aiohttp_12_http_parser__new_request_message(PyObject *__pyx_v_method, PyObject *__pyx_v_path, PyObject *__pyx_v_version, PyObject *__pyx_v_headers, PyObject *__pyx_v_raw_headers, int __pyx_v_should_close, PyObject *__pyx_v_compression, int __pyx_v_upgrade, int __pyx_v_chunked, PyObject *__pyx_v_url) { struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_ret = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_new_request_message", 1); /* "aiohttp/_http_parser.pyx":195 * object url): * cdef RawRequestMessage ret * ret = RawRequestMessage.__new__(RawRequestMessage) # <<<<<<<<<<<<<< * ret.method = method * ret.path = path */ __pyx_t_1 = ((PyObject *)__pyx_tp_new_7aiohttp_12_http_parser_RawRequestMessage(((PyTypeObject *)__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage), __pyx_empty_tuple, NULL)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 195, __pyx_L1_error) __Pyx_GOTREF((PyObject *)__pyx_t_1); __pyx_v_ret = ((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":196 * cdef RawRequestMessage ret * ret = RawRequestMessage.__new__(RawRequestMessage) * ret.method = method # <<<<<<<<<<<<<< * ret.path = path * ret.version = version */ __Pyx_INCREF(__pyx_v_method); __Pyx_GIVEREF(__pyx_v_method); __Pyx_GOTREF(__pyx_v_ret->method); __Pyx_DECREF(__pyx_v_ret->method); __pyx_v_ret->method = __pyx_v_method; /* "aiohttp/_http_parser.pyx":197 * ret = RawRequestMessage.__new__(RawRequestMessage) * ret.method = method * ret.path = path # <<<<<<<<<<<<<< * ret.version = version * ret.headers = headers */ __Pyx_INCREF(__pyx_v_path); __Pyx_GIVEREF(__pyx_v_path); __Pyx_GOTREF(__pyx_v_ret->path); __Pyx_DECREF(__pyx_v_ret->path); __pyx_v_ret->path = __pyx_v_path; /* "aiohttp/_http_parser.pyx":198 * ret.method = method * ret.path = path * ret.version = version # <<<<<<<<<<<<<< * ret.headers = headers * ret.raw_headers = raw_headers */ __Pyx_INCREF(__pyx_v_version); __Pyx_GIVEREF(__pyx_v_version); __Pyx_GOTREF(__pyx_v_ret->version); __Pyx_DECREF(__pyx_v_ret->version); __pyx_v_ret->version = __pyx_v_version; /* "aiohttp/_http_parser.pyx":199 * ret.path = path * ret.version = version * ret.headers = headers # <<<<<<<<<<<<<< * ret.raw_headers = raw_headers * ret.should_close = should_close */ __Pyx_INCREF(__pyx_v_headers); __Pyx_GIVEREF(__pyx_v_headers); __Pyx_GOTREF(__pyx_v_ret->headers); __Pyx_DECREF(__pyx_v_ret->headers); __pyx_v_ret->headers = __pyx_v_headers; /* "aiohttp/_http_parser.pyx":200 * ret.version = version * ret.headers = headers * ret.raw_headers = raw_headers # <<<<<<<<<<<<<< * ret.should_close = should_close * ret.compression = compression */ __Pyx_INCREF(__pyx_v_raw_headers); __Pyx_GIVEREF(__pyx_v_raw_headers); __Pyx_GOTREF(__pyx_v_ret->raw_headers); __Pyx_DECREF(__pyx_v_ret->raw_headers); __pyx_v_ret->raw_headers = __pyx_v_raw_headers; /* "aiohttp/_http_parser.pyx":201 * ret.headers = headers * ret.raw_headers = raw_headers * ret.should_close = should_close # <<<<<<<<<<<<<< * ret.compression = compression * ret.upgrade = upgrade */ __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_should_close); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 201, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_ret->should_close); __Pyx_DECREF(__pyx_v_ret->should_close); __pyx_v_ret->should_close = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":202 * ret.raw_headers = raw_headers * ret.should_close = should_close * ret.compression = compression # <<<<<<<<<<<<<< * ret.upgrade = upgrade * ret.chunked = chunked */ __Pyx_INCREF(__pyx_v_compression); __Pyx_GIVEREF(__pyx_v_compression); __Pyx_GOTREF(__pyx_v_ret->compression); __Pyx_DECREF(__pyx_v_ret->compression); __pyx_v_ret->compression = __pyx_v_compression; /* "aiohttp/_http_parser.pyx":203 * ret.should_close = should_close * ret.compression = compression * ret.upgrade = upgrade # <<<<<<<<<<<<<< * ret.chunked = chunked * ret.url = url */ __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_upgrade); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 203, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_ret->upgrade); __Pyx_DECREF(__pyx_v_ret->upgrade); __pyx_v_ret->upgrade = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":204 * ret.compression = compression * ret.upgrade = upgrade * ret.chunked = chunked # <<<<<<<<<<<<<< * ret.url = url * return ret */ __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_chunked); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 204, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_ret->chunked); __Pyx_DECREF(__pyx_v_ret->chunked); __pyx_v_ret->chunked = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":205 * ret.upgrade = upgrade * ret.chunked = chunked * ret.url = url # <<<<<<<<<<<<<< * return ret * */ __Pyx_INCREF(__pyx_v_url); __Pyx_GIVEREF(__pyx_v_url); __Pyx_GOTREF(__pyx_v_ret->url); __Pyx_DECREF(__pyx_v_ret->url); __pyx_v_ret->url = __pyx_v_url; /* "aiohttp/_http_parser.pyx":206 * ret.chunked = chunked * ret.url = url * return ret # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF((PyObject *)__pyx_v_ret); __pyx_r = ((PyObject *)__pyx_v_ret); goto __pyx_L0; /* "aiohttp/_http_parser.pyx":184 * return ret * * cdef _new_request_message(str method, # <<<<<<<<<<<<<< * str path, * object version, */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser._new_request_message", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_ret); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":221 * cdef readonly object chunked * * def __init__(self, version, code, reason, headers, raw_headers, # <<<<<<<<<<<<<< * should_close, compression, upgrade, chunked): * self.version = version */ /* Python wrapper */ static int __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_version = 0; PyObject *__pyx_v_code = 0; PyObject *__pyx_v_reason = 0; PyObject *__pyx_v_headers = 0; PyObject *__pyx_v_raw_headers = 0; PyObject *__pyx_v_should_close = 0; PyObject *__pyx_v_compression = 0; PyObject *__pyx_v_upgrade = 0; PyObject *__pyx_v_chunked = 0; CYTHON_UNUSED Py_ssize_t __pyx_nargs; CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[9] = {0,0,0,0,0,0,0,0,0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; #endif __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_version,&__pyx_n_s_code,&__pyx_n_s_reason,&__pyx_n_s_headers,&__pyx_n_s_raw_headers,&__pyx_n_s_should_close,&__pyx_n_s_compression,&__pyx_n_s_upgrade,&__pyx_n_s_chunked,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 9: values[8] = __Pyx_Arg_VARARGS(__pyx_args, 8); CYTHON_FALLTHROUGH; case 8: values[7] = __Pyx_Arg_VARARGS(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = __Pyx_Arg_VARARGS(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_version)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 221, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_code)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[1]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 221, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 1); __PYX_ERR(0, 221, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_reason)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[2]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 221, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 2); __PYX_ERR(0, 221, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_headers)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[3]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 221, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 3); __PYX_ERR(0, 221, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_raw_headers)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[4]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 221, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 4); __PYX_ERR(0, 221, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (likely((values[5] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_should_close)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[5]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 221, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 5); __PYX_ERR(0, 221, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 6: if (likely((values[6] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_compression)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[6]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 221, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 6); __PYX_ERR(0, 221, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 7: if (likely((values[7] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_upgrade)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[7]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 221, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 7); __PYX_ERR(0, 221, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 8: if (likely((values[8] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_chunked)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[8]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 221, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 8); __PYX_ERR(0, 221, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 221, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 9)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); values[6] = __Pyx_Arg_VARARGS(__pyx_args, 6); values[7] = __Pyx_Arg_VARARGS(__pyx_args, 7); values[8] = __Pyx_Arg_VARARGS(__pyx_args, 8); } __pyx_v_version = values[0]; __pyx_v_code = values[1]; __pyx_v_reason = values[2]; __pyx_v_headers = values[3]; __pyx_v_raw_headers = values[4]; __pyx_v_should_close = values[5]; __pyx_v_compression = values[6]; __pyx_v_upgrade = values[7]; __pyx_v_chunked = values[8]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, __pyx_nargs); __PYX_ERR(0, 221, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage___init__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self), __pyx_v_version, __pyx_v_code, __pyx_v_reason, __pyx_v_headers, __pyx_v_raw_headers, __pyx_v_should_close, __pyx_v_compression, __pyx_v_upgrade, __pyx_v_chunked); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage___init__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self, PyObject *__pyx_v_version, PyObject *__pyx_v_code, PyObject *__pyx_v_reason, PyObject *__pyx_v_headers, PyObject *__pyx_v_raw_headers, PyObject *__pyx_v_should_close, PyObject *__pyx_v_compression, PyObject *__pyx_v_upgrade, PyObject *__pyx_v_chunked) { int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__init__", 1); /* "aiohttp/_http_parser.pyx":223 * def __init__(self, version, code, reason, headers, raw_headers, * should_close, compression, upgrade, chunked): * self.version = version # <<<<<<<<<<<<<< * self.code = code * self.reason = reason */ __Pyx_INCREF(__pyx_v_version); __Pyx_GIVEREF(__pyx_v_version); __Pyx_GOTREF(__pyx_v_self->version); __Pyx_DECREF(__pyx_v_self->version); __pyx_v_self->version = __pyx_v_version; /* "aiohttp/_http_parser.pyx":224 * should_close, compression, upgrade, chunked): * self.version = version * self.code = code # <<<<<<<<<<<<<< * self.reason = reason * self.headers = headers */ __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_code); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 224, __pyx_L1_error) __pyx_v_self->code = __pyx_t_1; /* "aiohttp/_http_parser.pyx":225 * self.version = version * self.code = code * self.reason = reason # <<<<<<<<<<<<<< * self.headers = headers * self.raw_headers = raw_headers */ if (!(likely(PyUnicode_CheckExact(__pyx_v_reason))||((__pyx_v_reason) == Py_None) || __Pyx_RaiseUnexpectedTypeError("unicode", __pyx_v_reason))) __PYX_ERR(0, 225, __pyx_L1_error) __pyx_t_2 = __pyx_v_reason; __Pyx_INCREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __Pyx_GOTREF(__pyx_v_self->reason); __Pyx_DECREF(__pyx_v_self->reason); __pyx_v_self->reason = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":226 * self.code = code * self.reason = reason * self.headers = headers # <<<<<<<<<<<<<< * self.raw_headers = raw_headers * self.should_close = should_close */ __Pyx_INCREF(__pyx_v_headers); __Pyx_GIVEREF(__pyx_v_headers); __Pyx_GOTREF(__pyx_v_self->headers); __Pyx_DECREF(__pyx_v_self->headers); __pyx_v_self->headers = __pyx_v_headers; /* "aiohttp/_http_parser.pyx":227 * self.reason = reason * self.headers = headers * self.raw_headers = raw_headers # <<<<<<<<<<<<<< * self.should_close = should_close * self.compression = compression */ __Pyx_INCREF(__pyx_v_raw_headers); __Pyx_GIVEREF(__pyx_v_raw_headers); __Pyx_GOTREF(__pyx_v_self->raw_headers); __Pyx_DECREF(__pyx_v_self->raw_headers); __pyx_v_self->raw_headers = __pyx_v_raw_headers; /* "aiohttp/_http_parser.pyx":228 * self.headers = headers * self.raw_headers = raw_headers * self.should_close = should_close # <<<<<<<<<<<<<< * self.compression = compression * self.upgrade = upgrade */ __Pyx_INCREF(__pyx_v_should_close); __Pyx_GIVEREF(__pyx_v_should_close); __Pyx_GOTREF(__pyx_v_self->should_close); __Pyx_DECREF(__pyx_v_self->should_close); __pyx_v_self->should_close = __pyx_v_should_close; /* "aiohttp/_http_parser.pyx":229 * self.raw_headers = raw_headers * self.should_close = should_close * self.compression = compression # <<<<<<<<<<<<<< * self.upgrade = upgrade * self.chunked = chunked */ __Pyx_INCREF(__pyx_v_compression); __Pyx_GIVEREF(__pyx_v_compression); __Pyx_GOTREF(__pyx_v_self->compression); __Pyx_DECREF(__pyx_v_self->compression); __pyx_v_self->compression = __pyx_v_compression; /* "aiohttp/_http_parser.pyx":230 * self.should_close = should_close * self.compression = compression * self.upgrade = upgrade # <<<<<<<<<<<<<< * self.chunked = chunked * */ __Pyx_INCREF(__pyx_v_upgrade); __Pyx_GIVEREF(__pyx_v_upgrade); __Pyx_GOTREF(__pyx_v_self->upgrade); __Pyx_DECREF(__pyx_v_self->upgrade); __pyx_v_self->upgrade = __pyx_v_upgrade; /* "aiohttp/_http_parser.pyx":231 * self.compression = compression * self.upgrade = upgrade * self.chunked = chunked # <<<<<<<<<<<<<< * * def __repr__(self): */ __Pyx_INCREF(__pyx_v_chunked); __Pyx_GIVEREF(__pyx_v_chunked); __Pyx_GOTREF(__pyx_v_self->chunked); __Pyx_DECREF(__pyx_v_self->chunked); __pyx_v_self->chunked = __pyx_v_chunked; /* "aiohttp/_http_parser.pyx":221 * cdef readonly object chunked * * def __init__(self, version, code, reason, headers, raw_headers, # <<<<<<<<<<<<<< * should_close, compression, upgrade, chunked): * self.version = version */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":233 * self.chunked = chunked * * def __repr__(self): # <<<<<<<<<<<<<< * info = [] * info.append(("version", self.version)) */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_3__repr__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_3__repr__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_2__repr__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */ /* "aiohttp/_http_parser.pyx":244 * info.append(("upgrade", self.upgrade)) * info.append(("chunked", self.chunked)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< * return '' * */ static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___genexpr(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_genexpr_arg_0) { struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *__pyx_cur_scope; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("genexpr", 0); __pyx_cur_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr(__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr, __pyx_empty_tuple, NULL); if (unlikely(!__pyx_cur_scope)) { __pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)Py_None); __Pyx_INCREF(Py_None); __PYX_ERR(0, 244, __pyx_L1_error) } else { __Pyx_GOTREF((PyObject *)__pyx_cur_scope); } __pyx_cur_scope->__pyx_genexpr_arg_0 = __pyx_genexpr_arg_0; __Pyx_INCREF(__pyx_cur_scope->__pyx_genexpr_arg_0); __Pyx_GIVEREF(__pyx_cur_scope->__pyx_genexpr_arg_0); { __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1, NULL, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_repr___locals_genexpr, __pyx_n_s_aiohttp__http_parser); if (unlikely(!gen)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_DECREF(__pyx_cur_scope); __Pyx_RefNannyFinishContext(); return (PyObject *) gen; } /* function exit code */ __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__repr__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_DECREF((PyObject *)__pyx_cur_scope); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */ { struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *__pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)__pyx_generator->closure); PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *(*__pyx_t_7)(PyObject *); int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("genexpr", 0); switch (__pyx_generator->resume_label) { case 0: goto __pyx_L3_first_run; default: /* CPython raises the right error here */ __Pyx_RefNannyFinishContext(); return NULL; } __pyx_L3_first_run:; if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 244, __pyx_L1_error) __pyx_r = PyList_New(0); if (unlikely(!__pyx_r)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_r); if (unlikely(!__pyx_cur_scope->__pyx_genexpr_arg_0)) { __Pyx_RaiseUnboundLocalError(".0"); __PYX_ERR(0, 244, __pyx_L1_error) } __pyx_t_1 = __pyx_cur_scope->__pyx_genexpr_arg_0; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; for (;;) { { Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); #if !CYTHON_ASSUME_SAFE_MACROS if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 244, __pyx_L1_error) #endif if (__pyx_t_2 >= __pyx_temp) break; } #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely((0 < 0))) __PYX_ERR(0, 244, __pyx_L1_error) #else __pyx_t_3 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); #endif if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) { PyObject* sequence = __pyx_t_3; Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); __PYX_ERR(0, 244, __pyx_L1_error) } #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS if (likely(PyTuple_CheckExact(sequence))) { __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); } else { __pyx_t_4 = PyList_GET_ITEM(sequence, 0); __pyx_t_5 = PyList_GET_ITEM(sequence, 1); } __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(__pyx_t_5); #else __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); #endif __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } else { Py_ssize_t index = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_6); index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L6_unpacking_failed; __Pyx_GOTREF(__pyx_t_4); index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L6_unpacking_failed; __Pyx_GOTREF(__pyx_t_5); if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) __PYX_ERR(0, 244, __pyx_L1_error) __pyx_t_7 = NULL; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; goto __pyx_L7_unpacking_done; __pyx_L6_unpacking_failed:; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_7 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); __PYX_ERR(0, 244, __pyx_L1_error) __pyx_L7_unpacking_done:; } __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_name); __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_name, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_val); __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_val, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_3 = PyNumber_Add(__pyx_cur_scope->__pyx_v_name, __pyx_kp_u_); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_Repr(__pyx_cur_scope->__pyx_v_val); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_4 = PyNumber_Add(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(__Pyx_ListComp_Append(__pyx_r, (PyObject*)__pyx_t_4))) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_r); __pyx_r = 0; __Pyx_Generator_Replace_StopIteration(0); __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); #if !CYTHON_USE_EXC_INFO_STACK __Pyx_Coroutine_ResetAndClearException(__pyx_generator); #endif __pyx_generator->resume_label = -1; __Pyx_Coroutine_clear((PyObject*)__pyx_generator); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":233 * self.chunked = chunked * * def __repr__(self): # <<<<<<<<<<<<<< * info = [] * info.append(("version", self.version)) */ static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_2__repr__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_v_info = NULL; PyObject *__pyx_v_sinfo = NULL; PyObject *__pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1 = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__repr__", 1); /* "aiohttp/_http_parser.pyx":234 * * def __repr__(self): * info = [] # <<<<<<<<<<<<<< * info.append(("version", self.version)) * info.append(("code", self.code)) */ __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 234, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_info = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":235 * def __repr__(self): * info = [] * info.append(("version", self.version)) # <<<<<<<<<<<<<< * info.append(("code", self.code)) * info.append(("reason", self.reason)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 235, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_version); __Pyx_GIVEREF(__pyx_n_u_version); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_version)) __PYX_ERR(0, 235, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->version); __Pyx_GIVEREF(__pyx_v_self->version); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->version)) __PYX_ERR(0, 235, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 235, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":236 * info = [] * info.append(("version", self.version)) * info.append(("code", self.code)) # <<<<<<<<<<<<<< * info.append(("reason", self.reason)) * info.append(("headers", self.headers)) */ __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 236, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 236, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_u_code); __Pyx_GIVEREF(__pyx_n_u_code); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_code)) __PYX_ERR(0, 236, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_1); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1)) __PYX_ERR(0, 236, __pyx_L1_error); __pyx_t_1 = 0; __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 236, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":237 * info.append(("version", self.version)) * info.append(("code", self.code)) * info.append(("reason", self.reason)) # <<<<<<<<<<<<<< * info.append(("headers", self.headers)) * info.append(("raw_headers", self.raw_headers)) */ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 237, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_u_reason); __Pyx_GIVEREF(__pyx_n_u_reason); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_reason)) __PYX_ERR(0, 237, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->reason); __Pyx_GIVEREF(__pyx_v_self->reason); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->reason)) __PYX_ERR(0, 237, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 237, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":238 * info.append(("code", self.code)) * info.append(("reason", self.reason)) * info.append(("headers", self.headers)) # <<<<<<<<<<<<<< * info.append(("raw_headers", self.raw_headers)) * info.append(("should_close", self.should_close)) */ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 238, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_u_headers); __Pyx_GIVEREF(__pyx_n_u_headers); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_headers)) __PYX_ERR(0, 238, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->headers); __Pyx_GIVEREF(__pyx_v_self->headers); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->headers)) __PYX_ERR(0, 238, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 238, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":239 * info.append(("reason", self.reason)) * info.append(("headers", self.headers)) * info.append(("raw_headers", self.raw_headers)) # <<<<<<<<<<<<<< * info.append(("should_close", self.should_close)) * info.append(("compression", self.compression)) */ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 239, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_u_raw_headers); __Pyx_GIVEREF(__pyx_n_u_raw_headers); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_raw_headers)) __PYX_ERR(0, 239, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->raw_headers); __Pyx_GIVEREF(__pyx_v_self->raw_headers); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->raw_headers)) __PYX_ERR(0, 239, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 239, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":240 * info.append(("headers", self.headers)) * info.append(("raw_headers", self.raw_headers)) * info.append(("should_close", self.should_close)) # <<<<<<<<<<<<<< * info.append(("compression", self.compression)) * info.append(("upgrade", self.upgrade)) */ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 240, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_u_should_close); __Pyx_GIVEREF(__pyx_n_u_should_close); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_should_close)) __PYX_ERR(0, 240, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->should_close); __Pyx_GIVEREF(__pyx_v_self->should_close); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->should_close)) __PYX_ERR(0, 240, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 240, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":241 * info.append(("raw_headers", self.raw_headers)) * info.append(("should_close", self.should_close)) * info.append(("compression", self.compression)) # <<<<<<<<<<<<<< * info.append(("upgrade", self.upgrade)) * info.append(("chunked", self.chunked)) */ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 241, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_u_compression); __Pyx_GIVEREF(__pyx_n_u_compression); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_compression)) __PYX_ERR(0, 241, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->compression); __Pyx_GIVEREF(__pyx_v_self->compression); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->compression)) __PYX_ERR(0, 241, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 241, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":242 * info.append(("should_close", self.should_close)) * info.append(("compression", self.compression)) * info.append(("upgrade", self.upgrade)) # <<<<<<<<<<<<<< * info.append(("chunked", self.chunked)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) */ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 242, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_u_upgrade); __Pyx_GIVEREF(__pyx_n_u_upgrade); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_upgrade)) __PYX_ERR(0, 242, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->upgrade); __Pyx_GIVEREF(__pyx_v_self->upgrade); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->upgrade)) __PYX_ERR(0, 242, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 242, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":243 * info.append(("compression", self.compression)) * info.append(("upgrade", self.upgrade)) * info.append(("chunked", self.chunked)) # <<<<<<<<<<<<<< * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) * return '' */ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 243, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_u_chunked); __Pyx_GIVEREF(__pyx_n_u_chunked); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_chunked)) __PYX_ERR(0, 243, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->chunked); __Pyx_GIVEREF(__pyx_v_self->chunked); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->chunked)) __PYX_ERR(0, 243, __pyx_L1_error); __pyx_t_2 = __Pyx_PyList_Append(__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 243, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":244 * info.append(("upgrade", self.upgrade)) * info.append(("chunked", self.chunked)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< * return '' * */ __pyx_t_3 = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___genexpr(NULL, __pyx_v_info); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = __Pyx_Generator_Next(__pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyUnicode_Join(__pyx_kp_u__2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_sinfo = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":245 * info.append(("chunked", self.chunked)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) * return '' # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_3 = __Pyx_PyUnicode_ConcatSafe(__pyx_kp_u_RawResponseMessage, __pyx_v_sinfo); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 245, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = __Pyx_PyUnicode_ConcatInPlace(__pyx_t_3, __pyx_kp_u__3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 245, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":233 * self.chunked = chunked * * def __repr__(self): # <<<<<<<<<<<<<< * info = [] * info.append(("version", self.version)) */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_info); __Pyx_XDECREF(__pyx_v_sinfo); __Pyx_XDECREF(__pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":211 * @cython.freelist(DEFAULT_FREELIST_SIZE) * cdef class RawResponseMessage: * cdef readonly object version # HttpVersion # <<<<<<<<<<<<<< * cdef readonly int code * cdef readonly str reason */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7version_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7version_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7version___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7version___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->version); __pyx_r = __pyx_v_self->version; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":212 * cdef class RawResponseMessage: * cdef readonly object version # HttpVersion * cdef readonly int code # <<<<<<<<<<<<<< * cdef readonly str reason * cdef readonly object headers # CIMultiDict */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_4code_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_4code_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_4code___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_4code___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 212, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.code.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":213 * cdef readonly object version # HttpVersion * cdef readonly int code * cdef readonly str reason # <<<<<<<<<<<<<< * cdef readonly object headers # CIMultiDict * cdef readonly object raw_headers # tuple */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_6reason_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_6reason_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_6reason___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_6reason___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->reason); __pyx_r = __pyx_v_self->reason; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":214 * cdef readonly int code * cdef readonly str reason * cdef readonly object headers # CIMultiDict # <<<<<<<<<<<<<< * cdef readonly object raw_headers # tuple * cdef readonly object should_close */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7headers_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7headers_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7headers___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7headers___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->headers); __pyx_r = __pyx_v_self->headers; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":215 * cdef readonly str reason * cdef readonly object headers # CIMultiDict * cdef readonly object raw_headers # tuple # <<<<<<<<<<<<<< * cdef readonly object should_close * cdef readonly object compression */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->raw_headers); __pyx_r = __pyx_v_self->raw_headers; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":216 * cdef readonly object headers # CIMultiDict * cdef readonly object raw_headers # tuple * cdef readonly object should_close # <<<<<<<<<<<<<< * cdef readonly object compression * cdef readonly object upgrade */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_12should_close_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_12should_close_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_12should_close___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_12should_close___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->should_close); __pyx_r = __pyx_v_self->should_close; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":217 * cdef readonly object raw_headers # tuple * cdef readonly object should_close * cdef readonly object compression # <<<<<<<<<<<<<< * cdef readonly object upgrade * cdef readonly object chunked */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11compression_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11compression_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_11compression___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_11compression___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->compression); __pyx_r = __pyx_v_self->compression; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":218 * cdef readonly object should_close * cdef readonly object compression * cdef readonly object upgrade # <<<<<<<<<<<<<< * cdef readonly object chunked * */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->upgrade); __pyx_r = __pyx_v_self->upgrade; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":219 * cdef readonly object compression * cdef readonly object upgrade * cdef readonly object chunked # <<<<<<<<<<<<<< * * def __init__(self, version, code, reason, headers, raw_headers, */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7chunked_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7chunked_1__get__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7chunked___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7chunked___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 1); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->chunked); __pyx_r = __pyx_v_self->chunked; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_5__reduce_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_18RawResponseMessage_5__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_5__reduce_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); if (unlikely(__pyx_nargs > 0)) { __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_4__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_4__reduce_cython__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_v_state = 0; PyObject *__pyx_v__dict = 0; int __pyx_v_use_setstate; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_t_3; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 1); /* "(tree fragment)":5 * cdef object _dict * cdef bint use_setstate * state = (self.chunked, self.code, self.compression, self.headers, self.raw_headers, self.reason, self.should_close, self.upgrade, self.version) # <<<<<<<<<<<<<< * _dict = getattr(self, '__dict__', None) * if _dict is not None: */ __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->code); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(9); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_self->chunked); __Pyx_GIVEREF(__pyx_v_self->chunked); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->chunked)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_1); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->compression); __Pyx_GIVEREF(__pyx_v_self->compression); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_self->compression)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->headers); __Pyx_GIVEREF(__pyx_v_self->headers); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_self->headers)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->raw_headers); __Pyx_GIVEREF(__pyx_v_self->raw_headers); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_v_self->raw_headers)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->reason); __Pyx_GIVEREF(__pyx_v_self->reason); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 5, __pyx_v_self->reason)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->should_close); __Pyx_GIVEREF(__pyx_v_self->should_close); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 6, __pyx_v_self->should_close)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->upgrade); __Pyx_GIVEREF(__pyx_v_self->upgrade); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 7, __pyx_v_self->upgrade)) __PYX_ERR(1, 5, __pyx_L1_error); __Pyx_INCREF(__pyx_v_self->version); __Pyx_GIVEREF(__pyx_v_self->version); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 8, __pyx_v_self->version)) __PYX_ERR(1, 5, __pyx_L1_error); __pyx_t_1 = 0; __pyx_v_state = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "(tree fragment)":6 * cdef bint use_setstate * state = (self.chunked, self.code, self.compression, self.headers, self.raw_headers, self.reason, self.should_close, self.upgrade, self.version) * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< * if _dict is not None: * state += (_dict,) */ __pyx_t_2 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_v__dict = __pyx_t_2; __pyx_t_2 = 0; /* "(tree fragment)":7 * state = (self.chunked, self.code, self.compression, self.headers, self.raw_headers, self.reason, self.should_close, self.upgrade, self.version) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ __pyx_t_3 = (__pyx_v__dict != Py_None); if (__pyx_t_3) { /* "(tree fragment)":8 * _dict = getattr(self, '__dict__', None) * if _dict is not None: * state += (_dict,) # <<<<<<<<<<<<<< * use_setstate = True * else: */ __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v__dict); __Pyx_GIVEREF(__pyx_v__dict); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v__dict)) __PYX_ERR(1, 8, __pyx_L1_error); __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_1)); __pyx_t_1 = 0; /* "(tree fragment)":9 * if _dict is not None: * state += (_dict,) * use_setstate = True # <<<<<<<<<<<<<< * else: * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None */ __pyx_v_use_setstate = 1; /* "(tree fragment)":7 * state = (self.chunked, self.code, self.compression, self.headers, self.raw_headers, self.reason, self.should_close, self.upgrade, self.version) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ goto __pyx_L3; } /* "(tree fragment)":11 * use_setstate = True * else: * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None # <<<<<<<<<<<<<< * if use_setstate: * return __pyx_unpickle_RawResponseMessage, (type(self), 0xcb2b2ba, None), state */ /*else*/ { __pyx_t_4 = (__pyx_v_self->chunked != Py_None); if (!__pyx_t_4) { } else { __pyx_t_3 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->compression != Py_None); if (!__pyx_t_4) { } else { __pyx_t_3 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->headers != Py_None); if (!__pyx_t_4) { } else { __pyx_t_3 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->raw_headers != Py_None); if (!__pyx_t_4) { } else { __pyx_t_3 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->reason != ((PyObject*)Py_None)); if (!__pyx_t_4) { } else { __pyx_t_3 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->should_close != Py_None); if (!__pyx_t_4) { } else { __pyx_t_3 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->upgrade != Py_None); if (!__pyx_t_4) { } else { __pyx_t_3 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = (__pyx_v_self->version != Py_None); __pyx_t_3 = __pyx_t_4; __pyx_L4_bool_binop_done:; __pyx_v_use_setstate = __pyx_t_3; } __pyx_L3:; /* "(tree fragment)":12 * else: * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle_RawResponseMessage, (type(self), 0xcb2b2ba, None), state * else: */ if (__pyx_v_use_setstate) { /* "(tree fragment)":13 * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None * if use_setstate: * return __pyx_unpickle_RawResponseMessage, (type(self), 0xcb2b2ba, None), state # <<<<<<<<<<<<<< * else: * return __pyx_unpickle_RawResponseMessage, (type(self), 0xcb2b2ba, state) */ __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pyx_unpickle_RawResponseMessag); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 13, __pyx_L1_error); __Pyx_INCREF(__pyx_int_213037754); __Pyx_GIVEREF(__pyx_int_213037754); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_213037754)) __PYX_ERR(1, 13, __pyx_L1_error); __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, Py_None)) __PYX_ERR(1, 13, __pyx_L1_error); __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_1); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_2); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_state)) __PYX_ERR(1, 13, __pyx_L1_error); __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; /* "(tree fragment)":12 * else: * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle_RawResponseMessage, (type(self), 0xcb2b2ba, None), state * else: */ } /* "(tree fragment)":15 * return __pyx_unpickle_RawResponseMessage, (type(self), 0xcb2b2ba, None), state * else: * return __pyx_unpickle_RawResponseMessage, (type(self), 0xcb2b2ba, state) # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) */ /*else*/ { __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_pyx_unpickle_RawResponseMessag); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))))) __PYX_ERR(1, 15, __pyx_L1_error); __Pyx_INCREF(__pyx_int_213037754); __Pyx_GIVEREF(__pyx_int_213037754); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_213037754)) __PYX_ERR(1, 15, __pyx_L1_error); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_state)) __PYX_ERR(1, 15, __pyx_L1_error); __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_5); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5)) __PYX_ERR(1, 15, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_2); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2)) __PYX_ERR(1, 15, __pyx_L1_error); __pyx_t_5 = 0; __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_state); __Pyx_XDECREF(__pyx_v__dict); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":16 * else: * return __pyx_unpickle_RawResponseMessage, (type(self), 0xcb2b2ba, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7__setstate_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_18RawResponseMessage_7__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7__setstate_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { PyObject *__pyx_v___pyx_state = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[1] = {0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 16, __pyx_L3_error) else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 16, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 1)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); } __pyx_v___pyx_state = values[0]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 16, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_6__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self), __pyx_v___pyx_state); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_6__setstate_cython__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 1); /* "(tree fragment)":17 * return __pyx_unpickle_RawResponseMessage, (type(self), 0xcb2b2ba, state) * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) # <<<<<<<<<<<<<< */ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 17, __pyx_L1_error) __pyx_t_1 = __pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawResponseMessage__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":16 * else: * return __pyx_unpickle_RawResponseMessage, (type(self), 0xcb2b2ba, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":248 * * * cdef _new_response_message(object version, # <<<<<<<<<<<<<< * int code, * str reason, */ static PyObject *__pyx_f_7aiohttp_12_http_parser__new_response_message(PyObject *__pyx_v_version, int __pyx_v_code, PyObject *__pyx_v_reason, PyObject *__pyx_v_headers, PyObject *__pyx_v_raw_headers, int __pyx_v_should_close, PyObject *__pyx_v_compression, int __pyx_v_upgrade, int __pyx_v_chunked) { struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_ret = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_new_response_message", 1); /* "aiohttp/_http_parser.pyx":258 * bint chunked): * cdef RawResponseMessage ret * ret = RawResponseMessage.__new__(RawResponseMessage) # <<<<<<<<<<<<<< * ret.version = version * ret.code = code */ __pyx_t_1 = ((PyObject *)__pyx_tp_new_7aiohttp_12_http_parser_RawResponseMessage(((PyTypeObject *)__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage), __pyx_empty_tuple, NULL)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 258, __pyx_L1_error) __Pyx_GOTREF((PyObject *)__pyx_t_1); __pyx_v_ret = ((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":259 * cdef RawResponseMessage ret * ret = RawResponseMessage.__new__(RawResponseMessage) * ret.version = version # <<<<<<<<<<<<<< * ret.code = code * ret.reason = reason */ __Pyx_INCREF(__pyx_v_version); __Pyx_GIVEREF(__pyx_v_version); __Pyx_GOTREF(__pyx_v_ret->version); __Pyx_DECREF(__pyx_v_ret->version); __pyx_v_ret->version = __pyx_v_version; /* "aiohttp/_http_parser.pyx":260 * ret = RawResponseMessage.__new__(RawResponseMessage) * ret.version = version * ret.code = code # <<<<<<<<<<<<<< * ret.reason = reason * ret.headers = headers */ __pyx_v_ret->code = __pyx_v_code; /* "aiohttp/_http_parser.pyx":261 * ret.version = version * ret.code = code * ret.reason = reason # <<<<<<<<<<<<<< * ret.headers = headers * ret.raw_headers = raw_headers */ __Pyx_INCREF(__pyx_v_reason); __Pyx_GIVEREF(__pyx_v_reason); __Pyx_GOTREF(__pyx_v_ret->reason); __Pyx_DECREF(__pyx_v_ret->reason); __pyx_v_ret->reason = __pyx_v_reason; /* "aiohttp/_http_parser.pyx":262 * ret.code = code * ret.reason = reason * ret.headers = headers # <<<<<<<<<<<<<< * ret.raw_headers = raw_headers * ret.should_close = should_close */ __Pyx_INCREF(__pyx_v_headers); __Pyx_GIVEREF(__pyx_v_headers); __Pyx_GOTREF(__pyx_v_ret->headers); __Pyx_DECREF(__pyx_v_ret->headers); __pyx_v_ret->headers = __pyx_v_headers; /* "aiohttp/_http_parser.pyx":263 * ret.reason = reason * ret.headers = headers * ret.raw_headers = raw_headers # <<<<<<<<<<<<<< * ret.should_close = should_close * ret.compression = compression */ __Pyx_INCREF(__pyx_v_raw_headers); __Pyx_GIVEREF(__pyx_v_raw_headers); __Pyx_GOTREF(__pyx_v_ret->raw_headers); __Pyx_DECREF(__pyx_v_ret->raw_headers); __pyx_v_ret->raw_headers = __pyx_v_raw_headers; /* "aiohttp/_http_parser.pyx":264 * ret.headers = headers * ret.raw_headers = raw_headers * ret.should_close = should_close # <<<<<<<<<<<<<< * ret.compression = compression * ret.upgrade = upgrade */ __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_should_close); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 264, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_ret->should_close); __Pyx_DECREF(__pyx_v_ret->should_close); __pyx_v_ret->should_close = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":265 * ret.raw_headers = raw_headers * ret.should_close = should_close * ret.compression = compression # <<<<<<<<<<<<<< * ret.upgrade = upgrade * ret.chunked = chunked */ __Pyx_INCREF(__pyx_v_compression); __Pyx_GIVEREF(__pyx_v_compression); __Pyx_GOTREF(__pyx_v_ret->compression); __Pyx_DECREF(__pyx_v_ret->compression); __pyx_v_ret->compression = __pyx_v_compression; /* "aiohttp/_http_parser.pyx":266 * ret.should_close = should_close * ret.compression = compression * ret.upgrade = upgrade # <<<<<<<<<<<<<< * ret.chunked = chunked * return ret */ __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_upgrade); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 266, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_ret->upgrade); __Pyx_DECREF(__pyx_v_ret->upgrade); __pyx_v_ret->upgrade = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":267 * ret.compression = compression * ret.upgrade = upgrade * ret.chunked = chunked # <<<<<<<<<<<<<< * return ret * */ __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_chunked); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 267, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_ret->chunked); __Pyx_DECREF(__pyx_v_ret->chunked); __pyx_v_ret->chunked = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":268 * ret.upgrade = upgrade * ret.chunked = chunked * return ret # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF((PyObject *)__pyx_v_ret); __pyx_r = ((PyObject *)__pyx_v_ret); goto __pyx_L0; /* "aiohttp/_http_parser.pyx":248 * * * cdef _new_response_message(object version, # <<<<<<<<<<<<<< * int code, * str reason, */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser._new_response_message", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_ret); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":312 * Py_buffer py_buf * * def __cinit__(self): # <<<<<<<<<<<<<< * self._cparser = \ * PyMem_Malloc(sizeof(cparser.llhttp_t)) */ /* Python wrapper */ static int __pyx_pw_7aiohttp_12_http_parser_10HttpParser_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7aiohttp_12_http_parser_10HttpParser_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { CYTHON_UNUSED Py_ssize_t __pyx_nargs; CYTHON_UNUSED PyObject *const *__pyx_kwvalues; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; #endif __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); if (unlikely(__pyx_nargs > 0)) { __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, __pyx_nargs); return -1;} if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser___cinit__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_7aiohttp_12_http_parser_10HttpParser___cinit__(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { int __pyx_r; int __pyx_t_1; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; /* "aiohttp/_http_parser.pyx":313 * * def __cinit__(self): * self._cparser = \ # <<<<<<<<<<<<<< * PyMem_Malloc(sizeof(cparser.llhttp_t)) * if self._cparser is NULL: */ __pyx_v_self->_cparser = ((llhttp_t *)PyMem_Malloc((sizeof(llhttp_t)))); /* "aiohttp/_http_parser.pyx":315 * self._cparser = \ * PyMem_Malloc(sizeof(cparser.llhttp_t)) * if self._cparser is NULL: # <<<<<<<<<<<<<< * raise MemoryError() * */ __pyx_t_1 = (__pyx_v_self->_cparser == NULL); if (unlikely(__pyx_t_1)) { /* "aiohttp/_http_parser.pyx":316 * PyMem_Malloc(sizeof(cparser.llhttp_t)) * if self._cparser is NULL: * raise MemoryError() # <<<<<<<<<<<<<< * * self._csettings = \ */ PyErr_NoMemory(); __PYX_ERR(0, 316, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":315 * self._cparser = \ * PyMem_Malloc(sizeof(cparser.llhttp_t)) * if self._cparser is NULL: # <<<<<<<<<<<<<< * raise MemoryError() * */ } /* "aiohttp/_http_parser.pyx":318 * raise MemoryError() * * self._csettings = \ # <<<<<<<<<<<<<< * PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) * if self._csettings is NULL: */ __pyx_v_self->_csettings = ((llhttp_settings_t *)PyMem_Malloc((sizeof(llhttp_settings_t)))); /* "aiohttp/_http_parser.pyx":320 * self._csettings = \ * PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) * if self._csettings is NULL: # <<<<<<<<<<<<<< * raise MemoryError() * */ __pyx_t_1 = (__pyx_v_self->_csettings == NULL); if (unlikely(__pyx_t_1)) { /* "aiohttp/_http_parser.pyx":321 * PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) * if self._csettings is NULL: * raise MemoryError() # <<<<<<<<<<<<<< * * def __dealloc__(self): */ PyErr_NoMemory(); __PYX_ERR(0, 321, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":320 * self._csettings = \ * PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) * if self._csettings is NULL: # <<<<<<<<<<<<<< * raise MemoryError() * */ } /* "aiohttp/_http_parser.pyx":312 * Py_buffer py_buf * * def __cinit__(self): # <<<<<<<<<<<<<< * self._cparser = \ * PyMem_Malloc(sizeof(cparser.llhttp_t)) */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; return __pyx_r; } /* "aiohttp/_http_parser.pyx":323 * raise MemoryError() * * def __dealloc__(self): # <<<<<<<<<<<<<< * PyMem_Free(self._cparser) * PyMem_Free(self._csettings) */ /* Python wrapper */ static void __pyx_pw_7aiohttp_12_http_parser_10HttpParser_3__dealloc__(PyObject *__pyx_v_self); /*proto*/ static void __pyx_pw_7aiohttp_12_http_parser_10HttpParser_3__dealloc__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_pf_7aiohttp_12_http_parser_10HttpParser_2__dealloc__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); } static void __pyx_pf_7aiohttp_12_http_parser_10HttpParser_2__dealloc__(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { /* "aiohttp/_http_parser.pyx":324 * * def __dealloc__(self): * PyMem_Free(self._cparser) # <<<<<<<<<<<<<< * PyMem_Free(self._csettings) * */ PyMem_Free(__pyx_v_self->_cparser); /* "aiohttp/_http_parser.pyx":325 * def __dealloc__(self): * PyMem_Free(self._cparser) * PyMem_Free(self._csettings) # <<<<<<<<<<<<<< * * cdef _init( */ PyMem_Free(__pyx_v_self->_csettings); /* "aiohttp/_http_parser.pyx":323 * raise MemoryError() * * def __dealloc__(self): # <<<<<<<<<<<<<< * PyMem_Free(self._cparser) * PyMem_Free(self._csettings) */ /* function exit code */ } /* "aiohttp/_http_parser.pyx":327 * PyMem_Free(self._csettings) * * cdef _init( # <<<<<<<<<<<<<< * self, cparser.llhttp_type mode, * object protocol, object loop, int limit, */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__init(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, enum llhttp_type __pyx_v_mode, PyObject *__pyx_v_protocol, PyObject *__pyx_v_loop, int __pyx_v_limit, struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init *__pyx_optional_args) { /* "aiohttp/_http_parser.pyx":330 * self, cparser.llhttp_type mode, * object protocol, object loop, int limit, * object timer=None, # <<<<<<<<<<<<<< * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, */ PyObject *__pyx_v_timer = ((PyObject *)Py_None); size_t __pyx_v_max_line_size = ((size_t)0x1FFE); size_t __pyx_v_max_headers = ((size_t)0x8000); size_t __pyx_v_max_field_size = ((size_t)0x1FFE); /* "aiohttp/_http_parser.pyx":332 * object timer=None, * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, # <<<<<<<<<<<<<< * bint response_with_body=True, bint read_until_eof=False, * bint auto_decompress=True, */ PyObject *__pyx_v_payload_exception = ((PyObject *)Py_None); /* "aiohttp/_http_parser.pyx":333 * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, * bint response_with_body=True, bint read_until_eof=False, # <<<<<<<<<<<<<< * bint auto_decompress=True, * ): */ int __pyx_v_response_with_body = ((int)1); int __pyx_v_read_until_eof = ((int)0); /* "aiohttp/_http_parser.pyx":334 * size_t max_field_size=8190, payload_exception=None, * bint response_with_body=True, bint read_until_eof=False, * bint auto_decompress=True, # <<<<<<<<<<<<<< * ): * cparser.llhttp_settings_init(self._csettings) */ int __pyx_v_auto_decompress = ((int)1); PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_init", 1); if (__pyx_optional_args) { if (__pyx_optional_args->__pyx_n > 0) { __pyx_v_timer = __pyx_optional_args->timer; if (__pyx_optional_args->__pyx_n > 1) { __pyx_v_max_line_size = __pyx_optional_args->max_line_size; if (__pyx_optional_args->__pyx_n > 2) { __pyx_v_max_headers = __pyx_optional_args->max_headers; if (__pyx_optional_args->__pyx_n > 3) { __pyx_v_max_field_size = __pyx_optional_args->max_field_size; if (__pyx_optional_args->__pyx_n > 4) { __pyx_v_payload_exception = __pyx_optional_args->payload_exception; if (__pyx_optional_args->__pyx_n > 5) { __pyx_v_response_with_body = __pyx_optional_args->response_with_body; if (__pyx_optional_args->__pyx_n > 6) { __pyx_v_read_until_eof = __pyx_optional_args->read_until_eof; if (__pyx_optional_args->__pyx_n > 7) { __pyx_v_auto_decompress = __pyx_optional_args->auto_decompress; } } } } } } } } } /* "aiohttp/_http_parser.pyx":336 * bint auto_decompress=True, * ): * cparser.llhttp_settings_init(self._csettings) # <<<<<<<<<<<<<< * cparser.llhttp_init(self._cparser, mode, self._csettings) * self._cparser.data = self */ llhttp_settings_init(__pyx_v_self->_csettings); /* "aiohttp/_http_parser.pyx":337 * ): * cparser.llhttp_settings_init(self._csettings) * cparser.llhttp_init(self._cparser, mode, self._csettings) # <<<<<<<<<<<<<< * self._cparser.data = self * self._cparser.content_length = 0 */ llhttp_init(__pyx_v_self->_cparser, __pyx_v_mode, __pyx_v_self->_csettings); /* "aiohttp/_http_parser.pyx":338 * cparser.llhttp_settings_init(self._csettings) * cparser.llhttp_init(self._cparser, mode, self._csettings) * self._cparser.data = self # <<<<<<<<<<<<<< * self._cparser.content_length = 0 * */ __pyx_v_self->_cparser->data = ((void *)__pyx_v_self); /* "aiohttp/_http_parser.pyx":339 * cparser.llhttp_init(self._cparser, mode, self._csettings) * self._cparser.data = self * self._cparser.content_length = 0 # <<<<<<<<<<<<<< * * self._protocol = protocol */ __pyx_v_self->_cparser->content_length = 0; /* "aiohttp/_http_parser.pyx":341 * self._cparser.content_length = 0 * * self._protocol = protocol # <<<<<<<<<<<<<< * self._loop = loop * self._timer = timer */ __Pyx_INCREF(__pyx_v_protocol); __Pyx_GIVEREF(__pyx_v_protocol); __Pyx_GOTREF(__pyx_v_self->_protocol); __Pyx_DECREF(__pyx_v_self->_protocol); __pyx_v_self->_protocol = __pyx_v_protocol; /* "aiohttp/_http_parser.pyx":342 * * self._protocol = protocol * self._loop = loop # <<<<<<<<<<<<<< * self._timer = timer * */ __Pyx_INCREF(__pyx_v_loop); __Pyx_GIVEREF(__pyx_v_loop); __Pyx_GOTREF(__pyx_v_self->_loop); __Pyx_DECREF(__pyx_v_self->_loop); __pyx_v_self->_loop = __pyx_v_loop; /* "aiohttp/_http_parser.pyx":343 * self._protocol = protocol * self._loop = loop * self._timer = timer # <<<<<<<<<<<<<< * * self._buf = bytearray() */ __Pyx_INCREF(__pyx_v_timer); __Pyx_GIVEREF(__pyx_v_timer); __Pyx_GOTREF(__pyx_v_self->_timer); __Pyx_DECREF(__pyx_v_self->_timer); __pyx_v_self->_timer = __pyx_v_timer; /* "aiohttp/_http_parser.pyx":345 * self._timer = timer * * self._buf = bytearray() # <<<<<<<<<<<<<< * self._payload = None * self._payload_error = 0 */ __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)(&PyByteArray_Type))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 345, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_self->_buf); __Pyx_DECREF(__pyx_v_self->_buf); __pyx_v_self->_buf = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":346 * * self._buf = bytearray() * self._payload = None # <<<<<<<<<<<<<< * self._payload_error = 0 * self._payload_exception = payload_exception */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_self->_payload); __Pyx_DECREF(__pyx_v_self->_payload); __pyx_v_self->_payload = Py_None; /* "aiohttp/_http_parser.pyx":347 * self._buf = bytearray() * self._payload = None * self._payload_error = 0 # <<<<<<<<<<<<<< * self._payload_exception = payload_exception * self._messages = [] */ __pyx_v_self->_payload_error = 0; /* "aiohttp/_http_parser.pyx":348 * self._payload = None * self._payload_error = 0 * self._payload_exception = payload_exception # <<<<<<<<<<<<<< * self._messages = [] * */ __Pyx_INCREF(__pyx_v_payload_exception); __Pyx_GIVEREF(__pyx_v_payload_exception); __Pyx_GOTREF(__pyx_v_self->_payload_exception); __Pyx_DECREF(__pyx_v_self->_payload_exception); __pyx_v_self->_payload_exception = __pyx_v_payload_exception; /* "aiohttp/_http_parser.pyx":349 * self._payload_error = 0 * self._payload_exception = payload_exception * self._messages = [] # <<<<<<<<<<<<<< * * self._raw_name = bytearray() */ __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 349, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_self->_messages); __Pyx_DECREF(__pyx_v_self->_messages); __pyx_v_self->_messages = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":351 * self._messages = [] * * self._raw_name = bytearray() # <<<<<<<<<<<<<< * self._raw_value = bytearray() * self._has_value = False */ __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)(&PyByteArray_Type))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 351, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_self->_raw_name); __Pyx_DECREF(__pyx_v_self->_raw_name); __pyx_v_self->_raw_name = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":352 * * self._raw_name = bytearray() * self._raw_value = bytearray() # <<<<<<<<<<<<<< * self._has_value = False * */ __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)(&PyByteArray_Type))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 352, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_self->_raw_value); __Pyx_DECREF(__pyx_v_self->_raw_value); __pyx_v_self->_raw_value = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":353 * self._raw_name = bytearray() * self._raw_value = bytearray() * self._has_value = False # <<<<<<<<<<<<<< * * self._max_line_size = max_line_size */ __pyx_v_self->_has_value = 0; /* "aiohttp/_http_parser.pyx":355 * self._has_value = False * * self._max_line_size = max_line_size # <<<<<<<<<<<<<< * self._max_headers = max_headers * self._max_field_size = max_field_size */ __pyx_v_self->_max_line_size = __pyx_v_max_line_size; /* "aiohttp/_http_parser.pyx":356 * * self._max_line_size = max_line_size * self._max_headers = max_headers # <<<<<<<<<<<<<< * self._max_field_size = max_field_size * self._response_with_body = response_with_body */ __pyx_v_self->_max_headers = __pyx_v_max_headers; /* "aiohttp/_http_parser.pyx":357 * self._max_line_size = max_line_size * self._max_headers = max_headers * self._max_field_size = max_field_size # <<<<<<<<<<<<<< * self._response_with_body = response_with_body * self._read_until_eof = read_until_eof */ __pyx_v_self->_max_field_size = __pyx_v_max_field_size; /* "aiohttp/_http_parser.pyx":358 * self._max_headers = max_headers * self._max_field_size = max_field_size * self._response_with_body = response_with_body # <<<<<<<<<<<<<< * self._read_until_eof = read_until_eof * self._upgraded = False */ __pyx_v_self->_response_with_body = __pyx_v_response_with_body; /* "aiohttp/_http_parser.pyx":359 * self._max_field_size = max_field_size * self._response_with_body = response_with_body * self._read_until_eof = read_until_eof # <<<<<<<<<<<<<< * self._upgraded = False * self._auto_decompress = auto_decompress */ __pyx_v_self->_read_until_eof = __pyx_v_read_until_eof; /* "aiohttp/_http_parser.pyx":360 * self._response_with_body = response_with_body * self._read_until_eof = read_until_eof * self._upgraded = False # <<<<<<<<<<<<<< * self._auto_decompress = auto_decompress * self._content_encoding = None */ __pyx_v_self->_upgraded = 0; /* "aiohttp/_http_parser.pyx":361 * self._read_until_eof = read_until_eof * self._upgraded = False * self._auto_decompress = auto_decompress # <<<<<<<<<<<<<< * self._content_encoding = None * */ __pyx_v_self->_auto_decompress = __pyx_v_auto_decompress; /* "aiohttp/_http_parser.pyx":362 * self._upgraded = False * self._auto_decompress = auto_decompress * self._content_encoding = None # <<<<<<<<<<<<<< * * self._csettings.on_url = cb_on_url */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_self->_content_encoding); __Pyx_DECREF(__pyx_v_self->_content_encoding); __pyx_v_self->_content_encoding = ((PyObject*)Py_None); /* "aiohttp/_http_parser.pyx":364 * self._content_encoding = None * * self._csettings.on_url = cb_on_url # <<<<<<<<<<<<<< * self._csettings.on_status = cb_on_status * self._csettings.on_header_field = cb_on_header_field */ __pyx_v_self->_csettings->on_url = __pyx_f_7aiohttp_12_http_parser_cb_on_url; /* "aiohttp/_http_parser.pyx":365 * * self._csettings.on_url = cb_on_url * self._csettings.on_status = cb_on_status # <<<<<<<<<<<<<< * self._csettings.on_header_field = cb_on_header_field * self._csettings.on_header_value = cb_on_header_value */ __pyx_v_self->_csettings->on_status = __pyx_f_7aiohttp_12_http_parser_cb_on_status; /* "aiohttp/_http_parser.pyx":366 * self._csettings.on_url = cb_on_url * self._csettings.on_status = cb_on_status * self._csettings.on_header_field = cb_on_header_field # <<<<<<<<<<<<<< * self._csettings.on_header_value = cb_on_header_value * self._csettings.on_headers_complete = cb_on_headers_complete */ __pyx_v_self->_csettings->on_header_field = __pyx_f_7aiohttp_12_http_parser_cb_on_header_field; /* "aiohttp/_http_parser.pyx":367 * self._csettings.on_status = cb_on_status * self._csettings.on_header_field = cb_on_header_field * self._csettings.on_header_value = cb_on_header_value # <<<<<<<<<<<<<< * self._csettings.on_headers_complete = cb_on_headers_complete * self._csettings.on_body = cb_on_body */ __pyx_v_self->_csettings->on_header_value = __pyx_f_7aiohttp_12_http_parser_cb_on_header_value; /* "aiohttp/_http_parser.pyx":368 * self._csettings.on_header_field = cb_on_header_field * self._csettings.on_header_value = cb_on_header_value * self._csettings.on_headers_complete = cb_on_headers_complete # <<<<<<<<<<<<<< * self._csettings.on_body = cb_on_body * self._csettings.on_message_begin = cb_on_message_begin */ __pyx_v_self->_csettings->on_headers_complete = __pyx_f_7aiohttp_12_http_parser_cb_on_headers_complete; /* "aiohttp/_http_parser.pyx":369 * self._csettings.on_header_value = cb_on_header_value * self._csettings.on_headers_complete = cb_on_headers_complete * self._csettings.on_body = cb_on_body # <<<<<<<<<<<<<< * self._csettings.on_message_begin = cb_on_message_begin * self._csettings.on_message_complete = cb_on_message_complete */ __pyx_v_self->_csettings->on_body = __pyx_f_7aiohttp_12_http_parser_cb_on_body; /* "aiohttp/_http_parser.pyx":370 * self._csettings.on_headers_complete = cb_on_headers_complete * self._csettings.on_body = cb_on_body * self._csettings.on_message_begin = cb_on_message_begin # <<<<<<<<<<<<<< * self._csettings.on_message_complete = cb_on_message_complete * self._csettings.on_chunk_header = cb_on_chunk_header */ __pyx_v_self->_csettings->on_message_begin = __pyx_f_7aiohttp_12_http_parser_cb_on_message_begin; /* "aiohttp/_http_parser.pyx":371 * self._csettings.on_body = cb_on_body * self._csettings.on_message_begin = cb_on_message_begin * self._csettings.on_message_complete = cb_on_message_complete # <<<<<<<<<<<<<< * self._csettings.on_chunk_header = cb_on_chunk_header * self._csettings.on_chunk_complete = cb_on_chunk_complete */ __pyx_v_self->_csettings->on_message_complete = __pyx_f_7aiohttp_12_http_parser_cb_on_message_complete; /* "aiohttp/_http_parser.pyx":372 * self._csettings.on_message_begin = cb_on_message_begin * self._csettings.on_message_complete = cb_on_message_complete * self._csettings.on_chunk_header = cb_on_chunk_header # <<<<<<<<<<<<<< * self._csettings.on_chunk_complete = cb_on_chunk_complete * */ __pyx_v_self->_csettings->on_chunk_header = __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_header; /* "aiohttp/_http_parser.pyx":373 * self._csettings.on_message_complete = cb_on_message_complete * self._csettings.on_chunk_header = cb_on_chunk_header * self._csettings.on_chunk_complete = cb_on_chunk_complete # <<<<<<<<<<<<<< * * self._last_error = None */ __pyx_v_self->_csettings->on_chunk_complete = __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_complete; /* "aiohttp/_http_parser.pyx":375 * self._csettings.on_chunk_complete = cb_on_chunk_complete * * self._last_error = None # <<<<<<<<<<<<<< * self._limit = limit * */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_self->_last_error); __Pyx_DECREF(__pyx_v_self->_last_error); __pyx_v_self->_last_error = Py_None; /* "aiohttp/_http_parser.pyx":376 * * self._last_error = None * self._limit = limit # <<<<<<<<<<<<<< * * cdef _process_header(self): */ __pyx_v_self->_limit = __pyx_v_limit; /* "aiohttp/_http_parser.pyx":327 * PyMem_Free(self._csettings) * * cdef _init( # <<<<<<<<<<<<<< * self, cparser.llhttp_type mode, * object protocol, object loop, int limit, */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._init", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":378 * self._limit = limit * * cdef _process_header(self): # <<<<<<<<<<<<<< * if self._raw_name: * raw_name = bytes(self._raw_name) */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__process_header(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { PyObject *__pyx_v_raw_name = NULL; PyObject *__pyx_v_raw_value = NULL; PyObject *__pyx_v_name = NULL; PyObject *__pyx_v_value = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_process_header", 1); /* "aiohttp/_http_parser.pyx":379 * * cdef _process_header(self): * if self._raw_name: # <<<<<<<<<<<<<< * raw_name = bytes(self._raw_name) * raw_value = bytes(self._raw_value) */ __pyx_t_1 = (__pyx_v_self->_raw_name != Py_None)&&(PyByteArray_GET_SIZE(__pyx_v_self->_raw_name) != 0); if (__pyx_t_1) { /* "aiohttp/_http_parser.pyx":380 * cdef _process_header(self): * if self._raw_name: * raw_name = bytes(self._raw_name) # <<<<<<<<<<<<<< * raw_value = bytes(self._raw_value) * */ __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyBytes_Type)), __pyx_v_self->_raw_name); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 380, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_v_raw_name = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":381 * if self._raw_name: * raw_name = bytes(self._raw_name) * raw_value = bytes(self._raw_value) # <<<<<<<<<<<<<< * * name = find_header(raw_name) */ __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyBytes_Type)), __pyx_v_self->_raw_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 381, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_v_raw_value = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":383 * raw_value = bytes(self._raw_value) * * name = find_header(raw_name) # <<<<<<<<<<<<<< * value = raw_value.decode('utf-8', 'surrogateescape') * */ __pyx_t_2 = __pyx_f_7aiohttp_12_http_parser_find_header(__pyx_v_raw_name); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 383, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_v_name = __pyx_t_2; __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":384 * * name = find_header(raw_name) * value = raw_value.decode('utf-8', 'surrogateescape') # <<<<<<<<<<<<<< * * self._headers.add(name, value) */ __pyx_t_2 = __Pyx_decode_bytes(__pyx_v_raw_value, 0, PY_SSIZE_T_MAX, NULL, ((char const *)"surrogateescape"), PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 384, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_v_value = __pyx_t_2; __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":386 * value = raw_value.decode('utf-8', 'surrogateescape') * * self._headers.add(name, value) # <<<<<<<<<<<<<< * * if name is CONTENT_ENCODING: */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_headers, __pyx_n_s_add); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 386, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_5 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_5 = 1; } } #endif { PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_v_name, __pyx_v_value}; __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 386, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":388 * self._headers.add(name, value) * * if name is CONTENT_ENCODING: # <<<<<<<<<<<<<< * self._content_encoding = value * */ __pyx_t_1 = (__pyx_v_name == __pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING); if (__pyx_t_1) { /* "aiohttp/_http_parser.pyx":389 * * if name is CONTENT_ENCODING: * self._content_encoding = value # <<<<<<<<<<<<<< * * PyByteArray_Resize(self._raw_name, 0) */ if (!(likely(PyUnicode_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None) || __Pyx_RaiseUnexpectedTypeError("unicode", __pyx_v_value))) __PYX_ERR(0, 389, __pyx_L1_error) __pyx_t_2 = __pyx_v_value; __Pyx_INCREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __Pyx_GOTREF(__pyx_v_self->_content_encoding); __Pyx_DECREF(__pyx_v_self->_content_encoding); __pyx_v_self->_content_encoding = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":388 * self._headers.add(name, value) * * if name is CONTENT_ENCODING: # <<<<<<<<<<<<<< * self._content_encoding = value * */ } /* "aiohttp/_http_parser.pyx":391 * self._content_encoding = value * * PyByteArray_Resize(self._raw_name, 0) # <<<<<<<<<<<<<< * PyByteArray_Resize(self._raw_value, 0) * self._has_value = False */ __pyx_t_2 = __pyx_v_self->_raw_name; __Pyx_INCREF(__pyx_t_2); __pyx_t_5 = PyByteArray_Resize(__pyx_t_2, 0); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 391, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":392 * * PyByteArray_Resize(self._raw_name, 0) * PyByteArray_Resize(self._raw_value, 0) # <<<<<<<<<<<<<< * self._has_value = False * self._raw_headers.append((raw_name, raw_value)) */ __pyx_t_2 = __pyx_v_self->_raw_value; __Pyx_INCREF(__pyx_t_2); __pyx_t_5 = PyByteArray_Resize(__pyx_t_2, 0); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 392, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":393 * PyByteArray_Resize(self._raw_name, 0) * PyByteArray_Resize(self._raw_value, 0) * self._has_value = False # <<<<<<<<<<<<<< * self._raw_headers.append((raw_name, raw_value)) * */ __pyx_v_self->_has_value = 0; /* "aiohttp/_http_parser.pyx":394 * PyByteArray_Resize(self._raw_value, 0) * self._has_value = False * self._raw_headers.append((raw_name, raw_value)) # <<<<<<<<<<<<<< * * cdef _on_header_field(self, char* at, size_t length): */ if (unlikely(__pyx_v_self->_raw_headers == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append"); __PYX_ERR(0, 394, __pyx_L1_error) } __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 394, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_raw_name); __Pyx_GIVEREF(__pyx_v_raw_name); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_raw_name)) __PYX_ERR(0, 394, __pyx_L1_error); __Pyx_INCREF(__pyx_v_raw_value); __Pyx_GIVEREF(__pyx_v_raw_value); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_raw_value)) __PYX_ERR(0, 394, __pyx_L1_error); __pyx_t_6 = __Pyx_PyList_Append(__pyx_v_self->_raw_headers, __pyx_t_2); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 394, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":379 * * cdef _process_header(self): * if self._raw_name: # <<<<<<<<<<<<<< * raw_name = bytes(self._raw_name) * raw_value = bytes(self._raw_value) */ } /* "aiohttp/_http_parser.pyx":378 * self._limit = limit * * cdef _process_header(self): # <<<<<<<<<<<<<< * if self._raw_name: * raw_name = bytes(self._raw_name) */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._process_header", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_raw_name); __Pyx_XDECREF(__pyx_v_raw_value); __Pyx_XDECREF(__pyx_v_name); __Pyx_XDECREF(__pyx_v_value); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":396 * self._raw_headers.append((raw_name, raw_value)) * * cdef _on_header_field(self, char* at, size_t length): # <<<<<<<<<<<<<< * cdef Py_ssize_t size * cdef char *buf */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_field(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, char *__pyx_v_at, size_t __pyx_v_length) { Py_ssize_t __pyx_v_size; char *__pyx_v_buf; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; int __pyx_t_3; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_on_header_field", 1); /* "aiohttp/_http_parser.pyx":399 * cdef Py_ssize_t size * cdef char *buf * if self._has_value: # <<<<<<<<<<<<<< * self._process_header() * */ if (__pyx_v_self->_has_value) { /* "aiohttp/_http_parser.pyx":400 * cdef char *buf * if self._has_value: * self._process_header() # <<<<<<<<<<<<<< * * size = PyByteArray_Size(self._raw_name) */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self->__pyx_vtab)->_process_header(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 400, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":399 * cdef Py_ssize_t size * cdef char *buf * if self._has_value: # <<<<<<<<<<<<<< * self._process_header() * */ } /* "aiohttp/_http_parser.pyx":402 * self._process_header() * * size = PyByteArray_Size(self._raw_name) # <<<<<<<<<<<<<< * PyByteArray_Resize(self._raw_name, size + length) * buf = PyByteArray_AsString(self._raw_name) */ __pyx_t_1 = __pyx_v_self->_raw_name; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = PyByteArray_Size(__pyx_t_1); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1L))) __PYX_ERR(0, 402, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_size = __pyx_t_2; /* "aiohttp/_http_parser.pyx":403 * * size = PyByteArray_Size(self._raw_name) * PyByteArray_Resize(self._raw_name, size + length) # <<<<<<<<<<<<<< * buf = PyByteArray_AsString(self._raw_name) * memcpy(buf + size, at, length) */ __pyx_t_1 = __pyx_v_self->_raw_name; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = PyByteArray_Resize(__pyx_t_1, (__pyx_v_size + __pyx_v_length)); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 403, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":404 * size = PyByteArray_Size(self._raw_name) * PyByteArray_Resize(self._raw_name, size + length) * buf = PyByteArray_AsString(self._raw_name) # <<<<<<<<<<<<<< * memcpy(buf + size, at, length) * */ __pyx_t_1 = __pyx_v_self->_raw_name; __Pyx_INCREF(__pyx_t_1); __pyx_v_buf = PyByteArray_AsString(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":405 * PyByteArray_Resize(self._raw_name, size + length) * buf = PyByteArray_AsString(self._raw_name) * memcpy(buf + size, at, length) # <<<<<<<<<<<<<< * * cdef _on_header_value(self, char* at, size_t length): */ (void)(memcpy((__pyx_v_buf + __pyx_v_size), __pyx_v_at, __pyx_v_length)); /* "aiohttp/_http_parser.pyx":396 * self._raw_headers.append((raw_name, raw_value)) * * cdef _on_header_field(self, char* at, size_t length): # <<<<<<<<<<<<<< * cdef Py_ssize_t size * cdef char *buf */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_header_field", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":407 * memcpy(buf + size, at, length) * * cdef _on_header_value(self, char* at, size_t length): # <<<<<<<<<<<<<< * cdef Py_ssize_t size * cdef char *buf */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_value(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, char *__pyx_v_at, size_t __pyx_v_length) { Py_ssize_t __pyx_v_size; char *__pyx_v_buf; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; int __pyx_t_3; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_on_header_value", 1); /* "aiohttp/_http_parser.pyx":411 * cdef char *buf * * size = PyByteArray_Size(self._raw_value) # <<<<<<<<<<<<<< * PyByteArray_Resize(self._raw_value, size + length) * buf = PyByteArray_AsString(self._raw_value) */ __pyx_t_1 = __pyx_v_self->_raw_value; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = PyByteArray_Size(__pyx_t_1); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1L))) __PYX_ERR(0, 411, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_size = __pyx_t_2; /* "aiohttp/_http_parser.pyx":412 * * size = PyByteArray_Size(self._raw_value) * PyByteArray_Resize(self._raw_value, size + length) # <<<<<<<<<<<<<< * buf = PyByteArray_AsString(self._raw_value) * memcpy(buf + size, at, length) */ __pyx_t_1 = __pyx_v_self->_raw_value; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = PyByteArray_Resize(__pyx_t_1, (__pyx_v_size + __pyx_v_length)); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 412, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":413 * size = PyByteArray_Size(self._raw_value) * PyByteArray_Resize(self._raw_value, size + length) * buf = PyByteArray_AsString(self._raw_value) # <<<<<<<<<<<<<< * memcpy(buf + size, at, length) * self._has_value = True */ __pyx_t_1 = __pyx_v_self->_raw_value; __Pyx_INCREF(__pyx_t_1); __pyx_v_buf = PyByteArray_AsString(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":414 * PyByteArray_Resize(self._raw_value, size + length) * buf = PyByteArray_AsString(self._raw_value) * memcpy(buf + size, at, length) # <<<<<<<<<<<<<< * self._has_value = True * */ (void)(memcpy((__pyx_v_buf + __pyx_v_size), __pyx_v_at, __pyx_v_length)); /* "aiohttp/_http_parser.pyx":415 * buf = PyByteArray_AsString(self._raw_value) * memcpy(buf + size, at, length) * self._has_value = True # <<<<<<<<<<<<<< * * cdef _on_headers_complete(self): */ __pyx_v_self->_has_value = 1; /* "aiohttp/_http_parser.pyx":407 * memcpy(buf + size, at, length) * * cdef _on_header_value(self, char* at, size_t length): # <<<<<<<<<<<<<< * cdef Py_ssize_t size * cdef char *buf */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_header_value", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":417 * self._has_value = True * * cdef _on_headers_complete(self): # <<<<<<<<<<<<<< * self._process_header() * */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_headers_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { PyObject *__pyx_v_method = NULL; int __pyx_v_should_close; uint8_t __pyx_v_upgrade; int __pyx_v_chunked; PyObject *__pyx_v_raw_headers = NULL; PyObject *__pyx_v_headers = NULL; PyObject *__pyx_v_encoding = NULL; PyObject *__pyx_v_enc = NULL; PyObject *__pyx_v_msg = NULL; PyObject *__pyx_v_payload = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; uint8_t __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; int __pyx_t_6; int __pyx_t_7; PyObject *__pyx_t_8 = NULL; int __pyx_t_9; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_on_headers_complete", 1); /* "aiohttp/_http_parser.pyx":418 * * cdef _on_headers_complete(self): * self._process_header() # <<<<<<<<<<<<<< * * method = http_method_str(self._cparser.method) */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self->__pyx_vtab)->_process_header(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 418, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":420 * self._process_header() * * method = http_method_str(self._cparser.method) # <<<<<<<<<<<<<< * should_close = not cparser.llhttp_should_keep_alive(self._cparser) * upgrade = self._cparser.upgrade */ __pyx_t_1 = __pyx_f_7aiohttp_12_http_parser_http_method_str(__pyx_v_self->_cparser->method); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 420, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_method = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":421 * * method = http_method_str(self._cparser.method) * should_close = not cparser.llhttp_should_keep_alive(self._cparser) # <<<<<<<<<<<<<< * upgrade = self._cparser.upgrade * chunked = self._cparser.flags & cparser.F_CHUNKED */ __pyx_v_should_close = (!(llhttp_should_keep_alive(__pyx_v_self->_cparser) != 0)); /* "aiohttp/_http_parser.pyx":422 * method = http_method_str(self._cparser.method) * should_close = not cparser.llhttp_should_keep_alive(self._cparser) * upgrade = self._cparser.upgrade # <<<<<<<<<<<<<< * chunked = self._cparser.flags & cparser.F_CHUNKED * */ __pyx_t_2 = __pyx_v_self->_cparser->upgrade; __pyx_v_upgrade = __pyx_t_2; /* "aiohttp/_http_parser.pyx":423 * should_close = not cparser.llhttp_should_keep_alive(self._cparser) * upgrade = self._cparser.upgrade * chunked = self._cparser.flags & cparser.F_CHUNKED # <<<<<<<<<<<<<< * * raw_headers = tuple(self._raw_headers) */ __pyx_v_chunked = (__pyx_v_self->_cparser->flags & F_CHUNKED); /* "aiohttp/_http_parser.pyx":425 * chunked = self._cparser.flags & cparser.F_CHUNKED * * raw_headers = tuple(self._raw_headers) # <<<<<<<<<<<<<< * headers = CIMultiDictProxy(self._headers) * */ if (unlikely(__pyx_v_self->_raw_headers == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(0, 425, __pyx_L1_error) } __pyx_t_1 = PyList_AsTuple(__pyx_v_self->_raw_headers); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 425, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_raw_headers = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":426 * * raw_headers = tuple(self._raw_headers) * headers = CIMultiDictProxy(self._headers) # <<<<<<<<<<<<<< * * if upgrade or self._cparser.method == cparser.HTTP_CONNECT: */ __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy); __pyx_t_3 = __pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy; __pyx_t_4 = NULL; __pyx_t_5 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_5 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_self->_headers}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 426, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __pyx_v_headers = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":428 * headers = CIMultiDictProxy(self._headers) * * if upgrade or self._cparser.method == cparser.HTTP_CONNECT: # <<<<<<<<<<<<<< * self._upgraded = True * */ __pyx_t_7 = (__pyx_v_upgrade != 0); if (!__pyx_t_7) { } else { __pyx_t_6 = __pyx_t_7; goto __pyx_L4_bool_binop_done; } __pyx_t_7 = (__pyx_v_self->_cparser->method == HTTP_CONNECT); __pyx_t_6 = __pyx_t_7; __pyx_L4_bool_binop_done:; if (__pyx_t_6) { /* "aiohttp/_http_parser.pyx":429 * * if upgrade or self._cparser.method == cparser.HTTP_CONNECT: * self._upgraded = True # <<<<<<<<<<<<<< * * # do not support old websocket spec */ __pyx_v_self->_upgraded = 1; /* "aiohttp/_http_parser.pyx":428 * headers = CIMultiDictProxy(self._headers) * * if upgrade or self._cparser.method == cparser.HTTP_CONNECT: # <<<<<<<<<<<<<< * self._upgraded = True * */ } /* "aiohttp/_http_parser.pyx":432 * * # do not support old websocket spec * if SEC_WEBSOCKET_KEY1 in headers: # <<<<<<<<<<<<<< * raise InvalidHeader(SEC_WEBSOCKET_KEY1) * */ __pyx_t_6 = (__Pyx_PySequence_ContainsTF(__pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1, __pyx_v_headers, Py_EQ)); if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 432, __pyx_L1_error) if (unlikely(__pyx_t_6)) { /* "aiohttp/_http_parser.pyx":433 * # do not support old websocket spec * if SEC_WEBSOCKET_KEY1 in headers: * raise InvalidHeader(SEC_WEBSOCKET_KEY1) # <<<<<<<<<<<<<< * * encoding = None */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_InvalidHeader); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 433, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_5 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_5 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 433, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(0, 433, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":432 * * # do not support old websocket spec * if SEC_WEBSOCKET_KEY1 in headers: # <<<<<<<<<<<<<< * raise InvalidHeader(SEC_WEBSOCKET_KEY1) * */ } /* "aiohttp/_http_parser.pyx":435 * raise InvalidHeader(SEC_WEBSOCKET_KEY1) * * encoding = None # <<<<<<<<<<<<<< * enc = self._content_encoding * if enc is not None: */ __Pyx_INCREF(Py_None); __pyx_v_encoding = Py_None; /* "aiohttp/_http_parser.pyx":436 * * encoding = None * enc = self._content_encoding # <<<<<<<<<<<<<< * if enc is not None: * self._content_encoding = None */ __pyx_t_1 = __pyx_v_self->_content_encoding; __Pyx_INCREF(__pyx_t_1); __pyx_v_enc = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":437 * encoding = None * enc = self._content_encoding * if enc is not None: # <<<<<<<<<<<<<< * self._content_encoding = None * enc = enc.lower() */ __pyx_t_6 = (__pyx_v_enc != Py_None); if (__pyx_t_6) { /* "aiohttp/_http_parser.pyx":438 * enc = self._content_encoding * if enc is not None: * self._content_encoding = None # <<<<<<<<<<<<<< * enc = enc.lower() * if enc in ('gzip', 'deflate', 'br'): */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_self->_content_encoding); __Pyx_DECREF(__pyx_v_self->_content_encoding); __pyx_v_self->_content_encoding = ((PyObject*)Py_None); /* "aiohttp/_http_parser.pyx":439 * if enc is not None: * self._content_encoding = None * enc = enc.lower() # <<<<<<<<<<<<<< * if enc in ('gzip', 'deflate', 'br'): * encoding = enc */ __pyx_t_1 = __Pyx_CallUnboundCMethod0(&__pyx_umethod_PyUnicode_Type_lower, __pyx_v_enc); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 439, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF_SET(__pyx_v_enc, __pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":440 * self._content_encoding = None * enc = enc.lower() * if enc in ('gzip', 'deflate', 'br'): # <<<<<<<<<<<<<< * encoding = enc * */ __Pyx_INCREF(__pyx_v_enc); __pyx_t_1 = __pyx_v_enc; __pyx_t_7 = (__Pyx_PyUnicode_Equals(__pyx_t_1, __pyx_n_u_gzip, Py_EQ)); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 440, __pyx_L1_error) if (!__pyx_t_7) { } else { __pyx_t_6 = __pyx_t_7; goto __pyx_L9_bool_binop_done; } __pyx_t_7 = (__Pyx_PyUnicode_Equals(__pyx_t_1, __pyx_n_u_deflate, Py_EQ)); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 440, __pyx_L1_error) if (!__pyx_t_7) { } else { __pyx_t_6 = __pyx_t_7; goto __pyx_L9_bool_binop_done; } __pyx_t_7 = (__Pyx_PyUnicode_Equals(__pyx_t_1, __pyx_n_u_br, Py_EQ)); if (unlikely((__pyx_t_7 < 0))) __PYX_ERR(0, 440, __pyx_L1_error) __pyx_t_6 = __pyx_t_7; __pyx_L9_bool_binop_done:; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_7 = __pyx_t_6; if (__pyx_t_7) { /* "aiohttp/_http_parser.pyx":441 * enc = enc.lower() * if enc in ('gzip', 'deflate', 'br'): * encoding = enc # <<<<<<<<<<<<<< * * if self._cparser.type == cparser.HTTP_REQUEST: */ __Pyx_INCREF(__pyx_v_enc); __Pyx_DECREF_SET(__pyx_v_encoding, __pyx_v_enc); /* "aiohttp/_http_parser.pyx":440 * self._content_encoding = None * enc = enc.lower() * if enc in ('gzip', 'deflate', 'br'): # <<<<<<<<<<<<<< * encoding = enc * */ } /* "aiohttp/_http_parser.pyx":437 * encoding = None * enc = self._content_encoding * if enc is not None: # <<<<<<<<<<<<<< * self._content_encoding = None * enc = enc.lower() */ } /* "aiohttp/_http_parser.pyx":443 * encoding = enc * * if self._cparser.type == cparser.HTTP_REQUEST: # <<<<<<<<<<<<<< * msg = _new_request_message( * method, self._path, */ __pyx_t_7 = (__pyx_v_self->_cparser->type == HTTP_REQUEST); if (__pyx_t_7) { /* "aiohttp/_http_parser.pyx":445 * if self._cparser.type == cparser.HTTP_REQUEST: * msg = _new_request_message( * method, self._path, # <<<<<<<<<<<<<< * self.http_version(), headers, raw_headers, * should_close, encoding, upgrade, chunked, self._url) */ __pyx_t_1 = __pyx_v_self->_path; __Pyx_INCREF(__pyx_t_1); /* "aiohttp/_http_parser.pyx":446 * msg = _new_request_message( * method, self._path, * self.http_version(), headers, raw_headers, # <<<<<<<<<<<<<< * should_close, encoding, upgrade, chunked, self._url) * else: */ __pyx_t_3 = __pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(__pyx_v_self); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 446, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); /* "aiohttp/_http_parser.pyx":447 * method, self._path, * self.http_version(), headers, raw_headers, * should_close, encoding, upgrade, chunked, self._url) # <<<<<<<<<<<<<< * else: * msg = _new_response_message( */ __pyx_t_4 = __pyx_v_self->_url; __Pyx_INCREF(__pyx_t_4); /* "aiohttp/_http_parser.pyx":444 * * if self._cparser.type == cparser.HTTP_REQUEST: * msg = _new_request_message( # <<<<<<<<<<<<<< * method, self._path, * self.http_version(), headers, raw_headers, */ __pyx_t_8 = __pyx_f_7aiohttp_12_http_parser__new_request_message(__pyx_v_method, ((PyObject*)__pyx_t_1), __pyx_t_3, __pyx_v_headers, __pyx_v_raw_headers, __pyx_v_should_close, __pyx_v_encoding, __pyx_v_upgrade, __pyx_v_chunked, __pyx_t_4); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 444, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_msg = __pyx_t_8; __pyx_t_8 = 0; /* "aiohttp/_http_parser.pyx":443 * encoding = enc * * if self._cparser.type == cparser.HTTP_REQUEST: # <<<<<<<<<<<<<< * msg = _new_request_message( * method, self._path, */ goto __pyx_L12; } /* "aiohttp/_http_parser.pyx":449 * should_close, encoding, upgrade, chunked, self._url) * else: * msg = _new_response_message( # <<<<<<<<<<<<<< * self.http_version(), self._cparser.status_code, self._reason, * headers, raw_headers, should_close, encoding, */ /*else*/ { /* "aiohttp/_http_parser.pyx":450 * else: * msg = _new_response_message( * self.http_version(), self._cparser.status_code, self._reason, # <<<<<<<<<<<<<< * headers, raw_headers, should_close, encoding, * upgrade, chunked) */ __pyx_t_8 = __pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(__pyx_v_self); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 450, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_4 = __pyx_v_self->_reason; __Pyx_INCREF(__pyx_t_4); /* "aiohttp/_http_parser.pyx":449 * should_close, encoding, upgrade, chunked, self._url) * else: * msg = _new_response_message( # <<<<<<<<<<<<<< * self.http_version(), self._cparser.status_code, self._reason, * headers, raw_headers, should_close, encoding, */ __pyx_t_3 = __pyx_f_7aiohttp_12_http_parser__new_response_message(__pyx_t_8, __pyx_v_self->_cparser->status_code, ((PyObject*)__pyx_t_4), __pyx_v_headers, __pyx_v_raw_headers, __pyx_v_should_close, __pyx_v_encoding, __pyx_v_upgrade, __pyx_v_chunked); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 449, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_msg = __pyx_t_3; __pyx_t_3 = 0; } __pyx_L12:; /* "aiohttp/_http_parser.pyx":455 * * if ( * ULLONG_MAX > self._cparser.content_length > 0 or chunked or # <<<<<<<<<<<<<< * self._cparser.method == cparser.HTTP_CONNECT or * (self._cparser.status_code >= 199 and */ __pyx_t_6 = (ULLONG_MAX > __pyx_v_self->_cparser->content_length); if (__pyx_t_6) { __pyx_t_6 = (__pyx_v_self->_cparser->content_length > 0); } if (!__pyx_t_6) { } else { __pyx_t_7 = __pyx_t_6; goto __pyx_L14_bool_binop_done; } __pyx_t_6 = (__pyx_v_chunked != 0); if (!__pyx_t_6) { } else { __pyx_t_7 = __pyx_t_6; goto __pyx_L14_bool_binop_done; } /* "aiohttp/_http_parser.pyx":456 * if ( * ULLONG_MAX > self._cparser.content_length > 0 or chunked or * self._cparser.method == cparser.HTTP_CONNECT or # <<<<<<<<<<<<<< * (self._cparser.status_code >= 199 and * self._cparser.content_length == 0 and */ __pyx_t_6 = (__pyx_v_self->_cparser->method == HTTP_CONNECT); if (!__pyx_t_6) { } else { __pyx_t_7 = __pyx_t_6; goto __pyx_L14_bool_binop_done; } /* "aiohttp/_http_parser.pyx":457 * ULLONG_MAX > self._cparser.content_length > 0 or chunked or * self._cparser.method == cparser.HTTP_CONNECT or * (self._cparser.status_code >= 199 and # <<<<<<<<<<<<<< * self._cparser.content_length == 0 and * self._read_until_eof) */ __pyx_t_6 = (__pyx_v_self->_cparser->status_code >= 0xC7); if (__pyx_t_6) { } else { __pyx_t_7 = __pyx_t_6; goto __pyx_L14_bool_binop_done; } /* "aiohttp/_http_parser.pyx":458 * self._cparser.method == cparser.HTTP_CONNECT or * (self._cparser.status_code >= 199 and * self._cparser.content_length == 0 and # <<<<<<<<<<<<<< * self._read_until_eof) * ): */ __pyx_t_6 = (__pyx_v_self->_cparser->content_length == 0); if (__pyx_t_6) { } else { __pyx_t_7 = __pyx_t_6; goto __pyx_L14_bool_binop_done; } /* "aiohttp/_http_parser.pyx":459 * (self._cparser.status_code >= 199 and * self._cparser.content_length == 0 and * self._read_until_eof) # <<<<<<<<<<<<<< * ): * payload = StreamReader( */ __pyx_t_7 = __pyx_v_self->_read_until_eof; __pyx_L14_bool_binop_done:; /* "aiohttp/_http_parser.pyx":454 * upgrade, chunked) * * if ( # <<<<<<<<<<<<<< * ULLONG_MAX > self._cparser.content_length > 0 or chunked or * self._cparser.method == cparser.HTTP_CONNECT or */ if (__pyx_t_7) { /* "aiohttp/_http_parser.pyx":461 * self._read_until_eof) * ): * payload = StreamReader( # <<<<<<<<<<<<<< * self._protocol, timer=self._timer, loop=self._loop, * limit=self._limit) */ __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 461, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_v_self->_protocol); __Pyx_GIVEREF(__pyx_v_self->_protocol); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->_protocol)) __PYX_ERR(0, 461, __pyx_L1_error); /* "aiohttp/_http_parser.pyx":462 * ): * payload = StreamReader( * self._protocol, timer=self._timer, loop=self._loop, # <<<<<<<<<<<<<< * limit=self._limit) * else: */ __pyx_t_4 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 462, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_timer, __pyx_v_self->_timer) < 0) __PYX_ERR(0, 462, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_loop, __pyx_v_self->_loop) < 0) __PYX_ERR(0, 462, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":463 * payload = StreamReader( * self._protocol, timer=self._timer, loop=self._loop, * limit=self._limit) # <<<<<<<<<<<<<< * else: * payload = EMPTY_PAYLOAD */ __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_self->_limit); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 463, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_limit, __pyx_t_8) < 0) __PYX_ERR(0, 462, __pyx_L1_error) __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; /* "aiohttp/_http_parser.pyx":461 * self._read_until_eof) * ): * payload = StreamReader( # <<<<<<<<<<<<<< * self._protocol, timer=self._timer, loop=self._loop, * limit=self._limit) */ __pyx_t_8 = __Pyx_PyObject_Call(__pyx_v_7aiohttp_12_http_parser_StreamReader, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 461, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_payload = __pyx_t_8; __pyx_t_8 = 0; /* "aiohttp/_http_parser.pyx":454 * upgrade, chunked) * * if ( # <<<<<<<<<<<<<< * ULLONG_MAX > self._cparser.content_length > 0 or chunked or * self._cparser.method == cparser.HTTP_CONNECT or */ goto __pyx_L13; } /* "aiohttp/_http_parser.pyx":465 * limit=self._limit) * else: * payload = EMPTY_PAYLOAD # <<<<<<<<<<<<<< * * self._payload = payload */ /*else*/ { __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD); __pyx_v_payload = __pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD; } __pyx_L13:; /* "aiohttp/_http_parser.pyx":467 * payload = EMPTY_PAYLOAD * * self._payload = payload # <<<<<<<<<<<<<< * if encoding is not None and self._auto_decompress: * self._payload = DeflateBuffer(payload, encoding) */ __Pyx_INCREF(__pyx_v_payload); __Pyx_GIVEREF(__pyx_v_payload); __Pyx_GOTREF(__pyx_v_self->_payload); __Pyx_DECREF(__pyx_v_self->_payload); __pyx_v_self->_payload = __pyx_v_payload; /* "aiohttp/_http_parser.pyx":468 * * self._payload = payload * if encoding is not None and self._auto_decompress: # <<<<<<<<<<<<<< * self._payload = DeflateBuffer(payload, encoding) * */ __pyx_t_6 = (__pyx_v_encoding != Py_None); if (__pyx_t_6) { } else { __pyx_t_7 = __pyx_t_6; goto __pyx_L21_bool_binop_done; } __pyx_t_7 = __pyx_v_self->_auto_decompress; __pyx_L21_bool_binop_done:; if (__pyx_t_7) { /* "aiohttp/_http_parser.pyx":469 * self._payload = payload * if encoding is not None and self._auto_decompress: * self._payload = DeflateBuffer(payload, encoding) # <<<<<<<<<<<<<< * * if not self._response_with_body: */ __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_DeflateBuffer); __pyx_t_4 = __pyx_v_7aiohttp_12_http_parser_DeflateBuffer; __pyx_t_3 = NULL; __pyx_t_5 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_4))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); __pyx_t_5 = 1; } } #endif { PyObject *__pyx_callargs[3] = {__pyx_t_3, __pyx_v_payload, __pyx_v_encoding}; __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 469, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __Pyx_GIVEREF(__pyx_t_8); __Pyx_GOTREF(__pyx_v_self->_payload); __Pyx_DECREF(__pyx_v_self->_payload); __pyx_v_self->_payload = __pyx_t_8; __pyx_t_8 = 0; /* "aiohttp/_http_parser.pyx":468 * * self._payload = payload * if encoding is not None and self._auto_decompress: # <<<<<<<<<<<<<< * self._payload = DeflateBuffer(payload, encoding) * */ } /* "aiohttp/_http_parser.pyx":471 * self._payload = DeflateBuffer(payload, encoding) * * if not self._response_with_body: # <<<<<<<<<<<<<< * payload = EMPTY_PAYLOAD * */ __pyx_t_7 = (!__pyx_v_self->_response_with_body); if (__pyx_t_7) { /* "aiohttp/_http_parser.pyx":472 * * if not self._response_with_body: * payload = EMPTY_PAYLOAD # <<<<<<<<<<<<<< * * self._messages.append((msg, payload)) */ __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD); __Pyx_DECREF_SET(__pyx_v_payload, __pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD); /* "aiohttp/_http_parser.pyx":471 * self._payload = DeflateBuffer(payload, encoding) * * if not self._response_with_body: # <<<<<<<<<<<<<< * payload = EMPTY_PAYLOAD * */ } /* "aiohttp/_http_parser.pyx":474 * payload = EMPTY_PAYLOAD * * self._messages.append((msg, payload)) # <<<<<<<<<<<<<< * * cdef _on_message_complete(self): */ if (unlikely(__pyx_v_self->_messages == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append"); __PYX_ERR(0, 474, __pyx_L1_error) } __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 474, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_INCREF(__pyx_v_msg); __Pyx_GIVEREF(__pyx_v_msg); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_msg)) __PYX_ERR(0, 474, __pyx_L1_error); __Pyx_INCREF(__pyx_v_payload); __Pyx_GIVEREF(__pyx_v_payload); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_v_payload)) __PYX_ERR(0, 474, __pyx_L1_error); __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_self->_messages, __pyx_t_8); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(0, 474, __pyx_L1_error) __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; /* "aiohttp/_http_parser.pyx":417 * self._has_value = True * * cdef _on_headers_complete(self): # <<<<<<<<<<<<<< * self._process_header() * */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_headers_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_method); __Pyx_XDECREF(__pyx_v_raw_headers); __Pyx_XDECREF(__pyx_v_headers); __Pyx_XDECREF(__pyx_v_encoding); __Pyx_XDECREF(__pyx_v_enc); __Pyx_XDECREF(__pyx_v_msg); __Pyx_XDECREF(__pyx_v_payload); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":476 * self._messages.append((msg, payload)) * * cdef _on_message_complete(self): # <<<<<<<<<<<<<< * self._payload.feed_eof() * self._payload = None */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_message_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_on_message_complete", 1); /* "aiohttp/_http_parser.pyx":477 * * cdef _on_message_complete(self): * self._payload.feed_eof() # <<<<<<<<<<<<<< * self._payload = None * */ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_payload, __pyx_n_s_feed_eof); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 477, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; __pyx_t_4 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_4 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 477, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":478 * cdef _on_message_complete(self): * self._payload.feed_eof() * self._payload = None # <<<<<<<<<<<<<< * * cdef _on_chunk_header(self): */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_self->_payload); __Pyx_DECREF(__pyx_v_self->_payload); __pyx_v_self->_payload = Py_None; /* "aiohttp/_http_parser.pyx":476 * self._messages.append((msg, payload)) * * cdef _on_message_complete(self): # <<<<<<<<<<<<<< * self._payload.feed_eof() * self._payload = None */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_message_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":480 * self._payload = None * * cdef _on_chunk_header(self): # <<<<<<<<<<<<<< * self._payload.begin_http_chunk_receiving() * */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_header(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_on_chunk_header", 1); /* "aiohttp/_http_parser.pyx":481 * * cdef _on_chunk_header(self): * self._payload.begin_http_chunk_receiving() # <<<<<<<<<<<<<< * * cdef _on_chunk_complete(self): */ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_payload, __pyx_n_s_begin_http_chunk_receiving); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 481, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; __pyx_t_4 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_4 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 481, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":480 * self._payload = None * * cdef _on_chunk_header(self): # <<<<<<<<<<<<<< * self._payload.begin_http_chunk_receiving() * */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_chunk_header", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":483 * self._payload.begin_http_chunk_receiving() * * cdef _on_chunk_complete(self): # <<<<<<<<<<<<<< * self._payload.end_http_chunk_receiving() * */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_on_chunk_complete", 1); /* "aiohttp/_http_parser.pyx":484 * * cdef _on_chunk_complete(self): * self._payload.end_http_chunk_receiving() # <<<<<<<<<<<<<< * * cdef object _on_status_complete(self): */ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_payload, __pyx_n_s_end_http_chunk_receiving); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 484, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; __pyx_t_4 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_4 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 484, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":483 * self._payload.begin_http_chunk_receiving() * * cdef _on_chunk_complete(self): # <<<<<<<<<<<<<< * self._payload.end_http_chunk_receiving() * */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_chunk_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":486 * self._payload.end_http_chunk_receiving() * * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< * pass * */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_status_complete(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_on_status_complete", 1); /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":489 * pass * * cdef inline http_version(self): # <<<<<<<<<<<<<< * cdef cparser.llhttp_t* parser = self._cparser * */ static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { llhttp_t *__pyx_v_parser; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations llhttp_t *__pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; int __pyx_t_8; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("http_version", 1); /* "aiohttp/_http_parser.pyx":490 * * cdef inline http_version(self): * cdef cparser.llhttp_t* parser = self._cparser # <<<<<<<<<<<<<< * * if parser.http_major == 1: */ __pyx_t_1 = __pyx_v_self->_cparser; __pyx_v_parser = __pyx_t_1; /* "aiohttp/_http_parser.pyx":492 * cdef cparser.llhttp_t* parser = self._cparser * * if parser.http_major == 1: # <<<<<<<<<<<<<< * if parser.http_minor == 0: * return HttpVersion10 */ __pyx_t_2 = (__pyx_v_parser->http_major == 1); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":493 * * if parser.http_major == 1: * if parser.http_minor == 0: # <<<<<<<<<<<<<< * return HttpVersion10 * elif parser.http_minor == 1: */ switch (__pyx_v_parser->http_minor) { case 0: /* "aiohttp/_http_parser.pyx":494 * if parser.http_major == 1: * if parser.http_minor == 0: * return HttpVersion10 # <<<<<<<<<<<<<< * elif parser.http_minor == 1: * return HttpVersion11 */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion10); __pyx_r = __pyx_v_7aiohttp_12_http_parser_HttpVersion10; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":493 * * if parser.http_major == 1: * if parser.http_minor == 0: # <<<<<<<<<<<<<< * return HttpVersion10 * elif parser.http_minor == 1: */ break; case 1: /* "aiohttp/_http_parser.pyx":496 * return HttpVersion10 * elif parser.http_minor == 1: * return HttpVersion11 # <<<<<<<<<<<<<< * * return HttpVersion(parser.http_major, parser.http_minor) */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion11); __pyx_r = __pyx_v_7aiohttp_12_http_parser_HttpVersion11; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":495 * if parser.http_minor == 0: * return HttpVersion10 * elif parser.http_minor == 1: # <<<<<<<<<<<<<< * return HttpVersion11 * */ break; default: break; } /* "aiohttp/_http_parser.pyx":492 * cdef cparser.llhttp_t* parser = self._cparser * * if parser.http_major == 1: # <<<<<<<<<<<<<< * if parser.http_minor == 0: * return HttpVersion10 */ } /* "aiohttp/_http_parser.pyx":498 * return HttpVersion11 * * return HttpVersion(parser.http_major, parser.http_minor) # <<<<<<<<<<<<<< * * ### Public API ### */ __Pyx_XDECREF(__pyx_r); __pyx_t_4 = __Pyx_PyInt_From_uint8_t(__pyx_v_parser->http_major); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 498, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = __Pyx_PyInt_From_uint8_t(__pyx_v_parser->http_minor); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 498, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion); __pyx_t_6 = __pyx_v_7aiohttp_12_http_parser_HttpVersion; __pyx_t_7 = NULL; __pyx_t_8 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_6))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); __Pyx_INCREF(__pyx_t_7); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_6, function); __pyx_t_8 = 1; } } #endif { PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_t_4, __pyx_t_5}; __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 2+__pyx_t_8); __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 498, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":489 * pass * * cdef inline http_version(self): # <<<<<<<<<<<<<< * cdef cparser.llhttp_t* parser = self._cparser * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.http_version", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":502 * ### Public API ### * * def feed_eof(self): # <<<<<<<<<<<<<< * cdef bytes desc * */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_5feed_eof(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_10HttpParser_5feed_eof = {"feed_eof", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_5feed_eof, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_5feed_eof(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("feed_eof (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); if (unlikely(__pyx_nargs > 0)) { __Pyx_RaiseArgtupleInvalid("feed_eof", 1, 0, 0, __pyx_nargs); return NULL;} if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "feed_eof", 0))) return NULL; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_4feed_eof(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_4feed_eof(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { PyObject *__pyx_v_desc = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("feed_eof", 1); /* "aiohttp/_http_parser.pyx":505 * cdef bytes desc * * if self._payload is not None: # <<<<<<<<<<<<<< * if self._cparser.flags & cparser.F_CHUNKED: * raise TransferEncodingError( */ __pyx_t_1 = (__pyx_v_self->_payload != Py_None); if (__pyx_t_1) { /* "aiohttp/_http_parser.pyx":506 * * if self._payload is not None: * if self._cparser.flags & cparser.F_CHUNKED: # <<<<<<<<<<<<<< * raise TransferEncodingError( * "Not enough data for satisfy transfer length header.") */ __pyx_t_1 = ((__pyx_v_self->_cparser->flags & F_CHUNKED) != 0); if (unlikely(__pyx_t_1)) { /* "aiohttp/_http_parser.pyx":507 * if self._payload is not None: * if self._cparser.flags & cparser.F_CHUNKED: * raise TransferEncodingError( # <<<<<<<<<<<<<< * "Not enough data for satisfy transfer length header.") * elif self._cparser.flags & cparser.F_CONTENT_LENGTH: */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_TransferEncodingError); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 507, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_5 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_5 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_kp_u_Not_enough_data_for_satisfy_tran}; __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 507, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __PYX_ERR(0, 507, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":506 * * if self._payload is not None: * if self._cparser.flags & cparser.F_CHUNKED: # <<<<<<<<<<<<<< * raise TransferEncodingError( * "Not enough data for satisfy transfer length header.") */ } /* "aiohttp/_http_parser.pyx":509 * raise TransferEncodingError( * "Not enough data for satisfy transfer length header.") * elif self._cparser.flags & cparser.F_CONTENT_LENGTH: # <<<<<<<<<<<<<< * raise ContentLengthError( * "Not enough data for satisfy content length header.") */ __pyx_t_1 = ((__pyx_v_self->_cparser->flags & F_CONTENT_LENGTH) != 0); if (unlikely(__pyx_t_1)) { /* "aiohttp/_http_parser.pyx":510 * "Not enough data for satisfy transfer length header.") * elif self._cparser.flags & cparser.F_CONTENT_LENGTH: * raise ContentLengthError( # <<<<<<<<<<<<<< * "Not enough data for satisfy content length header.") * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_ContentLengthError); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 510, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_5 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_5 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_kp_u_Not_enough_data_for_satisfy_cont}; __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 510, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __PYX_ERR(0, 510, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":509 * raise TransferEncodingError( * "Not enough data for satisfy transfer length header.") * elif self._cparser.flags & cparser.F_CONTENT_LENGTH: # <<<<<<<<<<<<<< * raise ContentLengthError( * "Not enough data for satisfy content length header.") */ } /* "aiohttp/_http_parser.pyx":512 * raise ContentLengthError( * "Not enough data for satisfy content length header.") * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: # <<<<<<<<<<<<<< * desc = cparser.llhttp_get_error_reason(self._cparser) * raise PayloadEncodingError(desc.decode('latin-1')) */ __pyx_t_1 = (llhttp_get_errno(__pyx_v_self->_cparser) != HPE_OK); if (unlikely(__pyx_t_1)) { /* "aiohttp/_http_parser.pyx":513 * "Not enough data for satisfy content length header.") * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: * desc = cparser.llhttp_get_error_reason(self._cparser) # <<<<<<<<<<<<<< * raise PayloadEncodingError(desc.decode('latin-1')) * else: */ __pyx_t_2 = __Pyx_PyBytes_FromString(llhttp_get_error_reason(__pyx_v_self->_cparser)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 513, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_v_desc = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":514 * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: * desc = cparser.llhttp_get_error_reason(self._cparser) * raise PayloadEncodingError(desc.decode('latin-1')) # <<<<<<<<<<<<<< * else: * self._payload.feed_eof() */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_PayloadEncodingError); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 514, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_decode_bytes(__pyx_v_desc, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeLatin1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 514, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_6 = NULL; __pyx_t_5 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_6)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_6); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_5 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_t_4}; __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 514, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __PYX_ERR(0, 514, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":512 * raise ContentLengthError( * "Not enough data for satisfy content length header.") * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: # <<<<<<<<<<<<<< * desc = cparser.llhttp_get_error_reason(self._cparser) * raise PayloadEncodingError(desc.decode('latin-1')) */ } /* "aiohttp/_http_parser.pyx":516 * raise PayloadEncodingError(desc.decode('latin-1')) * else: * self._payload.feed_eof() # <<<<<<<<<<<<<< * elif self._started: * self._on_headers_complete() */ /*else*/ { __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_payload, __pyx_n_s_feed_eof); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 516, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_5 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_5 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL}; __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 516, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } /* "aiohttp/_http_parser.pyx":505 * cdef bytes desc * * if self._payload is not None: # <<<<<<<<<<<<<< * if self._cparser.flags & cparser.F_CHUNKED: * raise TransferEncodingError( */ goto __pyx_L3; } /* "aiohttp/_http_parser.pyx":517 * else: * self._payload.feed_eof() * elif self._started: # <<<<<<<<<<<<<< * self._on_headers_complete() * if self._messages: */ if (__pyx_v_self->_started) { /* "aiohttp/_http_parser.pyx":518 * self._payload.feed_eof() * elif self._started: * self._on_headers_complete() # <<<<<<<<<<<<<< * if self._messages: * return self._messages[-1][0] */ __pyx_t_2 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self->__pyx_vtab)->_on_headers_complete(__pyx_v_self); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 518, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":519 * elif self._started: * self._on_headers_complete() * if self._messages: # <<<<<<<<<<<<<< * return self._messages[-1][0] * */ __pyx_t_1 = (__pyx_v_self->_messages != Py_None)&&(PyList_GET_SIZE(__pyx_v_self->_messages) != 0); if (__pyx_t_1) { /* "aiohttp/_http_parser.pyx":520 * self._on_headers_complete() * if self._messages: * return self._messages[-1][0] # <<<<<<<<<<<<<< * * def feed_data(self, data): */ __Pyx_XDECREF(__pyx_r); if (unlikely(__pyx_v_self->_messages == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 520, __pyx_L1_error) } __pyx_t_2 = __Pyx_GetItemInt_List(__pyx_v_self->_messages, -1L, long, 1, __Pyx_PyInt_From_long, 1, 1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 520, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_2, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 520, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":519 * elif self._started: * self._on_headers_complete() * if self._messages: # <<<<<<<<<<<<<< * return self._messages[-1][0] * */ } /* "aiohttp/_http_parser.pyx":517 * else: * self._payload.feed_eof() * elif self._started: # <<<<<<<<<<<<<< * self._on_headers_complete() * if self._messages: */ } __pyx_L3:; /* "aiohttp/_http_parser.pyx":502 * ### Public API ### * * def feed_eof(self): # <<<<<<<<<<<<<< * cdef bytes desc * */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.feed_eof", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_desc); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":522 * return self._messages[-1][0] * * def feed_data(self, data): # <<<<<<<<<<<<<< * cdef: * size_t data_len */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_7feed_data(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_10HttpParser_7feed_data = {"feed_data", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_7feed_data, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_7feed_data(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { PyObject *__pyx_v_data = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[1] = {0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("feed_data (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_data,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_data)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 522, __pyx_L3_error) else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "feed_data") < 0)) __PYX_ERR(0, 522, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 1)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); } __pyx_v_data = values[0]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("feed_data", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 522, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.feed_data", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_6feed_data(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), __pyx_v_data); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_6feed_data(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, PyObject *__pyx_v_data) { size_t __pyx_v_data_len; size_t __pyx_v_nb; llhttp_errno_t __pyx_v_errno; PyObject *__pyx_v_ex = NULL; char const *__pyx_v_after; PyObject *__pyx_v_before = NULL; PyObject *__pyx_v_after_b = NULL; PyObject *__pyx_v_pointer = NULL; PyObject *__pyx_v_messages = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; Py_ssize_t __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("feed_data", 0); __Pyx_INCREF(__pyx_v_data); /* "aiohttp/_http_parser.pyx":528 * cdef cparser.llhttp_errno_t errno * * PyObject_GetBuffer(data, &self.py_buf, PyBUF_SIMPLE) # <<<<<<<<<<<<<< * data_len = self.py_buf.len * */ __pyx_t_1 = PyObject_GetBuffer(__pyx_v_data, (&__pyx_v_self->py_buf), PyBUF_SIMPLE); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 528, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":529 * * PyObject_GetBuffer(data, &self.py_buf, PyBUF_SIMPLE) * data_len = self.py_buf.len # <<<<<<<<<<<<<< * * errno = cparser.llhttp_execute( */ __pyx_v_data_len = ((size_t)__pyx_v_self->py_buf.len); /* "aiohttp/_http_parser.pyx":531 * data_len = self.py_buf.len * * errno = cparser.llhttp_execute( # <<<<<<<<<<<<<< * self._cparser, * self.py_buf.buf, */ __pyx_v_errno = llhttp_execute(__pyx_v_self->_cparser, ((char *)__pyx_v_self->py_buf.buf), __pyx_v_data_len); /* "aiohttp/_http_parser.pyx":536 * data_len) * * if errno is cparser.HPE_PAUSED_UPGRADE: # <<<<<<<<<<<<<< * cparser.llhttp_resume_after_upgrade(self._cparser) * */ __pyx_t_2 = (__pyx_v_errno == HPE_PAUSED_UPGRADE); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":537 * * if errno is cparser.HPE_PAUSED_UPGRADE: * cparser.llhttp_resume_after_upgrade(self._cparser) # <<<<<<<<<<<<<< * * nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf */ llhttp_resume_after_upgrade(__pyx_v_self->_cparser); /* "aiohttp/_http_parser.pyx":539 * cparser.llhttp_resume_after_upgrade(self._cparser) * * nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf # <<<<<<<<<<<<<< * * PyBuffer_Release(&self.py_buf) */ __pyx_v_nb = (llhttp_get_error_pos(__pyx_v_self->_cparser) - ((char *)__pyx_v_self->py_buf.buf)); /* "aiohttp/_http_parser.pyx":536 * data_len) * * if errno is cparser.HPE_PAUSED_UPGRADE: # <<<<<<<<<<<<<< * cparser.llhttp_resume_after_upgrade(self._cparser) * */ } /* "aiohttp/_http_parser.pyx":541 * nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf * * PyBuffer_Release(&self.py_buf) # <<<<<<<<<<<<<< * * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): */ PyBuffer_Release((&__pyx_v_self->py_buf)); /* "aiohttp/_http_parser.pyx":543 * PyBuffer_Release(&self.py_buf) * * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): # <<<<<<<<<<<<<< * if self._payload_error == 0: * if self._last_error is not None: */ switch (__pyx_v_errno) { case HPE_OK: case HPE_PAUSED_UPGRADE: __pyx_t_2 = 0; break; default: __pyx_t_2 = 1; break; } __pyx_t_3 = __pyx_t_2; if (__pyx_t_3) { /* "aiohttp/_http_parser.pyx":544 * * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): * if self._payload_error == 0: # <<<<<<<<<<<<<< * if self._last_error is not None: * ex = self._last_error */ __pyx_t_3 = (__pyx_v_self->_payload_error == 0); if (__pyx_t_3) { /* "aiohttp/_http_parser.pyx":545 * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): * if self._payload_error == 0: * if self._last_error is not None: # <<<<<<<<<<<<<< * ex = self._last_error * self._last_error = None */ __pyx_t_3 = (__pyx_v_self->_last_error != Py_None); if (__pyx_t_3) { /* "aiohttp/_http_parser.pyx":546 * if self._payload_error == 0: * if self._last_error is not None: * ex = self._last_error # <<<<<<<<<<<<<< * self._last_error = None * else: */ __pyx_t_4 = __pyx_v_self->_last_error; __Pyx_INCREF(__pyx_t_4); __pyx_v_ex = __pyx_t_4; __pyx_t_4 = 0; /* "aiohttp/_http_parser.pyx":547 * if self._last_error is not None: * ex = self._last_error * self._last_error = None # <<<<<<<<<<<<<< * else: * after = cparser.llhttp_get_error_pos(self._cparser) */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_self->_last_error); __Pyx_DECREF(__pyx_v_self->_last_error); __pyx_v_self->_last_error = Py_None; /* "aiohttp/_http_parser.pyx":545 * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): * if self._payload_error == 0: * if self._last_error is not None: # <<<<<<<<<<<<<< * ex = self._last_error * self._last_error = None */ goto __pyx_L6; } /* "aiohttp/_http_parser.pyx":549 * self._last_error = None * else: * after = cparser.llhttp_get_error_pos(self._cparser) # <<<<<<<<<<<<<< * before = data[:after - self.py_buf.buf] * after_b = after.split(b"\r\n", 1)[0] */ /*else*/ { __pyx_v_after = llhttp_get_error_pos(__pyx_v_self->_cparser); /* "aiohttp/_http_parser.pyx":550 * else: * after = cparser.llhttp_get_error_pos(self._cparser) * before = data[:after - self.py_buf.buf] # <<<<<<<<<<<<<< * after_b = after.split(b"\r\n", 1)[0] * before = before.rsplit(b"\r\n", 1)[-1] */ __pyx_t_4 = __Pyx_PyObject_GetSlice(__pyx_v_data, 0, (__pyx_v_after - ((char *)__pyx_v_self->py_buf.buf)), NULL, NULL, NULL, 0, 1, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 550, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_v_before = __pyx_t_4; __pyx_t_4 = 0; /* "aiohttp/_http_parser.pyx":551 * after = cparser.llhttp_get_error_pos(self._cparser) * before = data[:after - self.py_buf.buf] * after_b = after.split(b"\r\n", 1)[0] # <<<<<<<<<<<<<< * before = before.rsplit(b"\r\n", 1)[-1] * data = before + after_b */ __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_after); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 551, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_split); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 551, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 551, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_4, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 551, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_after_b = __pyx_t_5; __pyx_t_5 = 0; /* "aiohttp/_http_parser.pyx":552 * before = data[:after - self.py_buf.buf] * after_b = after.split(b"\r\n", 1)[0] * before = before.rsplit(b"\r\n", 1)[-1] # <<<<<<<<<<<<<< * data = before + after_b * pointer = " " * (len(repr(before))-1) + "^" */ __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_before, __pyx_n_s_rsplit); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 552, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 552, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_4, -1L, long, 1, __Pyx_PyInt_From_long, 0, 1, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 552, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF_SET(__pyx_v_before, __pyx_t_5); __pyx_t_5 = 0; /* "aiohttp/_http_parser.pyx":553 * after_b = after.split(b"\r\n", 1)[0] * before = before.rsplit(b"\r\n", 1)[-1] * data = before + after_b # <<<<<<<<<<<<<< * pointer = " " * (len(repr(before))-1) + "^" * ex = parser_error_from_errno(self._cparser, data, pointer) */ __pyx_t_5 = PyNumber_Add(__pyx_v_before, __pyx_v_after_b); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 553, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF_SET(__pyx_v_data, __pyx_t_5); __pyx_t_5 = 0; /* "aiohttp/_http_parser.pyx":554 * before = before.rsplit(b"\r\n", 1)[-1] * data = before + after_b * pointer = " " * (len(repr(before))-1) + "^" # <<<<<<<<<<<<<< * ex = parser_error_from_errno(self._cparser, data, pointer) * self._payload = None */ __pyx_t_5 = PyObject_Repr(__pyx_v_before); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 554, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == ((Py_ssize_t)-1))) __PYX_ERR(0, 554, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PySequence_Multiply(__pyx_kp_u__6, (__pyx_t_6 - 1)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 554, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_4 = __Pyx_PyUnicode_ConcatInPlace(__pyx_t_5, __pyx_kp_u__7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 554, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_pointer = ((PyObject*)__pyx_t_4); __pyx_t_4 = 0; /* "aiohttp/_http_parser.pyx":555 * data = before + after_b * pointer = " " * (len(repr(before))-1) + "^" * ex = parser_error_from_errno(self._cparser, data, pointer) # <<<<<<<<<<<<<< * self._payload = None * raise ex */ __pyx_t_4 = __pyx_f_7aiohttp_12_http_parser_parser_error_from_errno(__pyx_v_self->_cparser, __pyx_v_data, __pyx_v_pointer); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 555, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_v_ex = __pyx_t_4; __pyx_t_4 = 0; } __pyx_L6:; /* "aiohttp/_http_parser.pyx":556 * pointer = " " * (len(repr(before))-1) + "^" * ex = parser_error_from_errno(self._cparser, data, pointer) * self._payload = None # <<<<<<<<<<<<<< * raise ex * */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_self->_payload); __Pyx_DECREF(__pyx_v_self->_payload); __pyx_v_self->_payload = Py_None; /* "aiohttp/_http_parser.pyx":557 * ex = parser_error_from_errno(self._cparser, data, pointer) * self._payload = None * raise ex # <<<<<<<<<<<<<< * * if self._messages: */ __Pyx_Raise(__pyx_v_ex, 0, 0, 0); __PYX_ERR(0, 557, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":544 * * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): * if self._payload_error == 0: # <<<<<<<<<<<<<< * if self._last_error is not None: * ex = self._last_error */ } /* "aiohttp/_http_parser.pyx":543 * PyBuffer_Release(&self.py_buf) * * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): # <<<<<<<<<<<<<< * if self._payload_error == 0: * if self._last_error is not None: */ } /* "aiohttp/_http_parser.pyx":559 * raise ex * * if self._messages: # <<<<<<<<<<<<<< * messages = self._messages * self._messages = [] */ __pyx_t_3 = (__pyx_v_self->_messages != Py_None)&&(PyList_GET_SIZE(__pyx_v_self->_messages) != 0); if (__pyx_t_3) { /* "aiohttp/_http_parser.pyx":560 * * if self._messages: * messages = self._messages # <<<<<<<<<<<<<< * self._messages = [] * else: */ __pyx_t_4 = __pyx_v_self->_messages; __Pyx_INCREF(__pyx_t_4); __pyx_v_messages = __pyx_t_4; __pyx_t_4 = 0; /* "aiohttp/_http_parser.pyx":561 * if self._messages: * messages = self._messages * self._messages = [] # <<<<<<<<<<<<<< * else: * messages = () */ __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 561, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __Pyx_GOTREF(__pyx_v_self->_messages); __Pyx_DECREF(__pyx_v_self->_messages); __pyx_v_self->_messages = ((PyObject*)__pyx_t_4); __pyx_t_4 = 0; /* "aiohttp/_http_parser.pyx":559 * raise ex * * if self._messages: # <<<<<<<<<<<<<< * messages = self._messages * self._messages = [] */ goto __pyx_L7; } /* "aiohttp/_http_parser.pyx":563 * self._messages = [] * else: * messages = () # <<<<<<<<<<<<<< * * if self._upgraded: */ /*else*/ { __Pyx_INCREF(__pyx_empty_tuple); __pyx_v_messages = __pyx_empty_tuple; } __pyx_L7:; /* "aiohttp/_http_parser.pyx":565 * messages = () * * if self._upgraded: # <<<<<<<<<<<<<< * return messages, True, data[nb:] * else: */ if (__pyx_v_self->_upgraded) { /* "aiohttp/_http_parser.pyx":566 * * if self._upgraded: * return messages, True, data[nb:] # <<<<<<<<<<<<<< * else: * return messages, False, b'' */ __Pyx_XDECREF(__pyx_r); __pyx_t_4 = __Pyx_PyObject_GetSlice(__pyx_v_data, __pyx_v_nb, 0, NULL, NULL, NULL, 1, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 566, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 566, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(__pyx_v_messages); __Pyx_GIVEREF(__pyx_v_messages); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_messages)) __PYX_ERR(0, 566, __pyx_L1_error); __Pyx_INCREF(Py_True); __Pyx_GIVEREF(Py_True); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, Py_True)) __PYX_ERR(0, 566, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_4); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_4)) __PYX_ERR(0, 566, __pyx_L1_error); __pyx_t_4 = 0; __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":565 * messages = () * * if self._upgraded: # <<<<<<<<<<<<<< * return messages, True, data[nb:] * else: */ } /* "aiohttp/_http_parser.pyx":568 * return messages, True, data[nb:] * else: * return messages, False, b'' # <<<<<<<<<<<<<< * * def set_upgraded(self, val): */ /*else*/ { __Pyx_XDECREF(__pyx_r); __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 568, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(__pyx_v_messages); __Pyx_GIVEREF(__pyx_v_messages); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_messages)) __PYX_ERR(0, 568, __pyx_L1_error); __Pyx_INCREF(Py_False); __Pyx_GIVEREF(Py_False); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, Py_False)) __PYX_ERR(0, 568, __pyx_L1_error); __Pyx_INCREF(__pyx_kp_b__8); __Pyx_GIVEREF(__pyx_kp_b__8); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_kp_b__8)) __PYX_ERR(0, 568, __pyx_L1_error); __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":522 * return self._messages[-1][0] * * def feed_data(self, data): # <<<<<<<<<<<<<< * cdef: * size_t data_len */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.feed_data", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_ex); __Pyx_XDECREF(__pyx_v_before); __Pyx_XDECREF(__pyx_v_after_b); __Pyx_XDECREF(__pyx_v_pointer); __Pyx_XDECREF(__pyx_v_messages); __Pyx_XDECREF(__pyx_v_data); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":570 * return messages, False, b'' * * def set_upgraded(self, val): # <<<<<<<<<<<<<< * self._upgraded = val * */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_9set_upgraded(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_10HttpParser_9set_upgraded = {"set_upgraded", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_9set_upgraded, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_9set_upgraded(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { PyObject *__pyx_v_val = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[1] = {0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_upgraded (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_val,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_val)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 570, __pyx_L3_error) else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "set_upgraded") < 0)) __PYX_ERR(0, 570, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 1)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); } __pyx_v_val = values[0]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("set_upgraded", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 570, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.set_upgraded", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_8set_upgraded(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), __pyx_v_val); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_8set_upgraded(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, PyObject *__pyx_v_val) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_upgraded", 1); /* "aiohttp/_http_parser.pyx":571 * * def set_upgraded(self, val): * self._upgraded = val # <<<<<<<<<<<<<< * * */ __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_val); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 571, __pyx_L1_error) __pyx_v_self->_upgraded = __pyx_t_1; /* "aiohttp/_http_parser.pyx":570 * return messages, False, b'' * * def set_upgraded(self, val): # <<<<<<<<<<<<<< * self._upgraded = val * */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.set_upgraded", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_11__reduce_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_10HttpParser_11__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_11__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_11__reduce_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); if (unlikely(__pyx_nargs > 0)) { __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_10__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_10__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 1); /* "(tree fragment)":2 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); __PYX_ERR(1, 2, __pyx_L1_error) /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): */ /* function exit code */ __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_13__setstate_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_10HttpParser_13__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_13__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_13__setstate_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[1] = {0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 1)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); } __pyx_v___pyx_state = values[0]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_12__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), __pyx_v___pyx_state); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_12__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 1); /* "(tree fragment)":4 * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< */ __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); __PYX_ERR(1, 4, __pyx_L1_error) /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ /* function exit code */ __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":576 * cdef class HttpRequestParser(HttpParser): * * def __init__( # <<<<<<<<<<<<<< * self, protocol, loop, int limit, timer=None, * size_t max_line_size=8190, size_t max_headers=32768, */ /* Python wrapper */ static int __pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_protocol = 0; PyObject *__pyx_v_loop = 0; int __pyx_v_limit; PyObject *__pyx_v_timer = 0; size_t __pyx_v_max_line_size; size_t __pyx_v_max_headers; size_t __pyx_v_max_field_size; PyObject *__pyx_v_payload_exception = 0; int __pyx_v_response_with_body; int __pyx_v_read_until_eof; int __pyx_v_auto_decompress; CYTHON_UNUSED Py_ssize_t __pyx_nargs; CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; #endif __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_protocol,&__pyx_n_s_loop,&__pyx_n_s_limit,&__pyx_n_s_timer,&__pyx_n_s_max_line_size,&__pyx_n_s_max_headers,&__pyx_n_s_max_field_size,&__pyx_n_s_payload_exception,&__pyx_n_s_response_with_body,&__pyx_n_s_read_until_eof,&__pyx_n_s_auto_decompress,0}; /* "aiohttp/_http_parser.pyx":577 * * def __init__( * self, protocol, loop, int limit, timer=None, # <<<<<<<<<<<<<< * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, */ values[3] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)Py_None)); /* "aiohttp/_http_parser.pyx":579 * self, protocol, loop, int limit, timer=None, * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, # <<<<<<<<<<<<<< * bint response_with_body=True, bint read_until_eof=False, * bint auto_decompress=True, */ values[7] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)Py_None)); if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 11: values[10] = __Pyx_Arg_VARARGS(__pyx_args, 10); CYTHON_FALLTHROUGH; case 10: values[9] = __Pyx_Arg_VARARGS(__pyx_args, 9); CYTHON_FALLTHROUGH; case 9: values[8] = __Pyx_Arg_VARARGS(__pyx_args, 8); CYTHON_FALLTHROUGH; case 8: values[7] = __Pyx_Arg_VARARGS(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = __Pyx_Arg_VARARGS(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_protocol)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 576, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[1]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 576, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, 1); __PYX_ERR(0, 576, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_limit)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[2]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 576, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, 2); __PYX_ERR(0, 576, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_timer); if (value) { values[3] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 576, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_max_line_size); if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 576, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_max_headers); if (value) { values[5] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 576, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 6: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_max_field_size); if (value) { values[6] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 576, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 7: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_payload_exception); if (value) { values[7] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 576, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 8: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_response_with_body); if (value) { values[8] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 576, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 9: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_read_until_eof); if (value) { values[9] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 576, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 10: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_auto_decompress); if (value) { values[10] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 576, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 576, __pyx_L3_error) } } else { switch (__pyx_nargs) { case 11: values[10] = __Pyx_Arg_VARARGS(__pyx_args, 10); CYTHON_FALLTHROUGH; case 10: values[9] = __Pyx_Arg_VARARGS(__pyx_args, 9); CYTHON_FALLTHROUGH; case 9: values[8] = __Pyx_Arg_VARARGS(__pyx_args, 8); CYTHON_FALLTHROUGH; case 8: values[7] = __Pyx_Arg_VARARGS(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = __Pyx_Arg_VARARGS(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); break; default: goto __pyx_L5_argtuple_error; } } __pyx_v_protocol = values[0]; __pyx_v_loop = values[1]; __pyx_v_limit = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_limit == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 577, __pyx_L3_error) __pyx_v_timer = values[3]; if (values[4]) { __pyx_v_max_line_size = __Pyx_PyInt_As_size_t(values[4]); if (unlikely((__pyx_v_max_line_size == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 578, __pyx_L3_error) } else { __pyx_v_max_line_size = ((size_t)0x1FFE); } if (values[5]) { __pyx_v_max_headers = __Pyx_PyInt_As_size_t(values[5]); if (unlikely((__pyx_v_max_headers == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 578, __pyx_L3_error) } else { __pyx_v_max_headers = ((size_t)0x8000); } if (values[6]) { __pyx_v_max_field_size = __Pyx_PyInt_As_size_t(values[6]); if (unlikely((__pyx_v_max_field_size == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 579, __pyx_L3_error) } else { __pyx_v_max_field_size = ((size_t)0x1FFE); } __pyx_v_payload_exception = values[7]; if (values[8]) { __pyx_v_response_with_body = __Pyx_PyObject_IsTrue(values[8]); if (unlikely((__pyx_v_response_with_body == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 580, __pyx_L3_error) } else { /* "aiohttp/_http_parser.pyx":580 * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, * bint response_with_body=True, bint read_until_eof=False, # <<<<<<<<<<<<<< * bint auto_decompress=True, * ): */ __pyx_v_response_with_body = ((int)1); } if (values[9]) { __pyx_v_read_until_eof = __Pyx_PyObject_IsTrue(values[9]); if (unlikely((__pyx_v_read_until_eof == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 580, __pyx_L3_error) } else { __pyx_v_read_until_eof = ((int)0); } if (values[10]) { __pyx_v_auto_decompress = __Pyx_PyObject_IsTrue(values[10]); if (unlikely((__pyx_v_auto_decompress == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 581, __pyx_L3_error) } else { /* "aiohttp/_http_parser.pyx":581 * size_t max_field_size=8190, payload_exception=None, * bint response_with_body=True, bint read_until_eof=False, * bint auto_decompress=True, # <<<<<<<<<<<<<< * ): * self._init(cparser.HTTP_REQUEST, protocol, loop, limit, timer, */ __pyx_v_auto_decompress = ((int)1); } } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, __pyx_nargs); __PYX_ERR(0, 576, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser___init__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *)__pyx_v_self), __pyx_v_protocol, __pyx_v_loop, __pyx_v_limit, __pyx_v_timer, __pyx_v_max_line_size, __pyx_v_max_headers, __pyx_v_max_field_size, __pyx_v_payload_exception, __pyx_v_response_with_body, __pyx_v_read_until_eof, __pyx_v_auto_decompress); /* "aiohttp/_http_parser.pyx":576 * cdef class HttpRequestParser(HttpParser): * * def __init__( # <<<<<<<<<<<<<< * self, protocol, loop, int limit, timer=None, * size_t max_line_size=8190, size_t max_headers=32768, */ /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser___init__(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self, PyObject *__pyx_v_protocol, PyObject *__pyx_v_loop, int __pyx_v_limit, PyObject *__pyx_v_timer, size_t __pyx_v_max_line_size, size_t __pyx_v_max_headers, size_t __pyx_v_max_field_size, PyObject *__pyx_v_payload_exception, int __pyx_v_response_with_body, int __pyx_v_read_until_eof, int __pyx_v_auto_decompress) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init __pyx_t_2; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__init__", 1); /* "aiohttp/_http_parser.pyx":583 * bint auto_decompress=True, * ): * self._init(cparser.HTTP_REQUEST, protocol, loop, limit, timer, # <<<<<<<<<<<<<< * max_line_size, max_headers, max_field_size, * payload_exception, response_with_body, read_until_eof, */ __pyx_t_2.__pyx_n = 8; __pyx_t_2.timer = __pyx_v_timer; __pyx_t_2.max_line_size = __pyx_v_max_line_size; __pyx_t_2.max_headers = __pyx_v_max_headers; __pyx_t_2.max_field_size = __pyx_v_max_field_size; __pyx_t_2.payload_exception = __pyx_v_payload_exception; __pyx_t_2.response_with_body = __pyx_v_response_with_body; __pyx_t_2.read_until_eof = __pyx_v_read_until_eof; __pyx_t_2.auto_decompress = __pyx_v_auto_decompress; __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpRequestParser *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base._init(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), HTTP_REQUEST, __pyx_v_protocol, __pyx_v_loop, __pyx_v_limit, &__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 583, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":576 * cdef class HttpRequestParser(HttpParser): * * def __init__( # <<<<<<<<<<<<<< * self, protocol, loop, int limit, timer=None, * size_t max_line_size=8190, size_t max_headers=32768, */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":588 * auto_decompress) * * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< * cdef int idx1, idx2 * if not self._buf: */ static PyObject *__pyx_f_7aiohttp_12_http_parser_17HttpRequestParser__on_status_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self) { int __pyx_v_idx1; int __pyx_v_idx2; Py_ssize_t __pyx_v_idx3; PyObject *__pyx_v_query = NULL; PyObject *__pyx_v_path = NULL; PyObject *__pyx_v_fragment = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; Py_ssize_t __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; Py_UCS4 __pyx_t_7; Py_ssize_t __pyx_t_8; int __pyx_t_9; int __pyx_t_10; char const *__pyx_t_11; PyObject *__pyx_t_12 = NULL; PyObject *__pyx_t_13 = NULL; PyObject *__pyx_t_14 = NULL; PyObject *__pyx_t_15 = NULL; PyObject *__pyx_t_16 = NULL; PyObject *__pyx_t_17 = NULL; int __pyx_t_18; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_on_status_complete", 1); /* "aiohttp/_http_parser.pyx":590 * cdef object _on_status_complete(self): * cdef int idx1, idx2 * if not self._buf: # <<<<<<<<<<<<<< * return * self._path = self._buf.decode('utf-8', 'surrogateescape') */ __pyx_t_1 = (__pyx_v_self->__pyx_base._buf != Py_None)&&(PyByteArray_GET_SIZE(__pyx_v_self->__pyx_base._buf) != 0); __pyx_t_2 = (!__pyx_t_1); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":591 * cdef int idx1, idx2 * if not self._buf: * return # <<<<<<<<<<<<<< * self._path = self._buf.decode('utf-8', 'surrogateescape') * try: */ __Pyx_XDECREF(__pyx_r); __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; /* "aiohttp/_http_parser.pyx":590 * cdef object _on_status_complete(self): * cdef int idx1, idx2 * if not self._buf: # <<<<<<<<<<<<<< * return * self._path = self._buf.decode('utf-8', 'surrogateescape') */ } /* "aiohttp/_http_parser.pyx":592 * if not self._buf: * return * self._path = self._buf.decode('utf-8', 'surrogateescape') # <<<<<<<<<<<<<< * try: * idx3 = len(self._path) */ if (unlikely(__pyx_v_self->__pyx_base._buf == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "decode"); __PYX_ERR(0, 592, __pyx_L1_error) } __pyx_t_3 = __Pyx_decode_bytearray(__pyx_v_self->__pyx_base._buf, 0, PY_SSIZE_T_MAX, NULL, ((char const *)"surrogateescape"), PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 592, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __Pyx_GOTREF(__pyx_v_self->__pyx_base._path); __Pyx_DECREF(__pyx_v_self->__pyx_base._path); __pyx_v_self->__pyx_base._path = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":593 * return * self._path = self._buf.decode('utf-8', 'surrogateescape') * try: # <<<<<<<<<<<<<< * idx3 = len(self._path) * if self._cparser.method == cparser.HTTP_CONNECT: */ /*try:*/ { /* "aiohttp/_http_parser.pyx":594 * self._path = self._buf.decode('utf-8', 'surrogateescape') * try: * idx3 = len(self._path) # <<<<<<<<<<<<<< * if self._cparser.method == cparser.HTTP_CONNECT: * # authority-form, */ __pyx_t_3 = __pyx_v_self->__pyx_base._path; __Pyx_INCREF(__pyx_t_3); if (unlikely(__pyx_t_3 == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(0, 594, __pyx_L5_error) } __pyx_t_4 = __Pyx_PyUnicode_GET_LENGTH(__pyx_t_3); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(0, 594, __pyx_L5_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_idx3 = __pyx_t_4; /* "aiohttp/_http_parser.pyx":595 * try: * idx3 = len(self._path) * if self._cparser.method == cparser.HTTP_CONNECT: # <<<<<<<<<<<<<< * # authority-form, * # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.3 */ __pyx_t_2 = (__pyx_v_self->__pyx_base._cparser->method == HTTP_CONNECT); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":598 * # authority-form, * # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.3 * self._url = URL.build(authority=self._path, encoded=True) # <<<<<<<<<<<<<< * elif idx3 > 1 and self._path[0] == '/': * # origin-form, */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_7aiohttp_12_http_parser_URL, __pyx_n_s_build); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 598, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 598, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_5); if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_authority, __pyx_v_self->__pyx_base._path) < 0) __PYX_ERR(0, 598, __pyx_L5_error) if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_encoded, Py_True) < 0) __PYX_ERR(0, 598, __pyx_L5_error) __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_empty_tuple, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 598, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_GIVEREF(__pyx_t_6); __Pyx_GOTREF(__pyx_v_self->__pyx_base._url); __Pyx_DECREF(__pyx_v_self->__pyx_base._url); __pyx_v_self->__pyx_base._url = __pyx_t_6; __pyx_t_6 = 0; /* "aiohttp/_http_parser.pyx":595 * try: * idx3 = len(self._path) * if self._cparser.method == cparser.HTTP_CONNECT: # <<<<<<<<<<<<<< * # authority-form, * # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.3 */ goto __pyx_L7; } /* "aiohttp/_http_parser.pyx":599 * # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.3 * self._url = URL.build(authority=self._path, encoded=True) * elif idx3 > 1 and self._path[0] == '/': # <<<<<<<<<<<<<< * # origin-form, * # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.1 */ __pyx_t_1 = (__pyx_v_idx3 > 1); if (__pyx_t_1) { } else { __pyx_t_2 = __pyx_t_1; goto __pyx_L8_bool_binop_done; } __pyx_t_7 = __Pyx_GetItemInt_Unicode(__pyx_v_self->__pyx_base._path, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_7 == (Py_UCS4)-1)) __PYX_ERR(0, 599, __pyx_L5_error) __pyx_t_1 = (__pyx_t_7 == 47); __pyx_t_2 = __pyx_t_1; __pyx_L8_bool_binop_done:; if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":602 * # origin-form, * # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.1 * idx1 = self._path.find("?") # <<<<<<<<<<<<<< * if idx1 == -1: * query = "" */ if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "find"); __PYX_ERR(0, 602, __pyx_L5_error) } __pyx_t_4 = PyUnicode_Find(__pyx_v_self->__pyx_base._path, __pyx_kp_u__9, 0, PY_SSIZE_T_MAX, 1); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-2))) __PYX_ERR(0, 602, __pyx_L5_error) __pyx_v_idx1 = __pyx_t_4; /* "aiohttp/_http_parser.pyx":603 * # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.1 * idx1 = self._path.find("?") * if idx1 == -1: # <<<<<<<<<<<<<< * query = "" * idx2 = self._path.find("#") */ __pyx_t_2 = (__pyx_v_idx1 == -1L); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":604 * idx1 = self._path.find("?") * if idx1 == -1: * query = "" # <<<<<<<<<<<<<< * idx2 = self._path.find("#") * if idx2 == -1: */ __Pyx_INCREF(__pyx_kp_u__8); __pyx_v_query = __pyx_kp_u__8; /* "aiohttp/_http_parser.pyx":605 * if idx1 == -1: * query = "" * idx2 = self._path.find("#") # <<<<<<<<<<<<<< * if idx2 == -1: * path = self._path */ if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "find"); __PYX_ERR(0, 605, __pyx_L5_error) } __pyx_t_4 = PyUnicode_Find(__pyx_v_self->__pyx_base._path, __pyx_kp_u__10, 0, PY_SSIZE_T_MAX, 1); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-2))) __PYX_ERR(0, 605, __pyx_L5_error) __pyx_v_idx2 = __pyx_t_4; /* "aiohttp/_http_parser.pyx":606 * query = "" * idx2 = self._path.find("#") * if idx2 == -1: # <<<<<<<<<<<<<< * path = self._path * fragment = "" */ __pyx_t_2 = (__pyx_v_idx2 == -1L); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":607 * idx2 = self._path.find("#") * if idx2 == -1: * path = self._path # <<<<<<<<<<<<<< * fragment = "" * else: */ __pyx_t_6 = __pyx_v_self->__pyx_base._path; __Pyx_INCREF(__pyx_t_6); __pyx_v_path = ((PyObject*)__pyx_t_6); __pyx_t_6 = 0; /* "aiohttp/_http_parser.pyx":608 * if idx2 == -1: * path = self._path * fragment = "" # <<<<<<<<<<<<<< * else: * path = self._path[0: idx2] */ __Pyx_INCREF(__pyx_kp_u__8); __pyx_v_fragment = __pyx_kp_u__8; /* "aiohttp/_http_parser.pyx":606 * query = "" * idx2 = self._path.find("#") * if idx2 == -1: # <<<<<<<<<<<<<< * path = self._path * fragment = "" */ goto __pyx_L11; } /* "aiohttp/_http_parser.pyx":610 * fragment = "" * else: * path = self._path[0: idx2] # <<<<<<<<<<<<<< * fragment = self._path[idx2+1:] * */ /*else*/ { if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 610, __pyx_L5_error) } __pyx_t_6 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, 0, __pyx_v_idx2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 610, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_6); __pyx_v_path = ((PyObject*)__pyx_t_6); __pyx_t_6 = 0; /* "aiohttp/_http_parser.pyx":611 * else: * path = self._path[0: idx2] * fragment = self._path[idx2+1:] # <<<<<<<<<<<<<< * * else: */ if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 611, __pyx_L5_error) } __pyx_t_6 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, (__pyx_v_idx2 + 1), PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 611, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_6); __pyx_v_fragment = ((PyObject*)__pyx_t_6); __pyx_t_6 = 0; } __pyx_L11:; /* "aiohttp/_http_parser.pyx":603 * # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.1 * idx1 = self._path.find("?") * if idx1 == -1: # <<<<<<<<<<<<<< * query = "" * idx2 = self._path.find("#") */ goto __pyx_L10; } /* "aiohttp/_http_parser.pyx":614 * * else: * path = self._path[0:idx1] # <<<<<<<<<<<<<< * idx1 += 1 * idx2 = self._path.find("#", idx1+1) */ /*else*/ { if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 614, __pyx_L5_error) } __pyx_t_6 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, 0, __pyx_v_idx1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 614, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_6); __pyx_v_path = ((PyObject*)__pyx_t_6); __pyx_t_6 = 0; /* "aiohttp/_http_parser.pyx":615 * else: * path = self._path[0:idx1] * idx1 += 1 # <<<<<<<<<<<<<< * idx2 = self._path.find("#", idx1+1) * if idx2 == -1: */ __pyx_v_idx1 = (__pyx_v_idx1 + 1); /* "aiohttp/_http_parser.pyx":616 * path = self._path[0:idx1] * idx1 += 1 * idx2 = self._path.find("#", idx1+1) # <<<<<<<<<<<<<< * if idx2 == -1: * query = self._path[idx1:] */ if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "find"); __PYX_ERR(0, 616, __pyx_L5_error) } __pyx_t_6 = __Pyx_PyInt_From_long((__pyx_v_idx1 + 1)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 616, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_4 = (__Pyx_Py_IsNone(__pyx_t_6) ? (0) : (__Pyx_PyIndex_AsSsize_t(__pyx_t_6))); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 616, __pyx_L5_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_8 = PyUnicode_Find(__pyx_v_self->__pyx_base._path, __pyx_kp_u__10, __pyx_t_4, PY_SSIZE_T_MAX, 1); if (unlikely(__pyx_t_8 == ((Py_ssize_t)-2))) __PYX_ERR(0, 616, __pyx_L5_error) __pyx_v_idx2 = __pyx_t_8; /* "aiohttp/_http_parser.pyx":617 * idx1 += 1 * idx2 = self._path.find("#", idx1+1) * if idx2 == -1: # <<<<<<<<<<<<<< * query = self._path[idx1:] * fragment = "" */ __pyx_t_2 = (__pyx_v_idx2 == -1L); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":618 * idx2 = self._path.find("#", idx1+1) * if idx2 == -1: * query = self._path[idx1:] # <<<<<<<<<<<<<< * fragment = "" * else: */ if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 618, __pyx_L5_error) } __pyx_t_6 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, __pyx_v_idx1, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 618, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_6); __pyx_v_query = ((PyObject*)__pyx_t_6); __pyx_t_6 = 0; /* "aiohttp/_http_parser.pyx":619 * if idx2 == -1: * query = self._path[idx1:] * fragment = "" # <<<<<<<<<<<<<< * else: * query = self._path[idx1: idx2] */ __Pyx_INCREF(__pyx_kp_u__8); __pyx_v_fragment = __pyx_kp_u__8; /* "aiohttp/_http_parser.pyx":617 * idx1 += 1 * idx2 = self._path.find("#", idx1+1) * if idx2 == -1: # <<<<<<<<<<<<<< * query = self._path[idx1:] * fragment = "" */ goto __pyx_L12; } /* "aiohttp/_http_parser.pyx":621 * fragment = "" * else: * query = self._path[idx1: idx2] # <<<<<<<<<<<<<< * fragment = self._path[idx2+1:] * */ /*else*/ { if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 621, __pyx_L5_error) } __pyx_t_6 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, __pyx_v_idx1, __pyx_v_idx2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 621, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_6); __pyx_v_query = ((PyObject*)__pyx_t_6); __pyx_t_6 = 0; /* "aiohttp/_http_parser.pyx":622 * else: * query = self._path[idx1: idx2] * fragment = self._path[idx2+1:] # <<<<<<<<<<<<<< * * self._url = URL.build( */ if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 622, __pyx_L5_error) } __pyx_t_6 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, (__pyx_v_idx2 + 1), PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 622, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_6); __pyx_v_fragment = ((PyObject*)__pyx_t_6); __pyx_t_6 = 0; } __pyx_L12:; } __pyx_L10:; /* "aiohttp/_http_parser.pyx":624 * fragment = self._path[idx2+1:] * * self._url = URL.build( # <<<<<<<<<<<<<< * path=path, * query_string=query, */ __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_7aiohttp_12_http_parser_URL, __pyx_n_s_build); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 624, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_6); /* "aiohttp/_http_parser.pyx":625 * * self._url = URL.build( * path=path, # <<<<<<<<<<<<<< * query_string=query, * fragment=fragment, */ __pyx_t_5 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 625, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_5); if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_path, __pyx_v_path) < 0) __PYX_ERR(0, 625, __pyx_L5_error) /* "aiohttp/_http_parser.pyx":626 * self._url = URL.build( * path=path, * query_string=query, # <<<<<<<<<<<<<< * fragment=fragment, * encoded=True, */ if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_query_string, __pyx_v_query) < 0) __PYX_ERR(0, 625, __pyx_L5_error) /* "aiohttp/_http_parser.pyx":627 * path=path, * query_string=query, * fragment=fragment, # <<<<<<<<<<<<<< * encoded=True, * ) */ if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_fragment, __pyx_v_fragment) < 0) __PYX_ERR(0, 625, __pyx_L5_error) /* "aiohttp/_http_parser.pyx":628 * query_string=query, * fragment=fragment, * encoded=True, # <<<<<<<<<<<<<< * ) * else: */ if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_encoded, Py_True) < 0) __PYX_ERR(0, 625, __pyx_L5_error) /* "aiohttp/_http_parser.pyx":624 * fragment = self._path[idx2+1:] * * self._url = URL.build( # <<<<<<<<<<<<<< * path=path, * query_string=query, */ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_empty_tuple, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 624, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_GIVEREF(__pyx_t_3); __Pyx_GOTREF(__pyx_v_self->__pyx_base._url); __Pyx_DECREF(__pyx_v_self->__pyx_base._url); __pyx_v_self->__pyx_base._url = __pyx_t_3; __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":599 * # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.3 * self._url = URL.build(authority=self._path, encoded=True) * elif idx3 > 1 and self._path[0] == '/': # <<<<<<<<<<<<<< * # origin-form, * # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.1 */ goto __pyx_L7; } /* "aiohttp/_http_parser.pyx":633 * # absolute-form for proxy maybe, * # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.2 * self._url = URL(self._path, encoded=True) # <<<<<<<<<<<<<< * finally: * PyByteArray_Resize(self._buf, 0) */ /*else*/ { __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 633, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_v_self->__pyx_base._path); __Pyx_GIVEREF(__pyx_v_self->__pyx_base._path); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->__pyx_base._path)) __PYX_ERR(0, 633, __pyx_L5_error); __pyx_t_5 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 633, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_5); if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_encoded, Py_True) < 0) __PYX_ERR(0, 633, __pyx_L5_error) __pyx_t_6 = __Pyx_PyObject_Call(__pyx_v_7aiohttp_12_http_parser_URL, __pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 633, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_GIVEREF(__pyx_t_6); __Pyx_GOTREF(__pyx_v_self->__pyx_base._url); __Pyx_DECREF(__pyx_v_self->__pyx_base._url); __pyx_v_self->__pyx_base._url = __pyx_t_6; __pyx_t_6 = 0; } __pyx_L7:; } /* "aiohttp/_http_parser.pyx":635 * self._url = URL(self._path, encoded=True) * finally: * PyByteArray_Resize(self._buf, 0) # <<<<<<<<<<<<<< * * */ /*finally:*/ { /*normal exit:*/{ __pyx_t_6 = __pyx_v_self->__pyx_base._buf; __Pyx_INCREF(__pyx_t_6); __pyx_t_9 = PyByteArray_Resize(__pyx_t_6, 0); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(0, 635, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; goto __pyx_L6; } __pyx_L5_error:; /*exception exit:*/{ __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17); if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_12, &__pyx_t_13, &__pyx_t_14) < 0)) __Pyx_ErrFetch(&__pyx_t_12, &__pyx_t_13, &__pyx_t_14); __Pyx_XGOTREF(__pyx_t_12); __Pyx_XGOTREF(__pyx_t_13); __Pyx_XGOTREF(__pyx_t_14); __Pyx_XGOTREF(__pyx_t_15); __Pyx_XGOTREF(__pyx_t_16); __Pyx_XGOTREF(__pyx_t_17); __pyx_t_9 = __pyx_lineno; __pyx_t_10 = __pyx_clineno; __pyx_t_11 = __pyx_filename; { __pyx_t_6 = __pyx_v_self->__pyx_base._buf; __Pyx_INCREF(__pyx_t_6); __pyx_t_18 = PyByteArray_Resize(__pyx_t_6, 0); if (unlikely(__pyx_t_18 == ((int)-1))) __PYX_ERR(0, 635, __pyx_L14_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } if (PY_MAJOR_VERSION >= 3) { __Pyx_XGIVEREF(__pyx_t_15); __Pyx_XGIVEREF(__pyx_t_16); __Pyx_XGIVEREF(__pyx_t_17); __Pyx_ExceptionReset(__pyx_t_15, __pyx_t_16, __pyx_t_17); } __Pyx_XGIVEREF(__pyx_t_12); __Pyx_XGIVEREF(__pyx_t_13); __Pyx_XGIVEREF(__pyx_t_14); __Pyx_ErrRestore(__pyx_t_12, __pyx_t_13, __pyx_t_14); __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_lineno = __pyx_t_9; __pyx_clineno = __pyx_t_10; __pyx_filename = __pyx_t_11; goto __pyx_L1_error; __pyx_L14_error:; if (PY_MAJOR_VERSION >= 3) { __Pyx_XGIVEREF(__pyx_t_15); __Pyx_XGIVEREF(__pyx_t_16); __Pyx_XGIVEREF(__pyx_t_17); __Pyx_ExceptionReset(__pyx_t_15, __pyx_t_16, __pyx_t_17); } __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; goto __pyx_L1_error; } __pyx_L6:; } /* "aiohttp/_http_parser.pyx":588 * auto_decompress) * * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< * cdef int idx1, idx2 * if not self._buf: */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser._on_status_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_query); __Pyx_XDECREF(__pyx_v_path); __Pyx_XDECREF(__pyx_v_fragment); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_3__reduce_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_17HttpRequestParser_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_3__reduce_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); if (unlikely(__pyx_nargs > 0)) { __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser_2__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 1); /* "(tree fragment)":2 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); __PYX_ERR(1, 2, __pyx_L1_error) /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): */ /* function exit code */ __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_5__setstate_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_17HttpRequestParser_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_5__setstate_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[1] = {0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 1)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); } __pyx_v___pyx_state = values[0]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser_4__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *)__pyx_v_self), __pyx_v___pyx_state); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 1); /* "(tree fragment)":4 * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< */ __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); __PYX_ERR(1, 4, __pyx_L1_error) /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ /* function exit code */ __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":640 * cdef class HttpResponseParser(HttpParser): * * def __init__( # <<<<<<<<<<<<<< * self, protocol, loop, int limit, timer=None, * size_t max_line_size=8190, size_t max_headers=32768, */ /* Python wrapper */ static int __pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_protocol = 0; PyObject *__pyx_v_loop = 0; int __pyx_v_limit; PyObject *__pyx_v_timer = 0; size_t __pyx_v_max_line_size; size_t __pyx_v_max_headers; size_t __pyx_v_max_field_size; PyObject *__pyx_v_payload_exception = 0; int __pyx_v_response_with_body; int __pyx_v_read_until_eof; int __pyx_v_auto_decompress; CYTHON_UNUSED Py_ssize_t __pyx_nargs; CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; #endif __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_protocol,&__pyx_n_s_loop,&__pyx_n_s_limit,&__pyx_n_s_timer,&__pyx_n_s_max_line_size,&__pyx_n_s_max_headers,&__pyx_n_s_max_field_size,&__pyx_n_s_payload_exception,&__pyx_n_s_response_with_body,&__pyx_n_s_read_until_eof,&__pyx_n_s_auto_decompress,0}; /* "aiohttp/_http_parser.pyx":641 * * def __init__( * self, protocol, loop, int limit, timer=None, # <<<<<<<<<<<<<< * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, */ values[3] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)Py_None)); /* "aiohttp/_http_parser.pyx":643 * self, protocol, loop, int limit, timer=None, * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, # <<<<<<<<<<<<<< * bint response_with_body=True, bint read_until_eof=False, * bint auto_decompress=True */ values[7] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)Py_None)); if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 11: values[10] = __Pyx_Arg_VARARGS(__pyx_args, 10); CYTHON_FALLTHROUGH; case 10: values[9] = __Pyx_Arg_VARARGS(__pyx_args, 9); CYTHON_FALLTHROUGH; case 9: values[8] = __Pyx_Arg_VARARGS(__pyx_args, 8); CYTHON_FALLTHROUGH; case 8: values[7] = __Pyx_Arg_VARARGS(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = __Pyx_Arg_VARARGS(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_protocol)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 640, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_loop)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[1]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 640, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, 1); __PYX_ERR(0, 640, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_limit)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[2]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 640, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, 2); __PYX_ERR(0, 640, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_timer); if (value) { values[3] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 640, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_max_line_size); if (value) { values[4] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 640, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_max_headers); if (value) { values[5] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 640, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 6: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_max_field_size); if (value) { values[6] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 640, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 7: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_payload_exception); if (value) { values[7] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 640, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 8: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_response_with_body); if (value) { values[8] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 640, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 9: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_read_until_eof); if (value) { values[9] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 640, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 10: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_auto_decompress); if (value) { values[10] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 640, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 640, __pyx_L3_error) } } else { switch (__pyx_nargs) { case 11: values[10] = __Pyx_Arg_VARARGS(__pyx_args, 10); CYTHON_FALLTHROUGH; case 10: values[9] = __Pyx_Arg_VARARGS(__pyx_args, 9); CYTHON_FALLTHROUGH; case 9: values[8] = __Pyx_Arg_VARARGS(__pyx_args, 8); CYTHON_FALLTHROUGH; case 8: values[7] = __Pyx_Arg_VARARGS(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = __Pyx_Arg_VARARGS(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = __Pyx_Arg_VARARGS(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = __Pyx_Arg_VARARGS(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = __Pyx_Arg_VARARGS(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = __Pyx_Arg_VARARGS(__pyx_args, 2); values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); break; default: goto __pyx_L5_argtuple_error; } } __pyx_v_protocol = values[0]; __pyx_v_loop = values[1]; __pyx_v_limit = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_limit == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 641, __pyx_L3_error) __pyx_v_timer = values[3]; if (values[4]) { __pyx_v_max_line_size = __Pyx_PyInt_As_size_t(values[4]); if (unlikely((__pyx_v_max_line_size == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 642, __pyx_L3_error) } else { __pyx_v_max_line_size = ((size_t)0x1FFE); } if (values[5]) { __pyx_v_max_headers = __Pyx_PyInt_As_size_t(values[5]); if (unlikely((__pyx_v_max_headers == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 642, __pyx_L3_error) } else { __pyx_v_max_headers = ((size_t)0x8000); } if (values[6]) { __pyx_v_max_field_size = __Pyx_PyInt_As_size_t(values[6]); if (unlikely((__pyx_v_max_field_size == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 643, __pyx_L3_error) } else { __pyx_v_max_field_size = ((size_t)0x1FFE); } __pyx_v_payload_exception = values[7]; if (values[8]) { __pyx_v_response_with_body = __Pyx_PyObject_IsTrue(values[8]); if (unlikely((__pyx_v_response_with_body == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 644, __pyx_L3_error) } else { /* "aiohttp/_http_parser.pyx":644 * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, * bint response_with_body=True, bint read_until_eof=False, # <<<<<<<<<<<<<< * bint auto_decompress=True * ): */ __pyx_v_response_with_body = ((int)1); } if (values[9]) { __pyx_v_read_until_eof = __Pyx_PyObject_IsTrue(values[9]); if (unlikely((__pyx_v_read_until_eof == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 644, __pyx_L3_error) } else { __pyx_v_read_until_eof = ((int)0); } if (values[10]) { __pyx_v_auto_decompress = __Pyx_PyObject_IsTrue(values[10]); if (unlikely((__pyx_v_auto_decompress == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 645, __pyx_L3_error) } else { /* "aiohttp/_http_parser.pyx":645 * size_t max_field_size=8190, payload_exception=None, * bint response_with_body=True, bint read_until_eof=False, * bint auto_decompress=True # <<<<<<<<<<<<<< * ): * self._init(cparser.HTTP_RESPONSE, protocol, loop, limit, timer, */ __pyx_v_auto_decompress = ((int)1); } } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, __pyx_nargs); __PYX_ERR(0, 640, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser___init__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *)__pyx_v_self), __pyx_v_protocol, __pyx_v_loop, __pyx_v_limit, __pyx_v_timer, __pyx_v_max_line_size, __pyx_v_max_headers, __pyx_v_max_field_size, __pyx_v_payload_exception, __pyx_v_response_with_body, __pyx_v_read_until_eof, __pyx_v_auto_decompress); /* "aiohttp/_http_parser.pyx":640 * cdef class HttpResponseParser(HttpParser): * * def __init__( # <<<<<<<<<<<<<< * self, protocol, loop, int limit, timer=None, * size_t max_line_size=8190, size_t max_headers=32768, */ /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser___init__(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self, PyObject *__pyx_v_protocol, PyObject *__pyx_v_loop, int __pyx_v_limit, PyObject *__pyx_v_timer, size_t __pyx_v_max_line_size, size_t __pyx_v_max_headers, size_t __pyx_v_max_field_size, PyObject *__pyx_v_payload_exception, int __pyx_v_response_with_body, int __pyx_v_read_until_eof, int __pyx_v_auto_decompress) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init __pyx_t_2; int __pyx_t_3; int __pyx_t_4; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__init__", 1); /* "aiohttp/_http_parser.pyx":647 * bint auto_decompress=True * ): * self._init(cparser.HTTP_RESPONSE, protocol, loop, limit, timer, # <<<<<<<<<<<<<< * max_line_size, max_headers, max_field_size, * payload_exception, response_with_body, read_until_eof, */ __pyx_t_2.__pyx_n = 8; __pyx_t_2.timer = __pyx_v_timer; __pyx_t_2.max_line_size = __pyx_v_max_line_size; __pyx_t_2.max_headers = __pyx_v_max_headers; __pyx_t_2.max_field_size = __pyx_v_max_field_size; __pyx_t_2.payload_exception = __pyx_v_payload_exception; __pyx_t_2.response_with_body = __pyx_v_response_with_body; __pyx_t_2.read_until_eof = __pyx_v_read_until_eof; __pyx_t_2.auto_decompress = __pyx_v_auto_decompress; __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpResponseParser *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base._init(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), HTTP_RESPONSE, __pyx_v_protocol, __pyx_v_loop, __pyx_v_limit, &__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 647, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":652 * auto_decompress) * # Use strict parsing on dev mode, so users are warned about broken servers. * if not DEBUG: # <<<<<<<<<<<<<< * cparser.llhttp_set_lenient_headers(self._cparser, 1) * cparser.llhttp_set_lenient_optional_cr_before_lf(self._cparser, 1) */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DEBUG); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 652, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 652, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_4 = (!__pyx_t_3); if (__pyx_t_4) { /* "aiohttp/_http_parser.pyx":653 * # Use strict parsing on dev mode, so users are warned about broken servers. * if not DEBUG: * cparser.llhttp_set_lenient_headers(self._cparser, 1) # <<<<<<<<<<<<<< * cparser.llhttp_set_lenient_optional_cr_before_lf(self._cparser, 1) * cparser.llhttp_set_lenient_spaces_after_chunk_size(self._cparser, 1) */ llhttp_set_lenient_headers(__pyx_v_self->__pyx_base._cparser, 1); /* "aiohttp/_http_parser.pyx":654 * if not DEBUG: * cparser.llhttp_set_lenient_headers(self._cparser, 1) * cparser.llhttp_set_lenient_optional_cr_before_lf(self._cparser, 1) # <<<<<<<<<<<<<< * cparser.llhttp_set_lenient_spaces_after_chunk_size(self._cparser, 1) * */ llhttp_set_lenient_optional_cr_before_lf(__pyx_v_self->__pyx_base._cparser, 1); /* "aiohttp/_http_parser.pyx":655 * cparser.llhttp_set_lenient_headers(self._cparser, 1) * cparser.llhttp_set_lenient_optional_cr_before_lf(self._cparser, 1) * cparser.llhttp_set_lenient_spaces_after_chunk_size(self._cparser, 1) # <<<<<<<<<<<<<< * * cdef object _on_status_complete(self): */ llhttp_set_lenient_spaces_after_chunk_size(__pyx_v_self->__pyx_base._cparser, 1); /* "aiohttp/_http_parser.pyx":652 * auto_decompress) * # Use strict parsing on dev mode, so users are warned about broken servers. * if not DEBUG: # <<<<<<<<<<<<<< * cparser.llhttp_set_lenient_headers(self._cparser, 1) * cparser.llhttp_set_lenient_optional_cr_before_lf(self._cparser, 1) */ } /* "aiohttp/_http_parser.pyx":640 * cdef class HttpResponseParser(HttpParser): * * def __init__( # <<<<<<<<<<<<<< * self, protocol, loop, int limit, timer=None, * size_t max_line_size=8190, size_t max_headers=32768, */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":657 * cparser.llhttp_set_lenient_spaces_after_chunk_size(self._cparser, 1) * * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< * if self._buf: * self._reason = self._buf.decode('utf-8', 'surrogateescape') */ static PyObject *__pyx_f_7aiohttp_12_http_parser_18HttpResponseParser__on_status_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; int __pyx_t_3; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_on_status_complete", 1); /* "aiohttp/_http_parser.pyx":658 * * cdef object _on_status_complete(self): * if self._buf: # <<<<<<<<<<<<<< * self._reason = self._buf.decode('utf-8', 'surrogateescape') * PyByteArray_Resize(self._buf, 0) */ __pyx_t_1 = (__pyx_v_self->__pyx_base._buf != Py_None)&&(PyByteArray_GET_SIZE(__pyx_v_self->__pyx_base._buf) != 0); if (__pyx_t_1) { /* "aiohttp/_http_parser.pyx":659 * cdef object _on_status_complete(self): * if self._buf: * self._reason = self._buf.decode('utf-8', 'surrogateescape') # <<<<<<<<<<<<<< * PyByteArray_Resize(self._buf, 0) * else: */ if (unlikely(__pyx_v_self->__pyx_base._buf == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "decode"); __PYX_ERR(0, 659, __pyx_L1_error) } __pyx_t_2 = __Pyx_decode_bytearray(__pyx_v_self->__pyx_base._buf, 0, PY_SSIZE_T_MAX, NULL, ((char const *)"surrogateescape"), PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 659, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __Pyx_GOTREF(__pyx_v_self->__pyx_base._reason); __Pyx_DECREF(__pyx_v_self->__pyx_base._reason); __pyx_v_self->__pyx_base._reason = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":660 * if self._buf: * self._reason = self._buf.decode('utf-8', 'surrogateescape') * PyByteArray_Resize(self._buf, 0) # <<<<<<<<<<<<<< * else: * self._reason = self._reason or '' */ __pyx_t_2 = __pyx_v_self->__pyx_base._buf; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = PyByteArray_Resize(__pyx_t_2, 0); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 660, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":658 * * cdef object _on_status_complete(self): * if self._buf: # <<<<<<<<<<<<<< * self._reason = self._buf.decode('utf-8', 'surrogateescape') * PyByteArray_Resize(self._buf, 0) */ goto __pyx_L3; } /* "aiohttp/_http_parser.pyx":662 * PyByteArray_Resize(self._buf, 0) * else: * self._reason = self._reason or '' # <<<<<<<<<<<<<< * * cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: */ /*else*/ { __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->__pyx_base._reason); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 662, __pyx_L1_error) if (!__pyx_t_1) { } else { __Pyx_INCREF(__pyx_v_self->__pyx_base._reason); __pyx_t_2 = __pyx_v_self->__pyx_base._reason; goto __pyx_L4_bool_binop_done; } __Pyx_INCREF(__pyx_kp_u__8); __pyx_t_2 = __pyx_kp_u__8; __pyx_L4_bool_binop_done:; __Pyx_GIVEREF(__pyx_t_2); __Pyx_GOTREF(__pyx_v_self->__pyx_base._reason); __Pyx_DECREF(__pyx_v_self->__pyx_base._reason); __pyx_v_self->__pyx_base._reason = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; } __pyx_L3:; /* "aiohttp/_http_parser.pyx":657 * cparser.llhttp_set_lenient_spaces_after_chunk_size(self._cparser, 1) * * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< * if self._buf: * self._reason = self._buf.decode('utf-8', 'surrogateescape') */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser._on_status_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_3__reduce_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_18HttpResponseParser_3__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_3__reduce_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); if (unlikely(__pyx_nargs > 0)) { __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser_2__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 1); /* "(tree fragment)":2 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); __PYX_ERR(1, 2, __pyx_L1_error) /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): */ /* function exit code */ __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_5__setstate_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_18HttpResponseParser_5__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_5__setstate_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[1] = {0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 3, __pyx_L3_error) else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(1, 3, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 1)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); } __pyx_v___pyx_state = values[0]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 3, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser_4__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *)__pyx_v_self), __pyx_v___pyx_state); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 1); /* "(tree fragment)":4 * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< */ __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); __PYX_ERR(1, 4, __pyx_L1_error) /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ /* function exit code */ __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":664 * self._reason = self._reason or '' * * cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_message_begin(llhttp_t *__pyx_v_parser) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_message_begin", 1); /* "aiohttp/_http_parser.pyx":665 * * cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * * pyparser._started = True */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":667 * cdef HttpParser pyparser = parser.data * * pyparser._started = True # <<<<<<<<<<<<<< * pyparser._headers = CIMultiDict() * pyparser._raw_headers = [] */ __pyx_v_pyparser->_started = 1; /* "aiohttp/_http_parser.pyx":668 * * pyparser._started = True * pyparser._headers = CIMultiDict() # <<<<<<<<<<<<<< * pyparser._raw_headers = [] * PyByteArray_Resize(pyparser._buf, 0) */ __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_CIMultiDict); __pyx_t_2 = __pyx_v_7aiohttp_12_http_parser_CIMultiDict; __pyx_t_3 = NULL; __pyx_t_4 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_4 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_3, NULL}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 0+__pyx_t_4); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 668, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_pyparser->_headers); __Pyx_DECREF(__pyx_v_pyparser->_headers); __pyx_v_pyparser->_headers = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":669 * pyparser._started = True * pyparser._headers = CIMultiDict() * pyparser._raw_headers = [] # <<<<<<<<<<<<<< * PyByteArray_Resize(pyparser._buf, 0) * pyparser._path = None */ __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 669, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_pyparser->_raw_headers); __Pyx_DECREF(__pyx_v_pyparser->_raw_headers); __pyx_v_pyparser->_raw_headers = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":670 * pyparser._headers = CIMultiDict() * pyparser._raw_headers = [] * PyByteArray_Resize(pyparser._buf, 0) # <<<<<<<<<<<<<< * pyparser._path = None * pyparser._reason = None */ __pyx_t_1 = __pyx_v_pyparser->_buf; __Pyx_INCREF(__pyx_t_1); __pyx_t_4 = PyByteArray_Resize(__pyx_t_1, 0); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(0, 670, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":671 * pyparser._raw_headers = [] * PyByteArray_Resize(pyparser._buf, 0) * pyparser._path = None # <<<<<<<<<<<<<< * pyparser._reason = None * return 0 */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_pyparser->_path); __Pyx_DECREF(__pyx_v_pyparser->_path); __pyx_v_pyparser->_path = ((PyObject*)Py_None); /* "aiohttp/_http_parser.pyx":672 * PyByteArray_Resize(pyparser._buf, 0) * pyparser._path = None * pyparser._reason = None # <<<<<<<<<<<<<< * return 0 * */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_pyparser->_reason); __Pyx_DECREF(__pyx_v_pyparser->_reason); __pyx_v_pyparser->_reason = ((PyObject*)Py_None); /* "aiohttp/_http_parser.pyx":673 * pyparser._path = None * pyparser._reason = None * return 0 # <<<<<<<<<<<<<< * * */ __pyx_r = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":664 * self._reason = self._reason or '' * * cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_message_begin", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":676 * * * cdef int cb_on_url(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_url(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; PyObject *__pyx_v_ex = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; int __pyx_t_10; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_url", 1); /* "aiohttp/_http_parser.pyx":678 * cdef int cb_on_url(cparser.llhttp_t* parser, * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * try: * if length > pyparser._max_line_size: */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":679 * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * if length > pyparser._max_line_size: * raise LineTooLong( */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":680 * cdef HttpParser pyparser = parser.data * try: * if length > pyparser._max_line_size: # <<<<<<<<<<<<<< * raise LineTooLong( * 'Status line is too long', pyparser._max_line_size, length) */ __pyx_t_5 = (__pyx_v_length > __pyx_v_pyparser->_max_line_size); if (unlikely(__pyx_t_5)) { /* "aiohttp/_http_parser.pyx":681 * try: * if length > pyparser._max_line_size: * raise LineTooLong( # <<<<<<<<<<<<<< * 'Status line is too long', pyparser._max_line_size, length) * extend(pyparser._buf, at, length) */ __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 681, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_6); /* "aiohttp/_http_parser.pyx":682 * if length > pyparser._max_line_size: * raise LineTooLong( * 'Status line is too long', pyparser._max_line_size, length) # <<<<<<<<<<<<<< * extend(pyparser._buf, at, length) * except BaseException as ex: */ __pyx_t_7 = __Pyx_PyInt_FromSize_t(__pyx_v_pyparser->_max_line_size); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 682, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_8 = __Pyx_PyInt_FromSize_t(__pyx_v_length); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 682, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = NULL; __pyx_t_10 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_6))) { __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_6); if (likely(__pyx_t_9)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); __Pyx_INCREF(__pyx_t_9); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_6, function); __pyx_t_10 = 1; } } #endif { PyObject *__pyx_callargs[4] = {__pyx_t_9, __pyx_kp_u_Status_line_is_too_long, __pyx_t_7, __pyx_t_8}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_10, 3+__pyx_t_10); __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 681, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(0, 681, __pyx_L3_error) /* "aiohttp/_http_parser.pyx":680 * cdef HttpParser pyparser = parser.data * try: * if length > pyparser._max_line_size: # <<<<<<<<<<<<<< * raise LineTooLong( * 'Status line is too long', pyparser._max_line_size, length) */ } /* "aiohttp/_http_parser.pyx":683 * raise LineTooLong( * 'Status line is too long', pyparser._max_line_size, length) * extend(pyparser._buf, at, length) # <<<<<<<<<<<<<< * except BaseException as ex: * pyparser._last_error = ex */ __pyx_t_1 = __pyx_v_pyparser->_buf; __Pyx_INCREF(__pyx_t_1); __pyx_t_6 = __pyx_f_7aiohttp_12_http_parser_extend(__pyx_t_1, __pyx_v_at, __pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 683, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; /* "aiohttp/_http_parser.pyx":679 * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * if length > pyparser._max_line_size: * raise LineTooLong( */ } /* "aiohttp/_http_parser.pyx":688 * return -1 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else:*/ { __pyx_r = 0; goto __pyx_L6_except_return; } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; /* "aiohttp/_http_parser.pyx":684 * 'Status line is too long', pyparser._max_line_size, length) * extend(pyparser._buf, at, length) * except BaseException as ex: # <<<<<<<<<<<<<< * pyparser._last_error = ex * return -1 */ __pyx_t_10 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_10) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_url", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_8) < 0) __PYX_ERR(0, 684, __pyx_L5_except_error) __Pyx_XGOTREF(__pyx_t_6); __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_v_ex = __pyx_t_1; /*try:*/ { /* "aiohttp/_http_parser.pyx":685 * extend(pyparser._buf, at, length) * except BaseException as ex: * pyparser._last_error = ex # <<<<<<<<<<<<<< * return -1 * else: */ __Pyx_INCREF(__pyx_v_ex); __Pyx_GIVEREF(__pyx_v_ex); __Pyx_GOTREF(__pyx_v_pyparser->_last_error); __Pyx_DECREF(__pyx_v_pyparser->_last_error); __pyx_v_pyparser->_last_error = __pyx_v_ex; /* "aiohttp/_http_parser.pyx":686 * except BaseException as ex: * pyparser._last_error = ex * return -1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; goto __pyx_L14_return; } /* "aiohttp/_http_parser.pyx":684 * 'Status line is too long', pyparser._max_line_size, length) * extend(pyparser._buf, at, length) * except BaseException as ex: # <<<<<<<<<<<<<< * pyparser._last_error = ex * return -1 */ /*finally:*/ { __pyx_L14_return: { __pyx_t_10 = __pyx_r; __Pyx_DECREF(__pyx_v_ex); __pyx_v_ex = 0; __pyx_r = __pyx_t_10; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; /* "aiohttp/_http_parser.pyx":679 * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * if length > pyparser._max_line_size: * raise LineTooLong( */ __pyx_L5_except_error:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":676 * * * cdef int cb_on_url(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_url", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_ex); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":691 * * * cdef int cb_on_status(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_status(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; PyObject *__pyx_v_ex = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; int __pyx_t_10; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_status", 1); /* "aiohttp/_http_parser.pyx":693 * cdef int cb_on_status(cparser.llhttp_t* parser, * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * cdef str reason * try: */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":695 * cdef HttpParser pyparser = parser.data * cdef str reason * try: # <<<<<<<<<<<<<< * if length > pyparser._max_line_size: * raise LineTooLong( */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":696 * cdef str reason * try: * if length > pyparser._max_line_size: # <<<<<<<<<<<<<< * raise LineTooLong( * 'Status line is too long', pyparser._max_line_size, length) */ __pyx_t_5 = (__pyx_v_length > __pyx_v_pyparser->_max_line_size); if (unlikely(__pyx_t_5)) { /* "aiohttp/_http_parser.pyx":697 * try: * if length > pyparser._max_line_size: * raise LineTooLong( # <<<<<<<<<<<<<< * 'Status line is too long', pyparser._max_line_size, length) * extend(pyparser._buf, at, length) */ __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 697, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_6); /* "aiohttp/_http_parser.pyx":698 * if length > pyparser._max_line_size: * raise LineTooLong( * 'Status line is too long', pyparser._max_line_size, length) # <<<<<<<<<<<<<< * extend(pyparser._buf, at, length) * except BaseException as ex: */ __pyx_t_7 = __Pyx_PyInt_FromSize_t(__pyx_v_pyparser->_max_line_size); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 698, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_8 = __Pyx_PyInt_FromSize_t(__pyx_v_length); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 698, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = NULL; __pyx_t_10 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_6))) { __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_6); if (likely(__pyx_t_9)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); __Pyx_INCREF(__pyx_t_9); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_6, function); __pyx_t_10 = 1; } } #endif { PyObject *__pyx_callargs[4] = {__pyx_t_9, __pyx_kp_u_Status_line_is_too_long, __pyx_t_7, __pyx_t_8}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_10, 3+__pyx_t_10); __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 697, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(0, 697, __pyx_L3_error) /* "aiohttp/_http_parser.pyx":696 * cdef str reason * try: * if length > pyparser._max_line_size: # <<<<<<<<<<<<<< * raise LineTooLong( * 'Status line is too long', pyparser._max_line_size, length) */ } /* "aiohttp/_http_parser.pyx":699 * raise LineTooLong( * 'Status line is too long', pyparser._max_line_size, length) * extend(pyparser._buf, at, length) # <<<<<<<<<<<<<< * except BaseException as ex: * pyparser._last_error = ex */ __pyx_t_1 = __pyx_v_pyparser->_buf; __Pyx_INCREF(__pyx_t_1); __pyx_t_6 = __pyx_f_7aiohttp_12_http_parser_extend(__pyx_t_1, __pyx_v_at, __pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 699, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; /* "aiohttp/_http_parser.pyx":695 * cdef HttpParser pyparser = parser.data * cdef str reason * try: # <<<<<<<<<<<<<< * if length > pyparser._max_line_size: * raise LineTooLong( */ } /* "aiohttp/_http_parser.pyx":704 * return -1 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else:*/ { __pyx_r = 0; goto __pyx_L6_except_return; } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; /* "aiohttp/_http_parser.pyx":700 * 'Status line is too long', pyparser._max_line_size, length) * extend(pyparser._buf, at, length) * except BaseException as ex: # <<<<<<<<<<<<<< * pyparser._last_error = ex * return -1 */ __pyx_t_10 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_10) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_status", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_8) < 0) __PYX_ERR(0, 700, __pyx_L5_except_error) __Pyx_XGOTREF(__pyx_t_6); __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_v_ex = __pyx_t_1; /*try:*/ { /* "aiohttp/_http_parser.pyx":701 * extend(pyparser._buf, at, length) * except BaseException as ex: * pyparser._last_error = ex # <<<<<<<<<<<<<< * return -1 * else: */ __Pyx_INCREF(__pyx_v_ex); __Pyx_GIVEREF(__pyx_v_ex); __Pyx_GOTREF(__pyx_v_pyparser->_last_error); __Pyx_DECREF(__pyx_v_pyparser->_last_error); __pyx_v_pyparser->_last_error = __pyx_v_ex; /* "aiohttp/_http_parser.pyx":702 * except BaseException as ex: * pyparser._last_error = ex * return -1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; goto __pyx_L14_return; } /* "aiohttp/_http_parser.pyx":700 * 'Status line is too long', pyparser._max_line_size, length) * extend(pyparser._buf, at, length) * except BaseException as ex: # <<<<<<<<<<<<<< * pyparser._last_error = ex * return -1 */ /*finally:*/ { __pyx_L14_return: { __pyx_t_10 = __pyx_r; __Pyx_DECREF(__pyx_v_ex); __pyx_v_ex = 0; __pyx_r = __pyx_t_10; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; /* "aiohttp/_http_parser.pyx":695 * cdef HttpParser pyparser = parser.data * cdef str reason * try: # <<<<<<<<<<<<<< * if length > pyparser._max_line_size: * raise LineTooLong( */ __pyx_L5_except_error:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":691 * * * cdef int cb_on_status(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_status", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_ex); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":707 * * * cdef int cb_on_header_field(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_header_field(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; Py_ssize_t __pyx_v_size; PyObject *__pyx_v_ex = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; Py_ssize_t __pyx_t_5; int __pyx_t_6; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; int __pyx_t_11; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_header_field", 1); /* "aiohttp/_http_parser.pyx":709 * cdef int cb_on_header_field(cparser.llhttp_t* parser, * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * cdef Py_ssize_t size * try: */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":711 * cdef HttpParser pyparser = parser.data * cdef Py_ssize_t size * try: # <<<<<<<<<<<<<< * pyparser._on_status_complete() * size = len(pyparser._raw_name) + length */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":712 * cdef Py_ssize_t size * try: * pyparser._on_status_complete() # <<<<<<<<<<<<<< * size = len(pyparser._raw_name) + length * if size > pyparser._max_field_size: */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_status_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 712, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":713 * try: * pyparser._on_status_complete() * size = len(pyparser._raw_name) + length # <<<<<<<<<<<<<< * if size > pyparser._max_field_size: * raise LineTooLong( */ __pyx_t_1 = __pyx_v_pyparser->_raw_name; __Pyx_INCREF(__pyx_t_1); if (unlikely(__pyx_t_1 == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(0, 713, __pyx_L3_error) } __pyx_t_5 = __Pyx_PyByteArray_GET_SIZE(__pyx_t_1); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 713, __pyx_L3_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_size = (__pyx_t_5 + __pyx_v_length); /* "aiohttp/_http_parser.pyx":714 * pyparser._on_status_complete() * size = len(pyparser._raw_name) + length * if size > pyparser._max_field_size: # <<<<<<<<<<<<<< * raise LineTooLong( * 'Header name is too long', pyparser._max_field_size, size) */ __pyx_t_6 = (__pyx_v_size > __pyx_v_pyparser->_max_field_size); if (unlikely(__pyx_t_6)) { /* "aiohttp/_http_parser.pyx":715 * size = len(pyparser._raw_name) + length * if size > pyparser._max_field_size: * raise LineTooLong( # <<<<<<<<<<<<<< * 'Header name is too long', pyparser._max_field_size, size) * pyparser._on_header_field(at, length) */ __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 715, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_7); /* "aiohttp/_http_parser.pyx":716 * if size > pyparser._max_field_size: * raise LineTooLong( * 'Header name is too long', pyparser._max_field_size, size) # <<<<<<<<<<<<<< * pyparser._on_header_field(at, length) * except BaseException as ex: */ __pyx_t_8 = __Pyx_PyInt_FromSize_t(__pyx_v_pyparser->_max_field_size); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 716, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = PyInt_FromSsize_t(__pyx_v_size); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 716, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_9); __pyx_t_10 = NULL; __pyx_t_11 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_7))) { __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_10)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); __Pyx_INCREF(__pyx_t_10); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_7, function); __pyx_t_11 = 1; } } #endif { PyObject *__pyx_callargs[4] = {__pyx_t_10, __pyx_kp_u_Header_name_is_too_long, __pyx_t_8, __pyx_t_9}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_11, 3+__pyx_t_11); __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 715, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(0, 715, __pyx_L3_error) /* "aiohttp/_http_parser.pyx":714 * pyparser._on_status_complete() * size = len(pyparser._raw_name) + length * if size > pyparser._max_field_size: # <<<<<<<<<<<<<< * raise LineTooLong( * 'Header name is too long', pyparser._max_field_size, size) */ } /* "aiohttp/_http_parser.pyx":717 * raise LineTooLong( * 'Header name is too long', pyparser._max_field_size, size) * pyparser._on_header_field(at, length) # <<<<<<<<<<<<<< * except BaseException as ex: * pyparser._last_error = ex */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_header_field(__pyx_v_pyparser, __pyx_v_at, __pyx_v_length); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 717, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":711 * cdef HttpParser pyparser = parser.data * cdef Py_ssize_t size * try: # <<<<<<<<<<<<<< * pyparser._on_status_complete() * size = len(pyparser._raw_name) + length */ } /* "aiohttp/_http_parser.pyx":722 * return -1 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else:*/ { __pyx_r = 0; goto __pyx_L6_except_return; } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; /* "aiohttp/_http_parser.pyx":718 * 'Header name is too long', pyparser._max_field_size, size) * pyparser._on_header_field(at, length) * except BaseException as ex: # <<<<<<<<<<<<<< * pyparser._last_error = ex * return -1 */ __pyx_t_11 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_11) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_header_field", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_7, &__pyx_t_9) < 0) __PYX_ERR(0, 718, __pyx_L5_except_error) __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_7); __Pyx_XGOTREF(__pyx_t_9); __Pyx_INCREF(__pyx_t_7); __pyx_v_ex = __pyx_t_7; /*try:*/ { /* "aiohttp/_http_parser.pyx":719 * pyparser._on_header_field(at, length) * except BaseException as ex: * pyparser._last_error = ex # <<<<<<<<<<<<<< * return -1 * else: */ __Pyx_INCREF(__pyx_v_ex); __Pyx_GIVEREF(__pyx_v_ex); __Pyx_GOTREF(__pyx_v_pyparser->_last_error); __Pyx_DECREF(__pyx_v_pyparser->_last_error); __pyx_v_pyparser->_last_error = __pyx_v_ex; /* "aiohttp/_http_parser.pyx":720 * except BaseException as ex: * pyparser._last_error = ex * return -1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; goto __pyx_L14_return; } /* "aiohttp/_http_parser.pyx":718 * 'Header name is too long', pyparser._max_field_size, size) * pyparser._on_header_field(at, length) * except BaseException as ex: # <<<<<<<<<<<<<< * pyparser._last_error = ex * return -1 */ /*finally:*/ { __pyx_L14_return: { __pyx_t_11 = __pyx_r; __Pyx_DECREF(__pyx_v_ex); __pyx_v_ex = 0; __pyx_r = __pyx_t_11; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; /* "aiohttp/_http_parser.pyx":711 * cdef HttpParser pyparser = parser.data * cdef Py_ssize_t size * try: # <<<<<<<<<<<<<< * pyparser._on_status_complete() * size = len(pyparser._raw_name) + length */ __pyx_L5_except_error:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":707 * * * cdef int cb_on_header_field(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_header_field", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_ex); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":725 * * * cdef int cb_on_header_value(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_header_value(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; Py_ssize_t __pyx_v_size; PyObject *__pyx_v_ex = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; Py_ssize_t __pyx_t_5; int __pyx_t_6; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; int __pyx_t_11; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_header_value", 1); /* "aiohttp/_http_parser.pyx":727 * cdef int cb_on_header_value(cparser.llhttp_t* parser, * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * cdef Py_ssize_t size * try: */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":729 * cdef HttpParser pyparser = parser.data * cdef Py_ssize_t size * try: # <<<<<<<<<<<<<< * size = len(pyparser._raw_value) + length * if size > pyparser._max_field_size: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":730 * cdef Py_ssize_t size * try: * size = len(pyparser._raw_value) + length # <<<<<<<<<<<<<< * if size > pyparser._max_field_size: * raise LineTooLong( */ __pyx_t_1 = __pyx_v_pyparser->_raw_value; __Pyx_INCREF(__pyx_t_1); if (unlikely(__pyx_t_1 == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(0, 730, __pyx_L3_error) } __pyx_t_5 = __Pyx_PyByteArray_GET_SIZE(__pyx_t_1); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 730, __pyx_L3_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_size = (__pyx_t_5 + __pyx_v_length); /* "aiohttp/_http_parser.pyx":731 * try: * size = len(pyparser._raw_value) + length * if size > pyparser._max_field_size: # <<<<<<<<<<<<<< * raise LineTooLong( * 'Header value is too long', pyparser._max_field_size, size) */ __pyx_t_6 = (__pyx_v_size > __pyx_v_pyparser->_max_field_size); if (unlikely(__pyx_t_6)) { /* "aiohttp/_http_parser.pyx":732 * size = len(pyparser._raw_value) + length * if size > pyparser._max_field_size: * raise LineTooLong( # <<<<<<<<<<<<<< * 'Header value is too long', pyparser._max_field_size, size) * pyparser._on_header_value(at, length) */ __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 732, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_7); /* "aiohttp/_http_parser.pyx":733 * if size > pyparser._max_field_size: * raise LineTooLong( * 'Header value is too long', pyparser._max_field_size, size) # <<<<<<<<<<<<<< * pyparser._on_header_value(at, length) * except BaseException as ex: */ __pyx_t_8 = __Pyx_PyInt_FromSize_t(__pyx_v_pyparser->_max_field_size); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 733, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = PyInt_FromSsize_t(__pyx_v_size); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 733, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_9); __pyx_t_10 = NULL; __pyx_t_11 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_7))) { __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_10)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); __Pyx_INCREF(__pyx_t_10); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_7, function); __pyx_t_11 = 1; } } #endif { PyObject *__pyx_callargs[4] = {__pyx_t_10, __pyx_kp_u_Header_value_is_too_long, __pyx_t_8, __pyx_t_9}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_11, 3+__pyx_t_11); __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 732, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(0, 732, __pyx_L3_error) /* "aiohttp/_http_parser.pyx":731 * try: * size = len(pyparser._raw_value) + length * if size > pyparser._max_field_size: # <<<<<<<<<<<<<< * raise LineTooLong( * 'Header value is too long', pyparser._max_field_size, size) */ } /* "aiohttp/_http_parser.pyx":734 * raise LineTooLong( * 'Header value is too long', pyparser._max_field_size, size) * pyparser._on_header_value(at, length) # <<<<<<<<<<<<<< * except BaseException as ex: * pyparser._last_error = ex */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_header_value(__pyx_v_pyparser, __pyx_v_at, __pyx_v_length); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 734, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":729 * cdef HttpParser pyparser = parser.data * cdef Py_ssize_t size * try: # <<<<<<<<<<<<<< * size = len(pyparser._raw_value) + length * if size > pyparser._max_field_size: */ } /* "aiohttp/_http_parser.pyx":739 * return -1 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else:*/ { __pyx_r = 0; goto __pyx_L6_except_return; } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; /* "aiohttp/_http_parser.pyx":735 * 'Header value is too long', pyparser._max_field_size, size) * pyparser._on_header_value(at, length) * except BaseException as ex: # <<<<<<<<<<<<<< * pyparser._last_error = ex * return -1 */ __pyx_t_11 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_11) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_header_value", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_7, &__pyx_t_9) < 0) __PYX_ERR(0, 735, __pyx_L5_except_error) __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_7); __Pyx_XGOTREF(__pyx_t_9); __Pyx_INCREF(__pyx_t_7); __pyx_v_ex = __pyx_t_7; /*try:*/ { /* "aiohttp/_http_parser.pyx":736 * pyparser._on_header_value(at, length) * except BaseException as ex: * pyparser._last_error = ex # <<<<<<<<<<<<<< * return -1 * else: */ __Pyx_INCREF(__pyx_v_ex); __Pyx_GIVEREF(__pyx_v_ex); __Pyx_GOTREF(__pyx_v_pyparser->_last_error); __Pyx_DECREF(__pyx_v_pyparser->_last_error); __pyx_v_pyparser->_last_error = __pyx_v_ex; /* "aiohttp/_http_parser.pyx":737 * except BaseException as ex: * pyparser._last_error = ex * return -1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; goto __pyx_L14_return; } /* "aiohttp/_http_parser.pyx":735 * 'Header value is too long', pyparser._max_field_size, size) * pyparser._on_header_value(at, length) * except BaseException as ex: # <<<<<<<<<<<<<< * pyparser._last_error = ex * return -1 */ /*finally:*/ { __pyx_L14_return: { __pyx_t_11 = __pyx_r; __Pyx_DECREF(__pyx_v_ex); __pyx_v_ex = 0; __pyx_r = __pyx_t_11; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; /* "aiohttp/_http_parser.pyx":729 * cdef HttpParser pyparser = parser.data * cdef Py_ssize_t size * try: # <<<<<<<<<<<<<< * size = len(pyparser._raw_value) + length * if size > pyparser._max_field_size: */ __pyx_L5_except_error:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":725 * * * cdef int cb_on_header_value(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_header_value", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_ex); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":742 * * * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * try: */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_headers_complete(llhttp_t *__pyx_v_parser) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; PyObject *__pyx_v_exc = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; int __pyx_t_6; int __pyx_t_7; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_headers_complete", 1); /* "aiohttp/_http_parser.pyx":743 * * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * try: * pyparser._on_status_complete() */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":744 * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_status_complete() * pyparser._on_headers_complete() */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":745 * cdef HttpParser pyparser = parser.data * try: * pyparser._on_status_complete() # <<<<<<<<<<<<<< * pyparser._on_headers_complete() * except BaseException as exc: */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_status_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 745, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":746 * try: * pyparser._on_status_complete() * pyparser._on_headers_complete() # <<<<<<<<<<<<<< * except BaseException as exc: * pyparser._last_error = exc */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_headers_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 746, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":744 * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_status_complete() * pyparser._on_headers_complete() */ } /* "aiohttp/_http_parser.pyx":751 * return -1 * else: * if ( # <<<<<<<<<<<<<< * pyparser._cparser.upgrade or * pyparser._cparser.method == cparser.HTTP_CONNECT */ /*else:*/ { /* "aiohttp/_http_parser.pyx":752 * else: * if ( * pyparser._cparser.upgrade or # <<<<<<<<<<<<<< * pyparser._cparser.method == cparser.HTTP_CONNECT * ): */ __pyx_t_6 = (__pyx_v_pyparser->_cparser->upgrade != 0); if (!__pyx_t_6) { } else { __pyx_t_5 = __pyx_t_6; goto __pyx_L10_bool_binop_done; } /* "aiohttp/_http_parser.pyx":753 * if ( * pyparser._cparser.upgrade or * pyparser._cparser.method == cparser.HTTP_CONNECT # <<<<<<<<<<<<<< * ): * return 2 */ __pyx_t_6 = (__pyx_v_pyparser->_cparser->method == HTTP_CONNECT); __pyx_t_5 = __pyx_t_6; __pyx_L10_bool_binop_done:; /* "aiohttp/_http_parser.pyx":751 * return -1 * else: * if ( # <<<<<<<<<<<<<< * pyparser._cparser.upgrade or * pyparser._cparser.method == cparser.HTTP_CONNECT */ if (__pyx_t_5) { /* "aiohttp/_http_parser.pyx":755 * pyparser._cparser.method == cparser.HTTP_CONNECT * ): * return 2 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = 2; goto __pyx_L6_except_return; /* "aiohttp/_http_parser.pyx":751 * return -1 * else: * if ( # <<<<<<<<<<<<<< * pyparser._cparser.upgrade or * pyparser._cparser.method == cparser.HTTP_CONNECT */ } /* "aiohttp/_http_parser.pyx":757 * return 2 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else*/ { __pyx_r = 0; goto __pyx_L6_except_return; } } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":747 * pyparser._on_status_complete() * pyparser._on_headers_complete() * except BaseException as exc: # <<<<<<<<<<<<<< * pyparser._last_error = exc * return -1 */ __pyx_t_7 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_7) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_headers_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_8, &__pyx_t_9) < 0) __PYX_ERR(0, 747, __pyx_L5_except_error) __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_8); __Pyx_XGOTREF(__pyx_t_9); __Pyx_INCREF(__pyx_t_8); __pyx_v_exc = __pyx_t_8; /*try:*/ { /* "aiohttp/_http_parser.pyx":748 * pyparser._on_headers_complete() * except BaseException as exc: * pyparser._last_error = exc # <<<<<<<<<<<<<< * return -1 * else: */ __Pyx_INCREF(__pyx_v_exc); __Pyx_GIVEREF(__pyx_v_exc); __Pyx_GOTREF(__pyx_v_pyparser->_last_error); __Pyx_DECREF(__pyx_v_pyparser->_last_error); __pyx_v_pyparser->_last_error = __pyx_v_exc; /* "aiohttp/_http_parser.pyx":749 * except BaseException as exc: * pyparser._last_error = exc * return -1 # <<<<<<<<<<<<<< * else: * if ( */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; goto __pyx_L16_return; } /* "aiohttp/_http_parser.pyx":747 * pyparser._on_status_complete() * pyparser._on_headers_complete() * except BaseException as exc: # <<<<<<<<<<<<<< * pyparser._last_error = exc * return -1 */ /*finally:*/ { __pyx_L16_return: { __pyx_t_7 = __pyx_r; __Pyx_DECREF(__pyx_v_exc); __pyx_v_exc = 0; __pyx_r = __pyx_t_7; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; /* "aiohttp/_http_parser.pyx":744 * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_status_complete() * pyparser._on_headers_complete() */ __pyx_L5_except_error:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":742 * * * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * try: */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_headers_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_exc); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":760 * * * cdef int cb_on_body(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_body(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; PyObject *__pyx_v_body = 0; PyObject *__pyx_v_underlying_exc = NULL; PyObject *__pyx_v_reraised_exc = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; int __pyx_t_8; int __pyx_t_9; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; PyObject *__pyx_t_12 = NULL; int __pyx_t_13; char const *__pyx_t_14; PyObject *__pyx_t_15 = NULL; PyObject *__pyx_t_16 = NULL; PyObject *__pyx_t_17 = NULL; PyObject *__pyx_t_18 = NULL; PyObject *__pyx_t_19 = NULL; PyObject *__pyx_t_20 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_body", 1); /* "aiohttp/_http_parser.pyx":762 * cdef int cb_on_body(cparser.llhttp_t* parser, * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * cdef bytes body = at[:length] * try: */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":763 * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data * cdef bytes body = at[:length] # <<<<<<<<<<<<<< * try: * pyparser._payload.feed_data(body, length) */ __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_at + 0, __pyx_v_length - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 763, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_body = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":764 * cdef HttpParser pyparser = parser.data * cdef bytes body = at[:length] * try: # <<<<<<<<<<<<<< * pyparser._payload.feed_data(body, length) * except BaseException as underlying_exc: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":765 * cdef bytes body = at[:length] * try: * pyparser._payload.feed_data(body, length) # <<<<<<<<<<<<<< * except BaseException as underlying_exc: * reraised_exc = underlying_exc */ __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_pyparser->_payload, __pyx_n_s_feed_data); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 765, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = __Pyx_PyInt_FromSize_t(__pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 765, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_7 = NULL; __pyx_t_8 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_5))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); __Pyx_INCREF(__pyx_t_7); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_5, function); __pyx_t_8 = 1; } } #endif { PyObject *__pyx_callargs[3] = {__pyx_t_7, __pyx_v_body, __pyx_t_6}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_8, 2+__pyx_t_8); __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 765, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":764 * cdef HttpParser pyparser = parser.data * cdef bytes body = at[:length] * try: # <<<<<<<<<<<<<< * pyparser._payload.feed_data(body, length) * except BaseException as underlying_exc: */ } /* "aiohttp/_http_parser.pyx":776 * return -1 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else:*/ { __pyx_r = 0; goto __pyx_L6_except_return; } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; /* "aiohttp/_http_parser.pyx":766 * try: * pyparser._payload.feed_data(body, length) * except BaseException as underlying_exc: # <<<<<<<<<<<<<< * reraised_exc = underlying_exc * if pyparser._payload_exception is not None: */ __pyx_t_8 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_8) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_body", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_5, &__pyx_t_6) < 0) __PYX_ERR(0, 766, __pyx_L5_except_error) __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_5); __Pyx_XGOTREF(__pyx_t_6); __Pyx_INCREF(__pyx_t_5); __pyx_v_underlying_exc = __pyx_t_5; /*try:*/ { /* "aiohttp/_http_parser.pyx":767 * pyparser._payload.feed_data(body, length) * except BaseException as underlying_exc: * reraised_exc = underlying_exc # <<<<<<<<<<<<<< * if pyparser._payload_exception is not None: * reraised_exc = pyparser._payload_exception(str(underlying_exc)) */ __Pyx_INCREF(__pyx_v_underlying_exc); __pyx_v_reraised_exc = __pyx_v_underlying_exc; /* "aiohttp/_http_parser.pyx":768 * except BaseException as underlying_exc: * reraised_exc = underlying_exc * if pyparser._payload_exception is not None: # <<<<<<<<<<<<<< * reraised_exc = pyparser._payload_exception(str(underlying_exc)) * */ __pyx_t_9 = (__pyx_v_pyparser->_payload_exception != Py_None); if (__pyx_t_9) { /* "aiohttp/_http_parser.pyx":769 * reraised_exc = underlying_exc * if pyparser._payload_exception is not None: * reraised_exc = pyparser._payload_exception(str(underlying_exc)) # <<<<<<<<<<<<<< * * set_exception(pyparser._payload, reraised_exc, underlying_exc) */ __pyx_t_10 = __Pyx_PyObject_Str(__pyx_v_underlying_exc); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 769, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_10); __Pyx_INCREF(__pyx_v_pyparser->_payload_exception); __pyx_t_11 = __pyx_v_pyparser->_payload_exception; __pyx_t_12 = NULL; __pyx_t_8 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_11))) { __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_11); if (likely(__pyx_t_12)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11); __Pyx_INCREF(__pyx_t_12); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_11, function); __pyx_t_8 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_12, __pyx_t_10}; __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_11, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 769, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; } __Pyx_DECREF_SET(__pyx_v_reraised_exc, __pyx_t_7); __pyx_t_7 = 0; /* "aiohttp/_http_parser.pyx":768 * except BaseException as underlying_exc: * reraised_exc = underlying_exc * if pyparser._payload_exception is not None: # <<<<<<<<<<<<<< * reraised_exc = pyparser._payload_exception(str(underlying_exc)) * */ } /* "aiohttp/_http_parser.pyx":771 * reraised_exc = pyparser._payload_exception(str(underlying_exc)) * * set_exception(pyparser._payload, reraised_exc, underlying_exc) # <<<<<<<<<<<<<< * * pyparser._payload_error = 1 */ __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_set_exception); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 771, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_11); __pyx_t_10 = NULL; __pyx_t_8 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_11))) { __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_11); if (likely(__pyx_t_10)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11); __Pyx_INCREF(__pyx_t_10); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_11, function); __pyx_t_8 = 1; } } #endif { PyObject *__pyx_callargs[4] = {__pyx_t_10, __pyx_v_pyparser->_payload, __pyx_v_reraised_exc, __pyx_v_underlying_exc}; __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_11, __pyx_callargs+1-__pyx_t_8, 3+__pyx_t_8); __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 771, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; } __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; /* "aiohttp/_http_parser.pyx":773 * set_exception(pyparser._payload, reraised_exc, underlying_exc) * * pyparser._payload_error = 1 # <<<<<<<<<<<<<< * return -1 * else: */ __pyx_v_pyparser->_payload_error = 1; /* "aiohttp/_http_parser.pyx":774 * * pyparser._payload_error = 1 * return -1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; goto __pyx_L13_return; } /* "aiohttp/_http_parser.pyx":766 * try: * pyparser._payload.feed_data(body, length) * except BaseException as underlying_exc: # <<<<<<<<<<<<<< * reraised_exc = underlying_exc * if pyparser._payload_exception is not None: */ /*finally:*/ { __pyx_L14_error:; /*exception exit:*/{ __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_18, &__pyx_t_19, &__pyx_t_20); if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17) < 0)) __Pyx_ErrFetch(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17); __Pyx_XGOTREF(__pyx_t_15); __Pyx_XGOTREF(__pyx_t_16); __Pyx_XGOTREF(__pyx_t_17); __Pyx_XGOTREF(__pyx_t_18); __Pyx_XGOTREF(__pyx_t_19); __Pyx_XGOTREF(__pyx_t_20); __pyx_t_8 = __pyx_lineno; __pyx_t_13 = __pyx_clineno; __pyx_t_14 = __pyx_filename; { __Pyx_DECREF(__pyx_v_underlying_exc); __pyx_v_underlying_exc = 0; } if (PY_MAJOR_VERSION >= 3) { __Pyx_XGIVEREF(__pyx_t_18); __Pyx_XGIVEREF(__pyx_t_19); __Pyx_XGIVEREF(__pyx_t_20); __Pyx_ExceptionReset(__pyx_t_18, __pyx_t_19, __pyx_t_20); } __Pyx_XGIVEREF(__pyx_t_15); __Pyx_XGIVEREF(__pyx_t_16); __Pyx_XGIVEREF(__pyx_t_17); __Pyx_ErrRestore(__pyx_t_15, __pyx_t_16, __pyx_t_17); __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_lineno = __pyx_t_8; __pyx_clineno = __pyx_t_13; __pyx_filename = __pyx_t_14; goto __pyx_L5_except_error; } __pyx_L13_return: { __pyx_t_13 = __pyx_r; __Pyx_DECREF(__pyx_v_underlying_exc); __pyx_v_underlying_exc = 0; __pyx_r = __pyx_t_13; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; /* "aiohttp/_http_parser.pyx":764 * cdef HttpParser pyparser = parser.data * cdef bytes body = at[:length] * try: # <<<<<<<<<<<<<< * pyparser._payload.feed_data(body, length) * except BaseException as underlying_exc: */ __pyx_L5_except_error:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":760 * * * cdef int cb_on_body(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_11); __Pyx_XDECREF(__pyx_t_12); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_body", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_body); __Pyx_XDECREF(__pyx_v_underlying_exc); __Pyx_XDECREF(__pyx_v_reraised_exc); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":779 * * * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * try: */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_message_complete(llhttp_t *__pyx_v_parser) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; PyObject *__pyx_v_exc = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_message_complete", 1); /* "aiohttp/_http_parser.pyx":780 * * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * try: * pyparser._started = False */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":781 * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._started = False * pyparser._on_message_complete() */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":782 * cdef HttpParser pyparser = parser.data * try: * pyparser._started = False # <<<<<<<<<<<<<< * pyparser._on_message_complete() * except BaseException as exc: */ __pyx_v_pyparser->_started = 0; /* "aiohttp/_http_parser.pyx":783 * try: * pyparser._started = False * pyparser._on_message_complete() # <<<<<<<<<<<<<< * except BaseException as exc: * pyparser._last_error = exc */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_message_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 783, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":781 * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._started = False * pyparser._on_message_complete() */ } /* "aiohttp/_http_parser.pyx":788 * return -1 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else:*/ { __pyx_r = 0; goto __pyx_L6_except_return; } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":784 * pyparser._started = False * pyparser._on_message_complete() * except BaseException as exc: # <<<<<<<<<<<<<< * pyparser._last_error = exc * return -1 */ __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_5) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_message_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(0, 784, __pyx_L5_except_error) __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_6); __Pyx_XGOTREF(__pyx_t_7); __Pyx_INCREF(__pyx_t_6); __pyx_v_exc = __pyx_t_6; /*try:*/ { /* "aiohttp/_http_parser.pyx":785 * pyparser._on_message_complete() * except BaseException as exc: * pyparser._last_error = exc # <<<<<<<<<<<<<< * return -1 * else: */ __Pyx_INCREF(__pyx_v_exc); __Pyx_GIVEREF(__pyx_v_exc); __Pyx_GOTREF(__pyx_v_pyparser->_last_error); __Pyx_DECREF(__pyx_v_pyparser->_last_error); __pyx_v_pyparser->_last_error = __pyx_v_exc; /* "aiohttp/_http_parser.pyx":786 * except BaseException as exc: * pyparser._last_error = exc * return -1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; goto __pyx_L13_return; } /* "aiohttp/_http_parser.pyx":784 * pyparser._started = False * pyparser._on_message_complete() * except BaseException as exc: # <<<<<<<<<<<<<< * pyparser._last_error = exc * return -1 */ /*finally:*/ { __pyx_L13_return: { __pyx_t_5 = __pyx_r; __Pyx_DECREF(__pyx_v_exc); __pyx_v_exc = 0; __pyx_r = __pyx_t_5; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; /* "aiohttp/_http_parser.pyx":781 * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._started = False * pyparser._on_message_complete() */ __pyx_L5_except_error:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":779 * * * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * try: */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_message_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_exc); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":791 * * * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * try: */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_header(llhttp_t *__pyx_v_parser) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; PyObject *__pyx_v_exc = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_chunk_header", 1); /* "aiohttp/_http_parser.pyx":792 * * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * try: * pyparser._on_chunk_header() */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":793 * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_chunk_header() * except BaseException as exc: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":794 * cdef HttpParser pyparser = parser.data * try: * pyparser._on_chunk_header() # <<<<<<<<<<<<<< * except BaseException as exc: * pyparser._last_error = exc */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_chunk_header(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 794, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":793 * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_chunk_header() * except BaseException as exc: */ } /* "aiohttp/_http_parser.pyx":799 * return -1 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else:*/ { __pyx_r = 0; goto __pyx_L6_except_return; } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":795 * try: * pyparser._on_chunk_header() * except BaseException as exc: # <<<<<<<<<<<<<< * pyparser._last_error = exc * return -1 */ __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_5) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_chunk_header", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(0, 795, __pyx_L5_except_error) __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_6); __Pyx_XGOTREF(__pyx_t_7); __Pyx_INCREF(__pyx_t_6); __pyx_v_exc = __pyx_t_6; /*try:*/ { /* "aiohttp/_http_parser.pyx":796 * pyparser._on_chunk_header() * except BaseException as exc: * pyparser._last_error = exc # <<<<<<<<<<<<<< * return -1 * else: */ __Pyx_INCREF(__pyx_v_exc); __Pyx_GIVEREF(__pyx_v_exc); __Pyx_GOTREF(__pyx_v_pyparser->_last_error); __Pyx_DECREF(__pyx_v_pyparser->_last_error); __pyx_v_pyparser->_last_error = __pyx_v_exc; /* "aiohttp/_http_parser.pyx":797 * except BaseException as exc: * pyparser._last_error = exc * return -1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; goto __pyx_L13_return; } /* "aiohttp/_http_parser.pyx":795 * try: * pyparser._on_chunk_header() * except BaseException as exc: # <<<<<<<<<<<<<< * pyparser._last_error = exc * return -1 */ /*finally:*/ { __pyx_L13_return: { __pyx_t_5 = __pyx_r; __Pyx_DECREF(__pyx_v_exc); __pyx_v_exc = 0; __pyx_r = __pyx_t_5; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; /* "aiohttp/_http_parser.pyx":793 * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_chunk_header() * except BaseException as exc: */ __pyx_L5_except_error:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":791 * * * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * try: */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_chunk_header", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_exc); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":802 * * * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * try: */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_complete(llhttp_t *__pyx_v_parser) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; PyObject *__pyx_v_exc = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_chunk_complete", 1); /* "aiohttp/_http_parser.pyx":803 * * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * try: * pyparser._on_chunk_complete() */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":804 * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_chunk_complete() * except BaseException as exc: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":805 * cdef HttpParser pyparser = parser.data * try: * pyparser._on_chunk_complete() # <<<<<<<<<<<<<< * except BaseException as exc: * pyparser._last_error = exc */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_chunk_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 805, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":804 * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_chunk_complete() * except BaseException as exc: */ } /* "aiohttp/_http_parser.pyx":810 * return -1 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else:*/ { __pyx_r = 0; goto __pyx_L6_except_return; } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":806 * try: * pyparser._on_chunk_complete() * except BaseException as exc: # <<<<<<<<<<<<<< * pyparser._last_error = exc * return -1 */ __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_5) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_chunk_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(0, 806, __pyx_L5_except_error) __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_6); __Pyx_XGOTREF(__pyx_t_7); __Pyx_INCREF(__pyx_t_6); __pyx_v_exc = __pyx_t_6; /*try:*/ { /* "aiohttp/_http_parser.pyx":807 * pyparser._on_chunk_complete() * except BaseException as exc: * pyparser._last_error = exc # <<<<<<<<<<<<<< * return -1 * else: */ __Pyx_INCREF(__pyx_v_exc); __Pyx_GIVEREF(__pyx_v_exc); __Pyx_GOTREF(__pyx_v_pyparser->_last_error); __Pyx_DECREF(__pyx_v_pyparser->_last_error); __pyx_v_pyparser->_last_error = __pyx_v_exc; /* "aiohttp/_http_parser.pyx":808 * except BaseException as exc: * pyparser._last_error = exc * return -1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; goto __pyx_L13_return; } /* "aiohttp/_http_parser.pyx":806 * try: * pyparser._on_chunk_complete() * except BaseException as exc: # <<<<<<<<<<<<<< * pyparser._last_error = exc * return -1 */ /*finally:*/ { __pyx_L13_return: { __pyx_t_5 = __pyx_r; __Pyx_DECREF(__pyx_v_exc); __pyx_v_exc = 0; __pyx_r = __pyx_t_5; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; /* "aiohttp/_http_parser.pyx":804 * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_chunk_complete() * except BaseException as exc: */ __pyx_L5_except_error:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":802 * * * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * try: */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_chunk_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_exc); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":813 * * * cdef parser_error_from_errno(cparser.llhttp_t* parser, data, pointer): # <<<<<<<<<<<<<< * cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) * cdef bytes desc = cparser.llhttp_get_error_reason(parser) */ static PyObject *__pyx_f_7aiohttp_12_http_parser_parser_error_from_errno(llhttp_t *__pyx_v_parser, PyObject *__pyx_v_data, PyObject *__pyx_v_pointer) { llhttp_errno_t __pyx_v_errno; PyObject *__pyx_v_desc = 0; PyObject *__pyx_v_err_msg = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("parser_error_from_errno", 1); /* "aiohttp/_http_parser.pyx":814 * * cdef parser_error_from_errno(cparser.llhttp_t* parser, data, pointer): * cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) # <<<<<<<<<<<<<< * cdef bytes desc = cparser.llhttp_get_error_reason(parser) * */ __pyx_v_errno = llhttp_get_errno(__pyx_v_parser); /* "aiohttp/_http_parser.pyx":815 * cdef parser_error_from_errno(cparser.llhttp_t* parser, data, pointer): * cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) * cdef bytes desc = cparser.llhttp_get_error_reason(parser) # <<<<<<<<<<<<<< * * err_msg = "{}:\n\n {!r}\n {}".format(desc.decode("latin-1"), data, pointer) */ __pyx_t_1 = __Pyx_PyBytes_FromString(llhttp_get_error_reason(__pyx_v_parser)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 815, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_desc = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":817 * cdef bytes desc = cparser.llhttp_get_error_reason(parser) * * err_msg = "{}:\n\n {!r}\n {}".format(desc.decode("latin-1"), data, pointer) # <<<<<<<<<<<<<< * * if errno in {cparser.HPE_CB_MESSAGE_BEGIN, */ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_r, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 817, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_decode_bytes(__pyx_v_desc, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeLatin1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 817, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_5 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_2))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_5 = 1; } } #endif { PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_t_3, __pyx_v_data, __pyx_v_pointer}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 3+__pyx_t_5); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 817, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __pyx_v_err_msg = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":819 * err_msg = "{}:\n\n {!r}\n {}".format(desc.decode("latin-1"), data, pointer) * * if errno in {cparser.HPE_CB_MESSAGE_BEGIN, # <<<<<<<<<<<<<< * cparser.HPE_CB_HEADERS_COMPLETE, * cparser.HPE_CB_MESSAGE_COMPLETE, */ switch (__pyx_v_errno) { case HPE_CB_MESSAGE_BEGIN: case HPE_CB_HEADERS_COMPLETE: /* "aiohttp/_http_parser.pyx":820 * * if errno in {cparser.HPE_CB_MESSAGE_BEGIN, * cparser.HPE_CB_HEADERS_COMPLETE, # <<<<<<<<<<<<<< * cparser.HPE_CB_MESSAGE_COMPLETE, * cparser.HPE_CB_CHUNK_HEADER, */ case HPE_CB_MESSAGE_COMPLETE: /* "aiohttp/_http_parser.pyx":821 * if errno in {cparser.HPE_CB_MESSAGE_BEGIN, * cparser.HPE_CB_HEADERS_COMPLETE, * cparser.HPE_CB_MESSAGE_COMPLETE, # <<<<<<<<<<<<<< * cparser.HPE_CB_CHUNK_HEADER, * cparser.HPE_CB_CHUNK_COMPLETE, */ case HPE_CB_CHUNK_HEADER: /* "aiohttp/_http_parser.pyx":822 * cparser.HPE_CB_HEADERS_COMPLETE, * cparser.HPE_CB_MESSAGE_COMPLETE, * cparser.HPE_CB_CHUNK_HEADER, # <<<<<<<<<<<<<< * cparser.HPE_CB_CHUNK_COMPLETE, * cparser.HPE_INVALID_CONSTANT, */ case HPE_CB_CHUNK_COMPLETE: /* "aiohttp/_http_parser.pyx":823 * cparser.HPE_CB_MESSAGE_COMPLETE, * cparser.HPE_CB_CHUNK_HEADER, * cparser.HPE_CB_CHUNK_COMPLETE, # <<<<<<<<<<<<<< * cparser.HPE_INVALID_CONSTANT, * cparser.HPE_INVALID_HEADER_TOKEN, */ case HPE_INVALID_CONSTANT: /* "aiohttp/_http_parser.pyx":824 * cparser.HPE_CB_CHUNK_HEADER, * cparser.HPE_CB_CHUNK_COMPLETE, * cparser.HPE_INVALID_CONSTANT, # <<<<<<<<<<<<<< * cparser.HPE_INVALID_HEADER_TOKEN, * cparser.HPE_INVALID_CONTENT_LENGTH, */ case HPE_INVALID_HEADER_TOKEN: /* "aiohttp/_http_parser.pyx":825 * cparser.HPE_CB_CHUNK_COMPLETE, * cparser.HPE_INVALID_CONSTANT, * cparser.HPE_INVALID_HEADER_TOKEN, # <<<<<<<<<<<<<< * cparser.HPE_INVALID_CONTENT_LENGTH, * cparser.HPE_INVALID_CHUNK_SIZE, */ case HPE_INVALID_CONTENT_LENGTH: /* "aiohttp/_http_parser.pyx":826 * cparser.HPE_INVALID_CONSTANT, * cparser.HPE_INVALID_HEADER_TOKEN, * cparser.HPE_INVALID_CONTENT_LENGTH, # <<<<<<<<<<<<<< * cparser.HPE_INVALID_CHUNK_SIZE, * cparser.HPE_INVALID_EOF_STATE, */ case HPE_INVALID_CHUNK_SIZE: /* "aiohttp/_http_parser.pyx":827 * cparser.HPE_INVALID_HEADER_TOKEN, * cparser.HPE_INVALID_CONTENT_LENGTH, * cparser.HPE_INVALID_CHUNK_SIZE, # <<<<<<<<<<<<<< * cparser.HPE_INVALID_EOF_STATE, * cparser.HPE_INVALID_TRANSFER_ENCODING}: */ case HPE_INVALID_EOF_STATE: /* "aiohttp/_http_parser.pyx":828 * cparser.HPE_INVALID_CONTENT_LENGTH, * cparser.HPE_INVALID_CHUNK_SIZE, * cparser.HPE_INVALID_EOF_STATE, # <<<<<<<<<<<<<< * cparser.HPE_INVALID_TRANSFER_ENCODING}: * return BadHttpMessage(err_msg) */ case HPE_INVALID_TRANSFER_ENCODING: /* "aiohttp/_http_parser.pyx":830 * cparser.HPE_INVALID_EOF_STATE, * cparser.HPE_INVALID_TRANSFER_ENCODING}: * return BadHttpMessage(err_msg) # <<<<<<<<<<<<<< * elif errno in {cparser.HPE_INVALID_STATUS, * cparser.HPE_INVALID_METHOD, */ __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_BadHttpMessage); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 830, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; __pyx_t_5 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_5 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_err_msg}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 830, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":819 * err_msg = "{}:\n\n {!r}\n {}".format(desc.decode("latin-1"), data, pointer) * * if errno in {cparser.HPE_CB_MESSAGE_BEGIN, # <<<<<<<<<<<<<< * cparser.HPE_CB_HEADERS_COMPLETE, * cparser.HPE_CB_MESSAGE_COMPLETE, */ break; case HPE_INVALID_STATUS: /* "aiohttp/_http_parser.pyx":831 * cparser.HPE_INVALID_TRANSFER_ENCODING}: * return BadHttpMessage(err_msg) * elif errno in {cparser.HPE_INVALID_STATUS, # <<<<<<<<<<<<<< * cparser.HPE_INVALID_METHOD, * cparser.HPE_INVALID_VERSION}: */ case HPE_INVALID_METHOD: /* "aiohttp/_http_parser.pyx":832 * return BadHttpMessage(err_msg) * elif errno in {cparser.HPE_INVALID_STATUS, * cparser.HPE_INVALID_METHOD, # <<<<<<<<<<<<<< * cparser.HPE_INVALID_VERSION}: * return BadStatusLine(error=err_msg) */ case HPE_INVALID_VERSION: /* "aiohttp/_http_parser.pyx":834 * cparser.HPE_INVALID_METHOD, * cparser.HPE_INVALID_VERSION}: * return BadStatusLine(error=err_msg) # <<<<<<<<<<<<<< * elif errno == cparser.HPE_INVALID_URL: * return InvalidURLError(err_msg) */ __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_BadStatusLine); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 834, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 834, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_error, __pyx_v_err_msg) < 0) __PYX_ERR(0, 834, __pyx_L1_error) __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 834, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":831 * cparser.HPE_INVALID_TRANSFER_ENCODING}: * return BadHttpMessage(err_msg) * elif errno in {cparser.HPE_INVALID_STATUS, # <<<<<<<<<<<<<< * cparser.HPE_INVALID_METHOD, * cparser.HPE_INVALID_VERSION}: */ break; case HPE_INVALID_URL: /* "aiohttp/_http_parser.pyx":836 * return BadStatusLine(error=err_msg) * elif errno == cparser.HPE_INVALID_URL: * return InvalidURLError(err_msg) # <<<<<<<<<<<<<< * * return BadHttpMessage(err_msg) */ __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_InvalidURLError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 836, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = NULL; __pyx_t_5 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_1)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_5 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_v_err_msg}; __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 836, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":835 * cparser.HPE_INVALID_VERSION}: * return BadStatusLine(error=err_msg) * elif errno == cparser.HPE_INVALID_URL: # <<<<<<<<<<<<<< * return InvalidURLError(err_msg) * */ break; default: break; } /* "aiohttp/_http_parser.pyx":838 * return InvalidURLError(err_msg) * * return BadHttpMessage(err_msg) # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_BadHttpMessage); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 838, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = NULL; __pyx_t_5 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_1)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_5 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_1, __pyx_v_err_msg}; __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 838, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":813 * * * cdef parser_error_from_errno(cparser.llhttp_t* parser, data, pointer): # <<<<<<<<<<<<<< * cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) * cdef bytes desc = cparser.llhttp_get_error_reason(parser) */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("aiohttp._http_parser.parser_error_from_errno", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_desc); __Pyx_XDECREF(__pyx_v_err_msg); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __pyx_unpickle_RawRequestMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage = {"__pyx_unpickle_RawRequestMessage", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { PyObject *__pyx_v___pyx_type = 0; long __pyx_v___pyx_checksum; PyObject *__pyx_v___pyx_state = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[3] = {0,0,0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__pyx_unpickle_RawRequestMessage (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawRequestMessage", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawRequestMessage", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_RawRequestMessage") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 3)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); } __pyx_v___pyx_type = values[0]; __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) __pyx_v___pyx_state = values[2]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawRequestMessage", 1, 3, 3, __pyx_nargs); __PYX_ERR(1, 1, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawRequestMessage", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_v___pyx_PickleError = 0; PyObject *__pyx_v___pyx_result = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__pyx_unpickle_RawRequestMessage", 1); /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum not in (0xf602a9f, 0x03e51e3, 0x1408252): # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xf602a9f, 0x03e51e3, 0x1408252) = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum */ __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__11, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "(tree fragment)":5 * cdef object __pyx_result * if __pyx_checksum not in (0xf602a9f, 0x03e51e3, 0x1408252): * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xf602a9f, 0x03e51e3, 0x1408252) = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum * __pyx_result = RawRequestMessage.__new__(__pyx_type) */ __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_s_PickleError); __Pyx_GIVEREF(__pyx_n_s_PickleError); if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(1, 5, __pyx_L1_error); __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_t_1); __pyx_v___pyx_PickleError = __pyx_t_1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":6 * if __pyx_checksum not in (0xf602a9f, 0x03e51e3, 0x1408252): * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xf602a9f, 0x03e51e3, 0x1408252) = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum # <<<<<<<<<<<<<< * __pyx_result = RawRequestMessage.__new__(__pyx_type) * if __pyx_state is not None: */ __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(1, 6, __pyx_L1_error) /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum not in (0xf602a9f, 0x03e51e3, 0x1408252): # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xf602a9f, 0x03e51e3, 0x1408252) = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum */ } /* "(tree fragment)":7 * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xf602a9f, 0x03e51e3, 0x1408252) = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum * __pyx_result = RawRequestMessage.__new__(__pyx_type) # <<<<<<<<<<<<<< * if __pyx_state is not None: * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_5 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_5 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __pyx_v___pyx_result = __pyx_t_1; __pyx_t_1 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xf602a9f, 0x03e51e3, 0x1408252) = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum * __pyx_result = RawRequestMessage.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result */ __pyx_t_2 = (__pyx_v___pyx_state != Py_None); if (__pyx_t_2) { /* "(tree fragment)":9 * __pyx_result = RawRequestMessage.__new__(__pyx_type) * if __pyx_state is not None: * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< * return __pyx_result * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): */ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 9, __pyx_L1_error) __pyx_t_1 = __pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage__set_state(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xf602a9f, 0x03e51e3, 0x1408252) = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum * __pyx_result = RawRequestMessage.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result */ } /* "(tree fragment)":10 * if __pyx_state is not None: * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result # <<<<<<<<<<<<<< * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v___pyx_result); __pyx_r = __pyx_v___pyx_result; goto __pyx_L0; /* "(tree fragment)":1 * def __pyx_unpickle_RawRequestMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawRequestMessage", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v___pyx_PickleError); __Pyx_XDECREF(__pyx_v___pyx_result); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":11 * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): */ static PyObject *__pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage__set_state(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; Py_ssize_t __pyx_t_3; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; int __pyx_t_8; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__pyx_unpickle_RawRequestMessage__set_state", 1); /* "(tree fragment)":12 * return __pyx_result * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] # <<<<<<<<<<<<<< * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[10]) */ if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->chunked); __Pyx_DECREF(__pyx_v___pyx_result->chunked); __pyx_v___pyx_result->chunked = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->compression); __Pyx_DECREF(__pyx_v___pyx_result->compression); __pyx_v___pyx_result->compression = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->headers); __Pyx_DECREF(__pyx_v___pyx_result->headers); __pyx_v___pyx_result->headers = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (!(likely(PyUnicode_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("unicode", __pyx_t_1))) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->method); __Pyx_DECREF(__pyx_v___pyx_result->method); __pyx_v___pyx_result->method = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (!(likely(PyUnicode_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("unicode", __pyx_t_1))) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->path); __Pyx_DECREF(__pyx_v___pyx_result->path); __pyx_v___pyx_result->path = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->raw_headers); __Pyx_DECREF(__pyx_v___pyx_result->raw_headers); __pyx_v___pyx_result->raw_headers = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 6, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->should_close); __Pyx_DECREF(__pyx_v___pyx_result->should_close); __pyx_v___pyx_result->should_close = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 7, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->upgrade); __Pyx_DECREF(__pyx_v___pyx_result->upgrade); __pyx_v___pyx_result->upgrade = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 8, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->url); __Pyx_DECREF(__pyx_v___pyx_result->url); __pyx_v___pyx_result->url = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 9, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->version); __Pyx_DECREF(__pyx_v___pyx_result->version); __pyx_v___pyx_result->version = __pyx_t_1; __pyx_t_1 = 0; /* "(tree fragment)":13 * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< * __pyx_result.__dict__.update(__pyx_state[10]) */ if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(1, 13, __pyx_L1_error) } __pyx_t_3 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) __pyx_t_4 = (__pyx_t_3 > 10); if (__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) __pyx_t_2 = __pyx_t_4; __pyx_L4_bool_binop_done:; if (__pyx_t_2) { /* "(tree fragment)":14 * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[10]) # <<<<<<<<<<<<<< */ __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_update); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 14, __pyx_L1_error) } __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 10, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_7 = NULL; __pyx_t_8 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_6))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); __Pyx_INCREF(__pyx_t_7); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_6, function); __pyx_t_8 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_5}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":13 * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< * __pyx_result.__dict__.update(__pyx_state[10]) */ } /* "(tree fragment)":11 * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawRequestMessage__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __pyx_unpickle_RawResponseMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage = {"__pyx_unpickle_RawResponseMessage", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { PyObject *__pyx_v___pyx_type = 0; long __pyx_v___pyx_checksum; PyObject *__pyx_v___pyx_state = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[3] = {0,0,0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__pyx_unpickle_RawResponseMessage (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_type)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_checksum)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawResponseMessage", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawResponseMessage", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__pyx_unpickle_RawResponseMessage") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 3)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); } __pyx_v___pyx_type = values[0]; __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) __pyx_v___pyx_state = values[2]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawResponseMessage", 1, 3, 3, __pyx_nargs); __PYX_ERR(1, 1, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawResponseMessage", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_2__pyx_unpickle_RawResponseMessage(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_2__pyx_unpickle_RawResponseMessage(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_v___pyx_PickleError = 0; PyObject *__pyx_v___pyx_result = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__pyx_unpickle_RawResponseMessage", 1); /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum not in (0xcb2b2ba, 0x4febc0e, 0xc7706dc): # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xcb2b2ba, 0x4febc0e, 0xc7706dc) = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum */ __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__13, Py_NE)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "(tree fragment)":5 * cdef object __pyx_result * if __pyx_checksum not in (0xcb2b2ba, 0x4febc0e, 0xc7706dc): * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xcb2b2ba, 0x4febc0e, 0xc7706dc) = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum * __pyx_result = RawResponseMessage.__new__(__pyx_type) */ __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_s_PickleError); __Pyx_GIVEREF(__pyx_n_s_PickleError); if (__Pyx_PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError)) __PYX_ERR(1, 5, __pyx_L1_error); __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_t_1); __pyx_v___pyx_PickleError = __pyx_t_1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":6 * if __pyx_checksum not in (0xcb2b2ba, 0x4febc0e, 0xc7706dc): * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xcb2b2ba, 0x4febc0e, 0xc7706dc) = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum # <<<<<<<<<<<<<< * __pyx_result = RawResponseMessage.__new__(__pyx_type) * if __pyx_state is not None: */ __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_Raise(__pyx_v___pyx_PickleError, __pyx_t_1, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(1, 6, __pyx_L1_error) /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum not in (0xcb2b2ba, 0x4febc0e, 0xc7706dc): # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xcb2b2ba, 0x4febc0e, 0xc7706dc) = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum */ } /* "(tree fragment)":7 * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xcb2b2ba, 0x4febc0e, 0xc7706dc) = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum * __pyx_result = RawResponseMessage.__new__(__pyx_type) # <<<<<<<<<<<<<< * if __pyx_state is not None: * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage), __pyx_n_s_new); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_5 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_5 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v___pyx_type}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __pyx_v___pyx_result = __pyx_t_1; __pyx_t_1 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xcb2b2ba, 0x4febc0e, 0xc7706dc) = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum * __pyx_result = RawResponseMessage.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result */ __pyx_t_2 = (__pyx_v___pyx_state != Py_None); if (__pyx_t_2) { /* "(tree fragment)":9 * __pyx_result = RawResponseMessage.__new__(__pyx_type) * if __pyx_state is not None: * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< * return __pyx_result * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): */ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None) || __Pyx_RaiseUnexpectedTypeError("tuple", __pyx_v___pyx_state))) __PYX_ERR(1, 9, __pyx_L1_error) __pyx_t_1 = __pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawResponseMessage__set_state(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xcb2b2ba, 0x4febc0e, 0xc7706dc) = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum * __pyx_result = RawResponseMessage.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result */ } /* "(tree fragment)":10 * if __pyx_state is not None: * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result # <<<<<<<<<<<<<< * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v___pyx_result); __pyx_r = __pyx_v___pyx_result; goto __pyx_L0; /* "(tree fragment)":1 * def __pyx_unpickle_RawResponseMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawResponseMessage", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v___pyx_PickleError); __Pyx_XDECREF(__pyx_v___pyx_result); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":11 * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): */ static PyObject *__pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawResponseMessage__set_state(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; int __pyx_t_3; Py_ssize_t __pyx_t_4; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__pyx_unpickle_RawResponseMessage__set_state", 1); /* "(tree fragment)":12 * return __pyx_result * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] # <<<<<<<<<<<<<< * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[9]) */ if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->chunked); __Pyx_DECREF(__pyx_v___pyx_result->chunked); __pyx_v___pyx_result->chunked = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v___pyx_result->code = __pyx_t_2; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->compression); __Pyx_DECREF(__pyx_v___pyx_result->compression); __pyx_v___pyx_result->compression = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->headers); __Pyx_DECREF(__pyx_v___pyx_result->headers); __pyx_v___pyx_result->headers = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->raw_headers); __Pyx_DECREF(__pyx_v___pyx_result->raw_headers); __pyx_v___pyx_result->raw_headers = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (!(likely(PyUnicode_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("unicode", __pyx_t_1))) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->reason); __Pyx_DECREF(__pyx_v___pyx_result->reason); __pyx_v___pyx_result->reason = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 6, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->should_close); __Pyx_DECREF(__pyx_v___pyx_result->should_close); __pyx_v___pyx_result->should_close = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 7, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->upgrade); __Pyx_DECREF(__pyx_v___pyx_result->upgrade); __pyx_v___pyx_result->upgrade = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 8, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->version); __Pyx_DECREF(__pyx_v___pyx_result->version); __pyx_v___pyx_result->version = __pyx_t_1; __pyx_t_1 = 0; /* "(tree fragment)":13 * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< * __pyx_result.__dict__.update(__pyx_state[9]) */ if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(1, 13, __pyx_L1_error) } __pyx_t_4 = __Pyx_PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) __pyx_t_5 = (__pyx_t_4 > 9); if (__pyx_t_5) { } else { __pyx_t_3 = __pyx_t_5; goto __pyx_L4_bool_binop_done; } __pyx_t_5 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) __pyx_t_3 = __pyx_t_5; __pyx_L4_bool_binop_done:; if (__pyx_t_3) { /* "(tree fragment)":14 * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[9]) # <<<<<<<<<<<<<< */ __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 14, __pyx_L1_error) } __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 9, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_8 = NULL; __pyx_t_2 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_7))) { __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_8)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); __Pyx_INCREF(__pyx_t_8); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_7, function); __pyx_t_2 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_8, __pyx_t_6}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_2, 1+__pyx_t_2); __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":13 * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< * __pyx_result.__dict__.update(__pyx_state[9]) */ } /* "(tree fragment)":11 * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawResponseMessage__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_freelist_7aiohttp_12_http_parser_RawRequestMessage[250]; static int __pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage = 0; static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_RawRequestMessage(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *p; PyObject *o; #if CYTHON_COMPILING_IN_LIMITED_API allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); o = alloc_func(t, 0); #else #if CYTHON_COMPILING_IN_CPYTHON if (likely((int)(__pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage)) & (int)(!__Pyx_PyType_HasFeature(t, (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE))))) { o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser_RawRequestMessage[--__pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage]; memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage)); (void) PyObject_INIT(o, t); PyObject_GC_Track(o); } else #endif { if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { o = (*t->tp_alloc)(t, 0); } else { o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); } if (unlikely(!o)) return 0; } #endif p = ((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o); p->method = ((PyObject*)Py_None); Py_INCREF(Py_None); p->path = ((PyObject*)Py_None); Py_INCREF(Py_None); p->version = Py_None; Py_INCREF(Py_None); p->headers = Py_None; Py_INCREF(Py_None); p->raw_headers = Py_None; Py_INCREF(Py_None); p->should_close = Py_None; Py_INCREF(Py_None); p->compression = Py_None; Py_INCREF(Py_None); p->upgrade = Py_None; Py_INCREF(Py_None); p->chunked = Py_None; Py_INCREF(Py_None); p->url = Py_None; Py_INCREF(Py_None); return o; } static void __pyx_tp_dealloc_7aiohttp_12_http_parser_RawRequestMessage(PyObject *o) { struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o; #if CYTHON_USE_TP_FINALIZE if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7aiohttp_12_http_parser_RawRequestMessage) { if (PyObject_CallFinalizerFromDealloc(o)) return; } } #endif PyObject_GC_UnTrack(o); Py_CLEAR(p->method); Py_CLEAR(p->path); Py_CLEAR(p->version); Py_CLEAR(p->headers); Py_CLEAR(p->raw_headers); Py_CLEAR(p->should_close); Py_CLEAR(p->compression); Py_CLEAR(p->upgrade); Py_CLEAR(p->chunked); Py_CLEAR(p->url); #if CYTHON_COMPILING_IN_CPYTHON if (((int)(__pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage < 250) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage)) & (int)(!__Pyx_PyType_HasFeature(Py_TYPE(o), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE))))) { __pyx_freelist_7aiohttp_12_http_parser_RawRequestMessage[__pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage++] = ((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o); } else #endif { #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY (*Py_TYPE(o)->tp_free)(o); #else { freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); if (tp_free) tp_free(o); } #endif } } static int __pyx_tp_traverse_7aiohttp_12_http_parser_RawRequestMessage(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o; if (p->version) { e = (*v)(p->version, a); if (e) return e; } if (p->headers) { e = (*v)(p->headers, a); if (e) return e; } if (p->raw_headers) { e = (*v)(p->raw_headers, a); if (e) return e; } if (p->should_close) { e = (*v)(p->should_close, a); if (e) return e; } if (p->compression) { e = (*v)(p->compression, a); if (e) return e; } if (p->upgrade) { e = (*v)(p->upgrade, a); if (e) return e; } if (p->chunked) { e = (*v)(p->chunked, a); if (e) return e; } if (p->url) { e = (*v)(p->url, a); if (e) return e; } return 0; } static int __pyx_tp_clear_7aiohttp_12_http_parser_RawRequestMessage(PyObject *o) { PyObject* tmp; struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o; tmp = ((PyObject*)p->version); p->version = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->headers); p->headers = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->raw_headers); p->raw_headers = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->should_close); p->should_close = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->compression); p->compression = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->upgrade); p->upgrade = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->chunked); p->chunked = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->url); p->url = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); return 0; } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_method(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_6method_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_path(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_4path_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_version(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7version_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_headers(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7headers_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_raw_headers(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_should_close(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_12should_close_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_compression(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11compression_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_upgrade(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_chunked(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7chunked_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_url(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3url_1__get__(o); } static PyObject *__pyx_specialmethod___pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3__repr__(PyObject *self, CYTHON_UNUSED PyObject *arg) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3__repr__(self); } static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_RawRequestMessage[] = { {"__repr__", (PyCFunction)__pyx_specialmethod___pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3__repr__, METH_NOARGS|METH_COEXIST, 0}, {"_replace", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_5_replace, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_9__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {0, 0, 0, 0} }; static struct PyGetSetDef __pyx_getsets_7aiohttp_12_http_parser_RawRequestMessage[] = { {(char *)"method", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_method, 0, (char *)0, 0}, {(char *)"path", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_path, 0, (char *)0, 0}, {(char *)"version", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_version, 0, (char *)0, 0}, {(char *)"headers", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_headers, 0, (char *)0, 0}, {(char *)"raw_headers", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_raw_headers, 0, (char *)0, 0}, {(char *)"should_close", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_should_close, 0, (char *)0, 0}, {(char *)"compression", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_compression, 0, (char *)0, 0}, {(char *)"upgrade", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_upgrade, 0, (char *)0, 0}, {(char *)"chunked", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_chunked, 0, (char *)0, 0}, {(char *)"url", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_url, 0, (char *)0, 0}, {0, 0, 0, 0, 0} }; #if CYTHON_USE_TYPE_SPECS static PyType_Slot __pyx_type_7aiohttp_12_http_parser_RawRequestMessage_slots[] = { {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7aiohttp_12_http_parser_RawRequestMessage}, {Py_tp_repr, (void *)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3__repr__}, {Py_tp_traverse, (void *)__pyx_tp_traverse_7aiohttp_12_http_parser_RawRequestMessage}, {Py_tp_clear, (void *)__pyx_tp_clear_7aiohttp_12_http_parser_RawRequestMessage}, {Py_tp_methods, (void *)__pyx_methods_7aiohttp_12_http_parser_RawRequestMessage}, {Py_tp_getset, (void *)__pyx_getsets_7aiohttp_12_http_parser_RawRequestMessage}, {Py_tp_init, (void *)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_1__init__}, {Py_tp_new, (void *)__pyx_tp_new_7aiohttp_12_http_parser_RawRequestMessage}, {0, 0}, }; static PyType_Spec __pyx_type_7aiohttp_12_http_parser_RawRequestMessage_spec = { "aiohttp._http_parser.RawRequestMessage", sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage), 0, Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, __pyx_type_7aiohttp_12_http_parser_RawRequestMessage_slots, }; #else static PyTypeObject __pyx_type_7aiohttp_12_http_parser_RawRequestMessage = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._http_parser.""RawRequestMessage", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_12_http_parser_RawRequestMessage, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3__repr__, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_7aiohttp_12_http_parser_RawRequestMessage, /*tp_traverse*/ __pyx_tp_clear_7aiohttp_12_http_parser_RawRequestMessage, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7aiohttp_12_http_parser_RawRequestMessage, /*tp_methods*/ 0, /*tp_members*/ __pyx_getsets_7aiohttp_12_http_parser_RawRequestMessage, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ #if !CYTHON_USE_TYPE_SPECS 0, /*tp_dictoffset*/ #endif __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_12_http_parser_RawRequestMessage, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 #if CYTHON_USE_TP_FINALIZE 0, /*tp_finalize*/ #else NULL, /*tp_finalize*/ #endif #endif #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, /*tp_vectorcall*/ #endif #if __PYX_NEED_TP_PRINT_SLOT == 1 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030C0000 0, /*tp_watched*/ #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 0, /*tp_pypy_flags*/ #endif }; #endif static struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_freelist_7aiohttp_12_http_parser_RawResponseMessage[250]; static int __pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage = 0; static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_RawResponseMessage(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *p; PyObject *o; #if CYTHON_COMPILING_IN_LIMITED_API allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); o = alloc_func(t, 0); #else #if CYTHON_COMPILING_IN_CPYTHON if (likely((int)(__pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage)) & (int)(!__Pyx_PyType_HasFeature(t, (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE))))) { o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser_RawResponseMessage[--__pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage]; memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage)); (void) PyObject_INIT(o, t); PyObject_GC_Track(o); } else #endif { if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { o = (*t->tp_alloc)(t, 0); } else { o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); } if (unlikely(!o)) return 0; } #endif p = ((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o); p->version = Py_None; Py_INCREF(Py_None); p->reason = ((PyObject*)Py_None); Py_INCREF(Py_None); p->headers = Py_None; Py_INCREF(Py_None); p->raw_headers = Py_None; Py_INCREF(Py_None); p->should_close = Py_None; Py_INCREF(Py_None); p->compression = Py_None; Py_INCREF(Py_None); p->upgrade = Py_None; Py_INCREF(Py_None); p->chunked = Py_None; Py_INCREF(Py_None); return o; } static void __pyx_tp_dealloc_7aiohttp_12_http_parser_RawResponseMessage(PyObject *o) { struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o; #if CYTHON_USE_TP_FINALIZE if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7aiohttp_12_http_parser_RawResponseMessage) { if (PyObject_CallFinalizerFromDealloc(o)) return; } } #endif PyObject_GC_UnTrack(o); Py_CLEAR(p->version); Py_CLEAR(p->reason); Py_CLEAR(p->headers); Py_CLEAR(p->raw_headers); Py_CLEAR(p->should_close); Py_CLEAR(p->compression); Py_CLEAR(p->upgrade); Py_CLEAR(p->chunked); #if CYTHON_COMPILING_IN_CPYTHON if (((int)(__pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage < 250) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage)) & (int)(!__Pyx_PyType_HasFeature(Py_TYPE(o), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE))))) { __pyx_freelist_7aiohttp_12_http_parser_RawResponseMessage[__pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage++] = ((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o); } else #endif { #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY (*Py_TYPE(o)->tp_free)(o); #else { freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); if (tp_free) tp_free(o); } #endif } } static int __pyx_tp_traverse_7aiohttp_12_http_parser_RawResponseMessage(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o; if (p->version) { e = (*v)(p->version, a); if (e) return e; } if (p->headers) { e = (*v)(p->headers, a); if (e) return e; } if (p->raw_headers) { e = (*v)(p->raw_headers, a); if (e) return e; } if (p->should_close) { e = (*v)(p->should_close, a); if (e) return e; } if (p->compression) { e = (*v)(p->compression, a); if (e) return e; } if (p->upgrade) { e = (*v)(p->upgrade, a); if (e) return e; } if (p->chunked) { e = (*v)(p->chunked, a); if (e) return e; } return 0; } static int __pyx_tp_clear_7aiohttp_12_http_parser_RawResponseMessage(PyObject *o) { PyObject* tmp; struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o; tmp = ((PyObject*)p->version); p->version = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->headers); p->headers = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->raw_headers); p->raw_headers = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->should_close); p->should_close = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->compression); p->compression = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->upgrade); p->upgrade = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->chunked); p->chunked = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); return 0; } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_version(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7version_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_code(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_4code_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_reason(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_6reason_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_headers(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7headers_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_raw_headers(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_should_close(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_12should_close_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_compression(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11compression_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_upgrade(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_chunked(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7chunked_1__get__(o); } static PyObject *__pyx_specialmethod___pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_3__repr__(PyObject *self, CYTHON_UNUSED PyObject *arg) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_3__repr__(self); } static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_RawResponseMessage[] = { {"__repr__", (PyCFunction)__pyx_specialmethod___pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_3__repr__, METH_NOARGS|METH_COEXIST, 0}, {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_5__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {0, 0, 0, 0} }; static struct PyGetSetDef __pyx_getsets_7aiohttp_12_http_parser_RawResponseMessage[] = { {(char *)"version", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_version, 0, (char *)0, 0}, {(char *)"code", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_code, 0, (char *)0, 0}, {(char *)"reason", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_reason, 0, (char *)0, 0}, {(char *)"headers", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_headers, 0, (char *)0, 0}, {(char *)"raw_headers", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_raw_headers, 0, (char *)0, 0}, {(char *)"should_close", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_should_close, 0, (char *)0, 0}, {(char *)"compression", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_compression, 0, (char *)0, 0}, {(char *)"upgrade", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_upgrade, 0, (char *)0, 0}, {(char *)"chunked", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_chunked, 0, (char *)0, 0}, {0, 0, 0, 0, 0} }; #if CYTHON_USE_TYPE_SPECS static PyType_Slot __pyx_type_7aiohttp_12_http_parser_RawResponseMessage_slots[] = { {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7aiohttp_12_http_parser_RawResponseMessage}, {Py_tp_repr, (void *)__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_3__repr__}, {Py_tp_traverse, (void *)__pyx_tp_traverse_7aiohttp_12_http_parser_RawResponseMessage}, {Py_tp_clear, (void *)__pyx_tp_clear_7aiohttp_12_http_parser_RawResponseMessage}, {Py_tp_methods, (void *)__pyx_methods_7aiohttp_12_http_parser_RawResponseMessage}, {Py_tp_getset, (void *)__pyx_getsets_7aiohttp_12_http_parser_RawResponseMessage}, {Py_tp_init, (void *)__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_1__init__}, {Py_tp_new, (void *)__pyx_tp_new_7aiohttp_12_http_parser_RawResponseMessage}, {0, 0}, }; static PyType_Spec __pyx_type_7aiohttp_12_http_parser_RawResponseMessage_spec = { "aiohttp._http_parser.RawResponseMessage", sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage), 0, Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, __pyx_type_7aiohttp_12_http_parser_RawResponseMessage_slots, }; #else static PyTypeObject __pyx_type_7aiohttp_12_http_parser_RawResponseMessage = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._http_parser.""RawResponseMessage", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_12_http_parser_RawResponseMessage, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_3__repr__, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_7aiohttp_12_http_parser_RawResponseMessage, /*tp_traverse*/ __pyx_tp_clear_7aiohttp_12_http_parser_RawResponseMessage, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7aiohttp_12_http_parser_RawResponseMessage, /*tp_methods*/ 0, /*tp_members*/ __pyx_getsets_7aiohttp_12_http_parser_RawResponseMessage, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ #if !CYTHON_USE_TYPE_SPECS 0, /*tp_dictoffset*/ #endif __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_12_http_parser_RawResponseMessage, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 #if CYTHON_USE_TP_FINALIZE 0, /*tp_finalize*/ #else NULL, /*tp_finalize*/ #endif #endif #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, /*tp_vectorcall*/ #endif #if __PYX_NEED_TP_PRINT_SLOT == 1 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030C0000 0, /*tp_watched*/ #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 0, /*tp_pypy_flags*/ #endif }; #endif static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser __pyx_vtable_7aiohttp_12_http_parser_HttpParser; static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_HttpParser(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *p; PyObject *o; #if CYTHON_COMPILING_IN_LIMITED_API allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); o = alloc_func(t, 0); #else if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { o = (*t->tp_alloc)(t, 0); } else { o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); } if (unlikely(!o)) return 0; #endif p = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)o); p->__pyx_vtab = __pyx_vtabptr_7aiohttp_12_http_parser_HttpParser; p->_raw_name = ((PyObject*)Py_None); Py_INCREF(Py_None); p->_raw_value = ((PyObject*)Py_None); Py_INCREF(Py_None); p->_protocol = Py_None; Py_INCREF(Py_None); p->_loop = Py_None; Py_INCREF(Py_None); p->_timer = Py_None; Py_INCREF(Py_None); p->_url = Py_None; Py_INCREF(Py_None); p->_buf = ((PyObject*)Py_None); Py_INCREF(Py_None); p->_path = ((PyObject*)Py_None); Py_INCREF(Py_None); p->_reason = ((PyObject*)Py_None); Py_INCREF(Py_None); p->_headers = Py_None; Py_INCREF(Py_None); p->_raw_headers = ((PyObject*)Py_None); Py_INCREF(Py_None); p->_messages = ((PyObject*)Py_None); Py_INCREF(Py_None); p->_payload = Py_None; Py_INCREF(Py_None); p->_payload_exception = Py_None; Py_INCREF(Py_None); p->_last_error = Py_None; Py_INCREF(Py_None); p->_content_encoding = ((PyObject*)Py_None); Py_INCREF(Py_None); p->py_buf.obj = NULL; if (unlikely(__pyx_pw_7aiohttp_12_http_parser_10HttpParser_1__cinit__(o, __pyx_empty_tuple, NULL) < 0)) goto bad; return o; bad: Py_DECREF(o); o = 0; return NULL; } static void __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser(PyObject *o) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *p = (struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)o; #if CYTHON_USE_TP_FINALIZE if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser) { if (PyObject_CallFinalizerFromDealloc(o)) return; } } #endif PyObject_GC_UnTrack(o); { PyObject *etype, *eval, *etb; PyErr_Fetch(&etype, &eval, &etb); __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); __pyx_pw_7aiohttp_12_http_parser_10HttpParser_3__dealloc__(o); __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); PyErr_Restore(etype, eval, etb); } Py_CLEAR(p->_raw_name); Py_CLEAR(p->_raw_value); Py_CLEAR(p->_protocol); Py_CLEAR(p->_loop); Py_CLEAR(p->_timer); Py_CLEAR(p->_url); Py_CLEAR(p->_buf); Py_CLEAR(p->_path); Py_CLEAR(p->_reason); Py_CLEAR(p->_headers); Py_CLEAR(p->_raw_headers); Py_CLEAR(p->_messages); Py_CLEAR(p->_payload); Py_CLEAR(p->_payload_exception); Py_CLEAR(p->_last_error); Py_CLEAR(p->_content_encoding); #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY (*Py_TYPE(o)->tp_free)(o); #else { freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); if (tp_free) tp_free(o); } #endif } static int __pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *p = (struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)o; if (p->_protocol) { e = (*v)(p->_protocol, a); if (e) return e; } if (p->_loop) { e = (*v)(p->_loop, a); if (e) return e; } if (p->_timer) { e = (*v)(p->_timer, a); if (e) return e; } if (p->_url) { e = (*v)(p->_url, a); if (e) return e; } if (p->_headers) { e = (*v)(p->_headers, a); if (e) return e; } if (p->_raw_headers) { e = (*v)(p->_raw_headers, a); if (e) return e; } if (p->_messages) { e = (*v)(p->_messages, a); if (e) return e; } if (p->_payload) { e = (*v)(p->_payload, a); if (e) return e; } if (p->_payload_exception) { e = (*v)(p->_payload_exception, a); if (e) return e; } if (p->_last_error) { e = (*v)(p->_last_error, a); if (e) return e; } if (p->py_buf.obj) { e = (*v)(p->py_buf.obj, a); if (e) return e; } return 0; } static int __pyx_tp_clear_7aiohttp_12_http_parser_HttpParser(PyObject *o) { PyObject* tmp; struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *p = (struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)o; tmp = ((PyObject*)p->_protocol); p->_protocol = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_loop); p->_loop = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_timer); p->_timer = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_url); p->_url = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_headers); p->_headers = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_raw_headers); p->_raw_headers = ((PyObject*)Py_None); Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_messages); p->_messages = ((PyObject*)Py_None); Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_payload); p->_payload = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_payload_exception); p->_payload_exception = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_last_error); p->_last_error = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); Py_CLEAR(p->py_buf.obj); return 0; } static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_HttpParser[] = { {"feed_eof", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_5feed_eof, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {"feed_data", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_7feed_data, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {"set_upgraded", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_9set_upgraded, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_11__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_13__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {0, 0, 0, 0} }; #if CYTHON_USE_TYPE_SPECS static PyType_Slot __pyx_type_7aiohttp_12_http_parser_HttpParser_slots[] = { {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser}, {Py_tp_traverse, (void *)__pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser}, {Py_tp_clear, (void *)__pyx_tp_clear_7aiohttp_12_http_parser_HttpParser}, {Py_tp_methods, (void *)__pyx_methods_7aiohttp_12_http_parser_HttpParser}, {Py_tp_new, (void *)__pyx_tp_new_7aiohttp_12_http_parser_HttpParser}, {0, 0}, }; static PyType_Spec __pyx_type_7aiohttp_12_http_parser_HttpParser_spec = { "aiohttp._http_parser.HttpParser", sizeof(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser), 0, Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, __pyx_type_7aiohttp_12_http_parser_HttpParser_slots, }; #else static PyTypeObject __pyx_type_7aiohttp_12_http_parser_HttpParser = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._http_parser.""HttpParser", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser, /*tp_traverse*/ __pyx_tp_clear_7aiohttp_12_http_parser_HttpParser, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7aiohttp_12_http_parser_HttpParser, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ #if !CYTHON_USE_TYPE_SPECS 0, /*tp_dictoffset*/ #endif 0, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_12_http_parser_HttpParser, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 #if CYTHON_USE_TP_FINALIZE 0, /*tp_finalize*/ #else NULL, /*tp_finalize*/ #endif #endif #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, /*tp_vectorcall*/ #endif #if __PYX_NEED_TP_PRINT_SLOT == 1 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030C0000 0, /*tp_watched*/ #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 0, /*tp_pypy_flags*/ #endif }; #endif static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpRequestParser __pyx_vtable_7aiohttp_12_http_parser_HttpRequestParser; static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_HttpRequestParser(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *p; PyObject *o = __pyx_tp_new_7aiohttp_12_http_parser_HttpParser(t, a, k); if (unlikely(!o)) return 0; p = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *)o); p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser*)__pyx_vtabptr_7aiohttp_12_http_parser_HttpRequestParser; return o; } static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_HttpRequestParser[] = { {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {0, 0, 0, 0} }; #if CYTHON_USE_TYPE_SPECS static PyType_Slot __pyx_type_7aiohttp_12_http_parser_HttpRequestParser_slots[] = { {Py_tp_traverse, (void *)__pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser}, {Py_tp_clear, (void *)__pyx_tp_clear_7aiohttp_12_http_parser_HttpParser}, {Py_tp_methods, (void *)__pyx_methods_7aiohttp_12_http_parser_HttpRequestParser}, {Py_tp_init, (void *)__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_1__init__}, {Py_tp_new, (void *)__pyx_tp_new_7aiohttp_12_http_parser_HttpRequestParser}, {0, 0}, }; static PyType_Spec __pyx_type_7aiohttp_12_http_parser_HttpRequestParser_spec = { "aiohttp._http_parser.HttpRequestParser", sizeof(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser), 0, Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, __pyx_type_7aiohttp_12_http_parser_HttpRequestParser_slots, }; #else static PyTypeObject __pyx_type_7aiohttp_12_http_parser_HttpRequestParser = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._http_parser.""HttpRequestParser", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser, /*tp_traverse*/ __pyx_tp_clear_7aiohttp_12_http_parser_HttpParser, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7aiohttp_12_http_parser_HttpRequestParser, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ #if !CYTHON_USE_TYPE_SPECS 0, /*tp_dictoffset*/ #endif __pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_12_http_parser_HttpRequestParser, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 #if CYTHON_USE_TP_FINALIZE 0, /*tp_finalize*/ #else NULL, /*tp_finalize*/ #endif #endif #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, /*tp_vectorcall*/ #endif #if __PYX_NEED_TP_PRINT_SLOT == 1 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030C0000 0, /*tp_watched*/ #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 0, /*tp_pypy_flags*/ #endif }; #endif static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpResponseParser __pyx_vtable_7aiohttp_12_http_parser_HttpResponseParser; static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_HttpResponseParser(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *p; PyObject *o = __pyx_tp_new_7aiohttp_12_http_parser_HttpParser(t, a, k); if (unlikely(!o)) return 0; p = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *)o); p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser*)__pyx_vtabptr_7aiohttp_12_http_parser_HttpResponseParser; return o; } static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_HttpResponseParser[] = { {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_3__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_5__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {0, 0, 0, 0} }; #if CYTHON_USE_TYPE_SPECS static PyType_Slot __pyx_type_7aiohttp_12_http_parser_HttpResponseParser_slots[] = { {Py_tp_traverse, (void *)__pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser}, {Py_tp_clear, (void *)__pyx_tp_clear_7aiohttp_12_http_parser_HttpParser}, {Py_tp_methods, (void *)__pyx_methods_7aiohttp_12_http_parser_HttpResponseParser}, {Py_tp_init, (void *)__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_1__init__}, {Py_tp_new, (void *)__pyx_tp_new_7aiohttp_12_http_parser_HttpResponseParser}, {0, 0}, }; static PyType_Spec __pyx_type_7aiohttp_12_http_parser_HttpResponseParser_spec = { "aiohttp._http_parser.HttpResponseParser", sizeof(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser), 0, Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, __pyx_type_7aiohttp_12_http_parser_HttpResponseParser_slots, }; #else static PyTypeObject __pyx_type_7aiohttp_12_http_parser_HttpResponseParser = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._http_parser.""HttpResponseParser", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser, /*tp_traverse*/ __pyx_tp_clear_7aiohttp_12_http_parser_HttpParser, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7aiohttp_12_http_parser_HttpResponseParser, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ #if !CYTHON_USE_TYPE_SPECS 0, /*tp_dictoffset*/ #endif __pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_12_http_parser_HttpResponseParser, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 #if CYTHON_USE_TP_FINALIZE 0, /*tp_finalize*/ #else NULL, /*tp_finalize*/ #endif #endif #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, /*tp_vectorcall*/ #endif #if __PYX_NEED_TP_PRINT_SLOT == 1 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030C0000 0, /*tp_watched*/ #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 0, /*tp_pypy_flags*/ #endif }; #endif static struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr *__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct__genexpr[8]; static int __pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct__genexpr = 0; static PyObject *__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct__genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { PyObject *o; #if CYTHON_COMPILING_IN_LIMITED_API allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); o = alloc_func(t, 0); #else #if CYTHON_COMPILING_IN_CPYTHON if (likely((int)(__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct__genexpr > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr)))) { o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct__genexpr[--__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct__genexpr]; memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr)); (void) PyObject_INIT(o, t); PyObject_GC_Track(o); } else #endif { o = (*t->tp_alloc)(t, 0); if (unlikely(!o)) return 0; } #endif return o; } static void __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct__genexpr(PyObject *o) { struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr *)o; #if CYTHON_USE_TP_FINALIZE if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct__genexpr) { if (PyObject_CallFinalizerFromDealloc(o)) return; } } #endif PyObject_GC_UnTrack(o); Py_CLEAR(p->__pyx_genexpr_arg_0); Py_CLEAR(p->__pyx_v_name); Py_CLEAR(p->__pyx_v_val); #if CYTHON_COMPILING_IN_CPYTHON if (((int)(__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct__genexpr < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr)))) { __pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct__genexpr[__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct__genexpr++] = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr *)o); } else #endif { #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY (*Py_TYPE(o)->tp_free)(o); #else { freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); if (tp_free) tp_free(o); } #endif } } static int __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct__genexpr(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr *)o; if (p->__pyx_genexpr_arg_0) { e = (*v)(p->__pyx_genexpr_arg_0, a); if (e) return e; } if (p->__pyx_v_name) { e = (*v)(p->__pyx_v_name, a); if (e) return e; } if (p->__pyx_v_val) { e = (*v)(p->__pyx_v_val, a); if (e) return e; } return 0; } #if CYTHON_USE_TYPE_SPECS static PyType_Slot __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct__genexpr_slots[] = { {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct__genexpr}, {Py_tp_traverse, (void *)__pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct__genexpr}, {Py_tp_new, (void *)__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct__genexpr}, {0, 0}, }; static PyType_Spec __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct__genexpr_spec = { "aiohttp._http_parser.__pyx_scope_struct__genexpr", sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr), 0, Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE, __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct__genexpr_slots, }; #else static PyTypeObject __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct__genexpr = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._http_parser.""__pyx_scope_struct__genexpr", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct__genexpr), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct__genexpr, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct__genexpr, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ 0, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ #if !CYTHON_USE_TYPE_SPECS 0, /*tp_dictoffset*/ #endif 0, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct__genexpr, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 #if CYTHON_USE_TP_FINALIZE 0, /*tp_finalize*/ #else NULL, /*tp_finalize*/ #endif #endif #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, /*tp_vectorcall*/ #endif #if __PYX_NEED_TP_PRINT_SLOT == 1 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030C0000 0, /*tp_watched*/ #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 0, /*tp_pypy_flags*/ #endif }; #endif static struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr[8]; static int __pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr = 0; static PyObject *__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { PyObject *o; #if CYTHON_COMPILING_IN_LIMITED_API allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); o = alloc_func(t, 0); #else #if CYTHON_COMPILING_IN_CPYTHON if (likely((int)(__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr)))) { o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr[--__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr]; memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr)); (void) PyObject_INIT(o, t); PyObject_GC_Track(o); } else #endif { o = (*t->tp_alloc)(t, 0); if (unlikely(!o)) return 0; } #endif return o; } static void __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr(PyObject *o) { struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)o; #if CYTHON_USE_TP_FINALIZE if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr) { if (PyObject_CallFinalizerFromDealloc(o)) return; } } #endif PyObject_GC_UnTrack(o); Py_CLEAR(p->__pyx_genexpr_arg_0); Py_CLEAR(p->__pyx_v_name); Py_CLEAR(p->__pyx_v_val); #if CYTHON_COMPILING_IN_CPYTHON if (((int)(__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr)))) { __pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr[__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr++] = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)o); } else #endif { #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY (*Py_TYPE(o)->tp_free)(o); #else { freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); if (tp_free) tp_free(o); } #endif } } static int __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)o; if (p->__pyx_genexpr_arg_0) { e = (*v)(p->__pyx_genexpr_arg_0, a); if (e) return e; } if (p->__pyx_v_name) { e = (*v)(p->__pyx_v_name, a); if (e) return e; } if (p->__pyx_v_val) { e = (*v)(p->__pyx_v_val, a); if (e) return e; } return 0; } #if CYTHON_USE_TYPE_SPECS static PyType_Slot __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr_slots[] = { {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr}, {Py_tp_traverse, (void *)__pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr}, {Py_tp_new, (void *)__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr}, {0, 0}, }; static PyType_Spec __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr_spec = { "aiohttp._http_parser.__pyx_scope_struct_1_genexpr", sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr), 0, Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE, __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr_slots, }; #else static PyTypeObject __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._http_parser.""__pyx_scope_struct_1_genexpr", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ 0, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ #if !CYTHON_USE_TYPE_SPECS 0, /*tp_dictoffset*/ #endif 0, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 #if CYTHON_USE_TP_FINALIZE 0, /*tp_finalize*/ #else NULL, /*tp_finalize*/ #endif #endif #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, /*tp_vectorcall*/ #endif #if __PYX_NEED_TP_PRINT_SLOT == 1 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030C0000 0, /*tp_watched*/ #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 0, /*tp_pypy_flags*/ #endif }; #endif static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif #endif /* #### Code section: pystring_table ### */ static int __Pyx_CreateStringTabAndInitStrings(void) { __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_u_, __pyx_k_, sizeof(__pyx_k_), 0, 1, 0, 0}, {&__pyx_n_s_ACCEPT, __pyx_k_ACCEPT, sizeof(__pyx_k_ACCEPT), 0, 0, 1, 1}, {&__pyx_n_s_ACCEPT_CHARSET, __pyx_k_ACCEPT_CHARSET, sizeof(__pyx_k_ACCEPT_CHARSET), 0, 0, 1, 1}, {&__pyx_n_s_ACCEPT_ENCODING, __pyx_k_ACCEPT_ENCODING, sizeof(__pyx_k_ACCEPT_ENCODING), 0, 0, 1, 1}, {&__pyx_n_s_ACCEPT_LANGUAGE, __pyx_k_ACCEPT_LANGUAGE, sizeof(__pyx_k_ACCEPT_LANGUAGE), 0, 0, 1, 1}, {&__pyx_n_s_ACCEPT_RANGES, __pyx_k_ACCEPT_RANGES, sizeof(__pyx_k_ACCEPT_RANGES), 0, 0, 1, 1}, {&__pyx_n_s_ACCESS_CONTROL_ALLOW_CREDENTIALS, __pyx_k_ACCESS_CONTROL_ALLOW_CREDENTIALS, sizeof(__pyx_k_ACCESS_CONTROL_ALLOW_CREDENTIALS), 0, 0, 1, 1}, {&__pyx_n_s_ACCESS_CONTROL_ALLOW_HEADERS, __pyx_k_ACCESS_CONTROL_ALLOW_HEADERS, sizeof(__pyx_k_ACCESS_CONTROL_ALLOW_HEADERS), 0, 0, 1, 1}, {&__pyx_n_s_ACCESS_CONTROL_ALLOW_METHODS, __pyx_k_ACCESS_CONTROL_ALLOW_METHODS, sizeof(__pyx_k_ACCESS_CONTROL_ALLOW_METHODS), 0, 0, 1, 1}, {&__pyx_n_s_ACCESS_CONTROL_ALLOW_ORIGIN, __pyx_k_ACCESS_CONTROL_ALLOW_ORIGIN, sizeof(__pyx_k_ACCESS_CONTROL_ALLOW_ORIGIN), 0, 0, 1, 1}, {&__pyx_n_s_ACCESS_CONTROL_EXPOSE_HEADERS, __pyx_k_ACCESS_CONTROL_EXPOSE_HEADERS, sizeof(__pyx_k_ACCESS_CONTROL_EXPOSE_HEADERS), 0, 0, 1, 1}, {&__pyx_n_s_ACCESS_CONTROL_MAX_AGE, __pyx_k_ACCESS_CONTROL_MAX_AGE, sizeof(__pyx_k_ACCESS_CONTROL_MAX_AGE), 0, 0, 1, 1}, {&__pyx_n_s_ACCESS_CONTROL_REQUEST_HEADERS, __pyx_k_ACCESS_CONTROL_REQUEST_HEADERS, sizeof(__pyx_k_ACCESS_CONTROL_REQUEST_HEADERS), 0, 0, 1, 1}, {&__pyx_n_s_ACCESS_CONTROL_REQUEST_METHOD, __pyx_k_ACCESS_CONTROL_REQUEST_METHOD, sizeof(__pyx_k_ACCESS_CONTROL_REQUEST_METHOD), 0, 0, 1, 1}, {&__pyx_n_s_AGE, __pyx_k_AGE, sizeof(__pyx_k_AGE), 0, 0, 1, 1}, {&__pyx_n_s_ALLOW, __pyx_k_ALLOW, sizeof(__pyx_k_ALLOW), 0, 0, 1, 1}, {&__pyx_n_s_AUTHORIZATION, __pyx_k_AUTHORIZATION, sizeof(__pyx_k_AUTHORIZATION), 0, 0, 1, 1}, {&__pyx_n_s_BadHttpMessage, __pyx_k_BadHttpMessage, sizeof(__pyx_k_BadHttpMessage), 0, 0, 1, 1}, {&__pyx_n_s_BadStatusLine, __pyx_k_BadStatusLine, sizeof(__pyx_k_BadStatusLine), 0, 0, 1, 1}, {&__pyx_n_s_BaseException, __pyx_k_BaseException, sizeof(__pyx_k_BaseException), 0, 0, 1, 1}, {&__pyx_n_s_CACHE_CONTROL, __pyx_k_CACHE_CONTROL, sizeof(__pyx_k_CACHE_CONTROL), 0, 0, 1, 1}, {&__pyx_n_s_CIMultiDict, __pyx_k_CIMultiDict, sizeof(__pyx_k_CIMultiDict), 0, 0, 1, 1}, {&__pyx_n_s_CIMultiDictProxy, __pyx_k_CIMultiDictProxy, sizeof(__pyx_k_CIMultiDictProxy), 0, 0, 1, 1}, {&__pyx_n_s_CIMultiDictProxy_2, __pyx_k_CIMultiDictProxy_2, sizeof(__pyx_k_CIMultiDictProxy_2), 0, 0, 1, 1}, {&__pyx_n_s_CIMultiDict_2, __pyx_k_CIMultiDict_2, sizeof(__pyx_k_CIMultiDict_2), 0, 0, 1, 1}, {&__pyx_n_s_CONNECTION, __pyx_k_CONNECTION, sizeof(__pyx_k_CONNECTION), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_DISPOSITION, __pyx_k_CONTENT_DISPOSITION, sizeof(__pyx_k_CONTENT_DISPOSITION), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_ENCODING, __pyx_k_CONTENT_ENCODING, sizeof(__pyx_k_CONTENT_ENCODING), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_LANGUAGE, __pyx_k_CONTENT_LANGUAGE, sizeof(__pyx_k_CONTENT_LANGUAGE), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_LENGTH, __pyx_k_CONTENT_LENGTH, sizeof(__pyx_k_CONTENT_LENGTH), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_LOCATION, __pyx_k_CONTENT_LOCATION, sizeof(__pyx_k_CONTENT_LOCATION), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_MD5, __pyx_k_CONTENT_MD5, sizeof(__pyx_k_CONTENT_MD5), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_RANGE, __pyx_k_CONTENT_RANGE, sizeof(__pyx_k_CONTENT_RANGE), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_TRANSFER_ENCODING, __pyx_k_CONTENT_TRANSFER_ENCODING, sizeof(__pyx_k_CONTENT_TRANSFER_ENCODING), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_TYPE, __pyx_k_CONTENT_TYPE, sizeof(__pyx_k_CONTENT_TYPE), 0, 0, 1, 1}, {&__pyx_n_s_COOKIE, __pyx_k_COOKIE, sizeof(__pyx_k_COOKIE), 0, 0, 1, 1}, {&__pyx_n_s_ContentLengthError, __pyx_k_ContentLengthError, sizeof(__pyx_k_ContentLengthError), 0, 0, 1, 1}, {&__pyx_n_s_DATE, __pyx_k_DATE, sizeof(__pyx_k_DATE), 0, 0, 1, 1}, {&__pyx_n_s_DEBUG, __pyx_k_DEBUG, sizeof(__pyx_k_DEBUG), 0, 0, 1, 1}, {&__pyx_n_s_DESTINATION, __pyx_k_DESTINATION, sizeof(__pyx_k_DESTINATION), 0, 0, 1, 1}, {&__pyx_n_s_DIGEST, __pyx_k_DIGEST, sizeof(__pyx_k_DIGEST), 0, 0, 1, 1}, {&__pyx_n_s_DeflateBuffer, __pyx_k_DeflateBuffer, sizeof(__pyx_k_DeflateBuffer), 0, 0, 1, 1}, {&__pyx_n_s_DeflateBuffer_2, __pyx_k_DeflateBuffer_2, sizeof(__pyx_k_DeflateBuffer_2), 0, 0, 1, 1}, {&__pyx_n_s_EMPTY_PAYLOAD, __pyx_k_EMPTY_PAYLOAD, sizeof(__pyx_k_EMPTY_PAYLOAD), 0, 0, 1, 1}, {&__pyx_n_s_EMPTY_PAYLOAD_2, __pyx_k_EMPTY_PAYLOAD_2, sizeof(__pyx_k_EMPTY_PAYLOAD_2), 0, 0, 1, 1}, {&__pyx_n_s_ETAG, __pyx_k_ETAG, sizeof(__pyx_k_ETAG), 0, 0, 1, 1}, {&__pyx_n_s_EXPECT, __pyx_k_EXPECT, sizeof(__pyx_k_EXPECT), 0, 0, 1, 1}, {&__pyx_n_s_EXPIRES, __pyx_k_EXPIRES, sizeof(__pyx_k_EXPIRES), 0, 0, 1, 1}, {&__pyx_n_s_FORWARDED, __pyx_k_FORWARDED, sizeof(__pyx_k_FORWARDED), 0, 0, 1, 1}, {&__pyx_n_s_FROM, __pyx_k_FROM, sizeof(__pyx_k_FROM), 0, 0, 1, 1}, {&__pyx_n_s_HOST, __pyx_k_HOST, sizeof(__pyx_k_HOST), 0, 0, 1, 1}, {&__pyx_kp_u_Header_name_is_too_long, __pyx_k_Header_name_is_too_long, sizeof(__pyx_k_Header_name_is_too_long), 0, 1, 0, 0}, {&__pyx_kp_u_Header_value_is_too_long, __pyx_k_Header_value_is_too_long, sizeof(__pyx_k_Header_value_is_too_long), 0, 1, 0, 0}, {&__pyx_n_s_HttpParser___reduce_cython, __pyx_k_HttpParser___reduce_cython, sizeof(__pyx_k_HttpParser___reduce_cython), 0, 0, 1, 1}, {&__pyx_n_s_HttpParser___setstate_cython, __pyx_k_HttpParser___setstate_cython, sizeof(__pyx_k_HttpParser___setstate_cython), 0, 0, 1, 1}, {&__pyx_n_s_HttpParser_feed_data, __pyx_k_HttpParser_feed_data, sizeof(__pyx_k_HttpParser_feed_data), 0, 0, 1, 1}, {&__pyx_n_s_HttpParser_feed_eof, __pyx_k_HttpParser_feed_eof, sizeof(__pyx_k_HttpParser_feed_eof), 0, 0, 1, 1}, {&__pyx_n_s_HttpParser_set_upgraded, __pyx_k_HttpParser_set_upgraded, sizeof(__pyx_k_HttpParser_set_upgraded), 0, 0, 1, 1}, {&__pyx_n_s_HttpRequestParser, __pyx_k_HttpRequestParser, sizeof(__pyx_k_HttpRequestParser), 0, 0, 1, 1}, {&__pyx_n_u_HttpRequestParser, __pyx_k_HttpRequestParser, sizeof(__pyx_k_HttpRequestParser), 0, 1, 0, 1}, {&__pyx_n_s_HttpRequestParser___reduce_cytho, __pyx_k_HttpRequestParser___reduce_cytho, sizeof(__pyx_k_HttpRequestParser___reduce_cytho), 0, 0, 1, 1}, {&__pyx_n_s_HttpRequestParser___setstate_cyt, __pyx_k_HttpRequestParser___setstate_cyt, sizeof(__pyx_k_HttpRequestParser___setstate_cyt), 0, 0, 1, 1}, {&__pyx_n_s_HttpResponseParser, __pyx_k_HttpResponseParser, sizeof(__pyx_k_HttpResponseParser), 0, 0, 1, 1}, {&__pyx_n_u_HttpResponseParser, __pyx_k_HttpResponseParser, sizeof(__pyx_k_HttpResponseParser), 0, 1, 0, 1}, {&__pyx_n_s_HttpResponseParser___reduce_cyth, __pyx_k_HttpResponseParser___reduce_cyth, sizeof(__pyx_k_HttpResponseParser___reduce_cyth), 0, 0, 1, 1}, {&__pyx_n_s_HttpResponseParser___setstate_cy, __pyx_k_HttpResponseParser___setstate_cy, sizeof(__pyx_k_HttpResponseParser___setstate_cy), 0, 0, 1, 1}, {&__pyx_n_s_HttpVersion, __pyx_k_HttpVersion, sizeof(__pyx_k_HttpVersion), 0, 0, 1, 1}, {&__pyx_n_s_HttpVersion10, __pyx_k_HttpVersion10, sizeof(__pyx_k_HttpVersion10), 0, 0, 1, 1}, {&__pyx_n_s_HttpVersion10_2, __pyx_k_HttpVersion10_2, sizeof(__pyx_k_HttpVersion10_2), 0, 0, 1, 1}, {&__pyx_n_s_HttpVersion11, __pyx_k_HttpVersion11, sizeof(__pyx_k_HttpVersion11), 0, 0, 1, 1}, {&__pyx_n_s_HttpVersion11_2, __pyx_k_HttpVersion11_2, sizeof(__pyx_k_HttpVersion11_2), 0, 0, 1, 1}, {&__pyx_n_s_HttpVersion_2, __pyx_k_HttpVersion_2, sizeof(__pyx_k_HttpVersion_2), 0, 0, 1, 1}, {&__pyx_n_s_IF_MATCH, __pyx_k_IF_MATCH, sizeof(__pyx_k_IF_MATCH), 0, 0, 1, 1}, {&__pyx_n_s_IF_MODIFIED_SINCE, __pyx_k_IF_MODIFIED_SINCE, sizeof(__pyx_k_IF_MODIFIED_SINCE), 0, 0, 1, 1}, {&__pyx_n_s_IF_NONE_MATCH, __pyx_k_IF_NONE_MATCH, sizeof(__pyx_k_IF_NONE_MATCH), 0, 0, 1, 1}, {&__pyx_n_s_IF_RANGE, __pyx_k_IF_RANGE, sizeof(__pyx_k_IF_RANGE), 0, 0, 1, 1}, {&__pyx_n_s_IF_UNMODIFIED_SINCE, __pyx_k_IF_UNMODIFIED_SINCE, sizeof(__pyx_k_IF_UNMODIFIED_SINCE), 0, 0, 1, 1}, {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_k_Incompatible_checksums_0x_x_vs_0, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0), 0, 0, 1, 0}, {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0_2, __pyx_k_Incompatible_checksums_0x_x_vs_0_2, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0_2), 0, 0, 1, 0}, {&__pyx_n_s_InvalidHeader, __pyx_k_InvalidHeader, sizeof(__pyx_k_InvalidHeader), 0, 0, 1, 1}, {&__pyx_n_s_InvalidURLError, __pyx_k_InvalidURLError, sizeof(__pyx_k_InvalidURLError), 0, 0, 1, 1}, {&__pyx_n_s_KEEP_ALIVE, __pyx_k_KEEP_ALIVE, sizeof(__pyx_k_KEEP_ALIVE), 0, 0, 1, 1}, {&__pyx_n_s_LAST_EVENT_ID, __pyx_k_LAST_EVENT_ID, sizeof(__pyx_k_LAST_EVENT_ID), 0, 0, 1, 1}, {&__pyx_n_s_LAST_MODIFIED, __pyx_k_LAST_MODIFIED, sizeof(__pyx_k_LAST_MODIFIED), 0, 0, 1, 1}, {&__pyx_n_s_LINK, __pyx_k_LINK, sizeof(__pyx_k_LINK), 0, 0, 1, 1}, {&__pyx_n_s_LOCATION, __pyx_k_LOCATION, sizeof(__pyx_k_LOCATION), 0, 0, 1, 1}, {&__pyx_n_s_LineTooLong, __pyx_k_LineTooLong, sizeof(__pyx_k_LineTooLong), 0, 0, 1, 1}, {&__pyx_n_s_MAX_FORWARDS, __pyx_k_MAX_FORWARDS, sizeof(__pyx_k_MAX_FORWARDS), 0, 0, 1, 1}, {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, {&__pyx_kp_u_Not_enough_data_for_satisfy_cont, __pyx_k_Not_enough_data_for_satisfy_cont, sizeof(__pyx_k_Not_enough_data_for_satisfy_cont), 0, 1, 0, 0}, {&__pyx_kp_u_Not_enough_data_for_satisfy_tran, __pyx_k_Not_enough_data_for_satisfy_tran, sizeof(__pyx_k_Not_enough_data_for_satisfy_tran), 0, 1, 0, 0}, {&__pyx_n_s_ORIGIN, __pyx_k_ORIGIN, sizeof(__pyx_k_ORIGIN), 0, 0, 1, 1}, {&__pyx_n_s_PRAGMA, __pyx_k_PRAGMA, sizeof(__pyx_k_PRAGMA), 0, 0, 1, 1}, {&__pyx_n_s_PROXY_AUTHENTICATE, __pyx_k_PROXY_AUTHENTICATE, sizeof(__pyx_k_PROXY_AUTHENTICATE), 0, 0, 1, 1}, {&__pyx_n_s_PROXY_AUTHORIZATION, __pyx_k_PROXY_AUTHORIZATION, sizeof(__pyx_k_PROXY_AUTHORIZATION), 0, 0, 1, 1}, {&__pyx_n_s_PayloadEncodingError, __pyx_k_PayloadEncodingError, sizeof(__pyx_k_PayloadEncodingError), 0, 0, 1, 1}, {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, {&__pyx_n_s_RANGE, __pyx_k_RANGE, sizeof(__pyx_k_RANGE), 0, 0, 1, 1}, {&__pyx_n_s_REFERER, __pyx_k_REFERER, sizeof(__pyx_k_REFERER), 0, 0, 1, 1}, {&__pyx_n_s_RETRY_AFTER, __pyx_k_RETRY_AFTER, sizeof(__pyx_k_RETRY_AFTER), 0, 0, 1, 1}, {&__pyx_kp_u_RawRequestMessage, __pyx_k_RawRequestMessage, sizeof(__pyx_k_RawRequestMessage), 0, 1, 0, 0}, {&__pyx_n_s_RawRequestMessage_2, __pyx_k_RawRequestMessage_2, sizeof(__pyx_k_RawRequestMessage_2), 0, 0, 1, 1}, {&__pyx_n_u_RawRequestMessage_2, __pyx_k_RawRequestMessage_2, sizeof(__pyx_k_RawRequestMessage_2), 0, 1, 0, 1}, {&__pyx_n_s_RawRequestMessage___reduce_cytho, __pyx_k_RawRequestMessage___reduce_cytho, sizeof(__pyx_k_RawRequestMessage___reduce_cytho), 0, 0, 1, 1}, {&__pyx_n_s_RawRequestMessage___setstate_cyt, __pyx_k_RawRequestMessage___setstate_cyt, sizeof(__pyx_k_RawRequestMessage___setstate_cyt), 0, 0, 1, 1}, {&__pyx_n_s_RawRequestMessage__replace, __pyx_k_RawRequestMessage__replace, sizeof(__pyx_k_RawRequestMessage__replace), 0, 0, 1, 1}, {&__pyx_kp_u_RawResponseMessage, __pyx_k_RawResponseMessage, sizeof(__pyx_k_RawResponseMessage), 0, 1, 0, 0}, {&__pyx_n_s_RawResponseMessage_2, __pyx_k_RawResponseMessage_2, sizeof(__pyx_k_RawResponseMessage_2), 0, 0, 1, 1}, {&__pyx_n_u_RawResponseMessage_2, __pyx_k_RawResponseMessage_2, sizeof(__pyx_k_RawResponseMessage_2), 0, 1, 0, 1}, {&__pyx_n_s_RawResponseMessage___reduce_cyth, __pyx_k_RawResponseMessage___reduce_cyth, sizeof(__pyx_k_RawResponseMessage___reduce_cyth), 0, 0, 1, 1}, {&__pyx_n_s_RawResponseMessage___setstate_cy, __pyx_k_RawResponseMessage___setstate_cy, sizeof(__pyx_k_RawResponseMessage___setstate_cy), 0, 0, 1, 1}, {&__pyx_n_s_SEC_WEBSOCKET_ACCEPT, __pyx_k_SEC_WEBSOCKET_ACCEPT, sizeof(__pyx_k_SEC_WEBSOCKET_ACCEPT), 0, 0, 1, 1}, {&__pyx_n_s_SEC_WEBSOCKET_EXTENSIONS, __pyx_k_SEC_WEBSOCKET_EXTENSIONS, sizeof(__pyx_k_SEC_WEBSOCKET_EXTENSIONS), 0, 0, 1, 1}, {&__pyx_n_s_SEC_WEBSOCKET_KEY, __pyx_k_SEC_WEBSOCKET_KEY, sizeof(__pyx_k_SEC_WEBSOCKET_KEY), 0, 0, 1, 1}, {&__pyx_n_s_SEC_WEBSOCKET_KEY1, __pyx_k_SEC_WEBSOCKET_KEY1, sizeof(__pyx_k_SEC_WEBSOCKET_KEY1), 0, 0, 1, 1}, {&__pyx_n_s_SEC_WEBSOCKET_PROTOCOL, __pyx_k_SEC_WEBSOCKET_PROTOCOL, sizeof(__pyx_k_SEC_WEBSOCKET_PROTOCOL), 0, 0, 1, 1}, {&__pyx_n_s_SEC_WEBSOCKET_VERSION, __pyx_k_SEC_WEBSOCKET_VERSION, sizeof(__pyx_k_SEC_WEBSOCKET_VERSION), 0, 0, 1, 1}, {&__pyx_n_s_SERVER, __pyx_k_SERVER, sizeof(__pyx_k_SERVER), 0, 0, 1, 1}, {&__pyx_n_s_SET_COOKIE, __pyx_k_SET_COOKIE, sizeof(__pyx_k_SET_COOKIE), 0, 0, 1, 1}, {&__pyx_kp_u_Status_line_is_too_long, __pyx_k_Status_line_is_too_long, sizeof(__pyx_k_Status_line_is_too_long), 0, 1, 0, 0}, {&__pyx_n_s_StreamReader, __pyx_k_StreamReader, sizeof(__pyx_k_StreamReader), 0, 0, 1, 1}, {&__pyx_n_s_StreamReader_2, __pyx_k_StreamReader_2, sizeof(__pyx_k_StreamReader_2), 0, 0, 1, 1}, {&__pyx_n_s_TE, __pyx_k_TE, sizeof(__pyx_k_TE), 0, 0, 1, 1}, {&__pyx_n_s_TRAILER, __pyx_k_TRAILER, sizeof(__pyx_k_TRAILER), 0, 0, 1, 1}, {&__pyx_n_s_TRANSFER_ENCODING, __pyx_k_TRANSFER_ENCODING, sizeof(__pyx_k_TRANSFER_ENCODING), 0, 0, 1, 1}, {&__pyx_n_s_TransferEncodingError, __pyx_k_TransferEncodingError, sizeof(__pyx_k_TransferEncodingError), 0, 0, 1, 1}, {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, {&__pyx_n_s_UPGRADE, __pyx_k_UPGRADE, sizeof(__pyx_k_UPGRADE), 0, 0, 1, 1}, {&__pyx_n_s_URI, __pyx_k_URI, sizeof(__pyx_k_URI), 0, 0, 1, 1}, {&__pyx_n_s_URL, __pyx_k_URL, sizeof(__pyx_k_URL), 0, 0, 1, 1}, {&__pyx_n_s_URL_2, __pyx_k_URL_2, sizeof(__pyx_k_URL_2), 0, 0, 1, 1}, {&__pyx_n_s_USER_AGENT, __pyx_k_USER_AGENT, sizeof(__pyx_k_USER_AGENT), 0, 0, 1, 1}, {&__pyx_n_s_VARY, __pyx_k_VARY, sizeof(__pyx_k_VARY), 0, 0, 1, 1}, {&__pyx_n_s_VIA, __pyx_k_VIA, sizeof(__pyx_k_VIA), 0, 0, 1, 1}, {&__pyx_n_s_WANT_DIGEST, __pyx_k_WANT_DIGEST, sizeof(__pyx_k_WANT_DIGEST), 0, 0, 1, 1}, {&__pyx_n_s_WARNING, __pyx_k_WARNING, sizeof(__pyx_k_WARNING), 0, 0, 1, 1}, {&__pyx_n_s_WWW_AUTHENTICATE, __pyx_k_WWW_AUTHENTICATE, sizeof(__pyx_k_WWW_AUTHENTICATE), 0, 0, 1, 1}, {&__pyx_n_s_X_FORWARDED_FOR, __pyx_k_X_FORWARDED_FOR, sizeof(__pyx_k_X_FORWARDED_FOR), 0, 0, 1, 1}, {&__pyx_n_s_X_FORWARDED_HOST, __pyx_k_X_FORWARDED_HOST, sizeof(__pyx_k_X_FORWARDED_HOST), 0, 0, 1, 1}, {&__pyx_n_s_X_FORWARDED_PROTO, __pyx_k_X_FORWARDED_PROTO, sizeof(__pyx_k_X_FORWARDED_PROTO), 0, 0, 1, 1}, {&__pyx_kp_u__10, __pyx_k__10, sizeof(__pyx_k__10), 0, 1, 0, 0}, {&__pyx_kp_u__12, __pyx_k__12, sizeof(__pyx_k__12), 0, 1, 0, 0}, {&__pyx_kp_u__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 1, 0, 0}, {&__pyx_kp_u__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 1, 0, 0}, {&__pyx_kp_b__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 0, 0, 0}, {&__pyx_kp_u__6, __pyx_k__6, sizeof(__pyx_k__6), 0, 1, 0, 0}, {&__pyx_kp_u__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 1, 0, 0}, {&__pyx_n_s__8, __pyx_k__8, sizeof(__pyx_k__8), 0, 0, 1, 1}, {&__pyx_kp_b__8, __pyx_k__8, sizeof(__pyx_k__8), 0, 0, 0, 0}, {&__pyx_kp_u__8, __pyx_k__8, sizeof(__pyx_k__8), 0, 1, 0, 0}, {&__pyx_n_s__9, __pyx_k__9, sizeof(__pyx_k__9), 0, 0, 1, 1}, {&__pyx_kp_u__9, __pyx_k__9, sizeof(__pyx_k__9), 0, 1, 0, 0}, {&__pyx_n_s_add, __pyx_k_add, sizeof(__pyx_k_add), 0, 0, 1, 1}, {&__pyx_n_s_after, __pyx_k_after, sizeof(__pyx_k_after), 0, 0, 1, 1}, {&__pyx_n_s_after_b, __pyx_k_after_b, sizeof(__pyx_k_after_b), 0, 0, 1, 1}, {&__pyx_n_s_aiohttp, __pyx_k_aiohttp, sizeof(__pyx_k_aiohttp), 0, 0, 1, 1}, {&__pyx_n_s_aiohttp__http_parser, __pyx_k_aiohttp__http_parser, sizeof(__pyx_k_aiohttp__http_parser), 0, 0, 1, 1}, {&__pyx_kp_s_aiohttp__http_parser_pyx, __pyx_k_aiohttp__http_parser_pyx, sizeof(__pyx_k_aiohttp__http_parser_pyx), 0, 0, 1, 0}, {&__pyx_n_s_aiohttp_helpers, __pyx_k_aiohttp_helpers, sizeof(__pyx_k_aiohttp_helpers), 0, 0, 1, 1}, {&__pyx_n_s_all, __pyx_k_all, sizeof(__pyx_k_all), 0, 0, 1, 1}, {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1}, {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, {&__pyx_n_s_authority, __pyx_k_authority, sizeof(__pyx_k_authority), 0, 0, 1, 1}, {&__pyx_n_s_auto_decompress, __pyx_k_auto_decompress, sizeof(__pyx_k_auto_decompress), 0, 0, 1, 1}, {&__pyx_n_s_before, __pyx_k_before, sizeof(__pyx_k_before), 0, 0, 1, 1}, {&__pyx_n_s_begin_http_chunk_receiving, __pyx_k_begin_http_chunk_receiving, sizeof(__pyx_k_begin_http_chunk_receiving), 0, 0, 1, 1}, {&__pyx_n_u_br, __pyx_k_br, sizeof(__pyx_k_br), 0, 1, 0, 1}, {&__pyx_n_s_build, __pyx_k_build, sizeof(__pyx_k_build), 0, 0, 1, 1}, {&__pyx_n_s_chunked, __pyx_k_chunked, sizeof(__pyx_k_chunked), 0, 0, 1, 1}, {&__pyx_n_u_chunked, __pyx_k_chunked, sizeof(__pyx_k_chunked), 0, 1, 0, 1}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, {&__pyx_n_s_close, __pyx_k_close, sizeof(__pyx_k_close), 0, 0, 1, 1}, {&__pyx_n_s_code, __pyx_k_code, sizeof(__pyx_k_code), 0, 0, 1, 1}, {&__pyx_n_u_code, __pyx_k_code, sizeof(__pyx_k_code), 0, 1, 0, 1}, {&__pyx_n_s_compression, __pyx_k_compression, sizeof(__pyx_k_compression), 0, 0, 1, 1}, {&__pyx_n_u_compression, __pyx_k_compression, sizeof(__pyx_k_compression), 0, 1, 0, 1}, {&__pyx_n_s_data, __pyx_k_data, sizeof(__pyx_k_data), 0, 0, 1, 1}, {&__pyx_n_s_data_len, __pyx_k_data_len, sizeof(__pyx_k_data_len), 0, 0, 1, 1}, {&__pyx_n_s_dct, __pyx_k_dct, sizeof(__pyx_k_dct), 0, 0, 1, 1}, {&__pyx_n_u_deflate, __pyx_k_deflate, sizeof(__pyx_k_deflate), 0, 1, 0, 1}, {&__pyx_n_s_desc, __pyx_k_desc, sizeof(__pyx_k_desc), 0, 0, 1, 1}, {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, {&__pyx_n_s_dict_2, __pyx_k_dict_2, sizeof(__pyx_k_dict_2), 0, 0, 1, 1}, {&__pyx_kp_u_disable, __pyx_k_disable, sizeof(__pyx_k_disable), 0, 1, 0, 0}, {&__pyx_kp_u_enable, __pyx_k_enable, sizeof(__pyx_k_enable), 0, 1, 0, 0}, {&__pyx_n_s_encoded, __pyx_k_encoded, sizeof(__pyx_k_encoded), 0, 0, 1, 1}, {&__pyx_n_s_end_http_chunk_receiving, __pyx_k_end_http_chunk_receiving, sizeof(__pyx_k_end_http_chunk_receiving), 0, 0, 1, 1}, {&__pyx_n_s_errno, __pyx_k_errno, sizeof(__pyx_k_errno), 0, 0, 1, 1}, {&__pyx_n_s_error, __pyx_k_error, sizeof(__pyx_k_error), 0, 0, 1, 1}, {&__pyx_n_s_ex, __pyx_k_ex, sizeof(__pyx_k_ex), 0, 0, 1, 1}, {&__pyx_n_s_feed_data, __pyx_k_feed_data, sizeof(__pyx_k_feed_data), 0, 0, 1, 1}, {&__pyx_n_s_feed_eof, __pyx_k_feed_eof, sizeof(__pyx_k_feed_eof), 0, 0, 1, 1}, {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, {&__pyx_n_s_fragment, __pyx_k_fragment, sizeof(__pyx_k_fragment), 0, 0, 1, 1}, {&__pyx_kp_u_gc, __pyx_k_gc, sizeof(__pyx_k_gc), 0, 1, 0, 0}, {&__pyx_n_s_genexpr, __pyx_k_genexpr, sizeof(__pyx_k_genexpr), 0, 0, 1, 1}, {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, {&__pyx_n_u_gzip, __pyx_k_gzip, sizeof(__pyx_k_gzip), 0, 1, 0, 1}, {&__pyx_n_s_hdrs, __pyx_k_hdrs, sizeof(__pyx_k_hdrs), 0, 0, 1, 1}, {&__pyx_n_s_headers, __pyx_k_headers, sizeof(__pyx_k_headers), 0, 0, 1, 1}, {&__pyx_n_u_headers, __pyx_k_headers, sizeof(__pyx_k_headers), 0, 1, 0, 1}, {&__pyx_n_s_http_exceptions, __pyx_k_http_exceptions, sizeof(__pyx_k_http_exceptions), 0, 0, 1, 1}, {&__pyx_n_s_http_parser, __pyx_k_http_parser, sizeof(__pyx_k_http_parser), 0, 0, 1, 1}, {&__pyx_n_s_http_writer, __pyx_k_http_writer, sizeof(__pyx_k_http_writer), 0, 0, 1, 1}, {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, {&__pyx_kp_u_isenabled, __pyx_k_isenabled, sizeof(__pyx_k_isenabled), 0, 1, 0, 0}, {&__pyx_n_s_limit, __pyx_k_limit, sizeof(__pyx_k_limit), 0, 0, 1, 1}, {&__pyx_n_s_loop, __pyx_k_loop, sizeof(__pyx_k_loop), 0, 0, 1, 1}, {&__pyx_n_s_lower, __pyx_k_lower, sizeof(__pyx_k_lower), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_max_field_size, __pyx_k_max_field_size, sizeof(__pyx_k_max_field_size), 0, 0, 1, 1}, {&__pyx_n_s_max_headers, __pyx_k_max_headers, sizeof(__pyx_k_max_headers), 0, 0, 1, 1}, {&__pyx_n_s_max_line_size, __pyx_k_max_line_size, sizeof(__pyx_k_max_line_size), 0, 0, 1, 1}, {&__pyx_n_s_messages, __pyx_k_messages, sizeof(__pyx_k_messages), 0, 0, 1, 1}, {&__pyx_n_s_method, __pyx_k_method, sizeof(__pyx_k_method), 0, 0, 1, 1}, {&__pyx_n_u_method, __pyx_k_method, sizeof(__pyx_k_method), 0, 1, 0, 1}, {&__pyx_n_s_multidict, __pyx_k_multidict, sizeof(__pyx_k_multidict), 0, 0, 1, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_n_s_nb, __pyx_k_nb, sizeof(__pyx_k_nb), 0, 0, 1, 1}, {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0}, {&__pyx_n_s_path, __pyx_k_path, sizeof(__pyx_k_path), 0, 0, 1, 1}, {&__pyx_n_u_path, __pyx_k_path, sizeof(__pyx_k_path), 0, 1, 0, 1}, {&__pyx_n_s_payload_exception, __pyx_k_payload_exception, sizeof(__pyx_k_payload_exception), 0, 0, 1, 1}, {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, {&__pyx_n_s_pointer, __pyx_k_pointer, sizeof(__pyx_k_pointer), 0, 0, 1, 1}, {&__pyx_n_s_protocol, __pyx_k_protocol, sizeof(__pyx_k_protocol), 0, 0, 1, 1}, {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, {&__pyx_n_s_pyx_unpickle_RawRequestMessage, __pyx_k_pyx_unpickle_RawRequestMessage, sizeof(__pyx_k_pyx_unpickle_RawRequestMessage), 0, 0, 1, 1}, {&__pyx_n_s_pyx_unpickle_RawResponseMessag, __pyx_k_pyx_unpickle_RawResponseMessag, sizeof(__pyx_k_pyx_unpickle_RawResponseMessag), 0, 0, 1, 1}, {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, {&__pyx_n_s_query_string, __pyx_k_query_string, sizeof(__pyx_k_query_string), 0, 0, 1, 1}, {&__pyx_kp_u_r, __pyx_k_r, sizeof(__pyx_k_r), 0, 1, 0, 0}, {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, {&__pyx_n_s_raw_headers, __pyx_k_raw_headers, sizeof(__pyx_k_raw_headers), 0, 0, 1, 1}, {&__pyx_n_u_raw_headers, __pyx_k_raw_headers, sizeof(__pyx_k_raw_headers), 0, 1, 0, 1}, {&__pyx_n_s_read_until_eof, __pyx_k_read_until_eof, sizeof(__pyx_k_read_until_eof), 0, 0, 1, 1}, {&__pyx_n_s_reason, __pyx_k_reason, sizeof(__pyx_k_reason), 0, 0, 1, 1}, {&__pyx_n_u_reason, __pyx_k_reason, sizeof(__pyx_k_reason), 0, 1, 0, 1}, {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, {&__pyx_n_s_replace, __pyx_k_replace, sizeof(__pyx_k_replace), 0, 0, 1, 1}, {&__pyx_n_s_repr___locals_genexpr, __pyx_k_repr___locals_genexpr, sizeof(__pyx_k_repr___locals_genexpr), 0, 0, 1, 1}, {&__pyx_n_s_response_with_body, __pyx_k_response_with_body, sizeof(__pyx_k_response_with_body), 0, 0, 1, 1}, {&__pyx_n_s_ret, __pyx_k_ret, sizeof(__pyx_k_ret), 0, 0, 1, 1}, {&__pyx_n_s_rsplit, __pyx_k_rsplit, sizeof(__pyx_k_rsplit), 0, 0, 1, 1}, {&__pyx_n_s_self, __pyx_k_self, sizeof(__pyx_k_self), 0, 0, 1, 1}, {&__pyx_n_s_send, __pyx_k_send, sizeof(__pyx_k_send), 0, 0, 1, 1}, {&__pyx_n_s_set_exception, __pyx_k_set_exception, sizeof(__pyx_k_set_exception), 0, 0, 1, 1}, {&__pyx_n_s_set_upgraded, __pyx_k_set_upgraded, sizeof(__pyx_k_set_upgraded), 0, 0, 1, 1}, {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, {&__pyx_n_s_should_close, __pyx_k_should_close, sizeof(__pyx_k_should_close), 0, 0, 1, 1}, {&__pyx_n_u_should_close, __pyx_k_should_close, sizeof(__pyx_k_should_close), 0, 1, 0, 1}, {&__pyx_n_s_split, __pyx_k_split, sizeof(__pyx_k_split), 0, 0, 1, 1}, {&__pyx_n_s_state, __pyx_k_state, sizeof(__pyx_k_state), 0, 0, 1, 1}, {&__pyx_n_s_streams, __pyx_k_streams, sizeof(__pyx_k_streams), 0, 0, 1, 1}, {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_n_s_throw, __pyx_k_throw, sizeof(__pyx_k_throw), 0, 0, 1, 1}, {&__pyx_n_s_timer, __pyx_k_timer, sizeof(__pyx_k_timer), 0, 0, 1, 1}, {&__pyx_kp_u_unknown, __pyx_k_unknown, sizeof(__pyx_k_unknown), 0, 1, 0, 0}, {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, {&__pyx_n_s_upgrade, __pyx_k_upgrade, sizeof(__pyx_k_upgrade), 0, 0, 1, 1}, {&__pyx_n_u_upgrade, __pyx_k_upgrade, sizeof(__pyx_k_upgrade), 0, 1, 0, 1}, {&__pyx_n_s_url, __pyx_k_url, sizeof(__pyx_k_url), 0, 0, 1, 1}, {&__pyx_n_u_url, __pyx_k_url, sizeof(__pyx_k_url), 0, 1, 0, 1}, {&__pyx_n_s_use_setstate, __pyx_k_use_setstate, sizeof(__pyx_k_use_setstate), 0, 0, 1, 1}, {&__pyx_n_s_val, __pyx_k_val, sizeof(__pyx_k_val), 0, 0, 1, 1}, {&__pyx_n_s_version, __pyx_k_version, sizeof(__pyx_k_version), 0, 0, 1, 1}, {&__pyx_n_u_version, __pyx_k_version, sizeof(__pyx_k_version), 0, 1, 0, 1}, {&__pyx_n_s_yarl, __pyx_k_yarl, sizeof(__pyx_k_yarl), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; return __Pyx_InitStrings(__pyx_string_tab); } /* #### Code section: cached_builtins ### */ static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 87, __pyx_L1_error) __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(0, 316, __pyx_L1_error) __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(1, 2, __pyx_L1_error) __pyx_builtin_BaseException = __Pyx_GetBuiltinName(__pyx_n_s_BaseException); if (!__pyx_builtin_BaseException) __PYX_ERR(0, 684, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } /* #### Code section: cached_constants ### */ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "aiohttp/_http_parser.pyx":551 * after = cparser.llhttp_get_error_pos(self._cparser) * before = data[:after - self.py_buf.buf] * after_b = after.split(b"\r\n", 1)[0] # <<<<<<<<<<<<<< * before = before.rsplit(b"\r\n", 1)[-1] * data = before + after_b */ __pyx_tuple__5 = PyTuple_Pack(2, __pyx_kp_b__4, __pyx_int_1); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 551, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum not in (0xf602a9f, 0x03e51e3, 0x1408252): # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError, "Incompatible checksums (0x%x vs (0xf602a9f, 0x03e51e3, 0x1408252) = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum */ __pyx_tuple__11 = PyTuple_Pack(3, __pyx_int_257960607, __pyx_int_4084195, __pyx_int_21004882); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__11); __Pyx_GIVEREF(__pyx_tuple__11); __pyx_tuple__13 = PyTuple_Pack(3, __pyx_int_213037754, __pyx_int_83803150, __pyx_int_209127132); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__13); __Pyx_GIVEREF(__pyx_tuple__13); /* "aiohttp/_http_parser.pyx":57 * char* PyByteArray_AsString(object) * * __all__ = ('HttpRequestParser', 'HttpResponseParser', # <<<<<<<<<<<<<< * 'RawRequestMessage', 'RawResponseMessage') * */ __pyx_tuple__14 = PyTuple_Pack(4, __pyx_n_u_HttpRequestParser, __pyx_n_u_HttpResponseParser, __pyx_n_u_RawRequestMessage_2, __pyx_n_u_RawResponseMessage_2); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(0, 57, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__14); __Pyx_GIVEREF(__pyx_tuple__14); /* "aiohttp/_http_parser.pyx":150 * return '' * * def _replace(self, **dct): # <<<<<<<<<<<<<< * cdef RawRequestMessage ret * ret = _new_request_message(self.method, */ __pyx_tuple__15 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_dct, __pyx_n_s_ret); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(0, 150, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__15); __Pyx_GIVEREF(__pyx_tuple__15); __pyx_codeobj__16 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_VARKEYWORDS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__15, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_aiohttp__http_parser_pyx, __pyx_n_s_replace, 150, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__16)) __PYX_ERR(0, 150, __pyx_L1_error) /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ __pyx_tuple__17 = PyTuple_Pack(4, __pyx_n_s_self, __pyx_n_s_state, __pyx_n_s_dict_2, __pyx_n_s_use_setstate); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__17); __Pyx_GIVEREF(__pyx_tuple__17); __pyx_codeobj__18 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__17, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__18)) __PYX_ERR(1, 1, __pyx_L1_error) /* "(tree fragment)":16 * else: * return __pyx_unpickle_RawRequestMessage, (type(self), 0xf602a9f, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) */ __pyx_tuple__19 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_pyx_state); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(1, 16, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__19); __Pyx_GIVEREF(__pyx_tuple__19); __pyx_codeobj__20 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__19, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__20)) __PYX_ERR(1, 16, __pyx_L1_error) /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ __pyx_codeobj__21 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__17, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__21)) __PYX_ERR(1, 1, __pyx_L1_error) /* "(tree fragment)":16 * else: * return __pyx_unpickle_RawResponseMessage, (type(self), 0xcb2b2ba, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) */ __pyx_codeobj__22 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__19, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__22)) __PYX_ERR(1, 16, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":502 * ### Public API ### * * def feed_eof(self): # <<<<<<<<<<<<<< * cdef bytes desc * */ __pyx_tuple__23 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_desc); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(0, 502, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__23); __Pyx_GIVEREF(__pyx_tuple__23); __pyx_codeobj__24 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__23, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_aiohttp__http_parser_pyx, __pyx_n_s_feed_eof, 502, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__24)) __PYX_ERR(0, 502, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":522 * return self._messages[-1][0] * * def feed_data(self, data): # <<<<<<<<<<<<<< * cdef: * size_t data_len */ __pyx_tuple__25 = PyTuple_Pack(11, __pyx_n_s_self, __pyx_n_s_data, __pyx_n_s_data_len, __pyx_n_s_nb, __pyx_n_s_errno, __pyx_n_s_ex, __pyx_n_s_after, __pyx_n_s_before, __pyx_n_s_after_b, __pyx_n_s_pointer, __pyx_n_s_messages); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(0, 522, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__25); __Pyx_GIVEREF(__pyx_tuple__25); __pyx_codeobj__26 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 11, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__25, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_aiohttp__http_parser_pyx, __pyx_n_s_feed_data, 522, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__26)) __PYX_ERR(0, 522, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":570 * return messages, False, b'' * * def set_upgraded(self, val): # <<<<<<<<<<<<<< * self._upgraded = val * */ __pyx_tuple__27 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_val); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(0, 570, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__27); __Pyx_GIVEREF(__pyx_tuple__27); __pyx_codeobj__28 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__27, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_aiohttp__http_parser_pyx, __pyx_n_s_set_upgraded, 570, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__28)) __PYX_ERR(0, 570, __pyx_L1_error) /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): */ __pyx_tuple__29 = PyTuple_Pack(1, __pyx_n_s_self); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__29); __Pyx_GIVEREF(__pyx_tuple__29); __pyx_codeobj__30 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__29, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__30)) __PYX_ERR(1, 1, __pyx_L1_error) /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__19, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) __PYX_ERR(1, 3, __pyx_L1_error) /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): */ __pyx_codeobj__32 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__29, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__32)) __PYX_ERR(1, 1, __pyx_L1_error) /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ __pyx_codeobj__33 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__19, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__33)) __PYX_ERR(1, 3, __pyx_L1_error) /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): */ __pyx_codeobj__34 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__29, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__34)) __PYX_ERR(1, 1, __pyx_L1_error) /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ __pyx_codeobj__35 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__19, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__35)) __PYX_ERR(1, 3, __pyx_L1_error) /* "(tree fragment)":1 * def __pyx_unpickle_RawRequestMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ __pyx_tuple__36 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__36); __Pyx_GIVEREF(__pyx_tuple__36); __pyx_codeobj__37 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_RawRequestMessage, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__37)) __PYX_ERR(1, 1, __pyx_L1_error) __pyx_codeobj__38 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_RawResponseMessag, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__38)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } /* #### Code section: init_constants ### */ static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { __pyx_umethod_PyUnicode_Type_lower.type = (PyObject*)&PyUnicode_Type; __pyx_umethod_PyUnicode_Type_lower.method_name = &__pyx_n_s_lower; if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 1, __pyx_L1_error); __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_4084195 = PyInt_FromLong(4084195L); if (unlikely(!__pyx_int_4084195)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_21004882 = PyInt_FromLong(21004882L); if (unlikely(!__pyx_int_21004882)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_83803150 = PyInt_FromLong(83803150L); if (unlikely(!__pyx_int_83803150)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_209127132 = PyInt_FromLong(209127132L); if (unlikely(!__pyx_int_209127132)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_213037754 = PyInt_FromLong(213037754L); if (unlikely(!__pyx_int_213037754)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_257960607 = PyInt_FromLong(257960607L); if (unlikely(!__pyx_int_257960607)) __PYX_ERR(0, 1, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } /* #### Code section: init_globals ### */ static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { return 0; } /* #### Code section: init_module ### */ static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ static int __Pyx_modinit_global_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); /*--- Global init code ---*/ __pyx_v_7aiohttp_12_http_parser_headers = ((PyObject*)Py_None); Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_URL = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_URL_build = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_CIMultiDict = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_HttpVersion = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_HttpVersion10 = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_HttpVersion11 = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1 = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_StreamReader = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_DeflateBuffer = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser__http_method = ((PyObject*)Py_None); Py_INCREF(Py_None); __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); /*--- Variable export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); /*--- Function export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_init_code(void) { __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ #if CYTHON_USE_TYPE_SPECS __pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7aiohttp_12_http_parser_RawRequestMessage_spec, NULL); if (unlikely(!__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage)) __PYX_ERR(0, 110, __pyx_L1_error) if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7aiohttp_12_http_parser_RawRequestMessage_spec, __pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage) < 0) __PYX_ERR(0, 110, __pyx_L1_error) #else __pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage = &__pyx_type_7aiohttp_12_http_parser_RawRequestMessage; #endif #if !CYTHON_COMPILING_IN_LIMITED_API #endif #if !CYTHON_USE_TYPE_SPECS if (__Pyx_PyType_Ready(__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage) < 0) __PYX_ERR(0, 110, __pyx_L1_error) #endif #if PY_MAJOR_VERSION < 3 __pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage->tp_print = 0; #endif #if !CYTHON_COMPILING_IN_LIMITED_API if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage->tp_dictoffset && __pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage->tp_getattro == PyObject_GenericGetAttr)) { __pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage->tp_getattro = __Pyx_PyObject_GenericGetAttr; } #endif if (PyObject_SetAttr(__pyx_m, __pyx_n_s_RawRequestMessage_2, (PyObject *) __pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage) < 0) __PYX_ERR(0, 110, __pyx_L1_error) #if !CYTHON_COMPILING_IN_LIMITED_API if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage) < 0) __PYX_ERR(0, 110, __pyx_L1_error) #endif #if CYTHON_USE_TYPE_SPECS __pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7aiohttp_12_http_parser_RawResponseMessage_spec, NULL); if (unlikely(!__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage)) __PYX_ERR(0, 210, __pyx_L1_error) if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7aiohttp_12_http_parser_RawResponseMessage_spec, __pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage) < 0) __PYX_ERR(0, 210, __pyx_L1_error) #else __pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage = &__pyx_type_7aiohttp_12_http_parser_RawResponseMessage; #endif #if !CYTHON_COMPILING_IN_LIMITED_API #endif #if !CYTHON_USE_TYPE_SPECS if (__Pyx_PyType_Ready(__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage) < 0) __PYX_ERR(0, 210, __pyx_L1_error) #endif #if PY_MAJOR_VERSION < 3 __pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage->tp_print = 0; #endif #if !CYTHON_COMPILING_IN_LIMITED_API if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage->tp_dictoffset && __pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage->tp_getattro == PyObject_GenericGetAttr)) { __pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage->tp_getattro = __Pyx_PyObject_GenericGetAttr; } #endif if (PyObject_SetAttr(__pyx_m, __pyx_n_s_RawResponseMessage_2, (PyObject *) __pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage) < 0) __PYX_ERR(0, 210, __pyx_L1_error) #if !CYTHON_COMPILING_IN_LIMITED_API if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage) < 0) __PYX_ERR(0, 210, __pyx_L1_error) #endif __pyx_vtabptr_7aiohttp_12_http_parser_HttpParser = &__pyx_vtable_7aiohttp_12_http_parser_HttpParser; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._init = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, enum llhttp_type, PyObject *, PyObject *, int, struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init *__pyx_optional_args))__pyx_f_7aiohttp_12_http_parser_10HttpParser__init; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._process_header = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__process_header; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_header_field = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, char *, size_t))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_field; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_header_value = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, char *, size_t))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_value; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_headers_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_headers_complete; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_message_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_message_complete; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_chunk_header = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_header; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_chunk_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_complete; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_status_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_status_complete; __pyx_vtable_7aiohttp_12_http_parser_HttpParser.http_version = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version; #if CYTHON_USE_TYPE_SPECS __pyx_ptype_7aiohttp_12_http_parser_HttpParser = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7aiohttp_12_http_parser_HttpParser_spec, NULL); if (unlikely(!__pyx_ptype_7aiohttp_12_http_parser_HttpParser)) __PYX_ERR(0, 272, __pyx_L1_error) if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7aiohttp_12_http_parser_HttpParser_spec, __pyx_ptype_7aiohttp_12_http_parser_HttpParser) < 0) __PYX_ERR(0, 272, __pyx_L1_error) #else __pyx_ptype_7aiohttp_12_http_parser_HttpParser = &__pyx_type_7aiohttp_12_http_parser_HttpParser; #endif #if !CYTHON_COMPILING_IN_LIMITED_API #endif #if !CYTHON_USE_TYPE_SPECS if (__Pyx_PyType_Ready(__pyx_ptype_7aiohttp_12_http_parser_HttpParser) < 0) __PYX_ERR(0, 272, __pyx_L1_error) #endif #if PY_MAJOR_VERSION < 3 __pyx_ptype_7aiohttp_12_http_parser_HttpParser->tp_print = 0; #endif #if !CYTHON_COMPILING_IN_LIMITED_API if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7aiohttp_12_http_parser_HttpParser->tp_dictoffset && __pyx_ptype_7aiohttp_12_http_parser_HttpParser->tp_getattro == PyObject_GenericGetAttr)) { __pyx_ptype_7aiohttp_12_http_parser_HttpParser->tp_getattro = __Pyx_PyObject_GenericGetAttr; } #endif if (__Pyx_SetVtable(__pyx_ptype_7aiohttp_12_http_parser_HttpParser, __pyx_vtabptr_7aiohttp_12_http_parser_HttpParser) < 0) __PYX_ERR(0, 272, __pyx_L1_error) #if !CYTHON_COMPILING_IN_LIMITED_API if (__Pyx_MergeVtables(__pyx_ptype_7aiohttp_12_http_parser_HttpParser) < 0) __PYX_ERR(0, 272, __pyx_L1_error) #endif #if !CYTHON_COMPILING_IN_LIMITED_API if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7aiohttp_12_http_parser_HttpParser) < 0) __PYX_ERR(0, 272, __pyx_L1_error) #endif __pyx_vtabptr_7aiohttp_12_http_parser_HttpRequestParser = &__pyx_vtable_7aiohttp_12_http_parser_HttpRequestParser; __pyx_vtable_7aiohttp_12_http_parser_HttpRequestParser.__pyx_base = *__pyx_vtabptr_7aiohttp_12_http_parser_HttpParser; __pyx_vtable_7aiohttp_12_http_parser_HttpRequestParser.__pyx_base._on_status_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_17HttpRequestParser__on_status_complete; #if CYTHON_USE_TYPE_SPECS __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7aiohttp_12_http_parser_HttpParser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 574, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7aiohttp_12_http_parser_HttpRequestParser_spec, __pyx_t_1); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(!__pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser)) __PYX_ERR(0, 574, __pyx_L1_error) if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7aiohttp_12_http_parser_HttpRequestParser_spec, __pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 574, __pyx_L1_error) #else __pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser = &__pyx_type_7aiohttp_12_http_parser_HttpRequestParser; #endif #if !CYTHON_COMPILING_IN_LIMITED_API __pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser->tp_base = __pyx_ptype_7aiohttp_12_http_parser_HttpParser; #endif #if !CYTHON_USE_TYPE_SPECS if (__Pyx_PyType_Ready(__pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 574, __pyx_L1_error) #endif #if PY_MAJOR_VERSION < 3 __pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser->tp_print = 0; #endif #if !CYTHON_COMPILING_IN_LIMITED_API if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser->tp_dictoffset && __pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser->tp_getattro == PyObject_GenericGetAttr)) { __pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser->tp_getattro = __Pyx_PyObject_GenericGetAttr; } #endif if (__Pyx_SetVtable(__pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser, __pyx_vtabptr_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 574, __pyx_L1_error) #if !CYTHON_COMPILING_IN_LIMITED_API if (__Pyx_MergeVtables(__pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 574, __pyx_L1_error) #endif if (PyObject_SetAttr(__pyx_m, __pyx_n_s_HttpRequestParser, (PyObject *) __pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 574, __pyx_L1_error) #if !CYTHON_COMPILING_IN_LIMITED_API if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 574, __pyx_L1_error) #endif __pyx_vtabptr_7aiohttp_12_http_parser_HttpResponseParser = &__pyx_vtable_7aiohttp_12_http_parser_HttpResponseParser; __pyx_vtable_7aiohttp_12_http_parser_HttpResponseParser.__pyx_base = *__pyx_vtabptr_7aiohttp_12_http_parser_HttpParser; __pyx_vtable_7aiohttp_12_http_parser_HttpResponseParser.__pyx_base._on_status_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_18HttpResponseParser__on_status_complete; #if CYTHON_USE_TYPE_SPECS __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_7aiohttp_12_http_parser_HttpParser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 638, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7aiohttp_12_http_parser_HttpResponseParser_spec, __pyx_t_1); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(!__pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser)) __PYX_ERR(0, 638, __pyx_L1_error) if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7aiohttp_12_http_parser_HttpResponseParser_spec, __pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 638, __pyx_L1_error) #else __pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser = &__pyx_type_7aiohttp_12_http_parser_HttpResponseParser; #endif #if !CYTHON_COMPILING_IN_LIMITED_API __pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser->tp_base = __pyx_ptype_7aiohttp_12_http_parser_HttpParser; #endif #if !CYTHON_USE_TYPE_SPECS if (__Pyx_PyType_Ready(__pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 638, __pyx_L1_error) #endif #if PY_MAJOR_VERSION < 3 __pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser->tp_print = 0; #endif #if !CYTHON_COMPILING_IN_LIMITED_API if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser->tp_dictoffset && __pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser->tp_getattro == PyObject_GenericGetAttr)) { __pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser->tp_getattro = __Pyx_PyObject_GenericGetAttr; } #endif if (__Pyx_SetVtable(__pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser, __pyx_vtabptr_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 638, __pyx_L1_error) #if !CYTHON_COMPILING_IN_LIMITED_API if (__Pyx_MergeVtables(__pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 638, __pyx_L1_error) #endif if (PyObject_SetAttr(__pyx_m, __pyx_n_s_HttpResponseParser, (PyObject *) __pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 638, __pyx_L1_error) #if !CYTHON_COMPILING_IN_LIMITED_API if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 638, __pyx_L1_error) #endif #if CYTHON_USE_TYPE_SPECS __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct__genexpr = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct__genexpr_spec, NULL); if (unlikely(!__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct__genexpr)) __PYX_ERR(0, 147, __pyx_L1_error) if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct__genexpr_spec, __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct__genexpr) < 0) __PYX_ERR(0, 147, __pyx_L1_error) #else __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct__genexpr = &__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct__genexpr; #endif #if !CYTHON_COMPILING_IN_LIMITED_API #endif #if !CYTHON_USE_TYPE_SPECS if (__Pyx_PyType_Ready(__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct__genexpr) < 0) __PYX_ERR(0, 147, __pyx_L1_error) #endif #if PY_MAJOR_VERSION < 3 __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct__genexpr->tp_print = 0; #endif #if !CYTHON_COMPILING_IN_LIMITED_API if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct__genexpr->tp_dictoffset && __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct__genexpr->tp_getattro == PyObject_GenericGetAttr)) { __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct__genexpr->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; } #endif #if CYTHON_USE_TYPE_SPECS __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr_spec, NULL); if (unlikely(!__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr)) __PYX_ERR(0, 244, __pyx_L1_error) if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr_spec, __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr) < 0) __PYX_ERR(0, 244, __pyx_L1_error) #else __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr = &__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr; #endif #if !CYTHON_COMPILING_IN_LIMITED_API #endif #if !CYTHON_USE_TYPE_SPECS if (__Pyx_PyType_Ready(__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr) < 0) __PYX_ERR(0, 244, __pyx_L1_error) #endif #if PY_MAJOR_VERSION < 3 __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr->tp_print = 0; #endif #if !CYTHON_COMPILING_IN_LIMITED_API if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr->tp_dictoffset && __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr->tp_getattro == PyObject_GenericGetAttr)) { __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; } #endif __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_modinit_type_import_code(void) { __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); /*--- Type import code ---*/ __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_5(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_5(PyTypeObject), #elif CYTHON_COMPILING_IN_LIMITED_API sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_5(PyTypeObject), #else sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_5(PyHeapTypeObject), #endif __Pyx_ImportType_CheckSize_Warn_3_0_5); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType_3_0_5(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_5(PyBoolObject),__Pyx_ImportType_CheckSize_Warn_3_0_5); if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(4, 8, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType_3_0_5(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_5(PyComplexObject),__Pyx_ImportType_CheckSize_Warn_3_0_5); if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(5, 15, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_modinit_variable_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); /*--- Variable import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); /*--- Function import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } #if PY_MAJOR_VERSION >= 3 #if CYTHON_PEP489_MULTI_PHASE_INIT static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ static int __pyx_pymod_exec__http_parser(PyObject* module); /*proto*/ static PyModuleDef_Slot __pyx_moduledef_slots[] = { {Py_mod_create, (void*)__pyx_pymod_create}, {Py_mod_exec, (void*)__pyx_pymod_exec__http_parser}, {0, NULL} }; #endif #ifdef __cplusplus namespace { struct PyModuleDef __pyx_moduledef = #else static struct PyModuleDef __pyx_moduledef = #endif { PyModuleDef_HEAD_INIT, "_http_parser", 0, /* m_doc */ #if CYTHON_PEP489_MULTI_PHASE_INIT 0, /* m_size */ #elif CYTHON_USE_MODULE_STATE sizeof(__pyx_mstate), /* m_size */ #else -1, /* m_size */ #endif __pyx_methods /* m_methods */, #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_moduledef_slots, /* m_slots */ #else NULL, /* m_reload */ #endif #if CYTHON_USE_MODULE_STATE __pyx_m_traverse, /* m_traverse */ __pyx_m_clear, /* m_clear */ NULL /* m_free */ #else NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ #endif }; #ifdef __cplusplus } /* anonymous namespace */ #endif #endif #ifndef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC #elif PY_MAJOR_VERSION < 3 #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" void #else #define __Pyx_PyMODINIT_FUNC void #endif #else #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" PyObject * #else #define __Pyx_PyMODINIT_FUNC PyObject * #endif #endif #if PY_MAJOR_VERSION < 3 __Pyx_PyMODINIT_FUNC init_http_parser(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC init_http_parser(void) #else __Pyx_PyMODINIT_FUNC PyInit__http_parser(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC PyInit__http_parser(void) #if CYTHON_PEP489_MULTI_PHASE_INIT { return PyModuleDef_Init(&__pyx_moduledef); } static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { #if PY_VERSION_HEX >= 0x030700A1 static PY_INT64_T main_interpreter_id = -1; PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); if (main_interpreter_id == -1) { main_interpreter_id = current_id; return (unlikely(current_id == -1)) ? -1 : 0; } else if (unlikely(main_interpreter_id != current_id)) #else static PyInterpreterState *main_interpreter = NULL; PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; if (!main_interpreter) { main_interpreter = current_interpreter; } else if (unlikely(main_interpreter != current_interpreter)) #endif { PyErr_SetString( PyExc_ImportError, "Interpreter change detected - this module can only be loaded into one interpreter per process."); return -1; } return 0; } #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) #else static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) #endif { PyObject *value = PyObject_GetAttrString(spec, from_name); int result = 0; if (likely(value)) { if (allow_none || value != Py_None) { #if CYTHON_COMPILING_IN_LIMITED_API result = PyModule_AddObject(module, to_name, value); #else result = PyDict_SetItemString(moddict, to_name, value); #endif } Py_DECREF(value); } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); } else { result = -1; } return result; } static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { PyObject *module = NULL, *moddict, *modname; CYTHON_UNUSED_VAR(def); if (__Pyx_check_single_interpreter()) return NULL; if (__pyx_m) return __Pyx_NewRef(__pyx_m); modname = PyObject_GetAttrString(spec, "name"); if (unlikely(!modname)) goto bad; module = PyModule_NewObject(modname); Py_DECREF(modname); if (unlikely(!module)) goto bad; #if CYTHON_COMPILING_IN_LIMITED_API moddict = module; #else moddict = PyModule_GetDict(module); if (unlikely(!moddict)) goto bad; #endif if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; return module; bad: Py_XDECREF(module); return NULL; } static CYTHON_SMALL_CODE int __pyx_pymod_exec__http_parser(PyObject *__pyx_pyinit_module) #endif #endif { int stringtab_initialized = 0; #if CYTHON_USE_MODULE_STATE int pystate_addmodule_run = 0; #endif PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; PyObject *__pyx_t_12 = NULL; PyObject *__pyx_t_13 = NULL; PyObject *__pyx_t_14 = NULL; PyObject *__pyx_t_15 = NULL; PyObject *__pyx_t_16 = NULL; PyObject *__pyx_t_17 = NULL; PyObject *__pyx_t_18 = NULL; PyObject *__pyx_t_19 = NULL; PyObject *__pyx_t_20 = NULL; PyObject *__pyx_t_21 = NULL; PyObject *__pyx_t_22 = NULL; PyObject *__pyx_t_23 = NULL; PyObject *__pyx_t_24 = NULL; PyObject *__pyx_t_25 = NULL; PyObject *__pyx_t_26 = NULL; PyObject *__pyx_t_27 = NULL; PyObject *__pyx_t_28 = NULL; PyObject *__pyx_t_29 = NULL; PyObject *__pyx_t_30 = NULL; PyObject *__pyx_t_31 = NULL; PyObject *__pyx_t_32 = NULL; PyObject *__pyx_t_33 = NULL; PyObject *__pyx_t_34 = NULL; PyObject *__pyx_t_35 = NULL; PyObject *__pyx_t_36 = NULL; PyObject *__pyx_t_37 = NULL; PyObject *__pyx_t_38 = NULL; PyObject *__pyx_t_39 = NULL; PyObject *__pyx_t_40 = NULL; PyObject *__pyx_t_41 = NULL; PyObject *__pyx_t_42 = NULL; PyObject *__pyx_t_43 = NULL; PyObject *__pyx_t_44 = NULL; PyObject *__pyx_t_45 = NULL; PyObject *__pyx_t_46 = NULL; PyObject *__pyx_t_47 = NULL; PyObject *__pyx_t_48 = NULL; PyObject *__pyx_t_49 = NULL; PyObject *__pyx_t_50 = NULL; PyObject *__pyx_t_51 = NULL; PyObject *__pyx_t_52 = NULL; PyObject *__pyx_t_53 = NULL; PyObject *__pyx_t_54 = NULL; PyObject *__pyx_t_55 = NULL; PyObject *__pyx_t_56 = NULL; PyObject *__pyx_t_57 = NULL; PyObject *__pyx_t_58 = NULL; PyObject *__pyx_t_59 = NULL; PyObject *__pyx_t_60 = NULL; PyObject *__pyx_t_61 = NULL; PyObject *__pyx_t_62 = NULL; PyObject *__pyx_t_63 = NULL; PyObject *__pyx_t_64 = NULL; PyObject *__pyx_t_65 = NULL; PyObject *__pyx_t_66 = NULL; PyObject *__pyx_t_67 = NULL; PyObject *__pyx_t_68 = NULL; PyObject *__pyx_t_69 = NULL; PyObject *__pyx_t_70 = NULL; PyObject *__pyx_t_71 = NULL; PyObject *__pyx_t_72 = NULL; PyObject *__pyx_t_73 = NULL; PyObject *__pyx_t_74 = NULL; PyObject *__pyx_t_75 = NULL; PyObject *__pyx_t_76 = NULL; PyObject *__pyx_t_77 = NULL; PyObject *__pyx_t_78 = NULL; PyObject *__pyx_t_79 = NULL; long __pyx_t_80; llhttp_method_t __pyx_t_81; char const *__pyx_t_82; Py_ssize_t __pyx_t_83; int __pyx_t_84; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m) { if (__pyx_m == __pyx_pyinit_module) return 0; PyErr_SetString(PyExc_RuntimeError, "Module '_http_parser' has already been imported. Re-initialisation is not supported."); return -1; } #elif PY_MAJOR_VERSION >= 3 if (__pyx_m) return __Pyx_NewRef(__pyx_m); #endif /*--- Module creation code ---*/ #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_m = __pyx_pyinit_module; Py_INCREF(__pyx_m); #else #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("_http_parser", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #elif CYTHON_USE_MODULE_STATE __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) { int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to _http_parser pseudovariable */ if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) pystate_addmodule_run = 1; } #else __pyx_m = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #endif #endif CYTHON_UNUSED_VAR(__pyx_t_1); __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_d); __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__http_parser(void)", 0); if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pxy_PyFrame_Initialize_Offsets __Pxy_PyFrame_Initialize_Offsets(); #endif __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pyx_CyFunction_USED if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Coroutine_USED if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_StopAsyncIteration_USED if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS PyEval_InitThreads(); #endif /*--- Initialize various global constants etc. ---*/ if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) stringtab_initialized = 1; if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif if (__pyx_module_is_main_aiohttp___http_parser) { if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) if (!PyDict_GetItemString(modules, "aiohttp._http_parser")) { if (unlikely((PyDict_SetItemString(modules, "aiohttp._http_parser", __pyx_m) < 0))) __PYX_ERR(0, 1, __pyx_L1_error) } } #endif /*--- Builtin init code ---*/ if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Constants init code ---*/ if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Global type/function init code ---*/ (void)__Pyx_modinit_global_init_code(); (void)__Pyx_modinit_variable_export_code(); (void)__Pyx_modinit_function_export_code(); if (unlikely((__Pyx_modinit_type_init_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) if (unlikely((__Pyx_modinit_type_import_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) (void)__Pyx_modinit_variable_import_code(); (void)__Pyx_modinit_function_import_code(); /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /* "aiohttp/_http_parser.pyx":18 * from libc.string cimport memcpy * * from multidict import CIMultiDict as _CIMultiDict, CIMultiDictProxy as _CIMultiDictProxy # <<<<<<<<<<<<<< * from yarl import URL as _URL * */ __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 18, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_CIMultiDict); __Pyx_GIVEREF(__pyx_n_s_CIMultiDict); if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_CIMultiDict)) __PYX_ERR(0, 18, __pyx_L1_error); __Pyx_INCREF(__pyx_n_s_CIMultiDictProxy); __Pyx_GIVEREF(__pyx_n_s_CIMultiDictProxy); if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_CIMultiDictProxy)) __PYX_ERR(0, 18, __pyx_L1_error); __pyx_t_3 = __Pyx_Import(__pyx_n_s_multidict, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 18, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_CIMultiDict); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 18, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_CIMultiDict_2, __pyx_t_2) < 0) __PYX_ERR(0, 18, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_CIMultiDictProxy); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 18, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_CIMultiDictProxy_2, __pyx_t_2) < 0) __PYX_ERR(0, 18, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":19 * * from multidict import CIMultiDict as _CIMultiDict, CIMultiDictProxy as _CIMultiDictProxy * from yarl import URL as _URL # <<<<<<<<<<<<<< * * from aiohttp import hdrs */ __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_s_URL); __Pyx_GIVEREF(__pyx_n_s_URL); if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_URL)) __PYX_ERR(0, 19, __pyx_L1_error); __pyx_t_2 = __Pyx_Import(__pyx_n_s_yarl, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_URL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_URL_2, __pyx_t_3) < 0) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":21 * from yarl import URL as _URL * * from aiohttp import hdrs # <<<<<<<<<<<<<< * from aiohttp.helpers import DEBUG, set_exception * */ __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 21, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_hdrs); __Pyx_GIVEREF(__pyx_n_s_hdrs); if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_hdrs)) __PYX_ERR(0, 21, __pyx_L1_error); __pyx_t_3 = __Pyx_Import(__pyx_n_s_aiohttp, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 21, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 21, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_hdrs, __pyx_t_2) < 0) __PYX_ERR(0, 21, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":22 * * from aiohttp import hdrs * from aiohttp.helpers import DEBUG, set_exception # <<<<<<<<<<<<<< * * from .http_exceptions import ( */ __pyx_t_3 = PyList_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 22, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_s_DEBUG); __Pyx_GIVEREF(__pyx_n_s_DEBUG); if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_DEBUG)) __PYX_ERR(0, 22, __pyx_L1_error); __Pyx_INCREF(__pyx_n_s_set_exception); __Pyx_GIVEREF(__pyx_n_s_set_exception); if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 1, __pyx_n_s_set_exception)) __PYX_ERR(0, 22, __pyx_L1_error); __pyx_t_2 = __Pyx_Import(__pyx_n_s_aiohttp_helpers, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 22, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_DEBUG); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 22, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_DEBUG, __pyx_t_3) < 0) __PYX_ERR(0, 22, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_set_exception); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 22, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_set_exception, __pyx_t_3) < 0) __PYX_ERR(0, 22, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":25 * * from .http_exceptions import ( * BadHttpMessage, # <<<<<<<<<<<<<< * BadStatusLine, * ContentLengthError, */ __pyx_t_2 = PyList_New(8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 25, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_BadHttpMessage); __Pyx_GIVEREF(__pyx_n_s_BadHttpMessage); if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_BadHttpMessage)) __PYX_ERR(0, 25, __pyx_L1_error); __Pyx_INCREF(__pyx_n_s_BadStatusLine); __Pyx_GIVEREF(__pyx_n_s_BadStatusLine); if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_BadStatusLine)) __PYX_ERR(0, 25, __pyx_L1_error); __Pyx_INCREF(__pyx_n_s_ContentLengthError); __Pyx_GIVEREF(__pyx_n_s_ContentLengthError); if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_ContentLengthError)) __PYX_ERR(0, 25, __pyx_L1_error); __Pyx_INCREF(__pyx_n_s_InvalidHeader); __Pyx_GIVEREF(__pyx_n_s_InvalidHeader); if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 3, __pyx_n_s_InvalidHeader)) __PYX_ERR(0, 25, __pyx_L1_error); __Pyx_INCREF(__pyx_n_s_InvalidURLError); __Pyx_GIVEREF(__pyx_n_s_InvalidURLError); if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 4, __pyx_n_s_InvalidURLError)) __PYX_ERR(0, 25, __pyx_L1_error); __Pyx_INCREF(__pyx_n_s_LineTooLong); __Pyx_GIVEREF(__pyx_n_s_LineTooLong); if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 5, __pyx_n_s_LineTooLong)) __PYX_ERR(0, 25, __pyx_L1_error); __Pyx_INCREF(__pyx_n_s_PayloadEncodingError); __Pyx_GIVEREF(__pyx_n_s_PayloadEncodingError); if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 6, __pyx_n_s_PayloadEncodingError)) __PYX_ERR(0, 25, __pyx_L1_error); __Pyx_INCREF(__pyx_n_s_TransferEncodingError); __Pyx_GIVEREF(__pyx_n_s_TransferEncodingError); if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 7, __pyx_n_s_TransferEncodingError)) __PYX_ERR(0, 25, __pyx_L1_error); /* "aiohttp/_http_parser.pyx":24 * from aiohttp.helpers import DEBUG, set_exception * * from .http_exceptions import ( # <<<<<<<<<<<<<< * BadHttpMessage, * BadStatusLine, */ __pyx_t_3 = __Pyx_Import(__pyx_n_s_http_exceptions, __pyx_t_2, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_BadHttpMessage); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_BadHttpMessage, __pyx_t_2) < 0) __PYX_ERR(0, 25, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_BadStatusLine); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_BadStatusLine, __pyx_t_2) < 0) __PYX_ERR(0, 26, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_ContentLengthError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_ContentLengthError, __pyx_t_2) < 0) __PYX_ERR(0, 27, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_InvalidHeader); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_InvalidHeader, __pyx_t_2) < 0) __PYX_ERR(0, 28, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_InvalidURLError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_InvalidURLError, __pyx_t_2) < 0) __PYX_ERR(0, 29, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_LineTooLong, __pyx_t_2) < 0) __PYX_ERR(0, 30, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PayloadEncodingError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_PayloadEncodingError, __pyx_t_2) < 0) __PYX_ERR(0, 31, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_TransferEncodingError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_TransferEncodingError, __pyx_t_2) < 0) __PYX_ERR(0, 32, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":34 * TransferEncodingError, * ) * from .http_parser import DeflateBuffer as _DeflateBuffer # <<<<<<<<<<<<<< * from .http_writer import ( * HttpVersion as _HttpVersion, */ __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_s_DeflateBuffer); __Pyx_GIVEREF(__pyx_n_s_DeflateBuffer); if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_DeflateBuffer)) __PYX_ERR(0, 34, __pyx_L1_error); __pyx_t_2 = __Pyx_Import(__pyx_n_s_http_parser, __pyx_t_3, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_DeflateBuffer); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_DeflateBuffer_2, __pyx_t_3) < 0) __PYX_ERR(0, 34, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":36 * from .http_parser import DeflateBuffer as _DeflateBuffer * from .http_writer import ( * HttpVersion as _HttpVersion, # <<<<<<<<<<<<<< * HttpVersion10 as _HttpVersion10, * HttpVersion11 as _HttpVersion11, */ __pyx_t_2 = PyList_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 36, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_HttpVersion); __Pyx_GIVEREF(__pyx_n_s_HttpVersion); if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_HttpVersion)) __PYX_ERR(0, 36, __pyx_L1_error); __Pyx_INCREF(__pyx_n_s_HttpVersion10); __Pyx_GIVEREF(__pyx_n_s_HttpVersion10); if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_HttpVersion10)) __PYX_ERR(0, 36, __pyx_L1_error); __Pyx_INCREF(__pyx_n_s_HttpVersion11); __Pyx_GIVEREF(__pyx_n_s_HttpVersion11); if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_HttpVersion11)) __PYX_ERR(0, 36, __pyx_L1_error); /* "aiohttp/_http_parser.pyx":35 * ) * from .http_parser import DeflateBuffer as _DeflateBuffer * from .http_writer import ( # <<<<<<<<<<<<<< * HttpVersion as _HttpVersion, * HttpVersion10 as _HttpVersion10, */ __pyx_t_3 = __Pyx_Import(__pyx_n_s_http_writer, __pyx_t_2, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_HttpVersion); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_HttpVersion_2, __pyx_t_2) < 0) __PYX_ERR(0, 36, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_HttpVersion10); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_HttpVersion10_2, __pyx_t_2) < 0) __PYX_ERR(0, 37, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_HttpVersion11); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_HttpVersion11_2, __pyx_t_2) < 0) __PYX_ERR(0, 38, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":40 * HttpVersion11 as _HttpVersion11, * ) * from .streams import EMPTY_PAYLOAD as _EMPTY_PAYLOAD, StreamReader as _StreamReader # <<<<<<<<<<<<<< * * cimport cython */ __pyx_t_3 = PyList_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_s_EMPTY_PAYLOAD); __Pyx_GIVEREF(__pyx_n_s_EMPTY_PAYLOAD); if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_EMPTY_PAYLOAD)) __PYX_ERR(0, 40, __pyx_L1_error); __Pyx_INCREF(__pyx_n_s_StreamReader); __Pyx_GIVEREF(__pyx_n_s_StreamReader); if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 1, __pyx_n_s_StreamReader)) __PYX_ERR(0, 40, __pyx_L1_error); __pyx_t_2 = __Pyx_Import(__pyx_n_s_streams, __pyx_t_3, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_EMPTY_PAYLOAD); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_EMPTY_PAYLOAD_2, __pyx_t_3) < 0) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_StreamReader); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_StreamReader_2, __pyx_t_3) < 0) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_headers.pxi":4 * # Run ./tools/gen.py to update it after the origin changing. * * from . import hdrs # <<<<<<<<<<<<<< * cdef tuple headers = ( * hdrs.ACCEPT, */ __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_hdrs); __Pyx_GIVEREF(__pyx_n_s_hdrs); if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_hdrs)) __PYX_ERR(6, 4, __pyx_L1_error); __pyx_t_3 = __Pyx_Import(__pyx_n_s__8, __pyx_t_2, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_hdrs, __pyx_t_2) < 0) __PYX_ERR(6, 4, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":6 * from . import hdrs * cdef tuple headers = ( * hdrs.ACCEPT, # <<<<<<<<<<<<<< * hdrs.ACCEPT_CHARSET, * hdrs.ACCEPT_ENCODING, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ACCEPT); if (unlikely(!__pyx_t_2)) __PYX_ERR(6, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":7 * cdef tuple headers = ( * hdrs.ACCEPT, * hdrs.ACCEPT_CHARSET, # <<<<<<<<<<<<<< * hdrs.ACCEPT_ENCODING, * hdrs.ACCEPT_LANGUAGE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ACCEPT_CHARSET); if (unlikely(!__pyx_t_4)) __PYX_ERR(6, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":8 * hdrs.ACCEPT, * hdrs.ACCEPT_CHARSET, * hdrs.ACCEPT_ENCODING, # <<<<<<<<<<<<<< * hdrs.ACCEPT_LANGUAGE, * hdrs.ACCEPT_RANGES, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ACCEPT_ENCODING); if (unlikely(!__pyx_t_5)) __PYX_ERR(6, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":9 * hdrs.ACCEPT_CHARSET, * hdrs.ACCEPT_ENCODING, * hdrs.ACCEPT_LANGUAGE, # <<<<<<<<<<<<<< * hdrs.ACCEPT_RANGES, * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ACCEPT_LANGUAGE); if (unlikely(!__pyx_t_6)) __PYX_ERR(6, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":10 * hdrs.ACCEPT_ENCODING, * hdrs.ACCEPT_LANGUAGE, * hdrs.ACCEPT_RANGES, # <<<<<<<<<<<<<< * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 10, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ACCEPT_RANGES); if (unlikely(!__pyx_t_7)) __PYX_ERR(6, 10, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":11 * hdrs.ACCEPT_LANGUAGE, * hdrs.ACCEPT_RANGES, * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, # <<<<<<<<<<<<<< * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, * hdrs.ACCESS_CONTROL_ALLOW_METHODS, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 11, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ACCESS_CONTROL_ALLOW_CREDENTIALS); if (unlikely(!__pyx_t_8)) __PYX_ERR(6, 11, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":12 * hdrs.ACCEPT_RANGES, * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, # <<<<<<<<<<<<<< * hdrs.ACCESS_CONTROL_ALLOW_METHODS, * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ACCESS_CONTROL_ALLOW_HEADERS); if (unlikely(!__pyx_t_9)) __PYX_ERR(6, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":13 * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, * hdrs.ACCESS_CONTROL_ALLOW_METHODS, # <<<<<<<<<<<<<< * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ACCESS_CONTROL_ALLOW_METHODS); if (unlikely(!__pyx_t_10)) __PYX_ERR(6, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":14 * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, * hdrs.ACCESS_CONTROL_ALLOW_METHODS, * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, # <<<<<<<<<<<<<< * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, * hdrs.ACCESS_CONTROL_MAX_AGE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ACCESS_CONTROL_ALLOW_ORIGIN); if (unlikely(!__pyx_t_11)) __PYX_ERR(6, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":15 * hdrs.ACCESS_CONTROL_ALLOW_METHODS, * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, # <<<<<<<<<<<<<< * hdrs.ACCESS_CONTROL_MAX_AGE, * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ACCESS_CONTROL_EXPOSE_HEADERS); if (unlikely(!__pyx_t_12)) __PYX_ERR(6, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":16 * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, * hdrs.ACCESS_CONTROL_MAX_AGE, # <<<<<<<<<<<<<< * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, * hdrs.ACCESS_CONTROL_REQUEST_METHOD, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 16, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ACCESS_CONTROL_MAX_AGE); if (unlikely(!__pyx_t_13)) __PYX_ERR(6, 16, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_13); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":17 * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, * hdrs.ACCESS_CONTROL_MAX_AGE, * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, # <<<<<<<<<<<<<< * hdrs.ACCESS_CONTROL_REQUEST_METHOD, * hdrs.AGE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ACCESS_CONTROL_REQUEST_HEADERS); if (unlikely(!__pyx_t_14)) __PYX_ERR(6, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_14); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":18 * hdrs.ACCESS_CONTROL_MAX_AGE, * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, * hdrs.ACCESS_CONTROL_REQUEST_METHOD, # <<<<<<<<<<<<<< * hdrs.AGE, * hdrs.ALLOW, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 18, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ACCESS_CONTROL_REQUEST_METHOD); if (unlikely(!__pyx_t_15)) __PYX_ERR(6, 18, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_15); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":19 * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, * hdrs.ACCESS_CONTROL_REQUEST_METHOD, * hdrs.AGE, # <<<<<<<<<<<<<< * hdrs.ALLOW, * hdrs.AUTHORIZATION, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_AGE); if (unlikely(!__pyx_t_16)) __PYX_ERR(6, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_16); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":20 * hdrs.ACCESS_CONTROL_REQUEST_METHOD, * hdrs.AGE, * hdrs.ALLOW, # <<<<<<<<<<<<<< * hdrs.AUTHORIZATION, * hdrs.CACHE_CONTROL, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 20, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_17 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ALLOW); if (unlikely(!__pyx_t_17)) __PYX_ERR(6, 20, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_17); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":21 * hdrs.AGE, * hdrs.ALLOW, * hdrs.AUTHORIZATION, # <<<<<<<<<<<<<< * hdrs.CACHE_CONTROL, * hdrs.CONNECTION, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 21, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_18 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_AUTHORIZATION); if (unlikely(!__pyx_t_18)) __PYX_ERR(6, 21, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_18); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":22 * hdrs.ALLOW, * hdrs.AUTHORIZATION, * hdrs.CACHE_CONTROL, # <<<<<<<<<<<<<< * hdrs.CONNECTION, * hdrs.CONTENT_DISPOSITION, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 22, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_19 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_CACHE_CONTROL); if (unlikely(!__pyx_t_19)) __PYX_ERR(6, 22, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_19); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":23 * hdrs.AUTHORIZATION, * hdrs.CACHE_CONTROL, * hdrs.CONNECTION, # <<<<<<<<<<<<<< * hdrs.CONTENT_DISPOSITION, * hdrs.CONTENT_ENCODING, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 23, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_20 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_CONNECTION); if (unlikely(!__pyx_t_20)) __PYX_ERR(6, 23, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_20); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":24 * hdrs.CACHE_CONTROL, * hdrs.CONNECTION, * hdrs.CONTENT_DISPOSITION, # <<<<<<<<<<<<<< * hdrs.CONTENT_ENCODING, * hdrs.CONTENT_LANGUAGE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_21 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_CONTENT_DISPOSITION); if (unlikely(!__pyx_t_21)) __PYX_ERR(6, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_21); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":25 * hdrs.CONNECTION, * hdrs.CONTENT_DISPOSITION, * hdrs.CONTENT_ENCODING, # <<<<<<<<<<<<<< * hdrs.CONTENT_LANGUAGE, * hdrs.CONTENT_LENGTH, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 25, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_22 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_CONTENT_ENCODING); if (unlikely(!__pyx_t_22)) __PYX_ERR(6, 25, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_22); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":26 * hdrs.CONTENT_DISPOSITION, * hdrs.CONTENT_ENCODING, * hdrs.CONTENT_LANGUAGE, # <<<<<<<<<<<<<< * hdrs.CONTENT_LENGTH, * hdrs.CONTENT_LOCATION, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 26, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_23 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_CONTENT_LANGUAGE); if (unlikely(!__pyx_t_23)) __PYX_ERR(6, 26, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_23); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":27 * hdrs.CONTENT_ENCODING, * hdrs.CONTENT_LANGUAGE, * hdrs.CONTENT_LENGTH, # <<<<<<<<<<<<<< * hdrs.CONTENT_LOCATION, * hdrs.CONTENT_MD5, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 27, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_24 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_CONTENT_LENGTH); if (unlikely(!__pyx_t_24)) __PYX_ERR(6, 27, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_24); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":28 * hdrs.CONTENT_LANGUAGE, * hdrs.CONTENT_LENGTH, * hdrs.CONTENT_LOCATION, # <<<<<<<<<<<<<< * hdrs.CONTENT_MD5, * hdrs.CONTENT_RANGE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 28, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_25 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_CONTENT_LOCATION); if (unlikely(!__pyx_t_25)) __PYX_ERR(6, 28, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_25); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":29 * hdrs.CONTENT_LENGTH, * hdrs.CONTENT_LOCATION, * hdrs.CONTENT_MD5, # <<<<<<<<<<<<<< * hdrs.CONTENT_RANGE, * hdrs.CONTENT_TRANSFER_ENCODING, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 29, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_26 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_CONTENT_MD5); if (unlikely(!__pyx_t_26)) __PYX_ERR(6, 29, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_26); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":30 * hdrs.CONTENT_LOCATION, * hdrs.CONTENT_MD5, * hdrs.CONTENT_RANGE, # <<<<<<<<<<<<<< * hdrs.CONTENT_TRANSFER_ENCODING, * hdrs.CONTENT_TYPE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_27 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_CONTENT_RANGE); if (unlikely(!__pyx_t_27)) __PYX_ERR(6, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_27); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":31 * hdrs.CONTENT_MD5, * hdrs.CONTENT_RANGE, * hdrs.CONTENT_TRANSFER_ENCODING, # <<<<<<<<<<<<<< * hdrs.CONTENT_TYPE, * hdrs.COOKIE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 31, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_28 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_CONTENT_TRANSFER_ENCODING); if (unlikely(!__pyx_t_28)) __PYX_ERR(6, 31, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_28); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":32 * hdrs.CONTENT_RANGE, * hdrs.CONTENT_TRANSFER_ENCODING, * hdrs.CONTENT_TYPE, # <<<<<<<<<<<<<< * hdrs.COOKIE, * hdrs.DATE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 32, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_29 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_CONTENT_TYPE); if (unlikely(!__pyx_t_29)) __PYX_ERR(6, 32, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_29); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":33 * hdrs.CONTENT_TRANSFER_ENCODING, * hdrs.CONTENT_TYPE, * hdrs.COOKIE, # <<<<<<<<<<<<<< * hdrs.DATE, * hdrs.DESTINATION, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 33, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_30 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_COOKIE); if (unlikely(!__pyx_t_30)) __PYX_ERR(6, 33, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_30); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":34 * hdrs.CONTENT_TYPE, * hdrs.COOKIE, * hdrs.DATE, # <<<<<<<<<<<<<< * hdrs.DESTINATION, * hdrs.DIGEST, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_31 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_DATE); if (unlikely(!__pyx_t_31)) __PYX_ERR(6, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_31); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":35 * hdrs.COOKIE, * hdrs.DATE, * hdrs.DESTINATION, # <<<<<<<<<<<<<< * hdrs.DIGEST, * hdrs.ETAG, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_32 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_DESTINATION); if (unlikely(!__pyx_t_32)) __PYX_ERR(6, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_32); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":36 * hdrs.DATE, * hdrs.DESTINATION, * hdrs.DIGEST, # <<<<<<<<<<<<<< * hdrs.ETAG, * hdrs.EXPECT, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 36, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_33 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_DIGEST); if (unlikely(!__pyx_t_33)) __PYX_ERR(6, 36, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_33); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":37 * hdrs.DESTINATION, * hdrs.DIGEST, * hdrs.ETAG, # <<<<<<<<<<<<<< * hdrs.EXPECT, * hdrs.EXPIRES, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 37, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_34 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ETAG); if (unlikely(!__pyx_t_34)) __PYX_ERR(6, 37, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_34); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":38 * hdrs.DIGEST, * hdrs.ETAG, * hdrs.EXPECT, # <<<<<<<<<<<<<< * hdrs.EXPIRES, * hdrs.FORWARDED, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 38, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_35 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_EXPECT); if (unlikely(!__pyx_t_35)) __PYX_ERR(6, 38, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_35); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":39 * hdrs.ETAG, * hdrs.EXPECT, * hdrs.EXPIRES, # <<<<<<<<<<<<<< * hdrs.FORWARDED, * hdrs.FROM, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 39, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_36 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_EXPIRES); if (unlikely(!__pyx_t_36)) __PYX_ERR(6, 39, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_36); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":40 * hdrs.EXPECT, * hdrs.EXPIRES, * hdrs.FORWARDED, # <<<<<<<<<<<<<< * hdrs.FROM, * hdrs.HOST, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_37 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_FORWARDED); if (unlikely(!__pyx_t_37)) __PYX_ERR(6, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_37); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":41 * hdrs.EXPIRES, * hdrs.FORWARDED, * hdrs.FROM, # <<<<<<<<<<<<<< * hdrs.HOST, * hdrs.IF_MATCH, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 41, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_38 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_FROM); if (unlikely(!__pyx_t_38)) __PYX_ERR(6, 41, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_38); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":42 * hdrs.FORWARDED, * hdrs.FROM, * hdrs.HOST, # <<<<<<<<<<<<<< * hdrs.IF_MATCH, * hdrs.IF_MODIFIED_SINCE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 42, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_39 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_HOST); if (unlikely(!__pyx_t_39)) __PYX_ERR(6, 42, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_39); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":43 * hdrs.FROM, * hdrs.HOST, * hdrs.IF_MATCH, # <<<<<<<<<<<<<< * hdrs.IF_MODIFIED_SINCE, * hdrs.IF_NONE_MATCH, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_40 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_IF_MATCH); if (unlikely(!__pyx_t_40)) __PYX_ERR(6, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_40); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":44 * hdrs.HOST, * hdrs.IF_MATCH, * hdrs.IF_MODIFIED_SINCE, # <<<<<<<<<<<<<< * hdrs.IF_NONE_MATCH, * hdrs.IF_RANGE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 44, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_41 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_IF_MODIFIED_SINCE); if (unlikely(!__pyx_t_41)) __PYX_ERR(6, 44, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_41); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":45 * hdrs.IF_MATCH, * hdrs.IF_MODIFIED_SINCE, * hdrs.IF_NONE_MATCH, # <<<<<<<<<<<<<< * hdrs.IF_RANGE, * hdrs.IF_UNMODIFIED_SINCE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 45, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_42 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_IF_NONE_MATCH); if (unlikely(!__pyx_t_42)) __PYX_ERR(6, 45, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_42); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":46 * hdrs.IF_MODIFIED_SINCE, * hdrs.IF_NONE_MATCH, * hdrs.IF_RANGE, # <<<<<<<<<<<<<< * hdrs.IF_UNMODIFIED_SINCE, * hdrs.KEEP_ALIVE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 46, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_43 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_IF_RANGE); if (unlikely(!__pyx_t_43)) __PYX_ERR(6, 46, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_43); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":47 * hdrs.IF_NONE_MATCH, * hdrs.IF_RANGE, * hdrs.IF_UNMODIFIED_SINCE, # <<<<<<<<<<<<<< * hdrs.KEEP_ALIVE, * hdrs.LAST_EVENT_ID, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 47, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_44 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_IF_UNMODIFIED_SINCE); if (unlikely(!__pyx_t_44)) __PYX_ERR(6, 47, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_44); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":48 * hdrs.IF_RANGE, * hdrs.IF_UNMODIFIED_SINCE, * hdrs.KEEP_ALIVE, # <<<<<<<<<<<<<< * hdrs.LAST_EVENT_ID, * hdrs.LAST_MODIFIED, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_45 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_KEEP_ALIVE); if (unlikely(!__pyx_t_45)) __PYX_ERR(6, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_45); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":49 * hdrs.IF_UNMODIFIED_SINCE, * hdrs.KEEP_ALIVE, * hdrs.LAST_EVENT_ID, # <<<<<<<<<<<<<< * hdrs.LAST_MODIFIED, * hdrs.LINK, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_46 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_LAST_EVENT_ID); if (unlikely(!__pyx_t_46)) __PYX_ERR(6, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_46); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":50 * hdrs.KEEP_ALIVE, * hdrs.LAST_EVENT_ID, * hdrs.LAST_MODIFIED, # <<<<<<<<<<<<<< * hdrs.LINK, * hdrs.LOCATION, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 50, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_47 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_LAST_MODIFIED); if (unlikely(!__pyx_t_47)) __PYX_ERR(6, 50, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_47); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":51 * hdrs.LAST_EVENT_ID, * hdrs.LAST_MODIFIED, * hdrs.LINK, # <<<<<<<<<<<<<< * hdrs.LOCATION, * hdrs.MAX_FORWARDS, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 51, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_48 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_LINK); if (unlikely(!__pyx_t_48)) __PYX_ERR(6, 51, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_48); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":52 * hdrs.LAST_MODIFIED, * hdrs.LINK, * hdrs.LOCATION, # <<<<<<<<<<<<<< * hdrs.MAX_FORWARDS, * hdrs.ORIGIN, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 52, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_49 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_LOCATION); if (unlikely(!__pyx_t_49)) __PYX_ERR(6, 52, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_49); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":53 * hdrs.LINK, * hdrs.LOCATION, * hdrs.MAX_FORWARDS, # <<<<<<<<<<<<<< * hdrs.ORIGIN, * hdrs.PRAGMA, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 53, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_50 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_MAX_FORWARDS); if (unlikely(!__pyx_t_50)) __PYX_ERR(6, 53, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_50); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":54 * hdrs.LOCATION, * hdrs.MAX_FORWARDS, * hdrs.ORIGIN, # <<<<<<<<<<<<<< * hdrs.PRAGMA, * hdrs.PROXY_AUTHENTICATE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 54, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_51 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ORIGIN); if (unlikely(!__pyx_t_51)) __PYX_ERR(6, 54, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_51); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":55 * hdrs.MAX_FORWARDS, * hdrs.ORIGIN, * hdrs.PRAGMA, # <<<<<<<<<<<<<< * hdrs.PROXY_AUTHENTICATE, * hdrs.PROXY_AUTHORIZATION, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 55, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_52 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_PRAGMA); if (unlikely(!__pyx_t_52)) __PYX_ERR(6, 55, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_52); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":56 * hdrs.ORIGIN, * hdrs.PRAGMA, * hdrs.PROXY_AUTHENTICATE, # <<<<<<<<<<<<<< * hdrs.PROXY_AUTHORIZATION, * hdrs.RANGE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 56, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_53 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_PROXY_AUTHENTICATE); if (unlikely(!__pyx_t_53)) __PYX_ERR(6, 56, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_53); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":57 * hdrs.PRAGMA, * hdrs.PROXY_AUTHENTICATE, * hdrs.PROXY_AUTHORIZATION, # <<<<<<<<<<<<<< * hdrs.RANGE, * hdrs.REFERER, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 57, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_54 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_PROXY_AUTHORIZATION); if (unlikely(!__pyx_t_54)) __PYX_ERR(6, 57, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_54); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":58 * hdrs.PROXY_AUTHENTICATE, * hdrs.PROXY_AUTHORIZATION, * hdrs.RANGE, # <<<<<<<<<<<<<< * hdrs.REFERER, * hdrs.RETRY_AFTER, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 58, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_55 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_RANGE); if (unlikely(!__pyx_t_55)) __PYX_ERR(6, 58, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_55); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":59 * hdrs.PROXY_AUTHORIZATION, * hdrs.RANGE, * hdrs.REFERER, # <<<<<<<<<<<<<< * hdrs.RETRY_AFTER, * hdrs.SEC_WEBSOCKET_ACCEPT, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 59, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_56 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_REFERER); if (unlikely(!__pyx_t_56)) __PYX_ERR(6, 59, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_56); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":60 * hdrs.RANGE, * hdrs.REFERER, * hdrs.RETRY_AFTER, # <<<<<<<<<<<<<< * hdrs.SEC_WEBSOCKET_ACCEPT, * hdrs.SEC_WEBSOCKET_EXTENSIONS, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 60, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_57 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_RETRY_AFTER); if (unlikely(!__pyx_t_57)) __PYX_ERR(6, 60, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_57); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":61 * hdrs.REFERER, * hdrs.RETRY_AFTER, * hdrs.SEC_WEBSOCKET_ACCEPT, # <<<<<<<<<<<<<< * hdrs.SEC_WEBSOCKET_EXTENSIONS, * hdrs.SEC_WEBSOCKET_KEY, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 61, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_58 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_SEC_WEBSOCKET_ACCEPT); if (unlikely(!__pyx_t_58)) __PYX_ERR(6, 61, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_58); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":62 * hdrs.RETRY_AFTER, * hdrs.SEC_WEBSOCKET_ACCEPT, * hdrs.SEC_WEBSOCKET_EXTENSIONS, # <<<<<<<<<<<<<< * hdrs.SEC_WEBSOCKET_KEY, * hdrs.SEC_WEBSOCKET_KEY1, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_59 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_SEC_WEBSOCKET_EXTENSIONS); if (unlikely(!__pyx_t_59)) __PYX_ERR(6, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_59); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":63 * hdrs.SEC_WEBSOCKET_ACCEPT, * hdrs.SEC_WEBSOCKET_EXTENSIONS, * hdrs.SEC_WEBSOCKET_KEY, # <<<<<<<<<<<<<< * hdrs.SEC_WEBSOCKET_KEY1, * hdrs.SEC_WEBSOCKET_PROTOCOL, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 63, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_60 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_SEC_WEBSOCKET_KEY); if (unlikely(!__pyx_t_60)) __PYX_ERR(6, 63, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_60); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":64 * hdrs.SEC_WEBSOCKET_EXTENSIONS, * hdrs.SEC_WEBSOCKET_KEY, * hdrs.SEC_WEBSOCKET_KEY1, # <<<<<<<<<<<<<< * hdrs.SEC_WEBSOCKET_PROTOCOL, * hdrs.SEC_WEBSOCKET_VERSION, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 64, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_61 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_SEC_WEBSOCKET_KEY1); if (unlikely(!__pyx_t_61)) __PYX_ERR(6, 64, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_61); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":65 * hdrs.SEC_WEBSOCKET_KEY, * hdrs.SEC_WEBSOCKET_KEY1, * hdrs.SEC_WEBSOCKET_PROTOCOL, # <<<<<<<<<<<<<< * hdrs.SEC_WEBSOCKET_VERSION, * hdrs.SERVER, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 65, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_62 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_SEC_WEBSOCKET_PROTOCOL); if (unlikely(!__pyx_t_62)) __PYX_ERR(6, 65, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_62); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":66 * hdrs.SEC_WEBSOCKET_KEY1, * hdrs.SEC_WEBSOCKET_PROTOCOL, * hdrs.SEC_WEBSOCKET_VERSION, # <<<<<<<<<<<<<< * hdrs.SERVER, * hdrs.SET_COOKIE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 66, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_63 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_SEC_WEBSOCKET_VERSION); if (unlikely(!__pyx_t_63)) __PYX_ERR(6, 66, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_63); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":67 * hdrs.SEC_WEBSOCKET_PROTOCOL, * hdrs.SEC_WEBSOCKET_VERSION, * hdrs.SERVER, # <<<<<<<<<<<<<< * hdrs.SET_COOKIE, * hdrs.TE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 67, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_64 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_SERVER); if (unlikely(!__pyx_t_64)) __PYX_ERR(6, 67, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_64); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":68 * hdrs.SEC_WEBSOCKET_VERSION, * hdrs.SERVER, * hdrs.SET_COOKIE, # <<<<<<<<<<<<<< * hdrs.TE, * hdrs.TRAILER, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_65 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_SET_COOKIE); if (unlikely(!__pyx_t_65)) __PYX_ERR(6, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_65); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":69 * hdrs.SERVER, * hdrs.SET_COOKIE, * hdrs.TE, # <<<<<<<<<<<<<< * hdrs.TRAILER, * hdrs.TRANSFER_ENCODING, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 69, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_66 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_TE); if (unlikely(!__pyx_t_66)) __PYX_ERR(6, 69, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_66); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":70 * hdrs.SET_COOKIE, * hdrs.TE, * hdrs.TRAILER, # <<<<<<<<<<<<<< * hdrs.TRANSFER_ENCODING, * hdrs.URI, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 70, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_67 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_TRAILER); if (unlikely(!__pyx_t_67)) __PYX_ERR(6, 70, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_67); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":71 * hdrs.TE, * hdrs.TRAILER, * hdrs.TRANSFER_ENCODING, # <<<<<<<<<<<<<< * hdrs.URI, * hdrs.UPGRADE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 71, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_68 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_TRANSFER_ENCODING); if (unlikely(!__pyx_t_68)) __PYX_ERR(6, 71, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_68); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":72 * hdrs.TRAILER, * hdrs.TRANSFER_ENCODING, * hdrs.URI, # <<<<<<<<<<<<<< * hdrs.UPGRADE, * hdrs.USER_AGENT, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_69 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_URI); if (unlikely(!__pyx_t_69)) __PYX_ERR(6, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_69); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":73 * hdrs.TRANSFER_ENCODING, * hdrs.URI, * hdrs.UPGRADE, # <<<<<<<<<<<<<< * hdrs.USER_AGENT, * hdrs.VARY, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 73, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_70 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_UPGRADE); if (unlikely(!__pyx_t_70)) __PYX_ERR(6, 73, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_70); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":74 * hdrs.URI, * hdrs.UPGRADE, * hdrs.USER_AGENT, # <<<<<<<<<<<<<< * hdrs.VARY, * hdrs.VIA, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 74, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_71 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_USER_AGENT); if (unlikely(!__pyx_t_71)) __PYX_ERR(6, 74, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_71); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":75 * hdrs.UPGRADE, * hdrs.USER_AGENT, * hdrs.VARY, # <<<<<<<<<<<<<< * hdrs.VIA, * hdrs.WWW_AUTHENTICATE, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 75, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_72 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_VARY); if (unlikely(!__pyx_t_72)) __PYX_ERR(6, 75, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_72); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":76 * hdrs.USER_AGENT, * hdrs.VARY, * hdrs.VIA, # <<<<<<<<<<<<<< * hdrs.WWW_AUTHENTICATE, * hdrs.WANT_DIGEST, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 76, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_73 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_VIA); if (unlikely(!__pyx_t_73)) __PYX_ERR(6, 76, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_73); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":77 * hdrs.VARY, * hdrs.VIA, * hdrs.WWW_AUTHENTICATE, # <<<<<<<<<<<<<< * hdrs.WANT_DIGEST, * hdrs.WARNING, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 77, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_74 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_WWW_AUTHENTICATE); if (unlikely(!__pyx_t_74)) __PYX_ERR(6, 77, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_74); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":78 * hdrs.VIA, * hdrs.WWW_AUTHENTICATE, * hdrs.WANT_DIGEST, # <<<<<<<<<<<<<< * hdrs.WARNING, * hdrs.X_FORWARDED_FOR, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 78, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_75 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_WANT_DIGEST); if (unlikely(!__pyx_t_75)) __PYX_ERR(6, 78, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_75); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":79 * hdrs.WWW_AUTHENTICATE, * hdrs.WANT_DIGEST, * hdrs.WARNING, # <<<<<<<<<<<<<< * hdrs.X_FORWARDED_FOR, * hdrs.X_FORWARDED_HOST, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 79, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_76 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_WARNING); if (unlikely(!__pyx_t_76)) __PYX_ERR(6, 79, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_76); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":80 * hdrs.WANT_DIGEST, * hdrs.WARNING, * hdrs.X_FORWARDED_FOR, # <<<<<<<<<<<<<< * hdrs.X_FORWARDED_HOST, * hdrs.X_FORWARDED_PROTO, */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 80, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_77 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_X_FORWARDED_FOR); if (unlikely(!__pyx_t_77)) __PYX_ERR(6, 80, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_77); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":81 * hdrs.WARNING, * hdrs.X_FORWARDED_FOR, * hdrs.X_FORWARDED_HOST, # <<<<<<<<<<<<<< * hdrs.X_FORWARDED_PROTO, * ) */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 81, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_78 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_X_FORWARDED_HOST); if (unlikely(!__pyx_t_78)) __PYX_ERR(6, 81, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_78); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":82 * hdrs.X_FORWARDED_FOR, * hdrs.X_FORWARDED_HOST, * hdrs.X_FORWARDED_PROTO, # <<<<<<<<<<<<<< * ) */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 82, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_79 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_X_FORWARDED_PROTO); if (unlikely(!__pyx_t_79)) __PYX_ERR(6, 82, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_79); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_headers.pxi":6 * from . import hdrs * cdef tuple headers = ( * hdrs.ACCEPT, # <<<<<<<<<<<<<< * hdrs.ACCEPT_CHARSET, * hdrs.ACCEPT_ENCODING, */ __pyx_t_3 = PyTuple_New(77); if (unlikely(!__pyx_t_3)) __PYX_ERR(6, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_2); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_4); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_5); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_5)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_6); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_t_6)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_7); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 4, __pyx_t_7)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_8); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 5, __pyx_t_8)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_9); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 6, __pyx_t_9)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_10); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 7, __pyx_t_10)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_11); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 8, __pyx_t_11)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_12); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 9, __pyx_t_12)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_13); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 10, __pyx_t_13)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_14); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 11, __pyx_t_14)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_15); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 12, __pyx_t_15)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_16); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 13, __pyx_t_16)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_17); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 14, __pyx_t_17)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_18); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 15, __pyx_t_18)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_19); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 16, __pyx_t_19)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_20); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 17, __pyx_t_20)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_21); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 18, __pyx_t_21)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_22); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 19, __pyx_t_22)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_23); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 20, __pyx_t_23)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_24); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 21, __pyx_t_24)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_25); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 22, __pyx_t_25)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_26); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 23, __pyx_t_26)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_27); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 24, __pyx_t_27)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_28); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 25, __pyx_t_28)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_29); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 26, __pyx_t_29)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_30); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 27, __pyx_t_30)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_31); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 28, __pyx_t_31)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_32); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 29, __pyx_t_32)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_33); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 30, __pyx_t_33)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_34); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 31, __pyx_t_34)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_35); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 32, __pyx_t_35)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_36); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 33, __pyx_t_36)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_37); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 34, __pyx_t_37)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_38); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 35, __pyx_t_38)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_39); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 36, __pyx_t_39)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_40); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 37, __pyx_t_40)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_41); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 38, __pyx_t_41)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_42); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 39, __pyx_t_42)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_43); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 40, __pyx_t_43)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_44); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 41, __pyx_t_44)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_45); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 42, __pyx_t_45)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_46); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 43, __pyx_t_46)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_47); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 44, __pyx_t_47)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_48); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 45, __pyx_t_48)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_49); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 46, __pyx_t_49)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_50); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 47, __pyx_t_50)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_51); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 48, __pyx_t_51)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_52); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 49, __pyx_t_52)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_53); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 50, __pyx_t_53)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_54); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 51, __pyx_t_54)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_55); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 52, __pyx_t_55)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_56); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 53, __pyx_t_56)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_57); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 54, __pyx_t_57)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_58); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 55, __pyx_t_58)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_59); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 56, __pyx_t_59)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_60); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 57, __pyx_t_60)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_61); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 58, __pyx_t_61)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_62); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 59, __pyx_t_62)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_63); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 60, __pyx_t_63)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_64); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 61, __pyx_t_64)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_65); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 62, __pyx_t_65)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_66); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 63, __pyx_t_66)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_67); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 64, __pyx_t_67)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_68); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 65, __pyx_t_68)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_69); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 66, __pyx_t_69)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_70); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 67, __pyx_t_70)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_71); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 68, __pyx_t_71)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_72); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 69, __pyx_t_72)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_73); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 70, __pyx_t_73)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_74); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 71, __pyx_t_74)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_75); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 72, __pyx_t_75)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_76); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 73, __pyx_t_76)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_77); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 74, __pyx_t_77)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_78); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 75, __pyx_t_78)) __PYX_ERR(6, 6, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_79); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 76, __pyx_t_79)) __PYX_ERR(6, 6, __pyx_L1_error); __pyx_t_2 = 0; __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_22 = 0; __pyx_t_23 = 0; __pyx_t_24 = 0; __pyx_t_25 = 0; __pyx_t_26 = 0; __pyx_t_27 = 0; __pyx_t_28 = 0; __pyx_t_29 = 0; __pyx_t_30 = 0; __pyx_t_31 = 0; __pyx_t_32 = 0; __pyx_t_33 = 0; __pyx_t_34 = 0; __pyx_t_35 = 0; __pyx_t_36 = 0; __pyx_t_37 = 0; __pyx_t_38 = 0; __pyx_t_39 = 0; __pyx_t_40 = 0; __pyx_t_41 = 0; __pyx_t_42 = 0; __pyx_t_43 = 0; __pyx_t_44 = 0; __pyx_t_45 = 0; __pyx_t_46 = 0; __pyx_t_47 = 0; __pyx_t_48 = 0; __pyx_t_49 = 0; __pyx_t_50 = 0; __pyx_t_51 = 0; __pyx_t_52 = 0; __pyx_t_53 = 0; __pyx_t_54 = 0; __pyx_t_55 = 0; __pyx_t_56 = 0; __pyx_t_57 = 0; __pyx_t_58 = 0; __pyx_t_59 = 0; __pyx_t_60 = 0; __pyx_t_61 = 0; __pyx_t_62 = 0; __pyx_t_63 = 0; __pyx_t_64 = 0; __pyx_t_65 = 0; __pyx_t_66 = 0; __pyx_t_67 = 0; __pyx_t_68 = 0; __pyx_t_69 = 0; __pyx_t_70 = 0; __pyx_t_71 = 0; __pyx_t_72 = 0; __pyx_t_73 = 0; __pyx_t_74 = 0; __pyx_t_75 = 0; __pyx_t_76 = 0; __pyx_t_77 = 0; __pyx_t_78 = 0; __pyx_t_79 = 0; __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_headers); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_headers, ((PyObject*)__pyx_t_3)); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":57 * char* PyByteArray_AsString(object) * * __all__ = ('HttpRequestParser', 'HttpResponseParser', # <<<<<<<<<<<<<< * 'RawRequestMessage', 'RawResponseMessage') * */ if (PyDict_SetItem(__pyx_d, __pyx_n_s_all, __pyx_tuple__14) < 0) __PYX_ERR(0, 57, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":60 * 'RawRequestMessage', 'RawResponseMessage') * * cdef object URL = _URL # <<<<<<<<<<<<<< * cdef object URL_build = URL.build * cdef object CIMultiDict = _CIMultiDict */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_URL_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 60, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_URL); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_URL, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":61 * * cdef object URL = _URL * cdef object URL_build = URL.build # <<<<<<<<<<<<<< * cdef object CIMultiDict = _CIMultiDict * cdef object CIMultiDictProxy = _CIMultiDictProxy */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_7aiohttp_12_http_parser_URL, __pyx_n_s_build); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 61, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_URL_build); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_URL_build, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":62 * cdef object URL = _URL * cdef object URL_build = URL.build * cdef object CIMultiDict = _CIMultiDict # <<<<<<<<<<<<<< * cdef object CIMultiDictProxy = _CIMultiDictProxy * cdef object HttpVersion = _HttpVersion */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_CIMultiDict_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_CIMultiDict); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_CIMultiDict, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":63 * cdef object URL_build = URL.build * cdef object CIMultiDict = _CIMultiDict * cdef object CIMultiDictProxy = _CIMultiDictProxy # <<<<<<<<<<<<<< * cdef object HttpVersion = _HttpVersion * cdef object HttpVersion10 = _HttpVersion10 */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_CIMultiDictProxy_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 63, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":64 * cdef object CIMultiDict = _CIMultiDict * cdef object CIMultiDictProxy = _CIMultiDictProxy * cdef object HttpVersion = _HttpVersion # <<<<<<<<<<<<<< * cdef object HttpVersion10 = _HttpVersion10 * cdef object HttpVersion11 = _HttpVersion11 */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_HttpVersion_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 64, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_HttpVersion, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":65 * cdef object CIMultiDictProxy = _CIMultiDictProxy * cdef object HttpVersion = _HttpVersion * cdef object HttpVersion10 = _HttpVersion10 # <<<<<<<<<<<<<< * cdef object HttpVersion11 = _HttpVersion11 * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_HttpVersion10_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 65, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion10); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_HttpVersion10, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":66 * cdef object HttpVersion = _HttpVersion * cdef object HttpVersion10 = _HttpVersion10 * cdef object HttpVersion11 = _HttpVersion11 # <<<<<<<<<<<<<< * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_HttpVersion11_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 66, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion11); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_HttpVersion11, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":67 * cdef object HttpVersion10 = _HttpVersion10 * cdef object HttpVersion11 = _HttpVersion11 * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 # <<<<<<<<<<<<<< * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 67, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_79 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_SEC_WEBSOCKET_KEY1); if (unlikely(!__pyx_t_79)) __PYX_ERR(0, 67, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_79); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1, __pyx_t_79); __Pyx_GIVEREF(__pyx_t_79); __pyx_t_79 = 0; /* "aiohttp/_http_parser.pyx":68 * cdef object HttpVersion11 = _HttpVersion11 * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING # <<<<<<<<<<<<<< * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD * cdef object StreamReader = _StreamReader */ __Pyx_GetModuleGlobalName(__pyx_t_79, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_79)) __PYX_ERR(0, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_79); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_79, __pyx_n_s_CONTENT_ENCODING); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_79); __pyx_t_79 = 0; __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":69 * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD # <<<<<<<<<<<<<< * cdef object StreamReader = _StreamReader * cdef object DeflateBuffer = _DeflateBuffer */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_EMPTY_PAYLOAD_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 69, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":70 * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD * cdef object StreamReader = _StreamReader # <<<<<<<<<<<<<< * cdef object DeflateBuffer = _DeflateBuffer * */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_StreamReader_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 70, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_StreamReader); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_StreamReader, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":71 * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD * cdef object StreamReader = _StreamReader * cdef object DeflateBuffer = _DeflateBuffer # <<<<<<<<<<<<<< * * */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_DeflateBuffer_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 71, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_DeflateBuffer); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_DeflateBuffer, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":85 * DEF METHODS_COUNT = 46; * * cdef list _http_method = [] # <<<<<<<<<<<<<< * * for i in range(METHODS_COUNT): */ __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 85, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser__http_method); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser__http_method, ((PyObject*)__pyx_t_3)); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":87 * cdef list _http_method = [] * * for i in range(METHODS_COUNT): # <<<<<<<<<<<<<< * _http_method.append( * cparser.llhttp_method_name( i).decode('ascii')) */ for (__pyx_t_80 = 0; __pyx_t_80 < 46; __pyx_t_80+=1) { __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_t_80); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_i, __pyx_t_3) < 0) __PYX_ERR(0, 87, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":88 * * for i in range(METHODS_COUNT): * _http_method.append( # <<<<<<<<<<<<<< * cparser.llhttp_method_name( i).decode('ascii')) * */ if (unlikely(__pyx_v_7aiohttp_12_http_parser__http_method == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append"); __PYX_ERR(0, 88, __pyx_L1_error) } /* "aiohttp/_http_parser.pyx":89 * for i in range(METHODS_COUNT): * _http_method.append( * cparser.llhttp_method_name( i).decode('ascii')) # <<<<<<<<<<<<<< * * */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_i); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 89, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_81 = ((enum llhttp_method)__Pyx_PyInt_As_enum__llhttp_method(__pyx_t_3)); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 89, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_82 = llhttp_method_name(((llhttp_method_t)__pyx_t_81)); __pyx_t_83 = __Pyx_ssize_strlen(__pyx_t_82); if (unlikely(__pyx_t_83 == ((Py_ssize_t)-1))) __PYX_ERR(0, 89, __pyx_L1_error) __pyx_t_3 = __Pyx_decode_c_string(__pyx_t_82, 0, __pyx_t_83, NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 89, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); /* "aiohttp/_http_parser.pyx":88 * * for i in range(METHODS_COUNT): * _http_method.append( # <<<<<<<<<<<<<< * cparser.llhttp_method_name( i).decode('ascii')) * */ __pyx_t_84 = __Pyx_PyList_Append(__pyx_v_7aiohttp_12_http_parser__http_method, __pyx_t_3); if (unlikely(__pyx_t_84 == ((int)-1))) __PYX_ERR(0, 88, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } /* "aiohttp/_http_parser.pyx":150 * return '' * * def _replace(self, **dct): # <<<<<<<<<<<<<< * cdef RawRequestMessage ret * ret = _new_request_message(self.method, */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_parser_17RawRequestMessage_5_replace, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_RawRequestMessage__replace, NULL, __pyx_n_s_aiohttp__http_parser, __pyx_d, ((PyObject *)__pyx_codeobj__16)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 150, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage, __pyx_n_s_replace, __pyx_t_3) < 0) __PYX_ERR(0, 150, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; PyType_Modified(__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage); /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_parser_17RawRequestMessage_7__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_RawRequestMessage___reduce_cytho, NULL, __pyx_n_s_aiohttp__http_parser, __pyx_d, ((PyObject *)__pyx_codeobj__18)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage, __pyx_n_s_reduce_cython, __pyx_t_3) < 0) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; PyType_Modified(__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage); /* "(tree fragment)":16 * else: * return __pyx_unpickle_RawRequestMessage, (type(self), 0xf602a9f, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_parser_17RawRequestMessage_9__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_RawRequestMessage___setstate_cyt, NULL, __pyx_n_s_aiohttp__http_parser, __pyx_d, ((PyObject *)__pyx_codeobj__20)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 16, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage, __pyx_n_s_setstate_cython, __pyx_t_3) < 0) __PYX_ERR(1, 16, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; PyType_Modified(__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage); /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_parser_18RawResponseMessage_5__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_RawResponseMessage___reduce_cyth, NULL, __pyx_n_s_aiohttp__http_parser, __pyx_d, ((PyObject *)__pyx_codeobj__21)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage, __pyx_n_s_reduce_cython, __pyx_t_3) < 0) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; PyType_Modified(__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage); /* "(tree fragment)":16 * else: * return __pyx_unpickle_RawResponseMessage, (type(self), 0xcb2b2ba, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_parser_18RawResponseMessage_7__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_RawResponseMessage___setstate_cy, NULL, __pyx_n_s_aiohttp__http_parser, __pyx_d, ((PyObject *)__pyx_codeobj__22)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 16, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage, __pyx_n_s_setstate_cython, __pyx_t_3) < 0) __PYX_ERR(1, 16, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; PyType_Modified(__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage); /* "aiohttp/_http_parser.pyx":502 * ### Public API ### * * def feed_eof(self): # <<<<<<<<<<<<<< * cdef bytes desc * */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_parser_10HttpParser_5feed_eof, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_HttpParser_feed_eof, NULL, __pyx_n_s_aiohttp__http_parser, __pyx_d, ((PyObject *)__pyx_codeobj__24)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 502, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7aiohttp_12_http_parser_HttpParser, __pyx_n_s_feed_eof, __pyx_t_3) < 0) __PYX_ERR(0, 502, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; PyType_Modified(__pyx_ptype_7aiohttp_12_http_parser_HttpParser); /* "aiohttp/_http_parser.pyx":522 * return self._messages[-1][0] * * def feed_data(self, data): # <<<<<<<<<<<<<< * cdef: * size_t data_len */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_parser_10HttpParser_7feed_data, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_HttpParser_feed_data, NULL, __pyx_n_s_aiohttp__http_parser, __pyx_d, ((PyObject *)__pyx_codeobj__26)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 522, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7aiohttp_12_http_parser_HttpParser, __pyx_n_s_feed_data, __pyx_t_3) < 0) __PYX_ERR(0, 522, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; PyType_Modified(__pyx_ptype_7aiohttp_12_http_parser_HttpParser); /* "aiohttp/_http_parser.pyx":570 * return messages, False, b'' * * def set_upgraded(self, val): # <<<<<<<<<<<<<< * self._upgraded = val * */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_parser_10HttpParser_9set_upgraded, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_HttpParser_set_upgraded, NULL, __pyx_n_s_aiohttp__http_parser, __pyx_d, ((PyObject *)__pyx_codeobj__28)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 570, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7aiohttp_12_http_parser_HttpParser, __pyx_n_s_set_upgraded, __pyx_t_3) < 0) __PYX_ERR(0, 570, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; PyType_Modified(__pyx_ptype_7aiohttp_12_http_parser_HttpParser); /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_parser_10HttpParser_11__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_HttpParser___reduce_cython, NULL, __pyx_n_s_aiohttp__http_parser, __pyx_d, ((PyObject *)__pyx_codeobj__30)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_3) < 0) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_parser_10HttpParser_13__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_HttpParser___setstate_cython, NULL, __pyx_n_s_aiohttp__http_parser, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 3, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_3) < 0) __PYX_ERR(1, 3, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_parser_17HttpRequestParser_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_HttpRequestParser___reduce_cytho, NULL, __pyx_n_s_aiohttp__http_parser, __pyx_d, ((PyObject *)__pyx_codeobj__32)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_3) < 0) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_parser_17HttpRequestParser_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_HttpRequestParser___setstate_cyt, NULL, __pyx_n_s_aiohttp__http_parser, __pyx_d, ((PyObject *)__pyx_codeobj__33)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 3, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_3) < 0) __PYX_ERR(1, 3, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_parser_18HttpResponseParser_3__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_HttpResponseParser___reduce_cyth, NULL, __pyx_n_s_aiohttp__http_parser, __pyx_d, ((PyObject *)__pyx_codeobj__34)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_3) < 0) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_parser_18HttpResponseParser_5__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_HttpResponseParser___setstate_cy, NULL, __pyx_n_s_aiohttp__http_parser, __pyx_d, ((PyObject *)__pyx_codeobj__35)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 3, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_3) < 0) __PYX_ERR(1, 3, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":1 * def __pyx_unpickle_RawRequestMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage, 0, __pyx_n_s_pyx_unpickle_RawRequestMessage, NULL, __pyx_n_s_aiohttp__http_parser, __pyx_d, ((PyObject *)__pyx_codeobj__37)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_RawRequestMessage, __pyx_t_3) < 0) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":11 * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage, 0, __pyx_n_s_pyx_unpickle_RawResponseMessag, NULL, __pyx_n_s_aiohttp__http_parser, __pyx_d, ((PyObject *)__pyx_codeobj__38)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_RawResponseMessag, __pyx_t_3) < 0) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":1 * #cython: language_level=3 # <<<<<<<<<<<<<< * # * # Based on https://github.com/MagicStack/httptools */ __pyx_t_3 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_3) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_11); __Pyx_XDECREF(__pyx_t_12); __Pyx_XDECREF(__pyx_t_13); __Pyx_XDECREF(__pyx_t_14); __Pyx_XDECREF(__pyx_t_15); __Pyx_XDECREF(__pyx_t_16); __Pyx_XDECREF(__pyx_t_17); __Pyx_XDECREF(__pyx_t_18); __Pyx_XDECREF(__pyx_t_19); __Pyx_XDECREF(__pyx_t_20); __Pyx_XDECREF(__pyx_t_21); __Pyx_XDECREF(__pyx_t_22); __Pyx_XDECREF(__pyx_t_23); __Pyx_XDECREF(__pyx_t_24); __Pyx_XDECREF(__pyx_t_25); __Pyx_XDECREF(__pyx_t_26); __Pyx_XDECREF(__pyx_t_27); __Pyx_XDECREF(__pyx_t_28); __Pyx_XDECREF(__pyx_t_29); __Pyx_XDECREF(__pyx_t_30); __Pyx_XDECREF(__pyx_t_31); __Pyx_XDECREF(__pyx_t_32); __Pyx_XDECREF(__pyx_t_33); __Pyx_XDECREF(__pyx_t_34); __Pyx_XDECREF(__pyx_t_35); __Pyx_XDECREF(__pyx_t_36); __Pyx_XDECREF(__pyx_t_37); __Pyx_XDECREF(__pyx_t_38); __Pyx_XDECREF(__pyx_t_39); __Pyx_XDECREF(__pyx_t_40); __Pyx_XDECREF(__pyx_t_41); __Pyx_XDECREF(__pyx_t_42); __Pyx_XDECREF(__pyx_t_43); __Pyx_XDECREF(__pyx_t_44); __Pyx_XDECREF(__pyx_t_45); __Pyx_XDECREF(__pyx_t_46); __Pyx_XDECREF(__pyx_t_47); __Pyx_XDECREF(__pyx_t_48); __Pyx_XDECREF(__pyx_t_49); __Pyx_XDECREF(__pyx_t_50); __Pyx_XDECREF(__pyx_t_51); __Pyx_XDECREF(__pyx_t_52); __Pyx_XDECREF(__pyx_t_53); __Pyx_XDECREF(__pyx_t_54); __Pyx_XDECREF(__pyx_t_55); __Pyx_XDECREF(__pyx_t_56); __Pyx_XDECREF(__pyx_t_57); __Pyx_XDECREF(__pyx_t_58); __Pyx_XDECREF(__pyx_t_59); __Pyx_XDECREF(__pyx_t_60); __Pyx_XDECREF(__pyx_t_61); __Pyx_XDECREF(__pyx_t_62); __Pyx_XDECREF(__pyx_t_63); __Pyx_XDECREF(__pyx_t_64); __Pyx_XDECREF(__pyx_t_65); __Pyx_XDECREF(__pyx_t_66); __Pyx_XDECREF(__pyx_t_67); __Pyx_XDECREF(__pyx_t_68); __Pyx_XDECREF(__pyx_t_69); __Pyx_XDECREF(__pyx_t_70); __Pyx_XDECREF(__pyx_t_71); __Pyx_XDECREF(__pyx_t_72); __Pyx_XDECREF(__pyx_t_73); __Pyx_XDECREF(__pyx_t_74); __Pyx_XDECREF(__pyx_t_75); __Pyx_XDECREF(__pyx_t_76); __Pyx_XDECREF(__pyx_t_77); __Pyx_XDECREF(__pyx_t_78); __Pyx_XDECREF(__pyx_t_79); if (__pyx_m) { if (__pyx_d && stringtab_initialized) { __Pyx_AddTraceback("init aiohttp._http_parser", __pyx_clineno, __pyx_lineno, __pyx_filename); } #if !CYTHON_USE_MODULE_STATE Py_CLEAR(__pyx_m); #else Py_DECREF(__pyx_m); if (pystate_addmodule_run) { PyObject *tp, *value, *tb; PyErr_Fetch(&tp, &value, &tb); PyState_RemoveModule(&__pyx_moduledef); PyErr_Restore(tp, value, tb); } #endif } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init aiohttp._http_parser"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if CYTHON_PEP489_MULTI_PHASE_INIT return (__pyx_m != NULL) ? 0 : -1; #elif PY_MAJOR_VERSION >= 3 return __pyx_m; #else return; #endif } /* #### Code section: cleanup_globals ### */ /* #### Code section: cleanup_module ### */ /* #### Code section: main_method ### */ /* #### Code section: utility_code_pragmas ### */ #ifdef _MSC_VER #pragma warning( push ) /* Warning 4127: conditional expression is constant * Cython uses constant conditional expressions to allow in inline functions to be optimized at * compile-time, so this warning is not useful */ #pragma warning( disable : 4127 ) #endif /* #### Code section: utility_code_def ### */ /* --- Runtime support code --- */ /* Refnanny */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule(modname); if (!m) goto end; p = PyObject_GetAttrString(m, "RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* PyErrExceptionMatches */ #if CYTHON_FAST_THREAD_STATE static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; i= 0x030C00A6 PyObject *current_exception = tstate->current_exception; if (unlikely(!current_exception)) return 0; exc_type = (PyObject*) Py_TYPE(current_exception); if (exc_type == err) return 1; #else exc_type = tstate->curexc_type; if (exc_type == err) return 1; if (unlikely(!exc_type)) return 0; #endif #if CYTHON_AVOID_BORROWED_REFS Py_INCREF(exc_type); #endif if (unlikely(PyTuple_Check(err))) { result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); } else { result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); } #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(exc_type); #endif return result; } #endif /* PyErrFetchRestore */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { #if PY_VERSION_HEX >= 0x030C00A6 PyObject *tmp_value; assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); if (value) { #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) #endif PyException_SetTraceback(value, tb); } tmp_value = tstate->current_exception; tstate->current_exception = value; Py_XDECREF(tmp_value); Py_XDECREF(type); Py_XDECREF(tb); #else PyObject *tmp_type, *tmp_value, *tmp_tb; tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #endif } static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { #if PY_VERSION_HEX >= 0x030C00A6 PyObject* exc_value; exc_value = tstate->current_exception; tstate->current_exception = 0; *value = exc_value; *type = NULL; *tb = NULL; if (exc_value) { *type = (PyObject*) Py_TYPE(exc_value); Py_INCREF(*type); #if CYTHON_COMPILING_IN_CPYTHON *tb = ((PyBaseExceptionObject*) exc_value)->traceback; Py_XINCREF(*tb); #else *tb = PyException_GetTraceback(exc_value); #endif } #else *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #endif } #endif /* PyObjectGetAttrStr */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #endif /* PyObjectGetAttrStrNoError */ #if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) __Pyx_PyErr_Clear(); } #endif static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { PyObject *result; #if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 (void) PyObject_GetOptionalAttr(obj, attr_name, &result); return result; #else #if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); } #endif result = __Pyx_PyObject_GetAttrStr(obj, attr_name); if (unlikely(!result)) { __Pyx_PyObject_GetAttrStr_ClearAttributeError(); } return result; #endif } /* GetBuiltinName */ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); if (unlikely(!result) && !PyErr_Occurred()) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } /* GetItemInt */ static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { PyObject *r; if (unlikely(!j)) return NULL; r = PyObject_GetItem(o, j); Py_DECREF(j); return r; } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS Py_ssize_t wrapped_i = i; if (wraparound & unlikely(i < 0)) { wrapped_i += PyList_GET_SIZE(o); } if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, wrapped_i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS Py_ssize_t wrapped_i = i; if (wraparound & unlikely(i < 0)) { wrapped_i += PyTuple_GET_SIZE(o); } if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS if (is_list || PyList_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { PyObject *r = PyList_GET_ITEM(o, n); Py_INCREF(r); return r; } } else if (PyTuple_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, n); Py_INCREF(r); return r; } } else { PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; if (mm && mm->mp_subscript) { PyObject *r, *key = PyInt_FromSsize_t(i); if (unlikely(!key)) return NULL; r = mm->mp_subscript(o, key); Py_DECREF(key); return r; } if (likely(sm && sm->sq_item)) { if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { Py_ssize_t l = sm->sq_length(o); if (likely(l >= 0)) { i += l; } else { if (!PyErr_ExceptionMatches(PyExc_OverflowError)) return NULL; PyErr_Clear(); } } return sm->sq_item(o, i); } } #else if (is_list || PySequence_Check(o)) { return PySequence_GetItem(o, i); } #endif return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } /* decode_c_bytes */ static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes( const char* cstring, Py_ssize_t length, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { if (unlikely((start < 0) | (stop < 0))) { if (start < 0) { start += length; if (start < 0) start = 0; } if (stop < 0) stop += length; } if (stop > length) stop = length; if (unlikely(stop <= start)) return __Pyx_NewRef(__pyx_empty_unicode); length = stop - start; cstring += start; if (decode_func) { return decode_func(cstring, length, errors); } else { return PyUnicode_Decode(cstring, length, encoding, errors); } } /* TupleAndListFromArray */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { PyObject *v; Py_ssize_t i; for (i = 0; i < length; i++) { v = dest[i] = src[i]; Py_INCREF(v); } } static CYTHON_INLINE PyObject * __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) { PyObject *res; if (n <= 0) { Py_INCREF(__pyx_empty_tuple); return __pyx_empty_tuple; } res = PyTuple_New(n); if (unlikely(res == NULL)) return NULL; __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); return res; } static CYTHON_INLINE PyObject * __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) { PyObject *res; if (n <= 0) { return PyList_New(0); } res = PyList_New(n); if (unlikely(res == NULL)) return NULL; __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); return res; } #endif /* BytesEquals */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API return PyObject_RichCompareBool(s1, s2, equals); #else if (s1 == s2) { return (equals == Py_EQ); } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { const char *ps1, *ps2; Py_ssize_t length = PyBytes_GET_SIZE(s1); if (length != PyBytes_GET_SIZE(s2)) return (equals == Py_NE); ps1 = PyBytes_AS_STRING(s1); ps2 = PyBytes_AS_STRING(s2); if (ps1[0] != ps2[0]) { return (equals == Py_NE); } else if (length == 1) { return (equals == Py_EQ); } else { int result; #if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) Py_hash_t hash1, hash2; hash1 = ((PyBytesObject*)s1)->ob_shash; hash2 = ((PyBytesObject*)s2)->ob_shash; if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { return (equals == Py_NE); } #endif result = memcmp(ps1, ps2, (size_t)length); return (equals == Py_EQ) ? (result == 0) : (result != 0); } } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { return (equals == Py_NE); } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { return (equals == Py_NE); } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); Py_DECREF(py_result); return result; } #endif } /* UnicodeEquals */ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API return PyObject_RichCompareBool(s1, s2, equals); #else #if PY_MAJOR_VERSION < 3 PyObject* owned_ref = NULL; #endif int s1_is_unicode, s2_is_unicode; if (s1 == s2) { goto return_eq; } s1_is_unicode = PyUnicode_CheckExact(s1); s2_is_unicode = PyUnicode_CheckExact(s2); #if PY_MAJOR_VERSION < 3 if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { owned_ref = PyUnicode_FromObject(s2); if (unlikely(!owned_ref)) return -1; s2 = owned_ref; s2_is_unicode = 1; } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { owned_ref = PyUnicode_FromObject(s1); if (unlikely(!owned_ref)) return -1; s1 = owned_ref; s1_is_unicode = 1; } else if (((!s2_is_unicode) & (!s1_is_unicode))) { return __Pyx_PyBytes_Equals(s1, s2, equals); } #endif if (s1_is_unicode & s2_is_unicode) { Py_ssize_t length; int kind; void *data1, *data2; if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) return -1; length = __Pyx_PyUnicode_GET_LENGTH(s1); if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { goto return_ne; } #if CYTHON_USE_UNICODE_INTERNALS { Py_hash_t hash1, hash2; #if CYTHON_PEP393_ENABLED hash1 = ((PyASCIIObject*)s1)->hash; hash2 = ((PyASCIIObject*)s2)->hash; #else hash1 = ((PyUnicodeObject*)s1)->hash; hash2 = ((PyUnicodeObject*)s2)->hash; #endif if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { goto return_ne; } } #endif kind = __Pyx_PyUnicode_KIND(s1); if (kind != __Pyx_PyUnicode_KIND(s2)) { goto return_ne; } data1 = __Pyx_PyUnicode_DATA(s1); data2 = __Pyx_PyUnicode_DATA(s2); if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { goto return_ne; } else if (length == 1) { goto return_eq; } else { int result = memcmp(data1, data2, (size_t)(length * kind)); #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_EQ) ? (result == 0) : (result != 0); } } else if ((s1 == Py_None) & s2_is_unicode) { goto return_ne; } else if ((s2 == Py_None) & s1_is_unicode) { goto return_ne; } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); Py_DECREF(py_result); return result; } return_eq: #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_EQ); return_ne: #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_NE); #endif } /* fastcall */ #if CYTHON_METH_FASTCALL static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) { Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); for (i = 0; i < n; i++) { if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; } for (i = 0; i < n; i++) { int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); if (unlikely(eq != 0)) { if (unlikely(eq < 0)) return NULL; // error return kwvalues[i]; } } return NULL; // not found (no exception set) } #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 static CYTHON_UNUSED PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); PyObject *dict; dict = PyDict_New(); if (unlikely(!dict)) return NULL; for (i=0; i= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } /* ParseKeywords */ static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject *const *kwvalues, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); while (1) { Py_XDECREF(key); key = NULL; Py_XDECREF(value); value = NULL; if (kwds_is_tuple) { Py_ssize_t size; #if CYTHON_ASSUME_SAFE_MACROS size = PyTuple_GET_SIZE(kwds); #else size = PyTuple_Size(kwds); if (size < 0) goto bad; #endif if (pos >= size) break; #if CYTHON_AVOID_BORROWED_REFS key = __Pyx_PySequence_ITEM(kwds, pos); if (!key) goto bad; #elif CYTHON_ASSUME_SAFE_MACROS key = PyTuple_GET_ITEM(kwds, pos); #else key = PyTuple_GetItem(kwds, pos); if (!key) goto bad; #endif value = kwvalues[pos]; pos++; } else { if (!PyDict_Next(kwds, &pos, &key, &value)) break; #if CYTHON_AVOID_BORROWED_REFS Py_INCREF(key); #endif } name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS Py_INCREF(value); // transfer ownership of value to values Py_DECREF(key); #endif key = NULL; value = NULL; continue; } #if !CYTHON_AVOID_BORROWED_REFS Py_INCREF(key); #endif Py_INCREF(value); name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS value = NULL; // ownership transferred to values #endif break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = ( #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**name, key) ); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS value = NULL; // ownership transferred to values #endif break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } Py_XDECREF(key); Py_XDECREF(value); return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); goto bad; invalid_keyword: #if PY_MAJOR_VERSION < 3 PyErr_Format(PyExc_TypeError, "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else PyErr_Format(PyExc_TypeError, "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: Py_XDECREF(key); Py_XDECREF(value); return -1; } /* RaiseUnexpectedTypeError */ static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj) { __Pyx_TypeName obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); PyErr_Format(PyExc_TypeError, "Expected %s, got " __Pyx_FMT_TYPENAME, expected, obj_type_name); __Pyx_DECREF_TypeName(obj_type_name); return 0; } /* RaiseUnboundLocalError */ static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) { PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); } /* RaiseTooManyValuesToUnpack */ static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { PyErr_Format(PyExc_ValueError, "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); } /* RaiseNeedMoreValuesToUnpack */ static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { PyErr_Format(PyExc_ValueError, "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", index, (index == 1) ? "" : "s"); } /* IterFinish */ static CYTHON_INLINE int __Pyx_IterFinish(void) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType(); if (unlikely(exc_type)) { if (unlikely(!__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) return -1; __Pyx_PyErr_Clear(); return 0; } return 0; } /* UnpackItemEndCheck */ static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { if (unlikely(retval)) { Py_DECREF(retval); __Pyx_RaiseTooManyValuesError(expected); return -1; } return __Pyx_IterFinish(); } /* GetException */ #if CYTHON_FAST_THREAD_STATE static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) #endif { PyObject *local_type = NULL, *local_value, *local_tb = NULL; #if CYTHON_FAST_THREAD_STATE PyObject *tmp_type, *tmp_value, *tmp_tb; #if PY_VERSION_HEX >= 0x030C00A6 local_value = tstate->current_exception; tstate->current_exception = 0; if (likely(local_value)) { local_type = (PyObject*) Py_TYPE(local_value); Py_INCREF(local_type); local_tb = PyException_GetTraceback(local_value); } #else local_type = tstate->curexc_type; local_value = tstate->curexc_value; local_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #endif #else PyErr_Fetch(&local_type, &local_value, &local_tb); #endif PyErr_NormalizeException(&local_type, &local_value, &local_tb); #if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6 if (unlikely(tstate->current_exception)) #elif CYTHON_FAST_THREAD_STATE if (unlikely(tstate->curexc_type)) #else if (unlikely(PyErr_Occurred())) #endif goto bad; #if PY_MAJOR_VERSION >= 3 if (local_tb) { if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) goto bad; } #endif Py_XINCREF(local_tb); Py_XINCREF(local_type); Py_XINCREF(local_value); *type = local_type; *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE #if CYTHON_USE_EXC_INFO_STACK { _PyErr_StackItem *exc_info = tstate->exc_info; #if PY_VERSION_HEX >= 0x030B00a4 tmp_value = exc_info->exc_value; exc_info->exc_value = local_value; tmp_type = NULL; tmp_tb = NULL; Py_XDECREF(local_type); Py_XDECREF(local_tb); #else tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = local_type; exc_info->exc_value = local_value; exc_info->exc_traceback = local_tb; #endif } #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = local_type; tstate->exc_value = local_value; tstate->exc_traceback = local_tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_SetExcInfo(local_type, local_value, local_tb); #endif return 0; bad: *type = 0; *value = 0; *tb = 0; Py_XDECREF(local_type); Py_XDECREF(local_value); Py_XDECREF(local_tb); return -1; } /* pep479 */ static void __Pyx_Generator_Replace_StopIteration(int in_async_gen) { PyObject *exc, *val, *tb, *cur_exc; __Pyx_PyThreadState_declare #ifdef __Pyx_StopAsyncIteration_USED int is_async_stopiteration = 0; #endif CYTHON_MAYBE_UNUSED_VAR(in_async_gen); cur_exc = PyErr_Occurred(); if (likely(!__Pyx_PyErr_GivenExceptionMatches(cur_exc, PyExc_StopIteration))) { #ifdef __Pyx_StopAsyncIteration_USED if (in_async_gen && unlikely(__Pyx_PyErr_GivenExceptionMatches(cur_exc, __Pyx_PyExc_StopAsyncIteration))) { is_async_stopiteration = 1; } else #endif return; } __Pyx_PyThreadState_assign __Pyx_GetException(&exc, &val, &tb); Py_XDECREF(exc); Py_XDECREF(val); Py_XDECREF(tb); PyErr_SetString(PyExc_RuntimeError, #ifdef __Pyx_StopAsyncIteration_USED is_async_stopiteration ? "async generator raised StopAsyncIteration" : in_async_gen ? "async generator raised StopIteration" : #endif "generator raised StopIteration"); } /* UnicodeConcatInPlace */ # if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 static int __Pyx_unicode_modifiable(PyObject *unicode) { if (Py_REFCNT(unicode) != 1) return 0; if (!PyUnicode_CheckExact(unicode)) return 0; if (PyUnicode_CHECK_INTERNED(unicode)) return 0; return 1; } static CYTHON_INLINE PyObject *__Pyx_PyUnicode_ConcatInPlaceImpl(PyObject **p_left, PyObject *right #if CYTHON_REFNANNY , void* __pyx_refnanny #endif ) { PyObject *left = *p_left; Py_ssize_t left_len, right_len, new_len; if (unlikely(__Pyx_PyUnicode_READY(left) == -1)) return NULL; if (unlikely(__Pyx_PyUnicode_READY(right) == -1)) return NULL; left_len = PyUnicode_GET_LENGTH(left); if (left_len == 0) { Py_INCREF(right); return right; } right_len = PyUnicode_GET_LENGTH(right); if (right_len == 0) { Py_INCREF(left); return left; } if (unlikely(left_len > PY_SSIZE_T_MAX - right_len)) { PyErr_SetString(PyExc_OverflowError, "strings are too large to concat"); return NULL; } new_len = left_len + right_len; if (__Pyx_unicode_modifiable(left) && PyUnicode_CheckExact(right) && PyUnicode_KIND(right) <= PyUnicode_KIND(left) && !(PyUnicode_IS_ASCII(left) && !PyUnicode_IS_ASCII(right))) { int ret; __Pyx_GIVEREF(*p_left); ret = PyUnicode_Resize(p_left, new_len); __Pyx_GOTREF(*p_left); if (unlikely(ret != 0)) return NULL; #if PY_VERSION_HEX >= 0x030d0000 if (unlikely(PyUnicode_CopyCharacters(*p_left, left_len, right, 0, right_len) < 0)) return NULL; #else _PyUnicode_FastCopyCharacters(*p_left, left_len, right, 0, right_len); #endif __Pyx_INCREF(*p_left); __Pyx_GIVEREF(*p_left); return *p_left; } else { return __Pyx_PyUnicode_Concat(left, right); } } #endif /* KeywordStringCheck */ static int __Pyx_CheckKeywordStrings( PyObject *kw, const char* function_name, int kw_allowed) { PyObject* key = 0; Py_ssize_t pos = 0; #if CYTHON_COMPILING_IN_PYPY if (!kw_allowed && PyDict_Next(kw, &pos, &key, 0)) goto invalid_keyword; return 1; #else if (CYTHON_METH_FASTCALL && likely(PyTuple_Check(kw))) { Py_ssize_t kwsize; #if CYTHON_ASSUME_SAFE_MACROS kwsize = PyTuple_GET_SIZE(kw); #else kwsize = PyTuple_Size(kw); if (kwsize < 0) return 0; #endif if (unlikely(kwsize == 0)) return 1; if (!kw_allowed) { #if CYTHON_ASSUME_SAFE_MACROS key = PyTuple_GET_ITEM(kw, 0); #else key = PyTuple_GetItem(kw, pos); if (!key) return 0; #endif goto invalid_keyword; } #if PY_VERSION_HEX < 0x03090000 for (pos = 0; pos < kwsize; pos++) { #if CYTHON_ASSUME_SAFE_MACROS key = PyTuple_GET_ITEM(kw, pos); #else key = PyTuple_GetItem(kw, pos); if (!key) return 0; #endif if (unlikely(!PyUnicode_Check(key))) goto invalid_keyword_type; } #endif return 1; } while (PyDict_Next(kw, &pos, &key, 0)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyString_Check(key))) #endif if (unlikely(!PyUnicode_Check(key))) goto invalid_keyword_type; } if (!kw_allowed && unlikely(key)) goto invalid_keyword; return 1; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); return 0; #endif invalid_keyword: #if PY_MAJOR_VERSION < 3 PyErr_Format(PyExc_TypeError, "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else PyErr_Format(PyExc_TypeError, "%s() got an unexpected keyword argument '%U'", function_name, key); #endif return 0; } /* ExtTypeTest */ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { __Pyx_TypeName obj_type_name; __Pyx_TypeName type_name; if (unlikely(!type)) { PyErr_SetString(PyExc_SystemError, "Missing type object"); return 0; } if (likely(__Pyx_TypeCheck(obj, type))) return 1; obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); type_name = __Pyx_PyType_GetName(type); PyErr_Format(PyExc_TypeError, "Cannot convert " __Pyx_FMT_TYPENAME " to " __Pyx_FMT_TYPENAME, obj_type_name, type_name); __Pyx_DECREF_TypeName(obj_type_name); __Pyx_DECREF_TypeName(type_name); return 0; } /* DictGetItem */ #if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { PyObject *value; value = PyDict_GetItemWithError(d, key); if (unlikely(!value)) { if (!PyErr_Occurred()) { if (unlikely(PyTuple_Check(key))) { PyObject* args = PyTuple_Pack(1, key); if (likely(args)) { PyErr_SetObject(PyExc_KeyError, args); Py_DECREF(args); } } else { PyErr_SetObject(PyExc_KeyError, key); } } return NULL; } Py_INCREF(value); return value; } #endif /* GetAttr3 */ #if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 static PyObject *__Pyx_GetAttr3Default(PyObject *d) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) return NULL; __Pyx_PyErr_Clear(); Py_INCREF(d); return d; } #endif static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { PyObject *r; #if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 int res = PyObject_GetOptionalAttr(o, n, &r); return (res != 0) ? r : __Pyx_NewRef(d); #else #if CYTHON_USE_TYPE_SLOTS if (likely(PyString_Check(n))) { r = __Pyx_PyObject_GetAttrStrNoError(o, n); if (unlikely(!r) && likely(!PyErr_Occurred())) { r = __Pyx_NewRef(d); } return r; } #endif r = PyObject_GetAttr(o, n); return (likely(r)) ? r : __Pyx_GetAttr3Default(d); #endif } /* PyDictVersioning */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { PyObject *dict = Py_TYPE(obj)->tp_dict; return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; } static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { PyObject **dictptr = NULL; Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; if (offset) { #if CYTHON_COMPILING_IN_CPYTHON dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); #else dictptr = _PyObject_GetDictPtr(obj); #endif } return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; } static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { PyObject *dict = Py_TYPE(obj)->tp_dict; if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) return 0; return obj_dict_version == __Pyx_get_object_dict_version(obj); } #endif /* GetModuleGlobalName */ #if CYTHON_USE_DICT_VERSIONS static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) #else static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) #endif { PyObject *result; #if !CYTHON_AVOID_BORROWED_REFS #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && PY_VERSION_HEX < 0x030d0000 result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } else if (unlikely(PyErr_Occurred())) { return NULL; } #elif CYTHON_COMPILING_IN_LIMITED_API if (unlikely(!__pyx_m)) { return NULL; } result = PyObject_GetAttr(__pyx_m, name); if (likely(result)) { return result; } #else result = PyDict_GetItem(__pyx_d, name); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } #endif #else result = PyObject_GetItem(__pyx_d, name); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } PyErr_Clear(); #endif return __Pyx_GetBuiltinName(name); } /* PyFunctionFastCall */ #if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, PyObject *globals) { PyFrameObject *f; PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject **fastlocals; Py_ssize_t i; PyObject *result; assert(globals != NULL); /* XXX Perhaps we should create a specialized PyFrame_New() that doesn't take locals, but does take builtins without sanity checking them. */ assert(tstate != NULL); f = PyFrame_New(tstate, co, globals, NULL); if (f == NULL) { return NULL; } fastlocals = __Pyx_PyFrame_GetLocalsplus(f); for (i = 0; i < na; i++) { Py_INCREF(*args); fastlocals[i] = *args++; } result = PyEval_EvalFrameEx(f,0); ++tstate->recursion_depth; Py_DECREF(f); --tstate->recursion_depth; return result; } static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); PyObject *globals = PyFunction_GET_GLOBALS(func); PyObject *argdefs = PyFunction_GET_DEFAULTS(func); PyObject *closure; #if PY_MAJOR_VERSION >= 3 PyObject *kwdefs; #endif PyObject *kwtuple, **k; PyObject **d; Py_ssize_t nd; Py_ssize_t nk; PyObject *result; assert(kwargs == NULL || PyDict_Check(kwargs)); nk = kwargs ? PyDict_Size(kwargs) : 0; #if PY_MAJOR_VERSION < 3 if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { return NULL; } #else if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) { return NULL; } #endif if ( #if PY_MAJOR_VERSION >= 3 co->co_kwonlyargcount == 0 && #endif likely(kwargs == NULL || nk == 0) && co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { if (argdefs == NULL && co->co_argcount == nargs) { result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); goto done; } else if (nargs == 0 && argdefs != NULL && co->co_argcount == Py_SIZE(argdefs)) { /* function called with no arguments, but all parameters have a default value: use default values as arguments .*/ args = &PyTuple_GET_ITEM(argdefs, 0); result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); goto done; } } if (kwargs != NULL) { Py_ssize_t pos, i; kwtuple = PyTuple_New(2 * nk); if (kwtuple == NULL) { result = NULL; goto done; } k = &PyTuple_GET_ITEM(kwtuple, 0); pos = i = 0; while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { Py_INCREF(k[i]); Py_INCREF(k[i+1]); i += 2; } nk = i / 2; } else { kwtuple = NULL; k = NULL; } closure = PyFunction_GET_CLOSURE(func); #if PY_MAJOR_VERSION >= 3 kwdefs = PyFunction_GET_KW_DEFAULTS(func); #endif if (argdefs != NULL) { d = &PyTuple_GET_ITEM(argdefs, 0); nd = Py_SIZE(argdefs); } else { d = NULL; nd = 0; } #if PY_MAJOR_VERSION >= 3 result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, kwdefs, closure); #else result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, closure); #endif Py_XDECREF(kwtuple); done: Py_LeaveRecursiveCall(); return result; } #endif /* PyObjectCall */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; ternaryfunc call = Py_TYPE(func)->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); #if PY_MAJOR_VERSION < 3 if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; #else if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) return NULL; #endif result = (*call)(func, arg, kw); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectCallMethO */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { PyObject *self, *result; PyCFunction cfunc; cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func); self = __Pyx_CyOrPyCFunction_GET_SELF(func); #if PY_MAJOR_VERSION < 3 if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; #else if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) return NULL; #endif result = cfunc(self, arg); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectFastCall */ #if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { PyObject *argstuple; PyObject *result = 0; size_t i; argstuple = PyTuple_New((Py_ssize_t)nargs); if (unlikely(!argstuple)) return NULL; for (i = 0; i < nargs; i++) { Py_INCREF(args[i]); if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; } result = __Pyx_PyObject_Call(func, argstuple, kwargs); bad: Py_DECREF(argstuple); return result; } #endif static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); #if CYTHON_COMPILING_IN_CPYTHON if (nargs == 0 && kwargs == NULL) { if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS)) return __Pyx_PyObject_CallMethO(func, NULL); } else if (nargs == 1 && kwargs == NULL) { if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O)) return __Pyx_PyObject_CallMethO(func, args[0]); } #endif #if PY_VERSION_HEX < 0x030800B1 #if CYTHON_FAST_PYCCALL if (PyCFunction_Check(func)) { if (kwargs) { return _PyCFunction_FastCallDict(func, args, nargs, kwargs); } else { return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); } } #if PY_VERSION_HEX >= 0x030700A1 if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); } #endif #endif #if CYTHON_FAST_PYCALL if (PyFunction_Check(func)) { return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); } #endif #endif if (kwargs == NULL) { #if CYTHON_VECTORCALL #if PY_VERSION_HEX < 0x03090000 vectorcallfunc f = _PyVectorcall_Function(func); #else vectorcallfunc f = PyVectorcall_Function(func); #endif if (f) { return f(func, args, (size_t)nargs, NULL); } #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL if (__Pyx_CyFunction_CheckExact(func)) { __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); if (f) return f(func, args, (size_t)nargs, NULL); } #endif } if (nargs == 0) { return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); } #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs); #else return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); #endif } /* PyObjectCallNoArg */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { PyObject *arg[2] = {NULL, NULL}; return __Pyx_PyObject_FastCall(func, arg + 1, 0 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); } /* PyObjectCallOneArg */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *args[2] = {NULL, arg}; return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); } /* RaiseException */ #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { __Pyx_PyThreadState_declare CYTHON_UNUSED_VAR(cause); Py_XINCREF(type); if (!value || value == Py_None) value = NULL; else Py_INCREF(value); if (!tb || tb == Py_None) tb = NULL; else { Py_INCREF(tb); if (!PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } } if (PyType_Check(type)) { #if CYTHON_COMPILING_IN_PYPY if (!value) { Py_INCREF(Py_None); value = Py_None; } #endif PyErr_NormalizeException(&type, &value, &tb); } else { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } value = type; type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } } __Pyx_PyThreadState_assign __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { PyObject* owned_instance = NULL; if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (PyExceptionClass_Check(type)) { PyObject *instance_class = NULL; if (value && PyExceptionInstance_Check(value)) { instance_class = (PyObject*) Py_TYPE(value); if (instance_class != type) { int is_subclass = PyObject_IsSubclass(instance_class, type); if (!is_subclass) { instance_class = NULL; } else if (unlikely(is_subclass == -1)) { goto bad; } else { type = instance_class; } } } if (!instance_class) { PyObject *args; if (!value) args = PyTuple_New(0); else if (PyTuple_Check(value)) { Py_INCREF(value); args = value; } else args = PyTuple_Pack(1, value); if (!args) goto bad; owned_instance = PyObject_Call(type, args, NULL); Py_DECREF(args); if (!owned_instance) goto bad; value = owned_instance; if (!PyExceptionInstance_Check(value)) { PyErr_Format(PyExc_TypeError, "calling %R should have returned an instance of " "BaseException, not %R", type, Py_TYPE(value)); goto bad; } } } else { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } if (cause) { PyObject *fixed_cause; if (cause == Py_None) { fixed_cause = NULL; } else if (PyExceptionClass_Check(cause)) { fixed_cause = PyObject_CallObject(cause, NULL); if (fixed_cause == NULL) goto bad; } else if (PyExceptionInstance_Check(cause)) { fixed_cause = cause; Py_INCREF(fixed_cause); } else { PyErr_SetString(PyExc_TypeError, "exception causes must derive from " "BaseException"); goto bad; } PyException_SetCause(value, fixed_cause); } PyErr_SetObject(type, value); if (tb) { #if PY_VERSION_HEX >= 0x030C00A6 PyException_SetTraceback(value, tb); #elif CYTHON_FAST_THREAD_STATE PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } #else PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); Py_INCREF(tb); PyErr_Restore(tmp_type, tmp_value, tb); Py_XDECREF(tmp_tb); #endif } bad: Py_XDECREF(owned_instance); return; } #endif /* UnpackUnboundCMethod */ static PyObject *__Pyx_SelflessCall(PyObject *method, PyObject *args, PyObject *kwargs) { PyObject *selfless_args = PyTuple_GetSlice(args, 1, PyTuple_Size(args)); if (unlikely(!selfless_args)) return NULL; PyObject *result = PyObject_Call(method, selfless_args, kwargs); Py_DECREF(selfless_args); return result; } static PyMethodDef __Pyx_UnboundCMethod_Def = { "CythonUnboundCMethod", __PYX_REINTERPRET_FUNCION(PyCFunction, __Pyx_SelflessCall), METH_VARARGS | METH_KEYWORDS, NULL }; static int __Pyx_TryUnpackUnboundCMethod(__Pyx_CachedCFunction* target) { PyObject *method; method = __Pyx_PyObject_GetAttrStr(target->type, *target->method_name); if (unlikely(!method)) return -1; target->method = method; #if CYTHON_COMPILING_IN_CPYTHON #if PY_MAJOR_VERSION >= 3 if (likely(__Pyx_TypeCheck(method, &PyMethodDescr_Type))) #else if (likely(!__Pyx_CyOrPyCFunction_Check(method))) #endif { PyMethodDescrObject *descr = (PyMethodDescrObject*) method; target->func = descr->d_method->ml_meth; target->flag = descr->d_method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_STACKLESS); } else #endif #if CYTHON_COMPILING_IN_PYPY #else if (PyCFunction_Check(method)) #endif { PyObject *self; int self_found; #if CYTHON_COMPILING_IN_LIMITED_API || CYTHON_COMPILING_IN_PYPY self = PyObject_GetAttrString(method, "__self__"); if (!self) { PyErr_Clear(); } #else self = PyCFunction_GET_SELF(method); #endif self_found = (self && self != Py_None); #if CYTHON_COMPILING_IN_LIMITED_API || CYTHON_COMPILING_IN_PYPY Py_XDECREF(self); #endif if (self_found) { PyObject *unbound_method = PyCFunction_New(&__Pyx_UnboundCMethod_Def, method); if (unlikely(!unbound_method)) return -1; Py_DECREF(method); target->method = unbound_method; } } return 0; } /* CallUnboundCMethod0 */ static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self) { PyObject *args, *result = NULL; if (unlikely(!cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL; #if CYTHON_ASSUME_SAFE_MACROS args = PyTuple_New(1); if (unlikely(!args)) goto bad; Py_INCREF(self); PyTuple_SET_ITEM(args, 0, self); #else args = PyTuple_Pack(1, self); if (unlikely(!args)) goto bad; #endif result = __Pyx_PyObject_Call(cfunc->method, args, NULL); Py_DECREF(args); bad: return result; } /* SliceObject */ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop, PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice, int has_cstart, int has_cstop, int wraparound) { __Pyx_TypeName obj_type_name; #if CYTHON_USE_TYPE_SLOTS PyMappingMethods* mp; #if PY_MAJOR_VERSION < 3 PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence; if (likely(ms && ms->sq_slice)) { if (!has_cstart) { if (_py_start && (*_py_start != Py_None)) { cstart = __Pyx_PyIndex_AsSsize_t(*_py_start); if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; } else cstart = 0; } if (!has_cstop) { if (_py_stop && (*_py_stop != Py_None)) { cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop); if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; } else cstop = PY_SSIZE_T_MAX; } if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) { Py_ssize_t l = ms->sq_length(obj); if (likely(l >= 0)) { if (cstop < 0) { cstop += l; if (cstop < 0) cstop = 0; } if (cstart < 0) { cstart += l; if (cstart < 0) cstart = 0; } } else { if (!PyErr_ExceptionMatches(PyExc_OverflowError)) goto bad; PyErr_Clear(); } } return ms->sq_slice(obj, cstart, cstop); } #else CYTHON_UNUSED_VAR(wraparound); #endif mp = Py_TYPE(obj)->tp_as_mapping; if (likely(mp && mp->mp_subscript)) #else CYTHON_UNUSED_VAR(wraparound); #endif { PyObject* result; PyObject *py_slice, *py_start, *py_stop; if (_py_slice) { py_slice = *_py_slice; } else { PyObject* owned_start = NULL; PyObject* owned_stop = NULL; if (_py_start) { py_start = *_py_start; } else { if (has_cstart) { owned_start = py_start = PyInt_FromSsize_t(cstart); if (unlikely(!py_start)) goto bad; } else py_start = Py_None; } if (_py_stop) { py_stop = *_py_stop; } else { if (has_cstop) { owned_stop = py_stop = PyInt_FromSsize_t(cstop); if (unlikely(!py_stop)) { Py_XDECREF(owned_start); goto bad; } } else py_stop = Py_None; } py_slice = PySlice_New(py_start, py_stop, Py_None); Py_XDECREF(owned_start); Py_XDECREF(owned_stop); if (unlikely(!py_slice)) goto bad; } #if CYTHON_USE_TYPE_SLOTS result = mp->mp_subscript(obj, py_slice); #else result = PyObject_GetItem(obj, py_slice); #endif if (!_py_slice) { Py_DECREF(py_slice); } return result; } obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); PyErr_Format(PyExc_TypeError, "'" __Pyx_FMT_TYPENAME "' object is unsliceable", obj_type_name); __Pyx_DECREF_TypeName(obj_type_name); bad: return NULL; } /* PySequenceMultiply */ static PyObject* __Pyx_PySequence_Multiply_Generic(PyObject *seq, Py_ssize_t mul) { PyObject *result, *pymul = PyInt_FromSsize_t(mul); if (unlikely(!pymul)) return NULL; result = PyNumber_Multiply(seq, pymul); Py_DECREF(pymul); return result; } static CYTHON_INLINE PyObject* __Pyx_PySequence_Multiply(PyObject *seq, Py_ssize_t mul) { #if CYTHON_USE_TYPE_SLOTS PyTypeObject *type = Py_TYPE(seq); if (likely(type->tp_as_sequence && type->tp_as_sequence->sq_repeat)) { return type->tp_as_sequence->sq_repeat(seq, mul); } else #endif { return __Pyx_PySequence_Multiply_Generic(seq, mul); } } /* GetItemIntUnicode */ static CYTHON_INLINE Py_UCS4 __Pyx_GetItemInt_Unicode_Fast(PyObject* ustring, Py_ssize_t i, int wraparound, int boundscheck) { Py_ssize_t length; if (unlikely(__Pyx_PyUnicode_READY(ustring) < 0)) return (Py_UCS4)-1; if (wraparound | boundscheck) { length = __Pyx_PyUnicode_GET_LENGTH(ustring); if (wraparound & unlikely(i < 0)) i += length; if ((!boundscheck) || likely(__Pyx_is_valid_index(i, length))) { return __Pyx_PyUnicode_READ_CHAR(ustring, i); } else { PyErr_SetString(PyExc_IndexError, "string index out of range"); return (Py_UCS4)-1; } } else { return __Pyx_PyUnicode_READ_CHAR(ustring, i); } } /* PyUnicode_Substring */ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring( PyObject* text, Py_ssize_t start, Py_ssize_t stop) { Py_ssize_t length; if (unlikely(__Pyx_PyUnicode_READY(text) == -1)) return NULL; length = __Pyx_PyUnicode_GET_LENGTH(text); if (start < 0) { start += length; if (start < 0) start = 0; } if (stop < 0) stop += length; else if (stop > length) stop = length; if (stop <= start) return __Pyx_NewRef(__pyx_empty_unicode); if (start == 0 && stop == length) return __Pyx_NewRef(text); #if CYTHON_PEP393_ENABLED return PyUnicode_FromKindAndData(PyUnicode_KIND(text), PyUnicode_1BYTE_DATA(text) + start*PyUnicode_KIND(text), stop-start); #else return PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(text)+start, stop-start); #endif } /* SwapException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 _PyErr_StackItem *exc_info = tstate->exc_info; tmp_value = exc_info->exc_value; exc_info->exc_value = *value; if (tmp_value == NULL || tmp_value == Py_None) { Py_XDECREF(tmp_value); tmp_value = NULL; tmp_type = NULL; tmp_tb = NULL; } else { tmp_type = (PyObject*) Py_TYPE(tmp_value); Py_INCREF(tmp_type); #if CYTHON_COMPILING_IN_CPYTHON tmp_tb = ((PyBaseExceptionObject*) tmp_value)->traceback; Py_XINCREF(tmp_tb); #else tmp_tb = PyException_GetTraceback(tmp_value); #endif } #elif CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = *type; exc_info->exc_value = *value; exc_info->exc_traceback = *tb; #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = *type; tstate->exc_value = *value; tstate->exc_traceback = *tb; #endif *type = tmp_type; *value = tmp_value; *tb = tmp_tb; } #else static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); PyErr_SetExcInfo(*type, *value, *tb); *type = tmp_type; *value = tmp_value; *tb = tmp_tb; } #endif /* GetTopmostException */ #if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate) { _PyErr_StackItem *exc_info = tstate->exc_info; while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) && exc_info->previous_item != NULL) { exc_info = exc_info->previous_item; } return exc_info; } #endif /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); PyObject *exc_value = exc_info->exc_value; if (exc_value == NULL || exc_value == Py_None) { *value = NULL; *type = NULL; *tb = NULL; } else { *value = exc_value; Py_INCREF(*value); *type = (PyObject*) Py_TYPE(exc_value); Py_INCREF(*type); *tb = PyException_GetTraceback(exc_value); } #elif CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); *type = exc_info->exc_type; *value = exc_info->exc_value; *tb = exc_info->exc_traceback; Py_XINCREF(*type); Py_XINCREF(*value); Py_XINCREF(*tb); #else *type = tstate->exc_type; *value = tstate->exc_value; *tb = tstate->exc_traceback; Py_XINCREF(*type); Py_XINCREF(*value); Py_XINCREF(*tb); #endif } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 _PyErr_StackItem *exc_info = tstate->exc_info; PyObject *tmp_value = exc_info->exc_value; exc_info->exc_value = value; Py_XDECREF(tmp_value); Py_XDECREF(type); Py_XDECREF(tb); #else PyObject *tmp_type, *tmp_value, *tmp_tb; #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = type; exc_info->exc_value = value; exc_info->exc_traceback = tb; #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = type; tstate->exc_value = value; tstate->exc_traceback = tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #endif } #endif /* Import */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { PyObject *module = 0; PyObject *empty_dict = 0; PyObject *empty_list = 0; #if PY_MAJOR_VERSION < 3 PyObject *py_import; py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); if (unlikely(!py_import)) goto bad; if (!from_list) { empty_list = PyList_New(0); if (unlikely(!empty_list)) goto bad; from_list = empty_list; } #endif empty_dict = PyDict_New(); if (unlikely(!empty_dict)) goto bad; { #if PY_MAJOR_VERSION >= 3 if (level == -1) { if (strchr(__Pyx_MODULE_NAME, '.') != NULL) { module = PyImport_ImportModuleLevelObject( name, __pyx_d, empty_dict, from_list, 1); if (unlikely(!module)) { if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError))) goto bad; PyErr_Clear(); } } level = 0; } #endif if (!module) { #if PY_MAJOR_VERSION < 3 PyObject *py_level = PyInt_FromLong(level); if (unlikely(!py_level)) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL); Py_DECREF(py_level); #else module = PyImport_ImportModuleLevelObject( name, __pyx_d, empty_dict, from_list, level); #endif } } bad: Py_XDECREF(empty_dict); Py_XDECREF(empty_list); #if PY_MAJOR_VERSION < 3 Py_XDECREF(py_import); #endif return module; } /* ImportFrom */ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { const char* module_name_str = 0; PyObject* module_name = 0; PyObject* module_dot = 0; PyObject* full_name = 0; PyErr_Clear(); module_name_str = PyModule_GetName(module); if (unlikely(!module_name_str)) { goto modbad; } module_name = PyUnicode_FromString(module_name_str); if (unlikely(!module_name)) { goto modbad; } module_dot = PyUnicode_Concat(module_name, __pyx_kp_u__12); if (unlikely(!module_dot)) { goto modbad; } full_name = PyUnicode_Concat(module_dot, name); if (unlikely(!full_name)) { goto modbad; } #if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) goto modbad; value = PyObject_GetItem(modules, full_name); } #else value = PyImport_GetModule(full_name); #endif modbad: Py_XDECREF(full_name); Py_XDECREF(module_dot); Py_XDECREF(module_name); } if (unlikely(!value)) { PyErr_Format(PyExc_ImportError, #if PY_MAJOR_VERSION < 3 "cannot import name %.230s", PyString_AS_STRING(name)); #else "cannot import name %S", name); #endif } return value; } /* GetAttr */ static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { #if CYTHON_USE_TYPE_SLOTS #if PY_MAJOR_VERSION >= 3 if (likely(PyUnicode_Check(n))) #else if (likely(PyString_Check(n))) #endif return __Pyx_PyObject_GetAttrStr(o, n); #endif return PyObject_GetAttr(o, n); } /* HasAttr */ #if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { PyObject *r; if (unlikely(!__Pyx_PyBaseString_Check(n))) { PyErr_SetString(PyExc_TypeError, "hasattr(): attribute name must be string"); return -1; } r = __Pyx_GetAttr(o, n); if (!r) { PyErr_Clear(); return 0; } else { Py_DECREF(r); return 1; } } #endif /* FixUpExtensionType */ #if CYTHON_USE_TYPE_SPECS static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { #if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API CYTHON_UNUSED_VAR(spec); CYTHON_UNUSED_VAR(type); #else const PyType_Slot *slot = spec->slots; while (slot && slot->slot && slot->slot != Py_tp_members) slot++; if (slot && slot->slot == Py_tp_members) { int changed = 0; #if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) const #endif PyMemberDef *memb = (PyMemberDef*) slot->pfunc; while (memb && memb->name) { if (memb->name[0] == '_' && memb->name[1] == '_') { #if PY_VERSION_HEX < 0x030900b1 if (strcmp(memb->name, "__weaklistoffset__") == 0) { assert(memb->type == T_PYSSIZET); assert(memb->flags == READONLY); type->tp_weaklistoffset = memb->offset; changed = 1; } else if (strcmp(memb->name, "__dictoffset__") == 0) { assert(memb->type == T_PYSSIZET); assert(memb->flags == READONLY); type->tp_dictoffset = memb->offset; changed = 1; } #if CYTHON_METH_FASTCALL else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { assert(memb->type == T_PYSSIZET); assert(memb->flags == READONLY); #if PY_VERSION_HEX >= 0x030800b4 type->tp_vectorcall_offset = memb->offset; #else type->tp_print = (printfunc) memb->offset; #endif changed = 1; } #endif #else if ((0)); #endif #if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON else if (strcmp(memb->name, "__module__") == 0) { PyObject *descr; assert(memb->type == T_OBJECT); assert(memb->flags == 0 || memb->flags == READONLY); descr = PyDescr_NewMember(type, memb); if (unlikely(!descr)) return -1; if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { Py_DECREF(descr); return -1; } Py_DECREF(descr); changed = 1; } #endif } memb++; } if (changed) PyType_Modified(type); } #endif return 0; } #endif /* PyObjectGetMethod */ static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { PyObject *attr; #if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP __Pyx_TypeName type_name; PyTypeObject *tp = Py_TYPE(obj); PyObject *descr; descrgetfunc f = NULL; PyObject **dictptr, *dict; int meth_found = 0; assert (*method == NULL); if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { attr = __Pyx_PyObject_GetAttrStr(obj, name); goto try_unpack; } if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { return 0; } descr = _PyType_Lookup(tp, name); if (likely(descr != NULL)) { Py_INCREF(descr); #if defined(Py_TPFLAGS_METHOD_DESCRIPTOR) && Py_TPFLAGS_METHOD_DESCRIPTOR if (__Pyx_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) #elif PY_MAJOR_VERSION >= 3 #ifdef __Pyx_CyFunction_USED if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) #else if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type))) #endif #else #ifdef __Pyx_CyFunction_USED if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) #else if (likely(PyFunction_Check(descr))) #endif #endif { meth_found = 1; } else { f = Py_TYPE(descr)->tp_descr_get; if (f != NULL && PyDescr_IsData(descr)) { attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); goto try_unpack; } } } dictptr = _PyObject_GetDictPtr(obj); if (dictptr != NULL && (dict = *dictptr) != NULL) { Py_INCREF(dict); attr = __Pyx_PyDict_GetItemStr(dict, name); if (attr != NULL) { Py_INCREF(attr); Py_DECREF(dict); Py_XDECREF(descr); goto try_unpack; } Py_DECREF(dict); } if (meth_found) { *method = descr; return 1; } if (f != NULL) { attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); goto try_unpack; } if (likely(descr != NULL)) { *method = descr; return 0; } type_name = __Pyx_PyType_GetName(tp); PyErr_Format(PyExc_AttributeError, #if PY_MAJOR_VERSION >= 3 "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", type_name, name); #else "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", type_name, PyString_AS_STRING(name)); #endif __Pyx_DECREF_TypeName(type_name); return 0; #else attr = __Pyx_PyObject_GetAttrStr(obj, name); goto try_unpack; #endif try_unpack: #if CYTHON_UNPACK_METHODS if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { PyObject *function = PyMethod_GET_FUNCTION(attr); Py_INCREF(function); Py_DECREF(attr); *method = function; return 1; } #endif *method = attr; return 0; } /* PyObjectCallMethod0 */ static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) { PyObject *method = NULL, *result = NULL; int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); if (likely(is_method)) { result = __Pyx_PyObject_CallOneArg(method, obj); Py_DECREF(method); return result; } if (unlikely(!method)) goto bad; result = __Pyx_PyObject_CallNoArg(method); Py_DECREF(method); bad: return result; } /* ValidateBasesTuple */ #if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases) { Py_ssize_t i, n; #if CYTHON_ASSUME_SAFE_MACROS n = PyTuple_GET_SIZE(bases); #else n = PyTuple_Size(bases); if (n < 0) return -1; #endif for (i = 1; i < n; i++) { #if CYTHON_AVOID_BORROWED_REFS PyObject *b0 = PySequence_GetItem(bases, i); if (!b0) return -1; #elif CYTHON_ASSUME_SAFE_MACROS PyObject *b0 = PyTuple_GET_ITEM(bases, i); #else PyObject *b0 = PyTuple_GetItem(bases, i); if (!b0) return -1; #endif PyTypeObject *b; #if PY_MAJOR_VERSION < 3 if (PyClass_Check(b0)) { PyErr_Format(PyExc_TypeError, "base class '%.200s' is an old-style class", PyString_AS_STRING(((PyClassObject*)b0)->cl_name)); #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(b0); #endif return -1; } #endif b = (PyTypeObject*) b0; if (!__Pyx_PyType_HasFeature(b, Py_TPFLAGS_HEAPTYPE)) { __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); PyErr_Format(PyExc_TypeError, "base class '" __Pyx_FMT_TYPENAME "' is not a heap type", b_name); __Pyx_DECREF_TypeName(b_name); #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(b0); #endif return -1; } #if !CYTHON_USE_TYPE_SLOTS if (dictoffset == 0) { PyErr_Format(PyExc_TypeError, "extension type '%s.200s': " "unable to validate whether bases have a __dict__ " "when CYTHON_USE_TYPE_SLOTS is off " "(likely because you are building in the limited API). " "Therefore, all extension types with multiple bases " "must add 'cdef dict __dict__' in this compilation mode", type_name); #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(b0); #endif return -1; } #else if (dictoffset == 0 && b->tp_dictoffset) { __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); PyErr_Format(PyExc_TypeError, "extension type '%.200s' has no __dict__ slot, " "but base type '" __Pyx_FMT_TYPENAME "' has: " "either add 'cdef dict __dict__' to the extension type " "or add '__slots__ = [...]' to the base type", type_name, b_name); __Pyx_DECREF_TypeName(b_name); #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(b0); #endif return -1; } #endif #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(b0); #endif } return 0; } #endif /* PyType_Ready */ static int __Pyx_PyType_Ready(PyTypeObject *t) { #if CYTHON_USE_TYPE_SPECS || !(CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API) || defined(PYSTON_MAJOR_VERSION) (void)__Pyx_PyObject_CallMethod0; #if CYTHON_USE_TYPE_SPECS (void)__Pyx_validate_bases_tuple; #endif return PyType_Ready(t); #else int r; PyObject *bases = __Pyx_PyType_GetSlot(t, tp_bases, PyObject*); if (bases && unlikely(__Pyx_validate_bases_tuple(t->tp_name, t->tp_dictoffset, bases) == -1)) return -1; #if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) { int gc_was_enabled; #if PY_VERSION_HEX >= 0x030A00b1 gc_was_enabled = PyGC_Disable(); (void)__Pyx_PyObject_CallMethod0; #else PyObject *ret, *py_status; PyObject *gc = NULL; #if PY_VERSION_HEX >= 0x030700a1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM+0 >= 0x07030400) gc = PyImport_GetModule(__pyx_kp_u_gc); #endif if (unlikely(!gc)) gc = PyImport_Import(__pyx_kp_u_gc); if (unlikely(!gc)) return -1; py_status = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_isenabled); if (unlikely(!py_status)) { Py_DECREF(gc); return -1; } gc_was_enabled = __Pyx_PyObject_IsTrue(py_status); Py_DECREF(py_status); if (gc_was_enabled > 0) { ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_disable); if (unlikely(!ret)) { Py_DECREF(gc); return -1; } Py_DECREF(ret); } else if (unlikely(gc_was_enabled == -1)) { Py_DECREF(gc); return -1; } #endif t->tp_flags |= Py_TPFLAGS_HEAPTYPE; #if PY_VERSION_HEX >= 0x030A0000 t->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE; #endif #else (void)__Pyx_PyObject_CallMethod0; #endif r = PyType_Ready(t); #if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) t->tp_flags &= ~Py_TPFLAGS_HEAPTYPE; #if PY_VERSION_HEX >= 0x030A00b1 if (gc_was_enabled) PyGC_Enable(); #else if (gc_was_enabled) { PyObject *tp, *v, *tb; PyErr_Fetch(&tp, &v, &tb); ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_enable); if (likely(ret || r == -1)) { Py_XDECREF(ret); PyErr_Restore(tp, v, tb); } else { Py_XDECREF(tp); Py_XDECREF(v); Py_XDECREF(tb); r = -1; } } Py_DECREF(gc); #endif } #endif return r; #endif } /* PyObject_GenericGetAttrNoDict */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { __Pyx_TypeName type_name = __Pyx_PyType_GetName(tp); PyErr_Format(PyExc_AttributeError, #if PY_MAJOR_VERSION >= 3 "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", type_name, attr_name); #else "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", type_name, PyString_AS_STRING(attr_name)); #endif __Pyx_DECREF_TypeName(type_name); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { PyObject *descr; PyTypeObject *tp = Py_TYPE(obj); if (unlikely(!PyString_Check(attr_name))) { return PyObject_GenericGetAttr(obj, attr_name); } assert(!tp->tp_dictoffset); descr = _PyType_Lookup(tp, attr_name); if (unlikely(!descr)) { return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); } Py_INCREF(descr); #if PY_MAJOR_VERSION < 3 if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) #endif { descrgetfunc f = Py_TYPE(descr)->tp_descr_get; if (unlikely(f)) { PyObject *res = f(descr, obj, (PyObject *)tp); Py_DECREF(descr); return res; } } return descr; } #endif /* PyObject_GenericGetAttr */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { return PyObject_GenericGetAttr(obj, attr_name); } return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); } #endif /* SetupReduce */ #if !CYTHON_COMPILING_IN_LIMITED_API static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { int ret; PyObject *name_attr; name_attr = __Pyx_PyObject_GetAttrStrNoError(meth, __pyx_n_s_name); if (likely(name_attr)) { ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); } else { ret = -1; } if (unlikely(ret < 0)) { PyErr_Clear(); ret = 0; } Py_XDECREF(name_attr); return ret; } static int __Pyx_setup_reduce(PyObject* type_obj) { int ret = 0; PyObject *object_reduce = NULL; PyObject *object_getstate = NULL; PyObject *object_reduce_ex = NULL; PyObject *reduce = NULL; PyObject *reduce_ex = NULL; PyObject *reduce_cython = NULL; PyObject *setstate = NULL; PyObject *setstate_cython = NULL; PyObject *getstate = NULL; #if CYTHON_USE_PYTYPE_LOOKUP getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); #else getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); if (!getstate && PyErr_Occurred()) { goto __PYX_BAD; } #endif if (getstate) { #if CYTHON_USE_PYTYPE_LOOKUP object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); #else object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); if (!object_getstate && PyErr_Occurred()) { goto __PYX_BAD; } #endif if (object_getstate != getstate) { goto __PYX_GOOD; } } #if CYTHON_USE_PYTYPE_LOOKUP object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; #else object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; #endif reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; if (reduce_ex == object_reduce_ex) { #if CYTHON_USE_PYTYPE_LOOKUP object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; #else object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; #endif reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); if (likely(reduce_cython)) { ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; } else if (reduce == object_reduce || PyErr_Occurred()) { goto __PYX_BAD; } setstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate); if (!setstate) PyErr_Clear(); if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); if (likely(setstate_cython)) { ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; } else if (!setstate || PyErr_Occurred()) { goto __PYX_BAD; } } PyType_Modified((PyTypeObject*)type_obj); } } goto __PYX_GOOD; __PYX_BAD: if (!PyErr_Occurred()) { __Pyx_TypeName type_obj_name = __Pyx_PyType_GetName((PyTypeObject*)type_obj); PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for " __Pyx_FMT_TYPENAME, type_obj_name); __Pyx_DECREF_TypeName(type_obj_name); } ret = -1; __PYX_GOOD: #if !CYTHON_USE_PYTYPE_LOOKUP Py_XDECREF(object_reduce); Py_XDECREF(object_reduce_ex); Py_XDECREF(object_getstate); Py_XDECREF(getstate); #endif Py_XDECREF(reduce); Py_XDECREF(reduce_ex); Py_XDECREF(reduce_cython); Py_XDECREF(setstate); Py_XDECREF(setstate_cython); return ret; } #endif /* SetVTable */ static int __Pyx_SetVtable(PyTypeObject *type, void *vtable) { PyObject *ob = PyCapsule_New(vtable, 0, 0); if (unlikely(!ob)) goto bad; #if CYTHON_COMPILING_IN_LIMITED_API if (unlikely(PyObject_SetAttr((PyObject *) type, __pyx_n_s_pyx_vtable, ob) < 0)) #else if (unlikely(PyDict_SetItem(type->tp_dict, __pyx_n_s_pyx_vtable, ob) < 0)) #endif goto bad; Py_DECREF(ob); return 0; bad: Py_XDECREF(ob); return -1; } /* GetVTable */ static void* __Pyx_GetVtable(PyTypeObject *type) { void* ptr; #if CYTHON_COMPILING_IN_LIMITED_API PyObject *ob = PyObject_GetAttr((PyObject *)type, __pyx_n_s_pyx_vtable); #else PyObject *ob = PyObject_GetItem(type->tp_dict, __pyx_n_s_pyx_vtable); #endif if (!ob) goto bad; ptr = PyCapsule_GetPointer(ob, 0); if (!ptr && !PyErr_Occurred()) PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type"); Py_DECREF(ob); return ptr; bad: Py_XDECREF(ob); return NULL; } /* MergeVTables */ #if !CYTHON_COMPILING_IN_LIMITED_API static int __Pyx_MergeVtables(PyTypeObject *type) { int i; void** base_vtables; __Pyx_TypeName tp_base_name; __Pyx_TypeName base_name; void* unknown = (void*)-1; PyObject* bases = type->tp_bases; int base_depth = 0; { PyTypeObject* base = type->tp_base; while (base) { base_depth += 1; base = base->tp_base; } } base_vtables = (void**) malloc(sizeof(void*) * (size_t)(base_depth + 1)); base_vtables[0] = unknown; for (i = 1; i < PyTuple_GET_SIZE(bases); i++) { void* base_vtable = __Pyx_GetVtable(((PyTypeObject*)PyTuple_GET_ITEM(bases, i))); if (base_vtable != NULL) { int j; PyTypeObject* base = type->tp_base; for (j = 0; j < base_depth; j++) { if (base_vtables[j] == unknown) { base_vtables[j] = __Pyx_GetVtable(base); base_vtables[j + 1] = unknown; } if (base_vtables[j] == base_vtable) { break; } else if (base_vtables[j] == NULL) { goto bad; } base = base->tp_base; } } } PyErr_Clear(); free(base_vtables); return 0; bad: tp_base_name = __Pyx_PyType_GetName(type->tp_base); base_name = __Pyx_PyType_GetName((PyTypeObject*)PyTuple_GET_ITEM(bases, i)); PyErr_Format(PyExc_TypeError, "multiple bases have vtable conflict: '" __Pyx_FMT_TYPENAME "' and '" __Pyx_FMT_TYPENAME "'", tp_base_name, base_name); __Pyx_DECREF_TypeName(tp_base_name); __Pyx_DECREF_TypeName(base_name); free(base_vtables); return -1; } #endif /* TypeImport */ #ifndef __PYX_HAVE_RT_ImportType_3_0_5 #define __PYX_HAVE_RT_ImportType_3_0_5 static PyTypeObject *__Pyx_ImportType_3_0_5(PyObject *module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_5 check_size) { PyObject *result = 0; char warning[200]; Py_ssize_t basicsize; Py_ssize_t itemsize; #if CYTHON_COMPILING_IN_LIMITED_API PyObject *py_basicsize; PyObject *py_itemsize; #endif result = PyObject_GetAttrString(module, class_name); if (!result) goto bad; if (!PyType_Check(result)) { PyErr_Format(PyExc_TypeError, "%.200s.%.200s is not a type object", module_name, class_name); goto bad; } #if !CYTHON_COMPILING_IN_LIMITED_API basicsize = ((PyTypeObject *)result)->tp_basicsize; itemsize = ((PyTypeObject *)result)->tp_itemsize; #else py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); if (!py_basicsize) goto bad; basicsize = PyLong_AsSsize_t(py_basicsize); Py_DECREF(py_basicsize); py_basicsize = 0; if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) goto bad; py_itemsize = PyObject_GetAttrString(result, "__itemsize__"); if (!py_itemsize) goto bad; itemsize = PyLong_AsSsize_t(py_itemsize); Py_DECREF(py_itemsize); py_itemsize = 0; if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred()) goto bad; #endif if (itemsize) { if (size % alignment) { alignment = size % alignment; } if (itemsize < (Py_ssize_t)alignment) itemsize = (Py_ssize_t)alignment; } if ((size_t)(basicsize + itemsize) < size) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize+itemsize); goto bad; } if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_5 && ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd-%zd from PyObject", module_name, class_name, size, basicsize, basicsize+itemsize); goto bad; } else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_5 && (size_t)basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; } return (PyTypeObject *)result; bad: Py_XDECREF(result); return NULL; } #endif /* decode_c_string */ static CYTHON_INLINE PyObject* __Pyx_decode_c_string( const char* cstring, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { Py_ssize_t length; if (unlikely((start < 0) | (stop < 0))) { size_t slen = strlen(cstring); if (unlikely(slen > (size_t) PY_SSIZE_T_MAX)) { PyErr_SetString(PyExc_OverflowError, "c-string too long to convert to Python"); return NULL; } length = (Py_ssize_t) slen; if (start < 0) { start += length; if (start < 0) start = 0; } if (stop < 0) stop += length; } if (unlikely(stop <= start)) return __Pyx_NewRef(__pyx_empty_unicode); length = stop - start; cstring += start; if (decode_func) { return decode_func(cstring, length, errors); } else { return PyUnicode_Decode(cstring, length, encoding, errors); } } /* FetchSharedCythonModule */ static PyObject *__Pyx_FetchSharedCythonABIModule(void) { return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); } /* FetchCommonType */ static int __Pyx_VerifyCachedType(PyObject *cached_type, const char *name, Py_ssize_t basicsize, Py_ssize_t expected_basicsize) { if (!PyType_Check(cached_type)) { PyErr_Format(PyExc_TypeError, "Shared Cython type %.200s is not a type object", name); return -1; } if (basicsize != expected_basicsize) { PyErr_Format(PyExc_TypeError, "Shared Cython type %.200s has the wrong size, try recompiling", name); return -1; } return 0; } #if !CYTHON_USE_TYPE_SPECS static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { PyObject* abi_module; const char* object_name; PyTypeObject *cached_type = NULL; abi_module = __Pyx_FetchSharedCythonABIModule(); if (!abi_module) return NULL; object_name = strrchr(type->tp_name, '.'); object_name = object_name ? object_name+1 : type->tp_name; cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); if (cached_type) { if (__Pyx_VerifyCachedType( (PyObject *)cached_type, object_name, cached_type->tp_basicsize, type->tp_basicsize) < 0) { goto bad; } goto done; } if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; PyErr_Clear(); if (PyType_Ready(type) < 0) goto bad; if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) goto bad; Py_INCREF(type); cached_type = type; done: Py_DECREF(abi_module); return cached_type; bad: Py_XDECREF(cached_type); cached_type = NULL; goto done; } #else static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { PyObject *abi_module, *cached_type = NULL; const char* object_name = strrchr(spec->name, '.'); object_name = object_name ? object_name+1 : spec->name; abi_module = __Pyx_FetchSharedCythonABIModule(); if (!abi_module) return NULL; cached_type = PyObject_GetAttrString(abi_module, object_name); if (cached_type) { Py_ssize_t basicsize; #if CYTHON_COMPILING_IN_LIMITED_API PyObject *py_basicsize; py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); if (unlikely(!py_basicsize)) goto bad; basicsize = PyLong_AsSsize_t(py_basicsize); Py_DECREF(py_basicsize); py_basicsize = 0; if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; #else basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; #endif if (__Pyx_VerifyCachedType( cached_type, object_name, basicsize, spec->basicsize) < 0) { goto bad; } goto done; } if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; PyErr_Clear(); CYTHON_UNUSED_VAR(module); cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); if (unlikely(!cached_type)) goto bad; if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; done: Py_DECREF(abi_module); assert(cached_type == NULL || PyType_Check(cached_type)); return (PyTypeObject *) cached_type; bad: Py_XDECREF(cached_type); cached_type = NULL; goto done; } #endif /* PyVectorcallFastCallDict */ #if CYTHON_METH_FASTCALL static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) { PyObject *res = NULL; PyObject *kwnames; PyObject **newargs; PyObject **kwvalues; Py_ssize_t i, pos; size_t j; PyObject *key, *value; unsigned long keys_are_strings; Py_ssize_t nkw = PyDict_GET_SIZE(kw); newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); if (unlikely(newargs == NULL)) { PyErr_NoMemory(); return NULL; } for (j = 0; j < nargs; j++) newargs[j] = args[j]; kwnames = PyTuple_New(nkw); if (unlikely(kwnames == NULL)) { PyMem_Free(newargs); return NULL; } kwvalues = newargs + nargs; pos = i = 0; keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; while (PyDict_Next(kw, &pos, &key, &value)) { keys_are_strings &= Py_TYPE(key)->tp_flags; Py_INCREF(key); Py_INCREF(value); PyTuple_SET_ITEM(kwnames, i, key); kwvalues[i] = value; i++; } if (unlikely(!keys_are_strings)) { PyErr_SetString(PyExc_TypeError, "keywords must be strings"); goto cleanup; } res = vc(func, newargs, nargs, kwnames); cleanup: Py_DECREF(kwnames); for (i = 0; i < nkw; i++) Py_DECREF(kwvalues[i]); PyMem_Free(newargs); return res; } static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) { if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { return vc(func, args, nargs, NULL); } return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); } #endif /* CythonFunctionShared */ #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { if (__Pyx_CyFunction_Check(func)) { return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; } else if (PyCFunction_Check(func)) { return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; } return 0; } #else static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; } #endif static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API __Pyx_Py_XDECREF_SET( __Pyx_CyFunction_GetClassObj(f), ((classobj) ? __Pyx_NewRef(classobj) : NULL)); #else __Pyx_Py_XDECREF_SET( ((PyCMethodObject *) (f))->mm_class, (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); #endif } static PyObject * __Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) { CYTHON_UNUSED_VAR(closure); if (unlikely(op->func_doc == NULL)) { #if CYTHON_COMPILING_IN_LIMITED_API op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); if (unlikely(!op->func_doc)) return NULL; #else if (((PyCFunctionObject*)op)->m_ml->ml_doc) { #if PY_MAJOR_VERSION >= 3 op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); #else op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); #endif if (unlikely(op->func_doc == NULL)) return NULL; } else { Py_INCREF(Py_None); return Py_None; } #endif } Py_INCREF(op->func_doc); return op->func_doc; } static int __Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); if (value == NULL) { value = Py_None; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_doc, value); return 0; } static PyObject * __Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); if (unlikely(op->func_name == NULL)) { #if CYTHON_COMPILING_IN_LIMITED_API op->func_name = PyObject_GetAttrString(op->func, "__name__"); #elif PY_MAJOR_VERSION >= 3 op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); #else op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); #endif if (unlikely(op->func_name == NULL)) return NULL; } Py_INCREF(op->func_name); return op->func_name; } static int __Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); #if PY_MAJOR_VERSION >= 3 if (unlikely(value == NULL || !PyUnicode_Check(value))) #else if (unlikely(value == NULL || !PyString_Check(value))) #endif { PyErr_SetString(PyExc_TypeError, "__name__ must be set to a string object"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_name, value); return 0; } static PyObject * __Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); Py_INCREF(op->func_qualname); return op->func_qualname; } static int __Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); #if PY_MAJOR_VERSION >= 3 if (unlikely(value == NULL || !PyUnicode_Check(value))) #else if (unlikely(value == NULL || !PyString_Check(value))) #endif { PyErr_SetString(PyExc_TypeError, "__qualname__ must be set to a string object"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_qualname, value); return 0; } static PyObject * __Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); if (unlikely(op->func_dict == NULL)) { op->func_dict = PyDict_New(); if (unlikely(op->func_dict == NULL)) return NULL; } Py_INCREF(op->func_dict); return op->func_dict; } static int __Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); if (unlikely(value == NULL)) { PyErr_SetString(PyExc_TypeError, "function's dictionary may not be deleted"); return -1; } if (unlikely(!PyDict_Check(value))) { PyErr_SetString(PyExc_TypeError, "setting function's dictionary to a non-dict"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_dict, value); return 0; } static PyObject * __Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); Py_INCREF(op->func_globals); return op->func_globals; } static PyObject * __Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(op); CYTHON_UNUSED_VAR(context); Py_INCREF(Py_None); return Py_None; } static PyObject * __Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) { PyObject* result = (op->func_code) ? op->func_code : Py_None; CYTHON_UNUSED_VAR(context); Py_INCREF(result); return result; } static int __Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { int result = 0; PyObject *res = op->defaults_getter((PyObject *) op); if (unlikely(!res)) return -1; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS op->defaults_tuple = PyTuple_GET_ITEM(res, 0); Py_INCREF(op->defaults_tuple); op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); Py_INCREF(op->defaults_kwdict); #else op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); if (unlikely(!op->defaults_tuple)) result = -1; else { op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); if (unlikely(!op->defaults_kwdict)) result = -1; } #endif Py_DECREF(res); return result; } static int __Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); if (!value) { value = Py_None; } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { PyErr_SetString(PyExc_TypeError, "__defaults__ must be set to a tuple object"); return -1; } PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " "currently affect the values used in function calls", 1); Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); return 0; } static PyObject * __Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { PyObject* result = op->defaults_tuple; CYTHON_UNUSED_VAR(context); if (unlikely(!result)) { if (op->defaults_getter) { if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; result = op->defaults_tuple; } else { result = Py_None; } } Py_INCREF(result); return result; } static int __Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); if (!value) { value = Py_None; } else if (unlikely(value != Py_None && !PyDict_Check(value))) { PyErr_SetString(PyExc_TypeError, "__kwdefaults__ must be set to a dict object"); return -1; } PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " "currently affect the values used in function calls", 1); Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); return 0; } static PyObject * __Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { PyObject* result = op->defaults_kwdict; CYTHON_UNUSED_VAR(context); if (unlikely(!result)) { if (op->defaults_getter) { if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; result = op->defaults_kwdict; } else { result = Py_None; } } Py_INCREF(result); return result; } static int __Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); if (!value || value == Py_None) { value = NULL; } else if (unlikely(!PyDict_Check(value))) { PyErr_SetString(PyExc_TypeError, "__annotations__ must be set to a dict object"); return -1; } Py_XINCREF(value); __Pyx_Py_XDECREF_SET(op->func_annotations, value); return 0; } static PyObject * __Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { PyObject* result = op->func_annotations; CYTHON_UNUSED_VAR(context); if (unlikely(!result)) { result = PyDict_New(); if (unlikely(!result)) return NULL; op->func_annotations = result; } Py_INCREF(result); return result; } static PyObject * __Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { int is_coroutine; CYTHON_UNUSED_VAR(context); if (op->func_is_coroutine) { return __Pyx_NewRef(op->func_is_coroutine); } is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; #if PY_VERSION_HEX >= 0x03050000 if (is_coroutine) { PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; fromlist = PyList_New(1); if (unlikely(!fromlist)) return NULL; Py_INCREF(marker); #if CYTHON_ASSUME_SAFE_MACROS PyList_SET_ITEM(fromlist, 0, marker); #else if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { Py_DECREF(marker); Py_DECREF(fromlist); return NULL; } #endif module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); Py_DECREF(fromlist); if (unlikely(!module)) goto ignore; op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); Py_DECREF(module); if (likely(op->func_is_coroutine)) { return __Pyx_NewRef(op->func_is_coroutine); } ignore: PyErr_Clear(); } #endif op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); return __Pyx_NewRef(op->func_is_coroutine); } #if CYTHON_COMPILING_IN_LIMITED_API static PyObject * __Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); return PyObject_GetAttrString(op->func, "__module__"); } static int __Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); return PyObject_SetAttrString(op->func, "__module__", value); } #endif static PyGetSetDef __pyx_CyFunction_getsets[] = { {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, #if CYTHON_COMPILING_IN_LIMITED_API {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, #endif {0, 0, 0, 0, 0} }; static PyMemberDef __pyx_CyFunction_members[] = { #if !CYTHON_COMPILING_IN_LIMITED_API {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, #endif #if CYTHON_USE_TYPE_SPECS {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, #if CYTHON_METH_FASTCALL #if CYTHON_BACKPORT_VECTORCALL {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, #else #if !CYTHON_COMPILING_IN_LIMITED_API {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, #endif #endif #endif #if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, #else {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, #endif #endif {0, 0, 0, 0, 0} }; static PyObject * __Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) { CYTHON_UNUSED_VAR(args); #if PY_MAJOR_VERSION >= 3 Py_INCREF(m->func_qualname); return m->func_qualname; #else return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); #endif } static PyMethodDef __pyx_CyFunction_methods[] = { {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, {0, 0, 0, 0} }; #if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) #else #define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) #endif static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { #if !CYTHON_COMPILING_IN_LIMITED_API PyCFunctionObject *cf = (PyCFunctionObject*) op; #endif if (unlikely(op == NULL)) return NULL; #if CYTHON_COMPILING_IN_LIMITED_API op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); if (unlikely(!op->func)) return NULL; #endif op->flags = flags; __Pyx_CyFunction_weakreflist(op) = NULL; #if !CYTHON_COMPILING_IN_LIMITED_API cf->m_ml = ml; cf->m_self = (PyObject *) op; #endif Py_XINCREF(closure); op->func_closure = closure; #if !CYTHON_COMPILING_IN_LIMITED_API Py_XINCREF(module); cf->m_module = module; #endif op->func_dict = NULL; op->func_name = NULL; Py_INCREF(qualname); op->func_qualname = qualname; op->func_doc = NULL; #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API op->func_classobj = NULL; #else ((PyCMethodObject*)op)->mm_class = NULL; #endif op->func_globals = globals; Py_INCREF(op->func_globals); Py_XINCREF(code); op->func_code = code; op->defaults_pyobjects = 0; op->defaults_size = 0; op->defaults = NULL; op->defaults_tuple = NULL; op->defaults_kwdict = NULL; op->defaults_getter = NULL; op->func_annotations = NULL; op->func_is_coroutine = NULL; #if CYTHON_METH_FASTCALL switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { case METH_NOARGS: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; break; case METH_O: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; break; case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; break; case METH_FASTCALL | METH_KEYWORDS: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; break; case METH_VARARGS | METH_KEYWORDS: __Pyx_CyFunction_func_vectorcall(op) = NULL; break; default: PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); Py_DECREF(op); return NULL; } #endif return (PyObject *) op; } static int __Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) { Py_CLEAR(m->func_closure); #if CYTHON_COMPILING_IN_LIMITED_API Py_CLEAR(m->func); #else Py_CLEAR(((PyCFunctionObject*)m)->m_module); #endif Py_CLEAR(m->func_dict); Py_CLEAR(m->func_name); Py_CLEAR(m->func_qualname); Py_CLEAR(m->func_doc); Py_CLEAR(m->func_globals); Py_CLEAR(m->func_code); #if !CYTHON_COMPILING_IN_LIMITED_API #if PY_VERSION_HEX < 0x030900B1 Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); #else { PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; ((PyCMethodObject *) (m))->mm_class = NULL; Py_XDECREF(cls); } #endif #endif Py_CLEAR(m->defaults_tuple); Py_CLEAR(m->defaults_kwdict); Py_CLEAR(m->func_annotations); Py_CLEAR(m->func_is_coroutine); if (m->defaults) { PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); int i; for (i = 0; i < m->defaults_pyobjects; i++) Py_XDECREF(pydefaults[i]); PyObject_Free(m->defaults); m->defaults = NULL; } return 0; } static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) { if (__Pyx_CyFunction_weakreflist(m) != NULL) PyObject_ClearWeakRefs((PyObject *) m); __Pyx_CyFunction_clear(m); __Pyx_PyHeapTypeObject_GC_Del(m); } static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) { PyObject_GC_UnTrack(m); __Pyx__CyFunction_dealloc(m); } static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) { Py_VISIT(m->func_closure); #if CYTHON_COMPILING_IN_LIMITED_API Py_VISIT(m->func); #else Py_VISIT(((PyCFunctionObject*)m)->m_module); #endif Py_VISIT(m->func_dict); Py_VISIT(m->func_name); Py_VISIT(m->func_qualname); Py_VISIT(m->func_doc); Py_VISIT(m->func_globals); Py_VISIT(m->func_code); #if !CYTHON_COMPILING_IN_LIMITED_API Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); #endif Py_VISIT(m->defaults_tuple); Py_VISIT(m->defaults_kwdict); Py_VISIT(m->func_is_coroutine); if (m->defaults) { PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); int i; for (i = 0; i < m->defaults_pyobjects; i++) Py_VISIT(pydefaults[i]); } return 0; } static PyObject* __Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) { #if PY_MAJOR_VERSION >= 3 return PyUnicode_FromFormat("", op->func_qualname, (void *)op); #else return PyString_FromFormat("", PyString_AsString(op->func_qualname), (void *)op); #endif } static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { #if CYTHON_COMPILING_IN_LIMITED_API PyObject *f = ((__pyx_CyFunctionObject*)func)->func; PyObject *py_name = NULL; PyCFunction meth; int flags; meth = PyCFunction_GetFunction(f); if (unlikely(!meth)) return NULL; flags = PyCFunction_GetFlags(f); if (unlikely(flags < 0)) return NULL; #else PyCFunctionObject* f = (PyCFunctionObject*)func; PyCFunction meth = f->m_ml->ml_meth; int flags = f->m_ml->ml_flags; #endif Py_ssize_t size; switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { case METH_VARARGS: if (likely(kw == NULL || PyDict_Size(kw) == 0)) return (*meth)(self, arg); break; case METH_VARARGS | METH_KEYWORDS: return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); case METH_NOARGS: if (likely(kw == NULL || PyDict_Size(kw) == 0)) { #if CYTHON_ASSUME_SAFE_MACROS size = PyTuple_GET_SIZE(arg); #else size = PyTuple_Size(arg); if (unlikely(size < 0)) return NULL; #endif if (likely(size == 0)) return (*meth)(self, NULL); #if CYTHON_COMPILING_IN_LIMITED_API py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); if (!py_name) return NULL; PyErr_Format(PyExc_TypeError, "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", py_name, size); Py_DECREF(py_name); #else PyErr_Format(PyExc_TypeError, "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", f->m_ml->ml_name, size); #endif return NULL; } break; case METH_O: if (likely(kw == NULL || PyDict_Size(kw) == 0)) { #if CYTHON_ASSUME_SAFE_MACROS size = PyTuple_GET_SIZE(arg); #else size = PyTuple_Size(arg); if (unlikely(size < 0)) return NULL; #endif if (likely(size == 1)) { PyObject *result, *arg0; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS arg0 = PyTuple_GET_ITEM(arg, 0); #else arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; #endif result = (*meth)(self, arg0); #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) Py_DECREF(arg0); #endif return result; } #if CYTHON_COMPILING_IN_LIMITED_API py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); if (!py_name) return NULL; PyErr_Format(PyExc_TypeError, "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", py_name, size); Py_DECREF(py_name); #else PyErr_Format(PyExc_TypeError, "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", f->m_ml->ml_name, size); #endif return NULL; } break; default: PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); return NULL; } #if CYTHON_COMPILING_IN_LIMITED_API py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); if (!py_name) return NULL; PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", py_name); Py_DECREF(py_name); #else PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", f->m_ml->ml_name); #endif return NULL; } static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *self, *result; #if CYTHON_COMPILING_IN_LIMITED_API self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); if (unlikely(!self) && PyErr_Occurred()) return NULL; #else self = ((PyCFunctionObject*)func)->m_self; #endif result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); return result; } static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { PyObject *result; __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; #if CYTHON_METH_FASTCALL __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); if (vc) { #if CYTHON_ASSUME_SAFE_MACROS return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); #else (void) &__Pyx_PyVectorcall_FastCallDict; return PyVectorcall_Call(func, args, kw); #endif } #endif if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { Py_ssize_t argc; PyObject *new_args; PyObject *self; #if CYTHON_ASSUME_SAFE_MACROS argc = PyTuple_GET_SIZE(args); #else argc = PyTuple_Size(args); if (unlikely(!argc) < 0) return NULL; #endif new_args = PyTuple_GetSlice(args, 1, argc); if (unlikely(!new_args)) return NULL; self = PyTuple_GetItem(args, 0); if (unlikely(!self)) { Py_DECREF(new_args); #if PY_MAJOR_VERSION > 2 PyErr_Format(PyExc_TypeError, "unbound method %.200S() needs an argument", cyfunc->func_qualname); #else PyErr_SetString(PyExc_TypeError, "unbound method needs an argument"); #endif return NULL; } result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); Py_DECREF(new_args); } else { result = __Pyx_CyFunction_Call(func, args, kw); } return result; } #if CYTHON_METH_FASTCALL static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) { int ret = 0; if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { if (unlikely(nargs < 1)) { PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); return -1; } ret = 1; } if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); return -1; } return ret; } static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } if (unlikely(nargs != 0)) { PyErr_Format(PyExc_TypeError, "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", def->ml_name, nargs); return NULL; } return def->ml_meth(self, NULL); } static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } if (unlikely(nargs != 1)) { PyErr_Format(PyExc_TypeError, "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", def->ml_name, nargs); return NULL; } return def->ml_meth(self, args[0]); } static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); } static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); } #endif #if CYTHON_USE_TYPE_SPECS static PyType_Slot __pyx_CyFunctionType_slots[] = { {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, {Py_tp_methods, (void *)__pyx_CyFunction_methods}, {Py_tp_members, (void *)__pyx_CyFunction_members}, {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, {0, 0}, }; static PyType_Spec __pyx_CyFunctionType_spec = { __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", sizeof(__pyx_CyFunctionObject), 0, #ifdef Py_TPFLAGS_METHOD_DESCRIPTOR Py_TPFLAGS_METHOD_DESCRIPTOR | #endif #if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) _Py_TPFLAGS_HAVE_VECTORCALL | #endif Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, __pyx_CyFunctionType_slots }; #else static PyTypeObject __pyx_CyFunctionType_type = { PyVarObject_HEAD_INIT(0, 0) __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", sizeof(__pyx_CyFunctionObject), 0, (destructor) __Pyx_CyFunction_dealloc, #if !CYTHON_METH_FASTCALL 0, #elif CYTHON_BACKPORT_VECTORCALL (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), #else offsetof(PyCFunctionObject, vectorcall), #endif 0, 0, #if PY_MAJOR_VERSION < 3 0, #else 0, #endif (reprfunc) __Pyx_CyFunction_repr, 0, 0, 0, 0, __Pyx_CyFunction_CallAsMethod, 0, 0, 0, 0, #ifdef Py_TPFLAGS_METHOD_DESCRIPTOR Py_TPFLAGS_METHOD_DESCRIPTOR | #endif #if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL _Py_TPFLAGS_HAVE_VECTORCALL | #endif Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, 0, (traverseproc) __Pyx_CyFunction_traverse, (inquiry) __Pyx_CyFunction_clear, 0, #if PY_VERSION_HEX < 0x030500A0 offsetof(__pyx_CyFunctionObject, func_weakreflist), #else offsetof(PyCFunctionObject, m_weakreflist), #endif 0, 0, __pyx_CyFunction_methods, __pyx_CyFunction_members, __pyx_CyFunction_getsets, 0, 0, __Pyx_PyMethod_New, 0, offsetof(__pyx_CyFunctionObject, func_dict), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, #if PY_VERSION_HEX >= 0x030400a1 0, #endif #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, #endif #if __PYX_NEED_TP_PRINT_SLOT 0, #endif #if PY_VERSION_HEX >= 0x030C0000 0, #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 0, #endif }; #endif static int __pyx_CyFunction_init(PyObject *module) { #if CYTHON_USE_TYPE_SPECS __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); #else CYTHON_UNUSED_VAR(module); __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); #endif if (unlikely(__pyx_CyFunctionType == NULL)) { return -1; } return 0; } static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->defaults = PyObject_Malloc(size); if (unlikely(!m->defaults)) return PyErr_NoMemory(); memset(m->defaults, 0, size); m->defaults_pyobjects = pyobjects; m->defaults_size = size; return m->defaults; } static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->defaults_tuple = tuple; Py_INCREF(tuple); } static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->defaults_kwdict = dict; Py_INCREF(dict); } static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->func_annotations = dict; Py_INCREF(dict); } /* CythonFunction */ static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { PyObject *op = __Pyx_CyFunction_Init( PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), ml, flags, qualname, closure, module, globals, code ); if (likely(op)) { PyObject_GC_Track(op); } return op; } /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { PyObject *use_cline; PyObject *ptype, *pvalue, *ptraceback; #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif CYTHON_MAYBE_UNUSED_VAR(tstate); if (unlikely(!__pyx_cython_runtime)) { return c_line; } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); if (likely(cython_runtime_dict)) { __PYX_PY_DICT_LOOKUP_IF_MODIFIED( use_cline, *cython_runtime_dict, __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) } else #endif { PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); if (use_cline_obj) { use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; Py_DECREF(use_cline_obj); } else { PyErr_Clear(); use_cline = NULL; } } if (!use_cline) { c_line = 0; (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); } else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { c_line = 0; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); return c_line; } #endif /* CodeObjectCache */ #if !CYTHON_COMPILING_IN_LIMITED_API static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = start + (end - start) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } #endif /* AddTraceback */ #include "compile.h" #include "frameobject.h" #include "traceback.h" #if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API #ifndef Py_BUILD_CORE #define Py_BUILD_CORE 1 #endif #include "internal/pycore_frame.h" #endif #if CYTHON_COMPILING_IN_LIMITED_API static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, PyObject *firstlineno, PyObject *name) { PyObject *replace = NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; replace = PyObject_GetAttrString(code, "replace"); if (likely(replace)) { PyObject *result; result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); Py_DECREF(replace); return result; } PyErr_Clear(); #if __PYX_LIMITED_VERSION_HEX < 0x030780000 { PyObject *compiled = NULL, *result = NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; compiled = Py_CompileString( "out = type(code)(\n" " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" " code.co_lnotab)\n", "", Py_file_input); if (!compiled) return NULL; result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); Py_DECREF(compiled); if (!result) PyErr_Print(); Py_DECREF(result); result = PyDict_GetItemString(scratch_dict, "out"); if (result) Py_INCREF(result); return result; } #else return NULL; #endif } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; PyObject *replace = NULL, *getframe = NULL, *frame = NULL; PyObject *exc_type, *exc_value, *exc_traceback; int success = 0; if (c_line) { (void) __pyx_cfilenm; (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); } PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); code_object = Py_CompileString("_getframe()", filename, Py_eval_input); if (unlikely(!code_object)) goto bad; py_py_line = PyLong_FromLong(py_line); if (unlikely(!py_py_line)) goto bad; py_funcname = PyUnicode_FromString(funcname); if (unlikely(!py_funcname)) goto bad; dict = PyDict_New(); if (unlikely(!dict)) goto bad; { PyObject *old_code_object = code_object; code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); Py_DECREF(old_code_object); } if (unlikely(!code_object)) goto bad; getframe = PySys_GetObject("_getframe"); if (unlikely(!getframe)) goto bad; if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; frame = PyEval_EvalCode(code_object, dict, dict); if (unlikely(!frame) || frame == Py_None) goto bad; success = 1; bad: PyErr_Restore(exc_type, exc_value, exc_traceback); Py_XDECREF(code_object); Py_XDECREF(py_py_line); Py_XDECREF(py_funcname); Py_XDECREF(dict); Py_XDECREF(replace); if (success) { PyTraceBack_Here( (struct _frame*)frame); } Py_XDECREF(frame); } #else static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = NULL; PyObject *py_funcname = NULL; #if PY_MAJOR_VERSION < 3 PyObject *py_srcfile = NULL; py_srcfile = PyString_FromString(filename); if (!py_srcfile) goto bad; #endif if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); if (!py_funcname) goto bad; #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); if (!py_funcname) goto bad; funcname = PyUnicode_AsUTF8(py_funcname); if (!funcname) goto bad; #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); if (!py_funcname) goto bad; #endif } #if PY_MAJOR_VERSION < 3 py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); #else py_code = PyCode_NewEmpty(filename, funcname, py_line); #endif Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline return py_code; bad: Py_XDECREF(py_funcname); #if PY_MAJOR_VERSION < 3 Py_XDECREF(py_srcfile); #endif return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject *ptype, *pvalue, *ptraceback; if (c_line) { c_line = __Pyx_CLineForTraceback(tstate, c_line); } py_code = __pyx_find_code_object(c_line ? -c_line : py_line); if (!py_code) { __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) { /* If the code object creation fails, then we should clear the fetched exception references and propagate the new exception */ Py_XDECREF(ptype); Py_XDECREF(pvalue); Py_XDECREF(ptraceback); goto bad; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); } py_frame = PyFrame_New( tstate, /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; __Pyx_PyFrame_SetLineNumber(py_frame, py_line); PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } #endif /* CIntFromPyVerify */ #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) #define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) #define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ {\ func_type value = func_value;\ if (sizeof(target_type) < sizeof(func_type)) {\ if (unlikely(value != (func_type) (target_type) value)) {\ func_type zero = 0;\ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ return (target_type) -1;\ if (is_unsigned && unlikely(value < zero))\ goto raise_neg_overflow;\ else\ goto raise_overflow;\ }\ }\ return (target_type) value;\ } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(int) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(int) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(int) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; #if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 return _PyLong_FromByteArray(bytes, sizeof(int), little, !is_unsigned); #else PyObject *from_bytes, *result = NULL; PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); if (!from_bytes) return NULL; py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(int)); if (!py_bytes) goto limited_bad; order_str = PyUnicode_FromString(little ? "little" : "big"); if (!order_str) goto limited_bad; arg_tuple = PyTuple_Pack(2, py_bytes, order_str); if (!arg_tuple) goto limited_bad; if (!is_unsigned) { kwds = PyDict_New(); if (!kwds) goto limited_bad; if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; } result = PyObject_Call(from_bytes, arg_tuple, kwds); limited_bad: Py_XDECREF(kwds); Py_XDECREF(arg_tuple); Py_XDECREF(order_str); Py_XDECREF(py_bytes); Py_XDECREF(from_bytes); return result; #endif } } /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if ((sizeof(int) < sizeof(long))) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS if (unlikely(__Pyx_PyLong_IsNeg(x))) { goto raise_neg_overflow; } else if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_DigitCount(x)) { case 2: if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 3: if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 4: if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; } } #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if ((sizeof(int) <= sizeof(unsigned long))) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_SignedDigitCount(x)) { case -2: if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 2: if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -3: if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 3: if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -4: if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 4: if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; } } #endif if ((sizeof(int) <= sizeof(long))) { __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int ret = -1; #if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); #else PyObject *stepval = NULL, *mask = NULL, *shift = NULL; int bits, remaining_bits, is_negative = 0; long idigit; int chunk_size = (sizeof(long) < 8) ? 30 : 62; if (unlikely(!PyLong_CheckExact(v))) { PyObject *tmp = v; v = PyNumber_Long(v); assert(PyLong_CheckExact(v)); Py_DECREF(tmp); if (unlikely(!v)) return (int) -1; } #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(x) == 0) return (int) 0; is_negative = Py_SIZE(x) < 0; #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; is_negative = result == 1; } #endif if (is_unsigned && unlikely(is_negative)) { goto raise_neg_overflow; } else if (is_negative) { stepval = PyNumber_Invert(v); if (unlikely(!stepval)) return (int) -1; } else { stepval = __Pyx_NewRef(v); } val = (int) 0; mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { PyObject *tmp, *digit; digit = PyNumber_And(stepval, mask); if (unlikely(!digit)) goto done; idigit = PyLong_AsLong(digit); Py_DECREF(digit); if (unlikely(idigit < 0)) goto done; tmp = PyNumber_Rshift(stepval, shift); if (unlikely(!tmp)) goto done; Py_DECREF(stepval); stepval = tmp; val |= ((int) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(stepval) == 0) goto unpacking_done; #endif } idigit = PyLong_AsLong(stepval); if (unlikely(idigit < 0)) goto done; remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); if (unlikely(idigit >= (1L << remaining_bits))) goto raise_overflow; val |= ((int) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 unpacking_done: #endif if (!is_unsigned) { if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) goto raise_overflow; if (is_negative) val = ~val; } ret = 0; done: Py_XDECREF(shift); Py_XDECREF(mask); Py_XDECREF(stepval); #endif Py_DECREF(v); if (likely(!ret)) return val; } return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } /* CIntFromPy */ static CYTHON_INLINE enum llhttp_method __Pyx_PyInt_As_enum__llhttp_method(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const enum llhttp_method neg_one = (enum llhttp_method) -1, const_zero = (enum llhttp_method) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if ((sizeof(enum llhttp_method) < sizeof(long))) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (enum llhttp_method) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS if (unlikely(__Pyx_PyLong_IsNeg(x))) { goto raise_neg_overflow; } else if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_DigitCount(x)) { case 2: if ((8 * sizeof(enum llhttp_method) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(enum llhttp_method) >= 2 * PyLong_SHIFT)) { return (enum llhttp_method) (((((enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0])); } } break; case 3: if ((8 * sizeof(enum llhttp_method) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(enum llhttp_method) >= 3 * PyLong_SHIFT)) { return (enum llhttp_method) (((((((enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0])); } } break; case 4: if ((8 * sizeof(enum llhttp_method) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(enum llhttp_method) >= 4 * PyLong_SHIFT)) { return (enum llhttp_method) (((((((((enum llhttp_method)digits[3]) << PyLong_SHIFT) | (enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0])); } } break; } } #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (enum llhttp_method) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if ((sizeof(enum llhttp_method) <= sizeof(unsigned long))) { __PYX_VERIFY_RETURN_INT_EXC(enum llhttp_method, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(enum llhttp_method) <= sizeof(unsigned PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(enum llhttp_method, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_SignedDigitCount(x)) { case -2: if ((8 * sizeof(enum llhttp_method) - 1 > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(enum llhttp_method) - 1 > 2 * PyLong_SHIFT)) { return (enum llhttp_method) (((enum llhttp_method)-1)*(((((enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); } } break; case 2: if ((8 * sizeof(enum llhttp_method) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(enum llhttp_method) - 1 > 2 * PyLong_SHIFT)) { return (enum llhttp_method) ((((((enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); } } break; case -3: if ((8 * sizeof(enum llhttp_method) - 1 > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(enum llhttp_method) - 1 > 3 * PyLong_SHIFT)) { return (enum llhttp_method) (((enum llhttp_method)-1)*(((((((enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); } } break; case 3: if ((8 * sizeof(enum llhttp_method) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(enum llhttp_method) - 1 > 3 * PyLong_SHIFT)) { return (enum llhttp_method) ((((((((enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); } } break; case -4: if ((8 * sizeof(enum llhttp_method) - 1 > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(enum llhttp_method) - 1 > 4 * PyLong_SHIFT)) { return (enum llhttp_method) (((enum llhttp_method)-1)*(((((((((enum llhttp_method)digits[3]) << PyLong_SHIFT) | (enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); } } break; case 4: if ((8 * sizeof(enum llhttp_method) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(enum llhttp_method) - 1 > 4 * PyLong_SHIFT)) { return (enum llhttp_method) ((((((((((enum llhttp_method)digits[3]) << PyLong_SHIFT) | (enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); } } break; } } #endif if ((sizeof(enum llhttp_method) <= sizeof(long))) { __PYX_VERIFY_RETURN_INT_EXC(enum llhttp_method, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(enum llhttp_method) <= sizeof(PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(enum llhttp_method, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available, cannot convert large enums"); return (enum llhttp_method) -1; } else { enum llhttp_method val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (enum llhttp_method) -1; val = __Pyx_PyInt_As_enum__llhttp_method(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to enum llhttp_method"); return (enum llhttp_method) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to enum llhttp_method"); return (enum llhttp_method) -1; } /* CIntFromPy */ static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const size_t neg_one = (size_t) -1, const_zero = (size_t) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if ((sizeof(size_t) < sizeof(long))) { __PYX_VERIFY_RETURN_INT(size_t, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (size_t) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS if (unlikely(__Pyx_PyLong_IsNeg(x))) { goto raise_neg_overflow; } else if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(size_t, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_DigitCount(x)) { case 2: if ((8 * sizeof(size_t) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(size_t) >= 2 * PyLong_SHIFT)) { return (size_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } } break; case 3: if ((8 * sizeof(size_t) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(size_t) >= 3 * PyLong_SHIFT)) { return (size_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } } break; case 4: if ((8 * sizeof(size_t) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(size_t) >= 4 * PyLong_SHIFT)) { return (size_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } } break; } } #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (size_t) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if ((sizeof(size_t) <= sizeof(unsigned long))) { __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(size_t) <= sizeof(unsigned PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(size_t, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_SignedDigitCount(x)) { case -2: if ((8 * sizeof(size_t) - 1 > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT)) { return (size_t) (((size_t)-1)*(((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; case 2: if ((8 * sizeof(size_t) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT)) { return (size_t) ((((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; case -3: if ((8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT)) { return (size_t) (((size_t)-1)*(((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; case 3: if ((8 * sizeof(size_t) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT)) { return (size_t) ((((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; case -4: if ((8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT)) { return (size_t) (((size_t)-1)*(((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; case 4: if ((8 * sizeof(size_t) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT)) { return (size_t) ((((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; } } #endif if ((sizeof(size_t) <= sizeof(long))) { __PYX_VERIFY_RETURN_INT_EXC(size_t, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(size_t) <= sizeof(PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(size_t, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { size_t val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int ret = -1; #if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); #else PyObject *stepval = NULL, *mask = NULL, *shift = NULL; int bits, remaining_bits, is_negative = 0; long idigit; int chunk_size = (sizeof(long) < 8) ? 30 : 62; if (unlikely(!PyLong_CheckExact(v))) { PyObject *tmp = v; v = PyNumber_Long(v); assert(PyLong_CheckExact(v)); Py_DECREF(tmp); if (unlikely(!v)) return (size_t) -1; } #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(x) == 0) return (size_t) 0; is_negative = Py_SIZE(x) < 0; #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (size_t) -1; is_negative = result == 1; } #endif if (is_unsigned && unlikely(is_negative)) { goto raise_neg_overflow; } else if (is_negative) { stepval = PyNumber_Invert(v); if (unlikely(!stepval)) return (size_t) -1; } else { stepval = __Pyx_NewRef(v); } val = (size_t) 0; mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; for (bits = 0; bits < (int) sizeof(size_t) * 8 - chunk_size; bits += chunk_size) { PyObject *tmp, *digit; digit = PyNumber_And(stepval, mask); if (unlikely(!digit)) goto done; idigit = PyLong_AsLong(digit); Py_DECREF(digit); if (unlikely(idigit < 0)) goto done; tmp = PyNumber_Rshift(stepval, shift); if (unlikely(!tmp)) goto done; Py_DECREF(stepval); stepval = tmp; val |= ((size_t) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(stepval) == 0) goto unpacking_done; #endif } idigit = PyLong_AsLong(stepval); if (unlikely(idigit < 0)) goto done; remaining_bits = ((int) sizeof(size_t) * 8) - bits - (is_unsigned ? 0 : 1); if (unlikely(idigit >= (1L << remaining_bits))) goto raise_overflow; val |= ((size_t) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 unpacking_done: #endif if (!is_unsigned) { if (unlikely(val & (((size_t) 1) << (sizeof(size_t) * 8 - 1)))) goto raise_overflow; if (is_negative) val = ~val; } ret = 0; done: Py_XDECREF(shift); Py_XDECREF(mask); Py_XDECREF(stepval); #endif Py_DECREF(v); if (likely(!ret)) return val; } return (size_t) -1; } } else { size_t val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (size_t) -1; val = __Pyx_PyInt_As_size_t(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to size_t"); return (size_t) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to size_t"); return (size_t) -1; } /* CIntFromPy */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if ((sizeof(long) < sizeof(long))) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS if (unlikely(__Pyx_PyLong_IsNeg(x))) { goto raise_neg_overflow; } else if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_DigitCount(x)) { case 2: if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 3: if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 4: if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; } } #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if ((sizeof(long) <= sizeof(unsigned long))) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_SignedDigitCount(x)) { case -2: if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 2: if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -3: if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 3: if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -4: if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 4: if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; } } #endif if ((sizeof(long) <= sizeof(long))) { __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { long val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int ret = -1; #if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); #else PyObject *stepval = NULL, *mask = NULL, *shift = NULL; int bits, remaining_bits, is_negative = 0; long idigit; int chunk_size = (sizeof(long) < 8) ? 30 : 62; if (unlikely(!PyLong_CheckExact(v))) { PyObject *tmp = v; v = PyNumber_Long(v); assert(PyLong_CheckExact(v)); Py_DECREF(tmp); if (unlikely(!v)) return (long) -1; } #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(x) == 0) return (long) 0; is_negative = Py_SIZE(x) < 0; #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; is_negative = result == 1; } #endif if (is_unsigned && unlikely(is_negative)) { goto raise_neg_overflow; } else if (is_negative) { stepval = PyNumber_Invert(v); if (unlikely(!stepval)) return (long) -1; } else { stepval = __Pyx_NewRef(v); } val = (long) 0; mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { PyObject *tmp, *digit; digit = PyNumber_And(stepval, mask); if (unlikely(!digit)) goto done; idigit = PyLong_AsLong(digit); Py_DECREF(digit); if (unlikely(idigit < 0)) goto done; tmp = PyNumber_Rshift(stepval, shift); if (unlikely(!tmp)) goto done; Py_DECREF(stepval); stepval = tmp; val |= ((long) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(stepval) == 0) goto unpacking_done; #endif } idigit = PyLong_AsLong(stepval); if (unlikely(idigit < 0)) goto done; remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); if (unlikely(idigit >= (1L << remaining_bits))) goto raise_overflow; val |= ((long) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 unpacking_done: #endif if (!is_unsigned) { if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) goto raise_overflow; if (is_negative) val = ~val; } ret = 0; done: Py_XDECREF(shift); Py_XDECREF(mask); Py_XDECREF(stepval); #endif Py_DECREF(v); if (likely(!ret)) return val; } return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint8_t(uint8_t value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const uint8_t neg_one = (uint8_t) -1, const_zero = (uint8_t) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(uint8_t) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(uint8_t) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(uint8_t) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(uint8_t) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(uint8_t) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; #if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 return _PyLong_FromByteArray(bytes, sizeof(uint8_t), little, !is_unsigned); #else PyObject *from_bytes, *result = NULL; PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); if (!from_bytes) return NULL; py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(uint8_t)); if (!py_bytes) goto limited_bad; order_str = PyUnicode_FromString(little ? "little" : "big"); if (!order_str) goto limited_bad; arg_tuple = PyTuple_Pack(2, py_bytes, order_str); if (!arg_tuple) goto limited_bad; if (!is_unsigned) { kwds = PyDict_New(); if (!kwds) goto limited_bad; if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; } result = PyObject_Call(from_bytes, arg_tuple, kwds); limited_bad: Py_XDECREF(kwds); Py_XDECREF(arg_tuple); Py_XDECREF(order_str); Py_XDECREF(py_bytes); Py_XDECREF(from_bytes); return result; #endif } } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; #if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); #else PyObject *from_bytes, *result = NULL; PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); if (!from_bytes) return NULL; py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); if (!py_bytes) goto limited_bad; order_str = PyUnicode_FromString(little ? "little" : "big"); if (!order_str) goto limited_bad; arg_tuple = PyTuple_Pack(2, py_bytes, order_str); if (!arg_tuple) goto limited_bad; if (!is_unsigned) { kwds = PyDict_New(); if (!kwds) goto limited_bad; if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; } result = PyObject_Call(from_bytes, arg_tuple, kwds); limited_bad: Py_XDECREF(kwds); Py_XDECREF(arg_tuple); Py_XDECREF(order_str); Py_XDECREF(py_bytes); Py_XDECREF(from_bytes); return result; #endif } } /* FormatTypeName */ #if CYTHON_COMPILING_IN_LIMITED_API static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp) { PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, __pyx_n_s_name); if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { PyErr_Clear(); Py_XDECREF(name); name = __Pyx_NewRef(__pyx_n_s__9); } return name; } #endif /* FastTypeChecks */ #if CYTHON_COMPILING_IN_CPYTHON static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { while (a) { a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); if (a == b) return 1; } return b == &PyBaseObject_Type; } static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (a == b) return 1; mro = a->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(a, b); } static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (cls == a || cls == b) return 1; mro = cls->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { PyObject *base = PyTuple_GET_ITEM(mro, i); if (base == (PyObject *)a || base == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); } #if PY_MAJOR_VERSION == 2 static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { PyObject *exception, *value, *tb; int res; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&exception, &value, &tb); res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } if (!res) { res = PyObject_IsSubclass(err, exc_type2); if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } } __Pyx_ErrRestore(exception, value, tb); return res; } #else static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { if (exc_type1) { return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); } else { return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); } } #endif static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; assert(PyExceptionClass_Check(exc_type)); n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; i= 0x030C00A2) static PyObject* __Pyx__PyObject_CallMethod1(PyObject* method, PyObject* arg) { PyObject *result = __Pyx_PyObject_CallOneArg(method, arg); Py_DECREF(method); return result; } #endif static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) { #if CYTHON_VECTORCALL && __PYX_LIMITED_VERSION_HEX >= 0x030C00A2 PyObject *args[2] = {obj, arg}; (void) __Pyx_PyObject_GetMethod; (void) __Pyx_PyObject_CallOneArg; (void) __Pyx_PyObject_Call2Args; return PyObject_VectorcallMethod(method_name, args, 2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); #else PyObject *method = NULL, *result; int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); if (likely(is_method)) { result = __Pyx_PyObject_Call2Args(method, obj, arg); Py_DECREF(method); return result; } if (unlikely(!method)) return NULL; return __Pyx__PyObject_CallMethod1(method, arg); #endif } /* CoroutineBase */ #include #if PY_VERSION_HEX >= 0x030b00a6 #ifndef Py_BUILD_CORE #define Py_BUILD_CORE 1 #endif #include "internal/pycore_frame.h" #endif #define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom) static int __Pyx_PyGen__FetchStopIterationValue(PyThreadState *__pyx_tstate, PyObject **pvalue) { PyObject *et, *ev, *tb; PyObject *value = NULL; CYTHON_UNUSED_VAR(__pyx_tstate); __Pyx_ErrFetch(&et, &ev, &tb); if (!et) { Py_XDECREF(tb); Py_XDECREF(ev); Py_INCREF(Py_None); *pvalue = Py_None; return 0; } if (likely(et == PyExc_StopIteration)) { if (!ev) { Py_INCREF(Py_None); value = Py_None; } #if PY_VERSION_HEX >= 0x030300A0 else if (likely(__Pyx_IS_TYPE(ev, (PyTypeObject*)PyExc_StopIteration))) { value = ((PyStopIterationObject *)ev)->value; Py_INCREF(value); Py_DECREF(ev); } #endif else if (unlikely(PyTuple_Check(ev))) { if (PyTuple_GET_SIZE(ev) >= 1) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS value = PyTuple_GET_ITEM(ev, 0); Py_INCREF(value); #else value = PySequence_ITEM(ev, 0); #endif } else { Py_INCREF(Py_None); value = Py_None; } Py_DECREF(ev); } else if (!__Pyx_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration)) { value = ev; } if (likely(value)) { Py_XDECREF(tb); Py_DECREF(et); *pvalue = value; return 0; } } else if (!__Pyx_PyErr_GivenExceptionMatches(et, PyExc_StopIteration)) { __Pyx_ErrRestore(et, ev, tb); return -1; } PyErr_NormalizeException(&et, &ev, &tb); if (unlikely(!PyObject_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration))) { __Pyx_ErrRestore(et, ev, tb); return -1; } Py_XDECREF(tb); Py_DECREF(et); #if PY_VERSION_HEX >= 0x030300A0 value = ((PyStopIterationObject *)ev)->value; Py_INCREF(value); Py_DECREF(ev); #else { PyObject* args = __Pyx_PyObject_GetAttrStr(ev, __pyx_n_s_args); Py_DECREF(ev); if (likely(args)) { value = PySequence_GetItem(args, 0); Py_DECREF(args); } if (unlikely(!value)) { __Pyx_ErrRestore(NULL, NULL, NULL); Py_INCREF(Py_None); value = Py_None; } } #endif *pvalue = value; return 0; } static CYTHON_INLINE void __Pyx_Coroutine_ExceptionClear(__Pyx_ExcInfoStruct *exc_state) { #if PY_VERSION_HEX >= 0x030B00a4 Py_CLEAR(exc_state->exc_value); #else PyObject *t, *v, *tb; t = exc_state->exc_type; v = exc_state->exc_value; tb = exc_state->exc_traceback; exc_state->exc_type = NULL; exc_state->exc_value = NULL; exc_state->exc_traceback = NULL; Py_XDECREF(t); Py_XDECREF(v); Py_XDECREF(tb); #endif } #define __Pyx_Coroutine_AlreadyRunningError(gen) (__Pyx__Coroutine_AlreadyRunningError(gen), (PyObject*)NULL) static void __Pyx__Coroutine_AlreadyRunningError(__pyx_CoroutineObject *gen) { const char *msg; CYTHON_MAYBE_UNUSED_VAR(gen); if ((0)) { #ifdef __Pyx_Coroutine_USED } else if (__Pyx_Coroutine_Check((PyObject*)gen)) { msg = "coroutine already executing"; #endif #ifdef __Pyx_AsyncGen_USED } else if (__Pyx_AsyncGen_CheckExact((PyObject*)gen)) { msg = "async generator already executing"; #endif } else { msg = "generator already executing"; } PyErr_SetString(PyExc_ValueError, msg); } #define __Pyx_Coroutine_NotStartedError(gen) (__Pyx__Coroutine_NotStartedError(gen), (PyObject*)NULL) static void __Pyx__Coroutine_NotStartedError(PyObject *gen) { const char *msg; CYTHON_MAYBE_UNUSED_VAR(gen); if ((0)) { #ifdef __Pyx_Coroutine_USED } else if (__Pyx_Coroutine_Check(gen)) { msg = "can't send non-None value to a just-started coroutine"; #endif #ifdef __Pyx_AsyncGen_USED } else if (__Pyx_AsyncGen_CheckExact(gen)) { msg = "can't send non-None value to a just-started async generator"; #endif } else { msg = "can't send non-None value to a just-started generator"; } PyErr_SetString(PyExc_TypeError, msg); } #define __Pyx_Coroutine_AlreadyTerminatedError(gen, value, closing) (__Pyx__Coroutine_AlreadyTerminatedError(gen, value, closing), (PyObject*)NULL) static void __Pyx__Coroutine_AlreadyTerminatedError(PyObject *gen, PyObject *value, int closing) { CYTHON_MAYBE_UNUSED_VAR(gen); CYTHON_MAYBE_UNUSED_VAR(closing); #ifdef __Pyx_Coroutine_USED if (!closing && __Pyx_Coroutine_Check(gen)) { PyErr_SetString(PyExc_RuntimeError, "cannot reuse already awaited coroutine"); } else #endif if (value) { #ifdef __Pyx_AsyncGen_USED if (__Pyx_AsyncGen_CheckExact(gen)) PyErr_SetNone(__Pyx_PyExc_StopAsyncIteration); else #endif PyErr_SetNone(PyExc_StopIteration); } } static PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value, int closing) { __Pyx_PyThreadState_declare PyThreadState *tstate; __Pyx_ExcInfoStruct *exc_state; PyObject *retval; assert(!self->is_running); if (unlikely(self->resume_label == 0)) { if (unlikely(value && value != Py_None)) { return __Pyx_Coroutine_NotStartedError((PyObject*)self); } } if (unlikely(self->resume_label == -1)) { return __Pyx_Coroutine_AlreadyTerminatedError((PyObject*)self, value, closing); } #if CYTHON_FAST_THREAD_STATE __Pyx_PyThreadState_assign tstate = __pyx_tstate; #else tstate = __Pyx_PyThreadState_Current; #endif exc_state = &self->gi_exc_state; if (exc_state->exc_value) { #if CYTHON_COMPILING_IN_PYPY #else PyObject *exc_tb; #if PY_VERSION_HEX >= 0x030B00a4 && !CYTHON_COMPILING_IN_CPYTHON exc_tb = PyException_GetTraceback(exc_state->exc_value); #elif PY_VERSION_HEX >= 0x030B00a4 exc_tb = ((PyBaseExceptionObject*) exc_state->exc_value)->traceback; #else exc_tb = exc_state->exc_traceback; #endif if (exc_tb) { PyTracebackObject *tb = (PyTracebackObject *) exc_tb; PyFrameObject *f = tb->tb_frame; assert(f->f_back == NULL); #if PY_VERSION_HEX >= 0x030B00A1 f->f_back = PyThreadState_GetFrame(tstate); #else Py_XINCREF(tstate->frame); f->f_back = tstate->frame; #endif #if PY_VERSION_HEX >= 0x030B00a4 && !CYTHON_COMPILING_IN_CPYTHON Py_DECREF(exc_tb); #endif } #endif } #if CYTHON_USE_EXC_INFO_STACK exc_state->previous_item = tstate->exc_info; tstate->exc_info = exc_state; #else if (exc_state->exc_type) { __Pyx_ExceptionSwap(&exc_state->exc_type, &exc_state->exc_value, &exc_state->exc_traceback); } else { __Pyx_Coroutine_ExceptionClear(exc_state); __Pyx_ExceptionSave(&exc_state->exc_type, &exc_state->exc_value, &exc_state->exc_traceback); } #endif self->is_running = 1; retval = self->body(self, tstate, value); self->is_running = 0; #if CYTHON_USE_EXC_INFO_STACK exc_state = &self->gi_exc_state; tstate->exc_info = exc_state->previous_item; exc_state->previous_item = NULL; __Pyx_Coroutine_ResetFrameBackpointer(exc_state); #endif return retval; } static CYTHON_INLINE void __Pyx_Coroutine_ResetFrameBackpointer(__Pyx_ExcInfoStruct *exc_state) { #if CYTHON_COMPILING_IN_PYPY CYTHON_UNUSED_VAR(exc_state); #else PyObject *exc_tb; #if PY_VERSION_HEX >= 0x030B00a4 if (!exc_state->exc_value) return; exc_tb = PyException_GetTraceback(exc_state->exc_value); #else exc_tb = exc_state->exc_traceback; #endif if (likely(exc_tb)) { PyTracebackObject *tb = (PyTracebackObject *) exc_tb; PyFrameObject *f = tb->tb_frame; Py_CLEAR(f->f_back); #if PY_VERSION_HEX >= 0x030B00a4 Py_DECREF(exc_tb); #endif } #endif } static CYTHON_INLINE PyObject *__Pyx_Coroutine_MethodReturn(PyObject* gen, PyObject *retval) { CYTHON_MAYBE_UNUSED_VAR(gen); if (unlikely(!retval)) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign if (!__Pyx_PyErr_Occurred()) { PyObject *exc = PyExc_StopIteration; #ifdef __Pyx_AsyncGen_USED if (__Pyx_AsyncGen_CheckExact(gen)) exc = __Pyx_PyExc_StopAsyncIteration; #endif __Pyx_PyErr_SetNone(exc); } } return retval; } #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) static CYTHON_INLINE PyObject *__Pyx_PyGen_Send(PyGenObject *gen, PyObject *arg) { #if PY_VERSION_HEX <= 0x030A00A1 return _PyGen_Send(gen, arg); #else PyObject *result; if (PyIter_Send((PyObject*)gen, arg ? arg : Py_None, &result) == PYGEN_RETURN) { if (PyAsyncGen_CheckExact(gen)) { assert(result == Py_None); PyErr_SetNone(PyExc_StopAsyncIteration); } else if (result == Py_None) { PyErr_SetNone(PyExc_StopIteration); } else { #if PY_VERSION_HEX < 0x030d00A1 _PyGen_SetStopIterationValue(result); #else if (!PyTuple_Check(result) && !PyExceptionInstance_Check(result)) { PyErr_SetObject(PyExc_StopIteration, result); } else { PyObject *exc = __Pyx_PyObject_CallOneArg(PyExc_StopIteration, result); if (likely(exc != NULL)) { PyErr_SetObject(PyExc_StopIteration, exc); Py_DECREF(exc); } } #endif } Py_DECREF(result); result = NULL; } return result; #endif } #endif static CYTHON_INLINE PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) { PyObject *ret; PyObject *val = NULL; __Pyx_Coroutine_Undelegate(gen); __Pyx_PyGen__FetchStopIterationValue(__Pyx_PyThreadState_Current, &val); ret = __Pyx_Coroutine_SendEx(gen, val, 0); Py_XDECREF(val); return ret; } static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) { PyObject *retval; __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self; PyObject *yf = gen->yieldfrom; if (unlikely(gen->is_running)) return __Pyx_Coroutine_AlreadyRunningError(gen); if (yf) { PyObject *ret; gen->is_running = 1; #ifdef __Pyx_Generator_USED if (__Pyx_Generator_CheckExact(yf)) { ret = __Pyx_Coroutine_Send(yf, value); } else #endif #ifdef __Pyx_Coroutine_USED if (__Pyx_Coroutine_Check(yf)) { ret = __Pyx_Coroutine_Send(yf, value); } else #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_PyAsyncGenASend_CheckExact(yf)) { ret = __Pyx_async_gen_asend_send(yf, value); } else #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) if (PyGen_CheckExact(yf)) { ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); } else #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03050000 && defined(PyCoro_CheckExact) && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) if (PyCoro_CheckExact(yf)) { ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); } else #endif { if (value == Py_None) ret = __Pyx_PyObject_GetIterNextFunc(yf)(yf); else ret = __Pyx_PyObject_CallMethod1(yf, __pyx_n_s_send, value); } gen->is_running = 0; if (likely(ret)) { return ret; } retval = __Pyx_Coroutine_FinishDelegation(gen); } else { retval = __Pyx_Coroutine_SendEx(gen, value, 0); } return __Pyx_Coroutine_MethodReturn(self, retval); } static int __Pyx_Coroutine_CloseIter(__pyx_CoroutineObject *gen, PyObject *yf) { PyObject *retval = NULL; int err = 0; #ifdef __Pyx_Generator_USED if (__Pyx_Generator_CheckExact(yf)) { retval = __Pyx_Coroutine_Close(yf); if (!retval) return -1; } else #endif #ifdef __Pyx_Coroutine_USED if (__Pyx_Coroutine_Check(yf)) { retval = __Pyx_Coroutine_Close(yf); if (!retval) return -1; } else if (__Pyx_CoroutineAwait_CheckExact(yf)) { retval = __Pyx_CoroutineAwait_Close((__pyx_CoroutineAwaitObject*)yf, NULL); if (!retval) return -1; } else #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_PyAsyncGenASend_CheckExact(yf)) { retval = __Pyx_async_gen_asend_close(yf, NULL); } else if (__pyx_PyAsyncGenAThrow_CheckExact(yf)) { retval = __Pyx_async_gen_athrow_close(yf, NULL); } else #endif { PyObject *meth; gen->is_running = 1; meth = __Pyx_PyObject_GetAttrStrNoError(yf, __pyx_n_s_close); if (unlikely(!meth)) { if (unlikely(PyErr_Occurred())) { PyErr_WriteUnraisable(yf); } } else { retval = __Pyx_PyObject_CallNoArg(meth); Py_DECREF(meth); if (unlikely(!retval)) err = -1; } gen->is_running = 0; } Py_XDECREF(retval); return err; } static PyObject *__Pyx_Generator_Next(PyObject *self) { __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self; PyObject *yf = gen->yieldfrom; if (unlikely(gen->is_running)) return __Pyx_Coroutine_AlreadyRunningError(gen); if (yf) { PyObject *ret; gen->is_running = 1; #ifdef __Pyx_Generator_USED if (__Pyx_Generator_CheckExact(yf)) { ret = __Pyx_Generator_Next(yf); } else #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) if (PyGen_CheckExact(yf)) { ret = __Pyx_PyGen_Send((PyGenObject*)yf, NULL); } else #endif #ifdef __Pyx_Coroutine_USED if (__Pyx_Coroutine_Check(yf)) { ret = __Pyx_Coroutine_Send(yf, Py_None); } else #endif ret = __Pyx_PyObject_GetIterNextFunc(yf)(yf); gen->is_running = 0; if (likely(ret)) { return ret; } return __Pyx_Coroutine_FinishDelegation(gen); } return __Pyx_Coroutine_SendEx(gen, Py_None, 0); } static PyObject *__Pyx_Coroutine_Close_Method(PyObject *self, PyObject *arg) { CYTHON_UNUSED_VAR(arg); return __Pyx_Coroutine_Close(self); } static PyObject *__Pyx_Coroutine_Close(PyObject *self) { __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; PyObject *retval, *raised_exception; PyObject *yf = gen->yieldfrom; int err = 0; if (unlikely(gen->is_running)) return __Pyx_Coroutine_AlreadyRunningError(gen); if (yf) { Py_INCREF(yf); err = __Pyx_Coroutine_CloseIter(gen, yf); __Pyx_Coroutine_Undelegate(gen); Py_DECREF(yf); } if (err == 0) PyErr_SetNone(PyExc_GeneratorExit); retval = __Pyx_Coroutine_SendEx(gen, NULL, 1); if (unlikely(retval)) { const char *msg; Py_DECREF(retval); if ((0)) { #ifdef __Pyx_Coroutine_USED } else if (__Pyx_Coroutine_Check(self)) { msg = "coroutine ignored GeneratorExit"; #endif #ifdef __Pyx_AsyncGen_USED } else if (__Pyx_AsyncGen_CheckExact(self)) { #if PY_VERSION_HEX < 0x03060000 msg = "async generator ignored GeneratorExit - might require Python 3.6+ finalisation (PEP 525)"; #else msg = "async generator ignored GeneratorExit"; #endif #endif } else { msg = "generator ignored GeneratorExit"; } PyErr_SetString(PyExc_RuntimeError, msg); return NULL; } raised_exception = PyErr_Occurred(); if (likely(!raised_exception || __Pyx_PyErr_GivenExceptionMatches2(raised_exception, PyExc_GeneratorExit, PyExc_StopIteration))) { if (raised_exception) PyErr_Clear(); Py_INCREF(Py_None); return Py_None; } return NULL; } static PyObject *__Pyx__Coroutine_Throw(PyObject *self, PyObject *typ, PyObject *val, PyObject *tb, PyObject *args, int close_on_genexit) { __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; PyObject *yf = gen->yieldfrom; if (unlikely(gen->is_running)) return __Pyx_Coroutine_AlreadyRunningError(gen); if (yf) { PyObject *ret; Py_INCREF(yf); if (__Pyx_PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit) && close_on_genexit) { int err = __Pyx_Coroutine_CloseIter(gen, yf); Py_DECREF(yf); __Pyx_Coroutine_Undelegate(gen); if (err < 0) return __Pyx_Coroutine_MethodReturn(self, __Pyx_Coroutine_SendEx(gen, NULL, 0)); goto throw_here; } gen->is_running = 1; if (0 #ifdef __Pyx_Generator_USED || __Pyx_Generator_CheckExact(yf) #endif #ifdef __Pyx_Coroutine_USED || __Pyx_Coroutine_Check(yf) #endif ) { ret = __Pyx__Coroutine_Throw(yf, typ, val, tb, args, close_on_genexit); #ifdef __Pyx_Coroutine_USED } else if (__Pyx_CoroutineAwait_CheckExact(yf)) { ret = __Pyx__Coroutine_Throw(((__pyx_CoroutineAwaitObject*)yf)->coroutine, typ, val, tb, args, close_on_genexit); #endif } else { PyObject *meth = __Pyx_PyObject_GetAttrStrNoError(yf, __pyx_n_s_throw); if (unlikely(!meth)) { Py_DECREF(yf); if (unlikely(PyErr_Occurred())) { gen->is_running = 0; return NULL; } __Pyx_Coroutine_Undelegate(gen); gen->is_running = 0; goto throw_here; } if (likely(args)) { ret = __Pyx_PyObject_Call(meth, args, NULL); } else { PyObject *cargs[4] = {NULL, typ, val, tb}; ret = __Pyx_PyObject_FastCall(meth, cargs+1, 3 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); } Py_DECREF(meth); } gen->is_running = 0; Py_DECREF(yf); if (!ret) { ret = __Pyx_Coroutine_FinishDelegation(gen); } return __Pyx_Coroutine_MethodReturn(self, ret); } throw_here: __Pyx_Raise(typ, val, tb, NULL); return __Pyx_Coroutine_MethodReturn(self, __Pyx_Coroutine_SendEx(gen, NULL, 0)); } static PyObject *__Pyx_Coroutine_Throw(PyObject *self, PyObject *args) { PyObject *typ; PyObject *val = NULL; PyObject *tb = NULL; if (unlikely(!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb))) return NULL; return __Pyx__Coroutine_Throw(self, typ, val, tb, args, 1); } static CYTHON_INLINE int __Pyx_Coroutine_traverse_excstate(__Pyx_ExcInfoStruct *exc_state, visitproc visit, void *arg) { #if PY_VERSION_HEX >= 0x030B00a4 Py_VISIT(exc_state->exc_value); #else Py_VISIT(exc_state->exc_type); Py_VISIT(exc_state->exc_value); Py_VISIT(exc_state->exc_traceback); #endif return 0; } static int __Pyx_Coroutine_traverse(__pyx_CoroutineObject *gen, visitproc visit, void *arg) { Py_VISIT(gen->closure); Py_VISIT(gen->classobj); Py_VISIT(gen->yieldfrom); return __Pyx_Coroutine_traverse_excstate(&gen->gi_exc_state, visit, arg); } static int __Pyx_Coroutine_clear(PyObject *self) { __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; Py_CLEAR(gen->closure); Py_CLEAR(gen->classobj); Py_CLEAR(gen->yieldfrom); __Pyx_Coroutine_ExceptionClear(&gen->gi_exc_state); #ifdef __Pyx_AsyncGen_USED if (__Pyx_AsyncGen_CheckExact(self)) { Py_CLEAR(((__pyx_PyAsyncGenObject*)gen)->ag_finalizer); } #endif Py_CLEAR(gen->gi_code); Py_CLEAR(gen->gi_frame); Py_CLEAR(gen->gi_name); Py_CLEAR(gen->gi_qualname); Py_CLEAR(gen->gi_modulename); return 0; } static void __Pyx_Coroutine_dealloc(PyObject *self) { __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; PyObject_GC_UnTrack(gen); if (gen->gi_weakreflist != NULL) PyObject_ClearWeakRefs(self); if (gen->resume_label >= 0) { PyObject_GC_Track(self); #if PY_VERSION_HEX >= 0x030400a1 && CYTHON_USE_TP_FINALIZE if (unlikely(PyObject_CallFinalizerFromDealloc(self))) #else Py_TYPE(gen)->tp_del(self); if (unlikely(Py_REFCNT(self) > 0)) #endif { return; } PyObject_GC_UnTrack(self); } #ifdef __Pyx_AsyncGen_USED if (__Pyx_AsyncGen_CheckExact(self)) { /* We have to handle this case for asynchronous generators right here, because this code has to be between UNTRACK and GC_Del. */ Py_CLEAR(((__pyx_PyAsyncGenObject*)self)->ag_finalizer); } #endif __Pyx_Coroutine_clear(self); __Pyx_PyHeapTypeObject_GC_Del(gen); } static void __Pyx_Coroutine_del(PyObject *self) { PyObject *error_type, *error_value, *error_traceback; __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; __Pyx_PyThreadState_declare if (gen->resume_label < 0) { return; } #if !CYTHON_USE_TP_FINALIZE assert(self->ob_refcnt == 0); __Pyx_SET_REFCNT(self, 1); #endif __Pyx_PyThreadState_assign __Pyx_ErrFetch(&error_type, &error_value, &error_traceback); #ifdef __Pyx_AsyncGen_USED if (__Pyx_AsyncGen_CheckExact(self)) { __pyx_PyAsyncGenObject *agen = (__pyx_PyAsyncGenObject*)self; PyObject *finalizer = agen->ag_finalizer; if (finalizer && !agen->ag_closed) { PyObject *res = __Pyx_PyObject_CallOneArg(finalizer, self); if (unlikely(!res)) { PyErr_WriteUnraisable(self); } else { Py_DECREF(res); } __Pyx_ErrRestore(error_type, error_value, error_traceback); return; } } #endif if (unlikely(gen->resume_label == 0 && !error_value)) { #ifdef __Pyx_Coroutine_USED #ifdef __Pyx_Generator_USED if (!__Pyx_Generator_CheckExact(self)) #endif { PyObject_GC_UnTrack(self); #if PY_MAJOR_VERSION >= 3 || defined(PyErr_WarnFormat) if (unlikely(PyErr_WarnFormat(PyExc_RuntimeWarning, 1, "coroutine '%.50S' was never awaited", gen->gi_qualname) < 0)) PyErr_WriteUnraisable(self); #else {PyObject *msg; char *cmsg; #if CYTHON_COMPILING_IN_PYPY msg = NULL; cmsg = (char*) "coroutine was never awaited"; #else char *cname; PyObject *qualname; qualname = gen->gi_qualname; cname = PyString_AS_STRING(qualname); msg = PyString_FromFormat("coroutine '%.50s' was never awaited", cname); if (unlikely(!msg)) { PyErr_Clear(); cmsg = (char*) "coroutine was never awaited"; } else { cmsg = PyString_AS_STRING(msg); } #endif if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, cmsg, 1) < 0)) PyErr_WriteUnraisable(self); Py_XDECREF(msg);} #endif PyObject_GC_Track(self); } #endif } else { PyObject *res = __Pyx_Coroutine_Close(self); if (unlikely(!res)) { if (PyErr_Occurred()) PyErr_WriteUnraisable(self); } else { Py_DECREF(res); } } __Pyx_ErrRestore(error_type, error_value, error_traceback); #if !CYTHON_USE_TP_FINALIZE assert(Py_REFCNT(self) > 0); if (likely(--self->ob_refcnt == 0)) { return; } { Py_ssize_t refcnt = Py_REFCNT(self); _Py_NewReference(self); __Pyx_SET_REFCNT(self, refcnt); } #if CYTHON_COMPILING_IN_CPYTHON assert(PyType_IS_GC(Py_TYPE(self)) && _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED); _Py_DEC_REFTOTAL; #endif #ifdef COUNT_ALLOCS --Py_TYPE(self)->tp_frees; --Py_TYPE(self)->tp_allocs; #endif #endif } static PyObject * __Pyx_Coroutine_get_name(__pyx_CoroutineObject *self, void *context) { PyObject *name = self->gi_name; CYTHON_UNUSED_VAR(context); if (unlikely(!name)) name = Py_None; Py_INCREF(name); return name; } static int __Pyx_Coroutine_set_name(__pyx_CoroutineObject *self, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); #if PY_MAJOR_VERSION >= 3 if (unlikely(value == NULL || !PyUnicode_Check(value))) #else if (unlikely(value == NULL || !PyString_Check(value))) #endif { PyErr_SetString(PyExc_TypeError, "__name__ must be set to a string object"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(self->gi_name, value); return 0; } static PyObject * __Pyx_Coroutine_get_qualname(__pyx_CoroutineObject *self, void *context) { PyObject *name = self->gi_qualname; CYTHON_UNUSED_VAR(context); if (unlikely(!name)) name = Py_None; Py_INCREF(name); return name; } static int __Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); #if PY_MAJOR_VERSION >= 3 if (unlikely(value == NULL || !PyUnicode_Check(value))) #else if (unlikely(value == NULL || !PyString_Check(value))) #endif { PyErr_SetString(PyExc_TypeError, "__qualname__ must be set to a string object"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(self->gi_qualname, value); return 0; } static PyObject * __Pyx_Coroutine_get_frame(__pyx_CoroutineObject *self, void *context) { PyObject *frame = self->gi_frame; CYTHON_UNUSED_VAR(context); if (!frame) { if (unlikely(!self->gi_code)) { Py_RETURN_NONE; } frame = (PyObject *) PyFrame_New( PyThreadState_Get(), /*PyThreadState *tstate,*/ (PyCodeObject*) self->gi_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (unlikely(!frame)) return NULL; self->gi_frame = frame; } Py_INCREF(frame); return frame; } static __pyx_CoroutineObject *__Pyx__Coroutine_New( PyTypeObject* type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, PyObject *name, PyObject *qualname, PyObject *module_name) { __pyx_CoroutineObject *gen = PyObject_GC_New(__pyx_CoroutineObject, type); if (unlikely(!gen)) return NULL; return __Pyx__Coroutine_NewInit(gen, body, code, closure, name, qualname, module_name); } static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit( __pyx_CoroutineObject *gen, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, PyObject *name, PyObject *qualname, PyObject *module_name) { gen->body = body; gen->closure = closure; Py_XINCREF(closure); gen->is_running = 0; gen->resume_label = 0; gen->classobj = NULL; gen->yieldfrom = NULL; #if PY_VERSION_HEX >= 0x030B00a4 gen->gi_exc_state.exc_value = NULL; #else gen->gi_exc_state.exc_type = NULL; gen->gi_exc_state.exc_value = NULL; gen->gi_exc_state.exc_traceback = NULL; #endif #if CYTHON_USE_EXC_INFO_STACK gen->gi_exc_state.previous_item = NULL; #endif gen->gi_weakreflist = NULL; Py_XINCREF(qualname); gen->gi_qualname = qualname; Py_XINCREF(name); gen->gi_name = name; Py_XINCREF(module_name); gen->gi_modulename = module_name; Py_XINCREF(code); gen->gi_code = code; gen->gi_frame = NULL; PyObject_GC_Track(gen); return gen; } /* PatchModuleWithCoroutine */ static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code) { #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) int result; PyObject *globals, *result_obj; globals = PyDict_New(); if (unlikely(!globals)) goto ignore; result = PyDict_SetItemString(globals, "_cython_coroutine_type", #ifdef __Pyx_Coroutine_USED (PyObject*)__pyx_CoroutineType); #else Py_None); #endif if (unlikely(result < 0)) goto ignore; result = PyDict_SetItemString(globals, "_cython_generator_type", #ifdef __Pyx_Generator_USED (PyObject*)__pyx_GeneratorType); #else Py_None); #endif if (unlikely(result < 0)) goto ignore; if (unlikely(PyDict_SetItemString(globals, "_module", module) < 0)) goto ignore; if (unlikely(PyDict_SetItemString(globals, "__builtins__", __pyx_b) < 0)) goto ignore; result_obj = PyRun_String(py_code, Py_file_input, globals, globals); if (unlikely(!result_obj)) goto ignore; Py_DECREF(result_obj); Py_DECREF(globals); return module; ignore: Py_XDECREF(globals); PyErr_WriteUnraisable(module); if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, "Cython module failed to patch module with custom type", 1) < 0)) { Py_DECREF(module); module = NULL; } #else py_code++; #endif return module; } /* PatchGeneratorABC */ #ifndef CYTHON_REGISTER_ABCS #define CYTHON_REGISTER_ABCS 1 #endif #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) static PyObject* __Pyx_patch_abc_module(PyObject *module); static PyObject* __Pyx_patch_abc_module(PyObject *module) { module = __Pyx_Coroutine_patch_module( module, "" "if _cython_generator_type is not None:\n" " try: Generator = _module.Generator\n" " except AttributeError: pass\n" " else: Generator.register(_cython_generator_type)\n" "if _cython_coroutine_type is not None:\n" " try: Coroutine = _module.Coroutine\n" " except AttributeError: pass\n" " else: Coroutine.register(_cython_coroutine_type)\n" ); return module; } #endif static int __Pyx_patch_abc(void) { #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) static int abc_patched = 0; if (CYTHON_REGISTER_ABCS && !abc_patched) { PyObject *module; module = PyImport_ImportModule((PY_MAJOR_VERSION >= 3) ? "collections.abc" : "collections"); if (unlikely(!module)) { PyErr_WriteUnraisable(NULL); if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, ((PY_MAJOR_VERSION >= 3) ? "Cython module failed to register with collections.abc module" : "Cython module failed to register with collections module"), 1) < 0)) { return -1; } } else { module = __Pyx_patch_abc_module(module); abc_patched = 1; if (unlikely(!module)) return -1; Py_DECREF(module); } module = PyImport_ImportModule("backports_abc"); if (module) { module = __Pyx_patch_abc_module(module); Py_XDECREF(module); } if (!module) { PyErr_Clear(); } } #else if ((0)) __Pyx_Coroutine_patch_module(NULL, NULL); #endif return 0; } /* Generator */ static PyMethodDef __pyx_Generator_methods[] = { {"send", (PyCFunction) __Pyx_Coroutine_Send, METH_O, (char*) PyDoc_STR("send(arg) -> send 'arg' into generator,\nreturn next yielded value or raise StopIteration.")}, {"throw", (PyCFunction) __Pyx_Coroutine_Throw, METH_VARARGS, (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in generator,\nreturn next yielded value or raise StopIteration.")}, {"close", (PyCFunction) __Pyx_Coroutine_Close_Method, METH_NOARGS, (char*) PyDoc_STR("close() -> raise GeneratorExit inside generator.")}, {0, 0, 0, 0} }; static PyMemberDef __pyx_Generator_memberlist[] = { {(char *) "gi_running", T_BOOL, offsetof(__pyx_CoroutineObject, is_running), READONLY, NULL}, {(char*) "gi_yieldfrom", T_OBJECT, offsetof(__pyx_CoroutineObject, yieldfrom), READONLY, (char*) PyDoc_STR("object being iterated by 'yield from', or None")}, {(char*) "gi_code", T_OBJECT, offsetof(__pyx_CoroutineObject, gi_code), READONLY, NULL}, {(char *) "__module__", T_OBJECT, offsetof(__pyx_CoroutineObject, gi_modulename), 0, 0}, #if CYTHON_USE_TYPE_SPECS {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CoroutineObject, gi_weakreflist), READONLY, 0}, #endif {0, 0, 0, 0, 0} }; static PyGetSetDef __pyx_Generator_getsets[] = { {(char *) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name, (char*) PyDoc_STR("name of the generator"), 0}, {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname, (char*) PyDoc_STR("qualified name of the generator"), 0}, {(char *) "gi_frame", (getter)__Pyx_Coroutine_get_frame, NULL, (char*) PyDoc_STR("Frame of the generator"), 0}, {0, 0, 0, 0, 0} }; #if CYTHON_USE_TYPE_SPECS static PyType_Slot __pyx_GeneratorType_slots[] = { {Py_tp_dealloc, (void *)__Pyx_Coroutine_dealloc}, {Py_tp_traverse, (void *)__Pyx_Coroutine_traverse}, {Py_tp_iter, (void *)PyObject_SelfIter}, {Py_tp_iternext, (void *)__Pyx_Generator_Next}, {Py_tp_methods, (void *)__pyx_Generator_methods}, {Py_tp_members, (void *)__pyx_Generator_memberlist}, {Py_tp_getset, (void *)__pyx_Generator_getsets}, {Py_tp_getattro, (void *) __Pyx_PyObject_GenericGetAttrNoDict}, #if CYTHON_USE_TP_FINALIZE {Py_tp_finalize, (void *)__Pyx_Coroutine_del}, #endif {0, 0}, }; static PyType_Spec __pyx_GeneratorType_spec = { __PYX_TYPE_MODULE_PREFIX "generator", sizeof(__pyx_CoroutineObject), 0, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, __pyx_GeneratorType_slots }; #else static PyTypeObject __pyx_GeneratorType_type = { PyVarObject_HEAD_INIT(0, 0) __PYX_TYPE_MODULE_PREFIX "generator", sizeof(__pyx_CoroutineObject), 0, (destructor) __Pyx_Coroutine_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, 0, (traverseproc) __Pyx_Coroutine_traverse, 0, 0, offsetof(__pyx_CoroutineObject, gi_weakreflist), 0, (iternextfunc) __Pyx_Generator_Next, __pyx_Generator_methods, __pyx_Generator_memberlist, __pyx_Generator_getsets, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, #if CYTHON_USE_TP_FINALIZE 0, #else __Pyx_Coroutine_del, #endif 0, #if CYTHON_USE_TP_FINALIZE __Pyx_Coroutine_del, #elif PY_VERSION_HEX >= 0x030400a1 0, #endif #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, #endif #if __PYX_NEED_TP_PRINT_SLOT 0, #endif #if PY_VERSION_HEX >= 0x030C0000 0, #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 0, #endif }; #endif static int __pyx_Generator_init(PyObject *module) { #if CYTHON_USE_TYPE_SPECS __pyx_GeneratorType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_GeneratorType_spec, NULL); #else CYTHON_UNUSED_VAR(module); __pyx_GeneratorType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter; __pyx_GeneratorType = __Pyx_FetchCommonType(&__pyx_GeneratorType_type); #endif if (unlikely(!__pyx_GeneratorType)) { return -1; } return 0; } /* CheckBinaryVersion */ static unsigned long __Pyx_get_runtime_version(void) { #if __PYX_LIMITED_VERSION_HEX >= 0x030B00A4 return Py_Version & ~0xFFUL; #else const char* rt_version = Py_GetVersion(); unsigned long version = 0; unsigned long factor = 0x01000000UL; unsigned int digit = 0; int i = 0; while (factor) { while ('0' <= rt_version[i] && rt_version[i] <= '9') { digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); ++i; } version += factor * digit; if (rt_version[i] != '.') break; digit = 0; factor >>= 8; ++i; } return version; #endif } static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { const unsigned long MAJOR_MINOR = 0xFFFF0000UL; if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) return 0; if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) return 1; { char message[200]; PyOS_snprintf(message, sizeof(message), "compile time Python version %d.%d " "of module '%.100s' " "%s " "runtime version %d.%d", (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), __Pyx_MODULE_NAME, (allow_newer) ? "was newer than" : "does not match", (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) ); return PyErr_WarnEx(NULL, message, 1); } } /* InitStrings */ #if PY_MAJOR_VERSION >= 3 static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { if (t.is_unicode | t.is_str) { if (t.intern) { *str = PyUnicode_InternFromString(t.s); } else if (t.encoding) { *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); } else { *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); } } else { *str = PyBytes_FromStringAndSize(t.s, t.n - 1); } if (!*str) return -1; if (PyObject_Hash(*str) == -1) return -1; return 0; } #endif static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION >= 3 __Pyx_InitString(*t, t->p); #else if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } if (!*t->p) return -1; if (PyObject_Hash(*t->p) == -1) return -1; #endif ++t; } return 0; } #include static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { size_t len = strlen(s); if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { PyErr_SetString(PyExc_OverflowError, "byte string is too long"); return -1; } return (Py_ssize_t) len; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { Py_ssize_t len = __Pyx_ssize_strlen(c_str); if (unlikely(len < 0)) return NULL; return __Pyx_PyUnicode_FromStringAndSize(c_str, len); } static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { Py_ssize_t len = __Pyx_ssize_strlen(c_str); if (unlikely(len < 0)) return NULL; return PyByteArray_FromStringAndSize(c_str, len); } static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #if !CYTHON_PEP393_ENABLED static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; } #else static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (likely(PyUnicode_IS_ASCII(o))) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif } #endif #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { return __Pyx_PyUnicode_AsStringAndSize(o, length); } else #endif #if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { int retval; if (unlikely(!x)) return -1; retval = __Pyx_PyObject_IsTrue(x); Py_DECREF(x); return retval; } static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); #if PY_MAJOR_VERSION >= 3 if (PyLong_Check(result)) { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " "The ability to return an instance of a strict subclass of int is deprecated, " "and may be removed in a future version of Python.", result_type_name)) { __Pyx_DECREF_TypeName(result_type_name); Py_DECREF(result); return NULL; } __Pyx_DECREF_TypeName(result_type_name); return result; } #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", type_name, type_name, result_type_name); __Pyx_DECREF_TypeName(result_type_name); Py_DECREF(result); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { #if CYTHON_USE_TYPE_SLOTS PyNumberMethods *m; #endif const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x) || PyLong_Check(x))) #else if (likely(PyLong_Check(x))) #endif return __Pyx_NewRef(x); #if CYTHON_USE_TYPE_SLOTS m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = m->nb_int(x); } else if (m && m->nb_long) { name = "long"; res = m->nb_long(x); } #else if (likely(m && m->nb_int)) { name = "int"; res = m->nb_int(x); } #endif #else if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { res = PyNumber_Int(x); } #endif if (likely(res)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { #else if (unlikely(!PyLong_CheckExact(res))) { #endif return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) { if (sizeof(Py_ssize_t) >= sizeof(long)) return PyInt_AS_LONG(b); else return PyInt_AsSsize_t(b); } #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_USE_PYLONG_INTERNALS if (likely(__Pyx_PyLong_IsCompact(b))) { return __Pyx_PyLong_CompactValue(b); } else { const digit* digits = __Pyx_PyLong_Digits(b); const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); switch (size) { case 2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; } } #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); #if PY_MAJOR_VERSION < 3 } else if (likely(PyInt_CheckExact(o))) { return PyInt_AS_LONG(o); #endif } else { Py_ssize_t ival; PyObject *x; x = PyNumber_Index(o); if (!x) return -1; ival = PyInt_AsLong(x); Py_DECREF(x); return ival; } } static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } /* #### Code section: utility_code_pragmas_end ### */ #ifdef _MSC_VER #pragma warning( pop ) #endif /* #### Code section: end ### */ #endif /* Py_PYTHON_H */ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/_http_parser.pyx0000644000175100001770000006673514607525266017547 0ustar00runnerdocker#cython: language_level=3 # # Based on https://github.com/MagicStack/httptools # from cpython cimport ( Py_buffer, PyBUF_SIMPLE, PyBuffer_Release, PyBytes_AsString, PyBytes_AsStringAndSize, PyObject_GetBuffer, ) from cpython.mem cimport PyMem_Free, PyMem_Malloc from libc.limits cimport ULLONG_MAX from libc.string cimport memcpy from multidict import CIMultiDict as _CIMultiDict, CIMultiDictProxy as _CIMultiDictProxy from yarl import URL as _URL from aiohttp import hdrs from aiohttp.helpers import DEBUG, set_exception from .http_exceptions import ( BadHttpMessage, BadStatusLine, ContentLengthError, InvalidHeader, InvalidURLError, LineTooLong, PayloadEncodingError, TransferEncodingError, ) from .http_parser import DeflateBuffer as _DeflateBuffer from .http_writer import ( HttpVersion as _HttpVersion, HttpVersion10 as _HttpVersion10, HttpVersion11 as _HttpVersion11, ) from .streams import EMPTY_PAYLOAD as _EMPTY_PAYLOAD, StreamReader as _StreamReader cimport cython from aiohttp cimport _cparser as cparser include "_headers.pxi" from aiohttp cimport _find_header DEF DEFAULT_FREELIST_SIZE = 250 cdef extern from "Python.h": int PyByteArray_Resize(object, Py_ssize_t) except -1 Py_ssize_t PyByteArray_Size(object) except -1 char* PyByteArray_AsString(object) __all__ = ('HttpRequestParser', 'HttpResponseParser', 'RawRequestMessage', 'RawResponseMessage') cdef object URL = _URL cdef object URL_build = URL.build cdef object CIMultiDict = _CIMultiDict cdef object CIMultiDictProxy = _CIMultiDictProxy cdef object HttpVersion = _HttpVersion cdef object HttpVersion10 = _HttpVersion10 cdef object HttpVersion11 = _HttpVersion11 cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD cdef object StreamReader = _StreamReader cdef object DeflateBuffer = _DeflateBuffer cdef inline object extend(object buf, const char* at, size_t length): cdef Py_ssize_t s cdef char* ptr s = PyByteArray_Size(buf) PyByteArray_Resize(buf, s + length) ptr = PyByteArray_AsString(buf) memcpy(ptr + s, at, length) DEF METHODS_COUNT = 46; cdef list _http_method = [] for i in range(METHODS_COUNT): _http_method.append( cparser.llhttp_method_name( i).decode('ascii')) cdef inline str http_method_str(int i): if i < METHODS_COUNT: return _http_method[i] else: return "" cdef inline object find_header(bytes raw_header): cdef Py_ssize_t size cdef char *buf cdef int idx PyBytes_AsStringAndSize(raw_header, &buf, &size) idx = _find_header.find_header(buf, size) if idx == -1: return raw_header.decode('utf-8', 'surrogateescape') return headers[idx] @cython.freelist(DEFAULT_FREELIST_SIZE) cdef class RawRequestMessage: cdef readonly str method cdef readonly str path cdef readonly object version # HttpVersion cdef readonly object headers # CIMultiDict cdef readonly object raw_headers # tuple cdef readonly object should_close cdef readonly object compression cdef readonly object upgrade cdef readonly object chunked cdef readonly object url # yarl.URL def __init__(self, method, path, version, headers, raw_headers, should_close, compression, upgrade, chunked, url): self.method = method self.path = path self.version = version self.headers = headers self.raw_headers = raw_headers self.should_close = should_close self.compression = compression self.upgrade = upgrade self.chunked = chunked self.url = url def __repr__(self): info = [] info.append(("method", self.method)) info.append(("path", self.path)) info.append(("version", self.version)) info.append(("headers", self.headers)) info.append(("raw_headers", self.raw_headers)) info.append(("should_close", self.should_close)) info.append(("compression", self.compression)) info.append(("upgrade", self.upgrade)) info.append(("chunked", self.chunked)) info.append(("url", self.url)) sinfo = ', '.join(name + '=' + repr(val) for name, val in info) return '' def _replace(self, **dct): cdef RawRequestMessage ret ret = _new_request_message(self.method, self.path, self.version, self.headers, self.raw_headers, self.should_close, self.compression, self.upgrade, self.chunked, self.url) if "method" in dct: ret.method = dct["method"] if "path" in dct: ret.path = dct["path"] if "version" in dct: ret.version = dct["version"] if "headers" in dct: ret.headers = dct["headers"] if "raw_headers" in dct: ret.raw_headers = dct["raw_headers"] if "should_close" in dct: ret.should_close = dct["should_close"] if "compression" in dct: ret.compression = dct["compression"] if "upgrade" in dct: ret.upgrade = dct["upgrade"] if "chunked" in dct: ret.chunked = dct["chunked"] if "url" in dct: ret.url = dct["url"] return ret cdef _new_request_message(str method, str path, object version, object headers, object raw_headers, bint should_close, object compression, bint upgrade, bint chunked, object url): cdef RawRequestMessage ret ret = RawRequestMessage.__new__(RawRequestMessage) ret.method = method ret.path = path ret.version = version ret.headers = headers ret.raw_headers = raw_headers ret.should_close = should_close ret.compression = compression ret.upgrade = upgrade ret.chunked = chunked ret.url = url return ret @cython.freelist(DEFAULT_FREELIST_SIZE) cdef class RawResponseMessage: cdef readonly object version # HttpVersion cdef readonly int code cdef readonly str reason cdef readonly object headers # CIMultiDict cdef readonly object raw_headers # tuple cdef readonly object should_close cdef readonly object compression cdef readonly object upgrade cdef readonly object chunked def __init__(self, version, code, reason, headers, raw_headers, should_close, compression, upgrade, chunked): self.version = version self.code = code self.reason = reason self.headers = headers self.raw_headers = raw_headers self.should_close = should_close self.compression = compression self.upgrade = upgrade self.chunked = chunked def __repr__(self): info = [] info.append(("version", self.version)) info.append(("code", self.code)) info.append(("reason", self.reason)) info.append(("headers", self.headers)) info.append(("raw_headers", self.raw_headers)) info.append(("should_close", self.should_close)) info.append(("compression", self.compression)) info.append(("upgrade", self.upgrade)) info.append(("chunked", self.chunked)) sinfo = ', '.join(name + '=' + repr(val) for name, val in info) return '' cdef _new_response_message(object version, int code, str reason, object headers, object raw_headers, bint should_close, object compression, bint upgrade, bint chunked): cdef RawResponseMessage ret ret = RawResponseMessage.__new__(RawResponseMessage) ret.version = version ret.code = code ret.reason = reason ret.headers = headers ret.raw_headers = raw_headers ret.should_close = should_close ret.compression = compression ret.upgrade = upgrade ret.chunked = chunked return ret @cython.internal cdef class HttpParser: cdef: cparser.llhttp_t* _cparser cparser.llhttp_settings_t* _csettings bytearray _raw_name bytearray _raw_value bint _has_value object _protocol object _loop object _timer size_t _max_line_size size_t _max_field_size size_t _max_headers bint _response_with_body bint _read_until_eof bint _started object _url bytearray _buf str _path str _reason object _headers list _raw_headers bint _upgraded list _messages object _payload bint _payload_error object _payload_exception object _last_error bint _auto_decompress int _limit str _content_encoding Py_buffer py_buf def __cinit__(self): self._cparser = \ PyMem_Malloc(sizeof(cparser.llhttp_t)) if self._cparser is NULL: raise MemoryError() self._csettings = \ PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) if self._csettings is NULL: raise MemoryError() def __dealloc__(self): PyMem_Free(self._cparser) PyMem_Free(self._csettings) cdef _init( self, cparser.llhttp_type mode, object protocol, object loop, int limit, object timer=None, size_t max_line_size=8190, size_t max_headers=32768, size_t max_field_size=8190, payload_exception=None, bint response_with_body=True, bint read_until_eof=False, bint auto_decompress=True, ): cparser.llhttp_settings_init(self._csettings) cparser.llhttp_init(self._cparser, mode, self._csettings) self._cparser.data = self self._cparser.content_length = 0 self._protocol = protocol self._loop = loop self._timer = timer self._buf = bytearray() self._payload = None self._payload_error = 0 self._payload_exception = payload_exception self._messages = [] self._raw_name = bytearray() self._raw_value = bytearray() self._has_value = False self._max_line_size = max_line_size self._max_headers = max_headers self._max_field_size = max_field_size self._response_with_body = response_with_body self._read_until_eof = read_until_eof self._upgraded = False self._auto_decompress = auto_decompress self._content_encoding = None self._csettings.on_url = cb_on_url self._csettings.on_status = cb_on_status self._csettings.on_header_field = cb_on_header_field self._csettings.on_header_value = cb_on_header_value self._csettings.on_headers_complete = cb_on_headers_complete self._csettings.on_body = cb_on_body self._csettings.on_message_begin = cb_on_message_begin self._csettings.on_message_complete = cb_on_message_complete self._csettings.on_chunk_header = cb_on_chunk_header self._csettings.on_chunk_complete = cb_on_chunk_complete self._last_error = None self._limit = limit cdef _process_header(self): if self._raw_name: raw_name = bytes(self._raw_name) raw_value = bytes(self._raw_value) name = find_header(raw_name) value = raw_value.decode('utf-8', 'surrogateescape') self._headers.add(name, value) if name is CONTENT_ENCODING: self._content_encoding = value PyByteArray_Resize(self._raw_name, 0) PyByteArray_Resize(self._raw_value, 0) self._has_value = False self._raw_headers.append((raw_name, raw_value)) cdef _on_header_field(self, char* at, size_t length): cdef Py_ssize_t size cdef char *buf if self._has_value: self._process_header() size = PyByteArray_Size(self._raw_name) PyByteArray_Resize(self._raw_name, size + length) buf = PyByteArray_AsString(self._raw_name) memcpy(buf + size, at, length) cdef _on_header_value(self, char* at, size_t length): cdef Py_ssize_t size cdef char *buf size = PyByteArray_Size(self._raw_value) PyByteArray_Resize(self._raw_value, size + length) buf = PyByteArray_AsString(self._raw_value) memcpy(buf + size, at, length) self._has_value = True cdef _on_headers_complete(self): self._process_header() method = http_method_str(self._cparser.method) should_close = not cparser.llhttp_should_keep_alive(self._cparser) upgrade = self._cparser.upgrade chunked = self._cparser.flags & cparser.F_CHUNKED raw_headers = tuple(self._raw_headers) headers = CIMultiDictProxy(self._headers) if upgrade or self._cparser.method == cparser.HTTP_CONNECT: self._upgraded = True # do not support old websocket spec if SEC_WEBSOCKET_KEY1 in headers: raise InvalidHeader(SEC_WEBSOCKET_KEY1) encoding = None enc = self._content_encoding if enc is not None: self._content_encoding = None enc = enc.lower() if enc in ('gzip', 'deflate', 'br'): encoding = enc if self._cparser.type == cparser.HTTP_REQUEST: msg = _new_request_message( method, self._path, self.http_version(), headers, raw_headers, should_close, encoding, upgrade, chunked, self._url) else: msg = _new_response_message( self.http_version(), self._cparser.status_code, self._reason, headers, raw_headers, should_close, encoding, upgrade, chunked) if ( ULLONG_MAX > self._cparser.content_length > 0 or chunked or self._cparser.method == cparser.HTTP_CONNECT or (self._cparser.status_code >= 199 and self._cparser.content_length == 0 and self._read_until_eof) ): payload = StreamReader( self._protocol, timer=self._timer, loop=self._loop, limit=self._limit) else: payload = EMPTY_PAYLOAD self._payload = payload if encoding is not None and self._auto_decompress: self._payload = DeflateBuffer(payload, encoding) if not self._response_with_body: payload = EMPTY_PAYLOAD self._messages.append((msg, payload)) cdef _on_message_complete(self): self._payload.feed_eof() self._payload = None cdef _on_chunk_header(self): self._payload.begin_http_chunk_receiving() cdef _on_chunk_complete(self): self._payload.end_http_chunk_receiving() cdef object _on_status_complete(self): pass cdef inline http_version(self): cdef cparser.llhttp_t* parser = self._cparser if parser.http_major == 1: if parser.http_minor == 0: return HttpVersion10 elif parser.http_minor == 1: return HttpVersion11 return HttpVersion(parser.http_major, parser.http_minor) ### Public API ### def feed_eof(self): cdef bytes desc if self._payload is not None: if self._cparser.flags & cparser.F_CHUNKED: raise TransferEncodingError( "Not enough data for satisfy transfer length header.") elif self._cparser.flags & cparser.F_CONTENT_LENGTH: raise ContentLengthError( "Not enough data for satisfy content length header.") elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: desc = cparser.llhttp_get_error_reason(self._cparser) raise PayloadEncodingError(desc.decode('latin-1')) else: self._payload.feed_eof() elif self._started: self._on_headers_complete() if self._messages: return self._messages[-1][0] def feed_data(self, data): cdef: size_t data_len size_t nb cdef cparser.llhttp_errno_t errno PyObject_GetBuffer(data, &self.py_buf, PyBUF_SIMPLE) data_len = self.py_buf.len errno = cparser.llhttp_execute( self._cparser, self.py_buf.buf, data_len) if errno is cparser.HPE_PAUSED_UPGRADE: cparser.llhttp_resume_after_upgrade(self._cparser) nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf PyBuffer_Release(&self.py_buf) if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): if self._payload_error == 0: if self._last_error is not None: ex = self._last_error self._last_error = None else: after = cparser.llhttp_get_error_pos(self._cparser) before = data[:after - self.py_buf.buf] after_b = after.split(b"\r\n", 1)[0] before = before.rsplit(b"\r\n", 1)[-1] data = before + after_b pointer = " " * (len(repr(before))-1) + "^" ex = parser_error_from_errno(self._cparser, data, pointer) self._payload = None raise ex if self._messages: messages = self._messages self._messages = [] else: messages = () if self._upgraded: return messages, True, data[nb:] else: return messages, False, b'' def set_upgraded(self, val): self._upgraded = val cdef class HttpRequestParser(HttpParser): def __init__( self, protocol, loop, int limit, timer=None, size_t max_line_size=8190, size_t max_headers=32768, size_t max_field_size=8190, payload_exception=None, bint response_with_body=True, bint read_until_eof=False, bint auto_decompress=True, ): self._init(cparser.HTTP_REQUEST, protocol, loop, limit, timer, max_line_size, max_headers, max_field_size, payload_exception, response_with_body, read_until_eof, auto_decompress) cdef object _on_status_complete(self): cdef int idx1, idx2 if not self._buf: return self._path = self._buf.decode('utf-8', 'surrogateescape') try: idx3 = len(self._path) if self._cparser.method == cparser.HTTP_CONNECT: # authority-form, # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.3 self._url = URL.build(authority=self._path, encoded=True) elif idx3 > 1 and self._path[0] == '/': # origin-form, # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.1 idx1 = self._path.find("?") if idx1 == -1: query = "" idx2 = self._path.find("#") if idx2 == -1: path = self._path fragment = "" else: path = self._path[0: idx2] fragment = self._path[idx2+1:] else: path = self._path[0:idx1] idx1 += 1 idx2 = self._path.find("#", idx1+1) if idx2 == -1: query = self._path[idx1:] fragment = "" else: query = self._path[idx1: idx2] fragment = self._path[idx2+1:] self._url = URL.build( path=path, query_string=query, fragment=fragment, encoded=True, ) else: # absolute-form for proxy maybe, # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.2 self._url = URL(self._path, encoded=True) finally: PyByteArray_Resize(self._buf, 0) cdef class HttpResponseParser(HttpParser): def __init__( self, protocol, loop, int limit, timer=None, size_t max_line_size=8190, size_t max_headers=32768, size_t max_field_size=8190, payload_exception=None, bint response_with_body=True, bint read_until_eof=False, bint auto_decompress=True ): self._init(cparser.HTTP_RESPONSE, protocol, loop, limit, timer, max_line_size, max_headers, max_field_size, payload_exception, response_with_body, read_until_eof, auto_decompress) # Use strict parsing on dev mode, so users are warned about broken servers. if not DEBUG: cparser.llhttp_set_lenient_headers(self._cparser, 1) cparser.llhttp_set_lenient_optional_cr_before_lf(self._cparser, 1) cparser.llhttp_set_lenient_spaces_after_chunk_size(self._cparser, 1) cdef object _on_status_complete(self): if self._buf: self._reason = self._buf.decode('utf-8', 'surrogateescape') PyByteArray_Resize(self._buf, 0) else: self._reason = self._reason or '' cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: cdef HttpParser pyparser = parser.data pyparser._started = True pyparser._headers = CIMultiDict() pyparser._raw_headers = [] PyByteArray_Resize(pyparser._buf, 0) pyparser._path = None pyparser._reason = None return 0 cdef int cb_on_url(cparser.llhttp_t* parser, const char *at, size_t length) except -1: cdef HttpParser pyparser = parser.data try: if length > pyparser._max_line_size: raise LineTooLong( 'Status line is too long', pyparser._max_line_size, length) extend(pyparser._buf, at, length) except BaseException as ex: pyparser._last_error = ex return -1 else: return 0 cdef int cb_on_status(cparser.llhttp_t* parser, const char *at, size_t length) except -1: cdef HttpParser pyparser = parser.data cdef str reason try: if length > pyparser._max_line_size: raise LineTooLong( 'Status line is too long', pyparser._max_line_size, length) extend(pyparser._buf, at, length) except BaseException as ex: pyparser._last_error = ex return -1 else: return 0 cdef int cb_on_header_field(cparser.llhttp_t* parser, const char *at, size_t length) except -1: cdef HttpParser pyparser = parser.data cdef Py_ssize_t size try: pyparser._on_status_complete() size = len(pyparser._raw_name) + length if size > pyparser._max_field_size: raise LineTooLong( 'Header name is too long', pyparser._max_field_size, size) pyparser._on_header_field(at, length) except BaseException as ex: pyparser._last_error = ex return -1 else: return 0 cdef int cb_on_header_value(cparser.llhttp_t* parser, const char *at, size_t length) except -1: cdef HttpParser pyparser = parser.data cdef Py_ssize_t size try: size = len(pyparser._raw_value) + length if size > pyparser._max_field_size: raise LineTooLong( 'Header value is too long', pyparser._max_field_size, size) pyparser._on_header_value(at, length) except BaseException as ex: pyparser._last_error = ex return -1 else: return 0 cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: cdef HttpParser pyparser = parser.data try: pyparser._on_status_complete() pyparser._on_headers_complete() except BaseException as exc: pyparser._last_error = exc return -1 else: if ( pyparser._cparser.upgrade or pyparser._cparser.method == cparser.HTTP_CONNECT ): return 2 else: return 0 cdef int cb_on_body(cparser.llhttp_t* parser, const char *at, size_t length) except -1: cdef HttpParser pyparser = parser.data cdef bytes body = at[:length] try: pyparser._payload.feed_data(body, length) except BaseException as underlying_exc: reraised_exc = underlying_exc if pyparser._payload_exception is not None: reraised_exc = pyparser._payload_exception(str(underlying_exc)) set_exception(pyparser._payload, reraised_exc, underlying_exc) pyparser._payload_error = 1 return -1 else: return 0 cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: cdef HttpParser pyparser = parser.data try: pyparser._started = False pyparser._on_message_complete() except BaseException as exc: pyparser._last_error = exc return -1 else: return 0 cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: cdef HttpParser pyparser = parser.data try: pyparser._on_chunk_header() except BaseException as exc: pyparser._last_error = exc return -1 else: return 0 cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: cdef HttpParser pyparser = parser.data try: pyparser._on_chunk_complete() except BaseException as exc: pyparser._last_error = exc return -1 else: return 0 cdef parser_error_from_errno(cparser.llhttp_t* parser, data, pointer): cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) cdef bytes desc = cparser.llhttp_get_error_reason(parser) err_msg = "{}:\n\n {!r}\n {}".format(desc.decode("latin-1"), data, pointer) if errno in {cparser.HPE_CB_MESSAGE_BEGIN, cparser.HPE_CB_HEADERS_COMPLETE, cparser.HPE_CB_MESSAGE_COMPLETE, cparser.HPE_CB_CHUNK_HEADER, cparser.HPE_CB_CHUNK_COMPLETE, cparser.HPE_INVALID_CONSTANT, cparser.HPE_INVALID_HEADER_TOKEN, cparser.HPE_INVALID_CONTENT_LENGTH, cparser.HPE_INVALID_CHUNK_SIZE, cparser.HPE_INVALID_EOF_STATE, cparser.HPE_INVALID_TRANSFER_ENCODING}: return BadHttpMessage(err_msg) elif errno in {cparser.HPE_INVALID_STATUS, cparser.HPE_INVALID_METHOD, cparser.HPE_INVALID_VERSION}: return BadStatusLine(error=err_msg) elif errno == cparser.HPE_INVALID_URL: return InvalidURLError(err_msg) return BadHttpMessage(err_msg) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285828.0 aiohttp-3.9.5/aiohttp/_http_writer.c0000644000175100001770000126623314607525304017156 0ustar00runnerdocker/* Generated by Cython 3.0.5 */ #ifndef PY_SSIZE_T_CLEAN #define PY_SSIZE_T_CLEAN #endif /* PY_SSIZE_T_CLEAN */ #if defined(CYTHON_LIMITED_API) && 0 #ifndef Py_LIMITED_API #if CYTHON_LIMITED_API+0 > 0x03030000 #define Py_LIMITED_API CYTHON_LIMITED_API #else #define Py_LIMITED_API 0x03030000 #endif #endif #endif #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.7+ or Python 3.3+. #else #if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API #define __PYX_EXTRA_ABI_MODULE_NAME "limited" #else #define __PYX_EXTRA_ABI_MODULE_NAME "" #endif #define CYTHON_ABI "3_0_5" __PYX_EXTRA_ABI_MODULE_NAME #define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI #define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." #define CYTHON_HEX_VERSION 0x030005F0 #define CYTHON_FUTURE_DIVISION 1 #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #define __PYX_COMMA , #ifndef HAVE_LONG_LONG #define HAVE_LONG_LONG #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX #if defined(GRAALVM_PYTHON) /* For very preliminary testing purposes. Most variables are set the same as PyPy. The existence of this section does not imply that anything works or is even tested */ #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 1 #define CYTHON_COMPILING_IN_NOGIL 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 0 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_GIL #define CYTHON_FAST_GIL 0 #undef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) #endif #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #undef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 #endif #elif defined(PYPY_VERSION) #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #ifndef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 0 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_GIL #define CYTHON_FAST_GIL 0 #undef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) #endif #if PY_VERSION_HEX < 0x03090000 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #endif #undef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 #endif #elif defined(CYTHON_LIMITED_API) #ifdef Py_LIMITED_API #undef __PYX_LIMITED_VERSION_HEX #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API #endif #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 1 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 0 #undef CYTHON_CLINE_IN_TRACEBACK #define CYTHON_CLINE_IN_TRACEBACK 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 1 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #endif #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_GIL #define CYTHON_FAST_GIL 0 #undef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS 1 #endif #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 1 #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #endif #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 #endif #elif defined(PY_NOGIL) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 1 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #ifndef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #endif #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 1 #endif #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #ifndef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 0 #endif #ifndef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 1 #endif #if PY_MAJOR_VERSION < 3 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #ifndef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 1 #endif #ifndef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 1 #endif #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #elif !defined(CYTHON_USE_UNICODE_WRITER) #define CYTHON_USE_UNICODE_WRITER 1 #endif #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #ifndef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_GIL #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) #endif #ifndef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) #endif #ifndef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 1 #endif #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS 1 #endif #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #endif #ifndef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 0 #endif #if PY_VERSION_HEX < 0x030400a1 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #elif !defined(CYTHON_USE_TP_FINALIZE) #define CYTHON_USE_TP_FINALIZE 1 #endif #if PY_VERSION_HEX < 0x030600B1 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #elif !defined(CYTHON_USE_DICT_VERSIONS) #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) #endif #if PY_VERSION_HEX < 0x030700A3 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #elif !defined(CYTHON_USE_EXC_INFO_STACK) #define CYTHON_USE_EXC_INFO_STACK 1 #endif #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if !defined(CYTHON_VECTORCALL) #define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) #endif #define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) #if CYTHON_USE_PYLONG_INTERNALS #if PY_MAJOR_VERSION < 3 #include "longintrepr.h" #endif #undef SHIFT #undef BASE #undef MASK #ifdef SIZEOF_VOID_P enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; #endif #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_cpp_attribute #define __has_cpp_attribute(x) 0 #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifndef CYTHON_UNUSED #if defined(__cplusplus) /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 * but leads to warnings with -pedantic, since it is a C++17 feature */ #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) #if __has_cpp_attribute(maybe_unused) #define CYTHON_UNUSED [[maybe_unused]] #endif #endif #endif #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif #ifndef CYTHON_UNUSED_VAR # if defined(__cplusplus) template void CYTHON_UNUSED_VAR( const T& ) { } # else # define CYTHON_UNUSED_VAR(x) (void)(x) # endif #endif #ifndef CYTHON_MAYBE_UNUSED_VAR #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) #endif #ifndef CYTHON_NCP_UNUSED # if CYTHON_COMPILING_IN_CPYTHON # define CYTHON_NCP_UNUSED # else # define CYTHON_NCP_UNUSED CYTHON_UNUSED # endif #endif #ifndef CYTHON_USE_CPP_STD_MOVE #if defined(__cplusplus) && (\ __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) #define CYTHON_USE_CPP_STD_MOVE 1 #else #define CYTHON_USE_CPP_STD_MOVE 0 #endif #endif #define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) #ifdef _MSC_VER #ifndef _MSC_STDINT_H_ #if _MSC_VER < 1300 typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #else typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #endif #endif #if _MSC_VER < 1300 #ifdef _WIN64 typedef unsigned long long __pyx_uintptr_t; #else typedef unsigned int __pyx_uintptr_t; #endif #else #ifdef _WIN64 typedef unsigned __int64 __pyx_uintptr_t; #else typedef unsigned __int32 __pyx_uintptr_t; #endif #endif #else #include typedef uintptr_t __pyx_uintptr_t; #endif #ifndef CYTHON_FALLTHROUGH #if defined(__cplusplus) /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 * but leads to warnings with -pedantic, since it is a C++17 feature */ #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) #if __has_cpp_attribute(fallthrough) #define CYTHON_FALLTHROUGH [[fallthrough]] #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_cpp_attribute(clang::fallthrough) #define CYTHON_FALLTHROUGH [[clang::fallthrough]] #elif __has_cpp_attribute(gnu::fallthrough) #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] #endif #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_attribute(fallthrough) #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) #else #define CYTHON_FALLTHROUGH #endif #endif #if defined(__clang__) && defined(__apple_build_version__) #if __apple_build_version__ < 7000000 #undef CYTHON_FALLTHROUGH #define CYTHON_FALLTHROUGH #endif #endif #endif #ifdef __cplusplus template struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) #else #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) #endif #if CYTHON_COMPILING_IN_PYPY == 1 #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) #else #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) #endif #define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) #ifndef CYTHON_INLINE #if defined(__clang__) #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) #elif defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_DefaultClassType PyClass_Type #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #define __Pyx_DefaultClassType PyType_Type #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, PyObject *code, PyObject *c, PyObject* n, PyObject *v, PyObject *fv, PyObject *cell, PyObject* fn, PyObject *name, int fline, PyObject *lnos) { PyObject *exception_table = NULL; PyObject *types_module=NULL, *code_type=NULL, *result=NULL; #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 PyObject *version_info; // borrowed #endif PyObject *py_minor_version = NULL; long minor_version = 0; PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 minor_version = 11; // we don't yet need to distinguish between versions > 11 #else if (!(version_info = PySys_GetObject("version_info"))) goto end; if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; minor_version = PyLong_AsLong(py_minor_version); if (minor_version == -1 && PyErr_Occurred()) goto end; #endif if (!(types_module = PyImport_ImportModule("types"))) goto end; if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; if (minor_version <= 7) { (void)p; result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, c, n, v, fn, name, fline, lnos, fv, cell); } else if (minor_version <= 10) { result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, c, n, v, fn, name, fline, lnos, fv, cell); } else { if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); } end: Py_XDECREF(code_type); Py_XDECREF(exception_table); Py_XDECREF(types_module); Py_XDECREF(py_minor_version); if (type) { PyErr_Restore(type, value, traceback); } return result; } #ifndef CO_OPTIMIZED #define CO_OPTIMIZED 0x0001 #endif #ifndef CO_NEWLOCALS #define CO_NEWLOCALS 0x0002 #endif #ifndef CO_VARARGS #define CO_VARARGS 0x0004 #endif #ifndef CO_VARKEYWORDS #define CO_VARKEYWORDS 0x0008 #endif #ifndef CO_ASYNC_GENERATOR #define CO_ASYNC_GENERATOR 0x0200 #endif #ifndef CO_GENERATOR #define CO_GENERATOR 0x0020 #endif #ifndef CO_COROUTINE #define CO_COROUTINE 0x0080 #endif #elif PY_VERSION_HEX >= 0x030B0000 static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, PyObject *code, PyObject *c, PyObject* n, PyObject *v, PyObject *fv, PyObject *cell, PyObject* fn, PyObject *name, int fline, PyObject *lnos) { PyCodeObject *result; PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); // we don't have access to __pyx_empty_bytes here if (!empty_bytes) return NULL; result = #if PY_VERSION_HEX >= 0x030C0000 PyUnstable_Code_NewWithPosOnlyArgs #else PyCode_NewWithPosOnlyArgs #endif (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); Py_DECREF(empty_bytes); return result; } #elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #endif #if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) #else #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) #define __Pyx_Py_Is(x, y) Py_Is(x, y) #else #define __Pyx_Py_Is(x, y) ((x) == (y)) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) #else #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) #else #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) #else #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) #endif #define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) #if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) #else #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) #endif #ifndef CO_COROUTINE #define CO_COROUTINE 0x80 #endif #ifndef CO_ASYNC_GENERATOR #define CO_ASYNC_GENERATOR 0x200 #endif #ifndef Py_TPFLAGS_CHECKTYPES #define Py_TPFLAGS_CHECKTYPES 0 #endif #ifndef Py_TPFLAGS_HAVE_INDEX #define Py_TPFLAGS_HAVE_INDEX 0 #endif #ifndef Py_TPFLAGS_HAVE_NEWBUFFER #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #ifndef Py_TPFLAGS_HAVE_FINALIZE #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #ifndef Py_TPFLAGS_SEQUENCE #define Py_TPFLAGS_SEQUENCE 0 #endif #ifndef Py_TPFLAGS_MAPPING #define Py_TPFLAGS_MAPPING 0 #endif #ifndef METH_STACKLESS #define METH_STACKLESS 0 #endif #if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) #ifndef METH_FASTCALL #define METH_FASTCALL 0x80 #endif typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else #define __Pyx_PyCFunctionFast _PyCFunctionFast #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords #endif #if CYTHON_METH_FASTCALL #define __Pyx_METH_FASTCALL METH_FASTCALL #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords #else #define __Pyx_METH_FASTCALL METH_VARARGS #define __Pyx_PyCFunction_FastCall PyCFunction #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords #endif #if CYTHON_VECTORCALL #define __pyx_vectorcallfunc vectorcallfunc #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) #elif CYTHON_BACKPORT_VECTORCALL typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames); #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) #else #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) #endif #if PY_MAJOR_VERSION >= 0x030900B1 #define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) #else #define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) #endif #define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) #elif !CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) #endif #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; } #endif static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { #if CYTHON_COMPILING_IN_LIMITED_API return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; #else return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; #endif } #define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) #if __PYX_LIMITED_VERSION_HEX < 0x030900B1 #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); #else #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) #define __Pyx_PyCMethod PyCMethod #endif #ifndef METH_METHOD #define METH_METHOD 0x200 #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) #define PyObject_Malloc(s) PyMem_Malloc(s) #define PyObject_Free(p) PyMem_Free(p) #define PyObject_Realloc(p) PyMem_Realloc(p) #endif #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) #else #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) #endif #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_PyThreadState_Current PyThreadState_Get() #elif !CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_Current PyThreadState_GET() #elif PY_VERSION_HEX >= 0x030d00A1 #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() #elif PY_VERSION_HEX >= 0x03060000 #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() #elif PY_VERSION_HEX >= 0x03000000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #else #define __Pyx_PyThreadState_Current _PyThreadState_Current #endif #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) { void *result; result = PyModule_GetState(op); if (!result) Py_FatalError("Couldn't find the module state"); return result; } #endif #define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) #else #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) #endif #if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) #include "pythread.h" #define Py_tss_NEEDS_INIT 0 typedef int Py_tss_t; static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { *key = PyThread_create_key(); return 0; } static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); *key = Py_tss_NEEDS_INIT; return key; } static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { PyObject_Free(key); } static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { return *key != Py_tss_NEEDS_INIT; } static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { PyThread_delete_key(*key); *key = Py_tss_NEEDS_INIT; } static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { return PyThread_set_key_value(*key, value); } static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { return PyThread_get_key_value(*key); } #endif #if PY_MAJOR_VERSION < 3 #if CYTHON_COMPILING_IN_PYPY #if PYPY_VERSION_NUM < 0x07030600 #if defined(__cplusplus) && __cplusplus >= 201402L [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] #elif defined(__GNUC__) || defined(__clang__) __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) #elif defined(_MSC_VER) __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) #endif static CYTHON_INLINE int PyGILState_Check(void) { return 0; } #else // PYPY_VERSION_NUM < 0x07030600 #endif // PYPY_VERSION_NUM < 0x07030600 #else static CYTHON_INLINE int PyGILState_Check(void) { PyThreadState * tstate = _PyThreadState_Current; return tstate && (tstate == PyGILState_GetThisThreadState()); } #endif #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) #else #define __Pyx_PyDict_NewPresized(n) PyDict_New() #endif #if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS #define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); if (res == NULL) PyErr_Clear(); return res; } #elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) #define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError #define __Pyx_PyDict_GetItemStr PyDict_GetItem #else static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { #if CYTHON_COMPILING_IN_PYPY return PyDict_GetItem(dict, name); #else PyDictEntry *ep; PyDictObject *mp = (PyDictObject*) dict; long hash = ((PyStringObject *) name)->ob_shash; assert(hash != -1); ep = (mp->ma_lookup)(mp, name, hash); if (ep == NULL) { return NULL; } return ep->me_value; #endif } #define __Pyx_PyDict_GetItemStr PyDict_GetItem #endif #if CYTHON_USE_TYPE_SLOTS #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) #else #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next #endif #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) #else #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) #endif #if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 #define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ PyTypeObject *type = Py_TYPE(obj);\ assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ PyObject_GC_Del(obj);\ Py_DECREF(type);\ } #else #define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) #endif #if CYTHON_COMPILING_IN_LIMITED_API #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) #define __Pyx_PyUnicode_DATA(u) ((void*)u) #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) #elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #if PY_VERSION_HEX >= 0x030C0000 #define __Pyx_PyUnicode_READY(op) (0) #else #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #endif #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) #if PY_VERSION_HEX >= 0x030C0000 #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) #else #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #endif #endif #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 #define PyUnicode_2BYTE_KIND 2 #define PyUnicode_4BYTE_KIND 4 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #endif #if CYTHON_COMPILING_IN_PYPY #if !defined(PyUnicode_DecodeUnicodeEscape) #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) #endif #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) #undef PyUnicode_Contains #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) #endif #if !defined(PyByteArray_Check) #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) #endif #if !defined(PyObject_Format) #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) #endif #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) #define PyObject_ASCII(o) PyObject_Repr(o) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #ifndef PyObject_Unicode #define PyObject_Unicode PyObject_Str #endif #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_PySequence_ListKeepNew(obj)\ (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) #else #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) #endif #if PY_VERSION_HEX >= 0x030900A4 #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) #else #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) #endif #if CYTHON_ASSUME_SAFE_MACROS #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) #else #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) #endif #if PY_VERSION_HEX >= 0x030d00A1 #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) #else static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { PyObject *module = PyImport_AddModule(name); Py_XINCREF(module); return module; } #endif #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define __Pyx_Py3Int_Check(op) PyLong_Check(op) #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #else #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t #endif #if CYTHON_USE_ASYNC_SLOTS #if PY_VERSION_HEX >= 0x030500B1 #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) #else #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) #endif #else #define __Pyx_PyType_AsAsync(obj) NULL #endif #ifndef __Pyx_PyAsyncMethodsStruct typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; } __Pyx_PyAsyncMethodsStruct; #endif #if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) #if !defined(_USE_MATH_DEFINES) #define _USE_MATH_DEFINES #endif #endif #include #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) #define __Pyx_truncl trunc #else #define __Pyx_truncl truncl #endif #define __PYX_MARK_ERR_POS(f_index, lineno) \ { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } #ifdef CYTHON_EXTERN_C #undef __PYX_EXTERN_C #define __PYX_EXTERN_C CYTHON_EXTERN_C #elif defined(__PYX_EXTERN_C) #ifdef _MSC_VER #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") #else #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. #endif #else #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #define __PYX_HAVE__aiohttp___http_writer #define __PYX_HAVE_API__aiohttp___http_writer /* Early includes */ #include #include #include #ifdef _OPENMP #include #endif /* _OPENMP */ #if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) #define CYTHON_WITHOUT_ASSERTIONS #endif typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_uchar_cast(c) ((unsigned char)c) #define __Pyx_long_cast(x) ((long)x) #define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ (sizeof(type) < sizeof(Py_ssize_t)) ||\ (sizeof(type) > sizeof(Py_ssize_t) &&\ likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX) &&\ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ v == (type)PY_SSIZE_T_MIN))) ||\ (sizeof(type) == sizeof(Py_ssize_t) &&\ (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX))) ) static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { return (size_t) i < (size_t) limit; } #if defined (__cplusplus) && __cplusplus >= 201103L #include #define __Pyx_sst_abs(value) std::abs(value) #elif SIZEOF_INT >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) abs(value) #elif SIZEOF_LONG >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) labs(value) #elif defined (_MSC_VER) #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_sst_abs(value) llabs(value) #elif defined (__GNUC__) #define __Pyx_sst_abs(value) __builtin_llabs(value) #else #define __Pyx_sst_abs(value) ((value<0) ? -value : value) #endif static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) { const wchar_t *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #else static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { const Py_UNICODE *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #endif #define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) #define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); #if CYTHON_ASSUME_SAFE_MACROS #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) #else #define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) #endif #if CYTHON_USE_PYLONG_INTERNALS #if PY_VERSION_HEX >= 0x030C00A7 #ifndef _PyLong_SIGN_MASK #define _PyLong_SIGN_MASK 3 #endif #ifndef _PyLong_NON_SIZE_BITS #define _PyLong_NON_SIZE_BITS 3 #endif #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) #define __Pyx_PyLong_SignedDigitCount(x)\ ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) #else #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) #endif typedef Py_ssize_t __Pyx_compact_pylong; typedef size_t __Pyx_compact_upylong; #else // Py < 3.12 #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) #define __Pyx_PyLong_CompactValue(x)\ ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) typedef sdigit __Pyx_compact_pylong; typedef digit __Pyx_compact_upylong; #endif #if PY_VERSION_HEX >= 0x030C00A5 #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) #else #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) #endif #endif #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII #include static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = (char) c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #include static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } #if !CYTHON_USE_MODULE_STATE static PyObject *__pyx_m = NULL; #endif static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm = __FILE__; static const char *__pyx_filename; /* #### Code section: filename_table ### */ static const char *__pyx_f[] = { "aiohttp/_http_writer.pyx", "type.pxd", }; /* #### Code section: utility_code_proto_before_types ### */ /* ForceInitThreads.proto */ #ifndef __PYX_FORCE_INIT_THREADS #define __PYX_FORCE_INIT_THREADS 0 #endif /* #### Code section: numeric_typedefs ### */ /* #### Code section: complex_type_declarations ### */ /* #### Code section: type_declarations ### */ /*--- Type declarations ---*/ struct __pyx_t_7aiohttp_12_http_writer_Writer; /* "aiohttp/_http_writer.pyx":18 * # ----------------- writer --------------------------- * * cdef struct Writer: # <<<<<<<<<<<<<< * char *buf * Py_ssize_t size */ struct __pyx_t_7aiohttp_12_http_writer_Writer { char *buf; Py_ssize_t size; Py_ssize_t pos; }; /* #### Code section: utility_code_proto ### */ /* --- Runtime support code (head) --- */ /* Refnanny.proto */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, Py_ssize_t); void (*DECREF)(void*, PyObject*, Py_ssize_t); void (*GOTREF)(void*, PyObject*, Py_ssize_t); void (*GIVEREF)(void*, PyObject*, Py_ssize_t); void* (*SetupContext)(const char*, Py_ssize_t, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil)\ if (acquire_gil) {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ PyGILState_Release(__pyx_gilstate_save);\ } else {\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ } #define __Pyx_RefNannyFinishContextNogil() {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __Pyx_RefNannyFinishContext();\ PyGILState_Release(__pyx_gilstate_save);\ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil)\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() #endif #define __Pyx_RefNannyFinishContextNogil() {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __Pyx_RefNannyFinishContext();\ PyGILState_Release(__pyx_gilstate_save);\ } #define __Pyx_RefNannyFinishContext()\ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContextNogil() #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_Py_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; Py_XDECREF(tmp);\ } while (0) #define __Pyx_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_XDECREF(tmp);\ } while (0) #define __Pyx_DECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_DECREF(tmp);\ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) /* PyErrExceptionMatches.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); #else #define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) #endif /* PyThreadStateGet.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; #define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; #if PY_VERSION_HEX >= 0x030C00A6 #define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) #define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) #else #define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) #define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) #endif #else #define __Pyx_PyThreadState_declare #define __Pyx_PyThreadState_assign #define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) #define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() #endif /* PyErrFetchRestore.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) #define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) #define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 #define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) #else #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #endif #else #define __Pyx_PyErr_Clear() PyErr_Clear() #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif /* PyObjectGetAttrStr.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif /* PyObjectGetAttrStrNoError.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); /* GetBuiltinName.proto */ static PyObject *__Pyx_GetBuiltinName(PyObject *name); /* unicode_iter.proto */ static CYTHON_INLINE int __Pyx_init_unicode_iteration( PyObject* ustring, Py_ssize_t *length, void** data, int *kind); /* RaiseUnexpectedTypeError.proto */ static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj); /* PyFunctionFastCall.proto */ #if CYTHON_FAST_PYCALL #if !CYTHON_VECTORCALL #define __Pyx_PyFunction_FastCall(func, args, nargs)\ __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); #endif #define __Pyx_BUILD_ASSERT_EXPR(cond)\ (sizeof(char [1 - 2*!(cond)]) - 1) #ifndef Py_MEMBER_SIZE #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) #endif #if !CYTHON_VECTORCALL #if PY_VERSION_HEX >= 0x03080000 #include "frameobject.h" #if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API #ifndef Py_BUILD_CORE #define Py_BUILD_CORE 1 #endif #include "internal/pycore_frame.h" #endif #define __Pxy_PyFrame_Initialize_Offsets() #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) #else static size_t __pyx_pyframe_localsplus_offset = 0; #include "frameobject.h" #define __Pxy_PyFrame_Initialize_Offsets()\ ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) #define __Pyx_PyFrame_GetLocalsplus(frame)\ (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) #endif #endif #endif /* PyObjectCall.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif /* PyObjectCallMethO.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); #endif /* PyObjectFastCall.proto */ #define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); /* PyObjectCallOneArg.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); /* RaiseException.proto */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /* PyObject_Str.proto */ #define __Pyx_PyObject_Str(obj)\ (likely(PyString_CheckExact(obj)) ? __Pyx_NewRef(obj) : PyObject_Str(obj)) /* PyUnicodeContains.proto */ static CYTHON_INLINE int __Pyx_PyUnicode_ContainsTF(PyObject* substring, PyObject* text, int eq) { int result = PyUnicode_Contains(text, substring); return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); } /* TupleAndListFromArray.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); #endif /* IncludeStringH.proto */ #include /* BytesEquals.proto */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); /* UnicodeEquals.proto */ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); /* fastcall.proto */ #if CYTHON_AVOID_BORROWED_REFS #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) #elif CYTHON_ASSUME_SAFE_MACROS #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) #else #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) #endif #if CYTHON_AVOID_BORROWED_REFS #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) #else #define __Pyx_Arg_NewRef_VARARGS(arg) arg // no-op #define __Pyx_Arg_XDECREF_VARARGS(arg) // no-op - arg is borrowed #endif #define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) #define __Pyx_KwValues_VARARGS(args, nargs) NULL #define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) #define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) #if CYTHON_METH_FASTCALL #define __Pyx_Arg_FASTCALL(args, i) args[i] #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 static CYTHON_UNUSED PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); #else #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) #endif #define __Pyx_Arg_NewRef_FASTCALL(arg) arg // no-op, __Pyx_Arg_FASTCALL is direct and this needs #define __Pyx_Arg_XDECREF_FASTCALL(arg) // no-op - arg was returned from array #else #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) #endif #if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS #define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) #define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) #else #define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) #define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) #endif /* RaiseArgTupleInvalid.proto */ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /* RaiseDoubleKeywords.proto */ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /* ParseKeywords.proto */ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name); /* ArgTypeTest.proto */ #define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ ((likely(__Pyx_IS_TYPE(obj, type) | (none_allowed && (obj == Py_None)))) ? 1 :\ __Pyx__ArgTypeTest(obj, type, name, exact)) static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); /* IterFinish.proto */ static CYTHON_INLINE int __Pyx_IterFinish(void); /* PyObjectCallNoArg.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); /* PyObjectGetMethod.proto */ static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); /* PyObjectCallMethod0.proto */ static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); /* RaiseNeedMoreValuesToUnpack.proto */ static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); /* RaiseTooManyValuesToUnpack.proto */ static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); /* UnpackItemEndCheck.proto */ static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /* RaiseNoneIterError.proto */ static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); /* UnpackTupleError.proto */ static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /* UnpackTuple2.proto */ #define __Pyx_unpack_tuple2(tuple, value1, value2, is_tuple, has_known_size, decref_tuple)\ (likely(is_tuple || PyTuple_Check(tuple)) ?\ (likely(has_known_size || PyTuple_GET_SIZE(tuple) == 2) ?\ __Pyx_unpack_tuple2_exact(tuple, value1, value2, decref_tuple) :\ (__Pyx_UnpackTupleError(tuple, 2), -1)) :\ __Pyx_unpack_tuple2_generic(tuple, value1, value2, has_known_size, decref_tuple)) static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( PyObject* tuple, PyObject** value1, PyObject** value2, int decref_tuple); static int __Pyx_unpack_tuple2_generic( PyObject* tuple, PyObject** value1, PyObject** value2, int has_known_size, int decref_tuple); /* dict_iter.proto */ static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name, Py_ssize_t* p_orig_length, int* p_is_dict); static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos, PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict); /* GetTopmostException.proto */ #if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); #endif /* ReRaiseException.proto */ static CYTHON_INLINE void __Pyx_ReraiseException(void); /* GetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); #endif /* SwapException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #else static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); #endif /* SaveResetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); #else #define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) #define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) #endif /* TypeImport.proto */ #ifndef __PYX_HAVE_RT_ImportType_proto_3_0_5 #define __PYX_HAVE_RT_ImportType_proto_3_0_5 #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L #include #endif #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L #define __PYX_GET_STRUCT_ALIGNMENT_3_0_5(s) alignof(s) #else #define __PYX_GET_STRUCT_ALIGNMENT_3_0_5(s) sizeof(void*) #endif enum __Pyx_ImportType_CheckSize_3_0_5 { __Pyx_ImportType_CheckSize_Error_3_0_5 = 0, __Pyx_ImportType_CheckSize_Warn_3_0_5 = 1, __Pyx_ImportType_CheckSize_Ignore_3_0_5 = 2 }; static PyTypeObject *__Pyx_ImportType_3_0_5(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_5 check_size); #endif /* Import.proto */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); /* ImportFrom.proto */ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); /* PyDictVersioning.proto */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS #define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) #define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ (version_var) = __PYX_GET_DICT_VERSION(dict);\ (cache_var) = (value); #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ (VAR) = __pyx_dict_cached_value;\ } else {\ (VAR) = __pyx_dict_cached_value = (LOOKUP);\ __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ }\ } static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); #else #define __PYX_GET_DICT_VERSION(dict) (0) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); #endif /* GetModuleGlobalName.proto */ #if CYTHON_USE_DICT_VERSIONS #define __Pyx_GetModuleGlobalName(var, name) do {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ } while(0) #define __Pyx_GetModuleGlobalNameUncached(var, name) do {\ PY_UINT64_T __pyx_dict_version;\ PyObject *__pyx_dict_cached_value;\ (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ } while(0) static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); #else #define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) #define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); #endif /* IncludeStructmemberH.proto */ #include /* FixUpExtensionType.proto */ #if CYTHON_USE_TYPE_SPECS static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); #endif /* FetchSharedCythonModule.proto */ static PyObject *__Pyx_FetchSharedCythonABIModule(void); /* FetchCommonType.proto */ #if !CYTHON_USE_TYPE_SPECS static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); #else static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); #endif /* PyMethodNew.proto */ #if CYTHON_COMPILING_IN_LIMITED_API static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; CYTHON_UNUSED_VAR(typ); if (!self) return __Pyx_NewRef(func); typesModule = PyImport_ImportModule("types"); if (!typesModule) return NULL; methodType = PyObject_GetAttrString(typesModule, "MethodType"); Py_DECREF(typesModule); if (!methodType) return NULL; result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); Py_DECREF(methodType); return result; } #elif PY_MAJOR_VERSION >= 3 static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { CYTHON_UNUSED_VAR(typ); if (!self) return __Pyx_NewRef(func); return PyMethod_New(func, self); } #else #define __Pyx_PyMethod_New PyMethod_New #endif /* PyVectorcallFastCallDict.proto */ #if CYTHON_METH_FASTCALL static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); #endif /* CythonFunctionShared.proto */ #define __Pyx_CyFunction_USED #define __Pyx_CYFUNCTION_STATICMETHOD 0x01 #define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 #define __Pyx_CYFUNCTION_CCLASS 0x04 #define __Pyx_CYFUNCTION_COROUTINE 0x08 #define __Pyx_CyFunction_GetClosure(f)\ (((__pyx_CyFunctionObject *) (f))->func_closure) #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_CyFunction_GetClassObj(f)\ (((__pyx_CyFunctionObject *) (f))->func_classobj) #else #define __Pyx_CyFunction_GetClassObj(f)\ ((PyObject*) ((PyCMethodObject *) (f))->mm_class) #endif #define __Pyx_CyFunction_SetClassObj(f, classobj)\ __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) #define __Pyx_CyFunction_Defaults(type, f)\ ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) #define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) typedef struct { #if CYTHON_COMPILING_IN_LIMITED_API PyObject_HEAD PyObject *func; #elif PY_VERSION_HEX < 0x030900B1 PyCFunctionObject func; #else PyCMethodObject func; #endif #if CYTHON_BACKPORT_VECTORCALL __pyx_vectorcallfunc func_vectorcall; #endif #if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API PyObject *func_weakreflist; #endif PyObject *func_dict; PyObject *func_name; PyObject *func_qualname; PyObject *func_doc; PyObject *func_globals; PyObject *func_code; PyObject *func_closure; #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API PyObject *func_classobj; #endif void *defaults; int defaults_pyobjects; size_t defaults_size; // used by FusedFunction for copying defaults int flags; PyObject *defaults_tuple; PyObject *defaults_kwdict; PyObject *(*defaults_getter)(PyObject *); PyObject *func_annotations; PyObject *func_is_coroutine; } __pyx_CyFunctionObject; #undef __Pyx_CyOrPyCFunction_Check #define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) #define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) #define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); #undef __Pyx_IsSameCFunction #define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject *globals, PyObject* code); static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, size_t size, int pyobjects); static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, PyObject *tuple); static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, PyObject *dict); static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, PyObject *dict); static int __pyx_CyFunction_init(PyObject *module); #if CYTHON_METH_FASTCALL static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); #if CYTHON_BACKPORT_VECTORCALL #define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) #else #define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) #endif #endif /* CythonFunction.proto */ static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject *globals, PyObject* code); /* CLineInTraceback.proto */ #ifdef CYTHON_CLINE_IN_TRACEBACK #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) #else static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); #endif /* CodeObjectCache.proto */ #if !CYTHON_COMPILING_IN_LIMITED_API typedef struct { PyCodeObject* code_object; int code_line; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); #endif /* AddTraceback.proto */ static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /* FormatTypeName.proto */ #if CYTHON_COMPILING_IN_LIMITED_API typedef PyObject *__Pyx_TypeName; #define __Pyx_FMT_TYPENAME "%U" static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); #define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) #else typedef const char *__Pyx_TypeName; #define __Pyx_FMT_TYPENAME "%.200s" #define __Pyx_PyType_GetName(tp) ((tp)->tp_name) #define __Pyx_DECREF_TypeName(obj) #endif /* GCCDiagnostics.proto */ #if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #define __Pyx_HAS_GCC_DIAGNOSTIC #endif /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* FastTypeChecks.proto */ #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) #define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); #else #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) #define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) #define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) #endif #define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) #define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) /* CheckBinaryVersion.proto */ static unsigned long __Pyx_get_runtime_version(void); static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); /* InitStrings.proto */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /* #### Code section: module_declarations ### */ /* Module declarations from "libc.string" */ /* Module declarations from "libc.stdio" */ /* Module declarations from "__builtin__" */ /* Module declarations from "cpython.type" */ /* Module declarations from "cpython" */ /* Module declarations from "cpython.object" */ /* Module declarations from "cpython.bytes" */ /* Module declarations from "cpython.exc" */ /* Module declarations from "cpython.mem" */ /* Module declarations from "libc.stdint" */ /* Module declarations from "aiohttp._http_writer" */ static char __pyx_v_7aiohttp_12_http_writer_BUFFER[0x4000]; static PyObject *__pyx_v_7aiohttp_12_http_writer__istr = 0; static CYTHON_INLINE void __pyx_f_7aiohttp_12_http_writer__init_writer(struct __pyx_t_7aiohttp_12_http_writer_Writer *); /*proto*/ static CYTHON_INLINE void __pyx_f_7aiohttp_12_http_writer__release_writer(struct __pyx_t_7aiohttp_12_http_writer_Writer *); /*proto*/ static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_byte(struct __pyx_t_7aiohttp_12_http_writer_Writer *, uint8_t); /*proto*/ static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_utf8(struct __pyx_t_7aiohttp_12_http_writer_Writer *, Py_UCS4); /*proto*/ static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_str(struct __pyx_t_7aiohttp_12_http_writer_Writer *, PyObject *); /*proto*/ static PyObject *__pyx_f_7aiohttp_12_http_writer_to_str(PyObject *); /*proto*/ static void __pyx_f_7aiohttp_12_http_writer__safe_header(PyObject *); /*proto*/ /* #### Code section: typeinfo ### */ /* #### Code section: before_global_var ### */ #define __Pyx_MODULE_NAME "aiohttp._http_writer" extern int __pyx_module_is_main_aiohttp___http_writer; int __pyx_module_is_main_aiohttp___http_writer = 0; /* Implementation of "aiohttp._http_writer" */ /* #### Code section: global_var ### */ static PyObject *__pyx_builtin_TypeError; static PyObject *__pyx_builtin_ValueError; /* #### Code section: string_decls ### */ static const char __pyx_k_[] = "\r"; static const char __pyx_k__2[] = "\n"; static const char __pyx_k__4[] = "."; static const char __pyx_k__7[] = "?"; static const char __pyx_k_key[] = "key"; static const char __pyx_k_ret[] = "ret"; static const char __pyx_k_val[] = "val"; static const char __pyx_k_istr[] = "istr"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_name[] = "__name__"; static const char __pyx_k_test[] = "__test__"; static const char __pyx_k_items[] = "items"; static const char __pyx_k_format[] = "format"; static const char __pyx_k_import[] = "__import__"; static const char __pyx_k_writer[] = "writer"; static const char __pyx_k_headers[] = "headers"; static const char __pyx_k_TypeError[] = "TypeError"; static const char __pyx_k_multidict[] = "multidict"; static const char __pyx_k_ValueError[] = "ValueError"; static const char __pyx_k_status_line[] = "status_line"; static const char __pyx_k_is_coroutine[] = "_is_coroutine"; static const char __pyx_k_serialize_headers[] = "_serialize_headers"; static const char __pyx_k_asyncio_coroutines[] = "asyncio.coroutines"; static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; static const char __pyx_k_aiohttp__http_writer[] = "aiohttp._http_writer"; static const char __pyx_k_aiohttp__http_writer_pyx[] = "aiohttp/_http_writer.pyx"; static const char __pyx_k_Cannot_serialize_non_str_key_r[] = "Cannot serialize non-str key {!r}"; static const char __pyx_k_Newline_or_carriage_return_chara[] = "Newline or carriage return character detected in HTTP status message or header. This is a potential security issue."; /* #### Code section: decls ### */ static PyObject *__pyx_pf_7aiohttp_12_http_writer__serialize_headers(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_status_line, PyObject *__pyx_v_headers); /* proto */ /* #### Code section: late_includes ### */ /* #### Code section: module_state ### */ typedef struct { PyObject *__pyx_d; PyObject *__pyx_b; PyObject *__pyx_cython_runtime; PyObject *__pyx_empty_tuple; PyObject *__pyx_empty_bytes; PyObject *__pyx_empty_unicode; #ifdef __Pyx_CyFunction_USED PyTypeObject *__pyx_CyFunctionType; #endif #ifdef __Pyx_FusedFunction_USED PyTypeObject *__pyx_FusedFunctionType; #endif #ifdef __Pyx_Generator_USED PyTypeObject *__pyx_GeneratorType; #endif #ifdef __Pyx_IterableCoroutine_USED PyTypeObject *__pyx_IterableCoroutineType; #endif #ifdef __Pyx_Coroutine_USED PyTypeObject *__pyx_CoroutineAwaitType; #endif #ifdef __Pyx_Coroutine_USED PyTypeObject *__pyx_CoroutineType; #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif PyTypeObject *__pyx_ptype_7cpython_4type_type; #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif PyObject *__pyx_kp_u_; PyObject *__pyx_kp_u_Cannot_serialize_non_str_key_r; PyObject *__pyx_kp_u_Newline_or_carriage_return_chara; PyObject *__pyx_n_s_TypeError; PyObject *__pyx_n_s_ValueError; PyObject *__pyx_kp_u__2; PyObject *__pyx_kp_u__4; PyObject *__pyx_n_s__7; PyObject *__pyx_n_s_aiohttp__http_writer; PyObject *__pyx_kp_s_aiohttp__http_writer_pyx; PyObject *__pyx_n_s_asyncio_coroutines; PyObject *__pyx_n_s_cline_in_traceback; PyObject *__pyx_n_s_format; PyObject *__pyx_n_s_headers; PyObject *__pyx_n_s_import; PyObject *__pyx_n_s_is_coroutine; PyObject *__pyx_n_s_istr; PyObject *__pyx_n_s_items; PyObject *__pyx_n_s_key; PyObject *__pyx_n_s_main; PyObject *__pyx_n_s_multidict; PyObject *__pyx_n_s_name; PyObject *__pyx_n_s_ret; PyObject *__pyx_n_s_serialize_headers; PyObject *__pyx_n_s_status_line; PyObject *__pyx_n_s_test; PyObject *__pyx_n_s_val; PyObject *__pyx_n_s_writer; PyObject *__pyx_tuple__3; PyObject *__pyx_tuple__5; PyObject *__pyx_codeobj__6; } __pyx_mstate; #if CYTHON_USE_MODULE_STATE #ifdef __cplusplus namespace { extern struct PyModuleDef __pyx_moduledef; } /* anonymous namespace */ #else static struct PyModuleDef __pyx_moduledef; #endif #define __pyx_mstate(o) ((__pyx_mstate *)__Pyx_PyModule_GetState(o)) #define __pyx_mstate_global (__pyx_mstate(PyState_FindModule(&__pyx_moduledef))) #define __pyx_m (PyState_FindModule(&__pyx_moduledef)) #else static __pyx_mstate __pyx_mstate_global_static = #ifdef __cplusplus {}; #else {0}; #endif static __pyx_mstate *__pyx_mstate_global = &__pyx_mstate_global_static; #endif /* #### Code section: module_state_clear ### */ #if CYTHON_USE_MODULE_STATE static int __pyx_m_clear(PyObject *m) { __pyx_mstate *clear_module_state = __pyx_mstate(m); if (!clear_module_state) return 0; Py_CLEAR(clear_module_state->__pyx_d); Py_CLEAR(clear_module_state->__pyx_b); Py_CLEAR(clear_module_state->__pyx_cython_runtime); Py_CLEAR(clear_module_state->__pyx_empty_tuple); Py_CLEAR(clear_module_state->__pyx_empty_bytes); Py_CLEAR(clear_module_state->__pyx_empty_unicode); #ifdef __Pyx_CyFunction_USED Py_CLEAR(clear_module_state->__pyx_CyFunctionType); #endif #ifdef __Pyx_FusedFunction_USED Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); #endif Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4type_type); Py_CLEAR(clear_module_state->__pyx_kp_u_); Py_CLEAR(clear_module_state->__pyx_kp_u_Cannot_serialize_non_str_key_r); Py_CLEAR(clear_module_state->__pyx_kp_u_Newline_or_carriage_return_chara); Py_CLEAR(clear_module_state->__pyx_n_s_TypeError); Py_CLEAR(clear_module_state->__pyx_n_s_ValueError); Py_CLEAR(clear_module_state->__pyx_kp_u__2); Py_CLEAR(clear_module_state->__pyx_kp_u__4); Py_CLEAR(clear_module_state->__pyx_n_s__7); Py_CLEAR(clear_module_state->__pyx_n_s_aiohttp__http_writer); Py_CLEAR(clear_module_state->__pyx_kp_s_aiohttp__http_writer_pyx); Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); Py_CLEAR(clear_module_state->__pyx_n_s_format); Py_CLEAR(clear_module_state->__pyx_n_s_headers); Py_CLEAR(clear_module_state->__pyx_n_s_import); Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); Py_CLEAR(clear_module_state->__pyx_n_s_istr); Py_CLEAR(clear_module_state->__pyx_n_s_items); Py_CLEAR(clear_module_state->__pyx_n_s_key); Py_CLEAR(clear_module_state->__pyx_n_s_main); Py_CLEAR(clear_module_state->__pyx_n_s_multidict); Py_CLEAR(clear_module_state->__pyx_n_s_name); Py_CLEAR(clear_module_state->__pyx_n_s_ret); Py_CLEAR(clear_module_state->__pyx_n_s_serialize_headers); Py_CLEAR(clear_module_state->__pyx_n_s_status_line); Py_CLEAR(clear_module_state->__pyx_n_s_test); Py_CLEAR(clear_module_state->__pyx_n_s_val); Py_CLEAR(clear_module_state->__pyx_n_s_writer); Py_CLEAR(clear_module_state->__pyx_tuple__3); Py_CLEAR(clear_module_state->__pyx_tuple__5); Py_CLEAR(clear_module_state->__pyx_codeobj__6); return 0; } #endif /* #### Code section: module_state_traverse ### */ #if CYTHON_USE_MODULE_STATE static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { __pyx_mstate *traverse_module_state = __pyx_mstate(m); if (!traverse_module_state) return 0; Py_VISIT(traverse_module_state->__pyx_d); Py_VISIT(traverse_module_state->__pyx_b); Py_VISIT(traverse_module_state->__pyx_cython_runtime); Py_VISIT(traverse_module_state->__pyx_empty_tuple); Py_VISIT(traverse_module_state->__pyx_empty_bytes); Py_VISIT(traverse_module_state->__pyx_empty_unicode); #ifdef __Pyx_CyFunction_USED Py_VISIT(traverse_module_state->__pyx_CyFunctionType); #endif #ifdef __Pyx_FusedFunction_USED Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); #endif Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4type_type); Py_VISIT(traverse_module_state->__pyx_kp_u_); Py_VISIT(traverse_module_state->__pyx_kp_u_Cannot_serialize_non_str_key_r); Py_VISIT(traverse_module_state->__pyx_kp_u_Newline_or_carriage_return_chara); Py_VISIT(traverse_module_state->__pyx_n_s_TypeError); Py_VISIT(traverse_module_state->__pyx_n_s_ValueError); Py_VISIT(traverse_module_state->__pyx_kp_u__2); Py_VISIT(traverse_module_state->__pyx_kp_u__4); Py_VISIT(traverse_module_state->__pyx_n_s__7); Py_VISIT(traverse_module_state->__pyx_n_s_aiohttp__http_writer); Py_VISIT(traverse_module_state->__pyx_kp_s_aiohttp__http_writer_pyx); Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); Py_VISIT(traverse_module_state->__pyx_n_s_format); Py_VISIT(traverse_module_state->__pyx_n_s_headers); Py_VISIT(traverse_module_state->__pyx_n_s_import); Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); Py_VISIT(traverse_module_state->__pyx_n_s_istr); Py_VISIT(traverse_module_state->__pyx_n_s_items); Py_VISIT(traverse_module_state->__pyx_n_s_key); Py_VISIT(traverse_module_state->__pyx_n_s_main); Py_VISIT(traverse_module_state->__pyx_n_s_multidict); Py_VISIT(traverse_module_state->__pyx_n_s_name); Py_VISIT(traverse_module_state->__pyx_n_s_ret); Py_VISIT(traverse_module_state->__pyx_n_s_serialize_headers); Py_VISIT(traverse_module_state->__pyx_n_s_status_line); Py_VISIT(traverse_module_state->__pyx_n_s_test); Py_VISIT(traverse_module_state->__pyx_n_s_val); Py_VISIT(traverse_module_state->__pyx_n_s_writer); Py_VISIT(traverse_module_state->__pyx_tuple__3); Py_VISIT(traverse_module_state->__pyx_tuple__5); Py_VISIT(traverse_module_state->__pyx_codeobj__6); return 0; } #endif /* #### Code section: module_state_defines ### */ #define __pyx_d __pyx_mstate_global->__pyx_d #define __pyx_b __pyx_mstate_global->__pyx_b #define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime #define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple #define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes #define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode #ifdef __Pyx_CyFunction_USED #define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType #endif #ifdef __Pyx_FusedFunction_USED #define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType #endif #ifdef __Pyx_Generator_USED #define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType #endif #ifdef __Pyx_IterableCoroutine_USED #define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType #endif #ifdef __Pyx_Coroutine_USED #define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType #endif #ifdef __Pyx_Coroutine_USED #define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #define __pyx_ptype_7cpython_4type_type __pyx_mstate_global->__pyx_ptype_7cpython_4type_type #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #define __pyx_kp_u_ __pyx_mstate_global->__pyx_kp_u_ #define __pyx_kp_u_Cannot_serialize_non_str_key_r __pyx_mstate_global->__pyx_kp_u_Cannot_serialize_non_str_key_r #define __pyx_kp_u_Newline_or_carriage_return_chara __pyx_mstate_global->__pyx_kp_u_Newline_or_carriage_return_chara #define __pyx_n_s_TypeError __pyx_mstate_global->__pyx_n_s_TypeError #define __pyx_n_s_ValueError __pyx_mstate_global->__pyx_n_s_ValueError #define __pyx_kp_u__2 __pyx_mstate_global->__pyx_kp_u__2 #define __pyx_kp_u__4 __pyx_mstate_global->__pyx_kp_u__4 #define __pyx_n_s__7 __pyx_mstate_global->__pyx_n_s__7 #define __pyx_n_s_aiohttp__http_writer __pyx_mstate_global->__pyx_n_s_aiohttp__http_writer #define __pyx_kp_s_aiohttp__http_writer_pyx __pyx_mstate_global->__pyx_kp_s_aiohttp__http_writer_pyx #define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines #define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback #define __pyx_n_s_format __pyx_mstate_global->__pyx_n_s_format #define __pyx_n_s_headers __pyx_mstate_global->__pyx_n_s_headers #define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import #define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine #define __pyx_n_s_istr __pyx_mstate_global->__pyx_n_s_istr #define __pyx_n_s_items __pyx_mstate_global->__pyx_n_s_items #define __pyx_n_s_key __pyx_mstate_global->__pyx_n_s_key #define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main #define __pyx_n_s_multidict __pyx_mstate_global->__pyx_n_s_multidict #define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name #define __pyx_n_s_ret __pyx_mstate_global->__pyx_n_s_ret #define __pyx_n_s_serialize_headers __pyx_mstate_global->__pyx_n_s_serialize_headers #define __pyx_n_s_status_line __pyx_mstate_global->__pyx_n_s_status_line #define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test #define __pyx_n_s_val __pyx_mstate_global->__pyx_n_s_val #define __pyx_n_s_writer __pyx_mstate_global->__pyx_n_s_writer #define __pyx_tuple__3 __pyx_mstate_global->__pyx_tuple__3 #define __pyx_tuple__5 __pyx_mstate_global->__pyx_tuple__5 #define __pyx_codeobj__6 __pyx_mstate_global->__pyx_codeobj__6 /* #### Code section: module_code ### */ /* "aiohttp/_http_writer.pyx":24 * * * cdef inline void _init_writer(Writer* writer): # <<<<<<<<<<<<<< * writer.buf = &BUFFER[0] * writer.size = BUF_SIZE */ static CYTHON_INLINE void __pyx_f_7aiohttp_12_http_writer__init_writer(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer) { /* "aiohttp/_http_writer.pyx":25 * * cdef inline void _init_writer(Writer* writer): * writer.buf = &BUFFER[0] # <<<<<<<<<<<<<< * writer.size = BUF_SIZE * writer.pos = 0 */ __pyx_v_writer->buf = (&(__pyx_v_7aiohttp_12_http_writer_BUFFER[0])); /* "aiohttp/_http_writer.pyx":26 * cdef inline void _init_writer(Writer* writer): * writer.buf = &BUFFER[0] * writer.size = BUF_SIZE # <<<<<<<<<<<<<< * writer.pos = 0 * */ __pyx_v_writer->size = 0x4000; /* "aiohttp/_http_writer.pyx":27 * writer.buf = &BUFFER[0] * writer.size = BUF_SIZE * writer.pos = 0 # <<<<<<<<<<<<<< * * */ __pyx_v_writer->pos = 0; /* "aiohttp/_http_writer.pyx":24 * * * cdef inline void _init_writer(Writer* writer): # <<<<<<<<<<<<<< * writer.buf = &BUFFER[0] * writer.size = BUF_SIZE */ /* function exit code */ } /* "aiohttp/_http_writer.pyx":30 * * * cdef inline void _release_writer(Writer* writer): # <<<<<<<<<<<<<< * if writer.buf != BUFFER: * PyMem_Free(writer.buf) */ static CYTHON_INLINE void __pyx_f_7aiohttp_12_http_writer__release_writer(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer) { int __pyx_t_1; /* "aiohttp/_http_writer.pyx":31 * * cdef inline void _release_writer(Writer* writer): * if writer.buf != BUFFER: # <<<<<<<<<<<<<< * PyMem_Free(writer.buf) * */ __pyx_t_1 = (__pyx_v_writer->buf != __pyx_v_7aiohttp_12_http_writer_BUFFER); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":32 * cdef inline void _release_writer(Writer* writer): * if writer.buf != BUFFER: * PyMem_Free(writer.buf) # <<<<<<<<<<<<<< * * */ PyMem_Free(__pyx_v_writer->buf); /* "aiohttp/_http_writer.pyx":31 * * cdef inline void _release_writer(Writer* writer): * if writer.buf != BUFFER: # <<<<<<<<<<<<<< * PyMem_Free(writer.buf) * */ } /* "aiohttp/_http_writer.pyx":30 * * * cdef inline void _release_writer(Writer* writer): # <<<<<<<<<<<<<< * if writer.buf != BUFFER: * PyMem_Free(writer.buf) */ /* function exit code */ } /* "aiohttp/_http_writer.pyx":35 * * * cdef inline int _write_byte(Writer* writer, uint8_t ch): # <<<<<<<<<<<<<< * cdef char * buf * cdef Py_ssize_t size */ static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_byte(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer, uint8_t __pyx_v_ch) { char *__pyx_v_buf; Py_ssize_t __pyx_v_size; int __pyx_r; int __pyx_t_1; PyObject *__pyx_t_2; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; /* "aiohttp/_http_writer.pyx":39 * cdef Py_ssize_t size * * if writer.pos == writer.size: # <<<<<<<<<<<<<< * # reallocate * size = writer.size + BUF_SIZE */ __pyx_t_1 = (__pyx_v_writer->pos == __pyx_v_writer->size); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":41 * if writer.pos == writer.size: * # reallocate * size = writer.size + BUF_SIZE # <<<<<<<<<<<<<< * if writer.buf == BUFFER: * buf = PyMem_Malloc(size) */ __pyx_v_size = (__pyx_v_writer->size + 0x4000); /* "aiohttp/_http_writer.pyx":42 * # reallocate * size = writer.size + BUF_SIZE * if writer.buf == BUFFER: # <<<<<<<<<<<<<< * buf = PyMem_Malloc(size) * if buf == NULL: */ __pyx_t_1 = (__pyx_v_writer->buf == __pyx_v_7aiohttp_12_http_writer_BUFFER); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":43 * size = writer.size + BUF_SIZE * if writer.buf == BUFFER: * buf = PyMem_Malloc(size) # <<<<<<<<<<<<<< * if buf == NULL: * PyErr_NoMemory() */ __pyx_v_buf = ((char *)PyMem_Malloc(__pyx_v_size)); /* "aiohttp/_http_writer.pyx":44 * if writer.buf == BUFFER: * buf = PyMem_Malloc(size) * if buf == NULL: # <<<<<<<<<<<<<< * PyErr_NoMemory() * return -1 */ __pyx_t_1 = (__pyx_v_buf == NULL); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":45 * buf = PyMem_Malloc(size) * if buf == NULL: * PyErr_NoMemory() # <<<<<<<<<<<<<< * return -1 * memcpy(buf, writer.buf, writer.size) */ __pyx_t_2 = PyErr_NoMemory(); if (unlikely(__pyx_t_2 == ((PyObject *)NULL))) __PYX_ERR(0, 45, __pyx_L1_error) /* "aiohttp/_http_writer.pyx":46 * if buf == NULL: * PyErr_NoMemory() * return -1 # <<<<<<<<<<<<<< * memcpy(buf, writer.buf, writer.size) * else: */ __pyx_r = -1; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":44 * if writer.buf == BUFFER: * buf = PyMem_Malloc(size) * if buf == NULL: # <<<<<<<<<<<<<< * PyErr_NoMemory() * return -1 */ } /* "aiohttp/_http_writer.pyx":47 * PyErr_NoMemory() * return -1 * memcpy(buf, writer.buf, writer.size) # <<<<<<<<<<<<<< * else: * buf = PyMem_Realloc(writer.buf, size) */ (void)(memcpy(__pyx_v_buf, __pyx_v_writer->buf, __pyx_v_writer->size)); /* "aiohttp/_http_writer.pyx":42 * # reallocate * size = writer.size + BUF_SIZE * if writer.buf == BUFFER: # <<<<<<<<<<<<<< * buf = PyMem_Malloc(size) * if buf == NULL: */ goto __pyx_L4; } /* "aiohttp/_http_writer.pyx":49 * memcpy(buf, writer.buf, writer.size) * else: * buf = PyMem_Realloc(writer.buf, size) # <<<<<<<<<<<<<< * if buf == NULL: * PyErr_NoMemory() */ /*else*/ { __pyx_v_buf = ((char *)PyMem_Realloc(__pyx_v_writer->buf, __pyx_v_size)); /* "aiohttp/_http_writer.pyx":50 * else: * buf = PyMem_Realloc(writer.buf, size) * if buf == NULL: # <<<<<<<<<<<<<< * PyErr_NoMemory() * return -1 */ __pyx_t_1 = (__pyx_v_buf == NULL); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":51 * buf = PyMem_Realloc(writer.buf, size) * if buf == NULL: * PyErr_NoMemory() # <<<<<<<<<<<<<< * return -1 * writer.buf = buf */ __pyx_t_2 = PyErr_NoMemory(); if (unlikely(__pyx_t_2 == ((PyObject *)NULL))) __PYX_ERR(0, 51, __pyx_L1_error) /* "aiohttp/_http_writer.pyx":52 * if buf == NULL: * PyErr_NoMemory() * return -1 # <<<<<<<<<<<<<< * writer.buf = buf * writer.size = size */ __pyx_r = -1; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":50 * else: * buf = PyMem_Realloc(writer.buf, size) * if buf == NULL: # <<<<<<<<<<<<<< * PyErr_NoMemory() * return -1 */ } } __pyx_L4:; /* "aiohttp/_http_writer.pyx":53 * PyErr_NoMemory() * return -1 * writer.buf = buf # <<<<<<<<<<<<<< * writer.size = size * writer.buf[writer.pos] = ch */ __pyx_v_writer->buf = __pyx_v_buf; /* "aiohttp/_http_writer.pyx":54 * return -1 * writer.buf = buf * writer.size = size # <<<<<<<<<<<<<< * writer.buf[writer.pos] = ch * writer.pos += 1 */ __pyx_v_writer->size = __pyx_v_size; /* "aiohttp/_http_writer.pyx":39 * cdef Py_ssize_t size * * if writer.pos == writer.size: # <<<<<<<<<<<<<< * # reallocate * size = writer.size + BUF_SIZE */ } /* "aiohttp/_http_writer.pyx":55 * writer.buf = buf * writer.size = size * writer.buf[writer.pos] = ch # <<<<<<<<<<<<<< * writer.pos += 1 * return 0 */ (__pyx_v_writer->buf[__pyx_v_writer->pos]) = ((char)__pyx_v_ch); /* "aiohttp/_http_writer.pyx":56 * writer.size = size * writer.buf[writer.pos] = ch * writer.pos += 1 # <<<<<<<<<<<<<< * return 0 * */ __pyx_v_writer->pos = (__pyx_v_writer->pos + 1); /* "aiohttp/_http_writer.pyx":57 * writer.buf[writer.pos] = ch * writer.pos += 1 * return 0 # <<<<<<<<<<<<<< * * */ __pyx_r = 0; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":35 * * * cdef inline int _write_byte(Writer* writer, uint8_t ch): # <<<<<<<<<<<<<< * cdef char * buf * cdef Py_ssize_t size */ /* function exit code */ __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_writer._write_byte", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; return __pyx_r; } /* "aiohttp/_http_writer.pyx":60 * * * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): # <<<<<<<<<<<<<< * cdef uint64_t utf = symbol * */ static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_utf8(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer, Py_UCS4 __pyx_v_symbol) { uint64_t __pyx_v_utf; int __pyx_r; int __pyx_t_1; int __pyx_t_2; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; /* "aiohttp/_http_writer.pyx":61 * * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): * cdef uint64_t utf = symbol # <<<<<<<<<<<<<< * * if utf < 0x80: */ __pyx_v_utf = ((uint64_t)__pyx_v_symbol); /* "aiohttp/_http_writer.pyx":63 * cdef uint64_t utf = symbol * * if utf < 0x80: # <<<<<<<<<<<<<< * return _write_byte(writer, utf) * elif utf < 0x800: */ __pyx_t_1 = (__pyx_v_utf < 0x80); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":64 * * if utf < 0x80: * return _write_byte(writer, utf) # <<<<<<<<<<<<<< * elif utf < 0x800: * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: */ __pyx_t_2 = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)__pyx_v_utf)); if (unlikely(__pyx_t_2 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 64, __pyx_L1_error) __pyx_r = __pyx_t_2; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":63 * cdef uint64_t utf = symbol * * if utf < 0x80: # <<<<<<<<<<<<<< * return _write_byte(writer, utf) * elif utf < 0x800: */ } /* "aiohttp/_http_writer.pyx":65 * if utf < 0x80: * return _write_byte(writer, utf) * elif utf < 0x800: # <<<<<<<<<<<<<< * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: * return -1 */ __pyx_t_1 = (__pyx_v_utf < 0x800); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":66 * return _write_byte(writer, utf) * elif utf < 0x800: * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) */ __pyx_t_2 = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0xc0 | (__pyx_v_utf >> 6)))); if (unlikely(__pyx_t_2 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 66, __pyx_L1_error) __pyx_t_1 = (__pyx_t_2 < 0); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":67 * elif utf < 0x800: * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: * return -1 # <<<<<<<<<<<<<< * return _write_byte(writer, (0x80 | (utf & 0x3f))) * elif 0xD800 <= utf <= 0xDFFF: */ __pyx_r = -1; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":66 * return _write_byte(writer, utf) * elif utf < 0x800: * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) */ } /* "aiohttp/_http_writer.pyx":68 * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) # <<<<<<<<<<<<<< * elif 0xD800 <= utf <= 0xDFFF: * # surogate pair, ignored */ __pyx_t_2 = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f)))); if (unlikely(__pyx_t_2 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 68, __pyx_L1_error) __pyx_r = __pyx_t_2; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":65 * if utf < 0x80: * return _write_byte(writer, utf) * elif utf < 0x800: # <<<<<<<<<<<<<< * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: * return -1 */ } /* "aiohttp/_http_writer.pyx":69 * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) * elif 0xD800 <= utf <= 0xDFFF: # <<<<<<<<<<<<<< * # surogate pair, ignored * return 0 */ __pyx_t_1 = (0xD800 <= __pyx_v_utf); if (__pyx_t_1) { __pyx_t_1 = (__pyx_v_utf <= 0xDFFF); } if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":71 * elif 0xD800 <= utf <= 0xDFFF: * # surogate pair, ignored * return 0 # <<<<<<<<<<<<<< * elif utf < 0x10000: * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: */ __pyx_r = 0; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":69 * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) * elif 0xD800 <= utf <= 0xDFFF: # <<<<<<<<<<<<<< * # surogate pair, ignored * return 0 */ } /* "aiohttp/_http_writer.pyx":72 * # surogate pair, ignored * return 0 * elif utf < 0x10000: # <<<<<<<<<<<<<< * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: * return -1 */ __pyx_t_1 = (__pyx_v_utf < 0x10000); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":73 * return 0 * elif utf < 0x10000: * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: */ __pyx_t_2 = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0xe0 | (__pyx_v_utf >> 12)))); if (unlikely(__pyx_t_2 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 73, __pyx_L1_error) __pyx_t_1 = (__pyx_t_2 < 0); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":74 * elif utf < 0x10000: * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: * return -1 # <<<<<<<<<<<<<< * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: * return -1 */ __pyx_r = -1; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":73 * return 0 * elif utf < 0x10000: * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: */ } /* "aiohttp/_http_writer.pyx":75 * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: * return -1 * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) */ __pyx_t_2 = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 6) & 0x3f)))); if (unlikely(__pyx_t_2 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 75, __pyx_L1_error) __pyx_t_1 = (__pyx_t_2 < 0); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":76 * return -1 * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: * return -1 # <<<<<<<<<<<<<< * return _write_byte(writer, (0x80 | (utf & 0x3f))) * elif utf > 0x10FFFF: */ __pyx_r = -1; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":75 * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: * return -1 * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) */ } /* "aiohttp/_http_writer.pyx":77 * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) # <<<<<<<<<<<<<< * elif utf > 0x10FFFF: * # symbol is too large */ __pyx_t_2 = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f)))); if (unlikely(__pyx_t_2 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 77, __pyx_L1_error) __pyx_r = __pyx_t_2; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":72 * # surogate pair, ignored * return 0 * elif utf < 0x10000: # <<<<<<<<<<<<<< * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: * return -1 */ } /* "aiohttp/_http_writer.pyx":78 * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) * elif utf > 0x10FFFF: # <<<<<<<<<<<<<< * # symbol is too large * return 0 */ __pyx_t_1 = (__pyx_v_utf > 0x10FFFF); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":80 * elif utf > 0x10FFFF: * # symbol is too large * return 0 # <<<<<<<<<<<<<< * else: * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: */ __pyx_r = 0; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":78 * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) * elif utf > 0x10FFFF: # <<<<<<<<<<<<<< * # symbol is too large * return 0 */ } /* "aiohttp/_http_writer.pyx":82 * return 0 * else: * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_byte(writer, */ /*else*/ { __pyx_t_2 = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0xf0 | (__pyx_v_utf >> 18)))); if (unlikely(__pyx_t_2 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 82, __pyx_L1_error) __pyx_t_1 = (__pyx_t_2 < 0); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":83 * else: * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: * return -1 # <<<<<<<<<<<<<< * if _write_byte(writer, * (0x80 | ((utf >> 12) & 0x3f))) < 0: */ __pyx_r = -1; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":82 * return 0 * else: * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_byte(writer, */ } /* "aiohttp/_http_writer.pyx":84 * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: * return -1 * if _write_byte(writer, # <<<<<<<<<<<<<< * (0x80 | ((utf >> 12) & 0x3f))) < 0: * return -1 */ __pyx_t_2 = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 12) & 0x3f)))); if (unlikely(__pyx_t_2 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 84, __pyx_L1_error) /* "aiohttp/_http_writer.pyx":85 * return -1 * if _write_byte(writer, * (0x80 | ((utf >> 12) & 0x3f))) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_byte(writer, */ __pyx_t_1 = (__pyx_t_2 < 0); /* "aiohttp/_http_writer.pyx":84 * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: * return -1 * if _write_byte(writer, # <<<<<<<<<<<<<< * (0x80 | ((utf >> 12) & 0x3f))) < 0: * return -1 */ if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":86 * if _write_byte(writer, * (0x80 | ((utf >> 12) & 0x3f))) < 0: * return -1 # <<<<<<<<<<<<<< * if _write_byte(writer, * (0x80 | ((utf >> 6) & 0x3f))) < 0: */ __pyx_r = -1; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":84 * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: * return -1 * if _write_byte(writer, # <<<<<<<<<<<<<< * (0x80 | ((utf >> 12) & 0x3f))) < 0: * return -1 */ } /* "aiohttp/_http_writer.pyx":87 * (0x80 | ((utf >> 12) & 0x3f))) < 0: * return -1 * if _write_byte(writer, # <<<<<<<<<<<<<< * (0x80 | ((utf >> 6) & 0x3f))) < 0: * return -1 */ __pyx_t_2 = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 6) & 0x3f)))); if (unlikely(__pyx_t_2 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 87, __pyx_L1_error) /* "aiohttp/_http_writer.pyx":88 * return -1 * if _write_byte(writer, * (0x80 | ((utf >> 6) & 0x3f))) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) */ __pyx_t_1 = (__pyx_t_2 < 0); /* "aiohttp/_http_writer.pyx":87 * (0x80 | ((utf >> 12) & 0x3f))) < 0: * return -1 * if _write_byte(writer, # <<<<<<<<<<<<<< * (0x80 | ((utf >> 6) & 0x3f))) < 0: * return -1 */ if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":89 * if _write_byte(writer, * (0x80 | ((utf >> 6) & 0x3f))) < 0: * return -1 # <<<<<<<<<<<<<< * return _write_byte(writer, (0x80 | (utf & 0x3f))) * */ __pyx_r = -1; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":87 * (0x80 | ((utf >> 12) & 0x3f))) < 0: * return -1 * if _write_byte(writer, # <<<<<<<<<<<<<< * (0x80 | ((utf >> 6) & 0x3f))) < 0: * return -1 */ } /* "aiohttp/_http_writer.pyx":90 * (0x80 | ((utf >> 6) & 0x3f))) < 0: * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) # <<<<<<<<<<<<<< * * */ __pyx_t_2 = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f)))); if (unlikely(__pyx_t_2 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 90, __pyx_L1_error) __pyx_r = __pyx_t_2; goto __pyx_L0; } /* "aiohttp/_http_writer.pyx":60 * * * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): # <<<<<<<<<<<<<< * cdef uint64_t utf = symbol * */ /* function exit code */ __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_writer._write_utf8", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; return __pyx_r; } /* "aiohttp/_http_writer.pyx":93 * * * cdef inline int _write_str(Writer* writer, str s): # <<<<<<<<<<<<<< * cdef Py_UCS4 ch * for ch in s: */ static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_str(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer, PyObject *__pyx_v_s) { Py_UCS4 __pyx_v_ch; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; Py_ssize_t __pyx_t_3; void *__pyx_t_4; int __pyx_t_5; int __pyx_t_6; Py_ssize_t __pyx_t_7; int __pyx_t_8; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_write_str", 1); /* "aiohttp/_http_writer.pyx":95 * cdef inline int _write_str(Writer* writer, str s): * cdef Py_UCS4 ch * for ch in s: # <<<<<<<<<<<<<< * if _write_utf8(writer, ch) < 0: * return -1 */ if (unlikely(__pyx_v_s == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); __PYX_ERR(0, 95, __pyx_L1_error) } __Pyx_INCREF(__pyx_v_s); __pyx_t_1 = __pyx_v_s; __pyx_t_6 = __Pyx_init_unicode_iteration(__pyx_t_1, (&__pyx_t_3), (&__pyx_t_4), (&__pyx_t_5)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 95, __pyx_L1_error) for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_3; __pyx_t_7++) { __pyx_t_2 = __pyx_t_7; __pyx_v_ch = __Pyx_PyUnicode_READ(__pyx_t_5, __pyx_t_4, __pyx_t_2); /* "aiohttp/_http_writer.pyx":96 * cdef Py_UCS4 ch * for ch in s: * if _write_utf8(writer, ch) < 0: # <<<<<<<<<<<<<< * return -1 * */ __pyx_t_6 = __pyx_f_7aiohttp_12_http_writer__write_utf8(__pyx_v_writer, __pyx_v_ch); if (unlikely(__pyx_t_6 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 96, __pyx_L1_error) __pyx_t_8 = (__pyx_t_6 < 0); if (__pyx_t_8) { /* "aiohttp/_http_writer.pyx":97 * for ch in s: * if _write_utf8(writer, ch) < 0: * return -1 # <<<<<<<<<<<<<< * * */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":96 * cdef Py_UCS4 ch * for ch in s: * if _write_utf8(writer, ch) < 0: # <<<<<<<<<<<<<< * return -1 * */ } } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_writer.pyx":93 * * * cdef inline int _write_str(Writer* writer, str s): # <<<<<<<<<<<<<< * cdef Py_UCS4 ch * for ch in s: */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_writer._write_str", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_writer.pyx":102 * # --------------- _serialize_headers ---------------------- * * cdef str to_str(object s): # <<<<<<<<<<<<<< * typ = type(s) * if typ is str: */ static PyObject *__pyx_f_7aiohttp_12_http_writer_to_str(PyObject *__pyx_v_s) { PyTypeObject *__pyx_v_typ = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("to_str", 1); /* "aiohttp/_http_writer.pyx":103 * * cdef str to_str(object s): * typ = type(s) # <<<<<<<<<<<<<< * if typ is str: * return s */ __Pyx_INCREF(((PyObject *)Py_TYPE(__pyx_v_s))); __pyx_v_typ = ((PyTypeObject*)((PyObject *)Py_TYPE(__pyx_v_s))); /* "aiohttp/_http_writer.pyx":104 * cdef str to_str(object s): * typ = type(s) * if typ is str: # <<<<<<<<<<<<<< * return s * elif typ is _istr: */ __pyx_t_1 = (__pyx_v_typ == (&PyUnicode_Type)); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":105 * typ = type(s) * if typ is str: * return s # <<<<<<<<<<<<<< * elif typ is _istr: * return PyObject_Str(s) */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject*)__pyx_v_s)); __pyx_r = ((PyObject*)__pyx_v_s); goto __pyx_L0; /* "aiohttp/_http_writer.pyx":104 * cdef str to_str(object s): * typ = type(s) * if typ is str: # <<<<<<<<<<<<<< * return s * elif typ is _istr: */ } /* "aiohttp/_http_writer.pyx":106 * if typ is str: * return s * elif typ is _istr: # <<<<<<<<<<<<<< * return PyObject_Str(s) * elif not isinstance(s, str): */ __pyx_t_1 = (__pyx_v_typ == ((PyTypeObject*)__pyx_v_7aiohttp_12_http_writer__istr)); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":107 * return s * elif typ is _istr: * return PyObject_Str(s) # <<<<<<<<<<<<<< * elif not isinstance(s, str): * raise TypeError("Cannot serialize non-str key {!r}".format(s)) */ __Pyx_XDECREF(__pyx_r); __pyx_t_2 = PyObject_Str(__pyx_v_s); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 107, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (!(likely(PyUnicode_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None) || __Pyx_RaiseUnexpectedTypeError("unicode", __pyx_t_2))) __PYX_ERR(0, 107, __pyx_L1_error) __pyx_r = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":106 * if typ is str: * return s * elif typ is _istr: # <<<<<<<<<<<<<< * return PyObject_Str(s) * elif not isinstance(s, str): */ } /* "aiohttp/_http_writer.pyx":108 * elif typ is _istr: * return PyObject_Str(s) * elif not isinstance(s, str): # <<<<<<<<<<<<<< * raise TypeError("Cannot serialize non-str key {!r}".format(s)) * else: */ __pyx_t_1 = PyUnicode_Check(__pyx_v_s); __pyx_t_3 = (!__pyx_t_1); if (unlikely(__pyx_t_3)) { /* "aiohttp/_http_writer.pyx":109 * return PyObject_Str(s) * elif not isinstance(s, str): * raise TypeError("Cannot serialize non-str key {!r}".format(s)) # <<<<<<<<<<<<<< * else: * return str(s) */ __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_Cannot_serialize_non_str_key_r, __pyx_n_s_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 109, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = NULL; __pyx_t_6 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_4))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); __pyx_t_6 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_v_s}; __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 109, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 109, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __PYX_ERR(0, 109, __pyx_L1_error) /* "aiohttp/_http_writer.pyx":108 * elif typ is _istr: * return PyObject_Str(s) * elif not isinstance(s, str): # <<<<<<<<<<<<<< * raise TypeError("Cannot serialize non-str key {!r}".format(s)) * else: */ } /* "aiohttp/_http_writer.pyx":111 * raise TypeError("Cannot serialize non-str key {!r}".format(s)) * else: * return str(s) # <<<<<<<<<<<<<< * * */ /*else*/ { __Pyx_XDECREF(__pyx_r); __pyx_t_4 = __Pyx_PyObject_Str(__pyx_v_s); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 111, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_r = ((PyObject*)__pyx_t_4); __pyx_t_4 = 0; goto __pyx_L0; } /* "aiohttp/_http_writer.pyx":102 * # --------------- _serialize_headers ---------------------- * * cdef str to_str(object s): # <<<<<<<<<<<<<< * typ = type(s) * if typ is str: */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("aiohttp._http_writer.to_str", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_typ); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_writer.pyx":114 * * * cdef void _safe_header(str string) except *: # <<<<<<<<<<<<<< * if "\r" in string or "\n" in string: * raise ValueError( */ static void __pyx_f_7aiohttp_12_http_writer__safe_header(PyObject *__pyx_v_string) { __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_safe_header", 1); /* "aiohttp/_http_writer.pyx":115 * * cdef void _safe_header(str string) except *: * if "\r" in string or "\n" in string: # <<<<<<<<<<<<<< * raise ValueError( * "Newline or carriage return character detected in HTTP status message or " */ if (unlikely(__pyx_v_string == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(0, 115, __pyx_L1_error) } __pyx_t_2 = (__Pyx_PyUnicode_ContainsTF(__pyx_kp_u_, __pyx_v_string, Py_EQ)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 115, __pyx_L1_error) if (!__pyx_t_2) { } else { __pyx_t_1 = __pyx_t_2; goto __pyx_L4_bool_binop_done; } if (unlikely(__pyx_v_string == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(0, 115, __pyx_L1_error) } __pyx_t_2 = (__Pyx_PyUnicode_ContainsTF(__pyx_kp_u__2, __pyx_v_string, Py_EQ)); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 115, __pyx_L1_error) __pyx_t_1 = __pyx_t_2; __pyx_L4_bool_binop_done:; if (unlikely(__pyx_t_1)) { /* "aiohttp/_http_writer.pyx":116 * cdef void _safe_header(str string) except *: * if "\r" in string or "\n" in string: * raise ValueError( # <<<<<<<<<<<<<< * "Newline or carriage return character detected in HTTP status message or " * "header. This is a potential security issue." */ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 116, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(0, 116, __pyx_L1_error) /* "aiohttp/_http_writer.pyx":115 * * cdef void _safe_header(str string) except *: * if "\r" in string or "\n" in string: # <<<<<<<<<<<<<< * raise ValueError( * "Newline or carriage return character detected in HTTP status message or " */ } /* "aiohttp/_http_writer.pyx":114 * * * cdef void _safe_header(str string) except *: # <<<<<<<<<<<<<< * if "\r" in string or "\n" in string: * raise ValueError( */ /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("aiohttp._http_writer._safe_header", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "aiohttp/_http_writer.pyx":122 * * * def _serialize_headers(str status_line, headers): # <<<<<<<<<<<<<< * cdef Writer writer * cdef object key */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_writer_1_serialize_headers(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_writer_1_serialize_headers = {"_serialize_headers", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_12_http_writer_1_serialize_headers, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_writer_1_serialize_headers(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { PyObject *__pyx_v_status_line = 0; PyObject *__pyx_v_headers = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[2] = {0,0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_serialize_headers (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_status_line,&__pyx_n_s_headers,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_status_line)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_headers)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("_serialize_headers", 1, 2, 2, 1); __PYX_ERR(0, 122, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_serialize_headers") < 0)) __PYX_ERR(0, 122, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 2)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); } __pyx_v_status_line = ((PyObject*)values[0]); __pyx_v_headers = values[1]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("_serialize_headers", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 122, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._http_writer._serialize_headers", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_status_line), (&PyUnicode_Type), 1, "status_line", 1))) __PYX_ERR(0, 122, __pyx_L1_error) __pyx_r = __pyx_pf_7aiohttp_12_http_writer__serialize_headers(__pyx_self, __pyx_v_status_line, __pyx_v_headers); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_writer__serialize_headers(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_status_line, PyObject *__pyx_v_headers) { struct __pyx_t_7aiohttp_12_http_writer_Writer __pyx_v_writer; PyObject *__pyx_v_key = 0; PyObject *__pyx_v_val = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; Py_ssize_t __pyx_t_3; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; int __pyx_t_7; int __pyx_t_8; char const *__pyx_t_9; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; PyObject *__pyx_t_12 = NULL; PyObject *__pyx_t_13 = NULL; PyObject *__pyx_t_14 = NULL; PyObject *__pyx_t_15 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_serialize_headers", 1); /* "aiohttp/_http_writer.pyx":128 * cdef bytes ret * * _init_writer(&writer) # <<<<<<<<<<<<<< * * for key, val in headers.items(): */ __pyx_f_7aiohttp_12_http_writer__init_writer((&__pyx_v_writer)); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 128, __pyx_L1_error) /* "aiohttp/_http_writer.pyx":130 * _init_writer(&writer) * * for key, val in headers.items(): # <<<<<<<<<<<<<< * _safe_header(to_str(key)) * _safe_header(to_str(val)) */ __pyx_t_2 = 0; if (unlikely(__pyx_v_headers == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "items"); __PYX_ERR(0, 130, __pyx_L1_error) } __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_headers, 0, __pyx_n_s_items, (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 130, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = __pyx_t_5; __pyx_t_5 = 0; while (1) { __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_3, &__pyx_t_2, &__pyx_t_5, &__pyx_t_6, NULL, __pyx_t_4); if (unlikely(__pyx_t_7 == 0)) break; if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 130, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_5); __pyx_t_5 = 0; __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_6); __pyx_t_6 = 0; /* "aiohttp/_http_writer.pyx":131 * * for key, val in headers.items(): * _safe_header(to_str(key)) # <<<<<<<<<<<<<< * _safe_header(to_str(val)) * */ __pyx_t_6 = __pyx_f_7aiohttp_12_http_writer_to_str(__pyx_v_key); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 131, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_f_7aiohttp_12_http_writer__safe_header(((PyObject*)__pyx_t_6)); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 131, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; /* "aiohttp/_http_writer.pyx":132 * for key, val in headers.items(): * _safe_header(to_str(key)) * _safe_header(to_str(val)) # <<<<<<<<<<<<<< * * try: */ __pyx_t_6 = __pyx_f_7aiohttp_12_http_writer_to_str(__pyx_v_val); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 132, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_f_7aiohttp_12_http_writer__safe_header(((PyObject*)__pyx_t_6)); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_writer.pyx":134 * _safe_header(to_str(val)) * * try: # <<<<<<<<<<<<<< * if _write_str(&writer, status_line) < 0: * raise */ /*try:*/ { /* "aiohttp/_http_writer.pyx":135 * * try: * if _write_str(&writer, status_line) < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\r') < 0: */ __pyx_t_4 = __pyx_f_7aiohttp_12_http_writer__write_str((&__pyx_v_writer), __pyx_v_status_line); if (unlikely(__pyx_t_4 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 135, __pyx_L6_error) __pyx_t_8 = (__pyx_t_4 < 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":136 * try: * if _write_str(&writer, status_line) < 0: * raise # <<<<<<<<<<<<<< * if _write_byte(&writer, b'\r') < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 136, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":135 * * try: * if _write_str(&writer, status_line) < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\r') < 0: */ } /* "aiohttp/_http_writer.pyx":137 * if _write_str(&writer, status_line) < 0: * raise * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\n') < 0: */ __pyx_t_4 = __pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\r'); if (unlikely(__pyx_t_4 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 137, __pyx_L6_error) __pyx_t_8 = (__pyx_t_4 < 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":138 * raise * if _write_byte(&writer, b'\r') < 0: * raise # <<<<<<<<<<<<<< * if _write_byte(&writer, b'\n') < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 138, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":137 * if _write_str(&writer, status_line) < 0: * raise * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\n') < 0: */ } /* "aiohttp/_http_writer.pyx":139 * if _write_byte(&writer, b'\r') < 0: * raise * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< * raise * */ __pyx_t_4 = __pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\n'); if (unlikely(__pyx_t_4 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 139, __pyx_L6_error) __pyx_t_8 = (__pyx_t_4 < 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":140 * raise * if _write_byte(&writer, b'\n') < 0: * raise # <<<<<<<<<<<<<< * * for key, val in headers.items(): */ __Pyx_ReraiseException(); __PYX_ERR(0, 140, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":139 * if _write_byte(&writer, b'\r') < 0: * raise * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< * raise * */ } /* "aiohttp/_http_writer.pyx":142 * raise * * for key, val in headers.items(): # <<<<<<<<<<<<<< * if _write_str(&writer, to_str(key)) < 0: * raise */ __pyx_t_3 = 0; if (unlikely(__pyx_v_headers == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "items"); __PYX_ERR(0, 142, __pyx_L6_error) } __pyx_t_6 = __Pyx_dict_iterator(__pyx_v_headers, 0, __pyx_n_s_items, (&__pyx_t_2), (&__pyx_t_4)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 142, __pyx_L6_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = __pyx_t_6; __pyx_t_6 = 0; while (1) { __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_2, &__pyx_t_3, &__pyx_t_6, &__pyx_t_5, NULL, __pyx_t_4); if (unlikely(__pyx_t_7 == 0)) break; if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 142, __pyx_L6_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_5); __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_6); __pyx_t_6 = 0; __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_5); __pyx_t_5 = 0; /* "aiohttp/_http_writer.pyx":143 * * for key, val in headers.items(): * if _write_str(&writer, to_str(key)) < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b':') < 0: */ __pyx_t_5 = __pyx_f_7aiohttp_12_http_writer_to_str(__pyx_v_key); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 143, __pyx_L6_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_7 = __pyx_f_7aiohttp_12_http_writer__write_str((&__pyx_v_writer), ((PyObject*)__pyx_t_5)); if (unlikely(__pyx_t_7 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 143, __pyx_L6_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_8 = (__pyx_t_7 < 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":144 * for key, val in headers.items(): * if _write_str(&writer, to_str(key)) < 0: * raise # <<<<<<<<<<<<<< * if _write_byte(&writer, b':') < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 144, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":143 * * for key, val in headers.items(): * if _write_str(&writer, to_str(key)) < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b':') < 0: */ } /* "aiohttp/_http_writer.pyx":145 * if _write_str(&writer, to_str(key)) < 0: * raise * if _write_byte(&writer, b':') < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b' ') < 0: */ __pyx_t_7 = __pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), ':'); if (unlikely(__pyx_t_7 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 145, __pyx_L6_error) __pyx_t_8 = (__pyx_t_7 < 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":146 * raise * if _write_byte(&writer, b':') < 0: * raise # <<<<<<<<<<<<<< * if _write_byte(&writer, b' ') < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 146, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":145 * if _write_str(&writer, to_str(key)) < 0: * raise * if _write_byte(&writer, b':') < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b' ') < 0: */ } /* "aiohttp/_http_writer.pyx":147 * if _write_byte(&writer, b':') < 0: * raise * if _write_byte(&writer, b' ') < 0: # <<<<<<<<<<<<<< * raise * if _write_str(&writer, to_str(val)) < 0: */ __pyx_t_7 = __pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), ' '); if (unlikely(__pyx_t_7 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 147, __pyx_L6_error) __pyx_t_8 = (__pyx_t_7 < 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":148 * raise * if _write_byte(&writer, b' ') < 0: * raise # <<<<<<<<<<<<<< * if _write_str(&writer, to_str(val)) < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 148, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":147 * if _write_byte(&writer, b':') < 0: * raise * if _write_byte(&writer, b' ') < 0: # <<<<<<<<<<<<<< * raise * if _write_str(&writer, to_str(val)) < 0: */ } /* "aiohttp/_http_writer.pyx":149 * if _write_byte(&writer, b' ') < 0: * raise * if _write_str(&writer, to_str(val)) < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\r') < 0: */ __pyx_t_5 = __pyx_f_7aiohttp_12_http_writer_to_str(__pyx_v_val); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 149, __pyx_L6_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_7 = __pyx_f_7aiohttp_12_http_writer__write_str((&__pyx_v_writer), ((PyObject*)__pyx_t_5)); if (unlikely(__pyx_t_7 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 149, __pyx_L6_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_8 = (__pyx_t_7 < 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":150 * raise * if _write_str(&writer, to_str(val)) < 0: * raise # <<<<<<<<<<<<<< * if _write_byte(&writer, b'\r') < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 150, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":149 * if _write_byte(&writer, b' ') < 0: * raise * if _write_str(&writer, to_str(val)) < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\r') < 0: */ } /* "aiohttp/_http_writer.pyx":151 * if _write_str(&writer, to_str(val)) < 0: * raise * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\n') < 0: */ __pyx_t_7 = __pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\r'); if (unlikely(__pyx_t_7 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 151, __pyx_L6_error) __pyx_t_8 = (__pyx_t_7 < 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":152 * raise * if _write_byte(&writer, b'\r') < 0: * raise # <<<<<<<<<<<<<< * if _write_byte(&writer, b'\n') < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 152, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":151 * if _write_str(&writer, to_str(val)) < 0: * raise * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\n') < 0: */ } /* "aiohttp/_http_writer.pyx":153 * if _write_byte(&writer, b'\r') < 0: * raise * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< * raise * */ __pyx_t_7 = __pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\n'); if (unlikely(__pyx_t_7 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 153, __pyx_L6_error) __pyx_t_8 = (__pyx_t_7 < 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":154 * raise * if _write_byte(&writer, b'\n') < 0: * raise # <<<<<<<<<<<<<< * * if _write_byte(&writer, b'\r') < 0: */ __Pyx_ReraiseException(); __PYX_ERR(0, 154, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":153 * if _write_byte(&writer, b'\r') < 0: * raise * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< * raise * */ } } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_writer.pyx":156 * raise * * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\n') < 0: */ __pyx_t_4 = __pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\r'); if (unlikely(__pyx_t_4 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 156, __pyx_L6_error) __pyx_t_8 = (__pyx_t_4 < 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":157 * * if _write_byte(&writer, b'\r') < 0: * raise # <<<<<<<<<<<<<< * if _write_byte(&writer, b'\n') < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 157, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":156 * raise * * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\n') < 0: */ } /* "aiohttp/_http_writer.pyx":158 * if _write_byte(&writer, b'\r') < 0: * raise * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< * raise * */ __pyx_t_4 = __pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\n'); if (unlikely(__pyx_t_4 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 158, __pyx_L6_error) __pyx_t_8 = (__pyx_t_4 < 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":159 * raise * if _write_byte(&writer, b'\n') < 0: * raise # <<<<<<<<<<<<<< * * return PyBytes_FromStringAndSize(writer.buf, writer.pos) */ __Pyx_ReraiseException(); __PYX_ERR(0, 159, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":158 * if _write_byte(&writer, b'\r') < 0: * raise * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< * raise * */ } /* "aiohttp/_http_writer.pyx":161 * raise * * return PyBytes_FromStringAndSize(writer.buf, writer.pos) # <<<<<<<<<<<<<< * finally: * _release_writer(&writer) */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyBytes_FromStringAndSize(__pyx_v_writer.buf, __pyx_v_writer.pos); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 161, __pyx_L6_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L5_return; } /* "aiohttp/_http_writer.pyx":163 * return PyBytes_FromStringAndSize(writer.buf, writer.pos) * finally: * _release_writer(&writer) # <<<<<<<<<<<<<< */ /*finally:*/ { __pyx_L6_error:; /*exception exit:*/{ __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_13, &__pyx_t_14, &__pyx_t_15); if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12) < 0)) __Pyx_ErrFetch(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); __Pyx_XGOTREF(__pyx_t_10); __Pyx_XGOTREF(__pyx_t_11); __Pyx_XGOTREF(__pyx_t_12); __Pyx_XGOTREF(__pyx_t_13); __Pyx_XGOTREF(__pyx_t_14); __Pyx_XGOTREF(__pyx_t_15); __pyx_t_4 = __pyx_lineno; __pyx_t_7 = __pyx_clineno; __pyx_t_9 = __pyx_filename; { __pyx_f_7aiohttp_12_http_writer__release_writer((&__pyx_v_writer)); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 163, __pyx_L22_error) } if (PY_MAJOR_VERSION >= 3) { __Pyx_XGIVEREF(__pyx_t_13); __Pyx_XGIVEREF(__pyx_t_14); __Pyx_XGIVEREF(__pyx_t_15); __Pyx_ExceptionReset(__pyx_t_13, __pyx_t_14, __pyx_t_15); } __Pyx_XGIVEREF(__pyx_t_10); __Pyx_XGIVEREF(__pyx_t_11); __Pyx_XGIVEREF(__pyx_t_12); __Pyx_ErrRestore(__pyx_t_10, __pyx_t_11, __pyx_t_12); __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_lineno = __pyx_t_4; __pyx_clineno = __pyx_t_7; __pyx_filename = __pyx_t_9; goto __pyx_L1_error; __pyx_L22_error:; if (PY_MAJOR_VERSION >= 3) { __Pyx_XGIVEREF(__pyx_t_13); __Pyx_XGIVEREF(__pyx_t_14); __Pyx_XGIVEREF(__pyx_t_15); __Pyx_ExceptionReset(__pyx_t_13, __pyx_t_14, __pyx_t_15); } __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; goto __pyx_L1_error; } __pyx_L5_return: { __pyx_t_15 = __pyx_r; __pyx_r = 0; __pyx_f_7aiohttp_12_http_writer__release_writer((&__pyx_v_writer)); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 163, __pyx_L1_error) __pyx_r = __pyx_t_15; __pyx_t_15 = 0; goto __pyx_L0; } } /* "aiohttp/_http_writer.pyx":122 * * * def _serialize_headers(str status_line, headers): # <<<<<<<<<<<<<< * cdef Writer writer * cdef object key */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("aiohttp._http_writer._serialize_headers", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_key); __Pyx_XDECREF(__pyx_v_val); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif #endif /* #### Code section: pystring_table ### */ static int __Pyx_CreateStringTabAndInitStrings(void) { __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_u_, __pyx_k_, sizeof(__pyx_k_), 0, 1, 0, 0}, {&__pyx_kp_u_Cannot_serialize_non_str_key_r, __pyx_k_Cannot_serialize_non_str_key_r, sizeof(__pyx_k_Cannot_serialize_non_str_key_r), 0, 1, 0, 0}, {&__pyx_kp_u_Newline_or_carriage_return_chara, __pyx_k_Newline_or_carriage_return_chara, sizeof(__pyx_k_Newline_or_carriage_return_chara), 0, 1, 0, 0}, {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, {&__pyx_kp_u__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 1, 0, 0}, {&__pyx_kp_u__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 1, 0, 0}, {&__pyx_n_s__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 0, 1, 1}, {&__pyx_n_s_aiohttp__http_writer, __pyx_k_aiohttp__http_writer, sizeof(__pyx_k_aiohttp__http_writer), 0, 0, 1, 1}, {&__pyx_kp_s_aiohttp__http_writer_pyx, __pyx_k_aiohttp__http_writer_pyx, sizeof(__pyx_k_aiohttp__http_writer_pyx), 0, 0, 1, 0}, {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, {&__pyx_n_s_headers, __pyx_k_headers, sizeof(__pyx_k_headers), 0, 0, 1, 1}, {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, {&__pyx_n_s_istr, __pyx_k_istr, sizeof(__pyx_k_istr), 0, 0, 1, 1}, {&__pyx_n_s_items, __pyx_k_items, sizeof(__pyx_k_items), 0, 0, 1, 1}, {&__pyx_n_s_key, __pyx_k_key, sizeof(__pyx_k_key), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_multidict, __pyx_k_multidict, sizeof(__pyx_k_multidict), 0, 0, 1, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_n_s_ret, __pyx_k_ret, sizeof(__pyx_k_ret), 0, 0, 1, 1}, {&__pyx_n_s_serialize_headers, __pyx_k_serialize_headers, sizeof(__pyx_k_serialize_headers), 0, 0, 1, 1}, {&__pyx_n_s_status_line, __pyx_k_status_line, sizeof(__pyx_k_status_line), 0, 0, 1, 1}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_n_s_val, __pyx_k_val, sizeof(__pyx_k_val), 0, 0, 1, 1}, {&__pyx_n_s_writer, __pyx_k_writer, sizeof(__pyx_k_writer), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; return __Pyx_InitStrings(__pyx_string_tab); } /* #### Code section: cached_builtins ### */ static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(0, 109, __pyx_L1_error) __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 116, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } /* #### Code section: cached_constants ### */ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "aiohttp/_http_writer.pyx":116 * cdef void _safe_header(str string) except *: * if "\r" in string or "\n" in string: * raise ValueError( # <<<<<<<<<<<<<< * "Newline or carriage return character detected in HTTP status message or " * "header. This is a potential security issue." */ __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_Newline_or_carriage_return_chara); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 116, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); /* "aiohttp/_http_writer.pyx":122 * * * def _serialize_headers(str status_line, headers): # <<<<<<<<<<<<<< * cdef Writer writer * cdef object key */ __pyx_tuple__5 = PyTuple_Pack(6, __pyx_n_s_status_line, __pyx_n_s_headers, __pyx_n_s_writer, __pyx_n_s_key, __pyx_n_s_val, __pyx_n_s_ret); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 122, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); __pyx_codeobj__6 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__5, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_aiohttp__http_writer_pyx, __pyx_n_s_serialize_headers, 122, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__6)) __PYX_ERR(0, 122, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } /* #### Code section: init_constants ### */ static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 1, __pyx_L1_error); return 0; __pyx_L1_error:; return -1; } /* #### Code section: init_globals ### */ static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { return 0; } /* #### Code section: init_module ### */ static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ static int __Pyx_modinit_global_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); /*--- Global init code ---*/ __pyx_v_7aiohttp_12_http_writer__istr = Py_None; Py_INCREF(Py_None); __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); /*--- Variable export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); /*--- Function export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_import_code(void) { __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); /*--- Type import code ---*/ __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_5(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_5(PyTypeObject), #elif CYTHON_COMPILING_IN_LIMITED_API sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_5(PyTypeObject), #else sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_5(PyHeapTypeObject), #endif __Pyx_ImportType_CheckSize_Warn_3_0_5); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(1, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_modinit_variable_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); /*--- Variable import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); /*--- Function import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } #if PY_MAJOR_VERSION >= 3 #if CYTHON_PEP489_MULTI_PHASE_INIT static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ static int __pyx_pymod_exec__http_writer(PyObject* module); /*proto*/ static PyModuleDef_Slot __pyx_moduledef_slots[] = { {Py_mod_create, (void*)__pyx_pymod_create}, {Py_mod_exec, (void*)__pyx_pymod_exec__http_writer}, {0, NULL} }; #endif #ifdef __cplusplus namespace { struct PyModuleDef __pyx_moduledef = #else static struct PyModuleDef __pyx_moduledef = #endif { PyModuleDef_HEAD_INIT, "_http_writer", 0, /* m_doc */ #if CYTHON_PEP489_MULTI_PHASE_INIT 0, /* m_size */ #elif CYTHON_USE_MODULE_STATE sizeof(__pyx_mstate), /* m_size */ #else -1, /* m_size */ #endif __pyx_methods /* m_methods */, #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_moduledef_slots, /* m_slots */ #else NULL, /* m_reload */ #endif #if CYTHON_USE_MODULE_STATE __pyx_m_traverse, /* m_traverse */ __pyx_m_clear, /* m_clear */ NULL /* m_free */ #else NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ #endif }; #ifdef __cplusplus } /* anonymous namespace */ #endif #endif #ifndef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC #elif PY_MAJOR_VERSION < 3 #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" void #else #define __Pyx_PyMODINIT_FUNC void #endif #else #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" PyObject * #else #define __Pyx_PyMODINIT_FUNC PyObject * #endif #endif #if PY_MAJOR_VERSION < 3 __Pyx_PyMODINIT_FUNC init_http_writer(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC init_http_writer(void) #else __Pyx_PyMODINIT_FUNC PyInit__http_writer(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC PyInit__http_writer(void) #if CYTHON_PEP489_MULTI_PHASE_INIT { return PyModuleDef_Init(&__pyx_moduledef); } static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { #if PY_VERSION_HEX >= 0x030700A1 static PY_INT64_T main_interpreter_id = -1; PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); if (main_interpreter_id == -1) { main_interpreter_id = current_id; return (unlikely(current_id == -1)) ? -1 : 0; } else if (unlikely(main_interpreter_id != current_id)) #else static PyInterpreterState *main_interpreter = NULL; PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; if (!main_interpreter) { main_interpreter = current_interpreter; } else if (unlikely(main_interpreter != current_interpreter)) #endif { PyErr_SetString( PyExc_ImportError, "Interpreter change detected - this module can only be loaded into one interpreter per process."); return -1; } return 0; } #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) #else static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) #endif { PyObject *value = PyObject_GetAttrString(spec, from_name); int result = 0; if (likely(value)) { if (allow_none || value != Py_None) { #if CYTHON_COMPILING_IN_LIMITED_API result = PyModule_AddObject(module, to_name, value); #else result = PyDict_SetItemString(moddict, to_name, value); #endif } Py_DECREF(value); } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); } else { result = -1; } return result; } static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { PyObject *module = NULL, *moddict, *modname; CYTHON_UNUSED_VAR(def); if (__Pyx_check_single_interpreter()) return NULL; if (__pyx_m) return __Pyx_NewRef(__pyx_m); modname = PyObject_GetAttrString(spec, "name"); if (unlikely(!modname)) goto bad; module = PyModule_NewObject(modname); Py_DECREF(modname); if (unlikely(!module)) goto bad; #if CYTHON_COMPILING_IN_LIMITED_API moddict = module; #else moddict = PyModule_GetDict(module); if (unlikely(!moddict)) goto bad; #endif if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; return module; bad: Py_XDECREF(module); return NULL; } static CYTHON_SMALL_CODE int __pyx_pymod_exec__http_writer(PyObject *__pyx_pyinit_module) #endif #endif { int stringtab_initialized = 0; #if CYTHON_USE_MODULE_STATE int pystate_addmodule_run = 0; #endif PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m) { if (__pyx_m == __pyx_pyinit_module) return 0; PyErr_SetString(PyExc_RuntimeError, "Module '_http_writer' has already been imported. Re-initialisation is not supported."); return -1; } #elif PY_MAJOR_VERSION >= 3 if (__pyx_m) return __Pyx_NewRef(__pyx_m); #endif /*--- Module creation code ---*/ #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_m = __pyx_pyinit_module; Py_INCREF(__pyx_m); #else #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("_http_writer", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #elif CYTHON_USE_MODULE_STATE __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) { int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to _http_writer pseudovariable */ if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) pystate_addmodule_run = 1; } #else __pyx_m = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #endif #endif CYTHON_UNUSED_VAR(__pyx_t_1); __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_d); __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__http_writer(void)", 0); if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pxy_PyFrame_Initialize_Offsets __Pxy_PyFrame_Initialize_Offsets(); #endif __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pyx_CyFunction_USED if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Coroutine_USED if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_StopAsyncIteration_USED if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS PyEval_InitThreads(); #endif /*--- Initialize various global constants etc. ---*/ if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) stringtab_initialized = 1; if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif if (__pyx_module_is_main_aiohttp___http_writer) { if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) if (!PyDict_GetItemString(modules, "aiohttp._http_writer")) { if (unlikely((PyDict_SetItemString(modules, "aiohttp._http_writer", __pyx_m) < 0))) __PYX_ERR(0, 1, __pyx_L1_error) } } #endif /*--- Builtin init code ---*/ if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Constants init code ---*/ if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Global type/function init code ---*/ (void)__Pyx_modinit_global_init_code(); (void)__Pyx_modinit_variable_export_code(); (void)__Pyx_modinit_function_export_code(); (void)__Pyx_modinit_type_init_code(); if (unlikely((__Pyx_modinit_type_import_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) (void)__Pyx_modinit_variable_import_code(); (void)__Pyx_modinit_function_import_code(); /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /* "aiohttp/_http_writer.pyx":8 * from libc.string cimport memcpy * * from multidict import istr # <<<<<<<<<<<<<< * * DEF BUF_SIZE = 16 * 1024 # 16KiB */ __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_istr); __Pyx_GIVEREF(__pyx_n_s_istr); if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_istr)) __PYX_ERR(0, 8, __pyx_L1_error); __pyx_t_3 = __Pyx_Import(__pyx_n_s_multidict, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_istr); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_istr, __pyx_t_2) < 0) __PYX_ERR(0, 8, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_writer.pyx":13 * cdef char BUFFER[BUF_SIZE] * * cdef object _istr = istr # <<<<<<<<<<<<<< * * */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_istr); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_writer__istr); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_writer__istr, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_writer.pyx":122 * * * def _serialize_headers(str status_line, headers): # <<<<<<<<<<<<<< * cdef Writer writer * cdef object key */ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_12_http_writer_1_serialize_headers, 0, __pyx_n_s_serialize_headers, NULL, __pyx_n_s_aiohttp__http_writer, __pyx_d, ((PyObject *)__pyx_codeobj__6)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 122, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_serialize_headers, __pyx_t_3) < 0) __PYX_ERR(0, 122, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_writer.pyx":1 * from cpython.bytes cimport PyBytes_FromStringAndSize # <<<<<<<<<<<<<< * from cpython.exc cimport PyErr_NoMemory * from cpython.mem cimport PyMem_Free, PyMem_Malloc, PyMem_Realloc */ __pyx_t_3 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_3) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); if (__pyx_m) { if (__pyx_d && stringtab_initialized) { __Pyx_AddTraceback("init aiohttp._http_writer", __pyx_clineno, __pyx_lineno, __pyx_filename); } #if !CYTHON_USE_MODULE_STATE Py_CLEAR(__pyx_m); #else Py_DECREF(__pyx_m); if (pystate_addmodule_run) { PyObject *tp, *value, *tb; PyErr_Fetch(&tp, &value, &tb); PyState_RemoveModule(&__pyx_moduledef); PyErr_Restore(tp, value, tb); } #endif } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init aiohttp._http_writer"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if CYTHON_PEP489_MULTI_PHASE_INIT return (__pyx_m != NULL) ? 0 : -1; #elif PY_MAJOR_VERSION >= 3 return __pyx_m; #else return; #endif } /* #### Code section: cleanup_globals ### */ /* #### Code section: cleanup_module ### */ /* #### Code section: main_method ### */ /* #### Code section: utility_code_pragmas ### */ #ifdef _MSC_VER #pragma warning( push ) /* Warning 4127: conditional expression is constant * Cython uses constant conditional expressions to allow in inline functions to be optimized at * compile-time, so this warning is not useful */ #pragma warning( disable : 4127 ) #endif /* #### Code section: utility_code_def ### */ /* --- Runtime support code --- */ /* Refnanny */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule(modname); if (!m) goto end; p = PyObject_GetAttrString(m, "RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* PyErrExceptionMatches */ #if CYTHON_FAST_THREAD_STATE static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; i= 0x030C00A6 PyObject *current_exception = tstate->current_exception; if (unlikely(!current_exception)) return 0; exc_type = (PyObject*) Py_TYPE(current_exception); if (exc_type == err) return 1; #else exc_type = tstate->curexc_type; if (exc_type == err) return 1; if (unlikely(!exc_type)) return 0; #endif #if CYTHON_AVOID_BORROWED_REFS Py_INCREF(exc_type); #endif if (unlikely(PyTuple_Check(err))) { result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); } else { result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); } #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(exc_type); #endif return result; } #endif /* PyErrFetchRestore */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { #if PY_VERSION_HEX >= 0x030C00A6 PyObject *tmp_value; assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); if (value) { #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) #endif PyException_SetTraceback(value, tb); } tmp_value = tstate->current_exception; tstate->current_exception = value; Py_XDECREF(tmp_value); Py_XDECREF(type); Py_XDECREF(tb); #else PyObject *tmp_type, *tmp_value, *tmp_tb; tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #endif } static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { #if PY_VERSION_HEX >= 0x030C00A6 PyObject* exc_value; exc_value = tstate->current_exception; tstate->current_exception = 0; *value = exc_value; *type = NULL; *tb = NULL; if (exc_value) { *type = (PyObject*) Py_TYPE(exc_value); Py_INCREF(*type); #if CYTHON_COMPILING_IN_CPYTHON *tb = ((PyBaseExceptionObject*) exc_value)->traceback; Py_XINCREF(*tb); #else *tb = PyException_GetTraceback(exc_value); #endif } #else *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #endif } #endif /* PyObjectGetAttrStr */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #endif /* PyObjectGetAttrStrNoError */ #if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) __Pyx_PyErr_Clear(); } #endif static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { PyObject *result; #if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 (void) PyObject_GetOptionalAttr(obj, attr_name, &result); return result; #else #if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); } #endif result = __Pyx_PyObject_GetAttrStr(obj, attr_name); if (unlikely(!result)) { __Pyx_PyObject_GetAttrStr_ClearAttributeError(); } return result; #endif } /* GetBuiltinName */ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); if (unlikely(!result) && !PyErr_Occurred()) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } /* unicode_iter */ static CYTHON_INLINE int __Pyx_init_unicode_iteration( PyObject* ustring, Py_ssize_t *length, void** data, int *kind) { #if CYTHON_COMPILING_IN_LIMITED_API *kind = 0; *length = PyUnicode_GetLength(ustring); *data = (void*)ustring; #elif CYTHON_PEP393_ENABLED if (unlikely(__Pyx_PyUnicode_READY(ustring) < 0)) return -1; *kind = PyUnicode_KIND(ustring); *length = PyUnicode_GET_LENGTH(ustring); *data = PyUnicode_DATA(ustring); #else *kind = 0; *length = PyUnicode_GET_SIZE(ustring); *data = (void*)PyUnicode_AS_UNICODE(ustring); #endif return 0; } /* RaiseUnexpectedTypeError */ static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj) { __Pyx_TypeName obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); PyErr_Format(PyExc_TypeError, "Expected %s, got " __Pyx_FMT_TYPENAME, expected, obj_type_name); __Pyx_DECREF_TypeName(obj_type_name); return 0; } /* PyFunctionFastCall */ #if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, PyObject *globals) { PyFrameObject *f; PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject **fastlocals; Py_ssize_t i; PyObject *result; assert(globals != NULL); /* XXX Perhaps we should create a specialized PyFrame_New() that doesn't take locals, but does take builtins without sanity checking them. */ assert(tstate != NULL); f = PyFrame_New(tstate, co, globals, NULL); if (f == NULL) { return NULL; } fastlocals = __Pyx_PyFrame_GetLocalsplus(f); for (i = 0; i < na; i++) { Py_INCREF(*args); fastlocals[i] = *args++; } result = PyEval_EvalFrameEx(f,0); ++tstate->recursion_depth; Py_DECREF(f); --tstate->recursion_depth; return result; } static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); PyObject *globals = PyFunction_GET_GLOBALS(func); PyObject *argdefs = PyFunction_GET_DEFAULTS(func); PyObject *closure; #if PY_MAJOR_VERSION >= 3 PyObject *kwdefs; #endif PyObject *kwtuple, **k; PyObject **d; Py_ssize_t nd; Py_ssize_t nk; PyObject *result; assert(kwargs == NULL || PyDict_Check(kwargs)); nk = kwargs ? PyDict_Size(kwargs) : 0; #if PY_MAJOR_VERSION < 3 if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { return NULL; } #else if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) { return NULL; } #endif if ( #if PY_MAJOR_VERSION >= 3 co->co_kwonlyargcount == 0 && #endif likely(kwargs == NULL || nk == 0) && co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { if (argdefs == NULL && co->co_argcount == nargs) { result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); goto done; } else if (nargs == 0 && argdefs != NULL && co->co_argcount == Py_SIZE(argdefs)) { /* function called with no arguments, but all parameters have a default value: use default values as arguments .*/ args = &PyTuple_GET_ITEM(argdefs, 0); result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); goto done; } } if (kwargs != NULL) { Py_ssize_t pos, i; kwtuple = PyTuple_New(2 * nk); if (kwtuple == NULL) { result = NULL; goto done; } k = &PyTuple_GET_ITEM(kwtuple, 0); pos = i = 0; while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { Py_INCREF(k[i]); Py_INCREF(k[i+1]); i += 2; } nk = i / 2; } else { kwtuple = NULL; k = NULL; } closure = PyFunction_GET_CLOSURE(func); #if PY_MAJOR_VERSION >= 3 kwdefs = PyFunction_GET_KW_DEFAULTS(func); #endif if (argdefs != NULL) { d = &PyTuple_GET_ITEM(argdefs, 0); nd = Py_SIZE(argdefs); } else { d = NULL; nd = 0; } #if PY_MAJOR_VERSION >= 3 result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, kwdefs, closure); #else result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, closure); #endif Py_XDECREF(kwtuple); done: Py_LeaveRecursiveCall(); return result; } #endif /* PyObjectCall */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; ternaryfunc call = Py_TYPE(func)->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); #if PY_MAJOR_VERSION < 3 if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; #else if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) return NULL; #endif result = (*call)(func, arg, kw); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectCallMethO */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { PyObject *self, *result; PyCFunction cfunc; cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func); self = __Pyx_CyOrPyCFunction_GET_SELF(func); #if PY_MAJOR_VERSION < 3 if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; #else if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) return NULL; #endif result = cfunc(self, arg); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectFastCall */ #if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { PyObject *argstuple; PyObject *result = 0; size_t i; argstuple = PyTuple_New((Py_ssize_t)nargs); if (unlikely(!argstuple)) return NULL; for (i = 0; i < nargs; i++) { Py_INCREF(args[i]); if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; } result = __Pyx_PyObject_Call(func, argstuple, kwargs); bad: Py_DECREF(argstuple); return result; } #endif static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); #if CYTHON_COMPILING_IN_CPYTHON if (nargs == 0 && kwargs == NULL) { if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS)) return __Pyx_PyObject_CallMethO(func, NULL); } else if (nargs == 1 && kwargs == NULL) { if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O)) return __Pyx_PyObject_CallMethO(func, args[0]); } #endif #if PY_VERSION_HEX < 0x030800B1 #if CYTHON_FAST_PYCCALL if (PyCFunction_Check(func)) { if (kwargs) { return _PyCFunction_FastCallDict(func, args, nargs, kwargs); } else { return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); } } #if PY_VERSION_HEX >= 0x030700A1 if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); } #endif #endif #if CYTHON_FAST_PYCALL if (PyFunction_Check(func)) { return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); } #endif #endif if (kwargs == NULL) { #if CYTHON_VECTORCALL #if PY_VERSION_HEX < 0x03090000 vectorcallfunc f = _PyVectorcall_Function(func); #else vectorcallfunc f = PyVectorcall_Function(func); #endif if (f) { return f(func, args, (size_t)nargs, NULL); } #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL if (__Pyx_CyFunction_CheckExact(func)) { __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); if (f) return f(func, args, (size_t)nargs, NULL); } #endif } if (nargs == 0) { return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); } #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs); #else return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); #endif } /* PyObjectCallOneArg */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *args[2] = {NULL, arg}; return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); } /* RaiseException */ #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { __Pyx_PyThreadState_declare CYTHON_UNUSED_VAR(cause); Py_XINCREF(type); if (!value || value == Py_None) value = NULL; else Py_INCREF(value); if (!tb || tb == Py_None) tb = NULL; else { Py_INCREF(tb); if (!PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } } if (PyType_Check(type)) { #if CYTHON_COMPILING_IN_PYPY if (!value) { Py_INCREF(Py_None); value = Py_None; } #endif PyErr_NormalizeException(&type, &value, &tb); } else { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } value = type; type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } } __Pyx_PyThreadState_assign __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { PyObject* owned_instance = NULL; if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (PyExceptionClass_Check(type)) { PyObject *instance_class = NULL; if (value && PyExceptionInstance_Check(value)) { instance_class = (PyObject*) Py_TYPE(value); if (instance_class != type) { int is_subclass = PyObject_IsSubclass(instance_class, type); if (!is_subclass) { instance_class = NULL; } else if (unlikely(is_subclass == -1)) { goto bad; } else { type = instance_class; } } } if (!instance_class) { PyObject *args; if (!value) args = PyTuple_New(0); else if (PyTuple_Check(value)) { Py_INCREF(value); args = value; } else args = PyTuple_Pack(1, value); if (!args) goto bad; owned_instance = PyObject_Call(type, args, NULL); Py_DECREF(args); if (!owned_instance) goto bad; value = owned_instance; if (!PyExceptionInstance_Check(value)) { PyErr_Format(PyExc_TypeError, "calling %R should have returned an instance of " "BaseException, not %R", type, Py_TYPE(value)); goto bad; } } } else { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } if (cause) { PyObject *fixed_cause; if (cause == Py_None) { fixed_cause = NULL; } else if (PyExceptionClass_Check(cause)) { fixed_cause = PyObject_CallObject(cause, NULL); if (fixed_cause == NULL) goto bad; } else if (PyExceptionInstance_Check(cause)) { fixed_cause = cause; Py_INCREF(fixed_cause); } else { PyErr_SetString(PyExc_TypeError, "exception causes must derive from " "BaseException"); goto bad; } PyException_SetCause(value, fixed_cause); } PyErr_SetObject(type, value); if (tb) { #if PY_VERSION_HEX >= 0x030C00A6 PyException_SetTraceback(value, tb); #elif CYTHON_FAST_THREAD_STATE PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } #else PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); Py_INCREF(tb); PyErr_Restore(tmp_type, tmp_value, tb); Py_XDECREF(tmp_tb); #endif } bad: Py_XDECREF(owned_instance); return; } #endif /* TupleAndListFromArray */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { PyObject *v; Py_ssize_t i; for (i = 0; i < length; i++) { v = dest[i] = src[i]; Py_INCREF(v); } } static CYTHON_INLINE PyObject * __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) { PyObject *res; if (n <= 0) { Py_INCREF(__pyx_empty_tuple); return __pyx_empty_tuple; } res = PyTuple_New(n); if (unlikely(res == NULL)) return NULL; __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); return res; } static CYTHON_INLINE PyObject * __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) { PyObject *res; if (n <= 0) { return PyList_New(0); } res = PyList_New(n); if (unlikely(res == NULL)) return NULL; __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); return res; } #endif /* BytesEquals */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API return PyObject_RichCompareBool(s1, s2, equals); #else if (s1 == s2) { return (equals == Py_EQ); } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { const char *ps1, *ps2; Py_ssize_t length = PyBytes_GET_SIZE(s1); if (length != PyBytes_GET_SIZE(s2)) return (equals == Py_NE); ps1 = PyBytes_AS_STRING(s1); ps2 = PyBytes_AS_STRING(s2); if (ps1[0] != ps2[0]) { return (equals == Py_NE); } else if (length == 1) { return (equals == Py_EQ); } else { int result; #if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) Py_hash_t hash1, hash2; hash1 = ((PyBytesObject*)s1)->ob_shash; hash2 = ((PyBytesObject*)s2)->ob_shash; if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { return (equals == Py_NE); } #endif result = memcmp(ps1, ps2, (size_t)length); return (equals == Py_EQ) ? (result == 0) : (result != 0); } } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { return (equals == Py_NE); } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { return (equals == Py_NE); } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); Py_DECREF(py_result); return result; } #endif } /* UnicodeEquals */ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API return PyObject_RichCompareBool(s1, s2, equals); #else #if PY_MAJOR_VERSION < 3 PyObject* owned_ref = NULL; #endif int s1_is_unicode, s2_is_unicode; if (s1 == s2) { goto return_eq; } s1_is_unicode = PyUnicode_CheckExact(s1); s2_is_unicode = PyUnicode_CheckExact(s2); #if PY_MAJOR_VERSION < 3 if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { owned_ref = PyUnicode_FromObject(s2); if (unlikely(!owned_ref)) return -1; s2 = owned_ref; s2_is_unicode = 1; } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { owned_ref = PyUnicode_FromObject(s1); if (unlikely(!owned_ref)) return -1; s1 = owned_ref; s1_is_unicode = 1; } else if (((!s2_is_unicode) & (!s1_is_unicode))) { return __Pyx_PyBytes_Equals(s1, s2, equals); } #endif if (s1_is_unicode & s2_is_unicode) { Py_ssize_t length; int kind; void *data1, *data2; if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) return -1; length = __Pyx_PyUnicode_GET_LENGTH(s1); if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { goto return_ne; } #if CYTHON_USE_UNICODE_INTERNALS { Py_hash_t hash1, hash2; #if CYTHON_PEP393_ENABLED hash1 = ((PyASCIIObject*)s1)->hash; hash2 = ((PyASCIIObject*)s2)->hash; #else hash1 = ((PyUnicodeObject*)s1)->hash; hash2 = ((PyUnicodeObject*)s2)->hash; #endif if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { goto return_ne; } } #endif kind = __Pyx_PyUnicode_KIND(s1); if (kind != __Pyx_PyUnicode_KIND(s2)) { goto return_ne; } data1 = __Pyx_PyUnicode_DATA(s1); data2 = __Pyx_PyUnicode_DATA(s2); if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { goto return_ne; } else if (length == 1) { goto return_eq; } else { int result = memcmp(data1, data2, (size_t)(length * kind)); #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_EQ) ? (result == 0) : (result != 0); } } else if ((s1 == Py_None) & s2_is_unicode) { goto return_ne; } else if ((s2 == Py_None) & s1_is_unicode) { goto return_ne; } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); Py_DECREF(py_result); return result; } return_eq: #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_EQ); return_ne: #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_NE); #endif } /* fastcall */ #if CYTHON_METH_FASTCALL static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) { Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); for (i = 0; i < n; i++) { if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; } for (i = 0; i < n; i++) { int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); if (unlikely(eq != 0)) { if (unlikely(eq < 0)) return NULL; // error return kwvalues[i]; } } return NULL; // not found (no exception set) } #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 static CYTHON_UNUSED PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); PyObject *dict; dict = PyDict_New(); if (unlikely(!dict)) return NULL; for (i=0; i= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } /* ParseKeywords */ static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject *const *kwvalues, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); while (1) { Py_XDECREF(key); key = NULL; Py_XDECREF(value); value = NULL; if (kwds_is_tuple) { Py_ssize_t size; #if CYTHON_ASSUME_SAFE_MACROS size = PyTuple_GET_SIZE(kwds); #else size = PyTuple_Size(kwds); if (size < 0) goto bad; #endif if (pos >= size) break; #if CYTHON_AVOID_BORROWED_REFS key = __Pyx_PySequence_ITEM(kwds, pos); if (!key) goto bad; #elif CYTHON_ASSUME_SAFE_MACROS key = PyTuple_GET_ITEM(kwds, pos); #else key = PyTuple_GetItem(kwds, pos); if (!key) goto bad; #endif value = kwvalues[pos]; pos++; } else { if (!PyDict_Next(kwds, &pos, &key, &value)) break; #if CYTHON_AVOID_BORROWED_REFS Py_INCREF(key); #endif } name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS Py_INCREF(value); // transfer ownership of value to values Py_DECREF(key); #endif key = NULL; value = NULL; continue; } #if !CYTHON_AVOID_BORROWED_REFS Py_INCREF(key); #endif Py_INCREF(value); name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS value = NULL; // ownership transferred to values #endif break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = ( #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**name, key) ); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS value = NULL; // ownership transferred to values #endif break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } Py_XDECREF(key); Py_XDECREF(value); return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); goto bad; invalid_keyword: #if PY_MAJOR_VERSION < 3 PyErr_Format(PyExc_TypeError, "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else PyErr_Format(PyExc_TypeError, "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: Py_XDECREF(key); Py_XDECREF(value); return -1; } /* ArgTypeTest */ static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) { __Pyx_TypeName type_name; __Pyx_TypeName obj_type_name; if (unlikely(!type)) { PyErr_SetString(PyExc_SystemError, "Missing type object"); return 0; } else if (exact) { #if PY_MAJOR_VERSION == 2 if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; #endif } else { if (likely(__Pyx_TypeCheck(obj, type))) return 1; } type_name = __Pyx_PyType_GetName(type); obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); PyErr_Format(PyExc_TypeError, "Argument '%.200s' has incorrect type (expected " __Pyx_FMT_TYPENAME ", got " __Pyx_FMT_TYPENAME ")", name, type_name, obj_type_name); __Pyx_DECREF_TypeName(type_name); __Pyx_DECREF_TypeName(obj_type_name); return 0; } /* IterFinish */ static CYTHON_INLINE int __Pyx_IterFinish(void) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType(); if (unlikely(exc_type)) { if (unlikely(!__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) return -1; __Pyx_PyErr_Clear(); return 0; } return 0; } /* PyObjectCallNoArg */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { PyObject *arg[2] = {NULL, NULL}; return __Pyx_PyObject_FastCall(func, arg + 1, 0 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); } /* PyObjectGetMethod */ static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { PyObject *attr; #if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP __Pyx_TypeName type_name; PyTypeObject *tp = Py_TYPE(obj); PyObject *descr; descrgetfunc f = NULL; PyObject **dictptr, *dict; int meth_found = 0; assert (*method == NULL); if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { attr = __Pyx_PyObject_GetAttrStr(obj, name); goto try_unpack; } if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { return 0; } descr = _PyType_Lookup(tp, name); if (likely(descr != NULL)) { Py_INCREF(descr); #if defined(Py_TPFLAGS_METHOD_DESCRIPTOR) && Py_TPFLAGS_METHOD_DESCRIPTOR if (__Pyx_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) #elif PY_MAJOR_VERSION >= 3 #ifdef __Pyx_CyFunction_USED if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) #else if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type))) #endif #else #ifdef __Pyx_CyFunction_USED if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) #else if (likely(PyFunction_Check(descr))) #endif #endif { meth_found = 1; } else { f = Py_TYPE(descr)->tp_descr_get; if (f != NULL && PyDescr_IsData(descr)) { attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); goto try_unpack; } } } dictptr = _PyObject_GetDictPtr(obj); if (dictptr != NULL && (dict = *dictptr) != NULL) { Py_INCREF(dict); attr = __Pyx_PyDict_GetItemStr(dict, name); if (attr != NULL) { Py_INCREF(attr); Py_DECREF(dict); Py_XDECREF(descr); goto try_unpack; } Py_DECREF(dict); } if (meth_found) { *method = descr; return 1; } if (f != NULL) { attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); goto try_unpack; } if (likely(descr != NULL)) { *method = descr; return 0; } type_name = __Pyx_PyType_GetName(tp); PyErr_Format(PyExc_AttributeError, #if PY_MAJOR_VERSION >= 3 "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", type_name, name); #else "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", type_name, PyString_AS_STRING(name)); #endif __Pyx_DECREF_TypeName(type_name); return 0; #else attr = __Pyx_PyObject_GetAttrStr(obj, name); goto try_unpack; #endif try_unpack: #if CYTHON_UNPACK_METHODS if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { PyObject *function = PyMethod_GET_FUNCTION(attr); Py_INCREF(function); Py_DECREF(attr); *method = function; return 1; } #endif *method = attr; return 0; } /* PyObjectCallMethod0 */ static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) { PyObject *method = NULL, *result = NULL; int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); if (likely(is_method)) { result = __Pyx_PyObject_CallOneArg(method, obj); Py_DECREF(method); return result; } if (unlikely(!method)) goto bad; result = __Pyx_PyObject_CallNoArg(method); Py_DECREF(method); bad: return result; } /* RaiseNeedMoreValuesToUnpack */ static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { PyErr_Format(PyExc_ValueError, "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", index, (index == 1) ? "" : "s"); } /* RaiseTooManyValuesToUnpack */ static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { PyErr_Format(PyExc_ValueError, "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); } /* UnpackItemEndCheck */ static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { if (unlikely(retval)) { Py_DECREF(retval); __Pyx_RaiseTooManyValuesError(expected); return -1; } return __Pyx_IterFinish(); } /* RaiseNoneIterError */ static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); } /* UnpackTupleError */ static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) { if (t == Py_None) { __Pyx_RaiseNoneNotIterableError(); } else if (PyTuple_GET_SIZE(t) < index) { __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t)); } else { __Pyx_RaiseTooManyValuesError(index); } } /* UnpackTuple2 */ static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, int decref_tuple) { PyObject *value1 = NULL, *value2 = NULL; #if CYTHON_COMPILING_IN_PYPY value1 = PySequence_ITEM(tuple, 0); if (unlikely(!value1)) goto bad; value2 = PySequence_ITEM(tuple, 1); if (unlikely(!value2)) goto bad; #else value1 = PyTuple_GET_ITEM(tuple, 0); Py_INCREF(value1); value2 = PyTuple_GET_ITEM(tuple, 1); Py_INCREF(value2); #endif if (decref_tuple) { Py_DECREF(tuple); } *pvalue1 = value1; *pvalue2 = value2; return 0; #if CYTHON_COMPILING_IN_PYPY bad: Py_XDECREF(value1); Py_XDECREF(value2); if (decref_tuple) { Py_XDECREF(tuple); } return -1; #endif } static int __Pyx_unpack_tuple2_generic(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, int has_known_size, int decref_tuple) { Py_ssize_t index; PyObject *value1 = NULL, *value2 = NULL, *iter = NULL; iternextfunc iternext; iter = PyObject_GetIter(tuple); if (unlikely(!iter)) goto bad; if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; } iternext = __Pyx_PyObject_GetIterNextFunc(iter); value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; } value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; } if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad; Py_DECREF(iter); *pvalue1 = value1; *pvalue2 = value2; return 0; unpacking_failed: if (!has_known_size && __Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); bad: Py_XDECREF(iter); Py_XDECREF(value1); Py_XDECREF(value2); if (decref_tuple) { Py_XDECREF(tuple); } return -1; } /* dict_iter */ #if CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 #include #endif static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name, Py_ssize_t* p_orig_length, int* p_source_is_dict) { is_dict = is_dict || likely(PyDict_CheckExact(iterable)); *p_source_is_dict = is_dict; if (is_dict) { #if !CYTHON_COMPILING_IN_PYPY *p_orig_length = PyDict_Size(iterable); Py_INCREF(iterable); return iterable; #elif PY_MAJOR_VERSION >= 3 static PyObject *py_items = NULL, *py_keys = NULL, *py_values = NULL; PyObject **pp = NULL; if (method_name) { const char *name = PyUnicode_AsUTF8(method_name); if (strcmp(name, "iteritems") == 0) pp = &py_items; else if (strcmp(name, "iterkeys") == 0) pp = &py_keys; else if (strcmp(name, "itervalues") == 0) pp = &py_values; if (pp) { if (!*pp) { *pp = PyUnicode_FromString(name + 4); if (!*pp) return NULL; } method_name = *pp; } } #endif } *p_orig_length = 0; if (method_name) { PyObject* iter; iterable = __Pyx_PyObject_CallMethod0(iterable, method_name); if (!iterable) return NULL; #if !CYTHON_COMPILING_IN_PYPY if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable)) return iterable; #endif iter = PyObject_GetIter(iterable); Py_DECREF(iterable); return iter; } return PyObject_GetIter(iterable); } static CYTHON_INLINE int __Pyx_dict_iter_next( PyObject* iter_obj, CYTHON_NCP_UNUSED Py_ssize_t orig_length, CYTHON_NCP_UNUSED Py_ssize_t* ppos, PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) { PyObject* next_item; #if !CYTHON_COMPILING_IN_PYPY if (source_is_dict) { PyObject *key, *value; if (unlikely(orig_length != PyDict_Size(iter_obj))) { PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration"); return -1; } if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) { return 0; } if (pitem) { PyObject* tuple = PyTuple_New(2); if (unlikely(!tuple)) { return -1; } Py_INCREF(key); Py_INCREF(value); PyTuple_SET_ITEM(tuple, 0, key); PyTuple_SET_ITEM(tuple, 1, value); *pitem = tuple; } else { if (pkey) { Py_INCREF(key); *pkey = key; } if (pvalue) { Py_INCREF(value); *pvalue = value; } } return 1; } else if (PyTuple_CheckExact(iter_obj)) { Py_ssize_t pos = *ppos; if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0; *ppos = pos + 1; next_item = PyTuple_GET_ITEM(iter_obj, pos); Py_INCREF(next_item); } else if (PyList_CheckExact(iter_obj)) { Py_ssize_t pos = *ppos; if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0; *ppos = pos + 1; next_item = PyList_GET_ITEM(iter_obj, pos); Py_INCREF(next_item); } else #endif { next_item = PyIter_Next(iter_obj); if (unlikely(!next_item)) { return __Pyx_IterFinish(); } } if (pitem) { *pitem = next_item; } else if (pkey && pvalue) { if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1)) return -1; } else if (pkey) { *pkey = next_item; } else { *pvalue = next_item; } return 1; } /* GetTopmostException */ #if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate) { _PyErr_StackItem *exc_info = tstate->exc_info; while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) && exc_info->previous_item != NULL) { exc_info = exc_info->previous_item; } return exc_info; } #endif /* ReRaiseException */ static CYTHON_INLINE void __Pyx_ReraiseException(void) { PyObject *type = NULL, *value = NULL, *tb = NULL; #if CYTHON_FAST_THREAD_STATE PyThreadState *tstate = PyThreadState_GET(); #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); value = exc_info->exc_value; #if PY_VERSION_HEX >= 0x030B00a4 if (unlikely(value == Py_None)) { value = NULL; } else if (value) { Py_INCREF(value); type = (PyObject*) Py_TYPE(value); Py_INCREF(type); tb = PyException_GetTraceback(value); } #else type = exc_info->exc_type; tb = exc_info->exc_traceback; Py_XINCREF(type); Py_XINCREF(value); Py_XINCREF(tb); #endif #else type = tstate->exc_type; value = tstate->exc_value; tb = tstate->exc_traceback; Py_XINCREF(type); Py_XINCREF(value); Py_XINCREF(tb); #endif #else PyErr_GetExcInfo(&type, &value, &tb); #endif if (unlikely(!type || type == Py_None)) { Py_XDECREF(type); Py_XDECREF(value); Py_XDECREF(tb); PyErr_SetString(PyExc_RuntimeError, "No active exception to reraise"); } else { PyErr_Restore(type, value, tb); } } /* GetException */ #if CYTHON_FAST_THREAD_STATE static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) #endif { PyObject *local_type = NULL, *local_value, *local_tb = NULL; #if CYTHON_FAST_THREAD_STATE PyObject *tmp_type, *tmp_value, *tmp_tb; #if PY_VERSION_HEX >= 0x030C00A6 local_value = tstate->current_exception; tstate->current_exception = 0; if (likely(local_value)) { local_type = (PyObject*) Py_TYPE(local_value); Py_INCREF(local_type); local_tb = PyException_GetTraceback(local_value); } #else local_type = tstate->curexc_type; local_value = tstate->curexc_value; local_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #endif #else PyErr_Fetch(&local_type, &local_value, &local_tb); #endif PyErr_NormalizeException(&local_type, &local_value, &local_tb); #if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6 if (unlikely(tstate->current_exception)) #elif CYTHON_FAST_THREAD_STATE if (unlikely(tstate->curexc_type)) #else if (unlikely(PyErr_Occurred())) #endif goto bad; #if PY_MAJOR_VERSION >= 3 if (local_tb) { if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) goto bad; } #endif Py_XINCREF(local_tb); Py_XINCREF(local_type); Py_XINCREF(local_value); *type = local_type; *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE #if CYTHON_USE_EXC_INFO_STACK { _PyErr_StackItem *exc_info = tstate->exc_info; #if PY_VERSION_HEX >= 0x030B00a4 tmp_value = exc_info->exc_value; exc_info->exc_value = local_value; tmp_type = NULL; tmp_tb = NULL; Py_XDECREF(local_type); Py_XDECREF(local_tb); #else tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = local_type; exc_info->exc_value = local_value; exc_info->exc_traceback = local_tb; #endif } #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = local_type; tstate->exc_value = local_value; tstate->exc_traceback = local_tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_SetExcInfo(local_type, local_value, local_tb); #endif return 0; bad: *type = 0; *value = 0; *tb = 0; Py_XDECREF(local_type); Py_XDECREF(local_value); Py_XDECREF(local_tb); return -1; } /* SwapException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 _PyErr_StackItem *exc_info = tstate->exc_info; tmp_value = exc_info->exc_value; exc_info->exc_value = *value; if (tmp_value == NULL || tmp_value == Py_None) { Py_XDECREF(tmp_value); tmp_value = NULL; tmp_type = NULL; tmp_tb = NULL; } else { tmp_type = (PyObject*) Py_TYPE(tmp_value); Py_INCREF(tmp_type); #if CYTHON_COMPILING_IN_CPYTHON tmp_tb = ((PyBaseExceptionObject*) tmp_value)->traceback; Py_XINCREF(tmp_tb); #else tmp_tb = PyException_GetTraceback(tmp_value); #endif } #elif CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = *type; exc_info->exc_value = *value; exc_info->exc_traceback = *tb; #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = *type; tstate->exc_value = *value; tstate->exc_traceback = *tb; #endif *type = tmp_type; *value = tmp_value; *tb = tmp_tb; } #else static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); PyErr_SetExcInfo(*type, *value, *tb); *type = tmp_type; *value = tmp_value; *tb = tmp_tb; } #endif /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); PyObject *exc_value = exc_info->exc_value; if (exc_value == NULL || exc_value == Py_None) { *value = NULL; *type = NULL; *tb = NULL; } else { *value = exc_value; Py_INCREF(*value); *type = (PyObject*) Py_TYPE(exc_value); Py_INCREF(*type); *tb = PyException_GetTraceback(exc_value); } #elif CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); *type = exc_info->exc_type; *value = exc_info->exc_value; *tb = exc_info->exc_traceback; Py_XINCREF(*type); Py_XINCREF(*value); Py_XINCREF(*tb); #else *type = tstate->exc_type; *value = tstate->exc_value; *tb = tstate->exc_traceback; Py_XINCREF(*type); Py_XINCREF(*value); Py_XINCREF(*tb); #endif } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 _PyErr_StackItem *exc_info = tstate->exc_info; PyObject *tmp_value = exc_info->exc_value; exc_info->exc_value = value; Py_XDECREF(tmp_value); Py_XDECREF(type); Py_XDECREF(tb); #else PyObject *tmp_type, *tmp_value, *tmp_tb; #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = type; exc_info->exc_value = value; exc_info->exc_traceback = tb; #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = type; tstate->exc_value = value; tstate->exc_traceback = tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #endif } #endif /* TypeImport */ #ifndef __PYX_HAVE_RT_ImportType_3_0_5 #define __PYX_HAVE_RT_ImportType_3_0_5 static PyTypeObject *__Pyx_ImportType_3_0_5(PyObject *module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_5 check_size) { PyObject *result = 0; char warning[200]; Py_ssize_t basicsize; Py_ssize_t itemsize; #if CYTHON_COMPILING_IN_LIMITED_API PyObject *py_basicsize; PyObject *py_itemsize; #endif result = PyObject_GetAttrString(module, class_name); if (!result) goto bad; if (!PyType_Check(result)) { PyErr_Format(PyExc_TypeError, "%.200s.%.200s is not a type object", module_name, class_name); goto bad; } #if !CYTHON_COMPILING_IN_LIMITED_API basicsize = ((PyTypeObject *)result)->tp_basicsize; itemsize = ((PyTypeObject *)result)->tp_itemsize; #else py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); if (!py_basicsize) goto bad; basicsize = PyLong_AsSsize_t(py_basicsize); Py_DECREF(py_basicsize); py_basicsize = 0; if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) goto bad; py_itemsize = PyObject_GetAttrString(result, "__itemsize__"); if (!py_itemsize) goto bad; itemsize = PyLong_AsSsize_t(py_itemsize); Py_DECREF(py_itemsize); py_itemsize = 0; if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred()) goto bad; #endif if (itemsize) { if (size % alignment) { alignment = size % alignment; } if (itemsize < (Py_ssize_t)alignment) itemsize = (Py_ssize_t)alignment; } if ((size_t)(basicsize + itemsize) < size) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize+itemsize); goto bad; } if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_5 && ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd-%zd from PyObject", module_name, class_name, size, basicsize, basicsize+itemsize); goto bad; } else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_5 && (size_t)basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; } return (PyTypeObject *)result; bad: Py_XDECREF(result); return NULL; } #endif /* Import */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { PyObject *module = 0; PyObject *empty_dict = 0; PyObject *empty_list = 0; #if PY_MAJOR_VERSION < 3 PyObject *py_import; py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); if (unlikely(!py_import)) goto bad; if (!from_list) { empty_list = PyList_New(0); if (unlikely(!empty_list)) goto bad; from_list = empty_list; } #endif empty_dict = PyDict_New(); if (unlikely(!empty_dict)) goto bad; { #if PY_MAJOR_VERSION >= 3 if (level == -1) { if (strchr(__Pyx_MODULE_NAME, '.') != NULL) { module = PyImport_ImportModuleLevelObject( name, __pyx_d, empty_dict, from_list, 1); if (unlikely(!module)) { if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError))) goto bad; PyErr_Clear(); } } level = 0; } #endif if (!module) { #if PY_MAJOR_VERSION < 3 PyObject *py_level = PyInt_FromLong(level); if (unlikely(!py_level)) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL); Py_DECREF(py_level); #else module = PyImport_ImportModuleLevelObject( name, __pyx_d, empty_dict, from_list, level); #endif } } bad: Py_XDECREF(empty_dict); Py_XDECREF(empty_list); #if PY_MAJOR_VERSION < 3 Py_XDECREF(py_import); #endif return module; } /* ImportFrom */ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { const char* module_name_str = 0; PyObject* module_name = 0; PyObject* module_dot = 0; PyObject* full_name = 0; PyErr_Clear(); module_name_str = PyModule_GetName(module); if (unlikely(!module_name_str)) { goto modbad; } module_name = PyUnicode_FromString(module_name_str); if (unlikely(!module_name)) { goto modbad; } module_dot = PyUnicode_Concat(module_name, __pyx_kp_u__4); if (unlikely(!module_dot)) { goto modbad; } full_name = PyUnicode_Concat(module_dot, name); if (unlikely(!full_name)) { goto modbad; } #if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) goto modbad; value = PyObject_GetItem(modules, full_name); } #else value = PyImport_GetModule(full_name); #endif modbad: Py_XDECREF(full_name); Py_XDECREF(module_dot); Py_XDECREF(module_name); } if (unlikely(!value)) { PyErr_Format(PyExc_ImportError, #if PY_MAJOR_VERSION < 3 "cannot import name %.230s", PyString_AS_STRING(name)); #else "cannot import name %S", name); #endif } return value; } /* PyDictVersioning */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { PyObject *dict = Py_TYPE(obj)->tp_dict; return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; } static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { PyObject **dictptr = NULL; Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; if (offset) { #if CYTHON_COMPILING_IN_CPYTHON dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); #else dictptr = _PyObject_GetDictPtr(obj); #endif } return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; } static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { PyObject *dict = Py_TYPE(obj)->tp_dict; if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) return 0; return obj_dict_version == __Pyx_get_object_dict_version(obj); } #endif /* GetModuleGlobalName */ #if CYTHON_USE_DICT_VERSIONS static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) #else static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) #endif { PyObject *result; #if !CYTHON_AVOID_BORROWED_REFS #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && PY_VERSION_HEX < 0x030d0000 result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } else if (unlikely(PyErr_Occurred())) { return NULL; } #elif CYTHON_COMPILING_IN_LIMITED_API if (unlikely(!__pyx_m)) { return NULL; } result = PyObject_GetAttr(__pyx_m, name); if (likely(result)) { return result; } #else result = PyDict_GetItem(__pyx_d, name); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } #endif #else result = PyObject_GetItem(__pyx_d, name); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } PyErr_Clear(); #endif return __Pyx_GetBuiltinName(name); } /* FixUpExtensionType */ #if CYTHON_USE_TYPE_SPECS static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { #if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API CYTHON_UNUSED_VAR(spec); CYTHON_UNUSED_VAR(type); #else const PyType_Slot *slot = spec->slots; while (slot && slot->slot && slot->slot != Py_tp_members) slot++; if (slot && slot->slot == Py_tp_members) { int changed = 0; #if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) const #endif PyMemberDef *memb = (PyMemberDef*) slot->pfunc; while (memb && memb->name) { if (memb->name[0] == '_' && memb->name[1] == '_') { #if PY_VERSION_HEX < 0x030900b1 if (strcmp(memb->name, "__weaklistoffset__") == 0) { assert(memb->type == T_PYSSIZET); assert(memb->flags == READONLY); type->tp_weaklistoffset = memb->offset; changed = 1; } else if (strcmp(memb->name, "__dictoffset__") == 0) { assert(memb->type == T_PYSSIZET); assert(memb->flags == READONLY); type->tp_dictoffset = memb->offset; changed = 1; } #if CYTHON_METH_FASTCALL else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { assert(memb->type == T_PYSSIZET); assert(memb->flags == READONLY); #if PY_VERSION_HEX >= 0x030800b4 type->tp_vectorcall_offset = memb->offset; #else type->tp_print = (printfunc) memb->offset; #endif changed = 1; } #endif #else if ((0)); #endif #if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON else if (strcmp(memb->name, "__module__") == 0) { PyObject *descr; assert(memb->type == T_OBJECT); assert(memb->flags == 0 || memb->flags == READONLY); descr = PyDescr_NewMember(type, memb); if (unlikely(!descr)) return -1; if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { Py_DECREF(descr); return -1; } Py_DECREF(descr); changed = 1; } #endif } memb++; } if (changed) PyType_Modified(type); } #endif return 0; } #endif /* FetchSharedCythonModule */ static PyObject *__Pyx_FetchSharedCythonABIModule(void) { return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); } /* FetchCommonType */ static int __Pyx_VerifyCachedType(PyObject *cached_type, const char *name, Py_ssize_t basicsize, Py_ssize_t expected_basicsize) { if (!PyType_Check(cached_type)) { PyErr_Format(PyExc_TypeError, "Shared Cython type %.200s is not a type object", name); return -1; } if (basicsize != expected_basicsize) { PyErr_Format(PyExc_TypeError, "Shared Cython type %.200s has the wrong size, try recompiling", name); return -1; } return 0; } #if !CYTHON_USE_TYPE_SPECS static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { PyObject* abi_module; const char* object_name; PyTypeObject *cached_type = NULL; abi_module = __Pyx_FetchSharedCythonABIModule(); if (!abi_module) return NULL; object_name = strrchr(type->tp_name, '.'); object_name = object_name ? object_name+1 : type->tp_name; cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); if (cached_type) { if (__Pyx_VerifyCachedType( (PyObject *)cached_type, object_name, cached_type->tp_basicsize, type->tp_basicsize) < 0) { goto bad; } goto done; } if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; PyErr_Clear(); if (PyType_Ready(type) < 0) goto bad; if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) goto bad; Py_INCREF(type); cached_type = type; done: Py_DECREF(abi_module); return cached_type; bad: Py_XDECREF(cached_type); cached_type = NULL; goto done; } #else static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { PyObject *abi_module, *cached_type = NULL; const char* object_name = strrchr(spec->name, '.'); object_name = object_name ? object_name+1 : spec->name; abi_module = __Pyx_FetchSharedCythonABIModule(); if (!abi_module) return NULL; cached_type = PyObject_GetAttrString(abi_module, object_name); if (cached_type) { Py_ssize_t basicsize; #if CYTHON_COMPILING_IN_LIMITED_API PyObject *py_basicsize; py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); if (unlikely(!py_basicsize)) goto bad; basicsize = PyLong_AsSsize_t(py_basicsize); Py_DECREF(py_basicsize); py_basicsize = 0; if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; #else basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; #endif if (__Pyx_VerifyCachedType( cached_type, object_name, basicsize, spec->basicsize) < 0) { goto bad; } goto done; } if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; PyErr_Clear(); CYTHON_UNUSED_VAR(module); cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); if (unlikely(!cached_type)) goto bad; if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; done: Py_DECREF(abi_module); assert(cached_type == NULL || PyType_Check(cached_type)); return (PyTypeObject *) cached_type; bad: Py_XDECREF(cached_type); cached_type = NULL; goto done; } #endif /* PyVectorcallFastCallDict */ #if CYTHON_METH_FASTCALL static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) { PyObject *res = NULL; PyObject *kwnames; PyObject **newargs; PyObject **kwvalues; Py_ssize_t i, pos; size_t j; PyObject *key, *value; unsigned long keys_are_strings; Py_ssize_t nkw = PyDict_GET_SIZE(kw); newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); if (unlikely(newargs == NULL)) { PyErr_NoMemory(); return NULL; } for (j = 0; j < nargs; j++) newargs[j] = args[j]; kwnames = PyTuple_New(nkw); if (unlikely(kwnames == NULL)) { PyMem_Free(newargs); return NULL; } kwvalues = newargs + nargs; pos = i = 0; keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; while (PyDict_Next(kw, &pos, &key, &value)) { keys_are_strings &= Py_TYPE(key)->tp_flags; Py_INCREF(key); Py_INCREF(value); PyTuple_SET_ITEM(kwnames, i, key); kwvalues[i] = value; i++; } if (unlikely(!keys_are_strings)) { PyErr_SetString(PyExc_TypeError, "keywords must be strings"); goto cleanup; } res = vc(func, newargs, nargs, kwnames); cleanup: Py_DECREF(kwnames); for (i = 0; i < nkw; i++) Py_DECREF(kwvalues[i]); PyMem_Free(newargs); return res; } static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) { if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { return vc(func, args, nargs, NULL); } return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); } #endif /* CythonFunctionShared */ #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { if (__Pyx_CyFunction_Check(func)) { return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; } else if (PyCFunction_Check(func)) { return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; } return 0; } #else static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; } #endif static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API __Pyx_Py_XDECREF_SET( __Pyx_CyFunction_GetClassObj(f), ((classobj) ? __Pyx_NewRef(classobj) : NULL)); #else __Pyx_Py_XDECREF_SET( ((PyCMethodObject *) (f))->mm_class, (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); #endif } static PyObject * __Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) { CYTHON_UNUSED_VAR(closure); if (unlikely(op->func_doc == NULL)) { #if CYTHON_COMPILING_IN_LIMITED_API op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); if (unlikely(!op->func_doc)) return NULL; #else if (((PyCFunctionObject*)op)->m_ml->ml_doc) { #if PY_MAJOR_VERSION >= 3 op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); #else op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); #endif if (unlikely(op->func_doc == NULL)) return NULL; } else { Py_INCREF(Py_None); return Py_None; } #endif } Py_INCREF(op->func_doc); return op->func_doc; } static int __Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); if (value == NULL) { value = Py_None; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_doc, value); return 0; } static PyObject * __Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); if (unlikely(op->func_name == NULL)) { #if CYTHON_COMPILING_IN_LIMITED_API op->func_name = PyObject_GetAttrString(op->func, "__name__"); #elif PY_MAJOR_VERSION >= 3 op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); #else op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); #endif if (unlikely(op->func_name == NULL)) return NULL; } Py_INCREF(op->func_name); return op->func_name; } static int __Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); #if PY_MAJOR_VERSION >= 3 if (unlikely(value == NULL || !PyUnicode_Check(value))) #else if (unlikely(value == NULL || !PyString_Check(value))) #endif { PyErr_SetString(PyExc_TypeError, "__name__ must be set to a string object"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_name, value); return 0; } static PyObject * __Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); Py_INCREF(op->func_qualname); return op->func_qualname; } static int __Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); #if PY_MAJOR_VERSION >= 3 if (unlikely(value == NULL || !PyUnicode_Check(value))) #else if (unlikely(value == NULL || !PyString_Check(value))) #endif { PyErr_SetString(PyExc_TypeError, "__qualname__ must be set to a string object"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_qualname, value); return 0; } static PyObject * __Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); if (unlikely(op->func_dict == NULL)) { op->func_dict = PyDict_New(); if (unlikely(op->func_dict == NULL)) return NULL; } Py_INCREF(op->func_dict); return op->func_dict; } static int __Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); if (unlikely(value == NULL)) { PyErr_SetString(PyExc_TypeError, "function's dictionary may not be deleted"); return -1; } if (unlikely(!PyDict_Check(value))) { PyErr_SetString(PyExc_TypeError, "setting function's dictionary to a non-dict"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_dict, value); return 0; } static PyObject * __Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); Py_INCREF(op->func_globals); return op->func_globals; } static PyObject * __Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(op); CYTHON_UNUSED_VAR(context); Py_INCREF(Py_None); return Py_None; } static PyObject * __Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) { PyObject* result = (op->func_code) ? op->func_code : Py_None; CYTHON_UNUSED_VAR(context); Py_INCREF(result); return result; } static int __Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { int result = 0; PyObject *res = op->defaults_getter((PyObject *) op); if (unlikely(!res)) return -1; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS op->defaults_tuple = PyTuple_GET_ITEM(res, 0); Py_INCREF(op->defaults_tuple); op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); Py_INCREF(op->defaults_kwdict); #else op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); if (unlikely(!op->defaults_tuple)) result = -1; else { op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); if (unlikely(!op->defaults_kwdict)) result = -1; } #endif Py_DECREF(res); return result; } static int __Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); if (!value) { value = Py_None; } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { PyErr_SetString(PyExc_TypeError, "__defaults__ must be set to a tuple object"); return -1; } PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " "currently affect the values used in function calls", 1); Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); return 0; } static PyObject * __Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { PyObject* result = op->defaults_tuple; CYTHON_UNUSED_VAR(context); if (unlikely(!result)) { if (op->defaults_getter) { if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; result = op->defaults_tuple; } else { result = Py_None; } } Py_INCREF(result); return result; } static int __Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); if (!value) { value = Py_None; } else if (unlikely(value != Py_None && !PyDict_Check(value))) { PyErr_SetString(PyExc_TypeError, "__kwdefaults__ must be set to a dict object"); return -1; } PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " "currently affect the values used in function calls", 1); Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); return 0; } static PyObject * __Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { PyObject* result = op->defaults_kwdict; CYTHON_UNUSED_VAR(context); if (unlikely(!result)) { if (op->defaults_getter) { if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; result = op->defaults_kwdict; } else { result = Py_None; } } Py_INCREF(result); return result; } static int __Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); if (!value || value == Py_None) { value = NULL; } else if (unlikely(!PyDict_Check(value))) { PyErr_SetString(PyExc_TypeError, "__annotations__ must be set to a dict object"); return -1; } Py_XINCREF(value); __Pyx_Py_XDECREF_SET(op->func_annotations, value); return 0; } static PyObject * __Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { PyObject* result = op->func_annotations; CYTHON_UNUSED_VAR(context); if (unlikely(!result)) { result = PyDict_New(); if (unlikely(!result)) return NULL; op->func_annotations = result; } Py_INCREF(result); return result; } static PyObject * __Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { int is_coroutine; CYTHON_UNUSED_VAR(context); if (op->func_is_coroutine) { return __Pyx_NewRef(op->func_is_coroutine); } is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; #if PY_VERSION_HEX >= 0x03050000 if (is_coroutine) { PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; fromlist = PyList_New(1); if (unlikely(!fromlist)) return NULL; Py_INCREF(marker); #if CYTHON_ASSUME_SAFE_MACROS PyList_SET_ITEM(fromlist, 0, marker); #else if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { Py_DECREF(marker); Py_DECREF(fromlist); return NULL; } #endif module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); Py_DECREF(fromlist); if (unlikely(!module)) goto ignore; op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); Py_DECREF(module); if (likely(op->func_is_coroutine)) { return __Pyx_NewRef(op->func_is_coroutine); } ignore: PyErr_Clear(); } #endif op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); return __Pyx_NewRef(op->func_is_coroutine); } #if CYTHON_COMPILING_IN_LIMITED_API static PyObject * __Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); return PyObject_GetAttrString(op->func, "__module__"); } static int __Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); return PyObject_SetAttrString(op->func, "__module__", value); } #endif static PyGetSetDef __pyx_CyFunction_getsets[] = { {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, #if CYTHON_COMPILING_IN_LIMITED_API {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, #endif {0, 0, 0, 0, 0} }; static PyMemberDef __pyx_CyFunction_members[] = { #if !CYTHON_COMPILING_IN_LIMITED_API {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, #endif #if CYTHON_USE_TYPE_SPECS {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, #if CYTHON_METH_FASTCALL #if CYTHON_BACKPORT_VECTORCALL {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, #else #if !CYTHON_COMPILING_IN_LIMITED_API {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, #endif #endif #endif #if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, #else {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, #endif #endif {0, 0, 0, 0, 0} }; static PyObject * __Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) { CYTHON_UNUSED_VAR(args); #if PY_MAJOR_VERSION >= 3 Py_INCREF(m->func_qualname); return m->func_qualname; #else return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); #endif } static PyMethodDef __pyx_CyFunction_methods[] = { {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, {0, 0, 0, 0} }; #if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) #else #define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) #endif static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { #if !CYTHON_COMPILING_IN_LIMITED_API PyCFunctionObject *cf = (PyCFunctionObject*) op; #endif if (unlikely(op == NULL)) return NULL; #if CYTHON_COMPILING_IN_LIMITED_API op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); if (unlikely(!op->func)) return NULL; #endif op->flags = flags; __Pyx_CyFunction_weakreflist(op) = NULL; #if !CYTHON_COMPILING_IN_LIMITED_API cf->m_ml = ml; cf->m_self = (PyObject *) op; #endif Py_XINCREF(closure); op->func_closure = closure; #if !CYTHON_COMPILING_IN_LIMITED_API Py_XINCREF(module); cf->m_module = module; #endif op->func_dict = NULL; op->func_name = NULL; Py_INCREF(qualname); op->func_qualname = qualname; op->func_doc = NULL; #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API op->func_classobj = NULL; #else ((PyCMethodObject*)op)->mm_class = NULL; #endif op->func_globals = globals; Py_INCREF(op->func_globals); Py_XINCREF(code); op->func_code = code; op->defaults_pyobjects = 0; op->defaults_size = 0; op->defaults = NULL; op->defaults_tuple = NULL; op->defaults_kwdict = NULL; op->defaults_getter = NULL; op->func_annotations = NULL; op->func_is_coroutine = NULL; #if CYTHON_METH_FASTCALL switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { case METH_NOARGS: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; break; case METH_O: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; break; case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; break; case METH_FASTCALL | METH_KEYWORDS: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; break; case METH_VARARGS | METH_KEYWORDS: __Pyx_CyFunction_func_vectorcall(op) = NULL; break; default: PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); Py_DECREF(op); return NULL; } #endif return (PyObject *) op; } static int __Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) { Py_CLEAR(m->func_closure); #if CYTHON_COMPILING_IN_LIMITED_API Py_CLEAR(m->func); #else Py_CLEAR(((PyCFunctionObject*)m)->m_module); #endif Py_CLEAR(m->func_dict); Py_CLEAR(m->func_name); Py_CLEAR(m->func_qualname); Py_CLEAR(m->func_doc); Py_CLEAR(m->func_globals); Py_CLEAR(m->func_code); #if !CYTHON_COMPILING_IN_LIMITED_API #if PY_VERSION_HEX < 0x030900B1 Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); #else { PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; ((PyCMethodObject *) (m))->mm_class = NULL; Py_XDECREF(cls); } #endif #endif Py_CLEAR(m->defaults_tuple); Py_CLEAR(m->defaults_kwdict); Py_CLEAR(m->func_annotations); Py_CLEAR(m->func_is_coroutine); if (m->defaults) { PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); int i; for (i = 0; i < m->defaults_pyobjects; i++) Py_XDECREF(pydefaults[i]); PyObject_Free(m->defaults); m->defaults = NULL; } return 0; } static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) { if (__Pyx_CyFunction_weakreflist(m) != NULL) PyObject_ClearWeakRefs((PyObject *) m); __Pyx_CyFunction_clear(m); __Pyx_PyHeapTypeObject_GC_Del(m); } static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) { PyObject_GC_UnTrack(m); __Pyx__CyFunction_dealloc(m); } static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) { Py_VISIT(m->func_closure); #if CYTHON_COMPILING_IN_LIMITED_API Py_VISIT(m->func); #else Py_VISIT(((PyCFunctionObject*)m)->m_module); #endif Py_VISIT(m->func_dict); Py_VISIT(m->func_name); Py_VISIT(m->func_qualname); Py_VISIT(m->func_doc); Py_VISIT(m->func_globals); Py_VISIT(m->func_code); #if !CYTHON_COMPILING_IN_LIMITED_API Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); #endif Py_VISIT(m->defaults_tuple); Py_VISIT(m->defaults_kwdict); Py_VISIT(m->func_is_coroutine); if (m->defaults) { PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); int i; for (i = 0; i < m->defaults_pyobjects; i++) Py_VISIT(pydefaults[i]); } return 0; } static PyObject* __Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) { #if PY_MAJOR_VERSION >= 3 return PyUnicode_FromFormat("", op->func_qualname, (void *)op); #else return PyString_FromFormat("", PyString_AsString(op->func_qualname), (void *)op); #endif } static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { #if CYTHON_COMPILING_IN_LIMITED_API PyObject *f = ((__pyx_CyFunctionObject*)func)->func; PyObject *py_name = NULL; PyCFunction meth; int flags; meth = PyCFunction_GetFunction(f); if (unlikely(!meth)) return NULL; flags = PyCFunction_GetFlags(f); if (unlikely(flags < 0)) return NULL; #else PyCFunctionObject* f = (PyCFunctionObject*)func; PyCFunction meth = f->m_ml->ml_meth; int flags = f->m_ml->ml_flags; #endif Py_ssize_t size; switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { case METH_VARARGS: if (likely(kw == NULL || PyDict_Size(kw) == 0)) return (*meth)(self, arg); break; case METH_VARARGS | METH_KEYWORDS: return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); case METH_NOARGS: if (likely(kw == NULL || PyDict_Size(kw) == 0)) { #if CYTHON_ASSUME_SAFE_MACROS size = PyTuple_GET_SIZE(arg); #else size = PyTuple_Size(arg); if (unlikely(size < 0)) return NULL; #endif if (likely(size == 0)) return (*meth)(self, NULL); #if CYTHON_COMPILING_IN_LIMITED_API py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); if (!py_name) return NULL; PyErr_Format(PyExc_TypeError, "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", py_name, size); Py_DECREF(py_name); #else PyErr_Format(PyExc_TypeError, "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", f->m_ml->ml_name, size); #endif return NULL; } break; case METH_O: if (likely(kw == NULL || PyDict_Size(kw) == 0)) { #if CYTHON_ASSUME_SAFE_MACROS size = PyTuple_GET_SIZE(arg); #else size = PyTuple_Size(arg); if (unlikely(size < 0)) return NULL; #endif if (likely(size == 1)) { PyObject *result, *arg0; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS arg0 = PyTuple_GET_ITEM(arg, 0); #else arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; #endif result = (*meth)(self, arg0); #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) Py_DECREF(arg0); #endif return result; } #if CYTHON_COMPILING_IN_LIMITED_API py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); if (!py_name) return NULL; PyErr_Format(PyExc_TypeError, "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", py_name, size); Py_DECREF(py_name); #else PyErr_Format(PyExc_TypeError, "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", f->m_ml->ml_name, size); #endif return NULL; } break; default: PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); return NULL; } #if CYTHON_COMPILING_IN_LIMITED_API py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); if (!py_name) return NULL; PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", py_name); Py_DECREF(py_name); #else PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", f->m_ml->ml_name); #endif return NULL; } static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *self, *result; #if CYTHON_COMPILING_IN_LIMITED_API self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); if (unlikely(!self) && PyErr_Occurred()) return NULL; #else self = ((PyCFunctionObject*)func)->m_self; #endif result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); return result; } static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { PyObject *result; __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; #if CYTHON_METH_FASTCALL __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); if (vc) { #if CYTHON_ASSUME_SAFE_MACROS return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); #else (void) &__Pyx_PyVectorcall_FastCallDict; return PyVectorcall_Call(func, args, kw); #endif } #endif if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { Py_ssize_t argc; PyObject *new_args; PyObject *self; #if CYTHON_ASSUME_SAFE_MACROS argc = PyTuple_GET_SIZE(args); #else argc = PyTuple_Size(args); if (unlikely(!argc) < 0) return NULL; #endif new_args = PyTuple_GetSlice(args, 1, argc); if (unlikely(!new_args)) return NULL; self = PyTuple_GetItem(args, 0); if (unlikely(!self)) { Py_DECREF(new_args); #if PY_MAJOR_VERSION > 2 PyErr_Format(PyExc_TypeError, "unbound method %.200S() needs an argument", cyfunc->func_qualname); #else PyErr_SetString(PyExc_TypeError, "unbound method needs an argument"); #endif return NULL; } result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); Py_DECREF(new_args); } else { result = __Pyx_CyFunction_Call(func, args, kw); } return result; } #if CYTHON_METH_FASTCALL static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) { int ret = 0; if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { if (unlikely(nargs < 1)) { PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); return -1; } ret = 1; } if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); return -1; } return ret; } static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } if (unlikely(nargs != 0)) { PyErr_Format(PyExc_TypeError, "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", def->ml_name, nargs); return NULL; } return def->ml_meth(self, NULL); } static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } if (unlikely(nargs != 1)) { PyErr_Format(PyExc_TypeError, "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", def->ml_name, nargs); return NULL; } return def->ml_meth(self, args[0]); } static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); } static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); } #endif #if CYTHON_USE_TYPE_SPECS static PyType_Slot __pyx_CyFunctionType_slots[] = { {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, {Py_tp_methods, (void *)__pyx_CyFunction_methods}, {Py_tp_members, (void *)__pyx_CyFunction_members}, {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, {0, 0}, }; static PyType_Spec __pyx_CyFunctionType_spec = { __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", sizeof(__pyx_CyFunctionObject), 0, #ifdef Py_TPFLAGS_METHOD_DESCRIPTOR Py_TPFLAGS_METHOD_DESCRIPTOR | #endif #if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) _Py_TPFLAGS_HAVE_VECTORCALL | #endif Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, __pyx_CyFunctionType_slots }; #else static PyTypeObject __pyx_CyFunctionType_type = { PyVarObject_HEAD_INIT(0, 0) __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", sizeof(__pyx_CyFunctionObject), 0, (destructor) __Pyx_CyFunction_dealloc, #if !CYTHON_METH_FASTCALL 0, #elif CYTHON_BACKPORT_VECTORCALL (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), #else offsetof(PyCFunctionObject, vectorcall), #endif 0, 0, #if PY_MAJOR_VERSION < 3 0, #else 0, #endif (reprfunc) __Pyx_CyFunction_repr, 0, 0, 0, 0, __Pyx_CyFunction_CallAsMethod, 0, 0, 0, 0, #ifdef Py_TPFLAGS_METHOD_DESCRIPTOR Py_TPFLAGS_METHOD_DESCRIPTOR | #endif #if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL _Py_TPFLAGS_HAVE_VECTORCALL | #endif Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, 0, (traverseproc) __Pyx_CyFunction_traverse, (inquiry) __Pyx_CyFunction_clear, 0, #if PY_VERSION_HEX < 0x030500A0 offsetof(__pyx_CyFunctionObject, func_weakreflist), #else offsetof(PyCFunctionObject, m_weakreflist), #endif 0, 0, __pyx_CyFunction_methods, __pyx_CyFunction_members, __pyx_CyFunction_getsets, 0, 0, __Pyx_PyMethod_New, 0, offsetof(__pyx_CyFunctionObject, func_dict), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, #if PY_VERSION_HEX >= 0x030400a1 0, #endif #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, #endif #if __PYX_NEED_TP_PRINT_SLOT 0, #endif #if PY_VERSION_HEX >= 0x030C0000 0, #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 0, #endif }; #endif static int __pyx_CyFunction_init(PyObject *module) { #if CYTHON_USE_TYPE_SPECS __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); #else CYTHON_UNUSED_VAR(module); __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); #endif if (unlikely(__pyx_CyFunctionType == NULL)) { return -1; } return 0; } static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->defaults = PyObject_Malloc(size); if (unlikely(!m->defaults)) return PyErr_NoMemory(); memset(m->defaults, 0, size); m->defaults_pyobjects = pyobjects; m->defaults_size = size; return m->defaults; } static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->defaults_tuple = tuple; Py_INCREF(tuple); } static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->defaults_kwdict = dict; Py_INCREF(dict); } static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->func_annotations = dict; Py_INCREF(dict); } /* CythonFunction */ static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { PyObject *op = __Pyx_CyFunction_Init( PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), ml, flags, qualname, closure, module, globals, code ); if (likely(op)) { PyObject_GC_Track(op); } return op; } /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { PyObject *use_cline; PyObject *ptype, *pvalue, *ptraceback; #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif CYTHON_MAYBE_UNUSED_VAR(tstate); if (unlikely(!__pyx_cython_runtime)) { return c_line; } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); if (likely(cython_runtime_dict)) { __PYX_PY_DICT_LOOKUP_IF_MODIFIED( use_cline, *cython_runtime_dict, __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) } else #endif { PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); if (use_cline_obj) { use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; Py_DECREF(use_cline_obj); } else { PyErr_Clear(); use_cline = NULL; } } if (!use_cline) { c_line = 0; (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); } else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { c_line = 0; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); return c_line; } #endif /* CodeObjectCache */ #if !CYTHON_COMPILING_IN_LIMITED_API static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = start + (end - start) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } #endif /* AddTraceback */ #include "compile.h" #include "frameobject.h" #include "traceback.h" #if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API #ifndef Py_BUILD_CORE #define Py_BUILD_CORE 1 #endif #include "internal/pycore_frame.h" #endif #if CYTHON_COMPILING_IN_LIMITED_API static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, PyObject *firstlineno, PyObject *name) { PyObject *replace = NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; replace = PyObject_GetAttrString(code, "replace"); if (likely(replace)) { PyObject *result; result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); Py_DECREF(replace); return result; } PyErr_Clear(); #if __PYX_LIMITED_VERSION_HEX < 0x030780000 { PyObject *compiled = NULL, *result = NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; compiled = Py_CompileString( "out = type(code)(\n" " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" " code.co_lnotab)\n", "", Py_file_input); if (!compiled) return NULL; result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); Py_DECREF(compiled); if (!result) PyErr_Print(); Py_DECREF(result); result = PyDict_GetItemString(scratch_dict, "out"); if (result) Py_INCREF(result); return result; } #else return NULL; #endif } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; PyObject *replace = NULL, *getframe = NULL, *frame = NULL; PyObject *exc_type, *exc_value, *exc_traceback; int success = 0; if (c_line) { (void) __pyx_cfilenm; (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); } PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); code_object = Py_CompileString("_getframe()", filename, Py_eval_input); if (unlikely(!code_object)) goto bad; py_py_line = PyLong_FromLong(py_line); if (unlikely(!py_py_line)) goto bad; py_funcname = PyUnicode_FromString(funcname); if (unlikely(!py_funcname)) goto bad; dict = PyDict_New(); if (unlikely(!dict)) goto bad; { PyObject *old_code_object = code_object; code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); Py_DECREF(old_code_object); } if (unlikely(!code_object)) goto bad; getframe = PySys_GetObject("_getframe"); if (unlikely(!getframe)) goto bad; if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; frame = PyEval_EvalCode(code_object, dict, dict); if (unlikely(!frame) || frame == Py_None) goto bad; success = 1; bad: PyErr_Restore(exc_type, exc_value, exc_traceback); Py_XDECREF(code_object); Py_XDECREF(py_py_line); Py_XDECREF(py_funcname); Py_XDECREF(dict); Py_XDECREF(replace); if (success) { PyTraceBack_Here( (struct _frame*)frame); } Py_XDECREF(frame); } #else static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = NULL; PyObject *py_funcname = NULL; #if PY_MAJOR_VERSION < 3 PyObject *py_srcfile = NULL; py_srcfile = PyString_FromString(filename); if (!py_srcfile) goto bad; #endif if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); if (!py_funcname) goto bad; #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); if (!py_funcname) goto bad; funcname = PyUnicode_AsUTF8(py_funcname); if (!funcname) goto bad; #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); if (!py_funcname) goto bad; #endif } #if PY_MAJOR_VERSION < 3 py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); #else py_code = PyCode_NewEmpty(filename, funcname, py_line); #endif Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline return py_code; bad: Py_XDECREF(py_funcname); #if PY_MAJOR_VERSION < 3 Py_XDECREF(py_srcfile); #endif return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject *ptype, *pvalue, *ptraceback; if (c_line) { c_line = __Pyx_CLineForTraceback(tstate, c_line); } py_code = __pyx_find_code_object(c_line ? -c_line : py_line); if (!py_code) { __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) { /* If the code object creation fails, then we should clear the fetched exception references and propagate the new exception */ Py_XDECREF(ptype); Py_XDECREF(pvalue); Py_XDECREF(ptraceback); goto bad; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); } py_frame = PyFrame_New( tstate, /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; __Pyx_PyFrame_SetLineNumber(py_frame, py_line); PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } #endif /* FormatTypeName */ #if CYTHON_COMPILING_IN_LIMITED_API static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp) { PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, __pyx_n_s_name); if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { PyErr_Clear(); Py_XDECREF(name); name = __Pyx_NewRef(__pyx_n_s__7); } return name; } #endif /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; #if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); #else PyObject *from_bytes, *result = NULL; PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); if (!from_bytes) return NULL; py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); if (!py_bytes) goto limited_bad; order_str = PyUnicode_FromString(little ? "little" : "big"); if (!order_str) goto limited_bad; arg_tuple = PyTuple_Pack(2, py_bytes, order_str); if (!arg_tuple) goto limited_bad; if (!is_unsigned) { kwds = PyDict_New(); if (!kwds) goto limited_bad; if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; } result = PyObject_Call(from_bytes, arg_tuple, kwds); limited_bad: Py_XDECREF(kwds); Py_XDECREF(arg_tuple); Py_XDECREF(order_str); Py_XDECREF(py_bytes); Py_XDECREF(from_bytes); return result; #endif } } /* CIntFromPyVerify */ #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) #define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) #define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ {\ func_type value = func_value;\ if (sizeof(target_type) < sizeof(func_type)) {\ if (unlikely(value != (func_type) (target_type) value)) {\ func_type zero = 0;\ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ return (target_type) -1;\ if (is_unsigned && unlikely(value < zero))\ goto raise_neg_overflow;\ else\ goto raise_overflow;\ }\ }\ return (target_type) value;\ } /* CIntFromPy */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if ((sizeof(long) < sizeof(long))) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS if (unlikely(__Pyx_PyLong_IsNeg(x))) { goto raise_neg_overflow; } else if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_DigitCount(x)) { case 2: if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 3: if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 4: if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; } } #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if ((sizeof(long) <= sizeof(unsigned long))) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_SignedDigitCount(x)) { case -2: if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 2: if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -3: if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 3: if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -4: if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 4: if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; } } #endif if ((sizeof(long) <= sizeof(long))) { __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { long val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int ret = -1; #if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); #else PyObject *stepval = NULL, *mask = NULL, *shift = NULL; int bits, remaining_bits, is_negative = 0; long idigit; int chunk_size = (sizeof(long) < 8) ? 30 : 62; if (unlikely(!PyLong_CheckExact(v))) { PyObject *tmp = v; v = PyNumber_Long(v); assert(PyLong_CheckExact(v)); Py_DECREF(tmp); if (unlikely(!v)) return (long) -1; } #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(x) == 0) return (long) 0; is_negative = Py_SIZE(x) < 0; #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; is_negative = result == 1; } #endif if (is_unsigned && unlikely(is_negative)) { goto raise_neg_overflow; } else if (is_negative) { stepval = PyNumber_Invert(v); if (unlikely(!stepval)) return (long) -1; } else { stepval = __Pyx_NewRef(v); } val = (long) 0; mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { PyObject *tmp, *digit; digit = PyNumber_And(stepval, mask); if (unlikely(!digit)) goto done; idigit = PyLong_AsLong(digit); Py_DECREF(digit); if (unlikely(idigit < 0)) goto done; tmp = PyNumber_Rshift(stepval, shift); if (unlikely(!tmp)) goto done; Py_DECREF(stepval); stepval = tmp; val |= ((long) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(stepval) == 0) goto unpacking_done; #endif } idigit = PyLong_AsLong(stepval); if (unlikely(idigit < 0)) goto done; remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); if (unlikely(idigit >= (1L << remaining_bits))) goto raise_overflow; val |= ((long) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 unpacking_done: #endif if (!is_unsigned) { if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) goto raise_overflow; if (is_negative) val = ~val; } ret = 0; done: Py_XDECREF(shift); Py_XDECREF(mask); Py_XDECREF(stepval); #endif Py_DECREF(v); if (likely(!ret)) return val; } return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if ((sizeof(int) < sizeof(long))) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS if (unlikely(__Pyx_PyLong_IsNeg(x))) { goto raise_neg_overflow; } else if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_DigitCount(x)) { case 2: if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 3: if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 4: if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; } } #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if ((sizeof(int) <= sizeof(unsigned long))) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_SignedDigitCount(x)) { case -2: if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 2: if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -3: if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 3: if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -4: if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 4: if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; } } #endif if ((sizeof(int) <= sizeof(long))) { __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int ret = -1; #if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); #else PyObject *stepval = NULL, *mask = NULL, *shift = NULL; int bits, remaining_bits, is_negative = 0; long idigit; int chunk_size = (sizeof(long) < 8) ? 30 : 62; if (unlikely(!PyLong_CheckExact(v))) { PyObject *tmp = v; v = PyNumber_Long(v); assert(PyLong_CheckExact(v)); Py_DECREF(tmp); if (unlikely(!v)) return (int) -1; } #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(x) == 0) return (int) 0; is_negative = Py_SIZE(x) < 0; #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; is_negative = result == 1; } #endif if (is_unsigned && unlikely(is_negative)) { goto raise_neg_overflow; } else if (is_negative) { stepval = PyNumber_Invert(v); if (unlikely(!stepval)) return (int) -1; } else { stepval = __Pyx_NewRef(v); } val = (int) 0; mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { PyObject *tmp, *digit; digit = PyNumber_And(stepval, mask); if (unlikely(!digit)) goto done; idigit = PyLong_AsLong(digit); Py_DECREF(digit); if (unlikely(idigit < 0)) goto done; tmp = PyNumber_Rshift(stepval, shift); if (unlikely(!tmp)) goto done; Py_DECREF(stepval); stepval = tmp; val |= ((int) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(stepval) == 0) goto unpacking_done; #endif } idigit = PyLong_AsLong(stepval); if (unlikely(idigit < 0)) goto done; remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); if (unlikely(idigit >= (1L << remaining_bits))) goto raise_overflow; val |= ((int) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 unpacking_done: #endif if (!is_unsigned) { if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) goto raise_overflow; if (is_negative) val = ~val; } ret = 0; done: Py_XDECREF(shift); Py_XDECREF(mask); Py_XDECREF(stepval); #endif Py_DECREF(v); if (likely(!ret)) return val; } return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } /* FastTypeChecks */ #if CYTHON_COMPILING_IN_CPYTHON static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { while (a) { a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); if (a == b) return 1; } return b == &PyBaseObject_Type; } static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (a == b) return 1; mro = a->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(a, b); } static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (cls == a || cls == b) return 1; mro = cls->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { PyObject *base = PyTuple_GET_ITEM(mro, i); if (base == (PyObject *)a || base == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); } #if PY_MAJOR_VERSION == 2 static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { PyObject *exception, *value, *tb; int res; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&exception, &value, &tb); res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } if (!res) { res = PyObject_IsSubclass(err, exc_type2); if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } } __Pyx_ErrRestore(exception, value, tb); return res; } #else static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { if (exc_type1) { return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); } else { return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); } } #endif static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; assert(PyExceptionClass_Check(exc_type)); n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; i= 0x030B00A4 return Py_Version & ~0xFFUL; #else const char* rt_version = Py_GetVersion(); unsigned long version = 0; unsigned long factor = 0x01000000UL; unsigned int digit = 0; int i = 0; while (factor) { while ('0' <= rt_version[i] && rt_version[i] <= '9') { digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); ++i; } version += factor * digit; if (rt_version[i] != '.') break; digit = 0; factor >>= 8; ++i; } return version; #endif } static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { const unsigned long MAJOR_MINOR = 0xFFFF0000UL; if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) return 0; if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) return 1; { char message[200]; PyOS_snprintf(message, sizeof(message), "compile time Python version %d.%d " "of module '%.100s' " "%s " "runtime version %d.%d", (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), __Pyx_MODULE_NAME, (allow_newer) ? "was newer than" : "does not match", (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) ); return PyErr_WarnEx(NULL, message, 1); } } /* InitStrings */ #if PY_MAJOR_VERSION >= 3 static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { if (t.is_unicode | t.is_str) { if (t.intern) { *str = PyUnicode_InternFromString(t.s); } else if (t.encoding) { *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); } else { *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); } } else { *str = PyBytes_FromStringAndSize(t.s, t.n - 1); } if (!*str) return -1; if (PyObject_Hash(*str) == -1) return -1; return 0; } #endif static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION >= 3 __Pyx_InitString(*t, t->p); #else if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } if (!*t->p) return -1; if (PyObject_Hash(*t->p) == -1) return -1; #endif ++t; } return 0; } #include static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { size_t len = strlen(s); if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { PyErr_SetString(PyExc_OverflowError, "byte string is too long"); return -1; } return (Py_ssize_t) len; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { Py_ssize_t len = __Pyx_ssize_strlen(c_str); if (unlikely(len < 0)) return NULL; return __Pyx_PyUnicode_FromStringAndSize(c_str, len); } static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { Py_ssize_t len = __Pyx_ssize_strlen(c_str); if (unlikely(len < 0)) return NULL; return PyByteArray_FromStringAndSize(c_str, len); } static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #if !CYTHON_PEP393_ENABLED static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; } #else static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (likely(PyUnicode_IS_ASCII(o))) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif } #endif #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { return __Pyx_PyUnicode_AsStringAndSize(o, length); } else #endif #if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { int retval; if (unlikely(!x)) return -1; retval = __Pyx_PyObject_IsTrue(x); Py_DECREF(x); return retval; } static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); #if PY_MAJOR_VERSION >= 3 if (PyLong_Check(result)) { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " "The ability to return an instance of a strict subclass of int is deprecated, " "and may be removed in a future version of Python.", result_type_name)) { __Pyx_DECREF_TypeName(result_type_name); Py_DECREF(result); return NULL; } __Pyx_DECREF_TypeName(result_type_name); return result; } #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", type_name, type_name, result_type_name); __Pyx_DECREF_TypeName(result_type_name); Py_DECREF(result); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { #if CYTHON_USE_TYPE_SLOTS PyNumberMethods *m; #endif const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x) || PyLong_Check(x))) #else if (likely(PyLong_Check(x))) #endif return __Pyx_NewRef(x); #if CYTHON_USE_TYPE_SLOTS m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = m->nb_int(x); } else if (m && m->nb_long) { name = "long"; res = m->nb_long(x); } #else if (likely(m && m->nb_int)) { name = "int"; res = m->nb_int(x); } #endif #else if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { res = PyNumber_Int(x); } #endif if (likely(res)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { #else if (unlikely(!PyLong_CheckExact(res))) { #endif return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) { if (sizeof(Py_ssize_t) >= sizeof(long)) return PyInt_AS_LONG(b); else return PyInt_AsSsize_t(b); } #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_USE_PYLONG_INTERNALS if (likely(__Pyx_PyLong_IsCompact(b))) { return __Pyx_PyLong_CompactValue(b); } else { const digit* digits = __Pyx_PyLong_Digits(b); const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); switch (size) { case 2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; } } #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); #if PY_MAJOR_VERSION < 3 } else if (likely(PyInt_CheckExact(o))) { return PyInt_AS_LONG(o); #endif } else { Py_ssize_t ival; PyObject *x; x = PyNumber_Index(o); if (!x) return -1; ival = PyInt_AsLong(x); Py_DECREF(x); return ival; } } static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } /* #### Code section: utility_code_pragmas_end ### */ #ifdef _MSC_VER #pragma warning( pop ) #endif /* #### Code section: end ### */ #endif /* Py_PYTHON_H */ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/_http_writer.pyx0000644000175100001770000001073714607525266017556 0ustar00runnerdockerfrom cpython.bytes cimport PyBytes_FromStringAndSize from cpython.exc cimport PyErr_NoMemory from cpython.mem cimport PyMem_Free, PyMem_Malloc, PyMem_Realloc from cpython.object cimport PyObject_Str from libc.stdint cimport uint8_t, uint64_t from libc.string cimport memcpy from multidict import istr DEF BUF_SIZE = 16 * 1024 # 16KiB cdef char BUFFER[BUF_SIZE] cdef object _istr = istr # ----------------- writer --------------------------- cdef struct Writer: char *buf Py_ssize_t size Py_ssize_t pos cdef inline void _init_writer(Writer* writer): writer.buf = &BUFFER[0] writer.size = BUF_SIZE writer.pos = 0 cdef inline void _release_writer(Writer* writer): if writer.buf != BUFFER: PyMem_Free(writer.buf) cdef inline int _write_byte(Writer* writer, uint8_t ch): cdef char * buf cdef Py_ssize_t size if writer.pos == writer.size: # reallocate size = writer.size + BUF_SIZE if writer.buf == BUFFER: buf = PyMem_Malloc(size) if buf == NULL: PyErr_NoMemory() return -1 memcpy(buf, writer.buf, writer.size) else: buf = PyMem_Realloc(writer.buf, size) if buf == NULL: PyErr_NoMemory() return -1 writer.buf = buf writer.size = size writer.buf[writer.pos] = ch writer.pos += 1 return 0 cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): cdef uint64_t utf = symbol if utf < 0x80: return _write_byte(writer, utf) elif utf < 0x800: if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: return -1 return _write_byte(writer, (0x80 | (utf & 0x3f))) elif 0xD800 <= utf <= 0xDFFF: # surogate pair, ignored return 0 elif utf < 0x10000: if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: return -1 if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: return -1 return _write_byte(writer, (0x80 | (utf & 0x3f))) elif utf > 0x10FFFF: # symbol is too large return 0 else: if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: return -1 if _write_byte(writer, (0x80 | ((utf >> 12) & 0x3f))) < 0: return -1 if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: return -1 return _write_byte(writer, (0x80 | (utf & 0x3f))) cdef inline int _write_str(Writer* writer, str s): cdef Py_UCS4 ch for ch in s: if _write_utf8(writer, ch) < 0: return -1 # --------------- _serialize_headers ---------------------- cdef str to_str(object s): typ = type(s) if typ is str: return s elif typ is _istr: return PyObject_Str(s) elif not isinstance(s, str): raise TypeError("Cannot serialize non-str key {!r}".format(s)) else: return str(s) cdef void _safe_header(str string) except *: if "\r" in string or "\n" in string: raise ValueError( "Newline or carriage return character detected in HTTP status message or " "header. This is a potential security issue." ) def _serialize_headers(str status_line, headers): cdef Writer writer cdef object key cdef object val cdef bytes ret _init_writer(&writer) for key, val in headers.items(): _safe_header(to_str(key)) _safe_header(to_str(val)) try: if _write_str(&writer, status_line) < 0: raise if _write_byte(&writer, b'\r') < 0: raise if _write_byte(&writer, b'\n') < 0: raise for key, val in headers.items(): if _write_str(&writer, to_str(key)) < 0: raise if _write_byte(&writer, b':') < 0: raise if _write_byte(&writer, b' ') < 0: raise if _write_str(&writer, to_str(val)) < 0: raise if _write_byte(&writer, b'\r') < 0: raise if _write_byte(&writer, b'\n') < 0: raise if _write_byte(&writer, b'\r') < 0: raise if _write_byte(&writer, b'\n') < 0: raise return PyBytes_FromStringAndSize(writer.buf, writer.pos) finally: _release_writer(&writer) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285828.0 aiohttp-3.9.5/aiohttp/_websocket.c0000644000175100001770000106122614607525304016564 0ustar00runnerdocker/* Generated by Cython 3.0.5 */ #ifndef PY_SSIZE_T_CLEAN #define PY_SSIZE_T_CLEAN #endif /* PY_SSIZE_T_CLEAN */ #if defined(CYTHON_LIMITED_API) && 0 #ifndef Py_LIMITED_API #if CYTHON_LIMITED_API+0 > 0x03030000 #define Py_LIMITED_API CYTHON_LIMITED_API #else #define Py_LIMITED_API 0x03030000 #endif #endif #endif #include "Python.h" #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyFloat_FromString(obj) PyFloat_FromString(obj) #else #define __Pyx_PyFloat_FromString(obj) PyFloat_FromString(obj, NULL) #endif #if PY_MAJOR_VERSION <= 2 #define PyDict_GetItemWithError _PyDict_GetItemWithError #endif #if (PY_VERSION_HEX < 0x030700b1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030600)) && !defined(PyContextVar_Get) #define PyContextVar_Get(var, d, v) ((d) ? ((void)(var), Py_INCREF(d), (v)[0] = (d), 0) : ((v)[0] = NULL, 0) ) #endif #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.7+ or Python 3.3+. #else #if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API #define __PYX_EXTRA_ABI_MODULE_NAME "limited" #else #define __PYX_EXTRA_ABI_MODULE_NAME "" #endif #define CYTHON_ABI "3_0_5" __PYX_EXTRA_ABI_MODULE_NAME #define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI #define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." #define CYTHON_HEX_VERSION 0x030005F0 #define CYTHON_FUTURE_DIVISION 1 #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #define __PYX_COMMA , #ifndef HAVE_LONG_LONG #define HAVE_LONG_LONG #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX #if defined(GRAALVM_PYTHON) /* For very preliminary testing purposes. Most variables are set the same as PyPy. The existence of this section does not imply that anything works or is even tested */ #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 1 #define CYTHON_COMPILING_IN_NOGIL 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 0 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_GIL #define CYTHON_FAST_GIL 0 #undef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) #endif #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #undef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 #endif #elif defined(PYPY_VERSION) #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #ifndef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 0 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_GIL #define CYTHON_FAST_GIL 0 #undef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) #endif #if PY_VERSION_HEX < 0x03090000 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #endif #undef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 #endif #elif defined(CYTHON_LIMITED_API) #ifdef Py_LIMITED_API #undef __PYX_LIMITED_VERSION_HEX #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API #endif #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 1 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 0 #undef CYTHON_CLINE_IN_TRACEBACK #define CYTHON_CLINE_IN_TRACEBACK 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 1 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #endif #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_GIL #define CYTHON_FAST_GIL 0 #undef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS 1 #endif #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 1 #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #endif #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 #endif #elif defined(PY_NOGIL) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 1 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #ifndef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #endif #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 1 #endif #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #ifndef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 0 #endif #ifndef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 1 #endif #if PY_MAJOR_VERSION < 3 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #ifndef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 1 #endif #ifndef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 1 #endif #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #elif !defined(CYTHON_USE_UNICODE_WRITER) #define CYTHON_USE_UNICODE_WRITER 1 #endif #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #ifndef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_GIL #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) #endif #ifndef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) #endif #ifndef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 1 #endif #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS 1 #endif #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #endif #ifndef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 0 #endif #if PY_VERSION_HEX < 0x030400a1 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #elif !defined(CYTHON_USE_TP_FINALIZE) #define CYTHON_USE_TP_FINALIZE 1 #endif #if PY_VERSION_HEX < 0x030600B1 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #elif !defined(CYTHON_USE_DICT_VERSIONS) #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) #endif #if PY_VERSION_HEX < 0x030700A3 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #elif !defined(CYTHON_USE_EXC_INFO_STACK) #define CYTHON_USE_EXC_INFO_STACK 1 #endif #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if !defined(CYTHON_VECTORCALL) #define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) #endif #define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) #if CYTHON_USE_PYLONG_INTERNALS #if PY_MAJOR_VERSION < 3 #include "longintrepr.h" #endif #undef SHIFT #undef BASE #undef MASK #ifdef SIZEOF_VOID_P enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; #endif #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_cpp_attribute #define __has_cpp_attribute(x) 0 #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifndef CYTHON_UNUSED #if defined(__cplusplus) /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 * but leads to warnings with -pedantic, since it is a C++17 feature */ #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) #if __has_cpp_attribute(maybe_unused) #define CYTHON_UNUSED [[maybe_unused]] #endif #endif #endif #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif #ifndef CYTHON_UNUSED_VAR # if defined(__cplusplus) template void CYTHON_UNUSED_VAR( const T& ) { } # else # define CYTHON_UNUSED_VAR(x) (void)(x) # endif #endif #ifndef CYTHON_MAYBE_UNUSED_VAR #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) #endif #ifndef CYTHON_NCP_UNUSED # if CYTHON_COMPILING_IN_CPYTHON # define CYTHON_NCP_UNUSED # else # define CYTHON_NCP_UNUSED CYTHON_UNUSED # endif #endif #ifndef CYTHON_USE_CPP_STD_MOVE #if defined(__cplusplus) && (\ __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) #define CYTHON_USE_CPP_STD_MOVE 1 #else #define CYTHON_USE_CPP_STD_MOVE 0 #endif #endif #define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) #ifdef _MSC_VER #ifndef _MSC_STDINT_H_ #if _MSC_VER < 1300 typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #else typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #endif #endif #if _MSC_VER < 1300 #ifdef _WIN64 typedef unsigned long long __pyx_uintptr_t; #else typedef unsigned int __pyx_uintptr_t; #endif #else #ifdef _WIN64 typedef unsigned __int64 __pyx_uintptr_t; #else typedef unsigned __int32 __pyx_uintptr_t; #endif #endif #else #include typedef uintptr_t __pyx_uintptr_t; #endif #ifndef CYTHON_FALLTHROUGH #if defined(__cplusplus) /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 * but leads to warnings with -pedantic, since it is a C++17 feature */ #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) #if __has_cpp_attribute(fallthrough) #define CYTHON_FALLTHROUGH [[fallthrough]] #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_cpp_attribute(clang::fallthrough) #define CYTHON_FALLTHROUGH [[clang::fallthrough]] #elif __has_cpp_attribute(gnu::fallthrough) #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] #endif #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_attribute(fallthrough) #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) #else #define CYTHON_FALLTHROUGH #endif #endif #if defined(__clang__) && defined(__apple_build_version__) #if __apple_build_version__ < 7000000 #undef CYTHON_FALLTHROUGH #define CYTHON_FALLTHROUGH #endif #endif #endif #ifdef __cplusplus template struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) #else #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) #endif #if CYTHON_COMPILING_IN_PYPY == 1 #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) #else #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) #endif #define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) #ifndef CYTHON_INLINE #if defined(__clang__) #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) #elif defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_DefaultClassType PyClass_Type #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #define __Pyx_DefaultClassType PyType_Type #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, PyObject *code, PyObject *c, PyObject* n, PyObject *v, PyObject *fv, PyObject *cell, PyObject* fn, PyObject *name, int fline, PyObject *lnos) { PyObject *exception_table = NULL; PyObject *types_module=NULL, *code_type=NULL, *result=NULL; #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 PyObject *version_info; // borrowed #endif PyObject *py_minor_version = NULL; long minor_version = 0; PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 minor_version = 11; // we don't yet need to distinguish between versions > 11 #else if (!(version_info = PySys_GetObject("version_info"))) goto end; if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; minor_version = PyLong_AsLong(py_minor_version); if (minor_version == -1 && PyErr_Occurred()) goto end; #endif if (!(types_module = PyImport_ImportModule("types"))) goto end; if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; if (minor_version <= 7) { (void)p; result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, c, n, v, fn, name, fline, lnos, fv, cell); } else if (minor_version <= 10) { result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, c, n, v, fn, name, fline, lnos, fv, cell); } else { if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); } end: Py_XDECREF(code_type); Py_XDECREF(exception_table); Py_XDECREF(types_module); Py_XDECREF(py_minor_version); if (type) { PyErr_Restore(type, value, traceback); } return result; } #ifndef CO_OPTIMIZED #define CO_OPTIMIZED 0x0001 #endif #ifndef CO_NEWLOCALS #define CO_NEWLOCALS 0x0002 #endif #ifndef CO_VARARGS #define CO_VARARGS 0x0004 #endif #ifndef CO_VARKEYWORDS #define CO_VARKEYWORDS 0x0008 #endif #ifndef CO_ASYNC_GENERATOR #define CO_ASYNC_GENERATOR 0x0200 #endif #ifndef CO_GENERATOR #define CO_GENERATOR 0x0020 #endif #ifndef CO_COROUTINE #define CO_COROUTINE 0x0080 #endif #elif PY_VERSION_HEX >= 0x030B0000 static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, PyObject *code, PyObject *c, PyObject* n, PyObject *v, PyObject *fv, PyObject *cell, PyObject* fn, PyObject *name, int fline, PyObject *lnos) { PyCodeObject *result; PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); // we don't have access to __pyx_empty_bytes here if (!empty_bytes) return NULL; result = #if PY_VERSION_HEX >= 0x030C0000 PyUnstable_Code_NewWithPosOnlyArgs #else PyCode_NewWithPosOnlyArgs #endif (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); Py_DECREF(empty_bytes); return result; } #elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #endif #if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) #else #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) #define __Pyx_Py_Is(x, y) Py_Is(x, y) #else #define __Pyx_Py_Is(x, y) ((x) == (y)) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) #else #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) #else #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) #else #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) #endif #define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) #if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) #else #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) #endif #ifndef CO_COROUTINE #define CO_COROUTINE 0x80 #endif #ifndef CO_ASYNC_GENERATOR #define CO_ASYNC_GENERATOR 0x200 #endif #ifndef Py_TPFLAGS_CHECKTYPES #define Py_TPFLAGS_CHECKTYPES 0 #endif #ifndef Py_TPFLAGS_HAVE_INDEX #define Py_TPFLAGS_HAVE_INDEX 0 #endif #ifndef Py_TPFLAGS_HAVE_NEWBUFFER #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #ifndef Py_TPFLAGS_HAVE_FINALIZE #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #ifndef Py_TPFLAGS_SEQUENCE #define Py_TPFLAGS_SEQUENCE 0 #endif #ifndef Py_TPFLAGS_MAPPING #define Py_TPFLAGS_MAPPING 0 #endif #ifndef METH_STACKLESS #define METH_STACKLESS 0 #endif #if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) #ifndef METH_FASTCALL #define METH_FASTCALL 0x80 #endif typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else #define __Pyx_PyCFunctionFast _PyCFunctionFast #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords #endif #if CYTHON_METH_FASTCALL #define __Pyx_METH_FASTCALL METH_FASTCALL #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords #else #define __Pyx_METH_FASTCALL METH_VARARGS #define __Pyx_PyCFunction_FastCall PyCFunction #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords #endif #if CYTHON_VECTORCALL #define __pyx_vectorcallfunc vectorcallfunc #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) #elif CYTHON_BACKPORT_VECTORCALL typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames); #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) #else #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) #endif #if PY_MAJOR_VERSION >= 0x030900B1 #define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) #else #define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) #endif #define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) #elif !CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) #endif #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; } #endif static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { #if CYTHON_COMPILING_IN_LIMITED_API return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; #else return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; #endif } #define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) #if __PYX_LIMITED_VERSION_HEX < 0x030900B1 #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); #else #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) #define __Pyx_PyCMethod PyCMethod #endif #ifndef METH_METHOD #define METH_METHOD 0x200 #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) #define PyObject_Malloc(s) PyMem_Malloc(s) #define PyObject_Free(p) PyMem_Free(p) #define PyObject_Realloc(p) PyMem_Realloc(p) #endif #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) #else #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) #endif #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_PyThreadState_Current PyThreadState_Get() #elif !CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_Current PyThreadState_GET() #elif PY_VERSION_HEX >= 0x030d00A1 #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() #elif PY_VERSION_HEX >= 0x03060000 #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() #elif PY_VERSION_HEX >= 0x03000000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #else #define __Pyx_PyThreadState_Current _PyThreadState_Current #endif #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) { void *result; result = PyModule_GetState(op); if (!result) Py_FatalError("Couldn't find the module state"); return result; } #endif #define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) #else #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) #endif #if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) #include "pythread.h" #define Py_tss_NEEDS_INIT 0 typedef int Py_tss_t; static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { *key = PyThread_create_key(); return 0; } static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); *key = Py_tss_NEEDS_INIT; return key; } static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { PyObject_Free(key); } static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { return *key != Py_tss_NEEDS_INIT; } static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { PyThread_delete_key(*key); *key = Py_tss_NEEDS_INIT; } static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { return PyThread_set_key_value(*key, value); } static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { return PyThread_get_key_value(*key); } #endif #if PY_MAJOR_VERSION < 3 #if CYTHON_COMPILING_IN_PYPY #if PYPY_VERSION_NUM < 0x07030600 #if defined(__cplusplus) && __cplusplus >= 201402L [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] #elif defined(__GNUC__) || defined(__clang__) __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) #elif defined(_MSC_VER) __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) #endif static CYTHON_INLINE int PyGILState_Check(void) { return 0; } #else // PYPY_VERSION_NUM < 0x07030600 #endif // PYPY_VERSION_NUM < 0x07030600 #else static CYTHON_INLINE int PyGILState_Check(void) { PyThreadState * tstate = _PyThreadState_Current; return tstate && (tstate == PyGILState_GetThisThreadState()); } #endif #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) #else #define __Pyx_PyDict_NewPresized(n) PyDict_New() #endif #if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS #define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); if (res == NULL) PyErr_Clear(); return res; } #elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) #define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError #define __Pyx_PyDict_GetItemStr PyDict_GetItem #else static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { #if CYTHON_COMPILING_IN_PYPY return PyDict_GetItem(dict, name); #else PyDictEntry *ep; PyDictObject *mp = (PyDictObject*) dict; long hash = ((PyStringObject *) name)->ob_shash; assert(hash != -1); ep = (mp->ma_lookup)(mp, name, hash); if (ep == NULL) { return NULL; } return ep->me_value; #endif } #define __Pyx_PyDict_GetItemStr PyDict_GetItem #endif #if CYTHON_USE_TYPE_SLOTS #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) #else #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next #endif #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) #else #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) #endif #if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 #define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ PyTypeObject *type = Py_TYPE(obj);\ assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ PyObject_GC_Del(obj);\ Py_DECREF(type);\ } #else #define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) #endif #if CYTHON_COMPILING_IN_LIMITED_API #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) #define __Pyx_PyUnicode_DATA(u) ((void*)u) #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) #elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #if PY_VERSION_HEX >= 0x030C0000 #define __Pyx_PyUnicode_READY(op) (0) #else #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #endif #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) #if PY_VERSION_HEX >= 0x030C0000 #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) #else #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #endif #endif #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 #define PyUnicode_2BYTE_KIND 2 #define PyUnicode_4BYTE_KIND 4 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #endif #if CYTHON_COMPILING_IN_PYPY #if !defined(PyUnicode_DecodeUnicodeEscape) #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) #endif #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) #undef PyUnicode_Contains #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) #endif #if !defined(PyByteArray_Check) #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) #endif #if !defined(PyObject_Format) #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) #endif #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) #define PyObject_ASCII(o) PyObject_Repr(o) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #ifndef PyObject_Unicode #define PyObject_Unicode PyObject_Str #endif #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_PySequence_ListKeepNew(obj)\ (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) #else #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) #endif #if PY_VERSION_HEX >= 0x030900A4 #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) #else #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) #endif #if CYTHON_ASSUME_SAFE_MACROS #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) #else #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) #endif #if PY_VERSION_HEX >= 0x030d00A1 #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) #else static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { PyObject *module = PyImport_AddModule(name); Py_XINCREF(module); return module; } #endif #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define __Pyx_Py3Int_Check(op) PyLong_Check(op) #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #else #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t #endif #if CYTHON_USE_ASYNC_SLOTS #if PY_VERSION_HEX >= 0x030500B1 #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) #else #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) #endif #else #define __Pyx_PyType_AsAsync(obj) NULL #endif #ifndef __Pyx_PyAsyncMethodsStruct typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; } __Pyx_PyAsyncMethodsStruct; #endif #if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) #if !defined(_USE_MATH_DEFINES) #define _USE_MATH_DEFINES #endif #endif #include #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) #define __Pyx_truncl trunc #else #define __Pyx_truncl truncl #endif #define __PYX_MARK_ERR_POS(f_index, lineno) \ { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } #ifdef CYTHON_EXTERN_C #undef __PYX_EXTERN_C #define __PYX_EXTERN_C CYTHON_EXTERN_C #elif defined(__PYX_EXTERN_C) #ifdef _MSC_VER #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") #else #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. #endif #else #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #define __PYX_HAVE__aiohttp___websocket #define __PYX_HAVE_API__aiohttp___websocket /* Early includes */ #include #include #include "pythread.h" #include #ifdef _OPENMP #include #endif /* _OPENMP */ #if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) #define CYTHON_WITHOUT_ASSERTIONS #endif typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_uchar_cast(c) ((unsigned char)c) #define __Pyx_long_cast(x) ((long)x) #define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ (sizeof(type) < sizeof(Py_ssize_t)) ||\ (sizeof(type) > sizeof(Py_ssize_t) &&\ likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX) &&\ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ v == (type)PY_SSIZE_T_MIN))) ||\ (sizeof(type) == sizeof(Py_ssize_t) &&\ (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX))) ) static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { return (size_t) i < (size_t) limit; } #if defined (__cplusplus) && __cplusplus >= 201103L #include #define __Pyx_sst_abs(value) std::abs(value) #elif SIZEOF_INT >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) abs(value) #elif SIZEOF_LONG >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) labs(value) #elif defined (_MSC_VER) #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_sst_abs(value) llabs(value) #elif defined (__GNUC__) #define __Pyx_sst_abs(value) __builtin_llabs(value) #else #define __Pyx_sst_abs(value) ((value<0) ? -value : value) #endif static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) { const wchar_t *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #else static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { const Py_UNICODE *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #endif #define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) #define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); #if CYTHON_ASSUME_SAFE_MACROS #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) #else #define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) #endif #if CYTHON_USE_PYLONG_INTERNALS #if PY_VERSION_HEX >= 0x030C00A7 #ifndef _PyLong_SIGN_MASK #define _PyLong_SIGN_MASK 3 #endif #ifndef _PyLong_NON_SIZE_BITS #define _PyLong_NON_SIZE_BITS 3 #endif #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) #define __Pyx_PyLong_SignedDigitCount(x)\ ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) #else #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) #endif typedef Py_ssize_t __Pyx_compact_pylong; typedef size_t __Pyx_compact_upylong; #else // Py < 3.12 #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) #define __Pyx_PyLong_CompactValue(x)\ ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) typedef sdigit __Pyx_compact_pylong; typedef digit __Pyx_compact_upylong; #endif #if PY_VERSION_HEX >= 0x030C00A5 #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) #else #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) #endif #endif #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII #include static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = (char) c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #include static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } #if !CYTHON_USE_MODULE_STATE static PyObject *__pyx_m = NULL; #endif static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm = __FILE__; static const char *__pyx_filename; /* #### Code section: filename_table ### */ static const char *__pyx_f[] = { "aiohttp/_websocket.pyx", "contextvars.pxd", "type.pxd", "bool.pxd", "complex.pxd", }; /* #### Code section: utility_code_proto_before_types ### */ /* ForceInitThreads.proto */ #ifndef __PYX_FORCE_INIT_THREADS #define __PYX_FORCE_INIT_THREADS 0 #endif /* #### Code section: numeric_typedefs ### */ /* #### Code section: complex_type_declarations ### */ /* #### Code section: type_declarations ### */ /*--- Type declarations ---*/ struct __pyx_opt_args_7cpython_11contextvars_get_value; struct __pyx_opt_args_7cpython_11contextvars_get_value_no_default; /* "cpython/contextvars.pxd":112 * * * cdef inline object get_value(var, default_value=None): # <<<<<<<<<<<<<< * """Return a new reference to the value of the context variable, * or the default value of the context variable, */ struct __pyx_opt_args_7cpython_11contextvars_get_value { int __pyx_n; PyObject *default_value; }; /* "cpython/contextvars.pxd":129 * * * cdef inline object get_value_no_default(var, default_value=None): # <<<<<<<<<<<<<< * """Return a new reference to the value of the context variable, * or the provided default value if no such value was found. */ struct __pyx_opt_args_7cpython_11contextvars_get_value_no_default { int __pyx_n; PyObject *default_value; }; /* #### Code section: utility_code_proto ### */ /* --- Runtime support code (head) --- */ /* Refnanny.proto */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, Py_ssize_t); void (*DECREF)(void*, PyObject*, Py_ssize_t); void (*GOTREF)(void*, PyObject*, Py_ssize_t); void (*GIVEREF)(void*, PyObject*, Py_ssize_t); void* (*SetupContext)(const char*, Py_ssize_t, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil)\ if (acquire_gil) {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ PyGILState_Release(__pyx_gilstate_save);\ } else {\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ } #define __Pyx_RefNannyFinishContextNogil() {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __Pyx_RefNannyFinishContext();\ PyGILState_Release(__pyx_gilstate_save);\ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil)\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() #endif #define __Pyx_RefNannyFinishContextNogil() {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __Pyx_RefNannyFinishContext();\ PyGILState_Release(__pyx_gilstate_save);\ } #define __Pyx_RefNannyFinishContext()\ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContextNogil() #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_Py_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; Py_XDECREF(tmp);\ } while (0) #define __Pyx_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_XDECREF(tmp);\ } while (0) #define __Pyx_DECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_DECREF(tmp);\ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) /* PyErrExceptionMatches.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); #else #define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) #endif /* PyThreadStateGet.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; #define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; #if PY_VERSION_HEX >= 0x030C00A6 #define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) #define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) #else #define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) #define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) #endif #else #define __Pyx_PyThreadState_declare #define __Pyx_PyThreadState_assign #define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) #define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() #endif /* PyErrFetchRestore.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) #define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) #define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 #define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) #else #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #endif #else #define __Pyx_PyErr_Clear() PyErr_Clear() #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif /* PyObjectGetAttrStr.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif /* PyObjectGetAttrStrNoError.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); /* GetBuiltinName.proto */ static PyObject *__Pyx_GetBuiltinName(PyObject *name); /* TupleAndListFromArray.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); #endif /* IncludeStringH.proto */ #include /* BytesEquals.proto */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); /* UnicodeEquals.proto */ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); /* fastcall.proto */ #if CYTHON_AVOID_BORROWED_REFS #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) #elif CYTHON_ASSUME_SAFE_MACROS #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) #else #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) #endif #if CYTHON_AVOID_BORROWED_REFS #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) #else #define __Pyx_Arg_NewRef_VARARGS(arg) arg // no-op #define __Pyx_Arg_XDECREF_VARARGS(arg) // no-op - arg is borrowed #endif #define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) #define __Pyx_KwValues_VARARGS(args, nargs) NULL #define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) #define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) #if CYTHON_METH_FASTCALL #define __Pyx_Arg_FASTCALL(args, i) args[i] #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 static CYTHON_UNUSED PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); #else #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) #endif #define __Pyx_Arg_NewRef_FASTCALL(arg) arg // no-op, __Pyx_Arg_FASTCALL is direct and this needs #define __Pyx_Arg_XDECREF_FASTCALL(arg) // no-op - arg was returned from array #else #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) #endif #if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS #define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) #define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) #else #define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) #define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) #endif /* RaiseArgTupleInvalid.proto */ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /* RaiseDoubleKeywords.proto */ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /* ParseKeywords.proto */ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name); /* AssertionsEnabled.proto */ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) #define __Pyx_init_assertions_enabled() (0) #define __pyx_assertions_enabled() (1) #elif CYTHON_COMPILING_IN_LIMITED_API || (CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030C0000) static int __pyx_assertions_enabled_flag; #define __pyx_assertions_enabled() (__pyx_assertions_enabled_flag) static int __Pyx_init_assertions_enabled(void) { PyObject *builtins, *debug, *debug_str; int flag; builtins = PyEval_GetBuiltins(); if (!builtins) goto bad; debug_str = PyUnicode_FromStringAndSize("__debug__", 9); if (!debug_str) goto bad; debug = PyObject_GetItem(builtins, debug_str); Py_DECREF(debug_str); if (!debug) goto bad; flag = PyObject_IsTrue(debug); Py_DECREF(debug); if (flag == -1) goto bad; __pyx_assertions_enabled_flag = flag; return 0; bad: __pyx_assertions_enabled_flag = 1; return -1; } #else #define __Pyx_init_assertions_enabled() (0) #define __pyx_assertions_enabled() (!Py_OptimizeFlag) #endif /* RaiseException.proto */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /* PyFunctionFastCall.proto */ #if CYTHON_FAST_PYCALL #if !CYTHON_VECTORCALL #define __Pyx_PyFunction_FastCall(func, args, nargs)\ __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); #endif #define __Pyx_BUILD_ASSERT_EXPR(cond)\ (sizeof(char [1 - 2*!(cond)]) - 1) #ifndef Py_MEMBER_SIZE #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) #endif #if !CYTHON_VECTORCALL #if PY_VERSION_HEX >= 0x03080000 #include "frameobject.h" #if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API #ifndef Py_BUILD_CORE #define Py_BUILD_CORE 1 #endif #include "internal/pycore_frame.h" #endif #define __Pxy_PyFrame_Initialize_Offsets() #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) #else static size_t __pyx_pyframe_localsplus_offset = 0; #include "frameobject.h" #define __Pxy_PyFrame_Initialize_Offsets()\ ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) #define __Pyx_PyFrame_GetLocalsplus(frame)\ (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) #endif #endif #endif /* PyObjectCall.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif /* PyObjectCallMethO.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); #endif /* PyObjectFastCall.proto */ #define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); /* PyObjectCallOneArg.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); /* RaiseUnexpectedTypeError.proto */ static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj); /* TypeImport.proto */ #ifndef __PYX_HAVE_RT_ImportType_proto_3_0_5 #define __PYX_HAVE_RT_ImportType_proto_3_0_5 #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L #include #endif #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L #define __PYX_GET_STRUCT_ALIGNMENT_3_0_5(s) alignof(s) #else #define __PYX_GET_STRUCT_ALIGNMENT_3_0_5(s) sizeof(void*) #endif enum __Pyx_ImportType_CheckSize_3_0_5 { __Pyx_ImportType_CheckSize_Error_3_0_5 = 0, __Pyx_ImportType_CheckSize_Warn_3_0_5 = 1, __Pyx_ImportType_CheckSize_Ignore_3_0_5 = 2 }; static PyTypeObject *__Pyx_ImportType_3_0_5(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_5 check_size); #endif /* IncludeStructmemberH.proto */ #include /* FixUpExtensionType.proto */ #if CYTHON_USE_TYPE_SPECS static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); #endif /* FetchSharedCythonModule.proto */ static PyObject *__Pyx_FetchSharedCythonABIModule(void); /* FetchCommonType.proto */ #if !CYTHON_USE_TYPE_SPECS static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); #else static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); #endif /* PyMethodNew.proto */ #if CYTHON_COMPILING_IN_LIMITED_API static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; CYTHON_UNUSED_VAR(typ); if (!self) return __Pyx_NewRef(func); typesModule = PyImport_ImportModule("types"); if (!typesModule) return NULL; methodType = PyObject_GetAttrString(typesModule, "MethodType"); Py_DECREF(typesModule); if (!methodType) return NULL; result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); Py_DECREF(methodType); return result; } #elif PY_MAJOR_VERSION >= 3 static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { CYTHON_UNUSED_VAR(typ); if (!self) return __Pyx_NewRef(func); return PyMethod_New(func, self); } #else #define __Pyx_PyMethod_New PyMethod_New #endif /* PyVectorcallFastCallDict.proto */ #if CYTHON_METH_FASTCALL static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); #endif /* CythonFunctionShared.proto */ #define __Pyx_CyFunction_USED #define __Pyx_CYFUNCTION_STATICMETHOD 0x01 #define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 #define __Pyx_CYFUNCTION_CCLASS 0x04 #define __Pyx_CYFUNCTION_COROUTINE 0x08 #define __Pyx_CyFunction_GetClosure(f)\ (((__pyx_CyFunctionObject *) (f))->func_closure) #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_CyFunction_GetClassObj(f)\ (((__pyx_CyFunctionObject *) (f))->func_classobj) #else #define __Pyx_CyFunction_GetClassObj(f)\ ((PyObject*) ((PyCMethodObject *) (f))->mm_class) #endif #define __Pyx_CyFunction_SetClassObj(f, classobj)\ __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) #define __Pyx_CyFunction_Defaults(type, f)\ ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) #define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) typedef struct { #if CYTHON_COMPILING_IN_LIMITED_API PyObject_HEAD PyObject *func; #elif PY_VERSION_HEX < 0x030900B1 PyCFunctionObject func; #else PyCMethodObject func; #endif #if CYTHON_BACKPORT_VECTORCALL __pyx_vectorcallfunc func_vectorcall; #endif #if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API PyObject *func_weakreflist; #endif PyObject *func_dict; PyObject *func_name; PyObject *func_qualname; PyObject *func_doc; PyObject *func_globals; PyObject *func_code; PyObject *func_closure; #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API PyObject *func_classobj; #endif void *defaults; int defaults_pyobjects; size_t defaults_size; // used by FusedFunction for copying defaults int flags; PyObject *defaults_tuple; PyObject *defaults_kwdict; PyObject *(*defaults_getter)(PyObject *); PyObject *func_annotations; PyObject *func_is_coroutine; } __pyx_CyFunctionObject; #undef __Pyx_CyOrPyCFunction_Check #define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) #define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) #define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); #undef __Pyx_IsSameCFunction #define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject *globals, PyObject* code); static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, size_t size, int pyobjects); static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, PyObject *tuple); static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, PyObject *dict); static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, PyObject *dict); static int __pyx_CyFunction_init(PyObject *module); #if CYTHON_METH_FASTCALL static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); #if CYTHON_BACKPORT_VECTORCALL #define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) #else #define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) #endif #endif /* CythonFunction.proto */ static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject *globals, PyObject* code); /* PyDictVersioning.proto */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS #define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) #define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ (version_var) = __PYX_GET_DICT_VERSION(dict);\ (cache_var) = (value); #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ (VAR) = __pyx_dict_cached_value;\ } else {\ (VAR) = __pyx_dict_cached_value = (LOOKUP);\ __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ }\ } static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); #else #define __PYX_GET_DICT_VERSION(dict) (0) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); #endif /* CLineInTraceback.proto */ #ifdef CYTHON_CLINE_IN_TRACEBACK #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) #else static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); #endif /* CodeObjectCache.proto */ #if !CYTHON_COMPILING_IN_LIMITED_API typedef struct { PyCodeObject* code_object; int code_line; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); #endif /* AddTraceback.proto */ static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /* FormatTypeName.proto */ #if CYTHON_COMPILING_IN_LIMITED_API typedef PyObject *__Pyx_TypeName; #define __Pyx_FMT_TYPENAME "%U" static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); #define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) #else typedef const char *__Pyx_TypeName; #define __Pyx_FMT_TYPENAME "%.200s" #define __Pyx_PyType_GetName(tp) ((tp)->tp_name) #define __Pyx_DECREF_TypeName(obj) #endif /* GCCDiagnostics.proto */ #if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #define __Pyx_HAS_GCC_DIAGNOSTIC #endif /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* FastTypeChecks.proto */ #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) #define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); #else #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) #define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) #define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) #endif #define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) #define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) /* CheckBinaryVersion.proto */ static unsigned long __Pyx_get_runtime_version(void); static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); /* InitStrings.proto */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /* #### Code section: module_declarations ### */ static CYTHON_INLINE double __pyx_f_7cpython_7complex_7complex_4real_real(PyComplexObject *__pyx_v_self); /* proto*/ static CYTHON_INLINE double __pyx_f_7cpython_7complex_7complex_4imag_imag(PyComplexObject *__pyx_v_self); /* proto*/ /* Module declarations from "cpython.version" */ /* Module declarations from "__builtin__" */ /* Module declarations from "cpython.type" */ /* Module declarations from "libc.string" */ /* Module declarations from "libc.stdio" */ /* Module declarations from "cpython.object" */ /* Module declarations from "cpython.ref" */ /* Module declarations from "cpython.exc" */ /* Module declarations from "cpython.module" */ /* Module declarations from "cpython.mem" */ /* Module declarations from "cpython.tuple" */ /* Module declarations from "cpython.list" */ /* Module declarations from "cpython.sequence" */ /* Module declarations from "cpython.mapping" */ /* Module declarations from "cpython.iterator" */ /* Module declarations from "cpython.number" */ /* Module declarations from "cpython.int" */ /* Module declarations from "__builtin__" */ /* Module declarations from "cpython.bool" */ /* Module declarations from "cpython.long" */ /* Module declarations from "cpython.float" */ /* Module declarations from "__builtin__" */ /* Module declarations from "cpython.complex" */ /* Module declarations from "cpython.string" */ /* Module declarations from "cpython.unicode" */ /* Module declarations from "cpython.pyport" */ /* Module declarations from "cpython.dict" */ /* Module declarations from "cpython.instance" */ /* Module declarations from "cpython.function" */ /* Module declarations from "cpython.method" */ /* Module declarations from "cpython.weakref" */ /* Module declarations from "cpython.getargs" */ /* Module declarations from "cpython.pythread" */ /* Module declarations from "cpython.pystate" */ /* Module declarations from "cpython.cobject" */ /* Module declarations from "cpython.oldbuffer" */ /* Module declarations from "cpython.set" */ /* Module declarations from "cpython.buffer" */ /* Module declarations from "cpython.bytes" */ /* Module declarations from "cpython.pycapsule" */ /* Module declarations from "cpython.contextvars" */ /* Module declarations from "cpython" */ /* Module declarations from "libc.stdint" */ /* Module declarations from "aiohttp._websocket" */ /* #### Code section: typeinfo ### */ /* #### Code section: before_global_var ### */ #define __Pyx_MODULE_NAME "aiohttp._websocket" extern int __pyx_module_is_main_aiohttp___websocket; int __pyx_module_is_main_aiohttp___websocket = 0; /* Implementation of "aiohttp._websocket" */ /* #### Code section: global_var ### */ static PyObject *__pyx_builtin_AssertionError; static PyObject *__pyx_builtin_range; /* #### Code section: string_decls ### */ static const char __pyx_k_i[] = "i"; static const char __pyx_k__3[] = "?"; static const char __pyx_k_data[] = "data"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_mask[] = "mask"; static const char __pyx_k_name[] = "__name__"; static const char __pyx_k_test[] = "__test__"; static const char __pyx_k_range[] = "range"; static const char __pyx_k_in_buf[] = "in_buf"; static const char __pyx_k_data_len[] = "data_len"; static const char __pyx_k_mask_buf[] = "mask_buf"; static const char __pyx_k_uint32_msk[] = "uint32_msk"; static const char __pyx_k_uint64_msk[] = "uint64_msk"; static const char __pyx_k_is_coroutine[] = "_is_coroutine"; static const char __pyx_k_AssertionError[] = "AssertionError"; static const char __pyx_k_aiohttp__websocket[] = "aiohttp._websocket"; static const char __pyx_k_asyncio_coroutines[] = "asyncio.coroutines"; static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; static const char __pyx_k_websocket_mask_cython[] = "_websocket_mask_cython"; static const char __pyx_k_aiohttp__websocket_pyx[] = "aiohttp/_websocket.pyx"; /* #### Code section: decls ### */ static PyObject *__pyx_pf_7aiohttp_10_websocket__websocket_mask_cython(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_mask, PyObject *__pyx_v_data); /* proto */ /* #### Code section: late_includes ### */ /* #### Code section: module_state ### */ typedef struct { PyObject *__pyx_d; PyObject *__pyx_b; PyObject *__pyx_cython_runtime; PyObject *__pyx_empty_tuple; PyObject *__pyx_empty_bytes; PyObject *__pyx_empty_unicode; #ifdef __Pyx_CyFunction_USED PyTypeObject *__pyx_CyFunctionType; #endif #ifdef __Pyx_FusedFunction_USED PyTypeObject *__pyx_FusedFunctionType; #endif #ifdef __Pyx_Generator_USED PyTypeObject *__pyx_GeneratorType; #endif #ifdef __Pyx_IterableCoroutine_USED PyTypeObject *__pyx_IterableCoroutineType; #endif #ifdef __Pyx_Coroutine_USED PyTypeObject *__pyx_CoroutineAwaitType; #endif #ifdef __Pyx_Coroutine_USED PyTypeObject *__pyx_CoroutineType; #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif PyTypeObject *__pyx_ptype_7cpython_4type_type; #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif PyTypeObject *__pyx_ptype_7cpython_4bool_bool; #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif PyTypeObject *__pyx_ptype_7cpython_7complex_complex; #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif PyObject *__pyx_n_s_AssertionError; PyObject *__pyx_n_s__3; PyObject *__pyx_n_s_aiohttp__websocket; PyObject *__pyx_kp_s_aiohttp__websocket_pyx; PyObject *__pyx_n_s_asyncio_coroutines; PyObject *__pyx_n_s_cline_in_traceback; PyObject *__pyx_n_s_data; PyObject *__pyx_n_s_data_len; PyObject *__pyx_n_s_i; PyObject *__pyx_n_s_in_buf; PyObject *__pyx_n_s_is_coroutine; PyObject *__pyx_n_s_main; PyObject *__pyx_n_s_mask; PyObject *__pyx_n_s_mask_buf; PyObject *__pyx_n_s_name; PyObject *__pyx_n_s_range; PyObject *__pyx_n_s_test; PyObject *__pyx_n_s_uint32_msk; PyObject *__pyx_n_s_uint64_msk; PyObject *__pyx_n_s_websocket_mask_cython; PyObject *__pyx_tuple_; PyObject *__pyx_codeobj__2; } __pyx_mstate; #if CYTHON_USE_MODULE_STATE #ifdef __cplusplus namespace { extern struct PyModuleDef __pyx_moduledef; } /* anonymous namespace */ #else static struct PyModuleDef __pyx_moduledef; #endif #define __pyx_mstate(o) ((__pyx_mstate *)__Pyx_PyModule_GetState(o)) #define __pyx_mstate_global (__pyx_mstate(PyState_FindModule(&__pyx_moduledef))) #define __pyx_m (PyState_FindModule(&__pyx_moduledef)) #else static __pyx_mstate __pyx_mstate_global_static = #ifdef __cplusplus {}; #else {0}; #endif static __pyx_mstate *__pyx_mstate_global = &__pyx_mstate_global_static; #endif /* #### Code section: module_state_clear ### */ #if CYTHON_USE_MODULE_STATE static int __pyx_m_clear(PyObject *m) { __pyx_mstate *clear_module_state = __pyx_mstate(m); if (!clear_module_state) return 0; Py_CLEAR(clear_module_state->__pyx_d); Py_CLEAR(clear_module_state->__pyx_b); Py_CLEAR(clear_module_state->__pyx_cython_runtime); Py_CLEAR(clear_module_state->__pyx_empty_tuple); Py_CLEAR(clear_module_state->__pyx_empty_bytes); Py_CLEAR(clear_module_state->__pyx_empty_unicode); #ifdef __Pyx_CyFunction_USED Py_CLEAR(clear_module_state->__pyx_CyFunctionType); #endif #ifdef __Pyx_FusedFunction_USED Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); #endif Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4type_type); Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4bool_bool); Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_7complex_complex); Py_CLEAR(clear_module_state->__pyx_n_s_AssertionError); Py_CLEAR(clear_module_state->__pyx_n_s__3); Py_CLEAR(clear_module_state->__pyx_n_s_aiohttp__websocket); Py_CLEAR(clear_module_state->__pyx_kp_s_aiohttp__websocket_pyx); Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); Py_CLEAR(clear_module_state->__pyx_n_s_data); Py_CLEAR(clear_module_state->__pyx_n_s_data_len); Py_CLEAR(clear_module_state->__pyx_n_s_i); Py_CLEAR(clear_module_state->__pyx_n_s_in_buf); Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); Py_CLEAR(clear_module_state->__pyx_n_s_main); Py_CLEAR(clear_module_state->__pyx_n_s_mask); Py_CLEAR(clear_module_state->__pyx_n_s_mask_buf); Py_CLEAR(clear_module_state->__pyx_n_s_name); Py_CLEAR(clear_module_state->__pyx_n_s_range); Py_CLEAR(clear_module_state->__pyx_n_s_test); Py_CLEAR(clear_module_state->__pyx_n_s_uint32_msk); Py_CLEAR(clear_module_state->__pyx_n_s_uint64_msk); Py_CLEAR(clear_module_state->__pyx_n_s_websocket_mask_cython); Py_CLEAR(clear_module_state->__pyx_tuple_); Py_CLEAR(clear_module_state->__pyx_codeobj__2); return 0; } #endif /* #### Code section: module_state_traverse ### */ #if CYTHON_USE_MODULE_STATE static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { __pyx_mstate *traverse_module_state = __pyx_mstate(m); if (!traverse_module_state) return 0; Py_VISIT(traverse_module_state->__pyx_d); Py_VISIT(traverse_module_state->__pyx_b); Py_VISIT(traverse_module_state->__pyx_cython_runtime); Py_VISIT(traverse_module_state->__pyx_empty_tuple); Py_VISIT(traverse_module_state->__pyx_empty_bytes); Py_VISIT(traverse_module_state->__pyx_empty_unicode); #ifdef __Pyx_CyFunction_USED Py_VISIT(traverse_module_state->__pyx_CyFunctionType); #endif #ifdef __Pyx_FusedFunction_USED Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); #endif Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4type_type); Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4bool_bool); Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_7complex_complex); Py_VISIT(traverse_module_state->__pyx_n_s_AssertionError); Py_VISIT(traverse_module_state->__pyx_n_s__3); Py_VISIT(traverse_module_state->__pyx_n_s_aiohttp__websocket); Py_VISIT(traverse_module_state->__pyx_kp_s_aiohttp__websocket_pyx); Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); Py_VISIT(traverse_module_state->__pyx_n_s_data); Py_VISIT(traverse_module_state->__pyx_n_s_data_len); Py_VISIT(traverse_module_state->__pyx_n_s_i); Py_VISIT(traverse_module_state->__pyx_n_s_in_buf); Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); Py_VISIT(traverse_module_state->__pyx_n_s_main); Py_VISIT(traverse_module_state->__pyx_n_s_mask); Py_VISIT(traverse_module_state->__pyx_n_s_mask_buf); Py_VISIT(traverse_module_state->__pyx_n_s_name); Py_VISIT(traverse_module_state->__pyx_n_s_range); Py_VISIT(traverse_module_state->__pyx_n_s_test); Py_VISIT(traverse_module_state->__pyx_n_s_uint32_msk); Py_VISIT(traverse_module_state->__pyx_n_s_uint64_msk); Py_VISIT(traverse_module_state->__pyx_n_s_websocket_mask_cython); Py_VISIT(traverse_module_state->__pyx_tuple_); Py_VISIT(traverse_module_state->__pyx_codeobj__2); return 0; } #endif /* #### Code section: module_state_defines ### */ #define __pyx_d __pyx_mstate_global->__pyx_d #define __pyx_b __pyx_mstate_global->__pyx_b #define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime #define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple #define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes #define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode #ifdef __Pyx_CyFunction_USED #define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType #endif #ifdef __Pyx_FusedFunction_USED #define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType #endif #ifdef __Pyx_Generator_USED #define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType #endif #ifdef __Pyx_IterableCoroutine_USED #define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType #endif #ifdef __Pyx_Coroutine_USED #define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType #endif #ifdef __Pyx_Coroutine_USED #define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #define __pyx_ptype_7cpython_4type_type __pyx_mstate_global->__pyx_ptype_7cpython_4type_type #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #define __pyx_ptype_7cpython_4bool_bool __pyx_mstate_global->__pyx_ptype_7cpython_4bool_bool #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #define __pyx_ptype_7cpython_7complex_complex __pyx_mstate_global->__pyx_ptype_7cpython_7complex_complex #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #endif #define __pyx_n_s_AssertionError __pyx_mstate_global->__pyx_n_s_AssertionError #define __pyx_n_s__3 __pyx_mstate_global->__pyx_n_s__3 #define __pyx_n_s_aiohttp__websocket __pyx_mstate_global->__pyx_n_s_aiohttp__websocket #define __pyx_kp_s_aiohttp__websocket_pyx __pyx_mstate_global->__pyx_kp_s_aiohttp__websocket_pyx #define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines #define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback #define __pyx_n_s_data __pyx_mstate_global->__pyx_n_s_data #define __pyx_n_s_data_len __pyx_mstate_global->__pyx_n_s_data_len #define __pyx_n_s_i __pyx_mstate_global->__pyx_n_s_i #define __pyx_n_s_in_buf __pyx_mstate_global->__pyx_n_s_in_buf #define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine #define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main #define __pyx_n_s_mask __pyx_mstate_global->__pyx_n_s_mask #define __pyx_n_s_mask_buf __pyx_mstate_global->__pyx_n_s_mask_buf #define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name #define __pyx_n_s_range __pyx_mstate_global->__pyx_n_s_range #define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test #define __pyx_n_s_uint32_msk __pyx_mstate_global->__pyx_n_s_uint32_msk #define __pyx_n_s_uint64_msk __pyx_mstate_global->__pyx_n_s_uint64_msk #define __pyx_n_s_websocket_mask_cython __pyx_mstate_global->__pyx_n_s_websocket_mask_cython #define __pyx_tuple_ __pyx_mstate_global->__pyx_tuple_ #define __pyx_codeobj__2 __pyx_mstate_global->__pyx_codeobj__2 /* #### Code section: module_code ### */ /* "cpython/complex.pxd":19 * * @property * cdef inline double real(self): # <<<<<<<<<<<<<< * return self.cval.real * */ static CYTHON_INLINE double __pyx_f_7cpython_7complex_7complex_4real_real(PyComplexObject *__pyx_v_self) { double __pyx_r; /* "cpython/complex.pxd":20 * @property * cdef inline double real(self): * return self.cval.real # <<<<<<<<<<<<<< * * @property */ __pyx_r = __pyx_v_self->cval.real; goto __pyx_L0; /* "cpython/complex.pxd":19 * * @property * cdef inline double real(self): # <<<<<<<<<<<<<< * return self.cval.real * */ /* function exit code */ __pyx_L0:; return __pyx_r; } /* "cpython/complex.pxd":23 * * @property * cdef inline double imag(self): # <<<<<<<<<<<<<< * return self.cval.imag * */ static CYTHON_INLINE double __pyx_f_7cpython_7complex_7complex_4imag_imag(PyComplexObject *__pyx_v_self) { double __pyx_r; /* "cpython/complex.pxd":24 * @property * cdef inline double imag(self): * return self.cval.imag # <<<<<<<<<<<<<< * * # PyTypeObject PyComplex_Type */ __pyx_r = __pyx_v_self->cval.imag; goto __pyx_L0; /* "cpython/complex.pxd":23 * * @property * cdef inline double imag(self): # <<<<<<<<<<<<<< * return self.cval.imag * */ /* function exit code */ __pyx_L0:; return __pyx_r; } /* "cpython/contextvars.pxd":112 * * * cdef inline object get_value(var, default_value=None): # <<<<<<<<<<<<<< * """Return a new reference to the value of the context variable, * or the default value of the context variable, */ static CYTHON_INLINE PyObject *__pyx_f_7cpython_11contextvars_get_value(PyObject *__pyx_v_var, struct __pyx_opt_args_7cpython_11contextvars_get_value *__pyx_optional_args) { PyObject *__pyx_v_default_value = ((PyObject *)Py_None); PyObject *__pyx_v_value; PyObject *__pyx_v_pyvalue = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("get_value", 1); if (__pyx_optional_args) { if (__pyx_optional_args->__pyx_n > 0) { __pyx_v_default_value = __pyx_optional_args->default_value; } } /* "cpython/contextvars.pxd":117 * or None if no such value or default was found. * """ * cdef PyObject *value = NULL # <<<<<<<<<<<<<< * PyContextVar_Get(var, NULL, &value) * if value is NULL: */ __pyx_v_value = NULL; /* "cpython/contextvars.pxd":118 * """ * cdef PyObject *value = NULL * PyContextVar_Get(var, NULL, &value) # <<<<<<<<<<<<<< * if value is NULL: * # context variable does not have a default */ __pyx_t_1 = PyContextVar_Get(__pyx_v_var, NULL, (&__pyx_v_value)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(1, 118, __pyx_L1_error) /* "cpython/contextvars.pxd":119 * cdef PyObject *value = NULL * PyContextVar_Get(var, NULL, &value) * if value is NULL: # <<<<<<<<<<<<<< * # context variable does not have a default * pyvalue = default_value */ __pyx_t_2 = (__pyx_v_value == NULL); if (__pyx_t_2) { /* "cpython/contextvars.pxd":121 * if value is NULL: * # context variable does not have a default * pyvalue = default_value # <<<<<<<<<<<<<< * else: * # value or default value of context variable */ __Pyx_INCREF(__pyx_v_default_value); __pyx_v_pyvalue = __pyx_v_default_value; /* "cpython/contextvars.pxd":119 * cdef PyObject *value = NULL * PyContextVar_Get(var, NULL, &value) * if value is NULL: # <<<<<<<<<<<<<< * # context variable does not have a default * pyvalue = default_value */ goto __pyx_L3; } /* "cpython/contextvars.pxd":124 * else: * # value or default value of context variable * pyvalue = value # <<<<<<<<<<<<<< * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' * return pyvalue */ /*else*/ { __pyx_t_3 = ((PyObject *)__pyx_v_value); __Pyx_INCREF(__pyx_t_3); __pyx_v_pyvalue = __pyx_t_3; __pyx_t_3 = 0; /* "cpython/contextvars.pxd":125 * # value or default value of context variable * pyvalue = value * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' # <<<<<<<<<<<<<< * return pyvalue * */ Py_XDECREF(__pyx_v_value); } __pyx_L3:; /* "cpython/contextvars.pxd":126 * pyvalue = value * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' * return pyvalue # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_pyvalue); __pyx_r = __pyx_v_pyvalue; goto __pyx_L0; /* "cpython/contextvars.pxd":112 * * * cdef inline object get_value(var, default_value=None): # <<<<<<<<<<<<<< * """Return a new reference to the value of the context variable, * or the default value of the context variable, */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("cpython.contextvars.get_value", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_pyvalue); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "cpython/contextvars.pxd":129 * * * cdef inline object get_value_no_default(var, default_value=None): # <<<<<<<<<<<<<< * """Return a new reference to the value of the context variable, * or the provided default value if no such value was found. */ static CYTHON_INLINE PyObject *__pyx_f_7cpython_11contextvars_get_value_no_default(PyObject *__pyx_v_var, struct __pyx_opt_args_7cpython_11contextvars_get_value_no_default *__pyx_optional_args) { PyObject *__pyx_v_default_value = ((PyObject *)Py_None); PyObject *__pyx_v_value; PyObject *__pyx_v_pyvalue = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("get_value_no_default", 1); if (__pyx_optional_args) { if (__pyx_optional_args->__pyx_n > 0) { __pyx_v_default_value = __pyx_optional_args->default_value; } } /* "cpython/contextvars.pxd":135 * Ignores the default value of the context variable, if any. * """ * cdef PyObject *value = NULL # <<<<<<<<<<<<<< * PyContextVar_Get(var, default_value, &value) * # value of context variable or 'default_value' */ __pyx_v_value = NULL; /* "cpython/contextvars.pxd":136 * """ * cdef PyObject *value = NULL * PyContextVar_Get(var, default_value, &value) # <<<<<<<<<<<<<< * # value of context variable or 'default_value' * pyvalue = value */ __pyx_t_1 = PyContextVar_Get(__pyx_v_var, ((PyObject *)__pyx_v_default_value), (&__pyx_v_value)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(1, 136, __pyx_L1_error) /* "cpython/contextvars.pxd":138 * PyContextVar_Get(var, default_value, &value) * # value of context variable or 'default_value' * pyvalue = value # <<<<<<<<<<<<<< * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' * return pyvalue */ __pyx_t_2 = ((PyObject *)__pyx_v_value); __Pyx_INCREF(__pyx_t_2); __pyx_v_pyvalue = __pyx_t_2; __pyx_t_2 = 0; /* "cpython/contextvars.pxd":139 * # value of context variable or 'default_value' * pyvalue = value * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' # <<<<<<<<<<<<<< * return pyvalue */ Py_XDECREF(__pyx_v_value); /* "cpython/contextvars.pxd":140 * pyvalue = value * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' * return pyvalue # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_pyvalue); __pyx_r = __pyx_v_pyvalue; goto __pyx_L0; /* "cpython/contextvars.pxd":129 * * * cdef inline object get_value_no_default(var, default_value=None): # <<<<<<<<<<<<<< * """Return a new reference to the value of the context variable, * or the provided default value if no such value was found. */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("cpython.contextvars.get_value_no_default", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_pyvalue); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_websocket.pyx":11 * * * def _websocket_mask_cython(object mask, object data): # <<<<<<<<<<<<<< * """Note, this function mutates its `data` argument * """ */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_10_websocket_1_websocket_mask_cython(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ PyDoc_STRVAR(__pyx_doc_7aiohttp_10_websocket__websocket_mask_cython, "Note, this function mutates its `data` argument\n "); static PyMethodDef __pyx_mdef_7aiohttp_10_websocket_1_websocket_mask_cython = {"_websocket_mask_cython", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7aiohttp_10_websocket_1_websocket_mask_cython, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7aiohttp_10_websocket__websocket_mask_cython}; static PyObject *__pyx_pw_7aiohttp_10_websocket_1_websocket_mask_cython(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { PyObject *__pyx_v_mask = 0; PyObject *__pyx_v_data = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[2] = {0,0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_websocket_mask_cython (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_mask,&__pyx_n_s_data,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_mask)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 11, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_data)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 11, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("_websocket_mask_cython", 1, 2, 2, 1); __PYX_ERR(0, 11, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_websocket_mask_cython") < 0)) __PYX_ERR(0, 11, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 2)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); } __pyx_v_mask = values[0]; __pyx_v_data = values[1]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("_websocket_mask_cython", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 11, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("aiohttp._websocket._websocket_mask_cython", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_10_websocket__websocket_mask_cython(__pyx_self, __pyx_v_mask, __pyx_v_data); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_10_websocket__websocket_mask_cython(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_mask, PyObject *__pyx_v_data) { Py_ssize_t __pyx_v_data_len; Py_ssize_t __pyx_v_i; unsigned char *__pyx_v_in_buf; unsigned char const *__pyx_v_mask_buf; uint32_t __pyx_v_uint32_msk; uint64_t __pyx_v_uint64_msk; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations Py_ssize_t __pyx_t_1; int __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; char *__pyx_t_5; uint64_t *__pyx_t_6; long __pyx_t_7; uint32_t *__pyx_t_8; Py_ssize_t __pyx_t_9; Py_ssize_t __pyx_t_10; Py_ssize_t __pyx_t_11; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_websocket_mask_cython", 0); __Pyx_INCREF(__pyx_v_mask); __Pyx_INCREF(__pyx_v_data); /* "aiohttp/_websocket.pyx":22 * uint64_t uint64_msk * * assert len(mask) == 4 # <<<<<<<<<<<<<< * * if not isinstance(mask, bytes): */ #ifndef CYTHON_WITHOUT_ASSERTIONS if (unlikely(__pyx_assertions_enabled())) { __pyx_t_1 = PyObject_Length(__pyx_v_mask); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 22, __pyx_L1_error) __pyx_t_2 = (__pyx_t_1 == 4); if (unlikely(!__pyx_t_2)) { __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0); __PYX_ERR(0, 22, __pyx_L1_error) } } #else if ((1)); else __PYX_ERR(0, 22, __pyx_L1_error) #endif /* "aiohttp/_websocket.pyx":24 * assert len(mask) == 4 * * if not isinstance(mask, bytes): # <<<<<<<<<<<<<< * mask = bytes(mask) * */ __pyx_t_2 = PyBytes_Check(__pyx_v_mask); __pyx_t_3 = (!__pyx_t_2); if (__pyx_t_3) { /* "aiohttp/_websocket.pyx":25 * * if not isinstance(mask, bytes): * mask = bytes(mask) # <<<<<<<<<<<<<< * * if isinstance(data, bytearray): */ __pyx_t_4 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyBytes_Type)), __pyx_v_mask); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 25, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF_SET(__pyx_v_mask, __pyx_t_4); __pyx_t_4 = 0; /* "aiohttp/_websocket.pyx":24 * assert len(mask) == 4 * * if not isinstance(mask, bytes): # <<<<<<<<<<<<<< * mask = bytes(mask) * */ } /* "aiohttp/_websocket.pyx":27 * mask = bytes(mask) * * if isinstance(data, bytearray): # <<<<<<<<<<<<<< * data = data * else: */ __pyx_t_3 = PyByteArray_Check(__pyx_v_data); if (__pyx_t_3) { /* "aiohttp/_websocket.pyx":28 * * if isinstance(data, bytearray): * data = data # <<<<<<<<<<<<<< * else: * data = bytearray(data) */ __pyx_t_4 = __pyx_v_data; __Pyx_INCREF(__pyx_t_4); __Pyx_DECREF_SET(__pyx_v_data, __pyx_t_4); __pyx_t_4 = 0; /* "aiohttp/_websocket.pyx":27 * mask = bytes(mask) * * if isinstance(data, bytearray): # <<<<<<<<<<<<<< * data = data * else: */ goto __pyx_L4; } /* "aiohttp/_websocket.pyx":30 * data = data * else: * data = bytearray(data) # <<<<<<<<<<<<<< * * data_len = len(data) */ /*else*/ { __pyx_t_4 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyByteArray_Type)), __pyx_v_data); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF_SET(__pyx_v_data, __pyx_t_4); __pyx_t_4 = 0; } __pyx_L4:; /* "aiohttp/_websocket.pyx":32 * data = bytearray(data) * * data_len = len(data) # <<<<<<<<<<<<<< * in_buf = PyByteArray_AsString(data) * mask_buf = PyBytes_AsString(mask) */ __pyx_t_1 = PyObject_Length(__pyx_v_data); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 32, __pyx_L1_error) __pyx_v_data_len = __pyx_t_1; /* "aiohttp/_websocket.pyx":33 * * data_len = len(data) * in_buf = PyByteArray_AsString(data) # <<<<<<<<<<<<<< * mask_buf = PyBytes_AsString(mask) * uint32_msk = (mask_buf)[0] */ if (!(likely(PyByteArray_CheckExact(__pyx_v_data))||((__pyx_v_data) == Py_None) || __Pyx_RaiseUnexpectedTypeError("bytearray", __pyx_v_data))) __PYX_ERR(0, 33, __pyx_L1_error) __pyx_t_5 = PyByteArray_AsString(((PyObject*)__pyx_v_data)); if (unlikely(__pyx_t_5 == ((char *)NULL))) __PYX_ERR(0, 33, __pyx_L1_error) __pyx_v_in_buf = ((unsigned char *)__pyx_t_5); /* "aiohttp/_websocket.pyx":34 * data_len = len(data) * in_buf = PyByteArray_AsString(data) * mask_buf = PyBytes_AsString(mask) # <<<<<<<<<<<<<< * uint32_msk = (mask_buf)[0] * */ __pyx_t_5 = PyBytes_AsString(__pyx_v_mask); if (unlikely(__pyx_t_5 == ((char *)NULL))) __PYX_ERR(0, 34, __pyx_L1_error) __pyx_v_mask_buf = ((unsigned char const *)__pyx_t_5); /* "aiohttp/_websocket.pyx":35 * in_buf = PyByteArray_AsString(data) * mask_buf = PyBytes_AsString(mask) * uint32_msk = (mask_buf)[0] # <<<<<<<<<<<<<< * * # TODO: align in_data ptr to achieve even faster speeds */ __pyx_v_uint32_msk = (((uint32_t *)__pyx_v_mask_buf)[0]); /* "aiohttp/_websocket.pyx":40 * # does it need in python ?! malloc() always aligns to sizeof(long) bytes * * if sizeof(size_t) >= 8: # <<<<<<<<<<<<<< * uint64_msk = uint32_msk * uint64_msk = (uint64_msk << 32) | uint32_msk */ __pyx_t_3 = ((sizeof(size_t)) >= 8); if (__pyx_t_3) { /* "aiohttp/_websocket.pyx":41 * * if sizeof(size_t) >= 8: * uint64_msk = uint32_msk # <<<<<<<<<<<<<< * uint64_msk = (uint64_msk << 32) | uint32_msk * */ __pyx_v_uint64_msk = __pyx_v_uint32_msk; /* "aiohttp/_websocket.pyx":42 * if sizeof(size_t) >= 8: * uint64_msk = uint32_msk * uint64_msk = (uint64_msk << 32) | uint32_msk # <<<<<<<<<<<<<< * * while data_len >= 8: */ __pyx_v_uint64_msk = ((__pyx_v_uint64_msk << 32) | __pyx_v_uint32_msk); /* "aiohttp/_websocket.pyx":44 * uint64_msk = (uint64_msk << 32) | uint32_msk * * while data_len >= 8: # <<<<<<<<<<<<<< * (in_buf)[0] ^= uint64_msk * in_buf += 8 */ while (1) { __pyx_t_3 = (__pyx_v_data_len >= 8); if (!__pyx_t_3) break; /* "aiohttp/_websocket.pyx":45 * * while data_len >= 8: * (in_buf)[0] ^= uint64_msk # <<<<<<<<<<<<<< * in_buf += 8 * data_len -= 8 */ __pyx_t_6 = ((uint64_t *)__pyx_v_in_buf); __pyx_t_7 = 0; (__pyx_t_6[__pyx_t_7]) = ((__pyx_t_6[__pyx_t_7]) ^ __pyx_v_uint64_msk); /* "aiohttp/_websocket.pyx":46 * while data_len >= 8: * (in_buf)[0] ^= uint64_msk * in_buf += 8 # <<<<<<<<<<<<<< * data_len -= 8 * */ __pyx_v_in_buf = (__pyx_v_in_buf + 8); /* "aiohttp/_websocket.pyx":47 * (in_buf)[0] ^= uint64_msk * in_buf += 8 * data_len -= 8 # <<<<<<<<<<<<<< * * */ __pyx_v_data_len = (__pyx_v_data_len - 8); } /* "aiohttp/_websocket.pyx":40 * # does it need in python ?! malloc() always aligns to sizeof(long) bytes * * if sizeof(size_t) >= 8: # <<<<<<<<<<<<<< * uint64_msk = uint32_msk * uint64_msk = (uint64_msk << 32) | uint32_msk */ } /* "aiohttp/_websocket.pyx":50 * * * while data_len >= 4: # <<<<<<<<<<<<<< * (in_buf)[0] ^= uint32_msk * in_buf += 4 */ while (1) { __pyx_t_3 = (__pyx_v_data_len >= 4); if (!__pyx_t_3) break; /* "aiohttp/_websocket.pyx":51 * * while data_len >= 4: * (in_buf)[0] ^= uint32_msk # <<<<<<<<<<<<<< * in_buf += 4 * data_len -= 4 */ __pyx_t_8 = ((uint32_t *)__pyx_v_in_buf); __pyx_t_7 = 0; (__pyx_t_8[__pyx_t_7]) = ((__pyx_t_8[__pyx_t_7]) ^ __pyx_v_uint32_msk); /* "aiohttp/_websocket.pyx":52 * while data_len >= 4: * (in_buf)[0] ^= uint32_msk * in_buf += 4 # <<<<<<<<<<<<<< * data_len -= 4 * */ __pyx_v_in_buf = (__pyx_v_in_buf + 4); /* "aiohttp/_websocket.pyx":53 * (in_buf)[0] ^= uint32_msk * in_buf += 4 * data_len -= 4 # <<<<<<<<<<<<<< * * for i in range(0, data_len): */ __pyx_v_data_len = (__pyx_v_data_len - 4); } /* "aiohttp/_websocket.pyx":55 * data_len -= 4 * * for i in range(0, data_len): # <<<<<<<<<<<<<< * in_buf[i] ^= mask_buf[i] */ __pyx_t_1 = __pyx_v_data_len; __pyx_t_9 = __pyx_t_1; for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { __pyx_v_i = __pyx_t_10; /* "aiohttp/_websocket.pyx":56 * * for i in range(0, data_len): * in_buf[i] ^= mask_buf[i] # <<<<<<<<<<<<<< */ __pyx_t_11 = __pyx_v_i; (__pyx_v_in_buf[__pyx_t_11]) = ((__pyx_v_in_buf[__pyx_t_11]) ^ (__pyx_v_mask_buf[__pyx_v_i])); } /* "aiohttp/_websocket.pyx":11 * * * def _websocket_mask_cython(object mask, object data): # <<<<<<<<<<<<<< * """Note, this function mutates its `data` argument * """ */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("aiohttp._websocket._websocket_mask_cython", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_mask); __Pyx_XDECREF(__pyx_v_data); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif #endif /* #### Code section: pystring_table ### */ static int __Pyx_CreateStringTabAndInitStrings(void) { __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_AssertionError, __pyx_k_AssertionError, sizeof(__pyx_k_AssertionError), 0, 0, 1, 1}, {&__pyx_n_s__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 0, 1, 1}, {&__pyx_n_s_aiohttp__websocket, __pyx_k_aiohttp__websocket, sizeof(__pyx_k_aiohttp__websocket), 0, 0, 1, 1}, {&__pyx_kp_s_aiohttp__websocket_pyx, __pyx_k_aiohttp__websocket_pyx, sizeof(__pyx_k_aiohttp__websocket_pyx), 0, 0, 1, 0}, {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, {&__pyx_n_s_data, __pyx_k_data, sizeof(__pyx_k_data), 0, 0, 1, 1}, {&__pyx_n_s_data_len, __pyx_k_data_len, sizeof(__pyx_k_data_len), 0, 0, 1, 1}, {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, {&__pyx_n_s_in_buf, __pyx_k_in_buf, sizeof(__pyx_k_in_buf), 0, 0, 1, 1}, {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_mask, __pyx_k_mask, sizeof(__pyx_k_mask), 0, 0, 1, 1}, {&__pyx_n_s_mask_buf, __pyx_k_mask_buf, sizeof(__pyx_k_mask_buf), 0, 0, 1, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_n_s_uint32_msk, __pyx_k_uint32_msk, sizeof(__pyx_k_uint32_msk), 0, 0, 1, 1}, {&__pyx_n_s_uint64_msk, __pyx_k_uint64_msk, sizeof(__pyx_k_uint64_msk), 0, 0, 1, 1}, {&__pyx_n_s_websocket_mask_cython, __pyx_k_websocket_mask_cython, sizeof(__pyx_k_websocket_mask_cython), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; return __Pyx_InitStrings(__pyx_string_tab); } /* #### Code section: cached_builtins ### */ static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_AssertionError = __Pyx_GetBuiltinName(__pyx_n_s_AssertionError); if (!__pyx_builtin_AssertionError) __PYX_ERR(0, 22, __pyx_L1_error) __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 55, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } /* #### Code section: cached_constants ### */ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "aiohttp/_websocket.pyx":11 * * * def _websocket_mask_cython(object mask, object data): # <<<<<<<<<<<<<< * """Note, this function mutates its `data` argument * """ */ __pyx_tuple_ = PyTuple_Pack(8, __pyx_n_s_mask, __pyx_n_s_data, __pyx_n_s_data_len, __pyx_n_s_i, __pyx_n_s_in_buf, __pyx_n_s_mask_buf, __pyx_n_s_uint32_msk, __pyx_n_s_uint64_msk); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 11, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); __pyx_codeobj__2 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 8, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple_, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_aiohttp__websocket_pyx, __pyx_n_s_websocket_mask_cython, 11, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__2)) __PYX_ERR(0, 11, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } /* #### Code section: init_constants ### */ static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 1, __pyx_L1_error); return 0; __pyx_L1_error:; return -1; } /* #### Code section: init_globals ### */ static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { /* AssertionsEnabled.init */ if (likely(__Pyx_init_assertions_enabled() == 0)); else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } /* #### Code section: init_module ### */ static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ static int __Pyx_modinit_global_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); /*--- Global init code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); /*--- Variable export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); /*--- Function export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_import_code(void) { __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); /*--- Type import code ---*/ __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_5(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_5(PyTypeObject), #elif CYTHON_COMPILING_IN_LIMITED_API sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_5(PyTypeObject), #else sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_5(PyHeapTypeObject), #endif __Pyx_ImportType_CheckSize_Warn_3_0_5); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType_3_0_5(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_5(PyBoolObject),__Pyx_ImportType_CheckSize_Warn_3_0_5); if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(3, 8, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType_3_0_5(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_5(PyComplexObject),__Pyx_ImportType_CheckSize_Warn_3_0_5); if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(4, 15, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_modinit_variable_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); /*--- Variable import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); /*--- Function import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } #if PY_MAJOR_VERSION >= 3 #if CYTHON_PEP489_MULTI_PHASE_INIT static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ static int __pyx_pymod_exec__websocket(PyObject* module); /*proto*/ static PyModuleDef_Slot __pyx_moduledef_slots[] = { {Py_mod_create, (void*)__pyx_pymod_create}, {Py_mod_exec, (void*)__pyx_pymod_exec__websocket}, {0, NULL} }; #endif #ifdef __cplusplus namespace { struct PyModuleDef __pyx_moduledef = #else static struct PyModuleDef __pyx_moduledef = #endif { PyModuleDef_HEAD_INIT, "_websocket", 0, /* m_doc */ #if CYTHON_PEP489_MULTI_PHASE_INIT 0, /* m_size */ #elif CYTHON_USE_MODULE_STATE sizeof(__pyx_mstate), /* m_size */ #else -1, /* m_size */ #endif __pyx_methods /* m_methods */, #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_moduledef_slots, /* m_slots */ #else NULL, /* m_reload */ #endif #if CYTHON_USE_MODULE_STATE __pyx_m_traverse, /* m_traverse */ __pyx_m_clear, /* m_clear */ NULL /* m_free */ #else NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ #endif }; #ifdef __cplusplus } /* anonymous namespace */ #endif #endif #ifndef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC #elif PY_MAJOR_VERSION < 3 #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" void #else #define __Pyx_PyMODINIT_FUNC void #endif #else #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" PyObject * #else #define __Pyx_PyMODINIT_FUNC PyObject * #endif #endif #if PY_MAJOR_VERSION < 3 __Pyx_PyMODINIT_FUNC init_websocket(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC init_websocket(void) #else __Pyx_PyMODINIT_FUNC PyInit__websocket(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC PyInit__websocket(void) #if CYTHON_PEP489_MULTI_PHASE_INIT { return PyModuleDef_Init(&__pyx_moduledef); } static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { #if PY_VERSION_HEX >= 0x030700A1 static PY_INT64_T main_interpreter_id = -1; PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); if (main_interpreter_id == -1) { main_interpreter_id = current_id; return (unlikely(current_id == -1)) ? -1 : 0; } else if (unlikely(main_interpreter_id != current_id)) #else static PyInterpreterState *main_interpreter = NULL; PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; if (!main_interpreter) { main_interpreter = current_interpreter; } else if (unlikely(main_interpreter != current_interpreter)) #endif { PyErr_SetString( PyExc_ImportError, "Interpreter change detected - this module can only be loaded into one interpreter per process."); return -1; } return 0; } #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) #else static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) #endif { PyObject *value = PyObject_GetAttrString(spec, from_name); int result = 0; if (likely(value)) { if (allow_none || value != Py_None) { #if CYTHON_COMPILING_IN_LIMITED_API result = PyModule_AddObject(module, to_name, value); #else result = PyDict_SetItemString(moddict, to_name, value); #endif } Py_DECREF(value); } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); } else { result = -1; } return result; } static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { PyObject *module = NULL, *moddict, *modname; CYTHON_UNUSED_VAR(def); if (__Pyx_check_single_interpreter()) return NULL; if (__pyx_m) return __Pyx_NewRef(__pyx_m); modname = PyObject_GetAttrString(spec, "name"); if (unlikely(!modname)) goto bad; module = PyModule_NewObject(modname); Py_DECREF(modname); if (unlikely(!module)) goto bad; #if CYTHON_COMPILING_IN_LIMITED_API moddict = module; #else moddict = PyModule_GetDict(module); if (unlikely(!moddict)) goto bad; #endif if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; return module; bad: Py_XDECREF(module); return NULL; } static CYTHON_SMALL_CODE int __pyx_pymod_exec__websocket(PyObject *__pyx_pyinit_module) #endif #endif { int stringtab_initialized = 0; #if CYTHON_USE_MODULE_STATE int pystate_addmodule_run = 0; #endif PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m) { if (__pyx_m == __pyx_pyinit_module) return 0; PyErr_SetString(PyExc_RuntimeError, "Module '_websocket' has already been imported. Re-initialisation is not supported."); return -1; } #elif PY_MAJOR_VERSION >= 3 if (__pyx_m) return __Pyx_NewRef(__pyx_m); #endif /*--- Module creation code ---*/ #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_m = __pyx_pyinit_module; Py_INCREF(__pyx_m); #else #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("_websocket", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #elif CYTHON_USE_MODULE_STATE __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) { int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to _websocket pseudovariable */ if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) pystate_addmodule_run = 1; } #else __pyx_m = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #endif #endif CYTHON_UNUSED_VAR(__pyx_t_1); __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_d); __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__websocket(void)", 0); if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pxy_PyFrame_Initialize_Offsets __Pxy_PyFrame_Initialize_Offsets(); #endif __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pyx_CyFunction_USED if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Coroutine_USED if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_StopAsyncIteration_USED if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS PyEval_InitThreads(); #endif /*--- Initialize various global constants etc. ---*/ if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) stringtab_initialized = 1; if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif if (__pyx_module_is_main_aiohttp___websocket) { if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) if (!PyDict_GetItemString(modules, "aiohttp._websocket")) { if (unlikely((PyDict_SetItemString(modules, "aiohttp._websocket", __pyx_m) < 0))) __PYX_ERR(0, 1, __pyx_L1_error) } } #endif /*--- Builtin init code ---*/ if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Constants init code ---*/ if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Global type/function init code ---*/ (void)__Pyx_modinit_global_init_code(); (void)__Pyx_modinit_variable_export_code(); (void)__Pyx_modinit_function_export_code(); (void)__Pyx_modinit_type_init_code(); if (unlikely((__Pyx_modinit_type_import_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) (void)__Pyx_modinit_variable_import_code(); (void)__Pyx_modinit_function_import_code(); /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /* "aiohttp/_websocket.pyx":11 * * * def _websocket_mask_cython(object mask, object data): # <<<<<<<<<<<<<< * """Note, this function mutates its `data` argument * """ */ __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7aiohttp_10_websocket_1_websocket_mask_cython, 0, __pyx_n_s_websocket_mask_cython, NULL, __pyx_n_s_aiohttp__websocket, __pyx_d, ((PyObject *)__pyx_codeobj__2)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 11, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_websocket_mask_cython, __pyx_t_2) < 0) __PYX_ERR(0, 11, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_websocket.pyx":1 * from cpython cimport PyBytes_AsString # <<<<<<<<<<<<<< * * */ __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); if (__pyx_m) { if (__pyx_d && stringtab_initialized) { __Pyx_AddTraceback("init aiohttp._websocket", __pyx_clineno, __pyx_lineno, __pyx_filename); } #if !CYTHON_USE_MODULE_STATE Py_CLEAR(__pyx_m); #else Py_DECREF(__pyx_m); if (pystate_addmodule_run) { PyObject *tp, *value, *tb; PyErr_Fetch(&tp, &value, &tb); PyState_RemoveModule(&__pyx_moduledef); PyErr_Restore(tp, value, tb); } #endif } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init aiohttp._websocket"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if CYTHON_PEP489_MULTI_PHASE_INIT return (__pyx_m != NULL) ? 0 : -1; #elif PY_MAJOR_VERSION >= 3 return __pyx_m; #else return; #endif } /* #### Code section: cleanup_globals ### */ /* #### Code section: cleanup_module ### */ /* #### Code section: main_method ### */ /* #### Code section: utility_code_pragmas ### */ #ifdef _MSC_VER #pragma warning( push ) /* Warning 4127: conditional expression is constant * Cython uses constant conditional expressions to allow in inline functions to be optimized at * compile-time, so this warning is not useful */ #pragma warning( disable : 4127 ) #endif /* #### Code section: utility_code_def ### */ /* --- Runtime support code --- */ /* Refnanny */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule(modname); if (!m) goto end; p = PyObject_GetAttrString(m, "RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* PyErrExceptionMatches */ #if CYTHON_FAST_THREAD_STATE static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; i= 0x030C00A6 PyObject *current_exception = tstate->current_exception; if (unlikely(!current_exception)) return 0; exc_type = (PyObject*) Py_TYPE(current_exception); if (exc_type == err) return 1; #else exc_type = tstate->curexc_type; if (exc_type == err) return 1; if (unlikely(!exc_type)) return 0; #endif #if CYTHON_AVOID_BORROWED_REFS Py_INCREF(exc_type); #endif if (unlikely(PyTuple_Check(err))) { result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); } else { result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); } #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(exc_type); #endif return result; } #endif /* PyErrFetchRestore */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { #if PY_VERSION_HEX >= 0x030C00A6 PyObject *tmp_value; assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); if (value) { #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) #endif PyException_SetTraceback(value, tb); } tmp_value = tstate->current_exception; tstate->current_exception = value; Py_XDECREF(tmp_value); Py_XDECREF(type); Py_XDECREF(tb); #else PyObject *tmp_type, *tmp_value, *tmp_tb; tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #endif } static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { #if PY_VERSION_HEX >= 0x030C00A6 PyObject* exc_value; exc_value = tstate->current_exception; tstate->current_exception = 0; *value = exc_value; *type = NULL; *tb = NULL; if (exc_value) { *type = (PyObject*) Py_TYPE(exc_value); Py_INCREF(*type); #if CYTHON_COMPILING_IN_CPYTHON *tb = ((PyBaseExceptionObject*) exc_value)->traceback; Py_XINCREF(*tb); #else *tb = PyException_GetTraceback(exc_value); #endif } #else *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #endif } #endif /* PyObjectGetAttrStr */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #endif /* PyObjectGetAttrStrNoError */ #if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) __Pyx_PyErr_Clear(); } #endif static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { PyObject *result; #if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 (void) PyObject_GetOptionalAttr(obj, attr_name, &result); return result; #else #if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); } #endif result = __Pyx_PyObject_GetAttrStr(obj, attr_name); if (unlikely(!result)) { __Pyx_PyObject_GetAttrStr_ClearAttributeError(); } return result; #endif } /* GetBuiltinName */ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); if (unlikely(!result) && !PyErr_Occurred()) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } /* TupleAndListFromArray */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { PyObject *v; Py_ssize_t i; for (i = 0; i < length; i++) { v = dest[i] = src[i]; Py_INCREF(v); } } static CYTHON_INLINE PyObject * __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) { PyObject *res; if (n <= 0) { Py_INCREF(__pyx_empty_tuple); return __pyx_empty_tuple; } res = PyTuple_New(n); if (unlikely(res == NULL)) return NULL; __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); return res; } static CYTHON_INLINE PyObject * __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) { PyObject *res; if (n <= 0) { return PyList_New(0); } res = PyList_New(n); if (unlikely(res == NULL)) return NULL; __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); return res; } #endif /* BytesEquals */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API return PyObject_RichCompareBool(s1, s2, equals); #else if (s1 == s2) { return (equals == Py_EQ); } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { const char *ps1, *ps2; Py_ssize_t length = PyBytes_GET_SIZE(s1); if (length != PyBytes_GET_SIZE(s2)) return (equals == Py_NE); ps1 = PyBytes_AS_STRING(s1); ps2 = PyBytes_AS_STRING(s2); if (ps1[0] != ps2[0]) { return (equals == Py_NE); } else if (length == 1) { return (equals == Py_EQ); } else { int result; #if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) Py_hash_t hash1, hash2; hash1 = ((PyBytesObject*)s1)->ob_shash; hash2 = ((PyBytesObject*)s2)->ob_shash; if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { return (equals == Py_NE); } #endif result = memcmp(ps1, ps2, (size_t)length); return (equals == Py_EQ) ? (result == 0) : (result != 0); } } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { return (equals == Py_NE); } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { return (equals == Py_NE); } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); Py_DECREF(py_result); return result; } #endif } /* UnicodeEquals */ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API return PyObject_RichCompareBool(s1, s2, equals); #else #if PY_MAJOR_VERSION < 3 PyObject* owned_ref = NULL; #endif int s1_is_unicode, s2_is_unicode; if (s1 == s2) { goto return_eq; } s1_is_unicode = PyUnicode_CheckExact(s1); s2_is_unicode = PyUnicode_CheckExact(s2); #if PY_MAJOR_VERSION < 3 if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { owned_ref = PyUnicode_FromObject(s2); if (unlikely(!owned_ref)) return -1; s2 = owned_ref; s2_is_unicode = 1; } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { owned_ref = PyUnicode_FromObject(s1); if (unlikely(!owned_ref)) return -1; s1 = owned_ref; s1_is_unicode = 1; } else if (((!s2_is_unicode) & (!s1_is_unicode))) { return __Pyx_PyBytes_Equals(s1, s2, equals); } #endif if (s1_is_unicode & s2_is_unicode) { Py_ssize_t length; int kind; void *data1, *data2; if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) return -1; length = __Pyx_PyUnicode_GET_LENGTH(s1); if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { goto return_ne; } #if CYTHON_USE_UNICODE_INTERNALS { Py_hash_t hash1, hash2; #if CYTHON_PEP393_ENABLED hash1 = ((PyASCIIObject*)s1)->hash; hash2 = ((PyASCIIObject*)s2)->hash; #else hash1 = ((PyUnicodeObject*)s1)->hash; hash2 = ((PyUnicodeObject*)s2)->hash; #endif if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { goto return_ne; } } #endif kind = __Pyx_PyUnicode_KIND(s1); if (kind != __Pyx_PyUnicode_KIND(s2)) { goto return_ne; } data1 = __Pyx_PyUnicode_DATA(s1); data2 = __Pyx_PyUnicode_DATA(s2); if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { goto return_ne; } else if (length == 1) { goto return_eq; } else { int result = memcmp(data1, data2, (size_t)(length * kind)); #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_EQ) ? (result == 0) : (result != 0); } } else if ((s1 == Py_None) & s2_is_unicode) { goto return_ne; } else if ((s2 == Py_None) & s1_is_unicode) { goto return_ne; } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); Py_DECREF(py_result); return result; } return_eq: #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_EQ); return_ne: #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_NE); #endif } /* fastcall */ #if CYTHON_METH_FASTCALL static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) { Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); for (i = 0; i < n; i++) { if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; } for (i = 0; i < n; i++) { int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); if (unlikely(eq != 0)) { if (unlikely(eq < 0)) return NULL; // error return kwvalues[i]; } } return NULL; // not found (no exception set) } #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 static CYTHON_UNUSED PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); PyObject *dict; dict = PyDict_New(); if (unlikely(!dict)) return NULL; for (i=0; i= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } /* ParseKeywords */ static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject *const *kwvalues, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); while (1) { Py_XDECREF(key); key = NULL; Py_XDECREF(value); value = NULL; if (kwds_is_tuple) { Py_ssize_t size; #if CYTHON_ASSUME_SAFE_MACROS size = PyTuple_GET_SIZE(kwds); #else size = PyTuple_Size(kwds); if (size < 0) goto bad; #endif if (pos >= size) break; #if CYTHON_AVOID_BORROWED_REFS key = __Pyx_PySequence_ITEM(kwds, pos); if (!key) goto bad; #elif CYTHON_ASSUME_SAFE_MACROS key = PyTuple_GET_ITEM(kwds, pos); #else key = PyTuple_GetItem(kwds, pos); if (!key) goto bad; #endif value = kwvalues[pos]; pos++; } else { if (!PyDict_Next(kwds, &pos, &key, &value)) break; #if CYTHON_AVOID_BORROWED_REFS Py_INCREF(key); #endif } name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS Py_INCREF(value); // transfer ownership of value to values Py_DECREF(key); #endif key = NULL; value = NULL; continue; } #if !CYTHON_AVOID_BORROWED_REFS Py_INCREF(key); #endif Py_INCREF(value); name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS value = NULL; // ownership transferred to values #endif break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = ( #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**name, key) ); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS value = NULL; // ownership transferred to values #endif break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } Py_XDECREF(key); Py_XDECREF(value); return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); goto bad; invalid_keyword: #if PY_MAJOR_VERSION < 3 PyErr_Format(PyExc_TypeError, "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else PyErr_Format(PyExc_TypeError, "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: Py_XDECREF(key); Py_XDECREF(value); return -1; } /* RaiseException */ #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { __Pyx_PyThreadState_declare CYTHON_UNUSED_VAR(cause); Py_XINCREF(type); if (!value || value == Py_None) value = NULL; else Py_INCREF(value); if (!tb || tb == Py_None) tb = NULL; else { Py_INCREF(tb); if (!PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } } if (PyType_Check(type)) { #if CYTHON_COMPILING_IN_PYPY if (!value) { Py_INCREF(Py_None); value = Py_None; } #endif PyErr_NormalizeException(&type, &value, &tb); } else { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } value = type; type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } } __Pyx_PyThreadState_assign __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { PyObject* owned_instance = NULL; if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (PyExceptionClass_Check(type)) { PyObject *instance_class = NULL; if (value && PyExceptionInstance_Check(value)) { instance_class = (PyObject*) Py_TYPE(value); if (instance_class != type) { int is_subclass = PyObject_IsSubclass(instance_class, type); if (!is_subclass) { instance_class = NULL; } else if (unlikely(is_subclass == -1)) { goto bad; } else { type = instance_class; } } } if (!instance_class) { PyObject *args; if (!value) args = PyTuple_New(0); else if (PyTuple_Check(value)) { Py_INCREF(value); args = value; } else args = PyTuple_Pack(1, value); if (!args) goto bad; owned_instance = PyObject_Call(type, args, NULL); Py_DECREF(args); if (!owned_instance) goto bad; value = owned_instance; if (!PyExceptionInstance_Check(value)) { PyErr_Format(PyExc_TypeError, "calling %R should have returned an instance of " "BaseException, not %R", type, Py_TYPE(value)); goto bad; } } } else { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } if (cause) { PyObject *fixed_cause; if (cause == Py_None) { fixed_cause = NULL; } else if (PyExceptionClass_Check(cause)) { fixed_cause = PyObject_CallObject(cause, NULL); if (fixed_cause == NULL) goto bad; } else if (PyExceptionInstance_Check(cause)) { fixed_cause = cause; Py_INCREF(fixed_cause); } else { PyErr_SetString(PyExc_TypeError, "exception causes must derive from " "BaseException"); goto bad; } PyException_SetCause(value, fixed_cause); } PyErr_SetObject(type, value); if (tb) { #if PY_VERSION_HEX >= 0x030C00A6 PyException_SetTraceback(value, tb); #elif CYTHON_FAST_THREAD_STATE PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } #else PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); Py_INCREF(tb); PyErr_Restore(tmp_type, tmp_value, tb); Py_XDECREF(tmp_tb); #endif } bad: Py_XDECREF(owned_instance); return; } #endif /* PyFunctionFastCall */ #if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, PyObject *globals) { PyFrameObject *f; PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject **fastlocals; Py_ssize_t i; PyObject *result; assert(globals != NULL); /* XXX Perhaps we should create a specialized PyFrame_New() that doesn't take locals, but does take builtins without sanity checking them. */ assert(tstate != NULL); f = PyFrame_New(tstate, co, globals, NULL); if (f == NULL) { return NULL; } fastlocals = __Pyx_PyFrame_GetLocalsplus(f); for (i = 0; i < na; i++) { Py_INCREF(*args); fastlocals[i] = *args++; } result = PyEval_EvalFrameEx(f,0); ++tstate->recursion_depth; Py_DECREF(f); --tstate->recursion_depth; return result; } static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); PyObject *globals = PyFunction_GET_GLOBALS(func); PyObject *argdefs = PyFunction_GET_DEFAULTS(func); PyObject *closure; #if PY_MAJOR_VERSION >= 3 PyObject *kwdefs; #endif PyObject *kwtuple, **k; PyObject **d; Py_ssize_t nd; Py_ssize_t nk; PyObject *result; assert(kwargs == NULL || PyDict_Check(kwargs)); nk = kwargs ? PyDict_Size(kwargs) : 0; #if PY_MAJOR_VERSION < 3 if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { return NULL; } #else if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) { return NULL; } #endif if ( #if PY_MAJOR_VERSION >= 3 co->co_kwonlyargcount == 0 && #endif likely(kwargs == NULL || nk == 0) && co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { if (argdefs == NULL && co->co_argcount == nargs) { result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); goto done; } else if (nargs == 0 && argdefs != NULL && co->co_argcount == Py_SIZE(argdefs)) { /* function called with no arguments, but all parameters have a default value: use default values as arguments .*/ args = &PyTuple_GET_ITEM(argdefs, 0); result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); goto done; } } if (kwargs != NULL) { Py_ssize_t pos, i; kwtuple = PyTuple_New(2 * nk); if (kwtuple == NULL) { result = NULL; goto done; } k = &PyTuple_GET_ITEM(kwtuple, 0); pos = i = 0; while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { Py_INCREF(k[i]); Py_INCREF(k[i+1]); i += 2; } nk = i / 2; } else { kwtuple = NULL; k = NULL; } closure = PyFunction_GET_CLOSURE(func); #if PY_MAJOR_VERSION >= 3 kwdefs = PyFunction_GET_KW_DEFAULTS(func); #endif if (argdefs != NULL) { d = &PyTuple_GET_ITEM(argdefs, 0); nd = Py_SIZE(argdefs); } else { d = NULL; nd = 0; } #if PY_MAJOR_VERSION >= 3 result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, kwdefs, closure); #else result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, closure); #endif Py_XDECREF(kwtuple); done: Py_LeaveRecursiveCall(); return result; } #endif /* PyObjectCall */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; ternaryfunc call = Py_TYPE(func)->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); #if PY_MAJOR_VERSION < 3 if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; #else if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) return NULL; #endif result = (*call)(func, arg, kw); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectCallMethO */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { PyObject *self, *result; PyCFunction cfunc; cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func); self = __Pyx_CyOrPyCFunction_GET_SELF(func); #if PY_MAJOR_VERSION < 3 if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; #else if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) return NULL; #endif result = cfunc(self, arg); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectFastCall */ #if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { PyObject *argstuple; PyObject *result = 0; size_t i; argstuple = PyTuple_New((Py_ssize_t)nargs); if (unlikely(!argstuple)) return NULL; for (i = 0; i < nargs; i++) { Py_INCREF(args[i]); if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; } result = __Pyx_PyObject_Call(func, argstuple, kwargs); bad: Py_DECREF(argstuple); return result; } #endif static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); #if CYTHON_COMPILING_IN_CPYTHON if (nargs == 0 && kwargs == NULL) { if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS)) return __Pyx_PyObject_CallMethO(func, NULL); } else if (nargs == 1 && kwargs == NULL) { if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O)) return __Pyx_PyObject_CallMethO(func, args[0]); } #endif #if PY_VERSION_HEX < 0x030800B1 #if CYTHON_FAST_PYCCALL if (PyCFunction_Check(func)) { if (kwargs) { return _PyCFunction_FastCallDict(func, args, nargs, kwargs); } else { return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); } } #if PY_VERSION_HEX >= 0x030700A1 if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); } #endif #endif #if CYTHON_FAST_PYCALL if (PyFunction_Check(func)) { return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); } #endif #endif if (kwargs == NULL) { #if CYTHON_VECTORCALL #if PY_VERSION_HEX < 0x03090000 vectorcallfunc f = _PyVectorcall_Function(func); #else vectorcallfunc f = PyVectorcall_Function(func); #endif if (f) { return f(func, args, (size_t)nargs, NULL); } #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL if (__Pyx_CyFunction_CheckExact(func)) { __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); if (f) return f(func, args, (size_t)nargs, NULL); } #endif } if (nargs == 0) { return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); } #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs); #else return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); #endif } /* PyObjectCallOneArg */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *args[2] = {NULL, arg}; return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); } /* RaiseUnexpectedTypeError */ static int __Pyx_RaiseUnexpectedTypeError(const char *expected, PyObject *obj) { __Pyx_TypeName obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); PyErr_Format(PyExc_TypeError, "Expected %s, got " __Pyx_FMT_TYPENAME, expected, obj_type_name); __Pyx_DECREF_TypeName(obj_type_name); return 0; } /* TypeImport */ #ifndef __PYX_HAVE_RT_ImportType_3_0_5 #define __PYX_HAVE_RT_ImportType_3_0_5 static PyTypeObject *__Pyx_ImportType_3_0_5(PyObject *module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_5 check_size) { PyObject *result = 0; char warning[200]; Py_ssize_t basicsize; Py_ssize_t itemsize; #if CYTHON_COMPILING_IN_LIMITED_API PyObject *py_basicsize; PyObject *py_itemsize; #endif result = PyObject_GetAttrString(module, class_name); if (!result) goto bad; if (!PyType_Check(result)) { PyErr_Format(PyExc_TypeError, "%.200s.%.200s is not a type object", module_name, class_name); goto bad; } #if !CYTHON_COMPILING_IN_LIMITED_API basicsize = ((PyTypeObject *)result)->tp_basicsize; itemsize = ((PyTypeObject *)result)->tp_itemsize; #else py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); if (!py_basicsize) goto bad; basicsize = PyLong_AsSsize_t(py_basicsize); Py_DECREF(py_basicsize); py_basicsize = 0; if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) goto bad; py_itemsize = PyObject_GetAttrString(result, "__itemsize__"); if (!py_itemsize) goto bad; itemsize = PyLong_AsSsize_t(py_itemsize); Py_DECREF(py_itemsize); py_itemsize = 0; if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred()) goto bad; #endif if (itemsize) { if (size % alignment) { alignment = size % alignment; } if (itemsize < (Py_ssize_t)alignment) itemsize = (Py_ssize_t)alignment; } if ((size_t)(basicsize + itemsize) < size) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize+itemsize); goto bad; } if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_5 && ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd-%zd from PyObject", module_name, class_name, size, basicsize, basicsize+itemsize); goto bad; } else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_5 && (size_t)basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; } return (PyTypeObject *)result; bad: Py_XDECREF(result); return NULL; } #endif /* FixUpExtensionType */ #if CYTHON_USE_TYPE_SPECS static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { #if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API CYTHON_UNUSED_VAR(spec); CYTHON_UNUSED_VAR(type); #else const PyType_Slot *slot = spec->slots; while (slot && slot->slot && slot->slot != Py_tp_members) slot++; if (slot && slot->slot == Py_tp_members) { int changed = 0; #if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) const #endif PyMemberDef *memb = (PyMemberDef*) slot->pfunc; while (memb && memb->name) { if (memb->name[0] == '_' && memb->name[1] == '_') { #if PY_VERSION_HEX < 0x030900b1 if (strcmp(memb->name, "__weaklistoffset__") == 0) { assert(memb->type == T_PYSSIZET); assert(memb->flags == READONLY); type->tp_weaklistoffset = memb->offset; changed = 1; } else if (strcmp(memb->name, "__dictoffset__") == 0) { assert(memb->type == T_PYSSIZET); assert(memb->flags == READONLY); type->tp_dictoffset = memb->offset; changed = 1; } #if CYTHON_METH_FASTCALL else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { assert(memb->type == T_PYSSIZET); assert(memb->flags == READONLY); #if PY_VERSION_HEX >= 0x030800b4 type->tp_vectorcall_offset = memb->offset; #else type->tp_print = (printfunc) memb->offset; #endif changed = 1; } #endif #else if ((0)); #endif #if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON else if (strcmp(memb->name, "__module__") == 0) { PyObject *descr; assert(memb->type == T_OBJECT); assert(memb->flags == 0 || memb->flags == READONLY); descr = PyDescr_NewMember(type, memb); if (unlikely(!descr)) return -1; if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { Py_DECREF(descr); return -1; } Py_DECREF(descr); changed = 1; } #endif } memb++; } if (changed) PyType_Modified(type); } #endif return 0; } #endif /* FetchSharedCythonModule */ static PyObject *__Pyx_FetchSharedCythonABIModule(void) { return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); } /* FetchCommonType */ static int __Pyx_VerifyCachedType(PyObject *cached_type, const char *name, Py_ssize_t basicsize, Py_ssize_t expected_basicsize) { if (!PyType_Check(cached_type)) { PyErr_Format(PyExc_TypeError, "Shared Cython type %.200s is not a type object", name); return -1; } if (basicsize != expected_basicsize) { PyErr_Format(PyExc_TypeError, "Shared Cython type %.200s has the wrong size, try recompiling", name); return -1; } return 0; } #if !CYTHON_USE_TYPE_SPECS static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { PyObject* abi_module; const char* object_name; PyTypeObject *cached_type = NULL; abi_module = __Pyx_FetchSharedCythonABIModule(); if (!abi_module) return NULL; object_name = strrchr(type->tp_name, '.'); object_name = object_name ? object_name+1 : type->tp_name; cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); if (cached_type) { if (__Pyx_VerifyCachedType( (PyObject *)cached_type, object_name, cached_type->tp_basicsize, type->tp_basicsize) < 0) { goto bad; } goto done; } if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; PyErr_Clear(); if (PyType_Ready(type) < 0) goto bad; if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) goto bad; Py_INCREF(type); cached_type = type; done: Py_DECREF(abi_module); return cached_type; bad: Py_XDECREF(cached_type); cached_type = NULL; goto done; } #else static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { PyObject *abi_module, *cached_type = NULL; const char* object_name = strrchr(spec->name, '.'); object_name = object_name ? object_name+1 : spec->name; abi_module = __Pyx_FetchSharedCythonABIModule(); if (!abi_module) return NULL; cached_type = PyObject_GetAttrString(abi_module, object_name); if (cached_type) { Py_ssize_t basicsize; #if CYTHON_COMPILING_IN_LIMITED_API PyObject *py_basicsize; py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); if (unlikely(!py_basicsize)) goto bad; basicsize = PyLong_AsSsize_t(py_basicsize); Py_DECREF(py_basicsize); py_basicsize = 0; if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; #else basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; #endif if (__Pyx_VerifyCachedType( cached_type, object_name, basicsize, spec->basicsize) < 0) { goto bad; } goto done; } if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; PyErr_Clear(); CYTHON_UNUSED_VAR(module); cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); if (unlikely(!cached_type)) goto bad; if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; done: Py_DECREF(abi_module); assert(cached_type == NULL || PyType_Check(cached_type)); return (PyTypeObject *) cached_type; bad: Py_XDECREF(cached_type); cached_type = NULL; goto done; } #endif /* PyVectorcallFastCallDict */ #if CYTHON_METH_FASTCALL static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) { PyObject *res = NULL; PyObject *kwnames; PyObject **newargs; PyObject **kwvalues; Py_ssize_t i, pos; size_t j; PyObject *key, *value; unsigned long keys_are_strings; Py_ssize_t nkw = PyDict_GET_SIZE(kw); newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); if (unlikely(newargs == NULL)) { PyErr_NoMemory(); return NULL; } for (j = 0; j < nargs; j++) newargs[j] = args[j]; kwnames = PyTuple_New(nkw); if (unlikely(kwnames == NULL)) { PyMem_Free(newargs); return NULL; } kwvalues = newargs + nargs; pos = i = 0; keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; while (PyDict_Next(kw, &pos, &key, &value)) { keys_are_strings &= Py_TYPE(key)->tp_flags; Py_INCREF(key); Py_INCREF(value); PyTuple_SET_ITEM(kwnames, i, key); kwvalues[i] = value; i++; } if (unlikely(!keys_are_strings)) { PyErr_SetString(PyExc_TypeError, "keywords must be strings"); goto cleanup; } res = vc(func, newargs, nargs, kwnames); cleanup: Py_DECREF(kwnames); for (i = 0; i < nkw; i++) Py_DECREF(kwvalues[i]); PyMem_Free(newargs); return res; } static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) { if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { return vc(func, args, nargs, NULL); } return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); } #endif /* CythonFunctionShared */ #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { if (__Pyx_CyFunction_Check(func)) { return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; } else if (PyCFunction_Check(func)) { return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; } return 0; } #else static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; } #endif static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API __Pyx_Py_XDECREF_SET( __Pyx_CyFunction_GetClassObj(f), ((classobj) ? __Pyx_NewRef(classobj) : NULL)); #else __Pyx_Py_XDECREF_SET( ((PyCMethodObject *) (f))->mm_class, (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); #endif } static PyObject * __Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) { CYTHON_UNUSED_VAR(closure); if (unlikely(op->func_doc == NULL)) { #if CYTHON_COMPILING_IN_LIMITED_API op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); if (unlikely(!op->func_doc)) return NULL; #else if (((PyCFunctionObject*)op)->m_ml->ml_doc) { #if PY_MAJOR_VERSION >= 3 op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); #else op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); #endif if (unlikely(op->func_doc == NULL)) return NULL; } else { Py_INCREF(Py_None); return Py_None; } #endif } Py_INCREF(op->func_doc); return op->func_doc; } static int __Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); if (value == NULL) { value = Py_None; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_doc, value); return 0; } static PyObject * __Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); if (unlikely(op->func_name == NULL)) { #if CYTHON_COMPILING_IN_LIMITED_API op->func_name = PyObject_GetAttrString(op->func, "__name__"); #elif PY_MAJOR_VERSION >= 3 op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); #else op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); #endif if (unlikely(op->func_name == NULL)) return NULL; } Py_INCREF(op->func_name); return op->func_name; } static int __Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); #if PY_MAJOR_VERSION >= 3 if (unlikely(value == NULL || !PyUnicode_Check(value))) #else if (unlikely(value == NULL || !PyString_Check(value))) #endif { PyErr_SetString(PyExc_TypeError, "__name__ must be set to a string object"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_name, value); return 0; } static PyObject * __Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); Py_INCREF(op->func_qualname); return op->func_qualname; } static int __Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); #if PY_MAJOR_VERSION >= 3 if (unlikely(value == NULL || !PyUnicode_Check(value))) #else if (unlikely(value == NULL || !PyString_Check(value))) #endif { PyErr_SetString(PyExc_TypeError, "__qualname__ must be set to a string object"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_qualname, value); return 0; } static PyObject * __Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); if (unlikely(op->func_dict == NULL)) { op->func_dict = PyDict_New(); if (unlikely(op->func_dict == NULL)) return NULL; } Py_INCREF(op->func_dict); return op->func_dict; } static int __Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); if (unlikely(value == NULL)) { PyErr_SetString(PyExc_TypeError, "function's dictionary may not be deleted"); return -1; } if (unlikely(!PyDict_Check(value))) { PyErr_SetString(PyExc_TypeError, "setting function's dictionary to a non-dict"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_dict, value); return 0; } static PyObject * __Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); Py_INCREF(op->func_globals); return op->func_globals; } static PyObject * __Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(op); CYTHON_UNUSED_VAR(context); Py_INCREF(Py_None); return Py_None; } static PyObject * __Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) { PyObject* result = (op->func_code) ? op->func_code : Py_None; CYTHON_UNUSED_VAR(context); Py_INCREF(result); return result; } static int __Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { int result = 0; PyObject *res = op->defaults_getter((PyObject *) op); if (unlikely(!res)) return -1; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS op->defaults_tuple = PyTuple_GET_ITEM(res, 0); Py_INCREF(op->defaults_tuple); op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); Py_INCREF(op->defaults_kwdict); #else op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); if (unlikely(!op->defaults_tuple)) result = -1; else { op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); if (unlikely(!op->defaults_kwdict)) result = -1; } #endif Py_DECREF(res); return result; } static int __Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); if (!value) { value = Py_None; } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { PyErr_SetString(PyExc_TypeError, "__defaults__ must be set to a tuple object"); return -1; } PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " "currently affect the values used in function calls", 1); Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); return 0; } static PyObject * __Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { PyObject* result = op->defaults_tuple; CYTHON_UNUSED_VAR(context); if (unlikely(!result)) { if (op->defaults_getter) { if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; result = op->defaults_tuple; } else { result = Py_None; } } Py_INCREF(result); return result; } static int __Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); if (!value) { value = Py_None; } else if (unlikely(value != Py_None && !PyDict_Check(value))) { PyErr_SetString(PyExc_TypeError, "__kwdefaults__ must be set to a dict object"); return -1; } PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " "currently affect the values used in function calls", 1); Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); return 0; } static PyObject * __Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { PyObject* result = op->defaults_kwdict; CYTHON_UNUSED_VAR(context); if (unlikely(!result)) { if (op->defaults_getter) { if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; result = op->defaults_kwdict; } else { result = Py_None; } } Py_INCREF(result); return result; } static int __Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); if (!value || value == Py_None) { value = NULL; } else if (unlikely(!PyDict_Check(value))) { PyErr_SetString(PyExc_TypeError, "__annotations__ must be set to a dict object"); return -1; } Py_XINCREF(value); __Pyx_Py_XDECREF_SET(op->func_annotations, value); return 0; } static PyObject * __Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { PyObject* result = op->func_annotations; CYTHON_UNUSED_VAR(context); if (unlikely(!result)) { result = PyDict_New(); if (unlikely(!result)) return NULL; op->func_annotations = result; } Py_INCREF(result); return result; } static PyObject * __Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { int is_coroutine; CYTHON_UNUSED_VAR(context); if (op->func_is_coroutine) { return __Pyx_NewRef(op->func_is_coroutine); } is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; #if PY_VERSION_HEX >= 0x03050000 if (is_coroutine) { PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; fromlist = PyList_New(1); if (unlikely(!fromlist)) return NULL; Py_INCREF(marker); #if CYTHON_ASSUME_SAFE_MACROS PyList_SET_ITEM(fromlist, 0, marker); #else if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { Py_DECREF(marker); Py_DECREF(fromlist); return NULL; } #endif module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); Py_DECREF(fromlist); if (unlikely(!module)) goto ignore; op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); Py_DECREF(module); if (likely(op->func_is_coroutine)) { return __Pyx_NewRef(op->func_is_coroutine); } ignore: PyErr_Clear(); } #endif op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); return __Pyx_NewRef(op->func_is_coroutine); } #if CYTHON_COMPILING_IN_LIMITED_API static PyObject * __Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); return PyObject_GetAttrString(op->func, "__module__"); } static int __Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); return PyObject_SetAttrString(op->func, "__module__", value); } #endif static PyGetSetDef __pyx_CyFunction_getsets[] = { {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, #if CYTHON_COMPILING_IN_LIMITED_API {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, #endif {0, 0, 0, 0, 0} }; static PyMemberDef __pyx_CyFunction_members[] = { #if !CYTHON_COMPILING_IN_LIMITED_API {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, #endif #if CYTHON_USE_TYPE_SPECS {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, #if CYTHON_METH_FASTCALL #if CYTHON_BACKPORT_VECTORCALL {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, #else #if !CYTHON_COMPILING_IN_LIMITED_API {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, #endif #endif #endif #if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, #else {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, #endif #endif {0, 0, 0, 0, 0} }; static PyObject * __Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) { CYTHON_UNUSED_VAR(args); #if PY_MAJOR_VERSION >= 3 Py_INCREF(m->func_qualname); return m->func_qualname; #else return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); #endif } static PyMethodDef __pyx_CyFunction_methods[] = { {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, {0, 0, 0, 0} }; #if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) #else #define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) #endif static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { #if !CYTHON_COMPILING_IN_LIMITED_API PyCFunctionObject *cf = (PyCFunctionObject*) op; #endif if (unlikely(op == NULL)) return NULL; #if CYTHON_COMPILING_IN_LIMITED_API op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); if (unlikely(!op->func)) return NULL; #endif op->flags = flags; __Pyx_CyFunction_weakreflist(op) = NULL; #if !CYTHON_COMPILING_IN_LIMITED_API cf->m_ml = ml; cf->m_self = (PyObject *) op; #endif Py_XINCREF(closure); op->func_closure = closure; #if !CYTHON_COMPILING_IN_LIMITED_API Py_XINCREF(module); cf->m_module = module; #endif op->func_dict = NULL; op->func_name = NULL; Py_INCREF(qualname); op->func_qualname = qualname; op->func_doc = NULL; #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API op->func_classobj = NULL; #else ((PyCMethodObject*)op)->mm_class = NULL; #endif op->func_globals = globals; Py_INCREF(op->func_globals); Py_XINCREF(code); op->func_code = code; op->defaults_pyobjects = 0; op->defaults_size = 0; op->defaults = NULL; op->defaults_tuple = NULL; op->defaults_kwdict = NULL; op->defaults_getter = NULL; op->func_annotations = NULL; op->func_is_coroutine = NULL; #if CYTHON_METH_FASTCALL switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { case METH_NOARGS: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; break; case METH_O: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; break; case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; break; case METH_FASTCALL | METH_KEYWORDS: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; break; case METH_VARARGS | METH_KEYWORDS: __Pyx_CyFunction_func_vectorcall(op) = NULL; break; default: PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); Py_DECREF(op); return NULL; } #endif return (PyObject *) op; } static int __Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) { Py_CLEAR(m->func_closure); #if CYTHON_COMPILING_IN_LIMITED_API Py_CLEAR(m->func); #else Py_CLEAR(((PyCFunctionObject*)m)->m_module); #endif Py_CLEAR(m->func_dict); Py_CLEAR(m->func_name); Py_CLEAR(m->func_qualname); Py_CLEAR(m->func_doc); Py_CLEAR(m->func_globals); Py_CLEAR(m->func_code); #if !CYTHON_COMPILING_IN_LIMITED_API #if PY_VERSION_HEX < 0x030900B1 Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); #else { PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; ((PyCMethodObject *) (m))->mm_class = NULL; Py_XDECREF(cls); } #endif #endif Py_CLEAR(m->defaults_tuple); Py_CLEAR(m->defaults_kwdict); Py_CLEAR(m->func_annotations); Py_CLEAR(m->func_is_coroutine); if (m->defaults) { PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); int i; for (i = 0; i < m->defaults_pyobjects; i++) Py_XDECREF(pydefaults[i]); PyObject_Free(m->defaults); m->defaults = NULL; } return 0; } static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) { if (__Pyx_CyFunction_weakreflist(m) != NULL) PyObject_ClearWeakRefs((PyObject *) m); __Pyx_CyFunction_clear(m); __Pyx_PyHeapTypeObject_GC_Del(m); } static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) { PyObject_GC_UnTrack(m); __Pyx__CyFunction_dealloc(m); } static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) { Py_VISIT(m->func_closure); #if CYTHON_COMPILING_IN_LIMITED_API Py_VISIT(m->func); #else Py_VISIT(((PyCFunctionObject*)m)->m_module); #endif Py_VISIT(m->func_dict); Py_VISIT(m->func_name); Py_VISIT(m->func_qualname); Py_VISIT(m->func_doc); Py_VISIT(m->func_globals); Py_VISIT(m->func_code); #if !CYTHON_COMPILING_IN_LIMITED_API Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); #endif Py_VISIT(m->defaults_tuple); Py_VISIT(m->defaults_kwdict); Py_VISIT(m->func_is_coroutine); if (m->defaults) { PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); int i; for (i = 0; i < m->defaults_pyobjects; i++) Py_VISIT(pydefaults[i]); } return 0; } static PyObject* __Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) { #if PY_MAJOR_VERSION >= 3 return PyUnicode_FromFormat("", op->func_qualname, (void *)op); #else return PyString_FromFormat("", PyString_AsString(op->func_qualname), (void *)op); #endif } static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { #if CYTHON_COMPILING_IN_LIMITED_API PyObject *f = ((__pyx_CyFunctionObject*)func)->func; PyObject *py_name = NULL; PyCFunction meth; int flags; meth = PyCFunction_GetFunction(f); if (unlikely(!meth)) return NULL; flags = PyCFunction_GetFlags(f); if (unlikely(flags < 0)) return NULL; #else PyCFunctionObject* f = (PyCFunctionObject*)func; PyCFunction meth = f->m_ml->ml_meth; int flags = f->m_ml->ml_flags; #endif Py_ssize_t size; switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { case METH_VARARGS: if (likely(kw == NULL || PyDict_Size(kw) == 0)) return (*meth)(self, arg); break; case METH_VARARGS | METH_KEYWORDS: return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); case METH_NOARGS: if (likely(kw == NULL || PyDict_Size(kw) == 0)) { #if CYTHON_ASSUME_SAFE_MACROS size = PyTuple_GET_SIZE(arg); #else size = PyTuple_Size(arg); if (unlikely(size < 0)) return NULL; #endif if (likely(size == 0)) return (*meth)(self, NULL); #if CYTHON_COMPILING_IN_LIMITED_API py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); if (!py_name) return NULL; PyErr_Format(PyExc_TypeError, "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", py_name, size); Py_DECREF(py_name); #else PyErr_Format(PyExc_TypeError, "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", f->m_ml->ml_name, size); #endif return NULL; } break; case METH_O: if (likely(kw == NULL || PyDict_Size(kw) == 0)) { #if CYTHON_ASSUME_SAFE_MACROS size = PyTuple_GET_SIZE(arg); #else size = PyTuple_Size(arg); if (unlikely(size < 0)) return NULL; #endif if (likely(size == 1)) { PyObject *result, *arg0; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS arg0 = PyTuple_GET_ITEM(arg, 0); #else arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; #endif result = (*meth)(self, arg0); #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) Py_DECREF(arg0); #endif return result; } #if CYTHON_COMPILING_IN_LIMITED_API py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); if (!py_name) return NULL; PyErr_Format(PyExc_TypeError, "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", py_name, size); Py_DECREF(py_name); #else PyErr_Format(PyExc_TypeError, "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", f->m_ml->ml_name, size); #endif return NULL; } break; default: PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); return NULL; } #if CYTHON_COMPILING_IN_LIMITED_API py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); if (!py_name) return NULL; PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", py_name); Py_DECREF(py_name); #else PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", f->m_ml->ml_name); #endif return NULL; } static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *self, *result; #if CYTHON_COMPILING_IN_LIMITED_API self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); if (unlikely(!self) && PyErr_Occurred()) return NULL; #else self = ((PyCFunctionObject*)func)->m_self; #endif result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); return result; } static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { PyObject *result; __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; #if CYTHON_METH_FASTCALL __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); if (vc) { #if CYTHON_ASSUME_SAFE_MACROS return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); #else (void) &__Pyx_PyVectorcall_FastCallDict; return PyVectorcall_Call(func, args, kw); #endif } #endif if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { Py_ssize_t argc; PyObject *new_args; PyObject *self; #if CYTHON_ASSUME_SAFE_MACROS argc = PyTuple_GET_SIZE(args); #else argc = PyTuple_Size(args); if (unlikely(!argc) < 0) return NULL; #endif new_args = PyTuple_GetSlice(args, 1, argc); if (unlikely(!new_args)) return NULL; self = PyTuple_GetItem(args, 0); if (unlikely(!self)) { Py_DECREF(new_args); #if PY_MAJOR_VERSION > 2 PyErr_Format(PyExc_TypeError, "unbound method %.200S() needs an argument", cyfunc->func_qualname); #else PyErr_SetString(PyExc_TypeError, "unbound method needs an argument"); #endif return NULL; } result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); Py_DECREF(new_args); } else { result = __Pyx_CyFunction_Call(func, args, kw); } return result; } #if CYTHON_METH_FASTCALL static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) { int ret = 0; if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { if (unlikely(nargs < 1)) { PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); return -1; } ret = 1; } if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); return -1; } return ret; } static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } if (unlikely(nargs != 0)) { PyErr_Format(PyExc_TypeError, "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", def->ml_name, nargs); return NULL; } return def->ml_meth(self, NULL); } static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } if (unlikely(nargs != 1)) { PyErr_Format(PyExc_TypeError, "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", def->ml_name, nargs); return NULL; } return def->ml_meth(self, args[0]); } static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); } static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); } #endif #if CYTHON_USE_TYPE_SPECS static PyType_Slot __pyx_CyFunctionType_slots[] = { {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, {Py_tp_methods, (void *)__pyx_CyFunction_methods}, {Py_tp_members, (void *)__pyx_CyFunction_members}, {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, {0, 0}, }; static PyType_Spec __pyx_CyFunctionType_spec = { __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", sizeof(__pyx_CyFunctionObject), 0, #ifdef Py_TPFLAGS_METHOD_DESCRIPTOR Py_TPFLAGS_METHOD_DESCRIPTOR | #endif #if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) _Py_TPFLAGS_HAVE_VECTORCALL | #endif Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, __pyx_CyFunctionType_slots }; #else static PyTypeObject __pyx_CyFunctionType_type = { PyVarObject_HEAD_INIT(0, 0) __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", sizeof(__pyx_CyFunctionObject), 0, (destructor) __Pyx_CyFunction_dealloc, #if !CYTHON_METH_FASTCALL 0, #elif CYTHON_BACKPORT_VECTORCALL (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), #else offsetof(PyCFunctionObject, vectorcall), #endif 0, 0, #if PY_MAJOR_VERSION < 3 0, #else 0, #endif (reprfunc) __Pyx_CyFunction_repr, 0, 0, 0, 0, __Pyx_CyFunction_CallAsMethod, 0, 0, 0, 0, #ifdef Py_TPFLAGS_METHOD_DESCRIPTOR Py_TPFLAGS_METHOD_DESCRIPTOR | #endif #if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL _Py_TPFLAGS_HAVE_VECTORCALL | #endif Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, 0, (traverseproc) __Pyx_CyFunction_traverse, (inquiry) __Pyx_CyFunction_clear, 0, #if PY_VERSION_HEX < 0x030500A0 offsetof(__pyx_CyFunctionObject, func_weakreflist), #else offsetof(PyCFunctionObject, m_weakreflist), #endif 0, 0, __pyx_CyFunction_methods, __pyx_CyFunction_members, __pyx_CyFunction_getsets, 0, 0, __Pyx_PyMethod_New, 0, offsetof(__pyx_CyFunctionObject, func_dict), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, #if PY_VERSION_HEX >= 0x030400a1 0, #endif #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, #endif #if __PYX_NEED_TP_PRINT_SLOT 0, #endif #if PY_VERSION_HEX >= 0x030C0000 0, #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 0, #endif }; #endif static int __pyx_CyFunction_init(PyObject *module) { #if CYTHON_USE_TYPE_SPECS __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); #else CYTHON_UNUSED_VAR(module); __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); #endif if (unlikely(__pyx_CyFunctionType == NULL)) { return -1; } return 0; } static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->defaults = PyObject_Malloc(size); if (unlikely(!m->defaults)) return PyErr_NoMemory(); memset(m->defaults, 0, size); m->defaults_pyobjects = pyobjects; m->defaults_size = size; return m->defaults; } static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->defaults_tuple = tuple; Py_INCREF(tuple); } static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->defaults_kwdict = dict; Py_INCREF(dict); } static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->func_annotations = dict; Py_INCREF(dict); } /* CythonFunction */ static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { PyObject *op = __Pyx_CyFunction_Init( PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), ml, flags, qualname, closure, module, globals, code ); if (likely(op)) { PyObject_GC_Track(op); } return op; } /* PyDictVersioning */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { PyObject *dict = Py_TYPE(obj)->tp_dict; return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; } static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { PyObject **dictptr = NULL; Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; if (offset) { #if CYTHON_COMPILING_IN_CPYTHON dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); #else dictptr = _PyObject_GetDictPtr(obj); #endif } return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; } static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { PyObject *dict = Py_TYPE(obj)->tp_dict; if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) return 0; return obj_dict_version == __Pyx_get_object_dict_version(obj); } #endif /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { PyObject *use_cline; PyObject *ptype, *pvalue, *ptraceback; #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif CYTHON_MAYBE_UNUSED_VAR(tstate); if (unlikely(!__pyx_cython_runtime)) { return c_line; } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); if (likely(cython_runtime_dict)) { __PYX_PY_DICT_LOOKUP_IF_MODIFIED( use_cline, *cython_runtime_dict, __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) } else #endif { PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); if (use_cline_obj) { use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; Py_DECREF(use_cline_obj); } else { PyErr_Clear(); use_cline = NULL; } } if (!use_cline) { c_line = 0; (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); } else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { c_line = 0; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); return c_line; } #endif /* CodeObjectCache */ #if !CYTHON_COMPILING_IN_LIMITED_API static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = start + (end - start) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } #endif /* AddTraceback */ #include "compile.h" #include "frameobject.h" #include "traceback.h" #if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API #ifndef Py_BUILD_CORE #define Py_BUILD_CORE 1 #endif #include "internal/pycore_frame.h" #endif #if CYTHON_COMPILING_IN_LIMITED_API static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, PyObject *firstlineno, PyObject *name) { PyObject *replace = NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; replace = PyObject_GetAttrString(code, "replace"); if (likely(replace)) { PyObject *result; result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); Py_DECREF(replace); return result; } PyErr_Clear(); #if __PYX_LIMITED_VERSION_HEX < 0x030780000 { PyObject *compiled = NULL, *result = NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; compiled = Py_CompileString( "out = type(code)(\n" " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" " code.co_lnotab)\n", "", Py_file_input); if (!compiled) return NULL; result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); Py_DECREF(compiled); if (!result) PyErr_Print(); Py_DECREF(result); result = PyDict_GetItemString(scratch_dict, "out"); if (result) Py_INCREF(result); return result; } #else return NULL; #endif } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; PyObject *replace = NULL, *getframe = NULL, *frame = NULL; PyObject *exc_type, *exc_value, *exc_traceback; int success = 0; if (c_line) { (void) __pyx_cfilenm; (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); } PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); code_object = Py_CompileString("_getframe()", filename, Py_eval_input); if (unlikely(!code_object)) goto bad; py_py_line = PyLong_FromLong(py_line); if (unlikely(!py_py_line)) goto bad; py_funcname = PyUnicode_FromString(funcname); if (unlikely(!py_funcname)) goto bad; dict = PyDict_New(); if (unlikely(!dict)) goto bad; { PyObject *old_code_object = code_object; code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); Py_DECREF(old_code_object); } if (unlikely(!code_object)) goto bad; getframe = PySys_GetObject("_getframe"); if (unlikely(!getframe)) goto bad; if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; frame = PyEval_EvalCode(code_object, dict, dict); if (unlikely(!frame) || frame == Py_None) goto bad; success = 1; bad: PyErr_Restore(exc_type, exc_value, exc_traceback); Py_XDECREF(code_object); Py_XDECREF(py_py_line); Py_XDECREF(py_funcname); Py_XDECREF(dict); Py_XDECREF(replace); if (success) { PyTraceBack_Here( (struct _frame*)frame); } Py_XDECREF(frame); } #else static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = NULL; PyObject *py_funcname = NULL; #if PY_MAJOR_VERSION < 3 PyObject *py_srcfile = NULL; py_srcfile = PyString_FromString(filename); if (!py_srcfile) goto bad; #endif if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); if (!py_funcname) goto bad; #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); if (!py_funcname) goto bad; funcname = PyUnicode_AsUTF8(py_funcname); if (!funcname) goto bad; #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); if (!py_funcname) goto bad; #endif } #if PY_MAJOR_VERSION < 3 py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); #else py_code = PyCode_NewEmpty(filename, funcname, py_line); #endif Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline return py_code; bad: Py_XDECREF(py_funcname); #if PY_MAJOR_VERSION < 3 Py_XDECREF(py_srcfile); #endif return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject *ptype, *pvalue, *ptraceback; if (c_line) { c_line = __Pyx_CLineForTraceback(tstate, c_line); } py_code = __pyx_find_code_object(c_line ? -c_line : py_line); if (!py_code) { __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) { /* If the code object creation fails, then we should clear the fetched exception references and propagate the new exception */ Py_XDECREF(ptype); Py_XDECREF(pvalue); Py_XDECREF(ptraceback); goto bad; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); } py_frame = PyFrame_New( tstate, /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; __Pyx_PyFrame_SetLineNumber(py_frame, py_line); PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } #endif /* FormatTypeName */ #if CYTHON_COMPILING_IN_LIMITED_API static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp) { PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, __pyx_n_s_name); if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { PyErr_Clear(); Py_XDECREF(name); name = __Pyx_NewRef(__pyx_n_s__3); } return name; } #endif /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; #if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); #else PyObject *from_bytes, *result = NULL; PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); if (!from_bytes) return NULL; py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); if (!py_bytes) goto limited_bad; order_str = PyUnicode_FromString(little ? "little" : "big"); if (!order_str) goto limited_bad; arg_tuple = PyTuple_Pack(2, py_bytes, order_str); if (!arg_tuple) goto limited_bad; if (!is_unsigned) { kwds = PyDict_New(); if (!kwds) goto limited_bad; if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; } result = PyObject_Call(from_bytes, arg_tuple, kwds); limited_bad: Py_XDECREF(kwds); Py_XDECREF(arg_tuple); Py_XDECREF(order_str); Py_XDECREF(py_bytes); Py_XDECREF(from_bytes); return result; #endif } } /* CIntFromPyVerify */ #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) #define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) #define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ {\ func_type value = func_value;\ if (sizeof(target_type) < sizeof(func_type)) {\ if (unlikely(value != (func_type) (target_type) value)) {\ func_type zero = 0;\ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ return (target_type) -1;\ if (is_unsigned && unlikely(value < zero))\ goto raise_neg_overflow;\ else\ goto raise_overflow;\ }\ }\ return (target_type) value;\ } /* CIntFromPy */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if ((sizeof(long) < sizeof(long))) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS if (unlikely(__Pyx_PyLong_IsNeg(x))) { goto raise_neg_overflow; } else if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_DigitCount(x)) { case 2: if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 3: if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 4: if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; } } #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if ((sizeof(long) <= sizeof(unsigned long))) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_SignedDigitCount(x)) { case -2: if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 2: if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -3: if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 3: if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -4: if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 4: if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; } } #endif if ((sizeof(long) <= sizeof(long))) { __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { long val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int ret = -1; #if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); #else PyObject *stepval = NULL, *mask = NULL, *shift = NULL; int bits, remaining_bits, is_negative = 0; long idigit; int chunk_size = (sizeof(long) < 8) ? 30 : 62; if (unlikely(!PyLong_CheckExact(v))) { PyObject *tmp = v; v = PyNumber_Long(v); assert(PyLong_CheckExact(v)); Py_DECREF(tmp); if (unlikely(!v)) return (long) -1; } #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(x) == 0) return (long) 0; is_negative = Py_SIZE(x) < 0; #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; is_negative = result == 1; } #endif if (is_unsigned && unlikely(is_negative)) { goto raise_neg_overflow; } else if (is_negative) { stepval = PyNumber_Invert(v); if (unlikely(!stepval)) return (long) -1; } else { stepval = __Pyx_NewRef(v); } val = (long) 0; mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { PyObject *tmp, *digit; digit = PyNumber_And(stepval, mask); if (unlikely(!digit)) goto done; idigit = PyLong_AsLong(digit); Py_DECREF(digit); if (unlikely(idigit < 0)) goto done; tmp = PyNumber_Rshift(stepval, shift); if (unlikely(!tmp)) goto done; Py_DECREF(stepval); stepval = tmp; val |= ((long) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(stepval) == 0) goto unpacking_done; #endif } idigit = PyLong_AsLong(stepval); if (unlikely(idigit < 0)) goto done; remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); if (unlikely(idigit >= (1L << remaining_bits))) goto raise_overflow; val |= ((long) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 unpacking_done: #endif if (!is_unsigned) { if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) goto raise_overflow; if (is_negative) val = ~val; } ret = 0; done: Py_XDECREF(shift); Py_XDECREF(mask); Py_XDECREF(stepval); #endif Py_DECREF(v); if (likely(!ret)) return val; } return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if ((sizeof(int) < sizeof(long))) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS if (unlikely(__Pyx_PyLong_IsNeg(x))) { goto raise_neg_overflow; } else if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_DigitCount(x)) { case 2: if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 3: if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 4: if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; } } #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if ((sizeof(int) <= sizeof(unsigned long))) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_SignedDigitCount(x)) { case -2: if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 2: if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -3: if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 3: if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -4: if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 4: if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; } } #endif if ((sizeof(int) <= sizeof(long))) { __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int ret = -1; #if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); #else PyObject *stepval = NULL, *mask = NULL, *shift = NULL; int bits, remaining_bits, is_negative = 0; long idigit; int chunk_size = (sizeof(long) < 8) ? 30 : 62; if (unlikely(!PyLong_CheckExact(v))) { PyObject *tmp = v; v = PyNumber_Long(v); assert(PyLong_CheckExact(v)); Py_DECREF(tmp); if (unlikely(!v)) return (int) -1; } #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(x) == 0) return (int) 0; is_negative = Py_SIZE(x) < 0; #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; is_negative = result == 1; } #endif if (is_unsigned && unlikely(is_negative)) { goto raise_neg_overflow; } else if (is_negative) { stepval = PyNumber_Invert(v); if (unlikely(!stepval)) return (int) -1; } else { stepval = __Pyx_NewRef(v); } val = (int) 0; mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { PyObject *tmp, *digit; digit = PyNumber_And(stepval, mask); if (unlikely(!digit)) goto done; idigit = PyLong_AsLong(digit); Py_DECREF(digit); if (unlikely(idigit < 0)) goto done; tmp = PyNumber_Rshift(stepval, shift); if (unlikely(!tmp)) goto done; Py_DECREF(stepval); stepval = tmp; val |= ((int) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(stepval) == 0) goto unpacking_done; #endif } idigit = PyLong_AsLong(stepval); if (unlikely(idigit < 0)) goto done; remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); if (unlikely(idigit >= (1L << remaining_bits))) goto raise_overflow; val |= ((int) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 unpacking_done: #endif if (!is_unsigned) { if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) goto raise_overflow; if (is_negative) val = ~val; } ret = 0; done: Py_XDECREF(shift); Py_XDECREF(mask); Py_XDECREF(stepval); #endif Py_DECREF(v); if (likely(!ret)) return val; } return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } /* FastTypeChecks */ #if CYTHON_COMPILING_IN_CPYTHON static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { while (a) { a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); if (a == b) return 1; } return b == &PyBaseObject_Type; } static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (a == b) return 1; mro = a->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(a, b); } static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (cls == a || cls == b) return 1; mro = cls->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { PyObject *base = PyTuple_GET_ITEM(mro, i); if (base == (PyObject *)a || base == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); } #if PY_MAJOR_VERSION == 2 static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { PyObject *exception, *value, *tb; int res; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&exception, &value, &tb); res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } if (!res) { res = PyObject_IsSubclass(err, exc_type2); if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } } __Pyx_ErrRestore(exception, value, tb); return res; } #else static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { if (exc_type1) { return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); } else { return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); } } #endif static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; assert(PyExceptionClass_Check(exc_type)); n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; i= 0x030B00A4 return Py_Version & ~0xFFUL; #else const char* rt_version = Py_GetVersion(); unsigned long version = 0; unsigned long factor = 0x01000000UL; unsigned int digit = 0; int i = 0; while (factor) { while ('0' <= rt_version[i] && rt_version[i] <= '9') { digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); ++i; } version += factor * digit; if (rt_version[i] != '.') break; digit = 0; factor >>= 8; ++i; } return version; #endif } static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { const unsigned long MAJOR_MINOR = 0xFFFF0000UL; if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) return 0; if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) return 1; { char message[200]; PyOS_snprintf(message, sizeof(message), "compile time Python version %d.%d " "of module '%.100s' " "%s " "runtime version %d.%d", (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), __Pyx_MODULE_NAME, (allow_newer) ? "was newer than" : "does not match", (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) ); return PyErr_WarnEx(NULL, message, 1); } } /* InitStrings */ #if PY_MAJOR_VERSION >= 3 static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { if (t.is_unicode | t.is_str) { if (t.intern) { *str = PyUnicode_InternFromString(t.s); } else if (t.encoding) { *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); } else { *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); } } else { *str = PyBytes_FromStringAndSize(t.s, t.n - 1); } if (!*str) return -1; if (PyObject_Hash(*str) == -1) return -1; return 0; } #endif static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION >= 3 __Pyx_InitString(*t, t->p); #else if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } if (!*t->p) return -1; if (PyObject_Hash(*t->p) == -1) return -1; #endif ++t; } return 0; } #include static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { size_t len = strlen(s); if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { PyErr_SetString(PyExc_OverflowError, "byte string is too long"); return -1; } return (Py_ssize_t) len; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { Py_ssize_t len = __Pyx_ssize_strlen(c_str); if (unlikely(len < 0)) return NULL; return __Pyx_PyUnicode_FromStringAndSize(c_str, len); } static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { Py_ssize_t len = __Pyx_ssize_strlen(c_str); if (unlikely(len < 0)) return NULL; return PyByteArray_FromStringAndSize(c_str, len); } static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #if !CYTHON_PEP393_ENABLED static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; } #else static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (likely(PyUnicode_IS_ASCII(o))) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif } #endif #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { return __Pyx_PyUnicode_AsStringAndSize(o, length); } else #endif #if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { int retval; if (unlikely(!x)) return -1; retval = __Pyx_PyObject_IsTrue(x); Py_DECREF(x); return retval; } static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); #if PY_MAJOR_VERSION >= 3 if (PyLong_Check(result)) { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " "The ability to return an instance of a strict subclass of int is deprecated, " "and may be removed in a future version of Python.", result_type_name)) { __Pyx_DECREF_TypeName(result_type_name); Py_DECREF(result); return NULL; } __Pyx_DECREF_TypeName(result_type_name); return result; } #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", type_name, type_name, result_type_name); __Pyx_DECREF_TypeName(result_type_name); Py_DECREF(result); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { #if CYTHON_USE_TYPE_SLOTS PyNumberMethods *m; #endif const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x) || PyLong_Check(x))) #else if (likely(PyLong_Check(x))) #endif return __Pyx_NewRef(x); #if CYTHON_USE_TYPE_SLOTS m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = m->nb_int(x); } else if (m && m->nb_long) { name = "long"; res = m->nb_long(x); } #else if (likely(m && m->nb_int)) { name = "int"; res = m->nb_int(x); } #endif #else if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { res = PyNumber_Int(x); } #endif if (likely(res)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { #else if (unlikely(!PyLong_CheckExact(res))) { #endif return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) { if (sizeof(Py_ssize_t) >= sizeof(long)) return PyInt_AS_LONG(b); else return PyInt_AsSsize_t(b); } #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_USE_PYLONG_INTERNALS if (likely(__Pyx_PyLong_IsCompact(b))) { return __Pyx_PyLong_CompactValue(b); } else { const digit* digits = __Pyx_PyLong_Digits(b); const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); switch (size) { case 2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; } } #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); #if PY_MAJOR_VERSION < 3 } else if (likely(PyInt_CheckExact(o))) { return PyInt_AS_LONG(o); #endif } else { Py_ssize_t ival; PyObject *x; x = PyNumber_Index(o); if (!x) return -1; ival = PyInt_AsLong(x); Py_DECREF(x); return ival; } } static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } /* #### Code section: utility_code_pragmas_end ### */ #ifdef _MSC_VER #pragma warning( pop ) #endif /* #### Code section: end ### */ #endif /* Py_PYTHON_H */ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/_websocket.pyx0000644000175100001770000000303114607525266017156 0ustar00runnerdockerfrom cpython cimport PyBytes_AsString #from cpython cimport PyByteArray_AsString # cython still not exports that cdef extern from "Python.h": char* PyByteArray_AsString(bytearray ba) except NULL from libc.stdint cimport uint32_t, uint64_t, uintmax_t def _websocket_mask_cython(object mask, object data): """Note, this function mutates its `data` argument """ cdef: Py_ssize_t data_len, i # bit operations on signed integers are implementation-specific unsigned char * in_buf const unsigned char * mask_buf uint32_t uint32_msk uint64_t uint64_msk assert len(mask) == 4 if not isinstance(mask, bytes): mask = bytes(mask) if isinstance(data, bytearray): data = data else: data = bytearray(data) data_len = len(data) in_buf = PyByteArray_AsString(data) mask_buf = PyBytes_AsString(mask) uint32_msk = (mask_buf)[0] # TODO: align in_data ptr to achieve even faster speeds # does it need in python ?! malloc() always aligns to sizeof(long) bytes if sizeof(size_t) >= 8: uint64_msk = uint32_msk uint64_msk = (uint64_msk << 32) | uint32_msk while data_len >= 8: (in_buf)[0] ^= uint64_msk in_buf += 8 data_len -= 8 while data_len >= 4: (in_buf)[0] ^= uint32_msk in_buf += 4 data_len -= 4 for i in range(0, data_len): in_buf[i] ^= mask_buf[i] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/abc.py0000644000175100001770000001257414607525266015402 0ustar00runnerdockerimport asyncio import logging from abc import ABC, abstractmethod from collections.abc import Sized from http.cookies import BaseCookie, Morsel from typing import ( TYPE_CHECKING, Any, Awaitable, Callable, Dict, Generator, Iterable, List, Optional, Tuple, ) from multidict import CIMultiDict from yarl import URL from .helpers import get_running_loop from .typedefs import LooseCookies if TYPE_CHECKING: from .web_app import Application from .web_exceptions import HTTPException from .web_request import BaseRequest, Request from .web_response import StreamResponse else: BaseRequest = Request = Application = StreamResponse = None HTTPException = None class AbstractRouter(ABC): def __init__(self) -> None: self._frozen = False def post_init(self, app: Application) -> None: """Post init stage. Not an abstract method for sake of backward compatibility, but if the router wants to be aware of the application it can override this. """ @property def frozen(self) -> bool: return self._frozen def freeze(self) -> None: """Freeze router.""" self._frozen = True @abstractmethod async def resolve(self, request: Request) -> "AbstractMatchInfo": """Return MATCH_INFO for given request""" class AbstractMatchInfo(ABC): @property # pragma: no branch @abstractmethod def handler(self) -> Callable[[Request], Awaitable[StreamResponse]]: """Execute matched request handler""" @property @abstractmethod def expect_handler( self, ) -> Callable[[Request], Awaitable[Optional[StreamResponse]]]: """Expect handler for 100-continue processing""" @property # pragma: no branch @abstractmethod def http_exception(self) -> Optional[HTTPException]: """HTTPException instance raised on router's resolving, or None""" @abstractmethod # pragma: no branch def get_info(self) -> Dict[str, Any]: """Return a dict with additional info useful for introspection""" @property # pragma: no branch @abstractmethod def apps(self) -> Tuple[Application, ...]: """Stack of nested applications. Top level application is left-most element. """ @abstractmethod def add_app(self, app: Application) -> None: """Add application to the nested apps stack.""" @abstractmethod def freeze(self) -> None: """Freeze the match info. The method is called after route resolution. After the call .add_app() is forbidden. """ class AbstractView(ABC): """Abstract class based view.""" def __init__(self, request: Request) -> None: self._request = request @property def request(self) -> Request: """Request instance.""" return self._request @abstractmethod def __await__(self) -> Generator[Any, None, StreamResponse]: """Execute the view handler.""" class AbstractResolver(ABC): """Abstract DNS resolver.""" @abstractmethod async def resolve(self, host: str, port: int, family: int) -> List[Dict[str, Any]]: """Return IP address for given hostname""" @abstractmethod async def close(self) -> None: """Release resolver""" if TYPE_CHECKING: IterableBase = Iterable[Morsel[str]] else: IterableBase = Iterable ClearCookiePredicate = Callable[["Morsel[str]"], bool] class AbstractCookieJar(Sized, IterableBase): """Abstract Cookie Jar.""" def __init__(self, *, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: self._loop = get_running_loop(loop) @abstractmethod def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: """Clear all cookies if no predicate is passed.""" @abstractmethod def clear_domain(self, domain: str) -> None: """Clear all cookies for domain and all subdomains.""" @abstractmethod def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: """Update cookies.""" @abstractmethod def filter_cookies(self, request_url: URL) -> "BaseCookie[str]": """Return the jar's cookies filtered by their attributes.""" class AbstractStreamWriter(ABC): """Abstract stream writer.""" buffer_size = 0 output_size = 0 length: Optional[int] = 0 @abstractmethod async def write(self, chunk: bytes) -> None: """Write chunk into stream.""" @abstractmethod async def write_eof(self, chunk: bytes = b"") -> None: """Write last chunk.""" @abstractmethod async def drain(self) -> None: """Flush the write buffer.""" @abstractmethod def enable_compression(self, encoding: str = "deflate") -> None: """Enable HTTP body compression""" @abstractmethod def enable_chunking(self) -> None: """Enable HTTP chunked mode""" @abstractmethod async def write_headers( self, status_line: str, headers: "CIMultiDict[str]" ) -> None: """Write HTTP headers""" class AbstractAccessLogger(ABC): """Abstract writer to access log.""" def __init__(self, logger: logging.Logger, log_format: str) -> None: self.logger = logger self.log_format = log_format @abstractmethod def log(self, request: BaseRequest, response: StreamResponse, time: float) -> None: """Emit log to logger.""" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/base_protocol.py0000644000175100001770000000547414607525266017511 0ustar00runnerdockerimport asyncio from typing import Optional, cast from .helpers import set_exception from .tcp_helpers import tcp_nodelay class BaseProtocol(asyncio.Protocol): __slots__ = ( "_loop", "_paused", "_drain_waiter", "_connection_lost", "_reading_paused", "transport", ) def __init__(self, loop: asyncio.AbstractEventLoop) -> None: self._loop: asyncio.AbstractEventLoop = loop self._paused = False self._drain_waiter: Optional[asyncio.Future[None]] = None self._reading_paused = False self.transport: Optional[asyncio.Transport] = None @property def connected(self) -> bool: """Return True if the connection is open.""" return self.transport is not None def pause_writing(self) -> None: assert not self._paused self._paused = True def resume_writing(self) -> None: assert self._paused self._paused = False waiter = self._drain_waiter if waiter is not None: self._drain_waiter = None if not waiter.done(): waiter.set_result(None) def pause_reading(self) -> None: if not self._reading_paused and self.transport is not None: try: self.transport.pause_reading() except (AttributeError, NotImplementedError, RuntimeError): pass self._reading_paused = True def resume_reading(self) -> None: if self._reading_paused and self.transport is not None: try: self.transport.resume_reading() except (AttributeError, NotImplementedError, RuntimeError): pass self._reading_paused = False def connection_made(self, transport: asyncio.BaseTransport) -> None: tr = cast(asyncio.Transport, transport) tcp_nodelay(tr, True) self.transport = tr def connection_lost(self, exc: Optional[BaseException]) -> None: # Wake up the writer if currently paused. self.transport = None if not self._paused: return waiter = self._drain_waiter if waiter is None: return self._drain_waiter = None if waiter.done(): return if exc is None: waiter.set_result(None) else: set_exception( waiter, ConnectionError("Connection lost"), exc, ) async def _drain_helper(self) -> None: if not self.connected: raise ConnectionResetError("Connection lost") if not self._paused: return waiter = self._drain_waiter if waiter is None: waiter = self._loop.create_future() self._drain_waiter = waiter await asyncio.shield(waiter) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/client.py0000644000175100001770000013461314607525266016132 0ustar00runnerdocker"""HTTP Client for asyncio.""" import asyncio import base64 import hashlib import json import os import sys import traceback import warnings from contextlib import suppress from types import SimpleNamespace, TracebackType from typing import ( TYPE_CHECKING, Any, Awaitable, Callable, Coroutine, Final, FrozenSet, Generator, Generic, Iterable, List, Mapping, Optional, Set, Tuple, Type, TypeVar, Union, ) import attr from multidict import CIMultiDict, MultiDict, MultiDictProxy, istr from yarl import URL from . import hdrs, http, payload from .abc import AbstractCookieJar from .client_exceptions import ( ClientConnectionError as ClientConnectionError, ClientConnectorCertificateError as ClientConnectorCertificateError, ClientConnectorError as ClientConnectorError, ClientConnectorSSLError as ClientConnectorSSLError, ClientError as ClientError, ClientHttpProxyError as ClientHttpProxyError, ClientOSError as ClientOSError, ClientPayloadError as ClientPayloadError, ClientProxyConnectionError as ClientProxyConnectionError, ClientResponseError as ClientResponseError, ClientSSLError as ClientSSLError, ContentTypeError as ContentTypeError, InvalidURL as InvalidURL, ServerConnectionError as ServerConnectionError, ServerDisconnectedError as ServerDisconnectedError, ServerFingerprintMismatch as ServerFingerprintMismatch, ServerTimeoutError as ServerTimeoutError, TooManyRedirects as TooManyRedirects, WSServerHandshakeError as WSServerHandshakeError, ) from .client_reqrep import ( ClientRequest as ClientRequest, ClientResponse as ClientResponse, Fingerprint as Fingerprint, RequestInfo as RequestInfo, _merge_ssl_params, ) from .client_ws import ClientWebSocketResponse as ClientWebSocketResponse from .connector import ( BaseConnector as BaseConnector, NamedPipeConnector as NamedPipeConnector, TCPConnector as TCPConnector, UnixConnector as UnixConnector, ) from .cookiejar import CookieJar from .helpers import ( _SENTINEL, DEBUG, BasicAuth, TimeoutHandle, ceil_timeout, get_env_proxy_for_url, get_running_loop, method_must_be_empty_body, sentinel, strip_auth_from_url, ) from .http import WS_KEY, HttpVersion, WebSocketReader, WebSocketWriter from .http_websocket import WSHandshakeError, WSMessage, ws_ext_gen, ws_ext_parse from .streams import FlowControlDataQueue from .tracing import Trace, TraceConfig from .typedefs import JSONEncoder, LooseCookies, LooseHeaders, StrOrURL __all__ = ( # client_exceptions "ClientConnectionError", "ClientConnectorCertificateError", "ClientConnectorError", "ClientConnectorSSLError", "ClientError", "ClientHttpProxyError", "ClientOSError", "ClientPayloadError", "ClientProxyConnectionError", "ClientResponseError", "ClientSSLError", "ContentTypeError", "InvalidURL", "ServerConnectionError", "ServerDisconnectedError", "ServerFingerprintMismatch", "ServerTimeoutError", "TooManyRedirects", "WSServerHandshakeError", # client_reqrep "ClientRequest", "ClientResponse", "Fingerprint", "RequestInfo", # connector "BaseConnector", "TCPConnector", "UnixConnector", "NamedPipeConnector", # client_ws "ClientWebSocketResponse", # client "ClientSession", "ClientTimeout", "request", ) if TYPE_CHECKING: from ssl import SSLContext else: SSLContext = None @attr.s(auto_attribs=True, frozen=True, slots=True) class ClientTimeout: total: Optional[float] = None connect: Optional[float] = None sock_read: Optional[float] = None sock_connect: Optional[float] = None ceil_threshold: float = 5 # pool_queue_timeout: Optional[float] = None # dns_resolution_timeout: Optional[float] = None # socket_connect_timeout: Optional[float] = None # connection_acquiring_timeout: Optional[float] = None # new_connection_timeout: Optional[float] = None # http_header_timeout: Optional[float] = None # response_body_timeout: Optional[float] = None # to create a timeout specific for a single request, either # - create a completely new one to overwrite the default # - or use http://www.attrs.org/en/stable/api.html#attr.evolve # to overwrite the defaults # 5 Minute default read timeout DEFAULT_TIMEOUT: Final[ClientTimeout] = ClientTimeout(total=5 * 60) _RetType = TypeVar("_RetType") _CharsetResolver = Callable[[ClientResponse, bytes], str] class ClientSession: """First-class interface for making HTTP requests.""" ATTRS = frozenset( [ "_base_url", "_source_traceback", "_connector", "requote_redirect_url", "_loop", "_cookie_jar", "_connector_owner", "_default_auth", "_version", "_json_serialize", "_requote_redirect_url", "_timeout", "_raise_for_status", "_auto_decompress", "_trust_env", "_default_headers", "_skip_auto_headers", "_request_class", "_response_class", "_ws_response_class", "_trace_configs", "_read_bufsize", "_max_line_size", "_max_field_size", "_resolve_charset", ] ) _source_traceback: Optional[traceback.StackSummary] = None _connector: Optional[BaseConnector] = None def __init__( self, base_url: Optional[StrOrURL] = None, *, connector: Optional[BaseConnector] = None, loop: Optional[asyncio.AbstractEventLoop] = None, cookies: Optional[LooseCookies] = None, headers: Optional[LooseHeaders] = None, skip_auto_headers: Optional[Iterable[str]] = None, auth: Optional[BasicAuth] = None, json_serialize: JSONEncoder = json.dumps, request_class: Type[ClientRequest] = ClientRequest, response_class: Type[ClientResponse] = ClientResponse, ws_response_class: Type[ClientWebSocketResponse] = ClientWebSocketResponse, version: HttpVersion = http.HttpVersion11, cookie_jar: Optional[AbstractCookieJar] = None, connector_owner: bool = True, raise_for_status: Union[ bool, Callable[[ClientResponse], Awaitable[None]] ] = False, read_timeout: Union[float, _SENTINEL] = sentinel, conn_timeout: Optional[float] = None, timeout: Union[object, ClientTimeout] = sentinel, auto_decompress: bool = True, trust_env: bool = False, requote_redirect_url: bool = True, trace_configs: Optional[List[TraceConfig]] = None, read_bufsize: int = 2**16, max_line_size: int = 8190, max_field_size: int = 8190, fallback_charset_resolver: _CharsetResolver = lambda r, b: "utf-8", ) -> None: # We initialise _connector to None immediately, as it's referenced in __del__() # and could cause issues if an exception occurs during initialisation. self._connector: Optional[BaseConnector] = None if timeout is sentinel or timeout is None: self._timeout = DEFAULT_TIMEOUT if read_timeout is not sentinel: warnings.warn( "read_timeout is deprecated, " "use timeout argument instead", DeprecationWarning, stacklevel=2, ) self._timeout = attr.evolve(self._timeout, total=read_timeout) if conn_timeout is not None: self._timeout = attr.evolve(self._timeout, connect=conn_timeout) warnings.warn( "conn_timeout is deprecated, " "use timeout argument instead", DeprecationWarning, stacklevel=2, ) else: if not isinstance(timeout, ClientTimeout): raise ValueError( f"timeout parameter cannot be of {type(timeout)} type, " "please use 'timeout=ClientTimeout(...)'", ) self._timeout = timeout if read_timeout is not sentinel: raise ValueError( "read_timeout and timeout parameters " "conflict, please setup " "timeout.read" ) if conn_timeout is not None: raise ValueError( "conn_timeout and timeout parameters " "conflict, please setup " "timeout.connect" ) if loop is None: if connector is not None: loop = connector._loop loop = get_running_loop(loop) if base_url is None or isinstance(base_url, URL): self._base_url: Optional[URL] = base_url else: self._base_url = URL(base_url) assert ( self._base_url.origin() == self._base_url ), "Only absolute URLs without path part are supported" if connector is None: connector = TCPConnector(loop=loop) if connector._loop is not loop: raise RuntimeError("Session and connector has to use same event loop") self._loop = loop if loop.get_debug(): self._source_traceback = traceback.extract_stack(sys._getframe(1)) if cookie_jar is None: cookie_jar = CookieJar(loop=loop) self._cookie_jar = cookie_jar if cookies is not None: self._cookie_jar.update_cookies(cookies) self._connector = connector self._connector_owner = connector_owner self._default_auth = auth self._version = version self._json_serialize = json_serialize self._raise_for_status = raise_for_status self._auto_decompress = auto_decompress self._trust_env = trust_env self._requote_redirect_url = requote_redirect_url self._read_bufsize = read_bufsize self._max_line_size = max_line_size self._max_field_size = max_field_size # Convert to list of tuples if headers: real_headers: CIMultiDict[str] = CIMultiDict(headers) else: real_headers = CIMultiDict() self._default_headers: CIMultiDict[str] = real_headers if skip_auto_headers is not None: self._skip_auto_headers = frozenset(istr(i) for i in skip_auto_headers) else: self._skip_auto_headers = frozenset() self._request_class = request_class self._response_class = response_class self._ws_response_class = ws_response_class self._trace_configs = trace_configs or [] for trace_config in self._trace_configs: trace_config.freeze() self._resolve_charset = fallback_charset_resolver def __init_subclass__(cls: Type["ClientSession"]) -> None: warnings.warn( "Inheritance class {} from ClientSession " "is discouraged".format(cls.__name__), DeprecationWarning, stacklevel=2, ) if DEBUG: def __setattr__(self, name: str, val: Any) -> None: if name not in self.ATTRS: warnings.warn( "Setting custom ClientSession.{} attribute " "is discouraged".format(name), DeprecationWarning, stacklevel=2, ) super().__setattr__(name, val) def __del__(self, _warnings: Any = warnings) -> None: if not self.closed: kwargs = {"source": self} _warnings.warn( f"Unclosed client session {self!r}", ResourceWarning, **kwargs ) context = {"client_session": self, "message": "Unclosed client session"} if self._source_traceback is not None: context["source_traceback"] = self._source_traceback self._loop.call_exception_handler(context) def request( self, method: str, url: StrOrURL, **kwargs: Any ) -> "_RequestContextManager": """Perform HTTP request.""" return _RequestContextManager(self._request(method, url, **kwargs)) def _build_url(self, str_or_url: StrOrURL) -> URL: url = URL(str_or_url) if self._base_url is None: return url else: assert not url.is_absolute() and url.path.startswith("/") return self._base_url.join(url) async def _request( self, method: str, str_or_url: StrOrURL, *, params: Optional[Mapping[str, str]] = None, data: Any = None, json: Any = None, cookies: Optional[LooseCookies] = None, headers: Optional[LooseHeaders] = None, skip_auto_headers: Optional[Iterable[str]] = None, auth: Optional[BasicAuth] = None, allow_redirects: bool = True, max_redirects: int = 10, compress: Optional[str] = None, chunked: Optional[bool] = None, expect100: bool = False, raise_for_status: Union[ None, bool, Callable[[ClientResponse], Awaitable[None]] ] = None, read_until_eof: bool = True, proxy: Optional[StrOrURL] = None, proxy_auth: Optional[BasicAuth] = None, timeout: Union[ClientTimeout, _SENTINEL] = sentinel, verify_ssl: Optional[bool] = None, fingerprint: Optional[bytes] = None, ssl_context: Optional[SSLContext] = None, ssl: Union[SSLContext, bool, Fingerprint] = True, server_hostname: Optional[str] = None, proxy_headers: Optional[LooseHeaders] = None, trace_request_ctx: Optional[SimpleNamespace] = None, read_bufsize: Optional[int] = None, auto_decompress: Optional[bool] = None, max_line_size: Optional[int] = None, max_field_size: Optional[int] = None, ) -> ClientResponse: # NOTE: timeout clamps existing connect and read timeouts. We cannot # set the default to None because we need to detect if the user wants # to use the existing timeouts by setting timeout to None. if self.closed: raise RuntimeError("Session is closed") ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) if data is not None and json is not None: raise ValueError( "data and json parameters can not be used at the same time" ) elif json is not None: data = payload.JsonPayload(json, dumps=self._json_serialize) if not isinstance(chunked, bool) and chunked is not None: warnings.warn("Chunk size is deprecated #1615", DeprecationWarning) redirects = 0 history = [] version = self._version params = params or {} # Merge with default headers and transform to CIMultiDict headers = self._prepare_headers(headers) proxy_headers = self._prepare_headers(proxy_headers) try: url = self._build_url(str_or_url) except ValueError as e: raise InvalidURL(str_or_url) from e skip_headers = set(self._skip_auto_headers) if skip_auto_headers is not None: for i in skip_auto_headers: skip_headers.add(istr(i)) if proxy is not None: try: proxy = URL(proxy) except ValueError as e: raise InvalidURL(proxy) from e if timeout is sentinel: real_timeout: ClientTimeout = self._timeout else: if not isinstance(timeout, ClientTimeout): real_timeout = ClientTimeout(total=timeout) else: real_timeout = timeout # timeout is cumulative for all request operations # (request, redirects, responses, data consuming) tm = TimeoutHandle( self._loop, real_timeout.total, ceil_threshold=real_timeout.ceil_threshold ) handle = tm.start() if read_bufsize is None: read_bufsize = self._read_bufsize if auto_decompress is None: auto_decompress = self._auto_decompress if max_line_size is None: max_line_size = self._max_line_size if max_field_size is None: max_field_size = self._max_field_size traces = [ Trace( self, trace_config, trace_config.trace_config_ctx(trace_request_ctx=trace_request_ctx), ) for trace_config in self._trace_configs ] for trace in traces: await trace.send_request_start(method, url.update_query(params), headers) timer = tm.timer() try: with timer: while True: url, auth_from_url = strip_auth_from_url(url) if auth and auth_from_url: raise ValueError( "Cannot combine AUTH argument with " "credentials encoded in URL" ) if auth is None: auth = auth_from_url if auth is None: auth = self._default_auth # It would be confusing if we support explicit # Authorization header with auth argument if ( headers is not None and auth is not None and hdrs.AUTHORIZATION in headers ): raise ValueError( "Cannot combine AUTHORIZATION header " "with AUTH argument or credentials " "encoded in URL" ) all_cookies = self._cookie_jar.filter_cookies(url) if cookies is not None: tmp_cookie_jar = CookieJar() tmp_cookie_jar.update_cookies(cookies) req_cookies = tmp_cookie_jar.filter_cookies(url) if req_cookies: all_cookies.load(req_cookies) if proxy is not None: proxy = URL(proxy) elif self._trust_env: with suppress(LookupError): proxy, proxy_auth = get_env_proxy_for_url(url) req = self._request_class( method, url, params=params, headers=headers, skip_auto_headers=skip_headers, data=data, cookies=all_cookies, auth=auth, version=version, compress=compress, chunked=chunked, expect100=expect100, loop=self._loop, response_class=self._response_class, proxy=proxy, proxy_auth=proxy_auth, timer=timer, session=self, ssl=ssl if ssl is not None else True, server_hostname=server_hostname, proxy_headers=proxy_headers, traces=traces, trust_env=self.trust_env, ) # connection timeout try: async with ceil_timeout( real_timeout.connect, ceil_threshold=real_timeout.ceil_threshold, ): assert self._connector is not None conn = await self._connector.connect( req, traces=traces, timeout=real_timeout ) except asyncio.TimeoutError as exc: raise ServerTimeoutError( "Connection timeout " "to host {}".format(url) ) from exc assert conn.transport is not None assert conn.protocol is not None conn.protocol.set_response_params( timer=timer, skip_payload=method_must_be_empty_body(method), read_until_eof=read_until_eof, auto_decompress=auto_decompress, read_timeout=real_timeout.sock_read, read_bufsize=read_bufsize, timeout_ceil_threshold=self._connector._timeout_ceil_threshold, max_line_size=max_line_size, max_field_size=max_field_size, ) try: try: resp = await req.send(conn) try: await resp.start(conn) except BaseException: resp.close() raise except BaseException: conn.close() raise except ClientError: raise except OSError as exc: if exc.errno is None and isinstance(exc, asyncio.TimeoutError): raise raise ClientOSError(*exc.args) from exc self._cookie_jar.update_cookies(resp.cookies, resp.url) # redirects if resp.status in (301, 302, 303, 307, 308) and allow_redirects: for trace in traces: await trace.send_request_redirect( method, url.update_query(params), headers, resp ) redirects += 1 history.append(resp) if max_redirects and redirects >= max_redirects: resp.close() raise TooManyRedirects( history[0].request_info, tuple(history) ) # For 301 and 302, mimic IE, now changed in RFC # https://github.com/kennethreitz/requests/pull/269 if (resp.status == 303 and resp.method != hdrs.METH_HEAD) or ( resp.status in (301, 302) and resp.method == hdrs.METH_POST ): method = hdrs.METH_GET data = None if headers.get(hdrs.CONTENT_LENGTH): headers.pop(hdrs.CONTENT_LENGTH) r_url = resp.headers.get(hdrs.LOCATION) or resp.headers.get( hdrs.URI ) if r_url is None: # see github.com/aio-libs/aiohttp/issues/2022 break else: # reading from correct redirection # response is forbidden resp.release() try: parsed_url = URL( r_url, encoded=not self._requote_redirect_url ) except ValueError as e: raise InvalidURL(r_url) from e scheme = parsed_url.scheme if scheme not in ("http", "https", ""): resp.close() raise ValueError("Can redirect only to http or https") elif not scheme: parsed_url = url.join(parsed_url) if url.origin() != parsed_url.origin(): auth = None headers.pop(hdrs.AUTHORIZATION, None) url = parsed_url params = {} resp.release() continue break # check response status if raise_for_status is None: raise_for_status = self._raise_for_status if raise_for_status is None: pass elif callable(raise_for_status): await raise_for_status(resp) elif raise_for_status: resp.raise_for_status() # register connection if handle is not None: if resp.connection is not None: resp.connection.add_callback(handle.cancel) else: handle.cancel() resp._history = tuple(history) for trace in traces: await trace.send_request_end( method, url.update_query(params), headers, resp ) return resp except BaseException as e: # cleanup timer tm.close() if handle: handle.cancel() handle = None for trace in traces: await trace.send_request_exception( method, url.update_query(params), headers, e ) raise def ws_connect( self, url: StrOrURL, *, method: str = hdrs.METH_GET, protocols: Iterable[str] = (), timeout: float = 10.0, receive_timeout: Optional[float] = None, autoclose: bool = True, autoping: bool = True, heartbeat: Optional[float] = None, auth: Optional[BasicAuth] = None, origin: Optional[str] = None, params: Optional[Mapping[str, str]] = None, headers: Optional[LooseHeaders] = None, proxy: Optional[StrOrURL] = None, proxy_auth: Optional[BasicAuth] = None, ssl: Union[SSLContext, bool, None, Fingerprint] = True, verify_ssl: Optional[bool] = None, fingerprint: Optional[bytes] = None, ssl_context: Optional[SSLContext] = None, proxy_headers: Optional[LooseHeaders] = None, compress: int = 0, max_msg_size: int = 4 * 1024 * 1024, ) -> "_WSRequestContextManager": """Initiate websocket connection.""" return _WSRequestContextManager( self._ws_connect( url, method=method, protocols=protocols, timeout=timeout, receive_timeout=receive_timeout, autoclose=autoclose, autoping=autoping, heartbeat=heartbeat, auth=auth, origin=origin, params=params, headers=headers, proxy=proxy, proxy_auth=proxy_auth, ssl=ssl, verify_ssl=verify_ssl, fingerprint=fingerprint, ssl_context=ssl_context, proxy_headers=proxy_headers, compress=compress, max_msg_size=max_msg_size, ) ) async def _ws_connect( self, url: StrOrURL, *, method: str = hdrs.METH_GET, protocols: Iterable[str] = (), timeout: float = 10.0, receive_timeout: Optional[float] = None, autoclose: bool = True, autoping: bool = True, heartbeat: Optional[float] = None, auth: Optional[BasicAuth] = None, origin: Optional[str] = None, params: Optional[Mapping[str, str]] = None, headers: Optional[LooseHeaders] = None, proxy: Optional[StrOrURL] = None, proxy_auth: Optional[BasicAuth] = None, ssl: Optional[Union[SSLContext, bool, Fingerprint]] = True, verify_ssl: Optional[bool] = None, fingerprint: Optional[bytes] = None, ssl_context: Optional[SSLContext] = None, proxy_headers: Optional[LooseHeaders] = None, compress: int = 0, max_msg_size: int = 4 * 1024 * 1024, ) -> ClientWebSocketResponse: if headers is None: real_headers: CIMultiDict[str] = CIMultiDict() else: real_headers = CIMultiDict(headers) default_headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "Upgrade", hdrs.SEC_WEBSOCKET_VERSION: "13", } for key, value in default_headers.items(): real_headers.setdefault(key, value) sec_key = base64.b64encode(os.urandom(16)) real_headers[hdrs.SEC_WEBSOCKET_KEY] = sec_key.decode() if protocols: real_headers[hdrs.SEC_WEBSOCKET_PROTOCOL] = ",".join(protocols) if origin is not None: real_headers[hdrs.ORIGIN] = origin if compress: extstr = ws_ext_gen(compress=compress) real_headers[hdrs.SEC_WEBSOCKET_EXTENSIONS] = extstr # For the sake of backward compatibility, if user passes in None, convert it to True if ssl is None: ssl = True ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) # send request resp = await self.request( method, url, params=params, headers=real_headers, read_until_eof=False, auth=auth, proxy=proxy, proxy_auth=proxy_auth, ssl=ssl, proxy_headers=proxy_headers, ) try: # check handshake if resp.status != 101: raise WSServerHandshakeError( resp.request_info, resp.history, message="Invalid response status", status=resp.status, headers=resp.headers, ) if resp.headers.get(hdrs.UPGRADE, "").lower() != "websocket": raise WSServerHandshakeError( resp.request_info, resp.history, message="Invalid upgrade header", status=resp.status, headers=resp.headers, ) if resp.headers.get(hdrs.CONNECTION, "").lower() != "upgrade": raise WSServerHandshakeError( resp.request_info, resp.history, message="Invalid connection header", status=resp.status, headers=resp.headers, ) # key calculation r_key = resp.headers.get(hdrs.SEC_WEBSOCKET_ACCEPT, "") match = base64.b64encode(hashlib.sha1(sec_key + WS_KEY).digest()).decode() if r_key != match: raise WSServerHandshakeError( resp.request_info, resp.history, message="Invalid challenge response", status=resp.status, headers=resp.headers, ) # websocket protocol protocol = None if protocols and hdrs.SEC_WEBSOCKET_PROTOCOL in resp.headers: resp_protocols = [ proto.strip() for proto in resp.headers[hdrs.SEC_WEBSOCKET_PROTOCOL].split(",") ] for proto in resp_protocols: if proto in protocols: protocol = proto break # websocket compress notakeover = False if compress: compress_hdrs = resp.headers.get(hdrs.SEC_WEBSOCKET_EXTENSIONS) if compress_hdrs: try: compress, notakeover = ws_ext_parse(compress_hdrs) except WSHandshakeError as exc: raise WSServerHandshakeError( resp.request_info, resp.history, message=exc.args[0], status=resp.status, headers=resp.headers, ) from exc else: compress = 0 notakeover = False conn = resp.connection assert conn is not None conn_proto = conn.protocol assert conn_proto is not None transport = conn.transport assert transport is not None reader: FlowControlDataQueue[WSMessage] = FlowControlDataQueue( conn_proto, 2**16, loop=self._loop ) conn_proto.set_parser(WebSocketReader(reader, max_msg_size), reader) writer = WebSocketWriter( conn_proto, transport, use_mask=True, compress=compress, notakeover=notakeover, ) except BaseException: resp.close() raise else: return self._ws_response_class( reader, writer, protocol, resp, timeout, autoclose, autoping, self._loop, receive_timeout=receive_timeout, heartbeat=heartbeat, compress=compress, client_notakeover=notakeover, ) def _prepare_headers(self, headers: Optional[LooseHeaders]) -> "CIMultiDict[str]": """Add default headers and transform it to CIMultiDict""" # Convert headers to MultiDict result = CIMultiDict(self._default_headers) if headers: if not isinstance(headers, (MultiDictProxy, MultiDict)): headers = CIMultiDict(headers) added_names: Set[str] = set() for key, value in headers.items(): if key in added_names: result.add(key, value) else: result[key] = value added_names.add(key) return result def get( self, url: StrOrURL, *, allow_redirects: bool = True, **kwargs: Any ) -> "_RequestContextManager": """Perform HTTP GET request.""" return _RequestContextManager( self._request(hdrs.METH_GET, url, allow_redirects=allow_redirects, **kwargs) ) def options( self, url: StrOrURL, *, allow_redirects: bool = True, **kwargs: Any ) -> "_RequestContextManager": """Perform HTTP OPTIONS request.""" return _RequestContextManager( self._request( hdrs.METH_OPTIONS, url, allow_redirects=allow_redirects, **kwargs ) ) def head( self, url: StrOrURL, *, allow_redirects: bool = False, **kwargs: Any ) -> "_RequestContextManager": """Perform HTTP HEAD request.""" return _RequestContextManager( self._request( hdrs.METH_HEAD, url, allow_redirects=allow_redirects, **kwargs ) ) def post( self, url: StrOrURL, *, data: Any = None, **kwargs: Any ) -> "_RequestContextManager": """Perform HTTP POST request.""" return _RequestContextManager( self._request(hdrs.METH_POST, url, data=data, **kwargs) ) def put( self, url: StrOrURL, *, data: Any = None, **kwargs: Any ) -> "_RequestContextManager": """Perform HTTP PUT request.""" return _RequestContextManager( self._request(hdrs.METH_PUT, url, data=data, **kwargs) ) def patch( self, url: StrOrURL, *, data: Any = None, **kwargs: Any ) -> "_RequestContextManager": """Perform HTTP PATCH request.""" return _RequestContextManager( self._request(hdrs.METH_PATCH, url, data=data, **kwargs) ) def delete(self, url: StrOrURL, **kwargs: Any) -> "_RequestContextManager": """Perform HTTP DELETE request.""" return _RequestContextManager(self._request(hdrs.METH_DELETE, url, **kwargs)) async def close(self) -> None: """Close underlying connector. Release all acquired resources. """ if not self.closed: if self._connector is not None and self._connector_owner: await self._connector.close() self._connector = None @property def closed(self) -> bool: """Is client session closed. A readonly property. """ return self._connector is None or self._connector.closed @property def connector(self) -> Optional[BaseConnector]: """Connector instance used for the session.""" return self._connector @property def cookie_jar(self) -> AbstractCookieJar: """The session cookies.""" return self._cookie_jar @property def version(self) -> Tuple[int, int]: """The session HTTP protocol version.""" return self._version @property def requote_redirect_url(self) -> bool: """Do URL requoting on redirection handling.""" return self._requote_redirect_url @requote_redirect_url.setter def requote_redirect_url(self, val: bool) -> None: """Do URL requoting on redirection handling.""" warnings.warn( "session.requote_redirect_url modification " "is deprecated #2778", DeprecationWarning, stacklevel=2, ) self._requote_redirect_url = val @property def loop(self) -> asyncio.AbstractEventLoop: """Session's loop.""" warnings.warn( "client.loop property is deprecated", DeprecationWarning, stacklevel=2 ) return self._loop @property def timeout(self) -> ClientTimeout: """Timeout for the session.""" return self._timeout @property def headers(self) -> "CIMultiDict[str]": """The default headers of the client session.""" return self._default_headers @property def skip_auto_headers(self) -> FrozenSet[istr]: """Headers for which autogeneration should be skipped""" return self._skip_auto_headers @property def auth(self) -> Optional[BasicAuth]: """An object that represents HTTP Basic Authorization""" return self._default_auth @property def json_serialize(self) -> JSONEncoder: """Json serializer callable""" return self._json_serialize @property def connector_owner(self) -> bool: """Should connector be closed on session closing""" return self._connector_owner @property def raise_for_status( self, ) -> Union[bool, Callable[[ClientResponse], Awaitable[None]]]: """Should `ClientResponse.raise_for_status()` be called for each response.""" return self._raise_for_status @property def auto_decompress(self) -> bool: """Should the body response be automatically decompressed.""" return self._auto_decompress @property def trust_env(self) -> bool: """ Should proxies information from environment or netrc be trusted. Information is from HTTP_PROXY / HTTPS_PROXY environment variables or ~/.netrc file if present. """ return self._trust_env @property def trace_configs(self) -> List[TraceConfig]: """A list of TraceConfig instances used for client tracing""" return self._trace_configs def detach(self) -> None: """Detach connector from session without closing the former. Session is switched to closed state anyway. """ self._connector = None def __enter__(self) -> None: raise TypeError("Use async with instead") def __exit__( self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType], ) -> None: # __exit__ should exist in pair with __enter__ but never executed pass # pragma: no cover async def __aenter__(self) -> "ClientSession": return self async def __aexit__( self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType], ) -> None: await self.close() class _BaseRequestContextManager(Coroutine[Any, Any, _RetType], Generic[_RetType]): __slots__ = ("_coro", "_resp") def __init__(self, coro: Coroutine["asyncio.Future[Any]", None, _RetType]) -> None: self._coro = coro def send(self, arg: None) -> "asyncio.Future[Any]": return self._coro.send(arg) def throw(self, *args: Any, **kwargs: Any) -> "asyncio.Future[Any]": return self._coro.throw(*args, **kwargs) def close(self) -> None: return self._coro.close() def __await__(self) -> Generator[Any, None, _RetType]: ret = self._coro.__await__() return ret def __iter__(self) -> Generator[Any, None, _RetType]: return self.__await__() async def __aenter__(self) -> _RetType: self._resp = await self._coro return self._resp class _RequestContextManager(_BaseRequestContextManager[ClientResponse]): __slots__ = () async def __aexit__( self, exc_type: Optional[Type[BaseException]], exc: Optional[BaseException], tb: Optional[TracebackType], ) -> None: # We're basing behavior on the exception as it can be caused by # user code unrelated to the status of the connection. If you # would like to close a connection you must do that # explicitly. Otherwise connection error handling should kick in # and close/recycle the connection as required. self._resp.release() await self._resp.wait_for_close() class _WSRequestContextManager(_BaseRequestContextManager[ClientWebSocketResponse]): __slots__ = () async def __aexit__( self, exc_type: Optional[Type[BaseException]], exc: Optional[BaseException], tb: Optional[TracebackType], ) -> None: await self._resp.close() class _SessionRequestContextManager: __slots__ = ("_coro", "_resp", "_session") def __init__( self, coro: Coroutine["asyncio.Future[Any]", None, ClientResponse], session: ClientSession, ) -> None: self._coro = coro self._resp: Optional[ClientResponse] = None self._session = session async def __aenter__(self) -> ClientResponse: try: self._resp = await self._coro except BaseException: await self._session.close() raise else: return self._resp async def __aexit__( self, exc_type: Optional[Type[BaseException]], exc: Optional[BaseException], tb: Optional[TracebackType], ) -> None: assert self._resp is not None self._resp.close() await self._session.close() def request( method: str, url: StrOrURL, *, params: Optional[Mapping[str, str]] = None, data: Any = None, json: Any = None, headers: Optional[LooseHeaders] = None, skip_auto_headers: Optional[Iterable[str]] = None, auth: Optional[BasicAuth] = None, allow_redirects: bool = True, max_redirects: int = 10, compress: Optional[str] = None, chunked: Optional[bool] = None, expect100: bool = False, raise_for_status: Optional[bool] = None, read_until_eof: bool = True, proxy: Optional[StrOrURL] = None, proxy_auth: Optional[BasicAuth] = None, timeout: Union[ClientTimeout, object] = sentinel, cookies: Optional[LooseCookies] = None, version: HttpVersion = http.HttpVersion11, connector: Optional[BaseConnector] = None, read_bufsize: Optional[int] = None, loop: Optional[asyncio.AbstractEventLoop] = None, max_line_size: int = 8190, max_field_size: int = 8190, ) -> _SessionRequestContextManager: """Constructs and sends a request. Returns response object. method - HTTP method url - request url params - (optional) Dictionary or bytes to be sent in the query string of the new request data - (optional) Dictionary, bytes, or file-like object to send in the body of the request json - (optional) Any json compatible python object headers - (optional) Dictionary of HTTP Headers to send with the request cookies - (optional) Dict object to send with the request auth - (optional) BasicAuth named tuple represent HTTP Basic Auth auth - aiohttp.helpers.BasicAuth allow_redirects - (optional) If set to False, do not follow redirects version - Request HTTP version. compress - Set to True if request has to be compressed with deflate encoding. chunked - Set to chunk size for chunked transfer encoding. expect100 - Expect 100-continue response from server. connector - BaseConnector sub-class instance to support connection pooling. read_until_eof - Read response until eof if response does not have Content-Length header. loop - Optional event loop. timeout - Optional ClientTimeout settings structure, 5min total timeout by default. Usage:: >>> import aiohttp >>> resp = await aiohttp.request('GET', 'http://python.org/') >>> resp >>> data = await resp.read() """ connector_owner = False if connector is None: connector_owner = True connector = TCPConnector(loop=loop, force_close=True) session = ClientSession( loop=loop, cookies=cookies, version=version, timeout=timeout, connector=connector, connector_owner=connector_owner, ) return _SessionRequestContextManager( session._request( method, url, params=params, data=data, json=json, headers=headers, skip_auto_headers=skip_auto_headers, auth=auth, allow_redirects=allow_redirects, max_redirects=max_redirects, compress=compress, chunked=chunked, expect100=expect100, raise_for_status=raise_for_status, read_until_eof=read_until_eof, proxy=proxy, proxy_auth=proxy_auth, read_bufsize=read_bufsize, max_line_size=max_line_size, max_field_size=max_field_size, ), session, ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/client_exceptions.py0000644000175100001770000002230314607525266020363 0ustar00runnerdocker"""HTTP related errors.""" import asyncio import warnings from typing import TYPE_CHECKING, Any, Optional, Tuple, Union from .http_parser import RawResponseMessage from .typedefs import LooseHeaders try: import ssl SSLContext = ssl.SSLContext except ImportError: # pragma: no cover ssl = SSLContext = None # type: ignore[assignment] if TYPE_CHECKING: from .client_reqrep import ClientResponse, ConnectionKey, Fingerprint, RequestInfo else: RequestInfo = ClientResponse = ConnectionKey = None __all__ = ( "ClientError", "ClientConnectionError", "ClientOSError", "ClientConnectorError", "ClientProxyConnectionError", "ClientSSLError", "ClientConnectorSSLError", "ClientConnectorCertificateError", "ServerConnectionError", "ServerTimeoutError", "ServerDisconnectedError", "ServerFingerprintMismatch", "ClientResponseError", "ClientHttpProxyError", "WSServerHandshakeError", "ContentTypeError", "ClientPayloadError", "InvalidURL", ) class ClientError(Exception): """Base class for client connection errors.""" class ClientResponseError(ClientError): """Base class for exceptions that occur after getting a response. request_info: An instance of RequestInfo. history: A sequence of responses, if redirects occurred. status: HTTP status code. message: Error message. headers: Response headers. """ def __init__( self, request_info: RequestInfo, history: Tuple[ClientResponse, ...], *, code: Optional[int] = None, status: Optional[int] = None, message: str = "", headers: Optional[LooseHeaders] = None, ) -> None: self.request_info = request_info if code is not None: if status is not None: raise ValueError( "Both code and status arguments are provided; " "code is deprecated, use status instead" ) warnings.warn( "code argument is deprecated, use status instead", DeprecationWarning, stacklevel=2, ) if status is not None: self.status = status elif code is not None: self.status = code else: self.status = 0 self.message = message self.headers = headers self.history = history self.args = (request_info, history) def __str__(self) -> str: return "{}, message={!r}, url={!r}".format( self.status, self.message, self.request_info.real_url, ) def __repr__(self) -> str: args = f"{self.request_info!r}, {self.history!r}" if self.status != 0: args += f", status={self.status!r}" if self.message != "": args += f", message={self.message!r}" if self.headers is not None: args += f", headers={self.headers!r}" return f"{type(self).__name__}({args})" @property def code(self) -> int: warnings.warn( "code property is deprecated, use status instead", DeprecationWarning, stacklevel=2, ) return self.status @code.setter def code(self, value: int) -> None: warnings.warn( "code property is deprecated, use status instead", DeprecationWarning, stacklevel=2, ) self.status = value class ContentTypeError(ClientResponseError): """ContentType found is not valid.""" class WSServerHandshakeError(ClientResponseError): """websocket server handshake error.""" class ClientHttpProxyError(ClientResponseError): """HTTP proxy error. Raised in :class:`aiohttp.connector.TCPConnector` if proxy responds with status other than ``200 OK`` on ``CONNECT`` request. """ class TooManyRedirects(ClientResponseError): """Client was redirected too many times.""" class ClientConnectionError(ClientError): """Base class for client socket errors.""" class ClientOSError(ClientConnectionError, OSError): """OSError error.""" class ClientConnectorError(ClientOSError): """Client connector error. Raised in :class:`aiohttp.connector.TCPConnector` if a connection can not be established. """ def __init__(self, connection_key: ConnectionKey, os_error: OSError) -> None: self._conn_key = connection_key self._os_error = os_error super().__init__(os_error.errno, os_error.strerror) self.args = (connection_key, os_error) @property def os_error(self) -> OSError: return self._os_error @property def host(self) -> str: return self._conn_key.host @property def port(self) -> Optional[int]: return self._conn_key.port @property def ssl(self) -> Union[SSLContext, bool, "Fingerprint"]: return self._conn_key.ssl def __str__(self) -> str: return "Cannot connect to host {0.host}:{0.port} ssl:{1} [{2}]".format( self, "default" if self.ssl is True else self.ssl, self.strerror ) # OSError.__reduce__ does too much black magick __reduce__ = BaseException.__reduce__ class ClientProxyConnectionError(ClientConnectorError): """Proxy connection error. Raised in :class:`aiohttp.connector.TCPConnector` if connection to proxy can not be established. """ class UnixClientConnectorError(ClientConnectorError): """Unix connector error. Raised in :py:class:`aiohttp.connector.UnixConnector` if connection to unix socket can not be established. """ def __init__( self, path: str, connection_key: ConnectionKey, os_error: OSError ) -> None: self._path = path super().__init__(connection_key, os_error) @property def path(self) -> str: return self._path def __str__(self) -> str: return "Cannot connect to unix socket {0.path} ssl:{1} [{2}]".format( self, "default" if self.ssl is True else self.ssl, self.strerror ) class ServerConnectionError(ClientConnectionError): """Server connection errors.""" class ServerDisconnectedError(ServerConnectionError): """Server disconnected.""" def __init__(self, message: Union[RawResponseMessage, str, None] = None) -> None: if message is None: message = "Server disconnected" self.args = (message,) self.message = message class ServerTimeoutError(ServerConnectionError, asyncio.TimeoutError): """Server timeout error.""" class ServerFingerprintMismatch(ServerConnectionError): """SSL certificate does not match expected fingerprint.""" def __init__(self, expected: bytes, got: bytes, host: str, port: int) -> None: self.expected = expected self.got = got self.host = host self.port = port self.args = (expected, got, host, port) def __repr__(self) -> str: return "<{} expected={!r} got={!r} host={!r} port={!r}>".format( self.__class__.__name__, self.expected, self.got, self.host, self.port ) class ClientPayloadError(ClientError): """Response payload error.""" class InvalidURL(ClientError, ValueError): """Invalid URL. URL used for fetching is malformed, e.g. it doesn't contains host part. """ # Derive from ValueError for backward compatibility def __init__(self, url: Any) -> None: # The type of url is not yarl.URL because the exception can be raised # on URL(url) call super().__init__(url) @property def url(self) -> Any: return self.args[0] def __repr__(self) -> str: return f"<{self.__class__.__name__} {self.url}>" class ClientSSLError(ClientConnectorError): """Base error for ssl.*Errors.""" if ssl is not None: cert_errors = (ssl.CertificateError,) cert_errors_bases = ( ClientSSLError, ssl.CertificateError, ) ssl_errors = (ssl.SSLError,) ssl_error_bases = (ClientSSLError, ssl.SSLError) else: # pragma: no cover cert_errors = tuple() cert_errors_bases = ( ClientSSLError, ValueError, ) ssl_errors = tuple() ssl_error_bases = (ClientSSLError,) class ClientConnectorSSLError(*ssl_error_bases): # type: ignore[misc] """Response ssl error.""" class ClientConnectorCertificateError(*cert_errors_bases): # type: ignore[misc] """Response certificate error.""" def __init__( self, connection_key: ConnectionKey, certificate_error: Exception ) -> None: self._conn_key = connection_key self._certificate_error = certificate_error self.args = (connection_key, certificate_error) @property def certificate_error(self) -> Exception: return self._certificate_error @property def host(self) -> str: return self._conn_key.host @property def port(self) -> Optional[int]: return self._conn_key.port @property def ssl(self) -> bool: return self._conn_key.is_ssl def __str__(self) -> str: return ( "Cannot connect to host {0.host}:{0.port} ssl:{0.ssl} " "[{0.certificate_error.__class__.__name__}: " "{0.certificate_error.args}]".format(self) ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/client_proto.py0000644000175100001770000002326614607525266017356 0ustar00runnerdockerimport asyncio from contextlib import suppress from typing import Any, Optional, Tuple from .base_protocol import BaseProtocol from .client_exceptions import ( ClientOSError, ClientPayloadError, ServerDisconnectedError, ServerTimeoutError, ) from .helpers import ( _EXC_SENTINEL, BaseTimerContext, set_exception, status_code_must_be_empty_body, ) from .http import HttpResponseParser, RawResponseMessage from .http_exceptions import HttpProcessingError from .streams import EMPTY_PAYLOAD, DataQueue, StreamReader class ResponseHandler(BaseProtocol, DataQueue[Tuple[RawResponseMessage, StreamReader]]): """Helper class to adapt between Protocol and StreamReader.""" def __init__(self, loop: asyncio.AbstractEventLoop) -> None: BaseProtocol.__init__(self, loop=loop) DataQueue.__init__(self, loop) self._should_close = False self._payload: Optional[StreamReader] = None self._skip_payload = False self._payload_parser = None self._timer = None self._tail = b"" self._upgraded = False self._parser: Optional[HttpResponseParser] = None self._read_timeout: Optional[float] = None self._read_timeout_handle: Optional[asyncio.TimerHandle] = None self._timeout_ceil_threshold: Optional[float] = 5 @property def upgraded(self) -> bool: return self._upgraded @property def should_close(self) -> bool: if self._payload is not None and not self._payload.is_eof() or self._upgraded: return True return ( self._should_close or self._upgraded or self.exception() is not None or self._payload_parser is not None or len(self) > 0 or bool(self._tail) ) def force_close(self) -> None: self._should_close = True def close(self) -> None: transport = self.transport if transport is not None: transport.close() self.transport = None self._payload = None self._drop_timeout() def is_connected(self) -> bool: return self.transport is not None and not self.transport.is_closing() def connection_lost(self, exc: Optional[BaseException]) -> None: self._drop_timeout() original_connection_error = exc reraised_exc = original_connection_error connection_closed_cleanly = original_connection_error is None if self._payload_parser is not None: with suppress(Exception): # FIXME: log this somehow? self._payload_parser.feed_eof() uncompleted = None if self._parser is not None: try: uncompleted = self._parser.feed_eof() except Exception as underlying_exc: if self._payload is not None: client_payload_exc_msg = ( f"Response payload is not completed: {underlying_exc !r}" ) if not connection_closed_cleanly: client_payload_exc_msg = ( f"{client_payload_exc_msg !s}. " f"{original_connection_error !r}" ) set_exception( self._payload, ClientPayloadError(client_payload_exc_msg), underlying_exc, ) if not self.is_eof(): if isinstance(original_connection_error, OSError): reraised_exc = ClientOSError(*original_connection_error.args) if connection_closed_cleanly: reraised_exc = ServerDisconnectedError(uncompleted) # assigns self._should_close to True as side effect, # we do it anyway below underlying_non_eof_exc = ( _EXC_SENTINEL if connection_closed_cleanly else original_connection_error ) assert underlying_non_eof_exc is not None assert reraised_exc is not None self.set_exception(reraised_exc, underlying_non_eof_exc) self._should_close = True self._parser = None self._payload = None self._payload_parser = None self._reading_paused = False super().connection_lost(reraised_exc) def eof_received(self) -> None: # should call parser.feed_eof() most likely self._drop_timeout() def pause_reading(self) -> None: super().pause_reading() self._drop_timeout() def resume_reading(self) -> None: super().resume_reading() self._reschedule_timeout() def set_exception( self, exc: BaseException, exc_cause: BaseException = _EXC_SENTINEL, ) -> None: self._should_close = True self._drop_timeout() super().set_exception(exc, exc_cause) def set_parser(self, parser: Any, payload: Any) -> None: # TODO: actual types are: # parser: WebSocketReader # payload: FlowControlDataQueue # but they are not generi enough # Need an ABC for both types self._payload = payload self._payload_parser = parser self._drop_timeout() if self._tail: data, self._tail = self._tail, b"" self.data_received(data) def set_response_params( self, *, timer: Optional[BaseTimerContext] = None, skip_payload: bool = False, read_until_eof: bool = False, auto_decompress: bool = True, read_timeout: Optional[float] = None, read_bufsize: int = 2**16, timeout_ceil_threshold: float = 5, max_line_size: int = 8190, max_field_size: int = 8190, ) -> None: self._skip_payload = skip_payload self._read_timeout = read_timeout self._timeout_ceil_threshold = timeout_ceil_threshold self._parser = HttpResponseParser( self, self._loop, read_bufsize, timer=timer, payload_exception=ClientPayloadError, response_with_body=not skip_payload, read_until_eof=read_until_eof, auto_decompress=auto_decompress, max_line_size=max_line_size, max_field_size=max_field_size, ) if self._tail: data, self._tail = self._tail, b"" self.data_received(data) def _drop_timeout(self) -> None: if self._read_timeout_handle is not None: self._read_timeout_handle.cancel() self._read_timeout_handle = None def _reschedule_timeout(self) -> None: timeout = self._read_timeout if self._read_timeout_handle is not None: self._read_timeout_handle.cancel() if timeout: self._read_timeout_handle = self._loop.call_later( timeout, self._on_read_timeout ) else: self._read_timeout_handle = None def start_timeout(self) -> None: self._reschedule_timeout() def _on_read_timeout(self) -> None: exc = ServerTimeoutError("Timeout on reading data from socket") self.set_exception(exc) if self._payload is not None: set_exception(self._payload, exc) def data_received(self, data: bytes) -> None: self._reschedule_timeout() if not data: return # custom payload parser if self._payload_parser is not None: eof, tail = self._payload_parser.feed_data(data) if eof: self._payload = None self._payload_parser = None if tail: self.data_received(tail) return else: if self._upgraded or self._parser is None: # i.e. websocket connection, websocket parser is not set yet self._tail += data else: # parse http messages try: messages, upgraded, tail = self._parser.feed_data(data) except BaseException as underlying_exc: if self.transport is not None: # connection.release() could be called BEFORE # data_received(), the transport is already # closed in this case self.transport.close() # should_close is True after the call self.set_exception(HttpProcessingError(), underlying_exc) return self._upgraded = upgraded payload: Optional[StreamReader] = None for message, payload in messages: if message.should_close: self._should_close = True self._payload = payload if self._skip_payload or status_code_must_be_empty_body( message.code ): self.feed_data((message, EMPTY_PAYLOAD), 0) else: self.feed_data((message, payload), 0) if payload is not None: # new message(s) was processed # register timeout handler unsubscribing # either on end-of-stream or immediately for # EMPTY_PAYLOAD if payload is not EMPTY_PAYLOAD: payload.on_eof(self._drop_timeout) else: self._drop_timeout() if tail: if upgraded: self.data_received(tail) else: self._tail = tail ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/client_reqrep.py0000644000175100001770000011621314607525266017504 0ustar00runnerdockerimport asyncio import codecs import contextlib import functools import io import re import sys import traceback import warnings from hashlib import md5, sha1, sha256 from http.cookies import CookieError, Morsel, SimpleCookie from types import MappingProxyType, TracebackType from typing import ( TYPE_CHECKING, Any, Callable, Dict, Iterable, List, Mapping, Optional, Tuple, Type, Union, cast, ) import attr from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy from yarl import URL from . import hdrs, helpers, http, multipart, payload from .abc import AbstractStreamWriter from .client_exceptions import ( ClientConnectionError, ClientOSError, ClientResponseError, ContentTypeError, InvalidURL, ServerFingerprintMismatch, ) from .compression_utils import HAS_BROTLI from .formdata import FormData from .helpers import ( BaseTimerContext, BasicAuth, HeadersMixin, TimerNoop, basicauth_from_netrc, netrc_from_env, noop, reify, set_exception, set_result, ) from .http import ( SERVER_SOFTWARE, HttpVersion, HttpVersion10, HttpVersion11, StreamWriter, ) from .log import client_logger from .streams import StreamReader from .typedefs import ( DEFAULT_JSON_DECODER, JSONDecoder, LooseCookies, LooseHeaders, RawHeaders, ) try: import ssl from ssl import SSLContext except ImportError: # pragma: no cover ssl = None # type: ignore[assignment] SSLContext = object # type: ignore[misc,assignment] __all__ = ("ClientRequest", "ClientResponse", "RequestInfo", "Fingerprint") if TYPE_CHECKING: from .client import ClientSession from .connector import Connection from .tracing import Trace _CONTAINS_CONTROL_CHAR_RE = re.compile(r"[^-!#$%&'*+.^_`|~0-9a-zA-Z]") json_re = re.compile(r"^application/(?:[\w.+-]+?\+)?json") def _gen_default_accept_encoding() -> str: return "gzip, deflate, br" if HAS_BROTLI else "gzip, deflate" @attr.s(auto_attribs=True, frozen=True, slots=True) class ContentDisposition: type: Optional[str] parameters: "MappingProxyType[str, str]" filename: Optional[str] @attr.s(auto_attribs=True, frozen=True, slots=True) class RequestInfo: url: URL method: str headers: "CIMultiDictProxy[str]" real_url: URL = attr.ib() @real_url.default def real_url_default(self) -> URL: return self.url class Fingerprint: HASHFUNC_BY_DIGESTLEN = { 16: md5, 20: sha1, 32: sha256, } def __init__(self, fingerprint: bytes) -> None: digestlen = len(fingerprint) hashfunc = self.HASHFUNC_BY_DIGESTLEN.get(digestlen) if not hashfunc: raise ValueError("fingerprint has invalid length") elif hashfunc is md5 or hashfunc is sha1: raise ValueError( "md5 and sha1 are insecure and " "not supported. Use sha256." ) self._hashfunc = hashfunc self._fingerprint = fingerprint @property def fingerprint(self) -> bytes: return self._fingerprint def check(self, transport: asyncio.Transport) -> None: if not transport.get_extra_info("sslcontext"): return sslobj = transport.get_extra_info("ssl_object") cert = sslobj.getpeercert(binary_form=True) got = self._hashfunc(cert).digest() if got != self._fingerprint: host, port, *_ = transport.get_extra_info("peername") raise ServerFingerprintMismatch(self._fingerprint, got, host, port) if ssl is not None: SSL_ALLOWED_TYPES = (ssl.SSLContext, bool, Fingerprint, type(None)) else: # pragma: no cover SSL_ALLOWED_TYPES = (bool, type(None)) def _merge_ssl_params( ssl: Union["SSLContext", bool, Fingerprint], verify_ssl: Optional[bool], ssl_context: Optional["SSLContext"], fingerprint: Optional[bytes], ) -> Union["SSLContext", bool, Fingerprint]: if ssl is None: ssl = True # Double check for backwards compatibility if verify_ssl is not None and not verify_ssl: warnings.warn( "verify_ssl is deprecated, use ssl=False instead", DeprecationWarning, stacklevel=3, ) if ssl is not True: raise ValueError( "verify_ssl, ssl_context, fingerprint and ssl " "parameters are mutually exclusive" ) else: ssl = False if ssl_context is not None: warnings.warn( "ssl_context is deprecated, use ssl=context instead", DeprecationWarning, stacklevel=3, ) if ssl is not True: raise ValueError( "verify_ssl, ssl_context, fingerprint and ssl " "parameters are mutually exclusive" ) else: ssl = ssl_context if fingerprint is not None: warnings.warn( "fingerprint is deprecated, " "use ssl=Fingerprint(fingerprint) instead", DeprecationWarning, stacklevel=3, ) if ssl is not True: raise ValueError( "verify_ssl, ssl_context, fingerprint and ssl " "parameters are mutually exclusive" ) else: ssl = Fingerprint(fingerprint) if not isinstance(ssl, SSL_ALLOWED_TYPES): raise TypeError( "ssl should be SSLContext, bool, Fingerprint or None, " "got {!r} instead.".format(ssl) ) return ssl @attr.s(auto_attribs=True, slots=True, frozen=True) class ConnectionKey: # the key should contain an information about used proxy / TLS # to prevent reusing wrong connections from a pool host: str port: Optional[int] is_ssl: bool ssl: Union[SSLContext, bool, Fingerprint] proxy: Optional[URL] proxy_auth: Optional[BasicAuth] proxy_headers_hash: Optional[int] # hash(CIMultiDict) def _is_expected_content_type( response_content_type: str, expected_content_type: str ) -> bool: if expected_content_type == "application/json": return json_re.match(response_content_type) is not None return expected_content_type in response_content_type class ClientRequest: GET_METHODS = { hdrs.METH_GET, hdrs.METH_HEAD, hdrs.METH_OPTIONS, hdrs.METH_TRACE, } POST_METHODS = {hdrs.METH_PATCH, hdrs.METH_POST, hdrs.METH_PUT} ALL_METHODS = GET_METHODS.union(POST_METHODS).union({hdrs.METH_DELETE}) DEFAULT_HEADERS = { hdrs.ACCEPT: "*/*", hdrs.ACCEPT_ENCODING: _gen_default_accept_encoding(), } body = b"" auth = None response = None __writer = None # async task for streaming data _continue = None # waiter future for '100 Continue' response # N.B. # Adding __del__ method with self._writer closing doesn't make sense # because _writer is instance method, thus it keeps a reference to self. # Until writer has finished finalizer will not be called. def __init__( self, method: str, url: URL, *, params: Optional[Mapping[str, str]] = None, headers: Optional[LooseHeaders] = None, skip_auto_headers: Iterable[str] = frozenset(), data: Any = None, cookies: Optional[LooseCookies] = None, auth: Optional[BasicAuth] = None, version: http.HttpVersion = http.HttpVersion11, compress: Optional[str] = None, chunked: Optional[bool] = None, expect100: bool = False, loop: Optional[asyncio.AbstractEventLoop] = None, response_class: Optional[Type["ClientResponse"]] = None, proxy: Optional[URL] = None, proxy_auth: Optional[BasicAuth] = None, timer: Optional[BaseTimerContext] = None, session: Optional["ClientSession"] = None, ssl: Union[SSLContext, bool, Fingerprint] = True, proxy_headers: Optional[LooseHeaders] = None, traces: Optional[List["Trace"]] = None, trust_env: bool = False, server_hostname: Optional[str] = None, ): if loop is None: loop = asyncio.get_event_loop() match = _CONTAINS_CONTROL_CHAR_RE.search(method) if match: raise ValueError( f"Method cannot contain non-token characters {method!r} " "(found at least {match.group()!r})" ) assert isinstance(url, URL), url assert isinstance(proxy, (URL, type(None))), proxy # FIXME: session is None in tests only, need to fix tests # assert session is not None self._session = cast("ClientSession", session) if params: q = MultiDict(url.query) url2 = url.with_query(params) q.extend(url2.query) url = url.with_query(q) self.original_url = url self.url = url.with_fragment(None) self.method = method.upper() self.chunked = chunked self.compress = compress self.loop = loop self.length = None if response_class is None: real_response_class = ClientResponse else: real_response_class = response_class self.response_class: Type[ClientResponse] = real_response_class self._timer = timer if timer is not None else TimerNoop() self._ssl = ssl if ssl is not None else True self.server_hostname = server_hostname if loop.get_debug(): self._source_traceback = traceback.extract_stack(sys._getframe(1)) self.update_version(version) self.update_host(url) self.update_headers(headers) self.update_auto_headers(skip_auto_headers) self.update_cookies(cookies) self.update_content_encoding(data) self.update_auth(auth, trust_env) self.update_proxy(proxy, proxy_auth, proxy_headers) self.update_body_from_data(data) if data is not None or self.method not in self.GET_METHODS: self.update_transfer_encoding() self.update_expect_continue(expect100) if traces is None: traces = [] self._traces = traces def __reset_writer(self, _: object = None) -> None: self.__writer = None @property def _writer(self) -> Optional["asyncio.Task[None]"]: return self.__writer @_writer.setter def _writer(self, writer: Optional["asyncio.Task[None]"]) -> None: if self.__writer is not None: self.__writer.remove_done_callback(self.__reset_writer) self.__writer = writer if writer is not None: writer.add_done_callback(self.__reset_writer) def is_ssl(self) -> bool: return self.url.scheme in ("https", "wss") @property def ssl(self) -> Union["SSLContext", bool, Fingerprint]: return self._ssl @property def connection_key(self) -> ConnectionKey: proxy_headers = self.proxy_headers if proxy_headers: h: Optional[int] = hash(tuple((k, v) for k, v in proxy_headers.items())) else: h = None return ConnectionKey( self.host, self.port, self.is_ssl(), self.ssl, self.proxy, self.proxy_auth, h, ) @property def host(self) -> str: ret = self.url.raw_host assert ret is not None return ret @property def port(self) -> Optional[int]: return self.url.port @property def request_info(self) -> RequestInfo: headers: CIMultiDictProxy[str] = CIMultiDictProxy(self.headers) return RequestInfo(self.url, self.method, headers, self.original_url) def update_host(self, url: URL) -> None: """Update destination host, port and connection type (ssl).""" # get host/port if not url.raw_host: raise InvalidURL(url) # basic auth info username, password = url.user, url.password if username: self.auth = helpers.BasicAuth(username, password or "") def update_version(self, version: Union[http.HttpVersion, str]) -> None: """Convert request version to two elements tuple. parser HTTP version '1.1' => (1, 1) """ if isinstance(version, str): v = [part.strip() for part in version.split(".", 1)] try: version = http.HttpVersion(int(v[0]), int(v[1])) except ValueError: raise ValueError( f"Can not parse http version number: {version}" ) from None self.version = version def update_headers(self, headers: Optional[LooseHeaders]) -> None: """Update request headers.""" self.headers: CIMultiDict[str] = CIMultiDict() # add host netloc = cast(str, self.url.raw_host) if helpers.is_ipv6_address(netloc): netloc = f"[{netloc}]" # See https://github.com/aio-libs/aiohttp/issues/3636. netloc = netloc.rstrip(".") if self.url.port is not None and not self.url.is_default_port(): netloc += ":" + str(self.url.port) self.headers[hdrs.HOST] = netloc if headers: if isinstance(headers, (dict, MultiDictProxy, MultiDict)): headers = headers.items() # type: ignore[assignment] for key, value in headers: # type: ignore[misc] # A special case for Host header if key.lower() == "host": self.headers[key] = value else: self.headers.add(key, value) def update_auto_headers(self, skip_auto_headers: Iterable[str]) -> None: self.skip_auto_headers = CIMultiDict( (hdr, None) for hdr in sorted(skip_auto_headers) ) used_headers = self.headers.copy() used_headers.extend(self.skip_auto_headers) # type: ignore[arg-type] for hdr, val in self.DEFAULT_HEADERS.items(): if hdr not in used_headers: self.headers.add(hdr, val) if hdrs.USER_AGENT not in used_headers: self.headers[hdrs.USER_AGENT] = SERVER_SOFTWARE def update_cookies(self, cookies: Optional[LooseCookies]) -> None: """Update request cookies header.""" if not cookies: return c = SimpleCookie() if hdrs.COOKIE in self.headers: c.load(self.headers.get(hdrs.COOKIE, "")) del self.headers[hdrs.COOKIE] if isinstance(cookies, Mapping): iter_cookies = cookies.items() else: iter_cookies = cookies # type: ignore[assignment] for name, value in iter_cookies: if isinstance(value, Morsel): # Preserve coded_value mrsl_val = value.get(value.key, Morsel()) mrsl_val.set(value.key, value.value, value.coded_value) c[name] = mrsl_val else: c[name] = value # type: ignore[assignment] self.headers[hdrs.COOKIE] = c.output(header="", sep=";").strip() def update_content_encoding(self, data: Any) -> None: """Set request content encoding.""" if data is None: return enc = self.headers.get(hdrs.CONTENT_ENCODING, "").lower() if enc: if self.compress: raise ValueError( "compress can not be set " "if Content-Encoding header is set" ) elif self.compress: if not isinstance(self.compress, str): self.compress = "deflate" self.headers[hdrs.CONTENT_ENCODING] = self.compress self.chunked = True # enable chunked, no need to deal with length def update_transfer_encoding(self) -> None: """Analyze transfer-encoding header.""" te = self.headers.get(hdrs.TRANSFER_ENCODING, "").lower() if "chunked" in te: if self.chunked: raise ValueError( "chunked can not be set " 'if "Transfer-Encoding: chunked" header is set' ) elif self.chunked: if hdrs.CONTENT_LENGTH in self.headers: raise ValueError( "chunked can not be set " "if Content-Length header is set" ) self.headers[hdrs.TRANSFER_ENCODING] = "chunked" else: if hdrs.CONTENT_LENGTH not in self.headers: self.headers[hdrs.CONTENT_LENGTH] = str(len(self.body)) def update_auth(self, auth: Optional[BasicAuth], trust_env: bool = False) -> None: """Set basic auth.""" if auth is None: auth = self.auth if auth is None and trust_env and self.url.host is not None: netrc_obj = netrc_from_env() with contextlib.suppress(LookupError): auth = basicauth_from_netrc(netrc_obj, self.url.host) if auth is None: return if not isinstance(auth, helpers.BasicAuth): raise TypeError("BasicAuth() tuple is required instead") self.headers[hdrs.AUTHORIZATION] = auth.encode() def update_body_from_data(self, body: Any) -> None: if body is None: return # FormData if isinstance(body, FormData): body = body() try: body = payload.PAYLOAD_REGISTRY.get(body, disposition=None) except payload.LookupError: body = FormData(body)() self.body = body # enable chunked encoding if needed if not self.chunked: if hdrs.CONTENT_LENGTH not in self.headers: size = body.size if size is None: self.chunked = True else: if hdrs.CONTENT_LENGTH not in self.headers: self.headers[hdrs.CONTENT_LENGTH] = str(size) # copy payload headers assert body.headers for (key, value) in body.headers.items(): if key in self.headers: continue if key in self.skip_auto_headers: continue self.headers[key] = value def update_expect_continue(self, expect: bool = False) -> None: if expect: self.headers[hdrs.EXPECT] = "100-continue" elif self.headers.get(hdrs.EXPECT, "").lower() == "100-continue": expect = True if expect: self._continue = self.loop.create_future() def update_proxy( self, proxy: Optional[URL], proxy_auth: Optional[BasicAuth], proxy_headers: Optional[LooseHeaders], ) -> None: if proxy_auth and not isinstance(proxy_auth, helpers.BasicAuth): raise ValueError("proxy_auth must be None or BasicAuth() tuple") self.proxy = proxy self.proxy_auth = proxy_auth self.proxy_headers = proxy_headers def keep_alive(self) -> bool: if self.version < HttpVersion10: # keep alive not supported at all return False if self.version == HttpVersion10: if self.headers.get(hdrs.CONNECTION) == "keep-alive": return True else: # no headers means we close for Http 1.0 return False elif self.headers.get(hdrs.CONNECTION) == "close": return False return True async def write_bytes( self, writer: AbstractStreamWriter, conn: "Connection" ) -> None: """Support coroutines that yields bytes objects.""" # 100 response if self._continue is not None: try: await writer.drain() await self._continue except asyncio.CancelledError: return protocol = conn.protocol assert protocol is not None try: if isinstance(self.body, payload.Payload): await self.body.write(writer) else: if isinstance(self.body, (bytes, bytearray)): self.body = (self.body,) # type: ignore[assignment] for chunk in self.body: await writer.write(chunk) # type: ignore[arg-type] except OSError as underlying_exc: reraised_exc = underlying_exc exc_is_not_timeout = underlying_exc.errno is not None or not isinstance( underlying_exc, asyncio.TimeoutError ) if exc_is_not_timeout: reraised_exc = ClientOSError( underlying_exc.errno, f"Can not write request body for {self.url !s}", ) set_exception(protocol, reraised_exc, underlying_exc) except asyncio.CancelledError: await writer.write_eof() except Exception as underlying_exc: set_exception( protocol, ClientConnectionError( f"Failed to send bytes into the underlying connection {conn !s}", ), underlying_exc, ) else: await writer.write_eof() protocol.start_timeout() async def send(self, conn: "Connection") -> "ClientResponse": # Specify request target: # - CONNECT request must send authority form URI # - not CONNECT proxy must send absolute form URI # - most common is origin form URI if self.method == hdrs.METH_CONNECT: connect_host = self.url.raw_host assert connect_host is not None if helpers.is_ipv6_address(connect_host): connect_host = f"[{connect_host}]" path = f"{connect_host}:{self.url.port}" elif self.proxy and not self.is_ssl(): path = str(self.url) else: path = self.url.raw_path if self.url.raw_query_string: path += "?" + self.url.raw_query_string protocol = conn.protocol assert protocol is not None writer = StreamWriter( protocol, self.loop, on_chunk_sent=functools.partial( self._on_chunk_request_sent, self.method, self.url ), on_headers_sent=functools.partial( self._on_headers_request_sent, self.method, self.url ), ) if self.compress: writer.enable_compression(self.compress) if self.chunked is not None: writer.enable_chunking() # set default content-type if ( self.method in self.POST_METHODS and hdrs.CONTENT_TYPE not in self.skip_auto_headers and hdrs.CONTENT_TYPE not in self.headers ): self.headers[hdrs.CONTENT_TYPE] = "application/octet-stream" # set the connection header connection = self.headers.get(hdrs.CONNECTION) if not connection: if self.keep_alive(): if self.version == HttpVersion10: connection = "keep-alive" else: if self.version == HttpVersion11: connection = "close" if connection is not None: self.headers[hdrs.CONNECTION] = connection # status + headers status_line = "{0} {1} HTTP/{v.major}.{v.minor}".format( self.method, path, v=self.version ) await writer.write_headers(status_line, self.headers) self._writer = self.loop.create_task(self.write_bytes(writer, conn)) response_class = self.response_class assert response_class is not None self.response = response_class( self.method, self.original_url, writer=self._writer, continue100=self._continue, timer=self._timer, request_info=self.request_info, traces=self._traces, loop=self.loop, session=self._session, ) return self.response async def close(self) -> None: if self._writer is not None: with contextlib.suppress(asyncio.CancelledError): await self._writer def terminate(self) -> None: if self._writer is not None: if not self.loop.is_closed(): self._writer.cancel() self._writer.remove_done_callback(self.__reset_writer) self._writer = None async def _on_chunk_request_sent(self, method: str, url: URL, chunk: bytes) -> None: for trace in self._traces: await trace.send_request_chunk_sent(method, url, chunk) async def _on_headers_request_sent( self, method: str, url: URL, headers: "CIMultiDict[str]" ) -> None: for trace in self._traces: await trace.send_request_headers(method, url, headers) class ClientResponse(HeadersMixin): # Some of these attributes are None when created, # but will be set by the start() method. # As the end user will likely never see the None values, we cheat the types below. # from the Status-Line of the response version: Optional[HttpVersion] = None # HTTP-Version status: int = None # type: ignore[assignment] # Status-Code reason: Optional[str] = None # Reason-Phrase content: StreamReader = None # type: ignore[assignment] # Payload stream _headers: CIMultiDictProxy[str] = None # type: ignore[assignment] _raw_headers: RawHeaders = None # type: ignore[assignment] _connection = None # current connection _source_traceback: Optional[traceback.StackSummary] = None # set up by ClientRequest after ClientResponse object creation # post-init stage allows to not change ctor signature _closed = True # to allow __del__ for non-initialized properly response _released = False __writer = None def __init__( self, method: str, url: URL, *, writer: "asyncio.Task[None]", continue100: Optional["asyncio.Future[bool]"], timer: BaseTimerContext, request_info: RequestInfo, traces: List["Trace"], loop: asyncio.AbstractEventLoop, session: "ClientSession", ) -> None: assert isinstance(url, URL) self.method = method self.cookies = SimpleCookie() self._real_url = url self._url = url.with_fragment(None) self._body: Any = None self._writer: Optional[asyncio.Task[None]] = writer self._continue = continue100 # None by default self._closed = True self._history: Tuple[ClientResponse, ...] = () self._request_info = request_info self._timer = timer if timer is not None else TimerNoop() self._cache: Dict[str, Any] = {} self._traces = traces self._loop = loop # store a reference to session #1985 self._session: Optional[ClientSession] = session # Save reference to _resolve_charset, so that get_encoding() will still # work after the response has finished reading the body. if session is None: # TODO: Fix session=None in tests (see ClientRequest.__init__). self._resolve_charset: Callable[ ["ClientResponse", bytes], str ] = lambda *_: "utf-8" else: self._resolve_charset = session._resolve_charset if loop.get_debug(): self._source_traceback = traceback.extract_stack(sys._getframe(1)) def __reset_writer(self, _: object = None) -> None: self.__writer = None @property def _writer(self) -> Optional["asyncio.Task[None]"]: return self.__writer @_writer.setter def _writer(self, writer: Optional["asyncio.Task[None]"]) -> None: if self.__writer is not None: self.__writer.remove_done_callback(self.__reset_writer) self.__writer = writer if writer is not None: writer.add_done_callback(self.__reset_writer) @reify def url(self) -> URL: return self._url @reify def url_obj(self) -> URL: warnings.warn("Deprecated, use .url #1654", DeprecationWarning, stacklevel=2) return self._url @reify def real_url(self) -> URL: return self._real_url @reify def host(self) -> str: assert self._url.host is not None return self._url.host @reify def headers(self) -> "CIMultiDictProxy[str]": return self._headers @reify def raw_headers(self) -> RawHeaders: return self._raw_headers @reify def request_info(self) -> RequestInfo: return self._request_info @reify def content_disposition(self) -> Optional[ContentDisposition]: raw = self._headers.get(hdrs.CONTENT_DISPOSITION) if raw is None: return None disposition_type, params_dct = multipart.parse_content_disposition(raw) params = MappingProxyType(params_dct) filename = multipart.content_disposition_filename(params) return ContentDisposition(disposition_type, params, filename) def __del__(self, _warnings: Any = warnings) -> None: if self._closed: return if self._connection is not None: self._connection.release() self._cleanup_writer() if self._loop.get_debug(): kwargs = {"source": self} _warnings.warn(f"Unclosed response {self!r}", ResourceWarning, **kwargs) context = {"client_response": self, "message": "Unclosed response"} if self._source_traceback: context["source_traceback"] = self._source_traceback self._loop.call_exception_handler(context) def __repr__(self) -> str: out = io.StringIO() ascii_encodable_url = str(self.url) if self.reason: ascii_encodable_reason = self.reason.encode( "ascii", "backslashreplace" ).decode("ascii") else: ascii_encodable_reason = "None" print( "".format( ascii_encodable_url, self.status, ascii_encodable_reason ), file=out, ) print(self.headers, file=out) return out.getvalue() @property def connection(self) -> Optional["Connection"]: return self._connection @reify def history(self) -> Tuple["ClientResponse", ...]: """A sequence of of responses, if redirects occurred.""" return self._history @reify def links(self) -> "MultiDictProxy[MultiDictProxy[Union[str, URL]]]": links_str = ", ".join(self.headers.getall("link", [])) if not links_str: return MultiDictProxy(MultiDict()) links: MultiDict[MultiDictProxy[Union[str, URL]]] = MultiDict() for val in re.split(r",(?=\s*<)", links_str): match = re.match(r"\s*<(.*)>(.*)", val) if match is None: # pragma: no cover # the check exists to suppress mypy error continue url, params_str = match.groups() params = params_str.split(";")[1:] link: MultiDict[Union[str, URL]] = MultiDict() for param in params: match = re.match(r"^\s*(\S*)\s*=\s*(['\"]?)(.*?)(\2)\s*$", param, re.M) if match is None: # pragma: no cover # the check exists to suppress mypy error continue key, _, value, _ = match.groups() link.add(key, value) key = link.get("rel", url) link.add("url", self.url.join(URL(url))) links.add(str(key), MultiDictProxy(link)) return MultiDictProxy(links) async def start(self, connection: "Connection") -> "ClientResponse": """Start response processing.""" self._closed = False self._protocol = connection.protocol self._connection = connection with self._timer: while True: # read response try: protocol = self._protocol message, payload = await protocol.read() # type: ignore[union-attr] except http.HttpProcessingError as exc: raise ClientResponseError( self.request_info, self.history, status=exc.code, message=exc.message, headers=exc.headers, ) from exc if message.code < 100 or message.code > 199 or message.code == 101: break if self._continue is not None: set_result(self._continue, True) self._continue = None # payload eof handler payload.on_eof(self._response_eof) # response status self.version = message.version self.status = message.code self.reason = message.reason # headers self._headers = message.headers # type is CIMultiDictProxy self._raw_headers = message.raw_headers # type is Tuple[bytes, bytes] # payload self.content = payload # cookies for hdr in self.headers.getall(hdrs.SET_COOKIE, ()): try: self.cookies.load(hdr) except CookieError as exc: client_logger.warning("Can not load response cookies: %s", exc) return self def _response_eof(self) -> None: if self._closed: return # protocol could be None because connection could be detached protocol = self._connection and self._connection.protocol if protocol is not None and protocol.upgraded: return self._closed = True self._cleanup_writer() self._release_connection() @property def closed(self) -> bool: return self._closed def close(self) -> None: if not self._released: self._notify_content() self._closed = True if self._loop is None or self._loop.is_closed(): return self._cleanup_writer() if self._connection is not None: self._connection.close() self._connection = None def release(self) -> Any: if not self._released: self._notify_content() self._closed = True self._cleanup_writer() self._release_connection() return noop() @property def ok(self) -> bool: """Returns ``True`` if ``status`` is less than ``400``, ``False`` if not. This is **not** a check for ``200 OK`` but a check that the response status is under 400. """ return 400 > self.status def raise_for_status(self) -> None: if not self.ok: # reason should always be not None for a started response assert self.reason is not None self.release() raise ClientResponseError( self.request_info, self.history, status=self.status, message=self.reason, headers=self.headers, ) def _release_connection(self) -> None: if self._connection is not None: if self._writer is None: self._connection.release() self._connection = None else: self._writer.add_done_callback(lambda f: self._release_connection()) async def _wait_released(self) -> None: if self._writer is not None: await self._writer self._release_connection() def _cleanup_writer(self) -> None: if self._writer is not None: self._writer.cancel() self._session = None def _notify_content(self) -> None: content = self.content if content and content.exception() is None: set_exception(content, ClientConnectionError("Connection closed")) self._released = True async def wait_for_close(self) -> None: if self._writer is not None: await self._writer self.release() async def read(self) -> bytes: """Read response payload.""" if self._body is None: try: self._body = await self.content.read() for trace in self._traces: await trace.send_response_chunk_received( self.method, self.url, self._body ) except BaseException: self.close() raise elif self._released: # Response explicitly released raise ClientConnectionError("Connection closed") protocol = self._connection and self._connection.protocol if protocol is None or not protocol.upgraded: await self._wait_released() # Underlying connection released return self._body # type: ignore[no-any-return] def get_encoding(self) -> str: ctype = self.headers.get(hdrs.CONTENT_TYPE, "").lower() mimetype = helpers.parse_mimetype(ctype) encoding = mimetype.parameters.get("charset") if encoding: with contextlib.suppress(LookupError): return codecs.lookup(encoding).name if mimetype.type == "application" and ( mimetype.subtype == "json" or mimetype.subtype == "rdap" ): # RFC 7159 states that the default encoding is UTF-8. # RFC 7483 defines application/rdap+json return "utf-8" if self._body is None: raise RuntimeError( "Cannot compute fallback encoding of a not yet read body" ) return self._resolve_charset(self, self._body) async def text(self, encoding: Optional[str] = None, errors: str = "strict") -> str: """Read response payload and decode.""" if self._body is None: await self.read() if encoding is None: encoding = self.get_encoding() return self._body.decode( # type: ignore[no-any-return,union-attr] encoding, errors=errors ) async def json( self, *, encoding: Optional[str] = None, loads: JSONDecoder = DEFAULT_JSON_DECODER, content_type: Optional[str] = "application/json", ) -> Any: """Read and decodes JSON response.""" if self._body is None: await self.read() if content_type: ctype = self.headers.get(hdrs.CONTENT_TYPE, "").lower() if not _is_expected_content_type(ctype, content_type): raise ContentTypeError( self.request_info, self.history, message=( "Attempt to decode JSON with " "unexpected mimetype: %s" % ctype ), headers=self.headers, ) stripped = self._body.strip() # type: ignore[union-attr] if not stripped: return None if encoding is None: encoding = self.get_encoding() return loads(stripped.decode(encoding)) async def __aenter__(self) -> "ClientResponse": return self async def __aexit__( self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType], ) -> None: # similar to _RequestContextManager, we do not need to check # for exceptions, response object can close connection # if state is broken self.release() await self.wait_for_close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/client_ws.py0000644000175100001770000002540214607525266016636 0ustar00runnerdocker"""WebSocket client for asyncio.""" import asyncio import sys from typing import Any, Optional, cast from .client_exceptions import ClientError from .client_reqrep import ClientResponse from .helpers import call_later, set_result from .http import ( WS_CLOSED_MESSAGE, WS_CLOSING_MESSAGE, WebSocketError, WSCloseCode, WSMessage, WSMsgType, ) from .http_websocket import WebSocketWriter # WSMessage from .streams import EofStream, FlowControlDataQueue from .typedefs import ( DEFAULT_JSON_DECODER, DEFAULT_JSON_ENCODER, JSONDecoder, JSONEncoder, ) if sys.version_info >= (3, 11): import asyncio as async_timeout else: import async_timeout class ClientWebSocketResponse: def __init__( self, reader: "FlowControlDataQueue[WSMessage]", writer: WebSocketWriter, protocol: Optional[str], response: ClientResponse, timeout: float, autoclose: bool, autoping: bool, loop: asyncio.AbstractEventLoop, *, receive_timeout: Optional[float] = None, heartbeat: Optional[float] = None, compress: int = 0, client_notakeover: bool = False, ) -> None: self._response = response self._conn = response.connection self._writer = writer self._reader = reader self._protocol = protocol self._closed = False self._closing = False self._close_code: Optional[int] = None self._timeout = timeout self._receive_timeout = receive_timeout self._autoclose = autoclose self._autoping = autoping self._heartbeat = heartbeat self._heartbeat_cb: Optional[asyncio.TimerHandle] = None if heartbeat is not None: self._pong_heartbeat = heartbeat / 2.0 self._pong_response_cb: Optional[asyncio.TimerHandle] = None self._loop = loop self._waiting: Optional[asyncio.Future[bool]] = None self._exception: Optional[BaseException] = None self._compress = compress self._client_notakeover = client_notakeover self._reset_heartbeat() def _cancel_heartbeat(self) -> None: if self._pong_response_cb is not None: self._pong_response_cb.cancel() self._pong_response_cb = None if self._heartbeat_cb is not None: self._heartbeat_cb.cancel() self._heartbeat_cb = None def _reset_heartbeat(self) -> None: self._cancel_heartbeat() if self._heartbeat is not None: self._heartbeat_cb = call_later( self._send_heartbeat, self._heartbeat, self._loop, timeout_ceil_threshold=self._conn._connector._timeout_ceil_threshold if self._conn is not None else 5, ) def _send_heartbeat(self) -> None: if self._heartbeat is not None and not self._closed: # fire-and-forget a task is not perfect but maybe ok for # sending ping. Otherwise we need a long-living heartbeat # task in the class. self._loop.create_task(self._writer.ping()) if self._pong_response_cb is not None: self._pong_response_cb.cancel() self._pong_response_cb = call_later( self._pong_not_received, self._pong_heartbeat, self._loop, timeout_ceil_threshold=self._conn._connector._timeout_ceil_threshold if self._conn is not None else 5, ) def _pong_not_received(self) -> None: if not self._closed: self._closed = True self._close_code = WSCloseCode.ABNORMAL_CLOSURE self._exception = asyncio.TimeoutError() self._response.close() @property def closed(self) -> bool: return self._closed @property def close_code(self) -> Optional[int]: return self._close_code @property def protocol(self) -> Optional[str]: return self._protocol @property def compress(self) -> int: return self._compress @property def client_notakeover(self) -> bool: return self._client_notakeover def get_extra_info(self, name: str, default: Any = None) -> Any: """extra info from connection transport""" conn = self._response.connection if conn is None: return default transport = conn.transport if transport is None: return default return transport.get_extra_info(name, default) def exception(self) -> Optional[BaseException]: return self._exception async def ping(self, message: bytes = b"") -> None: await self._writer.ping(message) async def pong(self, message: bytes = b"") -> None: await self._writer.pong(message) async def send_str(self, data: str, compress: Optional[int] = None) -> None: if not isinstance(data, str): raise TypeError("data argument must be str (%r)" % type(data)) await self._writer.send(data, binary=False, compress=compress) async def send_bytes(self, data: bytes, compress: Optional[int] = None) -> None: if not isinstance(data, (bytes, bytearray, memoryview)): raise TypeError("data argument must be byte-ish (%r)" % type(data)) await self._writer.send(data, binary=True, compress=compress) async def send_json( self, data: Any, compress: Optional[int] = None, *, dumps: JSONEncoder = DEFAULT_JSON_ENCODER, ) -> None: await self.send_str(dumps(data), compress=compress) async def close(self, *, code: int = WSCloseCode.OK, message: bytes = b"") -> bool: # we need to break `receive()` cycle first, # `close()` may be called from different task if self._waiting is not None and not self._closing: self._closing = True self._reader.feed_data(WS_CLOSING_MESSAGE, 0) await self._waiting if not self._closed: self._cancel_heartbeat() self._closed = True try: await self._writer.close(code, message) except asyncio.CancelledError: self._close_code = WSCloseCode.ABNORMAL_CLOSURE self._response.close() raise except Exception as exc: self._close_code = WSCloseCode.ABNORMAL_CLOSURE self._exception = exc self._response.close() return True if self._close_code: self._response.close() return True while True: try: async with async_timeout.timeout(self._timeout): msg = await self._reader.read() except asyncio.CancelledError: self._close_code = WSCloseCode.ABNORMAL_CLOSURE self._response.close() raise except Exception as exc: self._close_code = WSCloseCode.ABNORMAL_CLOSURE self._exception = exc self._response.close() return True if msg.type == WSMsgType.CLOSE: self._close_code = msg.data self._response.close() return True else: return False async def receive(self, timeout: Optional[float] = None) -> WSMessage: while True: if self._waiting is not None: raise RuntimeError("Concurrent call to receive() is not allowed") if self._closed: return WS_CLOSED_MESSAGE elif self._closing: await self.close() return WS_CLOSED_MESSAGE try: self._waiting = self._loop.create_future() try: async with async_timeout.timeout(timeout or self._receive_timeout): msg = await self._reader.read() self._reset_heartbeat() finally: waiter = self._waiting self._waiting = None set_result(waiter, True) except (asyncio.CancelledError, asyncio.TimeoutError): self._close_code = WSCloseCode.ABNORMAL_CLOSURE raise except EofStream: self._close_code = WSCloseCode.OK await self.close() return WSMessage(WSMsgType.CLOSED, None, None) except ClientError: self._closed = True self._close_code = WSCloseCode.ABNORMAL_CLOSURE return WS_CLOSED_MESSAGE except WebSocketError as exc: self._close_code = exc.code await self.close(code=exc.code) return WSMessage(WSMsgType.ERROR, exc, None) except Exception as exc: self._exception = exc self._closing = True self._close_code = WSCloseCode.ABNORMAL_CLOSURE await self.close() return WSMessage(WSMsgType.ERROR, exc, None) if msg.type == WSMsgType.CLOSE: self._closing = True self._close_code = msg.data if not self._closed and self._autoclose: await self.close() elif msg.type == WSMsgType.CLOSING: self._closing = True elif msg.type == WSMsgType.PING and self._autoping: await self.pong(msg.data) continue elif msg.type == WSMsgType.PONG and self._autoping: continue return msg async def receive_str(self, *, timeout: Optional[float] = None) -> str: msg = await self.receive(timeout) if msg.type != WSMsgType.TEXT: raise TypeError(f"Received message {msg.type}:{msg.data!r} is not str") return cast(str, msg.data) async def receive_bytes(self, *, timeout: Optional[float] = None) -> bytes: msg = await self.receive(timeout) if msg.type != WSMsgType.BINARY: raise TypeError(f"Received message {msg.type}:{msg.data!r} is not bytes") return cast(bytes, msg.data) async def receive_json( self, *, loads: JSONDecoder = DEFAULT_JSON_DECODER, timeout: Optional[float] = None, ) -> Any: data = await self.receive_str(timeout=timeout) return loads(data) def __aiter__(self) -> "ClientWebSocketResponse": return self async def __anext__(self) -> WSMessage: msg = await self.receive() if msg.type in (WSMsgType.CLOSE, WSMsgType.CLOSING, WSMsgType.CLOSED): raise StopAsyncIteration return msg ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/compression_utils.py0000644000175100001770000001162714607525266020434 0ustar00runnerdockerimport asyncio import zlib from concurrent.futures import Executor from typing import Optional, cast try: try: import brotlicffi as brotli except ImportError: import brotli HAS_BROTLI = True except ImportError: # pragma: no cover HAS_BROTLI = False MAX_SYNC_CHUNK_SIZE = 1024 def encoding_to_mode( encoding: Optional[str] = None, suppress_deflate_header: bool = False, ) -> int: if encoding == "gzip": return 16 + zlib.MAX_WBITS return -zlib.MAX_WBITS if suppress_deflate_header else zlib.MAX_WBITS class ZlibBaseHandler: def __init__( self, mode: int, executor: Optional[Executor] = None, max_sync_chunk_size: Optional[int] = MAX_SYNC_CHUNK_SIZE, ): self._mode = mode self._executor = executor self._max_sync_chunk_size = max_sync_chunk_size class ZLibCompressor(ZlibBaseHandler): def __init__( self, encoding: Optional[str] = None, suppress_deflate_header: bool = False, level: Optional[int] = None, wbits: Optional[int] = None, strategy: int = zlib.Z_DEFAULT_STRATEGY, executor: Optional[Executor] = None, max_sync_chunk_size: Optional[int] = MAX_SYNC_CHUNK_SIZE, ): super().__init__( mode=encoding_to_mode(encoding, suppress_deflate_header) if wbits is None else wbits, executor=executor, max_sync_chunk_size=max_sync_chunk_size, ) if level is None: self._compressor = zlib.compressobj(wbits=self._mode, strategy=strategy) else: self._compressor = zlib.compressobj( wbits=self._mode, strategy=strategy, level=level ) self._compress_lock = asyncio.Lock() def compress_sync(self, data: bytes) -> bytes: return self._compressor.compress(data) async def compress(self, data: bytes) -> bytes: async with self._compress_lock: # To ensure the stream is consistent in the event # there are multiple writers, we need to lock # the compressor so that only one writer can # compress at a time. if ( self._max_sync_chunk_size is not None and len(data) > self._max_sync_chunk_size ): return await asyncio.get_event_loop().run_in_executor( self._executor, self.compress_sync, data ) return self.compress_sync(data) def flush(self, mode: int = zlib.Z_FINISH) -> bytes: return self._compressor.flush(mode) class ZLibDecompressor(ZlibBaseHandler): def __init__( self, encoding: Optional[str] = None, suppress_deflate_header: bool = False, executor: Optional[Executor] = None, max_sync_chunk_size: Optional[int] = MAX_SYNC_CHUNK_SIZE, ): super().__init__( mode=encoding_to_mode(encoding, suppress_deflate_header), executor=executor, max_sync_chunk_size=max_sync_chunk_size, ) self._decompressor = zlib.decompressobj(wbits=self._mode) def decompress_sync(self, data: bytes, max_length: int = 0) -> bytes: return self._decompressor.decompress(data, max_length) async def decompress(self, data: bytes, max_length: int = 0) -> bytes: if ( self._max_sync_chunk_size is not None and len(data) > self._max_sync_chunk_size ): return await asyncio.get_event_loop().run_in_executor( self._executor, self.decompress_sync, data, max_length ) return self.decompress_sync(data, max_length) def flush(self, length: int = 0) -> bytes: return ( self._decompressor.flush(length) if length > 0 else self._decompressor.flush() ) @property def eof(self) -> bool: return self._decompressor.eof @property def unconsumed_tail(self) -> bytes: return self._decompressor.unconsumed_tail @property def unused_data(self) -> bytes: return self._decompressor.unused_data class BrotliDecompressor: # 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 not HAS_BROTLI: raise RuntimeError( "The brotli decompression is not available. " "Please install `Brotli` module" ) self._obj = brotli.Decompressor() def decompress_sync(self, data: bytes) -> bytes: if hasattr(self._obj, "decompress"): return cast(bytes, self._obj.decompress(data)) return cast(bytes, self._obj.process(data)) def flush(self) -> bytes: if hasattr(self._obj, "flush"): return cast(bytes, self._obj.flush()) return b"" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/connector.py0000644000175100001770000015104414607525266016643 0ustar00runnerdockerimport asyncio import functools import random import sys import traceback import warnings from collections import defaultdict, deque from contextlib import suppress from http import HTTPStatus from http.cookies import SimpleCookie from itertools import cycle, islice from time import monotonic from types import TracebackType from typing import ( TYPE_CHECKING, Any, Awaitable, Callable, DefaultDict, Dict, Iterator, List, Literal, Optional, Set, Tuple, Type, Union, cast, ) import attr from . import hdrs, helpers from .abc import AbstractResolver from .client_exceptions import ( ClientConnectionError, ClientConnectorCertificateError, ClientConnectorError, ClientConnectorSSLError, ClientHttpProxyError, ClientProxyConnectionError, ServerFingerprintMismatch, UnixClientConnectorError, cert_errors, ssl_errors, ) from .client_proto import ResponseHandler from .client_reqrep import ClientRequest, Fingerprint, _merge_ssl_params from .helpers import ceil_timeout, get_running_loop, is_ip_address, noop, sentinel from .locks import EventResultOrError from .resolver import DefaultResolver try: import ssl SSLContext = ssl.SSLContext except ImportError: # pragma: no cover ssl = None # type: ignore[assignment] SSLContext = object # type: ignore[misc,assignment] __all__ = ("BaseConnector", "TCPConnector", "UnixConnector", "NamedPipeConnector") if TYPE_CHECKING: from .client import ClientTimeout from .client_reqrep import ConnectionKey from .tracing import Trace class _DeprecationWaiter: __slots__ = ("_awaitable", "_awaited") def __init__(self, awaitable: Awaitable[Any]) -> None: self._awaitable = awaitable self._awaited = False def __await__(self) -> Any: self._awaited = True return self._awaitable.__await__() def __del__(self) -> None: if not self._awaited: warnings.warn( "Connector.close() is a coroutine, " "please use await connector.close()", DeprecationWarning, ) class Connection: _source_traceback = None _transport = None def __init__( self, connector: "BaseConnector", key: "ConnectionKey", protocol: ResponseHandler, loop: asyncio.AbstractEventLoop, ) -> None: self._key = key self._connector = connector self._loop = loop self._protocol: Optional[ResponseHandler] = protocol self._callbacks: List[Callable[[], None]] = [] if loop.get_debug(): self._source_traceback = traceback.extract_stack(sys._getframe(1)) def __repr__(self) -> str: return f"Connection<{self._key}>" def __del__(self, _warnings: Any = warnings) -> None: if self._protocol is not None: kwargs = {"source": self} _warnings.warn(f"Unclosed connection {self!r}", ResourceWarning, **kwargs) if self._loop.is_closed(): return self._connector._release(self._key, self._protocol, should_close=True) context = {"client_connection": self, "message": "Unclosed connection"} if self._source_traceback is not None: context["source_traceback"] = self._source_traceback self._loop.call_exception_handler(context) def __bool__(self) -> Literal[True]: """Force subclasses to not be falsy, to make checks simpler.""" return True @property def loop(self) -> asyncio.AbstractEventLoop: warnings.warn( "connector.loop property is deprecated", DeprecationWarning, stacklevel=2 ) return self._loop @property def transport(self) -> Optional[asyncio.Transport]: if self._protocol is None: return None return self._protocol.transport @property def protocol(self) -> Optional[ResponseHandler]: return self._protocol def add_callback(self, callback: Callable[[], None]) -> None: if callback is not None: self._callbacks.append(callback) def _notify_release(self) -> None: callbacks, self._callbacks = self._callbacks[:], [] for cb in callbacks: with suppress(Exception): cb() def close(self) -> None: self._notify_release() if self._protocol is not None: self._connector._release(self._key, self._protocol, should_close=True) self._protocol = None def release(self) -> None: self._notify_release() if self._protocol is not None: self._connector._release( self._key, self._protocol, should_close=self._protocol.should_close ) self._protocol = None @property def closed(self) -> bool: return self._protocol is None or not self._protocol.is_connected() class _TransportPlaceholder: """placeholder for BaseConnector.connect function""" def close(self) -> None: pass class BaseConnector: """Base connector class. keepalive_timeout - (optional) Keep-alive timeout. force_close - Set to True to force close and do reconnect after each request (and between redirects). limit - The total number of simultaneous connections. limit_per_host - Number of simultaneous connections to one host. enable_cleanup_closed - Enables clean-up closed ssl transports. Disabled by default. timeout_ceil_threshold - Trigger ceiling of timeout values when it's above timeout_ceil_threshold. loop - Optional event loop. """ _closed = True # prevent AttributeError in __del__ if ctor was failed _source_traceback = None # abort transport after 2 seconds (cleanup broken connections) _cleanup_closed_period = 2.0 def __init__( self, *, keepalive_timeout: Union[object, None, float] = sentinel, force_close: bool = False, limit: int = 100, limit_per_host: int = 0, enable_cleanup_closed: bool = False, loop: Optional[asyncio.AbstractEventLoop] = None, timeout_ceil_threshold: float = 5, ) -> None: if force_close: if keepalive_timeout is not None and keepalive_timeout is not sentinel: raise ValueError( "keepalive_timeout cannot " "be set if force_close is True" ) else: if keepalive_timeout is sentinel: keepalive_timeout = 15.0 loop = get_running_loop(loop) self._timeout_ceil_threshold = timeout_ceil_threshold self._closed = False if loop.get_debug(): self._source_traceback = traceback.extract_stack(sys._getframe(1)) self._conns: Dict[ConnectionKey, List[Tuple[ResponseHandler, float]]] = {} self._limit = limit self._limit_per_host = limit_per_host self._acquired: Set[ResponseHandler] = set() self._acquired_per_host: DefaultDict[ ConnectionKey, Set[ResponseHandler] ] = defaultdict(set) self._keepalive_timeout = cast(float, keepalive_timeout) self._force_close = force_close # {host_key: FIFO list of waiters} self._waiters = defaultdict(deque) # type: ignore[var-annotated] self._loop = loop self._factory = functools.partial(ResponseHandler, loop=loop) self.cookies = SimpleCookie() # start keep-alive connection cleanup task self._cleanup_handle: Optional[asyncio.TimerHandle] = None # start cleanup closed transports task self._cleanup_closed_handle: Optional[asyncio.TimerHandle] = None self._cleanup_closed_disabled = not enable_cleanup_closed self._cleanup_closed_transports: List[Optional[asyncio.Transport]] = [] self._cleanup_closed() def __del__(self, _warnings: Any = warnings) -> None: if self._closed: return if not self._conns: return conns = [repr(c) for c in self._conns.values()] self._close() kwargs = {"source": self} _warnings.warn(f"Unclosed connector {self!r}", ResourceWarning, **kwargs) context = { "connector": self, "connections": conns, "message": "Unclosed connector", } if self._source_traceback is not None: context["source_traceback"] = self._source_traceback self._loop.call_exception_handler(context) def __enter__(self) -> "BaseConnector": warnings.warn( '"with Connector():" is deprecated, ' 'use "async with Connector():" instead', DeprecationWarning, ) return self def __exit__(self, *exc: Any) -> None: self._close() async def __aenter__(self) -> "BaseConnector": return self async def __aexit__( self, exc_type: Optional[Type[BaseException]] = None, exc_value: Optional[BaseException] = None, exc_traceback: Optional[TracebackType] = None, ) -> None: await self.close() @property def force_close(self) -> bool: """Ultimately close connection on releasing if True.""" return self._force_close @property def limit(self) -> int: """The total number for simultaneous connections. If limit is 0 the connector has no limit. The default limit size is 100. """ return self._limit @property def limit_per_host(self) -> int: """The limit for simultaneous connections to the same endpoint. Endpoints are the same if they are have equal (host, port, is_ssl) triple. """ return self._limit_per_host def _cleanup(self) -> None: """Cleanup unused transports.""" if self._cleanup_handle: self._cleanup_handle.cancel() # _cleanup_handle should be unset, otherwise _release() will not # recreate it ever! self._cleanup_handle = None now = self._loop.time() timeout = self._keepalive_timeout if self._conns: connections = {} deadline = now - timeout for key, conns in self._conns.items(): alive = [] for proto, use_time in conns: if proto.is_connected(): if use_time - deadline < 0: transport = proto.transport proto.close() if key.is_ssl and not self._cleanup_closed_disabled: self._cleanup_closed_transports.append(transport) else: alive.append((proto, use_time)) else: transport = proto.transport proto.close() if key.is_ssl and not self._cleanup_closed_disabled: self._cleanup_closed_transports.append(transport) if alive: connections[key] = alive self._conns = connections if self._conns: self._cleanup_handle = helpers.weakref_handle( self, "_cleanup", timeout, self._loop, timeout_ceil_threshold=self._timeout_ceil_threshold, ) def _drop_acquired_per_host( self, key: "ConnectionKey", val: ResponseHandler ) -> None: acquired_per_host = self._acquired_per_host if key not in acquired_per_host: return conns = acquired_per_host[key] conns.remove(val) if not conns: del self._acquired_per_host[key] def _cleanup_closed(self) -> None: """Double confirmation for transport close. Some broken ssl servers may leave socket open without proper close. """ if self._cleanup_closed_handle: self._cleanup_closed_handle.cancel() for transport in self._cleanup_closed_transports: if transport is not None: transport.abort() self._cleanup_closed_transports = [] if not self._cleanup_closed_disabled: self._cleanup_closed_handle = helpers.weakref_handle( self, "_cleanup_closed", self._cleanup_closed_period, self._loop, timeout_ceil_threshold=self._timeout_ceil_threshold, ) def close(self) -> Awaitable[None]: """Close all opened transports.""" self._close() return _DeprecationWaiter(noop()) def _close(self) -> None: if self._closed: return self._closed = True try: if self._loop.is_closed(): return # cancel cleanup task if self._cleanup_handle: self._cleanup_handle.cancel() # cancel cleanup close task if self._cleanup_closed_handle: self._cleanup_closed_handle.cancel() for data in self._conns.values(): for proto, t0 in data: proto.close() for proto in self._acquired: proto.close() for transport in self._cleanup_closed_transports: if transport is not None: transport.abort() finally: self._conns.clear() self._acquired.clear() self._waiters.clear() self._cleanup_handle = None self._cleanup_closed_transports.clear() self._cleanup_closed_handle = None @property def closed(self) -> bool: """Is connector closed. A readonly property. """ return self._closed def _available_connections(self, key: "ConnectionKey") -> int: """ Return number of available connections. The limit, limit_per_host and the connection key are taken into account. If it returns less than 1 means that there are no connections available. """ if self._limit: # total calc available connections available = self._limit - len(self._acquired) # check limit per host if ( self._limit_per_host and available > 0 and key in self._acquired_per_host ): acquired = self._acquired_per_host.get(key) assert acquired is not None available = self._limit_per_host - len(acquired) elif self._limit_per_host and key in self._acquired_per_host: # check limit per host acquired = self._acquired_per_host.get(key) assert acquired is not None available = self._limit_per_host - len(acquired) else: available = 1 return available async def connect( self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" ) -> Connection: """Get from pool or create new connection.""" key = req.connection_key available = self._available_connections(key) # Wait if there are no available connections or if there are/were # waiters (i.e. don't steal connection from a waiter about to wake up) if available <= 0 or key in self._waiters: fut = self._loop.create_future() # This connection will now count towards the limit. self._waiters[key].append(fut) if traces: for trace in traces: await trace.send_connection_queued_start() try: await fut except BaseException as e: if key in self._waiters: # remove a waiter even if it was cancelled, normally it's # removed when it's notified try: self._waiters[key].remove(fut) except ValueError: # fut may no longer be in list pass raise e finally: if key in self._waiters and not self._waiters[key]: del self._waiters[key] if traces: for trace in traces: await trace.send_connection_queued_end() proto = self._get(key) if proto is None: placeholder = cast(ResponseHandler, _TransportPlaceholder()) self._acquired.add(placeholder) self._acquired_per_host[key].add(placeholder) if traces: for trace in traces: await trace.send_connection_create_start() try: proto = await self._create_connection(req, traces, timeout) if self._closed: proto.close() raise ClientConnectionError("Connector is closed.") except BaseException: if not self._closed: self._acquired.remove(placeholder) self._drop_acquired_per_host(key, placeholder) self._release_waiter() raise else: if not self._closed: self._acquired.remove(placeholder) self._drop_acquired_per_host(key, placeholder) if traces: for trace in traces: await trace.send_connection_create_end() else: if traces: # Acquire the connection to prevent race conditions with limits placeholder = cast(ResponseHandler, _TransportPlaceholder()) self._acquired.add(placeholder) self._acquired_per_host[key].add(placeholder) for trace in traces: await trace.send_connection_reuseconn() self._acquired.remove(placeholder) self._drop_acquired_per_host(key, placeholder) self._acquired.add(proto) self._acquired_per_host[key].add(proto) return Connection(self, key, proto, self._loop) def _get(self, key: "ConnectionKey") -> Optional[ResponseHandler]: try: conns = self._conns[key] except KeyError: return None t1 = self._loop.time() while conns: proto, t0 = conns.pop() if proto.is_connected(): if t1 - t0 > self._keepalive_timeout: transport = proto.transport proto.close() # only for SSL transports if key.is_ssl and not self._cleanup_closed_disabled: self._cleanup_closed_transports.append(transport) else: if not conns: # The very last connection was reclaimed: drop the key del self._conns[key] return proto else: transport = proto.transport proto.close() if key.is_ssl and not self._cleanup_closed_disabled: self._cleanup_closed_transports.append(transport) # No more connections: drop the key del self._conns[key] return None def _release_waiter(self) -> None: """ Iterates over all waiters until one to be released is found. The one to be released is not finished and belongs to a host that has available connections. """ if not self._waiters: return # Having the dict keys ordered this avoids to iterate # at the same order at each call. queues = list(self._waiters.keys()) random.shuffle(queues) for key in queues: if self._available_connections(key) < 1: continue waiters = self._waiters[key] while waiters: waiter = waiters.popleft() if not waiter.done(): waiter.set_result(None) return def _release_acquired(self, key: "ConnectionKey", proto: ResponseHandler) -> None: if self._closed: # acquired connection is already released on connector closing return try: self._acquired.remove(proto) self._drop_acquired_per_host(key, proto) except KeyError: # pragma: no cover # this may be result of undetermenistic order of objects # finalization due garbage collection. pass else: self._release_waiter() def _release( self, key: "ConnectionKey", protocol: ResponseHandler, *, should_close: bool = False, ) -> None: if self._closed: # acquired connection is already released on connector closing return self._release_acquired(key, protocol) if self._force_close: should_close = True if should_close or protocol.should_close: transport = protocol.transport protocol.close() if key.is_ssl and not self._cleanup_closed_disabled: self._cleanup_closed_transports.append(transport) else: conns = self._conns.get(key) if conns is None: conns = self._conns[key] = [] conns.append((protocol, self._loop.time())) if self._cleanup_handle is None: self._cleanup_handle = helpers.weakref_handle( self, "_cleanup", self._keepalive_timeout, self._loop, timeout_ceil_threshold=self._timeout_ceil_threshold, ) async def _create_connection( self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" ) -> ResponseHandler: raise NotImplementedError() class _DNSCacheTable: def __init__(self, ttl: Optional[float] = None) -> None: self._addrs_rr: Dict[Tuple[str, int], Tuple[Iterator[Dict[str, Any]], int]] = {} self._timestamps: Dict[Tuple[str, int], float] = {} self._ttl = ttl def __contains__(self, host: object) -> bool: return host in self._addrs_rr def add(self, key: Tuple[str, int], addrs: List[Dict[str, Any]]) -> None: self._addrs_rr[key] = (cycle(addrs), len(addrs)) if self._ttl is not None: self._timestamps[key] = monotonic() def remove(self, key: Tuple[str, int]) -> None: self._addrs_rr.pop(key, None) if self._ttl is not None: self._timestamps.pop(key, None) def clear(self) -> None: self._addrs_rr.clear() self._timestamps.clear() def next_addrs(self, key: Tuple[str, int]) -> List[Dict[str, Any]]: loop, length = self._addrs_rr[key] addrs = list(islice(loop, length)) # Consume one more element to shift internal state of `cycle` next(loop) return addrs def expired(self, key: Tuple[str, int]) -> bool: if self._ttl is None: return False return self._timestamps[key] + self._ttl < monotonic() class TCPConnector(BaseConnector): """TCP connector. verify_ssl - Set to True to check ssl certifications. fingerprint - Pass the binary sha256 digest of the expected certificate in DER format to verify that the certificate the server presents matches. See also https://en.wikipedia.org/wiki/Transport_Layer_Security#Certificate_pinning resolver - Enable DNS lookups and use this resolver use_dns_cache - Use memory cache for DNS lookups. ttl_dns_cache - Max seconds having cached a DNS entry, None forever. family - socket address family local_addr - local tuple of (host, port) to bind socket to keepalive_timeout - (optional) Keep-alive timeout. force_close - Set to True to force close and do reconnect after each request (and between redirects). limit - The total number of simultaneous connections. limit_per_host - Number of simultaneous connections to one host. enable_cleanup_closed - Enables clean-up closed ssl transports. Disabled by default. loop - Optional event loop. """ def __init__( self, *, verify_ssl: bool = True, fingerprint: Optional[bytes] = None, use_dns_cache: bool = True, ttl_dns_cache: Optional[int] = 10, family: int = 0, ssl_context: Optional[SSLContext] = None, ssl: Union[bool, Fingerprint, SSLContext] = True, local_addr: Optional[Tuple[str, int]] = None, resolver: Optional[AbstractResolver] = None, keepalive_timeout: Union[None, float, object] = sentinel, force_close: bool = False, limit: int = 100, limit_per_host: int = 0, enable_cleanup_closed: bool = False, loop: Optional[asyncio.AbstractEventLoop] = None, timeout_ceil_threshold: float = 5, ): super().__init__( keepalive_timeout=keepalive_timeout, force_close=force_close, limit=limit, limit_per_host=limit_per_host, enable_cleanup_closed=enable_cleanup_closed, loop=loop, timeout_ceil_threshold=timeout_ceil_threshold, ) self._ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) if resolver is None: resolver = DefaultResolver(loop=self._loop) self._resolver = resolver self._use_dns_cache = use_dns_cache self._cached_hosts = _DNSCacheTable(ttl=ttl_dns_cache) self._throttle_dns_events: Dict[Tuple[str, int], EventResultOrError] = {} self._family = family self._local_addr = local_addr def close(self) -> Awaitable[None]: """Close all ongoing DNS calls.""" for ev in self._throttle_dns_events.values(): ev.cancel() return super().close() @property def family(self) -> int: """Socket family like AF_INET.""" return self._family @property def use_dns_cache(self) -> bool: """True if local DNS caching is enabled.""" return self._use_dns_cache def clear_dns_cache( self, host: Optional[str] = None, port: Optional[int] = None ) -> None: """Remove specified host/port or clear all dns local cache.""" if host is not None and port is not None: self._cached_hosts.remove((host, port)) elif host is not None or port is not None: raise ValueError("either both host and port " "or none of them are allowed") else: self._cached_hosts.clear() async def _resolve_host( self, host: str, port: int, traces: Optional[List["Trace"]] = None ) -> List[Dict[str, Any]]: """Resolve host and return list of addresses.""" if is_ip_address(host): return [ { "hostname": host, "host": host, "port": port, "family": self._family, "proto": 0, "flags": 0, } ] if not self._use_dns_cache: if traces: for trace in traces: await trace.send_dns_resolvehost_start(host) res = await self._resolver.resolve(host, port, family=self._family) if traces: for trace in traces: await trace.send_dns_resolvehost_end(host) return res key = (host, port) if key in self._cached_hosts and not self._cached_hosts.expired(key): # get result early, before any await (#4014) result = self._cached_hosts.next_addrs(key) if traces: for trace in traces: await trace.send_dns_cache_hit(host) return result # # If multiple connectors are resolving the same host, we wait # for the first one to resolve and then use the result for all of them. # We use a throttle event to ensure that we only resolve the host once # and then use the result for all the waiters. # # In this case we need to create a task to ensure that we can shield # the task from cancellation as cancelling this lookup should not cancel # the underlying lookup or else the cancel event will get broadcast to # all the waiters across all connections. # resolved_host_task = asyncio.create_task( self._resolve_host_with_throttle(key, host, port, traces) ) try: return await asyncio.shield(resolved_host_task) except asyncio.CancelledError: def drop_exception(fut: "asyncio.Future[List[Dict[str, Any]]]") -> None: with suppress(Exception, asyncio.CancelledError): fut.result() resolved_host_task.add_done_callback(drop_exception) raise async def _resolve_host_with_throttle( self, key: Tuple[str, int], host: str, port: int, traces: Optional[List["Trace"]], ) -> List[Dict[str, Any]]: """Resolve host with a dns events throttle.""" if key in self._throttle_dns_events: # get event early, before any await (#4014) event = self._throttle_dns_events[key] if traces: for trace in traces: await trace.send_dns_cache_hit(host) await event.wait() else: # update dict early, before any await (#4014) self._throttle_dns_events[key] = EventResultOrError(self._loop) if traces: for trace in traces: await trace.send_dns_cache_miss(host) try: if traces: for trace in traces: await trace.send_dns_resolvehost_start(host) addrs = await self._resolver.resolve(host, port, family=self._family) if traces: for trace in traces: await trace.send_dns_resolvehost_end(host) self._cached_hosts.add(key, addrs) self._throttle_dns_events[key].set() except BaseException as e: # any DNS exception, independently of the implementation # is set for the waiters to raise the same exception. self._throttle_dns_events[key].set(exc=e) raise finally: self._throttle_dns_events.pop(key) return self._cached_hosts.next_addrs(key) async def _create_connection( self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" ) -> ResponseHandler: """Create connection. Has same keyword arguments as BaseEventLoop.create_connection. """ if req.proxy: _, proto = await self._create_proxy_connection(req, traces, timeout) else: _, proto = await self._create_direct_connection(req, traces, timeout) return proto @staticmethod @functools.lru_cache(None) def _make_ssl_context(verified: bool) -> SSLContext: if verified: return ssl.create_default_context() else: sslcontext = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) sslcontext.options |= ssl.OP_NO_SSLv2 sslcontext.options |= ssl.OP_NO_SSLv3 sslcontext.check_hostname = False sslcontext.verify_mode = ssl.CERT_NONE try: sslcontext.options |= ssl.OP_NO_COMPRESSION except AttributeError as attr_err: warnings.warn( "{!s}: The Python interpreter is compiled " "against OpenSSL < 1.0.0. Ref: " "https://docs.python.org/3/library/ssl.html" "#ssl.OP_NO_COMPRESSION".format(attr_err), ) sslcontext.set_default_verify_paths() return sslcontext def _get_ssl_context(self, req: ClientRequest) -> Optional[SSLContext]: """Logic to get the correct SSL context 0. if req.ssl is false, return None 1. if ssl_context is specified in req, use it 2. if _ssl_context is specified in self, use it 3. otherwise: 1. if verify_ssl is not specified in req, use self.ssl_context (will generate a default context according to self.verify_ssl) 2. if verify_ssl is True in req, generate a default SSL context 3. if verify_ssl is False in req, generate a SSL context that won't verify """ if req.is_ssl(): if ssl is None: # pragma: no cover raise RuntimeError("SSL is not supported.") sslcontext = req.ssl if isinstance(sslcontext, ssl.SSLContext): return sslcontext if sslcontext is not True: # not verified or fingerprinted return self._make_ssl_context(False) sslcontext = self._ssl if isinstance(sslcontext, ssl.SSLContext): return sslcontext if sslcontext is not True: # not verified or fingerprinted return self._make_ssl_context(False) return self._make_ssl_context(True) else: return None def _get_fingerprint(self, req: ClientRequest) -> Optional["Fingerprint"]: ret = req.ssl if isinstance(ret, Fingerprint): return ret ret = self._ssl if isinstance(ret, Fingerprint): return ret return None async def _wrap_create_connection( self, *args: Any, req: ClientRequest, timeout: "ClientTimeout", client_error: Type[Exception] = ClientConnectorError, **kwargs: Any, ) -> Tuple[asyncio.Transport, ResponseHandler]: try: async with ceil_timeout( timeout.sock_connect, ceil_threshold=timeout.ceil_threshold ): return await self._loop.create_connection(*args, **kwargs) except cert_errors as exc: raise ClientConnectorCertificateError(req.connection_key, exc) from exc except ssl_errors as exc: raise ClientConnectorSSLError(req.connection_key, exc) from exc except OSError as exc: if exc.errno is None and isinstance(exc, asyncio.TimeoutError): raise raise client_error(req.connection_key, exc) from exc def _fail_on_no_start_tls(self, req: "ClientRequest") -> None: """Raise a :py:exc:`RuntimeError` on missing ``start_tls()``. It is necessary for TLS-in-TLS so that it is possible to send HTTPS queries through HTTPS proxies. This doesn't affect regular HTTP requests, though. """ if not req.is_ssl(): return proxy_url = req.proxy assert proxy_url is not None if proxy_url.scheme != "https": return self._check_loop_for_start_tls() def _check_loop_for_start_tls(self) -> None: try: self._loop.start_tls except AttributeError as attr_exc: raise RuntimeError( "An HTTPS request is being sent through an HTTPS proxy. " "This needs support for TLS in TLS but it is not implemented " "in your runtime for the stdlib asyncio.\n\n" "Please upgrade to Python 3.11 or higher. For more details, " "please see:\n" "* https://bugs.python.org/issue37179\n" "* https://github.com/python/cpython/pull/28073\n" "* https://docs.aiohttp.org/en/stable/" "client_advanced.html#proxy-support\n" "* https://github.com/aio-libs/aiohttp/discussions/6044\n", ) from attr_exc def _loop_supports_start_tls(self) -> bool: try: self._check_loop_for_start_tls() except RuntimeError: return False else: return True def _warn_about_tls_in_tls( self, underlying_transport: asyncio.Transport, req: ClientRequest, ) -> None: """Issue a warning if the requested URL has HTTPS scheme.""" if req.request_info.url.scheme != "https": return asyncio_supports_tls_in_tls = getattr( underlying_transport, "_start_tls_compatible", False, ) if asyncio_supports_tls_in_tls: return warnings.warn( "An HTTPS request is being sent through an HTTPS proxy. " "This support for TLS in TLS is known to be disabled " "in the stdlib asyncio (Python <3.11). This is why you'll probably see " "an error in the log below.\n\n" "It is possible to enable it via monkeypatching. " "For more details, see:\n" "* https://bugs.python.org/issue37179\n" "* https://github.com/python/cpython/pull/28073\n\n" "You can temporarily patch this as follows:\n" "* https://docs.aiohttp.org/en/stable/client_advanced.html#proxy-support\n" "* https://github.com/aio-libs/aiohttp/discussions/6044\n", RuntimeWarning, source=self, # Why `4`? At least 3 of the calls in the stack originate # from the methods in this class. stacklevel=3, ) async def _start_tls_connection( self, underlying_transport: asyncio.Transport, req: ClientRequest, timeout: "ClientTimeout", client_error: Type[Exception] = ClientConnectorError, ) -> Tuple[asyncio.BaseTransport, ResponseHandler]: """Wrap the raw TCP transport with TLS.""" tls_proto = self._factory() # Create a brand new proto for TLS # Safety of the `cast()` call here is based on the fact that # internally `_get_ssl_context()` only returns `None` when # `req.is_ssl()` evaluates to `False` which is never gonna happen # in this code path. Of course, it's rather fragile # maintainability-wise but this is to be solved separately. sslcontext = cast(ssl.SSLContext, self._get_ssl_context(req)) try: async with ceil_timeout( timeout.sock_connect, ceil_threshold=timeout.ceil_threshold ): try: tls_transport = await self._loop.start_tls( underlying_transport, tls_proto, sslcontext, server_hostname=req.server_hostname or req.host, ssl_handshake_timeout=timeout.total, ) except BaseException: # We need to close the underlying transport since # `start_tls()` probably failed before it had a # chance to do this: underlying_transport.close() raise except cert_errors as exc: raise ClientConnectorCertificateError(req.connection_key, exc) from exc except ssl_errors as exc: raise ClientConnectorSSLError(req.connection_key, exc) from exc except OSError as exc: if exc.errno is None and isinstance(exc, asyncio.TimeoutError): raise raise client_error(req.connection_key, exc) from exc except TypeError as type_err: # Example cause looks like this: # TypeError: transport is not supported by start_tls() raise ClientConnectionError( "Cannot initialize a TLS-in-TLS connection to host " f"{req.host!s}:{req.port:d} through an underlying connection " f"to an HTTPS proxy {req.proxy!s} ssl:{req.ssl or 'default'} " f"[{type_err!s}]" ) from type_err else: if tls_transport is None: msg = "Failed to start TLS (possibly caused by closing transport)" raise client_error(req.connection_key, OSError(msg)) tls_proto.connection_made( tls_transport ) # Kick the state machine of the new TLS protocol return tls_transport, tls_proto async def _create_direct_connection( self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout", *, client_error: Type[Exception] = ClientConnectorError, ) -> Tuple[asyncio.Transport, ResponseHandler]: sslcontext = self._get_ssl_context(req) fingerprint = self._get_fingerprint(req) host = req.url.raw_host assert host is not None # Replace multiple trailing dots with a single one. # A trailing dot is only present for fully-qualified domain names. # See https://github.com/aio-libs/aiohttp/pull/7364. if host.endswith(".."): host = host.rstrip(".") + "." port = req.port assert port is not None try: # Cancelling this lookup should not cancel the underlying lookup # or else the cancel event will get broadcast to all the waiters # across all connections. hosts = await self._resolve_host(host, port, traces=traces) except OSError as exc: if exc.errno is None and isinstance(exc, asyncio.TimeoutError): raise # in case of proxy it is not ClientProxyConnectionError # it is problem of resolving proxy ip itself raise ClientConnectorError(req.connection_key, exc) from exc last_exc: Optional[Exception] = None for hinfo in hosts: host = hinfo["host"] port = hinfo["port"] # Strip trailing dots, certificates contain FQDN without dots. # See https://github.com/aio-libs/aiohttp/issues/3636 server_hostname = ( (req.server_hostname or hinfo["hostname"]).rstrip(".") if sslcontext else None ) try: transp, proto = await self._wrap_create_connection( self._factory, host, port, timeout=timeout, ssl=sslcontext, family=hinfo["family"], proto=hinfo["proto"], flags=hinfo["flags"], server_hostname=server_hostname, local_addr=self._local_addr, req=req, client_error=client_error, ) except ClientConnectorError as exc: last_exc = exc continue if req.is_ssl() and fingerprint: try: fingerprint.check(transp) except ServerFingerprintMismatch as exc: transp.close() if not self._cleanup_closed_disabled: self._cleanup_closed_transports.append(transp) last_exc = exc continue return transp, proto else: assert last_exc is not None raise last_exc async def _create_proxy_connection( self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" ) -> Tuple[asyncio.BaseTransport, ResponseHandler]: self._fail_on_no_start_tls(req) runtime_has_start_tls = self._loop_supports_start_tls() headers: Dict[str, str] = {} if req.proxy_headers is not None: headers = req.proxy_headers # type: ignore[assignment] headers[hdrs.HOST] = req.headers[hdrs.HOST] url = req.proxy assert url is not None proxy_req = ClientRequest( hdrs.METH_GET, url, headers=headers, auth=req.proxy_auth, loop=self._loop, ssl=req.ssl, ) # create connection to proxy server transport, proto = await self._create_direct_connection( proxy_req, [], timeout, client_error=ClientProxyConnectionError ) # Many HTTP proxies has buggy keepalive support. Let's not # reuse connection but close it after processing every # response. proto.force_close() auth = proxy_req.headers.pop(hdrs.AUTHORIZATION, None) if auth is not None: if not req.is_ssl(): req.headers[hdrs.PROXY_AUTHORIZATION] = auth else: proxy_req.headers[hdrs.PROXY_AUTHORIZATION] = auth if req.is_ssl(): if runtime_has_start_tls: self._warn_about_tls_in_tls(transport, req) # For HTTPS requests over HTTP proxy # we must notify proxy to tunnel connection # so we send CONNECT command: # CONNECT www.python.org:443 HTTP/1.1 # Host: www.python.org # # next we must do TLS handshake and so on # to do this we must wrap raw socket into secure one # asyncio handles this perfectly proxy_req.method = hdrs.METH_CONNECT proxy_req.url = req.url key = attr.evolve( req.connection_key, proxy=None, proxy_auth=None, proxy_headers_hash=None ) conn = Connection(self, key, proto, self._loop) proxy_resp = await proxy_req.send(conn) try: protocol = conn._protocol assert protocol is not None # read_until_eof=True will ensure the connection isn't closed # once the response is received and processed allowing # START_TLS to work on the connection below. protocol.set_response_params( read_until_eof=runtime_has_start_tls, timeout_ceil_threshold=self._timeout_ceil_threshold, ) resp = await proxy_resp.start(conn) except BaseException: proxy_resp.close() conn.close() raise else: conn._protocol = None conn._transport = None try: if resp.status != 200: message = resp.reason if message is None: message = HTTPStatus(resp.status).phrase raise ClientHttpProxyError( proxy_resp.request_info, resp.history, status=resp.status, message=message, headers=resp.headers, ) if not runtime_has_start_tls: rawsock = transport.get_extra_info("socket", default=None) if rawsock is None: raise RuntimeError( "Transport does not expose socket instance" ) # Duplicate the socket, so now we can close proxy transport rawsock = rawsock.dup() except BaseException: # It shouldn't be closed in `finally` because it's fed to # `loop.start_tls()` and the docs say not to touch it after # passing there. transport.close() raise finally: if not runtime_has_start_tls: transport.close() if not runtime_has_start_tls: # HTTP proxy with support for upgrade to HTTPS sslcontext = self._get_ssl_context(req) return await self._wrap_create_connection( self._factory, timeout=timeout, ssl=sslcontext, sock=rawsock, server_hostname=req.host, req=req, ) return await self._start_tls_connection( # Access the old transport for the last time before it's # closed and forgotten forever: transport, req=req, timeout=timeout, ) finally: proxy_resp.close() return transport, proto class UnixConnector(BaseConnector): """Unix socket connector. path - Unix socket path. keepalive_timeout - (optional) Keep-alive timeout. force_close - Set to True to force close and do reconnect after each request (and between redirects). limit - The total number of simultaneous connections. limit_per_host - Number of simultaneous connections to one host. loop - Optional event loop. """ def __init__( self, path: str, force_close: bool = False, keepalive_timeout: Union[object, float, None] = sentinel, limit: int = 100, limit_per_host: int = 0, loop: Optional[asyncio.AbstractEventLoop] = None, ) -> None: super().__init__( force_close=force_close, keepalive_timeout=keepalive_timeout, limit=limit, limit_per_host=limit_per_host, loop=loop, ) self._path = path @property def path(self) -> str: """Path to unix socket.""" return self._path async def _create_connection( self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" ) -> ResponseHandler: try: async with ceil_timeout( timeout.sock_connect, ceil_threshold=timeout.ceil_threshold ): _, proto = await self._loop.create_unix_connection( self._factory, self._path ) except OSError as exc: if exc.errno is None and isinstance(exc, asyncio.TimeoutError): raise raise UnixClientConnectorError(self.path, req.connection_key, exc) from exc return proto class NamedPipeConnector(BaseConnector): """Named pipe connector. Only supported by the proactor event loop. See also: https://docs.python.org/3/library/asyncio-eventloop.html path - Windows named pipe path. keepalive_timeout - (optional) Keep-alive timeout. force_close - Set to True to force close and do reconnect after each request (and between redirects). limit - The total number of simultaneous connections. limit_per_host - Number of simultaneous connections to one host. loop - Optional event loop. """ def __init__( self, path: str, force_close: bool = False, keepalive_timeout: Union[object, float, None] = sentinel, limit: int = 100, limit_per_host: int = 0, loop: Optional[asyncio.AbstractEventLoop] = None, ) -> None: super().__init__( force_close=force_close, keepalive_timeout=keepalive_timeout, limit=limit, limit_per_host=limit_per_host, loop=loop, ) if not isinstance( self._loop, asyncio.ProactorEventLoop # type: ignore[attr-defined] ): raise RuntimeError( "Named Pipes only available in proactor " "loop under windows" ) self._path = path @property def path(self) -> str: """Path to the named pipe.""" return self._path async def _create_connection( self, req: ClientRequest, traces: List["Trace"], timeout: "ClientTimeout" ) -> ResponseHandler: try: async with ceil_timeout( timeout.sock_connect, ceil_threshold=timeout.ceil_threshold ): _, proto = await self._loop.create_pipe_connection( # type: ignore[attr-defined] self._factory, self._path ) # the drain is required so that the connection_made is called # and transport is set otherwise it is not set before the # `assert conn.transport is not None` # in client.py's _request method await asyncio.sleep(0) # other option is to manually set transport like # `proto.transport = trans` except OSError as exc: if exc.errno is None and isinstance(exc, asyncio.TimeoutError): raise raise ClientConnectorError(req.connection_key, exc) from exc return cast(ResponseHandler, proto) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/cookiejar.py0000644000175100001770000003327714607525266016626 0ustar00runnerdockerimport asyncio import calendar import contextlib import datetime import os # noqa import pathlib import pickle import re import time from collections import defaultdict from http.cookies import BaseCookie, Morsel, SimpleCookie from math import ceil from typing import ( # noqa DefaultDict, Dict, Iterable, Iterator, List, Mapping, Optional, Set, Tuple, Union, cast, ) from yarl import URL from .abc import AbstractCookieJar, ClearCookiePredicate from .helpers import is_ip_address from .typedefs import LooseCookies, PathLike, StrOrURL __all__ = ("CookieJar", "DummyCookieJar") CookieItem = Union[str, "Morsel[str]"] class CookieJar(AbstractCookieJar): """Implements cookie storage adhering to RFC 6265.""" DATE_TOKENS_RE = re.compile( r"[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]*" r"(?P[\x00-\x08\x0A-\x1F\d:a-zA-Z\x7F-\xFF]+)" ) DATE_HMS_TIME_RE = re.compile(r"(\d{1,2}):(\d{1,2}):(\d{1,2})") DATE_DAY_OF_MONTH_RE = re.compile(r"(\d{1,2})") DATE_MONTH_RE = re.compile( "(jan)|(feb)|(mar)|(apr)|(may)|(jun)|(jul)|" "(aug)|(sep)|(oct)|(nov)|(dec)", re.I, ) DATE_YEAR_RE = re.compile(r"(\d{2,4})") # calendar.timegm() fails for timestamps after datetime.datetime.max # Minus one as a loss of precision occurs when timestamp() is called. MAX_TIME = ( int(datetime.datetime.max.replace(tzinfo=datetime.timezone.utc).timestamp()) - 1 ) try: calendar.timegm(time.gmtime(MAX_TIME)) except (OSError, ValueError): # Hit the maximum representable time on Windows # https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/localtime-localtime32-localtime64 # Throws ValueError on PyPy 3.8 and 3.9, OSError elsewhere MAX_TIME = calendar.timegm((3000, 12, 31, 23, 59, 59, -1, -1, -1)) except OverflowError: # #4515: datetime.max may not be representable on 32-bit platforms MAX_TIME = 2**31 - 1 # Avoid minuses in the future, 3x faster SUB_MAX_TIME = MAX_TIME - 1 def __init__( self, *, unsafe: bool = False, quote_cookie: bool = True, treat_as_secure_origin: Union[StrOrURL, List[StrOrURL], None] = None, loop: Optional[asyncio.AbstractEventLoop] = None, ) -> None: super().__init__(loop=loop) self._cookies: DefaultDict[Tuple[str, str], SimpleCookie] = defaultdict( SimpleCookie ) self._host_only_cookies: Set[Tuple[str, str]] = set() self._unsafe = unsafe self._quote_cookie = quote_cookie if treat_as_secure_origin is None: treat_as_secure_origin = [] elif isinstance(treat_as_secure_origin, URL): treat_as_secure_origin = [treat_as_secure_origin.origin()] elif isinstance(treat_as_secure_origin, str): treat_as_secure_origin = [URL(treat_as_secure_origin).origin()] else: treat_as_secure_origin = [ URL(url).origin() if isinstance(url, str) else url.origin() for url in treat_as_secure_origin ] self._treat_as_secure_origin = treat_as_secure_origin self._next_expiration: float = ceil(time.time()) self._expirations: Dict[Tuple[str, str, str], float] = {} def save(self, file_path: PathLike) -> None: file_path = pathlib.Path(file_path) with file_path.open(mode="wb") as f: pickle.dump(self._cookies, f, pickle.HIGHEST_PROTOCOL) def load(self, file_path: PathLike) -> None: file_path = pathlib.Path(file_path) with file_path.open(mode="rb") as f: self._cookies = pickle.load(f) def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: if predicate is None: self._next_expiration = ceil(time.time()) self._cookies.clear() self._host_only_cookies.clear() self._expirations.clear() return to_del = [] now = time.time() for (domain, path), cookie in self._cookies.items(): for name, morsel in cookie.items(): key = (domain, path, name) if ( key in self._expirations and self._expirations[key] <= now ) or predicate(morsel): to_del.append(key) for domain, path, name in to_del: self._host_only_cookies.discard((domain, name)) key = (domain, path, name) if key in self._expirations: del self._expirations[(domain, path, name)] self._cookies[(domain, path)].pop(name, None) self._next_expiration = ( min(*self._expirations.values(), self.SUB_MAX_TIME) + 1 if self._expirations else self.MAX_TIME ) def clear_domain(self, domain: str) -> None: self.clear(lambda x: self._is_domain_match(domain, x["domain"])) def __iter__(self) -> "Iterator[Morsel[str]]": self._do_expiration() for val in self._cookies.values(): yield from val.values() def __len__(self) -> int: return sum(1 for i in self) def _do_expiration(self) -> None: self.clear(lambda x: False) def _expire_cookie(self, when: float, domain: str, path: str, name: str) -> None: self._next_expiration = min(self._next_expiration, when) self._expirations[(domain, path, name)] = when def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: """Update cookies.""" hostname = response_url.raw_host if not self._unsafe and is_ip_address(hostname): # Don't accept cookies from IPs return if isinstance(cookies, Mapping): cookies = cookies.items() for name, cookie in cookies: if not isinstance(cookie, Morsel): tmp = SimpleCookie() tmp[name] = cookie # type: ignore[assignment] cookie = tmp[name] domain = cookie["domain"] # ignore domains with trailing dots if domain.endswith("."): domain = "" del cookie["domain"] if not domain and hostname is not None: # Set the cookie's domain to the response hostname # and set its host-only-flag self._host_only_cookies.add((hostname, name)) domain = cookie["domain"] = hostname if domain.startswith("."): # Remove leading dot domain = domain[1:] cookie["domain"] = domain if hostname and not self._is_domain_match(domain, hostname): # Setting cookies for different domains is not allowed continue path = cookie["path"] if not path or not path.startswith("/"): # Set the cookie's path to the response path path = response_url.path if not path.startswith("/"): path = "/" else: # Cut everything from the last slash to the end path = "/" + path[1 : path.rfind("/")] cookie["path"] = path max_age = cookie["max-age"] if max_age: try: delta_seconds = int(max_age) max_age_expiration = min(time.time() + delta_seconds, self.MAX_TIME) self._expire_cookie(max_age_expiration, domain, path, name) except ValueError: cookie["max-age"] = "" else: expires = cookie["expires"] if expires: expire_time = self._parse_date(expires) if expire_time: self._expire_cookie(expire_time, domain, path, name) else: cookie["expires"] = "" self._cookies[(domain, path)][name] = cookie self._do_expiration() def filter_cookies(self, request_url: URL = URL()) -> "BaseCookie[str]": """Returns this jar's cookies filtered by their attributes.""" filtered: Union[SimpleCookie, "BaseCookie[str]"] = ( SimpleCookie() if self._quote_cookie else BaseCookie() ) if not self._cookies: # Skip do_expiration() if there are no cookies. return filtered self._do_expiration() if not self._cookies: # Skip rest of function if no non-expired cookies. return filtered request_url = URL(request_url) hostname = request_url.raw_host or "" is_not_secure = request_url.scheme not in ("https", "wss") if is_not_secure and self._treat_as_secure_origin: request_origin = URL() with contextlib.suppress(ValueError): request_origin = request_url.origin() is_not_secure = request_origin not in self._treat_as_secure_origin # Point 2: https://www.rfc-editor.org/rfc/rfc6265.html#section-5.4 for cookie in sorted(self, key=lambda c: len(c["path"])): name = cookie.key domain = cookie["domain"] # Send shared cookies if not domain: filtered[name] = cookie.value continue if not self._unsafe and is_ip_address(hostname): continue if (domain, name) in self._host_only_cookies: if domain != hostname: continue elif not self._is_domain_match(domain, hostname): continue if not self._is_path_match(request_url.path, cookie["path"]): continue if is_not_secure and cookie["secure"]: continue # It's critical we use the Morsel so the coded_value # (based on cookie version) is preserved mrsl_val = cast("Morsel[str]", cookie.get(cookie.key, Morsel())) mrsl_val.set(cookie.key, cookie.value, cookie.coded_value) filtered[name] = mrsl_val return filtered @staticmethod def _is_domain_match(domain: str, hostname: str) -> bool: """Implements domain matching adhering to RFC 6265.""" if hostname == domain: return True if not hostname.endswith(domain): return False non_matching = hostname[: -len(domain)] if not non_matching.endswith("."): return False return not is_ip_address(hostname) @staticmethod def _is_path_match(req_path: str, cookie_path: str) -> bool: """Implements path matching adhering to RFC 6265.""" if not req_path.startswith("/"): req_path = "/" if req_path == cookie_path: return True if not req_path.startswith(cookie_path): return False if cookie_path.endswith("/"): return True non_matching = req_path[len(cookie_path) :] return non_matching.startswith("/") @classmethod def _parse_date(cls, date_str: str) -> Optional[int]: """Implements date string parsing adhering to RFC 6265.""" if not date_str: return None found_time = False found_day = False found_month = False found_year = False hour = minute = second = 0 day = 0 month = 0 year = 0 for token_match in cls.DATE_TOKENS_RE.finditer(date_str): token = token_match.group("token") if not found_time: time_match = cls.DATE_HMS_TIME_RE.match(token) if time_match: found_time = True hour, minute, second = (int(s) for s in time_match.groups()) continue if not found_day: day_match = cls.DATE_DAY_OF_MONTH_RE.match(token) if day_match: found_day = True day = int(day_match.group()) continue if not found_month: month_match = cls.DATE_MONTH_RE.match(token) if month_match: found_month = True assert month_match.lastindex is not None month = month_match.lastindex continue if not found_year: year_match = cls.DATE_YEAR_RE.match(token) if year_match: found_year = True year = int(year_match.group()) if 70 <= year <= 99: year += 1900 elif 0 <= year <= 69: year += 2000 if False in (found_day, found_month, found_year, found_time): return None if not 1 <= day <= 31: return None if year < 1601 or hour > 23 or minute > 59 or second > 59: return None return calendar.timegm((year, month, day, hour, minute, second, -1, -1, -1)) class DummyCookieJar(AbstractCookieJar): """Implements a dummy cookie storage. It can be used with the ClientSession when no cookie processing is needed. """ def __init__(self, *, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: super().__init__(loop=loop) def __iter__(self) -> "Iterator[Morsel[str]]": while False: yield None def __len__(self) -> int: return 0 def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: pass def clear_domain(self, domain: str) -> None: pass def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: pass def filter_cookies(self, request_url: URL) -> "BaseCookie[str]": return SimpleCookie() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/formdata.py0000644000175100001770000001457114607525266016451 0ustar00runnerdockerimport io import warnings from typing import Any, Iterable, List, Optional from urllib.parse import urlencode from multidict import MultiDict, MultiDictProxy from . import hdrs, multipart, payload from .helpers import guess_filename from .payload import Payload __all__ = ("FormData",) class FormData: """Helper class for form body generation. Supports multipart/form-data and application/x-www-form-urlencoded. """ def __init__( self, fields: Iterable[Any] = (), quote_fields: bool = True, charset: Optional[str] = None, ) -> None: self._writer = multipart.MultipartWriter("form-data") self._fields: List[Any] = [] self._is_multipart = False self._is_processed = False self._quote_fields = quote_fields self._charset = charset if isinstance(fields, dict): fields = list(fields.items()) elif not isinstance(fields, (list, tuple)): fields = (fields,) self.add_fields(*fields) @property def is_multipart(self) -> bool: return self._is_multipart def add_field( self, name: str, value: Any, *, content_type: Optional[str] = None, filename: Optional[str] = None, content_transfer_encoding: Optional[str] = None, ) -> None: if isinstance(value, io.IOBase): self._is_multipart = True elif isinstance(value, (bytes, bytearray, memoryview)): msg = ( "In v4, passing bytes will no longer create a file field. " "Please explicitly use the filename parameter or pass a BytesIO object." ) if filename is None and content_transfer_encoding is None: warnings.warn(msg, DeprecationWarning) filename = name type_options: MultiDict[str] = MultiDict({"name": name}) if filename is not None and not isinstance(filename, str): raise TypeError( "filename must be an instance of str. " "Got: %s" % filename ) if filename is None and isinstance(value, io.IOBase): filename = guess_filename(value, name) if filename is not None: type_options["filename"] = filename self._is_multipart = True headers = {} if content_type is not None: if not isinstance(content_type, str): raise TypeError( "content_type must be an instance of str. " "Got: %s" % content_type ) headers[hdrs.CONTENT_TYPE] = content_type self._is_multipart = True if content_transfer_encoding is not None: if not isinstance(content_transfer_encoding, str): raise TypeError( "content_transfer_encoding must be an instance" " of str. Got: %s" % content_transfer_encoding ) msg = ( "content_transfer_encoding is deprecated. " "To maintain compatibility with v4 please pass a BytesPayload." ) warnings.warn(msg, DeprecationWarning) self._is_multipart = True self._fields.append((type_options, headers, value)) def add_fields(self, *fields: Any) -> None: to_add = list(fields) while to_add: rec = to_add.pop(0) if isinstance(rec, io.IOBase): k = guess_filename(rec, "unknown") self.add_field(k, rec) # type: ignore[arg-type] elif isinstance(rec, (MultiDictProxy, MultiDict)): to_add.extend(rec.items()) elif isinstance(rec, (list, tuple)) and len(rec) == 2: k, fp = rec self.add_field(k, fp) # type: ignore[arg-type] else: raise TypeError( "Only io.IOBase, multidict and (name, file) " "pairs allowed, use .add_field() for passing " "more complex parameters, got {!r}".format(rec) ) def _gen_form_urlencoded(self) -> payload.BytesPayload: # form data (x-www-form-urlencoded) data = [] for type_options, _, value in self._fields: data.append((type_options["name"], value)) charset = self._charset if self._charset is not None else "utf-8" if charset == "utf-8": content_type = "application/x-www-form-urlencoded" else: content_type = "application/x-www-form-urlencoded; " "charset=%s" % charset return payload.BytesPayload( urlencode(data, doseq=True, encoding=charset).encode(), content_type=content_type, ) def _gen_form_data(self) -> multipart.MultipartWriter: """Encode a list of fields using the multipart/form-data MIME format""" if self._is_processed: raise RuntimeError("Form data has been processed already") for dispparams, headers, value in self._fields: try: if hdrs.CONTENT_TYPE in headers: part = payload.get_payload( value, content_type=headers[hdrs.CONTENT_TYPE], headers=headers, encoding=self._charset, ) else: part = payload.get_payload( value, headers=headers, encoding=self._charset ) except Exception as exc: raise TypeError( "Can not serialize value type: %r\n " "headers: %r\n value: %r" % (type(value), headers, value) ) from exc if dispparams: part.set_content_disposition( "form-data", quote_fields=self._quote_fields, **dispparams ) # FIXME cgi.FieldStorage doesn't likes body parts with # Content-Length which were sent via chunked transfer encoding assert part.headers is not None part.headers.popall(hdrs.CONTENT_LENGTH, None) self._writer.append_payload(part) self._is_processed = True return self._writer def __call__(self) -> Payload: if self._is_multipart: return self._gen_form_data() else: return self._gen_form_urlencoded() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/hdrs.py0000644000175100001770000001100514607525266015601 0ustar00runnerdocker"""HTTP Headers constants.""" # After changing the file content call ./tools/gen.py # to regenerate the headers parser from typing import Final, Set from multidict import istr METH_ANY: Final[str] = "*" METH_CONNECT: Final[str] = "CONNECT" METH_HEAD: Final[str] = "HEAD" METH_GET: Final[str] = "GET" METH_DELETE: Final[str] = "DELETE" METH_OPTIONS: Final[str] = "OPTIONS" METH_PATCH: Final[str] = "PATCH" METH_POST: Final[str] = "POST" METH_PUT: Final[str] = "PUT" METH_TRACE: Final[str] = "TRACE" METH_ALL: Final[Set[str]] = { METH_CONNECT, METH_HEAD, METH_GET, METH_DELETE, METH_OPTIONS, METH_PATCH, METH_POST, METH_PUT, METH_TRACE, } ACCEPT: Final[istr] = istr("Accept") ACCEPT_CHARSET: Final[istr] = istr("Accept-Charset") ACCEPT_ENCODING: Final[istr] = istr("Accept-Encoding") ACCEPT_LANGUAGE: Final[istr] = istr("Accept-Language") ACCEPT_RANGES: Final[istr] = istr("Accept-Ranges") ACCESS_CONTROL_MAX_AGE: Final[istr] = istr("Access-Control-Max-Age") ACCESS_CONTROL_ALLOW_CREDENTIALS: Final[istr] = istr("Access-Control-Allow-Credentials") ACCESS_CONTROL_ALLOW_HEADERS: Final[istr] = istr("Access-Control-Allow-Headers") ACCESS_CONTROL_ALLOW_METHODS: Final[istr] = istr("Access-Control-Allow-Methods") ACCESS_CONTROL_ALLOW_ORIGIN: Final[istr] = istr("Access-Control-Allow-Origin") ACCESS_CONTROL_EXPOSE_HEADERS: Final[istr] = istr("Access-Control-Expose-Headers") ACCESS_CONTROL_REQUEST_HEADERS: Final[istr] = istr("Access-Control-Request-Headers") ACCESS_CONTROL_REQUEST_METHOD: Final[istr] = istr("Access-Control-Request-Method") AGE: Final[istr] = istr("Age") ALLOW: Final[istr] = istr("Allow") AUTHORIZATION: Final[istr] = istr("Authorization") CACHE_CONTROL: Final[istr] = istr("Cache-Control") CONNECTION: Final[istr] = istr("Connection") CONTENT_DISPOSITION: Final[istr] = istr("Content-Disposition") CONTENT_ENCODING: Final[istr] = istr("Content-Encoding") CONTENT_LANGUAGE: Final[istr] = istr("Content-Language") CONTENT_LENGTH: Final[istr] = istr("Content-Length") CONTENT_LOCATION: Final[istr] = istr("Content-Location") CONTENT_MD5: Final[istr] = istr("Content-MD5") CONTENT_RANGE: Final[istr] = istr("Content-Range") CONTENT_TRANSFER_ENCODING: Final[istr] = istr("Content-Transfer-Encoding") CONTENT_TYPE: Final[istr] = istr("Content-Type") COOKIE: Final[istr] = istr("Cookie") DATE: Final[istr] = istr("Date") DESTINATION: Final[istr] = istr("Destination") DIGEST: Final[istr] = istr("Digest") ETAG: Final[istr] = istr("Etag") EXPECT: Final[istr] = istr("Expect") EXPIRES: Final[istr] = istr("Expires") FORWARDED: Final[istr] = istr("Forwarded") FROM: Final[istr] = istr("From") HOST: Final[istr] = istr("Host") IF_MATCH: Final[istr] = istr("If-Match") IF_MODIFIED_SINCE: Final[istr] = istr("If-Modified-Since") IF_NONE_MATCH: Final[istr] = istr("If-None-Match") IF_RANGE: Final[istr] = istr("If-Range") IF_UNMODIFIED_SINCE: Final[istr] = istr("If-Unmodified-Since") KEEP_ALIVE: Final[istr] = istr("Keep-Alive") LAST_EVENT_ID: Final[istr] = istr("Last-Event-ID") LAST_MODIFIED: Final[istr] = istr("Last-Modified") LINK: Final[istr] = istr("Link") LOCATION: Final[istr] = istr("Location") MAX_FORWARDS: Final[istr] = istr("Max-Forwards") ORIGIN: Final[istr] = istr("Origin") PRAGMA: Final[istr] = istr("Pragma") PROXY_AUTHENTICATE: Final[istr] = istr("Proxy-Authenticate") PROXY_AUTHORIZATION: Final[istr] = istr("Proxy-Authorization") RANGE: Final[istr] = istr("Range") REFERER: Final[istr] = istr("Referer") RETRY_AFTER: Final[istr] = istr("Retry-After") SEC_WEBSOCKET_ACCEPT: Final[istr] = istr("Sec-WebSocket-Accept") SEC_WEBSOCKET_VERSION: Final[istr] = istr("Sec-WebSocket-Version") SEC_WEBSOCKET_PROTOCOL: Final[istr] = istr("Sec-WebSocket-Protocol") SEC_WEBSOCKET_EXTENSIONS: Final[istr] = istr("Sec-WebSocket-Extensions") SEC_WEBSOCKET_KEY: Final[istr] = istr("Sec-WebSocket-Key") SEC_WEBSOCKET_KEY1: Final[istr] = istr("Sec-WebSocket-Key1") SERVER: Final[istr] = istr("Server") SET_COOKIE: Final[istr] = istr("Set-Cookie") TE: Final[istr] = istr("TE") TRAILER: Final[istr] = istr("Trailer") TRANSFER_ENCODING: Final[istr] = istr("Transfer-Encoding") UPGRADE: Final[istr] = istr("Upgrade") URI: Final[istr] = istr("URI") USER_AGENT: Final[istr] = istr("User-Agent") VARY: Final[istr] = istr("Vary") VIA: Final[istr] = istr("Via") WANT_DIGEST: Final[istr] = istr("Want-Digest") WARNING: Final[istr] = istr("Warning") WWW_AUTHENTICATE: Final[istr] = istr("WWW-Authenticate") X_FORWARDED_FOR: Final[istr] = istr("X-Forwarded-For") X_FORWARDED_HOST: Final[istr] = istr("X-Forwarded-Host") X_FORWARDED_PROTO: Final[istr] = istr("X-Forwarded-Proto") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/helpers.py0000644000175100001770000007441414607525266016320 0ustar00runnerdocker"""Various helper functions""" import asyncio import base64 import binascii import contextlib import datetime import enum import functools import inspect import netrc import os import platform import re import sys import time import warnings import weakref from collections import namedtuple from contextlib import suppress from email.parser import HeaderParser from email.utils import parsedate from math import ceil from pathlib import Path from types import TracebackType from typing import ( Any, Callable, ContextManager, Dict, Generator, Generic, Iterable, Iterator, List, Mapping, Optional, Pattern, Protocol, Tuple, Type, TypeVar, Union, get_args, overload, ) from urllib.parse import quote from urllib.request import getproxies, proxy_bypass import attr from multidict import MultiDict, MultiDictProxy, MultiMapping from yarl import URL from . import hdrs from .log import client_logger, internal_logger if sys.version_info >= (3, 11): import asyncio as async_timeout else: import async_timeout __all__ = ("BasicAuth", "ChainMapProxy", "ETag") IS_MACOS = platform.system() == "Darwin" IS_WINDOWS = platform.system() == "Windows" PY_310 = sys.version_info >= (3, 10) PY_311 = sys.version_info >= (3, 11) _T = TypeVar("_T") _S = TypeVar("_S") _SENTINEL = enum.Enum("_SENTINEL", "sentinel") sentinel = _SENTINEL.sentinel NO_EXTENSIONS = bool(os.environ.get("AIOHTTP_NO_EXTENSIONS")) DEBUG = sys.flags.dev_mode or ( not sys.flags.ignore_environment and bool(os.environ.get("PYTHONASYNCIODEBUG")) ) CHAR = {chr(i) for i in range(0, 128)} CTL = {chr(i) for i in range(0, 32)} | { chr(127), } SEPARATORS = { "(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}", " ", chr(9), } TOKEN = CHAR ^ CTL ^ SEPARATORS class noop: def __await__(self) -> Generator[None, None, None]: yield class BasicAuth(namedtuple("BasicAuth", ["login", "password", "encoding"])): """Http basic authentication helper.""" def __new__( cls, login: str, password: str = "", encoding: str = "latin1" ) -> "BasicAuth": if login is None: raise ValueError("None is not allowed as login value") if password is None: raise ValueError("None is not allowed as password value") if ":" in login: raise ValueError('A ":" is not allowed in login (RFC 1945#section-11.1)') return super().__new__(cls, login, password, encoding) @classmethod def decode(cls, auth_header: str, encoding: str = "latin1") -> "BasicAuth": """Create a BasicAuth object from an Authorization HTTP header.""" try: auth_type, encoded_credentials = auth_header.split(" ", 1) except ValueError: raise ValueError("Could not parse authorization header.") if auth_type.lower() != "basic": raise ValueError("Unknown authorization method %s" % auth_type) try: decoded = base64.b64decode( encoded_credentials.encode("ascii"), validate=True ).decode(encoding) except binascii.Error: raise ValueError("Invalid base64 encoding.") try: # RFC 2617 HTTP Authentication # https://www.ietf.org/rfc/rfc2617.txt # the colon must be present, but the username and password may be # otherwise blank. username, password = decoded.split(":", 1) except ValueError: raise ValueError("Invalid credentials.") return cls(username, password, encoding=encoding) @classmethod def from_url(cls, url: URL, *, encoding: str = "latin1") -> Optional["BasicAuth"]: """Create BasicAuth from url.""" if not isinstance(url, URL): raise TypeError("url should be yarl.URL instance") if url.user is None: return None return cls(url.user, url.password or "", encoding=encoding) def encode(self) -> str: """Encode credentials.""" creds = (f"{self.login}:{self.password}").encode(self.encoding) return "Basic %s" % base64.b64encode(creds).decode(self.encoding) def strip_auth_from_url(url: URL) -> Tuple[URL, Optional[BasicAuth]]: auth = BasicAuth.from_url(url) if auth is None: return url, None else: return url.with_user(None), auth def netrc_from_env() -> Optional[netrc.netrc]: """Load netrc from file. Attempt to load it from the path specified by the env-var NETRC or in the default location in the user's home directory. Returns None if it couldn't be found or fails to parse. """ netrc_env = os.environ.get("NETRC") if netrc_env is not None: netrc_path = Path(netrc_env) else: try: home_dir = Path.home() except RuntimeError as e: # pragma: no cover # if pathlib can't resolve home, it may raise a RuntimeError client_logger.debug( "Could not resolve home directory when " "trying to look for .netrc file: %s", e, ) return None netrc_path = home_dir / ("_netrc" if IS_WINDOWS else ".netrc") try: return netrc.netrc(str(netrc_path)) except netrc.NetrcParseError as e: client_logger.warning("Could not parse .netrc file: %s", e) except OSError as e: netrc_exists = False with contextlib.suppress(OSError): netrc_exists = netrc_path.is_file() # we couldn't read the file (doesn't exist, permissions, etc.) if netrc_env or netrc_exists: # only warn if the environment wanted us to load it, # or it appears like the default file does actually exist client_logger.warning("Could not read .netrc file: %s", e) return None @attr.s(auto_attribs=True, frozen=True, slots=True) class ProxyInfo: proxy: URL proxy_auth: Optional[BasicAuth] def basicauth_from_netrc(netrc_obj: Optional[netrc.netrc], host: str) -> BasicAuth: """ Return :py:class:`~aiohttp.BasicAuth` credentials for ``host`` from ``netrc_obj``. :raises LookupError: if ``netrc_obj`` is :py:data:`None` or if no entry is found for the ``host``. """ if netrc_obj is None: raise LookupError("No .netrc file found") auth_from_netrc = netrc_obj.authenticators(host) if auth_from_netrc is None: raise LookupError(f"No entry for {host!s} found in the `.netrc` file.") login, account, password = auth_from_netrc # TODO(PY311): username = login or account # Up to python 3.10, account could be None if not specified, # and login will be empty string if not specified. From 3.11, # login and account will be empty string if not specified. username = login if (login or account is None) else account # TODO(PY311): Remove this, as password will be empty string # if not specified if password is None: password = "" return BasicAuth(username, password) def proxies_from_env() -> Dict[str, ProxyInfo]: proxy_urls = { k: URL(v) for k, v in getproxies().items() if k in ("http", "https", "ws", "wss") } netrc_obj = netrc_from_env() stripped = {k: strip_auth_from_url(v) for k, v in proxy_urls.items()} ret = {} for proto, val in stripped.items(): proxy, auth = val if proxy.scheme in ("https", "wss"): client_logger.warning( "%s proxies %s are not supported, ignoring", proxy.scheme.upper(), proxy ) continue if netrc_obj and auth is None: if proxy.host is not None: try: auth = basicauth_from_netrc(netrc_obj, proxy.host) except LookupError: auth = None ret[proto] = ProxyInfo(proxy, auth) return ret def current_task( loop: Optional[asyncio.AbstractEventLoop] = None, ) -> "Optional[asyncio.Task[Any]]": return asyncio.current_task(loop=loop) def get_running_loop( loop: Optional[asyncio.AbstractEventLoop] = None, ) -> asyncio.AbstractEventLoop: if loop is None: loop = asyncio.get_event_loop() if not loop.is_running(): warnings.warn( "The object should be created within an async function", DeprecationWarning, stacklevel=3, ) if loop.get_debug(): internal_logger.warning( "The object should be created within an async function", stack_info=True ) return loop def isasyncgenfunction(obj: Any) -> bool: func = getattr(inspect, "isasyncgenfunction", None) if func is not None: return func(obj) # type: ignore[no-any-return] else: return False def get_env_proxy_for_url(url: URL) -> Tuple[URL, Optional[BasicAuth]]: """Get a permitted proxy for the given URL from the env.""" if url.host is not None and proxy_bypass(url.host): raise LookupError(f"Proxying is disallowed for `{url.host!r}`") proxies_in_env = proxies_from_env() try: proxy_info = proxies_in_env[url.scheme] except KeyError: raise LookupError(f"No proxies found for `{url!s}` in the env") else: return proxy_info.proxy, proxy_info.proxy_auth @attr.s(auto_attribs=True, frozen=True, slots=True) class MimeType: type: str subtype: str suffix: str parameters: "MultiDictProxy[str]" @functools.lru_cache(maxsize=56) def parse_mimetype(mimetype: str) -> MimeType: """Parses a MIME type into its components. mimetype is a MIME type string. Returns a MimeType object. Example: >>> parse_mimetype('text/html; charset=utf-8') MimeType(type='text', subtype='html', suffix='', parameters={'charset': 'utf-8'}) """ if not mimetype: return MimeType( type="", subtype="", suffix="", parameters=MultiDictProxy(MultiDict()) ) parts = mimetype.split(";") params: MultiDict[str] = MultiDict() for item in parts[1:]: if not item: continue key, _, value = item.partition("=") params.add(key.lower().strip(), value.strip(' "')) fulltype = parts[0].strip().lower() if fulltype == "*": fulltype = "*/*" mtype, _, stype = fulltype.partition("/") stype, _, suffix = stype.partition("+") return MimeType( type=mtype, subtype=stype, suffix=suffix, parameters=MultiDictProxy(params) ) def guess_filename(obj: Any, default: Optional[str] = None) -> Optional[str]: name = getattr(obj, "name", None) if name and isinstance(name, str) and name[0] != "<" and name[-1] != ">": return Path(name).name return default not_qtext_re = re.compile(r"[^\041\043-\133\135-\176]") QCONTENT = {chr(i) for i in range(0x20, 0x7F)} | {"\t"} def quoted_string(content: str) -> str: """Return 7-bit content as quoted-string. Format content into a quoted-string as defined in RFC5322 for Internet Message Format. Notice that this is not the 8-bit HTTP format, but the 7-bit email format. Content must be in usascii or a ValueError is raised. """ if not (QCONTENT > set(content)): raise ValueError(f"bad content for quoted-string {content!r}") return not_qtext_re.sub(lambda x: "\\" + x.group(0), content) def content_disposition_header( disptype: str, quote_fields: bool = True, _charset: str = "utf-8", **params: str ) -> str: """Sets ``Content-Disposition`` header for MIME. This is the MIME payload Content-Disposition header from RFC 2183 and RFC 7579 section 4.2, not the HTTP Content-Disposition from RFC 6266. disptype is a disposition type: inline, attachment, form-data. Should be valid extension token (see RFC 2183) quote_fields performs value quoting to 7-bit MIME headers according to RFC 7578. Set to quote_fields to False if recipient can take 8-bit file names and field values. _charset specifies the charset to use when quote_fields is True. params is a dict with disposition params. """ if not disptype or not (TOKEN > set(disptype)): raise ValueError("bad content disposition type {!r}" "".format(disptype)) value = disptype if params: lparams = [] for key, val in params.items(): if not key or not (TOKEN > set(key)): raise ValueError( "bad content disposition parameter" " {!r}={!r}".format(key, val) ) if quote_fields: if key.lower() == "filename": qval = quote(val, "", encoding=_charset) lparams.append((key, '"%s"' % qval)) else: try: qval = quoted_string(val) except ValueError: qval = "".join( (_charset, "''", quote(val, "", encoding=_charset)) ) lparams.append((key + "*", qval)) else: lparams.append((key, '"%s"' % qval)) else: qval = val.replace("\\", "\\\\").replace('"', '\\"') lparams.append((key, '"%s"' % qval)) sparams = "; ".join("=".join(pair) for pair in lparams) value = "; ".join((value, sparams)) return value class _TSelf(Protocol, Generic[_T]): _cache: Dict[str, _T] class reify(Generic[_T]): """Use as a class method decorator. It operates almost exactly like the Python `@property` decorator, but it puts the result of the method it decorates into the instance dict after the first call, effectively replacing the function it decorates with an instance variable. It is, in Python parlance, a data descriptor. """ def __init__(self, wrapped: Callable[..., _T]) -> None: self.wrapped = wrapped self.__doc__ = wrapped.__doc__ self.name = wrapped.__name__ def __get__(self, inst: _TSelf[_T], owner: Optional[Type[Any]] = None) -> _T: try: try: return inst._cache[self.name] except KeyError: val = self.wrapped(inst) inst._cache[self.name] = val return val except AttributeError: if inst is None: return self raise def __set__(self, inst: _TSelf[_T], value: _T) -> None: raise AttributeError("reified property is read-only") reify_py = reify try: from ._helpers import reify as reify_c if not NO_EXTENSIONS: reify = reify_c # type: ignore[misc,assignment] except ImportError: pass _ipv4_pattern = ( r"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}" r"(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$" ) _ipv6_pattern = ( r"^(?:(?:(?:[A-F0-9]{1,4}:){6}|(?=(?:[A-F0-9]{0,4}:){0,6}" r"(?:[0-9]{1,3}\.){3}[0-9]{1,3}$)(([0-9A-F]{1,4}:){0,5}|:)" r"((:[0-9A-F]{1,4}){1,5}:|:)|::(?:[A-F0-9]{1,4}:){5})" r"(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}" r"(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])|(?:[A-F0-9]{1,4}:){7}" r"[A-F0-9]{1,4}|(?=(?:[A-F0-9]{0,4}:){0,7}[A-F0-9]{0,4}$)" r"(([0-9A-F]{1,4}:){1,7}|:)((:[0-9A-F]{1,4}){1,7}|:)|(?:[A-F0-9]{1,4}:){7}" r":|:(:[A-F0-9]{1,4}){7})$" ) _ipv4_regex = re.compile(_ipv4_pattern) _ipv6_regex = re.compile(_ipv6_pattern, flags=re.IGNORECASE) _ipv4_regexb = re.compile(_ipv4_pattern.encode("ascii")) _ipv6_regexb = re.compile(_ipv6_pattern.encode("ascii"), flags=re.IGNORECASE) def _is_ip_address( regex: Pattern[str], regexb: Pattern[bytes], host: Optional[Union[str, bytes]] ) -> bool: if host is None: return False if isinstance(host, str): return bool(regex.match(host)) elif isinstance(host, (bytes, bytearray, memoryview)): return bool(regexb.match(host)) else: raise TypeError(f"{host} [{type(host)}] is not a str or bytes") is_ipv4_address = functools.partial(_is_ip_address, _ipv4_regex, _ipv4_regexb) is_ipv6_address = functools.partial(_is_ip_address, _ipv6_regex, _ipv6_regexb) def is_ip_address(host: Optional[Union[str, bytes, bytearray, memoryview]]) -> bool: return is_ipv4_address(host) or is_ipv6_address(host) _cached_current_datetime: Optional[int] = None _cached_formatted_datetime = "" def rfc822_formatted_time() -> str: global _cached_current_datetime global _cached_formatted_datetime now = int(time.time()) if now != _cached_current_datetime: # Weekday and month names for HTTP date/time formatting; # always English! # Tuples are constants stored in codeobject! _weekdayname = ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun") _monthname = ( "", # Dummy so we can use 1-based month numbers "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ) year, month, day, hh, mm, ss, wd, *tail = time.gmtime(now) _cached_formatted_datetime = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % ( _weekdayname[wd], day, _monthname[month], year, hh, mm, ss, ) _cached_current_datetime = now return _cached_formatted_datetime def _weakref_handle(info: "Tuple[weakref.ref[object], str]") -> None: ref, name = info ob = ref() if ob is not None: with suppress(Exception): getattr(ob, name)() def weakref_handle( ob: object, name: str, timeout: float, loop: asyncio.AbstractEventLoop, timeout_ceil_threshold: float = 5, ) -> Optional[asyncio.TimerHandle]: if timeout is not None and timeout > 0: when = loop.time() + timeout if timeout >= timeout_ceil_threshold: when = ceil(when) return loop.call_at(when, _weakref_handle, (weakref.ref(ob), name)) return None def call_later( cb: Callable[[], Any], timeout: float, loop: asyncio.AbstractEventLoop, timeout_ceil_threshold: float = 5, ) -> Optional[asyncio.TimerHandle]: if timeout is not None and timeout > 0: when = loop.time() + timeout if timeout > timeout_ceil_threshold: when = ceil(when) return loop.call_at(when, cb) return None class TimeoutHandle: """Timeout handle""" def __init__( self, loop: asyncio.AbstractEventLoop, timeout: Optional[float], ceil_threshold: float = 5, ) -> None: self._timeout = timeout self._loop = loop self._ceil_threshold = ceil_threshold self._callbacks: List[ Tuple[Callable[..., None], Tuple[Any, ...], Dict[str, Any]] ] = [] def register( self, callback: Callable[..., None], *args: Any, **kwargs: Any ) -> None: self._callbacks.append((callback, args, kwargs)) def close(self) -> None: self._callbacks.clear() def start(self) -> Optional[asyncio.Handle]: timeout = self._timeout if timeout is not None and timeout > 0: when = self._loop.time() + timeout if timeout >= self._ceil_threshold: when = ceil(when) return self._loop.call_at(when, self.__call__) else: return None def timer(self) -> "BaseTimerContext": if self._timeout is not None and self._timeout > 0: timer = TimerContext(self._loop) self.register(timer.timeout) return timer else: return TimerNoop() def __call__(self) -> None: for cb, args, kwargs in self._callbacks: with suppress(Exception): cb(*args, **kwargs) self._callbacks.clear() class BaseTimerContext(ContextManager["BaseTimerContext"]): def assert_timeout(self) -> None: """Raise TimeoutError if timeout has been exceeded.""" class TimerNoop(BaseTimerContext): def __enter__(self) -> BaseTimerContext: return self def __exit__( self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType], ) -> None: return class TimerContext(BaseTimerContext): """Low resolution timeout context manager""" def __init__(self, loop: asyncio.AbstractEventLoop) -> None: self._loop = loop self._tasks: List[asyncio.Task[Any]] = [] self._cancelled = False def assert_timeout(self) -> None: """Raise TimeoutError if timer has already been cancelled.""" if self._cancelled: raise asyncio.TimeoutError from None def __enter__(self) -> BaseTimerContext: task = current_task(loop=self._loop) if task is None: raise RuntimeError( "Timeout context manager should be used " "inside a task" ) if self._cancelled: raise asyncio.TimeoutError from None self._tasks.append(task) return self def __exit__( self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType], ) -> Optional[bool]: if self._tasks: self._tasks.pop() if exc_type is asyncio.CancelledError and self._cancelled: raise asyncio.TimeoutError from None return None def timeout(self) -> None: if not self._cancelled: for task in set(self._tasks): task.cancel() self._cancelled = True def ceil_timeout( delay: Optional[float], ceil_threshold: float = 5 ) -> async_timeout.Timeout: if delay is None or delay <= 0: return async_timeout.timeout(None) loop = get_running_loop() now = loop.time() when = now + delay if delay > ceil_threshold: when = ceil(when) return async_timeout.timeout_at(when) class HeadersMixin: ATTRS = frozenset(["_content_type", "_content_dict", "_stored_content_type"]) _headers: MultiMapping[str] _content_type: Optional[str] = None _content_dict: Optional[Dict[str, str]] = None _stored_content_type: Union[str, None, _SENTINEL] = sentinel def _parse_content_type(self, raw: Optional[str]) -> None: self._stored_content_type = raw if raw is None: # default value according to RFC 2616 self._content_type = "application/octet-stream" self._content_dict = {} else: msg = HeaderParser().parsestr("Content-Type: " + raw) self._content_type = msg.get_content_type() params = msg.get_params(()) self._content_dict = dict(params[1:]) # First element is content type again @property def content_type(self) -> str: """The value of content part for Content-Type HTTP header.""" raw = self._headers.get(hdrs.CONTENT_TYPE) if self._stored_content_type != raw: self._parse_content_type(raw) return self._content_type # type: ignore[return-value] @property def charset(self) -> Optional[str]: """The value of charset part for Content-Type HTTP header.""" raw = self._headers.get(hdrs.CONTENT_TYPE) if self._stored_content_type != raw: self._parse_content_type(raw) return self._content_dict.get("charset") # type: ignore[union-attr] @property def content_length(self) -> Optional[int]: """The value of Content-Length HTTP header.""" content_length = self._headers.get(hdrs.CONTENT_LENGTH) if content_length is not None: return int(content_length) else: return None def set_result(fut: "asyncio.Future[_T]", result: _T) -> None: if not fut.done(): fut.set_result(result) _EXC_SENTINEL = BaseException() class ErrorableProtocol(Protocol): def set_exception( self, exc: BaseException, exc_cause: BaseException = ..., ) -> None: ... # pragma: no cover def set_exception( fut: "asyncio.Future[_T] | ErrorableProtocol", exc: BaseException, exc_cause: BaseException = _EXC_SENTINEL, ) -> None: """Set future exception. If the future is marked as complete, this function is a no-op. :param exc_cause: An exception that is a direct cause of ``exc``. Only set if provided. """ if asyncio.isfuture(fut) and fut.done(): return exc_is_sentinel = exc_cause is _EXC_SENTINEL exc_causes_itself = exc is exc_cause if not exc_is_sentinel and not exc_causes_itself: exc.__cause__ = exc_cause fut.set_exception(exc) @functools.total_ordering class AppKey(Generic[_T]): """Keys for static typing support in Application.""" __slots__ = ("_name", "_t", "__orig_class__") # This may be set by Python when instantiating with a generic type. We need to # support this, in order to support types that are not concrete classes, # like Iterable, which can't be passed as the second parameter to __init__. __orig_class__: Type[object] def __init__(self, name: str, t: Optional[Type[_T]] = None): # Prefix with module name to help deduplicate key names. frame = inspect.currentframe() while frame: if frame.f_code.co_name == "": module: str = frame.f_globals["__name__"] break frame = frame.f_back self._name = module + "." + name self._t = t def __lt__(self, other: object) -> bool: if isinstance(other, AppKey): return self._name < other._name return True # Order AppKey above other types. def __repr__(self) -> str: t = self._t if t is None: with suppress(AttributeError): # Set to type arg. t = get_args(self.__orig_class__)[0] if t is None: t_repr = "<>" elif isinstance(t, type): if t.__module__ == "builtins": t_repr = t.__qualname__ else: t_repr = f"{t.__module__}.{t.__qualname__}" else: t_repr = repr(t) return f"" class ChainMapProxy(Mapping[Union[str, AppKey[Any]], Any]): __slots__ = ("_maps",) def __init__(self, maps: Iterable[Mapping[Union[str, AppKey[Any]], Any]]) -> None: self._maps = tuple(maps) def __init_subclass__(cls) -> None: raise TypeError( "Inheritance class {} from ChainMapProxy " "is forbidden".format(cls.__name__) ) @overload # type: ignore[override] def __getitem__(self, key: AppKey[_T]) -> _T: ... @overload def __getitem__(self, key: str) -> Any: ... def __getitem__(self, key: Union[str, AppKey[_T]]) -> Any: for mapping in self._maps: try: return mapping[key] except KeyError: pass raise KeyError(key) @overload # type: ignore[override] def get(self, key: AppKey[_T], default: _S) -> Union[_T, _S]: ... @overload def get(self, key: AppKey[_T], default: None = ...) -> Optional[_T]: ... @overload def get(self, key: str, default: Any = ...) -> Any: ... def get(self, key: Union[str, AppKey[_T]], default: Any = None) -> Any: try: return self[key] except KeyError: return default def __len__(self) -> int: # reuses stored hash values if possible return len(set().union(*self._maps)) def __iter__(self) -> Iterator[Union[str, AppKey[Any]]]: d: Dict[Union[str, AppKey[Any]], Any] = {} for mapping in reversed(self._maps): # reuses stored hash values if possible d.update(mapping) return iter(d) def __contains__(self, key: object) -> bool: return any(key in m for m in self._maps) def __bool__(self) -> bool: return any(self._maps) def __repr__(self) -> str: content = ", ".join(map(repr, self._maps)) return f"ChainMapProxy({content})" # https://tools.ietf.org/html/rfc7232#section-2.3 _ETAGC = r"[!\x23-\x7E\x80-\xff]+" _ETAGC_RE = re.compile(_ETAGC) _QUOTED_ETAG = rf'(W/)?"({_ETAGC})"' QUOTED_ETAG_RE = re.compile(_QUOTED_ETAG) LIST_QUOTED_ETAG_RE = re.compile(rf"({_QUOTED_ETAG})(?:\s*,\s*|$)|(.)") ETAG_ANY = "*" @attr.s(auto_attribs=True, frozen=True, slots=True) class ETag: value: str is_weak: bool = False def validate_etag_value(value: str) -> None: if value != ETAG_ANY and not _ETAGC_RE.fullmatch(value): raise ValueError( f"Value {value!r} is not a valid etag. Maybe it contains '\"'?" ) def parse_http_date(date_str: Optional[str]) -> Optional[datetime.datetime]: """Process a date string, return a datetime object""" if date_str is not None: timetuple = parsedate(date_str) if timetuple is not None: with suppress(ValueError): return datetime.datetime(*timetuple[:6], tzinfo=datetime.timezone.utc) return None def must_be_empty_body(method: str, code: int) -> bool: """Check if a request must return an empty body.""" return ( status_code_must_be_empty_body(code) or method_must_be_empty_body(method) or (200 <= code < 300 and method.upper() == hdrs.METH_CONNECT) ) def method_must_be_empty_body(method: str) -> bool: """Check if a method must return an empty body.""" # https://datatracker.ietf.org/doc/html/rfc9112#section-6.3-2.1 # https://datatracker.ietf.org/doc/html/rfc9112#section-6.3-2.2 return method.upper() == hdrs.METH_HEAD def status_code_must_be_empty_body(code: int) -> bool: """Check if a status code must return an empty body.""" # https://datatracker.ietf.org/doc/html/rfc9112#section-6.3-2.1 return code in {204, 304} or 100 <= code < 200 def should_remove_content_length(method: str, code: int) -> bool: """Check if a Content-Length header should be removed. This should always be a subset of must_be_empty_body """ # https://www.rfc-editor.org/rfc/rfc9110.html#section-8.6-8 # https://www.rfc-editor.org/rfc/rfc9110.html#section-15.4.5-4 return ( code in {204, 304} or 100 <= code < 200 or (200 <= code < 300 and method.upper() == hdrs.METH_CONNECT) ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/http.py0000644000175100001770000000346214607525266015630 0ustar00runnerdockerimport sys from http import HTTPStatus from typing import Mapping, Tuple from . import __version__ from .http_exceptions import HttpProcessingError as HttpProcessingError from .http_parser import ( HeadersParser as HeadersParser, HttpParser as HttpParser, HttpRequestParser as HttpRequestParser, HttpResponseParser as HttpResponseParser, RawRequestMessage as RawRequestMessage, RawResponseMessage as RawResponseMessage, ) from .http_websocket import ( WS_CLOSED_MESSAGE as WS_CLOSED_MESSAGE, WS_CLOSING_MESSAGE as WS_CLOSING_MESSAGE, WS_KEY as WS_KEY, WebSocketError as WebSocketError, WebSocketReader as WebSocketReader, WebSocketWriter as WebSocketWriter, WSCloseCode as WSCloseCode, WSMessage as WSMessage, WSMsgType as WSMsgType, ws_ext_gen as ws_ext_gen, ws_ext_parse as ws_ext_parse, ) from .http_writer import ( HttpVersion as HttpVersion, HttpVersion10 as HttpVersion10, HttpVersion11 as HttpVersion11, StreamWriter as StreamWriter, ) __all__ = ( "HttpProcessingError", "RESPONSES", "SERVER_SOFTWARE", # .http_writer "StreamWriter", "HttpVersion", "HttpVersion10", "HttpVersion11", # .http_parser "HeadersParser", "HttpParser", "HttpRequestParser", "HttpResponseParser", "RawRequestMessage", "RawResponseMessage", # .http_websocket "WS_CLOSED_MESSAGE", "WS_CLOSING_MESSAGE", "WS_KEY", "WebSocketReader", "WebSocketWriter", "ws_ext_gen", "ws_ext_parse", "WSMessage", "WebSocketError", "WSMsgType", "WSCloseCode", ) SERVER_SOFTWARE: str = "Python/{0[0]}.{0[1]} aiohttp/{1}".format( sys.version_info, __version__ ) RESPONSES: Mapping[int, Tuple[str, str]] = { v: (v.phrase, v.description) for v in HTTPStatus.__members__.values() } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/http_exceptions.py0000644000175100001770000000523414607525266020070 0ustar00runnerdocker"""Low-level http related exceptions.""" from textwrap import indent from typing import Optional, Union from .typedefs import _CIMultiDict __all__ = ("HttpProcessingError",) class HttpProcessingError(Exception): """HTTP error. Shortcut for raising HTTP errors with custom code, message and headers. code: HTTP Error code. message: (optional) Error message. headers: (optional) Headers to be sent in response, a list of pairs """ code = 0 message = "" headers = None def __init__( self, *, code: Optional[int] = None, message: str = "", headers: Optional[_CIMultiDict] = None, ) -> None: if code is not None: self.code = code self.headers = headers self.message = message def __str__(self) -> str: msg = indent(self.message, " ") return f"{self.code}, message:\n{msg}" def __repr__(self) -> str: return f"<{self.__class__.__name__}: {self.code}, message={self.message!r}>" class BadHttpMessage(HttpProcessingError): code = 400 message = "Bad Request" def __init__(self, message: str, *, headers: Optional[_CIMultiDict] = None) -> None: super().__init__(message=message, headers=headers) self.args = (message,) class HttpBadRequest(BadHttpMessage): code = 400 message = "Bad Request" class PayloadEncodingError(BadHttpMessage): """Base class for payload errors""" class ContentEncodingError(PayloadEncodingError): """Content encoding error.""" class TransferEncodingError(PayloadEncodingError): """transfer encoding error.""" class ContentLengthError(PayloadEncodingError): """Not enough data for satisfy content length header.""" class LineTooLong(BadHttpMessage): def __init__( self, line: str, limit: str = "Unknown", actual_size: str = "Unknown" ) -> None: super().__init__( f"Got more than {limit} bytes ({actual_size}) when reading {line}." ) self.args = (line, limit, actual_size) class InvalidHeader(BadHttpMessage): def __init__(self, hdr: Union[bytes, str]) -> None: hdr_s = hdr.decode(errors="backslashreplace") if isinstance(hdr, bytes) else hdr super().__init__(f"Invalid HTTP header: {hdr!r}") self.hdr = hdr_s self.args = (hdr,) class BadStatusLine(BadHttpMessage): def __init__(self, line: str = "", error: Optional[str] = None) -> None: if not isinstance(line, str): line = repr(line) super().__init__(error or f"Bad status line {line!r}") self.args = (line,) self.line = line class InvalidURLError(BadHttpMessage): pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/http_parser.py0000644000175100001770000010723314607525266017205 0ustar00runnerdockerimport abc import asyncio import re import string from contextlib import suppress from enum import IntEnum from typing import ( Any, ClassVar, Final, Generic, List, Literal, NamedTuple, Optional, Pattern, Set, Tuple, Type, TypeVar, Union, ) from multidict import CIMultiDict, CIMultiDictProxy, istr from yarl import URL from . import hdrs from .base_protocol import BaseProtocol from .compression_utils import HAS_BROTLI, BrotliDecompressor, ZLibDecompressor from .helpers import ( _EXC_SENTINEL, DEBUG, NO_EXTENSIONS, BaseTimerContext, method_must_be_empty_body, set_exception, status_code_must_be_empty_body, ) from .http_exceptions import ( BadHttpMessage, BadStatusLine, ContentEncodingError, ContentLengthError, InvalidHeader, InvalidURLError, LineTooLong, TransferEncodingError, ) from .http_writer import HttpVersion, HttpVersion10 from .log import internal_logger from .streams import EMPTY_PAYLOAD, StreamReader from .typedefs import RawHeaders __all__ = ( "HeadersParser", "HttpParser", "HttpRequestParser", "HttpResponseParser", "RawRequestMessage", "RawResponseMessage", ) _SEP = Literal[b"\r\n", b"\n"] ASCIISET: Final[Set[str]] = set(string.printable) # See https://www.rfc-editor.org/rfc/rfc9110.html#name-overview # and https://www.rfc-editor.org/rfc/rfc9110.html#name-tokens # # method = token # tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / # "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA # token = 1*tchar _TCHAR_SPECIALS: Final[str] = re.escape("!#$%&'*+-.^_`|~") TOKENRE: Final[Pattern[str]] = re.compile(f"[0-9A-Za-z{_TCHAR_SPECIALS}]+") VERSRE: Final[Pattern[str]] = re.compile(r"HTTP/(\d)\.(\d)", re.ASCII) DIGITS: Final[Pattern[str]] = re.compile(r"\d+", re.ASCII) HEXDIGITS: Final[Pattern[bytes]] = re.compile(rb"[0-9a-fA-F]+") class RawRequestMessage(NamedTuple): method: str path: str version: HttpVersion headers: "CIMultiDictProxy[str]" raw_headers: RawHeaders should_close: bool compression: Optional[str] upgrade: bool chunked: bool url: URL class RawResponseMessage(NamedTuple): version: HttpVersion code: int reason: str headers: CIMultiDictProxy[str] raw_headers: RawHeaders should_close: bool compression: Optional[str] upgrade: bool chunked: bool _MsgT = TypeVar("_MsgT", RawRequestMessage, RawResponseMessage) class ParseState(IntEnum): PARSE_NONE = 0 PARSE_LENGTH = 1 PARSE_CHUNKED = 2 PARSE_UNTIL_EOF = 3 class ChunkState(IntEnum): PARSE_CHUNKED_SIZE = 0 PARSE_CHUNKED_CHUNK = 1 PARSE_CHUNKED_CHUNK_EOF = 2 PARSE_MAYBE_TRAILERS = 3 PARSE_TRAILERS = 4 class HeadersParser: def __init__( self, max_line_size: int = 8190, max_headers: int = 32768, max_field_size: int = 8190, lax: bool = False, ) -> None: self.max_line_size = max_line_size self.max_headers = max_headers self.max_field_size = max_field_size self._lax = lax def parse_headers( self, lines: List[bytes] ) -> Tuple["CIMultiDictProxy[str]", RawHeaders]: headers: CIMultiDict[str] = CIMultiDict() # note: "raw" does not mean inclusion of OWS before/after the field value raw_headers = [] lines_idx = 1 line = lines[1] line_count = len(lines) while line: # Parse initial header name : value pair. try: bname, bvalue = line.split(b":", 1) except ValueError: raise InvalidHeader(line) from None if len(bname) == 0: raise InvalidHeader(bname) # https://www.rfc-editor.org/rfc/rfc9112.html#section-5.1-2 if {bname[0], bname[-1]} & {32, 9}: # {" ", "\t"} raise InvalidHeader(line) bvalue = bvalue.lstrip(b" \t") if len(bname) > self.max_field_size: raise LineTooLong( "request header name {}".format( bname.decode("utf8", "backslashreplace") ), str(self.max_field_size), str(len(bname)), ) name = bname.decode("utf-8", "surrogateescape") if not TOKENRE.fullmatch(name): raise InvalidHeader(bname) header_length = len(bvalue) # next line lines_idx += 1 line = lines[lines_idx] # consume continuation lines continuation = self._lax and line and line[0] in (32, 9) # (' ', '\t') # Deprecated: https://www.rfc-editor.org/rfc/rfc9112.html#name-obsolete-line-folding if continuation: bvalue_lst = [bvalue] while continuation: header_length += len(line) if header_length > self.max_field_size: raise LineTooLong( "request header field {}".format( bname.decode("utf8", "backslashreplace") ), str(self.max_field_size), str(header_length), ) bvalue_lst.append(line) # next line lines_idx += 1 if lines_idx < line_count: line = lines[lines_idx] if line: continuation = line[0] in (32, 9) # (' ', '\t') else: line = b"" break bvalue = b"".join(bvalue_lst) else: if header_length > self.max_field_size: raise LineTooLong( "request header field {}".format( bname.decode("utf8", "backslashreplace") ), str(self.max_field_size), str(header_length), ) bvalue = bvalue.strip(b" \t") value = bvalue.decode("utf-8", "surrogateescape") # https://www.rfc-editor.org/rfc/rfc9110.html#section-5.5-5 if "\n" in value or "\r" in value or "\x00" in value: raise InvalidHeader(bvalue) headers.add(name, value) raw_headers.append((bname, bvalue)) return (CIMultiDictProxy(headers), tuple(raw_headers)) def _is_supported_upgrade(headers: CIMultiDictProxy[str]) -> bool: """Check if the upgrade header is supported.""" return headers.get(hdrs.UPGRADE, "").lower() in {"tcp", "websocket"} class HttpParser(abc.ABC, Generic[_MsgT]): lax: ClassVar[bool] = False def __init__( self, protocol: Optional[BaseProtocol] = None, loop: Optional[asyncio.AbstractEventLoop] = None, limit: int = 2**16, max_line_size: int = 8190, max_headers: int = 32768, max_field_size: int = 8190, timer: Optional[BaseTimerContext] = None, code: Optional[int] = None, method: Optional[str] = None, readall: bool = False, payload_exception: Optional[Type[BaseException]] = None, response_with_body: bool = True, read_until_eof: bool = False, auto_decompress: bool = True, ) -> None: self.protocol = protocol self.loop = loop self.max_line_size = max_line_size self.max_headers = max_headers self.max_field_size = max_field_size self.timer = timer self.code = code self.method = method self.readall = readall self.payload_exception = payload_exception self.response_with_body = response_with_body self.read_until_eof = read_until_eof self._lines: List[bytes] = [] self._tail = b"" self._upgraded = False self._payload = None self._payload_parser: Optional[HttpPayloadParser] = None self._auto_decompress = auto_decompress self._limit = limit self._headers_parser = HeadersParser( max_line_size, max_headers, max_field_size, self.lax ) @abc.abstractmethod def parse_message(self, lines: List[bytes]) -> _MsgT: pass def feed_eof(self) -> Optional[_MsgT]: if self._payload_parser is not None: self._payload_parser.feed_eof() self._payload_parser = None else: # try to extract partial message if self._tail: self._lines.append(self._tail) if self._lines: if self._lines[-1] != "\r\n": self._lines.append(b"") with suppress(Exception): return self.parse_message(self._lines) return None def feed_data( self, data: bytes, SEP: _SEP = b"\r\n", EMPTY: bytes = b"", CONTENT_LENGTH: istr = hdrs.CONTENT_LENGTH, METH_CONNECT: str = hdrs.METH_CONNECT, SEC_WEBSOCKET_KEY1: istr = hdrs.SEC_WEBSOCKET_KEY1, ) -> Tuple[List[Tuple[_MsgT, StreamReader]], bool, bytes]: messages = [] if self._tail: data, self._tail = self._tail + data, b"" data_len = len(data) start_pos = 0 loop = self.loop while start_pos < data_len: # read HTTP message (request/response line + headers), \r\n\r\n # and split by lines if self._payload_parser is None and not self._upgraded: pos = data.find(SEP, start_pos) # consume \r\n if pos == start_pos and not self._lines: start_pos = pos + len(SEP) continue if pos >= start_pos: # line found line = data[start_pos:pos] if SEP == b"\n": # For lax response parsing line = line.rstrip(b"\r") self._lines.append(line) start_pos = pos + len(SEP) # \r\n\r\n found if self._lines[-1] == EMPTY: try: msg: _MsgT = self.parse_message(self._lines) finally: self._lines.clear() def get_content_length() -> Optional[int]: # payload length length_hdr = msg.headers.get(CONTENT_LENGTH) if length_hdr is None: return None # Shouldn't allow +/- or other number formats. # https://www.rfc-editor.org/rfc/rfc9110#section-8.6-2 # msg.headers is already stripped of leading/trailing wsp if not DIGITS.fullmatch(length_hdr): raise InvalidHeader(CONTENT_LENGTH) return int(length_hdr) length = get_content_length() # do not support old websocket spec if SEC_WEBSOCKET_KEY1 in msg.headers: raise InvalidHeader(SEC_WEBSOCKET_KEY1) self._upgraded = msg.upgrade and _is_supported_upgrade( msg.headers ) method = getattr(msg, "method", self.method) # code is only present on responses code = getattr(msg, "code", 0) assert self.protocol is not None # calculate payload empty_body = status_code_must_be_empty_body(code) or bool( method and method_must_be_empty_body(method) ) if not empty_body and ( ((length is not None and length > 0) or msg.chunked) and not self._upgraded ): payload = StreamReader( self.protocol, timer=self.timer, loop=loop, limit=self._limit, ) payload_parser = HttpPayloadParser( payload, length=length, chunked=msg.chunked, method=method, compression=msg.compression, code=self.code, readall=self.readall, response_with_body=self.response_with_body, auto_decompress=self._auto_decompress, lax=self.lax, ) if not payload_parser.done: self._payload_parser = payload_parser elif method == METH_CONNECT: assert isinstance(msg, RawRequestMessage) payload = StreamReader( self.protocol, timer=self.timer, loop=loop, limit=self._limit, ) self._upgraded = True self._payload_parser = HttpPayloadParser( payload, method=msg.method, compression=msg.compression, readall=True, auto_decompress=self._auto_decompress, lax=self.lax, ) elif not empty_body and length is None and self.read_until_eof: payload = StreamReader( self.protocol, timer=self.timer, loop=loop, limit=self._limit, ) payload_parser = HttpPayloadParser( payload, length=length, chunked=msg.chunked, method=method, compression=msg.compression, code=self.code, readall=True, response_with_body=self.response_with_body, auto_decompress=self._auto_decompress, lax=self.lax, ) if not payload_parser.done: self._payload_parser = payload_parser else: payload = EMPTY_PAYLOAD messages.append((msg, payload)) else: self._tail = data[start_pos:] data = EMPTY break # no parser, just store elif self._payload_parser is None and self._upgraded: assert not self._lines break # feed payload elif data and start_pos < data_len: assert not self._lines assert self._payload_parser is not None try: eof, data = self._payload_parser.feed_data(data[start_pos:], SEP) except BaseException as underlying_exc: reraised_exc = underlying_exc if self.payload_exception is not None: reraised_exc = self.payload_exception(str(underlying_exc)) set_exception( self._payload_parser.payload, reraised_exc, underlying_exc, ) eof = True data = b"" if eof: start_pos = 0 data_len = len(data) self._payload_parser = None continue else: break if data and start_pos < data_len: data = data[start_pos:] else: data = EMPTY return messages, self._upgraded, data def parse_headers( self, lines: List[bytes] ) -> Tuple[ "CIMultiDictProxy[str]", RawHeaders, Optional[bool], Optional[str], bool, bool ]: """Parses RFC 5322 headers from a stream. Line continuations are supported. Returns list of header name and value pairs. Header name is in upper case. """ headers, raw_headers = self._headers_parser.parse_headers(lines) close_conn = None encoding = None upgrade = False chunked = False # https://www.rfc-editor.org/rfc/rfc9110.html#section-5.5-6 # https://www.rfc-editor.org/rfc/rfc9110.html#name-collected-abnf singletons = ( hdrs.CONTENT_LENGTH, hdrs.CONTENT_LOCATION, hdrs.CONTENT_RANGE, hdrs.CONTENT_TYPE, hdrs.ETAG, hdrs.HOST, hdrs.MAX_FORWARDS, hdrs.SERVER, hdrs.TRANSFER_ENCODING, hdrs.USER_AGENT, ) bad_hdr = next((h for h in singletons if len(headers.getall(h, ())) > 1), None) if bad_hdr is not None: raise BadHttpMessage(f"Duplicate '{bad_hdr}' header found.") # keep-alive conn = headers.get(hdrs.CONNECTION) if conn: v = conn.lower() if v == "close": close_conn = True elif v == "keep-alive": close_conn = False # https://www.rfc-editor.org/rfc/rfc9110.html#name-101-switching-protocols elif v == "upgrade" and headers.get(hdrs.UPGRADE): upgrade = True # encoding enc = headers.get(hdrs.CONTENT_ENCODING) if enc: enc = enc.lower() if enc in ("gzip", "deflate", "br"): encoding = enc # chunking te = headers.get(hdrs.TRANSFER_ENCODING) if te is not None: if "chunked" == te.lower(): chunked = True else: raise BadHttpMessage("Request has invalid `Transfer-Encoding`") if hdrs.CONTENT_LENGTH in headers: raise BadHttpMessage( "Transfer-Encoding can't be present with Content-Length", ) return (headers, raw_headers, close_conn, encoding, upgrade, chunked) def set_upgraded(self, val: bool) -> None: """Set connection upgraded (to websocket) mode. :param bool val: new state. """ self._upgraded = val class HttpRequestParser(HttpParser[RawRequestMessage]): """Read request status line. Exception .http_exceptions.BadStatusLine could be raised in case of any errors in status line. Returns RawRequestMessage. """ def parse_message(self, lines: List[bytes]) -> RawRequestMessage: # request line line = lines[0].decode("utf-8", "surrogateescape") try: method, path, version = line.split(" ", maxsplit=2) except ValueError: raise BadStatusLine(line) from None if len(path) > self.max_line_size: raise LineTooLong( "Status line is too long", str(self.max_line_size), str(len(path)) ) # method if not TOKENRE.fullmatch(method): raise BadStatusLine(method) # version match = VERSRE.fullmatch(version) if match is None: raise BadStatusLine(line) version_o = HttpVersion(int(match.group(1)), int(match.group(2))) if method == "CONNECT": # authority-form, # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.3 url = URL.build(authority=path, encoded=True) elif path.startswith("/"): # origin-form, # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.1 path_part, _hash_separator, url_fragment = path.partition("#") path_part, _question_mark_separator, qs_part = path_part.partition("?") # NOTE: `yarl.URL.build()` is used to mimic what the Cython-based # NOTE: parser does, otherwise it results into the same # NOTE: HTTP Request-Line input producing different # NOTE: `yarl.URL()` objects url = URL.build( path=path_part, query_string=qs_part, fragment=url_fragment, encoded=True, ) elif path == "*" and method == "OPTIONS": # asterisk-form, url = URL(path, encoded=True) else: # absolute-form for proxy maybe, # https://datatracker.ietf.org/doc/html/rfc7230#section-5.3.2 url = URL(path, encoded=True) if url.scheme == "": # not absolute-form raise InvalidURLError( path.encode(errors="surrogateescape").decode("latin1") ) # read headers ( headers, raw_headers, close, compression, upgrade, chunked, ) = self.parse_headers(lines) if close is None: # then the headers weren't set in the request if version_o <= HttpVersion10: # HTTP 1.0 must asks to not close close = True else: # HTTP 1.1 must ask to close. close = False return RawRequestMessage( method, path, version_o, headers, raw_headers, close, compression, upgrade, chunked, url, ) class HttpResponseParser(HttpParser[RawResponseMessage]): """Read response status line and headers. BadStatusLine could be raised in case of any errors in status line. Returns RawResponseMessage. """ # Lax mode should only be enabled on response parser. lax = not DEBUG def feed_data( self, data: bytes, SEP: Optional[_SEP] = None, *args: Any, **kwargs: Any, ) -> Tuple[List[Tuple[RawResponseMessage, StreamReader]], bool, bytes]: if SEP is None: SEP = b"\r\n" if DEBUG else b"\n" return super().feed_data(data, SEP, *args, **kwargs) def parse_message(self, lines: List[bytes]) -> RawResponseMessage: line = lines[0].decode("utf-8", "surrogateescape") try: version, status = line.split(maxsplit=1) except ValueError: raise BadStatusLine(line) from None try: status, reason = status.split(maxsplit=1) except ValueError: status = status.strip() reason = "" if len(reason) > self.max_line_size: raise LineTooLong( "Status line is too long", str(self.max_line_size), str(len(reason)) ) # version match = VERSRE.fullmatch(version) if match is None: raise BadStatusLine(line) version_o = HttpVersion(int(match.group(1)), int(match.group(2))) # The status code is a three-digit ASCII number, no padding if len(status) != 3 or not DIGITS.fullmatch(status): raise BadStatusLine(line) status_i = int(status) # read headers ( headers, raw_headers, close, compression, upgrade, chunked, ) = self.parse_headers(lines) if close is None: if version_o <= HttpVersion10: close = True # https://www.rfc-editor.org/rfc/rfc9112.html#name-message-body-length elif 100 <= status_i < 200 or status_i in {204, 304}: close = False elif hdrs.CONTENT_LENGTH in headers or hdrs.TRANSFER_ENCODING in headers: close = False else: # https://www.rfc-editor.org/rfc/rfc9112.html#section-6.3-2.8 close = True return RawResponseMessage( version_o, status_i, reason.strip(), headers, raw_headers, close, compression, upgrade, chunked, ) class HttpPayloadParser: def __init__( self, payload: StreamReader, length: Optional[int] = None, chunked: bool = False, compression: Optional[str] = None, code: Optional[int] = None, method: Optional[str] = None, readall: bool = False, response_with_body: bool = True, auto_decompress: bool = True, lax: bool = False, ) -> None: self._length = 0 self._type = ParseState.PARSE_NONE self._chunk = ChunkState.PARSE_CHUNKED_SIZE self._chunk_size = 0 self._chunk_tail = b"" self._auto_decompress = auto_decompress self._lax = lax self.done = False # payload decompression wrapper if response_with_body and compression and self._auto_decompress: real_payload: Union[StreamReader, DeflateBuffer] = DeflateBuffer( payload, compression ) else: real_payload = payload # payload parser if not response_with_body: # don't parse payload if it's not expected to be received self._type = ParseState.PARSE_NONE real_payload.feed_eof() self.done = True elif chunked: self._type = ParseState.PARSE_CHUNKED elif length is not None: self._type = ParseState.PARSE_LENGTH self._length = length if self._length == 0: real_payload.feed_eof() self.done = True else: if readall and code != 204: self._type = ParseState.PARSE_UNTIL_EOF elif method in ("PUT", "POST"): internal_logger.warning( # pragma: no cover "Content-Length or Transfer-Encoding header is required" ) self._type = ParseState.PARSE_NONE real_payload.feed_eof() self.done = True self.payload = real_payload def feed_eof(self) -> None: if self._type == ParseState.PARSE_UNTIL_EOF: self.payload.feed_eof() elif self._type == ParseState.PARSE_LENGTH: raise ContentLengthError( "Not enough data for satisfy content length header." ) elif self._type == ParseState.PARSE_CHUNKED: raise TransferEncodingError( "Not enough data for satisfy transfer length header." ) def feed_data( self, chunk: bytes, SEP: _SEP = b"\r\n", CHUNK_EXT: bytes = b";" ) -> Tuple[bool, bytes]: # Read specified amount of bytes if self._type == ParseState.PARSE_LENGTH: required = self._length chunk_len = len(chunk) if required >= chunk_len: self._length = required - chunk_len self.payload.feed_data(chunk, chunk_len) if self._length == 0: self.payload.feed_eof() return True, b"" else: self._length = 0 self.payload.feed_data(chunk[:required], required) self.payload.feed_eof() return True, chunk[required:] # Chunked transfer encoding parser elif self._type == ParseState.PARSE_CHUNKED: if self._chunk_tail: chunk = self._chunk_tail + chunk self._chunk_tail = b"" while chunk: # read next chunk size if self._chunk == ChunkState.PARSE_CHUNKED_SIZE: pos = chunk.find(SEP) if pos >= 0: i = chunk.find(CHUNK_EXT, 0, pos) if i >= 0: size_b = chunk[:i] # strip chunk-extensions else: size_b = chunk[:pos] if self._lax: # Allow whitespace in lax mode. size_b = size_b.strip() if not re.fullmatch(HEXDIGITS, size_b): exc = TransferEncodingError( chunk[:pos].decode("ascii", "surrogateescape") ) set_exception(self.payload, exc) raise exc size = int(bytes(size_b), 16) chunk = chunk[pos + len(SEP) :] if size == 0: # eof marker self._chunk = ChunkState.PARSE_MAYBE_TRAILERS if self._lax and chunk.startswith(b"\r"): chunk = chunk[1:] else: self._chunk = ChunkState.PARSE_CHUNKED_CHUNK self._chunk_size = size self.payload.begin_http_chunk_receiving() else: self._chunk_tail = chunk return False, b"" # read chunk and feed buffer if self._chunk == ChunkState.PARSE_CHUNKED_CHUNK: required = self._chunk_size chunk_len = len(chunk) if required > chunk_len: self._chunk_size = required - chunk_len self.payload.feed_data(chunk, chunk_len) return False, b"" else: self._chunk_size = 0 self.payload.feed_data(chunk[:required], required) chunk = chunk[required:] if self._lax and chunk.startswith(b"\r"): chunk = chunk[1:] self._chunk = ChunkState.PARSE_CHUNKED_CHUNK_EOF self.payload.end_http_chunk_receiving() # toss the CRLF at the end of the chunk if self._chunk == ChunkState.PARSE_CHUNKED_CHUNK_EOF: if chunk[: len(SEP)] == SEP: chunk = chunk[len(SEP) :] self._chunk = ChunkState.PARSE_CHUNKED_SIZE else: self._chunk_tail = chunk return False, b"" # if stream does not contain trailer, after 0\r\n # we should get another \r\n otherwise # trailers needs to be skipped until \r\n\r\n if self._chunk == ChunkState.PARSE_MAYBE_TRAILERS: head = chunk[: len(SEP)] if head == SEP: # end of stream self.payload.feed_eof() return True, chunk[len(SEP) :] # Both CR and LF, or only LF may not be received yet. It is # expected that CRLF or LF will be shown at the very first # byte next time, otherwise trailers should come. The last # CRLF which marks the end of response might not be # contained in the same TCP segment which delivered the # size indicator. if not head: return False, b"" if head == SEP[:1]: self._chunk_tail = head return False, b"" self._chunk = ChunkState.PARSE_TRAILERS # read and discard trailer up to the CRLF terminator if self._chunk == ChunkState.PARSE_TRAILERS: pos = chunk.find(SEP) if pos >= 0: chunk = chunk[pos + len(SEP) :] self._chunk = ChunkState.PARSE_MAYBE_TRAILERS else: self._chunk_tail = chunk return False, b"" # Read all bytes until eof elif self._type == ParseState.PARSE_UNTIL_EOF: self.payload.feed_data(chunk, len(chunk)) return False, b"" class DeflateBuffer: """DeflateStream decompress stream and feed data into specified stream.""" decompressor: Any def __init__(self, out: StreamReader, encoding: Optional[str]) -> None: self.out = out self.size = 0 self.encoding = encoding self._started_decoding = False self.decompressor: Union[BrotliDecompressor, ZLibDecompressor] if encoding == "br": if not HAS_BROTLI: # pragma: no cover raise ContentEncodingError( "Can not decode content-encoding: brotli (br). " "Please install `Brotli`" ) self.decompressor = BrotliDecompressor() else: self.decompressor = ZLibDecompressor(encoding=encoding) def set_exception( self, exc: BaseException, exc_cause: BaseException = _EXC_SENTINEL, ) -> None: set_exception(self.out, exc, exc_cause) def feed_data(self, chunk: bytes, size: int) -> None: if not size: return self.size += size # RFC1950 # bits 0..3 = CM = 0b1000 = 8 = "deflate" # bits 4..7 = CINFO = 1..7 = windows size. if ( not self._started_decoding and self.encoding == "deflate" and chunk[0] & 0xF != 8 ): # Change the decoder to decompress incorrectly compressed data # Actually we should issue a warning about non-RFC-compliant data. self.decompressor = ZLibDecompressor( encoding=self.encoding, suppress_deflate_header=True ) try: chunk = self.decompressor.decompress_sync(chunk) except Exception: raise ContentEncodingError( "Can not decode content-encoding: %s" % self.encoding ) self._started_decoding = True if chunk: self.out.feed_data(chunk, len(chunk)) def feed_eof(self) -> None: chunk = self.decompressor.flush() if chunk or self.size > 0: self.out.feed_data(chunk, len(chunk)) if self.encoding == "deflate" and not self.decompressor.eof: raise ContentEncodingError("deflate") self.out.feed_eof() def begin_http_chunk_receiving(self) -> None: self.out.begin_http_chunk_receiving() def end_http_chunk_receiving(self) -> None: self.out.end_http_chunk_receiving() HttpRequestParserPy = HttpRequestParser HttpResponseParserPy = HttpResponseParser RawRequestMessagePy = RawRequestMessage RawResponseMessagePy = RawResponseMessage try: if not NO_EXTENSIONS: from ._http_parser import ( # type: ignore[import-not-found,no-redef] HttpRequestParser, HttpResponseParser, RawRequestMessage, RawResponseMessage, ) HttpRequestParserC = HttpRequestParser HttpResponseParserC = HttpResponseParser RawRequestMessageC = RawRequestMessage RawResponseMessageC = RawResponseMessage except ImportError: # pragma: no cover pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/http_websocket.py0000644000175100001770000006415414607525266017703 0ustar00runnerdocker"""WebSocket protocol versions 13 and 8.""" import asyncio import functools import json import random import re import sys import zlib from enum import IntEnum from struct import Struct from typing import ( Any, Callable, Final, List, NamedTuple, Optional, Pattern, Set, Tuple, Union, cast, ) from .base_protocol import BaseProtocol from .compression_utils import ZLibCompressor, ZLibDecompressor from .helpers import NO_EXTENSIONS, set_exception from .streams import DataQueue __all__ = ( "WS_CLOSED_MESSAGE", "WS_CLOSING_MESSAGE", "WS_KEY", "WebSocketReader", "WebSocketWriter", "WSMessage", "WebSocketError", "WSMsgType", "WSCloseCode", ) class WSCloseCode(IntEnum): OK = 1000 GOING_AWAY = 1001 PROTOCOL_ERROR = 1002 UNSUPPORTED_DATA = 1003 ABNORMAL_CLOSURE = 1006 INVALID_TEXT = 1007 POLICY_VIOLATION = 1008 MESSAGE_TOO_BIG = 1009 MANDATORY_EXTENSION = 1010 INTERNAL_ERROR = 1011 SERVICE_RESTART = 1012 TRY_AGAIN_LATER = 1013 BAD_GATEWAY = 1014 ALLOWED_CLOSE_CODES: Final[Set[int]] = {int(i) for i in WSCloseCode} # For websockets, keeping latency low is extremely important as implementations # generally expect to be able to send and receive messages quickly. We use a # larger chunk size than the default to reduce the number of executor calls # since the executor is a significant source of latency and overhead when # the chunks are small. A size of 5KiB was chosen because it is also the # same value python-zlib-ng choose to use as the threshold to release the GIL. WEBSOCKET_MAX_SYNC_CHUNK_SIZE = 5 * 1024 class WSMsgType(IntEnum): # websocket spec types CONTINUATION = 0x0 TEXT = 0x1 BINARY = 0x2 PING = 0x9 PONG = 0xA CLOSE = 0x8 # aiohttp specific types CLOSING = 0x100 CLOSED = 0x101 ERROR = 0x102 text = TEXT binary = BINARY ping = PING pong = PONG close = CLOSE closing = CLOSING closed = CLOSED error = ERROR WS_KEY: Final[bytes] = b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11" UNPACK_LEN2 = Struct("!H").unpack_from UNPACK_LEN3 = Struct("!Q").unpack_from UNPACK_CLOSE_CODE = Struct("!H").unpack PACK_LEN1 = Struct("!BB").pack PACK_LEN2 = Struct("!BBH").pack PACK_LEN3 = Struct("!BBQ").pack PACK_CLOSE_CODE = Struct("!H").pack MSG_SIZE: Final[int] = 2**14 DEFAULT_LIMIT: Final[int] = 2**16 class WSMessage(NamedTuple): type: WSMsgType # To type correctly, this would need some kind of tagged union for each type. data: Any extra: Optional[str] def json(self, *, loads: Callable[[Any], Any] = json.loads) -> Any: """Return parsed JSON data. .. versionadded:: 0.22 """ return loads(self.data) WS_CLOSED_MESSAGE = WSMessage(WSMsgType.CLOSED, None, None) WS_CLOSING_MESSAGE = WSMessage(WSMsgType.CLOSING, None, None) class WebSocketError(Exception): """WebSocket protocol parser error.""" def __init__(self, code: int, message: str) -> None: self.code = code super().__init__(code, message) def __str__(self) -> str: return cast(str, self.args[1]) class WSHandshakeError(Exception): """WebSocket protocol handshake error.""" native_byteorder: Final[str] = sys.byteorder # Used by _websocket_mask_python @functools.lru_cache def _xor_table() -> List[bytes]: return [bytes(a ^ b for a in range(256)) for b in range(256)] def _websocket_mask_python(mask: bytes, data: bytearray) -> None: """Websocket masking function. `mask` is a `bytes` object of length 4; `data` is a `bytearray` object of any length. The contents of `data` are masked with `mask`, as specified in section 5.3 of RFC 6455. Note that this function mutates the `data` argument. This pure-python implementation may be replaced by an optimized version when available. """ assert isinstance(data, bytearray), data assert len(mask) == 4, mask if data: _XOR_TABLE = _xor_table() a, b, c, d = (_XOR_TABLE[n] for n in mask) data[::4] = data[::4].translate(a) data[1::4] = data[1::4].translate(b) data[2::4] = data[2::4].translate(c) data[3::4] = data[3::4].translate(d) if NO_EXTENSIONS: # pragma: no cover _websocket_mask = _websocket_mask_python else: try: from ._websocket import _websocket_mask_cython # type: ignore[import-not-found] _websocket_mask = _websocket_mask_cython except ImportError: # pragma: no cover _websocket_mask = _websocket_mask_python _WS_DEFLATE_TRAILING: Final[bytes] = bytes([0x00, 0x00, 0xFF, 0xFF]) _WS_EXT_RE: Final[Pattern[str]] = re.compile( r"^(?:;\s*(?:" r"(server_no_context_takeover)|" r"(client_no_context_takeover)|" r"(server_max_window_bits(?:=(\d+))?)|" r"(client_max_window_bits(?:=(\d+))?)))*$" ) _WS_EXT_RE_SPLIT: Final[Pattern[str]] = re.compile(r"permessage-deflate([^,]+)?") def ws_ext_parse(extstr: Optional[str], isserver: bool = False) -> Tuple[int, bool]: if not extstr: return 0, False compress = 0 notakeover = False for ext in _WS_EXT_RE_SPLIT.finditer(extstr): defext = ext.group(1) # Return compress = 15 when get `permessage-deflate` if not defext: compress = 15 break match = _WS_EXT_RE.match(defext) if match: compress = 15 if isserver: # Server never fail to detect compress handshake. # Server does not need to send max wbit to client if match.group(4): compress = int(match.group(4)) # Group3 must match if group4 matches # Compress wbit 8 does not support in zlib # If compress level not support, # CONTINUE to next extension if compress > 15 or compress < 9: compress = 0 continue if match.group(1): notakeover = True # Ignore regex group 5 & 6 for client_max_window_bits break else: if match.group(6): compress = int(match.group(6)) # Group5 must match if group6 matches # Compress wbit 8 does not support in zlib # If compress level not support, # FAIL the parse progress if compress > 15 or compress < 9: raise WSHandshakeError("Invalid window size") if match.group(2): notakeover = True # Ignore regex group 5 & 6 for client_max_window_bits break # Return Fail if client side and not match elif not isserver: raise WSHandshakeError("Extension for deflate not supported" + ext.group(1)) return compress, notakeover def ws_ext_gen( compress: int = 15, isserver: bool = False, server_notakeover: bool = False ) -> str: # client_notakeover=False not used for server # compress wbit 8 does not support in zlib if compress < 9 or compress > 15: raise ValueError( "Compress wbits must between 9 and 15, " "zlib does not support wbits=8" ) enabledext = ["permessage-deflate"] if not isserver: enabledext.append("client_max_window_bits") if compress < 15: enabledext.append("server_max_window_bits=" + str(compress)) if server_notakeover: enabledext.append("server_no_context_takeover") # if client_notakeover: # enabledext.append('client_no_context_takeover') return "; ".join(enabledext) class WSParserState(IntEnum): READ_HEADER = 1 READ_PAYLOAD_LENGTH = 2 READ_PAYLOAD_MASK = 3 READ_PAYLOAD = 4 class WebSocketReader: def __init__( self, queue: DataQueue[WSMessage], max_msg_size: int, compress: bool = True ) -> None: self.queue = queue self._max_msg_size = max_msg_size self._exc: Optional[BaseException] = None self._partial = bytearray() self._state = WSParserState.READ_HEADER self._opcode: Optional[int] = None self._frame_fin = False self._frame_opcode: Optional[int] = None self._frame_payload = bytearray() self._tail = b"" self._has_mask = False self._frame_mask: Optional[bytes] = None self._payload_length = 0 self._payload_length_flag = 0 self._compressed: Optional[bool] = None self._decompressobj: Optional[ZLibDecompressor] = None self._compress = compress def feed_eof(self) -> None: self.queue.feed_eof() def feed_data(self, data: bytes) -> Tuple[bool, bytes]: if self._exc: return True, data try: return self._feed_data(data) except Exception as exc: self._exc = exc set_exception(self.queue, exc) return True, b"" def _feed_data(self, data: bytes) -> Tuple[bool, bytes]: for fin, opcode, payload, compressed in self.parse_frame(data): if compressed and not self._decompressobj: self._decompressobj = ZLibDecompressor(suppress_deflate_header=True) if opcode == WSMsgType.CLOSE: if len(payload) >= 2: close_code = UNPACK_CLOSE_CODE(payload[:2])[0] if close_code < 3000 and close_code not in ALLOWED_CLOSE_CODES: raise WebSocketError( WSCloseCode.PROTOCOL_ERROR, f"Invalid close code: {close_code}", ) try: close_message = payload[2:].decode("utf-8") except UnicodeDecodeError as exc: raise WebSocketError( WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" ) from exc msg = WSMessage(WSMsgType.CLOSE, close_code, close_message) elif payload: raise WebSocketError( WSCloseCode.PROTOCOL_ERROR, f"Invalid close frame: {fin} {opcode} {payload!r}", ) else: msg = WSMessage(WSMsgType.CLOSE, 0, "") self.queue.feed_data(msg, 0) elif opcode == WSMsgType.PING: self.queue.feed_data( WSMessage(WSMsgType.PING, payload, ""), len(payload) ) elif opcode == WSMsgType.PONG: self.queue.feed_data( WSMessage(WSMsgType.PONG, payload, ""), len(payload) ) elif ( opcode not in (WSMsgType.TEXT, WSMsgType.BINARY) and self._opcode is None ): raise WebSocketError( WSCloseCode.PROTOCOL_ERROR, f"Unexpected opcode={opcode!r}" ) else: # load text/binary if not fin: # got partial frame payload if opcode != WSMsgType.CONTINUATION: self._opcode = opcode self._partial.extend(payload) if self._max_msg_size and len(self._partial) >= self._max_msg_size: raise WebSocketError( WSCloseCode.MESSAGE_TOO_BIG, "Message size {} exceeds limit {}".format( len(self._partial), self._max_msg_size ), ) else: # previous frame was non finished # we should get continuation opcode if self._partial: if opcode != WSMsgType.CONTINUATION: raise WebSocketError( WSCloseCode.PROTOCOL_ERROR, "The opcode in non-fin frame is expected " "to be zero, got {!r}".format(opcode), ) if opcode == WSMsgType.CONTINUATION: assert self._opcode is not None opcode = self._opcode self._opcode = None self._partial.extend(payload) if self._max_msg_size and len(self._partial) >= self._max_msg_size: raise WebSocketError( WSCloseCode.MESSAGE_TOO_BIG, "Message size {} exceeds limit {}".format( len(self._partial), self._max_msg_size ), ) # Decompress process must to be done after all packets # received. if compressed: assert self._decompressobj is not None self._partial.extend(_WS_DEFLATE_TRAILING) payload_merged = self._decompressobj.decompress_sync( self._partial, self._max_msg_size ) if self._decompressobj.unconsumed_tail: left = len(self._decompressobj.unconsumed_tail) raise WebSocketError( WSCloseCode.MESSAGE_TOO_BIG, "Decompressed message size {} exceeds limit {}".format( self._max_msg_size + left, self._max_msg_size ), ) else: payload_merged = bytes(self._partial) self._partial.clear() if opcode == WSMsgType.TEXT: try: text = payload_merged.decode("utf-8") self.queue.feed_data( WSMessage(WSMsgType.TEXT, text, ""), len(text) ) except UnicodeDecodeError as exc: raise WebSocketError( WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" ) from exc else: self.queue.feed_data( WSMessage(WSMsgType.BINARY, payload_merged, ""), len(payload_merged), ) return False, b"" def parse_frame( self, buf: bytes ) -> List[Tuple[bool, Optional[int], bytearray, Optional[bool]]]: """Return the next frame from the socket.""" frames = [] if self._tail: buf, self._tail = self._tail + buf, b"" start_pos = 0 buf_length = len(buf) while True: # read header if self._state == WSParserState.READ_HEADER: if buf_length - start_pos >= 2: data = buf[start_pos : start_pos + 2] start_pos += 2 first_byte, second_byte = data fin = (first_byte >> 7) & 1 rsv1 = (first_byte >> 6) & 1 rsv2 = (first_byte >> 5) & 1 rsv3 = (first_byte >> 4) & 1 opcode = first_byte & 0xF # frame-fin = %x0 ; more frames of this message follow # / %x1 ; final frame of this message # frame-rsv1 = %x0 ; # 1 bit, MUST be 0 unless negotiated otherwise # frame-rsv2 = %x0 ; # 1 bit, MUST be 0 unless negotiated otherwise # frame-rsv3 = %x0 ; # 1 bit, MUST be 0 unless negotiated otherwise # # Remove rsv1 from this test for deflate development if rsv2 or rsv3 or (rsv1 and not self._compress): raise WebSocketError( WSCloseCode.PROTOCOL_ERROR, "Received frame with non-zero reserved bits", ) if opcode > 0x7 and fin == 0: raise WebSocketError( WSCloseCode.PROTOCOL_ERROR, "Received fragmented control frame", ) has_mask = (second_byte >> 7) & 1 length = second_byte & 0x7F # Control frames MUST have a payload # length of 125 bytes or less if opcode > 0x7 and length > 125: raise WebSocketError( WSCloseCode.PROTOCOL_ERROR, "Control frame payload cannot be " "larger than 125 bytes", ) # Set compress status if last package is FIN # OR set compress status if this is first fragment # Raise error if not first fragment with rsv1 = 0x1 if self._frame_fin or self._compressed is None: self._compressed = True if rsv1 else False elif rsv1: raise WebSocketError( WSCloseCode.PROTOCOL_ERROR, "Received frame with non-zero reserved bits", ) self._frame_fin = bool(fin) self._frame_opcode = opcode self._has_mask = bool(has_mask) self._payload_length_flag = length self._state = WSParserState.READ_PAYLOAD_LENGTH else: break # read payload length if self._state == WSParserState.READ_PAYLOAD_LENGTH: length = self._payload_length_flag if length == 126: if buf_length - start_pos >= 2: data = buf[start_pos : start_pos + 2] start_pos += 2 length = UNPACK_LEN2(data)[0] self._payload_length = length self._state = ( WSParserState.READ_PAYLOAD_MASK if self._has_mask else WSParserState.READ_PAYLOAD ) else: break elif length > 126: if buf_length - start_pos >= 8: data = buf[start_pos : start_pos + 8] start_pos += 8 length = UNPACK_LEN3(data)[0] self._payload_length = length self._state = ( WSParserState.READ_PAYLOAD_MASK if self._has_mask else WSParserState.READ_PAYLOAD ) else: break else: self._payload_length = length self._state = ( WSParserState.READ_PAYLOAD_MASK if self._has_mask else WSParserState.READ_PAYLOAD ) # read payload mask if self._state == WSParserState.READ_PAYLOAD_MASK: if buf_length - start_pos >= 4: self._frame_mask = buf[start_pos : start_pos + 4] start_pos += 4 self._state = WSParserState.READ_PAYLOAD else: break if self._state == WSParserState.READ_PAYLOAD: length = self._payload_length payload = self._frame_payload chunk_len = buf_length - start_pos if length >= chunk_len: self._payload_length = length - chunk_len payload.extend(buf[start_pos:]) start_pos = buf_length else: self._payload_length = 0 payload.extend(buf[start_pos : start_pos + length]) start_pos = start_pos + length if self._payload_length == 0: if self._has_mask: assert self._frame_mask is not None _websocket_mask(self._frame_mask, payload) frames.append( (self._frame_fin, self._frame_opcode, payload, self._compressed) ) self._frame_payload = bytearray() self._state = WSParserState.READ_HEADER else: break self._tail = buf[start_pos:] return frames class WebSocketWriter: def __init__( self, protocol: BaseProtocol, transport: asyncio.Transport, *, use_mask: bool = False, limit: int = DEFAULT_LIMIT, random: random.Random = random.Random(), compress: int = 0, notakeover: bool = False, ) -> None: self.protocol = protocol self.transport = transport self.use_mask = use_mask self.randrange = random.randrange self.compress = compress self.notakeover = notakeover self._closing = False self._limit = limit self._output_size = 0 self._compressobj: Any = None # actually compressobj async def _send_frame( self, message: bytes, opcode: int, compress: Optional[int] = None ) -> None: """Send a frame over the websocket with message as its payload.""" if self._closing and not (opcode & WSMsgType.CLOSE): raise ConnectionResetError("Cannot write to closing transport") rsv = 0 # Only compress larger packets (disabled) # Does small packet needs to be compressed? # if self.compress and opcode < 8 and len(message) > 124: if (compress or self.compress) and opcode < 8: if compress: # Do not set self._compress if compressing is for this frame compressobj = self._make_compress_obj(compress) else: # self.compress if not self._compressobj: self._compressobj = self._make_compress_obj(self.compress) compressobj = self._compressobj message = await compressobj.compress(message) # Its critical that we do not return control to the event # loop until we have finished sending all the compressed # data. Otherwise we could end up mixing compressed frames # if there are multiple coroutines compressing data. message += compressobj.flush( zlib.Z_FULL_FLUSH if self.notakeover else zlib.Z_SYNC_FLUSH ) if message.endswith(_WS_DEFLATE_TRAILING): message = message[:-4] rsv = rsv | 0x40 msg_length = len(message) use_mask = self.use_mask if use_mask: mask_bit = 0x80 else: mask_bit = 0 if msg_length < 126: header = PACK_LEN1(0x80 | rsv | opcode, msg_length | mask_bit) elif msg_length < (1 << 16): header = PACK_LEN2(0x80 | rsv | opcode, 126 | mask_bit, msg_length) else: header = PACK_LEN3(0x80 | rsv | opcode, 127 | mask_bit, msg_length) if use_mask: mask_int = self.randrange(0, 0xFFFFFFFF) mask = mask_int.to_bytes(4, "big") message = bytearray(message) _websocket_mask(mask, message) self._write(header + mask + message) self._output_size += len(header) + len(mask) + msg_length else: if msg_length > MSG_SIZE: self._write(header) self._write(message) else: self._write(header + message) self._output_size += len(header) + msg_length # It is safe to return control to the event loop when using compression # after this point as we have already sent or buffered all the data. if self._output_size > self._limit: self._output_size = 0 await self.protocol._drain_helper() def _make_compress_obj(self, compress: int) -> ZLibCompressor: return ZLibCompressor( level=zlib.Z_BEST_SPEED, wbits=-compress, max_sync_chunk_size=WEBSOCKET_MAX_SYNC_CHUNK_SIZE, ) def _write(self, data: bytes) -> None: if self.transport is None or self.transport.is_closing(): raise ConnectionResetError("Cannot write to closing transport") self.transport.write(data) async def pong(self, message: Union[bytes, str] = b"") -> None: """Send pong message.""" if isinstance(message, str): message = message.encode("utf-8") await self._send_frame(message, WSMsgType.PONG) async def ping(self, message: Union[bytes, str] = b"") -> None: """Send ping message.""" if isinstance(message, str): message = message.encode("utf-8") await self._send_frame(message, WSMsgType.PING) async def send( self, message: Union[str, bytes], binary: bool = False, compress: Optional[int] = None, ) -> None: """Send a frame over the websocket with message as its payload.""" if isinstance(message, str): message = message.encode("utf-8") if binary: await self._send_frame(message, WSMsgType.BINARY, compress) else: await self._send_frame(message, WSMsgType.TEXT, compress) async def close(self, code: int = 1000, message: Union[bytes, str] = b"") -> None: """Close the websocket, sending the specified code and message.""" if isinstance(message, str): message = message.encode("utf-8") try: await self._send_frame( PACK_CLOSE_CODE(code) + message, opcode=WSMsgType.CLOSE ) finally: self._closing = True ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/http_writer.py0000644000175100001770000001345514607525266017227 0ustar00runnerdocker"""Http related parsers and protocol.""" import asyncio import zlib from typing import Any, Awaitable, Callable, NamedTuple, Optional, Union # noqa from multidict import CIMultiDict from .abc import AbstractStreamWriter from .base_protocol import BaseProtocol from .compression_utils import ZLibCompressor from .helpers import NO_EXTENSIONS __all__ = ("StreamWriter", "HttpVersion", "HttpVersion10", "HttpVersion11") class HttpVersion(NamedTuple): major: int minor: int HttpVersion10 = HttpVersion(1, 0) HttpVersion11 = HttpVersion(1, 1) _T_OnChunkSent = Optional[Callable[[bytes], Awaitable[None]]] _T_OnHeadersSent = Optional[Callable[["CIMultiDict[str]"], Awaitable[None]]] class StreamWriter(AbstractStreamWriter): def __init__( self, protocol: BaseProtocol, loop: asyncio.AbstractEventLoop, on_chunk_sent: _T_OnChunkSent = None, on_headers_sent: _T_OnHeadersSent = None, ) -> None: self._protocol = protocol self.loop = loop self.length = None self.chunked = False self.buffer_size = 0 self.output_size = 0 self._eof = False self._compress: Optional[ZLibCompressor] = None self._drain_waiter = None self._on_chunk_sent: _T_OnChunkSent = on_chunk_sent self._on_headers_sent: _T_OnHeadersSent = on_headers_sent @property def transport(self) -> Optional[asyncio.Transport]: return self._protocol.transport @property def protocol(self) -> BaseProtocol: return self._protocol def enable_chunking(self) -> None: self.chunked = True def enable_compression( self, encoding: str = "deflate", strategy: int = zlib.Z_DEFAULT_STRATEGY ) -> None: self._compress = ZLibCompressor(encoding=encoding, strategy=strategy) def _write(self, chunk: bytes) -> None: size = len(chunk) self.buffer_size += size self.output_size += size transport = self.transport if not self._protocol.connected or transport is None or transport.is_closing(): raise ConnectionResetError("Cannot write to closing transport") transport.write(chunk) async def write( self, chunk: bytes, *, drain: bool = True, LIMIT: int = 0x10000 ) -> None: """Writes chunk of data to a stream. write_eof() indicates end of stream. writer can't be used after write_eof() method being called. write() return drain future. """ if self._on_chunk_sent is not None: await self._on_chunk_sent(chunk) if isinstance(chunk, memoryview): if chunk.nbytes != len(chunk): # just reshape it chunk = chunk.cast("c") if self._compress is not None: chunk = await self._compress.compress(chunk) if not chunk: return if self.length is not None: chunk_len = len(chunk) if self.length >= chunk_len: self.length = self.length - chunk_len else: chunk = chunk[: self.length] self.length = 0 if not chunk: return if chunk: if self.chunked: chunk_len_pre = ("%x\r\n" % len(chunk)).encode("ascii") chunk = chunk_len_pre + chunk + b"\r\n" self._write(chunk) if self.buffer_size > LIMIT and drain: self.buffer_size = 0 await self.drain() async def write_headers( self, status_line: str, headers: "CIMultiDict[str]" ) -> None: """Write request/response status and headers.""" if self._on_headers_sent is not None: await self._on_headers_sent(headers) # status + headers buf = _serialize_headers(status_line, headers) self._write(buf) async def write_eof(self, chunk: bytes = b"") -> None: if self._eof: return if chunk and self._on_chunk_sent is not None: await self._on_chunk_sent(chunk) if self._compress: if chunk: chunk = await self._compress.compress(chunk) chunk += self._compress.flush() if chunk and self.chunked: chunk_len = ("%x\r\n" % len(chunk)).encode("ascii") chunk = chunk_len + chunk + b"\r\n0\r\n\r\n" else: if self.chunked: if chunk: chunk_len = ("%x\r\n" % len(chunk)).encode("ascii") chunk = chunk_len + chunk + b"\r\n0\r\n\r\n" else: chunk = b"0\r\n\r\n" if chunk: self._write(chunk) await self.drain() self._eof = True async def drain(self) -> None: """Flush the write buffer. The intended use is to write await w.write(data) await w.drain() """ if self._protocol.transport is not None: await self._protocol._drain_helper() def _safe_header(string: str) -> str: if "\r" in string or "\n" in string: raise ValueError( "Newline or carriage return detected in headers. " "Potential header injection attack." ) return string def _py_serialize_headers(status_line: str, headers: "CIMultiDict[str]") -> bytes: headers_gen = (_safe_header(k) + ": " + _safe_header(v) for k, v in headers.items()) line = status_line + "\r\n" + "\r\n".join(headers_gen) + "\r\n\r\n" return line.encode("utf-8") _serialize_headers = _py_serialize_headers try: import aiohttp._http_writer as _http_writer # type: ignore[import-not-found] _c_serialize_headers = _http_writer._serialize_headers if not NO_EXTENSIONS: _serialize_headers = _c_serialize_headers except ImportError: pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/locks.py0000644000175100001770000000216014607525266015756 0ustar00runnerdockerimport asyncio import collections from typing import Any, Deque, Optional class EventResultOrError: """Event asyncio lock helper class. Wraps the Event asyncio lock allowing either to awake the locked Tasks without any error or raising an exception. thanks to @vorpalsmith for the simple design. """ def __init__(self, loop: asyncio.AbstractEventLoop) -> None: self._loop = loop self._exc: Optional[BaseException] = None self._event = asyncio.Event() self._waiters: Deque[asyncio.Future[Any]] = collections.deque() def set(self, exc: Optional[BaseException] = None) -> None: self._exc = exc self._event.set() async def wait(self) -> Any: waiter = self._loop.create_task(self._event.wait()) self._waiters.append(waiter) try: val = await waiter finally: self._waiters.remove(waiter) if self._exc is not None: raise self._exc return val def cancel(self) -> None: """Cancel all waiters""" for waiter in self._waiters: waiter.cancel() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/log.py0000644000175100001770000000050514607525266015425 0ustar00runnerdockerimport logging access_logger = logging.getLogger("aiohttp.access") client_logger = logging.getLogger("aiohttp.client") internal_logger = logging.getLogger("aiohttp.internal") server_logger = logging.getLogger("aiohttp.server") web_logger = logging.getLogger("aiohttp.web") ws_logger = logging.getLogger("aiohttp.websocket") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/multipart.py0000644000175100001770000010417114607525266016671 0ustar00runnerdockerimport base64 import binascii import json import re import uuid import warnings import zlib from collections import deque from types import TracebackType from typing import ( TYPE_CHECKING, Any, AsyncIterator, Deque, Dict, Iterator, List, Mapping, Optional, Sequence, Tuple, Type, Union, cast, ) from urllib.parse import parse_qsl, unquote, urlencode from multidict import CIMultiDict, CIMultiDictProxy from .compression_utils import ZLibCompressor, ZLibDecompressor from .hdrs import ( CONTENT_DISPOSITION, CONTENT_ENCODING, CONTENT_LENGTH, CONTENT_TRANSFER_ENCODING, CONTENT_TYPE, ) from .helpers import CHAR, TOKEN, parse_mimetype, reify from .http import HeadersParser from .payload import ( JsonPayload, LookupError, Order, Payload, StringPayload, get_payload, payload_type, ) from .streams import StreamReader __all__ = ( "MultipartReader", "MultipartWriter", "BodyPartReader", "BadContentDispositionHeader", "BadContentDispositionParam", "parse_content_disposition", "content_disposition_filename", ) if TYPE_CHECKING: from .client_reqrep import ClientResponse class BadContentDispositionHeader(RuntimeWarning): pass class BadContentDispositionParam(RuntimeWarning): pass def parse_content_disposition( header: Optional[str], ) -> Tuple[Optional[str], Dict[str, str]]: def is_token(string: str) -> bool: return bool(string) and TOKEN >= set(string) def is_quoted(string: str) -> bool: return string[0] == string[-1] == '"' def is_rfc5987(string: str) -> bool: return is_token(string) and string.count("'") == 2 def is_extended_param(string: str) -> bool: return string.endswith("*") def is_continuous_param(string: str) -> bool: pos = string.find("*") + 1 if not pos: return False substring = string[pos:-1] if string.endswith("*") else string[pos:] return substring.isdigit() def unescape(text: str, *, chars: str = "".join(map(re.escape, CHAR))) -> str: return re.sub(f"\\\\([{chars}])", "\\1", text) if not header: return None, {} disptype, *parts = header.split(";") if not is_token(disptype): warnings.warn(BadContentDispositionHeader(header)) return None, {} params: Dict[str, str] = {} while parts: item = parts.pop(0) if "=" not in item: warnings.warn(BadContentDispositionHeader(header)) return None, {} key, value = item.split("=", 1) key = key.lower().strip() value = value.lstrip() if key in params: warnings.warn(BadContentDispositionHeader(header)) return None, {} if not is_token(key): warnings.warn(BadContentDispositionParam(item)) continue elif is_continuous_param(key): if is_quoted(value): value = unescape(value[1:-1]) elif not is_token(value): warnings.warn(BadContentDispositionParam(item)) continue elif is_extended_param(key): if is_rfc5987(value): encoding, _, value = value.split("'", 2) encoding = encoding or "utf-8" else: warnings.warn(BadContentDispositionParam(item)) continue try: value = unquote(value, encoding, "strict") except UnicodeDecodeError: # pragma: nocover warnings.warn(BadContentDispositionParam(item)) continue else: failed = True if is_quoted(value): failed = False value = unescape(value[1:-1].lstrip("\\/")) elif is_token(value): failed = False elif parts: # maybe just ; in filename, in any case this is just # one case fix, for proper fix we need to redesign parser _value = f"{value};{parts[0]}" if is_quoted(_value): parts.pop(0) value = unescape(_value[1:-1].lstrip("\\/")) failed = False if failed: warnings.warn(BadContentDispositionHeader(header)) return None, {} params[key] = value return disptype.lower(), params def content_disposition_filename( params: Mapping[str, str], name: str = "filename" ) -> Optional[str]: name_suf = "%s*" % name if not params: return None elif name_suf in params: return params[name_suf] elif name in params: return params[name] else: parts = [] fnparams = sorted( (key, value) for key, value in params.items() if key.startswith(name_suf) ) for num, (key, value) in enumerate(fnparams): _, tail = key.split("*", 1) if tail.endswith("*"): tail = tail[:-1] if tail == str(num): parts.append(value) else: break if not parts: return None value = "".join(parts) if "'" in value: encoding, _, value = value.split("'", 2) encoding = encoding or "utf-8" return unquote(value, encoding, "strict") return value class MultipartResponseWrapper: """Wrapper around the MultipartReader. It takes care about underlying connection and close it when it needs in. """ def __init__( self, resp: "ClientResponse", stream: "MultipartReader", ) -> None: self.resp = resp self.stream = stream def __aiter__(self) -> "MultipartResponseWrapper": return self async def __anext__( self, ) -> Union["MultipartReader", "BodyPartReader"]: part = await self.next() if part is None: raise StopAsyncIteration return part def at_eof(self) -> bool: """Returns True when all response data had been read.""" return self.resp.content.at_eof() async def next( self, ) -> Optional[Union["MultipartReader", "BodyPartReader"]]: """Emits next multipart reader object.""" item = await self.stream.next() if self.stream.at_eof(): await self.release() return item async def release(self) -> None: """Release the connection gracefully. All remaining content is read to the void. """ await self.resp.release() class BodyPartReader: """Multipart reader for single body part.""" chunk_size = 8192 def __init__( self, boundary: bytes, headers: "CIMultiDictProxy[str]", content: StreamReader, *, subtype: str = "mixed", default_charset: Optional[str] = None, ) -> None: self.headers = headers self._boundary = boundary self._content = content self._default_charset = default_charset self._at_eof = False self._is_form_data = subtype == "form-data" # https://datatracker.ietf.org/doc/html/rfc7578#section-4.8 length = None if self._is_form_data else self.headers.get(CONTENT_LENGTH, None) self._length = int(length) if length is not None else None self._read_bytes = 0 self._unread: Deque[bytes] = deque() self._prev_chunk: Optional[bytes] = None self._content_eof = 0 self._cache: Dict[str, Any] = {} def __aiter__(self) -> AsyncIterator["BodyPartReader"]: return self # type: ignore[return-value] async def __anext__(self) -> bytes: part = await self.next() if part is None: raise StopAsyncIteration return part async def next(self) -> Optional[bytes]: item = await self.read() if not item: return None return item async def read(self, *, decode: bool = False) -> bytes: """Reads body part data. decode: Decodes data following by encoding method from Content-Encoding header. If it missed data remains untouched """ if self._at_eof: return b"" data = bytearray() while not self._at_eof: data.extend(await self.read_chunk(self.chunk_size)) if decode: return self.decode(data) return data async def read_chunk(self, size: int = chunk_size) -> bytes: """Reads body part content chunk of the specified size. size: chunk size """ if self._at_eof: return b"" if self._length: chunk = await self._read_chunk_from_length(size) else: chunk = await self._read_chunk_from_stream(size) self._read_bytes += len(chunk) if self._read_bytes == self._length: self._at_eof = True if self._at_eof: clrf = await self._content.readline() assert ( b"\r\n" == clrf ), "reader did not read all the data or it is malformed" return chunk async def _read_chunk_from_length(self, size: int) -> bytes: # Reads body part content chunk of the specified size. # The body part must has Content-Length header with proper value. assert self._length is not None, "Content-Length required for chunked read" chunk_size = min(size, self._length - self._read_bytes) chunk = await self._content.read(chunk_size) if self._content.at_eof(): self._at_eof = True return chunk async def _read_chunk_from_stream(self, size: int) -> bytes: # Reads content chunk of body part with unknown length. # The Content-Length header for body part is not necessary. assert ( size >= len(self._boundary) + 2 ), "Chunk size must be greater or equal than boundary length + 2" first_chunk = self._prev_chunk is None if first_chunk: self._prev_chunk = await self._content.read(size) chunk = await self._content.read(size) self._content_eof += int(self._content.at_eof()) assert self._content_eof < 3, "Reading after EOF" assert self._prev_chunk is not None window = self._prev_chunk + chunk sub = b"\r\n" + self._boundary if first_chunk: idx = window.find(sub) else: idx = window.find(sub, max(0, len(self._prev_chunk) - len(sub))) if idx >= 0: # pushing boundary back to content with warnings.catch_warnings(): warnings.filterwarnings("ignore", category=DeprecationWarning) self._content.unread_data(window[idx:]) if size > idx: self._prev_chunk = self._prev_chunk[:idx] chunk = window[len(self._prev_chunk) : idx] if not chunk: self._at_eof = True result = self._prev_chunk self._prev_chunk = chunk return result async def readline(self) -> bytes: """Reads body part by line by line.""" if self._at_eof: return b"" if self._unread: line = self._unread.popleft() else: line = await self._content.readline() if line.startswith(self._boundary): # the very last boundary may not come with \r\n, # so set single rules for everyone sline = line.rstrip(b"\r\n") boundary = self._boundary last_boundary = self._boundary + b"--" # ensure that we read exactly the boundary, not something alike if sline == boundary or sline == last_boundary: self._at_eof = True self._unread.append(line) return b"" else: next_line = await self._content.readline() if next_line.startswith(self._boundary): line = line[:-2] # strip CRLF but only once self._unread.append(next_line) return line async def release(self) -> None: """Like read(), but reads all the data to the void.""" if self._at_eof: return while not self._at_eof: await self.read_chunk(self.chunk_size) async def text(self, *, encoding: Optional[str] = None) -> str: """Like read(), but assumes that body part contains text data.""" data = await self.read(decode=True) # see https://www.w3.org/TR/html5/forms.html#multipart/form-data-encoding-algorithm # and https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-send encoding = encoding or self.get_charset(default="utf-8") return data.decode(encoding) async def json(self, *, encoding: Optional[str] = None) -> Optional[Dict[str, Any]]: """Like read(), but assumes that body parts contains JSON data.""" data = await self.read(decode=True) if not data: return None encoding = encoding or self.get_charset(default="utf-8") return cast(Dict[str, Any], json.loads(data.decode(encoding))) async def form(self, *, encoding: Optional[str] = None) -> List[Tuple[str, str]]: """Like read(), but assumes that body parts contain form urlencoded data.""" data = await self.read(decode=True) if not data: return [] if encoding is not None: real_encoding = encoding else: real_encoding = self.get_charset(default="utf-8") try: decoded_data = data.rstrip().decode(real_encoding) except UnicodeDecodeError: raise ValueError("data cannot be decoded with %s encoding" % real_encoding) return parse_qsl( decoded_data, keep_blank_values=True, encoding=real_encoding, ) def at_eof(self) -> bool: """Returns True if the boundary was reached or False otherwise.""" return self._at_eof def decode(self, data: bytes) -> bytes: """Decodes data. Decoding is done according the specified Content-Encoding or Content-Transfer-Encoding headers value. """ if CONTENT_TRANSFER_ENCODING in self.headers: data = self._decode_content_transfer(data) # https://datatracker.ietf.org/doc/html/rfc7578#section-4.8 if not self._is_form_data and CONTENT_ENCODING in self.headers: return self._decode_content(data) return data def _decode_content(self, data: bytes) -> bytes: encoding = self.headers.get(CONTENT_ENCODING, "").lower() if encoding == "identity": return data if encoding in {"deflate", "gzip"}: return ZLibDecompressor( encoding=encoding, suppress_deflate_header=True, ).decompress_sync(data) raise RuntimeError(f"unknown content encoding: {encoding}") def _decode_content_transfer(self, data: bytes) -> bytes: encoding = self.headers.get(CONTENT_TRANSFER_ENCODING, "").lower() if encoding == "base64": return base64.b64decode(data) elif encoding == "quoted-printable": return binascii.a2b_qp(data) elif encoding in ("binary", "8bit", "7bit"): return data else: raise RuntimeError( "unknown content transfer encoding: {}" "".format(encoding) ) def get_charset(self, default: str) -> str: """Returns charset parameter from Content-Type header or default.""" ctype = self.headers.get(CONTENT_TYPE, "") mimetype = parse_mimetype(ctype) return mimetype.parameters.get("charset", self._default_charset or default) @reify def name(self) -> Optional[str]: """Returns name specified in Content-Disposition header. If the header is missing or malformed, returns None. """ _, params = parse_content_disposition(self.headers.get(CONTENT_DISPOSITION)) return content_disposition_filename(params, "name") @reify def filename(self) -> Optional[str]: """Returns filename specified in Content-Disposition header. Returns None if the header is missing or malformed. """ _, params = parse_content_disposition(self.headers.get(CONTENT_DISPOSITION)) return content_disposition_filename(params, "filename") @payload_type(BodyPartReader, order=Order.try_first) class BodyPartReaderPayload(Payload): def __init__(self, value: BodyPartReader, *args: Any, **kwargs: Any) -> None: super().__init__(value, *args, **kwargs) params: Dict[str, str] = {} if value.name is not None: params["name"] = value.name if value.filename is not None: params["filename"] = value.filename if params: self.set_content_disposition("attachment", True, **params) async def write(self, writer: Any) -> None: field = self._value chunk = await field.read_chunk(size=2**16) while chunk: await writer.write(field.decode(chunk)) chunk = await field.read_chunk(size=2**16) class MultipartReader: """Multipart body reader.""" #: Response wrapper, used when multipart readers constructs from response. response_wrapper_cls = MultipartResponseWrapper #: Multipart reader class, used to handle multipart/* body parts. #: None points to type(self) multipart_reader_cls = None #: Body part reader class for non multipart/* content types. part_reader_cls = BodyPartReader def __init__(self, headers: Mapping[str, str], content: StreamReader) -> None: self._mimetype = parse_mimetype(headers[CONTENT_TYPE]) assert self._mimetype.type == "multipart", "multipart/* content type expected" if "boundary" not in self._mimetype.parameters: raise ValueError( "boundary missed for Content-Type: %s" % headers[CONTENT_TYPE] ) self.headers = headers self._boundary = ("--" + self._get_boundary()).encode() self._content = content self._default_charset: Optional[str] = None self._last_part: Optional[Union["MultipartReader", BodyPartReader]] = None self._at_eof = False self._at_bof = True self._unread: List[bytes] = [] def __aiter__( self, ) -> AsyncIterator["BodyPartReader"]: return self # type: ignore[return-value] async def __anext__( self, ) -> Optional[Union["MultipartReader", BodyPartReader]]: part = await self.next() if part is None: raise StopAsyncIteration return part @classmethod def from_response( cls, response: "ClientResponse", ) -> MultipartResponseWrapper: """Constructs reader instance from HTTP response. :param response: :class:`~aiohttp.client.ClientResponse` instance """ obj = cls.response_wrapper_cls( response, cls(response.headers, response.content) ) return obj def at_eof(self) -> bool: """Returns True if the final boundary was reached, false otherwise.""" return self._at_eof async def next( self, ) -> Optional[Union["MultipartReader", BodyPartReader]]: """Emits the next multipart body part.""" # So, if we're at BOF, we need to skip till the boundary. if self._at_eof: return None await self._maybe_release_last_part() if self._at_bof: await self._read_until_first_boundary() self._at_bof = False else: await self._read_boundary() if self._at_eof: # we just read the last boundary, nothing to do there return None part = await self.fetch_next_part() # https://datatracker.ietf.org/doc/html/rfc7578#section-4.6 if ( self._last_part is None and self._mimetype.subtype == "form-data" and isinstance(part, BodyPartReader) ): _, params = parse_content_disposition(part.headers.get(CONTENT_DISPOSITION)) if params.get("name") == "_charset_": # Longest encoding in https://encoding.spec.whatwg.org/encodings.json # is 19 characters, so 32 should be more than enough for any valid encoding. charset = await part.read_chunk(32) if len(charset) > 31: raise RuntimeError("Invalid default charset") self._default_charset = charset.strip().decode() part = await self.fetch_next_part() self._last_part = part return self._last_part async def release(self) -> None: """Reads all the body parts to the void till the final boundary.""" while not self._at_eof: item = await self.next() if item is None: break await item.release() async def fetch_next_part( self, ) -> Union["MultipartReader", BodyPartReader]: """Returns the next body part reader.""" headers = await self._read_headers() return self._get_part_reader(headers) def _get_part_reader( self, headers: "CIMultiDictProxy[str]", ) -> Union["MultipartReader", BodyPartReader]: """Dispatches the response by the `Content-Type` header. Returns a suitable reader instance. :param dict headers: Response headers """ ctype = headers.get(CONTENT_TYPE, "") mimetype = parse_mimetype(ctype) if mimetype.type == "multipart": if self.multipart_reader_cls is None: return type(self)(headers, self._content) return self.multipart_reader_cls(headers, self._content) else: return self.part_reader_cls( self._boundary, headers, self._content, subtype=self._mimetype.subtype, default_charset=self._default_charset, ) def _get_boundary(self) -> str: boundary = self._mimetype.parameters["boundary"] if len(boundary) > 70: raise ValueError("boundary %r is too long (70 chars max)" % boundary) return boundary async def _readline(self) -> bytes: if self._unread: return self._unread.pop() return await self._content.readline() async def _read_until_first_boundary(self) -> None: while True: chunk = await self._readline() if chunk == b"": raise ValueError( "Could not find starting boundary %r" % (self._boundary) ) chunk = chunk.rstrip() if chunk == self._boundary: return elif chunk == self._boundary + b"--": self._at_eof = True return async def _read_boundary(self) -> None: chunk = (await self._readline()).rstrip() if chunk == self._boundary: pass elif chunk == self._boundary + b"--": self._at_eof = True epilogue = await self._readline() next_line = await self._readline() # the epilogue is expected and then either the end of input or the # parent multipart boundary, if the parent boundary is found then # it should be marked as unread and handed to the parent for # processing if next_line[:2] == b"--": self._unread.append(next_line) # otherwise the request is likely missing an epilogue and both # lines should be passed to the parent for processing # (this handles the old behavior gracefully) else: self._unread.extend([next_line, epilogue]) else: raise ValueError(f"Invalid boundary {chunk!r}, expected {self._boundary!r}") async def _read_headers(self) -> "CIMultiDictProxy[str]": lines = [b""] while True: chunk = await self._content.readline() chunk = chunk.strip() lines.append(chunk) if not chunk: break parser = HeadersParser() headers, raw_headers = parser.parse_headers(lines) return headers async def _maybe_release_last_part(self) -> None: """Ensures that the last read body part is read completely.""" if self._last_part is not None: if not self._last_part.at_eof(): await self._last_part.release() self._unread.extend(self._last_part._unread) self._last_part = None _Part = Tuple[Payload, str, str] class MultipartWriter(Payload): """Multipart body writer.""" def __init__(self, subtype: str = "mixed", boundary: Optional[str] = None) -> None: boundary = boundary if boundary is not None else uuid.uuid4().hex # The underlying Payload API demands a str (utf-8), not bytes, # so we need to ensure we don't lose anything during conversion. # As a result, require the boundary to be ASCII only. # In both situations. try: self._boundary = boundary.encode("ascii") except UnicodeEncodeError: raise ValueError("boundary should contain ASCII only chars") from None ctype = f"multipart/{subtype}; boundary={self._boundary_value}" super().__init__(None, content_type=ctype) self._parts: List[_Part] = [] self._is_form_data = subtype == "form-data" def __enter__(self) -> "MultipartWriter": return self def __exit__( self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType], ) -> None: pass def __iter__(self) -> Iterator[_Part]: return iter(self._parts) def __len__(self) -> int: return len(self._parts) def __bool__(self) -> bool: return True _valid_tchar_regex = re.compile(rb"\A[!#$%&'*+\-.^_`|~\w]+\Z") _invalid_qdtext_char_regex = re.compile(rb"[\x00-\x08\x0A-\x1F\x7F]") @property def _boundary_value(self) -> str: """Wrap boundary parameter value in quotes, if necessary. Reads self.boundary and returns a unicode string. """ # Refer to RFCs 7231, 7230, 5234. # # parameter = token "=" ( token / quoted-string ) # token = 1*tchar # quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE # qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text # obs-text = %x80-FF # quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) # tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" # / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" # / DIGIT / ALPHA # ; any VCHAR, except delimiters # VCHAR = %x21-7E value = self._boundary if re.match(self._valid_tchar_regex, value): return value.decode("ascii") # cannot fail if re.search(self._invalid_qdtext_char_regex, value): raise ValueError("boundary value contains invalid characters") # escape %x5C and %x22 quoted_value_content = value.replace(b"\\", b"\\\\") quoted_value_content = quoted_value_content.replace(b'"', b'\\"') return '"' + quoted_value_content.decode("ascii") + '"' @property def boundary(self) -> str: return self._boundary.decode("ascii") def append(self, obj: Any, headers: Optional[Mapping[str, str]] = None) -> Payload: if headers is None: headers = CIMultiDict() if isinstance(obj, Payload): obj.headers.update(headers) return self.append_payload(obj) else: try: payload = get_payload(obj, headers=headers) except LookupError: raise TypeError("Cannot create payload from %r" % obj) else: return self.append_payload(payload) def append_payload(self, payload: Payload) -> Payload: """Adds a new body part to multipart writer.""" encoding: Optional[str] = None te_encoding: Optional[str] = None if self._is_form_data: # https://datatracker.ietf.org/doc/html/rfc7578#section-4.7 # https://datatracker.ietf.org/doc/html/rfc7578#section-4.8 assert ( not {CONTENT_ENCODING, CONTENT_LENGTH, CONTENT_TRANSFER_ENCODING} & payload.headers.keys() ) # Set default Content-Disposition in case user doesn't create one if CONTENT_DISPOSITION not in payload.headers: name = f"section-{len(self._parts)}" payload.set_content_disposition("form-data", name=name) else: # compression encoding = payload.headers.get(CONTENT_ENCODING, "").lower() if encoding and encoding not in ("deflate", "gzip", "identity"): raise RuntimeError(f"unknown content encoding: {encoding}") if encoding == "identity": encoding = None # te encoding te_encoding = payload.headers.get(CONTENT_TRANSFER_ENCODING, "").lower() if te_encoding not in ("", "base64", "quoted-printable", "binary"): raise RuntimeError(f"unknown content transfer encoding: {te_encoding}") if te_encoding == "binary": te_encoding = None # size size = payload.size if size is not None and not (encoding or te_encoding): payload.headers[CONTENT_LENGTH] = str(size) self._parts.append((payload, encoding, te_encoding)) # type: ignore[arg-type] return payload def append_json( self, obj: Any, headers: Optional[Mapping[str, str]] = None ) -> Payload: """Helper to append JSON part.""" if headers is None: headers = CIMultiDict() return self.append_payload(JsonPayload(obj, headers=headers)) def append_form( self, obj: Union[Sequence[Tuple[str, str]], Mapping[str, str]], headers: Optional[Mapping[str, str]] = None, ) -> Payload: """Helper to append form urlencoded part.""" assert isinstance(obj, (Sequence, Mapping)) if headers is None: headers = CIMultiDict() if isinstance(obj, Mapping): obj = list(obj.items()) data = urlencode(obj, doseq=True) return self.append_payload( StringPayload( data, headers=headers, content_type="application/x-www-form-urlencoded" ) ) @property def size(self) -> Optional[int]: """Size of the payload.""" total = 0 for part, encoding, te_encoding in self._parts: if encoding or te_encoding or part.size is None: return None total += int( 2 + len(self._boundary) + 2 + part.size # b'--'+self._boundary+b'\r\n' + len(part._binary_headers) + 2 # b'\r\n' ) total += 2 + len(self._boundary) + 4 # b'--'+self._boundary+b'--\r\n' return total async def write(self, writer: Any, close_boundary: bool = True) -> None: """Write body.""" for part, encoding, te_encoding in self._parts: if self._is_form_data: # https://datatracker.ietf.org/doc/html/rfc7578#section-4.2 assert CONTENT_DISPOSITION in part.headers assert "name=" in part.headers[CONTENT_DISPOSITION] await writer.write(b"--" + self._boundary + b"\r\n") await writer.write(part._binary_headers) if encoding or te_encoding: w = MultipartPayloadWriter(writer) if encoding: w.enable_compression(encoding) if te_encoding: w.enable_encoding(te_encoding) await part.write(w) # type: ignore[arg-type] await w.write_eof() else: await part.write(writer) await writer.write(b"\r\n") if close_boundary: await writer.write(b"--" + self._boundary + b"--\r\n") class MultipartPayloadWriter: def __init__(self, writer: Any) -> None: self._writer = writer self._encoding: Optional[str] = None self._compress: Optional[ZLibCompressor] = None self._encoding_buffer: Optional[bytearray] = None def enable_encoding(self, encoding: str) -> None: if encoding == "base64": self._encoding = encoding self._encoding_buffer = bytearray() elif encoding == "quoted-printable": self._encoding = "quoted-printable" def enable_compression( self, encoding: str = "deflate", strategy: int = zlib.Z_DEFAULT_STRATEGY ) -> None: self._compress = ZLibCompressor( encoding=encoding, suppress_deflate_header=True, strategy=strategy, ) async def write_eof(self) -> None: if self._compress is not None: chunk = self._compress.flush() if chunk: self._compress = None await self.write(chunk) if self._encoding == "base64": if self._encoding_buffer: await self._writer.write(base64.b64encode(self._encoding_buffer)) async def write(self, chunk: bytes) -> None: if self._compress is not None: if chunk: chunk = await self._compress.compress(chunk) if not chunk: return if self._encoding == "base64": buf = self._encoding_buffer assert buf is not None buf.extend(chunk) if buf: div, mod = divmod(len(buf), 3) enc_chunk, self._encoding_buffer = (buf[: div * 3], buf[div * 3 :]) if enc_chunk: b64chunk = base64.b64encode(enc_chunk) await self._writer.write(b64chunk) elif self._encoding == "quoted-printable": await self._writer.write(binascii.b2a_qp(chunk)) else: await self._writer.write(chunk) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/payload.py0000644000175100001770000003234614607525266016305 0ustar00runnerdockerimport asyncio import enum import io import json import mimetypes import os import warnings from abc import ABC, abstractmethod from itertools import chain from typing import ( IO, TYPE_CHECKING, Any, ByteString, Dict, Final, Iterable, Optional, TextIO, Tuple, Type, Union, ) from multidict import CIMultiDict from . import hdrs from .abc import AbstractStreamWriter from .helpers import ( _SENTINEL, content_disposition_header, guess_filename, parse_mimetype, sentinel, ) from .streams import StreamReader from .typedefs import JSONEncoder, _CIMultiDict __all__ = ( "PAYLOAD_REGISTRY", "get_payload", "payload_type", "Payload", "BytesPayload", "StringPayload", "IOBasePayload", "BytesIOPayload", "BufferedReaderPayload", "TextIOPayload", "StringIOPayload", "JsonPayload", "AsyncIterablePayload", ) TOO_LARGE_BYTES_BODY: Final[int] = 2**20 # 1 MB if TYPE_CHECKING: from typing import List class LookupError(Exception): pass class Order(str, enum.Enum): normal = "normal" try_first = "try_first" try_last = "try_last" def get_payload(data: Any, *args: Any, **kwargs: Any) -> "Payload": return PAYLOAD_REGISTRY.get(data, *args, **kwargs) def register_payload( factory: Type["Payload"], type: Any, *, order: Order = Order.normal ) -> None: PAYLOAD_REGISTRY.register(factory, type, order=order) class payload_type: def __init__(self, type: Any, *, order: Order = Order.normal) -> None: self.type = type self.order = order def __call__(self, factory: Type["Payload"]) -> Type["Payload"]: register_payload(factory, self.type, order=self.order) return factory PayloadType = Type["Payload"] _PayloadRegistryItem = Tuple[PayloadType, Any] class PayloadRegistry: """Payload registry. note: we need zope.interface for more efficient adapter search """ def __init__(self) -> None: self._first: List[_PayloadRegistryItem] = [] self._normal: List[_PayloadRegistryItem] = [] self._last: List[_PayloadRegistryItem] = [] def get( self, data: Any, *args: Any, _CHAIN: "Type[chain[_PayloadRegistryItem]]" = chain, **kwargs: Any, ) -> "Payload": if isinstance(data, Payload): return data for factory, type in _CHAIN(self._first, self._normal, self._last): if isinstance(data, type): return factory(data, *args, **kwargs) raise LookupError() def register( self, factory: PayloadType, type: Any, *, order: Order = Order.normal ) -> None: if order is Order.try_first: self._first.append((factory, type)) elif order is Order.normal: self._normal.append((factory, type)) elif order is Order.try_last: self._last.append((factory, type)) else: raise ValueError(f"Unsupported order {order!r}") class Payload(ABC): _default_content_type: str = "application/octet-stream" _size: Optional[int] = None def __init__( self, value: Any, headers: Optional[ Union[_CIMultiDict, Dict[str, str], Iterable[Tuple[str, str]]] ] = None, content_type: Union[str, None, _SENTINEL] = sentinel, filename: Optional[str] = None, encoding: Optional[str] = None, **kwargs: Any, ) -> None: self._encoding = encoding self._filename = filename self._headers: _CIMultiDict = CIMultiDict() self._value = value if content_type is not sentinel and content_type is not None: self._headers[hdrs.CONTENT_TYPE] = content_type elif self._filename is not None: content_type = mimetypes.guess_type(self._filename)[0] if content_type is None: content_type = self._default_content_type self._headers[hdrs.CONTENT_TYPE] = content_type else: self._headers[hdrs.CONTENT_TYPE] = self._default_content_type self._headers.update(headers or {}) @property def size(self) -> Optional[int]: """Size of the payload.""" return self._size @property def filename(self) -> Optional[str]: """Filename of the payload.""" return self._filename @property def headers(self) -> _CIMultiDict: """Custom item headers""" return self._headers @property def _binary_headers(self) -> bytes: return ( "".join([k + ": " + v + "\r\n" for k, v in self.headers.items()]).encode( "utf-8" ) + b"\r\n" ) @property def encoding(self) -> Optional[str]: """Payload encoding""" return self._encoding @property def content_type(self) -> str: """Content type""" return self._headers[hdrs.CONTENT_TYPE] def set_content_disposition( self, disptype: str, quote_fields: bool = True, _charset: str = "utf-8", **params: Any, ) -> None: """Sets ``Content-Disposition`` header.""" self._headers[hdrs.CONTENT_DISPOSITION] = content_disposition_header( disptype, quote_fields=quote_fields, _charset=_charset, **params ) @abstractmethod async def write(self, writer: AbstractStreamWriter) -> None: """Write payload. writer is an AbstractStreamWriter instance: """ class BytesPayload(Payload): def __init__(self, value: ByteString, *args: Any, **kwargs: Any) -> None: if not isinstance(value, (bytes, bytearray, memoryview)): raise TypeError(f"value argument must be byte-ish, not {type(value)!r}") if "content_type" not in kwargs: kwargs["content_type"] = "application/octet-stream" super().__init__(value, *args, **kwargs) if isinstance(value, memoryview): self._size = value.nbytes else: self._size = len(value) if self._size > TOO_LARGE_BYTES_BODY: kwargs = {"source": self} warnings.warn( "Sending a large body directly with raw bytes might" " lock the event loop. You should probably pass an " "io.BytesIO object instead", ResourceWarning, **kwargs, ) async def write(self, writer: AbstractStreamWriter) -> None: await writer.write(self._value) class StringPayload(BytesPayload): def __init__( self, value: str, *args: Any, encoding: Optional[str] = None, content_type: Optional[str] = None, **kwargs: Any, ) -> None: if encoding is None: if content_type is None: real_encoding = "utf-8" content_type = "text/plain; charset=utf-8" else: mimetype = parse_mimetype(content_type) real_encoding = mimetype.parameters.get("charset", "utf-8") else: if content_type is None: content_type = "text/plain; charset=%s" % encoding real_encoding = encoding super().__init__( value.encode(real_encoding), encoding=real_encoding, content_type=content_type, *args, **kwargs, ) class StringIOPayload(StringPayload): def __init__(self, value: IO[str], *args: Any, **kwargs: Any) -> None: super().__init__(value.read(), *args, **kwargs) class IOBasePayload(Payload): _value: IO[Any] def __init__( self, value: IO[Any], disposition: str = "attachment", *args: Any, **kwargs: Any ) -> None: if "filename" not in kwargs: kwargs["filename"] = guess_filename(value) super().__init__(value, *args, **kwargs) if self._filename is not None and disposition is not None: if hdrs.CONTENT_DISPOSITION not in self.headers: self.set_content_disposition(disposition, filename=self._filename) async def write(self, writer: AbstractStreamWriter) -> None: loop = asyncio.get_event_loop() try: chunk = await loop.run_in_executor(None, self._value.read, 2**16) while chunk: await writer.write(chunk) chunk = await loop.run_in_executor(None, self._value.read, 2**16) finally: await loop.run_in_executor(None, self._value.close) class TextIOPayload(IOBasePayload): _value: TextIO def __init__( self, value: TextIO, *args: Any, encoding: Optional[str] = None, content_type: Optional[str] = None, **kwargs: Any, ) -> None: if encoding is None: if content_type is None: encoding = "utf-8" content_type = "text/plain; charset=utf-8" else: mimetype = parse_mimetype(content_type) encoding = mimetype.parameters.get("charset", "utf-8") else: if content_type is None: content_type = "text/plain; charset=%s" % encoding super().__init__( value, content_type=content_type, encoding=encoding, *args, **kwargs, ) @property def size(self) -> Optional[int]: try: return os.fstat(self._value.fileno()).st_size - self._value.tell() except OSError: return None async def write(self, writer: AbstractStreamWriter) -> None: loop = asyncio.get_event_loop() try: chunk = await loop.run_in_executor(None, self._value.read, 2**16) while chunk: data = ( chunk.encode(encoding=self._encoding) if self._encoding else chunk.encode() ) await writer.write(data) chunk = await loop.run_in_executor(None, self._value.read, 2**16) finally: await loop.run_in_executor(None, self._value.close) class BytesIOPayload(IOBasePayload): @property def size(self) -> int: position = self._value.tell() end = self._value.seek(0, os.SEEK_END) self._value.seek(position) return end - position class BufferedReaderPayload(IOBasePayload): @property def size(self) -> Optional[int]: try: return os.fstat(self._value.fileno()).st_size - self._value.tell() except OSError: # data.fileno() is not supported, e.g. # io.BufferedReader(io.BytesIO(b'data')) return None class JsonPayload(BytesPayload): def __init__( self, value: Any, encoding: str = "utf-8", content_type: str = "application/json", dumps: JSONEncoder = json.dumps, *args: Any, **kwargs: Any, ) -> None: super().__init__( dumps(value).encode(encoding), content_type=content_type, encoding=encoding, *args, **kwargs, ) if TYPE_CHECKING: from typing import AsyncIterable, AsyncIterator _AsyncIterator = AsyncIterator[bytes] _AsyncIterable = AsyncIterable[bytes] else: from collections.abc import AsyncIterable, AsyncIterator _AsyncIterator = AsyncIterator _AsyncIterable = AsyncIterable class AsyncIterablePayload(Payload): _iter: Optional[_AsyncIterator] = None def __init__(self, value: _AsyncIterable, *args: Any, **kwargs: Any) -> None: if not isinstance(value, AsyncIterable): raise TypeError( "value argument must support " "collections.abc.AsyncIterable interface, " "got {!r}".format(type(value)) ) if "content_type" not in kwargs: kwargs["content_type"] = "application/octet-stream" super().__init__(value, *args, **kwargs) self._iter = value.__aiter__() async def write(self, writer: AbstractStreamWriter) -> None: if self._iter: try: # iter is not None check prevents rare cases # when the case iterable is used twice while True: chunk = await self._iter.__anext__() await writer.write(chunk) except StopAsyncIteration: self._iter = None class StreamReaderPayload(AsyncIterablePayload): def __init__(self, value: StreamReader, *args: Any, **kwargs: Any) -> None: super().__init__(value.iter_any(), *args, **kwargs) PAYLOAD_REGISTRY = PayloadRegistry() PAYLOAD_REGISTRY.register(BytesPayload, (bytes, bytearray, memoryview)) PAYLOAD_REGISTRY.register(StringPayload, str) PAYLOAD_REGISTRY.register(StringIOPayload, io.StringIO) PAYLOAD_REGISTRY.register(TextIOPayload, io.TextIOBase) PAYLOAD_REGISTRY.register(BytesIOPayload, io.BytesIO) PAYLOAD_REGISTRY.register(BufferedReaderPayload, (io.BufferedReader, io.BufferedRandom)) PAYLOAD_REGISTRY.register(IOBasePayload, io.IOBase) PAYLOAD_REGISTRY.register(StreamReaderPayload, StreamReader) # try_last for giving a chance to more specialized async interables like # multidict.BodyPartReaderPayload override the default PAYLOAD_REGISTRY.register(AsyncIterablePayload, AsyncIterable, order=Order.try_last) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/payload_streamer.py0000644000175100001770000000404714607525266020204 0ustar00runnerdocker""" Payload implementation for coroutines as data provider. As a simple case, you can upload data from file:: @aiohttp.streamer async def file_sender(writer, file_name=None): with open(file_name, 'rb') as f: chunk = f.read(2**16) while chunk: await writer.write(chunk) chunk = f.read(2**16) Then you can use `file_sender` like this: async with session.post('http://httpbin.org/post', data=file_sender(file_name='huge_file')) as resp: print(await resp.text()) ..note:: Coroutine must accept `writer` as first argument """ import types import warnings from typing import Any, Awaitable, Callable, Dict, Tuple from .abc import AbstractStreamWriter from .payload import Payload, payload_type __all__ = ("streamer",) class _stream_wrapper: def __init__( self, coro: Callable[..., Awaitable[None]], args: Tuple[Any, ...], kwargs: Dict[str, Any], ) -> None: self.coro = types.coroutine(coro) self.args = args self.kwargs = kwargs async def __call__(self, writer: AbstractStreamWriter) -> None: await self.coro(writer, *self.args, **self.kwargs) class streamer: def __init__(self, coro: Callable[..., Awaitable[None]]) -> None: warnings.warn( "@streamer is deprecated, use async generators instead", DeprecationWarning, stacklevel=2, ) self.coro = coro def __call__(self, *args: Any, **kwargs: Any) -> _stream_wrapper: return _stream_wrapper(self.coro, args, kwargs) @payload_type(_stream_wrapper) class StreamWrapperPayload(Payload): async def write(self, writer: AbstractStreamWriter) -> None: await self._value(writer) @payload_type(streamer) class StreamPayload(StreamWrapperPayload): def __init__(self, value: Any, *args: Any, **kwargs: Any) -> None: super().__init__(value(), *args, **kwargs) async def write(self, writer: AbstractStreamWriter) -> None: await self._value(writer) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/py.typed0000644000175100001770000000000714607525266015766 0ustar00runnerdockerMarker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/pytest_plugin.py0000644000175100001770000002652514607525266017564 0ustar00runnerdockerimport asyncio import contextlib import warnings from typing import Any, Awaitable, Callable, Dict, Iterator, Optional, Type, Union import pytest from aiohttp.helpers import isasyncgenfunction from aiohttp.web import Application from .test_utils import ( BaseTestServer, RawTestServer, TestClient, TestServer, loop_context, setup_test_loop, teardown_test_loop, unused_port as _unused_port, ) try: import uvloop except ImportError: # pragma: no cover uvloop = None # type: ignore[assignment] AiohttpClient = Callable[[Union[Application, BaseTestServer]], Awaitable[TestClient]] AiohttpRawServer = Callable[[Application], Awaitable[RawTestServer]] AiohttpServer = Callable[[Application], Awaitable[TestServer]] def pytest_addoption(parser): # type: ignore[no-untyped-def] parser.addoption( "--aiohttp-fast", action="store_true", default=False, help="run tests faster by disabling extra checks", ) parser.addoption( "--aiohttp-loop", action="store", default="pyloop", help="run tests with specific loop: pyloop, uvloop or all", ) parser.addoption( "--aiohttp-enable-loop-debug", action="store_true", default=False, help="enable event loop debug mode", ) def pytest_fixture_setup(fixturedef): # type: ignore[no-untyped-def] """Set up pytest fixture. Allow fixtures to be coroutines. Run coroutine fixtures in an event loop. """ func = fixturedef.func if isasyncgenfunction(func): # async generator fixture is_async_gen = True elif asyncio.iscoroutinefunction(func): # regular async fixture is_async_gen = False else: # not an async fixture, nothing to do return strip_request = False if "request" not in fixturedef.argnames: fixturedef.argnames += ("request",) strip_request = True def wrapper(*args, **kwargs): # type: ignore[no-untyped-def] request = kwargs["request"] if strip_request: del kwargs["request"] # if neither the fixture nor the test use the 'loop' fixture, # 'getfixturevalue' will fail because the test is not parameterized # (this can be removed someday if 'loop' is no longer parameterized) if "loop" not in request.fixturenames: raise Exception( "Asynchronous fixtures must depend on the 'loop' fixture or " "be used in tests depending from it." ) _loop = request.getfixturevalue("loop") if is_async_gen: # for async generators, we need to advance the generator once, # then advance it again in a finalizer gen = func(*args, **kwargs) def finalizer(): # type: ignore[no-untyped-def] try: return _loop.run_until_complete(gen.__anext__()) except StopAsyncIteration: pass request.addfinalizer(finalizer) return _loop.run_until_complete(gen.__anext__()) else: return _loop.run_until_complete(func(*args, **kwargs)) fixturedef.func = wrapper @pytest.fixture def fast(request): # type: ignore[no-untyped-def] """--fast config option""" return request.config.getoption("--aiohttp-fast") @pytest.fixture def loop_debug(request): # type: ignore[no-untyped-def] """--enable-loop-debug config option""" return request.config.getoption("--aiohttp-enable-loop-debug") @contextlib.contextmanager def _runtime_warning_context(): # type: ignore[no-untyped-def] """Context manager which checks for RuntimeWarnings. This exists specifically to avoid "coroutine 'X' was never awaited" warnings being missed. If RuntimeWarnings occur in the context a RuntimeError is raised. """ with warnings.catch_warnings(record=True) as _warnings: yield rw = [ "{w.filename}:{w.lineno}:{w.message}".format(w=w) for w in _warnings if w.category == RuntimeWarning ] if rw: raise RuntimeError( "{} Runtime Warning{},\n{}".format( len(rw), "" if len(rw) == 1 else "s", "\n".join(rw) ) ) @contextlib.contextmanager def _passthrough_loop_context(loop, fast=False): # type: ignore[no-untyped-def] """Passthrough loop context. Sets up and tears down a loop unless one is passed in via the loop argument when it's passed straight through. """ if loop: # loop already exists, pass it straight through yield loop else: # this shadows loop_context's standard behavior loop = setup_test_loop() yield loop teardown_test_loop(loop, fast=fast) def pytest_pycollect_makeitem(collector, name, obj): # type: ignore[no-untyped-def] """Fix pytest collecting for coroutines.""" if collector.funcnamefilter(name) and asyncio.iscoroutinefunction(obj): return list(collector._genfunctions(name, obj)) def pytest_pyfunc_call(pyfuncitem): # type: ignore[no-untyped-def] """Run coroutines in an event loop instead of a normal function call.""" fast = pyfuncitem.config.getoption("--aiohttp-fast") if asyncio.iscoroutinefunction(pyfuncitem.function): existing_loop = pyfuncitem.funcargs.get( "proactor_loop" ) or pyfuncitem.funcargs.get("loop", None) with _runtime_warning_context(): with _passthrough_loop_context(existing_loop, fast=fast) as _loop: testargs = { arg: pyfuncitem.funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames } _loop.run_until_complete(pyfuncitem.obj(**testargs)) return True def pytest_generate_tests(metafunc): # type: ignore[no-untyped-def] if "loop_factory" not in metafunc.fixturenames: return loops = metafunc.config.option.aiohttp_loop avail_factories: Dict[str, Type[asyncio.AbstractEventLoopPolicy]] avail_factories = {"pyloop": asyncio.DefaultEventLoopPolicy} if uvloop is not None: # pragma: no cover avail_factories["uvloop"] = uvloop.EventLoopPolicy if loops == "all": loops = "pyloop,uvloop?" factories = {} # type: ignore[var-annotated] for name in loops.split(","): required = not name.endswith("?") name = name.strip(" ?") if name not in avail_factories: # pragma: no cover if required: raise ValueError( "Unknown loop '%s', available loops: %s" % (name, list(factories.keys())) ) else: continue factories[name] = avail_factories[name] metafunc.parametrize( "loop_factory", list(factories.values()), ids=list(factories.keys()) ) @pytest.fixture def loop(loop_factory, fast, loop_debug): # type: ignore[no-untyped-def] """Return an instance of the event loop.""" policy = loop_factory() asyncio.set_event_loop_policy(policy) with loop_context(fast=fast) as _loop: if loop_debug: _loop.set_debug(True) # pragma: no cover asyncio.set_event_loop(_loop) yield _loop @pytest.fixture def proactor_loop(): # type: ignore[no-untyped-def] policy = asyncio.WindowsProactorEventLoopPolicy() # type: ignore[attr-defined] asyncio.set_event_loop_policy(policy) with loop_context(policy.new_event_loop) as _loop: asyncio.set_event_loop(_loop) yield _loop @pytest.fixture def unused_port(aiohttp_unused_port: Callable[[], int]) -> Callable[[], int]: warnings.warn( "Deprecated, use aiohttp_unused_port fixture instead", DeprecationWarning, stacklevel=2, ) return aiohttp_unused_port @pytest.fixture def aiohttp_unused_port() -> Callable[[], int]: """Return a port that is unused on the current host.""" return _unused_port @pytest.fixture def aiohttp_server(loop: asyncio.AbstractEventLoop) -> Iterator[AiohttpServer]: """Factory to create a TestServer instance, given an app. aiohttp_server(app, **kwargs) """ servers = [] async def go(app, *, port=None, **kwargs): # type: ignore[no-untyped-def] server = TestServer(app, port=port) await server.start_server(loop=loop, **kwargs) servers.append(server) return server yield go async def finalize() -> None: while servers: await servers.pop().close() loop.run_until_complete(finalize()) @pytest.fixture def test_server(aiohttp_server): # type: ignore[no-untyped-def] # pragma: no cover warnings.warn( "Deprecated, use aiohttp_server fixture instead", DeprecationWarning, stacklevel=2, ) return aiohttp_server @pytest.fixture def aiohttp_raw_server(loop: asyncio.AbstractEventLoop) -> Iterator[AiohttpRawServer]: """Factory to create a RawTestServer instance, given a web handler. aiohttp_raw_server(handler, **kwargs) """ servers = [] async def go(handler, *, port=None, **kwargs): # type: ignore[no-untyped-def] server = RawTestServer(handler, port=port) await server.start_server(loop=loop, **kwargs) servers.append(server) return server yield go async def finalize() -> None: while servers: await servers.pop().close() loop.run_until_complete(finalize()) @pytest.fixture def raw_test_server( # type: ignore[no-untyped-def] # pragma: no cover aiohttp_raw_server, ): warnings.warn( "Deprecated, use aiohttp_raw_server fixture instead", DeprecationWarning, stacklevel=2, ) return aiohttp_raw_server @pytest.fixture def aiohttp_client( loop: asyncio.AbstractEventLoop, ) -> Iterator[AiohttpClient]: """Factory to create a TestClient instance. aiohttp_client(app, **kwargs) aiohttp_client(server, **kwargs) aiohttp_client(raw_server, **kwargs) """ clients = [] async def go( __param: Union[Application, BaseTestServer], *args: Any, server_kwargs: Optional[Dict[str, Any]] = None, **kwargs: Any ) -> TestClient: if isinstance(__param, Callable) and not isinstance( # type: ignore[arg-type] __param, (Application, BaseTestServer) ): __param = __param(loop, *args, **kwargs) kwargs = {} else: assert not args, "args should be empty" if isinstance(__param, Application): server_kwargs = server_kwargs or {} server = TestServer(__param, loop=loop, **server_kwargs) client = TestClient(server, loop=loop, **kwargs) elif isinstance(__param, BaseTestServer): client = TestClient(__param, loop=loop, **kwargs) else: raise ValueError("Unknown argument type: %r" % type(__param)) await client.start_server() clients.append(client) return client yield go async def finalize() -> None: while clients: await clients.pop().close() loop.run_until_complete(finalize()) @pytest.fixture def test_client(aiohttp_client): # type: ignore[no-untyped-def] # pragma: no cover warnings.warn( "Deprecated, use aiohttp_client fixture instead", DeprecationWarning, stacklevel=2, ) return aiohttp_client ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/resolver.py0000644000175100001770000001171614607525266016513 0ustar00runnerdockerimport asyncio import socket from typing import Any, Dict, List, Optional, Type, Union from .abc import AbstractResolver from .helpers import get_running_loop __all__ = ("ThreadedResolver", "AsyncResolver", "DefaultResolver") try: import aiodns # aiodns_default = hasattr(aiodns.DNSResolver, 'gethostbyname') except ImportError: # pragma: no cover aiodns = None aiodns_default = False class ThreadedResolver(AbstractResolver): """Threaded resolver. Uses an Executor for synchronous getaddrinfo() calls. concurrent.futures.ThreadPoolExecutor is used by default. """ def __init__(self, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: self._loop = get_running_loop(loop) async def resolve( self, hostname: str, port: int = 0, family: int = socket.AF_INET ) -> List[Dict[str, Any]]: infos = await self._loop.getaddrinfo( hostname, port, type=socket.SOCK_STREAM, family=family, flags=socket.AI_ADDRCONFIG, ) hosts = [] for family, _, proto, _, address in infos: if family == socket.AF_INET6: if len(address) < 3: # IPv6 is not supported by Python build, # or IPv6 is not enabled in the host continue if address[3]: # This is essential for link-local IPv6 addresses. # LL IPv6 is a VERY rare case. Strictly speaking, we should use # getnameinfo() unconditionally, but performance makes sense. host, _port = socket.getnameinfo( address, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV ) port = int(_port) else: host, port = address[:2] else: # IPv4 assert family == socket.AF_INET host, port = address # type: ignore[misc] hosts.append( { "hostname": hostname, "host": host, "port": port, "family": family, "proto": proto, "flags": socket.AI_NUMERICHOST | socket.AI_NUMERICSERV, } ) return hosts async def close(self) -> None: pass class AsyncResolver(AbstractResolver): """Use the `aiodns` package to make asynchronous DNS lookups""" def __init__( self, loop: Optional[asyncio.AbstractEventLoop] = None, *args: Any, **kwargs: Any ) -> None: if aiodns is None: raise RuntimeError("Resolver requires aiodns library") self._loop = get_running_loop(loop) self._resolver = aiodns.DNSResolver(*args, loop=loop, **kwargs) if not hasattr(self._resolver, "gethostbyname"): # aiodns 1.1 is not available, fallback to DNSResolver.query self.resolve = self._resolve_with_query # type: ignore async def resolve( self, host: str, port: int = 0, family: int = socket.AF_INET ) -> List[Dict[str, Any]]: try: resp = await self._resolver.gethostbyname(host, family) except aiodns.error.DNSError as exc: msg = exc.args[1] if len(exc.args) >= 1 else "DNS lookup failed" raise OSError(msg) from exc hosts = [] for address in resp.addresses: hosts.append( { "hostname": host, "host": address, "port": port, "family": family, "proto": 0, "flags": socket.AI_NUMERICHOST | socket.AI_NUMERICSERV, } ) if not hosts: raise OSError("DNS lookup failed") return hosts async def _resolve_with_query( self, host: str, port: int = 0, family: int = socket.AF_INET ) -> List[Dict[str, Any]]: if family == socket.AF_INET6: qtype = "AAAA" else: qtype = "A" try: resp = await self._resolver.query(host, qtype) except aiodns.error.DNSError as exc: msg = exc.args[1] if len(exc.args) >= 1 else "DNS lookup failed" raise OSError(msg) from exc hosts = [] for rr in resp: hosts.append( { "hostname": host, "host": rr.host, "port": port, "family": family, "proto": 0, "flags": socket.AI_NUMERICHOST, } ) if not hosts: raise OSError("DNS lookup failed") return hosts async def close(self) -> None: self._resolver.cancel() _DefaultType = Type[Union[AsyncResolver, ThreadedResolver]] DefaultResolver: _DefaultType = AsyncResolver if aiodns_default else ThreadedResolver ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/streams.py0000644000175100001770000005121014607525266016321 0ustar00runnerdockerimport asyncio import collections import warnings from typing import ( Awaitable, Callable, Deque, Final, Generic, List, Optional, Tuple, TypeVar, ) from .base_protocol import BaseProtocol from .helpers import ( _EXC_SENTINEL, BaseTimerContext, TimerNoop, set_exception, set_result, ) from .log import internal_logger __all__ = ( "EMPTY_PAYLOAD", "EofStream", "StreamReader", "DataQueue", "FlowControlDataQueue", ) _T = TypeVar("_T") class EofStream(Exception): """eof stream indication.""" class AsyncStreamIterator(Generic[_T]): def __init__(self, read_func: Callable[[], Awaitable[_T]]) -> None: self.read_func = read_func def __aiter__(self) -> "AsyncStreamIterator[_T]": return self async def __anext__(self) -> _T: try: rv = await self.read_func() except EofStream: raise StopAsyncIteration if rv == b"": raise StopAsyncIteration return rv class ChunkTupleAsyncStreamIterator: def __init__(self, stream: "StreamReader") -> None: self._stream = stream def __aiter__(self) -> "ChunkTupleAsyncStreamIterator": return self async def __anext__(self) -> Tuple[bytes, bool]: rv = await self._stream.readchunk() if rv == (b"", False): raise StopAsyncIteration return rv class AsyncStreamReaderMixin: def __aiter__(self) -> AsyncStreamIterator[bytes]: return AsyncStreamIterator(self.readline) # type: ignore[attr-defined] def iter_chunked(self, n: int) -> AsyncStreamIterator[bytes]: """Returns an asynchronous iterator that yields chunks of size n.""" return AsyncStreamIterator(lambda: self.read(n)) # type: ignore[attr-defined] def iter_any(self) -> AsyncStreamIterator[bytes]: """Yield all available data as soon as it is received.""" return AsyncStreamIterator(self.readany) # type: ignore[attr-defined] def iter_chunks(self) -> ChunkTupleAsyncStreamIterator: """Yield chunks of data as they are received by the server. The yielded objects are tuples of (bytes, bool) as returned by the StreamReader.readchunk method. """ return ChunkTupleAsyncStreamIterator(self) # type: ignore[arg-type] class StreamReader(AsyncStreamReaderMixin): """An enhancement of asyncio.StreamReader. Supports asynchronous iteration by line, chunk or as available:: async for line in reader: ... async for chunk in reader.iter_chunked(1024): ... async for slice in reader.iter_any(): ... """ total_bytes = 0 def __init__( self, protocol: BaseProtocol, limit: int, *, timer: Optional[BaseTimerContext] = None, loop: Optional[asyncio.AbstractEventLoop] = None, ) -> None: self._protocol = protocol self._low_water = limit self._high_water = limit * 2 if loop is None: loop = asyncio.get_event_loop() self._loop = loop self._size = 0 self._cursor = 0 self._http_chunk_splits: Optional[List[int]] = None self._buffer: Deque[bytes] = collections.deque() self._buffer_offset = 0 self._eof = False self._waiter: Optional[asyncio.Future[None]] = None self._eof_waiter: Optional[asyncio.Future[None]] = None self._exception: Optional[BaseException] = None self._timer = TimerNoop() if timer is None else timer self._eof_callbacks: List[Callable[[], None]] = [] def __repr__(self) -> str: info = [self.__class__.__name__] if self._size: info.append("%d bytes" % self._size) if self._eof: info.append("eof") if self._low_water != 2**16: # default limit info.append("low=%d high=%d" % (self._low_water, self._high_water)) if self._waiter: info.append("w=%r" % self._waiter) if self._exception: info.append("e=%r" % self._exception) return "<%s>" % " ".join(info) def get_read_buffer_limits(self) -> Tuple[int, int]: return (self._low_water, self._high_water) def exception(self) -> Optional[BaseException]: return self._exception def set_exception( self, exc: BaseException, exc_cause: BaseException = _EXC_SENTINEL, ) -> None: self._exception = exc self._eof_callbacks.clear() waiter = self._waiter if waiter is not None: self._waiter = None set_exception(waiter, exc, exc_cause) waiter = self._eof_waiter if waiter is not None: self._eof_waiter = None set_exception(waiter, exc, exc_cause) def on_eof(self, callback: Callable[[], None]) -> None: if self._eof: try: callback() except Exception: internal_logger.exception("Exception in eof callback") else: self._eof_callbacks.append(callback) def feed_eof(self) -> None: self._eof = True waiter = self._waiter if waiter is not None: self._waiter = None set_result(waiter, None) waiter = self._eof_waiter if waiter is not None: self._eof_waiter = None set_result(waiter, None) for cb in self._eof_callbacks: try: cb() except Exception: internal_logger.exception("Exception in eof callback") self._eof_callbacks.clear() def is_eof(self) -> bool: """Return True if 'feed_eof' was called.""" return self._eof def at_eof(self) -> bool: """Return True if the buffer is empty and 'feed_eof' was called.""" return self._eof and not self._buffer async def wait_eof(self) -> None: if self._eof: return assert self._eof_waiter is None self._eof_waiter = self._loop.create_future() try: await self._eof_waiter finally: self._eof_waiter = None def unread_data(self, data: bytes) -> None: """rollback reading some data from stream, inserting it to buffer head.""" warnings.warn( "unread_data() is deprecated " "and will be removed in future releases (#3260)", DeprecationWarning, stacklevel=2, ) if not data: return if self._buffer_offset: self._buffer[0] = self._buffer[0][self._buffer_offset :] self._buffer_offset = 0 self._size += len(data) self._cursor -= len(data) self._buffer.appendleft(data) self._eof_counter = 0 # TODO: size is ignored, remove the param later def feed_data(self, data: bytes, size: int = 0) -> None: assert not self._eof, "feed_data after feed_eof" if not data: return self._size += len(data) self._buffer.append(data) self.total_bytes += len(data) waiter = self._waiter if waiter is not None: self._waiter = None set_result(waiter, None) if self._size > self._high_water and not self._protocol._reading_paused: self._protocol.pause_reading() def begin_http_chunk_receiving(self) -> None: if self._http_chunk_splits is None: if self.total_bytes: raise RuntimeError( "Called begin_http_chunk_receiving when" "some data was already fed" ) self._http_chunk_splits = [] def end_http_chunk_receiving(self) -> None: if self._http_chunk_splits is None: raise RuntimeError( "Called end_chunk_receiving without calling " "begin_chunk_receiving first" ) # self._http_chunk_splits contains logical byte offsets from start of # the body transfer. Each offset is the offset of the end of a chunk. # "Logical" means bytes, accessible for a user. # If no chunks containing logical data were received, current position # is difinitely zero. pos = self._http_chunk_splits[-1] if self._http_chunk_splits else 0 if self.total_bytes == pos: # We should not add empty chunks here. So we check for that. # Note, when chunked + gzip is used, we can receive a chunk # of compressed data, but that data may not be enough for gzip FSM # to yield any uncompressed data. That's why current position may # not change after receiving a chunk. return self._http_chunk_splits.append(self.total_bytes) # wake up readchunk when end of http chunk received waiter = self._waiter if waiter is not None: self._waiter = None set_result(waiter, None) async def _wait(self, func_name: str) -> None: # StreamReader uses a future to link the protocol feed_data() method # to a read coroutine. Running two read coroutines at the same time # would have an unexpected behaviour. It would not possible to know # which coroutine would get the next data. if self._waiter is not None: raise RuntimeError( "%s() called while another coroutine is " "already waiting for incoming data" % func_name ) waiter = self._waiter = self._loop.create_future() try: with self._timer: await waiter finally: self._waiter = None async def readline(self) -> bytes: return await self.readuntil() async def readuntil(self, separator: bytes = b"\n") -> bytes: seplen = len(separator) if seplen == 0: raise ValueError("Separator should be at least one-byte string") if self._exception is not None: raise self._exception chunk = b"" chunk_size = 0 not_enough = True while not_enough: while self._buffer and not_enough: offset = self._buffer_offset ichar = self._buffer[0].find(separator, offset) + 1 # Read from current offset to found separator or to the end. data = self._read_nowait_chunk( ichar - offset + seplen - 1 if ichar else -1 ) chunk += data chunk_size += len(data) if ichar: not_enough = False if chunk_size > self._high_water: raise ValueError("Chunk too big") if self._eof: break if not_enough: await self._wait("readuntil") return chunk async def read(self, n: int = -1) -> bytes: if self._exception is not None: raise self._exception # migration problem; with DataQueue you have to catch # EofStream exception, so common way is to run payload.read() inside # infinite loop. what can cause real infinite loop with StreamReader # lets keep this code one major release. if __debug__: if self._eof and not self._buffer: self._eof_counter = getattr(self, "_eof_counter", 0) + 1 if self._eof_counter > 5: internal_logger.warning( "Multiple access to StreamReader in eof state, " "might be infinite loop.", stack_info=True, ) if not n: return b"" if n < 0: # This used to just loop creating a new waiter hoping to # collect everything in self._buffer, but that would # deadlock if the subprocess sends more than self.limit # bytes. So just call self.readany() until EOF. blocks = [] while True: block = await self.readany() if not block: break blocks.append(block) return b"".join(blocks) # TODO: should be `if` instead of `while` # because waiter maybe triggered on chunk end, # without feeding any data while not self._buffer and not self._eof: await self._wait("read") return self._read_nowait(n) async def readany(self) -> bytes: if self._exception is not None: raise self._exception # TODO: should be `if` instead of `while` # because waiter maybe triggered on chunk end, # without feeding any data while not self._buffer and not self._eof: await self._wait("readany") return self._read_nowait(-1) async def readchunk(self) -> Tuple[bytes, bool]: """Returns a tuple of (data, end_of_http_chunk). When chunked transfer encoding is used, end_of_http_chunk is a boolean indicating if the end of the data corresponds to the end of a HTTP chunk , otherwise it is always False. """ while True: if self._exception is not None: raise self._exception while self._http_chunk_splits: pos = self._http_chunk_splits.pop(0) if pos == self._cursor: return (b"", True) if pos > self._cursor: return (self._read_nowait(pos - self._cursor), True) internal_logger.warning( "Skipping HTTP chunk end due to data " "consumption beyond chunk boundary" ) if self._buffer: return (self._read_nowait_chunk(-1), False) # return (self._read_nowait(-1), False) if self._eof: # Special case for signifying EOF. # (b'', True) is not a final return value actually. return (b"", False) await self._wait("readchunk") async def readexactly(self, n: int) -> bytes: if self._exception is not None: raise self._exception blocks: List[bytes] = [] while n > 0: block = await self.read(n) if not block: partial = b"".join(blocks) raise asyncio.IncompleteReadError(partial, len(partial) + n) blocks.append(block) n -= len(block) return b"".join(blocks) def read_nowait(self, n: int = -1) -> bytes: # default was changed to be consistent with .read(-1) # # I believe the most users don't know about the method and # they are not affected. if self._exception is not None: raise self._exception if self._waiter and not self._waiter.done(): raise RuntimeError( "Called while some coroutine is waiting for incoming data." ) return self._read_nowait(n) def _read_nowait_chunk(self, n: int) -> bytes: first_buffer = self._buffer[0] offset = self._buffer_offset if n != -1 and len(first_buffer) - offset > n: data = first_buffer[offset : offset + n] self._buffer_offset += n elif offset: self._buffer.popleft() data = first_buffer[offset:] self._buffer_offset = 0 else: data = self._buffer.popleft() self._size -= len(data) self._cursor += len(data) chunk_splits = self._http_chunk_splits # Prevent memory leak: drop useless chunk splits while chunk_splits and chunk_splits[0] < self._cursor: chunk_splits.pop(0) if self._size < self._low_water and self._protocol._reading_paused: self._protocol.resume_reading() return data def _read_nowait(self, n: int) -> bytes: """Read not more than n bytes, or whole buffer if n == -1""" self._timer.assert_timeout() chunks = [] while self._buffer: chunk = self._read_nowait_chunk(n) chunks.append(chunk) if n != -1: n -= len(chunk) if n == 0: break return b"".join(chunks) if chunks else b"" class EmptyStreamReader(StreamReader): # lgtm [py/missing-call-to-init] def __init__(self) -> None: self._read_eof_chunk = False def __repr__(self) -> str: return "<%s>" % self.__class__.__name__ def exception(self) -> Optional[BaseException]: return None def set_exception( self, exc: BaseException, exc_cause: BaseException = _EXC_SENTINEL, ) -> None: pass def on_eof(self, callback: Callable[[], None]) -> None: try: callback() except Exception: internal_logger.exception("Exception in eof callback") def feed_eof(self) -> None: pass def is_eof(self) -> bool: return True def at_eof(self) -> bool: return True async def wait_eof(self) -> None: return def feed_data(self, data: bytes, n: int = 0) -> None: pass async def readline(self) -> bytes: return b"" async def read(self, n: int = -1) -> bytes: return b"" # TODO add async def readuntil async def readany(self) -> bytes: return b"" async def readchunk(self) -> Tuple[bytes, bool]: if not self._read_eof_chunk: self._read_eof_chunk = True return (b"", False) return (b"", True) async def readexactly(self, n: int) -> bytes: raise asyncio.IncompleteReadError(b"", n) def read_nowait(self, n: int = -1) -> bytes: return b"" EMPTY_PAYLOAD: Final[StreamReader] = EmptyStreamReader() class DataQueue(Generic[_T]): """DataQueue is a general-purpose blocking queue with one reader.""" def __init__(self, loop: asyncio.AbstractEventLoop) -> None: self._loop = loop self._eof = False self._waiter: Optional[asyncio.Future[None]] = None self._exception: Optional[BaseException] = None self._size = 0 self._buffer: Deque[Tuple[_T, int]] = collections.deque() def __len__(self) -> int: return len(self._buffer) def is_eof(self) -> bool: return self._eof def at_eof(self) -> bool: return self._eof and not self._buffer def exception(self) -> Optional[BaseException]: return self._exception def set_exception( self, exc: BaseException, exc_cause: BaseException = _EXC_SENTINEL, ) -> None: self._eof = True self._exception = exc waiter = self._waiter if waiter is not None: self._waiter = None set_exception(waiter, exc, exc_cause) def feed_data(self, data: _T, size: int = 0) -> None: self._size += size self._buffer.append((data, size)) waiter = self._waiter if waiter is not None: self._waiter = None set_result(waiter, None) def feed_eof(self) -> None: self._eof = True waiter = self._waiter if waiter is not None: self._waiter = None set_result(waiter, None) async def read(self) -> _T: if not self._buffer and not self._eof: assert not self._waiter self._waiter = self._loop.create_future() try: await self._waiter except (asyncio.CancelledError, asyncio.TimeoutError): self._waiter = None raise if self._buffer: data, size = self._buffer.popleft() self._size -= size return data else: if self._exception is not None: raise self._exception else: raise EofStream def __aiter__(self) -> AsyncStreamIterator[_T]: return AsyncStreamIterator(self.read) class FlowControlDataQueue(DataQueue[_T]): """FlowControlDataQueue resumes and pauses an underlying stream. It is a destination for parsed data. """ def __init__( self, protocol: BaseProtocol, limit: int, *, loop: asyncio.AbstractEventLoop ) -> None: super().__init__(loop=loop) self._protocol = protocol self._limit = limit * 2 def feed_data(self, data: _T, size: int = 0) -> None: super().feed_data(data, size) if self._size > self._limit and not self._protocol._reading_paused: self._protocol.pause_reading() async def read(self) -> _T: try: return await super().read() finally: if self._size < self._limit and self._protocol._reading_paused: self._protocol.resume_reading() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/tcp_helpers.py0000644000175100001770000000170114607525266017153 0ustar00runnerdocker"""Helper methods to tune a TCP connection""" import asyncio import socket from contextlib import suppress from typing import Optional # noqa __all__ = ("tcp_keepalive", "tcp_nodelay") if hasattr(socket, "SO_KEEPALIVE"): def tcp_keepalive(transport: asyncio.Transport) -> None: sock = transport.get_extra_info("socket") if sock is not None: sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) else: def tcp_keepalive(transport: asyncio.Transport) -> None: # pragma: no cover pass def tcp_nodelay(transport: asyncio.Transport, value: bool) -> None: sock = transport.get_extra_info("socket") if sock is None: return if sock.family not in (socket.AF_INET, socket.AF_INET6): return value = bool(value) # socket may be closed already, on windows OSError get raised with suppress(OSError): sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, value) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/test_utils.py0000644000175100001770000004777314607525266017065 0ustar00runnerdocker"""Utilities shared by tests.""" import asyncio import contextlib import gc import inspect import ipaddress import os import socket import sys import warnings from abc import ABC, abstractmethod from types import TracebackType from typing import ( TYPE_CHECKING, Any, Callable, Iterator, List, Optional, Type, Union, cast, ) from unittest import IsolatedAsyncioTestCase, mock from aiosignal import Signal from multidict import CIMultiDict, CIMultiDictProxy from yarl import URL import aiohttp from aiohttp.client import _RequestContextManager, _WSRequestContextManager from . import ClientSession, hdrs from .abc import AbstractCookieJar from .client_reqrep import ClientResponse from .client_ws import ClientWebSocketResponse from .helpers import sentinel from .http import HttpVersion, RawRequestMessage from .typedefs import StrOrURL from .web import ( Application, AppRunner, BaseRunner, Request, Server, ServerRunner, SockSite, UrlMappingMatchInfo, ) from .web_protocol import _RequestHandler if TYPE_CHECKING: from ssl import SSLContext else: SSLContext = None REUSE_ADDRESS = os.name == "posix" and sys.platform != "cygwin" def get_unused_port_socket( host: str, family: socket.AddressFamily = socket.AF_INET ) -> socket.socket: return get_port_socket(host, 0, family) def get_port_socket( host: str, port: int, family: socket.AddressFamily ) -> socket.socket: s = socket.socket(family, socket.SOCK_STREAM) if REUSE_ADDRESS: # Windows has different semantics for SO_REUSEADDR, # so don't set it. Ref: # https://docs.microsoft.com/en-us/windows/win32/winsock/using-so-reuseaddr-and-so-exclusiveaddruse s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((host, port)) return s def unused_port() -> int: """Return a port that is unused on the current host.""" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(("127.0.0.1", 0)) return cast(int, s.getsockname()[1]) class BaseTestServer(ABC): __test__ = False def __init__( self, *, scheme: Union[str, object] = sentinel, loop: Optional[asyncio.AbstractEventLoop] = None, host: str = "127.0.0.1", port: Optional[int] = None, skip_url_asserts: bool = False, socket_factory: Callable[ [str, int, socket.AddressFamily], socket.socket ] = get_port_socket, **kwargs: Any, ) -> None: self._loop = loop self.runner: Optional[BaseRunner] = None self._root: Optional[URL] = None self.host = host self.port = port self._closed = False self.scheme = scheme self.skip_url_asserts = skip_url_asserts self.socket_factory = socket_factory async def start_server( self, loop: Optional[asyncio.AbstractEventLoop] = None, **kwargs: Any ) -> None: if self.runner: return self._loop = loop self._ssl = kwargs.pop("ssl", None) self.runner = await self._make_runner(handler_cancellation=True, **kwargs) await self.runner.setup() if not self.port: self.port = 0 try: version = ipaddress.ip_address(self.host).version except ValueError: version = 4 family = socket.AF_INET6 if version == 6 else socket.AF_INET _sock = self.socket_factory(self.host, self.port, family) self.host, self.port = _sock.getsockname()[:2] site = SockSite(self.runner, sock=_sock, ssl_context=self._ssl) await site.start() server = site._server assert server is not None sockets = server.sockets # type: ignore[attr-defined] assert sockets is not None self.port = sockets[0].getsockname()[1] if self.scheme is sentinel: if self._ssl: scheme = "https" else: scheme = "http" self.scheme = scheme self._root = URL(f"{self.scheme}://{self.host}:{self.port}") @abstractmethod # pragma: no cover async def _make_runner(self, **kwargs: Any) -> BaseRunner: pass def make_url(self, path: StrOrURL) -> URL: assert self._root is not None url = URL(path) if not self.skip_url_asserts: assert not url.is_absolute() return self._root.join(url) else: return URL(str(self._root) + str(path)) @property def started(self) -> bool: return self.runner is not None @property def closed(self) -> bool: return self._closed @property def handler(self) -> Server: # for backward compatibility # web.Server instance runner = self.runner assert runner is not None assert runner.server is not None return runner.server async def close(self) -> None: """Close all fixtures created by the test client. After that point, the TestClient is no longer usable. This is an idempotent function: running close multiple times will not have any additional effects. close is also run when the object is garbage collected, and on exit when used as a context manager. """ if self.started and not self.closed: assert self.runner is not None await self.runner.cleanup() self._root = None self.port = None self._closed = True def __enter__(self) -> None: raise TypeError("Use async with instead") def __exit__( self, exc_type: Optional[Type[BaseException]], exc_value: Optional[BaseException], traceback: Optional[TracebackType], ) -> None: # __exit__ should exist in pair with __enter__ but never executed pass # pragma: no cover async def __aenter__(self) -> "BaseTestServer": await self.start_server(loop=self._loop) return self async def __aexit__( self, exc_type: Optional[Type[BaseException]], exc_value: Optional[BaseException], traceback: Optional[TracebackType], ) -> None: await self.close() class TestServer(BaseTestServer): def __init__( self, app: Application, *, scheme: Union[str, object] = sentinel, host: str = "127.0.0.1", port: Optional[int] = None, **kwargs: Any, ): self.app = app super().__init__(scheme=scheme, host=host, port=port, **kwargs) async def _make_runner(self, **kwargs: Any) -> BaseRunner: return AppRunner(self.app, **kwargs) class RawTestServer(BaseTestServer): def __init__( self, handler: _RequestHandler, *, scheme: Union[str, object] = sentinel, host: str = "127.0.0.1", port: Optional[int] = None, **kwargs: Any, ) -> None: self._handler = handler super().__init__(scheme=scheme, host=host, port=port, **kwargs) async def _make_runner(self, debug: bool = True, **kwargs: Any) -> ServerRunner: srv = Server(self._handler, loop=self._loop, debug=debug, **kwargs) return ServerRunner(srv, debug=debug, **kwargs) class TestClient: """ A test client implementation. To write functional tests for aiohttp based servers. """ __test__ = False def __init__( self, server: BaseTestServer, *, cookie_jar: Optional[AbstractCookieJar] = None, loop: Optional[asyncio.AbstractEventLoop] = None, **kwargs: Any, ) -> None: if not isinstance(server, BaseTestServer): raise TypeError( "server must be TestServer " "instance, found type: %r" % type(server) ) self._server = server self._loop = loop if cookie_jar is None: cookie_jar = aiohttp.CookieJar(unsafe=True, loop=loop) self._session = ClientSession(loop=loop, cookie_jar=cookie_jar, **kwargs) self._closed = False self._responses: List[ClientResponse] = [] self._websockets: List[ClientWebSocketResponse] = [] async def start_server(self) -> None: await self._server.start_server(loop=self._loop) @property def host(self) -> str: return self._server.host @property def port(self) -> Optional[int]: return self._server.port @property def server(self) -> BaseTestServer: return self._server @property def app(self) -> Optional[Application]: return cast(Optional[Application], getattr(self._server, "app", None)) @property def session(self) -> ClientSession: """An internal aiohttp.ClientSession. Unlike the methods on the TestClient, client session requests do not automatically include the host in the url queried, and will require an absolute path to the resource. """ return self._session def make_url(self, path: StrOrURL) -> URL: return self._server.make_url(path) async def _request( self, method: str, path: StrOrURL, **kwargs: Any ) -> ClientResponse: resp = await self._session.request(method, self.make_url(path), **kwargs) # save it to close later self._responses.append(resp) return resp def request( self, method: str, path: StrOrURL, **kwargs: Any ) -> _RequestContextManager: """Routes a request to tested http server. The interface is identical to aiohttp.ClientSession.request, except the loop kwarg is overridden by the instance used by the test server. """ return _RequestContextManager(self._request(method, path, **kwargs)) def get(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: """Perform an HTTP GET request.""" return _RequestContextManager(self._request(hdrs.METH_GET, path, **kwargs)) def post(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: """Perform an HTTP POST request.""" return _RequestContextManager(self._request(hdrs.METH_POST, path, **kwargs)) def options(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: """Perform an HTTP OPTIONS request.""" return _RequestContextManager(self._request(hdrs.METH_OPTIONS, path, **kwargs)) def head(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: """Perform an HTTP HEAD request.""" return _RequestContextManager(self._request(hdrs.METH_HEAD, path, **kwargs)) def put(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: """Perform an HTTP PUT request.""" return _RequestContextManager(self._request(hdrs.METH_PUT, path, **kwargs)) def patch(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: """Perform an HTTP PATCH request.""" return _RequestContextManager(self._request(hdrs.METH_PATCH, path, **kwargs)) def delete(self, path: StrOrURL, **kwargs: Any) -> _RequestContextManager: """Perform an HTTP PATCH request.""" return _RequestContextManager(self._request(hdrs.METH_DELETE, path, **kwargs)) def ws_connect(self, path: StrOrURL, **kwargs: Any) -> _WSRequestContextManager: """Initiate websocket connection. The api corresponds to aiohttp.ClientSession.ws_connect. """ return _WSRequestContextManager(self._ws_connect(path, **kwargs)) async def _ws_connect( self, path: StrOrURL, **kwargs: Any ) -> ClientWebSocketResponse: ws = await self._session.ws_connect(self.make_url(path), **kwargs) self._websockets.append(ws) return ws async def close(self) -> None: """Close all fixtures created by the test client. After that point, the TestClient is no longer usable. This is an idempotent function: running close multiple times will not have any additional effects. close is also run on exit when used as a(n) (asynchronous) context manager. """ if not self._closed: for resp in self._responses: resp.close() for ws in self._websockets: await ws.close() await self._session.close() await self._server.close() self._closed = True def __enter__(self) -> None: raise TypeError("Use async with instead") def __exit__( self, exc_type: Optional[Type[BaseException]], exc: Optional[BaseException], tb: Optional[TracebackType], ) -> None: # __exit__ should exist in pair with __enter__ but never executed pass # pragma: no cover async def __aenter__(self) -> "TestClient": await self.start_server() return self async def __aexit__( self, exc_type: Optional[Type[BaseException]], exc: Optional[BaseException], tb: Optional[TracebackType], ) -> None: await self.close() class AioHTTPTestCase(IsolatedAsyncioTestCase): """A base class to allow for unittest web applications using aiohttp. Provides the following: * self.client (aiohttp.test_utils.TestClient): an aiohttp test client. * self.loop (asyncio.BaseEventLoop): the event loop in which the application and server are running. * self.app (aiohttp.web.Application): the application returned by self.get_application() Note that the TestClient's methods are asynchronous: you have to execute function on the test client using asynchronous methods. """ async def get_application(self) -> Application: """Get application. This method should be overridden to return the aiohttp.web.Application object to test. """ return self.get_app() def get_app(self) -> Application: """Obsolete method used to constructing web application. Use .get_application() coroutine instead. """ raise RuntimeError("Did you forget to define get_application()?") async def asyncSetUp(self) -> None: self.loop = asyncio.get_running_loop() return await self.setUpAsync() async def setUpAsync(self) -> None: self.app = await self.get_application() self.server = await self.get_server(self.app) self.client = await self.get_client(self.server) await self.client.start_server() async def asyncTearDown(self) -> None: return await self.tearDownAsync() async def tearDownAsync(self) -> None: await self.client.close() async def get_server(self, app: Application) -> TestServer: """Return a TestServer instance.""" return TestServer(app, loop=self.loop) async def get_client(self, server: TestServer) -> TestClient: """Return a TestClient instance.""" return TestClient(server, loop=self.loop) def unittest_run_loop(func: Any, *args: Any, **kwargs: Any) -> Any: """ A decorator dedicated to use with asynchronous AioHTTPTestCase test methods. In 3.8+, this does nothing. """ warnings.warn( "Decorator `@unittest_run_loop` is no longer needed in aiohttp 3.8+", DeprecationWarning, stacklevel=2, ) return func _LOOP_FACTORY = Callable[[], asyncio.AbstractEventLoop] @contextlib.contextmanager def loop_context( loop_factory: _LOOP_FACTORY = asyncio.new_event_loop, fast: bool = False ) -> Iterator[asyncio.AbstractEventLoop]: """A contextmanager that creates an event_loop, for test purposes. Handles the creation and cleanup of a test loop. """ loop = setup_test_loop(loop_factory) yield loop teardown_test_loop(loop, fast=fast) def setup_test_loop( loop_factory: _LOOP_FACTORY = asyncio.new_event_loop, ) -> asyncio.AbstractEventLoop: """Create and return an asyncio.BaseEventLoop instance. The caller should also call teardown_test_loop, once they are done with the loop. """ loop = loop_factory() asyncio.set_event_loop(loop) return loop def teardown_test_loop(loop: asyncio.AbstractEventLoop, fast: bool = False) -> None: """Teardown and cleanup an event_loop created by setup_test_loop.""" closed = loop.is_closed() if not closed: loop.call_soon(loop.stop) loop.run_forever() loop.close() if not fast: gc.collect() asyncio.set_event_loop(None) def _create_app_mock() -> mock.MagicMock: def get_dict(app: Any, key: str) -> Any: return app.__app_dict[key] def set_dict(app: Any, key: str, value: Any) -> None: app.__app_dict[key] = value app = mock.MagicMock(spec=Application) app.__app_dict = {} app.__getitem__ = get_dict app.__setitem__ = set_dict app._debug = False app.on_response_prepare = Signal(app) app.on_response_prepare.freeze() return app def _create_transport(sslcontext: Optional[SSLContext] = None) -> mock.Mock: transport = mock.Mock() def get_extra_info(key: str) -> Optional[SSLContext]: if key == "sslcontext": return sslcontext else: return None transport.get_extra_info.side_effect = get_extra_info return transport def make_mocked_request( method: str, path: str, headers: Any = None, *, match_info: Any = sentinel, version: HttpVersion = HttpVersion(1, 1), closing: bool = False, app: Any = None, writer: Any = sentinel, protocol: Any = sentinel, transport: Any = sentinel, payload: Any = sentinel, sslcontext: Optional[SSLContext] = None, client_max_size: int = 1024**2, loop: Any = ..., ) -> Request: """Creates mocked web.Request testing purposes. Useful in unit tests, when spinning full web server is overkill or specific conditions and errors are hard to trigger. """ task = mock.Mock() if loop is ...: # no loop passed, try to get the current one if # its is running as we need a real loop to create # executor jobs to be able to do testing # with a real executor try: loop = asyncio.get_running_loop() except RuntimeError: loop = mock.Mock() loop.create_future.return_value = () if version < HttpVersion(1, 1): closing = True if headers: headers = CIMultiDictProxy(CIMultiDict(headers)) raw_hdrs = tuple( (k.encode("utf-8"), v.encode("utf-8")) for k, v in headers.items() ) else: headers = CIMultiDictProxy(CIMultiDict()) raw_hdrs = () chunked = "chunked" in headers.get(hdrs.TRANSFER_ENCODING, "").lower() message = RawRequestMessage( method, path, version, headers, raw_hdrs, closing, None, False, chunked, URL(path), ) if app is None: app = _create_app_mock() if transport is sentinel: transport = _create_transport(sslcontext) if protocol is sentinel: protocol = mock.Mock() protocol.transport = transport if writer is sentinel: writer = mock.Mock() writer.write_headers = make_mocked_coro(None) writer.write = make_mocked_coro(None) writer.write_eof = make_mocked_coro(None) writer.drain = make_mocked_coro(None) writer.transport = transport protocol.transport = transport protocol.writer = writer if payload is sentinel: payload = mock.Mock() req = Request( message, payload, protocol, writer, task, loop, client_max_size=client_max_size ) match_info = UrlMappingMatchInfo( {} if match_info is sentinel else match_info, mock.Mock() ) match_info.add_app(app) req._match_info = match_info return req def make_mocked_coro( return_value: Any = sentinel, raise_exception: Any = sentinel ) -> Any: """Creates a coroutine mock.""" async def mock_coro(*args: Any, **kwargs: Any) -> Any: if raise_exception is not sentinel: raise raise_exception if not inspect.isawaitable(return_value): return return_value await return_value return mock.Mock(wraps=mock_coro) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/tracing.py0000644000175100001770000003543414607525266016304 0ustar00runnerdockerfrom types import SimpleNamespace from typing import TYPE_CHECKING, Awaitable, Optional, Protocol, Type, TypeVar import attr from aiosignal import Signal from multidict import CIMultiDict from yarl import URL from .client_reqrep import ClientResponse if TYPE_CHECKING: from .client import ClientSession _ParamT_contra = TypeVar("_ParamT_contra", contravariant=True) class _SignalCallback(Protocol[_ParamT_contra]): def __call__( self, __client_session: ClientSession, __trace_config_ctx: SimpleNamespace, __params: _ParamT_contra, ) -> Awaitable[None]: ... __all__ = ( "TraceConfig", "TraceRequestStartParams", "TraceRequestEndParams", "TraceRequestExceptionParams", "TraceConnectionQueuedStartParams", "TraceConnectionQueuedEndParams", "TraceConnectionCreateStartParams", "TraceConnectionCreateEndParams", "TraceConnectionReuseconnParams", "TraceDnsResolveHostStartParams", "TraceDnsResolveHostEndParams", "TraceDnsCacheHitParams", "TraceDnsCacheMissParams", "TraceRequestRedirectParams", "TraceRequestChunkSentParams", "TraceResponseChunkReceivedParams", "TraceRequestHeadersSentParams", ) class TraceConfig: """First-class used to trace requests launched via ClientSession objects.""" def __init__( self, trace_config_ctx_factory: Type[SimpleNamespace] = SimpleNamespace ) -> None: self._on_request_start: Signal[ _SignalCallback[TraceRequestStartParams] ] = Signal(self) self._on_request_chunk_sent: Signal[ _SignalCallback[TraceRequestChunkSentParams] ] = Signal(self) self._on_response_chunk_received: Signal[ _SignalCallback[TraceResponseChunkReceivedParams] ] = Signal(self) self._on_request_end: Signal[_SignalCallback[TraceRequestEndParams]] = Signal( self ) self._on_request_exception: Signal[ _SignalCallback[TraceRequestExceptionParams] ] = Signal(self) self._on_request_redirect: Signal[ _SignalCallback[TraceRequestRedirectParams] ] = Signal(self) self._on_connection_queued_start: Signal[ _SignalCallback[TraceConnectionQueuedStartParams] ] = Signal(self) self._on_connection_queued_end: Signal[ _SignalCallback[TraceConnectionQueuedEndParams] ] = Signal(self) self._on_connection_create_start: Signal[ _SignalCallback[TraceConnectionCreateStartParams] ] = Signal(self) self._on_connection_create_end: Signal[ _SignalCallback[TraceConnectionCreateEndParams] ] = Signal(self) self._on_connection_reuseconn: Signal[ _SignalCallback[TraceConnectionReuseconnParams] ] = Signal(self) self._on_dns_resolvehost_start: Signal[ _SignalCallback[TraceDnsResolveHostStartParams] ] = Signal(self) self._on_dns_resolvehost_end: Signal[ _SignalCallback[TraceDnsResolveHostEndParams] ] = Signal(self) self._on_dns_cache_hit: Signal[ _SignalCallback[TraceDnsCacheHitParams] ] = Signal(self) self._on_dns_cache_miss: Signal[ _SignalCallback[TraceDnsCacheMissParams] ] = Signal(self) self._on_request_headers_sent: Signal[ _SignalCallback[TraceRequestHeadersSentParams] ] = Signal(self) self._trace_config_ctx_factory = trace_config_ctx_factory def trace_config_ctx( self, trace_request_ctx: Optional[SimpleNamespace] = None ) -> SimpleNamespace: """Return a new trace_config_ctx instance""" return self._trace_config_ctx_factory(trace_request_ctx=trace_request_ctx) def freeze(self) -> None: self._on_request_start.freeze() self._on_request_chunk_sent.freeze() self._on_response_chunk_received.freeze() self._on_request_end.freeze() self._on_request_exception.freeze() self._on_request_redirect.freeze() self._on_connection_queued_start.freeze() self._on_connection_queued_end.freeze() self._on_connection_create_start.freeze() self._on_connection_create_end.freeze() self._on_connection_reuseconn.freeze() self._on_dns_resolvehost_start.freeze() self._on_dns_resolvehost_end.freeze() self._on_dns_cache_hit.freeze() self._on_dns_cache_miss.freeze() self._on_request_headers_sent.freeze() @property def on_request_start(self) -> "Signal[_SignalCallback[TraceRequestStartParams]]": return self._on_request_start @property def on_request_chunk_sent( self, ) -> "Signal[_SignalCallback[TraceRequestChunkSentParams]]": return self._on_request_chunk_sent @property def on_response_chunk_received( self, ) -> "Signal[_SignalCallback[TraceResponseChunkReceivedParams]]": return self._on_response_chunk_received @property def on_request_end(self) -> "Signal[_SignalCallback[TraceRequestEndParams]]": return self._on_request_end @property def on_request_exception( self, ) -> "Signal[_SignalCallback[TraceRequestExceptionParams]]": return self._on_request_exception @property def on_request_redirect( self, ) -> "Signal[_SignalCallback[TraceRequestRedirectParams]]": return self._on_request_redirect @property def on_connection_queued_start( self, ) -> "Signal[_SignalCallback[TraceConnectionQueuedStartParams]]": return self._on_connection_queued_start @property def on_connection_queued_end( self, ) -> "Signal[_SignalCallback[TraceConnectionQueuedEndParams]]": return self._on_connection_queued_end @property def on_connection_create_start( self, ) -> "Signal[_SignalCallback[TraceConnectionCreateStartParams]]": return self._on_connection_create_start @property def on_connection_create_end( self, ) -> "Signal[_SignalCallback[TraceConnectionCreateEndParams]]": return self._on_connection_create_end @property def on_connection_reuseconn( self, ) -> "Signal[_SignalCallback[TraceConnectionReuseconnParams]]": return self._on_connection_reuseconn @property def on_dns_resolvehost_start( self, ) -> "Signal[_SignalCallback[TraceDnsResolveHostStartParams]]": return self._on_dns_resolvehost_start @property def on_dns_resolvehost_end( self, ) -> "Signal[_SignalCallback[TraceDnsResolveHostEndParams]]": return self._on_dns_resolvehost_end @property def on_dns_cache_hit(self) -> "Signal[_SignalCallback[TraceDnsCacheHitParams]]": return self._on_dns_cache_hit @property def on_dns_cache_miss(self) -> "Signal[_SignalCallback[TraceDnsCacheMissParams]]": return self._on_dns_cache_miss @property def on_request_headers_sent( self, ) -> "Signal[_SignalCallback[TraceRequestHeadersSentParams]]": return self._on_request_headers_sent @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceRequestStartParams: """Parameters sent by the `on_request_start` signal""" method: str url: URL headers: "CIMultiDict[str]" @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceRequestChunkSentParams: """Parameters sent by the `on_request_chunk_sent` signal""" method: str url: URL chunk: bytes @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceResponseChunkReceivedParams: """Parameters sent by the `on_response_chunk_received` signal""" method: str url: URL chunk: bytes @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceRequestEndParams: """Parameters sent by the `on_request_end` signal""" method: str url: URL headers: "CIMultiDict[str]" response: ClientResponse @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceRequestExceptionParams: """Parameters sent by the `on_request_exception` signal""" method: str url: URL headers: "CIMultiDict[str]" exception: BaseException @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceRequestRedirectParams: """Parameters sent by the `on_request_redirect` signal""" method: str url: URL headers: "CIMultiDict[str]" response: ClientResponse @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceConnectionQueuedStartParams: """Parameters sent by the `on_connection_queued_start` signal""" @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceConnectionQueuedEndParams: """Parameters sent by the `on_connection_queued_end` signal""" @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceConnectionCreateStartParams: """Parameters sent by the `on_connection_create_start` signal""" @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceConnectionCreateEndParams: """Parameters sent by the `on_connection_create_end` signal""" @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceConnectionReuseconnParams: """Parameters sent by the `on_connection_reuseconn` signal""" @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceDnsResolveHostStartParams: """Parameters sent by the `on_dns_resolvehost_start` signal""" host: str @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceDnsResolveHostEndParams: """Parameters sent by the `on_dns_resolvehost_end` signal""" host: str @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceDnsCacheHitParams: """Parameters sent by the `on_dns_cache_hit` signal""" host: str @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceDnsCacheMissParams: """Parameters sent by the `on_dns_cache_miss` signal""" host: str @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceRequestHeadersSentParams: """Parameters sent by the `on_request_headers_sent` signal""" method: str url: URL headers: "CIMultiDict[str]" class Trace: """Internal dependency holder class. Used to keep together the main dependencies used at the moment of send a signal. """ def __init__( self, session: "ClientSession", trace_config: TraceConfig, trace_config_ctx: SimpleNamespace, ) -> None: self._trace_config = trace_config self._trace_config_ctx = trace_config_ctx self._session = session async def send_request_start( self, method: str, url: URL, headers: "CIMultiDict[str]" ) -> None: return await self._trace_config.on_request_start.send( self._session, self._trace_config_ctx, TraceRequestStartParams(method, url, headers), ) async def send_request_chunk_sent( self, method: str, url: URL, chunk: bytes ) -> None: return await self._trace_config.on_request_chunk_sent.send( self._session, self._trace_config_ctx, TraceRequestChunkSentParams(method, url, chunk), ) async def send_response_chunk_received( self, method: str, url: URL, chunk: bytes ) -> None: return await self._trace_config.on_response_chunk_received.send( self._session, self._trace_config_ctx, TraceResponseChunkReceivedParams(method, url, chunk), ) async def send_request_end( self, method: str, url: URL, headers: "CIMultiDict[str]", response: ClientResponse, ) -> None: return await self._trace_config.on_request_end.send( self._session, self._trace_config_ctx, TraceRequestEndParams(method, url, headers, response), ) async def send_request_exception( self, method: str, url: URL, headers: "CIMultiDict[str]", exception: BaseException, ) -> None: return await self._trace_config.on_request_exception.send( self._session, self._trace_config_ctx, TraceRequestExceptionParams(method, url, headers, exception), ) async def send_request_redirect( self, method: str, url: URL, headers: "CIMultiDict[str]", response: ClientResponse, ) -> None: return await self._trace_config._on_request_redirect.send( self._session, self._trace_config_ctx, TraceRequestRedirectParams(method, url, headers, response), ) async def send_connection_queued_start(self) -> None: return await self._trace_config.on_connection_queued_start.send( self._session, self._trace_config_ctx, TraceConnectionQueuedStartParams() ) async def send_connection_queued_end(self) -> None: return await self._trace_config.on_connection_queued_end.send( self._session, self._trace_config_ctx, TraceConnectionQueuedEndParams() ) async def send_connection_create_start(self) -> None: return await self._trace_config.on_connection_create_start.send( self._session, self._trace_config_ctx, TraceConnectionCreateStartParams() ) async def send_connection_create_end(self) -> None: return await self._trace_config.on_connection_create_end.send( self._session, self._trace_config_ctx, TraceConnectionCreateEndParams() ) async def send_connection_reuseconn(self) -> None: return await self._trace_config.on_connection_reuseconn.send( self._session, self._trace_config_ctx, TraceConnectionReuseconnParams() ) async def send_dns_resolvehost_start(self, host: str) -> None: return await self._trace_config.on_dns_resolvehost_start.send( self._session, self._trace_config_ctx, TraceDnsResolveHostStartParams(host) ) async def send_dns_resolvehost_end(self, host: str) -> None: return await self._trace_config.on_dns_resolvehost_end.send( self._session, self._trace_config_ctx, TraceDnsResolveHostEndParams(host) ) async def send_dns_cache_hit(self, host: str) -> None: return await self._trace_config.on_dns_cache_hit.send( self._session, self._trace_config_ctx, TraceDnsCacheHitParams(host) ) async def send_dns_cache_miss(self, host: str) -> None: return await self._trace_config.on_dns_cache_miss.send( self._session, self._trace_config_ctx, TraceDnsCacheMissParams(host) ) async def send_request_headers( self, method: str, url: URL, headers: "CIMultiDict[str]" ) -> None: return await self._trace_config._on_request_headers_sent.send( self._session, self._trace_config_ctx, TraceRequestHeadersSentParams(method, url, headers), ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/typedefs.py0000644000175100001770000000267714607525266016503 0ustar00runnerdockerimport json import os from typing import ( TYPE_CHECKING, Any, Awaitable, Callable, Iterable, Mapping, Tuple, Union, ) from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy, istr from yarl import URL DEFAULT_JSON_ENCODER = json.dumps DEFAULT_JSON_DECODER = json.loads if TYPE_CHECKING: _CIMultiDict = CIMultiDict[str] _CIMultiDictProxy = CIMultiDictProxy[str] _MultiDict = MultiDict[str] _MultiDictProxy = MultiDictProxy[str] from http.cookies import BaseCookie, Morsel from .web import Request, StreamResponse else: _CIMultiDict = CIMultiDict _CIMultiDictProxy = CIMultiDictProxy _MultiDict = MultiDict _MultiDictProxy = MultiDictProxy Byteish = Union[bytes, bytearray, memoryview] JSONEncoder = Callable[[Any], str] JSONDecoder = Callable[[str], Any] LooseHeaders = Union[Mapping[Union[str, istr], str], _CIMultiDict, _CIMultiDictProxy] RawHeaders = Tuple[Tuple[bytes, bytes], ...] StrOrURL = Union[str, URL] LooseCookiesMappings = Mapping[str, Union[str, "BaseCookie[str]", "Morsel[Any]"]] LooseCookiesIterables = Iterable[ Tuple[str, Union[str, "BaseCookie[str]", "Morsel[Any]"]] ] LooseCookies = Union[ LooseCookiesMappings, LooseCookiesIterables, "BaseCookie[str]", ] Handler = Callable[["Request"], Awaitable["StreamResponse"]] Middleware = Callable[["Request", Handler], Awaitable["StreamResponse"]] PathLike = Union[str, "os.PathLike[str]"] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/web.py0000644000175100001770000004547714607525266015442 0ustar00runnerdockerimport asyncio import logging import os import socket import sys import warnings from argparse import ArgumentParser from collections.abc import Iterable from contextlib import suppress from functools import partial from importlib import import_module from typing import ( Any, Awaitable, Callable, Iterable as TypingIterable, List, Optional, Set, Type, Union, cast, ) from weakref import WeakSet from .abc import AbstractAccessLogger from .helpers import AppKey as AppKey from .log import access_logger from .typedefs import PathLike from .web_app import Application as Application, CleanupError as CleanupError from .web_exceptions import ( HTTPAccepted as HTTPAccepted, HTTPBadGateway as HTTPBadGateway, HTTPBadRequest as HTTPBadRequest, HTTPClientError as HTTPClientError, HTTPConflict as HTTPConflict, HTTPCreated as HTTPCreated, HTTPError as HTTPError, HTTPException as HTTPException, HTTPExpectationFailed as HTTPExpectationFailed, HTTPFailedDependency as HTTPFailedDependency, HTTPForbidden as HTTPForbidden, HTTPFound as HTTPFound, HTTPGatewayTimeout as HTTPGatewayTimeout, HTTPGone as HTTPGone, HTTPInsufficientStorage as HTTPInsufficientStorage, HTTPInternalServerError as HTTPInternalServerError, HTTPLengthRequired as HTTPLengthRequired, HTTPMethodNotAllowed as HTTPMethodNotAllowed, HTTPMisdirectedRequest as HTTPMisdirectedRequest, HTTPMove as HTTPMove, HTTPMovedPermanently as HTTPMovedPermanently, HTTPMultipleChoices as HTTPMultipleChoices, HTTPNetworkAuthenticationRequired as HTTPNetworkAuthenticationRequired, HTTPNoContent as HTTPNoContent, HTTPNonAuthoritativeInformation as HTTPNonAuthoritativeInformation, HTTPNotAcceptable as HTTPNotAcceptable, HTTPNotExtended as HTTPNotExtended, HTTPNotFound as HTTPNotFound, HTTPNotImplemented as HTTPNotImplemented, HTTPNotModified as HTTPNotModified, HTTPOk as HTTPOk, HTTPPartialContent as HTTPPartialContent, HTTPPaymentRequired as HTTPPaymentRequired, HTTPPermanentRedirect as HTTPPermanentRedirect, HTTPPreconditionFailed as HTTPPreconditionFailed, HTTPPreconditionRequired as HTTPPreconditionRequired, HTTPProxyAuthenticationRequired as HTTPProxyAuthenticationRequired, HTTPRedirection as HTTPRedirection, HTTPRequestEntityTooLarge as HTTPRequestEntityTooLarge, HTTPRequestHeaderFieldsTooLarge as HTTPRequestHeaderFieldsTooLarge, HTTPRequestRangeNotSatisfiable as HTTPRequestRangeNotSatisfiable, HTTPRequestTimeout as HTTPRequestTimeout, HTTPRequestURITooLong as HTTPRequestURITooLong, HTTPResetContent as HTTPResetContent, HTTPSeeOther as HTTPSeeOther, HTTPServerError as HTTPServerError, HTTPServiceUnavailable as HTTPServiceUnavailable, HTTPSuccessful as HTTPSuccessful, HTTPTemporaryRedirect as HTTPTemporaryRedirect, HTTPTooManyRequests as HTTPTooManyRequests, HTTPUnauthorized as HTTPUnauthorized, HTTPUnavailableForLegalReasons as HTTPUnavailableForLegalReasons, HTTPUnprocessableEntity as HTTPUnprocessableEntity, HTTPUnsupportedMediaType as HTTPUnsupportedMediaType, HTTPUpgradeRequired as HTTPUpgradeRequired, HTTPUseProxy as HTTPUseProxy, HTTPVariantAlsoNegotiates as HTTPVariantAlsoNegotiates, HTTPVersionNotSupported as HTTPVersionNotSupported, NotAppKeyWarning as NotAppKeyWarning, ) from .web_fileresponse import FileResponse as FileResponse from .web_log import AccessLogger from .web_middlewares import ( middleware as middleware, normalize_path_middleware as normalize_path_middleware, ) from .web_protocol import ( PayloadAccessError as PayloadAccessError, RequestHandler as RequestHandler, RequestPayloadError as RequestPayloadError, ) from .web_request import ( BaseRequest as BaseRequest, FileField as FileField, Request as Request, ) from .web_response import ( ContentCoding as ContentCoding, Response as Response, StreamResponse as StreamResponse, json_response as json_response, ) from .web_routedef import ( AbstractRouteDef as AbstractRouteDef, RouteDef as RouteDef, RouteTableDef as RouteTableDef, StaticDef as StaticDef, delete as delete, get as get, head as head, options as options, patch as patch, post as post, put as put, route as route, static as static, view as view, ) from .web_runner import ( AppRunner as AppRunner, BaseRunner as BaseRunner, BaseSite as BaseSite, GracefulExit as GracefulExit, NamedPipeSite as NamedPipeSite, ServerRunner as ServerRunner, SockSite as SockSite, TCPSite as TCPSite, UnixSite as UnixSite, ) from .web_server import Server as Server from .web_urldispatcher import ( AbstractResource as AbstractResource, AbstractRoute as AbstractRoute, DynamicResource as DynamicResource, PlainResource as PlainResource, PrefixedSubAppResource as PrefixedSubAppResource, Resource as Resource, ResourceRoute as ResourceRoute, StaticResource as StaticResource, UrlDispatcher as UrlDispatcher, UrlMappingMatchInfo as UrlMappingMatchInfo, View as View, ) from .web_ws import ( WebSocketReady as WebSocketReady, WebSocketResponse as WebSocketResponse, WSMsgType as WSMsgType, ) __all__ = ( # web_app "AppKey", "Application", "CleanupError", # web_exceptions "NotAppKeyWarning", "HTTPAccepted", "HTTPBadGateway", "HTTPBadRequest", "HTTPClientError", "HTTPConflict", "HTTPCreated", "HTTPError", "HTTPException", "HTTPExpectationFailed", "HTTPFailedDependency", "HTTPForbidden", "HTTPFound", "HTTPGatewayTimeout", "HTTPGone", "HTTPInsufficientStorage", "HTTPInternalServerError", "HTTPLengthRequired", "HTTPMethodNotAllowed", "HTTPMisdirectedRequest", "HTTPMove", "HTTPMovedPermanently", "HTTPMultipleChoices", "HTTPNetworkAuthenticationRequired", "HTTPNoContent", "HTTPNonAuthoritativeInformation", "HTTPNotAcceptable", "HTTPNotExtended", "HTTPNotFound", "HTTPNotImplemented", "HTTPNotModified", "HTTPOk", "HTTPPartialContent", "HTTPPaymentRequired", "HTTPPermanentRedirect", "HTTPPreconditionFailed", "HTTPPreconditionRequired", "HTTPProxyAuthenticationRequired", "HTTPRedirection", "HTTPRequestEntityTooLarge", "HTTPRequestHeaderFieldsTooLarge", "HTTPRequestRangeNotSatisfiable", "HTTPRequestTimeout", "HTTPRequestURITooLong", "HTTPResetContent", "HTTPSeeOther", "HTTPServerError", "HTTPServiceUnavailable", "HTTPSuccessful", "HTTPTemporaryRedirect", "HTTPTooManyRequests", "HTTPUnauthorized", "HTTPUnavailableForLegalReasons", "HTTPUnprocessableEntity", "HTTPUnsupportedMediaType", "HTTPUpgradeRequired", "HTTPUseProxy", "HTTPVariantAlsoNegotiates", "HTTPVersionNotSupported", # web_fileresponse "FileResponse", # web_middlewares "middleware", "normalize_path_middleware", # web_protocol "PayloadAccessError", "RequestHandler", "RequestPayloadError", # web_request "BaseRequest", "FileField", "Request", # web_response "ContentCoding", "Response", "StreamResponse", "json_response", # web_routedef "AbstractRouteDef", "RouteDef", "RouteTableDef", "StaticDef", "delete", "get", "head", "options", "patch", "post", "put", "route", "static", "view", # web_runner "AppRunner", "BaseRunner", "BaseSite", "GracefulExit", "ServerRunner", "SockSite", "TCPSite", "UnixSite", "NamedPipeSite", # web_server "Server", # web_urldispatcher "AbstractResource", "AbstractRoute", "DynamicResource", "PlainResource", "PrefixedSubAppResource", "Resource", "ResourceRoute", "StaticResource", "UrlDispatcher", "UrlMappingMatchInfo", "View", # web_ws "WebSocketReady", "WebSocketResponse", "WSMsgType", # web "run_app", ) try: from ssl import SSLContext except ImportError: # pragma: no cover SSLContext = Any # type: ignore[misc,assignment] # Only display warning when using -Wdefault, -We, -X dev or similar. warnings.filterwarnings("ignore", category=NotAppKeyWarning, append=True) HostSequence = TypingIterable[str] async def _run_app( app: Union[Application, Awaitable[Application]], *, host: Optional[Union[str, HostSequence]] = None, port: Optional[int] = None, path: Union[PathLike, TypingIterable[PathLike], None] = None, sock: Optional[Union[socket.socket, TypingIterable[socket.socket]]] = None, shutdown_timeout: float = 60.0, keepalive_timeout: float = 75.0, ssl_context: Optional[SSLContext] = None, print: Optional[Callable[..., None]] = print, backlog: int = 128, access_log_class: Type[AbstractAccessLogger] = AccessLogger, access_log_format: str = AccessLogger.LOG_FORMAT, access_log: Optional[logging.Logger] = access_logger, handle_signals: bool = True, reuse_address: Optional[bool] = None, reuse_port: Optional[bool] = None, handler_cancellation: bool = False, ) -> None: async def wait( starting_tasks: "WeakSet[asyncio.Task[object]]", shutdown_timeout: float ) -> None: # Wait for pending tasks for a given time limit. t = asyncio.current_task() assert t is not None starting_tasks.add(t) with suppress(asyncio.TimeoutError): await asyncio.wait_for(_wait(starting_tasks), timeout=shutdown_timeout) async def _wait(exclude: "WeakSet[asyncio.Task[object]]") -> None: t = asyncio.current_task() assert t is not None exclude.add(t) while tasks := asyncio.all_tasks().difference(exclude): await asyncio.wait(tasks) # An internal function to actually do all dirty job for application running if asyncio.iscoroutine(app): app = await app app = cast(Application, app) runner = AppRunner( app, handle_signals=handle_signals, access_log_class=access_log_class, access_log_format=access_log_format, access_log=access_log, keepalive_timeout=keepalive_timeout, shutdown_timeout=shutdown_timeout, handler_cancellation=handler_cancellation, ) await runner.setup() # On shutdown we want to avoid waiting on tasks which run forever. # It's very likely that all tasks which run forever will have been created by # the time we have completed the application startup (in runner.setup()), # so we just record all running tasks here and exclude them later. starting_tasks: "WeakSet[asyncio.Task[object]]" = WeakSet(asyncio.all_tasks()) runner.shutdown_callback = partial(wait, starting_tasks, shutdown_timeout) sites: List[BaseSite] = [] try: if host is not None: if isinstance(host, (str, bytes, bytearray, memoryview)): sites.append( TCPSite( runner, host, port, ssl_context=ssl_context, backlog=backlog, reuse_address=reuse_address, reuse_port=reuse_port, ) ) else: for h in host: sites.append( TCPSite( runner, h, port, ssl_context=ssl_context, backlog=backlog, reuse_address=reuse_address, reuse_port=reuse_port, ) ) elif path is None and sock is None or port is not None: sites.append( TCPSite( runner, port=port, ssl_context=ssl_context, backlog=backlog, reuse_address=reuse_address, reuse_port=reuse_port, ) ) if path is not None: if isinstance(path, (str, os.PathLike)): sites.append( UnixSite( runner, path, ssl_context=ssl_context, backlog=backlog, ) ) else: for p in path: sites.append( UnixSite( runner, p, ssl_context=ssl_context, backlog=backlog, ) ) if sock is not None: if not isinstance(sock, Iterable): sites.append( SockSite( runner, sock, ssl_context=ssl_context, backlog=backlog, ) ) else: for s in sock: sites.append( SockSite( runner, s, ssl_context=ssl_context, backlog=backlog, ) ) for site in sites: await site.start() if print: # pragma: no branch names = sorted(str(s.name) for s in runner.sites) print( "======== Running on {} ========\n" "(Press CTRL+C to quit)".format(", ".join(names)) ) # sleep forever by 1 hour intervals, while True: await asyncio.sleep(3600) finally: await runner.cleanup() def _cancel_tasks( to_cancel: Set["asyncio.Task[Any]"], loop: asyncio.AbstractEventLoop ) -> None: if not to_cancel: return for task in to_cancel: task.cancel() loop.run_until_complete(asyncio.gather(*to_cancel, return_exceptions=True)) for task in to_cancel: if task.cancelled(): continue if task.exception() is not None: loop.call_exception_handler( { "message": "unhandled exception during asyncio.run() shutdown", "exception": task.exception(), "task": task, } ) def run_app( app: Union[Application, Awaitable[Application]], *, host: Optional[Union[str, HostSequence]] = None, port: Optional[int] = None, path: Union[PathLike, TypingIterable[PathLike], None] = None, sock: Optional[Union[socket.socket, TypingIterable[socket.socket]]] = None, shutdown_timeout: float = 60.0, keepalive_timeout: float = 75.0, ssl_context: Optional[SSLContext] = None, print: Optional[Callable[..., None]] = print, backlog: int = 128, access_log_class: Type[AbstractAccessLogger] = AccessLogger, access_log_format: str = AccessLogger.LOG_FORMAT, access_log: Optional[logging.Logger] = access_logger, handle_signals: bool = True, reuse_address: Optional[bool] = None, reuse_port: Optional[bool] = None, handler_cancellation: bool = False, loop: Optional[asyncio.AbstractEventLoop] = None, ) -> None: """Run an app locally""" if loop is None: loop = asyncio.new_event_loop() # Configure if and only if in debugging mode and using the default logger if loop.get_debug() and access_log and access_log.name == "aiohttp.access": if access_log.level == logging.NOTSET: access_log.setLevel(logging.DEBUG) if not access_log.hasHandlers(): access_log.addHandler(logging.StreamHandler()) main_task = loop.create_task( _run_app( app, host=host, port=port, path=path, sock=sock, shutdown_timeout=shutdown_timeout, keepalive_timeout=keepalive_timeout, ssl_context=ssl_context, print=print, backlog=backlog, access_log_class=access_log_class, access_log_format=access_log_format, access_log=access_log, handle_signals=handle_signals, reuse_address=reuse_address, reuse_port=reuse_port, handler_cancellation=handler_cancellation, ) ) try: asyncio.set_event_loop(loop) loop.run_until_complete(main_task) except (GracefulExit, KeyboardInterrupt): # pragma: no cover pass finally: _cancel_tasks({main_task}, loop) _cancel_tasks(asyncio.all_tasks(loop), loop) loop.run_until_complete(loop.shutdown_asyncgens()) loop.close() def main(argv: List[str]) -> None: arg_parser = ArgumentParser( description="aiohttp.web Application server", prog="aiohttp.web" ) arg_parser.add_argument( "entry_func", help=( "Callable returning the `aiohttp.web.Application` instance to " "run. Should be specified in the 'module:function' syntax." ), metavar="entry-func", ) arg_parser.add_argument( "-H", "--hostname", help="TCP/IP hostname to serve on (default: %(default)r)", default="localhost", ) arg_parser.add_argument( "-P", "--port", help="TCP/IP port to serve on (default: %(default)r)", type=int, default="8080", ) arg_parser.add_argument( "-U", "--path", help="Unix file system path to serve on. Specifying a path will cause " "hostname and port arguments to be ignored.", ) args, extra_argv = arg_parser.parse_known_args(argv) # Import logic mod_str, _, func_str = args.entry_func.partition(":") if not func_str or not mod_str: arg_parser.error("'entry-func' not in 'module:function' syntax") if mod_str.startswith("."): arg_parser.error("relative module names not supported") try: module = import_module(mod_str) except ImportError as ex: arg_parser.error(f"unable to import {mod_str}: {ex}") try: func = getattr(module, func_str) except AttributeError: arg_parser.error(f"module {mod_str!r} has no attribute {func_str!r}") # Compatibility logic if args.path is not None and not hasattr(socket, "AF_UNIX"): arg_parser.error( "file system paths not supported by your operating" " environment" ) logging.basicConfig(level=logging.DEBUG) app = func(extra_argv) run_app(app, host=args.hostname, port=args.port, path=args.path) arg_parser.exit(message="Stopped\n") if __name__ == "__main__": # pragma: no branch main(sys.argv[1:]) # pragma: no cover ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/web_app.py0000644000175100001770000004360714607525266016273 0ustar00runnerdockerimport asyncio import logging import warnings from functools import partial, update_wrapper from typing import ( TYPE_CHECKING, Any, AsyncIterator, Awaitable, Callable, Dict, Iterable, Iterator, List, Mapping, MutableMapping, Optional, Sequence, Tuple, Type, TypeVar, Union, cast, overload, ) from aiosignal import Signal from frozenlist import FrozenList from . import hdrs from .abc import ( AbstractAccessLogger, AbstractMatchInfo, AbstractRouter, AbstractStreamWriter, ) from .helpers import DEBUG, AppKey from .http_parser import RawRequestMessage from .log import web_logger from .streams import StreamReader from .typedefs import Middleware from .web_exceptions import NotAppKeyWarning from .web_log import AccessLogger from .web_middlewares import _fix_request_current_app from .web_protocol import RequestHandler from .web_request import Request from .web_response import StreamResponse from .web_routedef import AbstractRouteDef from .web_server import Server from .web_urldispatcher import ( AbstractResource, AbstractRoute, Domain, MaskDomain, MatchedSubAppResource, PrefixedSubAppResource, UrlDispatcher, ) __all__ = ("Application", "CleanupError") if TYPE_CHECKING: _AppSignal = Signal[Callable[["Application"], Awaitable[None]]] _RespPrepareSignal = Signal[Callable[[Request, StreamResponse], Awaitable[None]]] _Middlewares = FrozenList[Middleware] _MiddlewaresHandlers = Optional[Sequence[Tuple[Middleware, bool]]] _Subapps = List["Application"] else: # No type checker mode, skip types _AppSignal = Signal _RespPrepareSignal = Signal _Middlewares = FrozenList _MiddlewaresHandlers = Optional[Sequence] _Subapps = List _T = TypeVar("_T") _U = TypeVar("_U") class Application(MutableMapping[Union[str, AppKey[Any]], Any]): ATTRS = frozenset( [ "logger", "_debug", "_router", "_loop", "_handler_args", "_middlewares", "_middlewares_handlers", "_run_middlewares", "_state", "_frozen", "_pre_frozen", "_subapps", "_on_response_prepare", "_on_startup", "_on_shutdown", "_on_cleanup", "_client_max_size", "_cleanup_ctx", ] ) def __init__( self, *, logger: logging.Logger = web_logger, router: Optional[UrlDispatcher] = None, middlewares: Iterable[Middleware] = (), handler_args: Optional[Mapping[str, Any]] = None, client_max_size: int = 1024**2, loop: Optional[asyncio.AbstractEventLoop] = None, debug: Any = ..., # mypy doesn't support ellipsis ) -> None: if router is None: router = UrlDispatcher() else: warnings.warn( "router argument is deprecated", DeprecationWarning, stacklevel=2 ) assert isinstance(router, AbstractRouter), router if loop is not None: warnings.warn( "loop argument is deprecated", DeprecationWarning, stacklevel=2 ) if debug is not ...: warnings.warn( "debug argument is deprecated", DeprecationWarning, stacklevel=2 ) self._debug = debug self._router: UrlDispatcher = router self._loop = loop self._handler_args = handler_args self.logger = logger self._middlewares: _Middlewares = FrozenList(middlewares) # initialized on freezing self._middlewares_handlers: _MiddlewaresHandlers = None # initialized on freezing self._run_middlewares: Optional[bool] = None self._state: Dict[Union[AppKey[Any], str], object] = {} self._frozen = False self._pre_frozen = False self._subapps: _Subapps = [] self._on_response_prepare: _RespPrepareSignal = Signal(self) self._on_startup: _AppSignal = Signal(self) self._on_shutdown: _AppSignal = Signal(self) self._on_cleanup: _AppSignal = Signal(self) self._cleanup_ctx = CleanupContext() self._on_startup.append(self._cleanup_ctx._on_startup) self._on_cleanup.append(self._cleanup_ctx._on_cleanup) self._client_max_size = client_max_size def __init_subclass__(cls: Type["Application"]) -> None: warnings.warn( "Inheritance class {} from web.Application " "is discouraged".format(cls.__name__), DeprecationWarning, stacklevel=3, ) if DEBUG: # pragma: no cover def __setattr__(self, name: str, val: Any) -> None: if name not in self.ATTRS: warnings.warn( "Setting custom web.Application.{} attribute " "is discouraged".format(name), DeprecationWarning, stacklevel=2, ) super().__setattr__(name, val) # MutableMapping API def __eq__(self, other: object) -> bool: return self is other @overload # type: ignore[override] def __getitem__(self, key: AppKey[_T]) -> _T: ... @overload def __getitem__(self, key: str) -> Any: ... def __getitem__(self, key: Union[str, AppKey[_T]]) -> Any: return self._state[key] def _check_frozen(self) -> None: if self._frozen: warnings.warn( "Changing state of started or joined " "application is deprecated", DeprecationWarning, stacklevel=3, ) @overload # type: ignore[override] def __setitem__(self, key: AppKey[_T], value: _T) -> None: ... @overload def __setitem__(self, key: str, value: Any) -> None: ... def __setitem__(self, key: Union[str, AppKey[_T]], value: Any) -> None: self._check_frozen() if not isinstance(key, AppKey): warnings.warn( "It is recommended to use web.AppKey instances for keys.\n" + "https://docs.aiohttp.org/en/stable/web_advanced.html" + "#application-s-config", category=NotAppKeyWarning, stacklevel=2, ) self._state[key] = value def __delitem__(self, key: Union[str, AppKey[_T]]) -> None: self._check_frozen() del self._state[key] def __len__(self) -> int: return len(self._state) def __iter__(self) -> Iterator[Union[str, AppKey[Any]]]: return iter(self._state) @overload # type: ignore[override] def get(self, key: AppKey[_T], default: None = ...) -> Optional[_T]: ... @overload def get(self, key: AppKey[_T], default: _U) -> Union[_T, _U]: ... @overload def get(self, key: str, default: Any = ...) -> Any: ... def get(self, key: Union[str, AppKey[_T]], default: Any = None) -> Any: return self._state.get(key, default) ######## @property def loop(self) -> asyncio.AbstractEventLoop: # Technically the loop can be None # but we mask it by explicit type cast # to provide more convenient type annotation warnings.warn("loop property is deprecated", DeprecationWarning, stacklevel=2) return cast(asyncio.AbstractEventLoop, self._loop) def _set_loop(self, loop: Optional[asyncio.AbstractEventLoop]) -> None: if loop is None: loop = asyncio.get_event_loop() if self._loop is not None and self._loop is not loop: raise RuntimeError( "web.Application instance initialized with different loop" ) self._loop = loop # set loop debug if self._debug is ...: self._debug = loop.get_debug() # set loop to sub applications for subapp in self._subapps: subapp._set_loop(loop) @property def pre_frozen(self) -> bool: return self._pre_frozen def pre_freeze(self) -> None: if self._pre_frozen: return self._pre_frozen = True self._middlewares.freeze() self._router.freeze() self._on_response_prepare.freeze() self._cleanup_ctx.freeze() self._on_startup.freeze() self._on_shutdown.freeze() self._on_cleanup.freeze() self._middlewares_handlers = tuple(self._prepare_middleware()) # If current app and any subapp do not have middlewares avoid run all # of the code footprint that it implies, which have a middleware # hardcoded per app that sets up the current_app attribute. If no # middlewares are configured the handler will receive the proper # current_app without needing all of this code. self._run_middlewares = True if self.middlewares else False for subapp in self._subapps: subapp.pre_freeze() self._run_middlewares = self._run_middlewares or subapp._run_middlewares @property def frozen(self) -> bool: return self._frozen def freeze(self) -> None: if self._frozen: return self.pre_freeze() self._frozen = True for subapp in self._subapps: subapp.freeze() @property def debug(self) -> bool: warnings.warn("debug property is deprecated", DeprecationWarning, stacklevel=2) return self._debug # type: ignore[no-any-return] def _reg_subapp_signals(self, subapp: "Application") -> None: def reg_handler(signame: str) -> None: subsig = getattr(subapp, signame) async def handler(app: "Application") -> None: await subsig.send(subapp) appsig = getattr(self, signame) appsig.append(handler) reg_handler("on_startup") reg_handler("on_shutdown") reg_handler("on_cleanup") def add_subapp(self, prefix: str, subapp: "Application") -> AbstractResource: if not isinstance(prefix, str): raise TypeError("Prefix must be str") prefix = prefix.rstrip("/") if not prefix: raise ValueError("Prefix cannot be empty") factory = partial(PrefixedSubAppResource, prefix, subapp) return self._add_subapp(factory, subapp) def _add_subapp( self, resource_factory: Callable[[], AbstractResource], subapp: "Application" ) -> AbstractResource: if self.frozen: raise RuntimeError("Cannot add sub application to frozen application") if subapp.frozen: raise RuntimeError("Cannot add frozen application") resource = resource_factory() self.router.register_resource(resource) self._reg_subapp_signals(subapp) self._subapps.append(subapp) subapp.pre_freeze() if self._loop is not None: subapp._set_loop(self._loop) return resource def add_domain(self, domain: str, subapp: "Application") -> AbstractResource: if not isinstance(domain, str): raise TypeError("Domain must be str") elif "*" in domain: rule: Domain = MaskDomain(domain) else: rule = Domain(domain) factory = partial(MatchedSubAppResource, rule, subapp) return self._add_subapp(factory, subapp) def add_routes(self, routes: Iterable[AbstractRouteDef]) -> List[AbstractRoute]: return self.router.add_routes(routes) @property def on_response_prepare(self) -> _RespPrepareSignal: return self._on_response_prepare @property def on_startup(self) -> _AppSignal: return self._on_startup @property def on_shutdown(self) -> _AppSignal: return self._on_shutdown @property def on_cleanup(self) -> _AppSignal: return self._on_cleanup @property def cleanup_ctx(self) -> "CleanupContext": return self._cleanup_ctx @property def router(self) -> UrlDispatcher: return self._router @property def middlewares(self) -> _Middlewares: return self._middlewares def _make_handler( self, *, loop: Optional[asyncio.AbstractEventLoop] = None, access_log_class: Type[AbstractAccessLogger] = AccessLogger, **kwargs: Any, ) -> Server: if not issubclass(access_log_class, AbstractAccessLogger): raise TypeError( "access_log_class must be subclass of " "aiohttp.abc.AbstractAccessLogger, got {}".format(access_log_class) ) self._set_loop(loop) self.freeze() kwargs["debug"] = self._debug kwargs["access_log_class"] = access_log_class if self._handler_args: for k, v in self._handler_args.items(): kwargs[k] = v return Server( self._handle, # type: ignore[arg-type] request_factory=self._make_request, loop=self._loop, **kwargs, ) def make_handler( self, *, loop: Optional[asyncio.AbstractEventLoop] = None, access_log_class: Type[AbstractAccessLogger] = AccessLogger, **kwargs: Any, ) -> Server: warnings.warn( "Application.make_handler(...) is deprecated, " "use AppRunner API instead", DeprecationWarning, stacklevel=2, ) return self._make_handler( loop=loop, access_log_class=access_log_class, **kwargs ) async def startup(self) -> None: """Causes on_startup signal Should be called in the event loop along with the request handler. """ await self.on_startup.send(self) async def shutdown(self) -> None: """Causes on_shutdown signal Should be called before cleanup() """ await self.on_shutdown.send(self) async def cleanup(self) -> None: """Causes on_cleanup signal Should be called after shutdown() """ if self.on_cleanup.frozen: await self.on_cleanup.send(self) else: # If an exception occurs in startup, ensure cleanup contexts are completed. await self._cleanup_ctx._on_cleanup(self) def _make_request( self, message: RawRequestMessage, payload: StreamReader, protocol: RequestHandler, writer: AbstractStreamWriter, task: "asyncio.Task[None]", _cls: Type[Request] = Request, ) -> Request: return _cls( message, payload, protocol, writer, task, self._loop, client_max_size=self._client_max_size, ) def _prepare_middleware(self) -> Iterator[Tuple[Middleware, bool]]: for m in reversed(self._middlewares): if getattr(m, "__middleware_version__", None) == 1: yield m, True else: warnings.warn( 'old-style middleware "{!r}" deprecated, ' "see #2252".format(m), DeprecationWarning, stacklevel=2, ) yield m, False yield _fix_request_current_app(self), True async def _handle(self, request: Request) -> StreamResponse: loop = asyncio.get_event_loop() debug = loop.get_debug() match_info = await self._router.resolve(request) if debug: # pragma: no cover if not isinstance(match_info, AbstractMatchInfo): raise TypeError( "match_info should be AbstractMatchInfo " "instance, not {!r}".format(match_info) ) match_info.add_app(self) match_info.freeze() resp = None request._match_info = match_info expect = request.headers.get(hdrs.EXPECT) if expect: resp = await match_info.expect_handler(request) await request.writer.drain() if resp is None: handler = match_info.handler if self._run_middlewares: for app in match_info.apps[::-1]: for m, new_style in app._middlewares_handlers: # type: ignore[union-attr] if new_style: handler = update_wrapper( partial(m, handler=handler), handler ) else: handler = await m(app, handler) # type: ignore[arg-type,assignment] resp = await handler(request) return resp def __call__(self) -> "Application": """gunicorn compatibility""" return self def __repr__(self) -> str: return f"" def __bool__(self) -> bool: return True class CleanupError(RuntimeError): @property def exceptions(self) -> List[BaseException]: return cast(List[BaseException], self.args[1]) if TYPE_CHECKING: _CleanupContextBase = FrozenList[Callable[[Application], AsyncIterator[None]]] else: _CleanupContextBase = FrozenList class CleanupContext(_CleanupContextBase): def __init__(self) -> None: super().__init__() self._exits: List[AsyncIterator[None]] = [] async def _on_startup(self, app: Application) -> None: for cb in self: it = cb(app).__aiter__() await it.__anext__() self._exits.append(it) async def _on_cleanup(self, app: Application) -> None: errors = [] for it in reversed(self._exits): try: await it.__anext__() except StopAsyncIteration: pass except Exception as exc: errors.append(exc) else: errors.append(RuntimeError(f"{it!r} has more than one 'yield'")) if errors: if len(errors) == 1: raise errors[0] else: raise CleanupError("Multiple errors on cleanup stage", errors) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/web_exceptions.py0000644000175100001770000002417014607525266017666 0ustar00runnerdockerimport warnings from typing import Any, Dict, Iterable, List, Optional, Set # noqa from yarl import URL from .typedefs import LooseHeaders, StrOrURL from .web_response import Response __all__ = ( "HTTPException", "HTTPError", "HTTPRedirection", "HTTPSuccessful", "HTTPOk", "HTTPCreated", "HTTPAccepted", "HTTPNonAuthoritativeInformation", "HTTPNoContent", "HTTPResetContent", "HTTPPartialContent", "HTTPMove", "HTTPMultipleChoices", "HTTPMovedPermanently", "HTTPFound", "HTTPSeeOther", "HTTPNotModified", "HTTPUseProxy", "HTTPTemporaryRedirect", "HTTPPermanentRedirect", "HTTPClientError", "HTTPBadRequest", "HTTPUnauthorized", "HTTPPaymentRequired", "HTTPForbidden", "HTTPNotFound", "HTTPMethodNotAllowed", "HTTPNotAcceptable", "HTTPProxyAuthenticationRequired", "HTTPRequestTimeout", "HTTPConflict", "HTTPGone", "HTTPLengthRequired", "HTTPPreconditionFailed", "HTTPRequestEntityTooLarge", "HTTPRequestURITooLong", "HTTPUnsupportedMediaType", "HTTPRequestRangeNotSatisfiable", "HTTPExpectationFailed", "HTTPMisdirectedRequest", "HTTPUnprocessableEntity", "HTTPFailedDependency", "HTTPUpgradeRequired", "HTTPPreconditionRequired", "HTTPTooManyRequests", "HTTPRequestHeaderFieldsTooLarge", "HTTPUnavailableForLegalReasons", "HTTPServerError", "HTTPInternalServerError", "HTTPNotImplemented", "HTTPBadGateway", "HTTPServiceUnavailable", "HTTPGatewayTimeout", "HTTPVersionNotSupported", "HTTPVariantAlsoNegotiates", "HTTPInsufficientStorage", "HTTPNotExtended", "HTTPNetworkAuthenticationRequired", ) class NotAppKeyWarning(UserWarning): """Warning when not using AppKey in Application.""" ############################################################ # HTTP Exceptions ############################################################ class HTTPException(Response, Exception): # You should set in subclasses: # status = 200 status_code = -1 empty_body = False __http_exception__ = True def __init__( self, *, headers: Optional[LooseHeaders] = None, reason: Optional[str] = None, body: Any = None, text: Optional[str] = None, content_type: Optional[str] = None, ) -> None: if body is not None: warnings.warn( "body argument is deprecated for http web exceptions", DeprecationWarning, ) Response.__init__( self, status=self.status_code, headers=headers, reason=reason, body=body, text=text, content_type=content_type, ) Exception.__init__(self, self.reason) if self.body is None and not self.empty_body: self.text = f"{self.status}: {self.reason}" def __bool__(self) -> bool: return True class HTTPError(HTTPException): """Base class for exceptions with status codes in the 400s and 500s.""" class HTTPRedirection(HTTPException): """Base class for exceptions with status codes in the 300s.""" class HTTPSuccessful(HTTPException): """Base class for exceptions with status codes in the 200s.""" class HTTPOk(HTTPSuccessful): status_code = 200 class HTTPCreated(HTTPSuccessful): status_code = 201 class HTTPAccepted(HTTPSuccessful): status_code = 202 class HTTPNonAuthoritativeInformation(HTTPSuccessful): status_code = 203 class HTTPNoContent(HTTPSuccessful): status_code = 204 empty_body = True class HTTPResetContent(HTTPSuccessful): status_code = 205 empty_body = True class HTTPPartialContent(HTTPSuccessful): status_code = 206 ############################################################ # 3xx redirection ############################################################ class HTTPMove(HTTPRedirection): def __init__( self, location: StrOrURL, *, headers: Optional[LooseHeaders] = None, reason: Optional[str] = None, body: Any = None, text: Optional[str] = None, content_type: Optional[str] = None, ) -> None: if not location: raise ValueError("HTTP redirects need a location to redirect to.") super().__init__( headers=headers, reason=reason, body=body, text=text, content_type=content_type, ) self.headers["Location"] = str(URL(location)) self.location = location class HTTPMultipleChoices(HTTPMove): status_code = 300 class HTTPMovedPermanently(HTTPMove): status_code = 301 class HTTPFound(HTTPMove): status_code = 302 # This one is safe after a POST (the redirected location will be # retrieved with GET): class HTTPSeeOther(HTTPMove): status_code = 303 class HTTPNotModified(HTTPRedirection): # FIXME: this should include a date or etag header status_code = 304 empty_body = True class HTTPUseProxy(HTTPMove): # Not a move, but looks a little like one status_code = 305 class HTTPTemporaryRedirect(HTTPMove): status_code = 307 class HTTPPermanentRedirect(HTTPMove): status_code = 308 ############################################################ # 4xx client error ############################################################ class HTTPClientError(HTTPError): pass class HTTPBadRequest(HTTPClientError): status_code = 400 class HTTPUnauthorized(HTTPClientError): status_code = 401 class HTTPPaymentRequired(HTTPClientError): status_code = 402 class HTTPForbidden(HTTPClientError): status_code = 403 class HTTPNotFound(HTTPClientError): status_code = 404 class HTTPMethodNotAllowed(HTTPClientError): status_code = 405 def __init__( self, method: str, allowed_methods: Iterable[str], *, headers: Optional[LooseHeaders] = None, reason: Optional[str] = None, body: Any = None, text: Optional[str] = None, content_type: Optional[str] = None, ) -> None: allow = ",".join(sorted(allowed_methods)) super().__init__( headers=headers, reason=reason, body=body, text=text, content_type=content_type, ) self.headers["Allow"] = allow self.allowed_methods: Set[str] = set(allowed_methods) self.method = method.upper() class HTTPNotAcceptable(HTTPClientError): status_code = 406 class HTTPProxyAuthenticationRequired(HTTPClientError): status_code = 407 class HTTPRequestTimeout(HTTPClientError): status_code = 408 class HTTPConflict(HTTPClientError): status_code = 409 class HTTPGone(HTTPClientError): status_code = 410 class HTTPLengthRequired(HTTPClientError): status_code = 411 class HTTPPreconditionFailed(HTTPClientError): status_code = 412 class HTTPRequestEntityTooLarge(HTTPClientError): status_code = 413 def __init__(self, max_size: float, actual_size: float, **kwargs: Any) -> None: kwargs.setdefault( "text", "Maximum request body size {} exceeded, " "actual body size {}".format(max_size, actual_size), ) super().__init__(**kwargs) class HTTPRequestURITooLong(HTTPClientError): status_code = 414 class HTTPUnsupportedMediaType(HTTPClientError): status_code = 415 class HTTPRequestRangeNotSatisfiable(HTTPClientError): status_code = 416 class HTTPExpectationFailed(HTTPClientError): status_code = 417 class HTTPMisdirectedRequest(HTTPClientError): status_code = 421 class HTTPUnprocessableEntity(HTTPClientError): status_code = 422 class HTTPFailedDependency(HTTPClientError): status_code = 424 class HTTPUpgradeRequired(HTTPClientError): status_code = 426 class HTTPPreconditionRequired(HTTPClientError): status_code = 428 class HTTPTooManyRequests(HTTPClientError): status_code = 429 class HTTPRequestHeaderFieldsTooLarge(HTTPClientError): status_code = 431 class HTTPUnavailableForLegalReasons(HTTPClientError): status_code = 451 def __init__( self, link: Optional[StrOrURL], *, headers: Optional[LooseHeaders] = None, reason: Optional[str] = None, body: Any = None, text: Optional[str] = None, content_type: Optional[str] = None, ) -> None: super().__init__( headers=headers, reason=reason, body=body, text=text, content_type=content_type, ) self._link = None if link: self._link = URL(link) self.headers["Link"] = f'<{str(self._link)}>; rel="blocked-by"' @property def link(self) -> Optional[URL]: return self._link ############################################################ # 5xx Server Error ############################################################ # Response status codes beginning with the digit "5" indicate cases in # which the server is aware that it has erred or is incapable of # performing the request. Except when responding to a HEAD request, the # server SHOULD include an entity containing an explanation of the error # situation, and whether it is a temporary or permanent condition. User # agents SHOULD display any included entity to the user. These response # codes are applicable to any request method. class HTTPServerError(HTTPError): pass class HTTPInternalServerError(HTTPServerError): status_code = 500 class HTTPNotImplemented(HTTPServerError): status_code = 501 class HTTPBadGateway(HTTPServerError): status_code = 502 class HTTPServiceUnavailable(HTTPServerError): status_code = 503 class HTTPGatewayTimeout(HTTPServerError): status_code = 504 class HTTPVersionNotSupported(HTTPServerError): status_code = 505 class HTTPVariantAlsoNegotiates(HTTPServerError): status_code = 506 class HTTPInsufficientStorage(HTTPServerError): status_code = 507 class HTTPNotExtended(HTTPServerError): status_code = 510 class HTTPNetworkAuthenticationRequired(HTTPServerError): status_code = 511 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/web_fileresponse.py0000644000175100001770000002646114607525266020210 0ustar00runnerdockerimport asyncio import mimetypes import os import pathlib from typing import ( # noqa IO, TYPE_CHECKING, Any, Awaitable, Callable, Final, Iterator, List, Optional, Tuple, Union, cast, ) from . import hdrs from .abc import AbstractStreamWriter from .helpers import ETAG_ANY, ETag, must_be_empty_body from .typedefs import LooseHeaders, PathLike from .web_exceptions import ( HTTPNotModified, HTTPPartialContent, HTTPPreconditionFailed, HTTPRequestRangeNotSatisfiable, ) from .web_response import StreamResponse __all__ = ("FileResponse",) if TYPE_CHECKING: from .web_request import BaseRequest _T_OnChunkSent = Optional[Callable[[bytes], Awaitable[None]]] NOSENDFILE: Final[bool] = bool(os.environ.get("AIOHTTP_NOSENDFILE")) class FileResponse(StreamResponse): """A response object can be used to send files.""" def __init__( self, path: PathLike, chunk_size: int = 256 * 1024, status: int = 200, reason: Optional[str] = None, headers: Optional[LooseHeaders] = None, ) -> None: super().__init__(status=status, reason=reason, headers=headers) self._path = pathlib.Path(path) self._chunk_size = chunk_size async def _sendfile_fallback( self, writer: AbstractStreamWriter, fobj: IO[Any], offset: int, count: int ) -> AbstractStreamWriter: # To keep memory usage low,fobj is transferred in chunks # controlled by the constructor's chunk_size argument. chunk_size = self._chunk_size loop = asyncio.get_event_loop() await loop.run_in_executor(None, fobj.seek, offset) chunk = await loop.run_in_executor(None, fobj.read, chunk_size) while chunk: await writer.write(chunk) count = count - chunk_size if count <= 0: break chunk = await loop.run_in_executor(None, fobj.read, min(chunk_size, count)) await writer.drain() return writer async def _sendfile( self, request: "BaseRequest", fobj: IO[Any], offset: int, count: int ) -> AbstractStreamWriter: writer = await super().prepare(request) assert writer is not None if NOSENDFILE or self.compression: return await self._sendfile_fallback(writer, fobj, offset, count) loop = request._loop transport = request.transport assert transport is not None try: await loop.sendfile(transport, fobj, offset, count) except NotImplementedError: return await self._sendfile_fallback(writer, fobj, offset, count) await super().write_eof() return writer @staticmethod def _strong_etag_match(etag_value: str, etags: Tuple[ETag, ...]) -> bool: if len(etags) == 1 and etags[0].value == ETAG_ANY: return True return any(etag.value == etag_value for etag in etags if not etag.is_weak) async def _not_modified( self, request: "BaseRequest", etag_value: str, last_modified: float ) -> Optional[AbstractStreamWriter]: self.set_status(HTTPNotModified.status_code) self._length_check = False self.etag = etag_value # type: ignore[assignment] self.last_modified = last_modified # type: ignore[assignment] # Delete any Content-Length headers provided by user. HTTP 304 # should always have empty response body return await super().prepare(request) async def _precondition_failed( self, request: "BaseRequest" ) -> Optional[AbstractStreamWriter]: self.set_status(HTTPPreconditionFailed.status_code) self.content_length = 0 return await super().prepare(request) def _get_file_path_stat_and_gzip( self, check_for_gzipped_file: bool ) -> Tuple[pathlib.Path, os.stat_result, bool]: """Return the file path, stat result, and gzip status. This method should be called from a thread executor since it calls os.stat which may block. """ filepath = self._path if check_for_gzipped_file: gzip_path = filepath.with_name(filepath.name + ".gz") try: return gzip_path, gzip_path.stat(), True except OSError: # Fall through and try the non-gzipped file pass return filepath, filepath.stat(), False async def prepare(self, request: "BaseRequest") -> Optional[AbstractStreamWriter]: loop = asyncio.get_event_loop() # Encoding comparisons should be case-insensitive # https://www.rfc-editor.org/rfc/rfc9110#section-8.4.1 check_for_gzipped_file = ( "gzip" in request.headers.get(hdrs.ACCEPT_ENCODING, "").lower() ) filepath, st, gzip = await loop.run_in_executor( None, self._get_file_path_stat_and_gzip, check_for_gzipped_file ) etag_value = f"{st.st_mtime_ns:x}-{st.st_size:x}" last_modified = st.st_mtime # https://tools.ietf.org/html/rfc7232#section-6 ifmatch = request.if_match if ifmatch is not None and not self._strong_etag_match(etag_value, ifmatch): return await self._precondition_failed(request) unmodsince = request.if_unmodified_since if ( unmodsince is not None and ifmatch is None and st.st_mtime > unmodsince.timestamp() ): return await self._precondition_failed(request) ifnonematch = request.if_none_match if ifnonematch is not None and self._strong_etag_match(etag_value, ifnonematch): return await self._not_modified(request, etag_value, last_modified) modsince = request.if_modified_since if ( modsince is not None and ifnonematch is None and st.st_mtime <= modsince.timestamp() ): return await self._not_modified(request, etag_value, last_modified) if hdrs.CONTENT_TYPE not in self.headers: ct, encoding = mimetypes.guess_type(str(filepath)) if not ct: ct = "application/octet-stream" should_set_ct = True else: encoding = "gzip" if gzip else None should_set_ct = False status = self._status file_size = st.st_size count = file_size start = None ifrange = request.if_range if ifrange is None or st.st_mtime <= ifrange.timestamp(): # If-Range header check: # condition = cached date >= last modification date # return 206 if True else 200. # if False: # Range header would not be processed, return 200 # if True but Range header missing # return 200 try: rng = request.http_range start = rng.start end = rng.stop except ValueError: # https://tools.ietf.org/html/rfc7233: # A server generating a 416 (Range Not Satisfiable) response to # a byte-range request SHOULD send a Content-Range header field # with an unsatisfied-range value. # The complete-length in a 416 response indicates the current # length of the selected representation. # # Will do the same below. Many servers ignore this and do not # send a Content-Range header with HTTP 416 self.headers[hdrs.CONTENT_RANGE] = f"bytes */{file_size}" self.set_status(HTTPRequestRangeNotSatisfiable.status_code) return await super().prepare(request) # If a range request has been made, convert start, end slice # notation into file pointer offset and count if start is not None or end is not None: if start < 0 and end is None: # return tail of file start += file_size if start < 0: # if Range:bytes=-1000 in request header but file size # is only 200, there would be trouble without this start = 0 count = file_size - start else: # rfc7233:If the last-byte-pos value is # absent, or if the value is greater than or equal to # the current length of the representation data, # the byte range is interpreted as the remainder # of the representation (i.e., the server replaces the # value of last-byte-pos with a value that is one less than # the current length of the selected representation). count = ( min(end if end is not None else file_size, file_size) - start ) if start >= file_size: # HTTP 416 should be returned in this case. # # According to https://tools.ietf.org/html/rfc7233: # If a valid byte-range-set includes at least one # byte-range-spec with a first-byte-pos that is less than # the current length of the representation, or at least one # suffix-byte-range-spec with a non-zero suffix-length, # then the byte-range-set is satisfiable. Otherwise, the # byte-range-set is unsatisfiable. self.headers[hdrs.CONTENT_RANGE] = f"bytes */{file_size}" self.set_status(HTTPRequestRangeNotSatisfiable.status_code) return await super().prepare(request) status = HTTPPartialContent.status_code # Even though you are sending the whole file, you should still # return a HTTP 206 for a Range request. self.set_status(status) if should_set_ct: self.content_type = ct # type: ignore[assignment] if encoding: self.headers[hdrs.CONTENT_ENCODING] = encoding if gzip: self.headers[hdrs.VARY] = hdrs.ACCEPT_ENCODING # Disable compression if we are already sending # a compressed file since we don't want to double # compress. self._compression = False self.etag = etag_value # type: ignore[assignment] self.last_modified = st.st_mtime # type: ignore[assignment] self.content_length = count self.headers[hdrs.ACCEPT_RANGES] = "bytes" real_start = cast(int, start) if status == HTTPPartialContent.status_code: self.headers[hdrs.CONTENT_RANGE] = "bytes {}-{}/{}".format( real_start, real_start + count - 1, file_size ) # If we are sending 0 bytes calling sendfile() will throw a ValueError if count == 0 or must_be_empty_body(request.method, self.status): return await super().prepare(request) fobj = await loop.run_in_executor(None, filepath.open, "rb") if start: # be aware that start could be None or int=0 here. offset = start else: offset = 0 try: return await self._sendfile(request, fobj, offset, count) finally: await asyncio.shield(loop.run_in_executor(None, fobj.close)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/web_log.py0000644000175100001770000001717114607525266016271 0ustar00runnerdockerimport datetime import functools import logging import os import re import time as time_mod from collections import namedtuple from typing import Any, Callable, Dict, Iterable, List, Tuple # noqa from .abc import AbstractAccessLogger from .web_request import BaseRequest from .web_response import StreamResponse KeyMethod = namedtuple("KeyMethod", "key method") class AccessLogger(AbstractAccessLogger): """Helper object to log access. Usage: log = logging.getLogger("spam") log_format = "%a %{User-Agent}i" access_logger = AccessLogger(log, log_format) access_logger.log(request, response, time) Format: %% The percent sign %a Remote IP-address (IP-address of proxy if using reverse proxy) %t Time when the request was started to process %P The process ID of the child that serviced the request %r First line of request %s Response status code %b Size of response in bytes, including HTTP headers %T Time taken to serve the request, in seconds %Tf Time taken to serve the request, in seconds with floating fraction in .06f format %D Time taken to serve the request, in microseconds %{FOO}i request.headers['FOO'] %{FOO}o response.headers['FOO'] %{FOO}e os.environ['FOO'] """ LOG_FORMAT_MAP = { "a": "remote_address", "t": "request_start_time", "P": "process_id", "r": "first_request_line", "s": "response_status", "b": "response_size", "T": "request_time", "Tf": "request_time_frac", "D": "request_time_micro", "i": "request_header", "o": "response_header", } LOG_FORMAT = '%a %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"' FORMAT_RE = re.compile(r"%(\{([A-Za-z0-9\-_]+)\}([ioe])|[atPrsbOD]|Tf?)") CLEANUP_RE = re.compile(r"(%[^s])") _FORMAT_CACHE: Dict[str, Tuple[str, List[KeyMethod]]] = {} def __init__(self, logger: logging.Logger, log_format: str = LOG_FORMAT) -> None: """Initialise the logger. logger is a logger object to be used for logging. log_format is a string with apache compatible log format description. """ super().__init__(logger, log_format=log_format) _compiled_format = AccessLogger._FORMAT_CACHE.get(log_format) if not _compiled_format: _compiled_format = self.compile_format(log_format) AccessLogger._FORMAT_CACHE[log_format] = _compiled_format self._log_format, self._methods = _compiled_format def compile_format(self, log_format: str) -> Tuple[str, List[KeyMethod]]: """Translate log_format into form usable by modulo formatting All known atoms will be replaced with %s Also methods for formatting of those atoms will be added to _methods in appropriate order For example we have log_format = "%a %t" This format will be translated to "%s %s" Also contents of _methods will be [self._format_a, self._format_t] These method will be called and results will be passed to translated string format. Each _format_* method receive 'args' which is list of arguments given to self.log Exceptions are _format_e, _format_i and _format_o methods which also receive key name (by functools.partial) """ # list of (key, method) tuples, we don't use an OrderedDict as users # can repeat the same key more than once methods = list() for atom in self.FORMAT_RE.findall(log_format): if atom[1] == "": format_key1 = self.LOG_FORMAT_MAP[atom[0]] m = getattr(AccessLogger, "_format_%s" % atom[0]) key_method = KeyMethod(format_key1, m) else: format_key2 = (self.LOG_FORMAT_MAP[atom[2]], atom[1]) m = getattr(AccessLogger, "_format_%s" % atom[2]) key_method = KeyMethod(format_key2, functools.partial(m, atom[1])) methods.append(key_method) log_format = self.FORMAT_RE.sub(r"%s", log_format) log_format = self.CLEANUP_RE.sub(r"%\1", log_format) return log_format, methods @staticmethod def _format_i( key: str, request: BaseRequest, response: StreamResponse, time: float ) -> str: if request is None: return "(no headers)" # suboptimal, make istr(key) once return request.headers.get(key, "-") @staticmethod def _format_o( key: str, request: BaseRequest, response: StreamResponse, time: float ) -> str: # suboptimal, make istr(key) once return response.headers.get(key, "-") @staticmethod def _format_a(request: BaseRequest, response: StreamResponse, time: float) -> str: if request is None: return "-" ip = request.remote return ip if ip is not None else "-" @staticmethod def _format_t(request: BaseRequest, response: StreamResponse, time: float) -> str: tz = datetime.timezone(datetime.timedelta(seconds=-time_mod.timezone)) now = datetime.datetime.now(tz) start_time = now - datetime.timedelta(seconds=time) return start_time.strftime("[%d/%b/%Y:%H:%M:%S %z]") @staticmethod def _format_P(request: BaseRequest, response: StreamResponse, time: float) -> str: return "<%s>" % os.getpid() @staticmethod def _format_r(request: BaseRequest, response: StreamResponse, time: float) -> str: if request is None: return "-" return "{} {} HTTP/{}.{}".format( request.method, request.path_qs, request.version.major, request.version.minor, ) @staticmethod def _format_s(request: BaseRequest, response: StreamResponse, time: float) -> int: return response.status @staticmethod def _format_b(request: BaseRequest, response: StreamResponse, time: float) -> int: return response.body_length @staticmethod def _format_T(request: BaseRequest, response: StreamResponse, time: float) -> str: return str(round(time)) @staticmethod def _format_Tf(request: BaseRequest, response: StreamResponse, time: float) -> str: return "%06f" % time @staticmethod def _format_D(request: BaseRequest, response: StreamResponse, time: float) -> str: return str(round(time * 1000000)) def _format_line( self, request: BaseRequest, response: StreamResponse, time: float ) -> Iterable[Tuple[str, Callable[[BaseRequest, StreamResponse, float], str]]]: return [(key, method(request, response, time)) for key, method in self._methods] def log(self, request: BaseRequest, response: StreamResponse, time: float) -> None: if not self.logger.isEnabledFor(logging.INFO): # Avoid formatting the log line if it will not be emitted. return try: fmt_info = self._format_line(request, response, time) values = list() extra = dict() for key, value in fmt_info: values.append(value) if key.__class__ is str: extra[key] = value else: k1, k2 = key # type: ignore[misc] dct = extra.get(k1, {}) # type: ignore[var-annotated,has-type] dct[k2] = value # type: ignore[index,has-type] extra[k1] = dct # type: ignore[has-type,assignment] self.logger.info(self._log_format % tuple(values), extra=extra) except Exception: self.logger.exception("Error in logging") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/web_middlewares.py0000644000175100001770000000770014607525266020005 0ustar00runnerdockerimport re from typing import TYPE_CHECKING, Tuple, Type, TypeVar from .typedefs import Handler, Middleware from .web_exceptions import HTTPMove, HTTPPermanentRedirect from .web_request import Request from .web_response import StreamResponse from .web_urldispatcher import SystemRoute __all__ = ( "middleware", "normalize_path_middleware", ) if TYPE_CHECKING: from .web_app import Application _Func = TypeVar("_Func") async def _check_request_resolves(request: Request, path: str) -> Tuple[bool, Request]: alt_request = request.clone(rel_url=path) match_info = await request.app.router.resolve(alt_request) alt_request._match_info = match_info if match_info.http_exception is None: return True, alt_request return False, request def middleware(f: _Func) -> _Func: f.__middleware_version__ = 1 # type: ignore[attr-defined] return f def normalize_path_middleware( *, append_slash: bool = True, remove_slash: bool = False, merge_slashes: bool = True, redirect_class: Type[HTTPMove] = HTTPPermanentRedirect, ) -> Middleware: """Factory for producing a middleware that normalizes the path of a request. Normalizing means: - Add or remove a trailing slash to the path. - Double slashes are replaced by one. The middleware returns as soon as it finds a path that resolves correctly. The order if both merge and append/remove are enabled is 1) merge slashes 2) append/remove slash 3) both merge slashes and append/remove slash. If the path resolves with at least one of those conditions, it will redirect to the new path. Only one of `append_slash` and `remove_slash` can be enabled. If both are `True` the factory will raise an assertion error If `append_slash` is `True` the middleware will append a slash when needed. If a resource is defined with trailing slash and the request comes without it, it will append it automatically. If `remove_slash` is `True`, `append_slash` must be `False`. When enabled the middleware will remove trailing slashes and redirect if the resource is defined If merge_slashes is True, merge multiple consecutive slashes in the path into one. """ correct_configuration = not (append_slash and remove_slash) assert correct_configuration, "Cannot both remove and append slash" @middleware async def impl(request: Request, handler: Handler) -> StreamResponse: if isinstance(request.match_info.route, SystemRoute): paths_to_check = [] if "?" in request.raw_path: path, query = request.raw_path.split("?", 1) query = "?" + query else: query = "" path = request.raw_path if merge_slashes: paths_to_check.append(re.sub("//+", "/", path)) if append_slash and not request.path.endswith("/"): paths_to_check.append(path + "/") if remove_slash and request.path.endswith("/"): paths_to_check.append(path[:-1]) if merge_slashes and append_slash: paths_to_check.append(re.sub("//+", "/", path + "/")) if merge_slashes and remove_slash: merged_slashes = re.sub("//+", "/", path) paths_to_check.append(merged_slashes[:-1]) for path in paths_to_check: path = re.sub("^//+", "/", path) # SECURITY: GHSA-v6wp-4m6f-gcjg resolves, request = await _check_request_resolves(request, path) if resolves: raise redirect_class(request.raw_path + query) return await handler(request) return impl def _fix_request_current_app(app: "Application") -> Middleware: @middleware async def impl(request: Request, handler: Handler) -> StreamResponse: with request.match_info.set_current_app(app): return await handler(request) return impl ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/web_protocol.py0000644000175100001770000005502414607525266017350 0ustar00runnerdockerimport asyncio import asyncio.streams import traceback import warnings from collections import deque from contextlib import suppress from html import escape as html_escape from http import HTTPStatus from logging import Logger from typing import ( TYPE_CHECKING, Any, Awaitable, Callable, Deque, Optional, Sequence, Tuple, Type, Union, cast, ) import attr import yarl from .abc import AbstractAccessLogger, AbstractStreamWriter from .base_protocol import BaseProtocol from .helpers import ceil_timeout, set_exception from .http import ( HttpProcessingError, HttpRequestParser, HttpVersion10, RawRequestMessage, StreamWriter, ) from .log import access_logger, server_logger from .streams import EMPTY_PAYLOAD, StreamReader from .tcp_helpers import tcp_keepalive from .web_exceptions import HTTPException from .web_log import AccessLogger from .web_request import BaseRequest from .web_response import Response, StreamResponse __all__ = ("RequestHandler", "RequestPayloadError", "PayloadAccessError") if TYPE_CHECKING: from .web_server import Server _RequestFactory = Callable[ [ RawRequestMessage, StreamReader, "RequestHandler", AbstractStreamWriter, "asyncio.Task[None]", ], BaseRequest, ] _RequestHandler = Callable[[BaseRequest], Awaitable[StreamResponse]] ERROR = RawRequestMessage( "UNKNOWN", "/", HttpVersion10, {}, # type: ignore[arg-type] {}, # type: ignore[arg-type] True, None, False, False, yarl.URL("/"), ) class RequestPayloadError(Exception): """Payload parsing error.""" class PayloadAccessError(Exception): """Payload was accessed after response was sent.""" @attr.s(auto_attribs=True, frozen=True, slots=True) class _ErrInfo: status: int exc: BaseException message: str _MsgType = Tuple[Union[RawRequestMessage, _ErrInfo], StreamReader] class RequestHandler(BaseProtocol): """HTTP protocol implementation. RequestHandler handles incoming HTTP request. It reads request line, request headers and request payload and calls handle_request() method. By default it always returns with 404 response. RequestHandler handles errors in incoming request, like bad status line, bad headers or incomplete payload. If any error occurs, connection gets closed. keepalive_timeout -- number of seconds before closing keep-alive connection tcp_keepalive -- TCP keep-alive is on, default is on debug -- enable debug mode logger -- custom logger object access_log_class -- custom class for access_logger access_log -- custom logging object access_log_format -- access log format string loop -- Optional event loop max_line_size -- Optional maximum header line size max_field_size -- Optional maximum header field size max_headers -- Optional maximum header size timeout_ceil_threshold -- Optional value to specify threshold to ceil() timeout values """ KEEPALIVE_RESCHEDULE_DELAY = 1 __slots__ = ( "_request_count", "_keepalive", "_manager", "_request_handler", "_request_factory", "_tcp_keepalive", "_keepalive_time", "_keepalive_handle", "_keepalive_timeout", "_lingering_time", "_messages", "_message_tail", "_waiter", "_task_handler", "_upgrade", "_payload_parser", "_request_parser", "_reading_paused", "logger", "debug", "access_log", "access_logger", "_close", "_force_close", "_current_request", "_timeout_ceil_threshold", ) def __init__( self, manager: "Server", *, loop: asyncio.AbstractEventLoop, keepalive_timeout: float = 75.0, # NGINX default is 75 secs tcp_keepalive: bool = True, logger: Logger = server_logger, access_log_class: Type[AbstractAccessLogger] = AccessLogger, access_log: Logger = access_logger, access_log_format: str = AccessLogger.LOG_FORMAT, debug: bool = False, max_line_size: int = 8190, max_headers: int = 32768, max_field_size: int = 8190, lingering_time: float = 10.0, read_bufsize: int = 2**16, auto_decompress: bool = True, timeout_ceil_threshold: float = 5, ): super().__init__(loop) self._request_count = 0 self._keepalive = False self._current_request: Optional[BaseRequest] = None self._manager: Optional[Server] = manager self._request_handler: Optional[_RequestHandler] = manager.request_handler self._request_factory: Optional[_RequestFactory] = manager.request_factory self._tcp_keepalive = tcp_keepalive # placeholder to be replaced on keepalive timeout setup self._keepalive_time = 0.0 self._keepalive_handle: Optional[asyncio.Handle] = None self._keepalive_timeout = keepalive_timeout self._lingering_time = float(lingering_time) self._messages: Deque[_MsgType] = deque() self._message_tail = b"" self._waiter: Optional[asyncio.Future[None]] = None self._task_handler: Optional[asyncio.Task[None]] = None self._upgrade = False self._payload_parser: Any = None self._request_parser: Optional[HttpRequestParser] = HttpRequestParser( self, loop, read_bufsize, max_line_size=max_line_size, max_field_size=max_field_size, max_headers=max_headers, payload_exception=RequestPayloadError, auto_decompress=auto_decompress, ) self._timeout_ceil_threshold: float = 5 try: self._timeout_ceil_threshold = float(timeout_ceil_threshold) except (TypeError, ValueError): pass self.logger = logger self.debug = debug self.access_log = access_log if access_log: self.access_logger: Optional[AbstractAccessLogger] = access_log_class( access_log, access_log_format ) else: self.access_logger = None self._close = False self._force_close = False def __repr__(self) -> str: return "<{} {}>".format( self.__class__.__name__, "connected" if self.transport is not None else "disconnected", ) @property def keepalive_timeout(self) -> float: return self._keepalive_timeout async def shutdown(self, timeout: Optional[float] = 15.0) -> None: """Do worker process exit preparations. We need to clean up everything and stop accepting requests. It is especially important for keep-alive connections. """ self._force_close = True if self._keepalive_handle is not None: self._keepalive_handle.cancel() if self._waiter: self._waiter.cancel() # wait for handlers with suppress(asyncio.CancelledError, asyncio.TimeoutError): async with ceil_timeout(timeout): if self._current_request is not None: self._current_request._cancel(asyncio.CancelledError()) if self._task_handler is not None and not self._task_handler.done(): await self._task_handler # force-close non-idle handler if self._task_handler is not None: self._task_handler.cancel() if self.transport is not None: self.transport.close() self.transport = None def connection_made(self, transport: asyncio.BaseTransport) -> None: super().connection_made(transport) real_transport = cast(asyncio.Transport, transport) if self._tcp_keepalive: tcp_keepalive(real_transport) self._task_handler = self._loop.create_task(self.start()) assert self._manager is not None self._manager.connection_made(self, real_transport) def connection_lost(self, exc: Optional[BaseException]) -> None: if self._manager is None: return self._manager.connection_lost(self, exc) super().connection_lost(exc) # Grab value before setting _manager to None. handler_cancellation = self._manager.handler_cancellation self._manager = None self._force_close = True self._request_factory = None self._request_handler = None self._request_parser = None if self._keepalive_handle is not None: self._keepalive_handle.cancel() if self._current_request is not None: if exc is None: exc = ConnectionResetError("Connection lost") self._current_request._cancel(exc) if self._waiter is not None: self._waiter.cancel() if handler_cancellation and self._task_handler is not None: self._task_handler.cancel() self._task_handler = None if self._payload_parser is not None: self._payload_parser.feed_eof() self._payload_parser = None def set_parser(self, parser: Any) -> None: # Actual type is WebReader assert self._payload_parser is None self._payload_parser = parser if self._message_tail: self._payload_parser.feed_data(self._message_tail) self._message_tail = b"" def eof_received(self) -> None: pass def data_received(self, data: bytes) -> None: if self._force_close or self._close: return # parse http messages messages: Sequence[_MsgType] if self._payload_parser is None and not self._upgrade: assert self._request_parser is not None try: messages, upgraded, tail = self._request_parser.feed_data(data) except HttpProcessingError as exc: messages = [ (_ErrInfo(status=400, exc=exc, message=exc.message), EMPTY_PAYLOAD) ] upgraded = False tail = b"" for msg, payload in messages or (): self._request_count += 1 self._messages.append((msg, payload)) waiter = self._waiter if messages and waiter is not None and not waiter.done(): # don't set result twice waiter.set_result(None) self._upgrade = upgraded if upgraded and tail: self._message_tail = tail # no parser, just store elif self._payload_parser is None and self._upgrade and data: self._message_tail += data # feed payload elif data: eof, tail = self._payload_parser.feed_data(data) if eof: self.close() def keep_alive(self, val: bool) -> None: """Set keep-alive connection mode. :param bool val: new state. """ self._keepalive = val if self._keepalive_handle: self._keepalive_handle.cancel() self._keepalive_handle = None def close(self) -> None: """Close connection. Stop accepting new pipelining messages and close connection when handlers done processing messages. """ self._close = True if self._waiter: self._waiter.cancel() def force_close(self) -> None: """Forcefully close connection.""" self._force_close = True if self._waiter: self._waiter.cancel() if self.transport is not None: self.transport.close() self.transport = None def log_access( self, request: BaseRequest, response: StreamResponse, time: float ) -> None: if self.access_logger is not None: self.access_logger.log(request, response, self._loop.time() - time) def log_debug(self, *args: Any, **kw: Any) -> None: if self.debug: self.logger.debug(*args, **kw) def log_exception(self, *args: Any, **kw: Any) -> None: self.logger.exception(*args, **kw) def _process_keepalive(self) -> None: if self._force_close or not self._keepalive: return next = self._keepalive_time + self._keepalive_timeout # handler in idle state if self._waiter: if self._loop.time() > next: self.force_close() return # not all request handlers are done, # reschedule itself to next second self._keepalive_handle = self._loop.call_later( self.KEEPALIVE_RESCHEDULE_DELAY, self._process_keepalive, ) async def _handle_request( self, request: BaseRequest, start_time: float, request_handler: Callable[[BaseRequest], Awaitable[StreamResponse]], ) -> Tuple[StreamResponse, bool]: assert self._request_handler is not None try: try: self._current_request = request resp = await request_handler(request) finally: self._current_request = None except HTTPException as exc: resp = exc reset = await self.finish_response(request, resp, start_time) except asyncio.CancelledError: raise except asyncio.TimeoutError as exc: self.log_debug("Request handler timed out.", exc_info=exc) resp = self.handle_error(request, 504) reset = await self.finish_response(request, resp, start_time) except Exception as exc: resp = self.handle_error(request, 500, exc) reset = await self.finish_response(request, resp, start_time) else: # Deprecation warning (See #2415) if getattr(resp, "__http_exception__", False): warnings.warn( "returning HTTPException object is deprecated " "(#2415) and will be removed, " "please raise the exception instead", DeprecationWarning, ) reset = await self.finish_response(request, resp, start_time) return resp, reset async def start(self) -> None: """Process incoming request. It reads request line, request headers and request payload, then calls handle_request() method. Subclass has to override handle_request(). start() handles various exceptions in request or response handling. Connection is being closed always unless keep_alive(True) specified. """ loop = self._loop handler = self._task_handler assert handler is not None manager = self._manager assert manager is not None keepalive_timeout = self._keepalive_timeout resp = None assert self._request_factory is not None assert self._request_handler is not None while not self._force_close: if not self._messages: try: # wait for next request self._waiter = loop.create_future() await self._waiter except asyncio.CancelledError: break finally: self._waiter = None message, payload = self._messages.popleft() start = loop.time() manager.requests_count += 1 writer = StreamWriter(self, loop) if isinstance(message, _ErrInfo): # make request_factory work request_handler = self._make_error_handler(message) message = ERROR else: request_handler = self._request_handler request = self._request_factory(message, payload, self, writer, handler) try: # a new task is used for copy context vars (#3406) task = self._loop.create_task( self._handle_request(request, start, request_handler) ) try: resp, reset = await task except (asyncio.CancelledError, ConnectionError): self.log_debug("Ignored premature client disconnection") break # Drop the processed task from asyncio.Task.all_tasks() early del task if reset: self.log_debug("Ignored premature client disconnection 2") break # notify server about keep-alive self._keepalive = bool(resp.keep_alive) # check payload if not payload.is_eof(): lingering_time = self._lingering_time if not self._force_close and lingering_time: self.log_debug( "Start lingering close timer for %s sec.", lingering_time ) now = loop.time() end_t = now + lingering_time with suppress(asyncio.TimeoutError, asyncio.CancelledError): while not payload.is_eof() and now < end_t: async with ceil_timeout(end_t - now): # read and ignore await payload.readany() now = loop.time() # if payload still uncompleted if not payload.is_eof() and not self._force_close: self.log_debug("Uncompleted request.") self.close() set_exception(payload, PayloadAccessError()) except asyncio.CancelledError: self.log_debug("Ignored premature client disconnection ") break except RuntimeError as exc: if self.debug: self.log_exception("Unhandled runtime exception", exc_info=exc) self.force_close() except Exception as exc: self.log_exception("Unhandled exception", exc_info=exc) self.force_close() finally: if self.transport is None and resp is not None: self.log_debug("Ignored premature client disconnection.") elif not self._force_close: if self._keepalive and not self._close: # start keep-alive timer if keepalive_timeout is not None: now = self._loop.time() self._keepalive_time = now if self._keepalive_handle is None: self._keepalive_handle = loop.call_at( now + keepalive_timeout, self._process_keepalive ) else: break # remove handler, close transport if no handlers left if not self._force_close: self._task_handler = None if self.transport is not None: self.transport.close() async def finish_response( self, request: BaseRequest, resp: StreamResponse, start_time: float ) -> bool: """Prepare the response and write_eof, then log access. This has to be called within the context of any exception so the access logger can get exception information. Returns True if the client disconnects prematurely. """ if self._request_parser is not None: self._request_parser.set_upgraded(False) self._upgrade = False if self._message_tail: self._request_parser.feed_data(self._message_tail) self._message_tail = b"" try: prepare_meth = resp.prepare except AttributeError: if resp is None: raise RuntimeError("Missing return " "statement on request handler") else: raise RuntimeError( "Web-handler should return " "a response instance, " "got {!r}".format(resp) ) try: await prepare_meth(request) await resp.write_eof() except ConnectionError: self.log_access(request, resp, start_time) return True else: self.log_access(request, resp, start_time) return False def handle_error( self, request: BaseRequest, status: int = 500, exc: Optional[BaseException] = None, message: Optional[str] = None, ) -> StreamResponse: """Handle errors. Returns HTTP response with specific status code. Logs additional information. It always closes current connection. """ self.log_exception("Error handling request", exc_info=exc) # some data already got sent, connection is broken if request.writer.output_size > 0: raise ConnectionError( "Response is sent already, cannot send another response " "with the error message" ) ct = "text/plain" if status == HTTPStatus.INTERNAL_SERVER_ERROR: title = "{0.value} {0.phrase}".format(HTTPStatus.INTERNAL_SERVER_ERROR) msg = HTTPStatus.INTERNAL_SERVER_ERROR.description tb = None if self.debug: with suppress(Exception): tb = traceback.format_exc() if "text/html" in request.headers.get("Accept", ""): if tb: tb = html_escape(tb) msg = f"

Traceback:

\n
{tb}
" message = ( "" "{title}" "\n

{title}

" "\n{msg}\n\n" ).format(title=title, msg=msg) ct = "text/html" else: if tb: msg = tb message = title + "\n\n" + msg resp = Response(status=status, text=message, content_type=ct) resp.force_close() return resp def _make_error_handler( self, err_info: _ErrInfo ) -> Callable[[BaseRequest], Awaitable[StreamResponse]]: async def handler(request: BaseRequest) -> StreamResponse: return self.handle_error( request, err_info.status, err_info.exc, err_info.message ) return handler ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/web_request.py0000644000175100001770000007047214607525266017203 0ustar00runnerdockerimport asyncio import datetime import io import re import socket import string import tempfile import types import warnings from http.cookies import SimpleCookie from types import MappingProxyType from typing import ( TYPE_CHECKING, Any, Dict, Final, Iterator, Mapping, MutableMapping, Optional, Pattern, Tuple, Union, cast, ) from urllib.parse import parse_qsl import attr from multidict import ( CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy, MultiMapping, ) from yarl import URL from . import hdrs from .abc import AbstractStreamWriter from .helpers import ( _SENTINEL, DEBUG, ETAG_ANY, LIST_QUOTED_ETAG_RE, ChainMapProxy, ETag, HeadersMixin, parse_http_date, reify, sentinel, set_exception, ) from .http_parser import RawRequestMessage from .http_writer import HttpVersion from .multipart import BodyPartReader, MultipartReader from .streams import EmptyStreamReader, StreamReader from .typedefs import ( DEFAULT_JSON_DECODER, JSONDecoder, LooseHeaders, RawHeaders, StrOrURL, ) from .web_exceptions import HTTPRequestEntityTooLarge from .web_response import StreamResponse __all__ = ("BaseRequest", "FileField", "Request") if TYPE_CHECKING: from .web_app import Application from .web_protocol import RequestHandler from .web_urldispatcher import UrlMappingMatchInfo @attr.s(auto_attribs=True, frozen=True, slots=True) class FileField: name: str filename: str file: io.BufferedReader content_type: str headers: "CIMultiDictProxy[str]" _TCHAR: Final[str] = string.digits + string.ascii_letters + r"!#$%&'*+.^_`|~-" # '-' at the end to prevent interpretation as range in a char class _TOKEN: Final[str] = rf"[{_TCHAR}]+" _QDTEXT: Final[str] = r"[{}]".format( r"".join(chr(c) for c in (0x09, 0x20, 0x21) + tuple(range(0x23, 0x7F))) ) # qdtext includes 0x5C to escape 0x5D ('\]') # qdtext excludes obs-text (because obsoleted, and encoding not specified) _QUOTED_PAIR: Final[str] = r"\\[\t !-~]" _QUOTED_STRING: Final[str] = r'"(?:{quoted_pair}|{qdtext})*"'.format( qdtext=_QDTEXT, quoted_pair=_QUOTED_PAIR ) _FORWARDED_PAIR: Final[ str ] = r"({token})=({token}|{quoted_string})(:\d{{1,4}})?".format( token=_TOKEN, quoted_string=_QUOTED_STRING ) _QUOTED_PAIR_REPLACE_RE: Final[Pattern[str]] = re.compile(r"\\([\t !-~])") # same pattern as _QUOTED_PAIR but contains a capture group _FORWARDED_PAIR_RE: Final[Pattern[str]] = re.compile(_FORWARDED_PAIR) ############################################################ # HTTP Request ############################################################ class BaseRequest(MutableMapping[str, Any], HeadersMixin): POST_METHODS = { hdrs.METH_PATCH, hdrs.METH_POST, hdrs.METH_PUT, hdrs.METH_TRACE, hdrs.METH_DELETE, } ATTRS = HeadersMixin.ATTRS | frozenset( [ "_message", "_protocol", "_payload_writer", "_payload", "_headers", "_method", "_version", "_rel_url", "_post", "_read_bytes", "_state", "_cache", "_task", "_client_max_size", "_loop", "_transport_sslcontext", "_transport_peername", ] ) def __init__( self, message: RawRequestMessage, payload: StreamReader, protocol: "RequestHandler", payload_writer: AbstractStreamWriter, task: "asyncio.Task[None]", loop: asyncio.AbstractEventLoop, *, client_max_size: int = 1024**2, state: Optional[Dict[str, Any]] = None, scheme: Optional[str] = None, host: Optional[str] = None, remote: Optional[str] = None, ) -> None: if state is None: state = {} self._message = message self._protocol = protocol self._payload_writer = payload_writer self._payload = payload self._headers = message.headers self._method = message.method self._version = message.version self._cache: Dict[str, Any] = {} url = message.url if url.is_absolute(): # absolute URL is given, # override auto-calculating url, host, and scheme # all other properties should be good self._cache["url"] = url self._cache["host"] = url.host self._cache["scheme"] = url.scheme self._rel_url = url.relative() else: self._rel_url = message.url self._post: Optional[MultiDictProxy[Union[str, bytes, FileField]]] = None self._read_bytes: Optional[bytes] = None self._state = state self._task = task self._client_max_size = client_max_size self._loop = loop transport = self._protocol.transport assert transport is not None self._transport_sslcontext = transport.get_extra_info("sslcontext") self._transport_peername = transport.get_extra_info("peername") if scheme is not None: self._cache["scheme"] = scheme if host is not None: self._cache["host"] = host if remote is not None: self._cache["remote"] = remote def clone( self, *, method: Union[str, _SENTINEL] = sentinel, rel_url: Union[StrOrURL, _SENTINEL] = sentinel, headers: Union[LooseHeaders, _SENTINEL] = sentinel, scheme: Union[str, _SENTINEL] = sentinel, host: Union[str, _SENTINEL] = sentinel, remote: Union[str, _SENTINEL] = sentinel, client_max_size: Union[int, _SENTINEL] = sentinel, ) -> "BaseRequest": """Clone itself with replacement some attributes. Creates and returns a new instance of Request object. If no parameters are given, an exact copy is returned. If a parameter is not passed, it will reuse the one from the current request object. """ if self._read_bytes: raise RuntimeError("Cannot clone request " "after reading its content") dct: Dict[str, Any] = {} if method is not sentinel: dct["method"] = method if rel_url is not sentinel: new_url: URL = URL(rel_url) dct["url"] = new_url dct["path"] = str(new_url) if headers is not sentinel: # a copy semantic dct["headers"] = CIMultiDictProxy(CIMultiDict(headers)) dct["raw_headers"] = tuple( (k.encode("utf-8"), v.encode("utf-8")) for k, v in headers.items() ) message = self._message._replace(**dct) kwargs = {} if scheme is not sentinel: kwargs["scheme"] = scheme if host is not sentinel: kwargs["host"] = host if remote is not sentinel: kwargs["remote"] = remote if client_max_size is sentinel: client_max_size = self._client_max_size return self.__class__( message, self._payload, self._protocol, self._payload_writer, self._task, self._loop, client_max_size=client_max_size, state=self._state.copy(), **kwargs, ) @property def task(self) -> "asyncio.Task[None]": return self._task @property def protocol(self) -> "RequestHandler": return self._protocol @property def transport(self) -> Optional[asyncio.Transport]: if self._protocol is None: return None return self._protocol.transport @property def writer(self) -> AbstractStreamWriter: return self._payload_writer @property def client_max_size(self) -> int: return self._client_max_size @reify def message(self) -> RawRequestMessage: warnings.warn("Request.message is deprecated", DeprecationWarning, stacklevel=3) return self._message @reify def rel_url(self) -> URL: return self._rel_url @reify def loop(self) -> asyncio.AbstractEventLoop: warnings.warn( "request.loop property is deprecated", DeprecationWarning, stacklevel=2 ) return self._loop # MutableMapping API def __getitem__(self, key: str) -> Any: return self._state[key] def __setitem__(self, key: str, value: Any) -> None: self._state[key] = value def __delitem__(self, key: str) -> None: del self._state[key] def __len__(self) -> int: return len(self._state) def __iter__(self) -> Iterator[str]: return iter(self._state) ######## @reify def secure(self) -> bool: """A bool indicating if the request is handled with SSL.""" return self.scheme == "https" @reify def forwarded(self) -> Tuple[Mapping[str, str], ...]: """A tuple containing all parsed Forwarded header(s). Makes an effort to parse Forwarded headers as specified by RFC 7239: - It adds one (immutable) dictionary per Forwarded 'field-value', ie per proxy. The element corresponds to the data in the Forwarded field-value added by the first proxy encountered by the client. Each subsequent item corresponds to those added by later proxies. - It checks that every value has valid syntax in general as specified in section 4: either a 'token' or a 'quoted-string'. - It un-escapes found escape sequences. - It does NOT validate 'by' and 'for' contents as specified in section 6. - It does NOT validate 'host' contents (Host ABNF). - It does NOT validate 'proto' contents for valid URI scheme names. Returns a tuple containing one or more immutable dicts """ elems = [] for field_value in self._message.headers.getall(hdrs.FORWARDED, ()): length = len(field_value) pos = 0 need_separator = False elem: Dict[str, str] = {} elems.append(types.MappingProxyType(elem)) while 0 <= pos < length: match = _FORWARDED_PAIR_RE.match(field_value, pos) if match is not None: # got a valid forwarded-pair if need_separator: # bad syntax here, skip to next comma pos = field_value.find(",", pos) else: name, value, port = match.groups() if value[0] == '"': # quoted string: remove quotes and unescape value = _QUOTED_PAIR_REPLACE_RE.sub(r"\1", value[1:-1]) if port: value += port elem[name.lower()] = value pos += len(match.group(0)) need_separator = True elif field_value[pos] == ",": # next forwarded-element need_separator = False elem = {} elems.append(types.MappingProxyType(elem)) pos += 1 elif field_value[pos] == ";": # next forwarded-pair need_separator = False pos += 1 elif field_value[pos] in " \t": # Allow whitespace even between forwarded-pairs, though # RFC 7239 doesn't. This simplifies code and is in line # with Postel's law. pos += 1 else: # bad syntax here, skip to next comma pos = field_value.find(",", pos) return tuple(elems) @reify def scheme(self) -> str: """A string representing the scheme of the request. Hostname is resolved in this order: - overridden value by .clone(scheme=new_scheme) call. - type of connection to peer: HTTPS if socket is SSL, HTTP otherwise. 'http' or 'https'. """ if self._transport_sslcontext: return "https" else: return "http" @reify def method(self) -> str: """Read only property for getting HTTP method. The value is upper-cased str like 'GET', 'POST', 'PUT' etc. """ return self._method @reify def version(self) -> HttpVersion: """Read only property for getting HTTP version of request. Returns aiohttp.protocol.HttpVersion instance. """ return self._version @reify def host(self) -> str: """Hostname of the request. Hostname is resolved in this order: - overridden value by .clone(host=new_host) call. - HOST HTTP header - socket.getfqdn() value """ host = self._message.headers.get(hdrs.HOST) if host is not None: return host return socket.getfqdn() @reify def remote(self) -> Optional[str]: """Remote IP of client initiated HTTP request. The IP is resolved in this order: - overridden value by .clone(remote=new_remote) call. - peername of opened socket """ if self._transport_peername is None: return None if isinstance(self._transport_peername, (list, tuple)): return str(self._transport_peername[0]) return str(self._transport_peername) @reify def url(self) -> URL: url = URL.build(scheme=self.scheme, host=self.host) return url.join(self._rel_url) @reify def path(self) -> str: """The URL including *PATH INFO* without the host or scheme. E.g., ``/app/blog`` """ return self._rel_url.path @reify def path_qs(self) -> str: """The URL including PATH_INFO and the query string. E.g, /app/blog?id=10 """ return str(self._rel_url) @reify def raw_path(self) -> str: """The URL including raw *PATH INFO* without the host or scheme. Warning, the path is unquoted and may contains non valid URL characters E.g., ``/my%2Fpath%7Cwith%21some%25strange%24characters`` """ return self._message.path @reify def query(self) -> "MultiMapping[str]": """A multidict with all the variables in the query string.""" return MultiDictProxy(self._rel_url.query) @reify def query_string(self) -> str: """The query string in the URL. E.g., id=10 """ return self._rel_url.query_string @reify def headers(self) -> "MultiMapping[str]": """A case-insensitive multidict proxy with all headers.""" return self._headers @reify def raw_headers(self) -> RawHeaders: """A sequence of pairs for all headers.""" return self._message.raw_headers @reify def if_modified_since(self) -> Optional[datetime.datetime]: """The value of If-Modified-Since HTTP header, or None. This header is represented as a `datetime` object. """ return parse_http_date(self.headers.get(hdrs.IF_MODIFIED_SINCE)) @reify def if_unmodified_since(self) -> Optional[datetime.datetime]: """The value of If-Unmodified-Since HTTP header, or None. This header is represented as a `datetime` object. """ return parse_http_date(self.headers.get(hdrs.IF_UNMODIFIED_SINCE)) @staticmethod def _etag_values(etag_header: str) -> Iterator[ETag]: """Extract `ETag` objects from raw header.""" if etag_header == ETAG_ANY: yield ETag( is_weak=False, value=ETAG_ANY, ) else: for match in LIST_QUOTED_ETAG_RE.finditer(etag_header): is_weak, value, garbage = match.group(2, 3, 4) # Any symbol captured by 4th group means # that the following sequence is invalid. if garbage: break yield ETag( is_weak=bool(is_weak), value=value, ) @classmethod def _if_match_or_none_impl( cls, header_value: Optional[str] ) -> Optional[Tuple[ETag, ...]]: if not header_value: return None return tuple(cls._etag_values(header_value)) @reify def if_match(self) -> Optional[Tuple[ETag, ...]]: """The value of If-Match HTTP header, or None. This header is represented as a `tuple` of `ETag` objects. """ return self._if_match_or_none_impl(self.headers.get(hdrs.IF_MATCH)) @reify def if_none_match(self) -> Optional[Tuple[ETag, ...]]: """The value of If-None-Match HTTP header, or None. This header is represented as a `tuple` of `ETag` objects. """ return self._if_match_or_none_impl(self.headers.get(hdrs.IF_NONE_MATCH)) @reify def if_range(self) -> Optional[datetime.datetime]: """The value of If-Range HTTP header, or None. This header is represented as a `datetime` object. """ return parse_http_date(self.headers.get(hdrs.IF_RANGE)) @reify def keep_alive(self) -> bool: """Is keepalive enabled by client?""" return not self._message.should_close @reify def cookies(self) -> Mapping[str, str]: """Return request cookies. A read-only dictionary-like object. """ raw = self.headers.get(hdrs.COOKIE, "") parsed = SimpleCookie(raw) return MappingProxyType({key: val.value for key, val in parsed.items()}) @reify def http_range(self) -> slice: """The content of Range HTTP header. Return a slice instance. """ rng = self._headers.get(hdrs.RANGE) start, end = None, None if rng is not None: try: pattern = r"^bytes=(\d*)-(\d*)$" start, end = re.findall(pattern, rng)[0] except IndexError: # pattern was not found in header raise ValueError("range not in acceptable format") end = int(end) if end else None start = int(start) if start else None if start is None and end is not None: # end with no start is to return tail of content start = -end end = None if start is not None and end is not None: # end is inclusive in range header, exclusive for slice end += 1 if start >= end: raise ValueError("start cannot be after end") if start is end is None: # No valid range supplied raise ValueError("No start or end of range specified") return slice(start, end, 1) @reify def content(self) -> StreamReader: """Return raw payload stream.""" return self._payload @property def has_body(self) -> bool: """Return True if request's HTTP BODY can be read, False otherwise.""" warnings.warn( "Deprecated, use .can_read_body #2005", DeprecationWarning, stacklevel=2 ) return not self._payload.at_eof() @property def can_read_body(self) -> bool: """Return True if request's HTTP BODY can be read, False otherwise.""" return not self._payload.at_eof() @reify def body_exists(self) -> bool: """Return True if request has HTTP BODY, False otherwise.""" return type(self._payload) is not EmptyStreamReader async def release(self) -> None: """Release request. Eat unread part of HTTP BODY if present. """ while not self._payload.at_eof(): await self._payload.readany() async def read(self) -> bytes: """Read request body if present. Returns bytes object with full request content. """ if self._read_bytes is None: body = bytearray() while True: chunk = await self._payload.readany() body.extend(chunk) if self._client_max_size: body_size = len(body) if body_size >= self._client_max_size: raise HTTPRequestEntityTooLarge( max_size=self._client_max_size, actual_size=body_size ) if not chunk: break self._read_bytes = bytes(body) return self._read_bytes async def text(self) -> str: """Return BODY as text using encoding from .charset.""" bytes_body = await self.read() encoding = self.charset or "utf-8" return bytes_body.decode(encoding) async def json(self, *, loads: JSONDecoder = DEFAULT_JSON_DECODER) -> Any: """Return BODY as JSON.""" body = await self.text() return loads(body) async def multipart(self) -> MultipartReader: """Return async iterator to process BODY as multipart.""" return MultipartReader(self._headers, self._payload) async def post(self) -> "MultiDictProxy[Union[str, bytes, FileField]]": """Return POST parameters.""" if self._post is not None: return self._post if self._method not in self.POST_METHODS: self._post = MultiDictProxy(MultiDict()) return self._post content_type = self.content_type if content_type not in ( "", "application/x-www-form-urlencoded", "multipart/form-data", ): self._post = MultiDictProxy(MultiDict()) return self._post out: MultiDict[Union[str, bytes, FileField]] = MultiDict() if content_type == "multipart/form-data": multipart = await self.multipart() max_size = self._client_max_size field = await multipart.next() while field is not None: size = 0 field_ct = field.headers.get(hdrs.CONTENT_TYPE) if isinstance(field, BodyPartReader): assert field.name is not None # Note that according to RFC 7578, the Content-Type header # is optional, even for files, so we can't assume it's # present. # https://tools.ietf.org/html/rfc7578#section-4.4 if field.filename: # store file in temp file tmp = await self._loop.run_in_executor( None, tempfile.TemporaryFile ) chunk = await field.read_chunk(size=2**16) while chunk: chunk = field.decode(chunk) await self._loop.run_in_executor(None, tmp.write, chunk) size += len(chunk) if 0 < max_size < size: await self._loop.run_in_executor(None, tmp.close) raise HTTPRequestEntityTooLarge( max_size=max_size, actual_size=size ) chunk = await field.read_chunk(size=2**16) await self._loop.run_in_executor(None, tmp.seek, 0) if field_ct is None: field_ct = "application/octet-stream" ff = FileField( field.name, field.filename, cast(io.BufferedReader, tmp), field_ct, field.headers, ) out.add(field.name, ff) else: # deal with ordinary data value = await field.read(decode=True) if field_ct is None or field_ct.startswith("text/"): charset = field.get_charset(default="utf-8") out.add(field.name, value.decode(charset)) else: out.add(field.name, value) size += len(value) if 0 < max_size < size: raise HTTPRequestEntityTooLarge( max_size=max_size, actual_size=size ) else: raise ValueError( "To decode nested multipart you need " "to use custom reader", ) field = await multipart.next() else: data = await self.read() if data: charset = self.charset or "utf-8" out.extend( parse_qsl( data.rstrip().decode(charset), keep_blank_values=True, encoding=charset, ) ) self._post = MultiDictProxy(out) return self._post def get_extra_info(self, name: str, default: Any = None) -> Any: """Extra info from protocol transport""" protocol = self._protocol if protocol is None: return default transport = protocol.transport if transport is None: return default return transport.get_extra_info(name, default) def __repr__(self) -> str: ascii_encodable_path = self.path.encode("ascii", "backslashreplace").decode( "ascii" ) return "<{} {} {} >".format( self.__class__.__name__, self._method, ascii_encodable_path ) def __eq__(self, other: object) -> bool: return id(self) == id(other) def __bool__(self) -> bool: return True async def _prepare_hook(self, response: StreamResponse) -> None: return def _cancel(self, exc: BaseException) -> None: set_exception(self._payload, exc) class Request(BaseRequest): ATTRS = BaseRequest.ATTRS | frozenset(["_match_info"]) def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) # matchdict, route_name, handler # or information about traversal lookup # initialized after route resolving self._match_info: Optional[UrlMappingMatchInfo] = None if DEBUG: def __setattr__(self, name: str, val: Any) -> None: if name not in self.ATTRS: warnings.warn( "Setting custom {}.{} attribute " "is discouraged".format(self.__class__.__name__, name), DeprecationWarning, stacklevel=2, ) super().__setattr__(name, val) def clone( self, *, method: Union[str, _SENTINEL] = sentinel, rel_url: Union[StrOrURL, _SENTINEL] = sentinel, headers: Union[LooseHeaders, _SENTINEL] = sentinel, scheme: Union[str, _SENTINEL] = sentinel, host: Union[str, _SENTINEL] = sentinel, remote: Union[str, _SENTINEL] = sentinel, client_max_size: Union[int, _SENTINEL] = sentinel, ) -> "Request": ret = super().clone( method=method, rel_url=rel_url, headers=headers, scheme=scheme, host=host, remote=remote, client_max_size=client_max_size, ) new_ret = cast(Request, ret) new_ret._match_info = self._match_info return new_ret @reify def match_info(self) -> "UrlMappingMatchInfo": """Result of route resolving.""" match_info = self._match_info assert match_info is not None return match_info @property def app(self) -> "Application": """Application instance.""" match_info = self._match_info assert match_info is not None return match_info.current_app @property def config_dict(self) -> ChainMapProxy: match_info = self._match_info assert match_info is not None lst = match_info.apps app = self.app idx = lst.index(app) sublist = list(reversed(lst[: idx + 1])) return ChainMapProxy(sublist) async def _prepare_hook(self, response: StreamResponse) -> None: match_info = self._match_info if match_info is None: return for app in match_info._apps: await app.on_response_prepare.send(self, response) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/web_response.py0000644000175100001770000006632214607525266017350 0ustar00runnerdockerimport asyncio import collections.abc import datetime import enum import json import math import time import warnings from concurrent.futures import Executor from http import HTTPStatus from http.cookies import SimpleCookie from typing import ( TYPE_CHECKING, Any, Dict, Iterator, MutableMapping, Optional, Union, cast, ) from multidict import CIMultiDict, istr from . import hdrs, payload from .abc import AbstractStreamWriter from .compression_utils import ZLibCompressor from .helpers import ( ETAG_ANY, QUOTED_ETAG_RE, ETag, HeadersMixin, must_be_empty_body, parse_http_date, rfc822_formatted_time, sentinel, should_remove_content_length, validate_etag_value, ) from .http import SERVER_SOFTWARE, HttpVersion10, HttpVersion11 from .payload import Payload from .typedefs import JSONEncoder, LooseHeaders __all__ = ("ContentCoding", "StreamResponse", "Response", "json_response") if TYPE_CHECKING: from .web_request import BaseRequest BaseClass = MutableMapping[str, Any] else: BaseClass = collections.abc.MutableMapping class ContentCoding(enum.Enum): # The content codings that we have support for. # # Additional registered codings are listed at: # https://www.iana.org/assignments/http-parameters/http-parameters.xhtml#content-coding deflate = "deflate" gzip = "gzip" identity = "identity" ############################################################ # HTTP Response classes ############################################################ class StreamResponse(BaseClass, HeadersMixin): _length_check = True def __init__( self, *, status: int = 200, reason: Optional[str] = None, headers: Optional[LooseHeaders] = None, ) -> None: self._body = None self._keep_alive: Optional[bool] = None self._chunked = False self._compression = False self._compression_force: Optional[ContentCoding] = None self._cookies = SimpleCookie() self._req: Optional[BaseRequest] = None self._payload_writer: Optional[AbstractStreamWriter] = None self._eof_sent = False self._must_be_empty_body: Optional[bool] = None self._body_length = 0 self._state: Dict[str, Any] = {} if headers is not None: self._headers: CIMultiDict[str] = CIMultiDict(headers) else: self._headers = CIMultiDict() self.set_status(status, reason) @property def prepared(self) -> bool: return self._payload_writer is not None @property def task(self) -> "Optional[asyncio.Task[None]]": if self._req: return self._req.task else: return None @property def status(self) -> int: return self._status @property def chunked(self) -> bool: return self._chunked @property def compression(self) -> bool: return self._compression @property def reason(self) -> str: return self._reason def set_status( self, status: int, reason: Optional[str] = None, ) -> None: assert not self.prepared, ( "Cannot change the response status code after " "the headers have been sent" ) self._status = int(status) if reason is None: try: reason = HTTPStatus(self._status).phrase except ValueError: reason = "" self._reason = reason @property def keep_alive(self) -> Optional[bool]: return self._keep_alive def force_close(self) -> None: self._keep_alive = False @property def body_length(self) -> int: return self._body_length @property def output_length(self) -> int: warnings.warn("output_length is deprecated", DeprecationWarning) assert self._payload_writer return self._payload_writer.buffer_size def enable_chunked_encoding(self, chunk_size: Optional[int] = None) -> None: """Enables automatic chunked transfer encoding.""" self._chunked = True if hdrs.CONTENT_LENGTH in self._headers: raise RuntimeError( "You can't enable chunked encoding when " "a content length is set" ) if chunk_size is not None: warnings.warn("Chunk size is deprecated #1615", DeprecationWarning) def enable_compression( self, force: Optional[Union[bool, ContentCoding]] = None ) -> None: """Enables response compression encoding.""" # Backwards compatibility for when force was a bool <0.17. if type(force) == bool: force = ContentCoding.deflate if force else ContentCoding.identity warnings.warn( "Using boolean for force is deprecated #3318", DeprecationWarning ) elif force is not None: assert isinstance(force, ContentCoding), ( "force should one of " "None, bool or " "ContentEncoding" ) self._compression = True self._compression_force = force @property def headers(self) -> "CIMultiDict[str]": return self._headers @property def cookies(self) -> SimpleCookie: return self._cookies def set_cookie( self, name: str, value: str, *, expires: Optional[str] = None, domain: Optional[str] = None, max_age: Optional[Union[int, str]] = None, path: str = "/", secure: Optional[bool] = None, httponly: Optional[bool] = None, version: Optional[str] = None, samesite: Optional[str] = None, ) -> None: """Set or update response cookie. Sets new cookie or updates existent with new value. Also updates only those params which are not None. """ old = self._cookies.get(name) if old is not None and old.coded_value == "": # deleted cookie self._cookies.pop(name, None) self._cookies[name] = value c = self._cookies[name] if expires is not None: c["expires"] = expires elif c.get("expires") == "Thu, 01 Jan 1970 00:00:00 GMT": del c["expires"] if domain is not None: c["domain"] = domain if max_age is not None: c["max-age"] = str(max_age) elif "max-age" in c: del c["max-age"] c["path"] = path if secure is not None: c["secure"] = secure if httponly is not None: c["httponly"] = httponly if version is not None: c["version"] = version if samesite is not None: c["samesite"] = samesite def del_cookie( self, name: str, *, domain: Optional[str] = None, path: str = "/" ) -> None: """Delete cookie. Creates new empty expired cookie. """ # TODO: do we need domain/path here? self._cookies.pop(name, None) self.set_cookie( name, "", max_age=0, expires="Thu, 01 Jan 1970 00:00:00 GMT", domain=domain, path=path, ) @property def content_length(self) -> Optional[int]: # Just a placeholder for adding setter return super().content_length @content_length.setter def content_length(self, value: Optional[int]) -> None: if value is not None: value = int(value) if self._chunked: raise RuntimeError( "You can't set content length when " "chunked encoding is enable" ) self._headers[hdrs.CONTENT_LENGTH] = str(value) else: self._headers.pop(hdrs.CONTENT_LENGTH, None) @property def content_type(self) -> str: # Just a placeholder for adding setter return super().content_type @content_type.setter def content_type(self, value: str) -> None: self.content_type # read header values if needed self._content_type = str(value) self._generate_content_type_header() @property def charset(self) -> Optional[str]: # Just a placeholder for adding setter return super().charset @charset.setter def charset(self, value: Optional[str]) -> None: ctype = self.content_type # read header values if needed if ctype == "application/octet-stream": raise RuntimeError( "Setting charset for application/octet-stream " "doesn't make sense, setup content_type first" ) assert self._content_dict is not None if value is None: self._content_dict.pop("charset", None) else: self._content_dict["charset"] = str(value).lower() self._generate_content_type_header() @property def last_modified(self) -> Optional[datetime.datetime]: """The value of Last-Modified HTTP header, or None. This header is represented as a `datetime` object. """ return parse_http_date(self._headers.get(hdrs.LAST_MODIFIED)) @last_modified.setter def last_modified( self, value: Optional[Union[int, float, datetime.datetime, str]] ) -> None: if value is None: self._headers.pop(hdrs.LAST_MODIFIED, None) elif isinstance(value, (int, float)): self._headers[hdrs.LAST_MODIFIED] = time.strftime( "%a, %d %b %Y %H:%M:%S GMT", time.gmtime(math.ceil(value)) ) elif isinstance(value, datetime.datetime): self._headers[hdrs.LAST_MODIFIED] = time.strftime( "%a, %d %b %Y %H:%M:%S GMT", value.utctimetuple() ) elif isinstance(value, str): self._headers[hdrs.LAST_MODIFIED] = value @property def etag(self) -> Optional[ETag]: quoted_value = self._headers.get(hdrs.ETAG) if not quoted_value: return None elif quoted_value == ETAG_ANY: return ETag(value=ETAG_ANY) match = QUOTED_ETAG_RE.fullmatch(quoted_value) if not match: return None is_weak, value = match.group(1, 2) return ETag( is_weak=bool(is_weak), value=value, ) @etag.setter def etag(self, value: Optional[Union[ETag, str]]) -> None: if value is None: self._headers.pop(hdrs.ETAG, None) elif (isinstance(value, str) and value == ETAG_ANY) or ( isinstance(value, ETag) and value.value == ETAG_ANY ): self._headers[hdrs.ETAG] = ETAG_ANY elif isinstance(value, str): validate_etag_value(value) self._headers[hdrs.ETAG] = f'"{value}"' elif isinstance(value, ETag) and isinstance(value.value, str): validate_etag_value(value.value) hdr_value = f'W/"{value.value}"' if value.is_weak else f'"{value.value}"' self._headers[hdrs.ETAG] = hdr_value else: raise ValueError( f"Unsupported etag type: {type(value)}. " f"etag must be str, ETag or None" ) def _generate_content_type_header( self, CONTENT_TYPE: istr = hdrs.CONTENT_TYPE ) -> None: assert self._content_dict is not None assert self._content_type is not None params = "; ".join(f"{k}={v}" for k, v in self._content_dict.items()) if params: ctype = self._content_type + "; " + params else: ctype = self._content_type self._headers[CONTENT_TYPE] = ctype async def _do_start_compression(self, coding: ContentCoding) -> None: if coding != ContentCoding.identity: assert self._payload_writer is not None self._headers[hdrs.CONTENT_ENCODING] = coding.value self._payload_writer.enable_compression(coding.value) # Compressed payload may have different content length, # remove the header self._headers.popall(hdrs.CONTENT_LENGTH, None) async def _start_compression(self, request: "BaseRequest") -> None: if self._compression_force: await self._do_start_compression(self._compression_force) else: # Encoding comparisons should be case-insensitive # https://www.rfc-editor.org/rfc/rfc9110#section-8.4.1 accept_encoding = request.headers.get(hdrs.ACCEPT_ENCODING, "").lower() for coding in ContentCoding: if coding.value in accept_encoding: await self._do_start_compression(coding) return async def prepare(self, request: "BaseRequest") -> Optional[AbstractStreamWriter]: if self._eof_sent: return None if self._payload_writer is not None: return self._payload_writer self._must_be_empty_body = must_be_empty_body(request.method, self.status) return await self._start(request) async def _start(self, request: "BaseRequest") -> AbstractStreamWriter: self._req = request writer = self._payload_writer = request._payload_writer await self._prepare_headers() await request._prepare_hook(self) await self._write_headers() return writer async def _prepare_headers(self) -> None: request = self._req assert request is not None writer = self._payload_writer assert writer is not None keep_alive = self._keep_alive if keep_alive is None: keep_alive = request.keep_alive self._keep_alive = keep_alive version = request.version headers = self._headers for cookie in self._cookies.values(): value = cookie.output(header="")[1:] headers.add(hdrs.SET_COOKIE, value) if self._compression: await self._start_compression(request) if self._chunked: if version != HttpVersion11: raise RuntimeError( "Using chunked encoding is forbidden " "for HTTP/{0.major}.{0.minor}".format(request.version) ) if not self._must_be_empty_body: writer.enable_chunking() headers[hdrs.TRANSFER_ENCODING] = "chunked" if hdrs.CONTENT_LENGTH in headers: del headers[hdrs.CONTENT_LENGTH] elif self._length_check: writer.length = self.content_length if writer.length is None: if version >= HttpVersion11: if not self._must_be_empty_body: writer.enable_chunking() headers[hdrs.TRANSFER_ENCODING] = "chunked" elif not self._must_be_empty_body: keep_alive = False # HTTP 1.1: https://tools.ietf.org/html/rfc7230#section-3.3.2 # HTTP 1.0: https://tools.ietf.org/html/rfc1945#section-10.4 if self._must_be_empty_body: if hdrs.CONTENT_LENGTH in headers and should_remove_content_length( request.method, self.status ): del headers[hdrs.CONTENT_LENGTH] # https://datatracker.ietf.org/doc/html/rfc9112#section-6.1-10 # https://datatracker.ietf.org/doc/html/rfc9112#section-6.1-13 if hdrs.TRANSFER_ENCODING in headers: del headers[hdrs.TRANSFER_ENCODING] else: headers.setdefault(hdrs.CONTENT_TYPE, "application/octet-stream") headers.setdefault(hdrs.DATE, rfc822_formatted_time()) headers.setdefault(hdrs.SERVER, SERVER_SOFTWARE) # connection header if hdrs.CONNECTION not in headers: if keep_alive: if version == HttpVersion10: headers[hdrs.CONNECTION] = "keep-alive" else: if version == HttpVersion11: headers[hdrs.CONNECTION] = "close" async def _write_headers(self) -> None: request = self._req assert request is not None writer = self._payload_writer assert writer is not None # status line version = request.version status_line = "HTTP/{}.{} {} {}".format( version[0], version[1], self._status, self._reason ) await writer.write_headers(status_line, self._headers) async def write(self, data: bytes) -> None: assert isinstance( data, (bytes, bytearray, memoryview) ), "data argument must be byte-ish (%r)" % type(data) if self._eof_sent: raise RuntimeError("Cannot call write() after write_eof()") if self._payload_writer is None: raise RuntimeError("Cannot call write() before prepare()") await self._payload_writer.write(data) async def drain(self) -> None: assert not self._eof_sent, "EOF has already been sent" assert self._payload_writer is not None, "Response has not been started" warnings.warn( "drain method is deprecated, use await resp.write()", DeprecationWarning, stacklevel=2, ) await self._payload_writer.drain() async def write_eof(self, data: bytes = b"") -> None: assert isinstance( data, (bytes, bytearray, memoryview) ), "data argument must be byte-ish (%r)" % type(data) if self._eof_sent: return assert self._payload_writer is not None, "Response has not been started" await self._payload_writer.write_eof(data) self._eof_sent = True self._req = None self._body_length = self._payload_writer.output_size self._payload_writer = None def __repr__(self) -> str: if self._eof_sent: info = "eof" elif self.prepared: assert self._req is not None info = f"{self._req.method} {self._req.path} " else: info = "not prepared" return f"<{self.__class__.__name__} {self.reason} {info}>" def __getitem__(self, key: str) -> Any: return self._state[key] def __setitem__(self, key: str, value: Any) -> None: self._state[key] = value def __delitem__(self, key: str) -> None: del self._state[key] def __len__(self) -> int: return len(self._state) def __iter__(self) -> Iterator[str]: return iter(self._state) def __hash__(self) -> int: return hash(id(self)) def __eq__(self, other: object) -> bool: return self is other class Response(StreamResponse): def __init__( self, *, body: Any = None, status: int = 200, reason: Optional[str] = None, text: Optional[str] = None, headers: Optional[LooseHeaders] = None, content_type: Optional[str] = None, charset: Optional[str] = None, zlib_executor_size: Optional[int] = None, zlib_executor: Optional[Executor] = None, ) -> None: if body is not None and text is not None: raise ValueError("body and text are not allowed together") if headers is None: real_headers: CIMultiDict[str] = CIMultiDict() elif not isinstance(headers, CIMultiDict): real_headers = CIMultiDict(headers) else: real_headers = headers # = cast('CIMultiDict[str]', headers) if content_type is not None and "charset" in content_type: raise ValueError("charset must not be in content_type " "argument") if text is not None: if hdrs.CONTENT_TYPE in real_headers: if content_type or charset: raise ValueError( "passing both Content-Type header and " "content_type or charset params " "is forbidden" ) else: # fast path for filling headers if not isinstance(text, str): raise TypeError("text argument must be str (%r)" % type(text)) if content_type is None: content_type = "text/plain" if charset is None: charset = "utf-8" real_headers[hdrs.CONTENT_TYPE] = content_type + "; charset=" + charset body = text.encode(charset) text = None else: if hdrs.CONTENT_TYPE in real_headers: if content_type is not None or charset is not None: raise ValueError( "passing both Content-Type header and " "content_type or charset params " "is forbidden" ) else: if content_type is not None: if charset is not None: content_type += "; charset=" + charset real_headers[hdrs.CONTENT_TYPE] = content_type super().__init__(status=status, reason=reason, headers=real_headers) if text is not None: self.text = text else: self.body = body self._compressed_body: Optional[bytes] = None self._zlib_executor_size = zlib_executor_size self._zlib_executor = zlib_executor @property def body(self) -> Optional[Union[bytes, Payload]]: return self._body @body.setter def body(self, body: bytes) -> None: if body is None: self._body: Optional[bytes] = None self._body_payload: bool = False elif isinstance(body, (bytes, bytearray)): self._body = body self._body_payload = False else: try: self._body = body = payload.PAYLOAD_REGISTRY.get(body) except payload.LookupError: raise ValueError("Unsupported body type %r" % type(body)) self._body_payload = True headers = self._headers # set content-type if hdrs.CONTENT_TYPE not in headers: headers[hdrs.CONTENT_TYPE] = body.content_type # copy payload headers if body.headers: for (key, value) in body.headers.items(): if key not in headers: headers[key] = value self._compressed_body = None @property def text(self) -> Optional[str]: if self._body is None: return None return self._body.decode(self.charset or "utf-8") @text.setter def text(self, text: str) -> None: assert text is None or isinstance( text, str ), "text argument must be str (%r)" % type(text) if self.content_type == "application/octet-stream": self.content_type = "text/plain" if self.charset is None: self.charset = "utf-8" self._body = text.encode(self.charset) self._body_payload = False self._compressed_body = None @property def content_length(self) -> Optional[int]: if self._chunked: return None if hdrs.CONTENT_LENGTH in self._headers: return super().content_length if self._compressed_body is not None: # Return length of the compressed body return len(self._compressed_body) elif self._body_payload: # A payload without content length, or a compressed payload return None elif self._body is not None: return len(self._body) else: return 0 @content_length.setter def content_length(self, value: Optional[int]) -> None: raise RuntimeError("Content length is set automatically") async def write_eof(self, data: bytes = b"") -> None: if self._eof_sent: return if self._compressed_body is None: body: Optional[Union[bytes, Payload]] = self._body else: body = self._compressed_body assert not data, f"data arg is not supported, got {data!r}" assert self._req is not None assert self._payload_writer is not None if body is not None: if self._must_be_empty_body: await super().write_eof() elif self._body_payload: payload = cast(Payload, body) await payload.write(self._payload_writer) await super().write_eof() else: await super().write_eof(cast(bytes, body)) else: await super().write_eof() async def _start(self, request: "BaseRequest") -> AbstractStreamWriter: if should_remove_content_length(request.method, self.status): if hdrs.CONTENT_LENGTH in self._headers: del self._headers[hdrs.CONTENT_LENGTH] elif not self._chunked and hdrs.CONTENT_LENGTH not in self._headers: if self._body_payload: size = cast(Payload, self._body).size if size is not None: self._headers[hdrs.CONTENT_LENGTH] = str(size) else: body_len = len(self._body) if self._body else "0" # https://www.rfc-editor.org/rfc/rfc9110.html#section-8.6-7 if body_len != "0" or ( self.status != 304 and request.method.upper() != hdrs.METH_HEAD ): self._headers[hdrs.CONTENT_LENGTH] = str(body_len) return await super()._start(request) async def _do_start_compression(self, coding: ContentCoding) -> None: if self._body_payload or self._chunked: return await super()._do_start_compression(coding) if coding != ContentCoding.identity: # Instead of using _payload_writer.enable_compression, # compress the whole body compressor = ZLibCompressor( encoding=str(coding.value), max_sync_chunk_size=self._zlib_executor_size, executor=self._zlib_executor, ) assert self._body is not None if self._zlib_executor_size is None and len(self._body) > 1024 * 1024: warnings.warn( "Synchronous compression of large response bodies " f"({len(self._body)} bytes) might block the async event loop. " "Consider providing a custom value to zlib_executor_size/" "zlib_executor response properties or disabling compression on it." ) self._compressed_body = ( await compressor.compress(self._body) + compressor.flush() ) assert self._compressed_body is not None self._headers[hdrs.CONTENT_ENCODING] = coding.value self._headers[hdrs.CONTENT_LENGTH] = str(len(self._compressed_body)) def json_response( data: Any = sentinel, *, text: Optional[str] = None, body: Optional[bytes] = None, status: int = 200, reason: Optional[str] = None, headers: Optional[LooseHeaders] = None, content_type: str = "application/json", dumps: JSONEncoder = json.dumps, ) -> Response: if data is not sentinel: if text or body: raise ValueError("only one of data, text, or body should be specified") else: text = dumps(data) return Response( text=text, body=body, status=status, reason=reason, headers=headers, content_type=content_type, ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/web_routedef.py0000644000175100001770000001376414607525266017331 0ustar00runnerdockerimport abc import os # noqa from typing import ( TYPE_CHECKING, Any, Callable, Dict, Iterator, List, Optional, Sequence, Type, Union, overload, ) import attr from . import hdrs from .abc import AbstractView from .typedefs import Handler, PathLike if TYPE_CHECKING: from .web_request import Request from .web_response import StreamResponse from .web_urldispatcher import AbstractRoute, UrlDispatcher else: Request = StreamResponse = UrlDispatcher = AbstractRoute = None __all__ = ( "AbstractRouteDef", "RouteDef", "StaticDef", "RouteTableDef", "head", "options", "get", "post", "patch", "put", "delete", "route", "view", "static", ) class AbstractRouteDef(abc.ABC): @abc.abstractmethod def register(self, router: UrlDispatcher) -> List[AbstractRoute]: pass # pragma: no cover _HandlerType = Union[Type[AbstractView], Handler] @attr.s(auto_attribs=True, frozen=True, repr=False, slots=True) class RouteDef(AbstractRouteDef): method: str path: str handler: _HandlerType kwargs: Dict[str, Any] def __repr__(self) -> str: info = [] for name, value in sorted(self.kwargs.items()): info.append(f", {name}={value!r}") return " {handler.__name__!r}" "{info}>".format( method=self.method, path=self.path, handler=self.handler, info="".join(info) ) def register(self, router: UrlDispatcher) -> List[AbstractRoute]: if self.method in hdrs.METH_ALL: reg = getattr(router, "add_" + self.method.lower()) return [reg(self.path, self.handler, **self.kwargs)] else: return [ router.add_route(self.method, self.path, self.handler, **self.kwargs) ] @attr.s(auto_attribs=True, frozen=True, repr=False, slots=True) class StaticDef(AbstractRouteDef): prefix: str path: PathLike kwargs: Dict[str, Any] def __repr__(self) -> str: info = [] for name, value in sorted(self.kwargs.items()): info.append(f", {name}={value!r}") return " {path}" "{info}>".format( prefix=self.prefix, path=self.path, info="".join(info) ) def register(self, router: UrlDispatcher) -> List[AbstractRoute]: resource = router.add_static(self.prefix, self.path, **self.kwargs) routes = resource.get_info().get("routes", {}) return list(routes.values()) def route(method: str, path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return RouteDef(method, path, handler, kwargs) def head(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_HEAD, path, handler, **kwargs) def options(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_OPTIONS, path, handler, **kwargs) def get( path: str, handler: _HandlerType, *, name: Optional[str] = None, allow_head: bool = True, **kwargs: Any, ) -> RouteDef: return route( hdrs.METH_GET, path, handler, name=name, allow_head=allow_head, **kwargs ) def post(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_POST, path, handler, **kwargs) def put(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_PUT, path, handler, **kwargs) def patch(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_PATCH, path, handler, **kwargs) def delete(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_DELETE, path, handler, **kwargs) def view(path: str, handler: Type[AbstractView], **kwargs: Any) -> RouteDef: return route(hdrs.METH_ANY, path, handler, **kwargs) def static(prefix: str, path: PathLike, **kwargs: Any) -> StaticDef: return StaticDef(prefix, path, kwargs) _Deco = Callable[[_HandlerType], _HandlerType] class RouteTableDef(Sequence[AbstractRouteDef]): """Route definition table""" def __init__(self) -> None: self._items: List[AbstractRouteDef] = [] def __repr__(self) -> str: return f"" @overload def __getitem__(self, index: int) -> AbstractRouteDef: ... @overload def __getitem__(self, index: slice) -> List[AbstractRouteDef]: ... def __getitem__(self, index): # type: ignore[no-untyped-def] return self._items[index] def __iter__(self) -> Iterator[AbstractRouteDef]: return iter(self._items) def __len__(self) -> int: return len(self._items) def __contains__(self, item: object) -> bool: return item in self._items def route(self, method: str, path: str, **kwargs: Any) -> _Deco: def inner(handler: _HandlerType) -> _HandlerType: self._items.append(RouteDef(method, path, handler, kwargs)) return handler return inner def head(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_HEAD, path, **kwargs) def get(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_GET, path, **kwargs) def post(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_POST, path, **kwargs) def put(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_PUT, path, **kwargs) def patch(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_PATCH, path, **kwargs) def delete(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_DELETE, path, **kwargs) def options(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_OPTIONS, path, **kwargs) def view(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_ANY, path, **kwargs) def static(self, prefix: str, path: PathLike, **kwargs: Any) -> None: self._items.append(StaticDef(prefix, path, kwargs)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/web_runner.py0000644000175100001770000002725714607525266017027 0ustar00runnerdockerimport asyncio import signal import socket import warnings from abc import ABC, abstractmethod from typing import Any, Awaitable, Callable, List, Optional, Set from yarl import URL from .typedefs import PathLike from .web_app import Application from .web_server import Server try: from ssl import SSLContext except ImportError: SSLContext = object # type: ignore[misc,assignment] __all__ = ( "BaseSite", "TCPSite", "UnixSite", "NamedPipeSite", "SockSite", "BaseRunner", "AppRunner", "ServerRunner", "GracefulExit", ) class GracefulExit(SystemExit): code = 1 def _raise_graceful_exit() -> None: raise GracefulExit() class BaseSite(ABC): __slots__ = ("_runner", "_ssl_context", "_backlog", "_server") def __init__( self, runner: "BaseRunner", *, shutdown_timeout: float = 60.0, ssl_context: Optional[SSLContext] = None, backlog: int = 128, ) -> None: if runner.server is None: raise RuntimeError("Call runner.setup() before making a site") if shutdown_timeout != 60.0: msg = "shutdown_timeout should be set on BaseRunner" warnings.warn(msg, DeprecationWarning, stacklevel=2) runner._shutdown_timeout = shutdown_timeout self._runner = runner self._ssl_context = ssl_context self._backlog = backlog self._server: Optional[asyncio.AbstractServer] = None @property @abstractmethod def name(self) -> str: pass # pragma: no cover @abstractmethod async def start(self) -> None: self._runner._reg_site(self) async def stop(self) -> None: self._runner._check_site(self) if self._server is not None: # Maybe not started yet self._server.close() self._runner._unreg_site(self) class TCPSite(BaseSite): __slots__ = ("_host", "_port", "_reuse_address", "_reuse_port") def __init__( self, runner: "BaseRunner", host: Optional[str] = None, port: Optional[int] = None, *, shutdown_timeout: float = 60.0, ssl_context: Optional[SSLContext] = None, backlog: int = 128, reuse_address: Optional[bool] = None, reuse_port: Optional[bool] = None, ) -> None: super().__init__( runner, shutdown_timeout=shutdown_timeout, ssl_context=ssl_context, backlog=backlog, ) self._host = host if port is None: port = 8443 if self._ssl_context else 8080 self._port = port self._reuse_address = reuse_address self._reuse_port = reuse_port @property def name(self) -> str: scheme = "https" if self._ssl_context else "http" host = "0.0.0.0" if self._host is None else self._host return str(URL.build(scheme=scheme, host=host, port=self._port)) async def start(self) -> None: await super().start() loop = asyncio.get_event_loop() server = self._runner.server assert server is not None self._server = await loop.create_server( server, self._host, self._port, ssl=self._ssl_context, backlog=self._backlog, reuse_address=self._reuse_address, reuse_port=self._reuse_port, ) class UnixSite(BaseSite): __slots__ = ("_path",) def __init__( self, runner: "BaseRunner", path: PathLike, *, shutdown_timeout: float = 60.0, ssl_context: Optional[SSLContext] = None, backlog: int = 128, ) -> None: super().__init__( runner, shutdown_timeout=shutdown_timeout, ssl_context=ssl_context, backlog=backlog, ) self._path = path @property def name(self) -> str: scheme = "https" if self._ssl_context else "http" return f"{scheme}://unix:{self._path}:" async def start(self) -> None: await super().start() loop = asyncio.get_event_loop() server = self._runner.server assert server is not None self._server = await loop.create_unix_server( server, self._path, ssl=self._ssl_context, backlog=self._backlog, ) class NamedPipeSite(BaseSite): __slots__ = ("_path",) def __init__( self, runner: "BaseRunner", path: str, *, shutdown_timeout: float = 60.0 ) -> None: loop = asyncio.get_event_loop() if not isinstance( loop, asyncio.ProactorEventLoop # type: ignore[attr-defined] ): raise RuntimeError( "Named Pipes only available in proactor" "loop under windows" ) super().__init__(runner, shutdown_timeout=shutdown_timeout) self._path = path @property def name(self) -> str: return self._path async def start(self) -> None: await super().start() loop = asyncio.get_event_loop() server = self._runner.server assert server is not None _server = await loop.start_serving_pipe( # type: ignore[attr-defined] server, self._path ) self._server = _server[0] class SockSite(BaseSite): __slots__ = ("_sock", "_name") def __init__( self, runner: "BaseRunner", sock: socket.socket, *, shutdown_timeout: float = 60.0, ssl_context: Optional[SSLContext] = None, backlog: int = 128, ) -> None: super().__init__( runner, shutdown_timeout=shutdown_timeout, ssl_context=ssl_context, backlog=backlog, ) self._sock = sock scheme = "https" if self._ssl_context else "http" if hasattr(socket, "AF_UNIX") and sock.family == socket.AF_UNIX: name = f"{scheme}://unix:{sock.getsockname()}:" else: host, port = sock.getsockname()[:2] name = str(URL.build(scheme=scheme, host=host, port=port)) self._name = name @property def name(self) -> str: return self._name async def start(self) -> None: await super().start() loop = asyncio.get_event_loop() server = self._runner.server assert server is not None self._server = await loop.create_server( server, sock=self._sock, ssl=self._ssl_context, backlog=self._backlog ) class BaseRunner(ABC): __slots__ = ( "shutdown_callback", "_handle_signals", "_kwargs", "_server", "_sites", "_shutdown_timeout", ) def __init__( self, *, handle_signals: bool = False, shutdown_timeout: float = 60.0, **kwargs: Any, ) -> None: self.shutdown_callback: Optional[Callable[[], Awaitable[None]]] = None self._handle_signals = handle_signals self._kwargs = kwargs self._server: Optional[Server] = None self._sites: List[BaseSite] = [] self._shutdown_timeout = shutdown_timeout @property def server(self) -> Optional[Server]: return self._server @property def addresses(self) -> List[Any]: ret: List[Any] = [] for site in self._sites: server = site._server if server is not None: sockets = server.sockets # type: ignore[attr-defined] if sockets is not None: for sock in sockets: ret.append(sock.getsockname()) return ret @property def sites(self) -> Set[BaseSite]: return set(self._sites) async def setup(self) -> None: loop = asyncio.get_event_loop() if self._handle_signals: try: loop.add_signal_handler(signal.SIGINT, _raise_graceful_exit) loop.add_signal_handler(signal.SIGTERM, _raise_graceful_exit) except NotImplementedError: # pragma: no cover # add_signal_handler is not implemented on Windows pass self._server = await self._make_server() @abstractmethod async def shutdown(self) -> None: """Call any shutdown hooks to help server close gracefully.""" async def cleanup(self) -> None: # The loop over sites is intentional, an exception on gather() # leaves self._sites in unpredictable state. # The loop guaranties that a site is either deleted on success or # still present on failure for site in list(self._sites): await site.stop() if self._server: # If setup succeeded # Yield to event loop to ensure incoming requests prior to stopping the sites # have all started to be handled before we proceed to close idle connections. await asyncio.sleep(0) self._server.pre_shutdown() await self.shutdown() if self.shutdown_callback: await self.shutdown_callback() await self._server.shutdown(self._shutdown_timeout) await self._cleanup_server() self._server = None if self._handle_signals: loop = asyncio.get_running_loop() try: loop.remove_signal_handler(signal.SIGINT) loop.remove_signal_handler(signal.SIGTERM) except NotImplementedError: # pragma: no cover # remove_signal_handler is not implemented on Windows pass @abstractmethod async def _make_server(self) -> Server: pass # pragma: no cover @abstractmethod async def _cleanup_server(self) -> None: pass # pragma: no cover def _reg_site(self, site: BaseSite) -> None: if site in self._sites: raise RuntimeError(f"Site {site} is already registered in runner {self}") self._sites.append(site) def _check_site(self, site: BaseSite) -> None: if site not in self._sites: raise RuntimeError(f"Site {site} is not registered in runner {self}") def _unreg_site(self, site: BaseSite) -> None: if site not in self._sites: raise RuntimeError(f"Site {site} is not registered in runner {self}") self._sites.remove(site) class ServerRunner(BaseRunner): """Low-level web server runner""" __slots__ = ("_web_server",) def __init__( self, web_server: Server, *, handle_signals: bool = False, **kwargs: Any ) -> None: super().__init__(handle_signals=handle_signals, **kwargs) self._web_server = web_server async def shutdown(self) -> None: pass async def _make_server(self) -> Server: return self._web_server async def _cleanup_server(self) -> None: pass class AppRunner(BaseRunner): """Web Application runner""" __slots__ = ("_app",) def __init__( self, app: Application, *, handle_signals: bool = False, **kwargs: Any ) -> None: super().__init__(handle_signals=handle_signals, **kwargs) if not isinstance(app, Application): raise TypeError( "The first argument should be web.Application " "instance, got {!r}".format(app) ) self._app = app @property def app(self) -> Application: return self._app async def shutdown(self) -> None: await self._app.shutdown() async def _make_server(self) -> Server: loop = asyncio.get_event_loop() self._app._set_loop(loop) self._app.on_startup.freeze() await self._app.startup() self._app.freeze() return self._app._make_handler(loop=loop, **self._kwargs) async def _cleanup_server(self) -> None: await self._app.cleanup() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/web_server.py0000644000175100001770000000503314607525266017010 0ustar00runnerdocker"""Low level HTTP server.""" import asyncio from typing import Any, Awaitable, Callable, Dict, List, Optional # noqa from .abc import AbstractStreamWriter from .helpers import get_running_loop from .http_parser import RawRequestMessage from .streams import StreamReader from .web_protocol import RequestHandler, _RequestFactory, _RequestHandler from .web_request import BaseRequest __all__ = ("Server",) class Server: def __init__( self, handler: _RequestHandler, *, request_factory: Optional[_RequestFactory] = None, handler_cancellation: bool = False, loop: Optional[asyncio.AbstractEventLoop] = None, **kwargs: Any ) -> None: self._loop = get_running_loop(loop) self._connections: Dict[RequestHandler, asyncio.Transport] = {} self._kwargs = kwargs self.requests_count = 0 self.request_handler = handler self.request_factory = request_factory or self._make_request self.handler_cancellation = handler_cancellation @property def connections(self) -> List[RequestHandler]: return list(self._connections.keys()) def connection_made( self, handler: RequestHandler, transport: asyncio.Transport ) -> None: self._connections[handler] = transport def connection_lost( self, handler: RequestHandler, exc: Optional[BaseException] = None ) -> None: if handler in self._connections: del self._connections[handler] def _make_request( self, message: RawRequestMessage, payload: StreamReader, protocol: RequestHandler, writer: AbstractStreamWriter, task: "asyncio.Task[None]", ) -> BaseRequest: return BaseRequest(message, payload, protocol, writer, task, self._loop) def pre_shutdown(self) -> None: for conn in self._connections: conn.close() async def shutdown(self, timeout: Optional[float] = None) -> None: coros = (conn.shutdown(timeout) for conn in self._connections) await asyncio.gather(*coros) self._connections.clear() def __call__(self) -> RequestHandler: try: return RequestHandler(self, loop=self._loop, **self._kwargs) except TypeError: # Failsafe creation: remove all custom handler_args kwargs = { k: v for k, v in self._kwargs.items() if k in ["debug", "access_log_class"] } return RequestHandler(self, loop=self._loop, **kwargs) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/web_urldispatcher.py0000644000175100001770000011630414607525266020357 0ustar00runnerdockerimport abc import asyncio import base64 import functools import hashlib import html import inspect import keyword import os import re import warnings from contextlib import contextmanager from functools import wraps from pathlib import Path from types import MappingProxyType from typing import ( TYPE_CHECKING, Any, Awaitable, Callable, Container, Dict, Final, Generator, Iterable, Iterator, List, Mapping, NoReturn, Optional, Pattern, Set, Sized, Tuple, Type, TypedDict, Union, cast, ) from yarl import URL, __version__ as yarl_version # type: ignore[attr-defined] from . import hdrs from .abc import AbstractMatchInfo, AbstractRouter, AbstractView from .helpers import DEBUG from .http import HttpVersion11 from .typedefs import Handler, PathLike from .web_exceptions import ( HTTPException, HTTPExpectationFailed, HTTPForbidden, HTTPMethodNotAllowed, HTTPNotFound, ) from .web_fileresponse import FileResponse from .web_request import Request from .web_response import Response, StreamResponse from .web_routedef import AbstractRouteDef __all__ = ( "UrlDispatcher", "UrlMappingMatchInfo", "AbstractResource", "Resource", "PlainResource", "DynamicResource", "AbstractRoute", "ResourceRoute", "StaticResource", "View", ) if TYPE_CHECKING: from .web_app import Application BaseDict = Dict[str, str] else: BaseDict = dict YARL_VERSION: Final[Tuple[int, ...]] = tuple(map(int, yarl_version.split(".")[:2])) HTTP_METHOD_RE: Final[Pattern[str]] = re.compile( r"^[0-9A-Za-z!#\$%&'\*\+\-\.\^_`\|~]+$" ) ROUTE_RE: Final[Pattern[str]] = re.compile( r"(\{[_a-zA-Z][^{}]*(?:\{[^{}]*\}[^{}]*)*\})" ) PATH_SEP: Final[str] = re.escape("/") _ExpectHandler = Callable[[Request], Awaitable[Optional[StreamResponse]]] _Resolve = Tuple[Optional["UrlMappingMatchInfo"], Set[str]] html_escape = functools.partial(html.escape, quote=True) class _InfoDict(TypedDict, total=False): path: str formatter: str pattern: Pattern[str] directory: Path prefix: str routes: Mapping[str, "AbstractRoute"] app: "Application" domain: str rule: "AbstractRuleMatching" http_exception: HTTPException class AbstractResource(Sized, Iterable["AbstractRoute"]): def __init__(self, *, name: Optional[str] = None) -> None: self._name = name @property def name(self) -> Optional[str]: return self._name @property @abc.abstractmethod def canonical(self) -> str: """Exposes the resource's canonical path. For example '/foo/bar/{name}' """ @abc.abstractmethod # pragma: no branch def url_for(self, **kwargs: str) -> URL: """Construct url for resource with additional params.""" @abc.abstractmethod # pragma: no branch async def resolve(self, request: Request) -> _Resolve: """Resolve resource. Return (UrlMappingMatchInfo, allowed_methods) pair. """ @abc.abstractmethod def add_prefix(self, prefix: str) -> None: """Add a prefix to processed URLs. Required for subapplications support. """ @abc.abstractmethod def get_info(self) -> _InfoDict: """Return a dict with additional info useful for introspection""" def freeze(self) -> None: pass @abc.abstractmethod def raw_match(self, path: str) -> bool: """Perform a raw match against path""" class AbstractRoute(abc.ABC): def __init__( self, method: str, handler: Union[Handler, Type[AbstractView]], *, expect_handler: Optional[_ExpectHandler] = None, resource: Optional[AbstractResource] = None, ) -> None: if expect_handler is None: expect_handler = _default_expect_handler assert asyncio.iscoroutinefunction( expect_handler ), f"Coroutine is expected, got {expect_handler!r}" method = method.upper() if not HTTP_METHOD_RE.match(method): raise ValueError(f"{method} is not allowed HTTP method") assert callable(handler), handler if asyncio.iscoroutinefunction(handler): pass elif inspect.isgeneratorfunction(handler): warnings.warn( "Bare generators are deprecated, " "use @coroutine wrapper", DeprecationWarning, ) elif isinstance(handler, type) and issubclass(handler, AbstractView): pass else: warnings.warn( "Bare functions are deprecated, " "use async ones", DeprecationWarning ) @wraps(handler) async def handler_wrapper(request: Request) -> StreamResponse: result = old_handler(request) if asyncio.iscoroutine(result): result = await result assert isinstance(result, StreamResponse) return result old_handler = handler handler = handler_wrapper self._method = method self._handler = handler self._expect_handler = expect_handler self._resource = resource @property def method(self) -> str: return self._method @property def handler(self) -> Handler: return self._handler @property @abc.abstractmethod def name(self) -> Optional[str]: """Optional route's name, always equals to resource's name.""" @property def resource(self) -> Optional[AbstractResource]: return self._resource @abc.abstractmethod def get_info(self) -> _InfoDict: """Return a dict with additional info useful for introspection""" @abc.abstractmethod # pragma: no branch def url_for(self, *args: str, **kwargs: str) -> URL: """Construct url for route with additional params.""" async def handle_expect_header(self, request: Request) -> Optional[StreamResponse]: return await self._expect_handler(request) class UrlMappingMatchInfo(BaseDict, AbstractMatchInfo): def __init__(self, match_dict: Dict[str, str], route: AbstractRoute): super().__init__(match_dict) self._route = route self._apps: List[Application] = [] self._current_app: Optional[Application] = None self._frozen = False @property def handler(self) -> Handler: return self._route.handler @property def route(self) -> AbstractRoute: return self._route @property def expect_handler(self) -> _ExpectHandler: return self._route.handle_expect_header @property def http_exception(self) -> Optional[HTTPException]: return None def get_info(self) -> _InfoDict: # type: ignore[override] return self._route.get_info() @property def apps(self) -> Tuple["Application", ...]: return tuple(self._apps) def add_app(self, app: "Application") -> None: if self._frozen: raise RuntimeError("Cannot change apps stack after .freeze() call") if self._current_app is None: self._current_app = app self._apps.insert(0, app) @property def current_app(self) -> "Application": app = self._current_app assert app is not None return app @contextmanager def set_current_app(self, app: "Application") -> Generator[None, None, None]: if DEBUG: # pragma: no cover if app not in self._apps: raise RuntimeError( "Expected one of the following apps {!r}, got {!r}".format( self._apps, app ) ) prev = self._current_app self._current_app = app try: yield finally: self._current_app = prev def freeze(self) -> None: self._frozen = True def __repr__(self) -> str: return f"" class MatchInfoError(UrlMappingMatchInfo): def __init__(self, http_exception: HTTPException) -> None: self._exception = http_exception super().__init__({}, SystemRoute(self._exception)) @property def http_exception(self) -> HTTPException: return self._exception def __repr__(self) -> str: return "".format( self._exception.status, self._exception.reason ) async def _default_expect_handler(request: Request) -> None: """Default handler for Expect header. Just send "100 Continue" to client. raise HTTPExpectationFailed if value of header is not "100-continue" """ expect = request.headers.get(hdrs.EXPECT, "") if request.version == HttpVersion11: if expect.lower() == "100-continue": await request.writer.write(b"HTTP/1.1 100 Continue\r\n\r\n") else: raise HTTPExpectationFailed(text="Unknown Expect: %s" % expect) class Resource(AbstractResource): def __init__(self, *, name: Optional[str] = None) -> None: super().__init__(name=name) self._routes: List[ResourceRoute] = [] def add_route( self, method: str, handler: Union[Type[AbstractView], Handler], *, expect_handler: Optional[_ExpectHandler] = None, ) -> "ResourceRoute": for route_obj in self._routes: if route_obj.method == method or route_obj.method == hdrs.METH_ANY: raise RuntimeError( "Added route will never be executed, " "method {route.method} is already " "registered".format(route=route_obj) ) route_obj = ResourceRoute(method, handler, self, expect_handler=expect_handler) self.register_route(route_obj) return route_obj def register_route(self, route: "ResourceRoute") -> None: assert isinstance( route, ResourceRoute ), f"Instance of Route class is required, got {route!r}" self._routes.append(route) async def resolve(self, request: Request) -> _Resolve: allowed_methods: Set[str] = set() match_dict = self._match(request.rel_url.raw_path) if match_dict is None: return None, allowed_methods for route_obj in self._routes: route_method = route_obj.method allowed_methods.add(route_method) if route_method == request.method or route_method == hdrs.METH_ANY: return (UrlMappingMatchInfo(match_dict, route_obj), allowed_methods) else: return None, allowed_methods @abc.abstractmethod def _match(self, path: str) -> Optional[Dict[str, str]]: pass # pragma: no cover def __len__(self) -> int: return len(self._routes) def __iter__(self) -> Iterator["ResourceRoute"]: return iter(self._routes) # TODO: implement all abstract methods class PlainResource(Resource): def __init__(self, path: str, *, name: Optional[str] = None) -> None: super().__init__(name=name) assert not path or path.startswith("/") self._path = path @property def canonical(self) -> str: return self._path def freeze(self) -> None: if not self._path: self._path = "/" def add_prefix(self, prefix: str) -> None: assert prefix.startswith("/") assert not prefix.endswith("/") assert len(prefix) > 1 self._path = prefix + self._path def _match(self, path: str) -> Optional[Dict[str, str]]: # string comparison is about 10 times faster than regexp matching if self._path == path: return {} else: return None def raw_match(self, path: str) -> bool: return self._path == path def get_info(self) -> _InfoDict: return {"path": self._path} def url_for(self) -> URL: # type: ignore[override] return URL.build(path=self._path, encoded=True) def __repr__(self) -> str: name = "'" + self.name + "' " if self.name is not None else "" return f"" class DynamicResource(Resource): DYN = re.compile(r"\{(?P[_a-zA-Z][_a-zA-Z0-9]*)\}") DYN_WITH_RE = re.compile(r"\{(?P[_a-zA-Z][_a-zA-Z0-9]*):(?P.+)\}") GOOD = r"[^{}/]+" def __init__(self, path: str, *, name: Optional[str] = None) -> None: super().__init__(name=name) pattern = "" formatter = "" for part in ROUTE_RE.split(path): match = self.DYN.fullmatch(part) if match: pattern += "(?P<{}>{})".format(match.group("var"), self.GOOD) formatter += "{" + match.group("var") + "}" continue match = self.DYN_WITH_RE.fullmatch(part) if match: pattern += "(?P<{var}>{re})".format(**match.groupdict()) formatter += "{" + match.group("var") + "}" continue if "{" in part or "}" in part: raise ValueError(f"Invalid path '{path}'['{part}']") part = _requote_path(part) formatter += part pattern += re.escape(part) try: compiled = re.compile(pattern) except re.error as exc: raise ValueError(f"Bad pattern '{pattern}': {exc}") from None assert compiled.pattern.startswith(PATH_SEP) assert formatter.startswith("/") self._pattern = compiled self._formatter = formatter @property def canonical(self) -> str: return self._formatter def add_prefix(self, prefix: str) -> None: assert prefix.startswith("/") assert not prefix.endswith("/") assert len(prefix) > 1 self._pattern = re.compile(re.escape(prefix) + self._pattern.pattern) self._formatter = prefix + self._formatter def _match(self, path: str) -> Optional[Dict[str, str]]: match = self._pattern.fullmatch(path) if match is None: return None else: return { key: _unquote_path(value) for key, value in match.groupdict().items() } def raw_match(self, path: str) -> bool: return self._formatter == path def get_info(self) -> _InfoDict: return {"formatter": self._formatter, "pattern": self._pattern} def url_for(self, **parts: str) -> URL: url = self._formatter.format_map({k: _quote_path(v) for k, v in parts.items()}) return URL.build(path=url, encoded=True) def __repr__(self) -> str: name = "'" + self.name + "' " if self.name is not None else "" return "".format( name=name, formatter=self._formatter ) class PrefixResource(AbstractResource): def __init__(self, prefix: str, *, name: Optional[str] = None) -> None: assert not prefix or prefix.startswith("/"), prefix assert prefix in ("", "/") or not prefix.endswith("/"), prefix super().__init__(name=name) self._prefix = _requote_path(prefix) self._prefix2 = self._prefix + "/" @property def canonical(self) -> str: return self._prefix def add_prefix(self, prefix: str) -> None: assert prefix.startswith("/") assert not prefix.endswith("/") assert len(prefix) > 1 self._prefix = prefix + self._prefix self._prefix2 = self._prefix + "/" def raw_match(self, prefix: str) -> bool: return False # TODO: impl missing abstract methods class StaticResource(PrefixResource): VERSION_KEY = "v" def __init__( self, prefix: str, directory: PathLike, *, name: Optional[str] = None, expect_handler: Optional[_ExpectHandler] = None, chunk_size: int = 256 * 1024, show_index: bool = False, follow_symlinks: bool = False, append_version: bool = False, ) -> None: super().__init__(prefix, name=name) try: directory = Path(directory) if str(directory).startswith("~"): directory = Path(os.path.expanduser(str(directory))) directory = directory.resolve() if not directory.is_dir(): raise ValueError("Not a directory") except (FileNotFoundError, ValueError) as error: raise ValueError(f"No directory exists at '{directory}'") from error self._directory = directory self._show_index = show_index self._chunk_size = chunk_size self._follow_symlinks = follow_symlinks self._expect_handler = expect_handler self._append_version = append_version self._routes = { "GET": ResourceRoute( "GET", self._handle, self, expect_handler=expect_handler ), "HEAD": ResourceRoute( "HEAD", self._handle, self, expect_handler=expect_handler ), } def url_for( # type: ignore[override] self, *, filename: PathLike, append_version: Optional[bool] = None, ) -> URL: if append_version is None: append_version = self._append_version filename = str(filename).lstrip("/") url = URL.build(path=self._prefix, encoded=True) # filename is not encoded if YARL_VERSION < (1, 6): url = url / filename.replace("%", "%25") else: url = url / filename if append_version: unresolved_path = self._directory.joinpath(filename) try: if self._follow_symlinks: normalized_path = Path(os.path.normpath(unresolved_path)) normalized_path.relative_to(self._directory) filepath = normalized_path.resolve() else: filepath = unresolved_path.resolve() filepath.relative_to(self._directory) except (ValueError, FileNotFoundError): # ValueError for case when path point to symlink # with follow_symlinks is False return url # relatively safe if filepath.is_file(): # TODO cache file content # with file watcher for cache invalidation with filepath.open("rb") as f: file_bytes = f.read() h = self._get_file_hash(file_bytes) url = url.with_query({self.VERSION_KEY: h}) return url return url @staticmethod def _get_file_hash(byte_array: bytes) -> str: m = hashlib.sha256() # todo sha256 can be configurable param m.update(byte_array) b64 = base64.urlsafe_b64encode(m.digest()) return b64.decode("ascii") def get_info(self) -> _InfoDict: return { "directory": self._directory, "prefix": self._prefix, "routes": self._routes, } def set_options_route(self, handler: Handler) -> None: if "OPTIONS" in self._routes: raise RuntimeError("OPTIONS route was set already") self._routes["OPTIONS"] = ResourceRoute( "OPTIONS", handler, self, expect_handler=self._expect_handler ) async def resolve(self, request: Request) -> _Resolve: path = request.rel_url.raw_path method = request.method allowed_methods = set(self._routes) if not path.startswith(self._prefix2) and path != self._prefix: return None, set() if method not in allowed_methods: return None, allowed_methods match_dict = {"filename": _unquote_path(path[len(self._prefix) + 1 :])} return (UrlMappingMatchInfo(match_dict, self._routes[method]), allowed_methods) def __len__(self) -> int: return len(self._routes) def __iter__(self) -> Iterator[AbstractRoute]: return iter(self._routes.values()) async def _handle(self, request: Request) -> StreamResponse: rel_url = request.match_info["filename"] try: filename = Path(rel_url) if filename.anchor: # rel_url is an absolute name like # /static/\\machine_name\c$ or /static/D:\path # where the static dir is totally different raise HTTPForbidden() unresolved_path = self._directory.joinpath(filename) if self._follow_symlinks: normalized_path = Path(os.path.normpath(unresolved_path)) normalized_path.relative_to(self._directory) filepath = normalized_path.resolve() else: filepath = unresolved_path.resolve() filepath.relative_to(self._directory) except (ValueError, FileNotFoundError) as error: # relatively safe raise HTTPNotFound() from error except HTTPForbidden: raise except Exception as error: # perm error or other kind! request.app.logger.exception(error) raise HTTPNotFound() from error # on opening a dir, load its contents if allowed if filepath.is_dir(): if self._show_index: try: return Response( text=self._directory_as_html(filepath), content_type="text/html" ) except PermissionError: raise HTTPForbidden() else: raise HTTPForbidden() elif filepath.is_file(): return FileResponse(filepath, chunk_size=self._chunk_size) else: raise HTTPNotFound def _directory_as_html(self, filepath: Path) -> str: # returns directory's index as html # sanity check assert filepath.is_dir() relative_path_to_dir = filepath.relative_to(self._directory).as_posix() index_of = f"Index of /{html_escape(relative_path_to_dir)}" h1 = f"

{index_of}

" index_list = [] dir_index = filepath.iterdir() for _file in sorted(dir_index): # show file url as relative to static path rel_path = _file.relative_to(self._directory).as_posix() quoted_file_url = _quote_path(f"{self._prefix}/{rel_path}") # if file is a directory, add '/' to the end of the name if _file.is_dir(): file_name = f"{_file.name}/" else: file_name = _file.name index_list.append( f'
  • {html_escape(file_name)}
  • ' ) ul = "
      \n{}\n
    ".format("\n".join(index_list)) body = f"\n{h1}\n{ul}\n" head_str = f"\n{index_of}\n" html = f"\n{head_str}\n{body}\n" return html def __repr__(self) -> str: name = "'" + self.name + "'" if self.name is not None else "" return " {directory!r}>".format( name=name, path=self._prefix, directory=self._directory ) class PrefixedSubAppResource(PrefixResource): def __init__(self, prefix: str, app: "Application") -> None: super().__init__(prefix) self._app = app for resource in app.router.resources(): resource.add_prefix(prefix) def add_prefix(self, prefix: str) -> None: super().add_prefix(prefix) for resource in self._app.router.resources(): resource.add_prefix(prefix) def url_for(self, *args: str, **kwargs: str) -> URL: raise RuntimeError(".url_for() is not supported " "by sub-application root") def get_info(self) -> _InfoDict: return {"app": self._app, "prefix": self._prefix} async def resolve(self, request: Request) -> _Resolve: if ( not request.url.raw_path.startswith(self._prefix2) and request.url.raw_path != self._prefix ): return None, set() match_info = await self._app.router.resolve(request) match_info.add_app(self._app) if isinstance(match_info.http_exception, HTTPMethodNotAllowed): methods = match_info.http_exception.allowed_methods else: methods = set() return match_info, methods def __len__(self) -> int: return len(self._app.router.routes()) def __iter__(self) -> Iterator[AbstractRoute]: return iter(self._app.router.routes()) def __repr__(self) -> str: return " {app!r}>".format( prefix=self._prefix, app=self._app ) class AbstractRuleMatching(abc.ABC): @abc.abstractmethod # pragma: no branch async def match(self, request: Request) -> bool: """Return bool if the request satisfies the criteria""" @abc.abstractmethod # pragma: no branch def get_info(self) -> _InfoDict: """Return a dict with additional info useful for introspection""" @property @abc.abstractmethod # pragma: no branch def canonical(self) -> str: """Return a str""" class Domain(AbstractRuleMatching): re_part = re.compile(r"(?!-)[a-z\d-]{1,63}(? None: super().__init__() self._domain = self.validation(domain) @property def canonical(self) -> str: return self._domain def validation(self, domain: str) -> str: if not isinstance(domain, str): raise TypeError("Domain must be str") domain = domain.rstrip(".").lower() if not domain: raise ValueError("Domain cannot be empty") elif "://" in domain: raise ValueError("Scheme not supported") url = URL("http://" + domain) assert url.raw_host is not None if not all(self.re_part.fullmatch(x) for x in url.raw_host.split(".")): raise ValueError("Domain not valid") if url.port == 80: return url.raw_host return f"{url.raw_host}:{url.port}" async def match(self, request: Request) -> bool: host = request.headers.get(hdrs.HOST) if not host: return False return self.match_domain(host) def match_domain(self, host: str) -> bool: return host.lower() == self._domain def get_info(self) -> _InfoDict: return {"domain": self._domain} class MaskDomain(Domain): re_part = re.compile(r"(?!-)[a-z\d\*-]{1,63}(? None: super().__init__(domain) mask = self._domain.replace(".", r"\.").replace("*", ".*") self._mask = re.compile(mask) @property def canonical(self) -> str: return self._mask.pattern def match_domain(self, host: str) -> bool: return self._mask.fullmatch(host) is not None class MatchedSubAppResource(PrefixedSubAppResource): def __init__(self, rule: AbstractRuleMatching, app: "Application") -> None: AbstractResource.__init__(self) self._prefix = "" self._app = app self._rule = rule @property def canonical(self) -> str: return self._rule.canonical def get_info(self) -> _InfoDict: return {"app": self._app, "rule": self._rule} async def resolve(self, request: Request) -> _Resolve: if not await self._rule.match(request): return None, set() match_info = await self._app.router.resolve(request) match_info.add_app(self._app) if isinstance(match_info.http_exception, HTTPMethodNotAllowed): methods = match_info.http_exception.allowed_methods else: methods = set() return match_info, methods def __repr__(self) -> str: return " {app!r}>" "".format(app=self._app) class ResourceRoute(AbstractRoute): """A route with resource""" def __init__( self, method: str, handler: Union[Handler, Type[AbstractView]], resource: AbstractResource, *, expect_handler: Optional[_ExpectHandler] = None, ) -> None: super().__init__( method, handler, expect_handler=expect_handler, resource=resource ) def __repr__(self) -> str: return " {handler!r}".format( method=self.method, resource=self._resource, handler=self.handler ) @property def name(self) -> Optional[str]: if self._resource is None: return None return self._resource.name def url_for(self, *args: str, **kwargs: str) -> URL: """Construct url for route with additional params.""" assert self._resource is not None return self._resource.url_for(*args, **kwargs) def get_info(self) -> _InfoDict: assert self._resource is not None return self._resource.get_info() class SystemRoute(AbstractRoute): def __init__(self, http_exception: HTTPException) -> None: super().__init__(hdrs.METH_ANY, self._handle) self._http_exception = http_exception def url_for(self, *args: str, **kwargs: str) -> URL: raise RuntimeError(".url_for() is not allowed for SystemRoute") @property def name(self) -> Optional[str]: return None def get_info(self) -> _InfoDict: return {"http_exception": self._http_exception} async def _handle(self, request: Request) -> StreamResponse: raise self._http_exception @property def status(self) -> int: return self._http_exception.status @property def reason(self) -> str: return self._http_exception.reason def __repr__(self) -> str: return "".format(self=self) class View(AbstractView): async def _iter(self) -> StreamResponse: if self.request.method not in hdrs.METH_ALL: self._raise_allowed_methods() method: Optional[Callable[[], Awaitable[StreamResponse]]] method = getattr(self, self.request.method.lower(), None) if method is None: self._raise_allowed_methods() ret = await method() assert isinstance(ret, StreamResponse) return ret def __await__(self) -> Generator[Any, None, StreamResponse]: return self._iter().__await__() def _raise_allowed_methods(self) -> NoReturn: allowed_methods = {m for m in hdrs.METH_ALL if hasattr(self, m.lower())} raise HTTPMethodNotAllowed(self.request.method, allowed_methods) class ResourcesView(Sized, Iterable[AbstractResource], Container[AbstractResource]): def __init__(self, resources: List[AbstractResource]) -> None: self._resources = resources def __len__(self) -> int: return len(self._resources) def __iter__(self) -> Iterator[AbstractResource]: yield from self._resources def __contains__(self, resource: object) -> bool: return resource in self._resources class RoutesView(Sized, Iterable[AbstractRoute], Container[AbstractRoute]): def __init__(self, resources: List[AbstractResource]): self._routes: List[AbstractRoute] = [] for resource in resources: for route in resource: self._routes.append(route) def __len__(self) -> int: return len(self._routes) def __iter__(self) -> Iterator[AbstractRoute]: yield from self._routes def __contains__(self, route: object) -> bool: return route in self._routes class UrlDispatcher(AbstractRouter, Mapping[str, AbstractResource]): NAME_SPLIT_RE = re.compile(r"[.:-]") def __init__(self) -> None: super().__init__() self._resources: List[AbstractResource] = [] self._named_resources: Dict[str, AbstractResource] = {} async def resolve(self, request: Request) -> UrlMappingMatchInfo: method = request.method allowed_methods: Set[str] = set() for resource in self._resources: match_dict, allowed = await resource.resolve(request) if match_dict is not None: return match_dict else: allowed_methods |= allowed if allowed_methods: return MatchInfoError(HTTPMethodNotAllowed(method, allowed_methods)) else: return MatchInfoError(HTTPNotFound()) def __iter__(self) -> Iterator[str]: return iter(self._named_resources) def __len__(self) -> int: return len(self._named_resources) def __contains__(self, resource: object) -> bool: return resource in self._named_resources def __getitem__(self, name: str) -> AbstractResource: return self._named_resources[name] def resources(self) -> ResourcesView: return ResourcesView(self._resources) def routes(self) -> RoutesView: return RoutesView(self._resources) def named_resources(self) -> Mapping[str, AbstractResource]: return MappingProxyType(self._named_resources) def register_resource(self, resource: AbstractResource) -> None: assert isinstance( resource, AbstractResource ), f"Instance of AbstractResource class is required, got {resource!r}" if self.frozen: raise RuntimeError("Cannot register a resource into frozen router.") name = resource.name if name is not None: parts = self.NAME_SPLIT_RE.split(name) for part in parts: if keyword.iskeyword(part): raise ValueError( f"Incorrect route name {name!r}, " "python keywords cannot be used " "for route name" ) if not part.isidentifier(): raise ValueError( "Incorrect route name {!r}, " "the name should be a sequence of " "python identifiers separated " "by dash, dot or column".format(name) ) if name in self._named_resources: raise ValueError( "Duplicate {!r}, " "already handled by {!r}".format(name, self._named_resources[name]) ) self._named_resources[name] = resource self._resources.append(resource) def add_resource(self, path: str, *, name: Optional[str] = None) -> Resource: if path and not path.startswith("/"): raise ValueError("path should be started with / or be empty") # Reuse last added resource if path and name are the same if self._resources: resource = self._resources[-1] if resource.name == name and resource.raw_match(path): return cast(Resource, resource) if not ("{" in path or "}" in path or ROUTE_RE.search(path)): resource = PlainResource(_requote_path(path), name=name) self.register_resource(resource) return resource resource = DynamicResource(path, name=name) self.register_resource(resource) return resource def add_route( self, method: str, path: str, handler: Union[Handler, Type[AbstractView]], *, name: Optional[str] = None, expect_handler: Optional[_ExpectHandler] = None, ) -> AbstractRoute: resource = self.add_resource(path, name=name) return resource.add_route(method, handler, expect_handler=expect_handler) def add_static( self, prefix: str, path: PathLike, *, name: Optional[str] = None, expect_handler: Optional[_ExpectHandler] = None, chunk_size: int = 256 * 1024, show_index: bool = False, follow_symlinks: bool = False, append_version: bool = False, ) -> AbstractResource: """Add static files view. prefix - url prefix path - folder with files """ assert prefix.startswith("/") if prefix.endswith("/"): prefix = prefix[:-1] resource = StaticResource( prefix, path, name=name, expect_handler=expect_handler, chunk_size=chunk_size, show_index=show_index, follow_symlinks=follow_symlinks, append_version=append_version, ) self.register_resource(resource) return resource def add_head(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: """Shortcut for add_route with method HEAD.""" return self.add_route(hdrs.METH_HEAD, path, handler, **kwargs) def add_options(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: """Shortcut for add_route with method OPTIONS.""" return self.add_route(hdrs.METH_OPTIONS, path, handler, **kwargs) def add_get( self, path: str, handler: Handler, *, name: Optional[str] = None, allow_head: bool = True, **kwargs: Any, ) -> AbstractRoute: """Shortcut for add_route with method GET. If allow_head is true, another route is added allowing head requests to the same endpoint. """ resource = self.add_resource(path, name=name) if allow_head: resource.add_route(hdrs.METH_HEAD, handler, **kwargs) return resource.add_route(hdrs.METH_GET, handler, **kwargs) def add_post(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: """Shortcut for add_route with method POST.""" return self.add_route(hdrs.METH_POST, path, handler, **kwargs) def add_put(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: """Shortcut for add_route with method PUT.""" return self.add_route(hdrs.METH_PUT, path, handler, **kwargs) def add_patch(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: """Shortcut for add_route with method PATCH.""" return self.add_route(hdrs.METH_PATCH, path, handler, **kwargs) def add_delete(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: """Shortcut for add_route with method DELETE.""" return self.add_route(hdrs.METH_DELETE, path, handler, **kwargs) def add_view( self, path: str, handler: Type[AbstractView], **kwargs: Any ) -> AbstractRoute: """Shortcut for add_route with ANY methods for a class-based view.""" return self.add_route(hdrs.METH_ANY, path, handler, **kwargs) def freeze(self) -> None: super().freeze() for resource in self._resources: resource.freeze() def add_routes(self, routes: Iterable[AbstractRouteDef]) -> List[AbstractRoute]: """Append routes to route table. Parameter should be a sequence of RouteDef objects. Returns a list of registered AbstractRoute instances. """ registered_routes = [] for route_def in routes: registered_routes.extend(route_def.register(self)) return registered_routes def _quote_path(value: str) -> str: if YARL_VERSION < (1, 6): value = value.replace("%", "%25") return URL.build(path=value, encoded=False).raw_path def _unquote_path(value: str) -> str: return URL.build(path=value, encoded=True).path def _requote_path(value: str) -> str: # Quote non-ascii characters and other characters which must be quoted, # but preserve existing %-sequences. result = _quote_path(value) if "%" in value: result = result.replace("%25", "%") return result ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/web_ws.py0000644000175100001770000004502014607525266016133 0ustar00runnerdockerimport asyncio import base64 import binascii import hashlib import json import sys from typing import Any, Final, Iterable, Optional, Tuple, cast import attr from multidict import CIMultiDict from . import hdrs from .abc import AbstractStreamWriter from .helpers import call_later, set_exception, set_result from .http import ( WS_CLOSED_MESSAGE, WS_CLOSING_MESSAGE, WS_KEY, WebSocketError, WebSocketReader, WebSocketWriter, WSCloseCode, WSMessage, WSMsgType as WSMsgType, ws_ext_gen, ws_ext_parse, ) from .log import ws_logger from .streams import EofStream, FlowControlDataQueue from .typedefs import JSONDecoder, JSONEncoder from .web_exceptions import HTTPBadRequest, HTTPException from .web_request import BaseRequest from .web_response import StreamResponse if sys.version_info >= (3, 11): import asyncio as async_timeout else: import async_timeout __all__ = ( "WebSocketResponse", "WebSocketReady", "WSMsgType", ) THRESHOLD_CONNLOST_ACCESS: Final[int] = 5 @attr.s(auto_attribs=True, frozen=True, slots=True) class WebSocketReady: ok: bool protocol: Optional[str] def __bool__(self) -> bool: return self.ok class WebSocketResponse(StreamResponse): _length_check = False def __init__( self, *, timeout: float = 10.0, receive_timeout: Optional[float] = None, autoclose: bool = True, autoping: bool = True, heartbeat: Optional[float] = None, protocols: Iterable[str] = (), compress: bool = True, max_msg_size: int = 4 * 1024 * 1024, ) -> None: super().__init__(status=101) self._protocols = protocols self._ws_protocol: Optional[str] = None self._writer: Optional[WebSocketWriter] = None self._reader: Optional[FlowControlDataQueue[WSMessage]] = None self._closed = False self._closing = False self._conn_lost = 0 self._close_code: Optional[int] = None self._loop: Optional[asyncio.AbstractEventLoop] = None self._waiting: Optional[asyncio.Future[bool]] = None self._exception: Optional[BaseException] = None self._timeout = timeout self._receive_timeout = receive_timeout self._autoclose = autoclose self._autoping = autoping self._heartbeat = heartbeat self._heartbeat_cb: Optional[asyncio.TimerHandle] = None if heartbeat is not None: self._pong_heartbeat = heartbeat / 2.0 self._pong_response_cb: Optional[asyncio.TimerHandle] = None self._compress = compress self._max_msg_size = max_msg_size def _cancel_heartbeat(self) -> None: if self._pong_response_cb is not None: self._pong_response_cb.cancel() self._pong_response_cb = None if self._heartbeat_cb is not None: self._heartbeat_cb.cancel() self._heartbeat_cb = None def _reset_heartbeat(self) -> None: self._cancel_heartbeat() if self._heartbeat is not None: assert self._loop is not None self._heartbeat_cb = call_later( self._send_heartbeat, self._heartbeat, self._loop, timeout_ceil_threshold=self._req._protocol._timeout_ceil_threshold if self._req is not None else 5, ) def _send_heartbeat(self) -> None: if self._heartbeat is not None and not self._closed: assert self._loop is not None # fire-and-forget a task is not perfect but maybe ok for # sending ping. Otherwise we need a long-living heartbeat # task in the class. self._loop.create_task(self._writer.ping()) # type: ignore[union-attr] if self._pong_response_cb is not None: self._pong_response_cb.cancel() self._pong_response_cb = call_later( self._pong_not_received, self._pong_heartbeat, self._loop, timeout_ceil_threshold=self._req._protocol._timeout_ceil_threshold if self._req is not None else 5, ) def _pong_not_received(self) -> None: if self._req is not None and self._req.transport is not None: self._closed = True self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) self._exception = asyncio.TimeoutError() async def prepare(self, request: BaseRequest) -> AbstractStreamWriter: # make pre-check to don't hide it by do_handshake() exceptions if self._payload_writer is not None: return self._payload_writer protocol, writer = self._pre_start(request) payload_writer = await super().prepare(request) assert payload_writer is not None self._post_start(request, protocol, writer) await payload_writer.drain() return payload_writer def _handshake( self, request: BaseRequest ) -> Tuple["CIMultiDict[str]", str, bool, bool]: headers = request.headers if "websocket" != headers.get(hdrs.UPGRADE, "").lower().strip(): raise HTTPBadRequest( text=( "No WebSocket UPGRADE hdr: {}\n Can " '"Upgrade" only to "WebSocket".' ).format(headers.get(hdrs.UPGRADE)) ) if "upgrade" not in headers.get(hdrs.CONNECTION, "").lower(): raise HTTPBadRequest( text="No CONNECTION upgrade hdr: {}".format( headers.get(hdrs.CONNECTION) ) ) # find common sub-protocol between client and server protocol = None if hdrs.SEC_WEBSOCKET_PROTOCOL in headers: req_protocols = [ str(proto.strip()) for proto in headers[hdrs.SEC_WEBSOCKET_PROTOCOL].split(",") ] for proto in req_protocols: if proto in self._protocols: protocol = proto break else: # No overlap found: Return no protocol as per spec ws_logger.warning( "Client protocols %r don’t overlap server-known ones %r", req_protocols, self._protocols, ) # check supported version version = headers.get(hdrs.SEC_WEBSOCKET_VERSION, "") if version not in ("13", "8", "7"): raise HTTPBadRequest(text=f"Unsupported version: {version}") # check client handshake for validity key = headers.get(hdrs.SEC_WEBSOCKET_KEY) try: if not key or len(base64.b64decode(key)) != 16: raise HTTPBadRequest(text=f"Handshake error: {key!r}") except binascii.Error: raise HTTPBadRequest(text=f"Handshake error: {key!r}") from None accept_val = base64.b64encode( hashlib.sha1(key.encode() + WS_KEY).digest() ).decode() response_headers = CIMultiDict( { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: accept_val, } ) notakeover = False compress = 0 if self._compress: extensions = headers.get(hdrs.SEC_WEBSOCKET_EXTENSIONS) # Server side always get return with no exception. # If something happened, just drop compress extension compress, notakeover = ws_ext_parse(extensions, isserver=True) if compress: enabledext = ws_ext_gen( compress=compress, isserver=True, server_notakeover=notakeover ) response_headers[hdrs.SEC_WEBSOCKET_EXTENSIONS] = enabledext if protocol: response_headers[hdrs.SEC_WEBSOCKET_PROTOCOL] = protocol return ( response_headers, protocol, compress, notakeover, ) # type: ignore[return-value] def _pre_start(self, request: BaseRequest) -> Tuple[str, WebSocketWriter]: self._loop = request._loop headers, protocol, compress, notakeover = self._handshake(request) self.set_status(101) self.headers.update(headers) self.force_close() self._compress = compress transport = request._protocol.transport assert transport is not None writer = WebSocketWriter( request._protocol, transport, compress=compress, notakeover=notakeover ) return protocol, writer def _post_start( self, request: BaseRequest, protocol: str, writer: WebSocketWriter ) -> None: self._ws_protocol = protocol self._writer = writer self._reset_heartbeat() loop = self._loop assert loop is not None self._reader = FlowControlDataQueue(request._protocol, 2**16, loop=loop) request.protocol.set_parser( WebSocketReader(self._reader, self._max_msg_size, compress=self._compress) ) # disable HTTP keepalive for WebSocket request.protocol.keep_alive(False) def can_prepare(self, request: BaseRequest) -> WebSocketReady: if self._writer is not None: raise RuntimeError("Already started") try: _, protocol, _, _ = self._handshake(request) except HTTPException: return WebSocketReady(False, None) else: return WebSocketReady(True, protocol) @property def closed(self) -> bool: return self._closed @property def close_code(self) -> Optional[int]: return self._close_code @property def ws_protocol(self) -> Optional[str]: return self._ws_protocol @property def compress(self) -> bool: return self._compress def get_extra_info(self, name: str, default: Any = None) -> Any: """Get optional transport information. If no value associated with ``name`` is found, ``default`` is returned. """ writer = self._writer if writer is None: return default transport = writer.transport if transport is None: return default return transport.get_extra_info(name, default) def exception(self) -> Optional[BaseException]: return self._exception async def ping(self, message: bytes = b"") -> None: if self._writer is None: raise RuntimeError("Call .prepare() first") await self._writer.ping(message) async def pong(self, message: bytes = b"") -> None: # unsolicited pong if self._writer is None: raise RuntimeError("Call .prepare() first") await self._writer.pong(message) async def send_str(self, data: str, compress: Optional[bool] = None) -> None: if self._writer is None: raise RuntimeError("Call .prepare() first") if not isinstance(data, str): raise TypeError("data argument must be str (%r)" % type(data)) await self._writer.send(data, binary=False, compress=compress) async def send_bytes(self, data: bytes, compress: Optional[bool] = None) -> None: if self._writer is None: raise RuntimeError("Call .prepare() first") if not isinstance(data, (bytes, bytearray, memoryview)): raise TypeError("data argument must be byte-ish (%r)" % type(data)) await self._writer.send(data, binary=True, compress=compress) async def send_json( self, data: Any, compress: Optional[bool] = None, *, dumps: JSONEncoder = json.dumps, ) -> None: await self.send_str(dumps(data), compress=compress) async def write_eof(self) -> None: # type: ignore[override] if self._eof_sent: return if self._payload_writer is None: raise RuntimeError("Response has not been started") await self.close() self._eof_sent = True async def close( self, *, code: int = WSCloseCode.OK, message: bytes = b"", drain: bool = True ) -> bool: """Close websocket connection.""" if self._writer is None: raise RuntimeError("Call .prepare() first") self._cancel_heartbeat() reader = self._reader assert reader is not None # we need to break `receive()` cycle first, # `close()` may be called from different task if self._waiting is not None and not self._closed: reader.feed_data(WS_CLOSING_MESSAGE, 0) await self._waiting if self._closed: return False self._closed = True try: await self._writer.close(code, message) writer = self._payload_writer assert writer is not None if drain: await writer.drain() except (asyncio.CancelledError, asyncio.TimeoutError): self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) raise except Exception as exc: self._exception = exc self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) return True if self._closing: self._close_transport() return True reader = self._reader assert reader is not None try: async with async_timeout.timeout(self._timeout): msg = await reader.read() except asyncio.CancelledError: self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) raise except Exception as exc: self._exception = exc self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) return True if msg.type == WSMsgType.CLOSE: self._set_code_close_transport(msg.data) return True self._set_code_close_transport(WSCloseCode.ABNORMAL_CLOSURE) self._exception = asyncio.TimeoutError() return True def _set_closing(self, code: WSCloseCode) -> None: """Set the close code and mark the connection as closing.""" self._closing = True self._close_code = code def _set_code_close_transport(self, code: WSCloseCode) -> None: """Set the close code and close the transport.""" self._close_code = code self._close_transport() def _close_transport(self) -> None: """Close the transport.""" if self._req is not None and self._req.transport is not None: self._req.transport.close() async def receive(self, timeout: Optional[float] = None) -> WSMessage: if self._reader is None: raise RuntimeError("Call .prepare() first") loop = self._loop assert loop is not None while True: if self._waiting is not None: raise RuntimeError("Concurrent call to receive() is not allowed") if self._closed: self._conn_lost += 1 if self._conn_lost >= THRESHOLD_CONNLOST_ACCESS: raise RuntimeError("WebSocket connection is closed.") return WS_CLOSED_MESSAGE elif self._closing: return WS_CLOSING_MESSAGE try: self._waiting = loop.create_future() try: async with async_timeout.timeout(timeout or self._receive_timeout): msg = await self._reader.read() self._reset_heartbeat() finally: waiter = self._waiting set_result(waiter, True) self._waiting = None except asyncio.TimeoutError: raise except EofStream: self._close_code = WSCloseCode.OK await self.close() return WSMessage(WSMsgType.CLOSED, None, None) except WebSocketError as exc: self._close_code = exc.code await self.close(code=exc.code) return WSMessage(WSMsgType.ERROR, exc, None) except Exception as exc: self._exception = exc self._set_closing(WSCloseCode.ABNORMAL_CLOSURE) await self.close() return WSMessage(WSMsgType.ERROR, exc, None) if msg.type == WSMsgType.CLOSE: self._set_closing(msg.data) # Could be closed while awaiting reader. if not self._closed and self._autoclose: # The client is likely going to close the # connection out from under us so we do not # want to drain any pending writes as it will # likely result writing to a broken pipe. await self.close(drain=False) elif msg.type == WSMsgType.CLOSING: self._set_closing(WSCloseCode.OK) elif msg.type == WSMsgType.PING and self._autoping: await self.pong(msg.data) continue elif msg.type == WSMsgType.PONG and self._autoping: continue return msg async def receive_str(self, *, timeout: Optional[float] = None) -> str: msg = await self.receive(timeout) if msg.type != WSMsgType.TEXT: raise TypeError( "Received message {}:{!r} is not WSMsgType.TEXT".format( msg.type, msg.data ) ) return cast(str, msg.data) async def receive_bytes(self, *, timeout: Optional[float] = None) -> bytes: msg = await self.receive(timeout) if msg.type != WSMsgType.BINARY: raise TypeError(f"Received message {msg.type}:{msg.data!r} is not bytes") return cast(bytes, msg.data) async def receive_json( self, *, loads: JSONDecoder = json.loads, timeout: Optional[float] = None ) -> Any: data = await self.receive_str(timeout=timeout) return loads(data) async def write(self, data: bytes) -> None: raise RuntimeError("Cannot call .write() for websocket") def __aiter__(self) -> "WebSocketResponse": return self async def __anext__(self) -> WSMessage: msg = await self.receive() if msg.type in (WSMsgType.CLOSE, WSMsgType.CLOSING, WSMsgType.CLOSED): raise StopAsyncIteration return msg def _cancel(self, exc: BaseException) -> None: # web_protocol calls this from connection_lost # or when the server is shutting down. self._closing = True if self._reader is not None: set_exception(self._reader, exc) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/aiohttp/worker.py0000644000175100001770000001743514607525266016167 0ustar00runnerdocker"""Async gunicorn worker for aiohttp.web""" import asyncio import os import re import signal import sys from types import FrameType from typing import Any, Awaitable, Callable, Optional, Union # noqa from gunicorn.config import AccessLogFormat as GunicornAccessLogFormat from gunicorn.workers import base from aiohttp import web from .helpers import set_result from .web_app import Application from .web_log import AccessLogger try: import ssl SSLContext = ssl.SSLContext except ImportError: # pragma: no cover ssl = None # type: ignore[assignment] SSLContext = object # type: ignore[misc,assignment] __all__ = ("GunicornWebWorker", "GunicornUVLoopWebWorker") class GunicornWebWorker(base.Worker): # type: ignore[misc,no-any-unimported] DEFAULT_AIOHTTP_LOG_FORMAT = AccessLogger.LOG_FORMAT DEFAULT_GUNICORN_LOG_FORMAT = GunicornAccessLogFormat.default def __init__(self, *args: Any, **kw: Any) -> None: # pragma: no cover super().__init__(*args, **kw) self._task: Optional[asyncio.Task[None]] = None self.exit_code = 0 self._notify_waiter: Optional[asyncio.Future[bool]] = None def init_process(self) -> None: # create new event_loop after fork asyncio.get_event_loop().close() self.loop = asyncio.new_event_loop() asyncio.set_event_loop(self.loop) super().init_process() def run(self) -> None: self._task = self.loop.create_task(self._run()) try: # ignore all finalization problems self.loop.run_until_complete(self._task) except Exception: self.log.exception("Exception in gunicorn worker") self.loop.run_until_complete(self.loop.shutdown_asyncgens()) self.loop.close() sys.exit(self.exit_code) async def _run(self) -> None: runner = None if isinstance(self.wsgi, Application): app = self.wsgi elif asyncio.iscoroutinefunction(self.wsgi): wsgi = await self.wsgi() if isinstance(wsgi, web.AppRunner): runner = wsgi app = runner.app else: app = wsgi else: raise RuntimeError( "wsgi app should be either Application or " "async function returning Application, got {}".format(self.wsgi) ) if runner is None: access_log = self.log.access_log if self.cfg.accesslog else None runner = web.AppRunner( app, logger=self.log, keepalive_timeout=self.cfg.keepalive, access_log=access_log, access_log_format=self._get_valid_log_format( self.cfg.access_log_format ), shutdown_timeout=self.cfg.graceful_timeout / 100 * 95, ) await runner.setup() ctx = self._create_ssl_context(self.cfg) if self.cfg.is_ssl else None runner = runner assert runner is not None server = runner.server assert server is not None for sock in self.sockets: site = web.SockSite( runner, sock, ssl_context=ctx, ) await site.start() # If our parent changed then we shut down. pid = os.getpid() try: while self.alive: # type: ignore[has-type] self.notify() cnt = server.requests_count if self.max_requests and cnt > self.max_requests: self.alive = False self.log.info("Max requests, shutting down: %s", self) elif pid == os.getpid() and self.ppid != os.getppid(): self.alive = False self.log.info("Parent changed, shutting down: %s", self) else: await self._wait_next_notify() except BaseException: pass await runner.cleanup() def _wait_next_notify(self) -> "asyncio.Future[bool]": self._notify_waiter_done() loop = self.loop assert loop is not None self._notify_waiter = waiter = loop.create_future() self.loop.call_later(1.0, self._notify_waiter_done, waiter) return waiter def _notify_waiter_done( self, waiter: Optional["asyncio.Future[bool]"] = None ) -> None: if waiter is None: waiter = self._notify_waiter if waiter is not None: set_result(waiter, True) if waiter is self._notify_waiter: self._notify_waiter = None def init_signals(self) -> None: # Set up signals through the event loop API. self.loop.add_signal_handler( signal.SIGQUIT, self.handle_quit, signal.SIGQUIT, None ) self.loop.add_signal_handler( signal.SIGTERM, self.handle_exit, signal.SIGTERM, None ) self.loop.add_signal_handler( signal.SIGINT, self.handle_quit, signal.SIGINT, None ) self.loop.add_signal_handler( signal.SIGWINCH, self.handle_winch, signal.SIGWINCH, None ) self.loop.add_signal_handler( signal.SIGUSR1, self.handle_usr1, signal.SIGUSR1, None ) self.loop.add_signal_handler( signal.SIGABRT, self.handle_abort, signal.SIGABRT, None ) # Don't let SIGTERM and SIGUSR1 disturb active requests # by interrupting system calls signal.siginterrupt(signal.SIGTERM, False) signal.siginterrupt(signal.SIGUSR1, False) # Reset signals so Gunicorn doesn't swallow subprocess return codes # See: https://github.com/aio-libs/aiohttp/issues/6130 def handle_quit(self, sig: int, frame: Optional[FrameType]) -> None: self.alive = False # worker_int callback self.cfg.worker_int(self) # wakeup closing process self._notify_waiter_done() def handle_abort(self, sig: int, frame: Optional[FrameType]) -> None: self.alive = False self.exit_code = 1 self.cfg.worker_abort(self) sys.exit(1) @staticmethod def _create_ssl_context(cfg: Any) -> "SSLContext": """Creates SSLContext instance for usage in asyncio.create_server. See ssl.SSLSocket.__init__ for more details. """ if ssl is None: # pragma: no cover raise RuntimeError("SSL is not supported.") ctx = ssl.SSLContext(cfg.ssl_version) ctx.load_cert_chain(cfg.certfile, cfg.keyfile) ctx.verify_mode = cfg.cert_reqs if cfg.ca_certs: ctx.load_verify_locations(cfg.ca_certs) if cfg.ciphers: ctx.set_ciphers(cfg.ciphers) return ctx def _get_valid_log_format(self, source_format: str) -> str: if source_format == self.DEFAULT_GUNICORN_LOG_FORMAT: return self.DEFAULT_AIOHTTP_LOG_FORMAT elif re.search(r"%\([^\)]+\)", source_format): raise ValueError( "Gunicorn's style options in form of `%(name)s` are not " "supported for the log formatting. Please use aiohttp's " "format specification to configure access log formatting: " "http://docs.aiohttp.org/en/stable/logging.html" "#format-specification" ) else: return source_format class GunicornUVLoopWebWorker(GunicornWebWorker): def init_process(self) -> None: import uvloop # Close any existing event loop before setting a # new policy. asyncio.get_event_loop().close() # Setup uvloop policy, so that every # asyncio.get_event_loop() will create an instance # of uvloop event loop. asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) super().init_process() ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1713285830.559115 aiohttp-3.9.5/aiohttp.egg-info/0000755000175100001770000000000014607525307015760 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285830.0 aiohttp-3.9.5/aiohttp.egg-info/PKG-INFO0000644000175100001770000001642514607525306017064 0ustar00runnerdockerMetadata-Version: 2.1 Name: aiohttp Version: 3.9.5 Summary: Async http client/server framework (asyncio) Home-page: https://github.com/aio-libs/aiohttp Maintainer: aiohttp team Maintainer-email: team@aiohttp.org License: Apache 2 Project-URL: Chat: Matrix, https://matrix.to/#/#aio-libs:matrix.org Project-URL: Chat: Matrix Space, https://matrix.to/#/#aio-libs-space:matrix.org Project-URL: CI: GitHub Actions, https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiohttp Project-URL: Docs: Changelog, https://docs.aiohttp.org/en/stable/changes.html Project-URL: Docs: RTD, https://docs.aiohttp.org Project-URL: GitHub: issues, https://github.com/aio-libs/aiohttp/issues Project-URL: GitHub: repo, https://github.com/aio-libs/aiohttp Classifier: Development Status :: 5 - Production/Stable Classifier: Framework :: AsyncIO Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: Apache Software License Classifier: Operating System :: POSIX Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: Microsoft :: Windows Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Topic :: Internet :: WWW/HTTP Requires-Python: >=3.8 Description-Content-Type: text/x-rst License-File: LICENSE.txt Requires-Dist: aiosignal>=1.1.2 Requires-Dist: attrs>=17.3.0 Requires-Dist: async-timeout<5.0,>=4.0; python_version < "3.11" Requires-Dist: frozenlist>=1.1.1 Requires-Dist: multidict<7.0,>=4.5 Requires-Dist: yarl<2.0,>=1.0 Provides-Extra: speedups Requires-Dist: aiodns; (sys_platform == "linux" or sys_platform == "darwin") and extra == "speedups" Requires-Dist: Brotli; platform_python_implementation == "CPython" and extra == "speedups" Requires-Dist: brotlicffi; platform_python_implementation != "CPython" and extra == "speedups" ================================== Async http client/server framework ================================== .. image:: https://raw.githubusercontent.com/aio-libs/aiohttp/master/docs/aiohttp-plain.svg :height: 64px :width: 64px :alt: aiohttp logo | .. image:: https://github.com/aio-libs/aiohttp/workflows/CI/badge.svg :target: https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI :alt: GitHub Actions status for master branch .. image:: https://codecov.io/gh/aio-libs/aiohttp/branch/master/graph/badge.svg :target: https://codecov.io/gh/aio-libs/aiohttp :alt: codecov.io status for master branch .. image:: https://badge.fury.io/py/aiohttp.svg :target: https://pypi.org/project/aiohttp :alt: Latest PyPI package version .. image:: https://readthedocs.org/projects/aiohttp/badge/?version=latest :target: https://docs.aiohttp.org/ :alt: Latest Read The Docs .. image:: https://img.shields.io/matrix/aio-libs:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat :target: https://matrix.to/#/%23aio-libs:matrix.org :alt: Matrix Room — #aio-libs:matrix.org .. image:: https://img.shields.io/matrix/aio-libs-space:matrix.org?label=Discuss%20on%20Matrix%20at%20%23aio-libs-space%3Amatrix.org&logo=matrix&server_fqdn=matrix.org&style=flat :target: https://matrix.to/#/%23aio-libs-space:matrix.org :alt: Matrix Space — #aio-libs-space:matrix.org Key Features ============ - Supports both client and server side of HTTP protocol. - Supports both client and server Web-Sockets out-of-the-box and avoids Callback Hell. - Provides Web-server with middleware and pluggable routing. Getting started =============== Client ------ To get something from the web: .. code-block:: python import aiohttp import asyncio async def main(): async with aiohttp.ClientSession() as session: async with session.get('http://python.org') as response: print("Status:", response.status) print("Content-type:", response.headers['content-type']) html = await response.text() print("Body:", html[:15], "...") asyncio.run(main()) This prints: .. code-block:: Status: 200 Content-type: text/html; charset=utf-8 Body: ... Coming from `requests `_ ? Read `why we need so many lines `_. Server ------ An example using a simple server: .. code-block:: python # examples/server_simple.py from aiohttp import web async def handle(request): name = request.match_info.get('name', "Anonymous") text = "Hello, " + name return web.Response(text=text) async def wshandle(request): ws = web.WebSocketResponse() await ws.prepare(request) async for msg in ws: if msg.type == web.WSMsgType.text: await ws.send_str("Hello, {}".format(msg.data)) elif msg.type == web.WSMsgType.binary: await ws.send_bytes(msg.data) elif msg.type == web.WSMsgType.close: break return ws app = web.Application() app.add_routes([web.get('/', handle), web.get('/echo', wshandle), web.get('/{name}', handle)]) if __name__ == '__main__': web.run_app(app) Documentation ============= https://aiohttp.readthedocs.io/ Demos ===== https://github.com/aio-libs/aiohttp-demos External links ============== * `Third party libraries `_ * `Built with aiohttp `_ * `Powered by aiohttp `_ Feel free to make a Pull Request for adding your link to these pages! Communication channels ====================== *aio-libs Discussions*: https://github.com/aio-libs/aiohttp/discussions *gitter chat* https://gitter.im/aio-libs/Lobby We support `Stack Overflow `_. Please add *aiohttp* tag to your question there. Requirements ============ - async-timeout_ - attrs_ - multidict_ - yarl_ - frozenlist_ Optionally you may install the aiodns_ library (highly recommended for sake of speed). .. _aiodns: https://pypi.python.org/pypi/aiodns .. _attrs: https://github.com/python-attrs/attrs .. _multidict: https://pypi.python.org/pypi/multidict .. _frozenlist: https://pypi.org/project/frozenlist/ .. _yarl: https://pypi.python.org/pypi/yarl .. _async-timeout: https://pypi.python.org/pypi/async_timeout License ======= ``aiohttp`` is offered under the Apache 2 license. Keepsafe ======== The aiohttp community would like to thank Keepsafe (https://www.getkeepsafe.com) for its support in the early days of the project. Source code =========== The latest developer version is available in a GitHub repository: https://github.com/aio-libs/aiohttp Benchmarks ========== If you are interested in efficiency, the AsyncIO community maintains a list of benchmarks on the official wiki: https://github.com/python/asyncio/wiki/Benchmarks ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285830.0 aiohttp-3.9.5/aiohttp.egg-info/SOURCES.txt0000644000175100001770000002071214607525306017645 0ustar00runnerdockerCHANGES.rst CONTRIBUTORS.txt LICENSE.txt MANIFEST.in Makefile README.rst pyproject.toml setup.cfg setup.py aiohttp/__init__.py aiohttp/_cparser.pxd aiohttp/_find_header.c aiohttp/_find_header.h aiohttp/_find_header.pxd aiohttp/_headers.pxi aiohttp/_helpers.c aiohttp/_helpers.pyi aiohttp/_helpers.pyx aiohttp/_http_parser.c aiohttp/_http_parser.pyx aiohttp/_http_writer.c aiohttp/_http_writer.pyx aiohttp/_websocket.c aiohttp/_websocket.pyx aiohttp/abc.py aiohttp/base_protocol.py aiohttp/client.py aiohttp/client_exceptions.py aiohttp/client_proto.py aiohttp/client_reqrep.py aiohttp/client_ws.py aiohttp/compression_utils.py aiohttp/connector.py aiohttp/cookiejar.py aiohttp/formdata.py aiohttp/hdrs.py aiohttp/helpers.py aiohttp/http.py aiohttp/http_exceptions.py aiohttp/http_parser.py aiohttp/http_websocket.py aiohttp/http_writer.py aiohttp/locks.py aiohttp/log.py aiohttp/multipart.py aiohttp/payload.py aiohttp/payload_streamer.py aiohttp/py.typed aiohttp/pytest_plugin.py aiohttp/resolver.py aiohttp/streams.py aiohttp/tcp_helpers.py aiohttp/test_utils.py aiohttp/tracing.py aiohttp/typedefs.py aiohttp/web.py aiohttp/web_app.py aiohttp/web_exceptions.py aiohttp/web_fileresponse.py aiohttp/web_log.py aiohttp/web_middlewares.py aiohttp/web_protocol.py aiohttp/web_request.py aiohttp/web_response.py aiohttp/web_routedef.py aiohttp/web_runner.py aiohttp/web_server.py aiohttp/web_urldispatcher.py aiohttp/web_ws.py aiohttp/worker.py aiohttp.egg-info/PKG-INFO aiohttp.egg-info/SOURCES.txt aiohttp.egg-info/dependency_links.txt aiohttp.egg-info/not-zip-safe aiohttp.egg-info/requires.txt aiohttp.egg-info/top_level.txt aiohttp/.hash/_cparser.pxd.hash aiohttp/.hash/_find_header.pxd.hash aiohttp/.hash/_helpers.pyi.hash aiohttp/.hash/_helpers.pyx.hash aiohttp/.hash/_http_parser.pyx.hash aiohttp/.hash/_http_writer.pyx.hash aiohttp/.hash/_websocket.pyx.hash aiohttp/.hash/hdrs.py.hash docs/Makefile docs/abc.rst docs/aiohttp-icon.svg docs/aiohttp-plain.svg docs/built_with.rst docs/changes.rst docs/client.rst docs/client_advanced.rst docs/client_quickstart.rst docs/client_reference.rst docs/conf.py docs/contributing-admins.rst docs/contributing.rst docs/deployment.rst docs/essays.rst docs/external.rst docs/faq.rst docs/favicon.ico docs/glossary.rst docs/http_request_lifecycle.rst docs/index.rst docs/logging.rst docs/make.bat docs/migration_to_2xx.rst docs/misc.rst docs/multipart.rst docs/multipart_reference.rst docs/new_router.rst docs/old-logo.png docs/old-logo.svg docs/powered_by.rst docs/spelling_wordlist.txt docs/streams.rst docs/structures.rst docs/testing.rst docs/third_party.rst docs/tracing_reference.rst docs/utilities.rst docs/web.rst docs/web_advanced.rst docs/web_lowlevel.rst docs/web_quickstart.rst docs/web_reference.rst docs/websocket_utilities.rst docs/whats_new_1_1.rst docs/whats_new_3_0.rst docs/_static/css/logo-adjustments.css docs/_static/img/contributing-cov-comment.svg docs/_static/img/contributing-cov-header.svg docs/_static/img/contributing-cov-miss.svg docs/_static/img/contributing-cov-partial.svg examples/__init__.py examples/background_tasks.py examples/cli_app.py examples/client_auth.py examples/client_json.py examples/client_ws.py examples/curl.py examples/fake_server.py examples/lowlevel_srv.py examples/server.crt examples/server.csr examples/server.key examples/server_simple.py examples/static_files.py examples/web_classview.py examples/web_cookies.py examples/web_rewrite_headers_middleware.py examples/web_srv.py examples/web_srv_route_deco.py examples/web_srv_route_table.py examples/web_ws.py examples/websocket.html requirements/base.in requirements/base.txt requirements/broken-projects.in requirements/constraints.in requirements/constraints.txt requirements/cython.in requirements/cython.txt requirements/dev.in requirements/dev.txt requirements/doc-spelling.in requirements/doc-spelling.txt requirements/doc.in requirements/doc.txt requirements/lint.in requirements/lint.txt requirements/multidict.in requirements/multidict.txt requirements/runtime-deps.in requirements/runtime-deps.txt requirements/sync-direct-runtime-deps.py requirements/test.in requirements/test.txt requirements/typing-extensions.in requirements/typing-extensions.txt requirements/.hash/cython.txt.hash tests/aiohttp.jpg tests/aiohttp.png tests/conftest.py tests/data.unknown_mime_type tests/data.zero_bytes tests/sample.txt tests/test_base_protocol.py tests/test_circular_imports.py tests/test_classbasedview.py tests/test_client_connection.py tests/test_client_exceptions.py tests/test_client_fingerprint.py tests/test_client_functional.py tests/test_client_proto.py tests/test_client_request.py tests/test_client_response.py tests/test_client_session.py tests/test_client_ws.py tests/test_client_ws_functional.py tests/test_connector.py tests/test_cookiejar.py tests/test_flowcontrol_streams.py tests/test_formdata.py tests/test_helpers.py tests/test_http_exceptions.py tests/test_http_parser.py tests/test_http_writer.py tests/test_imports.py tests/test_locks.py tests/test_loop.py tests/test_multipart.py tests/test_multipart_helpers.py tests/test_payload.py tests/test_proxy.py tests/test_proxy_functional.py tests/test_pytest_plugin.py tests/test_resolver.py tests/test_route_def.py tests/test_run_app.py tests/test_streams.py tests/test_tcp_helpers.py tests/test_test_utils.py tests/test_tracing.py tests/test_urldispatch.py tests/test_web_app.py tests/test_web_cli.py tests/test_web_exceptions.py tests/test_web_functional.py tests/test_web_log.py tests/test_web_middleware.py tests/test_web_request.py tests/test_web_request_handler.py tests/test_web_response.py tests/test_web_runner.py tests/test_web_sendfile.py tests/test_web_sendfile_functional.py tests/test_web_server.py tests/test_web_urldispatcher.py tests/test_web_websocket.py tests/test_web_websocket_functional.py tests/test_websocket_handshake.py tests/test_websocket_parser.py tests/test_websocket_writer.py tests/test_worker.py tests/autobahn/Dockerfile.aiohttp tests/autobahn/Dockerfile.autobahn tests/autobahn/test_autobahn.py tests/autobahn/client/client.py tests/autobahn/client/fuzzingserver.json tests/autobahn/server/fuzzingclient.json tests/autobahn/server/server.py vendor/README.rst vendor/llhttp/.dockerignore vendor/llhttp/.eslintrc.js vendor/llhttp/.git vendor/llhttp/.gitignore vendor/llhttp/.npmrc vendor/llhttp/CMakeLists.txt vendor/llhttp/CNAME vendor/llhttp/CODE_OF_CONDUCT.md vendor/llhttp/Dockerfile vendor/llhttp/LICENSE-MIT vendor/llhttp/Makefile vendor/llhttp/README.md vendor/llhttp/_config.yml vendor/llhttp/eslint.json vendor/llhttp/libllhttp.pc.in vendor/llhttp/package-lock.json vendor/llhttp/package.json vendor/llhttp/tsconfig.base.json vendor/llhttp/tsconfig.eslint.json vendor/llhttp/tsconfig.json vendor/llhttp/.github/dependabot.yml vendor/llhttp/.github/workflows/aiohttp.yml vendor/llhttp/.github/workflows/ci.yaml vendor/llhttp/.github/workflows/codeql.yml vendor/llhttp/.github/workflows/scorecards.yml vendor/llhttp/bench/index.ts vendor/llhttp/bin/build_wasm.ts vendor/llhttp/bin/generate.ts vendor/llhttp/build/llhttp.h vendor/llhttp/build/c/llhttp.c vendor/llhttp/docs/releasing.md vendor/llhttp/examples/wasm.ts vendor/llhttp/images/http-loose-none.png vendor/llhttp/images/http-strict-none.png vendor/llhttp/src/common.gypi vendor/llhttp/src/llhttp.gyp vendor/llhttp/src/llhttp.ts vendor/llhttp/src/llhttp/c-headers.ts vendor/llhttp/src/llhttp/constants.ts vendor/llhttp/src/llhttp/http.ts vendor/llhttp/src/llhttp/url.ts vendor/llhttp/src/llhttp/utils.ts vendor/llhttp/src/native/api.c vendor/llhttp/src/native/api.h vendor/llhttp/src/native/http.c vendor/llhttp/test/md-test.ts vendor/llhttp/test/url.md vendor/llhttp/test/fixtures/extra.c vendor/llhttp/test/fixtures/index.ts vendor/llhttp/test/fuzzers/fuzz_parser.c vendor/llhttp/test/request/connection.md vendor/llhttp/test/request/content-length.md vendor/llhttp/test/request/finish.md vendor/llhttp/test/request/invalid.md vendor/llhttp/test/request/lenient-headers.md vendor/llhttp/test/request/lenient-version.md vendor/llhttp/test/request/method.md vendor/llhttp/test/request/pausing.md vendor/llhttp/test/request/pipelining.md vendor/llhttp/test/request/sample.md vendor/llhttp/test/request/transfer-encoding.md vendor/llhttp/test/request/uri.md vendor/llhttp/test/response/connection.md vendor/llhttp/test/response/content-length.md vendor/llhttp/test/response/finish.md vendor/llhttp/test/response/invalid.md vendor/llhttp/test/response/lenient-version.md vendor/llhttp/test/response/pausing.md vendor/llhttp/test/response/pipelining.md vendor/llhttp/test/response/sample.md vendor/llhttp/test/response/transfer-encoding.md././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285830.0 aiohttp-3.9.5/aiohttp.egg-info/dependency_links.txt0000644000175100001770000000000114607525306022025 0ustar00runnerdocker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285830.0 aiohttp-3.9.5/aiohttp.egg-info/not-zip-safe0000644000175100001770000000000114607525306020205 0ustar00runnerdocker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285830.0 aiohttp-3.9.5/aiohttp.egg-info/requires.txt0000644000175100001770000000053514607525306020362 0ustar00runnerdockeraiosignal>=1.1.2 attrs>=17.3.0 frozenlist>=1.1.1 multidict<7.0,>=4.5 yarl<2.0,>=1.0 [:python_version < "3.11"] async-timeout<5.0,>=4.0 [speedups] [speedups:platform_python_implementation != "CPython"] brotlicffi [speedups:platform_python_implementation == "CPython"] Brotli [speedups:sys_platform == "linux" or sys_platform == "darwin"] aiodns ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285830.0 aiohttp-3.9.5/aiohttp.egg-info/top_level.txt0000644000175100001770000000001014607525306020500 0ustar00runnerdockeraiohttp ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1713285830.5151148 aiohttp-3.9.5/docs/0000755000175100001770000000000014607525307013546 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/Makefile0000644000175100001770000001535614607525266015224 0ustar00runnerdocker# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = -W --keep-going -n SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/aiohttp.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/aiohttp.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/aiohttp" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/aiohttp" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." spelling: $(SPHINXBUILD) -b spelling $(ALLSPHINXOPTS) $(BUILDDIR)/spelling @echo @echo "Build finished." ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1713285830.483115 aiohttp-3.9.5/docs/_static/0000755000175100001770000000000014607525306015173 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1713285830.5151148 aiohttp-3.9.5/docs/_static/css/0000755000175100001770000000000014607525307015764 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/_static/css/logo-adjustments.css0000644000175100001770000000015614607525266022003 0ustar00runnerdocker.sphinxsidebarwrapper>h1.logo { display: none; } .sphinxsidebarwrapper>p.logo>a>img.logo { width: 65%; } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1713285830.5151148 aiohttp-3.9.5/docs/_static/img/0000755000175100001770000000000014607525307015750 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/_static/img/contributing-cov-comment.svg0000644000175100001770000001503714607525266023437 0ustar00runnerdocker + Hits 31428 31504 +76 - Misses 632 633 +1 - Partials 203 205 +2 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/_static/img/contributing-cov-header.svg0000644000175100001770000000440114607525266023216 0ustar00runnerdocker Codecov Report ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/_static/img/contributing-cov-miss.svg0000644000175100001770000033263514607525266022756 0ustar00runnerdocker 733 740 async def resolve ( self , request : Request ) - > _Resolve : 15 734 741 if ( ! 735 742 not request . url . raw_path . startswith ( self . _prefix2 ) 736 743 and request . url . raw_path != self . _prefix 737 744 ) : 738 745 return None , set ( ) 739 746 match_info = await self . _app . router . resolve ( request ) 15 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/_static/img/contributing-cov-partial.svg0000644000175100001770000012252414607525266023431 0ustar00runnerdocker 1001 + url_part = request . rel_url . raw_path 15 1002 + while url_part : ! 1003 + for candidate in resource_index . get ( url_part , ( ) ) : 15 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/abc.rst0000644000175100001770000001326614607525266015041 0ustar00runnerdocker.. _aiohttp-abc: Abstract Base Classes ===================== .. module:: aiohttp.abc Abstract routing ---------------- aiohttp has abstract classes for managing web interfaces. The most part of :mod:`aiohttp.web` is not intended to be inherited but few of them are. aiohttp.web is built on top of few concepts: *application*, *router*, *request* and *response*. *router* is a *pluggable* part: a library user may build a *router* from scratch, all other parts should work with new router seamlessly. :class:`aiohttp.abc.AbstractRouter` has the only mandatory method: :meth:`aiohttp.abc.AbstractRouter.resolve` coroutine. It must return an :class:`aiohttp.abc.AbstractMatchInfo` instance. If the requested URL handler is found :meth:`aiohttp.abc.AbstractMatchInfo.handler` is a :term:`web-handler` for requested URL and :attr:`aiohttp.abc.AbstractMatchInfo.http_exception` is ``None``. Otherwise :attr:`aiohttp.abc.AbstractMatchInfo.http_exception` is an instance of :exc:`~aiohttp.web.HTTPException` like *404: NotFound* or *405: Method Not Allowed*. :meth:`aiohttp.abc.AbstractMatchInfo.handler` raises :attr:`~aiohttp.abc.AbstractMatchInfo.http_exception` on call. .. class:: AbstractRouter Abstract router, :class:`aiohttp.web.Application` accepts it as *router* parameter and returns as :attr:`aiohttp.web.Application.router`. .. method:: resolve(request) :async: Performs URL resolving. It's an abstract method, should be overridden in *router* implementation. :param request: :class:`aiohttp.web.Request` instance for resolving, the request has :attr:`aiohttp.web.Request.match_info` equals to ``None`` at resolving stage. :return: :class:`aiohttp.abc.AbstractMatchInfo` instance. .. class:: AbstractMatchInfo Abstract *match info*, returned by :meth:`aiohttp.abc.AbstractRouter.resolve` call. .. attribute:: http_exception :exc:`aiohttp.web.HTTPException` if no match was found, ``None`` otherwise. .. method:: handler(request) :async: Abstract method performing :term:`web-handler` processing. :param request: :class:`aiohttp.web.Request` instance for resolving, the request has :attr:`aiohttp.web.Request.match_info` equals to ``None`` at resolving stage. :return: :class:`aiohttp.web.StreamResponse` or descendants. :raise: :class:`aiohttp.web.HTTPException` on error .. method:: expect_handler(request) :async: Abstract method for handling *100-continue* processing. Abstract Class Based Views -------------------------- For *class based view* support aiohttp has abstract :class:`AbstractView` class which is *awaitable* (may be uses like ``await Cls()`` or ``yield from Cls()`` and has a *request* as an attribute. .. class:: AbstractView An abstract class, base for all *class based views* implementations. Methods ``__iter__`` and ``__await__`` should be overridden. .. attribute:: request :class:`aiohttp.web.Request` instance for performing the request. Abstract Cookie Jar ------------------- .. class:: AbstractCookieJar The cookie jar instance is available as :attr:`aiohttp.ClientSession.cookie_jar`. The jar contains :class:`~http.cookies.Morsel` items for storing internal cookie data. API provides a count of saved cookies:: len(session.cookie_jar) These cookies may be iterated over:: for cookie in session.cookie_jar: print(cookie.key) print(cookie["domain"]) An abstract class for cookie storage. Implements :class:`collections.abc.Iterable` and :class:`collections.abc.Sized`. .. method:: update_cookies(cookies, response_url=None) Update cookies returned by server in ``Set-Cookie`` header. :param cookies: a :class:`collections.abc.Mapping` (e.g. :class:`dict`, :class:`~http.cookies.SimpleCookie`) or *iterable* of *pairs* with cookies returned by server's response. :param str response_url: URL of response, ``None`` for *shared cookies*. Regular cookies are coupled with server's URL and are sent only to this server, shared ones are sent in every client request. .. method:: filter_cookies(request_url) Return jar's cookies acceptable for URL and available in ``Cookie`` header for sending client requests for given URL. :param str response_url: request's URL for which cookies are asked. :return: :class:`http.cookies.SimpleCookie` with filtered cookies for given URL. .. method:: clear(predicate=None) Removes all cookies from the jar if the predicate is ``None``. Otherwise remove only those :class:`~http.cookies.Morsel` that ``predicate(morsel)`` returns ``True``. :param predicate: callable that gets :class:`~http.cookies.Morsel` as a parameter and returns ``True`` if this :class:`~http.cookies.Morsel` must be deleted from the jar. .. versionadded:: 3.8 .. method:: clear_domain(domain) Remove all cookies from the jar that belongs to the specified domain or its subdomains. :param str domain: domain for which cookies must be deleted from the jar. .. versionadded:: 3.8 Abstract Access Logger ------------------------------- .. class:: AbstractAccessLogger An abstract class, base for all :class:`aiohttp.web.RequestHandler` ``access_logger`` implementations Method ``log`` should be overridden. .. method:: log(request, response, time) :param request: :class:`aiohttp.web.Request` object. :param response: :class:`aiohttp.web.Response` object. :param float time: Time taken to serve the request. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/aiohttp-icon.svg0000644000175100001770000000453714607525266016702 0ustar00runnerdocker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/aiohttp-plain.svg0000644000175100001770000000453514607525266017053 0ustar00runnerdocker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/built_with.rst0000644000175100001770000000247314607525266016464 0ustar00runnerdocker.. _aiohttp-built-with: Built with aiohttp ================== aiohttp is used to build useful libraries built on top of it, and there's a page dedicated to list them: :ref:`aiohttp-3rd-party`. There are also projects that leverage the power of aiohttp to provide end-user tools, like command lines or software with full user interfaces. This page aims to list those projects. If you are using aiohttp in your software and if it's playing a central role, you can add it here in this list. You can also add a **Built with aiohttp** link somewhere in your project, pointing to ``_. * `Pulp `_ Platform for managing repositories of software packages and making them available to consumers. * `Molotov `_ Load testing tool. * `Arsenic `_ Async WebDriver. * `Home Assistant `_ Home Automation Platform. * `Backend.AI `_ Code execution API service. * `doh-proxy `_ DNS Over HTTPS Proxy. * `Mariner `_ Command-line torrent searcher. * `DEEPaaS API `_ REST API for Machine learning, Deep learning and artificial intelligence applications. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/changes.rst0000644000175100001770000000060214607525266015712 0ustar00runnerdocker.. _aiohttp_changes: ========= Changelog ========= .. only:: not is_release To be included in v\ |release| (if present) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. towncrier-draft-entries:: |release| [UNRELEASED DRAFT] Released versions ^^^^^^^^^^^^^^^^^ .. include:: ../CHANGES.rst :start-after: .. towncrier release notes start .. include:: ../HISTORY.rst ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/client.rst0000644000175100001770000000056614607525266015571 0ustar00runnerdocker.. _aiohttp-client: Client ====== .. currentmodule:: aiohttp The page contains all information about aiohttp Client API: .. toctree:: :name: client :maxdepth: 3 Quickstart Advanced Usage Reference Tracing Reference The aiohttp Request Lifecycle ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/client_advanced.rst0000644000175100001770000005724314607525266017422 0ustar00runnerdocker.. _aiohttp-client-advanced: Advanced Client Usage ===================== .. currentmodule:: aiohttp .. _aiohttp-client-session: Client Session -------------- :class:`ClientSession` is the heart and the main entry point for all client API operations. Create the session first, use the instance for performing HTTP requests and initiating WebSocket connections. The session contains a cookie storage and connection pool, thus cookies and connections are shared between HTTP requests sent by the same session. Custom Request Headers ---------------------- If you need to add HTTP headers to a request, pass them in a :class:`dict` to the *headers* parameter. For example, if you want to specify the content-type directly:: url = 'http://example.com/image' payload = b'GIF89a\x01\x00\x01\x00\x00\xff\x00,\x00\x00' b'\x00\x00\x01\x00\x01\x00\x00\x02\x00;' headers = {'content-type': 'image/gif'} await session.post(url, data=payload, headers=headers) You also can set default headers for all session requests:: headers={"Authorization": "Basic bG9naW46cGFzcw=="} async with aiohttp.ClientSession(headers=headers) as session: async with session.get("http://httpbin.org/headers") as r: json_body = await r.json() assert json_body['headers']['Authorization'] == \ 'Basic bG9naW46cGFzcw==' Typical use case is sending JSON body. You can specify content type directly as shown above, but it is more convenient to use special keyword ``json``:: await session.post(url, json={'example': 'text'}) For *text/plain* :: await session.post(url, data='Привет, Мир!') .. note:: ``Authorization`` header will be removed if you get redirected to a different host or protocol. Custom Cookies -------------- To send your own cookies to the server, you can use the *cookies* parameter of :class:`ClientSession` constructor:: url = 'http://httpbin.org/cookies' cookies = {'cookies_are': 'working'} async with ClientSession(cookies=cookies) as session: async with session.get(url) as resp: assert await resp.json() == { "cookies": {"cookies_are": "working"}} .. note:: ``httpbin.org/cookies`` endpoint returns request cookies in JSON-encoded body. To access session cookies see :attr:`ClientSession.cookie_jar`. :class:`~aiohttp.ClientSession` may be used for sharing cookies between multiple requests:: async with aiohttp.ClientSession() as session: await session.get( 'http://httpbin.org/cookies/set?my_cookie=my_value') filtered = session.cookie_jar.filter_cookies( 'http://httpbin.org') assert filtered['my_cookie'].value == 'my_value' async with session.get('http://httpbin.org/cookies') as r: json_body = await r.json() assert json_body['cookies']['my_cookie'] == 'my_value' Response Headers and Cookies ---------------------------- We can view the server's response :attr:`ClientResponse.headers` using a :class:`~multidict.CIMultiDictProxy`:: assert resp.headers == { 'ACCESS-CONTROL-ALLOW-ORIGIN': '*', 'CONTENT-TYPE': 'application/json', 'DATE': 'Tue, 15 Jul 2014 16:49:51 GMT', 'SERVER': 'gunicorn/18.0', 'CONTENT-LENGTH': '331', 'CONNECTION': 'keep-alive'} The dictionary is special, though: it's made just for HTTP headers. According to `RFC 7230 `_, HTTP Header names are case-insensitive. It also supports multiple values for the same key as HTTP protocol does. So, we can access the headers using any capitalization we want:: assert resp.headers['Content-Type'] == 'application/json' assert resp.headers.get('content-type') == 'application/json' All headers are converted from binary data using UTF-8 with ``surrogateescape`` option. That works fine on most cases but sometimes unconverted data is needed if a server uses nonstandard encoding. While these headers are malformed from :rfc:`7230` perspective they may be retrieved by using :attr:`ClientResponse.raw_headers` property:: assert resp.raw_headers == ( (b'SERVER', b'nginx'), (b'DATE', b'Sat, 09 Jan 2016 20:28:40 GMT'), (b'CONTENT-TYPE', b'text/html; charset=utf-8'), (b'CONTENT-LENGTH', b'12150'), (b'CONNECTION', b'keep-alive')) If a response contains some *HTTP Cookies*, you can quickly access them:: url = 'http://example.com/some/cookie/setting/url' async with session.get(url) as resp: print(resp.cookies['example_cookie_name']) .. note:: Response cookies contain only values, that were in ``Set-Cookie`` headers of the **last** request in redirection chain. To gather cookies between all redirection requests please use :ref:`aiohttp.ClientSession ` object. Redirection History ------------------- If a request was redirected, it is possible to view previous responses using the :attr:`~ClientResponse.history` attribute:: resp = await session.get('http://example.com/some/redirect/') assert resp.status == 200 assert resp.url = URL('http://example.com/some/other/url/') assert len(resp.history) == 1 assert resp.history[0].status == 301 assert resp.history[0].url = URL( 'http://example.com/some/redirect/') If no redirects occurred or ``allow_redirects`` is set to ``False``, history will be an empty sequence. Cookie Jar ---------- .. _aiohttp-client-cookie-safety: Cookie Safety ^^^^^^^^^^^^^ By default :class:`~aiohttp.ClientSession` uses strict version of :class:`aiohttp.CookieJar`. :rfc:`2109` explicitly forbids cookie accepting from URLs with IP address instead of DNS name (e.g. ``http://127.0.0.1:80/cookie``). It's good but sometimes for testing we need to enable support for such cookies. It should be done by passing ``unsafe=True`` to :class:`aiohttp.CookieJar` constructor:: jar = aiohttp.CookieJar(unsafe=True) session = aiohttp.ClientSession(cookie_jar=jar) .. _aiohttp-client-cookie-quoting-routine: Cookie Quoting Routine ^^^^^^^^^^^^^^^^^^^^^^ The client uses the :class:`~aiohttp.SimpleCookie` quoting routines conform to the :rfc:`2109`, which in turn references the character definitions from :rfc:`2068`. They provide a two-way quoting algorithm where any non-text character is translated into a 4 character sequence: a forward-slash followed by the three-digit octal equivalent of the character. Any ``\`` or ``"`` is quoted with a preceding ``\`` slash. Because of the way browsers really handle cookies (as opposed to what the RFC says) we also encode ``,`` and ``;``. Some backend systems does not support quoted cookies. You can skip this quotation routine by passing ``quote_cookie=False`` to the :class:`~aiohttp.CookieJar` constructor:: jar = aiohttp.CookieJar(quote_cookie=False) session = aiohttp.ClientSession(cookie_jar=jar) .. _aiohttp-client-dummy-cookie-jar: Dummy Cookie Jar ^^^^^^^^^^^^^^^^ Sometimes cookie processing is not desirable. For this purpose it's possible to pass :class:`aiohttp.DummyCookieJar` instance into client session:: jar = aiohttp.DummyCookieJar() session = aiohttp.ClientSession(cookie_jar=jar) Uploading pre-compressed data ----------------------------- To upload data that is already compressed before passing it to aiohttp, call the request function with the used compression algorithm name (usually ``deflate`` or ``gzip``) as the value of the ``Content-Encoding`` header:: async def my_coroutine(session, headers, my_data): data = zlib.compress(my_data) headers = {'Content-Encoding': 'deflate'} async with session.post('http://httpbin.org/post', data=data, headers=headers) pass Disabling content type validation for JSON responses ---------------------------------------------------- The standard explicitly restricts JSON ``Content-Type`` HTTP header to ``application/json`` or any extended form, e.g. ``application/vnd.custom-type+json``. Unfortunately, some servers send a wrong type, like ``text/html``. This can be worked around in two ways: 1. Pass the expected type explicitly (in this case checking will be strict, without the extended form support, so ``custom/xxx+type`` won't be accepted): ``await resp.json(content_type='custom/type')``. 2. Disable the check entirely: ``await resp.json(content_type=None)``. .. _aiohttp-client-tracing: Client Tracing -------------- The execution flow of a specific request can be followed attaching listeners coroutines to the signals provided by the :class:`TraceConfig` instance, this instance will be used as a parameter for the :class:`ClientSession` constructor having as a result a client that triggers the different signals supported by the :class:`TraceConfig`. By default any instance of :class:`ClientSession` class comes with the signals ability disabled. The following snippet shows how the start and the end signals of a request flow can be followed:: async def on_request_start( session, trace_config_ctx, params): print("Starting request") async def on_request_end(session, trace_config_ctx, params): print("Ending request") trace_config = aiohttp.TraceConfig() trace_config.on_request_start.append(on_request_start) trace_config.on_request_end.append(on_request_end) async with aiohttp.ClientSession( trace_configs=[trace_config]) as client: client.get('http://example.com/some/redirect/') The ``trace_configs`` is a list that can contain instances of :class:`TraceConfig` class that allow run the signals handlers coming from different :class:`TraceConfig` instances. The following example shows how two different :class:`TraceConfig` that have a different nature are installed to perform their job in each signal handle:: from mylib.traceconfig import AuditRequest from mylib.traceconfig import XRay async with aiohttp.ClientSession( trace_configs=[AuditRequest(), XRay()]) as client: client.get('http://example.com/some/redirect/') All signals take as a parameters first, the :class:`ClientSession` instance used by the specific request related to that signals and second, a :class:`~types.SimpleNamespace` instance called ``trace_config_ctx``. The ``trace_config_ctx`` object can be used to share the state through to the different signals that belong to the same request and to the same :class:`TraceConfig` class, perhaps:: async def on_request_start( session, trace_config_ctx, params): trace_config_ctx.start = asyncio.get_event_loop().time() async def on_request_end(session, trace_config_ctx, params): elapsed = asyncio.get_event_loop().time() - trace_config_ctx.start print("Request took {}".format(elapsed)) The ``trace_config_ctx`` param is by default a :class:`~types.SimpleNamespace` that is initialized at the beginning of the request flow. However, the factory used to create this object can be overwritten using the ``trace_config_ctx_factory`` constructor param of the :class:`TraceConfig` class. The ``trace_request_ctx`` param can given at the beginning of the request execution, accepted by all of the HTTP verbs, and will be passed as a keyword argument for the ``trace_config_ctx_factory`` factory. This param is useful to pass data that is only available at request time, perhaps:: async def on_request_start( session, trace_config_ctx, params): print(trace_config_ctx.trace_request_ctx) session.get('http://example.com/some/redirect/', trace_request_ctx={'foo': 'bar'}) .. seealso:: :ref:`aiohttp-client-tracing-reference` section for more information about the different signals supported. Connectors ---------- To tweak or change *transport* layer of requests you can pass a custom *connector* to :class:`~aiohttp.ClientSession` and family. For example:: conn = aiohttp.TCPConnector() session = aiohttp.ClientSession(connector=conn) .. note:: By default *session* object takes the ownership of the connector, among other things closing the connections once the *session* is closed. If you are keen on share the same *connector* through different *session* instances you must give the *connector_owner* parameter as **False** for each *session* instance. .. seealso:: :ref:`aiohttp-client-reference-connectors` section for more information about different connector types and configuration options. Limiting connection pool size ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ To limit amount of simultaneously opened connections you can pass *limit* parameter to *connector*:: conn = aiohttp.TCPConnector(limit=30) The example limits total amount of parallel connections to `30`. The default is `100`. If you explicitly want not to have limits, pass `0`. For example:: conn = aiohttp.TCPConnector(limit=0) To limit amount of simultaneously opened connection to the same endpoint (``(host, port, is_ssl)`` triple) you can pass *limit_per_host* parameter to *connector*:: conn = aiohttp.TCPConnector(limit_per_host=30) The example limits amount of parallel connections to the same to `30`. The default is `0` (no limit on per host bases). Tuning the DNS cache ^^^^^^^^^^^^^^^^^^^^ By default :class:`~aiohttp.TCPConnector` comes with the DNS cache table enabled, and resolutions will be cached by default for `10` seconds. This behavior can be changed either to change of the TTL for a resolution, as can be seen in the following example:: conn = aiohttp.TCPConnector(ttl_dns_cache=300) or disabling the use of the DNS cache table, meaning that all requests will end up making a DNS resolution, as the following example shows:: conn = aiohttp.TCPConnector(use_dns_cache=False) Resolving using custom nameservers ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In order to specify the nameservers to when resolving the hostnames, :term:`aiodns` is required:: from aiohttp.resolver import AsyncResolver resolver = AsyncResolver(nameservers=["8.8.8.8", "8.8.4.4"]) conn = aiohttp.TCPConnector(resolver=resolver) Unix domain sockets ^^^^^^^^^^^^^^^^^^^ If your HTTP server uses UNIX domain sockets you can use :class:`~aiohttp.UnixConnector`:: conn = aiohttp.UnixConnector(path='/path/to/socket') session = aiohttp.ClientSession(connector=conn) Named pipes in Windows ^^^^^^^^^^^^^^^^^^^^^^ If your HTTP server uses Named pipes you can use :class:`~aiohttp.NamedPipeConnector`:: conn = aiohttp.NamedPipeConnector(path=r'\\.\pipe\') session = aiohttp.ClientSession(connector=conn) It will only work with the ProactorEventLoop SSL control for TCP sockets --------------------------- By default *aiohttp* uses strict checks for HTTPS protocol. Certification checks can be relaxed by setting *ssl* to ``False``:: r = await session.get('https://example.com', ssl=False) If you need to setup custom ssl parameters (use own certification files for example) you can create a :class:`ssl.SSLContext` instance and pass it into the :meth:`ClientSession.request` methods or set it for the entire session with ``ClientSession(connector=TCPConnector(ssl=ssl_context))``. There are explicit errors when ssl verification fails :class:`aiohttp.ClientConnectorSSLError`:: try: await session.get('https://expired.badssl.com/') except aiohttp.ClientConnectorSSLError as e: assert isinstance(e, ssl.SSLError) :class:`aiohttp.ClientConnectorCertificateError`:: try: await session.get('https://wrong.host.badssl.com/') except aiohttp.ClientConnectorCertificateError as e: assert isinstance(e, ssl.CertificateError) If you need to skip both ssl related errors :class:`aiohttp.ClientSSLError`:: try: await session.get('https://expired.badssl.com/') except aiohttp.ClientSSLError as e: assert isinstance(e, ssl.SSLError) try: await session.get('https://wrong.host.badssl.com/') except aiohttp.ClientSSLError as e: assert isinstance(e, ssl.CertificateError) Example: Use certifi ^^^^^^^^^^^^^^^^^^^^ By default, Python uses the system CA certificates. In rare cases, these may not be installed or Python is unable to find them, resulting in a error like `ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate` One way to work around this problem is to use the `certifi` package:: ssl_context = ssl.create_default_context(cafile=certifi.where()) async with ClientSession(connector=TCPConnector(ssl=ssl_context)) as sess: ... Example: Use self-signed certificate ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If you need to verify *self-signed* certificates, you need to add a call to :meth:`ssl.SSLContext.load_cert_chain` with the key pair:: ssl_context = ssl.create_default_context() ssl_context.load_cert_chain("/path/to/client/public/device.pem", "/path/to/client/private/device.key") async with sess.get("https://example.com", ssl=ssl_context) as resp: ... Example: Verify certificate fingerprint ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You may also verify certificates via *SHA256* fingerprint:: # Attempt to connect to https://www.python.org # with a pin to a bogus certificate: bad_fp = b'0'*64 exc = None try: r = await session.get('https://www.python.org', ssl=aiohttp.Fingerprint(bad_fp)) except aiohttp.FingerprintMismatch as e: exc = e assert exc is not None assert exc.expected == bad_fp # www.python.org cert's actual fingerprint assert exc.got == b'...' Note that this is the fingerprint of the DER-encoded certificate. If you have the certificate in PEM format, you can convert it to DER with e.g:: openssl x509 -in crt.pem -inform PEM -outform DER > crt.der .. note:: Tip: to convert from a hexadecimal digest to a binary byte-string, you can use :func:`binascii.unhexlify`. *ssl* parameter could be passed to :class:`TCPConnector` as default, the value from :meth:`ClientSession.get` and others override default. .. _aiohttp-client-proxy-support: Proxy support ------------- aiohttp supports plain HTTP proxies and HTTP proxies that can be upgraded to HTTPS via the HTTP CONNECT method. aiohttp has a limited support for proxies that must be connected to via ``https://`` — see the info box below for more details. To connect, use the *proxy* parameter:: async with aiohttp.ClientSession() as session: async with session.get("http://python.org", proxy="http://proxy.com") as resp: print(resp.status) It also supports proxy authorization:: async with aiohttp.ClientSession() as session: proxy_auth = aiohttp.BasicAuth('user', 'pass') async with session.get("http://python.org", proxy="http://proxy.com", proxy_auth=proxy_auth) as resp: print(resp.status) Authentication credentials can be passed in proxy URL:: session.get("http://python.org", proxy="http://user:pass@some.proxy.com") Contrary to the ``requests`` library, it won't read environment variables by default. But you can do so by passing ``trust_env=True`` into :class:`aiohttp.ClientSession` constructor.:: async with aiohttp.ClientSession(trust_env=True) as session: async with session.get("http://python.org") as resp: print(resp.status) .. note:: aiohttp uses :func:`urllib.request.getproxies` for reading the proxy configuration (e.g. from the *HTTP_PROXY* etc. environment variables) and applies them for the *HTTP*, *HTTPS*, *WS* and *WSS* schemes. Hosts defined in ``no_proxy`` will bypass the proxy. .. versionadded:: 3.8 *WS_PROXY* and *WSS_PROXY* are supported since aiohttp v3.8. Proxy credentials are given from ``~/.netrc`` file if present (see :class:`aiohttp.ClientSession` for more details). .. attention:: As of now (Python 3.10), support for TLS in TLS is disabled for the transports that :py:mod:`asyncio` uses. If the further release of Python (say v3.11) toggles one attribute, it'll *just work™*. aiohttp v3.8 and higher is ready for this to happen and has code in place supports TLS-in-TLS, hence sending HTTPS requests over HTTPS proxy tunnels. ⚠️ For as long as your Python runtime doesn't declare the support for TLS-in-TLS, please don't file bugs with aiohttp but rather try to help the CPython upstream enable this feature. Meanwhile, if you *really* need this to work, there's a patch that may help you make it happen, include it into your app's code base: https://github.com/aio-libs/aiohttp/discussions/6044#discussioncomment-1432443. .. important:: When supplying a custom :py:class:`ssl.SSLContext` instance, bear in mind that it will be used not only to establish a TLS session with the HTTPS endpoint you're hitting but also to establish a TLS tunnel to the HTTPS proxy. To avoid surprises, make sure to set up the trust chain that would recognize TLS certificates used by both the endpoint and the proxy. Graceful Shutdown ----------------- When :class:`ClientSession` closes at the end of an ``async with`` block (or through a direct :meth:`ClientSession.close()` call), the underlying connection remains open due to asyncio internal details. In practice, the underlying connection will close after a short while. However, if the event loop is stopped before the underlying connection is closed, a ``ResourceWarning: unclosed transport`` warning is emitted (when warnings are enabled). To avoid this situation, a small delay must be added before closing the event loop to allow any open underlying connections to close. For a :class:`ClientSession` without SSL, a simple zero-sleep (``await asyncio.sleep(0)``) will suffice:: async def read_website(): async with aiohttp.ClientSession() as session: async with session.get('http://example.org/') as resp: await resp.read() # Zero-sleep to allow underlying connections to close await asyncio.sleep(0) For a :class:`ClientSession` with SSL, the application must wait a short duration before closing:: ... # Wait 250 ms for the underlying SSL connections to close await asyncio.sleep(0.250) Note that the appropriate amount of time to wait will vary from application to application. All if this will eventually become obsolete when the asyncio internals are changed so that aiohttp itself can wait on the underlying connection to close. Please follow issue `#1925 `_ for the progress on this. Character Set Detection ----------------------- If you encounter a :exc:`UnicodeDecodeError` when using :meth:`ClientResponse.text()` this may be because the response does not include the charset needed to decode the body. If you know the correct encoding for a request, you can simply specify the encoding as a parameter (e.g. ``resp.text("windows-1252")``). Alternatively, :class:`ClientSession` accepts a ``fallback_charset_resolver`` parameter which can be used to introduce charset guessing functionality. When a charset is not found in the Content-Type header, this function will be called to get the charset encoding. For example, this can be used with the ``chardetng_py`` library.:: from chardetng_py import detect def charset_resolver(resp: ClientResponse, body: bytes) -> str: tld = resp.url.host.rsplit(".", maxsplit=1)[-1] return detect(body, allow_utf8=True, tld=tld.encode()) ClientSession(fallback_charset_resolver=charset_resolver) Or, if ``chardetng_py`` doesn't work for you, then ``charset-normalizer`` is another option:: from charset_normalizer import detect ClientSession(fallback_charset_resolver=lambda r, b: detect(b)["encoding"] or "utf-8") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/client_quickstart.rst0000644000175100001770000003662014607525266020043 0ustar00runnerdocker.. _aiohttp-client-quickstart: =================== Client Quickstart =================== .. currentmodule:: aiohttp Eager to get started? This page gives a good introduction in how to get started with aiohttp client API. First, make sure that aiohttp is :ref:`installed ` and *up-to-date* Let's get started with some simple examples. Make a Request ============== Begin by importing the aiohttp module, and asyncio:: import aiohttp import asyncio Now, let's try to get a web-page. For example let's query ``http://httpbin.org/get``:: async def main(): async with aiohttp.ClientSession() as session: async with session.get('http://httpbin.org/get') as resp: print(resp.status) print(await resp.text()) asyncio.run(main()) Now, we have a :class:`ClientSession` called ``session`` and a :class:`ClientResponse` object called ``resp``. We can get all the information we need from the response. The mandatory parameter of :meth:`ClientSession.get` coroutine is an HTTP *url* (:class:`str` or class:`yarl.URL` instance). In order to make an HTTP POST request use :meth:`ClientSession.post` coroutine:: session.post('http://httpbin.org/post', data=b'data') Other HTTP methods are available as well:: session.put('http://httpbin.org/put', data=b'data') session.delete('http://httpbin.org/delete') session.head('http://httpbin.org/get') session.options('http://httpbin.org/get') session.patch('http://httpbin.org/patch', data=b'data') To make several requests to the same site more simple, the parameter ``base_url`` of :class:`ClientSession` constructor can be used. For example to request different endpoints of ``http://httpbin.org`` can be used the following code:: async with aiohttp.ClientSession('http://httpbin.org') as session: async with session.get('/get'): pass async with session.post('/post', data=b'data'): pass async with session.put('/put', data=b'data'): pass .. note:: Don't create a session per request. Most likely you need a session per application which performs all requests together. More complex cases may require a session per site, e.g. one for Github and other one for Facebook APIs. Anyway making a session for every request is a **very bad** idea. A session contains a connection pool inside. Connection reusage and keep-alive (both are on by default) may speed up total performance. A session context manager usage is not mandatory but ``await session.close()`` method should be called in this case, e.g.:: session = aiohttp.ClientSession() async with session.get('...'): # ... await session.close() Passing Parameters In URLs ========================== You often want to send some sort of data in the URL's query string. If you were constructing the URL by hand, this data would be given as key/value pairs in the URL after a question mark, e.g. ``httpbin.org/get?key=val``. Requests allows you to provide these arguments as a :class:`dict`, using the ``params`` keyword argument. As an example, if you wanted to pass ``key1=value1`` and ``key2=value2`` to ``httpbin.org/get``, you would use the following code:: params = {'key1': 'value1', 'key2': 'value2'} async with session.get('http://httpbin.org/get', params=params) as resp: expect = 'http://httpbin.org/get?key1=value1&key2=value2' assert str(resp.url) == expect You can see that the URL has been correctly encoded by printing the URL. For sending data with multiple values for the same key :class:`~multidict.MultiDict` may be used; the library support nested lists (``{'key': ['value1', 'value2']}``) alternative as well. It is also possible to pass a list of 2 item tuples as parameters, in that case you can specify multiple values for each key:: params = [('key', 'value1'), ('key', 'value2')] async with session.get('http://httpbin.org/get', params=params) as r: expect = 'http://httpbin.org/get?key=value2&key=value1' assert str(r.url) == expect You can also pass :class:`str` content as param, but beware -- content is not encoded by library. Note that ``+`` is not encoded:: async with session.get('http://httpbin.org/get', params='key=value+1') as r: assert str(r.url) == 'http://httpbin.org/get?key=value+1' .. note:: *aiohttp* internally performs URL canonicalization before sending request. Canonicalization encodes *host* part by :term:`IDNA` codec and applies :term:`requoting` to *path* and *query* parts. For example ``URL('http://example.com/путь/%30?a=%31')`` is converted to ``URL('http://example.com/%D0%BF%D1%83%D1%82%D1%8C/0?a=1')``. Sometimes canonicalization is not desirable if server accepts exact representation and does not requote URL itself. To disable canonicalization use ``encoded=True`` parameter for URL construction:: await session.get( URL('http://example.com/%30', encoded=True)) .. warning:: Passing *params* overrides ``encoded=True``, never use both options. Response Content and Status Code ================================ We can read the content of the server's response and its status code. Consider the GitHub time-line again:: async with session.get('https://api.github.com/events') as resp: print(resp.status) print(await resp.text()) prints out something like:: 200 '[{"created_at":"2015-06-12T14:06:22Z","public":true,"actor":{... ``aiohttp`` automatically decodes the content from the server. You can specify custom encoding for the :meth:`~ClientResponse.text` method:: await resp.text(encoding='windows-1251') Binary Response Content ======================= You can also access the response body as bytes, for non-text requests:: print(await resp.read()) :: b'[{"created_at":"2015-06-12T14:06:22Z","public":true,"actor":{... The ``gzip`` and ``deflate`` transfer-encodings are automatically decoded for you. You can enable ``brotli`` transfer-encodings support, just install `Brotli `_ or `brotlicffi `_. JSON Request ============ Any of session's request methods like :func:`request`, :meth:`ClientSession.get`, :meth:`ClientSession.post` etc. accept `json` parameter:: async with aiohttp.ClientSession() as session: async with session.post(url, json={'test': 'object'}) By default session uses python's standard :mod:`json` module for serialization. But it is possible to use different ``serializer``. :class:`ClientSession` accepts ``json_serialize`` parameter:: import ujson async with aiohttp.ClientSession( json_serialize=ujson.dumps) as session: await session.post(url, json={'test': 'object'}) .. note:: ``ujson`` library is faster than standard :mod:`json` but slightly incompatible. JSON Response Content ===================== There's also a built-in JSON decoder, in case you're dealing with JSON data:: async with session.get('https://api.github.com/events') as resp: print(await resp.json()) In case that JSON decoding fails, :meth:`~ClientResponse.json` will raise an exception. It is possible to specify custom encoding and decoder functions for the :meth:`~ClientResponse.json` call. .. note:: The methods above reads the whole response body into memory. If you are planning on reading lots of data, consider using the streaming response method documented below. Streaming Response Content ========================== While methods :meth:`~ClientResponse.read`, :meth:`~ClientResponse.json` and :meth:`~ClientResponse.text` are very convenient you should use them carefully. All these methods load the whole response in memory. For example if you want to download several gigabyte sized files, these methods will load all the data in memory. Instead you can use the :attr:`~ClientResponse.content` attribute. It is an instance of the :class:`aiohttp.StreamReader` class. The ``gzip`` and ``deflate`` transfer-encodings are automatically decoded for you:: async with session.get('https://api.github.com/events') as resp: await resp.content.read(10) In general, however, you should use a pattern like this to save what is being streamed to a file:: with open(filename, 'wb') as fd: async for chunk in resp.content.iter_chunked(chunk_size): fd.write(chunk) It is not possible to use :meth:`~ClientResponse.read`, :meth:`~ClientResponse.json` and :meth:`~ClientResponse.text` after explicit reading from :attr:`~ClientResponse.content`. More complicated POST requests ============================== Typically, you want to send some form-encoded data -- much like an HTML form. To do this, simply pass a dictionary to the *data* argument. Your dictionary of data will automatically be form-encoded when the request is made:: payload = {'key1': 'value1', 'key2': 'value2'} async with session.post('http://httpbin.org/post', data=payload) as resp: print(await resp.text()) :: { ... "form": { "key2": "value2", "key1": "value1" }, ... } If you want to send data that is not form-encoded you can do it by passing a :class:`bytes` instead of a :class:`dict`. This data will be posted directly and content-type set to 'application/octet-stream' by default:: async with session.post(url, data=b'\x00Binary-data\x00') as resp: ... If you want to send JSON data:: async with session.post(url, json={'example': 'test'}) as resp: ... To send text with appropriate content-type just use ``data`` argument:: async with session.post(url, data='Тест') as resp: ... POST a Multipart-Encoded File ============================= To upload Multipart-encoded files:: url = 'http://httpbin.org/post' files = {'file': open('report.xls', 'rb')} await session.post(url, data=files) You can set the ``filename`` and ``content_type`` explicitly:: url = 'http://httpbin.org/post' data = aiohttp.FormData() data.add_field('file', open('report.xls', 'rb'), filename='report.xls', content_type='application/vnd.ms-excel') await session.post(url, data=data) If you pass a file object as data parameter, aiohttp will stream it to the server automatically. Check :class:`~aiohttp.StreamReader` for supported format information. .. seealso:: :ref:`aiohttp-multipart` Streaming uploads ================= :mod:`aiohttp` supports multiple types of streaming uploads, which allows you to send large files without reading them into memory. As a simple case, simply provide a file-like object for your body:: with open('massive-body', 'rb') as f: await session.post('http://httpbin.org/post', data=f) Or you can use *asynchronous generator*:: async def file_sender(file_name=None): async with aiofiles.open(file_name, 'rb') as f: chunk = await f.read(64*1024) while chunk: yield chunk chunk = await f.read(64*1024) # Then you can use file_sender as a data provider: async with session.post('http://httpbin.org/post', data=file_sender(file_name='huge_file')) as resp: print(await resp.text()) Because the :attr:`~aiohttp.ClientResponse.content` attribute is a :class:`~aiohttp.StreamReader` (provides async iterator protocol), you can chain get and post requests together:: resp = await session.get('http://python.org') await session.post('http://httpbin.org/post', data=resp.content) .. note:: Python 3.5 has no native support for asynchronous generators, use ``async_generator`` library as workaround. .. deprecated:: 3.1 ``aiohttp`` still supports ``aiohttp.streamer`` decorator but this approach is deprecated in favor of *asynchronous generators* as shown above. .. _aiohttp-client-websockets: WebSockets ========== :mod:`aiohttp` works with client websockets out-of-the-box. You have to use the :meth:`aiohttp.ClientSession.ws_connect` coroutine for client websocket connection. It accepts a *url* as a first parameter and returns :class:`ClientWebSocketResponse`, with that object you can communicate with websocket server using response's methods:: async with session.ws_connect('http://example.org/ws') as ws: async for msg in ws: if msg.type == aiohttp.WSMsgType.TEXT: if msg.data == 'close cmd': await ws.close() break else: await ws.send_str(msg.data + '/answer') elif msg.type == aiohttp.WSMsgType.ERROR: break You **must** use the only websocket task for both reading (e.g. ``await ws.receive()`` or ``async for msg in ws:``) and writing but may have multiple writer tasks which can only send data asynchronously (by ``await ws.send_str('data')`` for example). .. _aiohttp-client-timeouts: Timeouts ======== Timeout settings are stored in :class:`ClientTimeout` data structure. By default *aiohttp* uses a *total* 300 seconds (5min) timeout, it means that the whole operation should finish in 5 minutes. The value could be overridden by *timeout* parameter for the session (specified in seconds):: timeout = aiohttp.ClientTimeout(total=60) async with aiohttp.ClientSession(timeout=timeout) as session: ... Timeout could be overridden for a request like :meth:`ClientSession.get`:: async with session.get(url, timeout=timeout) as resp: ... Supported :class:`ClientTimeout` fields are: ``total`` The maximal number of seconds for the whole operation including connection establishment, request sending and response reading. ``connect`` The maximal number of seconds for connection establishment of a new connection or for waiting for a free connection from a pool if pool connection limits are exceeded. ``sock_connect`` The maximal number of seconds for connecting to a peer for a new connection, not given from a pool. ``sock_read`` The maximal number of seconds allowed for period between reading a new data portion from a peer. ``ceil_threshold`` The threshold value to trigger ceiling of absolute timeout values. All fields are floats, ``None`` or ``0`` disables a particular timeout check, see the :class:`ClientTimeout` reference for defaults and additional details. Thus the default timeout is:: aiohttp.ClientTimeout(total=5*60, connect=None, sock_connect=None, sock_read=None, ceil_threshold=5) .. note:: *aiohttp* **ceils** timeout if the value is equal or greater than 5 seconds. The timeout expires at the next integer second greater than ``current_time + timeout``. The ceiling is done for the sake of optimization, when many concurrent tasks are scheduled to wake-up at the almost same but different absolute times. It leads to very many event loop wakeups, which kills performance. The optimization shifts absolute wakeup times by scheduling them to exactly the same time as other neighbors, the loop wakes up once-per-second for timeout expiration. Smaller timeouts are not rounded to help testing; in the real life network timeouts usually greater than tens of seconds. However, the default threshold value of 5 seconds can be configured using the ``ceil_threshold`` parameter. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/client_reference.rst0000644000175100001770000022451714607525266017613 0ustar00runnerdocker.. _aiohttp-client-reference: Client Reference ================ .. currentmodule:: aiohttp Client Session -------------- Client session is the recommended interface for making HTTP requests. Session encapsulates a *connection pool* (*connector* instance) and supports keepalives by default. Unless you are connecting to a large, unknown number of different servers over the lifetime of your application, it is suggested you use a single session for the lifetime of your application to benefit from connection pooling. Usage example:: import aiohttp import asyncio async def fetch(client): async with client.get('http://python.org') as resp: assert resp.status == 200 return await resp.text() async def main(): async with aiohttp.ClientSession() as client: html = await fetch(client) print(html) asyncio.run(main()) The client session supports the context manager protocol for self closing. .. class:: ClientSession(base_url=None, *, \ connector=None, cookies=None, \ headers=None, skip_auto_headers=None, \ auth=None, json_serialize=json.dumps, \ version=aiohttp.HttpVersion11, \ cookie_jar=None, read_timeout=None, \ conn_timeout=None, \ timeout=sentinel, \ raise_for_status=False, \ connector_owner=True, \ auto_decompress=True, \ read_bufsize=2**16, \ requote_redirect_url=True, \ trust_env=False, \ trace_configs=None, \ fallback_charset_resolver=lambda r, b: "utf-8") The class for creating client sessions and making requests. :param base_url: Base part of the URL (optional) If set, it allows to skip the base part (https://docs.aiohttp.org) in request calls. It must not include a path (as in https://docs.aiohttp.org/en/stable). .. versionadded:: 3.8 :param aiohttp.BaseConnector connector: BaseConnector sub-class instance to support connection pooling. :param loop: :ref:`event loop` used for processing HTTP requests. If *loop* is ``None`` the constructor borrows it from *connector* if specified. :func:`asyncio.get_event_loop` is used for getting default event loop otherwise. .. deprecated:: 2.0 :param dict cookies: Cookies to send with the request (optional) :param headers: HTTP Headers to send with every request (optional). May be either *iterable of key-value pairs* or :class:`~collections.abc.Mapping` (e.g. :class:`dict`, :class:`~multidict.CIMultiDict`). :param skip_auto_headers: set of headers for which autogeneration should be skipped. *aiohttp* autogenerates headers like ``User-Agent`` or ``Content-Type`` if these headers are not explicitly passed. Using ``skip_auto_headers`` parameter allows to skip that generation. Note that ``Content-Length`` autogeneration can't be skipped. Iterable of :class:`str` or :class:`~multidict.istr` (optional) :param aiohttp.BasicAuth auth: an object that represents HTTP Basic Authorization (optional) :param version: supported HTTP version, ``HTTP 1.1`` by default. :param cookie_jar: Cookie Jar, :class:`~aiohttp.abc.AbstractCookieJar` instance. By default every session instance has own private cookie jar for automatic cookies processing but user may redefine this behavior by providing own jar implementation. One example is not processing cookies at all when working in proxy mode. If no cookie processing is needed, a :class:`aiohttp.DummyCookieJar` instance can be provided. :param collections.abc.Callable json_serialize: Json *serializer* callable. By default :func:`json.dumps` function. :param bool raise_for_status: Automatically call :meth:`ClientResponse.raise_for_status()` for each response, ``False`` by default. This parameter can be overridden when you making a request, e.g.:: client_session = aiohttp.ClientSession(raise_for_status=True) resp = await client_session.get(url, raise_for_status=False) async with resp: assert resp.status == 200 Set the parameter to ``True`` if you need ``raise_for_status`` for most of cases but override ``raise_for_status`` for those requests where you need to handle responses with status 400 or higher. You can also provide a coroutine which takes the response as an argument and can raise an exception based on custom logic, e.g.:: async def custom_check(response): if response.status not in {201, 202}: raise RuntimeError('expected either 201 or 202') text = await response.text() if 'apple pie' not in text: raise RuntimeError('I wanted to see "apple pie" in response') client_session = aiohttp.ClientSession(raise_for_status=custom_check) ... As with boolean values, you're free to set this on the session and/or overwrite it on a per-request basis. :param timeout: a :class:`ClientTimeout` settings structure, 300 seconds (5min) total timeout by default. .. versionadded:: 3.3 :param float read_timeout: Request operations timeout. ``read_timeout`` is cumulative for all request operations (request, redirects, responses, data consuming). By default, the read timeout is 5*60 seconds. Use ``None`` or ``0`` to disable timeout checks. .. deprecated:: 3.3 Use ``timeout`` parameter instead. :param float conn_timeout: timeout for connection establishing (optional). Values ``0`` or ``None`` mean no timeout. .. deprecated:: 3.3 Use ``timeout`` parameter instead. :param bool connector_owner: Close connector instance on session closing. Setting the parameter to ``False`` allows to share connection pool between sessions without sharing session state: cookies etc. :param bool auto_decompress: Automatically decompress response body (``True`` by default). .. versionadded:: 2.3 :param int read_bufsize: Size of the read buffer (:attr:`ClientResponse.content`). 64 KiB by default. .. versionadded:: 3.7 :param bool trust_env: Trust environment settings for proxy configuration if the parameter is ``True`` (``False`` by default). See :ref:`aiohttp-client-proxy-support` for more information. Get proxy credentials from ``~/.netrc`` file if present. Get HTTP Basic Auth credentials from :file:`~/.netrc` file if present. If :envvar:`NETRC` environment variable is set, read from file specified there rather than from :file:`~/.netrc`. .. seealso:: ``.netrc`` documentation: https://www.gnu.org/software/inetutils/manual/html_node/The-_002enetrc-file.html .. versionadded:: 2.3 .. versionchanged:: 3.0 Added support for ``~/.netrc`` file. .. versionchanged:: 3.9 Added support for reading HTTP Basic Auth credentials from :file:`~/.netrc` file. :param bool requote_redirect_url: Apply *URL requoting* for redirection URLs if automatic redirection is enabled (``True`` by default). .. versionadded:: 3.5 :param trace_configs: A list of :class:`TraceConfig` instances used for client tracing. ``None`` (default) is used for request tracing disabling. See :ref:`aiohttp-client-tracing-reference` for more information. :param Callable[[ClientResponse,bytes],str] fallback_charset_resolver: A :term:`callable` that accepts a :class:`ClientResponse` and the :class:`bytes` contents, and returns a :class:`str` which will be used as the encoding parameter to :meth:`bytes.decode()`. This function will be called when the charset is not known (e.g. not specified in the Content-Type header). The default function simply defaults to ``utf-8``. .. versionadded:: 3.8.6 .. attribute:: closed ``True`` if the session has been closed, ``False`` otherwise. A read-only property. .. attribute:: connector :class:`aiohttp.BaseConnector` derived instance used for the session. A read-only property. .. attribute:: cookie_jar The session cookies, :class:`~aiohttp.abc.AbstractCookieJar` instance. Gives access to cookie jar's content and modifiers. A read-only property. .. attribute:: requote_redirect_url aiohttp re quote's redirect urls by default, but some servers require exact url from location header. To disable *re-quote* system set :attr:`requote_redirect_url` attribute to ``False``. .. versionadded:: 2.1 .. note:: This parameter affects all subsequent requests. .. deprecated:: 3.5 The attribute modification is deprecated. .. attribute:: loop A loop instance used for session creation. A read-only property. .. deprecated:: 3.5 .. attribute:: timeout Default client timeouts, :class:`ClientTimeout` instance. The value can be tuned by passing *timeout* parameter to :class:`ClientSession` constructor. .. versionadded:: 3.7 .. attribute:: headers HTTP Headers that sent with every request May be either *iterable of key-value pairs* or :class:`~collections.abc.Mapping` (e.g. :class:`dict`, :class:`~multidict.CIMultiDict`). .. versionadded:: 3.7 .. attribute:: skip_auto_headers Set of headers for which autogeneration skipped. :class:`frozenset` of :class:`str` or :class:`~multidict.istr` (optional) .. versionadded:: 3.7 .. attribute:: auth An object that represents HTTP Basic Authorization. :class:`~aiohttp.BasicAuth` (optional) .. versionadded:: 3.7 .. attribute:: json_serialize Json serializer callable. By default :func:`json.dumps` function. .. versionadded:: 3.7 .. attribute:: connector_owner Should connector be closed on session closing :class:`bool` (optional) .. versionadded:: 3.7 .. attribute:: raise_for_status Should :meth:`ClientResponse.raise_for_status()` be called for each response Either :class:`bool` or :class:`collections.abc.Callable` .. versionadded:: 3.7 .. attribute:: auto_decompress Should the body response be automatically decompressed :class:`bool` default is ``True`` .. versionadded:: 3.7 .. attribute:: trust_env Trust environment settings for proxy configuration or ~/.netrc file if present. See :ref:`aiohttp-client-proxy-support` for more information. :class:`bool` default is ``False`` .. versionadded:: 3.7 .. attribute:: trace_config A list of :class:`TraceConfig` instances used for client tracing. ``None`` (default) is used for request tracing disabling. See :ref:`aiohttp-client-tracing-reference` for more information. .. versionadded:: 3.7 .. method:: request(method, url, *, params=None, data=None, json=None,\ cookies=None, headers=None, skip_auto_headers=None, \ auth=None, allow_redirects=True,\ max_redirects=10,\ compress=None, chunked=None, expect100=False, raise_for_status=None,\ read_until_eof=True, \ read_bufsize=None, \ proxy=None, proxy_auth=None,\ timeout=sentinel, ssl=None, \ verify_ssl=None, fingerprint=None, \ ssl_context=None, proxy_headers=None, \ server_hostname=None, auto_decompress=None) :async: :noindexentry: Performs an asynchronous HTTP request. Returns a response object that should be used as an async context manager. :param str method: HTTP method :param url: Request URL, :class:`~yarl.URL` or :class:`str` that will be encoded with :class:`~yarl.URL` (see :class:`~yarl.URL` to skip encoding). :param params: Mapping, iterable of tuple of *key*/*value* pairs or string to be sent as parameters in the query string of the new request. Ignored for subsequent redirected requests (optional) Allowed values are: - :class:`collections.abc.Mapping` e.g. :class:`dict`, :class:`multidict.MultiDict` or :class:`multidict.MultiDictProxy` - :class:`collections.abc.Iterable` e.g. :class:`tuple` or :class:`list` - :class:`str` with preferably url-encoded content (**Warning:** content will not be encoded by *aiohttp*) :param data: The data to send in the body of the request. This can be a :class:`FormData` object or anything that can be passed into :class:`FormData`, e.g. a dictionary, bytes, or file-like object. (optional) :param json: Any json compatible python object (optional). *json* and *data* parameters could not be used at the same time. :param dict cookies: HTTP Cookies to send with the request (optional) Global session cookies and the explicitly set cookies will be merged when sending the request. .. versionadded:: 3.5 :param dict headers: HTTP Headers to send with the request (optional) :param skip_auto_headers: set of headers for which autogeneration should be skipped. *aiohttp* autogenerates headers like ``User-Agent`` or ``Content-Type`` if these headers are not explicitly passed. Using ``skip_auto_headers`` parameter allows to skip that generation. Iterable of :class:`str` or :class:`~multidict.istr` (optional) :param aiohttp.BasicAuth auth: an object that represents HTTP Basic Authorization (optional) :param bool allow_redirects: If set to ``False``, do not follow redirects. ``True`` by default (optional). :param int max_redirects: Maximum number of redirects to follow. ``10`` by default. :param bool compress: Set to ``True`` if request has to be compressed with deflate encoding. If `compress` can not be combined with a *Content-Encoding* and *Content-Length* headers. ``None`` by default (optional). :param int chunked: Enable chunked transfer encoding. It is up to the developer to decide how to chunk data streams. If chunking is enabled, aiohttp encodes the provided chunks in the "Transfer-encoding: chunked" format. If *chunked* is set, then the *Transfer-encoding* and *content-length* headers are disallowed. ``None`` by default (optional). :param bool expect100: Expect 100-continue response from server. ``False`` by default (optional). :param bool raise_for_status: Automatically call :meth:`ClientResponse.raise_for_status()` for response if set to ``True``. If set to ``None`` value from ``ClientSession`` will be used. ``None`` by default (optional). .. versionadded:: 3.4 :param bool read_until_eof: Read response until EOF if response does not have Content-Length header. ``True`` by default (optional). :param int read_bufsize: Size of the read buffer (:attr:`ClientResponse.content`). ``None`` by default, it means that the session global value is used. .. versionadded:: 3.7 :param proxy: Proxy URL, :class:`str` or :class:`~yarl.URL` (optional) :param aiohttp.BasicAuth proxy_auth: an object that represents proxy HTTP Basic Authorization (optional) :param int timeout: override the session's timeout. .. versionchanged:: 3.3 The parameter is :class:`ClientTimeout` instance, :class:`float` is still supported for sake of backward compatibility. If :class:`float` is passed it is a *total* timeout (in seconds). :param ssl: SSL validation mode. ``None`` for default SSL check (:func:`ssl.create_default_context` is used), ``False`` for skip SSL certificate validation, :class:`aiohttp.Fingerprint` for fingerprint validation, :class:`ssl.SSLContext` for custom SSL certificate validation. Supersedes *verify_ssl*, *ssl_context* and *fingerprint* parameters. .. versionadded:: 3.0 :param bool verify_ssl: Perform SSL certificate validation for *HTTPS* requests (enabled by default). May be disabled to skip validation for sites with invalid certificates. .. versionadded:: 2.3 .. deprecated:: 3.0 Use ``ssl=False`` :param bytes fingerprint: Pass the SHA256 digest of the expected certificate in DER format to verify that the certificate the server presents matches. Useful for `certificate pinning `_. Warning: use of MD5 or SHA1 digests is insecure and removed. .. versionadded:: 2.3 .. deprecated:: 3.0 Use ``ssl=aiohttp.Fingerprint(digest)`` :param str server_hostname: Sets or overrides the host name that the target server’s certificate will be matched against. See :py:meth:`asyncio.loop.create_connection` for more information. .. versionadded:: 3.9 :param ssl.SSLContext ssl_context: ssl context used for processing *HTTPS* requests (optional). *ssl_context* may be used for configuring certification authority channel, supported SSL options etc. .. versionadded:: 2.3 .. deprecated:: 3.0 Use ``ssl=ssl_context`` :param collections.abc.Mapping proxy_headers: HTTP headers to send to the proxy if the parameter proxy has been provided. .. versionadded:: 2.3 :param trace_request_ctx: Object used to give as a kw param for each new :class:`TraceConfig` object instantiated, used to give information to the tracers that is only available at request time. .. versionadded:: 3.0 :param bool auto_decompress: Automatically decompress response body. Overrides :attr:`ClientSession.auto_decompress`. May be used to enable/disable auto decompression on a per-request basis. :return ClientResponse: a :class:`client response ` object. .. method:: get(url, *, allow_redirects=True, **kwargs) :async: Perform a ``GET`` request. Returns an async context manager. In order to modify inner :meth:`request` parameters, provide `kwargs`. :param url: Request URL, :class:`str` or :class:`~yarl.URL` :param bool allow_redirects: If set to ``False``, do not follow redirects. ``True`` by default (optional). :return ClientResponse: a :class:`client response ` object. .. method:: post(url, *, data=None, **kwargs) :async: Perform a ``POST`` request. Returns an async context manager. In order to modify inner :meth:`request` parameters, provide `kwargs`. :param url: Request URL, :class:`str` or :class:`~yarl.URL` :param data: Data to send in the body of the request; see :meth:`request` for details (optional) :return ClientResponse: a :class:`client response ` object. .. method:: put(url, *, data=None, **kwargs) :async: Perform a ``PUT`` request. Returns an async context manager. In order to modify inner :meth:`request` parameters, provide `kwargs`. :param url: Request URL, :class:`str` or :class:`~yarl.URL` :param data: Data to send in the body of the request; see :meth:`request` for details (optional) :return ClientResponse: a :class:`client response ` object. .. method:: delete(url, **kwargs) :async: Perform a ``DELETE`` request. Returns an async context manager. In order to modify inner :meth:`request` parameters, provide `kwargs`. :param url: Request URL, :class:`str` or :class:`~yarl.URL` :return ClientResponse: a :class:`client response ` object. .. method:: head(url, *, allow_redirects=False, **kwargs) :async: Perform a ``HEAD`` request. Returns an async context manager. In order to modify inner :meth:`request` parameters, provide `kwargs`. :param url: Request URL, :class:`str` or :class:`~yarl.URL` :param bool allow_redirects: If set to ``False``, do not follow redirects. ``False`` by default (optional). :return ClientResponse: a :class:`client response ` object. .. method:: options(url, *, allow_redirects=True, **kwargs) :async: Perform an ``OPTIONS`` request. Returns an async context manager. In order to modify inner :meth:`request` parameters, provide `kwargs`. :param url: Request URL, :class:`str` or :class:`~yarl.URL` :param bool allow_redirects: If set to ``False``, do not follow redirects. ``True`` by default (optional). :return ClientResponse: a :class:`client response ` object. .. method:: patch(url, *, data=None, **kwargs) :async: Perform a ``PATCH`` request. Returns an async context manager. In order to modify inner :meth:`request` parameters, provide `kwargs`. :param url: Request URL, :class:`str` or :class:`~yarl.URL` :param data: Data to send in the body of the request; see :meth:`request` for details (optional) :return ClientResponse: a :class:`client response ` object. .. method:: ws_connect(url, *, method='GET', \ protocols=(), timeout=10.0,\ receive_timeout=None,\ auth=None,\ autoclose=True,\ autoping=True,\ heartbeat=None,\ origin=None, \ params=None, \ headers=None, \ proxy=None, proxy_auth=None, ssl=None, \ verify_ssl=None, fingerprint=None, \ ssl_context=None, proxy_headers=None, \ compress=0, max_msg_size=4194304) :async: Create a websocket connection. Returns a :class:`ClientWebSocketResponse` async context manager object. :param url: Websocket server url, :class:`~yarl.URL` or :class:`str` that will be encoded with :class:`~yarl.URL` (see :class:`~yarl.URL` to skip encoding). :param tuple protocols: Websocket protocols :param float timeout: Timeout for websocket to close. ``10`` seconds by default :param float receive_timeout: Timeout for websocket to receive complete message. ``None`` (unlimited) seconds by default :param aiohttp.BasicAuth auth: an object that represents HTTP Basic Authorization (optional) :param bool autoclose: Automatically close websocket connection on close message from server. If *autoclose* is False then close procedure has to be handled manually. ``True`` by default :param bool autoping: automatically send *pong* on *ping* message from server. ``True`` by default :param float heartbeat: Send *ping* message every *heartbeat* seconds and wait *pong* response, if *pong* response is not received then close connection. The timer is reset on any data reception.(optional) :param str origin: Origin header to send to server(optional) :param params: Mapping, iterable of tuple of *key*/*value* pairs or string to be sent as parameters in the query string of the new request. Ignored for subsequent redirected requests (optional) Allowed values are: - :class:`collections.abc.Mapping` e.g. :class:`dict`, :class:`multidict.MultiDict` or :class:`multidict.MultiDictProxy` - :class:`collections.abc.Iterable` e.g. :class:`tuple` or :class:`list` - :class:`str` with preferably url-encoded content (**Warning:** content will not be encoded by *aiohttp*) :param dict headers: HTTP Headers to send with the request (optional) :param str proxy: Proxy URL, :class:`str` or :class:`~yarl.URL` (optional) :param aiohttp.BasicAuth proxy_auth: an object that represents proxy HTTP Basic Authorization (optional) :param ssl: SSL validation mode. ``None`` for default SSL check (:func:`ssl.create_default_context` is used), ``False`` for skip SSL certificate validation, :class:`aiohttp.Fingerprint` for fingerprint validation, :class:`ssl.SSLContext` for custom SSL certificate validation. Supersedes *verify_ssl*, *ssl_context* and *fingerprint* parameters. .. versionadded:: 3.0 :param bool verify_ssl: Perform SSL certificate validation for *HTTPS* requests (enabled by default). May be disabled to skip validation for sites with invalid certificates. .. versionadded:: 2.3 .. deprecated:: 3.0 Use ``ssl=False`` :param bytes fingerprint: Pass the SHA256 digest of the expected certificate in DER format to verify that the certificate the server presents matches. Useful for `certificate pinning `_. Note: use of MD5 or SHA1 digests is insecure and deprecated. .. versionadded:: 2.3 .. deprecated:: 3.0 Use ``ssl=aiohttp.Fingerprint(digest)`` :param ssl.SSLContext ssl_context: ssl context used for processing *HTTPS* requests (optional). *ssl_context* may be used for configuring certification authority channel, supported SSL options etc. .. versionadded:: 2.3 .. deprecated:: 3.0 Use ``ssl=ssl_context`` :param dict proxy_headers: HTTP headers to send to the proxy if the parameter proxy has been provided. .. versionadded:: 2.3 :param int compress: Enable Per-Message Compress Extension support. 0 for disable, 9 to 15 for window bit support. Default value is 0. .. versionadded:: 2.3 :param int max_msg_size: maximum size of read websocket message, 4 MB by default. To disable the size limit use ``0``. .. versionadded:: 3.3 :param str method: HTTP method to establish WebSocket connection, ``'GET'`` by default. .. versionadded:: 3.5 .. method:: close() :async: Close underlying connector. Release all acquired resources. .. method:: detach() Detach connector from session without closing the former. Session is switched to closed state anyway. Basic API --------- While we encourage :class:`ClientSession` usage we also provide simple coroutines for making HTTP requests. Basic API is good for performing simple HTTP requests without keepaliving, cookies and complex connection stuff like properly configured SSL certification chaining. .. function:: request(method, url, *, params=None, data=None, \ json=None,\ headers=None, cookies=None, auth=None, \ allow_redirects=True, max_redirects=10, \ encoding='utf-8', \ version=HttpVersion(major=1, minor=1), \ compress=None, chunked=None, expect100=False, raise_for_status=False, \ read_bufsize=None, \ connector=None, loop=None,\ read_until_eof=True, timeout=sentinel) :async: Asynchronous context manager for performing an asynchronous HTTP request. Returns a :class:`ClientResponse` response object. Use as an async context manager. :param str method: HTTP method :param url: Request URL, :class:`~yarl.URL` or :class:`str` that will be encoded with :class:`~yarl.URL` (see :class:`~yarl.URL` to skip encoding). :param dict params: Parameters to be sent in the query string of the new request (optional) :param data: The data to send in the body of the request. This can be a :class:`FormData` object or anything that can be passed into :class:`FormData`, e.g. a dictionary, bytes, or file-like object. (optional) :param json: Any json compatible python object (optional). *json* and *data* parameters could not be used at the same time. :param dict headers: HTTP Headers to send with the request (optional) :param dict cookies: Cookies to send with the request (optional) :param aiohttp.BasicAuth auth: an object that represents HTTP Basic Authorization (optional) :param bool allow_redirects: If set to ``False``, do not follow redirects. ``True`` by default (optional). :param aiohttp.protocol.HttpVersion version: Request HTTP version (optional) :param bool compress: Set to ``True`` if request has to be compressed with deflate encoding. ``False`` instructs aiohttp to not compress data. ``None`` by default (optional). :param int chunked: Enables chunked transfer encoding. ``None`` by default (optional). :param bool expect100: Expect 100-continue response from server. ``False`` by default (optional). :param bool raise_for_status: Automatically call :meth:`ClientResponse.raise_for_status()` for response if set to ``True``. If set to ``None`` value from ``ClientSession`` will be used. ``None`` by default (optional). .. versionadded:: 3.4 :param aiohttp.BaseConnector connector: BaseConnector sub-class instance to support connection pooling. :param bool read_until_eof: Read response until EOF if response does not have Content-Length header. ``True`` by default (optional). :param int read_bufsize: Size of the read buffer (:attr:`ClientResponse.content`). ``None`` by default, it means that the session global value is used. .. versionadded:: 3.7 :param timeout: a :class:`ClientTimeout` settings structure, 300 seconds (5min) total timeout by default. :param loop: :ref:`event loop` used for processing HTTP requests. If param is ``None``, :func:`asyncio.get_event_loop` is used for getting default event loop. .. deprecated:: 2.0 :return ClientResponse: a :class:`client response ` object. Usage:: import aiohttp async def fetch(): async with aiohttp.request('GET', 'http://python.org/') as resp: assert resp.status == 200 print(await resp.text()) .. _aiohttp-client-reference-connectors: Connectors ---------- Connectors are transports for aiohttp client API. There are standard connectors: 1. :class:`TCPConnector` for regular *TCP sockets* (both *HTTP* and *HTTPS* schemes supported). 2. :class:`UnixConnector` for connecting via UNIX socket (it's used mostly for testing purposes). All connector classes should be derived from :class:`BaseConnector`. By default all *connectors* support *keep-alive connections* (behavior is controlled by *force_close* constructor's parameter). .. class:: BaseConnector(*, keepalive_timeout=15, \ force_close=False, limit=100, limit_per_host=0, \ enable_cleanup_closed=False, loop=None) Base class for all connectors. :param float keepalive_timeout: timeout for connection reusing after releasing (optional). Values ``0``. For disabling *keep-alive* feature use ``force_close=True`` flag. :param int limit: total number simultaneous connections. If *limit* is ``None`` the connector has no limit (default: 100). :param int limit_per_host: limit simultaneous connections to the same endpoint. Endpoints are the same if they are have equal ``(host, port, is_ssl)`` triple. If *limit* is ``0`` the connector has no limit (default: 0). :param bool force_close: close underlying sockets after connection releasing (optional). :param bool enable_cleanup_closed: some SSL servers do not properly complete SSL shutdown process, in that case asyncio leaks ssl connections. If this parameter is set to True, aiohttp additionally aborts underlining transport after 2 seconds. It is off by default. :param loop: :ref:`event loop` used for handling connections. If param is ``None``, :func:`asyncio.get_event_loop` is used for getting default event loop. .. deprecated:: 2.0 .. attribute:: closed Read-only property, ``True`` if connector is closed. .. attribute:: force_close Read-only property, ``True`` if connector should ultimately close connections on releasing. .. attribute:: limit The total number for simultaneous connections. If limit is 0 the connector has no limit. The default limit size is 100. .. attribute:: limit_per_host The limit for simultaneous connections to the same endpoint. Endpoints are the same if they are have equal ``(host, port, is_ssl)`` triple. If *limit_per_host* is ``None`` the connector has no limit per host. Read-only property. .. method:: close() :async: Close all opened connections. .. method:: connect(request) :async: Get a free connection from pool or create new one if connection is absent in the pool. The call may be paused if :attr:`limit` is exhausted until used connections returns to pool. :param aiohttp.ClientRequest request: request object which is connection initiator. :return: :class:`Connection` object. .. method:: _create_connection(req) :async: Abstract method for actual connection establishing, should be overridden in subclasses. .. class:: TCPConnector(*, ssl=None, verify_ssl=True, fingerprint=None, \ use_dns_cache=True, ttl_dns_cache=10, \ family=0, ssl_context=None, local_addr=None, \ resolver=None, keepalive_timeout=sentinel, \ force_close=False, limit=100, limit_per_host=0, \ enable_cleanup_closed=False, loop=None) Connector for working with *HTTP* and *HTTPS* via *TCP* sockets. The most common transport. When you don't know what connector type to use, use a :class:`TCPConnector` instance. :class:`TCPConnector` inherits from :class:`BaseConnector`. Constructor accepts all parameters suitable for :class:`BaseConnector` plus several TCP-specific ones: :param ssl: SSL validation mode. ``None`` for default SSL check (:func:`ssl.create_default_context` is used), ``False`` for skip SSL certificate validation, :class:`aiohttp.Fingerprint` for fingerprint validation, :class:`ssl.SSLContext` for custom SSL certificate validation. Supersedes *verify_ssl*, *ssl_context* and *fingerprint* parameters. .. versionadded:: 3.0 :param bool verify_ssl: perform SSL certificate validation for *HTTPS* requests (enabled by default). May be disabled to skip validation for sites with invalid certificates. .. deprecated:: 2.3 Pass *verify_ssl* to ``ClientSession.get()`` etc. :param bytes fingerprint: pass the SHA256 digest of the expected certificate in DER format to verify that the certificate the server presents matches. Useful for `certificate pinning `_. Note: use of MD5 or SHA1 digests is insecure and deprecated. .. deprecated:: 2.3 Pass *verify_ssl* to ``ClientSession.get()`` etc. :param bool use_dns_cache: use internal cache for DNS lookups, ``True`` by default. Enabling an option *may* speedup connection establishing a bit but may introduce some *side effects* also. :param int ttl_dns_cache: expire after some seconds the DNS entries, ``None`` means cached forever. By default 10 seconds (optional). In some environments the IP addresses related to a specific HOST can change after a specific time. Use this option to keep the DNS cache updated refreshing each entry after N seconds. :param int limit: total number simultaneous connections. If *limit* is ``None`` the connector has no limit (default: 100). :param int limit_per_host: limit simultaneous connections to the same endpoint. Endpoints are the same if they are have equal ``(host, port, is_ssl)`` triple. If *limit* is ``0`` the connector has no limit (default: 0). :param aiohttp.abc.AbstractResolver resolver: custom resolver instance to use. ``aiohttp.DefaultResolver`` by default (asynchronous if ``aiodns>=1.1`` is installed). Custom resolvers allow to resolve hostnames differently than the way the host is configured. The resolver is ``aiohttp.ThreadedResolver`` by default, asynchronous version is pretty robust but might fail in very rare cases. :param int family: TCP socket family, both IPv4 and IPv6 by default. For *IPv4* only use :data:`socket.AF_INET`, for *IPv6* only -- :data:`socket.AF_INET6`. *family* is ``0`` by default, that means both IPv4 and IPv6 are accepted. To specify only concrete version please pass :data:`socket.AF_INET` or :data:`socket.AF_INET6` explicitly. :param ssl.SSLContext ssl_context: SSL context used for processing *HTTPS* requests (optional). *ssl_context* may be used for configuring certification authority channel, supported SSL options etc. :param tuple local_addr: tuple of ``(local_host, local_port)`` used to bind socket locally if specified. :param bool force_close: close underlying sockets after connection releasing (optional). :param bool enable_cleanup_closed: Some ssl servers do not properly complete SSL shutdown process, in that case asyncio leaks SSL connections. If this parameter is set to True, aiohttp additionally aborts underlining transport after 2 seconds. It is off by default. .. attribute:: family *TCP* socket family e.g. :data:`socket.AF_INET` or :data:`socket.AF_INET6` Read-only property. .. attribute:: dns_cache Use quick lookup in internal *DNS* cache for host names if ``True``. Read-only :class:`bool` property. .. attribute:: cached_hosts The cache of resolved hosts if :attr:`dns_cache` is enabled. Read-only :class:`types.MappingProxyType` property. .. method:: clear_dns_cache(self, host=None, port=None) Clear internal *DNS* cache. Remove specific entry if both *host* and *port* are specified, clear all cache otherwise. .. class:: UnixConnector(path, *, conn_timeout=None, \ keepalive_timeout=30, limit=100, \ force_close=False, loop=None) Unix socket connector. Use :class:`UnixConnector` for sending *HTTP/HTTPS* requests through *UNIX Sockets* as underlying transport. UNIX sockets are handy for writing tests and making very fast connections between processes on the same host. :class:`UnixConnector` is inherited from :class:`BaseConnector`. Usage:: conn = UnixConnector(path='/path/to/socket') session = ClientSession(connector=conn) async with session.get('http://python.org') as resp: ... Constructor accepts all parameters suitable for :class:`BaseConnector` plus UNIX-specific one: :param str path: Unix socket path .. attribute:: path Path to *UNIX socket*, read-only :class:`str` property. .. class:: Connection Encapsulates single connection in connector object. End user should never create :class:`Connection` instances manually but get it by :meth:`BaseConnector.connect` coroutine. .. attribute:: closed :class:`bool` read-only property, ``True`` if connection was closed, released or detached. .. attribute:: loop Event loop used for connection .. deprecated:: 3.5 .. attribute:: transport Connection transport .. method:: close() Close connection with forcibly closing underlying socket. .. method:: release() Release connection back to connector. Underlying socket is not closed, the connection may be reused later if timeout (30 seconds by default) for connection was not expired. Response object --------------- .. class:: ClientResponse Client response returned by :meth:`aiohttp.ClientSession.request` and family. User never creates the instance of ClientResponse class but gets it from API calls. :class:`ClientResponse` supports async context manager protocol, e.g.:: resp = await client_session.get(url) async with resp: assert resp.status == 200 After exiting from ``async with`` block response object will be *released* (see :meth:`release` method). .. attribute:: version Response's version, :class:`~aiohttp.protocol.HttpVersion` instance. .. attribute:: status HTTP status code of response (:class:`int`), e.g. ``200``. .. attribute:: reason HTTP status reason of response (:class:`str`), e.g. ``"OK"``. .. attribute:: ok Boolean representation of HTTP status code (:class:`bool`). ``True`` if ``status`` is less than ``400``; otherwise, ``False``. .. attribute:: method Request's method (:class:`str`). .. attribute:: url URL of request (:class:`~yarl.URL`). .. attribute:: real_url Unmodified URL of request with URL fragment unstripped (:class:`~yarl.URL`). .. versionadded:: 3.2 .. attribute:: connection :class:`Connection` used for handling response. .. attribute:: content Payload stream, which contains response's BODY (:class:`StreamReader`). It supports various reading methods depending on the expected format. When chunked transfer encoding is used by the server, allows retrieving the actual http chunks. Reading from the stream may raise :exc:`aiohttp.ClientPayloadError` if the response object is closed before response receives all data or in case if any transfer encoding related errors like malformed chunked encoding of broken compression data. .. attribute:: cookies HTTP cookies of response (*Set-Cookie* HTTP header, :class:`~http.cookies.SimpleCookie`). .. attribute:: headers A case-insensitive multidict proxy with HTTP headers of response, :class:`~multidict.CIMultiDictProxy`. .. attribute:: raw_headers Unmodified HTTP headers of response as unconverted bytes, a sequence of ``(key, value)`` pairs. .. attribute:: links Link HTTP header parsed into a :class:`~multidict.MultiDictProxy`. For each link, key is link param `rel` when it exists, or link url as :class:`str` otherwise, and value is :class:`~multidict.MultiDictProxy` of link params and url at key `url` as :class:`~yarl.URL` instance. .. versionadded:: 3.2 .. attribute:: content_type Read-only property with *content* part of *Content-Type* header. .. note:: Returns value is ``'application/octet-stream'`` if no Content-Type header present in HTTP headers according to :rfc:`2616`. To make sure Content-Type header is not present in the server reply, use :attr:`headers` or :attr:`raw_headers`, e.g. ``'CONTENT-TYPE' not in resp.headers``. .. attribute:: charset Read-only property that specifies the *encoding* for the request's BODY. The value is parsed from the *Content-Type* HTTP header. Returns :class:`str` like ``'utf-8'`` or ``None`` if no *Content-Type* header present in HTTP headers or it has no charset information. .. attribute:: content_disposition Read-only property that specified the *Content-Disposition* HTTP header. Instance of :class:`ContentDisposition` or ``None`` if no *Content-Disposition* header present in HTTP headers. .. attribute:: history A :class:`~collections.abc.Sequence` of :class:`ClientResponse` objects of preceding requests (earliest request first) if there were redirects, an empty sequence otherwise. .. method:: close() Close response and underlying connection. For :term:`keep-alive` support see :meth:`release`. .. method:: read() :async: Read the whole response's body as :class:`bytes`. Close underlying connection if data reading gets an error, release connection otherwise. Raise an :exc:`aiohttp.ClientResponseError` if the data can't be read. :return bytes: read *BODY*. .. seealso:: :meth:`close`, :meth:`release`. .. method:: release() It is not required to call `release` on the response object. When the client fully receives the payload, the underlying connection automatically returns back to pool. If the payload is not fully read, the connection is closed .. method:: raise_for_status() Raise an :exc:`aiohttp.ClientResponseError` if the response status is 400 or higher. Do nothing for success responses (less than 400). .. method:: text(encoding=None) :async: Read response's body and return decoded :class:`str` using specified *encoding* parameter. If *encoding* is ``None`` content encoding is determined from the Content-Type header, or using the ``fallback_charset_resolver`` function. Close underlying connection if data reading gets an error, release connection otherwise. :param str encoding: text encoding used for *BODY* decoding, or ``None`` for encoding autodetection (default). :raises: :exc:`UnicodeDecodeError` if decoding fails. See also :meth:`get_encoding`. :return str: decoded *BODY* .. method:: json(*, encoding=None, loads=json.loads, \ content_type='application/json') :async: Read response's body as *JSON*, return :class:`dict` using specified *encoding* and *loader*. If data is not still available a ``read`` call will be done. If response's `content-type` does not match `content_type` parameter :exc:`aiohttp.ContentTypeError` get raised. To disable content type check pass ``None`` value. :param str encoding: text encoding used for *BODY* decoding, or ``None`` for encoding autodetection (default). By the standard JSON encoding should be ``UTF-8`` but practice beats purity: some servers return non-UTF responses. Autodetection works pretty fine anyway. :param collections.abc.Callable loads: :term:`callable` used for loading *JSON* data, :func:`json.loads` by default. :param str content_type: specify response's content-type, if content type does not match raise :exc:`aiohttp.ClientResponseError`. To disable `content-type` check, pass ``None`` as value. (default: `application/json`). :return: *BODY* as *JSON* data parsed by *loads* parameter or ``None`` if *BODY* is empty or contains white-spaces only. .. attribute:: request_info A namedtuple with request URL and headers from :class:`~aiohttp.ClientRequest` object, :class:`aiohttp.RequestInfo` instance. .. method:: get_encoding() Retrieve content encoding using ``charset`` info in ``Content-Type`` HTTP header. If no charset is present or the charset is not understood by Python, the ``fallback_charset_resolver`` function associated with the ``ClientSession`` is called. .. versionadded:: 3.0 ClientWebSocketResponse ----------------------- To connect to a websocket server :func:`aiohttp.ws_connect` or :meth:`aiohttp.ClientSession.ws_connect` coroutines should be used, do not create an instance of class :class:`ClientWebSocketResponse` manually. .. class:: ClientWebSocketResponse() Class for handling client-side websockets. .. attribute:: closed Read-only property, ``True`` if :meth:`close` has been called or :const:`~aiohttp.WSMsgType.CLOSE` message has been received from peer. .. attribute:: protocol Websocket *subprotocol* chosen after :meth:`start` call. May be ``None`` if server and client protocols are not overlapping. .. method:: get_extra_info(name, default=None) Reads optional extra information from the connection's transport. If no value associated with ``name`` is found, ``default`` is returned. See :meth:`asyncio.BaseTransport.get_extra_info` :param str name: The key to look up in the transport extra information. :param default: Default value to be used when no value for ``name`` is found (default is ``None``). .. method:: exception() Returns exception if any occurs or returns None. .. method:: ping(message=b'') :async: Send :const:`~aiohttp.WSMsgType.PING` to peer. :param message: optional payload of *ping* message, :class:`str` (converted to *UTF-8* encoded bytes) or :class:`bytes`. .. versionchanged:: 3.0 The method is converted into :term:`coroutine` .. method:: pong(message=b'') :async: Send :const:`~aiohttp.WSMsgType.PONG` to peer. :param message: optional payload of *pong* message, :class:`str` (converted to *UTF-8* encoded bytes) or :class:`bytes`. .. versionchanged:: 3.0 The method is converted into :term:`coroutine` .. method:: send_str(data, compress=None) :async: Send *data* to peer as :const:`~aiohttp.WSMsgType.TEXT` message. :param str data: data to send. :param int compress: sets specific level of compression for single message, ``None`` for not overriding per-socket setting. :raise TypeError: if data is not :class:`str` .. versionchanged:: 3.0 The method is converted into :term:`coroutine`, *compress* parameter added. .. method:: send_bytes(data, compress=None) :async: Send *data* to peer as :const:`~aiohttp.WSMsgType.BINARY` message. :param data: data to send. :param int compress: sets specific level of compression for single message, ``None`` for not overriding per-socket setting. :raise TypeError: if data is not :class:`bytes`, :class:`bytearray` or :class:`memoryview`. .. versionchanged:: 3.0 The method is converted into :term:`coroutine`, *compress* parameter added. .. method:: send_json(data, compress=None, *, dumps=json.dumps) :async: Send *data* to peer as JSON string. :param data: data to send. :param int compress: sets specific level of compression for single message, ``None`` for not overriding per-socket setting. :param collections.abc.Callable dumps: any :term:`callable` that accepts an object and returns a JSON string (:func:`json.dumps` by default). :raise RuntimeError: if connection is not started or closing :raise ValueError: if data is not serializable object :raise TypeError: if value returned by ``dumps(data)`` is not :class:`str` .. versionchanged:: 3.0 The method is converted into :term:`coroutine`, *compress* parameter added. .. method:: close(*, code=WSCloseCode.OK, message=b'') :async: A :ref:`coroutine` that initiates closing handshake by sending :const:`~aiohttp.WSMsgType.CLOSE` message. It waits for close response from server. To add a timeout to `close()` call just wrap the call with `asyncio.wait()` or `asyncio.wait_for()`. :param int code: closing code. See also :class:`~aiohttp.WSCloseCode`. :param message: optional payload of *close* message, :class:`str` (converted to *UTF-8* encoded bytes) or :class:`bytes`. .. method:: receive() :async: A :ref:`coroutine` that waits upcoming *data* message from peer and returns it. The coroutine implicitly handles :const:`~aiohttp.WSMsgType.PING`, :const:`~aiohttp.WSMsgType.PONG` and :const:`~aiohttp.WSMsgType.CLOSE` without returning the message. It process *ping-pong game* and performs *closing handshake* internally. :return: :class:`~aiohttp.WSMessage` .. method:: receive_str() :async: A :ref:`coroutine` that calls :meth:`receive` but also asserts the message type is :const:`~aiohttp.WSMsgType.TEXT`. :return str: peer's message content. :raise TypeError: if message is :const:`~aiohttp.WSMsgType.BINARY`. .. method:: receive_bytes() :async: A :ref:`coroutine` that calls :meth:`receive` but also asserts the message type is :const:`~aiohttp.WSMsgType.BINARY`. :return bytes: peer's message content. :raise TypeError: if message is :const:`~aiohttp.WSMsgType.TEXT`. .. method:: receive_json(*, loads=json.loads) :async: A :ref:`coroutine` that calls :meth:`receive_str` and loads the JSON string to a Python dict. :param collections.abc.Callable loads: any :term:`callable` that accepts :class:`str` and returns :class:`dict` with parsed JSON (:func:`json.loads` by default). :return dict: loaded JSON content :raise TypeError: if message is :const:`~aiohttp.WSMsgType.BINARY`. :raise ValueError: if message is not valid JSON. Utilities --------- .. class:: ClientTimeout(*, total=None, connect=None, \ sock_connect=None, sock_read=None) A data class for client timeout settings. See :ref:`aiohttp-client-timeouts` for usage examples. .. attribute:: total Total number of seconds for the whole request. :class:`float`, ``None`` by default. .. attribute:: connect Maximal number of seconds for acquiring a connection from pool. The time consists connection establishment for a new connection or waiting for a free connection from a pool if pool connection limits are exceeded. For pure socket connection establishment time use :attr:`sock_connect`. :class:`float`, ``None`` by default. .. attribute:: sock_connect Maximal number of seconds for connecting to a peer for a new connection, not given from a pool. See also :attr:`connect`. :class:`float`, ``None`` by default. .. attribute:: sock_read Maximal number of seconds for reading a portion of data from a peer. :class:`float`, ``None`` by default. .. versionadded:: 3.3 .. note:: Timeouts of 5 seconds or more are rounded for scheduling on the next second boundary (an absolute time where microseconds part is zero) for the sake of performance. E.g., assume a timeout is ``10``, absolute time when timeout should expire is ``loop.time() + 5``, and it points to ``12345.67 + 10`` which is equal to ``12355.67``. The absolute time for the timeout cancellation is ``12356``. It leads to grouping all close scheduled timeout expirations to exactly the same time to reduce amount of loop wakeups. .. versionchanged:: 3.7 Rounding to the next seconds boundary is disabled for timeouts smaller than 5 seconds for the sake of easy debugging. In turn, tiny timeouts can lead to significant performance degradation on production environment. .. class:: ETag(name, is_weak=False) Represents `ETag` identifier. .. attribute:: value Value of corresponding etag without quotes. .. attribute:: is_weak Flag indicates that etag is weak (has `W/` prefix). .. versionadded:: 3.8 .. class:: RequestInfo() A data class with request URL and headers from :class:`~aiohttp.ClientRequest` object, available as :attr:`ClientResponse.request_info` attribute. .. attribute:: url Requested *url*, :class:`yarl.URL` instance. .. attribute:: method Request HTTP method like ``'GET'`` or ``'POST'``, :class:`str`. .. attribute:: headers HTTP headers for request, :class:`multidict.CIMultiDict` instance. .. attribute:: real_url Requested *url* with URL fragment unstripped, :class:`yarl.URL` instance. .. versionadded:: 3.2 .. class:: BasicAuth(login, password='', encoding='latin1') HTTP basic authentication helper. :param str login: login :param str password: password :param str encoding: encoding (``'latin1'`` by default) Should be used for specifying authorization data in client API, e.g. *auth* parameter for :meth:`ClientSession.request() `. .. classmethod:: decode(auth_header, encoding='latin1') Decode HTTP basic authentication credentials. :param str auth_header: The ``Authorization`` header to decode. :param str encoding: (optional) encoding ('latin1' by default) :return: decoded authentication data, :class:`BasicAuth`. .. classmethod:: from_url(url) Constructed credentials info from url's *user* and *password* parts. :return: credentials data, :class:`BasicAuth` or ``None`` is credentials are not provided. .. versionadded:: 2.3 .. method:: encode() Encode credentials into string suitable for ``Authorization`` header etc. :return: encoded authentication data, :class:`str`. .. class:: CookieJar(*, unsafe=False, quote_cookie=True, treat_as_secure_origin = []) The cookie jar instance is available as :attr:`ClientSession.cookie_jar`. The jar contains :class:`~http.cookies.Morsel` items for storing internal cookie data. API provides a count of saved cookies:: len(session.cookie_jar) These cookies may be iterated over:: for cookie in session.cookie_jar: print(cookie.key) print(cookie["domain"]) The class implements :class:`collections.abc.Iterable`, :class:`collections.abc.Sized` and :class:`aiohttp.abc.AbstractCookieJar` interfaces. Implements cookie storage adhering to RFC 6265. :param bool unsafe: (optional) Whether to accept cookies from IPs. :param bool quote_cookie: (optional) Whether to quote cookies according to :rfc:`2109`. Some backend systems (not compatible with RFC mentioned above) does not support quoted cookies. .. versionadded:: 3.7 :param treat_as_secure_origin: (optional) Mark origins as secure for cookies marked as Secured. Possible types are Possible types are: - :class:`tuple` or :class:`list` of :class:`str` or :class:`yarl.URL` - :class:`str` - :class:`yarl.URL` .. versionadded:: 3.8 .. method:: update_cookies(cookies, response_url=None) Update cookies returned by server in ``Set-Cookie`` header. :param cookies: a :class:`collections.abc.Mapping` (e.g. :class:`dict`, :class:`~http.cookies.SimpleCookie`) or *iterable* of *pairs* with cookies returned by server's response. :param ~yarl.URL response_url: URL of response, ``None`` for *shared cookies*. Regular cookies are coupled with server's URL and are sent only to this server, shared ones are sent in every client request. .. method:: filter_cookies(request_url) Return jar's cookies acceptable for URL and available in ``Cookie`` header for sending client requests for given URL. :param ~yarl.URL response_url: request's URL for which cookies are asked. :return: :class:`http.cookies.SimpleCookie` with filtered cookies for given URL. .. method:: save(file_path) Write a pickled representation of cookies into the file at provided path. :param file_path: Path to file where cookies will be serialized, :class:`str` or :class:`pathlib.Path` instance. .. method:: load(file_path) Load a pickled representation of cookies from the file at provided path. :param file_path: Path to file from where cookies will be imported, :class:`str` or :class:`pathlib.Path` instance. .. method:: clear(predicate=None) Removes all cookies from the jar if the predicate is ``None``. Otherwise remove only those :class:`~http.cookies.Morsel` that ``predicate(morsel)`` returns ``True``. :param predicate: callable that gets :class:`~http.cookies.Morsel` as a parameter and returns ``True`` if this :class:`~http.cookies.Morsel` must be deleted from the jar. .. versionadded:: 4.0 .. method:: clear_domain(domain) Remove all cookies from the jar that belongs to the specified domain or its subdomains. :param str domain: domain for which cookies must be deleted from the jar. .. versionadded:: 4.0 .. class:: DummyCookieJar(*, loop=None) Dummy cookie jar which does not store cookies but ignores them. Could be useful e.g. for web crawlers to iterate over Internet without blowing up with saved cookies information. To install dummy cookie jar pass it into session instance:: jar = aiohttp.DummyCookieJar() session = aiohttp.ClientSession(cookie_jar=DummyCookieJar()) .. class:: Fingerprint(digest) Fingerprint helper for checking SSL certificates by *SHA256* digest. :param bytes digest: *SHA256* digest for certificate in DER-encoded binary form (see :meth:`ssl.SSLSocket.getpeercert`). To check fingerprint pass the object into :meth:`ClientSession.get` call, e.g.:: import hashlib with open(path_to_cert, 'rb') as f: digest = hashlib.sha256(f.read()).digest() await session.get(url, ssl=aiohttp.Fingerprint(digest)) .. versionadded:: 3.0 FormData ^^^^^^^^ A :class:`FormData` object contains the form data and also handles encoding it into a body that is either ``multipart/form-data`` or ``application/x-www-form-urlencoded``. ``multipart/form-data`` is used if at least one field is an :class:`io.IOBase` object or was added with at least one optional argument to :meth:`add_field` (``content_type``, ``filename``, or ``content_transfer_encoding``). Otherwise, ``application/x-www-form-urlencoded`` is used. :class:`FormData` instances are callable and return a :class:`aiohttp.payload.Payload` on being called. .. class:: FormData(fields, quote_fields=True, charset=None) Helper class for multipart/form-data and application/x-www-form-urlencoded body generation. :param fields: A container for the key/value pairs of this form. Possible types are: - :class:`dict` - :class:`tuple` or :class:`list` - :class:`io.IOBase`, e.g. a file-like object - :class:`multidict.MultiDict` or :class:`multidict.MultiDictProxy` If it is a :class:`tuple` or :class:`list`, it must be a valid argument for :meth:`add_fields`. For :class:`dict`, :class:`multidict.MultiDict`, and :class:`multidict.MultiDictProxy`, the keys and values must be valid `name` and `value` arguments to :meth:`add_field`, respectively. .. method:: add_field(name, value, content_type=None, filename=None,\ content_transfer_encoding=None) Add a field to the form. :param str name: Name of the field :param value: Value of the field Possible types are: - :class:`str` - :class:`bytes`, :class:`bytearray`, or :class:`memoryview` - :class:`io.IOBase`, e.g. a file-like object :param str content_type: The field's content-type header (optional) :param str filename: The field's filename (optional) If this is not set and ``value`` is a :class:`bytes`, :class:`bytearray`, or :class:`memoryview` object, the `name` argument is used as the filename unless ``content_transfer_encoding`` is specified. If ``filename`` is not set and ``value`` is an :class:`io.IOBase` object, the filename is extracted from the object if possible. :param str content_transfer_encoding: The field's content-transfer-encoding header (optional) .. method:: add_fields(fields) Add one or more fields to the form. :param fields: An iterable containing: - :class:`io.IOBase`, e.g. a file-like object - :class:`multidict.MultiDict` or :class:`multidict.MultiDictProxy` - :class:`tuple` or :class:`list` of length two, containing a name-value pair Client exceptions ----------------- Exception hierarchy has been significantly modified in version 2.0. aiohttp defines only exceptions that covers connection handling and server response misbehaviors. For developer specific mistakes, aiohttp uses python standard exceptions like :exc:`ValueError` or :exc:`TypeError`. Reading a response content may raise a :exc:`ClientPayloadError` exception. This exception indicates errors specific to the payload encoding. Such as invalid compressed data, malformed chunked-encoded chunks or not enough data that satisfy the content-length header. All exceptions are available as members of *aiohttp* module. .. exception:: ClientError Base class for all client specific exceptions. Derived from :exc:`Exception` .. class:: ClientPayloadError This exception can only be raised while reading the response payload if one of these errors occurs: 1. invalid compression 2. malformed chunked encoding 3. not enough data that satisfy ``Content-Length`` HTTP header. Derived from :exc:`ClientError` .. exception:: InvalidURL URL used for fetching is malformed, e.g. it does not contain host part. Derived from :exc:`ClientError` and :exc:`ValueError` .. attribute:: url Invalid URL, :class:`yarl.URL` instance. .. class:: ContentDisposition Represent Content-Disposition header .. attribute:: type A :class:`str` instance. Value of Content-Disposition header itself, e.g. ``attachment``. .. attribute:: filename A :class:`str` instance. Content filename extracted from parameters. May be ``None``. .. attribute:: parameters Read-only mapping contains all parameters. Response errors ^^^^^^^^^^^^^^^ .. exception:: ClientResponseError These exceptions could happen after we get response from server. Derived from :exc:`ClientError` .. attribute:: request_info Instance of :class:`RequestInfo` object, contains information about request. .. attribute:: status HTTP status code of response (:class:`int`), e.g. ``400``. .. attribute:: message Message of response (:class:`str`), e.g. ``"OK"``. .. attribute:: headers Headers in response, a list of pairs. .. attribute:: history History from failed response, if available, else empty tuple. A :class:`tuple` of :class:`ClientResponse` objects used for handle redirection responses. .. attribute:: code HTTP status code of response (:class:`int`), e.g. ``400``. .. deprecated:: 3.1 .. class:: ContentTypeError Invalid content type. Derived from :exc:`ClientResponseError` .. versionadded:: 2.3 .. class:: TooManyRedirects Client was redirected too many times. Maximum number of redirects can be configured by using parameter ``max_redirects`` in :meth:`request`. Derived from :exc:`ClientResponseError` .. versionadded:: 3.2 .. class:: WSServerHandshakeError Web socket server response error. Derived from :exc:`ClientResponseError` Connection errors ^^^^^^^^^^^^^^^^^ .. class:: ClientConnectionError These exceptions related to low-level connection problems. Derived from :exc:`ClientError` .. class:: ClientOSError Subset of connection errors that are initiated by an :exc:`OSError` exception. Derived from :exc:`ClientConnectionError` and :exc:`OSError` .. class:: ClientConnectorError Connector related exceptions. Derived from :exc:`ClientOSError` .. class:: ClientProxyConnectionError Derived from :exc:`ClientConnectorError` .. class:: ClientSSLError Derived from :exc:`ClientConnectorError` .. class:: ClientConnectorSSLError Response ssl error. Derived from :exc:`ClientSSLError` and :exc:`ssl.SSLError` .. class:: ClientConnectorCertificateError Response certificate error. Derived from :exc:`ClientSSLError` and :exc:`ssl.CertificateError` .. class:: UnixClientConnectorError Derived from :exc:`ClientConnectorError` .. class:: ServerConnectionError Derived from :exc:`ClientConnectionError` .. class:: ServerDisconnectedError Server disconnected. Derived from :exc:`~aiohttp.ServerConnectionError` .. attribute:: message Partially parsed HTTP message (optional). .. class:: ServerFingerprintMismatch Server fingerprint mismatch. Derived from :exc:`ServerConnectionError` .. class:: ServerTimeoutError Server operation timeout: read timeout, etc. Derived from :exc:`ServerConnectionError` and :exc:`asyncio.TimeoutError` Hierarchy of exceptions ^^^^^^^^^^^^^^^^^^^^^^^ * :exc:`ClientError` * :exc:`ClientConnectionError` * :exc:`ClientOSError` * :exc:`ClientConnectorError` * :exc:`ClientProxyConnectionError` * :exc:`ClientSSLError` * :exc:`ClientConnectorCertificateError` * :exc:`ClientConnectorSSLError` * :exc:`UnixClientConnectorError` * :exc:`ServerConnectionError` * :exc:`ServerDisconnectedError` * :exc:`ServerFingerprintMismatch` * :exc:`ServerTimeoutError` * :exc:`ClientPayloadError` * :exc:`ClientResponseError` * :exc:`~aiohttp.ClientHttpProxyError` * :exc:`ContentTypeError` * :exc:`TooManyRedirects` * :exc:`WSServerHandshakeError` * :exc:`InvalidURL` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/conf.py0000644000175100001770000003703014607525266015054 0ustar00runnerdocker#!/usr/bin/env python3 # # aiohttp documentation build configuration file, created by # sphinx-quickstart on Wed Mar 5 12:35:35 2014. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import io import os import re from pathlib import Path PROJECT_ROOT_DIR = Path(__file__).parents[1].resolve() IS_RELEASE_ON_RTD = ( os.getenv("READTHEDOCS", "False") == "True" and os.environ["READTHEDOCS_VERSION_TYPE"] == "tag" ) if IS_RELEASE_ON_RTD: tags.add("is_release") _docs_path = os.path.dirname(__file__) _version_path = os.path.abspath( os.path.join(_docs_path, "..", "aiohttp", "__init__.py") ) with open(_version_path, encoding="latin1") as fp: try: _version_info = re.search( r'^__version__ = "' r"(?P\d+)" r"\.(?P\d+)" r"\.(?P\d+)" r'(?P.*)?"$', fp.read(), re.M, ).groupdict() except IndexError: raise RuntimeError("Unable to determine version.") # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ # stdlib-party extensions: "sphinx.ext.extlinks", "sphinx.ext.intersphinx", "sphinx.ext.viewcode", # Third-party extensions: "sphinxcontrib.blockdiag", "sphinxcontrib.towncrier", # provides `towncrier-draft-entries` directive ] try: import sphinxcontrib.spelling # noqa extensions.append("sphinxcontrib.spelling") except ImportError: pass intersphinx_mapping = { "pytest": ("http://docs.pytest.org/en/latest/", None), "python": ("http://docs.python.org/3", None), "multidict": ("https://multidict.readthedocs.io/en/stable/", None), "yarl": ("https://yarl.readthedocs.io/en/stable/", None), "aiosignal": ("https://aiosignal.readthedocs.io/en/stable/", None), "aiohttpjinja2": ("https://aiohttp-jinja2.readthedocs.io/en/stable/", None), "aiohttpremotes": ("https://aiohttp-remotes.readthedocs.io/en/stable/", None), "aiohttpsession": ("https://aiohttp-session.readthedocs.io/en/stable/", None), "aiohttpdemos": ("https://aiohttp-demos.readthedocs.io/en/latest/", None), "aiojobs": ("https://aiojobs.readthedocs.io/en/stable/", None), } # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix of source filenames. source_suffix = ".rst" # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = "index" # -- Project information ----------------------------------------------------- github_url = "https://github.com" github_repo_org = "aio-libs" github_repo_name = "aiohttp" github_repo_slug = f"{github_repo_org}/{github_repo_name}" github_repo_url = f"{github_url}/{github_repo_slug}" github_sponsors_url = f"{github_url}/sponsors" project = github_repo_name copyright = f"{project} contributors" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = "{major}.{minor}".format(**_version_info) # The full version, including alpha/beta/rc tags. release = "{major}.{minor}.{patch}{tag}".format(**_version_info) # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ["_build"] # The reST default role (used for this markup: `text`) to use for all # documents. # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. # pygments_style = 'sphinx' # The default language to highlight source code in. highlight_language = "python3" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. # keep_warnings = False # -- Extension configuration ------------------------------------------------- # -- Options for extlinks extension --------------------------------------- extlinks = { "issue": (f"{github_repo_url}/issues/%s", "#%s"), "pr": (f"{github_repo_url}/pull/%s", "PR #%s"), "commit": (f"{github_repo_url}/commit/%s", "%s"), "gh": (f"{github_url}/%s", "GitHub: %s"), "user": (f"{github_sponsors_url}/%s", "@%s"), } # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = "aiohttp_theme" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. html_theme_options = { "description": "Async HTTP client/server for asyncio and Python", "canonical_url": "http://docs.aiohttp.org/en/stable/", "github_user": github_repo_org, "github_repo": github_repo_name, "github_button": True, "github_type": "star", "github_banner": True, "badges": [ { "image": f"{github_repo_url}/workflows/CI/badge.svg", "target": f"{github_repo_url}/actions?query=workflow%3ACI", "height": "20", "alt": "Azure Pipelines CI status", }, { "image": f"https://codecov.io/github/{github_repo_slug}/coverage.svg?branch=master", "target": f"https://codecov.io/github/{github_repo_slug}", "height": "20", "alt": "Code coverage status", }, { "image": f"https://badge.fury.io/py/{project}.svg", "target": f"https://badge.fury.io/py/{project}", "height": "20", "alt": "Latest PyPI package version", }, { "image": "https://badges.gitter.im/Join%20Chat.svg", "target": f"https://gitter.im/{github_repo_org}/Lobby", "height": "20", "alt": "Chat on Gitter", }, ], } html_css_files = [ "css/logo-adjustments.css", ] # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [alabaster.get_path()] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. html_logo = "aiohttp-plain.svg" # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. html_favicon = "favicon.ico" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. # html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. html_sidebars = { "**": [ "about.html", "navigation.html", "searchbox.html", ] } # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = f"{project}doc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # 'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ( "index", f"{project}.tex", f"{project} Documentation", f"{project} contributors", "manual", ), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [("index", project, f"{project} Documentation", [project], 1)] # If true, show URL addresses after external links. # man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ( "index", project, f"{project} Documentation", "Aiohttp contributors", project, "One line description of project.", "Miscellaneous", ), ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] # If false, no module index is generated. # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. # texinfo_no_detailmenu = False # ------------------------------------------------------------------------- nitpicky = True nitpick_ignore = [ ("py:mod", "aiohttp"), # undocumented, no `.. currentmodule:: aiohttp` in docs ("py:class", "aiohttp.SimpleCookie"), # undocumented ("py:class", "aiohttp.web.RequestHandler"), # undocumented ("py:class", "aiohttp.NamedPipeConnector"), # undocumented ("py:class", "aiohttp.protocol.HttpVersion"), # undocumented ("py:class", "aiohttp.ClientRequest"), # undocumented ("py:class", "aiohttp.payload.Payload"), # undocumented ("py:class", "aiohttp.abc.AbstractResolver"), # undocumented ("py:func", "aiohttp.ws_connect"), # undocumented ("py:meth", "start"), # undocumented ("py:exc", "aiohttp.ClientHttpProxyError"), # undocumented ("py:class", "asyncio.AbstractServer"), # undocumented ("py:mod", "aiohttp.test_tools"), # undocumented ("py:class", "list of pairs"), # undocumented ("py:class", "aiohttp.protocol.HttpVersion"), # undocumented ("py:meth", "aiohttp.ClientSession.request"), # undocumented ("py:class", "aiohttp.StreamWriter"), # undocumented ("py:attr", "aiohttp.StreamResponse.body"), # undocumented ("py:class", "aiohttp.payload.StringPayload"), # undocumented ("py:meth", "aiohttp.web.Application.copy"), # undocumented ("py:meth", "asyncio.AbstractEventLoop.create_server"), # undocumented ("py:data", "aiohttp.log.server_logger"), # undocumented ("py:data", "aiohttp.log.access_logger"), # undocumented ("py:data", "aiohttp.helpers.AccessLogger"), # undocumented ("py:attr", "helpers.AccessLogger.LOG_FORMAT"), # undocumented ("py:meth", "aiohttp.web.AbstractRoute.url"), # undocumented ("py:class", "aiohttp.web.MatchedSubAppResource"), # undocumented ("py:attr", "body"), # undocumented ("py:class", "socket.socket"), # undocumented ("py:class", "socket.AddressFamily"), # undocumented ("py:obj", "logging.DEBUG"), # undocumented ("py:class", "aiohttp.abc.AbstractAsyncAccessLogger"), # undocumented ("py:meth", "aiohttp.web.Response.write_eof"), # undocumented ("py:meth", "aiohttp.payload.Payload.set_content_disposition"), # undocumented ("py:class", "cgi.FieldStorage"), # undocumented ("py:meth", "aiohttp.web.UrlDispatcher.register_resource"), # undocumented ("py:func", "aiohttp_debugtoolbar.setup"), # undocumented ("py:exc", "HTTPInternalServerError"), # undocumented ("py:exc", "HTTPForbidden"), # undocumented ("py:exc", "HTTPExpectationFailed"), # undocumented ("py:class", "HTTPFound"), # undocumented ("py:class", "HTTPMultipleChoices"), # undocumented ("py:class", "HTTPMovedPermanently"), # undocumented ("py:class", "HTTPSeeOther"), # undocumented ("py:class", "HTTPUseProxy"), # undocumented ("py:class", "HTTPTemporaryRedirect"), # undocumented ("py:class", "HTTPMethodNotAllowed"), # undocumented ("py:class", "FileResponse"), # undocumented ("py:exc", "HTTPNotFound"), # undocumented ("py:exc", "HTTPMethodNotAllowed"), # undocumented ("py:class", "HTTPMethodNotAllowed"), # undocumented ("py:class", "HTTPUnavailableForLegalReasons"), # undocumented ] # -- Options for towncrier_draft extension ----------------------------------- towncrier_draft_autoversion_mode = "draft" # or: 'sphinx-version', 'sphinx-release' towncrier_draft_include_empty = True towncrier_draft_working_directory = PROJECT_ROOT_DIR # Not yet supported: towncrier_draft_config_path = 'pyproject.toml' # relative to cwd ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/contributing-admins.rst0000644000175100001770000000541014607525266020264 0ustar00runnerdocker:orphan: Instructions for aiohttp admins =============================== This page is intended to document certain processes for admins of the aiohttp repository. For regular contributors, return to :doc:`contributing`. .. contents:: :local: Creating a new release ---------------------- .. note:: The example commands assume that ``origin`` refers to the ``aio-libs`` repository. To create a new release: #. Start on the branch for the release you are planning (e.g. ``3.8`` for v3.8.6): ``git checkout 3.8 && git pull`` #. Update the version number in ``__init__.py``. #. Run ``towncrier``. #. Check and cleanup the changes in ``CHANGES.rst``. #. Checkout a new branch: e.g. ``git checkout -b release/v3.8.6`` #. Commit and create a PR. Once PR is merged, continue. #. Go back to the release branch: e.g. ``git checkout 3.8 && git pull`` #. Add a tag: e.g. ``git tag -a v3.8.6 -m 'Release 3.8.6'`` #. Push the tag: e.g. ``git push origin v3.8.6`` #. Monitor CI to ensure release process completes without errors. Once released, we need to complete some cleanup steps (no further steps are needed for non-stable releases though). If doing a patch release, we need to do the below steps twice, first merge into the newer release branch (e.g. 3.8 into 3.9) and then to master (e.g. 3.9 into master). If a new minor release, then just merge to master. #. Switch to target branch: e.g. ``git checkout 3.9 && git pull`` #. Start a merge: e.g. ``git merge 3.8 --no-commit --no-ff --gpg-sign`` #. Carefully review the changes and revert anything that should not be included (most things outside the changelog). #. To ensure change fragments are cleaned up properly, run: ``python tools/cleanup_changes.py`` #. Commit the merge (must be a normal merge commit, not squashed). #. Push the branch directly to Github (because a PR would get squashed). When pushing, you may get a rejected message. Follow these steps to resolve: #. Checkout to a new branch and push: e.g. ``git checkout -b do-not-merge && git push`` #. Open a *draft* PR with a title of 'DO NOT MERGE'. #. Once the CI has completed on that branch, you should be able to switch back and push the target branch (as tests have passed on the merge commit now). #. This should automatically consider the PR merged and delete the temporary branch. Back on the original release branch, bump the version number and append ``.dev0`` in ``__init__.py``. If doing a minor release: #. Create a new release branch for future features to go to: e.g. ``git checkout -b 3.10 3.9 && git push`` #. Update ``target-branch`` for Dependabot to reference the new branch name in ``.github/dependabot.yml``. #. Delete the older backport label (e.g. backport-3.8): https://github.com/aio-libs/aiohttp/labels #. Add a new backport label (e.g. backport-3.10). ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/contributing.rst0000644000175100001770000002554214607525266017023 0ustar00runnerdocker.. _aiohttp-contributing: Contributing ============ (:doc:`contributing-admins`) Instructions for contributors ----------------------------- In order to make a clone of the GitHub_ repo: open the link and press the "Fork" button on the upper-right menu of the web page. I hope everybody knows how to work with git and github nowadays :) Workflow is pretty straightforward: 0. Make sure you are reading the latest version of this document. It can be found in the GitHub_ repo in the ``docs`` subdirectory. 1. Clone the GitHub_ repo using the ``--recurse-submodules`` argument 2. Setup your machine with the required development environment 3. Make a change 4. Make sure all tests passed 5. Add a file into the ``CHANGES`` folder (see `Changelog update`_ for how). 6. Commit changes to your own aiohttp clone 7. Make a pull request from the github page of your clone against the master branch 8. Optionally make backport Pull Request(s) for landing a bug fix into released aiohttp versions. .. note:: The project uses *Squash-and-Merge* strategy for *GitHub Merge* button. Basically it means that there is **no need to rebase** a Pull Request against *master* branch. Just ``git merge`` *master* into your working copy (a fork) if needed. The Pull Request is automatically squashed into the single commit once the PR is accepted. .. note:: GitHub issue and pull request threads are automatically locked when there has not been any recent activity for one year. Please open a `new issue `_ for related bugs. If you feel like there are important points in the locked discussions, please include those excerpts into that new issue. Preconditions for running aiohttp test suite -------------------------------------------- We expect you to use a python virtual environment to run our tests. There are several ways to make a virtual environment. If you like to use *virtualenv* please run: .. code-block:: shell $ cd aiohttp $ virtualenv --python=`which python3` venv $ . venv/bin/activate For standard python *venv*: .. code-block:: shell $ cd aiohttp $ python3 -m venv venv $ . venv/bin/activate For *virtualenvwrapper*: .. code-block:: shell $ cd aiohttp $ mkvirtualenv --python=`which python3` aiohttp There are other tools like *pyvenv* but you know the rule of thumb now: create a python3 virtual environment and activate it. After that please install libraries required for development: .. code-block:: shell $ pip install -r requirements/dev.txt .. note:: For now, the development tooling depends on ``make`` and assumes an Unix OS If you wish to contribute to aiohttp from a Windows machine, the easiest way is probably to `configure the WSL `_ so you can use the same instructions. If it's not possible for you or if it doesn't work, please contact us so we can find a solution together. Install pre-commit hooks: .. code-block:: shell $ pre-commit install .. warning:: If you plan to use temporary ``print()``, ``pdb`` or ``ipdb`` within the test suite, execute it with ``-s``: .. code-block:: shell $ pytest tests -s in order to run the tests without output capturing. Congratulations, you are ready to run the test suite! .. include:: ../vendor/README.rst Run autoformatter ----------------- The project uses black_ + isort_ formatters to keep the source code style. Please run `make fmt` after every change before starting tests. .. code-block:: shell $ make fmt Run aiohttp test suite ---------------------- After all the preconditions are met you can run tests typing the next command: .. code-block:: shell $ make test The command at first will run the *linters* (sorry, we don't accept pull requests with pyflakes, black, isort, or mypy errors). On *lint* success the tests will be run. Please take a look on the produced output. Any extra texts (print statements and so on) should be removed. .. note:: If you see that CI build is failing on a specific Python version and you don't have this version on your computer, you can use the helper to run it (only if you have docker):: make test-[-no-extensions] For example, if you want to run tests for python3.10 without extensions, you can run this command:: make test-3.10-no-extensions Code coverage ------------- We use *codecov.io* as an indispensable tool for analyzing our coverage results. Visit https://codecov.io/gh/aio-libs/aiohttp to see coverage reports for the master branch, history, pull requests etc. We'll use an example from a real PR to demonstrate how we use this. Once the tests run in a PR, you'll see a comment posted by *codecov*. The most important thing to check here is whether there are any new missed or partial lines in the report: .. image:: _static/img/contributing-cov-comment.svg Here, the PR has introduced 1 miss and 2 partials. Now we click the link in the comment header to open the full report: .. image:: _static/img/contributing-cov-header.svg :alt: Codecov report Now, if we look through the diff under 'Files changed' we find one of our partials: .. image:: _static/img/contributing-cov-partial.svg :alt: A while loop with partial coverage. In this case, the while loop is never skipped in our tests. This is probably not worth writing a test for (and may be a situation that is impossible to trigger anyway), so we leave this alone. We're still missing a partial and a miss, so we switch to the 'Indirect changes' tab and take a look through the diff there. This time we find the remaining 2 lines: .. image:: _static/img/contributing-cov-miss.svg :alt: An if statement that isn't covered anymore. After reviewing the PR, we find that this code is no longer needed as the changes mean that this method will never be called under those conditions. Thanks to this report, we were able to remove some redundant code from a performance-critical part of our codebase (this check would have been run, probably multiple times, for every single incoming request). .. tip:: Sometimes the diff on *codecov.io* doesn't make sense. This is usually caused by the branch being out of sync with master. Try merging master into the branch and it will likely fix the issue. Failing that, try checking coverage locally as described in the next section. Other tools ----------- The browser extension https://docs.codecov.io/docs/browser-extension is also a useful tool for analyzing the coverage directly from *Files Changed* tab on the *GitHub Pull Request* review page. You can also produce coverage reports locally with ``make cov-dev`` or just adding ``--cov-report=html`` to ``pytest``. This will run the test suite and collect coverage information. Once finished, coverage results can be view by opening: ```console $ python -m webbrowser -n file://"$(pwd)"/htmlcov/index.html ``` Documentation ------------- We encourage documentation improvements. Please before making a Pull Request about documentation changes run: .. code-block:: shell $ make doc Once it finishes it will output the index html page ``open file:///.../aiohttp/docs/_build/html/index.html``. Go to the link and make sure your doc changes looks good. Spell checking -------------- We use ``pyenchant`` and ``sphinxcontrib-spelling`` for running spell checker for documentation: .. code-block:: shell $ make doc-spelling Unfortunately there are problems with running spell checker on MacOS X. To run spell checker on Linux box you should install it first: .. code-block:: shell $ sudo apt-get install enchant $ pip install sphinxcontrib-spelling Preparing a pull request ------------------------ When making a pull request, please include a short summary of the changes and a reference to any issue tickets that the PR is intended to solve. All PRs with code changes should include tests. All changes should include a changelog entry. Changelog update ---------------- .. include:: ../CHANGES/README.rst Making a pull request --------------------- After finishing all steps make a GitHub_ Pull Request with *master* base branch. Backporting ----------- All Pull Requests are created against *master* git branch. If the Pull Request is not a new functionality but bug fixing *backport* to maintenance branch would be desirable. *aiohttp* project committer may ask for making a *backport* of the PR into maintained branch(es), in this case he or she adds a github label like *needs backport to 3.1*. *Backporting* is performed *after* main PR merging into master. Please do the following steps: 1. Find *Pull Request's commit* for cherry-picking. *aiohttp* does *squashing* PRs on merging, so open your PR page on github and scroll down to message like ``asvetlov merged commit f7b8921 into master 9 days ago``. ``f7b8921`` is the required commit number. 2. Run `cherry_picker `_ tool for making backport PR (the tool is already pre-installed from ``./requirements/dev.txt``), e.g. ``cherry_picker f7b8921 3.1``. 3. In case of conflicts fix them and continue cherry-picking by ``cherry_picker --continue``. ``cherry_picker --abort`` stops the process. ``cherry_picker --status`` shows current cherry-picking status (like ``git status``) 4. After all conflicts are done the tool opens a New Pull Request page in a browser with pre-filed information. Create a backport Pull Request and wait for review/merging. 5. *aiohttp* *committer* should remove *backport Git label* after merging the backport. How to become an aiohttp committer ---------------------------------- Contribute! The easiest way is providing Pull Requests for issues in our bug tracker. But if you have a great idea for the library improvement -- please make an issue and Pull Request. The rules for committers are simple: 1. No wild commits! Everything should go through PRs. 2. Take a part in reviews. It's very important part of maintainer's activity. 3. Pickup issues created by others, especially if they are simple. 4. Keep test suite comprehensive. In practice it means leveling up coverage. 97% is not bad but we wish to have 100% someday. Well, 99% is good target too. 5. Don't hesitate to improve our docs. Documentation is a very important thing, it's the key for project success. The documentation should not only cover our public API but help newbies to start using the project and shed a light on non-obvious gotchas. After positive answer aiohttp committer creates an issue on github with the proposal for nomination. If the proposal will collect only positive votes and no strong objection -- you'll be a new member in our team. .. _GitHub: https://github.com/aio-libs/aiohttp .. _ipdb: https://pypi.python.org/pypi/ipdb .. _black: https://pypi.python.org/pypi/black .. _isort: https://pypi.python.org/pypi/isort ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/deployment.rst0000644000175100001770000003040114607525266016462 0ustar00runnerdocker.. _aiohttp-deployment: ================= Server Deployment ================= There are several options for aiohttp server deployment: * Standalone server * Running a pool of backend servers behind of :term:`nginx`, HAProxy or other *reverse proxy server* * Using :term:`gunicorn` behind of *reverse proxy* Every method has own benefits and disadvantages. .. _aiohttp-deployment-standalone: Standalone ========== Just call :func:`aiohttp.web.run_app` function passing :class:`aiohttp.web.Application` instance. The method is very simple and could be the best solution in some trivial cases. But it does not utilize all CPU cores. For running multiple aiohttp server instances use *reverse proxies*. .. _aiohttp-deployment-nginx-supervisord: Nginx+supervisord ================= Running aiohttp servers behind :term:`nginx` makes several advantages. First, nginx is the perfect frontend server. It may prevent many attacks based on malformed http protocol etc. Second, running several aiohttp instances behind nginx allows to utilize all CPU cores. Third, nginx serves static files much faster than built-in aiohttp static file support. But this way requires more complex configuration. Nginx configuration -------------------- Here is short example of an Nginx configuration file. It does not cover all available Nginx options. For full details, read `Nginx tutorial `_ and `official Nginx documentation `_. First configure HTTP server itself: .. code-block:: nginx http { server { listen 80; client_max_body_size 4G; server_name example.com; location / { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; proxy_buffering off; proxy_pass http://aiohttp; } location /static { # path for static files root /path/to/app/static; } } } This config listens on port ``80`` for a server named ``example.com`` and redirects everything to the ``aiohttp`` backend group. Also it serves static files from ``/path/to/app/static`` path as ``example.com/static``. Next we need to configure *aiohttp upstream group*: .. code-block:: nginx http { upstream aiohttp { # fail_timeout=0 means we always retry an upstream even if it failed # to return a good HTTP response # Unix domain servers server unix:/tmp/example_1.sock fail_timeout=0; server unix:/tmp/example_2.sock fail_timeout=0; server unix:/tmp/example_3.sock fail_timeout=0; server unix:/tmp/example_4.sock fail_timeout=0; # Unix domain sockets are used in this example due to their high performance, # but TCP/IP sockets could be used instead: # server 127.0.0.1:8081 fail_timeout=0; # server 127.0.0.1:8082 fail_timeout=0; # server 127.0.0.1:8083 fail_timeout=0; # server 127.0.0.1:8084 fail_timeout=0; } } All HTTP requests for ``http://example.com`` except ones for ``http://example.com/static`` will be redirected to ``example1.sock``, ``example2.sock``, ``example3.sock`` or ``example4.sock`` backend servers. By default, Nginx uses round-robin algorithm for backend selection. .. note:: Nginx is not the only existing *reverse proxy server*, but it's the most popular one. Alternatives like HAProxy may be used as well. Supervisord ----------- After configuring Nginx we need to start our aiohttp backends. It's best to use some tool for starting them automatically after a system reboot or backend crash. There are many ways to do it: Supervisord, Upstart, Systemd, Gaffer, Circus, Runit etc. Here we'll use `Supervisord `_ as an example: .. code-block:: cfg [program:aiohttp] numprocs = 4 numprocs_start = 1 process_name = example_%(process_num)s ; Unix socket paths are specified by command line. command=/path/to/aiohttp_example.py --path=/tmp/example_%(process_num)s.sock ; We can just as easily pass TCP port numbers: ; command=/path/to/aiohttp_example.py --port=808%(process_num)s user=nobody autostart=true autorestart=true aiohttp server -------------- The last step is preparing the aiohttp server to work with supervisord. Assuming we have properly configured :class:`aiohttp.web.Application` and port is specified by command line, the task is trivial: .. code-block:: python3 # aiohttp_example.py import argparse from aiohttp import web parser = argparse.ArgumentParser(description="aiohttp server example") parser.add_argument('--path') parser.add_argument('--port') if __name__ == '__main__': app = web.Application() # configure app args = parser.parse_args() web.run_app(app, path=args.path, port=args.port) For real use cases we perhaps need to configure other things like logging etc., but it's out of scope of the topic. .. _aiohttp-deployment-gunicorn: Nginx+Gunicorn ============== aiohttp can be deployed using `Gunicorn `_, which is based on a pre-fork worker model. Gunicorn launches your app as worker processes for handling incoming requests. As opposed to deployment with :ref:`bare Nginx `, this solution does not need to manually run several aiohttp processes and use a tool like supervisord to monitor them. But nothing is free: running aiohttp application under gunicorn is slightly slower. Prepare environment ------------------- You first need to setup your deployment environment. This example is based on `Ubuntu `_ 16.04. Create a directory for your application:: >> mkdir myapp >> cd myapp Create a Python virtual environment:: >> python3 -m venv venv >> source venv/bin/activate Now that the virtual environment is ready, we'll proceed to install aiohttp and gunicorn:: >> pip install gunicorn >> pip install aiohttp Application ----------- Lets write a simple application, which we will save to file. We'll name this file *my_app_module.py*:: from aiohttp import web async def index(request): return web.Response(text="Welcome home!") my_web_app = web.Application() my_web_app.router.add_get('/', index) Application factory ------------------- As an option an entry point could be a coroutine that accepts no parameters and returns an application instance:: from aiohttp import web async def index(request): return web.Response(text="Welcome home!") async def my_web_app(): app = web.Application() app.router.add_get('/', index) return app Start Gunicorn -------------- When `Running Gunicorn `_, you provide the name of the module, i.e. *my_app_module*, and the name of the app or application factory, i.e. *my_web_app*, along with other `Gunicorn Settings `_ provided as command line flags or in your config file. In this case, we will use: * the ``--bind`` flag to set the server's socket address; * the ``--worker-class`` flag to tell Gunicorn that we want to use a custom worker subclass instead of one of the Gunicorn default worker types; * you may also want to use the ``--workers`` flag to tell Gunicorn how many worker processes to use for handling requests. (See the documentation for recommendations on `How Many Workers? `_) * you may also want to use the ``--accesslog`` flag to enable the access log to be populated. (See :ref:`logging ` for more information.) The custom worker subclass is defined in ``aiohttp.GunicornWebWorker``:: >> gunicorn my_app_module:my_web_app --bind localhost:8080 --worker-class aiohttp.GunicornWebWorker [2017-03-11 18:27:21 +0000] [1249] [INFO] Starting gunicorn 19.7.1 [2017-03-11 18:27:21 +0000] [1249] [INFO] Listening at: http://127.0.0.1:8080 (1249) [2017-03-11 18:27:21 +0000] [1249] [INFO] Using worker: aiohttp.worker.GunicornWebWorker [2015-03-11 18:27:21 +0000] [1253] [INFO] Booting worker with pid: 1253 Gunicorn is now running and ready to serve requests to your app's worker processes. .. note:: If you want to use an alternative asyncio event loop `uvloop `_, you can use the ``aiohttp.GunicornUVLoopWebWorker`` worker class. Proxy through NGINX ---------------------- We can proxy our gunicorn workers through NGINX with a configuration like this: .. code-block:: nginx worker_processes 1; user nobody nogroup; events { worker_connections 1024; } http { ## Main Server Block server { ## Open by default. listen 80 default_server; server_name main; client_max_body_size 200M; ## Main site location. location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; } } } Since gunicorn listens for requests at our localhost address on port 8080, we can use the `proxy_pass `_ directive to send web traffic to our workers. If everything is configured correctly, we should reach our application at the ip address of our web server. Proxy through NGINX + SSL ---------------------------- Here is an example NGINX configuration setup to accept SSL connections: .. code-block:: nginx worker_processes 1; user nobody nogroup; events { worker_connections 1024; } http { ## SSL Redirect server { listen 80 default; return 301 https://$host$request_uri; } ## Main Server Block server { # Open by default. listen 443 ssl default_server; listen [::]:443 ssl default_server; server_name main; client_max_body_size 200M; ssl_certificate /etc/secrets/cert.pem; ssl_certificate_key /etc/secrets/key.pem; ## Main site location. location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; } } } The first server block accepts regular http connections on port 80 and redirects them to our secure SSL connection. The second block matches our previous example except we need to change our open port to https and specify where our SSL certificates are being stored with the ``ssl_certificate`` and ``ssl_certificate_key`` directives. During development, you may want to `create your own self-signed certificates for testing purposes `_ and use another service like `Let's Encrypt `_ when you are ready to move to production. More information ---------------- See the `official documentation `_ for more information about suggested nginx configuration. You can also find out more about `configuring for secure https connections as well. `_ Logging configuration --------------------- ``aiohttp`` and ``gunicorn`` use different format for specifying access log. By default aiohttp uses own defaults:: '%a %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"' For more information please read :ref:`Format Specification for Access Log `. Proxy through Apache at your own risk ------------------------------------- Issues have been reported using Apache2 in front of aiohttp server: `#2687 Intermittent 502 proxy errors when running behind Apache `. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/essays.rst0000644000175100001770000000014214607525266015610 0ustar00runnerdockerEssays ====== .. toctree:: new_router whats_new_1_1 migration_to_2xx whats_new_3_0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/external.rst0000644000175100001770000000061014607525266016123 0ustar00runnerdockerWho uses aiohttp? ================= The list of *aiohttp* users: both libraries, big projects and web sites. Please don't hesitate to add your awesome project to the list by making a Pull Request on GitHub_. If you like the project -- please go to GitHub_ and press *Star* button! .. toctree:: third_party built_with powered_by .. _GitHub: https://github.com/aio-libs/aiohttp ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/faq.rst0000644000175100001770000003157014607525266015061 0ustar00runnerdockerFAQ === .. contents:: :local: Are there plans for an @app.route decorator like in Flask? ---------------------------------------------------------- As of aiohttp 2.3, :class:`~aiohttp.web.RouteTableDef` provides an API similar to Flask's ``@app.route``. See :ref:`aiohttp-web-alternative-routes-definition`. Unlike Flask's ``@app.route``, :class:`~aiohttp.web.RouteTableDef` does not require an ``app`` in the module namespace (which often leads to circular imports). Instead, a :class:`~aiohttp.web.RouteTableDef` is decoupled from an application instance:: routes = web.RouteTableDef() @routes.get('/get') async def handle_get(request): ... @routes.post('/post') async def handle_post(request): ... app.router.add_routes(routes) Does aiohttp have a concept like Flask's "blueprint" or Django's "app"? ----------------------------------------------------------------------- If you're writing a large application, you may want to consider using :ref:`nested applications `, which are similar to Flask's "blueprints" or Django's "apps". See: :ref:`aiohttp-web-nested-applications`. How do I create a route that matches urls with a given prefix? -------------------------------------------------------------- You can do something like the following: :: app.router.add_route('*', '/path/to/{tail:.+}', sink_handler) The first argument, ``*``, matches any HTTP method (*GET, POST, OPTIONS*, etc). The second argument matches URLS with the desired prefix. The third argument is the handler function. Where do I put my database connection so handlers can access it? ---------------------------------------------------------------- :class:`aiohttp.web.Application` object supports the :class:`dict` interface and provides a place to store your database connections or any other resource you want to share between handlers. :: db_key = web.AppKey("db_key", DB) async def go(request): db = request.app[db_key] cursor = await db.cursor() await cursor.execute('SELECT 42') # ... return web.Response(status=200, text='ok') async def init_app(loop): app = Application(loop=loop) db = await create_connection(user='user', password='123') app[db_key] = db app.router.add_get('/', go) return app How can middleware store data for web handlers to use? ------------------------------------------------------ Both :class:`aiohttp.web.Request` and :class:`aiohttp.web.Application` support the :class:`dict` interface. Therefore, data may be stored inside a request object. :: async def handler(request): request['unique_key'] = data See https://github.com/aio-libs/aiohttp_session code for an example. The ``aiohttp_session.get_session(request)`` method uses ``SESSION_KEY`` for saving request-specific session information. As of aiohttp 3.0, all response objects are dict-like structures as well. .. _aiohttp_faq_parallel_event_sources: Can a handler receive incoming events from different sources in parallel? ------------------------------------------------------------------------- Yes. As an example, we may have two event sources: 1. WebSocket for events from an end user 2. Redis PubSub for events from other parts of the application The most native way to handle this is to create a separate task for PubSub handling. Parallel :meth:`aiohttp.web.WebSocketResponse.receive` calls are forbidden; a single task should perform WebSocket reading. However, other tasks may use the same WebSocket object for sending data to peers. :: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) task = asyncio.create_task( read_subscription(ws, request.app[redis_key])) try: async for msg in ws: # handle incoming messages # use ws.send_str() to send data back ... finally: task.cancel() async def read_subscription(ws, redis): channel, = await redis.subscribe('channel:1') try: async for msg in channel.iter(): answer = process_the_message(msg) # your function here await ws.send_str(answer) finally: await redis.unsubscribe('channel:1') .. _aiohttp_faq_terminating_websockets: How do I programmatically close a WebSocket server-side? -------------------------------------------------------- Let's say we have an application with two endpoints: 1. ``/echo`` a WebSocket echo server that authenticates the user 2. ``/logout_user`` that, when invoked, closes all open WebSockets for that user. One simple solution is to keep a shared registry of WebSocket responses for a user in the :class:`aiohttp.web.Application` instance and call :meth:`aiohttp.web.WebSocketResponse.close` on all of them in ``/logout_user`` handler:: async def echo_handler(request): ws = web.WebSocketResponse() user_id = authenticate_user(request) await ws.prepare(request) request.app[websockets_key][user_id].add(ws) try: async for msg in ws: ws.send_str(msg.data) finally: request.app[websockets_key][user_id].remove(ws) return ws async def logout_handler(request): user_id = authenticate_user(request) ws_closers = [ws.close() for ws in request.app[websockets_key][user_id] if not ws.closed] # Watch out, this will keep us from returning the response # until all are closed ws_closers and await asyncio.gather(*ws_closers) return web.Response(text='OK') def main(): loop = asyncio.get_event_loop() app = web.Application(loop=loop) app.router.add_route('GET', '/echo', echo_handler) app.router.add_route('POST', '/logout', logout_handler) app[websockets_key] = defaultdict(set) web.run_app(app, host='localhost', port=8080) How do I make a request from a specific IP address? --------------------------------------------------- If your system has several IP interfaces, you may choose one which will be used used to bind a socket locally:: conn = aiohttp.TCPConnector(local_addr=('127.0.0.1', 0), loop=loop) async with aiohttp.ClientSession(connector=conn) as session: ... .. seealso:: :class:`aiohttp.TCPConnector` and ``local_addr`` parameter. What is the API stability and deprecation policy? ------------------------------------------------- *aiohttp* follows strong `Semantic Versioning `_ (SemVer). Obsolete attributes and methods are marked as *deprecated* in the documentation and raise :class:`DeprecationWarning` upon usage. Assume aiohttp ``X.Y.Z`` where ``X`` is major version, ``Y`` is minor version and ``Z`` is bugfix number. For example, if the latest released version is ``aiohttp==3.0.6``: ``3.0.7`` fixes some bugs but have no new features. ``3.1.0`` introduces new features and can deprecate some API but never remove it, also all bug fixes from previous release are merged. ``4.0.0`` removes all deprecations collected from ``3.Y`` versions **except** deprecations from the **last** ``3.Y`` release. These deprecations will be removed by ``5.0.0``. Unfortunately we may have to break these rules when a **security vulnerability** is found. If a security problem cannot be fixed without breaking backward compatibility, a bugfix release may break compatibility. This is unlikely, but possible. All backward incompatible changes are explicitly marked in :ref:`the changelog `. How do I enable gzip compression globally for my entire application? -------------------------------------------------------------------- It's impossible. Choosing what to compress and what not to compress is is a tricky matter. If you need global compression, write a custom middleware. Or enable compression in NGINX (you are deploying aiohttp behind reverse proxy, right?). How do I manage a ClientSession within a web server? ---------------------------------------------------- :class:`aiohttp.ClientSession` should be created once for the lifetime of the server in order to benefit from connection pooling. Sessions save cookies internally. If you don't need cookie processing, use :class:`aiohttp.DummyCookieJar`. If you need separate cookies for different http calls but process them in logical chains, use a single :class:`aiohttp.TCPConnector` with separate client sessions and ``connector_owner=False``. How do I access database connections from a subapplication? ----------------------------------------------------------- Restricting access from subapplication to main (or outer) app is a deliberate choice. A subapplication is an isolated unit by design. If you need to share a database object, do it explicitly:: subapp[db_key] = mainapp[db_key] mainapp.add_subapp('/prefix', subapp) How do I perform operations in a request handler after sending the response? ---------------------------------------------------------------------------- Middlewares can be written to handle post-response operations, but they run after every request. You can explicitly send the response by calling :meth:`aiohttp.web.Response.write_eof`, which starts sending before the handler returns, giving you a chance to execute follow-up operations:: def ping_handler(request): """Send PONG and increase DB counter.""" # explicitly send the response resp = web.json_response({'message': 'PONG'}) await resp.prepare(request) await resp.write_eof() # increase the pong count request.app[db_key].inc_pong() return resp A :class:`aiohttp.web.Response` object must be returned. This is required by aiohttp web contracts, even though the response has already been sent. How do I make sure my custom middleware response will behave correctly? ------------------------------------------------------------------------ Sometimes your middleware handlers might need to send a custom response. This is just fine as long as you always create a new :class:`aiohttp.web.Response` object when required. The response object is a Finite State Machine. Once it has been dispatched by the server, it will reach its final state and cannot be used again. The following middleware will make the server hang, once it serves the second response:: from aiohttp import web def misbehaved_middleware(): # don't do this! cached = web.Response(status=200, text='Hi, I am cached!') @web.middleware async def middleware(request, handler): # ignoring response for the sake of this example _res = handler(request) return cached return middleware The rule of thumb is *one request, one response*. Why is creating a ClientSession outside of an event loop dangerous? ------------------------------------------------------------------- Short answer is: life-cycle of all asyncio objects should be shorter than life-cycle of event loop. Full explanation is longer. All asyncio object should be correctly finished/disconnected/closed before event loop shutdown. Otherwise user can get unexpected behavior. In the best case it is a warning about unclosed resource, in the worst case the program just hangs, awaiting for coroutine is never resumed etc. Consider the following code from ``mod.py``:: import aiohttp session = aiohttp.ClientSession() async def fetch(url): async with session.get(url) as resp: return await resp.text() The session grabs current event loop instance and stores it in a private variable. The main module imports the module and installs ``uvloop`` (an alternative fast event loop implementation). ``main.py``:: import asyncio import uvloop import mod asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) asyncio.run(main()) The code is broken: ``session`` is bound to default ``asyncio`` loop on import time but the loop is changed **after the import** by ``set_event_loop()``. As result ``fetch()`` call hangs. To avoid import dependency hell *aiohttp* encourages creation of ``ClientSession`` from async function. The same policy works for ``web.Application`` too. Another use case is unit test writing. Very many test libraries (*aiohttp test tools* first) creates a new loop instance for every test function execution. It's done for sake of tests isolation. Otherwise pending activity (timers, network packets etc.) from previous test may interfere with current one producing very cryptic and unstable test failure. Note: *class variables* are hidden globals actually. The following code has the same problem as ``mod.py`` example, ``session`` variable is the hidden global object:: class A: session = aiohttp.ClientSession() async def fetch(self, url): async with session.get(url) as resp: return await resp.text() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/favicon.ico0000644000175100001770000001027614607525266015701 0ustar00runnerdocker  ( @ [,[,[,([,l[,[,ܴ[,[,[,[,[,ܴ[,[,l[,([,[,[,[,[,5[,[,ݴ[,[,[,[,m[,^[,^[,m[,[,[,[,޴[,[,5[,[,Z+[,[,[,[,[,ʴ[,m[,'[,\,[,[-Z([,[,'[,m[,ʴ[,[,[,[,[-[,[,[,3[,´[,[,x[,\,Z,\,Z,[,[,m[,޴[,[,3[,[,[,[,[,?[,ٴ[,[,r[,#[,[,[,[,E[,ڴ[,ش[,?[,[,[,[,[,4[,ش[,[,)[,[,R[,[,[,[,[,C[,[,X[,[,ش[,3[,Z-[,[,[,´[,[,[,4[,[,[,[,[,[,[,[,[,H[,[,[,[,[,[,[,[,[,ݴ[,2[,[, [,n[,^[,[-[,[,[,S[,][, [,[,2[,޴[,[,[,[,[,6[,[,n[,[,[,[,[,U[,[,[,[,*[,[,2[,Z,[,[,[,[,Y[,[,[,[,[,p[,[,6[,[,[,[,ȴ[,[,[,[,[,U[,[,[,[,[,[,[,[,[,G[,.[,[,[,̴[,|[,[, [,6[,I[,d[,۴[,[,[,)[,ܴ[,n[,[,Z,[,[,M[,a[,[,[,,[,U[,R[,4[,M[,![,#[,>[,~[,[,[,[,f[,K[,8[,"[, [,o[,ܴ[,([,l[,ߴ[,'[,[,[,[,[,[,[,[,d[,G[,[,[,[/[,[,0[,[,[,[,[,Z,[,[,([,ߴ[,l[,[,[,![,&[,4[,A[,J[,r[,[,[,[,8[,[,[,[,[,[,q[,*[,[,[,[,[,[,[,۴[,[,N[,E[,8[,+[,[,[,[,[,[,[,[,[-[,O[,*[,Z*[,[,[,[,ܴ[,[,m[,[+Z,[,[, [,![,G[,>[,[,[,[,%[,S[,[,[,[,n[,[,[,^[,[,[,[,X[,"[,[,[,[,Z[,[,[,[,^[,[,[,^[,[,[,[,\[, [,\,[,[,7[,E[,[,[,[,^[,[,[,m[,R9\,[,[,4[,KZ,\+Y/[,[,\[,[,[,[,n[,[,ܴ[,[,[,[,[,[,O[,l[,[,[,[,:[,[,Z-[,[,[,ܴ[,[,[,[,[,Z-[,w[,[,[,[,[,[,[,[,[,[,[,[,m[,[,([,[,[,%[,ߴ[,[,[,[,[,[,9[,[,[,([,ߴ[,l[,)[,ݴ[,o[,[,[,[,D[,[,[,[,[,[,[,_[,[,[,[,n[,ܴ[,([,[,[,ɴ[,[,[,[,2[,[,[,[,[,[,[,}[,$[, R[,[,[,[,ȴ[,[,[,[,6[,[,n[-[,[,[, [,[,[,[,[,[,[,0[,H[,Z[,G[,R[,[,[,[,[,n[,[,6[,[,[,[,[,ݴ[,2[,[,[,\,[,7[,^[,[,д[,Դ[,[,"[,Z+[, [,&[,[,[,y[,[,5[,ݴ[,[-[,[,[,[,´[,[,[,Z-[,[-[,:[,S[,[,[,[,[,[,[,[,[,[,M[,.[,c[,ִ[,[,[,[-[,[,4[,ش[,[,[,[,Z-[,;[,R[,[,Z-[,[,[,[,ش[,4[,[,[,[,[,?[,ٴ[,[,1[+[,;[,P[,[,[,T#[,1[,[,ٴ[,?[,[,[,[,[,4[,ô[,޴[,[,][,[,\,Z,[,[,n[,[,ô[,4[,[,Z,[,[,[,[,[,̴[,m[,'[,Y*[-\-U%[,[,'[,n[,ʴ[,[,[,[,\-[,[,[,5[,[,ݴ[,[,[,[,m[,^[,^[,m[,[,[,[,޴[,[,5[,[,[,[,[,([,l[,[,ܴ[,[,[,[,[,ݴ[,[,m[,([,[,???!>8q8x?????1>?././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/glossary.rst0000644000175100001770000001041114607525266016144 0ustar00runnerdocker.. _aiohttp-glossary: ========== Glossary ========== .. if you add new entries, keep the alphabetical sorting! .. glossary:: :sorted: aiodns DNS resolver for asyncio. https://pypi.python.org/pypi/aiodns asyncio The library for writing single-threaded concurrent code using coroutines, multiplexing I/O access over sockets and other resources, running network clients and servers, and other related primitives. Reference implementation of :pep:`3156` https://pypi.python.org/pypi/asyncio/ Brotli Brotli is a generic-purpose lossless compression algorithm that compresses data using a combination of a modern variant of the LZ77 algorithm, Huffman coding and second order context modeling, with a compression ratio comparable to the best currently available general-purpose compression methods. It is similar in speed with deflate but offers more dense compression. The specification of the Brotli Compressed Data Format is defined :rfc:`7932` https://pypi.org/project/Brotli/ brotlicffi An alternative implementation of :term:`Brotli` built using the CFFI library. This implementation supports PyPy correctly. https://pypi.org/project/brotlicffi/ callable Any object that can be called. Use :func:`callable` to check that. gunicorn Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. http://gunicorn.org/ IDNA An Internationalized Domain Name in Applications (IDNA) is an industry standard for encoding Internet Domain Names that contain in whole or in part, in a language-specific script or alphabet, such as Arabic, Chinese, Cyrillic, Tamil, Hebrew or the Latin alphabet-based characters with diacritics or ligatures, such as French. These writing systems are encoded by computers in multi-byte Unicode. Internationalized domain names are stored in the Domain Name System as ASCII strings using Punycode transcription. keep-alive A technique for communicating between HTTP client and server when connection is not closed after sending response but kept open for sending next request through the same socket. It makes communication faster by getting rid of connection establishment for every request. nginx Nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server. https://nginx.org/en/ percent-encoding A mechanism for encoding information in a Uniform Resource Locator (URL) if URL parts don't fit in safe characters space. requests Currently the most popular synchronous library to make HTTP requests in Python. https://requests.readthedocs.io requoting Applying :term:`percent-encoding` to non-safe symbols and decode percent encoded safe symbols back. According to :rfc:`3986` allowed path symbols are:: allowed = unreserved / pct-encoded / sub-delims / ":" / "@" / "/" pct-encoded = "%" HEXDIG HEXDIG unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=" resource A concept reflects the HTTP **path**, every resource corresponds to *URI*. May have a unique name. Contains :term:`route`\'s for different HTTP methods. route A part of :term:`resource`, resource's *path* coupled with HTTP method. web-handler An endpoint that returns HTTP response. websocket A protocol providing full-duplex communication channels over a single TCP connection. The WebSocket protocol was standardized by the IETF as :rfc:`6455` yarl A library for operating with URL objects. https://pypi.python.org/pypi/yarl Environment Variables ===================== .. envvar:: NETRC If set, HTTP Basic Auth will be read from the file pointed to by this environment variable, rather than from :file:`~/.netrc`. .. seealso:: ``.netrc`` documentation: https://www.gnu.org/software/inetutils/manual/html_node/The-_002enetrc-file.html ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/http_request_lifecycle.rst0000644000175100001770000001264614607525266021063 0ustar00runnerdocker .. _aiohttp-request-lifecycle: The aiohttp Request Lifecycle ============================= Why is aiohttp client API that way? -------------------------------------- The first time you use aiohttp, you'll notice that a simple HTTP request is performed not with one, but with up to three steps: .. code-block:: python async with aiohttp.ClientSession() as session: async with session.get('http://python.org') as response: print(await response.text()) It's especially unexpected when coming from other libraries such as the very popular :term:`requests`, where the "hello world" looks like this: .. code-block:: python response = requests.get('http://python.org') print(response.text) So why is the aiohttp snippet so verbose? Because aiohttp is asynchronous, its API is designed to make the most out of non-blocking network operations. In code like this, requests will block three times, and does it transparently, while aiohttp gives the event loop three opportunities to switch context: - When doing the ``.get()``, both libraries send a GET request to the remote server. For aiohttp, this means asynchronous I/O, which is marked here with an ``async with`` that gives you the guarantee that not only it doesn't block, but that it's cleanly finalized. - When doing ``response.text`` in requests, you just read an attribute. The call to ``.get()`` already preloaded and decoded the entire response payload, in a blocking manner. aiohttp loads only the headers when ``.get()`` is executed, letting you decide to pay the cost of loading the body afterward, in a second asynchronous operation. Hence the ``await response.text()``. - ``async with aiohttp.ClientSession()`` does not perform I/O when entering the block, but at the end of it, it will ensure all remaining resources are closed correctly. Again, this is done asynchronously and must be marked as such. The session is also a performance tool, as it manages a pool of connections for you, allowing you to reuse them instead of opening and closing a new one at each request. You can even `manage the pool size by passing a connector object `_. Using a session as a best practice ----------------------------------- The requests library does in fact also provides a session system. Indeed, it lets you do: .. code-block:: python with requests.Session() as session: response = session.get('http://python.org') print(response.text) It's just not the default behavior, nor is it advertised early in the documentation. Because of this, most users take a hit in performance, but can quickly start hacking. And for requests, it's an understandable trade-off, since its goal is to be "HTTP for humans" and simplicity has always been more important than performance in this context. However, if one uses aiohttp, one chooses asynchronous programming, a paradigm that makes the opposite trade-off: more verbosity for better performance. And so the library default behavior reflects this, encouraging you to use performant best practices from the start. How to use the ClientSession ? ------------------------------- By default the :class:`aiohttp.ClientSession` object will hold a connector with a maximum of 100 connections, putting the rest in a queue. This is quite a big number, this means you must be connected to a hundred different servers (not pages!) concurrently before even having to consider if your task needs resource adjustment. In fact, you can picture the session object as a user starting and closing a browser: it wouldn't make sense to do that every time you want to load a new tab. So you are expected to reuse a session object and make many requests from it. For most scripts and average-sized software, this means you can create a single session, and reuse it for the entire execution of the program. You can even pass the session around as a parameter in functions. For example, the typical "hello world": .. code-block:: python import aiohttp import asyncio async def main(): async with aiohttp.ClientSession() as session: async with session.get('http://python.org') as response: html = await response.text() print(html) asyncio.run(main()) Can become this: .. code-block:: python import aiohttp import asyncio async def fetch(session, url): async with session.get(url) as response: return await response.text() async def main(): async with aiohttp.ClientSession() as session: html = await fetch(session, 'http://python.org') print(html) asyncio.run(main()) On more complex code bases, you can even create a central registry to hold the session object from anywhere in the code, or a higher level ``Client`` class that holds a reference to it. When to create more than one session object then? It arises when you want more granularity with your resources management: - you want to group connections by a common configuration. e.g: sessions can set cookies, headers, timeout values, etc. that are shared for all connections they hold. - you need several threads and want to avoid sharing a mutable object between them. - you want several connection pools to benefit from different queues and assign priorities. e.g: one session never uses the queue and is for high priority requests, the other one has a small concurrency limit and a very long queue, for non important requests. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/index.rst0000644000175100001770000001254114607525266015416 0ustar00runnerdocker.. aiohttp documentation master file, created by sphinx-quickstart on Wed Mar 5 12:35:35 2014. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. ================== Welcome to AIOHTTP ================== Asynchronous HTTP Client/Server for :term:`asyncio` and Python. Current version is |release|. .. _GitHub: https://github.com/aio-libs/aiohttp Key Features ============ - Supports both :ref:`aiohttp-client` and :ref:`HTTP Server `. - Supports both :ref:`Server WebSockets ` and :ref:`Client WebSockets ` out-of-the-box without the Callback Hell. - Web-server has :ref:`aiohttp-web-middlewares`, :ref:`aiohttp-web-signals` and pluggable routing. .. _aiohttp-installation: Library Installation ==================== .. code-block:: bash $ pip install aiohttp For speeding up DNS resolving by client API you may install :term:`aiodns` as well. This option is highly recommended: .. code-block:: bash $ pip install aiodns Installing all speedups in one command -------------------------------------- The following will get you ``aiohttp`` along with :term:`aiodns` and ``Brotli`` in one bundle. No need to type separate commands anymore! .. code-block:: bash $ pip install aiohttp[speedups] Getting Started =============== Client example -------------- .. code-block:: python import aiohttp import asyncio async def main(): async with aiohttp.ClientSession() as session: async with session.get('http://python.org') as response: print("Status:", response.status) print("Content-type:", response.headers['content-type']) html = await response.text() print("Body:", html[:15], "...") asyncio.run(main()) This prints: .. code-block:: text Status: 200 Content-type: text/html; charset=utf-8 Body: ... Coming from :term:`requests` ? Read :ref:`why we need so many lines `. Server example: ---------------- .. code-block:: python from aiohttp import web async def handle(request): name = request.match_info.get('name', "Anonymous") text = "Hello, " + name return web.Response(text=text) app = web.Application() app.add_routes([web.get('/', handle), web.get('/{name}', handle)]) if __name__ == '__main__': web.run_app(app) For more information please visit :ref:`aiohttp-client` and :ref:`aiohttp-web` pages. Development mode ================ When writing your code, we recommend enabling Python's `development mode `_ (``python -X dev``). In addition to the extra features enabled for asyncio, aiohttp will: - Use a strict parser in the client code (which can help detect malformed responses from a server). - Enable some additional checks (resulting in warnings in certain situations). What's new in aiohttp 3? ======================== Go to :ref:`aiohttp_whats_new_3_0` page for aiohttp 3.0 major release changes. Tutorial ======== :ref:`Polls tutorial ` Source code =========== The project is hosted on GitHub_ Please feel free to file an issue on the `bug tracker `_ if you have found a bug or have some suggestion in order to improve the library. Dependencies ============ - *async_timeout* - *attrs* - *multidict* - *yarl* - *Optional* :term:`aiodns` for fast DNS resolving. The library is highly recommended. .. code-block:: bash $ pip install aiodns - *Optional* :term:`Brotli` or :term:`brotlicffi` for brotli (:rfc:`7932`) client compression support. .. code-block:: bash $ pip install Brotli Communication channels ====================== *aio-libs Discussions*: https://github.com/aio-libs/aiohttp/discussions Feel free to post your questions and ideas here. *gitter chat* https://gitter.im/aio-libs/Lobby We support `Stack Overflow `_. Please add *aiohttp* tag to your question there. Contributing ============ Please read the :ref:`instructions for contributors` before making a Pull Request. Authors and License =================== The ``aiohttp`` package is written mostly by Nikolay Kim and Andrew Svetlov. It's *Apache 2* licensed and freely available. Feel free to improve this package and send a pull request to GitHub_. .. _aiohttp-backward-compatibility-policy: Policy for Backward Incompatible Changes ======================================== *aiohttp* keeps backward compatibility. After deprecating some *Public API* (method, class, function argument, etc.) the library guaranties the usage of *deprecated API* is still allowed at least for a year and half after publishing new release with deprecation. All deprecations are reflected in documentation and raises :exc:`DeprecationWarning`. Sometimes we are forced to break the own rule for sake of very strong reason. Most likely the reason is a critical bug which cannot be solved without major API change, but we are working hard for keeping these changes as rare as possible. Table Of Contents ================= .. toctree:: :name: mastertoc :maxdepth: 2 client web utilities faq misc external contributing ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/logging.rst0000644000175100001770000001314114607525266015732 0ustar00runnerdocker.. _aiohttp-logging: Logging ======= .. currentmodule:: aiohttp *aiohttp* uses standard :mod:`logging` for tracking the library activity. We have the following loggers enumerated by names: - ``'aiohttp.access'`` - ``'aiohttp.client'`` - ``'aiohttp.internal'`` - ``'aiohttp.server'`` - ``'aiohttp.web'`` - ``'aiohttp.websocket'`` You may subscribe to these loggers for getting logging messages. The page does not provide instructions for logging subscribing while the most friendly method is :func:`logging.config.dictConfig` for configuring whole loggers in your application. Logging does not work out of the box. It requires at least minimal ``'logging'`` configuration. Example of minimal working logger setup:: import logging from aiohttp import web app = web.Application() logging.basicConfig(level=logging.DEBUG) web.run_app(app, port=5000) .. versionadded:: 4.0.0 Access logs ----------- Access logs are enabled by default. If the `debug` flag is set, and the default logger ``'aiohttp.access'`` is used, access logs will be output to :obj:`~sys.stderr` if no handlers are attached. Furthermore, if the default logger has no log level set, the log level will be set to :obj:`logging.DEBUG`. This logging may be controlled by :meth:`aiohttp.web.AppRunner` and :func:`aiohttp.web.run_app`. To override the default logger, pass an instance of :class:`logging.Logger` to override the default logger. .. note:: Use ``web.run_app(app, access_log=None)`` to disable access logs. In addition, *access_log_format* may be used to specify the log format. .. _aiohttp-logging-access-log-format-spec: Format specification ^^^^^^^^^^^^^^^^^^^^ The library provides custom micro-language to specifying info about request and response: +--------------+---------------------------------------------------------+ | Option | Meaning | +==============+=========================================================+ | ``%%`` | The percent sign | +--------------+---------------------------------------------------------+ | ``%a`` | Remote IP-address | | | (IP-address of proxy if using reverse proxy) | +--------------+---------------------------------------------------------+ | ``%t`` | Time when the request was started to process | +--------------+---------------------------------------------------------+ | ``%P`` | The process ID of the child that serviced the request | +--------------+---------------------------------------------------------+ | ``%r`` | First line of request | +--------------+---------------------------------------------------------+ | ``%s`` | Response status code | +--------------+---------------------------------------------------------+ | ``%b`` | Size of response in bytes, including HTTP headers | +--------------+---------------------------------------------------------+ | ``%T`` | The time taken to serve the request, in seconds | +--------------+---------------------------------------------------------+ | ``%Tf`` | The time taken to serve the request, in seconds | | | with fraction in %.06f format | +--------------+---------------------------------------------------------+ | ``%D`` | The time taken to serve the request, in microseconds | +--------------+---------------------------------------------------------+ | ``%{FOO}i`` | ``request.headers['FOO']`` | +--------------+---------------------------------------------------------+ | ``%{FOO}o`` | ``response.headers['FOO']`` | +--------------+---------------------------------------------------------+ The default access log format is:: '%a %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"' .. versionadded:: 2.3.0 *access_log_class* introduced. Example of a drop-in replacement for the default access logger:: from aiohttp.abc import AbstractAccessLogger class AccessLogger(AbstractAccessLogger): def log(self, request, response, time): self.logger.info(f'{request.remote} ' f'"{request.method} {request.path} ' f'done in {time}s: {response.status}') .. _gunicorn-accesslog: Gunicorn access logs ^^^^^^^^^^^^^^^^^^^^ When `Gunicorn `_ is used for :ref:`deployment `, its default access log format will be automatically replaced with the default aiohttp's access log format. If Gunicorn's option access_logformat_ is specified explicitly, it should use aiohttp's format specification. Gunicorn's access log works only if accesslog_ is specified explicitly in your config or as a command line option. This configuration can be either a path or ``'-'``. If the application uses a custom logging setup intercepting the ``'gunicorn.access'`` logger, accesslog_ should be set to ``'-'`` to prevent Gunicorn to create an empty access log file upon every startup. Error logs ---------- :mod:`aiohttp.web` uses a logger named ``'aiohttp.server'`` to store errors given on web requests handling. This log is enabled by default. To use a different logger name, pass *logger* (:class:`logging.Logger` instance) to the :meth:`aiohttp.web.AppRunner` constructor. .. _access_logformat: http://docs.gunicorn.org/en/stable/settings.html#access-log-format .. _accesslog: http://docs.gunicorn.org/en/stable/settings.html#accesslog ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/make.bat0000644000175100001770000001505714607525266015167 0ustar00runnerdocker@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . set I18NSPHINXOPTS=%SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. xml to make Docutils-native XML files echo. pseudoxml to make pseudoxml-XML files for display purposes echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) %SPHINXBUILD% 2> nul if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\aiohttp.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\aiohttp.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdf" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf cd %BUILDDIR%/.. echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdfja" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf-ja cd %BUILDDIR%/.. echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) if "%1" == "xml" ( %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml if errorlevel 1 exit /b 1 echo. echo.Build finished. The XML files are in %BUILDDIR%/xml. goto end ) if "%1" == "pseudoxml" ( %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml if errorlevel 1 exit /b 1 echo. echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. goto end ) :end ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/migration_to_2xx.rst0000644000175100001770000001601014607525266017576 0ustar00runnerdocker.. _aiohttp-migration: Migration to 2.x ================ Client ------ chunking ^^^^^^^^ aiohttp does not support custom chunking sizes. It is up to the developer to decide how to chunk data streams. If chunking is enabled, aiohttp encodes the provided chunks in the "Transfer-encoding: chunked" format. aiohttp does not enable chunked encoding automatically even if a *transfer-encoding* header is supplied: *chunked* has to be set explicitly. If *chunked* is set, then the *Transfer-encoding* and *content-length* headers are disallowed. compression ^^^^^^^^^^^ Compression has to be enabled explicitly with the *compress* parameter. If compression is enabled, adding a *content-encoding* header is not allowed. Compression also enables the *chunked* transfer-encoding. Compression can not be combined with a *Content-Length* header. Client Connector ^^^^^^^^^^^^^^^^ 1. By default a connector object manages a total number of concurrent connections. This limit was a per host rule in version 1.x. In 2.x, the `limit` parameter defines how many concurrent connection connector can open and a new `limit_per_host` parameter defines the limit per host. By default there is no per-host limit. 2. BaseConnector.close is now a normal function as opposed to coroutine in version 1.x 3. BaseConnector.conn_timeout was moved to ClientSession ClientResponse.release ^^^^^^^^^^^^^^^^^^^^^^ Internal implementation was significantly redesigned. It is not required to call `release` on the response object. When the client fully receives the payload, the underlying connection automatically returns back to pool. If the payload is not fully read, the connection is closed Client exceptions ^^^^^^^^^^^^^^^^^ Exception hierarchy has been significantly modified. aiohttp now defines only exceptions that covers connection handling and server response misbehaviors. For developer specific mistakes, aiohttp uses python standard exceptions like ValueError or TypeError. Reading a response content may raise a ClientPayloadError exception. This exception indicates errors specific to the payload encoding. Such as invalid compressed data, malformed chunked-encoded chunks or not enough data that satisfy the content-length header. All exceptions are moved from `aiohttp.errors` module to top level `aiohttp` module. New hierarchy of exceptions: * `ClientError` - Base class for all client specific exceptions - `ClientResponseError` - exceptions that could happen after we get response from server * `WSServerHandshakeError` - web socket server response error - `ClientHttpProxyError` - proxy response - `ClientConnectionError` - exceptions related to low-level connection problems * `ClientOSError` - subset of connection errors that are initiated by an OSError exception - `ClientConnectorError` - connector related exceptions * `ClientProxyConnectionError` - proxy connection initialization error - `ServerConnectionError` - server connection related errors * `ServerDisconnectedError` - server disconnected * `ServerTimeoutError` - server operation timeout, (read timeout, etc) * `ServerFingerprintMismatch` - server fingerprint mismatch - `ClientPayloadError` - This exception can only be raised while reading the response payload if one of these errors occurs: invalid compression, malformed chunked encoding or not enough data that satisfy content-length header. Client payload (form-data) ^^^^^^^^^^^^^^^^^^^^^^^^^^ To unify form-data/payload handling a new `Payload` system was introduced. It handles customized handling of existing types and provide implementation for user-defined types. 1. FormData.__call__ does not take an encoding arg anymore and its return value changes from an iterator or bytes to a Payload instance. aiohttp provides payload adapters for some standard types like `str`, `byte`, `io.IOBase`, `StreamReader` or `DataQueue`. 2. a generator is not supported as data provider anymore, `streamer` can be used instead. For example, to upload data from file:: @aiohttp.streamer def file_sender(writer, file_name=None): with open(file_name, 'rb') as f: chunk = f.read(2**16) while chunk: yield from writer.write(chunk) chunk = f.read(2**16) # Then you can use `file_sender` like this: async with session.post('http://httpbin.org/post', data=file_sender(file_name='huge_file')) as resp: print(await resp.text()) Various ^^^^^^^ 1. the `encoding` parameter is deprecated in `ClientSession.request()`. Payload encoding is controlled at the payload level. It is possible to specify an encoding for each payload instance. 2. the `version` parameter is removed in `ClientSession.request()` client version can be specified in the `ClientSession` constructor. 3. `aiohttp.MsgType` dropped, use `aiohttp.WSMsgType` instead. 4. `ClientResponse.url` is an instance of `yarl.URL` class (`url_obj` is deprecated) 5. `ClientResponse.raise_for_status()` raises :exc:`aiohttp.ClientResponseError` exception 6. `ClientResponse.json()` is strict about response's content type. if content type does not match, it raises :exc:`aiohttp.ClientResponseError` exception. To disable content type check you can pass ``None`` as `content_type` parameter. Server ------ ServerHttpProtocol and low-level details ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Internal implementation was significantly redesigned to provide better performance and support HTTP pipelining. ServerHttpProtocol is dropped, implementation is merged with RequestHandler a lot of low-level api's are dropped. Application ^^^^^^^^^^^ 1. Constructor parameter `loop` is deprecated. Loop is get configured by application runner, `run_app` function for any of gunicorn workers. 2. `Application.router.add_subapp` is dropped, use `Application.add_subapp` instead 3. `Application.finished` is dropped, use `Application.cleanup` instead WebRequest and WebResponse ^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. the `GET` and `POST` attributes no longer exist. Use the `query` attribute instead of `GET` 2. Custom chunking size is not support `WebResponse.chunked` - developer is responsible for actual chunking. 3. Payloads are supported as body. So it is possible to use client response's content object as body parameter for `WebResponse` 4. `FileSender` api is dropped, it is replaced with more general `FileResponse` class:: async def handle(request): return web.FileResponse('path-to-file.txt') 5. `WebSocketResponse.protocol` is renamed to `WebSocketResponse.ws_protocol`. `WebSocketResponse.protocol` is instance of `RequestHandler` class. RequestPayloadError ^^^^^^^^^^^^^^^^^^^ Reading request's payload may raise a `RequestPayloadError` exception. The behavior is similar to `ClientPayloadError`. WSGI ^^^^ *WSGI* support has been dropped, as well as gunicorn wsgi support. We still provide default and uvloop gunicorn workers for `web.Application` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/misc.rst0000644000175100001770000000037114607525266015240 0ustar00runnerdocker.. _aiohttp-misc: Miscellaneous ============= Helpful pages. .. toctree:: :name: misc essays glossary .. toctree:: :titlesonly: changes Indices and tables ------------------ * :ref:`genindex` * :ref:`modindex` * :ref:`search` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/multipart.rst0000644000175100001770000002731514607525266016335 0ustar00runnerdocker.. currentmodule:: aiohttp .. _aiohttp-multipart: Working with Multipart ====================== ``aiohttp`` supports a full featured multipart reader and writer. Both are designed with streaming processing in mind to avoid unwanted footprint which may be significant if you're dealing with large payloads, but this also means that most I/O operation are only possible to be executed a single time. Reading Multipart Responses --------------------------- Assume you made a request, as usual, and want to process the response multipart data:: async with aiohttp.request(...) as resp: pass First, you need to wrap the response with a :meth:`MultipartReader.from_response`. This needs to keep the implementation of :class:`MultipartReader` separated from the response and the connection routines which makes it more portable:: reader = aiohttp.MultipartReader.from_response(resp) Let's assume with this response you'd received some JSON document and multiple files for it, but you don't need all of them, just a specific one. So first you need to enter into a loop where the multipart body will be processed:: metadata = None filedata = None while True: part = await reader.next() The returned type depends on what the next part is: if it's a simple body part then you'll get :class:`BodyPartReader` instance here, otherwise, it will be another :class:`MultipartReader` instance for the nested multipart. Remember, that multipart format is recursive and supports multiple levels of nested body parts. When there are no more parts left to fetch, ``None`` value will be returned - that's the signal to break the loop:: if part is None: break Both :class:`BodyPartReader` and :class:`MultipartReader` provides access to body part headers: this allows you to filter parts by their attributes:: if part.headers[aiohttp.hdrs.CONTENT_TYPE] == 'application/json': metadata = await part.json() continue Nor :class:`BodyPartReader` or :class:`MultipartReader` instances does not read the whole body part data without explicitly asking for. :class:`BodyPartReader` provides a set of helpers methods to fetch popular content types in friendly way: - :meth:`BodyPartReader.text` for plain text data; - :meth:`BodyPartReader.json` for JSON; - :meth:`BodyPartReader.form` for `application/www-urlform-encode` Each of these methods automatically recognizes if content is compressed by using `gzip` and `deflate` encoding (while it respects `identity` one), or if transfer encoding is base64 or `quoted-printable` - in each case the result will get automatically decoded. But in case you need to access to raw binary data as it is, there are :meth:`BodyPartReader.read` and :meth:`BodyPartReader.read_chunk` coroutine methods as well to read raw binary data as it is all-in-single-shot or by chunks respectively. When you have to deal with multipart files, the :attr:`BodyPartReader.filename` property comes to help. It's a very smart helper which handles `Content-Disposition` handler right and extracts the right filename attribute from it:: if part.filename != 'secret.txt': continue If current body part does not matches your expectation and you want to skip it - just continue a loop to start a next iteration of it. Here is where magic happens. Before fetching the next body part ``await reader.next()`` it ensures that the previous one was read completely. If it was not, all its content sends to the void in term to fetch the next part. So you don't have to care about cleanup routines while you're within a loop. Once you'd found a part for the file you'd searched for, just read it. Let's handle it as it is without applying any decoding magic:: filedata = await part.read(decode=False) Later you may decide to decode the data. It's still simple and possible to do:: filedata = part.decode(filedata) Once you are done with multipart processing, just break a loop:: break Sending Multipart Requests -------------------------- :class:`MultipartWriter` provides an interface to build multipart payload from the Python data and serialize it into chunked binary stream. Since multipart format is recursive and supports deeply nesting, you can use ``with`` statement to design your multipart data closer to how it will be:: with aiohttp.MultipartWriter('mixed') as mpwriter: ... with aiohttp.MultipartWriter('related') as subwriter: ... mpwriter.append(subwriter) with aiohttp.MultipartWriter('related') as subwriter: ... with aiohttp.MultipartWriter('related') as subsubwriter: ... subwriter.append(subsubwriter) mpwriter.append(subwriter) with aiohttp.MultipartWriter('related') as subwriter: ... mpwriter.append(subwriter) The :meth:`MultipartWriter.append` is used to join new body parts into a single stream. It accepts various inputs and determines what default headers should be used for. For text data default `Content-Type` is :mimetype:`text/plain; charset=utf-8`:: mpwriter.append('hello') For binary data :mimetype:`application/octet-stream` is used:: mpwriter.append(b'aiohttp') You can always override these default by passing your own headers with the second argument:: mpwriter.append(io.BytesIO(b'GIF89a...'), {'CONTENT-TYPE': 'image/gif'}) For file objects `Content-Type` will be determined by using Python's mod:`mimetypes` module and additionally `Content-Disposition` header will include the file's basename:: part = root.append(open(__file__, 'rb')) If you want to send a file with a different name, just handle the :class:`~aiohttp.payload.Payload` instance which :meth:`MultipartWriter.append` will always return and set `Content-Disposition` explicitly by using the :meth:`Payload.set_content_disposition() ` helper:: part.set_content_disposition('attachment', filename='secret.txt') Additionally, you may want to set other headers here:: part.headers[aiohttp.hdrs.CONTENT_ID] = 'X-12345' If you'd set `Content-Encoding`, it will be automatically applied to the data on serialization (see below):: part.headers[aiohttp.hdrs.CONTENT_ENCODING] = 'gzip' There are also :meth:`MultipartWriter.append_json` and :meth:`MultipartWriter.append_form` helpers which are useful to work with JSON and form urlencoded data, so you don't have to encode it every time manually:: mpwriter.append_json({'test': 'passed'}) mpwriter.append_form([('key', 'value')]) When it's done, to make a request just pass a root :class:`MultipartWriter` instance as :meth:`aiohttp.ClientSession.request` ``data`` argument:: await session.post('http://example.com', data=mpwriter) Behind the scenes :meth:`MultipartWriter.write` will yield chunks of every part and if body part has `Content-Encoding` or `Content-Transfer-Encoding` they will be applied on streaming content. Please note, that on :meth:`MultipartWriter.write` all the file objects will be read until the end and there is no way to repeat a request without rewinding their pointers to the start. Example MJPEG Streaming ``multipart/x-mixed-replace``. By default :meth:`MultipartWriter.write` appends closing ``--boundary--`` and breaks your content. Providing `close_boundary = False` prevents this.:: my_boundary = 'some-boundary' response = web.StreamResponse( status=200, reason='OK', headers={ 'Content-Type': 'multipart/x-mixed-replace;boundary={}'.format(my_boundary) } ) while True: frame = get_jpeg_frame() with MultipartWriter('image/jpeg', boundary=my_boundary) as mpwriter: mpwriter.append(frame, { 'Content-Type': 'image/jpeg' }) await mpwriter.write(response, close_boundary=False) await response.drain() Hacking Multipart ----------------- The Internet is full of terror and sometimes you may find a server which implements multipart support in strange ways when an oblivious solution does not work. For instance, is server used :class:`cgi.FieldStorage` then you have to ensure that no body part contains a `Content-Length` header:: for part in mpwriter: part.headers.pop(aiohttp.hdrs.CONTENT_LENGTH, None) On the other hand, some server may require to specify `Content-Length` for the whole multipart request. `aiohttp` does not do that since it sends multipart using chunked transfer encoding by default. To overcome this issue, you have to serialize a :class:`MultipartWriter` by our own in the way to calculate its size:: class Writer: def __init__(self): self.buffer = bytearray() async def write(self, data): self.buffer.extend(data) writer = Writer() await mpwriter.write(writer) await aiohttp.post('http://example.com', data=writer.buffer, headers=mpwriter.headers) Sometimes the server response may not be well formed: it may or may not contains nested parts. For instance, we request a resource which returns JSON documents with the files attached to it. If the document has any attachments, they are returned as a nested multipart. If it has not it responds as plain body parts: .. code-block:: none CONTENT-TYPE: multipart/mixed; boundary=--: --: CONTENT-TYPE: application/json {"_id": "foo"} --: CONTENT-TYPE: multipart/related; boundary=----: ----: CONTENT-TYPE: application/json {"_id": "bar"} ----: CONTENT-TYPE: text/plain CONTENT-DISPOSITION: attachment; filename=bar.txt bar! bar! bar! ----:-- --: CONTENT-TYPE: application/json {"_id": "boo"} --: CONTENT-TYPE: multipart/related; boundary=----: ----: CONTENT-TYPE: application/json {"_id": "baz"} ----: CONTENT-TYPE: text/plain CONTENT-DISPOSITION: attachment; filename=baz.txt baz! baz! baz! ----:-- --:-- Reading such kind of data in single stream is possible, but is not clean at all:: result = [] while True: part = await reader.next() if part is None: break if isinstance(part, aiohttp.MultipartReader): # Fetching files while True: filepart = await part.next() if filepart is None: break result[-1].append((await filepart.read())) else: # Fetching document result.append([(await part.json())]) Let's hack a reader in the way to return pairs of document and reader of the related files on each iteration:: class PairsMultipartReader(aiohttp.MultipartReader): # keep reference on the original reader multipart_reader_cls = aiohttp.MultipartReader async def next(self): """Emits a tuple of document object (:class:`dict`) and multipart reader of the followed attachments (if any). :rtype: tuple """ reader = await super().next() if self._at_eof: return None, None if isinstance(reader, self.multipart_reader_cls): part = await reader.next() doc = await part.json() else: doc = await reader.json() return doc, reader And this gives us a more cleaner solution:: reader = PairsMultipartReader.from_response(resp) result = [] while True: doc, files_reader = await reader.next() if doc is None: break files = [] while True: filepart = await files_reader.next() if file.part is None: break files.append((await filepart.read())) result.append((doc, files)) .. seealso:: :ref:`aiohttp-multipart-reference` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/multipart_reference.rst0000644000175100001770000001200614607525266020342 0ustar00runnerdocker.. currentmodule:: aiohttp .. _aiohttp-multipart-reference: Multipart reference =================== .. class:: MultipartResponseWrapper(resp, stream) Wrapper around the :class:`MultipartReader` to take care about underlying connection and close it when it needs in. .. method:: at_eof() Returns ``True`` when all response data had been read. :rtype: bool .. method:: next() :async: Emits next multipart reader object. .. method:: release() :async: Releases the connection gracefully, reading all the content to the void. .. class:: BodyPartReader(boundary, headers, content) Multipart reader for single body part. .. method:: read(*, decode=False) :async: Reads body part data. :param bool decode: Decodes data following by encoding method from ``Content-Encoding`` header. If it missed data remains untouched :rtype: bytearray .. method:: read_chunk(size=chunk_size) :async: Reads body part content chunk of the specified size. :param int size: chunk size :rtype: bytearray .. method:: readline() :async: Reads body part by line by line. :rtype: bytearray .. method:: release() :async: Like :meth:`read`, but reads all the data to the void. :rtype: None .. method:: text(*, encoding=None) :async: Like :meth:`read`, but assumes that body part contains text data. :param str encoding: Custom text encoding. Overrides specified in charset param of ``Content-Type`` header :rtype: str .. method:: json(*, encoding=None) :async: Like :meth:`read`, but assumes that body parts contains JSON data. :param str encoding: Custom JSON encoding. Overrides specified in charset param of ``Content-Type`` header .. method:: form(*, encoding=None) :async: Like :meth:`read`, but assumes that body parts contains form urlencoded data. :param str encoding: Custom form encoding. Overrides specified in charset param of ``Content-Type`` header .. method:: at_eof() Returns ``True`` if the boundary was reached or ``False`` otherwise. :rtype: bool .. method:: decode(data) Decodes data according the specified ``Content-Encoding`` or ``Content-Transfer-Encoding`` headers value. Supports ``gzip``, ``deflate`` and ``identity`` encodings for ``Content-Encoding`` header. Supports ``base64``, ``quoted-printable``, ``binary`` encodings for ``Content-Transfer-Encoding`` header. :param bytearray data: Data to decode. :raises: :exc:`RuntimeError` - if encoding is unknown. :rtype: bytes .. method:: get_charset(default=None) Returns charset parameter from ``Content-Type`` header or default. .. attribute:: name A field *name* specified in ``Content-Disposition`` header or ``None`` if missed or header is malformed. Readonly :class:`str` property. .. attribute:: filename A field *filename* specified in ``Content-Disposition`` header or ``None`` if missed or header is malformed. Readonly :class:`str` property. .. class:: MultipartReader(headers, content) Multipart body reader. .. classmethod:: from_response(cls, response) Constructs reader instance from HTTP response. :param response: :class:`~aiohttp.ClientResponse` instance .. method:: at_eof() Returns ``True`` if the final boundary was reached or ``False`` otherwise. :rtype: bool .. method:: next() :async: Emits the next multipart body part. .. method:: release() :async: Reads all the body parts to the void till the final boundary. .. method:: fetch_next_part() :async: Returns the next body part reader. .. class:: MultipartWriter(subtype='mixed', boundary=None, close_boundary=True) Multipart body writer. ``boundary`` may be an ASCII-only string. .. attribute:: boundary The string (:class:`str`) representation of the boundary. .. versionchanged:: 3.0 Property type was changed from :class:`bytes` to :class:`str`. .. method:: append(obj, headers=None) Append an object to writer. .. method:: append_payload(payload) Adds a new body part to multipart writer. .. method:: append_json(obj, headers=None) Helper to append JSON part. .. method:: append_form(obj, headers=None) Helper to append form urlencoded part. .. attribute:: size Size of the payload. .. method:: write(writer, close_boundary=True) :async: Write body. :param bool close_boundary: The (:class:`bool`) that will emit boundary closing. You may want to disable when streaming (``multipart/x-mixed-replace``) .. versionadded:: 3.4 Support ``close_boundary`` argument. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/new_router.rst0000644000175100001770000000547414607525266016507 0ustar00runnerdocker.. _aiohttp-router-refactoring-021: Router refactoring in 0.21 ========================== Rationale --------- First generation (v1) of router has mapped ``(method, path)`` pair to :term:`web-handler`. Mapping is named **route**. Routes used to have unique names if any. The main mistake with the design is coupling the **route** to ``(method, path)`` pair while really URL construction operates with **resources** (**location** is a synonym). HTTP method is not part of URI but applied on sending HTTP request only. Having different **route names** for the same path is confusing. Moreover **named routes** constructed for the same path should have unique non overlapping names which is cumbersome is certain situations. From other side sometimes it's desirable to bind several HTTP methods to the same web handler. For *v1* router it can be solved by passing '*' as HTTP method. Class based views require '*' method also usually. Implementation -------------- The change introduces **resource** as first class citizen:: resource = router.add_resource('/path/{to}', name='name') *Resource* has a **path** (dynamic or constant) and optional **name**. The name is **unique** in router context. *Resource* has **routes**. *Route* corresponds to *HTTP method* and :term:`web-handler` for the method:: route = resource.add_route('GET', handler) User still may use wildcard for accepting all HTTP methods (maybe we will add something like ``resource.add_wildcard(handler)`` later). Since **names** belongs to **resources** now ``app.router['name']`` returns a **resource** instance instead of :class:`aiohttp.web.AbstractRoute`. **resource** has ``.url()`` method, so ``app.router['name'].url(parts={'a': 'b'}, query={'arg': 'param'})`` still works as usual. The change allows to rewrite static file handling and implement nested applications as well. Decoupling of *HTTP location* and *HTTP method* makes life easier. Backward compatibility ---------------------- The refactoring is 99% compatible with previous implementation. 99% means all example and the most of current code works without modifications but we have subtle API backward incompatibles. ``app.router['name']`` returns a :class:`aiohttp.web.AbstractResource` instance instead of :class:`aiohttp.web.AbstractRoute` but resource has the same ``resource.url(...)`` most useful method, so end user should feel no difference. ``route.match(...)`` is **not** supported anymore, use :meth:`aiohttp.web.AbstractResource.resolve` instead. ``app.router.add_route(method, path, handler, name='name')`` now is just shortcut for:: resource = app.router.add_resource(path, name=name) route = resource.add_route(method, handler) return route ``app.router.register_route(...)`` is still supported, it creates ``aiohttp.web.ResourceAdapter`` for every call (but it's deprecated now). ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/old-logo.png0000644000175100001770000076546114607525266016017 0ustar00runnerdockerPNG  IHDR<<~jgAMA a cHRMz&u0`:pQ<bKGDIDATxwT~{Mb")fE7%&tJ7x]AҶ]eiƈH,Da+{crǙ=3s̙~>Gnna3f  BOa^ZAAAI Q%H   F"2    BnDQB    gBJ!   "^jBlaüA!   Rng P!AAA ȍpNb$AAA#b#ſNMC    lLAL)"   hoW@ AAA$8JnRf Oi"$   ؘCDdgEs!^b_D^@K AAA$8&8|)6v_|Eɂ{PY A..W&tD!    oņrD;aE>*_|-qY%g&%    o:-ȈI.K/Hg"_?MgD7B"$AAAD\lJjx"3D'_YC~RSarLAJ"!*A   "VrZnL[ÝԐ+4DeBJ|M}Ã˓ݟSy(Jȑ' E<!BAA _ o7BS!G\|]0wo{Xa>x|KHLQJ|Yq%D!! $?  Z oGQ GАD+y!WVx#$5% 6o\iJx*F{ved@K AAADD/6<RR2+!}`.WV8;UV;f;wn{キ?~ڵklhhxqg{{{Vggg^__r``zhh*=N^5mF`0 vβc0?k4^hl:SJCCCgyY;^v?{MΝ[QZZcǎV;^ "W$ߒ#_w!E&*C\W!A $@   {CpUJlԸÅR2;2addd433s'{kjjںh``zddMF^3Lǩp2LzN|822@uwwwQkk?{effNMMwINx"EdȐo%D@%@   &,9&*8!7Ćܘ$"7ĆBC&2LrSO='N,>vrddV"/ %I&[~222r`mm|'N,x'=eʔd)!"!"3S;j   >Rtm/rΌKΝ[qڵ?g TTC²N"F;.]z/<}x D\Ǯ/31 $@  +JCj,jŝpթaS~ݟ9kjkk.{`0pg %"<66vϯ̜~fCD "S LB   HrUrBpuo8fn7$ĆX _ /^|^Jzd2u0c=%fԡR.*^|w7&(B:BA< Rb  !AAA$9dIo8|%8np܀"ձa8|pK6:IjA!fsJ]xڵ?VWW/={dw $$ ""1ouAAIuqx*8S\uop%7\ݟGbc FWqJLdAAAU OƔVWW/}v``"ddd|kk .ۺuϽ b Rv$?  "B%GǗ] WDZQ… wGDK?ÇK_r%Aa\u|I??H~AAIYc*FT<Rߑ/^|JȲ-z%,{KR]lkk;nؾ}NHaHHG_  !.W!Ww3 sT 0sܹo~`c\we _)@+AAADIOT&"8D7~ϥK6wwwj4葔 I7 T_v.Fa]  v   08TCFwy罥uuuϏA)] FFFZ[[\qqqʝwy/ו3K G_H~AADJo8܍SL:244tez$8Jh{ @3@[`'$>  "$XUrHeqHx,8wgYv ""V\8rܹ/c #AAAAtqT:N<RԴSR8== DT JzqGqqqɓa3@NC  X@rx:*Grxq70SnK.mS>z#B,dhhkOOeWኍ%A]AAI#]V!!w1 sY~|ܹY:Sz#S C{__ҥK.\3FzEzn   ߋ_x#9qHvq|K_RTTܼG\`5 |I|Դ+???p}  $@Io $] _Ν[]h2y  T_tisllOb/bAAAȊ%XӨ#ƣ//\{nDG(AAE7FV6HD$=&i,;l?F~|}##/$>  usJIt .fYv"1:44t?~L$T$"?y DAAALHtC8"Gr9!%9>:44t8 =pz19=qy fAA#Pv 5>ی}7=oiio0q 7LE >x!6AA$:!5">?tz,!/zeݻg1 3ōp.t]$>  HtMtHusƸpˑO>5ez  Fʕ+HLLwFȋ?>H|AAp):<[WvsY)--M)Q 2:{ܹ&M"?>ƌdË.$>  "Prx+:9>ø޴m7ǔnlla0Z鱂 "1LY?tyEjˋԆ0AAA ؊w1 s~\tiy&z ;ر>ǦN#~E݆w!  s؊I===e,ˎҳAD)ənǿ   I>gy!_bgsغ9ޣ F}zڵ?:t}v}|t܅r>  "Tt:ӱn;vjoo2ͷ ">F{zz:Hw}xrꯜAAQ": :c2bɓ=w K6GW~"1Faނq zh;.[CT#W+1|e\w~}C_=M0ko/"޻t}{37X] >.AADO9\غ9o&DP?U6`鄾:4-`)|Ts9tT<ҕh_GpP*$~<Ƣfxe6j]sD_+QkƢ~<$p*ђyt#zN?1Q F{4 ֠o"lkooz駧2]]s>H|AANc+'O\244:h χ$נy#1K;:l-@uū~_ {cVXJy KE$4/EG"t݀O`P];07cǚN8a{Ƿ-9`<,㟀SAA!$:6|΅M[%CH~ҥK5sg0 At#`ϡsP7/PxվKկP+FTX8ʄps_fKd{U_>w~uxi:׼ x?y}tF>,-fF&&Nqէ~_>܍|L4AADOHm[a)<-c+=tE' ơvƭ_Ю؈쥨(3_%^usivϰrDxL@DruLpg'6A{^[k^I5ў zǭBU-(ƒqwÌbr>H|AADLa7Sqs Ɓc-O~o|yҶ7N5n~A(F 3P4=; 5Ovg`:Kף042CHaəxA  "dG E|m+gϞ}6a6@} #Wh+YtԼdlRnw&ao2qo nKET4j{m-"R{soѵoxퟁnq %r]Vnhҕ9 _{G9";"AK3qh|~:e!uNC3SdHÎ,CobR:?g6h4/];/,#AAo_6 mtՎގ }oG/4]IN.%3 -ih=]"2Qdt﷯L;0}y)j0u*Hu[~_W$+5s|=_oWbDwːh}yZ^ghzq2QB8vYު1h/5j4Z[> ֫W?񵶮$>  #:)1tJrrOkkk5ͽty(4-0AtoHlv02~(JGp%2CaEzWEi]JI30xHk*W 19;g},,2DM>i~+ce%K8#>>#O$>  ?y~㊔ "ݼy/ZZZ,;JW8Uy s&7n25$vW2vհ7 4[d%3] 52DFCבyΚo9iev5t[ѼٕtQQZ8T^kf}=._LCOlA9ŗU2/1ZU4<=7g$5&"e]]]EO  Pt/̮"tuTlW   X.sղ+)tO̍Y;]"rCJl8uk:#*4dȶ/HirR@mR@[t!V^%Gs|}]))2.Dfc 3;^"D(CBDnw y`4^pk9_QQ1?DI  HtKt+T*N#'Bs2K_:7rñkCNdž\1Cp` c$KJd?τ:{&49͙TY }xJ$7a\r&W_0)N.wkzrDJ8 $ǰ21\ɐ]!:BA R 5OOESQt4OFaC%LÝtD*SN-w  UUUU*%w{%R oĆUjpx5VV9BC(3\ ]}D*wC͂4I$˜Pf+cge*KPybʀ>o#:Ĉ"G1v(c0z01r`"Qx*BIq\tuB+ 1 slI|Au_&(:&":G1bOLǮ$IFAƾ4e)3 ͙ih9փ|KuR} їy50XC1T,5Rh[YJUVR4K-L:g&4͝e+]}7Ӯ ((CLn̟c\i0)ҝXuW0~M"gTT8V.;q] Dh$@m)x[kRČGd2п?/TϞHsйk6:^h1 ;] j|a,UtԽ05OoV*˸#u+:jt Ľ^:ATQѸ/7 OĆUjXņd 4[SڲЖ.reT`_09`X00(Vn+_7p|3E^OybD΂.7,^|XK}8Ne\ G Ҵ+MUOGhllDCCPWWܸq&@Ss}$>>+!>E`S  NvL$C(:nFt={AF ]i YOXYBiD'bC[6^:Kƫ ޭА.$)Zʜo_lqEXB*X7)b)^wzn'R4NſrD"g'BŗRZAy#B&"A@-@Ǜ9hoi@kk+Z[[҂&455͛:/VP fW.\nҤIRkeq1  Htw!:eدt ]8]O ܃ٕʚo7&*7<KmeQ Ʋ;!n ;[0\ ,ER$TutpcccwX| 6%AADHWV!yEJt|a): kih` aC%: Wiyf*j, 4ohyySȨԈpսs]׆ gaV.\r1Xpno"ëiWFʎҤFߋ!}6;8?j"DLy{nB@VCVCRall cccvddd&@j/bqPA]h9fܼ?Rlv7/@j$ j###92">o:k$ć/MI|A3@RYIOGu>})tq%Sޖgu,휅v'e  Wc)wm8wl \qMj>;>DJfȩY/= gu{!sfǁˎ6;&?D) RûNNV V FcOQT70R] QtJGEj@tHuw 凵fWs@ߛ{謹64`>33,2ć.s! _9V1Y :+W=8{ğа#nT:űc\pt2]ݻgO {!vox*7 G*]e gH!P%I! fŀˎ6R2DK RaR h4h4`0JCIF-hTASScSUJAOXZW|۸Zy6!fhZ.QS_D2oܸNZeKc.AAHN@R;ٹsqjg--cQJ]㒣gOmf>ˆq(woH W]NqaZ )-[l!YJ#Mx$[S91`cWVb!V"Q<Z%z5fL&as-X2 DJoG[˺=G ?:aˍW!3c\~p$?} ?e7 >h̅  er:c#p'Oˏ~ZGrh/|_%*9GU3]?k4x47gè\fOp߹kCJlpeZ`_sa`y£8!|^pGH^=d˲8,ڕ1t1T,waN$o>n.Pb[זK(?b/܏(߂Xr Jv|ٻ~y']\R|ADs:1iٳgt4pa؍Yu/L-9GU3v]1gk9o[9v8%R "8DGStnlBml~o.Y KpS6iwGqr?l)(St~ԝʗX68 Tg*@ĺ?䌾x*?$Gͮ$G`:zl7z._Ie=s! CI(2s:+w1 38M|LW@mPt~ Y*CjTEšXbS춦Op.mhKXJ-8wÙ5 p\|rA@[a$H~2S><.?c֡C7c/U{mvw2:ʷ@Uw.=:ӣG.`1|c.BAA]W̌|_Y|wuu`\؉Wr9)9܍uqVa K` RFTBQpDBPdPPiPk6ړ` c|pދL|[Yx<<"@49/m/7:6_aP8bÆ `{| u{Auux52fիO,{y~9&ϣP4\жs\tBrU 8mYqXp >"##-UBAi9ÏG^tA~]~FĻ?F_|)?Cۡ ٕV0r8Do4dg|wkl1BA]_9uR^_GW;ߣoBk/!{%/GKrۮp=bN;d8X N£`F 0 0ןz86̋+kb'"Q3+탈厾~LT~}IFT^}} 2^{a{|wc.{ AuuxyK}߾"_۷ Dc9) y YqˑpnWp?b/9LAXPcqZˎȓև * \nbDg0g²YaTO0qۋU| ;mܗƃА @͡h*Zꩧ2m.10c._Sۃ  CY9]+woܸq6X?AcC; Yf*4BK΃h1KȊr$XQ.69T!-<˟ƒ-?.khǙ5@[Wz{$]tpGˉ\#ihx/RrԪ[#/h]U&?rVm; ʗR---ӟ7PS  ( %q|W_}u`h+Ϯ~P|]ǟ@ݑDGsCh[5hL%9FVʑFUtqI+<#ZvpyB8(JqaEU]1P˹Cj*?Lv%O~He~8ȒG- ZV9!;Qshʷ[># CөS1ÛPS  pJ*5rҥKW|I} d1ws7GjF{tEWރ.jCl\E*ݨOK`P鼈nA8U@Abh#sD-hE<؋Ԫ[]+QkК-y>;0)W [z/,B8*3~AAdլT(ʤI|fnwnCgPRTtA{tCW:l@w\r9|-9UrC#V.F&˟j \8\Vh R+{qv*9=%UE^(>@'Fol>eّW>5iҤ{CM}–AA~MWǔW^ye%flcv!][==tdGIjۚڹ#]+dףxSׇU|y5Vt#ZсBMۃ  qTWǯ~8@ׯ |be`r_#t6`@ ^CȊ*"9,DF[Eț"]ɡ(hI|ّCm/غ>aP}elCNͼN61z`w{{{ CMq$= "-{N:L7}k7m7rVJG0TC =pv*H~vGQBK?(.4_e p]=[2DB #]SǑµp1XC1|Dp 9;g~'j믯dCM_aMmr! [5;ɡCjJaÆ_ +h4r3~l*9c+VF WlĈr[ɡ1BVlJHP 0-#LKB5)K>-z::CqSK^B8SU>ɏd1!6"qCy '0_rʟ3n;t{Ln ߮vy:f枋/n1Ct.CU-Qsȋ9 6cr3Fdz> 9< >t̊z hKyc+ـIA:(a& Viɼ]x*&?mzyY|l3Fn]V!kX}Q9Nͪ["?lD$C8"R#/TmrM~X><quRM^222r u{ADˎPvcOj>9Ƽ5n9܍8- mvG\ȊS.GH*]Ї(DePi&ϟ`Ãb#P{ b_a!;凧y.>ʖg-Cj]{!XX= gѫW>nHzA$:|L:Ѭ)۶m7a;A[!gflNtToJn9#+a-9Y~_)*-N$%Q#`O^&4P)/ZJ#?\]C\UT|wq +1p ̺QzeWRAAv ,eÓ+c}9'Zn':ĂH])ɡVCld%s9BxM-(E`<ĠRZtA 4 LLChz1vէ&MMHzAD:]󟧍]AySP+ u{lD۱K7Mt m0ex1#+5p <>(eMjq֙0 ٠R(_m0j>.GKj^yf*j0 wSOMQzX=@S jWg=kҤI\zO,˪:$Wt cO jw'nO2)3 mEEc+qa:S[Q7Ur,9?(Խc)TLN tz(x^~"Xv؋lȋOg6ŇC4b44/@sQ4u{>?2e{Ј AAQvHuu &ظq/GFFޤ+w^ :Z`:ڏCWZp[q=dM+Q!?!h>$54pdr *- |0zoo!4dst~ϻ>l=N|>.rs>zJ6h wǡu,<Ӆ7j}_ZAD_uuX~S0=&|=>0 _f2ss7{dNTusHx.   ټsf@}.p2FVGaZkևl+~ԅzmm9]kׇ+ѓݻhećWAf;.A7@S_v{ :Z:..0SΝr #E?fw,ѓ=} џekmm@t2wzS[ۀ؍DꦕP 0E3eɁټrA>pfh9q> *rنV܉GnLa}#O|<7 [`7r [xZ=AA$;a8zbN73z#!GEGB /HrANc+VpVX !àX > *yA>wCv8&_y* F|X7X VXpgIHn2п?I|tuMG3SQtV=fhL]'O\aۃ  {!w-T?lmmҵƅ0j1l]Bt*\-^Mz;!!ENmP7GLQA# * ~e,8 QN>M0Rw}z=[ć|֮;\C9^g͊?d@Sa5> AADtW9rdN{k{yߗ,cK*Y u2]V(9d-rItx`;і$/Ę>?(hplAxfQPićr pz<?}sR: vcPB|H 3szw^oOsqhJ#.AD_ں:&O|occ+t}2G}fMt4앗Rt.t)eKa8Z4nlQt_HtLbQL"ePit>TANs5uO /Q&>P?O븋XAڬDh$@}$aA >^ctP__ɓt{| \)I ",d?GXH>ÿ}+.V}z:4EF :teKW,^`>)$:^|J$,|&՛_򁤍l^._ v KG!a>J>+DL@|4,>wcj`ll۶m 㼾;Afva$#Lzٕf)h;?As ;qsʚP,AFRt-:NoSS4$ * f%w<ؼ2bټicL*M'Y-O3fޅ0,1+DćXG ;| tAl6o[˸4C#.AD_NԔI #jvۋ&1ԝ0*\ r)L%0/W~UrӊSS`<,Fܔr۝bc $`Ύ=N|M^gՎBFs}ǎsk)AQ!;܍HW#,w1 s˗8NM@ҡPgټRyPK1&T`K*)ZBtXJDLQBr_% ~ *_c^N?]^\)~ GfŁ͎ 7:`/>z؉R]cl*A ˪?Ǚ@S#.n +;Dǿ dm"]#,qqq??IWv+f'{DIIt5Eɇ%.lWd>$'#= 縐9>XLrs?'ɎxkU|HntK={OWrG\(׃ i-,w1 sOQQQ`h=:rbU,:%Kl"e /%HJ[x0-')"EyaW83_WXL%7ԃ">جXćv.\ZCw-]40 yyy},4BAu^uˌ]3s:"jv' $u%:F֭+ވKoZnjA\Sy$$!;4s9%koq"A$$%=<<#sfňQ.Cv 3*[`Ӛ禡|{8Mr7n<Lj|r24Gć0tFaG|GK3qR!#.'Onq7?#.A3)vtG7܃S/ens:\m^ftBb7C)_CޣIB|MmGI*=|MqQ2?[48o^c%wyLb[] C!wTGӾ$h[.хD8Z7W~NG1pwYNT0/eA|XMC >:{4gց?dG\\\ "×+ga.0Sx≩ ]xZ-n޼i갊]]]A__188!`tt~>r94g mB/DR_͂#oL+Y_=pNW*S[ kOU (;(h_в"啋d=/%0*yoP2^kJNUR/H=XП} ѓ=]Yqxe@:2и/u{Q+ MY..4ͧg  Jv6rf ]ec7rM&:mc``6166Z FFN^@ uI :xqvItK#,#e 7UE*W$)b^ XI>q;Va/>bKmC >%KlcT >ң?o!zs[ >Z@:nOE^^|ؕ߁ի"ÏzV3[\#.B͈ I §+g4iҽMMM{3v$V 4_CSC*:mCRA@BՎF& ff,˂ӎ-Gt.xky1 }`KH=R^@-s5gUqBC_L!ßB;a˝l39c\|X=ե|U| ćۣ;at{Ot^ {&Mt/3յ$= Htx-;ՅAv|aɌH^ٳ:44:p's@3SQt40M/D3t,GWSy}c###6ѡVmCىhfٕ h{x0PnN ( ,G"wy }ZQ󰭰|iáC&9$!U;kPU|h:2Z ŇؘۣfWZ8N>ܹsƈzLz+CaADeX^7^zi^oKǚ0WPt=7 /gh1 F9=}2{! 64Ó1kËm[XvW_}q^](=&1#. > 'Q__@T4؊LuuXWZwB&:c:oP<++~JVL9sa>/~ܭf~Ql ǎ .N͐Ri;R\dY*+ yW_CLH ^4_W$ϻ;\|&Q߻;B_lF|o\vc.sO`ڨ3\ 3% pRǼ0y_QvĠ晩޹sxWm|Eaj D!+aʊl]l^)H^}\4з:4 \͑Z[)ԏzlҝ$ J__.f|lׁn0MTzl%Ut1WzJ' (@R~?`پbVM+~p!,-EI$&%;B*Ó1kGP7g~ #?׃L Hv]vXIy6OLh4ף5j[8ju갎t _D#ՑeͬUtYq`$VfUk疧h8 pqީsA\:ҹ0̅dX 0׿n] ӥC0 *@G(9;(y-p$(|]YsJ"bc.X= 5N_2AzXs=܅#׃ "!!'Ԛq0:ujlo7Q3Pҗfh9 AמtA8CfcPF'`H"TGJ&+DBc\aI9'^v Xp᪲cu}@ӛn) j#f˟ .*PkR)), $J`,Ti +Z㉭0_7 N@_0ZTE0--Mrfzz3P6tBY3J~ϱ*8"pJPe._b0W,|`P.^ z*ASƗt)J`d n-`b/B"-DwteGyh=鸙}ݓ4G|1Z#ż(=9 НG<@Ӂt4OEݞNBG}^]aw2aV9A$:&N*VaNo}h~ w1 v]eavu$غ:EIWwv+65}T@Yg]FbEKѡ/ ]Q"+`+Bw& ס?ީCL|ny׏+bf$*|wHXx@A]>{ȟ@E@61Ft{˖u{ -nn}i~&=:::1zAXᤎcٳ:<|1 @'?rXGÓ*Vt?hc`ozspGC@@kª\Eb²cVQLb²#(I &>XX=\Ԃ1nE=:+q0bddsq3#fJ\ Hv- |*;}t '4]vuW]#]#KWG@W|Q9quG܉߂ځU+lMvJEdGY:Lۡ937NCX$=_϶Q':l b $OrHZx?.ƒ˟Ƈ-,tۘt]HsGnPE&NWOLHXrLi Adf?ߘYt]PRaW0Ԙ>+%V*`F;[AClҤ:'@A?[0~M*gB灳PvX8zݑ>ammGq\蜭n\1Wnan߁5jRzLys7\HzADp.Iy-E;*wţi^uuĺ:W+&:MPfї( q]@_6Sa %bNtPeǂwwP]bfuf_ gd|7r n*a.[SisWǛ;5П!ǁ![k *JENn (Kτw`:;[1PSH7 XsTzL/ mp! vUvlbOkoFsf jz7]bf]}P?ݳ4*ez! %BWgu{1L7NCW H2%4;ac+Ib THb<{]> [9\~/?ҔQ{?0;0S9_HzADt&RD V&jӮUPRRl>4\ ]t W rQuv,tCwt) c-刋[/9n^b p=JP$ˉ%V-3sa|WjjD=j`¨ %:F|V/Zzu|jvuXdGIMv+IzrF\\z_wj͍V|/I&R 0 ?dPS_w{[=MKäugNk?"=b78JHzA`[7'333d2uGۛ[ߓ`[7kh9 ,֮U|GGhUDw`V F_ca%?et>s-J:@3‚vBBzpZޯ pjw2[2oc<4F!ab&=ñۣ0a`Mѷd2eee0 s@z|C  BLvxvz˲cʱf4jwǠ~OSWG9Q1T7˿]WvnTtТ.;<>=nGs|Aþ8̌Gx`L^vxfT'u-Mq{ę-RBLZgKlevJPwv\ﻠ aA Xǹ vmj(űIn"TJz%ǒ u{=h1hɀq%F9pҥ2=AR#,B1N^FݾxEþ84H@DIB%C82t0.T]!jU؅˟(<;0_pTb{y/A"&;%- ]J@3DRCFnjtahlC Vbb>[&PF&@s [nuR˖ad FKx1T$hh:}qqRuM;%pm$Akk BLtTvL4޶ܨj4}1AݞX4eGD$dD}W cxٵ)2j>Ém/mq4)ԓ[n Zt: @pGWHw_8A",J+l=^v{t礣+; G/=ңfw :ׁ5j|(abYe$;U^<Ɏp>ücp1 ??=9IFǑ$JDDC)FR 3Nf|m/I _ٻ2k֬Mo#KP;Vde.:xїT Vad0>{.Y|W/;7}Wm \v-U㻋hJ^~]L}# 5W!B١+Ma276hF^-O`B@J)T@PdQi!!b[=Ma KAwN2:n=XU8@z|ADt/Z$j#I.JHq:Tw]l ,lmk +Ie .^~ h!0ЦFeEW<tx Gb"]]z=Z-z=tbZQ,<OvX< 8#B t{X7˗v{$F\1\f'=zrѕdpq l]||_2kk;IzA76K.dǦM~ޡV4;aO`a0ZUie$Jvusm]\Ndtu! /W0?쎭;?9xIŇ*M(=Q%&vls+^hVJz( 8i=n􌳤]xpd~#*Fn|ۃ=AU^z )#.7Ңj^cMAa*;yY-ZGk8maX:,Cc)]<[0箎Y1 bٵ Ŵj!~D*4*Yy)Nc2>suFQ:#LBCvDki4~_aXú֠\:h\lJ30Vtrp5R/ڳQs ^z)FBzL 0ّd2b5Qdz^vK3.M, `K1;`R6R:b)E]ټ^POWjxLJDG^r;ԅ"Y ;йKCGvDkik&DߏcXxQt.m{ ·x|\fjUww ]am)N\APB922v0)nW[\Z%9zWך/_$0,wkAA&";&]r%*dI5쐵,t# \yXE 8e y C3[ud`NFZ&!o3-NmGHKMrI !/;l҃:}^ )S;Fy2##.5cМ3?Zr=O?Y/ǿ A'کh;?FC^pU^Et-]22%e7씋7 zZ* dDz?=ySӱNnNm .(ݳ%0kh haf2n诃*a4EP$B}QABs)hmaX c-7Syi:( !gZ׹ވC҃ " :;D?aWA!|%ڌ0Z>+ ;a(]|h S0'edink986;^xO~['[\ os=AFğmmmk$= ,;&Mt_GGGI ZA^G@vxaTZOM<`p 4=Y%+UAFtyV.h7T=AG0 0'nS)a~;[\s9eG  (4i S Hx-7IͶph;6Y'y`W03B.Saݑ)uvCsk .p%5bt{^w1"VNGD[G^>̴cXsKb_eA$;5;xX m+DI;&!aa)*J ؈ڪ$9l8%@֋d9=rz3pl%_vw<|)S;Èյr=:L5cR fh2ҙ hAe5& 3;L#hJ '9yb+gAпĀ+y8xmXCs< Sa`+rt/| F\rz8EZ#]zI Hvx';\vv455OYG~yr:LGX9.BRve mY ũ&b,?yTd=Bh:XKmkR 0?Jq5ޯL\20 A_ʎڗ# fjjƊp1d^нBUEsm, 6cǷX@Ų #VvOO *=d 7ا"aNA쐐Ȏ˕ׯ_!QGzpR9yެS`Vd_vC0^xB[8.GY#^xO(K%VJzKmL6#=:=>O҃ Heǝn$G8mbi?2WRvH^zRP]0/)!(_uAD vvLb+ ;f澷zk3s$kz{c` '=l9ɵlbc4 h2Ud@Ȁ^cy0Y>;UU+OLnǃˎ nƂ+`j4>N0h*¬SY Iυ0 Su2 !y#>a~K3U\Rp-e mb:F/y 'H[f/a,OSKS߹FK1Rbb 3MFWN2EzC^~mi3b"}qrdpA҃ Ȏ/Ȏo1 zӧ8h8ȿ1fˎ$;1P,;ԥZDUv3le[ʋ`+R~E(Z(&ƒUڄV nǰ@xA(ONAԟr!Pߋ{[ߕ*ƥ<&=J^zKӡ*XiMz K$'Q}_m6;wn-0Z߱IzCFȎt1q lyuOdG.N&0(3`Po H!i"w-ˮPD1fEIЗ̅x.TNC!TU._Vtb#ؓWx T>D zeQs!8.=qa?@2(apq1\n'=Gc&ǫM{>qڊqLY҃6),ˎD Ɏ/?Nv du*;㲃ȀՑʷldt ]x gD+ N H#ERx ƁܙT\yFp`D?zP#DlE:HcДeؤǨOǥGEf7 ˎeee "dǿȔ_=\d7я3.;Z%QvUٸ9ɎV ;BîJ\C]k _ȎȎ{S| ye쉱&)kg]nb OG\R+c0ZRC qoj sqf3P# VH26HJږC\jĠ獗pޡh͙3?-AD? X3==q";䮝 M,&=3b;6&Z#_x~*:W!Ebңq<1::'?f$=O"%dǿ9Ȏ]Ȏ)wqE0Q {m{n,[aŃd]v (¹~t/ڝ0^'* /qfPc!(:# `W\fVIh+^֤|aH;eJHzA\v|Av|rM555;#OvhR {RаoMvtd%9Ɏt;anb1*Xdع nsP--+edB%|ӑZ*0R:Y[kȀQiE+bёdsQ'-y+^rD7,_<+gIz $d nF_ˎ];E$KAuWY?KXx2Au)'zǙ従ʅ$2?JdmZңa_ j9g9X*⦼-n 1 Aj 6 ï츷r9q5h֍9IAþ44HɎn1*CvdGS>eg)Ofpv;Uυ0&Mxh+#-sTg$J- ua"F-£/'dXx._ U|º%Rfz;(:JYW#q(Nz<&]dtHuA(ۍ,ٮɎ'? dBّn/; eYv3Hv TO=얻s:eo@!Ȍ] ]z=XnSKov(!$4@ٚ⴦փr:ʲvңFGGhllQ-;(01[×j)Ĕ Hvx$; gsssq١mcq9^"f&T4x`GAu KyP~dRTJ?TY9H"Cz'.=]FSֈZYqhc[ZźZe,nd<#[ Zʶ~d2F0\Ȏ61X&*;J KB"çkġH,}5d=7Јն ,ue.Bȣ>u)=i؇ࠨhƼue0Tc2C[d#Y,a.a1ctH9YmGQ' eBdȒe:o?Sp]H`W{B^@wD8( }M?TK+jCVcllLTzt6\Ckz-m` hjf̘ bz)A[dc\:;?<h91 ?vbY0 >詈5QX,x";pɎ@0P`W1K1!6[`Md#@oo/z{pVo 0?|{%fFQTzvUy[,xEkђ&=:=.+?0j"SzPA%;>ȓdǷǏ` aFWNd=z`) c< \EɎV~*zX NItOߏܕT* FGGVja0`24BZ@a:xIznu@\]\hsN*+G0[1X}%Gpjk秌mq<"Je'!w1 sϤI6Rա٢lMv: r1b';te$;UEϦ`ULp3TźhΆ,fĭ}3пgwMGw#0d'|lԢ===1Ch˂X2柣w \~"tOsqEc{]ǁ큹AsB,=Vr:&=z6Kws#} 3bzC!A PHi]]H9L/;ɎN1X# Pe%BSNv+w**K7pxt.31l?twcpp {W_FFFRjml6[MlGjZn<:Jxy;(=00&”,=AU%K0RIztH^uƍ Fv@d}O^ "j_G}J4BKjˎMNeG6_:`IvSt|s|"<]Cǻ<bc@OO:;;RC5t=R٧jFN7>b6a5\) :JxWaApV͍,=U,FK1ZITzң1gVbe>{:1,01bJQ72r;>a`܎瞋cYv4"fכ.>gWٕURʎ0'B\5&E4@x׿ o]P]ׇneYe1W8zKVcl n)bb=46@~:Ż;.<C!8f:r-;'ײC{ \6'lN0-N u/=T0ZERz4FCJg滑b:%b+]A!R!9sNk >k,١>cGe>#2U,3\v SS>_vү< ncccz{{Յ2Л{SK>a8L'7q1Xxw/i=A뤿`J?T?Et\96aT+nb+] U2*h;DĻ^_ v0 )6#)x="h} +єK1v| T#7;/!*q&^Ů@IUx~FZjB??rnNζOFYk1\롭|tb#'6h_{h|]n2%rGqnO? qq>HrPw9r쥇r1LĥbƎoq)=nCC6G{&M~S!7o< q78ɎgnHfMCҲ#7E$;0N@vt,_?qᑟ4 ea2`4hRG[jCTtCקd/<=]F|aF'77khOo? ^ 5oYAR6`J?Tv1c/\q:̖.b)9cǷ`r3nINң1o5/Ĕ p';>8 s;0 sٳgyA 6Z]1P ;o:7ETvrxّ6/\p3^S>qvAuR5 \^IJE@-8˲00L0 tPhJgƢgtt$Zb4ڇ򭢣,J(Evp6 x?99}"lJ<-tO?^vx0j]Xg5pa׿NN,Ŗ0U,b'=7W0J֣xZ ؤGSz :sf&;t9saI\N,Y@eʬLotʆpf؁?{gwtt2;;.QjԢ!,n;'p򾐑v'{CT"pIɎeŸI*OIJC2Ic\J;Q՟?q<ArCJ߶0:;;pne=(_vM|hsˎ`.]V}T ųIV,.׿`an1sƒ P̙o-{\d\vp֥hlK?RuJe2Tpiful>*ZUK_ RǗ~\`'Wl,-w| U.cϊ4p`~#<#Jcݮ橁3=@2V LQ BK=go{!Gz r;np )wy4dhoV莮q);'1`7.K`Р:Jݟ~՜97#s`8<C98 ң [ XYK?!FY\ի[e|1M莹TS^:)`SV;6 UV-Te y_y<!~=#3[ͮ橁>% )LvXVKµUnV,[HJ#?~ C*g 1%3R*1a^xxeRU[ZƜU6!~&;Nl6/ť`sZ'X$p$EĚBTq)r5Y10HkPz혆(i=pʲs!40\x6&yAto_"y`+yBcb2kjc dGduGۅz91b/=nV =նFc*gh_?e5;wL`\Ό~Nh Dd,rr;!Nw3?m'Yh_m[?JvOn^wǃ{+S?+Me&Q8_$o}ȥnxUa:2#s?4CmySLꕵZt)6aHr;;/d~6gn|Qtto/7RVd\ȏ u| ʅ`+2Z:AD?#r,F.~Nj/[l+J5П&Kz4FCJg;3u:]~1 s/cb<ftdzN4歶md+; '6d/<`Lv޸)Au '|ٵɣіIz}8PPg<kh1 m;f`l؁+h;d0T2/J>̰,gaX cRʗңNl-=joq'Ny|<r;߻rʳafРhMvAgztw1Ʋ(Y}6/;L0&d/[vX[:*%: .? h"џ#Ga8,_z< }GV;àFϢ@2+{[1d'4%>mu3ݿ?ƀ-KW °!#F-|l ,&@?7Ԟq}}ZEi̟^z-N`XCR˗At'AwBZztGgzI ` ?裏dAQ1UnG^^| gDZlC*trFm0_}v"s'.;lo`)OaRe$1a`?[rcu{Kq(#Vvh[?BGhʎ#J`Ɋa"0"3$ի_g-n#ZlRzkhWIW8ݽȏ.\U>y|_DA?3X e0T?l-#ݮ88O?tPR$aƟ_.~=4pˣRlx*Ap4C/V N4\ yj}.h<ƻ8VNzKGrOmXze=7v^o3g:y| tyDdv&'Tn#Wdu`xIvsă͉^xP̠TwY" ^0]{@߫|Te:P-᮪p'<*-O73HWk7ExwsWPO"`CLXSۜu×^zg~7yF[HzDGY\v|N$:"25UEدu%;܎00uZ?>gKZp߄W0 b ^ۣPF?T3k(^cʎTˎт A]4%;a@;$ϯ>q驇w(ƏM(=<૗ؐ`+_7ok`-c/w<8|nvX/Wlغ`:S۠;.ÕhYP7] {q F[yy4B~rFYv0}&`𵗡4tdnO D[bfu8vud`0jЗ·t굡!j*r.gO0tMX~%Guygw,F~|1Tpy a%>p|`Ժh/WȻ_`o,҃p擏ؤj4ͧO,yw F[(σ B|]nvu 3kFrَu.Ɏa,L`sS֎(\L 0uepR Gy0 Uhyi*_#0n.Ad8Ԋ[h5'@pա.m|J`0W, _v]z-W':*,\`i~vUo@\eɘ*[+[o.*VpP.4.+=|-A?[7X0.KztGG:umma%׏y4BAev={v0#:YtzSNm,GANv&VYItN: T/{_S(%=G\=Gfhݗ?`æ!.`ͽh_IhEcWʡNv(_ڲ1ԴC*a$+UtpKVwb-U,lυH2߿n^xXd]EpcPUHPuBaXʇ_}EBLln}}GypΝ!5By, Z܎zfy O[`Oo)? DYOJI|w ia;-^7+8~Jn1au)! {U{P׾ }'0< V; F5Վ< C_=tW}tUlCk"JautQtHuuDUv  qf3!ן}]GGTJ@t]!p'֍WEj`$]uyDؐ]VERlQ:ؼy@5r;9`sNxD{bAdS${9tcr럟ෟ-Ga]_+֎֮G! mb-k1 mg )a #]qZ!a;xr}I3U7ߞr5N ~6@v+ڀzۃ}(]6 rKWpO+]+QE`6'7y2bƱ7naDheǗEr;fÇgpg ߐRZrz;3`*LFv+@q)ΥpTG3`VQkRt\w|#kmQ҉>e3* g1Jaik&p)|<8ΐ.mh+A]Q/r;Ht aRzg+;تz k)14ٻM,Z7 >r.VapBb V"zPpHIkDˣzuJ vyoCC'1񎎅`-w/:N{|e$cUEz`b/G7q5&=^pst7;#<ZUK!4+ho}PHTjΛk W(" (A`j *?r ύ >F3UEU?aCp%:%7xu+PS l><<AxlR2}nVDWGr)>|&*?R-rć?F]pf;4-&(s ޽՚.wf+̧M,ǢiU-+όw+hUUU끤mhY5h/Z U% t e `,[cB¬U,W?UZ=¼y2riHp;`-[V`OWJ{l /='\B%ŕJ[<\~ZaM܉fwh w| W{QNovM6ߊc1tt7WJ6hZנ!{WAI8;رc2jd[UJQƻQ {n0$2iИ ٫ДmY=eO+6 񭒲'7lerBBv)\C0d/;)_@)?,m''MJ|8w} q(Ae!b:U|[ Uph*9cayrCdHO=jt{ :X"pG=#XzmH~0e{==%.[Q<l\h u?8ˎY^l7]&Q= [1Zn`&)AO,ـuhyaR0 qqq-m`VDFYՃQ w:|CJhx&;Z ֺ|;vN?jv%,q"mQ£hNwxϖZ`ÿY~ 0D|8)" 2D mRC(7e!26O*rzub~sKG|A|f%QNm{Z&=ڔ9nmF[G,XAoùϬeYCJGYdvQف5ВOB e+;(K:C?{y{'qd[8vlّlَSn}Ofo IeY%۲za+J(QAIe{lߝق-33Nyv~X|`: BxF 89M=k܎)د?$(U&vѰT:nx];jW22GX!)Y r`l`Kޏ8T|\}.S-.聆BB[A#X:ĉψDEɯ,,VXY*h[$ ;vF7cPFO`\$&5OBW v8= gA6= YiUtTe|>(U+M;A9g&MG 4~S\M, 93@Up$3}!!g|8pȋ0;;`5IOUˁ@S5'^Z#{TUnƯkf͌CF: UAC(4K@4Ѱ*g-)U (rP kJ#πjza3, t)LjĸI(17vF*ALmܸgZ_kWkpG,_ UA]H_W~jOODwztXʍ[MvmV#G*YdO-ǁydibצ_~C>pzvR%WqF@jHR?jG G~mE ݎp#[pppkFkOd郎 VqtlkV\${Xk Ξ@A%Χ|TwヨsY+˃6GdsC[zܓ<՛W֡l={ZW&k6Pǟ Gb,D777>>~=$i|gGhm"옞/w}?g8Vv<;P;8W^u[9z&Щ 57к75jas{6l?[4n=I}IO*A*A֮E; ơX g]d0qpG_q%8>ę?8wټΖ2mUK@\sCↆ.[gKw83W8<'88kW{ws z,!-6 OvA*s2wWy ="]=[w}? -!XYce|oy1އ<цb`f遣W-௺# ‡QC2دjڰT|:x:z5C8Wqt+_q##VB*GLCV jbh #E !\2qQyo?K 1$ϣQN_-[pA}`mQ1-+H$gG?ɯRƙ[(y;5|@6f~#rY[Tɷ}';=c2ްNJa3Ȇ͜~}M78h!g$ c뉛HA]L{5;A|#OQS5Iрw87& *l3mw<z-4=r~i(nJB*vnk4;\5gQiǙWɩٴ 0--`ʊvp3wS뿧nVdĪ:C4hz ęG(8`A59%5B Zp~/ ~=TVzӠFf1R^X_KI,[H_UR8tDy<ʟEcccG`mL#,_c9s|de$q( ʂiSȖpy6Jq]ZZɏ_Ay;vzļuohI/8{`dæDF9,ӿV5`jەq{9=!HXV tji,x"C̰CR–,ϊzRy4lC<-vrgX-LkpV.Y}DS=bŊ"b%R ڈr;oU0-a oEg-~NE8]C;y: 8&GEH[8TY5M$EVeh’A&t881" `֖*0K{<_! @G9qh ` 7@dhaՃj|9#zH AU冇iGS.< ŭO`e.VDa3|_n=?l<38,x9`*JkAU..쐺7ijفſSWHG`C^5k7ժ޼P:6Ь;ٮ.39BGX\cmE $miOD*󡗃Q( vpY *-.~6=pd"=`P`-Dn3pIY=CdƤacӹAp#`kAFҦJ v1s'4T.gR;ЃŇWن,Y(zd*=FnzTӳyz<;U[]aW|uPkp#v+_EbeSUb"dmBv4= :7,~Ŏ9<&ox^(c^9AU-NA@Jm wt rqxuDXYtx|Zqe/c#0_ 1m&tu @"'"#v448H~ioҤk!G2<6rxԮIӀi4.P)7cUP^ Q6î)q%X G#4Lkd")ӪyGA?*@|8Y8HYq r\LCq%tMKVU/Z[}./Gwwk[ᶶD`*H;uG(+>VD_l|-XA˖dh bQfW]"g8]g;K 4~󍶃Rd/瀅|QH`zx 7q>ptU춸&5WuxKhXj[alcpJL͕Szថ; L#,h/>mfexJ X83jwהy=σ|+/j).k|-X[=SH۠PK,VodRDw} |$vYYďVІʎ#OA;S;\#]zqt `ղxw?%IGQU]ȀR5*-VowN΋q@Vu)dAo$riv[d?(!H;p4p> ;L j7Nz~=Ⱥ }k3e]뵶4=`mBUgx0 -uپ`m[k˗Bp+"+;/^-H:EOv[Yr;<|4,\ 0Ue.@)N6檳6Q*+ca7\k"c<0CKʎM1x6+<:t#7RleD?a fᴃADXp +K1cey TUnFÎf<$sS;νNj%mHT 2x2E6pMz'رd(ʘaG̠=ip+U͑h"GN>p~fT<*{H=ÎGC@RF=4z =تjCY[cAhWX_!L`OkpV *=G9r-% ZvyT:OTmp"ɰGE>Ҷ z 2N)*Xo!a)Y7lLT.&aWyih GgZ#$8*VA6mi70:5 zhV{%?X*7џ}Ǒ<تj֖Ochh& LB=pdTPiaJ0]YA;!iV|:|%ɕ2fdPiLV.w/`dJJ`f!Wj%;([Hb5Flx4ya3H@\8=<*#0 ÏHU  "z8AhGX!/ RSAM+2zJ yC2VՆ"U[[.ӿL#J%meyP$=6$^v#z2ʍ[\AknSA{7D%KGe9̒e%vCan8p<ZR悸{AxOaQiZ#օt2H遺>*ثjV{j{*6DǵB{޿}k_E =S}PWYJxw5tnG(+KG>&IB=&RQ%v}~ ͙}`J!4LഄU("dRVQs26UaG,\γQSGNN|8 7 zPY҃TeeVl@ul|֖ׯcm `U!T8HDPO=,̼i>2be [A{i@'TFH `i 0Ugo6иJ8Us`*64 hS}у-F|QKa، v AhE.<2a~I-bnaG\t:p8BBÎ Q>/'czs:KUm(k˄bw$I?>`BpYJݰ)E"ƎR% #Ot7dJ[+`ZS 7lAP8kˢ[չ`)AiT]uvP(,ZPvؐvRVUG})W tn[3Oݑ( = p-QK(J$zP[2zasKcd֖[<4F`e!T8%eoȟr|JF@T0-U=KTTqԖ7o.P\V,}UHaM[T?N r71Q$pUJ^=B^ Wv4lZ ;K%լp󶕰Sj^h.ӔZjrɃS^!+Q)&`Gdz{lPm eț 0U(E"B~'X[SePi$Vojv7u][Ys;h,-;W"'F`4odf:Y+m6v "K8!U !4o`?#A R&,jvԮbVu4Ѽ;y{>Q}61w`C[Y:8.B)F`#80 P]%TXbT.T-@@ APa ZիWIz؃mٵMriWPR`DIʉcPBa@})C7Y)P99IL~Ք14e>{AŅ(P So3iHUi\`~ U]SU#-Ҵ[QXXVl`q_הCI!C ̹6dz4lLoYCDkmۑg31zw ۥwYAD *㝕 :>\KRٻ U뢷Ž#OusiaJ tLq1m= J,$3T*ftaGAJL!A])+Qiz~ ~&ˁc Z˂`G`J&x-4n6*X ZX,4p| {M\a?6YiCR:|oLc#HeIzCO~QY[*Vslt5 ōǽ{v}#7BpSP}>VߠD۷?+2tníe_bDneqW6MBPLN">ճ"<äT!hdSS[6_*Mii{X7<\3p zu xZY R`Sپx`lULoohyf3,g`LSyԭx灬^\=X+ I.'CC].&gj? ¶#RUG@ 1\ c ELclAf0?azMz\GZ^ڃ27&Q<zx-U1y{ץ Ծ;hl~貶>籶t9òw/eBMpePv0JI'z/G<:t2ahe1ƪJ0)^|mVi+5UBPi*G2?v| llwp=e AfU#a 0vxynT"Ʈ*s>yPuD 7|!bh/sS2,ejLNJpk`k=#zܹlXa=ڥp{Q|Ԯ9&&GͪUyY[Uܓbt' =?-=oB3qk[vP39SV8xTAjhgHF+'N *Uc: d+`{BA2 L 6ԬL_^#>þ,fyTnkzL8};͛7? 0N@i,5E88ꎇEt:&qs{:[YF]cJz +aRqV@TE9g a`pR`ZL044([RR9pWʊA^ =&@6<`Zm/#,,?qY .{ L L<2O0X',a>/@uFaUZa"ѦGWBH-`@Ҵֽ<sgC/ =4p<|-oͷf©Wz)I6lsH0CPS+PwŽp5x\C{G)2heq;̊RXp=Qws^keQ A 0l9NT7iNN&. 4O~}x`l԰7cA:lâyAn 8wGda9R%u0: 58Q!#y28Nm?`u:/UF@>ndFYklG pXj]\B:.#fQu뿯9C0<|-S_kK*>Ƞ 0jj#hJ}3;~}|2,w.ýV)rd+`YQ 6e)O(;zT|N$z) է *LaN,D,У"5°L px KPi,K#`KLЃpRa?"!aU@@XõFXc q4n"21{l(]9õhn/I&0_ɠg+l#T{xG z4W^?{dCibz X˲a> zUnk=bh >\QkjC8bVwDSC.穡Dcٌ(p+e*"_u) ^qY+S@,,aSM7R$++K pK4*4n53HvPaY"Ͱq TBÎO_<.pc` # >v0m*LݟB,X`G\-/-Rs;n& lUgУf(Ѓ]ó?3gA(QہlXdô?2remzgHWC՞Dkj) ]SEPyGگ> mjjzoXr׸-=owPiU &|JM(JaS®)) *$dAP Dl/c?(s4(DPi$!J7e@HiVt!irBb pX>=uB] t[Fd3s(ѿfU0wv @$HC=p4HzmxC!4ipeQ {Y6le94L^C߻^ǰ444l~۵Wt[[ y [Co@IȗRӣX qFaǶRR,Yg^ya2hHiS6$j"ȆF?䱗A'CNSym p^] Gh?3+)csg \%zˠTF\C`#t.C.{_|&x|u{}A׵lkަGk pyogf86hϐh(א @A*I@:PY Ȇ"s`)ˆ,^eB 혏7gwg{V/ƥ`r5Ѩ<!;BΛ71rtl[]Kл{)[F[Y*\Vrd+`~{:ޘ홽Nsg? *D _;뮡u^ [ڹ;|Jz嘒SwXUJ8+AR]ȋ𐪑,aOѶf2 u- 󖲙*I|i,xL vGda]pK8;"vCWv_[a^ my3E%2!j-ǹm|zPУ4O-YdE,8ʳhQ沶<{0۫`Lt= Y+ٹçI!jjBT;jh^rGO7| n9=oy>b죅KWzad^Nӈl4*w}W/>jK\.La`p)￯Yԭ]ʦ,g&MDMK {^;|}lvVX`i;3ZjT8X7CL> cT+Zj^+kxKnMq~|_5mW`oW"[s a!)-S' ) ~z@.v뿺z9H  \6xV[Jd+0)YVc p{2Zs1k^$ EEEŢT;2}#^7~{zߝ;y9c-͂a?.dvY{y6pĖ(ekQ6x(lAR)e6D;zF+T /%U!%ﷰd$~q7ShafQHA㽼EҢ1c6 2#000ل]K >԰]S" =[CKz9(xS-ުIAC) cE8P;{wRtZm_pm-*T‘ uWQw^CQGQt;C7 t VwѡC xY ^i@1T^ܑU((SObQyT7uGA~;~0{{Aϫ8i+ Yb ݋]:47@PY(@d0+ Mp,Fm1;(J/p ^)ϤMK*è(G&onG1Ȇydt\0S;,fzܾ :Wja}i@_ݑ~*L6z Zjt^q' zX50++2Fa?,g%]FW]z <z%l*ŭp[[*GKѹ#]僴*2gjjC~+ _*H\!Hq>u5ϡy{ދ-Qq0#+)A!\WwCCTӍf~(^#AEL3%;EbJYοR0I١հ9ϫWGG@?VGR;lWkakÎ*[`^n<4pn$\a8v ,":[[Hv$ fklУE =>MZ ֖SBS`j0Uy ] C ^AR&pZw>w#&*otT$zJo1b'&lBa;#Pv<#9p>!4AʲͩuḸ'v\]vԮiz0uJcYSE am! '3[\,w[|iP] Kz|VqAʠ'TVHu}c@!n-EF٥xصC8pꎣGnQ8O* UCTj/f *؂4PQG&;T1gvP@a{jV >^*vx:[4\SaZSo7aX[,~J%=-b;١Si%Tf ;?㘼㭰u= =jaңE=u/*.]CmtLjjLjj/y򨯯(<HdƛZoFAC;JA2R{&,0uVE{i :h9 Ts|LbnvmУ 6嚐#RZӸl,5!kj?yW*"臮wT+<#U)pzt *J(`R(Pe$ z ;(UAJ0}J"* =y*"AuYZYצ )m ;Wkc>L1y'aG<+haw9B~0ڨ`G0PrEz8!yQL; ;i|M?t]Ҭ,!_ *6pgztI;=`q$$옼e5L@t8MS LS ̺i Ý Z&+ ҢzcTwTzL5> 1Mv7t)'GBW0UyX-V>5=sG*JR2v0 0hܛqYpG@a7Lav$~o&& ZKm14zDTChm/v&)JEӄSokK5UޚڻnpLQ__7wEUtvv֭[c`CCCƄ橈jhɊڊijU,F5 ; y ߗ8Lʂ2 :/C0lpSwԮJœqmFA;W*aR Sk-P:r+40록T)L:4~<`ê9X ǂ q6C1}6ZBAve܀z`nG=<&|6Pᮩ[̮ءT**Hk>t6_uG3_n݅JtH;iu0ǡ]Er`.;ڜZWm|@,^aH{ v| ,C}>׸8tbq3ª;Y?/Fؠ[IkT%I *naۑ^Q۵z찶*BE NVILNқtp>XhG=6ͫ=sc̕[o0?Ginǽ֛VX'a1ݏBBxpXYL{}jm`lp1 ;CKkEEGV9lGa.)CJzȊc2 <04[˽55 4ԬC 6JZQVyѽk):BZ/Qy|MPy#ꎺ wt7oD2ܹsǣt: m 0q;r`/ρ<l,[<,(%+ gs|agk6^wjV%vf6&pSI;% kפTakx 67`xX5T'vxbvhZ8 ;o|3R_ӺY_@?BJ?[0OA&HtXY,Ŀ^!L550(alU$ z[A= 8/MZRyxJ^ *<=fP] V*M[qGѽT=HC1u7}DK|a&N|7fY۞V bttVwh0L0(;?رx$|d6F2?9?`ǧN+ 0 G;a~ᗉQ_N5|@B&Řt+KN7m!?ahUТE0aiUBC'*.;TAɊH[S[S ԫPyUFE)tRyYQy+ jg]*Ž?Ic|YHoϦb@CC~ v6JFuR0t׽)p#ʢK/78"02$ ~g 5yI!oO v+K:aV16WxE+ho|t:#p8=AJ/,/'GGW`T|",Vaс$fa3&ut=C۬<=*XZ[[ԛRbmI#%Oc Y򰩽*<ʣ룥 @{ *HoÄy4IDAT;?u׽yܾgu`f3l6Ql?u ;\I[YJ:\/_Yύ;'~e ikGV@0 x :L'?#!AuRde񄔶"Nhr5YwOtؙ7 ht9B*9Z.\Y3pS<,U0^H>HMrGmkee~ؚ@, = 8UR2kK`G GJ,R8ԥ~*]SUyVVy1::z4㫮;G5&u믿 MBm1sa5zbnZ:7,Hby:#NhzLȟ7;VJ0NVwYYNŒQK"][={N=={eG85'cMazi9/_Iy~0L-TɃ֖ q)$M`Y BfUD* ʣww>:w<_k-bQy|GׂCPwSw,_ ;cpp/wH/L= ߟUwZaJ )u x6HZvTdy)X|43v( Sw|08vfUak(M;TWwx*KiBhe94kCv/4)R1yI+pjl0ÑH@yj+0GtͦGaޱ> ip |i3ئ4ͪB+Ȭ--RؔBZ[xHpjJaW¦Lé),a*_N|4O0O0O1هfz[ fPR?VQy,8ΏMoڴiH$A *A+,GB[qMuC70|_Cq]#AEkeYۛ⺍6pagl횵ӵ aaL˅/`~7`W4ՠ,Apڣ ;c%IҠ%[-qYiAi"SyLI*`Wx9FT&<2[eu߅Rw,^H4Efxua6Lr`Uob `7R,wPJGСT*͍Ӛ5XZbdGVP`ZrAhYoFЦX4hemUbi'4cap D\G(UGu)^~EKaX`Z頭.T&xI^dA2?hmxVIqܭ-<*s <ëpjbSytlυC7̏M4.\@Rz@>ϢTwC㇝;Nq lXr`P!~%^Γ%8se֬ZovYVM`*4\`dæԩ;>biS&\ ;t*he2?&a =b́tX[Ĉu| aҳ6 vxG须 =`bkUT ~sWAoM[aVF=C*TqOXuި;ѫ;le9p瀨 ;̂!47E߉i@p1z,Jqx L!'aCJڍqPi2YܰcYB?vL Zv3; 6c\T'`zT04dKd0O4bz$U?R],ɲiN,8<7*K.ʠk/+<2X;"dxf\Uw8*rQ *#+FuǷ]E";4_ߐꙘlxT傚 '_΂xNj7ko{gJP)c˚ꎥ0O_:uDž=,Au$(4\Hu9 pOV) AMaa490o*d=lq&C=|[sR<$WbywR Kc|X-oTz¥gמ,*bQy/AU_D;EED?p;Rw8˳h\8d掴-L![7󟊍ps 1rT=FF4lHcuG!wa"K_Q4`\qsjMϳOPis;|aX#2k aւi5GЃbytHع~Fjqvx<>cSyDfmqaSoHʃ?WA*�<8kN;'~䲵|ϵwGүTyOh<|_cRwKBN_d]`ݍZTi`,+`sۀP93c TySzeZ~|>֟(*5IWwXk]ꎋRTʞ!ixc*BaJYa3ٛ0R =~+;&2QP)sZ뒒a"(~=X Lʍxl'Ui1MGǶ\z7*> E*>/¨Fz B[XN-p x >$%Q,1هK҄yD`hêޔG@EmXzdc``G`W#/Ti(?(--EQ6^;jGSwP"P$6(.K(v(ۍ,ӗF0j~{ JfMUG\6%KY *ezD ; 0etpn{-,#0`ZQ \uaV<9>p|-O:G<]>;^k֬+4_ *Qwm㛁pI|Y1;zu 7޺;W2'MG1 ˻7H`FjL6ˁ[\E3,7i;A?r+[_utpfC6u끩^# y/~<icu2kma[y0a <<30;ZIL6+@<" 0mbq`Z`Za6a{&B瞇ZЃL ̓ LlK%R] KeU1XF*$V~ $ Ty4aHxxi ^(  4+=*:rǭsGv/E:y=R(*jTKPy_AHH$|Ε;&fE"TۙPW=OàR?-[ , Z x~ViK)4(KT$B^Jì0)*I C{E 1::+ည|K*jӳKV>䓳Q`!:ߜ[;vD iA/tfovԯOឺ\:]vuWaPwPY*ϊ^Gg':$9,E m4?3 $o;J"~n2(T~Cb!Gł]\2,c/3;jai'\ݡUwS߹Ž`; w{`ّA=,c2y< ӝ(<GLY\ԽXڽTED*'w=e 4+ l|4vv~(ui|T`I*L>4l;a >a/UpuGe,ALaM?UvkHzҿiDOҠi!-0eSyN / N_ʥ @V/qY[VTy}TSA*{g\ p8Foԥ~@EI!.σ.#ǏnqFV:7 }| ҅>wޟ˨0,e9pTgw@he#)A)2SU"iuhKaGuBPi*tT*GL;_mF8dA[@PiITwa0~Vݘv|)L6  fF?!`եzFo&EaiQW^,0% e<r)QSmlЍ-e)JcBܣ /ݝKб=|`kG^z[KBx)ϪhXEW͇xH n;?ЇQwnuGC f P♜ 0[Aճ3xPճeӆ̀aŐh>~!+< zkQ܂x?dÆ䇕~RqjhTkMRax CG̏m6b0^oqb=|G2!ӄԶ`iZkOjx)i =s;_aUyUzYʣGqs{*[nUT~ǵ{6}JmXAZ_Հηg͙uǽm=ꎉ=*@u#E(~CϾΡlyv[hmb2vp1T]qRdAƨ;<#ٸ9aw+8wg>z3%êE; }0 ,¼"C}0MNvaB5cMmܲ<|LC~VK5 Uy U gdʃR,Uy Ry+j'\᥁*y=yAO!KBx)wJc +/^mOmc`u̫pgtʬ*֩Oڪ^Sea(tC,<lkVep )倲#F m7~C2TauḪ T'_Vt+0 ~L0°{ط{*kԵIQyșKŰC< <%.ؑJR273x(eHJ5.[ ]QpWԎ ɓ'_ ^mE^;_0/+K}wXhl#D>!W-Y|L#sPrgѓ@ ~*GtxieEq~ۨ~ߵ Ty+u*j#Ua۷oӵ=ꎾUV YƮ1[߸[),\>W5U65k3vxLצxg.pgyHrS۱03U3@*&%\WPi",L,c<),,!'O |agV:R1RRs`bTyN sUAKU^ug3xgR, Ry+jz *=^/T|(K:Rzp8Cx``@ɇ|s&n3ۣ0Vw8]Ad" !đt;Kc2l=@+ Ix4mSՒ*vVFzm*:?IvGVVZk8%ӝKIWwйE?o {aB[[ν-pǁeW(3@*\-*"X1\Q"W޵7:t᥺GRHQX!JD{~Unuo!D;(YoT9SC eaJ2v4`.`TmRr:TS `)wYy`G0~v?NʢgM0)vb; ՘ -Jy['`~ 尵y3pk1 R? ҪIQ EQQ{M`"p3.좕ǟYJ2'(Tx*j}UfG`EB{5B駟>ﲵ<"KL/妝>vưRNwS?7f Tw}D"@xugs{?»لKAuMO$6(c 0},ASg.A/JLjgUbo' xfw;ԝ;c0-l慉RڒlSw%Qyt `;Sy:6 !=t (UKXSSd%0w\qzxHbg_זRE?ӛoxaSyc֖D5: SWAuahLSc0#p PW?V{O>{8.z v:lZ%pC tM@)Sm`@l<&&&066! Agg'޽ S]]'Bxi~V:44tcGp.whw/Ծ,Rwʽ2d;<#ǛA-?e'_b]U[]pQfD:KX&HjIx~R2 v<5%1kl40nWiqUPuGW1>ǻST?~Tظ 3=O0l0n099.RyjG`crz;'ނo<O©YB^_QjE \{Xn<~''x,PlhZG/HސT7`(2,l6fCb||ݻwTv~ϵ7G!4u#R;KR_]g?!I sWtX;qG1B,nu٥De6qHl♩]j59v[ 2?~C,3aG:΄@<bY`GZbD;k;Ԃ#gvT/`G ҹBa]Lmgq빝_]p; SX1xZ񫗄M07xX m`abb"6@}߅y6\ La<XaU [9 X?{X%I`!+3Ptn ԋ4 9MZp p3HHA娸U:=*!KZ^#a+!H .yO@;s,7w>{{{i;,rUw̧f_dcO̝ͺtNG1 yNT%~^4mFsdK; #ZzI;zH°vf@,>R8ڥ%xx,Nqca.L|T*Xpp: dZZetSK) .*ڕcnWܮ*=kjZapX# QRG<l jJu`;6^S':Ɂn{KAoo/:;;ŋܓ/eWxC?/r3/JVH$hl$ +u;|JM!Jiؑ8<(25ϕ3q*ͼ͆bd:cjDpn XaC`G0R`  PfG <uh5#,;twaͺ0`4=%h,b>w`v+=_@yk`lcx v,[ VIaTVwD6u ;wAO_A8\`LZt S.XK*دiKKc1ZB;4&$K~\Xg^e^f#ZH$ԯJS9(J3[2C(v:DV;q'âYK8RlglK%H1r_6$&Q;nV8lz8Bv055Wp*`lpȂm-lA7,eAHfPK0ZU"[?C:/pxtww /k!l-_l-RwY%r|I]*t\[pg_chעa9 AJp.4fy|@@ifRGTCKIfgBG/ɛs%BPijj0"1 D h?haՍnH<0O%x\ުbGXRߊZypjJ# /=wv =|_Uya゚Z;M!$2Yr9stl_]л' w`<eK†RYMrn*\YBPק]?TY 0$r<4J-- չy kWﰪJ`v7 06We>XG;V¦\Z*@;r{0O % x{0rck ӅLvM 5 54Tmk ^?gΎwFǻ ~У^:[=V av>{E/c"Uy?9Td.JCnd~DN[WU <2rCB w*J$zjVL2JZfr70wԬE&YgK `|qq,a!,÷azYaS.LbgLChaӏzG i# 0^S~] 빝0GP"zQSdVFxW΁S2Nr=3ѿRyt_wUDakCPy$;?D>CF~=Re2cK0%z,R"9R"B[\󘁇t~=/n?be WyXT1̞^~_i!3Px,-5?%lƅI.ym-TyL5&v3P/;䦖RB2,^궵K'+a|, fΎև=gsx8Ω|\f|Ep;˃n;ˑ#GEgsVڻ' cVw@+ˇAVj-w;$AH"4Fyܸ[U$Jq%f\0X ; 0"i넠TBb!4ټBaMP~v50r`Q%54T~DҀirkg8 lƅIck1M&xoIQjXj6x8Upr<܌VxJ©* /5HA[>gct, U^j{Уq[˃ ~Y~ ~<::1/{5[qseU/x t|`XV*Y@;xV4i}Rn±; P3#(MYz&|L+#[ӭzE@X" =*CTX*_7AO>ȃ%^qpcKwX&25|_$lƅIN[˯_T l-)_sH KUKc!AṡR9?gahpZnYsP.K` ]L*3qekFZn ނ$I`kᗝ,/N&/Uy,}{J]v|L`^{b8%hٙ x\X9aA}{WYJU|>0|As A AJS J-;R6Yt 9؁2;éʃ~ `W&Yl'^Nm`鹊YkM0IZF.R\zMjV"/UV2<bkQfg6)ҹpJ*My0U̓b.YҾ?Zt8㏟ akG֒;˗,_s\/w},cccrB\Ν pkwpXEY6e!l8%s@W~gu o<(@ #7?godIG@*Mq)ԍj '@ Ջ9/E9&.+1uE ]j`j֘]cZ:Xv_f,a[{*8WkR^G֌zo,Yf8K`- $e9Ծ,^ 0c~8A۳LZ_?D"#>o4l-I#^v/Gbg㏟:U8 sR޷  1TQѪcJlQ=Y6,8@,Y J|5 k 8wt(P v-{#]{~BP5xHE:[쪥IGsuBHM xҸ +*e-=Uh 8mב=?iX-MA5Z$rwQ xpraW¦\< Ǹ x ,m;æej!G05|OoaRqcLðhG`ӏ%xXz0|Nr_Py0nTCBd.9U90@?{yTsq|kvq288X/ZxhgyG$I/.x/nlEݓ,cLh;̇C2jvt]eP|h_` NB8bkUVi ɮiYHf> #x\Zoqp /P"-fFH:Y^Rm+ͷ0)IN&xn5]-_ "Չ5˂l-Y fH)rH.keE/ciZt37ޘ XAzlkT;p~eUpHzJI@v\ͬs{-ϑ-/B0MȖP"V-LG]q|5,c)G~ <2v()4}7aZQx ;]aLz$iM-Gv1? <p6I Og*j^. x90Ehkk4p:ܑhgV (Y VEGӒ*B2t6-A+J !' ;?拵2O(u_#!4qߠRG%Q7A6c9]*iC5nOz`Tya-LJgb҃K'ZYMkZ[ %0(0UCh;AUXJeB8'TQHmP!4S J2;'׀,efYLN6EZ]gX:%4X҃Ku'6x>-LOSx8UK<&DPx?KfbTmkڗ屵okzomqm֒|;ט,81._LƮ=v,eYcfZء CT<Ev ʃg:|jo祸5fY߄7 *]9< "ޣȍ|DB aE|GJ<pƦX%I*ʋx*X[?gH:@]ZIuBiѿnBi,xi_q}VEJ*iMw[X`/t naRr`&B6$JajZZXZWK+ Yz. @%8hAry?EJGKTDI]%G] "nA_d'AG<.] {4i]I;t ֡7?xOt ZIojtaԯ%! 6y]x5miiX P}l-dve,U`tAl"wӰM k+ɻI{`x¦[_`_SKC;pan[yEx-d&H#z em-j6n8ەhkk/IǟHK/Y,un;"Ǘ.]z,d0W)f",`_d>ߋ)r;8`ZLFs"$hX/XG3( "kWdOTx4xuA#,hծ{`G"ȩr ,S{/c=0=&w+մv JjK *[<= l-?.?DG?)prv0Wϋ;}{w) *ey܁w3? 4=͍CP)sj`D;e{-yHBPi&ISxF G`k1V΅"/[ |l-֒;oeһ' 1X`gZ7;K:҇'s9p:Th[PvT$Q#FT qv_,fD <d@i܀f+wIl~ѱm71YyW̉|az,LDw(b l*X ȳiIuk4_!qى_eO-fx$![ZIBGBK1X#Z* BKGz01ԗ44x*`+h9$<bx$D9U,b؇orx\zuO}ipͿ<|Ui vw~OFc+/c{nH;˄9 ʣY2-L}P)#HN)> NLj'6p1nnNk-Ԇ*-J# .4Rak $ppb-/E<ړ; 0PV*b!ts`S" t.ҹ AJg% J2#E>ۣ}ҹ;Ql:P!>~*)IԖ?-P|d?iΥ!e%88ԹraU¢pilͻakF)<<}Nt ZIv`-;~õŰ]EV%9Թ5y[Fy~k =Lk%XYS}ٴyt&(, es{7T=ƪyUd|8ޛηgo2N?#2 z%T~G(;o3\P;RGY!+0Z]h+@_9y0WυMⲳH炐)3]i~U#=$d%nCYwb%^!_ &m@{&5W=?idcaUD#,˻"U0<w< ~Yt 1[Zځ6uH <.QG #gBFz/gvʹVXYFw/>ALf-G}}l-QO:@;. oO޽E2uYvY 1TYL7),b&qHiY!B:l6x +'+ݙ)3AU-Lfmbs0k;@iɬY}RGLuvRsR1+5OFa%vD= `+x?) J6t68$n3UσMѽYE̥Ǜ3$4핸G[KFӆ"ϣf`H$zIv\Lfx9W,J }҇.YEV 6IWE2 Ҁ~)+ RDZxS˖d<"'uOdaG$zȁGKeFki+lIh?|?鵴iҚ[ xXϽ;}QWX#؁mk??QO| kg3<3Ӿ'҉;sWzcÕ?0S崝XEKvU# G ǘVB:8`: M­IN7Mg.8hꁗ:Uԯ?iᱜx vB@a/Q?2P|E_@{^#haӒ|o&cޤU `<Prue90eʃdA#gжB:]ʹ*17;·s> [ܙ>u?h;j.b7 ,&; Mⴀ/Tzuw@a <JQ-!;CF6WJJqgQ1/ah8(GL-]x|Xt x49p9؀GvUx|b|& < x$t&H <ҹ=j.t.16fc`ٸL4i144PO CGFӲH;&!HS |qt)+/)Uݡ yg0 IIP)[aǙw/>~[jgr * LzKȨgX$4LC׀YqGLieiibx?-lI^>{0D1udf҈xLفGQZ} /e,۵"N9q}s< svڵk9/ Xnl-[00:mgr+8E;e6c)7<[2<ePp/͜Rb?iuEAީ 5y #[v/`.uonbSxL^1~1icjz0} u00rFҁh[x\R`Y0)ŽR7p-' <0mGb?:Tfct, YWO{͙pqz{9q޵gjPyī7|,\~};/ScGeLV;_~t6DY|GK/ĉf3sr8!#L?ƹk"jjt]CѸ;<\0{ RSLctNwty ljMqbq\8q/[$W[."EIZ]uMoV]bo($EERD!z3?̀߅] xx(an_R奜/>5CQka x+Tɫ)wQi* 46.|Cd҂9ygYkp赖ftZG[ܾ}ZWg/0ZnfYg f]M1RDtGEdquPQ/Ll8jIK`7mLRJ1fHC=Wc?"lP.~po.x4>HA` xLex8 `~_R,xzu?!Xj8-KiWgmvGUHՖ9yg%5~]0a;U])ha6/sx<>f<ퟱxG׾B>t}ۊ0cCcVJ,D# "R>1"ءk'ˢuaGde^j7^ ov?o(JyB`gtGy6p-$Q wG}Jqcny x4CЏt*?j?~9A〇C{xS Rģͭ+7#T3 h$jg'l"XYP>WP|P(0]PC"?<x8jױoQ׭1,.՞݋{xj4CTx]:|K2=t$-kE xx1)puTgx:Q xDzR&Tl Eȡ(R)ΆfaGi zc޽,O[l;E:KOOBG~7Gc>Ʒ?pVΆzv:tG$GJCI̦<"麛y_"O P`*_)|A LK x4.C{8ؑ `Ny2>Lu^<~!*֦WìNI\*Ukwbr|f( <"R:c"HQT ^} x0;2j] ;q"v4(cFpzw|E&}cϞ=kL]T?x@q(LԎ(Ԕڟī?p<@T-0$~q Mwӥ *-t\,m" ss<S`ںB#wi<`d0lt6 $)@~qnmɡA*poMAۚղ]h/pM0ߔڡS{ .մaGBqk5 [IKYJQ$-x}A=kg#PK<ճ񴏄ZbxeLJ ϧYܺur!/=Cx{ hwRR1;FXZF$~io£~nfH?h~gSfE vJ7<5:b RT*SI->ϳ<QC4åpA I$I zI=ØדT٭ߙ:KKs?Zn)Tа7qOhy$cCN xAxX=w0do9n^q0cG 슨)CzKŠ&!|h]#T!h4OR0o(`9RTh^ *]>aG4,CU\Z7;RR <3)@ A]DaDafۢèUI;BRe'!h{0I3tsyVF7pMu=aAA7<`LJ3w|F&}.<刿CןlUM;ޣwȷNCG8u.&NR8,"9N|@{y:-5 f,>?qp̅Bʗ\!yYťCO<\pݬOH#%MZA ~ ^$&b)F\1#G#NXz|wΉwL0eKnKIDAT8yV=M4䈒inҐh] z r>;@AjSЕ7(-Q'/HgSQ)$#0}.\^o1L+sxW3UT* <+.)k-[p\K2~HMu)Nu =6vJ!SܔGD^W`bڣûTsw?nzâ}rZg >dی q,ks9 KG_ nvYcxo d_+G_9 na>s!8^ Lgs@䈽'KrwICPĥtt*tǤp&~AݸuӵOw$rV桴 x+(D[,_KA\#iK?$d`ZkBыc} xhw>H K;Z! Y)ovE?aS3@~`!-@̮qUj_w@`4/?STKҼ LnW T4K>͇4ǣn|{y^kF=Z C)KIa9@ɦ<4W.F /Uja4W/$pt<cYa7g,p-ʩ`;t/ $TA?xxxƯ x ĥz<>") KcY>w|` K!ɾ B@#VXJg)GmKӚstAG Q' DɻJ#6r 0DI`#As$!Ϲ8?'xsf5k-k0{ZPS1RRTOMy#QSJyR*)MwF&Uu\ۛuνi~ZiB~ǃ#XHRS\:s,ְ13=~E&}瞛#䝥5}?1n4᭦v"҂w0Gx!MQQnv+_*~$$h᱃h^&3.Ad(@T?.ᱜ8#k-ms<*IMyX`ҍarr:PհZ,Sl,әЌB}gR%,3B}VT2K)=:_^gZ ӕ=]g9\gtzC`_SLq? <<qC M:A{<6l0;F\4ĥxH<>lK:/n{D KqRPG!EҙV=@HɟPΌ<?KHt>x*|s/FR*JCU%T;!%17C<bVn1|yU ^ld$z=Z-j5 9fӝHLljR%&pNwDݧY.&.7@}_^^Y8G>ǭѽF!xr c0qZgR ݼ;gKAN!/G1 2 xܿqK2 q <KDXj0 haiKXwP,aGlTAQ1@ "ଡ଼EMd zds%O顧$G)T,?eGܜ{<[kkl6f3F#֢h()eAF`ptQS~L b:[REg1y CЍFOw8)eU唬r-waeChƹ^gbGxuDy49Î@ Ax k5dX&AtY.FfQE$!𨛝xZ{bxo*pQe`蹎=.Mw$pQS`74ZA:KE :=ZTj 0tG0vjJVz+a?:ިu\;ȺYBx$F<qi[C?yiKV  ,KU&}!*]%,H ,wқ`? ӣ?JL36HceYIC$?YDp쭵n+ ;kʃmel>Q:KE.Ц5ݑjZVT鎸u3f/q ճ2ZgbZKwH\:#.W$Lh} ȦCB 2 bjmF;d>>h[ꢢ&/Gf-eS[1GU`$*H`:/Ֆڇ%x!?ٴ k-Odrn}_u7L`P}О݋S1zb'ܚMw0GzƤӱ._teя1v#gaG21ףJzCq7wVVzy]C_ĥG"qض)qi'L]]݆$ҿ#SaWe27}s.vDXͰz5̗`XÅ h8,RsiL)AB"xOt؏R 5\NNAC(] 8nVvc?,Wj`T5>򘸗usʃM`ʖڢio|3ۡkkKeFJS@g+>_ ݥ:/tc/g#6!/6q7 qJFs!.q駄..P~!,L&5YJR UJӯQ>鯶<*J9Ѳ6}P*lUbITZ?x<8J pR-8tƮy[~s?׫))Ȟؒag")[j}v +]#6%]Qifk-hn `+Up4~EuK)KGRÑ_ x qd2?,.#,ZRT]YJ;NMx:KT5Cp>\.h\z*Ly科p!J=!0m(AlW4;JB$?)ܯj}5V=ljIYˬ^+"#2aZ#cCsf=*K2iՖ߃7$0S$xc}who*K:B=tG =ݑsYƘ:ť_3HE\:VTȧ׿+.#G& -a7B}>0ma)Qpa K3VY\{W!gi!JBTTشVJRT5 $@4Eb*_k-ƨ)&&.'\[ @zjʣ+SsU F^G:-n܆׿@Xw'*KTiW-3Ưȧvew tG!M\x$+S[eaٞ <%.|LtBٳg;t%ai|M **pHis6告kʣmCrࡒDJRPE>q.Dra3wP;aV9a뿔U– =Էo(D_zJex# ȳ \Xtt쵋ਝZgt,$.zoJ\J͂=ÜG<#U~ViyLk k-qң/K/r$pnHxbjcW<'wa^y߼ ?A/B}2Ns:;_NY\G~*+5.{(Y9qO-,uL-pNroiaHak Kc^CQÜ;{`f8|?S DxJt7hZ*A Gm?M JmM^j/cV}/$` vP_:R^ {r窠>_ jh/LwO4?Ҧ9YgJMKճ9ť1҉=xLqi,ǃO+,WLtBKF%p K#),%YҸ_GbFE7Lw8Qh9+)女y`ʒ;8Y,\UkR;["x<͋~MxNx^x<(n]/\]u:dNyXrjeyc}L)v (Ž_9$IJXeR;qUI0_ݛJ#+{4#_LRwtt딸t`ÂRWK<%x|8 a_0 -+,B2ɀw G K#]XT1oiMw0Y\{s þpRDm,S4SGz BM.VAs9[ se^#=lQ-1W$X7.Gf"Ma_]HxEs ;VYLf3;Jyճr"/q飜R͎YQ!/˫Z#.Bϖ$#V\aXa) -؄č(ai$MXI$,fV:8~C[Up_KLߘ*:鎜2,0=,u$3u@y?ok-r"/=N'^o<0O}WO(AŘ<!'dߎgl% YFZ.ɾzB-ZUFf)(TEPQRU*j Tq$ `>uLǑALv# ")I o P`B[G=7vc.OУ6ۚR ;ܓ9[sU*˥JTpM0ߔ>vX6&NFU^Z L¨E7Wt܄шR5t+aV z֩ti=VmtGUs'A(׀JiZKK<&+WBo9v/ebIj I-Yx|DŽO1Z(3CEVPY\ cx8C {PPCx4:E{glܜ]m>CØ0@7 p`+O?#Ag1q(1:: Z z~&`ҎvG:0|^e]Txuw4|x4|J(uE(_Pr0PDkxVcdW<+O#3LKKs,I-0#C~4r%|#k2]]]Yn5" |@STֺ5p6H K#Zg e]|T #.a+JabYavT6vK$ 7Ht+I@B?wҍG^;X_yܪp*7NMy\x)m\h[0_\m9Ɂ@Y Q81zz^㫿So;w0221C@I;^ AI76 a\ʢTXe`V= 3G6aGtwxDyR RB9%.)qZT{)1<]͂=ܼy0Zx+ >q -J^cw[1`tw82,,[{C8E^b-ʵւPZTk8<+gX> {>2BWDi|_gRX`,E@{G@sRX 4!^TT%)KQD[T<&OG^u \rTUTkAoa-SiײŽ)Dm[ko&7¥IX`S=mE4W09 v-ٍ9svn+I]jZe]Ye=tGw ;<]rT[`oC$\p7oe|?mA$+ޥZo&/AťZi+«X ;8G&Nؑ !/R2ZOI%]MkG <&Qcpn+xó=ØLK ĥa$m$2;>O+脖0۳1YUOY)A'DZ {>y;+^n];Ӆыg5 _ci ޡSXƇz^`djn;’{a(ءT˹25&Uyh^?!/Hj * 鑯U+ٿ0:-ܤ׫dSRˇw1 -4W"HZ>(R.1 < ࡈ|ܜB ס-i[x[~XpB)W8-[0_R =4gՖѓ;1||=2iء bX֟v ܦAG$E;z&fj` ۑa3Z.WpZeU&P2a?MwpC1<02z2 ,E%~!1&/|9ǒ{<<Z"̄_EBb~ Ѳ?iN;F΂8LԁkӲ)j"=Yh,VǵZ.sff(z5lp'vx) "# p0|*vaJ5,w&*V[s9ݑM <6S},R!KIjA0ĥ>%.u5ZP ڊp YF.?Œa \f$-$ -7o)XʅZ<" -4`&DLMhAۆ]6$ކp-f)Ue_ _:Kϩj xx <(DѴJfvLc.Eưc2 X}v>B!B!Vr@{5$ٔGd"צMxBMvyqwl%izc.pn4 s&|cgN` :Tn ɉY;"1̄;Y1z.Q+IlJOJOw8Us>AsC$_HI-DkjWG%b$\'س̵k^dߊHjϑ护nӶۊ1cIt$mM|$-3%, -TEE׋ xQKCE)tJAص] R*(] w}zc=ڜJA4,q-TH?_Sdf"Ivc_#]a*6sr-M)jZu`q$Ѓ-Ņa^VD4`w';B[_Rߋ[W1X]TݠèˬJaq`{Ay#ar+iݾ%_@v~+t -w+Lwf|C2鎺L,q.=ݑ_! L2Zrl`WA|6CJx LSV洦<Ҵ&=ӈσKb:z^X^GsŢh$z}4`8>;1pbr68` ߾H:+Q7La z,۴")Zm)EͰTTهMf[w)GlR 36Ԣ\2V`3\L4XtZ4#tg$|C&} 6vgHڨ0ZiA -hYy%/vR\&Jh/ KO%aG܌aǔTU)VP?S6ݡps`ZTcj- p{;ՖTWYRynEA Y\5։@6GdnbSfs4PO9>#g;݉=q~? ;c(1wƮۢ"]Y:/5Îq#cS\,oĉJs=MiRRK@MIjaFӎYʈ].\3̈Y -Hڏ}c B~A^P(.baIh0'7wdtXZUj|#z8:` &Mz<52t:p8`ۣQ3 X-7ߍ;0|"&`x _zYp0& ~r0e#2&]_aŽⱁAز6 ;hIe v$ܪUUTڼOw %%2W&$Di{ C\dM>Z%+2웫VzXPu5ВJ$L5Hxxp/Ğ&D;;],\#Q)g5, FDT$A;f E<fua鍚;0|2ԭJws3E_=wB֌W0ݕr09 :0<̝ ^lH;%)M\4WY^ZeKT}!r hR|L.P)& B O,Z8$-MY8q6e1rz|@5Kzb5i8 4P5;Jhj*0=x֟疧\7OA[/_1}hj*1vNa( 8AڊI;1 t0W` =79 ;1^g+0\kvp|-ϫ,[|LwBs4mlRKѴ˂=߼KcihL"iZ&}IHC$H;ѳuITT)͎mL)%v|uО|{JX;RYgɆQWT-0/JW$P?oA$ @j@y!S,@D-)Ie =_8qj9?+/@ƇC=xcw+DDFnT!G$u%[# z$e }θu$0<ܔbJ?Ĥab}^ 1"0$pU쟏|~LF &H9b9:N)?߷p OO ;,7x*v8/ |Cʫ,Mw(Wv <67GӎY]ѻmF* xh4#2Ѵ, -X2c>]޷q4P0\}.w s@p. 豻+l]BÎ0UV]g:9:ч9`V9ڇ$0*K, Fվ%H{>C0obQl~xy̸ZZNY;tl;&.AشA?A{XS]ҁLBAu0aQ3f@d"_ϤK `L!G# z}b;7`&;atgSJJܨE),-'aH4-x-Ю`.v.,l2;, i<2H$L&n drI{oGmUi`F"i 7"<ϣj-Ƈ{199 $b<*vD`G* 3%KU_HNUŽHL tЫ,yUe@|+S c%M9[mrX[6U[A =N u}?8A A lcGaՏ¢+D#b3̯x8R|psEyah1v \eDF`[M9;MURKk9KeICW Gl4%Œ*Gy: <|>V&}M|FN7%UL~ !ċ0{c>#Pr1 H`FÑ0(DGKy]4jKvLLL@VC~wan#+x;R]e )s?AW| vTvDJ. LCT??M2P( <JڢxV*X>ϝBI>h; #'v2SKe͝Bm2A..i8] DRؿN&- 7bG!Gj;K9m ع*_`2vPc;*T,19a|Rj B TMt4mJh+޷4x AN# ?O{x|5ѴyK# 6<>!O= %G.{cA)(AZC ȉ(0YmyX`:+ t:h4j`0yHȎ"*Ğ)z;bWY95r)=?Q?Grwi}g~܉ ǣS+@x2S6*X8xs =z\s{1~z7 1xl;A8\L;H#@|6=6.MULFA{~]]OH8r 9n 甓.p0ݘ9DuX+aW*b,'pvNc?NkGVX44D#*b%BB"jcF>w{$,휉C1V6#E ίI6f{Z8?H:jKz0W[ږrWáU Ve9wxnfmJ#6<{@;$@\Ff1aHlA bԿk$`1d2appCCCyuIcaS;`UêXr5 h^qFǃ <(1g!vC϶90Gȑ#?&dKXj$DǍ7Ҷms1s>F,EUPSKWմnZWCP.<6QM nFVߴ#?n}h+V`b^]%YQga>{BЦ$`0 GYD3A}ѝ%UK0g {K_ CEYXPep-~9 +oZ@JZB>ݞ T1gfU];.T*e9׎%npkwҟX)ٶ dSqEdX6m[h-nu -k CjM[Knqu=l([<3OL-܂L3{k3n3.#kBT7ன$X%0zP0FFF062 vX;(aÎ[5~P 7ӲޖBF~w3l}d(2TQgJ:c޸%0Ԕ@WY9Bcׯ<#<"/ _ms1kF,b1 < K`o,i- <)A(cWZ ˅j.g5zj/(RhC#;1y Q522c9,u\tCHOQ=4t9A4|X'Rnv5ˢ}`=Ki%&&&011FCu(a(wx#;`r{t/*|Q3Op.Œ‡B v#gdͻ3kpC df^Uh/G< z[⡇E?nSn&=:YGl #?Z5\,Bt9S1t]USZz0N Iw°C{q ?~b`e k;PƨUl@<xT̕0PW28(a}0k> < Y$g,ɾN sIAy4V RSl^G xWGn;lX`.m'BC=<tp.ʲ(gfz=]c&Бl#젦;( L ycpG̳;|+Oj 0z._Srަ<l_=< F+KnU =RYq: \H+:Kv;BeTFbҞ0a6a=GI#ީ)qQáv#оͼOwmEl\uia^JÏ@ceL^L&f3F}4䰱Ltxb:VX8aD\Ņ ;j v1 xc  H6G_H =gz7h_`"VMnWq9&nѕl%i`L%] \&u?:gLwi]\h}TG$nvB5%&ڄI8&''a0haZa3`jRե-i+~qװWYau ;h/ѾUպ5f7H%,ҏDF؀G( x]4ٽ,TW<|2vP+- kbG0!v\wrE{#t:1Ue81t^R›r?20y'e&OmY =[-hؑ.HL-p#"0M=XW\L{0\~8$Xg $eOy'1~5tMuaѫa6UvG°C[qUvD'$DZ70ݱA<Ж+ぇ.x 옏s8-X?I-<>k(o,k2[JP/f z͍:7R<@Dvh!rRW]Q1L?"$^7|v# + G,Hm#ӷR4=j6!_BN0$~7 /M)rm-7ǹhM{0p/G;N'Upn-8aTmʮC6,bzT˺j-(hf:a,x饗, <>+'<`d_d:rȏzams1ぇx"ZMݴ"Eۓir-rXJqб@f#  ^}?TZD,0E;hiQS+ǀ/ɧ=>kl%(_mӴGDT ='/AD$K>fLG:I-JhIx % 3V&xLV| x7)*EHL7黸/Yy{NT-]AY&^S&񮶠naGxʣq; WXTY6M{%2=C}*lED[ЃMAH\-+83x6=]k#6ɅmE~tכj111ZMб<GaL>5ֶ;2Z` F24#vzig҃C`:i8wzZgنS0y~HwkFף޸i6\]a+1k甇[כ]q#? vLMzlNl^;r"Bj <hc{о%ua0 R D߅_3_FfI;FsHo|}<,CQ AU2jCh./Np9\|8 oiwID)0] cP'< Tps7k]pch}2GQ)oУxj= L30&099 ^ >:ө.c1>#vp d%G1 =й(][ad :`G #ܫ-}G;ja=,#k#>W!T*?{Dّ =xLNNf@x4Gr <<\<>?# xlN!^< [C)' T53Hvb]=@/L}*HT#0BO+ Aq'|Q5 x>b8GR0$1_M ;xӆrnGR[up_ߞ}D`6P߇jlld`a^\m$%2=  zS eL4oS ýcP_4̕i庩ii<舂wªZrKxd;hŚJ3Q^ia81ߟ2$Z7τ' idodz<!^U=< 5Tb) <NLe, Fo`mu#=cEb[`@uK('G5Sm`MnQKLC7HzؕSìXw =Rrv6- |R]ba`>'bV G{Cv`r=&u \X \܃ .}X@ԗ0xr;F;Xs#9b9bVR <,pQ ;߁Yveѳ魶lH;UrI$*D`Ie$xU,)1[ x\^L0`LxD<>A4m"i <>'ɾߒdB(>(1< .RD+/\Z4;Չ9Fk۠AA\ຜBw˚(a CSS862IG)8ha2|I]Pَ`6*A4}A#7 ~QmZ=v-6 Q#p{ /x$]1q c֨!}Eϡ[Vݟ>舚u)ѫiI8[XᵭnY;옂فG%{tj U)j*,x d 3Ì x'$B(:;s]<+&P.Du ~ xmgw?(ˑaPHҼ L* xrr$]d'ϡ'hؑኁV*VzY;2푮4=p:p:ckլ.nhĹ?3ۣH0Љh„!@$3l ܊S{Pَ;t GvVWb+fj㎂;n^sX>Onj$u|"v<QhR?#~8a;{G/ xH<>$6Hb~@Hq ``|Y*%5ާ*¯Z DsRKj.AHUUP-GHJPǁ?Gh~}L˕wRqI#T9GPy͚E B*4Ϡ_uE@w+pY*z(V 8CX+"_ KpؙՔ@;D >zO'LvK_݅]^Ia ĂTw~ߏ?v@st҂pQ/C繧<&n'7vҼ!.v֡ v0~C6<ȃO8$}!vH٫=#\y ReW-WI8e5\b誊0F,6nԧW ' f<%</^Pfz>17xX`؞U9zo.A:KU4VaC^_x|8iOs{oP/\ Z <\,hdO.+ֺV& yL%vCC^]ϢD#<<Ud#|i?;8ԩ$sJky:;c:d_ JotfTE)?f W;f/I`fg2*Gz9[z^|ucS=9\.y߬fl7'  0a0++0&ۿ~p 8,?~nV:9xQEjn3txkdMq(#9S!U 5֔Qs3GT@`ʂcؿנdBbj$+. ]iBW[rD:T ;ꨊX0!H,a"-$~Ff҃15\)afnqs^} a vD~~& vS` `Nx &?<w. 2})޷: 2UeE&gD"*1dWT)0z*9],2{P`9uy4ΕDgJ*4 zoA`TEuS?eztW\i p^ =Ýtʣ.x ]N xY;R-.v%R]u9\R#r8O'XNnj#;-{$4 *k<π?=QƏj 63;j%Q)g);<&NOzl#يK:z9oM>:Ly?Ľ՜:Hq#0p[?`&[a=CVqV*؇.Ӱ#"1z}6g+,aǒ`< 0M<ȖpJKYo\\$Xq=a Ia`P/Hߎ1ڪGZ< D$*0Txѳr%AwH;ΘZ-< LS?o!ؙgݳ dtg1iSxU|ȹc,4;jxΚLwS]L5TGl劁>~?G;"i,?íXxKG cQ(i>/̭ 3STԛ`iH^YriVIT~)J+&s f ^+SKtZ8DkC\Zc%YtwHҴ<fg!Jg\O;OsnOOz,Ѻ<#iNq` ކN<iau);$QiSLAG3KxK@4.ycdBx]fAz-x|9Oy_qO#`撌֑*?)&3~1AhsEFq%\:A`:icӢ,I;շ9#1O~dDu@ #m#ٚ ۪Y{<<O4=y-|GӴ!GwU]WaV= :Mu&{;H$6;f<ۄ ḝx|o'n{@çfxTŔftWDop"hʛ(JO`5tIL$*ͰBH\[{ ~cu. 2ӁA9Mw%= t( >Է=lCfXp%rx6Q ۉ_¬Xt0X^; IW^~j c=K9 <\.Wx|'Bߒdx̪00Ͱlp:= OG}`w<&-pinX&@G#v} vkAceAeINZ$c=K?eW-%ë$xF˝C0U,b p|𣳆%ATS]Mp\xLM85'utހ< =>m_SN[QRO xeqLoaBd_. .v `*b[IDAT(QbXZ}s ?$謊~n9+(*=`١ jVrAy2 _ǚWX/&бYA@ xtǟsNxA G߉GOQDIp6L\;(0ڔ!쏥SITʧt$*j7'^, ݦJyz k덊u܀ 2ث`*R\0,E/u|*B u؏0.~i䈀kl pEMspdt0ƭSS*2c1pZ(= [1/ 3{ xPex?pК,0ZDHU h8@΍?J7>5sZKTk $xNvtAU)ȃk >~~|>|>|xn쇫v)5epL{ul.f5 ` 0U/~ m[8mbH Lٯmo`9%ky - `68Tlgi\ib3#OrJ1R6<} <9 '& .ċa>x؛<*- Q[pwu~GN0VJ]>A:eY"J*0},*Kt)i>p7BGP-%)8,?@48#x]pEڅ.-\L@,-`?#8/wGEV H&/gꨤ&8NK&Na^@څ7,x'jY9r :WݯV KaG=K?g{D  RA$] <, TӋq4/FO$Vth߸Xz(JXD˥{3gy[g]'r.*T,Fyiާ=bѵ`Yǩór Ki] wRYp-L~0v1̊5|y8 $`o›xg`VVTbNp*˧ Gp< O)Ms :;tBB1),Ӟ5(gx؛vg!O^!^ մGPU;ST88ʼn$g BY(οY[У FP`JK,y% ]f.qP_hU ADc-_JOc1 nXW"~@ z, 4?ۡa?s8+}k+d6Io וw8{OC8̌ . pDYymi> okyZ#y8A׽*th`q@$IwLJ^ YfN+.aiT< 2I4ǥW\oX_2mZ obxӸ(e@R 4 +E ?~'p5F.w\>No^1;?\߂8k؏?)XZ6"_K] n&䈼f0zӼ ֍nmCާ9*dHM &%: _AU)'4$wTP<%x| '<: PKT4 ZG8DEpiHI!_0*2|iF ~ s>ȑIzKP,F@~TtH" BH20Nq}m#{'XQa)6M\9&S!i{_a)xXoBY&Ȍתƃxa(Ʒ>0˞[pW,rU^` PrGO%NdiN=RDZ7=ȳe%'^;@,E=G*$U$"* l7R1R6r$DRt$r@T/db{ހK O##jiFaõХEWwo<(%PRMV(%R1[J!ו*ݺM*V8i^#;0 SkD$Ă6EHT\f{S !GNA#qQY`Wa6S픣y7}AV<QKeoKU=qM憣c7p $ Ai@jBd>70|'JQQ&75S?Fڵ(Q)W=P44!j$G֋@ NkȌե z>#A<˩?ZM(K@Zu w\"JTWt!X1wZ'~.=3TC < g<><|>^:K#Ke~6s6FD**Z:o,50-yQ t(]򅩿u$@7-)f{eA%et.Vr`G S59|A~֤+WdA,Nt$T z9vٵU͟Y_*Ui- p\$|B<4BqCA~j?OeڻkvGNV#'8'\$ƽZa{J`*MydmEU_#dOTsݯ*e&?N2H |(V"RΙ;GRN:CTbQ)WѴD}c:#6~~fWc gTx1<×S\LxȗZ9\|/SߤMV2O$X5Q_VTq qjB+@h <\8$I n JW}&[I"[H9Q(Q0rdtL\,ٛzJ x-QLoaB_ xFy17VHET-0ڒ0yڟZ FʢҥOH,JKӜ/νz($-Y ڞy1!ye7Nc?錛h_7ן1r4.Qy<r?+/fG #HxQKK xAircGDEB]{Ua{!|xC\`FUȴܡՖJdZaS?\:~%=fC f7qk4 xXG R":tH-9rՒVX|qU_*vScJN7 x\' x8{4ʅYِߠ}C$|_5gF珼z$ʽ+/- L3/{IO r /+) W@DT$P!G*`;NA Vƃ4GV;`~^zzpT"@Ve <6Aj2t:oxy&j r(hdtDEw%pYCŠ4lS <d/ !n9w&פ,\1cG"AV:A baB(HST~ڐ#rsp$@ta)mdc K%?=<\Az=L<>ӿYߍ`"kf!X />hY.A,JS !X1/i^A.emZ7VJD5 Z R<!zx0xLOBV>l O/|Yt"-ޛk97ޜfg- LS|uS6 h_~W G f^/O=BnVY# ~<B yփ<$#FP/@hU!!:`>ݩ"XU_s<%ѳXk/xU:cllY#izaXZ>@c ɃOfA&|wZʳFjamRu_S,~%jZa;T7 h4_72UA~P_$yJcYtI*)? iȖi~+'8À^d׊PcSr Dr<g_å)ѷ i&hIHϵr>{<ξ; x?\ e2̪4X4ăeBAo~V"FTxpA1E@)fH~LQg??xXHzvCnn"x|'9`_?K.!4nC-rz?yd!Y P* fu&,Y YH(X~,ՙHB<ǀáÃpGsMېWe: O<\$ԩS yv/xw;'NC iݹ)ɝ ,uv>jwA͆Ep XTaQg`D3fMMQKj! %ko̅mU0apCvaQN4K{}! ǁŵKB}ZS;}&Xqر<>; o }^ѵ1j ;< C ɿBGy D:)M,rK;E2SU䐆_ J?WeQGZ <Mxt+7Ǘy?x <]x|EquzBv= xp <gPa`t]h:NQ"AA[ > (.tGiDm) _-fj.PFuv8iz4Zg4-h8Xܘ)䐄G#m"W'j`TopxH<"xZ*G&bURr"Z'*Լ? qS9?vY]60*QVkdJdOGߍJm[P4*M$gBv@qHlz!5 Q>5>-yaW5ŭDXS%S$pHHqF$@f?ʱj**)ِ3e˖snsx|2qqqsI=!g)C/aU& B% ! %F(yOᙖ.cr9{Lx| _ <C;~-$cdGk )bE xҨH5Q_&Y)@K)M7e)O@67K RE,yB^B`I?ߥk"_E|LzǺ@m9haZEЫaL砿4YD 4mOCxZ.I;,ˈL&{ T}6a0I<)OPl8xm < FAnQY(, QZ'OC@H.=`Q>pE=`I^|8swyzH뿤!׭~@à 7Y .mߠ]]O |}% kKFp.8ݡL$KbI`ɻK<`Z`ՍAT}wO[.G  gYf̚bF 铀iHjd2L& <>?2쁑+DOxZf=C8;0)%D$B- )##; LQ`L_F|0s/`A!(<|u@˫w?XV߭ S'ZE=.LRS"ixTS4R'txSǘruP%Xֶx|cx|ޛno _555)H=1bQ-kWxLZCQyIwRbFE}!ry_(ߔ$Qi .ȃdXѷ|aQ]mn--Ǽ;*Q] Y?D?J$sEfM`~T8IH xgفGK. -n}꽠3e͏bS>(<Mxtc׮]d2ُx[+coϺ<clG6,'f]1 +ym8GLڝqSGI"`9Lw?Dȥ#v^"K"^(U.Q@%bkYFu{Km:(a̞g|'zegKOE&ojS<&2JԨ?aZ0xh˧,hؒ I8Xy槝;y6 x|7DSI=1gPl45<%b0;<|f#$?xb\)0 $hxZuS8 ԋ`,Ef$:dpq, |<1/<wI70 u̱1q|Tx yI- Ncz\SfYV.ۡ[$rqA]l1%v L~sf}/滂`K$?z?I?v='^7{pvyP+;< ЗcLp MI۔LGooI'.}<>?Cu>hkkM >+XѲ6; W?6q…]179Ѿ!<bm3#xL OPλ25-[La"9Ů21.oV.ƺDhT<>EF8T&ȓι`bVNz${?#-0ØoCq-1@ 4n`"`d&?s#:Jjڔsи* [#c1q^3h`T--+Jo{T]C r,gTWKqh`]7čJnE@/`wP% _w„)cd#BD4nMEd4-&xtttC,e@4 x?dH=QOc]sО-x ّ؍K,L[w/!hߋB?^ɻ1FKbՉ/?˞ fw`ޢvZ迨aTC^%b_w5?L!R0IkO<kS47Dymnr|9I{l.*ފ … kH=Qݚ?vܜ4 X ܭ50:O8R[txG)Q'Qyv[nEf*72Z'6?:N _ޥO?7J0ЃGÚ?x"ixo+ <:7Nz'xXbL&%xZ <> 9/;i,~&~N2uz}7ֶT <iMjhQiʊ7UH.P9}亁] x4=IXF$_Si`"KO? gV;bGXXlxx|c|Rǿ9_>DǏlc֬Y1 c L1 j6&~s NhZ>0MeI4&z|/I[K;Qv{5s{y/qF1c;8j`l/qSB从S"1xP!֘?6 Z@Jv/v^5*U/FDxXJ Qf`ՍwnTCG+&GSAhtyPI$ xtmF(4GˎN796`qK<᭄/9[47y|q-'kvc2nrC ѴC:&FQQYOCb=om. LW<[QvD{רԙ(v}q%!h/w"imY$Mxt@,yB&=HZ>D/^pyd\pa-ѴfCti ]{?e zQp~^97?AlR#f,sbo)ʦW|PQ/tFuN*A iyaFK?5ցN$-S7Hgcx<NjH$,o' <Mhڟd_[F%Mk]%b v˯z}S爼i*5* GSܳӿKchUN?D^ƵT|{¬SDhtyPw+ţH&bǫ%Iw/Jx<Ѵ ɴVxآimI-hZǤ~4Zpș/z^p]>\m EZ:]xI$o/e2h aW^MPemS>(zCXɀ\\)|C?43,|__]TNhqBF2VRy"imx|E-.wd .RZ Ѵ#MjRZ7-G22~L%RO\K i&iѴN͒.o  >"h>-QR)Q]@ b\0KU V3p`y!R20D1T/b!*~Qώ'؀?}䄖'x?m|51Kx _YNh4mss.RO\vc2LMAZ@.sbTLatKĽTY,0shqˢ[d"'vE^U_$uD}JE[u!eTC^'EҊ%؁/ymV,}{J,u떚A4hZ!+W6z/M tڢir0XKjQ/A&"X*RVXX: ʍRN>߮'ï L67=,=kYʒOyn1 wũb-2&|N󨲦u&-UtP'ӽ[7(M}SKZnHŽP⾏|8wY9TCN_^>86kA47 kQ<̅c*hU8QV$SG?Cvh;&|{j QͻUzTCxX# v1&ZZEquj?k Ø?"ia\:M{L&`h'>o͹ihDW|dcWAyhZ ޭ1E:Ϻ ؋RKa8X b؋K7 FZ?lyro@I>*@E$vNZY܋YJmv?K##joj W^~?{j#Or+8\KBX*a'S/χ _ltG[^rа%0tUE,𨮮%= g6o"cF,Jj]$֖ѣG!E2WA=&ڪ b 8BX[^l:C?$߭v2l!<z[[PO"z r`Wwc20jX]"h 1R*d;sps+ <+^!9E&z1ӄZE:&<1'{`qifqR#l3.zn\ZXEZ.)v%1٪,0[ KYi_F "_[Zv%O-xcG_:E"=tTtSw@=3,jL2,!RlLɍ2!_xx|KѴBI-sI-ŤȱCKI-ƥ)ƥ\Xg ^y:?|EgT'VZRW>|*^7þ_׋)Ow jo Ŀ7Pq)GRDŽحS$'s6CD~S!xM{'i 'vnvb\]D@?"6jFO 40B; ?-|dTxk[{{峷{Ů<=M |oQA!?έywjpI޹V@ Zl76$"HqZ~(q2֟Ѵ{xƥdZz$ԯ7.Z c=2.Y(80@S ^aQؚ}1Q)v~4t}UK8WB_^_FuNޒXϻ;)FT _Pj\)|{G_چ6!dXڲ#nXZ%Gd{ ZqHh h$LKgM{/f\sLaVROfII- Kg`z4"N)x.(&NĠ2}E{O$] .@+ݥb;Q$ 9|h&PIx/(/S!Rfݰİ=?saikD'?oΰwy9|CELE?VՓtArk_5xpP'gP1*|xAj%jX*hX3,?Xڡx]us-Ro%tuu!\xŸݱt]@ -x͜Fp,g"fXB\~{h);n]B2MwQ ,B,f`5PZ6^X/=2>ȅPVo xtttIh{FBW K=5. Ljr&buƥǸ@#Pf@wFI=KD.q?%yɴ`Ůmv0suiEB;dT;ǡ =TV#2TaSRhŋLhx8&|rcRKii2j?7cRkQƥ#N%jT$Q͗vyPn>E-fvU:q;FM <;3.xu2ڌ3NYhwRJ}8}{CN}TT*\3,ݜBaiAAK" -6oq)?Ѹn$\&*&&&ڼ-UZK]Vy`1YA`vbQXic>_M݊X_K&Չ}no=(v|tw줐?9=>|R(|4C?(':y}q^G? KmaiSsZ~.rHB˗aXꎏZ-"~m0zI=Uod\:q).oVEYbWbt'y o*ËA (w'&ָ*K}<ƥxc=i}+ -<~(|:w"ʽK+xLVT6;W(OpvA>-{;1,W-rٰT[GlO:z+ŧCq7n#Ztvծ&ȸ-!4FE1yE7)v./M ^zAMZ>TW.]OSTN7KQ$ fݿC̰h>: Xait K+**^%3,'%YWKc4I-6K,YOm+|zqiRGWKF~vIxiۍRviA5Q/vv=Q h'/T 2*k~?VQ0,wLgXږ1ɰUGNNNa|S7ǿ;IjCR]I-|ߘfbwA ָCȸa3.e cŁG>hӢXr8**CZh1D-}j`**صtEW1"k,bXBA2)R P\'S1ĀBX*N3,w4pgreP&Ft/yoK]Mjf\:44t<|n\zkT!RcAk>tVۂ֨H(RZ[=Oŕց^2^}x:VyTX~\Uk>NP|:SOص=MFu$0=\BkTDqSFBC; |_U+['ux,rRGOq: 2톥uQ1X)GMMMaxc:Ywx|I-ƥUUU$yfis$v'>Kx^iUMy\κ ~wpw*j`:aT8zI7̸!b:Xʧ(OQKsZTF LQppfzA4Ix K;'hFolX̸>GVVV4'5|xL2.Rx0EqS|֢ RЕ+PHpa H=KD\} 2[U_r\D_`J(/+w?CPGk9QkY;Ͱu'kXjt`0tiXꭄxxfCn+yUaN}>Ox Mp3(!NKJVa}U"9b?SFWI] ع8LJv˳`*π<-cy} AkVV `vMc'O~A?)?:=OQW'vJqEd$z꿤;m <~RwZ3.qw|`,"%gv/\#m؟f3P\Չ-e&Hr< ,_KLi0`ov&-`5ˤdj0ar~LG&{ 1a bbjSQ)Z+ℿ,FTݑJ.)1yQb?W!xc\Kxj֬Y1ätC-ǭ5xXj `&~yLirhrSE_W{+OQݳI>8JXnXZ<00L0L0,0a=d`ksyr>!@ww >$vH1"Jzr;w~Lx\ꆥx~Km>9E,(}<`h5Q_=K/} Q]t_W/xhJt;9 Y+`,j0w`X`2`0r>"dx:- >A?Fd?>}?lŒJ@/?nr/ awo!z===1,xLq2/'CGXXi\ FJ@lF1wT$R9ۥ}/H9*07IXlh|?Ai`J?o]TpKvx[!b`1)NOѿàvӿChqܹU< wHΰtG;|x`.7v &׷SlQ,` sGDtװ3XSNL&{^q K?q~S2Wwq,ԓo컉 Q_9YQ>F0f%'xx\&|qwgee(rKWZJ,0Yʂ 93͇aK E^W|R#To? sTIaPx>pG__9-[h^m̍hOj1;+Sf4ݓނ2BJ¨Qsʓ%)`T $YY[eRX Cy6O\ ${0X5Ы2a(O< &ebG2d<%M?p=D^W;8=7 ?oKg\Kb+QV#0 _ޒtf`>sѸ- uQ~;~ oHBƥx6oK]re Azj7ŠmX58$0 hOwy|Z*S:Wǔ LzR¸ʒWdK,n-Fȯ":0'G~Cy1kat.Z= nQHx00E^y:XQ'U5 aֿÊ/[bxe97 [RPQt(#xzLgxGۤbX/;Mgz2cƍKH)P! д68Xm|<;z<06pob$,v\VwC8?C'WI풔־;løg)2 ^Cy/ M扎1h!Ȑ0<^?Yzc1L'x1Zg ;3є^0F*V\$ϰTȿN Kg1Rw|<;jH,C-h\Q-\<-;֢u6y LQ\Jb%/vo2_zD^wKتzR$;ߏLXy CnkI_$|TCP} ;%;t\.b?0kY&hc|qltGL4nMBGQaXƇ-},;gX];f9gW;|!<}<~"~nDr|+/ Ѹ-k#nk|k%&R(οƥE`‚OJQe`=wc)QpLvB~FXv/3ډP?.>;i\ Kaz >xJoPQ9H >NSًKhT :f!,t<q}EtZg;~︛<${e2>{ M04zc47v=oaxxt<#,%%Z?' FEFW _m\0Fu4{c!;Y{=l).Xq(aɏ&ӃJ _6SF50+8x$HGwG%CQa0"D<2o{;pE7; CCCWH{[vS4nnEsn<ڶĢks nFFF066Nǎ0X '_<CRehjۊLr 'ص=ua8Wh#/Sb(Kzpu2j%R8ZǶH4m| q.m.]oAa>cxwp>+W|׈G8L@mA__䱖R`䀇0ayE*R} jTHNROY\KF9h\>+~p,ow2o?8@axxnb!ߖhhޑOՅ> attMkX}A 0&R41x<4yQja nTj!(o!p)xz;tgA;NW.GLdA5*%}ac("Qh|yD5OR'A5 p,G04ozfnGn~Uy`֬Yu;@g>+c$_{<Oى^X(+x~  0oEBbgJQD!2!4CuN,zv\]aNB$vF=vIA5Tg,!;偁)ųkZY,% ѩZCD 4|tww]ttt 5@xĉ$6Wa}d_tǃ?cnd}'ۉnaqƍFtf$)*NHok)J(xX83b4 RyVȞPUOtbKbkSu\.OT2lɳ۽ `L앉OcL}qӍ(S\Lq "B]׷.|X`Q r1LOYqbT1\T煡oG:E9h}w.S CC}w4_51X=񴿒duV$ZF8% ibE$E)KoY\XՙaVM^ ݲ,\#҂VЫXeW`l>u(aUc4:E 1qwK49`4)j=J\؃"fgVR/N4>/uZ kBX\'`|ЩaL# 0Ta,D(7oެh?p^ ]>?x(7H/nPo%ǡyGXKF3倇 FRXKYTC>0̞L\SEKD9Vubo *U bviü9A_,TK#FUYlk]eԨ-6Q5-fG>Ԩ!7cW;qz~fSZίwɄW.K"c1 kCbYFJ1.:Rn%JII+< w*:/nxGѓ|tvvvg6ƢiG4xo%\6a-CR ̚veڿffžQX*aqWE5{wr.n_ʣۻي/[ ChxXcRz ֡&J _xC<%eԨnF #g"|^Fnwyh\(I,s8ԟ[{w GXX`r} P#],p:βE,6,իѵIww h;pǃOxSN}@KƢvsXˈ2c ZPR9e"L 0v_P{h9L]&|b`yYZNag1]=K;:<&(`,KXK0' F߇kDfsTy}J+Aؓ \Y\1P1 _S02&OHaquë&>8N88Gtx|~>c-6>֒KԹulv>֢̀0ic-AjT$:Ά*y`FZ֎âLFWӬy`TԨO,S~JtOty'X=jT<0*b6 /O6SrS#SjTJSB-"HZw!q1襂 ^nxӍT,hQԴ,]I/K,g oxO{mE6&c-#t3g<yLȀI8X9==}a9 8;0Rႁ]Fu/ТՅqYVFCC* C[qE"Dq3( =h-|/xAJ=~{21QFIr4{ 0z86X/,dFL;΢k:AtM2::Zg!n8Z!YOX=O?k*ӡ+I~JQ3a0TRSXa"eJׇs2/v=IjR@E0ǻjTEpv3tsj`*;)i 0>(|[J|@/Pm;P'-#nE mq ,?'p1Ͽ;q!!=xiOjժ%e.cbX(LqBFu:$i5zs|Lk`~ueZ`eН'o%&ec-rjTUqCFO/Quh bQ? L|\\Q'<´lUKBq8EL;Q|7b>/psRwiR :ւfЗF|=uXX`),j  =怩HuèZpr&0% WnQ{8WW69P43@e:0P 7ga0&/q+~5L,]{g|| U罞~ؿWSYt_HK(qׂ C2d cOk '4ۥ`Subp?]N!Ԩ7hP_Vy$p@~4Pq7bݵx8XI4lwY*<PތL&L&{(??)m?4֢Ȁ<x x0qv!u:1_vڇk9*Rc.z 3;;m@ups/zC7YhfxauZ[bהTLi!Ljr2 i5 61ZX,0Lt( RWc\* xqQBch}ԙC|H '(46ⰻh'GN T@!jq8*HYnz+D fyo,ފu!)x{x 'ZJR0uyc-0 Xb(v gC_< ˏ0WB_<==]b80|0il6h4Bcll ###D1vzT$XU)CA 4āEWeț?5* :Qt $| jEV{nX{?"鈋 ˁV1 X,v1>>VazA%>lHF,zUAoT:PHn g00Ş)jTHQ.8ȫzw|'my:cY +21^b,իF߁A qq䍳8jѺO/2iZ~ċ}[f_ n5֢WgToQDqc$A vGX 40#-!U:s҈|=4lƥlcYi~ ;D!1 -'06* u2"(2Ch' "oiv<SB+D@/'>Rrp/Rغg_j#q8U|<E7vw+C_] 8&l;7SڝqWh2)1y/:< ~~4nmNZlà̜(OU|<`xW-tw]1^( fsM k:eIXقA i(ݗ#=)(ep?D Ի0]K;Rk7 )eEqƥ$X`JKۨZ%ffP?μ-|6 Wj1Uh@-ǵ"k +?lbڎ'H\uwXa*aG΁QHqnu ;RgC\ ,bq_ 8@~]&ŝX,qeGQ) uyiNv()c-.:fy<,Xٶ6һ<=;tviZ32 8" 7ڎc]n6Z"Pd;}?Z Cz/q2Y mKҼFO/RX EqƥvNQ>j)qQ8/'`cQi LAJy=u2VvL$:2}wcäH<I,vwtlͳѸ1ԭ}իe-o8Yra%$h]diZk:Nz\$j7T4HG[~&[ /ĨrtW/AfM&̚ X*aѤL`nUˢfVI0(1H~`|>L;2r1wD°3 Ƽ(`)[y)?J`ƙuVzؿ2LQ,Zz x _Ca4Zy&à̂"u60l] G P֒puIQ?/l"|*#:-wn:=mnT032fMLLKS1^]A"F03}л-][bж1 "qsu8j?=8uY>/;>+exY<o9kٻw[_hCޘ-)ּLtf$}e9T,ĈrTS-Acy̕TfZkeT" ]em;}qh%ށ% Wc_-zkA߀/MUT-cZ>&a$]x(GҖ@-Ey8 7-|T;R 4@-G{\{l''ǺnN~>dLbT٪2 +3`T c KxnEXtnF(ZUa^1#/=j<g 8Zoxxu|aqk\=j6%vs yG:m]9C[c,K#a(I&*HSB40U`2ց:s1varz$ٙK?\>z ۩1bW2 IMf< {Be <e9v[5~_d^svyalTMdDJ\Q#Pm|Y CX5iUݡʀ4H@uw `Gזskjғ>΢u2:d?k0}"HES 4 8@ ?j֓<؛zq˿r%x Б"GZGy hc!_ہ\TK;ziZ0UxSRqZgSZoga;āY3+hAҤqhuhX梣|Y9"<g\rXKEE~Z.Zc-SRveTJ"/,X*3`LS2 V`E2 D 0 >CoBBc^L1~֋[t\q{ h;vm_0噾/+24-D]3AMKɹ S̉QOA*⦚{',|z#p`:g9)O O S"Le*qڃB#;rq%]4nLaaOU:,i8KE2eJG 'tlbYװ,7V́"uGYYkӌq?0=o}[e6GHgNkᛗ`t%,a4FXAXo vz&x0b|r_CaX,Z` %Z>.m 4Ůaj`t{ҡ&AaVf\2[8IJ T_ub^b`>$~~4C=v[ Ԗ.;s` F?/QԬa] 52tw,w9B^kijjMsl 7&Zq*`NJ#c-ƲHY/z0"ۡH }XAAh4l6O@=} 8W0d慩G2Ho$RFz;<ʢā"zG:/:ShER4OPU45B /[ vEpa0P=/~|ȋTםL2+UX C1V> D?? =&Jm,+`7oTqucEÛc-_rs'ܗH>ToLBѲ3UaLj#b¼T ϼ l3ӧo7z t0 C0qař'Od (!0uPI̽|z 0*`*-<wJE? LadTCΨtCx hP/f8X?ӎJ- vR8Haѷ3 ]m7+[9́ycÆ 9ąqq|Ad+n;Κ5􋯹YnNATXKgn8v?/ Å,YE$YKUFKUdt^=N8 L&h qy+c*verpUZ ev9t0σx6,sDS6y7(Gh|MZܨ)qǀ\@7Wb`U" mV" &yݬTW"8Kvs%|Rٙ;UNfg?8;,qpy0esϱWEވi4,FvwLoV:el4nx Ep{ꈯ7._d,8 9c-?pkygMYϘ[)]nnx ͛'<7/Eke_KŌJGK`O3e1-HwDJˣ(5:j`` x,.xy|\@OQ: <`F.Uh_JJ8{@z5RQ8:"(t3Lmnw?,:h Q(81Y8 v#hKB 2!8ˏgf:BX1mP9< ~;<<|qRW=uкeSR}yE*n^k봻C Xi_ŀdIwyx {0_nÕ,=;>FFFV U`,q gCCCWqg*g!wc-d裏I<~QqԮy\y˃o^*U͏ LwF$Cjd8j~QyիFG5/9*"`Q&ż11R@}wG lwy&wym7C$-`yЃqM۫|.z0F?Y1>FLt]ν Fz[C Y?(ico _mRfx\%J0-'t_NÑ9?ߤĬԢLE1ɬTĬuͬ'k :vg=/4eZWk!ײc3/mkkfXtZyE:VZq[2؞L1bhG[L\c-pxǁiBRK_zjA?FFF066^V Q^ \Z]>nJ'&|6k>XZ?؊aMj9tG,:fW{R27++7+uwYC-{x,HYcXmc-۶m{I pNּaNK6R<(.7]B,çI&@RCc-EѾiZH \4.+{8gFGGa2`X&Śة7"lk)%qzEڰ,8.Vgjg&Cխ`v?B/t¿ 2hcjYv#h-LDaÆx,?獳CYkd2c-?̚5wzs%RyY":gBfڲ :Ndն6Ԅmn4/%Ϩ4wo_=K KsZ #ˁ [zaط =K1ZZEoC3еQ$`@ aāǤ:|}|+bBi9z;¥-֍2/Skg G_,up̞'~vOW Tm_ *V%dVD;J#+hq"0fgiƋ]˚_k\|yL&8˽.|Yd8ZXZɉ`!";^0?͏utra*HQJXaG((u40UcC $Cwv%p})Zr6aܿ{b$ [ѽ) ݹI@olErǠl?ɇY㼻C[CK"b"ƧQ򄯩O R5H(X;u0@5`*hΑD^PͯLf`UâGB_Žj0}6ܹh:MGGQa$I8g"g}tc-q7kuy<(~w2ڍOhЖaGػ<,0^wICE"'`4i&f7G@0EO<ohDW~t`9U`d[gs:7rz J~AGлQ x #yaqfX2fd|i2R;9U*P"aGLЖLh;75yZgV8J=g IX˿uy򰍵ǵJ&f߾}@smeO3/mZb(XIl1xLxnжpm G0tV|}XM.JAGП(v>ǡ+ٰ́lup=`h&y1FY"<y8b sa= [<VY<@0̀^O[:X#YϿG*h{w "0/e#jYaKl"/ѧR;' xڨNdU2 cHXK0ˣ }0گ,.IEGзg|8K8𰯊hϺ>K+οP1LI,rT{`yØw1q֏o+|<ξ-2p%;ifyq^wpѷsoVڼ#QFCCgy{囕q kS`o^w}w.ѫ yMu+/6o¼Tˍ8vyX˹.U];>^IhHy|DxFuvO,`ȋnDGּcr;apk89ƥާ =.CxG0^7CEm~XCȬ3+zwgqݶB,p 1*M<찯2GuK+TQt^|})yÅXY:d7E.jCCj*"'Eں;FѮyV(<<Rqc9c-|8>(~[WWBܥ~iRD-QEԚ伈ZE8k4.gq ݢO6 G@KK٫G^ !W80EÕ.tXLJ)6j]'.Wc}g"1*uf`G{a) 2V  e-zq//[t ~iuw\p-Yw?uwtW"3+}"f3g<x|ߘ~Aļ+"]w 3/Ͳe?e껉Un@GDͼT˃)ԉn3ҁ80c醐p"KiT'oߒ)x59sjG0?m7zL?&ڷ<<)#o=SFnߓ\ UһQ >6%bG|>Z w$>@Q""{DO0O_\NiT긔N:mTTY|jwA>1Z,c}vСxm[e2* `lN@?&hF]y)~UOQ2'fĀZ"pgt.' еMZi/Z'#yΚں;W?ݒ=]ozhVJ]bc-BwKļי HMqs.[D."P% <$qAMK&<Q ][A? 4 =GB]b-X?΢Œe }gҡSۣa/U š+ywc` ^U`# 1.|>+Oi8nf2Z֝" ǖvM^VUE0q^wp͏60Hĸݜ`VzYyfwLcV8G]Ӎغ<#`^j]ggI)\ۻ.:k5oS>6*`w! 0TX;<4!xkHIË+f$wwS`eiD;t'WKm;EYYiǵ= ~{ȑK"t]ú7ntäac LMҢ^JI!bMKcaTvθ5~:?)zmK ZCw5ڊeG2RеI&v.E{UՀ˽20{Bبԉicj1.lR(3Kt'x\*75?F\ǺUk̺;7k4.:dppϲQRo~ҟ"jo}K2lh8Z3pb`4=% ;3[}HZC>ͯvx'B+^c@xhs#0ӷCFuorˤW^9pz4`Տ?0{]4&MT(?ڝٚ0նQ]a}K *(Ҩtut؍JsՔ]i"-F6[PT0M0)fݱX%Q\t)!g3Y)5/uf^jf r9W?/uy0p) g_c zw;t.uwԬy.MMMyQBftwP0/o,p.]KQuyـYcEƕ)]܀с 8Z,HKh*(lT'vIU@b z n Gߖpto CyF\Z6`R)! В?Kg;17gZa<tvc(Y떿#x&~F@?ߣU\ 8 ˅VρGy7ގ>{QtWI'xY)?v&fbf^~nz}$SbCO OmDK;{u:K30\XL TV>Ŷw-+cgT5`<TCBW pm`ͭ9rTS -QNjI-~ovp0OfRwx'E{Q+5+/y)˃Qۓ'Oowyydj^1=ݝNCȓص^"ШBØBnGѴ%ahh&iJ*%)w*Ցy&}aA߻}2:Cw5tje[fX t} :r[hϱ>FWACX|S찷D'w].w"''?v-?v _Lru4;bߥNbh" K%S?~3fV#(;pլxD͵X,ZityOIlqr` jn1f ð>&=Щ20Zxš #gSc.wxl׏hooG[[Z[[Ѫ3LZ=%Ђ[['-7G;,p:F,)C_C)]A ;s_ovgŀ1A<A?_T->x~!\w0idݱ$QfC=4Q!j^nDyc`DmMM\J]իvc$xmZV0 # =a> /OVx ǡ0e-MD&vW:q 0&&q| [pm G_G3zzzݍ =ielAsn}@hVˎebfF_21:ƕaȂI`A;"*;}9h`*6QUQ5/.`o\Z8<%@tcqe6@ ~'TMyc%.uwT~XR~i4QBfFRRw;Dں<~0A$p.ݑ?0 dc ̙a$ìN" ze" )`Iå 044c{;Zy~|?E՞7lpp:@!谍@" ,C ;g|וo6gl'$iN8NbYHQIERͪV&q67mY]^@HRdrg{$@t``̠m{>fW&`~9y7ޏ7G_m N~R嫘u^zm@H䕙A#k4 3N,i׏eZVjQi9gTsl;1iczzzL&{č_ٌ%#ZUAAbff o<*RY%cWM} mGGy= o`ddcccFqQyX,XtSy<Tbx,]PPokT^Qap~&.Mgќp;Kq2@@#xx>T]h4`0@C17М~pӧөSq*fXN >pj΂z-Et.pIJxj(30M܃ׇAb||.*KMǁU=\fCWbSy2bC9Aw0" cY8uG IJQ[ Cw^+ ]#KdCf_.50S1sܞ|CHxQkAW.'X:HkJ KI E L|o93M"Zn|D+AfY XyvfV#3π=7=am05Lvè!$ᇤq2_oꞌ}׊S7?Rv/UaCI1SwĨ;Z_ʬ9}uWPwh p@WL111TԘ6tvv M̢5t azA- 踰~0 u$$W"zj\"RpדZRy[+ 0Zwꎶ# @Khw9;F:;(Q/"m-ު<>p?dNOO E355&æXχ݉BMWScʃf[[\KT}yKaxP?q.!RWn{6GpxsIQZ\<83|2KE&(1  ءw%n]{{T%Kt3E9|iPu~\:a֮0,Uk]G@WVa!GB&Z뿨Q]VdQbQMQfWwpch'/vQwt;LUw{~[Dqù;ȈZ|}B*%ݦB_o_??SqPC[oSyKa.<8Pq+4xŰ֤Rʕ0W@W*Nx2 $c|ʳAԄV֗ŠP S1~:S9`:K~"KA,e|ɢdՌaI7\P6Fe:O~P3kDX R KZX'UZKl&$r1he/1~Mx);~y@5UjO+0.|"La<Ǥ~X[5ä Lb,*4WuXޭˀ^ACׁK@+ọCXAW,NePƳ%9gBt/1>w.n_8q.u}"G1+8*IQh*tN/E[K0]MQ谔,d `*^S :`Гѻ A!_#Vq0m~ \|J{I0*Q\ѡ~n5?w(<r嫩,ƲVݑMQ< 1q~ `" ^O|CR:-QwQDyN*o8s1xb.FO=3073BwUw0Fdt轲;p+v嫄'M.MgNd5{ˇ]K_nY2X0dڤp2G 0]>|J 5W ս_GǞBC[E©;LNc윫ƻ2I'OPw|I;((TyST;,q{Uy|(ء_8:ǟ@68O-wPy*tm,Vw(2 T|ut;.=3V'!Z{}W6n.4Ak]=j+&iPC˰ɻ̨n]=-P o=#\ Y;emqM1SwZ໒jSSSw@p<~ ~TTT_JGh~~.Od]-yy'8<%ZFAUʱeLe8^B1 t/-uhe<;s1s~>OTl`{轴c ۢ[Qxyᇼ~nUêL0=V^UZF_=>T;܂ AL6EgV5>L ?hs GQ/? 3q)WHN_$|FP_ĎuTwlm]1=h~~.rbU fD*<>bL\ʣI1UgSyTxxıcjYQġ30jm[ I9E;­,CWs.^K,EIĨ4vڨv0m~??KK7˗Rڜet# yL䀎 нdC_Ѓ(s7XT[{o!߻\*tLz$J5EvRNSw0υE/%uǬ ; uQSN*y())9(cpa41y vTyLۼ<U|S2A!2p> yK14Cib7ek{|`+6"l-Y꿺 хxvЅK!73ShFS(VoU$zgCJay- $k[ 590Tq"_|T' hG[}aRy 2KO3*)fZYꎁӌ󘽕e3*]O~Uw u WyǿAdF Z0%cӘZk'ER]Z[S[p~f-9 +6EO`d@-#FaSydW{uOJ"I*%d`\TaT~_iX\zUǵHx$:Gp~X#+Y3 >Խ\C;fTCzd>(tARwx3;b\SyY`#6GQc"~L-U8Hz`kGoR o53BhyE;fSvv[Y80* "`vx+WƁ|6P&zeĨ.)ORS {`o6y :[0mwR{~0/~߫@3;;&B|u}Y̘z4*]Tyk`(1^%F y F40W63} w-,0TBDadN52k15Rs4p3l"lTj,Kp0*f LrGN$56*T<ޖB:-/x?V_8VV8yp&K1zq |'\{o s|C ;&ôæVQi:Ry\SQ4W ?t'uZYFL1OmL0dVwVŽAmqv+4y| VnQ u3*-eގmya.zWI ƪ;~Sw<uEǿJ&dnf4??/z?P0QBW9y8B:7g@aDa:_DǼ&ö锸ySlcH?P5ucT: s]`ݾK/):Aoai<Ȍ%ڰa|<?6^6H$EDd hpݨw mZhDgorW^;"Ry7^2"ʽcj,S30SGq"4c:o&iz Ca}-j\[;nv t `T Ĩ4R Lb r7v 64tc`WZ`s!lj30-6qLE.Ŷ0#8=&z sjx'+ ԷϣB ?Ì;^&.r:TVeF/]2 .MqNi]x]^_jƀOd䬾, mB"mkCw2fhSp1 ׳BV=ꝌJ'x,焣Q;9;;ʃ=5k֤PeL)_ᯁ)3Ҧ*V8 ̜6z8=C^h>Zʌ& lgvL`7Ĩ4*KM WB0׾U@xVJPke9"d+ zR bf:[ao c֒RW>~ BSlTyf+E׭[v(u *TQGKKBJ8˘Z LK LEkG"ۛ/a=Z\/=K1YCW5f>2tͫupCW`=+;|@'ڈ#\5eX},?Д&}'ϿrQA4(ufZחj'T!ҡfzթ}VdPAϊ<{BPF%FVoJ9uq]Iՙ;;paQy$&&&ZV|wS;pQx20*d@L=Z\6q:㍿q,rޜxs::^Ϊ~ vggWHt3X]W P(Qi@Sj8f& `#4A*cf'=ݨwX7(H~j! N/bT:|nTʩ;/VUp87ꎯ1;bxD>8/ŨFUh9S}6}0X#0VoLetsa΁:X99Al] o]lXaVdTZ+-LK`8E-pj _sЗ3>i輙^LMMl6s3O`nGTtNC4IG_^:έU_ e`85)[myY0TfXm=\ TOL;EJ_m,f,I__Qaa2`0@ׁ6 E`{d5y 0K|",,Ŧz/ tԃ%/HM^%,ZtAT:P5+kr`a\9́Z1V#0X}}6VxZêTm}YuN/IAQyxTy|EL/X,RZcETHG@Z fcxKcb#4h 0VT sM,%˗^RBTt6a7YmhII#`b=("@AAW7Q _ Ak2%m|s&gџ]@: ;2Q4B;NŊ;l^"rV K|&9Z qq`< ޹;V+RCAw.=nj0SU xth_{h/X#f;lếE˪;;NkSwLmh]{n fIFynZRիDA"Tߗd|3yLuIia>Fӱ4HCǙD_~1Zce1Yhrb[[jr`ɁE*T& p xh<v#ukGu6U0)¨X CZYVdAS5*DI&Vw0<bdG~lҺ.T\kK@k 򰷶j80x~Qq)uR:$Z-fffh/f@2R6Mr9!94avu* & t Uwĉ8ʵq.\\><{neh!\\+<)a>'l Zâ^ }f>ljA1\?|Rݞ?+l;xT~,V~^+ P7Krg?f?`b_'''= Ka:סe̵ z< AI ժ_reL&o x,DA"TsDTfI<RyyR'nshmq00e[[8~W|MӧkܡzYXVXVX,f05y~p665eop|%# 6{b`,O&G>GӀ@n] ";|;VmE/P N@U&^mb}kϾ pꎫar {l~+@ZsleuJru>᣺?;EsPw? *P<˩<xaTR]y.-|Ӊ PWm!UyX9qR볬([DC AaX:{pAЂu솟[/'"PΨT,WG~Ⴂ=T¨T,}ۡ|Lei:zݯX kiH |_o7*e] WCԊ,,ցRw|7ꎯuhPy|ɓի&{MR*©oPG;|G/xYb2m?*+[ O<|2SW?[[#0mTt >h ߧFw/fWݶ0C^<uS6us+K44K~}Jnw/YA;c*~&K/~4gΜf-_Z[:d8ɷbn4@w <ᱵvh|Bu8}X?G prbTJ L ;Pw RQB+Y,%L h;ih?]gYG:)„jCsဏ-A+04\%gSt3RwwިTtL[IA7*ŠkR&V(fT'SzU#eF 'ȍ?cf3)НKhLN{?JIAk6a"ʢp1ڇ1S,Z,tDiƨT&(QjU&C0o 1_浲;"$Z[ϵtvv^j``ڝރq^L[[.bvZWȈ۸ٷUouGE,`O,G^b`QݎY^Hie15U> C_ WyDavs /,`vU{1\m,CA[[}^+ Qwz <bߏ-\?GqZwaH=|jmCv{މˆ?F]4p,yְSHWgDAt]w1ןÎ30;vIsMUC[Ma.G}?${ wOZheWH )v_ ֢d:aWR%Fw=Ψch$Uϲ<g` !W_}E-lʬGIpzv`r`Lck uMfkm~h7knzo6S?".@c! OèOxEOb`=phe)_KO‘yt_L>!?4IߵoVVvoeaSEr" '3@1*o J??3*Rw3Qw}Pyx31qgjNɵ޹Yh/ڊ'[@[[8?Nqa{wVså 6+S ڨ4)`ÖUi<,zKvoMb`Q.EBFŴO R˅ UU V_je1\nef`Got>h>MuUF|1V}u/ch=;DA*UqӘx*e2ُ=S'@ktoCwٷ4p1c ؽt҂ᧁ.I&@S,]$|1蚵?^,&\TlLmx L5 K$U}/CGP$˺M"Ek+ ߷S+KwvtoCk ]$?$xx}M` /G$BWUbcjd?h^ nE[t<9Nd`Q :BhTJ LkT*n`"o׬v8b[iHJE LGc| tWIn$܆~ fp10|60M!0q s);VoO,%O` 2${zz.Zo0*%Ry'T"cj70MMM]fZ%ڵ%KkppkkkèZiS\/< XEFSTcch10M!`C,Kg;֋ɔ ٱ"` 7 uUyHGZRmBg=^+ xx~+KKft"5oSJ-bT)V!u?uHPy| LԾg֖ZK-W;4Ȭ/VAS7*.(_ 4*Xݴ};,E[Z׏C5u,~|R|{[|jm1]=C­-pLJgy\Ȁ]PJ]G#\+ խ P* Pfr'h˖<"/Vت O ^oA+bzHr~3toIRuȑ"FތR ]M1ʒ͞Mb`jOyRa7p4kkg!e$fT=t#w %Oax㯁hN+ b/\,ZVV$xWWWRou50G!4o`5G-˴䐧ՌhcLՉ5j8hlgIO+@%atEk&jF@VgFδŤQk@(Zuy6h N !'  2Vr?IЀǕ"F4oqO#hVob/h*V52ܹsүd{dRRy;V|PymjZ[8?~kl6bؠ>\{,5ǰiEv8^-rw;Sw\~$Swf#v ݁3/Rwf!vVf*n};fx楳jkHة ?u0vGvoCk\jNke Qi0A"(-SUGd2OHRXn3*QnJZ1_deP_aIB-qqqeRCw[[[l~WIhZz L&fP]‹CUUD)*"xDJ Aʇ{+Ӣt}d>5_e| ek`xInk SRCx|U@Ӡ?wvGn_'a6'xV;W4*,[YZa`Nz20OnspULOOC@B1èu !$R1i"-zaGyRۘ5C{p˷{G).=KۂQ'9y|.z%VEP_y0ݹLn$f9ͷ8wa1j2oG_N1r$^^g[Yhe_fjw;HD]^~5yЩiii-ˌ$ZftDk^imFWWz{{100`-נpKa|+-<vRn4Qi4\]jd\u"2ֆn~`L!.nⶀwLd2Fn$+~y?A8`g6a .,j/|;vʢNIIYƪ;,w :ÎieCJIHoB``ʵ30uimihhdzw---hooGWW֖!L\5A#=Clk!uQ蘶$bT\ &+rf0輸MFu R1*70e`;JV# S#4FUWg AӴt0L0\|;hDdK~릕%Fd - I pcʽPt~h.!~WRm$2C›=J-H0`)EUic?hz{QdHبtawڿcZI%i>TRw.A6:*;Xa|;LJ};4m yˋVQߑVb`*)/[[㵶|%?d?\aZgZdGOw#{0ڋ}P_8ŃUjmeɒܘB:#؋[Dzî* )D]a9~{K# ;HK+ 6aa^p# Zu֥wZYheŨQ)h50"-x=ihii;wv0- = E<ʑ".JB@է~L俉_v;zGÞY8Nn$ڛ4H'aPmêWb0,F#t:Z-f;ߎ=)dgCCgAB2b-.E7-㷶 !bc6ڊftT=e;/߅=w~|A]J# S(2*Ma˪?tw [}Ͽ pqk./lu ;8!dXI%ORSy ?Qw䀾(At|;S f͈dk>|G!F$Xk˗=$&&&[,IɾjrU[$zw`zp~b&ta!Pks"C~%KAW,>QtboFx},Ͽ $oT*6VԝaDI&͜DPZɼyA4.a1)U 4u<;j5o{ߎ%uiX٩,zhe,PwVQi`>:|˹) F^;h/fG (vazT{1YǶ\:C0^= S!X0àUv#ڍY⺈J2@R2QL>< t¨LTVe%H[.UFsep@tudR SZkgA]%0Mn$>Nbfvr˶d Zkީ{le㦕;HS^k->#KFd)nA!M5>ͨ<U 6Uyl`$}ծ͞50T!nQL bwVGawݢ\ f͜DP:<% `. W*Iagξ,rA_avw4Q g=;lNVXS]a?b^+<;HZ[^z]R-FZm[[[&ja~4@w "ЃЫ6D*+7{ۦXy,IQ;lޚuG-_y\^5+m&7sA:Ԍc<#\@aȁ6.x mm(t>-h- GR^Աc9S!S_Z[~$~$rEz؆؉n W?1>L\<C0\9 07< ˵YCZ 6moQr#Թ*sBɠ"'+vX8@ Z.dRVzcW SHkTz`ld~@er=5`^cU6k1S5+m֑94ϛ)XcBKZTytI369_; ˵anxƫarڏV155exSފ*ݎmhߌw^|A)#?ZYJ?);Hdk'7-w km| F%4twnd~/̥CгskӠue xu051ٳY929`+B ДUKMme@+}~|",DA"& Lgr/[2!~k[ouRnw٠GONЃb֫`Q:@J1٫@+Wx@ʤ+ 2¯h { #_t_]M`ƒ\PW9ÕCvq &oq]]h II[9<ăwHie!imqjmOv <,뮻}Wʅ0܌-h+܊N?~TӠ.ng+-!Ȏ͞ITѷ#9va^mME|~USy~K./nq --$ < !!¹BRi,4 ;:xX/lgMJ};tAs cƟZYގw`+ CKz=gΜ,|SV$$'''I)U21R4dC*7|Z4LCdzqA /?{Q><RmfLUcĴDF5P$Gs-uA5`v?.;с64~k%,dJJ2VoH+ /nmǏd2ُ %MiyV|y7,`Q8Ln *P!}8 LDa7[|1|[xkBo`;<.p츰!qm?,uMKMo9zXMKCUm9 eaI,|'[?BKK ZZZ`4Z[n]ŽGZY3^ ie!A+r_㵶8quu~͸SUσ=Tc< )l3"m;sϗ6]h X0OaRm[1܋0؍ފ*ݎ֏Ass3ZכJzA˵|Mv|1V *oZ[f3㫬\2Q2짽W^Ԧޫhb*6|q'̪MnyXU8+bTYY<ST$qLap ^מ$ϽØ5A4*N;Ѱ.CI%tOEbgoȁ5ෙ6|qYΤ voCW111!Uv{7Lx?,ި;Qw -Om"Mg?oۋz}ԋH90LU8"FSP",wieKF !Qxj}E]hZ =.QC'ҰVR xDžW-w1 .6혩+Cn$umc YR^.>mnfa(KN",P?mF d'o4k/;^ÎS[imڲX,;vdvxA0vAx/<}gR/SVx5z\}M[ABQrT<@پZ6{XKs0*I`,j F2y$K30y.RG?@ Y6=eήNDɷK[LPJ۲%,$HoPy|ҩśQ~mmmUP n z'[B6ـTx)Qid~حu|a5 Ls@&2|x).t.fc\uI,"_ F#Pd? ;(I+@ϛ2Uvr,*\&MOvxRw-ie!A"-~y}'&&>8z\]u. 5Ud.я7|?(j# a`=d=kmƥPd.m֑[:BjoIO2 a]u.y ;Z `¯b]MOO7}|;oie!A"[[f32Z~YYYieZ ʂ>!nu =/A]ȅ o74JI+K:݇{Fk8{k}0*FF &\܃ݘTH%7u cM#iPI2k=\;ax}ՇASh\j '!g6#hI+ ϨZ!?oٳg|uL:tﲍ.ہ>q ՛]v+[ utgQZGEs hew^g_xLvaj;fn:w׈Or6#tjP`vNC[EaG|'vve 5//Ϸ|;Z$b?snZ[<d?}wECh^ zp[m[G.hr7UysM6`-ۨ@ve0NxL^%G-X 6>~VvTBWvȍo=v2v !o<;?M66(K1|3Uäj ,6AK"[g:26`lUL vPU# ;,0;fr1hߌWbY,Wv|%?};H+ QeP8y|񓼼4M[jp mE[s΁&Fe&!2pDi# F8@퓔0𸰖<<*jиxVeҐ[; Obm'aTfP }MtTȅ~NVltӅh iӧoǗo ‡έ-y8-4?}7NFˁdjovW+=U;ar5z2D1+xRf* X"p`gT xm>ۡIn$ G:=cgY<|$;t)12Ӫ?~%3WD:zW&? I`y|K?odUoxY6*7@؀@*FULXraUn# TA׮8מTfRS:PfL0TV?. vʕir) `iF Jșe-]KG&.UIɛ=vXxl _2>å$kEWo`A2Fa$W@_ɨ;SwXIvHi6_vlAoaД%jϵkvbRo};H+ mmu555UF/؆Kw|z'# G5XTbϿt{^\r5K1cimS֓R'1R>jޠRtz aUwhu4Y|$a]qn vAw~&JaGAPSԬ?Tf7)`/& $"?LL9?u] 5T=VwNH<&ءGjzеvTt1PCr"BNq+<(<} v9t]Pi-3u1U'`b_%yn* 1\Ĩ;˘v}JISIzae)δÎ8 wέEkt˟e6Du]w=. I?(7?<11}hhyn1ڞ_ =Jz=̵Z@oa2[5^`v⟿;Lu/'!QB|mӠjObtFN.An$hSf\;*;D J9qn h;ieEͺh4ܛF|;H?oc~LL9=0=*~jժFq,jـ#%JE1yKIkKSn pƛԥAWRA L<8ҙ:Sq>GՓUw';r,* Y 8 |vT<Λ7)oMJ7ķ@kﰅ31ɳ>i}c~ ǖŸ(zQH힃Q_" <^LWðy5re'2/Un6/3 *~P(~衛BDZedK=uzg6hy]t-Qyèv0Š˒]/ / b@+=VZqe/ ˠ;cb] }{#ߓp}5'cU!vStg`OEӲ~)~*s™> 7)u+ ,$HD(ǧy~ޘ~K&0孷ʋlьKɮ#/YLVyq LW@^_!l L#`RfUЫ$cF}_34pnX T*[Oy7?jX;,%~Ž\w23Uk ;&b2MJ}; A"J~쥟'S-C{JqUzLA_;( zuAv{b.(X0d?K{Jjx5 VxЕa)\ sR*IfFm?ƃ@JuGJ.M=8gW930kj͌sww&,&vv !A?`rClrˏd2O~,h4QMڌLm[V{.\Cͨtoiyvh^81KRb`ļ$$XUyp[Tɍ?c/E'HN,;S=;򲢮Ev?,,|R$,&_dML9񰌝ܒ`0DBlj;x)=Xx\<Ĩ΍,; /pQ)10 R]TQ$AL&y*sc4tWw>e24;Wa*v NÎcNg¢b0F/_Bf0vMJefRJ QTzp&b[O?zŢ*衟Bvqz%gؠPZ衩r&UЃ Na^?+`>*&`CLQ .]x8gSAEјH^0X(QwGsRP%)9ء)pCh:N+;eGYX,'pD/y;I) z;2LL}urˣ2GCQTTS&N#gWzDu>lqc$*ߍV/Mn^,nȨTX _S";<<%bU?# Z&G /RNG4toe.8HQ^xaLx;Y>[MJ A|;H ~nMLAJKK`n֡L:[@+zXj7:@nqèT4bN<7^(m*8J3/l"׬p}+20}if>! FBT^^+ ߨTW*i;]vPw'yHzzD&=vƍu>'|zFavRzpck z@&-6k#c=I_"B"5k*10:;<8K40?D'Q4*,Qw)Q<;%a-]srء`ǝ|2 =ś@ Q^^y啣2Y`/Y; A"J<|B~b[>$Mnd555)zГMšt zd@ z衭v&U,ui}z2>.b`7?n\x" ƨT,S/JQB_30巶 }ohIp,6|K+Q$;V,a ATa$T XKC[#=hWvWdh)\ƃDdϊMdw?a A@'Aqsy!EVzs|t[1#OpDQ KwJ4B`T'_-8F'tU' ԓCԹ" M@4v4a* Ψ4A2?‡F'1;FϺ/Ad,QZou]seaYI) zxmbw!q|0=,/Gh>j]\^ӝtpY¬`}j]-Ce硾s(wΡ|TEZe);Ks ءc:Î3%;h ( җ;vBg9ExADB B $З\"V`5cgCW;;ŽSI?vu1㯜ʵj͛TƌuϊMd4)%ADy{\-=˃d4 ѸLSh9= CwckĐhy<10u2's_ ДpWi 5١[k9p8%]wpڒ MW011Qa25hZW;ĦH%!toE;ˇ9);;ŽE~dT0`wE`Ǘe%&$HGYp7QL۷g扨}\z9spZovdōM%˚м3GeFlÎ < ˋ[[ S|3338FFF088>l"JE݇5n};$)ni;s,]/% Kb4=Sˢr[Y;H C- AǏe2O_X,MTJ@4Ѓ[Anqqld&ȗ~ ś`U я,!!VPt$&a}4GmŘ>:׊Ţկ~?~ i" 1)%A"ơ'?@MnC{@ǟE JAnl-= .ulm$OpAJEjJ ]T+v;B`T*n`Y6Qցw`6a4_A}Y0Ovo_֭I};B]]SZXL`` vL;ŽSI;Z뵨\+4M!7/aG '$b xbr =>!}\O̙3hhX'ddm =ck|[+:%R2;-b`J+CY%_+.츺3`%UjCP=j5Zn0W_VB"u_oC_q 2)T+KPq,8l> t!Ln0vpY4a%gN*6Eh=;z':h h]._dس#n`ǽ?ADkr˿'AǕ+We֣d OL::VY*YlVø|ڀ)sSnAcmL0RKkfZzm])>օ>"#Uikc,i!ѩ~~9R*óWw7V^r50½'A8Sq:J䯆N u =) (HP2f"Ki ˗CS0Tz%5(SaURR}.SN] teJS`-]KrXJW\0xtEL&cga2 N)vtq%hbt^ ʠB]x,x;vv,1)%ADXqb;l|-?d]z/ =hʂh:=`$Kzhk6 C\XY3ӰC@:p-]C#=,?Z.KQDkׁ[\;~ ϛ"pu;@kGI'B{.Az,AttKh֤b5+#^k @MJx> ?ŀ<9fj2#vpkukN^v&;R sR B{> R1rנLZBu?.c$Ev;W !vU]l9mT;<ءqgvCᚧzܸqE=' 2 "=>'= uhQ.d֞JÝyn53Gy zL+C[craυ=vG]TwزejzV!;*VD찭k{v4XLw ܩU kRX (LA0O *6smc0JaG E/Mf*K]amrvgmX:_ǝ寋"L<k7<츟;,;>' YH 1kl^B:Ao @dhX4Mh>jyPZ\obzXsBQ.omJ x>&o@FC*}v_:@`ߩe.VI,Mb9f*+;"{k`__9$>hbMe"{「OAHzAqBy㣏>*Rf=zwx5œ'_i.R5i8lq+xԬay>M9ƣ*#a5 J;61zLdJP*T _XfF3V+FFFՅ^71tfFĹ.Nқa?uKuL^;MMM }x='ෲ̑,$Hgy ">/GEtۄ'xaf:33 j%sزFcTFV9M)O"咁Qi`zm,`f@?\¥C@-YU.-.=] j"`zz===f`G?0z1c* h `F2j`G$sV?T_ō_p_$c .XV5KY2 Q=z̙3gn[[[U*p03u"dfǬGV-܁ UKȨ49r>Wt%DfDž(2*vo Sg}C e+]mS{p-.+ m흋-JGOE__0<Lh;233z̪ť2^.2N-gT>C#l +10*Z~z4Y=|h \ ,cb||SSSP՘vzia)YcBRVUt1*uc ^:up|.F닉0}K?.z ;> gI K-C^`ddnvT,UA_[vhzn˷,Q;yv A@L4l^; zwfz̺EFYLJzp-.Zk-uZ\6+[l*@ ?Qy@5=vIv\wX=hOqbTdP:>\<Nu.~ MXcҁA|X: rt{tnԬ>EWi_1`6@QVW6a/׏BWspC ppJr89=:܂))>ts}aTu8۹LSrZXO[X~mΝ;̃vpg1$HD?ǿ=>z| ~'-:6:zJ6|=Y#Ʈ?/"4֛Se z$CL43K]):tTL?#ti]H1< 9A ҄wCFCLL&闾}}}AF\KK@XQ2& 0B =,0T$Ȫ=JZQ>iBFuU h!hE20Uf<)-OsZ`˒tI Ѝ>A `۔'C`08hA$7g1[jޟHY@1); Y;WhX1U8,h),ǖ4S{w;({}=r# zD>3go.0X`KoA&0X`,? .4Ņ34uV{[\$Pè.Mڣ} ".f󖇽 U00`TA-6y? QA cB*9m c&ɖfƽp#dù.'7*Pª:1^8_s1p* [XbZ[[kyNn`W`DA 1=d2ܗ_~*6͙}gc0o1c,]: q:ۥ£iJHJA@|߸}}a|+K( LUoKb৳:Kk{,-V+><&D%RCȏX 1g3{2I` K z#2Rv Ai@owGYYPe23-.g}j, =Q{pdY:i]ܻBh`F*!40Un^pcM+RvV;t b ^iΊ (r\FHI˔јSuX*U1c(o1BtZh?UGtXct4m|V&ovRA $z|=/ӟl6c[|2 'p-gv?7L#Pã n^.,zTvpE[7ND Nc"/IHJ@aBաR1X@8^ Xu1;ZmU`_" $=>S{=uwGFFA Vq tdGߙNr=hEK@ץŨQC,~(,w.]?eUjxc`z@PJrWmQ#^j~KLP7t |٠+f<{A;~=2E:<):RT޾"4U1BY h;#1x{?pM'qSv ADA  z|=~n0?җr,nvt-CӋsd}R{X>5+Y=$TyxTe wzCTfa30 ³ZUf3+jTu`;kH5ז::YUGKtL#-1 ;:;;/| _X c:~"8f;>I` $HD7*+_zpf?f7_~6fhzh~= jɍ `/7jӣvEͽ)4*]N@F8 Lq^O,Qg1;a`]EµmYZ ŕhubGU+Jf/sД5Y}"}evsRgq?{ W;H A"|=>z|]-&7q\4Mbq6}qhzqY1C+0 =a4KN}Qazϳ]k%BnJ39Ӂ;nobv$. ܚzU;{Hd)U*@֢f8U ,f68'vL:h֗;u$x"v A|A_A{<@=3[ XLnV3F.N=j<js ѩ勀|)1* 'ngxbv LtM}1Lgz9rTGx+NMJ+4j,wQup+Vu8U;A[1 ;f>p9;{x "߽;$HǗfij1h=a|/jڃ55=R7Kis:__hf dg34QiY 0s8k֭-]Of"דZF5$/ܾi,_ա«CH!Bv9VSh4]YYYe?`Ϡb`$!/v ADlBo 7[VkI[S+2֝cU75.)jVF-勀kۄY^!py.>apM]ͪ {"#Fn&2xԭ᪴bMI}`@{UlEx%2oA z =8_>xp\89s<~"phTh}i[$)'PaT*a36YԃJ_BJæX4v4>}83Cu#oWKiIDAT >pv/{h_dJWuLiR 5wu|} wسN  $p =>=83Sg!6e˗BӴ9V7nʬðr^xܣڃjO#l#ͥ*]$D?J3 &߁Guv{}ʴ!z#V'wE߮p׾br,_zoeP,i̻I,Y!q7$H A'y}2 aK/X,ӱBq m =z|SSN!fjosLs!|(c~ %bXē_wUgIz4v\a.^yi `Aݑ5cȨ1ݯ=#zŀ+b+|SRN7%:zETG@r1Ufy^&'srqeX A B=isלǷek5kVX)ê}h~q4m3jS sz!.%:q+xa<&0]ui"4eЖ'B[}E" Q2fR+aQ$ªHU(> qK\rqhRnt]aN ?(y]q˖1JwY֓ d^<L,(aLU>h˽*aW3\ Gqy{WeNj!W8힁Dž\{ 0A+2!\;Rͺ{WdΟ#^}HtjinsT~rf)c`tIxc疠?o1z,Bit9>Gz,'xYoB$oΆv-$H !]oF!y'qxDhhhxi Q{EWG#Φ*=f#_+`GW%⁏=-ߪ@\);8 H]GA7Î@/] hG ~r@Ϻ4]욥L,:´%_":*#Vty ;P&bsQut:k2ct4m}7[X&{`E`ǧx A؃s/&L\\L_|}e*nADpV{]dS{\tvQ.bUl624m.Y&~YSv{ci7*_xNrqZ 2j/pi'ES2t}"xh[ E&4"+ke t8pA):k_dAy5UE}N_Yo&8gU$H ! ȱBf @YYYju{4W^@KmjO`S6HzˇU;0.L\ \zL#@"TУq+h|90I3.f =CV?.f4%>b"{yfo8::O.@;O!jjM 7ͅ6gƦ4W\ ܩ~TĨ4*vqy "w_;M@E ߾ Ϻw=z,5׆>\"qV+6Sң 0q59а~);:_IyCl $H oB=&|Y懙Ir<(#~&v)ͅ?eosqp66eM5e /J]'IUصʼSqDs}!""+³FՑx[̈(: I}:cfgxCl }B#cjg̏uL={կߑv/o AȀ=&'zp-.L禧OLL4cc6=̕ Ʀ]u@IcvЕ nFu Vv~tY ȪUre־bOE~z8Q;*!>W0p\ؘ(555Mޯ|\:Mbv$H !]=[+ffz_~ >ry@cZh;wf#/Y-Xµ,Yu)ۀъ ؈L*rʅ:35S2WnA M0nn3u`k=u傾 t}.96wVYKO<4KۂU.p+eFX>D{(#n]Pfnq~_M01{ *fMTB]IE&*s0V0RC%0X}k[Yĝh;'|r5&^>`ء _BׯÛI,ތvsR$H2O"CllEfb7>X,Zrv`_1|7h:Svf52y>mc|L+rmC>m=rAm|md%f N!_M~ojFR^NCaDžo@;%LE[托vJn볭u@UMBόZV:r;/ʶshDۙh9 M'1XKX jr@)VNPZ&L&;sΟ;K` $HDZ_L|=޽;[tc=LwS|tetgp-H1 |X7.MLv1oJYv@*!B5 @^%HVo7sx}%"nZ9~^="R'1p#e0XŌ;? ]נt0a}`tn۶-K2[_&;Y$H 'ዙ}22G_dG9q.HNzDӉ4^eks:2PksaǸ|0@mM.t6ͼVWAGqA`,-_pߍ c!+VH&ݸ遗ND06iЪSw~IK-ς>SkAޛUy睙w;f:0<ZZ:@K!$dq PJ :S,qȻ'!NHX/xmي7ICή#Y/H>ߟ?=y~9APh∎Kr2]@-#g&t{2}2Bv"2S^=F˲ln-8w"M{pŇ/>t^:_'vg.P~dD 3n!3w%q{EJE':EGkƊ !QKuOnxpj}aF3Gu[N #֪-3\qy7f\ZMT{`~bpŇS=&f? _Q`p~_N Ȏd́doGid)1]B"Ҳ#wIy FH%'$U?T/!WH*1>E}pn׽ꫫ`WX)'ı0̥G8'zǭL _zˑ;ch@ae1,S!Tl*$>Ot.#T•ޢ:S/[0S=OtLw,(0ҿmh,Ȋ8t L=Iz_o]b)nB_T*"ebY:Dt;:DTôwuWBd?&xE•r}rR=Oba"="uPC/=inwaߌBTrVߣ|{pG-6">gNo-~+5y ="tvvVȜhBvOpDECpeԨQ.^BDܒh!bS]7ol%ljgn῿H@Nbؼ3!(RєG=l8J|t|AFt>7xAQGG"THZm.^$gW nDrF1禛n(_aˎۘu@Ĥ2Snrt?maIII/96ܛ\FiOH%>O[ Q`6 #8H~W_#W,;c aΤ5]Etو-.Єg)]ÉDnǾxsp}!!J.|`_!'#&: IS|7batݻw]aKjE鑳b!&;I!;#jeri=z=dW\L|)ңT{ekXt(H$ɗ&b}7xcppKy?+atw,P-<)VY*$MtyAVD.(sjAYqh<ҶYDۥE[ ?D_ kuEY!aڳʋpC bv̙m+,~o2C*ՁXĄPSfrt~2bĈ_~vep"[ls.Zܴr} Oyof=x+FɆp -V*R\Qv,Q@ixmҿvS;wEEԧ;~t/ziDkyth{#g }6O;h;$/:N^6@;}#FfWXsˈׁXDTzD̔J[ncK/˄ qȸc.G92DΓoR|qz#AU"ɀ-*ĦπP#;NNQ"*tO"6)ąҥ J%޲zE-g{DNޏ˲D NBs+:'_d]9!%:X l^{m- ?qKnE]z{\?3?bz(]q =nBS/'%>Nj=ʷϓ )K~9rm㛨FU >S]7x[WjX! Ea_#)ŲS+IDDMgTrP`9ݑGn5u<`+ ?]&rm$4eI d8{A/09?'0᭰u +'aʎHpLQ^fѵw0o{Ya=OZO}HF͢Gk ^C]^&g^1D|pS`#Oa"y W`%y V]QX #kUȎeaDv:;Cc`Zّ8lt%C9ACQŗ݄ Le&cQk76b hOdMP;J%~zG䤦z_pU{4$:\.9Nr],DtxeG8]?ϩeI,i>5l&W7lSBMM͉{7N"q#Ou2}{i8jW\ M0{t:Q&>EeIGa Hm/ŀ<2u{Y=MU.L$w*r I}x V`d>'D)Lw,/y3D\x·Pț[O.9i]HUi tR__Qog3xEPtt{:rDG35Ej:F67 J>]9bR=VXׁrRJ={=?o]ˊ˭ oLaa:u,%n{t˨1YjYO-yKCI&r^CDhsSUo7 /< >Q*y }{tO&6ch) R7/ ux yNm"ϗCNg_r8Gs|SPCLt=OM91YK^&):'gW >r~֬YsywOI*]aJu(]a([aA9)A!=P3Fx%$QTTvq \|+Q PCԘ5嬧P~xCד \GPpbк>}jD{TJQ`PvWjQ]/ݔ3 BCtVdGvד5i {86Ht&gA"y?k5$n'N6l'DG AÒ5DGsԐ,ڴDթѣGKup*&Q1򅦿I7 <?i,>v.uTd<%(>ß+|/?QP~ DB"x YiӉ|lɡlM]]]D6CHtdR=O#7z?-9=%񔦂IWvItAn&6vdt%@nDT&DxHu\?!qҊl'9zŅO +[{:::, ssԘCOSuHYKgΝ;_&ա|ZXaA9)A!=ć^W\n}`.4M{\2u;JU=$>LiOć?!%>D]^&Gj& X\yK _YeRRn0~D'DKDMx)DGk"ob= W +IsE=7yɼce;L---D2'DGutqU ,jHu(-&cEI_U^ MŎL{iR]q3R.B~Yn9C.!+/t%1D5UQtO/ވޗɝE.%Ʒ躲6#φ MdijJꨶh踖4]CǍQ 444"(?V,8/0͚7eGz'K jXAmV5+/N_[#NV9# .<؂ĦU\V@ѱ;3[9J3\xqHI¯BA!T H!v^kXAmE#a4<>xz/^r뭷NR#VX ;ĄУCˊ?>I{v%---+Sl烿=֖/?2QdI_NԚBUC{Gе`Q16ǀ廒W0901'6a"9s"c7)ٮFQɡCi+9-S I=V֘J daZ_~@~?oEb}:VK=#lq+>}m5\.y.Rsrj:,D|pSW^bG~P7ɘ;£`>y"SEZ+vp&d.R٥ *XSU%9982{D{ڊ1e-5A}m&|SJ^XX#HC ^GBvp1+.~/qSi{E>"BVW\v| S:jHYJ|`K}ȝU~Gݪ T"|q,cHx#JK%_LITDaTT:#} 8G ;jD!C ɡ~eE0qژꓗPa:3T:ZA.@dMM͉'D7qoqJI҃?<0/2H# Ì裏^(5yݥ15*(9I}/ޔK%+/R}rC4kR~ׄ/ bJzYsFIK&`ˎ܅y [`9 1n(k nwگ)WV$DG%TJy*ݷj^#z V9ƻ^AT/}(wE(ՁBS-iȤ=DKMO>vq˦cZ'ޅTo1[H~W^>n*W_ WD^B_l-? L@"rd'lU~_Կ"p!YOk&E.N'ߤIrH$ڞET}4Gud9N[[ŋ)7|DFx}E.Hbz dڃ+>=>=6 >LXslɩ_~T*w- TwQhHY}(]{ 9E u-Q0(g}}z~:t L)g sH?]Q/9{%%Ck/_t4, {iBܵ*/Hk6۟p(+3f̘WGwMua;0Ձ>+.bcВxw0?>aĽ\JNr}L]Kɫɸ3;ST{L}H}#? W~-\IT&q>[0PǞ#vewehR,0_2x2Κ d_W+C%T/\/9|øc>L4ɿP[_QSJTbR-L{9r\aa.vk1QnGRT3!ǻR`E>Oe/A/Ɯy= cOx D&Vb m̡''D+:aW~T04|Gi8i\6o޼j/6[,>;BCԭ՗b ,U-\@b S0?& ]'+E7e ᱌(sZL%8Gf S̜B)UGU N줎joo'kWC/9;˒SCFWGZ߽kkJRB+.J M՜r#'q3'~q;- a/5]s1bĘ0o TJ\yO W"|=p,%W|xS 0l S:7 3_#P9opfNYqΌ#wTrgN%WTr-LqOVᗎ# 9ڨZ[[B-YO+++Sm:긜I%33#FHùwo/%ˎ[9ǜR? #q =V\b5! W||\.cG;]?SPɶ}ZQjV_/N>t4&5.X@…. p?;ђ M#gQDTL/KqQ_(.C\@piJ}|V8䎏=BJjk4y%B---DfO~JrlKU{nB4xbm6':d__TH{P#Rk.7.h4,~h]o Oɴw>4Qreԛ(0Άє.nLE*XHBw ~SLyY Z.{p&QA,;|)[`Jd;s/,88F}{3YDSr'/~H T__Ou$P(]k5?Ze,6LM?fVD^C,I.\!qǘ/ohh8}KƝ BNn5cK葷+Ȟ[D}׎t:>B΂E*M"r_K%ǟGX)$׉^Jth栗/y_ȍ)r_ppWTB^=#;id^&•Jjjj*ɴe(6;9䨿7(cX.+LpO1Tw}ETHhBvPP+==Zs;%߃a1;vxnrd>KWɸ#AT~(9EKc u,$[B.wzzz_~t6P_"_X ~  $AW`JśϹ+jㆈH5m%<In7S dK#{TOSɖ1S0XU9YEteT[UWWd"DTQQAoK 1wdR"fۻw|!3FH:`ेkH{ղK^#cȑ u:VJp_&?v-T,?/?V_άǩ#kuf/ԕ+?'f#9\K H " " B (H$rğK۽;Ì!#;;;˦6U#7 z䊊K.tMqaX$•N3%Gy9Qii)9VXHzntOǽѡ)ftGChEa_2… Plk/ UbXNmzjZ@^@ Wl6vp8~Ӑ! A'A] b_*)B [@ĺW?gMAltb3 =aLlA( BRrC*Hoh=5Ƒ5e %Ǒ%Gs' zJKKF#566ݎrl_޻+':}v tJRXab8*TGydw}xzq_xʕ;CC0Z%c>Y2S!X ^q):;;+@O b+@%T2P+B(og'm}Ɲ;ȟ7@ؓˉ-\N߿SlQMmOLKn F8= 8Ӻ L}%u`tjBؙ@NWܳj 9bh4L:u61+5# ʹ\GG-~O&a̝;wD>z@RE>kɫtZ} N,s|`.5y+?,FV:::+@Z3wi L }*%T+BO\bsp& 2D'!B_EI8>K chL\ pE=KȓؐԆR!ԽBZ_r4DM{&y$j38'%GyTHmşt.txB_>DG*IufaP{5|7<~bcŊ M&a"Q1頮BjIKuɳ.y6է̦sCȡTOZ[[- @} +@$T +AB:Awb '}ysff`2DLxGJ:$["̩C[v&e=HYBr/8:ӤVT =~靚q!)Uʒ>9~s܎[{CCÙu-aB I` IN~" !NG4\MQaƼKpmlW_<2I=3z_ե?M$o1j-_!)_tSjDGKI 1ڎUN_|<1𸩧ZOKRicT fP$mTSMM Q}}}@4f?r(2D]B}iy?~!!)#Ixƒ;{~IOl֔x*+J"0+ <ƼCNd w8 W`9sRC[ne􊊔H򿎦򿎦ҏҏqԜuNv 0EGirrP[H$!Q =^CCM~ŦGre;u?棯i<*6MX|{L&L&ʏ;a`!uN` /ADɘGfSԗ?΃ޑ"δYRz ˲?~Arhv葦LaE|S !%1 p Dr&R_'9Il%7yohzaG8j8:.':Pr 'r=N_gFQz`=ZsWEi:KD/jvj0#_***ⱐ VdHbrΦӛƙ%qZHrvrv,3Hx⽝HpF 'Е=[8@deMO~8VRO VlhJS tV7%:rJq#ңfq 0HiRSk.z{w1G 1qu4Rtj,o*--r1Sžk{ŋPR j$Z—!""{88Õ!RB/E\Ut$IΦ+L/G si-vI 0.Cho)4L%W!%2d_h윱${AFl#7 kID;8'c>u1z=8XE_CtDȊa[jW]4 nyq餎jll*-N;qo f 3L{S?{%Hm,KMi807MӒ1/0Ckf]Z@׳8"$:s!]lN3ޱ IQoo/Nu[$LS_洐q L_S6Z>AAhfPoJ-\śĐ)X4ƖȞly+ӝԕ>_l#-.0s7)ԖdLd?M{'Q^;L~5jwzwLIcɔ4R1Tu ?M埌2@Hp@tȉ[8R+Zz:"]JT0G$bZ\*6ZG-n@墎]K^DeRߔJI0 rm_ 1mKʐv \D)3]ӝ*,DRĞmp8zzzQ?$sW :?+, R"CLf řΜ^A AR]@j {'_nܨ:? hcz j{.$wW3`?lssy ~ZW" CN#RSZsQRlk9CޖRjr=s$+@)1 OJ4DH I k]?ړ#:ŤH\K6-0v#sȖ1lޮqCl+8mqd˘J/2dF@h=Yɚ ˨-%N@j(Kl6vMJPzzOd7 ݇7l6[o=Atucf RZᖚDʕ+z<^'=܎v*?Lߢǩ| UD, "$B!2$#,{gM"ɳbuvv+0u0!81>ӧWPxA #L#ػ r"/3Fjˡi=0STj%6?qm8UrTw-u*|Y3<#:~PZH1ZKI >tM{h=EKB#..nŋS\.W7nלg?'%A*wH4P"Dh5& CgSӮԲ{f`,{x"mP[[+j%JNmjy*X H GMʃ('ס#kq ˂%.* 7!0Ćlr㓱Toy"gk~m/++˝5k|?r>}cJM{#>~xa1w}mF_z:Vuڊ?rϜ@IgR՞x272ϢflMMu)s.eէ&e.5N;c9#0MeLjI]L:#Y,immeoXSSđ5;L vH6G#M?N_|cyH*ChZ2Ҡ1Oo,qT{"HuSszwmOqdJGUIrX6*z1TɘOԘN*ю_alxb<0':቎_3rGFCk)) =–zQlx'>Fz뭓bpk=\;Al3QWIz3$ӾyAB"/C"DPM5[Q]c? }Bd 2_fs455QSS5/F<,2rs]@>p(y>N)Ԓ6OʌH]ٿjċJ K )atGy/Q%ySv{ݱcǶ|͓Ȉ_hzF{}~hLj#n߾}H[ۀ8娗ө[T!b2jO<=FOI]t*UoF[Q gj? >0 aoB Bid";jBF*8Ic |Q+4|S!U_H- ^OUIC\Qɘ Qh6SPRkDۉ_8@Dޣe_1b ’jJMR|kǯx{ha<3rY7q_ kT֛ 9=hE/B;fTTqdJ^C 2Ld2ڵkT]]kר3rd45-BQkb`? {YIKqsM!+2Bdo, T;*vq<*6ETj?G{fQád='.+ gk䪯tƍwm+:∎ :GO@PCMCM_|Ӌ(Hk;fz%/$TAS$*d&{h4REEE`*++ň/%b6-6qmJjvO 2@`$BG)!hdA!(38Scn?Isɸk>UAi˩ejq@9N R'L0#:\0E-t ]G\*6C|_|02=|0oƉmZ[t咫AB+'L&F*--*--/r^1?@OQTlXOG$3׶ _D{?]+Z/:! "$inK d8զ?MMy5uՌ76oɌp)_t+ :R!:MRH +ć5H{DK|.#>a2 3 eMP_o٫QlZ 6 T UNIX*S*=Ɣ%!a"4|(|,˿%OQe$>3_ skz~!J QMz\xHlٲe=0e>ϱ;}mRFBtD+U|GG4OUӧ=wna<P9tz͗~s.ڿIOOmE9yjafȑ#o߾}cCC"B nyg#Jζ*k)'G헁SwYA\=DKNC!vv_K99U[Wb\2 o5jxPspEm*D=Dx#=J{-6)-8|#v%W^p\.++MLL\„9k+őbzU%G̪)$EOлTQZ .Zwy#?ef7<`0mX.`HYUTT> =mElm/"勎|~鹺г1)>! !0̘7&\.|-,++yW1i%k+RrA":#}m$ŇS~ꃿM}>nɯ744 /0(X,K 9%ń9a{~Bt%} w页CKi$Q >z>Ԭ>f͚5xfmv{ R Ìe9VRtsڞĴ.ሏJ]JN Ì{UVVq8?bm9iĈ|ُ2Bpr\!v@t#":uԇغ`㮻ZXXgjAA{?OuB%Z9Ԉ2SEW0Ň~j{>]~JRb'ffEoZf]p!uڵKGГVĎJ#҉@|İPSpo+/~ FC0̸ 6$;wnj-%"BbVw *HpVVne9"hY!.>^P&W~HJ}ǤIpXeMQQчsI 1b++z904Ň=ZNwQкZ}5jno.@WUZ*r dhI4WrWt/h|hP)`8/mmmWXu+@G_[[/r/aUjOZ#͡g)DćP4=Eʋ^~xX};&%%mzjFgggPhߗ]}af)S +++ꨯE-dSrއ$=L*RHh9 : >1T| V!"1bĸwO={vGKK%e{UaٳgkNTKq%XCkC|To-wW|h9E˺ԇ /R+/zQZV_?eFo>Y\\ Ս =<b\pBjRR&NF{/9I!9垲"%!WBfm%"Ra(>CCCT/!&@ we 0coᆉ6lH,** م >nb\:w-[p7N0S1*B}zIdS##pV^•r/wKnK9rW_}uS> * @t:gN:/zĈU ))qxTOɡW7D#%+/ђWD~M 0_zjj-x<} @T76HAA{6lH8~Έ8nOEJrE":Hs]G$]"E~Hu~H"G8fԨQ56p.7f7n߿!V2VpHwqȭh=]E{ei0hG8<CMCvpKPaxk0 Ì:uW\9Vɍo/_|099yԩS2 #Wp(KqĚ&>!itE,K$H|||BRRҦmHПܸpB`x{Æ "r/8fBOQ*8k*b]ZVUbaN}E~(9VkCH\;# w-[ U,:U 16 .&''>iҤ9<1FJoT#8~\Vr ʊ4D0NCʋ1[/b>F:V'mذ!`0}=rTel6sʕCOyS'7)b %0?|1ВCNt[iȏG4Sѐzh w{e)9 !c"dժUK_Rl\z5'6Rb rCJpT7šTrHɡ# ,w#T#՗p_  JYr7O^~Ϝ9d4󛛛u8fez4J 0777_4gΜٶo߾ׯ_o, 6Rbk)br> ?gBKFz ~C/9~(䈤Tk+ CG,5Jz%@LB rŨjDXaƏ5jڵkڵ뷟_KJJf6k=6뒒'Ou׮]]zQFMH % Ԇ\rCMzCh=E௩hMqYUQ"9r #CI/r(Y}!TIHIui"DH<* CBd0ĭZjiRRҦϟ?bp8YuA ބvvvVQVV{=7|#Fg5b?rC,CJp2T$G$`G凒^~~hI ! "sB "!/)#BR!BQ!2r zS>oӪ566~mZ{zzZXb^*pXƯ^p!ԩS y #GxZx@Fl(YKJZܚ>p%h9 :@̈H-?Nh] \ # "$B!JdX2DLIaf]w5mK{)))o?~'dL"|JWW׵erGKgg絶+fd**))>|rQQG)))o{W^""CxP#57Un(Mo J8RJ%* Sr fCOCMCO&"$A z2!"%EĈ >bŊ%7o^u֗~⤳g|+WdVVV.l6X,:::*:;;vp4stv\n˲lt:;=n訰X,f/*++\rpgϞS\\TTTavv;iiiغuK7o^bŊ%=L5\11F:?@f(BR?%3F~-'t1z )*bI-Z%`HˏpS ?DJȥ@Ē b w!jdW'ˮD3J䈘$y1FbfȌЈyK1yBHJb<,dP"6-7Ԭ(jSH(? Q+AaAD "?aWeWH $\YTRDZɋ_\3pFFjhbk)J@ H8 9C՗p_$4T"D Q*D#B+J"5wˌҟ~P^I !Tf&:*5ĆXjC/dTTc$DnJ~"&@t(Ih !B2DQ#E䈜 {d~qC]ĐJGl6R䆒Z5hJ9C.uEQ*Aʉ2DQ+F!Y"&MHJm*$ƿK>`=dHPq 6@DI W1s ; +dWG"dIX|.H ` ʤ%tEXtdate:create2018-12-15T21:55:18+00:00{f%tEXtdate:modify2018-12-15T21:55:18+00:00 FIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/old-logo.svg0000644000175100001770000014174714607525266016025 0ustar00runnerdocker aiohttp-icon Created with Sketch. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/powered_by.rst0000644000175100001770000000316314607525266016446 0ustar00runnerdocker.. _aiohttp-powered-by: Powered by aiohttp ================== Web sites powered by aiohttp. Feel free to fork documentation on github, add a link to your site and make a Pull Request! * `Farmer Business Network `_ * `Home Assistant `_ * `KeepSafe `_ * `Skyscanner Hotels `_ * `Ocean S.A. `_ * `GNS3 `_ * `TutorCruncher socket `_ * `Eyepea - Custom telephony solutions `_ * `ALLOcloud - Telephony in the cloud `_ * `helpmanual - comprehensive help and man page database `_ * `bedevere `_ - CPython's GitHub bot, helps maintain and identify issues with a CPython pull request. * `miss-islington `_ - CPython's GitHub bot, backports and merge CPython's pull requests * `noa technologies - Bike-sharing management platform `_ - SSE endpoint, pushes real time updates of bikes location. * `Wargaming: World of Tanks `_ * `Yandex `_ * `Rambler `_ * `Escargot `_ - Chat server * `Prom.ua `_ - Online trading platform * `globo.com `_ - (some parts) Brazilian largest media portal * `Glose `_ - Social reader for E-Books * `Emoji Generator `_ - Text icon generator ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/spelling_wordlist.txt0000644000175100001770000000614614607525266020066 0ustar00runnerdockerabc addons aiodns aioes aiohttp aiohttpdemo aiohttp’s aiopg alives api api’s app app’s apps arg Arsenic async asyncio asyncpg attrs auth autocalculated autodetection autoformatter autoformatters autogenerates autogeneration awaitable backend backends backport Backport Backporting backports BaseEventLoop basename BasicAuth behaviour BodyPartReader boolean botocore brotli Brotli brotlicffi brotlipy bugfix bugfixes Bugfixes builtin BytesIO callables cancelled canonicalization canonicalize cchardet cChardet ceil changelog Changelog chardet Chardet charset charsetdetect chunked chunking CIMultiDict ClientSession cls cmd codebase codec Codings committer committers config Config configs conjunction contextmanager CookieJar coroutine Coroutine coroutines cpu CPython css ctor Ctrl cython Cython Cythonize cythonized de deduplicate defs Dependabot deprecations DER dev Dev dict Dict Discord django Django dns DNSResolver docstring docstrings DoS downstreams Dup elasticsearch encodings env environ eof epoll etag ETag expirations Facebook facto fallback fallbacks filename finalizers formatter formatters frontend getall gethostbyname github google gunicorn gunicorn’s gzipped hackish highlevel hostnames HTTPException HttpProcessingError httpretty https impl incapsulates Indices infos initializer inline intaking io ip IP ipdb ipv IPv ish isort iterable iterables javascript Jinja json keepalive keepalived keepalives keepaliving kib KiB kwarg latin lifecycle linux localhost Locator login lookup lookups lossless lowercased Mako manylinux metadata microservice middleware middlewares miltidict misbehaviors Mixcloud Mongo Mongo msg MsgType multi multidict multidict’s multidicts Multidicts multipart Multipart mypy Nagle Nagle’s namedtuple nameservers namespace netrc nginx Nginx Nikolay noop normalizer nowait OAuth Online optimizations os outcoming Overridable Paolini param params parsers pathlib peername performant pickleable ping pipelining pluggable plugin poller pong Postgres pre preloaded proactor programmatically proxied PRs pubsub Punycode py pydantic pyenv pyflakes pytest Pytest Quickstart quote’s rc readonly readpayload rebase redirections Redis refactor refactored refactoring referenceable regex regexps regexs reloader renderer renderers repo repr repr’s RequestContextManager request’s Request’s requote requoting resolvehost resolvers reusage reuseconn Runit runtime runtimes sa Satisfiable schemas sendfile serializable serializer shourtcuts skipuntil Skyscanner SocketSocketTransport ssl SSLContext startup subapplication subclasses subdirectory submodules subpackage subprotocol subprotocols subtype supervisord Supervisord Svetlov symlink symlinks syscall syscalls Systemd tarball TCP teardown Teardown TestClient Testsuite Tf timestamps TLS tmp tmpdir toolbar toplevel towncrier tp tuples UI un unawaited unclosed unhandled unicode unittest Unittest unix unsets unstripped untyped uppercased upstr url urldispatcher urlencoded url’s urls utf utils uvloop uWSGI vcvarsall vendored waituntil wakeup wakeups webapp websocket websocket’s websockets Websockets wildcard Workflow ws wsgi WSMessage WSMsgType wss www xxx yarl ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/streams.rst0000644000175100001770000001207114607525266015763 0ustar00runnerdocker.. _aiohttp-streams: Streaming API ============= .. currentmodule:: aiohttp ``aiohttp`` uses streams for retrieving *BODIES*: :attr:`aiohttp.web.BaseRequest.content` and :attr:`aiohttp.ClientResponse.content` are properties with stream API. .. class:: StreamReader The reader from incoming stream. User should never instantiate streams manually but use existing :attr:`aiohttp.web.BaseRequest.content` and :attr:`aiohttp.ClientResponse.content` properties for accessing raw BODY data. Reading Methods --------------- .. method:: StreamReader.read(n=-1) :async: Read up to *n* bytes. If *n* is not provided, or set to ``-1``, read until EOF and return all read bytes. If the EOF was received and the internal buffer is empty, return an empty bytes object. :param int n: how many bytes to read, ``-1`` for the whole stream. :return bytes: the given data .. method:: StreamReader.readany() :async: Read next data portion for the stream. Returns immediately if internal buffer has a data. :return bytes: the given data .. method:: StreamReader.readexactly(n) :async: Read exactly *n* bytes. Raise an :exc:`asyncio.IncompleteReadError` if the end of the stream is reached before *n* can be read, the :attr:`asyncio.IncompleteReadError.partial` attribute of the exception contains the partial read bytes. :param int n: how many bytes to read. :return bytes: the given data .. method:: StreamReader.readline() :async: Read one line, where “line” is a sequence of bytes ending with ``\n``. If EOF is received, and ``\n`` was not found, the method will return the partial read bytes. If the EOF was received and the internal buffer is empty, return an empty bytes object. :return bytes: the given line .. method:: StreamReader.readuntil(separator="\n") :async: Read until separator, where `separator` is a sequence of bytes. If EOF is received, and `separator` was not found, the method will return the partial read bytes. If the EOF was received and the internal buffer is empty, return an empty bytes object. .. versionadded:: 3.8 :return bytes: the given data .. method:: StreamReader.readchunk() :async: Read a chunk of data as it was received by the server. Returns a tuple of (data, end_of_HTTP_chunk). When chunked transfer encoding is used, end_of_HTTP_chunk is a :class:`bool` indicating if the end of the data corresponds to the end of a HTTP chunk, otherwise it is always ``False``. :return tuple[bytes, bool]: a chunk of data and a :class:`bool` that is ``True`` when the end of the returned chunk corresponds to the end of a HTTP chunk. Asynchronous Iteration Support ------------------------------ Stream reader supports asynchronous iteration over BODY. By default it iterates over lines:: async for line in response.content: print(line) Also there are methods for iterating over data chunks with maximum size limit and over any available data. .. method:: StreamReader.iter_chunked(n) :async: Iterates over data chunks with maximum size limit:: async for data in response.content.iter_chunked(1024): print(data) .. method:: StreamReader.iter_any() :async: Iterates over data chunks in order of intaking them into the stream:: async for data in response.content.iter_any(): print(data) .. method:: StreamReader.iter_chunks() :async: Iterates over data chunks as received from the server:: async for data, _ in response.content.iter_chunks(): print(data) If chunked transfer encoding is used, the original http chunks formatting can be retrieved by reading the second element of returned tuples:: buffer = b"" async for data, end_of_http_chunk in response.content.iter_chunks(): buffer += data if end_of_http_chunk: print(buffer) buffer = b"" Helpers ------- .. method:: StreamReader.exception() Get the exception occurred on data reading. .. method:: is_eof() Return ``True`` if EOF was reached. Internal buffer may be not empty at the moment. .. seealso:: :meth:`StreamReader.at_eof()` .. method:: StreamReader.at_eof() Return ``True`` if the buffer is empty and EOF was reached. .. method:: StreamReader.read_nowait(n=None) Returns data from internal buffer if any, empty bytes object otherwise. Raises :exc:`RuntimeError` if other coroutine is waiting for stream. :param int n: how many bytes to read, ``-1`` for the whole internal buffer. :return bytes: the given data .. method:: StreamReader.unread_data(data) Rollback reading some data from stream, inserting it to buffer head. :param bytes data: data to push back into the stream. .. warning:: The method does not wake up waiters. E.g. :meth:`~StreamReader.read()` will not be resumed. .. method:: wait_eof() :async: Wait for EOF. The given data may be accessible by upcoming read calls. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/structures.rst0000644000175100001770000000234414607525266016532 0ustar00runnerdocker.. _aiohttp-structures: Common data structures ====================== .. module:: aiohttp .. currentmodule:: aiohttp Common data structures used by *aiohttp* internally. FrozenList ---------- A list-like structure which implements :class:`collections.abc.MutableSequence`. The list is *mutable* unless :meth:`FrozenList.freeze` is called, after that the list modification raises :exc:`RuntimeError`. .. class:: FrozenList(items) Construct a new *non-frozen* list from *items* iterable. The list implements all :class:`collections.abc.MutableSequence` methods plus two additional APIs. .. attribute:: frozen A read-only property, ``True`` is the list is *frozen* (modifications are forbidden). .. method:: freeze() Freeze the list. There is no way to *thaw* it back. ChainMapProxy ------------- An *immutable* version of :class:`collections.ChainMap`. Internally the proxy is a list of mappings (dictionaries), if the requested key is not present in the first mapping the second is looked up and so on. The class supports :class:`collections.abc.Mapping` interface. .. class:: ChainMapProxy(maps) Create a new chained mapping proxy from a list of mappings (*maps*). .. versionadded:: 3.2 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/testing.rst0000644000175100001770000005650114607525266015770 0ustar00runnerdocker.. module:: aiohttp.test_utils .. _aiohttp-testing: Testing ======= Testing aiohttp web servers --------------------------- aiohttp provides plugin for *pytest* making writing web server tests extremely easy, it also provides :ref:`test framework agnostic utilities ` for testing with other frameworks such as :ref:`unittest `. Before starting to write your tests, you may also be interested on reading :ref:`how to write testable services` that interact with the loop. For using pytest plugin please install pytest-aiohttp_ library: .. code-block:: shell $ pip install pytest-aiohttp If you don't want to install *pytest-aiohttp* for some reason you may insert ``pytest_plugins = 'aiohttp.pytest_plugin'`` line into ``conftest.py`` instead for the same functionality. Provisional Status ~~~~~~~~~~~~~~~~~~ The module is a **provisional**. *aiohttp* has a year and half period for removing deprecated API (:ref:`aiohttp-backward-compatibility-policy`). But for :mod:`aiohttp.test_tools` the deprecation period could be reduced. Moreover we may break *backward compatibility* without *deprecation period* for some very strong reason. The Test Client and Servers ~~~~~~~~~~~~~~~~~~~~~~~~~~~ *aiohttp* test utils provides a scaffolding for testing aiohttp-based web servers. They are consist of two parts: running test server and making HTTP requests to this server. :class:`~aiohttp.test_utils.TestServer` runs :class:`aiohttp.web.Application` based server, :class:`~aiohttp.test_utils.RawTestServer` starts :class:`aiohttp.web.Server` low level server. For performing HTTP requests to these servers you have to create a test client: :class:`~aiohttp.test_utils.TestClient` instance. The client incapsulates :class:`aiohttp.ClientSession` by providing proxy methods to the client for common operations such as *ws_connect*, *get*, *post*, etc. Pytest ~~~~~~ .. currentmodule:: pytest_aiohttp The :data:`aiohttp_client` fixture available from pytest-aiohttp_ plugin allows you to create a client to make requests to test your app. A simple would be:: from aiohttp import web async def hello(request): return web.Response(text='Hello, world') async def test_hello(aiohttp_client, loop): app = web.Application() app.router.add_get('/', hello) client = await aiohttp_client(app) resp = await client.get('/') assert resp.status == 200 text = await resp.text() assert 'Hello, world' in text It also provides access to the app instance allowing tests to check the state of the app. Tests can be made even more succinct with a fixture to create an app test client:: import pytest from aiohttp import web value = web.AppKey("value", str) async def previous(request): if request.method == 'POST': request.app[value] = (await request.post())['value'] return web.Response(body=b'thanks for the data') return web.Response( body='value: {}'.format(request.app[value]).encode('utf-8')) @pytest.fixture def cli(loop, aiohttp_client): app = web.Application() app.router.add_get('/', previous) app.router.add_post('/', previous) return loop.run_until_complete(aiohttp_client(app)) async def test_set_value(cli): resp = await cli.post('/', data={'value': 'foo'}) assert resp.status == 200 assert await resp.text() == 'thanks for the data' assert cli.server.app[value] == 'foo' async def test_get_value(cli): cli.server.app[value] = 'bar' resp = await cli.get('/') assert resp.status == 200 assert await resp.text() == 'value: bar' Pytest tooling has the following fixtures: .. data:: aiohttp_server(app, *, port=None, **kwargs) A fixture factory that creates :class:`~aiohttp.test_utils.TestServer`:: async def test_f(aiohttp_server): app = web.Application() # fill route table server = await aiohttp_server(app) The server will be destroyed on exit from test function. *app* is the :class:`aiohttp.web.Application` used to start server. *port* optional, port the server is run at, if not provided a random unused port is used. .. versionadded:: 3.0 *kwargs* are parameters passed to :meth:`aiohttp.web.Application.make_handler` .. versionchanged:: 3.0 .. deprecated:: 3.2 The fixture was renamed from ``test_server`` to ``aiohttp_server``. .. data:: aiohttp_client(app, server_kwargs=None, **kwargs) aiohttp_client(server, **kwargs) aiohttp_client(raw_server, **kwargs) A fixture factory that creates :class:`~aiohttp.test_utils.TestClient` for access to tested server:: async def test_f(aiohttp_client): app = web.Application() # fill route table client = await aiohttp_client(app) resp = await client.get('/') *client* and responses are cleaned up after test function finishing. The fixture accepts :class:`aiohttp.web.Application`, :class:`aiohttp.test_utils.TestServer` or :class:`aiohttp.test_utils.RawTestServer` instance. *server_kwargs* are parameters passed to the test server if an app is passed, else ignored. *kwargs* are parameters passed to :class:`aiohttp.test_utils.TestClient` constructor. .. versionchanged:: 3.0 The fixture was renamed from ``test_client`` to ``aiohttp_client``. .. data:: aiohttp_raw_server(handler, *, port=None, **kwargs) A fixture factory that creates :class:`~aiohttp.test_utils.RawTestServer` instance from given web handler.:: async def test_f(aiohttp_raw_server, aiohttp_client): async def handler(request): return web.Response(text="OK") raw_server = await aiohttp_raw_server(handler) client = await aiohttp_client(raw_server) resp = await client.get('/') *handler* should be a coroutine which accepts a request and returns response, e.g. *port* optional, port the server is run at, if not provided a random unused port is used. .. versionadded:: 3.0 .. data:: aiohttp_unused_port() Function to return an unused port number for IPv4 TCP protocol:: async def test_f(aiohttp_client, aiohttp_unused_port): port = aiohttp_unused_port() app = web.Application() # fill route table client = await aiohttp_client(app, server_kwargs={'port': port}) ... .. versionchanged:: 3.0 The fixture was renamed from ``unused_port`` to ``aiohttp_unused_port``. .. _aiohttp-testing-unittest-example: .. _aiohttp-testing-unittest-style: Unittest ~~~~~~~~ .. currentmodule:: aiohttp.test_utils To test applications with the standard library's unittest or unittest-based functionality, the AioHTTPTestCase is provided:: from aiohttp.test_utils import AioHTTPTestCase from aiohttp import web class MyAppTestCase(AioHTTPTestCase): async def get_application(self): """ Override the get_app method to return your application. """ async def hello(request): return web.Response(text='Hello, world') app = web.Application() app.router.add_get('/', hello) return app async def test_example(self): async with self.client.request("GET", "/") as resp: self.assertEqual(resp.status, 200) text = await resp.text() self.assertIn("Hello, world", text) .. class:: AioHTTPTestCase A base class to allow for unittest web applications using aiohttp. Derived from :class:`unittest.IsolatedAsyncioTestCase` See :class:`unittest.TestCase` and :class:`unittest.IsolatedAsyncioTestCase` for inherited methods and behavior. This class additionally provides the following: .. attribute:: client an aiohttp test client, :class:`TestClient` instance. .. attribute:: server an aiohttp test server, :class:`TestServer` instance. .. versionadded:: 2.3 .. attribute:: app The application returned by :meth:`~aiohttp.test_utils.AioHTTPTestCase.get_application` (:class:`aiohttp.web.Application` instance). .. method:: get_client() :async: This async method can be overridden to return the :class:`TestClient` object used in the test. :return: :class:`TestClient` instance. .. versionadded:: 2.3 .. method:: get_server() :async: This async method can be overridden to return the :class:`TestServer` object used in the test. :return: :class:`TestServer` instance. .. versionadded:: 2.3 .. method:: get_application() :async: This async method should be overridden to return the :class:`aiohttp.web.Application` object to test. :return: :class:`aiohttp.web.Application` instance. .. method:: asyncSetUp() :async: This async method can be overridden to execute asynchronous code during the ``setUp`` stage of the ``TestCase``:: async def asyncSetUp(self): await super().asyncSetUp() await foo() .. versionadded:: 2.3 .. versionchanged:: 3.8 ``await super().asyncSetUp()`` call is required. .. method:: asyncTearDown() :async: This async method can be overridden to execute asynchronous code during the ``tearDown`` stage of the ``TestCase``:: async def asyncTearDown(self): await super().asyncTearDown() await foo() .. versionadded:: 2.3 .. versionchanged:: 3.8 ``await super().asyncTearDown()`` call is required. Faking request object ^^^^^^^^^^^^^^^^^^^^^ aiohttp provides test utility for creating fake :class:`aiohttp.web.Request` objects: :func:`aiohttp.test_utils.make_mocked_request`, it could be useful in case of simple unit tests, like handler tests, or simulate error conditions that hard to reproduce on real server:: from aiohttp import web from aiohttp.test_utils import make_mocked_request def handler(request): assert request.headers.get('token') == 'x' return web.Response(body=b'data') def test_handler(): req = make_mocked_request('GET', '/', headers={'token': 'x'}) resp = handler(req) assert resp.body == b'data' .. warning:: We don't recommend to apply :func:`~aiohttp.test_utils.make_mocked_request` everywhere for testing web-handler's business object -- please use test client and real networking via 'localhost' as shown in examples before. :func:`~aiohttp.test_utils.make_mocked_request` exists only for testing complex cases (e.g. emulating network errors) which are extremely hard or even impossible to test by conventional way. .. function:: make_mocked_request(method, path, headers=None, *, \ version=HttpVersion(1, 1), \ closing=False, \ app=None, \ match_info=sentinel, \ reader=sentinel, \ writer=sentinel, \ transport=sentinel, \ payload=sentinel, \ sslcontext=None, \ loop=...) Creates mocked web.Request testing purposes. Useful in unit tests, when spinning full web server is overkill or specific conditions and errors are hard to trigger. :param method: str, that represents HTTP method, like; GET, POST. :type method: str :param path: str, The URL including *PATH INFO* without the host or scheme :type path: str :param headers: mapping containing the headers. Can be anything accepted by the multidict.CIMultiDict constructor. :type headers: dict, multidict.CIMultiDict, list of tuple(str, str) :param match_info: mapping containing the info to match with url parameters. :type match_info: dict :param version: namedtuple with encoded HTTP version :type version: aiohttp.protocol.HttpVersion :param closing: flag indicates that connection should be closed after response. :type closing: bool :param app: the aiohttp.web application attached for fake request :type app: aiohttp.web.Application :param writer: object for managing outcoming data :type writer: aiohttp.StreamWriter :param transport: asyncio transport instance :type transport: asyncio.Transport :param payload: raw payload reader object :type payload: aiohttp.StreamReader :param sslcontext: ssl.SSLContext object, for HTTPS connection :type sslcontext: ssl.SSLContext :param loop: An event loop instance, mocked loop by default. :type loop: :class:`asyncio.AbstractEventLoop` :return: :class:`aiohttp.web.Request` object. .. versionadded:: 2.3 *match_info* parameter. .. _aiohttp-testing-writing-testable-services: .. _aiohttp-testing-framework-agnostic-utilities: Framework Agnostic Utilities ---------------------------- High level test creation:: from aiohttp.test_utils import TestClient, TestServer, loop_context from aiohttp import request # loop_context is provided as a utility. You can use any # asyncio.BaseEventLoop class in its place. with loop_context() as loop: app = _create_example_app() with TestClient(TestServer(app), loop=loop) as client: async def test_get_route(): nonlocal client resp = await client.get("/") assert resp.status == 200 text = await resp.text() assert "Hello, world" in text loop.run_until_complete(test_get_route()) If it's preferred to handle the creation / teardown on a more granular basis, the TestClient object can be used directly:: from aiohttp.test_utils import TestClient, TestServer with loop_context() as loop: app = _create_example_app() client = TestClient(TestServer(app), loop=loop) loop.run_until_complete(client.start_server()) root = "http://127.0.0.1:{}".format(port) async def test_get_route(): resp = await client.get("/") assert resp.status == 200 text = await resp.text() assert "Hello, world" in text loop.run_until_complete(test_get_route()) loop.run_until_complete(client.close()) A full list of the utilities provided can be found at the :mod:`api reference ` Testing API Reference --------------------- Test server ~~~~~~~~~~~ Runs given :class:`aiohttp.web.Application` instance on random TCP port. After creation the server is not started yet, use :meth:`~aiohttp.test_utils.BaseTestServer.start_server` for actual server starting and :meth:`~aiohttp.test_utils.BaseTestServer.close` for stopping/cleanup. Test server usually works in conjunction with :class:`aiohttp.test_utils.TestClient` which provides handy client methods for accessing to the server. .. class:: BaseTestServer(*, scheme='http', host='127.0.0.1', port=None, socket_factory=get_port_socket) Base class for test servers. :param str scheme: HTTP scheme, non-protected ``"http"`` by default. :param str host: a host for TCP socket, IPv4 *local host* (``'127.0.0.1'``) by default. :param int port: optional port for TCP socket, if not provided a random unused port is used. .. versionadded:: 3.0 :param collections.abc.Callable[[str,int,socket.AddressFamily],socket.socket] socket_factory: optional Factory to create a socket for the server. By default creates a TCP socket and binds it to ``host`` and ``port``. .. versionadded:: 3.8 .. attribute:: scheme A *scheme* for tested application, ``'http'`` for non-protected run and ``'https'`` for TLS encrypted server. .. attribute:: host *host* used to start a test server. .. attribute:: port *port* used to start the test server. .. attribute:: handler :class:`aiohttp.web.Server` used for HTTP requests serving. .. attribute:: server :class:`asyncio.AbstractServer` used for managing accepted connections. .. attribute:: socket_factory *socket_factory* used to create and bind a server socket. .. versionadded:: 3.8 .. method:: start_server(loop=None, **kwargs) :async: :param loop: the event_loop to use :type loop: asyncio.AbstractEventLoop Start a test server. .. method:: close() :async: Stop and finish executed test server. .. method:: make_url(path) Return an *absolute* :class:`~yarl.URL` for given *path*. .. class:: RawTestServer(handler, *, scheme="http", host='127.0.0.1') Low-level test server (derived from :class:`BaseTestServer`). :param handler: a coroutine for handling web requests. The handler should accept :class:`aiohttp.web.BaseRequest` and return a response instance, e.g. :class:`~aiohttp.web.StreamResponse` or :class:`~aiohttp.web.Response`. The handler could raise :class:`~aiohttp.web.HTTPException` as a signal for non-200 HTTP response. :param str scheme: HTTP scheme, non-protected ``"http"`` by default. :param str host: a host for TCP socket, IPv4 *local host* (``'127.0.0.1'``) by default. :param int port: optional port for TCP socket, if not provided a random unused port is used. .. versionadded:: 3.0 .. class:: TestServer(app, *, scheme="http", host='127.0.0.1') Test server (derived from :class:`BaseTestServer`) for starting :class:`~aiohttp.web.Application`. :param app: :class:`aiohttp.web.Application` instance to run. :param str scheme: HTTP scheme, non-protected ``"http"`` by default. :param str host: a host for TCP socket, IPv4 *local host* (``'127.0.0.1'``) by default. :param int port: optional port for TCP socket, if not provided a random unused port is used. .. versionadded:: 3.0 .. attribute:: app :class:`aiohttp.web.Application` instance to run. Test Client ~~~~~~~~~~~ .. class:: TestClient(app_or_server, *, loop=None, \ scheme='http', host='127.0.0.1', \ cookie_jar=None, **kwargs) A test client used for making calls to tested server. :param app_or_server: :class:`BaseTestServer` instance for making client requests to it. In order to pass a :class:`aiohttp.web.Application` you need to convert it first to :class:`TestServer` first with ``TestServer(app)``. :param cookie_jar: an optional :class:`aiohttp.CookieJar` instance, may be useful with ``CookieJar(unsafe=True, treat_as_secure_origin="http://127.0.0.1")`` option. :param str scheme: HTTP scheme, non-protected ``"http"`` by default. :param asyncio.AbstractEventLoop loop: the event_loop to use :param str host: a host for TCP socket, IPv4 *local host* (``'127.0.0.1'``) by default. .. attribute:: scheme A *scheme* for tested application, ``'http'`` for non-protected run and ``'https'`` for TLS encrypted server. .. attribute:: host *host* used to start a test server. .. attribute:: port *port* used to start the server .. attribute:: server :class:`BaseTestServer` test server instance used in conjunction with client. .. attribute:: app An alias for ``self.server.app``. return ``None`` if ``self.server`` is not :class:`TestServer` instance(e.g. :class:`RawTestServer` instance for test low-level server). .. attribute:: session An internal :class:`aiohttp.ClientSession`. Unlike the methods on the :class:`TestClient`, client session requests do not automatically include the host in the url queried, and will require an absolute path to the resource. .. method:: start_server(**kwargs) :async: Start a test server. .. method:: close() :async: Stop and finish executed test server. .. method:: make_url(path) Return an *absolute* :class:`~yarl.URL` for given *path*. .. method:: request(method, path, *args, **kwargs) :async: Routes a request to tested http server. The interface is identical to :meth:`aiohttp.ClientSession.request`, except the loop kwarg is overridden by the instance used by the test server. .. method:: get(path, *args, **kwargs) :async: Perform an HTTP GET request. .. method:: post(path, *args, **kwargs) :async: Perform an HTTP POST request. .. method:: options(path, *args, **kwargs) :async: Perform an HTTP OPTIONS request. .. method:: head(path, *args, **kwargs) :async: Perform an HTTP HEAD request. .. method:: put(path, *args, **kwargs) :async: Perform an HTTP PUT request. .. method:: patch(path, *args, **kwargs) :async: Perform an HTTP PATCH request. .. method:: delete(path, *args, **kwargs) :async: Perform an HTTP DELETE request. .. method:: ws_connect(path, *args, **kwargs) :async: Initiate websocket connection. The api corresponds to :meth:`aiohttp.ClientSession.ws_connect`. Utilities ~~~~~~~~~ .. function:: make_mocked_coro(return_value) Creates a coroutine mock. Behaves like a coroutine which returns *return_value*. But it is also a mock object, you might test it as usual :class:`~unittest.mock.Mock`:: mocked = make_mocked_coro(1) assert 1 == await mocked(1, 2) mocked.assert_called_with(1, 2) :param return_value: A value that the mock object will return when called. :returns: A mock object that behaves as a coroutine which returns *return_value* when called. .. function:: unused_port() Return an unused port number for IPv4 TCP protocol. :return int: ephemeral port number which could be reused by test server. .. function:: loop_context(loop_factory=) A contextmanager that creates an event_loop, for test purposes. Handles the creation and cleanup of a test loop. .. function:: setup_test_loop(loop_factory=) Create and return an :class:`asyncio.AbstractEventLoop` instance. The caller should also call teardown_test_loop, once they are done with the loop. .. note:: As side effect the function changes asyncio *default loop* by :func:`asyncio.set_event_loop` call. Previous default loop is not restored. It should not be a problem for test suite: every test expects a new test loop instance anyway. .. versionchanged:: 3.1 The function installs a created event loop as *default*. .. function:: teardown_test_loop(loop) Teardown and cleanup an event_loop created by setup_test_loop. :param loop: the loop to teardown :type loop: asyncio.AbstractEventLoop .. _pytest: http://pytest.org/latest/ .. _pytest-aiohttp: https://pypi.python.org/pypi/pytest-aiohttp ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/third_party.rst0000644000175100001770000002542214607525266016642 0ustar00runnerdocker.. _aiohttp-3rd-party: Third-Party libraries ===================== aiohttp is not just a library for making HTTP requests and creating web servers. It is the foundation for libraries built *on top* of aiohttp. This page is a list of these tools. Please feel free to add your open source library if it's not listed yet by making a pull request to https://github.com/aio-libs/aiohttp/ * Why would you want to include your awesome library in this list? * Because the list increases your library visibility. People will have an easy way to find it. Officially supported -------------------- This list contains libraries which are supported by the *aio-libs* team and located on https://github.com/aio-libs aiohttp extensions ^^^^^^^^^^^^^^^^^^ - `aiohttp-session `_ provides sessions for :mod:`aiohttp.web`. - `aiohttp-debugtoolbar `_ is a library for *debug toolbar* support for :mod:`aiohttp.web`. - `aiohttp-security `_ auth and permissions for :mod:`aiohttp.web`. - `aiohttp-devtools `_ provides development tools for :mod:`aiohttp.web` applications. - `aiohttp-cors `_ CORS support for aiohttp. - `aiohttp-sse `_ Server-sent events support for aiohttp. - `pytest-aiohttp `_ pytest plugin for aiohttp support. - `aiohttp-mako `_ Mako template renderer for aiohttp.web. - `aiohttp-jinja2 `_ Jinja2 template renderer for aiohttp.web. - `aiozipkin `_ distributed tracing instrumentation for `aiohttp` client and server. Database drivers ^^^^^^^^^^^^^^^^ - `aiopg `_ PostgreSQL async driver. - `aiomysql `_ MySQL async driver. - `aioredis `_ Redis async driver. Other tools ^^^^^^^^^^^ - `aiodocker `_ Python Docker API client based on asyncio and aiohttp. - `aiobotocore `_ asyncio support for botocore library using aiohttp. Approved third-party libraries ------------------------------ These libraries are not part of ``aio-libs`` but they have proven to be very well written and highly recommended for usage. - `uvloop `_ Ultra fast implementation of asyncio event loop on top of ``libuv``. We highly recommend to use this instead of standard ``asyncio``. Database drivers ^^^^^^^^^^^^^^^^ - `asyncpg `_ Another PostgreSQL async driver. It's much faster than ``aiopg`` but is not a drop-in replacement -- the API is different. But, please take a look at it -- the driver is incredibly fast. OpenAPI / Swagger extensions ---------------------------- Extensions bringing `OpenAPI `_ support to aiohttp web servers. - `aiohttp-apispec `_ Build and document REST APIs with ``aiohttp`` and ``apispec``. - `aiohttp_apiset `_ Package to build routes using swagger specification. - `aiohttp-pydantic `_ An ``aiohttp.View`` to validate the HTTP request's body, query-string, and headers regarding function annotations and generate OpenAPI doc. - `aiohttp-swagger `_ Swagger API Documentation builder for aiohttp server. - `aiohttp-swagger3 `_ Library for Swagger documentation builder and validating aiohttp requests using swagger specification 3.0. - `aiohttp-swaggerify `_ Library to automatically generate swagger2.0 definition for aiohttp endpoints. - `aio-openapi `_ Asynchronous web middleware for aiohttp and serving Rest APIs with OpenAPI v3 specification and with optional PostgreSQL database bindings. - `rororo `_ Implement ``aiohttp.web`` OpenAPI 3 server applications with schema first approach. Others ------ Here is a list of other known libraries that do not belong in the former categories. We cannot vouch for the quality of these libraries, use them at your own risk. Please add your library reference here first and after some time ask to raise the status. - `pytest-aiohttp-client `_ Pytest fixture with simpler api, payload decoding and status code assertions. - `octomachinery `_ A framework for developing GitHub Apps and GitHub Actions. - `aiomixcloud `_ Mixcloud API wrapper for Python and Async IO. - `aiohttp-cache `_ A cache system for aiohttp server. - `aiocache `_ Caching for asyncio with multiple backends (framework agnostic) - `gain `_ Web crawling framework based on asyncio for everyone. - `aiohttp-validate `_ Simple library that helps you validate your API endpoints requests/responses with json schema. - `raven-aiohttp `_ An aiohttp transport for raven-python (Sentry client). - `webargs `_ A friendly library for parsing HTTP request arguments, with built-in support for popular web frameworks, including Flask, Django, Bottle, Tornado, Pyramid, webapp2, Falcon, and aiohttp. - `aioauth-client `_ OAuth client for aiohttp. - `aiohttpretty `_ A simple asyncio compatible httpretty mock using aiohttp. - `aioresponses `_ a helper for mock/fake web requests in python aiohttp package. - `aiohttp-transmute `_ A transmute implementation for aiohttp. - `aiohttp-login `_ Registration and authorization (including social) for aiohttp applications. - `aiohttp_utils `_ Handy utilities for building aiohttp.web applications. - `aiohttpproxy `_ Simple aiohttp HTTP proxy. - `aiohttp_traversal `_ Traversal based router for aiohttp.web. - `aiohttp_autoreload `_ Makes aiohttp server auto-reload on source code change. - `gidgethub `_ An async GitHub API library for Python. - `aiohttp_jrpc `_ aiohttp JSON-RPC service. - `fbemissary `_ A bot framework for the Facebook Messenger platform, built on asyncio and aiohttp. - `aioslacker `_ slacker wrapper for asyncio. - `aioreloader `_ Port of tornado reloader to asyncio. - `aiohttp_babel `_ Babel localization support for aiohttp. - `python-mocket `_ a socket mock framework - for all kinds of socket animals, web-clients included. - `aioraft `_ asyncio RAFT algorithm based on aiohttp. - `home-assistant `_ Open-source home automation platform running on Python 3. - `discord.py `_ Discord client library. - `aiogram `_ A fully asynchronous library for Telegram Bot API written with asyncio and aiohttp. - `aiohttp-graphql `_ GraphQL and GraphIQL interface for aiohttp. - `aiohttp-sentry `_ An aiohttp middleware for reporting errors to Sentry. - `aiohttp-datadog `_ An aiohttp middleware for reporting metrics to DataDog. - `async-v20 `_ Asynchronous FOREX client for OANDA's v20 API. - `aiohttp-jwt `_ An aiohttp middleware for JWT(JSON Web Token) support. - `AWS Xray Python SDK `_ Native tracing support for Aiohttp applications. - `GINO `_ An asyncio ORM on top of SQLAlchemy core, delivered with an aiohttp extension. - `New Relic `_ An aiohttp middleware for reporting your `Python application performance `_ metrics to New Relic. - `eider-py `_ Python implementation of the `Eider RPC protocol `_. - `asynapplicationinsights `_ A client for `Azure Application Insights `_ implemented using ``aiohttp`` client, including a middleware for ``aiohttp`` servers to collect web apps telemetry. - `aiogmaps `_ Asynchronous client for Google Maps API Web Services. - `DBGR `_ Terminal based tool to test and debug HTTP APIs with ``aiohttp``. - `aiohttp-middlewares `_ Collection of useful middlewares for ``aiohttp.web`` applications. - `aiohttp-tus `_ `tus.io `_ protocol implementation for ``aiohttp.web`` applications. - `aiohttp-sse-client `_ A Server-Sent Event python client base on aiohttp. - `aiohttp-retry `_ Wrapper for aiohttp client for retrying requests. - `aiohttp-socks `_ SOCKS proxy connector for aiohttp. - `aiohttp-catcher `_ An aiohttp middleware library for centralized error handling in aiohttp servers. - `rsocket `_ Python implementation of `RSocket protocol `_. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/tracing_reference.rst0000644000175100001770000002756314607525266017766 0ustar00runnerdocker.. _aiohttp-client-tracing-reference: Tracing Reference ================= .. currentmodule:: aiohttp .. versionadded:: 3.0 A reference for client tracing API. .. seealso:: :ref:`aiohttp-client-tracing` for tracing usage instructions. Request life cycle ------------------ A request goes through the following stages and corresponding fallbacks. Overview ^^^^^^^^ .. blockdiag:: :desctable: blockdiag { orientation = portrait; start[shape=beginpoint, description="on_request_start"]; redirect[description="on_request_redirect"]; end[shape=endpoint, description="on_request_end"]; exception[shape=flowchart.terminator, description="on_request_exception"]; acquire_connection[description="Connection acquiring"]; headers_received; headers_sent[description="on_request_headers_sent"]; chunk_sent[description="on_request_chunk_sent"]; chunk_received[description="on_response_chunk_received"]; start -> acquire_connection; acquire_connection -> headers_sent; headers_sent -> headers_received; headers_sent -> chunk_sent; chunk_sent -> chunk_sent; chunk_sent -> headers_received; headers_received -> chunk_received; chunk_received -> chunk_received; chunk_received -> end; headers_received -> redirect; headers_received -> end; redirect -> headers_sent; chunk_received -> exception; chunk_sent -> exception; headers_sent -> exception; } Connection acquiring ^^^^^^^^^^^^^^^^^^^^ .. blockdiag:: :desctable: blockdiag { orientation = portrait; begin[shape=beginpoint]; end[shape=endpoint]; exception[shape=flowchart.terminator, description="Exception raised"]; queued_start[description="on_connection_queued_start"]; queued_end[description="on_connection_queued_end"]; create_start[description="on_connection_create_start"]; create_end[description="on_connection_create_end"]; reuseconn[description="on_connection_reuseconn"]; resolve_dns[description="DNS resolving"]; sock_connect[description="Connection establishment"]; begin -> reuseconn; begin -> create_start; create_start -> resolve_dns; resolve_dns -> exception; resolve_dns -> sock_connect; sock_connect -> exception; sock_connect -> create_end -> end; begin -> queued_start; queued_start -> queued_end; queued_end -> reuseconn; queued_end -> create_start; reuseconn -> end; } DNS resolving ^^^^^^^^^^^^^ .. blockdiag:: :desctable: blockdiag { orientation = portrait; begin[shape=beginpoint]; end[shape=endpoint]; exception[shape=flowchart.terminator, description="Exception raised"]; resolve_start[description="on_dns_resolvehost_start"]; resolve_end[description="on_dns_resolvehost_end"]; cache_hit[description="on_dns_cache_hit"]; cache_miss[description="on_dns_cache_miss"]; begin -> cache_hit -> end; begin -> cache_miss -> resolve_start; resolve_start -> resolve_end -> end; resolve_start -> exception; } Classes ------- .. class:: TraceConfig(trace_config_ctx_factory=SimpleNamespace) Trace config is the configuration object used to trace requests launched by a :class:`ClientSession` object using different events related to different parts of the request flow. :param trace_config_ctx_factory: factory used to create trace contexts, default class used :class:`types.SimpleNamespace` .. method:: trace_config_ctx(trace_request_ctx=None) :param trace_request_ctx: Will be used to pass as a kw for the ``trace_config_ctx_factory``. Build a new trace context from the config. Every signal handler should have the following signature:: async def on_signal(session, context, params): ... where ``session`` is :class:`ClientSession` instance, ``context`` is an object returned by :meth:`trace_config_ctx` call and ``params`` is a data class with signal parameters. The type of ``params`` depends on subscribed signal and described below. .. attribute:: on_request_start Property that gives access to the signals that will be executed when a request starts. ``params`` is :class:`aiohttp.TraceRequestStartParams` instance. .. attribute:: on_request_chunk_sent Property that gives access to the signals that will be executed when a chunk of request body is sent. ``params`` is :class:`aiohttp.TraceRequestChunkSentParams` instance. .. versionadded:: 3.1 .. attribute:: on_response_chunk_received Property that gives access to the signals that will be executed when a chunk of response body is received. ``params`` is :class:`aiohttp.TraceResponseChunkReceivedParams` instance. .. versionadded:: 3.1 .. attribute:: on_request_redirect Property that gives access to the signals that will be executed when a redirect happens during a request flow. ``params`` is :class:`aiohttp.TraceRequestRedirectParams` instance. .. attribute:: on_request_end Property that gives access to the signals that will be executed when a request ends. ``params`` is :class:`aiohttp.TraceRequestEndParams` instance. .. attribute:: on_request_exception Property that gives access to the signals that will be executed when a request finishes with an exception. ``params`` is :class:`aiohttp.TraceRequestExceptionParams` instance. .. attribute:: on_connection_queued_start Property that gives access to the signals that will be executed when a request has been queued waiting for an available connection. ``params`` is :class:`aiohttp.TraceConnectionQueuedStartParams` instance. .. attribute:: on_connection_queued_end Property that gives access to the signals that will be executed when a request that was queued already has an available connection. ``params`` is :class:`aiohttp.TraceConnectionQueuedEndParams` instance. .. attribute:: on_connection_create_start Property that gives access to the signals that will be executed when a request creates a new connection. ``params`` is :class:`aiohttp.TraceConnectionCreateStartParams` instance. .. attribute:: on_connection_create_end Property that gives access to the signals that will be executed when a request that created a new connection finishes its creation. ``params`` is :class:`aiohttp.TraceConnectionCreateEndParams` instance. .. attribute:: on_connection_reuseconn Property that gives access to the signals that will be executed when a request reuses a connection. ``params`` is :class:`aiohttp.TraceConnectionReuseconnParams` instance. .. attribute:: on_dns_resolvehost_start Property that gives access to the signals that will be executed when a request starts to resolve the domain related with the request. ``params`` is :class:`aiohttp.TraceDnsResolveHostStartParams` instance. .. attribute:: on_dns_resolvehost_end Property that gives access to the signals that will be executed when a request finishes to resolve the domain related with the request. ``params`` is :class:`aiohttp.TraceDnsResolveHostEndParams` instance. .. attribute:: on_dns_cache_hit Property that gives access to the signals that will be executed when a request was able to use a cached DNS resolution for the domain related with the request. ``params`` is :class:`aiohttp.TraceDnsCacheHitParams` instance. .. attribute:: on_dns_cache_miss Property that gives access to the signals that will be executed when a request was not able to use a cached DNS resolution for the domain related with the request. ``params`` is :class:`aiohttp.TraceDnsCacheMissParams` instance. .. attribute:: on_request_headers_sent Property that gives access to the signals that will be executed when request headers are sent. ``params`` is :class:`aiohttp.TraceRequestHeadersSentParams` instance. .. versionadded:: 3.8 .. class:: TraceRequestStartParams See :attr:`TraceConfig.on_request_start` for details. .. attribute:: method Method that will be used to make the request. .. attribute:: url URL that will be used for the request. .. attribute:: headers Headers that will be used for the request, can be mutated. .. class:: TraceRequestChunkSentParams .. versionadded:: 3.1 See :attr:`TraceConfig.on_request_chunk_sent` for details. .. attribute:: method Method that will be used to make the request. .. attribute:: url URL that will be used for the request. .. attribute:: chunk Bytes of chunk sent .. class:: TraceResponseChunkReceivedParams .. versionadded:: 3.1 See :attr:`TraceConfig.on_response_chunk_received` for details. .. attribute:: method Method that will be used to make the request. .. attribute:: url URL that will be used for the request. .. attribute:: chunk Bytes of chunk received .. class:: TraceRequestEndParams See :attr:`TraceConfig.on_request_end` for details. .. attribute:: method Method used to make the request. .. attribute:: url URL used for the request. .. attribute:: headers Headers used for the request. .. attribute:: response Response :class:`ClientResponse`. .. class:: TraceRequestExceptionParams See :attr:`TraceConfig.on_request_exception` for details. .. attribute:: method Method used to make the request. .. attribute:: url URL used for the request. .. attribute:: headers Headers used for the request. .. attribute:: exception Exception raised during the request. .. class:: TraceRequestRedirectParams See :attr:`TraceConfig.on_request_redirect` for details. .. attribute:: method Method used to get this redirect request. .. attribute:: url URL used for this redirect request. .. attribute:: headers Headers used for this redirect. .. attribute:: response Response :class:`ClientResponse` got from the redirect. .. class:: TraceConnectionQueuedStartParams See :attr:`TraceConfig.on_connection_queued_start` for details. There are no attributes right now. .. class:: TraceConnectionQueuedEndParams See :attr:`TraceConfig.on_connection_queued_end` for details. There are no attributes right now. .. class:: TraceConnectionCreateStartParams See :attr:`TraceConfig.on_connection_create_start` for details. There are no attributes right now. .. class:: TraceConnectionCreateEndParams See :attr:`TraceConfig.on_connection_create_end` for details. There are no attributes right now. .. class:: TraceConnectionReuseconnParams See :attr:`TraceConfig.on_connection_reuseconn` for details. There are no attributes right now. .. class:: TraceDnsResolveHostStartParams See :attr:`TraceConfig.on_dns_resolvehost_start` for details. .. attribute:: host Host that will be resolved. .. class:: TraceDnsResolveHostEndParams See :attr:`TraceConfig.on_dns_resolvehost_end` for details. .. attribute:: host Host that has been resolved. .. class:: TraceDnsCacheHitParams See :attr:`TraceConfig.on_dns_cache_hit` for details. .. attribute:: host Host found in the cache. .. class:: TraceDnsCacheMissParams See :attr:`TraceConfig.on_dns_cache_miss` for details. .. attribute:: host Host didn't find the cache. .. class:: TraceRequestHeadersSentParams See :attr:`TraceConfig.on_request_headers_sent` for details. .. versionadded:: 3.8 .. attribute:: method Method that will be used to make the request. .. attribute:: url URL that will be used for the request. .. attribute:: headers Headers that will be used for the request. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/utilities.rst0000644000175100001770000000041414607525266016316 0ustar00runnerdocker.. _aiohttp-utilities: Utilities ========= Miscellaneous API Shared between Client And Server. .. currentmodule:: aiohttp .. toctree:: :name: utilities :maxdepth: 2 abc multipart multipart_reference streams structures websocket_utilities ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/web.rst0000644000175100001770000000061514607525266015063 0ustar00runnerdocker.. _aiohttp-web: Server ====== .. module:: aiohttp.web The page contains all information about aiohttp Server API: .. toctree:: :name: server :maxdepth: 3 Tutorial Quickstart Advanced Usage Low Level Reference Logging Testing Deployment ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/web_advanced.rst0000644000175100001770000011757614607525266016727 0ustar00runnerdocker.. _aiohttp-web-advanced: Web Server Advanced =================== .. currentmodule:: aiohttp.web Unicode support --------------- *aiohttp* does :term:`requoting` of incoming request path. Unicode (non-ASCII) symbols are processed transparently on both *route adding* and *resolving* (internally everything is converted to :term:`percent-encoding` form by :term:`yarl` library). But in case of custom regular expressions for :ref:`aiohttp-web-variable-handler` please take care that URL is *percent encoded*: if you pass Unicode patterns they don't match to *requoted* path. .. _aiohttp-web-peer-disconnection: Peer disconnection ------------------ *aiohttp* has 2 approaches to handling client disconnections. If you are familiar with asyncio, or scalability is a concern for your application, we recommend using the handler cancellation method. Raise on read/write (default) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ When a client peer is gone, a subsequent reading or writing raises :exc:`OSError` or a more specific exception like :exc:`ConnectionResetError`. This behavior is similar to classic WSGI frameworks like Flask and Django. The reason for disconnection varies; it can be a network issue or explicit socket closing on the peer side without reading the full server response. *aiohttp* handles disconnection properly but you can handle it explicitly, e.g.:: async def handler(request): try: text = await request.text() except OSError: # disconnected Web handler cancellation ^^^^^^^^^^^^^^^^^^^^^^^^ This method can be enabled using the ``handler_cancellation`` parameter to :func:`run_app`. When a client disconnects, the web handler task will be cancelled. This is recommended as it can reduce the load on your server when there is no client to receive a response. It can also help make your application more resilient to DoS attacks (by requiring an attacker to keep a connection open in order to waste server resources). This behavior is very different from classic WSGI frameworks like Flask and Django. It requires a reasonable level of asyncio knowledge to use correctly without causing issues in your code. We provide some examples here to help understand the complexity and methods needed to deal with them. .. warning:: :term:`web-handler` execution could be canceled on every ``await`` if client drops connection without reading entire response's BODY. Sometimes it is a desirable behavior: on processing ``GET`` request the code might fetch data from a database or other web resource, the fetching is potentially slow. Canceling this fetch is a good idea: the peer dropped connection already, so there is no reason to waste time and resources (memory etc) by getting data from a DB without any chance to send it back to peer. But sometimes the cancellation is bad: on ``POST`` request very often it is needed to save data to a DB regardless of peer closing. Cancellation prevention could be implemented in several ways: * Applying :func:`asyncio.shield` to a coroutine that saves data. * Using aiojobs_ or another third party library. :func:`asyncio.shield` can work well. The only disadvantage is you need to split web handler into exactly two async functions: one for handler itself and other for protected code. For example the following snippet is not safe:: async def handler(request): await asyncio.shield(write_to_redis(request)) await asyncio.shield(write_to_postgres(request)) return web.Response(text="OK") Cancellation might occur while saving data in REDIS, so ``write_to_postgres`` will not be called, potentially leaving your data in an inconsistent state. Instead, you would need to write something like:: async def write_data(request): await write_to_redis(request) await write_to_postgres(request) async def handler(request): await asyncio.shield(write_data(request)) return web.Response(text="OK") Alternatively, if you want to spawn a task without waiting for its completion, you can use aiojobs_ which provides an API for spawning new background jobs. It stores all scheduled activity in internal data structures and can terminate them gracefully:: from aiojobs.aiohttp import setup, spawn async def handler(request): await spawn(request, write_data()) return web.Response() app = web.Application() setup(app) app.router.add_get("/", handler) .. warning:: Don't use :func:`asyncio.create_task` for this. All tasks should be awaited at some point in your code (``aiojobs`` handles this for you), otherwise you will hide legitimate exceptions and result in warnings being emitted. A good case for using :func:`asyncio.create_task` is when you want to run something while you are processing other data, but still want to ensure the task is complete before returning:: async def handler(request): t = asyncio.create_task(get_some_data()) ... # Do some other things, while data is being fetched. data = await t return web.Response(text=data) One more approach would be to use :func:`aiojobs.aiohttp.atomic` decorator to execute the entire handler as a new job. Essentially restoring the default disconnection behavior only for specific handlers:: from aiojobs.aiohttp import atomic @atomic async def handler(request): await write_to_db() return web.Response() app = web.Application() setup(app) app.router.add_post("/", handler) It prevents all of the ``handler`` async function from cancellation, so ``write_to_db`` will be never interrupted. .. _aiojobs: http://aiojobs.readthedocs.io/en/latest/ Passing a coroutine into run_app and Gunicorn --------------------------------------------- :func:`run_app` accepts either application instance or a coroutine for making an application. The coroutine based approach allows to perform async IO before making an app:: async def app_factory(): await pre_init() app = web.Application() app.router.add_get(...) return app web.run_app(app_factory()) Gunicorn worker supports a factory as well. For Gunicorn the factory should accept zero parameters:: async def my_web_app(): app = web.Application() app.router.add_get(...) return app Start gunicorn: .. code-block:: shell $ gunicorn my_app_module:my_web_app --bind localhost:8080 --worker-class aiohttp.GunicornWebWorker .. versionadded:: 3.1 Custom Routing Criteria ----------------------- Sometimes you need to register :ref:`handlers ` on more complex criteria than simply a *HTTP method* and *path* pair. Although :class:`UrlDispatcher` does not support any extra criteria, routing based on custom conditions can be accomplished by implementing a second layer of routing in your application. The following example shows custom routing based on the *HTTP Accept* header:: class AcceptChooser: def __init__(self): self._accepts = {} async def do_route(self, request): for accept in request.headers.getall('ACCEPT', []): acceptor = self._accepts.get(accept) if acceptor is not None: return (await acceptor(request)) raise HTTPNotAcceptable() def reg_acceptor(self, accept, handler): self._accepts[accept] = handler async def handle_json(request): # do json handling async def handle_xml(request): # do xml handling chooser = AcceptChooser() app.add_routes([web.get('/', chooser.do_route)]) chooser.reg_acceptor('application/json', handle_json) chooser.reg_acceptor('application/xml', handle_xml) .. _aiohttp-web-static-file-handling: Static file handling -------------------- The best way to handle static files (images, JavaScripts, CSS files etc.) is using `Reverse Proxy`_ like `nginx`_ or `CDN`_ services. .. _Reverse Proxy: https://en.wikipedia.org/wiki/Reverse_proxy .. _nginx: https://nginx.org/ .. _CDN: https://en.wikipedia.org/wiki/Content_delivery_network But for development it's very convenient to handle static files by aiohttp server itself. To do it just register a new static route by :meth:`RouteTableDef.static` or :func:`static` calls:: app.add_routes([web.static('/prefix', path_to_static_folder)]) routes.static('/prefix', path_to_static_folder) When a directory is accessed within a static route then the server responses to client with ``HTTP/403 Forbidden`` by default. Displaying folder index instead could be enabled with ``show_index`` parameter set to ``True``:: web.static('/prefix', path_to_static_folder, show_index=True) When a symlink that leads outside the static directory is accessed, the server responds to the client with ``HTTP/404 Not Found`` by default. To allow the server to follow symlinks that lead outside the static root, the parameter ``follow_symlinks`` should be set to ``True``:: web.static('/prefix', path_to_static_folder, follow_symlinks=True) .. caution:: Enabling ``follow_symlinks`` can be a security risk, and may lead to a directory transversal attack. You do NOT need this option to follow symlinks which point to somewhere else within the static directory, this option is only used to break out of the security sandbox. Enabling this option is highly discouraged, and only expected to be used for edge cases in a local development setting where remote users do not have access to the server. When you want to enable cache busting, parameter ``append_version`` can be set to ``True`` Cache busting is the process of appending some form of file version hash to the filename of resources like JavaScript and CSS files. The performance advantage of doing this is that we can tell the browser to cache these files indefinitely without worrying about the client not getting the latest version when the file changes:: web.static('/prefix', path_to_static_folder, append_version=True) Template Rendering ------------------ :mod:`aiohttp.web` does not support template rendering out-of-the-box. However, there is a third-party library, :mod:`aiohttp_jinja2`, which is supported by the *aiohttp* authors. Using it is rather simple. First, setup a *jinja2 environment* with a call to :func:`aiohttp_jinja2.setup`:: app = web.Application() aiohttp_jinja2.setup(app, loader=jinja2.FileSystemLoader('/path/to/templates/folder')) After that you may use the template engine in your :ref:`handlers `. The most convenient way is to simply wrap your handlers with the :func:`aiohttp_jinja2.template` decorator:: @aiohttp_jinja2.template('tmpl.jinja2') async def handler(request): return {'name': 'Andrew', 'surname': 'Svetlov'} If you prefer the `Mako`_ template engine, please take a look at the `aiohttp_mako`_ library. .. warning:: :func:`aiohttp_jinja2.template` should be applied **before** :meth:`RouteTableDef.get` decorator and family, e.g. it must be the *first* (most *down* decorator in the chain):: @routes.get('/path') @aiohttp_jinja2.template('tmpl.jinja2') async def handler(request): return {'name': 'Andrew', 'surname': 'Svetlov'} .. _Mako: http://www.makotemplates.org/ .. _aiohttp_mako: https://github.com/aio-libs/aiohttp_mako .. _aiohttp-web-websocket-read-same-task: Reading from the same task in WebSockets ---------------------------------------- Reading from the *WebSocket* (``await ws.receive()``) **must only** be done inside the request handler *task*; however, writing (``ws.send_str(...)``) to the *WebSocket*, closing (``await ws.close()``) and canceling the handler task may be delegated to other tasks. See also :ref:`FAQ section `. :mod:`aiohttp.web` creates an implicit :class:`asyncio.Task` for handling every incoming request. .. note:: While :mod:`aiohttp.web` itself only supports *WebSockets* without downgrading to *LONG-POLLING*, etc., our team supports SockJS_, an aiohttp-based library for implementing SockJS-compatible server code. .. _SockJS: https://github.com/aio-libs/sockjs .. warning:: Parallel reads from websocket are forbidden, there is no possibility to call :meth:`WebSocketResponse.receive` from two tasks. See :ref:`FAQ section ` for instructions how to solve the problem. .. _aiohttp-web-data-sharing: Data Sharing aka No Singletons Please ------------------------------------- :mod:`aiohttp.web` discourages the use of *global variables*, aka *singletons*. Every variable should have its own context that is *not global*. Global variables are generally considered bad practice due to the complexity they add in keeping track of state changes to variables. *aiohttp* does not use globals by design, which will reduce the number of bugs and/or unexpected behaviors for its users. For example, an i18n translated string being written for one request and then being served to another. So, :class:`Application` and :class:`Request` support a :class:`collections.abc.MutableMapping` interface (i.e. they are dict-like objects), allowing them to be used as data stores. .. _aiohttp-web-data-sharing-app-config: Application's config ^^^^^^^^^^^^^^^^^^^^ For storing *global-like* variables, feel free to save them in an :class:`Application` instance:: app['my_private_key'] = data and get it back in the :term:`web-handler`:: async def handler(request): data = request.app['my_private_key'] Rather than using :class:`str` keys, we recommend using :class:`AppKey`. This is required for type safety (e.g. when checking with mypy):: my_private_key = web.AppKey("my_private_key", str) app[my_private_key] = data async def handler(request: web.Request): data = request.app[my_private_key] # reveal_type(data) -> str In case of :ref:`nested applications ` the desired lookup strategy could be the following: 1. Search the key in the current nested application. 2. If the key is not found continue searching in the parent application(s). For this please use :attr:`Request.config_dict` read-only property:: async def handler(request): data = request.config_dict[my_private_key] The app object can be used in this way to reuse a database connection or anything else needed throughout the application. See this reference section for more detail: :ref:`aiohttp-web-app-and-router`. Request's storage ^^^^^^^^^^^^^^^^^ Variables that are only needed for the lifetime of a :class:`Request`, can be stored in a :class:`Request`:: async def handler(request): request['my_private_key'] = "data" ... This is mostly useful for :ref:`aiohttp-web-middlewares` and :ref:`aiohttp-web-signals` handlers to store data for further processing by the next handlers in the chain. Response's storage ^^^^^^^^^^^^^^^^^^ :class:`StreamResponse` and :class:`Response` objects also support :class:`collections.abc.MutableMapping` interface. This is useful when you want to share data with signals and middlewares once all the work in the handler is done:: async def handler(request): [ do all the work ] response['my_metric'] = 123 return response Naming hint ^^^^^^^^^^^ To avoid clashing with other *aiohttp* users and third-party libraries, please choose a unique key name for storing data. If your code is published on PyPI, then the project name is most likely unique and safe to use as the key. Otherwise, something based on your company name/url would be satisfactory (i.e. ``org.company.app``). .. _aiohttp-web-contextvars: ContextVars support ------------------- Asyncio has :mod:`Context Variables ` as a context-local storage (a generalization of thread-local concept that works with asyncio tasks also). *aiohttp* server supports it in the following way: * A server inherits the current task's context used when creating it. :func:`aiohttp.web.run_app()` runs a task for handling all underlying jobs running the app, but alternatively :ref:`aiohttp-web-app-runners` can be used. * Application initialization / finalization events (:attr:`Application.cleanup_ctx`, :attr:`Application.on_startup` and :attr:`Application.on_shutdown`, :attr:`Application.on_cleanup`) are executed inside the same context. E.g. all context modifications made on application startup are visible on teardown. * On every request handling *aiohttp* creates a context copy. :term:`web-handler` has all variables installed on initialization stage. But the context modification made by a handler or middleware is invisible to another HTTP request handling call. An example of context vars usage:: from contextvars import ContextVar from aiohttp import web VAR = ContextVar('VAR', default='default') async def coro(): return VAR.get() async def handler(request): var = VAR.get() VAR.set('handler') ret = await coro() return web.Response(text='\n'.join([var, ret])) async def on_startup(app): print('on_startup', VAR.get()) VAR.set('on_startup') async def on_cleanup(app): print('on_cleanup', VAR.get()) VAR.set('on_cleanup') async def init(): print('init', VAR.get()) VAR.set('init') app = web.Application() app.router.add_get('/', handler) app.on_startup.append(on_startup) app.on_cleanup.append(on_cleanup) return app web.run_app(init()) print('done', VAR.get()) .. versionadded:: 3.5 .. _aiohttp-web-middlewares: Middlewares ----------- :mod:`aiohttp.web` provides a powerful mechanism for customizing :ref:`request handlers` via *middlewares*. A *middleware* is a coroutine that can modify either the request or response. For example, here's a simple *middleware* which appends ``' wink'`` to the response:: from aiohttp.web import middleware @middleware async def middleware(request, handler): resp = await handler(request) resp.text = resp.text + ' wink' return resp .. note:: The example won't work with streamed responses or websockets Every *middleware* should accept two parameters, a :class:`request ` instance and a *handler*, and return the response or raise an exception. If the exception is not an instance of :exc:`HTTPException` it is converted to ``500`` :exc:`HTTPInternalServerError` after processing the middlewares chain. .. warning:: Second argument should be named *handler* exactly. When creating an :class:`Application`, these *middlewares* are passed to the keyword-only ``middlewares`` parameter:: app = web.Application(middlewares=[middleware_1, middleware_2]) Internally, a single :ref:`request handler ` is constructed by applying the middleware chain to the original handler in reverse order, and is called by the :class:`~aiohttp.web.RequestHandler` as a regular *handler*. Since *middlewares* are themselves coroutines, they may perform extra ``await`` calls when creating a new handler, e.g. call database etc. *Middlewares* usually call the handler, but they may choose to ignore it, e.g. displaying *403 Forbidden page* or raising :exc:`HTTPForbidden` exception if the user does not have permissions to access the underlying resource. They may also render errors raised by the handler, perform some pre- or post-processing like handling *CORS* and so on. The following code demonstrates middlewares execution order:: from aiohttp import web async def test(request): print('Handler function called') return web.Response(text="Hello") @web.middleware async def middleware1(request, handler): print('Middleware 1 called') response = await handler(request) print('Middleware 1 finished') return response @web.middleware async def middleware2(request, handler): print('Middleware 2 called') response = await handler(request) print('Middleware 2 finished') return response app = web.Application(middlewares=[middleware1, middleware2]) app.router.add_get('/', test) web.run_app(app) Produced output:: Middleware 1 called Middleware 2 called Handler function called Middleware 2 finished Middleware 1 finished Example ^^^^^^^ A common use of middlewares is to implement custom error pages. The following example will render 404 errors using a JSON response, as might be appropriate a JSON REST service:: from aiohttp import web @web.middleware async def error_middleware(request, handler): try: response = await handler(request) if response.status != 404: return response message = response.message except web.HTTPException as ex: if ex.status != 404: raise message = ex.reason return web.json_response({'error': message}) app = web.Application(middlewares=[error_middleware]) Middleware Factory ^^^^^^^^^^^^^^^^^^ A *middleware factory* is a function that creates a middleware with passed arguments. For example, here's a trivial *middleware factory*:: def middleware_factory(text): @middleware async def sample_middleware(request, handler): resp = await handler(request) resp.text = resp.text + text return resp return sample_middleware Remember that contrary to regular middlewares you need the result of a middleware factory not the function itself. So when passing a middleware factory to an app you actually need to call it:: app = web.Application(middlewares=[middleware_factory(' wink')]) .. _aiohttp-web-signals: Signals ------- Although :ref:`middlewares ` can customize :ref:`request handlers` before or after a :class:`Response` has been prepared, they can't customize a :class:`Response` **while** it's being prepared. For this :mod:`aiohttp.web` provides *signals*. For example, a middleware can only change HTTP headers for *unprepared* responses (see :meth:`StreamResponse.prepare`), but sometimes we need a hook for changing HTTP headers for streamed responses and WebSockets. This can be accomplished by subscribing to the :attr:`Application.on_response_prepare` signal, which is called after default headers have been computed and directly before headers are sent:: async def on_prepare(request, response): response.headers['My-Header'] = 'value' app.on_response_prepare.append(on_prepare) Additionally, the :attr:`Application.on_startup` and :attr:`Application.on_cleanup` signals can be subscribed to for application component setup and tear down accordingly. The following example will properly initialize and dispose an asyncpg connection engine:: from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine pg_engine = web.AppKey("pg_engine", AsyncEngine) async def create_pg(app): app[pg_engine] = await create_async_engine( "postgresql+asyncpg://postgre:@localhost:5432/postgre" ) async def dispose_pg(app): await app[pg_engine].dispose() app.on_startup.append(create_pg) app.on_cleanup.append(dispose_pg) Signal handlers should not return a value but may modify incoming mutable parameters. Signal handlers will be run sequentially, in order they were added. All handlers must be asynchronous since *aiohttp* 3.0. .. _aiohttp-web-cleanup-ctx: Cleanup Context --------------- Bare :attr:`Application.on_startup` / :attr:`Application.on_cleanup` pair still has a pitfall: signals handlers are independent on each other. E.g. we have ``[create_pg, create_redis]`` in *startup* signal and ``[dispose_pg, dispose_redis]`` in *cleanup*. If, for example, ``create_pg(app)`` call fails ``create_redis(app)`` is not called. But on application cleanup both ``dispose_pg(app)`` and ``dispose_redis(app)`` are still called: *cleanup signal* has no knowledge about startup/cleanup pairs and their execution state. The solution is :attr:`Application.cleanup_ctx` usage:: async def pg_engine(app: web.Application): app[pg_engine] = await create_async_engine( "postgresql+asyncpg://postgre:@localhost:5432/postgre" ) yield await app[pg_engine].dispose() app.cleanup_ctx.append(pg_engine) The attribute is a list of *asynchronous generators*, a code *before* ``yield`` is an initialization stage (called on *startup*), a code *after* ``yield`` is executed on *cleanup*. The generator must have only one ``yield``. *aiohttp* guarantees that *cleanup code* is called if and only if *startup code* was successfully finished. .. versionadded:: 3.1 .. _aiohttp-web-nested-applications: Nested applications ------------------- Sub applications are designed for solving the problem of the big monolithic code base. Let's assume we have a project with own business logic and tools like administration panel and debug toolbar. Administration panel is a separate application by its own nature but all toolbar URLs are served by prefix like ``/admin``. Thus we'll create a totally separate application named ``admin`` and connect it to main app with prefix by :meth:`Application.add_subapp`:: admin = web.Application() # setup admin routes, signals and middlewares app.add_subapp('/admin/', admin) Middlewares and signals from ``app`` and ``admin`` are chained. It means that if URL is ``'/admin/something'`` middlewares from ``app`` are applied first and ``admin.middlewares`` are the next in the call chain. The same is going for :attr:`Application.on_response_prepare` signal -- the signal is delivered to both top level ``app`` and ``admin`` if processing URL is routed to ``admin`` sub-application. Common signals like :attr:`Application.on_startup`, :attr:`Application.on_shutdown` and :attr:`Application.on_cleanup` are delivered to all registered sub-applications. The passed parameter is sub-application instance, not top-level application. Third level sub-applications can be nested into second level ones -- there are no limitation for nesting level. Url reversing for sub-applications should generate urls with proper prefix. But for getting URL sub-application's router should be used:: admin = web.Application() admin.add_routes([web.get('/resource', handler, name='name')]) app.add_subapp('/admin/', admin) url = admin.router['name'].url_for() The generated ``url`` from example will have a value ``URL('/admin/resource')``. If main application should do URL reversing for sub-application it could use the following explicit technique:: admin = web.Application() admin_key = web.AppKey('admin_key', web.Application) admin.add_routes([web.get('/resource', handler, name='name')]) app.add_subapp('/admin/', admin) app[admin_key] = admin async def handler(request: web.Request): # main application's handler admin = request.app[admin_key] url = admin.router['name'].url_for() .. _aiohttp-web-expect-header: *Expect* Header --------------- :mod:`aiohttp.web` supports *Expect* header. By default it sends ``HTTP/1.1 100 Continue`` line to client, or raises :exc:`HTTPExpectationFailed` if header value is not equal to "100-continue". It is possible to specify custom *Expect* header handler on per route basis. This handler gets called if *Expect* header exist in request after receiving all headers and before processing application's :ref:`aiohttp-web-middlewares` and route handler. Handler can return *None*, in that case the request processing continues as usual. If handler returns an instance of class :class:`StreamResponse`, *request handler* uses it as response. Also handler can raise a subclass of :exc:`HTTPException`. In this case all further processing will not happen and client will receive appropriate http response. .. note:: A server that does not understand or is unable to comply with any of the expectation values in the Expect field of a request MUST respond with appropriate error status. The server MUST respond with a 417 (Expectation Failed) status if any of the expectations cannot be met or, if there are other problems with the request, some other 4xx status. http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.20 If all checks pass, the custom handler *must* write a *HTTP/1.1 100 Continue* status code before returning. The following example shows how to setup a custom handler for the *Expect* header:: async def check_auth(request): if request.version != aiohttp.HttpVersion11: return if request.headers.get('EXPECT') != '100-continue': raise HTTPExpectationFailed(text="Unknown Expect: %s" % expect) if request.headers.get('AUTHORIZATION') is None: raise HTTPForbidden() request.transport.write(b"HTTP/1.1 100 Continue\r\n\r\n") async def hello(request): return web.Response(body=b"Hello, world") app = web.Application() app.add_routes([web.add_get('/', hello, expect_handler=check_auth)]) .. _aiohttp-web-custom-resource: Custom resource implementation ------------------------------ To register custom resource use :meth:`~aiohttp.web.UrlDispatcher.register_resource`. Resource instance must implement `AbstractResource` interface. .. _aiohttp-web-app-runners: Application runners ------------------- :func:`run_app` provides a simple *blocking* API for running an :class:`Application`. For starting the application *asynchronously* or serving on multiple HOST/PORT :class:`AppRunner` exists. The simple startup code for serving HTTP site on ``'localhost'``, port ``8080`` looks like:: runner = web.AppRunner(app) await runner.setup() site = web.TCPSite(runner, 'localhost', 8080) await site.start() while True: await asyncio.sleep(3600) # sleep forever To stop serving call :meth:`AppRunner.cleanup`:: await runner.cleanup() .. versionadded:: 3.0 .. _aiohttp-web-graceful-shutdown: Graceful shutdown ------------------ Stopping *aiohttp web server* by just closing all connections is not always satisfactory. When aiohttp is run with :func:`run_app`, it will attempt a graceful shutdown by following these steps (if using a :ref:`runner `, then calling :meth:`AppRunner.cleanup` will perform these steps, excluding steps 4 and 7). 1. Stop each site listening on sockets, so new connections will be rejected. 2. Close idle keep-alive connections (and set active ones to close upon completion). 3. Call the :attr:`Application.on_shutdown` signal. This should be used to shutdown long-lived connections, such as websockets (see below). 4. Wait a short time for running tasks to complete. This allows any pending handlers or background tasks to complete successfully. The timeout can be adjusted with ``shutdown_timeout`` in :func:`run_app`. 5. Close any remaining connections and cancel their handlers. It will wait on the canceling handlers for a short time, again adjustable with ``shutdown_timeout``. 6. Call the :attr:`Application.on_cleanup` signal. This should be used to cleanup any resources (such as DB connections). This includes completing the :ref:`cleanup contexts`. 7. Cancel any remaining tasks and wait on them to complete. .. note:: When creating new tasks in a handler which _should_ be cancelled on server shutdown, then it is important to keep track of those tasks and explicitly cancel them in a :attr:`Application.on_shutdown` callback. As we can see from the above steps, without this the server will wait on those new tasks to complete before it continues with server shutdown. Websocket shutdown ^^^^^^^^^^^^^^^^^^ One problem is if the application supports :term:`websockets ` or *data streaming* it most likely has open connections at server shutdown time. The *library* has no knowledge how to close them gracefully but a developer can help by registering an :attr:`Application.on_shutdown` signal handler. A developer should keep a list of opened connections (:class:`Application` is a good candidate). The following :term:`websocket` snippet shows an example of a websocket handler:: from aiohttp import web import weakref app = web.Application() websockets = web.AppKey("websockets", weakref.WeakSet) app[websockets] = weakref.WeakSet() async def websocket_handler(request): ws = web.WebSocketResponse() await ws.prepare(request) request.app[websockets].add(ws) try: async for msg in ws: ... finally: request.app[websockets].discard(ws) return ws Then the signal handler may look like:: from aiohttp import WSCloseCode async def on_shutdown(app): for ws in set(app[websockets]): await ws.close(code=WSCloseCode.GOING_AWAY, message="Server shutdown") app.on_shutdown.append(on_shutdown) .. _aiohttp-web-ceil-absolute-timeout: Ceil of absolute timeout value ------------------------------ *aiohttp* **ceils** internal timeout values if the value is equal or greater than 5 seconds. The timeout expires at the next integer second greater than ``current_time + timeout``. More details about ceiling absolute timeout values is available here :ref:`aiohttp-client-timeouts`. The default threshold can be configured at :class:`aiohttp.web.Application` level using the ``handler_args`` parameter. .. code-block:: python3 app = web.Application(handler_args={"timeout_ceil_threshold": 1}) .. _aiohttp-web-background-tasks: Background tasks ----------------- Sometimes there's a need to perform some asynchronous operations just after application start-up. Even more, in some sophisticated systems there could be a need to run some background tasks in the event loop along with the application's request handler. Such as listening to message queue or other network message/event sources (e.g. ZeroMQ, Redis Pub/Sub, AMQP, etc.) to react to received messages within the application. For example the background task could listen to ZeroMQ on ``zmq.SUB`` socket, process and forward retrieved messages to clients connected via WebSocket that are stored somewhere in the application (e.g. in the ``application['websockets']`` list). To run such short and long running background tasks aiohttp provides an ability to register :attr:`Application.on_startup` signal handler(s) that will run along with the application's request handler. For example there's a need to run one quick task and two long running tasks that will live till the application is alive. The appropriate background tasks could be registered as an :attr:`Application.on_startup` signal handler or :attr:`Application.cleanup_ctx` as shown in the example below:: async def listen_to_redis(app: web.Application): client = redis.from_url("redis://localhost:6379") channel = "news" async with client.pubsub() as pubsub: await pubsub.subscribe(channel) while True: try: msg = await pubsub.get_message(ignore_subscribe_messages=True) if msg is not None: for ws in app["websockets"]: await ws.send_str("{}: {}".format(channel, msg)) except asyncio.CancelledError: break async def background_tasks(app): app[redis_listener] = asyncio.create_task(listen_to_redis(app)) yield app[redis_listener].cancel() await app[redis_listener] app = web.Application() redis_listener = web.AppKey("redis_listener", asyncio.Task[None]) app.cleanup_ctx.append(background_tasks) web.run_app(app) The task ``listen_to_redis`` will run forever. To shut it down correctly :attr:`Application.on_cleanup` signal handler may be used to send a cancellation to it. .. _aiohttp-web-complex-applications: Complex Applications ^^^^^^^^^^^^^^^^^^^^ Sometimes aiohttp is not the sole part of an application and additional tasks/processes may need to be run alongside the aiohttp :class:`Application`. Generally, the best way to achieve this is to use :func:`aiohttp.web.run_app` as the entry point for the program. Other tasks can then be run via :attr:`Application.startup` and :attr:`Application.on_cleanup`. By having the :class:`Application` control the lifecycle of the entire program, the code will be more robust and ensure that the tasks are started and stopped along with the application. For example, running a long-lived task alongside the :class:`Application` can be done with a :ref:`aiohttp-web-cleanup-ctx` function like:: async def run_other_task(_app): task = asyncio.create_task(other_long_task()) yield task.cancel() with suppress(asyncio.CancelledError): await task # Ensure any exceptions etc. are raised. app.cleanup_ctx.append(run_other_task) Or a separate process can be run with something like:: async def run_process(_app): proc = await asyncio.create_subprocess_exec(path) yield if proc.returncode is None: proc.terminate() await proc.wait() app.cleanup_ctx.append(run_process) Handling error pages -------------------- Pages like *404 Not Found* and *500 Internal Error* could be handled by custom middleware, see :ref:`polls demo ` for example. .. _aiohttp-web-forwarded-support: Deploying behind a Proxy ------------------------ As discussed in :ref:`aiohttp-deployment` the preferable way is deploying *aiohttp* web server behind a *Reverse Proxy Server* like :term:`nginx` for production usage. In this way properties like :attr:`BaseRequest.scheme` :attr:`BaseRequest.host` and :attr:`BaseRequest.remote` are incorrect. Real values should be given from proxy server, usually either ``Forwarded`` or old-fashion ``X-Forwarded-For``, ``X-Forwarded-Host``, ``X-Forwarded-Proto`` HTTP headers are used. *aiohttp* does not take *forwarded* headers into account by default because it produces *security issue*: HTTP client might add these headers too, pushing non-trusted data values. That's why *aiohttp server* should setup *forwarded* headers in custom middleware in tight conjunction with *reverse proxy configuration*. For changing :attr:`BaseRequest.scheme` :attr:`BaseRequest.host` :attr:`BaseRequest.remote` and :attr:`BaseRequest.client_max_size` the middleware might use :meth:`BaseRequest.clone`. .. seealso:: https://github.com/aio-libs/aiohttp-remotes provides secure helpers for modifying *scheme*, *host* and *remote* attributes according to ``Forwarded`` and ``X-Forwarded-*`` HTTP headers. Swagger support --------------- `aiohttp-swagger `_ is a library that allow to add Swagger documentation and embed the Swagger-UI into your :mod:`aiohttp.web` project. CORS support ------------ :mod:`aiohttp.web` itself does not support `Cross-Origin Resource Sharing `_, but there is an aiohttp plugin for it: `aiohttp_cors `_. Debug Toolbar ------------- `aiohttp-debugtoolbar`_ is a very useful library that provides a debugging toolbar while you're developing an :mod:`aiohttp.web` application. Install it with ``pip``: .. code-block:: shell $ pip install aiohttp_debugtoolbar Just call :func:`aiohttp_debugtoolbar.setup`:: import aiohttp_debugtoolbar from aiohttp_debugtoolbar import toolbar_middleware_factory app = web.Application() aiohttp_debugtoolbar.setup(app) The toolbar is ready to use. Enjoy!!! .. _aiohttp-debugtoolbar: https://github.com/aio-libs/aiohttp_debugtoolbar Dev Tools --------- `aiohttp-devtools`_ provides a couple of tools to simplify development of :mod:`aiohttp.web` applications. Install with ``pip``: .. code-block:: shell $ pip install aiohttp-devtools * ``runserver`` provides a development server with auto-reload, live-reload, static file serving. * ``start`` is a `cookiecutter command which does the donkey work of creating new :mod:`aiohttp.web` Applications. Documentation and a complete tutorial of creating and running an app locally are available at `aiohttp-devtools`_. .. _aiohttp-devtools: https://github.com/aio-libs/aiohttp-devtools ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/web_lowlevel.rst0000644000175100001770000000501514607525266016773 0ustar00runnerdocker.. _aiohttp-web-lowlevel: Low Level Server ================ .. currentmodule:: aiohttp.web This topic describes :mod:`aiohttp.web` based *low level* API. Abstract -------- Sometimes user don't need high-level concepts introduced in :ref:`aiohttp-web`: applications, routers, middlewares and signals. All what is needed is supporting asynchronous callable which accepts a request and returns a response object. This is done by introducing :class:`aiohttp.web.Server` class which serves a *protocol factory* role for :meth:`asyncio.loop.create_server` and bridges data stream to *web handler* and sends result back. Low level *web handler* should accept the single :class:`BaseRequest` parameter and performs one of the following actions: 1. Return a :class:`Response` with the whole HTTP body stored in memory. 2. Create a :class:`StreamResponse`, send headers by :meth:`StreamResponse.prepare` call, send data chunks by :meth:`StreamResponse.write` and return finished response. 3. Raise :class:`HTTPException` derived exception (see :ref:`aiohttp-web-exceptions` section). All other exceptions not derived from :class:`HTTPException` leads to *500 Internal Server Error* response. 4. Initiate and process Web-Socket connection by :class:`WebSocketResponse` using (see :ref:`aiohttp-web-websockets`). Run a Basic Low-Level Server ---------------------------- The following code demonstrates very trivial usage example:: import asyncio from aiohttp import web async def handler(request): return web.Response(text="OK") async def main(): server = web.Server(handler) runner = web.ServerRunner(server) await runner.setup() site = web.TCPSite(runner, 'localhost', 8080) await site.start() print("======= Serving on http://127.0.0.1:8080/ ======") # pause here for very long time by serving HTTP requests and # waiting for keyboard interruption await asyncio.sleep(100*3600) asyncio.run(main()) In the snippet we have ``handler`` which returns a regular :class:`Response` with ``"OK"`` in BODY. This *handler* is processed by ``server`` (:class:`Server` which acts as *protocol factory*). Network communication is created by :ref:`runners API ` to serve ``http://127.0.0.1:8080/``. The handler should process every request for every *path*, e.g. ``GET``, ``POST``, Web-Socket. The example is very basic: it always return ``200 OK`` response, real life code is much more complex usually. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/web_quickstart.rst0000644000175100001770000005566314607525266017352 0ustar00runnerdocker.. _aiohttp-web-quickstart: Web Server Quickstart ===================== .. currentmodule:: aiohttp.web Run a Simple Web Server ----------------------- In order to implement a web server, first create a :ref:`request handler `. A request handler must be a :ref:`coroutine ` that accepts a :class:`Request` instance as its only parameter and returns a :class:`Response` instance:: from aiohttp import web async def hello(request): return web.Response(text="Hello, world") Next, create an :class:`Application` instance and register the request handler on a particular *HTTP method* and *path*:: app = web.Application() app.add_routes([web.get('/', hello)]) After that, run the application by :func:`run_app` call:: web.run_app(app) That's it. Now, head over to ``http://localhost:8080/`` to see the results. Alternatively if you prefer *route decorators* create a *route table* and register a :term:`web-handler`:: routes = web.RouteTableDef() @routes.get('/') async def hello(request): return web.Response(text="Hello, world") app = web.Application() app.add_routes(routes) web.run_app(app) Both ways essentially do the same work, the difference is only in your taste: do you prefer *Django style* with famous ``urls.py`` or *Flask* with shiny route decorators. *aiohttp* server documentation uses both ways in code snippets to emphasize their equality, switching from one style to another is very trivial. .. seealso:: :ref:`aiohttp-web-graceful-shutdown` section explains what :func:`run_app` does and how to implement complex server initialization/finalization from scratch. :ref:`aiohttp-web-app-runners` for more handling more complex cases like *asynchronous* web application serving and multiple hosts support. .. _aiohttp-web-cli: Command Line Interface (CLI) ---------------------------- :mod:`aiohttp.web` implements a basic CLI for quickly serving an :class:`Application` in *development* over TCP/IP: .. code-block:: shell $ python -m aiohttp.web -H localhost -P 8080 package.module:init_func ``package.module:init_func`` should be an importable :term:`callable` that accepts a list of any non-parsed command-line arguments and returns an :class:`Application` instance after setting it up:: def init_func(argv): app = web.Application() app.router.add_get("/", index_handler) return app .. _aiohttp-web-handler: Handler ------- A request handler must be a :ref:`coroutine` that accepts a :class:`Request` instance as its only argument and returns a :class:`StreamResponse` derived (e.g. :class:`Response`) instance:: async def handler(request): return web.Response() Handlers are setup to handle requests by registering them with the :meth:`Application.add_routes` on a particular route (*HTTP method* and *path* pair) using helpers like :func:`get` and :func:`post`:: app.add_routes([web.get('/', handler), web.post('/post', post_handler), web.put('/put', put_handler)]) Or use *route decorators*:: routes = web.RouteTableDef() @routes.get('/') async def get_handler(request): ... @routes.post('/post') async def post_handler(request): ... @routes.put('/put') async def put_handler(request): ... app.add_routes(routes) Wildcard *HTTP method* is also supported by :func:`route` or :meth:`RouteTableDef.route`, allowing a handler to serve incoming requests on a *path* having **any** *HTTP method*:: app.add_routes([web.route('*', '/path', all_handler)]) The *HTTP method* can be queried later in the request handler using the :attr:`aiohttp.web.BaseRequest.method` property. By default endpoints added with ``GET`` method will accept ``HEAD`` requests and return the same response headers as they would for a ``GET`` request. You can also deny ``HEAD`` requests on a route:: web.get('/', handler, allow_head=False) Here ``handler`` won't be called on ``HEAD`` request and the server will respond with ``405: Method Not Allowed``. .. seealso:: :ref:`aiohttp-web-peer-disconnection` section explains how handlers behave when a client connection drops and ways to optimize handling of this. .. _aiohttp-web-resource-and-route: Resources and Routes -------------------- Internally routes are served by :attr:`Application.router` (:class:`UrlDispatcher` instance). The *router* is a list of *resources*. Resource is an entry in *route table* which corresponds to requested URL. Resource in turn has at least one *route*. Route corresponds to handling *HTTP method* by calling *web handler*. Thus when you add a *route* the *resource* object is created under the hood. The library implementation **merges** all subsequent route additions for the same path adding the only resource for all HTTP methods. Consider two examples:: app.add_routes([web.get('/path1', get_1), web.post('/path1', post_1), web.get('/path2', get_2), web.post('/path2', post_2)] and:: app.add_routes([web.get('/path1', get_1), web.get('/path2', get_2), web.post('/path2', post_2), web.post('/path1', post_1)] First one is *optimized*. You have got the idea. .. _aiohttp-web-variable-handler: Variable Resources ^^^^^^^^^^^^^^^^^^ Resource may have *variable path* also. For instance, a resource with the path ``'/a/{name}/c'`` would match all incoming requests with paths such as ``'/a/b/c'``, ``'/a/1/c'``, and ``'/a/etc/c'``. A variable *part* is specified in the form ``{identifier}``, where the ``identifier`` can be used later in a :ref:`request handler ` to access the matched value for that *part*. This is done by looking up the ``identifier`` in the :attr:`Request.match_info` mapping:: @routes.get('/{name}') async def variable_handler(request): return web.Response( text="Hello, {}".format(request.match_info['name'])) By default, each *part* matches the regular expression ``[^{}/]+``. You can also specify a custom regex in the form ``{identifier:regex}``:: web.get(r'/{name:\d+}', handler) .. _aiohttp-web-named-routes: Reverse URL Constructing using Named Resources ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Routes can also be given a *name*:: @routes.get('/root', name='root') async def handler(request): ... Which can then be used to access and build a *URL* for that resource later (e.g. in a :ref:`request handler `):: url = request.app.router['root'].url_for().with_query({"a": "b", "c": "d"}) assert url == URL('/root?a=b&c=d') A more interesting example is building *URLs* for :ref:`variable resources `:: app.router.add_resource(r'/{user}/info', name='user-info') In this case you can also pass in the *parts* of the route:: url = request.app.router['user-info'].url_for(user='john_doe') url_with_qs = url.with_query("a=b") assert url_with_qs == '/john_doe/info?a=b' Organizing Handlers in Classes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ As discussed above, :ref:`handlers ` can be first-class coroutines:: async def hello(request): return web.Response(text="Hello, world") app.router.add_get('/', hello) But sometimes it's convenient to group logically similar handlers into a Python *class*. Since :mod:`aiohttp.web` does not dictate any implementation details, application developers can organize handlers in classes if they so wish:: class Handler: def __init__(self): pass async def handle_intro(self, request): return web.Response(text="Hello, world") async def handle_greeting(self, request): name = request.match_info.get('name', "Anonymous") txt = "Hello, {}".format(name) return web.Response(text=txt) handler = Handler() app.add_routes([web.get('/intro', handler.handle_intro), web.get('/greet/{name}', handler.handle_greeting)]) .. _aiohttp-web-class-based-views: Class Based Views ^^^^^^^^^^^^^^^^^ :mod:`aiohttp.web` has support for *class based views*. You can derive from :class:`View` and define methods for handling http requests:: class MyView(web.View): async def get(self): return await get_resp(self.request) async def post(self): return await post_resp(self.request) Handlers should be coroutines accepting *self* only and returning response object as regular :term:`web-handler`. Request object can be retrieved by :attr:`View.request` property. After implementing the view (``MyView`` from example above) should be registered in application's router:: web.view('/path/to', MyView) or:: @routes.view('/path/to') class MyView(web.View): ... Example will process GET and POST requests for */path/to* but raise *405 Method not allowed* exception for unimplemented HTTP methods. Resource Views ^^^^^^^^^^^^^^ *All* registered resources in a router can be viewed using the :meth:`UrlDispatcher.resources` method:: for resource in app.router.resources(): print(resource) A *subset* of the resources that were registered with a *name* can be viewed using the :meth:`UrlDispatcher.named_resources` method:: for name, resource in app.router.named_resources().items(): print(name, resource) .. _aiohttp-web-alternative-routes-definition: Alternative ways for registering routes --------------------------------------- Code examples shown above use *imperative* style for adding new routes: they call ``app.router.add_get(...)`` etc. There are two alternatives: route tables and route decorators. Route tables look like Django way:: async def handle_get(request): ... async def handle_post(request): ... app.router.add_routes([web.get('/get', handle_get), web.post('/post', handle_post), The snippet calls :meth:`~aiohttp.web.UrlDispatcher.add_routes` to register a list of *route definitions* (:class:`aiohttp.web.RouteDef` instances) created by :func:`aiohttp.web.get` or :func:`aiohttp.web.post` functions. .. seealso:: :ref:`aiohttp-web-route-def` reference. Route decorators are closer to Flask approach:: routes = web.RouteTableDef() @routes.get('/get') async def handle_get(request): ... @routes.post('/post') async def handle_post(request): ... app.router.add_routes(routes) It is also possible to use decorators with class-based views:: routes = web.RouteTableDef() @routes.view("/view") class MyView(web.View): async def get(self): ... async def post(self): ... app.router.add_routes(routes) The example creates a :class:`aiohttp.web.RouteTableDef` container first. The container is a list-like object with additional decorators :meth:`aiohttp.web.RouteTableDef.get`, :meth:`aiohttp.web.RouteTableDef.post` etc. for registering new routes. After filling the container :meth:`~aiohttp.web.UrlDispatcher.add_routes` is used for adding registered *route definitions* into application's router. .. seealso:: :ref:`aiohttp-web-route-table-def` reference. All tree ways (imperative calls, route tables and decorators) are equivalent, you could use what do you prefer or even mix them on your own. .. versionadded:: 2.3 JSON Response ------------- It is a common case to return JSON data in response, :mod:`aiohttp.web` provides a shortcut for returning JSON -- :func:`aiohttp.web.json_response`:: async def handler(request): data = {'some': 'data'} return web.json_response(data) The shortcut method returns :class:`aiohttp.web.Response` instance so you can for example set cookies before returning it from handler. User Sessions ------------- Often you need a container for storing user data across requests. The concept is usually called a *session*. :mod:`aiohttp.web` has no built-in concept of a *session*, however, there is a third-party library, :mod:`aiohttp_session`, that adds *session* support:: import asyncio import time import base64 from cryptography import fernet from aiohttp import web from aiohttp_session import setup, get_session, session_middleware from aiohttp_session.cookie_storage import EncryptedCookieStorage async def handler(request): session = await get_session(request) last_visit = session['last_visit'] if 'last_visit' in session else None text = 'Last visited: {}'.format(last_visit) return web.Response(text=text) async def make_app(): app = web.Application() # secret_key must be 32 url-safe base64-encoded bytes fernet_key = fernet.Fernet.generate_key() secret_key = base64.urlsafe_b64decode(fernet_key) setup(app, EncryptedCookieStorage(secret_key)) app.add_routes([web.get('/', handler)]) return app web.run_app(make_app()) .. _aiohttp-web-forms: HTTP Forms ---------- HTTP Forms are supported out of the box. If form's method is ``"GET"`` (``
    ``) use :attr:`aiohttp.web.BaseRequest.query` for getting form data. To access form data with ``"POST"`` method use :meth:`aiohttp.web.BaseRequest.post` or :meth:`aiohttp.web.BaseRequest.multipart`. :meth:`aiohttp.web.BaseRequest.post` accepts both ``'application/x-www-form-urlencoded'`` and ``'multipart/form-data'`` form's data encoding (e.g. ````). It stores files data in temporary directory. If `client_max_size` is specified `post` raises `ValueError` exception. For efficiency use :meth:`aiohttp.web.BaseRequest.multipart`, It is especially effective for uploading large files (:ref:`aiohttp-web-file-upload`). Values submitted by the following form: .. code-block:: html
    could be accessed as:: async def do_login(request): data = await request.post() login = data['login'] password = data['password'] .. _aiohttp-web-file-upload: File Uploads ------------ :mod:`aiohttp.web` has built-in support for handling files uploaded from the browser. First, make sure that the HTML ``
    `` element has its *enctype* attribute set to ``enctype="multipart/form-data"``. As an example, here is a form that accepts an MP3 file: .. code-block:: html
    Then, in the :ref:`request handler ` you can access the file input field as a :class:`FileField` instance. :class:`FileField` is simply a container for the file as well as some of its metadata:: async def store_mp3_handler(request): # WARNING: don't do that if you plan to receive large files! data = await request.post() mp3 = data['mp3'] # .filename contains the name of the file in string format. filename = mp3.filename # .file contains the actual file data that needs to be stored somewhere. mp3_file = data['mp3'].file content = mp3_file.read() return web.Response(body=content, headers=MultiDict( {'CONTENT-DISPOSITION': mp3_file})) You might have noticed a big warning in the example above. The general issue is that :meth:`aiohttp.web.BaseRequest.post` reads the whole payload in memory, resulting in possible :abbr:`OOM (Out Of Memory)` errors. To avoid this, for multipart uploads, you should use :meth:`aiohttp.web.BaseRequest.multipart` which returns a :ref:`multipart reader `:: async def store_mp3_handler(request): reader = await request.multipart() # /!\ Don't forget to validate your inputs /!\ # reader.next() will `yield` the fields of your form field = await reader.next() assert field.name == 'name' name = await field.read(decode=True) field = await reader.next() assert field.name == 'mp3' filename = field.filename # You cannot rely on Content-Length if transfer is chunked. size = 0 with open(os.path.join('/spool/yarrr-media/mp3/', filename), 'wb') as f: while True: chunk = await field.read_chunk() # 8192 bytes by default. if not chunk: break size += len(chunk) f.write(chunk) return web.Response(text='{} sized of {} successfully stored' ''.format(filename, size)) .. _aiohttp-web-websockets: WebSockets ---------- :mod:`aiohttp.web` supports *WebSockets* out-of-the-box. To setup a *WebSocket*, create a :class:`WebSocketResponse` in a :ref:`request handler ` and then use it to communicate with the peer:: async def websocket_handler(request): ws = web.WebSocketResponse() await ws.prepare(request) async for msg in ws: if msg.type == aiohttp.WSMsgType.TEXT: if msg.data == 'close': await ws.close() else: await ws.send_str(msg.data + '/answer') elif msg.type == aiohttp.WSMsgType.ERROR: print('ws connection closed with exception %s' % ws.exception()) print('websocket connection closed') return ws The handler should be registered as HTTP GET processor:: app.add_routes([web.get('/ws', websocket_handler)]) .. _aiohttp-web-redirects: Redirects --------- To redirect user to another endpoint - raise :class:`HTTPFound` with an absolute URL, relative URL or view name (the argument from router):: raise web.HTTPFound('/redirect') The following example shows redirect to view named 'login' in routes:: async def handler(request): location = request.app.router['login'].url_for() raise web.HTTPFound(location=location) router.add_get('/handler', handler) router.add_get('/login', login_handler, name='login') Example with login validation:: @aiohttp_jinja2.template('login.html') async def login(request): if request.method == 'POST': form = await request.post() error = validate_login(form) if error: return {'error': error} else: # login form is valid location = request.app.router['index'].url_for() raise web.HTTPFound(location=location) return {} app.router.add_get('/', index, name='index') app.router.add_get('/login', login, name='login') app.router.add_post('/login', login, name='login') .. _aiohttp-web-exceptions: Exceptions ---------- :mod:`aiohttp.web` defines a set of exceptions for every *HTTP status code*. Each exception is a subclass of :class:`~HTTPException` and relates to a single HTTP status code:: async def handler(request): raise aiohttp.web.HTTPFound('/redirect') .. warning:: Returning :class:`~HTTPException` or its subclasses is deprecated and will be removed in subsequent aiohttp versions. Each exception class has a status code according to :rfc:`2068`: codes with 100-300 are not really errors; 400s are client errors, and 500s are server errors. HTTP Exception hierarchy chart:: Exception HTTPException HTTPSuccessful * 200 - HTTPOk * 201 - HTTPCreated * 202 - HTTPAccepted * 203 - HTTPNonAuthoritativeInformation * 204 - HTTPNoContent * 205 - HTTPResetContent * 206 - HTTPPartialContent HTTPRedirection * 300 - HTTPMultipleChoices * 301 - HTTPMovedPermanently * 302 - HTTPFound * 303 - HTTPSeeOther * 304 - HTTPNotModified * 305 - HTTPUseProxy * 307 - HTTPTemporaryRedirect * 308 - HTTPPermanentRedirect HTTPError HTTPClientError * 400 - HTTPBadRequest * 401 - HTTPUnauthorized * 402 - HTTPPaymentRequired * 403 - HTTPForbidden * 404 - HTTPNotFound * 405 - HTTPMethodNotAllowed * 406 - HTTPNotAcceptable * 407 - HTTPProxyAuthenticationRequired * 408 - HTTPRequestTimeout * 409 - HTTPConflict * 410 - HTTPGone * 411 - HTTPLengthRequired * 412 - HTTPPreconditionFailed * 413 - HTTPRequestEntityTooLarge * 414 - HTTPRequestURITooLong * 415 - HTTPUnsupportedMediaType * 416 - HTTPRequestRangeNotSatisfiable * 417 - HTTPExpectationFailed * 421 - HTTPMisdirectedRequest * 422 - HTTPUnprocessableEntity * 424 - HTTPFailedDependency * 426 - HTTPUpgradeRequired * 428 - HTTPPreconditionRequired * 429 - HTTPTooManyRequests * 431 - HTTPRequestHeaderFieldsTooLarge * 451 - HTTPUnavailableForLegalReasons HTTPServerError * 500 - HTTPInternalServerError * 501 - HTTPNotImplemented * 502 - HTTPBadGateway * 503 - HTTPServiceUnavailable * 504 - HTTPGatewayTimeout * 505 - HTTPVersionNotSupported * 506 - HTTPVariantAlsoNegotiates * 507 - HTTPInsufficientStorage * 510 - HTTPNotExtended * 511 - HTTPNetworkAuthenticationRequired All HTTP exceptions have the same constructor signature:: HTTPNotFound(*, headers=None, reason=None, body=None, text=None, content_type=None) If not directly specified, *headers* will be added to the *default response headers*. Classes :class:`HTTPMultipleChoices`, :class:`HTTPMovedPermanently`, :class:`HTTPFound`, :class:`HTTPSeeOther`, :class:`HTTPUseProxy`, :class:`HTTPTemporaryRedirect` have the following constructor signature:: HTTPFound(location, *, headers=None, reason=None, body=None, text=None, content_type=None) where *location* is value for *Location HTTP header*. :class:`HTTPMethodNotAllowed` is constructed by providing the incoming unsupported method and list of allowed methods:: HTTPMethodNotAllowed(method, allowed_methods, *, headers=None, reason=None, body=None, text=None, content_type=None) :class:`HTTPUnavailableForLegalReasons` should be constructed with a ``link`` to yourself (as the entity implementing the blockage), and an explanation for the block included in ``text``.:: HTTPUnavailableForLegalReasons(link, *, headers=None, reason=None, body=None, text=None, content_type=None) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/web_reference.rst0000644000175100001770000030321214607525266017100 0ustar00runnerdocker.. _aiohttp-web-reference: Server Reference ================ .. currentmodule:: aiohttp.web .. _aiohttp-web-request: Request and Base Request ------------------------ The Request object contains all the information about an incoming HTTP request. :class:`BaseRequest` is used for :ref:`Low-Level Servers` (which have no applications, routers, signals and middlewares). :class:`Request` has an :attr:`Request.app` and :attr:`Request.match_info` attributes. A :class:`BaseRequest` / :class:`Request` are :obj:`dict` like objects, allowing them to be used for :ref:`sharing data` among :ref:`aiohttp-web-middlewares` and :ref:`aiohttp-web-signals` handlers. .. class:: BaseRequest .. attribute:: version *HTTP version* of request, Read-only property. Returns :class:`aiohttp.protocol.HttpVersion` instance. .. attribute:: method *HTTP method*, read-only property. The value is upper-cased :class:`str` like ``"GET"``, ``"POST"``, ``"PUT"`` etc. .. attribute:: url A :class:`~yarl.URL` instance with absolute URL to resource (*scheme*, *host* and *port* are included). .. note:: In case of malformed request (e.g. without ``"HOST"`` HTTP header) the absolute url may be unavailable. .. attribute:: rel_url A :class:`~yarl.URL` instance with relative URL to resource (contains *path*, *query* and *fragment* parts only, *scheme*, *host* and *port* are excluded). The property is equal to ``.url.relative()`` but is always present. .. seealso:: A note from :attr:`url`. .. attribute:: scheme A string representing the scheme of the request. The scheme is ``'https'`` if transport for request handling is *SSL*, ``'http'`` otherwise. The value could be overridden by :meth:`~BaseRequest.clone`. Read-only :class:`str` property. .. versionchanged:: 2.3 *Forwarded* and *X-Forwarded-Proto* are not used anymore. Call ``.clone(scheme=new_scheme)`` for setting up the value explicitly. .. seealso:: :ref:`aiohttp-web-forwarded-support` .. attribute:: secure Shorthand for ``request.url.scheme == 'https'`` Read-only :class:`bool` property. .. seealso:: :attr:`scheme` .. attribute:: forwarded A tuple containing all parsed Forwarded header(s). Makes an effort to parse Forwarded headers as specified by :rfc:`7239`: - It adds one (immutable) dictionary per Forwarded ``field-value``, i.e. per proxy. The element corresponds to the data in the Forwarded ``field-value`` added by the first proxy encountered by the client. Each subsequent item corresponds to those added by later proxies. - It checks that every value has valid syntax in general as specified in :rfc:`7239#section-4`: either a ``token`` or a ``quoted-string``. - It un-escapes ``quoted-pairs``. - It does NOT validate 'by' and 'for' contents as specified in :rfc:`7239#section-6`. - It does NOT validate ``host`` contents (Host ABNF). - It does NOT validate ``proto`` contents for valid URI scheme names. Returns a tuple containing one or more ``MappingProxy`` objects .. seealso:: :attr:`scheme` .. seealso:: :attr:`host` .. attribute:: host Host name of the request, resolved in this order: - Overridden value by :meth:`~BaseRequest.clone` call. - *Host* HTTP header - :func:`socket.getfqdn` Read-only :class:`str` property. .. versionchanged:: 2.3 *Forwarded* and *X-Forwarded-Host* are not used anymore. Call ``.clone(host=new_host)`` for setting up the value explicitly. .. seealso:: :ref:`aiohttp-web-forwarded-support` .. attribute:: remote Originating IP address of a client initiated HTTP request. The IP is resolved through the following headers, in this order: - Overridden value by :meth:`~BaseRequest.clone` call. - Peer name of opened socket. Read-only :class:`str` property. Call ``.clone(remote=new_remote)`` for setting up the value explicitly. .. versionadded:: 2.3 .. seealso:: :ref:`aiohttp-web-forwarded-support` .. attribute:: client_max_size The maximum size of the request body. The value could be overridden by :meth:`~BaseRequest.clone`. Read-only :class:`int` property. .. attribute:: path_qs The URL including PATH_INFO and the query string. e.g., ``/app/blog?id=10`` Read-only :class:`str` property. .. attribute:: path The URL including *PATH INFO* without the host or scheme. e.g., ``/app/blog``. The path is URL-decoded. For raw path info see :attr:`raw_path`. Read-only :class:`str` property. .. attribute:: raw_path The URL including raw *PATH INFO* without the host or scheme. Warning, the path may be URL-encoded and may contain invalid URL characters, e.g. ``/my%2Fpath%7Cwith%21some%25strange%24characters``. For URL-decoded version please take a look on :attr:`path`. Read-only :class:`str` property. .. attribute:: query A multidict with all the variables in the query string. Read-only :class:`~multidict.MultiDictProxy` lazy property. .. attribute:: query_string The query string in the URL, e.g., ``id=10`` Read-only :class:`str` property. .. attribute:: headers A case-insensitive multidict proxy with all headers. Read-only :class:`~multidict.CIMultiDictProxy` property. .. attribute:: raw_headers HTTP headers of response as unconverted bytes, a sequence of ``(key, value)`` pairs. .. attribute:: keep_alive ``True`` if keep-alive connection enabled by HTTP client and protocol version supports it, otherwise ``False``. Read-only :class:`bool` property. .. attribute:: transport A :ref:`transport` used to process request. Read-only property. The property can be used, for example, for getting IP address of client's peer:: peername = request.transport.get_extra_info('peername') if peername is not None: host, port = peername .. attribute:: loop An event loop instance used by HTTP request handling. Read-only :class:`asyncio.AbstractEventLoop` property. .. deprecated:: 3.5 .. attribute:: cookies A read-only dictionary-like object containing the request's cookies. Read-only :class:`~types.MappingProxyType` property. .. attribute:: content A :class:`~aiohttp.StreamReader` instance, input stream for reading request's *BODY*. Read-only property. .. attribute:: body_exists Return ``True`` if request has *HTTP BODY*, ``False`` otherwise. Read-only :class:`bool` property. .. versionadded:: 2.3 .. attribute:: can_read_body Return ``True`` if request's *HTTP BODY* can be read, ``False`` otherwise. Read-only :class:`bool` property. .. versionadded:: 2.3 .. attribute:: has_body Return ``True`` if request's *HTTP BODY* can be read, ``False`` otherwise. Read-only :class:`bool` property. .. deprecated:: 2.3 Use :meth:`can_read_body` instead. .. attribute:: content_type Read-only property with *content* part of *Content-Type* header. Returns :class:`str` like ``'text/html'`` .. note:: Returns value is ``'application/octet-stream'`` if no Content-Type header present in HTTP headers according to :rfc:`2616` .. attribute:: charset Read-only property that specifies the *encoding* for the request's BODY. The value is parsed from the *Content-Type* HTTP header. Returns :class:`str` like ``'utf-8'`` or ``None`` if *Content-Type* has no charset information. .. attribute:: content_length Read-only property that returns length of the request's BODY. The value is parsed from the *Content-Length* HTTP header. Returns :class:`int` or ``None`` if *Content-Length* is absent. .. attribute:: http_range Read-only property that returns information about *Range* HTTP header. Returns a :class:`slice` where ``.start`` is *left inclusive bound*, ``.stop`` is *right exclusive bound* and ``.step`` is ``1``. The property might be used in two manners: 1. Attribute-access style (example assumes that both left and right borders are set, the real logic for case of open bounds is more complex):: rng = request.http_range with open(filename, 'rb') as f: f.seek(rng.start) return f.read(rng.stop-rng.start) 2. Slice-style:: return buffer[request.http_range] .. attribute:: if_modified_since Read-only property that returns the date specified in the *If-Modified-Since* header. Returns :class:`datetime.datetime` or ``None`` if *If-Modified-Since* header is absent or is not a valid HTTP date. .. attribute:: if_unmodified_since Read-only property that returns the date specified in the *If-Unmodified-Since* header. Returns :class:`datetime.datetime` or ``None`` if *If-Unmodified-Since* header is absent or is not a valid HTTP date. .. versionadded:: 3.1 .. attribute:: if_match Read-only property that returns :class:`~aiohttp.ETag` objects specified in the *If-Match* header. Returns :class:`tuple` of :class:`~aiohttp.ETag` or ``None`` if *If-Match* header is absent. .. versionadded:: 3.8 .. attribute:: if_none_match Read-only property that returns :class:`~aiohttp.ETag` objects specified *If-None-Match* header. Returns :class:`tuple` of :class:`~aiohttp.ETag` or ``None`` if *If-None-Match* header is absent. .. versionadded:: 3.8 .. attribute:: if_range Read-only property that returns the date specified in the *If-Range* header. Returns :class:`datetime.datetime` or ``None`` if *If-Range* header is absent or is not a valid HTTP date. .. versionadded:: 3.1 .. method:: clone(*, method=..., rel_url=..., headers=...) Clone itself with replacement some attributes. Creates and returns a new instance of Request object. If no parameters are given, an exact copy is returned. If a parameter is not passed, it will reuse the one from the current request object. :param str method: http method :param rel_url: url to use, :class:`str` or :class:`~yarl.URL` :param headers: :class:`~multidict.CIMultiDict` or compatible headers container. :return: a cloned :class:`Request` instance. .. method:: get_extra_info(name, default=None) Reads extra information from the protocol's transport. If no value associated with ``name`` is found, ``default`` is returned. See :meth:`asyncio.BaseTransport.get_extra_info` :param str name: The key to look up in the transport extra information. :param default: Default value to be used when no value for ``name`` is found (default is ``None``). .. versionadded:: 3.7 .. method:: read() :async: Read request body, returns :class:`bytes` object with body content. .. note:: The method **does** store read data internally, subsequent :meth:`~aiohttp.web.BaseRequest.read` call will return the same value. .. method:: text() :async: Read request body, decode it using :attr:`charset` encoding or ``UTF-8`` if no encoding was specified in *MIME-type*. Returns :class:`str` with body content. .. note:: The method **does** store read data internally, subsequent :meth:`~aiohttp.web.BaseRequest.text` call will return the same value. .. method:: json(*, loads=json.loads) :async: Read request body decoded as *json*. The method is just a boilerplate :ref:`coroutine ` implemented as:: async def json(self, *, loads=json.loads): body = await self.text() return loads(body) :param collections.abc.Callable loads: any :term:`callable` that accepts :class:`str` and returns :class:`dict` with parsed JSON (:func:`json.loads` by default). .. note:: The method **does** store read data internally, subsequent :meth:`~aiohttp.web.BaseRequest.json` call will return the same value. .. method:: multipart() :async: Returns :class:`aiohttp.MultipartReader` which processes incoming *multipart* request. The method is just a boilerplate :ref:`coroutine ` implemented as:: async def multipart(self, *, reader=aiohttp.multipart.MultipartReader): return reader(self.headers, self._payload) This method is a coroutine for consistency with the else reader methods. .. warning:: The method **does not** store read data internally. That means once you exhausts multipart reader, you cannot get the request payload one more time. .. seealso:: :ref:`aiohttp-multipart` .. versionchanged:: 3.4 Dropped *reader* parameter. .. method:: post() :async: A :ref:`coroutine ` that reads POST parameters from request body. Returns :class:`~multidict.MultiDictProxy` instance filled with parsed data. If :attr:`method` is not *POST*, *PUT*, *PATCH*, *TRACE* or *DELETE* or :attr:`content_type` is not empty or *application/x-www-form-urlencoded* or *multipart/form-data* returns empty multidict. .. note:: The method **does** store read data internally, subsequent :meth:`~aiohttp.web.BaseRequest.post` call will return the same value. .. method:: release() :async: Release request. Eat unread part of HTTP BODY if present. .. note:: User code may never call :meth:`~aiohttp.web.BaseRequest.release`, all required work will be processed by :mod:`aiohttp.web` internal machinery. .. class:: Request A request used for receiving request's information by *web handler*. Every :ref:`handler` accepts a request instance as the first positional parameter. The class in derived from :class:`BaseRequest`, shares all parent's attributes and methods but has a couple of additional properties: .. attribute:: match_info Read-only property with :class:`~aiohttp.abc.AbstractMatchInfo` instance for result of route resolving. .. note:: Exact type of property depends on used router. If ``app.router`` is :class:`UrlDispatcher` the property contains :class:`UrlMappingMatchInfo` instance. .. attribute:: app An :class:`Application` instance used to call :ref:`request handler `, Read-only property. .. attribute:: config_dict A :class:`aiohttp.ChainMapProxy` instance for mapping all properties from the current application returned by :attr:`app` property and all its parents. .. seealso:: :ref:`aiohttp-web-data-sharing-app-config` .. versionadded:: 3.2 .. note:: You should never create the :class:`Request` instance manually -- :mod:`aiohttp.web` does it for you. But :meth:`~BaseRequest.clone` may be used for cloning *modified* request copy with changed *path*, *method* etc. .. _aiohttp-web-response: Response classes ---------------- For now, :mod:`aiohttp.web` has three classes for the *HTTP response*: :class:`StreamResponse`, :class:`Response` and :class:`FileResponse`. Usually you need to use the second one. :class:`StreamResponse` is intended for streaming data, while :class:`Response` contains *HTTP BODY* as an attribute and sends own content as single piece with the correct *Content-Length HTTP header*. For sake of design decisions :class:`Response` is derived from :class:`StreamResponse` parent class. The response supports *keep-alive* handling out-of-the-box if *request* supports it. You can disable *keep-alive* by :meth:`~StreamResponse.force_close` though. The common case for sending an answer from :ref:`web-handler` is returning a :class:`Response` instance:: async def handler(request): return Response(text="All right!") Response classes are :obj:`dict` like objects, allowing them to be used for :ref:`sharing data` among :ref:`aiohttp-web-middlewares` and :ref:`aiohttp-web-signals` handlers:: resp['key'] = value .. versionadded:: 3.0 Dict-like interface support. .. class:: StreamResponse(*, status=200, reason=None) The base class for the *HTTP response* handling. Contains methods for setting *HTTP response headers*, *cookies*, *response status code*, writing *HTTP response BODY* and so on. The most important thing you should know about *response* --- it is *Finite State Machine*. That means you can do any manipulations with *headers*, *cookies* and *status code* only before :meth:`prepare` coroutine is called. Once you call :meth:`prepare` any change of the *HTTP header* part will raise :exc:`RuntimeError` exception. Any :meth:`write` call after :meth:`write_eof` is also forbidden. :param int status: HTTP status code, ``200`` by default. :param str reason: HTTP reason. If param is ``None`` reason will be calculated basing on *status* parameter. Otherwise pass :class:`str` with arbitrary *status* explanation.. .. attribute:: prepared Read-only :class:`bool` property, ``True`` if :meth:`prepare` has been called, ``False`` otherwise. .. attribute:: task A task that serves HTTP request handling. May be useful for graceful shutdown of long-running requests (streaming, long polling or web-socket). .. attribute:: status Read-only property for *HTTP response status code*, :class:`int`. ``200`` (OK) by default. .. attribute:: reason Read-only property for *HTTP response reason*, :class:`str`. .. method:: set_status(status, reason=None) Set :attr:`status` and :attr:`reason`. *reason* value is auto calculated if not specified (``None``). .. attribute:: keep_alive Read-only property, copy of :attr:`aiohttp.web.BaseRequest.keep_alive` by default. Can be switched to ``False`` by :meth:`force_close` call. .. method:: force_close Disable :attr:`keep_alive` for connection. There are no ways to enable it back. .. attribute:: compression Read-only :class:`bool` property, ``True`` if compression is enabled. ``False`` by default. .. seealso:: :meth:`enable_compression` .. method:: enable_compression(force=None) Enable compression. When *force* is unset compression encoding is selected based on the request's *Accept-Encoding* header. *Accept-Encoding* is not checked if *force* is set to a :class:`ContentCoding`. .. seealso:: :attr:`compression` .. attribute:: chunked Read-only property, indicates if chunked encoding is on. Can be enabled by :meth:`enable_chunked_encoding` call. .. seealso:: :attr:`enable_chunked_encoding` .. method:: enable_chunked_encoding Enables :attr:`chunked` encoding for response. There are no ways to disable it back. With enabled :attr:`chunked` encoding each :meth:`write` operation encoded in separate chunk. .. warning:: chunked encoding can be enabled for ``HTTP/1.1`` only. Setting up both :attr:`content_length` and chunked encoding is mutually exclusive. .. seealso:: :attr:`chunked` .. attribute:: headers :class:`~multidict.CIMultiDict` instance for *outgoing* *HTTP headers*. .. attribute:: cookies An instance of :class:`http.cookies.SimpleCookie` for *outgoing* cookies. .. warning:: Direct setting up *Set-Cookie* header may be overwritten by explicit calls to cookie manipulation. We are encourage using of :attr:`cookies` and :meth:`set_cookie`, :meth:`del_cookie` for cookie manipulations. .. method:: set_cookie(name, value, *, path='/', expires=None, \ domain=None, max_age=None, \ secure=None, httponly=None, version=None, \ samesite=None) Convenient way for setting :attr:`cookies`, allows to specify some additional properties like *max_age* in a single call. :param str name: cookie name :param str value: cookie value (will be converted to :class:`str` if value has another type). :param expires: expiration date (optional) :param str domain: cookie domain (optional) :param int max_age: defines the lifetime of the cookie, in seconds. The delta-seconds value is a decimal non- negative integer. After delta-seconds seconds elapse, the client should discard the cookie. A value of zero means the cookie should be discarded immediately. (optional) :param str path: specifies the subset of URLs to which this cookie applies. (optional, ``'/'`` by default) :param bool secure: attribute (with no value) directs the user agent to use only (unspecified) secure means to contact the origin server whenever it sends back this cookie. The user agent (possibly under the user's control) may determine what level of security it considers appropriate for "secure" cookies. The *secure* should be considered security advice from the server to the user agent, indicating that it is in the session's interest to protect the cookie contents. (optional) :param bool httponly: ``True`` if the cookie HTTP only (optional) :param int version: a decimal integer, identifies to which version of the state management specification the cookie conforms. (optional) :param str samesite: Asserts that a cookie must not be sent with cross-origin requests, providing some protection against cross-site request forgery attacks. Generally the value should be one of: ``None``, ``Lax`` or ``Strict``. (optional) .. versionadded:: 3.7 .. warning:: In HTTP version 1.1, ``expires`` was deprecated and replaced with the easier-to-use ``max-age``, but Internet Explorer (IE6, IE7, and IE8) **does not** support ``max-age``. .. method:: del_cookie(name, *, path='/', domain=None) Deletes cookie. :param str name: cookie name :param str domain: optional cookie domain :param str path: optional cookie path, ``'/'`` by default .. attribute:: content_length *Content-Length* for outgoing response. .. attribute:: content_type *Content* part of *Content-Type* for outgoing response. .. attribute:: charset *Charset* aka *encoding* part of *Content-Type* for outgoing response. The value converted to lower-case on attribute assigning. .. attribute:: last_modified *Last-Modified* header for outgoing response. This property accepts raw :class:`str` values, :class:`datetime.datetime` objects, Unix timestamps specified as an :class:`int` or a :class:`float` object, and the value ``None`` to unset the header. .. attribute:: etag *ETag* header for outgoing response. This property accepts raw :class:`str` values, :class:`~aiohttp.ETag` objects and the value ``None`` to unset the header. In case of :class:`str` input, etag is considered as strong by default. **Do not** use double quotes ``"`` in the etag value, they will be added automatically. .. versionadded:: 3.8 .. method:: prepare(request) :async: :param aiohttp.web.Request request: HTTP request object, that the response answers. Send *HTTP header*. You should not change any header data after calling this method. The coroutine calls :attr:`~aiohttp.web.Application.on_response_prepare` signal handlers after default headers have been computed and directly before headers are sent. .. method:: write(data) :async: Send byte-ish data as the part of *response BODY*:: await resp.write(data) :meth:`prepare` must be invoked before the call. Raises :exc:`TypeError` if data is not :class:`bytes`, :class:`bytearray` or :class:`memoryview` instance. Raises :exc:`RuntimeError` if :meth:`prepare` has not been called. Raises :exc:`RuntimeError` if :meth:`write_eof` has been called. .. method:: write_eof() :async: A :ref:`coroutine` *may* be called as a mark of the *HTTP response* processing finish. *Internal machinery* will call this method at the end of the request processing if needed. After :meth:`write_eof` call any manipulations with the *response* object are forbidden. .. class:: Response(*, body=None, status=200, reason=None, text=None, \ headers=None, content_type=None, charset=None, \ zlib_executor_size=sentinel, zlib_executor=None) The most usable response class, inherited from :class:`StreamResponse`. Accepts *body* argument for setting the *HTTP response BODY*. The actual :attr:`body` sending happens in overridden :meth:`~StreamResponse.write_eof`. :param bytes body: response's BODY :param int status: HTTP status code, 200 OK by default. :param collections.abc.Mapping headers: HTTP headers that should be added to response's ones. :param str text: response's BODY :param str content_type: response's content type. ``'text/plain'`` if *text* is passed also, ``'application/octet-stream'`` otherwise. :param str charset: response's charset. ``'utf-8'`` if *text* is passed also, ``None`` otherwise. :param int zlib_executor_size: length in bytes which will trigger zlib compression of body to happen in an executor .. versionadded:: 3.5 :param int zlib_executor: executor to use for zlib compression .. versionadded:: 3.5 .. attribute:: body Read-write attribute for storing response's content aka BODY, :class:`bytes`. Assigning :class:`str` to :attr:`body` will make the :attr:`body` type of :class:`aiohttp.payload.StringPayload`, which tries to encode the given data based on *Content-Type* HTTP header, while defaulting to ``UTF-8``. .. attribute:: text Read-write attribute for storing response's :attr:`~aiohttp.StreamResponse.body`, represented as :class:`str`. .. class:: WebSocketResponse(*, timeout=10.0, receive_timeout=None, \ autoclose=True, autoping=True, heartbeat=None, \ protocols=(), compress=True, max_msg_size=4194304) Class for handling server-side websockets, inherited from :class:`StreamResponse`. After starting (by :meth:`prepare` call) the response you cannot use :meth:`~StreamResponse.write` method but should to communicate with websocket client by :meth:`send_str`, :meth:`receive` and others. To enable back-pressure from slow websocket clients treat methods :meth:`ping()`, :meth:`pong()`, :meth:`send_str()`, :meth:`send_bytes()`, :meth:`send_json()` as coroutines. By default write buffer size is set to 64k. :param bool autoping: Automatically send :const:`~aiohttp.WSMsgType.PONG` on :const:`~aiohttp.WSMsgType.PING` message from client, and handle :const:`~aiohttp.WSMsgType.PONG` responses from client. Note that server does not send :const:`~aiohttp.WSMsgType.PING` requests, you need to do this explicitly using :meth:`ping` method. :param float heartbeat: Send `ping` message every `heartbeat` seconds and wait `pong` response, close connection if `pong` response is not received. The timer is reset on any data reception. :param float receive_timeout: Timeout value for `receive` operations. Default value is None (no timeout for receive operation) :param bool compress: Enable per-message deflate extension support. False for disabled, default value is True. :param int max_msg_size: maximum size of read websocket message, 4 MB by default. To disable the size limit use ``0``. .. versionadded:: 3.3 :param bool autoclose: Close connection when the client sends a :const:`~aiohttp.WSMsgType.CLOSE` message, ``True`` by default. If set to ``False``, the connection is not closed and the caller is responsible for calling ``request.transport.close()`` to avoid leaking resources. The class supports ``async for`` statement for iterating over incoming messages:: ws = web.WebSocketResponse() await ws.prepare(request) async for msg in ws: print(msg.data) .. method:: prepare(request) :async: Starts websocket. After the call you can use websocket methods. :param aiohttp.web.Request request: HTTP request object, that the response answers. :raises HTTPException: if websocket handshake has failed. .. method:: can_prepare(request) Performs checks for *request* data to figure out if websocket can be started on the request. If :meth:`can_prepare` call is success then :meth:`prepare` will success too. :param aiohttp.web.Request request: HTTP request object, that the response answers. :return: :class:`WebSocketReady` instance. :attr:`WebSocketReady.ok` is ``True`` on success, :attr:`WebSocketReady.protocol` is websocket subprotocol which is passed by client and accepted by server (one of *protocols* sequence from :class:`WebSocketResponse` ctor). :attr:`WebSocketReady.protocol` may be ``None`` if client and server subprotocols are not overlapping. .. note:: The method never raises exception. .. attribute:: closed Read-only property, ``True`` if connection has been closed or in process of closing. :const:`~aiohttp.WSMsgType.CLOSE` message has been received from peer. .. attribute:: close_code Read-only property, close code from peer. It is set to ``None`` on opened connection. .. attribute:: ws_protocol Websocket *subprotocol* chosen after :meth:`start` call. May be ``None`` if server and client protocols are not overlapping. .. method:: get_extra_info(name, default=None) Reads optional extra information from the writer's transport. If no value associated with ``name`` is found, ``default`` is returned. See :meth:`asyncio.BaseTransport.get_extra_info` :param str name: The key to look up in the transport extra information. :param default: Default value to be used when no value for ``name`` is found (default is ``None``). .. method:: exception() Returns last occurred exception or None. .. method:: ping(message=b'') :async: Send :const:`~aiohttp.WSMsgType.PING` to peer. :param message: optional payload of *ping* message, :class:`str` (converted to *UTF-8* encoded bytes) or :class:`bytes`. :raise RuntimeError: if connections is not started or closing. .. versionchanged:: 3.0 The method is converted into :term:`coroutine` .. method:: pong(message=b'') :async: Send *unsolicited* :const:`~aiohttp.WSMsgType.PONG` to peer. :param message: optional payload of *pong* message, :class:`str` (converted to *UTF-8* encoded bytes) or :class:`bytes`. :raise RuntimeError: if connections is not started or closing. .. versionchanged:: 3.0 The method is converted into :term:`coroutine` .. method:: send_str(data, compress=None) :async: Send *data* to peer as :const:`~aiohttp.WSMsgType.TEXT` message. :param str data: data to send. :param int compress: sets specific level of compression for single message, ``None`` for not overriding per-socket setting. :raise RuntimeError: if connection is not started or closing :raise TypeError: if data is not :class:`str` .. versionchanged:: 3.0 The method is converted into :term:`coroutine`, *compress* parameter added. .. method:: send_bytes(data, compress=None) :async: Send *data* to peer as :const:`~aiohttp.WSMsgType.BINARY` message. :param data: data to send. :param int compress: sets specific level of compression for single message, ``None`` for not overriding per-socket setting. :raise RuntimeError: if connection is not started or closing :raise TypeError: if data is not :class:`bytes`, :class:`bytearray` or :class:`memoryview`. .. versionchanged:: 3.0 The method is converted into :term:`coroutine`, *compress* parameter added. .. method:: send_json(data, compress=None, *, dumps=json.dumps) :async: Send *data* to peer as JSON string. :param data: data to send. :param int compress: sets specific level of compression for single message, ``None`` for not overriding per-socket setting. :param collections.abc.Callable dumps: any :term:`callable` that accepts an object and returns a JSON string (:func:`json.dumps` by default). :raise RuntimeError: if connection is not started or closing :raise ValueError: if data is not serializable object :raise TypeError: if value returned by ``dumps`` param is not :class:`str` .. versionchanged:: 3.0 The method is converted into :term:`coroutine`, *compress* parameter added. .. method:: close(*, code=WSCloseCode.OK, message=b'', drain=True) :async: A :ref:`coroutine` that initiates closing handshake by sending :const:`~aiohttp.WSMsgType.CLOSE` message. It is safe to call `close()` from different task. :param int code: closing code. See also :class:`~aiohttp.WSCloseCode`. :param message: optional payload of *close* message, :class:`str` (converted to *UTF-8* encoded bytes) or :class:`bytes`. :param bool drain: drain outgoing buffer before closing connection. :raise RuntimeError: if connection is not started .. method:: receive(timeout=None) :async: A :ref:`coroutine` that waits upcoming *data* message from peer and returns it. The coroutine implicitly handles :const:`~aiohttp.WSMsgType.PING`, :const:`~aiohttp.WSMsgType.PONG` and :const:`~aiohttp.WSMsgType.CLOSE` without returning the message. It process *ping-pong game* and performs *closing handshake* internally. .. note:: Can only be called by the request handling task. :param timeout: timeout for `receive` operation. timeout value overrides response`s receive_timeout attribute. :return: :class:`~aiohttp.WSMessage` :raise RuntimeError: if connection is not started .. method:: receive_str(*, timeout=None) :async: A :ref:`coroutine` that calls :meth:`receive` but also asserts the message type is :const:`~aiohttp.WSMsgType.TEXT`. .. note:: Can only be called by the request handling task. :param timeout: timeout for `receive` operation. timeout value overrides response`s receive_timeout attribute. :return str: peer's message content. :raise TypeError: if message is :const:`~aiohttp.WSMsgType.BINARY`. .. method:: receive_bytes(*, timeout=None) :async: A :ref:`coroutine` that calls :meth:`receive` but also asserts the message type is :const:`~aiohttp.WSMsgType.BINARY`. .. note:: Can only be called by the request handling task. :param timeout: timeout for `receive` operation. timeout value overrides response`s receive_timeout attribute. :return bytes: peer's message content. :raise TypeError: if message is :const:`~aiohttp.WSMsgType.TEXT`. .. method:: receive_json(*, loads=json.loads, timeout=None) :async: A :ref:`coroutine` that calls :meth:`receive_str` and loads the JSON string to a Python dict. .. note:: Can only be called by the request handling task. :param collections.abc.Callable loads: any :term:`callable` that accepts :class:`str` and returns :class:`dict` with parsed JSON (:func:`json.loads` by default). :param timeout: timeout for `receive` operation. timeout value overrides response`s receive_timeout attribute. :return dict: loaded JSON content :raise TypeError: if message is :const:`~aiohttp.WSMsgType.BINARY`. :raise ValueError: if message is not valid JSON. .. seealso:: :ref:`WebSockets handling` .. class:: WebSocketReady A named tuple for returning result from :meth:`WebSocketResponse.can_prepare`. Has :class:`bool` check implemented, e.g.:: if not await ws.can_prepare(...): cannot_start_websocket() .. attribute:: ok ``True`` if websocket connection can be established, ``False`` otherwise. .. attribute:: protocol :class:`str` represented selected websocket sub-protocol. .. seealso:: :meth:`WebSocketResponse.can_prepare` .. function:: json_response([data], *, text=None, body=None, \ status=200, reason=None, headers=None, \ content_type='application/json', \ dumps=json.dumps) Return :class:`Response` with predefined ``'application/json'`` content type and *data* encoded by ``dumps`` parameter (:func:`json.dumps` by default). HTTP Exceptions ^^^^^^^^^^^^^^^ Errors can also be returned by raising a HTTP exception instance from within the handler. .. class:: HTTPException(*, headers=None, reason=None, text=None, content_type=None) Low-level HTTP failure. :param headers: headers for the response :type headers: dict or multidict.CIMultiDict :param str reason: reason included in the response :param str text: response's body :param str content_type: response's content type. This is passed through to the :class:`Response` initializer. Sub-classes of ``HTTPException`` exist for the standard HTTP response codes as described in :ref:`aiohttp-web-exceptions` and the expected usage is to simply raise the appropriate exception type to respond with a specific HTTP response code. Since ``HTTPException`` is a sub-class of :class:`Response`, it contains the methods and properties that allow you to directly manipulate details of the response. .. attribute:: status_code HTTP status code for this exception class. This attribute is usually defined at the class level. ``self.status_code`` is passed to the :class:`Response` initializer. .. _aiohttp-web-app-and-router: Application and Router ---------------------- .. class:: Application(*, logger=, router=None, middlewares=(), \ handler_args=None, client_max_size=1024**2, \ loop=None, debug=...) Application is a synonym for web-server. To get a fully working example, you have to make an *application*, register supported urls in the *router* and pass it to :func:`aiohttp.web.run_app` or :class:`aiohttp.web.AppRunner`. *Application* contains a *router* instance and a list of callbacks that will be called during application finishing. This class is a :obj:`dict`-like object, so you can use it for :ref:`sharing data` globally by storing arbitrary properties for later access from a :ref:`handler` via the :attr:`Request.app` property:: app = Application() database = AppKey("database", AsyncEngine) app[database] = await create_async_engine(db_url) async def handler(request): async with request.app[database].begin() as conn: await conn.execute("DELETE * FROM table") Although it` is a :obj:`dict`-like object, it can't be duplicated like one using :meth:`~aiohttp.web.Application.copy`. The class inherits :class:`dict`. :param logger: :class:`logging.Logger` instance for storing application logs. By default the value is ``logging.getLogger("aiohttp.web")`` :param router: :class:`aiohttp.abc.AbstractRouter` instance, the system creates :class:`UrlDispatcher` by default if *router* is ``None``. .. deprecated:: 3.3 The custom routers support is deprecated, the parameter will be removed in 4.0. :param middlewares: :class:`list` of middleware factories, see :ref:`aiohttp-web-middlewares` for details. :param handler_args: dict-like object that overrides keyword arguments of :meth:`Application.make_handler` :param client_max_size: client's maximum size in a request, in bytes. If a POST request exceeds this value, it raises an `HTTPRequestEntityTooLarge` exception. :param loop: event loop .. deprecated:: 2.0 The parameter is deprecated. Loop is get set during freeze stage. :param debug: Switches debug mode. .. deprecated:: 3.5 Use asyncio :ref:`asyncio-debug-mode` instead. .. attribute:: router Read-only property that returns *router instance*. .. attribute:: logger :class:`logging.Logger` instance for storing application logs. .. attribute:: loop :ref:`event loop` used for processing HTTP requests. .. deprecated:: 3.5 .. attribute:: debug Boolean value indicating whether the debug mode is turned on or off. .. deprecated:: 3.5 Use asyncio :ref:`asyncio-debug-mode` instead. .. attribute:: on_response_prepare A :class:`~aiosignal.Signal` that is fired near the end of :meth:`StreamResponse.prepare` with parameters *request* and *response*. It can be used, for example, to add custom headers to each response, or to modify the default headers computed by the application, directly before sending the headers to the client. Signal handlers should have the following signature:: async def on_prepare(request, response): pass .. note:: The headers are written immediately after these callbacks are run. Therefore, if you modify the content of the response, you may need to adjust the `Content-Length` header or similar to match. Aiohttp will not make any updates to the headers from this point. .. attribute:: on_startup A :class:`~aiosignal.Signal` that is fired on application start-up. Subscribers may use the signal to run background tasks in the event loop along with the application's request handler just after the application start-up. Signal handlers should have the following signature:: async def on_startup(app): pass .. seealso:: :ref:`aiohttp-web-signals`. .. attribute:: on_shutdown A :class:`~aiosignal.Signal` that is fired on application shutdown. Subscribers may use the signal for gracefully closing long running connections, e.g. websockets and data streaming. Signal handlers should have the following signature:: async def on_shutdown(app): pass It's up to end user to figure out which :term:`web-handler`\s are still alive and how to finish them properly. We suggest keeping a list of long running handlers in :class:`Application` dictionary. .. seealso:: :ref:`aiohttp-web-graceful-shutdown` and :attr:`on_cleanup`. .. attribute:: on_cleanup A :class:`~aiosignal.Signal` that is fired on application cleanup. Subscribers may use the signal for gracefully closing connections to database server etc. Signal handlers should have the following signature:: async def on_cleanup(app): pass .. seealso:: :ref:`aiohttp-web-signals` and :attr:`on_shutdown`. .. attribute:: cleanup_ctx A list of *context generators* for *startup*/*cleanup* handling. Signal handlers should have the following signature:: async def context(app): # do startup stuff yield # do cleanup .. versionadded:: 3.1 .. seealso:: :ref:`aiohttp-web-cleanup-ctx`. .. method:: add_subapp(prefix, subapp) Register nested sub-application under given path *prefix*. In resolving process if request's path starts with *prefix* then further resolving is passed to *subapp*. :param str prefix: path's prefix for the resource. :param Application subapp: nested application attached under *prefix*. :returns: a :class:`PrefixedSubAppResource` instance. .. method:: add_domain(domain, subapp) Register nested sub-application that serves the domain name or domain name mask. In resolving process if request.headers['host'] matches the pattern *domain* then further resolving is passed to *subapp*. :param str domain: domain or mask of domain for the resource. :param Application subapp: nested application. :returns: a :class:`~aiohttp.web.MatchedSubAppResource` instance. .. method:: add_routes(routes_table) Register route definitions from *routes_table*. The table is a :class:`list` of :class:`RouteDef` items or :class:`RouteTableDef`. :returns: :class:`list` of registered :class:`AbstractRoute` instances. The method is a shortcut for ``app.router.add_routes(routes_table)``, see also :meth:`UrlDispatcher.add_routes`. .. versionadded:: 3.1 .. versionchanged:: 3.7 Return value updated from ``None`` to :class:`list` of :class:`AbstractRoute` instances. .. method:: make_handler(loop=None, **kwargs) Creates HTTP protocol factory for handling requests. :param loop: :ref:`event loop` used for processing HTTP requests. If param is ``None`` :func:`asyncio.get_event_loop` used for getting default event loop. .. deprecated:: 2.0 :param bool tcp_keepalive: Enable TCP Keep-Alive. Default: ``True``. :param int keepalive_timeout: Number of seconds before closing Keep-Alive connection. Default: ``75`` seconds (NGINX's default value). :param logger: Custom logger object. Default: :data:`aiohttp.log.server_logger`. :param access_log: Custom logging object. Default: :data:`aiohttp.log.access_logger`. :param access_log_class: Class for `access_logger`. Default: :data:`aiohttp.helpers.AccessLogger`. Must to be a subclass of :class:`aiohttp.abc.AbstractAccessLogger`. :param str access_log_format: Access log format string. Default: :attr:`helpers.AccessLogger.LOG_FORMAT`. :param int max_line_size: Optional maximum header line size. Default: ``8190``. :param int max_headers: Optional maximum header size. Default: ``32768``. :param int max_field_size: Optional maximum header field size. Default: ``8190``. :param float lingering_time: Maximum time during which the server reads and ignores additional data coming from the client when lingering close is on. Use ``0`` to disable lingering on server channel closing. You should pass result of the method as *protocol_factory* to :meth:`~asyncio.AbstractEventLoop.create_server`, e.g.:: loop = asyncio.get_event_loop() app = Application() # setup route table # app.router.add_route(...) await loop.create_server(app.make_handler(), '0.0.0.0', 8080) .. deprecated:: 3.2 The method is deprecated and will be removed in future aiohttp versions. Please use :ref:`aiohttp-web-app-runners` instead. .. method:: startup() :async: A :ref:`coroutine` that will be called along with the application's request handler. The purpose of the method is calling :attr:`on_startup` signal handlers. .. method:: shutdown() :async: A :ref:`coroutine` that should be called on server stopping but before :meth:`cleanup()`. The purpose of the method is calling :attr:`on_shutdown` signal handlers. .. method:: cleanup() :async: A :ref:`coroutine` that should be called on server stopping but after :meth:`shutdown`. The purpose of the method is calling :attr:`on_cleanup` signal handlers. .. note:: Application object has :attr:`router` attribute but has no ``add_route()`` method. The reason is: we want to support different router implementations (even maybe not url-matching based but traversal ones). For sake of that fact we have very trivial ABC for :class:`~aiohttp.abc.AbstractRouter`: it should have only :meth:`aiohttp.abc.AbstractRouter.resolve` coroutine. No methods for adding routes or route reversing (getting URL by route name). All those are router implementation details (but, sure, you need to deal with that methods after choosing the router for your application). .. class:: AppKey(name, t) This class should be used for the keys in :class:`Application`. They provide a type-safe alternative to `str` keys when checking your code with a type checker (e.g. mypy). They also avoid name clashes with keys from different libraries etc. :param name: A name to help with debugging. This should be the same as the variable name (much like how :class:`typing.TypeVar` is used). :param t: The type that should be used for the value in the dict (e.g. `str`, `Iterator[int]` etc.) .. class:: Server A protocol factory compatible with :meth:`~asyncio.AbstractEventLoop.create_server`. The class is responsible for creating HTTP protocol objects that can handle HTTP connections. .. attribute:: connections List of all currently opened connections. .. attribute:: requests_count Amount of processed requests. .. method:: Server.shutdown(timeout) :async: A :ref:`coroutine` that should be called to close all opened connections. .. class:: UrlDispatcher() For dispatching URLs to :ref:`handlers` :mod:`aiohttp.web` uses *routers*, which is any object that implements :class:`~aiohttp.abc.AbstractRouter` interface. This class is a straightforward url-matching router, implementing :class:`collections.abc.Mapping` for access to *named routes*. :class:`Application` uses this class as :meth:`~aiohttp.web.Application.router` by default. Before running an :class:`Application` you should fill *route table* first by calling :meth:`add_route` and :meth:`add_static`. :ref:`Handler` lookup is performed by iterating on added *routes* in FIFO order. The first matching *route* will be used to call the corresponding *handler*. If during route creation you specify *name* parameter the result is a *named route*. A *named route* can be retrieved by a ``app.router[name]`` call, checking for existence can be done with ``name in app.router`` etc. .. seealso:: :ref:`Route classes ` .. method:: add_resource(path, *, name=None) Append a :term:`resource` to the end of route table. *path* may be either *constant* string like ``'/a/b/c'`` or *variable rule* like ``'/a/{var}'`` (see :ref:`handling variable paths `) :param str path: resource path spec. :param str name: optional resource name. :return: created resource instance (:class:`PlainResource` or :class:`DynamicResource`). .. method:: add_route(method, path, handler, *, \ name=None, expect_handler=None) Append :ref:`handler` to the end of route table. *path* may be either *constant* string like ``'/a/b/c'`` or *variable rule* like ``'/a/{var}'`` (see :ref:`handling variable paths `) Pay attention please: *handler* is converted to coroutine internally when it is a regular function. :param str method: HTTP method for route. Should be one of ``'GET'``, ``'POST'``, ``'PUT'``, ``'DELETE'``, ``'PATCH'``, ``'HEAD'``, ``'OPTIONS'`` or ``'*'`` for any method. The parameter is case-insensitive, e.g. you can push ``'get'`` as well as ``'GET'``. :param str path: route path. Should be started with slash (``'/'``). :param collections.abc.Callable handler: route handler. :param str name: optional route name. :param collections.abc.Coroutine expect_handler: optional *expect* header handler. :returns: new :class:`AbstractRoute` instance. .. method:: add_routes(routes_table) Register route definitions from *routes_table*. The table is a :class:`list` of :class:`RouteDef` items or :class:`RouteTableDef`. :returns: :class:`list` of registered :class:`AbstractRoute` instances. .. versionadded:: 2.3 .. versionchanged:: 3.7 Return value updated from ``None`` to :class:`list` of :class:`AbstractRoute` instances. .. method:: add_get(path, handler, *, name=None, allow_head=True, **kwargs) Shortcut for adding a GET handler. Calls the :meth:`add_route` with \ ``method`` equals to ``'GET'``. If *allow_head* is ``True`` (default) the route for method HEAD is added with the same handler as for GET. If *name* is provided the name for HEAD route is suffixed with ``'-head'``. For example ``router.add_get(path, handler, name='route')`` call adds two routes: first for GET with name ``'route'`` and second for HEAD with name ``'route-head'``. .. method:: add_post(path, handler, **kwargs) Shortcut for adding a POST handler. Calls the :meth:`add_route` with \ ``method`` equals to ``'POST'``. .. method:: add_head(path, handler, **kwargs) Shortcut for adding a HEAD handler. Calls the :meth:`add_route` with \ ``method`` equals to ``'HEAD'``. .. method:: add_put(path, handler, **kwargs) Shortcut for adding a PUT handler. Calls the :meth:`add_route` with \ ``method`` equals to ``'PUT'``. .. method:: add_patch(path, handler, **kwargs) Shortcut for adding a PATCH handler. Calls the :meth:`add_route` with \ ``method`` equals to ``'PATCH'``. .. method:: add_delete(path, handler, **kwargs) Shortcut for adding a DELETE handler. Calls the :meth:`add_route` with \ ``method`` equals to ``'DELETE'``. .. method:: add_view(path, handler, **kwargs) Shortcut for adding a class-based view handler. Calls the \ :meth:`add_route` with ``method`` equals to ``'*'``. .. versionadded:: 3.0 .. method:: add_static(prefix, path, *, name=None, expect_handler=None, \ chunk_size=256*1024, \ response_factory=StreamResponse, \ show_index=False, \ follow_symlinks=False, \ append_version=False) Adds a router and a handler for returning static files. Useful for serving static content like images, javascript and css files. On platforms that support it, the handler will transfer files more efficiently using the ``sendfile`` system call. In some situations it might be necessary to avoid using the ``sendfile`` system call even if the platform supports it. This can be accomplished by by setting environment variable ``AIOHTTP_NOSENDFILE=1``. If a gzip version of the static content exists at file path + ``.gz``, it will be used for the response. .. warning:: Use :meth:`add_static` for development only. In production, static content should be processed by web servers like *nginx* or *apache*. :param str prefix: URL path prefix for handled static files :param path: path to the folder in file system that contains handled static files, :class:`str` or :class:`pathlib.Path`. :param str name: optional route name. :param collections.abc.Coroutine expect_handler: optional *expect* header handler. :param int chunk_size: size of single chunk for file downloading, 256Kb by default. Increasing *chunk_size* parameter to, say, 1Mb may increase file downloading speed but consumes more memory. :param bool show_index: flag for allowing to show indexes of a directory, by default it's not allowed and HTTP/403 will be returned on directory access. :param bool follow_symlinks: flag for allowing to follow symlinks that lead outside the static root directory, by default it's not allowed and HTTP/404 will be returned on access. Enabling ``follow_symlinks`` can be a security risk, and may lead to a directory transversal attack. You do NOT need this option to follow symlinks which point to somewhere else within the static directory, this option is only used to break out of the security sandbox. Enabling this option is highly discouraged, and only expected to be used for edge cases in a local development setting where remote users do not have access to the server. :param bool append_version: flag for adding file version (hash) to the url query string, this value will be used as default when you call to :meth:`~aiohttp.web.AbstractRoute.url` and :meth:`~aiohttp.web.AbstractRoute.url_for` methods. :returns: new :class:`~aiohttp.web.AbstractRoute` instance. .. method:: resolve(request) :async: A :ref:`coroutine` that returns :class:`~aiohttp.abc.AbstractMatchInfo` for *request*. The method never raises exception, but returns :class:`~aiohttp.abc.AbstractMatchInfo` instance with: 1. :attr:`~aiohttp.abc.AbstractMatchInfo.http_exception` assigned to :exc:`HTTPException` instance. 2. :meth:`~aiohttp.abc.AbstractMatchInfo.handler` which raises :exc:`HTTPNotFound` or :exc:`HTTPMethodNotAllowed` on handler's execution if there is no registered route for *request*. *Middlewares* can process that exceptions to render pretty-looking error page for example. Used by internal machinery, end user unlikely need to call the method. .. note:: The method uses :attr:`aiohttp.web.BaseRequest.raw_path` for pattern matching against registered routes. .. method:: resources() The method returns a *view* for *all* registered resources. The view is an object that allows to: 1. Get size of the router table:: len(app.router.resources()) 2. Iterate over registered resources:: for resource in app.router.resources(): print(resource) 3. Make a check if the resources is registered in the router table:: route in app.router.resources() .. method:: routes() The method returns a *view* for *all* registered routes. .. method:: named_resources() Returns a :obj:`dict`-like :class:`types.MappingProxyType` *view* over *all* named **resources**. The view maps every named resource's **name** to the :class:`AbstractResource` instance. It supports the usual :obj:`dict`-like operations, except for any mutable operations (i.e. it's **read-only**):: len(app.router.named_resources()) for name, resource in app.router.named_resources().items(): print(name, resource) "name" in app.router.named_resources() app.router.named_resources()["name"] .. _aiohttp-web-resource: Resource ^^^^^^^^ Default router :class:`UrlDispatcher` operates with :term:`resource`\s. Resource is an item in *routing table* which has a *path*, an optional unique *name* and at least one :term:`route`. :term:`web-handler` lookup is performed in the following way: 1. Router iterates over *resources* one-by-one. 2. If *resource* matches to requested URL the resource iterates over own *routes*. 3. If route matches to requested HTTP method (or ``'*'`` wildcard) the route's handler is used as found :term:`web-handler`. The lookup is finished. 4. Otherwise router tries next resource from the *routing table*. 5. If the end of *routing table* is reached and no *resource* / *route* pair found the *router* returns special :class:`~aiohttp.abc.AbstractMatchInfo` instance with :attr:`aiohttp.abc.AbstractMatchInfo.http_exception` is not ``None`` but :exc:`HTTPException` with either *HTTP 404 Not Found* or *HTTP 405 Method Not Allowed* status code. Registered :meth:`~aiohttp.abc.AbstractMatchInfo.handler` raises this exception on call. User should never instantiate resource classes but give it by :meth:`UrlDispatcher.add_resource` call. After that he may add a :term:`route` by calling :meth:`Resource.add_route`. :meth:`UrlDispatcher.add_route` is just shortcut for:: router.add_resource(path).add_route(method, handler) Resource with a *name* is called *named resource*. The main purpose of *named resource* is constructing URL by route name for passing it into *template engine* for example:: url = app.router['resource_name'].url_for().with_query({'a': 1, 'b': 2}) Resource classes hierarchy:: AbstractResource Resource PlainResource DynamicResource StaticResource .. class:: AbstractResource A base class for all resources. Inherited from :class:`collections.abc.Sized` and :class:`collections.abc.Iterable`. ``len(resource)`` returns amount of :term:`route`\s belongs to the resource, ``for route in resource`` allows to iterate over these routes. .. attribute:: name Read-only *name* of resource or ``None``. .. attribute:: canonical Read-only *canonical path* associate with the resource. For example ``/path/to`` or ``/path/{to}`` .. versionadded:: 3.3 .. method:: resolve(request) :async: Resolve resource by finding appropriate :term:`web-handler` for ``(method, path)`` combination. :return: (*match_info*, *allowed_methods*) pair. *allowed_methods* is a :class:`set` or HTTP methods accepted by resource. *match_info* is either :class:`UrlMappingMatchInfo` if request is resolved or ``None`` if no :term:`route` is found. .. method:: get_info() A resource description, e.g. ``{'path': '/path/to'}`` or ``{'formatter': '/path/{to}', 'pattern': re.compile(r'^/path/(?P[a-zA-Z][_a-zA-Z0-9]+)$`` .. method:: url_for(*args, **kwargs) Construct an URL for route with additional params. *args* and **kwargs** depend on a parameters list accepted by inherited resource class. :return: :class:`~yarl.URL` -- resulting URL instance. .. class:: Resource A base class for new-style resources, inherits :class:`AbstractResource`. .. method:: add_route(method, handler, *, expect_handler=None) Add a :term:`web-handler` to resource. :param str method: HTTP method for route. Should be one of ``'GET'``, ``'POST'``, ``'PUT'``, ``'DELETE'``, ``'PATCH'``, ``'HEAD'``, ``'OPTIONS'`` or ``'*'`` for any method. The parameter is case-insensitive, e.g. you can push ``'get'`` as well as ``'GET'``. The method should be unique for resource. :param collections.abc.Callable handler: route handler. :param collections.abc.Coroutine expect_handler: optional *expect* header handler. :returns: new :class:`ResourceRoute` instance. .. class:: PlainResource A resource, inherited from :class:`Resource`. The class corresponds to resources with plain-text matching, ``'/path/to'`` for example. .. attribute:: canonical Read-only *canonical path* associate with the resource. Returns the path used to create the PlainResource. For example ``/path/to`` .. versionadded:: 3.3 .. method:: url_for() Returns a :class:`~yarl.URL` for the resource. .. class:: DynamicResource A resource, inherited from :class:`Resource`. The class corresponds to resources with :ref:`variable ` matching, e.g. ``'/path/{to}/{param}'`` etc. .. attribute:: canonical Read-only *canonical path* associate with the resource. Returns the formatter obtained from the path used to create the DynamicResource. For example, from a path ``/get/{num:^\d+}``, it returns ``/get/{num}`` .. versionadded:: 3.3 .. method:: url_for(**params) Returns a :class:`~yarl.URL` for the resource. :param params: -- a variable substitutions for dynamic resource. E.g. for ``'/path/{to}/{param}'`` pattern the method should be called as ``resource.url_for(to='val1', param='val2')`` .. class:: StaticResource A resource, inherited from :class:`Resource`. The class corresponds to resources for :ref:`static file serving `. .. attribute:: canonical Read-only *canonical path* associate with the resource. Returns the prefix used to create the StaticResource. For example ``/prefix`` .. versionadded:: 3.3 .. method:: url_for(filename, append_version=None) Returns a :class:`~yarl.URL` for file path under resource prefix. :param filename: -- a file name substitution for static file handler. Accepts both :class:`str` and :class:`pathlib.Path`. E.g. an URL for ``'/prefix/dir/file.txt'`` should be generated as ``resource.url_for(filename='dir/file.txt')`` :param bool append_version: -- a flag for adding file version (hash) to the url query string for cache boosting By default has value from a constructor (``False`` by default) When set to ``True`` - ``v=FILE_HASH`` query string param will be added When set to ``False`` has no impact if file not found has no impact .. class:: PrefixedSubAppResource A resource for serving nested applications. The class instance is returned by :class:`~aiohttp.web.Application.add_subapp` call. .. attribute:: canonical Read-only *canonical path* associate with the resource. Returns the prefix used to create the PrefixedSubAppResource. For example ``/prefix`` .. versionadded:: 3.3 .. method:: url_for(**kwargs) The call is not allowed, it raises :exc:`RuntimeError`. .. _aiohttp-web-route: Route ^^^^^ Route has *HTTP method* (wildcard ``'*'`` is an option), :term:`web-handler` and optional *expect handler*. Every route belong to some resource. Route classes hierarchy:: AbstractRoute ResourceRoute SystemRoute :class:`ResourceRoute` is the route used for resources, :class:`SystemRoute` serves URL resolving errors like *404 Not Found* and *405 Method Not Allowed*. .. class:: AbstractRoute Base class for routes served by :class:`UrlDispatcher`. .. attribute:: method HTTP method handled by the route, e.g. *GET*, *POST* etc. .. attribute:: handler :ref:`handler` that processes the route. .. attribute:: name Name of the route, always equals to name of resource which owns the route. .. attribute:: resource Resource instance which holds the route, ``None`` for :class:`SystemRoute`. .. method:: url_for(*args, **kwargs) Abstract method for constructing url handled by the route. Actually it's a shortcut for ``route.resource.url_for(...)``. .. method:: handle_expect_header(request) :async: ``100-continue`` handler. .. class:: ResourceRoute The route class for handling different HTTP methods for :class:`Resource`. .. class:: SystemRoute The route class for handling URL resolution errors like like *404 Not Found* and *405 Method Not Allowed*. .. attribute:: status HTTP status code .. attribute:: reason HTTP status reason .. _aiohttp-web-route-def: RouteDef and StaticDef ^^^^^^^^^^^^^^^^^^^^^^ Route definition, a description for not registered yet route. Could be used for filing route table by providing a list of route definitions (Django style). The definition is created by functions like :func:`get` or :func:`post`, list of definitions could be added to router by :meth:`UrlDispatcher.add_routes` call:: from aiohttp import web async def handle_get(request): ... async def handle_post(request): ... app.router.add_routes([web.get('/get', handle_get), web.post('/post', handle_post), .. class:: AbstractRouteDef A base class for route definitions. Inherited from :class:`abc.ABC`. .. versionadded:: 3.1 .. method:: register(router) Register itself into :class:`UrlDispatcher`. Abstract method, should be overridden by subclasses. :returns: :class:`list` of registered :class:`AbstractRoute` objects. .. versionchanged:: 3.7 Return value updated from ``None`` to :class:`list` of :class:`AbstractRoute` instances. .. class:: RouteDef A definition of not registered yet route. Implements :class:`AbstractRouteDef`. .. versionadded:: 2.3 .. versionchanged:: 3.1 The class implements :class:`AbstractRouteDef` interface. .. attribute:: method HTTP method (``GET``, ``POST`` etc.) (:class:`str`). .. attribute:: path Path to resource, e.g. ``/path/to``. Could contain ``{}`` brackets for :ref:`variable resources ` (:class:`str`). .. attribute:: handler An async function to handle HTTP request. .. attribute:: kwargs A :class:`dict` of additional arguments. .. class:: StaticDef A definition of static file resource. Implements :class:`AbstractRouteDef`. .. versionadded:: 3.1 .. attribute:: prefix A prefix used for static file handling, e.g. ``/static``. .. attribute:: path File system directory to serve, :class:`str` or :class:`pathlib.Path` (e.g. ``'/home/web-service/path/to/static'``. .. attribute:: kwargs A :class:`dict` of additional arguments, see :meth:`UrlDispatcher.add_static` for a list of supported options. .. function:: get(path, handler, *, name=None, allow_head=True, \ expect_handler=None) Return :class:`RouteDef` for processing ``GET`` requests. See :meth:`UrlDispatcher.add_get` for information about parameters. .. versionadded:: 2.3 .. function:: post(path, handler, *, name=None, expect_handler=None) Return :class:`RouteDef` for processing ``POST`` requests. See :meth:`UrlDispatcher.add_post` for information about parameters. .. versionadded:: 2.3 .. function:: head(path, handler, *, name=None, expect_handler=None) Return :class:`RouteDef` for processing ``HEAD`` requests. See :meth:`UrlDispatcher.add_head` for information about parameters. .. versionadded:: 2.3 .. function:: put(path, handler, *, name=None, expect_handler=None) Return :class:`RouteDef` for processing ``PUT`` requests. See :meth:`UrlDispatcher.add_put` for information about parameters. .. versionadded:: 2.3 .. function:: patch(path, handler, *, name=None, expect_handler=None) Return :class:`RouteDef` for processing ``PATCH`` requests. See :meth:`UrlDispatcher.add_patch` for information about parameters. .. versionadded:: 2.3 .. function:: delete(path, handler, *, name=None, expect_handler=None) Return :class:`RouteDef` for processing ``DELETE`` requests. See :meth:`UrlDispatcher.add_delete` for information about parameters. .. versionadded:: 2.3 .. function:: view(path, handler, *, name=None, expect_handler=None) Return :class:`RouteDef` for processing ``ANY`` requests. See :meth:`UrlDispatcher.add_view` for information about parameters. .. versionadded:: 3.0 .. function:: static(prefix, path, *, name=None, expect_handler=None, \ chunk_size=256*1024, \ show_index=False, follow_symlinks=False, \ append_version=False) Return :class:`StaticDef` for processing static files. See :meth:`UrlDispatcher.add_static` for information about supported parameters. .. versionadded:: 3.1 .. function:: route(method, path, handler, *, name=None, expect_handler=None) Return :class:`RouteDef` for processing requests that decided by ``method``. See :meth:`UrlDispatcher.add_route` for information about parameters. .. versionadded:: 2.3 .. _aiohttp-web-route-table-def: RouteTableDef ^^^^^^^^^^^^^ A routes table definition used for describing routes by decorators (Flask style):: from aiohttp import web routes = web.RouteTableDef() @routes.get('/get') async def handle_get(request): ... @routes.post('/post') async def handle_post(request): ... app.router.add_routes(routes) @routes.view("/view") class MyView(web.View): async def get(self): ... async def post(self): ... .. class:: RouteTableDef() A sequence of :class:`RouteDef` instances (implements :class:`collections.abc.Sequence` protocol). In addition to all standard :class:`list` methods the class provides also methods like ``get()`` and ``post()`` for adding new route definition. .. versionadded:: 2.3 .. decoratormethod:: get(path, *, allow_head=True, \ name=None, expect_handler=None) Add a new :class:`RouteDef` item for registering ``GET`` web-handler. See :meth:`UrlDispatcher.add_get` for information about parameters. .. decoratormethod:: post(path, *, name=None, expect_handler=None) Add a new :class:`RouteDef` item for registering ``POST`` web-handler. See :meth:`UrlDispatcher.add_post` for information about parameters. .. decoratormethod:: head(path, *, name=None, expect_handler=None) Add a new :class:`RouteDef` item for registering ``HEAD`` web-handler. See :meth:`UrlDispatcher.add_head` for information about parameters. .. decoratormethod:: put(path, *, name=None, expect_handler=None) Add a new :class:`RouteDef` item for registering ``PUT`` web-handler. See :meth:`UrlDispatcher.add_put` for information about parameters. .. decoratormethod:: patch(path, *, name=None, expect_handler=None) Add a new :class:`RouteDef` item for registering ``PATCH`` web-handler. See :meth:`UrlDispatcher.add_patch` for information about parameters. .. decoratormethod:: delete(path, *, name=None, expect_handler=None) Add a new :class:`RouteDef` item for registering ``DELETE`` web-handler. See :meth:`UrlDispatcher.add_delete` for information about parameters. .. decoratormethod:: view(path, *, name=None, expect_handler=None) Add a new :class:`RouteDef` item for registering ``ANY`` methods against a class-based view. See :meth:`UrlDispatcher.add_view` for information about parameters. .. versionadded:: 3.0 .. method:: static(prefix, path, *, name=None, expect_handler=None, \ chunk_size=256*1024, \ show_index=False, follow_symlinks=False, \ append_version=False) Add a new :class:`StaticDef` item for registering static files processor. See :meth:`UrlDispatcher.add_static` for information about supported parameters. .. versionadded:: 3.1 .. decoratormethod:: route(method, path, *, name=None, expect_handler=None) Add a new :class:`RouteDef` item for registering a web-handler for arbitrary HTTP method. See :meth:`UrlDispatcher.add_route` for information about parameters. MatchInfo ^^^^^^^^^ After route matching web application calls found handler if any. Matching result can be accessible from handler as :attr:`Request.match_info` attribute. In general the result may be any object derived from :class:`~aiohttp.abc.AbstractMatchInfo` (:class:`UrlMappingMatchInfo` for default :class:`UrlDispatcher` router). .. class:: UrlMappingMatchInfo Inherited from :class:`dict` and :class:`~aiohttp.abc.AbstractMatchInfo`. Dict items are filled by matching info and is :term:`resource`\-specific. .. attribute:: expect_handler A coroutine for handling ``100-continue``. .. attribute:: handler A coroutine for handling request. .. attribute:: route :class:`AbstractRoute` instance for url matching. View ^^^^ .. class:: View(request) Inherited from :class:`~aiohttp.abc.AbstractView`. Base class for class based views. Implementations should derive from :class:`View` and override methods for handling HTTP verbs like ``get()`` or ``post()``:: class MyView(View): async def get(self): resp = await get_response(self.request) return resp async def post(self): resp = await post_response(self.request) return resp app.router.add_view('/view', MyView) The view raises *405 Method Not allowed* (:class:`HTTPMethodNotAllowed`) if requested web verb is not supported. :param request: instance of :class:`Request` that has initiated a view processing. .. attribute:: request Request sent to view's constructor, read-only property. Overridable coroutine methods: ``connect()``, ``delete()``, ``get()``, ``head()``, ``options()``, ``patch()``, ``post()``, ``put()``, ``trace()``. .. seealso:: :ref:`aiohttp-web-class-based-views` .. _aiohttp-web-app-runners-reference: Running Applications -------------------- To start web application there is ``AppRunner`` and site classes. Runner is a storage for running application, sites are for running application on specific TCP or Unix socket, e.g.:: runner = web.AppRunner(app) await runner.setup() site = web.TCPSite(runner, 'localhost', 8080) await site.start() # wait for finish signal await runner.cleanup() .. versionadded:: 3.0 :class:`AppRunner` / :class:`ServerRunner` and :class:`TCPSite` / :class:`UnixSite` / :class:`SockSite` are added in aiohttp 3.0 .. class:: BaseRunner A base class for runners. Use :class:`AppRunner` for serving :class:`Application`, :class:`ServerRunner` for low-level :class:`Server`. .. attribute:: server Low-level web :class:`Server` for handling HTTP requests, read-only attribute. .. attribute:: addresses A :class:`list` of served sockets addresses. See :meth:`socket.getsockname() ` for items type. .. versionadded:: 3.3 .. attribute:: sites A read-only :class:`set` of served sites (:class:`TCPSite` / :class:`UnixSite` / :class:`NamedPipeSite` / :class:`SockSite` instances). .. method:: setup() :async: Initialize the server. Should be called before adding sites. .. method:: cleanup() :async: Stop handling all registered sites and cleanup used resources. .. class:: AppRunner(app, *, handle_signals=False, **kwargs) A runner for :class:`Application`. Used with conjunction with sites to serve on specific port. Inherited from :class:`BaseRunner`. :param Application app: web application instance to serve. :param bool handle_signals: add signal handlers for :data:`signal.SIGINT` and :data:`signal.SIGTERM` (``False`` by default). :param kwargs: named parameters to pass into web protocol. Supported *kwargs*: :param bool tcp_keepalive: Enable TCP Keep-Alive. Default: ``True``. :param int keepalive_timeout: Number of seconds before closing Keep-Alive connection. Default: ``75`` seconds (NGINX's default value). :param logger: Custom logger object. Default: :data:`aiohttp.log.server_logger`. :param access_log: Custom logging object. Default: :data:`aiohttp.log.access_logger`. :param access_log_class: Class for `access_logger`. Default: :data:`aiohttp.helpers.AccessLogger`. Must to be a subclass of :class:`aiohttp.abc.AbstractAccessLogger`. :param str access_log_format: Access log format string. Default: :attr:`helpers.AccessLogger.LOG_FORMAT`. :param int max_line_size: Optional maximum header line size. Default: ``8190``. :param int max_headers: Optional maximum header size. Default: ``32768``. :param int max_field_size: Optional maximum header field size. Default: ``8190``. :param float lingering_time: Maximum time during which the server reads and ignores additional data coming from the client when lingering close is on. Use ``0`` to disable lingering on server channel closing. :param int read_bufsize: Size of the read buffer (:attr:`BaseRequest.content`). ``None`` by default, it means that the session global value is used. .. versionadded:: 3.7 :param bool auto_decompress: Automatically decompress request body, ``True`` by default. .. versionadded:: 3.8 .. attribute:: app Read-only attribute for accessing to :class:`Application` served instance. .. method:: setup() :async: Initialize application. Should be called before adding sites. The method calls :attr:`Application.on_startup` registered signals. .. method:: cleanup() :async: Stop handling all registered sites and cleanup used resources. :attr:`Application.on_shutdown` and :attr:`Application.on_cleanup` signals are called internally. .. class:: ServerRunner(web_server, *, handle_signals=False, **kwargs) A runner for low-level :class:`Server`. Used with conjunction with sites to serve on specific port. Inherited from :class:`BaseRunner`. :param Server web_server: low-level web server instance to serve. :param bool handle_signals: add signal handlers for :data:`signal.SIGINT` and :data:`signal.SIGTERM` (``False`` by default). :param kwargs: named parameters to pass into web protocol. .. seealso:: :ref:`aiohttp-web-lowlevel` demonstrates low-level server usage .. class:: BaseSite An abstract class for handled sites. .. attribute:: name An identifier for site, read-only :class:`str` property. Could be a handled URL or UNIX socket path. .. method:: start() :async: Start handling a site. .. method:: stop() :async: Stop handling a site. .. class:: TCPSite(runner, host=None, port=None, *, \ shutdown_timeout=60.0, ssl_context=None, \ backlog=128, reuse_address=None, \ reuse_port=None) Serve a runner on TCP socket. :param runner: a runner to serve. :param str host: HOST to listen on, all interfaces if ``None`` (default). :param int port: PORT to listed on, ``8080`` if ``None`` (default). :param float shutdown_timeout: a timeout used for both waiting on pending tasks before application shutdown and for closing opened connections on :meth:`BaseSite.stop` call. :param ssl_context: a :class:`ssl.SSLContext` instance for serving SSL/TLS secure server, ``None`` for plain HTTP server (default). :param int backlog: a number of unaccepted connections that the system will allow before refusing new connections, see :meth:`socket.socket.listen` for details. ``128`` by default. :param bool reuse_address: tells the kernel to reuse a local socket in TIME_WAIT state, without waiting for its natural timeout to expire. If not specified will automatically be set to True on UNIX. :param bool reuse_port: tells the kernel to allow this endpoint to be bound to the same port as other existing endpoints are bound to, so long as they all set this flag when being created. This option is not supported on Windows. .. class:: UnixSite(runner, path, *, \ shutdown_timeout=60.0, ssl_context=None, \ backlog=128) Serve a runner on UNIX socket. :param runner: a runner to serve. :param str path: PATH to UNIX socket to listen. :param float shutdown_timeout: a timeout used for both waiting on pending tasks before application shutdown and for closing opened connections on :meth:`BaseSite.stop` call. :param ssl_context: a :class:`ssl.SSLContext` instance for serving SSL/TLS secure server, ``None`` for plain HTTP server (default). :param int backlog: a number of unaccepted connections that the system will allow before refusing new connections, see :meth:`socket.socket.listen` for details. ``128`` by default. .. class:: NamedPipeSite(runner, path, *, shutdown_timeout=60.0) Serve a runner on Named Pipe in Windows. :param runner: a runner to serve. :param str path: PATH of named pipe to listen. :param float shutdown_timeout: a timeout used for both waiting on pending tasks before application shutdown and for closing opened connections on :meth:`BaseSite.stop` call. .. class:: SockSite(runner, sock, *, \ shutdown_timeout=60.0, ssl_context=None, \ backlog=128) Serve a runner on UNIX socket. :param runner: a runner to serve. :param sock: A :ref:`socket instance ` to listen to. :param float shutdown_timeout: a timeout used for both waiting on pending tasks before application shutdown and for closing opened connections on :meth:`BaseSite.stop` call. :param ssl_context: a :class:`ssl.SSLContext` instance for serving SSL/TLS secure server, ``None`` for plain HTTP server (default). :param int backlog: a number of unaccepted connections that the system will allow before refusing new connections, see :meth:`socket.socket.listen` for details. ``128`` by default. Utilities --------- .. class:: FileField A :mod:`dataclass ` instance that is returned as multidict value by :meth:`aiohttp.web.BaseRequest.post` if field is uploaded file. .. attribute:: name Field name .. attribute:: filename File name as specified by uploading (client) side. .. attribute:: file An :class:`io.IOBase` instance with content of uploaded file. .. attribute:: content_type *MIME type* of uploaded file, ``'text/plain'`` by default. .. seealso:: :ref:`aiohttp-web-file-upload` .. function:: run_app(app, *, host=None, port=None, path=None, \ sock=None, shutdown_timeout=60.0, \ keepalive_timeout=75.0, \ ssl_context=None, print=print, backlog=128, \ access_log_class=aiohttp.helpers.AccessLogger, \ access_log_format=aiohttp.helpers.AccessLogger.LOG_FORMAT, \ access_log=aiohttp.log.access_logger, \ handle_signals=True, \ reuse_address=None, \ reuse_port=None, \ handler_cancellation=False) A high-level function for running an application, serving it until keyboard interrupt and performing a :ref:`aiohttp-web-graceful-shutdown`. This is a high-level function very similar to :func:`asyncio.run` and should be used as the main entry point for an application. The :class:`Application` object essentially becomes our `main()` function. If additional tasks need to be run in parallel, see :ref:`aiohttp-web-complex-applications`. The server will listen on any host or Unix domain socket path you supply. If no hosts or paths are supplied, or only a port is supplied, a TCP server listening on 0.0.0.0 (all hosts) will be launched. Distributing HTTP traffic to multiple hosts or paths on the same application process provides no performance benefit as the requests are handled on the same event loop. See :doc:`deployment` for ways of distributing work for increased performance. :param app: :class:`Application` instance to run or a *coroutine* that returns an application. :param str host: TCP/IP host or a sequence of hosts for HTTP server. Default is ``'0.0.0.0'`` if *port* has been specified or if *path* is not supplied. :param int port: TCP/IP port for HTTP server. Default is ``8080`` for plain text HTTP and ``8443`` for HTTP via SSL (when *ssl_context* parameter is specified). :param path: file system path for HTTP server Unix domain socket. A sequence of file system paths can be used to bind multiple domain sockets. Listening on Unix domain sockets is not supported by all operating systems, :class:`str`, :class:`pathlib.Path` or an iterable of these. :param socket.socket sock: a preexisting socket object to accept connections on. A sequence of socket objects can be passed. :param int shutdown_timeout: a delay to wait for graceful server shutdown before disconnecting all open client sockets hard way. This is used as a delay to wait for pending tasks to complete and then again to close any pending connections. A system with properly :ref:`aiohttp-web-graceful-shutdown` implemented never waits for the second timeout but closes a server in a few milliseconds. :param float keepalive_timeout: a delay before a TCP connection is closed after a HTTP request. The delay allows for reuse of a TCP connection. .. versionadded:: 3.8 :param ssl_context: :class:`ssl.SSLContext` for HTTPS server, ``None`` for HTTP connection. :param print: a callable compatible with :func:`print`. May be used to override STDOUT output or suppress it. Passing `None` disables output. :param int backlog: the number of unaccepted connections that the system will allow before refusing new connections (``128`` by default). :param access_log_class: class for `access_logger`. Default: :data:`aiohttp.helpers.AccessLogger`. Must to be a subclass of :class:`aiohttp.abc.AbstractAccessLogger`. :param access_log: :class:`logging.Logger` instance used for saving access logs. Use ``None`` for disabling logs for sake of speedup. :param access_log_format: access log format, see :ref:`aiohttp-logging-access-log-format-spec` for details. :param bool handle_signals: override signal TERM handling to gracefully exit the application. :param bool reuse_address: tells the kernel to reuse a local socket in TIME_WAIT state, without waiting for its natural timeout to expire. If not specified will automatically be set to True on UNIX. :param bool reuse_port: tells the kernel to allow this endpoint to be bound to the same port as other existing endpoints are bound to, so long as they all set this flag when being created. This option is not supported on Windows. :param bool handler_cancellation: cancels the web handler task if the client drops the connection. This is recommended if familiar with asyncio behavior or scalability is a concern. :ref:`aiohttp-web-peer-disconnection` .. versionadded:: 3.0 Support *access_log_class* parameter. Support *reuse_address*, *reuse_port* parameter. .. versionadded:: 3.1 Accept a coroutine as *app* parameter. .. versionadded:: 3.9 Support handler_cancellation parameter (this was the default behavior in aiohttp <3.7). Constants --------- .. class:: ContentCoding An :class:`enum.Enum` class of available Content Codings. .. attribute:: deflate *DEFLATE compression* .. attribute:: gzip *GZIP compression* .. attribute:: identity *no compression* Middlewares ----------- .. function:: normalize_path_middleware(*, \ append_slash=True, \ remove_slash=False, \ merge_slashes=True, \ redirect_class=HTTPPermanentRedirect) Middleware factory which produces a middleware that normalizes the path of a request. By normalizing it means: - Add or remove a trailing slash to the path. - Double slashes are replaced by one. The middleware returns as soon as it finds a path that resolves correctly. The order if both merge and append/remove are enabled is: 1. *merge_slashes* 2. *append_slash* or *remove_slash* 3. both *merge_slashes* and *append_slash* or *remove_slash* If the path resolves with at least one of those conditions, it will redirect to the new path. Only one of *append_slash* and *remove_slash* can be enabled. If both are ``True`` the factory will raise an ``AssertionError`` If *append_slash* is ``True`` the middleware will append a slash when needed. If a resource is defined with trailing slash and the request comes without it, it will append it automatically. If *remove_slash* is ``True``, *append_slash* must be ``False``. When enabled the middleware will remove trailing slashes and redirect if the resource is defined. If *merge_slashes* is ``True``, merge multiple consecutive slashes in the path into one. .. versionadded:: 3.4 Support for *remove_slash* ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/websocket_utilities.rst0000644000175100001770000001132214607525266020364 0ustar00runnerdockerWebSocket utilities =================== .. currentmodule:: aiohttp .. class:: WSCloseCode An :class:`~enum.IntEnum` for keeping close message code. .. attribute:: OK A normal closure, meaning that the purpose for which the connection was established has been fulfilled. .. attribute:: GOING_AWAY An endpoint is "going away", such as a server going down or a browser having navigated away from a page. .. attribute:: PROTOCOL_ERROR An endpoint is terminating the connection due to a protocol error. .. attribute:: UNSUPPORTED_DATA An endpoint is terminating the connection because it has received a type of data it cannot accept (e.g., an endpoint that understands only text data MAY send this if it receives a binary message). .. attribute:: INVALID_TEXT An endpoint is terminating the connection because it has received data within a message that was not consistent with the type of the message (e.g., non-UTF-8 :rfc:`3629` data within a text message). .. attribute:: POLICY_VIOLATION An endpoint is terminating the connection because it has received a message that violates its policy. This is a generic status code that can be returned when there is no other more suitable status code (e.g., :attr:`~aiohttp.WSCloseCode.UNSUPPORTED_DATA` or :attr:`~aiohttp.WSCloseCode.MESSAGE_TOO_BIG`) or if there is a need to hide specific details about the policy. .. attribute:: MESSAGE_TOO_BIG An endpoint is terminating the connection because it has received a message that is too big for it to process. .. attribute:: MANDATORY_EXTENSION An endpoint (client) is terminating the connection because it has expected the server to negotiate one or more extension, but the server did not return them in the response message of the WebSocket handshake. The list of extensions that are needed should appear in the /reason/ part of the Close frame. Note that this status code is not used by the server, because it can fail the WebSocket handshake instead. .. attribute:: INTERNAL_ERROR A server is terminating the connection because it encountered an unexpected condition that prevented it from fulfilling the request. .. attribute:: SERVICE_RESTART The service is restarted. a client may reconnect, and if it chooses to do, should reconnect using a randomized delay of 5-30s. .. attribute:: TRY_AGAIN_LATER The service is experiencing overload. A client should only connect to a different IP (when there are multiple for the target) or reconnect to the same IP upon user action. .. attribute:: ABNORMAL_CLOSURE Used to indicate that a connection was closed abnormally (that is, with no close frame being sent) when a status code is expected. .. attribute:: BAD_GATEWAY The server was acting as a gateway or proxy and received an invalid response from the upstream server. This is similar to 502 HTTP Status Code. .. class:: WSMsgType An :class:`~enum.IntEnum` for describing :class:`WSMessage` type. .. attribute:: CONTINUATION A mark for continuation frame, user will never get the message with this type. .. attribute:: TEXT Text message, the value has :class:`str` type. .. attribute:: BINARY Binary message, the value has :class:`bytes` type. .. attribute:: PING Ping frame (sent by client peer). .. attribute:: PONG Pong frame, answer on ping. Sent by server peer. .. attribute:: CLOSE Close frame. .. attribute:: CLOSED FRAME Actually not frame but a flag indicating that websocket was closed. .. attribute:: ERROR Actually not frame but a flag indicating that websocket was received an error. .. class:: WSMessage Websocket message, returned by ``.receive()`` calls. .. attribute:: type Message type, :class:`WSMsgType` instance. .. attribute:: data Message payload. 1. :class:`str` for :attr:`WSMsgType.TEXT` messages. 2. :class:`bytes` for :attr:`WSMsgType.BINARY` messages. 3. :class:`WSCloseCode` for :attr:`WSMsgType.CLOSE` messages. 4. :class:`bytes` for :attr:`WSMsgType.PING` messages. 5. :class:`bytes` for :attr:`WSMsgType.PONG` messages. .. attribute:: extra Additional info, :class:`str`. Makes sense only for :attr:`WSMsgType.CLOSE` messages, contains optional message description. .. method:: json(*, loads=json.loads) Returns parsed JSON data. :param loads: optional JSON decoder function. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/whats_new_1_1.rst0000644000175100001770000001046614607525266016752 0ustar00runnerdocker========================= What's new in aiohttp 1.1 ========================= YARL and URL encoding ====================== Since aiohttp 1.1 the library uses :term:`yarl` for URL processing. New API ------- :class:`yarl.URL` gives handy methods for URL operations etc. Client API still accepts :class:`str` everywhere *url* is used, e.g. ``session.get('http://example.com')`` works as well as ``session.get(yarl.URL('http://example.com'))``. Internal API has been switched to :class:`yarl.URL`. :class:`aiohttp.CookieJar` accepts :class:`~yarl.URL` instances only. On server side has added :attr:`aiohttp.web.BaseRequest.url` and :attr:`aiohttp.web.BaseRequest.rel_url` properties for representing relative and absolute request's URL. URL using is the recommended way, already existed properties for retrieving URL parts are deprecated and will be eventually removed. Redirection web exceptions accepts :class:`yarl.URL` as *location* parameter. :class:`str` is still supported and will be supported forever. Reverse URL processing for *router* has been changed. The main API is ``aiohttp.web.Request.url_for`` which returns a :class:`yarl.URL` instance for named resource. It does not support *query args* but adding *args* is trivial: ``request.url_for('named_resource', param='a').with_query(arg='val')``. The method returns a *relative* URL, absolute URL may be constructed by ``request.url.join(request.url_for(...)`` call. URL encoding ------------ YARL encodes all non-ASCII symbols on :class:`yarl.URL` creation. Thus ``URL('https://www.python.org/путь')`` becomes ``'https://www.python.org/%D0%BF%D1%83%D1%82%D1%8C'``. On filling route table it's possible to use both non-ASCII and percent encoded paths:: app.router.add_get('/путь', handler) and:: app.router.add_get('/%D0%BF%D1%83%D1%82%D1%8C', handler) are the same. Internally ``'/путь'`` is converted into percent-encoding representation. Route matching also accepts both URL forms: raw and encoded by converting the route pattern to *canonical* (encoded) form on route registration. Sub-Applications ================ Sub applications are designed for solving the problem of the big monolithic code base. Let's assume we have a project with own business logic and tools like administration panel and debug toolbar. Administration panel is a separate application by its own nature but all toolbar URLs are served by prefix like ``/admin``. Thus we'll create a totally separate application named ``admin`` and connect it to main app with prefix:: admin = web.Application() # setup admin routes, signals and middlewares app.add_subapp('/admin/', admin) Middlewares and signals from ``app`` and ``admin`` are chained. It means that if URL is ``'/admin/something'`` middlewares from ``app`` are applied first and ``admin.middlewares`` are the next in the call chain. The same is going for :attr:`~aiohttp.web.Application.on_response_prepare` signal -- the signal is delivered to both top level ``app`` and ``admin`` if processing URL is routed to ``admin`` sub-application. Common signals like :attr:`~aiohttp.web.Application.on_startup`, :attr:`~aiohttp.web.Application.on_shutdown` and :attr:`~aiohttp.web.Application.on_cleanup` are delivered to all registered sub-applications. The passed parameter is sub-application instance, not top-level application. Third level sub-applications can be nested into second level ones -- there are no limitation for nesting level. Url reversing ------------- Url reversing for sub-applications should generate urls with proper prefix. But for getting URL sub-application's router should be used:: admin = web.Application() admin.add_get('/resource', handler, name='name') app.add_subapp('/admin/', admin) url = admin.router['name'].url_for() The generated ``url`` from example will have a value ``URL('/admin/resource')``. Application freezing ==================== Application can be used either as main app (``app.make_handler()``) or as sub-application -- not both cases at the same time. After connecting application by ``.add_subapp()`` call or starting serving web-server as toplevel application the application is **frozen**. It means that registering new routes, signals and middlewares is forbidden. Changing state (``app['name'] = 'value'``) of frozen application is deprecated and will be eventually removed. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/docs/whats_new_3_0.rst0000644000175100001770000000461414607525266016751 0ustar00runnerdocker.. _aiohttp_whats_new_3_0: ========================= What's new in aiohttp 3.0 ========================= async/await everywhere ====================== The main change is dropping ``yield from`` support and using ``async``/``await`` everywhere. Farewell, Python 3.4. The minimal supported Python version is **3.5.3** now. Why not *3.5.0*? Because *3.5.3* has a crucial change: :func:`asyncio.get_event_loop()` returns the running loop instead of *default*, which may be different, e.g.:: loop = asyncio.new_event_loop() loop.run_until_complete(f()) Note, :func:`asyncio.set_event_loop` was not called and default loop is not equal to actually executed one. Application Runners =================== People constantly asked about ability to run aiohttp servers together with other asyncio code, but :func:`aiohttp.web.run_app` is blocking synchronous call. aiohttp had support for starting the application without ``run_app`` but the API was very low-level and cumbersome. Now application runners solve the task in a few lines of code, see :ref:`aiohttp-web-app-runners` for details. Client Tracing ============== Other long awaited feature is tracing client request life cycle to figure out when and why client request spends a time waiting for connection establishment, getting server response headers etc. Now it is possible by registering special signal handlers on every request processing stage. :ref:`aiohttp-client-tracing` provides more info about the feature. HTTPS support ============= Unfortunately asyncio has a bug with checking SSL certificates for non-ASCII site DNS names, e.g. `https://историк.рф `_ or `https://雜草工作室.香港 `_. The bug has been fixed in upcoming Python 3.7 only (the change requires breaking backward compatibility in :mod:`ssl` API). aiohttp installs a fix for older Python versions (3.5 and 3.6). Dropped obsolete API ==================== A switch to new major version is a great chance for dropping already deprecated features. The release dropped a lot, see :ref:`aiohttp_changes` for details. All removals was already marked as deprecated or related to very low level implementation details. If user code did not raise :exc:`DeprecationWarning` it is compatible with aiohttp 3.0 most likely. Summary ======= Enjoy aiohttp 3.0 release! The full change log is here: :ref:`aiohttp_changes`. ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1713285830.519115 aiohttp-3.9.5/examples/0000755000175100001770000000000014607525307014434 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/__init__.py0000644000175100001770000000000014607525266016537 0ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/background_tasks.py0000755000175100001770000000373314607525266020347 0ustar00runnerdocker#!/usr/bin/env python3 """Example of aiohttp.web.Application.on_startup signal handler""" import asyncio from typing import List import aioredis from aiohttp import web redis_listener = web.AppKey("redis_listener", asyncio.Task[None]) websockets = web.AppKey("websockets", List[web.WebSocketResponse]) async def websocket_handler(request): ws = web.WebSocketResponse() await ws.prepare(request) request.app[websockets].append(ws) try: async for msg in ws: print(msg) await asyncio.sleep(1) finally: request.app[websockets].remove(ws) return ws async def on_shutdown(app: web.Application) -> None: for ws in app[websockets]: await ws.close(code=999, message=b"Server shutdown") async def listen_to_redis(app): try: sub = await aioredis.Redis(host="localhost", port=6379) ch, *_ = await sub.subscribe("news") async for msg in ch.iter(encoding="utf-8"): # Forward message to all connected websockets: for ws in app[websockets]: await ws.send_str(f"{ch.name}: {msg}") print(f"message in {ch.name}: {msg}") except asyncio.CancelledError: pass finally: print("Cancel Redis listener: close connection...") await sub.unsubscribe(ch.name) await sub.quit() print("Redis connection closed.") async def start_background_tasks(app: web.Application) -> None: app[redis_listener] = asyncio.create_task(listen_to_redis(app)) async def cleanup_background_tasks(app): print("cleanup background tasks...") app[redis_listener].cancel() await app[redis_listener] def init(): app = web.Application() l: List[web.WebSocketResponse] = [] app[websockets] = l app.router.add_get("/news", websocket_handler) app.on_startup.append(start_background_tasks) app.on_cleanup.append(cleanup_background_tasks) app.on_shutdown.append(on_shutdown) return app web.run_app(init()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/cli_app.py0000755000175100001770000000272714607525266016434 0ustar00runnerdocker#!/usr/bin/env python3 """ Example of serving an Application using the `aiohttp.web` CLI. Serve this app using:: $ python -m aiohttp.web -H localhost -P 8080 --repeat 10 cli_app:init \ > "Hello World" Here ``--repeat`` & ``"Hello World"`` are application specific command-line arguments. `aiohttp.web` only parses & consumes the command-line arguments it needs (i.e. ``-H``, ``-P`` & ``entry-func``) and passes on any additional arguments to the `cli_app:init` function for processing. """ from argparse import ArgumentParser, Namespace from aiohttp import web args_key = web.AppKey("args_key", Namespace) async def display_message(req: web.Request) -> web.StreamResponse: args = req.app[args_key] text = "\n".join([args.message] * args.repeat) return web.Response(text=text) def init(argv): arg_parser = ArgumentParser( prog="aiohttp.web ...", description="Application CLI", add_help=False ) # Positional argument arg_parser.add_argument("message", help="message to print") # Optional argument arg_parser.add_argument( "--repeat", help="number of times to repeat message", type=int, default="1" ) # Avoid conflict with -h from `aiohttp.web` CLI parser arg_parser.add_argument( "--app-help", help="show this message and exit", action="help" ) args = arg_parser.parse_args(argv) app = web.Application() app[args_key] = args app.router.add_get("/", display_message) return app ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/client_auth.py0000755000175100001770000000104714607525266017316 0ustar00runnerdocker#!/usr/bin/env python3 import asyncio import aiohttp async def fetch(session): print("Query http://httpbin.org/basic-auth/andrew/password") async with session.get("http://httpbin.org/basic-auth/andrew/password") as resp: print(resp.status) body = await resp.text() print(body) async def go(loop): async with aiohttp.ClientSession( auth=aiohttp.BasicAuth("andrew", "password"), loop=loop ) as session: await fetch(session) loop = asyncio.get_event_loop() loop.run_until_complete(go(loop)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/client_json.py0000755000175100001770000000075114607525266017327 0ustar00runnerdocker#!/usr/bin/env python3 import asyncio import aiohttp async def fetch(session: aiohttp.ClientSession) -> None: print("Query http://httpbin.org/get") async with session.get("http://httpbin.org/get") as resp: print(resp.status) data = await resp.json() print(data) async def go(loop): async with aiohttp.ClientSession(loop=loop) as session: await fetch(session) loop = asyncio.get_event_loop() loop.run_until_complete(go(loop)) loop.close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/client_ws.py0000755000175100001770000000416114607525266017006 0ustar00runnerdocker#!/usr/bin/env python3 """websocket cmd client for web_ws.py example.""" import argparse import asyncio import sys from contextlib import suppress import aiohttp async def start_client(url: str) -> None: name = input("Please enter your name: ") async def dispatch(ws: aiohttp.ClientWebSocketResponse) -> None: while True: msg = await ws.receive() if msg.type == aiohttp.WSMsgType.TEXT: print("Text: ", msg.data.strip()) elif msg.type == aiohttp.WSMsgType.BINARY: print("Binary: ", msg.data) elif msg.type == aiohttp.WSMsgType.PING: await ws.pong() elif msg.type == aiohttp.WSMsgType.PONG: print("Pong received") else: if msg.type == aiohttp.WSMsgType.CLOSE: await ws.close() elif msg.type == aiohttp.WSMsgType.ERROR: print("Error during receive %s" % ws.exception()) elif msg.type == aiohttp.WSMsgType.CLOSED: pass break async with aiohttp.ClientSession() as session: async with session.ws_connect(url, autoclose=False, autoping=False) as ws: # send request dispatch_task = asyncio.create_task(dispatch(ws)) # Exit with Ctrl+D while line := await asyncio.to_thread(sys.stdin.readline): await ws.send_str(name + ": " + line) dispatch_task.cancel() with suppress(asyncio.CancelledError): await dispatch_task ARGS = argparse.ArgumentParser( description="websocket console client for wssrv.py example." ) ARGS.add_argument( "--host", action="store", dest="host", default="127.0.0.1", help="Host name" ) ARGS.add_argument( "--port", action="store", dest="port", default=8080, type=int, help="Port number" ) if __name__ == "__main__": args = ARGS.parse_args() if ":" in args.host: args.host, port = args.host.split(":", 1) args.port = int(port) url = f"http://{args.host}:{args.port}" asyncio.run(start_client(url)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/curl.py0000755000175100001770000000204014607525266015756 0ustar00runnerdocker#!/usr/bin/env python3 import argparse import asyncio import sys import aiohttp async def curl(url): async with aiohttp.ClientSession() as session: async with session.request("GET", url) as response: print(repr(response)) chunk = await response.content.read() print("Downloaded: %s" % len(chunk)) if __name__ == "__main__": ARGS = argparse.ArgumentParser(description="GET url example") ARGS.add_argument("url", nargs=1, metavar="URL", help="URL to download") ARGS.add_argument( "--iocp", default=False, action="store_true", help="Use ProactorEventLoop on Windows", ) options = ARGS.parse_args() if options.iocp and sys.platform == "win32": from asyncio import events, windows_events # https://github.com/python/mypy/issues/12286 el = windows_events.ProactorEventLoop() # type: ignore[attr-defined] events.set_event_loop(el) loop = asyncio.get_event_loop() loop.run_until_complete(curl(options.url[0])) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/fake_server.py0000755000175100001770000000746614607525266017326 0ustar00runnerdocker#!/usr/bin/env python3 import asyncio import pathlib import socket import ssl import aiohttp from aiohttp import web from aiohttp.abc import AbstractResolver from aiohttp.resolver import DefaultResolver from aiohttp.test_utils import unused_port class FakeResolver(AbstractResolver): _LOCAL_HOST = {0: "127.0.0.1", socket.AF_INET: "127.0.0.1", socket.AF_INET6: "::1"} def __init__(self, fakes, *, loop): """fakes -- dns -> port dict""" self._fakes = fakes self._resolver = DefaultResolver(loop=loop) async def resolve(self, host, port=0, family=socket.AF_INET): fake_port = self._fakes.get(host) if fake_port is not None: return [ { "hostname": host, "host": self._LOCAL_HOST[family], "port": fake_port, "family": family, "proto": 0, "flags": socket.AI_NUMERICHOST, } ] else: return await self._resolver.resolve(host, port, family) async def close(self) -> None: await self._resolver.close() class FakeFacebook: def __init__(self, *, loop): self.loop = loop self.app = web.Application(loop=loop) self.app.router.add_routes( [ web.get("/v2.7/me", self.on_me), web.get("/v2.7/me/friends", self.on_my_friends), ] ) self.runner = web.AppRunner(self.app) here = pathlib.Path(__file__) ssl_cert = here.parent / "server.crt" ssl_key = here.parent / "server.key" self.ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) self.ssl_context.load_cert_chain(str(ssl_cert), str(ssl_key)) async def start(self): port = unused_port() self.runner = web.AppRunner(self.app) await self.runner.setup() site = web.TCPSite(self.runner, "127.0.0.1", port, ssl_context=self.ssl_context) await site.start() return {"graph.facebook.com": port} async def stop(self): await self.runner.cleanup() async def on_me(self, request): return web.json_response({"name": "John Doe", "id": "12345678901234567"}) async def on_my_friends(self, request): return web.json_response( { "data": [ {"name": "Bill Doe", "id": "233242342342"}, {"name": "Mary Doe", "id": "2342342343222"}, {"name": "Alex Smith", "id": "234234234344"}, ], "paging": { "cursors": { "before": "QVFIUjRtc2c5NEl0ajN", "after": "QVFIUlpFQWM0TmVuaDRad0dt", }, "next": ( "https://graph.facebook.com/v2.7/12345678901234567/" "friends?access_token=EAACEdEose0cB" ), }, "summary": {"total_count": 3}, } ) async def main(loop): token = "ER34gsSGGS34XCBKd7u" fake_facebook = FakeFacebook(loop=loop) info = await fake_facebook.start() resolver = FakeResolver(info, loop=loop) connector = aiohttp.TCPConnector(loop=loop, resolver=resolver, verify_ssl=False) async with aiohttp.ClientSession(connector=connector, loop=loop) as session: async with session.get( "https://graph.facebook.com/v2.7/me", params={"access_token": token} ) as resp: print(await resp.json()) async with session.get( "https://graph.facebook.com/v2.7/me/friends", params={"access_token": token} ) as resp: print(await resp.json()) await fake_facebook.stop() loop = asyncio.get_event_loop() loop.run_until_complete(main(loop)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/lowlevel_srv.py0000644000175100001770000000104614607525266017536 0ustar00runnerdockerimport asyncio from aiohttp import web async def handler(request): return web.Response(text="OK") async def main(loop): server = web.Server(handler) await loop.create_server(server, "127.0.0.1", 8080) print("======= Serving on http://127.0.0.1:8080/ ======") # pause here for very long time by serving HTTP requests and # waiting for keyboard interruption await asyncio.sleep(100 * 3600) loop = asyncio.get_event_loop() try: loop.run_until_complete(main(loop)) except KeyboardInterrupt: pass loop.close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/server.crt0000644000175100001770000000211714607525266016461 0ustar00runnerdocker-----BEGIN CERTIFICATE----- MIIDADCCAegCCQCgevpPMuTTLzANBgkqhkiG9w0BAQsFADBCMQswCQYDVQQGEwJV QTEQMA4GA1UECAwHVWtyYWluZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ dHkgTHRkMB4XDTE2MDgwNzIzMTMwOFoXDTI2MDgwNTIzMTMwOFowQjELMAkGA1UE BhMCVUExEDAOBgNVBAgMB1VrcmFpbmUxITAfBgNVBAoMGEludGVybmV0IFdpZGdp dHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOUgkn3j X/sdg6GGueGDHCM+snIUVY3fM6D4jXjyBhnT3TqKG1lJwCGYR11AD+2SJYppU+w4 QaF6YZwMeZBKy+mVQ9+CrVYyKQE7j9H8XgNEHV9BQzoragT8lia8eC5aOQzUeX8A xCSSbsnyT/X+S1IKdd0txLOeZOD6pWwJoc3dpDELglk2b1tzhyN2GjQv3aRHj55P x7127MeZyRXwODFpXrpbnwih4OqkA4EYtmqFbZttGEzMhd4Y5mkbyuRbGM+IE99o QJMvnIkjAfUo0aKnDrcAIkWCkwLIci9TIG6u3R1P2Tn+HYVntzQZ4BnxanbFNQ5S 9ARd3529EmO3BzUCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAXyiw1+YUnTEDI3C/ vq1Vn9pnwZALVQPiPlTqEGkl/nbq0suMmeZZG7pwrOJp3wr+sGwRAv9sPTro6srf Vj12wTo4LrTRKEDuS+AUJl0Mut7cPGIUKo+MGeZmmnDjMqcjljN3AO47ef4eWYo5 XGe4r4NDABEk5auOD/vQW5IiIMdmWsaMJ+0mZNpAV2NhAD/6ia28VvSL/yuaNqDW TYTUYHWLH08H6M6qrQ7FdoIDyYR5siqBukQzeqlnuq45bQ3ViYttNIkzZN4jbWJV /MFYLuJQ/fNoalDIC+ec0EIa9NbrfpoocJ8h6HlmWOqkES4QpBSOrkVid64Cdy3P JgiEWg== -----END CERTIFICATE----- ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/server.csr0000644000175100001770000000167014607525266016463 0ustar00runnerdocker-----BEGIN CERTIFICATE REQUEST----- MIIChzCCAW8CAQAwQjELMAkGA1UEBhMCVUExEDAOBgNVBAgMB1VrcmFpbmUxITAf BgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBAOUgkn3jX/sdg6GGueGDHCM+snIUVY3fM6D4jXjyBhnT 3TqKG1lJwCGYR11AD+2SJYppU+w4QaF6YZwMeZBKy+mVQ9+CrVYyKQE7j9H8XgNE HV9BQzoragT8lia8eC5aOQzUeX8AxCSSbsnyT/X+S1IKdd0txLOeZOD6pWwJoc3d pDELglk2b1tzhyN2GjQv3aRHj55Px7127MeZyRXwODFpXrpbnwih4OqkA4EYtmqF bZttGEzMhd4Y5mkbyuRbGM+IE99oQJMvnIkjAfUo0aKnDrcAIkWCkwLIci9TIG6u 3R1P2Tn+HYVntzQZ4BnxanbFNQ5S9ARd3529EmO3BzUCAwEAAaAAMA0GCSqGSIb3 DQEBCwUAA4IBAQDO/PSd29KgisTdGXhntg7yBEhBAjsDW7uQCrdrPSZtFyN6wUHy /1yrrWe56ZuW8jpuP5tG0eTZ+0bT2RXIRot8a2Cc3eBhpoe8M3d84yXjKAoHutGE 5IK+TViQdvT3pT3a7pTmjlf8Ojq9tx+U2ckiz8Ccnjd9yM47M9NgMhrS1aBpVZSt gOD+zzrqMML4xks9id94H7bi9Tgs3AbEJIyDpBpoK6i4OvK7KTidCngCg80qmdTy bcScLapoy1Ped2BKKuxWdOOlP+mDJatc/pcfBLE13AncQjJgMerS9M5RWCBjmRow A+aB6fBEU8bOTrqCryfBeTiV6xzyDDcIXtc6 -----END CERTIFICATE REQUEST----- ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/server.key0000644000175100001770000000321314607525266016457 0ustar00runnerdocker-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEA5SCSfeNf+x2DoYa54YMcIz6ychRVjd8zoPiNePIGGdPdOoob WUnAIZhHXUAP7ZIlimlT7DhBoXphnAx5kErL6ZVD34KtVjIpATuP0fxeA0QdX0FD OitqBPyWJrx4Llo5DNR5fwDEJJJuyfJP9f5LUgp13S3Es55k4PqlbAmhzd2kMQuC WTZvW3OHI3YaNC/dpEePnk/HvXbsx5nJFfA4MWleulufCKHg6qQDgRi2aoVtm20Y TMyF3hjmaRvK5FsYz4gT32hAky+ciSMB9SjRoqcOtwAiRYKTAshyL1Mgbq7dHU/Z Of4dhWe3NBngGfFqdsU1DlL0BF3fnb0SY7cHNQIDAQABAoIBAG9BJ6B03VADfrzZ vDwh+3Gpqd/2u6wNqvYIejk123yDATLBiJIMW3x0goJm7tT+V7gjeJqEnmmYEPlC nWxQxT6AOdq3iw8FgB+XGjhuAAA5/MEZ4VjHZ81QEGBytzBaosT2DqB6cMMJTz5D qEvb1Brb9WsWJCLLUFRloBkbfDOG9lMvt34ixYTTmqjsVj5WByD5BhzKH51OJ72L 00IYpvrsEOtSev1hNV4199CHPYE90T/YQVooRBiHtTcfN+/KNVJu6Rf/zcaJ3WMS 1l3MBI8HwMimjKKkbddpoMHyFMtSNmS9Yq+4a9w7XZo1F5rt88hYSCtAF8HRAarX 0VBCJmkCgYEA9HenBBnmfDoN857femzoTHdWQQrZQ4YPAKHvKPlcgudizE5tQbs0 iTpwm+IsecgJS2Rio7zY+P7A5nKFz3N5c0IX3smYo0J2PoakkLAm25KMxFZYBuz4 MFWVdfByAU7d28BdNfyOVbA2kU2eal9lJ0yPLpMLbH8+bbvw5uBS808CgYEA7++p ftwib3DvKWMpl6G5eA1C2xprdbE0jm2fSr3LYp/vZ4QN2V6kK2YIlyUqQvhYCnxX oIP3v2MWDRHKKwJtBWR4+t23PaDaSXS2Ifm0qhRxwSm/oqpAJQXbR7VzxXp4/4FP 1SgkLe51bubc4h+cDngqBLcplCanvj52CqhqzDsCgYAEIhG8zANNjl22BLWaiETV Jh9bMifCMH4IcLRuaOjbfbX55kmKlvOobkiBGi3OUUd28teIFSVF8GiqfL0uaLFg 9XkZ1yaxe+or3HLjz1aY171xhFQwqcj4aDoCqHIE+6Rclr/8raxqXnRNuJY5DivT okO5cdr7lpsjl83W2WwNmQKBgCPXi1xWChbXqgJmu8nY8NnMMVaFpdPY+t7j5U3G +GDtP1gZU/BKwP9yqInblWqXqp82X+isjg/a/2pIZAj0vdB2Z9Qh1sOwCau7cZG1 uZVGpI+UavojsJ1XOKCHrJmtZ/HTIVfYPT9XRdehSRHGYwuOS8iUi/ODqr8ymXOS IRINAoGBAMEmhTihgFz6Y8ezRK3QTubguehHZG1zIvtgVhOk+8hRUTSJPI9nBJPC 4gOZsPx4g2oLK6PiudPR79bhxRxPACCMnXkdwZ/8FaIdmvRHsWVs8T80wID0wthI r5hW4uqi9CcKZrGWH7mx9cVJktspeGUczvKyzNMfCaojwzA/49Z1 -----END RSA PRIVATE KEY----- ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/server_simple.py0000644000175100001770000000131614607525266017672 0ustar00runnerdocker# server_simple.py from aiohttp import web async def handle(request): name = request.match_info.get("name", "Anonymous") text = "Hello, " + name return web.Response(text=text) async def wshandle(request): ws = web.WebSocketResponse() await ws.prepare(request) async for msg in ws: if msg.type == web.WSMsgType.text: await ws.send_str(f"Hello, {msg.data}") elif msg.type == web.WSMsgType.binary: await ws.send_bytes(msg.data) elif msg.type == web.WSMsgType.close: break return ws app = web.Application() app.add_routes( [web.get("/", handle), web.get("/echo", wshandle), web.get("/{name}", handle)] ) web.run_app(app) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/static_files.py0000755000175100001770000000026514607525266017471 0ustar00runnerdocker#!/usr/bin/env python3 import pathlib from aiohttp import web app = web.Application() app.router.add_static("/", pathlib.Path(__file__).parent, show_index=True) web.run_app(app) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/web_classview.py0000755000175100001770000000274114607525266017656 0ustar00runnerdocker#!/usr/bin/env python3 """Example for aiohttp.web class based views.""" import functools import json from aiohttp import web class MyView(web.View): async def get(self): return web.json_response( { "method": "get", "args": dict(self.request.query), "headers": dict(self.request.headers), }, dumps=functools.partial(json.dumps, indent=4), ) async def post(self): data = await self.request.post() return web.json_response( { "method": "post", "args": dict(self.request.query), "data": dict(data), "headers": dict(self.request.headers), }, dumps=functools.partial(json.dumps, indent=4), ) async def index(request): txt = """ Class based view example

    Class based view example

    • / This page
    • /get Returns GET data.
    • /post Returns POST data.
    """ return web.Response(text=txt, content_type="text/html") def init(): app = web.Application() app.router.add_get("/", index) app.router.add_get("/get", MyView) app.router.add_post("/post", MyView) return app web.run_app(init()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/web_cookies.py0000755000175100001770000000165014607525266017310 0ustar00runnerdocker#!/usr/bin/env python3 """Example for aiohttp.web basic server with cookies.""" from pprint import pformat from typing import NoReturn from aiohttp import web tmpl = """\ Login
    Logout
    {}
    """ async def root(request): resp = web.Response(content_type="text/html") resp.text = tmpl.format(pformat(request.cookies)) return resp async def login(request: web.Request) -> NoReturn: exc = web.HTTPFound(location="/") exc.set_cookie("AUTH", "secret") raise exc async def logout(request: web.Request) -> NoReturn: exc = web.HTTPFound(location="/") exc.del_cookie("AUTH") raise exc def init(): app = web.Application() app.router.add_get("/", root) app.router.add_get("/login", login) app.router.add_get("/logout", logout) return app web.run_app(init()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/web_rewrite_headers_middleware.py0000755000175100001770000000125714607525266023230 0ustar00runnerdocker#!/usr/bin/env python3 """Example for rewriting response headers by middleware.""" from aiohttp import web from aiohttp.typedefs import Handler async def handler(request): return web.Response(text="Everything is fine") @web.middleware async def middleware(request: web.Request, handler: Handler) -> web.StreamResponse: try: response = await handler(request) except web.HTTPException as exc: raise exc if not response.prepared: response.headers["SERVER"] = "Secured Server Software" return response def init(): app = web.Application(middlewares=[middleware]) app.router.add_get("/", handler) return app web.run_app(init()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/web_srv.py0000755000175100001770000000255014607525266016466 0ustar00runnerdocker#!/usr/bin/env python3 """Example for aiohttp.web basic server.""" import textwrap from aiohttp import web async def intro(request): txt = textwrap.dedent( """\ Type {url}/hello/John {url}/simple or {url}/change_body in browser url bar """ ).format(url="127.0.0.1:8080") binary = txt.encode("utf8") resp = web.StreamResponse() resp.content_length = len(binary) resp.content_type = "text/plain" await resp.prepare(request) await resp.write(binary) return resp async def simple(request): return web.Response(text="Simple answer") async def change_body(request): resp = web.Response() resp.body = b"Body changed" resp.content_type = "text/plain" return resp async def hello(request): resp = web.StreamResponse() name = request.match_info.get("name", "Anonymous") answer = ("Hello, " + name).encode("utf8") resp.content_length = len(answer) resp.content_type = "text/plain" await resp.prepare(request) await resp.write(answer) await resp.write_eof() return resp def init(): app = web.Application() app.router.add_get("/", intro) app.router.add_get("/simple", simple) app.router.add_get("/change_body", change_body) app.router.add_get("/hello/{name}", hello) app.router.add_get("/hello", hello) return app web.run_app(init()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/web_srv_route_deco.py0000644000175100001770000000251714607525266020676 0ustar00runnerdocker#!/usr/bin/env python3 """Example for aiohttp.web basic server with decorator definition for routes.""" import textwrap from aiohttp import web routes = web.RouteTableDef() @routes.get("/") async def intro(request): txt = textwrap.dedent( """\ Type {url}/hello/John {url}/simple or {url}/change_body in browser url bar """ ).format(url="127.0.0.1:8080") binary = txt.encode("utf8") resp = web.StreamResponse() resp.content_length = len(binary) resp.content_type = "text/plain" await resp.prepare(request) await resp.write(binary) return resp @routes.get("/simple") async def simple(request): return web.Response(text="Simple answer") @routes.get("/change_body") async def change_body(request): resp = web.Response() resp.body = b"Body changed" resp.content_type = "text/plain" return resp @routes.get("/hello") async def hello(request): resp = web.StreamResponse() name = request.match_info.get("name", "Anonymous") answer = ("Hello, " + name).encode("utf8") resp.content_length = len(answer) resp.content_type = "text/plain" await resp.prepare(request) await resp.write(answer) await resp.write_eof() return resp def init(): app = web.Application() app.router.add_routes(routes) return app web.run_app(init()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/web_srv_route_table.py0000644000175100001770000000266414607525266021056 0ustar00runnerdocker#!/usr/bin/env python3 """Example for aiohttp.web basic server with table definition for routes.""" import textwrap from aiohttp import web async def intro(request): txt = textwrap.dedent( """\ Type {url}/hello/John {url}/simple or {url}/change_body in browser url bar """ ).format(url="127.0.0.1:8080") binary = txt.encode("utf8") resp = web.StreamResponse() resp.content_length = len(binary) resp.content_type = "text/plain" await resp.prepare(request) await resp.write(binary) return resp async def simple(request): return web.Response(text="Simple answer") async def change_body(request): resp = web.Response() resp.body = b"Body changed" resp.content_type = "text/plain" return resp async def hello(request): resp = web.StreamResponse() name = request.match_info.get("name", "Anonymous") answer = ("Hello, " + name).encode("utf8") resp.content_length = len(answer) resp.content_type = "text/plain" await resp.prepare(request) await resp.write(answer) await resp.write_eof() return resp def init(): app = web.Application() app.router.add_routes( [ web.get("/", intro), web.get("/simple", simple), web.get("/change_body", change_body), web.get("/hello/{name}", hello), web.get("/hello", hello), ] ) return app web.run_app(init()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/web_ws.py0000755000175100001770000000357114607525266016311 0ustar00runnerdocker#!/usr/bin/env python3 """Example for aiohttp.web websocket server.""" # The extra strict mypy settings are here to help test that `Application[AppKey()]` # syntax is working correctly. A regression will cause mypy to raise an error. # mypy: disallow-any-expr, disallow-any-unimported, disallow-subclassing-any import os from typing import List from aiohttp import web WS_FILE = os.path.join(os.path.dirname(__file__), "websocket.html") sockets = web.AppKey("sockets", List[web.WebSocketResponse]) async def wshandler(request: web.Request) -> web.StreamResponse: resp = web.WebSocketResponse() available = resp.can_prepare(request) if not available: with open(WS_FILE, "rb") as fp: return web.Response(body=fp.read(), content_type="text/html") await resp.prepare(request) await resp.send_str("Welcome!!!") try: print("Someone joined.") for ws in request.app[sockets]: await ws.send_str("Someone joined") request.app[sockets].append(resp) async for msg in resp: # type: ignore[misc] if msg.type == web.WSMsgType.TEXT: # type: ignore[misc] for ws in request.app[sockets]: if ws is not resp: await ws.send_str(msg.data) # type: ignore[misc] else: return resp return resp finally: request.app[sockets].remove(resp) print("Someone disconnected.") for ws in request.app[sockets]: await ws.send_str("Someone disconnected.") async def on_shutdown(app: web.Application) -> None: for ws in app[sockets]: await ws.close() def init() -> web.Application: app = web.Application() l: List[web.WebSocketResponse] = [] app[sockets] = l app.router.add_get("/", wshandler) app.on_shutdown.append(on_shutdown) return app web.run_app(init()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/examples/websocket.html0000644000175100001770000000573214607525266017323 0ustar00runnerdocker

    Chat!

     | Status: disconnected
    ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/pyproject.toml0000644000175100001770000000501014607525266015532 0ustar00runnerdocker[build-system] requires = [ "setuptools >= 46.4.0", ] build-backend = "setuptools.build_meta" [tool.towncrier] package = "aiohttp" filename = "CHANGES.rst" directory = "CHANGES/" title_format = "{version} ({project_date})" template = "CHANGES/.TEMPLATE.rst" issue_format = "{issue}" # NOTE: The types are declared because: # NOTE: - there is no mechanism to override just the value of # NOTE: `tool.towncrier.type.misc.showcontent`; # NOTE: - and, we want to declare extra non-default types for # NOTE: clarity and flexibility. [[tool.towncrier.section]] path = "" [[tool.towncrier.type]] # Something we deemed an improper undesired behavior that got corrected # in the release to match pre-agreed expectations. directory = "bugfix" name = "Bug fixes" showcontent = true [[tool.towncrier.type]] # New behaviors, public APIs. That sort of stuff. directory = "feature" name = "Features" showcontent = true [[tool.towncrier.type]] # Declarations of future API removals and breaking changes in behavior. directory = "deprecation" name = "Deprecations (removal in next major release)" showcontent = true [[tool.towncrier.type]] # When something public gets removed in a breaking way. Could be # deprecated in an earlier release. directory = "breaking" name = "Removals and backward incompatible breaking changes" showcontent = true [[tool.towncrier.type]] # Notable updates to the documentation structure or build process. directory = "doc" name = "Improved documentation" showcontent = true [[tool.towncrier.type]] # Notes for downstreams about unobvious side effects and tooling. Changes # in the test invocation considerations and runtime assumptions. directory = "packaging" name = "Packaging updates and notes for downstreams" showcontent = true [[tool.towncrier.type]] # Stuff that affects the contributor experience. e.g. Running tests, # building the docs, setting up the development environment. directory = "contrib" name = "Contributor-facing changes" showcontent = true [[tool.towncrier.type]] # Changes that are hard to assign to any of the above categories. directory = "misc" name = "Miscellaneous internal changes" showcontent = true [tool.cibuildwheel] test-command = "" # don't build PyPy wheels, install from source instead skip = "pp*" [tool.codespell] skip = '.git,*.pdf,*.svg,Makefile,CONTRIBUTORS.txt,venvs,_build' ignore-words-list = 'te' ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1713285830.523115 aiohttp-3.9.5/requirements/0000755000175100001770000000000014607525307015341 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1713285830.523115 aiohttp-3.9.5/requirements/.hash/0000755000175100001770000000000014607525307016342 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285825.0 aiohttp-3.9.5/requirements/.hash/cython.txt.hash0000644000175100001770000000017414607525301021325 0ustar00runnerdocker568bc64a6a44121726592a8966a04919f5781004cca7efb8d7afc1135ebf54fd /home/runner/work/aiohttp/aiohttp/requirements/cython.txt ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/base.in0000644000175100001770000000022714607525266016610 0ustar00runnerdocker-r typing-extensions.in -r runtime-deps.in gunicorn uvloop; platform_system != "Windows" and implementation_name == "cpython" # MagicStack/uvloop#14 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/base.txt0000644000175100001770000000231414607525266017020 0ustar00runnerdocker# # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # # pip-compile --allow-unsafe --output-file=requirements/base.txt --strip-extras requirements/base.in # aiodns==3.1.1 ; sys_platform == "linux" or sys_platform == "darwin" # via -r requirements/runtime-deps.in aiosignal==1.3.1 # via -r requirements/runtime-deps.in async-timeout==4.0.3 ; python_version < "3.11" # via -r requirements/runtime-deps.in attrs==23.1.0 # via -r requirements/runtime-deps.in brotli==1.1.0 ; platform_python_implementation == "CPython" # via -r requirements/runtime-deps.in cffi==1.15.1 # via pycares frozenlist==1.4.0 # via # -r requirements/runtime-deps.in # aiosignal gunicorn==21.2.0 # via -r requirements/base.in idna==3.4 # via yarl multidict==6.0.4 # via # -r requirements/runtime-deps.in # yarl packaging==23.1 # via gunicorn pycares==4.3.0 # via aiodns pycparser==2.21 # via cffi typing-extensions==4.7.1 # via -r requirements/typing-extensions.in uvloop==0.19.0 ; platform_system != "Windows" and implementation_name == "cpython" # via -r requirements/base.in yarl==1.9.3 # via -r requirements/runtime-deps.in ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/broken-projects.in0000644000175100001770000000011614607525266021002 0ustar00runnerdockerPillow < 10 # https://github.com/blockdiag/sphinxcontrib-blockdiag/issues/26 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/constraints.in0000644000175100001770000000006514607525266020245 0ustar00runnerdocker-r cython.in -r dev.in -r doc-spelling.in -r lint.in ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/constraints.txt0000644000175100001770000001355714607525266020470 0ustar00runnerdocker# # This file is autogenerated by pip-compile with python 3.8 # To update, run: # # pip-compile --allow-unsafe --output-file=requirements/constraints.txt --resolver=backtracking --strip-extras requirements/constraints.in # aiodns==3.1.1 ; sys_platform == "linux" or sys_platform == "darwin" # via -r requirements/runtime-deps.in aiohttp-theme==0.1.6 # via -r requirements/doc.in aioredis==2.0.1 # via -r requirements/lint.in aiosignal==1.3.1 # via -r requirements/runtime-deps.in alabaster==0.7.12 # via sphinx annotated-types==0.5.0 # via pydantic async-timeout==4.0.3 ; python_version < "3.11" # via # -r requirements/runtime-deps.in # aioredis attrs==23.1.0 # via -r requirements/runtime-deps.in babel==2.9.1 # via sphinx backports-entry-points-selectable==1.1.1 # via virtualenv blockdiag==2.0.1 # via sphinxcontrib-blockdiag brotli==1.1.0 ; platform_python_implementation == "CPython" # via -r requirements/runtime-deps.in build==0.9.0 # via pip-tools certifi==2023.7.22 # via requests cffi==1.15.0 # via # cryptography # pycares cfgv==3.3.1 # via pre-commit charset-normalizer==3.2.0 # via requests cherry-picker==2.2.0 # via -r requirements/dev.in click==8.0.3 # via # cherry-picker # pip-tools # slotscheck # towncrier # typer # wait-for-it coverage==7.3.2 # via # -r requirements/test.in # pytest-cov cryptography==41.0.2 # via # pyjwt # trustme cython==3.0.5 # via -r requirements/cython.in distlib==0.3.3 # via virtualenv docutils==0.20.1 # via sphinx exceptiongroup==1.1.2 # via pytest filelock==3.3.2 # via virtualenv freezegun==1.3.0 # via -r requirements/test.in frozenlist==1.4.0 # via # -r requirements/runtime-deps.in # aiosignal funcparserlib==1.0.1 # via blockdiag gidgethub==5.0.1 # via cherry-picker gunicorn==21.2.0 # via -r requirements/base.in identify==2.3.5 # via pre-commit idna==3.3 # via # requests # trustme # yarl imagesize==1.3.0 # via sphinx incremental==22.10.0 # via towncrier iniconfig==1.1.1 # via pytest jinja2==3.0.3 # via # sphinx # towncrier markupsafe==2.0.1 # via jinja2 multidict==6.0.4 # via # -r requirements/multidict.in # -r requirements/runtime-deps.in # yarl mypy==1.7.1 ; implementation_name == "cpython" # via # -r requirements/lint.in # -r requirements/test.in mypy-extensions==1.0.0 # via mypy nodeenv==1.6.0 # via pre-commit packaging==21.2 # via # build # gunicorn # pytest # sphinx pep517==0.12.0 # via build pillow==9.5.0 # via # -c requirements/broken-projects.in # blockdiag pip-tools==7.3.0 # via -r requirements/dev.in platformdirs==2.4.0 # via virtualenv pluggy==1.0.0 # via pytest pre-commit==3.5.0 # via -r requirements/lint.in proxy-py==2.4.4rc4 # via -r requirements/test.in pycares==4.3.0 # via aiodns pycparser==2.21 # via cffi pydantic==2.2.0 # via python-on-whales pydantic-core==2.6.0 # via pydantic pyenchant==3.2.2 # via sphinxcontrib-spelling pygments==2.15.1 # via sphinx pyjwt==2.3.0 # via # gidgethub # pyjwt pyparsing==2.4.7 # via packaging pytest==7.4.3 # via # -r requirements/lint.in # -r requirements/test.in # pytest-cov # pytest-mock pytest-cov==4.1.0 # via -r requirements/test.in pytest-mock==3.12.0 # via -r requirements/test.in python-dateutil==2.8.2 # via freezegun python-on-whales==0.67.0 # via -r requirements/test.in pyyaml==6.0.1 # via pre-commit re-assert==1.1.0 # via -r requirements/test.in regex==2021.11.10 # via re-assert requests==2.31.0 # via # cherry-picker # python-on-whales # sphinx setuptools-git==1.2 # via -r requirements/test.in six==1.16.0 # via # python-dateutil # virtualenv slotscheck==0.17.1 # via -r requirements/lint.in snowballstemmer==2.1.0 # via sphinx sphinx==7.1.2 # via # -r requirements/doc.in # sphinxcontrib-blockdiag # sphinxcontrib-spelling # sphinxcontrib-towncrier sphinxcontrib-applehelp==1.0.2 # via sphinx sphinxcontrib-blockdiag==3.0.0 # via -r requirements/doc.in sphinxcontrib-devhelp==1.0.2 # via sphinx sphinxcontrib-htmlhelp==2.0.0 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx sphinxcontrib-spelling==8.0.0 ; platform_system != "Windows" # via -r requirements/doc-spelling.in sphinxcontrib-towncrier==0.4.0a0 # via -r requirements/doc.in tomli==2.0.1 # via # build # cherry-picker # coverage # mypy # pep517 # pip-tools # pytest # slotscheck # towncrier towncrier==23.11.0 # via # -r requirements/doc.in # sphinxcontrib-towncrier tqdm==4.62.3 # via python-on-whales trustme==1.1.0 ; platform_machine != "i686" # via -r requirements/test.in typer==0.6.1 # via python-on-whales typing-extensions==4.7.1 # via # -r requirements/typing-extensions.in # aioredis # annotated-types # mypy # pydantic # pydantic-core # python-on-whales uritemplate==4.1.1 # via gidgethub urllib3==1.26.7 # via requests uvloop==0.19.0 ; platform_system != "Windows" # via # -r requirements/base.in # -r requirements/lint.in virtualenv==20.10.0 # via pre-commit wait-for-it==2.2.2 # via -r requirements/test.in webcolors==1.11.1 # via blockdiag wheel==0.37.0 # via pip-tools yarl==1.9.3 # via -r requirements/runtime-deps.in # The following packages are considered to be unsafe in a requirements file: pip==23.2.1 # via pip-tools setuptools==68.0.0 # via # blockdiag # pip-tools ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/cython.in0000644000175100001770000000015014607525266017175 0ustar00runnerdocker-r multidict.in -r typing-extensions.in # required for parsing aiohttp/hdrs.py by tools/gen.py Cython ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/cython.txt0000644000175100001770000000062414607525266017414 0ustar00runnerdocker# # This file is autogenerated by pip-compile with python 3.8 # by the following command: # # pip-compile --allow-unsafe --output-file=requirements/cython.txt --resolver=backtracking --strip-extras requirements/cython.in # cython==3.0.5 # via -r requirements/cython.in multidict==6.0.4 # via -r requirements/multidict.in typing-extensions==4.7.1 # via -r requirements/typing-extensions.in ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/dev.in0000644000175100001770000000007114607525266016451 0ustar00runnerdocker-r lint.in -r test.in -r doc.in cherry_picker pip-tools ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/dev.txt0000644000175100001770000001304614607525266016670 0ustar00runnerdocker# # This file is autogenerated by pip-compile with python 3.8 # To update, run: # # pip-compile --allow-unsafe --output-file=requirements/dev.txt --resolver=backtracking --strip-extras requirements/dev.in # aiodns==3.1.1 ; sys_platform == "linux" or sys_platform == "darwin" # via -r requirements/runtime-deps.in aiohttp-theme==0.1.6 # via -r requirements/doc.in aioredis==2.0.1 # via -r requirements/lint.in aiosignal==1.3.1 # via -r requirements/runtime-deps.in alabaster==0.7.13 # via sphinx annotated-types==0.5.0 # via pydantic async-timeout==4.0.3 ; python_version < "3.11" # via # -r requirements/runtime-deps.in # aioredis attrs==23.1.0 # via -r requirements/runtime-deps.in babel==2.12.1 # via sphinx blockdiag==3.0.0 # via sphinxcontrib-blockdiag brotli==1.1.0 ; platform_python_implementation == "CPython" # via -r requirements/runtime-deps.in build==0.10.0 # via pip-tools certifi==2023.7.22 # via requests cffi==1.15.1 # via # cryptography # pycares cfgv==3.3.1 # via pre-commit charset-normalizer==3.2.0 # via requests cherry-picker==2.2.0 # via -r requirements/dev.in click==8.1.6 # via # cherry-picker # pip-tools # slotscheck # towncrier # typer # wait-for-it coverage==7.3.2 # via # -r requirements/test.in # pytest-cov cryptography==41.0.3 # via # pyjwt # trustme distlib==0.3.7 # via virtualenv docutils==0.20.1 # via sphinx exceptiongroup==1.1.2 # via pytest filelock==3.12.2 # via virtualenv freezegun==1.3.0 # via -r requirements/test.in frozenlist==1.4.0 # via # -r requirements/runtime-deps.in # aiosignal funcparserlib==1.0.1 # via blockdiag gidgethub==5.3.0 # via cherry-picker gunicorn==21.2.0 # via -r requirements/base.in identify==2.5.26 # via pre-commit idna==3.4 # via # requests # trustme # yarl imagesize==1.4.1 # via sphinx incremental==22.10.0 # via towncrier iniconfig==2.0.0 # via pytest jinja2==3.1.2 # via # sphinx # towncrier markupsafe==2.1.3 # via jinja2 multidict==6.0.4 # via # -r requirements/runtime-deps.in # yarl mypy==1.7.1 ; implementation_name == "cpython" # via # -r requirements/lint.in # -r requirements/test.in mypy-extensions==1.0.0 # via mypy nodeenv==1.8.0 # via pre-commit packaging==23.1 # via # build # gunicorn # pytest # sphinx pillow==9.5.0 # via # -c requirements/broken-projects.in # blockdiag pip-tools==7.3.0 # via -r requirements/dev.in platformdirs==3.10.0 # via virtualenv pluggy==1.2.0 # via pytest pre-commit==3.5.0 # via -r requirements/lint.in proxy-py==2.4.4rc4 # via -r requirements/test.in pycares==4.3.0 # via aiodns pycparser==2.21 # via cffi pydantic==2.2.0 # via python-on-whales pydantic-core==2.6.0 # via pydantic pygments==2.15.1 # via sphinx pyjwt==2.8.0 # via # gidgethub # pyjwt pyproject-hooks==1.0.0 # via build pytest==7.4.3 # via # -r requirements/lint.in # -r requirements/test.in # pytest-cov # pytest-mock pytest-cov==4.1.0 # via -r requirements/test.in pytest-mock==3.12.0 # via -r requirements/test.in python-dateutil==2.8.2 # via freezegun python-on-whales==0.67.0 # via -r requirements/test.in pyyaml==6.0.1 # via pre-commit re-assert==1.1.0 # via -r requirements/test.in regex==2023.6.3 # via re-assert requests==2.31.0 # via # cherry-picker # python-on-whales # sphinx setuptools-git==1.2 # via -r requirements/test.in six==1.16.0 # via python-dateutil slotscheck==0.17.1 # via -r requirements/lint.in snowballstemmer==2.2.0 # via sphinx sphinx==7.1.2 # via # -r requirements/doc.in # sphinxcontrib-blockdiag # sphinxcontrib-towncrier sphinxcontrib-applehelp==1.0.4 # via sphinx sphinxcontrib-blockdiag==3.0.0 # via -r requirements/doc.in sphinxcontrib-devhelp==1.0.2 # via sphinx sphinxcontrib-htmlhelp==2.0.1 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx sphinxcontrib-towncrier==0.4.0a0 # via -r requirements/doc.in tomli==2.0.1 # via # build # cherry-picker # coverage # mypy # pip-tools # pyproject-hooks # pytest # slotscheck # towncrier towncrier==23.11.0 # via # -r requirements/doc.in # sphinxcontrib-towncrier tqdm==4.65.0 # via python-on-whales trustme==1.1.0 ; platform_machine != "i686" # via -r requirements/test.in typer==0.9.0 # via python-on-whales typing-extensions==4.7.1 # via # -r requirements/typing-extensions.in # aioredis # annotated-types # mypy # pydantic # pydantic-core # python-on-whales # typer uritemplate==4.1.1 # via gidgethub urllib3==2.0.4 # via requests uvloop==0.19.0 ; platform_system != "Windows" and implementation_name == "cpython" # via # -r requirements/base.in # -r requirements/lint.in virtualenv==20.24.2 # via pre-commit wait-for-it==2.2.2 # via -r requirements/test.in webcolors==1.13 # via blockdiag wheel==0.41.0 # via pip-tools yarl==1.9.3 # via -r requirements/runtime-deps.in # The following packages are considered to be unsafe in a requirements file: pip==23.2.1 # via pip-tools setuptools==68.0.0 # via # blockdiag # nodeenv # pip-tools ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/doc-spelling.in0000644000175100001770000000015014607525266020251 0ustar00runnerdocker-r doc.in sphinxcontrib-spelling; platform_system!="Windows" # We only use it in GitHub Actions CI/CD ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/doc-spelling.txt0000644000175100001770000000435314607525266020473 0ustar00runnerdocker# # This file is autogenerated by pip-compile with python 3.8 # To update, run: # # pip-compile --allow-unsafe --output-file=requirements/doc-spelling.txt --resolver=backtracking --strip-extras requirements/doc-spelling.in # aiohttp-theme==0.1.6 # via -r requirements/doc.in alabaster==0.7.13 # via sphinx babel==2.12.1 # via sphinx blockdiag==3.0.0 # via sphinxcontrib-blockdiag certifi==2023.7.22 # via requests charset-normalizer==3.3.1 # via requests click==8.1.6 # via towncrier docutils==0.20.1 # via sphinx funcparserlib==1.0.1 # via blockdiag idna==3.4 # via requests imagesize==1.4.1 # via sphinx importlib-metadata==6.8.0 # via sphinx importlib-resources==6.1.1 # via towncrier incremental==22.10.0 # via towncrier jinja2==3.1.2 # via # sphinx # towncrier markupsafe==2.1.3 # via jinja2 packaging==23.1 # via sphinx pillow==9.5.0 # via # -c requirements/broken-projects.in # blockdiag pyenchant==3.2.2 # via sphinxcontrib-spelling pygments==2.15.1 # via sphinx pytz==2023.3.post1 # via babel requests==2.31.0 # via sphinx snowballstemmer==2.2.0 # via sphinx sphinx==7.2.6 # via # -r requirements/doc.in # sphinxcontrib-blockdiag # sphinxcontrib-serializinghtml # sphinxcontrib-spelling # sphinxcontrib-towncrier sphinxcontrib-applehelp==1.0.4 # via sphinx sphinxcontrib-blockdiag==3.0.0 # via -r requirements/doc.in sphinxcontrib-devhelp==1.0.2 # via sphinx sphinxcontrib-htmlhelp==2.0.1 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.9 # via sphinx sphinxcontrib-spelling==8.0.0 ; platform_system != "Windows" # via -r requirements/doc-spelling.in sphinxcontrib-towncrier==0.4.0a0 # via -r requirements/doc.in tomli==2.0.1 # via towncrier towncrier==23.11.0 # via # -r requirements/doc.in # sphinxcontrib-towncrier urllib3==2.0.4 # via requests webcolors==1.13 # via blockdiag zipp==3.17.0 # via # importlib-metadata # importlib-resources # The following packages are considered to be unsafe in a requirements file: setuptools==68.0.0 # via blockdiag ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/doc.in0000644000175100001770000000014614607525266016443 0ustar00runnerdocker-c broken-projects.in aiohttp-theme sphinx sphinxcontrib-blockdiag sphinxcontrib-towncrier towncrier ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/doc.txt0000644000175100001770000000404114607525266016652 0ustar00runnerdocker# # This file is autogenerated by pip-compile with python 3.8 # To update, run: # # pip-compile --allow-unsafe --output-file=requirements/doc.txt --resolver=backtracking --strip-extras requirements/doc.in # aiohttp-theme==0.1.6 # via -r requirements/doc.in alabaster==0.7.13 # via sphinx babel==2.12.1 # via sphinx blockdiag==3.0.0 # via sphinxcontrib-blockdiag certifi==2023.7.22 # via requests charset-normalizer==3.3.1 # via requests click==8.1.6 # via towncrier docutils==0.20.1 # via sphinx funcparserlib==1.0.1 # via blockdiag idna==3.4 # via requests imagesize==1.4.1 # via sphinx importlib-metadata==6.8.0 # via sphinx importlib-resources==6.1.1 # via towncrier incremental==22.10.0 # via towncrier jinja2==3.1.2 # via # sphinx # towncrier markupsafe==2.1.3 # via jinja2 packaging==23.1 # via sphinx pillow==9.5.0 # via # -c requirements/broken-projects.in # blockdiag pygments==2.15.1 # via sphinx pytz==2023.3.post1 # via babel requests==2.31.0 # via sphinx snowballstemmer==2.2.0 # via sphinx sphinx==7.2.6 # via # -r requirements/doc.in # sphinxcontrib-blockdiag # sphinxcontrib-serializinghtml # sphinxcontrib-towncrier sphinxcontrib-applehelp==1.0.4 # via sphinx sphinxcontrib-blockdiag==3.0.0 # via -r requirements/doc.in sphinxcontrib-devhelp==1.0.2 # via sphinx sphinxcontrib-htmlhelp==2.0.1 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.9 # via sphinx sphinxcontrib-towncrier==0.4.0a0 # via -r requirements/doc.in tomli==2.0.1 # via towncrier towncrier==23.11.0 # via # -r requirements/doc.in # sphinxcontrib-towncrier urllib3==2.0.4 # via requests webcolors==1.13 # via blockdiag zipp==3.17.0 # via # importlib-metadata # importlib-resources # The following packages are considered to be unsafe in a requirements file: setuptools==68.0.0 # via blockdiag ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/lint.in0000644000175100001770000000021314607525266016637 0ustar00runnerdocker-r typing-extensions.in aioredis mypy; implementation_name == "cpython" pre-commit pytest slotscheck uvloop; platform_system != "Windows" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/lint.txt0000644000175100001770000000262514607525266017061 0ustar00runnerdocker# # This file is autogenerated by pip-compile with python 3.8 # by the following command: # # pip-compile --allow-unsafe --output-file=requirements/lint.txt --resolver=backtracking --strip-extras requirements/lint.in # aioredis==2.0.1 # via -r requirements/lint.in async-timeout==4.0.3 # via aioredis cfgv==3.3.1 # via pre-commit click==8.1.6 # via slotscheck distlib==0.3.7 # via virtualenv exceptiongroup==1.1.2 # via pytest filelock==3.12.2 # via virtualenv identify==2.5.26 # via pre-commit iniconfig==2.0.0 # via pytest mypy==1.7.1 ; implementation_name == "cpython" # via -r requirements/lint.in mypy-extensions==1.0.0 # via mypy nodeenv==1.8.0 # via pre-commit packaging==23.1 # via pytest platformdirs==3.10.0 # via virtualenv pluggy==1.2.0 # via pytest pre-commit==3.5.0 # via -r requirements/lint.in pytest==7.4.3 # via -r requirements/lint.in pyyaml==6.0.1 # via pre-commit slotscheck==0.17.1 # via -r requirements/lint.in tomli==2.0.1 # via # mypy # pytest # slotscheck typing-extensions==4.7.1 # via # -r requirements/typing-extensions.in # aioredis # mypy uvloop==0.19.0 ; platform_system != "Windows" # via -r requirements/lint.in virtualenv==20.24.2 # via pre-commit # The following packages are considered to be unsafe in a requirements file: setuptools==68.0.0 # via nodeenv ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/multidict.in0000644000175100001770000000001214607525266017664 0ustar00runnerdockermultidict ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/multidict.txt0000644000175100001770000000044014607525266020102 0ustar00runnerdocker# # This file is autogenerated by pip-compile with python 3.8 # by the following command: # # pip-compile --allow-unsafe --output-file=requirements/multidict.txt --resolver=backtracking --strip-extras requirements/multidict.in # multidict==6.0.4 # via -r requirements/multidict.in ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/runtime-deps.in0000644000175100001770000000057514607525266020320 0ustar00runnerdocker# Extracted from `setup.cfg` via `make sync-direct-runtime-deps` aiodns; sys_platform=="linux" or sys_platform=="darwin" aiosignal >= 1.1.2 async-timeout >= 4.0, < 5.0 ; python_version < "3.11" attrs >= 17.3.0 Brotli; platform_python_implementation == 'CPython' brotlicffi; platform_python_implementation != 'CPython' frozenlist >= 1.1.1 multidict >=4.5, < 7.0 yarl >= 1.0, < 2.0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/runtime-deps.txt0000644000175100001770000000171114607525266020522 0ustar00runnerdocker# # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # # pip-compile --allow-unsafe --output-file=requirements/runtime-deps.txt --strip-extras requirements/runtime-deps.in # aiodns==3.1.1 ; sys_platform == "linux" or sys_platform == "darwin" # via -r requirements/runtime-deps.in aiosignal==1.3.1 # via -r requirements/runtime-deps.in async-timeout==4.0.3 ; python_version < "3.11" # via -r requirements/runtime-deps.in attrs==23.1.0 # via -r requirements/runtime-deps.in brotli==1.1.0 ; platform_python_implementation == "CPython" # via -r requirements/runtime-deps.in cffi==1.15.1 # via pycares frozenlist==1.4.0 # via # -r requirements/runtime-deps.in # aiosignal idna==3.4 # via yarl multidict==6.0.4 # via # -r requirements/runtime-deps.in # yarl pycares==4.3.0 # via aiodns pycparser==2.21 # via cffi yarl==1.9.3 # via -r requirements/runtime-deps.in ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/sync-direct-runtime-deps.py0000755000175100001770000000110714607525266022557 0ustar00runnerdocker#!/usr/bin/env python """Sync direct runtime dependencies from setup.cfg to runtime-deps.in.""" from configparser import ConfigParser from pathlib import Path cfg = ConfigParser() cfg.read(Path("setup.cfg")) reqs = cfg["options"]["install_requires"] + cfg.items("options.extras_require")[0][1] reqs = sorted(reqs.split("\n"), key=str.casefold) reqs.remove("") with open(Path("requirements", "runtime-deps.in"), "w") as outfile: header = "# Extracted from `setup.cfg` via `make sync-direct-runtime-deps`\n\n" outfile.write(header) outfile.write("\n".join(reqs) + "\n") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/test.in0000644000175100001770000000037514607525266016661 0ustar00runnerdocker-c broken-projects.in -r base.in coverage freezegun mypy; implementation_name == "cpython" proxy.py >= 2.4.4rc4 pytest pytest-cov pytest-mock python-on-whales re-assert setuptools-git trustme; platform_machine != "i686" # no 32-bit wheels wait-for-it ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/test.txt0000644000175100001770000000570714607525266017076 0ustar00runnerdocker# # This file is autogenerated by pip-compile with python 3.8 # by the following command: # # pip-compile --allow-unsafe --output-file=requirements/test.txt --resolver=backtracking --strip-extras requirements/test.in # aiodns==3.1.1 ; sys_platform == "linux" or sys_platform == "darwin" # via -r requirements/runtime-deps.in aiosignal==1.3.1 # via -r requirements/runtime-deps.in annotated-types==0.5.0 # via pydantic async-timeout==4.0.3 ; python_version < "3.11" # via -r requirements/runtime-deps.in attrs==23.1.0 # via -r requirements/runtime-deps.in brotli==1.1.0 ; platform_python_implementation == "CPython" # via -r requirements/runtime-deps.in certifi==2023.7.22 # via requests cffi==1.15.1 # via # cryptography # pycares charset-normalizer==3.2.0 # via requests click==8.1.6 # via # typer # wait-for-it coverage==7.3.2 # via # -r requirements/test.in # pytest-cov cryptography==41.0.2 # via trustme exceptiongroup==1.1.2 # via pytest freezegun==1.3.0 # via -r requirements/test.in frozenlist==1.4.0 # via # -r requirements/runtime-deps.in # aiosignal gunicorn==21.2.0 # via -r requirements/base.in idna==3.4 # via # requests # trustme # yarl iniconfig==2.0.0 # via pytest multidict==6.0.4 # via # -r requirements/runtime-deps.in # yarl mypy==1.7.1 ; implementation_name == "cpython" # via -r requirements/test.in mypy-extensions==1.0.0 # via mypy packaging==23.1 # via # gunicorn # pytest pluggy==1.2.0 # via pytest proxy-py==2.4.4rc4 # via -r requirements/test.in pycares==4.3.0 # via aiodns pycparser==2.21 # via cffi pydantic==2.2.0 # via python-on-whales pydantic-core==2.6.0 # via pydantic pytest==7.4.3 # via # -r requirements/test.in # pytest-cov # pytest-mock pytest-cov==4.1.0 # via -r requirements/test.in pytest-mock==3.12.0 # via -r requirements/test.in python-dateutil==2.8.2 # via freezegun python-on-whales==0.67.0 # via -r requirements/test.in re-assert==1.1.0 # via -r requirements/test.in regex==2023.6.3 # via re-assert requests==2.31.0 # via python-on-whales setuptools-git==1.2 # via -r requirements/test.in six==1.16.0 # via python-dateutil tomli==2.0.1 # via # coverage # mypy # pytest tqdm==4.65.0 # via python-on-whales trustme==1.1.0 ; platform_machine != "i686" # via -r requirements/test.in typer==0.9.0 # via python-on-whales typing-extensions==4.7.1 # via # -r requirements/typing-extensions.in # annotated-types # mypy # pydantic # pydantic-core # python-on-whales # typer urllib3==2.0.4 # via requests uvloop==0.19.0 ; platform_system != "Windows" and implementation_name == "cpython" # via -r requirements/base.in wait-for-it==2.2.2 # via -r requirements/test.in yarl==1.9.3 # via -r requirements/runtime-deps.in ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/typing-extensions.in0000644000175100001770000000002214607525266021376 0ustar00runnerdockertyping_extensions ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/requirements/typing-extensions.txt0000644000175100001770000000050014607525266021610 0ustar00runnerdocker# # This file is autogenerated by pip-compile with python 3.8 # by the following command: # # pip-compile --allow-unsafe --output-file=requirements/typing-extensions.txt --resolver=backtracking --strip-extras requirements/typing-extensions.in # typing-extensions==4.7.1 # via -r requirements/typing-extensions.in ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1713285830.559115 aiohttp-3.9.5/setup.cfg0000644000175100001770000001063614607525307014445 0ustar00runnerdocker[metadata] name = aiohttp version = attr: aiohttp.__version__ url = https://github.com/aio-libs/aiohttp project_urls = Chat: Matrix = https://matrix.to/#/#aio-libs:matrix.org Chat: Matrix Space = https://matrix.to/#/#aio-libs-space:matrix.org CI: GitHub Actions = https://github.com/aio-libs/aiohttp/actions?query=workflow%%3ACI Coverage: codecov = https://codecov.io/github/aio-libs/aiohttp Docs: Changelog = https://docs.aiohttp.org/en/stable/changes.html Docs: RTD = https://docs.aiohttp.org GitHub: issues = https://github.com/aio-libs/aiohttp/issues GitHub: repo = https://github.com/aio-libs/aiohttp description = Async http client/server framework (asyncio) long_description = file: README.rst long_description_content_type = text/x-rst maintainer = aiohttp team maintainer_email = team@aiohttp.org license = Apache 2 license_files = LICENSE.txt classifiers = Development Status :: 5 - Production/Stable Framework :: AsyncIO Intended Audience :: Developers License :: OSI Approved :: Apache Software License Operating System :: POSIX Operating System :: MacOS :: MacOS X Operating System :: Microsoft :: Windows Programming Language :: Python Programming Language :: Python :: 3 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 [options] python_requires = >=3.8 packages = aiohttp zip_safe = False include_package_data = True install_requires = aiosignal >= 1.1.2 attrs >= 17.3.0 async-timeout >= 4.0, < 5.0 ; python_version < "3.11" frozenlist >= 1.1.1 multidict >=4.5, < 7.0 yarl >= 1.0, < 2.0 [options.exclude_package_data] * = *.c *.h [options.extras_require] speedups = aiodns; sys_platform=="linux" or sys_platform=="darwin" Brotli; platform_python_implementation == 'CPython' brotlicffi; platform_python_implementation != 'CPython' [options.packages.find] exclude = examples [options.package_data] * = *.so [pep8] max-line-length = 79 [easy_install] zip_ok = false [flake8] extend-select = B950 ignore = N801,N802,N803,E203,E226,E305,W504,E252,E301,E302,E501,E704,W503,W504,D1,D4 max-line-length = 88 per-file-ignores = examples/*:I900 known-modules = proxy.py:[proxy] requirements-file = requirements/test.in requirements-max-depth = 4 [isort] line_length = 88 include_trailing_comma = True multi_line_output = 3 force_grid_wrap = 0 combine_as_imports = True known_third_party = jinja2,pytest,multidict,yarl,gunicorn,freezegun,async_generator known_first_party = aiohttp,aiohttp_jinja2,aiopg [report] exclude_lines = @abc.abstractmethod @abstractmethod [tool:pytest] addopts = --durations=10 -v -ra --showlocals --cov=aiohttp --cov=tests/ -m "not dev_mode" filterwarnings = error ignore:module 'ssl' has no attribute 'OP_NO_COMPRESSION'. The Python interpreter is compiled against OpenSSL < 1.0.0. Ref. https.//docs.python.org/3/library/ssl.html#ssl.OP_NO_COMPRESSION:UserWarning ignore:unclosed transport :ResourceWarning ignore:Unclosed client session Ԟ?,S5ȴHXKקX)6U?~F= ]kLCMm:JodaqoIR(JʗR*~ùbLfD%X}ϓNcگFӱJEHupYf*Ϙ=EeI;4 )9^xxBsnTL7,&T~}ҧM!,ë4l EHX8A!Nmduzg>2hi3!$ 4cݾ?)s'/,@vI\flXŅG pErF}ĭ5b :H/mxPj*OO*}qlC; xĘinB3lv_3a  ob5'Jx(:( z}-$2Ht9%*%Mqvv'+N~ղ*\34eHLȪ$xP{70=iNujyr0Xzk,i9QZ!A L^.+'ncB۹ Lأ(@!KéَYR?ċ[VsxLw.fr>L*vDǩqXۍ x[Ja;5O1pO=0h*Ǒ\5=V'EIY# ̬:F[(|hFF|0epQ<_.G4Cۯf@/Е;9fiM m.I=os~8 ՚@rxQcn:`n#S>'rmrkb]%+I+|@Ow;tjLnTԝO^dl{iT\cP? NAaa+R9MʋpU7)X"y\(']Mb=~ XⴒZ33Βo]k`b;\QQiԒesd:~ l~&{߄yglLNrvƪz3Tfi 0,xkΐS7okszjqWQsesmڝz4[$cL㩿}<cDzgEԿhLkS4 m5)w&bZ4YQIM? q!qAQl78YTOE]5^h+c,#U^ xَ!Wߩ7';fC4܀$l uLT87(T0l|13l҂FT'Sb  <<>5cJ]-a,jzP tk}?6XӨqifuutYY#VU1(<%hXsF`P r"#p<Զ`o`<>, 70jt ?6k&{\7Y{M#YcY0ئjtcFbH?Cd?-ɦ?W[qm;Bԡ`5WVб9ՒO(TbzPdxr;7;;s6?2Ϝj2"ZB~gQ~AZNڒ8,$qB+ Rp2{O Cپ>QyY&"4XpG~cjbK攙6S!xY%y _i#4`˫٢OPF}C.o< bX*}Sƈ(I *:$߇٩rY{6aGWۓV028^=fM:J,O}jVIO+<,DB!YW_91wG߱R}[~d, c_bV",vY2Z 5>qҺ9"&HMnQ]$jhڏX;A8`RM4Md?]Ӟmܗ7Ҍ)dp+S7cHARUμ|m\XO bb#hEͅ}QٖUCU$+K (#c u. \#uy*T*"з@`a'l/SO)kVQZNm΃NTVx QS|O9ip ͻĶIPV)gFgI"o$2擛1E ә"S44W⹩(R=t3OZQxψ'熕3I;xz}Ky]G u8eQL)1u[ߝ[N!nhHe>0J?JԊc 2`ክZ_%*߅~( orYNb-.PSJ"<8TlSݻM5fi7j;yQD>`KкnUZfTu86dF?]ћ=qڅ+l ɽ:}ӿu'㟣1W.$.1GQY׎ 5C։`%60)RVHQ9>BǑ=&G4T9Zt76-XI9n͚IQ~Ĝ@vёY\Z(`z:@\J+n {&ϵGf0B(:>煐 fۭFֺ7rDk!%x1ݍjw?쨓- Jd\WfV!\){QU$ōpDH*TB8`[_b\y:rRO$OP9D7^Ina-"1 E_8UMxpfnɯRUj[9Xeaԭ+~ĩ`i@hE wd{J3䕪^~2ޘ7MW4g杤Eܲ6 uCh])z &[!JGrb׹cwg8+B$B  W5üISboΘ$+Scb >c:8 y:)f;]@kxƞ-v%,PKNKx{~%GhQgs!ati2 !/ 0FOmώƂ4[e$IʜRj7'(y33G۠{uA,ʕgxFX"nKfOMKhs:KmfU? TSO%-Tm I"qfF43\`-$gٕ|=تj-vNj!>b<1UN :R$XxqҧK A )F3C\TIY@G=ǨJ}Xs[:Tq7 OKw9╪ͪ) ;>M{ezV tOK?l|xm#Ji$#i|qaנۭM4KԉPyH!Ď+uX9K+I)ƷU;M'm۴ʟ/ѹRFiRwf~'iS.;b֧9I(m92 IWZiVJެ1>a}S蝧:{.p8xP)SR@jevbZKF<Q)N6cI$QQQC$HAvf= z_!Cq`Y9Nj샻Һ3!O!xyݍwO|/O4LE{ݾLً5~9u<9sebf+hK:g9MU*C ,W,*T)Ȇ~#FϘ:vZgiV>b0/+3Ngiҵv:w !TG*ȡ+Z_.Nt@/sJ78dp'~9XEǛ_Ae?/,0[0,0C[ʇIcxdاǣ5vMJ&KZ"q#H*O_3Ofړ2itYd7WDZya I=SKZE,A5\ы!1t-)P"G )e"r? bÔvOjj֦h`O0feq#9MIF?հ5[U,z*-%tP_IDATxuײ.jd|-  ,AA xH  !ø~ݫ~MBdsϽ^/n p‰(TRUTFeTF4A@ ԜgKAT@T@~G~"8P82 6nv_ܓ{rO ~%o[^NNb\q=Ne1@)B)@ ;((elDDDBPI'tzI/%ݤt!:yy}A_}QQyyox`08Tގ؎QQY$+XKRT~H+Ҋ>m3|UXU&7EqQ\$\L4L"O >zy,V}Iq"'r"<4ɐ~ZH irQ\eDQFTSc8F9(堓tNjZMX5P?>TzWxX܎q;Ygb^,rjh5Z]ܕrWH|J)RJq+n-oEl!&&,¬,em\\0 0VYeU+ߕnXED+JXu:|L;NSݤnR7)ZJ-REB5Gaf`FB3Àq=Ѓf$AVmUud*d2̆59~%xRZ57jݠbJ==iȍ\7܋kU*X|p_hmc>r*|2g Z[-^L/C/?)#vfh ԕ'Z|\Rg<奞 ]( ?HAy[|"d9Ua6+QJ94Q@ E{XKM_LQODe{zd;`߫uZ?,u̕hp*%gkjupJTv ߻Fԕ`ދzNx8MΥFz\@WaEDtI#䂧{ IUkh- G!W`Qf%dnc<_S2/j"ZyNWd岏p'p(e2J hE"mZ% $C"*?7 2,`0 x{{[w]G]G]G]nnn\e\^!.9]׸Eϓڹr׋΅j]]^TX>\ύ!ԐgKGd/ٍ( |MU5M_ثE01kp?3hO6cK& W)3HmI.h!uy*Ӝ])Q̉ ϯ_Jǯ'VEkDwR"KQ}^0q;R:G#9J,"A{”+9b ҵl0Tsk9'HGFg8P4CoUa@LޯC[`g,ᤩ?ز_ | h14. Ԗb>){JN۬⭟lk#KwSdwꢀ9#PhAvp9]NjmhZmS99=Y3_b(ʊhF[===3{gCgCgCzz dҮ _$g;0vPxpr GlB@0kPp]k: {7?YenFL`/N/> SWse\boJ%o|ruN~d6&_ѿ=c}k;g0ItX'l/J1{#6r$\rv6i|W#~ďo7%BNh'lll2]Y`7((Yuhv4;fꚸ+&M@rX9G o&5cG7m<(D;8%?M]GQ+\W*x]z `h4HtOC $`#0h5}H tXX_ ֋`P-% ng-/f_L ٔ dC9 IHN `Nկ!#>o8)zIzW,g$Β^pYn~af2!nquw@irXTkj̐qC}}}&bX+f!Po3@/=d#Sq+nŭznF~QgL8uUAʝ?oyݽ:1""!Ab!)m䳍4~"[HfM6Ai*! E0kP@|rWPLsL%h7 uޭf>J#h/1$:.s bZiտJ9>şEO>~ %C}@-!/j-kjnou#$fvr-"Bzk '1ޱ`ha.'T)g١B翋<(&gC&*uuuc18w|^"Ldkf4h**oMb-vvvwZNi9TP [\ |VV|WVw\u>5{LSJhgW.(r Q HTΝX;j̀oo6r7giA[HA%"yq(Oů3D3> o@ 4:xGO݇fY,/AVx{3UE#$^ќDFyz]#8R8Rp}tFhڀP444QQQ&&&^F/OȤ_HS8S^s\ y Gz sS{K^I~~SՕöD)tìǔgq*`=9ԏO36)KWstA_jyoad]^_x4@+I6N^A ̇(~jboI LbL{xM4slA=ɏoaIɟ@fb @Ew.)LSvSfZ{2?_;!G5/Vjw3&JS?XA EN/^,X&^^^XX%P% aKd2?0?0?p777={P'7ߓ5 #ͻ62w[vqMpǓC 4S~to9Nbl5ՃBiv` גCٲ؇d,Uq_Q_A [y4,[JZDǯxiw넡rҹS3&;~+lDd79Q #{X+Vm= ʑً ' %,`1"\@ϥ#ltINTy>gC>`  jإ  s U aߣ@9ydE0ZnKTgX=,-Ve*,iom>0{HiiZew]Ⲹ,.gf!p x,fwݭ5f5E= zR[chvJ+W4t5UZmҁo.<Ū F r0Fۜm Ƞld)гުby Jv^-[XNHNdYͅ|sQȩhvo鿼wpۭףO=n/i $^v8Q l("CWv ROA>c| g 6(Ieo#g_e0RO/&Nڎn&(\rq`(r5MVn{YdFw#vJPdAJ~Q \h&&& , ST$%$ʠ,,˦;3,>@!$W}ηTXYޜG:Ab, pE)qP6}7T뷻nD'_k쇼,yh)Ýar:p |Vv~)ACv$eFz`,Z`5y ;F!%ќ4fUbVzD~ B + l٫nH9 X `!"%}d6eB!"_:MOUf^خ|4`n07N˝666@YTVfOe#נdL˴L\\\o9o9o?$ɗ:Pԉ*wD Xo͇tcX@BBpQSnCdL'Ptp H\m(YS>6Th:"}_^_^_^rrrYYYے7%}2:$|B<9;@zZ{ ?!!ˆA ݖ͎,)/q0Г LHWwf9P]-^47m5ϥ\`o`!?}af}`!(LePVtb $^־j E<RXz`G*"D.Aښ3x*`(_.H8֪mޠy4N#O݈YYyp~ﵣPOsss7͙f6[ͦrTeUCo{{eYAV0Oͧz#YYaN5Mita~9*z7sRutVڱIh߃~V¹pɕnzy@T#_ \0s+:qm|&u;e9/\F/rDŽf땖Cj L{%]L_t)xCRAk4ih[0Ksk]BoqU- ױoQ}NHB %t HA?R4:$bǹ=B RiRil`EC0oYlWKh Mt/UB1wҫ$Y9$:'@k?G~G~G~SSSw[w[w[FhzM^T "A1A o-Ŋ8%%%tEWt -`[/赻 rNvwU83Q/a B qn+`d#57VaTiz - L\\ȃFd Ƈj~q>se?+R,[r 7/wm6O?mX\m-Roا6_}iYt27ީ^5Y~Jo. +c~Jc]ݏ} 󀹯o$L^=#՚G3L$Q) >"V6͒݋0]S/b+rh /.Q,&Ṟ\`pIa Gm]JgU΂eUW~< < Άt6Ў3˾VnQ&'=E飣Nhs .Z`޸G(T۟"EJ 'OxTf*3qq HDk5{nvt QMW~Ғ?>³FuZ]u<LCٰރ!NyGl.j8/7iڷ]^ktE({xCo\-\B)zW3.?] "X!^9̳{xKʓR'ۇ١MrsϙF7 81lۿ sG9qWp(\U@T!Km4_\&qUKxdB:^A@ ِaT}PҼ*xOq"2i"luWt,e6Ϣiby\-"lޫtN*VAK DsbjBmmmɬgnn$?g&]ͮfWEEE~3AcqW=ofݝ.JDyL`HXI5sCWD:Pf'`RB Sd r^=&5PqC"^{4);A\)ԣz^α2=٩XLk s7he{\+Us? Fϝs;]WYI[G% H zU,|=.|u$4]v~߭W4[~$ND6}9%m LS@*-X.:k_cxWWt<k%ϸ4s] <]\U&9qDA0:(htE8牔 sh.W=?BBj'9Fw E'u_E9dNq3h: M![ȣ ]ϯVZI{엳-V5Q8;;{|^iTZj[-ږ"_ȁY1 /swn6F3ve؅!C&LFl׸yDo.x}燘T5H̷FAj@ @*b>G}~rvn}k1VyW/a~[(2jAG {B0XPvBT9Zd󻟯NZI+@0~EYf-<*$6 p xAEi&U !R_rna9JNBsvx:$+dt9:Υq{[6rw{ft4[6Mߩ3yh;|]nBt_]]U챼Q.GMR'!CTP! t4ѷ2K|펌MўV 6tvK>7B^'R¤(AʌU|`|^X6^}Nu+Տf o_(]f^!e}s+s,3+~2+93٬F٪W9i9s};wZ74W鷹跘 ̠5&?wR`>86'ێ߅zF̯EqPczB{ C+ݷӲ95z[UX_ѿEo5{euY]V6lr P0&lba;;;)cwfYk^69+h>~)bZ2nW~gԈs&)fPAHC9?ebtmRWqgmy/]tU;e= px4 /?ATͧ-",JA`\VnhhT[DCf쁣 & M}߶ 䘚#n4_&8 Aqt7!זEɬJq\Nf~?%LtnNƱZ([JoO'Pw;jeE:@&L|y|a,7FAҷkÂ)G^I :巫zf\Luy2 C'|4?.-_g~©o輐xħ)YhZS~ǻQi# JZSN'9|YVOv>%iն%Usa}u#HT{l,/$ Eh+PJh϶zK4$n$ [ၿ=gM]2Q-?:3Xֲ -~D? `៸%@`1L~,3T?E6>l9[F8xݨI"^>4MoEwN9 .;Qy[ }G|+5rΒҙ*i1ퟄDxqL#Z\MnX yv.<;9 9 9@U*988dI_VMeڻi尿,Y`3{={={~&[]q7f$ZZY}64_uM`G9s) _\r9ʥ|tZj -s:S5g$F+& A;GPi(?ᨨv6]/~ u17qx!qWhU򏥺t1r;N>W m( ~g8oՐ+*hs~4R*{K ?Dk5'R qs=M9䧲t؅GOb:@t[Vi_2)i`Y/T&32Dۭ<C -KVxD54>,ed\еU0wݜCQ^c?dȘ1 zބڃȎT d c9c|V>+ggg@f)666C=Z/hYxg֤LȏPNE[6qB3|r? =OT F`*KD m,j<һo#:1͉ ;CwFdEÅ^:/eӋГ| &zRK[Jl5gAiqžN"4\LfvtOPO[! ("o,elV˜ ]gbYK;vyV}n ȍ9 ^}ʏ#Gޏ27 _+DP]n1٠r=)VFdS9GGx%<#6Y'쒥<[HV#+aFaA;(>Uh/tj#)o m/H_@x!B`o5@T͜$a.(;H1b/MH b:'h' 9X)ס!Ԃy48M΁A%z?Ox;/>=Vok^+9l0zd|Q "9iA*u="]@ jqd(ۨq3Tu(Yo{{8Jeܓg0kq9=:\f8x^2NKDy\a!;|Rmt$̓XʮjDV:u1cxTg(e򶷉Z]VPPr,d5Y杔]λlPk#$qSrM ?kGm^Ԅ֫TPP{'j3_רZ 'JP?0 c3`bmʪE r'TU+DƋ+BNpgH`łhu7*y?A?d-+Qq~ɾZ-<-eI+>*[v1^4Jc S?!* : DͧI\RT_֤ƣ]t@[g 4$j% 7lӘR N42wq=A5 T)lj:Ps!^50@"[53*Mꔀɮ^ﬔu=J{fY{=YYY=VZZ|s9_3LJDJD(Baq.ą)gʙqqqJMRvvN8>MZuwVy9T8:demJmش dȎ>LGF .r{RȔNlB=`ofMa.D̪DS̾BFܛ9& K#"1~ʯ} f).Wr/ph6g)nfȇS 0z 9ӷ3wXDIe y-W^Ҏ]N%} qHsnxz=-{H t38ڂb)xyhRdc [_M8[Tl\x])(ےQX=AřUTJj w2|C X`0g^wAl(>GVLFw0<@_L%. T6RQ7@چk\{ ;F->͏6-* .|,аLV=ulQHSz"een;41=1R$G`8N: A(%ϟN|&wtV μX[iu,[!5p:\+גZk':AG2 BB*8AK F]{$3 ylW1%p{V1n!/b;zUꥒTJ!ƀC/P RŹ8J>2ZLA_Sȶ=a3;8vz']<#9@p!oxRY\2z?2ϽFmg^KKlfUJY>0`ܨp"lHb ^u[ףEJ >J[!KNAG2rωH͞FC'(' u޷+Yl>Q3 gcg0Jrac`a[#yux59>ڒ!qKN_Wu" [gmqȶ!~_a7Gq1Fi% q^l<ǒ|сSyFW>6uR2@GOǬ1),=@ W#Ljwr\Jm-gSmL_+--(4Wz-]Zv/_VUUUլKll9o7Ifx3f7J:CpkCww0/;aqG%nwQZ qگs&76t~ON H q_bpsI̩_ё]N1b6nTH_1C%i>ο N>zfsyY5d .cXXL%x I)?<ޫ W\x8238(N"z??W 豜>`Qj ' vB'QEz1#t"S"xy\Cԅ:l:r}n\~Uj:3EF_Y}3&q)y4r̒3M.1 [D^שD$ߐb6pUB sJI"A(B !?#(/Tmyޓ7'dItl(:}}}wʗ)_|Yg6-%S2%# {pGl9[6G/k.ͥ!JF-|MaS9ar?|vr+uJb>>ӅJ jk| {}(+㯸05ԧ~깐Wdǫ2dt햣, \_Wg F<}UxI%c6c(0/@W{kk0k3ԝd 7P戳(Vp vV4 _YJ)=9ZV 4~)g\&\ը]%% Sej@֬AS8>+٭" GE^rmŗto 2;kmArϨʈ(A8= e"XœSR:¸Y}4 '&fCѦ ( 2 5SͩlS)21$"Š!g^444zFk bW/ŏWCK{VO2؀ʘixu訃9sPHދV Qak˘!ٮ67$(U${Q>:NSS`c)(P X]ţ)(^|Qt@YNV3=*%s(q_֤(Pd#ٕSdzVpsL$Baq/&3&b6˯9҆ bR2G9[\_hߨϔ|XBx/{ցY_?111W{98)n/%d;c1O jsw=P0cx0O!p _ hYSǗTqg;?xJ!*.agj b1T:TŔ}kOe;溚| 5h"\Kz2GxsYس vA_A@ r y]ƫ@ƮXU~@gҬRذZ#> t wYe,H뵫R*1A`;97@$ ㇱ/wW!ŇR4=00r=ޡ4ojdG1c{o)5iB} %I ^.?tҘ6VȆ2,^Mࠦ4S;1ܛ`C לS'5,͆3,$!f̪2+k'I60a?8+ SR>`CwLx. 0gKsqc8?{FnT;J5 W6Y B$ }p#'TӬEpWBQêXܼg tΧ gY?v uI|Sc=~I]Tw96Cg5}&3.|O :SŌbc1_יMߤ=<`ɒ!wfbl  *k*1y~Ҳu#1= D=Ʌ!;4}V ,z*Oz\JĹm?o0܏ y:{؋4\L(w38OG}-BT_/uss#9lg?7,\~/%U*3wi7݊zhiЋr[ =cC6JB{ktNt(TNy*qثq6QtvM|иl8\^|l} +fBkEI}~XtHh Mz I;khՖpS59%tVBs{x~na_lXӍL)H%]|iI`ځa5"ZBu03Jj`ɸZ=!7rS_/Q7GhFh5ߜ*\ L6^\L,ԠY,\F6Go*TX< 1|c{T@^B<){hѬ`?4QZ "PD]됃oYut~ݱt5[ 9(Τ. 7P0Z掤yۉFk2!sr\eaP5{*Py ,ꂰS6gtǟW->eg )F޲}N澿Ý]k 4V'k P} 8oe畾9 8xys&oCvr+" @v!qkLqO*aMPowiRPfP02T=dUR*"a6CE/3`F'c=?$!^HEn6E2iǾ'*VJsN ٪UtJ1^xG!(Pd3FT5!or`ovh5x gsw2`7\( KZ|R/2bfusVD@(󕠀i'r%qOA;&ɨpXC_ 2 'u5ޠ䅨~ؤ<{x.UH}e*,MÔ}5'Wf}|ޅTTV@)g( op4W)t#mzܜŮ1ߔhPSѓb##=4帼i'ͪIxFmųYT;tyVT A惤m06s6F?bN4&fThc1xV&at@KRHlOy=J) gRS,6ds٬ZF (P+Ory."Py&lL-JCŵp1JT8Jg+}o͂Lﺙ%_m@E) ^6?*XZpgNG{!DYsKƾw_'iuItO]XP 4[!wp gI1˸{;QM] MD*arK| |JxT!qzܼc1j^ͫ1Ӊ">7M^ yAـg:b .ޣ^=Zii`9$,!* Z㸃1='r#QI%b*o;x8cI3'4_\4[3#+`>C9u'P4 dJOwU_U}x{MC\TtB[0lvHC:DPſZ-V*Wl>neMn嘕=hpTE>X4b}IO"Uy7B 3tyI+rO_~9'r!?ե2JlT޷]A>s{+ob PX]|W%|^?p YgZ'։P2.2W\]/K#y@m6xC$< fWhF| ͉`4Ljߙ\7b*.; VegwWA`E/Xw+-xEGa@4scc/wOE./ RqCgcچDfo o%rg a7ϰC $H+*MsBCמʳ?8vX7\+У" z}NEJ!4h-C\ɻS/h{"zi{HyİҡyG^.\|h7/6UCm>Ar`"~G=;Hr UerZOtR}YƗ Ozbҳ]gHO)JTSmG7J5>Kŏ8b+rgs 滅VIBbpB~T9ם=) nqM4"bi2wkې E^b=՞jOKd YU܀ S)soH$v) 7Al zFQ.S`voz)O=.- t딦ְɺbbAhN:Gj#}H2tur=K8%fyfoH`-y8(پswYiyUۡa%}IC}*fPÇLӾԯq`X`浯D2T[Y|\V}_>0"|34'|)6WlMDRg53>Z nn8\+rzZi<_I4}r{L,Ğk23 һ4bDжbq7"]mĀ;Ji%wJ./aK𴫯YbUy (-ବAS<,y%S'zL[kqߓ pvVnR CqH4T 3] M MBɢaQZs웑@}ޥRve pyxA^+y2JF(BChHfRTQVd3MS0h(d%vuރ:GJT{س#auW&eC N٤VV>?~4O<ٿ>@Ȁ)*ރ ?VX0ew^Pð1ɐc[HU^8kWW|r( l0Pd"P'!?Mkk^O3HjOi]8V!u?Ξ"*]aZќFS^n6 J|-k+bRݠ-+ߺ=|9 ga'?<V&(6HDyMNcd̤"HIP]eITM#(͟py+ɧIOK̗ྟK!LcVb7o*ݡuOljȴvé1ATO]Fro"(ޡz VÇL)0;3u;=2krg*Kr 4&2 lm-gYyli4[K/t.ѥ~§DwM?O~ujFE]͡]Jn]enb O9Q]Nh/a]y-*͊t&+kk]aF@”r6`H^'dV6_ QXOyE;X9!iC-B%=Q2VkLv3ie9S_-C){Q\c!Rr8\+g(EDC+ <ZÁH (r6 5=mJ~nNb0*2MYg=q_x*#QsNS)*[?*b&A4peLajˏ:ڶIBTR=6@)o[/}^v'm|Sp:_`@P.fUs}`\QlUj,c39nZܴi|||J@`+bkf؋pC8lVym+o>$,2"!`TNs9`B_n|lb-j.P_dxZɑ4Oq{ӂf_HhUh ahґt(M4tIPMH|`DG쓷=P͟{ @ ;,[,b`" &:~0.D` nNZѺR9-y 6D5M Қ.@>6r+45i>[5JB14v4_ 2 ۸uzEXnPڮjB_gCJ#S=~b}j篖peKIoFzevIy|]zo𪸫XG^,>4ӗ{5m0ˤP*DBK~)#שvYy dGBϢ?꒿fxcM%J_IT<Я2kW3担?*mVu5]kx1<6n=\$ETRY,zMTYjDio+*=,fNXvv& !X@@W"VϨZiHmhdY3g{j&]Gm Ż}hnE2ԑ@j1Z2 me0?U?fP`#Y-e>KSkOQ{F^_ "P%LV'{"&$dTIi:}}T̉ԓޚMAuTFȦ~ oݬV~2,ȆhHA~][:*(M܃B׷S:jr^+W W݉#>pTxpKn-VhzǼHF#fڇI}+ ^$~ү UJkvE4J #U݄ o ?զ .supxY6XljrljyW'0 VN̞߱ZB;>hMa/4i, jNzT>U͞sQZб 󚍢p4ؓ9*nɕTRPޞ/2nQqtpZ{j^4Ң^Ky,ntf 6'x*KB } j B+Yb*8qpD`8Q=* J h5@U:Hs}KzV(g91UFb|UZj]GiwiXTޥuo7}r{_؇htPYDc~.Dzz NRDLLE$#OsGk mM4d'Vc5Vg6v!u: BSRRp$Hqc8?_6)n.(I~ߋ4ǬTۨ [@,,.,QϢU⒕ţ*Ovꐎ&g{Skp3yD˰twhfǣ8rMVnoTQZF} $"P,@5P^Uo! 2DiFcJw?i.>/EYU|v!)^t"{ Q SI 4~=\?qiF 9ZjtM:fnjI>!1nVFM~Jת&p'X+֊ iL[:t88),2C}ۃʷ:mV6r3 {-_Ҵ./Ùn"syEAj*_.<)wV擴;(r<"3~&@k57`EJ(+e}I,鯂T&*rVzz9?~flh&^a}z<g—O<< TNnRz_mה.#_0s9 n j8n-QHԋ&ߊZXAyO}fǎ˧]}&q-{ jg]-0WE yY:统@eIUs-w 4/]Vcڟ}t(ػDو }'|FD78?NysZԳ_\cP0rfar"LxBEIpFt|"@TjAoBr>mEP!Z?XE wqwqWq +`60o"wR&@,zZ*@٠BVaKE|/%=[iq@0C=#O c35l -ײjD|۞} o4; Ճ!R!V"Vjҵ/*r-<.37{dK BKk:Ga~Miv@b#L\Lh}'L%&HG48-KF@|7F`Q.8hbZBhy/HK6w 歧4T*6j6p".ť*/#[ C LnNDSe6i`-c#]|A^%uH&?t| o!  ''Үqw'ZŌ(߅e>ID?#fy3gIkC6oE,B+BQl* ʺCߓNuqC1$U'_`$8ew&lkcSoe4b&mbbOtJ[DxF$Rs6YЄ>A}:+~HYeZ)go:VKچ4, t3R΀ +4DB@GN$lmdw@lD,('P&P_k/7}7=2J-ъ=}%.N^ 5,*]$ОBX‹?dC |?X}y-'ɮOp4=TGݐ&)o8W QfbCE!BaƓy2OSQJ۝B#TʓLiɨ4-6`}훲p5!&ﺋƥ@kة+DO%|xEs{2> d͍BPTvRsņӻTm,{]xߥk $cT{x AVw oY uCkWD.vjSMTﻎrtFLP~Qxlb~[Dy;Tsm.{Tife#˺8|Vlw> Jq6mJn;> Pc(G ǯ` '#Қ9h*g 9Qow VSt,~bnZgSh~D*S$~o09C:zag4TNXzFQQ)j}4Y77;jCgn[Rk%"c+ >{ hR q7]e?c? pGŨ((hƴvn9ENS2;@>D:Sۣy^)hxեK`)Fqgx_ r^CcSAȃi(f:dKghc+c/Q;nHގʯ@H){eQh L+2:AA!+P}e ``u6JyQw3+=?riF솉ضv8sibsTd$( I "@3PAQs9t>'P}yw{-T]Zk)Eh1 {KY.D8p4kuټ!2ٌ~ەZ'x=5}]P $$|8Oi|> ܟpns?RV/w +uQH| W"WSb{޽ց/^Z ,(##gw2}…NBx75gdWs4T4 ?eP}fnW0]"Ԍ-{! P7`v'bb,$źɵLCE3BE~ Arh#RT:9դuJ>C}!_xbG.BEm>6a0,\lهIC t|M#~ wU.GkGH@%VL뼌LtDF&atj1yMMG8R.0qMyt rQN"ASC/Biޯ^^caH(@P:rGlWA̐ U%>L r*P+1(USf/kVD6Q"2Ա|/Q@YUtDGt烠<ʣ<^͇GR}O ZZFCQj0T;jAղD8Fz|uȉ4M$,9ao?zz'>t_ (odxj@EeQ_ + lΒ@HDc7כ'uvHNQWA\83MeeC2SdI: hhBCުa^iwxͱ1M s8'*Om7¡f?ĥd%DQ)@"+MF'. $6,89̈́ `d yb-dߛt"[*w\&b5{[$i - + *ukӺV@_,Dž?͝lw kR[׫;qby껝'ڼ Ӈwon~n=yswaeg3b$Ϳ;E9yл=uײ=7{ܳfٳYQEͩ95nԍ'TA1S3iQs9 Q;:V\.;@g`)`"cd^iΞCE_U`&|\rN- h,o> 1KEHD):Ra, Hto/Bȥ¼<1H̷Zt޴ڇ!9.D@{^SfPu@ ~gAR1KDF4T??j\.ʊ/_hub&)b(1e< pB^a ϋ10~`;+/?B$nxNx\/t_ È߳q.ՖxGPJ,`sz+Ȅn%NDe ̿ d6:o K;5k;ҴJ‰hJF5[ Kv`]$ o>{7M*ij[A*{BHhE\6ҡ?E'H>[/Mr_UBs}y@0#xA=v zE#,>̛FEt NhCyJ HH16>Ei15UxIDAT;ˌ:x#QReo̥ k8~HON|qVw:I-/&MU606X ;]+tT_"*"ͧ4tPJ(%ffb&f `>'(2>oG;+te(ΕPAAQp+\0X*O:U6#llÏ4KB"U\֖u9TePӮǶ F%] 1>,uh&:Qhm5#1Z^ދnt%b@?NOXQTxJ.'5U[y #Uhb WՌ%G2x9{ &PM./Bi4/u3 ۹\ ~O^kFCRZ -{PB QߵC8Mju*Ũ?b=G&j=IY0zzqPȇ`cTh*,HYopF:=/ n@kJL(!̖MXԉM{'+0 (#\Xk|ڱSkKWzv=}۾W+)5߿p%RA`>7n~}-\r^ErŅ>:{/YgC zF !sQlĦPR5!kTqQM~Jt7Cn! "=:o `*"ʻ PETN Pk4a wpTM%2h>-łqKzx|%7j ވy-%>P?o::,^ Wɢ:U%qM'⑯H$EvInh2PqL9,-QS q*AɈ5c!„Ggdž-%m 8t"k#ש6\!'f#8G 2U6w+=wpbAu=%I&6= @ npHį)@kdU=2ݙs'(N%K,f q갸dS1#ʂ؇STX~Y=IW1WJd&h_s9.C;|$]t5x)x)x'fxR?B>6yq8챚3.(F.̪ΒZ/-@+U53>3B4QO{ܵ +#pJ̻H]$OOnEXvUOq; ڥGH"#ӫTQ;'U|"~e$US7駨VU.#O8E6ֿ~UZ&"E8xH_ ,C.dVi||Й5yMZxM(9l>'oò/{wanc;τn= @JP3XKQG:vsPJL>#r}Mj8^():Nn.1&L ΩW=΀JJԔ* 0BUu2"4~3RVU}rFo񵀮1f\>`P6dld{T6DӜ;|kע}ѯR0p_hzz@i4P)ՔjT Q{ꋾKң2ILhu:EEE؄M"WVʖ`p+!S"ЗnJy,96" NMH=+EvI_u8y~w8cONujF| :L= SW6yg3Ns5nD#뼉<۱7U阏 a=_CYPQ<O4H?wPH WKUEۈ,^|  }L\9z-|d}# hA qżFH=@>:7K@=)8e @__8duPz-!]fQв}N91r@:"4g>yoc@)y*[XHjc#A*L*R@:rؠ Uفm ŔEZ5fQ F6 ˁe:E*6A=-OShG2˅5S4Y^VCCCD5QM"ZD|Ci.uQu)R)U<.kw;#ڈ6:V~4h! N(C 41ANDEH\&{Y<-Pk% n.ܑyy({9rLT Yջty;!\F.Jqꮽ։@6Av+laAmщZrmR7|ٳݞz @HԱ2i"*Rjs a\%U4pYowfʿ:GS=6K˯J_aӺ3>  CheGtzsu /5c`n`2ܨ\~!TS(z7POz^&n&>DWS. }:>J>3~"]1zb'ӓdXHBH\_Rldy'KAE'?<[DףH.{g/LP7xۘmx%<6+V >}}| qN!_ IH"y#*\>j&T&T&TT}RK]UM*'KBzf8| \m\!y9:\:Vmg6Mvsx\ϏvxF3'q9GEWu[|FjSǡӸ-ϦiW'O[zV]#v%=5dU3L52ZV}@F@?(Qs|O=$( USżR%YvE<4TlQ $ i^>+qZ;ޤVN;oݏ@EdR{_ӗ?_q:Bk0}^(쥢;{MM~bzFDY3!>dESH0?kxFE)^.^ŋb('8[TŦ E8t i gf)Q-#Tȃ*SQe3[CPK2^y'@جL` {_a*Qjkn ,gS|@o8[mA+R;@ĢJ3ZqdaY$L:7VR/1~8nv-Q)z*^ZFx7)_U۫Kq).xAP#p pQtx%^oہցց}@[5.'}}ݻ\ s\񊮬p8D!L1vt'jFjTK>L&Ź=a#\>dZK S5ژ|O%9GgEi"~>ig_/XU|)_yžj'?i1^v*jhE m#?qs0weۮ>( y"q(KǝqLG!ԓ@A«TY TP ή!F:pn_ 0B~W1zTq|QPt}awZrxM ^nnN4i}Nl k -m> ([C_ }嚥<<nRJו(;މ#l]ʿ<5ښ1h[A.،p:DPm0,M>?ͼ??٤LTNAL3`y?"(^'NkVOAs *Fhxa f&YzFD C4⢎4cO`}˯Dr[+!MqQb]QEJQ`(ώOKRRXa Q[ ?Zex)#p,O>0:Ɵcd%p |W|W|Wc1:O[_᫻? x⺸Rg> 3d28R\nF6`76R~"?yx[較u' Ar9! x^9|ӗGќ!ILLjJW@Q%዁Jgy}YNE=N̛*/<8yF **.Dl\ded&։h4<ܙY(_kea~wj{h+,G&a&UR8}9eװC_R1;þNIh*b~Zh.4bB1333ţxQD`(1JMߦoW |@DHW..MjfpPhXj%`1q2T ߩu2v\2 \E*>U hB.N(o}dBGϾ$R|C|'hosL{V۩?L!䟿<ڝ.X3iR;s.˕7o<#M=.ߩ딨ج~=Q jtDAJ|* I.XJMVmkvg,@4 .0 h 6='p!;.S2ep!Iur"\=%"&j |˽R;'3U%59P_x"RnG:4OKR1T C:]?(P6ݦʛʛʛpu::J^* }P~X2JΡT^2d(pv&6|Vm/Mٺ_y_xZ FósE{]VgQ| P3Vz_<J&D v0&hJ\p?Ӯ}鹹[Og2a m<'§8T(ؑTB--[5,D"_ T&c-}u2\p_Q(G*1@ax5nR71G=c~^heow8c|_m[ nse33s`hpj,|xa ,Kj/9p ? \(VwZ_]z7.% ̂* P.?rHap5yKs+2-*Eym)!{!g͡x+`NZ-97R]|u"Ee?d>,wBK2 Oy%IG2s{0ɨimBtp@=1C71ozg΁k A$%7!k@rK` ޯb P\>f'`4930L,! 7D4E[Ccv1UᓍrTe9^qxEM^?#+(,ʈ2)qÎӞӞ"fE`Q^2"K[VxwM)MZdZ"#WνQ4Ot2 j[}2oT%W M1"/^&SVb`Rs\1p*<>HˊafnR$hi@H~vl (l}.3h\xRx2>a!?1n*ҭe,u=2'kIO-ݴ<*6|TҢ_-߸ֲ8w&4̤r$OV6J׶OoWS웦ˑŇi~Üywbٝ 6n{l'bt׈+ˎR[is䜔j\=^>w}g5 @6%V L05R0c8 k h/mn¯$84 ƻH:N:?mDZS͆fn 1om(&kZ6|***u: }G~0jxp@.b6l 444"/:DuGR9)"+/]hDa;}=XHB 4¼׶R6Wh}לGGdcxxHFMπ~BZZ׎Rys 訍!}*?ڴ2jEJ%iɏΖ׏- 6ڂ\WZՌ}z % Z$h$iZ@BcXڇ(Ixj$s_oɉt#lՃnVM9'q\J5FD況yo[[=MfԋGyGdzg9+ەVg3ՙ;8-3me[mmm7so޴>>>*%EIV^ʳZ.[^yAi{ϝuccFkDǵ_xfZy0b@1/~?3wriw_NV*|u`sڌ8C_PN('^>GK1m)b5صٵٵ99ȁgggklJlJ}]j]{Hs]'Ec]ݢ8T/xjj u=1FcݧG#n|Jm~-I)L-D3G .g'A%!c18'h/TT !E_M~=v /ک }iɢ L% riP߇#@I?gȯ@Fdp^~3T :)8.wב0sp[X%y+}E[err0tT. TWPjme&R #m{% *I_RcL2'rSrSrS\\\ǴfZ3Y#/s|ۏ/N6Rt|BBBBf̆ H" hMtyuo,v9`%yze+[>JM>.bb(熏܍Ɏ&%/oxZ\q})5/։}c*7Yv8,(wiHc-g @c*UF]@w*AT->g8j9|'#.Q>js :.)>ŧٮlWKuE]2225IMRqGAODϿ>DMp1\Y,U www y6x3ތp&H^\nfY_]}qBk\쀠tMG!Aϙ|& *q>Qt5C}4F9@B;qs$AG䴺x&Aѧ'g( g)BtROك hN͙l`-G&5H8q^P&Pp4)`]\_ Tt @r%'b-M#]Ctv-`u` Ute6 _CňaGI yV~0/%ʮ5i]^q˾˾#G.֚hM&jejSm _ <2,2e2Jvj;mmm3eL˘f[u;v^)O(&Q5vB ґ*KB0L8 )R) m! *$9!36I%8},=Φ,{44x Ãۈ"QH_\ۂPzRg l$fx bFk"v(KG=a:1yOGwa.DG9]]AĻ'lȈtŽ ,S F(B'`w11ӤLB^dPQI>55DHt)me= mGY`V+W,G#K^R/ bؐp7ʗC}2D /nŭ*Sejƙ3g0JuGρ G%]SaPC@SW 6"VF'q)$DQ2L F ,[>6 ':ZHTFnǣJ{=9 xϛPDu(;2Uv)M!ȷ1RPpi_ ] xЂB@%\]FY6PQ^4*tyZpV)+=C磖KkߝUlO?e/qǵL-ST>W>W>OHHQDEPmh#lXٰyyy=/z^|J+u\o:(_jjer@AUR>2C,H83vVA#p4;I'WD9< .!P΁nF n3Bʙ Kd(&8BaJ/@‚c|1Y*3मb&Ll>#?e/nxAţr0tE9Y` ` pgH\@ 9VmCMN7\w}s7?o~|_}_}_a{z|: 4%Q%iРC5qM\kZ {¼n^7g(QޑHw;]N>b Gd*|uco~O}]Da ՆD3@sg?]2 ҧ u8fc99 k h= ? P^!@];I8qRvG D91wI~kB[6)Fqr&0"uQ,Ìqv+J7Q/_dX/ 79}&fblf KG 1`POD,/G4M mIXac:gH91'[zk0287(і[h  UX ~ JS]eF{壡l0aɅmԘbEs_9\Twr>5>?eJ_$}z]^w.ݥkYZ|||@I_:5ذhD[E"c1w~Ku.@^V?oŸ-#a $O;5snsrY<)lh%I 0f?kOpnZ2lUҭ?i&CccqSaaq|TJ͗Fq+ ktś⵿7ZMccfƅ;(BsȻnPTiiNbRxVZIQA4b\]ZN.Y=vHj)Fc-t_ / wb܉ U U Uz>-zE @6_0gqgdeQutuu{ٽ^r7nJ3g01ajGH4o~,oљ߭BՔ+ً;8 q:(Ѥ˟lۗ'2` @Od_3MFʟaED]z4$p{w8O>gޠ6r](v)UُS4@oI&^cB ؁Bt:#k<.qܜ(%|=H%͚aV7p7 04E|53^Xe?G%O5IP4I<'3 g,H$#H䗸iݵZw Mhs{CuP%AO'HtH26LΙ3vu=vO=-̡ȧ˧wh 36o_ Sx|]mp156p+`CAJBŧdN7X\zU3PJw=[(P:Z4$-؆ByBC q3iZNZr*밵͕%1gbDHː4mxqK$Tr ֓Y\vvIS_ucިwcкA;x a# 6"hBNo!o%`A"| ?P_:Pa!tTr >.j7RG5O'lllb,&6WP4Vkl5[v|;ǝ K K Kh$IN9,O;>"חYj^j{Qs ''R"Dc#GAB :٪oDS+vCHK  <>A+%pK|Ծۼt $E6K`BʣFϪs3H}z>? *%?#ўў+Wf k.+ JDS P ~a@w?P{=o7ӂi4ooollāFn:k8yD/8l͎OJ h/.r=9lʖ$ AAгDv!"ܣ8NyۄCV| ;xYkeqD3F 6U^E&6M" 1#\/4UUO➦4Unbwto6NȓY\KKր:%7)}gvkND*Qܘ:ȭzQkPM~f5#5#5#5,#,#,#,",",w5j|# ;&,X (v]\k lllUUU+~ů$lKؖ-bŘNRj1\z.G=iA1q9gkaKW>I" WaA- 9ES}n6E| W@;r 6;y)~XyL=r?S+t\sD4%]!\Q}8x\Oaw`0b<}?yn$ _[" .yzI)YCoh'2;E =o>aKSyq_UکLX2]\իէOS 5I[\7fWِcZ=ӥ%J5|H⤣|"t wFcԶ=TȢpTB _,vEΪ,調*ڨqh%)q++r*T̩9?s~Ia& VӑHq].jA7z/ٶ 5$*J"(9> djaȹr7>n|| ν鳢S^q>]$ؕwWw?g|Nj*6`gIݮ`@e^K6/Vsydn893@CSR  B]p~I{2|Mi(2A|ڪXg Z\kQpsܥ@+%cɍԳU-C}n6&~u8yJQ˹Sr a׸垲f,CTatؐ:YX<:Ki׆w+1 A_EWHl$!.) |H'JTh=OXX3JSZVhr~A~YeOϞ==Jؕ+sssʎʎj Bd,ogZr6la1kB-B-B-|_UWCѡP+$BKF;Wrƽ޾ǟG/S{!vi:*8EB_J$ؠ+a{z!DB#9)e (yZҔ/,]բ&On}8ɋȡ*"y8Mr=4aEY\r#}KlS(z$[D+ojVg.^lOkDj_K2';.ynq / 8aV9K)P},0`+v5J9eC.>W_yJNd2a;v k2[I"I$a"&b"KL3Y8/΋z "o A8|9eJ41i}(L<?[ m]fs%ZzI#ɮKqXgB(V?jw c>'HKQi<+T;!!:) Kԯ)5X ğ 5$~|\x儞u?8u3G)aaK4&( R&waQv'O'^Q^P/GxonqqYyXyXy8_#6MbxH<$ k;3!J))>?|Rh\vt3֧-~0=<+5FWrC[A3'+xbQ 7x膝X5|Sw]!h %o"`Eɶi]!][P֝]۲xpFаfKe"y2052aR} OEJ4$d T0_dÍ |]ϣ}o^l]a>k 3r v/+bk:ƕ+|]Tm:?dvϔd-Vb#?4Syyy~N?Pz(=EqQ\5=y a)xmMnnnnԻQ:88ywfOOOЧUdž"o斷KG\^4*,j=8Bp H:$ |V3r;K p1Ma;Z#(rELrJQ\4ms6Sn1vM t ^*[*%"-ݼڱy |[jrO7i{d'` ?Ep DqJ]Xh'L!vTMKE\BF@kQ1cnU}ꏧiu֑[G2dɘ|._?wwqwqwqxzCGq$__la<º`].fŇłłżc>Nh(Qȑ#բ?eF_o)+;fV>VxpqGWܙ H WjS4jwYAei C9#MpJP Y3q [W,JycR‹r&Y(\$T#(7Cƌ9ABGߩmiwěEod> _3de>ofBˢcG:TިM+ܓREd:'D^Vy2ftaaÇwpp[-Z֣K2(2&'ȷ؏R9J̭Vs2BF(bЋ> v'N Q(g)xE;>`&22V^}`;vzg_gc|R%'Q)@rz#> V+"jroo M,* XWZϣ*-kog2k<^4Z@oD5G*a?Y@ڐ&OXC oAΡ࢒tؼ ^tJ[+)G]Wb y9&έ{ iR IS7CIKtEi~ 7'50O·T]vpQ33*GW,)~1;IK _&5&#+"v?[vx[{% ֪iմjfɚ5ǓIϫϫϻ?uyyyJWuUWQ(mr^9-z C1CLBBb`/奼4?jdy-5ǙqCt t tD')fH̐!jC/ůщ{"v8(|f"BFQsϱaXU~g|r|.w ! [)r4nuRުL\Bʄk8_+^HjAD)Ѻh]y~ٜ9gy,Η/;_v˻,+v!s9ߜo2{B-C-C-o %^W=ўhO={ggg5 u`'h${ 0,oU ^]qӈRtօbfigy[ҩT!4 3IEe$1A\GE9|E5ӛ$&w‹QS4}Qܲqzf Cbp vs[6d3jjjTTT)))PkKW>Q>Q>Q4FUW:39?b~k|ɫjw;Cs9&z۴VꈪU#F>}999PjA9[n iBUN}k`2yQ;]5o`W=3xOXW5F\VSh}<[WcZt$آs|BgJkG^R8twxMO N8N^{='='='V[s8sdg3Yo7՛jZTR)}bX/c/b/ʢ,Os{-xx^ūxk}JkҼj^5F it.p.p.Y'N!CV}}`)CI \pͭ-KQ&*?nggge/=L3!q%Bp;G8vFQc8DYd-ڢviF`ռھl_/~ovit~e)YJar{rY.e~i~i~iX)Vhn4M M M1)M_i\1W{{{^kW)u[XXnǃL L L 4 4 44 B:VF+m6h-mLm6S7JD*=JOKsi.O~C?+H_/p#阌ɘov.ʾ}>kXVqUܺf]-͖fKsl&f}>b--ůJkrqqg3ZUVU+u:JQJYztJtGh} y xx3xF }>i7ϛ 1٘lLί5ov;]]jw*UJVohk5F?c1R,ʧWq%S? uNp@2[fly2^~%_nv7mm}>o k"f5YVGcC:x 0[UTD5JU*uԝn-UPN:/żq9.x ί&}O~H1?+AbEݢnQO|u:_tU*JJ%%VUbs92]L D@l[VJ]+ePeuna9c9A<.[V8'ʆT"|p_-{K +$I' *ʛy3opp='b.dFazZO]zQ/%9b8)NsRD!EHEEQQ4JU(!J"M4~x*GSt oMh;N oVlTLTŽ\6ï6^kx\"%W xS|}c'q'q n-x 17p7 psQ,ųMi7(D!JJTjR[jKmE7Mt+XPjSO_pjߍ؝/8WFeTlͷg$ߖo˷;α}>k#p\f.35͚fMq8_ai@ B)R(R**8%P%PP_L,£#D%tEXtdate:create2018-10-06T12:06:20+00:00Gj%tEXtdate:modify2018-10-06T12:06:20+00:006GtEXtsvg:base-urifile:///home/andrew/projects/aiohttp/docs/aiohttp-icon.svg!hIENDB`././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1713285830.5351148 aiohttp-3.9.5/tests/autobahn/0000755000175100001770000000000014607525307015561 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/autobahn/Dockerfile.aiohttp0000644000175100001770000000010114607525266021216 0ustar00runnerdockerFROM python:3.9.5 COPY ./ /src WORKDIR /src RUN pip install . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/autobahn/Dockerfile.autobahn0000644000175100001770000000032714607525266021361 0ustar00runnerdockerFROM crossbario/autobahn-testsuite:0.8.2 RUN apt-get update && apt-get install python3 python3-pip -y RUN pip3 install wait-for-it CMD ["wstest", "--mode", "fuzzingserver", "--spec", "/config/fuzzingserver.json"] ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1713285830.5351148 aiohttp-3.9.5/tests/autobahn/client/0000755000175100001770000000000014607525307017037 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/autobahn/client/client.py0000644000175100001770000000236314607525266020677 0ustar00runnerdocker#!/usr/bin/env python3 import asyncio import aiohttp async def client(url: str, name: str) -> None: async with aiohttp.ClientSession() as session: async with session.ws_connect(url + "/getCaseCount") as ws: num_tests = int((await ws.receive()).data) print("running %d cases" % num_tests) for i in range(1, num_tests + 1): print("running test case:", i) text_url = url + "/runCase?case=%d&agent=%s" % (i, name) async with session.ws_connect(text_url) as ws: async for msg in ws: if msg.type == aiohttp.WSMsgType.TEXT: await ws.send_str(msg.data) elif msg.type == aiohttp.WSMsgType.BINARY: await ws.send_bytes(msg.data) else: break url = url + "/updateReports?agent=%s" % name async with session.ws_connect(url) as ws: print("finally requesting %s" % url) async def run(url: str, name: str) -> None: try: await client(url, name) except Exception: import traceback traceback.print_exc() if __name__ == "__main__": asyncio.run(run("http://localhost:9001", "aiohttp")) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/autobahn/client/fuzzingserver.json0000644000175100001770000000033114607525266022656 0ustar00runnerdocker { "url": "ws://localhost:9001", "options": {"failByDrop": false}, "outdir": "./reports/clients", "webport": 8080, "cases": ["*"], "exclude-cases": ["12.*", "13.*"], "exclude-agent-cases": {} } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1713285830.5351148 aiohttp-3.9.5/tests/autobahn/server/0000755000175100001770000000000014607525307017067 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/autobahn/server/fuzzingclient.json0000644000175100001770000000054014607525266022660 0ustar00runnerdocker{ "options": { "failByDrop": false }, "outdir": "./reports/servers", "servers": [ { "agent": "AutobahnServer", "url": "ws://localhost:9001", "options": { "version": 18 } } ], "cases": ["*"], "exclude-cases": ["12.*", "13.*"], "exclude-agent-cases": {} } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/autobahn/server/server.py0000644000175100001770000000265414607525266020762 0ustar00runnerdocker#!/usr/bin/env python3 import logging from typing import List from aiohttp import WSCloseCode, web websockets = web.AppKey("websockets", List[web.WebSocketResponse]) async def wshandler(request: web.Request) -> web.WebSocketResponse: ws = web.WebSocketResponse(autoclose=False) is_ws = ws.can_prepare(request) if not is_ws: raise web.HTTPBadRequest() await ws.prepare(request) request.app[websockets].append(ws) while True: msg = await ws.receive() if msg.type == web.WSMsgType.TEXT: await ws.send_str(msg.data) elif msg.type == web.WSMsgType.BINARY: await ws.send_bytes(msg.data) elif msg.type == web.WSMsgType.CLOSE: await ws.close() break else: break return ws async def on_shutdown(app: web.Application) -> None: ws_list = app[websockets] for ws in set(ws_list): await ws.close(code=WSCloseCode.GOING_AWAY, message=b"Server shutdown") if __name__ == "__main__": logging.basicConfig( level=logging.DEBUG, format="%(asctime)s %(levelname)s %(message)s" ) app = web.Application() l: List[web.WebSocketResponse] = [] app[websockets] = l app.router.add_route("GET", "/", wshandler) app.on_shutdown.append(on_shutdown) try: web.run_app(app, port=9001) except KeyboardInterrupt: print("Server stopped at http://127.0.0.1:9001") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/autobahn/test_autobahn.py0000644000175100001770000001014614607525266021001 0ustar00runnerdockerimport json import subprocess import sys from pathlib import Path from typing import Any, Dict, Generator, List import pytest import python_on_whales from pytest import TempPathFactory @pytest.fixture(scope="session") def report_dir(tmp_path_factory: TempPathFactory) -> Path: return tmp_path_factory.mktemp("reports") @pytest.fixture(scope="session", autouse=True) def build_autobahn_testsuite() -> Generator[None, None, None]: try: python_on_whales.docker.build( file="tests/autobahn/Dockerfile.autobahn", tags=["autobahn-testsuite"], context_path=".", ) except python_on_whales.DockerException: pytest.skip(msg="The docker daemon is not running.") try: yield finally: python_on_whales.docker.image.remove(x="autobahn-testsuite") def get_failed_tests(report_path: str, name: str) -> List[Dict[str, Any]]: path = Path(report_path) result_summary = json.loads((path / "index.json").read_text())[name] failed_messages = [] PASS = {"OK", "INFORMATIONAL"} entry_fields = {"case", "description", "expectation", "expected", "received"} for results in result_summary.values(): if results["behavior"] in PASS and results["behaviorClose"] in PASS: continue report = json.loads((path / results["reportfile"]).read_text()) failed_messages.append({field: report[field] for field in entry_fields}) return failed_messages @pytest.mark.skipif(sys.platform == "darwin", reason="Don't run on macOS") @pytest.mark.xfail def test_client(report_dir: Path, request: Any) -> None: try: print("Starting autobahn-testsuite server") autobahn_container = python_on_whales.docker.run( detach=True, image="autobahn-testsuite", name="autobahn", publish=[(9001, 9001)], remove=True, volumes=[ (f"{request.fspath.dirname}/client", "/config"), (f"{report_dir}", "/reports"), ], ) print("Running aiohttp test client") client = subprocess.Popen( ["wait-for-it", "-s", "localhost:9001", "--"] + [sys.executable] + ["tests/autobahn/client/client.py"] ) client.wait() finally: print("Stopping client and server") client.terminate() client.wait() autobahn_container.stop() failed_messages = get_failed_tests(f"{report_dir}/clients", "aiohttp") assert not failed_messages, "\n".join( "\n\t".join( f"{field}: {msg[field]}" for field in ("case", "description", "expectation", "expected", "received") ) for msg in failed_messages ) @pytest.mark.skipif(sys.platform == "darwin", reason="Don't run on macOS") @pytest.mark.xfail def test_server(report_dir: Path, request: Any) -> None: try: print("Starting aiohttp test server") server = subprocess.Popen( [sys.executable] + ["tests/autobahn/server/server.py"] ) print("Starting autobahn-testsuite client") python_on_whales.docker.run( image="autobahn-testsuite", name="autobahn", remove=True, volumes=[ (f"{request.fspath.dirname}/server", "/config"), (f"{report_dir}", "/reports"), ], networks=["host"], command=[ "wait-for-it", "-s", "localhost:9001", "--", "wstest", "--mode", "fuzzingclient", "--spec", "/config/fuzzingclient.json", ], ) finally: print("Stopping client and server") server.terminate() server.wait() failed_messages = get_failed_tests(f"{report_dir}/servers", "AutobahnServer") assert not failed_messages, "\n".join( "\n\t".join( f"{field}: {msg[field]}" for field in ("case", "description", "expectation", "expected", "received") ) for msg in failed_messages ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/conftest.py0000644000175100001770000001333314607525266016166 0ustar00runnerdockerimport asyncio import os import socket import ssl import sys from hashlib import md5, sha256 from pathlib import Path from tempfile import TemporaryDirectory from uuid import uuid4 import pytest from aiohttp.test_utils import loop_context try: import trustme # Check if the CA is available in runtime, MacOS on Py3.10 fails somehow trustme.CA() TRUSTME: bool = True except ImportError: TRUSTME = False pytest_plugins = ["aiohttp.pytest_plugin", "pytester"] IS_HPUX = sys.platform.startswith("hp-ux") IS_LINUX = sys.platform.startswith("linux") @pytest.fixture def tls_certificate_authority(): if not TRUSTME: pytest.xfail("trustme is not supported") return trustme.CA() @pytest.fixture def tls_certificate(tls_certificate_authority): return tls_certificate_authority.issue_cert( "localhost", "xn--prklad-4va.localhost", "127.0.0.1", "::1", ) @pytest.fixture def ssl_ctx(tls_certificate): ssl_ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) tls_certificate.configure_cert(ssl_ctx) return ssl_ctx @pytest.fixture def client_ssl_ctx(tls_certificate_authority): ssl_ctx = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH) tls_certificate_authority.configure_trust(ssl_ctx) return ssl_ctx @pytest.fixture def tls_ca_certificate_pem_path(tls_certificate_authority): with tls_certificate_authority.cert_pem.tempfile() as ca_cert_pem: yield ca_cert_pem @pytest.fixture def tls_certificate_pem_path(tls_certificate): with tls_certificate.private_key_and_cert_chain_pem.tempfile() as cert_pem: yield cert_pem @pytest.fixture def tls_certificate_pem_bytes(tls_certificate): return tls_certificate.cert_chain_pems[0].bytes() @pytest.fixture def tls_certificate_fingerprint_sha256(tls_certificate_pem_bytes): tls_cert_der = ssl.PEM_cert_to_DER_cert(tls_certificate_pem_bytes.decode()) return sha256(tls_cert_der).digest() @pytest.fixture def unix_sockname(tmp_path, tmp_path_factory): """Generate an fs path to the UNIX domain socket for testing. N.B. Different OS kernels have different fs path length limitations for it. For Linux, it's 108, for HP-UX it's 92 (or higher) depending on its version. For for most of the BSDs (Open, Free, macOS) it's mostly 104 but sometimes it can be down to 100. Ref: https://github.com/aio-libs/aiohttp/issues/3572 """ if not hasattr(socket, "AF_UNIX"): pytest.skip("requires UNIX sockets") max_sock_len = 92 if IS_HPUX else 108 if IS_LINUX else 100 """Amount of bytes allocated for the UNIX socket path by OS kernel. Ref: https://unix.stackexchange.com/a/367012/27133 """ sock_file_name = "unix.sock" unique_prefix = f"{uuid4()!s}-" unique_prefix_len = len(unique_prefix.encode()) root_tmp_dir = Path("/tmp").resolve() os_tmp_dir = Path(os.getenv("TMPDIR", "/tmp")).resolve() original_base_tmp_path = Path( str(tmp_path_factory.getbasetemp()), ).resolve() original_base_tmp_path_hash = md5( str(original_base_tmp_path).encode(), ).hexdigest() def make_tmp_dir(base_tmp_dir): return TemporaryDirectory( dir=str(base_tmp_dir), prefix="pt-", suffix=f"-{original_base_tmp_path_hash!s}", ) def assert_sock_fits(sock_path): sock_path_len = len(sock_path.encode()) # exit-check to verify that it's correct and simplify debugging # in the future assert sock_path_len <= max_sock_len, ( "Suggested UNIX socket ({sock_path}) is {sock_path_len} bytes " "long but the current kernel only has {max_sock_len} bytes " "allocated to hold it so it must be shorter. " "See https://github.com/aio-libs/aiohttp/issues/3572 " "for more info." ).format_map(locals()) paths = original_base_tmp_path, os_tmp_dir, root_tmp_dir unique_paths = [p for n, p in enumerate(paths) if p not in paths[:n]] paths_num = len(unique_paths) for num, tmp_dir_path in enumerate(paths, 1): with make_tmp_dir(tmp_dir_path) as tmpd: tmpd = Path(tmpd).resolve() sock_path = str(tmpd / sock_file_name) sock_path_len = len(sock_path.encode()) if num >= paths_num: # exit-check to verify that it's correct and simplify # debugging in the future assert_sock_fits(sock_path) if sock_path_len <= max_sock_len: if max_sock_len - sock_path_len >= unique_prefix_len: # If we're lucky to have extra space in the path, # let's also make it more unique sock_path = str(tmpd / "".join((unique_prefix, sock_file_name))) # Double-checking it: assert_sock_fits(sock_path) yield sock_path return @pytest.fixture def pipe_name(): name = rf"\\.\pipe\{uuid4().hex}" return name @pytest.fixture def selector_loop(): policy = asyncio.WindowsSelectorEventLoopPolicy() asyncio.set_event_loop_policy(policy) with loop_context(policy.new_event_loop) as _loop: asyncio.set_event_loop(_loop) yield _loop @pytest.fixture def netrc_contents( tmp_path: Path, monkeypatch: pytest.MonkeyPatch, request: pytest.FixtureRequest, ): """ Prepare :file:`.netrc` with given contents. Monkey-patches :envvar:`NETRC` to point to created file. """ netrc_contents = getattr(request, "param", None) netrc_file_path = tmp_path / ".netrc" if netrc_contents is not None: netrc_file_path.write_text(netrc_contents) monkeypatch.setenv("NETRC", str(netrc_file_path)) return netrc_file_path ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/data.unknown_mime_type0000644000175100001770000000001514607525266020362 0ustar00runnerdockerfile content ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/data.zero_bytes0000644000175100001770000000000014607525266016772 0ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/sample.txt0000644000175100001770000002613614607525266016016 0ustar00runnerdocker Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_base_protocol.py0000644000175100001770000001463114607525266020235 0ustar00runnerdockerimport asyncio from contextlib import suppress from unittest import mock import pytest from aiohttp.base_protocol import BaseProtocol async def test_loop() -> None: loop = asyncio.get_event_loop() asyncio.set_event_loop(None) pr = BaseProtocol(loop) assert pr._loop is loop async def test_pause_writing() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop) assert not pr._paused pr.pause_writing() assert pr._paused async def test_pause_reading_no_transport() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop) assert not pr._reading_paused pr.pause_reading() assert not pr._reading_paused async def test_pause_reading_stub_transport() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop) tr = asyncio.Transport() pr.transport = tr assert not pr._reading_paused pr.pause_reading() assert pr._reading_paused async def test_resume_reading_no_transport() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop) pr._reading_paused = True pr.resume_reading() assert pr._reading_paused async def test_resume_reading_stub_transport() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop) tr = asyncio.Transport() pr.transport = tr pr._reading_paused = True pr.resume_reading() assert not pr._reading_paused async def test_resume_writing_no_waiters() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) pr.pause_writing() assert pr._paused pr.resume_writing() assert not pr._paused async def test_resume_writing_waiter_done() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) waiter = mock.Mock(done=mock.Mock(return_value=True)) pr._drain_waiter = waiter pr._paused = True pr.resume_writing() assert not pr._paused assert waiter.mock_calls == [mock.call.done()] async def test_connection_made() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() assert pr.transport is None pr.connection_made(tr) assert pr.transport is not None async def test_connection_lost_not_paused() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) assert pr.connected pr.connection_lost(None) assert pr.transport is None assert not pr.connected async def test_connection_lost_paused_without_waiter() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) assert pr.connected pr.pause_writing() pr.connection_lost(None) assert pr.transport is None assert not pr.connected async def test_connection_lost_waiter_done() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) pr._paused = True waiter = mock.Mock(done=mock.Mock(return_value=True)) pr._drain_waiter = waiter pr.connection_lost(None) assert pr._drain_waiter is None assert waiter.mock_calls == [mock.call.done()] async def test_drain_lost() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.connection_lost(None) with pytest.raises(ConnectionResetError): await pr._drain_helper() async def test_drain_not_paused() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) assert pr._drain_waiter is None await pr._drain_helper() assert pr._drain_waiter is None async def test_resume_drain_waited() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() t = loop.create_task(pr._drain_helper()) await asyncio.sleep(0) assert pr._drain_waiter is not None pr.resume_writing() assert (await t) is None assert pr._drain_waiter is None async def test_lost_drain_waited_ok() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() t = loop.create_task(pr._drain_helper()) await asyncio.sleep(0) assert pr._drain_waiter is not None pr.connection_lost(None) assert (await t) is None assert pr._drain_waiter is None async def test_lost_drain_waited_exception() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() t = loop.create_task(pr._drain_helper()) await asyncio.sleep(0) assert pr._drain_waiter is not None exc = RuntimeError() pr.connection_lost(exc) with pytest.raises(ConnectionError, match=r"^Connection lost$") as cm: await t assert cm.value.__cause__ is exc assert pr._drain_waiter is None async def test_lost_drain_cancelled() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() fut = loop.create_future() async def wait(): fut.set_result(None) await pr._drain_helper() t = loop.create_task(wait()) await fut t.cancel() assert pr._drain_waiter is not None pr.connection_lost(None) with suppress(asyncio.CancelledError): await t assert pr._drain_waiter is None async def test_resume_drain_cancelled() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() fut = loop.create_future() async def wait(): fut.set_result(None) await pr._drain_helper() t = loop.create_task(wait()) await fut t.cancel() assert pr._drain_waiter is not None pr.resume_writing() with suppress(asyncio.CancelledError): await t assert pr._drain_waiter is None async def test_parallel_drain_race_condition() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() ts = [loop.create_task(pr._drain_helper()) for _ in range(5)] assert not (await asyncio.wait(ts, timeout=0.5))[ 0 ], "All draining tasks must be pending" assert pr._drain_waiter is not None pr.resume_writing() await asyncio.gather(*ts) assert pr._drain_waiter is None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_circular_imports.py0000644000175100001770000000672514607525266020770 0ustar00runnerdocker"""Tests for circular imports in all local packages and modules. This ensures all internal packages can be imported right away without any need to import some other module before doing so. This module is based on an idea that pytest uses for self-testing: * https://github.com/sanitizers/octomachinery/blob/be18b54/tests/circular_imports_test.py * https://github.com/pytest-dev/pytest/blob/d18c75b/testing/test_meta.py * https://twitter.com/codewithanthony/status/1229445110510735361 """ import os import pkgutil import socket import subprocess import sys from itertools import chain from pathlib import Path from types import ModuleType from typing import TYPE_CHECKING, Generator, List, Union import pytest if TYPE_CHECKING: from _pytest.mark.structures import ParameterSet import aiohttp def _mark_aiohttp_worker_for_skipping( importables: List[str], ) -> List[Union[str, "ParameterSet"]]: return [ pytest.param( importable, marks=pytest.mark.skipif( not hasattr(socket, "AF_UNIX"), reason="It's a UNIX-only module" ), ) if importable == "aiohttp.worker" else importable for importable in importables ] def _find_all_importables(pkg: ModuleType) -> List[str]: """Find all importables in the project. Return them in order. """ return sorted( set( chain.from_iterable( _discover_path_importables(Path(p), pkg.__name__) for p in pkg.__path__ ), ), ) def _discover_path_importables( pkg_pth: Path, pkg_name: str, ) -> Generator[str, None, None]: """Yield all importables under a given path and package.""" for dir_path, _d, file_names in os.walk(pkg_pth): pkg_dir_path = Path(dir_path) if pkg_dir_path.parts[-1] == "__pycache__": continue if all(Path(_).suffix != ".py" for _ in file_names): continue rel_pt = pkg_dir_path.relative_to(pkg_pth) pkg_pref = ".".join((pkg_name,) + rel_pt.parts) yield from ( pkg_path for _, pkg_path, _ in pkgutil.walk_packages( (str(pkg_dir_path),), prefix=f"{pkg_pref}.", ) ) @pytest.mark.parametrize( "import_path", _mark_aiohttp_worker_for_skipping(_find_all_importables(aiohttp)), ) def test_no_warnings(import_path: str) -> None: """Verify that exploding importables doesn't explode. This is seeking for any import errors including ones caused by circular imports. """ imp_cmd = ( # fmt: off sys.executable, "-W", "error", # The following deprecation warning is triggered by importing # `gunicorn.util`. Hopefully, it'll get fixed in the future. See # https://github.com/benoitc/gunicorn/issues/2840 for detail. "-W", "ignore:module 'sre_constants' is " "deprecated:DeprecationWarning:pkg_resources._vendor.pyparsing", # Also caused by `gunicorn.util` importing `pkg_resources`: "-W", "ignore:Creating a LegacyVersion has been deprecated and " "will be removed in the next major release:" "DeprecationWarning:", # Deprecation warning emitted by setuptools v67.5.0+ triggered by importing # `gunicorn.util`. "-W", "ignore:pkg_resources is deprecated as an API:" "DeprecationWarning", "-c", f"import {import_path!s}", # fmt: on ) subprocess.check_call(imp_cmd) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_classbasedview.py0000644000175100001770000000243714607525266020402 0ustar00runnerdockerfrom unittest import mock import pytest from aiohttp import web from aiohttp.web_urldispatcher import View def test_ctor() -> None: request = mock.Mock() view = View(request) assert view.request is request async def test_render_ok() -> None: resp = web.Response(text="OK") class MyView(View): async def get(self): return resp request = mock.Mock() request.method = "GET" resp2 = await MyView(request) assert resp is resp2 async def test_render_unknown_method() -> None: class MyView(View): async def get(self): return web.Response(text="OK") options = get request = mock.Mock() request.method = "UNKNOWN" with pytest.raises(web.HTTPMethodNotAllowed) as ctx: await MyView(request) assert ctx.value.headers["allow"] == "GET,OPTIONS" assert ctx.value.status == 405 async def test_render_unsupported_method() -> None: class MyView(View): async def get(self): return web.Response(text="OK") options = delete = get request = mock.Mock() request.method = "POST" with pytest.raises(web.HTTPMethodNotAllowed) as ctx: await MyView(request) assert ctx.value.headers["allow"] == "DELETE,GET,OPTIONS" assert ctx.value.status == 405 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_client_connection.py0000644000175100001770000000655014607525266021100 0ustar00runnerdockerimport gc from unittest import mock import pytest from aiohttp.connector import Connection @pytest.fixture def key(): return object() @pytest.fixture def loop(): return mock.Mock() @pytest.fixture def connector(): return mock.Mock() @pytest.fixture def protocol(): return mock.Mock(should_close=False) def test_ctor(connector, key, protocol, loop) -> None: conn = Connection(connector, key, protocol, loop) with pytest.warns(DeprecationWarning): assert conn.loop is loop assert conn.protocol is protocol conn.close() def test_callbacks_on_close(connector, key, protocol, loop) -> None: conn = Connection(connector, key, protocol, loop) notified = False def cb(): nonlocal notified notified = True conn.add_callback(cb) conn.close() assert notified def test_callbacks_on_release(connector, key, protocol, loop) -> None: conn = Connection(connector, key, protocol, loop) notified = False def cb(): nonlocal notified notified = True conn.add_callback(cb) conn.release() assert notified def test_callbacks_exception(connector, key, protocol, loop) -> None: conn = Connection(connector, key, protocol, loop) notified = False def cb1(): raise Exception def cb2(): nonlocal notified notified = True conn.add_callback(cb1) conn.add_callback(cb2) conn.close() assert notified def test_del(connector, key, protocol, loop) -> None: loop.is_closed.return_value = False conn = Connection(connector, key, protocol, loop) exc_handler = mock.Mock() loop.set_exception_handler(exc_handler) with pytest.warns(ResourceWarning): del conn gc.collect() connector._release.assert_called_with(key, protocol, should_close=True) msg = { "client_connection": mock.ANY, # conn was deleted "message": "Unclosed connection", } if loop.get_debug(): msg["source_traceback"] = mock.ANY loop.call_exception_handler.assert_called_with(msg) def test_close(connector, key, protocol, loop) -> None: conn = Connection(connector, key, protocol, loop) assert not conn.closed conn.close() assert conn._protocol is None connector._release.assert_called_with(key, protocol, should_close=True) assert conn.closed def test_release(connector, key, protocol, loop) -> None: conn = Connection(connector, key, protocol, loop) assert not conn.closed conn.release() assert not protocol.transport.close.called assert conn._protocol is None connector._release.assert_called_with(key, protocol, should_close=False) assert conn.closed def test_release_proto_should_close(connector, key, protocol, loop) -> None: protocol.should_close = True conn = Connection(connector, key, protocol, loop) assert not conn.closed conn.release() assert not protocol.transport.close.called assert conn._protocol is None connector._release.assert_called_with(key, protocol, should_close=True) assert conn.closed def test_release_released(connector, key, protocol, loop) -> None: conn = Connection(connector, key, protocol, loop) conn.release() connector._release.reset_mock() conn.release() assert not protocol.transport.close.called assert conn._protocol is None assert not connector._release.called ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_client_exceptions.py0000644000175100001770000002533014607525266021117 0ustar00runnerdocker# Tests for client_exceptions.py import errno import pickle from unittest import mock import pytest from aiohttp import client, client_reqrep class TestClientResponseError: request_info = client.RequestInfo( url="http://example.com", method="GET", headers={}, real_url="http://example.com", ) def test_default_status(self) -> None: err = client.ClientResponseError(history=(), request_info=self.request_info) assert err.status == 0 def test_status(self) -> None: err = client.ClientResponseError( status=400, history=(), request_info=self.request_info ) assert err.status == 400 def test_pickle(self) -> None: err = client.ClientResponseError(request_info=self.request_info, history=()) for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.request_info == self.request_info assert err2.history == () assert err2.status == 0 assert err2.message == "" assert err2.headers is None err = client.ClientResponseError( request_info=self.request_info, history=(), status=400, message="Something wrong", headers={}, ) err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.request_info == self.request_info assert err2.history == () assert err2.status == 400 assert err2.message == "Something wrong" assert err2.headers == {} assert err2.foo == "bar" def test_repr(self) -> None: err = client.ClientResponseError(request_info=self.request_info, history=()) assert repr(err) == (f"ClientResponseError({self.request_info!r}, ())") err = client.ClientResponseError( request_info=self.request_info, history=(), status=400, message="Something wrong", headers={}, ) assert repr(err) == ( "ClientResponseError(%r, (), status=400, " "message='Something wrong', headers={})" % (self.request_info,) ) def test_str(self) -> None: err = client.ClientResponseError( request_info=self.request_info, history=(), status=400, message="Something wrong", headers={}, ) assert str(err) == ( "400, message='Something wrong', " "url='http://example.com'" ) def test_response_status() -> None: request_info = mock.Mock(real_url="http://example.com") err = client.ClientResponseError( status=400, history=None, request_info=request_info ) assert err.status == 400 def test_response_deprecated_code_property() -> None: request_info = mock.Mock(real_url="http://example.com") with pytest.warns(DeprecationWarning): err = client.ClientResponseError( code=400, history=None, request_info=request_info ) with pytest.warns(DeprecationWarning): assert err.code == err.status with pytest.warns(DeprecationWarning): err.code = "404" with pytest.warns(DeprecationWarning): assert err.code == err.status def test_response_both_code_and_status() -> None: with pytest.raises(ValueError): client.ClientResponseError( code=400, status=400, history=None, request_info=None ) class TestClientConnectorError: connection_key = client_reqrep.ConnectionKey( host="example.com", port=8080, is_ssl=False, ssl=True, proxy=None, proxy_auth=None, proxy_headers_hash=None, ) def test_ctor(self) -> None: err = client.ClientConnectorError( connection_key=self.connection_key, os_error=OSError(errno.ENOENT, "No such file"), ) assert err.errno == errno.ENOENT assert err.strerror == "No such file" assert err.os_error.errno == errno.ENOENT assert err.os_error.strerror == "No such file" assert err.host == "example.com" assert err.port == 8080 assert err.ssl is True def test_pickle(self) -> None: err = client.ClientConnectorError( connection_key=self.connection_key, os_error=OSError(errno.ENOENT, "No such file"), ) err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.errno == errno.ENOENT assert err2.strerror == "No such file" assert err2.os_error.errno == errno.ENOENT assert err2.os_error.strerror == "No such file" assert err2.host == "example.com" assert err2.port == 8080 assert err2.ssl is True assert err2.foo == "bar" def test_repr(self) -> None: os_error = OSError(errno.ENOENT, "No such file") err = client.ClientConnectorError( connection_key=self.connection_key, os_error=os_error ) assert repr(err) == ( f"ClientConnectorError({self.connection_key!r}, {os_error!r})" ) def test_str(self) -> None: err = client.ClientConnectorError( connection_key=self.connection_key, os_error=OSError(errno.ENOENT, "No such file"), ) assert str(err) == ( "Cannot connect to host example.com:8080 ssl:default [No such file]" ) class TestClientConnectorCertificateError: connection_key = client_reqrep.ConnectionKey( host="example.com", port=8080, is_ssl=False, ssl=True, proxy=None, proxy_auth=None, proxy_headers_hash=None, ) def test_ctor(self) -> None: certificate_error = Exception("Bad certificate") err = client.ClientConnectorCertificateError( connection_key=self.connection_key, certificate_error=certificate_error ) assert err.certificate_error == certificate_error assert err.host == "example.com" assert err.port == 8080 assert err.ssl is False def test_pickle(self) -> None: certificate_error = Exception("Bad certificate") err = client.ClientConnectorCertificateError( connection_key=self.connection_key, certificate_error=certificate_error ) err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.certificate_error.args == ("Bad certificate",) assert err2.host == "example.com" assert err2.port == 8080 assert err2.ssl is False assert err2.foo == "bar" def test_repr(self) -> None: certificate_error = Exception("Bad certificate") err = client.ClientConnectorCertificateError( connection_key=self.connection_key, certificate_error=certificate_error ) assert repr(err) == ( "ClientConnectorCertificateError(%r, %r)" % (self.connection_key, certificate_error) ) def test_str(self) -> None: certificate_error = Exception("Bad certificate") err = client.ClientConnectorCertificateError( connection_key=self.connection_key, certificate_error=certificate_error ) assert str(err) == ( "Cannot connect to host example.com:8080 ssl:False" " [Exception: ('Bad certificate',)]" ) class TestServerDisconnectedError: def test_ctor(self) -> None: err = client.ServerDisconnectedError() assert err.message == "Server disconnected" err = client.ServerDisconnectedError(message="No connection") assert err.message == "No connection" def test_pickle(self) -> None: err = client.ServerDisconnectedError(message="No connection") err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.message == "No connection" assert err2.foo == "bar" def test_repr(self) -> None: err = client.ServerDisconnectedError() assert repr(err) == ("ServerDisconnectedError" "('Server disconnected')") err = client.ServerDisconnectedError(message="No connection") assert repr(err) == "ServerDisconnectedError('No connection')" def test_str(self) -> None: err = client.ServerDisconnectedError() assert str(err) == "Server disconnected" err = client.ServerDisconnectedError(message="No connection") assert str(err) == "No connection" class TestServerFingerprintMismatch: def test_ctor(self) -> None: err = client.ServerFingerprintMismatch( expected=b"exp", got=b"got", host="example.com", port=8080 ) assert err.expected == b"exp" assert err.got == b"got" assert err.host == "example.com" assert err.port == 8080 def test_pickle(self) -> None: err = client.ServerFingerprintMismatch( expected=b"exp", got=b"got", host="example.com", port=8080 ) err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.expected == b"exp" assert err2.got == b"got" assert err2.host == "example.com" assert err2.port == 8080 assert err2.foo == "bar" def test_repr(self) -> None: err = client.ServerFingerprintMismatch(b"exp", b"got", "example.com", 8080) assert repr(err) == ( "" ) class TestInvalidURL: def test_ctor(self) -> None: err = client.InvalidURL(url=":wrong:url:") assert err.url == ":wrong:url:" def test_pickle(self) -> None: err = client.InvalidURL(url=":wrong:url:") err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.url == ":wrong:url:" assert err2.foo == "bar" def test_repr(self) -> None: err = client.InvalidURL(url=":wrong:url:") assert repr(err) == "" def test_str(self) -> None: err = client.InvalidURL(url=":wrong:url:") assert str(err) == ":wrong:url:" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_client_fingerprint.py0000644000175100001770000000515314607525266021266 0ustar00runnerdockerimport hashlib from unittest import mock import pytest import aiohttp from aiohttp.client_reqrep import _merge_ssl_params ssl = pytest.importorskip("ssl") def test_fingerprint_sha256() -> None: sha256 = hashlib.sha256(b"12345678" * 64).digest() fp = aiohttp.Fingerprint(sha256) assert fp.fingerprint == sha256 def test_fingerprint_sha1() -> None: sha1 = hashlib.sha1(b"12345678" * 64).digest() with pytest.raises(ValueError): aiohttp.Fingerprint(sha1) def test_fingerprint_md5() -> None: md5 = hashlib.md5(b"12345678" * 64).digest() with pytest.raises(ValueError): aiohttp.Fingerprint(md5) def test_fingerprint_check_no_ssl() -> None: sha256 = hashlib.sha256(b"12345678" * 64).digest() fp = aiohttp.Fingerprint(sha256) transport = mock.Mock() transport.get_extra_info.return_value = None assert fp.check(transport) is None def test__merge_ssl_params_verify_ssl() -> None: with pytest.warns(DeprecationWarning): assert _merge_ssl_params(True, False, None, None) is False def test__merge_ssl_params_verify_ssl_conflict() -> None: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) with pytest.warns(DeprecationWarning): with pytest.raises(ValueError): _merge_ssl_params(ctx, False, None, None) def test__merge_ssl_params_ssl_context() -> None: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) with pytest.warns(DeprecationWarning): assert _merge_ssl_params(True, None, ctx, None) is ctx def test__merge_ssl_params_ssl_context_conflict() -> None: ctx1 = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ctx2 = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) with pytest.warns(DeprecationWarning): with pytest.raises(ValueError): _merge_ssl_params(ctx1, None, ctx2, None) def test__merge_ssl_params_fingerprint() -> None: digest = hashlib.sha256(b"123").digest() with pytest.warns(DeprecationWarning): ret = _merge_ssl_params(True, None, None, digest) assert ret.fingerprint == digest def test__merge_ssl_params_fingerprint_conflict() -> None: fingerprint = aiohttp.Fingerprint(hashlib.sha256(b"123").digest()) ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) with pytest.warns(DeprecationWarning): with pytest.raises(ValueError): _merge_ssl_params(ctx, None, None, fingerprint) def test__merge_ssl_params_ssl() -> None: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) assert ctx is _merge_ssl_params(ctx, None, None, None) def test__merge_ssl_params_invlid() -> None: with pytest.raises(TypeError): _merge_ssl_params(object(), None, None, None) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_client_functional.py0000644000175100001770000030757214607525266021113 0ustar00runnerdocker# HTTP client functional tests against aiohttp.web server import asyncio import datetime import http.cookies import io import json import pathlib import socket import ssl from typing import Any, AsyncIterator from unittest import mock import pytest from multidict import MultiDict from yarl import URL import aiohttp from aiohttp import Fingerprint, ServerFingerprintMismatch, hdrs, web from aiohttp.abc import AbstractResolver from aiohttp.client_exceptions import TooManyRedirects from aiohttp.pytest_plugin import AiohttpClient, TestClient from aiohttp.test_utils import unused_port @pytest.fixture def here(): return pathlib.Path(__file__).parent @pytest.fixture def fname(here): return here / "conftest.py" async def test_keepalive_two_requests_success(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body return web.Response(body=b"OK") app = web.Application() app.router.add_route("GET", "/", handler) connector = aiohttp.TCPConnector(limit=1) client = await aiohttp_client(app, connector=connector) resp1 = await client.get("/") await resp1.read() resp2 = await client.get("/") await resp2.read() assert 1 == len(client._session.connector._conns) async def test_keepalive_after_head_requests_success(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body return web.Response(body=b"OK") cnt_conn_reuse = 0 async def on_reuseconn(session, ctx, params): nonlocal cnt_conn_reuse cnt_conn_reuse += 1 trace_config = aiohttp.TraceConfig() trace_config._on_connection_reuseconn.append(on_reuseconn) app = web.Application() app.router.add_route("GET", "/", handler) app.router.add_route("HEAD", "/", handler) connector = aiohttp.TCPConnector(limit=1) client = await aiohttp_client( app, connector=connector, trace_configs=[trace_config] ) resp1 = await client.head("/") await resp1.read() resp2 = await client.get("/") await resp2.read() assert 1 == cnt_conn_reuse @pytest.mark.parametrize("status", (101, 204, 304)) async def test_keepalive_after_empty_body_status( aiohttp_client: Any, status: int ) -> None: async def handler(request): body = await request.read() assert b"" == body return web.Response(status=status) cnt_conn_reuse = 0 async def on_reuseconn(session, ctx, params): nonlocal cnt_conn_reuse cnt_conn_reuse += 1 trace_config = aiohttp.TraceConfig() trace_config._on_connection_reuseconn.append(on_reuseconn) app = web.Application() app.router.add_route("GET", "/", handler) connector = aiohttp.TCPConnector(limit=1) client = await aiohttp_client( app, connector=connector, trace_configs=[trace_config] ) resp1 = await client.get("/") await resp1.read() resp2 = await client.get("/") await resp2.read() assert cnt_conn_reuse == 1 @pytest.mark.parametrize("status", (101, 204, 304)) async def test_keepalive_after_empty_body_status_stream_response( aiohttp_client: Any, status: int ) -> None: async def handler(request): stream_response = web.StreamResponse(status=status) await stream_response.prepare(request) return stream_response cnt_conn_reuse = 0 async def on_reuseconn(session, ctx, params): nonlocal cnt_conn_reuse cnt_conn_reuse += 1 trace_config = aiohttp.TraceConfig() trace_config._on_connection_reuseconn.append(on_reuseconn) app = web.Application() app.router.add_route("GET", "/", handler) connector = aiohttp.TCPConnector(limit=1) client = await aiohttp_client( app, connector=connector, trace_configs=[trace_config] ) resp1 = await client.get("/") await resp1.read() resp2 = await client.get("/") await resp2.read() assert cnt_conn_reuse == 1 async def test_keepalive_response_released(aiohttp_client: Any) -> None: async def handler(request): body = await request.read() assert b"" == body return web.Response(body=b"OK") app = web.Application() app.router.add_route("GET", "/", handler) connector = aiohttp.TCPConnector(limit=1) client = await aiohttp_client(app, connector=connector) resp1 = await client.get("/") resp1.release() resp2 = await client.get("/") resp2.release() assert 1 == len(client._session.connector._conns) async def test_upgrade_connection_not_released_after_read(aiohttp_client) -> None: async def handler(request: web.Request) -> web.Response: body = await request.read() assert b"" == body return web.Response( status=101, headers={"Connection": "Upgrade", "Upgrade": "tcp"} ) app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") await resp.read() assert resp.connection is not None assert not resp.closed async def test_keepalive_server_force_close_connection(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body response = web.Response(body=b"OK") response.force_close() return response app = web.Application() app.router.add_route("GET", "/", handler) connector = aiohttp.TCPConnector(limit=1) client = await aiohttp_client(app, connector=connector) resp1 = await client.get("/") resp1.close() resp2 = await client.get("/") resp2.close() assert 0 == len(client._session.connector._conns) async def test_release_early(aiohttp_client) -> None: async def handler(request): await request.read() return web.Response(body=b"OK") app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.closed await resp.wait_for_close() assert 1 == len(client._session.connector._conns) async def test_HTTP_304(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body return web.Response(status=304) app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 304 content = await resp.read() assert content == b"" async def test_stream_request_on_server_eof(aiohttp_client) -> None: async def handler(request): return web.Response(text="OK", status=200) app = web.Application() app.add_routes([web.get("/", handler)]) app.add_routes([web.put("/", handler)]) client = await aiohttp_client(app) async def data_gen(): for _ in range(2): yield b"just data" await asyncio.sleep(0.1) async with client.put("/", data=data_gen()) as resp: assert 200 == resp.status assert len(client.session.connector._acquired) == 1 conn = next(iter(client.session.connector._acquired)) async with client.get("/") as resp: assert 200 == resp.status # Connection should have been reused conns = next(iter(client.session.connector._conns.values())) assert len(conns) == 1 assert conns[0][0] is conn async def test_stream_request_on_server_eof_nested(aiohttp_client) -> None: async def handler(request): return web.Response(text="OK", status=200) app = web.Application() app.add_routes([web.get("/", handler)]) app.add_routes([web.put("/", handler)]) client = await aiohttp_client(app) async def data_gen(): for _ in range(2): yield b"just data" await asyncio.sleep(0.1) async with client.put("/", data=data_gen()) as resp: assert 200 == resp.status async with client.get("/") as resp: assert 200 == resp.status # Should be 2 separate connections conns = next(iter(client.session.connector._conns.values())) assert len(conns) == 2 async def test_HTTP_304_WITH_BODY(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body return web.Response(body=b"test", status=304) app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 304 content = await resp.read() assert content == b"" async def test_auto_header_user_agent(aiohttp_client) -> None: async def handler(request): assert "aiohttp" in request.headers["user-agent"] return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) async with client.get("/") as resp: assert 200 == resp.status async def test_skip_auto_headers_user_agent(aiohttp_client) -> None: async def handler(request): assert hdrs.USER_AGENT not in request.headers return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) async with client.get("/", skip_auto_headers=["user-agent"]) as resp: assert 200 == resp.status async def test_skip_default_auto_headers_user_agent(aiohttp_client) -> None: async def handler(request): assert hdrs.USER_AGENT not in request.headers return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app, skip_auto_headers=["user-agent"]) async with client.get("/") as resp: assert 200 == resp.status async def test_skip_auto_headers_content_type(aiohttp_client) -> None: async def handler(request): assert hdrs.CONTENT_TYPE not in request.headers return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) async with client.get("/", skip_auto_headers=["content-type"]) as resp: assert 200 == resp.status async def test_post_data_bytesio(aiohttp_client) -> None: data = b"some buffer" async def handler(request): assert len(data) == request.content_length val = await request.read() assert data == val return web.Response() app = web.Application() app.router.add_route("POST", "/", handler) client = await aiohttp_client(app) with io.BytesIO(data) as file_handle: async with client.post("/", data=file_handle) as resp: assert 200 == resp.status async def test_post_data_with_bytesio_file(aiohttp_client) -> None: data = b"some buffer" async def handler(request): post_data = await request.post() assert ["file"] == list(post_data.keys()) assert data == post_data["file"].file.read() post_data["file"].file.close() # aiohttp < 4 doesn't autoclose files return web.Response() app = web.Application() app.router.add_route("POST", "/", handler) client = await aiohttp_client(app) with io.BytesIO(data) as file_handle: async with client.post("/", data={"file": file_handle}) as resp: assert 200 == resp.status async def test_post_data_stringio(aiohttp_client) -> None: data = "some buffer" async def handler(request): assert len(data) == request.content_length assert request.headers["CONTENT-TYPE"] == "text/plain; charset=utf-8" val = await request.text() assert data == val return web.Response() app = web.Application() app.router.add_route("POST", "/", handler) client = await aiohttp_client(app) async with client.post("/", data=io.StringIO(data)) as resp: assert 200 == resp.status async def test_post_data_textio_encoding(aiohttp_client) -> None: data = "текст" async def handler(request): assert request.headers["CONTENT-TYPE"] == "text/plain; charset=koi8-r" val = await request.text() assert data == val return web.Response() app = web.Application() app.router.add_route("POST", "/", handler) client = await aiohttp_client(app) pl = aiohttp.TextIOPayload(io.StringIO(data), encoding="koi8-r") async with client.post("/", data=pl) as resp: assert 200 == resp.status async def test_ssl_client( aiohttp_server, ssl_ctx, aiohttp_client, client_ssl_ctx, ) -> None: connector = aiohttp.TCPConnector(ssl=client_ssl_ctx) async def handler(request): return web.Response(text="Test message") app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app, ssl=ssl_ctx) client = await aiohttp_client(server, connector=connector) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert txt == "Test message" async def test_tcp_connector_fingerprint_ok( aiohttp_server, aiohttp_client, ssl_ctx, tls_certificate_fingerprint_sha256, ): tls_fingerprint = Fingerprint(tls_certificate_fingerprint_sha256) async def handler(request): return web.Response(text="Test message") connector = aiohttp.TCPConnector(ssl=tls_fingerprint) app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app, ssl=ssl_ctx) client = await aiohttp_client(server, connector=connector) async with client.get("/") as resp: assert resp.status == 200 async def test_tcp_connector_fingerprint_fail( aiohttp_server, aiohttp_client, ssl_ctx, tls_certificate_fingerprint_sha256, ): async def handler(request): return web.Response(text="Test message") bad_fingerprint = b"\x00" * len(tls_certificate_fingerprint_sha256) connector = aiohttp.TCPConnector(ssl=Fingerprint(bad_fingerprint)) app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app, ssl=ssl_ctx) client = await aiohttp_client(server, connector=connector) with pytest.raises(ServerFingerprintMismatch) as cm: await client.get("/") exc = cm.value assert exc.expected == bad_fingerprint assert exc.got == tls_certificate_fingerprint_sha256 async def test_format_task_get(aiohttp_server) -> None: loop = asyncio.get_event_loop() async def handler(request): return web.Response(body=b"OK") app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) client = aiohttp.ClientSession() task = loop.create_task(client.get(server.make_url("/"))) assert f"{task}".startswith(" None: async def handler(request): assert "q=t est" in request.rel_url.query_string return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) async with client.get("/", params="q=t+est") as resp: assert 200 == resp.status async def test_drop_params_on_redirect(aiohttp_client) -> None: async def handler_redirect(request): return web.Response(status=301, headers={"Location": "/ok?a=redirect"}) async def handler_ok(request): assert request.rel_url.query_string == "a=redirect" return web.Response(status=200) app = web.Application() app.router.add_route("GET", "/ok", handler_ok) app.router.add_route("GET", "/redirect", handler_redirect) client = await aiohttp_client(app) async with client.get("/redirect", params={"a": "initial"}) as resp: assert resp.status == 200 async def test_drop_fragment_on_redirect(aiohttp_client) -> None: async def handler_redirect(request): return web.Response(status=301, headers={"Location": "/ok#fragment"}) async def handler_ok(request): return web.Response(status=200) app = web.Application() app.router.add_route("GET", "/ok", handler_ok) app.router.add_route("GET", "/redirect", handler_redirect) client = await aiohttp_client(app) async with client.get("/redirect") as resp: assert resp.status == 200 assert resp.url.path == "/ok" async def test_drop_fragment(aiohttp_client) -> None: async def handler_ok(request): return web.Response(status=200) app = web.Application() app.router.add_route("GET", "/ok", handler_ok) client = await aiohttp_client(app) async with client.get("/ok#fragment") as resp: assert resp.status == 200 assert resp.url.path == "/ok" async def test_history(aiohttp_client) -> None: async def handler_redirect(request): return web.Response(status=301, headers={"Location": "/ok"}) async def handler_ok(request): return web.Response(status=200) app = web.Application() app.router.add_route("GET", "/ok", handler_ok) app.router.add_route("GET", "/redirect", handler_redirect) client = await aiohttp_client(app) async with client.get("/ok") as resp: assert len(resp.history) == 0 assert resp.status == 200 async with client.get("/redirect") as resp_redirect: assert len(resp_redirect.history) == 1 assert resp_redirect.history[0].status == 301 assert resp_redirect.status == 200 async def test_keepalive_closed_by_server(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body resp = web.Response(body=b"OK") resp.force_close() return resp app = web.Application() app.router.add_route("GET", "/", handler) connector = aiohttp.TCPConnector(limit=1) client = await aiohttp_client(app, connector=connector) resp1 = await client.get("/") val1 = await resp1.read() assert val1 == b"OK" resp2 = await client.get("/") val2 = await resp2.read() assert val2 == b"OK" assert 0 == len(client._session.connector._conns) async def test_wait_for(aiohttp_client) -> None: async def handler(request): return web.Response(body=b"OK") app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await asyncio.wait_for(client.get("/"), 10) assert resp.status == 200 txt = await resp.text() assert txt == "OK" async def test_raw_headers(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) async with client.get("/") as resp: assert resp.status == 200 raw_headers = tuple((bytes(h), bytes(v)) for h, v in resp.raw_headers) assert raw_headers == ( (b"Content-Length", b"0"), (b"Content-Type", b"application/octet-stream"), (b"Date", mock.ANY), (b"Server", mock.ANY), ) async def test_host_header_first(aiohttp_client) -> None: async def handler(request): assert list(request.headers)[0] == hdrs.HOST return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) async with client.get("/") as resp: assert resp.status == 200 async def test_empty_header_values(aiohttp_client) -> None: async def handler(request): resp = web.Response() resp.headers["X-Empty"] = "" return resp app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) async with client.get("/") as resp: assert resp.status == 200 raw_headers = tuple((bytes(h), bytes(v)) for h, v in resp.raw_headers) assert raw_headers == ( (b"X-Empty", b""), (b"Content-Length", b"0"), (b"Content-Type", b"application/octet-stream"), (b"Date", mock.ANY), (b"Server", mock.ANY), ) async def test_204_with_gzipped_content_encoding(aiohttp_client) -> None: async def handler(request): resp = web.StreamResponse(status=204) resp.content_length = 0 resp.content_type = "application/json" # resp.enable_compression(web.ContentCoding.gzip) resp.headers["Content-Encoding"] = "gzip" await resp.prepare(request) return resp app = web.Application() app.router.add_route("DELETE", "/", handler) client = await aiohttp_client(app) async with client.delete("/") as resp: assert resp.status == 204 assert resp.closed async def test_timeout_on_reading_headers(aiohttp_client, mocker) -> None: async def handler(request): resp = web.StreamResponse() await asyncio.sleep(0.1) await resp.prepare(request) return resp app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) with pytest.raises(asyncio.TimeoutError): await client.get("/", timeout=0.01) async def test_timeout_on_conn_reading_headers(aiohttp_client, mocker) -> None: # tests case where user did not set a connection timeout async def handler(request): resp = web.StreamResponse() await asyncio.sleep(0.1) await resp.prepare(request) return resp app = web.Application() app.router.add_route("GET", "/", handler) conn = aiohttp.TCPConnector() client = await aiohttp_client(app, connector=conn) with pytest.raises(asyncio.TimeoutError): await client.get("/", timeout=0.01) async def test_timeout_on_session_read_timeout(aiohttp_client, mocker) -> None: async def handler(request): resp = web.StreamResponse() await asyncio.sleep(0.1) await resp.prepare(request) return resp app = web.Application() app.router.add_route("GET", "/", handler) conn = aiohttp.TCPConnector() client = await aiohttp_client( app, connector=conn, timeout=aiohttp.ClientTimeout(sock_read=0.01) ) with pytest.raises(asyncio.TimeoutError): await client.get("/") async def test_read_timeout_between_chunks(aiohttp_client, mocker) -> None: async def handler(request): resp = aiohttp.web.StreamResponse() await resp.prepare(request) # write data 4 times, with pauses. Total time 2 seconds. for _ in range(4): await asyncio.sleep(0.5) await resp.write(b"data\n") return resp app = web.Application() app.add_routes([web.get("/", handler)]) # A timeout of 0.2 seconds should apply per read. timeout = aiohttp.ClientTimeout(sock_read=1) client = await aiohttp_client(app, timeout=timeout) res = b"" async with await client.get("/") as resp: res += await resp.read() assert res == b"data\n" * 4 async def test_read_timeout_on_reading_chunks(aiohttp_client, mocker) -> None: async def handler(request): resp = aiohttp.web.StreamResponse() await resp.prepare(request) await resp.write(b"data\n") await asyncio.sleep(1) await resp.write(b"data\n") return resp app = web.Application() app.add_routes([web.get("/", handler)]) # A timeout of 0.2 seconds should apply per read. timeout = aiohttp.ClientTimeout(sock_read=0.2) client = await aiohttp_client(app, timeout=timeout) async with await client.get("/") as resp: assert (await resp.content.read(5)) == b"data\n" with pytest.raises(asyncio.TimeoutError): await resp.content.read() async def test_read_timeout_on_write(aiohttp_client) -> None: async def gen_payload() -> AsyncIterator[str]: # Delay writing to ensure read timeout isn't triggered before writing completes. await asyncio.sleep(0.5) yield b"foo" async def handler(request: web.Request) -> web.Response: return web.Response(body=await request.read()) app = web.Application() app.router.add_put("/", handler) timeout = aiohttp.ClientTimeout(total=None, sock_read=0.1) client = await aiohttp_client(app) async with client.put("/", data=gen_payload(), timeout=timeout) as resp: result = await resp.read() # Should not trigger a read timeout. assert result == b"foo" async def test_timeout_on_reading_data(aiohttp_client, mocker) -> None: loop = asyncio.get_event_loop() fut = loop.create_future() async def handler(request): resp = web.StreamResponse(headers={"content-length": "100"}) await resp.prepare(request) fut.set_result(None) await asyncio.sleep(0.2) return resp app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/", timeout=1) await fut with pytest.raises(asyncio.TimeoutError): await resp.read() async def test_timeout_none(aiohttp_client, mocker) -> None: async def handler(request): resp = web.StreamResponse() await resp.prepare(request) return resp app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) async with client.get("/", timeout=None) as resp: assert resp.status == 200 async def test_readline_error_on_conn_close(aiohttp_client) -> None: loop = asyncio.get_event_loop() async def handler(request): resp_ = web.StreamResponse() await resp_.prepare(request) # make sure connection is closed by client. with pytest.raises(aiohttp.ServerDisconnectedError): for _ in range(10): await resp_.write(b"data\n") await asyncio.sleep(0.5) return resp_ app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_client(app) session = aiohttp.ClientSession() try: timer_started = False url, headers = server.make_url("/"), {"Connection": "Keep-alive"} resp = await session.get(url, headers=headers) with pytest.raises(aiohttp.ClientConnectionError): while True: data = await resp.content.readline() data = data.strip() if not data: break assert data == b"data" if not timer_started: def do_release(): loop.create_task(resp.release()) loop.call_later(1.0, do_release) timer_started = True finally: await session.close() async def test_no_error_on_conn_close_if_eof(aiohttp_client) -> None: async def handler(request): resp_ = web.StreamResponse() await resp_.prepare(request) await resp_.write(b"data\n") await asyncio.sleep(0.5) return resp_ app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_client(app) session = aiohttp.ClientSession() try: url, headers = server.make_url("/"), {"Connection": "Keep-alive"} resp = await session.get(url, headers=headers) while True: data = await resp.content.readline() data = data.strip() if not data: break assert data == b"data" assert resp.content.exception() is None finally: await session.close() async def test_error_not_overwrote_on_conn_close(aiohttp_client) -> None: async def handler(request): resp_ = web.StreamResponse() await resp_.prepare(request) return resp_ app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_client(app) session = aiohttp.ClientSession() try: url, headers = server.make_url("/"), {"Connection": "Keep-alive"} resp = await session.get(url, headers=headers) resp.content.set_exception(ValueError()) finally: await session.close() assert isinstance(resp.content.exception(), ValueError) async def test_HTTP_200_OK_METHOD(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) app = web.Application() for meth in ("get", "post", "put", "delete", "head", "patch", "options"): app.router.add_route(meth.upper(), "/", handler) client = await aiohttp_client(app) for meth in ("get", "post", "put", "delete", "head", "patch", "options"): resp = await client.request(meth, "/") assert resp.status == 200 assert len(resp.history) == 0 content1 = await resp.read() content2 = await resp.read() assert content1 == content2 content = await resp.text() if meth == "head": assert b"" == content1 else: assert meth.upper() == content async def test_HTTP_200_OK_METHOD_connector(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) conn = aiohttp.TCPConnector() conn.clear_dns_cache() app = web.Application() for meth in ("get", "post", "put", "delete", "head"): app.router.add_route(meth.upper(), "/", handler) client = await aiohttp_client(app, connector=conn) for meth in ("get", "post", "put", "delete", "head"): resp = await client.request(meth, "/") content1 = await resp.read() content2 = await resp.read() assert content1 == content2 content = await resp.text() assert resp.status == 200 if meth == "head": assert b"" == content1 else: assert meth.upper() == content async def test_HTTP_302_REDIRECT_GET(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) async def redirect(request): raise web.HTTPFound(location="/") app = web.Application() app.router.add_get("/", handler) app.router.add_get("/redirect", redirect) client = await aiohttp_client(app) async with client.get("/redirect") as resp: assert 200 == resp.status assert 1 == len(resp.history) async def test_HTTP_302_REDIRECT_HEAD(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) async def redirect(request): raise web.HTTPFound(location="/") app = web.Application() app.router.add_get("/", handler) app.router.add_get("/redirect", redirect) app.router.add_head("/", handler) app.router.add_head("/redirect", redirect) client = await aiohttp_client(app) async with client.request("head", "/redirect") as resp: assert 200 == resp.status assert 1 == len(resp.history) assert resp.method == "HEAD" async def test_HTTP_302_REDIRECT_NON_HTTP(aiohttp_client) -> None: async def redirect(request): raise web.HTTPFound(location="ftp://127.0.0.1/test/") app = web.Application() app.router.add_get("/redirect", redirect) client = await aiohttp_client(app) with pytest.raises(ValueError): await client.get("/redirect") async def test_HTTP_302_REDIRECT_POST(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) async def redirect(request): raise web.HTTPFound(location="/") app = web.Application() app.router.add_get("/", handler) app.router.add_post("/redirect", redirect) client = await aiohttp_client(app) resp = await client.post("/redirect") assert 200 == resp.status assert 1 == len(resp.history) txt = await resp.text() assert txt == "GET" resp.close() async def test_HTTP_302_REDIRECT_POST_with_content_length_hdr(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) async def redirect(request): await request.read() raise web.HTTPFound(location="/") data = json.dumps({"some": "data"}) app = web.Application() app.router.add_get("/", handler) app.router.add_post("/redirect", redirect) client = await aiohttp_client(app) resp = await client.post( "/redirect", data=data, headers={"Content-Length": str(len(data))} ) assert 200 == resp.status assert 1 == len(resp.history) txt = await resp.text() assert txt == "GET" resp.close() async def test_HTTP_307_REDIRECT_POST(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) async def redirect(request): await request.read() raise web.HTTPTemporaryRedirect(location="/") app = web.Application() app.router.add_post("/", handler) app.router.add_post("/redirect", redirect) client = await aiohttp_client(app) resp = await client.post("/redirect", data={"some": "data"}) assert 200 == resp.status assert 1 == len(resp.history) txt = await resp.text() assert txt == "POST" resp.close() async def test_HTTP_308_PERMANENT_REDIRECT_POST(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) async def redirect(request): await request.read() raise web.HTTPPermanentRedirect(location="/") app = web.Application() app.router.add_post("/", handler) app.router.add_post("/redirect", redirect) client = await aiohttp_client(app) resp = await client.post("/redirect", data={"some": "data"}) assert 200 == resp.status assert 1 == len(resp.history) txt = await resp.text() assert txt == "POST" resp.close() async def test_HTTP_302_max_redirects(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) async def redirect(request): count = int(request.match_info["count"]) if count: raise web.HTTPFound(location=f"/redirect/{count - 1}") else: raise web.HTTPFound(location="/") app = web.Application() app.router.add_get("/", handler) app.router.add_get(r"/redirect/{count:\d+}", redirect) client = await aiohttp_client(app) with pytest.raises(TooManyRedirects) as ctx: await client.get("/redirect/5", max_redirects=2) assert 2 == len(ctx.value.history) assert ctx.value.request_info.url.path == "/redirect/5" assert ctx.value.request_info.method == "GET" async def test_HTTP_200_GET_WITH_PARAMS(aiohttp_client) -> None: async def handler(request): return web.Response( text="&".join(k + "=" + v for k, v in request.query.items()) ) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/", params={"q": "test"}) assert 200 == resp.status txt = await resp.text() assert txt == "q=test" resp.close() async def test_HTTP_200_GET_WITH_MultiDict_PARAMS(aiohttp_client) -> None: async def handler(request): return web.Response( text="&".join(k + "=" + v for k, v in request.query.items()) ) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/", params=MultiDict([("q", "test"), ("q", "test2")])) assert 200 == resp.status txt = await resp.text() assert txt == "q=test&q=test2" resp.close() async def test_HTTP_200_GET_WITH_MIXED_PARAMS(aiohttp_client) -> None: async def handler(request): return web.Response( text="&".join(k + "=" + v for k, v in request.query.items()) ) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/?test=true", params={"q": "test"}) assert 200 == resp.status txt = await resp.text() assert txt == "test=true&q=test" resp.close() async def test_POST_DATA(aiohttp_client) -> None: async def handler(request): data = await request.post() return web.json_response(dict(data)) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data={"some": "data"}) assert 200 == resp.status content = await resp.json() assert content == {"some": "data"} resp.close() async def test_POST_DATA_with_explicit_formdata(aiohttp_client) -> None: async def handler(request): data = await request.post() return web.json_response(dict(data)) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) form = aiohttp.FormData() form.add_field("name", "text") resp = await client.post("/", data=form) assert 200 == resp.status content = await resp.json() assert content == {"name": "text"} resp.close() async def test_POST_DATA_with_charset(aiohttp_client) -> None: async def handler(request): mp = await request.multipart() part = await mp.next() text = await part.text() return web.Response(text=text) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) form = aiohttp.FormData() form.add_field("name", "текст", content_type="text/plain; charset=koi8-r") resp = await client.post("/", data=form) assert 200 == resp.status content = await resp.text() assert content == "текст" resp.close() async def test_POST_DATA_formdats_with_charset(aiohttp_client) -> None: async def handler(request): mp = await request.post() assert "name" in mp return web.Response(text=mp["name"]) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) form = aiohttp.FormData(charset="koi8-r") form.add_field("name", "текст") resp = await client.post("/", data=form) assert 200 == resp.status content = await resp.text() assert content == "текст" resp.close() async def test_POST_DATA_with_charset_post(aiohttp_client) -> None: async def handler(request): data = await request.post() return web.Response(text=data["name"]) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) form = aiohttp.FormData() form.add_field("name", "текст", content_type="text/plain; charset=koi8-r") resp = await client.post("/", data=form) assert 200 == resp.status content = await resp.text() assert content == "текст" resp.close() async def test_POST_MultiDict(aiohttp_client) -> None: async def handler(request): data = await request.post() assert data == MultiDict([("q", "test1"), ("q", "test2")]) return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) async with client.post( "/", data=MultiDict([("q", "test1"), ("q", "test2")]) ) as resp: assert 200 == resp.status async def test_POST_DATA_DEFLATE(aiohttp_client) -> None: async def handler(request): data = await request.post() return web.json_response(dict(data)) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data={"some": "data"}, compress=True) assert 200 == resp.status content = await resp.json() assert content == {"some": "data"} resp.close() async def test_POST_FILES(aiohttp_client, fname) -> None: async def handler(request): data = await request.post() assert data["some"].filename == fname.name with fname.open("rb") as f: content1 = f.read() content2 = data["some"].file.read() assert content1 == content2 assert data["test"].file.read() == b"data" data["some"].file.close() data["test"].file.close() return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: async with client.post( "/", data={"some": f, "test": io.BytesIO(b"data")}, chunked=True ) as resp: assert 200 == resp.status async def test_POST_FILES_DEFLATE(aiohttp_client, fname) -> None: async def handler(request): data = await request.post() assert data["some"].filename == fname.name with fname.open("rb") as f: content1 = f.read() content2 = data["some"].file.read() data["some"].file.close() assert content1 == content2 return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: async with client.post( "/", data={"some": f}, chunked=True, compress="deflate" ) as resp: assert 200 == resp.status async def test_POST_bytes(aiohttp_client) -> None: body = b"0" * 12345 async def handler(request): data = await request.read() assert body == data return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) async with client.post("/", data=body) as resp: assert 200 == resp.status async def test_POST_bytes_too_large(aiohttp_client) -> None: body = b"0" * (2**20 + 1) async def handler(request): data = await request.content.read() assert body == data return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with pytest.warns(ResourceWarning): resp = await client.post("/", data=body) assert 200 == resp.status resp.close() async def test_POST_FILES_STR(aiohttp_client, fname) -> None: async def handler(request): data = await request.post() with fname.open("rb") as f: content1 = f.read().decode() content2 = data["some"] assert content1 == content2 return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: async with client.post("/", data={"some": f.read().decode()}) as resp: assert 200 == resp.status async def test_POST_FILES_STR_SIMPLE(aiohttp_client, fname) -> None: async def handler(request): data = await request.read() with fname.open("rb") as f: content = f.read() assert content == data return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: async with client.post("/", data=f.read()) as resp: assert 200 == resp.status async def test_POST_FILES_LIST(aiohttp_client, fname) -> None: async def handler(request): data = await request.post() assert fname.name == data["some"].filename with fname.open("rb") as f: content = f.read() assert content == data["some"].file.read() data["some"].file.close() return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: async with client.post("/", data=[("some", f)]) as resp: assert 200 == resp.status async def test_POST_FILES_CT(aiohttp_client, fname) -> None: async def handler(request): data = await request.post() assert fname.name == data["some"].filename assert "text/plain" == data["some"].content_type with fname.open("rb") as f: content = f.read() assert content == data["some"].file.read() data["some"].file.close() return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: form = aiohttp.FormData() form.add_field("some", f, content_type="text/plain") async with client.post("/", data=form) as resp: assert 200 == resp.status async def test_POST_FILES_SINGLE(aiohttp_client, fname) -> None: async def handler(request): data = await request.text() with fname.open("rb") as f: content = f.read().decode() assert content == data # if system cannot determine 'text/x-python' MIME type # then use 'application/octet-stream' default assert request.content_type in [ "text/plain", "application/octet-stream", "text/x-python", ] assert "content-disposition" not in request.headers return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: async with client.post("/", data=f) as resp: assert 200 == resp.status async def test_POST_FILES_SINGLE_content_disposition(aiohttp_client, fname) -> None: async def handler(request): data = await request.text() with fname.open("rb") as f: content = f.read().decode() assert content == data # if system cannot determine 'application/pgp-keys' MIME type # then use 'application/octet-stream' default assert request.content_type in [ "text/plain", "application/octet-stream", "text/x-python", ] assert request.headers["content-disposition"] == ( 'inline; filename="conftest.py"' ) return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: async with client.post( "/", data=aiohttp.get_payload(f, disposition="inline") ) as resp: assert 200 == resp.status async def test_POST_FILES_SINGLE_BINARY(aiohttp_client, fname) -> None: async def handler(request): data = await request.read() with fname.open("rb") as f: content = f.read() assert content == data # if system cannot determine 'application/pgp-keys' MIME type # then use 'application/octet-stream' default assert request.content_type in [ "application/pgp-keys", "text/plain", "text/x-python", "application/octet-stream", ] return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: async with client.post("/", data=f) as resp: assert 200 == resp.status async def test_POST_FILES_IO(aiohttp_client) -> None: async def handler(request): data = await request.post() assert b"data" == data["unknown"].file.read() assert data["unknown"].content_type == "application/octet-stream" assert data["unknown"].filename == "unknown" data["unknown"].file.close() return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with io.BytesIO(b"data") as file_handle: async with client.post("/", data=[file_handle]) as resp: assert 200 == resp.status async def test_POST_FILES_IO_WITH_PARAMS(aiohttp_client) -> None: async def handler(request): data = await request.post() assert data["test"] == "true" assert data["unknown"].content_type == "application/octet-stream" assert data["unknown"].filename == "unknown" assert data["unknown"].file.read() == b"data" data["unknown"].file.close() assert data.getall("q") == ["t1", "t2"] return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with io.BytesIO(b"data") as file_handle: async with client.post( "/", data=(("test", "true"), MultiDict([("q", "t1"), ("q", "t2")]), file_handle), ) as resp: assert 200 == resp.status async def test_POST_FILES_WITH_DATA(aiohttp_client, fname) -> None: async def handler(request): data = await request.post() assert data["test"] == "true" assert data["some"].content_type in [ "text/x-python", "text/plain", "application/octet-stream", ] assert data["some"].filename == fname.name with fname.open("rb") as f: assert data["some"].file.read() == f.read() data["some"].file.close() return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: async with client.post("/", data={"test": "true", "some": f}) as resp: assert 200 == resp.status async def test_POST_STREAM_DATA(aiohttp_client, fname) -> None: async def handler(request): assert request.content_type == "application/octet-stream" content = await request.read() with fname.open("rb") as f: expected = f.read() assert request.content_length == len(expected) assert content == expected return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: data_size = len(f.read()) with pytest.warns(DeprecationWarning): @aiohttp.streamer async def stream(writer, fname): with fname.open("rb") as f: data = f.read(100) while data: await writer.write(data) data = f.read(100) async with client.post( "/", data=stream(fname), headers={"Content-Length": str(data_size)} ) as resp: assert 200 == resp.status async def test_POST_STREAM_DATA_no_params(aiohttp_client, fname) -> None: async def handler(request): assert request.content_type == "application/octet-stream" content = await request.read() with fname.open("rb") as f: expected = f.read() assert request.content_length == len(expected) assert content == expected return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: data_size = len(f.read()) with pytest.warns(DeprecationWarning): @aiohttp.streamer async def stream(writer): with fname.open("rb") as f: data = f.read(100) while data: await writer.write(data) data = f.read(100) async with client.post( "/", data=stream, headers={"Content-Length": str(data_size)} ) as resp: assert 200 == resp.status async def test_json(aiohttp_client) -> None: async def handler(request): assert request.content_type == "application/json" data = await request.json() return web.Response(body=aiohttp.JsonPayload(data)) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", json={"some": "data"}) assert 200 == resp.status content = await resp.json() assert content == {"some": "data"} resp.close() with pytest.raises(ValueError): await client.post("/", data="some data", json={"some": "data"}) async def test_json_custom(aiohttp_client) -> None: async def handler(request): assert request.content_type == "application/json" data = await request.json() return web.Response(body=aiohttp.JsonPayload(data)) used = False def dumps(obj): nonlocal used used = True return json.dumps(obj) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app, json_serialize=dumps) resp = await client.post("/", json={"some": "data"}) assert 200 == resp.status assert used content = await resp.json() assert content == {"some": "data"} resp.close() with pytest.raises(ValueError): await client.post("/", data="some data", json={"some": "data"}) async def test_expect_continue(aiohttp_client) -> None: expect_called = False async def handler(request): data = await request.post() assert data == {"some": "data"} return web.Response() async def expect_handler(request): nonlocal expect_called expect = request.headers.get(hdrs.EXPECT) if expect.lower() == "100-continue": request.transport.write(b"HTTP/1.1 100 Continue\r\n\r\n") expect_called = True app = web.Application() app.router.add_post("/", handler, expect_handler=expect_handler) client = await aiohttp_client(app) async with client.post("/", data={"some": "data"}, expect100=True) as resp: assert 200 == resp.status assert expect_called async def test_encoding_deflate(aiohttp_client) -> None: async def handler(request): resp = web.Response(text="text") resp.enable_chunked_encoding() resp.enable_compression(web.ContentCoding.deflate) return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert txt == "text" resp.close() async def test_encoding_deflate_nochunk(aiohttp_client) -> None: async def handler(request): resp = web.Response(text="text") resp.enable_compression(web.ContentCoding.deflate) return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert txt == "text" resp.close() async def test_encoding_gzip(aiohttp_client) -> None: async def handler(request): resp = web.Response(text="text") resp.enable_chunked_encoding() resp.enable_compression(web.ContentCoding.gzip) return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert txt == "text" resp.close() async def test_encoding_gzip_write_by_chunks(aiohttp_client) -> None: async def handler(request): resp = web.StreamResponse() resp.enable_compression(web.ContentCoding.gzip) await resp.prepare(request) await resp.write(b"0") await resp.write(b"0") return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert txt == "00" resp.close() async def test_encoding_gzip_nochunk(aiohttp_client) -> None: async def handler(request): resp = web.Response(text="text") resp.enable_compression(web.ContentCoding.gzip) return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert txt == "text" resp.close() async def test_bad_payload_compression(aiohttp_client) -> None: async def handler(request): resp = web.Response(text="text") resp.headers["Content-Encoding"] = "gzip" return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status with pytest.raises(aiohttp.ClientPayloadError): await resp.read() resp.close() async def test_bad_payload_chunked_encoding(aiohttp_client) -> None: async def handler(request): resp = web.StreamResponse() resp.force_close() resp._length_check = False resp.headers["Transfer-Encoding"] = "chunked" writer = await resp.prepare(request) await writer.write(b"9\r\n\r\n") await writer.write_eof() return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status with pytest.raises(aiohttp.ClientPayloadError): await resp.read() resp.close() async def test_no_payload_304_with_chunked_encoding(aiohttp_client: Any) -> None: """Test a 304 response with no payload with chunked set should have it removed.""" async def handler(request): resp = web.StreamResponse(status=304) resp.enable_chunked_encoding() resp._length_check = False resp.headers["Transfer-Encoding"] = "chunked" writer = await resp.prepare(request) await writer.write_eof() return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 304 assert hdrs.CONTENT_LENGTH not in resp.headers assert hdrs.TRANSFER_ENCODING not in resp.headers await resp.read() resp.close() async def test_head_request_with_chunked_encoding(aiohttp_client: Any) -> None: """Test a head response with chunked set should have it removed.""" async def handler(request): resp = web.StreamResponse(status=200) resp.enable_chunked_encoding() resp._length_check = False resp.headers["Transfer-Encoding"] = "chunked" writer = await resp.prepare(request) await writer.write_eof() return resp app = web.Application() app.router.add_head("/", handler) client = await aiohttp_client(app) resp = await client.head("/") assert resp.status == 200 assert hdrs.CONTENT_LENGTH not in resp.headers assert hdrs.TRANSFER_ENCODING not in resp.headers await resp.read() resp.close() async def test_no_payload_200_with_chunked_encoding(aiohttp_client: Any) -> None: """Test chunked is preserved on a 200 response with no payload.""" async def handler(request): resp = web.StreamResponse(status=200) resp.enable_chunked_encoding() resp._length_check = False resp.headers["Transfer-Encoding"] = "chunked" writer = await resp.prepare(request) await writer.write_eof() return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 assert hdrs.CONTENT_LENGTH not in resp.headers assert hdrs.TRANSFER_ENCODING in resp.headers await resp.read() resp.close() async def test_bad_payload_content_length(aiohttp_client: Any) -> None: async def handler(request): resp = web.Response(text="text") resp.headers["Content-Length"] = "10000" resp.force_close() return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status with pytest.raises(aiohttp.ClientPayloadError): await resp.read() resp.close() async def test_payload_content_length_by_chunks(aiohttp_client) -> None: async def handler(request): resp = web.StreamResponse(headers={"content-length": "2"}) await resp.prepare(request) await resp.write(b"answer") await resp.write(b"two") request.transport.close() return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") data = await resp.read() assert data == b"an" resp.close() async def test_chunked(aiohttp_client) -> None: async def handler(request): resp = web.Response(text="text") resp.enable_chunked_encoding() return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status assert resp.headers["Transfer-Encoding"] == "chunked" txt = await resp.text() assert txt == "text" resp.close() async def test_shortcuts(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) app = web.Application() for meth in ("get", "post", "put", "delete", "head", "patch", "options"): app.router.add_route(meth.upper(), "/", handler) client = await aiohttp_client(app) for meth in ("get", "post", "put", "delete", "head", "patch", "options"): coro = getattr(client.session, meth) resp = await coro(client.make_url("/")) assert resp.status == 200 assert len(resp.history) == 0 content1 = await resp.read() content2 = await resp.read() assert content1 == content2 content = await resp.text() if meth == "head": assert b"" == content1 else: assert meth.upper() == content async def test_cookies(aiohttp_client) -> None: async def handler(request): assert request.cookies.keys() == {"test1", "test3"} assert request.cookies["test1"] == "123" assert request.cookies["test3"] == "456" return web.Response() c = http.cookies.Morsel() c.set("test3", "456", "456") app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, cookies={"test1": "123", "test2": c}) async with client.get("/") as resp: assert 200 == resp.status async def test_cookies_per_request(aiohttp_client) -> None: async def handler(request): assert request.cookies.keys() == {"test1", "test3", "test4", "test6"} assert request.cookies["test1"] == "123" assert request.cookies["test3"] == "456" assert request.cookies["test4"] == "789" assert request.cookies["test6"] == "abc" return web.Response() c = http.cookies.Morsel() c.set("test3", "456", "456") app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, cookies={"test1": "123", "test2": c}) rc = http.cookies.Morsel() rc.set("test6", "abc", "abc") async with client.get("/", cookies={"test4": "789", "test5": rc}) as resp: assert 200 == resp.status async def test_cookies_redirect(aiohttp_client) -> None: async def redirect1(request): ret = web.Response(status=301, headers={"Location": "/redirect2"}) ret.set_cookie("c", "1") return ret async def redirect2(request): ret = web.Response(status=301, headers={"Location": "/"}) ret.set_cookie("c", "2") return ret async def handler(request): assert request.cookies.keys() == {"c"} assert request.cookies["c"] == "2" return web.Response() app = web.Application() app.router.add_get("/redirect1", redirect1) app.router.add_get("/redirect2", redirect2) app.router.add_get("/", handler) client = await aiohttp_client(app) async with client.get("/redirect1") as resp: assert 200 == resp.status async def test_cookies_on_empty_session_jar(aiohttp_client) -> None: async def handler(request): assert "custom-cookie" in request.cookies assert request.cookies["custom-cookie"] == "abc" return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, cookies=None) async with client.get("/", cookies={"custom-cookie": "abc"}) as resp: assert 200 == resp.status async def test_morsel_with_attributes(aiohttp_client) -> None: # A comment from original test: # # No cookie attribute should pass here # they are only used as filters # whether to send particular cookie or not. # E.g. if cookie expires it just becomes thrown away. # Server who sent the cookie with some attributes # already knows them, no need to send this back again and again async def handler(request): assert request.cookies.keys() == {"test3"} assert request.cookies["test3"] == "456" return web.Response() c = http.cookies.Morsel() c.set("test3", "456", "456") c["httponly"] = True c["secure"] = True c["max-age"] = 1000 app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, cookies={"test2": c}) async with client.get("/") as resp: assert 200 == resp.status async def test_set_cookies(aiohttp_client) -> None: async def handler(request): ret = web.Response() ret.set_cookie("c1", "cookie1") ret.set_cookie("c2", "cookie2") ret.headers.add( "Set-Cookie", "ISAWPLB{A7F52349-3531-4DA9-8776-F74BC6F4F1BB}=" "{925EC0B8-CB17-4BEB-8A35-1033813B0523}; " "HttpOnly; Path=/", ) return ret app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) with mock.patch("aiohttp.client_reqrep.client_logger") as m_log: async with client.get("/") as resp: assert 200 == resp.status cookie_names = {c.key for c in client.session.cookie_jar} assert cookie_names == {"c1", "c2"} m_log.warning.assert_called_with("Can not load response cookies: %s", mock.ANY) async def test_set_cookies_expired(aiohttp_client) -> None: async def handler(request): ret = web.Response() ret.set_cookie("c1", "cookie1") ret.set_cookie("c2", "cookie2") ret.headers.add( "Set-Cookie", "c3=cookie3; " "HttpOnly; Path=/" " Expires=Tue, 1 Jan 1980 12:00:00 GMT; ", ) return ret app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) async with client.get("/") as resp: assert 200 == resp.status cookie_names = {c.key for c in client.session.cookie_jar} assert cookie_names == {"c1", "c2"} async def test_set_cookies_max_age(aiohttp_client) -> None: async def handler(request): ret = web.Response() ret.set_cookie("c1", "cookie1") ret.set_cookie("c2", "cookie2") ret.headers.add("Set-Cookie", "c3=cookie3; " "HttpOnly; Path=/" " Max-Age=1; ") return ret app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) async with client.get("/") as resp: assert 200 == resp.status cookie_names = {c.key for c in client.session.cookie_jar} assert cookie_names == {"c1", "c2", "c3"} await asyncio.sleep(2) cookie_names = {c.key for c in client.session.cookie_jar} assert cookie_names == {"c1", "c2"} async def test_set_cookies_max_age_overflow(aiohttp_client) -> None: async def handler(request): ret = web.Response() ret.headers.add( "Set-Cookie", "overflow=overflow; " "HttpOnly; Path=/" " Max-Age=" + str(overflow) + "; ", ) return ret overflow = int( datetime.datetime.max.replace(tzinfo=datetime.timezone.utc).timestamp() ) empty = None try: empty = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta( seconds=overflow ) except OverflowError as ex: assert isinstance(ex, OverflowError) assert not isinstance(empty, datetime.datetime) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) async with client.get("/") as resp: assert 200 == resp.status for cookie in client.session.cookie_jar: if cookie.key == "overflow": assert int(cookie["max-age"]) == int(overflow) async def test_request_conn_error() -> None: client = aiohttp.ClientSession() with pytest.raises(aiohttp.ClientConnectionError): await client.get("http://0.0.0.0:1") await client.close() @pytest.mark.xfail async def test_broken_connection(aiohttp_client) -> None: async def handler(request): request.transport.close() return web.Response(text="answer" * 1000) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) with pytest.raises(aiohttp.ClientResponseError): await client.get("/") async def test_broken_connection_2(aiohttp_client) -> None: async def handler(request): resp = web.StreamResponse(headers={"content-length": "1000"}) await resp.prepare(request) await resp.write(b"answer") request.transport.close() return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") with pytest.raises(aiohttp.ClientPayloadError): await resp.read() resp.close() async def test_custom_headers(aiohttp_client) -> None: async def handler(request): assert request.headers["x-api-key"] == "foo" return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) async with client.post( "/", headers={"Content-Type": "application/json", "x-api-key": "foo"} ) as resp: assert resp.status == 200 async def test_redirect_to_absolute_url(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) async def redirect(request): raise web.HTTPFound(location=client.make_url("/")) app = web.Application() app.router.add_get("/", handler) app.router.add_get("/redirect", redirect) client = await aiohttp_client(app) async with client.get("/redirect") as resp: assert 200 == resp.status async def test_redirect_without_location_header(aiohttp_client) -> None: body = b"redirect" async def handler_redirect(request): return web.Response(status=301, body=body) app = web.Application() app.router.add_route("GET", "/redirect", handler_redirect) client = await aiohttp_client(app) resp = await client.get("/redirect") data = await resp.read() assert data == body async def test_chunked_deprecated(aiohttp_client) -> None: async def handler_redirect(request): return web.Response(status=301) app = web.Application() app.router.add_route("GET", "/redirect", handler_redirect) client = await aiohttp_client(app) with pytest.warns(DeprecationWarning): await client.post("/", chunked=1024) @pytest.mark.parametrize( ("status", "expected_ok"), ( (200, True), (201, True), (301, True), (400, False), (403, False), (500, False), ), ) async def test_ok_from_status(aiohttp_client, status, expected_ok) -> None: async def handler(request): return web.Response(status=status, body=b"") app = web.Application() app.router.add_route("GET", "/endpoint", handler) client = await aiohttp_client(app, raise_for_status=False) async with client.get("/endpoint") as resp: assert resp.ok is expected_ok async def test_raise_for_status(aiohttp_client) -> None: async def handler_redirect(request): raise web.HTTPBadRequest() app = web.Application() app.router.add_route("GET", "/", handler_redirect) client = await aiohttp_client(app, raise_for_status=True) with pytest.raises(aiohttp.ClientResponseError): await client.get("/") async def test_raise_for_status_per_request(aiohttp_client) -> None: async def handler_redirect(request): raise web.HTTPBadRequest() app = web.Application() app.router.add_route("GET", "/", handler_redirect) client = await aiohttp_client(app) with pytest.raises(aiohttp.ClientResponseError): await client.get("/", raise_for_status=True) async def test_raise_for_status_disable_per_request(aiohttp_client) -> None: async def handler_redirect(request): raise web.HTTPBadRequest() app = web.Application() app.router.add_route("GET", "/", handler_redirect) client = await aiohttp_client(app, raise_for_status=True) async with client.get("/", raise_for_status=False) as resp: assert 400 == resp.status async def test_request_raise_for_status_default(aiohttp_server) -> None: async def handler(request): raise web.HTTPBadRequest() app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app) async with aiohttp.request("GET", server.make_url("/")) as resp: assert resp.status == 400 async def test_request_raise_for_status_disabled(aiohttp_server) -> None: async def handler(request): raise web.HTTPBadRequest() app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app) url = server.make_url("/") async with aiohttp.request("GET", url, raise_for_status=False) as resp: assert resp.status == 400 async def test_request_raise_for_status_enabled(aiohttp_server) -> None: async def handler(request): raise web.HTTPBadRequest() app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app) url = server.make_url("/") with pytest.raises(aiohttp.ClientResponseError): async with aiohttp.request("GET", url, raise_for_status=True): assert False, "never executed" # pragma: no cover async def test_session_raise_for_status_coro(aiohttp_client) -> None: async def handle(request): return web.Response(text="ok") app = web.Application() app.router.add_route("GET", "/", handle) raise_for_status_called = 0 async def custom_r4s(response): nonlocal raise_for_status_called raise_for_status_called += 1 assert response.status == 200 assert response.request_info.method == "GET" client = await aiohttp_client(app, raise_for_status=custom_r4s) await client.get("/") assert raise_for_status_called == 1 await client.get("/", raise_for_status=True) assert raise_for_status_called == 1 # custom_r4s not called again await client.get("/", raise_for_status=False) assert raise_for_status_called == 1 # custom_r4s not called again async def test_request_raise_for_status_coro(aiohttp_client) -> None: async def handle(request): return web.Response(text="ok") app = web.Application() app.router.add_route("GET", "/", handle) raise_for_status_called = 0 async def custom_r4s(response): nonlocal raise_for_status_called raise_for_status_called += 1 assert response.status == 200 assert response.request_info.method == "GET" client = await aiohttp_client(app) await client.get("/", raise_for_status=custom_r4s) assert raise_for_status_called == 1 await client.get("/", raise_for_status=True) assert raise_for_status_called == 1 # custom_r4s not called again await client.get("/", raise_for_status=False) assert raise_for_status_called == 1 # custom_r4s not called again async def test_invalid_idna() -> None: session = aiohttp.ClientSession() try: with pytest.raises(aiohttp.InvalidURL): await session.get("http://\u2061owhefopw.com") finally: await session.close() async def test_creds_in_auth_and_url() -> None: session = aiohttp.ClientSession() try: with pytest.raises(ValueError): await session.get( "http://user:pass@example.com", auth=aiohttp.BasicAuth("user2", "pass2") ) finally: await session.close() @pytest.fixture def create_server_for_url_and_handler(aiohttp_server, tls_certificate_authority): def create(url, srv): app = web.Application() app.router.add_route("GET", url.path, srv) kwargs = {} if url.scheme == "https": cert = tls_certificate_authority.issue_cert( url.host, "localhost", "127.0.0.1" ) ssl_ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) cert.configure_cert(ssl_ctx) kwargs["ssl"] = ssl_ctx return aiohttp_server(app, **kwargs) return create @pytest.mark.parametrize( ["url_from", "url_to"], [ ["http://host1.com/path1", "http://host2.com/path2"], ["http://host1.com/path1", "https://host1.com/path1"], ["https://host1.com/path1", "http://host1.com/path2"], ], ids=( "entirely different hosts", "http -> https", "https -> http", ), ) async def test_drop_auth_on_redirect_to_other_host( create_server_for_url_and_handler, url_from, url_to, ) -> None: url_from, url_to = URL(url_from), URL(url_to) async def srv_from(request): assert request.host == url_from.host assert request.headers["Authorization"] == "Basic dXNlcjpwYXNz" raise web.HTTPFound(url_to) async def srv_to(request): assert request.host == url_to.host assert "Authorization" not in request.headers, "Header wasn't dropped" return web.Response() server_from = await create_server_for_url_and_handler(url_from, srv_from) server_to = await create_server_for_url_and_handler(url_to, srv_to) assert ( url_from.host != url_to.host or server_from.scheme != server_to.scheme ), "Invalid test case, host or scheme must differ" protocol_port_map = { "http": 80, "https": 443, } etc_hosts = { (url_from.host, protocol_port_map[server_from.scheme]): server_from, (url_to.host, protocol_port_map[server_to.scheme]): server_to, } class FakeResolver(AbstractResolver): async def resolve(self, host, port=0, family=socket.AF_INET): server = etc_hosts[(host, port)] return [ { "hostname": host, "host": server.host, "port": server.port, "family": socket.AF_INET, "proto": 0, "flags": socket.AI_NUMERICHOST, } ] async def close(self): pass connector = aiohttp.TCPConnector(resolver=FakeResolver(), ssl=False) async with aiohttp.ClientSession(connector=connector) as client: resp = await client.get( url_from, auth=aiohttp.BasicAuth("user", "pass"), ) assert resp.status == 200 resp = await client.get( url_from, headers={"Authorization": "Basic dXNlcjpwYXNz"}, ) assert resp.status == 200 async def test_async_with_session() -> None: async with aiohttp.ClientSession() as session: pass assert session.closed async def test_session_close_awaitable() -> None: session = aiohttp.ClientSession() await session.close() assert session.closed async def test_close_resp_on_error_async_with_session(aiohttp_server) -> None: async def handler(request): resp = web.StreamResponse(headers={"content-length": "100"}) await resp.prepare(request) await asyncio.sleep(0.1) return resp app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as session: with pytest.raises(RuntimeError): async with session.get(server.make_url("/")) as resp: resp.content.set_exception(RuntimeError()) await resp.read() assert len(session._connector._conns) == 0 async def test_release_resp_on_normal_exit_from_cm(aiohttp_server) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as session: async with session.get(server.make_url("/")) as resp: await resp.read() assert len(session._connector._conns) == 1 async def test_non_close_detached_session_on_error_cm(aiohttp_server) -> None: async def handler(request): resp = web.StreamResponse(headers={"content-length": "100"}) await resp.prepare(request) await asyncio.sleep(0.1) return resp app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app) session = aiohttp.ClientSession() cm = session.get(server.make_url("/")) assert not session.closed with pytest.raises(RuntimeError): async with cm as resp: resp.content.set_exception(RuntimeError()) await resp.read() assert not session.closed async def test_close_detached_session_on_non_existing_addr() -> None: class FakeResolver(AbstractResolver): async def resolve(host, port=0, family=socket.AF_INET): return {} async def close(self): pass connector = aiohttp.TCPConnector(resolver=FakeResolver()) session = aiohttp.ClientSession(connector=connector) async with session: cm = session.get("http://non-existing.example.com") assert not session.closed with pytest.raises(Exception): await cm assert session.closed async def test_aiohttp_request_context_manager(aiohttp_server) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app) async with aiohttp.request("GET", server.make_url("/")) as resp: await resp.read() assert resp.status == 200 async def test_aiohttp_request_ctx_manager_close_sess_on_error( ssl_ctx, aiohttp_server ) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app, ssl=ssl_ctx) cm = aiohttp.request("GET", server.make_url("/")) with pytest.raises(aiohttp.ClientConnectionError): async with cm: pass assert cm._session.closed async def test_aiohttp_request_ctx_manager_not_found() -> None: with pytest.raises(aiohttp.ClientConnectionError): async with aiohttp.request("GET", "http://wrong-dns-name.com"): assert False, "never executed" # pragma: no cover async def test_yield_from_in_session_request(aiohttp_client) -> None: # a test for backward compatibility with yield from syntax async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) async with client.get("/") as resp: assert resp.status == 200 async def test_close_context_manager(aiohttp_client) -> None: # a test for backward compatibility with yield from syntax async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ctx = client.get("/") ctx.close() assert not ctx._coro.cr_running async def test_session_auth(aiohttp_client) -> None: async def handler(request): return web.json_response({"headers": dict(request.headers)}) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, auth=aiohttp.BasicAuth("login", "pass")) r = await client.get("/") assert r.status == 200 content = await r.json() assert content["headers"]["Authorization"] == "Basic bG9naW46cGFzcw==" async def test_session_auth_override(aiohttp_client) -> None: async def handler(request): return web.json_response({"headers": dict(request.headers)}) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, auth=aiohttp.BasicAuth("login", "pass")) r = await client.get("/", auth=aiohttp.BasicAuth("other_login", "pass")) assert r.status == 200 content = await r.json() val = content["headers"]["Authorization"] assert val == "Basic b3RoZXJfbG9naW46cGFzcw==" async def test_session_auth_header_conflict(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, auth=aiohttp.BasicAuth("login", "pass")) headers = {"Authorization": "Basic b3RoZXJfbG9naW46cGFzcw=="} with pytest.raises(ValueError): await client.get("/", headers=headers) async def test_session_headers(aiohttp_client) -> None: async def handler(request): return web.json_response({"headers": dict(request.headers)}) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, headers={"X-Real-IP": "192.168.0.1"}) r = await client.get("/") assert r.status == 200 content = await r.json() assert content["headers"]["X-Real-IP"] == "192.168.0.1" async def test_session_headers_merge(aiohttp_client) -> None: async def handler(request): return web.json_response({"headers": dict(request.headers)}) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client( app, headers=[("X-Real-IP", "192.168.0.1"), ("X-Sent-By", "requests")] ) r = await client.get("/", headers={"X-Sent-By": "aiohttp"}) assert r.status == 200 content = await r.json() assert content["headers"]["X-Real-IP"] == "192.168.0.1" assert content["headers"]["X-Sent-By"] == "aiohttp" async def test_multidict_headers(aiohttp_client) -> None: async def handler(request): assert await request.read() == data return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) data = b"sample data" async with client.post( "/", data=data, headers=MultiDict({"Content-Length": str(len(data))}) ) as r: assert r.status == 200 async def test_request_conn_closed(aiohttp_client) -> None: async def handler(request): request.transport.close() return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) with pytest.raises(aiohttp.ServerDisconnectedError) as excinfo: resp = await client.get("/") await resp.read() assert str(excinfo.value) != "" async def test_dont_close_explicit_connector(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) r = await client.get("/") await r.read() assert 1 == len(client.session.connector._conns) async def test_server_close_keepalive_connection() -> None: loop = asyncio.get_event_loop() class Proto(asyncio.Protocol): def connection_made(self, transport): self.transp = transport self.data = b"" def data_received(self, data): self.data += data if data.endswith(b"\r\n\r\n"): self.transp.write( b"HTTP/1.1 200 OK\r\n" b"CONTENT-LENGTH: 2\r\n" b"CONNECTION: close\r\n" b"\r\n" b"ok" ) self.transp.close() def connection_lost(self, exc): self.transp = None server = await loop.create_server(Proto, "127.0.0.1", unused_port()) addr = server.sockets[0].getsockname() connector = aiohttp.TCPConnector(limit=1) session = aiohttp.ClientSession(connector=connector) url = "http://{}:{}/".format(*addr) for i in range(2): r = await session.request("GET", url) await r.read() assert 0 == len(connector._conns) await session.close() await connector.close() server.close() await server.wait_closed() async def test_handle_keepalive_on_closed_connection() -> None: loop = asyncio.get_event_loop() class Proto(asyncio.Protocol): def connection_made(self, transport): self.transp = transport self.data = b"" def data_received(self, data): self.data += data if data.endswith(b"\r\n\r\n"): self.transp.write( b"HTTP/1.1 200 OK\r\n" b"CONTENT-LENGTH: 2\r\n" b"\r\n" b"ok" ) self.transp.close() def connection_lost(self, exc): self.transp = None server = await loop.create_server(Proto, "127.0.0.1", unused_port()) addr = server.sockets[0].getsockname() connector = aiohttp.TCPConnector(limit=1) session = aiohttp.ClientSession(connector=connector) url = "http://{}:{}/".format(*addr) r = await session.request("GET", url) await r.read() assert 1 == len(connector._conns) with pytest.raises(aiohttp.ClientConnectionError): await session.request("GET", url) assert 0 == len(connector._conns) await session.close() await connector.close() server.close() await server.wait_closed() async def test_error_in_performing_request(ssl_ctx, aiohttp_client, aiohttp_server): async def handler(request): return web.Response() def exception_handler(loop, context): # skip log messages about destroyed but pending tasks pass loop = asyncio.get_event_loop() loop.set_exception_handler(exception_handler) app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app, ssl=ssl_ctx) conn = aiohttp.TCPConnector(limit=1) client = await aiohttp_client(server, connector=conn) with pytest.raises(aiohttp.ClientConnectionError): await client.get("/") # second try should not hang with pytest.raises(aiohttp.ClientConnectionError): await client.get("/") async def test_await_after_cancelling(aiohttp_client) -> None: loop = asyncio.get_event_loop() async def handler(request): return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) fut1 = loop.create_future() fut2 = loop.create_future() async def fetch1(): resp = await client.get("/") assert resp.status == 200 fut1.set_result(None) with pytest.raises(asyncio.CancelledError): await fut2 resp.release() async def fetch2(): await fut1 resp = await client.get("/") assert resp.status == 200 async def canceller(): await fut1 fut2.cancel() await asyncio.gather(fetch1(), fetch2(), canceller()) async def test_async_payload_generator(aiohttp_client) -> None: async def handler(request): data = await request.read() assert data == b"1234567890" * 100 return web.Response() app = web.Application() app.add_routes([web.post("/", handler)]) client = await aiohttp_client(app) async def gen(): for i in range(100): yield b"1234567890" async with client.post("/", data=gen()) as resp: assert resp.status == 200 async def test_read_from_closed_response(aiohttp_client) -> None: async def handler(request): return web.Response(body=b"data") app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app) async with client.get("/") as resp: assert resp.status == 200 with pytest.raises(aiohttp.ClientConnectionError): await resp.read() async def test_read_from_closed_response2(aiohttp_client) -> None: async def handler(request): return web.Response(body=b"data") app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app) async with client.get("/") as resp: assert resp.status == 200 await resp.read() with pytest.raises(aiohttp.ClientConnectionError): await resp.read() async def test_read_from_closed_content(aiohttp_client) -> None: async def handler(request): return web.Response(body=b"data") app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app) async with client.get("/") as resp: assert resp.status == 200 with pytest.raises(aiohttp.ClientConnectionError): await resp.content.readline() async def test_read_timeout(aiohttp_client) -> None: async def handler(request): await asyncio.sleep(5) return web.Response() app = web.Application() app.add_routes([web.get("/", handler)]) timeout = aiohttp.ClientTimeout(sock_read=0.1) client = await aiohttp_client(app, timeout=timeout) with pytest.raises(aiohttp.ServerTimeoutError): await client.get("/") async def test_read_timeout_closes_connection(aiohttp_client: AiohttpClient) -> None: request_count = 0 async def handler(request): nonlocal request_count request_count += 1 if request_count < 3: await asyncio.sleep(0.5) return web.Response(body=f"request:{request_count}") app = web.Application() app.add_routes([web.get("/", handler)]) timeout = aiohttp.ClientTimeout(total=0.1) client: TestClient = await aiohttp_client(app, timeout=timeout) with pytest.raises(asyncio.TimeoutError): await client.get("/") # Make sure its really closed assert not client.session.connector._conns with pytest.raises(asyncio.TimeoutError): await client.get("/") # Make sure its really closed assert not client.session.connector._conns result = await client.get("/") assert await result.read() == b"request:3" # Make sure its not closed assert client.session.connector._conns async def test_read_timeout_on_prepared_response(aiohttp_client: Any) -> None: async def handler(request): resp = aiohttp.web.StreamResponse() await resp.prepare(request) await asyncio.sleep(5) await resp.drain() return resp app = web.Application() app.add_routes([web.get("/", handler)]) timeout = aiohttp.ClientTimeout(sock_read=0.1) client = await aiohttp_client(app, timeout=timeout) with pytest.raises(aiohttp.ServerTimeoutError): async with await client.get("/") as resp: await resp.read() async def test_timeout_with_full_buffer(aiohttp_client) -> None: async def handler(request): """Server response that never ends and always has more data available.""" resp = web.StreamResponse() await resp.prepare(request) while True: await resp.write(b"1" * 1000) await asyncio.sleep(0.01) async def request(client): timeout = aiohttp.ClientTimeout(total=0.5) async with await client.get("/", timeout=timeout) as resp: with pytest.raises(asyncio.TimeoutError): async for data in resp.content.iter_chunked(1): await asyncio.sleep(0.01) app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app) # wait_for() used just to ensure that a failing test doesn't hang. await asyncio.wait_for(request(client), 1) async def test_read_bufsize_session_default(aiohttp_client) -> None: async def handler(request): return web.Response(body=b"1234567") app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app, read_bufsize=2) async with await client.get("/") as resp: assert resp.content.get_read_buffer_limits() == (2, 4) async def test_read_bufsize_explicit(aiohttp_client) -> None: async def handler(request): return web.Response(body=b"1234567") app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app) async with await client.get("/", read_bufsize=4) as resp: assert resp.content.get_read_buffer_limits() == (4, 8) async def test_http_empty_data_text(aiohttp_client) -> None: async def handler(request): data = await request.read() ret = "ok" if data == b"" else "fail" resp = web.Response(text=ret) resp.headers["Content-Type"] = request.headers["Content-Type"] return resp app = web.Application() app.add_routes([web.post("/", handler)]) client = await aiohttp_client(app) async with await client.post("/", data="") as resp: assert resp.status == 200 assert await resp.text() == "ok" assert resp.headers["Content-Type"] == "text/plain; charset=utf-8" async def test_max_field_size_session_default(aiohttp_client) -> None: async def handler(request): return web.Response(headers={"Custom": "x" * 8190}) app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app) async with await client.get("/") as resp: assert resp.headers["Custom"] == "x" * 8190 async def test_max_field_size_session_default_fail(aiohttp_client) -> None: async def handler(request): return web.Response(headers={"Custom": "x" * 8191}) app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app) with pytest.raises(aiohttp.ClientResponseError): await client.get("/") async def test_max_field_size_session_explicit(aiohttp_client) -> None: async def handler(request): return web.Response(headers={"Custom": "x" * 8191}) app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app, max_field_size=8191) async with await client.get("/") as resp: assert resp.headers["Custom"] == "x" * 8191 async def test_max_field_size_request_explicit(aiohttp_client) -> None: async def handler(request): return web.Response(headers={"Custom": "x" * 8191}) app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app) async with await client.get("/", max_field_size=8191) as resp: assert resp.headers["Custom"] == "x" * 8191 async def test_max_line_size_session_default(aiohttp_client) -> None: async def handler(request): return web.Response(status=200, reason="x" * 8190) app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app) async with await client.get("/") as resp: assert resp.reason == "x" * 8190 async def test_max_line_size_session_default_fail(aiohttp_client) -> None: async def handler(request): return web.Response(status=200, reason="x" * 8192) app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app) with pytest.raises(aiohttp.ClientResponseError): await client.get("/") async def test_max_line_size_session_explicit(aiohttp_client) -> None: async def handler(request): return web.Response(status=200, reason="x" * 8191) app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app, max_line_size=8191) async with await client.get("/") as resp: assert resp.reason == "x" * 8191 async def test_max_line_size_request_explicit(aiohttp_client) -> None: async def handler(request): return web.Response(status=200, reason="x" * 8191) app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app) async with await client.get("/", max_line_size=8191) as resp: assert resp.reason == "x" * 8191 @pytest.mark.xfail(raises=asyncio.TimeoutError, reason="#7599") async def test_rejected_upload(aiohttp_client, tmp_path) -> None: async def ok_handler(request): return web.Response() async def not_ok_handler(request): raise web.HTTPBadRequest() app = web.Application() app.router.add_get("/ok", ok_handler) app.router.add_post("/not_ok", not_ok_handler) client = await aiohttp_client(app) file_size_bytes = 1024 * 1024 file_path = tmp_path / "uploaded.txt" file_path.write_text("0" * file_size_bytes, encoding="utf8") with open(file_path, "rb") as file: data = {"file": file} async with await client.post("/not_ok", data=data) as resp_not_ok: assert 400 == resp_not_ok.status async with await client.get( "/ok", timeout=aiohttp.ClientTimeout(total=0.01) ) as resp_ok: assert 200 == resp_ok.status ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_client_proto.py0000644000175100001770000001051514607525266020100 0ustar00runnerdockerfrom unittest import mock from yarl import URL from aiohttp import http from aiohttp.client_exceptions import ClientOSError, ServerDisconnectedError from aiohttp.client_proto import ResponseHandler from aiohttp.client_reqrep import ClientResponse from aiohttp.helpers import TimerNoop async def test_oserror(loop) -> None: proto = ResponseHandler(loop=loop) transport = mock.Mock() proto.connection_made(transport) proto.connection_lost(OSError()) assert proto.should_close assert isinstance(proto.exception(), ClientOSError) async def test_pause_resume_on_error(loop) -> None: proto = ResponseHandler(loop=loop) transport = mock.Mock() proto.connection_made(transport) proto.pause_reading() assert proto._reading_paused proto.resume_reading() assert not proto._reading_paused async def test_client_proto_bad_message(loop) -> None: proto = ResponseHandler(loop=loop) transport = mock.Mock() proto.connection_made(transport) proto.set_response_params() proto.data_received(b"HTTP\r\n\r\n") assert proto.should_close assert transport.close.called assert isinstance(proto.exception(), http.HttpProcessingError) async def test_uncompleted_message(loop) -> None: proto = ResponseHandler(loop=loop) transport = mock.Mock() proto.connection_made(transport) proto.set_response_params(read_until_eof=True) proto.data_received( b"HTTP/1.1 301 Moved Permanently\r\n" b"Location: http://python.org/" ) proto.connection_lost(None) exc = proto.exception() assert isinstance(exc, ServerDisconnectedError) assert exc.message.code == 301 assert dict(exc.message.headers) == {"Location": "http://python.org/"} async def test_client_protocol_readuntil_eof(loop) -> None: proto = ResponseHandler(loop=loop) transport = mock.Mock() proto.connection_made(transport) conn = mock.Mock() conn.protocol = proto proto.data_received(b"HTTP/1.1 200 Ok\r\n\r\n") response = ClientResponse( "get", URL("http://def-cl-resp.org"), writer=mock.Mock(), continue100=None, timer=TimerNoop(), request_info=mock.Mock(), traces=[], loop=loop, session=mock.Mock(), ) proto.set_response_params(read_until_eof=True) await response.start(conn) assert not response.content.is_eof() proto.data_received(b"0000") data = await response.content.readany() assert data == b"0000" proto.data_received(b"1111") data = await response.content.readany() assert data == b"1111" proto.connection_lost(None) assert response.content.is_eof() async def test_empty_data(loop) -> None: proto = ResponseHandler(loop=loop) proto.data_received(b"") # do nothing async def test_schedule_timeout(loop) -> None: proto = ResponseHandler(loop=loop) proto.set_response_params(read_timeout=1) assert proto._read_timeout_handle is None proto.start_timeout() assert proto._read_timeout_handle is not None async def test_drop_timeout(loop) -> None: proto = ResponseHandler(loop=loop) proto.set_response_params(read_timeout=1) proto.start_timeout() assert proto._read_timeout_handle is not None proto._drop_timeout() assert proto._read_timeout_handle is None async def test_reschedule_timeout(loop) -> None: proto = ResponseHandler(loop=loop) proto.set_response_params(read_timeout=1) proto.start_timeout() assert proto._read_timeout_handle is not None h = proto._read_timeout_handle proto._reschedule_timeout() assert proto._read_timeout_handle is not None assert proto._read_timeout_handle is not h async def test_eof_received(loop) -> None: proto = ResponseHandler(loop=loop) proto.set_response_params(read_timeout=1) proto.start_timeout() assert proto._read_timeout_handle is not None proto.eof_received() assert proto._read_timeout_handle is None async def test_connection_lost_sets_transport_to_none(loop, mocker) -> None: """Ensure that the transport is set to None when the connection is lost. This ensures the writer knows that the connection is closed. """ proto = ResponseHandler(loop=loop) proto.connection_made(mocker.Mock()) assert proto.transport is not None proto.connection_lost(OSError()) assert proto.transport is None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_client_request.py0000644000175100001770000012176214607525266020434 0ustar00runnerdockerimport asyncio import hashlib import io import pathlib import urllib.parse import zlib from http.cookies import BaseCookie, Morsel, SimpleCookie from typing import Any, Callable, Dict, Optional from unittest import mock import pytest from multidict import CIMultiDict, CIMultiDictProxy, istr from yarl import URL import aiohttp from aiohttp import BaseConnector, hdrs, helpers, payload from aiohttp.client_exceptions import ClientConnectionError from aiohttp.client_reqrep import ( ClientRequest, ClientResponse, Fingerprint, _gen_default_accept_encoding, _merge_ssl_params, ) from aiohttp.http import HttpVersion from aiohttp.test_utils import make_mocked_coro class WriterMock(mock.AsyncMock): def __await__(self) -> None: return self().__await__() def add_done_callback(self, cb: Callable[[], None]) -> None: """Dummy method.""" def remove_done_callback(self, cb: Callable[[], None]) -> None: """Dummy method.""" @pytest.fixture def make_request(loop): request = None def maker(method, url, *args, **kwargs): nonlocal request request = ClientRequest(method, URL(url), *args, loop=loop, **kwargs) return request yield maker if request is not None: loop.run_until_complete(request.close()) @pytest.fixture def buf(): return bytearray() @pytest.fixture def protocol(loop, transport): protocol = mock.Mock() protocol.transport = transport protocol._drain_helper.return_value = loop.create_future() protocol._drain_helper.return_value.set_result(None) return protocol @pytest.fixture def transport(buf): transport = mock.Mock() def write(chunk): buf.extend(chunk) async def write_eof(): pass transport.write.side_effect = write transport.write_eof.side_effect = write_eof transport.is_closing.return_value = False return transport @pytest.fixture def conn(transport, protocol): return mock.Mock(transport=transport, protocol=protocol) def test_method1(make_request) -> None: req = make_request("get", "http://python.org/") assert req.method == "GET" def test_method2(make_request) -> None: req = make_request("head", "http://python.org/") assert req.method == "HEAD" def test_method3(make_request) -> None: req = make_request("HEAD", "http://python.org/") assert req.method == "HEAD" def test_method_invalid(make_request) -> None: with pytest.raises(ValueError, match="Method cannot contain non-token characters"): make_request("METHOD WITH\nWHITESPACES", "http://python.org/") def test_version_1_0(make_request) -> None: req = make_request("get", "http://python.org/", version="1.0") assert req.version == (1, 0) def test_version_default(make_request) -> None: req = make_request("get", "http://python.org/") assert req.version == (1, 1) def test_request_info(make_request) -> None: req = make_request("get", "http://python.org/") assert req.request_info == aiohttp.RequestInfo( URL("http://python.org/"), "GET", req.headers ) def test_request_info_with_fragment(make_request) -> None: req = make_request("get", "http://python.org/#urlfragment") assert req.request_info == aiohttp.RequestInfo( URL("http://python.org/"), "GET", req.headers, URL("http://python.org/#urlfragment"), ) def test_version_err(make_request) -> None: with pytest.raises(ValueError): make_request("get", "http://python.org/", version="1.c") def test_keep_alive(make_request) -> None: req = make_request("get", "http://python.org/", version=(0, 9)) assert not req.keep_alive() req = make_request("get", "http://python.org/", version=(1, 0)) assert not req.keep_alive() req = make_request( "get", "http://python.org/", version=(1, 0), headers={"connection": "keep-alive"}, ) assert req.keep_alive() req = make_request("get", "http://python.org/", version=(1, 1)) assert req.keep_alive() req = make_request( "get", "http://python.org/", version=(1, 1), headers={"connection": "close"} ) assert not req.keep_alive() def test_host_port_default_http(make_request) -> None: req = make_request("get", "http://python.org/") assert req.host == "python.org" assert req.port == 80 assert not req.is_ssl() def test_host_port_default_https(make_request) -> None: req = make_request("get", "https://python.org/") assert req.host == "python.org" assert req.port == 443 assert req.is_ssl() def test_host_port_nondefault_http(make_request) -> None: req = make_request("get", "http://python.org:960/") assert req.host == "python.org" assert req.port == 960 assert not req.is_ssl() def test_host_port_nondefault_https(make_request) -> None: req = make_request("get", "https://python.org:960/") assert req.host == "python.org" assert req.port == 960 assert req.is_ssl() def test_host_port_default_ws(make_request) -> None: req = make_request("get", "ws://python.org/") assert req.host == "python.org" assert req.port == 80 assert not req.is_ssl() def test_host_port_default_wss(make_request) -> None: req = make_request("get", "wss://python.org/") assert req.host == "python.org" assert req.port == 443 assert req.is_ssl() def test_host_port_nondefault_ws(make_request) -> None: req = make_request("get", "ws://python.org:960/") assert req.host == "python.org" assert req.port == 960 assert not req.is_ssl() def test_host_port_nondefault_wss(make_request) -> None: req = make_request("get", "wss://python.org:960/") assert req.host == "python.org" assert req.port == 960 assert req.is_ssl() def test_host_port_none_port(make_request) -> None: req = make_request("get", "unix://localhost/path") assert req.headers["Host"] == "localhost" def test_host_port_err(make_request) -> None: with pytest.raises(ValueError): make_request("get", "http://python.org:123e/") def test_hostname_err(make_request) -> None: with pytest.raises(ValueError): make_request("get", "http://:8080/") def test_host_header_host_first(make_request) -> None: req = make_request("get", "http://python.org/") assert list(req.headers)[0] == "Host" def test_host_header_host_without_port(make_request) -> None: req = make_request("get", "http://python.org/") assert req.headers["HOST"] == "python.org" def test_host_header_host_with_default_port(make_request) -> None: req = make_request("get", "http://python.org:80/") assert req.headers["HOST"] == "python.org" def test_host_header_host_with_nondefault_port(make_request) -> None: req = make_request("get", "http://python.org:99/") assert req.headers["HOST"] == "python.org:99" def test_host_header_host_idna_encode(make_request) -> None: req = make_request("get", "http://xn--9caa.com") assert req.headers["HOST"] == "xn--9caa.com" def test_host_header_host_unicode(make_request) -> None: req = make_request("get", "http://éé.com") assert req.headers["HOST"] == "xn--9caa.com" def test_host_header_explicit_host(make_request) -> None: req = make_request("get", "http://python.org/", headers={"host": "example.com"}) assert req.headers["HOST"] == "example.com" def test_host_header_explicit_host_with_port(make_request) -> None: req = make_request("get", "http://python.org/", headers={"host": "example.com:99"}) assert req.headers["HOST"] == "example.com:99" def test_host_header_ipv4(make_request) -> None: req = make_request("get", "http://127.0.0.2") assert req.headers["HOST"] == "127.0.0.2" def test_host_header_ipv6(make_request) -> None: req = make_request("get", "http://[::2]") assert req.headers["HOST"] == "[::2]" def test_host_header_ipv4_with_port(make_request) -> None: req = make_request("get", "http://127.0.0.2:99") assert req.headers["HOST"] == "127.0.0.2:99" def test_host_header_ipv6_with_port(make_request) -> None: req = make_request("get", "http://[::2]:99") assert req.headers["HOST"] == "[::2]:99" def test_default_loop(loop) -> None: asyncio.set_event_loop(loop) req = ClientRequest("get", URL("http://python.org/")) assert req.loop is loop loop.run_until_complete(req.close()) @pytest.mark.parametrize( ("url", "headers", "expected"), ( pytest.param("http://localhost.", None, "localhost", id="dot only at the end"), pytest.param("http://python.org.", None, "python.org", id="single dot"), pytest.param( "http://python.org.:99", None, "python.org:99", id="single dot with port" ), pytest.param( "http://python.org...:99", None, "python.org:99", id="multiple dots with port", ), pytest.param( "http://python.org.:99", {"host": "example.com.:99"}, "example.com.:99", id="explicit host header", ), pytest.param("https://python.org.", None, "python.org", id="https"), pytest.param("https://...", None, "", id="only dots"), pytest.param( "http://príklad.example.org.:99", None, "xn--prklad-4va.example.org:99", id="single dot with port idna", ), ), ) def test_host_header_fqdn( make_request: Any, url: str, headers: Dict[str, str], expected: str ) -> None: req = make_request("get", url, headers=headers) assert req.headers["HOST"] == expected def test_default_headers_useragent(make_request) -> None: req = make_request("get", "http://python.org/") assert "SERVER" not in req.headers assert "USER-AGENT" in req.headers def test_default_headers_useragent_custom(make_request) -> None: req = make_request( "get", "http://python.org/", headers={"user-agent": "my custom agent"} ) assert "USER-Agent" in req.headers assert "my custom agent" == req.headers["User-Agent"] def test_skip_default_useragent_header(make_request) -> None: req = make_request( "get", "http://python.org/", skip_auto_headers={istr("user-agent")} ) assert "User-Agent" not in req.headers def test_headers(make_request) -> None: req = make_request( "post", "http://python.org/", headers={"Content-Type": "text/plain"} ) assert "CONTENT-TYPE" in req.headers assert req.headers["CONTENT-TYPE"] == "text/plain" assert req.headers["ACCEPT-ENCODING"] == "gzip, deflate, br" def test_headers_list(make_request) -> None: req = make_request( "post", "http://python.org/", headers=[("Content-Type", "text/plain")] ) assert "CONTENT-TYPE" in req.headers assert req.headers["CONTENT-TYPE"] == "text/plain" def test_headers_default(make_request) -> None: req = make_request( "get", "http://python.org/", headers={"ACCEPT-ENCODING": "deflate"} ) assert req.headers["ACCEPT-ENCODING"] == "deflate" def test_invalid_url(make_request) -> None: with pytest.raises(aiohttp.InvalidURL): make_request("get", "hiwpefhipowhefopw") def test_no_path(make_request) -> None: req = make_request("get", "http://python.org") assert "/" == req.url.path def test_ipv6_default_http_port(make_request) -> None: req = make_request("get", "http://[2001:db8::1]/") assert req.host == "2001:db8::1" assert req.port == 80 assert not req.is_ssl() def test_ipv6_default_https_port(make_request) -> None: req = make_request("get", "https://[2001:db8::1]/") assert req.host == "2001:db8::1" assert req.port == 443 assert req.is_ssl() def test_ipv6_nondefault_http_port(make_request) -> None: req = make_request("get", "http://[2001:db8::1]:960/") assert req.host == "2001:db8::1" assert req.port == 960 assert not req.is_ssl() def test_ipv6_nondefault_https_port(make_request) -> None: req = make_request("get", "https://[2001:db8::1]:960/") assert req.host == "2001:db8::1" assert req.port == 960 assert req.is_ssl() def test_basic_auth(make_request) -> None: req = make_request( "get", "http://python.org", auth=aiohttp.BasicAuth("nkim", "1234") ) assert "AUTHORIZATION" in req.headers assert "Basic bmtpbToxMjM0" == req.headers["AUTHORIZATION"] def test_basic_auth_utf8(make_request) -> None: req = make_request( "get", "http://python.org", auth=aiohttp.BasicAuth("nkim", "секрет", "utf-8") ) assert "AUTHORIZATION" in req.headers assert "Basic bmtpbTrRgdC10LrRgNC10YI=" == req.headers["AUTHORIZATION"] def test_basic_auth_tuple_forbidden(make_request) -> None: with pytest.raises(TypeError): make_request("get", "http://python.org", auth=("nkim", "1234")) def test_basic_auth_from_url(make_request) -> None: req = make_request("get", "http://nkim:1234@python.org") assert "AUTHORIZATION" in req.headers assert "Basic bmtpbToxMjM0" == req.headers["AUTHORIZATION"] assert "python.org" == req.host def test_basic_auth_from_url_overridden(make_request) -> None: req = make_request( "get", "http://garbage@python.org", auth=aiohttp.BasicAuth("nkim", "1234") ) assert "AUTHORIZATION" in req.headers assert "Basic bmtpbToxMjM0" == req.headers["AUTHORIZATION"] assert "python.org" == req.host def test_path_is_not_double_encoded1(make_request) -> None: req = make_request("get", "http://0.0.0.0/get/test case") assert req.url.raw_path == "/get/test%20case" def test_path_is_not_double_encoded2(make_request) -> None: req = make_request("get", "http://0.0.0.0/get/test%2fcase") assert req.url.raw_path == "/get/test%2Fcase" def test_path_is_not_double_encoded3(make_request) -> None: req = make_request("get", "http://0.0.0.0/get/test%20case") assert req.url.raw_path == "/get/test%20case" def test_path_safe_chars_preserved(make_request) -> None: req = make_request("get", "http://0.0.0.0/get/:=+/%2B/") assert req.url.path == "/get/:=+/+/" def test_params_are_added_before_fragment1(make_request) -> None: req = make_request("GET", "http://example.com/path#fragment", params={"a": "b"}) assert str(req.url) == "http://example.com/path?a=b" def test_params_are_added_before_fragment2(make_request) -> None: req = make_request( "GET", "http://example.com/path?key=value#fragment", params={"a": "b"} ) assert str(req.url) == "http://example.com/path?key=value&a=b" def test_path_not_contain_fragment1(make_request) -> None: req = make_request("GET", "http://example.com/path#fragment") assert req.url.path == "/path" def test_path_not_contain_fragment2(make_request) -> None: req = make_request("GET", "http://example.com/path?key=value#fragment") assert str(req.url) == "http://example.com/path?key=value" def test_cookies(make_request) -> None: req = make_request("get", "http://test.com/path", cookies={"cookie1": "val1"}) assert "COOKIE" in req.headers assert "cookie1=val1" == req.headers["COOKIE"] def test_cookies_is_quoted_with_special_characters(make_request) -> None: req = make_request("get", "http://test.com/path", cookies={"cookie1": "val/one"}) assert "COOKIE" in req.headers assert 'cookie1="val/one"' == req.headers["COOKIE"] def test_cookies_merge_with_headers(make_request) -> None: req = make_request( "get", "http://test.com/path", headers={"cookie": "cookie1=val1"}, cookies={"cookie2": "val2"}, ) assert "cookie1=val1; cookie2=val2" == req.headers["COOKIE"] def test_unicode_get1(make_request) -> None: req = make_request("get", "http://python.org", params={"foo": "f\xf8\xf8"}) assert "http://python.org/?foo=f%C3%B8%C3%B8" == str(req.url) def test_unicode_get2(make_request) -> None: req = make_request("", "http://python.org", params={"f\xf8\xf8": "f\xf8\xf8"}) assert "http://python.org/?f%C3%B8%C3%B8=f%C3%B8%C3%B8" == str(req.url) def test_unicode_get3(make_request) -> None: req = make_request("", "http://python.org", params={"foo": "foo"}) assert "http://python.org/?foo=foo" == str(req.url) def test_unicode_get4(make_request) -> None: def join(*suffix): return urllib.parse.urljoin("http://python.org/", "/".join(suffix)) req = make_request("", join("\xf8"), params={"foo": "foo"}) assert "http://python.org/%C3%B8?foo=foo" == str(req.url) def test_query_multivalued_param(make_request) -> None: for meth in ClientRequest.ALL_METHODS: req = make_request( meth, "http://python.org", params=(("test", "foo"), ("test", "baz")) ) assert str(req.url) == "http://python.org/?test=foo&test=baz" def test_query_str_param(make_request) -> None: for meth in ClientRequest.ALL_METHODS: req = make_request(meth, "http://python.org", params="test=foo") assert str(req.url) == "http://python.org/?test=foo" def test_query_bytes_param_raises(make_request) -> None: for meth in ClientRequest.ALL_METHODS: with pytest.raises(TypeError): make_request(meth, "http://python.org", params=b"test=foo") def test_query_str_param_is_not_encoded(make_request) -> None: for meth in ClientRequest.ALL_METHODS: req = make_request(meth, "http://python.org", params="test=f+oo") assert str(req.url) == "http://python.org/?test=f+oo" def test_params_update_path_and_url(make_request) -> None: req = make_request( "get", "http://python.org", params=(("test", "foo"), ("test", "baz")) ) assert str(req.url) == "http://python.org/?test=foo&test=baz" def test_params_empty_path_and_url(make_request) -> None: req_empty = make_request("get", "http://python.org", params={}) assert str(req_empty.url) == "http://python.org" req_none = make_request("get", "http://python.org") assert str(req_none.url) == "http://python.org" def test_gen_netloc_all(make_request) -> None: req = make_request( "get", "https://aiohttp:pwpwpw@" + "12345678901234567890123456789" + "012345678901234567890:8080", ) assert ( req.headers["HOST"] == "12345678901234567890123456789" + "012345678901234567890:8080" ) def test_gen_netloc_no_port(make_request) -> None: req = make_request( "get", "https://aiohttp:pwpwpw@" + "12345678901234567890123456789" + "012345678901234567890/", ) assert ( req.headers["HOST"] == "12345678901234567890123456789" + "012345678901234567890" ) async def test_connection_header(loop, conn) -> None: req = ClientRequest("get", URL("http://python.org"), loop=loop) req.keep_alive = mock.Mock() req.headers.clear() req.keep_alive.return_value = True req.version = HttpVersion(1, 1) req.headers.clear() await req.send(conn) assert req.headers.get("CONNECTION") is None req.version = HttpVersion(1, 0) req.headers.clear() await req.send(conn) assert req.headers.get("CONNECTION") == "keep-alive" req.keep_alive.return_value = False req.version = HttpVersion(1, 1) req.headers.clear() await req.send(conn) assert req.headers.get("CONNECTION") == "close" await req.close() async def test_no_content_length(loop, conn) -> None: req = ClientRequest("get", URL("http://python.org"), loop=loop) resp = await req.send(conn) assert req.headers.get("CONTENT-LENGTH") is None await req.close() resp.close() async def test_no_content_length_head(loop, conn) -> None: req = ClientRequest("head", URL("http://python.org"), loop=loop) resp = await req.send(conn) assert req.headers.get("CONTENT-LENGTH") is None await req.close() resp.close() async def test_content_type_auto_header_get(loop, conn) -> None: req = ClientRequest("get", URL("http://python.org"), loop=loop) resp = await req.send(conn) assert "CONTENT-TYPE" not in req.headers resp.close() await req.close() async def test_content_type_auto_header_form(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org"), data={"hey": "you"}, loop=loop ) resp = await req.send(conn) assert "application/x-www-form-urlencoded" == req.headers.get("CONTENT-TYPE") resp.close() await req.close() async def test_content_type_auto_header_bytes(loop, conn) -> None: req = ClientRequest("post", URL("http://python.org"), data=b"hey you", loop=loop) resp = await req.send(conn) assert "application/octet-stream" == req.headers.get("CONTENT-TYPE") resp.close() await req.close() async def test_content_type_skip_auto_header_bytes(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org"), data=b"hey you", skip_auto_headers={"Content-Type"}, loop=loop, ) resp = await req.send(conn) assert "CONTENT-TYPE" not in req.headers resp.close() await req.close() async def test_content_type_skip_auto_header_form(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org"), data={"hey": "you"}, loop=loop, skip_auto_headers={"Content-Type"}, ) resp = await req.send(conn) assert "CONTENT-TYPE" not in req.headers resp.close() await req.close() async def test_content_type_auto_header_content_length_no_skip(loop, conn) -> None: with io.BytesIO(b"hey") as file_handle: req = ClientRequest( "post", URL("http://python.org"), data=file_handle, skip_auto_headers={"Content-Length"}, loop=loop, ) resp = await req.send(conn) assert req.headers.get("CONTENT-LENGTH") == "3" resp.close() await req.close() async def test_urlencoded_formdata_charset(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org"), data=aiohttp.FormData({"hey": "you"}, charset="koi8-r"), loop=loop, ) await req.send(conn) assert "application/x-www-form-urlencoded; charset=koi8-r" == req.headers.get( "CONTENT-TYPE" ) await req.close() async def test_post_data(loop, conn) -> None: for meth in ClientRequest.POST_METHODS: req = ClientRequest( meth, URL("http://python.org/"), data={"life": "42"}, loop=loop ) resp = await req.send(conn) assert "/" == req.url.path assert b"life=42" == req.body._value assert "application/x-www-form-urlencoded" == req.headers["CONTENT-TYPE"] await req.close() resp.close() async def test_pass_falsy_data(loop) -> None: with mock.patch("aiohttp.client_reqrep.ClientRequest.update_body_from_data"): req = ClientRequest("post", URL("http://python.org/"), data={}, loop=loop) req.update_body_from_data.assert_called_once_with({}) await req.close() async def test_pass_falsy_data_file(loop, tmp_path) -> None: testfile = (tmp_path / "tmpfile").open("w+b") testfile.write(b"data") testfile.seek(0) skip = frozenset([hdrs.CONTENT_TYPE]) req = ClientRequest( "post", URL("http://python.org/"), data=testfile, skip_auto_headers=skip, loop=loop, ) assert req.headers.get("CONTENT-LENGTH", None) is not None await req.close() testfile.close() # Elasticsearch API requires to send request body with GET-requests async def test_get_with_data(loop) -> None: for meth in ClientRequest.GET_METHODS: req = ClientRequest( meth, URL("http://python.org/"), data={"life": "42"}, loop=loop ) assert "/" == req.url.path assert b"life=42" == req.body._value await req.close() async def test_bytes_data(loop, conn) -> None: for meth in ClientRequest.POST_METHODS: req = ClientRequest( meth, URL("http://python.org/"), data=b"binary data", loop=loop ) resp = await req.send(conn) assert "/" == req.url.path assert isinstance(req.body, payload.BytesPayload) assert b"binary data" == req.body._value assert "application/octet-stream" == req.headers["CONTENT-TYPE"] await req.close() resp.close() async def test_content_encoding(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org/"), data="foo", compress="deflate", loop=loop ) with mock.patch("aiohttp.client_reqrep.StreamWriter") as m_writer: m_writer.return_value.write_headers = make_mocked_coro() resp = await req.send(conn) assert req.headers["TRANSFER-ENCODING"] == "chunked" assert req.headers["CONTENT-ENCODING"] == "deflate" m_writer.return_value.enable_compression.assert_called_with("deflate") await req.close() resp.close() async def test_content_encoding_dont_set_headers_if_no_body(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org/"), compress="deflate", loop=loop ) with mock.patch("aiohttp.client_reqrep.http"): resp = await req.send(conn) assert "TRANSFER-ENCODING" not in req.headers assert "CONTENT-ENCODING" not in req.headers await req.close() resp.close() async def test_content_encoding_header(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org/"), data="foo", headers={"Content-Encoding": "deflate"}, loop=loop, ) with mock.patch("aiohttp.client_reqrep.StreamWriter") as m_writer: m_writer.return_value.write_headers = make_mocked_coro() resp = await req.send(conn) assert not m_writer.return_value.enable_compression.called assert not m_writer.return_value.enable_chunking.called await req.close() resp.close() async def test_compress_and_content_encoding(loop, conn) -> None: with pytest.raises(ValueError): ClientRequest( "post", URL("http://python.org/"), data="foo", headers={"content-encoding": "deflate"}, compress="deflate", loop=loop, ) async def test_chunked(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org/"), headers={"TRANSFER-ENCODING": "gzip"}, loop=loop, ) resp = await req.send(conn) assert "gzip" == req.headers["TRANSFER-ENCODING"] await req.close() resp.close() async def test_chunked2(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org/"), headers={"Transfer-encoding": "chunked"}, loop=loop, ) resp = await req.send(conn) assert "chunked" == req.headers["TRANSFER-ENCODING"] await req.close() resp.close() async def test_chunked_explicit(loop, conn) -> None: req = ClientRequest("post", URL("http://python.org/"), chunked=True, loop=loop) with mock.patch("aiohttp.client_reqrep.StreamWriter") as m_writer: m_writer.return_value.write_headers = make_mocked_coro() resp = await req.send(conn) assert "chunked" == req.headers["TRANSFER-ENCODING"] m_writer.return_value.enable_chunking.assert_called_with() await req.close() resp.close() async def test_chunked_length(loop, conn) -> None: with pytest.raises(ValueError): ClientRequest( "post", URL("http://python.org/"), headers={"CONTENT-LENGTH": "1000"}, chunked=True, loop=loop, ) async def test_chunked_transfer_encoding(loop, conn) -> None: with pytest.raises(ValueError): ClientRequest( "post", URL("http://python.org/"), headers={"TRANSFER-ENCODING": "chunked"}, chunked=True, loop=loop, ) async def test_file_upload_not_chunked(loop) -> None: file_path = pathlib.Path(__file__).parent / "aiohttp.png" with file_path.open("rb") as f: req = ClientRequest("post", URL("http://python.org/"), data=f, loop=loop) assert not req.chunked assert req.headers["CONTENT-LENGTH"] == str(file_path.stat().st_size) await req.close() async def test_precompressed_data_stays_intact(loop) -> None: data = zlib.compress(b"foobar") req = ClientRequest( "post", URL("http://python.org/"), data=data, headers={"CONTENT-ENCODING": "deflate"}, compress=False, loop=loop, ) assert not req.compress assert not req.chunked assert req.headers["CONTENT-ENCODING"] == "deflate" await req.close() async def test_file_upload_not_chunked_seek(loop) -> None: file_path = pathlib.Path(__file__).parent / "aiohttp.png" with file_path.open("rb") as f: f.seek(100) req = ClientRequest("post", URL("http://python.org/"), data=f, loop=loop) assert req.headers["CONTENT-LENGTH"] == str(file_path.stat().st_size - 100) await req.close() async def test_file_upload_force_chunked(loop) -> None: file_path = pathlib.Path(__file__).parent / "aiohttp.png" with file_path.open("rb") as f: req = ClientRequest( "post", URL("http://python.org/"), data=f, chunked=True, loop=loop ) assert req.chunked assert "CONTENT-LENGTH" not in req.headers await req.close() async def test_expect100(loop, conn) -> None: req = ClientRequest("get", URL("http://python.org/"), expect100=True, loop=loop) resp = await req.send(conn) assert "100-continue" == req.headers["EXPECT"] assert req._continue is not None req.terminate() resp.close() await req.close() async def test_expect_100_continue_header(loop, conn) -> None: req = ClientRequest( "get", URL("http://python.org/"), headers={"expect": "100-continue"}, loop=loop ) resp = await req.send(conn) assert "100-continue" == req.headers["EXPECT"] assert req._continue is not None req.terminate() resp.close() await req.close() async def test_data_stream(loop, buf, conn) -> None: async def gen(): yield b"binary data" yield b" result" req = ClientRequest("POST", URL("http://python.org/"), data=gen(), loop=loop) assert req.chunked assert req.headers["TRANSFER-ENCODING"] == "chunked" resp = await req.send(conn) assert asyncio.isfuture(req._writer) await resp.wait_for_close() assert req._writer is None assert ( buf.split(b"\r\n\r\n", 1)[1] == b"b\r\nbinary data\r\n7\r\n result\r\n0\r\n\r\n" ) await req.close() async def test_data_stream_deprecated(loop, buf, conn) -> None: with pytest.warns(DeprecationWarning): @aiohttp.streamer async def gen(writer): await writer.write(b"binary data") await writer.write(b" result") req = ClientRequest("POST", URL("http://python.org/"), data=gen(), loop=loop) assert req.chunked assert req.headers["TRANSFER-ENCODING"] == "chunked" resp = await req.send(conn) assert asyncio.isfuture(req._writer) await resp.wait_for_close() assert req._writer is None assert ( buf.split(b"\r\n\r\n", 1)[1] == b"b\r\nbinary data\r\n7\r\n result\r\n0\r\n\r\n" ) await req.close() async def test_data_file(loop, buf, conn) -> None: with io.BufferedReader(io.BytesIO(b"*" * 2)) as file_handle: req = ClientRequest( "POST", URL("http://python.org/"), data=file_handle, loop=loop, ) assert req.chunked assert isinstance(req.body, payload.BufferedReaderPayload) assert req.headers["TRANSFER-ENCODING"] == "chunked" resp = await req.send(conn) assert asyncio.isfuture(req._writer) await resp.wait_for_close() assert req._writer is None assert buf.split(b"\r\n\r\n", 1)[1] == b"2\r\n" + b"*" * 2 + b"\r\n0\r\n\r\n" await req.close() async def test_data_stream_exc(loop, conn) -> None: fut = loop.create_future() async def gen(): yield b"binary data" await fut req = ClientRequest("POST", URL("http://python.org/"), data=gen(), loop=loop) assert req.chunked assert req.headers["TRANSFER-ENCODING"] == "chunked" async def throw_exc(): await asyncio.sleep(0.01) fut.set_exception(ValueError) loop.create_task(throw_exc()) await req.send(conn) await req._writer # assert conn.close.called assert conn.protocol.set_exception.called await req.close() async def test_data_stream_exc_chain(loop, conn) -> None: fut = loop.create_future() async def gen(): await fut return yield req = ClientRequest("POST", URL("http://python.org/"), data=gen(), loop=loop) inner_exc = ValueError() async def throw_exc(): await asyncio.sleep(0.01) fut.set_exception(inner_exc) loop.create_task(throw_exc()) await req.send(conn) await req._writer # assert connection.close.called assert conn.protocol.set_exception.called outer_exc = conn.protocol.set_exception.call_args[0][0] assert isinstance(outer_exc, ClientConnectionError) assert outer_exc.__cause__ is inner_exc await req.close() async def test_data_stream_continue(loop, buf, conn) -> None: async def gen(): yield b"binary data" yield b" result" req = ClientRequest( "POST", URL("http://python.org/"), data=gen(), expect100=True, loop=loop ) assert req.chunked async def coro(): await asyncio.sleep(0.0001) req._continue.set_result(1) loop.create_task(coro()) resp = await req.send(conn) await req._writer assert ( buf.split(b"\r\n\r\n", 1)[1] == b"b\r\nbinary data\r\n7\r\n result\r\n0\r\n\r\n" ) await req.close() resp.close() async def test_data_continue(loop, buf, conn) -> None: req = ClientRequest( "POST", URL("http://python.org/"), data=b"data", expect100=True, loop=loop ) async def coro(): await asyncio.sleep(0.0001) req._continue.set_result(1) loop.create_task(coro()) resp = await req.send(conn) await req._writer assert buf.split(b"\r\n\r\n", 1)[1] == b"data" await req.close() resp.close() async def test_close(loop, buf, conn) -> None: async def gen(): await asyncio.sleep(0.00001) yield b"result" req = ClientRequest("POST", URL("http://python.org/"), data=gen(), loop=loop) resp = await req.send(conn) await req.close() assert buf.split(b"\r\n\r\n", 1)[1] == b"6\r\nresult\r\n0\r\n\r\n" await req.close() resp.close() async def test_bad_version(loop, conn) -> None: req = ClientRequest( "GET", URL("http://python.org"), loop=loop, headers={"Connection": "Close"}, version=("1", "1\r\nInjected-Header: not allowed"), ) with pytest.raises(AttributeError): await req.send(conn) async def test_custom_response_class(loop, conn) -> None: class CustomResponse(ClientResponse): def read(self, decode=False): return "customized!" req = ClientRequest( "GET", URL("http://python.org/"), response_class=CustomResponse, loop=loop ) resp = await req.send(conn) assert "customized!" == resp.read() await req.close() resp.close() async def test_oserror_on_write_bytes(loop, conn) -> None: req = ClientRequest("POST", URL("http://python.org/"), loop=loop) writer = WriterMock() writer.write.side_effect = OSError await req.write_bytes(writer, conn) assert conn.protocol.set_exception.called exc = conn.protocol.set_exception.call_args[0][0] assert isinstance(exc, aiohttp.ClientOSError) await req.close() async def test_terminate(loop, conn) -> None: req = ClientRequest("get", URL("http://python.org"), loop=loop) resp = await req.send(conn) assert req._writer is not None writer = req._writer = WriterMock() writer.cancel = mock.Mock() req.terminate() assert req._writer is None writer.cancel.assert_called_with() resp.close() await req.close() def test_terminate_with_closed_loop(loop, conn) -> None: req = resp = writer = None async def go(): nonlocal req, resp, writer req = ClientRequest("get", URL("http://python.org")) resp = await req.send(conn) assert req._writer is not None writer = req._writer = WriterMock() await asyncio.sleep(0.05) loop.run_until_complete(go()) loop.run_until_complete(req.close()) loop.close() req.terminate() assert req._writer is None assert not writer.cancel.called resp.close() def test_terminate_without_writer(loop) -> None: req = ClientRequest("get", URL("http://python.org"), loop=loop) assert req._writer is None req.terminate() assert req._writer is None loop.run_until_complete(req.close()) async def test_custom_req_rep(loop) -> None: conn = None class CustomResponse(ClientResponse): async def start(self, connection, read_until_eof=False): nonlocal conn conn = connection self.status = 123 self.reason = "Test OK" self._headers = CIMultiDictProxy(CIMultiDict()) self.cookies = SimpleCookie() return called = False class CustomRequest(ClientRequest): async def send(self, conn): resp = self.response_class( self.method, self.url, writer=self._writer, continue100=self._continue, timer=self._timer, request_info=self.request_info, traces=self._traces, loop=self.loop, session=self._session, ) self.response = resp nonlocal called called = True return resp async def create_connection(req, traces, timeout): assert isinstance(req, CustomRequest) return mock.Mock() connector = BaseConnector(loop=loop) connector._create_connection = create_connection session = aiohttp.ClientSession( request_class=CustomRequest, response_class=CustomResponse, connector=connector, loop=loop, ) resp = await session.request("get", URL("http://example.com/path/to")) assert isinstance(resp, CustomResponse) assert called resp.close() await session.close() conn.close() def test_verify_ssl_false_with_ssl_context(loop, ssl_ctx) -> None: with pytest.warns(DeprecationWarning): with pytest.raises(ValueError): _merge_ssl_params( None, verify_ssl=False, ssl_context=ssl_ctx, fingerprint=None ) def test_bad_fingerprint(loop) -> None: with pytest.raises(ValueError): Fingerprint(b"invalid") def test_insecure_fingerprint_md5(loop) -> None: with pytest.raises(ValueError): Fingerprint(hashlib.md5(b"foo").digest()) def test_insecure_fingerprint_sha1(loop) -> None: with pytest.raises(ValueError): Fingerprint(hashlib.sha1(b"foo").digest()) def test_loose_cookies_types(loop) -> None: req = ClientRequest("get", URL("http://python.org"), loop=loop) morsel = Morsel() morsel.set(key="string", val="Another string", coded_val="really") accepted_types = [ [("str", BaseCookie())], [("str", morsel)], [ ("str", "str"), ], {"str": BaseCookie()}, {"str": morsel}, {"str": "str"}, SimpleCookie(), ] for loose_cookies_type in accepted_types: req.update_cookies(cookies=loose_cookies_type) loop.run_until_complete(req.close()) @pytest.mark.parametrize( "has_brotli,expected", [ (False, "gzip, deflate"), (True, "gzip, deflate, br"), ], ) def test_gen_default_accept_encoding(has_brotli, expected) -> None: with mock.patch("aiohttp.client_reqrep.HAS_BROTLI", has_brotli): assert _gen_default_accept_encoding() == expected @pytest.mark.parametrize( ("netrc_contents", "expected_auth"), [ ( "machine example.com login username password pass\n", helpers.BasicAuth("username", "pass"), ) ], indirect=("netrc_contents",), ) @pytest.mark.usefixtures("netrc_contents") def test_basicauth_from_netrc_present( make_request: Any, expected_auth: Optional[helpers.BasicAuth], ): """Test appropriate Authorization header is sent when netrc is not empty.""" req = make_request("get", "http://example.com", trust_env=True) assert req.headers[hdrs.AUTHORIZATION] == expected_auth.encode() @pytest.mark.parametrize( "netrc_contents", ("machine example.com login username password pass\n",), indirect=("netrc_contents",), ) @pytest.mark.usefixtures("netrc_contents") def test_basicauth_from_netrc_present_untrusted_env( make_request: Any, ): """Test no authorization header is sent via netrc if trust_env is False""" req = make_request("get", "http://example.com", trust_env=False) assert hdrs.AUTHORIZATION not in req.headers @pytest.mark.parametrize( "netrc_contents", ("",), indirect=("netrc_contents",), ) @pytest.mark.usefixtures("netrc_contents") def test_basicauth_from_empty_netrc( make_request: Any, ): """Test that no Authorization header is sent when netrc is empty""" req = make_request("get", "http://example.com", trust_env=True) assert hdrs.AUTHORIZATION not in req.headers ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_client_response.py0000644000175100001770000010305714607525266020577 0ustar00runnerdocker# Tests for aiohttp/client.py import gc import sys from typing import Callable from unittest import mock import pytest from multidict import CIMultiDict from yarl import URL import aiohttp from aiohttp import http from aiohttp.client_reqrep import ClientResponse, RequestInfo from aiohttp.helpers import TimerNoop from aiohttp.test_utils import make_mocked_coro class WriterMock(mock.AsyncMock): def __await__(self) -> None: return self().__await__() def add_done_callback(self, cb: Callable[[], None]) -> None: cb() def done(self) -> bool: return True @pytest.fixture def session(): return mock.Mock() async def test_http_processing_error(session) -> None: loop = mock.Mock() request_info = mock.Mock() response = ClientResponse( "get", URL("http://del-cl-resp.org"), request_info=request_info, writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) loop.get_debug = mock.Mock() loop.get_debug.return_value = True connection = mock.Mock() connection.protocol = aiohttp.DataQueue(loop) connection.protocol.set_response_params = mock.Mock() connection.protocol.set_exception(http.HttpProcessingError()) with pytest.raises(aiohttp.ClientResponseError) as info: await response.start(connection) assert info.value.request_info is request_info response.close() def test_del(session) -> None: loop = mock.Mock() response = ClientResponse( "get", URL("http://del-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) loop.get_debug = mock.Mock() loop.get_debug.return_value = True connection = mock.Mock() response._closed = False response._connection = connection loop.set_exception_handler(lambda loop, ctx: None) with pytest.warns(ResourceWarning): del response gc.collect() connection.release.assert_called_with() def test_close(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._closed = False response._connection = mock.Mock() response.close() assert response.connection is None response.close() response.close() def test_wait_for_100_1(loop, session) -> None: response = ClientResponse( "get", URL("http://python.org"), continue100=object(), request_info=mock.Mock(), writer=WriterMock(), timer=TimerNoop(), traces=[], loop=loop, session=session, ) assert response._continue is not None response.close() def test_wait_for_100_2(loop, session) -> None: response = ClientResponse( "get", URL("http://python.org"), request_info=mock.Mock(), continue100=None, writer=WriterMock(), timer=TimerNoop(), traces=[], loop=loop, session=session, ) assert response._continue is None response.close() def test_repr(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response.status = 200 response.reason = "Ok" assert "" in repr(response) def test_repr_non_ascii_url() -> None: response = ClientResponse( "get", URL("http://fake-host.org/\u03bb"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) assert "" in repr(response) def test_repr_non_ascii_reason() -> None: response = ClientResponse( "get", URL("http://fake-host.org/path"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.reason = "\u03bb" assert "" in repr( response ) def test_url_obj_deprecated() -> None: response = ClientResponse( "get", URL("http://fake-host.org/"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) with pytest.warns(DeprecationWarning): response.url_obj async def test_read_and_release_connection(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result(b"payload") return fut content = response.content = mock.Mock() content.read.side_effect = side_effect res = await response.read() assert res == b"payload" assert response._connection is None async def test_read_and_release_connection_with_error(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) content = response.content = mock.Mock() content.read.return_value = loop.create_future() content.read.return_value.set_exception(ValueError) with pytest.raises(ValueError): await response.read() assert response._closed async def test_release(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) fut = loop.create_future() fut.set_result(b"") content = response.content = mock.Mock() content.readany.return_value = fut response.release() assert response._connection is None @pytest.mark.skipif( sys.implementation.name != "cpython", reason="Other implementations has different GC strategies", ) async def test_release_on_del(loop, session) -> None: connection = mock.Mock() connection.protocol.upgraded = False def run(conn): response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._closed = False response._connection = conn run(connection) assert connection.release.called async def test_response_eof(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=None, continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._closed = False conn = response._connection = mock.Mock() conn.protocol.upgraded = False response._response_eof() assert conn.release.called assert response._connection is None async def test_response_eof_upgraded(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) conn = response._connection = mock.Mock() conn.protocol.upgraded = True response._response_eof() assert not conn.release.called assert response._connection is conn async def test_response_eof_after_connection_detach(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=None, continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._closed = False conn = response._connection = mock.Mock() conn.protocol = None response._response_eof() assert conn.release.called assert response._connection is None async def test_text(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = {"Content-Type": "application/json;charset=cp1251"} content = response.content = mock.Mock() content.read.side_effect = side_effect res = await response.text() assert res == '{"тест": "пройден"}' assert response._connection is None async def test_text_bad_encoding(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тестkey": "пройденvalue"}'.encode("cp1251")) return fut # lie about the encoding response._headers = {"Content-Type": "application/json;charset=utf-8"} content = response.content = mock.Mock() content.read.side_effect = side_effect with pytest.raises(UnicodeDecodeError): await response.text() # only the valid utf-8 characters will be returned res = await response.text(errors="ignore") assert res == '{"key": "value"}' assert response._connection is None async def test_text_custom_encoding(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = {"Content-Type": "application/json"} content = response.content = mock.Mock() content.read.side_effect = side_effect response.get_encoding = mock.Mock() res = await response.text(encoding="cp1251") assert res == '{"тест": "пройден"}' assert response._connection is None assert not response.get_encoding.called @pytest.mark.parametrize("content_type", ("text/plain", "text/plain;charset=invalid")) async def test_text_charset_resolver(content_type: str, loop, session) -> None: session._resolve_charset = lambda r, b: "cp1251" response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = {"Content-Type": content_type} content = response.content = mock.Mock() content.read.side_effect = side_effect await response.read() res = await response.text() assert res == '{"тест": "пройден"}' assert response._connection is None assert response.get_encoding() == "cp1251" async def test_get_encoding_body_none(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"encoding": "test"}') return fut response._headers = {"Content-Type": "text/html"} content = response.content = mock.Mock() content.read.side_effect = side_effect with pytest.raises( RuntimeError, match="^Cannot compute fallback encoding of a not yet read body$", ): response.get_encoding() assert response.closed async def test_text_after_read(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = {"Content-Type": "application/json;charset=cp1251"} content = response.content = mock.Mock() content.read.side_effect = side_effect res = await response.text() assert res == '{"тест": "пройден"}' assert response._connection is None async def test_json(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = {"Content-Type": "application/json;charset=cp1251"} content = response.content = mock.Mock() content.read.side_effect = side_effect res = await response.json() assert res == {"тест": "пройден"} assert response._connection is None async def test_json_extended_content_type(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = { "Content-Type": "application/this.is-1_content+subtype+json;charset=cp1251" } content = response.content = mock.Mock() content.read.side_effect = side_effect res = await response.json() assert res == {"тест": "пройден"} assert response._connection is None async def test_json_custom_content_type(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = {"Content-Type": "custom/type;charset=cp1251"} content = response.content = mock.Mock() content.read.side_effect = side_effect res = await response.json(content_type="custom/type") assert res == {"тест": "пройден"} assert response._connection is None async def test_json_custom_loader(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = {"Content-Type": "application/json;charset=cp1251"} response._body = b"data" def custom(content): return content + "-custom" res = await response.json(loads=custom) assert res == "data-custom" async def test_json_invalid_content_type(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = {"Content-Type": "data/octet-stream"} response._body = b"" with pytest.raises(aiohttp.ContentTypeError) as info: await response.json() assert info.value.request_info == response.request_info async def test_json_no_content(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = {"Content-Type": "data/octet-stream"} response._body = b"" res = await response.json(content_type=None) assert res is None async def test_json_override_encoding(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = {"Content-Type": "application/json;charset=utf8"} content = response.content = mock.Mock() content.read.side_effect = side_effect response.get_encoding = mock.Mock() res = await response.json(encoding="cp1251") assert res == {"тест": "пройден"} assert response._connection is None assert not response.get_encoding.called def test_get_encoding_unknown(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = {"Content-Type": "application/json"} assert response.get_encoding() == "utf-8" def test_raise_for_status_2xx() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 200 response.reason = "OK" response.raise_for_status() # should not raise def test_raise_for_status_4xx() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 409 response.reason = "CONFLICT" with pytest.raises(aiohttp.ClientResponseError) as cm: response.raise_for_status() assert str(cm.value.status) == "409" assert str(cm.value.message) == "CONFLICT" assert response.closed def test_raise_for_status_4xx_without_reason() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 404 response.reason = "" with pytest.raises(aiohttp.ClientResponseError) as cm: response.raise_for_status() assert str(cm.value.status) == "404" assert str(cm.value.message) == "" assert response.closed def test_resp_host() -> None: response = ClientResponse( "get", URL("http://del-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) assert "del-cl-resp.org" == response.host def test_content_type() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = {"Content-Type": "application/json;charset=cp1251"} assert "application/json" == response.content_type def test_content_type_no_header() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = {} assert "application/octet-stream" == response.content_type def test_charset() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = {"Content-Type": "application/json;charset=cp1251"} assert "cp1251" == response.charset def test_charset_no_header() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = {} assert response.charset is None def test_charset_no_charset() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = {"Content-Type": "application/json"} assert response.charset is None def test_content_disposition_full() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = { "Content-Disposition": 'attachment; filename="archive.tar.gz"; foo=bar' } assert "attachment" == response.content_disposition.type assert "bar" == response.content_disposition.parameters["foo"] assert "archive.tar.gz" == response.content_disposition.filename with pytest.raises(TypeError): response.content_disposition.parameters["foo"] = "baz" def test_content_disposition_no_parameters() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = {"Content-Disposition": "attachment"} assert "attachment" == response.content_disposition.type assert response.content_disposition.filename is None assert {} == response.content_disposition.parameters def test_content_disposition_no_header() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = {} assert response.content_disposition is None def test_response_request_info() -> None: url = "http://def-cl-resp.org" headers = {"Content-Type": "application/json;charset=cp1251"} response = ClientResponse( "get", URL(url), request_info=RequestInfo(url, "get", headers), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) assert url == response.request_info.url assert "get" == response.request_info.method assert headers == response.request_info.headers def test_request_info_in_exception() -> None: url = "http://def-cl-resp.org" headers = {"Content-Type": "application/json;charset=cp1251"} response = ClientResponse( "get", URL(url), request_info=RequestInfo(url, "get", headers), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 409 response.reason = "CONFLICT" with pytest.raises(aiohttp.ClientResponseError) as cm: response.raise_for_status() assert cm.value.request_info == response.request_info def test_no_redirect_history_in_exception() -> None: url = "http://def-cl-resp.org" headers = {"Content-Type": "application/json;charset=cp1251"} response = ClientResponse( "get", URL(url), request_info=RequestInfo(url, "get", headers), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 409 response.reason = "CONFLICT" with pytest.raises(aiohttp.ClientResponseError) as cm: response.raise_for_status() assert () == cm.value.history def test_redirect_history_in_exception() -> None: hist_url = "http://def-cl-resp.org" url = "http://def-cl-resp.org/index.htm" hist_headers = {"Content-Type": "application/json;charset=cp1251", "Location": url} headers = {"Content-Type": "application/json;charset=cp1251"} response = ClientResponse( "get", URL(url), request_info=RequestInfo(url, "get", headers), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 409 response.reason = "CONFLICT" hist_response = ClientResponse( "get", URL(hist_url), request_info=RequestInfo(url, "get", headers), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) hist_response._headers = hist_headers hist_response.status = 301 hist_response.reason = "REDIRECT" response._history = [hist_response] with pytest.raises(aiohttp.ClientResponseError) as cm: response.raise_for_status() assert [hist_response] == cm.value.history async def test_response_read_triggers_callback(loop, session) -> None: trace = mock.Mock() trace.send_response_chunk_received = make_mocked_coro() response_method = "get" response_url = URL("http://def-cl-resp.org") response_body = b"This is response" response = ClientResponse( response_method, response_url, request_info=mock.Mock, writer=WriterMock(), continue100=None, timer=TimerNoop(), loop=loop, session=session, traces=[trace], ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result(response_body) return fut response._headers = {"Content-Type": "application/json;charset=cp1251"} content = response.content = mock.Mock() content.read.side_effect = side_effect res = await response.read() assert res == response_body assert response._connection is None assert trace.send_response_chunk_received.called assert trace.send_response_chunk_received.call_args == mock.call( response_method, response_url, response_body ) def test_response_real_url(loop, session) -> None: url = URL("http://def-cl-resp.org/#urlfragment") response = ClientResponse( "get", url, request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) assert response.url == url.with_fragment(None) assert response.real_url == url def test_response_links_comma_separated(loop, session) -> None: url = URL("http://def-cl-resp.org/") response = ClientResponse( "get", url, request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = CIMultiDict( [ ( "Link", ( "; rel=next, " "; rel=home" ), ) ] ) assert response.links == { "next": {"url": URL("http://example.com/page/1.html"), "rel": "next"}, "home": {"url": URL("http://example.com/"), "rel": "home"}, } def test_response_links_multiple_headers(loop, session) -> None: url = URL("http://def-cl-resp.org/") response = ClientResponse( "get", url, request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = CIMultiDict( [ ("Link", "; rel=next"), ("Link", "; rel=home"), ] ) assert response.links == { "next": {"url": URL("http://example.com/page/1.html"), "rel": "next"}, "home": {"url": URL("http://example.com/"), "rel": "home"}, } def test_response_links_no_rel(loop, session) -> None: url = URL("http://def-cl-resp.org/") response = ClientResponse( "get", url, request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = CIMultiDict([("Link", "")]) assert response.links == { "http://example.com/": {"url": URL("http://example.com/")} } def test_response_links_quoted(loop, session) -> None: url = URL("http://def-cl-resp.org/") response = ClientResponse( "get", url, request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = CIMultiDict( [ ("Link", '; rel="home-page"'), ] ) assert response.links == { "home-page": {"url": URL("http://example.com/"), "rel": "home-page"} } def test_response_links_relative(loop, session) -> None: url = URL("http://def-cl-resp.org/") response = ClientResponse( "get", url, request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = CIMultiDict( [ ("Link", "; rel=rel"), ] ) assert response.links == { "rel": {"url": URL("http://def-cl-resp.org/relative/path"), "rel": "rel"} } def test_response_links_empty(loop, session) -> None: url = URL("http://def-cl-resp.org/") response = ClientResponse( "get", url, request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = CIMultiDict() assert response.links == {} def test_response_not_closed_after_get_ok(mocker) -> None: response = ClientResponse( "get", URL("http://del-cl-resp.org"), request_info=mock.Mock(), writer=WriterMock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 400 response.reason = "Bad Request" response._closed = False spy = mocker.spy(response, "raise_for_status") assert not response.ok assert not response.closed assert spy.call_count == 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_client_session.py0000644000175100001770000007076514607525266020435 0ustar00runnerdockerimport asyncio import contextlib import gc import io import json from http.cookies import SimpleCookie from typing import Any, List from unittest import mock import pytest from multidict import CIMultiDict, MultiDict from re_assert import Matches from yarl import URL import aiohttp from aiohttp import client, hdrs, web from aiohttp.client import ClientSession from aiohttp.client_reqrep import ClientRequest from aiohttp.connector import BaseConnector, TCPConnector from aiohttp.helpers import DEBUG from aiohttp.test_utils import make_mocked_coro @pytest.fixture def connector(loop): async def make_conn(): return BaseConnector(loop=loop) conn = loop.run_until_complete(make_conn()) proto = mock.Mock() conn._conns["a"] = [(proto, 123)] yield conn loop.run_until_complete(conn.close()) @pytest.fixture def create_session(loop): session = None async def maker(*args, **kwargs): nonlocal session session = ClientSession(*args, loop=loop, **kwargs) return session yield maker if session is not None: loop.run_until_complete(session.close()) @pytest.fixture def session(create_session, loop): return loop.run_until_complete(create_session()) @pytest.fixture def params(): return dict( headers={"Authorization": "Basic ..."}, max_redirects=2, encoding="latin1", version=aiohttp.HttpVersion10, compress="deflate", chunked=True, expect100=True, read_until_eof=False, ) async def test_close_coro(create_session) -> None: session = await create_session() await session.close() async def test_init_headers_simple_dict(create_session) -> None: session = await create_session(headers={"h1": "header1", "h2": "header2"}) assert sorted(session.headers.items()) == ([("h1", "header1"), ("h2", "header2")]) async def test_init_headers_list_of_tuples(create_session) -> None: session = await create_session( headers=[("h1", "header1"), ("h2", "header2"), ("h3", "header3")] ) assert session.headers == CIMultiDict( [("h1", "header1"), ("h2", "header2"), ("h3", "header3")] ) async def test_init_headers_MultiDict(create_session) -> None: session = await create_session( headers=MultiDict([("h1", "header1"), ("h2", "header2"), ("h3", "header3")]) ) assert session.headers == CIMultiDict( [("H1", "header1"), ("H2", "header2"), ("H3", "header3")] ) async def test_init_headers_list_of_tuples_with_duplicates(create_session) -> None: session = await create_session( headers=[("h1", "header11"), ("h2", "header21"), ("h1", "header12")] ) assert session.headers == CIMultiDict( [("H1", "header11"), ("H2", "header21"), ("H1", "header12")] ) async def test_init_cookies_with_simple_dict(create_session) -> None: session = await create_session(cookies={"c1": "cookie1", "c2": "cookie2"}) cookies = session.cookie_jar.filter_cookies() assert set(cookies) == {"c1", "c2"} assert cookies["c1"].value == "cookie1" assert cookies["c2"].value == "cookie2" async def test_init_cookies_with_list_of_tuples(create_session) -> None: session = await create_session(cookies=[("c1", "cookie1"), ("c2", "cookie2")]) cookies = session.cookie_jar.filter_cookies() assert set(cookies) == {"c1", "c2"} assert cookies["c1"].value == "cookie1" assert cookies["c2"].value == "cookie2" async def test_merge_headers(create_session) -> None: # Check incoming simple dict session = await create_session(headers={"h1": "header1", "h2": "header2"}) headers = session._prepare_headers({"h1": "h1"}) assert isinstance(headers, CIMultiDict) assert headers == {"h1": "h1", "h2": "header2"} async def test_merge_headers_with_multi_dict(create_session) -> None: session = await create_session(headers={"h1": "header1", "h2": "header2"}) headers = session._prepare_headers(MultiDict([("h1", "h1")])) assert isinstance(headers, CIMultiDict) assert headers == {"h1": "h1", "h2": "header2"} async def test_merge_headers_with_list_of_tuples(create_session) -> None: session = await create_session(headers={"h1": "header1", "h2": "header2"}) headers = session._prepare_headers([("h1", "h1")]) assert isinstance(headers, CIMultiDict) assert headers == {"h1": "h1", "h2": "header2"} async def test_merge_headers_with_list_of_tuples_duplicated_names( create_session, ) -> None: session = await create_session(headers={"h1": "header1", "h2": "header2"}) headers = session._prepare_headers([("h1", "v1"), ("h1", "v2")]) assert isinstance(headers, CIMultiDict) assert list(sorted(headers.items())) == [ ("h1", "v1"), ("h1", "v2"), ("h2", "header2"), ] def test_http_GET(session, params) -> None: with mock.patch( "aiohttp.client.ClientSession._request", new_callable=mock.MagicMock ) as patched: session.get("http://test.example.com", params={"x": 1}, **params) assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args) == [ ( "GET", "http://test.example.com", ), dict(params={"x": 1}, allow_redirects=True, **params), ] def test_http_OPTIONS(session, params) -> None: with mock.patch( "aiohttp.client.ClientSession._request", new_callable=mock.MagicMock ) as patched: session.options("http://opt.example.com", params={"x": 2}, **params) assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args) == [ ( "OPTIONS", "http://opt.example.com", ), dict(params={"x": 2}, allow_redirects=True, **params), ] def test_http_HEAD(session, params) -> None: with mock.patch( "aiohttp.client.ClientSession._request", new_callable=mock.MagicMock ) as patched: session.head("http://head.example.com", params={"x": 2}, **params) assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args) == [ ( "HEAD", "http://head.example.com", ), dict(params={"x": 2}, allow_redirects=False, **params), ] def test_http_POST(session, params) -> None: with mock.patch( "aiohttp.client.ClientSession._request", new_callable=mock.MagicMock ) as patched: session.post( "http://post.example.com", params={"x": 2}, data="Some_data", **params ) assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args) == [ ( "POST", "http://post.example.com", ), dict(params={"x": 2}, data="Some_data", **params), ] def test_http_PUT(session, params) -> None: with mock.patch( "aiohttp.client.ClientSession._request", new_callable=mock.MagicMock ) as patched: session.put( "http://put.example.com", params={"x": 2}, data="Some_data", **params ) assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args) == [ ( "PUT", "http://put.example.com", ), dict(params={"x": 2}, data="Some_data", **params), ] def test_http_PATCH(session, params) -> None: with mock.patch( "aiohttp.client.ClientSession._request", new_callable=mock.MagicMock ) as patched: session.patch( "http://patch.example.com", params={"x": 2}, data="Some_data", **params ) assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args) == [ ( "PATCH", "http://patch.example.com", ), dict(params={"x": 2}, data="Some_data", **params), ] def test_http_DELETE(session, params) -> None: with mock.patch( "aiohttp.client.ClientSession._request", new_callable=mock.MagicMock ) as patched: session.delete("http://delete.example.com", params={"x": 2}, **params) assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args) == [ ( "DELETE", "http://delete.example.com", ), dict(params={"x": 2}, **params), ] async def test_close(create_session, connector) -> None: session = await create_session(connector=connector) await session.close() assert session.connector is None assert connector.closed async def test_closed(session) -> None: assert not session.closed await session.close() assert session.closed async def test_connector(create_session, loop, mocker) -> None: connector = TCPConnector(loop=loop) mocker.spy(connector, "close") session = await create_session(connector=connector) assert session.connector is connector await session.close() assert connector.close.called await connector.close() async def test_create_connector(create_session, loop, mocker) -> None: session = await create_session() connector = session.connector mocker.spy(session.connector, "close") await session.close() assert connector.close.called def test_connector_loop(loop) -> None: with contextlib.ExitStack() as stack: another_loop = asyncio.new_event_loop() stack.enter_context(contextlib.closing(another_loop)) async def make_connector(): return TCPConnector() connector = another_loop.run_until_complete(make_connector()) with pytest.raises(RuntimeError) as ctx: async def make_sess(): return ClientSession(connector=connector, loop=loop) loop.run_until_complete(make_sess()) assert ( Matches("Session and connector has to use same event loop") == str(ctx.value).strip() ) another_loop.run_until_complete(connector.close()) def test_detach(loop, session) -> None: conn = session.connector try: assert not conn.closed session.detach() assert session.connector is None assert session.closed assert not conn.closed finally: loop.run_until_complete(conn.close()) async def test_request_closed_session(session) -> None: await session.close() with pytest.raises(RuntimeError): await session.request("get", "/") def test_close_flag_for_closed_connector(loop, session) -> None: conn = session.connector assert not session.closed loop.run_until_complete(conn.close()) assert session.closed async def test_double_close(connector, create_session) -> None: session = await create_session(connector=connector) await session.close() assert session.connector is None await session.close() assert session.closed assert connector.closed async def test_del(connector, loop) -> None: loop.set_debug(False) # N.B. don't use session fixture, it stores extra reference internally session = ClientSession(connector=connector, loop=loop) logs = [] loop.set_exception_handler(lambda loop, ctx: logs.append(ctx)) with pytest.warns(ResourceWarning): del session gc.collect() assert len(logs) == 1 expected = {"client_session": mock.ANY, "message": "Unclosed client session"} assert logs[0] == expected async def test_del_debug(connector, loop) -> None: loop.set_debug(True) # N.B. don't use session fixture, it stores extra reference internally session = ClientSession(connector=connector, loop=loop) logs = [] loop.set_exception_handler(lambda loop, ctx: logs.append(ctx)) with pytest.warns(ResourceWarning): del session gc.collect() assert len(logs) == 1 expected = { "client_session": mock.ANY, "message": "Unclosed client session", "source_traceback": mock.ANY, } assert logs[0] == expected async def test_session_context_manager(connector, loop) -> None: with pytest.raises(TypeError): with ClientSession(loop=loop, connector=connector) as session: pass assert session.closed async def test_borrow_connector_loop(connector, create_session, loop) -> None: session = ClientSession(connector=connector, loop=None) try: assert session._loop, loop finally: await session.close() async def test_reraise_os_error(create_session) -> None: err = OSError(1, "permission error") req = mock.Mock() req_factory = mock.Mock(return_value=req) req.send = mock.Mock(side_effect=err) session = await create_session(request_class=req_factory) async def create_connection(req, traces, timeout): # return self.transport, self.protocol return mock.Mock() session._connector._create_connection = create_connection session._connector._release = mock.Mock() with pytest.raises(aiohttp.ClientOSError) as ctx: await session.request("get", "http://example.com") e = ctx.value assert e.errno == err.errno assert e.strerror == err.strerror async def test_close_conn_on_error(create_session) -> None: class UnexpectedException(BaseException): pass err = UnexpectedException("permission error") req = mock.Mock() req_factory = mock.Mock(return_value=req) req.send = mock.Mock(side_effect=err) session = await create_session(request_class=req_factory) connections = [] original_connect = session._connector.connect async def connect(req, traces, timeout): conn = await original_connect(req, traces, timeout) connections.append(conn) return conn async def create_connection(req, traces, timeout): # return self.transport, self.protocol conn = mock.Mock() return conn session._connector.connect = connect session._connector._create_connection = create_connection session._connector._release = mock.Mock() with pytest.raises(UnexpectedException): async with session.request("get", "http://example.com") as resp: await resp.text() # normally called during garbage collection. triggers an exception # if the connection wasn't already closed for c in connections: c.__del__() async def test_cookie_jar_usage(loop, aiohttp_client) -> None: req_url = None jar = mock.Mock() jar.filter_cookies.return_value = None async def handler(request): nonlocal req_url req_url = "http://%s/" % request.host resp = web.Response() resp.set_cookie("response", "resp_value") return resp app = web.Application() app.router.add_route("GET", "/", handler) session = await aiohttp_client( app, cookies={"request": "req_value"}, cookie_jar=jar ) # Updating the cookie jar with initial user defined cookies jar.update_cookies.assert_called_with({"request": "req_value"}) jar.update_cookies.reset_mock() resp = await session.get("/") await resp.release() # Filtering the cookie jar before sending the request, # getting the request URL as only parameter jar.filter_cookies.assert_called_with(URL(req_url)) # Updating the cookie jar with the response cookies assert jar.update_cookies.called resp_cookies = jar.update_cookies.call_args[0][0] assert isinstance(resp_cookies, SimpleCookie) assert "response" in resp_cookies assert resp_cookies["response"].value == "resp_value" async def test_session_default_version(loop) -> None: session = aiohttp.ClientSession(loop=loop) assert session.version == aiohttp.HttpVersion11 await session.close() async def test_session_loop(loop) -> None: session = aiohttp.ClientSession(loop=loop) with pytest.warns(DeprecationWarning): assert session.loop is loop await session.close() def test_proxy_str(session, params) -> None: with mock.patch( "aiohttp.client.ClientSession._request", new_callable=mock.MagicMock ) as patched: session.get("http://test.example.com", proxy="http://proxy.com", **params) assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args) == [ ( "GET", "http://test.example.com", ), dict(allow_redirects=True, proxy="http://proxy.com", **params), ] async def test_request_tracing(loop, aiohttp_client) -> None: async def handler(request): return web.json_response({"ok": True}) app = web.Application() app.router.add_post("/", handler) trace_config_ctx = mock.Mock() trace_request_ctx = {} body = "This is request body" gathered_req_headers = CIMultiDict() on_request_start = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_request_redirect = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_request_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) with io.BytesIO() as gathered_req_body, io.BytesIO() as gathered_res_body: async def on_request_chunk_sent(session, context, params): gathered_req_body.write(params.chunk) async def on_response_chunk_received(session, context, params): gathered_res_body.write(params.chunk) async def on_request_headers_sent(session, context, params): gathered_req_headers.extend(**params.headers) trace_config = aiohttp.TraceConfig( trace_config_ctx_factory=mock.Mock(return_value=trace_config_ctx) ) trace_config.on_request_start.append(on_request_start) trace_config.on_request_end.append(on_request_end) trace_config.on_request_chunk_sent.append(on_request_chunk_sent) trace_config.on_response_chunk_received.append(on_response_chunk_received) trace_config.on_request_redirect.append(on_request_redirect) trace_config.on_request_headers_sent.append(on_request_headers_sent) headers = CIMultiDict({"Custom-Header": "Custom value"}) session = await aiohttp_client( app, trace_configs=[trace_config], headers=headers ) async with session.post( "/", data=body, trace_request_ctx=trace_request_ctx ) as resp: await resp.json() on_request_start.assert_called_once_with( session.session, trace_config_ctx, aiohttp.TraceRequestStartParams( hdrs.METH_POST, session.make_url("/"), headers ), ) on_request_end.assert_called_once_with( session.session, trace_config_ctx, aiohttp.TraceRequestEndParams( hdrs.METH_POST, session.make_url("/"), headers, resp ), ) assert not on_request_redirect.called assert gathered_req_body.getvalue() == body.encode("utf8") assert gathered_res_body.getvalue() == json.dumps({"ok": True}).encode( "utf8" ) assert gathered_req_headers["Custom-Header"] == "Custom value" async def test_request_tracing_url_params(loop: Any, aiohttp_client: Any) -> None: async def root_handler(request): return web.Response() async def redirect_handler(request): raise web.HTTPFound("/") app = web.Application() app.router.add_get("/", root_handler) app.router.add_get("/redirect", redirect_handler) mocks = [mock.Mock(side_effect=make_mocked_coro(mock.Mock())) for _ in range(7)] ( on_request_start, on_request_redirect, on_request_end, on_request_exception, on_request_chunk_sent, on_response_chunk_received, on_request_headers_sent, ) = mocks trace_config = aiohttp.TraceConfig( trace_config_ctx_factory=mock.Mock(return_value=mock.Mock()) ) trace_config.on_request_start.append(on_request_start) trace_config.on_request_redirect.append(on_request_redirect) trace_config.on_request_end.append(on_request_end) trace_config.on_request_exception.append(on_request_exception) trace_config.on_request_chunk_sent.append(on_request_chunk_sent) trace_config.on_response_chunk_received.append(on_response_chunk_received) trace_config.on_request_headers_sent.append(on_request_headers_sent) session = await aiohttp_client(app, trace_configs=[trace_config]) def reset_mocks() -> None: for m in mocks: m.reset_mock() def to_trace_urls(mock_func: mock.Mock) -> List[URL]: return [call_args[0][-1].url for call_args in mock_func.call_args_list] def to_url(path: str) -> URL: return session.make_url(path) # Standard for req in [ lambda: session.get("/?x=0"), lambda: session.get("/", params=dict(x=0)), ]: reset_mocks() async with req() as resp: await resp.text() assert to_trace_urls(on_request_start) == [to_url("/?x=0")] assert to_trace_urls(on_request_redirect) == [] assert to_trace_urls(on_request_end) == [to_url("/?x=0")] assert to_trace_urls(on_request_exception) == [] assert to_trace_urls(on_request_chunk_sent) == [to_url("/?x=0")] assert to_trace_urls(on_response_chunk_received) == [to_url("/?x=0")] assert to_trace_urls(on_request_headers_sent) == [to_url("/?x=0")] # Redirect for req in [ lambda: session.get("/redirect?x=0"), lambda: session.get("/redirect", params=dict(x=0)), ]: reset_mocks() async with req() as resp: await resp.text() assert to_trace_urls(on_request_start) == [to_url("/redirect?x=0")] assert to_trace_urls(on_request_redirect) == [to_url("/redirect?x=0")] assert to_trace_urls(on_request_end) == [to_url("/")] assert to_trace_urls(on_request_exception) == [] assert to_trace_urls(on_request_chunk_sent) == [ to_url("/redirect?x=0"), to_url("/"), ] assert to_trace_urls(on_response_chunk_received) == [to_url("/")] assert to_trace_urls(on_request_headers_sent) == [ to_url("/redirect?x=0"), to_url("/"), ] # Exception with mock.patch("aiohttp.client.TCPConnector.connect") as connect_patched: connect_patched.side_effect = Exception() for req in [ lambda: session.get("/?x=0"), lambda: session.get("/", params=dict(x=0)), ]: reset_mocks() with contextlib.suppress(Exception): await req() assert to_trace_urls(on_request_start) == [to_url("/?x=0")] assert to_trace_urls(on_request_redirect) == [] assert to_trace_urls(on_request_end) == [] assert to_trace_urls(on_request_exception) == [to_url("?x=0")] assert to_trace_urls(on_request_chunk_sent) == [] assert to_trace_urls(on_response_chunk_received) == [] assert to_trace_urls(on_request_headers_sent) == [] async def test_request_tracing_exception() -> None: loop = asyncio.get_event_loop() on_request_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_request_exception = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) trace_config = aiohttp.TraceConfig() trace_config.on_request_end.append(on_request_end) trace_config.on_request_exception.append(on_request_exception) with mock.patch("aiohttp.client.TCPConnector.connect") as connect_patched: error = Exception() connect_patched.side_effect = error session = aiohttp.ClientSession(loop=loop, trace_configs=[trace_config]) try: await session.get("http://example.com") except Exception: pass on_request_exception.assert_called_once_with( session, mock.ANY, aiohttp.TraceRequestExceptionParams( hdrs.METH_GET, URL("http://example.com"), CIMultiDict(), error ), ) assert not on_request_end.called await session.close() async def test_request_tracing_interpose_headers(loop, aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) class MyClientRequest(ClientRequest): headers = None def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) MyClientRequest.headers = self.headers async def new_headers(session, trace_config_ctx, data): data.headers["foo"] = "bar" trace_config = aiohttp.TraceConfig() trace_config.on_request_start.append(new_headers) session = await aiohttp_client( app, request_class=MyClientRequest, trace_configs=[trace_config] ) await session.get("/") assert MyClientRequest.headers["foo"] == "bar" def test_client_session_inheritance() -> None: with pytest.warns(DeprecationWarning): class A(ClientSession): pass @pytest.mark.skipif(not DEBUG, reason="The check is applied in DEBUG mode only") async def test_client_session_custom_attr(loop) -> None: session = ClientSession(loop=loop) with pytest.warns(DeprecationWarning): session.custom = None await session.close() async def test_client_session_timeout_args(loop) -> None: session1 = ClientSession(loop=loop) assert session1._timeout == client.DEFAULT_TIMEOUT with pytest.warns(DeprecationWarning): session2 = ClientSession(loop=loop, read_timeout=20 * 60, conn_timeout=30 * 60) assert session2._timeout == client.ClientTimeout(total=20 * 60, connect=30 * 60) with pytest.raises(ValueError): ClientSession( loop=loop, timeout=client.ClientTimeout(total=10 * 60), read_timeout=20 * 60 ) with pytest.raises(ValueError): ClientSession( loop=loop, timeout=client.ClientTimeout(total=10 * 60), conn_timeout=30 * 60 ) await session1.close() await session2.close() async def test_client_session_timeout_default_args(loop) -> None: session1 = ClientSession() assert session1.timeout == client.DEFAULT_TIMEOUT await session1.close() async def test_client_session_timeout_zero() -> None: timeout = client.ClientTimeout(total=10, connect=0, sock_connect=0, sock_read=0) try: async with ClientSession(timeout=timeout) as session: await session.get("http://example.com") except asyncio.TimeoutError: pytest.fail("0 should disable timeout.") async def test_client_session_timeout_bad_argument() -> None: with pytest.raises(ValueError): ClientSession(timeout="test_bad_argumnet") with pytest.raises(ValueError): ClientSession(timeout=100) async def test_requote_redirect_url_default() -> None: session = ClientSession() assert session.requote_redirect_url await session.close() async def test_requote_redirect_url_default_disable() -> None: session = ClientSession(requote_redirect_url=False) assert not session.requote_redirect_url await session.close() async def test_requote_redirect_setter() -> None: session = ClientSession() assert session.requote_redirect_url with pytest.warns(DeprecationWarning): session.requote_redirect_url = False assert not session.requote_redirect_url await session.close() @pytest.mark.parametrize( ("base_url", "url", "expected_url"), [ pytest.param( None, "http://example.com/test", URL("http://example.com/test"), id="base_url=None url='http://example.com/test'", ), pytest.param( None, URL("http://example.com/test"), URL("http://example.com/test"), id="base_url=None url=URL('http://example.com/test')", ), pytest.param( "http://example.com", "/test", URL("http://example.com/test"), id="base_url='http://example.com' url='/test'", ), pytest.param( URL("http://example.com"), "/test", URL("http://example.com/test"), id="base_url=URL('http://example.com') url='/test'", ), ], ) async def test_build_url_returns_expected_url( create_session, base_url, url, expected_url ) -> None: session = await create_session(base_url) assert session._build_url(url) == expected_url async def test_instantiation_with_invalid_timeout_value(loop): loop.set_debug(False) logs = [] loop.set_exception_handler(lambda loop, ctx: logs.append(ctx)) with pytest.raises(ValueError, match="timeout parameter cannot be .*"): ClientSession(timeout=1) # should not have "Unclosed client session" warning assert not logs ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_client_ws.py0000644000175100001770000006266214607525266017400 0ustar00runnerdockerimport asyncio import base64 import hashlib import os from unittest import mock import pytest import aiohttp from aiohttp import client, hdrs from aiohttp.http import WS_KEY from aiohttp.streams import EofStream from aiohttp.test_utils import make_mocked_coro @pytest.fixture def key_data(): return os.urandom(16) @pytest.fixture def key(key_data): return base64.b64encode(key_data) @pytest.fixture def ws_key(key): return base64.b64encode(hashlib.sha1(key + WS_KEY).digest()).decode() async def test_ws_connect(ws_key, loop, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_PROTOCOL: "chat", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) res = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", protocols=("t1", "t2", "chat") ) assert isinstance(res, client.ClientWebSocketResponse) assert res.protocol == "chat" assert hdrs.ORIGIN not in m_req.call_args[1]["headers"] async def test_ws_connect_with_origin(key_data, loop) -> None: resp = mock.Mock() resp.status = 403 with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) origin = "https://example.org/page.html" with pytest.raises(client.WSServerHandshakeError): await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", origin=origin ) assert hdrs.ORIGIN in m_req.call_args[1]["headers"] assert m_req.call_args[1]["headers"][hdrs.ORIGIN] == origin async def test_ws_connect_with_params(ws_key, loop, key_data) -> None: params = {"key1": "value1", "key2": "value2"} resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_PROTOCOL: "chat", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) await aiohttp.ClientSession().ws_connect( "http://test.org", protocols=("t1", "t2", "chat"), params=params ) assert m_req.call_args[1]["params"] == params async def test_ws_connect_custom_response(loop, ws_key, key_data) -> None: class CustomResponse(client.ClientWebSocketResponse): def read(self, decode=False): return "customized!" resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) res = await aiohttp.ClientSession( ws_response_class=CustomResponse, loop=loop ).ws_connect("http://test.org") assert res.read() == "customized!" async def test_ws_connect_err_status(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 500 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) with pytest.raises(client.WSServerHandshakeError) as ctx: await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", protocols=("t1", "t2", "chat") ) assert ctx.value.message == "Invalid response status" async def test_ws_connect_err_upgrade(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "test", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) with pytest.raises(client.WSServerHandshakeError) as ctx: await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", protocols=("t1", "t2", "chat") ) assert ctx.value.message == "Invalid upgrade header" async def test_ws_connect_err_conn(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "close", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) with pytest.raises(client.WSServerHandshakeError) as ctx: await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", protocols=("t1", "t2", "chat") ) assert ctx.value.message == "Invalid connection header" async def test_ws_connect_err_challenge(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: "asdfasdfasdfasdfasdfasdf", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) with pytest.raises(client.WSServerHandshakeError) as ctx: await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", protocols=("t1", "t2", "chat") ) assert ctx.value.message == "Invalid challenge response" async def test_ws_connect_common_headers(ws_key, loop, key_data) -> None: # Emulate a headers dict being reused for a second ws_connect. # In this scenario, we need to ensure that the newly generated secret key # is sent to the server, not the stale key. headers = {} async def test_connection() -> None: async def mock_get(*args, **kwargs): resp = mock.Mock() resp.status = 101 key = kwargs.get("headers").get(hdrs.SEC_WEBSOCKET_KEY) accept = base64.b64encode( hashlib.sha1(base64.b64encode(base64.b64decode(key)) + WS_KEY).digest() ).decode() resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: accept, hdrs.SEC_WEBSOCKET_PROTOCOL: "chat", } return resp with mock.patch("aiohttp.client.os") as m_os: with mock.patch( "aiohttp.client.ClientSession.request", side_effect=mock_get ) as m_req: m_os.urandom.return_value = key_data res = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", protocols=("t1", "t2", "chat"), headers=headers ) assert isinstance(res, client.ClientWebSocketResponse) assert res.protocol == "chat" assert hdrs.ORIGIN not in m_req.call_args[1]["headers"] await test_connection() # Generate a new ws key key_data = os.urandom(16) await test_connection() async def test_close(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.WebSocketWriter") as WebSocketWriter: with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) writer = mock.Mock() WebSocketWriter.return_value = writer writer.close = make_mocked_coro() session = aiohttp.ClientSession(loop=loop) resp = await session.ws_connect("http://test.org") assert not resp.closed resp._reader.feed_data( aiohttp.WSMessage(aiohttp.WSMsgType.CLOSE, b"", b""), 0 ) res = await resp.close() writer.close.assert_called_with(1000, b"") assert resp.closed assert res assert resp.exception() is None # idempotent res = await resp.close() assert not res assert writer.close.call_count == 1 await session.close() async def test_close_eofstream(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.WebSocketWriter") as WebSocketWriter: with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) writer = WebSocketWriter.return_value = mock.Mock() session = aiohttp.ClientSession(loop=loop) resp = await session.ws_connect("http://test.org") assert not resp.closed exc = EofStream() resp._reader.set_exception(exc) await resp.receive() writer.close.assert_called_with(1000, b"") assert resp.closed await session.close() async def test_close_exc(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.WebSocketWriter") as WebSocketWriter: with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) writer = mock.Mock() WebSocketWriter.return_value = writer writer.close = make_mocked_coro() session = aiohttp.ClientSession(loop=loop) resp = await session.ws_connect("http://test.org") assert not resp.closed exc = ValueError() resp._reader.set_exception(exc) await resp.close() assert resp.closed assert resp.exception() is exc await session.close() async def test_close_exc2(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.WebSocketWriter") as WebSocketWriter: with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) writer = WebSocketWriter.return_value = mock.Mock() resp = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org" ) assert not resp.closed exc = ValueError() writer.close.side_effect = exc await resp.close() assert resp.closed assert resp.exception() is exc resp._closed = False writer.close.side_effect = asyncio.CancelledError() with pytest.raises(asyncio.CancelledError): await resp.close() async def test_send_data_after_close(ws_key, key_data, loop) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) resp = await aiohttp.ClientSession(loop=loop).ws_connect("http://test.org") resp._writer._closing = True for meth, args in ( (resp.ping, ()), (resp.pong, ()), (resp.send_str, ("s",)), (resp.send_bytes, (b"b",)), (resp.send_json, ({},)), ): with pytest.raises(ConnectionResetError): await meth(*args) async def test_send_data_type_errors(ws_key, key_data, loop) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.WebSocketWriter") as WebSocketWriter: with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) WebSocketWriter.return_value = mock.Mock() resp = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org" ) with pytest.raises(TypeError): await resp.send_str(b"s") with pytest.raises(TypeError): await resp.send_bytes("b") with pytest.raises(TypeError): await resp.send_json(set()) async def test_reader_read_exception(ws_key, key_data, loop) -> None: hresp = mock.Mock() hresp.status = 101 hresp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.WebSocketWriter") as WebSocketWriter: with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(hresp) writer = mock.Mock() WebSocketWriter.return_value = writer writer.close = make_mocked_coro() session = aiohttp.ClientSession(loop=loop) resp = await session.ws_connect("http://test.org") exc = ValueError() resp._reader.set_exception(exc) msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.ERROR assert resp.exception() is exc await session.close() async def test_receive_runtime_err(loop) -> None: resp = client.ClientWebSocketResponse( mock.Mock(), mock.Mock(), mock.Mock(), mock.Mock(), 10.0, True, True, loop ) resp._waiting = True with pytest.raises(RuntimeError): await resp.receive() async def test_ws_connect_close_resp_on_err(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 500 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) with pytest.raises(client.WSServerHandshakeError): await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", protocols=("t1", "t2", "chat") ) resp.close.assert_called_with() async def test_ws_connect_non_overlapped_protocols(ws_key, loop, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_PROTOCOL: "other,another", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) res = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", protocols=("t1", "t2", "chat") ) assert res.protocol is None async def test_ws_connect_non_overlapped_protocols_2(ws_key, loop, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_PROTOCOL: "other,another", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) connector = aiohttp.TCPConnector(loop=loop, force_close=True) res = await aiohttp.ClientSession( connector=connector, loop=loop ).ws_connect("http://test.org", protocols=("t1", "t2", "chat")) assert res.protocol is None del res async def test_ws_connect_deflate(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_EXTENSIONS: "permessage-deflate", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) res = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", compress=15 ) assert res.compress == 15 assert res.client_notakeover is False async def test_ws_connect_deflate_per_message(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_EXTENSIONS: "permessage-deflate", } with mock.patch("aiohttp.client.WebSocketWriter") as WebSocketWriter: with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) writer = WebSocketWriter.return_value = mock.Mock() send = writer.send = make_mocked_coro() session = aiohttp.ClientSession(loop=loop) resp = await session.ws_connect("http://test.org") await resp.send_str("string", compress=-1) send.assert_called_with("string", binary=False, compress=-1) await resp.send_bytes(b"bytes", compress=15) send.assert_called_with(b"bytes", binary=True, compress=15) await resp.send_json([{}], compress=-9) send.assert_called_with("[{}]", binary=False, compress=-9) await session.close() async def test_ws_connect_deflate_server_not_support(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) res = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", compress=15 ) assert res.compress == 0 assert res.client_notakeover is False async def test_ws_connect_deflate_notakeover(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_EXTENSIONS: "permessage-deflate; " "client_no_context_takeover", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) res = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", compress=15 ) assert res.compress == 15 assert res.client_notakeover is True async def test_ws_connect_deflate_client_wbits(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_EXTENSIONS: "permessage-deflate; " "client_max_window_bits=10", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) res = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", compress=15 ) assert res.compress == 10 assert res.client_notakeover is False async def test_ws_connect_deflate_client_wbits_bad(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_EXTENSIONS: "permessage-deflate; " "client_max_window_bits=6", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) with pytest.raises(client.WSServerHandshakeError): await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", compress=15 ) async def test_ws_connect_deflate_server_ext_bad(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_EXTENSIONS: "permessage-deflate; bad", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) with pytest.raises(client.WSServerHandshakeError): await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", compress=15 ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_client_ws_functional.py0000644000175100001770000005342414607525266021616 0ustar00runnerdockerimport asyncio import sys import pytest import aiohttp from aiohttp import hdrs, web from aiohttp.http import WSCloseCode if sys.version_info >= (3, 11): import asyncio as async_timeout else: import async_timeout async def test_send_recv_text(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_str() await ws.send_str(msg + "/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_str("ask") assert resp.get_extra_info("socket") is not None data = await resp.receive_str() assert data == "ask/answer" await resp.close() assert resp.get_extra_info("socket") is None async def test_send_recv_bytes_bad_type(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_str() await ws.send_str(msg + "/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_str("ask") with pytest.raises(TypeError): await resp.receive_bytes() await resp.close() async def test_send_recv_bytes(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_bytes() await ws.send_bytes(msg + b"/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_bytes(b"ask") data = await resp.receive_bytes() assert data == b"ask/answer" await resp.close() async def test_send_recv_text_bad_type(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_bytes() await ws.send_bytes(msg + b"/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_bytes(b"ask") with pytest.raises(TypeError): await resp.receive_str() await resp.close() async def test_send_recv_json(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) data = await ws.receive_json() await ws.send_json({"response": data["request"]}) await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") payload = {"request": "test"} await resp.send_json(payload) data = await resp.receive_json() assert data["response"] == payload["request"] await resp.close() async def test_ping_pong(aiohttp_client) -> None: loop = asyncio.get_event_loop() closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_bytes() await ws.ping() await ws.send_bytes(msg + b"/answer") try: await ws.close() finally: closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.ping() await resp.send_bytes(b"ask") msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.BINARY assert msg.data == b"ask/answer" msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.CLOSE await resp.close() await closed async def test_ping_pong_manual(aiohttp_client) -> None: loop = asyncio.get_event_loop() closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_bytes() await ws.ping() await ws.send_bytes(msg + b"/answer") try: await ws.close() finally: closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", autoping=False) await resp.ping() await resp.send_bytes(b"ask") msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.PONG msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.PING await resp.pong() msg = await resp.receive() assert msg.data == b"ask/answer" msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.CLOSE await closed async def test_close(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive_bytes() await ws.send_str("test") await ws.receive() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_bytes(b"ask") closed = await resp.close() assert closed assert resp.closed assert resp.close_code == 1000 msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.CLOSED async def test_concurrent_close(aiohttp_client) -> None: client_ws = None async def handler(request): nonlocal client_ws ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive_bytes() await ws.send_str("test") await client_ws.close() msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.CLOSE return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = client_ws = await client.ws_connect("/") await ws.send_bytes(b"ask") msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.CLOSING await asyncio.sleep(0.01) msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.CLOSED async def test_concurrent_task_close(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) async with client.ws_connect("/") as resp: # wait for the message in a separate task task = asyncio.create_task(resp.receive()) # Make sure we start to wait on receiving message before closing the connection await asyncio.sleep(0.1) closed = await resp.close() await task assert closed assert resp.closed assert resp.close_code == 1000 async def test_close_from_server(aiohttp_client) -> None: loop = asyncio.get_event_loop() closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) try: await ws.receive_bytes() await ws.close() finally: closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_bytes(b"ask") msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.CLOSE assert resp.closed msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.CLOSED await closed async def test_close_manual(aiohttp_client) -> None: loop = asyncio.get_event_loop() closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive_bytes() await ws.send_str("test") try: await ws.close() finally: closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", autoclose=False) await resp.send_bytes(b"ask") msg = await resp.receive() assert msg.data == "test" msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.CLOSE assert msg.data == 1000 assert msg.extra == "" assert not resp.closed await resp.close() await closed assert resp.closed async def test_close_timeout(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive_bytes() await ws.send_str("test") await asyncio.sleep(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", timeout=0.2, autoclose=False) await resp.send_bytes(b"ask") msg = await resp.receive() assert msg.data == "test" assert msg.type == aiohttp.WSMsgType.TEXT msg = await resp.close() assert resp.closed assert isinstance(resp.exception(), asyncio.TimeoutError) async def test_close_cancel(aiohttp_client) -> None: loop = asyncio.get_event_loop() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive_bytes() await ws.send_str("test") await asyncio.sleep(10) app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", autoclose=False) await resp.send_bytes(b"ask") text = await resp.receive() assert text.data == "test" t = loop.create_task(resp.close()) await asyncio.sleep(0.1) t.cancel() await asyncio.sleep(0.1) assert resp.closed assert resp.exception() is None async def test_override_default_headers(aiohttp_client) -> None: async def handler(request): assert request.headers[hdrs.SEC_WEBSOCKET_VERSION] == "8" ws = web.WebSocketResponse() await ws.prepare(request) await ws.send_str("answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) headers = {hdrs.SEC_WEBSOCKET_VERSION: "8"} client = await aiohttp_client(app) resp = await client.ws_connect("/", headers=headers) msg = await resp.receive() assert msg.data == "answer" await resp.close() async def test_additional_headers(aiohttp_client) -> None: async def handler(request): assert request.headers["x-hdr"] == "xtra" ws = web.WebSocketResponse() await ws.prepare(request) await ws.send_str("answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", headers={"x-hdr": "xtra"}) msg = await resp.receive() assert msg.data == "answer" await resp.close() async def test_recv_protocol_error(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive_str() ws._writer.transport.write(b"01234" * 100) await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_str("ask") msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.ERROR assert type(msg.data) is aiohttp.WebSocketError assert msg.data.code == aiohttp.WSCloseCode.PROTOCOL_ERROR assert str(msg.data) == "Received frame with non-zero reserved bits" assert msg.extra is None await resp.close() async def test_recv_timeout(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive_str() await asyncio.sleep(0.1) await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_str("ask") with pytest.raises(asyncio.TimeoutError): async with async_timeout.timeout(0.01): await resp.receive() await resp.close() async def test_receive_timeout(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive() await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", receive_timeout=0.1) with pytest.raises(asyncio.TimeoutError): await resp.receive(0.05) await resp.close() async def test_custom_receive_timeout(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive() await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") with pytest.raises(asyncio.TimeoutError): await resp.receive(0.05) await resp.close() async def test_heartbeat(aiohttp_client) -> None: ping_received = False async def handler(request): nonlocal ping_received ws = web.WebSocketResponse(autoping=False) await ws.prepare(request) msg = await ws.receive() if msg.type == aiohttp.WSMsgType.ping: ping_received = True await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", heartbeat=0.01) await asyncio.sleep(0.1) await resp.receive() await resp.close() assert ping_received async def test_heartbeat_no_pong(aiohttp_client) -> None: ping_received = False async def handler(request): nonlocal ping_received ws = web.WebSocketResponse(autoping=False) await ws.prepare(request) msg = await ws.receive() if msg.type == aiohttp.WSMsgType.ping: ping_received = True await ws.receive() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", heartbeat=0.1) # Connection should be closed roughly after 1.5x heartbeat. await asyncio.sleep(0.2) assert ping_received assert resp.close_code is WSCloseCode.ABNORMAL_CLOSURE async def test_send_recv_compress(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_str() await ws.send_str(msg + "/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", compress=15) await resp.send_str("ask") assert resp.compress == 15 data = await resp.receive_str() assert data == "ask/answer" await resp.close() assert resp.get_extra_info("socket") is None async def test_send_recv_compress_wbits(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_str() await ws.send_str(msg + "/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", compress=9) await resp.send_str("ask") # Client indicates supports wbits 15 # Server supports wbit 15 for decode assert resp.compress == 15 data = await resp.receive_str() assert data == "ask/answer" await resp.close() assert resp.get_extra_info("socket") is None async def test_send_recv_compress_wbit_error(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_bytes() await ws.send_bytes(msg + b"/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) with pytest.raises(ValueError): await client.ws_connect("/", compress=1) async def test_ws_client_async_for(aiohttp_client) -> None: items = ["q1", "q2", "q3"] async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) for i in items: await ws.send_str(i) await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") it = iter(items) async for msg in resp: assert msg.data == next(it) with pytest.raises(StopIteration): next(it) assert resp.closed async def test_ws_async_with(aiohttp_server) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive() await ws.send_str(msg.data + "/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as client: async with client.ws_connect(server.make_url("/")) as ws: await ws.send_str("request") msg = await ws.receive() assert msg.data == "request/answer" assert ws.closed async def test_ws_async_with_send(aiohttp_server) -> None: # send_xxx methods have to return awaitable objects async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive() await ws.send_str(msg.data + "/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as client: async with client.ws_connect(server.make_url("/")) as ws: await ws.send_str("request") msg = await ws.receive() assert msg.data == "request/answer" assert ws.closed async def test_ws_async_with_shortcut(aiohttp_server) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive() await ws.send_str(msg.data + "/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as client: async with client.ws_connect(server.make_url("/")) as ws: await ws.send_str("request") msg = await ws.receive() assert msg.data == "request/answer" assert ws.closed async def test_closed_async_for(aiohttp_client) -> None: loop = asyncio.get_event_loop() closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) try: await ws.send_bytes(b"started") await ws.receive_bytes() finally: closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") messages = [] async for msg in resp: messages.append(msg) if b"started" == msg.data: await resp.send_bytes(b"ask") await resp.close() assert 1 == len(messages) assert messages[0].type == aiohttp.WSMsgType.BINARY assert messages[0].data == b"started" assert resp.closed await closed async def test_peer_connection_lost(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_str() assert msg == "ask" await ws.send_str("answer") request.transport.close() await asyncio.sleep(10) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_str("ask") assert "answer" == await resp.receive_str() msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.CLOSED await resp.close() async def test_peer_connection_lost_iter(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_str() assert msg == "ask" await ws.send_str("answer") request.transport.close() await asyncio.sleep(100) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_str("ask") async for msg in resp: assert "answer" == msg.data await resp.close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_connector.py0000644000175100001770000021727414607525266017404 0ustar00runnerdocker# Tests of http client with custom Connector import asyncio import gc import hashlib import platform import socket import ssl import sys import uuid from collections import deque from contextlib import closing from unittest import mock import pytest from yarl import URL import aiohttp from aiohttp import client, web from aiohttp.client import ClientRequest, ClientTimeout from aiohttp.client_reqrep import ConnectionKey from aiohttp.connector import Connection, TCPConnector, _DNSCacheTable from aiohttp.locks import EventResultOrError from aiohttp.test_utils import make_mocked_coro, unused_port from aiohttp.tracing import Trace @pytest.fixture() def key(): # Connection key return ConnectionKey("localhost", 80, False, True, None, None, None) @pytest.fixture def key2(): # Connection key return ConnectionKey("localhost", 80, False, True, None, None, None) @pytest.fixture def ssl_key(): # Connection key return ConnectionKey("localhost", 80, True, True, None, None, None) @pytest.fixture def unix_server(loop, unix_sockname): runners = [] async def go(app): runner = web.AppRunner(app) runners.append(runner) await runner.setup() site = web.UnixSite(runner, unix_sockname) await site.start() yield go for runner in runners: loop.run_until_complete(runner.cleanup()) @pytest.fixture def named_pipe_server(proactor_loop, pipe_name): runners = [] async def go(app): runner = web.AppRunner(app) runners.append(runner) await runner.setup() site = web.NamedPipeSite(runner, pipe_name) await site.start() yield go for runner in runners: proactor_loop.run_until_complete(runner.cleanup()) def create_mocked_conn(conn_closing_result=None, **kwargs): try: loop = asyncio.get_running_loop() except RuntimeError: loop = asyncio.get_event_loop_policy().get_event_loop() proto = mock.Mock(**kwargs) proto.closed = loop.create_future() proto.closed.set_result(conn_closing_result) return proto def test_connection_del(loop) -> None: connector = mock.Mock() key = mock.Mock() protocol = mock.Mock() loop.set_debug(0) conn = Connection(connector, key, protocol, loop=loop) exc_handler = mock.Mock() loop.set_exception_handler(exc_handler) with pytest.warns(ResourceWarning): del conn gc.collect() connector._release.assert_called_with(key, protocol, should_close=True) msg = { "message": mock.ANY, "client_connection": mock.ANY, } exc_handler.assert_called_with(loop, msg) def test_connection_del_loop_debug(loop) -> None: connector = mock.Mock() key = mock.Mock() protocol = mock.Mock() loop.set_debug(1) conn = Connection(connector, key, protocol, loop=loop) exc_handler = mock.Mock() loop.set_exception_handler(exc_handler) with pytest.warns(ResourceWarning): del conn gc.collect() msg = { "message": mock.ANY, "client_connection": mock.ANY, "source_traceback": mock.ANY, } exc_handler.assert_called_with(loop, msg) def test_connection_del_loop_closed(loop) -> None: connector = mock.Mock() key = mock.Mock() protocol = mock.Mock() loop.set_debug(1) conn = Connection(connector, key, protocol, loop=loop) exc_handler = mock.Mock() loop.set_exception_handler(exc_handler) loop.close() with pytest.warns(ResourceWarning): del conn gc.collect() assert not connector._release.called assert not exc_handler.called async def test_del(loop) -> None: conn = aiohttp.BaseConnector() proto = mock.Mock(should_close=False) conn._release("a", proto) conns_impl = conn._conns exc_handler = mock.Mock() loop.set_exception_handler(exc_handler) with pytest.warns(ResourceWarning): del conn gc.collect() assert not conns_impl proto.close.assert_called_with() msg = { "connector": mock.ANY, # conn was deleted "connections": mock.ANY, "message": "Unclosed connector", } if loop.get_debug(): msg["source_traceback"] = mock.ANY exc_handler.assert_called_with(loop, msg) @pytest.mark.xfail async def test_del_with_scheduled_cleanup(loop) -> None: loop.set_debug(True) conn = aiohttp.BaseConnector(loop=loop, keepalive_timeout=0.01) transp = mock.Mock() conn._conns["a"] = [(transp, 123)] conns_impl = conn._conns exc_handler = mock.Mock() loop.set_exception_handler(exc_handler) with pytest.warns(ResourceWarning): # obviously doesn't deletion because loop has a strong # reference to connector's instance method, isn't it? del conn await asyncio.sleep(0.01) gc.collect() assert not conns_impl transp.close.assert_called_with() msg = {"connector": mock.ANY, "message": "Unclosed connector"} # conn was deleted if loop.get_debug(): msg["source_traceback"] = mock.ANY exc_handler.assert_called_with(loop, msg) @pytest.mark.skipif( sys.implementation.name != "cpython", reason="CPython GC is required for the test" ) def test_del_with_closed_loop(loop) -> None: async def make_conn(): return aiohttp.BaseConnector() conn = loop.run_until_complete(make_conn()) transp = mock.Mock() conn._conns["a"] = [(transp, 123)] conns_impl = conn._conns exc_handler = mock.Mock() loop.set_exception_handler(exc_handler) loop.close() with pytest.warns(ResourceWarning): del conn gc.collect() assert not conns_impl assert not transp.close.called assert exc_handler.called async def test_del_empty_connector(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) exc_handler = mock.Mock() loop.set_exception_handler(exc_handler) del conn assert not exc_handler.called async def test_create_conn(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) with pytest.raises(NotImplementedError): await conn._create_connection(object(), [], object()) async def test_connector_context_manager(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) with pytest.warns(DeprecationWarning): with conn as c: assert conn is c assert conn.closed await conn.close() async def test_async_context_manager(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) async with conn as c: assert conn is c assert conn.closed async def test_close(loop) -> None: proto = mock.Mock() conn = aiohttp.BaseConnector(loop=loop) assert not conn.closed conn._conns[("host", 8080, False)] = [(proto, object())] await conn.close() assert not conn._conns assert proto.close.called assert conn.closed async def test_get(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) assert conn._get(1) is None proto = mock.Mock() conn._conns[1] = [(proto, loop.time())] assert conn._get(1) == proto await conn.close() async def test_get_unconnected_proto(loop) -> None: conn = aiohttp.BaseConnector() key = ConnectionKey("localhost", 80, False, None, None, None, None) assert conn._get(key) is None proto = create_mocked_conn(loop) conn._conns[key] = [(proto, loop.time())] assert conn._get(key) == proto assert conn._get(key) is None conn._conns[key] = [(proto, loop.time())] proto.is_connected = lambda *args: False assert conn._get(key) is None await conn.close() async def test_get_unconnected_proto_ssl(loop) -> None: conn = aiohttp.BaseConnector() key = ConnectionKey("localhost", 80, True, None, None, None, None) assert conn._get(key) is None proto = create_mocked_conn(loop) conn._conns[key] = [(proto, loop.time())] assert conn._get(key) == proto assert conn._get(key) is None conn._conns[key] = [(proto, loop.time())] proto.is_connected = lambda *args: False assert conn._get(key) is None await conn.close() async def test_get_expired(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) key = ConnectionKey("localhost", 80, False, None, None, None, None) assert conn._get(key) is None proto = mock.Mock() conn._conns[key] = [(proto, loop.time() - 1000)] assert conn._get(key) is None assert not conn._conns await conn.close() async def test_get_expired_ssl(loop) -> None: conn = aiohttp.BaseConnector(loop=loop, enable_cleanup_closed=True) key = ConnectionKey("localhost", 80, True, None, None, None, None) assert conn._get(key) is None proto = mock.Mock() transport = proto.transport conn._conns[key] = [(proto, loop.time() - 1000)] assert conn._get(key) is None assert not conn._conns assert conn._cleanup_closed_transports == [transport] await conn.close() async def test_release_acquired(loop, key) -> None: proto = mock.Mock() conn = aiohttp.BaseConnector(loop=loop, limit=5) conn._release_waiter = mock.Mock() conn._acquired.add(proto) conn._acquired_per_host[key].add(proto) conn._release_acquired(key, proto) assert 0 == len(conn._acquired) assert 0 == len(conn._acquired_per_host) assert conn._release_waiter.called conn._release_acquired(key, proto) assert 0 == len(conn._acquired) assert 0 == len(conn._acquired_per_host) await conn.close() async def test_release_acquired_closed(loop, key) -> None: proto = mock.Mock() conn = aiohttp.BaseConnector(loop=loop, limit=5) conn._release_waiter = mock.Mock() conn._acquired.add(proto) conn._acquired_per_host[key].add(proto) conn._closed = True conn._release_acquired(key, proto) assert 1 == len(conn._acquired) assert 1 == len(conn._acquired_per_host[key]) assert not conn._release_waiter.called await conn.close() async def test_release(loop, key) -> None: conn = aiohttp.BaseConnector(loop=loop) conn._release_waiter = mock.Mock() proto = mock.Mock(should_close=False) conn._acquired.add(proto) conn._acquired_per_host[key].add(proto) conn._release(key, proto) assert conn._release_waiter.called assert conn._cleanup_handle is not None assert conn._conns[key][0][0] == proto assert conn._conns[key][0][1] == pytest.approx(loop.time(), abs=0.1) assert not conn._cleanup_closed_transports await conn.close() async def test_release_ssl_transport(loop, ssl_key) -> None: conn = aiohttp.BaseConnector(loop=loop, enable_cleanup_closed=True) conn._release_waiter = mock.Mock() proto = mock.Mock() transport = proto.transport conn._acquired.add(proto) conn._acquired_per_host[ssl_key].add(proto) conn._release(ssl_key, proto, should_close=True) assert conn._cleanup_closed_transports == [transport] await conn.close() async def test_release_already_closed(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) proto = mock.Mock() key = 1 conn._acquired.add(proto) await conn.close() conn._release_waiters = mock.Mock() conn._release_acquired = mock.Mock() conn._release(key, proto) assert not conn._release_waiters.called assert not conn._release_acquired.called async def test_release_waiter_no_limit(loop, key, key2) -> None: # limit is 0 conn = aiohttp.BaseConnector(limit=0, loop=loop) w = mock.Mock() w.done.return_value = False conn._waiters[key].append(w) conn._release_waiter() assert len(conn._waiters[key]) == 0 assert w.done.called await conn.close() async def test_release_waiter_first_available(loop, key, key2) -> None: conn = aiohttp.BaseConnector(loop=loop) w1, w2 = mock.Mock(), mock.Mock() w1.done.return_value = False w2.done.return_value = False conn._waiters[key].append(w2) conn._waiters[key2].append(w1) conn._release_waiter() assert ( w1.set_result.called and not w2.set_result.called or not w1.set_result.called and w2.set_result.called ) await conn.close() async def test_release_waiter_release_first(loop, key, key2) -> None: conn = aiohttp.BaseConnector(loop=loop, limit=1) w1, w2 = mock.Mock(), mock.Mock() w1.done.return_value = False w2.done.return_value = False conn._waiters[key] = deque([w1, w2]) conn._release_waiter() assert w1.set_result.called assert not w2.set_result.called await conn.close() async def test_release_waiter_skip_done_waiter(loop, key, key2) -> None: conn = aiohttp.BaseConnector(loop=loop, limit=1) w1, w2 = mock.Mock(), mock.Mock() w1.done.return_value = True w2.done.return_value = False conn._waiters[key] = deque([w1, w2]) conn._release_waiter() assert not w1.set_result.called assert w2.set_result.called await conn.close() async def test_release_waiter_per_host(loop, key, key2) -> None: # no limit conn = aiohttp.BaseConnector(loop=loop, limit=0, limit_per_host=2) w1, w2 = mock.Mock(), mock.Mock() w1.done.return_value = False w2.done.return_value = False conn._waiters[key] = deque([w1]) conn._waiters[key2] = deque([w2]) conn._release_waiter() assert (w1.set_result.called and not w2.set_result.called) or ( not w1.set_result.called and w2.set_result.called ) await conn.close() async def test_release_waiter_no_available(loop, key, key2) -> None: # limit is 0 conn = aiohttp.BaseConnector(limit=0, loop=loop) w = mock.Mock() w.done.return_value = False conn._waiters[key].append(w) conn._available_connections = mock.Mock(return_value=0) conn._release_waiter() assert len(conn._waiters) == 1 assert not w.done.called await conn.close() async def test_release_close(loop, key) -> None: conn = aiohttp.BaseConnector(loop=loop) proto = mock.Mock(should_close=True) conn._acquired.add(proto) conn._release(key, proto) assert not conn._conns assert proto.close.called async def test__drop_acquire_per_host1(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) conn._drop_acquired_per_host(123, 456) assert len(conn._acquired_per_host) == 0 async def test__drop_acquire_per_host2(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) conn._acquired_per_host[123].add(456) conn._drop_acquired_per_host(123, 456) assert len(conn._acquired_per_host) == 0 async def test__drop_acquire_per_host3(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) conn._acquired_per_host[123].add(456) conn._acquired_per_host[123].add(789) conn._drop_acquired_per_host(123, 456) assert len(conn._acquired_per_host) == 1 assert conn._acquired_per_host[123] == {789} async def test_tcp_connector_certificate_error(loop) -> None: req = ClientRequest("GET", URL("https://127.0.0.1:443"), loop=loop) async def certificate_error(*args, **kwargs): raise ssl.CertificateError conn = aiohttp.TCPConnector(loop=loop) conn._loop.create_connection = certificate_error with pytest.raises(aiohttp.ClientConnectorCertificateError) as ctx: await conn.connect(req, [], ClientTimeout()) assert isinstance(ctx.value, ssl.CertificateError) assert isinstance(ctx.value.certificate_error, ssl.CertificateError) assert isinstance(ctx.value, aiohttp.ClientSSLError) async def test_tcp_connector_server_hostname_default(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) with mock.patch.object( conn._loop, "create_connection", autospec=True, spec_set=True ) as create_connection: create_connection.return_value = mock.Mock(), mock.Mock() req = ClientRequest("GET", URL("https://127.0.0.1:443"), loop=loop) with closing(await conn.connect(req, [], ClientTimeout())): assert create_connection.call_args.kwargs["server_hostname"] == "127.0.0.1" async def test_tcp_connector_server_hostname_override(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) with mock.patch.object( conn._loop, "create_connection", autospec=True, spec_set=True ) as create_connection: create_connection.return_value = mock.Mock(), mock.Mock() req = ClientRequest( "GET", URL("https://127.0.0.1:443"), loop=loop, server_hostname="localhost" ) with closing(await conn.connect(req, [], ClientTimeout())): assert create_connection.call_args.kwargs["server_hostname"] == "localhost" async def test_tcp_connector_multiple_hosts_errors(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) ip1 = "192.168.1.1" ip2 = "192.168.1.2" ip3 = "192.168.1.3" ip4 = "192.168.1.4" ip5 = "192.168.1.5" ips = [ip1, ip2, ip3, ip4, ip5] ips_tried = [] fingerprint = hashlib.sha256(b"foo").digest() req = ClientRequest( "GET", URL("https://mocked.host"), ssl=aiohttp.Fingerprint(fingerprint), loop=loop, ) async def _resolve_host(host, port, traces=None): return [ { "hostname": host, "host": ip, "port": port, "family": socket.AF_INET, "proto": 0, "flags": socket.AI_NUMERICHOST, } for ip in ips ] conn._resolve_host = _resolve_host os_error = certificate_error = ssl_error = fingerprint_error = False connected = False async def create_connection(*args, **kwargs): nonlocal os_error, certificate_error, ssl_error, fingerprint_error nonlocal connected ip = args[1] ips_tried.append(ip) if ip == ip1: os_error = True raise OSError if ip == ip2: certificate_error = True raise ssl.CertificateError if ip == ip3: ssl_error = True raise ssl.SSLError if ip == ip4: fingerprint_error = True tr, pr = mock.Mock(), mock.Mock() def get_extra_info(param): if param == "sslcontext": return True if param == "ssl_object": s = mock.Mock() s.getpeercert.return_value = b"not foo" return s if param == "peername": return ("192.168.1.5", 12345) assert False, param tr.get_extra_info = get_extra_info return tr, pr if ip == ip5: connected = True tr, pr = mock.Mock(), mock.Mock() def get_extra_info(param): if param == "sslcontext": return True if param == "ssl_object": s = mock.Mock() s.getpeercert.return_value = b"foo" return s assert False tr.get_extra_info = get_extra_info return tr, pr assert False conn._loop.create_connection = create_connection established_connection = await conn.connect(req, [], ClientTimeout()) assert ips == ips_tried assert os_error assert certificate_error assert ssl_error assert fingerprint_error assert connected established_connection.close() async def test_tcp_connector_resolve_host(loop) -> None: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=True) res = await conn._resolve_host("localhost", 8080) assert res for rec in res: if rec["family"] == socket.AF_INET: assert rec["host"] == "127.0.0.1" assert rec["hostname"] == "localhost" assert rec["port"] == 8080 elif rec["family"] == socket.AF_INET6: assert rec["hostname"] == "localhost" assert rec["port"] == 8080 if platform.system() == "Darwin": assert rec["host"] in ("::1", "fe80::1", "fe80::1%lo0") else: assert rec["host"] == "::1" @pytest.fixture def dns_response(loop): async def coro(): # simulates a network operation await asyncio.sleep(0) return ["127.0.0.1"] return coro async def test_tcp_connector_dns_cache_not_expired(loop, dns_response) -> None: with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=True, ttl_dns_cache=10) m_resolver().resolve.return_value = dns_response() await conn._resolve_host("localhost", 8080) await conn._resolve_host("localhost", 8080) m_resolver().resolve.assert_called_once_with("localhost", 8080, family=0) async def test_tcp_connector_dns_cache_forever(loop, dns_response) -> None: with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=True, ttl_dns_cache=10) m_resolver().resolve.return_value = dns_response() await conn._resolve_host("localhost", 8080) await conn._resolve_host("localhost", 8080) m_resolver().resolve.assert_called_once_with("localhost", 8080, family=0) async def test_tcp_connector_use_dns_cache_disabled(loop, dns_response) -> None: with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=False) m_resolver().resolve.side_effect = [dns_response(), dns_response()] await conn._resolve_host("localhost", 8080) await conn._resolve_host("localhost", 8080) m_resolver().resolve.assert_has_calls( [ mock.call("localhost", 8080, family=0), mock.call("localhost", 8080, family=0), ] ) async def test_tcp_connector_dns_throttle_requests(loop, dns_response) -> None: with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=True, ttl_dns_cache=10) m_resolver().resolve.return_value = dns_response() loop.create_task(conn._resolve_host("localhost", 8080)) loop.create_task(conn._resolve_host("localhost", 8080)) await asyncio.sleep(0) await asyncio.sleep(0) m_resolver().resolve.assert_called_once_with("localhost", 8080, family=0) async def test_tcp_connector_dns_throttle_requests_exception_spread(loop) -> None: with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=True, ttl_dns_cache=10) e = Exception() m_resolver().resolve.side_effect = e r1 = loop.create_task(conn._resolve_host("localhost", 8080)) r2 = loop.create_task(conn._resolve_host("localhost", 8080)) await asyncio.sleep(0) await asyncio.sleep(0) await asyncio.sleep(0) await asyncio.sleep(0) assert r1.exception() == e assert r2.exception() == e async def test_tcp_connector_dns_throttle_requests_cancelled_when_close( loop, dns_response ): with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=True, ttl_dns_cache=10) m_resolver().resolve.return_value = dns_response() loop.create_task(conn._resolve_host("localhost", 8080)) f = loop.create_task(conn._resolve_host("localhost", 8080)) await asyncio.sleep(0) await asyncio.sleep(0) await conn.close() with pytest.raises(asyncio.CancelledError): await f @pytest.fixture def dns_response_error(loop): async def coro(): # simulates a network operation await asyncio.sleep(0) raise socket.gaierror(-3, "Temporary failure in name resolution") return coro async def test_tcp_connector_cancel_dns_error_captured( loop, dns_response_error ) -> None: exception_handler_called = False def exception_handler(loop, context): nonlocal exception_handler_called exception_handler_called = True loop.set_exception_handler(mock.Mock(side_effect=exception_handler)) with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: req = ClientRequest( method="GET", url=URL("http://temporary-failure:80"), loop=loop ) conn = aiohttp.TCPConnector( use_dns_cache=False, ) m_resolver().resolve.return_value = dns_response_error() f = loop.create_task(conn._create_direct_connection(req, [], ClientTimeout(0))) await asyncio.sleep(0) f.cancel() with pytest.raises(asyncio.CancelledError): await f gc.collect() assert exception_handler_called is False async def test_tcp_connector_dns_tracing(loop, dns_response) -> None: session = mock.Mock() trace_config_ctx = mock.Mock() on_dns_resolvehost_start = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_dns_resolvehost_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_dns_cache_hit = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_dns_cache_miss = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) trace_config = aiohttp.TraceConfig( trace_config_ctx_factory=mock.Mock(return_value=trace_config_ctx) ) trace_config.on_dns_resolvehost_start.append(on_dns_resolvehost_start) trace_config.on_dns_resolvehost_end.append(on_dns_resolvehost_end) trace_config.on_dns_cache_hit.append(on_dns_cache_hit) trace_config.on_dns_cache_miss.append(on_dns_cache_miss) trace_config.freeze() traces = [Trace(session, trace_config, trace_config.trace_config_ctx())] with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=True, ttl_dns_cache=10) m_resolver().resolve.return_value = dns_response() await conn._resolve_host("localhost", 8080, traces=traces) on_dns_resolvehost_start.assert_called_once_with( session, trace_config_ctx, aiohttp.TraceDnsResolveHostStartParams("localhost"), ) on_dns_resolvehost_end.assert_called_once_with( session, trace_config_ctx, aiohttp.TraceDnsResolveHostEndParams("localhost") ) on_dns_cache_miss.assert_called_once_with( session, trace_config_ctx, aiohttp.TraceDnsCacheMissParams("localhost") ) assert not on_dns_cache_hit.called await conn._resolve_host("localhost", 8080, traces=traces) on_dns_cache_hit.assert_called_once_with( session, trace_config_ctx, aiohttp.TraceDnsCacheHitParams("localhost") ) async def test_tcp_connector_dns_tracing_cache_disabled(loop, dns_response) -> None: session = mock.Mock() trace_config_ctx = mock.Mock() on_dns_resolvehost_start = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_dns_resolvehost_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) trace_config = aiohttp.TraceConfig( trace_config_ctx_factory=mock.Mock(return_value=trace_config_ctx) ) trace_config.on_dns_resolvehost_start.append(on_dns_resolvehost_start) trace_config.on_dns_resolvehost_end.append(on_dns_resolvehost_end) trace_config.freeze() traces = [Trace(session, trace_config, trace_config.trace_config_ctx())] with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=False) m_resolver().resolve.side_effect = [dns_response(), dns_response()] await conn._resolve_host("localhost", 8080, traces=traces) await conn._resolve_host("localhost", 8080, traces=traces) on_dns_resolvehost_start.assert_has_calls( [ mock.call( session, trace_config_ctx, aiohttp.TraceDnsResolveHostStartParams("localhost"), ), mock.call( session, trace_config_ctx, aiohttp.TraceDnsResolveHostStartParams("localhost"), ), ] ) on_dns_resolvehost_end.assert_has_calls( [ mock.call( session, trace_config_ctx, aiohttp.TraceDnsResolveHostEndParams("localhost"), ), mock.call( session, trace_config_ctx, aiohttp.TraceDnsResolveHostEndParams("localhost"), ), ] ) async def test_tcp_connector_dns_tracing_throttle_requests(loop, dns_response) -> None: session = mock.Mock() trace_config_ctx = mock.Mock() on_dns_cache_hit = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_dns_cache_miss = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) trace_config = aiohttp.TraceConfig( trace_config_ctx_factory=mock.Mock(return_value=trace_config_ctx) ) trace_config.on_dns_cache_hit.append(on_dns_cache_hit) trace_config.on_dns_cache_miss.append(on_dns_cache_miss) trace_config.freeze() traces = [Trace(session, trace_config, trace_config.trace_config_ctx())] with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=True, ttl_dns_cache=10) m_resolver().resolve.return_value = dns_response() loop.create_task(conn._resolve_host("localhost", 8080, traces=traces)) loop.create_task(conn._resolve_host("localhost", 8080, traces=traces)) await asyncio.sleep(0) await asyncio.sleep(0) on_dns_cache_hit.assert_called_once_with( session, trace_config_ctx, aiohttp.TraceDnsCacheHitParams("localhost") ) on_dns_cache_miss.assert_called_once_with( session, trace_config_ctx, aiohttp.TraceDnsCacheMissParams("localhost") ) async def test_dns_error(loop) -> None: connector = aiohttp.TCPConnector(loop=loop) connector._resolve_host = make_mocked_coro( raise_exception=OSError("dont take it serious") ) req = ClientRequest("GET", URL("http://www.python.org"), loop=loop) with pytest.raises(aiohttp.ClientConnectorError): await connector.connect(req, [], ClientTimeout()) async def test_get_pop_empty_conns(loop) -> None: # see issue #473 conn = aiohttp.BaseConnector(loop=loop) key = ("127.0.0.1", 80, False) conn._conns[key] = [] proto = conn._get(key) assert proto is None assert not conn._conns async def test_release_close_do_not_add_to_pool(loop, key) -> None: # see issue #473 conn = aiohttp.BaseConnector(loop=loop) proto = mock.Mock(should_close=True) conn._acquired.add(proto) conn._release(key, proto) assert not conn._conns async def test_release_close_do_not_delete_existing_connections(key) -> None: proto1 = mock.Mock() conn = aiohttp.BaseConnector() conn._conns[key] = [(proto1, 1)] proto = mock.Mock(should_close=True) conn._acquired.add(proto) conn._release(key, proto) assert conn._conns[key] == [(proto1, 1)] assert proto.close.called await conn.close() async def test_release_not_started(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) proto = mock.Mock(should_close=False) key = 1 conn._acquired.add(proto) conn._release(key, proto) # assert conn._conns == {1: [(proto, 10)]} rec = conn._conns[1] assert rec[0][0] == proto assert rec[0][1] == pytest.approx(loop.time(), abs=0.05) assert not proto.close.called await conn.close() async def test_release_not_opened(loop, key) -> None: conn = aiohttp.BaseConnector(loop=loop) proto = mock.Mock() conn._acquired.add(proto) conn._release(key, proto) assert proto.close.called async def test_connect(loop, key) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://localhost:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop) conn._conns[key] = [(proto, loop.time())] conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) connection = await conn.connect(req, [], ClientTimeout()) assert not conn._create_connection.called assert connection._protocol is proto assert connection.transport is proto.transport assert isinstance(connection, Connection) connection.close() async def test_connect_tracing(loop) -> None: session = mock.Mock() trace_config_ctx = mock.Mock() on_connection_create_start = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_connection_create_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) trace_config = aiohttp.TraceConfig( trace_config_ctx_factory=mock.Mock(return_value=trace_config_ctx) ) trace_config.on_connection_create_start.append(on_connection_create_start) trace_config.on_connection_create_end.append(on_connection_create_end) trace_config.freeze() traces = [Trace(session, trace_config, trace_config.trace_config_ctx())] proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://host:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop) conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) conn2 = await conn.connect(req, traces, ClientTimeout()) conn2.release() on_connection_create_start.assert_called_with( session, trace_config_ctx, aiohttp.TraceConnectionCreateStartParams() ) on_connection_create_end.assert_called_with( session, trace_config_ctx, aiohttp.TraceConnectionCreateEndParams() ) async def test_close_during_connect(loop) -> None: proto = mock.Mock() proto.is_connected.return_value = True fut = loop.create_future() req = ClientRequest("GET", URL("http://host:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop) conn._create_connection = mock.Mock() conn._create_connection.return_value = fut task = loop.create_task(conn.connect(req, None, ClientTimeout())) await asyncio.sleep(0) await conn.close() fut.set_result(proto) with pytest.raises(aiohttp.ClientConnectionError): await task assert proto.close.called async def test_ctor_cleanup() -> None: loop = mock.Mock() loop.time.return_value = 1.5 conn = aiohttp.BaseConnector( loop=loop, keepalive_timeout=10, enable_cleanup_closed=True ) assert conn._cleanup_handle is None assert conn._cleanup_closed_handle is not None async def test_cleanup(key) -> None: testset = { key: [(mock.Mock(), 10), (mock.Mock(), 300)], } testset[key][0][0].is_connected.return_value = True testset[key][1][0].is_connected.return_value = False loop = mock.Mock() loop.time.return_value = 300 conn = aiohttp.BaseConnector(loop=loop) conn._conns = testset existing_handle = conn._cleanup_handle = mock.Mock() conn._cleanup() assert existing_handle.cancel.called assert conn._conns == {} assert conn._cleanup_handle is None async def test_cleanup_close_ssl_transport(ssl_key) -> None: proto = mock.Mock() transport = proto.transport testset = {ssl_key: [(proto, 10)]} loop = mock.Mock() loop.time.return_value = 300 conn = aiohttp.BaseConnector(loop=loop, enable_cleanup_closed=True) conn._conns = testset existing_handle = conn._cleanup_handle = mock.Mock() conn._cleanup() assert existing_handle.cancel.called assert conn._conns == {} assert conn._cleanup_closed_transports == [transport] async def test_cleanup2() -> None: testset = {1: [(mock.Mock(), 300)]} testset[1][0][0].is_connected.return_value = True loop = mock.Mock() loop.time.return_value = 300 conn = aiohttp.BaseConnector(loop=loop, keepalive_timeout=10) conn._conns = testset conn._cleanup() assert conn._conns == testset assert conn._cleanup_handle is not None loop.call_at.assert_called_with(310, mock.ANY, mock.ANY) await conn.close() async def test_cleanup3(key) -> None: testset = {key: [(mock.Mock(), 290.1), (mock.Mock(), 305.1)]} testset[key][0][0].is_connected.return_value = True loop = mock.Mock() loop.time.return_value = 308.5 conn = aiohttp.BaseConnector(loop=loop, keepalive_timeout=10) conn._conns = testset conn._cleanup() assert conn._conns == {key: [testset[key][1]]} assert conn._cleanup_handle is not None loop.call_at.assert_called_with(319, mock.ANY, mock.ANY) await conn.close() async def test_cleanup_closed(loop, mocker) -> None: if not hasattr(loop, "__dict__"): pytest.skip("can not override loop attributes") mocker.spy(loop, "call_at") conn = aiohttp.BaseConnector(loop=loop, enable_cleanup_closed=True) tr = mock.Mock() conn._cleanup_closed_handle = cleanup_closed_handle = mock.Mock() conn._cleanup_closed_transports = [tr] conn._cleanup_closed() assert tr.abort.called assert not conn._cleanup_closed_transports assert loop.call_at.called assert cleanup_closed_handle.cancel.called async def test_cleanup_closed_disabled(loop, mocker) -> None: conn = aiohttp.BaseConnector(loop=loop, enable_cleanup_closed=False) tr = mock.Mock() conn._cleanup_closed_transports = [tr] conn._cleanup_closed() assert tr.abort.called assert not conn._cleanup_closed_transports async def test_tcp_connector_ctor() -> None: conn = aiohttp.TCPConnector() assert conn._ssl is True assert conn.use_dns_cache assert conn.family == 0 async def test_tcp_connector_ctor_fingerprint_valid(loop) -> None: valid = aiohttp.Fingerprint(hashlib.sha256(b"foo").digest()) conn = aiohttp.TCPConnector(ssl=valid, loop=loop) assert conn._ssl is valid async def test_insecure_fingerprint_md5(loop) -> None: with pytest.raises(ValueError): aiohttp.TCPConnector( ssl=aiohttp.Fingerprint(hashlib.md5(b"foo").digest()), loop=loop ) async def test_insecure_fingerprint_sha1(loop) -> None: with pytest.raises(ValueError): aiohttp.TCPConnector( ssl=aiohttp.Fingerprint(hashlib.sha1(b"foo").digest()), loop=loop ) async def test_tcp_connector_clear_dns_cache(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) hosts = ["a", "b"] conn._cached_hosts.add(("localhost", 123), hosts) conn._cached_hosts.add(("localhost", 124), hosts) conn.clear_dns_cache("localhost", 123) with pytest.raises(KeyError): conn._cached_hosts.next_addrs(("localhost", 123)) assert conn._cached_hosts.next_addrs(("localhost", 124)) == hosts # Remove removed element is OK conn.clear_dns_cache("localhost", 123) with pytest.raises(KeyError): conn._cached_hosts.next_addrs(("localhost", 123)) conn.clear_dns_cache() with pytest.raises(KeyError): conn._cached_hosts.next_addrs(("localhost", 124)) async def test_tcp_connector_clear_dns_cache_bad_args(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) with pytest.raises(ValueError): conn.clear_dns_cache("localhost") async def test_dont_recreate_ssl_context(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) ctx = conn._make_ssl_context(True) assert ctx is conn._make_ssl_context(True) async def test_dont_recreate_ssl_context2(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) ctx = conn._make_ssl_context(False) assert ctx is conn._make_ssl_context(False) async def test___get_ssl_context1(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) req = mock.Mock() req.is_ssl.return_value = False assert conn._get_ssl_context(req) is None async def test___get_ssl_context2(loop) -> None: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) conn = aiohttp.TCPConnector(loop=loop) req = mock.Mock() req.is_ssl.return_value = True req.ssl = ctx assert conn._get_ssl_context(req) is ctx async def test___get_ssl_context3(loop) -> None: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) conn = aiohttp.TCPConnector(loop=loop, ssl=ctx) req = mock.Mock() req.is_ssl.return_value = True req.ssl = True assert conn._get_ssl_context(req) is ctx async def test___get_ssl_context4(loop) -> None: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) conn = aiohttp.TCPConnector(loop=loop, ssl=ctx) req = mock.Mock() req.is_ssl.return_value = True req.ssl = False assert conn._get_ssl_context(req) is conn._make_ssl_context(False) async def test___get_ssl_context5(loop) -> None: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) conn = aiohttp.TCPConnector(loop=loop, ssl=ctx) req = mock.Mock() req.is_ssl.return_value = True req.ssl = aiohttp.Fingerprint(hashlib.sha256(b"1").digest()) assert conn._get_ssl_context(req) is conn._make_ssl_context(False) async def test___get_ssl_context6(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) req = mock.Mock() req.is_ssl.return_value = True req.ssl = True assert conn._get_ssl_context(req) is conn._make_ssl_context(True) async def test_close_twice(loop) -> None: proto = mock.Mock() conn = aiohttp.BaseConnector(loop=loop) conn._conns[1] = [(proto, object())] await conn.close() assert not conn._conns assert proto.close.called assert conn.closed conn._conns = "Invalid" # fill with garbage await conn.close() assert conn.closed async def test_close_cancels_cleanup_handle(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) conn._release(1, mock.Mock(should_close=False)) assert conn._cleanup_handle is not None await conn.close() assert conn._cleanup_handle is None async def test_close_abort_closed_transports(loop) -> None: tr = mock.Mock() conn = aiohttp.BaseConnector(loop=loop) conn._cleanup_closed_transports.append(tr) await conn.close() assert not conn._cleanup_closed_transports assert tr.abort.called assert conn.closed async def test_close_cancels_cleanup_closed_handle(loop) -> None: conn = aiohttp.BaseConnector(loop=loop, enable_cleanup_closed=True) assert conn._cleanup_closed_handle is not None await conn.close() assert conn._cleanup_closed_handle is None async def test_ctor_with_default_loop(loop) -> None: conn = aiohttp.BaseConnector() assert loop is conn._loop async def test_connect_with_limit(loop, key) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest( "GET", URL("http://localhost:80"), loop=loop, response_class=mock.Mock() ) conn = aiohttp.BaseConnector(loop=loop, limit=1) conn._conns[key] = [(proto, loop.time())] conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) connection1 = await conn.connect(req, None, ClientTimeout()) assert connection1._protocol == proto assert 1 == len(conn._acquired) assert proto in conn._acquired assert key in conn._acquired_per_host assert proto in conn._acquired_per_host[key] acquired = False async def f(): nonlocal acquired connection2 = await conn.connect(req, None, ClientTimeout()) acquired = True assert 1 == len(conn._acquired) assert 1 == len(conn._acquired_per_host[key]) connection2.release() task = loop.create_task(f()) await asyncio.sleep(0.01) assert not acquired connection1.release() await asyncio.sleep(0) assert acquired await task await conn.close() async def test_connect_queued_operation_tracing(loop, key) -> None: session = mock.Mock() trace_config_ctx = mock.Mock() on_connection_queued_start = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_connection_queued_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) trace_config = aiohttp.TraceConfig( trace_config_ctx_factory=mock.Mock(return_value=trace_config_ctx) ) trace_config.on_connection_queued_start.append(on_connection_queued_start) trace_config.on_connection_queued_end.append(on_connection_queued_end) trace_config.freeze() traces = [Trace(session, trace_config, trace_config.trace_config_ctx())] proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest( "GET", URL("http://localhost1:80"), loop=loop, response_class=mock.Mock() ) conn = aiohttp.BaseConnector(loop=loop, limit=1) conn._conns[key] = [(proto, loop.time())] conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) connection1 = await conn.connect(req, traces, ClientTimeout()) async def f(): connection2 = await conn.connect(req, traces, ClientTimeout()) on_connection_queued_start.assert_called_with( session, trace_config_ctx, aiohttp.TraceConnectionQueuedStartParams() ) on_connection_queued_end.assert_called_with( session, trace_config_ctx, aiohttp.TraceConnectionQueuedEndParams() ) connection2.release() task = asyncio.ensure_future(f(), loop=loop) await asyncio.sleep(0.01) connection1.release() await task await conn.close() async def test_connect_reuseconn_tracing(loop, key) -> None: session = mock.Mock() trace_config_ctx = mock.Mock() on_connection_reuseconn = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) trace_config = aiohttp.TraceConfig( trace_config_ctx_factory=mock.Mock(return_value=trace_config_ctx) ) trace_config.on_connection_reuseconn.append(on_connection_reuseconn) trace_config.freeze() traces = [Trace(session, trace_config, trace_config.trace_config_ctx())] proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest( "GET", URL("http://localhost:80"), loop=loop, response_class=mock.Mock() ) conn = aiohttp.BaseConnector(loop=loop, limit=1) conn._conns[key] = [(proto, loop.time())] conn2 = await conn.connect(req, traces, ClientTimeout()) conn2.release() on_connection_reuseconn.assert_called_with( session, trace_config_ctx, aiohttp.TraceConnectionReuseconnParams() ) await conn.close() async def test_connect_with_limit_and_limit_per_host(loop, key) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://localhost:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop, limit=1000, limit_per_host=1) conn._conns[key] = [(proto, loop.time())] conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) acquired = False connection1 = await conn.connect(req, None, ClientTimeout()) async def f(): nonlocal acquired connection2 = await conn.connect(req, None, ClientTimeout()) acquired = True assert 1 == len(conn._acquired) assert 1 == len(conn._acquired_per_host[key]) connection2.release() task = loop.create_task(f()) await asyncio.sleep(0.01) assert not acquired connection1.release() await asyncio.sleep(0) assert acquired await task await conn.close() async def test_connect_with_no_limit_and_limit_per_host(loop, key) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://localhost1:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop, limit=0, limit_per_host=1) conn._conns[key] = [(proto, loop.time())] conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) acquired = False connection1 = await conn.connect(req, None, ClientTimeout()) async def f(): nonlocal acquired connection2 = await conn.connect(req, None, ClientTimeout()) acquired = True connection2.release() task = loop.create_task(f()) await asyncio.sleep(0.01) assert not acquired connection1.release() await asyncio.sleep(0) assert acquired await task await conn.close() async def test_connect_with_no_limits(loop, key) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://localhost:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop, limit=0, limit_per_host=0) conn._conns[key] = [(proto, loop.time())] conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) acquired = False connection1 = await conn.connect(req, None, ClientTimeout()) async def f(): nonlocal acquired connection2 = await conn.connect(req, None, ClientTimeout()) acquired = True assert 1 == len(conn._acquired) assert 1 == len(conn._acquired_per_host[key]) connection2.release() task = loop.create_task(f()) await asyncio.sleep(0.01) assert acquired connection1.release() await task await conn.close() async def test_connect_with_limit_cancelled(loop) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://host:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop, limit=1) key = ("host", 80, False) conn._conns[key] = [(proto, loop.time())] conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) connection = await conn.connect(req, None, ClientTimeout()) assert connection._protocol == proto assert connection.transport == proto.transport assert 1 == len(conn._acquired) with pytest.raises(asyncio.TimeoutError): # limit exhausted await asyncio.wait_for(conn.connect(req, None, ClientTimeout()), 0.01) connection.close() await conn.close() async def test_connect_with_capacity_release_waiters(loop) -> None: def check_with_exc(err): conn = aiohttp.BaseConnector(limit=1, loop=loop) conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_exception(err) with pytest.raises(Exception): req = mock.Mock() yield from conn.connect(req, None, ClientTimeout()) assert not conn._waiters check_with_exc(OSError(1, "permission error")) check_with_exc(RuntimeError()) check_with_exc(asyncio.TimeoutError()) async def test_connect_with_limit_concurrent(loop) -> None: proto = mock.Mock() proto.should_close = False proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://host:80"), loop=loop) max_connections = 2 num_connections = 0 conn = aiohttp.BaseConnector(limit=max_connections, loop=loop) # Use a real coroutine for _create_connection; a mock would mask # problems that only happen when the method yields. async def create_connection(req, traces, timeout): nonlocal num_connections num_connections += 1 await asyncio.sleep(0) # Make a new transport mock each time because acquired # transports are stored in a set. Reusing the same object # messes with the count. proto = mock.Mock(should_close=False) proto.is_connected.return_value = True return proto conn._create_connection = create_connection # Simulate something like a crawler. It opens a connection, does # something with it, closes it, then creates tasks that make more # connections and waits for them to finish. The crawler is started # with multiple concurrent requests and stops when it hits a # predefined maximum number of requests. max_requests = 50 num_requests = 0 start_requests = max_connections + 1 async def f(start=True): nonlocal num_requests if num_requests == max_requests: return num_requests += 1 if not start: connection = await conn.connect(req, None, ClientTimeout()) await asyncio.sleep(0) connection.release() await asyncio.sleep(0) tasks = [loop.create_task(f(start=False)) for i in range(start_requests)] await asyncio.wait(tasks) await f() await conn.close() assert max_connections == num_connections async def test_connect_waiters_cleanup(loop) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://host:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop, limit=1) conn._available_connections = mock.Mock(return_value=0) t = loop.create_task(conn.connect(req, None, ClientTimeout())) await asyncio.sleep(0) assert conn._waiters.keys() t.cancel() await asyncio.sleep(0) assert not conn._waiters.keys() async def test_connect_waiters_cleanup_key_error(loop) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://host:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop, limit=1) conn._available_connections = mock.Mock(return_value=0) t = loop.create_task(conn.connect(req, None, ClientTimeout())) await asyncio.sleep(0) assert conn._waiters.keys() # we delete the entry explicitly before the # canceled connection grabs the loop again, we # must expect a none failure termination conn._waiters.clear() t.cancel() await asyncio.sleep(0) assert not conn._waiters.keys() == [] async def test_close_with_acquired_connection(loop) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://host:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop, limit=1) key = ("host", 80, False) conn._conns[key] = [(proto, loop.time())] conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) connection = await conn.connect(req, None, ClientTimeout()) assert 1 == len(conn._acquired) await conn.close() assert 0 == len(conn._acquired) assert conn.closed proto.close.assert_called_with() assert not connection.closed connection.close() assert connection.closed async def test_default_force_close(loop) -> None: connector = aiohttp.BaseConnector(loop=loop) assert not connector.force_close async def test_limit_property(loop) -> None: conn = aiohttp.BaseConnector(loop=loop, limit=15) assert 15 == conn.limit await conn.close() async def test_limit_per_host_property(loop) -> None: conn = aiohttp.BaseConnector(loop=loop, limit_per_host=15) assert 15 == conn.limit_per_host await conn.close() async def test_limit_property_default(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) assert conn.limit == 100 await conn.close() async def test_limit_per_host_property_default(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) assert conn.limit_per_host == 0 await conn.close() async def test_force_close_and_explicit_keep_alive(loop) -> None: with pytest.raises(ValueError): aiohttp.BaseConnector(loop=loop, keepalive_timeout=30, force_close=True) conn = aiohttp.BaseConnector(loop=loop, force_close=True, keepalive_timeout=None) assert conn conn = aiohttp.BaseConnector(loop=loop, force_close=True) assert conn async def test_error_on_connection(loop, key) -> None: conn = aiohttp.BaseConnector(limit=1, loop=loop) req = mock.Mock() req.connection_key = key proto = mock.Mock() i = 0 fut = loop.create_future() exc = OSError() async def create_connection(req, traces, timeout): nonlocal i i += 1 if i == 1: await fut raise exc elif i == 2: return proto conn._create_connection = create_connection t1 = loop.create_task(conn.connect(req, None, ClientTimeout())) t2 = loop.create_task(conn.connect(req, None, ClientTimeout())) await asyncio.sleep(0) assert not t1.done() assert not t2.done() assert len(conn._acquired_per_host[key]) == 1 fut.set_result(None) with pytest.raises(OSError): await t1 ret = await t2 assert len(conn._acquired_per_host[key]) == 1 assert ret._key == key assert ret.protocol == proto assert proto in conn._acquired ret.release() async def test_cancelled_waiter(loop) -> None: conn = aiohttp.BaseConnector(limit=1, loop=loop) req = mock.Mock() req.connection_key = "key" proto = mock.Mock() async def create_connection(req, traces=None): await asyncio.sleep(1) return proto conn._create_connection = create_connection conn._acquired.add(proto) conn2 = loop.create_task(conn.connect(req, None, ClientTimeout())) await asyncio.sleep(0) conn2.cancel() with pytest.raises(asyncio.CancelledError): await conn2 async def test_error_on_connection_with_cancelled_waiter(loop, key) -> None: conn = aiohttp.BaseConnector(limit=1, loop=loop) req = mock.Mock() req.connection_key = key proto = mock.Mock() i = 0 fut1 = loop.create_future() fut2 = loop.create_future() exc = OSError() async def create_connection(req, traces, timeout): nonlocal i i += 1 if i == 1: await fut1 raise exc if i == 2: await fut2 elif i == 3: return proto conn._create_connection = create_connection t1 = loop.create_task(conn.connect(req, None, ClientTimeout())) t2 = loop.create_task(conn.connect(req, None, ClientTimeout())) t3 = loop.create_task(conn.connect(req, None, ClientTimeout())) await asyncio.sleep(0) assert not t1.done() assert not t2.done() assert len(conn._acquired_per_host[key]) == 1 fut1.set_result(None) fut2.cancel() with pytest.raises(OSError): await t1 with pytest.raises(asyncio.CancelledError): await t2 ret = await t3 assert len(conn._acquired_per_host[key]) == 1 assert ret._key == key assert ret.protocol == proto assert proto in conn._acquired ret.release() async def test_tcp_connector(aiohttp_client, loop) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) r = await client.get("/") assert r.status == 200 @pytest.mark.skipif(not hasattr(socket, "AF_UNIX"), reason="requires UNIX sockets") async def test_unix_connector_not_found(loop) -> None: connector = aiohttp.UnixConnector("/" + uuid.uuid4().hex) req = ClientRequest("GET", URL("http://www.python.org"), loop=loop) with pytest.raises(aiohttp.ClientConnectorError): await connector.connect(req, None, ClientTimeout()) @pytest.mark.skipif(not hasattr(socket, "AF_UNIX"), reason="requires UNIX sockets") async def test_unix_connector_permission(loop) -> None: loop.create_unix_connection = make_mocked_coro(raise_exception=PermissionError()) connector = aiohttp.UnixConnector("/" + uuid.uuid4().hex, loop=loop) req = ClientRequest("GET", URL("http://www.python.org"), loop=loop) with pytest.raises(aiohttp.ClientConnectorError): await connector.connect(req, None, ClientTimeout()) @pytest.mark.skipif( platform.system() != "Windows", reason="Proactor Event loop present only in Windows" ) async def test_named_pipe_connector_wrong_loop(selector_loop, pipe_name) -> None: with pytest.raises(RuntimeError): aiohttp.NamedPipeConnector(pipe_name, loop=asyncio.get_event_loop()) @pytest.mark.skipif( platform.system() != "Windows", reason="Proactor Event loop present only in Windows" ) async def test_named_pipe_connector_not_found(proactor_loop, pipe_name) -> None: connector = aiohttp.NamedPipeConnector(pipe_name, loop=proactor_loop) req = ClientRequest("GET", URL("http://www.python.org"), loop=proactor_loop) with pytest.raises(aiohttp.ClientConnectorError): await connector.connect(req, None, ClientTimeout()) @pytest.mark.skipif( platform.system() != "Windows", reason="Proactor Event loop present only in Windows" ) async def test_named_pipe_connector_permission(proactor_loop, pipe_name) -> None: proactor_loop.create_pipe_connection = make_mocked_coro( raise_exception=PermissionError() ) connector = aiohttp.NamedPipeConnector(pipe_name, loop=proactor_loop) req = ClientRequest("GET", URL("http://www.python.org"), loop=proactor_loop) with pytest.raises(aiohttp.ClientConnectorError): await connector.connect(req, None, ClientTimeout()) async def test_default_use_dns_cache() -> None: conn = aiohttp.TCPConnector() assert conn.use_dns_cache async def test_ssl_none() -> None: conn = aiohttp.TCPConnector(ssl=None) assert conn._ssl is True async def test_resolver_not_called_with_address_is_ip(loop) -> None: resolver = mock.MagicMock() connector = aiohttp.TCPConnector(resolver=resolver) req = ClientRequest( "GET", URL(f"http://127.0.0.1:{unused_port()}"), loop=loop, response_class=mock.Mock(), ) with pytest.raises(OSError): await connector.connect(req, None, ClientTimeout()) resolver.resolve.assert_not_called() async def test_tcp_connector_raise_connector_ssl_error( aiohttp_server, ssl_ctx, ) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) srv = await aiohttp_server(app, ssl=ssl_ctx) port = unused_port() conn = aiohttp.TCPConnector(local_addr=("127.0.0.1", port)) session = aiohttp.ClientSession(connector=conn) url = srv.make_url("/") with pytest.raises(aiohttp.ClientConnectorCertificateError) as ctx: await session.get(url) assert isinstance(ctx.value, aiohttp.ClientConnectorCertificateError) assert isinstance(ctx.value.certificate_error, ssl.SSLError) await session.close() @pytest.mark.parametrize( "host", ( pytest.param("127.0.0.1", id="ip address"), pytest.param("localhost", id="domain name"), pytest.param("localhost.", id="fully-qualified domain name"), pytest.param( "localhost...", id="fully-qualified domain name with multiple trailing dots" ), pytest.param("príklad.localhost.", id="idna fully-qualified domain name"), ), ) async def test_tcp_connector_do_not_raise_connector_ssl_error( aiohttp_server, ssl_ctx, client_ssl_ctx, host, ) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) srv = await aiohttp_server(app, ssl=ssl_ctx) port = unused_port() conn = aiohttp.TCPConnector(local_addr=("127.0.0.1", port)) # resolving something.localhost with the real DNS resolver does not work on macOS, so we have a stub. async def _resolve_host(host, port, traces=None): return [ { "hostname": host, "host": "127.0.0.1", "port": port, "family": socket.AF_INET, "proto": 0, "flags": socket.AI_NUMERICHOST, }, { "hostname": host, "host": "::1", "port": port, "family": socket.AF_INET, "proto": 0, "flags": socket.AI_NUMERICHOST, }, ] conn._resolve_host = _resolve_host session = aiohttp.ClientSession(connector=conn) url = srv.make_url("/") r = await session.get(url.with_host(host), ssl=client_ssl_ctx) r.release() first_conn = next(iter(conn._conns.values()))[0][0] try: _sslcontext = first_conn.transport._ssl_protocol._sslcontext except AttributeError: _sslcontext = first_conn.transport._sslcontext assert _sslcontext is client_ssl_ctx r.close() await session.close() await conn.close() async def test_tcp_connector_uses_provided_local_addr(aiohttp_server) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) srv = await aiohttp_server(app) port = unused_port() conn = aiohttp.TCPConnector(local_addr=("127.0.0.1", port)) session = aiohttp.ClientSession(connector=conn) url = srv.make_url("/") r = await session.get(url) r.release() first_conn = next(iter(conn._conns.values()))[0][0] assert first_conn.transport.get_extra_info("sockname") == ("127.0.0.1", port) r.close() await session.close() await conn.close() async def test_unix_connector(unix_server, unix_sockname) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) await unix_server(app) url = "http://127.0.0.1/" connector = aiohttp.UnixConnector(unix_sockname) assert unix_sockname == connector.path session = client.ClientSession(connector=connector) r = await session.get(url) assert r.status == 200 r.close() await session.close() @pytest.mark.skipif( platform.system() != "Windows", reason="Proactor Event loop present only in Windows" ) async def test_named_pipe_connector( proactor_loop, named_pipe_server, pipe_name ) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) await named_pipe_server(app) url = "http://this-does-not-matter.com" connector = aiohttp.NamedPipeConnector(pipe_name) assert pipe_name == connector.path session = client.ClientSession(connector=connector) r = await session.get(url) assert r.status == 200 r.close() await session.close() class TestDNSCacheTable: @pytest.fixture def dns_cache_table(self): return _DNSCacheTable() def test_next_addrs_basic(self, dns_cache_table) -> None: dns_cache_table.add("localhost", ["127.0.0.1"]) dns_cache_table.add("foo", ["127.0.0.2"]) addrs = dns_cache_table.next_addrs("localhost") assert addrs == ["127.0.0.1"] addrs = dns_cache_table.next_addrs("foo") assert addrs == ["127.0.0.2"] with pytest.raises(KeyError): dns_cache_table.next_addrs("no-such-host") def test_remove(self, dns_cache_table) -> None: dns_cache_table.add("localhost", ["127.0.0.1"]) dns_cache_table.remove("localhost") with pytest.raises(KeyError): dns_cache_table.next_addrs("localhost") def test_clear(self, dns_cache_table) -> None: dns_cache_table.add("localhost", ["127.0.0.1"]) dns_cache_table.clear() with pytest.raises(KeyError): dns_cache_table.next_addrs("localhost") def test_not_expired_ttl_None(self, dns_cache_table) -> None: dns_cache_table.add("localhost", ["127.0.0.1"]) assert not dns_cache_table.expired("localhost") def test_not_expired_ttl(self) -> None: dns_cache_table = _DNSCacheTable(ttl=0.1) dns_cache_table.add("localhost", ["127.0.0.1"]) assert not dns_cache_table.expired("localhost") def test_expired_ttl(self, monkeypatch: pytest.MonkeyPatch) -> None: dns_cache_table = _DNSCacheTable(ttl=1) monkeypatch.setattr("aiohttp.connector.monotonic", lambda: 1) dns_cache_table.add("localhost", ["127.0.0.1"]) monkeypatch.setattr("aiohttp.connector.monotonic", lambda: 2) assert not dns_cache_table.expired("localhost") monkeypatch.setattr("aiohttp.connector.monotonic", lambda: 3) assert dns_cache_table.expired("localhost") def test_never_expire(self, monkeypatch: pytest.MonkeyPatch) -> None: dns_cache_table = _DNSCacheTable(ttl=None) monkeypatch.setattr("aiohttp.connector.monotonic", lambda: 1) dns_cache_table.add("localhost", ["127.0.0.1"]) monkeypatch.setattr("aiohttp.connector.monotonic", lambda: 10000000) assert not dns_cache_table.expired("localhost") def test_always_expire(self, monkeypatch: pytest.MonkeyPatch) -> None: dns_cache_table = _DNSCacheTable(ttl=0) monkeypatch.setattr("aiohttp.connector.monotonic", lambda: 1) dns_cache_table.add("localhost", ["127.0.0.1"]) monkeypatch.setattr("aiohttp.connector.monotonic", lambda: 1.00001) assert dns_cache_table.expired("localhost") def test_next_addrs(self, dns_cache_table) -> None: dns_cache_table.add("foo", ["127.0.0.1", "127.0.0.2", "127.0.0.3"]) # Each calls to next_addrs return the hosts using # a round robin strategy. addrs = dns_cache_table.next_addrs("foo") assert addrs == ["127.0.0.1", "127.0.0.2", "127.0.0.3"] addrs = dns_cache_table.next_addrs("foo") assert addrs == ["127.0.0.2", "127.0.0.3", "127.0.0.1"] addrs = dns_cache_table.next_addrs("foo") assert addrs == ["127.0.0.3", "127.0.0.1", "127.0.0.2"] addrs = dns_cache_table.next_addrs("foo") assert addrs == ["127.0.0.1", "127.0.0.2", "127.0.0.3"] def test_next_addrs_single(self, dns_cache_table) -> None: dns_cache_table.add("foo", ["127.0.0.1"]) addrs = dns_cache_table.next_addrs("foo") assert addrs == ["127.0.0.1"] addrs = dns_cache_table.next_addrs("foo") assert addrs == ["127.0.0.1"] async def test_connector_cache_trace_race(): class DummyTracer: async def send_dns_cache_hit(self, *args, **kwargs): connector._cached_hosts.remove(("", 0)) token = object() connector = TCPConnector() connector._cached_hosts.add(("", 0), [token]) traces = [DummyTracer()] assert await connector._resolve_host("", 0, traces) == [token] async def test_connector_throttle_trace_race(loop): key = ("", 0) token = object() class DummyTracer: async def send_dns_cache_hit(self, *args, **kwargs): event = connector._throttle_dns_events.pop(key) event.set() connector._cached_hosts.add(key, [token]) connector = TCPConnector() connector._throttle_dns_events[key] = EventResultOrError(loop) traces = [DummyTracer()] assert await connector._resolve_host("", 0, traces) == [token] async def test_connector_does_not_remove_needed_waiters(loop, key) -> None: proto = create_mocked_conn(loop) proto.is_connected.return_value = True req = ClientRequest("GET", URL("https://localhost:80"), loop=loop) connection_key = req.connection_key connector = aiohttp.BaseConnector() connector._available_connections = mock.Mock(return_value=0) connector._conns[key] = [(proto, loop.time())] connector._create_connection = create_mocked_conn(loop) connector._create_connection.return_value = loop.create_future() connector._create_connection.return_value.set_result(proto) dummy_waiter = loop.create_future() async def await_connection_and_check_waiters(): connection = await connector.connect(req, [], ClientTimeout()) try: assert connection_key in connector._waiters assert dummy_waiter in connector._waiters[connection_key] finally: connection.close() async def allow_connection_and_add_dummy_waiter(): # `asyncio.gather` may execute coroutines not in order. # Skip one event loop run cycle in such a case. if connection_key not in connector._waiters: await asyncio.sleep(0) connector._waiters[connection_key].popleft().set_result(None) del connector._waiters[connection_key] connector._waiters[connection_key].append(dummy_waiter) await asyncio.gather( await_connection_and_check_waiters(), allow_connection_and_add_dummy_waiter(), ) await connector.close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_cookiejar.py0000644000175100001770000010102614607525266017343 0ustar00runnerdockerimport asyncio import datetime import itertools import pathlib import pickle import unittest from http.cookies import BaseCookie, Morsel, SimpleCookie from unittest import mock import pytest from freezegun import freeze_time from yarl import URL from aiohttp import CookieJar, DummyCookieJar def dump_cookiejar() -> bytes: # pragma: no cover """Create pickled data for test_pickle_format().""" cj = CookieJar() cj.update_cookies(cookies_to_send.__pytest_wrapped__.obj()) return pickle.dumps(cj._cookies, pickle.HIGHEST_PROTOCOL) @pytest.fixture def cookies_to_send(): return SimpleCookie( "shared-cookie=first; " "domain-cookie=second; Domain=example.com; " "subdomain1-cookie=third; Domain=test1.example.com; " "subdomain2-cookie=fourth; Domain=test2.example.com; " "dotted-domain-cookie=fifth; Domain=.example.com; " "different-domain-cookie=sixth; Domain=different.org; " "secure-cookie=seventh; Domain=secure.com; Secure; " "no-path-cookie=eighth; Domain=pathtest.com; " "path1-cookie=ninth; Domain=pathtest.com; Path=/; " "path2-cookie=tenth; Domain=pathtest.com; Path=/one; " "path3-cookie=eleventh; Domain=pathtest.com; Path=/one/two; " "path4-cookie=twelfth; Domain=pathtest.com; Path=/one/two/; " "expires-cookie=thirteenth; Domain=expirestest.com; Path=/;" " Expires=Tue, 1 Jan 2999 12:00:00 GMT; " "max-age-cookie=fourteenth; Domain=maxagetest.com; Path=/;" " Max-Age=60; " "invalid-max-age-cookie=fifteenth; Domain=invalid-values.com; " " Max-Age=string; " "invalid-expires-cookie=sixteenth; Domain=invalid-values.com; " " Expires=string;" ) @pytest.fixture def cookies_to_send_with_expired(): return SimpleCookie( "shared-cookie=first; " "domain-cookie=second; Domain=example.com; " "subdomain1-cookie=third; Domain=test1.example.com; " "subdomain2-cookie=fourth; Domain=test2.example.com; " "dotted-domain-cookie=fifth; Domain=.example.com; " "different-domain-cookie=sixth; Domain=different.org; " "secure-cookie=seventh; Domain=secure.com; Secure; " "no-path-cookie=eighth; Domain=pathtest.com; " "path1-cookie=ninth; Domain=pathtest.com; Path=/; " "path2-cookie=tenth; Domain=pathtest.com; Path=/one; " "path3-cookie=eleventh; Domain=pathtest.com; Path=/one/two; " "path4-cookie=twelfth; Domain=pathtest.com; Path=/one/two/; " "expires-cookie=thirteenth; Domain=expirestest.com; Path=/;" " Expires=Tue, 1 Jan 1980 12:00:00 GMT; " "max-age-cookie=fourteenth; Domain=maxagetest.com; Path=/;" " Max-Age=60; " "invalid-max-age-cookie=fifteenth; Domain=invalid-values.com; " " Max-Age=string; " "invalid-expires-cookie=sixteenth; Domain=invalid-values.com; " " Expires=string;" ) @pytest.fixture def cookies_to_receive(): return SimpleCookie( "unconstrained-cookie=first; Path=/; " "domain-cookie=second; Domain=example.com; Path=/; " "subdomain1-cookie=third; Domain=test1.example.com; Path=/; " "subdomain2-cookie=fourth; Domain=test2.example.com; Path=/; " "dotted-domain-cookie=fifth; Domain=.example.com; Path=/; " "different-domain-cookie=sixth; Domain=different.org; Path=/; " "no-path-cookie=seventh; Domain=pathtest.com; " "path-cookie=eighth; Domain=pathtest.com; Path=/somepath; " "wrong-path-cookie=ninth; Domain=pathtest.com; Path=somepath;" ) def test_date_parsing() -> None: parse_func = CookieJar._parse_date utc = datetime.timezone.utc assert parse_func("") is None # 70 -> 1970 assert ( parse_func("Tue, 1 Jan 70 00:00:00 GMT") == datetime.datetime(1970, 1, 1, tzinfo=utc).timestamp() ) # 10 -> 2010 assert ( parse_func("Tue, 1 Jan 10 00:00:00 GMT") == datetime.datetime(2010, 1, 1, tzinfo=utc).timestamp() ) # No day of week string assert ( parse_func("1 Jan 1970 00:00:00 GMT") == datetime.datetime(1970, 1, 1, tzinfo=utc).timestamp() ) # No timezone string assert ( parse_func("Tue, 1 Jan 1970 00:00:00") == datetime.datetime(1970, 1, 1, tzinfo=utc).timestamp() ) # No year assert parse_func("Tue, 1 Jan 00:00:00 GMT") is None # No month assert parse_func("Tue, 1 1970 00:00:00 GMT") is None # No day of month assert parse_func("Tue, Jan 1970 00:00:00 GMT") is None # No time assert parse_func("Tue, 1 Jan 1970 GMT") is None # Invalid day of month assert parse_func("Tue, 0 Jan 1970 00:00:00 GMT") is None # Invalid year assert parse_func("Tue, 1 Jan 1500 00:00:00 GMT") is None # Invalid time assert parse_func("Tue, 1 Jan 1970 77:88:99 GMT") is None def test_domain_matching() -> None: test_func = CookieJar._is_domain_match assert test_func("test.com", "test.com") assert test_func("test.com", "sub.test.com") assert not test_func("test.com", "") assert not test_func("test.com", "test.org") assert not test_func("diff-test.com", "test.com") assert not test_func("test.com", "diff-test.com") assert not test_func("test.com", "127.0.0.1") def test_path_matching() -> None: test_func = CookieJar._is_path_match assert test_func("/", "") assert test_func("", "/") assert test_func("/file", "") assert test_func("/folder/file", "") assert test_func("/", "/") assert test_func("/file", "/") assert test_func("/file", "/file") assert test_func("/folder/", "/folder/") assert test_func("/folder/", "/") assert test_func("/folder/file", "/") assert not test_func("/", "/file") assert not test_func("/", "/folder/") assert not test_func("/file", "/folder/file") assert not test_func("/folder/", "/folder/file") assert not test_func("/different-file", "/file") assert not test_func("/different-folder/", "/folder/") async def test_constructor(loop, cookies_to_send, cookies_to_receive) -> None: jar = CookieJar(loop=loop) jar.update_cookies(cookies_to_send) jar_cookies = SimpleCookie() for cookie in jar: dict.__setitem__(jar_cookies, cookie.key, cookie) expected_cookies = cookies_to_send assert jar_cookies == expected_cookies assert jar._loop is loop async def test_constructor_with_expired( loop, cookies_to_send_with_expired, cookies_to_receive ) -> None: jar = CookieJar() jar.update_cookies(cookies_to_send_with_expired) jar_cookies = SimpleCookie() for cookie in jar: dict.__setitem__(jar_cookies, cookie.key, cookie) expected_cookies = cookies_to_send_with_expired assert jar_cookies != expected_cookies assert jar._loop is loop async def test_save_load(tmp_path, loop, cookies_to_send, cookies_to_receive) -> None: file_path = pathlib.Path(str(tmp_path)) / "aiohttp.test.cookie" # export cookie jar jar_save = CookieJar(loop=loop) jar_save.update_cookies(cookies_to_receive) jar_save.save(file_path=file_path) jar_load = CookieJar(loop=loop) jar_load.load(file_path=file_path) jar_test = SimpleCookie() for cookie in jar_load: jar_test[cookie.key] = cookie assert jar_test == cookies_to_receive async def test_update_cookie_with_unicode_domain(loop) -> None: cookies = ( "idna-domain-first=first; Domain=xn--9caa.com; Path=/;", "idna-domain-second=second; Domain=xn--9caa.com; Path=/;", ) jar = CookieJar(loop=loop) jar.update_cookies(SimpleCookie(cookies[0]), URL("http://éé.com/")) jar.update_cookies(SimpleCookie(cookies[1]), URL("http://xn--9caa.com/")) jar_test = SimpleCookie() for cookie in jar: jar_test[cookie.key] = cookie assert jar_test == SimpleCookie(" ".join(cookies)) async def test_filter_cookie_with_unicode_domain(loop) -> None: jar = CookieJar() jar.update_cookies( SimpleCookie("idna-domain-first=first; Domain=xn--9caa.com; Path=/; ") ) assert len(jar.filter_cookies(URL("http://éé.com"))) == 1 assert len(jar.filter_cookies(URL("http://xn--9caa.com"))) == 1 async def test_domain_filter_ip_cookie_send(loop) -> None: jar = CookieJar(loop=loop) cookies = SimpleCookie( "shared-cookie=first; " "domain-cookie=second; Domain=example.com; " "subdomain1-cookie=third; Domain=test1.example.com; " "subdomain2-cookie=fourth; Domain=test2.example.com; " "dotted-domain-cookie=fifth; Domain=.example.com; " "different-domain-cookie=sixth; Domain=different.org; " "secure-cookie=seventh; Domain=secure.com; Secure; " "no-path-cookie=eighth; Domain=pathtest.com; " "path1-cookie=ninth; Domain=pathtest.com; Path=/; " "path2-cookie=tenth; Domain=pathtest.com; Path=/one; " "path3-cookie=eleventh; Domain=pathtest.com; Path=/one/two; " "path4-cookie=twelfth; Domain=pathtest.com; Path=/one/two/; " "expires-cookie=thirteenth; Domain=expirestest.com; Path=/;" " Expires=Tue, 1 Jan 1980 12:00:00 GMT; " "max-age-cookie=fourteenth; Domain=maxagetest.com; Path=/;" " Max-Age=60; " "invalid-max-age-cookie=fifteenth; Domain=invalid-values.com; " " Max-Age=string; " "invalid-expires-cookie=sixteenth; Domain=invalid-values.com; " " Expires=string;" ) jar.update_cookies(cookies) cookies_sent = jar.filter_cookies(URL("http://1.2.3.4/")).output(header="Cookie:") assert cookies_sent == "Cookie: shared-cookie=first" async def test_domain_filter_ip_cookie_receive(cookies_to_receive) -> None: jar = CookieJar() jar.update_cookies(cookies_to_receive, URL("http://1.2.3.4/")) assert len(jar) == 0 @pytest.mark.parametrize( ("cookies", "expected", "quote_bool"), [ ( "shared-cookie=first; ip-cookie=second; Domain=127.0.0.1;", "Cookie: ip-cookie=second\r\nCookie: shared-cookie=first", True, ), ('ip-cookie="second"; Domain=127.0.0.1;', 'Cookie: ip-cookie="second"', True), ("custom-cookie=value/one;", 'Cookie: custom-cookie="value/one"', True), ("custom-cookie=value1;", "Cookie: custom-cookie=value1", True), ("custom-cookie=value/one;", "Cookie: custom-cookie=value/one", False), ], ids=( "IP domain preserved", "no shared cookie", "quoted cookie with special char", "quoted cookie w/o special char", "unquoted cookie with special char", ), ) async def test_quotes_correctly_based_on_input( loop, cookies, expected, quote_bool ) -> None: jar = CookieJar(unsafe=True, quote_cookie=quote_bool) jar.update_cookies(SimpleCookie(cookies)) cookies_sent = jar.filter_cookies(URL("http://127.0.0.1/")).output(header="Cookie:") assert cookies_sent == expected async def test_ignore_domain_ending_with_dot(loop) -> None: jar = CookieJar(loop=loop, unsafe=True) jar.update_cookies( SimpleCookie("cookie=val; Domain=example.com.;"), URL("http://www.example.com") ) cookies_sent = jar.filter_cookies(URL("http://www.example.com/")) assert cookies_sent.output(header="Cookie:") == "Cookie: cookie=val" cookies_sent = jar.filter_cookies(URL("http://example.com/")) assert cookies_sent.output(header="Cookie:") == "" class TestCookieJarBase(unittest.TestCase): def setUp(self): self.loop = asyncio.new_event_loop() asyncio.set_event_loop(None) # N.B. those need to be overridden in child test cases async def make_jar(): return CookieJar() self.jar = self.loop.run_until_complete(make_jar()) def tearDown(self): self.loop.close() def request_reply_with_same_url(self, url): self.jar.update_cookies(self.cookies_to_send) cookies_sent = self.jar.filter_cookies(URL(url)) self.jar.clear() self.jar.update_cookies(self.cookies_to_receive, URL(url)) cookies_received = SimpleCookie() for cookie in self.jar: dict.__setitem__(cookies_received, cookie.key, cookie) self.jar.clear() return cookies_sent, cookies_received class TestCookieJarSafe(TestCookieJarBase): def setUp(self): super().setUp() self.cookies_to_send = SimpleCookie( "shared-cookie=first; " "domain-cookie=second; Domain=example.com; " "subdomain1-cookie=third; Domain=test1.example.com; " "subdomain2-cookie=fourth; Domain=test2.example.com; " "dotted-domain-cookie=fifth; Domain=.example.com; " "different-domain-cookie=sixth; Domain=different.org; " "secure-cookie=seventh; Domain=secure.com; Secure; " "no-path-cookie=eighth; Domain=pathtest.com; " "path1-cookie=ninth; Domain=pathtest.com; Path=/; " "path2-cookie=tenth; Domain=pathtest.com; Path=/one; " "path3-cookie=eleventh; Domain=pathtest.com; Path=/one/two; " "path4-cookie=twelfth; Domain=pathtest.com; Path=/one/two/; " "expires-cookie=thirteenth; Domain=expirestest.com; Path=/;" " Expires=Tue, 1 Jan 1980 12:00:00 GMT; " "max-age-cookie=fourteenth; Domain=maxagetest.com; Path=/;" " Max-Age=60; " "invalid-max-age-cookie=fifteenth; Domain=invalid-values.com; " " Max-Age=string; " "invalid-expires-cookie=sixteenth; Domain=invalid-values.com; " " Expires=string;" ) self.cookies_to_receive = SimpleCookie( "unconstrained-cookie=first; Path=/; " "domain-cookie=second; Domain=example.com; Path=/; " "subdomain1-cookie=third; Domain=test1.example.com; Path=/; " "subdomain2-cookie=fourth; Domain=test2.example.com; Path=/; " "dotted-domain-cookie=fifth; Domain=.example.com; Path=/; " "different-domain-cookie=sixth; Domain=different.org; Path=/; " "no-path-cookie=seventh; Domain=pathtest.com; " "path-cookie=eighth; Domain=pathtest.com; Path=/somepath; " "wrong-path-cookie=ninth; Domain=pathtest.com; Path=somepath;" ) async def make_jar(): return CookieJar() self.jar = self.loop.run_until_complete(make_jar()) def timed_request(self, url, update_time, send_time): if isinstance(update_time, int): update_time = datetime.timedelta(seconds=update_time) elif isinstance(update_time, float): update_time = datetime.datetime.fromtimestamp(update_time) if isinstance(send_time, int): send_time = datetime.timedelta(seconds=send_time) elif isinstance(send_time, float): send_time = datetime.datetime.fromtimestamp(send_time) with freeze_time(update_time): self.jar.update_cookies(self.cookies_to_send) with freeze_time(send_time): cookies_sent = self.jar.filter_cookies(URL(url)) self.jar.clear() return cookies_sent def test_domain_filter_same_host(self) -> None: cookies_sent, cookies_received = self.request_reply_with_same_url( "http://example.com/" ) self.assertEqual( set(cookies_sent.keys()), {"shared-cookie", "domain-cookie", "dotted-domain-cookie"}, ) self.assertEqual( set(cookies_received.keys()), {"unconstrained-cookie", "domain-cookie", "dotted-domain-cookie"}, ) def test_domain_filter_same_host_and_subdomain(self) -> None: cookies_sent, cookies_received = self.request_reply_with_same_url( "http://test1.example.com/" ) self.assertEqual( set(cookies_sent.keys()), { "shared-cookie", "domain-cookie", "subdomain1-cookie", "dotted-domain-cookie", }, ) self.assertEqual( set(cookies_received.keys()), { "unconstrained-cookie", "domain-cookie", "subdomain1-cookie", "dotted-domain-cookie", }, ) def test_domain_filter_same_host_diff_subdomain(self) -> None: cookies_sent, cookies_received = self.request_reply_with_same_url( "http://different.example.com/" ) self.assertEqual( set(cookies_sent.keys()), {"shared-cookie", "domain-cookie", "dotted-domain-cookie"}, ) self.assertEqual( set(cookies_received.keys()), {"unconstrained-cookie", "domain-cookie", "dotted-domain-cookie"}, ) def test_domain_filter_diff_host(self) -> None: cookies_sent, cookies_received = self.request_reply_with_same_url( "http://different.org/" ) self.assertEqual( set(cookies_sent.keys()), {"shared-cookie", "different-domain-cookie"} ) self.assertEqual( set(cookies_received.keys()), {"unconstrained-cookie", "different-domain-cookie"}, ) def test_domain_filter_host_only(self) -> None: self.jar.update_cookies(self.cookies_to_receive, URL("http://example.com/")) cookies_sent = self.jar.filter_cookies(URL("http://example.com/")) self.assertIn("unconstrained-cookie", set(cookies_sent.keys())) cookies_sent = self.jar.filter_cookies(URL("http://different.org/")) self.assertNotIn("unconstrained-cookie", set(cookies_sent.keys())) def test_secure_filter(self) -> None: cookies_sent, _ = self.request_reply_with_same_url("http://secure.com/") self.assertEqual(set(cookies_sent.keys()), {"shared-cookie"}) cookies_sent, _ = self.request_reply_with_same_url("https://secure.com/") self.assertEqual(set(cookies_sent.keys()), {"shared-cookie", "secure-cookie"}) def test_path_filter_root(self) -> None: cookies_sent, _ = self.request_reply_with_same_url("http://pathtest.com/") self.assertEqual( set(cookies_sent.keys()), {"shared-cookie", "no-path-cookie", "path1-cookie"}, ) def test_path_filter_folder(self) -> None: cookies_sent, _ = self.request_reply_with_same_url("http://pathtest.com/one/") self.assertEqual( set(cookies_sent.keys()), {"shared-cookie", "no-path-cookie", "path1-cookie", "path2-cookie"}, ) def test_path_filter_file(self) -> None: cookies_sent, _ = self.request_reply_with_same_url( "http://pathtest.com/one/two" ) self.assertEqual( set(cookies_sent.keys()), { "shared-cookie", "no-path-cookie", "path1-cookie", "path2-cookie", "path3-cookie", }, ) def test_path_filter_subfolder(self) -> None: cookies_sent, _ = self.request_reply_with_same_url( "http://pathtest.com/one/two/" ) self.assertEqual( set(cookies_sent.keys()), { "shared-cookie", "no-path-cookie", "path1-cookie", "path2-cookie", "path3-cookie", "path4-cookie", }, ) def test_path_filter_subsubfolder(self) -> None: cookies_sent, _ = self.request_reply_with_same_url( "http://pathtest.com/one/two/three/" ) self.assertEqual( set(cookies_sent.keys()), { "shared-cookie", "no-path-cookie", "path1-cookie", "path2-cookie", "path3-cookie", "path4-cookie", }, ) def test_path_filter_different_folder(self) -> None: cookies_sent, _ = self.request_reply_with_same_url( "http://pathtest.com/hundred/" ) self.assertEqual( set(cookies_sent.keys()), {"shared-cookie", "no-path-cookie", "path1-cookie"}, ) def test_path_value(self) -> None: _, cookies_received = self.request_reply_with_same_url("http://pathtest.com/") self.assertEqual( set(cookies_received.keys()), { "unconstrained-cookie", "no-path-cookie", "path-cookie", "wrong-path-cookie", }, ) self.assertEqual(cookies_received["no-path-cookie"]["path"], "/") self.assertEqual(cookies_received["path-cookie"]["path"], "/somepath") self.assertEqual(cookies_received["wrong-path-cookie"]["path"], "/") def test_expires(self) -> None: ts_before = datetime.datetime( 1975, 1, 1, tzinfo=datetime.timezone.utc ).timestamp() ts_after = datetime.datetime( 2030, 1, 1, tzinfo=datetime.timezone.utc ).timestamp() cookies_sent = self.timed_request( "http://expirestest.com/", ts_before, ts_before ) self.assertEqual(set(cookies_sent.keys()), {"shared-cookie", "expires-cookie"}) cookies_sent = self.timed_request( "http://expirestest.com/", ts_before, ts_after ) self.assertEqual(set(cookies_sent.keys()), {"shared-cookie"}) def test_max_age(self) -> None: cookies_sent = self.timed_request("http://maxagetest.com/", 1000, 1000) self.assertEqual(set(cookies_sent.keys()), {"shared-cookie", "max-age-cookie"}) cookies_sent = self.timed_request("http://maxagetest.com/", 1000, 2000) self.assertEqual(set(cookies_sent.keys()), {"shared-cookie"}) def test_invalid_values(self) -> None: cookies_sent, cookies_received = self.request_reply_with_same_url( "http://invalid-values.com/" ) self.assertEqual( set(cookies_sent.keys()), {"shared-cookie", "invalid-max-age-cookie", "invalid-expires-cookie"}, ) cookie = cookies_sent["invalid-max-age-cookie"] self.assertEqual(cookie["max-age"], "") cookie = cookies_sent["invalid-expires-cookie"] self.assertEqual(cookie["expires"], "") def test_cookie_not_expired_when_added_after_removal(self) -> None: # Test case for https://github.com/aio-libs/aiohttp/issues/2084 timestamps = [ 533588.993, 533588.993, 533588.993, 533588.993, 533589.093, 533589.093, ] loop = mock.Mock() loop.time.side_effect = itertools.chain( timestamps, itertools.cycle([timestamps[-1]]) ) async def make_jar(): return CookieJar(unsafe=True) jar = self.loop.run_until_complete(make_jar()) # Remove `foo` cookie. jar.update_cookies(SimpleCookie('foo=""; Max-Age=0')) # Set `foo` cookie to `bar`. jar.update_cookies(SimpleCookie('foo="bar"')) # Assert that there is a cookie. assert len(jar) == 1 def test_path_filter_diff_folder_same_name(self) -> None: async def make_jar(): return CookieJar(unsafe=True) jar = self.loop.run_until_complete(make_jar()) jar.update_cookies( SimpleCookie("path-cookie=zero; Domain=pathtest.com; Path=/; ") ) jar.update_cookies( SimpleCookie("path-cookie=one; Domain=pathtest.com; Path=/one; ") ) self.assertEqual(len(jar), 2) jar_filtered = jar.filter_cookies(URL("http://pathtest.com/")) self.assertEqual(len(jar_filtered), 1) self.assertEqual(jar_filtered["path-cookie"].value, "zero") jar_filtered = jar.filter_cookies(URL("http://pathtest.com/one")) self.assertEqual(len(jar_filtered), 1) self.assertEqual(jar_filtered["path-cookie"].value, "one") def test_path_filter_diff_folder_same_name_return_best_match_independent_from_put_order( self, ) -> None: async def make_jar(): return CookieJar(unsafe=True) jar = self.loop.run_until_complete(make_jar()) jar.update_cookies( SimpleCookie("path-cookie=one; Domain=pathtest.com; Path=/one; ") ) jar.update_cookies( SimpleCookie("path-cookie=zero; Domain=pathtest.com; Path=/; ") ) jar.update_cookies( SimpleCookie("path-cookie=two; Domain=pathtest.com; Path=/second; ") ) self.assertEqual(len(jar), 3) jar_filtered = jar.filter_cookies(URL("http://pathtest.com/")) self.assertEqual(len(jar_filtered), 1) self.assertEqual(jar_filtered["path-cookie"].value, "zero") jar_filtered = jar.filter_cookies(URL("http://pathtest.com/second")) self.assertEqual(len(jar_filtered), 1) self.assertEqual(jar_filtered["path-cookie"].value, "two") jar_filtered = jar.filter_cookies(URL("http://pathtest.com/one")) self.assertEqual(len(jar_filtered), 1) self.assertEqual(jar_filtered["path-cookie"].value, "one") async def test_dummy_cookie_jar() -> None: cookie = SimpleCookie("foo=bar; Domain=example.com;") dummy_jar = DummyCookieJar() assert len(dummy_jar) == 0 dummy_jar.update_cookies(cookie) assert len(dummy_jar) == 0 with pytest.raises(StopIteration): next(iter(dummy_jar)) assert not dummy_jar.filter_cookies(URL("http://example.com/")) dummy_jar.clear() async def test_loose_cookies_types() -> None: jar = CookieJar() accepted_types = [ [("str", BaseCookie())], [("str", Morsel())], [ ("str", "str"), ], {"str": BaseCookie()}, {"str": Morsel()}, {"str": "str"}, SimpleCookie(), ] for loose_cookies_type in accepted_types: jar.update_cookies(cookies=loose_cookies_type) async def test_cookie_jar_clear_all(): sut = CookieJar() cookie = SimpleCookie() cookie["foo"] = "bar" sut.update_cookies(cookie) sut.clear() assert len(sut) == 0 async def test_cookie_jar_clear_expired(): sut = CookieJar() cookie = SimpleCookie() cookie["foo"] = "bar" cookie["foo"]["expires"] = "Tue, 1 Jan 1990 12:00:00 GMT" with freeze_time("1980-01-01"): sut.update_cookies(cookie) sut.clear(lambda x: False) with freeze_time("1980-01-01"): assert len(sut) == 0 async def test_cookie_jar_clear_domain(): sut = CookieJar() cookie = SimpleCookie() cookie["foo"] = "bar" cookie["domain_cookie"] = "value" cookie["domain_cookie"]["domain"] = "example.com" cookie["subdomain_cookie"] = "value" cookie["subdomain_cookie"]["domain"] = "test.example.com" sut.update_cookies(cookie) sut.clear_domain("example.com") iterator = iter(sut) morsel = next(iterator) assert morsel.key == "foo" assert morsel.value == "bar" with pytest.raises(StopIteration): next(iterator) async def test_pickle_format(cookies_to_send) -> None: """Test if cookiejar pickle format breaks. If this test fails, it may indicate that saved cookiejars will stop working. If that happens then: 1. Avoid releasing the change in a bugfix release. 2. Try to include a migration script in the release notes (example below). 3. Use dump_cookiejar() at the top of this file to update `pickled`. Depending on the changes made, a migration script might look like: import pickle with file_path.open("rb") as f: cookies = pickle.load(f) morsels = [(name, m) for c in cookies.values() for name, m in c.items()] cookies.clear() for name, m in morsels: cookies[(m["domain"], m["path"])][name] = m with file_path.open("wb") as f: pickle.dump(cookies, f, pickle.HIGHEST_PROTOCOL) """ pickled = b"\x80\x05\x95\xc5\x07\x00\x00\x00\x00\x00\x00\x8c\x0bcollections\x94\x8c\x0bdefaultdict\x94\x93\x94\x8c\x0chttp.cookies\x94\x8c\x0cSimpleCookie\x94\x93\x94\x85\x94R\x94(\x8c\x00\x94\x8c\x01/\x94\x86\x94h\x05)\x81\x94\x8c\rshared-cookie\x94h\x03\x8c\x06Morsel\x94\x93\x94)\x81\x94(\x8c\x07expires\x94h\x08\x8c\x04path\x94h\t\x8c\x07comment\x94h\x08\x8c\x06domain\x94h\x08\x8c\x07max-age\x94h\x08\x8c\x06secure\x94h\x08\x8c\x08httponly\x94h\x08\x8c\x07version\x94h\x08\x8c\x08samesite\x94h\x08u}\x94(\x8c\x03key\x94h\x0c\x8c\x05value\x94\x8c\x05first\x94\x8c\x0bcoded_value\x94h\x1cubs\x8c\x0bexample.com\x94h\t\x86\x94h\x05)\x81\x94(\x8c\rdomain-cookie\x94h\x0e)\x81\x94(h\x10h\x08h\x11h\th\x12h\x08h\x13h\x1eh\x14h\x08h\x15h\x08h\x16h\x08h\x17h\x08h\x18h\x08u}\x94(h\x1ah!h\x1b\x8c\x06second\x94h\x1dh$ub\x8c\x14dotted-domain-cookie\x94h\x0e)\x81\x94(h\x10h\x08h\x11h\th\x12h\x08h\x13\x8c\x0bexample.com\x94h\x14h\x08h\x15h\x08h\x16h\x08h\x17h\x08h\x18h\x08u}\x94(h\x1ah%h\x1b\x8c\x05fifth\x94h\x1dh)ubu\x8c\x11test1.example.com\x94h\t\x86\x94h\x05)\x81\x94\x8c\x11subdomain1-cookie\x94h\x0e)\x81\x94(h\x10h\x08h\x11h\th\x12h\x08h\x13h*h\x14h\x08h\x15h\x08h\x16h\x08h\x17h\x08h\x18h\x08u}\x94(h\x1ah-h\x1b\x8c\x05third\x94h\x1dh0ubs\x8c\x11test2.example.com\x94h\t\x86\x94h\x05)\x81\x94\x8c\x11subdomain2-cookie\x94h\x0e)\x81\x94(h\x10h\x08h\x11h\th\x12h\x08h\x13h1h\x14h\x08h\x15h\x08h\x16h\x08h\x17h\x08h\x18h\x08u}\x94(h\x1ah4h\x1b\x8c\x06fourth\x94h\x1dh7ubs\x8c\rdifferent.org\x94h\t\x86\x94h\x05)\x81\x94\x8c\x17different-domain-cookie\x94h\x0e)\x81\x94(h\x10h\x08h\x11h\th\x12h\x08h\x13h8h\x14h\x08h\x15h\x08h\x16h\x08h\x17h\x08h\x18h\x08u}\x94(h\x1ah;h\x1b\x8c\x05sixth\x94h\x1dh>ubs\x8c\nsecure.com\x94h\t\x86\x94h\x05)\x81\x94\x8c\rsecure-cookie\x94h\x0e)\x81\x94(h\x10h\x08h\x11h\th\x12h\x08h\x13h?h\x14h\x08h\x15\x88h\x16h\x08h\x17h\x08h\x18h\x08u}\x94(h\x1ahBh\x1b\x8c\x07seventh\x94h\x1dhEubs\x8c\x0cpathtest.com\x94h\t\x86\x94h\x05)\x81\x94(\x8c\x0eno-path-cookie\x94h\x0e)\x81\x94(h\x10h\x08h\x11h\th\x12h\x08h\x13hFh\x14h\x08h\x15h\x08h\x16h\x08h\x17h\x08h\x18h\x08u}\x94(h\x1ahIh\x1b\x8c\x06eighth\x94h\x1dhLub\x8c\x0cpath1-cookie\x94h\x0e)\x81\x94(h\x10h\x08h\x11h\th\x12h\x08h\x13\x8c\x0cpathtest.com\x94h\x14h\x08h\x15h\x08h\x16h\x08h\x17h\x08h\x18h\x08u}\x94(h\x1ahMh\x1b\x8c\x05ninth\x94h\x1dhQubu\x8c\x0cpathtest.com\x94\x8c\x04/one\x94\x86\x94h\x05)\x81\x94\x8c\x0cpath2-cookie\x94h\x0e)\x81\x94(h\x10h\x08h\x11hSh\x12h\x08h\x13hRh\x14h\x08h\x15h\x08h\x16h\x08h\x17h\x08h\x18h\x08u}\x94(h\x1ahVh\x1b\x8c\x05tenth\x94h\x1dhYubs\x8c\x0cpathtest.com\x94\x8c\x08/one/two\x94\x86\x94h\x05)\x81\x94\x8c\x0cpath3-cookie\x94h\x0e)\x81\x94(h\x10h\x08h\x11h[h\x12h\x08h\x13hZh\x14h\x08h\x15h\x08h\x16h\x08h\x17h\x08h\x18h\x08u}\x94(h\x1ah^h\x1b\x8c\x08eleventh\x94h\x1dhaubs\x8c\x0cpathtest.com\x94\x8c\t/one/two/\x94\x86\x94h\x05)\x81\x94\x8c\x0cpath4-cookie\x94h\x0e)\x81\x94(h\x10h\x08h\x11hch\x12h\x08h\x13hbh\x14h\x08h\x15h\x08h\x16h\x08h\x17h\x08h\x18h\x08u}\x94(h\x1ahfh\x1b\x8c\x07twelfth\x94h\x1dhiubs\x8c\x0fexpirestest.com\x94h\t\x86\x94h\x05)\x81\x94\x8c\x0eexpires-cookie\x94h\x0e)\x81\x94(h\x10\x8c\x1cTue, 1 Jan 2999 12:00:00 GMT\x94h\x11h\th\x12h\x08h\x13hjh\x14h\x08h\x15h\x08h\x16h\x08h\x17h\x08h\x18h\x08u}\x94(h\x1ahmh\x1b\x8c\nthirteenth\x94h\x1dhqubs\x8c\x0emaxagetest.com\x94h\t\x86\x94h\x05)\x81\x94\x8c\x0emax-age-cookie\x94h\x0e)\x81\x94(h\x10h\x08h\x11h\th\x12h\x08h\x13hrh\x14\x8c\x0260\x94h\x15h\x08h\x16h\x08h\x17h\x08h\x18h\x08u}\x94(h\x1ahuh\x1b\x8c\nfourteenth\x94h\x1dhyubs\x8c\x12invalid-values.com\x94h\t\x86\x94h\x05)\x81\x94(\x8c\x16invalid-max-age-cookie\x94h\x0e)\x81\x94(h\x10h\x08h\x11h\th\x12h\x08h\x13hzh\x14h\x08h\x15h\x08h\x16h\x08h\x17h\x08h\x18h\x08u}\x94(h\x1ah}h\x1b\x8c\tfifteenth\x94h\x1dh\x80ub\x8c\x16invalid-expires-cookie\x94h\x0e)\x81\x94(h\x10h\x08h\x11h\th\x12h\x08h\x13\x8c\x12invalid-values.com\x94h\x14h\x08h\x15h\x08h\x16h\x08h\x17h\x08h\x18h\x08u}\x94(h\x1ah\x81h\x1b\x8c\tsixteenth\x94h\x1dh\x85ubuu." cookies = pickle.loads(pickled) cj = CookieJar() cj.update_cookies(cookies_to_send) assert cookies == cj._cookies @pytest.mark.parametrize( "url", [ "http://127.0.0.1/index.html", URL("http://127.0.0.1/index.html"), ["http://127.0.0.1/index.html"], [URL("http://127.0.0.1/index.html")], ], ) async def test_treat_as_secure_origin_init(url) -> None: jar = CookieJar(unsafe=True, treat_as_secure_origin=url) assert jar._treat_as_secure_origin == [URL("http://127.0.0.1")] async def test_treat_as_secure_origin() -> None: endpoint = URL("http://127.0.0.1/") jar = CookieJar(unsafe=True, treat_as_secure_origin=[endpoint]) secure_cookie = SimpleCookie( "cookie-key=cookie-value; HttpOnly; Path=/; Secure", ) jar.update_cookies( secure_cookie, endpoint, ) assert len(jar) == 1 filtered_cookies = jar.filter_cookies(request_url=endpoint) assert len(filtered_cookies) == 1 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_flowcontrol_streams.py0000644000175100001770000001012714607525266021504 0ustar00runnerdockerfrom unittest import mock import pytest from aiohttp import streams @pytest.fixture def protocol(): return mock.Mock(_reading_paused=False) @pytest.fixture def stream(loop, protocol): out = streams.StreamReader(protocol, limit=1, loop=loop) out._allow_pause = True return out @pytest.fixture def buffer(loop, protocol): out = streams.FlowControlDataQueue(protocol, limit=1, loop=loop) out._allow_pause = True return out class TestFlowControlStreamReader: async def test_read(self, stream) -> None: stream.feed_data(b"da", 2) res = await stream.read(1) assert res == b"d" assert not stream._protocol.resume_reading.called async def test_read_resume_paused(self, stream) -> None: stream.feed_data(b"test", 4) stream._protocol._reading_paused = True res = await stream.read(1) assert res == b"t" assert stream._protocol.pause_reading.called async def test_readline(self, stream) -> None: stream.feed_data(b"d\n", 5) res = await stream.readline() assert res == b"d\n" assert not stream._protocol.resume_reading.called async def test_readline_resume_paused(self, stream) -> None: stream._protocol._reading_paused = True stream.feed_data(b"d\n", 5) res = await stream.readline() assert res == b"d\n" assert stream._protocol.resume_reading.called async def test_readany(self, stream) -> None: stream.feed_data(b"data", 4) res = await stream.readany() assert res == b"data" assert not stream._protocol.resume_reading.called async def test_readany_resume_paused(self, stream) -> None: stream._protocol._reading_paused = True stream.feed_data(b"data", 4) res = await stream.readany() assert res == b"data" assert stream._protocol.resume_reading.called async def test_readchunk(self, stream) -> None: stream.feed_data(b"data", 4) res, end_of_http_chunk = await stream.readchunk() assert res == b"data" assert not end_of_http_chunk assert not stream._protocol.resume_reading.called async def test_readchunk_resume_paused(self, stream) -> None: stream._protocol._reading_paused = True stream.feed_data(b"data", 4) res, end_of_http_chunk = await stream.readchunk() assert res == b"data" assert not end_of_http_chunk assert stream._protocol.resume_reading.called async def test_readexactly(self, stream) -> None: stream.feed_data(b"data", 4) res = await stream.readexactly(3) assert res == b"dat" assert not stream._protocol.resume_reading.called async def test_feed_data(self, stream) -> None: stream._protocol._reading_paused = False stream.feed_data(b"datadata", 8) assert stream._protocol.pause_reading.called async def test_read_nowait(self, stream) -> None: stream._protocol._reading_paused = True stream.feed_data(b"data1", 5) stream.feed_data(b"data2", 5) stream.feed_data(b"data3", 5) res = await stream.read(5) assert res == b"data1" assert stream._protocol.resume_reading.call_count == 0 res = stream.read_nowait(5) assert res == b"data2" assert stream._protocol.resume_reading.call_count == 0 res = stream.read_nowait(5) assert res == b"data3" assert stream._protocol.resume_reading.call_count == 1 stream._protocol._reading_paused = False res = stream.read_nowait(5) assert res == b"" assert stream._protocol.resume_reading.call_count == 1 class TestFlowControlDataQueue: def test_feed_pause(self, buffer) -> None: buffer._protocol._reading_paused = False buffer.feed_data(object(), 100) assert buffer._protocol.pause_reading.called async def test_resume_on_read(self, buffer) -> None: buffer.feed_data(object(), 100) buffer._protocol._reading_paused = True await buffer.read() assert buffer._protocol.resume_reading.called ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_formdata.py0000644000175100001770000000537714607525266017206 0ustar00runnerdockerfrom unittest import mock import pytest from aiohttp import FormData, web @pytest.fixture def buf(): return bytearray() @pytest.fixture def writer(buf): writer = mock.Mock() async def write(chunk): buf.extend(chunk) writer.write.side_effect = write return writer def test_formdata_multipart(buf, writer) -> None: form = FormData() assert not form.is_multipart form.add_field("test", b"test", filename="test.txt") assert form.is_multipart def test_invalid_formdata_payload() -> None: form = FormData() form.add_field("test", object(), filename="test.txt") with pytest.raises(TypeError): form() def test_invalid_formdata_params() -> None: with pytest.raises(TypeError): FormData("asdasf") def test_invalid_formdata_params2() -> None: with pytest.raises(TypeError): FormData("as") # 2-char str is not allowed def test_invalid_formdata_content_type() -> None: form = FormData() invalid_vals = [0, 0.1, {}, [], b"foo"] for invalid_val in invalid_vals: with pytest.raises(TypeError): form.add_field("foo", "bar", content_type=invalid_val) def test_invalid_formdata_filename() -> None: form = FormData() invalid_vals = [0, 0.1, {}, [], b"foo"] for invalid_val in invalid_vals: with pytest.raises(TypeError): form.add_field("foo", "bar", filename=invalid_val) def test_invalid_formdata_content_transfer_encoding() -> None: form = FormData() invalid_vals = [0, 0.1, {}, [], b"foo"] for invalid_val in invalid_vals: with pytest.raises(TypeError): form.add_field("foo", "bar", content_transfer_encoding=invalid_val) async def test_formdata_field_name_is_quoted(buf, writer) -> None: form = FormData(charset="ascii") form.add_field("email 1", "xxx@x.co", content_type="multipart/form-data") payload = form() await payload.write(writer) assert b'name="email\\ 1"' in buf async def test_formdata_field_name_is_not_quoted(buf, writer) -> None: form = FormData(quote_fields=False, charset="ascii") form.add_field("email 1", "xxx@x.co", content_type="multipart/form-data") payload = form() await payload.write(writer) assert b'name="email 1"' in buf async def test_mark_formdata_as_processed(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.add_routes([web.post("/", handler)]) client = await aiohttp_client(app) data = FormData() data.add_field("test", "test_value", content_type="application/json") resp = await client.post("/", data=data) assert len(data._writer._parts) == 1 with pytest.raises(RuntimeError): await client.post("/", data=data) resp.release() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_helpers.py0000644000175100001770000007006214607525266017044 0ustar00runnerdockerimport asyncio import base64 import datetime import gc import platform import sys import weakref from math import ceil, modf from pathlib import Path from unittest import mock from urllib.request import getproxies_environment import pytest from multidict import MultiDict from yarl import URL from aiohttp import helpers from aiohttp.helpers import ( method_must_be_empty_body, must_be_empty_body, parse_http_date, should_remove_content_length, ) IS_PYPY = platform.python_implementation() == "PyPy" # ------------------- parse_mimetype ---------------------------------- @pytest.mark.parametrize( "mimetype, expected", [ ("", helpers.MimeType("", "", "", MultiDict())), ("*", helpers.MimeType("*", "*", "", MultiDict())), ("application/json", helpers.MimeType("application", "json", "", MultiDict())), ( "application/json; charset=utf-8", helpers.MimeType( "application", "json", "", MultiDict({"charset": "utf-8"}) ), ), ( """application/json; charset=utf-8;""", helpers.MimeType( "application", "json", "", MultiDict({"charset": "utf-8"}) ), ), ( 'ApPlIcAtIoN/JSON;ChaRseT="UTF-8"', helpers.MimeType( "application", "json", "", MultiDict({"charset": "UTF-8"}) ), ), ( "application/rss+xml", helpers.MimeType("application", "rss", "xml", MultiDict()), ), ( "text/plain;base64", helpers.MimeType("text", "plain", "", MultiDict({"base64": ""})), ), ], ) def test_parse_mimetype(mimetype, expected) -> None: result = helpers.parse_mimetype(mimetype) assert isinstance(result, helpers.MimeType) assert result == expected # ------------------- guess_filename ---------------------------------- def test_guess_filename_with_file_object(tmp_path) -> None: file_path = tmp_path / "test_guess_filename" with file_path.open("w+b") as fp: assert helpers.guess_filename(fp, "no-throw") is not None def test_guess_filename_with_path(tmp_path) -> None: file_path = tmp_path / "test_guess_filename" assert helpers.guess_filename(file_path, "no-throw") is not None def test_guess_filename_with_default() -> None: assert helpers.guess_filename(None, "no-throw") == "no-throw" # ------------------- BasicAuth ----------------------------------- def test_basic_auth1() -> None: # missing password here with pytest.raises(ValueError): helpers.BasicAuth(None) def test_basic_auth2() -> None: with pytest.raises(ValueError): helpers.BasicAuth("nkim", None) def test_basic_with_auth_colon_in_login() -> None: with pytest.raises(ValueError): helpers.BasicAuth("nkim:1", "pwd") def test_basic_auth3() -> None: auth = helpers.BasicAuth("nkim") assert auth.login == "nkim" assert auth.password == "" def test_basic_auth4() -> None: auth = helpers.BasicAuth("nkim", "pwd") assert auth.login == "nkim" assert auth.password == "pwd" assert auth.encode() == "Basic bmtpbTpwd2Q=" @pytest.mark.parametrize( "header", ( "Basic bmtpbTpwd2Q=", "basic bmtpbTpwd2Q=", ), ) def test_basic_auth_decode(header) -> None: auth = helpers.BasicAuth.decode(header) assert auth.login == "nkim" assert auth.password == "pwd" def test_basic_auth_invalid() -> None: with pytest.raises(ValueError): helpers.BasicAuth.decode("bmtpbTpwd2Q=") def test_basic_auth_decode_not_basic() -> None: with pytest.raises(ValueError): helpers.BasicAuth.decode("Complex bmtpbTpwd2Q=") def test_basic_auth_decode_bad_base64() -> None: with pytest.raises(ValueError): helpers.BasicAuth.decode("Basic bmtpbTpwd2Q") @pytest.mark.parametrize("header", ("Basic ???", "Basic ")) def test_basic_auth_decode_illegal_chars_base64(header) -> None: with pytest.raises(ValueError, match="Invalid base64 encoding."): helpers.BasicAuth.decode(header) def test_basic_auth_decode_invalid_credentials() -> None: with pytest.raises(ValueError, match="Invalid credentials."): header = "Basic {}".format(base64.b64encode(b"username").decode()) helpers.BasicAuth.decode(header) @pytest.mark.parametrize( "credentials, expected_auth", ( (":", helpers.BasicAuth(login="", password="", encoding="latin1")), ( "username:", helpers.BasicAuth(login="username", password="", encoding="latin1"), ), ( ":password", helpers.BasicAuth(login="", password="password", encoding="latin1"), ), ( "username:password", helpers.BasicAuth(login="username", password="password", encoding="latin1"), ), ), ) def test_basic_auth_decode_blank_username(credentials, expected_auth) -> None: header = f"Basic {base64.b64encode(credentials.encode()).decode()}" assert helpers.BasicAuth.decode(header) == expected_auth def test_basic_auth_from_url() -> None: url = URL("http://user:pass@example.com") auth = helpers.BasicAuth.from_url(url) assert auth.login == "user" assert auth.password == "pass" def test_basic_auth_from_not_url() -> None: with pytest.raises(TypeError): helpers.BasicAuth.from_url("http://user:pass@example.com") class ReifyMixin: reify = NotImplemented def test_reify(self) -> None: class A: def __init__(self): self._cache = {} @self.reify def prop(self): return 1 a = A() assert 1 == a.prop def test_reify_class(self) -> None: class A: def __init__(self): self._cache = {} @self.reify def prop(self): """Docstring.""" return 1 assert isinstance(A.prop, self.reify) assert "Docstring." == A.prop.__doc__ def test_reify_assignment(self) -> None: class A: def __init__(self): self._cache = {} @self.reify def prop(self): return 1 a = A() with pytest.raises(AttributeError): a.prop = 123 class TestPyReify(ReifyMixin): reify = helpers.reify_py if not helpers.NO_EXTENSIONS and not IS_PYPY and hasattr(helpers, "reify_c"): class TestCReify(ReifyMixin): reify = helpers.reify_c # ----------------------------------- is_ip_address() ---------------------- def test_is_ip_address() -> None: assert helpers.is_ip_address("127.0.0.1") assert helpers.is_ip_address("::1") assert helpers.is_ip_address("FE80:0000:0000:0000:0202:B3FF:FE1E:8329") # Hostnames assert not helpers.is_ip_address("localhost") assert not helpers.is_ip_address("www.example.com") # Out of range assert not helpers.is_ip_address("999.999.999.999") # Contain a port assert not helpers.is_ip_address("127.0.0.1:80") assert not helpers.is_ip_address("[2001:db8:0:1]:80") # Too many "::" assert not helpers.is_ip_address("1200::AB00:1234::2552:7777:1313") def test_is_ip_address_bytes() -> None: assert helpers.is_ip_address(b"127.0.0.1") assert helpers.is_ip_address(b"::1") assert helpers.is_ip_address(b"FE80:0000:0000:0000:0202:B3FF:FE1E:8329") # Hostnames assert not helpers.is_ip_address(b"localhost") assert not helpers.is_ip_address(b"www.example.com") # Out of range assert not helpers.is_ip_address(b"999.999.999.999") # Contain a port assert not helpers.is_ip_address(b"127.0.0.1:80") assert not helpers.is_ip_address(b"[2001:db8:0:1]:80") # Too many "::" assert not helpers.is_ip_address(b"1200::AB00:1234::2552:7777:1313") def test_ipv4_addresses() -> None: ip_addresses = [ "0.0.0.0", "127.0.0.1", "255.255.255.255", ] for address in ip_addresses: assert helpers.is_ipv4_address(address) assert not helpers.is_ipv6_address(address) assert helpers.is_ip_address(address) def test_ipv6_addresses() -> None: ip_addresses = [ "0:0:0:0:0:0:0:0", "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF", "00AB:0002:3008:8CFD:00AB:0002:3008:8CFD", "00ab:0002:3008:8cfd:00ab:0002:3008:8cfd", "AB:02:3008:8CFD:AB:02:3008:8CFD", "AB:02:3008:8CFD::02:3008:8CFD", "::", "1::1", ] for address in ip_addresses: assert not helpers.is_ipv4_address(address) assert helpers.is_ipv6_address(address) assert helpers.is_ip_address(address) def test_host_addresses() -> None: hosts = [ "www.four.part.host" "www.python.org", "foo.bar", "localhost", ] for host in hosts: assert not helpers.is_ip_address(host) def test_is_ip_address_invalid_type() -> None: with pytest.raises(TypeError): helpers.is_ip_address(123) with pytest.raises(TypeError): helpers.is_ip_address(object()) # ----------------------------------- TimeoutHandle ------------------- def test_timeout_handle(loop) -> None: handle = helpers.TimeoutHandle(loop, 10.2) cb = mock.Mock() handle.register(cb) assert cb == handle._callbacks[0][0] handle.close() assert not handle._callbacks def test_when_timeout_smaller_second(loop) -> None: timeout = 0.1 timer = loop.time() + timeout handle = helpers.TimeoutHandle(loop, timeout) when = handle.start()._when handle.close() assert isinstance(when, float) assert when - timer == pytest.approx(0, abs=0.001) def test_when_timeout_smaller_second_with_low_threshold(loop) -> None: timeout = 0.1 timer = loop.time() + timeout handle = helpers.TimeoutHandle(loop, timeout, 0.01) when = handle.start()._when handle.close() assert isinstance(when, int) assert when == ceil(timer) def test_timeout_handle_cb_exc(loop) -> None: handle = helpers.TimeoutHandle(loop, 10.2) cb = mock.Mock() handle.register(cb) cb.side_effect = ValueError() handle() assert cb.called assert not handle._callbacks def test_timer_context_not_cancelled() -> None: with mock.patch("aiohttp.helpers.asyncio") as m_asyncio: m_asyncio.TimeoutError = asyncio.TimeoutError loop = mock.Mock() ctx = helpers.TimerContext(loop) ctx.timeout() with pytest.raises(asyncio.TimeoutError): with ctx: pass assert not m_asyncio.current_task.return_value.cancel.called def test_timer_context_no_task(loop) -> None: with pytest.raises(RuntimeError): with helpers.TimerContext(loop): pass # -------------------------------- CeilTimeout -------------------------- async def test_weakref_handle(loop) -> None: cb = mock.Mock() helpers.weakref_handle(cb, "test", 0.01, loop) await asyncio.sleep(0.1) assert cb.test.called async def test_weakref_handle_with_small_threshold(loop) -> None: cb = mock.Mock() loop = mock.Mock() loop.time.return_value = 10 helpers.weakref_handle(cb, "test", 0.1, loop, 0.01) loop.call_at.assert_called_with( 11, helpers._weakref_handle, (weakref.ref(cb), "test") ) async def test_weakref_handle_weak(loop) -> None: cb = mock.Mock() helpers.weakref_handle(cb, "test", 0.01, loop) del cb gc.collect() await asyncio.sleep(0.1) async def test_ceil_timeout() -> None: async with helpers.ceil_timeout(None) as timeout: if sys.version_info >= (3, 11): assert timeout.when() is None else: assert timeout.deadline is None async def test_ceil_timeout_round() -> None: async with helpers.ceil_timeout(7.5) as cm: if sys.version_info >= (3, 11): assert cm.when() is not None frac, integer = modf(cm.when()) else: assert cm.deadline is not None frac, integer = modf(cm.deadline) assert frac == 0 async def test_ceil_timeout_small() -> None: async with helpers.ceil_timeout(1.1) as cm: if sys.version_info >= (3, 11): assert cm.when() is not None frac, integer = modf(cm.when()) else: assert cm.deadline is not None frac, integer = modf(cm.deadline) # a chance for exact integer with zero fraction is negligible assert frac != 0 def test_ceil_call_later_with_small_threshold() -> None: cb = mock.Mock() loop = mock.Mock() loop.time.return_value = 10.1 helpers.call_later(cb, 4.5, loop, 1) loop.call_at.assert_called_with(15, cb) def test_ceil_call_later_no_timeout() -> None: cb = mock.Mock() loop = mock.Mock() helpers.call_later(cb, 0, loop) assert not loop.call_at.called async def test_ceil_timeout_none(loop) -> None: async with helpers.ceil_timeout(None) as cm: if sys.version_info >= (3, 11): assert cm.when() is None else: assert cm.deadline is None async def test_ceil_timeout_small_with_overriden_threshold(loop) -> None: async with helpers.ceil_timeout(1.5, ceil_threshold=1) as cm: if sys.version_info >= (3, 11): frac, integer = modf(cm.when()) else: frac, integer = modf(cm.deadline) assert frac == 0 # -------------------------------- ContentDisposition ------------------- @pytest.mark.parametrize( "kwargs, result", [ (dict(foo="bar"), 'attachment; foo="bar"'), (dict(foo="bar[]"), 'attachment; foo="bar[]"'), (dict(foo=' a""b\\'), 'attachment; foo="\\ a\\"\\"b\\\\"'), (dict(foo="bär"), "attachment; foo*=utf-8''b%C3%A4r"), (dict(foo='bär "\\', quote_fields=False), 'attachment; foo="bär \\"\\\\"'), (dict(foo="bär", _charset="latin-1"), "attachment; foo*=latin-1''b%E4r"), (dict(filename="bär"), 'attachment; filename="b%C3%A4r"'), (dict(filename="bär", _charset="latin-1"), 'attachment; filename="b%E4r"'), ( dict(filename='bär "\\', quote_fields=False), 'attachment; filename="bär \\"\\\\"', ), ], ) def test_content_disposition(kwargs, result) -> None: assert helpers.content_disposition_header("attachment", **kwargs) == result def test_content_disposition_bad_type() -> None: with pytest.raises(ValueError): helpers.content_disposition_header("foo bar") with pytest.raises(ValueError): helpers.content_disposition_header("—Ç–µ—Å—Ç") with pytest.raises(ValueError): helpers.content_disposition_header("foo\x00bar") with pytest.raises(ValueError): helpers.content_disposition_header("") def test_set_content_disposition_bad_param() -> None: with pytest.raises(ValueError): helpers.content_disposition_header("inline", **{"foo bar": "baz"}) with pytest.raises(ValueError): helpers.content_disposition_header("inline", **{"—Ç–µ—Å—Ç": "baz"}) with pytest.raises(ValueError): helpers.content_disposition_header("inline", **{"": "baz"}) with pytest.raises(ValueError): helpers.content_disposition_header("inline", **{"foo\x00bar": "baz"}) # --------------------- proxies_from_env ------------------------------ @pytest.mark.parametrize( ("proxy_env_vars", "url_input", "expected_scheme"), ( ({"http_proxy": "http://aiohttp.io/path"}, "http://aiohttp.io/path", "http"), ({"https_proxy": "http://aiohttp.io/path"}, "http://aiohttp.io/path", "https"), ({"ws_proxy": "http://aiohttp.io/path"}, "http://aiohttp.io/path", "ws"), ({"wss_proxy": "http://aiohttp.io/path"}, "http://aiohttp.io/path", "wss"), ), indirect=["proxy_env_vars"], ids=("http", "https", "ws", "wss"), ) @pytest.mark.usefixtures("proxy_env_vars") def test_proxies_from_env(url_input, expected_scheme) -> None: url = URL(url_input) ret = helpers.proxies_from_env() assert ret.keys() == {expected_scheme} assert ret[expected_scheme].proxy == url assert ret[expected_scheme].proxy_auth is None @pytest.mark.parametrize( ("proxy_env_vars", "url_input", "expected_scheme"), ( ( {"https_proxy": "https://aiohttp.io/path"}, "https://aiohttp.io/path", "https", ), ({"wss_proxy": "wss://aiohttp.io/path"}, "wss://aiohttp.io/path", "wss"), ), indirect=["proxy_env_vars"], ids=("https", "wss"), ) @pytest.mark.usefixtures("proxy_env_vars") def test_proxies_from_env_skipped(caplog, url_input, expected_scheme) -> None: url = URL(url_input) assert helpers.proxies_from_env() == {} assert len(caplog.records) == 1 log_message = "{proto!s} proxies {url!s} are not supported, ignoring".format( proto=expected_scheme.upper(), url=url ) assert caplog.record_tuples == [("aiohttp.client", 30, log_message)] @pytest.mark.parametrize( ("proxy_env_vars", "url_input", "expected_scheme"), ( ( {"http_proxy": "http://user:pass@aiohttp.io/path"}, "http://user:pass@aiohttp.io/path", "http", ), ), indirect=["proxy_env_vars"], ids=("http",), ) @pytest.mark.usefixtures("proxy_env_vars") def test_proxies_from_env_http_with_auth(url_input, expected_scheme) -> None: url = URL("http://user:pass@aiohttp.io/path") ret = helpers.proxies_from_env() assert ret.keys() == {expected_scheme} assert ret[expected_scheme].proxy == url.with_user(None) proxy_auth = ret[expected_scheme].proxy_auth assert proxy_auth.login == "user" assert proxy_auth.password == "pass" assert proxy_auth.encoding == "latin1" # ------------ get_running_loop --------------------------------- def test_get_running_loop_not_running(loop) -> None: with pytest.warns(DeprecationWarning): helpers.get_running_loop() async def test_get_running_loop_ok(loop) -> None: assert helpers.get_running_loop() is loop # --------------------- get_env_proxy_for_url ------------------------------ @pytest.fixture def proxy_env_vars(monkeypatch, request): for schema in getproxies_environment().keys(): monkeypatch.delenv(f"{schema}_proxy", False) for proxy_type, proxy_list in request.param.items(): monkeypatch.setenv(proxy_type, proxy_list) return request.param @pytest.mark.parametrize( ("proxy_env_vars", "url_input", "expected_err_msg"), ( ( {"no_proxy": "aiohttp.io"}, "http://aiohttp.io/path", r"Proxying is disallowed for `'aiohttp.io'`", ), ( {"no_proxy": "aiohttp.io,proxy.com"}, "http://aiohttp.io/path", r"Proxying is disallowed for `'aiohttp.io'`", ), ( {"http_proxy": "http://example.com"}, "https://aiohttp.io/path", r"No proxies found for `https://aiohttp.io/path` in the env", ), ( {"https_proxy": "https://example.com"}, "http://aiohttp.io/path", r"No proxies found for `http://aiohttp.io/path` in the env", ), ( {}, "https://aiohttp.io/path", r"No proxies found for `https://aiohttp.io/path` in the env", ), ( {"https_proxy": "https://example.com"}, "", r"No proxies found for `` in the env", ), ), indirect=["proxy_env_vars"], ids=( "url_matches_the_no_proxy_list", "url_matches_the_no_proxy_list_multiple", "url_scheme_does_not_match_http_proxy_list", "url_scheme_does_not_match_https_proxy_list", "no_proxies_are_set", "url_is_empty", ), ) @pytest.mark.usefixtures("proxy_env_vars") def test_get_env_proxy_for_url_negative(url_input, expected_err_msg) -> None: url = URL(url_input) with pytest.raises(LookupError, match=expected_err_msg): helpers.get_env_proxy_for_url(url) @pytest.mark.parametrize( ("proxy_env_vars", "url_input"), ( ({"http_proxy": "http://example.com"}, "http://aiohttp.io/path"), ({"https_proxy": "http://example.com"}, "https://aiohttp.io/path"), ( {"http_proxy": "http://example.com,http://proxy.org"}, "http://aiohttp.io/path", ), ), indirect=["proxy_env_vars"], ids=( "url_scheme_match_http_proxy_list", "url_scheme_match_https_proxy_list", "url_scheme_match_http_proxy_list_multiple", ), ) def test_get_env_proxy_for_url(proxy_env_vars, url_input) -> None: url = URL(url_input) proxy, proxy_auth = helpers.get_env_proxy_for_url(url) proxy_list = proxy_env_vars[url.scheme + "_proxy"] assert proxy == URL(proxy_list) assert proxy_auth is None # ------------- set_result / set_exception ---------------------- async def test_set_result(loop) -> None: fut = loop.create_future() helpers.set_result(fut, 123) assert 123 == await fut async def test_set_result_cancelled(loop) -> None: fut = loop.create_future() fut.cancel() helpers.set_result(fut, 123) with pytest.raises(asyncio.CancelledError): await fut async def test_set_exception(loop) -> None: fut = loop.create_future() helpers.set_exception(fut, RuntimeError()) with pytest.raises(RuntimeError): await fut async def test_set_exception_cancelled(loop) -> None: fut = loop.create_future() fut.cancel() helpers.set_exception(fut, RuntimeError()) with pytest.raises(asyncio.CancelledError): await fut # ----------- ChainMapProxy -------------------------- class TestChainMapProxy: def test_inheritance(self) -> None: with pytest.raises(TypeError): class A(helpers.ChainMapProxy): pass def test_getitem(self) -> None: d1 = {"a": 2, "b": 3} d2 = {"a": 1} cp = helpers.ChainMapProxy([d1, d2]) assert cp["a"] == 2 assert cp["b"] == 3 def test_getitem_not_found(self) -> None: d = {"a": 1} cp = helpers.ChainMapProxy([d]) with pytest.raises(KeyError): cp["b"] def test_get(self) -> None: d1 = {"a": 2, "b": 3} d2 = {"a": 1} cp = helpers.ChainMapProxy([d1, d2]) assert cp.get("a") == 2 def test_get_default(self) -> None: d1 = {"a": 2, "b": 3} d2 = {"a": 1} cp = helpers.ChainMapProxy([d1, d2]) assert cp.get("c", 4) == 4 def test_get_non_default(self) -> None: d1 = {"a": 2, "b": 3} d2 = {"a": 1} cp = helpers.ChainMapProxy([d1, d2]) assert cp.get("a", 4) == 2 def test_len(self) -> None: d1 = {"a": 2, "b": 3} d2 = {"a": 1} cp = helpers.ChainMapProxy([d1, d2]) assert len(cp) == 2 def test_iter(self) -> None: d1 = {"a": 2, "b": 3} d2 = {"a": 1} cp = helpers.ChainMapProxy([d1, d2]) assert set(cp) == {"a", "b"} def test_contains(self) -> None: d1 = {"a": 2, "b": 3} d2 = {"a": 1} cp = helpers.ChainMapProxy([d1, d2]) assert "a" in cp assert "b" in cp assert "c" not in cp def test_bool(self) -> None: assert helpers.ChainMapProxy([{"a": 1}]) assert not helpers.ChainMapProxy([{}, {}]) assert not helpers.ChainMapProxy([]) def test_repr(self) -> None: d1 = {"a": 2, "b": 3} d2 = {"a": 1} cp = helpers.ChainMapProxy([d1, d2]) expected = f"ChainMapProxy({d1!r}, {d2!r})" assert expected == repr(cp) @pytest.mark.parametrize( ["value", "expected"], [ # email.utils.parsedate returns None pytest.param("xxyyzz", None), # datetime.datetime fails with ValueError("year 4446413 is out of range") pytest.param("Tue, 08 Oct 4446413 00:56:40 GMT", None), # datetime.datetime fails with ValueError("second must be in 0..59") pytest.param("Tue, 08 Oct 2000 00:56:80 GMT", None), # OK pytest.param( "Tue, 08 Oct 2000 00:56:40 GMT", datetime.datetime(2000, 10, 8, 0, 56, 40, tzinfo=datetime.timezone.utc), ), # OK (ignore timezone and overwrite to UTC) pytest.param( "Tue, 08 Oct 2000 00:56:40 +0900", datetime.datetime(2000, 10, 8, 0, 56, 40, tzinfo=datetime.timezone.utc), ), ], ) def test_parse_http_date(value, expected): assert parse_http_date(value) == expected @pytest.mark.parametrize( ["netrc_contents", "expected_username"], [ ( "machine example.com login username password pass\n", "username", ), ], indirect=("netrc_contents",), ) @pytest.mark.usefixtures("netrc_contents") def test_netrc_from_env(expected_username: str): """Test that reading netrc files from env works as expected""" netrc_obj = helpers.netrc_from_env() assert netrc_obj.authenticators("example.com")[0] == expected_username @pytest.fixture def protected_dir(tmp_path: Path): protected_dir = tmp_path / "protected" protected_dir.mkdir() try: protected_dir.chmod(0o600) yield protected_dir finally: protected_dir.rmdir() def test_netrc_from_home_does_not_raise_if_access_denied( protected_dir: Path, monkeypatch: pytest.MonkeyPatch ): monkeypatch.setattr(Path, "home", lambda: protected_dir) monkeypatch.delenv("NETRC", raising=False) helpers.netrc_from_env() @pytest.mark.parametrize( ["netrc_contents", "expected_auth"], [ ( "machine example.com login username password pass\n", helpers.BasicAuth("username", "pass"), ), ( "machine example.com account username password pass\n", helpers.BasicAuth("username", "pass"), ), ( "machine example.com password pass\n", helpers.BasicAuth("", "pass"), ), ], indirect=("netrc_contents",), ) @pytest.mark.usefixtures("netrc_contents") def test_basicauth_present_in_netrc( expected_auth: helpers.BasicAuth, ): """Test that netrc file contents are properly parsed into BasicAuth tuples""" netrc_obj = helpers.netrc_from_env() assert expected_auth == helpers.basicauth_from_netrc(netrc_obj, "example.com") @pytest.mark.parametrize( ["netrc_contents"], [ ("",), ], indirect=("netrc_contents",), ) @pytest.mark.usefixtures("netrc_contents") def test_read_basicauth_from_empty_netrc(): """Test that an error is raised if netrc doesn't have an entry for our host""" netrc_obj = helpers.netrc_from_env() with pytest.raises( LookupError, match="No entry for example.com found in the `.netrc` file." ): helpers.basicauth_from_netrc(netrc_obj, "example.com") def test_method_must_be_empty_body(): """Test that HEAD is the only method that unequivocally must have an empty body.""" assert method_must_be_empty_body("HEAD") is True # CONNECT is only empty on a successful response assert method_must_be_empty_body("CONNECT") is False def test_should_remove_content_length_is_subset_of_must_be_empty_body(): """Test should_remove_content_length is always a subset of must_be_empty_body.""" assert should_remove_content_length("GET", 101) is True assert must_be_empty_body("GET", 101) is True assert should_remove_content_length("GET", 102) is True assert must_be_empty_body("GET", 102) is True assert should_remove_content_length("GET", 204) is True assert must_be_empty_body("GET", 204) is True assert should_remove_content_length("GET", 204) is True assert must_be_empty_body("GET", 204) is True assert should_remove_content_length("GET", 200) is False assert must_be_empty_body("GET", 200) is False assert should_remove_content_length("HEAD", 200) is False assert must_be_empty_body("HEAD", 200) is True # CONNECT is only empty on a successful response assert should_remove_content_length("CONNECT", 200) is True assert must_be_empty_body("CONNECT", 200) is True assert should_remove_content_length("CONNECT", 201) is True assert must_be_empty_body("CONNECT", 201) is True assert should_remove_content_length("CONNECT", 300) is False assert must_be_empty_body("CONNECT", 300) is False ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_http_exceptions.py0000644000175100001770000001253514607525266020623 0ustar00runnerdocker# Tests for http_exceptions.py import pickle from aiohttp import http_exceptions class TestHttpProcessingError: def test_ctor(self) -> None: err = http_exceptions.HttpProcessingError( code=500, message="Internal error", headers={} ) assert err.code == 500 assert err.message == "Internal error" assert err.headers == {} def test_pickle(self) -> None: err = http_exceptions.HttpProcessingError( code=500, message="Internal error", headers={} ) err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.code == 500 assert err2.message == "Internal error" assert err2.headers == {} assert err2.foo == "bar" def test_str(self) -> None: err = http_exceptions.HttpProcessingError( code=500, message="Internal error", headers={} ) assert str(err) == "500, message:\n Internal error" def test_repr(self) -> None: err = http_exceptions.HttpProcessingError( code=500, message="Internal error", headers={} ) assert repr(err) == ("") class TestBadHttpMessage: def test_ctor(self) -> None: err = http_exceptions.BadHttpMessage("Bad HTTP message", headers={}) assert err.code == 400 assert err.message == "Bad HTTP message" assert err.headers == {} def test_pickle(self) -> None: err = http_exceptions.BadHttpMessage(message="Bad HTTP message", headers={}) err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.code == 400 assert err2.message == "Bad HTTP message" assert err2.headers == {} assert err2.foo == "bar" def test_str(self) -> None: err = http_exceptions.BadHttpMessage(message="Bad HTTP message", headers={}) assert str(err) == "400, message:\n Bad HTTP message" def test_repr(self) -> None: err = http_exceptions.BadHttpMessage(message="Bad HTTP message", headers={}) assert repr(err) == "" class TestLineTooLong: def test_ctor(self) -> None: err = http_exceptions.LineTooLong("spam", "10", "12") assert err.code == 400 assert err.message == "Got more than 10 bytes (12) when reading spam." assert err.headers is None def test_pickle(self) -> None: err = http_exceptions.LineTooLong(line="spam", limit="10", actual_size="12") err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.code == 400 assert err2.message == ("Got more than 10 bytes (12) " "when reading spam.") assert err2.headers is None assert err2.foo == "bar" def test_str(self) -> None: err = http_exceptions.LineTooLong(line="spam", limit="10", actual_size="12") expected = "400, message:\n Got more than 10 bytes (12) when reading spam." assert str(err) == expected def test_repr(self) -> None: err = http_exceptions.LineTooLong(line="spam", limit="10", actual_size="12") assert repr(err) == ( "" ) class TestInvalidHeader: def test_ctor(self) -> None: err = http_exceptions.InvalidHeader("X-Spam") assert err.code == 400 assert err.message == "Invalid HTTP header: 'X-Spam'" assert err.headers is None def test_pickle(self) -> None: err = http_exceptions.InvalidHeader(hdr="X-Spam") err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.code == 400 assert err2.message == "Invalid HTTP header: 'X-Spam'" assert err2.headers is None assert err2.foo == "bar" def test_str(self) -> None: err = http_exceptions.InvalidHeader(hdr="X-Spam") assert str(err) == "400, message:\n Invalid HTTP header: 'X-Spam'" def test_repr(self) -> None: err = http_exceptions.InvalidHeader(hdr="X-Spam") expected = "" assert repr(err) == expected class TestBadStatusLine: def test_ctor(self) -> None: err = http_exceptions.BadStatusLine("Test") assert err.line == "Test" assert str(err) == "400, message:\n Bad status line 'Test'" def test_ctor2(self) -> None: err = http_exceptions.BadStatusLine(b"") assert err.line == "b''" assert str(err) == "400, message:\n Bad status line \"b''\"" def test_pickle(self) -> None: err = http_exceptions.BadStatusLine("Test") err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.line == "Test" assert err2.foo == "bar" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_http_parser.py0000644000175100001770000016023714607525266017741 0ustar00runnerdocker# Tests for aiohttp/protocol.py import asyncio import re from contextlib import nullcontext from typing import Any, Dict, List from unittest import mock from urllib.parse import quote import pytest from multidict import CIMultiDict from yarl import URL import aiohttp from aiohttp import http_exceptions, streams from aiohttp.http_parser import ( NO_EXTENSIONS, DeflateBuffer, HttpPayloadParser, HttpRequestParserPy, HttpResponseParserPy, HttpVersion, ) try: try: import brotlicffi as brotli except ImportError: import brotli except ImportError: brotli = None REQUEST_PARSERS = [HttpRequestParserPy] RESPONSE_PARSERS = [HttpResponseParserPy] try: from aiohttp.http_parser import HttpRequestParserC, HttpResponseParserC REQUEST_PARSERS.append(HttpRequestParserC) RESPONSE_PARSERS.append(HttpResponseParserC) except ImportError: # pragma: no cover pass @pytest.fixture def protocol(): return mock.Mock() def _gen_ids(parsers: List[Any]) -> List[str]: return [ "py-parser" if parser.__module__ == "aiohttp.http_parser" else "c-parser" for parser in parsers ] @pytest.fixture(params=REQUEST_PARSERS, ids=_gen_ids(REQUEST_PARSERS)) def parser(loop: Any, protocol: Any, request: Any): # Parser implementations return request.param( protocol, loop, 2**16, max_line_size=8190, max_headers=32768, max_field_size=8190, ) @pytest.fixture(params=REQUEST_PARSERS, ids=_gen_ids(REQUEST_PARSERS)) def request_cls(request: Any): # Request Parser class return request.param @pytest.fixture(params=RESPONSE_PARSERS, ids=_gen_ids(RESPONSE_PARSERS)) def response(loop: Any, protocol: Any, request: Any): # Parser implementations return request.param( protocol, loop, 2**16, max_line_size=8190, max_headers=32768, max_field_size=8190, ) @pytest.fixture(params=RESPONSE_PARSERS, ids=_gen_ids(RESPONSE_PARSERS)) def response_cls(request: Any): # Parser implementations return request.param @pytest.fixture def stream(): return mock.Mock() @pytest.mark.skipif(NO_EXTENSIONS, reason="Extensions available but not imported") def test_c_parser_loaded(): assert "HttpRequestParserC" in dir(aiohttp.http_parser) assert "HttpResponseParserC" in dir(aiohttp.http_parser) assert "RawRequestMessageC" in dir(aiohttp.http_parser) assert "RawResponseMessageC" in dir(aiohttp.http_parser) def test_parse_headers(parser: Any) -> None: text = b"""GET /test HTTP/1.1\r test: a line\r test2: data\r \r """ messages, upgrade, tail = parser.feed_data(text) assert len(messages) == 1 msg = messages[0][0] assert list(msg.headers.items()) == [("test", "a line"), ("test2", "data")] assert msg.raw_headers == ((b"test", b"a line"), (b"test2", b"data")) assert not msg.should_close assert msg.compression is None assert not msg.upgrade def test_reject_obsolete_line_folding(parser: Any) -> None: text = b"""GET /test HTTP/1.1\r test: line\r Content-Length: 48\r test2: data\r \r """ with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) @pytest.mark.skipif(NO_EXTENSIONS, reason="Only tests C parser.") def test_invalid_character(loop: Any, protocol: Any, request: Any) -> None: parser = HttpRequestParserC( protocol, loop, 2**16, max_line_size=8190, max_field_size=8190, ) text = b"POST / HTTP/1.1\r\nHost: localhost:8080\r\nSet-Cookie: abc\x01def\r\n\r\n" error_detail = re.escape( r""": b'Set-Cookie: abc\x01def' ^""" ) with pytest.raises(http_exceptions.BadHttpMessage, match=error_detail): parser.feed_data(text) @pytest.mark.skipif(NO_EXTENSIONS, reason="Only tests C parser.") def test_invalid_linebreak(loop: Any, protocol: Any, request: Any) -> None: parser = HttpRequestParserC( protocol, loop, 2**16, max_line_size=8190, max_field_size=8190, ) text = b"GET /world HTTP/1.1\r\nHost: 127.0.0.1\n\r\n" error_detail = re.escape( r""": b'Host: 127.0.0.1\n' ^""" ) with pytest.raises(http_exceptions.BadHttpMessage, match=error_detail): parser.feed_data(text) def test_cve_2023_37276(parser: Any) -> None: text = b"""POST / HTTP/1.1\r\nHost: localhost:8080\r\nX-Abc: \rxTransfer-Encoding: chunked\r\n\r\n""" with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) @pytest.mark.parametrize( "rfc9110_5_6_2_token_delim", r'"(),/:;<=>?@[\]{}', ) def test_bad_header_name(parser: Any, rfc9110_5_6_2_token_delim: str) -> None: text = f"POST / HTTP/1.1\r\nhead{rfc9110_5_6_2_token_delim}er: val\r\n\r\n".encode() expectation = pytest.raises(http_exceptions.BadHttpMessage) if rfc9110_5_6_2_token_delim == ":": # Inserting colon into header just splits name/value earlier. expectation = nullcontext() with expectation: parser.feed_data(text) @pytest.mark.parametrize( "hdr", ( "Content-Length: -5", # https://www.rfc-editor.org/rfc/rfc9110.html#name-content-length "Content-Length: +256", "Content-Length: \N{superscript one}", "Content-Length: \N{mathematical double-struck digit one}", "Foo: abc\rdef", # https://www.rfc-editor.org/rfc/rfc9110.html#section-5.5-5 "Bar: abc\ndef", "Baz: abc\x00def", "Foo : bar", # https://www.rfc-editor.org/rfc/rfc9112.html#section-5.1-2 "Foo\t: bar", "\xffoo: bar", ), ) def test_bad_headers(parser: Any, hdr: str) -> None: text = f"POST / HTTP/1.1\r\n{hdr}\r\n\r\n".encode() with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) def test_unpaired_surrogate_in_header_py(loop: Any, protocol: Any) -> None: parser = HttpRequestParserPy( protocol, loop, 2**16, max_line_size=8190, max_field_size=8190, ) text = b"POST / HTTP/1.1\r\n\xff\r\n\r\n" message = None try: parser.feed_data(text) except http_exceptions.InvalidHeader as e: message = e.message.encode("utf-8") assert message is not None def test_content_length_transfer_encoding(parser: Any) -> None: text = ( b"GET / HTTP/1.1\r\nHost: a\r\nContent-Length: 5\r\nTransfer-Encoding: a\r\n\r\n" + b"apple\r\n" ) with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) def test_bad_chunked_py(loop: Any, protocol: Any) -> None: """Test that invalid chunked encoding doesn't allow content-length to be used.""" parser = HttpRequestParserPy( protocol, loop, 2**16, max_line_size=8190, max_field_size=8190, ) text = ( b"GET / HTTP/1.1\r\nHost: a\r\nTransfer-Encoding: chunked\r\n\r\n0_2e\r\n\r\n" + b"GET / HTTP/1.1\r\nHost: a\r\nContent-Length: 5\r\n\r\n0\r\n\r\n" ) messages, upgrade, tail = parser.feed_data(text) assert isinstance(messages[0][1].exception(), http_exceptions.TransferEncodingError) @pytest.mark.skipif( "HttpRequestParserC" not in dir(aiohttp.http_parser), reason="C based HTTP parser not available", ) def test_bad_chunked_c(loop: Any, protocol: Any) -> None: """C parser behaves differently. Maybe we should align them later.""" parser = HttpRequestParserC( protocol, loop, 2**16, max_line_size=8190, max_field_size=8190, ) text = ( b"GET / HTTP/1.1\r\nHost: a\r\nTransfer-Encoding: chunked\r\n\r\n0_2e\r\n\r\n" + b"GET / HTTP/1.1\r\nHost: a\r\nContent-Length: 5\r\n\r\n0\r\n\r\n" ) with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) def test_whitespace_before_header(parser: Any) -> None: text = b"GET / HTTP/1.1\r\n\tContent-Length: 1\r\n\r\nX" with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) def test_parse_headers_longline(parser: Any) -> None: invalid_unicode_byte = b"\xd9" header_name = b"Test" + invalid_unicode_byte + b"Header" + b"A" * 8192 text = b"GET /test HTTP/1.1\r\n" + header_name + b": test\r\n" + b"\r\n" + b"\r\n" with pytest.raises((http_exceptions.LineTooLong, http_exceptions.BadHttpMessage)): # FIXME: `LineTooLong` doesn't seem to actually be happening parser.feed_data(text) def test_parse_unusual_request_line(parser) -> None: if not isinstance(response, HttpResponseParserPy): pytest.xfail("Regression test for Py parser. May match C behaviour later.") text = b"#smol //a HTTP/1.3\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) assert len(messages) == 1 msg, _ = messages[0] assert msg.compression is None assert not msg.upgrade assert msg.method == "#smol" assert msg.path == "//a" assert msg.version == (1, 3) def test_parse(parser) -> None: text = b"GET /test HTTP/1.1\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) assert len(messages) == 1 msg, _ = messages[0] assert msg.compression is None assert not msg.upgrade assert msg.method == "GET" assert msg.path == "/test" assert msg.version == (1, 1) async def test_parse_body(parser) -> None: text = b"GET /test HTTP/1.1\r\nContent-Length: 4\r\n\r\nbody" messages, upgrade, tail = parser.feed_data(text) assert len(messages) == 1 _, payload = messages[0] body = await payload.read(4) assert body == b"body" async def test_parse_body_with_CRLF(parser) -> None: text = b"\r\nGET /test HTTP/1.1\r\nContent-Length: 4\r\n\r\nbody" messages, upgrade, tail = parser.feed_data(text) assert len(messages) == 1 _, payload = messages[0] body = await payload.read(4) assert body == b"body" def test_parse_delayed(parser) -> None: text = b"GET /test HTTP/1.1\r\n" messages, upgrade, tail = parser.feed_data(text) assert len(messages) == 0 assert not upgrade messages, upgrade, tail = parser.feed_data(b"\r\n") assert len(messages) == 1 msg = messages[0][0] assert msg.method == "GET" def test_headers_multi_feed(parser) -> None: text1 = b"GET /test HTTP/1.1\r\n" text2 = b"test: line" text3 = b" continue\r\n\r\n" messages, upgrade, tail = parser.feed_data(text1) assert len(messages) == 0 messages, upgrade, tail = parser.feed_data(text2) assert len(messages) == 0 messages, upgrade, tail = parser.feed_data(text3) assert len(messages) == 1 msg = messages[0][0] assert list(msg.headers.items()) == [("test", "line continue")] assert msg.raw_headers == ((b"test", b"line continue"),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade def test_headers_split_field(parser) -> None: text1 = b"GET /test HTTP/1.1\r\n" text2 = b"t" text3 = b"es" text4 = b"t: value\r\n\r\n" messages, upgrade, tail = parser.feed_data(text1) messages, upgrade, tail = parser.feed_data(text2) messages, upgrade, tail = parser.feed_data(text3) assert len(messages) == 0 messages, upgrade, tail = parser.feed_data(text4) assert len(messages) == 1 msg = messages[0][0] assert list(msg.headers.items()) == [("test", "value")] assert msg.raw_headers == ((b"test", b"value"),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade def test_parse_headers_multi(parser) -> None: text = ( b"GET /test HTTP/1.1\r\n" b"Set-Cookie: c1=cookie1\r\n" b"Set-Cookie: c2=cookie2\r\n\r\n" ) messages, upgrade, tail = parser.feed_data(text) assert len(messages) == 1 msg = messages[0][0] assert list(msg.headers.items()) == [ ("Set-Cookie", "c1=cookie1"), ("Set-Cookie", "c2=cookie2"), ] assert msg.raw_headers == ( (b"Set-Cookie", b"c1=cookie1"), (b"Set-Cookie", b"c2=cookie2"), ) assert not msg.should_close assert msg.compression is None def test_conn_default_1_0(parser) -> None: text = b"GET /test HTTP/1.0\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.should_close def test_conn_default_1_1(parser) -> None: text = b"GET /test HTTP/1.1\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert not msg.should_close def test_conn_close(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"connection: close\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.should_close def test_conn_close_1_0(parser) -> None: text = b"GET /test HTTP/1.0\r\n" b"connection: close\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.should_close def test_conn_keep_alive_1_0(parser) -> None: text = b"GET /test HTTP/1.0\r\n" b"connection: keep-alive\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert not msg.should_close def test_conn_keep_alive_1_1(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"connection: keep-alive\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert not msg.should_close def test_conn_other_1_0(parser) -> None: text = b"GET /test HTTP/1.0\r\n" b"connection: test\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.should_close def test_conn_other_1_1(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"connection: test\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert not msg.should_close def test_request_chunked(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"transfer-encoding: chunked\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg, payload = messages[0] assert msg.chunked assert not upgrade assert isinstance(payload, streams.StreamReader) def test_request_te_chunked_with_content_length(parser: Any) -> None: text = ( b"GET /test HTTP/1.1\r\n" b"content-length: 1234\r\n" b"transfer-encoding: chunked\r\n\r\n" ) with pytest.raises( http_exceptions.BadHttpMessage, match="Transfer-Encoding can't be present with Content-Length", ): parser.feed_data(text) def test_request_te_chunked123(parser: Any) -> None: text = b"GET /test HTTP/1.1\r\n" b"transfer-encoding: chunked123\r\n\r\n" with pytest.raises( http_exceptions.BadHttpMessage, match="Request has invalid `Transfer-Encoding`", ): parser.feed_data(text) def test_conn_upgrade(parser: Any) -> None: text = ( b"GET /test HTTP/1.1\r\n" b"connection: upgrade\r\n" b"upgrade: websocket\r\n\r\n" ) messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert not msg.should_close assert msg.upgrade assert upgrade def test_bad_upgrade(parser) -> None: """Test not upgraded if missing Upgrade header.""" text = b"GET /test HTTP/1.1\r\nconnection: upgrade\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert not msg.upgrade assert not upgrade def test_compression_empty(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"content-encoding: \r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.compression is None def test_compression_deflate(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"content-encoding: deflate\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.compression == "deflate" def test_compression_gzip(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"content-encoding: gzip\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.compression == "gzip" @pytest.mark.skipif(brotli is None, reason="brotli is not installed") def test_compression_brotli(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"content-encoding: br\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.compression == "br" def test_compression_unknown(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"content-encoding: compress\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.compression is None def test_url_connect(parser: Any) -> None: text = b"CONNECT www.google.com HTTP/1.1\r\n" b"content-length: 0\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg, payload = messages[0] assert upgrade assert msg.url == URL.build(authority="www.google.com") def test_headers_connect(parser: Any) -> None: text = b"CONNECT www.google.com HTTP/1.1\r\n" b"content-length: 0\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg, payload = messages[0] assert upgrade assert isinstance(payload, streams.StreamReader) def test_url_absolute(parser: Any) -> None: text = ( b"GET https://www.google.com/path/to.html HTTP/1.1\r\n" b"content-length: 0\r\n\r\n" ) messages, upgrade, tail = parser.feed_data(text) msg, payload = messages[0] assert not upgrade assert msg.method == "GET" assert msg.url == URL("https://www.google.com/path/to.html") def test_headers_old_websocket_key1(parser: Any) -> None: text = b"GET /test HTTP/1.1\r\n" b"SEC-WEBSOCKET-KEY1: line\r\n\r\n" with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) def test_headers_content_length_err_1(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"content-length: line\r\n\r\n" with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) def test_headers_content_length_err_2(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"content-length: -1\r\n\r\n" with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) _pad: Dict[bytes, str] = { b"": "empty", # not a typo. Python likes triple zero b"\000": "NUL", b" ": "SP", b" ": "SPSP", # not a typo: both 0xa0 and 0x0a in case of 8-bit fun b"\n": "LF", b"\xa0": "NBSP", b"\t ": "TABSP", } @pytest.mark.parametrize("hdr", [b"", b"foo"], ids=["name-empty", "with-name"]) @pytest.mark.parametrize("pad2", _pad.keys(), ids=["post-" + n for n in _pad.values()]) @pytest.mark.parametrize("pad1", _pad.keys(), ids=["pre-" + n for n in _pad.values()]) def test_invalid_header_spacing(parser, pad1: bytes, pad2: bytes, hdr: bytes) -> None: text = b"GET /test HTTP/1.1\r\n" b"%s%s%s: value\r\n\r\n" % (pad1, hdr, pad2) expectation = pytest.raises(http_exceptions.BadHttpMessage) if pad1 == pad2 == b"" and hdr != b"": # one entry in param matrix is correct: non-empty name, not padded expectation = nullcontext() if pad1 == pad2 == hdr == b"": if not isinstance(response, HttpResponseParserPy): pytest.xfail("Regression test for Py parser. May match C behaviour later.") with expectation: parser.feed_data(text) def test_empty_header_name(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b":test\r\n\r\n" with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) def test_invalid_header(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"test line\r\n\r\n" with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) def test_invalid_name(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"test[]: line\r\n\r\n" with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) @pytest.mark.parametrize("size", [40960, 8191]) def test_max_header_field_size(parser, size) -> None: name = b"t" * size text = b"GET /test HTTP/1.1\r\n" + name + b":data\r\n\r\n" match = f"400, message:\n Got more than 8190 bytes \\({size}\\) when reading" with pytest.raises(http_exceptions.LineTooLong, match=match): parser.feed_data(text) def test_max_header_field_size_under_limit(parser) -> None: name = b"t" * 8190 text = b"GET /test HTTP/1.1\r\n" + name + b":data\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.method == "GET" assert msg.path == "/test" assert msg.version == (1, 1) assert msg.headers == CIMultiDict({name.decode(): "data"}) assert msg.raw_headers == ((name, b"data"),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert msg.url == URL("/test") @pytest.mark.parametrize("size", [40960, 8191]) def test_max_header_value_size(parser, size) -> None: name = b"t" * size text = b"GET /test HTTP/1.1\r\n" b"data:" + name + b"\r\n\r\n" match = f"400, message:\n Got more than 8190 bytes \\({size}\\) when reading" with pytest.raises(http_exceptions.LineTooLong, match=match): parser.feed_data(text) def test_max_header_value_size_under_limit(parser) -> None: value = b"A" * 8190 text = b"GET /test HTTP/1.1\r\n" b"data:" + value + b"\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.method == "GET" assert msg.path == "/test" assert msg.version == (1, 1) assert msg.headers == CIMultiDict({"data": value.decode()}) assert msg.raw_headers == ((b"data", value),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert msg.url == URL("/test") @pytest.mark.parametrize("size", [40965, 8191]) def test_max_header_value_size_continuation(response, size) -> None: name = b"T" * (size - 5) text = b"HTTP/1.1 200 Ok\r\ndata: test\r\n " + name + b"\r\n\r\n" match = f"400, message:\n Got more than 8190 bytes \\({size}\\) when reading" with pytest.raises(http_exceptions.LineTooLong, match=match): response.feed_data(text) def test_max_header_value_size_continuation_under_limit(response) -> None: value = b"A" * 8185 text = b"HTTP/1.1 200 Ok\r\ndata: test\r\n " + value + b"\r\n\r\n" messages, upgrade, tail = response.feed_data(text) msg = messages[0][0] assert msg.code == 200 assert msg.reason == "Ok" assert msg.version == (1, 1) assert msg.headers == CIMultiDict({"data": "test " + value.decode()}) assert msg.raw_headers == ((b"data", b"test " + value),) assert msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked def test_http_request_parser(parser) -> None: text = b"GET /path HTTP/1.1\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.method == "GET" assert msg.path == "/path" assert msg.version == (1, 1) assert msg.headers == CIMultiDict() assert msg.raw_headers == () assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert msg.url == URL("/path") def test_http_request_bad_status_line(parser) -> None: text = b"getpath \r\n\r\n" with pytest.raises(http_exceptions.BadStatusLine) as exc_info: parser.feed_data(text) # Check for accidentally escaped message. assert r"\n" not in exc_info.value.message _num: Dict[bytes, str] = { # dangerous: accepted by Python int() # unicodedata.category("\U0001D7D9") == 'Nd' "\N{mathematical double-struck digit one}".encode(): "utf8digit", # only added for interop tests, refused by Python int() # unicodedata.category("\U000000B9") == 'No' "\N{superscript one}".encode(): "utf8number", "\N{superscript one}".encode("latin-1"): "latin1number", } @pytest.mark.parametrize("nonascii_digit", _num.keys(), ids=_num.values()) def test_http_request_bad_status_line_number( parser: Any, nonascii_digit: bytes ) -> None: text = b"GET /digit HTTP/1." + nonascii_digit + b"\r\n\r\n" with pytest.raises(http_exceptions.BadStatusLine): parser.feed_data(text) def test_http_request_bad_status_line_separator(parser: Any) -> None: # single code point, old, multibyte NFKC, multibyte NFKD utf8sep = "\N{arabic ligature sallallahou alayhe wasallam}".encode() text = b"GET /ligature HTTP/1" + utf8sep + b"1\r\n\r\n" with pytest.raises(http_exceptions.BadStatusLine): parser.feed_data(text) def test_http_request_bad_status_line_whitespace(parser: Any) -> None: text = b"GET\n/path\fHTTP/1.1\r\n\r\n" with pytest.raises(http_exceptions.BadStatusLine): parser.feed_data(text) def test_http_request_upgrade(parser: Any) -> None: text = ( b"GET /test HTTP/1.1\r\n" b"connection: upgrade\r\n" b"upgrade: websocket\r\n\r\n" b"some raw data" ) messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert not msg.should_close assert msg.upgrade assert upgrade assert tail == b"some raw data" def test_http_request_parser_utf8_request_line(parser) -> None: if not isinstance(response, HttpResponseParserPy): pytest.xfail("Regression test for Py parser. May match C behaviour later.") messages, upgrade, tail = parser.feed_data( # note the truncated unicode sequence b"GET /P\xc3\xbcnktchen\xa0\xef\xb7 HTTP/1.1\r\n" + # for easier grep: ASCII 0xA0 more commonly known as non-breaking space # note the leading and trailing spaces "sTeP: \N{latin small letter sharp s}nek\t\N{no-break space} " "\r\n\r\n".encode() ) msg = messages[0][0] assert msg.method == "GET" assert msg.path == "/Pünktchen\udca0\udcef\udcb7" assert msg.version == (1, 1) assert msg.headers == CIMultiDict([("STEP", "ßnek\t\xa0")]) assert msg.raw_headers == ((b"sTeP", "ßnek\t\xa0".encode()),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert msg.url.path == URL("/P%C3%BCnktchen\udca0\udcef\udcb7").path def test_http_request_parser_utf8(parser) -> None: text = "GET /path HTTP/1.1\r\nx-test:тест\r\n\r\n".encode() messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.method == "GET" assert msg.path == "/path" assert msg.version == (1, 1) assert msg.headers == CIMultiDict([("X-TEST", "тест")]) assert msg.raw_headers == ((b"x-test", "тест".encode()),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert msg.url == URL("/path") def test_http_request_parser_non_utf8(parser) -> None: text = "GET /path HTTP/1.1\r\nx-test:тест\r\n\r\n".encode("cp1251") msg = parser.feed_data(text)[0][0][0] assert msg.method == "GET" assert msg.path == "/path" assert msg.version == (1, 1) assert msg.headers == CIMultiDict( [("X-TEST", "тест".encode("cp1251").decode("utf8", "surrogateescape"))] ) assert msg.raw_headers == ((b"x-test", "тест".encode("cp1251")),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert msg.url == URL("/path") def test_http_request_parser_two_slashes(parser) -> None: text = b"GET //path HTTP/1.1\r\n\r\n" msg = parser.feed_data(text)[0][0][0] assert msg.method == "GET" assert msg.path == "//path" assert msg.url.path == "//path" assert msg.version == (1, 1) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked @pytest.mark.parametrize( "rfc9110_5_6_2_token_delim", [bytes([i]) for i in rb'"(),/:;<=>?@[\]{}'], ) def test_http_request_parser_bad_method( parser, rfc9110_5_6_2_token_delim: bytes ) -> None: with pytest.raises(http_exceptions.BadStatusLine): parser.feed_data(rfc9110_5_6_2_token_delim + b'ET" /get HTTP/1.1\r\n\r\n') def test_http_request_parser_bad_version(parser) -> None: with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(b"GET //get HT/11\r\n\r\n") def test_http_request_parser_bad_version_number(parser: Any) -> None: with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(b"GET /test HTTP/1.32\r\n\r\n") def test_http_request_parser_bad_ascii_uri(parser: Any) -> None: with pytest.raises(http_exceptions.InvalidURLError): parser.feed_data(b"GET ! HTTP/1.1\r\n\r\n") def test_http_request_parser_bad_nonascii_uri(parser: Any) -> None: with pytest.raises(http_exceptions.InvalidURLError): parser.feed_data(b"GET \xff HTTP/1.1\r\n\r\n") @pytest.mark.parametrize("size", [40965, 8191]) def test_http_request_max_status_line(parser, size) -> None: path = b"t" * (size - 5) match = f"400, message:\n Got more than 8190 bytes \\({size}\\) when reading" with pytest.raises(http_exceptions.LineTooLong, match=match): parser.feed_data(b"GET /path" + path + b" HTTP/1.1\r\n\r\n") def test_http_request_max_status_line_under_limit(parser) -> None: path = b"t" * (8190 - 5) messages, upgraded, tail = parser.feed_data( b"GET /path" + path + b" HTTP/1.1\r\n\r\n" ) msg = messages[0][0] assert msg.method == "GET" assert msg.path == "/path" + path.decode() assert msg.version == (1, 1) assert msg.headers == CIMultiDict() assert msg.raw_headers == () assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert msg.url == URL("/path" + path.decode()) def test_http_response_parser_utf8(response) -> None: text = "HTTP/1.1 200 Ok\r\nx-test:тест\r\n\r\n".encode() messages, upgraded, tail = response.feed_data(text) assert len(messages) == 1 msg = messages[0][0] assert msg.version == (1, 1) assert msg.code == 200 assert msg.reason == "Ok" assert msg.headers == CIMultiDict([("X-TEST", "тест")]) assert msg.raw_headers == ((b"x-test", "тест".encode()),) assert not upgraded assert not tail def test_http_response_parser_utf8_without_reason(response: Any) -> None: text = "HTTP/1.1 200 \r\nx-test:тест\r\n\r\n".encode() messages, upgraded, tail = response.feed_data(text) assert len(messages) == 1 msg = messages[0][0] assert msg.version == (1, 1) assert msg.code == 200 assert msg.reason == "" assert msg.headers == CIMultiDict([("X-TEST", "тест")]) assert msg.raw_headers == ((b"x-test", "тест".encode()),) assert not upgraded assert not tail def test_http_response_parser_obs_line_folding(response: Any) -> None: text = b"HTTP/1.1 200 Ok\r\ntest: line\r\n continue\r\n\r\n" messages, upgraded, tail = response.feed_data(text) assert len(messages) == 1 msg = messages[0][0] assert msg.version == (1, 1) assert msg.code == 200 assert msg.reason == "Ok" assert msg.headers == CIMultiDict([("TEST", "line continue")]) assert msg.raw_headers == ((b"test", b"line continue"),) assert not upgraded assert not tail @pytest.mark.dev_mode def test_http_response_parser_strict_obs_line_folding(response: Any) -> None: text = b"HTTP/1.1 200 Ok\r\ntest: line\r\n continue\r\n\r\n" with pytest.raises(http_exceptions.BadHttpMessage): response.feed_data(text) @pytest.mark.parametrize("size", [40962, 8191]) def test_http_response_parser_bad_status_line_too_long(response, size) -> None: reason = b"t" * (size - 2) match = f"400, message:\n Got more than 8190 bytes \\({size}\\) when reading" with pytest.raises(http_exceptions.LineTooLong, match=match): response.feed_data(b"HTTP/1.1 200 Ok" + reason + b"\r\n\r\n") def test_http_response_parser_status_line_under_limit(response) -> None: reason = b"O" * 8190 messages, upgraded, tail = response.feed_data( b"HTTP/1.1 200 " + reason + b"\r\n\r\n" ) msg = messages[0][0] assert msg.version == (1, 1) assert msg.code == 200 assert msg.reason == reason.decode() def test_http_response_parser_bad_version(response) -> None: with pytest.raises(http_exceptions.BadHttpMessage): response.feed_data(b"HT/11 200 Ok\r\n\r\n") def test_http_response_parser_bad_version_number(response) -> None: with pytest.raises(http_exceptions.BadHttpMessage): response.feed_data(b"HTTP/12.3 200 Ok\r\n\r\n") def test_http_response_parser_no_reason(response) -> None: msg = response.feed_data(b"HTTP/1.1 200\r\n\r\n")[0][0][0] assert msg.version == (1, 1) assert msg.code == 200 assert msg.reason == "" def test_http_response_parser_lenient_headers(response) -> None: messages, upgrade, tail = response.feed_data( b"HTTP/1.1 200 test\r\nFoo: abc\x01def\r\n\r\n" ) msg = messages[0][0] assert msg.headers["Foo"] == "abc\x01def" @pytest.mark.dev_mode def test_http_response_parser_strict_headers(response) -> None: if isinstance(response, HttpResponseParserPy): pytest.xfail("Py parser is lenient. May update py-parser later.") with pytest.raises(http_exceptions.BadHttpMessage): response.feed_data(b"HTTP/1.1 200 test\r\nFoo: abc\x01def\r\n\r\n") def test_http_response_parser_bad_crlf(response) -> None: """Still a lot of dodgy servers sending bad requests like this.""" messages, upgrade, tail = response.feed_data( b"HTTP/1.0 200 OK\nFoo: abc\nBar: def\n\nBODY\n" ) msg = messages[0][0] assert msg.headers["Foo"] == "abc" assert msg.headers["Bar"] == "def" async def test_http_response_parser_bad_chunked_lax(response) -> None: text = ( b"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n5 \r\nabcde\r\n0\r\n\r\n" ) messages, upgrade, tail = response.feed_data(text) assert await messages[0][1].read(5) == b"abcde" @pytest.mark.dev_mode async def test_http_response_parser_bad_chunked_strict_py(loop, protocol) -> None: response = HttpResponseParserPy( protocol, loop, 2**16, max_line_size=8190, max_field_size=8190, ) text = ( b"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n5 \r\nabcde\r\n0\r\n\r\n" ) messages, upgrade, tail = response.feed_data(text) assert isinstance(messages[0][1].exception(), http_exceptions.TransferEncodingError) @pytest.mark.dev_mode @pytest.mark.skipif( "HttpRequestParserC" not in dir(aiohttp.http_parser), reason="C based HTTP parser not available", ) async def test_http_response_parser_bad_chunked_strict_c(loop, protocol) -> None: response = HttpResponseParserC( protocol, loop, 2**16, max_line_size=8190, max_field_size=8190, ) text = ( b"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n5 \r\nabcde\r\n0\r\n\r\n" ) with pytest.raises(http_exceptions.BadHttpMessage): response.feed_data(text) def test_http_response_parser_bad(response) -> None: with pytest.raises(http_exceptions.BadHttpMessage): response.feed_data(b"HTT/1\r\n\r\n") def test_http_response_parser_code_under_100(response) -> None: with pytest.raises(http_exceptions.BadStatusLine): response.feed_data(b"HTTP/1.1 99 test\r\n\r\n") def test_http_response_parser_code_above_999(response) -> None: with pytest.raises(http_exceptions.BadStatusLine): response.feed_data(b"HTTP/1.1 9999 test\r\n\r\n") def test_http_response_parser_code_not_int(response) -> None: with pytest.raises(http_exceptions.BadStatusLine): response.feed_data(b"HTTP/1.1 ttt test\r\n\r\n") @pytest.mark.parametrize("nonascii_digit", _num.keys(), ids=_num.values()) def test_http_response_parser_code_not_ascii(response, nonascii_digit: bytes) -> None: with pytest.raises(http_exceptions.BadStatusLine): response.feed_data(b"HTTP/1.1 20" + nonascii_digit + b" test\r\n\r\n") def test_http_request_chunked_payload(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"transfer-encoding: chunked\r\n\r\n" msg, payload = parser.feed_data(text)[0][0] assert msg.chunked assert not payload.is_eof() assert isinstance(payload, streams.StreamReader) parser.feed_data(b"4\r\ndata\r\n4\r\nline\r\n0\r\n\r\n") assert b"dataline" == b"".join(d for d in payload._buffer) assert [4, 8] == payload._http_chunk_splits assert payload.is_eof() def test_http_request_chunked_payload_and_next_message(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"transfer-encoding: chunked\r\n\r\n" msg, payload = parser.feed_data(text)[0][0] messages, upgraded, tail = parser.feed_data( b"4\r\ndata\r\n4\r\nline\r\n0\r\n\r\n" b"POST /test2 HTTP/1.1\r\n" b"transfer-encoding: chunked\r\n\r\n" ) assert b"dataline" == b"".join(d for d in payload._buffer) assert [4, 8] == payload._http_chunk_splits assert payload.is_eof() assert len(messages) == 1 msg2, payload2 = messages[0] assert msg2.method == "POST" assert msg2.chunked assert not payload2.is_eof() def test_http_request_chunked_payload_chunks(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"transfer-encoding: chunked\r\n\r\n" msg, payload = parser.feed_data(text)[0][0] parser.feed_data(b"4\r\ndata\r") parser.feed_data(b"\n4") parser.feed_data(b"\r") parser.feed_data(b"\n") parser.feed_data(b"li") parser.feed_data(b"ne\r\n0\r\n") parser.feed_data(b"test: test\r\n") assert b"dataline" == b"".join(d for d in payload._buffer) assert [4, 8] == payload._http_chunk_splits assert not payload.is_eof() parser.feed_data(b"\r\n") assert b"dataline" == b"".join(d for d in payload._buffer) assert [4, 8] == payload._http_chunk_splits assert payload.is_eof() def test_parse_chunked_payload_chunk_extension(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"transfer-encoding: chunked\r\n\r\n" msg, payload = parser.feed_data(text)[0][0] parser.feed_data(b"4;test\r\ndata\r\n4\r\nline\r\n0\r\ntest: test\r\n\r\n") assert b"dataline" == b"".join(d for d in payload._buffer) assert [4, 8] == payload._http_chunk_splits assert payload.is_eof() def _test_parse_no_length_or_te_on_post(loop, protocol, request_cls): parser = request_cls(protocol, loop, readall=True) text = b"POST /test HTTP/1.1\r\n\r\n" msg, payload = parser.feed_data(text)[0][0] assert payload.is_eof() def test_parse_payload_response_without_body(loop, protocol, response_cls) -> None: parser = response_cls(protocol, loop, 2**16, response_with_body=False) text = b"HTTP/1.1 200 Ok\r\n" b"content-length: 10\r\n\r\n" msg, payload = parser.feed_data(text)[0][0] assert payload.is_eof() def test_parse_length_payload(response) -> None: text = b"HTTP/1.1 200 Ok\r\n" b"content-length: 4\r\n\r\n" msg, payload = response.feed_data(text)[0][0] assert not payload.is_eof() response.feed_data(b"da") response.feed_data(b"t") response.feed_data(b"aHT") assert payload.is_eof() assert b"data" == b"".join(d for d in payload._buffer) def test_parse_no_length_payload(parser) -> None: text = b"PUT / HTTP/1.1\r\n\r\n" msg, payload = parser.feed_data(text)[0][0] assert payload.is_eof() def test_parse_content_length_payload_multiple(response: Any) -> None: text = b"HTTP/1.1 200 OK\r\ncontent-length: 5\r\n\r\nfirst" msg, payload = response.feed_data(text)[0][0] assert msg.version == HttpVersion(major=1, minor=1) assert msg.code == 200 assert msg.reason == "OK" assert msg.headers == CIMultiDict( [ ("Content-Length", "5"), ] ) assert msg.raw_headers == ((b"content-length", b"5"),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert payload.is_eof() assert b"first" == b"".join(d for d in payload._buffer) text = b"HTTP/1.1 200 OK\r\ncontent-length: 6\r\n\r\nsecond" msg, payload = response.feed_data(text)[0][0] assert msg.version == HttpVersion(major=1, minor=1) assert msg.code == 200 assert msg.reason == "OK" assert msg.headers == CIMultiDict( [ ("Content-Length", "6"), ] ) assert msg.raw_headers == ((b"content-length", b"6"),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert payload.is_eof() assert b"second" == b"".join(d for d in payload._buffer) def test_parse_content_length_than_chunked_payload(response: Any) -> None: text = b"HTTP/1.1 200 OK\r\ncontent-length: 5\r\n\r\nfirst" msg, payload = response.feed_data(text)[0][0] assert msg.version == HttpVersion(major=1, minor=1) assert msg.code == 200 assert msg.reason == "OK" assert msg.headers == CIMultiDict( [ ("Content-Length", "5"), ] ) assert msg.raw_headers == ((b"content-length", b"5"),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert payload.is_eof() assert b"first" == b"".join(d for d in payload._buffer) text = ( b"HTTP/1.1 200 OK\r\n" b"transfer-encoding: chunked\r\n\r\n" b"6\r\nsecond\r\n0\r\n\r\n" ) msg, payload = response.feed_data(text)[0][0] assert msg.version == HttpVersion(major=1, minor=1) assert msg.code == 200 assert msg.reason == "OK" assert msg.headers == CIMultiDict( [ ("Transfer-Encoding", "chunked"), ] ) assert msg.raw_headers == ((b"transfer-encoding", b"chunked"),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert msg.chunked assert payload.is_eof() assert b"second" == b"".join(d for d in payload._buffer) @pytest.mark.parametrize("code", (204, 304, 101, 102)) def test_parse_chunked_payload_empty_body_than_another_chunked( response: Any, code: int ) -> None: head = f"HTTP/1.1 {code} OK\r\n".encode() text = head + b"transfer-encoding: chunked\r\n\r\n" msg, payload = response.feed_data(text)[0][0] assert msg.version == HttpVersion(major=1, minor=1) assert msg.code == code assert msg.reason == "OK" assert msg.headers == CIMultiDict( [ ("Transfer-Encoding", "chunked"), ] ) assert msg.raw_headers == ((b"transfer-encoding", b"chunked"),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert msg.chunked assert payload.is_eof() text = ( b"HTTP/1.1 200 OK\r\n" b"transfer-encoding: chunked\r\n\r\n" b"6\r\nsecond\r\n0\r\n\r\n" ) msg, payload = response.feed_data(text)[0][0] assert msg.version == HttpVersion(major=1, minor=1) assert msg.code == 200 assert msg.reason == "OK" assert msg.headers == CIMultiDict( [ ("Transfer-Encoding", "chunked"), ] ) assert msg.raw_headers == ((b"transfer-encoding", b"chunked"),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert msg.chunked assert payload.is_eof() assert b"second" == b"".join(d for d in payload._buffer) def test_partial_url(parser: Any) -> None: messages, upgrade, tail = parser.feed_data(b"GET /te") assert len(messages) == 0 messages, upgrade, tail = parser.feed_data(b"st HTTP/1.1\r\n\r\n") assert len(messages) == 1 msg, payload = messages[0] assert msg.method == "GET" assert msg.path == "/test" assert msg.version == (1, 1) assert payload.is_eof() @pytest.mark.parametrize( ("uri", "path", "query", "fragment"), [ ("/path%23frag", "/path#frag", {}, ""), ("/path%2523frag", "/path%23frag", {}, ""), ("/path?key=value%23frag", "/path", {"key": "value#frag"}, ""), ("/path?key=value%2523frag", "/path", {"key": "value%23frag"}, ""), ("/path#frag%20", "/path", {}, "frag "), ("/path#frag%2520", "/path", {}, "frag%20"), ], ) def test_parse_uri_percent_encoded(parser, uri, path, query, fragment) -> None: text = (f"GET {uri} HTTP/1.1\r\n\r\n").encode() messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.path == uri assert msg.url == URL(uri) assert msg.url.path == path assert msg.url.query == query assert msg.url.fragment == fragment def test_parse_uri_utf8(parser) -> None: if not isinstance(parser, HttpRequestParserPy): pytest.xfail("Not valid HTTP. Maybe update py-parser to reject later.") text = ("GET /путь?ключ=знач#фраг HTTP/1.1\r\n\r\n").encode() messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.path == "/путь?ключ=знач#фраг" assert msg.url.path == "/путь" assert msg.url.query == {"ключ": "знач"} assert msg.url.fragment == "фраг" def test_parse_uri_utf8_percent_encoded(parser) -> None: text = ( "GET %s HTTP/1.1\r\n\r\n" % quote("/путь?ключ=знач#фраг", safe="/?=#") ).encode() messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.path == quote("/путь?ключ=знач#фраг", safe="/?=#") assert msg.url == URL("/путь?ключ=знач#фраг") assert msg.url.path == "/путь" assert msg.url.query == {"ключ": "знач"} assert msg.url.fragment == "фраг" @pytest.mark.skipif( "HttpRequestParserC" not in dir(aiohttp.http_parser), reason="C based HTTP parser not available", ) def test_parse_bad_method_for_c_parser_raises(loop, protocol): payload = b"GET1 /test HTTP/1.1\r\n\r\n" parser = HttpRequestParserC( protocol, loop, 2**16, max_line_size=8190, max_headers=32768, max_field_size=8190, ) with pytest.raises(aiohttp.http_exceptions.BadStatusLine): messages, upgrade, tail = parser.feed_data(payload) class TestParsePayload: async def test_parse_eof_payload(self, stream) -> None: out = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, readall=True) p.feed_data(b"data") p.feed_eof() assert out.is_eof() assert [(bytearray(b"data"), 4)] == list(out._buffer) async def test_parse_no_body(self, stream) -> None: out = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, method="PUT") assert out.is_eof() assert p.done async def test_parse_length_payload_eof(self, stream) -> None: out = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, length=4) p.feed_data(b"da") with pytest.raises(http_exceptions.ContentLengthError): p.feed_eof() async def test_parse_chunked_payload_size_error(self, stream) -> None: out = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, chunked=True) with pytest.raises(http_exceptions.TransferEncodingError): p.feed_data(b"blah\r\n") assert isinstance(out.exception(), http_exceptions.TransferEncodingError) async def test_parse_chunked_payload_split_end(self, protocol) -> None: out = aiohttp.StreamReader(protocol, 2**16, loop=None) p = HttpPayloadParser(out, chunked=True) p.feed_data(b"4\r\nasdf\r\n0\r\n") p.feed_data(b"\r\n") assert out.is_eof() assert b"asdf" == b"".join(out._buffer) async def test_parse_chunked_payload_split_end2(self, protocol) -> None: out = aiohttp.StreamReader(protocol, 2**16, loop=None) p = HttpPayloadParser(out, chunked=True) p.feed_data(b"4\r\nasdf\r\n0\r\n\r") p.feed_data(b"\n") assert out.is_eof() assert b"asdf" == b"".join(out._buffer) async def test_parse_chunked_payload_split_end_trailers(self, protocol) -> None: out = aiohttp.StreamReader(protocol, 2**16, loop=None) p = HttpPayloadParser(out, chunked=True) p.feed_data(b"4\r\nasdf\r\n0\r\n") p.feed_data(b"Content-MD5: 912ec803b2ce49e4a541068d495ab570\r\n") p.feed_data(b"\r\n") assert out.is_eof() assert b"asdf" == b"".join(out._buffer) async def test_parse_chunked_payload_split_end_trailers2(self, protocol) -> None: out = aiohttp.StreamReader(protocol, 2**16, loop=None) p = HttpPayloadParser(out, chunked=True) p.feed_data(b"4\r\nasdf\r\n0\r\n") p.feed_data(b"Content-MD5: 912ec803b2ce49e4a541068d495ab570\r\n\r") p.feed_data(b"\n") assert out.is_eof() assert b"asdf" == b"".join(out._buffer) async def test_parse_chunked_payload_split_end_trailers3(self, protocol) -> None: out = aiohttp.StreamReader(protocol, 2**16, loop=None) p = HttpPayloadParser(out, chunked=True) p.feed_data(b"4\r\nasdf\r\n0\r\nContent-MD5: ") p.feed_data(b"912ec803b2ce49e4a541068d495ab570\r\n\r\n") assert out.is_eof() assert b"asdf" == b"".join(out._buffer) async def test_parse_chunked_payload_split_end_trailers4(self, protocol) -> None: out = aiohttp.StreamReader(protocol, 2**16, loop=None) p = HttpPayloadParser(out, chunked=True) p.feed_data(b"4\r\nasdf\r\n0\r\n" b"C") p.feed_data(b"ontent-MD5: 912ec803b2ce49e4a541068d495ab570\r\n\r\n") assert out.is_eof() assert b"asdf" == b"".join(out._buffer) async def test_http_payload_parser_length(self, stream) -> None: out = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, length=2) eof, tail = p.feed_data(b"1245") assert eof assert b"12" == b"".join(d for d, _ in out._buffer) assert b"45" == tail async def test_http_payload_parser_deflate(self, stream) -> None: # c=compressobj(wbits=15); b''.join([c.compress(b'data'), c.flush()]) COMPRESSED = b"x\x9cKI,I\x04\x00\x04\x00\x01\x9b" length = len(COMPRESSED) out = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, length=length, compression="deflate") p.feed_data(COMPRESSED) assert b"data" == b"".join(d for d, _ in out._buffer) assert out.is_eof() async def test_http_payload_parser_deflate_no_hdrs(self, stream: Any) -> None: """Tests incorrectly formed data (no zlib headers).""" # c=compressobj(wbits=-15); b''.join([c.compress(b'data'), c.flush()]) COMPRESSED = b"KI,I\x04\x00" length = len(COMPRESSED) out = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, length=length, compression="deflate") p.feed_data(COMPRESSED) assert b"data" == b"".join(d for d, _ in out._buffer) assert out.is_eof() async def test_http_payload_parser_deflate_light(self, stream) -> None: # c=compressobj(wbits=9); b''.join([c.compress(b'data'), c.flush()]) COMPRESSED = b"\x18\x95KI,I\x04\x00\x04\x00\x01\x9b" length = len(COMPRESSED) out = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, length=length, compression="deflate") p.feed_data(COMPRESSED) assert b"data" == b"".join(d for d, _ in out._buffer) assert out.is_eof() async def test_http_payload_parser_deflate_split(self, stream) -> None: out = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, compression="deflate", readall=True) # Feeding one correct byte should be enough to choose exact # deflate decompressor p.feed_data(b"x", 1) p.feed_data(b"\x9cKI,I\x04\x00\x04\x00\x01\x9b", 11) p.feed_eof() assert b"data" == b"".join(d for d, _ in out._buffer) async def test_http_payload_parser_deflate_split_err(self, stream) -> None: out = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, compression="deflate", readall=True) # Feeding one wrong byte should be enough to choose exact # deflate decompressor p.feed_data(b"K", 1) p.feed_data(b"I,I\x04\x00", 5) p.feed_eof() assert b"data" == b"".join(d for d, _ in out._buffer) async def test_http_payload_parser_length_zero(self, stream) -> None: out = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, length=0) assert p.done assert out.is_eof() @pytest.mark.skipif(brotli is None, reason="brotli is not installed") async def test_http_payload_brotli(self, stream) -> None: compressed = brotli.compress(b"brotli data") out = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, length=len(compressed), compression="br") p.feed_data(compressed) assert b"brotli data" == b"".join(d for d, _ in out._buffer) assert out.is_eof() class TestDeflateBuffer: async def test_feed_data(self, stream) -> None: buf = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) dbuf = DeflateBuffer(buf, "deflate") dbuf.decompressor = mock.Mock() dbuf.decompressor.decompress_sync.return_value = b"line" # First byte should be b'x' in order code not to change the decoder. dbuf.feed_data(b"xxxx", 4) assert [b"line"] == list(d for d, _ in buf._buffer) async def test_feed_data_err(self, stream) -> None: buf = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) dbuf = DeflateBuffer(buf, "deflate") exc = ValueError() dbuf.decompressor = mock.Mock() dbuf.decompressor.decompress_sync.side_effect = exc with pytest.raises(http_exceptions.ContentEncodingError): # Should be more than 4 bytes to trigger deflate FSM error. # Should start with b'x', otherwise code switch mocked decoder. dbuf.feed_data(b"xsomedata", 9) async def test_feed_eof(self, stream) -> None: buf = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) dbuf = DeflateBuffer(buf, "deflate") dbuf.decompressor = mock.Mock() dbuf.decompressor.flush.return_value = b"line" dbuf.feed_eof() assert [b"line"] == list(d for d, _ in buf._buffer) assert buf._eof async def test_feed_eof_err_deflate(self, stream) -> None: buf = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) dbuf = DeflateBuffer(buf, "deflate") dbuf.decompressor = mock.Mock() dbuf.decompressor.flush.return_value = b"line" dbuf.decompressor.eof = False with pytest.raises(http_exceptions.ContentEncodingError): dbuf.feed_eof() async def test_feed_eof_no_err_gzip(self, stream) -> None: buf = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) dbuf = DeflateBuffer(buf, "gzip") dbuf.decompressor = mock.Mock() dbuf.decompressor.flush.return_value = b"line" dbuf.decompressor.eof = False dbuf.feed_eof() assert [b"line"] == list(d for d, _ in buf._buffer) async def test_feed_eof_no_err_brotli(self, stream) -> None: buf = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) dbuf = DeflateBuffer(buf, "br") dbuf.decompressor = mock.Mock() dbuf.decompressor.flush.return_value = b"line" dbuf.decompressor.eof = False dbuf.feed_eof() assert [b"line"] == list(d for d, _ in buf._buffer) async def test_empty_body(self, stream) -> None: buf = aiohttp.FlowControlDataQueue( stream, 2**16, loop=asyncio.get_event_loop() ) dbuf = DeflateBuffer(buf, "deflate") dbuf.feed_eof() assert buf.at_eof() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_http_writer.py0000644000175100001770000001761414607525266017761 0ustar00runnerdocker# Tests for aiohttp/http_writer.py import array from unittest import mock import pytest from multidict import CIMultiDict from aiohttp import http from aiohttp.test_utils import make_mocked_coro @pytest.fixture def buf(): return bytearray() @pytest.fixture def transport(buf): transport = mock.Mock() def write(chunk): buf.extend(chunk) transport.write.side_effect = write transport.is_closing.return_value = False return transport @pytest.fixture def protocol(loop, transport): protocol = mock.Mock(transport=transport) protocol._drain_helper = make_mocked_coro() return protocol def test_payloadwriter_properties(transport, protocol, loop) -> None: writer = http.StreamWriter(protocol, loop) assert writer.protocol == protocol assert writer.transport == transport async def test_write_payload_eof(transport, protocol, loop) -> None: write = transport.write = mock.Mock() msg = http.StreamWriter(protocol, loop) await msg.write(b"data1") await msg.write(b"data2") await msg.write_eof() content = b"".join([c[1][0] for c in list(write.mock_calls)]) assert b"data1data2" == content.split(b"\r\n\r\n", 1)[-1] async def test_write_payload_chunked(buf, protocol, transport, loop) -> None: msg = http.StreamWriter(protocol, loop) msg.enable_chunking() await msg.write(b"data") await msg.write_eof() assert b"4\r\ndata\r\n0\r\n\r\n" == buf async def test_write_payload_chunked_multiple(buf, protocol, transport, loop) -> None: msg = http.StreamWriter(protocol, loop) msg.enable_chunking() await msg.write(b"data1") await msg.write(b"data2") await msg.write_eof() assert b"5\r\ndata1\r\n5\r\ndata2\r\n0\r\n\r\n" == buf async def test_write_payload_length(protocol, transport, loop) -> None: write = transport.write = mock.Mock() msg = http.StreamWriter(protocol, loop) msg.length = 2 await msg.write(b"d") await msg.write(b"ata") await msg.write_eof() content = b"".join([c[1][0] for c in list(write.mock_calls)]) assert b"da" == content.split(b"\r\n\r\n", 1)[-1] async def test_write_payload_chunked_filter(protocol, transport, loop) -> None: write = transport.write = mock.Mock() msg = http.StreamWriter(protocol, loop) msg.enable_chunking() await msg.write(b"da") await msg.write(b"ta") await msg.write_eof() content = b"".join([c[1][0] for c in list(write.mock_calls)]) assert content.endswith(b"2\r\nda\r\n2\r\nta\r\n0\r\n\r\n") async def test_write_payload_chunked_filter_mutiple_chunks(protocol, transport, loop): write = transport.write = mock.Mock() msg = http.StreamWriter(protocol, loop) msg.enable_chunking() await msg.write(b"da") await msg.write(b"ta") await msg.write(b"1d") await msg.write(b"at") await msg.write(b"a2") await msg.write_eof() content = b"".join([c[1][0] for c in list(write.mock_calls)]) assert content.endswith( b"2\r\nda\r\n2\r\nta\r\n2\r\n1d\r\n2\r\nat\r\n" b"2\r\na2\r\n0\r\n\r\n" ) async def test_write_payload_deflate_compression(protocol, transport, loop) -> None: COMPRESSED = b"x\x9cKI,I\x04\x00\x04\x00\x01\x9b" write = transport.write = mock.Mock() msg = http.StreamWriter(protocol, loop) msg.enable_compression("deflate") await msg.write(b"data") await msg.write_eof() chunks = [c[1][0] for c in list(write.mock_calls)] assert all(chunks) content = b"".join(chunks) assert COMPRESSED == content.split(b"\r\n\r\n", 1)[-1] async def test_write_payload_deflate_and_chunked(buf, protocol, transport, loop): msg = http.StreamWriter(protocol, loop) msg.enable_compression("deflate") msg.enable_chunking() await msg.write(b"da") await msg.write(b"ta") await msg.write_eof() thing = b"2\r\nx\x9c\r\n" b"a\r\nKI,I\x04\x00\x04\x00\x01\x9b\r\n" b"0\r\n\r\n" assert thing == buf async def test_write_payload_bytes_memoryview(buf, protocol, transport, loop): msg = http.StreamWriter(protocol, loop) mv = memoryview(b"abcd") await msg.write(mv) await msg.write_eof() thing = b"abcd" assert thing == buf async def test_write_payload_short_ints_memoryview(buf, protocol, transport, loop): msg = http.StreamWriter(protocol, loop) msg.enable_chunking() payload = memoryview(array.array("H", [65, 66, 67])) await msg.write(payload) await msg.write_eof() endians = ( (b"6\r\n" b"\x00A\x00B\x00C\r\n" b"0\r\n\r\n"), (b"6\r\n" b"A\x00B\x00C\x00\r\n" b"0\r\n\r\n"), ) assert buf in endians async def test_write_payload_2d_shape_memoryview(buf, protocol, transport, loop): msg = http.StreamWriter(protocol, loop) msg.enable_chunking() mv = memoryview(b"ABCDEF") payload = mv.cast("c", [3, 2]) await msg.write(payload) await msg.write_eof() thing = b"6\r\n" b"ABCDEF\r\n" b"0\r\n\r\n" assert thing == buf async def test_write_payload_slicing_long_memoryview(buf, protocol, transport, loop): msg = http.StreamWriter(protocol, loop) msg.length = 4 mv = memoryview(b"ABCDEF") payload = mv.cast("c", [3, 2]) await msg.write(payload) await msg.write_eof() thing = b"ABCD" assert thing == buf async def test_write_drain(protocol, transport, loop) -> None: msg = http.StreamWriter(protocol, loop) msg.drain = make_mocked_coro() await msg.write(b"1" * (64 * 1024 * 2), drain=False) assert not msg.drain.called await msg.write(b"1", drain=True) assert msg.drain.called assert msg.buffer_size == 0 async def test_write_calls_callback(protocol, transport, loop) -> None: on_chunk_sent = make_mocked_coro() msg = http.StreamWriter(protocol, loop, on_chunk_sent=on_chunk_sent) chunk = b"1" await msg.write(chunk) assert on_chunk_sent.called assert on_chunk_sent.call_args == mock.call(chunk) async def test_write_eof_calls_callback(protocol, transport, loop) -> None: on_chunk_sent = make_mocked_coro() msg = http.StreamWriter(protocol, loop, on_chunk_sent=on_chunk_sent) chunk = b"1" await msg.write_eof(chunk=chunk) assert on_chunk_sent.called assert on_chunk_sent.call_args == mock.call(chunk) async def test_write_to_closing_transport(protocol, transport, loop) -> None: msg = http.StreamWriter(protocol, loop) await msg.write(b"Before closing") transport.is_closing.return_value = True with pytest.raises(ConnectionResetError): await msg.write(b"After closing") async def test_write_to_closed_transport(protocol, transport, loop) -> None: """Test that writing to a closed transport raises ConnectionResetError. The StreamWriter checks to see if protocol.transport is None before writing to the transport. If it is None, it raises ConnectionResetError. """ msg = http.StreamWriter(protocol, loop) await msg.write(b"Before transport close") protocol.transport = None with pytest.raises(ConnectionResetError, match="Cannot write to closing transport"): await msg.write(b"After transport closed") async def test_drain(protocol, transport, loop) -> None: msg = http.StreamWriter(protocol, loop) await msg.drain() assert protocol._drain_helper.called async def test_drain_no_transport(protocol, transport, loop) -> None: msg = http.StreamWriter(protocol, loop) msg._protocol.transport = None await msg.drain() assert not protocol._drain_helper.called async def test_write_headers_prevents_injection(protocol, transport, loop) -> None: msg = http.StreamWriter(protocol, loop) status_line = "HTTP/1.1 200 OK" wrong_headers = CIMultiDict({"Set-Cookie: abc=123\r\nContent-Length": "256"}) with pytest.raises(ValueError): await msg.write_headers(status_line, wrong_headers) wrong_headers = CIMultiDict({"Content-Length": "256\r\nSet-Cookie: abc=123"}) with pytest.raises(ValueError): await msg.write_headers(status_line, wrong_headers) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_imports.py0000644000175100001770000000417714607525266017103 0ustar00runnerdockerimport os import platform import sys from pathlib import Path import pytest def test___all__(pytester: pytest.Pytester) -> None: """See https://github.com/aio-libs/aiohttp/issues/6197""" pytester.makepyfile( test_a=""" from aiohttp import * assert 'GunicornWebWorker' in globals() """ ) result = pytester.runpytest("-vv") result.assert_outcomes(passed=0, errors=0) def test_web___all__(pytester: pytest.Pytester) -> None: pytester.makepyfile( test_b=""" from aiohttp.web import * """ ) result = pytester.runpytest("-vv") result.assert_outcomes(passed=0, errors=0) _TARGET_TIMINGS_BY_PYTHON_VERSION = { "3.12": 250, # 3.12 is expected to be a bit slower due to performance trade-offs } @pytest.mark.internal @pytest.mark.skipif( not sys.platform.startswith("linux") or platform.python_implementation() == "PyPy", reason="Timing is more reliable on Linux", ) def test_import_time(pytester: pytest.Pytester) -> None: """Check that importing aiohttp doesn't take too long. Obviously, the time may vary on different machines and may need to be adjusted from time to time, but this should provide an early warning if something is added that significantly increases import time. """ root = Path(__file__).parent.parent old_path = os.environ.get("PYTHONPATH") os.environ["PYTHONPATH"] = os.pathsep.join([str(root)] + sys.path) best_time_ms = 1000 cmd = "import timeit; print(int(timeit.timeit('import aiohttp', number=1) * 1000))" try: for _ in range(3): r = pytester.run(sys.executable, "-We", "-c", cmd) assert not r.stderr.str() runtime_ms = int(r.stdout.str()) if runtime_ms < best_time_ms: best_time_ms = runtime_ms finally: if old_path is None: os.environ.pop("PYTHONPATH") else: os.environ["PYTHONPATH"] = old_path expected_time = _TARGET_TIMINGS_BY_PYTHON_VERSION.get( f"{sys.version_info.major}.{sys.version_info.minor}", 200 ) assert best_time_ms < expected_time ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_locks.py0000644000175100001770000000235514607525266016515 0ustar00runnerdocker# Tests of custom aiohttp locks implementations import asyncio import pytest from aiohttp.locks import EventResultOrError class TestEventResultOrError: async def test_set_exception(self, loop) -> None: ev = EventResultOrError(loop=loop) async def c(): try: await ev.wait() except Exception as e: return e return 1 t = loop.create_task(c()) await asyncio.sleep(0) e = Exception() ev.set(exc=e) assert (await t) == e async def test_set(self, loop) -> None: ev = EventResultOrError(loop=loop) async def c(): await ev.wait() return 1 t = loop.create_task(c()) await asyncio.sleep(0) ev.set() assert (await t) == 1 async def test_cancel_waiters(self, loop) -> None: ev = EventResultOrError(loop=loop) async def c(): await ev.wait() t1 = loop.create_task(c()) t2 = loop.create_task(c()) await asyncio.sleep(0) ev.cancel() ev.set() with pytest.raises(asyncio.CancelledError): await t1 with pytest.raises(asyncio.CancelledError): await t2 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_loop.py0000644000175100001770000000321314607525266016345 0ustar00runnerdockerimport asyncio import platform import threading import pytest from aiohttp import web from aiohttp.test_utils import AioHTTPTestCase, loop_context @pytest.mark.skipif( platform.system() == "Windows", reason="the test is not valid for Windows" ) async def test_subprocess_co(loop) -> None: proc = await asyncio.create_subprocess_shell( "exit 0", stdin=asyncio.subprocess.DEVNULL, stdout=asyncio.subprocess.DEVNULL, stderr=asyncio.subprocess.DEVNULL, ) await proc.wait() class TestCase(AioHTTPTestCase): async def get_application(self): app = web.Application() app.on_startup.append(self.on_startup_hook) return app async def on_startup_hook(self, app): self.on_startup_called = True async def test_on_startup_hook(self) -> None: self.assertTrue(self.on_startup_called) def test_default_loop(self) -> None: self.assertIs(self.loop, asyncio.get_event_loop_policy().get_event_loop()) def test_default_loop(loop) -> None: assert asyncio.get_event_loop_policy().get_event_loop() is loop def test_setup_loop_non_main_thread() -> None: child_exc = None def target() -> None: try: with loop_context() as loop: assert asyncio.get_event_loop_policy().get_event_loop() is loop loop.run_until_complete(test_subprocess_co(loop)) except Exception as exc: nonlocal child_exc child_exc = exc # Ensures setup_test_loop can be called by pytest-xdist in non-main thread. t = threading.Thread(target=target) t.start() t.join() assert child_exc is None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_multipart.py0000644000175100001770000014444414607525266017431 0ustar00runnerdockerimport asyncio import io import json import pathlib import zlib from unittest import mock import pytest import aiohttp from aiohttp import payload from aiohttp.hdrs import ( CONTENT_DISPOSITION, CONTENT_ENCODING, CONTENT_TRANSFER_ENCODING, CONTENT_TYPE, ) from aiohttp.helpers import parse_mimetype from aiohttp.multipart import MultipartResponseWrapper from aiohttp.streams import StreamReader from aiohttp.test_utils import make_mocked_coro BOUNDARY = b"--:" newline = b"\r\n" @pytest.fixture def buf(): return bytearray() @pytest.fixture def stream(buf): writer = mock.Mock() async def write(chunk): buf.extend(chunk) writer.write.side_effect = write return writer @pytest.fixture def writer(): return aiohttp.MultipartWriter(boundary=":") class Response: def __init__(self, headers, content): self.headers = headers self.content = content class Stream: def __init__(self, content): self.content = io.BytesIO(content) async def read(self, size=None): return self.content.read(size) def at_eof(self): return self.content.tell() == len(self.content.getbuffer()) async def readline(self): return self.content.readline() def unread_data(self, data): self.content = io.BytesIO(data + self.content.read()) def __enter__(self): return self def __exit__(self, exc_type, exc_value, traceback): self.content.close() class StreamWithShortenRead(Stream): def __init__(self, content): self._first = True super().__init__(content) async def read(self, size=None): if size is not None and self._first: self._first = False size = size // 2 return await super().read(size) class TestMultipartResponseWrapper: def test_at_eof(self) -> None: wrapper = MultipartResponseWrapper(mock.Mock(), mock.Mock()) wrapper.at_eof() assert wrapper.resp.content.at_eof.called async def test_next(self) -> None: wrapper = MultipartResponseWrapper(mock.Mock(), mock.Mock()) wrapper.stream.next = make_mocked_coro(b"") wrapper.stream.at_eof.return_value = False await wrapper.next() assert wrapper.stream.next.called async def test_release(self) -> None: wrapper = MultipartResponseWrapper(mock.Mock(), mock.Mock()) wrapper.resp.release = make_mocked_coro(None) await wrapper.release() assert wrapper.resp.release.called async def test_release_when_stream_at_eof(self) -> None: wrapper = MultipartResponseWrapper(mock.Mock(), mock.Mock()) wrapper.resp.release = make_mocked_coro(None) wrapper.stream.next = make_mocked_coro(b"") wrapper.stream.at_eof.return_value = True await wrapper.next() assert wrapper.stream.next.called assert wrapper.resp.release.called class TestPartReader: async def test_next(self) -> None: data = b"Hello, world!%s--:" % newline with Stream(data) as stream: obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) result = await obj.next() assert b"Hello, world!" == result assert obj.at_eof() async def test_next_next(self) -> None: data = b"Hello, world!%s--:" % newline with Stream(data) as stream: obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) result = await obj.next() assert b"Hello, world!" == result assert obj.at_eof() result = await obj.next() assert result is None async def test_read(self) -> None: data = b"Hello, world!%s--:" % newline with Stream(data) as stream: obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) result = await obj.read() assert b"Hello, world!" == result assert obj.at_eof() async def test_read_chunk_at_eof(self) -> None: with Stream(b"--:") as stream: obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) obj._at_eof = True result = await obj.read_chunk() assert b"" == result async def test_read_chunk_without_content_length(self) -> None: data = b"Hello, world!%s--:" % newline with Stream(data) as stream: obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) c1 = await obj.read_chunk(8) c2 = await obj.read_chunk(8) c3 = await obj.read_chunk(8) assert c1 + c2 == b"Hello, world!" assert c3 == b"" async def test_read_incomplete_chunk(self) -> None: with Stream(b"") as stream: def prepare(data): return data with mock.patch.object( stream, "read", side_effect=[ prepare(b"Hello, "), prepare(b"World"), prepare(b"!%s--:" % newline), prepare(b""), ], ): obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) c1 = await obj.read_chunk(8) assert c1 == b"Hello, " c2 = await obj.read_chunk(8) assert c2 == b"World" c3 = await obj.read_chunk(8) assert c3 == b"!" async def test_read_all_at_once(self) -> None: data = b"Hello, World!%s--:--%s" % (newline, newline) with Stream(data) as stream: obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) result = await obj.read_chunk() assert b"Hello, World!" == result result = await obj.read_chunk() assert b"" == result assert obj.at_eof() async def test_read_incomplete_body_chunked(self) -> None: data = b"Hello, World!%s--" % newline with Stream(data) as stream: obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) result = b"" with pytest.raises(AssertionError): for _ in range(4): result += await obj.read_chunk(7) assert data == result async def test_read_boundary_with_incomplete_chunk(self) -> None: with Stream(b"") as stream: def prepare(data): return data with mock.patch.object( stream, "read", side_effect=[ prepare(b"Hello, World"), prepare(b"!%s" % newline), prepare(b"--:"), prepare(b""), ], ): obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) c1 = await obj.read_chunk(12) assert c1 == b"Hello, World" c2 = await obj.read_chunk(8) assert c2 == b"!" c3 = await obj.read_chunk(8) assert c3 == b"" async def test_multi_read_chunk(self) -> None: data = b"Hello,%s--:%s%sworld!%s--:--" % ((newline,) * 4) with Stream(data) as stream: obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) result = await obj.read_chunk(8) assert b"Hello," == result result = await obj.read_chunk(8) assert b"" == result assert obj.at_eof() async def test_read_chunk_properly_counts_read_bytes(self) -> None: expected = b"." * 10 tail = b"%s--:--" % newline size = len(expected) with StreamWithShortenRead(expected + tail) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {"CONTENT-LENGTH": size}, stream, ) result = bytearray() while True: chunk = await obj.read_chunk() if not chunk: break result.extend(chunk) assert size == len(result) assert b"." * size == result assert obj.at_eof() async def test_read_does_not_read_boundary(self) -> None: data = b"Hello, world!%s--:" % newline with Stream(data) as stream: obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) result = await obj.read() assert b"Hello, world!" == result assert b"--:" == (await stream.read()) async def test_multiread(self) -> None: data = b"Hello,%s--:%s%sworld!%s--:--" % ((newline,) * 4) with Stream(data) as stream: obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) result = await obj.read() assert b"Hello," == result result = await obj.read() assert b"" == result assert obj.at_eof() async def test_read_multiline(self) -> None: data = b"Hello\n,\r\nworld!%s--:--" % newline with Stream(data) as stream: obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) result = await obj.read() assert b"Hello\n,\r\nworld!" == result result = await obj.read() assert b"" == result assert obj.at_eof() async def test_read_respects_content_length(self) -> None: data = b"." * 100500 tail = b"%s--:--" % newline with Stream(data + tail) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {"CONTENT-LENGTH": 100500}, stream, ) result = await obj.read() assert data == result assert obj.at_eof() async def test_read_with_content_encoding_gzip(self) -> None: with Stream( b"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x0b\xc9\xccMU" b"(\xc9W\x08J\xcdI\xacP\x04\x00$\xfb\x9eV\x0e\x00\x00\x00" b"%s--:--" % newline ) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_ENCODING: "gzip"}, stream, ) result = await obj.read(decode=True) assert b"Time to Relax!" == result async def test_read_with_content_encoding_deflate(self) -> None: data = b"\x0b\xc9\xccMU(\xc9W\x08J\xcdI\xacP\x04\x00" tail = b"%s--:--" % newline with Stream(data + tail) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_ENCODING: "deflate"}, stream, ) result = await obj.read(decode=True) assert b"Time to Relax!" == result async def test_read_with_content_encoding_identity(self) -> None: thing = ( b"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x0b\xc9\xccMU" b"(\xc9W\x08J\xcdI\xacP\x04\x00$\xfb\x9eV\x0e\x00\x00\x00" ) with Stream(thing + b"%s--:--" % newline) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_ENCODING: "identity"}, stream, ) result = await obj.read(decode=True) assert thing == result async def test_read_with_content_encoding_unknown(self) -> None: with Stream(b"\x0e4Time to Relax!%s--:--" % newline) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_ENCODING: "snappy"}, stream, ) with pytest.raises(RuntimeError): await obj.read(decode=True) async def test_read_with_content_transfer_encoding_base64(self) -> None: with Stream(b"VGltZSB0byBSZWxheCE=%s--:--" % newline) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TRANSFER_ENCODING: "base64"}, stream, ) result = await obj.read(decode=True) assert b"Time to Relax!" == result async def test_read_with_content_transfer_encoding_quoted_printable(self) -> None: with Stream( b"=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82," b" =D0=BC=D0=B8=D1=80!%s--:--" % newline ) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TRANSFER_ENCODING: "quoted-printable"}, stream, ) result = await obj.read(decode=True) expected = ( b"\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82," b" \xd0\xbc\xd0\xb8\xd1\x80!" ) assert result == expected @pytest.mark.parametrize("encoding", ("binary", "8bit", "7bit")) async def test_read_with_content_transfer_encoding_binary( self, encoding: str ) -> None: data = ( b"\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82," b" \xd0\xbc\xd0\xb8\xd1\x80!" ) with Stream(data + b"%s--:--" % newline) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TRANSFER_ENCODING: encoding}, stream, ) result = await obj.read(decode=True) assert data == result async def test_read_with_content_transfer_encoding_unknown(self) -> None: with Stream(b"\x0e4Time to Relax!%s--:--" % newline) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TRANSFER_ENCODING: "unknown"}, stream, ) with pytest.raises(RuntimeError): await obj.read(decode=True) async def test_read_text(self) -> None: with Stream(b"Hello, world!%s--:--" % newline) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {}, stream, ) result = await obj.text() assert "Hello, world!" == result async def test_read_text_default_encoding(self) -> None: data = "Привет, Мир!" tail = b"%s--:--" % newline with Stream(data.encode("utf-8") + tail) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {}, stream, ) result = await obj.text() assert data == result async def test_read_text_encoding(self) -> None: data = "Привет, Мир!" tail = b"%s--:--" % newline with Stream(data.encode("cp1251") + tail) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {}, stream, ) result = await obj.text(encoding="cp1251") assert data == result async def test_read_text_guess_encoding(self) -> None: data = "Привет, Мир!" tail = b"%s--:--" % newline with Stream(data.encode("cp1251") + tail) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "text/plain;charset=cp1251"}, stream, ) result = await obj.text() assert data == result async def test_read_text_compressed(self) -> None: data = b"\x0b\xc9\xccMU(\xc9W\x08J\xcdI\xacP\x04\x00" b"%s--:--" % newline with Stream(data) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_ENCODING: "deflate", CONTENT_TYPE: "text/plain"}, stream, ) result = await obj.text() assert "Time to Relax!" == result async def test_read_text_while_closed(self) -> None: with Stream(b"") as stream: obj = aiohttp.BodyPartReader(BOUNDARY, {CONTENT_TYPE: "text/plain"}, stream) obj._at_eof = True result = await obj.text() assert "" == result async def test_read_json(self) -> None: with Stream(b'{"test": "passed"}%s--:--' % newline) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/json"}, stream, ) result = await obj.json() assert {"test": "passed"} == result async def test_read_json_encoding(self) -> None: data = '{"тест": "пассед"}'.encode("cp1251") tail = b"%s--:--" % newline with Stream(data + tail) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/json"}, stream, ) result = await obj.json(encoding="cp1251") assert {"тест": "пассед"} == result async def test_read_json_guess_encoding(self) -> None: data = '{"тест": "пассед"}'.encode("cp1251") tail = b"%s--:--" % newline with Stream(data + tail) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/json; charset=cp1251"}, stream, ) result = await obj.json() assert {"тест": "пассед"} == result async def test_read_json_compressed(self) -> None: with Stream( b"\xabV*I-.Q\xb2RP*H,.NMQ\xaa\x05\x00" b"%s--:--" % newline ) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_ENCODING: "deflate", CONTENT_TYPE: "application/json"}, stream, ) result = await obj.json() assert {"test": "passed"} == result async def test_read_json_while_closed(self) -> None: with Stream(b"") as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/json"}, stream ) obj._at_eof = True result = await obj.json() assert result is None async def test_read_form(self) -> None: data = b"foo=bar&foo=baz&boo=%s--:--" % newline with Stream(data) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/x-www-form-urlencoded"}, stream, ) result = await obj.form() assert [("foo", "bar"), ("foo", "baz"), ("boo", "")] == result async def test_read_form_invalid_utf8(self) -> None: invalid_unicode_byte = b"\xff" data = invalid_unicode_byte + b"%s--:--" % newline with Stream(data) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/x-www-form-urlencoded"}, stream, ) with pytest.raises( ValueError, match="data cannot be decoded with utf-8 encoding" ): await obj.form() async def test_read_form_encoding(self) -> None: data = b"foo=bar&foo=baz&boo=%s--:--" % newline with Stream(data) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/x-www-form-urlencoded"}, stream, ) result = await obj.form(encoding="cp1251") assert [("foo", "bar"), ("foo", "baz"), ("boo", "")] == result async def test_read_form_guess_encoding(self) -> None: data = b"foo=bar&foo=baz&boo=%s--:--" % newline with Stream(data) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/x-www-form-urlencoded; charset=utf-8"}, stream, ) result = await obj.form() assert [("foo", "bar"), ("foo", "baz"), ("boo", "")] == result async def test_read_form_while_closed(self) -> None: with Stream(b"") as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/x-www-form-urlencoded"}, stream, ) obj._at_eof = True result = await obj.form() assert not result async def test_readline(self) -> None: data = b"Hello\n,\r\nworld!%s--:--" % newline with Stream(data) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {}, stream, ) result = await obj.readline() assert b"Hello\n" == result result = await obj.readline() assert b",\r\n" == result result = await obj.readline() assert b"world!" == result result = await obj.readline() assert b"" == result assert obj.at_eof() async def test_release(self) -> None: data = b"Hello,%s--:\r\n\r\nworld!%s--:--" % (newline, newline) with Stream(data) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {}, stream, ) remained = b"--:\r\n\r\nworld!%s--:--" % newline await obj.release() assert obj.at_eof() assert remained == stream.content.read() async def test_release_respects_content_length(self) -> None: with Stream(b"." * 100500 + b"%s--:--" % newline) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {"CONTENT-LENGTH": 100500}, stream, ) result = await obj.release() assert result is None assert obj.at_eof() async def test_release_release(self) -> None: data = b"Hello,%s--:\r\n\r\nworld!%s--:--" % (newline, newline) remained = b"--:\r\n\r\nworld!%s--:--" % newline with Stream(data) as stream: obj = aiohttp.BodyPartReader( BOUNDARY, {}, stream, ) await obj.release() await obj.release() assert remained == stream.content.read() async def test_filename(self) -> None: part = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_DISPOSITION: "attachment; filename=foo.html"}, None ) assert "foo.html" == part.filename async def test_reading_long_part(self) -> None: size = 2 * 2**16 protocol = mock.Mock(_reading_paused=False) stream = StreamReader(protocol, 2**16, loop=asyncio.get_event_loop()) stream.feed_data(b"0" * size + b"\r\n--:--") stream.feed_eof() obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) data = await obj.read() assert len(data) == size class TestMultipartReader: def test_from_response(self) -> None: with Stream(b"--:%s\r\nhello%s--:--" % (newline, newline)) as stream: resp = Response( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, stream, ) res = aiohttp.MultipartReader.from_response(resp) assert isinstance(res, MultipartResponseWrapper) assert isinstance(res.stream, aiohttp.MultipartReader) def test_bad_boundary(self) -> None: with Stream(b"") as stream: resp = Response( {CONTENT_TYPE: "multipart/related;boundary=" + "a" * 80}, stream ) with pytest.raises(ValueError): aiohttp.MultipartReader.from_response(resp) def test_dispatch(self) -> None: with Stream(b"--:%s\r\necho%s--:--" % (newline, newline)) as stream: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, stream, ) res = reader._get_part_reader({CONTENT_TYPE: "text/plain"}) assert isinstance(res, reader.part_reader_cls) def test_dispatch_bodypart(self) -> None: with Stream(b"--:%s\r\necho%s--:--" % (newline, newline)) as stream: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, stream, ) res = reader._get_part_reader({CONTENT_TYPE: "text/plain"}) assert isinstance(res, reader.part_reader_cls) def test_dispatch_multipart(self) -> None: with Stream( newline.join( [ b"----:--", b"", b"test", b"----:--", b"", b"passed", b"----:----" b"--:--", ] ) ) as stream: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, stream, ) res = reader._get_part_reader( {CONTENT_TYPE: "multipart/related;boundary=--:--"} ) assert isinstance(res, reader.__class__) def test_dispatch_custom_multipart_reader(self) -> None: class CustomReader(aiohttp.MultipartReader): pass reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, Stream( b"----:--\r\n" b"\r\n" b"test\r\n" b"----:--\r\n" b"\r\n" b"passed\r\n" b"----:----\r\n" b"--:--" ), ) reader.multipart_reader_cls = CustomReader res = reader._get_part_reader( {CONTENT_TYPE: "multipart/related;boundary=--:--"} ) assert isinstance(res, CustomReader) async def test_emit_next(self) -> None: with Stream(b"--:%s\r\necho%s--:--" % (newline, newline)) as stream: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, stream, ) res = await reader.next() assert isinstance(res, reader.part_reader_cls) async def test_invalid_boundary(self) -> None: with Stream(b"---:%s\r\necho%s---:--" % (newline, newline)) as stream: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, stream, ) with pytest.raises(ValueError): await reader.next() async def test_release(self) -> None: with Stream( newline.join( [ b"--:", b"Content-Type: multipart/related;boundary=--:--", b"", b"----:--", b"", b"test", b"----:--", b"", b"passed", b"----:----", b"", b"--:--", ] ) ) as stream: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/mixed;boundary=":"'}, stream, ) await reader.release() assert reader.at_eof() async def test_release_release(self) -> None: with Stream(b"--:%s\r\necho%s--:--" % (newline, newline)) as stream: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, stream, ) await reader.release() assert reader.at_eof() await reader.release() assert reader.at_eof() async def test_release_next(self) -> None: with Stream(b"--:%s\r\necho%s--:--" % (newline, newline)) as stream: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, stream, ) await reader.release() assert reader.at_eof() res = await reader.next() assert res is None async def test_second_next_releases_previous_object(self) -> None: with Stream( newline.join( [ b"--:", b"", b"test", b"--:", b"", b"passed", b"--:--", ] ) ) as stream: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, stream, ) first = await reader.next() assert isinstance(first, aiohttp.BodyPartReader) second = await reader.next() assert first.at_eof() assert not second.at_eof() async def test_release_without_read_the_last_object(self) -> None: with Stream( newline.join( [ b"--:", b"", b"test", b"--:", b"", b"passed", b"--:--", ] ) ) as stream: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, stream, ) first = await reader.next() second = await reader.next() third = await reader.next() assert first.at_eof() assert second.at_eof() assert second.at_eof() assert third is None async def test_read_chunk_by_length_doesnt_breaks_reader(self) -> None: with Stream( newline.join( [ b"--:", b"Content-Length: 4", b"", b"test", b"--:", b"Content-Length: 6", b"", b"passed", b"--:--", ] ) ) as stream: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, stream, ) body_parts = [] while True: read_part = b"" part = await reader.next() if part is None: break while not part.at_eof(): read_part += await part.read_chunk(3) body_parts.append(read_part) assert body_parts == [b"test", b"passed"] async def test_read_chunk_from_stream_doesnt_breaks_reader(self) -> None: with Stream( newline.join( [ b"--:", b"", b"chunk", b"--:", b"", b"two_chunks", b"--:--", ] ) ) as stream: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, stream, ) body_parts = [] while True: read_part = b"" part = await reader.next() if part is None: break while not part.at_eof(): chunk = await part.read_chunk(5) assert chunk read_part += chunk body_parts.append(read_part) assert body_parts == [b"chunk", b"two_chunks"] async def test_reading_skips_prelude(self) -> None: with Stream( newline.join( [ b"Multi-part data is not supported.", b"", b"--:", b"", b"test", b"--:", b"", b"passed", b"--:--", ] ) ) as stream: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, stream, ) first = await reader.next() assert isinstance(first, aiohttp.BodyPartReader) second = await reader.next() assert first.at_eof() assert not second.at_eof() async def test_read_form_default_encoding(self) -> None: with Stream( b"--:\r\n" b'Content-Disposition: form-data; name="_charset_"\r\n\r\n' b"ascii" b"\r\n" b"--:\r\n" b'Content-Disposition: form-data; name="field1"\r\n\r\n' b"foo" b"\r\n" b"--:\r\n" b"Content-Type: text/plain;charset=UTF-8\r\n" b'Content-Disposition: form-data; name="field2"\r\n\r\n' b"foo" b"\r\n" b"--:\r\n" b'Content-Disposition: form-data; name="field3"\r\n\r\n' b"foo" b"\r\n" ) as stream: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/form-data;boundary=":"'}, stream, ) field1 = await reader.next() assert field1.name == "field1" assert field1.get_charset("default") == "ascii" field2 = await reader.next() assert field2.name == "field2" assert field2.get_charset("default") == "UTF-8" field3 = await reader.next() assert field3.name == "field3" assert field3.get_charset("default") == "ascii" async def test_read_form_invalid_default_encoding(self) -> None: with Stream( b"--:\r\n" b'Content-Disposition: form-data; name="_charset_"\r\n\r\n' b"this-value-is-too-long-to-be-a-charset" b"\r\n" b"--:\r\n" b'Content-Disposition: form-data; name="field1"\r\n\r\n' b"foo" b"\r\n" ) as stream: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/form-data;boundary=":"'}, stream, ) with pytest.raises(RuntimeError, match="Invalid default charset"): await reader.next() async def test_writer(writer) -> None: assert writer.size == 7 assert writer.boundary == ":" async def test_writer_serialize_io_chunk(buf, stream, writer) -> None: with io.BytesIO(b"foobarbaz") as file_handle: writer.append(file_handle) await writer.write(stream) assert ( buf == b"--:\r\nContent-Type: application/octet-stream" b"\r\nContent-Length: 9\r\n\r\nfoobarbaz\r\n--:--\r\n" ) async def test_writer_serialize_json(buf, stream, writer) -> None: writer.append_json({"привет": "мир"}) await writer.write(stream) assert ( b'{"\\u043f\\u0440\\u0438\\u0432\\u0435\\u0442":' b' "\\u043c\\u0438\\u0440"}' in buf ) async def test_writer_serialize_form(buf, stream, writer) -> None: data = [("foo", "bar"), ("foo", "baz"), ("boo", "zoo")] writer.append_form(data) await writer.write(stream) assert b"foo=bar&foo=baz&boo=zoo" in buf async def test_writer_serialize_form_dict(buf, stream, writer) -> None: data = {"hello": "мир"} writer.append_form(data) await writer.write(stream) assert b"hello=%D0%BC%D0%B8%D1%80" in buf async def test_writer_write(buf, stream, writer) -> None: writer.append("foo-bar-baz") writer.append_json({"test": "passed"}) writer.append_form({"test": "passed"}) writer.append_form([("one", 1), ("two", 2)]) sub_multipart = aiohttp.MultipartWriter(boundary="::") sub_multipart.append("nested content") sub_multipart.headers["X-CUSTOM"] = "test" writer.append(sub_multipart) await writer.write(stream) assert ( b"--:\r\n" b"Content-Type: text/plain; charset=utf-8\r\n" b"Content-Length: 11\r\n\r\n" b"foo-bar-baz" b"\r\n" b"--:\r\n" b"Content-Type: application/json\r\n" b"Content-Length: 18\r\n\r\n" b'{"test": "passed"}' b"\r\n" b"--:\r\n" b"Content-Type: application/x-www-form-urlencoded\r\n" b"Content-Length: 11\r\n\r\n" b"test=passed" b"\r\n" b"--:\r\n" b"Content-Type: application/x-www-form-urlencoded\r\n" b"Content-Length: 11\r\n\r\n" b"one=1&two=2" b"\r\n" b"--:\r\n" b'Content-Type: multipart/mixed; boundary="::"\r\n' b"X-CUSTOM: test\r\nContent-Length: 93\r\n\r\n" b"--::\r\n" b"Content-Type: text/plain; charset=utf-8\r\n" b"Content-Length: 14\r\n\r\n" b"nested content\r\n" b"--::--\r\n" b"\r\n" b"--:--\r\n" ) == bytes(buf) async def test_writer_write_no_close_boundary(buf, stream) -> None: writer = aiohttp.MultipartWriter(boundary=":") writer.append("foo-bar-baz") writer.append_json({"test": "passed"}) writer.append_form({"test": "passed"}) writer.append_form([("one", 1), ("two", 2)]) await writer.write(stream, close_boundary=False) assert ( b"--:\r\n" b"Content-Type: text/plain; charset=utf-8\r\n" b"Content-Length: 11\r\n\r\n" b"foo-bar-baz" b"\r\n" b"--:\r\n" b"Content-Type: application/json\r\n" b"Content-Length: 18\r\n\r\n" b'{"test": "passed"}' b"\r\n" b"--:\r\n" b"Content-Type: application/x-www-form-urlencoded\r\n" b"Content-Length: 11\r\n\r\n" b"test=passed" b"\r\n" b"--:\r\n" b"Content-Type: application/x-www-form-urlencoded\r\n" b"Content-Length: 11\r\n\r\n" b"one=1&two=2" b"\r\n" ) == bytes(buf) async def test_writer_write_no_parts(buf, stream, writer) -> None: await writer.write(stream) assert b"--:--\r\n" == bytes(buf) async def test_writer_serialize_with_content_encoding_gzip(buf, stream, writer): writer.append("Time to Relax!", {CONTENT_ENCODING: "gzip"}) await writer.write(stream) headers, message = bytes(buf).split(b"\r\n\r\n", 1) assert ( b"--:\r\nContent-Type: text/plain; charset=utf-8\r\n" b"Content-Encoding: gzip" == headers ) decompressor = zlib.decompressobj(wbits=16 + zlib.MAX_WBITS) data = decompressor.decompress(message.split(b"\r\n")[0]) data += decompressor.flush() assert b"Time to Relax!" == data async def test_writer_serialize_with_content_encoding_deflate(buf, stream, writer): writer.append("Time to Relax!", {CONTENT_ENCODING: "deflate"}) await writer.write(stream) headers, message = bytes(buf).split(b"\r\n\r\n", 1) assert ( b"--:\r\nContent-Type: text/plain; charset=utf-8\r\n" b"Content-Encoding: deflate" == headers ) thing = b"\x0b\xc9\xccMU(\xc9W\x08J\xcdI\xacP\x04\x00\r\n--:--\r\n" assert thing == message async def test_writer_serialize_with_content_encoding_identity(buf, stream, writer): thing = b"\x0b\xc9\xccMU(\xc9W\x08J\xcdI\xacP\x04\x00" writer.append(thing, {CONTENT_ENCODING: "identity"}) await writer.write(stream) headers, message = bytes(buf).split(b"\r\n\r\n", 1) assert ( b"--:\r\nContent-Type: application/octet-stream\r\n" b"Content-Encoding: identity\r\n" b"Content-Length: 16" == headers ) assert thing == message.split(b"\r\n")[0] def test_writer_serialize_with_content_encoding_unknown(buf, stream, writer): with pytest.raises(RuntimeError): writer.append("Time to Relax!", {CONTENT_ENCODING: "snappy"}) async def test_writer_with_content_transfer_encoding_base64(buf, stream, writer): writer.append("Time to Relax!", {CONTENT_TRANSFER_ENCODING: "base64"}) await writer.write(stream) headers, message = bytes(buf).split(b"\r\n\r\n", 1) assert ( b"--:\r\nContent-Type: text/plain; charset=utf-8\r\n" b"Content-Transfer-Encoding: base64" == headers ) assert b"VGltZSB0byBSZWxheCE=" == message.split(b"\r\n")[0] async def test_writer_content_transfer_encoding_quote_printable(buf, stream, writer): writer.append("Привет, мир!", {CONTENT_TRANSFER_ENCODING: "quoted-printable"}) await writer.write(stream) headers, message = bytes(buf).split(b"\r\n\r\n", 1) assert ( b"--:\r\nContent-Type: text/plain; charset=utf-8\r\n" b"Content-Transfer-Encoding: quoted-printable" == headers ) assert ( b"=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82," b" =D0=BC=D0=B8=D1=80!" == message.split(b"\r\n")[0] ) def test_writer_content_transfer_encoding_unknown(buf, stream, writer) -> None: with pytest.raises(RuntimeError): writer.append("Time to Relax!", {CONTENT_TRANSFER_ENCODING: "unknown"}) class TestMultipartWriter: def test_default_subtype(self, writer) -> None: mimetype = parse_mimetype(writer.headers.get(CONTENT_TYPE)) assert "multipart" == mimetype.type assert "mixed" == mimetype.subtype def test_unquoted_boundary(self) -> None: writer = aiohttp.MultipartWriter(boundary="abc123") expected = {CONTENT_TYPE: "multipart/mixed; boundary=abc123"} assert expected == writer.headers def test_quoted_boundary(self) -> None: writer = aiohttp.MultipartWriter(boundary=R"\"") expected = {CONTENT_TYPE: R'multipart/mixed; boundary="\\\""'} assert expected == writer.headers def test_bad_boundary(self) -> None: with pytest.raises(ValueError): aiohttp.MultipartWriter(boundary="тест") with pytest.raises(ValueError): aiohttp.MultipartWriter(boundary="test\n") def test_default_headers(self, writer) -> None: expected = {CONTENT_TYPE: 'multipart/mixed; boundary=":"'} assert expected == writer.headers def test_iter_parts(self, writer) -> None: writer.append("foo") writer.append("bar") writer.append("baz") assert 3 == len(list(writer)) def test_append(self, writer) -> None: assert 0 == len(writer) writer.append("hello, world!") assert 1 == len(writer) assert isinstance(writer._parts[0][0], payload.Payload) def test_append_with_headers(self, writer) -> None: writer.append("hello, world!", {"x-foo": "bar"}) assert 1 == len(writer) assert "x-foo" in writer._parts[0][0].headers assert writer._parts[0][0].headers["x-foo"] == "bar" def test_append_json(self, writer) -> None: writer.append_json({"foo": "bar"}) assert 1 == len(writer) part = writer._parts[0][0] assert part.headers[CONTENT_TYPE] == "application/json" def test_append_part(self, writer) -> None: part = payload.get_payload("test", headers={CONTENT_TYPE: "text/plain"}) writer.append(part, {CONTENT_TYPE: "test/passed"}) assert 1 == len(writer) part = writer._parts[0][0] assert part.headers[CONTENT_TYPE] == "test/passed" def test_append_json_overrides_content_type(self, writer) -> None: writer.append_json({"foo": "bar"}, {CONTENT_TYPE: "test/passed"}) assert 1 == len(writer) part = writer._parts[0][0] assert part.headers[CONTENT_TYPE] == "test/passed" def test_append_form(self, writer) -> None: writer.append_form({"foo": "bar"}, {CONTENT_TYPE: "test/passed"}) assert 1 == len(writer) part = writer._parts[0][0] assert part.headers[CONTENT_TYPE] == "test/passed" def test_append_multipart(self, writer) -> None: subwriter = aiohttp.MultipartWriter(boundary=":") subwriter.append_json({"foo": "bar"}) writer.append(subwriter, {CONTENT_TYPE: "test/passed"}) assert 1 == len(writer) part = writer._parts[0][0] assert part.headers[CONTENT_TYPE] == "test/passed" def test_set_content_disposition_after_append(self): writer = aiohttp.MultipartWriter("form-data") part = writer.append("some-data") part.set_content_disposition("form-data", name="method") assert 'name="method"' in part.headers[CONTENT_DISPOSITION] def test_automatic_content_disposition(self): writer = aiohttp.MultipartWriter("form-data") writer.append_json(()) part = payload.StringPayload("foo") part.set_content_disposition("form-data", name="second") writer.append_payload(part) writer.append("foo") disps = tuple(p[0].headers[CONTENT_DISPOSITION] for p in writer._parts) assert 'name="section-0"' in disps[0] assert 'name="second"' in disps[1] assert 'name="section-2"' in disps[2] def test_with(self) -> None: with aiohttp.MultipartWriter(boundary=":") as writer: writer.append("foo") writer.append(b"bar") writer.append_json({"baz": True}) assert 3 == len(writer) def test_append_int_not_allowed(self) -> None: with pytest.raises(TypeError): with aiohttp.MultipartWriter(boundary=":") as writer: writer.append(1) def test_append_float_not_allowed(self) -> None: with pytest.raises(TypeError): with aiohttp.MultipartWriter(boundary=":") as writer: writer.append(1.1) def test_append_none_not_allowed(self) -> None: with pytest.raises(TypeError): with aiohttp.MultipartWriter(boundary=":") as writer: writer.append(None) async def test_write_preserves_content_disposition(self, buf, stream) -> None: with aiohttp.MultipartWriter(boundary=":") as writer: part = writer.append(b"foo", headers={CONTENT_TYPE: "test/passed"}) part.set_content_disposition("form-data", filename="bug") await writer.write(stream) headers, message = bytes(buf).split(b"\r\n\r\n", 1) assert headers == ( b"--:\r\n" b"Content-Type: test/passed\r\n" b"Content-Length: 3\r\n" b"Content-Disposition:" b' form-data; filename="bug"' ) assert message == b"foo\r\n--:--\r\n" async def test_preserve_content_disposition_header(self, buf, stream): # https://github.com/aio-libs/aiohttp/pull/3475#issuecomment-451072381 with pathlib.Path(__file__).open("rb") as fobj: with aiohttp.MultipartWriter("form-data", boundary=":") as writer: part = writer.append( fobj, headers={ CONTENT_DISPOSITION: 'attachments; filename="bug.py"', CONTENT_TYPE: "text/python", }, ) await writer.write(stream) assert part.headers[CONTENT_TYPE] == "text/python" assert part.headers[CONTENT_DISPOSITION] == ('attachments; filename="bug.py"') headers, _ = bytes(buf).split(b"\r\n\r\n", 1) assert headers == ( b"--:\r\n" b"Content-Type: text/python\r\n" b'Content-Disposition: attachments; filename="bug.py"' ) async def test_set_content_disposition_override(self, buf, stream): # https://github.com/aio-libs/aiohttp/pull/3475#issuecomment-451072381 with pathlib.Path(__file__).open("rb") as fobj: with aiohttp.MultipartWriter("form-data", boundary=":") as writer: part = writer.append( fobj, headers={ CONTENT_DISPOSITION: 'attachments; filename="bug.py"', CONTENT_TYPE: "text/python", }, ) await writer.write(stream) assert part.headers[CONTENT_TYPE] == "text/python" assert part.headers[CONTENT_DISPOSITION] == ('attachments; filename="bug.py"') headers, _ = bytes(buf).split(b"\r\n\r\n", 1) assert headers == ( b"--:\r\n" b"Content-Type: text/python\r\n" b'Content-Disposition: attachments; filename="bug.py"' ) async def test_reset_content_disposition_header(self, buf, stream): # https://github.com/aio-libs/aiohttp/pull/3475#issuecomment-451072381 with pathlib.Path(__file__).open("rb") as fobj: with aiohttp.MultipartWriter("form-data", boundary=":") as writer: part = writer.append( fobj, headers={CONTENT_TYPE: "text/plain"}, ) assert CONTENT_DISPOSITION in part.headers part.set_content_disposition("attachments", filename="bug.py") await writer.write(stream) headers, _ = bytes(buf).split(b"\r\n\r\n", 1) assert headers == ( b"--:\r\n" b"Content-Type: text/plain\r\n" b"Content-Disposition:" b' attachments; filename="bug.py"' ) async def test_async_for_reader() -> None: data = [{"test": "passed"}, 42, b"plain text", b"aiohttp\n", b"no epilogue"] with Stream( b"\r\n".join( [ b"--:", b"Content-Type: application/json", b"", json.dumps(data[0]).encode(), b"--:", b"Content-Type: application/json", b"", json.dumps(data[1]).encode(), b"--:", b'Content-Type: multipart/related; boundary="::"', b"", b"--::", b"Content-Type: text/plain", b"", data[2], b"--::", b'Content-Disposition: attachment; filename="aiohttp"', b"Content-Type: text/plain", b"Content-Length: 28", b"Content-Encoding: gzip", b"", b"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03K\xcc\xcc\xcf())" b"\xe0\x02\x00\xd6\x90\xe2O\x08\x00\x00\x00", b"--::", b'Content-Type: multipart/related; boundary=":::"', b"", b"--:::", b"Content-Type: text/plain", b"", data[4], b"--:::--", b"--::--", b"", b"--:--", b"", ] ) ) as stream: reader = aiohttp.MultipartReader( headers={CONTENT_TYPE: 'multipart/mixed; boundary=":"'}, content=stream, ) idata = iter(data) async def check(reader): async for part in reader: if isinstance(part, aiohttp.BodyPartReader): if part.headers[CONTENT_TYPE] == "application/json": assert next(idata) == (await part.json()) else: assert next(idata) == await part.read(decode=True) else: await check(part) await check(reader) async def test_async_for_bodypart() -> None: with Stream(b"foobarbaz\r\n--:--") as stream: part = aiohttp.BodyPartReader(boundary=b"--:", headers={}, content=stream) async for data in part: assert data == b"foobarbaz" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_multipart_helpers.py0000644000175100001770000006563414607525266021156 0ustar00runnerdockerimport pytest import aiohttp from aiohttp import content_disposition_filename, parse_content_disposition class TestParseContentDisposition: # http://greenbytes.de/tech/tc2231/ def test_parse_empty(self) -> None: disptype, params = parse_content_disposition(None) assert disptype is None assert {} == params def test_inlonly(self) -> None: disptype, params = parse_content_disposition("inline") assert "inline" == disptype assert {} == params def test_inlonlyquoted(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition('"inline"') assert disptype is None assert {} == params def test_semicolon(self) -> None: disptype, params = parse_content_disposition( 'form-data; name="data"; filename="file ; name.mp4"' ) assert disptype == "form-data" assert params == {"name": "data", "filename": "file ; name.mp4"} def test_inlwithasciifilename(self) -> None: disptype, params = parse_content_disposition('inline; filename="foo.html"') assert "inline" == disptype assert {"filename": "foo.html"} == params def test_inlwithfnattach(self) -> None: disptype, params = parse_content_disposition( 'inline; filename="Not an attachment!"' ) assert "inline" == disptype assert {"filename": "Not an attachment!"} == params def test_attonly(self) -> None: disptype, params = parse_content_disposition("attachment") assert "attachment" == disptype assert {} == params def test_attonlyquoted(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition('"attachment"') assert disptype is None assert {} == params def test_attonlyucase(self) -> None: disptype, params = parse_content_disposition("ATTACHMENT") assert "attachment" == disptype assert {} == params def test_attwithasciifilename(self) -> None: disptype, params = parse_content_disposition('attachment; filename="foo.html"') assert "attachment" == disptype assert {"filename": "foo.html"} == params def test_inlwithasciifilenamepdf(self) -> None: disptype, params = parse_content_disposition('attachment; filename="foo.pdf"') assert "attachment" == disptype assert {"filename": "foo.pdf"} == params def test_attwithasciifilename25(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="0000000000111111111122222"' ) assert "attachment" == disptype assert {"filename": "0000000000111111111122222"} == params def test_attwithasciifilename35(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="00000000001111111111222222222233333"' ) assert "attachment" == disptype assert {"filename": "00000000001111111111222222222233333"} == params def test_attwithasciifnescapedchar(self) -> None: disptype, params = parse_content_disposition( r'attachment; filename="f\oo.html"' ) assert "attachment" == disptype assert {"filename": "foo.html"} == params def test_attwithasciifnescapedquote(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename=""quoting" tested.html"' ) assert "attachment" == disptype assert {"filename": '"quoting" tested.html'} == params @pytest.mark.skip("need more smart parser which respects quoted text") def test_attwithquotedsemicolon(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="Here\'s a semicolon;.html"' ) assert "attachment" == disptype assert {"filename": "Here's a semicolon;.html"} == params def test_attwithfilenameandextparam(self) -> None: disptype, params = parse_content_disposition( 'attachment; foo="bar"; filename="foo.html"' ) assert "attachment" == disptype assert {"filename": "foo.html", "foo": "bar"} == params def test_attwithfilenameandextparamescaped(self) -> None: disptype, params = parse_content_disposition( 'attachment; foo=""\\";filename="foo.html"' ) assert "attachment" == disptype assert {"filename": "foo.html", "foo": '"\\'} == params def test_attwithasciifilenameucase(self) -> None: disptype, params = parse_content_disposition('attachment; FILENAME="foo.html"') assert "attachment" == disptype assert {"filename": "foo.html"} == params def test_attwithasciifilenamenq(self) -> None: disptype, params = parse_content_disposition("attachment; filename=foo.html") assert "attachment" == disptype assert {"filename": "foo.html"} == params def test_attwithtokfncommanq(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename=foo,bar.html" ) assert disptype is None assert {} == params def test_attwithasciifilenamenqs(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename=foo.html ;" ) assert disptype is None assert {} == params def test_attemptyparam(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition("attachment; ;filename=foo") assert disptype is None assert {} == params def test_attwithasciifilenamenqws(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename=foo bar.html" ) assert disptype is None assert {} == params def test_attwithfntokensq(self) -> None: disptype, params = parse_content_disposition("attachment; filename='foo.html'") assert "attachment" == disptype assert {"filename": "'foo.html'"} == params def test_attwithisofnplain(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="foo-ä.html"' ) assert "attachment" == disptype assert {"filename": "foo-ä.html"} == params def test_attwithutf8fnplain(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="foo-ä.html"' ) assert "attachment" == disptype assert {"filename": "foo-ä.html"} == params def test_attwithfnrawpctenca(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="foo-%41.html"' ) assert "attachment" == disptype assert {"filename": "foo-%41.html"} == params def test_attwithfnusingpct(self) -> None: disptype, params = parse_content_disposition('attachment; filename="50%.html"') assert "attachment" == disptype assert {"filename": "50%.html"} == params def test_attwithfnrawpctencaq(self) -> None: disptype, params = parse_content_disposition( r'attachment; filename="foo-%\41.html"' ) assert "attachment" == disptype assert {"filename": r"foo-%41.html"} == params def test_attwithnamepct(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="foo-%41.html"' ) assert "attachment" == disptype assert {"filename": "foo-%41.html"} == params def test_attwithfilenamepctandiso(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="ä-%41.html"' ) assert "attachment" == disptype assert {"filename": "ä-%41.html"} == params def test_attwithfnrawpctenclong(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="foo-%c3%a4-%e2%82%ac.html"' ) assert "attachment" == disptype assert {"filename": "foo-%c3%a4-%e2%82%ac.html"} == params def test_attwithasciifilenamews1(self) -> None: disptype, params = parse_content_disposition('attachment; filename ="foo.html"') assert "attachment" == disptype assert {"filename": "foo.html"} == params def test_attwith2filenames(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( 'attachment; filename="foo.html"; filename="bar.html"' ) assert disptype is None assert {} == params def test_attfnbrokentoken(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename=foo[1](2).html" ) assert disptype is None assert {} == params def test_attfnbrokentokeniso(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename=foo-ä.html" ) assert disptype is None assert {} == params def test_attfnbrokentokenutf(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename=foo-ä.html" ) assert disptype is None assert {} == params def test_attmissingdisposition(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition("filename=foo.html") assert disptype is None assert {} == params def test_attmissingdisposition2(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition("x=y; filename=foo.html") assert disptype is None assert {} == params def test_attmissingdisposition3(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( '"foo; filename=bar;baz"; filename=qux' ) assert disptype is None assert {} == params def test_attmissingdisposition4(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "filename=foo.html, filename=bar.html" ) assert disptype is None assert {} == params def test_emptydisposition(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition("; filename=foo.html") assert disptype is None assert {} == params def test_doublecolon(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( ": inline; attachment; filename=foo.html" ) assert disptype is None assert {} == params def test_attandinline(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "inline; attachment; filename=foo.html" ) assert disptype is None assert {} == params def test_attandinline2(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; inline; filename=foo.html" ) assert disptype is None assert {} == params def test_attbrokenquotedfn(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( 'attachment; filename="foo.html".txt' ) assert disptype is None assert {} == params def test_attbrokenquotedfn2(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition('attachment; filename="bar') assert disptype is None assert {} == params def test_attbrokenquotedfn3(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( 'attachment; filename=foo"bar;baz"qux' ) assert disptype is None assert {} == params def test_attmultinstances(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename=foo.html, attachment; filename=bar.html" ) assert disptype is None assert {} == params def test_attmissingdelim(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; foo=foo filename=bar" ) assert disptype is None assert {} == params def test_attmissingdelim2(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename=bar foo=foo" ) assert disptype is None assert {} == params def test_attmissingdelim3(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition("attachment filename=bar") assert disptype is None assert {} == params def test_attreversed(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "filename=foo.html; attachment" ) assert disptype is None assert {} == params def test_attconfusedparam(self) -> None: disptype, params = parse_content_disposition("attachment; xfilename=foo.html") assert "attachment" == disptype assert {"xfilename": "foo.html"} == params def test_attabspath(self) -> None: disptype, params = parse_content_disposition('attachment; filename="/foo.html"') assert "attachment" == disptype assert {"filename": "foo.html"} == params def test_attabspathwin(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="\\foo.html"' ) assert "attachment" == disptype assert {"filename": "foo.html"} == params def test_attcdate(self) -> None: disptype, params = parse_content_disposition( 'attachment; creation-date="Wed, 12 Feb 1997 16:29:51 -0500"' ) assert "attachment" == disptype assert {"creation-date": "Wed, 12 Feb 1997 16:29:51 -0500"} == params def test_attmdate(self) -> None: disptype, params = parse_content_disposition( 'attachment; modification-date="Wed, 12 Feb 1997 16:29:51 -0500"' ) assert "attachment" == disptype assert {"modification-date": "Wed, 12 Feb 1997 16:29:51 -0500"} == params def test_dispext(self) -> None: disptype, params = parse_content_disposition("foobar") assert "foobar" == disptype assert {} == params def test_dispextbadfn(self) -> None: disptype, params = parse_content_disposition( 'attachment; example="filename=example.txt"' ) assert "attachment" == disptype assert {"example": "filename=example.txt"} == params def test_attwithisofn2231iso(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*=iso-8859-1''foo-%E4.html" ) assert "attachment" == disptype assert {"filename*": "foo-ä.html"} == params def test_attwithfn2231utf8(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*=UTF-8''foo-%c3%a4-%e2%82%ac.html" ) assert "attachment" == disptype assert {"filename*": "foo-ä-€.html"} == params def test_attwithfn2231noc(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*=''foo-%c3%a4-%e2%82%ac.html" ) assert "attachment" == disptype assert {"filename*": "foo-ä-€.html"} == params def test_attwithfn2231utf8comp(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*=UTF-8''foo-a%cc%88.html" ) assert "attachment" == disptype assert {"filename*": "foo-ä.html"} == params @pytest.mark.skip("should raise decoding error: %82 is invalid for latin1") def test_attwithfn2231utf8_bad(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( "attachment; filename*=iso-8859-1''foo-%c3%a4-%e2%82%ac.html" ) assert "attachment" == disptype assert {} == params @pytest.mark.skip("should raise decoding error: %E4 is invalid for utf-8") def test_attwithfn2231iso_bad(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( "attachment; filename*=utf-8''foo-%E4.html" ) assert "attachment" == disptype assert {} == params def test_attwithfn2231ws1(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( "attachment; filename *=UTF-8''foo-%c3%a4.html" ) assert "attachment" == disptype assert {} == params def test_attwithfn2231ws2(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*= UTF-8''foo-%c3%a4.html" ) assert "attachment" == disptype assert {"filename*": "foo-ä.html"} == params def test_attwithfn2231ws3(self) -> None: disptype, params = parse_content_disposition( "attachment; filename* =UTF-8''foo-%c3%a4.html" ) assert "attachment" == disptype assert {"filename*": "foo-ä.html"} == params def test_attwithfn2231quot(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( "attachment; filename*=\"UTF-8''foo-%c3%a4.html\"" ) assert "attachment" == disptype assert {} == params def test_attwithfn2231quot2(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( 'attachment; filename*="foo%20bar.html"' ) assert "attachment" == disptype assert {} == params def test_attwithfn2231singleqmissing(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( "attachment; filename*=UTF-8'foo-%c3%a4.html" ) assert "attachment" == disptype assert {} == params @pytest.mark.skip("urllib.parse.unquote is tolerate to standalone % chars") def test_attwithfn2231nbadpct1(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( "attachment; filename*=UTF-8''foo%" ) assert "attachment" == disptype assert {} == params @pytest.mark.skip("urllib.parse.unquote is tolerate to standalone % chars") def test_attwithfn2231nbadpct2(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( "attachment; filename*=UTF-8''f%oo.html" ) assert "attachment" == disptype assert {} == params def test_attwithfn2231dpct(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*=UTF-8''A-%2541.html" ) assert "attachment" == disptype assert {"filename*": "A-%41.html"} == params def test_attwithfn2231abspathdisguised(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*=UTF-8''%5cfoo.html" ) assert "attachment" == disptype assert {"filename*": "\\foo.html"} == params def test_attfncont(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename*0="foo."; filename*1="html"' ) assert "attachment" == disptype assert {"filename*0": "foo.", "filename*1": "html"} == params def test_attfncontqs(self) -> None: disptype, params = parse_content_disposition( r'attachment; filename*0="foo"; filename*1="\b\a\r.html"' ) assert "attachment" == disptype assert {"filename*0": "foo", "filename*1": "bar.html"} == params def test_attfncontenc(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*0*=UTF-8" 'foo-%c3%a4; filename*1=".html"' ) assert "attachment" == disptype assert {"filename*0*": "UTF-8" "foo-%c3%a4", "filename*1": ".html"} == params def test_attfncontlz(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename*0="foo"; filename*01="bar"' ) assert "attachment" == disptype assert {"filename*0": "foo", "filename*01": "bar"} == params def test_attfncontnc(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename*0="foo"; filename*2="bar"' ) assert "attachment" == disptype assert {"filename*0": "foo", "filename*2": "bar"} == params def test_attfnconts1(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename*0="foo."; filename*2="html"' ) assert "attachment" == disptype assert {"filename*0": "foo.", "filename*2": "html"} == params def test_attfncontord(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename*1="bar"; filename*0="foo"' ) assert "attachment" == disptype assert {"filename*0": "foo", "filename*1": "bar"} == params def test_attfnboth(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="foo-ae.html";' " filename*=UTF-8''foo-%c3%a4.html" ) assert "attachment" == disptype assert {"filename": "foo-ae.html", "filename*": "foo-ä.html"} == params def test_attfnboth2(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*=UTF-8''foo-%c3%a4.html;" ' filename="foo-ae.html"' ) assert "attachment" == disptype assert {"filename": "foo-ae.html", "filename*": "foo-ä.html"} == params def test_attfnboth3(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*0*=ISO-8859-15''euro-sign%3d%a4;" " filename*=ISO-8859-1''currency-sign%3d%a4" ) assert "attachment" == disptype assert { "filename*": "currency-sign=¤", "filename*0*": "ISO-8859-15''euro-sign%3d%a4", } == params def test_attnewandfn(self) -> None: disptype, params = parse_content_disposition( 'attachment; foobar=x; filename="foo.html"' ) assert "attachment" == disptype assert {"foobar": "x", "filename": "foo.html"} == params def test_attrfc2047token(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename==?ISO-8859-1?Q?foo-=E4.html?=" ) assert disptype is None assert {} == params def test_attrfc2047quoted(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="=?ISO-8859-1?Q?foo-=E4.html?="' ) assert "attachment" == disptype assert {"filename": "=?ISO-8859-1?Q?foo-=E4.html?="} == params def test_bad_continuous_param(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( "attachment; filename*0=foo bar" ) assert "attachment" == disptype assert {} == params class TestContentDispositionFilename: # http://greenbytes.de/tech/tc2231/ def test_no_filename(self) -> None: assert content_disposition_filename({}) is None assert content_disposition_filename({"foo": "bar"}) is None def test_filename(self) -> None: params = {"filename": "foo.html"} assert "foo.html" == content_disposition_filename(params) def test_filename_ext(self) -> None: params = {"filename*": "файл.html"} assert "файл.html" == content_disposition_filename(params) def test_attfncont(self) -> None: params = {"filename*0": "foo.", "filename*1": "html"} assert "foo.html" == content_disposition_filename(params) def test_attfncontqs(self) -> None: params = {"filename*0": "foo", "filename*1": "bar.html"} assert "foobar.html" == content_disposition_filename(params) def test_attfncontenc(self) -> None: params = {"filename*0*": "UTF-8''foo-%c3%a4", "filename*1": ".html"} assert "foo-ä.html" == content_disposition_filename(params) def test_attfncontlz(self) -> None: params = {"filename*0": "foo", "filename*01": "bar"} assert "foo" == content_disposition_filename(params) def test_attfncontnc(self) -> None: params = {"filename*0": "foo", "filename*2": "bar"} assert "foo" == content_disposition_filename(params) def test_attfnconts1(self) -> None: params = {"filename*1": "foo", "filename*2": "bar"} assert content_disposition_filename(params) is None def test_attfnboth(self) -> None: params = {"filename": "foo-ae.html", "filename*": "foo-ä.html"} assert "foo-ä.html" == content_disposition_filename(params) def test_attfnboth3(self) -> None: params = { "filename*0*": "ISO-8859-15''euro-sign%3d%a4", "filename*": "currency-sign=¤", } assert "currency-sign=¤" == content_disposition_filename(params) def test_attrfc2047quoted(self) -> None: params = {"filename": "=?ISO-8859-1?Q?foo-=E4.html?="} assert "=?ISO-8859-1?Q?foo-=E4.html?=" == content_disposition_filename(params) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_payload.py0000644000175100001770000000732714607525266017037 0ustar00runnerdockerimport array import asyncio from io import StringIO from unittest import mock import pytest from aiohttp import payload, streams @pytest.fixture def registry(): old = payload.PAYLOAD_REGISTRY reg = payload.PAYLOAD_REGISTRY = payload.PayloadRegistry() yield reg payload.PAYLOAD_REGISTRY = old class Payload(payload.Payload): async def write(self, writer): pass def test_register_type(registry) -> None: class TestProvider: pass payload.register_payload(Payload, TestProvider) p = payload.get_payload(TestProvider()) assert isinstance(p, Payload) def test_register_unsupported_order(registry) -> None: class TestProvider: pass with pytest.raises(ValueError): payload.register_payload( Payload, TestProvider, order=object() # type: ignore[arg-type] ) def test_payload_ctor() -> None: p = Payload("test", encoding="utf-8", filename="test.txt") assert p._value == "test" assert p._encoding == "utf-8" assert p.size is None assert p.filename == "test.txt" assert p.content_type == "text/plain" def test_payload_content_type() -> None: p = Payload("test", headers={"content-type": "application/json"}) assert p.content_type == "application/json" def test_bytes_payload_default_content_type() -> None: p = payload.BytesPayload(b"data") assert p.content_type == "application/octet-stream" def test_bytes_payload_explicit_content_type() -> None: p = payload.BytesPayload(b"data", content_type="application/custom") assert p.content_type == "application/custom" def test_bytes_payload_bad_type() -> None: with pytest.raises(TypeError): payload.BytesPayload(object()) # type: ignore[arg-type] def test_bytes_payload_memoryview_correct_size() -> None: mv = memoryview(array.array("H", [1, 2, 3])) p = payload.BytesPayload(mv) assert p.size == 6 def test_string_payload() -> None: p = payload.StringPayload("test") assert p.encoding == "utf-8" assert p.content_type == "text/plain; charset=utf-8" p = payload.StringPayload("test", encoding="koi8-r") assert p.encoding == "koi8-r" assert p.content_type == "text/plain; charset=koi8-r" p = payload.StringPayload("test", content_type="text/plain; charset=koi8-r") assert p.encoding == "koi8-r" assert p.content_type == "text/plain; charset=koi8-r" def test_string_io_payload() -> None: s = StringIO("ű" * 5000) p = payload.StringIOPayload(s) assert p.encoding == "utf-8" assert p.content_type == "text/plain; charset=utf-8" assert p.size == 10000 def test_async_iterable_payload_default_content_type() -> None: async def gen(): return yield p = payload.AsyncIterablePayload(gen()) assert p.content_type == "application/octet-stream" def test_async_iterable_payload_explicit_content_type() -> None: async def gen(): return yield p = payload.AsyncIterablePayload(gen(), content_type="application/custom") assert p.content_type == "application/custom" def test_async_iterable_payload_not_async_iterable() -> None: with pytest.raises(TypeError): payload.AsyncIterablePayload(object()) async def test_stream_reader_long_lines() -> None: loop = asyncio.get_event_loop() DATA = b"0" * 1024**3 stream = streams.StreamReader(mock.Mock(), 2**16, loop=loop) stream.feed_data(DATA) stream.feed_eof() body = payload.get_payload(stream) writer = mock.Mock() writer.write.return_value = loop.create_future() writer.write.return_value.set_result(None) await body.write(writer) writer.write.assert_called_once_with(mock.ANY) (chunk,), _ = writer.write.call_args assert len(chunk) == len(DATA) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_proxy.py0000644000175100001770000006353514607525266016572 0ustar00runnerdockerimport asyncio import gc import socket import ssl import sys import unittest from unittest import mock import pytest from yarl import URL import aiohttp from aiohttp.client_reqrep import ClientRequest, ClientResponse from aiohttp.helpers import TimerNoop from aiohttp.test_utils import make_mocked_coro pytestmark = pytest.mark.skipif( sys.platform == "win32", reason="Proxy tests are unstable on Windows" ) class TestProxy(unittest.TestCase): response_mock_attrs = { "status": 200, } mocked_response = mock.Mock(**response_mock_attrs) clientrequest_mock_attrs = { "return_value.send.return_value.start": make_mocked_coro(mocked_response), } def setUp(self): self.loop = asyncio.new_event_loop() asyncio.set_event_loop(None) def tearDown(self): # just in case if we have transport close callbacks self.loop.stop() self.loop.run_forever() self.loop.close() gc.collect() @mock.patch("aiohttp.connector.ClientRequest") def test_connect(self, ClientRequestMock) -> None: req = ClientRequest( "GET", URL("http://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) self.assertEqual(str(req.proxy), "http://proxy.example.com") # mock all the things! async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro([mock.MagicMock()]) proto = mock.Mock( **{ "transport.get_extra_info.return_value": False, } ) self.loop.create_connection = make_mocked_coro((proto.transport, proto)) conn = self.loop.run_until_complete( connector.connect(req, None, aiohttp.ClientTimeout()) ) self.assertEqual(req.url, URL("http://www.python.org")) self.assertIs(conn._protocol, proto) self.assertIs(conn.transport, proto.transport) ClientRequestMock.assert_called_with( "GET", URL("http://proxy.example.com"), auth=None, headers={"Host": "www.python.org"}, loop=self.loop, ssl=True, ) conn.close() @mock.patch("aiohttp.connector.ClientRequest") def test_proxy_headers(self, ClientRequestMock) -> None: req = ClientRequest( "GET", URL("http://www.python.org"), proxy=URL("http://proxy.example.com"), proxy_headers={"Foo": "Bar"}, loop=self.loop, ) self.assertEqual(str(req.proxy), "http://proxy.example.com") # mock all the things! async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro([mock.MagicMock()]) proto = mock.Mock( **{ "transport.get_extra_info.return_value": False, } ) self.loop.create_connection = make_mocked_coro((proto.transport, proto)) conn = self.loop.run_until_complete( connector.connect(req, None, aiohttp.ClientTimeout()) ) self.assertEqual(req.url, URL("http://www.python.org")) self.assertIs(conn._protocol, proto) self.assertIs(conn.transport, proto.transport) ClientRequestMock.assert_called_with( "GET", URL("http://proxy.example.com"), auth=None, headers={"Host": "www.python.org", "Foo": "Bar"}, loop=self.loop, ssl=True, ) conn.close() def test_proxy_auth(self) -> None: with self.assertRaises(ValueError) as ctx: ClientRequest( "GET", URL("http://python.org"), proxy=URL("http://proxy.example.com"), proxy_auth=("user", "pass"), loop=mock.Mock(), ) self.assertEqual( ctx.exception.args[0], "proxy_auth must be None or BasicAuth() tuple", ) def test_proxy_dns_error(self) -> None: async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( raise_exception=OSError("dont take it serious") ) req = ClientRequest( "GET", URL("http://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) expected_headers = dict(req.headers) with self.assertRaises(aiohttp.ClientConnectorError): self.loop.run_until_complete( connector.connect(req, None, aiohttp.ClientTimeout()) ) self.assertEqual(req.url.path, "/") self.assertEqual(dict(req.headers), expected_headers) def test_proxy_connection_error(self) -> None: async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "www.python.org", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": socket.AI_NUMERICHOST, } ] ) connector._loop.create_connection = make_mocked_coro( raise_exception=OSError("dont take it serious") ) req = ClientRequest( "GET", URL("http://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) with self.assertRaises(aiohttp.ClientProxyConnectionError): self.loop.run_until_complete( connector.connect(req, None, aiohttp.ClientTimeout()) ) @mock.patch("aiohttp.connector.ClientRequest") def test_proxy_server_hostname_default(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=None, continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(mock.Mock(status=200)) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) tr, proto = mock.Mock(), mock.Mock() self.loop.create_connection = make_mocked_coro((tr, proto)) self.loop.start_tls = make_mocked_coro(mock.Mock()) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) self.assertEqual( self.loop.start_tls.call_args.kwargs["server_hostname"], "www.python.org" ) self.loop.run_until_complete(proxy_req.close()) proxy_resp.close() self.loop.run_until_complete(req.close()) @mock.patch("aiohttp.connector.ClientRequest") def test_proxy_server_hostname_override(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop, ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=None, continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(mock.Mock(status=200)) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) tr, proto = mock.Mock(), mock.Mock() self.loop.create_connection = make_mocked_coro((tr, proto)) self.loop.start_tls = make_mocked_coro(mock.Mock()) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), server_hostname="server-hostname.example.com", loop=self.loop, ) self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) self.assertEqual( self.loop.start_tls.call_args.kwargs["server_hostname"], "server-hostname.example.com", ) self.loop.run_until_complete(proxy_req.close()) proxy_resp.close() self.loop.run_until_complete(req.close()) @mock.patch("aiohttp.connector.ClientRequest") def test_https_connect(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=None, continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(mock.Mock(status=200)) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) tr, proto = mock.Mock(), mock.Mock() self.loop.create_connection = make_mocked_coro((tr, proto)) self.loop.start_tls = make_mocked_coro(mock.Mock()) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) self.assertEqual(req.url.path, "/") self.assertEqual(proxy_req.method, "CONNECT") self.assertEqual(proxy_req.url, URL("https://www.python.org")) self.loop.run_until_complete(proxy_req.close()) proxy_resp.close() self.loop.run_until_complete(req.close()) @mock.patch("aiohttp.connector.ClientRequest") def test_https_connect_certificate_error(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=None, continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(mock.Mock(status=200)) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) # Called on connection to http://proxy.example.com self.loop.create_connection = make_mocked_coro((mock.Mock(), mock.Mock())) # Called on connection to https://www.python.org self.loop.start_tls = make_mocked_coro(raise_exception=ssl.CertificateError) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) with self.assertRaises(aiohttp.ClientConnectorCertificateError): self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) @mock.patch("aiohttp.connector.ClientRequest") def test_https_connect_ssl_error(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=None, continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(mock.Mock(status=200)) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) # Called on connection to http://proxy.example.com self.loop.create_connection = make_mocked_coro( (mock.Mock(), mock.Mock()), ) # Called on connection to https://www.python.org self.loop.start_tls = make_mocked_coro(raise_exception=ssl.SSLError) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) with self.assertRaises(aiohttp.ClientConnectorSSLError): self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) @mock.patch("aiohttp.connector.ClientRequest") def test_https_connect_http_proxy_error(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=None, continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(mock.Mock(status=400, reason="bad request")) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) tr, proto = mock.Mock(), mock.Mock() tr.get_extra_info.return_value = None self.loop.create_connection = make_mocked_coro((tr, proto)) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) with self.assertRaisesRegex( aiohttp.ClientHttpProxyError, "400, message='bad request'" ): self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) self.loop.run_until_complete(proxy_req.close()) proxy_resp.close() self.loop.run_until_complete(req.close()) @mock.patch("aiohttp.connector.ClientRequest") def test_https_connect_resp_start_error(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=None, continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(raise_exception=OSError("error message")) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) tr, proto = mock.Mock(), mock.Mock() tr.get_extra_info.return_value = None self.loop.create_connection = make_mocked_coro((tr, proto)) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) with self.assertRaisesRegex(OSError, "error message"): self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) @mock.patch("aiohttp.connector.ClientRequest") def test_request_port(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop ) ClientRequestMock.return_value = proxy_req async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) tr, proto = mock.Mock(), mock.Mock() tr.get_extra_info.return_value = None self.loop.create_connection = make_mocked_coro((tr, proto)) req = ClientRequest( "GET", URL("http://localhost:1234/path"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) self.assertEqual(req.url, URL("http://localhost:1234/path")) def test_proxy_auth_property(self) -> None: req = aiohttp.ClientRequest( "GET", URL("http://localhost:1234/path"), proxy=URL("http://proxy.example.com"), proxy_auth=aiohttp.helpers.BasicAuth("user", "pass"), loop=self.loop, ) self.assertEqual(("user", "pass", "latin1"), req.proxy_auth) def test_proxy_auth_property_default(self) -> None: req = aiohttp.ClientRequest( "GET", URL("http://localhost:1234/path"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) self.assertIsNone(req.proxy_auth) @mock.patch("aiohttp.connector.ClientRequest") def test_https_connect_pass_ssl_context(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=None, continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(mock.Mock(status=200)) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) tr, proto = mock.Mock(), mock.Mock() self.loop.create_connection = make_mocked_coro((tr, proto)) self.loop.start_tls = make_mocked_coro(mock.Mock()) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) self.loop.start_tls.assert_called_with( mock.ANY, mock.ANY, connector._make_ssl_context(True), server_hostname="www.python.org", ssl_handshake_timeout=mock.ANY, ) self.assertEqual(req.url.path, "/") self.assertEqual(proxy_req.method, "CONNECT") self.assertEqual(proxy_req.url, URL("https://www.python.org")) self.loop.run_until_complete(proxy_req.close()) proxy_resp.close() self.loop.run_until_complete(req.close()) @mock.patch("aiohttp.connector.ClientRequest") def test_https_auth(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), auth=aiohttp.helpers.BasicAuth("user", "pass"), loop=self.loop, ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=None, continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(mock.Mock(status=200)) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) tr, proto = mock.Mock(), mock.Mock() self.loop.create_connection = make_mocked_coro((tr, proto)) self.loop.start_tls = make_mocked_coro(mock.Mock()) self.assertIn("AUTHORIZATION", proxy_req.headers) self.assertNotIn("PROXY-AUTHORIZATION", proxy_req.headers) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) self.assertNotIn("AUTHORIZATION", req.headers) self.assertNotIn("PROXY-AUTHORIZATION", req.headers) self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) self.assertEqual(req.url.path, "/") self.assertNotIn("AUTHORIZATION", req.headers) self.assertNotIn("PROXY-AUTHORIZATION", req.headers) self.assertNotIn("AUTHORIZATION", proxy_req.headers) self.assertIn("PROXY-AUTHORIZATION", proxy_req.headers) connector._resolve_host.assert_called_with( "proxy.example.com", 80, traces=mock.ANY ) self.loop.run_until_complete(proxy_req.close()) proxy_resp.close() self.loop.run_until_complete(req.close()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_proxy_functional.py0000644000175100001770000006411314607525266021005 0ustar00runnerdockerimport asyncio import os import pathlib import ssl import sys from re import match as match_regex from unittest import mock from uuid import uuid4 import proxy import pytest from yarl import URL import aiohttp from aiohttp import web from aiohttp.client_exceptions import ClientConnectionError from aiohttp.helpers import IS_MACOS, IS_WINDOWS pytestmark = [ pytest.mark.filterwarnings( "ignore:unclosed = (3, 11) @pytest.fixture def secure_proxy_url(tls_certificate_pem_path): """Return the URL of an instance of a running secure proxy. This fixture also spawns that instance and tears it down after the test. """ proxypy_args = [ # --threadless does not work on windows, see # https://github.com/abhinavsingh/proxy.py/issues/492 "--threaded" if os.name == "nt" else "--threadless", "--num-workers", "1", # the tests only send one query anyway "--hostname", "127.0.0.1", # network interface to listen to "--port", 0, # ephemeral port, so that kernel allocates a free one "--cert-file", tls_certificate_pem_path, # contains both key and cert "--key-file", tls_certificate_pem_path, # contains both key and cert ] if not IS_MACOS and not IS_WINDOWS: proxypy_args.append("--threadless") # use asyncio with proxy.Proxy(input_args=proxypy_args) as proxy_instance: yield URL.build( scheme="https", host=str(proxy_instance.flags.hostname), port=proxy_instance.flags.port, ) @pytest.fixture def web_server_endpoint_payload(): return str(uuid4()) @pytest.fixture(params=("http", "https")) def web_server_endpoint_type(request): return request.param @pytest.fixture async def web_server_endpoint_url( aiohttp_server, ssl_ctx, web_server_endpoint_payload, web_server_endpoint_type, ): server_kwargs = ( { "ssl": ssl_ctx, } if web_server_endpoint_type == "https" else {} ) async def handler(*args, **kwargs): return web.Response(text=web_server_endpoint_payload) app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app, **server_kwargs) return URL.build( scheme=web_server_endpoint_type, host=server.host, port=server.port, ) @pytest.mark.skipif( not ASYNCIO_SUPPORTS_TLS_IN_TLS, reason="asyncio on this python does not support TLS in TLS", ) @pytest.mark.parametrize("web_server_endpoint_type", ("http", "https")) @pytest.mark.filterwarnings(r"ignore:.*ssl.OP_NO_SSL*") # Filter out the warning from # https://github.com/abhinavsingh/proxy.py/blob/30574fd0414005dfa8792a6e797023e862bdcf43/proxy/common/utils.py#L226 # otherwise this test will fail because the proxy will die with an error. async def test_secure_https_proxy_absolute_path( client_ssl_ctx: ssl.SSLContext, secure_proxy_url: URL, web_server_endpoint_url: str, web_server_endpoint_payload: str, ) -> None: """Ensure HTTP(S) sites are accessible through a secure proxy.""" conn = aiohttp.TCPConnector() sess = aiohttp.ClientSession(connector=conn) response = await sess.get( web_server_endpoint_url, proxy=secure_proxy_url, ssl=client_ssl_ctx, # used for both proxy and endpoint connections ) assert response.status == 200 assert await response.text() == web_server_endpoint_payload response.close() await sess.close() await conn.close() # https://docs.aiohttp.org/en/v3.8.0/client_advanced.html#graceful-shutdown await asyncio.sleep(0.1) @pytest.mark.parametrize("web_server_endpoint_type", ("https",)) @pytest.mark.usefixtures("loop") @pytest.mark.skipif( ASYNCIO_SUPPORTS_TLS_IN_TLS, reason="asyncio on this python supports TLS in TLS" ) @pytest.mark.filterwarnings(r"ignore:.*ssl.OP_NO_SSL*") # Filter out the warning from # https://github.com/abhinavsingh/proxy.py/blob/30574fd0414005dfa8792a6e797023e862bdcf43/proxy/common/utils.py#L226 # otherwise this test will fail because the proxy will die with an error. async def test_https_proxy_unsupported_tls_in_tls( client_ssl_ctx: ssl.SSLContext, secure_proxy_url: URL, web_server_endpoint_type: str, ) -> None: """Ensure connecting to TLS endpoints w/ HTTPS proxy needs patching. This also checks that a helpful warning on how to patch the env is displayed. """ url = URL.build(scheme=web_server_endpoint_type, host="python.org") escaped_host_port = ":".join((url.host.replace(".", r"\."), str(url.port))) escaped_proxy_url = str(secure_proxy_url).replace(".", r"\.") conn = aiohttp.TCPConnector() sess = aiohttp.ClientSession(connector=conn) expected_warning_text = ( r"^" r"An HTTPS request is being sent through an HTTPS proxy\. " "This support for TLS in TLS is known to be disabled " r"in the stdlib asyncio \(Python <3\.11\)\. This is why you'll probably see " r"an error in the log below\.\n\n" r"It is possible to enable it via monkeypatching\. " r"For more details, see:\n" r"\* https://bugs\.python\.org/issue37179\n" r"\* https://github\.com/python/cpython/pull/28073\n\n" r"You can temporarily patch this as follows:\n" r"\* https://docs\.aiohttp\.org/en/stable/client_advanced\.html#proxy-support\n" r"\* https://github\.com/aio-libs/aiohttp/discussions/6044\n$" ) type_err = ( r"transport is not supported by start_tls\(\)" ) expected_exception_reason = ( r"^" "Cannot initialize a TLS-in-TLS connection to host " f"{escaped_host_port!s} through an underlying connection " f"to an HTTPS proxy {escaped_proxy_url!s} ssl:{client_ssl_ctx!s} " f"[{type_err!s}]" r"$" ) with pytest.warns(RuntimeWarning, match=expected_warning_text,), pytest.raises( ClientConnectionError, match=expected_exception_reason, ) as conn_err: await sess.get(url, proxy=secure_proxy_url, ssl=client_ssl_ctx) assert type(conn_err.value.__cause__) == TypeError assert match_regex(f"^{type_err!s}$", str(conn_err.value.__cause__)) await sess.close() await conn.close() @pytest.fixture def proxy_test_server(aiohttp_raw_server, loop, monkeypatch): # Handle all proxy requests and imitate remote server response. _patch_ssl_transport(monkeypatch) default_response = dict(status=200, headers=None, body=None) proxy_mock = mock.Mock() async def proxy_handler(request): proxy_mock.request = request proxy_mock.requests_list.append(request) response = default_response.copy() if isinstance(proxy_mock.return_value, dict): response.update(proxy_mock.return_value) headers = response["headers"] if not headers: headers = {} if request.method == "CONNECT": response["body"] = None response["headers"] = headers resp = web.Response(**response) await resp.prepare(request) await resp.write_eof() return resp async def proxy_server(): proxy_mock.request = None proxy_mock.auth = None proxy_mock.requests_list = [] server = await aiohttp_raw_server(proxy_handler) proxy_mock.server = server proxy_mock.url = server.make_url("/") return proxy_mock return proxy_server @pytest.fixture() def get_request(loop): async def _request(method="GET", *, url, trust_env=False, **kwargs): connector = aiohttp.TCPConnector(ssl=False, loop=loop) client = aiohttp.ClientSession(connector=connector, trust_env=trust_env) try: resp = await client.request(method, url, **kwargs) await resp.release() return resp finally: await client.close() return _request async def test_proxy_http_absolute_path(proxy_test_server, get_request) -> None: url = "http://aiohttp.io/path?query=yes" proxy = await proxy_test_server() await get_request(url=url, proxy=proxy.url) assert len(proxy.requests_list) == 1 assert proxy.request.method == "GET" assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == "/path?query=yes" async def test_proxy_http_raw_path(proxy_test_server, get_request) -> None: url = "http://aiohttp.io:2561/space sheep?q=can:fly" raw_url = "/space%20sheep?q=can:fly" proxy = await proxy_test_server() await get_request(url=url, proxy=proxy.url) assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == raw_url async def test_proxy_http_idna_support(proxy_test_server, get_request) -> None: url = "http://éé.com/" proxy = await proxy_test_server() await get_request(url=url, proxy=proxy.url) assert proxy.request.host == "éé.com" assert proxy.request.path_qs == "/" async def test_proxy_http_connection_error(get_request) -> None: url = "http://aiohttp.io/path" proxy_url = "http://localhost:2242/" with pytest.raises(aiohttp.ClientConnectorError): await get_request(url=url, proxy=proxy_url) async def test_proxy_http_bad_response(proxy_test_server, get_request) -> None: url = "http://aiohttp.io/path" proxy = await proxy_test_server() proxy.return_value = dict(status=502, headers={"Proxy-Agent": "TestProxy"}) resp = await get_request(url=url, proxy=proxy.url) assert resp.status == 502 assert resp.headers["Proxy-Agent"] == "TestProxy" async def test_proxy_http_auth(proxy_test_server, get_request) -> None: url = "http://aiohttp.io/path" proxy = await proxy_test_server() await get_request(url=url, proxy=proxy.url) assert "Authorization" not in proxy.request.headers assert "Proxy-Authorization" not in proxy.request.headers auth = aiohttp.BasicAuth("user", "pass") await get_request(url=url, auth=auth, proxy=proxy.url) assert "Authorization" in proxy.request.headers assert "Proxy-Authorization" not in proxy.request.headers await get_request(url=url, proxy_auth=auth, proxy=proxy.url) assert "Authorization" not in proxy.request.headers assert "Proxy-Authorization" in proxy.request.headers await get_request(url=url, auth=auth, proxy_auth=auth, proxy=proxy.url) assert "Authorization" in proxy.request.headers assert "Proxy-Authorization" in proxy.request.headers async def test_proxy_http_auth_utf8(proxy_test_server, get_request) -> None: url = "http://aiohttp.io/path" auth = aiohttp.BasicAuth("юзер", "пасс", "utf-8") proxy = await proxy_test_server() await get_request(url=url, auth=auth, proxy=proxy.url) assert "Authorization" in proxy.request.headers assert "Proxy-Authorization" not in proxy.request.headers async def test_proxy_http_auth_from_url(proxy_test_server, get_request) -> None: url = "http://aiohttp.io/path" proxy = await proxy_test_server() auth_url = URL(url).with_user("user").with_password("pass") await get_request(url=auth_url, proxy=proxy.url) assert "Authorization" in proxy.request.headers assert "Proxy-Authorization" not in proxy.request.headers proxy_url = URL(proxy.url).with_user("user").with_password("pass") await get_request(url=url, proxy=proxy_url) assert "Authorization" not in proxy.request.headers assert "Proxy-Authorization" in proxy.request.headers async def test_proxy_http_acquired_cleanup(proxy_test_server, loop) -> None: url = "http://aiohttp.io/path" conn = aiohttp.TCPConnector(loop=loop) sess = aiohttp.ClientSession(connector=conn, loop=loop) proxy = await proxy_test_server() assert 0 == len(conn._acquired) async with sess.get(url, proxy=proxy.url) as resp: pass assert resp.closed assert 0 == len(conn._acquired) await sess.close() @pytest.mark.skip("we need to reconsider how we test this") async def test_proxy_http_acquired_cleanup_force(proxy_test_server, loop) -> None: url = "http://aiohttp.io/path" conn = aiohttp.TCPConnector(force_close=True, loop=loop) sess = aiohttp.ClientSession(connector=conn, loop=loop) proxy = await proxy_test_server() assert 0 == len(conn._acquired) async def request(): resp = await sess.get(url, proxy=proxy.url) assert 1 == len(conn._acquired) await resp.release() await request() assert 0 == len(conn._acquired) await sess.close() @pytest.mark.skip("we need to reconsider how we test this") async def test_proxy_http_multi_conn_limit(proxy_test_server, loop) -> None: url = "http://aiohttp.io/path" limit, multi_conn_num = 1, 5 conn = aiohttp.TCPConnector(limit=limit, loop=loop) sess = aiohttp.ClientSession(connector=conn, loop=loop) proxy = await proxy_test_server() current_pid = None async def request(pid): # process requests only one by one nonlocal current_pid resp = await sess.get(url, proxy=proxy.url) current_pid = pid await asyncio.sleep(0.2, loop=loop) assert current_pid == pid await resp.release() return resp requests = [request(pid) for pid in range(multi_conn_num)] responses = await asyncio.gather(*requests, loop=loop) assert len(responses) == multi_conn_num assert {resp.status for resp in responses} == {200} await sess.close() @pytest.mark.xfail async def xtest_proxy_https_connect(proxy_test_server, get_request): proxy = await proxy_test_server() url = "https://www.google.com.ua/search?q=aiohttp proxy" await get_request(url=url, proxy=proxy.url) connect = proxy.requests_list[0] assert connect.method == "CONNECT" assert connect.path == "www.google.com.ua:443" assert connect.host == "www.google.com.ua" assert proxy.request.host == "www.google.com.ua" assert proxy.request.path_qs == "/search?q=aiohttp+proxy" @pytest.mark.xfail async def xtest_proxy_https_connect_with_port(proxy_test_server, get_request): proxy = await proxy_test_server() url = "https://secure.aiohttp.io:2242/path" await get_request(url=url, proxy=proxy.url) connect = proxy.requests_list[0] assert connect.method == "CONNECT" assert connect.path == "secure.aiohttp.io:2242" assert connect.host == "secure.aiohttp.io:2242" assert proxy.request.host == "secure.aiohttp.io:2242" assert proxy.request.path_qs == "/path" @pytest.mark.xfail async def xtest_proxy_https_send_body(proxy_test_server, loop): sess = aiohttp.ClientSession(loop=loop) proxy = await proxy_test_server() proxy.return_value = {"status": 200, "body": b"1" * (2**20)} url = "https://www.google.com.ua/search?q=aiohttp proxy" resp = await sess.get(url, proxy=proxy.url) body = await resp.read() await resp.release() await sess.close() assert body == b"1" * (2**20) @pytest.mark.xfail async def xtest_proxy_https_idna_support(proxy_test_server, get_request): url = "https://éé.com/" proxy = await proxy_test_server() await get_request(url=url, proxy=proxy.url) connect = proxy.requests_list[0] assert connect.method == "CONNECT" assert connect.path == "xn--9caa.com:443" assert connect.host == "xn--9caa.com" async def test_proxy_https_connection_error(get_request) -> None: url = "https://secure.aiohttp.io/path" proxy_url = "http://localhost:2242/" with pytest.raises(aiohttp.ClientConnectorError): await get_request(url=url, proxy=proxy_url) async def test_proxy_https_bad_response(proxy_test_server, get_request) -> None: url = "https://secure.aiohttp.io/path" proxy = await proxy_test_server() proxy.return_value = dict(status=502, headers={"Proxy-Agent": "TestProxy"}) with pytest.raises(aiohttp.ClientHttpProxyError): await get_request(url=url, proxy=proxy.url) assert len(proxy.requests_list) == 1 assert proxy.request.method == "CONNECT" # The following check fails on MacOS # assert proxy.request.path == 'secure.aiohttp.io:443' @pytest.mark.xfail async def xtest_proxy_https_auth(proxy_test_server, get_request): url = "https://secure.aiohttp.io/path" auth = aiohttp.BasicAuth("user", "pass") proxy = await proxy_test_server() await get_request(url=url, proxy=proxy.url) connect = proxy.requests_list[0] assert "Authorization" not in connect.headers assert "Proxy-Authorization" not in connect.headers assert "Authorization" not in proxy.request.headers assert "Proxy-Authorization" not in proxy.request.headers proxy = await proxy_test_server() await get_request(url=url, auth=auth, proxy=proxy.url) connect = proxy.requests_list[0] assert "Authorization" not in connect.headers assert "Proxy-Authorization" not in connect.headers assert "Authorization" in proxy.request.headers assert "Proxy-Authorization" not in proxy.request.headers proxy = await proxy_test_server() await get_request(url=url, proxy_auth=auth, proxy=proxy.url) connect = proxy.requests_list[0] assert "Authorization" not in connect.headers assert "Proxy-Authorization" in connect.headers assert "Authorization" not in proxy.request.headers assert "Proxy-Authorization" not in proxy.request.headers proxy = await proxy_test_server() await get_request(url=url, auth=auth, proxy_auth=auth, proxy=proxy.url) connect = proxy.requests_list[0] assert "Authorization" not in connect.headers assert "Proxy-Authorization" in connect.headers assert "Authorization" in proxy.request.headers assert "Proxy-Authorization" not in proxy.request.headers @pytest.mark.xfail async def xtest_proxy_https_acquired_cleanup(proxy_test_server, loop): url = "https://secure.aiohttp.io/path" conn = aiohttp.TCPConnector(loop=loop) sess = aiohttp.ClientSession(connector=conn, loop=loop) proxy = await proxy_test_server() assert 0 == len(conn._acquired) async def request(): resp = await sess.get(url, proxy=proxy.url) assert 1 == len(conn._acquired) await resp.release() await request() assert 0 == len(conn._acquired) await sess.close() @pytest.mark.xfail async def xtest_proxy_https_acquired_cleanup_force(proxy_test_server, loop): url = "https://secure.aiohttp.io/path" conn = aiohttp.TCPConnector(force_close=True, loop=loop) sess = aiohttp.ClientSession(connector=conn, loop=loop) proxy = await proxy_test_server() assert 0 == len(conn._acquired) async def request(): resp = await sess.get(url, proxy=proxy.url) assert 1 == len(conn._acquired) await resp.release() await request() assert 0 == len(conn._acquired) await sess.close() @pytest.mark.xfail async def xtest_proxy_https_multi_conn_limit(proxy_test_server, loop): url = "https://secure.aiohttp.io/path" limit, multi_conn_num = 1, 5 conn = aiohttp.TCPConnector(limit=limit, loop=loop) sess = aiohttp.ClientSession(connector=conn, loop=loop) proxy = await proxy_test_server() current_pid = None async def request(pid): # process requests only one by one nonlocal current_pid resp = await sess.get(url, proxy=proxy.url) current_pid = pid await asyncio.sleep(0.2, loop=loop) assert current_pid == pid await resp.release() return resp requests = [request(pid) for pid in range(multi_conn_num)] responses = await asyncio.gather(*requests, loop=loop) assert len(responses) == multi_conn_num assert {resp.status for resp in responses} == {200} await sess.close() def _patch_ssl_transport(monkeypatch): # Make ssl transport substitution to prevent ssl handshake. def _make_ssl_transport_dummy( self, rawsock, protocol, sslcontext, waiter=None, **kwargs ): return self._make_socket_transport( rawsock, protocol, waiter, extra=kwargs.get("extra"), server=kwargs.get("server"), ) monkeypatch.setattr( "asyncio.selector_events.BaseSelectorEventLoop._make_ssl_transport", _make_ssl_transport_dummy, ) original_is_file = pathlib.Path.is_file def mock_is_file(self): # make real netrc file invisible in home dir if self.name in ["_netrc", ".netrc"] and self.parent == self.home(): return False else: return original_is_file(self) async def test_proxy_from_env_http(proxy_test_server, get_request, mocker) -> None: url = "http://aiohttp.io/path" proxy = await proxy_test_server() mocker.patch.dict(os.environ, {"http_proxy": str(proxy.url)}) mocker.patch("pathlib.Path.is_file", mock_is_file) await get_request(url=url, trust_env=True) assert len(proxy.requests_list) == 1 assert proxy.request.method == "GET" assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == "/path" assert "Proxy-Authorization" not in proxy.request.headers async def test_proxy_from_env_http_with_auth(proxy_test_server, get_request, mocker): url = "http://aiohttp.io/path" proxy = await proxy_test_server() auth = aiohttp.BasicAuth("user", "pass") mocker.patch.dict( os.environ, { "http_proxy": str( proxy.url.with_user(auth.login).with_password(auth.password) ) }, ) await get_request(url=url, trust_env=True) assert len(proxy.requests_list) == 1 assert proxy.request.method == "GET" assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == "/path" assert proxy.request.headers["Proxy-Authorization"] == auth.encode() async def test_proxy_from_env_http_with_auth_from_netrc( proxy_test_server, get_request, tmp_path, mocker ): url = "http://aiohttp.io/path" proxy = await proxy_test_server() auth = aiohttp.BasicAuth("user", "pass") netrc_file = tmp_path / "test_netrc" netrc_file_data = "machine 127.0.0.1 login {} password {}".format( auth.login, auth.password, ) with netrc_file.open("w") as f: f.write(netrc_file_data) mocker.patch.dict( os.environ, {"http_proxy": str(proxy.url), "NETRC": str(netrc_file)} ) await get_request(url=url, trust_env=True) assert len(proxy.requests_list) == 1 assert proxy.request.method == "GET" assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == "/path" assert proxy.request.headers["Proxy-Authorization"] == auth.encode() async def test_proxy_from_env_http_without_auth_from_netrc( proxy_test_server, get_request, tmp_path, mocker ): url = "http://aiohttp.io/path" proxy = await proxy_test_server() auth = aiohttp.BasicAuth("user", "pass") netrc_file = tmp_path / "test_netrc" netrc_file_data = "machine 127.0.0.2 login {} password {}".format( auth.login, auth.password, ) with netrc_file.open("w") as f: f.write(netrc_file_data) mocker.patch.dict( os.environ, {"http_proxy": str(proxy.url), "NETRC": str(netrc_file)} ) await get_request(url=url, trust_env=True) assert len(proxy.requests_list) == 1 assert proxy.request.method == "GET" assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == "/path" assert "Proxy-Authorization" not in proxy.request.headers async def test_proxy_from_env_http_without_auth_from_wrong_netrc( proxy_test_server, get_request, tmp_path, mocker ): url = "http://aiohttp.io/path" proxy = await proxy_test_server() auth = aiohttp.BasicAuth("user", "pass") netrc_file = tmp_path / "test_netrc" invalid_data = f"machine 127.0.0.1 {auth.login} pass {auth.password}" with netrc_file.open("w") as f: f.write(invalid_data) mocker.patch.dict( os.environ, {"http_proxy": str(proxy.url), "NETRC": str(netrc_file)} ) await get_request(url=url, trust_env=True) assert len(proxy.requests_list) == 1 assert proxy.request.method == "GET" assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == "/path" assert "Proxy-Authorization" not in proxy.request.headers @pytest.mark.xfail async def xtest_proxy_from_env_https(proxy_test_server, get_request, mocker): url = "https://aiohttp.io/path" proxy = await proxy_test_server() mocker.patch.dict(os.environ, {"https_proxy": str(proxy.url)}) mock.patch("pathlib.Path.is_file", mock_is_file) await get_request(url=url, trust_env=True) assert len(proxy.requests_list) == 2 assert proxy.request.method == "GET" assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == "/path" assert "Proxy-Authorization" not in proxy.request.headers @pytest.mark.xfail async def xtest_proxy_from_env_https_with_auth(proxy_test_server, get_request, mocker): url = "https://aiohttp.io/path" proxy = await proxy_test_server() auth = aiohttp.BasicAuth("user", "pass") mocker.patch.dict( os.environ, { "https_proxy": str( proxy.url.with_user(auth.login).with_password(auth.password) ) }, ) await get_request(url=url, trust_env=True) assert len(proxy.requests_list) == 2 assert proxy.request.method == "GET" assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == "/path" assert "Proxy-Authorization" not in proxy.request.headers r2 = proxy.requests_list[0] assert r2.method == "CONNECT" assert r2.host == "aiohttp.io" assert r2.path_qs == "/path" assert r2.headers["Proxy-Authorization"] == auth.encode() async def test_proxy_auth() -> None: async with aiohttp.ClientSession() as session: with pytest.raises( ValueError, match=r"proxy_auth must be None or BasicAuth\(\) tuple" ): await session.get( "http://python.org", proxy="http://proxy.example.com", proxy_auth=("user", "pass"), ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_pytest_plugin.py0000644000175100001770000001470314607525266020310 0ustar00runnerdockerimport os import platform pytest_plugins = "pytester" CONFTEST = """ pytest_plugins = 'aiohttp.pytest_plugin' """ IS_PYPY = platform.python_implementation() == "PyPy" def test_aiohttp_plugin(testdir) -> None: testdir.makepyfile( """\ import pytest from unittest import mock from aiohttp import web async def hello(request): return web.Response(body=b'Hello, world') def create_app(loop=None): app = web.Application() app.router.add_route('GET', '/', hello) return app async def test_hello(aiohttp_client) -> None: client = await aiohttp_client(create_app) resp = await client.get('/') assert resp.status == 200 text = await resp.text() assert 'Hello, world' in text async def test_hello_from_app(aiohttp_client, loop) -> None: app = web.Application() app.router.add_get('/', hello) client = await aiohttp_client(app) resp = await client.get('/') assert resp.status == 200 text = await resp.text() assert 'Hello, world' in text async def test_hello_with_loop(aiohttp_client, loop) -> None: client = await aiohttp_client(create_app) resp = await client.get('/') assert resp.status == 200 text = await resp.text() assert 'Hello, world' in text async def test_set_args(aiohttp_client, loop) -> None: with pytest.raises(AssertionError): app = web.Application() await aiohttp_client(app, 1, 2, 3) async def test_set_keyword_args(aiohttp_client, loop) -> None: app = web.Application() with pytest.raises(TypeError): await aiohttp_client(app, param=1) async def test_noop() -> None: pass async def previous(request): if request.method == 'POST': with pytest.deprecated_call(): # FIXME: this isn't actually called request.app['value'] = (await request.post())['value'] return web.Response(body=b'thanks for the data') else: v = request.app.get('value', 'unknown') return web.Response(body='value: {}'.format(v).encode()) def create_stateful_app(loop): app = web.Application() app.router.add_route('*', '/', previous) return app @pytest.fixture def cli(loop, aiohttp_client): return loop.run_until_complete(aiohttp_client(create_stateful_app)) async def test_set_value(cli) -> None: resp = await cli.post('/', data={'value': 'foo'}) assert resp.status == 200 text = await resp.text() assert text == 'thanks for the data' assert cli.server.app['value'] == 'foo' async def test_get_value(cli) -> None: resp = await cli.get('/') assert resp.status == 200 text = await resp.text() assert text == 'value: unknown' with pytest.warns(DeprecationWarning): cli.server.app['value'] = 'bar' resp = await cli.get('/') assert resp.status == 200 text = await resp.text() assert text == 'value: bar' def test_noncoro() -> None: assert True async def test_failed_to_create_client(aiohttp_client) -> None: def make_app(loop): raise RuntimeError() with pytest.raises(RuntimeError): await aiohttp_client(make_app) async def test_custom_port_aiohttp_client(aiohttp_client, aiohttp_unused_port): port = aiohttp_unused_port() client = await aiohttp_client(create_app, server_kwargs={'port': port}) assert client.port == port resp = await client.get('/') assert resp.status == 200 text = await resp.text() assert 'Hello, world' in text async def test_custom_port_test_server(aiohttp_server, aiohttp_unused_port): app = create_app() port = aiohttp_unused_port() server = await aiohttp_server(app, port=port) assert server.port == port """ ) testdir.makeconftest(CONFTEST) result = testdir.runpytest("-p", "no:sugar", "--aiohttp-loop=pyloop") result.assert_outcomes(passed=12) def test_warning_checks(testdir) -> None: testdir.makepyfile( """\ async def foobar(): return 123 async def test_good() -> None: v = await foobar() assert v == 123 async def test_bad() -> None: foobar() """ ) testdir.makeconftest(CONFTEST) result = testdir.runpytest( "-p", "no:sugar", "-s", "-W", "default", "--aiohttp-loop=pyloop" ) expected_outcomes = ( {"failed": 0, "passed": 2} if IS_PYPY and bool(os.environ.get("PYTHONASYNCIODEBUG")) else {"failed": 1, "passed": 1} ) # Under PyPy "coroutine 'foobar' was never awaited" does not happen. result.assert_outcomes(**expected_outcomes) def test_aiohttp_plugin_async_fixture(testdir, capsys) -> None: testdir.makepyfile( """\ import pytest from aiohttp import web async def hello(request): return web.Response(body=b'Hello, world') def create_app(): app = web.Application() app.router.add_route('GET', '/', hello) return app @pytest.fixture async def cli(aiohttp_client, loop): client = await aiohttp_client(create_app()) return client @pytest.fixture async def foo(): return 42 @pytest.fixture async def bar(request): # request should be accessible in async fixtures if needed return request.function async def test_hello(cli, loop) -> None: resp = await cli.get('/') assert resp.status == 200 def test_foo(loop, foo) -> None: assert foo == 42 def test_foo_without_loop(foo) -> None: # will raise an error because there is no loop pass def test_bar(loop, bar) -> None: assert bar is test_bar """ ) testdir.makeconftest(CONFTEST) result = testdir.runpytest("-p", "no:sugar", "--aiohttp-loop=pyloop") result.assert_outcomes(passed=3, errors=1) result.stdout.fnmatch_lines( "*Asynchronous fixtures must depend on the 'loop' fixture " "or be used in tests depending from it." ) def test_aiohttp_plugin_async_gen_fixture(testdir) -> None: testdir.makepyfile( """\ import pytest from unittest import mock from aiohttp import web canary = mock.Mock() async def hello(request): return web.Response(body=b'Hello, world') def create_app(loop): app = web.Application() app.router.add_route('GET', '/', hello) return app @pytest.fixture async def cli(aiohttp_client): yield await aiohttp_client(create_app) canary() async def test_hello(cli) -> None: resp = await cli.get('/') assert resp.status == 200 def test_finalized() -> None: assert canary.called is True """ ) testdir.makeconftest(CONFTEST) result = testdir.runpytest("-p", "no:sugar", "--aiohttp-loop=pyloop") result.assert_outcomes(passed=2) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_resolver.py0000644000175100001770000002025614607525266017243 0ustar00runnerdockerimport asyncio import ipaddress import socket from typing import Any, List from unittest.mock import Mock, patch import pytest from aiohttp.resolver import AsyncResolver, DefaultResolver, ThreadedResolver try: import aiodns gethostbyname = hasattr(aiodns.DNSResolver, "gethostbyname") except ImportError: aiodns = None gethostbyname = False class FakeResult: def __init__(self, addresses): self.addresses = addresses class FakeQueryResult: def __init__(self, host): self.host = host async def fake_result(addresses): return FakeResult(addresses=tuple(addresses)) async def fake_query_result(result): return [FakeQueryResult(host=h) for h in result] def fake_addrinfo(hosts): async def fake(*args, **kwargs): if not hosts: raise socket.gaierror return [(socket.AF_INET, None, socket.SOCK_STREAM, None, [h, 0]) for h in hosts] return fake @pytest.mark.skipif(not gethostbyname, reason="aiodns 1.1 required") async def test_async_resolver_positive_lookup(loop) -> None: with patch("aiodns.DNSResolver") as mock: mock().gethostbyname.return_value = fake_result(["127.0.0.1"]) resolver = AsyncResolver(loop=loop) real = await resolver.resolve("www.python.org") ipaddress.ip_address(real[0]["host"]) mock().gethostbyname.assert_called_with("www.python.org", socket.AF_INET) @pytest.mark.skipif(aiodns is None, reason="aiodns required") async def test_async_resolver_query_positive_lookup(loop) -> None: with patch("aiodns.DNSResolver") as mock: del mock().gethostbyname mock().query.return_value = fake_query_result(["127.0.0.1"]) resolver = AsyncResolver(loop=loop) real = await resolver.resolve("www.python.org") ipaddress.ip_address(real[0]["host"]) mock().query.assert_called_with("www.python.org", "A") @pytest.mark.skipif(not gethostbyname, reason="aiodns 1.1 required") async def test_async_resolver_multiple_replies(loop) -> None: with patch("aiodns.DNSResolver") as mock: ips = ["127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.0.4"] mock().gethostbyname.return_value = fake_result(ips) resolver = AsyncResolver(loop=loop) real = await resolver.resolve("www.google.com") ips = [ipaddress.ip_address(x["host"]) for x in real] assert len(ips) > 3, "Expecting multiple addresses" @pytest.mark.skipif(aiodns is None, reason="aiodns required") async def test_async_resolver_query_multiple_replies(loop) -> None: with patch("aiodns.DNSResolver") as mock: del mock().gethostbyname ips = ["127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.0.4"] mock().query.return_value = fake_query_result(ips) resolver = AsyncResolver(loop=loop) real = await resolver.resolve("www.google.com") ips = [ipaddress.ip_address(x["host"]) for x in real] @pytest.mark.skipif(not gethostbyname, reason="aiodns 1.1 required") async def test_async_resolver_negative_lookup(loop) -> None: with patch("aiodns.DNSResolver") as mock: mock().gethostbyname.side_effect = aiodns.error.DNSError() resolver = AsyncResolver(loop=loop) with pytest.raises(OSError): await resolver.resolve("doesnotexist.bla") @pytest.mark.skipif(aiodns is None, reason="aiodns required") async def test_async_resolver_query_negative_lookup(loop) -> None: with patch("aiodns.DNSResolver") as mock: del mock().gethostbyname mock().query.side_effect = aiodns.error.DNSError() resolver = AsyncResolver(loop=loop) with pytest.raises(OSError): await resolver.resolve("doesnotexist.bla") @pytest.mark.skipif(aiodns is None, reason="aiodns required") async def test_async_resolver_no_hosts_in_query(loop) -> None: with patch("aiodns.DNSResolver") as mock: del mock().gethostbyname mock().query.return_value = fake_query_result([]) resolver = AsyncResolver(loop=loop) with pytest.raises(OSError): await resolver.resolve("doesnotexist.bla") @pytest.mark.skipif(not gethostbyname, reason="aiodns 1.1 required") async def test_async_resolver_no_hosts_in_gethostbyname(loop) -> None: with patch("aiodns.DNSResolver") as mock: mock().gethostbyname.return_value = fake_result([]) resolver = AsyncResolver(loop=loop) with pytest.raises(OSError): await resolver.resolve("doesnotexist.bla") async def test_threaded_resolver_positive_lookup() -> None: loop = Mock() loop.getaddrinfo = fake_addrinfo(["127.0.0.1"]) resolver = ThreadedResolver(loop=loop) real = await resolver.resolve("www.python.org") assert real[0]["hostname"] == "www.python.org" ipaddress.ip_address(real[0]["host"]) async def test_threaded_resolver_multiple_replies() -> None: loop = Mock() ips = ["127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.0.4"] loop.getaddrinfo = fake_addrinfo(ips) resolver = ThreadedResolver(loop=loop) real = await resolver.resolve("www.google.com") ips = [ipaddress.ip_address(x["host"]) for x in real] assert len(ips) > 3, "Expecting multiple addresses" async def test_threaded_negative_lookup() -> None: loop = Mock() ips = [] loop.getaddrinfo = fake_addrinfo(ips) resolver = ThreadedResolver(loop=loop) with pytest.raises(socket.gaierror): await resolver.resolve("doesnotexist.bla") async def test_threaded_negative_lookup_with_unknown_result() -> None: loop = Mock() # If compile CPython with `--disable-ipv6` option, # we will get an (int, bytes) tuple, instead of a Exception. async def unknown_addrinfo(*args: Any, **kwargs: Any) -> List[Any]: return [ ( socket.AF_INET6, socket.SOCK_STREAM, 6, "", (10, b"\x01\xbb\x00\x00\x00\x00*\x04NB\x00\x1a\x00\x00"), ) ] loop.getaddrinfo = unknown_addrinfo resolver = ThreadedResolver() resolver._loop = loop with patch("socket.has_ipv6", False): res = await resolver.resolve("www.python.org") assert len(res) == 0 async def test_close_for_threaded_resolver(loop) -> None: resolver = ThreadedResolver() await resolver.close() @pytest.mark.skipif(aiodns is None, reason="aiodns required") async def test_close_for_async_resolver(loop) -> None: resolver = AsyncResolver(loop=loop) await resolver.close() async def test_default_loop_for_threaded_resolver(loop) -> None: asyncio.set_event_loop(loop) resolver = ThreadedResolver() assert resolver._loop is loop @pytest.mark.skipif(aiodns is None, reason="aiodns required") async def test_default_loop_for_async_resolver(loop) -> None: asyncio.set_event_loop(loop) resolver = AsyncResolver() assert resolver._loop is loop @pytest.mark.skipif(not gethostbyname, reason="aiodns 1.1 required") async def test_async_resolver_ipv6_positive_lookup(loop) -> None: with patch("aiodns.DNSResolver") as mock: mock().gethostbyname.return_value = fake_result(["::1"]) resolver = AsyncResolver(loop=loop) real = await resolver.resolve("www.python.org", family=socket.AF_INET6) ipaddress.ip_address(real[0]["host"]) mock().gethostbyname.assert_called_with("www.python.org", socket.AF_INET6) @pytest.mark.skipif(aiodns is None, reason="aiodns required") async def test_async_resolver_query_ipv6_positive_lookup(loop) -> None: with patch("aiodns.DNSResolver") as mock: del mock().gethostbyname mock().query.return_value = fake_query_result(["::1"]) resolver = AsyncResolver(loop=loop) real = await resolver.resolve("www.python.org", family=socket.AF_INET6) ipaddress.ip_address(real[0]["host"]) mock().query.assert_called_with("www.python.org", "AAAA") async def test_async_resolver_aiodns_not_present(loop, monkeypatch) -> None: monkeypatch.setattr("aiohttp.resolver.aiodns", None) with pytest.raises(RuntimeError): AsyncResolver(loop=loop) def test_default_resolver() -> None: # if gethostbyname: # assert DefaultResolver is AsyncResolver # else: # assert DefaultResolver is ThreadedResolver assert DefaultResolver is ThreadedResolver ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_route_def.py0000644000175100001770000001604714607525266017361 0ustar00runnerdockerimport pathlib import pytest from yarl import URL from aiohttp import web from aiohttp.web_urldispatcher import UrlDispatcher @pytest.fixture def router(): return UrlDispatcher() def test_get(router) -> None: async def handler(request): pass router.add_routes([web.get("/", handler)]) assert len(router.routes()) == 2 # GET and HEAD route = list(router.routes())[1] assert route.handler is handler assert route.method == "GET" assert str(route.url_for()) == "/" route2 = list(router.routes())[0] assert route2.handler is handler assert route2.method == "HEAD" def test_head(router) -> None: async def handler(request): pass router.add_routes([web.head("/", handler)]) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.handler is handler assert route.method == "HEAD" assert str(route.url_for()) == "/" def test_options(router) -> None: async def handler(request): pass router.add_routes([web.options("/", handler)]) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.handler is handler assert route.method == "OPTIONS" assert str(route.url_for()) == "/" def test_post(router) -> None: async def handler(request): pass router.add_routes([web.post("/", handler)]) route = list(router.routes())[0] assert route.handler is handler assert route.method == "POST" assert str(route.url_for()) == "/" def test_put(router) -> None: async def handler(request): pass router.add_routes([web.put("/", handler)]) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.handler is handler assert route.method == "PUT" assert str(route.url_for()) == "/" def test_patch(router) -> None: async def handler(request): pass router.add_routes([web.patch("/", handler)]) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.handler is handler assert route.method == "PATCH" assert str(route.url_for()) == "/" def test_delete(router) -> None: async def handler(request): pass router.add_routes([web.delete("/", handler)]) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.handler is handler assert route.method == "DELETE" assert str(route.url_for()) == "/" def test_route(router) -> None: async def handler(request): pass router.add_routes([web.route("OTHER", "/", handler)]) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.handler is handler assert route.method == "OTHER" assert str(route.url_for()) == "/" def test_static(router) -> None: folder = pathlib.Path(__file__).parent router.add_routes([web.static("/prefix", folder)]) assert len(router.resources()) == 1 # 2 routes: for HEAD and GET resource = list(router.resources())[0] info = resource.get_info() assert info["prefix"] == "/prefix" assert info["directory"] == folder url = resource.url_for(filename="aiohttp.png") assert url == URL("/prefix/aiohttp.png") def test_head_deco(router) -> None: routes = web.RouteTableDef() @routes.head("/path") async def handler(request): pass router.add_routes(routes) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.method == "HEAD" assert str(route.url_for()) == "/path" def test_get_deco(router) -> None: routes = web.RouteTableDef() @routes.get("/path") async def handler(request): pass router.add_routes(routes) assert len(router.routes()) == 2 route1 = list(router.routes())[0] assert route1.method == "HEAD" assert str(route1.url_for()) == "/path" route2 = list(router.routes())[1] assert route2.method == "GET" assert str(route2.url_for()) == "/path" def test_post_deco(router) -> None: routes = web.RouteTableDef() @routes.post("/path") async def handler(request): pass router.add_routes(routes) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.method == "POST" assert str(route.url_for()) == "/path" def test_put_deco(router) -> None: routes = web.RouteTableDef() @routes.put("/path") async def handler(request): pass router.add_routes(routes) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.method == "PUT" assert str(route.url_for()) == "/path" def test_patch_deco(router) -> None: routes = web.RouteTableDef() @routes.patch("/path") async def handler(request): pass router.add_routes(routes) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.method == "PATCH" assert str(route.url_for()) == "/path" def test_delete_deco(router) -> None: routes = web.RouteTableDef() @routes.delete("/path") async def handler(request): pass router.add_routes(routes) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.method == "DELETE" assert str(route.url_for()) == "/path" def test_options_deco(router) -> None: routes = web.RouteTableDef() @routes.options("/path") async def handler(request): pass router.add_routes(routes) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.method == "OPTIONS" assert str(route.url_for()) == "/path" def test_route_deco(router) -> None: routes = web.RouteTableDef() @routes.route("OTHER", "/path") async def handler(request): pass router.add_routes(routes) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.method == "OTHER" assert str(route.url_for()) == "/path" def test_routedef_sequence_protocol() -> None: routes = web.RouteTableDef() @routes.delete("/path") async def handler(request): pass assert len(routes) == 1 info = routes[0] assert isinstance(info, web.RouteDef) assert info in routes assert list(routes)[0] is info def test_repr_route_def() -> None: routes = web.RouteTableDef() @routes.get("/path") async def handler(request): pass rd = routes[0] assert repr(rd) == " 'handler'>" def test_repr_route_def_with_extra_info() -> None: routes = web.RouteTableDef() @routes.get("/path", extra="info") async def handler(request): pass rd = routes[0] assert repr(rd) == " 'handler', extra='info'>" def test_repr_static_def() -> None: routes = web.RouteTableDef() routes.static("/prefix", "/path", name="name") rd = routes[0] assert repr(rd) == " /path, name='name'>" def test_repr_route_table_def() -> None: routes = web.RouteTableDef() @routes.get("/path") async def handler(request): pass assert repr(routes) == "" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_run_app.py0000644000175100001770000010313214607525266017041 0ustar00runnerdockerimport asyncio import contextlib import logging import os import platform import signal import socket import ssl import subprocess import sys import time from typing import Callable, NoReturn, Set from unittest import mock from uuid import uuid4 import pytest from aiohttp import ClientConnectorError, ClientSession, WSCloseCode, web from aiohttp.test_utils import make_mocked_coro from aiohttp.web_runner import BaseRunner # Test for features of OS' socket support if hasattr(socket, "AF_UNIX"): with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as _abstract_path_sock: try: _abstract_path_sock.bind(b"\x00" + uuid4().hex.encode("ascii")) except FileNotFoundError: _abstract_path_failed = True else: _abstract_path_failed = False finally: del _abstract_path_sock else: _abstract_path_failed = True skip_if_no_abstract_paths = pytest.mark.skipif( _abstract_path_failed, reason="Linux-style abstract paths are not supported." ) del _abstract_path_failed HAS_IPV6 = socket.has_ipv6 if HAS_IPV6: # The socket.has_ipv6 flag may be True if Python was built with IPv6 # support, but the target system still may not have it. # So let's ensure that we really have IPv6 support. try: with socket.socket(socket.AF_INET6, socket.SOCK_STREAM): pass except OSError: HAS_IPV6 = False def skip_if_on_windows(): if platform.system() == "Windows": pytest.skip("the test is not valid for Windows") @pytest.fixture def patched_loop(loop): server = mock.Mock() server.wait_closed = make_mocked_coro(None) loop.create_server = make_mocked_coro(server) unix_server = mock.Mock() unix_server.wait_closed = make_mocked_coro(None) loop.create_unix_server = make_mocked_coro(unix_server) asyncio.set_event_loop(loop) return loop def stopper(loop): def raiser(): raise KeyboardInterrupt def f(*args): loop.call_soon(raiser) return f def test_run_app_http(patched_loop) -> None: app = web.Application() startup_handler = make_mocked_coro() app.on_startup.append(startup_handler) cleanup_handler = make_mocked_coro() app.on_cleanup.append(cleanup_handler) web.run_app(app, print=stopper(patched_loop), loop=patched_loop) patched_loop.create_server.assert_called_with( mock.ANY, None, 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None ) startup_handler.assert_called_once_with(app) cleanup_handler.assert_called_once_with(app) def test_run_app_close_loop(patched_loop) -> None: app = web.Application() web.run_app(app, print=stopper(patched_loop), loop=patched_loop) patched_loop.create_server.assert_called_with( mock.ANY, None, 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None ) assert patched_loop.is_closed() mock_unix_server_single = [ mock.call(mock.ANY, "/tmp/testsock1.sock", ssl=None, backlog=128), ] mock_unix_server_multi = [ mock.call(mock.ANY, "/tmp/testsock1.sock", ssl=None, backlog=128), mock.call(mock.ANY, "/tmp/testsock2.sock", ssl=None, backlog=128), ] mock_server_single = [ mock.call( mock.ANY, "127.0.0.1", 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ), ] mock_server_multi = [ mock.call( mock.ANY, "127.0.0.1", 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ), mock.call( mock.ANY, "192.168.1.1", 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ), ] mock_server_default_8989 = [ mock.call( mock.ANY, None, 8989, ssl=None, backlog=128, reuse_address=None, reuse_port=None ) ] mock_socket = mock.Mock(getsockname=lambda: ("mock-socket", 123)) mixed_bindings_tests = ( ( # type: ignore "Nothing Specified", {}, [ mock.call( mock.ANY, None, 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ) ], [], ), ("Port Only", {"port": 8989}, mock_server_default_8989, []), ("Multiple Hosts", {"host": ("127.0.0.1", "192.168.1.1")}, mock_server_multi, []), ( "Multiple Paths", {"path": ("/tmp/testsock1.sock", "/tmp/testsock2.sock")}, [], mock_unix_server_multi, ), ( "Multiple Paths, Port", {"path": ("/tmp/testsock1.sock", "/tmp/testsock2.sock"), "port": 8989}, mock_server_default_8989, mock_unix_server_multi, ), ( "Multiple Paths, Single Host", {"path": ("/tmp/testsock1.sock", "/tmp/testsock2.sock"), "host": "127.0.0.1"}, mock_server_single, mock_unix_server_multi, ), ( "Single Path, Single Host", {"path": "/tmp/testsock1.sock", "host": "127.0.0.1"}, mock_server_single, mock_unix_server_single, ), ( "Single Path, Multiple Hosts", {"path": "/tmp/testsock1.sock", "host": ("127.0.0.1", "192.168.1.1")}, mock_server_multi, mock_unix_server_single, ), ( "Single Path, Port", {"path": "/tmp/testsock1.sock", "port": 8989}, mock_server_default_8989, mock_unix_server_single, ), ( "Multiple Paths, Multiple Hosts, Port", { "path": ("/tmp/testsock1.sock", "/tmp/testsock2.sock"), "host": ("127.0.0.1", "192.168.1.1"), "port": 8000, }, [ mock.call( mock.ANY, "127.0.0.1", 8000, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ), mock.call( mock.ANY, "192.168.1.1", 8000, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ), ], mock_unix_server_multi, ), ( "Only socket", {"sock": [mock_socket]}, [mock.call(mock.ANY, ssl=None, sock=mock_socket, backlog=128)], [], ), ( "Socket, port", {"sock": [mock_socket], "port": 8765}, [ mock.call( mock.ANY, None, 8765, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ), mock.call(mock.ANY, sock=mock_socket, ssl=None, backlog=128), ], [], ), ( "Socket, Host, No port", {"sock": [mock_socket], "host": "localhost"}, [ mock.call( mock.ANY, "localhost", 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ), mock.call(mock.ANY, sock=mock_socket, ssl=None, backlog=128), ], [], ), ( "reuse_port", {"reuse_port": True}, [ mock.call( mock.ANY, None, 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=True, ) ], [], ), ( "reuse_address", {"reuse_address": False}, [ mock.call( mock.ANY, None, 8080, ssl=None, backlog=128, reuse_address=False, reuse_port=None, ) ], [], ), ( "reuse_port, reuse_address", {"reuse_address": True, "reuse_port": True}, [ mock.call( mock.ANY, None, 8080, ssl=None, backlog=128, reuse_address=True, reuse_port=True, ) ], [], ), ( "Port, reuse_port", {"port": 8989, "reuse_port": True}, [ mock.call( mock.ANY, None, 8989, ssl=None, backlog=128, reuse_address=None, reuse_port=True, ) ], [], ), ( "Multiple Hosts, reuse_port", {"host": ("127.0.0.1", "192.168.1.1"), "reuse_port": True}, [ mock.call( mock.ANY, "127.0.0.1", 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=True, ), mock.call( mock.ANY, "192.168.1.1", 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=True, ), ], [], ), ( "Multiple Paths, Port, reuse_address", { "path": ("/tmp/testsock1.sock", "/tmp/testsock2.sock"), "port": 8989, "reuse_address": False, }, [ mock.call( mock.ANY, None, 8989, ssl=None, backlog=128, reuse_address=False, reuse_port=None, ) ], mock_unix_server_multi, ), ( "Multiple Paths, Single Host, reuse_address, reuse_port", { "path": ("/tmp/testsock1.sock", "/tmp/testsock2.sock"), "host": "127.0.0.1", "reuse_address": True, "reuse_port": True, }, [ mock.call( mock.ANY, "127.0.0.1", 8080, ssl=None, backlog=128, reuse_address=True, reuse_port=True, ), ], mock_unix_server_multi, ), ) mixed_bindings_test_ids = [test[0] for test in mixed_bindings_tests] mixed_bindings_test_params = [test[1:] for test in mixed_bindings_tests] @pytest.mark.parametrize( "run_app_kwargs, expected_server_calls, expected_unix_server_calls", mixed_bindings_test_params, ids=mixed_bindings_test_ids, ) def test_run_app_mixed_bindings( run_app_kwargs, expected_server_calls, expected_unix_server_calls, patched_loop ): app = web.Application() web.run_app(app, print=stopper(patched_loop), **run_app_kwargs, loop=patched_loop) assert patched_loop.create_unix_server.mock_calls == expected_unix_server_calls assert patched_loop.create_server.mock_calls == expected_server_calls def test_run_app_https(patched_loop) -> None: app = web.Application() ssl_context = ssl.create_default_context() web.run_app( app, ssl_context=ssl_context, print=stopper(patched_loop), loop=patched_loop ) patched_loop.create_server.assert_called_with( mock.ANY, None, 8443, ssl=ssl_context, backlog=128, reuse_address=None, reuse_port=None, ) def test_run_app_nondefault_host_port(patched_loop, aiohttp_unused_port) -> None: port = aiohttp_unused_port() host = "127.0.0.1" app = web.Application() web.run_app( app, host=host, port=port, print=stopper(patched_loop), loop=patched_loop ) patched_loop.create_server.assert_called_with( mock.ANY, host, port, ssl=None, backlog=128, reuse_address=None, reuse_port=None ) def test_run_app_multiple_hosts(patched_loop) -> None: hosts = ("127.0.0.1", "127.0.0.2") app = web.Application() web.run_app(app, host=hosts, print=stopper(patched_loop), loop=patched_loop) calls = map( lambda h: mock.call( mock.ANY, h, 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ), hosts, ) patched_loop.create_server.assert_has_calls(calls) def test_run_app_custom_backlog(patched_loop) -> None: app = web.Application() web.run_app(app, backlog=10, print=stopper(patched_loop), loop=patched_loop) patched_loop.create_server.assert_called_with( mock.ANY, None, 8080, ssl=None, backlog=10, reuse_address=None, reuse_port=None ) def test_run_app_custom_backlog_unix(patched_loop) -> None: app = web.Application() web.run_app( app, path="/tmp/tmpsock.sock", backlog=10, print=stopper(patched_loop), loop=patched_loop, ) patched_loop.create_unix_server.assert_called_with( mock.ANY, "/tmp/tmpsock.sock", ssl=None, backlog=10 ) def test_run_app_http_unix_socket(patched_loop, unix_sockname) -> None: app = web.Application() printer = mock.Mock(wraps=stopper(patched_loop)) web.run_app(app, path=unix_sockname, print=printer, loop=patched_loop) patched_loop.create_unix_server.assert_called_with( mock.ANY, unix_sockname, ssl=None, backlog=128 ) assert f"http://unix:{unix_sockname}:" in printer.call_args[0][0] def test_run_app_https_unix_socket(patched_loop, unix_sockname) -> None: app = web.Application() ssl_context = ssl.create_default_context() printer = mock.Mock(wraps=stopper(patched_loop)) web.run_app( app, path=unix_sockname, ssl_context=ssl_context, print=printer, loop=patched_loop, ) patched_loop.create_unix_server.assert_called_with( mock.ANY, unix_sockname, ssl=ssl_context, backlog=128 ) assert f"https://unix:{unix_sockname}:" in printer.call_args[0][0] @pytest.mark.skipif(not hasattr(socket, "AF_UNIX"), reason="requires UNIX sockets") @skip_if_no_abstract_paths def test_run_app_abstract_linux_socket(patched_loop) -> None: sock_path = b"\x00" + uuid4().hex.encode("ascii") app = web.Application() web.run_app( app, path=sock_path.decode("ascii", "ignore"), print=stopper(patched_loop), loop=patched_loop, ) patched_loop.create_unix_server.assert_called_with( mock.ANY, sock_path.decode("ascii"), ssl=None, backlog=128 ) def test_run_app_preexisting_inet_socket(patched_loop, mocker) -> None: app = web.Application() sock = socket.socket() with contextlib.closing(sock): sock.bind(("127.0.0.1", 0)) _, port = sock.getsockname() printer = mock.Mock(wraps=stopper(patched_loop)) web.run_app(app, sock=sock, print=printer, loop=patched_loop) patched_loop.create_server.assert_called_with( mock.ANY, sock=sock, backlog=128, ssl=None ) assert f"http://127.0.0.1:{port}" in printer.call_args[0][0] @pytest.mark.skipif(not HAS_IPV6, reason="IPv6 is not available") def test_run_app_preexisting_inet6_socket(patched_loop) -> None: app = web.Application() sock = socket.socket(socket.AF_INET6) with contextlib.closing(sock): sock.bind(("::1", 0)) port = sock.getsockname()[1] printer = mock.Mock(wraps=stopper(patched_loop)) web.run_app(app, sock=sock, print=printer, loop=patched_loop) patched_loop.create_server.assert_called_with( mock.ANY, sock=sock, backlog=128, ssl=None ) assert f"http://[::1]:{port}" in printer.call_args[0][0] @pytest.mark.skipif(not hasattr(socket, "AF_UNIX"), reason="requires UNIX sockets") def test_run_app_preexisting_unix_socket(patched_loop, mocker) -> None: app = web.Application() sock_path = "/tmp/test_preexisting_sock1" sock = socket.socket(socket.AF_UNIX) with contextlib.closing(sock): sock.bind(sock_path) os.unlink(sock_path) printer = mock.Mock(wraps=stopper(patched_loop)) web.run_app(app, sock=sock, print=printer, loop=patched_loop) patched_loop.create_server.assert_called_with( mock.ANY, sock=sock, backlog=128, ssl=None ) assert f"http://unix:{sock_path}:" in printer.call_args[0][0] def test_run_app_multiple_preexisting_sockets(patched_loop) -> None: app = web.Application() sock1 = socket.socket() sock2 = socket.socket() with contextlib.closing(sock1), contextlib.closing(sock2): sock1.bind(("localhost", 0)) _, port1 = sock1.getsockname() sock2.bind(("localhost", 0)) _, port2 = sock2.getsockname() printer = mock.Mock(wraps=stopper(patched_loop)) web.run_app(app, sock=(sock1, sock2), print=printer, loop=patched_loop) patched_loop.create_server.assert_has_calls( [ mock.call(mock.ANY, sock=sock1, backlog=128, ssl=None), mock.call(mock.ANY, sock=sock2, backlog=128, ssl=None), ] ) assert f"http://127.0.0.1:{port1}" in printer.call_args[0][0] assert f"http://127.0.0.1:{port2}" in printer.call_args[0][0] _script_test_signal = """ from aiohttp import web app = web.Application() web.run_app(app, host=()) """ def test_sigint() -> None: skip_if_on_windows() with subprocess.Popen( [sys.executable, "-u", "-c", _script_test_signal], stdout=subprocess.PIPE, ) as proc: for line in proc.stdout: if line.startswith(b"======== Running on"): break proc.send_signal(signal.SIGINT) assert proc.wait() == 0 def test_sigterm() -> None: skip_if_on_windows() with subprocess.Popen( [sys.executable, "-u", "-c", _script_test_signal], stdout=subprocess.PIPE, ) as proc: for line in proc.stdout: if line.startswith(b"======== Running on"): break proc.terminate() assert proc.wait() == 0 def test_startup_cleanup_signals_even_on_failure(patched_loop) -> None: patched_loop.create_server = mock.Mock(side_effect=RuntimeError()) app = web.Application() startup_handler = make_mocked_coro() app.on_startup.append(startup_handler) cleanup_handler = make_mocked_coro() app.on_cleanup.append(cleanup_handler) with pytest.raises(RuntimeError): web.run_app(app, print=stopper(patched_loop), loop=patched_loop) startup_handler.assert_called_once_with(app) cleanup_handler.assert_called_once_with(app) def test_run_app_coro(patched_loop) -> None: startup_handler = cleanup_handler = None async def make_app(): nonlocal startup_handler, cleanup_handler app = web.Application() startup_handler = make_mocked_coro() app.on_startup.append(startup_handler) cleanup_handler = make_mocked_coro() app.on_cleanup.append(cleanup_handler) return app web.run_app(make_app(), print=stopper(patched_loop), loop=patched_loop) patched_loop.create_server.assert_called_with( mock.ANY, None, 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None ) startup_handler.assert_called_once_with(mock.ANY) cleanup_handler.assert_called_once_with(mock.ANY) def test_run_app_default_logger(monkeypatch, patched_loop): patched_loop.set_debug(True) logger = web.access_logger attrs = { "hasHandlers.return_value": False, "level": logging.NOTSET, "name": "aiohttp.access", } mock_logger = mock.create_autospec(logger, name="mock_access_logger") mock_logger.configure_mock(**attrs) app = web.Application() web.run_app( app, print=stopper(patched_loop), access_log=mock_logger, loop=patched_loop, ) mock_logger.setLevel.assert_any_call(logging.DEBUG) mock_logger.hasHandlers.assert_called_with() assert isinstance(mock_logger.addHandler.call_args[0][0], logging.StreamHandler) def test_run_app_default_logger_setup_requires_debug(patched_loop): patched_loop.set_debug(False) logger = web.access_logger attrs = { "hasHandlers.return_value": False, "level": logging.NOTSET, "name": "aiohttp.access", } mock_logger = mock.create_autospec(logger, name="mock_access_logger") mock_logger.configure_mock(**attrs) app = web.Application() web.run_app( app, print=stopper(patched_loop), access_log=mock_logger, loop=patched_loop, ) mock_logger.setLevel.assert_not_called() mock_logger.hasHandlers.assert_not_called() mock_logger.addHandler.assert_not_called() def test_run_app_default_logger_setup_requires_default_logger(patched_loop): patched_loop.set_debug(True) logger = web.access_logger attrs = { "hasHandlers.return_value": False, "level": logging.NOTSET, "name": None, } mock_logger = mock.create_autospec(logger, name="mock_access_logger") mock_logger.configure_mock(**attrs) app = web.Application() web.run_app( app, print=stopper(patched_loop), access_log=mock_logger, loop=patched_loop, ) mock_logger.setLevel.assert_not_called() mock_logger.hasHandlers.assert_not_called() mock_logger.addHandler.assert_not_called() def test_run_app_default_logger_setup_only_if_unconfigured(patched_loop): patched_loop.set_debug(True) logger = web.access_logger attrs = { "hasHandlers.return_value": True, "level": None, "name": "aiohttp.access", } mock_logger = mock.create_autospec(logger, name="mock_access_logger") mock_logger.configure_mock(**attrs) app = web.Application() web.run_app( app, print=stopper(patched_loop), access_log=mock_logger, loop=patched_loop, ) mock_logger.setLevel.assert_not_called() mock_logger.hasHandlers.assert_called_with() mock_logger.addHandler.assert_not_called() def test_run_app_cancels_all_pending_tasks(patched_loop): app = web.Application() task = None async def on_startup(app): nonlocal task loop = asyncio.get_event_loop() task = loop.create_task(asyncio.sleep(1000)) app.on_startup.append(on_startup) web.run_app(app, print=stopper(patched_loop), loop=patched_loop) assert task.cancelled() def test_run_app_cancels_done_tasks(patched_loop): app = web.Application() task = None async def coro(): return 123 async def on_startup(app): nonlocal task loop = asyncio.get_event_loop() task = loop.create_task(coro()) app.on_startup.append(on_startup) web.run_app(app, print=stopper(patched_loop), loop=patched_loop) assert task.done() def test_run_app_cancels_failed_tasks(patched_loop): app = web.Application() task = None exc = RuntimeError("FAIL") async def fail(): try: await asyncio.sleep(1000) except asyncio.CancelledError: raise exc async def on_startup(app): nonlocal task loop = asyncio.get_event_loop() task = loop.create_task(fail()) await asyncio.sleep(0.01) app.on_startup.append(on_startup) exc_handler = mock.Mock() patched_loop.set_exception_handler(exc_handler) web.run_app(app, print=stopper(patched_loop), loop=patched_loop) assert task.done() msg = { "message": "unhandled exception during asyncio.run() shutdown", "exception": exc, "task": task, } exc_handler.assert_called_with(patched_loop, msg) def test_run_app_keepalive_timeout(patched_loop, mocker, monkeypatch): new_timeout = 1234 base_runner_init_orig = BaseRunner.__init__ def base_runner_init_spy(self, *args, **kwargs): assert kwargs["keepalive_timeout"] == new_timeout base_runner_init_orig(self, *args, **kwargs) app = web.Application() monkeypatch.setattr(BaseRunner, "__init__", base_runner_init_spy) web.run_app( app, keepalive_timeout=new_timeout, print=stopper(patched_loop), loop=patched_loop, ) def test_run_app_context_vars(patched_loop): from contextvars import ContextVar count = 0 VAR = ContextVar("VAR", default="default") async def on_startup(app): nonlocal count assert "init" == VAR.get() VAR.set("on_startup") count += 1 async def on_cleanup(app): nonlocal count assert "on_startup" == VAR.get() count += 1 async def init(): nonlocal count assert "default" == VAR.get() VAR.set("init") app = web.Application() app.on_startup.append(on_startup) app.on_cleanup.append(on_cleanup) count += 1 return app web.run_app(init(), print=stopper(patched_loop), loop=patched_loop) assert count == 3 class TestShutdown: def raiser(self) -> NoReturn: raise KeyboardInterrupt async def stop(self, request: web.Request) -> web.Response: asyncio.get_running_loop().call_soon(self.raiser) return web.Response() def run_app(self, port: int, timeout: int, task, extra_test=None) -> asyncio.Task: async def test() -> None: await asyncio.sleep(0.5) async with ClientSession() as sess: for _ in range(5): # pragma: no cover try: async with sess.get(f"http://localhost:{port}/"): pass except ClientConnectorError: await asyncio.sleep(0.5) else: break async with sess.get(f"http://localhost:{port}/stop"): pass if extra_test: await extra_test(sess) async def run_test(app: web.Application) -> None: nonlocal test_task test_task = asyncio.create_task(test()) yield await test_task async def handler(request: web.Request) -> web.Response: nonlocal t t = asyncio.create_task(task()) return web.Response(text="FOO") t = test_task = None app = web.Application() app.cleanup_ctx.append(run_test) app.router.add_get("/", handler) app.router.add_get("/stop", self.stop) web.run_app(app, port=port, shutdown_timeout=timeout) assert test_task.exception() is None return t def test_shutdown_wait_for_task( self, aiohttp_unused_port: Callable[[], int] ) -> None: port = aiohttp_unused_port() finished = False async def task(): nonlocal finished await asyncio.sleep(2) finished = True t = self.run_app(port, 3, task) assert finished is True assert t.done() assert not t.cancelled() def test_shutdown_timeout_task( self, aiohttp_unused_port: Callable[[], int] ) -> None: port = aiohttp_unused_port() finished = False async def task(): nonlocal finished await asyncio.sleep(2) finished = True t = self.run_app(port, 1, task) assert finished is False assert t.done() assert t.cancelled() def test_shutdown_wait_for_spawned_task( self, aiohttp_unused_port: Callable[[], int] ) -> None: port = aiohttp_unused_port() finished = False finished_sub = False sub_t = None async def sub_task(): nonlocal finished_sub await asyncio.sleep(1.5) finished_sub = True async def task(): nonlocal finished, sub_t await asyncio.sleep(0.5) sub_t = asyncio.create_task(sub_task()) finished = True t = self.run_app(port, 3, task) assert finished is True assert t.done() assert not t.cancelled() assert finished_sub is True assert sub_t.done() assert not sub_t.cancelled() def test_shutdown_timeout_not_reached( self, aiohttp_unused_port: Callable[[], int] ) -> None: port = aiohttp_unused_port() finished = False async def task(): nonlocal finished await asyncio.sleep(1) finished = True start_time = time.time() t = self.run_app(port, 15, task) assert finished is True assert t.done() # Verify run_app has not waited for timeout. assert time.time() - start_time < 10 def test_shutdown_new_conn_rejected( self, aiohttp_unused_port: Callable[[], int] ) -> None: port = aiohttp_unused_port() finished = False async def task() -> None: nonlocal finished await asyncio.sleep(9) finished = True async def test(sess: ClientSession) -> None: # Ensure we are in the middle of shutdown (waiting for task()). await asyncio.sleep(1) with pytest.raises(ClientConnectorError): # Use a new session to try and open a new connection. async with ClientSession() as sess: async with sess.get(f"http://localhost:{port}/"): pass assert finished is False t = self.run_app(port, 10, task, test) assert finished is True assert t.done() def test_shutdown_pending_handler_responds( self, aiohttp_unused_port: Callable[[], int] ) -> None: port = aiohttp_unused_port() finished = False async def test() -> None: async def test_resp(sess): async with sess.get(f"http://localhost:{port}/") as resp: assert await resp.text() == "FOO" await asyncio.sleep(1) async with ClientSession() as sess: t = asyncio.create_task(test_resp(sess)) await asyncio.sleep(1) # Handler is in-progress while we trigger server shutdown. async with sess.get(f"http://localhost:{port}/stop"): pass assert finished is False # Handler should still complete and produce a response. await t async def run_test(app: web.Application) -> None: nonlocal t t = asyncio.create_task(test()) yield await t async def handler(request: web.Request) -> web.Response: nonlocal finished await asyncio.sleep(3) finished = True return web.Response(text="FOO") t = None app = web.Application() app.cleanup_ctx.append(run_test) app.router.add_get("/", handler) app.router.add_get("/stop", self.stop) web.run_app(app, port=port, shutdown_timeout=5) assert t.exception() is None assert finished is True def test_shutdown_close_idle_keepalive( self, aiohttp_unused_port: Callable[[], int] ) -> None: port = aiohttp_unused_port() async def test() -> None: await asyncio.sleep(1) async with ClientSession() as sess: async with sess.get(f"http://localhost:{port}/stop"): pass # Hold on to keep-alive connection. await asyncio.sleep(5) async def run_test(app: web.Application) -> None: nonlocal t t = asyncio.create_task(test()) yield t.cancel() with contextlib.suppress(asyncio.CancelledError): await t t = None app = web.Application() app.cleanup_ctx.append(run_test) app.router.add_get("/stop", self.stop) web.run_app(app, port=port, shutdown_timeout=10) # If connection closed, then test() will be cancelled in cleanup_ctx. # If not, then shutdown_timeout will allow it to sleep until complete. assert t.cancelled() def test_shutdown_close_websockets( self, aiohttp_unused_port: Callable[[], int] ) -> None: port = aiohttp_unused_port() WS = web.AppKey("ws", Set[web.WebSocketResponse]) client_finished = server_finished = False async def ws_handler(request: web.Request) -> web.WebSocketResponse: ws = web.WebSocketResponse() await ws.prepare(request) request.app[WS].add(ws) async for msg in ws: pass nonlocal server_finished server_finished = True return ws async def close_websockets(app: web.Application) -> None: for ws in app[WS]: await ws.close(code=WSCloseCode.GOING_AWAY) async def test() -> None: await asyncio.sleep(1) async with ClientSession() as sess: async with sess.ws_connect(f"http://localhost:{port}/ws") as ws: async with sess.get(f"http://localhost:{port}/stop"): pass async for msg in ws: pass nonlocal client_finished client_finished = True async def run_test(app: web.Application) -> None: nonlocal t t = asyncio.create_task(test()) yield t.cancel() with contextlib.suppress(asyncio.CancelledError): await t t = None app = web.Application() app[WS] = set() app.on_shutdown.append(close_websockets) app.cleanup_ctx.append(run_test) app.router.add_get("/ws", ws_handler) app.router.add_get("/stop", self.stop) start = time.time() web.run_app(app, port=port, shutdown_timeout=10) assert time.time() - start < 5 assert client_finished assert server_finished ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_streams.py0000644000175100001770000013307214607525266017061 0ustar00runnerdocker# Tests for streams.py import abc import asyncio import gc import types from collections import defaultdict from itertools import groupby from unittest import mock import pytest from re_assert import Matches from aiohttp import streams DATA = b"line1\nline2\nline3\n" def chunkify(seq, n): for i in range(0, len(seq), n): yield seq[i : i + n] async def create_stream(): loop = asyncio.get_event_loop() protocol = mock.Mock(_reading_paused=False) stream = streams.StreamReader(protocol, 2**16, loop=loop) stream.feed_data(DATA) stream.feed_eof() return stream @pytest.fixture def protocol(): return mock.Mock(_reading_paused=False) MEMLEAK_SKIP_TYPES = ( *(getattr(types, name) for name in types.__all__ if name.endswith("Type")), mock.Mock, abc.ABCMeta, ) def get_memory_usage(obj): objs = [obj] # Memory leak may be caused by leaked links to same objects. # Without link counting, [1,2,3] is indistinguishable from [1,2,3,3,3,3,3,3] known = defaultdict(int) known[id(obj)] += 1 while objs: refs = gc.get_referents(*objs) objs = [] for obj in refs: if isinstance(obj, MEMLEAK_SKIP_TYPES): continue i = id(obj) known[i] += 1 if known[i] == 1: objs.append(obj) # Make list of unhashable objects uniq objs.sort(key=id) objs = [next(g) for (i, g) in groupby(objs, id)] return sum(known.values()) class TestStreamReader: DATA = b"line1\nline2\nline3\n" def _make_one(self, *args, **kwargs): kwargs.setdefault("limit", 2**16) return streams.StreamReader(mock.Mock(_reading_paused=False), *args, **kwargs) async def test_create_waiter(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one(loop=loop) stream._waiter = loop.create_future with pytest.raises(RuntimeError): await stream._wait("test") def test_ctor_global_loop(self) -> None: loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) try: stream = streams.StreamReader(mock.Mock(_reading_paused=False), 2**16) assert stream._loop is loop finally: # Otherwise an unstopped/unclosed loop affects the next test # Cleanup, leaks into `test_at_eof` otherwise: loop.stop() loop.run_forever() loop.close() gc.collect() async def test_at_eof(self) -> None: stream = self._make_one() assert not stream.at_eof() stream.feed_data(b"some data\n") assert not stream.at_eof() await stream.readline() assert not stream.at_eof() stream.feed_data(b"some data\n") stream.feed_eof() await stream.readline() assert stream.at_eof() async def test_wait_eof(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() wait_task = loop.create_task(stream.wait_eof()) async def cb(): await asyncio.sleep(0.1) stream.feed_eof() loop.create_task(cb()) await wait_task assert stream.is_eof() assert stream._eof_waiter is None async def test_wait_eof_eof(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() stream.feed_eof() wait_task = loop.create_task(stream.wait_eof()) await wait_task assert stream.is_eof() async def test_feed_empty_data(self) -> None: stream = self._make_one() stream.feed_data(b"") stream.feed_eof() data = await stream.read() assert b"" == data async def test_feed_nonempty_data(self) -> None: stream = self._make_one() stream.feed_data(self.DATA) stream.feed_eof() data = await stream.read() assert self.DATA == data async def test_read_zero(self) -> None: # Read zero bytes. stream = self._make_one() stream.feed_data(self.DATA) data = await stream.read(0) assert b"" == data stream.feed_eof() data = await stream.read() assert self.DATA == data async def test_read(self) -> None: loop = asyncio.get_event_loop() # Read bytes. stream = self._make_one() read_task = loop.create_task(stream.read(30)) def cb(): stream.feed_data(self.DATA) loop.call_soon(cb) data = await read_task assert self.DATA == data stream.feed_eof() data = await stream.read() assert b"" == data async def test_read_line_breaks(self) -> None: # Read bytes without line breaks. stream = self._make_one() stream.feed_data(b"line1") stream.feed_data(b"line2") data = await stream.read(5) assert b"line1" == data data = await stream.read(5) assert b"line2" == data async def test_read_all(self) -> None: # Read all available buffered bytes stream = self._make_one() stream.feed_data(b"line1") stream.feed_data(b"line2") stream.feed_eof() data = await stream.read() assert b"line1line2" == data async def test_read_up_to(self) -> None: # Read available buffered bytes up to requested amount stream = self._make_one() stream.feed_data(b"line1") stream.feed_data(b"line2") data = await stream.read(8) assert b"line1lin" == data data = await stream.read(8) assert b"e2" == data async def test_read_eof(self) -> None: loop = asyncio.get_event_loop() # Read bytes, stop at eof. stream = self._make_one() read_task = loop.create_task(stream.read(1024)) def cb(): stream.feed_eof() loop.call_soon(cb) data = await read_task assert b"" == data data = await stream.read() assert data == b"" async def test_read_eof_infinite(self) -> None: # Read bytes. stream = self._make_one() stream.feed_eof() with mock.patch("aiohttp.streams.internal_logger") as internal_logger: await stream.read() await stream.read() await stream.read() await stream.read() await stream.read() await stream.read() assert internal_logger.warning.called async def test_read_eof_unread_data_no_warning(self) -> None: # Read bytes. stream = self._make_one() stream.feed_eof() with mock.patch("aiohttp.streams.internal_logger") as internal_logger: await stream.read() await stream.read() await stream.read() await stream.read() await stream.read() with pytest.deprecated_call( match=r"^unread_data\(\) is deprecated and will be " r"removed in future releases \(#3260\)$", ): stream.unread_data(b"data") await stream.read() await stream.read() assert not internal_logger.warning.called async def test_read_until_eof(self) -> None: loop = asyncio.get_event_loop() # Read all bytes until eof. stream = self._make_one() read_task = loop.create_task(stream.read(-1)) def cb(): stream.feed_data(b"chunk1\n") stream.feed_data(b"chunk2") stream.feed_eof() loop.call_soon(cb) data = await read_task assert b"chunk1\nchunk2" == data data = await stream.read() assert b"" == data async def test_read_exception(self) -> None: stream = self._make_one() stream.feed_data(b"line\n") data = await stream.read(2) assert b"li" == data stream.set_exception(ValueError()) with pytest.raises(ValueError): await stream.read(2) async def test_readline(self) -> None: loop = asyncio.get_event_loop() # Read one line. 'readline' will need to wait for the data # to come from 'cb' stream = self._make_one() stream.feed_data(b"chunk1 ") read_task = loop.create_task(stream.readline()) def cb(): stream.feed_data(b"chunk2 ") stream.feed_data(b"chunk3 ") stream.feed_data(b"\n chunk4") loop.call_soon(cb) line = await read_task assert b"chunk1 chunk2 chunk3 \n" == line stream.feed_eof() data = await stream.read() assert b" chunk4" == data async def test_readline_limit_with_existing_data(self) -> None: # Read one line. The data is in StreamReader's buffer # before the event loop is run. stream = self._make_one(limit=2) stream.feed_data(b"li") stream.feed_data(b"ne1\nline2\n") with pytest.raises(ValueError): await stream.readline() # The buffer should contain the remaining data after exception stream.feed_eof() data = await stream.read() assert b"line2\n" == data async def test_readline_limit(self) -> None: loop = asyncio.get_event_loop() # Read one line. StreamReaders are fed with data after # their 'readline' methods are called. stream = self._make_one(limit=4) def cb(): stream.feed_data(b"chunk1") stream.feed_data(b"chunk2\n") stream.feed_data(b"chunk3\n") stream.feed_eof() loop.call_soon(cb) with pytest.raises(ValueError): await stream.readline() data = await stream.read() assert b"chunk3\n" == data async def test_readline_nolimit_nowait(self) -> None: # All needed data for the first 'readline' call will be # in the buffer. stream = self._make_one() stream.feed_data(self.DATA[:6]) stream.feed_data(self.DATA[6:]) line = await stream.readline() assert b"line1\n" == line stream.feed_eof() data = await stream.read() assert b"line2\nline3\n" == data async def test_readline_eof(self) -> None: stream = self._make_one() stream.feed_data(b"some data") stream.feed_eof() line = await stream.readline() assert b"some data" == line async def test_readline_empty_eof(self) -> None: stream = self._make_one() stream.feed_eof() line = await stream.readline() assert b"" == line async def test_readline_read_byte_count(self) -> None: stream = self._make_one() stream.feed_data(self.DATA) await stream.readline() data = await stream.read(7) assert b"line2\nl" == data stream.feed_eof() data = await stream.read() assert b"ine3\n" == data async def test_readline_exception(self) -> None: stream = self._make_one() stream.feed_data(b"line\n") data = await stream.readline() assert b"line\n" == data stream.set_exception(ValueError()) with pytest.raises(ValueError): await stream.readline() @pytest.mark.parametrize("separator", [b"*", b"**"]) async def test_readuntil(self, separator: bytes) -> None: loop = asyncio.get_event_loop() # Read one chunk. 'readuntil' will need to wait for the data # to come from 'cb' stream = self._make_one() stream.feed_data(b"chunk1 ") read_task = loop.create_task(stream.readuntil(separator)) def cb(): stream.feed_data(b"chunk2 ") stream.feed_data(b"chunk3 ") stream.feed_data(separator + b" chunk4") loop.call_soon(cb) line = await read_task assert b"chunk1 chunk2 chunk3 " + separator == line stream.feed_eof() data = await stream.read() assert b" chunk4" == data @pytest.mark.parametrize("separator", [b"&", b"&&"]) async def test_readuntil_limit_with_existing_data(self, separator: bytes) -> None: # Read one chunk. The data is in StreamReader's buffer # before the event loop is run. stream = self._make_one(limit=2) stream.feed_data(b"li") stream.feed_data(b"ne1" + separator + b"line2" + separator) with pytest.raises(ValueError): await stream.readuntil(separator) # The buffer should contain the remaining data after exception stream.feed_eof() data = await stream.read() assert b"line2" + separator == data @pytest.mark.parametrize("separator", [b"$", b"$$"]) async def test_readuntil_limit(self, separator: bytes) -> None: loop = asyncio.get_event_loop() # Read one chunk. StreamReaders are fed with data after # their 'readuntil' methods are called. stream = self._make_one(limit=4) def cb(): stream.feed_data(b"chunk1") stream.feed_data(b"chunk2" + separator) stream.feed_data(b"chunk3#") stream.feed_eof() loop.call_soon(cb) with pytest.raises(ValueError, match="Chunk too big"): await stream.readuntil(separator) data = await stream.read() assert b"chunk3#" == data @pytest.mark.parametrize("separator", [b"!", b"!!"]) async def test_readuntil_nolimit_nowait(self, separator: bytes) -> None: # All needed data for the first 'readuntil' call will be # in the buffer. seplen = len(separator) stream = self._make_one() data = b"line1" + separator + b"line2" + separator + b"line3" + separator stream.feed_data(data[: 5 + seplen]) stream.feed_data(data[5 + seplen :]) line = await stream.readuntil(separator) assert b"line1" + separator == line stream.feed_eof() data = await stream.read() assert b"line2" + separator + b"line3" + separator == data @pytest.mark.parametrize("separator", [b"@", b"@@"]) async def test_readuntil_eof(self, separator: bytes) -> None: stream = self._make_one() stream.feed_data(b"some data") stream.feed_eof() line = await stream.readuntil(separator) assert b"some data" == line @pytest.mark.parametrize("separator", [b"@", b"@@"]) async def test_readuntil_empty_eof(self, separator: bytes) -> None: stream = self._make_one() stream.feed_eof() line = await stream.readuntil(separator) assert b"" == line @pytest.mark.parametrize("separator", [b"!", b"!!"]) async def test_readuntil_read_byte_count(self, separator: bytes) -> None: seplen = len(separator) stream = self._make_one() stream.feed_data( b"line1" + separator + b"line2" + separator + b"line3" + separator ) await stream.readuntil(separator) data = await stream.read(6 + seplen) assert b"line2" + separator + b"l" == data stream.feed_eof() data = await stream.read() assert b"ine3" + separator == data @pytest.mark.parametrize("separator", [b"#", b"##"]) async def test_readuntil_exception(self, separator: bytes) -> None: stream = self._make_one() stream.feed_data(b"line" + separator) data = await stream.readuntil(separator) assert b"line" + separator == data stream.set_exception(ValueError("Another exception")) with pytest.raises(ValueError, match="Another exception"): await stream.readuntil(separator) async def test_readexactly_zero_or_less(self) -> None: # Read exact number of bytes (zero or less). stream = self._make_one() stream.feed_data(self.DATA) data = await stream.readexactly(0) assert b"" == data stream.feed_eof() data = await stream.read() assert self.DATA == data stream = self._make_one() stream.feed_data(self.DATA) data = await stream.readexactly(-1) assert b"" == data stream.feed_eof() data = await stream.read() assert self.DATA == data async def test_readexactly(self) -> None: loop = asyncio.get_event_loop() # Read exact number of bytes. stream = self._make_one() n = 2 * len(self.DATA) read_task = loop.create_task(stream.readexactly(n)) def cb(): stream.feed_data(self.DATA) stream.feed_data(self.DATA) stream.feed_data(self.DATA) loop.call_soon(cb) data = await read_task assert self.DATA + self.DATA == data stream.feed_eof() data = await stream.read() assert self.DATA == data async def test_readexactly_eof(self) -> None: loop = asyncio.get_event_loop() # Read exact number of bytes (eof). stream = self._make_one(loop=loop) n = 2 * len(self.DATA) read_task = loop.create_task(stream.readexactly(n)) def cb(): stream.feed_data(self.DATA) stream.feed_eof() loop.call_soon(cb) with pytest.raises(asyncio.IncompleteReadError) as cm: await read_task assert cm.value.partial == self.DATA assert cm.value.expected == n assert str(cm.value) == "18 bytes read on a total of 36 expected bytes" data = await stream.read() assert b"" == data async def test_readexactly_exception(self) -> None: stream = self._make_one() stream.feed_data(b"line\n") data = await stream.readexactly(2) assert b"li" == data stream.set_exception(ValueError()) with pytest.raises(ValueError): await stream.readexactly(2) async def test_unread_data(self) -> None: stream = self._make_one() stream.feed_data(b"line1") stream.feed_data(b"line2") stream.feed_data(b"onemoreline") data = await stream.read(5) assert b"line1" == data with pytest.deprecated_call( match=r"^unread_data\(\) is deprecated and will be " r"removed in future releases \(#3260\)$", ): stream.unread_data(data) data = await stream.read(5) assert b"line1" == data data = await stream.read(4) assert b"line" == data with pytest.deprecated_call( match=r"^unread_data\(\) is deprecated and will be " r"removed in future releases \(#3260\)$", ): stream.unread_data(b"line1line") data = b"" while len(data) < 10: data += await stream.read(10) assert b"line1line2" == data data = await stream.read(7) assert b"onemore" == data with pytest.deprecated_call( match=r"^unread_data\(\) is deprecated and will be " r"removed in future releases \(#3260\)$", ): stream.unread_data(data) data = b"" while len(data) < 11: data += await stream.read(11) assert b"onemoreline" == data with pytest.deprecated_call( match=r"^unread_data\(\) is deprecated and will be " r"removed in future releases \(#3260\)$", ): stream.unread_data(b"line") data = await stream.read(4) assert b"line" == data stream.feed_eof() with pytest.deprecated_call( match=r"^unread_data\(\) is deprecated and will be " r"removed in future releases \(#3260\)$", ): stream.unread_data(b"at_eof") data = await stream.read(6) assert b"at_eof" == data async def test_exception(self) -> None: stream = self._make_one() assert stream.exception() is None exc = ValueError() stream.set_exception(exc) assert stream.exception() is exc async def test_exception_waiter(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() async def set_err(): stream.set_exception(ValueError()) t1 = loop.create_task(stream.readline()) t2 = loop.create_task(set_err()) await asyncio.wait([t1, t2]) with pytest.raises(ValueError): t1.result() async def test_exception_cancel(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() async def read_a_line(): await stream.readline() t = loop.create_task(read_a_line()) await asyncio.sleep(0) t.cancel() await asyncio.sleep(0) # The following line fails if set_exception() isn't careful. stream.set_exception(RuntimeError("message")) await asyncio.sleep(0) assert stream._waiter is None async def test_readany_eof(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() read_task = loop.create_task(stream.readany()) loop.call_soon(stream.feed_data, b"chunk1\n") data = await read_task assert b"chunk1\n" == data stream.feed_eof() data = await stream.read() assert b"" == data async def test_readany_empty_eof(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() stream.feed_eof() read_task = loop.create_task(stream.readany()) data = await read_task assert b"" == data async def test_readany_exception(self) -> None: stream = self._make_one() stream.feed_data(b"line\n") data = await stream.readany() assert b"line\n" == data stream.set_exception(ValueError()) with pytest.raises(ValueError): await stream.readany() async def test_read_nowait(self) -> None: stream = self._make_one() stream.feed_data(b"line1\nline2\n") assert stream.read_nowait() == b"line1\nline2\n" assert stream.read_nowait() == b"" stream.feed_eof() data = await stream.read() assert b"" == data async def test_read_nowait_n(self) -> None: stream = self._make_one() stream.feed_data(b"line1\nline2\n") assert stream.read_nowait(4) == b"line" assert stream.read_nowait() == b"1\nline2\n" assert stream.read_nowait() == b"" stream.feed_eof() data = await stream.read() assert b"" == data async def test_read_nowait_exception(self) -> None: stream = self._make_one() stream.feed_data(b"line\n") stream.set_exception(ValueError()) with pytest.raises(ValueError): stream.read_nowait() async def test_read_nowait_waiter(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() stream.feed_data(b"line\n") stream._waiter = loop.create_future() with pytest.raises(RuntimeError): stream.read_nowait() async def test_readchunk(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() def cb(): stream.feed_data(b"chunk1") stream.feed_data(b"chunk2") stream.feed_eof() loop.call_soon(cb) data, end_of_chunk = await stream.readchunk() assert b"chunk1" == data assert not end_of_chunk data, end_of_chunk = await stream.readchunk() assert b"chunk2" == data assert not end_of_chunk data, end_of_chunk = await stream.readchunk() assert b"" == data assert not end_of_chunk async def test_readchunk_wait_eof(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() async def cb(): await asyncio.sleep(0.1) stream.feed_eof() loop.create_task(cb()) data, end_of_chunk = await stream.readchunk() assert b"" == data assert not end_of_chunk assert stream.is_eof() async def test_begin_and_end_chunk_receiving(self) -> None: stream = self._make_one() stream.begin_http_chunk_receiving() stream.feed_data(b"part1") stream.feed_data(b"part2") stream.end_http_chunk_receiving() data, end_of_chunk = await stream.readchunk() assert b"part1part2" == data assert end_of_chunk stream.begin_http_chunk_receiving() stream.feed_data(b"part3") data, end_of_chunk = await stream.readchunk() assert b"part3" == data assert not end_of_chunk stream.end_http_chunk_receiving() data, end_of_chunk = await stream.readchunk() assert b"" == data assert end_of_chunk stream.feed_eof() data, end_of_chunk = await stream.readchunk() assert b"" == data assert not end_of_chunk async def test_readany_chunk_end_race(self) -> None: stream = self._make_one() stream.begin_http_chunk_receiving() stream.feed_data(b"part1") data = await stream.readany() assert data == b"part1" loop = asyncio.get_event_loop() task = loop.create_task(stream.readany()) # Give a chance for task to create waiter and start waiting for it. await asyncio.sleep(0.1) assert stream._waiter is not None assert not task.done() # Just for sure. # This will trigger waiter, but without feeding any data. # The stream should re-create waiter again. stream.end_http_chunk_receiving() # Give a chance for task to resolve. # If everything is OK, previous action SHOULD NOT resolve the task. await asyncio.sleep(0.1) assert not task.done() # The actual test. stream.begin_http_chunk_receiving() # This SHOULD unblock the task actually. stream.feed_data(b"part2") stream.end_http_chunk_receiving() data = await task assert data == b"part2" async def test_end_chunk_receiving_without_begin(self) -> None: stream = self._make_one() with pytest.raises(RuntimeError): stream.end_http_chunk_receiving() async def test_readchunk_with_unread(self) -> None: # Test that stream.unread does not break controlled chunk receiving. stream = self._make_one() # Send 2 chunks stream.begin_http_chunk_receiving() stream.feed_data(b"part1") stream.end_http_chunk_receiving() stream.begin_http_chunk_receiving() stream.feed_data(b"part2") stream.end_http_chunk_receiving() # Read only one chunk data, end_of_chunk = await stream.readchunk() # Try to unread a part of the first chunk with pytest.deprecated_call( match=r"^unread_data\(\) is deprecated and will be " r"removed in future releases \(#3260\)$", ): stream.unread_data(b"rt1") # The end_of_chunk signal was already received for the first chunk, # so we receive up to the second one data, end_of_chunk = await stream.readchunk() assert b"rt1part2" == data assert end_of_chunk # Unread a part of the second chunk with pytest.deprecated_call( match=r"^unread_data\(\) is deprecated and will be " r"removed in future releases \(#3260\)$", ): stream.unread_data(b"rt2") data, end_of_chunk = await stream.readchunk() assert b"rt2" == data # end_of_chunk was already received for this chunk assert not end_of_chunk stream.feed_eof() data, end_of_chunk = await stream.readchunk() assert b"" == data assert not end_of_chunk async def test_readchunk_with_other_read_calls(self) -> None: # Test that stream.readchunk works when other read calls are made on # the stream. stream = self._make_one() stream.begin_http_chunk_receiving() stream.feed_data(b"part1") stream.end_http_chunk_receiving() stream.begin_http_chunk_receiving() stream.feed_data(b"part2") stream.end_http_chunk_receiving() stream.begin_http_chunk_receiving() stream.feed_data(b"part3") stream.end_http_chunk_receiving() data = await stream.read(7) assert b"part1pa" == data data, end_of_chunk = await stream.readchunk() assert b"rt2" == data assert end_of_chunk # Corner case between read/readchunk data = await stream.read(5) assert b"part3" == data data, end_of_chunk = await stream.readchunk() assert b"" == data assert end_of_chunk stream.feed_eof() data, end_of_chunk = await stream.readchunk() assert b"" == data assert not end_of_chunk async def test_chunksplits_memory_leak(self) -> None: # Test for memory leak on chunksplits stream = self._make_one() N = 500 # Warm-up variables stream.begin_http_chunk_receiving() stream.feed_data(b"Y" * N) stream.end_http_chunk_receiving() await stream.read(N) N = 300 before = get_memory_usage(stream) for _ in range(N): stream.begin_http_chunk_receiving() stream.feed_data(b"X") stream.end_http_chunk_receiving() await stream.read(N) after = get_memory_usage(stream) assert abs(after - before) == 0 async def test_read_empty_chunks(self) -> None: # Test that feeding empty chunks does not break stream stream = self._make_one() # Simulate empty first chunk. This is significant special case stream.begin_http_chunk_receiving() stream.end_http_chunk_receiving() stream.begin_http_chunk_receiving() stream.feed_data(b"ungzipped") stream.end_http_chunk_receiving() # Possible when compression is enabled. stream.begin_http_chunk_receiving() stream.end_http_chunk_receiving() # is also possible stream.begin_http_chunk_receiving() stream.end_http_chunk_receiving() stream.begin_http_chunk_receiving() stream.feed_data(b" data") stream.end_http_chunk_receiving() stream.feed_eof() data = await stream.read() assert data == b"ungzipped data" async def test_readchunk_separate_http_chunk_tail(self) -> None: # Test that stream.readchunk returns (b'', True) when end of # http chunk received after body loop = asyncio.get_event_loop() stream = self._make_one() stream.begin_http_chunk_receiving() stream.feed_data(b"part1") data, end_of_chunk = await stream.readchunk() assert b"part1" == data assert not end_of_chunk async def cb(): await asyncio.sleep(0.1) stream.end_http_chunk_receiving() loop.create_task(cb()) data, end_of_chunk = await stream.readchunk() assert b"" == data assert end_of_chunk stream.begin_http_chunk_receiving() stream.feed_data(b"part2") data, end_of_chunk = await stream.readchunk() assert b"part2" == data assert not end_of_chunk stream.end_http_chunk_receiving() stream.begin_http_chunk_receiving() stream.feed_data(b"part3") stream.end_http_chunk_receiving() data, end_of_chunk = await stream.readchunk() assert b"" == data assert end_of_chunk data, end_of_chunk = await stream.readchunk() assert b"part3" == data assert end_of_chunk stream.begin_http_chunk_receiving() stream.feed_data(b"part4") data, end_of_chunk = await stream.readchunk() assert b"part4" == data assert not end_of_chunk async def cb(): await asyncio.sleep(0.1) stream.end_http_chunk_receiving() stream.feed_eof() loop.create_task(cb()) data, end_of_chunk = await stream.readchunk() assert b"" == data assert end_of_chunk data, end_of_chunk = await stream.readchunk() assert b"" == data assert not end_of_chunk async def test___repr__(self) -> None: stream = self._make_one() assert "" == repr(stream) async def test___repr__nondefault_limit(self) -> None: stream = self._make_one(limit=123) assert "" == repr(stream) async def test___repr__eof(self) -> None: stream = self._make_one() stream.feed_eof() assert "" == repr(stream) async def test___repr__data(self) -> None: stream = self._make_one() stream.feed_data(b"data") assert "" == repr(stream) async def test___repr__exception(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one(loop=loop) exc = RuntimeError() stream.set_exception(exc) assert "" == repr(stream) async def test___repr__waiter(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() stream._waiter = loop.create_future() assert Matches(r">") == repr(stream) stream._waiter.set_result(None) await stream._waiter stream._waiter = None assert "" == repr(stream) async def test_unread_empty(self) -> None: stream = self._make_one() stream.feed_data(b"line1") stream.feed_eof() with pytest.deprecated_call( match=r"^unread_data\(\) is deprecated and will be " r"removed in future releases \(#3260\)$", ): stream.unread_data(b"") data = await stream.read(5) assert b"line1" == data assert stream.at_eof() async def test_empty_stream_reader() -> None: s = streams.EmptyStreamReader() assert str(s) is not None assert s.set_exception(ValueError()) is None assert s.exception() is None assert s.feed_eof() is None assert s.feed_data(b"data") is None assert s.at_eof() assert (await s.wait_eof()) is None assert await s.read() == b"" assert await s.readline() == b"" assert await s.readany() == b"" assert await s.readchunk() == (b"", False) assert await s.readchunk() == (b"", True) with pytest.raises(asyncio.IncompleteReadError): await s.readexactly(10) assert s.read_nowait() == b"" async def test_empty_stream_reader_iter_chunks() -> None: s = streams.EmptyStreamReader() # check that iter_chunks() does not cause infinite loop iter_chunks = s.iter_chunks() with pytest.raises(StopAsyncIteration): await iter_chunks.__anext__() @pytest.fixture async def buffer(loop): return streams.DataQueue(loop) class TestDataQueue: def test_is_eof(self, buffer) -> None: assert not buffer.is_eof() buffer.feed_eof() assert buffer.is_eof() def test_at_eof(self, buffer) -> None: assert not buffer.at_eof() buffer.feed_eof() assert buffer.at_eof() buffer._buffer.append(object()) assert not buffer.at_eof() def test_feed_data(self, buffer) -> None: item = object() buffer.feed_data(item, 1) assert [(item, 1)] == list(buffer._buffer) def test_feed_eof(self, buffer) -> None: buffer.feed_eof() assert buffer._eof async def test_read(self, buffer) -> None: loop = asyncio.get_event_loop() item = object() def cb(): buffer.feed_data(item, 1) loop.call_soon(cb) data = await buffer.read() assert item is data async def test_read_eof(self, buffer) -> None: loop = asyncio.get_event_loop() def cb(): buffer.feed_eof() loop.call_soon(cb) with pytest.raises(streams.EofStream): await buffer.read() async def test_read_cancelled(self, buffer) -> None: loop = asyncio.get_event_loop() read_task = loop.create_task(buffer.read()) await asyncio.sleep(0) waiter = buffer._waiter assert asyncio.isfuture(waiter) read_task.cancel() with pytest.raises(asyncio.CancelledError): await read_task assert waiter.cancelled() assert buffer._waiter is None buffer.feed_data(b"test", 4) assert buffer._waiter is None async def test_read_until_eof(self, buffer) -> None: item = object() buffer.feed_data(item, 1) buffer.feed_eof() data = await buffer.read() assert data is item with pytest.raises(streams.EofStream): await buffer.read() async def test_read_exc(self, buffer) -> None: item = object() buffer.feed_data(item) buffer.set_exception(ValueError) data = await buffer.read() assert item is data with pytest.raises(ValueError): await buffer.read() async def test_read_exception(self, buffer) -> None: buffer.set_exception(ValueError()) with pytest.raises(ValueError): await buffer.read() async def test_read_exception_with_data(self, buffer) -> None: val = object() buffer.feed_data(val, 1) buffer.set_exception(ValueError()) assert val is (await buffer.read()) with pytest.raises(ValueError): await buffer.read() async def test_read_exception_on_wait(self, buffer) -> None: loop = asyncio.get_event_loop() read_task = loop.create_task(buffer.read()) await asyncio.sleep(0) assert asyncio.isfuture(buffer._waiter) buffer.feed_eof() buffer.set_exception(ValueError()) with pytest.raises(ValueError): await read_task def test_exception(self, buffer) -> None: assert buffer.exception() is None exc = ValueError() buffer.set_exception(exc) assert buffer.exception() is exc async def test_exception_waiter(self, buffer) -> None: loop = asyncio.get_event_loop() async def set_err(): buffer.set_exception(ValueError()) t1 = loop.create_task(buffer.read()) t2 = loop.create_task(set_err()) await asyncio.wait([t1, t2]) with pytest.raises(ValueError): t1.result() async def test_feed_data_waiters(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2**16, loop=loop) waiter = reader._waiter = loop.create_future() eof_waiter = reader._eof_waiter = loop.create_future() reader.feed_data(b"1") assert list(reader._buffer) == [b"1"] assert reader._size == 1 assert reader.total_bytes == 1 assert waiter.done() assert not eof_waiter.done() assert reader._waiter is None assert reader._eof_waiter is eof_waiter async def test_feed_data_completed_waiters(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2**16, loop=loop) waiter = reader._waiter = loop.create_future() waiter.set_result(1) reader.feed_data(b"1") assert reader._waiter is None async def test_feed_eof_waiters(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2**16, loop=loop) waiter = reader._waiter = loop.create_future() eof_waiter = reader._eof_waiter = loop.create_future() reader.feed_eof() assert reader._eof assert waiter.done() assert eof_waiter.done() assert reader._waiter is None assert reader._eof_waiter is None async def test_feed_eof_cancelled(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2**16, loop=loop) waiter = reader._waiter = loop.create_future() eof_waiter = reader._eof_waiter = loop.create_future() waiter.set_result(1) eof_waiter.set_result(1) reader.feed_eof() assert waiter.done() assert eof_waiter.done() assert reader._waiter is None assert reader._eof_waiter is None async def test_on_eof(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2**16, loop=loop) on_eof = mock.Mock() reader.on_eof(on_eof) assert not on_eof.called reader.feed_eof() assert on_eof.called async def test_on_eof_empty_reader() -> None: reader = streams.EmptyStreamReader() on_eof = mock.Mock() reader.on_eof(on_eof) assert on_eof.called async def test_on_eof_exc_in_callback(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2**16, loop=loop) on_eof = mock.Mock() on_eof.side_effect = ValueError reader.on_eof(on_eof) assert not on_eof.called reader.feed_eof() assert on_eof.called assert not reader._eof_callbacks async def test_on_eof_exc_in_callback_empty_stream_reader() -> None: reader = streams.EmptyStreamReader() on_eof = mock.Mock() on_eof.side_effect = ValueError reader.on_eof(on_eof) assert on_eof.called async def test_on_eof_eof_is_set(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2**16, loop=loop) reader.feed_eof() on_eof = mock.Mock() reader.on_eof(on_eof) assert on_eof.called assert not reader._eof_callbacks async def test_on_eof_eof_is_set_exception(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2**16, loop=loop) reader.feed_eof() on_eof = mock.Mock() on_eof.side_effect = ValueError reader.on_eof(on_eof) assert on_eof.called assert not reader._eof_callbacks async def test_set_exception(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2**16, loop=loop) waiter = reader._waiter = loop.create_future() eof_waiter = reader._eof_waiter = loop.create_future() exc = ValueError() reader.set_exception(exc) assert waiter.exception() is exc assert eof_waiter.exception() is exc assert reader._waiter is None assert reader._eof_waiter is None async def test_set_exception_cancelled(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2**16, loop=loop) waiter = reader._waiter = loop.create_future() eof_waiter = reader._eof_waiter = loop.create_future() waiter.set_result(1) eof_waiter.set_result(1) exc = ValueError() reader.set_exception(exc) assert waiter.exception() is None assert eof_waiter.exception() is None assert reader._waiter is None assert reader._eof_waiter is None async def test_set_exception_eof_callbacks(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2**16, loop=loop) on_eof = mock.Mock() reader.on_eof(on_eof) reader.set_exception(ValueError()) assert not on_eof.called assert not reader._eof_callbacks async def test_stream_reader_lines() -> None: line_iter = iter(DATA.splitlines(keepends=True)) async for line in await create_stream(): assert line == next(line_iter, None) pytest.raises(StopIteration, next, line_iter) async def test_stream_reader_chunks_complete() -> None: # Tests if chunked iteration works if the chunking works out # (i.e. the data is divisible by the chunk size) chunk_iter = chunkify(DATA, 9) async for data in (await create_stream()).iter_chunked(9): assert data == next(chunk_iter, None) pytest.raises(StopIteration, next, chunk_iter) async def test_stream_reader_chunks_incomplete() -> None: # Tests if chunked iteration works if the last chunk is incomplete chunk_iter = chunkify(DATA, 8) async for data in (await create_stream()).iter_chunked(8): assert data == next(chunk_iter, None) pytest.raises(StopIteration, next, chunk_iter) async def test_data_queue_empty() -> None: # Tests that async looping yields nothing if nothing is there loop = asyncio.get_event_loop() buffer = streams.DataQueue(loop) buffer.feed_eof() async for _ in buffer: assert False async def test_data_queue_items() -> None: # Tests that async looping yields objects identically loop = asyncio.get_event_loop() buffer = streams.DataQueue(loop) items = [object(), object()] buffer.feed_data(items[0], 1) buffer.feed_data(items[1], 1) buffer.feed_eof() item_iter = iter(items) async for item in buffer: assert item is next(item_iter, None) pytest.raises(StopIteration, next, item_iter) async def test_stream_reader_iter_any() -> None: it = iter([b"line1\nline2\nline3\n"]) async for raw in (await create_stream()).iter_any(): assert raw == next(it) pytest.raises(StopIteration, next, it) async def test_stream_reader_iter() -> None: it = iter([b"line1\n", b"line2\n", b"line3\n"]) async for raw in await create_stream(): assert raw == next(it) pytest.raises(StopIteration, next, it) async def test_stream_reader_iter_chunks_no_chunked_encoding() -> None: it = iter([b"line1\nline2\nline3\n"]) async for data, end_of_chunk in (await create_stream()).iter_chunks(): assert (data, end_of_chunk) == (next(it), False) pytest.raises(StopIteration, next, it) async def test_stream_reader_iter_chunks_chunked_encoding(protocol) -> None: loop = asyncio.get_event_loop() stream = streams.StreamReader(protocol, 2**16, loop=loop) for line in DATA.splitlines(keepends=True): stream.begin_http_chunk_receiving() stream.feed_data(line) stream.end_http_chunk_receiving() stream.feed_eof() it = iter([b"line1\n", b"line2\n", b"line3\n"]) async for data, end_of_chunk in stream.iter_chunks(): assert (data, end_of_chunk) == (next(it), True) pytest.raises(StopIteration, next, it) def test_isinstance_check() -> None: assert isinstance(streams.EMPTY_PAYLOAD, streams.StreamReader) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_tcp_helpers.py0000644000175100001770000000460014607525266017705 0ustar00runnerdockerimport socket from unittest import mock import pytest from aiohttp.tcp_helpers import tcp_nodelay has_ipv6 = socket.has_ipv6 if has_ipv6: # The socket.has_ipv6 flag may be True if Python was built with IPv6 # support, but the target system still may not have it. # So let's ensure that we really have IPv6 support. try: with socket.socket(socket.AF_INET6, socket.SOCK_STREAM): pass except OSError: has_ipv6 = False # nodelay def test_tcp_nodelay_exception() -> None: transport = mock.Mock() s = mock.Mock() s.setsockopt = mock.Mock() s.family = socket.AF_INET s.setsockopt.side_effect = OSError transport.get_extra_info.return_value = s tcp_nodelay(transport, True) s.setsockopt.assert_called_with(socket.IPPROTO_TCP, socket.TCP_NODELAY, True) def test_tcp_nodelay_enable() -> None: transport = mock.Mock() with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: transport.get_extra_info.return_value = s tcp_nodelay(transport, True) assert s.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY) def test_tcp_nodelay_enable_and_disable() -> None: transport = mock.Mock() with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: transport.get_extra_info.return_value = s tcp_nodelay(transport, True) assert s.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY) tcp_nodelay(transport, False) assert not s.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY) @pytest.mark.skipif(not has_ipv6, reason="IPv6 is not available") def test_tcp_nodelay_enable_ipv6() -> None: transport = mock.Mock() with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s: transport.get_extra_info.return_value = s tcp_nodelay(transport, True) assert s.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY) @pytest.mark.skipif(not hasattr(socket, "AF_UNIX"), reason="requires unix sockets") def test_tcp_nodelay_enable_unix() -> None: # do not set nodelay for unix socket transport = mock.Mock() s = mock.Mock(family=socket.AF_UNIX, type=socket.SOCK_STREAM) transport.get_extra_info.return_value = s tcp_nodelay(transport, True) assert not s.setsockopt.called def test_tcp_nodelay_enable_no_socket() -> None: transport = mock.Mock() transport.get_extra_info.return_value = None tcp_nodelay(transport, True) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_test_utils.py0000644000175100001770000002536514607525266017607 0ustar00runnerdockerimport gzip from socket import socket from typing import Any from unittest import mock import pytest from multidict import CIMultiDict, CIMultiDictProxy from yarl import URL import aiohttp from aiohttp import web from aiohttp.test_utils import ( AioHTTPTestCase, RawTestServer as _RawTestServer, TestClient as _TestClient, TestServer as _TestServer, get_port_socket, loop_context, make_mocked_request, unittest_run_loop, ) _hello_world_str = "Hello, world" _hello_world_bytes = _hello_world_str.encode("utf-8") _hello_world_gz = gzip.compress(_hello_world_bytes) def _create_example_app(): async def hello(request): return web.Response(body=_hello_world_bytes) async def websocket_handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive() if msg.type == aiohttp.WSMsgType.TEXT: if msg.data == "close": await ws.close() else: await ws.send_str(msg.data + "/answer") return ws async def cookie_handler(request): resp = web.Response(body=_hello_world_bytes) resp.set_cookie("cookie", "val") return resp app = web.Application() app.router.add_route("*", "/", hello) app.router.add_route("*", "/websocket", websocket_handler) app.router.add_route("*", "/cookie", cookie_handler) return app # these exist to test the pytest scenario @pytest.fixture def loop(): with loop_context() as loop: yield loop @pytest.fixture def app(): return _create_example_app() @pytest.fixture def test_client(loop, app) -> None: async def make_client(): return _TestClient(_TestServer(app, loop=loop), loop=loop) client = loop.run_until_complete(make_client()) loop.run_until_complete(client.start_server()) yield client loop.run_until_complete(client.close()) def test_with_test_server_fails(loop) -> None: app = _create_example_app() with pytest.raises(TypeError): with _TestServer(app, loop=loop): pass async def test_with_client_fails(loop) -> None: app = _create_example_app() with pytest.raises(TypeError): with _TestClient(_TestServer(app, loop=loop), loop=loop): pass async def test_aiohttp_client_close_is_idempotent() -> None: # a test client, called multiple times, should # not attempt to close the server again. app = _create_example_app() client = _TestClient(_TestServer(app)) await client.close() await client.close() class TestAioHTTPTestCase(AioHTTPTestCase): def get_app(self): return _create_example_app() async def test_example_with_loop(self) -> None: request = await self.client.request("GET", "/") assert request.status == 200 text = await request.text() assert _hello_world_str == text def test_inner_example(self) -> None: async def test_get_route() -> None: resp = await self.client.request("GET", "/") assert resp.status == 200 text = await resp.text() assert _hello_world_str == text self.loop.run_until_complete(test_get_route()) async def test_example_without_explicit_loop(self) -> None: request = await self.client.request("GET", "/") assert request.status == 200 text = await request.text() assert _hello_world_str == text async def test_inner_example_without_explicit_loop(self) -> None: async def test_get_route() -> None: resp = await self.client.request("GET", "/") assert resp.status == 200 text = await resp.text() assert _hello_world_str == text await test_get_route() def test_unittest_run_loop() -> None: with pytest.warns( DeprecationWarning, match=r"Decorator `@unittest_run_loop` is no longer needed in aiohttp 3\.8\+", ): @unittest_run_loop def foo(): pass def test_get_route(loop, test_client) -> None: async def test_get_route() -> None: resp = await test_client.request("GET", "/") assert resp.status == 200 text = await resp.text() assert _hello_world_str == text loop.run_until_complete(test_get_route()) async def test_client_websocket(loop, test_client) -> None: resp = await test_client.ws_connect("/websocket") await resp.send_str("foo") msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.TEXT assert "foo" in msg.data await resp.send_str("close") msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.CLOSE async def test_client_cookie(loop, test_client) -> None: assert not test_client.session.cookie_jar await test_client.get("/cookie") cookies = list(test_client.session.cookie_jar) assert cookies[0].key == "cookie" assert cookies[0].value == "val" @pytest.mark.parametrize( "method", ["get", "post", "options", "post", "put", "patch", "delete"] ) async def test_test_client_methods(method, loop, test_client) -> None: resp = await getattr(test_client, method)("/") assert resp.status == 200 text = await resp.text() assert _hello_world_str == text async def test_test_client_head(loop, test_client) -> None: resp = await test_client.head("/") assert resp.status == 200 @pytest.mark.parametrize("headers", [{"token": "x"}, CIMultiDict({"token": "x"}), {}]) def test_make_mocked_request(headers) -> None: req = make_mocked_request("GET", "/", headers=headers) assert req.method == "GET" assert req.path == "/" assert isinstance(req, web.Request) assert isinstance(req.headers, CIMultiDictProxy) def test_make_mocked_request_sslcontext() -> None: req = make_mocked_request("GET", "/") assert req.transport.get_extra_info("sslcontext") is None def test_make_mocked_request_unknown_extra_info() -> None: req = make_mocked_request("GET", "/") assert req.transport.get_extra_info("unknown_extra_info") is None def test_make_mocked_request_app() -> None: app = mock.Mock() req = make_mocked_request("GET", "/", app=app) assert req.app is app def test_make_mocked_request_app_can_store_values() -> None: req = make_mocked_request("GET", "/") req.app["a_field"] = "a_value" assert req.app["a_field"] == "a_value" def test_make_mocked_request_app_access_non_existing() -> None: req = make_mocked_request("GET", "/") with pytest.raises(AttributeError): req.app.foo def test_make_mocked_request_match_info() -> None: req = make_mocked_request("GET", "/", match_info={"a": "1", "b": "2"}) assert req.match_info == {"a": "1", "b": "2"} def test_make_mocked_request_content() -> None: payload = mock.Mock() req = make_mocked_request("GET", "/", payload=payload) assert req.content is payload def test_make_mocked_request_transport() -> None: transport = mock.Mock() req = make_mocked_request("GET", "/", transport=transport) assert req.transport is transport async def test_test_client_props(loop) -> None: app = _create_example_app() client = _TestClient(_TestServer(app, host="127.0.0.1", loop=loop), loop=loop) assert client.host == "127.0.0.1" assert client.port is None async with client: assert isinstance(client.port, int) assert client.server is not None assert client.app is not None assert client.port is None async def test_test_client_raw_server_props(loop) -> None: async def hello(request): return web.Response(body=_hello_world_bytes) client = _TestClient(_RawTestServer(hello, host="127.0.0.1", loop=loop), loop=loop) assert client.host == "127.0.0.1" assert client.port is None async with client: assert isinstance(client.port, int) assert client.server is not None assert client.app is None assert client.port is None async def test_test_server_context_manager(loop) -> None: app = _create_example_app() async with _TestServer(app, loop=loop) as server: client = aiohttp.ClientSession(loop=loop) resp = await client.head(server.make_url("/")) assert resp.status == 200 resp.close() await client.close() def test_client_unsupported_arg() -> None: with pytest.raises(TypeError) as e: _TestClient("string") assert ( str(e.value) == "server must be TestServer instance, found type: " ) async def test_server_make_url_yarl_compatibility(loop) -> None: app = _create_example_app() async with _TestServer(app, loop=loop) as server: make_url = server.make_url assert make_url(URL("/foo")) == make_url("/foo") with pytest.raises(AssertionError): make_url("http://foo.com") with pytest.raises(AssertionError): make_url(URL("http://foo.com")) def test_testcase_no_app(testdir, loop) -> None: testdir.makepyfile( """ from aiohttp.test_utils import AioHTTPTestCase class InvalidTestCase(AioHTTPTestCase): def test_noop(self) -> None: pass """ ) result = testdir.runpytest() result.stdout.fnmatch_lines(["*RuntimeError*"]) async def test_server_context_manager(app, loop) -> None: async with _TestServer(app, loop=loop) as server: async with aiohttp.ClientSession(loop=loop) as client: async with client.head(server.make_url("/")) as resp: assert resp.status == 200 @pytest.mark.parametrize( "method", ["head", "get", "post", "options", "post", "put", "patch", "delete"] ) async def test_client_context_manager_response(method, app, loop) -> None: async with _TestClient(_TestServer(app), loop=loop) as client: async with getattr(client, method)("/") as resp: assert resp.status == 200 if method != "head": text = await resp.text() assert "Hello, world" in text async def test_custom_port(loop, app, aiohttp_unused_port) -> None: port = aiohttp_unused_port() client = _TestClient(_TestServer(app, loop=loop, port=port), loop=loop) await client.start_server() assert client.server.port == port resp = await client.get("/") assert resp.status == 200 text = await resp.text() assert _hello_world_str == text await client.close() @pytest.mark.parametrize("test_server_cls", [_TestServer, _RawTestServer]) async def test_base_test_server_socket_factory( test_server_cls: type, app: Any, loop: Any ) -> None: factory_called = False def factory(*args, **kwargs) -> socket: nonlocal factory_called factory_called = True return get_port_socket(*args, **kwargs) server = test_server_cls(app, loop=loop, socket_factory=factory) async with server: pass assert factory_called ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_tracing.py0000644000175100001770000001114614607525266017027 0ustar00runnerdockerfrom types import SimpleNamespace from unittest.mock import Mock import pytest from aiohttp.test_utils import make_mocked_coro from aiohttp.tracing import ( Trace, TraceConfig, TraceConnectionCreateEndParams, TraceConnectionCreateStartParams, TraceConnectionQueuedEndParams, TraceConnectionQueuedStartParams, TraceConnectionReuseconnParams, TraceDnsCacheHitParams, TraceDnsCacheMissParams, TraceDnsResolveHostEndParams, TraceDnsResolveHostStartParams, TraceRequestChunkSentParams, TraceRequestEndParams, TraceRequestExceptionParams, TraceRequestRedirectParams, TraceRequestStartParams, TraceResponseChunkReceivedParams, ) class TestTraceConfig: def test_trace_config_ctx_default(self) -> None: trace_config = TraceConfig() assert isinstance(trace_config.trace_config_ctx(), SimpleNamespace) def test_trace_config_ctx_factory(self) -> None: trace_config = TraceConfig(trace_config_ctx_factory=dict) assert isinstance(trace_config.trace_config_ctx(), dict) def test_trace_config_ctx_request_ctx(self) -> None: trace_request_ctx = Mock() trace_config = TraceConfig() trace_config_ctx = trace_config.trace_config_ctx( trace_request_ctx=trace_request_ctx ) assert trace_config_ctx.trace_request_ctx is trace_request_ctx def test_freeze(self) -> None: trace_config = TraceConfig() trace_config.freeze() assert trace_config.on_request_start.frozen assert trace_config.on_request_chunk_sent.frozen assert trace_config.on_response_chunk_received.frozen assert trace_config.on_request_end.frozen assert trace_config.on_request_exception.frozen assert trace_config.on_request_redirect.frozen assert trace_config.on_connection_queued_start.frozen assert trace_config.on_connection_queued_end.frozen assert trace_config.on_connection_create_start.frozen assert trace_config.on_connection_create_end.frozen assert trace_config.on_connection_reuseconn.frozen assert trace_config.on_dns_resolvehost_start.frozen assert trace_config.on_dns_resolvehost_end.frozen assert trace_config.on_dns_cache_hit.frozen assert trace_config.on_dns_cache_miss.frozen assert trace_config.on_request_headers_sent.frozen class TestTrace: @pytest.mark.parametrize( "signal,params,param_obj", [ ("request_start", (Mock(), Mock(), Mock()), TraceRequestStartParams), ( "request_chunk_sent", (Mock(), Mock(), Mock()), TraceRequestChunkSentParams, ), ( "response_chunk_received", (Mock(), Mock(), Mock()), TraceResponseChunkReceivedParams, ), ("request_end", (Mock(), Mock(), Mock(), Mock()), TraceRequestEndParams), ( "request_exception", (Mock(), Mock(), Mock(), Mock()), TraceRequestExceptionParams, ), ( "request_redirect", (Mock(), Mock(), Mock(), Mock()), TraceRequestRedirectParams, ), ("connection_queued_start", (), TraceConnectionQueuedStartParams), ("connection_queued_end", (), TraceConnectionQueuedEndParams), ("connection_create_start", (), TraceConnectionCreateStartParams), ("connection_create_end", (), TraceConnectionCreateEndParams), ("connection_reuseconn", (), TraceConnectionReuseconnParams), ("dns_resolvehost_start", (Mock(),), TraceDnsResolveHostStartParams), ("dns_resolvehost_end", (Mock(),), TraceDnsResolveHostEndParams), ("dns_cache_hit", (Mock(),), TraceDnsCacheHitParams), ("dns_cache_miss", (Mock(),), TraceDnsCacheMissParams), ], ) async def test_send(self, signal, params, param_obj) -> None: session = Mock() trace_request_ctx = Mock() callback = Mock(side_effect=make_mocked_coro(Mock())) trace_config = TraceConfig() getattr(trace_config, "on_%s" % signal).append(callback) trace_config.freeze() trace = Trace( session, trace_config, trace_config.trace_config_ctx(trace_request_ctx=trace_request_ctx), ) await getattr(trace, "send_%s" % signal)(*params) callback.assert_called_once_with( session, SimpleNamespace(trace_request_ctx=trace_request_ctx), param_obj(*params), ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_urldispatch.py0000644000175100001770000011734714607525266017734 0ustar00runnerdockerimport pathlib import re from collections.abc import Container, Iterable, Mapping, MutableMapping, Sized from urllib.parse import unquote import pytest from re_assert import Matches from yarl import URL import aiohttp from aiohttp import hdrs, web from aiohttp.test_utils import make_mocked_request from aiohttp.web import HTTPMethodNotAllowed, HTTPNotFound, Response from aiohttp.web_urldispatcher import ( PATH_SEP, AbstractResource, Domain, DynamicResource, MaskDomain, PlainResource, ResourceRoute, StaticResource, SystemRoute, View, _default_expect_handler, ) def make_handler(): async def handler(request): return Response(request) # pragma: no cover return handler @pytest.fixture def app(): return web.Application() @pytest.fixture def router(app): return app.router @pytest.fixture def fill_routes(router): def go(): route1 = router.add_route("GET", "/plain", make_handler()) route2 = router.add_route("GET", "/variable/{name}", make_handler()) resource = router.add_static("/static", pathlib.Path(aiohttp.__file__).parent) return [route1, route2] + list(resource) return go def test_register_uncommon_http_methods(router) -> None: uncommon_http_methods = { "PROPFIND", "PROPPATCH", "COPY", "LOCK", "UNLOCK", "MOVE", "SUBSCRIBE", "UNSUBSCRIBE", "NOTIFY", } for method in uncommon_http_methods: router.add_route(method, "/handler/to/path", make_handler()) async def test_add_route_root(router) -> None: handler = make_handler() router.add_route("GET", "/", handler) req = make_mocked_request("GET", "/") info = await router.resolve(req) assert info is not None assert 0 == len(info) assert handler is info.handler assert info.route.name is None async def test_add_route_simple(router) -> None: handler = make_handler() router.add_route("GET", "/handler/to/path", handler) req = make_mocked_request("GET", "/handler/to/path") info = await router.resolve(req) assert info is not None assert 0 == len(info) assert handler is info.handler assert info.route.name is None async def test_add_with_matchdict(router) -> None: handler = make_handler() router.add_route("GET", "/handler/{to}", handler) req = make_mocked_request("GET", "/handler/tail") info = await router.resolve(req) assert info is not None assert {"to": "tail"} == info assert handler is info.handler assert info.route.name is None async def test_add_with_matchdict_with_colon(router) -> None: handler = make_handler() router.add_route("GET", "/handler/{to}", handler) req = make_mocked_request("GET", "/handler/1:2:3") info = await router.resolve(req) assert info is not None assert {"to": "1:2:3"} == info assert handler is info.handler assert info.route.name is None async def test_add_route_with_add_get_shortcut(router) -> None: handler = make_handler() router.add_get("/handler/to/path", handler) req = make_mocked_request("GET", "/handler/to/path") info = await router.resolve(req) assert info is not None assert 0 == len(info) assert handler is info.handler assert info.route.name is None async def test_add_route_with_add_post_shortcut(router) -> None: handler = make_handler() router.add_post("/handler/to/path", handler) req = make_mocked_request("POST", "/handler/to/path") info = await router.resolve(req) assert info is not None assert 0 == len(info) assert handler is info.handler assert info.route.name is None async def test_add_route_with_add_put_shortcut(router) -> None: handler = make_handler() router.add_put("/handler/to/path", handler) req = make_mocked_request("PUT", "/handler/to/path") info = await router.resolve(req) assert info is not None assert 0 == len(info) assert handler is info.handler assert info.route.name is None async def test_add_route_with_add_patch_shortcut(router) -> None: handler = make_handler() router.add_patch("/handler/to/path", handler) req = make_mocked_request("PATCH", "/handler/to/path") info = await router.resolve(req) assert info is not None assert 0 == len(info) assert handler is info.handler assert info.route.name is None async def test_add_route_with_add_delete_shortcut(router) -> None: handler = make_handler() router.add_delete("/handler/to/path", handler) req = make_mocked_request("DELETE", "/handler/to/path") info = await router.resolve(req) assert info is not None assert 0 == len(info) assert handler is info.handler assert info.route.name is None async def test_add_route_with_add_head_shortcut(router) -> None: handler = make_handler() router.add_head("/handler/to/path", handler) req = make_mocked_request("HEAD", "/handler/to/path") info = await router.resolve(req) assert info is not None assert 0 == len(info) assert handler is info.handler assert info.route.name is None async def test_add_with_name(router) -> None: handler = make_handler() router.add_route("GET", "/handler/to/path", handler, name="name") req = make_mocked_request("GET", "/handler/to/path") info = await router.resolve(req) assert info is not None assert "name" == info.route.name async def test_add_with_tailing_slash(router) -> None: handler = make_handler() router.add_route("GET", "/handler/to/path/", handler) req = make_mocked_request("GET", "/handler/to/path/") info = await router.resolve(req) assert info is not None assert {} == info assert handler is info.handler def test_add_invalid_path(router) -> None: handler = make_handler() with pytest.raises(ValueError): router.add_route("GET", "/{/", handler) def test_add_url_invalid1(router) -> None: handler = make_handler() with pytest.raises(ValueError): router.add_route("post", "/post/{id", handler) def test_add_url_invalid2(router) -> None: handler = make_handler() with pytest.raises(ValueError): router.add_route("post", "/post/{id{}}", handler) def test_add_url_invalid3(router) -> None: handler = make_handler() with pytest.raises(ValueError): router.add_route("post", "/post/{id{}", handler) def test_add_url_invalid4(router) -> None: handler = make_handler() with pytest.raises(ValueError): router.add_route("post", '/post/{id"}', handler) async def test_add_url_escaping(router) -> None: handler = make_handler() router.add_route("GET", "/+$", handler) req = make_mocked_request("GET", "/+$") info = await router.resolve(req) assert info is not None assert handler is info.handler async def test_any_method(router) -> None: handler = make_handler() route = router.add_route(hdrs.METH_ANY, "/", handler) req = make_mocked_request("GET", "/") info1 = await router.resolve(req) assert info1 is not None assert route is info1.route req = make_mocked_request("POST", "/") info2 = await router.resolve(req) assert info2 is not None assert info1.route is info2.route async def test_match_second_result_in_table(router) -> None: handler1 = make_handler() handler2 = make_handler() router.add_route("GET", "/h1", handler1) router.add_route("POST", "/h2", handler2) req = make_mocked_request("POST", "/h2") info = await router.resolve(req) assert info is not None assert {} == info assert handler2 is info.handler async def test_raise_method_not_allowed(router) -> None: handler1 = make_handler() handler2 = make_handler() router.add_route("GET", "/", handler1) router.add_route("POST", "/", handler2) req = make_mocked_request("PUT", "/") match_info = await router.resolve(req) assert isinstance(match_info.route, SystemRoute) assert {} == match_info with pytest.raises(HTTPMethodNotAllowed) as ctx: await match_info.handler(req) exc = ctx.value assert "PUT" == exc.method assert 405 == exc.status assert {"POST", "GET"} == exc.allowed_methods async def test_raise_method_not_found(router) -> None: handler = make_handler() router.add_route("GET", "/a", handler) req = make_mocked_request("GET", "/b") match_info = await router.resolve(req) assert isinstance(match_info.route, SystemRoute) assert {} == match_info with pytest.raises(HTTPNotFound) as ctx: await match_info.handler(req) exc = ctx.value assert 404 == exc.status def test_double_add_url_with_the_same_name(router) -> None: handler1 = make_handler() handler2 = make_handler() router.add_route("GET", "/get", handler1, name="name") regexp = "Duplicate 'name', already handled by" with pytest.raises(ValueError) as ctx: router.add_route("GET", "/get_other", handler2, name="name") assert Matches(regexp) == str(ctx.value) def test_route_plain(router) -> None: handler = make_handler() route = router.add_route("GET", "/get", handler, name="name") route2 = next(iter(router["name"])) url = route2.url_for() assert "/get" == str(url) assert route is route2 def test_route_unknown_route_name(router) -> None: with pytest.raises(KeyError): router["unknown"] def test_route_dynamic(router) -> None: handler = make_handler() route = router.add_route("GET", "/get/{name}", handler, name="name") route2 = next(iter(router["name"])) url = route2.url_for(name="John") assert "/get/John" == str(url) assert route is route2 def test_add_static(router) -> None: resource = router.add_static( "/st", pathlib.Path(aiohttp.__file__).parent, name="static" ) assert router["static"] is resource url = resource.url_for(filename="/dir/a.txt") assert "/st/dir/a.txt" == str(url) assert len(resource) == 2 def test_add_static_append_version(router) -> None: resource = router.add_static("/st", pathlib.Path(__file__).parent, name="static") url = resource.url_for(filename="/data.unknown_mime_type", append_version=True) expect_url = ( "/st/data.unknown_mime_type?" "v=aUsn8CHEhhszc81d28QmlcBW0KQpfS2F4trgQKhOYd8%3D" ) assert expect_url == str(url) def test_add_static_append_version_set_from_constructor(router) -> None: resource = router.add_static( "/st", pathlib.Path(__file__).parent, append_version=True, name="static" ) url = resource.url_for(filename="/data.unknown_mime_type") expect_url = ( "/st/data.unknown_mime_type?" "v=aUsn8CHEhhszc81d28QmlcBW0KQpfS2F4trgQKhOYd8%3D" ) assert expect_url == str(url) def test_add_static_append_version_override_constructor(router) -> None: resource = router.add_static( "/st", pathlib.Path(__file__).parent, append_version=True, name="static" ) url = resource.url_for(filename="/data.unknown_mime_type", append_version=False) expect_url = "/st/data.unknown_mime_type" assert expect_url == str(url) def test_add_static_append_version_filename_without_slash(router) -> None: resource = router.add_static("/st", pathlib.Path(__file__).parent, name="static") url = resource.url_for(filename="data.unknown_mime_type", append_version=True) expect_url = ( "/st/data.unknown_mime_type?" "v=aUsn8CHEhhszc81d28QmlcBW0KQpfS2F4trgQKhOYd8%3D" ) assert expect_url == str(url) def test_add_static_append_version_non_exists_file(router) -> None: resource = router.add_static("/st", pathlib.Path(__file__).parent, name="static") url = resource.url_for(filename="/non_exists_file", append_version=True) assert "/st/non_exists_file" == str(url) def test_add_static_append_version_non_exists_file_without_slash(router) -> None: resource = router.add_static("/st", pathlib.Path(__file__).parent, name="static") url = resource.url_for(filename="non_exists_file", append_version=True) assert "/st/non_exists_file" == str(url) def test_add_static_append_version_follow_symlink(router, tmp_path) -> None: # Tests the access to a symlink, in static folder with apeend_version symlink_path = tmp_path / "append_version_symlink" symlink_target_path = pathlib.Path(__file__).parent pathlib.Path(str(symlink_path)).symlink_to(str(symlink_target_path), True) # Register global static route: resource = router.add_static( "/st", str(tmp_path), follow_symlinks=True, append_version=True ) url = resource.url_for(filename="/append_version_symlink/data.unknown_mime_type") expect_url = ( "/st/append_version_symlink/data.unknown_mime_type?" "v=aUsn8CHEhhszc81d28QmlcBW0KQpfS2F4trgQKhOYd8%3D" ) assert expect_url == str(url) def test_add_static_append_version_not_follow_symlink(router, tmp_path) -> None: # Tests the access to a symlink, in static folder with apeend_version symlink_path = tmp_path / "append_version_symlink" symlink_target_path = pathlib.Path(__file__).parent pathlib.Path(str(symlink_path)).symlink_to(str(symlink_target_path), True) # Register global static route: resource = router.add_static( "/st", str(tmp_path), follow_symlinks=False, append_version=True ) filename = "/append_version_symlink/data.unknown_mime_type" url = resource.url_for(filename=filename) assert "/st/append_version_symlink/data.unknown_mime_type" == str(url) def test_add_static_quoting(router) -> None: resource = router.add_static( "/пре %2Fфикс", pathlib.Path(aiohttp.__file__).parent, name="static" ) assert router["static"] is resource url = resource.url_for(filename="/1 2/файл%2F.txt") assert url.path == "/пре /фикс/1 2/файл%2F.txt" assert str(url) == ( "/%D0%BF%D1%80%D0%B5%20%2F%D1%84%D0%B8%D0%BA%D1%81" "/1%202/%D1%84%D0%B0%D0%B9%D0%BB%252F.txt" ) assert len(resource) == 2 def test_plain_not_match(router) -> None: handler = make_handler() router.add_route("GET", "/get/path", handler, name="name") route = router["name"] assert route._match("/another/path") is None def test_dynamic_not_match(router) -> None: handler = make_handler() router.add_route("GET", "/get/{name}", handler, name="name") route = router["name"] assert route._match("/another/path") is None async def test_static_not_match(router) -> None: router.add_static("/pre", pathlib.Path(aiohttp.__file__).parent, name="name") resource = router["name"] ret = await resource.resolve(make_mocked_request("GET", "/another/path")) assert (None, set()) == ret def test_dynamic_with_trailing_slash(router) -> None: handler = make_handler() router.add_route("GET", "/get/{name}/", handler, name="name") route = router["name"] assert {"name": "John"} == route._match("/get/John/") def test_len(router) -> None: handler = make_handler() router.add_route("GET", "/get1", handler, name="name1") router.add_route("GET", "/get2", handler, name="name2") assert 2 == len(router) def test_iter(router) -> None: handler = make_handler() router.add_route("GET", "/get1", handler, name="name1") router.add_route("GET", "/get2", handler, name="name2") assert {"name1", "name2"} == set(iter(router)) def test_contains(router) -> None: handler = make_handler() router.add_route("GET", "/get1", handler, name="name1") router.add_route("GET", "/get2", handler, name="name2") assert "name1" in router assert "name3" not in router def test_static_repr(router) -> None: router.add_static("/get", pathlib.Path(aiohttp.__file__).parent, name="name") assert Matches(r" None: route = router.add_static("/prefix", pathlib.Path(aiohttp.__file__).parent) assert "/prefix" == route._prefix def test_static_remove_trailing_slash(router) -> None: route = router.add_static("/prefix/", pathlib.Path(aiohttp.__file__).parent) assert "/prefix" == route._prefix async def test_add_route_with_re(router) -> None: handler = make_handler() router.add_route("GET", r"/handler/{to:\d+}", handler) req = make_mocked_request("GET", "/handler/1234") info = await router.resolve(req) assert info is not None assert {"to": "1234"} == info router.add_route("GET", r"/handler/{name}.html", handler) req = make_mocked_request("GET", "/handler/test.html") info = await router.resolve(req) assert {"name": "test"} == info async def test_add_route_with_re_and_slashes(router) -> None: handler = make_handler() router.add_route("GET", r"/handler/{to:[^/]+/?}", handler) req = make_mocked_request("GET", "/handler/1234/") info = await router.resolve(req) assert info is not None assert {"to": "1234/"} == info router.add_route("GET", r"/handler/{to:.+}", handler) req = make_mocked_request("GET", "/handler/1234/5/6/7") info = await router.resolve(req) assert info is not None assert {"to": "1234/5/6/7"} == info async def test_add_route_with_re_not_match(router) -> None: handler = make_handler() router.add_route("GET", r"/handler/{to:\d+}", handler) req = make_mocked_request("GET", "/handler/tail") match_info = await router.resolve(req) assert isinstance(match_info.route, SystemRoute) assert {} == match_info with pytest.raises(HTTPNotFound): await match_info.handler(req) async def test_add_route_with_re_including_slashes(router) -> None: handler = make_handler() router.add_route("GET", r"/handler/{to:.+}/tail", handler) req = make_mocked_request("GET", "/handler/re/with/slashes/tail") info = await router.resolve(req) assert info is not None assert {"to": "re/with/slashes"} == info def test_add_route_with_invalid_re(router) -> None: handler = make_handler() with pytest.raises(ValueError) as ctx: router.add_route("GET", r"/handler/{to:+++}", handler) s = str(ctx.value) assert s.startswith( "Bad pattern '" + PATH_SEP + "handler" + PATH_SEP + "(?P+++)': nothing to repeat" ) assert ctx.value.__cause__ is None def test_route_dynamic_with_regex_spec(router) -> None: handler = make_handler() route = router.add_route("GET", r"/get/{num:^\d+}", handler, name="name") url = route.url_for(num="123") assert "/get/123" == str(url) def test_route_dynamic_with_regex_spec_and_trailing_slash(router) -> None: handler = make_handler() route = router.add_route("GET", r"/get/{num:^\d+}/", handler, name="name") url = route.url_for(num="123") assert "/get/123/" == str(url) def test_route_dynamic_with_regex(router) -> None: handler = make_handler() route = router.add_route("GET", r"/{one}/{two:.+}", handler) url = route.url_for(one="1", two="2") assert "/1/2" == str(url) def test_route_dynamic_quoting(router) -> None: handler = make_handler() route = router.add_route("GET", r"/пре %2Fфикс/{arg}", handler) url = route.url_for(arg="1 2/текст%2F") assert url.path == "/пре /фикс/1 2/текст%2F" assert str(url) == ( "/%D0%BF%D1%80%D0%B5%20%2F%D1%84%D0%B8%D0%BA%D1%81" "/1%202/%D1%82%D0%B5%D0%BA%D1%81%D1%82%252F" ) async def test_regular_match_info(router) -> None: handler = make_handler() router.add_route("GET", "/get/{name}", handler) req = make_mocked_request("GET", "/get/john") match_info = await router.resolve(req) assert {"name": "john"} == match_info assert Matches(">") == repr(match_info) async def test_match_info_with_plus(router) -> None: handler = make_handler() router.add_route("GET", "/get/{version}", handler) req = make_mocked_request("GET", "/get/1.0+test") match_info = await router.resolve(req) assert {"version": "1.0+test"} == match_info async def test_not_found_repr(router) -> None: req = make_mocked_request("POST", "/path/to") match_info = await router.resolve(req) assert "" == repr(match_info) async def test_not_allowed_repr(router) -> None: handler = make_handler() router.add_route("GET", "/path/to", handler) handler2 = make_handler() router.add_route("POST", "/path/to", handler2) req = make_mocked_request("PUT", "/path/to") match_info = await router.resolve(req) assert "" == repr(match_info) def test_default_expect_handler(router) -> None: route = router.add_route("GET", "/", make_handler()) assert route._expect_handler is _default_expect_handler def test_custom_expect_handler_plain(router) -> None: async def handler(request): pass route = router.add_route("GET", "/", make_handler(), expect_handler=handler) assert route._expect_handler is handler assert isinstance(route, ResourceRoute) def test_custom_expect_handler_dynamic(router) -> None: async def handler(request): pass route = router.add_route( "GET", "/get/{name}", make_handler(), expect_handler=handler ) assert route._expect_handler is handler assert isinstance(route, ResourceRoute) def test_expect_handler_non_coroutine(router) -> None: def handler(request): pass with pytest.raises(AssertionError): router.add_route("GET", "/", make_handler(), expect_handler=handler) async def test_dynamic_match_non_ascii(router) -> None: handler = make_handler() router.add_route("GET", "/{var}", handler) req = make_mocked_request( "GET", "/%D1%80%D1%83%D1%81%20%D1%82%D0%B5%D0%BA%D1%81%D1%82" ) match_info = await router.resolve(req) assert {"var": "рус текст"} == match_info async def test_dynamic_match_with_static_part(router) -> None: handler = make_handler() router.add_route("GET", "/{name}.html", handler) req = make_mocked_request("GET", "/file.html") match_info = await router.resolve(req) assert {"name": "file"} == match_info async def test_dynamic_match_two_part2(router) -> None: handler = make_handler() router.add_route("GET", "/{name}.{ext}", handler) req = make_mocked_request("GET", "/file.html") match_info = await router.resolve(req) assert {"name": "file", "ext": "html"} == match_info async def test_dynamic_match_unquoted_path(router) -> None: handler = make_handler() router.add_route("GET", "/{path}/{subpath}", handler) resource_id = "my%2Fpath%7Cwith%21some%25strange%24characters" req = make_mocked_request("GET", f"/path/{resource_id}") match_info = await router.resolve(req) assert match_info == {"path": "path", "subpath": unquote(resource_id)} def test_add_route_not_started_with_slash(router) -> None: with pytest.raises(ValueError): handler = make_handler() router.add_route("GET", "invalid_path", handler) def test_add_route_invalid_method(router) -> None: sample_bad_methods = { "BAD METHOD", "B@D_METHOD", "[BAD_METHOD]", "{BAD_METHOD}", "(BAD_METHOD)", "B?D_METHOD", } for bad_method in sample_bad_methods: with pytest.raises(ValueError): handler = make_handler() router.add_route(bad_method, "/path", handler) def test_routes_view_len(router, fill_routes) -> None: fill_routes() assert 4 == len(router.routes()) def test_routes_view_iter(router, fill_routes) -> None: routes = fill_routes() assert list(routes) == list(router.routes()) def test_routes_view_contains(router, fill_routes) -> None: routes = fill_routes() for route in routes: assert route in router.routes() def test_routes_abc(router) -> None: assert isinstance(router.routes(), Sized) assert isinstance(router.routes(), Iterable) assert isinstance(router.routes(), Container) def test_named_resources_abc(router) -> None: assert isinstance(router.named_resources(), Mapping) assert not isinstance(router.named_resources(), MutableMapping) def test_named_resources(router) -> None: route1 = router.add_route("GET", "/plain", make_handler(), name="route1") route2 = router.add_route("GET", "/variable/{name}", make_handler(), name="route2") route3 = router.add_static( "/static", pathlib.Path(aiohttp.__file__).parent, name="route3" ) names = {route1.name, route2.name, route3.name} assert 3 == len(router.named_resources()) for name in names: assert name in router.named_resources() assert isinstance(router.named_resources()[name], AbstractResource) def test_resource_iter(router) -> None: async def handler(request): pass resource = router.add_resource("/path") r1 = resource.add_route("GET", handler) r2 = resource.add_route("POST", handler) assert 2 == len(resource) assert [r1, r2] == list(resource) def test_deprecate_bare_generators(router) -> None: resource = router.add_resource("/path") def gen(request): yield with pytest.warns(DeprecationWarning): resource.add_route("GET", gen) def test_view_route(router) -> None: resource = router.add_resource("/path") route = resource.add_route("GET", View) assert View is route.handler def test_resource_route_match(router) -> None: async def handler(request): pass resource = router.add_resource("/path") route = resource.add_route("GET", handler) assert {} == route.resource._match("/path") def test_error_on_double_route_adding(router) -> None: async def handler(request): pass resource = router.add_resource("/path") resource.add_route("GET", handler) with pytest.raises(RuntimeError): resource.add_route("GET", handler) def test_error_on_adding_route_after_wildcard(router) -> None: async def handler(request): pass resource = router.add_resource("/path") resource.add_route("*", handler) with pytest.raises(RuntimeError): resource.add_route("GET", handler) async def test_http_exception_is_none_when_resolved(router) -> None: handler = make_handler() router.add_route("GET", "/", handler) req = make_mocked_request("GET", "/") info = await router.resolve(req) assert info.http_exception is None async def test_http_exception_is_not_none_when_not_resolved(router) -> None: handler = make_handler() router.add_route("GET", "/", handler) req = make_mocked_request("GET", "/abc") info = await router.resolve(req) assert info.http_exception.status == 404 async def test_match_info_get_info_plain(router) -> None: handler = make_handler() router.add_route("GET", "/", handler) req = make_mocked_request("GET", "/") info = await router.resolve(req) assert info.get_info() == {"path": "/"} async def test_match_info_get_info_dynamic(router) -> None: handler = make_handler() router.add_route("GET", "/{a}", handler) req = make_mocked_request("GET", "/value") info = await router.resolve(req) assert info.get_info() == { "pattern": re.compile(PATH_SEP + "(?P[^{}/]+)"), "formatter": "/{a}", } async def test_match_info_get_info_dynamic2(router) -> None: handler = make_handler() router.add_route("GET", "/{a}/{b}", handler) req = make_mocked_request("GET", "/path/to") info = await router.resolve(req) assert info.get_info() == { "pattern": re.compile( PATH_SEP + "(?P[^{}/]+)" + PATH_SEP + "(?P[^{}/]+)" ), "formatter": "/{a}/{b}", } def test_static_resource_get_info(router) -> None: directory = pathlib.Path(aiohttp.__file__).parent.resolve() resource = router.add_static("/st", directory) info = resource.get_info() assert len(info) == 3 assert info["directory"] == directory assert info["prefix"] == "/st" assert all([type(r) is ResourceRoute for r in info["routes"].values()]) async def test_system_route_get_info(router) -> None: handler = make_handler() router.add_route("GET", "/", handler) req = make_mocked_request("GET", "/abc") info = await router.resolve(req) assert info.get_info()["http_exception"].status == 404 def test_resources_view_len(router) -> None: router.add_resource("/plain") router.add_resource("/variable/{name}") assert 2 == len(router.resources()) def test_resources_view_iter(router) -> None: resource1 = router.add_resource("/plain") resource2 = router.add_resource("/variable/{name}") resources = [resource1, resource2] assert list(resources) == list(router.resources()) def test_resources_view_contains(router) -> None: resource1 = router.add_resource("/plain") resource2 = router.add_resource("/variable/{name}") resources = [resource1, resource2] for resource in resources: assert resource in router.resources() def test_resources_abc(router) -> None: assert isinstance(router.resources(), Sized) assert isinstance(router.resources(), Iterable) assert isinstance(router.resources(), Container) def test_static_route_user_home(router) -> None: here = pathlib.Path(aiohttp.__file__).parent try: static_dir = pathlib.Path("~") / here.relative_to(pathlib.Path.home()) except ValueError: # pragma: no cover pytest.skip("aiohttp folder is not placed in user's HOME") route = router.add_static("/st", str(static_dir)) assert here == route.get_info()["directory"] def test_static_route_points_to_file(router) -> None: here = pathlib.Path(aiohttp.__file__).parent / "__init__.py" with pytest.raises(ValueError): router.add_static("/st", here) async def test_404_for_static_resource(router) -> None: resource = router.add_static("/st", pathlib.Path(aiohttp.__file__).parent) ret = await resource.resolve(make_mocked_request("GET", "/unknown/path")) assert (None, set()) == ret async def test_405_for_resource_adapter(router) -> None: resource = router.add_static("/st", pathlib.Path(aiohttp.__file__).parent) ret = await resource.resolve(make_mocked_request("POST", "/st/abc.py")) assert (None, {"HEAD", "GET"}) == ret async def test_check_allowed_method_for_found_resource(router) -> None: handler = make_handler() resource = router.add_resource("/") resource.add_route("GET", handler) ret = await resource.resolve(make_mocked_request("GET", "/")) assert ret[0] is not None assert {"GET"} == ret[1] def test_url_for_in_static_resource(router) -> None: resource = router.add_static("/static", pathlib.Path(aiohttp.__file__).parent) assert URL("/static/file.txt") == resource.url_for(filename="file.txt") def test_url_for_in_static_resource_pathlib(router) -> None: resource = router.add_static("/static", pathlib.Path(aiohttp.__file__).parent) assert URL("/static/file.txt") == resource.url_for( filename=pathlib.Path("file.txt") ) def test_url_for_in_resource_route(router) -> None: route = router.add_route("GET", "/get/{name}", make_handler(), name="name") assert URL("/get/John") == route.url_for(name="John") def test_subapp_get_info(app) -> None: subapp = web.Application() resource = subapp.add_subapp("/pre", subapp) assert resource.get_info() == {"prefix": "/pre", "app": subapp} @pytest.mark.parametrize( "domain,error", [ (None, TypeError), ("", ValueError), ("http://dom", ValueError), ("*.example.com", ValueError), ("example$com", ValueError), ], ) def test_domain_validation_error(domain, error): with pytest.raises(error): Domain(domain) def test_domain_valid(): assert Domain("example.com:81").canonical == "example.com:81" assert MaskDomain("*.example.com").canonical == r".*\.example\.com" assert Domain("пуни.код").canonical == "xn--h1ajfq.xn--d1alm" @pytest.mark.parametrize( "a,b,result", [ ("example.com", "example.com", True), ("example.com:81", "example.com:81", True), ("example.com:81", "example.com", False), ("пуникод", "xn--d1ahgkhc2a", True), ("*.example.com", "jpg.example.com", True), ("*.example.com", "a.example.com", True), ("*.example.com", "example.com", False), ], ) def test_match_domain(a, b, result): if "*" in a: rule = MaskDomain(a) else: rule = Domain(a) assert rule.match_domain(b) is result def test_add_subapp_errors(app): with pytest.raises(TypeError): app.add_subapp(1, web.Application()) def test_subapp_rule_resource(app): subapp = web.Application() subapp.router.add_get("/", make_handler()) rule = Domain("example.com") assert rule.get_info() == {"domain": "example.com"} resource = app.add_domain("example.com", subapp) assert resource.canonical == "example.com" assert resource.get_info() == {"rule": resource._rule, "app": subapp} resource.add_prefix("/a") resource.raw_match("/b") assert len(resource) assert list(resource) assert repr(resource).startswith(" None: subapp = web.Application() resource = app.add_subapp("/pre", subapp) with pytest.raises(RuntimeError): resource.url_for() def test_subapp_repr(app) -> None: subapp = web.Application() resource = app.add_subapp("/pre", subapp) assert repr(resource).startswith(" None: subapp = web.Application() subapp.router.add_get("/", make_handler(), allow_head=False) subapp.router.add_post("/", make_handler()) resource = app.add_subapp("/pre", subapp) assert len(resource) == 2 def test_subapp_iter(app) -> None: subapp = web.Application() r1 = subapp.router.add_get("/", make_handler(), allow_head=False) r2 = subapp.router.add_post("/", make_handler()) resource = app.add_subapp("/pre", subapp) assert list(resource) == [r1, r2] @pytest.mark.parametrize( "route_name", ( "invalid name", "class", ), ) def test_invalid_route_name(router, route_name: str) -> None: with pytest.raises(ValueError): router.add_get("/", make_handler(), name=route_name) def test_frozen_router(router) -> None: router.freeze() with pytest.raises(RuntimeError): router.add_get("/", make_handler()) def test_frozen_router_subapp(app) -> None: subapp = web.Application() subapp.freeze() with pytest.raises(RuntimeError): app.add_subapp("/pre", subapp) def test_frozen_app_on_subapp(app) -> None: app.freeze() subapp = web.Application() with pytest.raises(RuntimeError): app.add_subapp("/pre", subapp) def test_set_options_route(router) -> None: resource = router.add_static("/static", pathlib.Path(aiohttp.__file__).parent) options = None for route in resource: if route.method == "OPTIONS": options = route assert options is None resource.set_options_route(make_handler()) for route in resource: if route.method == "OPTIONS": options = route assert options is not None with pytest.raises(RuntimeError): resource.set_options_route(make_handler()) def test_dynamic_url_with_name_started_from_underscore(router) -> None: route = router.add_route("GET", "/get/{_name}", make_handler()) assert URL("/get/John") == route.url_for(_name="John") def test_cannot_add_subapp_with_empty_prefix(app) -> None: subapp = web.Application() with pytest.raises(ValueError): app.add_subapp("", subapp) def test_cannot_add_subapp_with_slash_prefix(app) -> None: subapp = web.Application() with pytest.raises(ValueError): app.add_subapp("/", subapp) async def test_convert_empty_path_to_slash_on_freezing(router) -> None: handler = make_handler() route = router.add_get("", handler) resource = route.resource assert resource.get_info() == {"path": ""} router.freeze() assert resource.get_info() == {"path": "/"} def test_deprecate_non_coroutine(router) -> None: def handler(request): pass with pytest.warns(DeprecationWarning): router.add_route("GET", "/handler", handler) def test_plain_resource_canonical() -> None: canonical = "/plain/path" res = PlainResource(path=canonical) assert res.canonical == canonical def test_dynamic_resource_canonical() -> None: canonicals = { "/get/{name}": "/get/{name}", r"/get/{num:^\d+}": "/get/{num}", r"/handler/{to:\d+}": r"/handler/{to}", r"/{one}/{two:.+}": r"/{one}/{two}", } for pattern, canonical in canonicals.items(): res = DynamicResource(path=pattern) assert res.canonical == canonical def test_static_resource_canonical() -> None: prefix = "/prefix" directory = str(pathlib.Path(aiohttp.__file__).parent) canonical = prefix res = StaticResource(prefix=prefix, directory=directory) assert res.canonical == canonical def test_prefixed_subapp_resource_canonical(app) -> None: canonical = "/prefix" subapp = web.Application() res = subapp.add_subapp(canonical, subapp) assert res.canonical == canonical async def test_prefixed_subapp_overlap(app) -> None: # Subapp should not overshadow other subapps with overlapping prefixes subapp1 = web.Application() handler1 = make_handler() subapp1.router.add_get("/a", handler1) app.add_subapp("/s", subapp1) subapp2 = web.Application() handler2 = make_handler() subapp2.router.add_get("/b", handler2) app.add_subapp("/ss", subapp2) match_info = await app.router.resolve(make_mocked_request("GET", "/s/a")) assert match_info.route.handler is handler1 match_info = await app.router.resolve(make_mocked_request("GET", "/ss/b")) assert match_info.route.handler is handler2 async def test_prefixed_subapp_empty_route(app) -> None: subapp = web.Application() handler = make_handler() subapp.router.add_get("", handler) app.add_subapp("/s", subapp) match_info = await app.router.resolve(make_mocked_request("GET", "/s")) assert match_info.route.handler is handler match_info = await app.router.resolve(make_mocked_request("GET", "/s/")) assert "" == repr(match_info) async def test_prefixed_subapp_root_route(app) -> None: subapp = web.Application() handler = make_handler() subapp.router.add_get("/", handler) app.add_subapp("/s", subapp) match_info = await app.router.resolve(make_mocked_request("GET", "/s/")) assert match_info.route.handler is handler match_info = await app.router.resolve(make_mocked_request("GET", "/s")) assert "" == repr(match_info) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_web_app.py0000644000175100001770000004376614607525266017032 0ustar00runnerdockerimport asyncio import gc from typing import AsyncIterator, Callable, Iterator, NoReturn from unittest import mock import pytest from aiohttp import log, web from aiohttp.abc import AbstractAccessLogger, AbstractRouter from aiohttp.helpers import DEBUG from aiohttp.test_utils import make_mocked_coro from aiohttp.typedefs import Handler async def test_app_ctor() -> None: loop = asyncio.get_event_loop() with pytest.warns(DeprecationWarning): app = web.Application(loop=loop) with pytest.warns(DeprecationWarning): assert loop is app.loop assert app.logger is log.web_logger def test_app_call() -> None: app = web.Application() assert app is app() def test_app_default_loop() -> None: app = web.Application() with pytest.warns(DeprecationWarning): assert app.loop is None async def test_set_loop() -> None: loop = asyncio.get_event_loop() app = web.Application() app._set_loop(loop) with pytest.warns(DeprecationWarning): assert app.loop is loop def test_set_loop_default_loop() -> None: loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) app = web.Application() try: app._set_loop(None) with pytest.warns(DeprecationWarning): assert app.loop is loop asyncio.set_event_loop(None) finally: # Cleanup, leaks into `test_app_make_handler_debug_exc[True]` otherwise: loop.stop() loop.run_forever() loop.close() gc.collect() def test_set_loop_with_different_loops() -> None: loop = asyncio.new_event_loop() app = web.Application() app._set_loop(loop) with pytest.warns(DeprecationWarning): assert app.loop is loop with pytest.raises(RuntimeError): app._set_loop(loop=object()) # Cleanup, leaks into `test_app_make_handler_debug_exc[True]` otherwise: loop.stop() loop.run_forever() loop.close() gc.collect() @pytest.mark.parametrize("debug", [True, False]) async def test_app_make_handler_debug_exc(mocker, debug) -> None: with pytest.warns(DeprecationWarning): app = web.Application(debug=debug) srv = mocker.patch("aiohttp.web_app.Server") with pytest.warns(DeprecationWarning): assert app.debug == debug app._make_handler() srv.assert_called_with( app._handle, request_factory=app._make_request, access_log_class=mock.ANY, loop=asyncio.get_event_loop(), debug=debug, ) async def test_app_make_handler_args(mocker) -> None: app = web.Application(handler_args={"test": True}) srv = mocker.patch("aiohttp.web_app.Server") app._make_handler() srv.assert_called_with( app._handle, request_factory=app._make_request, access_log_class=mock.ANY, loop=asyncio.get_event_loop(), debug=mock.ANY, test=True, ) async def test_app_make_handler_access_log_class(mocker) -> None: class Logger: pass app = web.Application() with pytest.raises(TypeError): app._make_handler(access_log_class=Logger) class Logger(AbstractAccessLogger): def log(self, request, response, time): self.logger.info("msg") srv = mocker.patch("aiohttp.web_app.Server") app._make_handler(access_log_class=Logger) srv.assert_called_with( app._handle, access_log_class=Logger, request_factory=app._make_request, loop=asyncio.get_event_loop(), debug=mock.ANY, ) app = web.Application(handler_args={"access_log_class": Logger}) app._make_handler(access_log_class=Logger) srv.assert_called_with( app._handle, access_log_class=Logger, request_factory=app._make_request, loop=asyncio.get_event_loop(), debug=mock.ANY, ) async def test_app_make_handler_raises_deprecation_warning() -> None: app = web.Application() with pytest.warns(DeprecationWarning): app.make_handler() async def test_app_register_on_finish() -> None: app = web.Application() cb1 = make_mocked_coro(None) cb2 = make_mocked_coro(None) app.on_cleanup.append(cb1) app.on_cleanup.append(cb2) app.freeze() await app.cleanup() cb1.assert_called_once_with(app) cb2.assert_called_once_with(app) async def test_app_register_coro() -> None: app = web.Application() fut = asyncio.get_event_loop().create_future() async def cb(app: web.Application) -> None: await asyncio.sleep(0.001) fut.set_result(123) app.on_cleanup.append(cb) app.freeze() await app.cleanup() assert fut.done() assert 123 == fut.result() def test_non_default_router() -> None: router = mock.Mock(spec=AbstractRouter) with pytest.warns(DeprecationWarning): app = web.Application(router=router) assert router is app.router def test_logging() -> None: logger = mock.Mock() app = web.Application() app.logger = logger assert app.logger is logger async def test_on_shutdown() -> None: app = web.Application() called = False async def on_shutdown(app_param: web.Application) -> None: nonlocal called assert app is app_param called = True app.on_shutdown.append(on_shutdown) app.freeze() await app.shutdown() assert called async def test_on_startup() -> None: app = web.Application() long_running1_called = False long_running2_called = False all_long_running_called = False async def long_running1(app_param: web.Application) -> None: nonlocal long_running1_called assert app is app_param long_running1_called = True async def long_running2(app_param: web.Application) -> None: nonlocal long_running2_called assert app is app_param long_running2_called = True async def on_startup_all_long_running(app_param: web.Application) -> None: nonlocal all_long_running_called assert app is app_param all_long_running_called = True await asyncio.gather(long_running1(app_param), long_running2(app_param)) app.on_startup.append(on_startup_all_long_running) app.freeze() await app.startup() assert long_running1_called assert long_running2_called assert all_long_running_called def test_appkey() -> None: key = web.AppKey("key", str) app = web.Application() app[key] = "value" assert app[key] == "value" assert len(app) == 1 del app[key] assert len(app) == 0 def test_appkey_repr_concrete() -> None: key = web.AppKey("key", int) assert repr(key) in ( "", # pytest-xdist "", ) key2 = web.AppKey("key", web.Request) assert repr(key2) in ( # pytest-xdist: "", "", ) def test_appkey_repr_nonconcrete() -> None: key = web.AppKey("key", Iterator[int]) assert repr(key) in ( # pytest-xdist: "", "", ) def test_appkey_repr_annotated() -> None: key = web.AppKey[Iterator[int]]("key") assert repr(key) in ( # pytest-xdist: "", "", ) def test_app_str_keys() -> None: app = web.Application() with pytest.warns( UserWarning, match=r"web_advanced\.html#application-s-config" ) as checker: app["key"] = "value" # Check that the error is emitted at the call site (stacklevel=2) assert checker[0].filename == __file__ assert app["key"] == "value" def test_app_get() -> None: key = web.AppKey("key", int) app = web.Application() assert app.get(key, "foo") == "foo" app[key] = 5 assert app.get(key, "foo") == 5 def test_app_freeze() -> None: app = web.Application() subapp = mock.Mock() subapp._middlewares = () app._subapps.append(subapp) app.freeze() assert subapp.freeze.called app.freeze() assert len(subapp.freeze.call_args_list) == 1 def test_equality() -> None: app1 = web.Application() app2 = web.Application() assert app1 == app1 assert app1 != app2 def test_app_run_middlewares() -> None: root = web.Application() sub = web.Application() root.add_subapp("/sub", sub) root.freeze() assert root._run_middlewares is False @web.middleware async def middleware(request: web.Request, handler: Handler) -> web.StreamResponse: return await handler(request) root = web.Application(middlewares=[middleware]) sub = web.Application() root.add_subapp("/sub", sub) root.freeze() assert root._run_middlewares is True root = web.Application() sub = web.Application(middlewares=[middleware]) root.add_subapp("/sub", sub) root.freeze() assert root._run_middlewares is True def test_subapp_pre_frozen_after_adding() -> None: app = web.Application() subapp = web.Application() app.add_subapp("/prefix", subapp) assert subapp.pre_frozen assert not subapp.frozen def test_app_inheritance() -> None: with pytest.warns(DeprecationWarning): class A(web.Application): # type: ignore[misc] pass @pytest.mark.skipif(not DEBUG, reason="The check is applied in DEBUG mode only") def test_app_custom_attr() -> None: app = web.Application() with pytest.warns(DeprecationWarning): app.custom = None # type: ignore[attr-defined] async def test_cleanup_ctx() -> None: app = web.Application() out = [] def f(num: int) -> Callable[[web.Application], AsyncIterator[None]]: async def inner(app: web.Application) -> AsyncIterator[None]: out.append("pre_" + str(num)) yield None out.append("post_" + str(num)) return inner app.cleanup_ctx.append(f(1)) app.cleanup_ctx.append(f(2)) app.freeze() await app.startup() assert out == ["pre_1", "pre_2"] await app.cleanup() assert out == ["pre_1", "pre_2", "post_2", "post_1"] async def test_cleanup_ctx_exception_on_startup() -> None: app = web.Application() out = [] exc = Exception("fail") def f( num: int, fail: bool = False ) -> Callable[[web.Application], AsyncIterator[None]]: async def inner(app: web.Application) -> AsyncIterator[None]: out.append("pre_" + str(num)) if fail: raise exc yield None out.append("post_" + str(num)) return inner app.cleanup_ctx.append(f(1)) app.cleanup_ctx.append(f(2, True)) app.cleanup_ctx.append(f(3)) app.freeze() with pytest.raises(Exception) as ctx: await app.startup() assert ctx.value is exc assert out == ["pre_1", "pre_2"] await app.cleanup() assert out == ["pre_1", "pre_2", "post_1"] async def test_cleanup_ctx_exception_on_cleanup() -> None: app = web.Application() out = [] exc = Exception("fail") def f( num: int, fail: bool = False ) -> Callable[[web.Application], AsyncIterator[None]]: async def inner(app: web.Application) -> AsyncIterator[None]: out.append("pre_" + str(num)) yield None out.append("post_" + str(num)) if fail: raise exc return inner app.cleanup_ctx.append(f(1)) app.cleanup_ctx.append(f(2, True)) app.cleanup_ctx.append(f(3)) app.freeze() await app.startup() assert out == ["pre_1", "pre_2", "pre_3"] with pytest.raises(Exception) as ctx: await app.cleanup() assert ctx.value is exc assert out == ["pre_1", "pre_2", "pre_3", "post_3", "post_2", "post_1"] async def test_cleanup_ctx_cleanup_after_exception() -> None: app = web.Application() ctx_state = None async def success_ctx(app: web.Application) -> AsyncIterator[None]: nonlocal ctx_state ctx_state = "START" yield ctx_state = "CLEAN" async def fail_ctx(app: web.Application) -> AsyncIterator[NoReturn]: raise Exception() yield app.cleanup_ctx.append(success_ctx) app.cleanup_ctx.append(fail_ctx) runner = web.AppRunner(app) try: with pytest.raises(Exception): await runner.setup() finally: await runner.cleanup() assert ctx_state == "CLEAN" async def test_cleanup_ctx_exception_on_cleanup_multiple() -> None: app = web.Application() out = [] def f( num: int, fail: bool = False ) -> Callable[[web.Application], AsyncIterator[None]]: async def inner(app: web.Application) -> AsyncIterator[None]: out.append("pre_" + str(num)) yield None out.append("post_" + str(num)) if fail: raise Exception("fail_" + str(num)) return inner app.cleanup_ctx.append(f(1)) app.cleanup_ctx.append(f(2, True)) app.cleanup_ctx.append(f(3, True)) app.freeze() await app.startup() assert out == ["pre_1", "pre_2", "pre_3"] with pytest.raises(web.CleanupError) as ctx: await app.cleanup() exc = ctx.value assert len(exc.exceptions) == 2 assert str(exc.exceptions[0]) == "fail_3" assert str(exc.exceptions[1]) == "fail_2" assert out == ["pre_1", "pre_2", "pre_3", "post_3", "post_2", "post_1"] async def test_cleanup_ctx_multiple_yields() -> None: app = web.Application() out = [] def f(num: int) -> Callable[[web.Application], AsyncIterator[None]]: async def inner(app: web.Application) -> AsyncIterator[None]: out.append("pre_" + str(num)) yield None out.append("post_" + str(num)) yield None return inner app.cleanup_ctx.append(f(1)) app.freeze() await app.startup() assert out == ["pre_1"] with pytest.raises(RuntimeError) as ctx: await app.cleanup() assert "has more than one 'yield'" in str(ctx.value) assert out == ["pre_1", "post_1"] async def test_subapp_chained_config_dict_visibility(aiohttp_client) -> None: key1 = web.AppKey("key1", str) key2 = web.AppKey("key2", str) async def main_handler(request: web.Request) -> web.Response: assert request.config_dict[key1] == "val1" assert key2 not in request.config_dict return web.Response(status=200) root = web.Application() root[key1] = "val1" root.add_routes([web.get("/", main_handler)]) async def sub_handler(request: web.Request) -> web.Response: assert request.config_dict[key1] == "val1" assert request.config_dict[key2] == "val2" return web.Response(status=201) sub = web.Application() sub[key2] = "val2" sub.add_routes([web.get("/", sub_handler)]) root.add_subapp("/sub", sub) client = await aiohttp_client(root) resp = await client.get("/") assert resp.status == 200 resp = await client.get("/sub/") assert resp.status == 201 async def test_subapp_chained_config_dict_overriding(aiohttp_client) -> None: key = web.AppKey("key", str) async def main_handler(request: web.Request) -> web.Response: assert request.config_dict[key] == "val1" return web.Response(status=200) root = web.Application() root[key] = "val1" root.add_routes([web.get("/", main_handler)]) async def sub_handler(request: web.Request) -> web.Response: assert request.config_dict[key] == "val2" return web.Response(status=201) sub = web.Application() sub[key] = "val2" sub.add_routes([web.get("/", sub_handler)]) root.add_subapp("/sub", sub) client = await aiohttp_client(root) resp = await client.get("/") assert resp.status == 200 resp = await client.get("/sub/") assert resp.status == 201 async def test_subapp_on_startup(aiohttp_client) -> None: subapp = web.Application() startup = web.AppKey("startup", bool) cleanup = web.AppKey("cleanup", bool) startup_called = False async def on_startup(app: web.Application) -> None: nonlocal startup_called startup_called = True app[startup] = True subapp.on_startup.append(on_startup) ctx_pre_called = False ctx_post_called = False async def cleanup_ctx(app: web.Application) -> AsyncIterator[None]: nonlocal ctx_pre_called, ctx_post_called ctx_pre_called = True app[cleanup] = True yield None ctx_post_called = True subapp.cleanup_ctx.append(cleanup_ctx) shutdown_called = False async def on_shutdown(app: web.Application) -> None: nonlocal shutdown_called shutdown_called = True subapp.on_shutdown.append(on_shutdown) cleanup_called = False async def on_cleanup(app: web.Application) -> None: nonlocal cleanup_called cleanup_called = True subapp.on_cleanup.append(on_cleanup) app = web.Application() app.add_subapp("/subapp", subapp) assert not startup_called assert not ctx_pre_called assert not ctx_post_called assert not shutdown_called assert not cleanup_called assert subapp.on_startup.frozen assert subapp.cleanup_ctx.frozen assert subapp.on_shutdown.frozen assert subapp.on_cleanup.frozen assert subapp.router.frozen client = await aiohttp_client(app) assert startup_called assert ctx_pre_called assert not ctx_post_called assert not shutdown_called assert not cleanup_called await client.close() assert startup_called assert ctx_pre_called assert ctx_post_called assert shutdown_called assert cleanup_called @pytest.mark.filterwarnings(r"ignore:.*web\.AppKey:UserWarning") def test_app_iter(): app = web.Application() b = web.AppKey("b", str) c = web.AppKey("c", str) app["a"] = "0" app[b] = "1" app[c] = "2" app["d"] = "4" assert sorted(list(app)) == [b, c, "a", "d"] def test_app_boolean() -> None: app = web.Application() assert app ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_web_cli.py0000644000175100001770000000766214607525266017014 0ustar00runnerdockerimport pytest from aiohttp import web def test_entry_func_empty(mocker) -> None: error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit) argv = [""] with pytest.raises(SystemExit): web.main(argv) error.assert_called_with("'entry-func' not in 'module:function' syntax") def test_entry_func_only_module(mocker) -> None: argv = ["test"] error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit) with pytest.raises(SystemExit): web.main(argv) error.assert_called_with("'entry-func' not in 'module:function' syntax") def test_entry_func_only_function(mocker) -> None: argv = [":test"] error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit) with pytest.raises(SystemExit): web.main(argv) error.assert_called_with("'entry-func' not in 'module:function' syntax") def test_entry_func_only_separator(mocker) -> None: argv = [":"] error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit) with pytest.raises(SystemExit): web.main(argv) error.assert_called_with("'entry-func' not in 'module:function' syntax") def test_entry_func_relative_module(mocker) -> None: argv = [".a.b:c"] error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit) with pytest.raises(SystemExit): web.main(argv) error.assert_called_with("relative module names not supported") def test_entry_func_non_existent_module(mocker) -> None: argv = ["alpha.beta:func"] mocker.patch("aiohttp.web.import_module", side_effect=ImportError("Test Error")) error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit) with pytest.raises(SystemExit): web.main(argv) error.assert_called_with("unable to import alpha.beta: Test Error") def test_entry_func_non_existent_attribute(mocker) -> None: argv = ["alpha.beta:func"] import_module = mocker.patch("aiohttp.web.import_module") error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit) module = import_module("alpha.beta") del module.func with pytest.raises(SystemExit): web.main(argv) error.assert_called_with( "module {!r} has no attribute {!r}".format("alpha.beta", "func") ) def test_path_when_unsupported(mocker, monkeypatch) -> None: argv = "--path=test_path.sock alpha.beta:func".split() mocker.patch("aiohttp.web.import_module") monkeypatch.delattr("socket.AF_UNIX", raising=False) error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit) with pytest.raises(SystemExit): web.main(argv) error.assert_called_with( "file system paths not supported by your" " operating environment" ) def test_entry_func_call(mocker) -> None: mocker.patch("aiohttp.web.run_app") import_module = mocker.patch("aiohttp.web.import_module") argv = ( "-H testhost -P 6666 --extra-optional-eins alpha.beta:func " "--extra-optional-zwei extra positional args" ).split() module = import_module("alpha.beta") with pytest.raises(SystemExit): web.main(argv) module.func.assert_called_with( ("--extra-optional-eins --extra-optional-zwei extra positional " "args").split() ) def test_running_application(mocker) -> None: run_app = mocker.patch("aiohttp.web.run_app") import_module = mocker.patch("aiohttp.web.import_module") exit = mocker.patch("aiohttp.web.ArgumentParser.exit", side_effect=SystemExit) argv = ( "-H testhost -P 6666 --extra-optional-eins alpha.beta:func " "--extra-optional-zwei extra positional args" ).split() module = import_module("alpha.beta") app = module.func() with pytest.raises(SystemExit): web.main(argv) run_app.assert_called_with(app, host="testhost", port=6666, path=None) exit.assert_called_with(message="Stopped\n") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_web_exceptions.py0000644000175100001770000001727314607525266020425 0ustar00runnerdockerimport collections import re from traceback import format_exception from unittest import mock import aiosignal import pytest from yarl import URL from aiohttp import helpers, web from aiohttp.pytest_plugin import AiohttpClient from aiohttp.test_utils import make_mocked_request @pytest.fixture def buf() -> bytearray: return bytearray() @pytest.fixture def http_request(buf): method = "GET" path = "/" writer = mock.Mock() writer.drain.return_value = () def append(data=b""): buf.extend(data) return helpers.noop() async def write_headers(status_line, headers): headers = ( status_line + "\r\n" + "".join([k + ": " + v + "\r\n" for k, v in headers.items()]) ) headers = headers.encode("utf-8") + b"\r\n" buf.extend(headers) writer.buffer_data.side_effect = append writer.write.side_effect = append writer.write_eof.side_effect = append writer.write_headers.side_effect = write_headers app = mock.Mock() app._debug = False app.on_response_prepare = aiosignal.Signal(app) app.on_response_prepare.freeze() req = make_mocked_request(method, path, app=app, writer=writer) return req def test_all_http_exceptions_exported() -> None: assert "HTTPException" in web.__all__ for name in dir(web): if name.startswith("_"): continue obj = getattr(web, name) if isinstance(obj, type) and issubclass(obj, web.HTTPException): assert name in web.__all__ async def test_HTTPOk(buf, http_request) -> None: resp = web.HTTPOk() await resp.prepare(http_request) await resp.write_eof() txt = buf.decode("utf8") assert re.match( ( "HTTP/1.1 200 OK\r\n" "Content-Type: text/plain; charset=utf-8\r\n" "Content-Length: 7\r\n" "Date: .+\r\n" "Server: .+\r\n\r\n" "200: OK" ), txt, ) def test_terminal_classes_has_status_code() -> None: terminals = set() for name in dir(web): obj = getattr(web, name) if isinstance(obj, type) and issubclass(obj, web.HTTPException): terminals.add(obj) dup = frozenset(terminals) for cls1 in dup: for cls2 in dup: if cls1 in cls2.__bases__: terminals.discard(cls1) for cls in terminals: assert cls.status_code is not None codes = collections.Counter(cls.status_code for cls in terminals) assert None not in codes assert 1 == codes.most_common(1)[0][1] async def test_HTTPFound(buf, http_request) -> None: resp = web.HTTPFound(location="/redirect") assert "/redirect" == resp.location assert "/redirect" == resp.headers["location"] await resp.prepare(http_request) await resp.write_eof() txt = buf.decode("utf8") assert re.match( "HTTP/1.1 302 Found\r\n" "Content-Type: text/plain; charset=utf-8\r\n" "Location: /redirect\r\n" "Content-Length: 10\r\n" "Date: .+\r\n" "Server: .+\r\n\r\n" "302: Found", txt, ) def test_HTTPFound_empty_location() -> None: with pytest.raises(ValueError): web.HTTPFound(location="") with pytest.raises(ValueError): web.HTTPFound(location=None) def test_HTTPFound_location_CRLF() -> None: exc = web.HTTPFound(location="/redirect\r\n") assert "\r\n" not in exc.headers["Location"] async def test_HTTPMethodNotAllowed(buf, http_request) -> None: resp = web.HTTPMethodNotAllowed("get", ["POST", "PUT"]) assert "GET" == resp.method assert {"POST", "PUT"} == resp.allowed_methods assert "POST,PUT" == resp.headers["allow"] await resp.prepare(http_request) await resp.write_eof() txt = buf.decode("utf8") assert re.match( "HTTP/1.1 405 Method Not Allowed\r\n" "Content-Type: text/plain; charset=utf-8\r\n" "Allow: POST,PUT\r\n" "Content-Length: 23\r\n" "Date: .+\r\n" "Server: .+\r\n\r\n" "405: Method Not Allowed", txt, ) def test_override_body_with_text() -> None: resp = web.HTTPNotFound(text="Page not found") assert 404 == resp.status assert b"Page not found" == resp.body assert "Page not found" == resp.text assert "text/plain" == resp.content_type assert "utf-8" == resp.charset def test_override_body_with_binary() -> None: txt = "Page not found" with pytest.warns(DeprecationWarning): resp = web.HTTPNotFound(body=txt.encode("utf-8"), content_type="text/html") assert 404 == resp.status assert txt.encode("utf-8") == resp.body assert txt == resp.text assert "text/html" == resp.content_type assert resp.charset is None def test_default_body() -> None: resp = web.HTTPOk() assert b"200: OK" == resp.body def test_empty_body_204() -> None: resp = web.HTTPNoContent() assert resp.body is None def test_empty_body_205() -> None: resp = web.HTTPNoContent() assert resp.body is None def test_empty_body_304() -> None: resp = web.HTTPNoContent() resp.body is None def test_no_link_451() -> None: with pytest.raises(TypeError): web.HTTPUnavailableForLegalReasons() # type: ignore[call-arg] def test_link_none_451() -> None: resp = web.HTTPUnavailableForLegalReasons(link=None) assert resp.link is None assert "Link" not in resp.headers def test_link_empty_451() -> None: resp = web.HTTPUnavailableForLegalReasons(link="") assert resp.link is None assert "Link" not in resp.headers def test_link_str_451() -> None: resp = web.HTTPUnavailableForLegalReasons(link="http://warning.or.kr/") assert resp.link == URL("http://warning.or.kr/") assert resp.headers["Link"] == '; rel="blocked-by"' def test_link_url_451() -> None: resp = web.HTTPUnavailableForLegalReasons(link=URL("http://warning.or.kr/")) assert resp.link == URL("http://warning.or.kr/") assert resp.headers["Link"] == '; rel="blocked-by"' def test_link_CRLF_451() -> None: resp = web.HTTPUnavailableForLegalReasons(link="http://warning.or.kr/\r\n") assert "\r\n" not in resp.headers["Link"] def test_HTTPException_retains_cause() -> None: with pytest.raises(web.HTTPException) as ei: try: raise Exception("CustomException") except Exception as exc: raise web.HTTPException() from exc tb = "".join(format_exception(ei.type, ei.value, ei.tb)) assert "CustomException" in tb assert "direct cause" in tb async def test_HTTPException_retains_cookie(aiohttp_client: AiohttpClient) -> None: @web.middleware async def middleware(request, handler): try: return await handler(request) except web.HTTPException as exc: exc.set_cookie("foo", request["foo"]) raise exc async def save(request): request["foo"] = "works" raise web.HTTPFound("/show") async def show(request): return web.Response(text=request.cookies["foo"]) app = web.Application(middlewares=[middleware]) app.router.add_route("GET", "/save", save) app.router.add_route("GET", "/show", show) client = await aiohttp_client(app) resp = await client.get("/save") assert resp.status == 200 assert str(resp.url)[-5:] == "/show" text = await resp.text() assert text == "works" def test_unicode_text_body_unauthorized() -> None: """Test that HTTPUnauthorized can be initialized with a string.""" with pytest.warns( DeprecationWarning, match="body argument is deprecated for http web exceptions" ): resp = web.HTTPUnauthorized(body="text") assert resp.status == 401 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_web_functional.py0000644000175100001770000017704014607525266020405 0ustar00runnerdockerimport asyncio import io import json import pathlib import socket import zlib from typing import Any, Optional from unittest import mock import pytest from multidict import CIMultiDictProxy, MultiDict from yarl import URL import aiohttp from aiohttp import ( FormData, HttpVersion, HttpVersion10, HttpVersion11, TraceConfig, multipart, web, ) from aiohttp.hdrs import CONTENT_LENGTH, CONTENT_TYPE, TRANSFER_ENCODING from aiohttp.test_utils import make_mocked_coro from aiohttp.typedefs import Handler try: import brotlicffi as brotli except ImportError: import brotli try: import ssl except ImportError: ssl = None # type: ignore @pytest.fixture def here(): return pathlib.Path(__file__).parent @pytest.fixture def fname(here): return here / "conftest.py" def new_dummy_form(): form = FormData() with pytest.warns(DeprecationWarning, match="BytesPayload"): form.add_field("name", b"123", content_transfer_encoding="base64") return form async def test_simple_get(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body return web.Response(body=b"OK") app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert "OK" == txt await resp.release() async def test_simple_get_with_text(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body return web.Response(text="OK", headers={"content-type": "text/plain"}) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert "OK" == txt await resp.release() async def test_handler_returns_not_response(aiohttp_server, aiohttp_client) -> None: asyncio.get_event_loop().set_debug(True) logger = mock.Mock() async def handler(request): return "abc" app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app, logger=logger) client = await aiohttp_client(server) with pytest.raises(aiohttp.ServerDisconnectedError): await client.get("/") logger.exception.assert_called_with( "Unhandled runtime exception", exc_info=mock.ANY ) async def test_handler_returns_none(aiohttp_server, aiohttp_client) -> None: asyncio.get_event_loop().set_debug(True) logger = mock.Mock() async def handler(request): return None app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app, logger=logger) client = await aiohttp_client(server) with pytest.raises(aiohttp.ServerDisconnectedError): await client.get("/") # Actual error text is placed in exc_info logger.exception.assert_called_with( "Unhandled runtime exception", exc_info=mock.ANY ) async def test_head_returns_empty_body(aiohttp_client) -> None: async def handler(request): return web.Response(body=b"test") app = web.Application() app.router.add_head("/", handler) client = await aiohttp_client(app, version=HttpVersion11) resp = await client.head("/") assert 200 == resp.status txt = await resp.text() assert "" == txt # The Content-Length header should be set to 4 which is # the length of the response body if it would have been # returned by a GET request. assert resp.headers["Content-Length"] == "4" async def test_response_before_complete(aiohttp_client: Any) -> None: async def handler(request): return web.Response(body=b"OK") app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) data = b"0" * 1024 * 1024 resp = await client.post("/", data=data) assert 200 == resp.status text = await resp.text() assert "OK" == text await resp.release() async def test_post_form(aiohttp_client) -> None: async def handler(request): data = await request.post() assert {"a": "1", "b": "2", "c": ""} == data return web.Response(body=b"OK") app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data={"a": 1, "b": 2, "c": ""}) assert 200 == resp.status txt = await resp.text() assert "OK" == txt await resp.release() async def test_post_text(aiohttp_client) -> None: async def handler(request): data = await request.text() assert "русский" == data data2 = await request.text() assert data == data2 return web.Response(text=data) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data="русский") assert 200 == resp.status txt = await resp.text() assert "русский" == txt await resp.release() async def test_post_json(aiohttp_client) -> None: dct = {"key": "текст"} async def handler(request): data = await request.json() assert dct == data data2 = await request.json(loads=json.loads) assert data == data2 resp = web.Response() resp.content_type = "application/json" resp.body = json.dumps(data).encode("utf8") return resp app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) headers = {"Content-Type": "application/json"} resp = await client.post("/", data=json.dumps(dct), headers=headers) assert 200 == resp.status data = await resp.json() assert dct == data await resp.release() async def test_multipart(aiohttp_client) -> None: with multipart.MultipartWriter() as writer: writer.append("test") writer.append_json({"passed": True}) async def handler(request): reader = await request.multipart() assert isinstance(reader, multipart.MultipartReader) part = await reader.next() assert isinstance(part, multipart.BodyPartReader) thing = await part.text() assert thing == "test" part = await reader.next() assert isinstance(part, multipart.BodyPartReader) assert part.headers["Content-Type"] == "application/json" thing = await part.json() assert thing == {"passed": True} resp = web.Response() resp.content_type = "application/json" resp.body = b"" return resp app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=writer) assert 200 == resp.status await resp.release() async def test_multipart_empty(aiohttp_client) -> None: with multipart.MultipartWriter() as writer: pass async def handler(request): reader = await request.multipart() assert isinstance(reader, multipart.MultipartReader) async for part in reader: assert False, f"Unexpected part found in reader: {part!r}" return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=writer) assert 200 == resp.status await resp.release() async def test_multipart_content_transfer_encoding(aiohttp_client) -> None: # For issue #1168 with multipart.MultipartWriter() as writer: writer.append(b"\x00" * 10, headers={"Content-Transfer-Encoding": "binary"}) async def handler(request): reader = await request.multipart() assert isinstance(reader, multipart.MultipartReader) part = await reader.next() assert isinstance(part, multipart.BodyPartReader) assert part.headers["Content-Transfer-Encoding"] == "binary" thing = await part.read() assert thing == b"\x00" * 10 resp = web.Response() resp.content_type = "application/json" resp.body = b"" return resp app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=writer) assert 200 == resp.status await resp.release() async def test_render_redirect(aiohttp_client) -> None: async def handler(request): raise web.HTTPMovedPermanently(location="/path") app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/", allow_redirects=False) assert 301 == resp.status txt = await resp.text() assert "301: Moved Permanently" == txt assert "/path" == resp.headers["location"] await resp.release() async def test_post_single_file(aiohttp_client) -> None: here = pathlib.Path(__file__).parent def check_file(fs): fullname = here / fs.filename with fullname.open("rb") as f: test_data = f.read() data = fs.file.read() assert test_data == data async def handler(request): data = await request.post() assert ["data.unknown_mime_type"] == list(data.keys()) for fs in data.values(): check_file(fs) fs.file.close() resp = web.Response(body=b"OK") return resp app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) fname = here / "data.unknown_mime_type" with fname.open("rb") as fd: resp = await client.post("/", data=[fd]) assert 200 == resp.status await resp.release() async def test_files_upload_with_same_key(aiohttp_client) -> None: async def handler(request): data = await request.post() files = data.getall("file") file_names = set() for _file in files: assert not _file.file.closed if _file.filename == "test1.jpeg": assert _file.file.read() == b"binary data 1" if _file.filename == "test2.jpeg": assert _file.file.read() == b"binary data 2" file_names.add(_file.filename) _file.file.close() assert len(files) == 2 assert file_names == {"test1.jpeg", "test2.jpeg"} resp = web.Response(body=b"OK") return resp app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) data = FormData() data.add_field( "file", b"binary data 1", content_type="image/jpeg", filename="test1.jpeg" ) data.add_field( "file", b"binary data 2", content_type="image/jpeg", filename="test2.jpeg" ) resp = await client.post("/", data=data) assert 200 == resp.status await resp.release() async def test_post_files(aiohttp_client) -> None: here = pathlib.Path(__file__).parent def check_file(fs): fullname = here / fs.filename with fullname.open("rb") as f: test_data = f.read() data = fs.file.read() assert test_data == data async def handler(request): data = await request.post() assert ["data.unknown_mime_type", "conftest.py"] == list(data.keys()) for fs in data.values(): check_file(fs) fs.file.close() resp = web.Response(body=b"OK") return resp app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with (here / "data.unknown_mime_type").open("rb") as f1: with (here / "conftest.py").open("rb") as f2: resp = await client.post("/", data=[f1, f2]) assert 200 == resp.status await resp.release() async def test_release_post_data(aiohttp_client) -> None: async def handler(request): await request.release() chunk = await request.content.readany() assert chunk == b"" return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data="post text") assert 200 == resp.status await resp.release() async def test_post_form_with_duplicate_keys(aiohttp_client) -> None: async def handler(request): data = await request.post() lst = list(data.items()) assert [("a", "1"), ("a", "2")] == lst return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=MultiDict([("a", 1), ("a", 2)])) assert 200 == resp.status await resp.release() def test_repr_for_application() -> None: app = web.Application() assert f"" == repr(app) async def test_expect_default_handler_unknown(aiohttp_client) -> None: # Test default Expect handler for unknown Expect value. # A server that does not understand or is unable to comply with any of # the expectation values in the Expect field of a request MUST respond # with appropriate error status. The server MUST respond with a 417 # (Expectation Failed) status if any of the expectations cannot be met # or, if there are other problems with the request, some other 4xx # status. # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.20 async def handler(request): await request.post() pytest.xfail( "Handler should not proceed to this point in case of " "unknown Expect header" ) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", headers={"Expect": "SPAM"}) assert 417 == resp.status await resp.release() async def test_100_continue(aiohttp_client) -> None: async def handler(request): data = await request.post() assert b"123" == data["name"] return web.Response() form = FormData() with pytest.warns(DeprecationWarning, match="BytesPayload"): form.add_field("name", b"123", content_transfer_encoding="base64") app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=form, expect100=True) assert 200 == resp.status await resp.release() async def test_100_continue_custom(aiohttp_client) -> None: expect_received = False async def handler(request): data = await request.post() assert b"123" == data["name"] return web.Response() async def expect_handler(request): nonlocal expect_received expect_received = True if request.version == HttpVersion11: await request.writer.write(b"HTTP/1.1 100 Continue\r\n\r\n") app = web.Application() app.router.add_post("/", handler, expect_handler=expect_handler) client = await aiohttp_client(app) resp = await client.post("/", data=new_dummy_form(), expect100=True) assert 200 == resp.status assert expect_received await resp.release() async def test_100_continue_custom_response(aiohttp_client) -> None: async def handler(request): data = await request.post() assert b"123", data["name"] return web.Response() async def expect_handler(request): if request.version == HttpVersion11: if auth_err: raise web.HTTPForbidden() await request.writer.write(b"HTTP/1.1 100 Continue\r\n\r\n") app = web.Application() app.router.add_post("/", handler, expect_handler=expect_handler) client = await aiohttp_client(app) auth_err = False resp = await client.post("/", data=new_dummy_form(), expect100=True) assert 200 == resp.status await resp.release() auth_err = True resp = await client.post("/", data=new_dummy_form(), expect100=True) assert 403 == resp.status await resp.release() async def test_expect_handler_custom_response(aiohttp_client) -> None: cache = {"foo": "bar"} async def handler(request: web.Request) -> web.Response: return web.Response(text="handler") async def expect_handler(request: web.Request) -> Optional[web.Response]: k = request.headers.get("X-Key") cached_value = cache.get(k) if cached_value: return web.Response(text=cached_value) app = web.Application() # expect_handler is only typed on add_route(). app.router.add_route("POST", "/", handler, expect_handler=expect_handler) client = await aiohttp_client(app) async with client.post("/", expect100=True, headers={"X-Key": "foo"}) as resp: assert resp.status == 200 assert await resp.text() == "bar" async with client.post("/", expect100=True, headers={"X-Key": "spam"}) as resp: assert resp.status == 200 assert await resp.text() == "handler" async def test_100_continue_for_not_found(aiohttp_client) -> None: app = web.Application() client = await aiohttp_client(app) resp = await client.post("/not_found", data="data", expect100=True) assert 404 == resp.status await resp.release() async def test_100_continue_for_not_allowed(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.get("/", expect100=True) assert 405 == resp.status await resp.release() async def test_http11_keep_alive_default(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, version=HttpVersion11) resp = await client.get("/") assert 200 == resp.status assert resp.version == HttpVersion11 assert "Connection" not in resp.headers await resp.release() @pytest.mark.xfail async def test_http10_keep_alive_default(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, version=HttpVersion10) resp = await client.get("/") assert 200 == resp.status assert resp.version == HttpVersion10 assert resp.headers["Connection"] == "keep-alive" await resp.release() async def test_http10_keep_alive_with_headers_close(aiohttp_client) -> None: async def handler(request): await request.read() return web.Response(body=b"OK") app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, version=HttpVersion10) headers = {"Connection": "close"} resp = await client.get("/", headers=headers) assert 200 == resp.status assert resp.version == HttpVersion10 assert "Connection" not in resp.headers await resp.release() async def test_http10_keep_alive_with_headers(aiohttp_client) -> None: async def handler(request): await request.read() return web.Response(body=b"OK") app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, version=HttpVersion10) headers = {"Connection": "keep-alive"} resp = await client.get("/", headers=headers) assert 200 == resp.status assert resp.version == HttpVersion10 assert resp.headers["Connection"] == "keep-alive" await resp.release() async def test_upload_file(aiohttp_client) -> None: here = pathlib.Path(__file__).parent fname = here / "aiohttp.png" with fname.open("rb") as f: data = f.read() async def handler(request): form = await request.post() raw_data = form["file"].file.read() form["file"].file.close() assert data == raw_data return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data={"file": io.BytesIO(data)}) assert 200 == resp.status await resp.release() async def test_upload_file_object(aiohttp_client) -> None: here = pathlib.Path(__file__).parent fname = here / "aiohttp.png" with fname.open("rb") as f: data = f.read() async def handler(request): form = await request.post() raw_data = form["file"].file.read() form["file"].file.close() assert data == raw_data return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: resp = await client.post("/", data={"file": f}) assert 200 == resp.status await resp.release() @pytest.mark.parametrize( "method", ["get", "post", "options", "post", "put", "patch", "delete"] ) async def test_empty_content_for_query_without_body(method, aiohttp_client) -> None: async def handler(request): assert not request.body_exists assert not request.can_read_body with pytest.warns(DeprecationWarning): assert not request.has_body return web.Response() app = web.Application() app.router.add_route(method, "/", handler) client = await aiohttp_client(app) resp = await client.request(method, "/") assert 200 == resp.status async def test_empty_content_for_query_with_body(aiohttp_client) -> None: async def handler(request): assert request.body_exists assert request.can_read_body with pytest.warns(DeprecationWarning): assert request.has_body body = await request.read() return web.Response(body=body) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=b"data") assert 200 == resp.status await resp.release() async def test_get_with_empty_arg(aiohttp_client) -> None: async def handler(request): assert "arg" in request.query assert "" == request.query["arg"] return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/?arg") assert 200 == resp.status await resp.release() async def test_large_header(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) headers = {"Long-Header": "ab" * 8129} resp = await client.get("/", headers=headers) assert 400 == resp.status await resp.release() async def test_large_header_allowed(aiohttp_client, aiohttp_server) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_post("/", handler) server = await aiohttp_server(app, max_field_size=81920) client = await aiohttp_client(server) headers = {"Long-Header": "ab" * 8129} resp = await client.post("/", headers=headers) assert 200 == resp.status await resp.release() async def test_get_with_empty_arg_with_equal(aiohttp_client) -> None: async def handler(request): assert "arg" in request.query assert "" == request.query["arg"] return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/?arg=") assert 200 == resp.status await resp.release() async def test_response_with_async_gen(aiohttp_client, fname) -> None: with fname.open("rb") as f: data = f.read() data_size = len(data) async def stream(f_name): with f_name.open("rb") as f: data = f.read(100) while data: yield data data = f.read(100) async def handler(request): headers = {"Content-Length": str(data_size)} return web.Response(body=stream(fname), headers=headers) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status resp_data = await resp.read() assert resp_data == data assert resp.headers.get("Content-Length") == str(len(resp_data)) await resp.release() async def test_response_with_streamer(aiohttp_client, fname) -> None: with fname.open("rb") as f: data = f.read() data_size = len(data) with pytest.warns(DeprecationWarning): @aiohttp.streamer async def stream(writer, f_name): with f_name.open("rb") as f: data = f.read(100) while data: await writer.write(data) data = f.read(100) async def handler(request): headers = {"Content-Length": str(data_size)} return web.Response(body=stream(fname), headers=headers) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status resp_data = await resp.read() assert resp_data == data assert resp.headers.get("Content-Length") == str(len(resp_data)) async def test_response_with_async_gen_no_params(aiohttp_client, fname) -> None: with fname.open("rb") as f: data = f.read() data_size = len(data) async def stream(): with fname.open("rb") as f: data = f.read(100) while data: yield data data = f.read(100) async def handler(request): headers = {"Content-Length": str(data_size)} return web.Response(body=stream(), headers=headers) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status resp_data = await resp.read() assert resp_data == data assert resp.headers.get("Content-Length") == str(len(resp_data)) await resp.release() async def test_response_with_streamer_no_params(aiohttp_client, fname) -> None: with fname.open("rb") as f: data = f.read() data_size = len(data) with pytest.warns(DeprecationWarning): @aiohttp.streamer async def stream(writer): with fname.open("rb") as f: data = f.read(100) while data: await writer.write(data) data = f.read(100) async def handler(request): headers = {"Content-Length": str(data_size)} return web.Response(body=stream, headers=headers) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status resp_data = await resp.read() assert resp_data == data assert resp.headers.get("Content-Length") == str(len(resp_data)) async def test_response_with_file(aiohttp_client, fname) -> None: outer_file_descriptor = None with fname.open("rb") as f: data = f.read() async def handler(request): nonlocal outer_file_descriptor outer_file_descriptor = fname.open("rb") return web.Response(body=outer_file_descriptor) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status resp_data = await resp.read() expected_content_disposition = 'attachment; filename="conftest.py"' assert resp_data == data assert resp.headers.get("Content-Type") in ( "application/octet-stream", "text/x-python", "text/plain", ) assert resp.headers.get("Content-Length") == str(len(resp_data)) assert resp.headers.get("Content-Disposition") == expected_content_disposition await resp.release() outer_file_descriptor.close() async def test_response_with_file_ctype(aiohttp_client, fname) -> None: outer_file_descriptor = None with fname.open("rb") as f: data = f.read() async def handler(request): nonlocal outer_file_descriptor outer_file_descriptor = fname.open("rb") return web.Response( body=outer_file_descriptor, headers={"content-type": "text/binary"} ) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status resp_data = await resp.read() expected_content_disposition = 'attachment; filename="conftest.py"' assert resp_data == data assert resp.headers.get("Content-Type") == "text/binary" assert resp.headers.get("Content-Length") == str(len(resp_data)) assert resp.headers.get("Content-Disposition") == expected_content_disposition await resp.release() outer_file_descriptor.close() async def test_response_with_payload_disp(aiohttp_client, fname) -> None: outer_file_descriptor = None with fname.open("rb") as f: data = f.read() async def handler(request): nonlocal outer_file_descriptor outer_file_descriptor = fname.open("rb") pl = aiohttp.get_payload(outer_file_descriptor) pl.set_content_disposition("inline", filename="test.txt") return web.Response(body=pl, headers={"content-type": "text/binary"}) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status resp_data = await resp.read() assert resp_data == data assert resp.headers.get("Content-Type") == "text/binary" assert resp.headers.get("Content-Length") == str(len(resp_data)) assert resp.headers.get("Content-Disposition") == 'inline; filename="test.txt"' await resp.release() outer_file_descriptor.close() async def test_response_with_payload_stringio(aiohttp_client, fname) -> None: async def handler(request): return web.Response(body=io.StringIO("test")) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status resp_data = await resp.read() assert resp_data == b"test" await resp.release() @pytest.mark.parametrize( "compressor,encoding", [ (zlib.compressobj(wbits=16 + zlib.MAX_WBITS), "gzip"), (zlib.compressobj(wbits=zlib.MAX_WBITS), "deflate"), # Actually, wrong compression format, but # should be supported for some legacy cases. (zlib.compressobj(wbits=-zlib.MAX_WBITS), "deflate"), ], ) async def test_response_with_precompressed_body( aiohttp_client, compressor, encoding ) -> None: async def handler(request): headers = {"Content-Encoding": encoding} data = compressor.compress(b"mydata") + compressor.flush() return web.Response(body=data, headers=headers) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status data = await resp.read() assert b"mydata" == data assert resp.headers.get("Content-Encoding") == encoding await resp.release() async def test_response_with_precompressed_body_brotli(aiohttp_client) -> None: async def handler(request): headers = {"Content-Encoding": "br"} return web.Response(body=brotli.compress(b"mydata"), headers=headers) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status data = await resp.read() assert b"mydata" == data assert resp.headers.get("Content-Encoding") == "br" await resp.release() async def test_bad_request_payload(aiohttp_client) -> None: async def handler(request): assert request.method == "POST" with pytest.raises(aiohttp.web.RequestPayloadError): await request.content.read() return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=b"test", headers={"content-encoding": "gzip"}) assert 200 == resp.status await resp.release() async def test_stream_response_multiple_chunks(aiohttp_client) -> None: async def handler(request): resp = web.StreamResponse() resp.enable_chunked_encoding() await resp.prepare(request) await resp.write(b"x") await resp.write(b"y") await resp.write(b"z") return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status data = await resp.read() assert b"xyz" == data await resp.release() async def test_start_without_routes(aiohttp_client) -> None: app = web.Application() client = await aiohttp_client(app) resp = await client.get("/") assert 404 == resp.status await resp.release() async def test_requests_count(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) assert client.server.handler.requests_count == 0 resp = await client.get("/") assert 200 == resp.status assert client.server.handler.requests_count == 1 await resp.release() resp = await client.get("/") assert 200 == resp.status assert client.server.handler.requests_count == 2 await resp.release() resp = await client.get("/") assert 200 == resp.status assert client.server.handler.requests_count == 3 await resp.release() async def test_redirect_url(aiohttp_client) -> None: async def redirector(request): raise web.HTTPFound(location=URL("/redirected")) async def redirected(request): return web.Response() app = web.Application() app.router.add_get("/redirector", redirector) app.router.add_get("/redirected", redirected) client = await aiohttp_client(app) resp = await client.get("/redirector") assert resp.status == 200 await resp.release() async def test_simple_subapp(aiohttp_client) -> None: async def handler(request): return web.Response(text="OK") app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) app.add_subapp("/path", subapp) client = await aiohttp_client(app) resp = await client.get("/path/to") assert resp.status == 200 txt = await resp.text() assert "OK" == txt await resp.release() async def test_subapp_reverse_url(aiohttp_client) -> None: async def handler(request): raise web.HTTPMovedPermanently(location=subapp.router["name"].url_for()) async def handler2(request): return web.Response(text="OK") app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) subapp.router.add_get("/final", handler2, name="name") app.add_subapp("/path", subapp) client = await aiohttp_client(app) resp = await client.get("/path/to") assert resp.status == 200 txt = await resp.text() assert "OK" == txt assert resp.url.path == "/path/final" await resp.release() async def test_subapp_reverse_variable_url(aiohttp_client) -> None: async def handler(request): raise web.HTTPMovedPermanently( location=subapp.router["name"].url_for(part="final") ) async def handler2(request): return web.Response(text="OK") app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) subapp.router.add_get("/{part}", handler2, name="name") app.add_subapp("/path", subapp) client = await aiohttp_client(app) resp = await client.get("/path/to") assert resp.status == 200 txt = await resp.text() assert "OK" == txt assert resp.url.path == "/path/final" await resp.release() async def test_subapp_reverse_static_url(aiohttp_client) -> None: fname = "aiohttp.png" async def handler(request): raise web.HTTPMovedPermanently( location=subapp.router["name"].url_for(filename=fname) ) app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) here = pathlib.Path(__file__).parent subapp.router.add_static("/static", here, name="name") app.add_subapp("/path", subapp) client = await aiohttp_client(app) resp = await client.get("/path/to") assert resp.url.path == "/path/static/" + fname assert resp.status == 200 body = await resp.read() await resp.release() with (here / fname).open("rb") as f: assert body == f.read() async def test_subapp_app(aiohttp_client) -> None: async def handler(request): assert request.app is subapp return web.Response(text="OK") app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) app.add_subapp("/path/", subapp) client = await aiohttp_client(app) resp = await client.get("/path/to") assert resp.status == 200 txt = await resp.text() assert "OK" == txt await resp.release() async def test_subapp_not_found(aiohttp_client) -> None: async def handler(request): return web.Response(text="OK") app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) app.add_subapp("/path/", subapp) client = await aiohttp_client(app) resp = await client.get("/path/other") assert resp.status == 404 await resp.release() async def test_subapp_not_found2(aiohttp_client) -> None: async def handler(request): return web.Response(text="OK") app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) app.add_subapp("/path/", subapp) client = await aiohttp_client(app) resp = await client.get("/invalid/other") assert resp.status == 404 await resp.release() async def test_subapp_not_allowed(aiohttp_client) -> None: async def handler(request): return web.Response(text="OK") app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) app.add_subapp("/path/", subapp) client = await aiohttp_client(app) resp = await client.post("/path/to") assert resp.status == 405 assert resp.headers["Allow"] == "GET,HEAD" await resp.release() async def test_subapp_cannot_add_app_in_handler(aiohttp_client) -> None: async def handler(request): request.match_info.add_app(app) return web.Response(text="OK") app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) app.add_subapp("/path/", subapp) client = await aiohttp_client(app) resp = await client.get("/path/to") assert resp.status == 500 await resp.release() async def test_subapp_middlewares(aiohttp_client) -> None: order = [] async def handler(request): return web.Response(text="OK") async def middleware_factory(app, handler: Handler): async def middleware(request): order.append((1, app)) resp = await handler(request) assert 200 == resp.status order.append((2, app)) return resp return middleware app = web.Application(middlewares=[middleware_factory]) subapp1 = web.Application(middlewares=[middleware_factory]) subapp2 = web.Application(middlewares=[middleware_factory]) subapp2.router.add_get("/to", handler) with pytest.warns(DeprecationWarning): subapp1.add_subapp("/b/", subapp2) app.add_subapp("/a/", subapp1) client = await aiohttp_client(app) resp = await client.get("/a/b/to") assert resp.status == 200 assert [ (1, app), (1, subapp1), (1, subapp2), (2, subapp2), (2, subapp1), (2, app), ] == order await resp.release() async def test_subapp_on_response_prepare(aiohttp_client) -> None: order = [] async def handler(request): return web.Response(text="OK") def make_signal(app): async def on_response(request, response): order.append(app) return on_response app = web.Application() app.on_response_prepare.append(make_signal(app)) subapp1 = web.Application() subapp1.on_response_prepare.append(make_signal(subapp1)) subapp2 = web.Application() subapp2.on_response_prepare.append(make_signal(subapp2)) subapp2.router.add_get("/to", handler) subapp1.add_subapp("/b/", subapp2) app.add_subapp("/a/", subapp1) client = await aiohttp_client(app) resp = await client.get("/a/b/to") assert resp.status == 200 assert [app, subapp1, subapp2] == order await resp.release() async def test_subapp_on_startup(aiohttp_server) -> None: order = [] async def on_signal(app): order.append(app) app = web.Application() app.on_startup.append(on_signal) subapp1 = web.Application() subapp1.on_startup.append(on_signal) subapp2 = web.Application() subapp2.on_startup.append(on_signal) subapp1.add_subapp("/b/", subapp2) app.add_subapp("/a/", subapp1) await aiohttp_server(app) assert [app, subapp1, subapp2] == order async def test_subapp_on_shutdown(aiohttp_server) -> None: order = [] async def on_signal(app): order.append(app) app = web.Application() app.on_shutdown.append(on_signal) subapp1 = web.Application() subapp1.on_shutdown.append(on_signal) subapp2 = web.Application() subapp2.on_shutdown.append(on_signal) subapp1.add_subapp("/b/", subapp2) app.add_subapp("/a/", subapp1) server = await aiohttp_server(app) await server.close() assert [app, subapp1, subapp2] == order async def test_subapp_on_cleanup(aiohttp_server) -> None: order = [] async def on_signal(app): order.append(app) app = web.Application() app.on_cleanup.append(on_signal) subapp1 = web.Application() subapp1.on_cleanup.append(on_signal) subapp2 = web.Application() subapp2.on_cleanup.append(on_signal) subapp1.add_subapp("/b/", subapp2) app.add_subapp("/a/", subapp1) server = await aiohttp_server(app) await server.close() assert [app, subapp1, subapp2] == order @pytest.mark.parametrize( "route,expected,middlewares", [ ("/sub/", ["A: root", "C: sub", "D: sub"], "AC"), ("/", ["A: root", "B: root"], "AC"), ("/sub/", ["A: root", "D: sub"], "A"), ("/", ["A: root", "B: root"], "A"), ("/sub/", ["C: sub", "D: sub"], "C"), ("/", ["B: root"], "C"), ("/sub/", ["D: sub"], ""), ("/", ["B: root"], ""), ], ) async def test_subapp_middleware_context(aiohttp_client, route, expected, middlewares): values = [] def show_app_context(appname): @web.middleware async def middleware(request, handler: Handler): values.append(f"{appname}: {request.app[my_value]}") return await handler(request) return middleware def make_handler(appname): async def handler(request): values.append(f"{appname}: {request.app[my_value]}") return web.Response(text="Ok") return handler app = web.Application() my_value = web.AppKey("my_value", str) app[my_value] = "root" if "A" in middlewares: app.middlewares.append(show_app_context("A")) app.router.add_get("/", make_handler("B")) subapp = web.Application() subapp[my_value] = "sub" if "C" in middlewares: subapp.middlewares.append(show_app_context("C")) subapp.router.add_get("/", make_handler("D")) app.add_subapp("/sub/", subapp) client = await aiohttp_client(app) resp = await client.get(route) assert 200 == resp.status assert "Ok" == await resp.text() assert expected == values await resp.release() async def test_custom_date_header(aiohttp_client) -> None: async def handler(request): return web.Response(headers={"Date": "Sun, 30 Oct 2016 03:13:52 GMT"}) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status assert resp.headers["Date"] == "Sun, 30 Oct 2016 03:13:52 GMT" await resp.release() async def test_response_prepared_with_clone(aiohttp_client) -> None: async def handler(request): cloned = request.clone() resp = web.StreamResponse() await resp.prepare(cloned) return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status await resp.release() async def test_app_max_client_size(aiohttp_client) -> None: async def handler(request): await request.post() return web.Response(body=b"ok") max_size = 1024**2 app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) data = {"long_string": max_size * "x" + "xxx"} with pytest.warns(ResourceWarning): resp = await client.post("/", data=data) assert 413 == resp.status resp_text = await resp.text() assert ( "Maximum request body size 1048576 exceeded, " "actual body size" in resp_text ) # Maximum request body size X exceeded, actual body size X body_size = int(resp_text.split()[-1]) assert body_size >= max_size await resp.release() async def test_app_max_client_size_adjusted(aiohttp_client) -> None: async def handler(request): await request.post() return web.Response(body=b"ok") default_max_size = 1024**2 custom_max_size = default_max_size * 2 app = web.Application(client_max_size=custom_max_size) app.router.add_post("/", handler) client = await aiohttp_client(app) data = {"long_string": default_max_size * "x" + "xxx"} with pytest.warns(ResourceWarning): resp = await client.post("/", data=data) assert 200 == resp.status resp_text = await resp.text() assert "ok" == resp_text await resp.release() too_large_data = {"log_string": custom_max_size * "x" + "xxx"} with pytest.warns(ResourceWarning): resp = await client.post("/", data=too_large_data) assert 413 == resp.status resp_text = await resp.text() assert ( "Maximum request body size 2097152 exceeded, " "actual body size" in resp_text ) # Maximum request body size X exceeded, actual body size X body_size = int(resp_text.split()[-1]) assert body_size >= custom_max_size await resp.release() async def test_app_max_client_size_none(aiohttp_client) -> None: async def handler(request): await request.post() return web.Response(body=b"ok") default_max_size = 1024**2 custom_max_size = None app = web.Application(client_max_size=custom_max_size) app.router.add_post("/", handler) client = await aiohttp_client(app) data = {"long_string": default_max_size * "x" + "xxx"} with pytest.warns(ResourceWarning): resp = await client.post("/", data=data) assert 200 == resp.status resp_text = await resp.text() assert "ok" == resp_text await resp.release() too_large_data = {"log_string": default_max_size * 2 * "x"} with pytest.warns(ResourceWarning): resp = await client.post("/", data=too_large_data) assert 200 == resp.status resp_text = await resp.text() assert resp_text == "ok" await resp.release() async def test_post_max_client_size(aiohttp_client) -> None: async def handler(request): await request.post() return web.Response() app = web.Application(client_max_size=10) app.router.add_post("/", handler) client = await aiohttp_client(app) with io.BytesIO(b"test") as file_handle: data = {"long_string": 1024 * "x", "file": file_handle} resp = await client.post("/", data=data) assert 413 == resp.status resp_text = await resp.text() assert ( "Maximum request body size 10 exceeded, " "actual body size 1024" in resp_text ) data["file"].close() await resp.release() async def test_post_max_client_size_for_file(aiohttp_client) -> None: async def handler(request): await request.post() return web.Response() app = web.Application(client_max_size=2) app.router.add_post("/", handler) client = await aiohttp_client(app) with io.BytesIO(b"test") as file_handle: data = {"file": file_handle} resp = await client.post("/", data=data) assert 413 == resp.status await resp.release() async def test_response_with_bodypart(aiohttp_client) -> None: async def handler(request): reader = await request.multipart() part = await reader.next() return web.Response(body=part) app = web.Application(client_max_size=2) app.router.add_post("/", handler) client = await aiohttp_client(app) with io.BytesIO(b"test") as file_handle: data = {"file": file_handle} resp = await client.post("/", data=data) assert 200 == resp.status body = await resp.read() assert body == b"test" disp = multipart.parse_content_disposition(resp.headers["content-disposition"]) assert disp == ("attachment", {"name": "file", "filename": "file"}) await resp.release() async def test_response_with_bodypart_named(aiohttp_client, tmp_path) -> None: async def handler(request): reader = await request.multipart() part = await reader.next() return web.Response(body=part) app = web.Application(client_max_size=2) app.router.add_post("/", handler) client = await aiohttp_client(app) f = tmp_path / "foobar.txt" f.write_text("test", encoding="utf8") with f.open("rb") as fd: data = {"file": fd} resp = await client.post("/", data=data) assert 200 == resp.status body = await resp.read() assert body == b"test" disp = multipart.parse_content_disposition(resp.headers["content-disposition"]) assert disp == ("attachment", {"name": "file", "filename": "foobar.txt"}) await resp.release() async def test_response_with_bodypart_invalid_name(aiohttp_client) -> None: async def handler(request): reader = await request.multipart() part = await reader.next() return web.Response(body=part) app = web.Application(client_max_size=2) app.router.add_post("/", handler) client = await aiohttp_client(app) with aiohttp.MultipartWriter() as mpwriter: mpwriter.append(b"test") resp = await client.post("/", data=mpwriter) assert 200 == resp.status body = await resp.read() assert body == b"test" assert "content-disposition" not in resp.headers await resp.release() async def test_request_clone(aiohttp_client) -> None: async def handler(request): r2 = request.clone(method="POST") assert r2.method == "POST" assert r2.match_info is request.match_info return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status await resp.release() async def test_await(aiohttp_server) -> None: async def handler(request): resp = web.StreamResponse(headers={"content-length": str(4)}) await resp.prepare(request) with pytest.deprecated_call( match=r"^drain method is deprecated, use await resp\.write\(\)$", ): await resp.drain() await asyncio.sleep(0.01) await resp.write(b"test") await asyncio.sleep(0.01) await resp.write_eof() return resp app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as session: resp = await session.get(server.make_url("/")) assert resp.status == 200 assert resp.connection is not None await resp.read() await resp.release() assert resp.connection is None async def test_response_context_manager(aiohttp_server) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) session = aiohttp.ClientSession() resp = await session.get(server.make_url("/")) async with resp: assert resp.status == 200 assert resp.connection is None await session.close() async def test_response_context_manager_error(aiohttp_server) -> None: async def handler(request): return web.Response(text="some text") app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) session = aiohttp.ClientSession() cm = session.get(server.make_url("/")) resp = await cm with pytest.raises(RuntimeError): async with resp: assert resp.status == 200 resp.content.set_exception(RuntimeError()) await resp.read() assert resp.closed assert len(session._connector._conns) == 1 await session.close() async def aiohttp_client_api_context_manager(aiohttp_server): async def handler(request): return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as session: async with session.get(server.make_url("/")) as resp: assert resp.status == 200 assert resp.connection is None assert resp.connection is None async def test_context_manager_close_on_release(aiohttp_server, mocker) -> None: async def handler(request): resp = web.StreamResponse() await resp.prepare(request) with pytest.deprecated_call( match=r"^drain method is deprecated, use await resp\.write\(\)$", ): await resp.drain() await asyncio.sleep(10) return resp app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as session: resp = await session.get(server.make_url("/")) proto = resp.connection._protocol mocker.spy(proto, "close") async with resp: assert resp.status == 200 assert resp.connection is not None assert resp.connection is None assert proto.close.called await resp.release() # Trigger handler completion async def test_iter_any(aiohttp_server) -> None: data = b"0123456789" * 1024 async def handler(request): buf = [] async for raw in request.content.iter_any(): buf.append(raw) assert b"".join(buf) == data return web.Response() app = web.Application() app.router.add_route("POST", "/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as session: async with session.post(server.make_url("/"), data=data) as resp: assert resp.status == 200 async def test_request_tracing(aiohttp_server) -> None: on_request_start = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_request_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_dns_resolvehost_start = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_dns_resolvehost_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_request_redirect = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_connection_create_start = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_connection_create_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) async def redirector(request): raise web.HTTPFound(location=URL("/redirected")) async def redirected(request): return web.Response() trace_config = TraceConfig() trace_config.on_request_start.append(on_request_start) trace_config.on_request_end.append(on_request_end) trace_config.on_request_redirect.append(on_request_redirect) trace_config.on_connection_create_start.append(on_connection_create_start) trace_config.on_connection_create_end.append(on_connection_create_end) trace_config.on_dns_resolvehost_start.append(on_dns_resolvehost_start) trace_config.on_dns_resolvehost_end.append(on_dns_resolvehost_end) app = web.Application() app.router.add_get("/redirector", redirector) app.router.add_get("/redirected", redirected) server = await aiohttp_server(app) class FakeResolver: _LOCAL_HOST = {0: "127.0.0.1", socket.AF_INET: "127.0.0.1"} def __init__(self, fakes): # fakes -- dns -> port dict self._fakes = fakes self._resolver = aiohttp.DefaultResolver() async def resolve(self, host, port=0, family=socket.AF_INET): fake_port = self._fakes.get(host) if fake_port is not None: return [ { "hostname": host, "host": self._LOCAL_HOST[family], "port": fake_port, "family": socket.AF_INET, "proto": 0, "flags": socket.AI_NUMERICHOST, } ] else: return await self._resolver.resolve(host, port, family) resolver = FakeResolver({"example.com": server.port}) connector = aiohttp.TCPConnector(resolver=resolver) client = aiohttp.ClientSession(connector=connector, trace_configs=[trace_config]) resp = await client.get("http://example.com/redirector", data="foo") assert on_request_start.called assert on_request_end.called assert on_dns_resolvehost_start.called assert on_dns_resolvehost_end.called assert on_request_redirect.called assert on_connection_create_start.called assert on_connection_create_end.called await resp.release() await client.close() async def test_return_http_exception_deprecated(aiohttp_client) -> None: async def handler(request): return web.HTTPForbidden() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) with pytest.warns(DeprecationWarning): await client.get("/") async def test_request_path(aiohttp_client) -> None: async def handler(request): assert request.path_qs == "/path%20to?a=1" assert request.path == "/path to" assert request.raw_path == "/path%20to?a=1" return web.Response(body=b"OK") app = web.Application() app.router.add_get("/path to", handler) client = await aiohttp_client(app) resp = await client.get("/path to", params={"a": "1"}) assert 200 == resp.status txt = await resp.text() assert "OK" == txt await resp.release() async def test_app_add_routes(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.add_routes([web.get("/get", handler)]) client = await aiohttp_client(app) resp = await client.get("/get") assert resp.status == 200 await resp.release() async def test_request_headers_type(aiohttp_client) -> None: async def handler(request): assert isinstance(request.headers, CIMultiDictProxy) return web.Response() app = web.Application() app.add_routes([web.get("/get", handler)]) client = await aiohttp_client(app) resp = await client.get("/get") assert resp.status == 200 await resp.release() async def test_signal_on_error_handler(aiohttp_client) -> None: async def on_prepare(request, response): response.headers["X-Custom"] = "val" app = web.Application() app.on_response_prepare.append(on_prepare) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 404 assert resp.headers["X-Custom"] == "val" await resp.release() @pytest.mark.skipif( "HttpRequestParserC" not in dir(aiohttp.http_parser), reason="C based HTTP parser not available", ) async def test_bad_method_for_c_http_parser_not_hangs(aiohttp_client) -> None: app = web.Application() timeout = aiohttp.ClientTimeout(sock_read=0.2) client = await aiohttp_client(app, timeout=timeout) resp = await client.request("GET1", "/") assert 400 == resp.status async def test_read_bufsize(aiohttp_client) -> None: async def handler(request): ret = request.content.get_read_buffer_limits() data = await request.text() # read posted data return web.Response(text=f"{data} {ret!r}") app = web.Application(handler_args={"read_bufsize": 2}) app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=b"data") assert resp.status == 200 assert await resp.text() == "data (2, 4)" await resp.release() @pytest.mark.parametrize( "auto_decompress,len_of", [(True, "uncompressed"), (False, "compressed")] ) async def test_auto_decompress( aiohttp_client, auto_decompress, len_of, ) -> None: async def handler(request): data = await request.read() return web.Response(text=str(len(data))) app = web.Application(handler_args={"auto_decompress": auto_decompress}) app.router.add_post("/", handler) client = await aiohttp_client(app) uncompressed = b"dataaaaaaaaaaaaaaaaaaaaaaaaa" compressor = zlib.compressobj(wbits=16 + zlib.MAX_WBITS) compressed = compressor.compress(uncompressed) + compressor.flush() assert len(compressed) != len(uncompressed) headers = {"content-encoding": "gzip"} resp = await client.post("/", data=compressed, headers=headers) assert resp.status == 200 assert await resp.text() == str(len(locals()[len_of])) await resp.release() @pytest.mark.parametrize( "status", [101, 204], ) async def test_response_101_204_no_content_length_http11( status, aiohttp_client ) -> None: async def handler(_): return web.Response(status=status) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, version="1.1") resp = await client.get("/") assert CONTENT_LENGTH not in resp.headers assert TRANSFER_ENCODING not in resp.headers await resp.release() async def test_stream_response_headers_204(aiohttp_client): async def handler(_): return web.StreamResponse(status=204) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert CONTENT_TYPE not in resp.headers assert TRANSFER_ENCODING not in resp.headers await resp.release() async def test_httpfound_cookies_302(aiohttp_client: Any) -> None: async def handler(_): resp = web.HTTPFound("/") resp.set_cookie("my-cookie", "cookie-value") raise resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/", allow_redirects=False) assert "my-cookie" in resp.cookies await resp.release() @pytest.mark.parametrize("status", (101, 204, 304)) @pytest.mark.parametrize("version", (HttpVersion10, HttpVersion11)) async def test_no_body_for_1xx_204_304_responses( aiohttp_client: Any, status: int, version: HttpVersion ) -> None: """Test no body is present for for 1xx, 204, and 304 responses.""" async def handler(_): return web.Response(status=status, body=b"should not get to client") app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, version=version) resp = await client.get("/") assert CONTENT_TYPE not in resp.headers assert TRANSFER_ENCODING not in resp.headers await resp.read() == b"" await resp.release() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_web_log.py0000644000175100001770000001640714607525266017023 0ustar00runnerdockerimport datetime import logging import platform from typing import Any from unittest import mock import pytest import aiohttp from aiohttp import web from aiohttp.abc import AbstractAccessLogger from aiohttp.typedefs import Handler from aiohttp.web_log import AccessLogger try: from contextvars import ContextVar except ImportError: ContextVar = None IS_PYPY = platform.python_implementation() == "PyPy" def test_access_logger_format() -> None: log_format = '%T "%{ETag}o" %X {X} %%P' mock_logger = mock.Mock() access_logger = AccessLogger(mock_logger, log_format) expected = '%s "%s" %%X {X} %%%s' assert expected == access_logger._log_format @pytest.mark.skipif( IS_PYPY, reason=""" Because of patching :py:class:`datetime.datetime`, under PyPy it fails in :py:func:`isinstance` call in :py:meth:`datetime.datetime.__sub__` (called from :py:meth:`aiohttp.AccessLogger._format_t`): *** TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types (Pdb) from datetime import datetime (Pdb) isinstance(now, datetime) *** TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types (Pdb) datetime.__class__ (Pdb) isinstance(now, datetime.__class__) False Ref: https://bitbucket.org/pypy/pypy/issues/1187/call-to-isinstance-in-__sub__-self-other Ref: https://github.com/celery/celery/issues/811 Ref: https://stackoverflow.com/a/46102240/595220 """, ) @pytest.mark.parametrize( "log_format,expected,extra", [ ( "%t", "[01/Jan/1843:00:29:56 +0800]", {"request_start_time": "[01/Jan/1843:00:29:56 +0800]"}, ), ( '%a %t %P %r %s %b %T %Tf %D "%{H1}i" "%{H2}i"', ( "127.0.0.2 [01/Jan/1843:00:29:56 +0800] <42> " 'GET /path HTTP/1.1 200 42 3 3.141593 3141593 "a" "b"' ), { "first_request_line": "GET /path HTTP/1.1", "process_id": "<42>", "remote_address": "127.0.0.2", "request_start_time": "[01/Jan/1843:00:29:56 +0800]", "request_time": "3", "request_time_frac": "3.141593", "request_time_micro": "3141593", "response_size": 42, "response_status": 200, "request_header": {"H1": "a", "H2": "b"}, }, ), ], ) def test_access_logger_atoms( monkeypatch: Any, log_format: Any, expected: Any, extra: Any ) -> None: class PatchedDatetime(datetime.datetime): @staticmethod def now(tz): return datetime.datetime(1843, 1, 1, 0, 30, tzinfo=tz) monkeypatch.setattr("datetime.datetime", PatchedDatetime) monkeypatch.setattr("time.timezone", -28800) monkeypatch.setattr("os.getpid", lambda: 42) mock_logger = mock.Mock() access_logger = AccessLogger(mock_logger, log_format) request = mock.Mock( headers={"H1": "a", "H2": "b"}, method="GET", path_qs="/path", version=aiohttp.HttpVersion(1, 1), remote="127.0.0.2", ) response = mock.Mock(headers={}, body_length=42, status=200) access_logger.log(request, response, 3.1415926) assert not mock_logger.exception.called, mock_logger.exception.call_args mock_logger.info.assert_called_with(expected, extra=extra) def test_access_logger_dicts() -> None: log_format = "%{User-Agent}i %{Content-Length}o %{None}i" mock_logger = mock.Mock() access_logger = AccessLogger(mock_logger, log_format) request = mock.Mock( headers={"User-Agent": "Mock/1.0"}, version=(1, 1), remote="127.0.0.2" ) response = mock.Mock(headers={"Content-Length": 123}) access_logger.log(request, response, 0.0) assert not mock_logger.error.called expected = "Mock/1.0 123 -" extra = { "request_header": {"User-Agent": "Mock/1.0", "None": "-"}, "response_header": {"Content-Length": 123}, } mock_logger.info.assert_called_with(expected, extra=extra) def test_access_logger_unix_socket() -> None: log_format = "|%a|" mock_logger = mock.Mock() access_logger = AccessLogger(mock_logger, log_format) request = mock.Mock(headers={"User-Agent": "Mock/1.0"}, version=(1, 1), remote="") response = mock.Mock() access_logger.log(request, response, 0.0) assert not mock_logger.error.called expected = "||" mock_logger.info.assert_called_with(expected, extra={"remote_address": ""}) def test_logger_no_message() -> None: mock_logger = mock.Mock() access_logger = AccessLogger(mock_logger, "%r %{content-type}i") extra_dict = { "first_request_line": "-", "request_header": {"content-type": "(no headers)"}, } access_logger.log(None, None, 0.0) mock_logger.info.assert_called_with("- (no headers)", extra=extra_dict) def test_logger_internal_error() -> None: mock_logger = mock.Mock() access_logger = AccessLogger(mock_logger, "%D") access_logger.log(None, None, "invalid") mock_logger.exception.assert_called_with("Error in logging") def test_logger_no_transport() -> None: mock_logger = mock.Mock() access_logger = AccessLogger(mock_logger, "%a") access_logger.log(None, None, 0) mock_logger.info.assert_called_with("-", extra={"remote_address": "-"}) def test_logger_abc() -> None: class Logger(AbstractAccessLogger): def log(self, request, response, time): 1 / 0 mock_logger = mock.Mock() access_logger = Logger(mock_logger, None) with pytest.raises(ZeroDivisionError): access_logger.log(None, None, None) class Logger(AbstractAccessLogger): def log(self, request, response, time): self.logger.info( self.log_format.format(request=request, response=response, time=time) ) mock_logger = mock.Mock() access_logger = Logger(mock_logger, "{request} {response} {time}") access_logger.log("request", "response", 1) mock_logger.info.assert_called_with("request response 1") async def test_contextvars_logger(aiohttp_server, aiohttp_client): VAR = ContextVar("VAR") async def handler(request): return web.Response() @web.middleware async def middleware(request, handler: Handler): VAR.set("uuid") return await handler(request) msg = None class Logger(AbstractAccessLogger): def log(self, request, response, time): nonlocal msg msg = f"contextvars: {VAR.get()}" app = web.Application(middlewares=[middleware]) app.router.add_get("/", handler) server = await aiohttp_server(app, access_log_class=Logger) client = await aiohttp_client(server) resp = await client.get("/") assert 200 == resp.status assert msg == "contextvars: uuid" def test_logger_does_nothing_when_disabled(caplog: pytest.LogCaptureFixture) -> None: """Test that the logger does nothing when the log level is disabled.""" mock_logger = logging.getLogger("test.aiohttp.log") mock_logger.setLevel(logging.INFO) access_logger = AccessLogger(mock_logger, "%b") access_logger.log( mock.Mock(name="mock_request"), mock.Mock(name="mock_response"), 42 ) assert "mock_response" in caplog.text ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_web_middleware.py0000644000175100001770000004176414607525266020363 0ustar00runnerdockerimport re from typing import Any import pytest from yarl import URL from aiohttp import web from aiohttp.typedefs import Handler async def test_middleware_modifies_response(loop, aiohttp_client) -> None: async def handler(request): return web.Response(body=b"OK") @web.middleware async def middleware(request, handler: Handler): resp = await handler(request) assert 200 == resp.status resp.set_status(201) resp.text = resp.text + "[MIDDLEWARE]" return resp app = web.Application() app.middlewares.append(middleware) app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 201 == resp.status txt = await resp.text() assert "OK[MIDDLEWARE]" == txt async def test_middleware_handles_exception(loop, aiohttp_client) -> None: async def handler(request): raise RuntimeError("Error text") @web.middleware async def middleware(request, handler: Handler): with pytest.raises(RuntimeError) as ctx: await handler(request) return web.Response(status=501, text=str(ctx.value) + "[MIDDLEWARE]") app = web.Application() app.middlewares.append(middleware) app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 501 == resp.status txt = await resp.text() assert "Error text[MIDDLEWARE]" == txt async def test_middleware_chain(loop, aiohttp_client) -> None: async def handler(request): return web.Response(text="OK") handler.annotation = "annotation_value" async def handler2(request): return web.Response(text="OK") middleware_annotation_seen_values = [] def make_middleware(num): @web.middleware async def middleware(request, handler: Handler): middleware_annotation_seen_values.append( getattr(handler, "annotation", None) ) resp = await handler(request) resp.text = resp.text + f"[{num}]" return resp return middleware app = web.Application() app.middlewares.append(make_middleware(1)) app.middlewares.append(make_middleware(2)) app.router.add_route("GET", "/", handler) app.router.add_route("GET", "/r2", handler2) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert "OK[2][1]" == txt assert middleware_annotation_seen_values == ["annotation_value", "annotation_value"] # check that attributes from handler are not applied to handler2 resp = await client.get("/r2") assert 200 == resp.status assert middleware_annotation_seen_values == [ "annotation_value", "annotation_value", None, None, ] async def test_middleware_subapp(loop, aiohttp_client) -> None: async def sub_handler(request): return web.Response(text="OK") sub_handler.annotation = "annotation_value" async def handler(request): return web.Response(text="OK") middleware_annotation_seen_values = [] def make_middleware(num): @web.middleware async def middleware(request, handler: Handler): annotation = getattr(handler, "annotation", None) if annotation is not None: middleware_annotation_seen_values.append(f"{annotation}/{num}") return await handler(request) return middleware app = web.Application() app.middlewares.append(make_middleware(1)) app.router.add_route("GET", "/r2", handler) subapp = web.Application() subapp.middlewares.append(make_middleware(2)) subapp.router.add_route("GET", "/", sub_handler) app.add_subapp("/sub", subapp) client = await aiohttp_client(app) resp = await client.get("/sub/") assert 200 == resp.status await resp.text() assert middleware_annotation_seen_values == [ "annotation_value/1", "annotation_value/2", ] # check that attributes from sub_handler are not applied to handler del middleware_annotation_seen_values[:] resp = await client.get("/r2") assert 200 == resp.status assert middleware_annotation_seen_values == [] @pytest.fixture def cli(loop, aiohttp_client): async def handler(request): return web.Response(text="OK") def wrapper(extra_middlewares): app = web.Application() app.router.add_route("GET", "/resource1", handler) app.router.add_route("GET", "/resource2/", handler) app.router.add_route("GET", "/resource1/a/b", handler) app.router.add_route("GET", "/resource2/a/b/", handler) app.router.add_route("GET", "/resource2/a/b%2Fc/", handler) app.middlewares.extend(extra_middlewares) return aiohttp_client(app, server_kwargs={"skip_url_asserts": True}) return wrapper class TestNormalizePathMiddleware: @pytest.mark.parametrize( "path, status", [ ("/resource1", 200), ("/resource1/", 404), ("/resource2", 200), ("/resource2/", 200), ("/resource1?p1=1&p2=2", 200), ("/resource1/?p1=1&p2=2", 404), ("/resource2?p1=1&p2=2", 200), ("/resource2/?p1=1&p2=2", 200), ("/resource2/a/b%2Fc", 200), ("/resource2/a/b%2Fc/", 200), ], ) async def test_add_trailing_when_necessary(self, path, status, cli): extra_middlewares = [web.normalize_path_middleware(merge_slashes=False)] client = await cli(extra_middlewares) resp = await client.get(path) assert resp.status == status assert resp.url.query == URL(path).query @pytest.mark.parametrize( "path, status", [ ("/resource1", 200), ("/resource1/", 200), ("/resource2", 404), ("/resource2/", 200), ("/resource1?p1=1&p2=2", 200), ("/resource1/?p1=1&p2=2", 200), ("/resource2?p1=1&p2=2", 404), ("/resource2/?p1=1&p2=2", 200), ("/resource2/a/b%2Fc", 404), ("/resource2/a/b%2Fc/", 200), ], ) async def test_remove_trailing_when_necessary(self, path, status, cli) -> None: extra_middlewares = [ web.normalize_path_middleware( append_slash=False, remove_slash=True, merge_slashes=False ) ] client = await cli(extra_middlewares) resp = await client.get(path) assert resp.status == status assert resp.url.query == URL(path).query @pytest.mark.parametrize( "path, status", [ ("/resource1", 200), ("/resource1/", 404), ("/resource2", 404), ("/resource2/", 200), ("/resource1?p1=1&p2=2", 200), ("/resource1/?p1=1&p2=2", 404), ("/resource2?p1=1&p2=2", 404), ("/resource2/?p1=1&p2=2", 200), ("/resource2/a/b%2Fc", 404), ("/resource2/a/b%2Fc/", 200), ], ) async def test_no_trailing_slash_when_disabled(self, path, status, cli): extra_middlewares = [ web.normalize_path_middleware(append_slash=False, merge_slashes=False) ] client = await cli(extra_middlewares) resp = await client.get(path) assert resp.status == status assert resp.url.query == URL(path).query @pytest.mark.parametrize( "path, status", [ ("/resource1/a/b", 200), ("//resource1//a//b", 200), ("//resource1//a//b/", 404), ("///resource1//a//b", 200), ("/////resource1/a///b", 200), ("/////resource1/a//b/", 404), ("/resource1/a/b?p=1", 200), ("//resource1//a//b?p=1", 200), ("//resource1//a//b/?p=1", 404), ("///resource1//a//b?p=1", 200), ("/////resource1/a///b?p=1", 200), ("/////resource1/a//b/?p=1", 404), ], ) async def test_merge_slash(self, path, status, cli) -> None: extra_middlewares = [web.normalize_path_middleware(append_slash=False)] client = await cli(extra_middlewares) resp = await client.get(path) assert resp.status == status assert resp.url.query == URL(path).query @pytest.mark.parametrize( "path, status", [ ("/resource1/a/b", 200), ("/resource1/a/b/", 404), ("//resource2//a//b", 200), ("//resource2//a//b/", 200), ("///resource1//a//b", 200), ("///resource1//a//b/", 404), ("/////resource1/a///b", 200), ("/////resource1/a///b/", 404), ("/resource2/a/b", 200), ("//resource2//a//b", 200), ("//resource2//a//b/", 200), ("///resource2//a//b", 200), ("///resource2//a//b/", 200), ("/////resource2/a///b", 200), ("/////resource2/a///b/", 200), ("/resource1/a/b?p=1", 200), ("/resource1/a/b/?p=1", 404), ("//resource2//a//b?p=1", 200), ("//resource2//a//b/?p=1", 200), ("///resource1//a//b?p=1", 200), ("///resource1//a//b/?p=1", 404), ("/////resource1/a///b?p=1", 200), ("/////resource1/a///b/?p=1", 404), ("/resource2/a/b?p=1", 200), ("//resource2//a//b?p=1", 200), ("//resource2//a//b/?p=1", 200), ("///resource2//a//b?p=1", 200), ("///resource2//a//b/?p=1", 200), ("/////resource2/a///b?p=1", 200), ("/////resource2/a///b/?p=1", 200), ], ) async def test_append_and_merge_slash(self, path, status, cli) -> None: extra_middlewares = [web.normalize_path_middleware()] client = await cli(extra_middlewares) resp = await client.get(path) assert resp.status == status assert resp.url.query == URL(path).query @pytest.mark.parametrize( "path, status", [ ("/resource1/a/b", 200), ("/resource1/a/b/", 200), ("//resource2//a//b", 404), ("//resource2//a//b/", 200), ("///resource1//a//b", 200), ("///resource1//a//b/", 200), ("/////resource1/a///b", 200), ("/////resource1/a///b/", 200), ("/////resource1/a///b///", 200), ("/resource2/a/b", 404), ("//resource2//a//b", 404), ("//resource2//a//b/", 200), ("///resource2//a//b", 404), ("///resource2//a//b/", 200), ("/////resource2/a///b", 404), ("/////resource2/a///b/", 200), ("/resource1/a/b?p=1", 200), ("/resource1/a/b/?p=1", 200), ("//resource2//a//b?p=1", 404), ("//resource2//a//b/?p=1", 200), ("///resource1//a//b?p=1", 200), ("///resource1//a//b/?p=1", 200), ("/////resource1/a///b?p=1", 200), ("/////resource1/a///b/?p=1", 200), ("/resource2/a/b?p=1", 404), ("//resource2//a//b?p=1", 404), ("//resource2//a//b/?p=1", 200), ("///resource2//a//b?p=1", 404), ("///resource2//a//b/?p=1", 200), ("/////resource2/a///b?p=1", 404), ("/////resource2/a///b/?p=1", 200), ], ) async def test_remove_and_merge_slash(self, path, status, cli) -> None: extra_middlewares = [ web.normalize_path_middleware(append_slash=False, remove_slash=True) ] client = await cli(extra_middlewares) resp = await client.get(path) assert resp.status == status assert resp.url.query == URL(path).query async def test_cannot_remove_and_add_slash(self) -> None: with pytest.raises(AssertionError): web.normalize_path_middleware(append_slash=True, remove_slash=True) @pytest.mark.parametrize( ["append_slash", "remove_slash"], [ (True, False), (False, True), (False, False), ], ) async def test_open_redirects( self, append_slash: bool, remove_slash: bool, aiohttp_client: Any ) -> None: async def handle(request: web.Request) -> web.StreamResponse: pytest.fail( msg="Security advisory 'GHSA-v6wp-4m6f-gcjg' test handler " "matched unexpectedly", pytrace=False, ) app = web.Application( middlewares=[ web.normalize_path_middleware( append_slash=append_slash, remove_slash=remove_slash ) ] ) app.add_routes([web.get("/", handle), web.get("/google.com", handle)]) client = await aiohttp_client(app, server_kwargs={"skip_url_asserts": True}) resp = await client.get("//google.com", allow_redirects=False) assert resp.status == 308 assert resp.headers["Location"] == "/google.com" assert resp.url.query == URL("//google.com").query async def test_old_style_middleware(loop, aiohttp_client) -> None: async def handler(request): return web.Response(body=b"OK") async def middleware_factory(app, handler: Handler): async def middleware(request): resp = await handler(request) assert 200 == resp.status resp.set_status(201) resp.text = resp.text + "[old style middleware]" return resp return middleware with pytest.warns(DeprecationWarning) as warning_checker: app = web.Application() app.middlewares.append(middleware_factory) app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 201 == resp.status txt = await resp.text() assert "OK[old style middleware]" == txt found = False for obj in warning_checker.list: msg = str(obj.message) if "old-style" not in msg: continue assert re.match( "^old-style middleware " '".' 'middleware_factory at 0x[0-9a-fA-F]+>" ' "deprecated, see #2252$", msg, ) found = True assert found async def test_old_style_middleware_class(loop, aiohttp_client) -> None: async def handler(request): return web.Response(body=b"OK") class Middleware: async def __call__(self, app, handler: Handler): async def middleware(request): resp = await handler(request) assert 200 == resp.status resp.set_status(201) resp.text = resp.text + "[old style middleware]" return resp return middleware with pytest.warns(DeprecationWarning) as warning_checker: app = web.Application() app.middlewares.append(Middleware()) app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 201 == resp.status txt = await resp.text() assert "OK[old style middleware]" == txt found = False for obj in warning_checker.list: msg = str(obj.message) if "old-style" not in msg: continue assert re.match( "^old-style middleware " '"<.*test_web_middleware.test_old_style_middleware_class.' ".Middleware object " 'at 0x[0-9a-fA-F]+>" deprecated, see #2252$', msg, ) found = True assert found async def test_new_style_middleware_class(loop, aiohttp_client) -> None: async def handler(request): return web.Response(body=b"OK") @web.middleware class Middleware: async def __call__(self, request, handler: Handler): resp = await handler(request) assert 200 == resp.status resp.set_status(201) resp.text = resp.text + "[new style middleware]" return resp app = web.Application() app.middlewares.append(Middleware()) app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 201 == resp.status txt = await resp.text() assert "OK[new style middleware]" == txt async def test_new_style_middleware_method(loop, aiohttp_client) -> None: async def handler(request): return web.Response(body=b"OK") class Middleware: @web.middleware async def call(self, request, handler: Handler): resp = await handler(request) assert 200 == resp.status resp.set_status(201) resp.text = resp.text + "[new style middleware]" return resp app = web.Application() app.middlewares.append(Middleware().call) app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 201 == resp.status txt = await resp.text() assert "OK[new style middleware]" == txt ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_web_request.py0000644000175100001770000006431614607525266017734 0ustar00runnerdockerimport asyncio import datetime import socket from collections.abc import MutableMapping from typing import Any from unittest import mock import pytest from multidict import CIMultiDict, CIMultiDictProxy, MultiDict from yarl import URL from aiohttp import HttpVersion from aiohttp.http_parser import RawRequestMessage from aiohttp.streams import StreamReader from aiohttp.test_utils import make_mocked_request from aiohttp.web import BaseRequest, HTTPRequestEntityTooLarge from aiohttp.web_request import ETag @pytest.fixture def protocol(): return mock.Mock(_reading_paused=False) def test_base_ctor() -> None: message = RawRequestMessage( "GET", "/path/to?a=1&b=2", HttpVersion(1, 1), CIMultiDictProxy(CIMultiDict()), (), False, False, False, False, URL("/path/to?a=1&b=2"), ) req = BaseRequest( message, mock.Mock(), mock.Mock(), mock.Mock(), mock.Mock(), mock.Mock() ) assert "GET" == req.method assert HttpVersion(1, 1) == req.version # MacOS may return CamelCased host name, need .lower() # FQDN can be wider than host, e.g. # 'fv-az397-495' in 'fv-az397-495.internal.cloudapp.net' assert req.host.lower() in socket.getfqdn().lower() assert "/path/to?a=1&b=2" == req.path_qs assert "/path/to" == req.path assert "a=1&b=2" == req.query_string assert CIMultiDict() == req.headers assert () == req.raw_headers get = req.query assert MultiDict([("a", "1"), ("b", "2")]) == get # second call should return the same object assert get is req.query assert req.keep_alive assert req def test_ctor() -> None: req = make_mocked_request("GET", "/path/to?a=1&b=2") assert "GET" == req.method assert HttpVersion(1, 1) == req.version # MacOS may return CamelCased host name, need .lower() # FQDN can be wider than host, e.g. # 'fv-az397-495' in 'fv-az397-495.internal.cloudapp.net' assert req.host.lower() in socket.getfqdn().lower() assert "/path/to?a=1&b=2" == req.path_qs assert "/path/to" == req.path assert "a=1&b=2" == req.query_string assert CIMultiDict() == req.headers assert () == req.raw_headers get = req.query assert MultiDict([("a", "1"), ("b", "2")]) == get # second call should return the same object assert get is req.query assert req.keep_alive # just make sure that all lines of make_mocked_request covered headers = CIMultiDict(FOO="bar") payload = mock.Mock() protocol = mock.Mock() app = mock.Mock() req = make_mocked_request( "GET", "/path/to?a=1&b=2", headers=headers, protocol=protocol, payload=payload, app=app, ) assert req.app is app assert req.content is payload assert req.protocol is protocol assert req.transport is protocol.transport assert req.headers == headers assert req.raw_headers == ((b"FOO", b"bar"),) assert req.task is req._task def test_deprecated_message() -> None: req = make_mocked_request("GET", "/path/to?a=1&b=2") with pytest.deprecated_call(match=r"^Request\.message is deprecated$"): assert req.message == req._message def test_doubleslashes() -> None: # NB: //foo/bar is an absolute URL with foo netloc and /bar path req = make_mocked_request("GET", "/bar//foo/") assert "/bar//foo/" == req.path def test_content_type_not_specified() -> None: req = make_mocked_request("Get", "/") assert "application/octet-stream" == req.content_type def test_content_type_from_spec() -> None: req = make_mocked_request( "Get", "/", CIMultiDict([("CONTENT-TYPE", "application/json")]) ) assert "application/json" == req.content_type def test_content_type_from_spec_with_charset() -> None: req = make_mocked_request( "Get", "/", CIMultiDict([("CONTENT-TYPE", "text/html; charset=UTF-8")]) ) assert "text/html" == req.content_type assert "UTF-8" == req.charset def test_calc_content_type_on_getting_charset() -> None: req = make_mocked_request( "Get", "/", CIMultiDict([("CONTENT-TYPE", "text/html; charset=UTF-8")]) ) assert "UTF-8" == req.charset assert "text/html" == req.content_type def test_urlencoded_querystring() -> None: req = make_mocked_request("GET", "/yandsearch?text=%D1%82%D0%B5%D0%BA%D1%81%D1%82") assert {"text": "текст"} == req.query def test_non_ascii_path() -> None: req = make_mocked_request("GET", "/путь") assert "/путь" == req.path def test_non_ascii_raw_path() -> None: req = make_mocked_request("GET", "/путь") assert "/путь" == req.raw_path def test_absolute_url() -> None: req = make_mocked_request("GET", "https://example.com/path/to?a=1") assert req.url == URL("https://example.com/path/to?a=1") assert req.scheme == "https" assert req.host == "example.com" assert req.rel_url == URL.build(path="/path/to", query={"a": "1"}) def test_content_length() -> None: req = make_mocked_request("Get", "/", CIMultiDict([("CONTENT-LENGTH", "123")])) assert 123 == req.content_length def test_range_to_slice_head() -> None: def bytes_gen(size): for i in range(size): yield i % 256 payload = bytearray(bytes_gen(10000)) req = make_mocked_request( "GET", "/", headers=CIMultiDict([("RANGE", "bytes=0-499")]), payload=payload ) assert isinstance(req.http_range, slice) assert req.content[req.http_range] == payload[:500] def test_range_to_slice_mid() -> None: def bytes_gen(size): for i in range(size): yield i % 256 payload = bytearray(bytes_gen(10000)) req = make_mocked_request( "GET", "/", headers=CIMultiDict([("RANGE", "bytes=500-999")]), payload=payload ) assert isinstance(req.http_range, slice) assert req.content[req.http_range] == payload[500:1000] def test_range_to_slice_tail_start() -> None: def bytes_gen(size): for i in range(size): yield i % 256 payload = bytearray(bytes_gen(10000)) req = make_mocked_request( "GET", "/", headers=CIMultiDict([("RANGE", "bytes=9500-")]), payload=payload ) assert isinstance(req.http_range, slice) assert req.content[req.http_range] == payload[-500:] def test_range_to_slice_tail_stop() -> None: def bytes_gen(size): for i in range(size): yield i % 256 payload = bytearray(bytes_gen(10000)) req = make_mocked_request( "GET", "/", headers=CIMultiDict([("RANGE", "bytes=-500")]), payload=payload ) assert isinstance(req.http_range, slice) assert req.content[req.http_range] == payload[-500:] def test_non_keepalive_on_http10() -> None: req = make_mocked_request("GET", "/", version=HttpVersion(1, 0)) assert not req.keep_alive def test_non_keepalive_on_closing() -> None: req = make_mocked_request("GET", "/", closing=True) assert not req.keep_alive async def test_call_POST_on_GET_request() -> None: req = make_mocked_request("GET", "/") ret = await req.post() assert CIMultiDict() == ret async def test_call_POST_on_weird_content_type() -> None: req = make_mocked_request( "POST", "/", headers=CIMultiDict({"CONTENT-TYPE": "something/weird"}) ) ret = await req.post() assert CIMultiDict() == ret async def test_call_POST_twice() -> None: req = make_mocked_request("GET", "/") ret1 = await req.post() ret2 = await req.post() assert ret1 is ret2 def test_no_request_cookies() -> None: req = make_mocked_request("GET", "/") assert req.cookies == {} cookies = req.cookies assert cookies is req.cookies def test_request_cookie() -> None: headers = CIMultiDict(COOKIE="cookie1=value1; cookie2=value2") req = make_mocked_request("GET", "/", headers=headers) assert req.cookies == {"cookie1": "value1", "cookie2": "value2"} def test_request_cookie__set_item() -> None: headers = CIMultiDict(COOKIE="name=value") req = make_mocked_request("GET", "/", headers=headers) assert req.cookies == {"name": "value"} with pytest.raises(TypeError): req.cookies["my"] = "value" def test_match_info() -> None: req = make_mocked_request("GET", "/") assert req._match_info is req.match_info def test_request_is_mutable_mapping() -> None: req = make_mocked_request("GET", "/") assert isinstance(req, MutableMapping) req["key"] = "value" assert "value" == req["key"] def test_request_delitem() -> None: req = make_mocked_request("GET", "/") req["key"] = "value" assert "value" == req["key"] del req["key"] assert "key" not in req def test_request_len() -> None: req = make_mocked_request("GET", "/") assert len(req) == 0 req["key"] = "value" assert len(req) == 1 def test_request_iter() -> None: req = make_mocked_request("GET", "/") req["key"] = "value" req["key2"] = "value2" assert set(req) == {"key", "key2"} def test___repr__() -> None: req = make_mocked_request("GET", "/path/to") assert "" == repr(req) def test___repr___non_ascii_path() -> None: req = make_mocked_request("GET", "/path/\U0001f415\U0001f308") assert "" == repr(req) def test_http_scheme() -> None: req = make_mocked_request("GET", "/", headers={"Host": "example.com"}) assert "http" == req.scheme assert req.secure is False def test_https_scheme_by_ssl_transport() -> None: req = make_mocked_request( "GET", "/", headers={"Host": "example.com"}, sslcontext=True ) assert "https" == req.scheme assert req.secure is True def test_single_forwarded_header() -> None: header = "by=identifier;for=identifier;host=identifier;proto=identifier" req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert req.forwarded[0]["by"] == "identifier" assert req.forwarded[0]["for"] == "identifier" assert req.forwarded[0]["host"] == "identifier" assert req.forwarded[0]["proto"] == "identifier" @pytest.mark.parametrize( "forward_for_in, forward_for_out", [ ("1.2.3.4:1234", "1.2.3.4:1234"), ("1.2.3.4", "1.2.3.4"), ('"[2001:db8:cafe::17]:1234"', "[2001:db8:cafe::17]:1234"), ('"[2001:db8:cafe::17]"', "[2001:db8:cafe::17]"), ], ) def test_forwarded_node_identifier(forward_for_in, forward_for_out) -> None: header = f"for={forward_for_in}" req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert req.forwarded == ({"for": forward_for_out},) def test_single_forwarded_header_camelcase() -> None: header = "bY=identifier;fOr=identifier;HOst=identifier;pRoTO=identifier" req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert req.forwarded[0]["by"] == "identifier" assert req.forwarded[0]["for"] == "identifier" assert req.forwarded[0]["host"] == "identifier" assert req.forwarded[0]["proto"] == "identifier" def test_single_forwarded_header_single_param() -> None: header = "BY=identifier" req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert req.forwarded[0]["by"] == "identifier" def test_single_forwarded_header_multiple_param() -> None: header = "By=identifier1,BY=identifier2, By=identifier3 , BY=identifier4" req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert len(req.forwarded) == 4 assert req.forwarded[0]["by"] == "identifier1" assert req.forwarded[1]["by"] == "identifier2" assert req.forwarded[2]["by"] == "identifier3" assert req.forwarded[3]["by"] == "identifier4" def test_single_forwarded_header_quoted_escaped() -> None: header = r'BY=identifier;pROTO="\lala lan\d\~ 123\!&"' req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert req.forwarded[0]["by"] == "identifier" assert req.forwarded[0]["proto"] == "lala land~ 123!&" def test_single_forwarded_header_custom_param() -> None: header = r'BY=identifier;PROTO=https;SOME="other, \"value\""' req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert len(req.forwarded) == 1 assert req.forwarded[0]["by"] == "identifier" assert req.forwarded[0]["proto"] == "https" assert req.forwarded[0]["some"] == 'other, "value"' def test_single_forwarded_header_empty_params() -> None: # This is allowed by the grammar given in RFC 7239 header = ";For=identifier;;PROTO=https;;;" req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert req.forwarded[0]["for"] == "identifier" assert req.forwarded[0]["proto"] == "https" def test_single_forwarded_header_bad_separator() -> None: header = "BY=identifier PROTO=https" req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert "proto" not in req.forwarded[0] def test_single_forwarded_header_injection1() -> None: # We might receive a header like this if we're sitting behind a reverse # proxy that blindly appends a forwarded-element without checking # the syntax of existing field-values. We should be able to recover # the appended element anyway. header = 'for=_injected;by=", for=_real' req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert len(req.forwarded) == 2 assert "by" not in req.forwarded[0] assert req.forwarded[1]["for"] == "_real" def test_single_forwarded_header_injection2() -> None: header = "very bad syntax, for=_real" req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert len(req.forwarded) == 2 assert "for" not in req.forwarded[0] assert req.forwarded[1]["for"] == "_real" def test_single_forwarded_header_long_quoted_string() -> None: header = 'for="' + "\\\\" * 5000 + '"' req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert req.forwarded[0]["for"] == "\\" * 5000 def test_multiple_forwarded_headers() -> None: headers = CIMultiDict() headers.add("Forwarded", "By=identifier1;for=identifier2, BY=identifier3") headers.add("Forwarded", "By=identifier4;fOr=identifier5") req = make_mocked_request("GET", "/", headers=headers) assert len(req.forwarded) == 3 assert req.forwarded[0]["by"] == "identifier1" assert req.forwarded[0]["for"] == "identifier2" assert req.forwarded[1]["by"] == "identifier3" assert req.forwarded[2]["by"] == "identifier4" assert req.forwarded[2]["for"] == "identifier5" def test_multiple_forwarded_headers_bad_syntax() -> None: headers = CIMultiDict() headers.add("Forwarded", "for=_1;by=_2") headers.add("Forwarded", "invalid value") headers.add("Forwarded", "") headers.add("Forwarded", "for=_3;by=_4") req = make_mocked_request("GET", "/", headers=headers) assert len(req.forwarded) == 4 assert req.forwarded[0]["for"] == "_1" assert "for" not in req.forwarded[1] assert "for" not in req.forwarded[2] assert req.forwarded[3]["by"] == "_4" def test_multiple_forwarded_headers_injection() -> None: headers = CIMultiDict() # This could be sent by an attacker, hoping to "shadow" the second header. headers.add("Forwarded", 'for=_injected;by="') # This is added by our trusted reverse proxy. headers.add("Forwarded", "for=_real;by=_actual_proxy") req = make_mocked_request("GET", "/", headers=headers) assert len(req.forwarded) == 2 assert "by" not in req.forwarded[0] assert req.forwarded[1]["for"] == "_real" assert req.forwarded[1]["by"] == "_actual_proxy" def test_host_by_host_header() -> None: req = make_mocked_request("GET", "/", headers=CIMultiDict({"Host": "example.com"})) assert req.host == "example.com" def test_raw_headers() -> None: req = make_mocked_request("GET", "/", headers=CIMultiDict({"X-HEADER": "aaa"})) assert req.raw_headers == ((b"X-HEADER", b"aaa"),) def test_rel_url() -> None: req = make_mocked_request("GET", "/path") assert URL("/path") == req.rel_url def test_url_url() -> None: req = make_mocked_request("GET", "/path", headers={"HOST": "example.com"}) assert URL("http://example.com/path") == req.url def test_clone() -> None: req = make_mocked_request("GET", "/path") req2 = req.clone() assert req2.method == "GET" assert req2.rel_url == URL("/path") def test_clone_client_max_size() -> None: req = make_mocked_request("GET", "/path", client_max_size=1024) req2 = req.clone() assert req._client_max_size == req2._client_max_size assert req2._client_max_size == 1024 def test_clone_override_client_max_size() -> None: req = make_mocked_request("GET", "/path", client_max_size=1024) req2 = req.clone(client_max_size=2048) assert req2.client_max_size == 2048 def test_clone_method() -> None: req = make_mocked_request("GET", "/path") req2 = req.clone(method="POST") assert req2.method == "POST" assert req2.rel_url == URL("/path") def test_clone_rel_url() -> None: req = make_mocked_request("GET", "/path") req2 = req.clone(rel_url=URL("/path2")) assert req2.rel_url == URL("/path2") def test_clone_rel_url_str() -> None: req = make_mocked_request("GET", "/path") req2 = req.clone(rel_url="/path2") assert req2.rel_url == URL("/path2") def test_clone_headers() -> None: req = make_mocked_request("GET", "/path", headers={"A": "B"}) req2 = req.clone(headers=CIMultiDict({"B": "C"})) assert req2.headers == CIMultiDict({"B": "C"}) assert req2.raw_headers == ((b"B", b"C"),) def test_clone_headers_dict() -> None: req = make_mocked_request("GET", "/path", headers={"A": "B"}) req2 = req.clone(headers={"B": "C"}) assert req2.headers == CIMultiDict({"B": "C"}) assert req2.raw_headers == ((b"B", b"C"),) async def test_cannot_clone_after_read(protocol) -> None: payload = StreamReader(protocol, 2**16, loop=asyncio.get_event_loop()) payload.feed_data(b"data") payload.feed_eof() req = make_mocked_request("GET", "/path", payload=payload) await req.read() with pytest.raises(RuntimeError): req.clone() async def test_make_too_big_request(protocol) -> None: payload = StreamReader(protocol, 2**16, loop=asyncio.get_event_loop()) large_file = 1024**2 * b"x" too_large_file = large_file + b"x" payload.feed_data(too_large_file) payload.feed_eof() req = make_mocked_request("POST", "/", payload=payload) with pytest.raises(HTTPRequestEntityTooLarge) as err: await req.read() assert err.value.status_code == 413 async def test_make_too_big_request_adjust_limit(protocol) -> None: payload = StreamReader(protocol, 2**16, loop=asyncio.get_event_loop()) large_file = 1024**2 * b"x" too_large_file = large_file + b"x" payload.feed_data(too_large_file) payload.feed_eof() max_size = 1024**2 + 2 req = make_mocked_request("POST", "/", payload=payload, client_max_size=max_size) txt = await req.read() assert len(txt) == 1024**2 + 1 async def test_multipart_formdata(protocol) -> None: payload = StreamReader(protocol, 2**16, loop=asyncio.get_event_loop()) payload.feed_data( b"-----------------------------326931944431359\r\n" b'Content-Disposition: form-data; name="a"\r\n' b"\r\n" b"b\r\n" b"-----------------------------326931944431359\r\n" b'Content-Disposition: form-data; name="c"\r\n' b"\r\n" b"d\r\n" b"-----------------------------326931944431359--\r\n" ) content_type = ( "multipart/form-data; boundary=" "---------------------------326931944431359" ) payload.feed_eof() req = make_mocked_request( "POST", "/", headers={"CONTENT-TYPE": content_type}, payload=payload ) result = await req.post() assert dict(result) == {"a": "b", "c": "d"} async def test_multipart_formdata_file(protocol) -> None: # Make sure file uploads work, even without a content type payload = StreamReader(protocol, 2**16, loop=asyncio.get_event_loop()) payload.feed_data( b"-----------------------------326931944431359\r\n" b'Content-Disposition: form-data; name="a_file"; filename="binary"\r\n' b"\r\n" b"\ff\r\n" b"-----------------------------326931944431359--\r\n" ) content_type = ( "multipart/form-data; boundary=" "---------------------------326931944431359" ) payload.feed_eof() req = make_mocked_request( "POST", "/", headers={"CONTENT-TYPE": content_type}, payload=payload ) result = await req.post() assert hasattr(result["a_file"], "file") content = result["a_file"].file.read() assert content == b"\ff" result["a_file"].file.close() async def test_make_too_big_request_limit_None(protocol) -> None: payload = StreamReader(protocol, 2**16, loop=asyncio.get_event_loop()) large_file = 1024**2 * b"x" too_large_file = large_file + b"x" payload.feed_data(too_large_file) payload.feed_eof() max_size = None req = make_mocked_request("POST", "/", payload=payload, client_max_size=max_size) txt = await req.read() assert len(txt) == 1024**2 + 1 def test_remote_peername_tcp() -> None: transp = mock.Mock() transp.get_extra_info.return_value = ("10.10.10.10", 1234) req = make_mocked_request("GET", "/", transport=transp) assert req.remote == "10.10.10.10" def test_remote_peername_unix() -> None: transp = mock.Mock() transp.get_extra_info.return_value = "/path/to/sock" req = make_mocked_request("GET", "/", transport=transp) assert req.remote == "/path/to/sock" def test_save_state_on_clone() -> None: req = make_mocked_request("GET", "/") req["key"] = "val" req2 = req.clone() req2["key"] = "val2" assert req["key"] == "val" assert req2["key"] == "val2" def test_clone_scheme() -> None: req = make_mocked_request("GET", "/") req2 = req.clone(scheme="https") assert req2.scheme == "https" def test_clone_host() -> None: req = make_mocked_request("GET", "/") req2 = req.clone(host="example.com") assert req2.host == "example.com" def test_clone_remote() -> None: req = make_mocked_request("GET", "/") req2 = req.clone(remote="11.11.11.11") assert req2.remote == "11.11.11.11" def test_remote_with_closed_transport() -> None: transp = mock.Mock() transp.get_extra_info.return_value = ("10.10.10.10", 1234) req = make_mocked_request("GET", "/", transport=transp) req._protocol = None assert req.remote == "10.10.10.10" def test_url_http_with_closed_transport() -> None: req = make_mocked_request("GET", "/") req._protocol = None assert str(req.url).startswith("http://") def test_url_https_with_closed_transport() -> None: req = make_mocked_request("GET", "/", sslcontext=True) req._protocol = None assert str(req.url).startswith("https://") async def test_get_extra_info() -> None: valid_key = "test" valid_value = "existent" default_value = "default" def get_extra_info(name: str, default: Any = None): return {valid_key: valid_value}.get(name, default) transp = mock.Mock() transp.get_extra_info.side_effect = get_extra_info req = make_mocked_request("GET", "/", transport=transp) req_extra_info = req.get_extra_info(valid_key, default_value) transp_extra_info = req._protocol.transport.get_extra_info(valid_key, default_value) assert req_extra_info == transp_extra_info req._protocol.transport = None extra_info = req.get_extra_info(valid_key, default_value) assert extra_info == default_value req._protocol = None extra_info = req.get_extra_info(valid_key, default_value) assert extra_info == default_value def test_eq() -> None: req1 = make_mocked_request("GET", "/path/to?a=1&b=2") req2 = make_mocked_request("GET", "/path/to?a=1&b=2") assert req1 != req2 assert req1 == req1 async def test_loop_prop() -> None: loop = asyncio.get_event_loop() req = make_mocked_request("GET", "/path", loop=loop) with pytest.deprecated_call(match=r"^request\.loop property is deprecated$"): assert req.loop is loop @pytest.mark.parametrize( ["header", "header_attr"], [ pytest.param("If-Match", "if_match"), pytest.param("If-None-Match", "if_none_match"), ], ) @pytest.mark.parametrize( ["header_val", "expected"], [ pytest.param( '"67ab43", W/"54ed21", "7892,dd"', ( ETag(is_weak=False, value="67ab43"), ETag(is_weak=True, value="54ed21"), ETag(is_weak=False, value="7892,dd"), ), ), pytest.param( '"bfc1ef-5b2c2730249c88ca92d82d"', (ETag(is_weak=False, value="bfc1ef-5b2c2730249c88ca92d82d"),), ), pytest.param( '"valid-tag", "also-valid-tag",somegarbage"last-tag"', ( ETag(is_weak=False, value="valid-tag"), ETag(is_weak=False, value="also-valid-tag"), ), ), pytest.param( '"ascii", "это точно не ascii", "ascii again"', (ETag(is_weak=False, value="ascii"),), ), pytest.param( "*", (ETag(is_weak=False, value="*"),), ), ], ) def test_etag_headers(header, header_attr, header_val, expected) -> None: req = make_mocked_request("GET", "/", headers={header: header_val}) assert getattr(req, header_attr) == expected @pytest.mark.parametrize( ["header", "header_attr"], [ pytest.param("If-Modified-Since", "if_modified_since"), pytest.param("If-Unmodified-Since", "if_unmodified_since"), pytest.param("If-Range", "if_range"), ], ) @pytest.mark.parametrize( ["header_val", "expected"], [ pytest.param("xxyyzz", None), pytest.param("Tue, 08 Oct 4446413 00:56:40 GMT", None), pytest.param("Tue, 08 Oct 2000 00:56:80 GMT", None), pytest.param( "Tue, 08 Oct 2000 00:56:40 GMT", datetime.datetime(2000, 10, 8, 0, 56, 40, tzinfo=datetime.timezone.utc), ), ], ) def test_datetime_headers(header, header_attr, header_val, expected) -> None: req = make_mocked_request("GET", "/", headers={header: header_val}) assert getattr(req, header_attr) == expected ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_web_request_handler.py0000644000175100001770000000314714607525266021424 0ustar00runnerdockerfrom unittest import mock from aiohttp import web from aiohttp.test_utils import make_mocked_coro async def serve(request: web.BaseRequest) -> web.Response: return web.Response() async def test_repr() -> None: manager = web.Server(serve) handler = manager() assert "" == repr(handler) with mock.patch.object(handler, "transport", autospec=True): assert "" == repr(handler) async def test_connections() -> None: manager = web.Server(serve) assert manager.connections == [] handler = object() transport = object() manager.connection_made(handler, transport) # type: ignore[arg-type] assert manager.connections == [handler] manager.connection_lost(handler, None) # type: ignore[arg-type] assert manager.connections == [] async def test_shutdown_no_timeout() -> None: manager = web.Server(serve) handler = mock.Mock() handler.shutdown = make_mocked_coro(mock.Mock()) transport = mock.Mock() manager.connection_made(handler, transport) await manager.shutdown() manager.connection_lost(handler, None) assert manager.connections == [] handler.shutdown.assert_called_with(None) async def test_shutdown_timeout() -> None: manager = web.Server(serve) handler = mock.Mock() handler.shutdown = make_mocked_coro(mock.Mock()) transport = mock.Mock() manager.connection_made(handler, transport) await manager.shutdown(timeout=0.1) manager.connection_lost(handler, None) assert manager.connections == [] handler.shutdown.assert_called_with(0.1) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_web_response.py0000644000175100001770000011511614607525266020075 0ustar00runnerdockerimport collections.abc import datetime import gzip import json from concurrent.futures import ThreadPoolExecutor from unittest import mock import aiosignal import pytest from multidict import CIMultiDict, CIMultiDictProxy from re_assert import Matches from aiohttp import HttpVersion, HttpVersion10, HttpVersion11, hdrs from aiohttp.helpers import ETag from aiohttp.http_writer import StreamWriter, _serialize_headers from aiohttp.payload import BytesPayload from aiohttp.test_utils import make_mocked_coro, make_mocked_request from aiohttp.web import ContentCoding, Response, StreamResponse, json_response def make_request( method, path, headers=CIMultiDict(), version=HttpVersion11, on_response_prepare=None, **kwargs, ): app = kwargs.pop("app", None) or mock.Mock() app._debug = False if on_response_prepare is None: on_response_prepare = aiosignal.Signal(app) app.on_response_prepare = on_response_prepare app.on_response_prepare.freeze() protocol = kwargs.pop("protocol", None) or mock.Mock() return make_mocked_request( method, path, headers, version=version, protocol=protocol, app=app, **kwargs ) @pytest.fixture def buf(): return bytearray() @pytest.fixture def writer(buf): writer = mock.Mock() def acquire(cb): cb(writer.transport) def buffer_data(chunk): buf.extend(chunk) def write(chunk): buf.extend(chunk) async def write_headers(status_line, headers): headers = _serialize_headers(status_line, headers) buf.extend(headers) async def write_eof(chunk=b""): buf.extend(chunk) writer.acquire.side_effect = acquire writer.transport.write.side_effect = write writer.write.side_effect = write writer.write_eof.side_effect = write_eof writer.write_headers.side_effect = write_headers writer.buffer_data.side_effect = buffer_data writer.drain.return_value = () return writer def test_stream_response_ctor() -> None: resp = StreamResponse() assert 200 == resp.status assert resp.keep_alive is None assert resp.task is None req = mock.Mock() resp._req = req assert resp.task is req.task def test_stream_response_hashable() -> None: # should not raise exception hash(StreamResponse()) def test_stream_response_eq() -> None: resp1 = StreamResponse() resp2 = StreamResponse() assert resp1 == resp1 assert not resp1 == resp2 def test_stream_response_is_mutable_mapping() -> None: resp = StreamResponse() assert isinstance(resp, collections.abc.MutableMapping) resp["key"] = "value" assert "value" == resp["key"] def test_stream_response_delitem() -> None: resp = StreamResponse() resp["key"] = "value" del resp["key"] assert "key" not in resp def test_stream_response_len() -> None: resp = StreamResponse() assert len(resp) == 0 resp["key"] = "value" assert len(resp) == 1 def test_request_iter() -> None: resp = StreamResponse() resp["key"] = "value" resp["key2"] = "value2" assert set(resp) == {"key", "key2"} def test_content_length() -> None: resp = StreamResponse() assert resp.content_length is None def test_content_length_setter() -> None: resp = StreamResponse() resp.content_length = 234 assert 234 == resp.content_length def test_content_length_setter_with_enable_chunked_encoding() -> None: resp = StreamResponse() resp.enable_chunked_encoding() with pytest.raises(RuntimeError): resp.content_length = 234 def test_drop_content_length_header_on_setting_len_to_None() -> None: resp = StreamResponse() resp.content_length = 1 assert "1" == resp.headers["Content-Length"] resp.content_length = None assert "Content-Length" not in resp.headers def test_set_content_length_to_None_on_non_set() -> None: resp = StreamResponse() resp.content_length = None assert "Content-Length" not in resp.headers resp.content_length = None assert "Content-Length" not in resp.headers def test_setting_content_type() -> None: resp = StreamResponse() resp.content_type = "text/html" assert "text/html" == resp.headers["content-type"] def test_setting_charset() -> None: resp = StreamResponse() resp.content_type = "text/html" resp.charset = "koi8-r" assert "text/html; charset=koi8-r" == resp.headers["content-type"] def test_default_charset() -> None: resp = StreamResponse() assert resp.charset is None def test_reset_charset() -> None: resp = StreamResponse() resp.content_type = "text/html" resp.charset = None assert resp.charset is None def test_reset_charset_after_setting() -> None: resp = StreamResponse() resp.content_type = "text/html" resp.charset = "koi8-r" resp.charset = None assert resp.charset is None def test_charset_without_content_type() -> None: resp = StreamResponse() with pytest.raises(RuntimeError): resp.charset = "koi8-r" def test_last_modified_initial() -> None: resp = StreamResponse() assert resp.last_modified is None def test_last_modified_string() -> None: resp = StreamResponse() dt = datetime.datetime(1990, 1, 2, 3, 4, 5, 0, datetime.timezone.utc) resp.last_modified = "Mon, 2 Jan 1990 03:04:05 GMT" assert resp.last_modified == dt def test_last_modified_timestamp() -> None: resp = StreamResponse() dt = datetime.datetime(1970, 1, 1, 0, 0, 0, 0, datetime.timezone.utc) resp.last_modified = 0 assert resp.last_modified == dt resp.last_modified = 0.0 assert resp.last_modified == dt def test_last_modified_datetime() -> None: resp = StreamResponse() dt = datetime.datetime(2001, 2, 3, 4, 5, 6, 0, datetime.timezone.utc) resp.last_modified = dt assert resp.last_modified == dt def test_last_modified_reset() -> None: resp = StreamResponse() resp.last_modified = 0 resp.last_modified = None assert resp.last_modified is None @pytest.mark.parametrize( ["header_val", "expected"], [ pytest.param("xxyyzz", None), pytest.param("Tue, 08 Oct 4446413 00:56:40 GMT", None), pytest.param("Tue, 08 Oct 2000 00:56:80 GMT", None), ], ) def test_last_modified_string_invalid(header_val, expected) -> None: resp = StreamResponse(headers={"Last-Modified": header_val}) assert resp.last_modified == expected def test_etag_initial() -> None: resp = StreamResponse() assert resp.etag is None def test_etag_string() -> None: resp = StreamResponse() value = "0123-kotik" resp.etag = value assert resp.etag == ETag(value=value) assert resp.headers[hdrs.ETAG] == f'"{value}"' @pytest.mark.parametrize( ["etag", "expected_header"], ( (ETag(value="0123-weak-kotik", is_weak=True), 'W/"0123-weak-kotik"'), (ETag(value="0123-strong-kotik", is_weak=False), '"0123-strong-kotik"'), ), ) def test_etag_class(etag, expected_header) -> None: resp = StreamResponse() resp.etag = etag assert resp.etag == etag assert resp.headers[hdrs.ETAG] == expected_header def test_etag_any() -> None: resp = StreamResponse() resp.etag = "*" assert resp.etag == ETag(value="*") assert resp.headers[hdrs.ETAG] == "*" @pytest.mark.parametrize( "invalid_value", ( '"invalid"', "повинен бути ascii", ETag(value='"invalid"', is_weak=True), ETag(value="bad ©®"), ), ) def test_etag_invalid_value_set(invalid_value) -> None: resp = StreamResponse() with pytest.raises(ValueError, match="is not a valid etag"): resp.etag = invalid_value @pytest.mark.parametrize( "header", ( "forgotten quotes", '"∀ x ∉ ascii"', ), ) def test_etag_invalid_value_get(header) -> None: resp = StreamResponse() resp.headers["ETag"] = header assert resp.etag is None @pytest.mark.parametrize("invalid", (123, ETag(value=123, is_weak=True))) def test_etag_invalid_value_class(invalid) -> None: resp = StreamResponse() with pytest.raises(ValueError, match="Unsupported etag type"): resp.etag = invalid def test_etag_reset() -> None: resp = StreamResponse() resp.etag = "*" resp.etag = None assert resp.etag is None async def test_start() -> None: req = make_request("GET", "/") resp = StreamResponse() assert resp.keep_alive is None msg = await resp.prepare(req) assert msg.write_headers.called msg2 = await resp.prepare(req) assert msg is msg2 assert resp.keep_alive req2 = make_request("GET", "/") # with pytest.raises(RuntimeError): msg3 = await resp.prepare(req2) assert msg is msg3 async def test_chunked_encoding() -> None: req = make_request("GET", "/") resp = StreamResponse() assert not resp.chunked resp.enable_chunked_encoding() assert resp.chunked msg = await resp.prepare(req) assert msg.chunked def test_enable_chunked_encoding_with_content_length() -> None: resp = StreamResponse() resp.content_length = 234 with pytest.raises(RuntimeError): resp.enable_chunked_encoding() async def test_chunk_size() -> None: req = make_request("GET", "/") resp = StreamResponse() assert not resp.chunked with pytest.warns(DeprecationWarning): resp.enable_chunked_encoding(chunk_size=8192) assert resp.chunked msg = await resp.prepare(req) assert msg.chunked assert msg.enable_chunking.called assert msg.filter is not None async def test_chunked_encoding_forbidden_for_http_10() -> None: req = make_request("GET", "/", version=HttpVersion10) resp = StreamResponse() resp.enable_chunked_encoding() with pytest.raises(RuntimeError) as ctx: await resp.prepare(req) assert Matches("Using chunked encoding is forbidden for HTTP/1.0") == str(ctx.value) async def test_compression_no_accept() -> None: req = make_request("GET", "/") resp = StreamResponse() assert not resp.chunked assert not resp.compression resp.enable_compression() assert resp.compression msg = await resp.prepare(req) assert not msg.enable_compression.called async def test_force_compression_no_accept_backwards_compat() -> None: req = make_request("GET", "/") resp = StreamResponse() assert not resp.chunked assert not resp.compression with pytest.warns(DeprecationWarning): resp.enable_compression(force=True) assert resp.compression msg = await resp.prepare(req) assert msg.enable_compression.called assert msg.filter is not None async def test_force_compression_false_backwards_compat() -> None: req = make_request("GET", "/") resp = StreamResponse() assert not resp.compression with pytest.warns(DeprecationWarning): resp.enable_compression(force=False) assert resp.compression msg = await resp.prepare(req) assert not msg.enable_compression.called async def test_compression_default_coding() -> None: req = make_request( "GET", "/", headers=CIMultiDict({hdrs.ACCEPT_ENCODING: "gzip, deflate"}) ) resp = StreamResponse() assert not resp.chunked assert not resp.compression resp.enable_compression() assert resp.compression msg = await resp.prepare(req) msg.enable_compression.assert_called_with("deflate") assert "deflate" == resp.headers.get(hdrs.CONTENT_ENCODING) assert msg.filter is not None async def test_force_compression_deflate() -> None: req = make_request( "GET", "/", headers=CIMultiDict({hdrs.ACCEPT_ENCODING: "gzip, deflate"}) ) resp = StreamResponse() resp.enable_compression(ContentCoding.deflate) assert resp.compression msg = await resp.prepare(req) msg.enable_compression.assert_called_with("deflate") assert "deflate" == resp.headers.get(hdrs.CONTENT_ENCODING) async def test_force_compression_no_accept_deflate() -> None: req = make_request("GET", "/") resp = StreamResponse() resp.enable_compression(ContentCoding.deflate) assert resp.compression msg = await resp.prepare(req) msg.enable_compression.assert_called_with("deflate") assert "deflate" == resp.headers.get(hdrs.CONTENT_ENCODING) async def test_force_compression_gzip() -> None: req = make_request( "GET", "/", headers=CIMultiDict({hdrs.ACCEPT_ENCODING: "gzip, deflate"}) ) resp = StreamResponse() resp.enable_compression(ContentCoding.gzip) assert resp.compression msg = await resp.prepare(req) msg.enable_compression.assert_called_with("gzip") assert "gzip" == resp.headers.get(hdrs.CONTENT_ENCODING) async def test_force_compression_no_accept_gzip() -> None: req = make_request("GET", "/") resp = StreamResponse() resp.enable_compression(ContentCoding.gzip) assert resp.compression msg = await resp.prepare(req) msg.enable_compression.assert_called_with("gzip") assert "gzip" == resp.headers.get(hdrs.CONTENT_ENCODING) async def test_change_content_threaded_compression_enabled() -> None: req = make_request("GET", "/") body_thread_size = 1024 body = b"answer" * body_thread_size resp = Response(body=body, zlib_executor_size=body_thread_size) resp.enable_compression(ContentCoding.gzip) await resp.prepare(req) assert gzip.decompress(resp._compressed_body) == body async def test_change_content_threaded_compression_enabled_explicit() -> None: req = make_request("GET", "/") body_thread_size = 1024 body = b"answer" * body_thread_size with ThreadPoolExecutor(1) as executor: resp = Response( body=body, zlib_executor_size=body_thread_size, zlib_executor=executor ) resp.enable_compression(ContentCoding.gzip) await resp.prepare(req) assert gzip.decompress(resp._compressed_body) == body async def test_change_content_length_if_compression_enabled() -> None: req = make_request("GET", "/") resp = Response(body=b"answer") resp.enable_compression(ContentCoding.gzip) await resp.prepare(req) assert resp.content_length is not None and resp.content_length != len(b"answer") async def test_set_content_length_if_compression_enabled() -> None: writer = mock.Mock() async def write_headers(status_line, headers): assert hdrs.CONTENT_LENGTH in headers assert headers[hdrs.CONTENT_LENGTH] == "26" assert hdrs.TRANSFER_ENCODING not in headers writer.write_headers.side_effect = write_headers req = make_request("GET", "/", writer=writer) resp = Response(body=b"answer") resp.enable_compression(ContentCoding.gzip) await resp.prepare(req) assert resp.content_length == 26 del resp.headers[hdrs.CONTENT_LENGTH] assert resp.content_length == 26 async def test_remove_content_length_if_compression_enabled_http11() -> None: writer = mock.Mock() async def write_headers(status_line, headers): assert hdrs.CONTENT_LENGTH not in headers assert headers.get(hdrs.TRANSFER_ENCODING, "") == "chunked" writer.write_headers.side_effect = write_headers req = make_request("GET", "/", writer=writer) resp = StreamResponse() resp.content_length = 123 resp.enable_compression(ContentCoding.gzip) await resp.prepare(req) assert resp.content_length is None async def test_remove_content_length_if_compression_enabled_http10() -> None: writer = mock.Mock() async def write_headers(status_line, headers): assert hdrs.CONTENT_LENGTH not in headers assert hdrs.TRANSFER_ENCODING not in headers writer.write_headers.side_effect = write_headers req = make_request("GET", "/", version=HttpVersion10, writer=writer) resp = StreamResponse() resp.content_length = 123 resp.enable_compression(ContentCoding.gzip) await resp.prepare(req) assert resp.content_length is None async def test_force_compression_identity() -> None: writer = mock.Mock() async def write_headers(status_line, headers): assert hdrs.CONTENT_LENGTH in headers assert hdrs.TRANSFER_ENCODING not in headers writer.write_headers.side_effect = write_headers req = make_request("GET", "/", writer=writer) resp = StreamResponse() resp.content_length = 123 resp.enable_compression(ContentCoding.identity) await resp.prepare(req) assert resp.content_length == 123 async def test_force_compression_identity_response() -> None: writer = mock.Mock() async def write_headers(status_line, headers): assert headers[hdrs.CONTENT_LENGTH] == "6" assert hdrs.TRANSFER_ENCODING not in headers writer.write_headers.side_effect = write_headers req = make_request("GET", "/", writer=writer) resp = Response(body=b"answer") resp.enable_compression(ContentCoding.identity) await resp.prepare(req) assert resp.content_length == 6 async def test_rm_content_length_if_compression_http11() -> None: writer = mock.Mock() async def write_headers(status_line, headers): assert hdrs.CONTENT_LENGTH not in headers assert headers.get(hdrs.TRANSFER_ENCODING, "") == "chunked" writer.write_headers.side_effect = write_headers req = make_request("GET", "/", writer=writer) payload = BytesPayload(b"answer", headers={"X-Test-Header": "test"}) resp = Response(body=payload) resp.body = payload resp.enable_compression(ContentCoding.gzip) await resp.prepare(req) assert resp.content_length is None async def test_rm_content_length_if_compression_http10() -> None: writer = mock.Mock() async def write_headers(status_line, headers): assert hdrs.CONTENT_LENGTH not in headers assert hdrs.TRANSFER_ENCODING not in headers writer.write_headers.side_effect = write_headers req = make_request("GET", "/", version=HttpVersion10, writer=writer) resp = Response(body=BytesPayload(b"answer")) resp.enable_compression(ContentCoding.gzip) await resp.prepare(req) assert resp.content_length is None @pytest.mark.parametrize("status", (100, 101, 204, 304)) async def test_rm_transfer_encoding_rfc_9112_6_3_http_11(status: int) -> None: """Remove transfer encoding for RFC 9112 sec 6.3 with HTTP/1.1.""" writer = mock.create_autospec(StreamWriter, spec_set=True, instance=True) req = make_request("GET", "/", version=HttpVersion11, writer=writer) resp = Response(status=status, headers={hdrs.TRANSFER_ENCODING: "chunked"}) await resp.prepare(req) assert resp.content_length == 0 assert not resp.chunked assert hdrs.CONTENT_LENGTH not in resp.headers assert hdrs.TRANSFER_ENCODING not in resp.headers @pytest.mark.parametrize("status", (100, 101, 102, 204, 304)) async def test_rm_content_length_1xx_204_304_responses(status: int) -> None: """Remove content length for 1xx, 204, and 304 responses. Content-Length is forbidden for 1xx and 204 https://datatracker.ietf.org/doc/html/rfc7230#section-3.3.2 Content-Length is discouraged for 304. https://datatracker.ietf.org/doc/html/rfc7232#section-4.1 """ writer = mock.create_autospec(StreamWriter, spec_set=True, instance=True) req = make_request("GET", "/", version=HttpVersion11, writer=writer) resp = Response(status=status, body="answer") await resp.prepare(req) assert not resp.chunked assert hdrs.CONTENT_LENGTH not in resp.headers assert hdrs.TRANSFER_ENCODING not in resp.headers async def test_head_response_keeps_content_length_of_original_body() -> None: """Verify HEAD response keeps the content length of the original body HTTP/1.1.""" writer = mock.create_autospec(StreamWriter, spec_set=True, instance=True) req = make_request("HEAD", "/", version=HttpVersion11, writer=writer) resp = Response(status=200, body=b"answer") await resp.prepare(req) assert resp.content_length == 6 assert not resp.chunked assert resp.headers[hdrs.CONTENT_LENGTH] == "6" assert hdrs.TRANSFER_ENCODING not in resp.headers async def test_head_response_omits_content_length_when_body_unset() -> None: """Verify HEAD response omits content-length body when its unset.""" writer = mock.create_autospec(StreamWriter, spec_set=True, instance=True) req = make_request("HEAD", "/", version=HttpVersion11, writer=writer) resp = Response(status=200) await resp.prepare(req) assert resp.content_length == 0 assert not resp.chunked assert hdrs.CONTENT_LENGTH not in resp.headers assert hdrs.TRANSFER_ENCODING not in resp.headers async def test_304_response_omits_content_length_when_body_unset() -> None: """Verify 304 response omits content-length body when its unset.""" writer = mock.create_autospec(StreamWriter, spec_set=True, instance=True) req = make_request("GET", "/", version=HttpVersion11, writer=writer) resp = Response(status=304) await resp.prepare(req) assert resp.content_length == 0 assert not resp.chunked assert hdrs.CONTENT_LENGTH not in resp.headers assert hdrs.TRANSFER_ENCODING not in resp.headers async def test_content_length_on_chunked() -> None: req = make_request("GET", "/") resp = Response(body=b"answer") assert resp.content_length == 6 resp.enable_chunked_encoding() assert resp.content_length is None await resp.prepare(req) async def test_write_non_byteish() -> None: resp = StreamResponse() await resp.prepare(make_request("GET", "/")) with pytest.raises(AssertionError): await resp.write(123) async def test_write_before_start() -> None: resp = StreamResponse() with pytest.raises(RuntimeError): await resp.write(b"data") async def test_cannot_write_after_eof() -> None: resp = StreamResponse() req = make_request("GET", "/") await resp.prepare(req) await resp.write(b"data") await resp.write_eof() req.writer.write.reset_mock() with pytest.raises(RuntimeError): await resp.write(b"next data") assert not req.writer.write.called async def test___repr___after_eof() -> None: resp = StreamResponse() await resp.prepare(make_request("GET", "/")) assert resp.prepared await resp.write(b"data") await resp.write_eof() assert not resp.prepared resp_repr = repr(resp) assert resp_repr == "" async def test_cannot_write_eof_before_headers() -> None: resp = StreamResponse() with pytest.raises(AssertionError): await resp.write_eof() async def test_cannot_write_eof_twice() -> None: resp = StreamResponse() writer = mock.Mock() resp_impl = await resp.prepare(make_request("GET", "/")) resp_impl.write = make_mocked_coro(None) resp_impl.write_eof = make_mocked_coro(None) await resp.write(b"data") assert resp_impl.write.called await resp.write_eof() resp_impl.write.reset_mock() await resp.write_eof() assert not writer.write.called def test_force_close() -> None: resp = StreamResponse() assert resp.keep_alive is None resp.force_close() assert resp.keep_alive is False async def test_response_output_length() -> None: resp = StreamResponse() await resp.prepare(make_request("GET", "/")) with pytest.warns(DeprecationWarning): assert resp.output_length def test_response_cookies() -> None: resp = StreamResponse() assert resp.cookies == {} assert str(resp.cookies) == "" resp.set_cookie("name", "value") assert str(resp.cookies) == "Set-Cookie: name=value; Path=/" resp.set_cookie("name", "other_value") assert str(resp.cookies) == "Set-Cookie: name=other_value; Path=/" resp.cookies["name"] = "another_other_value" resp.cookies["name"]["max-age"] = 10 assert ( str(resp.cookies) == "Set-Cookie: name=another_other_value; Max-Age=10; Path=/" ) resp.del_cookie("name") expected = ( 'Set-Cookie: name=("")?; ' "expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0; Path=/" ) assert Matches(expected) == str(resp.cookies) resp.set_cookie("name", "value", domain="local.host") expected = "Set-Cookie: name=value; Domain=local.host; Path=/" assert str(resp.cookies) == expected def test_response_cookie_path() -> None: resp = StreamResponse() assert resp.cookies == {} resp.set_cookie("name", "value", path="/some/path") assert str(resp.cookies) == "Set-Cookie: name=value; Path=/some/path" resp.set_cookie("name", "value", expires="123") assert str(resp.cookies) == "Set-Cookie: name=value; expires=123; Path=/" resp.set_cookie( "name", "value", domain="example.com", path="/home", expires="123", max_age="10", secure=True, httponly=True, version="2.0", samesite="lax", ) assert ( str(resp.cookies).lower() == "set-cookie: name=value; " "domain=example.com; " "expires=123; " "httponly; " "max-age=10; " "path=/home; " "samesite=lax; " "secure; " "version=2.0" ) def test_response_cookie__issue_del_cookie() -> None: resp = StreamResponse() assert resp.cookies == {} assert str(resp.cookies) == "" resp.del_cookie("name") expected = ( 'Set-Cookie: name=("")?; ' "expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0; Path=/" ) assert Matches(expected) == str(resp.cookies) def test_cookie_set_after_del() -> None: resp = StreamResponse() resp.del_cookie("name") resp.set_cookie("name", "val") # check for Max-Age dropped expected = "Set-Cookie: name=val; Path=/" assert str(resp.cookies) == expected def test_set_status_with_reason() -> None: resp = StreamResponse() resp.set_status(200, "Everything is fine!") assert 200 == resp.status assert "Everything is fine!" == resp.reason async def test_start_force_close() -> None: req = make_request("GET", "/") resp = StreamResponse() resp.force_close() assert not resp.keep_alive await resp.prepare(req) assert not resp.keep_alive async def test___repr__() -> None: req = make_request("GET", "/path/to") resp = StreamResponse(reason=301) await resp.prepare(req) assert "" == repr(resp) def test___repr___not_prepared() -> None: resp = StreamResponse(reason=301) assert "" == repr(resp) async def test_keep_alive_http10_default() -> None: req = make_request("GET", "/", version=HttpVersion10) resp = StreamResponse() await resp.prepare(req) assert not resp.keep_alive async def test_keep_alive_http10_switched_on() -> None: headers = CIMultiDict(Connection="keep-alive") req = make_request("GET", "/", version=HttpVersion10, headers=headers) req._message = req._message._replace(should_close=False) resp = StreamResponse() await resp.prepare(req) assert resp.keep_alive async def test_keep_alive_http09() -> None: headers = CIMultiDict(Connection="keep-alive") req = make_request("GET", "/", version=HttpVersion(0, 9), headers=headers) resp = StreamResponse() await resp.prepare(req) assert not resp.keep_alive async def test_prepare_twice() -> None: req = make_request("GET", "/") resp = StreamResponse() impl1 = await resp.prepare(req) impl2 = await resp.prepare(req) assert impl1 is impl2 async def test_prepare_calls_signal() -> None: app = mock.Mock() sig = make_mocked_coro() on_response_prepare = aiosignal.Signal(app) on_response_prepare.append(sig) req = make_request("GET", "/", app=app, on_response_prepare=on_response_prepare) resp = StreamResponse() await resp.prepare(req) sig.assert_called_with(req, resp) # Response class def test_response_ctor() -> None: resp = Response() assert 200 == resp.status assert "OK" == resp.reason assert resp.body is None assert resp.content_length == 0 assert "CONTENT-LENGTH" not in resp.headers async def test_ctor_with_headers_and_status() -> None: resp = Response(body=b"body", status=201, headers={"Age": "12", "DATE": "date"}) assert 201 == resp.status assert b"body" == resp.body assert resp.headers["AGE"] == "12" req = make_mocked_request("GET", "/") await resp._start(req) assert 4 == resp.content_length assert resp.headers["CONTENT-LENGTH"] == "4" def test_ctor_content_type() -> None: resp = Response(content_type="application/json") assert 200 == resp.status assert "OK" == resp.reason assert 0 == resp.content_length assert CIMultiDict([("CONTENT-TYPE", "application/json")]) == resp.headers def test_ctor_text_body_combined() -> None: with pytest.raises(ValueError): Response(body=b"123", text="test text") async def test_ctor_text() -> None: resp = Response(text="test text") assert 200 == resp.status assert "OK" == resp.reason assert 9 == resp.content_length assert CIMultiDict([("CONTENT-TYPE", "text/plain; charset=utf-8")]) == resp.headers assert resp.body == b"test text" assert resp.text == "test text" resp.headers["DATE"] = "date" req = make_mocked_request("GET", "/", version=HttpVersion11) await resp._start(req) assert resp.headers["CONTENT-LENGTH"] == "9" def test_ctor_charset() -> None: resp = Response(text="текст", charset="koi8-r") assert "текст".encode("koi8-r") == resp.body assert "koi8-r" == resp.charset def test_ctor_charset_default_utf8() -> None: resp = Response(text="test test", charset=None) assert "utf-8" == resp.charset def test_ctor_charset_in_content_type() -> None: with pytest.raises(ValueError): Response(text="test test", content_type="text/plain; charset=utf-8") def test_ctor_charset_without_text() -> None: resp = Response(content_type="text/plain", charset="koi8-r") assert "koi8-r" == resp.charset def test_ctor_content_type_with_extra() -> None: resp = Response(text="test test", content_type="text/plain; version=0.0.4") assert resp.content_type == "text/plain" assert resp.headers["content-type"] == "text/plain; version=0.0.4; charset=utf-8" def test_ctor_both_content_type_param_and_header_with_text() -> None: with pytest.raises(ValueError): Response( headers={"Content-Type": "application/json"}, content_type="text/html", text="text", ) def test_ctor_both_charset_param_and_header_with_text() -> None: with pytest.raises(ValueError): Response( headers={"Content-Type": "application/json"}, charset="koi8-r", text="text" ) def test_ctor_both_content_type_param_and_header() -> None: with pytest.raises(ValueError): Response(headers={"Content-Type": "application/json"}, content_type="text/html") def test_ctor_both_charset_param_and_header() -> None: with pytest.raises(ValueError): Response(headers={"Content-Type": "application/json"}, charset="koi8-r") async def test_assign_nonbyteish_body() -> None: resp = Response(body=b"data") with pytest.raises(ValueError): resp.body = 123 assert b"data" == resp.body assert 4 == resp.content_length resp.headers["DATE"] = "date" req = make_mocked_request("GET", "/", version=HttpVersion11) await resp._start(req) assert resp.headers["CONTENT-LENGTH"] == "4" assert 4 == resp.content_length def test_assign_nonstr_text() -> None: resp = Response(text="test") with pytest.raises(AssertionError): resp.text = b"123" assert b"test" == resp.body assert 4 == resp.content_length def test_response_set_content_length() -> None: resp = Response() with pytest.raises(RuntimeError): resp.content_length = 1 async def test_send_headers_for_empty_body(buf, writer) -> None: req = make_request("GET", "/", writer=writer) resp = Response() await resp.prepare(req) await resp.write_eof() txt = buf.decode("utf8") assert ( Matches( "HTTP/1.1 200 OK\r\n" "Content-Length: 0\r\n" "Content-Type: application/octet-stream\r\n" "Date: .+\r\n" "Server: .+\r\n\r\n" ) == txt ) async def test_render_with_body(buf, writer) -> None: req = make_request("GET", "/", writer=writer) resp = Response(body=b"data") await resp.prepare(req) await resp.write_eof() txt = buf.decode("utf8") assert ( Matches( "HTTP/1.1 200 OK\r\n" "Content-Length: 4\r\n" "Content-Type: application/octet-stream\r\n" "Date: .+\r\n" "Server: .+\r\n\r\n" "data" ) == txt ) async def test_send_set_cookie_header(buf, writer) -> None: resp = Response() resp.cookies["name"] = "value" req = make_request("GET", "/", writer=writer) await resp.prepare(req) await resp.write_eof() txt = buf.decode("utf8") assert ( Matches( "HTTP/1.1 200 OK\r\n" "Content-Length: 0\r\n" "Set-Cookie: name=value\r\n" "Content-Type: application/octet-stream\r\n" "Date: .+\r\n" "Server: .+\r\n\r\n" ) == txt ) async def test_consecutive_write_eof() -> None: writer = mock.Mock() writer.write_eof = make_mocked_coro() writer.write_headers = make_mocked_coro() req = make_request("GET", "/", writer=writer) data = b"data" resp = Response(body=data) await resp.prepare(req) await resp.write_eof() await resp.write_eof() writer.write_eof.assert_called_once_with(data) def test_set_text_with_content_type() -> None: resp = Response() resp.content_type = "text/html" resp.text = "text" assert "text" == resp.text assert b"text" == resp.body assert "text/html" == resp.content_type def test_set_text_with_charset() -> None: resp = Response() resp.content_type = "text/plain" resp.charset = "KOI8-R" resp.text = "текст" assert "текст" == resp.text assert "текст".encode("koi8-r") == resp.body assert "koi8-r" == resp.charset def test_default_content_type_in_stream_response() -> None: resp = StreamResponse() assert resp.content_type == "application/octet-stream" def test_default_content_type_in_response() -> None: resp = Response() assert resp.content_type == "application/octet-stream" def test_content_type_with_set_text() -> None: resp = Response(text="text") assert resp.content_type == "text/plain" def test_content_type_with_set_body() -> None: resp = Response(body=b"body") assert resp.content_type == "application/octet-stream" def test_started_when_not_started() -> None: resp = StreamResponse() assert not resp.prepared async def test_started_when_started() -> None: resp = StreamResponse() await resp.prepare(make_request("GET", "/")) assert resp.prepared async def test_drain_before_start() -> None: resp = StreamResponse() with pytest.raises(AssertionError): await resp.drain() async def test_changing_status_after_prepare_raises() -> None: resp = StreamResponse() await resp.prepare(make_request("GET", "/")) with pytest.raises(AssertionError): resp.set_status(400) def test_nonstr_text_in_ctor() -> None: with pytest.raises(TypeError): Response(text=b"data") def test_text_in_ctor_with_content_type() -> None: resp = Response(text="data", content_type="text/html") assert "data" == resp.text assert "text/html" == resp.content_type def test_text_in_ctor_with_content_type_header() -> None: resp = Response(text="текст", headers={"Content-Type": "text/html; charset=koi8-r"}) assert "текст".encode("koi8-r") == resp.body assert "text/html" == resp.content_type assert "koi8-r" == resp.charset def test_text_in_ctor_with_content_type_header_multidict() -> None: headers = CIMultiDict({"Content-Type": "text/html; charset=koi8-r"}) resp = Response(text="текст", headers=headers) assert "текст".encode("koi8-r") == resp.body assert "text/html" == resp.content_type assert "koi8-r" == resp.charset def test_body_in_ctor_with_content_type_header_multidict() -> None: headers = CIMultiDict({"Content-Type": "text/html; charset=koi8-r"}) resp = Response(body="текст".encode("koi8-r"), headers=headers) assert "текст".encode("koi8-r") == resp.body assert "text/html" == resp.content_type assert "koi8-r" == resp.charset def test_text_with_empty_payload() -> None: resp = Response(status=200) assert resp.body is None assert resp.text is None def test_response_with_content_length_header_without_body() -> None: resp = Response(headers={"Content-Length": 123}) assert resp.content_length == 123 def test_response_with_immutable_headers() -> None: resp = Response( text="text", headers=CIMultiDictProxy(CIMultiDict({"Header": "Value"})) ) assert resp.headers == { "Header": "Value", "Content-Type": "text/plain; charset=utf-8", } async def test_response_prepared_after_header_preparation() -> None: req = make_request("GET", "/") resp = StreamResponse() await resp.prepare(req) assert type(resp.headers["Server"]) is str async def _strip_server(req, res): assert "Server" in res.headers if "Server" in res.headers: del res.headers["Server"] app = mock.Mock() sig = aiosignal.Signal(app) sig.append(_strip_server) req = make_request("GET", "/", on_response_prepare=sig, app=app) resp = StreamResponse() await resp.prepare(req) assert "Server" not in resp.headers class TestJSONResponse: def test_content_type_is_application_json_by_default(self) -> None: resp = json_response("") assert "application/json" == resp.content_type def test_passing_text_only(self) -> None: resp = json_response(text=json.dumps("jaysawn")) assert resp.text == json.dumps("jaysawn") def test_data_and_text_raises_value_error(self) -> None: with pytest.raises(ValueError) as excinfo: json_response(data="foo", text="bar") expected_message = "only one of data, text, or body should be specified" assert expected_message == excinfo.value.args[0] def test_data_and_body_raises_value_error(self) -> None: with pytest.raises(ValueError) as excinfo: json_response(data="foo", body=b"bar") expected_message = "only one of data, text, or body should be specified" assert expected_message == excinfo.value.args[0] def test_text_is_json_encoded(self) -> None: resp = json_response({"foo": 42}) assert json.dumps({"foo": 42}) == resp.text def test_content_type_is_overrideable(self) -> None: resp = json_response({"foo": 42}, content_type="application/vnd.json+api") assert "application/vnd.json+api" == resp.content_type ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_web_runner.py0000644000175100001770000001326514607525266017552 0ustar00runnerdockerimport asyncio import platform import signal from typing import Any from unittest.mock import patch import pytest from aiohttp import web from aiohttp.test_utils import get_unused_port_socket @pytest.fixture def app(): return web.Application() @pytest.fixture def make_runner(loop, app): asyncio.set_event_loop(loop) runners = [] def go(**kwargs): runner = web.AppRunner(app, **kwargs) runners.append(runner) return runner yield go for runner in runners: loop.run_until_complete(runner.cleanup()) async def test_site_for_nonfrozen_app(make_runner) -> None: runner = make_runner() with pytest.raises(RuntimeError): web.TCPSite(runner) assert len(runner.sites) == 0 @pytest.mark.skipif( platform.system() == "Windows", reason="the test is not valid for Windows" ) async def test_runner_setup_handle_signals(make_runner) -> None: runner = make_runner(handle_signals=True) await runner.setup() assert signal.getsignal(signal.SIGTERM) is not signal.SIG_DFL await runner.cleanup() assert signal.getsignal(signal.SIGTERM) is signal.SIG_DFL @pytest.mark.skipif( platform.system() == "Windows", reason="the test is not valid for Windows" ) async def test_runner_setup_without_signal_handling(make_runner) -> None: runner = make_runner(handle_signals=False) await runner.setup() assert signal.getsignal(signal.SIGTERM) is signal.SIG_DFL await runner.cleanup() assert signal.getsignal(signal.SIGTERM) is signal.SIG_DFL async def test_site_double_added(make_runner) -> None: _sock = get_unused_port_socket("127.0.0.1") runner = make_runner() await runner.setup() site = web.SockSite(runner, _sock) await site.start() with pytest.raises(RuntimeError): await site.start() assert len(runner.sites) == 1 async def test_site_stop_not_started(make_runner) -> None: runner = make_runner() await runner.setup() site = web.TCPSite(runner) with pytest.raises(RuntimeError): await site.stop() assert len(runner.sites) == 0 async def test_custom_log_format(make_runner) -> None: runner = make_runner(access_log_format="abc") await runner.setup() assert runner.server._kwargs["access_log_format"] == "abc" async def test_unreg_site(make_runner) -> None: runner = make_runner() await runner.setup() site = web.TCPSite(runner) with pytest.raises(RuntimeError): runner._unreg_site(site) async def test_app_property(make_runner, app) -> None: runner = make_runner() assert runner.app is app def test_non_app() -> None: with pytest.raises(TypeError): web.AppRunner(object()) async def test_addresses(make_runner, unix_sockname) -> None: _sock = get_unused_port_socket("127.0.0.1") runner = make_runner() await runner.setup() tcp = web.SockSite(runner, _sock) await tcp.start() unix = web.UnixSite(runner, unix_sockname) await unix.start() actual_addrs = runner.addresses expected_host, expected_post = _sock.getsockname()[:2] assert actual_addrs == [(expected_host, expected_post), unix_sockname] @pytest.mark.skipif( platform.system() != "Windows", reason="Proactor Event loop present only in Windows" ) async def test_named_pipe_runner_wrong_loop(app, selector_loop, pipe_name) -> None: runner = web.AppRunner(app) await runner.setup() with pytest.raises(RuntimeError): web.NamedPipeSite(runner, pipe_name) @pytest.mark.skipif( platform.system() != "Windows", reason="Proactor Event loop present only in Windows" ) async def test_named_pipe_runner_proactor_loop(proactor_loop, app, pipe_name) -> None: runner = web.AppRunner(app) await runner.setup() pipe = web.NamedPipeSite(runner, pipe_name) await pipe.start() await runner.cleanup() async def test_tcpsite_default_host(make_runner): runner = make_runner() await runner.setup() site = web.TCPSite(runner) assert site.name == "http://0.0.0.0:8080" calls = [] async def mock_create_server(*args, **kwargs): calls.append((args, kwargs)) with patch("asyncio.get_event_loop") as mock_get_loop: mock_get_loop.return_value.create_server = mock_create_server await site.start() assert len(calls) == 1 server, host, port = calls[0][0] assert server is runner.server assert host is None assert port == 8080 def test_run_after_asyncio_run() -> None: async def nothing(): pass def spy(): spy.called = True spy.called = False async def shutdown(): spy() raise web.GracefulExit() # asyncio.run() creates a new loop and closes it. asyncio.run(nothing()) app = web.Application() # create_task() will delay the function until app is run. app.on_startup.append(lambda a: asyncio.create_task(shutdown())) web.run_app(app) assert spy.called, "run_app() should work after asyncio.run()." async def test_app_handler_args_failure() -> None: app = web.Application(handler_args={"unknown_parameter": 5}) runner = web.AppRunner(app) await runner.setup() assert runner._server rh = runner._server() assert rh._timeout_ceil_threshold == 5 await runner.cleanup() assert app @pytest.mark.parametrize( ("value", "expected"), ( (2, 2), (None, 5), ("2", 2), ), ) async def test_app_handler_args_ceil_threshold(value: Any, expected: Any) -> None: app = web.Application(handler_args={"timeout_ceil_threshold": value}) runner = web.AppRunner(app) await runner.setup() assert runner._server rh = runner._server() assert rh._timeout_ceil_threshold == expected await runner.cleanup() assert app ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_web_sendfile.py0000644000175100001770000001023514607525266020024 0ustar00runnerdockerfrom pathlib import Path from unittest import mock from aiohttp import hdrs from aiohttp.test_utils import make_mocked_coro, make_mocked_request from aiohttp.web_fileresponse import FileResponse def test_using_gzip_if_header_present_and_file_available(loop) -> None: request = make_mocked_request( "GET", "http://python.org/logo.png", # Header uses some uppercase to ensure case-insensitive treatment headers={hdrs.ACCEPT_ENCODING: "GZip"}, ) gz_filepath = mock.create_autospec(Path, spec_set=True) gz_filepath.stat.return_value.st_size = 1024 gz_filepath.stat.return_value.st_mtime_ns = 1603733507222449291 filepath = mock.create_autospec(Path, spec_set=True) filepath.name = "logo.png" filepath.with_name.return_value = gz_filepath file_sender = FileResponse(filepath) file_sender._path = filepath file_sender._sendfile = make_mocked_coro(None) # type: ignore[assignment] loop.run_until_complete(file_sender.prepare(request)) assert not filepath.open.called assert gz_filepath.open.called def test_gzip_if_header_not_present_and_file_available(loop) -> None: request = make_mocked_request("GET", "http://python.org/logo.png", headers={}) gz_filepath = mock.create_autospec(Path, spec_set=True) gz_filepath.stat.return_value.st_size = 1024 gz_filepath.stat.return_value.st_mtime_ns = 1603733507222449291 filepath = mock.create_autospec(Path, spec_set=True) filepath.name = "logo.png" filepath.with_name.return_value = gz_filepath filepath.stat.return_value.st_size = 1024 filepath.stat.return_value.st_mtime_ns = 1603733507222449291 file_sender = FileResponse(filepath) file_sender._path = filepath file_sender._sendfile = make_mocked_coro(None) # type: ignore[assignment] loop.run_until_complete(file_sender.prepare(request)) assert filepath.open.called assert not gz_filepath.open.called def test_gzip_if_header_not_present_and_file_not_available(loop) -> None: request = make_mocked_request("GET", "http://python.org/logo.png", headers={}) gz_filepath = mock.create_autospec(Path, spec_set=True) gz_filepath.stat.side_effect = OSError(2, "No such file or directory") filepath = mock.create_autospec(Path, spec_set=True) filepath.name = "logo.png" filepath.with_name.return_value = gz_filepath filepath.stat.return_value.st_size = 1024 filepath.stat.return_value.st_mtime_ns = 1603733507222449291 file_sender = FileResponse(filepath) file_sender._path = filepath file_sender._sendfile = make_mocked_coro(None) # type: ignore[assignment] loop.run_until_complete(file_sender.prepare(request)) assert filepath.open.called assert not gz_filepath.open.called def test_gzip_if_header_present_and_file_not_available(loop) -> None: request = make_mocked_request( "GET", "http://python.org/logo.png", headers={hdrs.ACCEPT_ENCODING: "gzip"} ) gz_filepath = mock.create_autospec(Path, spec_set=True) gz_filepath.stat.side_effect = OSError(2, "No such file or directory") filepath = mock.create_autospec(Path, spec_set=True) filepath.name = "logo.png" filepath.with_name.return_value = gz_filepath filepath.stat.return_value.st_size = 1024 filepath.stat.return_value.st_mtime_ns = 1603733507222449291 file_sender = FileResponse(filepath) file_sender._path = filepath file_sender._sendfile = make_mocked_coro(None) # type: ignore[assignment] loop.run_until_complete(file_sender.prepare(request)) assert filepath.open.called assert not gz_filepath.open.called def test_status_controlled_by_user(loop) -> None: request = make_mocked_request("GET", "http://python.org/logo.png", headers={}) filepath = mock.create_autospec(Path, spec_set=True) filepath.name = "logo.png" filepath.stat.return_value.st_size = 1024 filepath.stat.return_value.st_mtime_ns = 1603733507222449291 file_sender = FileResponse(filepath, status=203) file_sender._path = filepath file_sender._sendfile = make_mocked_coro(None) # type: ignore[assignment] loop.run_until_complete(file_sender.prepare(request)) assert file_sender._status == 203 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_web_sendfile_functional.py0000644000175100001770000007534014607525266022256 0ustar00runnerdockerimport asyncio import gzip import pathlib import socket import zlib from typing import Any, Iterable, Optional import pytest import aiohttp from aiohttp import web try: import ssl except ImportError: ssl = None # type: ignore HELLO_AIOHTTP = b"Hello aiohttp! :-)\n" @pytest.fixture(scope="module") def hello_txt(request, tmp_path_factory) -> pathlib.Path: """Create a temp path with hello.txt and compressed versions. The uncompressed text file path is returned by default. Alternatively, an indirect parameter can be passed with an encoding to get a compressed path. """ txt = tmp_path_factory.mktemp("hello-") / "hello.txt" hello = {None: txt, "gzip": txt.with_suffix(f"{txt.suffix}.gz")} hello[None].write_bytes(HELLO_AIOHTTP) hello["gzip"].write_bytes(gzip.compress(HELLO_AIOHTTP)) encoding = getattr(request, "param", None) return hello[encoding] @pytest.fixture def loop_without_sendfile(loop): def sendfile(*args, **kwargs): raise NotImplementedError loop.sendfile = sendfile return loop @pytest.fixture def loop_with_mocked_native_sendfile(loop: Any): def sendfile(transport, fobj, offset, count): if count == 0: raise ValueError("count must be a positive integer (got 0)") raise NotImplementedError loop.sendfile = sendfile return loop @pytest.fixture(params=["sendfile", "no_sendfile"], ids=["sendfile", "no_sendfile"]) def sender(request, loop_without_sendfile): def maker(*args, **kwargs): ret = web.FileResponse(*args, **kwargs) if request.param == "no_sendfile": asyncio.set_event_loop(loop_without_sendfile) return ret return maker @pytest.fixture def app_with_static_route(sender): filename = "data.unknown_mime_type" filepath = pathlib.Path(__file__).parent / filename async def handler(request): return sender(filepath) app = web.Application() app.router.add_get("/", handler) return app async def test_static_file_ok( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) resp = await client.get("/") assert resp.status == 200 txt = await resp.text() assert "file content" == txt.rstrip() assert "application/octet-stream" == resp.headers["Content-Type"] assert resp.headers.get("Content-Encoding") is None await resp.release() await client.close() async def test_zero_bytes_file_ok(aiohttp_client, sender) -> None: filepath = pathlib.Path(__file__).parent / "data.zero_bytes" async def handler(request): return sender(filepath) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) # Run the request multiple times to ensure # that an untrapped exception is not hidden # because there is no read of the zero bytes for i in range(2): resp = await client.get("/") assert resp.status == 200 txt = await resp.text() assert "" == txt.rstrip() assert "application/octet-stream" == resp.headers["Content-Type"] assert resp.headers.get("Content-Encoding") is None await resp.release() await client.close() async def test_zero_bytes_file_mocked_native_sendfile( aiohttp_client: Any, loop_with_mocked_native_sendfile: Any ) -> None: filepath = pathlib.Path(__file__).parent / "data.zero_bytes" async def handler(request): asyncio.set_event_loop(loop_with_mocked_native_sendfile) return web.FileResponse(filepath) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) # Run the request multiple times to ensure # that an untrapped exception is not hidden # because there is no read of the zero bytes for i in range(2): resp = await client.get("/") assert resp.status == 200 txt = await resp.text() assert "" == txt.rstrip() assert "application/octet-stream" == resp.headers["Content-Type"] assert resp.headers.get("Content-Encoding") is None assert resp.headers.get("Content-Length") == "0" await resp.release() await client.close() async def test_static_file_ok_string_path( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) resp = await client.get("/") assert resp.status == 200 txt = await resp.text() assert "file content" == txt.rstrip() assert "application/octet-stream" == resp.headers["Content-Type"] assert resp.headers.get("Content-Encoding") is None await resp.release() await client.close() async def test_static_file_not_exists(aiohttp_client) -> None: app = web.Application() client = await aiohttp_client(app) resp = await client.get("/fake") assert resp.status == 404 await resp.release() await client.close() async def test_static_file_name_too_long(aiohttp_client) -> None: app = web.Application() client = await aiohttp_client(app) resp = await client.get("/x*500") assert resp.status == 404 await resp.release() await client.close() async def test_static_file_upper_directory(aiohttp_client) -> None: app = web.Application() client = await aiohttp_client(app) resp = await client.get("/../../") assert resp.status == 404 await resp.release() await client.close() async def test_static_file_with_content_type(aiohttp_client, sender) -> None: filepath = pathlib.Path(__file__).parent / "aiohttp.jpg" async def handler(request): return sender(filepath, chunk_size=16) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 body = await resp.read() with filepath.open("rb") as f: content = f.read() assert content == body assert resp.headers["Content-Type"] == "image/jpeg" assert resp.headers.get("Content-Encoding") is None resp.close() await resp.release() await client.close() @pytest.mark.parametrize("hello_txt", ["gzip"], indirect=True) async def test_static_file_custom_content_type( hello_txt: pathlib.Path, aiohttp_client: Any, sender: Any ) -> None: """Test that custom type without encoding is returned for encoded request.""" async def handler(request): resp = sender(hello_txt, chunk_size=16) resp.content_type = "application/pdf" return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 assert resp.headers.get("Content-Encoding") is None assert resp.headers["Content-Type"] == "application/pdf" assert await resp.read() == hello_txt.read_bytes() resp.close() await resp.release() await client.close() async def test_static_file_custom_content_type_compress( hello_txt: pathlib.Path, aiohttp_client: Any, sender: Any ): """Test that custom type with encoding is returned for unencoded requests.""" async def handler(request): resp = sender(hello_txt, chunk_size=16) resp.content_type = "application/pdf" return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 assert resp.headers.get("Content-Encoding") == "gzip" assert resp.headers["Content-Type"] == "application/pdf" assert await resp.read() == HELLO_AIOHTTP resp.close() await resp.release() await client.close() @pytest.mark.parametrize("forced_compression", [None, web.ContentCoding.gzip]) async def test_static_file_with_encoding_and_enable_compression( hello_txt: pathlib.Path, aiohttp_client: Any, sender: Any, forced_compression: Optional[web.ContentCoding], ): """Test that enable_compression does not double compress when an encoded file is also present.""" async def handler(request): resp = sender(hello_txt) resp.enable_compression(forced_compression) return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 assert resp.headers.get("Content-Encoding") == "gzip" assert resp.headers["Content-Type"] == "text/plain" assert await resp.read() == HELLO_AIOHTTP resp.close() await resp.release() await client.close() @pytest.mark.parametrize( ("hello_txt", "expect_encoding"), [["gzip"] * 2], indirect=["hello_txt"] ) async def test_static_file_with_content_encoding( hello_txt: pathlib.Path, aiohttp_client: Any, sender: Any, expect_encoding: str ) -> None: """Test requesting static compressed files returns the correct content type and encoding.""" async def handler(request): return sender(hello_txt) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 assert resp.headers.get("Content-Encoding") == expect_encoding assert resp.headers["Content-Type"] == "text/plain" assert await resp.read() == HELLO_AIOHTTP resp.close() await resp.release() await client.close() async def test_static_file_if_modified_since( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) resp = await client.get("/") assert 200 == resp.status lastmod = resp.headers.get("Last-Modified") assert lastmod is not None resp.close() await resp.release() resp = await client.get("/", headers={"If-Modified-Since": lastmod}) body = await resp.read() assert 304 == resp.status assert resp.headers.get("Content-Length") is None assert resp.headers.get("Last-Modified") == lastmod assert b"" == body resp.close() await resp.release() await client.close() async def test_static_file_if_modified_since_past_date( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Mon, 1 Jan 1990 01:01:01 GMT" resp = await client.get("/", headers={"If-Modified-Since": lastmod}) assert 200 == resp.status resp.close() await resp.release() await client.close() async def test_static_file_if_modified_since_invalid_date( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "not a valid HTTP-date" resp = await client.get("/", headers={"If-Modified-Since": lastmod}) assert 200 == resp.status resp.close() await resp.release() await client.close() async def test_static_file_if_modified_since_future_date( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Fri, 31 Dec 9999 23:59:59 GMT" resp = await client.get("/", headers={"If-Modified-Since": lastmod}) body = await resp.read() assert 304 == resp.status assert resp.headers.get("Content-Length") is None assert resp.headers.get("Last-Modified") assert b"" == body resp.close() await resp.release() await client.close() @pytest.mark.parametrize("if_unmodified_since", ("", "Fri, 31 Dec 0000 23:59:59 GMT")) async def test_static_file_if_match( aiohttp_client: Any, app_with_static_route: web.Application, if_unmodified_since: str, ) -> None: client = await aiohttp_client(app_with_static_route) resp = await client.get("/") assert 200 == resp.status original_etag = resp.headers.get("ETag") assert original_etag is not None resp.close() await resp.release() headers = {"If-Match": original_etag, "If-Unmodified-Since": if_unmodified_since} resp = await client.head("/", headers=headers) body = await resp.read() assert 200 == resp.status assert resp.headers.get("ETag") assert resp.headers.get("Last-Modified") assert b"" == body resp.close() await resp.release() await client.close() @pytest.mark.parametrize("if_unmodified_since", ("", "Fri, 31 Dec 0000 23:59:59 GMT")) @pytest.mark.parametrize( "etags,expected_status", [ (("*",), 200), (('"example-tag"', 'W/"weak-tag"'), 412), ], ) async def test_static_file_if_match_custom_tags( aiohttp_client: Any, app_with_static_route: web.Application, if_unmodified_since: str, etags: Iterable[str], expected_status: Iterable[int], ) -> None: client = await aiohttp_client(app_with_static_route) if_match = ", ".join(etags) headers = {"If-Match": if_match, "If-Unmodified-Since": if_unmodified_since} resp = await client.head("/", headers=headers) body = await resp.read() assert expected_status == resp.status assert b"" == body resp.close() await resp.release() await client.close() @pytest.mark.parametrize("if_modified_since", ("", "Fri, 31 Dec 9999 23:59:59 GMT")) @pytest.mark.parametrize( "additional_etags", ( (), ('"some-other-strong-etag"', 'W/"weak-tag"', "invalid-tag"), ), ) async def test_static_file_if_none_match( aiohttp_client: Any, app_with_static_route: web.Application, if_modified_since: str, additional_etags: Iterable[str], ) -> None: client = await aiohttp_client(app_with_static_route) resp = await client.get("/") assert 200 == resp.status original_etag = resp.headers.get("ETag") assert resp.headers.get("Last-Modified") is not None assert original_etag is not None resp.close() await resp.release() etag = ",".join((original_etag, *additional_etags)) resp = await client.get( "/", headers={"If-None-Match": etag, "If-Modified-Since": if_modified_since} ) body = await resp.read() assert 304 == resp.status assert resp.headers.get("Content-Length") is None assert resp.headers.get("ETag") == original_etag assert b"" == body resp.close() await resp.release() await client.close() async def test_static_file_if_none_match_star( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) resp = await client.head("/", headers={"If-None-Match": "*"}) body = await resp.read() assert 304 == resp.status assert resp.headers.get("Content-Length") is None assert resp.headers.get("ETag") assert resp.headers.get("Last-Modified") assert b"" == body resp.close() await resp.release() await client.close() @pytest.mark.skipif(not ssl, reason="ssl not supported") async def test_static_file_ssl( aiohttp_server, ssl_ctx, aiohttp_client, client_ssl_ctx, ) -> None: dirname = pathlib.Path(__file__).parent filename = "data.unknown_mime_type" app = web.Application() app.router.add_static("/static", dirname) server = await aiohttp_server(app, ssl=ssl_ctx) conn = aiohttp.TCPConnector(ssl=client_ssl_ctx) client = await aiohttp_client(server, connector=conn) resp = await client.get("/static/" + filename) assert 200 == resp.status txt = await resp.text() assert "file content" == txt.rstrip() ct = resp.headers["CONTENT-TYPE"] assert "application/octet-stream" == ct assert resp.headers.get("CONTENT-ENCODING") is None await resp.release() await client.close() async def test_static_file_directory_traversal_attack(aiohttp_client) -> None: dirname = pathlib.Path(__file__).parent relpath = "../README.rst" full_path = dirname / relpath assert full_path.is_file() app = web.Application() app.router.add_static("/static", dirname) client = await aiohttp_client(app) resp = await client.get("/static/" + relpath) assert 404 == resp.status await resp.release() url_relpath2 = "/static/dir/../" + relpath resp = await client.get(url_relpath2) assert 404 == resp.status await resp.release() url_abspath = "/static/" + str(full_path.resolve()) resp = await client.get(url_abspath) assert 403 == resp.status await resp.release() await client.close() def test_static_route_path_existence_check() -> None: directory = pathlib.Path(__file__).parent web.StaticResource("/", directory) nodirectory = directory / "nonexistent-uPNiOEAg5d" with pytest.raises(ValueError): web.StaticResource("/", nodirectory) async def test_static_file_huge(aiohttp_client, tmp_path) -> None: file_path = tmp_path / "huge_data.unknown_mime_type" # fill 20MB file with file_path.open("wb") as f: for i in range(1024 * 20): f.write((chr(i % 64 + 0x20) * 1024).encode()) file_st = file_path.stat() app = web.Application() app.router.add_static("/static", str(tmp_path)) client = await aiohttp_client(app) resp = await client.get("/static/" + file_path.name) assert 200 == resp.status ct = resp.headers["CONTENT-TYPE"] assert "application/octet-stream" == ct assert resp.headers.get("CONTENT-ENCODING") is None assert int(resp.headers.get("CONTENT-LENGTH")) == file_st.st_size f = file_path.open("rb") off = 0 cnt = 0 while off < file_st.st_size: chunk = await resp.content.readany() expected = f.read(len(chunk)) assert chunk == expected off += len(chunk) cnt += 1 f.close() await resp.release() await client.close() async def test_static_file_range(aiohttp_client: Any, sender: Any) -> None: filepath = pathlib.Path(__file__).parent / "sample.txt" filesize = filepath.stat().st_size async def handler(request): return sender(filepath, chunk_size=16) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) with filepath.open("rb") as f: content = f.read() # Ensure the whole file requested in parts is correct responses = await asyncio.gather( client.get("/", headers={"Range": "bytes=0-999"}), client.get("/", headers={"Range": "bytes=1000-1999"}), client.get("/", headers={"Range": "bytes=2000-"}), ) assert len(responses) == 3 assert responses[0].status == 206, "failed 'bytes=0-999': %s" % responses[0].reason assert responses[0].headers["Content-Range"] == "bytes 0-999/{}".format( filesize ), "failed: Content-Range Error" assert responses[1].status == 206, ( "failed 'bytes=1000-1999': %s" % responses[1].reason ) assert responses[1].headers["Content-Range"] == "bytes 1000-1999/{}".format( filesize ), "failed: Content-Range Error" assert responses[2].status == 206, "failed 'bytes=2000-': %s" % responses[2].reason assert responses[2].headers["Content-Range"] == "bytes 2000-{}/{}".format( filesize - 1, filesize ), "failed: Content-Range Error" body = await asyncio.gather( *(resp.read() for resp in responses), ) assert len(body[0]) == 1000, "failed 'bytes=0-999', received %d bytes" % len( body[0] ) assert len(body[1]) == 1000, "failed 'bytes=1000-1999', received %d bytes" % len( body[1] ) responses[0].close() responses[1].close() responses[2].close() await asyncio.gather( *(resp.release() for resp in responses), ) assert content == b"".join(body) await client.close() async def test_static_file_range_end_bigger_than_size(aiohttp_client, sender): filepath = pathlib.Path(__file__).parent / "aiohttp.png" async def handler(request): return sender(filepath, chunk_size=16) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) with filepath.open("rb") as f: content = f.read() # Ensure the whole file requested in parts is correct response = await client.get("/", headers={"Range": "bytes=54000-55000"}) assert response.status == 206, ( "failed 'bytes=54000-55000': %s" % response.reason ) assert ( response.headers["Content-Range"] == "bytes 54000-54996/54997" ), "failed: Content-Range Error" body = await response.read() assert len(body) == 997, "failed 'bytes=54000-55000', received %d bytes" % len( body ) assert content[54000:] == body await response.release() await client.close() async def test_static_file_range_beyond_eof(aiohttp_client, sender) -> None: filepath = pathlib.Path(__file__).parent / "aiohttp.png" async def handler(request): return sender(filepath, chunk_size=16) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) # Ensure the whole file requested in parts is correct response = await client.get("/", headers={"Range": "bytes=1000000-1200000"}) assert response.status == 416, ( "failed 'bytes=1000000-1200000': %s" % response.reason ) await response.release() await client.close() async def test_static_file_range_tail(aiohttp_client, sender) -> None: filepath = pathlib.Path(__file__).parent / "aiohttp.png" async def handler(request): return sender(filepath, chunk_size=16) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) with filepath.open("rb") as f: content = f.read() # Ensure the tail of the file is correct resp = await client.get("/", headers={"Range": "bytes=-500"}) assert resp.status == 206, resp.reason assert ( resp.headers["Content-Range"] == "bytes 54497-54996/54997" ), "failed: Content-Range Error" body4 = await resp.read() resp.close() await resp.release() assert content[-500:] == body4 # Ensure out-of-range tails could be handled resp2 = await client.get("/", headers={"Range": "bytes=-99999999999999"}) assert resp2.status == 206, resp.reason assert ( resp2.headers["Content-Range"] == "bytes 0-54996/54997" ), "failed: Content-Range Error" await resp2.release() await client.close() async def test_static_file_invalid_range(aiohttp_client, sender) -> None: filepath = pathlib.Path(__file__).parent / "aiohttp.png" async def handler(request): return sender(filepath, chunk_size=16) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) # range must be in bytes resp = await client.get("/", headers={"Range": "blocks=0-10"}) assert resp.status == 416, "Range must be in bytes" resp.close() await resp.release() # start > end resp = await client.get("/", headers={"Range": "bytes=100-0"}) assert resp.status == 416, "Range start can't be greater than end" resp.close() await resp.release() # start > end resp = await client.get("/", headers={"Range": "bytes=10-9"}) assert resp.status == 416, "Range start can't be greater than end" resp.close() await resp.release() # non-number range resp = await client.get("/", headers={"Range": "bytes=a-f"}) assert resp.status == 416, "Range must be integers" resp.close() await resp.release() # double dash range resp = await client.get("/", headers={"Range": "bytes=0--10"}) assert resp.status == 416, "double dash in range" resp.close() await resp.release() # no range resp = await client.get("/", headers={"Range": "bytes=-"}) assert resp.status == 416, "no range given" resp.close() await resp.release() await client.close() async def test_static_file_if_unmodified_since_past_with_range( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Mon, 1 Jan 1990 01:01:01 GMT" resp = await client.get( "/", headers={"If-Unmodified-Since": lastmod, "Range": "bytes=2-"} ) assert 412 == resp.status resp.close() await resp.release() await client.close() async def test_static_file_if_unmodified_since_future_with_range( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Fri, 31 Dec 9999 23:59:59 GMT" resp = await client.get( "/", headers={"If-Unmodified-Since": lastmod, "Range": "bytes=2-"} ) assert 206 == resp.status assert resp.headers["Content-Range"] == "bytes 2-12/13" assert resp.headers["Content-Length"] == "11" resp.close() await resp.release() await client.close() async def test_static_file_if_range_past_with_range( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Mon, 1 Jan 1990 01:01:01 GMT" resp = await client.get("/", headers={"If-Range": lastmod, "Range": "bytes=2-"}) assert 200 == resp.status assert resp.headers["Content-Length"] == "13" resp.close() await resp.release() await client.close() async def test_static_file_if_range_future_with_range( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Fri, 31 Dec 9999 23:59:59 GMT" resp = await client.get("/", headers={"If-Range": lastmod, "Range": "bytes=2-"}) assert 206 == resp.status assert resp.headers["Content-Range"] == "bytes 2-12/13" assert resp.headers["Content-Length"] == "11" resp.close() await resp.release() await client.close() async def test_static_file_if_unmodified_since_past_without_range( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Mon, 1 Jan 1990 01:01:01 GMT" resp = await client.get("/", headers={"If-Unmodified-Since": lastmod}) assert 412 == resp.status resp.close() await resp.release() await client.close() async def test_static_file_if_unmodified_since_future_without_range( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Fri, 31 Dec 9999 23:59:59 GMT" resp = await client.get("/", headers={"If-Unmodified-Since": lastmod}) assert 200 == resp.status assert resp.headers["Content-Length"] == "13" resp.close() await resp.release() await client.close() async def test_static_file_if_range_past_without_range( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Mon, 1 Jan 1990 01:01:01 GMT" resp = await client.get("/", headers={"If-Range": lastmod}) assert 200 == resp.status assert resp.headers["Content-Length"] == "13" resp.close() await resp.release() await client.close() async def test_static_file_if_range_future_without_range( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Fri, 31 Dec 9999 23:59:59 GMT" resp = await client.get("/", headers={"If-Range": lastmod}) assert 200 == resp.status assert resp.headers["Content-Length"] == "13" resp.close() await resp.release() await client.close() async def test_static_file_if_unmodified_since_invalid_date( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "not a valid HTTP-date" resp = await client.get("/", headers={"If-Unmodified-Since": lastmod}) assert 200 == resp.status resp.close() await resp.release() await client.close() async def test_static_file_if_range_invalid_date( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "not a valid HTTP-date" resp = await client.get("/", headers={"If-Range": lastmod}) assert 200 == resp.status resp.close() await resp.release() await client.close() async def test_static_file_compression(aiohttp_client, sender) -> None: filepath = pathlib.Path(__file__).parent / "data.unknown_mime_type" async def handler(request): ret = sender(filepath) ret.enable_compression() return ret app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, auto_decompress=False) resp = await client.get("/") assert resp.status == 200 zcomp = zlib.compressobj(wbits=zlib.MAX_WBITS) expected_body = zcomp.compress(b"file content\n") + zcomp.flush() assert expected_body == await resp.read() assert "application/octet-stream" == resp.headers["Content-Type"] assert resp.headers.get("Content-Encoding") == "deflate" await resp.release() await client.close() async def test_static_file_huge_cancel(aiohttp_client, tmp_path) -> None: file_path = tmp_path / "huge_data.unknown_mime_type" # fill 100MB file with file_path.open("wb") as f: for i in range(1024 * 20): f.write((chr(i % 64 + 0x20) * 1024).encode()) task = None async def handler(request): nonlocal task task = request.task # reduce send buffer size tr = request.transport sock = tr.get_extra_info("socket") sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024) ret = web.FileResponse(file_path) return ret app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 task.cancel() await asyncio.sleep(0) data = b"" while True: try: data += await resp.content.read(1024) except aiohttp.ClientPayloadError: break assert len(data) < 1024 * 1024 * 20 await resp.release() await client.close() async def test_static_file_huge_error(aiohttp_client, tmp_path) -> None: file_path = tmp_path / "huge_data.unknown_mime_type" # fill 20MB file with file_path.open("wb") as f: f.seek(20 * 1024 * 1024) f.write(b"1") async def handler(request): # reduce send buffer size tr = request.transport sock = tr.get_extra_info("socket") sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024) ret = web.FileResponse(file_path) return ret app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 # raise an exception on server side resp.close() await resp.release() await client.close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0 aiohttp-3.9.5/tests/test_web_server.py0000644000175100001770000002015114607525266017537 0ustar00runnerdockerimport asyncio from contextlib import suppress from unittest import mock import pytest from aiohttp import client, helpers, web async def test_simple_server(aiohttp_raw_server, aiohttp_client) -> None: async def handler(request): return web.Response(text=str(request.rel_url)) server = await aiohttp_raw_server(handler) cli = await aiohttp_client(server) resp = await cli.get("/path/to") assert resp.status == 200 txt = await resp.text() assert txt == "/path/to" @pytest.mark.xfail( not helpers.NO_EXTENSIONS, raises=client.ServerDisconnectedError, reason="The behavior of C-extensions differs from pure-Python: " "https://github.com/aio-libs/aiohttp/issues/6446", ) async def test_unsupported_upgrade(aiohttp_raw_server, aiohttp_client) -> None: # don't fail if a client probes for an unsupported protocol upgrade # https://github.com/aio-libs/aiohttp/issues/6446#issuecomment-999032039 async def handler(request: web.Request): return web.Response(body=await request.read()) upgrade_headers = {"Connection": "Upgrade", "Upgrade": "unsupported_proto"} server = await aiohttp_raw_server(handler) cli = await aiohttp_client(server) test_data = b"Test" resp = await cli.post("/path/to", data=test_data, headers=upgrade_headers) assert resp.status == 200 data = await resp.read() assert data == test_data async def test_raw_server_not_http_exception(aiohttp_raw_server, aiohttp_client): exc = RuntimeError("custom runtime error") async def handler(request): raise exc logger = mock.Mock() server = await aiohttp_raw_server(handler, logger=logger, debug=False) cli = await aiohttp_client(server) resp = await cli.get("/path/to") assert resp.status == 500 assert resp.headers["Content-Type"].startswith("text/plain") txt = await resp.text() assert txt.startswith("500 Internal Server Error") assert "Traceback" not in txt logger.exception.assert_called_with("Error handling request", exc_info=exc) async def test_raw_server_handler_timeout(aiohttp_raw_server, aiohttp_client) -> None: exc = asyncio.TimeoutError("error") async def handler(request): raise exc logger = mock.Mock() server = await aiohttp_raw_server(handler, logger=logger) cli = await aiohttp_client(server) resp = await cli.get("/path/to") assert resp.status == 504 await resp.text() logger.debug.assert_called_with("Request handler timed out.", exc_info=exc) async def test_raw_server_do_not_swallow_exceptions(aiohttp_raw_server, aiohttp_client): async def handler(request): raise asyncio.CancelledError() logger = mock.Mock() server = await aiohttp_raw_server(handler, logger=logger) cli = await aiohttp_client(server) with pytest.raises(client.ServerDisconnectedError): await cli.get("/path/to") logger.debug.assert_called_with("Ignored premature client disconnection") async def test_raw_server_cancelled_in_write_eof(aiohttp_raw_server, aiohttp_client): async def handler(request): resp = web.Response(text=str(request.rel_url)) resp.write_eof = mock.Mock(side_effect=asyncio.CancelledError("error")) return resp logger = mock.Mock() server = await aiohttp_raw_server(handler, logger=logger) cli = await aiohttp_client(server) resp = await cli.get("/path/to") with pytest.raises(client.ClientPayloadError): await resp.read() logger.debug.assert_called_with("Ignored premature client disconnection") async def test_raw_server_not_http_exception_debug(aiohttp_raw_server, aiohttp_client): exc = RuntimeError("custom runtime error") async def handler(request): raise exc logger = mock.Mock() server = await aiohttp_raw_server(handler, logger=logger, debug=True) cli = await aiohttp_client(server) resp = await cli.get("/path/to") assert resp.status == 500 assert resp.headers["Content-Type"].startswith("text/plain") txt = await resp.text() assert "Traceback (most recent call last):\n" in txt logger.exception.assert_called_with("Error handling request", exc_info=exc) async def test_raw_server_html_exception(aiohttp_raw_server, aiohttp_client): exc = RuntimeError("custom runtime error") async def handler(request): raise exc logger = mock.Mock() server = await aiohttp_raw_server(handler, logger=logger, debug=False) cli = await aiohttp_client(server) resp = await cli.get("/path/to", headers={"Accept": "text/html"}) assert resp.status == 500 assert resp.headers["Content-Type"].startswith("text/html") txt = await resp.text() assert txt == ( "500 Internal Server Error\n" "

    500 Internal Server Error

    \n" "Server got itself in trouble\n" "\n" ) logger.exception.assert_called_with("Error handling request", exc_info=exc) async def test_raw_server_html_exception_debug(aiohttp_raw_server, aiohttp_client): exc = RuntimeError("custom runtime error") async def handler(request): raise exc logger = mock.Mock() server = await aiohttp_raw_server(handler, logger=logger, debug=True) cli = await aiohttp_client(server) resp = await cli.get("/path/to", headers={"Accept": "text/html"}) assert resp.status == 500 assert resp.headers["Content-Type"].startswith("text/html") txt = await resp.text() assert txt.startswith( "500 Internal Server Error\n" "

    500 Internal Server Error

    \n" "

    Traceback:

    \n" "
    Traceback (most recent call last):\n"
        )
    
        logger.exception.assert_called_with("Error handling request", exc_info=exc)
    
    
    async def test_handler_cancellation(aiohttp_unused_port) -> None:
        event = asyncio.Event()
        port = aiohttp_unused_port()
    
        async def on_request(_: web.Request) -> web.Response:
            nonlocal event
            try:
                await asyncio.sleep(10)
            except asyncio.CancelledError:
                event.set()
                raise
            else:
                raise web.HTTPInternalServerError()
    
        app = web.Application()
        app.router.add_route("GET", "/", on_request)
    
        runner = web.AppRunner(app, handler_cancellation=True)
        await runner.setup()
    
        site = web.TCPSite(runner, host="localhost", port=port)
    
        await site.start()
    
        try:
            assert runner.server.handler_cancellation, "Flag was not propagated"
    
            async with client.ClientSession(
                timeout=client.ClientTimeout(total=0.1)
            ) as sess:
                with pytest.raises(asyncio.TimeoutError):
                    await sess.get(f"http://localhost:{port}/")
    
            with suppress(asyncio.TimeoutError):
                await asyncio.wait_for(event.wait(), timeout=1)
            assert event.is_set(), "Request handler hasn't been cancelled"
        finally:
            await asyncio.gather(runner.shutdown(), site.stop())
    
    
    async def test_no_handler_cancellation(aiohttp_unused_port) -> None:
        timeout_event = asyncio.Event()
        done_event = asyncio.Event()
        port = aiohttp_unused_port()
        started = False
    
        async def on_request(_: web.Request) -> web.Response:
            nonlocal done_event, started, timeout_event
            started = True
            await asyncio.wait_for(timeout_event.wait(), timeout=5)
            done_event.set()
            return web.Response()
    
        app = web.Application()
        app.router.add_route("GET", "/", on_request)
    
        runner = web.AppRunner(app)
        await runner.setup()
    
        site = web.TCPSite(runner, host="localhost", port=port)
    
        await site.start()
    
        try:
            async with client.ClientSession(
                timeout=client.ClientTimeout(total=0.2)
            ) as sess:
                with pytest.raises(asyncio.TimeoutError):
                    await sess.get(f"http://localhost:{port}/")
            await asyncio.sleep(0.1)
            timeout_event.set()
    
            with suppress(asyncio.TimeoutError):
                await asyncio.wait_for(done_event.wait(), timeout=1)
            assert started
            assert done_event.is_set()
        finally:
            await asyncio.gather(runner.shutdown(), site.stop())
    ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285814.0
    aiohttp-3.9.5/tests/test_web_urldispatcher.py0000644000175100001770000005547114607525266021117 0ustar00runnerdockerimport asyncio
    import functools
    import pathlib
    import sys
    from typing import Optional
    from unittest import mock
    from unittest.mock import MagicMock
    
    import pytest
    import yarl
    
    from aiohttp import abc, web
    from aiohttp.pytest_plugin import AiohttpClient
    from aiohttp.web_urldispatcher import SystemRoute
    
    
    @pytest.mark.parametrize(
        "show_index,status,prefix,request_path,data",
        [
            pytest.param(False, 403, "/", "/", None, id="index_forbidden"),
            pytest.param(
                True,
                200,
                "/",
                "/",
                b"\n\nIndex of /.\n\n\n

    Index of" b' /.

    \n
    \n\n", ), pytest.param( True, 200, "/static", "/static", b"\n\nIndex of /.\n\n\n

    Index of" b' /.

    \n\n\n', id="index_static", ), pytest.param( True, 200, "/static", "/static/my_dir", b"\n\nIndex of /my_dir\n\n\n

    " b'Index of /my_dir

    \n\n\n", id="index_subdir", ), ], ) async def test_access_root_of_static_handler( tmp_path: pathlib.Path, aiohttp_client: AiohttpClient, show_index: bool, status: int, prefix: str, request_path: str, data: Optional[bytes], ) -> None: # Tests the operation of static file server. # Try to access the root of static file server, and make # sure that correct HTTP statuses are returned depending if we directory # index should be shown or not. # Put a file inside tmp_path: my_file = tmp_path / "my_file" my_dir = tmp_path / "my_dir" my_dir.mkdir() my_file_in_dir = my_dir / "my_file_in_dir" with my_file.open("w") as fw: fw.write("hello") with my_file_in_dir.open("w") as fw: fw.write("world") app = web.Application() # Register global static route: app.router.add_static(prefix, str(tmp_path), show_index=show_index) client = await aiohttp_client(app) # Request the root of the static directory. async with await client.get(request_path) as r: assert r.status == status if data: assert r.headers["Content-Type"] == "text/html; charset=utf-8" read_ = await r.read() assert read_ == data @pytest.mark.internal # Dependent on filesystem @pytest.mark.skipif( not sys.platform.startswith("linux"), reason="Invalid filenames on some filesystems (like Windows)", ) @pytest.mark.parametrize( "show_index,status,prefix,request_path,data", [ pytest.param(False, 403, "/", "/", None, id="index_forbidden"), pytest.param( True, 200, "/", "/", b"\n\nIndex of /.\n\n\n

    Index of" b' /.

    \n\n\n", ), pytest.param( True, 200, "/static", "/static", b"\n\nIndex of /.\n\n\n

    Index of" b' /.

    \n\n\n", id="index_static", ), pytest.param( True, 200, "/static", "/static/.dir", b"\n\nIndex of /<img src=0 onerror=alert(1)>.dir</t" b"itle>\n</head>\n<body>\n<h1>Index of /<img src=0 onerror=alert(1)>.di" b'r</h1>\n<ul>\n<li><a href="/static/%3Cimg%20src=0%20onerror=alert(1)%3E.di' b'r/my_file_in_dir">my_file_in_dir</a></li>\n</ul>\n</body>\n</html>', id="index_subdir", ), ], ) async def test_access_root_of_static_handler_xss( tmp_path: pathlib.Path, aiohttp_client: AiohttpClient, show_index: bool, status: int, prefix: str, request_path: str, data: Optional[bytes], ) -> None: # Tests the operation of static file server. # Try to access the root of static file server, and make # sure that correct HTTP statuses are returned depending if we directory # index should be shown or not. # Ensure that html in file names is escaped. # Ensure that links are url quoted. my_file = tmp_path / "<img src=0 onerror=alert(1)>.txt" my_dir = tmp_path / "<img src=0 onerror=alert(1)>.dir" my_dir.mkdir() my_file_in_dir = my_dir / "my_file_in_dir" with my_file.open("w") as fw: fw.write("hello") with my_file_in_dir.open("w") as fw: fw.write("world") app = web.Application() # Register global static route: app.router.add_static(prefix, str(tmp_path), show_index=show_index) client = await aiohttp_client(app) # Request the root of the static directory. async with await client.get(request_path) as r: assert r.status == status if data: assert r.headers["Content-Type"] == "text/html; charset=utf-8" read_ = await r.read() assert read_ == data async def test_follow_symlink( tmp_path: pathlib.Path, aiohttp_client: AiohttpClient ) -> None: # Tests the access to a symlink, in static folder data = "hello world" my_dir_path = tmp_path / "my_dir" my_dir_path.mkdir() my_file_path = my_dir_path / "my_file_in_dir" with my_file_path.open("w") as fw: fw.write(data) my_symlink_path = tmp_path / "my_symlink" pathlib.Path(str(my_symlink_path)).symlink_to(str(my_dir_path), True) app = web.Application() # Register global static route: app.router.add_static("/", str(tmp_path), follow_symlinks=True) client = await aiohttp_client(app) # Request the root of the static directory. r = await client.get("/my_symlink/my_file_in_dir") assert r.status == 200 assert (await r.text()) == data async def test_follow_symlink_directory_traversal( tmp_path: pathlib.Path, aiohttp_client: AiohttpClient ) -> None: # Tests that follow_symlinks does not allow directory transversal data = "private" private_file = tmp_path / "private_file" private_file.write_text(data) safe_path = tmp_path / "safe_dir" safe_path.mkdir() app = web.Application() # Register global static route: app.router.add_static("/", str(safe_path), follow_symlinks=True) client = await aiohttp_client(app) await client.start_server() # We need to use a raw socket to test this, as the client will normalize # the path before sending it to the server. reader, writer = await asyncio.open_connection(client.host, client.port) writer.write(b"GET /../private_file HTTP/1.1\r\n\r\n") response = await reader.readuntil(b"\r\n\r\n") assert b"404 Not Found" in response writer.close() await writer.wait_closed() await client.close() async def test_follow_symlink_directory_traversal_after_normalization( tmp_path: pathlib.Path, aiohttp_client: AiohttpClient ) -> None: # Tests that follow_symlinks does not allow directory transversal # after normalization # # Directory structure # |-- secret_dir # | |-- private_file (should never be accessible) # | |-- symlink_target_dir # | |-- symlink_target_file (should be accessible via the my_symlink symlink) # | |-- sandbox_dir # | |-- my_symlink -> symlink_target_dir # secret_path = tmp_path / "secret_dir" secret_path.mkdir() # This file is below the symlink target and should not be reachable private_file = secret_path / "private_file" private_file.write_text("private") symlink_target_path = secret_path / "symlink_target_dir" symlink_target_path.mkdir() sandbox_path = symlink_target_path / "sandbox_dir" sandbox_path.mkdir() # This file should be reachable via the symlink symlink_target_file = symlink_target_path / "symlink_target_file" symlink_target_file.write_text("readable") my_symlink_path = sandbox_path / "my_symlink" pathlib.Path(str(my_symlink_path)).symlink_to(str(symlink_target_path), True) app = web.Application() # Register global static route: app.router.add_static("/", str(sandbox_path), follow_symlinks=True) client = await aiohttp_client(app) await client.start_server() # We need to use a raw socket to test this, as the client will normalize # the path before sending it to the server. reader, writer = await asyncio.open_connection(client.host, client.port) writer.write(b"GET /my_symlink/../private_file HTTP/1.1\r\n\r\n") response = await reader.readuntil(b"\r\n\r\n") assert b"404 Not Found" in response writer.close() await writer.wait_closed() reader, writer = await asyncio.open_connection(client.host, client.port) writer.write(b"GET /my_symlink/symlink_target_file HTTP/1.1\r\n\r\n") response = await reader.readuntil(b"\r\n\r\n") assert b"200 OK" in response response = await reader.readuntil(b"readable") assert response == b"readable" writer.close() await writer.wait_closed() await client.close() @pytest.mark.parametrize( "dir_name,filename,data", [ ("", "test file.txt", "test text"), ("test dir name", "test dir file .txt", "test text file folder"), ], ) async def test_access_to_the_file_with_spaces( tmp_path: pathlib.Path, aiohttp_client: AiohttpClient, dir_name: str, filename: str, data: str, ) -> None: # Checks operation of static files with spaces my_dir_path = tmp_path / dir_name if my_dir_path != tmp_path: my_dir_path.mkdir() my_file_path = my_dir_path / filename with my_file_path.open("w") as fw: fw.write(data) app = web.Application() url = "/" + str(pathlib.Path(dir_name, filename)) app.router.add_static("/", str(tmp_path)) client = await aiohttp_client(app) r = await client.get(url) assert r.status == 200 assert (await r.text()) == data await r.release() async def test_access_non_existing_resource( tmp_path: pathlib.Path, aiohttp_client: AiohttpClient ) -> None: # Tests accessing non-existing resource # Try to access a non-exiting resource and make sure that 404 HTTP status # returned. app = web.Application() # Register global static route: app.router.add_static("/", str(tmp_path), show_index=True) client = await aiohttp_client(app) # Request the root of the static directory. r = await client.get("/non_existing_resource") assert r.status == 404 @pytest.mark.parametrize( "registered_path,request_url", [ ("/a:b", "/a:b"), ("/a@b", "/a@b"), ("/a:b", "/a%3Ab"), ], ) async def test_url_escaping( aiohttp_client: AiohttpClient, registered_path: str, request_url: str ) -> None: # Tests accessing a resource with app = web.Application() async def handler(request: web.Request) -> web.Response: return web.Response() app.router.add_get(registered_path, handler) client = await aiohttp_client(app) r = await client.get(request_url) assert r.status == 200 async def test_handler_metadata_persistence() -> None: """Tests accessing metadata of a handler after registering it on the app router.""" app = web.Application() async def async_handler(request: web.Request) -> web.Response: """Doc""" return web.Response() def sync_handler(request): """Doc""" return web.Response() app.router.add_get("/async", async_handler) with pytest.warns(DeprecationWarning): app.router.add_get("/sync", sync_handler) for resource in app.router.resources(): for route in resource: assert route.handler.__doc__ == "Doc" async def test_unauthorized_folder_access( tmp_path: pathlib.Path, aiohttp_client: AiohttpClient ) -> None: # Tests the unauthorized access to a folder of static file server. # Try to list a folder content of static file server when server does not # have permissions to do so for the folder. my_dir = tmp_path / "my_dir" my_dir.mkdir() app = web.Application() with mock.patch("pathlib.Path.__new__") as path_constructor: path = MagicMock() path.joinpath.return_value = path path.resolve.return_value = path path.iterdir.return_value.__iter__.side_effect = PermissionError() path_constructor.return_value = path # Register global static route: app.router.add_static("/", str(tmp_path), show_index=True) client = await aiohttp_client(app) # Request the root of the static directory. r = await client.get("/" + my_dir.name) assert r.status == 403 async def test_access_symlink_loop( tmp_path: pathlib.Path, aiohttp_client: AiohttpClient ) -> None: # Tests the access to a looped symlink, which could not be resolved. my_dir_path = tmp_path / "my_symlink" pathlib.Path(str(my_dir_path)).symlink_to(str(my_dir_path), True) app = web.Application() # Register global static route: app.router.add_static("/", str(tmp_path), show_index=True) client = await aiohttp_client(app) # Request the root of the static directory. r = await client.get("/" + my_dir_path.name) assert r.status == 404 async def test_access_special_resource( tmp_path: pathlib.Path, aiohttp_client: AiohttpClient ) -> None: # Tests the access to a resource that is neither a file nor a directory. # Checks that if a special resource is accessed (f.e. named pipe or UNIX # domain socket) then 404 HTTP status returned. app = web.Application() with mock.patch("pathlib.Path.__new__") as path_constructor: special = MagicMock() special.is_dir.return_value = False special.is_file.return_value = False path = MagicMock() path.joinpath.side_effect = lambda p: (special if p == "special" else path) path.resolve.return_value = path special.resolve.return_value = special path_constructor.return_value = path # Register global static route: app.router.add_static("/", str(tmp_path), show_index=True) client = await aiohttp_client(app) # Request the root of the static directory. r = await client.get("/special") assert r.status == 403 async def test_partially_applied_handler(aiohttp_client: AiohttpClient) -> None: app = web.Application() async def handler(data, request): return web.Response(body=data) app.router.add_route("GET", "/", functools.partial(handler, b"hello")) client = await aiohttp_client(app) r = await client.get("/") data = await r.read() assert data == b"hello" async def test_static_head( tmp_path: pathlib.Path, aiohttp_client: AiohttpClient ) -> None: # Test HEAD on static route my_file_path = tmp_path / "test.txt" with my_file_path.open("wb") as fw: fw.write(b"should_not_see_this\n") app = web.Application() app.router.add_static("/", str(tmp_path)) client = await aiohttp_client(app) r = await client.head("/test.txt") assert r.status == 200 # Check that there is no content sent (see #4809). This can't easily be # done with aiohttp_client because the buffering can consume the content. reader, writer = await asyncio.open_connection(client.host, client.port) writer.write(b"HEAD /test.txt HTTP/1.1\r\n") writer.write(b"Host: localhost\r\n") writer.write(b"Connection: close\r\n") writer.write(b"\r\n") while await reader.readline() != b"\r\n": pass content = await reader.read() writer.close() assert content == b"" def test_system_route() -> None: route = SystemRoute(web.HTTPCreated(reason="test")) with pytest.raises(RuntimeError): route.url_for() assert route.name is None assert route.resource is None assert "<SystemRoute 201: test>" == repr(route) assert 201 == route.status assert "test" == route.reason async def test_412_is_returned(aiohttp_client: AiohttpClient) -> None: class MyRouter(abc.AbstractRouter): async def resolve(self, request): raise web.HTTPPreconditionFailed() with pytest.warns(DeprecationWarning): app = web.Application(router=MyRouter()) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 412 async def test_allow_head(aiohttp_client: AiohttpClient) -> None: # Test allow_head on routes. app = web.Application() async def handler(request: web.Request) -> web.Response: return web.Response() app.router.add_get("/a", handler, name="a") app.router.add_get("/b", handler, allow_head=False, name="b") client = await aiohttp_client(app) r = await client.get("/a") assert r.status == 200 await r.release() r = await client.head("/a") assert r.status == 200 await r.release() r = await client.get("/b") assert r.status == 200 await r.release() r = await client.head("/b") assert r.status == 405 await r.release() @pytest.mark.parametrize( "path", [ "/a", "/{a}", ], ) def test_reuse_last_added_resource(path: str) -> None: # Test that adding a route with the same name and path of the last added # resource doesn't create a new resource. app = web.Application() async def handler(request: web.Request) -> web.Response: return web.Response() app.router.add_get(path, handler, name="a") app.router.add_post(path, handler, name="a") assert len(app.router.resources()) == 1 def test_resource_raw_match() -> None: app = web.Application() async def handler(request: web.Request) -> web.Response: return web.Response() route = app.router.add_get("/a", handler, name="a") assert route.resource is not None assert route.resource.raw_match("/a") route = app.router.add_get("/{b}", handler, name="b") assert route.resource is not None assert route.resource.raw_match("/{b}") resource = app.router.add_static("/static", ".") assert not resource.raw_match("/static") async def test_add_view(aiohttp_client: AiohttpClient) -> None: app = web.Application() class MyView(web.View): async def get(self) -> web.Response: return web.Response() async def post(self) -> web.Response: return web.Response() app.router.add_view("/a", MyView) client = await aiohttp_client(app) r = await client.get("/a") assert r.status == 200 await r.release() r = await client.post("/a") assert r.status == 200 await r.release() r = await client.put("/a") assert r.status == 405 await r.release() async def test_decorate_view(aiohttp_client: AiohttpClient) -> None: routes = web.RouteTableDef() @routes.view("/a") class MyView(web.View): async def get(self) -> web.Response: return web.Response() async def post(self) -> web.Response: return web.Response() app = web.Application() app.router.add_routes(routes) client = await aiohttp_client(app) r = await client.get("/a") assert r.status == 200 await r.release() r = await client.post("/a") assert r.status == 200 await r.release() r = await client.put("/a") assert r.status == 405 await r.release() async def test_web_view(aiohttp_client: AiohttpClient) -> None: app = web.Application() class MyView(web.View): async def get(self) -> web.Response: return web.Response() async def post(self) -> web.Response: return web.Response() app.router.add_routes([web.view("/a", MyView)]) client = await aiohttp_client(app) r = await client.get("/a") assert r.status == 200 await r.release() r = await client.post("/a") assert r.status == 200 await r.release() r = await client.put("/a") assert r.status == 405 await r.release() async def test_static_absolute_url( aiohttp_client: AiohttpClient, tmp_path: pathlib.Path ) -> None: # requested url is an absolute name like # /static/\\machine_name\c$ or /static/D:\path # where the static dir is totally different app = web.Application() file_path = tmp_path / "file.txt" file_path.write_text("sample text", "ascii") here = pathlib.Path(__file__).parent app.router.add_static("/static", here) client = await aiohttp_client(app) resp = await client.get("/static/" + str(file_path.resolve())) assert resp.status == 403 async def test_for_issue_5250( aiohttp_client: AiohttpClient, tmp_path: pathlib.Path ) -> None: app = web.Application() app.router.add_static("/foo", tmp_path) async def get_foobar(request: web.Request) -> web.Response: return web.Response(body="success!") app.router.add_get("/foobar", get_foobar) client = await aiohttp_client(app) async with await client.get("/foobar") as resp: assert resp.status == 200 assert (await resp.text()) == "success!" @pytest.mark.xfail( raises=AssertionError, reason="Regression in v3.7: https://github.com/aio-libs/aiohttp/issues/5621", ) @pytest.mark.parametrize( ("route_definition", "urlencoded_path", "expected_http_resp_status"), ( ("/467,802,24834/hello", "/467%2C802%2C24834/hello", 200), ("/{user_ids:([0-9]+)(,([0-9]+))*}/hello", "/467%2C802%2C24834/hello", 200), ("/1%2C3/hello", "/1%2C3/hello", 404), ), ids=("urldecoded_route", "urldecoded_route_with_regex", "urlencoded_route"), ) async def test_decoded_url_match( aiohttp_client: AiohttpClient, route_definition: str, urlencoded_path: str, expected_http_resp_status: int, ) -> None: app = web.Application() async def handler(request: web.Request) -> web.Response: return web.Response() app.router.add_get(route_definition, handler) client = await aiohttp_client(app) r = await client.get(yarl.URL(urlencoded_path, encoded=True)) assert r.status == expected_http_resp_status await r.release() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285814.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/tests/test_web_websocket.py�����������������������������������������������������������0000644�0001751�0000177�00000040461�14607525266�020225� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import asyncio import time from typing import Any from unittest import mock import aiosignal import pytest from multidict import CIMultiDict from aiohttp import WSMessage, WSMsgType from aiohttp.streams import EofStream from aiohttp.test_utils import make_mocked_coro, make_mocked_request from aiohttp.web import HTTPBadRequest, WebSocketResponse from aiohttp.web_ws import WS_CLOSED_MESSAGE, WebSocketReady @pytest.fixture def app(loop): ret = mock.Mock() ret.loop = loop ret._debug = False ret.on_response_prepare = aiosignal.Signal(ret) ret.on_response_prepare.freeze() return ret @pytest.fixture def protocol(): ret = mock.Mock() ret.set_parser.return_value = ret return ret @pytest.fixture def make_request(app, protocol): def maker(method, path, headers=None, protocols=False): if headers is None: headers = CIMultiDict( { "HOST": "server.example.com", "UPGRADE": "websocket", "CONNECTION": "Upgrade", "SEC-WEBSOCKET-KEY": "dGhlIHNhbXBsZSBub25jZQ==", "ORIGIN": "http://example.com", "SEC-WEBSOCKET-VERSION": "13", } ) if protocols: headers["SEC-WEBSOCKET-PROTOCOL"] = "chat, superchat" return make_mocked_request( method, path, headers, app=app, protocol=protocol, loop=app.loop ) return maker async def test_nonstarted_ping() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.ping() async def test_nonstarted_pong() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.pong() async def test_nonstarted_send_str() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.send_str("string") async def test_nonstarted_send_bytes() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.send_bytes(b"bytes") async def test_nonstarted_send_json() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.send_json({"type": "json"}) async def test_nonstarted_close() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.close() async def test_nonstarted_receive_str() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.receive_str() async def test_nonstarted_receive_bytes() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.receive_bytes() async def test_nonstarted_receive_json() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.receive_json() async def test_receive_str_nonstring(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) async def receive(): return WSMessage(WSMsgType.BINARY, b"data", b"") ws.receive = receive with pytest.raises(TypeError): await ws.receive_str() async def test_receive_bytes_nonsbytes(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) async def receive(): return WSMessage(WSMsgType.TEXT, "data", b"") ws.receive = receive with pytest.raises(TypeError): await ws.receive_bytes() async def test_send_str_nonstring(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) with pytest.raises(TypeError): await ws.send_str(b"bytes") async def test_send_bytes_nonbytes(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) with pytest.raises(TypeError): await ws.send_bytes("string") async def test_send_json_nonjson(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) with pytest.raises(TypeError): await ws.send_json(set()) async def test_write_non_prepared() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.write(b"data") async def test_heartbeat_timeout(make_request: Any) -> None: """Verify the transport is closed when the heartbeat timeout is reached.""" loop = asyncio.get_running_loop() future = loop.create_future() req = make_request("GET", "/") lowest_time = time.get_clock_info("monotonic").resolution req._protocol._timeout_ceil_threshold = lowest_time ws = WebSocketResponse(heartbeat=lowest_time, timeout=lowest_time) await ws.prepare(req) ws._req.transport.close.side_effect = lambda: future.set_result(None) await future assert ws.closed def test_websocket_ready() -> None: websocket_ready = WebSocketReady(True, "chat") assert websocket_ready.ok is True assert websocket_ready.protocol == "chat" def test_websocket_not_ready() -> None: websocket_ready = WebSocketReady(False, None) assert websocket_ready.ok is False assert websocket_ready.protocol is None def test_websocket_ready_unknown_protocol() -> None: websocket_ready = WebSocketReady(True, None) assert websocket_ready.ok is True assert websocket_ready.protocol is None def test_bool_websocket_ready() -> None: websocket_ready = WebSocketReady(True, None) assert bool(websocket_ready) is True def test_bool_websocket_not_ready() -> None: websocket_ready = WebSocketReady(False, None) assert bool(websocket_ready) is False def test_can_prepare_ok(make_request) -> None: req = make_request("GET", "/", protocols=True) ws = WebSocketResponse(protocols=("chat",)) assert WebSocketReady(True, "chat") == ws.can_prepare(req) def test_can_prepare_unknown_protocol(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() assert WebSocketReady(True, None) == ws.can_prepare(req) def test_can_prepare_without_upgrade(make_request) -> None: req = make_request("GET", "/", headers=CIMultiDict({})) ws = WebSocketResponse() assert WebSocketReady(False, None) == ws.can_prepare(req) async def test_can_prepare_started(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) with pytest.raises(RuntimeError) as ctx: ws.can_prepare(req) assert "Already started" in str(ctx.value) def test_closed_after_ctor() -> None: ws = WebSocketResponse() assert not ws.closed assert ws.close_code is None async def test_send_str_closed(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader.feed_data(WS_CLOSED_MESSAGE, 0) await ws.close() assert len(ws._req.transport.close.mock_calls) == 1 with pytest.raises(ConnectionError): await ws.send_str("string") async def test_send_bytes_closed(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader.feed_data(WS_CLOSED_MESSAGE, 0) await ws.close() with pytest.raises(ConnectionError): await ws.send_bytes(b"bytes") async def test_send_json_closed(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader.feed_data(WS_CLOSED_MESSAGE, 0) await ws.close() with pytest.raises(ConnectionError): await ws.send_json({"type": "json"}) async def test_ping_closed(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader.feed_data(WS_CLOSED_MESSAGE, 0) await ws.close() with pytest.raises(ConnectionError): await ws.ping() async def test_pong_closed(make_request, mocker) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader.feed_data(WS_CLOSED_MESSAGE, 0) await ws.close() with pytest.raises(ConnectionError): await ws.pong() async def test_close_idempotent(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader.feed_data(WS_CLOSED_MESSAGE, 0) assert await ws.close(code=1, message="message1") assert ws.closed assert len(ws._req.transport.close.mock_calls) == 1 assert not (await ws.close(code=2, message="message2")) async def test_prepare_post_method_ok(make_request) -> None: req = make_request("POST", "/") ws = WebSocketResponse() await ws.prepare(req) assert ws.prepared async def test_prepare_without_upgrade(make_request) -> None: req = make_request("GET", "/", headers=CIMultiDict({})) ws = WebSocketResponse() with pytest.raises(HTTPBadRequest): await ws.prepare(req) async def test_wait_closed_before_start() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.close() async def test_write_eof_not_started() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.write_eof() async def test_write_eof_idempotent(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) assert len(ws._req.transport.close.mock_calls) == 0 ws._reader.feed_data(WS_CLOSED_MESSAGE, 0) await ws.close() await ws.write_eof() await ws.write_eof() await ws.write_eof() assert len(ws._req.transport.close.mock_calls) == 1 async def test_receive_eofstream_in_reader(make_request, loop) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader = mock.Mock() exc = EofStream() res = loop.create_future() res.set_exception(exc) ws._reader.read = make_mocked_coro(res) ws._payload_writer.drain = mock.Mock() ws._payload_writer.drain.return_value = loop.create_future() ws._payload_writer.drain.return_value.set_result(True) msg = await ws.receive() assert msg.type == WSMsgType.CLOSED assert ws.closed async def test_receive_exception_in_reader(make_request: Any, loop: Any) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader = mock.Mock() exc = Exception() res = loop.create_future() res.set_exception(exc) ws._reader.read = make_mocked_coro(res) ws._payload_writer.drain = mock.Mock() ws._payload_writer.drain.return_value = loop.create_future() ws._payload_writer.drain.return_value.set_result(True) msg = await ws.receive() assert msg.type == WSMsgType.ERROR assert ws.closed assert len(ws._req.transport.close.mock_calls) == 1 async def test_receive_close_but_left_open(make_request: Any, loop: Any) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) close_message = WSMessage(WSMsgType.CLOSE, 1000, "close") ws._reader = mock.Mock() ws._reader.read = mock.AsyncMock(return_value=close_message) ws._payload_writer.drain = mock.Mock() ws._payload_writer.drain.return_value = loop.create_future() ws._payload_writer.drain.return_value.set_result(True) msg = await ws.receive() assert msg.type == WSMsgType.CLOSE assert ws.closed assert len(ws._req.transport.close.mock_calls) == 1 async def test_receive_closing(make_request: Any, loop: Any) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) closing_message = WSMessage(WSMsgType.CLOSING, 1000, "closing") ws._reader = mock.Mock() read_mock = mock.AsyncMock(return_value=closing_message) ws._reader.read = read_mock ws._payload_writer.drain = mock.Mock() ws._payload_writer.drain.return_value = loop.create_future() ws._payload_writer.drain.return_value.set_result(True) msg = await ws.receive() assert msg.type == WSMsgType.CLOSING assert not ws.closed msg = await ws.receive() assert msg.type == WSMsgType.CLOSING assert not ws.closed ws._cancel(ConnectionResetError("Connection lost")) msg = await ws.receive() assert msg.type == WSMsgType.CLOSING async def test_close_after_closing(make_request: Any, loop: Any) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) closing_message = WSMessage(WSMsgType.CLOSING, 1000, "closing") ws._reader = mock.Mock() ws._reader.read = mock.AsyncMock(return_value=closing_message) ws._payload_writer.drain = mock.Mock() ws._payload_writer.drain.return_value = loop.create_future() ws._payload_writer.drain.return_value.set_result(True) msg = await ws.receive() assert msg.type == WSMsgType.CLOSING assert not ws.closed assert len(ws._req.transport.close.mock_calls) == 0 await ws.close() assert ws.closed assert len(ws._req.transport.close.mock_calls) == 1 async def test_receive_timeouterror(make_request: Any, loop: Any) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) assert len(ws._req.transport.close.mock_calls) == 0 ws._reader = mock.Mock() res = loop.create_future() res.set_exception(asyncio.TimeoutError()) ws._reader.read = make_mocked_coro(res) with pytest.raises(asyncio.TimeoutError): await ws.receive() # Should not close the connection on timeout assert len(ws._req.transport.close.mock_calls) == 0 async def test_multiple_receive_on_close_connection(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader.feed_data(WS_CLOSED_MESSAGE, 0) await ws.close() await ws.receive() await ws.receive() await ws.receive() await ws.receive() with pytest.raises(RuntimeError): await ws.receive() async def test_concurrent_receive(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._waiting = True with pytest.raises(RuntimeError): await ws.receive() async def test_close_exc(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) assert len(ws._req.transport.close.mock_calls) == 0 exc = ValueError() ws._writer = mock.Mock() ws._writer.close.side_effect = exc await ws.close() assert ws.closed assert ws.exception() is exc assert len(ws._req.transport.close.mock_calls) == 1 ws._closed = False ws._writer.close.side_effect = asyncio.CancelledError() with pytest.raises(asyncio.CancelledError): await ws.close() async def test_prepare_twice_idempotent(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() impl1 = await ws.prepare(req) impl2 = await ws.prepare(req) assert impl1 is impl2 async def test_send_with_per_message_deflate(make_request, mocker) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) writer_send = ws._writer.send = make_mocked_coro() await ws.send_str("string", compress=15) writer_send.assert_called_with("string", binary=False, compress=15) await ws.send_bytes(b"bytes", compress=0) writer_send.assert_called_with(b"bytes", binary=True, compress=0) await ws.send_json("[{}]", compress=9) writer_send.assert_called_with('"[{}]"', binary=False, compress=9) async def test_no_transfer_encoding_header(make_request, mocker) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws._start(req) assert "Transfer-Encoding" not in ws.headers @pytest.mark.parametrize( "ws_transport, expected_result", [ ( mock.MagicMock( transport=mock.MagicMock( get_extra_info=lambda name, default=None: {"test": "existent"}.get( name, default ) ) ), "existent", ), (None, "default"), (mock.MagicMock(transport=None), "default"), ], ) async def test_get_extra_info( make_request, mocker, ws_transport, expected_result ) -> None: valid_key = "test" default_value = "default" req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._writer = ws_transport assert ws.get_extra_info(valid_key, default_value) == expected_result ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285814.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/tests/test_web_websocket_functional.py������������������������������������������������0000644�0001751�0000177�00000055650�14607525266�022455� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# HTTP websocket server functional tests import asyncio import contextlib import sys from typing import Any, Optional import pytest import aiohttp from aiohttp import web from aiohttp.http import WSCloseCode, WSMsgType async def test_websocket_can_prepare(loop, aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() if not ws.can_prepare(request): raise web.HTTPUpgradeRequired() return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 426 async def test_websocket_json(loop, aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() if not ws.can_prepare(request): return web.HTTPUpgradeRequired() await ws.prepare(request) msg = await ws.receive() msg_json = msg.json() answer = msg_json["test"] await ws.send_str(answer) await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") expected_value = "value" payload = '{"test": "%s"}' % expected_value await ws.send_str(payload) resp = await ws.receive() assert resp.data == expected_value async def test_websocket_json_invalid_message(loop, aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) try: await ws.receive_json() except ValueError: await ws.send_str("ValueError was raised") else: raise Exception("No Exception") finally: await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") payload = "NOT A VALID JSON STRING" await ws.send_str(payload) data = await ws.receive_str() assert "ValueError was raised" in data async def test_websocket_send_json(loop, aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) data = await ws.receive_json() await ws.send_json(data) await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") expected_value = "value" await ws.send_json({"test": expected_value}) data = await ws.receive_json() assert data["test"] == expected_value async def test_websocket_receive_json(loop, aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) data = await ws.receive_json() answer = data["test"] await ws.send_str(answer) await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") expected_value = "value" payload = '{"test": "%s"}' % expected_value await ws.send_str(payload) resp = await ws.receive() assert resp.data == expected_value async def test_send_recv_text(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_str() await ws.send_str(msg + "/answer") await ws.close() closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") await ws.send_str("ask") msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.TEXT assert "ask/answer" == msg.data msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.CLOSE assert msg.data == WSCloseCode.OK assert msg.extra == "" assert ws.closed assert ws.close_code == WSCloseCode.OK await closed async def test_send_recv_bytes(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_bytes() await ws.send_bytes(msg + b"/answer") await ws.close() closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") await ws.send_bytes(b"ask") msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.BINARY assert b"ask/answer" == msg.data msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.CLOSE assert msg.data == WSCloseCode.OK assert msg.extra == "" assert ws.closed assert ws.close_code == WSCloseCode.OK await closed async def test_send_recv_json(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) data = await ws.receive_json() await ws.send_json({"response": data["request"]}) await ws.close() closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") await ws.send_str('{"request": "test"}') msg = await ws.receive() data = msg.json() assert msg.type == aiohttp.WSMsgType.TEXT assert data["response"] == "test" msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.CLOSE assert msg.data == WSCloseCode.OK assert msg.extra == "" await ws.close() await closed async def test_close_timeout(loop, aiohttp_client) -> None: aborted = loop.create_future() elapsed = 1e10 # something big async def handler(request): nonlocal elapsed ws = web.WebSocketResponse(timeout=0.1) await ws.prepare(request) assert "request" == (await ws.receive_str()) await ws.send_str("reply") begin = ws._loop.time() assert await ws.close() elapsed = ws._loop.time() - begin assert ws.close_code == WSCloseCode.ABNORMAL_CLOSURE assert isinstance(ws.exception(), asyncio.TimeoutError) aborted.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") await ws.send_str("request") assert "reply" == (await ws.receive_str()) # The server closes here. Then the client sends bogus messages with an # interval shorter than server-side close timeout, to make the server # hanging indefinitely. await asyncio.sleep(0.08) msg = await ws._reader.read() assert msg.type == WSMsgType.CLOSE await asyncio.sleep(0.08) assert await aborted assert elapsed < 0.25, "close() should have returned before " "at most 2x timeout." await ws.close() async def test_concurrent_close(loop, aiohttp_client) -> None: srv_ws = None async def handler(request): nonlocal srv_ws ws = srv_ws = web.WebSocketResponse(autoclose=False, protocols=("foo", "bar")) await ws.prepare(request) msg = await ws.receive() assert msg.type == WSMsgType.CLOSING msg = await ws.receive() assert msg.type == WSMsgType.CLOSING await asyncio.sleep(0) msg = await ws.receive() assert msg.type == WSMsgType.CLOSED return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoclose=False, protocols=("eggs", "bar")) await srv_ws.close(code=WSCloseCode.INVALID_TEXT) msg = await ws.receive() assert msg.type == WSMsgType.CLOSE await asyncio.sleep(0) msg = await ws.receive() assert msg.type == WSMsgType.CLOSED async def test_close_op_code_from_client(loop: Any, aiohttp_client: Any) -> None: srv_ws: Optional[web.WebSocketResponse] = None async def handler(request): nonlocal srv_ws ws = srv_ws = web.WebSocketResponse(protocols=("foo", "bar")) await ws.prepare(request) msg = await ws.receive() assert msg.type == WSMsgType.CLOSE await asyncio.sleep(0) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws: web.WebSocketResponse = await client.ws_connect("/", protocols=("eggs", "bar")) await ws._writer._send_frame(b"", WSMsgType.CLOSE) msg = await ws.receive() assert msg.type == WSMsgType.CLOSE await asyncio.sleep(0) msg = await ws.receive() assert msg.type == WSMsgType.CLOSED async def test_auto_pong_with_closing_by_peer(loop: Any, aiohttp_client: Any) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive() msg = await ws.receive() assert msg.type == WSMsgType.CLOSE assert msg.data == WSCloseCode.OK assert msg.extra == "exit message" closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoclose=False, autoping=False) await ws.ping() await ws.send_str("ask") msg = await ws.receive() assert msg.type == WSMsgType.PONG await ws.close(code=WSCloseCode.OK, message="exit message") await closed async def test_ping(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.ping("data") await ws.receive() closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoping=False) msg = await ws.receive() assert msg.type == WSMsgType.PING assert msg.data == b"data" await ws.pong() await ws.close() await closed async def aiohttp_client_ping(loop, aiohttp_client): closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive() closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoping=False) await ws.ping("data") msg = await ws.receive() assert msg.type == WSMsgType.PONG assert msg.data == b"data" await ws.pong() await ws.close() async def test_pong(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse(autoping=False) await ws.prepare(request) msg = await ws.receive() assert msg.type == WSMsgType.PING await ws.pong("data") msg = await ws.receive() assert msg.type == WSMsgType.CLOSE assert msg.data == WSCloseCode.OK assert msg.extra == "exit message" closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoping=False) await ws.ping("data") msg = await ws.receive() assert msg.type == WSMsgType.PONG assert msg.data == b"data" await ws.close(code=WSCloseCode.OK, message="exit message") await closed async def test_change_status(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() ws.set_status(200) assert 200 == ws.status await ws.prepare(request) assert 101 == ws.status await ws.close() closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoping=False) await ws.close() await closed await ws.close() async def test_handle_protocol(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse(protocols=("foo", "bar")) await ws.prepare(request) await ws.close() assert "bar" == ws.ws_protocol closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", protocols=("eggs", "bar")) await ws.close() await closed async def test_server_close_handshake(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse(protocols=("foo", "bar")) await ws.prepare(request) await ws.close() closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoclose=False, protocols=("eggs", "bar")) msg = await ws.receive() assert msg.type == WSMsgType.CLOSE await ws.close() await closed async def aiohttp_client_close_handshake(loop, aiohttp_client): closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse(autoclose=False, protocols=("foo", "bar")) await ws.prepare(request) msg = await ws.receive() assert msg.type == WSMsgType.CLOSE assert not ws.closed await ws.close() assert ws.closed assert ws.close_code == WSCloseCode.INVALID_TEXT msg = await ws.receive() assert msg.type == WSMsgType.CLOSED closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoclose=False, protocols=("eggs", "bar")) await ws.close(code=WSCloseCode.INVALID_TEXT) msg = await ws.receive() assert msg.type == WSMsgType.CLOSED await closed async def test_server_close_handshake_server_eats_client_messages(loop, aiohttp_client): closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse(protocols=("foo", "bar")) await ws.prepare(request) await ws.close() closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect( "/", autoclose=False, autoping=False, protocols=("eggs", "bar") ) msg = await ws.receive() assert msg.type == WSMsgType.CLOSE await ws.send_str("text") await ws.send_bytes(b"bytes") await ws.ping() await ws.close() await closed async def test_receive_timeout(loop, aiohttp_client) -> None: raised = False async def handler(request): ws = web.WebSocketResponse(receive_timeout=0.1) await ws.prepare(request) try: await ws.receive() except asyncio.TimeoutError: nonlocal raised raised = True await ws.close() return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") await ws.receive() await ws.close() assert raised async def test_custom_receive_timeout(loop, aiohttp_client) -> None: raised = False async def handler(request): ws = web.WebSocketResponse(receive_timeout=None) await ws.prepare(request) try: await ws.receive(0.1) except asyncio.TimeoutError: nonlocal raised raised = True await ws.close() return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") await ws.receive() await ws.close() assert raised async def test_heartbeat(loop, aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse(heartbeat=0.05) await ws.prepare(request) await ws.receive() await ws.close() return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoping=False) msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.ping await ws.close() async def test_heartbeat_no_pong(loop, aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse(heartbeat=0.05) await ws.prepare(request) await ws.receive() return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoping=False) msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.ping await ws.close() async def test_server_ws_async_for(loop, aiohttp_server) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) async for msg in ws: assert msg.type == aiohttp.WSMsgType.TEXT s = msg.data await ws.send_str(s + "/answer") await ws.close() closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as sm: async with sm.ws_connect(server.make_url("/")) as resp: items = ["q1", "q2", "q3"] for item in items: await resp.send_str(item) msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.TEXT assert item + "/answer" == msg.data await resp.close() await closed async def test_closed_async_for(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) messages = [] async for msg in ws: messages.append(msg) if "stop" == msg.data: await ws.send_str("stopping") await ws.close() assert 1 == len(messages) assert messages[0].type == WSMsgType.TEXT assert messages[0].data == "stop" closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") await ws.send_str("stop") msg = await ws.receive() assert msg.type == WSMsgType.TEXT assert msg.data == "stopping" await ws.close() await closed async def test_websocket_disable_keepalive(loop, aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() if not ws.can_prepare(request): return web.Response(text="OK") assert request.protocol._keepalive await ws.prepare(request) assert not request.protocol._keepalive assert not request.protocol._keepalive_handle await ws.send_str("OK") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") txt = await resp.text() assert txt == "OK" ws = await client.ws_connect("/") data = await ws.receive_str() assert data == "OK" async def test_bug3380(loop, aiohttp_client) -> None: async def handle_null(request): return aiohttp.web.json_response({"err": None}) async def ws_handler(request): return web.Response(status=401) app = web.Application() app.router.add_route("GET", "/ws", ws_handler) app.router.add_route("GET", "/api/null", handle_null) client = await aiohttp_client(app) resp = await client.get("/api/null") assert (await resp.json()) == {"err": None} resp.close() with pytest.raises(aiohttp.WSServerHandshakeError): await client.ws_connect("/ws") resp = await client.get("/api/null", timeout=1) assert (await resp.json()) == {"err": None} resp.close() async def test_receive_being_cancelled_keeps_connection_open( loop: Any, aiohttp_client: Any ) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse(autoping=False) await ws.prepare(request) task = asyncio.create_task(ws.receive()) await asyncio.sleep(0) task.cancel() with contextlib.suppress(asyncio.CancelledError): await task msg = await ws.receive() assert msg.type == WSMsgType.PING await asyncio.sleep(0) await ws.pong("data") msg = await ws.receive() assert msg.type == WSMsgType.CLOSE assert msg.data == WSCloseCode.OK assert msg.extra == "exit message" closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoping=False) await asyncio.sleep(0) await ws.ping("data") msg = await ws.receive() assert msg.type == WSMsgType.PONG assert msg.data == b"data" await ws.close(code=WSCloseCode.OK, message="exit message") await closed async def test_receive_timeout_keeps_connection_open( loop: Any, aiohttp_client: Any ) -> None: closed = loop.create_future() timed_out = loop.create_future() async def handler(request): ws = web.WebSocketResponse(autoping=False) await ws.prepare(request) task = asyncio.create_task(ws.receive(sys.float_info.min)) with contextlib.suppress(asyncio.TimeoutError): await task timed_out.set_result(None) msg = await ws.receive() assert msg.type == WSMsgType.PING await asyncio.sleep(0) await ws.pong("data") msg = await ws.receive() assert msg.type == WSMsgType.CLOSE assert msg.data == WSCloseCode.OK assert msg.extra == "exit message" closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoping=False) await timed_out await ws.ping("data") msg = await ws.receive() assert msg.type == WSMsgType.PONG assert msg.data == b"data" await ws.close(code=WSCloseCode.OK, message="exit message") await closed ����������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285814.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/tests/test_websocket_handshake.py�����������������������������������������������������0000644�0001751�0000177�00000020131�14607525266�021366� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Tests for http/websocket.py import base64 import os import pytest from aiohttp import web from aiohttp.test_utils import make_mocked_request def gen_ws_headers( protocols="", compress=0, extension_text="", server_notakeover=False, client_notakeover=False, ): key = base64.b64encode(os.urandom(16)).decode() hdrs = [ ("Upgrade", "websocket"), ("Connection", "upgrade"), ("Sec-Websocket-Version", "13"), ("Sec-Websocket-Key", key), ] if protocols: hdrs += [("Sec-Websocket-Protocol", protocols)] if compress: params = "permessage-deflate" if compress < 15: params += "; server_max_window_bits=" + str(compress) if server_notakeover: params += "; server_no_context_takeover" if client_notakeover: params += "; client_no_context_takeover" if extension_text: params += "; " + extension_text hdrs += [("Sec-Websocket-Extensions", params)] return hdrs, key async def test_no_upgrade() -> None: ws = web.WebSocketResponse() req = make_mocked_request("GET", "/") with pytest.raises(web.HTTPBadRequest): await ws.prepare(req) async def test_no_connection() -> None: ws = web.WebSocketResponse() req = make_mocked_request( "GET", "/", headers={"Upgrade": "websocket", "Connection": "keep-alive"} ) with pytest.raises(web.HTTPBadRequest): await ws.prepare(req) async def test_protocol_version_unset() -> None: ws = web.WebSocketResponse() req = make_mocked_request( "GET", "/", headers={"Upgrade": "websocket", "Connection": "upgrade"} ) with pytest.raises(web.HTTPBadRequest): await ws.prepare(req) async def test_protocol_version_not_supported() -> None: ws = web.WebSocketResponse() req = make_mocked_request( "GET", "/", headers={ "Upgrade": "websocket", "Connection": "upgrade", "Sec-Websocket-Version": "1", }, ) with pytest.raises(web.HTTPBadRequest): await ws.prepare(req) async def test_protocol_key_not_present() -> None: ws = web.WebSocketResponse() req = make_mocked_request( "GET", "/", headers={ "Upgrade": "websocket", "Connection": "upgrade", "Sec-Websocket-Version": "13", }, ) with pytest.raises(web.HTTPBadRequest): await ws.prepare(req) async def test_protocol_key_invalid() -> None: ws = web.WebSocketResponse() req = make_mocked_request( "GET", "/", headers={ "Upgrade": "websocket", "Connection": "upgrade", "Sec-Websocket-Version": "13", "Sec-Websocket-Key": "123", }, ) with pytest.raises(web.HTTPBadRequest): await ws.prepare(req) async def test_protocol_key_bad_size() -> None: ws = web.WebSocketResponse() sec_key = base64.b64encode(os.urandom(2)) val = sec_key.decode() req = make_mocked_request( "GET", "/", headers={ "Upgrade": "websocket", "Connection": "upgrade", "Sec-Websocket-Version": "13", "Sec-Websocket-Key": val, }, ) with pytest.raises(web.HTTPBadRequest): await ws.prepare(req) async def test_handshake_ok() -> None: hdrs, sec_key = gen_ws_headers() ws = web.WebSocketResponse() req = make_mocked_request("GET", "/", headers=hdrs) await ws.prepare(req) assert ws.ws_protocol is None async def test_handshake_protocol() -> None: # Tests if one protocol is returned by handshake proto = "chat" ws = web.WebSocketResponse(protocols={"chat"}) req = make_mocked_request("GET", "/", headers=gen_ws_headers(proto)[0]) await ws.prepare(req) assert ws.ws_protocol == proto async def test_handshake_protocol_agreement() -> None: # Tests if the right protocol is selected given multiple best_proto = "worse_proto" wanted_protos = ["best", "chat", "worse_proto"] server_protos = "worse_proto,chat" ws = web.WebSocketResponse(protocols=wanted_protos) req = make_mocked_request("GET", "/", headers=gen_ws_headers(server_protos)[0]) await ws.prepare(req) assert ws.ws_protocol == best_proto async def test_handshake_protocol_unsupported(caplog) -> None: # Tests if a protocol mismatch handshake warns and returns None proto = "chat" req = make_mocked_request("GET", "/", headers=gen_ws_headers("test")[0]) ws = web.WebSocketResponse(protocols=[proto]) await ws.prepare(req) assert ( caplog.records[-1].msg == "Client protocols %r don’t overlap server-known ones %r" ) assert ws.ws_protocol is None async def test_handshake_compress() -> None: hdrs, sec_key = gen_ws_headers(compress=15) req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() await ws.prepare(req) assert ws.compress == 15 def test_handshake_compress_server_notakeover() -> None: hdrs, sec_key = gen_ws_headers(compress=15, server_notakeover=True) req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() headers, _, compress, notakeover = ws._handshake(req) assert compress == 15 assert notakeover is True assert "Sec-Websocket-Extensions" in headers assert headers["Sec-Websocket-Extensions"] == ( "permessage-deflate; server_no_context_takeover" ) def test_handshake_compress_client_notakeover() -> None: hdrs, sec_key = gen_ws_headers(compress=15, client_notakeover=True) req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() headers, _, compress, notakeover = ws._handshake(req) assert "Sec-Websocket-Extensions" in headers assert headers["Sec-Websocket-Extensions"] == ("permessage-deflate"), hdrs assert compress == 15 def test_handshake_compress_wbits() -> None: hdrs, sec_key = gen_ws_headers(compress=9) req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() headers, _, compress, notakeover = ws._handshake(req) assert "Sec-Websocket-Extensions" in headers assert headers["Sec-Websocket-Extensions"] == ( "permessage-deflate; server_max_window_bits=9" ) assert compress == 9 def test_handshake_compress_wbits_error() -> None: hdrs, sec_key = gen_ws_headers(compress=6) req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() headers, _, compress, notakeover = ws._handshake(req) assert "Sec-Websocket-Extensions" not in headers assert compress == 0 def test_handshake_compress_bad_ext() -> None: hdrs, sec_key = gen_ws_headers(compress=15, extension_text="bad") req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() headers, _, compress, notakeover = ws._handshake(req) assert "Sec-Websocket-Extensions" not in headers assert compress == 0 def test_handshake_compress_multi_ext_bad() -> None: hdrs, sec_key = gen_ws_headers( compress=15, extension_text="bad, permessage-deflate" ) req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() headers, _, compress, notakeover = ws._handshake(req) assert "Sec-Websocket-Extensions" in headers assert headers["Sec-Websocket-Extensions"] == "permessage-deflate" def test_handshake_compress_multi_ext_wbits() -> None: hdrs, sec_key = gen_ws_headers(compress=6, extension_text=", permessage-deflate") req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() headers, _, compress, notakeover = ws._handshake(req) assert "Sec-Websocket-Extensions" in headers assert headers["Sec-Websocket-Extensions"] == "permessage-deflate" assert compress == 15 def test_handshake_no_transfer_encoding() -> None: hdrs, sec_key = gen_ws_headers() req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() headers, _, compress, notakeover = ws._handshake(req) assert "Transfer-Encoding" not in headers ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285814.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/tests/test_websocket_parser.py��������������������������������������������������������0000644�0001751�0000177�00000040162�14607525266�020742� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import pickle import random import struct import zlib from unittest import mock import pytest import aiohttp from aiohttp import http_websocket from aiohttp.http import WebSocketError, WSCloseCode, WSMessage, WSMsgType from aiohttp.http_websocket import ( _WS_DEFLATE_TRAILING, PACK_CLOSE_CODE, PACK_LEN1, PACK_LEN2, PACK_LEN3, WebSocketReader, _websocket_mask, ) def build_frame( message, opcode, use_mask=False, noheader=False, is_fin=True, compress=False ): # Send a frame over the websocket with message as its payload. if compress: compressobj = zlib.compressobj(wbits=-9) message = compressobj.compress(message) message = message + compressobj.flush(zlib.Z_SYNC_FLUSH) if message.endswith(_WS_DEFLATE_TRAILING): message = message[:-4] msg_length = len(message) if use_mask: # pragma: no cover mask_bit = 0x80 else: mask_bit = 0 if is_fin: header_first_byte = 0x80 | opcode else: header_first_byte = opcode if compress: header_first_byte |= 0x40 if msg_length < 126: header = PACK_LEN1(header_first_byte, msg_length | mask_bit) elif msg_length < (1 << 16): # pragma: no cover header = PACK_LEN2(header_first_byte, 126 | mask_bit, msg_length) else: header = PACK_LEN3(header_first_byte, 127 | mask_bit, msg_length) if use_mask: # pragma: no cover mask = random.randrange(0, 0xFFFFFFFF) mask = mask.to_bytes(4, "big") message = bytearray(message) _websocket_mask(mask, message) if noheader: return message else: return header + mask + message else: if noheader: return message else: return header + message def build_close_frame(code=1000, message=b"", noheader=False): # Close the websocket, sending the specified code and message. if isinstance(message, str): # pragma: no cover message = message.encode("utf-8") return build_frame( PACK_CLOSE_CODE(code) + message, opcode=WSMsgType.CLOSE, noheader=noheader ) @pytest.fixture() def out(loop): return aiohttp.DataQueue(loop) @pytest.fixture() def parser(out): return WebSocketReader(out, 4 * 1024 * 1024) def test_parse_frame(parser) -> None: parser.parse_frame(struct.pack("!BB", 0b00000001, 0b00000001)) res = parser.parse_frame(b"1") fin, opcode, payload, compress = res[0] assert (0, 1, b"1", False) == (fin, opcode, payload, not not compress) def test_parse_frame_length0(parser) -> None: fin, opcode, payload, compress = parser.parse_frame( struct.pack("!BB", 0b00000001, 0b00000000) )[0] assert (0, 1, b"", False) == (fin, opcode, payload, not not compress) def test_parse_frame_length2(parser) -> None: parser.parse_frame(struct.pack("!BB", 0b00000001, 126)) parser.parse_frame(struct.pack("!H", 4)) res = parser.parse_frame(b"1234") fin, opcode, payload, compress = res[0] assert (0, 1, b"1234", False) == (fin, opcode, payload, not not compress) def test_parse_frame_length4(parser) -> None: parser.parse_frame(struct.pack("!BB", 0b00000001, 127)) parser.parse_frame(struct.pack("!Q", 4)) fin, opcode, payload, compress = parser.parse_frame(b"1234")[0] assert (0, 1, b"1234", False) == (fin, opcode, payload, not not compress) def test_parse_frame_mask(parser) -> None: parser.parse_frame(struct.pack("!BB", 0b00000001, 0b10000001)) parser.parse_frame(b"0001") fin, opcode, payload, compress = parser.parse_frame(b"1")[0] assert (0, 1, b"\x01", False) == (fin, opcode, payload, not not compress) def test_parse_frame_header_reversed_bits(out, parser) -> None: with pytest.raises(WebSocketError): parser.parse_frame(struct.pack("!BB", 0b01100000, 0b00000000)) raise out.exception() def test_parse_frame_header_control_frame(out, parser) -> None: with pytest.raises(WebSocketError): parser.parse_frame(struct.pack("!BB", 0b00001000, 0b00000000)) raise out.exception() def _test_parse_frame_header_new_data_err(out, parser): with pytest.raises(WebSocketError): parser.parse_frame(struct.pack("!BB", 0b000000000, 0b00000000)) raise out.exception() def test_parse_frame_header_payload_size(out, parser) -> None: with pytest.raises(WebSocketError): parser.parse_frame(struct.pack("!BB", 0b10001000, 0b01111110)) raise out.exception() def test_ping_frame(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [(1, WSMsgType.PING, b"data", False)] parser.feed_data(b"") res = out._buffer[0] assert res == ((WSMsgType.PING, b"data", ""), 4) def test_pong_frame(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [(1, WSMsgType.PONG, b"data", False)] parser.feed_data(b"") res = out._buffer[0] assert res == ((WSMsgType.PONG, b"data", ""), 4) def test_close_frame(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [(1, WSMsgType.CLOSE, b"", False)] parser.feed_data(b"") res = out._buffer[0] assert res == ((WSMsgType.CLOSE, 0, ""), 0) def test_close_frame_info(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [(1, WSMsgType.CLOSE, b"0112345", False)] parser.feed_data(b"") res = out._buffer[0] assert res == (WSMessage(WSMsgType.CLOSE, 12337, "12345"), 0) def test_close_frame_invalid(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [(1, WSMsgType.CLOSE, b"1", False)] parser.feed_data(b"") assert isinstance(out.exception(), WebSocketError) assert out.exception().code == WSCloseCode.PROTOCOL_ERROR def test_close_frame_invalid_2(out, parser) -> None: data = build_close_frame(code=1) with pytest.raises(WebSocketError) as ctx: parser._feed_data(data) assert ctx.value.code == WSCloseCode.PROTOCOL_ERROR def test_close_frame_unicode_err(parser) -> None: data = build_close_frame(code=1000, message=b"\xf4\x90\x80\x80") with pytest.raises(WebSocketError) as ctx: parser._feed_data(data) assert ctx.value.code == WSCloseCode.INVALID_TEXT def test_unknown_frame(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [(1, WSMsgType.CONTINUATION, b"", False)] with pytest.raises(WebSocketError): parser.feed_data(b"") raise out.exception() def test_simple_text(out, parser) -> None: data = build_frame(b"text", WSMsgType.TEXT) parser._feed_data(data) res = out._buffer[0] assert res == ((WSMsgType.TEXT, "text", ""), 4) def test_simple_text_unicode_err(parser) -> None: data = build_frame(b"\xf4\x90\x80\x80", WSMsgType.TEXT) with pytest.raises(WebSocketError) as ctx: parser._feed_data(data) assert ctx.value.code == WSCloseCode.INVALID_TEXT def test_simple_binary(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [(1, WSMsgType.BINARY, b"binary", False)] parser.feed_data(b"") res = out._buffer[0] assert res == ((WSMsgType.BINARY, b"binary", ""), 6) def test_fragmentation_header(out, parser) -> None: data = build_frame(b"a", WSMsgType.TEXT) parser._feed_data(data[:1]) parser._feed_data(data[1:]) res = out._buffer[0] assert res == (WSMessage(WSMsgType.TEXT, "a", ""), 1) def test_continuation(out, parser) -> None: data1 = build_frame(b"line1", WSMsgType.TEXT, is_fin=False) parser._feed_data(data1) data2 = build_frame(b"line2", WSMsgType.CONTINUATION) parser._feed_data(data2) res = out._buffer[0] assert res == (WSMessage(WSMsgType.TEXT, "line1line2", ""), 10) def test_continuation_with_ping(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [ (0, WSMsgType.TEXT, b"line1", False), (0, WSMsgType.PING, b"", False), (1, WSMsgType.CONTINUATION, b"line2", False), ] data1 = build_frame(b"line1", WSMsgType.TEXT, is_fin=False) parser._feed_data(data1) data2 = build_frame(b"", WSMsgType.PING) parser._feed_data(data2) data3 = build_frame(b"line2", WSMsgType.CONTINUATION) parser._feed_data(data3) res = out._buffer[0] assert res == (WSMessage(WSMsgType.PING, b"", ""), 0) res = out._buffer[1] assert res == (WSMessage(WSMsgType.TEXT, "line1line2", ""), 10) def test_continuation_err(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [ (0, WSMsgType.TEXT, b"line1", False), (1, WSMsgType.TEXT, b"line2", False), ] with pytest.raises(WebSocketError): parser._feed_data(b"") def test_continuation_with_close(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [ (0, WSMsgType.TEXT, b"line1", False), (0, WSMsgType.CLOSE, build_close_frame(1002, b"test", noheader=True), False), (1, WSMsgType.CONTINUATION, b"line2", False), ] parser.feed_data(b"") res = out._buffer[0] assert res, (WSMessage(WSMsgType.CLOSE, 1002, "test"), 0) res = out._buffer[1] assert res == (WSMessage(WSMsgType.TEXT, "line1line2", ""), 10) def test_continuation_with_close_unicode_err(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [ (0, WSMsgType.TEXT, b"line1", False), ( 0, WSMsgType.CLOSE, build_close_frame(1000, b"\xf4\x90\x80\x80", noheader=True), False, ), (1, WSMsgType.CONTINUATION, b"line2", False), ] with pytest.raises(WebSocketError) as ctx: parser._feed_data(b"") assert ctx.value.code == WSCloseCode.INVALID_TEXT def test_continuation_with_close_bad_code(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [ (0, WSMsgType.TEXT, b"line1", False), (0, WSMsgType.CLOSE, build_close_frame(1, b"test", noheader=True), False), (1, WSMsgType.CONTINUATION, b"line2", False), ] with pytest.raises(WebSocketError) as ctx: parser._feed_data(b"") assert ctx.value.code == WSCloseCode.PROTOCOL_ERROR def test_continuation_with_close_bad_payload(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [ (0, WSMsgType.TEXT, b"line1", False), (0, WSMsgType.CLOSE, b"1", False), (1, WSMsgType.CONTINUATION, b"line2", False), ] with pytest.raises(WebSocketError) as ctx: parser._feed_data(b"") assert ctx.value.code, WSCloseCode.PROTOCOL_ERROR def test_continuation_with_close_empty(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [ (0, WSMsgType.TEXT, b"line1", False), (0, WSMsgType.CLOSE, b"", False), (1, WSMsgType.CONTINUATION, b"line2", False), ] parser.feed_data(b"") res = out._buffer[0] assert res, (WSMessage(WSMsgType.CLOSE, 0, ""), 0) res = out._buffer[1] assert res == (WSMessage(WSMsgType.TEXT, "line1line2", ""), 10) websocket_mask_data = b"some very long data for masking by websocket" websocket_mask_mask = b"1234" websocket_mask_masked = ( b"B]^Q\x11DVFH\x12_[_U\x13PPFR\x14W]A\x14\\S@_X" b"\\T\x14SK\x13CTP@[RYV@" ) def test_websocket_mask_python() -> None: message = bytearray(websocket_mask_data) http_websocket._websocket_mask_python(websocket_mask_mask, message) assert message == websocket_mask_masked @pytest.mark.skipif( not hasattr(http_websocket, "_websocket_mask_cython"), reason="Requires Cython" ) def test_websocket_mask_cython() -> None: message = bytearray(websocket_mask_data) http_websocket._websocket_mask_cython(websocket_mask_mask, message) assert message == websocket_mask_masked def test_websocket_mask_python_empty() -> None: message = bytearray() http_websocket._websocket_mask_python(websocket_mask_mask, message) assert message == bytearray() @pytest.mark.skipif( not hasattr(http_websocket, "_websocket_mask_cython"), reason="Requires Cython" ) def test_websocket_mask_cython_empty() -> None: message = bytearray() http_websocket._websocket_mask_cython(websocket_mask_mask, message) assert message == bytearray() def test_msgtype_aliases() -> None: assert aiohttp.WSMsgType.TEXT == aiohttp.WSMsgType.text assert aiohttp.WSMsgType.BINARY == aiohttp.WSMsgType.binary assert aiohttp.WSMsgType.PING == aiohttp.WSMsgType.ping assert aiohttp.WSMsgType.PONG == aiohttp.WSMsgType.pong assert aiohttp.WSMsgType.CLOSE == aiohttp.WSMsgType.close assert aiohttp.WSMsgType.CLOSED == aiohttp.WSMsgType.closed assert aiohttp.WSMsgType.ERROR == aiohttp.WSMsgType.error def test_parse_compress_frame_single(parser) -> None: parser.parse_frame(struct.pack("!BB", 0b11000001, 0b00000001)) res = parser.parse_frame(b"1") fin, opcode, payload, compress = res[0] assert (1, 1, b"1", True) == (fin, opcode, payload, not not compress) def test_parse_compress_frame_multi(parser) -> None: parser.parse_frame(struct.pack("!BB", 0b01000001, 126)) parser.parse_frame(struct.pack("!H", 4)) res = parser.parse_frame(b"1234") fin, opcode, payload, compress = res[0] assert (0, 1, b"1234", True) == (fin, opcode, payload, not not compress) parser.parse_frame(struct.pack("!BB", 0b10000001, 126)) parser.parse_frame(struct.pack("!H", 4)) res = parser.parse_frame(b"1234") fin, opcode, payload, compress = res[0] assert (1, 1, b"1234", True) == (fin, opcode, payload, not not compress) parser.parse_frame(struct.pack("!BB", 0b10000001, 126)) parser.parse_frame(struct.pack("!H", 4)) res = parser.parse_frame(b"1234") fin, opcode, payload, compress = res[0] assert (1, 1, b"1234", False) == (fin, opcode, payload, not not compress) def test_parse_compress_error_frame(parser) -> None: parser.parse_frame(struct.pack("!BB", 0b01000001, 0b00000001)) parser.parse_frame(b"1") with pytest.raises(WebSocketError) as ctx: parser.parse_frame(struct.pack("!BB", 0b11000001, 0b00000001)) parser.parse_frame(b"1") assert ctx.value.code == WSCloseCode.PROTOCOL_ERROR def test_parse_no_compress_frame_single() -> None: parser_no_compress = WebSocketReader(out, 0, compress=False) with pytest.raises(WebSocketError) as ctx: parser_no_compress.parse_frame(struct.pack("!BB", 0b11000001, 0b00000001)) parser_no_compress.parse_frame(b"1") assert ctx.value.code == WSCloseCode.PROTOCOL_ERROR def test_msg_too_large(out) -> None: parser = WebSocketReader(out, 256, compress=False) data = build_frame(b"text" * 256, WSMsgType.TEXT) with pytest.raises(WebSocketError) as ctx: parser._feed_data(data) assert ctx.value.code == WSCloseCode.MESSAGE_TOO_BIG def test_msg_too_large_not_fin(out) -> None: parser = WebSocketReader(out, 256, compress=False) data = build_frame(b"text" * 256, WSMsgType.TEXT, is_fin=False) with pytest.raises(WebSocketError) as ctx: parser._feed_data(data) assert ctx.value.code == WSCloseCode.MESSAGE_TOO_BIG def test_compressed_msg_too_large(out) -> None: parser = WebSocketReader(out, 256, compress=True) data = build_frame(b"aaa" * 256, WSMsgType.TEXT, compress=True) with pytest.raises(WebSocketError) as ctx: parser._feed_data(data) assert ctx.value.code == WSCloseCode.MESSAGE_TOO_BIG class TestWebSocketError: def test_ctor(self) -> None: err = WebSocketError(WSCloseCode.PROTOCOL_ERROR, "Something invalid") assert err.code == WSCloseCode.PROTOCOL_ERROR assert str(err) == "Something invalid" def test_pickle(self) -> None: err = WebSocketError(WSCloseCode.PROTOCOL_ERROR, "Something invalid") err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.code == WSCloseCode.PROTOCOL_ERROR assert str(err2) == "Something invalid" assert err2.foo == "bar" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285814.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/tests/test_websocket_writer.py��������������������������������������������������������0000644�0001751�0000177�00000013051�14607525266�020757� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import asyncio import random from typing import Any, Callable from unittest import mock import pytest from aiohttp import DataQueue, WSMessage from aiohttp.http import WebSocketReader, WebSocketWriter from aiohttp.test_utils import make_mocked_coro @pytest.fixture def protocol(): ret = mock.Mock() ret._drain_helper = make_mocked_coro() return ret @pytest.fixture def transport(): ret = mock.Mock() ret.is_closing.return_value = False return ret @pytest.fixture def writer(protocol, transport): return WebSocketWriter(protocol, transport, use_mask=False) async def test_pong(writer) -> None: await writer.pong() writer.transport.write.assert_called_with(b"\x8a\x00") async def test_ping(writer) -> None: await writer.ping() writer.transport.write.assert_called_with(b"\x89\x00") async def test_send_text(writer) -> None: await writer.send(b"text") writer.transport.write.assert_called_with(b"\x81\x04text") async def test_send_binary(writer) -> None: await writer.send("binary", True) writer.transport.write.assert_called_with(b"\x82\x06binary") async def test_send_binary_long(writer) -> None: await writer.send(b"b" * 127, True) assert writer.transport.write.call_args[0][0].startswith(b"\x82~\x00\x7fb") async def test_send_binary_very_long(writer) -> None: await writer.send(b"b" * 65537, True) assert ( writer.transport.write.call_args_list[0][0][0] == b"\x82\x7f\x00\x00\x00\x00\x00\x01\x00\x01" ) assert writer.transport.write.call_args_list[1][0][0] == b"b" * 65537 async def test_close(writer) -> None: await writer.close(1001, "msg") writer.transport.write.assert_called_with(b"\x88\x05\x03\xe9msg") await writer.close(1001, b"msg") writer.transport.write.assert_called_with(b"\x88\x05\x03\xe9msg") # Test that Service Restart close code is also supported await writer.close(1012, b"msg") writer.transport.write.assert_called_with(b"\x88\x05\x03\xf4msg") async def test_send_text_masked(protocol, transport) -> None: writer = WebSocketWriter( protocol, transport, use_mask=True, random=random.Random(123) ) await writer.send(b"text") writer.transport.write.assert_called_with(b"\x81\x84\rg\xb3fy\x02\xcb\x12") async def test_send_compress_text(protocol, transport) -> None: writer = WebSocketWriter(protocol, transport, compress=15) await writer.send(b"text") writer.transport.write.assert_called_with(b"\xc1\x06*I\xad(\x01\x00") await writer.send(b"text") writer.transport.write.assert_called_with(b"\xc1\x05*\x01b\x00\x00") async def test_send_compress_text_notakeover(protocol, transport) -> None: writer = WebSocketWriter(protocol, transport, compress=15, notakeover=True) await writer.send(b"text") writer.transport.write.assert_called_with(b"\xc1\x06*I\xad(\x01\x00") await writer.send(b"text") writer.transport.write.assert_called_with(b"\xc1\x06*I\xad(\x01\x00") async def test_send_compress_text_per_message(protocol, transport) -> None: writer = WebSocketWriter(protocol, transport) await writer.send(b"text", compress=15) writer.transport.write.assert_called_with(b"\xc1\x06*I\xad(\x01\x00") await writer.send(b"text") writer.transport.write.assert_called_with(b"\x81\x04text") await writer.send(b"text", compress=15) writer.transport.write.assert_called_with(b"\xc1\x06*I\xad(\x01\x00") @pytest.mark.parametrize( ("max_sync_chunk_size", "payload_point_generator"), ( (16, lambda count: count), (4096, lambda count: count), (32, lambda count: 64 + count if count % 2 else count), ), ) async def test_concurrent_messages( protocol: Any, transport: Any, max_sync_chunk_size: int, payload_point_generator: Callable[[int], int], ) -> None: """Ensure messages are compressed correctly when there are multiple concurrent writers. This test generates is parametrized to - Generate messages that are larger than patch WEBSOCKET_MAX_SYNC_CHUNK_SIZE of 16 where compression will run in the executor - Generate messages that are smaller than patch WEBSOCKET_MAX_SYNC_CHUNK_SIZE of 4096 where compression will run in the event loop - Interleave generated messages with a WEBSOCKET_MAX_SYNC_CHUNK_SIZE of 32 where compression will run in the event loop and in the executor """ with mock.patch( "aiohttp.http_websocket.WEBSOCKET_MAX_SYNC_CHUNK_SIZE", max_sync_chunk_size ): writer = WebSocketWriter(protocol, transport, compress=15) queue: DataQueue[WSMessage] = DataQueue(asyncio.get_running_loop()) reader = WebSocketReader(queue, 50000) writers = [] payloads = [] for count in range(1, 64 + 1): point = payload_point_generator(count) payload = bytes((point,)) * point payloads.append(payload) writers.append(writer.send(payload, binary=True)) await asyncio.gather(*writers) for call in writer.transport.write.call_args_list: call_bytes = call[0][0] result, _ = reader.feed_data(call_bytes) assert result is False msg = await queue.read() bytes_data: bytes = msg.data first_char = bytes_data[0:1] char_val = ord(first_char) assert len(bytes_data) == char_val # If we have a concurrency problem, the data # tends to get mixed up between messages so # we want to validate that all the bytes are # the same value assert bytes_data == bytes_data[0:1] * char_val ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285814.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/tests/test_worker.py������������������������������������������������������������������0000644�0001751�0000177�00000021120�14607525266�016702� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Tests for aiohttp/worker.py import asyncio import os import socket import ssl from typing import TYPE_CHECKING, Callable, Dict, Optional from unittest import mock import pytest from _pytest.fixtures import SubRequest from aiohttp import web if TYPE_CHECKING: from aiohttp import worker as base_worker else: base_worker = pytest.importorskip("aiohttp.worker") try: import uvloop except ImportError: uvloop = None # type: ignore[assignment] WRONG_LOG_FORMAT = '%a "%{Referrer}i" %(h)s %(l)s %s' ACCEPTABLE_LOG_FORMAT = '%a "%{Referrer}i" %s' class BaseTestWorker: def __init__(self) -> None: self.servers: Dict[object, object] = {} self.exit_code = 0 self._notify_waiter: Optional[asyncio.Future[bool]] = None self.cfg = mock.Mock() self.cfg.graceful_timeout = 100 self.pid = "pid" self.wsgi = web.Application() class AsyncioWorker(BaseTestWorker, base_worker.GunicornWebWorker): # type: ignore pass PARAMS = [AsyncioWorker] if uvloop is not None: class UvloopWorker( BaseTestWorker, base_worker.GunicornUVLoopWebWorker # type: ignore ): pass PARAMS.append(UvloopWorker) @pytest.fixture(params=PARAMS) def worker( request: SubRequest, loop: asyncio.AbstractEventLoop ) -> base_worker.GunicornWebWorker: asyncio.set_event_loop(loop) ret = request.param() ret.notify = mock.Mock() return ret # type: ignore[no-any-return] def test_init_process(worker: base_worker.GunicornWebWorker) -> None: with mock.patch("aiohttp.worker.asyncio") as m_asyncio: try: worker.init_process() except TypeError: pass assert m_asyncio.get_event_loop.return_value.close.called assert m_asyncio.new_event_loop.called assert m_asyncio.set_event_loop.called def test_run( worker: base_worker.GunicornWebWorker, loop: asyncio.AbstractEventLoop ) -> None: worker.log = mock.Mock() worker.cfg = mock.Mock() worker.cfg.access_log_format = ACCEPTABLE_LOG_FORMAT worker.cfg.is_ssl = False worker.cfg.graceful_timeout = 100 worker.sockets = [] worker.loop = loop with pytest.raises(SystemExit): worker.run() worker.log.exception.assert_not_called() assert loop.is_closed() def test_run_async_factory( worker: base_worker.GunicornWebWorker, loop: asyncio.AbstractEventLoop ) -> None: worker.log = mock.Mock() worker.cfg = mock.Mock() worker.cfg.access_log_format = ACCEPTABLE_LOG_FORMAT worker.cfg.is_ssl = False worker.cfg.graceful_timeout = 100 worker.sockets = [] app = worker.wsgi async def make_app() -> web.Application: return app # type: ignore[no-any-return] worker.wsgi = make_app worker.loop = loop worker.alive = False with pytest.raises(SystemExit): worker.run() worker.log.exception.assert_not_called() assert loop.is_closed() def test_run_not_app( worker: base_worker.GunicornWebWorker, loop: asyncio.AbstractEventLoop ) -> None: worker.log = mock.Mock() worker.cfg = mock.Mock() worker.cfg.access_log_format = ACCEPTABLE_LOG_FORMAT worker.loop = loop worker.wsgi = "not-app" worker.alive = False with pytest.raises(SystemExit): worker.run() worker.log.exception.assert_called_with("Exception in gunicorn worker") assert loop.is_closed() def test_handle_abort(worker: base_worker.GunicornWebWorker) -> None: with mock.patch("aiohttp.worker.sys") as m_sys: worker.handle_abort(0, None) assert not worker.alive assert worker.exit_code == 1 m_sys.exit.assert_called_with(1) def test__wait_next_notify(worker: base_worker.GunicornWebWorker) -> None: worker.loop = mloop = mock.create_autospec(asyncio.AbstractEventLoop) with mock.patch.object(worker, "_notify_waiter_done", autospec=True): fut = worker._wait_next_notify() assert worker._notify_waiter == fut mloop.call_later.assert_called_with(1.0, worker._notify_waiter_done, fut) def test__notify_waiter_done(worker: base_worker.GunicornWebWorker) -> None: worker._notify_waiter = None worker._notify_waiter_done() assert worker._notify_waiter is None waiter = worker._notify_waiter = mock.Mock() worker._notify_waiter.done.return_value = False worker._notify_waiter_done() assert worker._notify_waiter is None waiter.set_result.assert_called_with(True) def test__notify_waiter_done_explicit_waiter( worker: base_worker.GunicornWebWorker, ) -> None: worker._notify_waiter = None assert worker._notify_waiter is None waiter = worker._notify_waiter = mock.Mock() waiter.done.return_value = False waiter2 = worker._notify_waiter = mock.Mock() worker._notify_waiter_done(waiter) assert worker._notify_waiter is waiter2 waiter.set_result.assert_called_with(True) assert not waiter2.set_result.called def test_init_signals(worker: base_worker.GunicornWebWorker) -> None: worker.loop = mock.Mock() worker.init_signals() assert worker.loop.add_signal_handler.called @pytest.mark.parametrize( "source,result", [ (ACCEPTABLE_LOG_FORMAT, ACCEPTABLE_LOG_FORMAT), ( AsyncioWorker.DEFAULT_GUNICORN_LOG_FORMAT, AsyncioWorker.DEFAULT_AIOHTTP_LOG_FORMAT, ), ], ) def test__get_valid_log_format_ok( worker: base_worker.GunicornWebWorker, source: str, result: str ) -> None: assert result == worker._get_valid_log_format(source) def test__get_valid_log_format_exc(worker: base_worker.GunicornWebWorker) -> None: with pytest.raises(ValueError) as exc: worker._get_valid_log_format(WRONG_LOG_FORMAT) assert "%(name)s" in str(exc.value) async def test__run_ok_parent_changed( worker: base_worker.GunicornWebWorker, loop: asyncio.AbstractEventLoop, aiohttp_unused_port: Callable[[], int], ) -> None: worker.ppid = 0 worker.alive = True sock = socket.socket() addr = ("localhost", aiohttp_unused_port()) sock.bind(addr) worker.sockets = [sock] worker.log = mock.Mock() worker.loop = loop worker.max_requests = 0 worker.cfg.access_log_format = ACCEPTABLE_LOG_FORMAT worker.cfg.is_ssl = False await worker._run() worker.notify.assert_called_with() worker.log.info.assert_called_with("Parent changed, shutting down: %s", worker) async def test__run_exc( worker: base_worker.GunicornWebWorker, loop: asyncio.AbstractEventLoop, aiohttp_unused_port: Callable[[], int], ) -> None: worker.ppid = os.getppid() worker.alive = True sock = socket.socket() addr = ("localhost", aiohttp_unused_port()) sock.bind(addr) worker.sockets = [sock] worker.log = mock.Mock() worker.loop = loop worker.max_requests = 0 worker.cfg.access_log_format = ACCEPTABLE_LOG_FORMAT worker.cfg.is_ssl = False def raiser() -> None: waiter = worker._notify_waiter worker.alive = False assert waiter is not None waiter.set_exception(RuntimeError()) loop.call_later(0.1, raiser) await worker._run() worker.notify.assert_called_with() def test__create_ssl_context_without_certs_and_ciphers( worker: base_worker.GunicornWebWorker, tls_certificate_pem_path: str, ) -> None: worker.cfg.ssl_version = ssl.PROTOCOL_TLS_CLIENT worker.cfg.cert_reqs = ssl.CERT_OPTIONAL worker.cfg.certfile = tls_certificate_pem_path worker.cfg.keyfile = tls_certificate_pem_path worker.cfg.ca_certs = None worker.cfg.ciphers = None ctx = worker._create_ssl_context(worker.cfg) assert isinstance(ctx, ssl.SSLContext) def test__create_ssl_context_with_ciphers( worker: base_worker.GunicornWebWorker, tls_certificate_pem_path: str, ) -> None: worker.cfg.ssl_version = ssl.PROTOCOL_TLS_CLIENT worker.cfg.cert_reqs = ssl.CERT_OPTIONAL worker.cfg.certfile = tls_certificate_pem_path worker.cfg.keyfile = tls_certificate_pem_path worker.cfg.ca_certs = None worker.cfg.ciphers = "3DES PSK" ctx = worker._create_ssl_context(worker.cfg) assert isinstance(ctx, ssl.SSLContext) def test__create_ssl_context_with_ca_certs( worker: base_worker.GunicornWebWorker, tls_ca_certificate_pem_path: str, tls_certificate_pem_path: str, ) -> None: worker.cfg.ssl_version = ssl.PROTOCOL_TLS_CLIENT worker.cfg.cert_reqs = ssl.CERT_OPTIONAL worker.cfg.certfile = tls_certificate_pem_path worker.cfg.keyfile = tls_certificate_pem_path worker.cfg.ca_certs = tls_ca_certificate_pem_path worker.cfg.ciphers = None ctx = worker._create_ssl_context(worker.cfg) assert isinstance(ctx, ssl.SSLContext) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000034�00000000000�010212� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������28 mtime=1713285830.5351148 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/�������������������������������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�014113� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285814.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/README.rst���������������������������������������������������������������������0000644�0001751�0000177�00000001037�14607525266�015607� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������LLHTTP ------ When building aiohttp from source, there is a pure Python parser used by default. For better performance, you may want to build the higher performance C parser. To build this ``llhttp`` parser, first get/update the submodules (to update to a newer release, add ``--remote``):: git submodule update --init --recursive Then build ``llhttp``:: cd vendor/llhttp/ npm ci make Then build our parser:: cd - make cythonize Then you can build or install it with ``python -m build`` or ``pip install -e .`` �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000033�00000000000�010211� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������27 mtime=1713285830.539115 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/������������������������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�015422� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/.dockerignore�����������������������������������������������������������0000644�0001751�0000177�00000000120�14607525267�020074� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������* !package.json !package-lock.json !tsconfig.json !tsconfig.base.json !bin !src ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/.eslintrc.js������������������������������������������������������������0000644�0001751�0000177�00000000707�14607525267�017672� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������module.exports = { 'env': { 'browser': false, 'commonjs': true, 'es6': true, 'node': true }, 'extends': 'eslint:recommended', 'rules': { 'max-len': [ 2, { 'code': 80, 'ignoreComments': true } ], 'indent': [ 'error', 2 ], 'linebreak-style': [ 'error', 'unix' ], 'quotes': [ 'error', 'single' ], 'semi': [ 'error', 'always' ] } }; ���������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285814.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/.git��������������������������������������������������������������������0000644�0001751�0000177�00000000051�14607525266�016206� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gitdir: ../../.git/modules/vendor/llhttp ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000033�00000000000�010211� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������27 mtime=1713285830.539115 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/.github/����������������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�016762� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/.github/dependabot.yml��������������������������������������������������0000644�0001751�0000177�00000000424�14607525267�021617� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������version: 2 updates: - package-ecosystem: github-actions directory: / schedule: interval: daily - package-ecosystem: docker directory: / schedule: interval: daily - package-ecosystem: npm directory: / schedule: interval: daily ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000033�00000000000�010211� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������27 mtime=1713285830.539115 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/.github/workflows/������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�021017� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/.github/workflows/aiohttp.yml�������������������������������������������0000644�0001751�0000177�00000003603�14607525267�023221� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������name: Aiohttp # If you don't understand the reason for a test failure, ping @Dreamsorcerer or open an issue in aio-libs/aiohttp. on: push: branches: - 'main' pull_request: branches: - 'main' permissions: contents: read jobs: test: permissions: contents: read # to fetch code (actions/checkout) name: Aiohttp regression tests runs-on: ubuntu-latest steps: - name: Checkout aiohttp uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: repository: aio-libs/aiohttp - name: Checkout llhttp uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: path: vendor/llhttp - name: Restore node_modules cache uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 with: path: vendor/llhttp/.npm key: ubuntu-latest-node-${{ hashFiles('vendor/llhttp/**/package-lock.json') }} restore-keys: ubuntu-latest-node- - name: Install llhttp dependencies run: npm ci --ignore-scripts working-directory: vendor/llhttp - name: Build llhttp run: make working-directory: vendor/llhttp - name: Setup Python uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 with: python-version: 3.x cache: 'pip' cache-dependency-path: 'requirements/*.txt' - name: Provision the dev env run: >- PATH="${HOME}/.local/bin:${PATH}" make .develop - name: Run tests env: COLOR: yes run: >- PATH="${HOME}/.local/bin:${PATH}" pytest tests/test_http_parser.py tests/test_web_functional.py - name: Run dev_mode tests env: COLOR: yes run: >- PATH="${HOME}/.local/bin:${PATH}" python -X dev -m pytest -m dev_mode tests/test_http_parser.py tests/test_web_functional.py �����������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/.github/workflows/ci.yaml�����������������������������������������������0000644�0001751�0000177�00000006231�14607525267�022305� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������name: CI on: [push, pull_request] env: CI: true permissions: contents: read jobs: build: name: Build libllhttp.a runs-on: ${{ matrix.os }} strategy: matrix: os: - macos-latest - ubuntu-latest - windows-latest steps: - name: Install clang for Windows if: runner.os == 'Windows' run: | iwr -useb get.scoop.sh -outfile 'install.ps1' .\install.ps1 -RunAsAdmin scoop install llvm --global # Scoop modifies the PATH so we make the modified PATH global. echo $env:PATH >> $env:GITHUB_PATH - name: Fetch code uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: fetch-depth: 1 # Skip macOS & Windows, cache there is slower - name: Restore node_modules cache for Linux uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 if: runner.os == 'Linux' with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- - name: Install dependencies run: npm ci --ignore-scripts - name: Build libllhttp.a shell: bash run: | make build/libllhttp.a test: name: Run tests runs-on: ${{ matrix.os }} strategy: matrix: os: - macos-latest - ubuntu-latest - windows-latest steps: - name: Install clang for Windows if: runner.os == 'Windows' run: | iwr -useb get.scoop.sh -outfile 'install.ps1' .\install.ps1 -RunAsAdmin scoop install llvm --global # Scoop modifies the PATH so we make the modified PATH global. echo $env:PATH >> $env:GITHUB_PATH - name: Fetch code uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: fetch-depth: 1 # Skip macOS & Windows, cache there is slower - name: Restore node_modules cache for Linux uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 if: runner.os == 'Linux' with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- - name: Install dependencies run: npm ci --ignore-scripts # Custom script, because progress looks not good in CI - name: Run tests run: npm run test lint: name: Run ESLint runs-on: ubuntu-latest steps: - name: Fetch code uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: fetch-depth: 1 - name: Restore node_modules cache uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- - name: Install dependencies run: npm ci --ignore-scripts - name: Run lint command run: npm run lint �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/.github/workflows/codeql.yml��������������������������������������������0000644�0001751�0000177�00000005262�14607525267�023023� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# For most projects, this workflow file will not need changing; you simply need # to commit it to your repository. # # You may wish to alter this file to override the set of languages analyzed, # or to provide custom queries or build logic. # # ******** NOTE ******** # We have attempted to detect the languages in your repository. Please check # the `language` matrix defined below to confirm you have the correct set of # supported CodeQL languages. # name: "CodeQL" on: push: branches: ["main"] pull_request: # The branches below must be a subset of the branches above branches: ["main"] schedule: - cron: "0 0 * * 1" permissions: contents: read jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: ["javascript", "typescript"] # CodeQL supports [ $supported-codeql-languages ] # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support steps: - name: Checkout repository uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild uses: github/codeql-action/autobuild@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun # If the Autobuild fails above, remove it and uncomment the following three lines. # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. # - run: | # echo "Run, Build Application using script" # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 with: category: "/language:${{matrix.language}}" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/.github/workflows/scorecards.yml����������������������������������������0000644�0001751�0000177�00000005516�14607525267�023706� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This workflow uses actions that are not certified by GitHub. They are provided # by a third-party and are governed by separate terms of service, privacy # policy, and support documentation. name: Scorecard supply-chain security on: # For Branch-Protection check. Only the default branch is supported. See # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection branch_protection_rule: # To guarantee Maintained check is occasionally updated. See # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained schedule: - cron: '20 7 * * 2' push: branches: ["main"] # Declare default permissions as read only. permissions: read-all jobs: analysis: name: Scorecard analysis runs-on: ubuntu-latest permissions: # Needed to upload the results to code-scanning dashboard. security-events: write # Needed to publish results and get a badge (see publish_results below). id-token: write contents: read actions: read steps: - name: "Checkout code" uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: persist-credentials: false - name: "Run analysis" uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1 with: results_file: results.sarif results_format: sarif # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: # - you want to enable the Branch-Protection check on a *public* repository, or # - you are installing Scorecards on a *private* repository # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat. # repo_token: ${{ secrets.SCORECARD_TOKEN }} # Public repositories: # - Publish results to OpenSSF REST API for easy access by consumers # - Allows the repository to include the Scorecard badge. # - See https://github.com/ossf/scorecard-action#publishing-results. # For private repositories: # - `publish_results` will always be set to `false`, regardless # of the value entered here. publish_results: true # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: SARIF file path: results.sarif retention-days: 5 # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" uses: github/codeql-action/upload-sarif@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 with: sarif_file: results.sarif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/.gitignore��������������������������������������������������������������0000644�0001751�0000177�00000000073�14607525267�017417� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������node_modules/ npm-debug.log test/tmp/ lib/ build/ release/ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/.npmrc������������������������������������������������������������������0000644�0001751�0000177�00000000022�14607525267�016541� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package-lock=true ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/CMakeLists.txt����������������������������������������������������������0000644�0001751�0000177�00000006323�14607525267�020173� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cmake_minimum_required(VERSION 3.5.1) cmake_policy(SET CMP0069 NEW) project(llhttp VERSION _RELEASE_) include(GNUInstallDirs) set(CMAKE_C_STANDARD 99) # By default build in relwithdebinfo type, supports both lowercase and uppercase if(NOT CMAKE_CONFIGURATION_TYPES) set(allowableBuildTypes DEBUG RELEASE RELWITHDEBINFO MINSIZEREL) set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "${allowableBuildTypes}") if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RELWITHDEBINFO CACHE STRING "" FORCE) else() string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE) if(NOT CMAKE_BUILD_TYPE IN_LIST allowableBuildTypes) message(FATAL_ERROR "Invalid build type: ${CMAKE_BUILD_TYPE}") endif() endif() endif() # # Options # # Generic option option(BUILD_SHARED_LIBS "Build shared libraries (.dll/.so)" ON) option(BUILD_STATIC_LIBS "Build static libraries (.lib/.a)" OFF) # Source code set(LLHTTP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/llhttp.c ${CMAKE_CURRENT_SOURCE_DIR}/src/http.c ${CMAKE_CURRENT_SOURCE_DIR}/src/api.c ) set(LLHTTP_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/llhttp.h ) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/libllhttp.pc.in ${CMAKE_CURRENT_SOURCE_DIR}/libllhttp.pc @ONLY ) function(config_library target) target_sources(${target} PRIVATE ${LLHTTP_SOURCES} ${LLHTTP_HEADERS}) target_include_directories(${target} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include> ) set_target_properties(${target} PROPERTIES OUTPUT_NAME llhttp VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} PUBLIC_HEADER ${LLHTTP_HEADERS} ) install(TARGETS ${target} EXPORT llhttp LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/libllhttp.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig ) # This is required to work with FetchContent install(EXPORT llhttp FILE llhttp-config.cmake NAMESPACE llhttp:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/llhttp ) endfunction(config_library target) if(BUILD_SHARED_LIBS) add_library(llhttp_shared SHARED ${llhttp_src} ) add_library(llhttp::llhttp ALIAS llhttp_shared) config_library(llhttp_shared) endif() if(BUILD_STATIC_LIBS) add_library(llhttp_static STATIC ${llhttp_src} ) if(BUILD_SHARED_LIBS) add_library(llhttp::llhttp ALIAS llhttp_shared) else() add_library(llhttp::llhttp ALIAS llhttp_static) endif() config_library(llhttp_static) endif() # On windows with Visual Studio, add a debug postfix so that release # and debug libraries can coexist. if(MSVC) set(CMAKE_DEBUG_POSTFIX "d") endif() # Print project configure summary message(STATUS "") message(STATUS "") message(STATUS "Project configure summary:") message(STATUS "") message(STATUS " CMake build type .................: ${CMAKE_BUILD_TYPE}") message(STATUS " Install prefix ...................: ${CMAKE_INSTALL_PREFIX}") message(STATUS " Build shared library .............: ${BUILD_SHARED_LIBS}") message(STATUS " Build static library .............: ${BUILD_STATIC_LIBS}") message(STATUS "") �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/CNAME�������������������������������������������������������������������0000644�0001751�0000177�00000000012�14607525267�016166� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������llhttp.org����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/CODE_OF_CONDUCT.md������������������������������������������������������0000644�0001751�0000177�00000000313�14607525267�020223� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Code of Conduct * [Node.js Code of Conduct](https://github.com/nodejs/admin/blob/main/CODE_OF_CONDUCT.md) * [Node.js Moderation Policy](https://github.com/nodejs/admin/blob/main/Moderation-Policy.md) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/Dockerfile��������������������������������������������������������������0000644�0001751�0000177�00000000360�14607525267�017420� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������FROM node:21-alpine@sha256:7bfef1d72befbb72b0894a3e4503edbdc0441058b4d091325143338cbf54cff8 ARG UID=1000 ARG GID=1000 RUN apk add -U clang lld wasi-sdk && mkdir /home/node/llhttp WORKDIR /home/node/llhttp COPY . . RUN npm ci USER node ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/LICENSE-MIT�������������������������������������������������������������0000644�0001751�0000177�00000002121�14607525267�017057� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������This software is licensed under the MIT License. Copyright Fedor Indutny, 2018. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/Makefile����������������������������������������������������������������0000644�0001751�0000177�00000005217�14607525267�017074� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������CLANG ?= clang CFLAGS ?= OS ?= CFLAGS += -Os -g3 -Wall -Wextra -Wno-unused-parameter ifneq ($(OS),Windows_NT) # NOTE: clang on windows does not support fPIC CFLAGS += -fPIC endif INCLUDES += -Ibuild/ INSTALL ?= install PREFIX ?= /usr/local LIBDIR = $(PREFIX)/lib INCLUDEDIR = $(PREFIX)/include all: build/libllhttp.a build/libllhttp.so clean: rm -rf release/ rm -rf build/ build/libllhttp.so: build/c/llhttp.o build/native/api.o \ build/native/http.o $(CLANG) -shared $^ -o $@ build/libllhttp.a: build/c/llhttp.o build/native/api.o \ build/native/http.o $(AR) rcs $@ build/c/llhttp.o build/native/api.o build/native/http.o build/c/llhttp.o: build/c/llhttp.c $(CLANG) $(CFLAGS) $(INCLUDES) -c $< -o $@ build/native/%.o: src/native/%.c build/llhttp.h src/native/api.h \ build/native $(CLANG) $(CFLAGS) $(INCLUDES) -c $< -o $@ build/llhttp.h: generate build/c/llhttp.c: generate build/native: mkdir -p build/native release: clean generate @echo "${RELEASE}" | grep -q -E ".+" || { echo "Please make sure the RELEASE argument is set."; exit 1; } rm -rf release mkdir -p release/src mkdir -p release/include cp -rf build/llhttp.h release/include/ cp -rf build/c/llhttp.c release/src/ cp -rf src/native/*.c release/src/ cp -rf src/llhttp.gyp release/ cp -rf src/common.gypi release/ sed s/_RELEASE_/$(RELEASE)/ CMakeLists.txt > release/CMakeLists.txt cp -rf libllhttp.pc.in release/ cp -rf README.md release/ cp -rf LICENSE-MIT release/ github-release: @echo "${RELEASE_V}" | grep -q -E "^v" || { echo "Please make sure version starts with \"v\"."; exit 1; } gh release create -d --generate-notes ${RELEASE_V} @sleep 5 gh release view ${RELEASE_V} -t "{{.body}}" --json body > RELEASE_NOTES gh release delete ${RELEASE_V} -y gh release create -F RELEASE_NOTES -d --title ${RELEASE_V} --target release release/${RELEASE_V} @sleep 5 rm -rf RELEASE_NOTES open $$(gh release view release/${RELEASE_V} --json url -t "{{.url}}") postversion: release git fetch origin git push git checkout release -- cp -rf release/* ./ rm -rf release git add include src *.gyp *.gypi CMakeLists.txt README.md LICENSE-MIT libllhttp.pc.in git commit -a -m "release: $(RELEASE)" git tag "release/v$(RELEASE)" git push && git push --tags git checkout main generate: npx ts-node bin/generate.ts install: build/libllhttp.a build/libllhttp.so $(INSTALL) -d $(DESTDIR)$(INCLUDEDIR) $(INSTALL) -d $(DESTDIR)$(LIBDIR) $(INSTALL) -C build/llhttp.h $(DESTDIR)$(INCLUDEDIR)/llhttp.h $(INSTALL) -C build/libllhttp.a $(DESTDIR)$(LIBDIR)/libllhttp.a $(INSTALL) build/libllhttp.so $(DESTDIR)$(LIBDIR)/libllhttp.so .PHONY: all generate clean release postversion github-release ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/README.md���������������������������������������������������������������0000644�0001751�0000177�00000047214�14607525267�016716� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# llhttp [![CI](https://github.com/nodejs/llhttp/workflows/CI/badge.svg)](https://github.com/nodejs/llhttp/actions?query=workflow%3ACI) Port of [http_parser][0] to [llparse][1]. ## Why? Let's face it, [http_parser][0] is practically unmaintainable. Even introduction of a single new method results in a significant code churn. This project aims to: * Make it maintainable * Verifiable * Improving benchmarks where possible More details in [Fedor Indutny's talk at JSConf EU 2019](https://youtu.be/x3k_5Mi66sY) ## How? Over time, different approaches for improving [http_parser][0]'s code base were tried. However, all of them failed due to resulting significant performance degradation. This project is a port of [http_parser][0] to TypeScript. [llparse][1] is used to generate the output C source file, which could be compiled and linked with the embedder's program (like [Node.js][7]). ## Performance So far llhttp outperforms http_parser: | | input size | bandwidth | reqs/sec | time | |:----------------|-----------:|-------------:|-----------:|--------:| | **llhttp** | 8192.00 mb | 1777.24 mb/s | 3583799.39 req/sec | 4.61 s | | **http_parser** | 8192.00 mb | 694.66 mb/s | 1406180.33 req/sec | 11.79 s | llhttp is faster by approximately **156%**. ## Maintenance llhttp project has about 1400 lines of TypeScript code describing the parser itself and around 450 lines of C code and headers providing the helper methods. The whole [http_parser][0] is implemented in approximately 2500 lines of C, and 436 lines of headers. All optimizations and multi-character matching in llhttp are generated automatically, and thus doesn't add any extra maintenance cost. On the contrary, most of http_parser's code is hand-optimized and unrolled. Instead describing "how" it should parse the HTTP requests/responses, a maintainer should implement the new features in [http_parser][0] cautiously, considering possible performance degradation and manually optimizing the new code. ## Verification The state machine graph is encoded explicitly in llhttp. The [llparse][1] automatically checks the graph for absence of loops and correct reporting of the input ranges (spans) like header names and values. In the future, additional checks could be performed to get even stricter verification of the llhttp. ## Usage ```C #include "stdio.h" #include "llhttp.h" #include "string.h" int handle_on_message_complete(llhttp_t* parser) { fprintf(stdout, "Message completed!\n"); return 0; } int main() { llhttp_t parser; llhttp_settings_t settings; /*Initialize user callbacks and settings */ llhttp_settings_init(&settings); /*Set user callback */ settings.on_message_complete = handle_on_message_complete; /*Initialize the parser in HTTP_BOTH mode, meaning that it will select between *HTTP_REQUEST and HTTP_RESPONSE parsing automatically while reading the first *input. */ llhttp_init(&parser, HTTP_BOTH, &settings); /*Parse request! */ const char* request = "GET / HTTP/1.1\r\n\r\n"; int request_len = strlen(request); enum llhttp_errno err = llhttp_execute(&parser, request, request_len); if (err == HPE_OK) { fprintf(stdout, "Successfully parsed!\n"); } else { fprintf(stderr, "Parse error: %s %s\n", llhttp_errno_name(err), parser.reason); } } ``` For more information on API usage, please refer to [src/native/api.h](https://github.com/nodejs/llhttp/blob/main/src/native/api.h). ## API ### llhttp_settings_t The settings object contains a list of callbacks that the parser will invoke. The following callbacks can return `0` (proceed normally), `-1` (error) or `HPE_PAUSED` (pause the parser): * `on_message_begin`: Invoked when a new request/response starts. * `on_message_complete`: Invoked when a request/response has been completedly parsed. * `on_url_complete`: Invoked after the URL has been parsed. * `on_method_complete`: Invoked after the HTTP method has been parsed. * `on_version_complete`: Invoked after the HTTP version has been parsed. * `on_status_complete`: Invoked after the status code has been parsed. * `on_header_field_complete`: Invoked after a header name has been parsed. * `on_header_value_complete`: Invoked after a header value has been parsed. * `on_chunk_header`: Invoked after a new chunk is started. The current chunk length is stored in `parser->content_length`. * `on_chunk_extension_name_complete`: Invoked after a chunk extension name is started. * `on_chunk_extension_value_complete`: Invoked after a chunk extension value is started. * `on_chunk_complete`: Invoked after a new chunk is received. * `on_reset`: Invoked after `on_message_complete` and before `on_message_begin` when a new message is received on the same parser. This is not invoked for the first message of the parser. The following callbacks can return `0` (proceed normally), `-1` (error) or `HPE_USER` (error from the callback): * `on_url`: Invoked when another character of the URL is received. * `on_status`: Invoked when another character of the status is received. * `on_method`: Invoked when another character of the method is received. When parser is created with `HTTP_BOTH` and the input is a response, this also invoked for the sequence `HTTP/` of the first message. * `on_version`: Invoked when another character of the version is received. * `on_header_field`: Invoked when another character of a header name is received. * `on_header_value`: Invoked when another character of a header value is received. * `on_chunk_extension_name`: Invoked when another character of a chunk extension name is received. * `on_chunk_extension_value`: Invoked when another character of a extension value is received. The callback `on_headers_complete`, invoked when headers are completed, can return: * `0`: Proceed normally. * `1`: Assume that request/response has no body, and proceed to parsing the next message. * `2`: Assume absence of body (as above) and make `llhttp_execute()` return `HPE_PAUSED_UPGRADE`. * `-1`: Error * `HPE_PAUSED`: Pause the parser. ### `void llhttp_init(llhttp_t* parser, llhttp_type_t type, const llhttp_settings_t* settings)` Initialize the parser with specific type and user settings. ### `uint8_t llhttp_get_type(llhttp_t* parser)` Returns the type of the parser. ### `uint8_t llhttp_get_http_major(llhttp_t* parser)` Returns the major version of the HTTP protocol of the current request/response. ### `uint8_t llhttp_get_http_minor(llhttp_t* parser)` Returns the minor version of the HTTP protocol of the current request/response. ### `uint8_t llhttp_get_method(llhttp_t* parser)` Returns the method of the current request. ### `int llhttp_get_status_code(llhttp_t* parser)` Returns the method of the current response. ### `uint8_t llhttp_get_upgrade(llhttp_t* parser)` Returns `1` if request includes the `Connection: upgrade` header. ### `void llhttp_reset(llhttp_t* parser)` Reset an already initialized parser back to the start state, preserving the existing parser type, callback settings, user data, and lenient flags. ### `void llhttp_settings_init(llhttp_settings_t* settings)` Initialize the settings object. ### `llhttp_errno_t llhttp_execute(llhttp_t* parser, const char* data, size_t len)` Parse full or partial request/response, invoking user callbacks along the way. If any of `llhttp_data_cb` returns errno not equal to `HPE_OK` - the parsing interrupts, and such errno is returned from `llhttp_execute()`. If `HPE_PAUSED` was used as a errno, the execution can be resumed with `llhttp_resume()` call. In a special case of CONNECT/Upgrade request/response `HPE_PAUSED_UPGRADE` is returned after fully parsing the request/response. If the user wishes to continue parsing, they need to invoke `llhttp_resume_after_upgrade()`. **if this function ever returns a non-pause type error, it will continue to return the same error upon each successive call up until `llhttp_init()` is called.** ### `llhttp_errno_t llhttp_finish(llhttp_t* parser)` This method should be called when the other side has no further bytes to send (e.g. shutdown of readable side of the TCP connection.) Requests without `Content-Length` and other messages might require treating all incoming bytes as the part of the body, up to the last byte of the connection. This method will invoke `on_message_complete()` callback if the request was terminated safely. Otherwise a error code would be returned. ### `int llhttp_message_needs_eof(const llhttp_t* parser)` Returns `1` if the incoming message is parsed until the last byte, and has to be completed by calling `llhttp_finish()` on EOF. ### `int llhttp_should_keep_alive(const llhttp_t* parser)` Returns `1` if there might be any other messages following the last that was successfully parsed. ### `void llhttp_pause(llhttp_t* parser)` Make further calls of `llhttp_execute()` return `HPE_PAUSED` and set appropriate error reason. **Do not call this from user callbacks! User callbacks must return `HPE_PAUSED` if pausing is required.** ### `void llhttp_resume(llhttp_t* parser)` Might be called to resume the execution after the pause in user's callback. See `llhttp_execute()` above for details. **Call this only if `llhttp_execute()` returns `HPE_PAUSED`.** ### `void llhttp_resume_after_upgrade(llhttp_t* parser)` Might be called to resume the execution after the pause in user's callback. See `llhttp_execute()` above for details. **Call this only if `llhttp_execute()` returns `HPE_PAUSED_UPGRADE`** ### `llhttp_errno_t llhttp_get_errno(const llhttp_t* parser)` Returns the latest error. ### `const char* llhttp_get_error_reason(const llhttp_t* parser)` Returns the verbal explanation of the latest returned error. **User callback should set error reason when returning the error. See `llhttp_set_error_reason()` for details.** ### `void llhttp_set_error_reason(llhttp_t* parser, const char* reason)` Assign verbal description to the returned error. Must be called in user callbacks right before returning the errno. **`HPE_USER` error code might be useful in user callbacks.** ### `const char* llhttp_get_error_pos(const llhttp_t* parser)` Returns the pointer to the last parsed byte before the returned error. The pointer is relative to the `data` argument of `llhttp_execute()`. **This method might be useful for counting the number of parsed bytes.** ### `const char* llhttp_errno_name(llhttp_errno_t err)` Returns textual name of error code. ### `const char* llhttp_method_name(llhttp_method_t method)` Returns textual name of HTTP method. ### `const char* llhttp_status_name(llhttp_status_t status)` Returns textual name of HTTP status. ### `void llhttp_set_lenient_headers(llhttp_t* parser, int enabled)` Enables/disables lenient header value parsing (disabled by default). Lenient parsing disables header value token checks, extending llhttp's protocol support to highly non-compliant clients/server. No `HPE_INVALID_HEADER_TOKEN` will be raised for incorrect header values when lenient parsing is "on". **Enabling this flag can pose a security issue since you will be exposed to request smuggling attacks. USE WITH CAUTION!** ### `void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled)` Enables/disables lenient handling of conflicting `Transfer-Encoding` and `Content-Length` headers (disabled by default). Normally `llhttp` would error when `Transfer-Encoding` is present in conjunction with `Content-Length`. This error is important to prevent HTTP request smuggling, but may be less desirable for small number of cases involving legacy servers. **Enabling this flag can pose a security issue since you will be exposed to request smuggling attacks. USE WITH CAUTION!** ### `void llhttp_set_lenient_keep_alive(llhttp_t* parser, int enabled)` Enables/disables lenient handling of `Connection: close` and HTTP/1.0 requests responses. Normally `llhttp` would error the HTTP request/response after the request/response with `Connection: close` and `Content-Length`. This is important to prevent cache poisoning attacks, but might interact badly with outdated and insecure clients. With this flag the extra request/response will be parsed normally. **Enabling this flag can pose a security issue since you will be exposed to poisoning attacks. USE WITH CAUTION!** ### `void llhttp_set_lenient_transfer_encoding(llhttp_t* parser, int enabled)` Enables/disables lenient handling of `Transfer-Encoding` header. Normally `llhttp` would error when a `Transfer-Encoding` has `chunked` value and another value after it (either in a single header or in multiple headers whose value are internally joined using `, `). This is mandated by the spec to reliably determine request body size and thus avoid request smuggling. With this flag the extra value will be parsed normally. **Enabling this flag can pose a security issue since you will be exposed to request smuggling attacks. USE WITH CAUTION!** ### `void llhttp_set_lenient_version(llhttp_t* parser, int enabled)` Enables/disables lenient handling of HTTP version. Normally `llhttp` would error when the HTTP version in the request or status line is not `0.9`, `1.0`, `1.1` or `2.0`. With this flag the extra value will be parsed normally. **Enabling this flag can pose a security issue since you will allow unsupported HTTP versions. USE WITH CAUTION!** ### `void llhttp_set_lenient_data_after_close(llhttp_t* parser, int enabled)` Enables/disables lenient handling of additional data received after a message ends and keep-alive is disabled. Normally `llhttp` would error when additional unexpected data is received if the message contains the `Connection` header with `close` value. With this flag the extra data will discarded without throwing an error. **Enabling this flag can pose a security issue since you will be exposed to poisoning attacks. USE WITH CAUTION!** ### `void llhttp_set_lenient_optional_lf_after_cr(llhttp_t* parser, int enabled)` Enables/disables lenient handling of incomplete CRLF sequences. Normally `llhttp` would error when a CR is not followed by LF when terminating the request line, the status line, the headers or a chunk header. With this flag only a CR is required to terminate such sections. **Enabling this flag can pose a security issue since you will be exposed to request smuggling attacks. USE WITH CAUTION!** ### `void llhttp_set_lenient_optional_cr_before_lf(llhttp_t* parser, int enabled)` Enables/disables lenient handling of line separators. Normally `llhttp` would error when a LF is not preceded by CR when terminating the request line, the status line, the headers, a chunk header or a chunk data. With this flag only a LF is required to terminate such sections. **Enabling this flag can pose a security issue since you will be exposed to request smuggling attacks. USE WITH CAUTION!** ### `void llhttp_set_lenient_optional_crlf_after_chunk(llhttp_t* parser, int enabled)` Enables/disables lenient handling of chunks not separated via CRLF. Normally `llhttp` would error when after a chunk data a CRLF is missing before starting a new chunk. With this flag the new chunk can start immediately after the previous one. **Enabling this flag can pose a security issue since you will be exposed to request smuggling attacks. USE WITH CAUTION!** ### `void llhttp_set_lenient_spaces_after_chunk_size(llhttp_t* parser, int enabled)` Enables/disables lenient handling of spaces after chunk size. Normally `llhttp` would error when after a chunk size is followed by one or more spaces are present instead of a CRLF or `;`. With this flag this check is disabled. **Enabling this flag can pose a security issue since you will be exposed to request smuggling attacks. USE WITH CAUTION!** ## Build Instructions Make sure you have [Node.js](https://nodejs.org/), npm and npx installed. Then under project directory run: ```sh npm ci make ``` --- ### Bindings to other languages * Lua: [MunifTanjim/llhttp.lua][11] * Python: [pallas/pyllhttp][8] * Ruby: [metabahn/llhttp][9] * Rust: [JackLiar/rust-llhttp][10] ### Using with CMake If you want to use this library in a CMake project as a shared library, you can use the snippet below. ``` FetchContent_Declare(llhttp URL "https://github.com/nodejs/llhttp/archive/refs/tags/release/v8.1.0.tar.gz") FetchContent_MakeAvailable(llhttp) # Link with the llhttp_shared target target_link_libraries(${EXAMPLE_PROJECT_NAME} ${PROJECT_LIBRARIES} llhttp_shared ${PROJECT_NAME}) ``` If you want to use this library in a CMake project as a static library, you can set some cache variables first. ``` FetchContent_Declare(llhttp URL "https://github.com/nodejs/llhttp/archive/refs/tags/release/v8.1.0.tar.gz") set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "") set(BUILD_STATIC_LIBS ON CACHE INTERNAL "") FetchContent_MakeAvailable(llhttp) # Link with the llhttp_static target target_link_libraries(${EXAMPLE_PROJECT_NAME} ${PROJECT_LIBRARIES} llhttp_static ${PROJECT_NAME}) ``` _Note that using the git repo directly (e.g., via a git repo url and tag) will not work with FetchContent_Declare because [CMakeLists.txt](./CMakeLists.txt) requires string replacements (e.g., `_RELEASE_`) before it will build._ ## Building on Windows ### Installation * `choco install git` * `choco install node` * `choco install llvm` (or install the `C++ Clang tools for Windows` optional package from the Visual Studio 2019 installer) * `choco install make` (or if you have MinGW, it comes bundled) 1. Ensure that `Clang` and `make` are in your system path. 2. Using Git Bash, clone the repo to your preferred location. 3. Cd into the cloned directory and run `npm ci` 5. Run `make` 6. Your `repo/build` directory should now have `libllhttp.a` and `libllhttp.so` static and dynamic libraries. 7. When building your executable, you can link to these libraries. Make sure to set the build folder as an include path when building so you can reference the declarations in `repo/build/llhttp.h`. ### A simple example on linking with the library: Assuming you have an executable `main.cpp` in your current working directory, you would run: `clang++ -Os -g3 -Wall -Wextra -Wno-unused-parameter -I/path/to/llhttp/build main.cpp /path/to/llhttp/build/libllhttp.a -o main.exe`. If you are getting `unresolved external symbol` linker errors you are likely attempting to build `llhttp.c` without linking it with object files from `api.c` and `http.c`. #### LICENSE This software is licensed under the MIT License. Copyright Fedor Indutny, 2018. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. [0]: https://github.com/nodejs/http-parser [1]: https://github.com/nodejs/llparse [2]: https://en.wikipedia.org/wiki/Register_allocation#Spilling [3]: https://en.wikipedia.org/wiki/Tail_call [4]: https://llvm.org/docs/LangRef.html [5]: https://llvm.org/docs/LangRef.html#call-instruction [6]: https://clang.llvm.org/ [7]: https://github.com/nodejs/node [8]: https://github.com/pallas/pyllhttp [9]: https://github.com/metabahn/llhttp [10]: https://github.com/JackLiar/rust-llhttp [11]: https://github.com/MunifTanjim/llhttp.lua ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/_config.yml�������������������������������������������������������������0000644�0001751�0000177�00000000034�14607525267�017553� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������theme: jekyll-theme-midnight����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000033�00000000000�010211� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������27 mtime=1713285830.543115 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/bench/������������������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�016501� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/bench/index.ts����������������������������������������������������������0000644�0001751�0000177�00000005517�14607525267�020175� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import * as assert from "assert"; import { spawnSync } from "child_process"; import { existsSync } from "fs"; import { resolve } from "path"; function request(tpl: TemplateStringsArray): string { return tpl.raw[0].replace(/^\s+/gm, '').replace(/\n/gm, '').replace(/\\r/gm, '\r').replace(/\\n/gm, '\n') } const urlExecutable = resolve(__dirname, "../test/tmp/url-url-c"); const httpExecutable = resolve(__dirname, "../test/tmp/http-request-c"); const httpRequests: Record<string, string> = { "seanmonstar/httparse": request` GET /wp-content/uploads/2010/03/hello-kitty-darth-vader-pink.jpg HTTP/1.1\r\n Host: www.kittyhell.com\r\n User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; ja-JP-mac; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 Pathtraq/0.9\r\n Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n Accept-Language: ja,en-us;q=0.7,en;q=0.3\r\n Accept-Encoding: gzip,deflate\r\n Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7\r\n Keep-Alive: 115\r\n Connection: keep-alive\r\n Cookie: wp_ozh_wsa_visits=2; wp_ozh_wsa_visit_lasttime=xxxxxxxxxx; __utma=xxxxxxxxx.xxxxxxxxxx.xxxxxxxxxx.xxxxxxxxxx.xxxxxxxxxx.x; __utmz=xxxxxxxxx.xxxxxxxxxx.x.x.utmccn=(referral)|utmcsr=reader.livedoor.com|utmcct=/reader/|utmcmd=referral\r\n\r\n `, "nodejs/http-parser": request` POST /joyent/http-parser HTTP/1.1\r\n Host: github.com\r\n DNT: 1\r\n Accept-Encoding: gzip, deflate, sdch\r\n Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36\r\n Accept: text/html,application/xhtml+xml,application/xml;q=0.9, image/webp,*/*;q=0.8\r\n Referer: https://github.com/joyent/http-parser\r\n Connection: keep-alive\r\n Transfer-Encoding: chunked\r\n Cache-Control: max-age=0\r\n\r\nb\r\nhello world\r\n0\r\n\r\n ` } const urlRequest = "http://example.com/path/to/file?query=value#fragment"; if (!existsSync(urlExecutable) || !existsSync(urlExecutable)) { console.error( "\x1b[31m\x1b[1mPlease run npm test in order to create required executables." ); process.exit(1); } if (process.argv[2] === "loop") { const reqName = process.argv[3]; const request = httpRequests[reqName]!; assert(request, `Unknown request name: "${reqName}"`); spawnSync(httpExecutable, ["loop", request], { stdio: "inherit" }); process.exit(0); } if (!process.argv[2] || process.argv[2] === "url") { console.log("url (C)"); spawnSync(urlExecutable, ["bench", urlRequest], { stdio: "inherit" }); } if (!process.argv[2] || process.argv[2] === "http") { for (const [name, request] of Object.entries(httpRequests)) { console.log('http: "%s" (C)', name); spawnSync(httpExecutable, ["bench", request], { stdio: "inherit" }); } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000033�00000000000�010211� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������27 mtime=1713285830.543115 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/bin/��������������������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�016172� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/bin/build_wasm.ts�������������������������������������������������������0000644�0001751�0000177�00000006120�14607525267�020674� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import { execSync } from 'child_process'; import { copyFileSync, mkdirSync } from 'fs'; import { join, resolve } from 'path'; let platform = process.env.WASM_PLATFORM ?? ''; const WASM_OUT = resolve(__dirname, '../build/wasm'); const WASM_SRC = resolve(__dirname, '../'); if (!platform && process.argv[2]) { platform = execSync('docker info -f "{{.OSType}}/{{.Architecture}}"').toString().trim(); } if (process.argv[2] === '--prebuild') { const cmd = `docker build --platform=${platform.toString().trim()} -t llhttp_wasm_builder .`; // eslint-disable-next-line no-console console.log(`> ${cmd}\n\n`); execSync(cmd, { stdio: 'inherit' }); process.exit(0); } if (process.argv[2] === '--setup') { try { mkdirSync(join(WASM_SRC, 'build')); process.exit(0); } catch (error: unknown) { if (isErrorWithCode(error) && error.code !== 'EEXIST') { throw error; } process.exit(0); } } if (process.argv[2] === '--docker') { let cmd = `docker run --rm -it --platform=${platform.toString().trim()}`; // Try to avoid root permission problems on compiled assets // when running on linux. // It will work flawessly if uid === gid === 1000 // there will be some warnings otherwise. if (process.platform === 'linux') { cmd += ` --user ${process.getuid!()}:${process.getegid!()}`; } cmd += ` --mount type=bind,source=${WASM_SRC}/build,target=/home/node/llhttp/build llhttp_wasm_builder npm run wasm`; // eslint-disable-next-line no-console console.log(`> ${cmd}\n\n`); execSync(cmd, { cwd: WASM_SRC, stdio: 'inherit' }); process.exit(0); } try { mkdirSync(WASM_OUT); } catch (error: unknown) { if (isErrorWithCode(error) && error.code !== 'EEXIST') { throw error; } } // Build ts execSync('npm run build', { cwd: WASM_SRC, stdio: 'inherit' }); // Build wasm binary execSync( `clang \ --sysroot=/usr/share/wasi-sysroot \ -target wasm32-unknown-wasi \ -Ofast \ -fno-exceptions \ -fvisibility=hidden \ -mexec-model=reactor \ -Wl,-error-limit=0 \ -Wl,-O3 \ -Wl,--lto-O3 \ -Wl,--strip-all \ -Wl,--allow-undefined \ -Wl,--export-dynamic \ -Wl,--export-table \ -Wl,--export=malloc \ -Wl,--export=free \ -Wl,--no-entry \ ${join(WASM_SRC, 'build', 'c')}/*.c \ ${join(WASM_SRC, 'src', 'native')}/*.c \ -I${join(WASM_SRC, 'build')} \ -o ${join(WASM_OUT, 'llhttp.wasm')}`, { stdio: 'inherit' }, ); // Copy constants for `.js` and `.ts` users. copyFileSync(join(WASM_SRC, 'lib', 'llhttp', 'constants.js'), join(WASM_OUT, 'constants.js')); copyFileSync(join(WASM_SRC, 'lib', 'llhttp', 'constants.js.map'), join(WASM_OUT, 'constants.js.map')); copyFileSync(join(WASM_SRC, 'lib', 'llhttp', 'constants.d.ts'), join(WASM_OUT, 'constants.d.ts')); copyFileSync(join(WASM_SRC, 'lib', 'llhttp', 'utils.js'), join(WASM_OUT, 'utils.js')); copyFileSync(join(WASM_SRC, 'lib', 'llhttp', 'utils.js.map'), join(WASM_OUT, 'utils.js.map')); copyFileSync(join(WASM_SRC, 'lib', 'llhttp', 'utils.d.ts'), join(WASM_OUT, 'utils.d.ts')); function isErrorWithCode(error: unknown): error is Error & { code: string } { return typeof error === 'object' && error !== null && 'code' in error; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/bin/generate.ts���������������������������������������������������������0000755�0001751�0000177�00000003214�14607525267�020344� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env -S npx ts-node import { mkdirSync, readFileSync, writeFileSync } from 'fs'; import { LLParse } from 'llparse'; import { dirname, resolve } from 'path'; import { CHeaders, HTTP } from '../src/llhttp'; // https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string // eslint-disable-next-line max-len const semverRE = /^(?<major>0|[1-9]\d*)\.(?<minor>0|[1-9]\d*)\.(?<patch>0|[1-9]\d*)(?:-(?<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/; const C_FILE = resolve(__dirname, '../build/c/llhttp.c'); const HEADER_FILE = resolve(__dirname, '../build/llhttp.h'); const pkg = JSON.parse( readFileSync(resolve(__dirname, '..', 'package.json')).toString(), ); const version = pkg.version.match(semverRE)?.groups; const llparse = new LLParse('llhttp__internal'); const cHeaders = new CHeaders(); const nativeHeaders = readFileSync(resolve(__dirname, '../src/native/api.h')); const generated = llparse.build(new HTTP(llparse).build().entry, { c: { header: 'llhttp', }, debug: process.env.LLPARSE_DEBUG ? 'llhttp__debug' : undefined, headerGuard: 'INCLUDE_LLHTTP_ITSELF_H_', }); const headers = ` #ifndef INCLUDE_LLHTTP_H_ #define INCLUDE_LLHTTP_H_ #define LLHTTP_VERSION_MAJOR ${version.major} #define LLHTTP_VERSION_MINOR ${version.minor} #define LLHTTP_VERSION_PATCH ${version.patch} ${generated.header} ${cHeaders.build()} ${nativeHeaders} #endif /* INCLUDE_LLHTTP_H_ */ `; mkdirSync(dirname(C_FILE), { recursive: true }); writeFileSync(HEADER_FILE, headers); writeFileSync(C_FILE, generated.c); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000033�00000000000�010211� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������27 mtime=1713285830.543115 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/build/������������������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�016521� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000033�00000000000�010211� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������27 mtime=1713285830.543115 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/build/c/����������������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�016743� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285824.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/build/c/llhttp.c��������������������������������������������������������0000644�0001751�0000177�00001137053�14607525300�020421� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <stdlib.h> #include <stdint.h> #include <string.h> #ifdef __SSE4_2__ #ifdef _MSC_VER #include <nmmintrin.h> #else /* !_MSC_VER */ #include <x86intrin.h> #endif /* _MSC_VER */ #endif /* __SSE4_2__ */ #ifdef _MSC_VER #define ALIGN(n) _declspec(align(n)) #else /* !_MSC_VER */ #define ALIGN(n) __attribute__((aligned(n))) #endif /* _MSC_VER */ #include "llhttp.h" typedef int (*llhttp__internal__span_cb)( llhttp__internal_t*, const char*, const char*); static const unsigned char llparse_blob0[] = { 'o', 'n' }; static const unsigned char llparse_blob1[] = { 'e', 'c', 't', 'i', 'o', 'n' }; static const unsigned char llparse_blob2[] = { 'l', 'o', 's', 'e' }; static const unsigned char llparse_blob3[] = { 'e', 'e', 'p', '-', 'a', 'l', 'i', 'v', 'e' }; static const unsigned char llparse_blob4[] = { 'p', 'g', 'r', 'a', 'd', 'e' }; static const unsigned char llparse_blob5[] = { 'c', 'h', 'u', 'n', 'k', 'e', 'd' }; #ifdef __SSE4_2__ static const unsigned char ALIGN(16) llparse_blob6[] = { 0x9, 0x9, ' ', '~', 0x80, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; #endif /* __SSE4_2__ */ #ifdef __SSE4_2__ static const unsigned char ALIGN(16) llparse_blob7[] = { '!', '!', '#', '\'', '*', '+', '-', '.', '0', '9', 'A', 'Z', '^', 'z', '|', '|' }; #endif /* __SSE4_2__ */ #ifdef __SSE4_2__ static const unsigned char ALIGN(16) llparse_blob8[] = { '~', '~', 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; #endif /* __SSE4_2__ */ static const unsigned char llparse_blob9[] = { 'e', 'n', 't', '-', 'l', 'e', 'n', 'g', 't', 'h' }; static const unsigned char llparse_blob10[] = { 'r', 'o', 'x', 'y', '-', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n' }; static const unsigned char llparse_blob11[] = { 'r', 'a', 'n', 's', 'f', 'e', 'r', '-', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g' }; static const unsigned char llparse_blob12[] = { 'p', 'g', 'r', 'a', 'd', 'e' }; static const unsigned char llparse_blob13[] = { 'T', 'T', 'P', '/' }; static const unsigned char llparse_blob14[] = { 0xd, 0xa, 0xd, 0xa, 'S', 'M', 0xd, 0xa, 0xd, 0xa }; static const unsigned char llparse_blob15[] = { 'C', 'E', '/' }; static const unsigned char llparse_blob16[] = { 'T', 'S', 'P', '/' }; static const unsigned char llparse_blob17[] = { 'N', 'O', 'U', 'N', 'C', 'E' }; static const unsigned char llparse_blob18[] = { 'I', 'N', 'D' }; static const unsigned char llparse_blob19[] = { 'E', 'C', 'K', 'O', 'U', 'T' }; static const unsigned char llparse_blob20[] = { 'N', 'E', 'C', 'T' }; static const unsigned char llparse_blob21[] = { 'E', 'T', 'E' }; static const unsigned char llparse_blob22[] = { 'C', 'R', 'I', 'B', 'E' }; static const unsigned char llparse_blob23[] = { 'L', 'U', 'S', 'H' }; static const unsigned char llparse_blob24[] = { 'E', 'T' }; static const unsigned char llparse_blob25[] = { 'P', 'A', 'R', 'A', 'M', 'E', 'T', 'E', 'R' }; static const unsigned char llparse_blob26[] = { 'E', 'A', 'D' }; static const unsigned char llparse_blob27[] = { 'N', 'K' }; static const unsigned char llparse_blob28[] = { 'C', 'K' }; static const unsigned char llparse_blob29[] = { 'S', 'E', 'A', 'R', 'C', 'H' }; static const unsigned char llparse_blob30[] = { 'R', 'G', 'E' }; static const unsigned char llparse_blob31[] = { 'C', 'T', 'I', 'V', 'I', 'T', 'Y' }; static const unsigned char llparse_blob32[] = { 'L', 'E', 'N', 'D', 'A', 'R' }; static const unsigned char llparse_blob33[] = { 'V', 'E' }; static const unsigned char llparse_blob34[] = { 'O', 'T', 'I', 'F', 'Y' }; static const unsigned char llparse_blob35[] = { 'P', 'T', 'I', 'O', 'N', 'S' }; static const unsigned char llparse_blob36[] = { 'C', 'H' }; static const unsigned char llparse_blob37[] = { 'S', 'E' }; static const unsigned char llparse_blob38[] = { 'A', 'Y' }; static const unsigned char llparse_blob39[] = { 'S', 'T' }; static const unsigned char llparse_blob40[] = { 'I', 'N', 'D' }; static const unsigned char llparse_blob41[] = { 'A', 'T', 'C', 'H' }; static const unsigned char llparse_blob42[] = { 'G', 'E' }; static const unsigned char llparse_blob43[] = { 'U', 'E', 'R', 'Y' }; static const unsigned char llparse_blob44[] = { 'I', 'N', 'D' }; static const unsigned char llparse_blob45[] = { 'O', 'R', 'D' }; static const unsigned char llparse_blob46[] = { 'I', 'R', 'E', 'C', 'T' }; static const unsigned char llparse_blob47[] = { 'O', 'R', 'T' }; static const unsigned char llparse_blob48[] = { 'R', 'C', 'H' }; static const unsigned char llparse_blob49[] = { 'P', 'A', 'R', 'A', 'M', 'E', 'T', 'E', 'R' }; static const unsigned char llparse_blob50[] = { 'U', 'R', 'C', 'E' }; static const unsigned char llparse_blob51[] = { 'B', 'S', 'C', 'R', 'I', 'B', 'E' }; static const unsigned char llparse_blob52[] = { 'A', 'R', 'D', 'O', 'W', 'N' }; static const unsigned char llparse_blob53[] = { 'A', 'C', 'E' }; static const unsigned char llparse_blob54[] = { 'I', 'N', 'D' }; static const unsigned char llparse_blob55[] = { 'N', 'K' }; static const unsigned char llparse_blob56[] = { 'C', 'K' }; static const unsigned char llparse_blob57[] = { 'U', 'B', 'S', 'C', 'R', 'I', 'B', 'E' }; static const unsigned char llparse_blob58[] = { 'H', 'T', 'T', 'P', '/' }; static const unsigned char llparse_blob59[] = { 'A', 'D' }; static const unsigned char llparse_blob60[] = { 'T', 'P', '/' }; enum llparse_match_status_e { kMatchComplete, kMatchPause, kMatchMismatch }; typedef enum llparse_match_status_e llparse_match_status_t; struct llparse_match_s { llparse_match_status_t status; const unsigned char* current; }; typedef struct llparse_match_s llparse_match_t; static llparse_match_t llparse__match_sequence_to_lower( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp, const unsigned char* seq, uint32_t seq_len) { uint32_t index; llparse_match_t res; index = s->_index; for (; p != endp; p++) { unsigned char current; current = ((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p)); if (current == seq[index]) { if (++index == seq_len) { res.status = kMatchComplete; goto reset; } } else { res.status = kMatchMismatch; goto reset; } } s->_index = index; res.status = kMatchPause; res.current = p; return res; reset: s->_index = 0; res.current = p; return res; } static llparse_match_t llparse__match_sequence_to_lower_unsafe( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp, const unsigned char* seq, uint32_t seq_len) { uint32_t index; llparse_match_t res; index = s->_index; for (; p != endp; p++) { unsigned char current; current = ((*p) | 0x20); if (current == seq[index]) { if (++index == seq_len) { res.status = kMatchComplete; goto reset; } } else { res.status = kMatchMismatch; goto reset; } } s->_index = index; res.status = kMatchPause; res.current = p; return res; reset: s->_index = 0; res.current = p; return res; } static llparse_match_t llparse__match_sequence_id( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp, const unsigned char* seq, uint32_t seq_len) { uint32_t index; llparse_match_t res; index = s->_index; for (; p != endp; p++) { unsigned char current; current = *p; if (current == seq[index]) { if (++index == seq_len) { res.status = kMatchComplete; goto reset; } } else { res.status = kMatchMismatch; goto reset; } } s->_index = index; res.status = kMatchPause; res.current = p; return res; reset: s->_index = 0; res.current = p; return res; } enum llparse_state_e { s_error, s_n_llhttp__internal__n_closed, s_n_llhttp__internal__n_invoke_llhttp__after_message_complete, s_n_llhttp__internal__n_pause_1, s_n_llhttp__internal__n_invoke_is_equal_upgrade, s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2, s_n_llhttp__internal__n_chunk_data_almost_done_1, s_n_llhttp__internal__n_chunk_data_almost_done, s_n_llhttp__internal__n_consume_content_length, s_n_llhttp__internal__n_span_start_llhttp__on_body, s_n_llhttp__internal__n_invoke_is_equal_content_length, s_n_llhttp__internal__n_chunk_size_almost_done, s_n_llhttp__internal__n_invoke_test_lenient_flags_9, s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete, s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_1, s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2, s_n_llhttp__internal__n_invoke_test_lenient_flags_10, s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete, s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1, s_n_llhttp__internal__n_chunk_extension_quoted_value_done, s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2, s_n_llhttp__internal__n_error_30, s_n_llhttp__internal__n_chunk_extension_quoted_value_quoted_pair, s_n_llhttp__internal__n_error_31, s_n_llhttp__internal__n_chunk_extension_quoted_value, s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_3, s_n_llhttp__internal__n_error_33, s_n_llhttp__internal__n_chunk_extension_value, s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_value, s_n_llhttp__internal__n_error_34, s_n_llhttp__internal__n_chunk_extension_name, s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_name, s_n_llhttp__internal__n_chunk_extensions, s_n_llhttp__internal__n_chunk_size_otherwise, s_n_llhttp__internal__n_chunk_size, s_n_llhttp__internal__n_chunk_size_digit, s_n_llhttp__internal__n_invoke_update_content_length_1, s_n_llhttp__internal__n_consume_content_length_1, s_n_llhttp__internal__n_span_start_llhttp__on_body_1, s_n_llhttp__internal__n_eof, s_n_llhttp__internal__n_span_start_llhttp__on_body_2, s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete, s_n_llhttp__internal__n_error_5, s_n_llhttp__internal__n_headers_almost_done, s_n_llhttp__internal__n_header_field_colon_discard_ws, s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete, s_n_llhttp__internal__n_span_start_llhttp__on_header_value, s_n_llhttp__internal__n_header_value_discard_lws, s_n_llhttp__internal__n_header_value_discard_ws_almost_done, s_n_llhttp__internal__n_header_value_lws, s_n_llhttp__internal__n_header_value_almost_done, s_n_llhttp__internal__n_invoke_test_lenient_flags_17, s_n_llhttp__internal__n_header_value_lenient, s_n_llhttp__internal__n_error_54, s_n_llhttp__internal__n_header_value_otherwise, s_n_llhttp__internal__n_header_value_connection_token, s_n_llhttp__internal__n_header_value_connection_ws, s_n_llhttp__internal__n_header_value_connection_1, s_n_llhttp__internal__n_header_value_connection_2, s_n_llhttp__internal__n_header_value_connection_3, s_n_llhttp__internal__n_header_value_connection, s_n_llhttp__internal__n_error_56, s_n_llhttp__internal__n_error_57, s_n_llhttp__internal__n_header_value_content_length_ws, s_n_llhttp__internal__n_header_value_content_length, s_n_llhttp__internal__n_error_59, s_n_llhttp__internal__n_error_58, s_n_llhttp__internal__n_header_value_te_token_ows, s_n_llhttp__internal__n_header_value, s_n_llhttp__internal__n_header_value_te_token, s_n_llhttp__internal__n_header_value_te_chunked_last, s_n_llhttp__internal__n_header_value_te_chunked, s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1, s_n_llhttp__internal__n_header_value_discard_ws, s_n_llhttp__internal__n_invoke_load_header_state, s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete, s_n_llhttp__internal__n_header_field_general_otherwise, s_n_llhttp__internal__n_header_field_general, s_n_llhttp__internal__n_header_field_colon, s_n_llhttp__internal__n_header_field_3, s_n_llhttp__internal__n_header_field_4, s_n_llhttp__internal__n_header_field_2, s_n_llhttp__internal__n_header_field_1, s_n_llhttp__internal__n_header_field_5, s_n_llhttp__internal__n_header_field_6, s_n_llhttp__internal__n_header_field_7, s_n_llhttp__internal__n_header_field, s_n_llhttp__internal__n_span_start_llhttp__on_header_field, s_n_llhttp__internal__n_header_field_start, s_n_llhttp__internal__n_headers_start, s_n_llhttp__internal__n_url_to_http_09, s_n_llhttp__internal__n_url_skip_to_http09, s_n_llhttp__internal__n_url_skip_lf_to_http09_1, s_n_llhttp__internal__n_url_skip_lf_to_http09, s_n_llhttp__internal__n_req_pri_upgrade, s_n_llhttp__internal__n_req_http_complete_crlf, s_n_llhttp__internal__n_req_http_complete, s_n_llhttp__internal__n_invoke_load_method_1, s_n_llhttp__internal__n_invoke_llhttp__on_version_complete, s_n_llhttp__internal__n_error_66, s_n_llhttp__internal__n_error_73, s_n_llhttp__internal__n_req_http_minor, s_n_llhttp__internal__n_error_74, s_n_llhttp__internal__n_req_http_dot, s_n_llhttp__internal__n_error_75, s_n_llhttp__internal__n_req_http_major, s_n_llhttp__internal__n_span_start_llhttp__on_version, s_n_llhttp__internal__n_req_http_start_1, s_n_llhttp__internal__n_req_http_start_2, s_n_llhttp__internal__n_req_http_start_3, s_n_llhttp__internal__n_req_http_start, s_n_llhttp__internal__n_url_to_http, s_n_llhttp__internal__n_url_skip_to_http, s_n_llhttp__internal__n_url_fragment, s_n_llhttp__internal__n_span_end_stub_query_3, s_n_llhttp__internal__n_url_query, s_n_llhttp__internal__n_url_query_or_fragment, s_n_llhttp__internal__n_url_path, s_n_llhttp__internal__n_span_start_stub_path_2, s_n_llhttp__internal__n_span_start_stub_path, s_n_llhttp__internal__n_span_start_stub_path_1, s_n_llhttp__internal__n_url_server_with_at, s_n_llhttp__internal__n_url_server, s_n_llhttp__internal__n_url_schema_delim_1, s_n_llhttp__internal__n_url_schema_delim, s_n_llhttp__internal__n_span_end_stub_schema, s_n_llhttp__internal__n_url_schema, s_n_llhttp__internal__n_url_start, s_n_llhttp__internal__n_span_start_llhttp__on_url_1, s_n_llhttp__internal__n_url_entry_normal, s_n_llhttp__internal__n_span_start_llhttp__on_url, s_n_llhttp__internal__n_url_entry_connect, s_n_llhttp__internal__n_req_spaces_before_url, s_n_llhttp__internal__n_req_first_space_before_url, s_n_llhttp__internal__n_invoke_llhttp__on_method_complete_1, s_n_llhttp__internal__n_after_start_req_2, s_n_llhttp__internal__n_after_start_req_3, s_n_llhttp__internal__n_after_start_req_1, s_n_llhttp__internal__n_after_start_req_4, s_n_llhttp__internal__n_after_start_req_6, s_n_llhttp__internal__n_after_start_req_8, s_n_llhttp__internal__n_after_start_req_9, s_n_llhttp__internal__n_after_start_req_7, s_n_llhttp__internal__n_after_start_req_5, s_n_llhttp__internal__n_after_start_req_12, s_n_llhttp__internal__n_after_start_req_13, s_n_llhttp__internal__n_after_start_req_11, s_n_llhttp__internal__n_after_start_req_10, s_n_llhttp__internal__n_after_start_req_14, s_n_llhttp__internal__n_after_start_req_17, s_n_llhttp__internal__n_after_start_req_16, s_n_llhttp__internal__n_after_start_req_15, s_n_llhttp__internal__n_after_start_req_18, s_n_llhttp__internal__n_after_start_req_20, s_n_llhttp__internal__n_after_start_req_21, s_n_llhttp__internal__n_after_start_req_19, s_n_llhttp__internal__n_after_start_req_23, s_n_llhttp__internal__n_after_start_req_24, s_n_llhttp__internal__n_after_start_req_26, s_n_llhttp__internal__n_after_start_req_28, s_n_llhttp__internal__n_after_start_req_29, s_n_llhttp__internal__n_after_start_req_27, s_n_llhttp__internal__n_after_start_req_25, s_n_llhttp__internal__n_after_start_req_30, s_n_llhttp__internal__n_after_start_req_22, s_n_llhttp__internal__n_after_start_req_31, s_n_llhttp__internal__n_after_start_req_32, s_n_llhttp__internal__n_after_start_req_35, s_n_llhttp__internal__n_after_start_req_36, s_n_llhttp__internal__n_after_start_req_34, s_n_llhttp__internal__n_after_start_req_37, s_n_llhttp__internal__n_after_start_req_38, s_n_llhttp__internal__n_after_start_req_42, s_n_llhttp__internal__n_after_start_req_43, s_n_llhttp__internal__n_after_start_req_41, s_n_llhttp__internal__n_after_start_req_40, s_n_llhttp__internal__n_after_start_req_39, s_n_llhttp__internal__n_after_start_req_45, s_n_llhttp__internal__n_after_start_req_44, s_n_llhttp__internal__n_after_start_req_33, s_n_llhttp__internal__n_after_start_req_46, s_n_llhttp__internal__n_after_start_req_49, s_n_llhttp__internal__n_after_start_req_50, s_n_llhttp__internal__n_after_start_req_51, s_n_llhttp__internal__n_after_start_req_52, s_n_llhttp__internal__n_after_start_req_48, s_n_llhttp__internal__n_after_start_req_47, s_n_llhttp__internal__n_after_start_req_55, s_n_llhttp__internal__n_after_start_req_57, s_n_llhttp__internal__n_after_start_req_58, s_n_llhttp__internal__n_after_start_req_56, s_n_llhttp__internal__n_after_start_req_54, s_n_llhttp__internal__n_after_start_req_59, s_n_llhttp__internal__n_after_start_req_60, s_n_llhttp__internal__n_after_start_req_53, s_n_llhttp__internal__n_after_start_req_62, s_n_llhttp__internal__n_after_start_req_63, s_n_llhttp__internal__n_after_start_req_61, s_n_llhttp__internal__n_after_start_req_66, s_n_llhttp__internal__n_after_start_req_68, s_n_llhttp__internal__n_after_start_req_69, s_n_llhttp__internal__n_after_start_req_67, s_n_llhttp__internal__n_after_start_req_70, s_n_llhttp__internal__n_after_start_req_65, s_n_llhttp__internal__n_after_start_req_64, s_n_llhttp__internal__n_after_start_req, s_n_llhttp__internal__n_span_start_llhttp__on_method_1, s_n_llhttp__internal__n_res_line_almost_done, s_n_llhttp__internal__n_invoke_test_lenient_flags_30, s_n_llhttp__internal__n_res_status, s_n_llhttp__internal__n_span_start_llhttp__on_status, s_n_llhttp__internal__n_res_status_code_otherwise, s_n_llhttp__internal__n_res_status_code_digit_3, s_n_llhttp__internal__n_res_status_code_digit_2, s_n_llhttp__internal__n_res_status_code_digit_1, s_n_llhttp__internal__n_res_after_version, s_n_llhttp__internal__n_invoke_llhttp__on_version_complete_1, s_n_llhttp__internal__n_error_89, s_n_llhttp__internal__n_error_103, s_n_llhttp__internal__n_res_http_minor, s_n_llhttp__internal__n_error_104, s_n_llhttp__internal__n_res_http_dot, s_n_llhttp__internal__n_error_105, s_n_llhttp__internal__n_res_http_major, s_n_llhttp__internal__n_span_start_llhttp__on_version_1, s_n_llhttp__internal__n_start_res, s_n_llhttp__internal__n_invoke_llhttp__on_method_complete, s_n_llhttp__internal__n_req_or_res_method_2, s_n_llhttp__internal__n_invoke_update_type_1, s_n_llhttp__internal__n_req_or_res_method_3, s_n_llhttp__internal__n_req_or_res_method_1, s_n_llhttp__internal__n_req_or_res_method, s_n_llhttp__internal__n_span_start_llhttp__on_method, s_n_llhttp__internal__n_start_req_or_res, s_n_llhttp__internal__n_invoke_load_type, s_n_llhttp__internal__n_invoke_update_finish, s_n_llhttp__internal__n_start, }; typedef enum llparse_state_e llparse_state_t; int llhttp__on_method( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_url( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_version( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_header_field( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_header_value( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_body( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_chunk_extension_name( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_chunk_extension_value( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_status( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_load_initial_message_completed( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->initial_message_completed; } int llhttp__on_reset( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_update_finish( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->finish = 2; return 0; } int llhttp__on_message_begin( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_load_type( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->type; } int llhttp__internal__c_store_method( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { state->method = match; return 0; } int llhttp__on_method_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_is_equal_method( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->method == 5; } int llhttp__internal__c_update_http_major( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->http_major = 0; return 0; } int llhttp__internal__c_update_http_minor( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->http_minor = 9; return 0; } int llhttp__on_url_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_test_lenient_flags( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 1) == 1; } int llhttp__internal__c_test_lenient_flags_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 256) == 256; } int llhttp__internal__c_test_flags( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->flags & 128) == 128; } int llhttp__on_chunk_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_message_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_is_equal_upgrade( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->upgrade == 1; } int llhttp__after_message_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_update_content_length( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->content_length = 0; return 0; } int llhttp__internal__c_update_initial_message_completed( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->initial_message_completed = 1; return 0; } int llhttp__internal__c_update_finish_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->finish = 0; return 0; } int llhttp__internal__c_test_lenient_flags_2( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 4) == 4; } int llhttp__internal__c_test_lenient_flags_3( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 32) == 32; } int llhttp__before_headers_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_headers_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__after_headers_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_mul_add_content_length( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { /* Multiplication overflow */ if (state->content_length > 0xffffffffffffffffULL / 16) { return 1; } state->content_length *= 16; /* Addition overflow */ if (match >= 0) { if (state->content_length > 0xffffffffffffffffULL - match) { return 1; } } else { if (state->content_length < 0ULL - match) { return 1; } } state->content_length += match; return 0; } int llhttp__internal__c_test_lenient_flags_4( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 512) == 512; } int llhttp__on_chunk_header( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_is_equal_content_length( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->content_length == 0; } int llhttp__internal__c_test_lenient_flags_7( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 128) == 128; } int llhttp__internal__c_or_flags( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 128; return 0; } int llhttp__internal__c_test_lenient_flags_8( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 64) == 64; } int llhttp__on_chunk_extension_name_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_chunk_extension_value_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_update_finish_3( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->finish = 1; return 0; } int llhttp__internal__c_or_flags_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 64; return 0; } int llhttp__internal__c_update_upgrade( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->upgrade = 1; return 0; } int llhttp__internal__c_store_header_state( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { state->header_state = match; return 0; } int llhttp__on_header_field_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_load_header_state( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->header_state; } int llhttp__internal__c_test_flags_4( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->flags & 512) == 512; } int llhttp__internal__c_test_lenient_flags_22( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 2) == 2; } int llhttp__internal__c_or_flags_5( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 1; return 0; } int llhttp__internal__c_update_header_state( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 1; return 0; } int llhttp__on_header_value_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_or_flags_6( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 2; return 0; } int llhttp__internal__c_or_flags_7( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 4; return 0; } int llhttp__internal__c_or_flags_8( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 8; return 0; } int llhttp__internal__c_update_header_state_3( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 6; return 0; } int llhttp__internal__c_update_header_state_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 0; return 0; } int llhttp__internal__c_update_header_state_6( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 5; return 0; } int llhttp__internal__c_update_header_state_7( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 7; return 0; } int llhttp__internal__c_test_flags_2( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->flags & 32) == 32; } int llhttp__internal__c_mul_add_content_length_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { /* Multiplication overflow */ if (state->content_length > 0xffffffffffffffffULL / 10) { return 1; } state->content_length *= 10; /* Addition overflow */ if (match >= 0) { if (state->content_length > 0xffffffffffffffffULL - match) { return 1; } } else { if (state->content_length < 0ULL - match) { return 1; } } state->content_length += match; return 0; } int llhttp__internal__c_or_flags_17( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 32; return 0; } int llhttp__internal__c_test_flags_3( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->flags & 8) == 8; } int llhttp__internal__c_test_lenient_flags_20( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 8) == 8; } int llhttp__internal__c_or_flags_18( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 512; return 0; } int llhttp__internal__c_and_flags( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags &= -9; return 0; } int llhttp__internal__c_update_header_state_8( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 8; return 0; } int llhttp__internal__c_or_flags_20( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 16; return 0; } int llhttp__internal__c_load_method( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->method; } int llhttp__internal__c_store_http_major( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { state->http_major = match; return 0; } int llhttp__internal__c_store_http_minor( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { state->http_minor = match; return 0; } int llhttp__internal__c_test_lenient_flags_24( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 16) == 16; } int llhttp__on_version_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_load_http_major( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->http_major; } int llhttp__internal__c_load_http_minor( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->http_minor; } int llhttp__internal__c_update_status_code( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->status_code = 0; return 0; } int llhttp__internal__c_mul_add_status_code( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { /* Multiplication overflow */ if (state->status_code > 0xffff / 10) { return 1; } state->status_code *= 10; /* Addition overflow */ if (match >= 0) { if (state->status_code > 0xffff - match) { return 1; } } else { if (state->status_code < 0 - match) { return 1; } } state->status_code += match; return 0; } int llhttp__on_status_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_update_type( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->type = 1; return 0; } int llhttp__internal__c_update_type_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->type = 2; return 0; } int llhttp__internal_init(llhttp__internal_t* state) { memset(state, 0, sizeof(*state)); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_start; return 0; } static llparse_state_t llhttp__internal__run( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { int match; switch ((llparse_state_t) (intptr_t) state->_current) { case s_n_llhttp__internal__n_closed: s_n_llhttp__internal__n_closed: { if (p == endp) { return s_n_llhttp__internal__n_closed; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_closed; } case 13: { p++; goto s_n_llhttp__internal__n_closed; } default: { p++; goto s_n_llhttp__internal__n_invoke_test_lenient_flags_3; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__after_message_complete: s_n_llhttp__internal__n_invoke_llhttp__after_message_complete: { switch (llhttp__after_message_complete(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_update_content_length; default: goto s_n_llhttp__internal__n_invoke_update_finish_1; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_pause_1: s_n_llhttp__internal__n_pause_1: { state->error = 0x16; state->reason = "Pause on CONNECT/Upgrade"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_is_equal_upgrade: s_n_llhttp__internal__n_invoke_is_equal_upgrade: { switch (llhttp__internal__c_is_equal_upgrade(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; default: goto s_n_llhttp__internal__n_pause_1; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2: s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2: { switch (llhttp__on_message_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_is_equal_upgrade; case 21: goto s_n_llhttp__internal__n_pause_13; default: goto s_n_llhttp__internal__n_error_38; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_data_almost_done_1: s_n_llhttp__internal__n_chunk_data_almost_done_1: { if (p == endp) { return s_n_llhttp__internal__n_chunk_data_almost_done_1; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete; } default: { goto s_n_llhttp__internal__n_invoke_test_lenient_flags_7; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_data_almost_done: s_n_llhttp__internal__n_chunk_data_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_chunk_data_almost_done; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_invoke_test_lenient_flags_6; } case 13: { p++; goto s_n_llhttp__internal__n_chunk_data_almost_done_1; } default: { goto s_n_llhttp__internal__n_invoke_test_lenient_flags_7; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_consume_content_length: s_n_llhttp__internal__n_consume_content_length: { size_t avail; uint64_t need; avail = endp - p; need = state->content_length; if (avail >= need) { p += need; state->content_length = 0; goto s_n_llhttp__internal__n_span_end_llhttp__on_body; } state->content_length -= avail; return s_n_llhttp__internal__n_consume_content_length; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_body: s_n_llhttp__internal__n_span_start_llhttp__on_body: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_body; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_body; goto s_n_llhttp__internal__n_consume_content_length; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_is_equal_content_length: s_n_llhttp__internal__n_invoke_is_equal_content_length: { switch (llhttp__internal__c_is_equal_content_length(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_span_start_llhttp__on_body; default: goto s_n_llhttp__internal__n_invoke_or_flags; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_size_almost_done: s_n_llhttp__internal__n_chunk_size_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_chunk_size_almost_done; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_header; } default: { goto s_n_llhttp__internal__n_invoke_test_lenient_flags_8; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_test_lenient_flags_9: s_n_llhttp__internal__n_invoke_test_lenient_flags_9: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_chunk_size_almost_done; default: goto s_n_llhttp__internal__n_error_20; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete: s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete: { switch (llhttp__on_chunk_extension_name_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_test_lenient_flags_9; case 21: goto s_n_llhttp__internal__n_pause_5; default: goto s_n_llhttp__internal__n_error_19; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_1: s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_1: { switch (llhttp__on_chunk_extension_name_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_chunk_size_almost_done; case 21: goto s_n_llhttp__internal__n_pause_6; default: goto s_n_llhttp__internal__n_error_21; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2: s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2: { switch (llhttp__on_chunk_extension_name_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_chunk_extensions; case 21: goto s_n_llhttp__internal__n_pause_7; default: goto s_n_llhttp__internal__n_error_22; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_test_lenient_flags_10: s_n_llhttp__internal__n_invoke_test_lenient_flags_10: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_chunk_size_almost_done; default: goto s_n_llhttp__internal__n_error_25; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete: s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete: { switch (llhttp__on_chunk_extension_value_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_test_lenient_flags_10; case 21: goto s_n_llhttp__internal__n_pause_8; default: goto s_n_llhttp__internal__n_error_24; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1: s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1: { switch (llhttp__on_chunk_extension_value_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_chunk_size_almost_done; case 21: goto s_n_llhttp__internal__n_pause_9; default: goto s_n_llhttp__internal__n_error_26; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_extension_quoted_value_done: s_n_llhttp__internal__n_chunk_extension_quoted_value_done: { if (p == endp) { return s_n_llhttp__internal__n_chunk_extension_quoted_value_done; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_invoke_test_lenient_flags_11; } case 13: { p++; goto s_n_llhttp__internal__n_chunk_size_almost_done; } case ';': { p++; goto s_n_llhttp__internal__n_chunk_extensions; } default: { goto s_n_llhttp__internal__n_error_29; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2: s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2: { switch (llhttp__on_chunk_extension_value_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_chunk_extension_quoted_value_done; case 21: goto s_n_llhttp__internal__n_pause_10; default: goto s_n_llhttp__internal__n_error_27; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_30: s_n_llhttp__internal__n_error_30: { state->error = 0x2; state->reason = "Invalid quoted-pair in chunk extensions quoted value"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_extension_quoted_value_quoted_pair: s_n_llhttp__internal__n_chunk_extension_quoted_value_quoted_pair: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; if (p == endp) { return s_n_llhttp__internal__n_chunk_extension_quoted_value_quoted_pair; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_chunk_extension_quoted_value; } default: { goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_3; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_31: s_n_llhttp__internal__n_error_31: { state->error = 0x2; state->reason = "Invalid character in chunk extensions quoted value"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_extension_quoted_value: s_n_llhttp__internal__n_chunk_extension_quoted_value: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; if (p == endp) { return s_n_llhttp__internal__n_chunk_extension_quoted_value; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_chunk_extension_quoted_value; } case 2: { p++; goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_2; } case 3: { p++; goto s_n_llhttp__internal__n_chunk_extension_quoted_value_quoted_pair; } default: { goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_4; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_3: s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_3: { switch (llhttp__on_chunk_extension_value_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_chunk_extensions; case 21: goto s_n_llhttp__internal__n_pause_11; default: goto s_n_llhttp__internal__n_error_32; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_33: s_n_llhttp__internal__n_error_33: { state->error = 0x2; state->reason = "Invalid character in chunk extensions value"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_extension_value: s_n_llhttp__internal__n_chunk_extension_value: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 3, 3, 3, 3, 3, 0, 0, 3, 3, 0, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 5, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; if (p == endp) { return s_n_llhttp__internal__n_chunk_extension_value; } switch (lookup_table[(uint8_t) *p]) { case 1: { goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value; } case 2: { goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_1; } case 3: { p++; goto s_n_llhttp__internal__n_chunk_extension_value; } case 4: { p++; goto s_n_llhttp__internal__n_chunk_extension_quoted_value; } case 5: { goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_5; } default: { goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_6; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_value: s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_value: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_value; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_chunk_extension_value; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_3; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_34: s_n_llhttp__internal__n_error_34: { state->error = 0x2; state->reason = "Invalid character in chunk extensions name"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_extension_name: s_n_llhttp__internal__n_chunk_extension_name: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 3, 3, 3, 3, 0, 0, 3, 3, 0, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 4, 0, 5, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; if (p == endp) { return s_n_llhttp__internal__n_chunk_extension_name; } switch (lookup_table[(uint8_t) *p]) { case 1: { goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name; } case 2: { goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_1; } case 3: { p++; goto s_n_llhttp__internal__n_chunk_extension_name; } case 4: { goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_2; } case 5: { goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_3; } default: { goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_4; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_name: s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_name: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_name; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_chunk_extension_name; goto s_n_llhttp__internal__n_chunk_extension_name; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_extensions: s_n_llhttp__internal__n_chunk_extensions: { if (p == endp) { return s_n_llhttp__internal__n_chunk_extensions; } switch (*p) { case 13: { p++; goto s_n_llhttp__internal__n_error_17; } case ' ': { p++; goto s_n_llhttp__internal__n_error_18; } default: { goto s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_name; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_size_otherwise: s_n_llhttp__internal__n_chunk_size_otherwise: { if (p == endp) { return s_n_llhttp__internal__n_chunk_size_otherwise; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_invoke_test_lenient_flags_4; } case 10: { p++; goto s_n_llhttp__internal__n_invoke_test_lenient_flags_5; } case 13: { p++; goto s_n_llhttp__internal__n_chunk_size_almost_done; } case ' ': { p++; goto s_n_llhttp__internal__n_invoke_test_lenient_flags_4; } case ';': { p++; goto s_n_llhttp__internal__n_chunk_extensions; } default: { goto s_n_llhttp__internal__n_error_35; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_size: s_n_llhttp__internal__n_chunk_size: { if (p == endp) { return s_n_llhttp__internal__n_chunk_size; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'A': { p++; match = 10; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'B': { p++; match = 11; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'C': { p++; match = 12; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'D': { p++; match = 13; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'E': { p++; match = 14; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'F': { p++; match = 15; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'a': { p++; match = 10; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'b': { p++; match = 11; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'c': { p++; match = 12; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'd': { p++; match = 13; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'e': { p++; match = 14; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'f': { p++; match = 15; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } default: { goto s_n_llhttp__internal__n_chunk_size_otherwise; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_size_digit: s_n_llhttp__internal__n_chunk_size_digit: { if (p == endp) { return s_n_llhttp__internal__n_chunk_size_digit; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'A': { p++; match = 10; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'B': { p++; match = 11; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'C': { p++; match = 12; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'D': { p++; match = 13; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'E': { p++; match = 14; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'F': { p++; match = 15; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'a': { p++; match = 10; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'b': { p++; match = 11; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'c': { p++; match = 12; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'd': { p++; match = 13; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'e': { p++; match = 14; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'f': { p++; match = 15; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } default: { goto s_n_llhttp__internal__n_error_37; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_update_content_length_1: s_n_llhttp__internal__n_invoke_update_content_length_1: { switch (llhttp__internal__c_update_content_length(state, p, endp)) { default: goto s_n_llhttp__internal__n_chunk_size_digit; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_consume_content_length_1: s_n_llhttp__internal__n_consume_content_length_1: { size_t avail; uint64_t need; avail = endp - p; need = state->content_length; if (avail >= need) { p += need; state->content_length = 0; goto s_n_llhttp__internal__n_span_end_llhttp__on_body_1; } state->content_length -= avail; return s_n_llhttp__internal__n_consume_content_length_1; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_body_1: s_n_llhttp__internal__n_span_start_llhttp__on_body_1: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_body_1; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_body; goto s_n_llhttp__internal__n_consume_content_length_1; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_eof: s_n_llhttp__internal__n_eof: { if (p == endp) { return s_n_llhttp__internal__n_eof; } p++; goto s_n_llhttp__internal__n_eof; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_body_2: s_n_llhttp__internal__n_span_start_llhttp__on_body_2: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_body_2; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_body; goto s_n_llhttp__internal__n_eof; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete: s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete: { switch (llhttp__after_headers_complete(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_1; case 2: goto s_n_llhttp__internal__n_invoke_update_content_length_1; case 3: goto s_n_llhttp__internal__n_span_start_llhttp__on_body_1; case 4: goto s_n_llhttp__internal__n_invoke_update_finish_3; case 5: goto s_n_llhttp__internal__n_error_39; default: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_5: s_n_llhttp__internal__n_error_5: { state->error = 0xa; state->reason = "Invalid header field char"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_headers_almost_done: s_n_llhttp__internal__n_headers_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_headers_almost_done; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_invoke_test_flags_1; } default: { goto s_n_llhttp__internal__n_invoke_test_lenient_flags_12; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_colon_discard_ws: s_n_llhttp__internal__n_header_field_colon_discard_ws: { if (p == endp) { return s_n_llhttp__internal__n_header_field_colon_discard_ws; } switch (*p) { case ' ': { p++; goto s_n_llhttp__internal__n_header_field_colon_discard_ws; } default: { goto s_n_llhttp__internal__n_header_field_colon; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete: s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete: { switch (llhttp__on_header_value_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_header_field_start; case 21: goto s_n_llhttp__internal__n_pause_18; default: goto s_n_llhttp__internal__n_error_48; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_header_value: s_n_llhttp__internal__n_span_start_llhttp__on_header_value: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_header_value; goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_discard_lws: s_n_llhttp__internal__n_header_value_discard_lws: { if (p == endp) { return s_n_llhttp__internal__n_header_value_discard_lws; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_invoke_test_lenient_flags_15; } case ' ': { p++; goto s_n_llhttp__internal__n_invoke_test_lenient_flags_15; } default: { goto s_n_llhttp__internal__n_invoke_load_header_state_1; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_discard_ws_almost_done: s_n_llhttp__internal__n_header_value_discard_ws_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_header_value_discard_ws_almost_done; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_header_value_discard_lws; } default: { goto s_n_llhttp__internal__n_invoke_test_lenient_flags_16; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_lws: s_n_llhttp__internal__n_header_value_lws: { if (p == endp) { return s_n_llhttp__internal__n_header_value_lws; } switch (*p) { case 9: { goto s_n_llhttp__internal__n_invoke_test_lenient_flags_18; } case ' ': { goto s_n_llhttp__internal__n_invoke_test_lenient_flags_18; } default: { goto s_n_llhttp__internal__n_invoke_load_header_state_5; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_almost_done: s_n_llhttp__internal__n_header_value_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_header_value_almost_done; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_header_value_lws; } default: { goto s_n_llhttp__internal__n_error_53; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_test_lenient_flags_17: s_n_llhttp__internal__n_invoke_test_lenient_flags_17: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_value_almost_done; default: goto s_n_llhttp__internal__n_error_51; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_lenient: s_n_llhttp__internal__n_header_value_lenient: { if (p == endp) { return s_n_llhttp__internal__n_header_value_lenient; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_4; } case 13: { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_5; } default: { p++; goto s_n_llhttp__internal__n_header_value_lenient; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_54: s_n_llhttp__internal__n_error_54: { state->error = 0xa; state->reason = "Invalid header value char"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_otherwise: s_n_llhttp__internal__n_header_value_otherwise: { if (p == endp) { return s_n_llhttp__internal__n_header_value_otherwise; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_1; } case 13: { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2; } default: { goto s_n_llhttp__internal__n_invoke_test_lenient_flags_19; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection_token: s_n_llhttp__internal__n_header_value_connection_token: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_token; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_header_value_connection_token; } case 2: { p++; goto s_n_llhttp__internal__n_header_value_connection; } default: { goto s_n_llhttp__internal__n_header_value_otherwise; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection_ws: s_n_llhttp__internal__n_header_value_connection_ws: { if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_ws; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_header_value_otherwise; } case 13: { goto s_n_llhttp__internal__n_header_value_otherwise; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_connection_ws; } case ',': { p++; goto s_n_llhttp__internal__n_invoke_load_header_state_6; } default: { goto s_n_llhttp__internal__n_invoke_update_header_state_5; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection_1: s_n_llhttp__internal__n_header_value_connection_1: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_1; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob2, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_update_header_state_3; } case kMatchPause: { return s_n_llhttp__internal__n_header_value_connection_1; } case kMatchMismatch: { goto s_n_llhttp__internal__n_header_value_connection_token; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection_2: s_n_llhttp__internal__n_header_value_connection_2: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_2; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob3, 9); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_update_header_state_6; } case kMatchPause: { return s_n_llhttp__internal__n_header_value_connection_2; } case kMatchMismatch: { goto s_n_llhttp__internal__n_header_value_connection_token; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection_3: s_n_llhttp__internal__n_header_value_connection_3: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_3; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob4, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_update_header_state_7; } case kMatchPause: { return s_n_llhttp__internal__n_header_value_connection_3; } case kMatchMismatch: { goto s_n_llhttp__internal__n_header_value_connection_token; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection: s_n_llhttp__internal__n_header_value_connection: { if (p == endp) { return s_n_llhttp__internal__n_header_value_connection; } switch (((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p))) { case 9: { p++; goto s_n_llhttp__internal__n_header_value_connection; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_connection; } case 'c': { p++; goto s_n_llhttp__internal__n_header_value_connection_1; } case 'k': { p++; goto s_n_llhttp__internal__n_header_value_connection_2; } case 'u': { p++; goto s_n_llhttp__internal__n_header_value_connection_3; } default: { goto s_n_llhttp__internal__n_header_value_connection_token; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_56: s_n_llhttp__internal__n_error_56: { state->error = 0xb; state->reason = "Content-Length overflow"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_57: s_n_llhttp__internal__n_error_57: { state->error = 0xb; state->reason = "Invalid character in Content-Length"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_content_length_ws: s_n_llhttp__internal__n_header_value_content_length_ws: { if (p == endp) { return s_n_llhttp__internal__n_header_value_content_length_ws; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_invoke_or_flags_17; } case 13: { goto s_n_llhttp__internal__n_invoke_or_flags_17; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_content_length_ws; } default: { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_7; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_content_length: s_n_llhttp__internal__n_header_value_content_length: { if (p == endp) { return s_n_llhttp__internal__n_header_value_content_length; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } default: { goto s_n_llhttp__internal__n_header_value_content_length_ws; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_59: s_n_llhttp__internal__n_error_59: { state->error = 0xf; state->reason = "Invalid `Transfer-Encoding` header value"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_58: s_n_llhttp__internal__n_error_58: { state->error = 0xf; state->reason = "Invalid `Transfer-Encoding` header value"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_te_token_ows: s_n_llhttp__internal__n_header_value_te_token_ows: { if (p == endp) { return s_n_llhttp__internal__n_header_value_te_token_ows; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_header_value_te_token_ows; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_te_token_ows; } default: { goto s_n_llhttp__internal__n_header_value_te_chunked; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value: s_n_llhttp__internal__n_header_value: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; if (p == endp) { return s_n_llhttp__internal__n_header_value; } #ifdef __SSE4_2__ if (endp - p >= 16) { __m128i ranges; __m128i input; int avail; int match_len; /* Load input */ input = _mm_loadu_si128((__m128i const*) p); ranges = _mm_loadu_si128((__m128i const*) llparse_blob6); /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 6, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_header_value; } goto s_n_llhttp__internal__n_header_value_otherwise; } #endif /* __SSE4_2__ */ switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_header_value; } default: { goto s_n_llhttp__internal__n_header_value_otherwise; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_te_token: s_n_llhttp__internal__n_header_value_te_token: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; if (p == endp) { return s_n_llhttp__internal__n_header_value_te_token; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_header_value_te_token; } case 2: { p++; goto s_n_llhttp__internal__n_header_value_te_token_ows; } default: { goto s_n_llhttp__internal__n_invoke_update_header_state_9; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_te_chunked_last: s_n_llhttp__internal__n_header_value_te_chunked_last: { if (p == endp) { return s_n_llhttp__internal__n_header_value_te_chunked_last; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_invoke_update_header_state_8; } case 13: { goto s_n_llhttp__internal__n_invoke_update_header_state_8; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_te_chunked_last; } case ',': { goto s_n_llhttp__internal__n_invoke_load_type_1; } default: { goto s_n_llhttp__internal__n_header_value_te_token; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_te_chunked: s_n_llhttp__internal__n_header_value_te_chunked: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_value_te_chunked; } match_seq = llparse__match_sequence_to_lower_unsafe(state, p, endp, llparse_blob5, 7); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_header_value_te_chunked_last; } case kMatchPause: { return s_n_llhttp__internal__n_header_value_te_chunked; } case kMatchMismatch: { goto s_n_llhttp__internal__n_header_value_te_token; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1: s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_header_value; goto s_n_llhttp__internal__n_invoke_load_header_state_3; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_discard_ws: s_n_llhttp__internal__n_header_value_discard_ws: { if (p == endp) { return s_n_llhttp__internal__n_header_value_discard_ws; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_header_value_discard_ws; } case 10: { p++; goto s_n_llhttp__internal__n_invoke_test_lenient_flags_14; } case 13: { p++; goto s_n_llhttp__internal__n_header_value_discard_ws_almost_done; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_discard_ws; } default: { goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_load_header_state: s_n_llhttp__internal__n_invoke_load_header_state: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 2: goto s_n_llhttp__internal__n_invoke_test_flags_4; case 3: goto s_n_llhttp__internal__n_invoke_test_flags_5; default: goto s_n_llhttp__internal__n_header_value_discard_ws; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete: s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete: { switch (llhttp__on_header_field_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_load_header_state; case 21: goto s_n_llhttp__internal__n_pause_19; default: goto s_n_llhttp__internal__n_error_45; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_general_otherwise: s_n_llhttp__internal__n_header_field_general_otherwise: { if (p == endp) { return s_n_llhttp__internal__n_header_field_general_otherwise; } switch (*p) { case ':': { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_field_2; } default: { goto s_n_llhttp__internal__n_error_62; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_general: s_n_llhttp__internal__n_header_field_general: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; if (p == endp) { return s_n_llhttp__internal__n_header_field_general; } #ifdef __SSE4_2__ if (endp - p >= 16) { __m128i ranges; __m128i input; int avail; int match_len; /* Load input */ input = _mm_loadu_si128((__m128i const*) p); ranges = _mm_loadu_si128((__m128i const*) llparse_blob7); /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 16, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_header_field_general; } ranges = _mm_loadu_si128((__m128i const*) llparse_blob8); /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 2, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_header_field_general; } goto s_n_llhttp__internal__n_header_field_general_otherwise; } #endif /* __SSE4_2__ */ switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_header_field_general; } default: { goto s_n_llhttp__internal__n_header_field_general_otherwise; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_colon: s_n_llhttp__internal__n_header_field_colon: { if (p == endp) { return s_n_llhttp__internal__n_header_field_colon; } switch (*p) { case ' ': { goto s_n_llhttp__internal__n_invoke_test_lenient_flags_13; } case ':': { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_field_1; } default: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_3: s_n_llhttp__internal__n_header_field_3: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_3; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob1, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_header_state; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_3; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_11; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_4: s_n_llhttp__internal__n_header_field_4: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_4; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob9, 10); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_header_state; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_4; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_11; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_2: s_n_llhttp__internal__n_header_field_2: { if (p == endp) { return s_n_llhttp__internal__n_header_field_2; } switch (((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p))) { case 'n': { p++; goto s_n_llhttp__internal__n_header_field_3; } case 't': { p++; goto s_n_llhttp__internal__n_header_field_4; } default: { goto s_n_llhttp__internal__n_invoke_update_header_state_11; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_1: s_n_llhttp__internal__n_header_field_1: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_1; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob0, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_header_field_2; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_1; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_11; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_5: s_n_llhttp__internal__n_header_field_5: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_5; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob10, 15); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_header_state; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_5; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_11; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_6: s_n_llhttp__internal__n_header_field_6: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_6; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob11, 16); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_header_state; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_6; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_11; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_7: s_n_llhttp__internal__n_header_field_7: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_7; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob12, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_header_state; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_7; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_11; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field: s_n_llhttp__internal__n_header_field: { if (p == endp) { return s_n_llhttp__internal__n_header_field; } switch (((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p))) { case 'c': { p++; goto s_n_llhttp__internal__n_header_field_1; } case 'p': { p++; goto s_n_llhttp__internal__n_header_field_5; } case 't': { p++; goto s_n_llhttp__internal__n_header_field_6; } case 'u': { p++; goto s_n_llhttp__internal__n_header_field_7; } default: { goto s_n_llhttp__internal__n_invoke_update_header_state_11; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_header_field: s_n_llhttp__internal__n_span_start_llhttp__on_header_field: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_header_field; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_header_field; goto s_n_llhttp__internal__n_header_field; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_start: s_n_llhttp__internal__n_header_field_start: { if (p == endp) { return s_n_llhttp__internal__n_header_field_start; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_invoke_test_lenient_flags_1; } case 13: { p++; goto s_n_llhttp__internal__n_headers_almost_done; } case ':': { goto s_n_llhttp__internal__n_error_44; } default: { goto s_n_llhttp__internal__n_span_start_llhttp__on_header_field; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_headers_start: s_n_llhttp__internal__n_headers_start: { if (p == endp) { return s_n_llhttp__internal__n_headers_start; } switch (*p) { case ' ': { p++; goto s_n_llhttp__internal__n_invoke_test_lenient_flags; } default: { goto s_n_llhttp__internal__n_header_field_start; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_to_http_09: s_n_llhttp__internal__n_url_to_http_09: { if (p == endp) { return s_n_llhttp__internal__n_url_to_http_09; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_2; } case 12: { p++; goto s_n_llhttp__internal__n_error_2; } default: { goto s_n_llhttp__internal__n_invoke_update_http_major; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_skip_to_http09: s_n_llhttp__internal__n_url_skip_to_http09: { if (p == endp) { return s_n_llhttp__internal__n_url_skip_to_http09; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_2; } case 12: { p++; goto s_n_llhttp__internal__n_error_2; } default: { p++; goto s_n_llhttp__internal__n_url_to_http_09; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_skip_lf_to_http09_1: s_n_llhttp__internal__n_url_skip_lf_to_http09_1: { if (p == endp) { return s_n_llhttp__internal__n_url_skip_lf_to_http09_1; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_url_to_http_09; } default: { goto s_n_llhttp__internal__n_error_63; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_skip_lf_to_http09: s_n_llhttp__internal__n_url_skip_lf_to_http09: { if (p == endp) { return s_n_llhttp__internal__n_url_skip_lf_to_http09; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_2; } case 12: { p++; goto s_n_llhttp__internal__n_error_2; } case 13: { p++; goto s_n_llhttp__internal__n_url_skip_lf_to_http09_1; } default: { goto s_n_llhttp__internal__n_error_63; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_pri_upgrade: s_n_llhttp__internal__n_req_pri_upgrade: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_pri_upgrade; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob14, 10); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_error_71; } case kMatchPause: { return s_n_llhttp__internal__n_req_pri_upgrade; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_72; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_complete_crlf: s_n_llhttp__internal__n_req_http_complete_crlf: { if (p == endp) { return s_n_llhttp__internal__n_req_http_complete_crlf; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_headers_start; } default: { goto s_n_llhttp__internal__n_invoke_test_lenient_flags_26; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_complete: s_n_llhttp__internal__n_req_http_complete: { if (p == endp) { return s_n_llhttp__internal__n_req_http_complete; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_invoke_test_lenient_flags_25; } case 13: { p++; goto s_n_llhttp__internal__n_req_http_complete_crlf; } default: { goto s_n_llhttp__internal__n_error_70; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_load_method_1: s_n_llhttp__internal__n_invoke_load_method_1: { switch (llhttp__internal__c_load_method(state, p, endp)) { case 34: goto s_n_llhttp__internal__n_req_pri_upgrade; default: goto s_n_llhttp__internal__n_req_http_complete; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_version_complete: s_n_llhttp__internal__n_invoke_llhttp__on_version_complete: { switch (llhttp__on_version_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_load_method_1; case 21: goto s_n_llhttp__internal__n_pause_21; default: goto s_n_llhttp__internal__n_error_67; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_66: s_n_llhttp__internal__n_error_66: { state->error = 0x9; state->reason = "Invalid HTTP version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_73: s_n_llhttp__internal__n_error_73: { state->error = 0x9; state->reason = "Invalid minor version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_minor: s_n_llhttp__internal__n_req_http_minor: { if (p == endp) { return s_n_llhttp__internal__n_req_http_minor; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_store_http_minor; } default: { goto s_n_llhttp__internal__n_span_end_llhttp__on_version_2; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_74: s_n_llhttp__internal__n_error_74: { state->error = 0x9; state->reason = "Expected dot"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_dot: s_n_llhttp__internal__n_req_http_dot: { if (p == endp) { return s_n_llhttp__internal__n_req_http_dot; } switch (*p) { case '.': { p++; goto s_n_llhttp__internal__n_req_http_minor; } default: { goto s_n_llhttp__internal__n_span_end_llhttp__on_version_3; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_75: s_n_llhttp__internal__n_error_75: { state->error = 0x9; state->reason = "Invalid major version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_major: s_n_llhttp__internal__n_req_http_major: { if (p == endp) { return s_n_llhttp__internal__n_req_http_major; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_store_http_major; } default: { goto s_n_llhttp__internal__n_span_end_llhttp__on_version_4; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_version: s_n_llhttp__internal__n_span_start_llhttp__on_version: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_version; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_version; goto s_n_llhttp__internal__n_req_http_major; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_start_1: s_n_llhttp__internal__n_req_http_start_1: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_http_start_1; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob13, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_load_method; } case kMatchPause: { return s_n_llhttp__internal__n_req_http_start_1; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_78; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_start_2: s_n_llhttp__internal__n_req_http_start_2: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_http_start_2; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob15, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_load_method_2; } case kMatchPause: { return s_n_llhttp__internal__n_req_http_start_2; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_78; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_start_3: s_n_llhttp__internal__n_req_http_start_3: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_http_start_3; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob16, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_load_method_3; } case kMatchPause: { return s_n_llhttp__internal__n_req_http_start_3; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_78; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_start: s_n_llhttp__internal__n_req_http_start: { if (p == endp) { return s_n_llhttp__internal__n_req_http_start; } switch (*p) { case ' ': { p++; goto s_n_llhttp__internal__n_req_http_start; } case 'H': { p++; goto s_n_llhttp__internal__n_req_http_start_1; } case 'I': { p++; goto s_n_llhttp__internal__n_req_http_start_2; } case 'R': { p++; goto s_n_llhttp__internal__n_req_http_start_3; } default: { goto s_n_llhttp__internal__n_error_78; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_to_http: s_n_llhttp__internal__n_url_to_http: { if (p == endp) { return s_n_llhttp__internal__n_url_to_http; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_2; } case 12: { p++; goto s_n_llhttp__internal__n_error_2; } default: { goto s_n_llhttp__internal__n_invoke_llhttp__on_url_complete_1; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_skip_to_http: s_n_llhttp__internal__n_url_skip_to_http: { if (p == endp) { return s_n_llhttp__internal__n_url_skip_to_http; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_2; } case 12: { p++; goto s_n_llhttp__internal__n_error_2; } default: { p++; goto s_n_llhttp__internal__n_url_to_http; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_fragment: s_n_llhttp__internal__n_url_fragment: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; if (p == endp) { return s_n_llhttp__internal__n_url_fragment; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_error_2; } case 2: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_6; } case 3: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_7; } case 4: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_8; } case 5: { p++; goto s_n_llhttp__internal__n_url_fragment; } default: { goto s_n_llhttp__internal__n_error_79; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_end_stub_query_3: s_n_llhttp__internal__n_span_end_stub_query_3: { if (p == endp) { return s_n_llhttp__internal__n_span_end_stub_query_3; } p++; goto s_n_llhttp__internal__n_url_fragment; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_query: s_n_llhttp__internal__n_url_query: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; if (p == endp) { return s_n_llhttp__internal__n_url_query; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_error_2; } case 2: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_9; } case 3: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_10; } case 4: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_11; } case 5: { p++; goto s_n_llhttp__internal__n_url_query; } case 6: { goto s_n_llhttp__internal__n_span_end_stub_query_3; } default: { goto s_n_llhttp__internal__n_error_80; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_query_or_fragment: s_n_llhttp__internal__n_url_query_or_fragment: { if (p == endp) { return s_n_llhttp__internal__n_url_query_or_fragment; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_2; } case 10: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_3; } case 12: { p++; goto s_n_llhttp__internal__n_error_2; } case 13: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_4; } case ' ': { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_5; } case '#': { p++; goto s_n_llhttp__internal__n_url_fragment; } case '?': { p++; goto s_n_llhttp__internal__n_url_query; } default: { goto s_n_llhttp__internal__n_error_81; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_path: s_n_llhttp__internal__n_url_path: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; if (p == endp) { return s_n_llhttp__internal__n_url_path; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_error_2; } case 2: { p++; goto s_n_llhttp__internal__n_url_path; } default: { goto s_n_llhttp__internal__n_url_query_or_fragment; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_stub_path_2: s_n_llhttp__internal__n_span_start_stub_path_2: { if (p == endp) { return s_n_llhttp__internal__n_span_start_stub_path_2; } p++; goto s_n_llhttp__internal__n_url_path; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_stub_path: s_n_llhttp__internal__n_span_start_stub_path: { if (p == endp) { return s_n_llhttp__internal__n_span_start_stub_path; } p++; goto s_n_llhttp__internal__n_url_path; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_stub_path_1: s_n_llhttp__internal__n_span_start_stub_path_1: { if (p == endp) { return s_n_llhttp__internal__n_span_start_stub_path_1; } p++; goto s_n_llhttp__internal__n_url_path; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_server_with_at: s_n_llhttp__internal__n_url_server_with_at: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 0, 7, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; if (p == endp) { return s_n_llhttp__internal__n_url_server_with_at; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_error_2; } case 2: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_12; } case 3: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_13; } case 4: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_14; } case 5: { p++; goto s_n_llhttp__internal__n_url_server; } case 6: { goto s_n_llhttp__internal__n_span_start_stub_path_1; } case 7: { p++; goto s_n_llhttp__internal__n_url_query; } case 8: { p++; goto s_n_llhttp__internal__n_error_82; } default: { goto s_n_llhttp__internal__n_error_83; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_server: s_n_llhttp__internal__n_url_server: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 0, 7, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; if (p == endp) { return s_n_llhttp__internal__n_url_server; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_error_2; } case 2: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url; } case 3: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_1; } case 4: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_2; } case 5: { p++; goto s_n_llhttp__internal__n_url_server; } case 6: { goto s_n_llhttp__internal__n_span_start_stub_path; } case 7: { p++; goto s_n_llhttp__internal__n_url_query; } case 8: { p++; goto s_n_llhttp__internal__n_url_server_with_at; } default: { goto s_n_llhttp__internal__n_error_84; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_schema_delim_1: s_n_llhttp__internal__n_url_schema_delim_1: { if (p == endp) { return s_n_llhttp__internal__n_url_schema_delim_1; } switch (*p) { case '/': { p++; goto s_n_llhttp__internal__n_url_server; } default: { goto s_n_llhttp__internal__n_error_85; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_schema_delim: s_n_llhttp__internal__n_url_schema_delim: { if (p == endp) { return s_n_llhttp__internal__n_url_schema_delim; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_2; } case 10: { p++; goto s_n_llhttp__internal__n_error_2; } case 12: { p++; goto s_n_llhttp__internal__n_error_2; } case 13: { p++; goto s_n_llhttp__internal__n_error_2; } case ' ': { p++; goto s_n_llhttp__internal__n_error_2; } case '/': { p++; goto s_n_llhttp__internal__n_url_schema_delim_1; } default: { goto s_n_llhttp__internal__n_error_85; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_end_stub_schema: s_n_llhttp__internal__n_span_end_stub_schema: { if (p == endp) { return s_n_llhttp__internal__n_span_end_stub_schema; } p++; goto s_n_llhttp__internal__n_url_schema_delim; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_schema: s_n_llhttp__internal__n_url_schema: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; if (p == endp) { return s_n_llhttp__internal__n_url_schema; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_error_2; } case 2: { goto s_n_llhttp__internal__n_span_end_stub_schema; } case 3: { p++; goto s_n_llhttp__internal__n_url_schema; } default: { goto s_n_llhttp__internal__n_error_86; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_start: s_n_llhttp__internal__n_url_start: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; if (p == endp) { return s_n_llhttp__internal__n_url_start; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_error_2; } case 2: { goto s_n_llhttp__internal__n_span_start_stub_path_2; } case 3: { goto s_n_llhttp__internal__n_url_schema; } default: { goto s_n_llhttp__internal__n_error_87; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_url_1: s_n_llhttp__internal__n_span_start_llhttp__on_url_1: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_url_1; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_url; goto s_n_llhttp__internal__n_url_start; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_entry_normal: s_n_llhttp__internal__n_url_entry_normal: { if (p == endp) { return s_n_llhttp__internal__n_url_entry_normal; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_2; } case 12: { p++; goto s_n_llhttp__internal__n_error_2; } default: { goto s_n_llhttp__internal__n_span_start_llhttp__on_url_1; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_url: s_n_llhttp__internal__n_span_start_llhttp__on_url: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_url; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_url; goto s_n_llhttp__internal__n_url_server; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_entry_connect: s_n_llhttp__internal__n_url_entry_connect: { if (p == endp) { return s_n_llhttp__internal__n_url_entry_connect; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_2; } case 12: { p++; goto s_n_llhttp__internal__n_error_2; } default: { goto s_n_llhttp__internal__n_span_start_llhttp__on_url; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_spaces_before_url: s_n_llhttp__internal__n_req_spaces_before_url: { if (p == endp) { return s_n_llhttp__internal__n_req_spaces_before_url; } switch (*p) { case ' ': { p++; goto s_n_llhttp__internal__n_req_spaces_before_url; } default: { goto s_n_llhttp__internal__n_invoke_is_equal_method; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_first_space_before_url: s_n_llhttp__internal__n_req_first_space_before_url: { if (p == endp) { return s_n_llhttp__internal__n_req_first_space_before_url; } switch (*p) { case ' ': { p++; goto s_n_llhttp__internal__n_req_spaces_before_url; } default: { goto s_n_llhttp__internal__n_error_88; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_method_complete_1: s_n_llhttp__internal__n_invoke_llhttp__on_method_complete_1: { switch (llhttp__on_method_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_req_first_space_before_url; case 21: goto s_n_llhttp__internal__n_pause_26; default: goto s_n_llhttp__internal__n_error_107; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_2: s_n_llhttp__internal__n_after_start_req_2: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_2; } switch (*p) { case 'L': { p++; match = 19; goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_3: s_n_llhttp__internal__n_after_start_req_3: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_3; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob17, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 36; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_3; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_1: s_n_llhttp__internal__n_after_start_req_1: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_1; } switch (*p) { case 'C': { p++; goto s_n_llhttp__internal__n_after_start_req_2; } case 'N': { p++; goto s_n_llhttp__internal__n_after_start_req_3; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_4: s_n_llhttp__internal__n_after_start_req_4: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_4; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob18, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 16; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_4; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_6: s_n_llhttp__internal__n_after_start_req_6: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_6; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob19, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 22; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_6; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_8: s_n_llhttp__internal__n_after_start_req_8: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_8; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob20, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 5; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_8; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_9: s_n_llhttp__internal__n_after_start_req_9: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_9; } switch (*p) { case 'Y': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_7: s_n_llhttp__internal__n_after_start_req_7: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_7; } switch (*p) { case 'N': { p++; goto s_n_llhttp__internal__n_after_start_req_8; } case 'P': { p++; goto s_n_llhttp__internal__n_after_start_req_9; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_5: s_n_llhttp__internal__n_after_start_req_5: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_5; } switch (*p) { case 'H': { p++; goto s_n_llhttp__internal__n_after_start_req_6; } case 'O': { p++; goto s_n_llhttp__internal__n_after_start_req_7; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_12: s_n_llhttp__internal__n_after_start_req_12: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_12; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob21, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 0; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_12; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_13: s_n_llhttp__internal__n_after_start_req_13: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_13; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob22, 5); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 35; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_13; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_11: s_n_llhttp__internal__n_after_start_req_11: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_11; } switch (*p) { case 'L': { p++; goto s_n_llhttp__internal__n_after_start_req_12; } case 'S': { p++; goto s_n_llhttp__internal__n_after_start_req_13; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_10: s_n_llhttp__internal__n_after_start_req_10: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_10; } switch (*p) { case 'E': { p++; goto s_n_llhttp__internal__n_after_start_req_11; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_14: s_n_llhttp__internal__n_after_start_req_14: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_14; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob23, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 45; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_14; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_17: s_n_llhttp__internal__n_after_start_req_17: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_17; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob25, 9); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 41; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_17; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_16: s_n_llhttp__internal__n_after_start_req_16: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_16; } switch (*p) { case '_': { p++; goto s_n_llhttp__internal__n_after_start_req_17; } default: { match = 1; goto s_n_llhttp__internal__n_invoke_store_method_1; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_15: s_n_llhttp__internal__n_after_start_req_15: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_15; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob24, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_after_start_req_16; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_15; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_18: s_n_llhttp__internal__n_after_start_req_18: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_18; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob26, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_18; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_20: s_n_llhttp__internal__n_after_start_req_20: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_20; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob27, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 31; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_20; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_21: s_n_llhttp__internal__n_after_start_req_21: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_21; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob28, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 9; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_21; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_19: s_n_llhttp__internal__n_after_start_req_19: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_19; } switch (*p) { case 'I': { p++; goto s_n_llhttp__internal__n_after_start_req_20; } case 'O': { p++; goto s_n_llhttp__internal__n_after_start_req_21; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_23: s_n_llhttp__internal__n_after_start_req_23: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_23; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob29, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 24; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_23; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_24: s_n_llhttp__internal__n_after_start_req_24: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_24; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob30, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 23; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_24; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_26: s_n_llhttp__internal__n_after_start_req_26: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_26; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob31, 7); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 21; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_26; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_28: s_n_llhttp__internal__n_after_start_req_28: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_28; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob32, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 30; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_28; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_29: s_n_llhttp__internal__n_after_start_req_29: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_29; } switch (*p) { case 'L': { p++; match = 10; goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_27: s_n_llhttp__internal__n_after_start_req_27: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_27; } switch (*p) { case 'A': { p++; goto s_n_llhttp__internal__n_after_start_req_28; } case 'O': { p++; goto s_n_llhttp__internal__n_after_start_req_29; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_25: s_n_llhttp__internal__n_after_start_req_25: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_25; } switch (*p) { case 'A': { p++; goto s_n_llhttp__internal__n_after_start_req_26; } case 'C': { p++; goto s_n_llhttp__internal__n_after_start_req_27; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_30: s_n_llhttp__internal__n_after_start_req_30: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_30; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob33, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 11; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_30; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_22: s_n_llhttp__internal__n_after_start_req_22: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_22; } switch (*p) { case '-': { p++; goto s_n_llhttp__internal__n_after_start_req_23; } case 'E': { p++; goto s_n_llhttp__internal__n_after_start_req_24; } case 'K': { p++; goto s_n_llhttp__internal__n_after_start_req_25; } case 'O': { p++; goto s_n_llhttp__internal__n_after_start_req_30; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_31: s_n_llhttp__internal__n_after_start_req_31: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_31; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob34, 5); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 25; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_31; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_32: s_n_llhttp__internal__n_after_start_req_32: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_32; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob35, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 6; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_32; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_35: s_n_llhttp__internal__n_after_start_req_35: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_35; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob36, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 28; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_35; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_36: s_n_llhttp__internal__n_after_start_req_36: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_36; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob37, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 39; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_36; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_34: s_n_llhttp__internal__n_after_start_req_34: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_34; } switch (*p) { case 'T': { p++; goto s_n_llhttp__internal__n_after_start_req_35; } case 'U': { p++; goto s_n_llhttp__internal__n_after_start_req_36; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_37: s_n_llhttp__internal__n_after_start_req_37: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_37; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob38, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 38; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_37; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_38: s_n_llhttp__internal__n_after_start_req_38: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_38; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob39, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_38; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_42: s_n_llhttp__internal__n_after_start_req_42: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_42; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob40, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 12; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_42; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_43: s_n_llhttp__internal__n_after_start_req_43: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_43; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob41, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 13; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_43; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_41: s_n_llhttp__internal__n_after_start_req_41: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_41; } switch (*p) { case 'F': { p++; goto s_n_llhttp__internal__n_after_start_req_42; } case 'P': { p++; goto s_n_llhttp__internal__n_after_start_req_43; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_40: s_n_llhttp__internal__n_after_start_req_40: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_40; } switch (*p) { case 'P': { p++; goto s_n_llhttp__internal__n_after_start_req_41; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_39: s_n_llhttp__internal__n_after_start_req_39: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_39; } switch (*p) { case 'I': { p++; match = 34; goto s_n_llhttp__internal__n_invoke_store_method_1; } case 'O': { p++; goto s_n_llhttp__internal__n_after_start_req_40; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_45: s_n_llhttp__internal__n_after_start_req_45: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_45; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob42, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 29; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_45; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_44: s_n_llhttp__internal__n_after_start_req_44: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_44; } switch (*p) { case 'R': { p++; goto s_n_llhttp__internal__n_after_start_req_45; } case 'T': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_33: s_n_llhttp__internal__n_after_start_req_33: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_33; } switch (*p) { case 'A': { p++; goto s_n_llhttp__internal__n_after_start_req_34; } case 'L': { p++; goto s_n_llhttp__internal__n_after_start_req_37; } case 'O': { p++; goto s_n_llhttp__internal__n_after_start_req_38; } case 'R': { p++; goto s_n_llhttp__internal__n_after_start_req_39; } case 'U': { p++; goto s_n_llhttp__internal__n_after_start_req_44; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_46: s_n_llhttp__internal__n_after_start_req_46: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_46; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob43, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 46; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_46; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_49: s_n_llhttp__internal__n_after_start_req_49: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_49; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob44, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 17; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_49; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_50: s_n_llhttp__internal__n_after_start_req_50: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_50; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob45, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 44; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_50; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_51: s_n_llhttp__internal__n_after_start_req_51: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_51; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob46, 5); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 43; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_51; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_52: s_n_llhttp__internal__n_after_start_req_52: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_52; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob47, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 20; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_52; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_48: s_n_llhttp__internal__n_after_start_req_48: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_48; } switch (*p) { case 'B': { p++; goto s_n_llhttp__internal__n_after_start_req_49; } case 'C': { p++; goto s_n_llhttp__internal__n_after_start_req_50; } case 'D': { p++; goto s_n_llhttp__internal__n_after_start_req_51; } case 'P': { p++; goto s_n_llhttp__internal__n_after_start_req_52; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_47: s_n_llhttp__internal__n_after_start_req_47: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_47; } switch (*p) { case 'E': { p++; goto s_n_llhttp__internal__n_after_start_req_48; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_55: s_n_llhttp__internal__n_after_start_req_55: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_55; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob48, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 14; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_55; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_57: s_n_llhttp__internal__n_after_start_req_57: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_57; } switch (*p) { case 'P': { p++; match = 37; goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_58: s_n_llhttp__internal__n_after_start_req_58: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_58; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob49, 9); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 42; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_58; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_56: s_n_llhttp__internal__n_after_start_req_56: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_56; } switch (*p) { case 'U': { p++; goto s_n_llhttp__internal__n_after_start_req_57; } case '_': { p++; goto s_n_llhttp__internal__n_after_start_req_58; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_54: s_n_llhttp__internal__n_after_start_req_54: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_54; } switch (*p) { case 'A': { p++; goto s_n_llhttp__internal__n_after_start_req_55; } case 'T': { p++; goto s_n_llhttp__internal__n_after_start_req_56; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_59: s_n_llhttp__internal__n_after_start_req_59: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_59; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob50, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 33; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_59; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_60: s_n_llhttp__internal__n_after_start_req_60: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_60; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob51, 7); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 26; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_60; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_53: s_n_llhttp__internal__n_after_start_req_53: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_53; } switch (*p) { case 'E': { p++; goto s_n_llhttp__internal__n_after_start_req_54; } case 'O': { p++; goto s_n_llhttp__internal__n_after_start_req_59; } case 'U': { p++; goto s_n_llhttp__internal__n_after_start_req_60; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_62: s_n_llhttp__internal__n_after_start_req_62: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_62; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob52, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 40; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_62; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_63: s_n_llhttp__internal__n_after_start_req_63: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_63; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob53, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 7; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_63; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_61: s_n_llhttp__internal__n_after_start_req_61: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_61; } switch (*p) { case 'E': { p++; goto s_n_llhttp__internal__n_after_start_req_62; } case 'R': { p++; goto s_n_llhttp__internal__n_after_start_req_63; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_66: s_n_llhttp__internal__n_after_start_req_66: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_66; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob54, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 18; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_66; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_68: s_n_llhttp__internal__n_after_start_req_68: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_68; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob55, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 32; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_68; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_69: s_n_llhttp__internal__n_after_start_req_69: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_69; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob56, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 15; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_69; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_67: s_n_llhttp__internal__n_after_start_req_67: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_67; } switch (*p) { case 'I': { p++; goto s_n_llhttp__internal__n_after_start_req_68; } case 'O': { p++; goto s_n_llhttp__internal__n_after_start_req_69; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_70: s_n_llhttp__internal__n_after_start_req_70: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_after_start_req_70; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob57, 8); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 27; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_70; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_65: s_n_llhttp__internal__n_after_start_req_65: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_65; } switch (*p) { case 'B': { p++; goto s_n_llhttp__internal__n_after_start_req_66; } case 'L': { p++; goto s_n_llhttp__internal__n_after_start_req_67; } case 'S': { p++; goto s_n_llhttp__internal__n_after_start_req_70; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req_64: s_n_llhttp__internal__n_after_start_req_64: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req_64; } switch (*p) { case 'N': { p++; goto s_n_llhttp__internal__n_after_start_req_65; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_after_start_req: s_n_llhttp__internal__n_after_start_req: { if (p == endp) { return s_n_llhttp__internal__n_after_start_req; } switch (*p) { case 'A': { p++; goto s_n_llhttp__internal__n_after_start_req_1; } case 'B': { p++; goto s_n_llhttp__internal__n_after_start_req_4; } case 'C': { p++; goto s_n_llhttp__internal__n_after_start_req_5; } case 'D': { p++; goto s_n_llhttp__internal__n_after_start_req_10; } case 'F': { p++; goto s_n_llhttp__internal__n_after_start_req_14; } case 'G': { p++; goto s_n_llhttp__internal__n_after_start_req_15; } case 'H': { p++; goto s_n_llhttp__internal__n_after_start_req_18; } case 'L': { p++; goto s_n_llhttp__internal__n_after_start_req_19; } case 'M': { p++; goto s_n_llhttp__internal__n_after_start_req_22; } case 'N': { p++; goto s_n_llhttp__internal__n_after_start_req_31; } case 'O': { p++; goto s_n_llhttp__internal__n_after_start_req_32; } case 'P': { p++; goto s_n_llhttp__internal__n_after_start_req_33; } case 'Q': { p++; goto s_n_llhttp__internal__n_after_start_req_46; } case 'R': { p++; goto s_n_llhttp__internal__n_after_start_req_47; } case 'S': { p++; goto s_n_llhttp__internal__n_after_start_req_53; } case 'T': { p++; goto s_n_llhttp__internal__n_after_start_req_61; } case 'U': { p++; goto s_n_llhttp__internal__n_after_start_req_64; } default: { goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_method_1: s_n_llhttp__internal__n_span_start_llhttp__on_method_1: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_method_1; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_method; goto s_n_llhttp__internal__n_after_start_req; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_line_almost_done: s_n_llhttp__internal__n_res_line_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_res_line_almost_done; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; } case 13: { p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; } default: { goto s_n_llhttp__internal__n_invoke_test_lenient_flags_29; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_test_lenient_flags_30: s_n_llhttp__internal__n_invoke_test_lenient_flags_30: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; default: goto s_n_llhttp__internal__n_error_94; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_status: s_n_llhttp__internal__n_res_status: { if (p == endp) { return s_n_llhttp__internal__n_res_status; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_span_end_llhttp__on_status; } case 13: { goto s_n_llhttp__internal__n_span_end_llhttp__on_status_1; } default: { p++; goto s_n_llhttp__internal__n_res_status; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_status: s_n_llhttp__internal__n_span_start_llhttp__on_status: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_status; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_status; goto s_n_llhttp__internal__n_res_status; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_status_code_otherwise: s_n_llhttp__internal__n_res_status_code_otherwise: { if (p == endp) { return s_n_llhttp__internal__n_res_status_code_otherwise; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_invoke_test_lenient_flags_28; } case 13: { p++; goto s_n_llhttp__internal__n_res_line_almost_done; } case ' ': { p++; goto s_n_llhttp__internal__n_span_start_llhttp__on_status; } default: { goto s_n_llhttp__internal__n_error_95; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_status_code_digit_3: s_n_llhttp__internal__n_res_status_code_digit_3: { if (p == endp) { return s_n_llhttp__internal__n_res_status_code_digit_3; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; } default: { goto s_n_llhttp__internal__n_error_97; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_status_code_digit_2: s_n_llhttp__internal__n_res_status_code_digit_2: { if (p == endp) { return s_n_llhttp__internal__n_res_status_code_digit_2; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; } default: { goto s_n_llhttp__internal__n_error_99; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_status_code_digit_1: s_n_llhttp__internal__n_res_status_code_digit_1: { if (p == endp) { return s_n_llhttp__internal__n_res_status_code_digit_1; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } default: { goto s_n_llhttp__internal__n_error_101; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_after_version: s_n_llhttp__internal__n_res_after_version: { if (p == endp) { return s_n_llhttp__internal__n_res_after_version; } switch (*p) { case ' ': { p++; goto s_n_llhttp__internal__n_invoke_update_status_code; } default: { goto s_n_llhttp__internal__n_error_102; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_version_complete_1: s_n_llhttp__internal__n_invoke_llhttp__on_version_complete_1: { switch (llhttp__on_version_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_res_after_version; case 21: goto s_n_llhttp__internal__n_pause_25; default: goto s_n_llhttp__internal__n_error_90; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_89: s_n_llhttp__internal__n_error_89: { state->error = 0x9; state->reason = "Invalid HTTP version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_103: s_n_llhttp__internal__n_error_103: { state->error = 0x9; state->reason = "Invalid minor version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_http_minor: s_n_llhttp__internal__n_res_http_minor: { if (p == endp) { return s_n_llhttp__internal__n_res_http_minor; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } default: { goto s_n_llhttp__internal__n_span_end_llhttp__on_version_7; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_104: s_n_llhttp__internal__n_error_104: { state->error = 0x9; state->reason = "Expected dot"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_http_dot: s_n_llhttp__internal__n_res_http_dot: { if (p == endp) { return s_n_llhttp__internal__n_res_http_dot; } switch (*p) { case '.': { p++; goto s_n_llhttp__internal__n_res_http_minor; } default: { goto s_n_llhttp__internal__n_span_end_llhttp__on_version_8; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_105: s_n_llhttp__internal__n_error_105: { state->error = 0x9; state->reason = "Invalid major version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_http_major: s_n_llhttp__internal__n_res_http_major: { if (p == endp) { return s_n_llhttp__internal__n_res_http_major; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } default: { goto s_n_llhttp__internal__n_span_end_llhttp__on_version_9; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_version_1: s_n_llhttp__internal__n_span_start_llhttp__on_version_1: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_version_1; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_version; goto s_n_llhttp__internal__n_res_http_major; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_res: s_n_llhttp__internal__n_start_res: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_res; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob58, 5); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_span_start_llhttp__on_version_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_res; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_109; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_method_complete: s_n_llhttp__internal__n_invoke_llhttp__on_method_complete: { switch (llhttp__on_method_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_req_first_space_before_url; case 21: goto s_n_llhttp__internal__n_pause_23; default: goto s_n_llhttp__internal__n_error_1; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_or_res_method_2: s_n_llhttp__internal__n_req_or_res_method_2: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method_2; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob59, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_method; } case kMatchPause: { return s_n_llhttp__internal__n_req_or_res_method_2; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_106; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_update_type_1: s_n_llhttp__internal__n_invoke_update_type_1: { switch (llhttp__internal__c_update_type_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_version_1; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_or_res_method_3: s_n_llhttp__internal__n_req_or_res_method_3: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method_3; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob60, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_span_end_llhttp__on_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_req_or_res_method_3; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_106; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_or_res_method_1: s_n_llhttp__internal__n_req_or_res_method_1: { if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method_1; } switch (*p) { case 'E': { p++; goto s_n_llhttp__internal__n_req_or_res_method_2; } case 'T': { p++; goto s_n_llhttp__internal__n_req_or_res_method_3; } default: { goto s_n_llhttp__internal__n_error_106; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_or_res_method: s_n_llhttp__internal__n_req_or_res_method: { if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method; } switch (*p) { case 'H': { p++; goto s_n_llhttp__internal__n_req_or_res_method_1; } default: { goto s_n_llhttp__internal__n_error_106; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_method: s_n_llhttp__internal__n_span_start_llhttp__on_method: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_method; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_method; goto s_n_llhttp__internal__n_req_or_res_method; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_or_res: s_n_llhttp__internal__n_start_req_or_res: { if (p == endp) { return s_n_llhttp__internal__n_start_req_or_res; } switch (*p) { case 'H': { goto s_n_llhttp__internal__n_span_start_llhttp__on_method; } default: { goto s_n_llhttp__internal__n_invoke_update_type_2; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_load_type: s_n_llhttp__internal__n_invoke_load_type: { switch (llhttp__internal__c_load_type(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_span_start_llhttp__on_method_1; case 2: goto s_n_llhttp__internal__n_start_res; default: goto s_n_llhttp__internal__n_start_req_or_res; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_update_finish: s_n_llhttp__internal__n_invoke_update_finish: { switch (llhttp__internal__c_update_finish(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_begin; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start: s_n_llhttp__internal__n_start: { if (p == endp) { return s_n_llhttp__internal__n_start; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_start; } case 13: { p++; goto s_n_llhttp__internal__n_start; } default: { goto s_n_llhttp__internal__n_invoke_load_initial_message_completed; } } /* UNREACHABLE */; abort(); } default: /* UNREACHABLE */ abort(); } s_n_llhttp__internal__n_error_2: { state->error = 0x7; state->reason = "Invalid characters in url"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_finish_2: { switch (llhttp__internal__c_update_finish_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_start; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_initial_message_completed: { switch (llhttp__internal__c_update_initial_message_completed(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_finish_2; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_content_length: { switch (llhttp__internal__c_update_content_length(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_initial_message_completed; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_8: { state->error = 0x5; state->reason = "Data after `Connection: close`"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_3: { switch (llhttp__internal__c_test_lenient_flags_3(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_closed; default: goto s_n_llhttp__internal__n_error_8; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_2: { switch (llhttp__internal__c_test_lenient_flags_2(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_update_initial_message_completed; default: goto s_n_llhttp__internal__n_closed; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_finish_1: { switch (llhttp__internal__c_update_finish_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_test_lenient_flags_2; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_13: { state->error = 0x15; state->reason = "on_message_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_is_equal_upgrade; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_38: { state->error = 0x12; state->reason = "`on_message_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_15: { state->error = 0x15; state->reason = "on_chunk_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_40: { state->error = 0x14; state->reason = "`on_chunk_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete_1: { switch (llhttp__on_chunk_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; case 21: goto s_n_llhttp__internal__n_pause_15; default: goto s_n_llhttp__internal__n_error_40; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_2: { state->error = 0x15; state->reason = "on_message_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_pause_1; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_9: { state->error = 0x12; state->reason = "`on_message_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_1: { switch (llhttp__on_message_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_pause_1; case 21: goto s_n_llhttp__internal__n_pause_2; default: goto s_n_llhttp__internal__n_error_9; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_36: { state->error = 0xc; state->reason = "Chunk size overflow"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_10: { state->error = 0xc; state->reason = "Invalid character in chunk size"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_4: { switch (llhttp__internal__c_test_lenient_flags_4(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_chunk_size_otherwise; default: goto s_n_llhttp__internal__n_error_10; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_3: { state->error = 0x15; state->reason = "on_chunk_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_update_content_length_1; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_14: { state->error = 0x14; state->reason = "`on_chunk_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete: { switch (llhttp__on_chunk_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_update_content_length_1; case 21: goto s_n_llhttp__internal__n_pause_3; default: goto s_n_llhttp__internal__n_error_14; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_13: { state->error = 0x19; state->reason = "Missing expected CR after chunk data"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_6: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete; default: goto s_n_llhttp__internal__n_error_13; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_15: { state->error = 0x2; state->reason = "Expected LF after chunk data"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_7: { switch (llhttp__internal__c_test_lenient_flags_7(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete; default: goto s_n_llhttp__internal__n_error_15; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_body: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_body(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_data_almost_done; return s_error; } goto s_n_llhttp__internal__n_chunk_data_almost_done; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags: { switch (llhttp__internal__c_or_flags(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_start; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_4: { state->error = 0x15; state->reason = "on_chunk_header pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_is_equal_content_length; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_12: { state->error = 0x13; state->reason = "`on_chunk_header` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_chunk_header: { switch (llhttp__on_chunk_header(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_is_equal_content_length; case 21: goto s_n_llhttp__internal__n_pause_4; default: goto s_n_llhttp__internal__n_error_12; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_16: { state->error = 0x2; state->reason = "Expected LF after chunk size"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_8: { switch (llhttp__internal__c_test_lenient_flags_8(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_header; default: goto s_n_llhttp__internal__n_error_16; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_11: { state->error = 0x19; state->reason = "Missing expected CR after chunk size"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_5: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_chunk_size_almost_done; default: goto s_n_llhttp__internal__n_error_11; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_17: { state->error = 0x2; state->reason = "Invalid character in chunk extensions"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_18: { state->error = 0x2; state->reason = "Invalid character in chunk extensions"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_20: { state->error = 0x19; state->reason = "Missing expected CR after chunk extension name"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_5: { state->error = 0x15; state->reason = "on_chunk_extension_name pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_test_lenient_flags_9; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_19: { state->error = 0x22; state->reason = "`on_chunk_extension_name` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_chunk_extension_name(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete; return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_6: { state->error = 0x15; state->reason = "on_chunk_extension_name pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_size_almost_done; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_21: { state->error = 0x22; state->reason = "`on_chunk_extension_name` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_chunk_extension_name(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_1; return s_error; } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_1; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_7: { state->error = 0x15; state->reason = "on_chunk_extension_name pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_extensions; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_22: { state->error = 0x22; state->reason = "`on_chunk_extension_name` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_2: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_chunk_extension_name(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2; return s_error; } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_25: { state->error = 0x19; state->reason = "Missing expected CR after chunk extension value"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_8: { state->error = 0x15; state->reason = "on_chunk_extension_value pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_test_lenient_flags_10; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_24: { state->error = 0x23; state->reason = "`on_chunk_extension_value` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_chunk_extension_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete; return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_9: { state->error = 0x15; state->reason = "on_chunk_extension_value pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_size_almost_done; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_26: { state->error = 0x23; state->reason = "`on_chunk_extension_value` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_chunk_extension_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1; return s_error; } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_28: { state->error = 0x19; state->reason = "Missing expected CR after chunk extension value"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_11: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_chunk_size_almost_done; default: goto s_n_llhttp__internal__n_error_28; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_29: { state->error = 0x2; state->reason = "Invalid character in chunk extensions quote value"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_10: { state->error = 0x15; state->reason = "on_chunk_extension_value pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_extension_quoted_value_done; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_27: { state->error = 0x23; state->reason = "`on_chunk_extension_value` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_2: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_chunk_extension_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2; return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_3: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_chunk_extension_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_30; return s_error; } p++; goto s_n_llhttp__internal__n_error_30; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_4: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_chunk_extension_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_31; return s_error; } p++; goto s_n_llhttp__internal__n_error_31; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_11: { state->error = 0x15; state->reason = "on_chunk_extension_value pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_extensions; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_32: { state->error = 0x23; state->reason = "`on_chunk_extension_value` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_5: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_chunk_extension_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_3; return s_error; } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_3; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_6: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_chunk_extension_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_33; return s_error; } p++; goto s_n_llhttp__internal__n_error_33; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_12: { state->error = 0x15; state->reason = "on_chunk_extension_name pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_extension_value; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_23: { state->error = 0x22; state->reason = "`on_chunk_extension_name` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_3: { switch (llhttp__on_chunk_extension_name_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_chunk_extension_value; case 21: goto s_n_llhttp__internal__n_pause_12; default: goto s_n_llhttp__internal__n_error_23; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_3: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_chunk_extension_name(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_value; return s_error; } p++; goto s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_value; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_4: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_chunk_extension_name(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_34; return s_error; } p++; goto s_n_llhttp__internal__n_error_34; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_35: { state->error = 0xc; state->reason = "Invalid character in chunk size"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_mul_add_content_length: { switch (llhttp__internal__c_mul_add_content_length(state, p, endp, match)) { case 1: goto s_n_llhttp__internal__n_error_36; default: goto s_n_llhttp__internal__n_chunk_size; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_37: { state->error = 0xc; state->reason = "Invalid character in chunk size"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_body_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_body(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_finish_3: { switch (llhttp__internal__c_update_finish_3(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_body_2; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_39: { state->error = 0xf; state->reason = "Request has invalid `Transfer-Encoding`"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause: { state->error = 0x15; state->reason = "on_message_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_7: { state->error = 0x12; state->reason = "`on_message_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_message_complete: { switch (llhttp__on_message_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; case 21: goto s_n_llhttp__internal__n_pause; default: goto s_n_llhttp__internal__n_error_7; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_1: { switch (llhttp__internal__c_or_flags_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_2: { switch (llhttp__internal__c_or_flags_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_upgrade: { switch (llhttp__internal__c_update_upgrade(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_or_flags_2; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_14: { state->error = 0x15; state->reason = "Paused by on_headers_complete"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_6: { state->error = 0x11; state->reason = "User callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_headers_complete: { switch (llhttp__on_headers_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; case 1: goto s_n_llhttp__internal__n_invoke_or_flags_1; case 2: goto s_n_llhttp__internal__n_invoke_update_upgrade; case 21: goto s_n_llhttp__internal__n_pause_14; default: goto s_n_llhttp__internal__n_error_6; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete: { switch (llhttp__before_headers_complete(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_flags: { switch (llhttp__internal__c_test_flags(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete_1; default: goto s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_1: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_test_flags; default: goto s_n_llhttp__internal__n_error_5; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_17: { state->error = 0x15; state->reason = "on_chunk_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_42: { state->error = 0x14; state->reason = "`on_chunk_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete_2: { switch (llhttp__on_chunk_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; case 21: goto s_n_llhttp__internal__n_pause_17; default: goto s_n_llhttp__internal__n_error_42; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_3: { switch (llhttp__internal__c_or_flags_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_4: { switch (llhttp__internal__c_or_flags_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_upgrade_1: { switch (llhttp__internal__c_update_upgrade(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_or_flags_4; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_16: { state->error = 0x15; state->reason = "Paused by on_headers_complete"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_41: { state->error = 0x11; state->reason = "User callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_headers_complete_1: { switch (llhttp__on_headers_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; case 1: goto s_n_llhttp__internal__n_invoke_or_flags_3; case 2: goto s_n_llhttp__internal__n_invoke_update_upgrade_1; case 21: goto s_n_llhttp__internal__n_pause_16; default: goto s_n_llhttp__internal__n_error_41; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete_1: { switch (llhttp__before_headers_complete(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_headers_complete_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_flags_1: { switch (llhttp__internal__c_test_flags(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete_2; default: goto s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_43: { state->error = 0x2; state->reason = "Expected LF after headers"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_12: { switch (llhttp__internal__c_test_lenient_flags_8(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_test_flags_1; default: goto s_n_llhttp__internal__n_error_43; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_44: { state->error = 0xa; state->reason = "Invalid header token"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_field: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_field(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_5; return s_error; } p++; goto s_n_llhttp__internal__n_error_5; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_13: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_field_colon_discard_ws; default: goto s_n_llhttp__internal__n_span_end_llhttp__on_header_field; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_60: { state->error = 0xb; state->reason = "Content-Length can't be present with Transfer-Encoding"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_47: { state->error = 0xa; state->reason = "Invalid header value char"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_15: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_value_discard_ws; default: goto s_n_llhttp__internal__n_error_47; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_49: { state->error = 0xb; state->reason = "Empty Content-Length"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_18: { state->error = 0x15; state->reason = "on_header_value_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_field_start; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_48: { state->error = 0x1d; state->reason = "`on_header_value_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state: { switch (llhttp__internal__c_update_header_state(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_5: { switch (llhttp__internal__c_or_flags_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_6: { switch (llhttp__internal__c_or_flags_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_7: { switch (llhttp__internal__c_or_flags_7(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_8: { switch (llhttp__internal__c_or_flags_8(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_header_state_2: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 5: goto s_n_llhttp__internal__n_invoke_or_flags_5; case 6: goto s_n_llhttp__internal__n_invoke_or_flags_6; case 7: goto s_n_llhttp__internal__n_invoke_or_flags_7; case 8: goto s_n_llhttp__internal__n_invoke_or_flags_8; default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_header_state_1: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 2: goto s_n_llhttp__internal__n_error_49; default: goto s_n_llhttp__internal__n_invoke_load_header_state_2; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_46: { state->error = 0xa; state->reason = "Invalid header value char"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_14: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_value_discard_lws; default: goto s_n_llhttp__internal__n_error_46; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_50: { state->error = 0x2; state->reason = "Expected LF after CR"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_16: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_value_discard_lws; default: goto s_n_llhttp__internal__n_error_50; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_1: { switch (llhttp__internal__c_update_header_state_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_header_state_4: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 8: goto s_n_llhttp__internal__n_invoke_update_header_state_1; default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_52: { state->error = 0xa; state->reason = "Unexpected whitespace after header value"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_18: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_load_header_state_4; default: goto s_n_llhttp__internal__n_error_52; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_2: { switch (llhttp__internal__c_update_header_state(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_9: { switch (llhttp__internal__c_or_flags_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_2; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_10: { switch (llhttp__internal__c_or_flags_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_2; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_11: { switch (llhttp__internal__c_or_flags_7(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_2; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_12: { switch (llhttp__internal__c_or_flags_8(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_header_state_5: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 5: goto s_n_llhttp__internal__n_invoke_or_flags_9; case 6: goto s_n_llhttp__internal__n_invoke_or_flags_10; case 7: goto s_n_llhttp__internal__n_invoke_or_flags_11; case 8: goto s_n_llhttp__internal__n_invoke_or_flags_12; default: goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_53: { state->error = 0x3; state->reason = "Missing expected LF after header value"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_51: { state->error = 0x19; state->reason = "Missing expected CR after header value"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_test_lenient_flags_17; return s_error; } goto s_n_llhttp__internal__n_invoke_test_lenient_flags_17; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_value_almost_done; return s_error; } p++; goto s_n_llhttp__internal__n_header_value_almost_done; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_4: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_value_almost_done; return s_error; } goto s_n_llhttp__internal__n_header_value_almost_done; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_5: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_value_almost_done; return s_error; } p++; goto s_n_llhttp__internal__n_header_value_almost_done; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_3: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_54; return s_error; } goto s_n_llhttp__internal__n_error_54; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_19: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_value_lenient; default: goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_3; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_4: { switch (llhttp__internal__c_update_header_state(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_13: { switch (llhttp__internal__c_or_flags_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_4; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_14: { switch (llhttp__internal__c_or_flags_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_4; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_15: { switch (llhttp__internal__c_or_flags_7(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_4; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_16: { switch (llhttp__internal__c_or_flags_8(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_header_state_6: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 5: goto s_n_llhttp__internal__n_invoke_or_flags_13; case 6: goto s_n_llhttp__internal__n_invoke_or_flags_14; case 7: goto s_n_llhttp__internal__n_invoke_or_flags_15; case 8: goto s_n_llhttp__internal__n_invoke_or_flags_16; default: goto s_n_llhttp__internal__n_header_value_connection; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_5: { switch (llhttp__internal__c_update_header_state_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection_token; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_3: { switch (llhttp__internal__c_update_header_state_3(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection_ws; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_6: { switch (llhttp__internal__c_update_header_state_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection_ws; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_7: { switch (llhttp__internal__c_update_header_state_7(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection_ws; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_6: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_56; return s_error; } goto s_n_llhttp__internal__n_error_56; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_mul_add_content_length_1: { switch (llhttp__internal__c_mul_add_content_length_1(state, p, endp, match)) { case 1: goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_6; default: goto s_n_llhttp__internal__n_header_value_content_length; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_17: { switch (llhttp__internal__c_or_flags_17(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_otherwise; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_7: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_57; return s_error; } goto s_n_llhttp__internal__n_error_57; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_55: { state->error = 0x4; state->reason = "Duplicate Content-Length"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_flags_2: { switch (llhttp__internal__c_test_flags_2(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_header_value_content_length; default: goto s_n_llhttp__internal__n_error_55; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_9: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_59; return s_error; } p++; goto s_n_llhttp__internal__n_error_59; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_8: { switch (llhttp__internal__c_update_header_state_8(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_otherwise; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_8: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_58; return s_error; } p++; goto s_n_llhttp__internal__n_error_58; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_20: { switch (llhttp__internal__c_test_lenient_flags_20(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_8; default: goto s_n_llhttp__internal__n_header_value_te_chunked; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_type_1: { switch (llhttp__internal__c_load_type(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_test_lenient_flags_20; default: goto s_n_llhttp__internal__n_header_value_te_chunked; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_9: { switch (llhttp__internal__c_update_header_state_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_and_flags: { switch (llhttp__internal__c_and_flags(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_te_chunked; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_19: { switch (llhttp__internal__c_or_flags_18(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_and_flags; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_21: { switch (llhttp__internal__c_test_lenient_flags_20(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_9; default: goto s_n_llhttp__internal__n_invoke_or_flags_19; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_type_2: { switch (llhttp__internal__c_load_type(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_test_lenient_flags_21; default: goto s_n_llhttp__internal__n_invoke_or_flags_19; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_18: { switch (llhttp__internal__c_or_flags_18(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_and_flags; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_flags_3: { switch (llhttp__internal__c_test_flags_3(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_load_type_2; default: goto s_n_llhttp__internal__n_invoke_or_flags_18; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_20: { switch (llhttp__internal__c_or_flags_20(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_9; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_header_state_3: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_value_connection; case 2: goto s_n_llhttp__internal__n_invoke_test_flags_2; case 3: goto s_n_llhttp__internal__n_invoke_test_flags_3; case 4: goto s_n_llhttp__internal__n_invoke_or_flags_20; default: goto s_n_llhttp__internal__n_header_value; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_22: { switch (llhttp__internal__c_test_lenient_flags_22(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_error_60; default: goto s_n_llhttp__internal__n_header_value_discard_ws; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_flags_4: { switch (llhttp__internal__c_test_flags_4(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_test_lenient_flags_22; default: goto s_n_llhttp__internal__n_header_value_discard_ws; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_61: { state->error = 0xf; state->reason = "Transfer-Encoding can't be present with Content-Length"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_23: { switch (llhttp__internal__c_test_lenient_flags_22(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_error_61; default: goto s_n_llhttp__internal__n_header_value_discard_ws; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_flags_5: { switch (llhttp__internal__c_test_flags_2(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_test_lenient_flags_23; default: goto s_n_llhttp__internal__n_header_value_discard_ws; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_19: { state->error = 0x15; state->reason = "on_header_field_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_load_header_state; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_45: { state->error = 0x1c; state->reason = "`on_header_field_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_field_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_field(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; return s_error; } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_field_2: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_field(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; return s_error; } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_62: { state->error = 0xa; state->reason = "Invalid header token"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_10: { switch (llhttp__internal__c_update_header_state_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_general; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_header_state: { switch (llhttp__internal__c_store_header_state(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_header_field_colon; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_11: { switch (llhttp__internal__c_update_header_state_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_general; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_4: { state->error = 0x1e; state->reason = "Unexpected space after start line"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_field_start; default: goto s_n_llhttp__internal__n_error_4; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_20: { state->error = 0x15; state->reason = "on_url_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_headers_start; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_3: { state->error = 0x1a; state->reason = "`on_url_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_url_complete: { switch (llhttp__on_url_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_headers_start; case 21: goto s_n_llhttp__internal__n_pause_20; default: goto s_n_llhttp__internal__n_error_3; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_http_minor: { switch (llhttp__internal__c_update_http_minor(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_url_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_http_major: { switch (llhttp__internal__c_update_http_major(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_http_minor; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_3: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_63: { state->error = 0x7; state->reason = "Expected CRLF"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_4: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_71: { state->error = 0x17; state->reason = "Pause on PRI/Upgrade"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_72: { state->error = 0x9; state->reason = "Expected HTTP/2 Connection Preface"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_69: { state->error = 0x2; state->reason = "Expected CRLF after version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_26: { switch (llhttp__internal__c_test_lenient_flags_8(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_headers_start; default: goto s_n_llhttp__internal__n_error_69; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_68: { state->error = 0x9; state->reason = "Expected CRLF after version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_25: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_req_http_complete_crlf; default: goto s_n_llhttp__internal__n_error_68; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_70: { state->error = 0x9; state->reason = "Expected CRLF after version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_21: { state->error = 0x15; state->reason = "on_version_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_load_method_1; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_67: { state->error = 0x21; state->reason = "`on_version_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_version_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_version(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_version_complete; return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_version_complete; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_version: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_version(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_66; return s_error; } goto s_n_llhttp__internal__n_error_66; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_http_minor: { switch (llhttp__internal__c_load_http_minor(state, p, endp)) { case 9: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_1; default: goto s_n_llhttp__internal__n_span_end_llhttp__on_version; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_http_minor_1: { switch (llhttp__internal__c_load_http_minor(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_1; case 1: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_1; default: goto s_n_llhttp__internal__n_span_end_llhttp__on_version; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_http_minor_2: { switch (llhttp__internal__c_load_http_minor(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_1; default: goto s_n_llhttp__internal__n_span_end_llhttp__on_version; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_http_major: { switch (llhttp__internal__c_load_http_major(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_load_http_minor; case 1: goto s_n_llhttp__internal__n_invoke_load_http_minor_1; case 2: goto s_n_llhttp__internal__n_invoke_load_http_minor_2; default: goto s_n_llhttp__internal__n_span_end_llhttp__on_version; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_24: { switch (llhttp__internal__c_test_lenient_flags_24(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_1; default: goto s_n_llhttp__internal__n_invoke_load_http_major; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_http_minor: { switch (llhttp__internal__c_store_http_minor(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_invoke_test_lenient_flags_24; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_version_2: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_version(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_73; return s_error; } goto s_n_llhttp__internal__n_error_73; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_version_3: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_version(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_74; return s_error; } goto s_n_llhttp__internal__n_error_74; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_http_major: { switch (llhttp__internal__c_store_http_major(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_req_http_dot; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_version_4: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_version(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_75; return s_error; } goto s_n_llhttp__internal__n_error_75; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_65: { state->error = 0x8; state->reason = "Invalid method for HTTP/x.x request"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_method: { switch (llhttp__internal__c_load_method(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 1: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 2: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 3: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 4: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 5: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 6: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 7: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 8: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 9: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 10: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 11: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 12: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 13: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 14: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 15: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 16: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 17: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 18: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 19: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 20: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 21: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 22: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 23: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 24: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 25: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 26: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 27: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 28: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 29: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 30: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 31: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 32: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 33: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 34: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 46: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; default: goto s_n_llhttp__internal__n_error_65; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_78: { state->error = 0x8; state->reason = "Expected HTTP/"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_76: { state->error = 0x8; state->reason = "Expected SOURCE method for ICE/x.x request"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_method_2: { switch (llhttp__internal__c_load_method(state, p, endp)) { case 33: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; default: goto s_n_llhttp__internal__n_error_76; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_77: { state->error = 0x8; state->reason = "Invalid method for RTSP/x.x request"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_method_3: { switch (llhttp__internal__c_load_method(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 3: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 6: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 35: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 36: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 37: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 38: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 39: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 40: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 41: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 42: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 43: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 44: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 45: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; default: goto s_n_llhttp__internal__n_error_77; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_22: { state->error = 0x15; state->reason = "on_url_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_req_http_start; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_64: { state->error = 0x1a; state->reason = "`on_url_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_url_complete_1: { switch (llhttp__on_url_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_req_http_start; case 21: goto s_n_llhttp__internal__n_pause_22; default: goto s_n_llhttp__internal__n_error_64; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_5: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_6: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_7: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_8: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_79: { state->error = 0x7; state->reason = "Invalid char in url fragment start"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_9: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_10: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_11: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_80: { state->error = 0x7; state->reason = "Invalid char in url query"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_81: { state->error = 0x7; state->reason = "Invalid char in url path"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_2: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_12: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_13: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_14: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_82: { state->error = 0x7; state->reason = "Double @ in url"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_83: { state->error = 0x7; state->reason = "Unexpected char in url server"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_84: { state->error = 0x7; state->reason = "Unexpected char in url server"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_85: { state->error = 0x7; state->reason = "Unexpected char in url schema"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_86: { state->error = 0x7; state->reason = "Unexpected char in url schema"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_87: { state->error = 0x7; state->reason = "Unexpected start char in url"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_is_equal_method: { switch (llhttp__internal__c_is_equal_method(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_url_entry_normal; default: goto s_n_llhttp__internal__n_url_entry_connect; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_88: { state->error = 0x6; state->reason = "Expected space after method"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_26: { state->error = 0x15; state->reason = "on_method_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_req_first_space_before_url; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_107: { state->error = 0x20; state->reason = "`on_method_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_method_2: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_method(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_method_complete_1; return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_method_complete_1; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_method_1: { switch (llhttp__internal__c_store_method(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_span_end_llhttp__on_method_2; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_108: { state->error = 0x6; state->reason = "Invalid method encountered"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_100: { state->error = 0xd; state->reason = "Invalid status code"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_98: { state->error = 0xd; state->reason = "Invalid status code"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_96: { state->error = 0xd; state->reason = "Invalid status code"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_24: { state->error = 0x15; state->reason = "on_status_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_headers_start; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_92: { state->error = 0x1b; state->reason = "`on_status_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_status_complete: { switch (llhttp__on_status_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_headers_start; case 21: goto s_n_llhttp__internal__n_pause_24; default: goto s_n_llhttp__internal__n_error_92; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_91: { state->error = 0xd; state->reason = "Invalid response status"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_28: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; default: goto s_n_llhttp__internal__n_error_91; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_93: { state->error = 0x2; state->reason = "Expected LF after CR"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_29: { switch (llhttp__internal__c_test_lenient_flags_8(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; default: goto s_n_llhttp__internal__n_error_93; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_94: { state->error = 0x19; state->reason = "Missing expected CR after response line"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_status: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_status(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_test_lenient_flags_30; return s_error; } p++; goto s_n_llhttp__internal__n_invoke_test_lenient_flags_30; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_status_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_status(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_res_line_almost_done; return s_error; } p++; goto s_n_llhttp__internal__n_res_line_almost_done; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_95: { state->error = 0xd; state->reason = "Invalid response status"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_mul_add_status_code_2: { switch (llhttp__internal__c_mul_add_status_code(state, p, endp, match)) { case 1: goto s_n_llhttp__internal__n_error_96; default: goto s_n_llhttp__internal__n_res_status_code_otherwise; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_97: { state->error = 0xd; state->reason = "Invalid status code"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_mul_add_status_code_1: { switch (llhttp__internal__c_mul_add_status_code(state, p, endp, match)) { case 1: goto s_n_llhttp__internal__n_error_98; default: goto s_n_llhttp__internal__n_res_status_code_digit_3; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_99: { state->error = 0xd; state->reason = "Invalid status code"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_mul_add_status_code: { switch (llhttp__internal__c_mul_add_status_code(state, p, endp, match)) { case 1: goto s_n_llhttp__internal__n_error_100; default: goto s_n_llhttp__internal__n_res_status_code_digit_2; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_101: { state->error = 0xd; state->reason = "Invalid status code"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_status_code: { switch (llhttp__internal__c_update_status_code(state, p, endp)) { default: goto s_n_llhttp__internal__n_res_status_code_digit_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_102: { state->error = 0x9; state->reason = "Expected space after version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_25: { state->error = 0x15; state->reason = "on_version_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_res_after_version; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_90: { state->error = 0x21; state->reason = "`on_version_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_version_6: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_version(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_version_complete_1; return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_version_complete_1; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_version_5: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_version(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_89; return s_error; } goto s_n_llhttp__internal__n_error_89; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_http_minor_3: { switch (llhttp__internal__c_load_http_minor(state, p, endp)) { case 9: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_6; default: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_5; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_http_minor_4: { switch (llhttp__internal__c_load_http_minor(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_6; case 1: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_6; default: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_5; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_http_minor_5: { switch (llhttp__internal__c_load_http_minor(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_6; default: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_5; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_http_major_1: { switch (llhttp__internal__c_load_http_major(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_load_http_minor_3; case 1: goto s_n_llhttp__internal__n_invoke_load_http_minor_4; case 2: goto s_n_llhttp__internal__n_invoke_load_http_minor_5; default: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_5; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_27: { switch (llhttp__internal__c_test_lenient_flags_24(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_6; default: goto s_n_llhttp__internal__n_invoke_load_http_major_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_http_minor_1: { switch (llhttp__internal__c_store_http_minor(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_invoke_test_lenient_flags_27; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_version_7: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_version(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_103; return s_error; } goto s_n_llhttp__internal__n_error_103; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_version_8: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_version(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_104; return s_error; } goto s_n_llhttp__internal__n_error_104; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_http_major_1: { switch (llhttp__internal__c_store_http_major(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_res_http_dot; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_version_9: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_version(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_105; return s_error; } goto s_n_llhttp__internal__n_error_105; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_109: { state->error = 0x8; state->reason = "Expected HTTP/"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_23: { state->error = 0x15; state->reason = "on_method_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_req_first_space_before_url; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_1: { state->error = 0x20; state->reason = "`on_method_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_method: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_method(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_method_complete; return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_method_complete; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_type: { switch (llhttp__internal__c_update_type(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_end_llhttp__on_method; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_method: { switch (llhttp__internal__c_store_method(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_invoke_update_type; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_106: { state->error = 0x8; state->reason = "Invalid word encountered"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_method_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_method(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_update_type_1; return s_error; } goto s_n_llhttp__internal__n_invoke_update_type_1; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_type_2: { switch (llhttp__internal__c_update_type(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_method_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_27: { state->error = 0x15; state->reason = "on_message_begin pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_load_type; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error: { state->error = 0x10; state->reason = "`on_message_begin` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_message_begin: { switch (llhttp__on_message_begin(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_load_type; case 21: goto s_n_llhttp__internal__n_pause_27; default: goto s_n_llhttp__internal__n_error; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_28: { state->error = 0x15; state->reason = "on_reset pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_update_finish; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_110: { state->error = 0x1f; state->reason = "`on_reset` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_reset: { switch (llhttp__on_reset(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_update_finish; case 21: goto s_n_llhttp__internal__n_pause_28; default: goto s_n_llhttp__internal__n_error_110; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_initial_message_completed: { switch (llhttp__internal__c_load_initial_message_completed(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_reset; default: goto s_n_llhttp__internal__n_invoke_update_finish; } /* UNREACHABLE */; abort(); } } int llhttp__internal_execute(llhttp__internal_t* state, const char* p, const char* endp) { llparse_state_t next; /* check lingering errors */ if (state->error != 0) { return state->error; } /* restart spans */ if (state->_span_pos0 != NULL) { state->_span_pos0 = (void*) p; } next = llhttp__internal__run(state, (const unsigned char*) p, (const unsigned char*) endp); if (next == s_error) { return state->error; } state->_current = (void*) (intptr_t) next; /* execute spans */ if (state->_span_pos0 != NULL) { int error; error = ((llhttp__internal__span_cb) state->_span_cb0)(state, state->_span_pos0, (const char*) endp); if (error != 0) { state->error = error; state->error_pos = endp; return error; } } return 0; }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285824.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/build/llhttp.h����������������������������������������������������������0000644�0001751�0000177�00000073435�14607525300�020206� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� #ifndef INCLUDE_LLHTTP_H_ #define INCLUDE_LLHTTP_H_ #define LLHTTP_VERSION_MAJOR 9 #define LLHTTP_VERSION_MINOR 2 #define LLHTTP_VERSION_PATCH 1 #ifndef INCLUDE_LLHTTP_ITSELF_H_ #define INCLUDE_LLHTTP_ITSELF_H_ #ifdef __cplusplus extern "C" { #endif #include <stdint.h> typedef struct llhttp__internal_s llhttp__internal_t; struct llhttp__internal_s { int32_t _index; void* _span_pos0; void* _span_cb0; int32_t error; const char* reason; const char* error_pos; void* data; void* _current; uint64_t content_length; uint8_t type; uint8_t method; uint8_t http_major; uint8_t http_minor; uint8_t header_state; uint16_t lenient_flags; uint8_t upgrade; uint8_t finish; uint16_t flags; uint16_t status_code; uint8_t initial_message_completed; void* settings; }; int llhttp__internal_init(llhttp__internal_t* s); int llhttp__internal_execute(llhttp__internal_t* s, const char* p, const char* endp); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* INCLUDE_LLHTTP_ITSELF_H_ */ #ifndef LLLLHTTP_C_HEADERS_ #define LLLLHTTP_C_HEADERS_ #ifdef __cplusplus extern "C" { #endif enum llhttp_errno { HPE_OK = 0, HPE_INTERNAL = 1, HPE_STRICT = 2, HPE_CR_EXPECTED = 25, HPE_LF_EXPECTED = 3, HPE_UNEXPECTED_CONTENT_LENGTH = 4, HPE_UNEXPECTED_SPACE = 30, HPE_CLOSED_CONNECTION = 5, HPE_INVALID_METHOD = 6, HPE_INVALID_URL = 7, HPE_INVALID_CONSTANT = 8, HPE_INVALID_VERSION = 9, HPE_INVALID_HEADER_TOKEN = 10, HPE_INVALID_CONTENT_LENGTH = 11, HPE_INVALID_CHUNK_SIZE = 12, HPE_INVALID_STATUS = 13, HPE_INVALID_EOF_STATE = 14, HPE_INVALID_TRANSFER_ENCODING = 15, HPE_CB_MESSAGE_BEGIN = 16, HPE_CB_HEADERS_COMPLETE = 17, HPE_CB_MESSAGE_COMPLETE = 18, HPE_CB_CHUNK_HEADER = 19, HPE_CB_CHUNK_COMPLETE = 20, HPE_PAUSED = 21, HPE_PAUSED_UPGRADE = 22, HPE_PAUSED_H2_UPGRADE = 23, HPE_USER = 24, HPE_CB_URL_COMPLETE = 26, HPE_CB_STATUS_COMPLETE = 27, HPE_CB_METHOD_COMPLETE = 32, HPE_CB_VERSION_COMPLETE = 33, HPE_CB_HEADER_FIELD_COMPLETE = 28, HPE_CB_HEADER_VALUE_COMPLETE = 29, HPE_CB_CHUNK_EXTENSION_NAME_COMPLETE = 34, HPE_CB_CHUNK_EXTENSION_VALUE_COMPLETE = 35, HPE_CB_RESET = 31 }; typedef enum llhttp_errno llhttp_errno_t; enum llhttp_flags { F_CONNECTION_KEEP_ALIVE = 0x1, F_CONNECTION_CLOSE = 0x2, F_CONNECTION_UPGRADE = 0x4, F_CHUNKED = 0x8, F_UPGRADE = 0x10, F_CONTENT_LENGTH = 0x20, F_SKIPBODY = 0x40, F_TRAILING = 0x80, F_TRANSFER_ENCODING = 0x200 }; typedef enum llhttp_flags llhttp_flags_t; enum llhttp_lenient_flags { LENIENT_HEADERS = 0x1, LENIENT_CHUNKED_LENGTH = 0x2, LENIENT_KEEP_ALIVE = 0x4, LENIENT_TRANSFER_ENCODING = 0x8, LENIENT_VERSION = 0x10, LENIENT_DATA_AFTER_CLOSE = 0x20, LENIENT_OPTIONAL_LF_AFTER_CR = 0x40, LENIENT_OPTIONAL_CRLF_AFTER_CHUNK = 0x80, LENIENT_OPTIONAL_CR_BEFORE_LF = 0x100, LENIENT_SPACES_AFTER_CHUNK_SIZE = 0x200 }; typedef enum llhttp_lenient_flags llhttp_lenient_flags_t; enum llhttp_type { HTTP_BOTH = 0, HTTP_REQUEST = 1, HTTP_RESPONSE = 2 }; typedef enum llhttp_type llhttp_type_t; enum llhttp_finish { HTTP_FINISH_SAFE = 0, HTTP_FINISH_SAFE_WITH_CB = 1, HTTP_FINISH_UNSAFE = 2 }; typedef enum llhttp_finish llhttp_finish_t; enum llhttp_method { HTTP_DELETE = 0, HTTP_GET = 1, HTTP_HEAD = 2, HTTP_POST = 3, HTTP_PUT = 4, HTTP_CONNECT = 5, HTTP_OPTIONS = 6, HTTP_TRACE = 7, HTTP_COPY = 8, HTTP_LOCK = 9, HTTP_MKCOL = 10, HTTP_MOVE = 11, HTTP_PROPFIND = 12, HTTP_PROPPATCH = 13, HTTP_SEARCH = 14, HTTP_UNLOCK = 15, HTTP_BIND = 16, HTTP_REBIND = 17, HTTP_UNBIND = 18, HTTP_ACL = 19, HTTP_REPORT = 20, HTTP_MKACTIVITY = 21, HTTP_CHECKOUT = 22, HTTP_MERGE = 23, HTTP_MSEARCH = 24, HTTP_NOTIFY = 25, HTTP_SUBSCRIBE = 26, HTTP_UNSUBSCRIBE = 27, HTTP_PATCH = 28, HTTP_PURGE = 29, HTTP_MKCALENDAR = 30, HTTP_LINK = 31, HTTP_UNLINK = 32, HTTP_SOURCE = 33, HTTP_PRI = 34, HTTP_DESCRIBE = 35, HTTP_ANNOUNCE = 36, HTTP_SETUP = 37, HTTP_PLAY = 38, HTTP_PAUSE = 39, HTTP_TEARDOWN = 40, HTTP_GET_PARAMETER = 41, HTTP_SET_PARAMETER = 42, HTTP_REDIRECT = 43, HTTP_RECORD = 44, HTTP_FLUSH = 45, HTTP_QUERY = 46 }; typedef enum llhttp_method llhttp_method_t; enum llhttp_status { HTTP_STATUS_CONTINUE = 100, HTTP_STATUS_SWITCHING_PROTOCOLS = 101, HTTP_STATUS_PROCESSING = 102, HTTP_STATUS_EARLY_HINTS = 103, HTTP_STATUS_RESPONSE_IS_STALE = 110, HTTP_STATUS_REVALIDATION_FAILED = 111, HTTP_STATUS_DISCONNECTED_OPERATION = 112, HTTP_STATUS_HEURISTIC_EXPIRATION = 113, HTTP_STATUS_MISCELLANEOUS_WARNING = 199, HTTP_STATUS_OK = 200, HTTP_STATUS_CREATED = 201, HTTP_STATUS_ACCEPTED = 202, HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION = 203, HTTP_STATUS_NO_CONTENT = 204, HTTP_STATUS_RESET_CONTENT = 205, HTTP_STATUS_PARTIAL_CONTENT = 206, HTTP_STATUS_MULTI_STATUS = 207, HTTP_STATUS_ALREADY_REPORTED = 208, HTTP_STATUS_TRANSFORMATION_APPLIED = 214, HTTP_STATUS_IM_USED = 226, HTTP_STATUS_MISCELLANEOUS_PERSISTENT_WARNING = 299, HTTP_STATUS_MULTIPLE_CHOICES = 300, HTTP_STATUS_MOVED_PERMANENTLY = 301, HTTP_STATUS_FOUND = 302, HTTP_STATUS_SEE_OTHER = 303, HTTP_STATUS_NOT_MODIFIED = 304, HTTP_STATUS_USE_PROXY = 305, HTTP_STATUS_SWITCH_PROXY = 306, HTTP_STATUS_TEMPORARY_REDIRECT = 307, HTTP_STATUS_PERMANENT_REDIRECT = 308, HTTP_STATUS_BAD_REQUEST = 400, HTTP_STATUS_UNAUTHORIZED = 401, HTTP_STATUS_PAYMENT_REQUIRED = 402, HTTP_STATUS_FORBIDDEN = 403, HTTP_STATUS_NOT_FOUND = 404, HTTP_STATUS_METHOD_NOT_ALLOWED = 405, HTTP_STATUS_NOT_ACCEPTABLE = 406, HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED = 407, HTTP_STATUS_REQUEST_TIMEOUT = 408, HTTP_STATUS_CONFLICT = 409, HTTP_STATUS_GONE = 410, HTTP_STATUS_LENGTH_REQUIRED = 411, HTTP_STATUS_PRECONDITION_FAILED = 412, HTTP_STATUS_PAYLOAD_TOO_LARGE = 413, HTTP_STATUS_URI_TOO_LONG = 414, HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE = 415, HTTP_STATUS_RANGE_NOT_SATISFIABLE = 416, HTTP_STATUS_EXPECTATION_FAILED = 417, HTTP_STATUS_IM_A_TEAPOT = 418, HTTP_STATUS_PAGE_EXPIRED = 419, HTTP_STATUS_ENHANCE_YOUR_CALM = 420, HTTP_STATUS_MISDIRECTED_REQUEST = 421, HTTP_STATUS_UNPROCESSABLE_ENTITY = 422, HTTP_STATUS_LOCKED = 423, HTTP_STATUS_FAILED_DEPENDENCY = 424, HTTP_STATUS_TOO_EARLY = 425, HTTP_STATUS_UPGRADE_REQUIRED = 426, HTTP_STATUS_PRECONDITION_REQUIRED = 428, HTTP_STATUS_TOO_MANY_REQUESTS = 429, HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL = 430, HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE = 431, HTTP_STATUS_LOGIN_TIMEOUT = 440, HTTP_STATUS_NO_RESPONSE = 444, HTTP_STATUS_RETRY_WITH = 449, HTTP_STATUS_BLOCKED_BY_PARENTAL_CONTROL = 450, HTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS = 451, HTTP_STATUS_CLIENT_CLOSED_LOAD_BALANCED_REQUEST = 460, HTTP_STATUS_INVALID_X_FORWARDED_FOR = 463, HTTP_STATUS_REQUEST_HEADER_TOO_LARGE = 494, HTTP_STATUS_SSL_CERTIFICATE_ERROR = 495, HTTP_STATUS_SSL_CERTIFICATE_REQUIRED = 496, HTTP_STATUS_HTTP_REQUEST_SENT_TO_HTTPS_PORT = 497, HTTP_STATUS_INVALID_TOKEN = 498, HTTP_STATUS_CLIENT_CLOSED_REQUEST = 499, HTTP_STATUS_INTERNAL_SERVER_ERROR = 500, HTTP_STATUS_NOT_IMPLEMENTED = 501, HTTP_STATUS_BAD_GATEWAY = 502, HTTP_STATUS_SERVICE_UNAVAILABLE = 503, HTTP_STATUS_GATEWAY_TIMEOUT = 504, HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED = 505, HTTP_STATUS_VARIANT_ALSO_NEGOTIATES = 506, HTTP_STATUS_INSUFFICIENT_STORAGE = 507, HTTP_STATUS_LOOP_DETECTED = 508, HTTP_STATUS_BANDWIDTH_LIMIT_EXCEEDED = 509, HTTP_STATUS_NOT_EXTENDED = 510, HTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED = 511, HTTP_STATUS_WEB_SERVER_UNKNOWN_ERROR = 520, HTTP_STATUS_WEB_SERVER_IS_DOWN = 521, HTTP_STATUS_CONNECTION_TIMEOUT = 522, HTTP_STATUS_ORIGIN_IS_UNREACHABLE = 523, HTTP_STATUS_TIMEOUT_OCCURED = 524, HTTP_STATUS_SSL_HANDSHAKE_FAILED = 525, HTTP_STATUS_INVALID_SSL_CERTIFICATE = 526, HTTP_STATUS_RAILGUN_ERROR = 527, HTTP_STATUS_SITE_IS_OVERLOADED = 529, HTTP_STATUS_SITE_IS_FROZEN = 530, HTTP_STATUS_IDENTITY_PROVIDER_AUTHENTICATION_ERROR = 561, HTTP_STATUS_NETWORK_READ_TIMEOUT = 598, HTTP_STATUS_NETWORK_CONNECT_TIMEOUT = 599 }; typedef enum llhttp_status llhttp_status_t; #define HTTP_ERRNO_MAP(XX) \ XX(0, OK, OK) \ XX(1, INTERNAL, INTERNAL) \ XX(2, STRICT, STRICT) \ XX(25, CR_EXPECTED, CR_EXPECTED) \ XX(3, LF_EXPECTED, LF_EXPECTED) \ XX(4, UNEXPECTED_CONTENT_LENGTH, UNEXPECTED_CONTENT_LENGTH) \ XX(30, UNEXPECTED_SPACE, UNEXPECTED_SPACE) \ XX(5, CLOSED_CONNECTION, CLOSED_CONNECTION) \ XX(6, INVALID_METHOD, INVALID_METHOD) \ XX(7, INVALID_URL, INVALID_URL) \ XX(8, INVALID_CONSTANT, INVALID_CONSTANT) \ XX(9, INVALID_VERSION, INVALID_VERSION) \ XX(10, INVALID_HEADER_TOKEN, INVALID_HEADER_TOKEN) \ XX(11, INVALID_CONTENT_LENGTH, INVALID_CONTENT_LENGTH) \ XX(12, INVALID_CHUNK_SIZE, INVALID_CHUNK_SIZE) \ XX(13, INVALID_STATUS, INVALID_STATUS) \ XX(14, INVALID_EOF_STATE, INVALID_EOF_STATE) \ XX(15, INVALID_TRANSFER_ENCODING, INVALID_TRANSFER_ENCODING) \ XX(16, CB_MESSAGE_BEGIN, CB_MESSAGE_BEGIN) \ XX(17, CB_HEADERS_COMPLETE, CB_HEADERS_COMPLETE) \ XX(18, CB_MESSAGE_COMPLETE, CB_MESSAGE_COMPLETE) \ XX(19, CB_CHUNK_HEADER, CB_CHUNK_HEADER) \ XX(20, CB_CHUNK_COMPLETE, CB_CHUNK_COMPLETE) \ XX(21, PAUSED, PAUSED) \ XX(22, PAUSED_UPGRADE, PAUSED_UPGRADE) \ XX(23, PAUSED_H2_UPGRADE, PAUSED_H2_UPGRADE) \ XX(24, USER, USER) \ XX(26, CB_URL_COMPLETE, CB_URL_COMPLETE) \ XX(27, CB_STATUS_COMPLETE, CB_STATUS_COMPLETE) \ XX(32, CB_METHOD_COMPLETE, CB_METHOD_COMPLETE) \ XX(33, CB_VERSION_COMPLETE, CB_VERSION_COMPLETE) \ XX(28, CB_HEADER_FIELD_COMPLETE, CB_HEADER_FIELD_COMPLETE) \ XX(29, CB_HEADER_VALUE_COMPLETE, CB_HEADER_VALUE_COMPLETE) \ XX(34, CB_CHUNK_EXTENSION_NAME_COMPLETE, CB_CHUNK_EXTENSION_NAME_COMPLETE) \ XX(35, CB_CHUNK_EXTENSION_VALUE_COMPLETE, CB_CHUNK_EXTENSION_VALUE_COMPLETE) \ XX(31, CB_RESET, CB_RESET) \ #define HTTP_METHOD_MAP(XX) \ XX(0, DELETE, DELETE) \ XX(1, GET, GET) \ XX(2, HEAD, HEAD) \ XX(3, POST, POST) \ XX(4, PUT, PUT) \ XX(5, CONNECT, CONNECT) \ XX(6, OPTIONS, OPTIONS) \ XX(7, TRACE, TRACE) \ XX(8, COPY, COPY) \ XX(9, LOCK, LOCK) \ XX(10, MKCOL, MKCOL) \ XX(11, MOVE, MOVE) \ XX(12, PROPFIND, PROPFIND) \ XX(13, PROPPATCH, PROPPATCH) \ XX(14, SEARCH, SEARCH) \ XX(15, UNLOCK, UNLOCK) \ XX(16, BIND, BIND) \ XX(17, REBIND, REBIND) \ XX(18, UNBIND, UNBIND) \ XX(19, ACL, ACL) \ XX(20, REPORT, REPORT) \ XX(21, MKACTIVITY, MKACTIVITY) \ XX(22, CHECKOUT, CHECKOUT) \ XX(23, MERGE, MERGE) \ XX(24, MSEARCH, M-SEARCH) \ XX(25, NOTIFY, NOTIFY) \ XX(26, SUBSCRIBE, SUBSCRIBE) \ XX(27, UNSUBSCRIBE, UNSUBSCRIBE) \ XX(28, PATCH, PATCH) \ XX(29, PURGE, PURGE) \ XX(30, MKCALENDAR, MKCALENDAR) \ XX(31, LINK, LINK) \ XX(32, UNLINK, UNLINK) \ XX(33, SOURCE, SOURCE) \ XX(46, QUERY, QUERY) \ #define RTSP_METHOD_MAP(XX) \ XX(1, GET, GET) \ XX(3, POST, POST) \ XX(6, OPTIONS, OPTIONS) \ XX(35, DESCRIBE, DESCRIBE) \ XX(36, ANNOUNCE, ANNOUNCE) \ XX(37, SETUP, SETUP) \ XX(38, PLAY, PLAY) \ XX(39, PAUSE, PAUSE) \ XX(40, TEARDOWN, TEARDOWN) \ XX(41, GET_PARAMETER, GET_PARAMETER) \ XX(42, SET_PARAMETER, SET_PARAMETER) \ XX(43, REDIRECT, REDIRECT) \ XX(44, RECORD, RECORD) \ XX(45, FLUSH, FLUSH) \ #define HTTP_ALL_METHOD_MAP(XX) \ XX(0, DELETE, DELETE) \ XX(1, GET, GET) \ XX(2, HEAD, HEAD) \ XX(3, POST, POST) \ XX(4, PUT, PUT) \ XX(5, CONNECT, CONNECT) \ XX(6, OPTIONS, OPTIONS) \ XX(7, TRACE, TRACE) \ XX(8, COPY, COPY) \ XX(9, LOCK, LOCK) \ XX(10, MKCOL, MKCOL) \ XX(11, MOVE, MOVE) \ XX(12, PROPFIND, PROPFIND) \ XX(13, PROPPATCH, PROPPATCH) \ XX(14, SEARCH, SEARCH) \ XX(15, UNLOCK, UNLOCK) \ XX(16, BIND, BIND) \ XX(17, REBIND, REBIND) \ XX(18, UNBIND, UNBIND) \ XX(19, ACL, ACL) \ XX(20, REPORT, REPORT) \ XX(21, MKACTIVITY, MKACTIVITY) \ XX(22, CHECKOUT, CHECKOUT) \ XX(23, MERGE, MERGE) \ XX(24, MSEARCH, M-SEARCH) \ XX(25, NOTIFY, NOTIFY) \ XX(26, SUBSCRIBE, SUBSCRIBE) \ XX(27, UNSUBSCRIBE, UNSUBSCRIBE) \ XX(28, PATCH, PATCH) \ XX(29, PURGE, PURGE) \ XX(30, MKCALENDAR, MKCALENDAR) \ XX(31, LINK, LINK) \ XX(32, UNLINK, UNLINK) \ XX(33, SOURCE, SOURCE) \ XX(34, PRI, PRI) \ XX(35, DESCRIBE, DESCRIBE) \ XX(36, ANNOUNCE, ANNOUNCE) \ XX(37, SETUP, SETUP) \ XX(38, PLAY, PLAY) \ XX(39, PAUSE, PAUSE) \ XX(40, TEARDOWN, TEARDOWN) \ XX(41, GET_PARAMETER, GET_PARAMETER) \ XX(42, SET_PARAMETER, SET_PARAMETER) \ XX(43, REDIRECT, REDIRECT) \ XX(44, RECORD, RECORD) \ XX(45, FLUSH, FLUSH) \ XX(46, QUERY, QUERY) \ #define HTTP_STATUS_MAP(XX) \ XX(100, CONTINUE, CONTINUE) \ XX(101, SWITCHING_PROTOCOLS, SWITCHING_PROTOCOLS) \ XX(102, PROCESSING, PROCESSING) \ XX(103, EARLY_HINTS, EARLY_HINTS) \ XX(110, RESPONSE_IS_STALE, RESPONSE_IS_STALE) \ XX(111, REVALIDATION_FAILED, REVALIDATION_FAILED) \ XX(112, DISCONNECTED_OPERATION, DISCONNECTED_OPERATION) \ XX(113, HEURISTIC_EXPIRATION, HEURISTIC_EXPIRATION) \ XX(199, MISCELLANEOUS_WARNING, MISCELLANEOUS_WARNING) \ XX(200, OK, OK) \ XX(201, CREATED, CREATED) \ XX(202, ACCEPTED, ACCEPTED) \ XX(203, NON_AUTHORITATIVE_INFORMATION, NON_AUTHORITATIVE_INFORMATION) \ XX(204, NO_CONTENT, NO_CONTENT) \ XX(205, RESET_CONTENT, RESET_CONTENT) \ XX(206, PARTIAL_CONTENT, PARTIAL_CONTENT) \ XX(207, MULTI_STATUS, MULTI_STATUS) \ XX(208, ALREADY_REPORTED, ALREADY_REPORTED) \ XX(214, TRANSFORMATION_APPLIED, TRANSFORMATION_APPLIED) \ XX(226, IM_USED, IM_USED) \ XX(299, MISCELLANEOUS_PERSISTENT_WARNING, MISCELLANEOUS_PERSISTENT_WARNING) \ XX(300, MULTIPLE_CHOICES, MULTIPLE_CHOICES) \ XX(301, MOVED_PERMANENTLY, MOVED_PERMANENTLY) \ XX(302, FOUND, FOUND) \ XX(303, SEE_OTHER, SEE_OTHER) \ XX(304, NOT_MODIFIED, NOT_MODIFIED) \ XX(305, USE_PROXY, USE_PROXY) \ XX(306, SWITCH_PROXY, SWITCH_PROXY) \ XX(307, TEMPORARY_REDIRECT, TEMPORARY_REDIRECT) \ XX(308, PERMANENT_REDIRECT, PERMANENT_REDIRECT) \ XX(400, BAD_REQUEST, BAD_REQUEST) \ XX(401, UNAUTHORIZED, UNAUTHORIZED) \ XX(402, PAYMENT_REQUIRED, PAYMENT_REQUIRED) \ XX(403, FORBIDDEN, FORBIDDEN) \ XX(404, NOT_FOUND, NOT_FOUND) \ XX(405, METHOD_NOT_ALLOWED, METHOD_NOT_ALLOWED) \ XX(406, NOT_ACCEPTABLE, NOT_ACCEPTABLE) \ XX(407, PROXY_AUTHENTICATION_REQUIRED, PROXY_AUTHENTICATION_REQUIRED) \ XX(408, REQUEST_TIMEOUT, REQUEST_TIMEOUT) \ XX(409, CONFLICT, CONFLICT) \ XX(410, GONE, GONE) \ XX(411, LENGTH_REQUIRED, LENGTH_REQUIRED) \ XX(412, PRECONDITION_FAILED, PRECONDITION_FAILED) \ XX(413, PAYLOAD_TOO_LARGE, PAYLOAD_TOO_LARGE) \ XX(414, URI_TOO_LONG, URI_TOO_LONG) \ XX(415, UNSUPPORTED_MEDIA_TYPE, UNSUPPORTED_MEDIA_TYPE) \ XX(416, RANGE_NOT_SATISFIABLE, RANGE_NOT_SATISFIABLE) \ XX(417, EXPECTATION_FAILED, EXPECTATION_FAILED) \ XX(418, IM_A_TEAPOT, IM_A_TEAPOT) \ XX(419, PAGE_EXPIRED, PAGE_EXPIRED) \ XX(420, ENHANCE_YOUR_CALM, ENHANCE_YOUR_CALM) \ XX(421, MISDIRECTED_REQUEST, MISDIRECTED_REQUEST) \ XX(422, UNPROCESSABLE_ENTITY, UNPROCESSABLE_ENTITY) \ XX(423, LOCKED, LOCKED) \ XX(424, FAILED_DEPENDENCY, FAILED_DEPENDENCY) \ XX(425, TOO_EARLY, TOO_EARLY) \ XX(426, UPGRADE_REQUIRED, UPGRADE_REQUIRED) \ XX(428, PRECONDITION_REQUIRED, PRECONDITION_REQUIRED) \ XX(429, TOO_MANY_REQUESTS, TOO_MANY_REQUESTS) \ XX(430, REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL, REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL) \ XX(431, REQUEST_HEADER_FIELDS_TOO_LARGE, REQUEST_HEADER_FIELDS_TOO_LARGE) \ XX(440, LOGIN_TIMEOUT, LOGIN_TIMEOUT) \ XX(444, NO_RESPONSE, NO_RESPONSE) \ XX(449, RETRY_WITH, RETRY_WITH) \ XX(450, BLOCKED_BY_PARENTAL_CONTROL, BLOCKED_BY_PARENTAL_CONTROL) \ XX(451, UNAVAILABLE_FOR_LEGAL_REASONS, UNAVAILABLE_FOR_LEGAL_REASONS) \ XX(460, CLIENT_CLOSED_LOAD_BALANCED_REQUEST, CLIENT_CLOSED_LOAD_BALANCED_REQUEST) \ XX(463, INVALID_X_FORWARDED_FOR, INVALID_X_FORWARDED_FOR) \ XX(494, REQUEST_HEADER_TOO_LARGE, REQUEST_HEADER_TOO_LARGE) \ XX(495, SSL_CERTIFICATE_ERROR, SSL_CERTIFICATE_ERROR) \ XX(496, SSL_CERTIFICATE_REQUIRED, SSL_CERTIFICATE_REQUIRED) \ XX(497, HTTP_REQUEST_SENT_TO_HTTPS_PORT, HTTP_REQUEST_SENT_TO_HTTPS_PORT) \ XX(498, INVALID_TOKEN, INVALID_TOKEN) \ XX(499, CLIENT_CLOSED_REQUEST, CLIENT_CLOSED_REQUEST) \ XX(500, INTERNAL_SERVER_ERROR, INTERNAL_SERVER_ERROR) \ XX(501, NOT_IMPLEMENTED, NOT_IMPLEMENTED) \ XX(502, BAD_GATEWAY, BAD_GATEWAY) \ XX(503, SERVICE_UNAVAILABLE, SERVICE_UNAVAILABLE) \ XX(504, GATEWAY_TIMEOUT, GATEWAY_TIMEOUT) \ XX(505, HTTP_VERSION_NOT_SUPPORTED, HTTP_VERSION_NOT_SUPPORTED) \ XX(506, VARIANT_ALSO_NEGOTIATES, VARIANT_ALSO_NEGOTIATES) \ XX(507, INSUFFICIENT_STORAGE, INSUFFICIENT_STORAGE) \ XX(508, LOOP_DETECTED, LOOP_DETECTED) \ XX(509, BANDWIDTH_LIMIT_EXCEEDED, BANDWIDTH_LIMIT_EXCEEDED) \ XX(510, NOT_EXTENDED, NOT_EXTENDED) \ XX(511, NETWORK_AUTHENTICATION_REQUIRED, NETWORK_AUTHENTICATION_REQUIRED) \ XX(520, WEB_SERVER_UNKNOWN_ERROR, WEB_SERVER_UNKNOWN_ERROR) \ XX(521, WEB_SERVER_IS_DOWN, WEB_SERVER_IS_DOWN) \ XX(522, CONNECTION_TIMEOUT, CONNECTION_TIMEOUT) \ XX(523, ORIGIN_IS_UNREACHABLE, ORIGIN_IS_UNREACHABLE) \ XX(524, TIMEOUT_OCCURED, TIMEOUT_OCCURED) \ XX(525, SSL_HANDSHAKE_FAILED, SSL_HANDSHAKE_FAILED) \ XX(526, INVALID_SSL_CERTIFICATE, INVALID_SSL_CERTIFICATE) \ XX(527, RAILGUN_ERROR, RAILGUN_ERROR) \ XX(529, SITE_IS_OVERLOADED, SITE_IS_OVERLOADED) \ XX(530, SITE_IS_FROZEN, SITE_IS_FROZEN) \ XX(561, IDENTITY_PROVIDER_AUTHENTICATION_ERROR, IDENTITY_PROVIDER_AUTHENTICATION_ERROR) \ XX(598, NETWORK_READ_TIMEOUT, NETWORK_READ_TIMEOUT) \ XX(599, NETWORK_CONNECT_TIMEOUT, NETWORK_CONNECT_TIMEOUT) \ #ifdef __cplusplus } /* extern "C" */ #endif #endif /* LLLLHTTP_C_HEADERS_ */ #ifndef INCLUDE_LLHTTP_API_H_ #define INCLUDE_LLHTTP_API_H_ #ifdef __cplusplus extern "C" { #endif #include <stddef.h> #if defined(__wasm__) #define LLHTTP_EXPORT __attribute__((visibility("default"))) #elif defined(_WIN32) #define LLHTTP_EXPORT __declspec(dllexport) #else #define LLHTTP_EXPORT #endif typedef llhttp__internal_t llhttp_t; typedef struct llhttp_settings_s llhttp_settings_t; typedef int (*llhttp_data_cb)(llhttp_t*, const char *at, size_t length); typedef int (*llhttp_cb)(llhttp_t*); struct llhttp_settings_s { /* Possible return values 0, -1, `HPE_PAUSED` */ llhttp_cb on_message_begin; /* Possible return values 0, -1, HPE_USER */ llhttp_data_cb on_url; llhttp_data_cb on_status; llhttp_data_cb on_method; llhttp_data_cb on_version; llhttp_data_cb on_header_field; llhttp_data_cb on_header_value; llhttp_data_cb on_chunk_extension_name; llhttp_data_cb on_chunk_extension_value; /* Possible return values: * 0 - Proceed normally * 1 - Assume that request/response has no body, and proceed to parsing the * next message * 2 - Assume absence of body (as above) and make `llhttp_execute()` return * `HPE_PAUSED_UPGRADE` * -1 - Error * `HPE_PAUSED` */ llhttp_cb on_headers_complete; /* Possible return values 0, -1, HPE_USER */ llhttp_data_cb on_body; /* Possible return values 0, -1, `HPE_PAUSED` */ llhttp_cb on_message_complete; llhttp_cb on_url_complete; llhttp_cb on_status_complete; llhttp_cb on_method_complete; llhttp_cb on_version_complete; llhttp_cb on_header_field_complete; llhttp_cb on_header_value_complete; llhttp_cb on_chunk_extension_name_complete; llhttp_cb on_chunk_extension_value_complete; /* When on_chunk_header is called, the current chunk length is stored * in parser->content_length. * Possible return values 0, -1, `HPE_PAUSED` */ llhttp_cb on_chunk_header; llhttp_cb on_chunk_complete; llhttp_cb on_reset; }; /* Initialize the parser with specific type and user settings. * * NOTE: lifetime of `settings` has to be at least the same as the lifetime of * the `parser` here. In practice, `settings` has to be either a static * variable or be allocated with `malloc`, `new`, etc. */ LLHTTP_EXPORT void llhttp_init(llhttp_t* parser, llhttp_type_t type, const llhttp_settings_t* settings); LLHTTP_EXPORT llhttp_t* llhttp_alloc(llhttp_type_t type); LLHTTP_EXPORT void llhttp_free(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_type(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_http_major(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_http_minor(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_method(llhttp_t* parser); LLHTTP_EXPORT int llhttp_get_status_code(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_upgrade(llhttp_t* parser); /* Reset an already initialized parser back to the start state, preserving the * existing parser type, callback settings, user data, and lenient flags. */ LLHTTP_EXPORT void llhttp_reset(llhttp_t* parser); /* Initialize the settings object */ LLHTTP_EXPORT void llhttp_settings_init(llhttp_settings_t* settings); /* Parse full or partial request/response, invoking user callbacks along the * way. * * If any of `llhttp_data_cb` returns errno not equal to `HPE_OK` - the parsing * interrupts, and such errno is returned from `llhttp_execute()`. If * `HPE_PAUSED` was used as a errno, the execution can be resumed with * `llhttp_resume()` call. * * In a special case of CONNECT/Upgrade request/response `HPE_PAUSED_UPGRADE` * is returned after fully parsing the request/response. If the user wishes to * continue parsing, they need to invoke `llhttp_resume_after_upgrade()`. * * NOTE: if this function ever returns a non-pause type error, it will continue * to return the same error upon each successive call up until `llhttp_init()` * is called. */ LLHTTP_EXPORT llhttp_errno_t llhttp_execute(llhttp_t* parser, const char* data, size_t len); /* This method should be called when the other side has no further bytes to * send (e.g. shutdown of readable side of the TCP connection.) * * Requests without `Content-Length` and other messages might require treating * all incoming bytes as the part of the body, up to the last byte of the * connection. This method will invoke `on_message_complete()` callback if the * request was terminated safely. Otherwise a error code would be returned. */ LLHTTP_EXPORT llhttp_errno_t llhttp_finish(llhttp_t* parser); /* Returns `1` if the incoming message is parsed until the last byte, and has * to be completed by calling `llhttp_finish()` on EOF */ LLHTTP_EXPORT int llhttp_message_needs_eof(const llhttp_t* parser); /* Returns `1` if there might be any other messages following the last that was * successfully parsed. */ LLHTTP_EXPORT int llhttp_should_keep_alive(const llhttp_t* parser); /* Make further calls of `llhttp_execute()` return `HPE_PAUSED` and set * appropriate error reason. * * Important: do not call this from user callbacks! User callbacks must return * `HPE_PAUSED` if pausing is required. */ LLHTTP_EXPORT void llhttp_pause(llhttp_t* parser); /* Might be called to resume the execution after the pause in user's callback. * See `llhttp_execute()` above for details. * * Call this only if `llhttp_execute()` returns `HPE_PAUSED`. */ LLHTTP_EXPORT void llhttp_resume(llhttp_t* parser); /* Might be called to resume the execution after the pause in user's callback. * See `llhttp_execute()` above for details. * * Call this only if `llhttp_execute()` returns `HPE_PAUSED_UPGRADE` */ LLHTTP_EXPORT void llhttp_resume_after_upgrade(llhttp_t* parser); /* Returns the latest return error */ LLHTTP_EXPORT llhttp_errno_t llhttp_get_errno(const llhttp_t* parser); /* Returns the verbal explanation of the latest returned error. * * Note: User callback should set error reason when returning the error. See * `llhttp_set_error_reason()` for details. */ LLHTTP_EXPORT const char* llhttp_get_error_reason(const llhttp_t* parser); /* Assign verbal description to the returned error. Must be called in user * callbacks right before returning the errno. * * Note: `HPE_USER` error code might be useful in user callbacks. */ LLHTTP_EXPORT void llhttp_set_error_reason(llhttp_t* parser, const char* reason); /* Returns the pointer to the last parsed byte before the returned error. The * pointer is relative to the `data` argument of `llhttp_execute()`. * * Note: this method might be useful for counting the number of parsed bytes. */ LLHTTP_EXPORT const char* llhttp_get_error_pos(const llhttp_t* parser); /* Returns textual name of error code */ LLHTTP_EXPORT const char* llhttp_errno_name(llhttp_errno_t err); /* Returns textual name of HTTP method */ LLHTTP_EXPORT const char* llhttp_method_name(llhttp_method_t method); /* Returns textual name of HTTP status */ LLHTTP_EXPORT const char* llhttp_status_name(llhttp_status_t status); /* Enables/disables lenient header value parsing (disabled by default). * * Lenient parsing disables header value token checks, extending llhttp's * protocol support to highly non-compliant clients/server. No * `HPE_INVALID_HEADER_TOKEN` will be raised for incorrect header values when * lenient parsing is "on". * * **Enabling this flag can pose a security issue since you will be exposed to * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_headers(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of conflicting `Transfer-Encoding` and * `Content-Length` headers (disabled by default). * * Normally `llhttp` would error when `Transfer-Encoding` is present in * conjunction with `Content-Length`. This error is important to prevent HTTP * request smuggling, but may be less desirable for small number of cases * involving legacy servers. * * **Enabling this flag can pose a security issue since you will be exposed to * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of `Connection: close` and HTTP/1.0 * requests responses. * * Normally `llhttp` would error on (in strict mode) or discard (in loose mode) * the HTTP request/response after the request/response with `Connection: close` * and `Content-Length`. This is important to prevent cache poisoning attacks, * but might interact badly with outdated and insecure clients. With this flag * the extra request/response will be parsed normally. * * **Enabling this flag can pose a security issue since you will be exposed to * poisoning attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_keep_alive(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of `Transfer-Encoding` header. * * Normally `llhttp` would error when a `Transfer-Encoding` has `chunked` value * and another value after it (either in a single header or in multiple * headers whose value are internally joined using `, `). * This is mandated by the spec to reliably determine request body size and thus * avoid request smuggling. * With this flag the extra value will be parsed normally. * * **Enabling this flag can pose a security issue since you will be exposed to * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_transfer_encoding(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of HTTP version. * * Normally `llhttp` would error when the HTTP version in the request or status line * is not `0.9`, `1.0`, `1.1` or `2.0`. * With this flag the invalid value will be parsed normally. * * **Enabling this flag can pose a security issue since you will allow unsupported * HTTP versions. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_version(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of additional data received after a message ends * and keep-alive is disabled. * * Normally `llhttp` would error when additional unexpected data is received if the message * contains the `Connection` header with `close` value. * With this flag the extra data will discarded without throwing an error. * * **Enabling this flag can pose a security issue since you will be exposed to * poisoning attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_data_after_close(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of incomplete CRLF sequences. * * Normally `llhttp` would error when a CR is not followed by LF when terminating the * request line, the status line, the headers or a chunk header. * With this flag only a CR is required to terminate such sections. * * **Enabling this flag can pose a security issue since you will be exposed to * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_optional_lf_after_cr(llhttp_t* parser, int enabled); /* * Enables/disables lenient handling of line separators. * * Normally `llhttp` would error when a LF is not preceded by CR when terminating the * request line, the status line, the headers, a chunk header or a chunk data. * With this flag only a LF is required to terminate such sections. * * **Enabling this flag can pose a security issue since you will be exposed to * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_optional_cr_before_lf(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of chunks not separated via CRLF. * * Normally `llhttp` would error when after a chunk data a CRLF is missing before * starting a new chunk. * With this flag the new chunk can start immediately after the previous one. * * **Enabling this flag can pose a security issue since you will be exposed to * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_optional_crlf_after_chunk(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of spaces after chunk size. * * Normally `llhttp` would error when after a chunk size is followed by one or more * spaces are present instead of a CRLF or `;`. * With this flag this check is disabled. * * **Enabling this flag can pose a security issue since you will be exposed to * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_spaces_after_chunk_size(llhttp_t* parser, int enabled); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* INCLUDE_LLHTTP_API_H_ */ #endif /* INCLUDE_LLHTTP_H_ */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000033�00000000000�010211� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������27 mtime=1713285830.543115 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/docs/�������������������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�016352� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/docs/releasing.md�������������������������������������������������������0000644�0001751�0000177�00000004735�14607525267�020663� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# How to release a new version of llhttp ## What does releasing involves? These are the required steps to release a new version of llhttp: 1. Increase the version number. 2. Build it locally. 3. Create a new build and push it to GitHub. 4. Create a new release on GitHub release. > Do not try to execute the commands in the Makefile manually. This is really error-prone! ## Which commands to run? First of all, make sure you have [GitHub CLI](https://cli.github.com) installed and configured. While this is not strictly necessary, it will make your life way easier. As a preliminary check, lint the code, run the build command and execute the test suite locally: ``` npm run lint npm run build npm run test ``` If all goes good, you are ready to go! To release a new version of llhttp, first increase the version using `npm` and make sure it also execute the `postversion` script. Unless you have some very specific setup, this should happen automatically, which means the following command will suffice: ``` npm version [major|minor|patch] ``` The command will increase the version and then will create a new release branch on GitHub. > Even thought there is a package on NPM, it is not updated anymore. NEVER RUN `npm publish`! It's now time to create the release on GitHub. If you DON'T have GitHub CLI available, skip to the next section, otherwise run the following command: ``` npm run github-release ``` This command will create a draft release on GitHub and then show it in your browser so you can review and publish it. Congratulation, you are all set! ## Create a GitHub release without GitHub CLI > From now on, `$VERSION` will be the new version you are trying to create, including the leading letter, for instance `v6.0.9`. If you don't want to or can't use GitHub CLI, you can still create the release on GitHub following this procedure. 1. Go on GitHub and start creating a new release which targets tag `$VERSION`. Generate the notes using the `Generate release notes` button. 2. At the bottom of the generated notes, make sure the previous and current version in the notes are correct. The last line should be something like this: `**Full Changelog**: https://github.com/nodejs/llhttp/compare/v6.0.8...v6.0.9` In this case it says we are creating release `v6.0.9` and we are showing the changes between `v6.0.8` and `v6.0.9`. 3. Change the target of the release to point to tag `release/$VERSION`. 4. Review and then publish the release. Congratulation, you are all set!�����������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/eslint.json�������������������������������������������������������������0000644�0001751�0000177�00000002347�14607525267�017626� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "extends": [ "eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:@stylistic/recommended-extends" ], "rules": { "max-len": [ "error", { "code": 120 } ], "no-console": "error", "@typescript-eslint/no-unused-vars": "error", "@stylistic/array-bracket-spacing": ["error", "always"], "@stylistic/operator-linebreak": ["error", "after"], "@stylistic/brace-style": ["error", "1tbs", { "allowSingleLine": true }], "@stylistic/member-delimiter-style": ["error", { "overrides": { "interface": { "multiline": { "delimiter": "semi", "requireLast": true } } } }], "indent": "off", "@stylistic/indent": ["error", 2, { "SwitchCase": 1, "FunctionDeclaration": { "parameters": "first" }, "FunctionExpression": { "parameters": "first" } }], "semi": "off", "@stylistic/semi": ["error", "always"] }, "parser": "@typescript-eslint/parser", "parserOptions": { "project": [ "tsconfig.eslint.json" ], "sourceType": "module", "ecmaFeatures": { "jsx": true, "modules": true, "experimentalObjectRestSpread": true } } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000033�00000000000�010211� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������27 mtime=1713285830.543115 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/examples/���������������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�017240� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/examples/wasm.ts��������������������������������������������������������0000644�0001751�0000177�00000014631�14607525267�020571� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * A minimal Parser that mimicks a small fraction of the Node.js parser * API. * To run: * - `npm run build-wasm` * - `npx ts-node examples/wasm.ts` */ import { readFileSync } from 'fs'; import { resolve } from 'path'; import * as constants from '../build/wasm/constants'; const bin = readFileSync(resolve(__dirname, '../build/wasm/llhttp.wasm')); const mod = new WebAssembly.Module(bin); const REQUEST = constants.TYPE.REQUEST; const RESPONSE = constants.TYPE.RESPONSE; const kOnMessageBegin = 0; const kOnHeaders = 1; const kOnHeadersComplete = 2; const kOnBody = 3; const kOnMessageComplete = 4; const kOnExecute = 5; const kPtr = Symbol('kPtr'); const kUrl = Symbol('kUrl'); const kStatusMessage = Symbol('kStatusMessage'); const kHeadersFields = Symbol('kHeadersFields'); const kHeadersValues = Symbol('kHeadersValues'); const kBody = Symbol('kBody'); const kReset = Symbol('kReset'); const kCheckErr = Symbol('kCheckErr'); const cstr = (ptr: number, len: number): string => Buffer.from(memory.buffer, ptr, len).toString(); const wasm_on_message_begin = (p: number) => { const i = instMap.get(p); i[kReset](); return i[kOnMessageBegin](); }; const wasm_on_url = (p: number, at: number, length: number) => { instMap.get(p)[kUrl] = cstr(at, length); return 0; }; const wasm_on_status = (p: number, at: number, length: number) => { instMap.get(p)[kStatusMessage] = cstr(at, length); return 0; }; const wasm_on_header_field = (p: number, at: number, length: number) => { const i= instMap.get(p) i[kHeadersFields].push(cstr(at, length)); return 0; }; const wasm_on_header_value = (p: number, at: number, length: number) => { const i = instMap.get(p); i[kHeadersValues].push(cstr(at, length)); return 0; }; const wasm_on_headers_complete = (p: number) => { const i = instMap.get(p); const type = get_type(p); const versionMajor = get_version_major(p); const versionMinor = get_version_minor(p); const rawHeaders = []; let method; let url; let statusCode; let statusMessage; const upgrade = get_upgrade(p); const shouldKeepAlive = should_keep_alive(p); for (let c = 0; c < i[kHeadersFields].length; c++) { rawHeaders.push(i[kHeadersFields][c], i[kHeadersValues][c]) } if (type === HTTPParser.REQUEST) { method = constants.METHODS[get_method(p)]; url = i[kUrl]; } else if (type === HTTPParser.RESPONSE) { statusCode = get_status_code(p); statusMessage = i[kStatusMessage]; } return i[kOnHeadersComplete](versionMajor, versionMinor, rawHeaders, method, url, statusCode, statusMessage, upgrade, shouldKeepAlive); }; const wasm_on_body = (p: number, at: number, length: number) => { const i = instMap.get(p); const body = Buffer.from(memory.buffer, at, length); return i[kOnBody](body); }; const wasm_on_message_complete = (p: number) => { return instMap.get(p)[kOnMessageComplete](); }; const instMap = new Map(); const inst = new WebAssembly.Instance(mod, { env: { wasm_on_message_begin, wasm_on_url, wasm_on_status, wasm_on_header_field, wasm_on_header_value, wasm_on_headers_complete, wasm_on_body, wasm_on_message_complete, }, }); const memory = inst.exports.memory as any; const alloc = inst.exports.llhttp_alloc as CallableFunction; const malloc = inst.exports.malloc as CallableFunction; const execute = inst.exports.llhttp_execute as CallableFunction; const get_type = inst.exports.llhttp_get_type as CallableFunction; const get_upgrade = inst.exports.llhttp_get_upgrade as CallableFunction; const should_keep_alive = inst.exports.llhttp_should_keep_alive as CallableFunction; const get_method = inst.exports.llhttp_get_method as CallableFunction; const get_status_code = inst.exports.llhttp_get_status_code as CallableFunction; const get_version_minor = inst.exports.llhttp_get_http_minor as CallableFunction; const get_version_major = inst.exports.llhttp_get_http_major as CallableFunction; const get_error_reason = inst.exports.llhttp_get_error_reason as CallableFunction; const free = inst.exports.free as CallableFunction; const initialize = inst.exports._initialize as CallableFunction; initialize(); // wasi reactor class HTTPParser { static REQUEST = REQUEST; static RESPONSE = RESPONSE; static kOnMessageBegin = kOnMessageBegin; static kOnHeaders = kOnHeaders; static kOnHeadersComplete = kOnHeadersComplete; static kOnBody = kOnBody; static kOnMessageComplete = kOnMessageComplete; static kOnExecute = kOnExecute; [kPtr]: number; [kUrl]: string; [kStatusMessage]: null|string; [kHeadersFields]: []|[string]; [kHeadersValues]: []|[string]; [kBody]: null|Buffer; constructor(type: constants.TYPE) { this[kPtr] = alloc(constants.TYPE[type]); instMap.set(this[kPtr], this); this[kUrl] = ''; this[kStatusMessage] = null; this[kHeadersFields] = []; this[kHeadersValues] = []; this[kBody] = null; } [kReset]() { this[kUrl] = ''; this[kStatusMessage] = null; this[kHeadersFields] = []; this[kHeadersValues] = []; this[kBody] = null; } [kOnMessageBegin]() { return 0; } [kOnHeaders](rawHeaders: [string]) {} [kOnHeadersComplete](versionMajor: number, versionMinor: number, rawHeaders: [string], method: string, url: string, statusCode: number, statusMessage: string, upgrade: boolean, shouldKeepAlive: boolean) { return 0; } [kOnBody](body: Buffer) { this[kBody] = body; return 0; } [kOnMessageComplete]() { return 0; } destroy() { instMap.delete(this[kPtr]); free(this[kPtr]); } execute(data: Buffer) { const ptr = malloc(data.byteLength); const u8 = new Uint8Array(memory.buffer); u8.set(data, ptr); const ret = execute(this[kPtr], ptr, data.length); free(ptr); this[kCheckErr](ret); return ret; } [kCheckErr](n: number) { if (n === constants.ERROR.OK) { return; } const ptr = get_error_reason(this[kPtr]); const u8 = new Uint8Array(memory.buffer); const len = u8.indexOf(0, ptr) - ptr; throw new Error(cstr(ptr, len)); } } { const p = new HTTPParser(HTTPParser.REQUEST); p.execute(Buffer.from([ 'POST /owo HTTP/1.1', 'X: Y', 'Content-Length: 9', '', 'uh, meow?', '', ].join('\r\n'))); console.log(p); p.destroy(); } { const p = new HTTPParser(HTTPParser.RESPONSE); p.execute(Buffer.from([ 'HTTP/1.1 200 OK', 'X: Y', 'Content-Length: 9', '', 'uh, meow?' ].join('\r\n'))); console.log(p); p.destroy(); } �������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000034�00000000000�010212� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������28 mtime=1713285830.5471148 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/images/�����������������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�016667� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/images/http-loose-none.png����������������������������������������������0000644�0001751�0000177�00015477766�14607525267�022476� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����#`���1><���sRGB���@�IDATxwWս/CT ATKQc1&''Mb{QSF(]FED {J =w4qw=Ϟګ|;0~TZ4 @� @� @� @� @� @� @� @� @� @�%.Pw @� @� @� @� @� @� @� @� @� @@) ? @� @� @� @� @� @� @� @� @� @@= 'h @� @� @� @� @� @� @� @� @� @�4$3gf̘12qL<9SLӳ +EժUm6jC*_- @� @� @� @� @� @� @� @� @� @� |-ASN?~:>lye�duu| +ve6Kǎ˫SN< @� @� @� @� @� @� @� @� @� @�@J[҅[1"wqG Çgʔ)iժUr2qM6I۶mkN˖-ӢE4o<M6-s&O &+wy'?|&/gڴiYk뮻fv/#Z� @� @� @� @� @� @� @� @� @� @%Y>^}չ馛R6v!{X5UWW'̃>X^E?ӧO @� @� @� @� @� @� @� @� @� @�_b4iR\x5jTrtAݻwzz=irAE'|8 |czf @� @� @� @� @� @� @� @� @� @�Y@^p9s3q7w\t No1 СC3> S @� @� @� @� @� @� @� @� @� | Ț\|93y?'5\=o~[n%;w矟vء֫0 @� @� @� @� @� @� @� @� @� @`*9rdvix9ow],λvoΓO>VX!]t '?pK� @� @� @� @� @� @� @� @� @� ɹ瞛Ν;Yf)!g5֘f 7 2$W\qE m6<HC+S= @� @� @� @� @� @� @� @� @� @2"AqwYgU)vq83Ϥ8Ǯs9g>  @� @� @� @� @� @� @� @� @� @�)Шw}7={̄ 2hРtya.5;<z9?9UUԜU @� @� @� @� @� @� @� @� @� @@ 4Y^{YeU裏} ;uw'g 6a1cK& ʹTU @� @� @� @� @� @� @� @� @� @@ 4mk׮iժUYڿ:4={L߾}se-Q? @� @� @� @� @� @� @� @� @� �Tɓo;7]wݵ\@&Kn\yկ~ &  @� @� @� @� @� @� @� @� @� @� hTSiu'ꫯΓO> 6`~Co^xa ]Yf8qbN3gWӦMӢEYc5Һu묽СC6pt1+2iP @� @� @� @� @� @� @� @� @� @ 7oϾ뮻.}]tP|Ys5@ƍ*ӦMɓ3iҤ?>ƍѣ˫FA=z^{핵Zkq @� @� @� @� @� @� @� @� @� @`a9}l~s.z丏>(lI:ꨜs9 u3f7O?'x"C͈#RC9pf͚-z @� @� @� @� @� @� @� @� @� @�K< ??i^z饬zKI ?r)y嗳~&N;S ּ[kOqM~5M"@� @� @� @� @� @� @� @� @� @�/*&{nP(ViӦMoWw 4(oV[mv)<̬5>t֭ jrW(u<崫*+RƌoE0Q7nEX @� @� @� @� @� @� @� @� @� < |a}WwqjSP.8*jjڴi+ӿrm۶͟2�rUVIΝsw7.Æ {wZ+~u |geu߾usRřD� @� @� @� @� @� @� @� @� @�C/ k`-آH3\,͜93{Gf̘X֫[裏Θ1cRe.A<0<HڵkW._E?Fyٿ-  @� @� @� @� @� @� @� @� @� @�y |aC=o}[󞵘[9C[pi?555u]7EpСCM6_=zCIUUUZko>zJ6m2`EsW'mQ}N� @� @� @� @� @� @� @� @� @�[` _;<Y_ѣ_*{w?ik]v%cƌ}/=X)ݻg}ɭ:kvm9SI3?sg9򗿜5gq<.<Xj57n/8cǎͥ^:duIY\gy'R^ͨQrǗAW^y1C:stoڣp=묳r9.}?~Ѻ @� @� @� @� @� @� @� @� @� @�/++&l3day.\iW.C v!GqD]w 6 رc2а},B*vGf+#{o +l߾}6trG߿|^\? :ŵf:Ec^ʳiժU?AL>?я.\pAfҤI9rd:YAשۧ>q}YN8}_~y9}u @� @� @� @� @� @� @� @� @� @�+r5Xc3k8t4iҤ^{k׮s6m[:tn햢̙3V[Yf{3cƌY!W_}uw^+B!_)-[QFZ;w.,kfƍkw9>lN?Y_f (bYZ}\qo[=Cξά0ѣGrb觟~{4ٳ˹ @� @� @� @� @� @� @� @� @� @� +>+J ]w!Ex`3f̘\{s-P7ֵbc=N:e OGmۖϽzJUUU~^tξ֬ p3Z ͵ԩS3a„ ".EۧwUD2{!͛7:S^_fms @� @� @� @� @� @� @� @� @� @�d V[t裏OxeF 787|\جY|ar%dk|Xƍm::<923gΜ>S0~j_0_=E @� @� @� @� @� @� @� @� @� @�+r5(g3f33ҥK<S9C駟#}7*7xٳg/fm6̾ւ.cǦhQ-'| !ERQ.V{,I� @� @� @� @� @� @� @� @� @� 7h 9rb;oO>9kV\z饙9sf\Q8uY{})$[M43bbnuu|¥cǎ_z&:4?<AӧO_ycZ @� @� @� @� @� @� @� @� @� @`i+ԩS Xt>(g};\۶m[<&M}~zn?/Go|;vly{ݏb"0X7gaŚ?pvE8n~#8"lM]\veE]4O>5*'L0oQfc^ @� @� @� @� @� @� @� @� @� @@\AE{n-3fXlNZE~uQO~>\-[o'x"}ɞ{_iӦMzX^yYswgI~r92bFs=7߼W?C?~|303<3Ewy W^ɮƍ>s|q^z)vX<Sˀ38+B7�Ϸbiu{r!!Cg \5!@� @� @� @� @� @� @� @� @� @�hTSi~Wa?/̙3S]]]K` RU5ge1Q\of}>}zkW,,([hƍW/p(,"r6mڴ <8 ()ŢV[-&L}żo~l&[2lذ2 ~-sB� @� @� @� @� @� @� @� @� @�,}_YcwO&Mr=,}Z{hrN(wxr饗.˧~ZOΘ1cEIf=|ǹ+ѣGOί~ AA @� @� @� @� @� @� @� @� @� @�eLɼ_:ݻwwߝk^Ö38#[N߾}ǿ/y'ҴiL>t=:u,?wuW򪪪GQ@ny @� @� @� @� @� @� @� @� @� @�]F56y͛k2?bĈt%KiӦ`,^zeȑy뭷R#k~*Wp 7{m;/'tRS @� @� @� @� @� @� @� @� @� @!7/fmra .h{ W^ye9L~fe'*םkrZvsnҭ[;GqmoܐJR  @� @� @� @� @� @� @� @� @�h ,ү_\{9CADa5559s=C*LIFwn=vج# @� @� @� @� @� @� @� @� @� |T-EO~y䑹{4|[3xuy U9Ix*缢r\U!WQn'OS @� @� @� @� @� @� @� @� @� \ 4r[n)w}AS?rA4y>(K>3Ϭ3U<灕9/R6d @� @� @� @� @� @� @� @� @� @�?9rF׿5_zkva-cO#8" C Z̨Q㏛V|fk+AU[VWW @� @� @� @� @� @� @� @� @� @ iTSi Q =?1?rYgI& ;=zt=J 80{"<yrr3rcdڴI>/& @� @� @� @� @� @� @� @� @� @�ˈ"A֝/lVk}Zj ʱo|ӱcǯ|ӓ#P曓cSY_>� @� @� @� @� @� @� @� @� @�XY><<yrxYgeԩ_f}Λo8 }I޽c-`M&={&_~rn%\lu&/~ʞ_; @� @� @� @� @� @� @� @� @� @�zhTSi_vӧc~_Fy?CҸq/d?~|;R[/!ɠAo$뮛Je*I׮I՗謗mB� @� @� @� @� @� @� @� @� @�|IYѣsg䪫ʆnN;-}M4ロ??\pAZhgя~f͚}m5Y YCb*I^4ifc @� @� @� @� @� @� @� @� @� @`1 , Ⱥz^}r5פe˖9#sf7ܫs=d۲k椓Nʉ'VZki^¿B!GJV_=Pd5S? @� @� @� @� @� @� @� @� @� kda?\z饹of-ȁ^zSN'NߟA[onݻw6m^\ z*Crᄅԟw*!k' @� @� @� @� @� @� @� @� @� @�!D 9sf V1ovV]ut-kocǎY{S6\3+ˣ>|0O>d.]}Im4wkC!`ȡCf͒=ʱp F� @� @� @� @� @� @� @� @� @�4p%?2dHy=Cy!u%m۶e0d˖-ӢE4o<M6͔)Skə0aB{zw/gԩiܸq6|2d{)6m|}ddF= <d5#:� @� @� @� @� @� @� @� @� @�X&5ƍKyesG|A&N">}zYBᐭZ*#ve6Kǎb>8PȻN*�̤wSqZ4� @� @� @� @� @� @� @� @� @�4l50 ߿:iܸa5*ٙdРۓIvJ \\ @� @� @� @� @� @� @� @� @� @/Avfɵ|i LI[oM>(ԩ6t @� @� @� @� @� @� @� @� @� @_kdСIuumIO?ly^ӧ'_ 9xp2fLI޵l8v @� @� @� @� @� @� @� @� @� -򢋒x{96|sРy'p@"rFV$@� @� @� @� @� @� @� @� @� @�*5VolY2yv.:_}@1"86גuI@>}nݒ%[  @� @� @� @� @� @� @� @� @� @$uT2}M$~8g%+Pov%}trIk'ZY� @� @� @� @� @� @� @� @� @�,y$sc~&oK^|1O+i&9[)S. @� @� @� @� @� @� @� @� @� @�eEQMaFN6,쳹wlҤ6hKxdРdGVJ';Wz; @� @� @� @� @� @� @� @� @�XZ5r=L/a^rMC$M&{_ҪUèS @� @� @� @� @� @� @� @� @� @! [%$;mMF_q7'&GRSQ ٫WҺuéU% @� @� @� @� @� @� @� @� @� @!Kf%}6#m0>$PȻJMKv%ݻj׮a֭* @� @� @� @� @� @� @� @� @� PYsN2lX2ujҴi2}\adʔ,]&%wޙ T9qbҹsҧOm(,]Q- @� @� @� @� @� @� @� @� @�X\YWi'睗3f$͚%ŷ}+X/PsO2p`r-Ʉ ɶֆBo  @� @� @� @� @� @� @� @� @� @ kd]Q'['7ޘjw_rȑɫ&_7}YNx6rj { 7:  @� @� @� @� @� @� @� @� @�[k qWWQ'&M$͛Ӳ)0sf2lX2hPIE0d.IFٝ� @� @� @� @� @� @� @� @� @�_%?O0[~|NK |啤]k!w%ix @� @� @� @� @� @� @� @� @� @(AvlErEK#3ԆB>np@m({$M. O� @� @� @� @� @� @� @� @� @�@ANjmG,CYuxB>xҪUᄉ{해hI @� @� @� @� @� @� @� @� @� @` ȇNv9yd }`'\|o T Y;*B P޲J @� @� @� @� @� @� @� @� @� @`I{W?$￿$cEn 2$i8sPOV[mypN @� @� @� @� @� @� @� @� @�X=Mo\ڐƏOn6{3w +iӦ!W6 @� @� @� @� @� @� @� @� @�X=uӒdybvkC!32%֭6 @� @� @� @� @� @� @� @� @� @�5򥗒6KOvqbX}uW2hPr?Cm(dF-ݬE� @� @� @� @� @� @� @� @� @�,PAW^{lIf .K`ڴ{oNƏO޺6Od-N!@� @� @� @� @� @� @� @� @� @� (1">|B`I ̘ R yM'n] vK @� @� @� @� @� @� @� @� @� @*PA]$o+s74ᇓAj7L_65iԨU @� @� @� @� @� @� @� @� @�XZӓQwC`E;'睗FI~'ݺ%%'w_2cƂ[ZF;6 Ⱦs=]SIѣGgSB @� @� @� @� @� @� @� @� @� 8-駓SvX[n䷿M^|1y٤䡇=HڴI9&dڴŻo}V,ֵ &^ޞI&u3ggƎJ @� @� @� @� @� @� @� @� @� @`Y #UVI6lY#teU`-䩧W^IN=6r}֭O J> {T,g̘Q馛Nhp7nܸbJ^xTU۟  @� @� @� @� @� @� @� @� @�]zKZ{dF]L'[v6ڨ6r䭷&=:wjC!:(Oi?555 ,BbkժU%4 @� @� @� @� @� @� @� @� @� @`hR_g1"w>@ɏ\{}a2xp2p`rIo%}$ƒc}\uUyӾR`Ϟ=ӷorHygsLYgg+]w]~w;رc?)FJ˖-sG˹^zi?ϳ>[ }.?|ƶn:*zjMVu-'|rxrN&M sWoxֆUn^r%QC+g˹[U\%ׇ_HNʽV]uY= @� @� @� @� @� @� @� @� @� @TG!'&/C}f'ЦMrqO2fL2`@RU_u7Q $|jKeݻE ZkC9$|pM7ݴ|>+Z1礓NJˠ"\,ovک ,%?de]V~/~ec޽ƻ;[mUy䑲S7_A)_}2X`v+v??+Ԕ{?;찊kU|ߟ3(C(=J�gs9ܹs&O\| @� @� @� @� @� @� @� @� @� Р%'3wlPgW *jI%0ܒ\uU)$%J`aۋo^{ q<S<g}vvup _Z"l25*ۖ[ng}6^xa~ߥ`6lX9O.WIڵkp駗߯2x)_<ce~r̐!C{_fVR3+|S8n:ҩS[ݏz+CM&Mʮګx5jTYӕW^w޹ ѣG^z} @� @� @� @� @� @� @� @� @�@AJ[Ҿ}C;z,JbMPȁO~TvHI^y?xL2%]tc={ _A~QرcjE{wʐƛn)+ug 7+\[m۶mqK^uqzEcƍpr@GQkuuu⊲kꪫ +0xXwuӡC2|e^[9cƌxj,#?9B� @� @� @� @� @� @� @� @� @� Ф>2~��@�IDAT5*f@EHb5}z/~ً}^[mh儺 Ǻݺu+_~庮+rրC&jjjR73I'49.Bgo+ɯsmXm,B/?_yy.ү_ 0 E\?</RVYe<㟟� @� @� @� @� @� @� @� @� @� R>zdmc'{hM&={&_~rn%\lu&<uzh ڵ+۴i3a g <c_Pg}?p_ܿ]tQ>uY9#s + u]tS?$zh>y䑹"7|w @� @� @� @� @� @� @� @� @�|K<rTBߒmϪ� JqOFN~89Ov1Yo'?IǙ3Ν;|9<{׮]{Y*VWW1n~/naV^yp 9r䬡3+aoy=^W928qW?SRE.'|rZk\}չK+33xJlm/2pn+?^  @� @� @� @� @� @� @� @� @� `x/&Ӧ l0q4HJNcv)9ד'L]vIڵK?>Tu}'ַ*s^ϠAf}뮻kSO-ڶm[%!]vY%Jd%};S{fedsgT СCvarرc{Q[UUU~k[nnݺeUVI~>?%~i7{_>/\w޹\e˖8p`s\x9r衇C9 @� @� @� @� @� @� @� @� @�4$ƕp3dAܓ~{*rIKr'kXv^;#9Ĥod啓RyIڤIzɁz++{%Hyi߾}2stMg 7̺뮛Ȅ oQ%++ӟˈ#Tj'{w>ewQ}衇+SNs"6xr.S|,B&W_}k"c)):=oy0`@暼e~헓N:ov+SO+)/lֳ@� @� @� @� @� @� @� @� @� @�"ШҖd1{o2r_O JL wߤwd7-C;t0ȸqRUUU0q'N,C" rQ[k9kZuuu&MUW]uV߼b3f 6(1kVZߋ`K� @� @� @� @� @� @� @� @� @� Q`Aۿ%묓\~yC<,L2:4i,3')!"cq=  @� @� @� @� @� @� @� @� @� , ȵJN;-XJML<9Çϐ!CϧfNM`wIƌI5J{Ek۶ +1|y{sG/7uP @� @� @� @� @� @� @� @� @�@%Y'c&l$w6e_Emkܸq:th g̙3g!4m,:옉ΓO&O<nkW{U @� @� @� @� @� @� @� @� @� @khTSiKj{Iܳ6 r5.%| |e0>XC92dMҵky]fҤd>}޽_휞� @� @� @� @� @� @� @� @� @�-D ??oj `# L81Æ +C!p{,ӦM˺뮟 7)SvsuϧnNjC!`M7]^Ŝ� @� @� @� @� @� @� @� @� @�'D O8!yd;S`yGgCE꫷juϘ1-<E dqm͜kx#@� @� @� @� @� @� @� @� @� @�#D {H6(SUӦMˈ#Æ=I&E֕wDv:tO~+UqǤQ @� @� @� @� @� @� @� @� @� @VSiK bSNIN:iI`]@uuu|2T!ĉj̜KV]u=t޸Uw4� @� @� @� @� @� @� @� @� @�˯ 䓤Uۓo{vrK̙3OW![#<ɓU2͚m5uω'TyoO @� @� @� @� @� @� @� @� @�ZXI.':|g9_A&/B!4TWO7J>ɞ{&͛ML%@� @� @� @�wWչ/w(C AQ` (%ʉƀ%%94ORTPcC jBQ)]D((U sgmT gkٿ%@� @� @� @� @� @@( !C" ӈJ*e '/kÆEBDZzE ٳ Ba @� @� @� @� @� @� @� @� @�.R 'x3#F,rܸU#w y뗳)� @� @� @� @� @� @� @� @� @�(PjAիGw_)Vohʔ?!g" "N:iC(d7q2Ub @� @� @� @� @� @� @� @� @� *֌3fDn]Z�(_ F Qfď~^]FD� @� @� @� @� @� @� @� @� @�)(l1MZ.4F7&IO#x"b##>$#8숖-jJ� @� @� @� @� @� @� @� @� @�.P*A F4m]~<I'gO=1lX#D,]ѾP yAߚ� @� @� @� @� @� @� @� @� @�E1kV~MeK�M֭3fC(CE|ц ȳ y� @� @� @� @� @� @� @� @� @�]T / "֬\�!~}ÇosF@ esrvF% @� @� @� @� @� @� @� @� @� @@ T*g͊h\di*P_㏏#̉4)s#~8S \vYĘ1u @� @� @� @� @� @� @� @� @� ^w1sf3ϔ#@" ZİaG4nq}D|rDժQŚ  @� @� @� @� @� @� @� @� @�(JY"߿4F6&QC#6"BNO~1mZDMD|[=zGos @� @� @� @� @� @� @� @� @� @W)(l_-=E\xa\#@ ̙1|>aBD={Fa[Ζ_~CҥՆrr @� @� @� @� @� @� @� @� @�LjիG qy;Rg  }1bDİacFTѭۆP޽#4X?qWqI @� @� @� @� @� @� @� @� @�@aYɶE"֮{hؒ{F )rРLF4i!XB#Vp3&mۈ = @� @� @� @� @� @� @� @� @� P9$6-#O8X~+"{,">>DĚ5ѧOo~pcV*ɉO6� @� @� @� @� @� @� @� @� @�;*PAwD˗Gԭy�%'jUD7*B>pħ~) #3~/oW_Yvm|'Y_re*\dW.ަ5 yyygl~~~ׯ_ʕ+gRabVժU+QzQFk֬YMuԉڵkg== @� @� @� @� @� @� @� @� @�J<r`k#5 P2# U^#FDthѢ/]46˖-+ ]+VDz.;nPXXBvki-:(S/ L)rk-F`Ⱥ+ 㬟m6lF{7Ξ @� @� @� @� @� @� @� @� @�U1g%>pCpZɎj4С[L[1~1DrKĀ^C h>pGei S8-2ÍS�bӦMq J]v6תUsiR~i|'YOi?m0 .~8,3c6n)2BsϬU5kOM! @� @� @� @� @� @� @� @� @�)SPJr.6-JrTc @^{-]s#n- # "5kV̙3Ϟ=;7o^ymРAq aQ0a&M 5j@ld ,YRhѢl?͢\;{」En,; @� @� @� @� @� @� @� @� @�J@ă 9gCU<P� p冁+UH=.nB7̘ժ͎b6 Pw=(LO.XMAժU+ήXfM̟?? s=v֯_?ZlZx`mz @� @� @� @� @� @� @� @� @�( ㎋![ @`\ye̙Qk~Z$VX .0 p~Y\9?7{0ګQ_ٳJ~E͚5wNf)Vٳg{Wg`}8///AqArHm۶m4kli @� @� @� @� @� @� @� @� @�)P( J+QG�Ϗ~;ڶMW^y%K,oԨQw1g6m:F֭ + \`-RH3[oof1"6vazcǎѦM1 @� @� @� @� @� @� @� @� @�*@NAa+ɵ׭qM\R�/0wx>eʔxcժUrHk׮zѴi ^W_}jB!88cޢE v @� @� @� @� @� @� @� @� @�PD ׯR%bЈjZ2L eڦcƸqb„ 1daGuTt1:tm۶ wY&0)_^z)N&MB"׭[͚5N: ''xb0Ҝ cc @� @� @� @� @� @� @� @� @�*PAѰaSOErJE%nv{F*73fL,]45j;w?>9,F;$تիPȉ's=Ǐ%Kat%N=֭[lrc� @� @� @� @� @� @� @� @� @ hYQ\1iRđG?  P֮]ƍG}4F3gΌ dy'|rt5:) Q ⭷ފѣG3<~\ܪU83ΈN8!VSv  @� @� @� @� @� @� @� @� @�ʫ@ANqѺuy%Q7eI ///FCGy$V\Y4{d3z;vJ*B`֯_SN'x"<yrԩS'z{nt-rsswh @� @� @� @� @� @� @� @� @�: 3&k׈ #7u23_`„ qwWSN9%:83 }LV-~8FO?tԨQ#N:m0#@� @� @� @� @� @� @� @� @�(#%CQged @,_<  3fD.]Ϗ>}Dz:J72lذcLar֭cѿHi� @� @� @� @� @� @� @� @� P%yQHjU Wi8vk?nᆸۢ~qgE-̝;7fwlٲ8p`4o|G, @� @� @� @� @� @� @� @� @@) T* s CJrDc ; |~7Zj/Bj7gΜ/B w7om%!o&Ao(}KJߖF� @� @� @� @� @� @� @� @� P6J4O") UeG ///׾ӦM#GƤIo߾QrSJͤo'}C[JT֭o,}k @� @� @� @� @� @� @� @� @@( Ȕ7[ʖ)SqNj/ݺu+[E@9HRnKZ4 @� @� @� @� @� @� @� @� @�#PAkFTZvʖAsqo}ݩI'zکMGe}+t&QF__"g/8o|1~.o{+cǎ<ڴisJX7=� @� @� @� @� @� @� @� @� @lT)2"rsKrDc \s5q 7%Z~}kNFگTDpsĉcq%lzCKk2dH,_<rrrlپ}go Q|VfϞy,]x]Sv[3.(͛wuY'@� @� @� @� @� @� @� @� @�TxMA[6j o �R�7O<. L%U\9f̘oNLuQ$Se6m2YL X<#??{ۦ{0aB?OL:5nߴ~aef?o/}[ @� @� @� @� @� @� @� @� @�v@>//"7$G4]`qUWſڵ._Nwi U?t-*U@͟g1z((((ڟ{}٧x&MD_mo%GՖo=oƉ'GydY-U] @� @� @� @� @� @� @� @� @�^D֮Zu7@C+^z7xtn]zu<cqwǃ>)oԩ1lذ]v3 / . +w]L4)ۯ[novzŐ!C'NB/~h޼yviѷoygׯ_]NN'pBCE ,:DLsmK0aBVg~~~s9ѧOӦM:u+V#<<@tMq]wSO=͚5_Ѯ]ƌzk̚5+?Xxq_O;i#Fd^{^q=)/HoYuꫯQFEr8p`6f \jU{q=DFbٲe1r>|xO|}Ѭ{f~o%]H%4N˖-wѽ{왢? .g{~_GӦM.mm{(qj @� @� @� @� @� @� @� @� @�FRIN[#�,رc#hѢ,0oe])1;O?4^~߿L<9+;0Ο??{k׮Yd ~7hР8cǎqmE&M??sͮџ:( &lРAĢx7Ƿ,C}ё #8"x׳G,H2KAy) SOwy'Te1Rcj) 2&~:[[c m۶$8묳1gyfxi7 L㥶kTRf԰al>;?#L'D{R_ *u>;O!//Bv_~CN:) X μ袋6eo1} @� @� @� @� @� @� @� @� @�v@A]QYY ({)0uQƍw:t(Ӊ8qĸ;㷿m_>ʕ+Ǎ7ޘ:4ۦ?G&ؾ}9sf'?o~Y_}FĐ!C+I!)40>97o]6mZN;w\rIv_ L綵mRhcu?)9{^,Yf~ѫWQF\qQnݍ'|2s;C CsG_,ԩGv% ,c=6 VZ�;. <ó8W_^�9nܸV҅HsCkY?w_<ѴiH㗕MA� @� @� @� @� @� @� @� @�H%YUU�&7n)0XVl(@q…q;,pΜ9[o5e=PY8T1;YNv^t*N4) /LAgu&eG4gVb[E8$kɆNA{o6o׮]Kn)1Kɓ_|1Rdj~-vgJ{)qV۴iS|)+Vg}V|nJ \xqpGy$ K/IֶmnʕEl  @� @� @� @� @� @� @� @� @�*@ ~'@R^ KrJ)TCWD|'xWO&w)@2wy'yWo=uVt:N>=֭SL<w}#eٲeofSlrһ81777#*٣G9r&Ϥ) kM5};O׊Z߾}c̘11dȐ83,k׮]tUllAA[L @� @� @� @� @� @� @� @� @�v@]3Y Oxq-=~D~(qMֺ{gM6^]vs>5k֌+VD Iܼ͚5kSr+ׯ_[loq|0N;K6m|A~a_prݺu1x"QF9wS[Ld65 @� @� @� @� @� @� @� @� @�]# r׸@x{-kN?0~_eE:裳qʶSLɶ:u|ʕ{=3cƌ)޾}l?y0aB\uU[) \|y)06zr^]vSO=#iǹ#???駟fۍאB =EuZ7).裏꫑j;vl,]f,a7Mj @� @� @� @� @� @� @� @� @�N@䮳73 !pGF 袋(\pW.|ŊsͶ)/̙D 3ѣGh"/IrJ{1|c=+2;xlK!)/)'^ywSN 6,u~wy?x{8w}w~1hРFE,GvS!CM6qDž^M4>[ǻwygL81VZ7xc,X 'xꫯƛ4iR<~fͲpn-O,͛yyy1l'ՕZN[zK,IdmJ _]kذaC9$ׯ{7٦> ;Wvo0@oR#@� @� @� @� @� @� @� @� @�u-l%5lsJjD ;t)֬Y^zil2=НB nj͝ 7nW]uUS�bZ.e˖E <L~xq5 &D <ϧ޽{g኿bƌ1tx饗'͛G Z8p`D;'pB<ٹ]tɞKᐏ=X,Z(ڵd-TZ5OgA)p?A qQGeA){M)�2՟+[nTV-w٥5ͬ) wxg5jTpyA^1"[SVwҵk^뷿xꩧɓ'GΝ/Υusw֗B1׭[Zt!~_e%NNVҹ+++O <LiMW\qE$2eJ~YYi\Ks~{)S#@� @� @� @� @� @� @� @� @�ص9U%UBaT 4|N`РA8.曣vڟ<Xti4h rrrg޳-'?3gI_6Zre|jNiܢl (La~aZ*ի)Z La鞅 fA߷vHf͚4_:QFm/J*EÆ ϕZ,fZz,84777 ,iJlO>${K @� @� @� @� @� @� @� @� @߁ T()SD~bq7F߾}+wt)|G[fo|c ,X`mo⡇ u֍ѣGov/< ;#hK� @� @� @� @� @� @� @� @�(Ule #@`Ht/r\qM7)[nzKzQՋznOߒ%K͛W {mڴzkԨQEqUWe=77"X+ @� @� @� @� @� @� @� @� @ s74thIhvg?0<xpo>.׿+Wޝ]f֖q}ݱnݺСC?~u|cڴiqf^{A� @� @� @� @� @� @� @� @� Atr 7pCvmQ~,/-Zl~Xl&#V^=Rʾܹso&}7=ofѼy_  @� @� @� @� @� @� @� @� @�X@d~N ,_<  3fD.]Ϗ>}DzZ!72lذc̘1Ѻu0`@7߆  @� @� @� @� @� @� @� @� @�_M@Ws,0a„,rСz8S⬳Ί3<37n\ʳ@XhQ<1bĈx駣FqfᏝ:u*;� @� @� @� @� @� @� @� @� @`AnUyyyO<<H\2<ٳg#:v*UU噗@ _>NO<D<1ySN;9޽{$@� @� @� @� @� @� @� @� @�9 wY(kƸqG#G̙3Aѵk8餓A999%0!x뭷bfۏ?8Zj~zqq 'DժUwNAf!@� @� @� @� @� @� @� @� @�(UAkpJSދQFSO=cƌKFFsq1;v5jf&]WSĉ瞋ǒ%KaÆѥK8S[nѲe @� @� @� @� @� @� @� @� @�C@dxO$@`+kرccܸq1a„?~TR%ڵkGuT ١Ch۶mneD @^^^K/eᏓ&MW_}5֭[͚5N: ''xbz衑�]9��@�IDAT @� @� @� @� @� @� @� @� @L ,ӯGqܹs@ȉ'Ɣ)S_UVe!rHvaY^ LI&;2g+ 0BI_yx7"A֪U+ڷoGqDs1Y�d-* @� @� @� @� @� @� @� @� @�* Ȋޭ@Ϗz+^z饘6mZԗ,Yy4j(:8~F֭cʕ+WH3T fϞ3f̈ӧǛowBFSO:t~W~CZ:"@� @� @� @� @� @� @� @� @�TTA[7Ϗ_= {7"~;>hٲe YfUVea^lSc:٠AC9$ m۶m4k֬#X @� @� @� @� @� @� @� @� @@ ,5Z P/^ӧOwy'3gΌSeˊ{D-b}ͶO{jժog |g1o޼Ds΍9sdދZVZEp@<H]#@� @� @� @� @� @� @� @� @�  W(Xti7~,hѢ((((jРA瞛&MDƍ75>S/H)sɒ%7 .>h;H͛7ς<Sg_Ѱa @� @� @� @� @� @� @� @� @�( A%h l&ϏyeH.X -La}&OWT)Rpd !L=׫WsN:zڵk֬իW5jd۴+Kmf͚^:ۮZ*V\|I~-YPxX|ySc L=6niEM6-kf͚ei  @� @� @� @� @� @� @� @� @�@R)`p֖-ZÍ˖-SdQ+8VjυCjժE*Uʕ+G)4<)t1???[_n]pYEk׮ZY@c ӑTv+ w̏&MPYE9� @� @� @� @� @� @� @� @� @@Y)(l%UܹniВ8 %$?䓬YU6~gY0c ,On-1]/ |LulA)2M1kԨ5k֌jՊڵkg=9gS{㍈ΊµE<`DNi @� @� @� @� @� @� @� @� @�[*r @@ذaH}wl1yrDt?F\zRk"@� @� @� @� @� @� @� @� @�(*B�ʧ@z?_DEYS>עj @� @� @� @� @� @� @� @� @�  @ l92G#:u=̗@ @� @� @� @� @� @� @� @� @�9' @ 1eJD~~GD<TYT] @� @� @� @� @� @� @� @� @�X@8K�eTeˈ^="~2Z @� @� @� @� @� @� @� @� @�l&Pec @ ԬqG1p`wQN/] @� @� @� @� @� @� @� @� @�\R_ @@9я"y&b„ o]t @� @� @� @� @� @� @� @� @� ! Bf$@+p SFԯ! rwVF� @� @� @� @� @� @� @� @� PAwh{1vlGӟF__Y� @� @� @� @� @� @� @� @� @�AAe(�_ 77bРoNXd @� @� @� @� @� @� @� @� @�Y&@�.p?1}zDǎ/K0! @� @� @� @� @� @� @� @� @�/4. @@yHSF|k;GqGy]  @� @� @� @� @� @� @� @� @�v7A#'#~È#.4bZ8 @� @� @� @� @� @� @� @� @�v ]ov(Eʕ#>"3K?, M� @� @� @� @� @� @� @� @� @`+ 2=#/!� @� @� @� @� @� @� @� @� @| ,M 1yrGGtRğ� @� @� @� @� @� @� @� @� @@ ,DC @@[7bĈ"~ .X|ԮJ @� @� @� @� @� @� @� @� @�C@�Q ''?x SYa @� @� @� @� @� @� @� @� @�AA;q(ݻGL#xU @� @� @� @� @� @� @� @� @�/A}�JP`#&LsCo" JpC @� @� @� @� @� @� @� @� @�Lf  @@Q#⮻":*#&OΈu+ @� @� @� @� @� @� @� @� @�$J;i @�2-pe>Ge\ @� @� @� @� @� @� @� @� @�SA)�J^"^z)b=">:K~# @� @� @� @� @� @� @� @� @�TlA[=l&^cD|[qU� @� @� @� @� @� @� @� @� @W<F�@ժCDrKD2 @� @� @� @� @� @� @� @� @�' rY�ʙ@~G̜ѱcԩvcǎ/<ڴik l8餓W^]qH� @� @� @� @� @� @� @� @� E @�:t2%#;.b.XfϞC ӧ*kӦM @� @� @� @� @� @� @� @� @�| /q�dE?qG W8)TOl~aVo +W3f[o*_s; @� @� @� @� @� @� @� @� P5Un R~wq}g1z((((~$.V~[nY,MM @� @� @� @� @� @� @� @� @�2%PLU P>;#:+cLjC#N8a^fM/'ի]vqeEfͲR__|ű>o~.\QFE˖-׿u4mڴEOSL6-ԩN;->gΜ;zټG&Li߾}?|:yq_cƌ?QJ;{0  (rIJe˲{ݻwR}  @� @� @� @� @� @� @� @� @�vSVRk; #P,�+WFabģFpCď~]tit%7n7|sX";l;rܹsYxcQF8SO~:9h۶m@tgϞS5kVvW\zh?oo?ڴi< -Sd \`A6F7>v5^+^dOj8p`s=nݺXvm /dy睨UV߫W-wEa� @� @� @� @� @� @� @� @� ; ߪ5 @NHQʿ}5DF5kn}oۑBgϞ-ZHa'tRn:^͍#<2Nׯ/(rѩS{k֬e˖eg}v4l0nxĉq^{/wl֬Y̜93/^ݷ>u]C BӅTǴib޼yѤIXY٪U1cFԫW/{6TN48rfԯ_?H5_uU!@� @� @� @� @� @� @� @� @�vuY(u4x( [x-O[PygE!?>jժ' Ȣ&vam۶m,_< hL!#FaÆGʘk׮F�ԺwիW�zj)rqwdO \n]yٹ+z]NVV-Vc&?xGsq饗f5n1l  @� @� @� @� @� @� @� @� @� ZTSO2% 0x1'| fa*m*UG=;eA7gSK!E(iJ_~xwk)hyk޼y3ƌ=G~~~8xAo߾ѿ={vyqiիMr@� @� @� @� @� @� @� @� @�6Mg9 @`g _Ą {G~zuץ`ޠA,>9slr{7mڴA\SfpWZ ,O*#µ\ַ7ߌn!UVxYxnݺHw_u5*9o ӺD� @� @� @� @� @� @� @� @�( +R # Ag|Fƍ)SFSd~~~PmmZڵk</rcׯΝ[|vN;w}㦛nʂ#:w~WD ZK㣏>}ƫiر0w: @� @�}iU{~"0Q9T`%XK$DcԘc1[FMT,Q *(( u;FAf`ʽk^{G� @� @� @� @� @� @�dA5�j xEvS2Rb yŜ9s1cĈ#g?YKL'۷o .n)nxwcر>7.K4yYg�]w5.طoҥˢz)SG4h 1=H[lEѪU8ꨣ*>3f A)kZkݻwm۶˭K;A� @� @� @� @� @� @� @� @�C D]\U#~xUh P;:v8昈'䒈M6EAҹsٳgvmѿx .iB"VZZ=P</ |>y9x}'?I 0 {mQ_|ꫯg~w}.qgԩS#6y͛/.?vaÆl L|pٽi~y46lJq|ꩧb.:uW׸q㲱u @� @� @� @� @� @� @� @� @�uQh᢭vGZie#@� ̟q\q9m, V\LSRRÇ?<r˨ƘJ 4ߙ3gƇ~C$[lYsg{u){n1k֬Xs5}UgΜ9Ѵi$ˏSxfe+cO� @� @� @� @� @� @� @� @�M kR+Zo8唈>}"7bukRN� @� @� @� @� @� @� @� @�  VY @�8_=:W+ @� @� @� @� @� @� @� @� @�ꔀ ::-�jiˎQbآ~(*Җf0pE� @� @� @� @� @� @� @� @�XiF+= @� n:o?#f͚?=' uV!@� @� @� @� @� @� @� @� @�5ZG,8 @ 5*=<hj3#:t{k" @� @� @� @� @� @� @� @� @�%,y�n.] /?y1oޏbذbm&W'@� @� @� @� @� @� @� @� @�X W0?K /~8XwbƌUWK&@� @� @� @� @� @� @� @� @�AU[(Dv!zkh|Fi??|v̚UU @� @� @� @� @� @� @� @� @ \YA @�hٲezqFq]Cb뭇Ƈ'@� @� @� @� @� @� @� @� @�q k+QW#8"+ݶm|Qx책ú  @� @� @� @� @� @� @� @� @�uR@d|E�Ucǎ/˘;8By� @� @� @� @� @� @� @� @� %8 @�/РAbWm۱qU[ƶ>ӦT@� @� @� @� @� @� @� @� @� r W @zF :,x4hVg` @� @� @� @� @� @� @� @� @�Yf @�_[8y_ٳv&/syE @� @� @� @� @� @� @� @� @�( r5⛚�TV#ߎ7 .1vb޼/=[o1u.9A� @� @� @� @� @� @� @� @� PAր P׏ѣc<^~a7c>9n\ġFL @� @� @� @� @� @� @� @� @@YsޅJ @r;~??&M&z4(b܈CygO/w87 @� @� @� @� @� @� @� @� @�bAt @*vux="v%b"z+bţ7X_~"*f3 @� @� @� @� @� @� @� @� @@U *I @�U,ЦMc-|ňPZ_sz @� @� @� @� @� @� @� @� @�_@* @�_[#|r鏧`>bȐ_w� @� @� @� @� @� @� @� @� @` \f$@�U"0eJAE,\5X_OH6 @� @� @� @� @� @� @� @� @�/ r @�H1yC,6,\)<@� @� @� @� @� @� @� @� @� P  Ր @R-{tG\%@� @� @� @� @� @� @� @� @�~Aol P[m1xpĨQu/qOUR. @� @� @� @� @� @� @� @� @�N@䪳6r 78܈wމ1"#6h4C!,0 ⮻ @� @� @� @� @� @� @� @� @�@E ܿ[8by @@5 q=)r֭#>(b� @� @� @� @� @� @� @� @� @�,UR:I�Ҙ={v|epsmܹe¹F1̋1c֏÷.Mkz=[oǘ7o^n ,B(-riTGIIIn~}![:˷Y8.**BK  DÆ s++5j(ܲqWXc(ߚ4iqִief͚Eqqqn9 @� @� @� @� @� @� @� @� @:j!@�_!M3f?_j̙QhfR?Kil)ba >LRk?$>|4iE71_+*K WLAB /~ ,u)|`e x\LGsɵbxf8- ٢EHyy_߲ehժUTεn:_O6 @� @� @� @� @� @� @� @� @   @`fϞ|I|e>+)ЦO^� ۴i:t( , }qqqnt\}j)12ݝ%SxdRK-< A)xr„ ea@4N \ږ5\3R0dj~>ZkV8]K6 @� @� @� @� @� @� @� @� @vH I )o1iҤ/NKk)S^!/۷omYYh_!Oah)TEUuť#SPd.Sh -Vя>(0RPe(묳NTl뮻nm6[oOXcC @� @� @� @� @� @� @� @� @�P@*6T… s?'Ƅ h\ 3g7o޼,/孿ѣGX{˂ Bc&M#РAB$S '|[ 3MBi7. #SL/1]֭s8dSk׮]ӾC%t@� @� @� @� @� @� @� @� @� ȕ&4�T@!w6f̘lBS]!|] wLav@ۮ,m۶e_\\\%*hٲe֩SJ͙~OӦMˡ'OSSXjj~ާ ,(E9r 6(w1:wO5Zl @� @� @� @� @� @� @� @� @@-˾#_J�L#GQFS8w܌TTTCS\"- MXy鷙VƎ}ei&Bp.]FmZ i @� @� @� @� @� @� @� @� @�_ =b'|GŬYl 6Xp qNr\֤I*piB[ ᭣G)5I[/6dڵk>SkѢE6{ @� @� @� @� @� @� @� @� PoA֛WmHÇ/k#FԦO'm޼yKapFبQ)Ψ!SK>|e-F:tݺu6,b-m۶n @� @� @� @� @� @� @� @� @�U! rU(�uD`ԩ1dȐxs6lX;1{hРAt)men]v_X++0Ha^-Ǧ'|OAݻw=z[}ӦMWvz @� @� @� @� @� @� @� @� @�. r @f L4)^}x7ڸqr;v!m)6lh֬Y\)l6Z MaӧOFٞ={F˿;*� @� @� @� @� @� @� @� @� ,O�z*0x_Wn 1cDÆ s[olMnߦMz*eѣGǐ!ChǏ=z>}D޽cw]I� @� @� @� @� @� @� @� @�*- Tn$@@;wnK / gϞnaleW^Q\\\wn% &īZӧO_?Kѽ{:f !@� @� @� @� @� @� @� @� @�! nG @r O>d<91An喱;疂ڷoq@�(PZZov 80_|1Ə!kHmmD� @� @� @� @� @� @� @� @�H@d=zٖJ@X`A Gy$ѣGG׮]c==3v}Xk P0`@<3sӣO>o}+M7ݴ^yX, @� @� @� @� @� @� @� @� A5=�U&+]w{oL6-x`p&T<"@@m())^z){܆[mUs1qQGEjrJ� @� @� @� @� @� @� @� @�X@d-~yJ'@@A>[n%5jTqGơmڴ)fO�HA)01bĈ{O?6lȉ� @� @� @� @� @� @� @� @�T j50_ >^~q뭷lO<1ڵkW�uD^?qwܳ>;FqqqYe @� @� @� @� @� @� @� @� @@MhPQ TN`ʔ)qǦn|A<CyWcC }p 㩧" ?~[mUL8 GPC /0fկ~o9sf~qG根t2n!8+<3V@`q+׺5o�5m6?8s⪫78+))A*� @� @� @� @� @� @� @� @�ꂀ Ⱥ�z%S�d |gco~3jèQb̘1z7o^|qm[oBC3fܹs{L6-O瞋<f͚-Oa,\G`ܸq[z'bվxwuakѢEy9`.ʁ}w}., @� @� @� @� @� @� @� @� @!/BXON;-~/;1 SN9eԤIׯ_w̝9餓}u֭| <ˎIA{{!K;1\{wW+nذaLL ԭlܸqދ7<v߿ur� @� @� @� @� @� @� @� @�@zVK%@@Xpa{9_Wt޽VSNFVjS^e??{HBa[ڹ5)P頻tZn]UC4]��@�IDATqڴizk;#kd"@� @� @� @� @� @� @� @� @�#jJ  Pxcfո*SЈ#;~7M=X<?1~:tK/4ڵk#Gs=7,XEEEo;8Hc]|1w8Sb}%;#_رc>Umi /0בnժU\vey)S䚆-[N8l|C5?sOL0!wqyX_~(U<}Ѹ+o=~h߾}^[nY-/_x Zh_p {w(25qmO~4hPfڶmguVt%zR~ٳg{cǎ/ꫯZ;wW\qE~~Y 4wSO=5<S'?!Fݺu>j<WݤAj&Mʵ?5\sq*sPRR+f͚sLvysW^xhРAwJ͛BYujK?xI'E>}"}6 @� @� @� @� @� @� @� @� u|=G�N/ϡv52ѥ�_1f̘ wi{?׿tFm|{7| Ki+@^wu뮻F^⦛nX7V矏K.$1jԨar] `8qbq7WjSg}v4m4 *o}[馛~ O<蠃z.[^{i)owޖƙgoOS~LzC O<1V;o?<K:yw=O?4E<|ek KLO^/K/}ݻHy!d=;s|ynN?HAm;~{ٳg>y?~SOQGM TfΚ#SM)59ċ/)1δUw]3`F� @� @� @� @� @� @� @� @�VF@y�@`ƌ1ze]Vl3G]v*;/ /{{$ >{n>!{lΝ;}rK'֥gS]3k?cvSN9%'@]py_]b6lX\941՘<Җ�[lEEEtsO>4N L'tR٬+2oy~y6mĿҘBSH+]Azg|0H׸qr(h LAIk (MC L7SY'|2G;J%%%K\a)tuen [cС'v)Q~߈{/U-92yH?Rs1oh"ony;3]{DI]/P-9Hn|ZR2  @� @� @� @� @� @� @� @� @ oF]@#FW&M|f͚sݺu+SܹsΝq 7o ?p̙3,>쓻)0v<,z(xvms;b7axiںw ,r-R]ŭڗ6X[e cǎ[N5ɓ'}eX6tr- MMekNK.SOu}ye]K7$PA0t~رi)Sp·駟;#_?CʾT{OY?zhtPt!;DeJ/'Ps:=_۶߱zնK� @� @� @� @� @� @� @� @�5L@d {!!@@E 1W^ye;xV<H!sOrJm~a vy-fN<sǰa .q߅^ZnC 4~iӦK_]5C/\p)*>K;C:wC&MVJ{ɖ__Kƍ/ 3\{M7|sk.Rh׮]Gc,Za5ֈdv_w}s0q!ދVZ}wK$'Zv)?+3W߾}sb֬Y#FĆn)*[gy&N8ᄪX @� @� @� @� @� @� @� @� PA×n>K/4ΝGuT̛7-`%+N!rzj|q7ƣ>1 î;p©` ~[-ܒ7. iI&Bvbm)IJ4V2+2s̳y%%%ѧOx7裏3fg}6u-uG t<#vKq!Dڟvi0~ӟI'M59SHcmԨQOq˖-3)2s5o<x≘9sfn9xuCE!t|q衇wc=jJN� @� @� @� @� @� @� @� @�5A@dMx j @r^{0`@}c̘1y]N!{kFw}UVeݻw eR^;sϸ袋bȑ9\3m7-Z}C ){&(ܪT ʦ^ڹ:=\>˝]Ka…K🳕y)l?qm6θ馛rx?˺9#fu͞=;>x3Έ^z)?Wz3?ϣs/r{I&l@+;W}ÿq;gWc=CBwej[%@� @� @� @� @� @� @� @� @�( % @`i)W_ ٣G[ڭ5܌3r]'NM>Be +?<:S_pSp] +l?buԩS4߅^{W{N=&:뮻_W^ye7tm]a?|ɓp~ʔ)رcاqs}:h߾}L7|sK=\GJx-Dnݢ_~U~BL0!_)|+tC]g9@2{B̝v)Ϸk5?;|~<Hs9[o0Fpthٲe<{_~z}qUW1Vψ#nO=:?EÆ +5W LM!O=T$Bja]Ʃ;cawuWuMWM @� @� @� @� @� @� @� @� P{. ]itUհ!@�QGC /֬Y޽{(Kt/#@iӦŐ!Cr ߎ={Ư~xjx8#Χ*ntP7D)/HPo91u5fΜ/r/S?w}.ƍWv^{m1Z>xqC ʵKQQQ~ϥp޽{=P<BAS@… ⹻;ϙM#a>ѪUֻ2'ޱcy'f䚂)7ogyf>~f喑暘;wn ><:w?s齦ҽ_|E :4R)hqY5n!wjJa;wU;k׮]<1p N|7c6A&M!)T~8θcwn92=s _[nrm 7o=~~{{o|Z\)02?4Rh ;CMiK]jП(_"N8Xkr5L @� @� @� @� @� @� @� @� @@-(Z"?#- @@5 ̙3'RW\)L_~q'jz?ulUE|'1lذԩSw>D@k–ޠANW8 N0!!暱kn}UW[kiiic6e]+;H\~8G?Q4i$R(f xL!n)]wݸ[}>:jHA_gK@dU˚+mn-l0ٳgǨQ?i;+:kg3<.So { @� @� @� @� @� @� @� @� POAosFE )rРAnGzugūo%'O}ws99Do7V I&E۶m4%\?Η?ѴiHA۪juy˺~u駟 Yg%n}g㩧KxP{q L!\K<S8<K<P}ݸ{;~x~W;C \y @� @� @� @� @� @� @� @� PN�M4;.Cm]tQ3s=[VtСXs5[(nr﩮><u5j ,X=bU6.c7B5;w#G#Fw߽_{k֬rǩ %%% Sc.]{Ѱa<xp 0 RXb [ |6lX<8cbPgm\  @� @� @� @� @� @� @� @� @ - YXUeqC�_G4{o[P:oH;c:c{f ~ŝwޙC{guVp 5zTܹsK/'|2^{HAmY!7o^4^|Ÿkgɓ'Pѽ+8ӧOwY:~x'bҤIѫW{GF׮]k @� @� @� @� @� @� @� @� @AV9  PR믿>h<S9n5ֈw9vm۷olvѴiӚUjVX`ڴiK<ީj?3gNa-**ZTGYfFܓ_zxr�o-Zw=g8蠃b 6*� @� @� @� @� @� @� @� @�꧀ ޭ�z,gp?1bD4n8viwޱGǎ뱒 P,XN 4(￟Pӿc)v>}DFjÒH� @� @� @� @� @� @� @� @�@@d=xɖH�e L:5^|^y2dH̝;7ڵk!{lMn:tXP @RcСߩo_|E:߫f.vmM4Z L� @� @� @� @� @� @� @� @�VF@y�uP`޼y9hmРAꫯ栵{/JJJr[o[mUt=7<렄% &MÆ ߎ7|3̙-Z޽{RK� @� @� @� @� @� @� @� @�VX@ y�O/z+B:4R0[ i9sf4h t[lEtm֦MeTJ`…1v1bDY>|xeԩyG=rٳgֵkN&q @� @� @� @� @� @� @� @� kKQj@ q=ztY()ދYf%m6'6dBqVj2HJ'&L~a|y_2v6,6|ǵZk%f( @� @� @� @� @� @� @� @� k{Qj@ ~;vl1"B[ڧȒ^;tR6pON:Eqqq5P8$0uF-gϞ97oC`Slu-Rc֭ @� @� @� @� @� @� @� @� @@=Y?�'@?~裏bȑ_~?cƌrRPd رcާ~b 6ȭ}ѬYuz>,Ə_Rk }L/=Evb6ʡlI߬� @� @� @� @� @� @� @� @�+ @�#BƌS4WB&N%%%eZe믿~R+oٲe3:… cԩ~S&LBc!1[pΝ;֦Mw^'@� @� @� @� @� @� @� @� @�\"7 @@MH!)R7nܸOv' [f͢m۶Ku]7:kvާkYxԞ@X`A|91})1)Sɓҵ򁪍7[,<5o>>vСlߦMo@ @� @� @� @� @� @� @� @� PAֆFX!&MD^8tQF92CZqaߺuH-G-Z(?>J `3fcڴie>,RKAL4asi :M! ԊO*U @� @� @� @� @� @� @� @� @�F @�Z.NDKRR _zK+oذaLᐩl2Zj\ ,ܗZ:.oڴ/))/Yf̙3|?K?-<VӷE=U5X#G)ȱbKߍ� @� @� @� @� @� @� @� @� k{Qp F!oڴiZ + ~B`~ K--PH~ѬY/Oʷ&M|8 ~UK7n85j[~:W8nРAZs-W`(ϟyڜ9s"s}>=6{%iemɭY�-ߧ~ m֬M|fvشy&-^< @� @� @� @� @� @� @� @� @�O@d{g*&@�:&S ̙3s+V $L Og<nQ]1Xs.*mEmbذaåaV ,z_h͛7ϡ)7Wt[wŢP({H'@� @� @� @� @� @� @� @� @�j ȚvF�H׿袈ַ",XC"ϟ(r~>N %%%Qh_s-\dX˟+**-]/W_ML,hРA >SkԨQYkܸ\ cL-=[EqqfmZZ  @� @� @� @� @� @� @� @� @�e 4ZE @�/pU^qC ӊ A5quc}"_޽&VX5//?\loGخ]mt @� @� @� @� @� @� @� @� @Tf @�V7G}vĕWFrb{n"zŞkwoA}E<xĿ"JKJ� @� @� @� @� @� @� @� @�/A}[-#'Xx?QYxQQęgFqGħ֞x"v=b͸ @� @� @� @� @� @� @� @� @@u na @� Gqj(`%LuF_ՑNj#.,b[nqMudqA� @� @� @� @� @� @� @� @�Ꙁ z-�17P;ۢEI'EO%%s Q[GZĩF|{1qbudL @� @� @� @� @� @� @� @� @AVq  @j93⠃"_?FVCU4gDU4`I/?#}7b-#~,2 @� @� @� @� @� @� @� @� @@=Y^% @@X0"&Lxшk7(b#vy7ߌc}͸ @� @� @� @� @� @� @� @� @@U *I @�,p%O<;bhΊxŁU4dE暈6ߌ<N-b @� @� @� @� @� @� @� @� @@Y^ @@}x晈_2+#v޹gG\}uYSu"^~9bȈ=#^:f1& @� @� @� @� @� @� @� @� P B @`5 LqBiΊ뮈Si:2l!�r-"v%,� @� @� @� @� @� @� @� @�1AuZ/ #9&u?n"5ʷ'w^ziUn, @� @� @� @� @� @� @� @� @*AV1 @j"-WS<mqqD~^`A5OVo0k":⢋"N<[x@� @� @� @� @� @� @� @� @�uH@dzB�Kw#?q_Ϟu{~G<`^gU3"{,#;,bܪX @� @� @� @� @� @� @� @� @(ZhW|#߿ @@U FѰaU9~MC"LYޚX_MW"/">HD5Ru @� @� @� @� @� @� @� @� @�!Р~,*  @@ӟ"YgERoԭwYݫa矏x睈= @� @� @� @� @� @� @� @� @A.K5 P>8?O#6߼XM%{DW_]Ma*#&L{3b-� @� @� @� @� @� @� @� @�pA5)�T#ڶWgFsOuU®]#}6b⋪x @� @� @� @� @� @� @� @� @@eAVF= @ qW\Ѵi )jq͛Gx*MDq!աY  @� @� @� @� @� @� @� @�% kɋR&HѷoOf"݈뮋?~7<'#RQGE숞'@� @� @� @� @� @� @� @� @�VD@h�F-⥗"b5Q>I"SKK3sV-ZPYZF  *4YS!lBʒe 3c1a&  H$|{Uڻn>?ǹ{>9z ]¶  @� @� @� @� @� @� @� @� @z* r=8&@�'p%싞x-#ڴkZϫ*дi/ U? @� @� @� @� @� @� @� @� eWwq @x晈7\Z{ݕuw߈ac-uG6 Md>c  @� @� @� @� @� @� @� @� @� Z++r=ڶ]د rf/_)^yeǕPz Dw_ 8l!1K0"~;b- q1S @� @� @� @� @� @� @� @� @�Q PF>{Tֻhot-k׈>=iZ^-WT=DW1gN1; @� @� @� @� @� @� @� @� @�"& ] @�%ψf/T?oQrDok=pÈG92 x: @� @� @� @� @� @� @� @� @�M @`] ̘q[nY.fP_{G֭ꫯ.5ҤC :DӦMSN1lذ_.hժU\uU1v_ɫP!SA.̯:n[j/X ̥6}DxcĀy  @� @� @� @� @� @� @� @� @�A @ _) rSd.qɓ'+O>d̛7oւx]wžC_=nyo4n8y{RJq-Ę1cI&*Ut曈c)d1L2%^x̫^Ϗ#Gƻ鹰J 5O>9ry  @� @� @� @� @� @� @� @� @@Y  @ <`DT\Ђ 5j|&QL:uj\|K/ŸqbرѦM,t2է2qh۶m.?!|utM1}~Y];#"zZVקPryo}qZӽ`?0J.QzDNddS[� @� @� @� @� @� @� @� @�OM*fNE�֊wE Ѿ}Dr -2&/\0 8`8b}ɦSN#{~~wr)KW\9 |bĈK>t1lX/ٲ^.\a&l 3 7xC#R(B� @� @� @� @� @� @� @� @�@قl @@A <t #ڴxş |͸㣏> G5kV|͹`c̙;G׮]f͚}R5\JlV[emJ{5iҤhԨQ\xQJob\n6z}vZ_Ϗ?x.}h$r{+bj'?J-Zc9&kL!^{mܹs]v\y啋M08Cرcwq_utMFJSNܹss!;o1G u]cԨQ 6N8!3={vV״i޽{_Ɣ-[6,'4><HU?>.o_͕_#XZ@� @� @� @� @� @� @� @� @� U73�\_rrrAPK/42w`$8eʔoZjY�iӢ}ѻw4hP~͛[l N81Zji =zСCp?08xGwɂ{vhHe^>GU7.{O{ZԨQ#_,Zn"N9%"e ]s9';\?cп8b1z8bŊ͛BOg}6~c=bر{CK.$4椓NB!|lto6Rc꓂5{7v%9plLsI[t_~R䂔ҡC8\jh׮]`aoɳͷEE;D.T4rwhg @� @� @� @� @� @� @� @� @`uAq @͋\_/\$APdz:+;\@d.!2WR@!CbĈYE?>r->w}wYaj>|x&Dzu9 3qWgu~G/ L!+*]v]jd iK˲)&O/P9}Y #D|駙Sǎsq^{m.x#PJ*E LKǓ4ҥKG LJٽ{li KV7B:S<&L^z) LoGFbԨQ׿5kz뭳yRg2O^z=QJH}QH,:>*SO͛f);#wm2;k @� @� @� @� @� @� @� @� @�VZ@JSH�֞[oE|m!,\3AN81O[HVᅬ78,X-"?2ul֬YlF1f̘,$20֪U+~ϳ{d)1?(?s?6lg̘߶%˸q뮋G͚5F9eʔ 3gN1wy|x뭑 xb֬Y^{-6EYp Ԙw:>4h L9/2 i8p`SIV&Fu+T6md)1SN9%,ܱSNY]3wܸ{py衇f!Yܟ鐋Yn,|r�̿D߾}+EY;DO w!b]# @� @� @� @� @� @� @� @�  WI  ^=bB�Sd*nM!L<9 )RZ-[6sxcذaoiӦ C{=ztT\9J(+V\F˲Sd 8㠃B ?l~!X^E|\C|I'3.ZW9b)07Gqy-ª˔)X:u>AeL towuW:Jwڵ`ޚ@r-ѱcX[܋]xa#D|rċ/E[= @� @� @� @� @�`S!��@�IDAT @� @� @� @�*x:Ҫ֟�(C#5yre!O} /SVs^㧟~ZϢ6pØ6mZ(h}z;vl̜93ڴiW (+)CqƩWh0aB~V/f͈+ZjY_~yy5jȯ_ ιdJ \̘1#&Md/>KL}k6׿F믿>RnqV$Ͻ+F۷SNYoyV20o="Q{zk'@� @� @� @� @� @� @� @� @�V$ rEB  @Zf{)2<ro.o/R\z饑4l02dH~{zx뭷bŊqfm9.8wܬy.�ꫯE])<񫯾/5eʔlzիgΜ9qiE.]緥XN,pe|-#*U34԰{g)P1Y l6?N~dǍ_-ZV[m7pCyg\)(rE%rv=W<@qBWt+{F"wG^1u꒭> @� @� @� @� @� @� @� @� @�" rU%@�kAO".r?/B˗/"92sѣG:ğs Lc֬YY_|}Q\|ű馛ri~ҹsx#wWdu)DB+U>htAѻw83}ѳgϨPB1|Қqwfw\1;sT\9vimݖL1Fgy&[{6JU+,lSe~}Y 0 \ ZjA͚5Lᖩ佧/2e.'S_~yجY[nnr믿,KΌ)X3}_~4m4h׮ݒCbڴiYݢA'fZޛ4i+QH.tt%:B� @� @� @� @� @� @� @� @�,SL.eb/pѫ8Pw @ _ <Ƹ馈eVŗ^z),wߍ!CoO<DznVѨQ{.͂ { lܸq̜93 |L)1c}v-vao駟#FēO>u]YxcfWo?Y{/^|A|7|rxfg}dz}wq%VKŊ\ )S:ƌyٙԩ ?~ 80;6l[nes9qS2}Y] L)򫯾"i>Ѳe˸kL2Y`SO=}c 7̌evmݧOlLjK!mYi&k2 L)my뭷ƃ>C]`;/[/o#Ϩ^=ry-  @� @� @� @� @� @� @� @� @�U( WVem5; @�)?D.0bȟ'Ha5T,dF?wZi޼y?7nF.|={v|Qnݘ1cF - ~i_:{_0Ӿ&Mnk1#N:)+#xt%K ,]tdۊ>O>= aL!) rUKZjժΝ?cTR%nY)2Ow=a„Hαh)Kj{ȅPF¢+y&@� @� @� @� @� @� @� @� @�VV@JG�֒@){~^:+Rb?9#Ə_Zzk- |C]Q @� @� @� @� @� @� @� @� @�ye @�EC࣏"o+W.~xo(AV͛7_'NC5#N8܈_ٸvEÆ WGmq-[FljMc @� @� @� @� @� @� @� @�( K;8E3#ƍ~w Ν %Ҵi,qyǯVZy1x[,.еkի╫k"vqmn*� @� @� @� @� @� @� @� @�XR re/k^6U�X{EKGԯN+0mڴhܸq.8||x饍b};Dj~}E|YF @� @� @� @� @� @� @� @� @�*P۱  @@䓈R"ݶHnoTʕcРA1et⦛ ,z81sfD^kkE @� @� @� @� @� @� @� @� @�! xܣS @@1?>FɁ1֭iӞ̽1ƍ[G)Vq9]F� @� @� @� @� @� @� @� @� X@d�@ ]{Mf06OiӦq}bkk~y P{]}Nj* @� @� @� @� @� @� @� @� PA v<X2NkEy;wC3g坮{R% "z:u<] @� @� @� @� @� @� @� @� @�- rm[�,G૯"jZNM,Ч)Ȫ<Ԁ8묈2eADw] @� @� @� @� @� @� @� @� @@Y� @( |MDժEiG^W8XAu*EtqMӧ*%@� @� @� @� @� @� @� @� @�G@dK'!@�b o^ RĎЭ[ȑ/P6VLsgG]L @� @� @� @� @� @� @� @� @A"  @>4"><bܸ#&lوɓ>O1ujļy˛Iۊ5h$WԾ:mq7ܰ0ru0� @� @� @� @� @� @� @� @�R r۶™/C�@f//1iRD*+DzҿOڵH[o_ ܼֈ]w8eղb "֍NV_ @� @� @� @� @� @� @� @� PRJԃ;7XQwQ:֭@._iZ8"f͈[n><"jՊӟ"ƌY9Z@<昈nXv- @� @� @� @� @� @� @� @� @@ H :j ϟq+ 4mqCsF+1eʍk{i%@� @� @� @� @� @� @� @� @�%Y@dI}g'@�u*PFDfJ-{*Ehv-+曈U+_ٳI!,X rĚm(b}#na2 @� @� @� @� @� @� @� @�( :;.;r "ڷ(Wn8J%DԬqe'/ }?@)Si=7#>t0� @� @� @� @� @� @� @� @�gAv�G,{sDwܲ۵Xc#ʗX2qё , \ nQvDޫ? @� @� @� @� @� @� @� @� @8 ,ηl P6<b#J/ȵjE4iRP7NG-QԲnӲjeDzj]wE̚jc&@� @� @� @� @� @� @� @� @�%A`)S%H�@Dx/լ@ 0`A}lO6-eB� @� @� @� @� @� @� @� @�J ȒzM�EF#J/9s":v,2[\7ҪU=,S.M˪ W{}뭫> @� @� @� @� @� @� @� @� P*u> PT82e~;Glϟ=@ sL`Ԯ'GjGx @� @� @� @� @� @� @� @� @@qY\oֹ @`h>b[N'^m9DJ-dfwݵfM� @� @� @� @� @� @� @� @� vC�Fl­Pc]/^l+#:w(ĿLY/l2vq}7۶Q @� @� @� @� @� @� @� @� PKD z @�"Z-l5IU zkD ,S)gO#p 'F \0� @� @� @� @� @� @� @� @�@�g>&M^*.5z/x3gN/_>*T*VժUիg3뽗Ea?PG 1~Ĕ)*W_}SN3gf~)ʖ-.k6-"iRe1_:b}":@� @� @� @� @� @� @� @� @�J@RPnvLԌ!@�C`„ ;ѣ_yL<9f͚CV̽ͽɽ~_ߪTկbm>{F/}_L ܝT=}Q�9cƌ__VE QF:|ؠAN;=w/񡝷qّ ;TiY  @� @� @� @� @� @� @� @� @@YrI  @`- 1"}x׳W Lf͚)406|:rn]* L?SJa)믿M^_}U3& cڴiQL_~ѤI8ȵx"T |'_yoI[~%jz8烨W^Ԯ];-"6lXbv'*T9sd3gΌ~!fy|}]/_> w}e˖{GRQAnpʔ}## rfs @� @� @� @� @� @� @� @� @�S@yovM�EL`SOſ<xp Xz,/2׮+W.?>xx7հa8C#FEyds}ţ>ovl&~Efr//S|1dȐB'?HmڴGӦM n">ӡF.@3駋Fm� @� @� @� @� @� @� @� @�Ak P|^y,`1u,e˖ѢE,tTR3f̈^x! |'cرQ^رcS:XxwYHo~xټy` 6b#Ĉ#~qiEN 5 4ᡇ";.rժÍX� @� @� @� @� @� @� @� @�AEl�/9sCd={;;sخ]]v=k<@)SđGw^Evϫ�9`_#G? \lӦZ\zk7ʖ-CnݢJ*^2I�O&N=u> @� @� @� @� @� @� @� @� @�5(3��y-[o;wv!|1bD\pE:2]Qƍo &=}Y^ѬY:th!Coh۶mv?^<sqG뮻F>}bq9 7ܐ}Rܹs],z 7h"GL� @� @� @� @� @� @� @� @�J ȒyNM�(пq{Yرcw}gZ7`СC 6, ,W\>>F7;<yrt)wb-bȑѯ_hРj̶l&qe_|gyf\|YH䫯6V:∈^:u--h @� @� @� @� @� @� @� @� PDAы-()vEӦMcѳgϨUV"?O<3W_EÆ OS̞={ g^{ß}y_O?[{(*WW\qEQfh֬Yv+ً[G*Ec?vA� @� @� @� @� @� @� @� @�֕ u%o](} cСqwV[mU:<cذaqu 75w}wuZkc,X\rIټy9rdif_ mY7ߜE:ĉ c>g*1`Z_ڂ @� @� @� @� @� @� @� @� @H ,Ra3 Pf͚'xb~ѭ[,q. [+=.]:>jժ|ꚫ;ٳ]vqm}ʕ+tEn\.]`=|EnxوOL!@� @� @� @� @� @� @� @� @�%V@dz'@� L<95k?x 4((WҺۺ*{83㎋ .Hu̙Ѳe<xpܹs_AmAkEգI&Y iAͽi*bƌ_W;. @� @� @� @� @� @� @� @�X '~SLaÆ!RDvQlٸo1t ,XYby1N 2$7oDjժ /;-Z>l>`͚E.du> @� @� @� @� @� @� @� @� @�5F| @@qovfr5:GG;3 \ `g' `"?EŊ:uAM/gZEA @� @� @� @� @� @� @� @�( ;X`ܹqGǬY_ZjxP qaEn^z?CѧOxqlbJ*SO=3gΌSN9e]ll:bܸ# lJ @� @� @� @� @� @� @� @� @�J@zu]6K�!pǰa5j) +ݻK/3~8㬳Ί6mڬ‚ժU?{챸;–Vk;J Z "@� @� @� @� @� @� @� @� @�@RPhvLԌ!@�+ꫯFӦM{;b`9jԨ9rdTPaCo|˗_kŅ=,O?ʕ+-pOE|m3Ϭ @� @� @� @� @� @� @� @� @ .v'r  s΍.]ā(r%n喘8qb\s5+9bͻѷol͒4?-.>AE 1k> @� @� @� @� @� @� @� @� @� $ܲ3 @R|ApCej׮=z믿>NrְWZQFqQGLcn^xa1czy\j FY`A<3ѽ{vm#}.2lذKUVqUWرc cs @� @� @� @� @� @� @� @� @z. r=@'@�իWi& [YJO?=J.wyg>M80N;B_k}ZओN3gƣ>>m;<agͯ*ԇǸq?<J*U=sѸqTR9f̘hҤI|  @� @� @� @� @� @� @� @� @`( W m.< @p{e]bȐ!ѬYYڵkxgbхz6yYgŤIB]l=# ~l kE~ f|+O?TN81իu֍ÇgsO6-j/4hjg2 @� @� @� @� @� @� @� @�XJ۷{ z M74R0?1cƬU/Ǟ{)r)fﲀ/W_ĻFZ)]tWA~w}rJԕ+Wri#Fȯ@� @� @� @� @� @� @� @� @�" @�%QW_͛X(ܴ\O<?pp q}ų>5k֌=z;1祗^ʂckc7Bn喘7o^}qG5\ ˥JnbΞǏ~{ح*-yDzפIQFqF*UiӦQ\,n[9>QGUm㦛nL+U:u-Zd|qF ٳgl2<<xpqq7x3ڵk믿|GQNlc9&k˚:)4}>iVgu:f}"]e}!,ٳggCsfڵիgg͚7|sf?s쾺v_iر6(UԢ]by߉:.SO=.ye]3& @� @� @� @� @� @� @� @�(I Km;+ =: ̯XÇاOHu#G+ʖ-<H<Y]ݺu#}gYxߘ1cq?d)7ވ;/vq,.O?=СCpy ^RޕW^~aq裏;+V\Ó.oȄ˘$(7YFU0<0.\!q%dA)q뭷N8!R;)0=O81 |ƍ~m} 6,9{?{lݿx9A湤,@j2wjE L黽뮻FrAeSL/&H;H}R@f*)5x7k}':vz F^[,֯FtG  @� @� @� @� @� @� @� @�'�JI~ڶ&�7tS{P@ژJΝ;k6z왵7m46`\^,0Th)UTEK KA)/B$SywꫯpWN,/Qwꩧf O <yrAL9f̘kVZuZٽ{,@Nˆ&y饗W_}q6o< Ooծ];&L/RzYgoUTS`'M?w}wy]/?zPü}.پ>|wȹ..,;/c,<uQS[ne68Yt-v5ZnZ�пo1w8裳pxH Z׾)T @� @� @� @� @� @� @� @� @@ Y.q  @`ٳ\rʱFe-ܘBSd hLp|A~ӦM˂njFR]ݺu�_۷o6͋?<1f | }&`&lE+9%ҥKgwPflYBHy%M6Yv- 5kV^yݲ-ZĐ!CbYdإͻlR`ZRmEN? >ߖ:ȼ+d)_~Yk^dӬY{~O)W_;)3N;+N֕My'cʔ)Ks>֪Ukj @� @� @� @� @� @� @� @� PA/ @ �ӧj,8pԩZիW/<Ĺ;C~0n&pvŭޚ@r-ѱc=ztT\9z뭕n K5-q6E=[t)22e}im|I/-oPӦMǼ5ڗ6oޘ}bM7]|{G.1bذ/r?fnlٲ^&MRʢY۞{?|$QFe~;J,;|H}YER^E= @� @� @� @� @� @� @� @� @@ Y¿�O�*PN )lnvżym۶1nܸ:thlfqw<{W1" |SNQfp cڴiY ocǎu.V&Rh߁&S,wlZ~2%a)qp2cƌ_-eUտѹs>y5jȯ+97ke0&k ˕+Oǜ9s"}̙3#@/2 LAyeQٳggկJpy]{_wbq9,6fiZl;cY䢿 &dCׯ @� @� @� @� @� @� @� @� @ .vl(;s./BDVb1x,<1@?Ƃ 'ܥgO K%JwիWx Lm=X4l0s%,6﫯]tQVlɱ0K ^%fxwy'vg+{f= ؈z+{/V_\\S L%`rNJ ?СCPм+V}/}ټ)[;&|}M2%t͟~ߋ<BgSpB� @� @� @� @� @� @� @� @�AIx'@�%ƛoӧO/s?ٜ)v!:w+WzH}?f!gώȑ#qQR,;׿57hР/~ĉ2J&MSO?qAE޽3ΈGϞ=~矏2edk|˚#)D`gr[n_~q 7Df͢nݺg!i}/lK)30Uƅ^U-ml^5yO.[mU&뱹|~de]m)fN:16]{+UTYfe}⣏>/86t8ԗ_~9'Ľz̘1#eaN4m4ocyN;sLvmYxdԨQg~mQO @� @� @� @� @� @� @� @� @@( W mۅ3_P3�@ ]vҖB n:|y督B Y \ |ᇣF18C駟-"<Hq{n4h L~W_}u\q">8ó#<2N>RJ\Ra qpkQGH뮻yqlC9$ U]`s.m4˖-c̘1�פ̙3'tYHVrJxse)L0\&G"km]\tEYgԩS9hP{/t'׿:oj(ذaø;xu9A.1;v~'Ɗ+fK/4䚂"kժ};F=t9R8cޝf}Sdz^w"*%B^c,pM6Y�̣/ @� @� @� @� @� @� @� @�A�!pqe}#FXFU $d6mZT\9zϩ~sF {L)y 6ƤT7o޼0aB׿˛4OԞB `zE ?_P.utdyUW]>Z9},<3KVTiU/~~l喑? ;ѨQ2dH4k֬+g͊\ %ѦM0/kx nLyCn|o%Pե*kKɓ'Gѭ ) tҤIQN_� @� @� @� @� @� @� @� @�$A Pb[ 80Bf Sx"2Acذa1z_P{}ɂ-7xXbSNoD ,V^1q1j{#9 @� @� @� @� @� @� @� @�X@eh @�\`]w?>vӧO_~&LX㹊>l7zVB ùgώk}qǟ絺na.vgƆ֋3<017 @� @� @� @� @� @� @� @�( 5+뮻.~8V{ ͋N8!zlO>9՞N6mD֭67lo[|'kmݢ[nBL۶m[Z{m2Q?Ͻ*f͚A @� @� @� @� @� @� @� @� PJ-ȕ:V^Q5y @@ <q-]tYNظ *Dz.[hG/WV6{hܸqꫯFrEeqWoKQ#wѤIT-EdUF͋nl� @� @� @� @� @� @� @� @�֥@u  @@Q8.nݺŖ[nZZmm&<f}2S@+/r䔂5NS��@�IDATs=7 \_ j=\믿X@& #Jh# J< @� @� @� @� @� @� @� @� @h "w @OSxqGO`ѹs{_~Yo~wqWmuz8c>{0pÈv>0W17 @� @� @� @� @� @� @� @�(e6�[RJŭe˖m7vں:^}q 'ĠA-[Eyq-D.]B q=}&M⮻]-Q.'s& @� @� @� @� @� @� @� wWս?Phzl +lHk (&Xn&Dij$7ן^E"zՈ(%vc@ o( :gf֙s>φ> @�'hEޟeC=T>M7n\o7ȭޚvکb?̞=;?я2iҤwyi֬YW1"rHvq\wuiٲe}_Qcmer9Ub @� @� @� @� @� @� @� @� @RhIKʠ T~_䦛n_m6#Gl*KOuuu.l6Yq#TTdF|ɹZ{S־j~_r?>elL֧tL� @� @� @� @� @� @� @� @� FA�+P >ci߾}zSO=5^NRa=3eI'{:TXӧOs=;vlwn× W^{쑳:+sN.체hѢhJx~zE� @� @� @� @� @� @� @� @� Ȇs&@�.g. <8]t̙3gϽ,'(=lfy׿uZj,BsmvyG�"<v^{/4hܹ9F套^ߟ˻e6ǎW\f&"@� @� @� @� @� @� @� @� @�$ r9�@3~/vZ6p\pehbY'+-t'k-2lت5afԨQr-?ٹ[կfС_x ݺu/L6a|<rJxNM&Sdk$@� @� @� @� @� @� @� @� @@Sٔw  @`V[m{yg^{?qYg2hk(smln&eˤI A޽SO{syeù2eʔܞ> C IӧOlfeEͭ[ȚvQo,ri� @� @� @� @� @� @� @� @�@M{Zv* @�&(ЩSO/\^}֭[fyW+N:F)RWy72t<CU5 #LM d-a jӦM8㌼я~?رc3E>{?-_~dMOԥK]r_r79 @� @� @� @� @� @� @� @�,#pO#]sM}h PEwޙ+2Æ ˻ロ7<{Wynv) 1&ձo-ܒɓ'!wR]vDIf%wIީ L:tD0fQ^{m.i׮]xe]Ҷmۥc=o17pCx≬9cҿ~@&?o~3y_m E+� @� @� @� @� @� @� @� @�, %ӝ�|@:x]weĈsϥE޽{@ȭ:naua|饗2nܸ<Sy衇sĉ={>쓽޻ \'9ԄZ&@19Qu^9rdZl=zdv*gM7-27oSn{1z{ケoE�巾r/;ϗ*B?~dRڙu @� @� @� @� @� @� @� @� @�F) QnE @@%a>`y?xf̘Qj:tHYCn:Z*Eٳ˳,:ujLRjƏ]qao}ynYywKSNI JLVYeIGZyOMeq;6Efa_u:Ykkث6mڔ{R|PϜ9&,c{QEoY.|5H^;E hUUUT@eI۶GT@AJ @� @� @� @� @� @� @� @� @�KA@R@5$X@uM/qƕg9y`Ƿ~ ,�ȹsfV ,۵kWY vڵ ., W]uEMYK=RUE3<1cƔ{+ԅ;;)R-[,؏W\ ,B#sϦnZ^9\`>}% @� @� @� @� @� @� @� @� @!lF z+N;.9dcAn{&4FL#@� @� @� @� @� @� @� @� @�&,Ь  @�XmdȐdݓZu!_?? | @� @� @� @� @� @� @� @� @A6R&X}$O= rݒONfXU t钼Bc[ @� @� @� @� @� @� @� @� @�A~h�Ó˓-Hs>~2eJK @� @� @� @� @� @� @� @� @ l@T P)%O=tcriɬYR:@. ᅆ  @� @� @� @� @� @� @� @� @�O6 @�!Z?\|s#?,z%UUY @� @� @� @� @� @� @� @� �A6MS2$~7yd=OO̩ ҐڴI\3yᅆTZ  @� @� @� @� @� @� @� @� @ \|+=  @�O)H??#yO鬙^zs:yM� @� @� @� @� @� @� @� @� q&@�&PUpBIv'̙SiY'yJR} @� @� @� @� @� @� @� @� @ bn"@�>E`oO??JFΚ ,B`A.E @� @� @� @� @� @� @� @�4Ad#-�T@UUrɓO&:$oٕTZ*U@d @� @� @� @� @� @� @� @� @>Aև1 @�E n&Âs#U#:"W @� @� @� @� @� @� @� @� @�F# l @�JN8!3&Ysͤgg?KfϮzUY';7y_  @� @� @� @� @� @� @� @� @@} oQ @�9 [n<"jlk�W8 @� @� @� @� @� @� @� @� @@(բ @@e TU%<dұcҫWr)ɌY@mIg~ @� @� @� @� @� @� @� @� @�) ri�X@-$srI]w-&(кuj+4[2 @� @� @� @� @� @� @� @�4zA~-�TG'O?lin '$[l t萼L @� @� @� @� @� @� @� @� @`Y \V!@�)UW%]lI2b"jlB%oфl @� @� @� @� @� @� @� @� dA6P P<LҫW>ɑG&o]5n z2u @� @� @� @� @� @� @� @� @`y \^%@�>!P  v[ɰa覡 kFX% @� @� @� @� @� @� @� @� @@܂  @@ >$x`꫕_ O:3 @� @� @� @� @� @� @� @�A @�XeKoO|2xdРzn@vo4Y @� @� @� @� @� @� @� @�4iAMz-�Tn-<]wM{VX}uA_N @� @� @� @� @� @� @� @� P +ugE� isNCɴiIg'suqڵK>`~7Y @� @� @� @� @� @� @� @�4qAM @�$УG2rd_$$lݐVX}=N]/#@� @� @� @� @� @� @� @� @� C@d'U @�'ТE%?ri%3f jL`5Ӧ5UY  @� @� @� @� @� @� @� @�HAW@�4H 6H+ӟ?9d+o)SNӻw{UM7ݔu]7zkEUS|  @� @� @� @� @� @� @� @� @�" u @�&(PU{l3ɶ&{L1"zy &L'V!vD= @� @� @� @� @� @� @� @� P_ K8 @rXcdԄ-&<lQ?'Ÿ3`rnݺO\5,΄'|ryq-Neg֭iӖ&#@� @� @� @� @� @� @� @� @�K]@R'6 'y裓Ov%;vY;`'ϼy&n޼y}tԩJg啓 @� @� @� @� @� @� @� @� @�F! QlE @�+$?~ɀٵ=5GgСu?>;c^ ><#Gֽ/nnuQs=sW,x(+93mڴܹs-x`^{핢:lӧOFsѷ,*O<lꪫ5)gyf T>^~uYrH9O˚S3H޽ӷor=}_ SX @� @� @� @� @� @� @� @� P) +e'A�ԫV[%='瞛t~ /;=zK.Isa`,VZ)'pBy6#HNO)֭[U>#<v(Bc)9lv9sfw}-"o-ܒ^{-z*۴ij ,B%.]Su9RAϿկ`oYf1bD׾ʄ ҳgt1?3y20}:Í z@4 @� @� @� @� @� @� @� @�T Ȋ @�%мy%O?lawL3? qN�G}t:w>;;S\veСCMdMdͱze]v)jgdM2f̘\tEo~_*_?ceW\Q;![ƍ/KBYt.$_xᅌ92XP{XUUU9SᄏnI,B&۶m?eĉ1ZhQ6ack:b qgAi, @� @� @� @� @� @� @� @�A @�@Nɍ7.8" Çg֬Y~h*ڋ0Əni5[/I&+2ˁ޺<`.]dڴieZp8Ebk &{)G 9{̝; <cOVN5PEex_ϐ!C>nn 6N8o / s @� @� @� @� @� @� @� @�HA-"@�~%O?sLrIIϞɣ.L?|ٱ6ȱ>[T^-Z(q@QF|gR{i}jn޼G*4hPy=k3oVM曗aeE)j<xpXc 80_;3{x׺uEڶMfrc� @� @� @� @� @� @� @� @�T J @�KU`[�ٲe6ɏ~gOۮ]}ݷPǵ^|СBP皇5ӧOOc„ oV[mUmruוY2lذYdx6,_üy^sG;(+9Ϙ1#SLDm(%k @� @� @� @� @� @� @� @� @�J@dN!@�W`M{ML"hk>ۮ|y=,iԨQ;P^k gϞP{b-.~zO~RY7Ec�ya?i\s[ʀ}>O8yꩧ}_K.$ӥKJk裏֍S?#K/յ׍ 4 @� @� @� @� @� @� @� @�T J  @�T*wc=LMb ?^7͚w^__oꫯeZkU^</maҤIe[cW 6,{G.袜x9;uZ԰WΝ;C-Q߬?O^hСC3y䲽Xsq++BN:̛7/;s Pmwz뭗m٦[A֧ @� @� @� @� @� @� @� @� @Rׄ bvHR_#� ڶMAu%{%;쐚�o2q7s=k&GΈ#ұcDzjn)=XnaY3[o_|1U5'\Kyc="K/ͦnZBŷw_V[}X\]˖-ꫯȶn[+B:?r.~wI=2p\uUy3x9Sʺwir~8wuWn9˹kǮw'%W_#� @� @� @� @� @� @� @� @�,ꚣgH5YC @@YE%gbryC|͌3&:uJk,;wf͚}g>?Ə_/3?ӧM6 3Y}?Esͼy+QWYEvepOZ@wSO}q|M� @� @� @� @� @� @� @� @�*I@d%Z @�:5O.Kv- 7D!g\|qj1r-� @� @� @� @� @� @� @� @�@&N$@�,@vEܬ |w68`~A}rUVImǣud֬zP @� @� @� @� @� @� @� @� @U@ J @�T@K}17põ3TWWdɍ(Aj;-� @� @� @� @� @� @� @� @�O  @�8}ws<s@yftgӳg/,PÙs>$@� @� @� @� @� @� @� @� @�)Ь"R @7oSO=.S>ca&MevayVm(Y/hfZ @� @� @� @� @� @� @� @� pC�|W\1+<]w+Yg5ᐷeΜ^( [z @� @� @� @� @� @� @� @� @� !  @�Xc5rgԨ'ҥ:4h^ZjAE zu @� @� @� @� @� @� @� @� @�E \V @b q};Ӫ՛9-ZnX͛ to @� @� @� @� @� @� @� @� @ l;n @=t0ʚc 喧gUgC*Y/Rj%@� @� @� @� @� @� @� @� @�/  @�,@UUU:oMe|k]~̻~Xc - @� @� @� @� @� @� @� @� @@xJ @� hݺU 95/<>={?j?>Rd(,5R" @� @� @� @� @� @� @� @�,@Uuͱؽ?c> :\st� Є~{z^xaHVZg>xMH:eJrI +$-[&-Z$w_~^KN8ԃ� @� @� @� @� @� @� @� @�T J5 @�R`ȐG߾3kuP.7c5ʵ~EuꔼrҼyRU,)kg''-h� @� @� @� @� @� @� @� @�44f ` @�@߾=[wd7ɞ{ngPTu~xҲe2o^2wn 9s,B 㨣ʋ? @� @� @� @� @� @� @� @� @A lۦh @! u73}<԰lqs=1!~ ?kN^>w @� @� @� @� @� @� @� @� @AV�h+<_~L^{2dȖ`Ky?gY[o֧wj"{C� @� @� @� @� @� @� @� @� ȆKj$@�@+~^J/9d͓.3ַoҲ墻̝qĢi%@� @� @� @� @� @� @� @� @� E@dC)u @�Z}OJz*-wd睓eϘW۟ݯ=>Ym_z%; @� @� @� @� @� @� @� @� АA6R+ 6 6,y:39dܸE/On%cݧ!n]ҡâ+>Ek%@� @� @� @� @� @� @� @� @� I@dC- @�MF`{I!nw\L {,odΜ7Ļoߤe˅/@L @� @� @� @� @� @� @� @�h �h{'O< |sҵkӟ&3sN2kւϝ}wraɼy >p -Z$҇m @� @� @� @� @� @� @� @� @@C9>}t55q @�jfN. J3L,5>dگ޵uھ}~n}� @� @� @� @� @� @� @� @�4T  @@Ch*9 6HdEe%w *9찤eF zu @� @� @� @� @� @� @� @� @�> @�*Nwѣy]Zuuryɯ >HZ?)! @� @� @� @� @� @� @� @� @1l h  @@/$~ޢ8#ӟ>WeqdՒ#UE� @� @� @� @� @� @� @� @�@/o @�ر'Ջ7JrI{yw2mڴ9sff̘km۬Y2o޼;wn}m[u~M䪫u_*͛7;[h}6mҶm|ڵx+8R[^eO� @� @� @� @� @� @� @� @�M@dQ� ~C -<&.(#KV^9{]"q9uԼ)oaEcquEp+'Ə9~4x߬Yƽ5j"?~<YuAY}Ӯ]l߾}s5jVJY @� @� @� @� @� @� @� @� @�_Rc}ާςkkrC� PӦ%>9n\2fL ̙ &k<)Κ?jsُdU/I&W_}5Zx㍲_m-k&kp"$񣡉_iR=m۶_(2&A咎3gΜu!ӧO_(̲6Eem[oGj١C2ruIqvرv)뭷^Mp"t'@� @� @� @� @� @� @� @� @@7ݒ  @�'{ՄC>#_9geVyv5kw9ge=j kfbX\}ecSZͫI,1'O\EXfq_giaSL lժU:w_?]v;m-4N @� @� @� @� @� @� @� @�4yAM�� @! 3fL|<S5ϔgJXUUUecmaJִuN]jvz몆䊮uΜ9e0/sy._a`ȍ6(Ź馛f6lP'"+zG� @� @� @� @� @� @� @� @�zYϠ#@�ԗ)S#dcaiӦM(g 7;t֭[W oVƍWcǎMqA&LӪUrjԞoyڶm%g9 @� @� @� @� @� @� @� @�T Ju @�MJ>ȨQr硇*ϗ^z4رcrl馛|l֬Y2jL1cF~<)>}<>}zZh6,m]y~_O׮]� @� @� @� @� @� @� @� @�MZ@d~'@�9soϽ[?Μ93zfm)Ϣgȑysљ={vXc;sod6j VH� @� @� @� @� @� @� @� @�F* ne @�'0v،1"7|sX?ze]ʐ^z[nW@9jԨ_*s=>}z\s{ウ{fV[n5� @� @� @� @� @� @� @� @�L@yM�Xl 7ܐo1&Lꫯ_cܹb#yeѹ;r-Eo8 x`t� @� @� @�;��@�IDAT @� @� @� @� @�*X@do @�'P]]x W]uUڼ|ͳ~e}M=ҬY0W{WBtM)Sd-H߾}saSNY @� @� @� @� @� @� @� @� ДA6ݷv @^y\z<xp&L:}!u]1O?~Bz5ה!'O.[VZnij'@� @� @� @� @� @� @� @� @�e( rb�h|w}w?tMY{sG#L׮]bwyg.\ed?;vl0P( @� @� @� @� @� @� @� @�@Ƹ(k"@�,M ><[ouvm̞= 0aB~_ \^,f͚F⊼9묳r7fO~2vG' @� @� @� @� @� @� @� @�AojD @ vmjr衇f-3<g}R9TW՜tIn!/b6d2^rC� @� @� @� @� @� @� @� @�F/ o @�!0q;{wgРA` cxcXUUU{7zk}t- Ȝ9s& @� @� @� @� @� @� @� @� @� K @�|^M6$ӦMˣ>K.$;v&P7C/E]-"G܂UF� @� @� @� @� @� @� @� @�F$ m @�+0cƌr!9Ssg{fmVrׯ_Ǝ7<;C15 @� @� @� @� @� @� @� @� ȦVI�,o]w5<H~|{KUUo馬[zb<xp:??}{/W\qE=ЬꪟޱTWWEg׮]S<;*2dH~?A~!@� @� @� @� @� @� @� @� @�(b)mh @@( {̜93=Pڵk1a„L81uy/R|\߿R-a={vFw}w5k2mڴ/YG.0Х {eVZe+ @� @� @� @� @� @� @� @�U56_קςk @�#Я_}5jTڷo / ;u筝pرh A6/n#G~jz*\}smyKi{7ó~5L� @� @� @� @� @� @� @� @�JhV� ,n/ɐ!CKdYߢE̎e9_fRKz?ϝw޹L*礓Nq3g#@� @� @� @� @� @� @� @� @@X)?M� PorW^˥ԱcǖAE1S#dذaYi>d7n\>//B~dܹa>}k={v^{=+;vL~衇~zr}훝v)SN矟{,_WrGc}@Kb֬Y"{~Zn~;^{m<vmsgN΄ [7(j/ε,-~Ygu9^z饲O^;\pAƌ֭[緿m} :{uW__|1{.yKӲ` uYKseNX¯u'@� @� @� @� @� @� @� @� @�hY/#@�4%"X{G\}UWկ2qIJ~ @,*"/:ꨌ92믿~Y3zr 7ܰ -,kC /ѣG.䒴o߾.8跨c6)B"XgϞ)$ɓ'g5[e#R6lIՍUR{eX'xb+"_~?˵EXuV~Roc!7xc.rEdqEATT߿ ,9iӦ <}-Y_(,M9 @� @� @� @� @� @� @� @� @~A֯ @�,0~̛7/ݻw_.8N4,"_s}w|($~Ჭsw'?I\SNw;w.+2P)(wmw+,SO.;.;C83S;f̘\zlҫWwy{Μ99sft)-[L(~7ˠ"fxieW^Ҷn|+_)$5ϫz<r"(jr- <WE}EHgYa֭sgҤIKղ/r-<_S @� @� @� @� @� @� @� @� @g  @�ZUVM6e[¸+E`q8p`y-߾|>|xf͚U\6k믿={矟<ݻロn!Æ [o]'pBt钕VZTWWgСYs5ːwqr=\Y<S+3}\p)޽'C ɴiӲ뮻QAUUUumKr:ꨴk׮ :uj9TQOY{WX}X٧O2t0^Z5 @� @� @� @� @� @� @� @� @@e P   ͛'XU,E?waW_}u8hРwquݞY~_/۟}ٺMP,<x~gyfFU>hw[^<EklѢEnr۷os9';S@MO믿~][qS12.b1>]FyI'E32bĈsGkرeߥaE|Nbu9&@� @� @� @� @� @� @� @� @�%X8hI֟� ЈV]u㎹䪊p? $sM7vZڵkWw}umk]>wa>:kuڶm[ޏ9C2eJ_=(B'M'.G7oΝ[Q�( B H .ᆊHj"&٢hZjK*feOPܷ\QC wERB7WPߙA@lr/=׹g3{;rW^Y|ŧ7n\CM=6;3A~y ӿYfe8Ջ/XYc5a9&f3࣏>ʭޚvm6"@� @� @� @� @� @� @� @� @�y9/j!@�Y;.7pC3@&~sLvy,RSlAM=V 2[Lwׯ_Zn޽{/Ϸo>K.d<SS4iR<9r걯S9ne3Yf믿 ҥKZhQ3yrcǎw]O3a„}~խ,'݊ w}7vX:iOrl׮]o-0YN>'N:s(i @� @� @� @� @� @� @� @�G@ @`v)={L=;Lsfv?ri~<^{+vZl}٧<v衇Nwn]w͎;#FRqYnRG{W!/k<3eO2qmMx9d뭷*M6٤~n"L؊ZEb>}_NJ6,EP.;5򪫮7ߜ_Wy'3nܸ2sM7--|r]ÇO߾}#d̘193ziӦM2yK.СC^vGqiժU`ʙm{o>TY}ꩧ!i9걛n)~׿޴ @� @� @� @� @� @� @� @� @@ 4T]%+6* @F0뮻.E_ؼyOSN>|yWG}9蠃R%?#(En8VX Eo;ؔnݺU</go=m۶-C{"|^*{fmr- QF3,yr;38#-ؔfoHQ}t1;wFmT7})"$rUWO<QS4([mUu]eH!ݻA^xaiW֮]e`eӦMg㔓&M*&oaEŶKe]ʠ)=%X"]tQr]E\-|qc9_D秮k  @� @� @� @� @� @� @� @� @ &W~JNUzl @�:-~n֩{Ynfs E\eUf9nN'>aE`׾9 J'N_|1~i9@O>$K-Ժ3~.N!ŵE`;SgN+ 6L-jܸqiӦMy䑬jӝ2dH8ya}Y)̸-H"'?I:2(tfc#@� @� @� @� @� @� @� @� @�h<%T @�,z_s}W^tMsg3 ]db}n|g%l0]"lqw>;=z٩XF2�iC f\+Bl-[SN9%7x3)߃btҤIe_Ν;OZ3oʸYN9 ?A7pCC=tAN6 @� @� @� @� @� @� @� @�꽀 z�@�J`%5\?9sUW /z7K,9chѩS9YvutaS4klg?Y\s >< <o>xW-ZdhvK'@� @� @� @� @� @� @� @� @"/`reUv^Uiꪨ @vk9swW^9餓Ҷmќ.j\[nɾ Cݘ_"Æ K(Y?3ҲeWU},_|Ä @� @� @� @� @� @� @� @� ]f @`s1:th<}Yc5湞 _~Fq3]_|52LFn <xpwKvj @� @� @� @� @� @� @� @� @ 4�O�*]tɓO>:O=TZk?I&}Rq&M2XZӦMS?NZKsw=+r^x\qB  1' @� @� @� @� @� @� @� @�^@d � @�@ R 2${o@nݺeUV 'ÇՒV"tw6mOnW^y СCΧ @� @� @� @� @� @� @� @�̽@ɕm~dU 8g  @�oK/4\rIשS{ウ+/j˵Z(P?>P5\~;m]~d=LӦMkaZ"@� @� @� @� @� @� @� @� @@Y @� P.W;Yӭ[|;o .Oyo9zkF 6 =z~v'k%@� @� @� @� @� @� @� @� @@Y'n&  @�(0iҤ<rM7W^r-.]dvoVZ..M I`ĉy's;C=XΝg=HRw%@� @� @� @� @� @� @� @� @�97J @�A`ذaswرc*dV[m-2kf5̤Ģ"_fȐ!<xp T>䓬 q;k׮iѢŢd @� @� @� @� @� @� @� @� @"/ rH�F"GPG} \nfeM7-_:uJq̶ L<9Ç?{|=)+[.BvYk}+$@� @� @� @� @� @� @� @� @"* rE�-gȐ!<xpP5rrm۶͆nX_i߾}6lX۩cƌСCs駟OҸq㬷ze h [fWz @� @� @� @� @� @� @� @� =  =:O<D|kx4irAYI^{takVkԭ}y饗2lذ^x!#FȤI{Zke6*>XbP @� @� @� @� @� @� @� @� @\ 4 @�Ԩ@V.m]gBVMꪟgV_ , dWLYV]uլS_EbzƍQFW_Ç?h/Gڹ~euz뭗5X#'y U @� @� @� @� @� @� @� @� P7LljU  @�k%'%=RңGҳg*!kY%)^/\E +z+&M*/jҤIoaE`dZaҺu/"^z8qb{l=+ ~efXos]rVYeS8"Sc=Y* @� @� @� @� @� @� @� @�f# r68N @�jRkI2y衤Ed}2i`޺7n\FW_}5E6,B),-X_~ree2,3kc͛7K,f͚ 6g̘1;vl'䣏>>Ȼ[Sר_ ,2hm۶o׮]Xi6כT kV� @� @� @� @� @� @� @� @�@Ѧ.  @�@%07\xE�cnUǺv<+/B W[m5ZEpѣowޙX#_I3bĈ?L8qV%S[CNٴi4n85*_O9V!E_&L،SgW&MZNf:'r% s|[9PBgy @� @� @� @� @� @� @� @� @�" hK�Ja*/HtI.$}d%aXbJ+Xɓ'>9j9%qǾ,v0i+jO ^D>9x ($5kVf ,O \2˔"rNydһwBr ̩O  @� @� @� @� @� @� @� @� @ 4Lw4`@uUT� <pү_rɻ&oZ~Eg r%cV5HoN>8Yv٪{שӂ\ @� @� @� @� @� @� @� @� PևEZ# @`a br I[$&?Y2bD2xprB ʽ-U>gVgL4\I� @� @� @� @� @� @� @� @�A @�Y7J6(Y{K=Lz*:4UVII"PsuoiuWriɉ'&;F� @� @� @� @� @� @� @� @�E@伨� 0G%{o&%]}%#G&gl 8OݺlddI'otp<" @� @� @� @� @� @� @� @�   @�yk=LZN8"דKFNd풆531"y\6(y≪{^CMƌY*O� @� @� @� @� @� @� @� @�XEvZ  &NL'VK>4_&}dt'V|1h޼*,@78yꩅӋY  @� @� @� @� @� @� @� @� @ {L @B2$/WLtI^x!9דN:(YjX=a_v g3IIg''O9� @� @� @� @� @� @� @� @�\@]%@�嗫\3dےCM^z)y? DUݺU݃߮809㒮]ޚv} @� @� @� @� @� @� @� @� 0 =|"@�@,xyɦ&k/.TEsZ.]M[o]4|W[nY}� @� @� @� @� @� @� @� @�j y_tE�Ԡ'$]Sɉ'&묓}wlI 6d9 4kcrsZcSO%vҭ[rر56 @� @� @� @� @� @� @� @� @#7J @@ xcҽ{ҪUrIUW%G'^Z4بQΫZ [r=ɘ1Ws~+-dwt<Vu= @� @� @� @� @� @� @� @�,J i- @l&MJ?9䐤udwM dsMg[Z"o'_|}w-ih67y_O649di%@� @� @� @� @� @� @� @� @�z+ z '@�G駓NVZ)~Ǔ_*92?HYx,*+m*l䦛jڵ~IɮVnuE� @� @� @� @� @� @� @� @�5% C�Ԩ+$]Ɇ&] <TU07Q-lgrɄ x5l(9aÒoJ @� @� @� @� @� @� @� @� @@Ygo  @�}7ӟ-HV]59LNFHN=5Yk. W}Ut<tN.$?Y嗵g @� @� @� @� @� @� @� @� @`\U%@�jHϓ+ k&9ؤ}H|3dkԸ@u_y¥J"K.,dr @� @� @� @� @� @� @� @� @@Yo  @@}?>d-}/i(7=*lo睓ƍN[{'7ܐLX7޳gɒK&:%^X7% @� @� @� @� @� @� @� @�T qT�X''>X>:2Η5*9䭷[nIzHXb7|( y'yZ,Ze~9&Onݒޛp' @� @� @� @� @� @� @� @� @`h0Uzw4`@uUT�?\yeҿkioYs]SV#бc6="/LMt{k1 @� @� @� @� @� @� @� @�̽@ùj$ @fFL8#Yd~2n{Y<B kVԙY;"kn[m<LvI׮QG%f"@� @� @� @� @� @� @� @� @�Yf#@�f!_lMly2hPÖ=KO;HgQ*^[o%MNO.4袤sdذ] @� @� @� @� @� @� @� @� @AY @` \}uҭ[ҺurI6M7%o/['zH�y-d_)]WY'!ں{J~:Yld㍫B!tO� @� @� @� @� @� @� @� @�3 Qg @` LygrI˖IϞ'G'W]|;UAxE#sL[ 6[mM-u%'uo<P'gu{M'@� @� @� @� @� @� @� @� @� = @` <hӟ&m$Vi%o~{&K.9}gqF:\vee]? QDظq%ޛ<xұc~\  @� @� @� @� @� @� @� @� @`A3H�Taɉ'&t}wrɿ<p~˖3/α;/={ G L#Uߵk`vg.]Ry&O� @� @� @� @� @� @� @� @�z. ,�To&眓lqZ%$<D':Yzo~S $GΰM<9wuW:Jj)>/mРAeV[m^z_ӨY{\w]5]6)-/(d-_^,:,Ff-7]wu3> @� @� @� @� @� @� @� @� @=B' @ |Qr;$m&la2p`2rdrYFV.('tL/4iR\veyWӠA^ziv<yGҷole�ugWR \,<d*UWZ۴sW<׿j9U6<syS @� @� @� @� @� @� @� @� PAƻ' P"d֭$YvkNL~m<^I}ݳ{O>ThԨQ~C){lyqg8J%YkĉOxdՓ~fm'?q*@ҽ{ "TqJk [^/ /_|~|< @� @� @� @� @� @� @� @� @`~̏k  @@=de߯ ,B>8=H40Æ .쒭:_~y4h0"Eۂ{sGfm){h۶mN8r矟c_,\O:)b}wC2&-ؕW}ݗɓ'OhAN->;,LZjR @� @� @� @� @� @� @� @�,X  @ ɕW&W]VҩS$헬œW8nܸ{y2a„|[J=Ҳe^z);wN,7w'#H6m+~{^yly'0wy睗~:_ҫWr C׮]}QmQyy TZ9u7Yv!yO;.9餤W_| . <HƎ;N!gqFV\qwwy'^zi뮬9SӪUgLk۷o6mZ?1;sߌ56`tA9c*GuTߟ>}Tܸ -*oՕL;%wkG=v-s^l @� @� @� @� @� @� @� @�YA%,eru޽ҀUQ @`a W׿VK?3YcO>ĺ78gyf~2mwwߝ"rb-;S,e[o5[ney+WYM%r%^)"t钣>_ sϟcE\یe]6?׿u>2׭Jph-klS|%TB[۷>lvY~˰⹛{G@U~4k,mYs=Ygu,.ecɕW^ x5jT:tP<kvYJ=Q-B$^s=sSXowޕ߭~eˀ78_AZl?u; @� @� @� @� @� @� @� @�NAթ̵\}uUc%Z%W�"l/K2Ro/b%`r{yөSr"L{\}��@�IDATO?MJ]0WرcӺu2mJ{-ZTylYaR-R嵳sG40}СCӦMٕp}vrꩩ &/^ *S'\x'-MW_}5ڵ+/[&'ȤI-BW ȇz([lEyx&|G=ofOcLx[Pl+bN<Ĝr)ʐxO?7x#-[/g饗./U~AvakSYfe=̜+ C� @� @� @� @� @� @� @� @�jh\#@�@%c17P8p`*aCҨѼ/hV:.QV፻{YM ,li޼yVA<8q~)%ҬYze(\q"+' 6b-1cƔgq9rd< 0@8&G~{njnkJi;.9;?9ęOT<WW_)!6ڨ,РAZ_wu3CR<6gڵk4mڴ R<rO ,0aB޽{+Hnݦ@6idJsen;/w7F� @� @� @� @� @� @� @� @�hX#@�jqM7%EX^VI%o\vYNY(kec8VTI{'Sظqlf%/RZӖIQgJ8]1N8 2|=S>|xsE[9W/"hOTPluB`mIV[E9T`w_*I%wu;S!An3>SMy֦|{qm<S+jm6K9?Q.]IK!?G?Q??V~ߛW_} [oeرs߬j:N� @� @� @� @� @� @� @� @�Jj %@�@%-U]sMGUAy睗wտ)~{Ə[䇕;SFyS믗+&o*IP%nv(gKOe̘1)B~Ϲ9C'NLϞ=~Cqϵ\`Sg%K.Y˛vM}6mM?I>uC_7AN[O>"[nE]G}4rJO>9묳Ҥ|٩S^; "�򨣎]wݕ}٧ ,7 @� @� @� @� @� @� @� @� @VwA @�%31$%mJZrqȑ'LY(i&__~š}ѹ+dV+ߋナi!CYf;giF$EۤIc۷-k*)O=q< {73jԨپ>ɕ"qα;^h9%(rA;R8|Er㍵'ޚ{nrUi9,="F-L,~E@9眓ѣGg=%EP䜶?<ovwJ8嚋0"svsߜv� @� @� @� @� @� @� @� @�3h8 @�u[{;duS =K60.W57)':өSuYYfe뮻fUV)ފ>}/(Ǿk6lX%2{^Zl|jyL}Gɘ1crga?O˰m6'tRY{뭷.jc'zK. wUK-T9Ɵ-ТEҵk*!O~<x'Uw"`qN_1u-Q/:thlp)믿^EM6$n9~ĈSJLްa2/:묓y.=zL7I6%ȱ .(|)6lF2ʋ!@� @� @� @� @� @� @� @� @@5 4LݻWU0*C�̭{%2<8YnosϞ[m7iҤH9nܸ,b9rǗtŌrKo|~p@9~+g} b,"5jw1E`K,br˥^b"?a=4k֬37j:x-(BԷުz&jQk5JZQlO׾6w_Jf/~|SM7ݴseN?\veW+CeV=SNyc\xY~姳y[G_~*V?y䑹Ν;E孷ޚvء }e(~0?~}ߌ)=x'@� @� @� @� @� @� @� @� @%c @@-䦛+i$}dvJ7_wug}rG䬳* glĉy駟cǎi޼Cofyn饗;3-[ϸ>,ÇO+Aw;[(V3L%2LnK%85Yrɤ6K{6[hbzsa~b"Tr6a„|^/* M6M۱OWgʵߔ:  @� @� @� @� @� @� @� @� 07 F P*g)B*/]w-Zl{'k9ӧv5z!P<@X\-r䠃39R yK "@� @� @� @� @� @� @� @� @�2.'@�5!0yrC'+|k%gVrUA-{쑽;~MPp@3bZJߐSNI߾*,ނX8 @� @� @� @� @� @� @� @�jPV]u^Uiꪨ/Wzdu==W6/bzyn<0W&&NLV\19kr9?#8"luU<ųn#@� @� @� @� @� @� @� @� @@u 4bj @�/0jTҿU3$mV?;sMMW,r5> MQ}NJ4:U뮻n\}ݻw^li 8o|{IӦʊ}:t]I� @� @� @� @� @� @� @� @�Y4\fq+޽. @�Zk 4(Yvds"q/W /${oʠj)sꩧsɚk}sݶ /iX% @� @� @� @� @� @� @� @� @ 4eh�c"<yݒ֭<i*䭷5f! a T`uB /|NS7o<~zm6]ܲGlErɤIunY&@� @� @� @� @� @� @� @� @@Yo @`Q81뮤WO2ߒѣNuK_|Q[X\{mg ꫯn-7|s{<qUޓ7ިm� @� @� @� @� @� @� @� @�uW@dݽw:'@�:$c~|I׮ɿzjUw$|kuhAZ%PzHƏ Hw2twܱ?OI楗nOǎ 7H &!@� @� @� @� @� @� @� @� @"/ rH� K{oWO6,ÓÓGI~ӤU՝y ?-Ja.I&9/V~o%=CMƌ*Ռ%@� @� @� @� @� @� @� @� @�A(37LǤSCOuK I KN8!i~>&p)%pAɠA+Wzqqvr5{A;}OȆSO $@� @� @� @� @� @� @� @� @@X%@�$%$;m|r%F%glq}VW[JZL.X:a33NA^[+nzm6yrmV? @� @� @� @� @� @� @� @� k=!B/L>{U?N^:d⋓JvZ/m-{Z'1oB ܑG_Je„9/歷澎 @� @� @� @� @� @� @� @� Pɧ@�̝Iɽ&\>ɇ&^Xxuɞ{&M]=X8J2h™.ڪ|۷<ƇyYuգr՟e� @� @� @� @� @� @� @� @�5* FMF�uQ'JڶMv!yQ?Yz麸2=뮛lqresձ7<C>sϽ '_[7cLj @� @� @� @� @� @� @� @� @`H^#@�ySNI:t aÒ!C#Lڴ#@`a \{mg ;Æ 7|)]{^[n<蘺( @� @� @� @� @� @� @� @� @A�) @nNҧOҹsjɟt<H2|x&kY7֢Kf/гg2aBҿ9;g-Z䮻.m wɶ.K&O=|;C� @� @� @� @� @� @� @� @�EYV] ޽ҀUQ `>4ᆤ_{%H#dF 8 ׿_x=,j3OvZUpn.ɥ&ZMO>I]7ss? @� @� @� @� @� @� @� @�@Hk$@� |s~Ue?aҤIU'] >EQC!CZWpTpB2hP2lXұcrrao$W;Y @� @� @� @� @� @� @� @� \ @@E``(i:}䭷sϭz馤{Y3\N:tH.ֹO';K%_~Yۯ_2iRҰ"={&|Ps}� @� @� @� @� @� @� @� @�AV]Z6`@ջ @`a <lrIɨQIǎUc=z$m.O*y͢9'+u6nt\w#@� @� @� @� @� @� @� @� @.pQ_ @@xӓK_*Oy&9![af.ЫW2n\UXG8:={&O<|a2~&LH>w> @� @� @� @� @� @� @� @� @`Q(]k#@@=xN*YesN|01"9du 0W-Z${\t\ 7h")~Ǚm8F� @� @� @� @� @� @� @� @�EO@wO�F`̘NڴI>:Yi[J.0rˤAzCb̃!$?<<\9 L4%=z~̬v� @� @� @� @� @� @� @� @�uK@dݺ_%@@0!?HZL<0<9d+]wM7T�KmI:tH׹d}[?Xui  @� @� @� @� @� @� @� @� PgA[q/$iӦ*W?!yے=뗉 P}?aү_WS[cIH1'8g  @� @� @� @� @� @� @� @� PA;r COV]5r<1"y?N[n뻒�SzJ2)GW@{#$nUՆ ih3oUx:J� @� @� @� @� @� @� @� @�/`reet^Uiꪨg}#GfԨQ믿?~a>c?;^EaIW)"BE@IRDHQADA*"T&D&$@wM HBvu̚7as]waaaJ*RN}Ǟ)S&e˖M=P1gΜW|죟}3]+(yyů2K}'}oR޼ҳJ&LG@�ߙ#s?Oi駟 eˤ7d_ҭ[ݥ ٟ_;Әkpp]fW^hΛs7VJYs~VP9gt)}!C;9gwφ� � � � � � � � � � � � � � � � �'@=sf�I$`wڥݻwۻ~;1jhs(3@P)yJÊyЫ <ynkV<yTT;2e(K,Q%qx%+KK&f؇225{vd5R֬R6Ᏽj?D2�_ԩ#m./xpkɳ׈yni\)+Vj9sϞ=K.QmJ Lj- QQA1 _4!QQǘ̚zwP݁B'M8 4 {K&gϮ\rݱp瘻YM}l � � � � � � � � � � � � � � � � Asd /_֖-[yfs٣Ν[%Kͱ@v0[)& ˄R?~\C)#�*UxqUREUVe&[͛+HSD>+R]J'nܐ.O/UԬYdcƲB2l7@ %J֕><%F1L#GuʬUf?uQ{?c֭fVHVpoϟAf}Gl]!$@ȿ뎣 <}L9F&:j3˛7e *… G&H @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�\G HyVT�)(`nݪe˖iҥv9/_>;Pф*V\Yʕ r-""ܾ}] 4s2YdѓO>z ,$S8yR v,-sfd|y{K+WF?Ν+]*Ci++S[�8D`i@Y?l 0a{]vi߾}wj1cFEFdɓG?kWBK`nڵkv8Ifgs 4o߾m֬&djҥK˄>pj͆� � � � � � � � � � � � � � � � �%@s=A� *8sL-\P.]R޼yՠA{Sr |p;kŊZ|֬Yc1^UbԦMkN>hڰAjB L.L@-BdhF?>+?rp@Tҿ*\c .h۶m2Q 0;ȱH"*YPhB ^pa;5fUgy;pӄn}:u]| TLUP!z7|ԩ{rT� � � � � � � � � � � � � � � � !V^ZsεB UJmVM4Q%߁ 07nԂ 4{l?~j߾t kv&I*EDHV?6__O52�cC�Vפ%KdI^^N[fvJߴJ }СCv <"\|yhM#a)ŋva?7vܩk׮ńAVRU'x"@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�-@d\Y>N:U'NԞ={TR%uAmڴQ|\yj=Jq4^3gw}gϪqѣ}GV�iHK3'@�ػW*UJZPjԩJKbnݺ[jʕ2ɛ7oիW%KUZU?x;w/n%5w\{7&JkY֭z͉N@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�!@d<h�#ÇL |WTBd͟?_&MҊ+T`A 0@:uRT,JH۶IaaKkc hNHK8|hv+W:uVZ^J.-/׮]!7l`?7ځ&aÆvt9sf/@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@Yt'A Q&0k֬۷uL2%kԩv UTj嫋۷7KҲekO+@ J-ZH{JŊ9{֭7o޽Wh�)лS h7Z;e;8ۄl7~p)@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� %#@n޼#Gjذaʖ-_|QiӦ'?ÇkҤVX\* ("kaat3�8@xDY3ig054c 9rDEU'xm~.ZK,т cppjԨgyFڵS9pB�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�D4nA�Xnucǎ&2]tQVy4a-Zݣe˨Eʜ9hTbkD*TI'HY @ O>_:yRʔ)x%}7ꫯm6+Vk۶ʕ+3 ?Yfiܹv ڵkW5n #:e<@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�\ H'@� u}]9RM1cƨ` ;Xhz+Whj֬Y�(??ip\zwڥcjڴiJ::t^xAUTq QSܸqC ,Д)StRϟ_={f5R � � � � � � � � � � � � � � � �,Q P իWOǏח_~ Pxoڴ~w5o\zwϻi�8ɳQ7NpzcVyfhBe˖֭[0ȓ'O#!1iӪ]v駟ta;`t~̙3{@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� =Q3Q_`޽ZΞ=k^u'f̘ܜ<y>o^7otpU �$@^Ҿ}ҲeIgrk.;�Zj+믿k׮J>}rM*?~ 2Dǎٳgpzw*L@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ۇ "wVڵ7o^mڴI%KtݣL?{˖- t,@(SF[W;ֹ9L^޽裏ڸq,Ybnφ@ KNO}LbŊiڴi)0:C � � � � � � � � � � � � � � � � ZAZ'ԠA;qҥʖ-=Zq*jԨ+V(00P;vTDDDrI @%-^,:"%x[ti͟?_gʕ+UZ $u{ƍI=} � � � � � � � � � � � � � � � � Acdx@hhZlٳkʐ!b8+Vhg8AE�<@@74n܃=zꩧԢE ܹ^r B ӧ}v]pAʕӪU!� � � � � � � � � � � � � � � � VAd2x{ァhܹʜ98k֬QFONX!%!� ^] ҥݛ\oݺviњ={R9N3fLD *UJׯ3<cN2%}q# � � � � � � � � � � � � � � � �"amI5+fL]`Ϟ=*WƏݻސ+hР.\_U^^^A@�|YʗO?rO~OXX~i%K|{Hq\ڧO+T u9g@@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�EY @ Vɒ%խ[0C׮%{ &A}vءs&Aot�8V S&YҘ1Rhckׯ֬Y˗;UdReIݟc7xCÇׯ_  � � � � � � � � � � � � � � � �+@>z&k ={V?~my{Oي+4hР$Ltjڴ&L=q; VΟOw\=֭ӧ~)Slٲ+䮑z-K*ӧڴiN:@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�p@ʦ9n�n&pBu):GC Kq$)* ;yzj]x1 {+@1~~ҳJ|"ED8( @-[tL5ײ%scǎչs0< � � � � � � � � � � � � � � � � 1�(~zU^]ҥ{}9sgոqcZt:5kٳ7ov[z\ržvmjժL[oF!]gcĉv#S_Νy}^A}WiӦ$n@� X?ڵKZ$طo6lؠ>}ֈZ;im Ո#ԢE ծ]^M` yfk_t>|`g1{ѣhWy~s>{{ʗ_~W3!� � � � � � � � � � � � � � � � n;3&�n-~=c2GZK/Ɍ!C5kLwVգG 8{|o`B#>lҁTZ5]|Y_:uonw1]pl߾}obi)'Mu?Ԟ={ԳgOھ}6lxa|=[lzGl   -+K+/ Mo{LOh6fh֭iӦ١Ͻz'|'?W޽5qD|gx̙Zrxq(QB&| oq߱\~1&hҥKʚ5s@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�v0=C2_-MV Crʥrc,XPuԑ9wu^L*J*bŊ١YUvm>d#M`|Ol}ϟ_Æ CLPXnT^=۷>gm~2їMSpppF@zKZJڶ-e+;}cQ);rkC Q``ƌٳdɒvrB:7|S;vT.]dÇVZ5kLbf-6y1!pׄk_>sL\͸� � � � � � � � � � � � � � � � [ 嬘 h4ɱUZU'NT 4zh5o\˗c(//ҥC2d`:M6MЍ7ۘ.lTR5!fw\˽|J' SVz .Eߜy^l ԯ/k]F.f)S5r12W['M$???)R$6K,џa޼yobn5ڵk5gu46lhQ1볫5i6w͆� � � � � � � � � � � � � � � � x{ڄ/@|&dڷoo49rD-Z o;t2fؕ)FVZʘ1J(qGmޑ?>>>wrwQ:ޫ})s_={۷]|׸ 'N?!pz+wWgKG\&8(((ֿfUSNҥKvhr\f[EQԨQ~u=b;~g{7nT\;wS@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� =Q3QKRJ2Bɱݾ}[_}f̘!???-[Lm۶caWaaaj׮,Y+WSNJ:%fk+$$D& -*83>~ߺux=Xb>@)`+N쳔+zʓ'⋔Gs-sLs۶m 9so_~ݘ ڜ ykjӦbu@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�p' i2<HI&:uTA R{+Wf_aE7oތ֞3g٠Ae˖>UEDDDCTQbkV;woB3g_k~v$ٳUhQ{On pԻPFҥ)'UTo1ctGkZJkcn+ӄ(^rEKkb*U]6!_\5?\GU>}j5@�@�@�@�@�@�@�@�@�@�4-��@�IDAT@�@�@�@�@�@�V H}L 0aG+V J-,,Lƍ5&ԩtʚ5c駟PO?T3g͘1C ,m6jܹڹsΝ;g;^ {ٽ{weʔI?z)M8Q={T4j(׸a$88XSLQ׮]} @�Wx%GomUm͚ڵk)6p\kǽ2WZMKaZ[ǎkzPM~vP Ìږ,Y9r߶Ok jww믿 ,WS!� � � � � � � � � � � � � � � � ^֖Tk.3GA�b0am۶Ֆ-[TR&s=QO>z!>}ZWn;>ETR ŋ;wn 2_U@�[nhѢׯ^|E*yweʔpMԦM:u'ꫯTn]{\s^0`&M?SYdI4G�\CI_ҦMO<ʕ+G Lǵvk-sv t6m޼ kذa~.]R=0v 0k,,YR .kUV0ary1\ ڵKS:udM' � � � � � � � � � � � � � � � �(@'>u挀 0KJ&Mƍv RL:rqG&ѣ2BBB9sXG_Cl,A_MC쀥B t%hXo۶MUTѣճgXZqp} `AiRn> Z`~8YZ*kc 66AFuvpyN)9 yZJ[VڵX< � � � � � � � � � � � � � � � �.@?a懀 >|X+VT5i$|y96i”u3?L�ҥKt֚ x_-+WJAzJؽǎS˖-uM>]uIX.Qkc 'y&AXX>#?Q=4j(&� � � � � � � � � � � � � � � � S ԏ@~&l믿VVT@ 0~8MDq֘.]8;kp;ۑ06 "} #NuK!Aaz'/kСʚ5k#9jm<d=j۶mώgr>;v襗^Ss%p� � � � � � � � � � � � � � � � xEX[RUۮ]dO3g&U�O`ĉٳ>Cߌ˗լY3ݻWk֬o`̀@� t.\)'$޹d @nJ*Ub /B'OTlM? ? M/_L+@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�<@ HxLO0a&53F2uرcv_Kt@�8|X*VL2E1%G{7nhĈ#GV-:u)^o)2f{=ӧ5rH}*P>cM; � � � � � � � � � � � � � � � �I!�(+~дiTN8qr5/^X+V6mD=A F�(THA:T OGڴi{鰕J٪U+*X>#?>zYdQ֬YwB cرcvj?.X@ǏΝ;  � � � � � � � � � � � � � � � �,@?|; lRxʖ-kB<aN!!!ٳ4ib=mܸQsҨpҾ}B2|9r'|G{ϔ7o^uQWVDDDt[> X+Whʔ)Vʗ/?CSN޽{եK$kC�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ $Ki.kLwc ׯ_W5n8=\rN^kgiӦ_~}ƏvQ kL*@�d0?KlC$P͞=[F-/dC岂|Ծ}{;49r ܺuK˗/w}9sm۶+W.L@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� P1#K l޼'ս{w 8Pyu98Sk֬ 7mڤΝ;?V9DjA�*cT4ԼJ1QvIWKkJϷΞҧW;tZ[:tHŋW֭ 帢)^e˖Y=$$Djs=gfʔ)(@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Y Hg~:Ԇ�I")S>ЩSԥK_ H=˗~֭S 4tPUT@� h!I 57XKc;ф> ,Y5ڵ#%_anݪYfi޼y:prʥFaÆ_r̙zѵvޭKj+MQ jJm۶U<y\{T� � � � � � � � � � � � � � � � t`xH9[nف&ĉv/z+ q\oV'N�Az.2D�#eTl!,LoVN.]ej;|y5࿅ jڸq裏N:^4-L+AԄ>Z6ۄ?7iDM6UrL @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�GuD� @Yf?UHu]<=xDD5uTM>]ƪ}zW;<G�\FaCƍȠƤ*z^知+dIRΜRZ?-++F|rJsNŋ'PjTre*UJ>>>6wy۶m{is)]t[|I{Ohπ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�p} ]2x�ne!g̘K.J*j۶ڴi#un5Ꮫ7o1gϞǏdɒzեKe˖u&C [иvTf:}G�y9TT>Ya;!w]p 46lC_ӫB Xʗ/oKV4i=mQ<;v~_U{Dp=êZjԨa=RN5 � � � � � � � � � � � � � � � �D %<Z֭[Z|{͟?_*S4h`k׶餕&fktgϪhѢj׮+W]<@� Fooi"^-X�{`>ZG㒏OKVoߖ R޲e~m߾]n޼i"EBu /^^c2f̘\%y|AAAڿٵk6i֖={v;w>nU\Yx7�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�p�Ag\pZdJZl.]j)LpRժU*ULRT`W``̾yf;(*M4Qz)5jH?:$! ['ժY?'a)jG+W[JaaңX lgZg; ҄B9rĚ5)kC" *… MsmfZlqㆎ?GڦÇePIKbNiv˗r@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�#@c\HԩSZ|6md(ܹSʕ+ʖ-RJE%JPΜ92;eL ߊMׯ_WLTR%;̲,Vvm;0!2( !V֮]֯h G+V ;^=)G1M` .O8afRR޼y@H sGgϞ]nt8wN>}ɓ:{"""yM)hi@"E>zyyA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@]t'˼@ Y._իʕ+ѣlh-}v}4L9Tlٲ顇w9C vUԩ֭[ wلhXIa/^_}<s挎;Ǐۻ }]C<yTti;҄UV\m_? �)#v]E Ykon]aCQ#YA~)Sb8iBn3zpDEoz<fɒ^_kc)0I=ṣY/M;fWy_{6ߣΙ5>.]:KE"n@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@tG &iӦڹs6mڤ 1 g%|E3MՅ 'G웗u#ckgBLUΜ9'B'MM%K bC�p#ҢEҪU%+OX�`jFDDkhPPΞ={G rTḅ NxwdJ?M4&2k֬.eS&}GeenB.@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@tg @ :u9shڵPBzrJt5+,44T&Wʡ#+kV`Tj{O*}̜9sthƆ� <#Iڽ[ʘQ__V?qci<) yJjۘ7nPXXLHdc񑯯}gs-iMHsn޽]$�Psi:Z@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@@ >#jذaoL@YvDS@�`%K "/JŋKMF?֬)+Zo>'8vLZU*SF2V$ � � � � � � � � � � � � � � � �x�#6_`ʔ)2dd 5D�p r4 JEVa`5o.){e/=4{ԶmZݥɓw @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� 2n" ^ kk׮@�ضM7/r߹Sz!qci4Q#)k)#k' $n-y{>Z@Ŋ̙R@T`d{͐ � � � � � � � � � � � � � � � � @|m@#ۧ~ZZ҇~L40i͚->jՒ|mB KFzOeQMHI=zH H?u# � � � � � � � � � � � � � � � �x@"cl<y" ?^M6U5uTyyyy*F�^ 4TZB� eΝ-ZRԥKKi$Mz"9"'իzsb@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�HwoN@=nݺ֭[+,,LWڴis `7"C^zaIߥ}#?t!QԃIgJ&DÆIO? @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� 3;F�8zm۶i…V8Ɔ� 7oJ H=')+W:rD2GJ[HI 't_BBozv~//iT\ ӧf*D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� 2iD`њ<yO2eʸɬ ҢE / Z N֭zSȄMI#FܘiHII͚IW8gT� � � � � � � � � � � � � � � � �I+@dzeԧO :T.<JG�<[ <\ZJz%Gͥ#C ׮^{-#zH_5J rDLٲI?$8!oLQ  � � � � � � � � � � � � � � � �$�AIoJ Vҳ>~ (@_eJIIѣƍoH~~ 4l*$-\(^-* � � � � � � � � � � � � � � � � >A�Oʕ+jٲ)ku@�'Oo"eK/(u (DUJڴҠA+HoY]Ma+K~+=T`j` � � � � � � � � � � � � � � � �x͕"�PNt9͙3GiM2 S K_|!ժ%.,'5n,m"8 !Q;KEJu h!}4`4ck0@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�W}@� 6L ,?|Z �8D ,LZT:Uvd …RÆ HCJO?-#UZu2^?LPTH9 � � � � � � � � � � � � � � � �  �.*d{OUvme#�-4p/5m*>-+IyC Z˖RқoFሀ4rd߶ط@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�p7 2ѣGs{^u@�RFidfMxqi4KiZ[7)K%%F5JڸQ5+%Fc W/obŤƍg]jjD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� _)!m۶ĉf^Lpu_^~YʓG3ddejHW1cG_?{ K'-\(Pͥk<π#� � � � � � � � � � � � � � � � Ae^ o}iJ>}� / LbJҩSK F%%aPi%#xtԡ\Q  � � � � � � � � � � � � � � � �$N Ĺq7|cMɓUX1e#�/oRRқoJeD@%-esL >P:>!w,.e~ � � � � � � � � � � � � � � � �x�A#{+b֭[� 7oJӧKիK*D?&:%M*=D d'O/?NV8\ki8i(C � � � � � � � � � � � � � � � � x?#�.!p o^KG}5S$ .ǏK&H_~)](l)\)խ.3Lyd "kRɒI/@۶ѣ[oIBc^@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�O :sFzm'ە*U*` @ l -͙#%)u.ɓʈ;KcF-Z*USgJ #G#UR#3 � � � � � � � � � � � � � � � �$wRvF_ 3 ̚5K&Mҗ_~ :cԄ�@h4mTT^# "~z;S駟ŋך(`U4=Q9#� � � � � � � � � � � � � � � � A3d Q+쥗^RϞ=պu8Zr @Aå\K*ZTڴI :tRz=޺u6m7ސL&1||3&Mc^3 � � � � � � � � � � � � � � � ��A%;*o޼O7!�-pԷ/4tF^モV^.`'QboH^G-E ϵ` � � � � � � � � � � � � � � � ��AԨ%0l0mݺU~ҦM{h� ?={]Bӥwߕ*X0K:UҀҐ!ҩS6 %d->{@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�p1 ]Q.O 00P>#+W.~7psiҤIj֬FT3Y` (e˖9U]�uբTi4atۦѣG#F7޸c7o}wjwY; <|WʙS2GGl'Nĉń+'vIKgrv},)͝+YKm8FY^=5m/B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�p_ 23<Vիر dy3Gf믿j*-ZHfδPGLZH fUt4g{Rԑva;u۷ok̘1^J_}PBvٳk?u릇~X7oիviQo֭Ky ʹa{m KXL{V"E4n8]r%YqNkזJSii{Y5õsNo2@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�p ])Q#$Ho߾vXє)S啠{]+4h ŋgϞNY 4A/SGQ -RӦK?$+QjRo'yhBysj+-E+52cƌwoooUTI5j԰7h@e˖?)O<gOORÆR^R2e1J\bE uX=ȅSNGZtv }҂IaB|I.2Y5g6@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�\A WxJԈ�X|&N+w`VST8?B?)HA@IJYő^Dpp}1̙3ҤITRL2ڙ/ T|SO--k}Ky`cRWPBA +lUzYioZj""";swY*oHt|@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@I|.B�,`^ڴigy&; 7o7|{X5R:uٳ7oN:=zQ%K4c >}Z;v?usϜ9+V,Ytm{K}g;v 4H#FPxxֿYFk׮M.>.\X={m۶Vi0}t`^znq}ڲe2f̨kȑ5;wN~M&$SN2l ;vH#-Z$U&7Aj0~ㆄ (bie U;m$wov9m`~So-S~iկ_?q\kKTׯ룏>҆ {l6//&7:>L YK7 nb\&r̻1߸5]OSk+_:wljԨ>}hNjU.~̻ٳۻ=A�@�@�@�@�@�@�@ع(ʽ7EDv,HQ REQDT.TPP"IED {w~O$!eMIuMfwS>;@�@�@�@�@�@�@�@�@ RsT�$#<" zh_~}Y 2ϟ[/Xp?Zjر Y۷2f-D/IB-u.F/;eH fJ3gtkv-#xdiZ=iO?UV?~K/i۶m.}J:O]jlrDI& ? 4͛J+˻C #6'dΜY5kּ~]%V^Hn'$e"=x#@<0k,_^v t3z1GUݺu/ذa={ k\ƶ8q˟ xو4I*TH޳S:x0nv}hsjٲeb{׈]nŋ{c!c7nt!։nI5۳gOs=85b{  � � � � � � � � � � � � � � � �ģ�AK p(h!X#GT<yᠷɅ8v,xB zyN@Pkdɒ.ɶKrvZ<x,tWZ嶍7Nh!r6l gJ;B6{p˖-BٱBi!_VRJʴ`̙3DžLZ\v\wz,HkiU^iԨnF<cnL=zpm VA� #=T]0!lݰ᥷cArr~Գ; ^ؼf7ߔƎv_yCUNiW֦Mq?[ӊ++gΜ5QF]t]%9BOJTVV:~\^(r=X@tlܳނ{ۻF\HL$ݽ{w׌ڮZ~wݻuֹw|? Xb{׈](b=|F�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ /YE�@={v pZ+r:uj֬ƍSL˻/nܹӭ?S?^wq Vp% K*U,J…ݺe!bvgϮ{G[l… 1W+ti;w΅Ul_ l^/. y`G,?w:u=Bo/2> e -o//O#FH&icAW#G\Ydŋ/ZZnlF;%oZ7~xYfsҬY37} {H"kըz=o_}U8q"%i6{ PB^vFt=w@;?wnݺ)M4.юb~{k)^-[*Gw@ޅ+ � � � � � � � � � � � � � � � �$6Z@  ǏN6㣡z՞vU[bRN?9ƀ&AiӆM&@mذ-_EkXp|ziȐ!U v]xSŊea1 =z 9r %uA=3۷oLU@7xyzpA޽Lj"hF-ٲeTif ^ɕ+[X7~w_?-ʻmcAtN.t։(`Y^4Jz啰r=ߣ[G|_Q5+Mjڴi,1cf]#w!=@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�/Ic "�$h"o*_|JWkX)(P 8 #}ɜ99" AZluE߫Tjժin9u2,,"c+TfM^ZڵsԩΝg.[*N8={\  7HRnai%{w#/YD g_6m ;=}W_}uQ}>l9s;wŊ:}:,8je =vXj*E[o, ,^ ׃gAu Hl`=Nر֭[C*C Zjto]Jޅ � � � � � � � � � � � � � � � �W @q*$Vu̚4i'ng… #ո|rotk0SLa]NRJO?B~'5ֵ4Y�o 0@ ߮3gɦMzN>cʟ?>3}Gp,TRʚ5&M+Wc-j� Z%r{U\YwW9##-/G׊EWa[d}ҥ^¶p 0;v, hQ۳hѢʝ;N<Νs~ر#ł( #e-OW@׃5w_6k$z7n^oÝ֯_85.؏� � � � � � � � � � � � � � � � @\A%~Y^{1"dx9kР6oެ)S>c ͛WO<Vpad!d[VksN[wlٲ/TÆ {AbԮ]; 6?!bf!Mw};!XSG~9r8an{fܺvJ>~a<U~}/97udɒV;? ]K?|_HW]zQ wˆn\n:&qM+of=~bŊ_u!<ZhBy<ȳҥϟ{饗\o,ׂ$㚣}QX"B'#aA <ԡԶTp`׃kX6=Zv1kiw@㱽k{OXTrʩN:ʞ=瞋.]#w` � � � � � � � � � � � � � � � �AHl=:'M M`H= @RhA@ Rͣ?(m9s~y ڶm?S'N/ӧ��@�IDAT/h}7ZjfΜB,ںuRJ .Gq۬> 馛bu^Z~,i̘1*_ pI;wѢEʜ9TI2]t˵jJիWw,ov'XH_#Gjڸq }~׫WտtRD6K:kҤ "k�q :%oV#4|9$sK.Fj5G_ r\ {eA6g ܜns%v-Kz-yuMe=,1k֬9aVZl-jCOws3+67WZ 9v6u`{o,`-=O?m=cװwSwRJxӧO?xH4izװy5j+2i?/ .mv1c5l~ޅ*T௚5 � � � � � � � � � � � � � � � �* \mj( @ 4mTrdط$ avZdAQ4YW%:u꨻cnSM\W_ֱe#G)SHS޼yyWsty//Yرc.§,Ē� |`Uy!SOI>*/-s믿><J])c!o6(P zIgΜΝ;eϞ'NgDpNhyC~Vaqlg0^jk${;?~\9r䈳+k\P�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�b 2v!@h |jӦ,Xuf'/WQ / NA�,a#̙RvkI ',H"Eԯ_?'aNM$Y9-`R͚۪:|*"� � � � � � � � � � � � � � � � @A�DԩSzԡCdozQȘ1Zh>6"R^|Q><,mBych>|X5eɒEM6M$VlrUGzu)C$K6S\`ٲeںuȲZ nMz+;9PtiUT)9 � � � � � � � � � � � � � � � �@*Wկmj81X5R Y^k?C 3w D_/Xv_S/IN`x_?ɰ0Ȟ=4igϟWڴꪫv8c VO>͛^vvڕq'۷Owy~+)y޻wo[{@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ L @;vP2e4h ?Ӓq&Ix$3t:�(~dI]H"{px8~5j~۪ÇO?T͚bh "Μ9=zhܸqzו9#]3Fxh*@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ Zne# S…裏` 'OJO?-U(yZD5dɢoVW_]@2ܪGA Z{c/_~y@sa)lD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�x 2P/K;0a* 1 �)M` |yw_.VMi 7:9rh̙*Z46nlalC \2eƍ%uԺ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Q xĥj@~T^=/UJM @صKjVjD׿޽Լ%_/ẘ7o^-\9a%\㴔$Zj]'??6h͚*Sf5lΡ � � � � � � � � � � � � � � � � @ !Ԏ�A]PkڨH.Ho-]b4}4qTp?LxB iɒ>>/8a=}Ť%Pre-]Tٳg!k(U. Ѥ5z� � � � � � � � � � � � � � � � @R 2b&p9 0@m۶US.T5k5zHZVj8j0KsuP=ɱ)UD.\nUv5y] FA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�x 2`#kӦM<xpp*@ NyFZUJNZJze)S4] 9 JkzUiɒ AL$3a/|9sg !S� � � � � � � � � � � � � � � � @ 2yd)p⋺uW'12(@/RJK? -Kx['.\NRr]~|GR&F�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ g`G�g 8+L@ zH[W*YR7wo)5oi!˅~Fh߾.YwN  � � � � � � � � � � � � � � � �DdC2 S/G*ZhrKʖMʔ˽Jm%3 wII_|!+A 8EH#F-sNjIjڵK7y=pu}PMh6 @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� 2N"@�9r:'|216-߼i}k"޻C H:H͚IuHׇ}On\ hNjZY:|8 !MDڴ'.o=h 7O+?w.jJںտ5 � � � � � � � � � � � � � � � �*@dR� &p :TݺuS݄nS')M[MJj6c؋�#o_} iӤ|>#\ޓG~rk༔*={6Y3 ΪM={GFq~Ru7 � � � � � � � � � � � � � � � �/@q&ē8/Yh޽z㩅Ш$/XR0c>= :IUJ Dߧ{Z Q[Vj,cي@0 ;V0!5SWJȘQ�t餆 jդ Ö#sRcD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ xAϒ@ .\А!C{Uh U'z&M}1}A�~i6];ȑ}r夹s%RΜ)мRai|EO Oi0iӦ%b}aZ5#B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ?[jF�4i2I)^ޥhKjohwBLS:woX};tHIjRj@ZV@> !0tTXXXLfImHNIC m<hIud@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�HJn6U# @JQ/. L Q)o^̙ȣPfͤo z6H+JOGۋ/J'ٛȑR 7jU_?Fu b1U*iD6:� � � � � � � � � � � � � � � � @NfiX`Ztsd%[pi#{#on-?o6dTv-!uIo!pabJ]H^Sc> )>"� � � � � � � � � � � � � � � � A@/@6lUڵk(s"9cFy�'пvꔴw;wl{mcLc:Yiȋ˜g; � � � � � � � � � � � � � � � �)] Ȕ~0~BD`2e"=Jn4i"eҦZ, �+0c4|t|}׹s#VS࣏ n2HH[H;JRo4mZ!� � � � � � � � � � � � � � � � A@/HFRզMga!KmJ҅ ڷOq $%gԮ]X(Zl} b;}$@<Ҹqԩȑ >-&-$ ]RU+謹'& IW � � � � � � � � � � � � � � � �)%#1B RyɇG!7 1aXٳaΙSj 0\;={dc+69#o~a!pSOI}Gԙ*V. -VLy4gm[3A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ >UD�K={k׮t^r:<yFdsi&1aܹa{QP4i6[HZn7H3gJR]t8Ht瞓nQjF:|8ѻC@VHR,{o & � � � � � � � � � � � � � � � �(`߶mXM'FA� ФI7ӧ'9rDtɓ'u={֭{:MVJH+St>}zd͚UsV\1cd� d׿9ulGZب컕4^X%u32er{eJZ5y}ߙޭnEjTjX*U PUT4eJ(}3H#GJe޼ <|O>>G7Gf#mi4mrP4O � � � � � � � � � � � � � � � �I_ m#@�,}v͚5K'ONpAF7oƍecڱc[]t:tHs횠y3z-!zIKEUUX12eʨ@17.S}^?v}N='N}�0 @ bAPH[gΜYٲesKv̙۟O,JϮ^j25jז #\=2",7}/|N~6ۜnyޖ˧mӾ}9PPH~u9ܼos@<yŞ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�D +WRAs۶ 6qbĭ|F�bx4bܹSҥڳg-]T+WԺuӮf5ZpbAB9 $qږѣκ< ;{6쳅Y-*i{NZ_kz/lٲ*WV*Uл+! `h׏]?1[ _vôaYf \1>۾4i:u*RQ;vQ}^Յ -g{toBq`V `-X[?)RD TRyQM!C o >ҫw m߽{[<o?41 1|mukYmRJ:uqm3d|:uꋶy…YvĹ9#Ym^ڶ?ϟ_B ;? @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�D@Z[СC5l}\z͛%Ke֭RJE \.^wu(W vZ~[,>ڿҦM *FU4h *$o Jܾ}6osmѶmwfZ訿X8]fq+ _g @ӔP0~ʔ9ᅃpf!j�M[hb [xD*Y mQH,1^UŽڽ?[Hk6C #m|oZFyyɢsB!mC4�[[f1$H)dqA0@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ HA j@̙7-[+3,g̙5k{faH5kt!իWWj\^<u!nڴIK.uZ._\gϞUumaÆ馛1cƠM/`!?ПΝsȐ!,p*b}.R[,*W\k._n#bOv"jGҥu׆˔)㶧J*1.YU"OO>a~v-`vÆ n߸qc;ޜ|b�Bl?:K,!xLHli_s5n-`R87 jB�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�o [@ Fvɂ/^1 KM8Q-RUvmؠAU\YSN{;Ǐׂ \Х].he˖jӦ7n, K^Zk֬[NׯVrBaJRɒ%b_ ojafs-`7 îv׻rʩB X t ћ eNo_WÈ,0ОͶ<oA69r &SLZhW]uUb)-`a[n -۞XX �,` 7gw � � � � � � � � � � � � � � � � +;@ ,H"1bt_Z3g4e5ʅ"fΜY͛7]wݥ&MȾbS9ydOʚ5sѣWRBn b ,VZ}~ϟ߅A-[օZ@-|,�l`8n%o޼TV_nO W*0ft_ims}rJ/r؜^|y7_wu.B-`ߘTv{G@H �/'�/Tm]X?xF� � � � � � � � � � � � � � � � S05aÆgݻ%K֭[k:p5kΝ;qʘ1c%djڵ`={})*3 vZd/^얟م>NZe-*Tp V{fXx-6lЅ \8d͚5UV-ԨQ{7~$ӛ޽% y't;;m67/]xIeȐAʕsz 7�H { 9B̞mm|. | -ٳg@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@   ʖ-z@Ƅ_~Y} *]K.*RHBu!ɵ5j( -[6=իWw&9�:l .z:{/dN+W;�O?. @Q[,LtǎJ.Vܛnɭ3g q ;'5h m.-[&)E`ݺu7o-Z䖝;w{҂U{QڴiW8r ^ݨł-LԩuoV|@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�U xrN~pAd+VP*U;$۶l٢A?5\'|R۷'pݫ7xC2d!ye̘jիWӬYd!gΜQrT~}dAMŊ X?nߔ>}zxjذ5kB‚ %;$*.-͜)I޽[3fٳ]�9s9;[WL2]*C ]{a=*_nV p`Ũr|G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�F Ȅq СCmذA˖-5O<_|/^\/.N:<ÇkСʗ/;S/}Ν5eM6MWH5n؅0r-*PW\={4w\͙3Dž_.|y{BҦM{sZrXR][S޼\GyZ|N~WZ,Y_ ۳{RJ{\>/gIرc]@_~z[u-tw 5G5 � � � � � � � � � � � � � � � �q@ w!3v#f{]t?O>J>}#x%hد_?M0A-[ȑ#U`+2ٜ\g}JP5ԪU+5mT7pC+I kuɒ%ʝ;V۷oRJ"0~]7NS|Yx>s�sN)SƅYo:uxHWH;B~wnjժ{GE AC@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ <@Rx7k׮]ʒ%KЇp9=ztw' *v0L`.pO\aJٶm>;V fA`d\)HZ޽{ /pE;[n*QD /{JsJjK!]-[4zhYЯ}м6mڸyt!w:@lϟw)S4ydnݺԩxyg?C�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�R�A)Wfu][oUn{unZK.u[x %?zA>s4hP7B-̞=[Ç׌3TT)j߾+B+\;\؝mڴI7V>}tm]ZE.\z(dTd^ oш#4gYࣽ_Xoɔ� ]?ƍ'ʾkN{Vr � � � � � � � � � � � � � � � 5C�-0o<ٳgo߮oQ[n©7B dɒEcƌ￯_|Q;w=6l|.RJjҤ2gάs{@&:ÂLZ9ۮmZ\<.-*5k&>| N>ZVBh"mذAO=!O#KuըQ{n{Zfʗ/F) � � � � � � � � � � � � � � � �W.@R(`A5kT <#vء+cƌ.҂j( /н{w}.$cǎpBw"Z>} ԩ6oެI& <M 65nzz\ЮBڽ@Iy^鮻s璗9o@J*g}V<cǺ5ZF@2eRO?iŊʓ'n6c@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� 8.A`޽:uzy g}ÇդIe˖MS>#MaÆ6mK/Inݪ-[vڲe|M/^<1C$]v۵o~{ \Xz3ٳgO>ڶm |%A2.SJ*?~6lؠ%J0Ȼ^f� � � � � � � � � � � � � � � �h SH8ѣG+k֬j۶mPҥ83f(W\A.Oo'|7xC_|Ubg3ƅ9rDk֬ш#T`%A aڷ{'*T G()Kre%^Kck׮.X7oެ\YdIă@R4vX/ڵkʗ/>(ZJ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ y _F@H\pAFRN)SO?ԩS]`…Vor[n2e…j߾ԩ~e˖E=䊿}zhϞ=W\_bUpYuݍc7o&aG#GT5tРYf5\#'^ywؽb %h!Կ4eJUZ55|p̙3Ac-ܢf͚%H{Q� jݺx≨Ě P<ubŊwW_}U{Vtxjj@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�'@dM!'`e[lQ=7 ׯzzRѰa41cƨ~\رcUV-" |9rhA-8sZjiӦiѢEz*U-&Yp~?1Yk֭ z=C{gޡ>} lIZG{V\Y˗/WժUt�vZjsB7`yn>h]qZ[Q|^N} KkA:rT9 � � � � � � � � � � � � � � � @ 2 xuM7L2AkB={.hu&V^'|:tm_` pN m;|_T%nȜ9yNsK<;ر֬Y &x8X⏞\z:J4iҨk׮nωQ,@g:u]DxmiSeKiD%4oaÆС>seɒΡvZ~RN˪W}g0X˕́Q`cΜ9)=|.B 5kg@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�d)#ɒA!@L�8m43C.kG}v)_|u~r=ɓ.jذa qʔ).^zn_b3ϸk){Qܹ'\ԟP믿v5\]o!*SOi޼y|=F K09�^ꫯb%XRŊR†C{NҝwZR,SJhΙ3gϞhM6v×3F7W_۶msRJw߹pSD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H>@ A, ,O<;֮K^ZZZ?lϞ=Rx ȑCΝӌ3dAÇHY~( ;v2f̨ *4iGyD:;5޽{p®-Zh_~j֬n馋iԨ-"%K9}駟ZY5p@ObGoVZlٲSN^rѢE:t萪U%JȂ{?,u\׮]tM'MxWe˖<r}:x:v]m۶nݺ %Kv0`@ 2dF.]d/[6Xۻwv{oΟ?=[lQʕo߾H_ޱ{}ʜ9sB6O[(!\ɲ6z/NH{g}ɓ'9zŊ/5kV5mT#GԆ Թsgkҥn"9bw|nkܹ .M6cƶ駟\?]M6jݺ^}U~ax:r䈾77nfϞޗ,ޟ%9ڝ:u2S &oѢ"Jƺi&|ڻw ݵkx}^HjXJp3H"%xq rm!~ҡCCKNi @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�HZ 6m|>[( ={x>>/wر 0կ_ K_t|]wĉvY-^H s{9~>)Sҹ*Vۿnr-5kָz/˙3lTtViӦ6\_XBec=JvzaT>/]I5 v o&XQzؼyTR?O[{᤮GjԨBH}^0oݺu[osb\9sb)W2N/˗;wn7F/L͍ h_煎9w+U{Gqvoxa8/l- /Vϼy|݊)ڻ}^Hl>&1q?^ }os$7^<]|ywxhk ɥ y>/ݻdZj^P|>/SyᏮ{V^7f̘EL_r|zvB }Oc6;/lͱ !;m+Y yA</g@+́6皛>}@diұ߾W^ys7 *{f? tq WH=Ů!  � � � � � � � � � � � � � � � @  /{nyAjA &R^lժU<xƍڵk F(/4mDv;u$/G˖-3<#/m9}^Hﯵk kB0sS~3?{C=O?T^�[\={v=ۂ ԩS xoB>+Wx?Jc{1yB\/PA[ W^4{1q]uԉ񺿨h6\8~z ,hv3f}^�PKy!e<yf^ؤF˗mu\)/Q^{R\97'xa^zC2 wS޽ռys5kL2eR~ܽlCv/QR@B̙ҦM]wI΅7aÆڱ|O>q#e˖u#/ͱ^DyP^uyĉnmY7./m d> ?wÇBk漈uo5k6G?^ ,߯ǏkȐ!ρ3 +}uyf D7Wc P 0Kmyu믿vUre359q 1Y?� � � � � � � � � � � � � � � �@P}C�-`>c!8,*hgQ,HB-xTR:|Vpanժ Zj5rtEM0AdŋYn]yԿ��@�IDATd@8 Mb`Idv |d!R=RV%bsb@Iѣ:urBKX^PD3"EkW9rC׮@۰_8-( ϲ-Z\(W?a;wnwYZ0۶ms2O؁r])_l}s΀ ov,BB ЇZ]ʻ1f!V|L% 2Dj̴9xPK+z3esS%gϞ@p tRժUK&M($39U?qG ѣG9?hsZl6-מVv`5b}·-؂-ڴ`pk X@rb{m#� � � � � � � � � � � � � � � �,@d(: $,i&͞=[_}UGav zV dH˗/~ ܳ&MHDB,'jըQCsB;?R1|2e *W 玞1cΞ=6mXi;,‘|Q;1UT 6Ԫ,ӂDw=صbgQ߾}/]\R .wvU!.gVw߭?c ʚ5kMx\`6;Y2OqQl[bZж@׭[ι M޲eUMPw z!T*/ﴅڼc)JL>ݻ>P^zj5o )?YƝga:E<'؟-~7  tL>;" lҤMvQ"Λkĺa |s|Ĉz'4}t[+ↈ] yy͑� � � � � � � � � � � � � � � �@XY(!@5j)f͚^{>, vɜ99ޢmfZrvܩm۶E:|(P KrI,XPǏg}oUcaAmڵ՞?^۷׿o #>X`S<ydI4jBv}ZYlE]:q_~ѹs.:R6$ĵS={ƌ/5fr1QCgΜqUqU(ޱ0ƍ'J4:&M$/U'4eaӄ BCW {̙Sh]:urVeΝ;ov.QC ug.\ҥK+9pnڵ ,SL]8W{7nYdѻᆱ?\ 4pt] رcЦM&T� � � � � � � � � � � � � � � �$I Fm 豀nݺ)M4AlՕ>}z}ARJΧ~Z>/~I맿΅ F:mʔ)SH;/AYd?w}FSUlY 0 gϪG߃a٪[n0׺j׮5k'v.RJB&yj+W ±:vӧO,ɮ/ZڍOqsz֚5k}`8p jޏ$=<a_z)WPuڲk!;vx㍉-K#F{@.%KF.6}zd|?,Pڂq͟?߿+=%9/X>M0oϑq]sXxs!C<l +Ǐws|Թ:U�dtܹs›xQ"?gd\]{ @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ f ca\ɓuHDYUeɒE7'|+h!ٲeӗ_~ W^Ԯ]; 6Um=V6o?1m7d@oN:߶m~w6+W.-cmNG֎;t,T){h"R{ѬYԺuHC/B|Djt׃{Y ֯__=͒%KBR-J4a}zꩧ.k\RYZ5g;︦,TF*Wrpv}Z XP'OĉWda5+ vuG[n]xvZ1ܹϯE'ƍ5vXϮﯿllΝTweM("ZDք*Qq'h6K$Q))K%I}~s;3 wy]qsus]su Q왱ggС qzIcHo%yq ^Yf.H6ѣGO bV"K`%[ oov|f>9pn &@Y{oon_l<9/\Oݼ8l02}tkcڴicnSv9<٫W/ٷ/�{ҥhGz@_.v|7.ٮEҭ[7YgϮڵkG;H<o^kk@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�x!R/Ǽ|Yxƍ8j#@p tYKaA9sft*wq:ujըQC3gtH3f̐}G] \pY2e믿SO=% T0իWf͚.[nqu,mڴi,lmAt4]:[Wzu}ݮQFEZJeڵ6Fsyf9e79s*O<z駕7o^w?EnvM+ ;w ݳ�7|Sɒ%ӝw) hWׯ<jժ{"tZpWLev^8-O>Ѳe\={. Bv_Zsk Tc#Ƃ-ў ImӦ [ܿo߮  o_kڞ}YfmXpҥfh>f9%ŽK"֭뮿Y,YR2eʘCbό=vOR,`eyy^\yo{tԩ~}衇nHFe 6<nYGn>9ɞk ӳnX{o/\PYHfn.mmbclm [-0:o#ߜwщc(+gvA6;dѢE.؂-@q1^�o,Y$ h}\ipYhQukbocE-+WS޽]R \;6{J6-;O|m>R@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�./ |m$sFA�Xn/vj׮}C,ٳZ`'N粩q֭.@n}'8 ;v p`.7nttg!VXFB^|EYnr\gcrq f! J$ P  ԊZJ'8O:-,-y.$JW',` [s%*fAł6 رc|wAP%['eM8хeDW<3$~\i΋K6s\mmB"Bt=vI7T}9оmn+v>;UTo':.jsYZ e3gθK m.TPD_Ռ?wE ?¨-={gy@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ 8 (gyF|6oc Q\uvڵ*S y饗YiBׯ<j֬g 8V,|jɒ%.0>ooRʂADڵ Ms}ݶmڵk+Wj„ W^\4KA.пԣ7%%hP{NÆ /)RL} ߈9&H/rU>}z͙3':iv͘1CӧO??jg-4-[?X=P*� � � � � � � � � � � � � � � � @j'OjرPD]W{@ogUɒ%e9T2dȠWRrX'+<Z~~嗀47 [zڴi;ݺuS YPGq_9܀'!MwvөSwkrɓ'OЎŭ@RR!T*/7؅BbZd4h {j߾&O~QFo$kވ9v{ OvexT?|puEEі-[4h}>vz-nk֬Q޼y}Y#� � � � � � � � � � � � � � � �B QWbQ/VU4 P@ >CuYwV,YMcǎO4c ըQ#ˉx4`�}.D1Zuܸq%%O\zr"_֨QdZ2e믿.{f(\ٳg5f^_-[8 "=MS;A?7xÅ(QBdnO?^ڵӧ~sΩL2zgԺu\6m';9r [�ZZd4iܚW � � � � � � � � � � � � � � � @5@ *TP…]n iժ M8Q 4i,vvF ; b!Ht;(C ڵqO/{E|N4ҦM}S+pQ=ZzܽϽ,Pzi_^{?zk.k|"EԥK5o\Rq/>|RL)[>}ZI$+:;wjذa1bRNj߾RH0؆� � � � � � � � � � � � � � � �   cD+TlY͟?_ժUq\Bh5wDYh.&~I&L0CiС<xN<Hx *U*&&#p+WԨQ4vXea׿1cƀ _?+u&snchݺڴi%KO' 7Hٳo\3tmgU˖- A4� � � � � � � � � � � � � � � �%@dh]oF С,XkްsĦAW:u*{9:!0o<h!Y ӧOkĉ>|/^2eʸM*gΜ7:I&iܸqJ*'ԣ>J ?^޻D^Ш4pvnĉu>вe\ofԤI˗�U ,,}O<}9rD 6TUV-6B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�R Ȁlt8zrʥ7xCO?twnѢEjѢ_W6m@)?JJpCGCu!A#GT̙�m~/U^]?z!͛7@GECA`׮]/5uT͟?_YfUպuk,Y2L"=ԸGRd~Щ(]Xj>gMߠA~Qj'/p͝;WӦMs={r`mW"� � � � � � � � � � � � � � � @ W~#G /h޽ʐ!_ٳ ejX_-;q}z饗8qb.x3?fϞ)^8p@eʔѽޫ{1I$qyJB]dfΜoF+VP,Y\]Ft={HG//@WZU*IG q3aaaZ` O/}v˗OSݺuuw+}q|VC n~w}w5k^9q lذyw/͙h@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ & ca;ZD*_>X_/_g}V .t6Yt:}Pǂ&O^{M7nTǎէOeʔ)׃9w~'M>-6mRƌUF ժU˅-Z4OK{\"~z4w\:tHz~T^Kؐޫ Ε f̐2gN^\9W\BU-\uѢEJ(ʕ+zNM6q$k.7o˶mtM7_ ={8: � � � � � � � � � � � � � � � �F (QbE 7Zd*Tc1m4Z/xR_TժU[qSNO?U~→yի Y'l٢Yfiٚ3g>YI{,4y~sHgΜѯ v_傿j֬¿ԩB Ұk xnQN-}7o u ۳U _]n Y*URJ^ХtIA l_j $t{Xd)Tre@mAݞ4i8>;!� � � � � � � � � � � � � � � �V JQhݺV^+VD6~7۷/^o]:tP˖-]85~z9RcǎcgϞ9V\8B K*+|*Sn6$ hÆ n^l dBFW.[J$Ia޽Rݺs  ߿?"y{>Ϟ=L29\rn3J(Q`^ǻӧvZkM7G łSL} � � � � � � � � � � � � � � � �  [@ R\4`�u1GO_~EÇׄ t5lP7VzB:$g5uTM8Q ,pT+[ls'7ovA-ҥK]ЪJJ%JPɒ%uw߶Θ1ck06ZU?Dힰʕ+RJ*\p&֭J^]@u?Ξ:u-YMe=>}yx.ڂ-4aaaھ} }\flBϝ;`"m[oPнe9 � � � � � � � � � � � � � � ��Ap"*`{M_y~=zT~ >矕:ujw}.{Q̙/{|0ܰafΜ?\ .tײAjѢԩĉ0v iOrJYڽk%G*Z+d7|3.@ܹS i&/�o }QYX>Z0hRTlY<y�5F f/T=&͘!%ls@sq7ny~n˜)n-6*TH P)u;Z(-7nt}ٻɓo6.]I$"� � � � � � � � � � � � � � � ��A|u~.`sիW?3halcTT)`/# ٳGٳgkݺ馛tI&WRwXXo߮k׺@ B| fa tu|\H]sJ >|؅=uܶm~w޺u[>}u-[RxquL(Q 3#޴=ޒz s'tw 0X[\ kΓ'm^-6[ &K,{b`]viǎ=n�mծZسomLbj � � � � � � � � � � � � � � � �$@d�],? ̟?_wuVXoq ]XYeYؒTP-˗w<RSސ6,(jժUZt[,Y{*iҤ.زvڲƔ$I_}iڴi[[Ƞo9tPDgҥKBᅇePY]heϞ]ٲe#@,B,v?Ξ=?tϚ=ojk ]�;wرc f̘хtZp- ֭9r䈨>PIzai)eT0Y6־0A yƾ]l>#m~ϙ3[1?K, 45'Ots6[-&9r$diҤ(7*TȽ 'OQ � � � � � � � � � � � � � � � �'@d]SF@<c.|CX(˗B,`)_|*Z+"EDY蒅_E Y�ݲn:Y }Xbb!iӦ]}?�;v B #\f.=5)}vDd!PH ˜9 ߙ2ero馈{ˎ ǏlMٲv}VώԩSܹsn[nQ |Y#@,̑yD;W+y8(;w}k_(/Ђk}l-�8k֬n޷>#/6wYp0ڷk.6bރ ޴N}�[3@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ t kf @!C]vN xymڴIhe˖-:qD,D,H~ ϳdɒ�% Q%I$`3gθB,` Y@S"gNFipŋ Jy?|S6L^ؗK˻¯ۧ?J~[a^Z,PB, *U*L2oomb06=#OK}u1ȁ1sjq@L Ŵ@/{r3-<~[h^`F3ӥoss6ٜn/r9{G+6/{[M;:EJ4 Վn޷mv{\p!bΏ;{۷we!{{ﭣ-omE-vn}1}Ⱦ[|s( � � � � � � � � � � � � � � � �\N xw+h޽J&MuBy%ܹSvr˞={"}!@% =o mDQ$-B&of͛-DA &/Ko%!Ruɓ..D򈗴eZ^ ײ-_c`.6,x"|EmE facɨk_0msgQΜ9]Wmg( ^~XZB=Zj?\ok|m|#}son.ѷ־>6{wDmO2.5nRj/z'D<o;'@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� 2.5i (ZjԨaÆȈ&-ewJ=zH: qYO<޽{kwլYӅ>Ξ=[JA�8{V-< T>ӻ8QjL6MzgE�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@'5 ~I6lPbS: GJ}H nzm Mȍ7j׮]]v͛B߿? @,q`i8ijUt pJmH?.%ـ� � � � � � � � � � � � � � � � @ ܜ TlY.]:R'~ }7<qvG)M 2B [nŅA:uʅA۷/AI@Z~E:}Z*UJ;ڡ!`3JZIaa1fF� � � � � � � � � � � � � � � � AuW#G4e=~?:@ xمz=@פN$ [J.0t,f͚J$Iu8o޼. ܹsQݛ`} {"E%KvmFb<5_ mZixys[?^F� � � � � � � � � � � � � � � � Aﵡg \7ow}C3СRR^RK*tSX9sTvt\\dĉu]wi ':�WHBz]iliRX1Ϯ|5BG\//q3R@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� ҿA>c=J>_!*^nFnUMziV)KSXd;A#G͝;W)Sta۷o<Tz@ }f԰ԤI!/xydǏ_  � � � � � � � � � � � � � � � �p o81'@ 86oެŋUV1 F@� \ }TRݺj / ܁͛7OsV…fٲeӜ9s\�nժU~zA� XnK+WJEJÇKaa?/(4vt?^F� � � � � � � � � � � � � � � � A5Gq+W.s=~?:@(XxԩRRR҆ AgyUzuH,Y4w\ϟ_ժUӲetbO5kCLW[9sJGKcH'Ƙ% � � � � � � � � � � � � � � � ?ׂ a^A6o\3m텢cA-0sTԨTxxK ǰϟ? EQ 4k,UPAjҜ9s bHJzMirBu˖}V:z4< =!1d� � � � � � � � � � � � � � � � '$Ʌ?lWV 3*Z {;ҤImpW\cǎz~;T^W_}Owt (YRZ@1BS[1c!=A/[7K=&y@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�E xa$رcUKN;{ �XD][S6on3i4yb� *O?)s*VUU%K}mG͏,DvF'*U. q۸HR0AZBz啸iV@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@��AWb?!.pM2E-[ q @^-=`x(َ㼓ĉu9 tjժJd m~^'NaÆ{jӦ={ @L�J>h!]m@;H.y@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�n�A7 }9M@=~.yԼTdxizըQ#?woŪR7-%_]vuaaaxvN�q%P4wg7Hwo:%wcҡCc� � � � � � � � � � � � � � � � AգăI\8[<ylصKz X1_ɓ~8QŊկ_Gٳg/_>jAcǎլY3>}:@@ \Gu>}ABås ѣBeČ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ L(y΋@�:uJӦMSӦMt/kWpa ~F֬y$LZ=Ě$I5vٲeJ(ʖ-{ G'!-Zз~ڵkСC )z�$<jVG.];Ꚛ�ȜY7N:5`ݧ � � � � � � � � � � � � � � � �$@d�],@| ̜9S'NPƍԜ8rDwޑ6nZ(g)[lAy`YHO>]fM-X@۷oW*U:@g@" 0@ZN*QBjP޳-͟Q5B^x!<@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�n�A7B6I&zʑ#Ga p#�9dԫuԹ<yx,�_{ァʕ+'\gY|x>kܟxZxRLJ*_~"ī@9K4iOZ2^Yo_ɛլtL<!� � � � � � � � � � � � � � � ��A!q$W/p)M>]M49"Ξ,LOS'ߥ=ԩ#iǎj޼[:[:d˗E]\ri*Uwf̘BW"I/)#5m*mc%K&M m"b(K0v@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�%@䍒]\~ɓ'ՠA� G a¤㥢E.]FmۤW_2dO#(O<1b;={СC*YdЌ4]t.HGՃ>.p=ҲeҔ)ڵRR۶.|�ߗ{O#B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�HX ֟#_}ʕ+ܹsm*0}TԲTi4h-[=~ꩧe}J:utZKRJqKS 4iR5J{9o^gϞ 2B[ᇥU1c~nUQڹ3]mZI͚I[K � � � � � � � � � � � � � � � @B ? _|O{HOUx@*XPZ:<$[b=ZƍSBb{֬Yٳ+sA9ݻ/ĉUvmA9N@( $'բa4l4kTԹ{w(ZFs6LA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ NFA ,Y}\@ |G LLZX:U*V']|z);k ڵku4h h*W~/C &ڵ6m -/7<r׮PO//}4p`!� � � � � � � � � � � � � � � �$�A YkJ p6t. \?l)*%+}RŊWFzӧϕYx UD Yg|TJM4;�A!`A;J[HHӧBv$C AT$ҿ-/7d8 � � � � � � � � � � � � � � � @ 4@|w}2Ɓ@ R"Ғ%Bucw .y ӄ 8q辎7lؠE.keɒEx =ѣΟ?࣢ U yr'!f }m6@ϞB6k&<( � � � � � � � � � � � � � � � �*SzE ,k.\R5jHݵ��@�IDATpzO o_`Ai$i�i:iS)Qwޚ7o>seΜ9Yȑ#*TP,$MTԘ1c4h ծ][� @ $K&u m, .onR2p)&`͟|"'u` � � � � � � � � � � � � � � � �~'@]:@ L8u W\ Ύ =+ �RҖ-RNwU믿믿\rWulU޶mRAK Һuk-ZH;vP2e#`B>xx_~7Vh<ҨQȑԩA1$� � � � � � � � � � � � � � � � @W_@ o .t/4d7Nov}Qj֬z .Ѽys?>h.!]6}Q7֮][ׯ?'V…*wQs_VΜ9tR7h+ &Mzwυ?%˵mݺUZR۶mվ}{͛7OӦMӌ3aÆkk VZJ* 8k<zIf|oJ*ݲeKu]ׯuvC:x@6.X9Jsz:u4k֬+[oUΝcgk†׬Y>cӥKٳڶ~&O:VJ$$Ԣ}#z*[VWOSV͟zK_bxaC' $ qI{ � � � � � � � � � � � � � � � ? $N'H8 j*͝;nݺΝ;AhѢ{ܾ B̦L͞= y.Z} *TH#FpuҦMB9aÆscSwΜ9|ǎsnj5JŊS4i\d޼yP цY%Jhcsne+'=tƍ{]{ɓ'?~jܾ}ƌ5G… ZzV\)}Ν;�<.5T盌3믿+=z0ۃ9\�^˜nA;tP7۷O˗wKҥ]�zɩ1~6+na NJ+ܜ,Y2O5kVylTˮVFqiLqz H/�=#Gxg\&-WB@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�fD^'sM70yu6 6lqYiѢ6mڤ%K-<rJ<Xt\4mTK.0`K?~D9s,xn/qĉX믿\?(-r֭-i*Xlqn;g9/ώ۷͛1J@@>i,{~;~ L%|)RD?$Ieq:z->|XI{5ҹsg7TXg2T/5k'L*UDvM,sկ_^͜;>Z@رc](o-B&EW:v쨑#Gp` M*UtT^=;[nulNС{^ڶmJ4-�~ @^֩{x{{wST$^—馅.[Ⱥ}p=� � � � � � � � � � � � � � � �@*=E�-`!d)StƼyF"EKB Rt\]_=kBT,/{챮;wnפ|O(:u6Y8͛#vO:Ujr̟?Ecďؾ]^T 7!C ]ȓE}>M7tCC m٨Ϥo jժ.d/yzӧΟ?'Fԩ-[j}nS XĉUpa8p@|It6_ߢV(TLoY}~iW%آ@j a/S{^ߗv#>,+po={$:O@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Hݤ YK[prȡ3g\iիc ,1cĺĶDб H_hɓ'P/[z5iPy!yҤIRW?SNy]{aP?D۱cv;S}k]v|Ne.n֬Y*P^}U_i.(Z{)a1vXj}T~} lTRjӦwl[s=sjJ4>cT9KO]Y`~ nݺU l͚59Ds6|9sfM>]Vv?u[.˵qΗ;]޽{kذaV=z m֬4i#۷omm̔);_q9}ĵ7{ϼwlɂ;wzJʒ%H{#ХyZj\Y^}+W.Wپm|MK؂� � � � � � � � � � � � � � � �@`B� *-([J#FNnws-ln͚5zE ȱO xYz "u[+[wm!t̙3W4~x-Zԅ%֩SG{VڶmGw߭_Յ0}GUre/2k{߾}.~GUVͅ׿ܶ> E/t&ةS'-[\FK,_;'|RgDž~X;ga_|6nyy`^\\p,+LƂk.]#GPQ r릛nf'Ot}ٳGӶmۢm… 2d76l( ?{B.TTf3.v-}Zˬys@0B Q"y7%zKxZ`;O>Ԏ- � � � � � � � � � � � � � � � @ $ 2>Y` 0@9rP/9n_)^: ܳ00 oU@}WJ8<B,(/K,Ot%[()eҹЦ޽ C^J=zFo߮o5vJ4,1[lJ.yQ9RUTqDنN1;vt,YիݫcǪf͚:z{}cԩաCWS|\;ʕʕ+~/{,Ϟ 2B7l L%ID)S//r-[;wNyy<FL|swhٲe.Cm.k)vD-jl++'NÇeѕo=jrj߶9s@K;… ݜ|Y#YJ"u.]"Yhᒗ]+肣6%[VoRݺRVWtcH y݂+z @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�P-D�-Z*TX8[t%M4QGy$7|ӧ5w\WjUY͛#SN$J xJ(=e@ ӤIdtHPR+x{n JIo <" h�?sY-:uRʴ.L1W\Ⱥ^4ɓ-}.}_heܸqjР I"[WTI0YtiM6Mwy:w]_gΜn|#w=̙~MvoL<9FqÆ sۇc<@R{V.xIڵsX-JVKɣ 痞~:'7-{dyW -�kW驧2w4 '׾W-W>IF�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�BC ih Q"V\… GYXWtBjɮt]->6dɒE#GT{Ւ%K\P_˗Kݻ ӓ *M")7޿ C̐!CD;hѢZ~6mڤ2eʸ1=EH4l!Re?u~G'q\$IDݥy{ӽ-/j裏BJӦM]1cN:K#۹s;r]srvm7뮻j*=sk1a :+m×t`ƍ?{WH 8Yo}8  6?h` Dغ*U04͚I H^}`w|ŊݼA]gz� � � � � � � � � � � � � � � �ĕ@xrT\F; J.-_\LA6/Be˖uaxw{۶ITttx0ԩqi=̘1 uڽ{vء 6B:urʹAdϞ=b0 H:sٲe7^='|R*ioVZiݺu^J"ED_ۂ,,rĉʝ;f͚ƍ_s|A'N"7z]haŋѣݵMh4iҨW^:uꔻ7|ypYi-3gtUƎ녥UڜX=BUF y!ڵ]}{}BU%Ɲ<ѻ{fQ+|DV7 � � � � � � � � � � � � � � � ZAf(5CZ\tŷ߷\ڈ|^i^?uwx VѢq?R%{OJr [8oŊӀ|rJ*b@ڳe- TڴigycŞ sܹsoSz[nѻ#6l;/,(Js^>5mԅژ͛ <%t9s_/:i|̕^ion^Z[V�\Y_iL+y_ӦMs:C۷o;<b]n])RąB1"bz;?cO3g׼5 u^F>~ZysV�OoZ7}0A_.B@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@  ph..I$A\~h, ʺu:?,̊u|Ǧ ;zЋ{iTgw8uJzMNB1JkȻn-`B{! 82e7lؠ_|х%Zr% 5zhڵuη?y-hgq/@jժ)*_;߶m;.?'vBi}/U*}j֬YC"+_Фz2eRŊ]ٲeb.i`ϧJg|38hI:{=-]T6gZ0gϞ=]bDx-v_޵e˖}cWj׮Y`c)TB4n9KMk+k׮u?O>=+V>.Ҟ|a�@֬+y -77H^vZ)/ZjҮGes/>~9@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� _ B V^VdIgX蛯X\6m|F裏<ws% ժU˅>|*WgϺM֖yEWbSOí2fzQ˴iTHD%`Vɻ.]$˩IJƏB۶mN3d/�z饗":ФI똅Y֭͛[{}ޢvEYgm?q {uO>^z]|jzFX E:vN&M6 ~lԨVZ=c_\Y=[Y_ȑ#ݜqE4Ç# 9b2ehɒ%^:t&Nxxƌ*[ln<M{ƒP޽{f͚_C=ȝO>q,ڶ9fŎ{3gΜnη_][nu!W@)}g!ߑ)wc7QIH|PM_}onݺ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ py%[2yr\H; fru_zA^jP�7ɓ*]t�_I`l{wy# Qq.�BiǎS%\]38p'fʔ)+}KﲰȂ *]tW;K,ϝ;,JԩSJ饋ݻWɓ'߱Wӿ]jܹZrVXϩ?7׋/z-ޓER@�C)E>WlnO?I^. :v<B>uh@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�HH Rs#'/~G/:&MSaÆ~CW@~t}қoJŋ_ZFo`D ۫R{nn^jΝ;cwuW -DZl2uE/c=^{M7|s @ <(y2DAgo؃޽ޒ/Oo`4eL � � � � � � � � � � � � � � � @,Wq p=RL'*,,L'Vʕ'Oh50}UX,t{H4fTtxR͚ sYN`խ[WӧOYn^Zl5ydUZU9sh0믿~ĉ*T)RFڈ1կ__2JA� ;'}4phTR /,{,0bw4gd޵jII\PA("� � � � � � � � � � � � � � � @h $3z0͛7p#QDjܸqH@rK�[o$+-[&/11k,ʕ=3@^u8|2gάG}4$B N'njuqiӦ>ӎ;�+4ԴpttRNR޼7uh_tUV:xLLٲmɓҪU~5:� � � � � � � � � � � � � � �ΝTTB !&2K <n4TpKRB*TYe<ϙ~8}:kϵw@�2@+K6q5 C`z뭷t-Gs@>P?}Oʓ'Mհs&V4i^x!,kvg~9rկz裏Tjլ9`F�iXNz}M-{OsU٣f͚_գOTU � � � � � � � � � � � � � � � � eNl;vh׮]*Y 3J+Qpx\!dS۷oW"Ex@5bmذA-ZМ9sda^xLrrd!%B/V4 dv4˗Oߺg{ͽs] vm*aW@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�,+@d= [Hd+}f͒57*VϗxC*V,}ڧ ޽[~C@SNѰaôqFlRS:uTB3&|A�S wn}{Xi4J{ҥ˜.=1]e9|pgXE'^{sձ Km� � � � � � � � � � � � � � � � Jg p k׮G(Q"+btMR޽rIW_IEjx={O_![nE+P2e_d`h2@͚R=zH80ܢ4z49WzYY۷_~M#@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ + .cC ֭S9tꩧbovA :-u&w4y4h4iTntڣ֌ؽ{˗9{`_~6oެ[oULtiw B'G�pS|RZT.,VڱCj8Ҷm8%'`a~Wܹ94cFrG � � � � � � � � � � � � � � � @V 2aƇ@ [nU…}d 38xP.lN*WNGzEi|u7EH;X0%s)RD~o߮{Lvw-s9zJ/@ #r{F'͛']qԣTԥ4gNF.sA֬yekV~Ν@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ zAFϖ .PB1W:*W|P&ibܹ8͑wwlPy_={*K}{s‚!ٓq<*Ņ9^-4aTTg'w#TZru[f@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Hg l;vP3[O5K2E  ^Nƒfh 0A ĢdN9r֖-[Էo_+VL{^{֬Y9;N@  W?_;V*YRI*]ZMZ<ݻgߏ?P%9lzyt@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ :AFǕZ;w`0Y+5}IAώ!T>|X'OԩS5}t͜9ӯUVi޼y.<l-\PJE쒞7|?Wƍ\oFJR_gWh 2=U\]wI=7Nr0)SWTݴl, � � � � � � � � � � � � � � � �'@+t6q5YbCӜ9s/Fe !Rɒq>AC!)Ua+]bhlRڕ3P`ҥ{5w\^ZM6=K M#@f8xP:Tz]iXlY;[oN=538}y.5hpHEvR 5Jj86!� � � � � � � � � � � � � � � �d YcU` ];V=KN!O|�矗,LN-k֮];n(*Pn(KfzYgoBr۷oוW^J*7Ԗ-[2cd@ΜRҘ1H]'T ?>:,VG k,gױ;垉R&Ғ%'@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�#@d94FI^(sԶxCRܙt$ں%&S'?e6 lժ~g͙3GSO=RJC_2[dyI.^-^ܻAr!oK۶e`2i^ҿ9}tr!r9F�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@��AQbbC  FGeLtR&RKo)|rLtNFIW ~(1)pK~ӧ֮]zK .TÆ e羗K8۴iSLN#@:wMfΔ u nU ut5RR:ҪUС'E�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�N  O(8@\tF`:KZ5if駟!C Ss<d};*gΜIԶr-I(Xnv6Mg_{ 7ܠ1cƈ�:h T."+Y#j\dZR}hy[^ҡCq'Lv<}' � � � � � � � � � � � � � � � � 22Ԃ@ Xh׮]bt<c쑞>.qHOB6~zhӦ<dԫo1UV;׊+tWL2޽=G� .,u4w4qTtRɒR׮rm.SU7R qOأo; � � � � � � � � � � � � � � � @ g#ps㬅O4 *Ss_xBZP&)[MFϖ&.ٳgWUT?=ϟ_:uҤI4|o Y~mmڴ)a ԭ+'"+=/RRZGo {/VڱC.,9~) olE�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�] cs""P@ #"X'<˜nYjXZXzI)_e[& /jٲe3f*UݻOW-W_i߾}'D�dN:Iz�Y知奻JS=;39rH'2Z, r0B) � � � � � � � � � � � � � � � �YG ȉ3HF�G8ɥl۶; !`!C]'qtiC^DjZj@p9s>Oz"XM6:h[XᒰZj'@vz֨Q#Wׯw!�nA%Jmݦ~Da p{|z3O?IիK5kJ~(j~1}K\K&ȅ%[Jӧw~A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�= cc"*`[͛#Z/ŖK?,B#$ڶo^\9~|C %ҥKvʖ-5KjѢ .ҡϯkZr|I4;GW]uJ,]jر:tPV`h bŤ,{o9<{-zԒ[7C~#2A'-4޿( � � � � � � � � � � � � � � � �YG Ȭs. $`AV֭[wLsP <ԯ\Țtĉq~[*W._Ε613g{8.;f\gh9 X#.yvƌZd |{HSN_RJ/Çg!H_ O?V]fF zuwNOk J|" ")"l  � � � � � � � � � � � � � � � @L d iWӠAz@ [lQb?hGK ;uJا9ϖe/Ozɸ`{ _^g ͛+WW'… 5Ƚ`okujժ.尉�'YqmJ.թ;41F{V&췅^~zm|C�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Mmz�8䓕/_>X"RUROOz둝=tHZH:$iW<R-*Pxqկ_ޮ];B ;sSO=sj;4f]z饲kK:tv}\2vҾ}F�WOWZFzUi,n]R%7‡S߷{_NMi9R[ʓGʙ3?#" � � � � � � � � � � � � � � � �d@+D6q5 CJ*j֬^xh.۰UViӦMںu_l;vЁžt)>rRܹ <ɥ-rrSNRS:Ҟ=RROl٤N. jW< X�];wqIk<:D>z…6m5j䮳Ӕ#Gew WYQeSΛ7*|)P ,`mmP"ZkL2_W]u:\K\:p@=.(@Eq$v\asG؜ץsG93Ÿٞ>N cFRsGv??sH'bN-3>>\%7?H. }he�}{Omm`m_{JMJ~wҍ7ƿ۷o4XvS[۳H"驧ҥK*@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�"!@d$hݺ ɦ/2G]V˟+Veʕb9A`N…Cv,* x,8+�bSgqFR\9UX/s ?-]^jԐ :J=z}~\vY@͛u\_v۶mbQA9&Wl4[�`J9c_~W_HC>�.yKn~g {,b}PB +gm�,[@A[l)~z >܇B㏲^z˗Oz>c.SO˳jE 'l /l lvTG/}"#x.:s!m9` >-Z\X1bQ_] ɓϖnEY.4l(/7HժI}'\t/knT]/\dYtÆ 9tʂǃkΞk3̮}>}azp߇ؽf{i2etB ~H  � � � � � � � � � � � � � � � @LG umӯƖ-YDSNˌ3|_Y 8 9묳p  8 m<b;A*h>b!AYUsDk˅^:㥋/- IK.RKJ%K/{D^ηY/tx т 86 = lf,AЙ]b!*]V#Uǂ,-|K .sx]x]~g-{=B/^܇c(QB|K )#`{ԨQ>Ҟov>-PI&kt饗@Ľ+UlY�TrĻfjaƶxٸqWlnkbo&:ﶏ\9|ΰF ,쾷%G,K0 (3<L|Ş6'[('gWm.{�ϟ?q|?N Ar9jL.l;ǂ"brB5e˖iڴi錄ڽj%\pr_ժ[ҥK]+2Ůk7׭[GM??K-+UBkwZjlٲu � � � � � � � � � � � � � � � �YZ ,}zׯv]rZM/ ,?Q'O!z6n `E[[@Z[f)Be; >},B,dztWnݺGC8 ]u4aB!e`a;KYV?,q岰O zjAu 2f!n'=gze*|0= 崐 B,3(g.Ȟy˔)C[ŵ\o̝;ׇ6j(>~/s9 zbg}V?rȑbl|amZCmċ)Rć`زr[6%69K, 9bcJ;th\({-t}7˽K}$|_w#4vNgL2_6Xb͚5eA>z^]p{ޑunja^j劉.y+n e(��@�IDAT� � � � � � � � � � � � � � � � P Ȅ|CTJe!YXѣ5l0�i5tu饗VZV[@ٟiӦiĉ~|K.U԰aC]s5?ã:v>L:|taʕK  jԐ&$,mٲeZh/^nȖ/ m mm_eAbmFɜ\ڵkf͚}O[>bAB,ʕ-˗W%XGPBGC!-|mK| BƍC7={v6`�o#sے%Kb6_XX-m 6O؜aM}I:vC=m>p`m׀#X|̖-[VXgII^f>¯]i8[=wޑ Q?7ٳ=~ghANjmNjO̸]f?~'eA͚5vR@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�]  `8 +T}]u)K۷OFҗ_~o]|jҤ #G,1ă0 7a.V߹#5.V_ˣG{[ne>BbAOg\eƅt�-`7¯YF`Æ >Ϯ[,�h-PҊ]i!TP;<Ν;xd@z„ >_~.mKAG T�_|Q>,Xp}so.+\Bo2e|a /ljS +Vįm>w Q+iϠs=7~ĖX w9.0_z5 }-qĈꫯԩƍwҚ5k*:tHӧO^>yd޴iSnZKW@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ȺAfsH@ڵe[o2΋/￯O>DW^=4ӪU+Yp։V,lgo"p6[C]/f'B,qٚ7o~7^z6o޼}Aos9:Si=A,4,rѢE>(FO>.U\/ժUa'Sćiay}�ZjO?ؼyΝ avL||0}[tc<Z~ ;Z(d0ؼb6|b0ZR%UXѯT?ɓCs#v6̂ғ@^}4hNjsŮ]t饗G[l%Jy I 맟~RԡCq뎂� � � � � � � � � � � � � � � �HAHg"w߭3fhԩy9r^{53hvm[޽{W_O>?~0n;O@k]=N6A};wnUPYxٺlٲ.=lBj5l2?bŊjժ^*3<3V3g,L3%gΜʑ#z)G/_3g_-A@L`sږ380Ԃ_Yfn,Vjs}[8]t[-d lO92賛 ry5z;\! 9O2voi lذAӇ~I/bw}jӦ_AB�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@��AY 3>R)`5۷֭[U`T >\>}Lƍ KX{w (~؇ҹOaiyӦM8q&Lɓ'k֬Yڳg,XB,d q˕+W�!}v<haXY Yqhf%\5j(O<FLiݺuTe1kB!ٳ˂lʕ+QO2kA6Xڵk}p9眣5kBԩ㟉Yy[d)AŊt]֒%KԺuk.5l0m{ݻ,k{С_OP� � � � � � � � � � � � � � � �'�A'IfF`*QF) Rc,Z=S>/;oƍz7eP';VƍW9r\u+ `7 x KwmӧO&MҪU|]׍5򋅹 )YBPSma|dþ}dVN9Y`٦Mϟ?|A [οs͜9SSNմidѼy C{~rOKnt\tn{vݺz+U|?=-/Bt_xp 8]@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� 2=F jZl_|1jmoD/!fbXr?~۶m7|PT<'jԨQ>tܹʝ;j׮ë6l?rUV:_%9aY- ,v7i/{n_z%oada˖-iSZTh]D zK.Ք)Sbs˼y|pr5tWꪫլ.=w<q.WQ =]ur+W?OOu{CwZG�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�2�At2V;Ԍ34}QZ8p.)RD={TV'U?ԃ>W_hZ_FsN8d1B;vPժU}8Tխ[Wyn>"a3F~^Z -|={ [z7jvÇԩS}>6j/]tr̙ݢ=bJBǏc+ Wmu5SO1%Y ~B/{-ڗm'0go<Sz'#G㫔@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�L"@d&9t `Ayca`%K ]}ػw۷Kʟ?_V숅n}*Qkwy13L^Z0`_[x[BմiSvi13:@z ̝;7> qڴio۶ڵk5kgWҥYfiРA/_y΂4i 0t E,lv|E^r%jӦwX+l_|Q{ekÈB!ܴ֭yTR15:� � � � � � � � � � � � � � � �$%@dR*lCسg+zKv[PX~5kC/ 򣤏U|,L13 eӧ<t萿n,B͛Ntk֬_hҤI:sso֩\R,ׯ/^ڵke˖?rʥC�4 sy„ >\zȐ!>tQFԩ˗SE~� *'N,X믿^7n7|#� � � � � � � � � � � � � � � @ 2 D@$,&[l6lX$=/_. ʕ+Fs9cؿt>L~ڶm{EH ^ziKչsgjJBT'`s'WA@?UF(ҨQokѪXڷov3ό1Iݓ0k ҁd!s͌cBcJ fnf>ܹ?,Pꫯcf � � � � � � � � � � � � � � � ugݡ128͛U,h%#˺uteH"0a!t2r~3t If<>@ʕAu… 5vXtM@&%PLC/õm6]tE>mUw4p>HwZnO?]SLo'xhS7XxzԻwoYF}e ԴiSey-Zp >|dNn2{ sa @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�U co$ЪU+Y^FݻW͚5S<y|()Rmjz;Cڵ̙3S{XT<x?|=ڵV\_݇BFA*E�/`mW]u?VlР-5P(~|~ܹV^?P5k,ݤ ,pm۶7n~W;_Æ }ٳ3hjٲ`9O;k@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�El.,'iWӠAz@ #7oÇkĈѼn 0}҇h0[x[$]7֒%K4g*T(զ+VK.?~}Q=cʟ?gGE8rH=ѣrRYZ@_ݻI޼ySy4!@fX|~i.ةS'*Zhw͂/"O?s[><p.Rm۶\'."� � � � � � � � � � � � � � � @ p7x{mڴ)=&Lw}W;vZUVMݺu8/#<?~iԨ#= ٳgק~۷cX<x.BgɐoFe˖DZxYn>cjao}u\r BK3?OiӦzt B5tP 6L|իCӻCTKumXkWFe\a?6oڼAX7WfԳgψwfժU\fSeʔQ~4m4͞=[\p~4xxge_|!Nj-t΍#;W@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ 3FH ̓'>th-a>Jm6'7 lҤ,^z%ծ][wW^z뭷CB ;/vC޽-W^8j(q;c>/_a{+VД)S_k֭<>Bl,}ղe˔-[4u)Ѭ;M<fa ;CEE Ҹqc͛7O%J_, KsNk$\hj>v2rؿ/^kܹgAf(ފQ0-[hܸq1bv6lؠ'z3bH=uT~kMRիSҥW6N$Zd]O$scΕ3  � � � � � � � � � � � � � � � KA٢@|^>}ҩŸf,B}tm76vAZd ɓ'K.гO?4A{;-0XDKΝ}(NFz5l0n.{wo4vUzhTuȑCv?|純1cBAQYw$n:iF^xx -[Vol{F"EhС}.ݻW͚5fRFfjȹ‚oVկ_?5]M}2 1wy뮻ьzر95)6 ?O <X=~[Ŋӝw喎>9״m/<¦ۻk׮\9 � � � � � � � � � � � � � � � �$@d,-@: Xݼy4iҤtk -vffnhz|b϶mguVI?.\lٲ) 3K e"Ywx] jҤIO|3̙3#hٳg--ٮ]ZEԎ/ mݺU~{ 믿oϨv>ꫯu]' jf{|8رcUTh6溙+bJMဤƜO`. Ihc,)A7oA0ѣGw[nErZIUԵ~ֽ{w7.kK˝;?WCң"� � � � � � � � � � � � � � � �:iR5jPjnݺ?nZ[7nԛo9sPBոqcߞX`޼yUJ>|֨QG7o2?C8eY385ZGOqj8̌."TгgOٳ'իGbmLO=Zj$<O66m[Fmg o̙<x,xk̟Ν;릛n_\avۘgyFbJT[�aӍ7ި (=qI}իW>1=>SNavٳeab~ʖ-jٲej֬wxO?$w.]M6-/?Mkժ_~.YD]v6lؠCj͚5;UfkRu_q?~|5ߎ˼[n7߯pVѣOJ߶Xk}Y"ES\w~ʕ+'طRJa|n3Ҿ{:OD~ˮŋGc4\m6}sȮÇ /%JiM ܴ{n{>L6hbvoY9޹XrM2eȞMI[}=~ڲelرyQ,xԩW:k;(GkhcʵkתCY{jv_z%Yh>יXShBwuvŋ+ڋF9łه 3{r{\rzw>]tiSѮ^맽;=UhQlRv;T45\Yx+`� � � � � � � � � � � � � � � �dnPׇBP@ k F h!^r!7Qi˅9眐Ʌ&.ҐC.&4f̘ q?gr!5 /0Ԯ];um!俻0P޽Cs =c"L޴rŊ!w 4hPȅ&\h^({~cU\P(O<!&\XǬYRT‹B.'U:um./t\c\ $ ^\b뮋ߔ5e;.Zum\ b3 u-'w7‡+ vuU~\vXq|㤓N PА Km | ׊ ` 0׿|ꫯ/_>ٺ:i;[.1:u 7oXV >ꪫBvؽg � (Yq &L!l~v\\ڴf {Q]\rI?֊+Zra<ylժUȅ,.457osQFBsה6WZ7 אC.ocկ_?m}.hVjƐx |fs׃>v/YfեKyٟ?ژX^ B.�؟3{qau9\(tȮdػ+ו҇XSl<v=�Ȑ Lix ̙3>9抎r`Zv읢o߾O.f]tGQ)&w[Mjoq3O MXٜfmع � � � � � � � � � � � � � � � �"Hv HjR/k.dm.Zh1'OJS-[AA֎WdIr컅ٳ'dwX67 :t(4}… }[ �O>&W!ڵkE-ZGZ0_ҥ>-ZHrHm0^zE>|8bSAZ/^UT)sNE J|.r-<Zj׼c)]SAhA^L^RM_îmvXի ΗSX,M6)C, ҂ Hn5jʕ+|!VZ@e-' Z|y|?,sĈ߃`ѣGohYٳEx8^~1)}81^[]၂g m4Z�jf,I:t܂b%B`-<0;vۂT A *+C ^"qX]?||M6Խ1$9sfD'~[SZ s ޲e߶tR_ΝI9lܸ}]_wLOsAצ%2{._oq[# /^<rt,kJp}'u;=GmHk9kJ׿ڜfOx im9sGA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�bE �I 6y#ܒ>qǎ2d, zR\� g m ~={v 8ǹ.wl~T L Ҕ)SBO=]<xQ.H.Gvƌ#w>l8vTx\0 (?WXѯ7l=??5k??54tT]SAӦM $ ( s 6+5{J*raSs=Wmڴ Ҽyk[47 }wrVrmzwB/B >DcAV\{ͅK,Y"'TZ5$?ϙ3Ǐ,<sas-Z^2rTR %+\xk|l݅7oKns_ȅ3ό?~~{ұcGM8Q.T )RÅ)kk׮y%20`[~2 7.wI*O:$lٲY+6G~?\pʪU: msmPjժ?&fOu,)igqg/W{rU^].LZB1{YUP_הmNsɾ >F�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� @ Y @'x)uoUGpBG1c_,,qŲ,1ɑ#'k%-8K.6ߓ78&k z}ߞ={dtIꪫk.Eڴ, :Sqo }(bI|7o܇ 8Ї};⇗k*8`ܹ㏃M~\{] җ>׼m6͟?MZ8Ux@iW_}U 4!y1Xt" Kesg}nII[)S6?S lZ`}ÒY_x eI&ɂꂰHZj?~|M+l޵<[vkp_7N3g<" 2x gl*Q,‹ 4!gS%Tii?s&ZVp<o>|3"!h+Xvϱ68V^Kh{#ބ/ցܹs˞%5kԇ~&Mѯ`\1G/?x[jz;WvQ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�X 2VD /Cz  tɟ?rGT{n_)m'L`RJR~}BT;'%K&qoߵo>U\J ^LXfAf]v]s}7|%TΝue/[o_O4X(\5qģ`mڴѨQ4vX|>*Ph5;hPB;}7 ԩSQwa?~맅HZVbf-*T_ `4+*UJ=#lݺU}:VN~h5!&7WtIUVi <?֭[0H?v^|_ծ];kqx cCx=L紴99̧d)4|饗|^Gػeˑ.i_J7mC|:<Z==iӒ&ٹs҈w @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�'@$(kɒ%Sxv+4|"c-``/5{},cǎZbE~]5q�ٌ3u릶4g:5cJ` :tZhH,1Z -pРAj"ܹsS&MTp>DzGO?"y[ 1 | ;)ϙgCTwfMA]_+}k.fpPp=gk⺃6m}})O<޽[jBƍhڴV?? 3i$bV,,3Xg·ggN)RD<@ԺQNr->4X}ֱT|zJcA7ODoPH?fNA�j=$e Xlx:?\IMǜ\}ῥ9Pti?ٳGa6Z z9V攠ܻwo{>;uŊe^KZk_m۶m}wh%kk öOI/W>xm{vٹ � � � � � � � � � � � � � � � �"@d)@ XKsHE;ƯSFz 7 iذyk_:,լYS7nmZPVofZN9gے:67ŋuUW7ow3f}]zuS۷ol_Ocv|SE)T^=ˇu92 1<<tݺu߾,_o۲e_,(_-(/ڴi?ڳH hVZ'5{x}ϊҍ1}֭Zf ;vvU {}eΝ}HY]ה)S{n2p@_.Κ5Kא!CoO|w?)TI\A1oYh% }#oVuE =m!fwurV\Ys`?{V@u-ݶ5q=>Y`޼yڶ]eʔḫWj[i<sE0m$7Wصino9Ǟ ݺuI'䷅=z3k׮~Έ\a\hsí$uov I=C#u?eAzs+ڜrJwcmJjOjAZjש}<j ݵ[+vsJbaN `Amڴ+:~~ޏt#i_P槞zJ_}x % 6lԽb?صh׹x왑rRAGzHjXbfMA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�bJCD\}(d  n P~:/8"ކ PCn o 6=G֭[6lrtn!+W.[C.�1o./_ x㍡J*\ȎhWra`mrZ!r<GPocrAs.(twmO?:odɒHWd}/o7HBg}.\pqmvm=裡'\VH _JI&U`[%k>V!ٵzރRk8P>}B5j5h B pͧN:bŊ}M ]˅f\GK*zBo^JвeB g<̐ ?X;|�v^^K޲~[oj .]:fC./ ;.g9sCpnO=Tuey̦y! (fS ޱcGYfŋ\X2KRsc\}\ٵ`˥^r \as [-[Byu5iךOA{\OI=t&/- -Z{.4Ըqc' :ڽRzp s6v{nݺF-[s͞ސRa927` q^)=l'{|ڻi ۷.6/R'2ծm{FB:C.6/.of`̙3Ce˖s iO]>C}OJ)]b?vm.aS+عsFA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�bI uօ4DiW͠AJ@ p!M0A , J~2?\m۶x;w 9#7oެy�FΠ$Ʌo< I{$LUXQ:t fd5x`vm]\\(ag]N9唣v3RT+Vxs\3fȅa꥗^ ? W'Ú5kBdד 0 Yv=_뉿+-_\vn`Ϟ=5w\?A !Ԉ#vZccsaGg\.<ߣ.4Uަg{a-Y(_z;w.MB ӳ Qi+…% ” !ձvxgg܇ߛ֧[3HORGsjJs~=ln9:|~Nm[_fSOgϖ 7)iӭt]\H\oD=%8vw{?L<b'Ү=_.TYfAʅԦv߅ Niw~G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�2�At2 ի\Vo-e9sfEkLZXСC7قƍw`E7Avs̉Xfjda]t裏DJm'ؤI)yx)ٻwO,hxjAWV,PKըQ!A̘8򈝓s eѢE~9rqCrJbɞ]vdfϓyOYX.cߑ|b~~i.ةw'vHZJ,%"^{[T*E)[mM[WB#b5%&}O8>wrι3sι{?z;sf}<3sg~g;ӭ5W�Cm{ɭZբ|T{N& `G?_3PWX@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ZCkklm"@XqN8~ӟ֣SxrK:u-LSR@J]=*Mnit ĸ"xgr]{>7VIOh.}ͮTR {~kVjr&_| 8>cl5,R lus=grԶ馛O<aJom\ƦMfW\q>!b?[%\TX.ݶ*v|U'|m 7!C_KP`kFim_SN-osb5ꫯL͞=\pjVUf￟U@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�h N.BVio4aBz@>߿~>XoڨQ|n͖Zjzm8#쬳fKwK}TT08 P & yaٳ>k ^N;4 ɊG D#F뮻z$eͳ׿СCw߽|Lnv;sn7N<D[wu2_~2@?Ol}aÆ5dzIQ`ܹ~=mʔ)fqPwv[Ν;ʕ~؟'z1c|<fY_m{キDEYg^@�@�@�@�@�@�@�@�@�@�@�@�@�@�|C9��@�IDAT@�@Q({t І<L瞳}-}nݺٍ7Pmc4>>}3HkLe6c~gϞ9s>qb_g}f -P||MuiO+.2{Wm'!Cl*s9ƒ ]vԭ_~m"$&p=  ڪ�x* [oնv[;vO /ܐlD7I",b]ti2.O? J�͛niE@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�h8A6.!A4>Գ{뭷l^z"r-9 oO=]}ն&DSo /D(`o5>)jo]{:^mzf;k,.mƌ6bm|p]@S?^Y_== [om.8p`ç=%gwy}ݞG^@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ sr@Mnfb-o1cdV2g.<N=Tٳg_+8�[ve}ЦUW]kmUx> ]vA,.-@xmĉ3m4G?wن r|ryRlxVc<v 6\0x[onn6mA~{_ǔ]A'(L+~;;蠃SN B`{򗿴^}i# � � � � � � � � � � � � � � � С١w?G:m֞y{'[nխ, N.q BtxC[n[~֣Gn駟�TC~'>&lC5ʺwނ)bS4q>@*YMu6lc뮻uܹq\ǔ< <zo?묳*[$jڼ=}vwڇ /p1ի󫯾SN9N:$gӟ|ۢg3j?Cvqٱk]ti$@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ � |++ؠA㏷_-o@W]uuYgٚk"nQO>>l . 6ؠ]eY}X`1bmaC= <yu]>X|gUViYϔ>TpI&K/d={#Go 9|p[l2ho/6uTQ@UUpıc~gwv 'X߾}[#)nf_~J|kI@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@c cr@'tw'xVZiחv b6n8{Glmc=Yg3߷)y5W߿mwyK.>냾 6V]uU*^a]?G}|A{5\pMz768 H6e<64ScrС6x`0@P n~a6m=h}GUPQFuW^ys1kOS}Wn;S /ifW\q-v)؏VLF�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�'@ ٲf:_~`-26iҤĉOz6tS;m6#p_3{g?.b[h|P8o}]{lԩ>p^͞=ۛ(ț3p,3aq>#>}=c駟yf*\olXݾ/~U}Zkӧ 4-(W_?o?zEAex ԩ#!`!C8#/>c5/�ӟkeL5wuWڵk 3 � � � � � � � � � � � � � � � FFwFMfF .kVI7lgyqַo_=Ӗ_~VIO#ntΜ9>΅^hw}۾A6b[3M Oʷ)֓O>i_|-6h [}m5} !m͝ηcgzʗEUF_y%\*U aÆو#_~\1}(pk>q/'@6\zte/)0t(꘹s�| <QU,b6M0as9>X {o}m饗n3hv >:rH}v.]D � � � � � � � � � � � � � � � ЪlU~6@7n]r% B{n͘1K>[vqGnO>ٳ[n 'Nho?;v,A2/ A!O_ݯ{+jf 0իWƭ1{GPYf2i{GfΜi_Цrk�kF*1:BFT ѣ~оT8WZi%QΝ;7VHM9_AJ_zbzEAB}`+hnQp\幑 >~xlѶ۶nk.l#%ou]g^{M<"u]}Pr@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�$@ Ȏ+uϋAqKV_�&L0@Omȑۘ1cl֥Kt+kcs)ӤIn N;uC܍ :�o ֧3<)�W_}7|}SW\ѾogYw ;>8G/ 8Ne"UpQ}. #E୷*T@Ѿ׹K]n|zBAQ= ly:'|*oQ}+j (^PH/J <O^h:6ds67hW_}tM>(kmo6ݶIR_q{i[lԾ[u@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�hHA6n!QM)SFmd]t 9s_~ꫯڢ.jG:tu޽aҜ6! sٴi{vIA6pCr޽{]%P@A mƌŏ@] P[[,~-r>K-u),B7ް_װYfU'ne)S@5(u_mৠUO(>yԩXzM!UWzBuMk]v vKTG}Tʀ>G㏋ѣG1X*hM I έ` Rڏ 6mM`mS}G|ɓ'r:JU?x;m˶H3 � � � � � � � � � � � � � � �� [ǝ"n:(;m>Q#fg!w}Zk|�? (g}>>SOC=d>}G ڐ!Cl7cڨQlh2*{ 6sL$0C/L;wnqitS`7}T6G"%X\ pE { /}z>0g {)8`A>W V}<o9 AEՏ? &~D)`PoXr%(X%wܹPA;SOp$X[W] �>Sڞڤjs|mRFT(<>ڧqȑ6fQZu{;MmK.XcFiA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ZT@-h @5l0nm"ԋ/h<(-~~g)(|mMAtI{QUp$Juf͚U(Ps=*Ȝ<>#Lx+Vа_B!8a�.fETVQ@1z^xm0*ӽ{چ6{&PUPO>>cQ 0>lS_ <Cd@NT6G~t*>!`iWPe^M)xʹ GuDhZ QS;WЩUc?%H~TuIVd׭[bN'@&W^yŷGM~+Wu:V[m5[i|`XAU^tjZt*:*l@_z%{g}׶TV+6mW, s=G;Ύ>h1A� � � � � � � � � � � � � � � �t4Av=N~h<|pd7�Z O8sLQAN|g%xQ yܹs/} +T:;qY! AOk׮ #TBPHPw%S8) iN-vSV}.]OΝK5=LNG_nQK `knS. A1]:Gt8CG"NC2bPoPUo tC/!q?ּ#Yp8#%+c`ɼ( ̨ 7aX3Uw@aXUd>UQ�FULCp\±~hj^Mt)8ih > ӫW}gu*%\bCM<3"� � � � � � � � � � � � � � � �A@a/P3ϴ:&MdGnO_>^)@V2+hU2= s>}! 駟+X%?!Z5.V2-]Qdȅ<J~QB_C� XW]scPpE8�cH !�l\az?_HF<c?y.!mC:EGh:"GmR ACT[uM>M[ʷQp. }K4njXA_~y߆Gg̘a{キs=׿0]mN@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@h{ ЎvqG2e=#t @jv2+ @:tN̅vn1= !_k\r91K@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� tX DK/%\ҶfOL  � �W`L~껍jީS'' [o=7n͞=ղ, � � � � � � � � � � � � � � � l]Dh /M8f͚AΝ;f#� � oO +`z]tEv%ZkewuW'"� � � � � � � � � � � � � � � �9@ @[nzve7o^ @�@�r |٫{-{iO= 86h#;O?mtA@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@0G�[{믷o~ؗ_~  � �Q7͵V Hq,ravUWka~{X5 � � � � � � � � � � � � � � � lys@` [nm̙!4 � �-!0k7[ׯ%VmOmM6>o5"� � � � � � � � � � � � � � � � @ V@gtT4iw}ۇ~Q)7 � �u9Ӭӧʗ^zi0a]{v7ڠAlĉu&+G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ZB@-6@(0|p뮻lƌ6rH/Nd�@�@�j"@{uZյJn;{m7vuW{Z5Ml@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�F@,Xs5mڴi"` I� � �P ~j^K,a_nɓ'۠Akid}@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ � sT+лwo2e=Ǝkg}vdy@�@�V`֬2-Ҟz)zmwvz0> � � � � � � � � � � � � � � � &&vD} îjo~cƍA\>Yr� � @ ̜iַo n7袋E]d~=6h ?~| M!� � � � � � � � � � � � � � � � :?F�*:udsM4:t=#U@�@� ٯ_63f=䓶;nf[mk;@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�څ� n$}ѣGۣ>j+9N97o^9@�@�@1{R -{v]w?o]|-,@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�l PGe]&Mdzxf̘Q-j@�@�ڟY_r9ҵg?~6vX{Wx@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@U٪l:u?~a={v_ � � PB`oFv@q=O{^u[s5γBPBQ � � � � � � � � � � � � � � � @ 2TX}mڴi>(qlu׵LB�@�@� (dϞfK.1=n>zvaنnh/B  � � � � � � � � � � � � � � � АlB@@ݺuO<qҥ:v1؜9s�B�@�@�2 ٷod ,`oO>lgq͛7M@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�hdA6!m V_}u:uuYvy٠AC@�@�J(d~%&tQk{5ʞ~(A@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@H{ @YΝ;`>޲v&lb<Le� � @G5@~ڵwq裏C O>پx6@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� dQ!r-gǏSڻkk~b@�@�6/0sY߾m>5A{A rذac|;@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�hN@ 1R`ֳz;<vg_|ѐ%Q � �YfvtbGqM>Yd W͝;me"� � � � � � � � � � � � � � � @ d}$-йsgw}mƌo Y(:6G�@�kln篼v]w;묳lС6mڴc: � � � � � � � � � � � � � � � PAք @k |;߱N:ɞy~`ᄏ 2&Nؚb � �Yl_t`N'xzmF#<fϞB@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@m m/R�cmJ+[omÇ[oRLB�@�@̜M^m?ywNV\qEϷ.lw}w7@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ |@{Xc5=֫W/ll׷;Sf|!� � 5{w@ SO*bntAge] #� � � � � � � � � � � � � � � � tmvf@�ڨСCo~_~5j{챶[\lxw|׉'ѣ#h믿>` mM6itF_9ƬO>v 7C]t3&;j%>hIY{;~_dܹskG}Ԟ|I?mW6] ͞= 2Į&uN9ѣGL}n2MY,ߩS'[xmȑ>",R2m6i$裏$l2O?m\pAqjN<8}6Yfs6X<ikǸSo>}ꫦꪫڰa|d|YgirJ6lc3f̰s=7f�p@i?^~&˭J|_r%>?]vņ}O>W_Famݺu+{'o]wݏ{gLv}nرz59t>JK+USmz[Jw޽m5״'{}59t-п0fr[~c2Ք-+/eWMP/Mf_PYEYӖO?}OuǬVk:Fܗ#<Ҵoԩ^8W߸^wSknRDq%T. uMrdMNCѾS}aUsuNc_|a]w=#<ڀ>9^?,T9 ^u[.˝+iiҒ=6Nuwi5K6V=dCKsI\zR?ŋyϡK/o>C+(ֲګ=9c٥^ZjR_}s9v7{'Զ9% ԋsof\<4j 6Kչ묳ox_\}owN)gK7Ys-j}(uծ~gk;TOΚ5+vm7S /KWw_C顯kx |WTu;~3?O?ߋ}Ѿ==6F.M^(y ~gofj[o.*v7?Mݑl+3 ru`a~lh[q_Ms;#5mxrF+Ӫ=+$/qgdtlk5ׅ!.v)wN/еiҶ']kJ�3\~ƫYׄZq\z},^?|yzKor1:Sy\0dB >m|m~e*K,ЪʝT]y\1͹Rrx1uP;ζvc*.u^RK-j_k)]#C]{ >}_e)s쓴eԽr@ں6/j]whiGygg &bI둼w|9,}WZMxw;7g9&x Luܦk5N(uYBYymK>w-QG4}fK[χ5Tj_;沴)]E\C[v_VI^k^[WiaqӖ<׭bTq-|H0d,׆f6c􅾮VtA~[aT^|<WN5B€-Y{ jJm?{HxN{ߥKLeT{]kF5OYkzZGWsu!t믿fF7mX\iϙriz?<.㛼FKKJsjIsmά\$?|ϊ*=՞?2� � � � �{yfݎ; !�(p\�Ȃt %W_]7o^#&4!&Lp(CPs@,GXo~a =储cl*@Aw<N-NmM={ky+޻9__\v mӽ[plGC=l]pv ? .N/v\0˂{pw܃p~{Xg]w2+BAWO{ {N]cO %ނ ZQp75 e{_+.+.0dQp/8܋j0gΜ FYX|r믿~AjnN)Eo& Ҷ=\pA ! Xp/Ӭ[oC(ҵ ӯi% 8i .z .$6ME{qN-})?6|{X'h\s==أCԗQ^ Ԭs[|YuN.ߏrw5oqO.Hߦ{^n/@@noR^iysiei~uJ{齰\ ,_Nn\ǧCe]U:uT_n%.OUyʼ XuYq {Erf?ur|j?~_|RrI[g)5>vAd*IH}|/_~Yp/i*w.|+o\l䩛܋hoS�g.P]~|@x^߽[Ϛ!|I+7Yʁܺc'aHUT�~{.rW}R[<B_R]rv%+5jй졇*@8x׽ǻ@?υ#o}sIX.m=sO-CPwk^ԹPJJ4>$s~8_h^+B;ctlv 鷧k^V]lP~R:v;ATp8Lvi=Iaӹ8/Ny=ꨣ4A{amsN[}Źz鱉p˝_jUMۺuʳQvږ.lEmWȾ8޽AW9u! jnn)SԦʋ.;]tQ_<~ۡ e vn}LE�(Χs]y߰uG?odzW6b뗼|{=lhqjˍjG,FO[Òm٬5y(겴'kuCB-}#<TY\PҲ3C:jʅB{uH܏{ݏFS-SL)CֵTrv["uGY'RXvu,= k_CRWm_uV[m}8!OxMSG~>,e.>RF' e#kYw(iGy)͡ ۊѵetܪ-q~:螋VOmh;JCL ˲_r.GDiGùB>})Ͻm(o[ꗵ=Tne=?e9沴)PʕAMKj&z\kmt;Ҕ< ^]YG\ʡ\ݮixQBxHcpæn. d{i-J,?(w5k_R'RrYMO<ϊd-גmuE%-vڑڱs !<e2c8v3riu<Ir<Fs̅s53M3~Se Kg+}@�@�@�@�@2`\wgd* Њz zv(_+j>!K�-'5ۤI| B+F _ ɤ�u*lW[p/tN\ţ K* FNS_(LNdw^Kz7GgnL+@ƕ'?;N}6PN@ye qa]ʛ&&;Bg}+e)إwNLR]Bkر>I 3*Gk!d.Lv 3bĈi1cߦS9Q%EP&]w/xNQGK>/w`Op_u]W|0lCTZ�p?xd3vӴlV+mS/ W_FzQ@isOj�4g{׋zt^)*ͺ:PSݢ+äB|,%婳?_i^i;4 l&[X}^{O8iZ(kݤeH#~*௺02,&W-7Yˁ6vIJ ާ#G!q(Jyr-ѩӒ52=9-uhiEFZuYe}mjuO0EgK'9>&Yʖå^zɗ=ͣO2ne\3dj[*uq/׋x =.V]uUUj (_~yyU8J_,JNSWYջNOutrZ-}O=z.>tmԲF*(p{%<iR;~ a;J dx^.sI܅c.me6Ӗp<׺~ u`k8auzl&YwԢr]6,YM%8oY m$Gsi`J8ק_=-w\K/,ku^W7g</+y S}S.dC V*Z&yuθ*(uvsc8ԫ]#~O{W^/!>z#@qBKv:^v*ѲtuՖjT:Ӕ޴e.>SF'M]u֙}^]ۊiY<B=V>8#`:'a*ge9{Ӵݴ<O-xJw{͵{Xq;o5_2s~J{emS&Je0MO}Z[kov^%ϴ0=OZi;'y\Ӗd=Xn&t.#:O*xz貤'ax|ں/k%ub~v`<o}'KS&±ֺީTeh'^kpHd[Q85D21;}<zN^J紼y,竼O(iΟ{6gVҙ5_icQۢC�@�@�@�@�A( С bW_}_6L\ sjz:E- *��@�IDAT\1h1.@RqhI"=tX;t~6kp|4KTm6p m2\0,={4T[r18VYe?k Ip9s Bh[ouT6Zq ]ЌRҘuviը=ߏ6mZ.Dߔv=lx�W7 4 0SZ܃vAI<ON;1?[r[.@`~|)֭[x~80_!{@:,?4iaePdMd}ܹ|m2/xv/Xm5!_[νLnsA?5yq:\0Q<OO ۋ/#7PN8O!>tPU4_ܩK<e^ee5״78N|J{ms/}iyꬼ寔ꨟ>/.@ ~ؽj.pv{9c.ƫ_jZ84\nҴRНx6l05\ q?c'K9t$nRfmf+Uwٳgi mZ3.M6$}_@ryW+l!m{+WԴ\v@S7_~LĴTR-Ϲ$O=~5yJeMLRd=\sۊSqDʏ YCoo.xSq\sBn qQj.dx뭷W]*x\ؗ`HDiZ}!l''K_Lw^$Դj~6psm됞Яu_vҢ}XIbug}\X{衇\hzXGIu jvXqӟ|/Ogyy+O_ n 9MLmY]m .gúu/9 '|\h4xx[a8n#q՜:B\#Lzɲ~eCiz_uTrS-9Z[G(C|󖛖~Ad9h gy' 4t/J ׸<J˅.K2/UsgϙY i)ѣ"¢_|:[<CY*0_%Ru'=V_C]A.gQ 4kN4iYՅc4oD;T i(5TeN˗OK퓼evҦ'Y׆}֪P;>kHuB{uG ]rZS#%:C?$55;_S.’~r:i ZorLKstWQj~'ttVRyWnݥZ1 ;%P-e%xuHJ'KyKN ͵򖙐WHk0q׵6¶4 󨟜S)Ֆq~MҰ~Re8xJu_zKi,/!__ w7ov^)L~ȯvҖ2HsoS׸U2]Q~HkkI-193⛵=_ifm[*Z_Ƈ4UjsoyΟJg|ڶ֣.>?$8_@�@�@�@�@! @ E.,KCW^yx6fsDhW]uUD:DH/_;rJ_[ncs|i_L-zq}G~nvmMq>ң5~v2q Jtso<W]tE̚5ˎ?x}vwޱ;rOg PP/s;ܹ/qGm%\׿__4hU/?߲ >wZ̙3ko)S>J r!øriW@uz5m쮻:Qm(f ·qK,D1ĉVC<N.eaZiKuVT#G"MSN 6WJu]^ (թNKS76ߎ9?[ӲZ)tQ=;_5]'y~1]w:%t܆~_2_mY>O/3~c+k8ΪgT裏ǖϪ<+ "cퟸpiyMﺦ/MZvrTJKrݚSӜtyVJ%Ӓ5!mSiZK=%\륓O>O 5\JӚ^֍@neI/*ҴR Kԓa{_<g?,GN({ܸqf  [a6xbRX" /(1W3MTKMǾRr*9GZNKVK4muݗ]+9�jj>cM&+P_kM-NS}N׿ wq^j(Хи !5X#]r8M[mݑ̔L`Α՞)W^lMNevYiyl.aUVM~jQ:J5_jZyړyې}#=^zuu52mQ{QVg_R.νtP?~:߇%0T ~?Ci|:[p\Ws;R+M ˫{i8f?'9/9-q^x=׸ i wk [S\U'}OMO\w;T泶4e*M+Qnzoa|~c2/suǮW_ԪE[ \J7 0\?˽rկT0M\O!< \OO -oή^)rb<,0O5=k%OK\Gq^n0>ԑpnMZO!Y!_iɻ[R6 z$}ϫre65~reB˶띐ז Jۯ1 JҴRԲLu~vV-FZVҞqsrOB?5_6g-[p9,Unz[7@�@�@�@�@�Z |s翖kd] @ӧ8^FN8E/+`wrCrh[uYǿ<~? /_halv󿂮L6v}wS?t ʨ z9TdĈ>PEnv[ox  ˘ �(:'{mm1w=|!S`o0evuFVx0/}h*@AѴDMק_q<0:+`unu(^U:RO~RR\XOƕK)7M\~`< 2kJo +`W_}˷)È@QK~ryxZ^{+nQʽPWq?sTSitkjӤǎkx%R(Guz\ʟh.GmӲZ<ةiȷ^ZOv �2у!|r{2_԰~)}&_Q~Rg}Q X^qiKB d>P�rG.ƅ~ia_n Qu>W?|=̓\ɻ^-fݕ´G}'C[nIR]ZܸYgI?n-&*ag*Mf5nq[wJ4RB\P<* ب@3<L7o^qӺw i'43c[?NAt`„ ԋ8.NP`_ŤT+J1P V}9rf-U2 i,5^ZڶuHt+9<p@_jH+ תkp->{W\q0$lT4C -ч0ku1M۴ouG2򐧟].]<_yYW*7~FN[wDhTjY湎VnZ^jSMx(U>oՕ~Aw7[߸]6N:8Ԫ</%pHc5*mPtնtUϱڸ\:3fɓW;t<-˽J$=<A! PNnS?Zg2t{%PG}O;4SkvL}RiZC̅~}G5uS2ZF?ҶLSiZRj]@cNtTN]8tSTRY4-l+K Ԣ_)mmo[=4~i_x8y̅r\憛;2o3]=C=HZxd.wT뚦|e0xZZ:|#c~:GZܭ 8MOqxJYZJJ;-mXi'K֠|Yud-p[މ[i8eu1 ^MҴ}csfz#f)+iW4Ӝ?4mj[jϟiAx ۥ� � � � �T-�Y㎅>t @[p\@{*ق{^l-̞=-g#P&'mF{@_>ޥ^p Zoԩ~ڂ^܋{Ѹ^@*˹,~ .p wf|C{ lHATwq=nɯ/{Ww8{8 w߽^�4ƃi7S@kn_[^. K.dk,O>)@t]*6Y:%K^˹Yyt՗]=l׫gW.`-6qLs5}+<shpGY|߽sI,b~h?}X*.8xq.|˕SO2QTW^.~B7d?k46~Pp/NI(k|دW]uUq|r(Zg wu򗿜/ʼnn`eu%u͠Mr\&J~ e*Nr- gq^+r/S Czb܀ <;ģ;YՔ?՗rիOtͨq+R/qQ qS7u>Jot<t͏w?BV_*_i4zҔ.g{2pJ%~߫FmTxyӒ&qbʥ]z8 8qb]P}.O&<2^G|kZaq{4iZ-Ϲ$k=Tm˝Cܦs .mC@tk }Y]綴n.oqYdݯ+^>uiŰ\{O\j{.HpXWS(> =1lQ*s֨ӛ;C-oڶNz_KӮRP6T۷dy-WgMS_m2PJ*+ ~!u4x.յZkG*3q[wm-3?zc;m+nC뚽uw.7Y뎬״\Ge-7-VM~BBa-[LXwO{2iiO y-n+uY:!uu9jy:UB{DiE0w?S|EHmI\=L_8̨kG`L /,xo~0g9iJyύnWf%u ]%0Ojg"t~L}6 X8ΰ͖:^KѪU~]�}Zke.ZcTSFRֲ> #コڊY<+S_|/,Ǥq8 ~X7xcOUUt]],ܳ3&ԪR[O,>46T{?\*oe)ijOYor͵)3gzEme ۯvk;JjL+q5OUsu{s.Muh?sl?+_͕0~ u|~k imުNL̻oT/ټYD86zQ,C;,=Z;fA8Bs Lu{{W9-oh6w<yP?kso<fW@�@�@�@�@�F1J�  t~򓟘 fӦM3⹹ͽf.`& "@_|-^t*\]wv'uqXT}6,?=`eEuӯC[n|m|Z 끗_~٦Lq0 dlꫯ̽h쳏?N_w#}=�~]wu^/?O{4Y_@ PQp0pܤq~սd.PG?]wնzk{힊uv-.ӯS h{/7RD>ávǛQ`Po{/뱇R1{6 tR 8k<Z^5qA*7Yiy6MZ bjkj?ξ\j. \.չ�0*JyVtV^<_\P:b=HR{2_R29F}8Eɓ} g.P>+\sM?騣2ij:R^R(g{ue-PTZ۽`~d8_7E0|ɼJKfR@2 :G螄Go?0t@gMJم4CֺQv dksORVzy%Yg"n~.ﻗ}_JuL]>w~=6f?ZTgԋy $۷z-sm„ 6bĈ&Iv_| uUg_Ҙ5r^ Ҵ5_u bC uj.q/͙ Y'Vd. _7tNewaO?m7x_4]#KIri;e=GvG=rin|FOSwr\K:J۪Wխ[9Һ_=vYjm(Z^Wbg/P6c&j_)!q?{~ ?a\}\Iu7t>:.MݮQ~r繖Õo�@ދT&\A OѺGZ%]'ՖQ;mzkUw(y])i6^944OcR9J[sߐu_2ۍ-WY[oo[-4/KtK淖߳Z;g;R;e&OsT뚥|G%ϴhnw?{wG)o7jԨ:KOiSHKsu=_siLNZ'fiVo'rZ&rvS.͍c:LYPykYިGYJsZ,ڜZ?Kv~že � � � � 113D�Æ 3SP8.7_d͹jCC .ӼA@ҷ>r;P^,|@G gyf̘aGy7lK.{'8pEѧv߷3xDҬzCR_pEr-.O/Ԅ=>}ֽ{w?@�GX0)tί3WӋ׿L ׹?kwy@_zZ /k5BP@!�E/71e<)OG!ҩjgq[Ç^\AGR:i{z`2`N0ݯUW&Dp]/5YO $ z!(yhC_/ ¸ZX)ȼ:tUЪr]w28T<U@𩧞O.;\MuY)ȌBYRgeZסӟzli? U?KݤF#jQ֭St/nܹ%xPWYe#x;U՜랇^>裋mӏV=S g)VXԍkAV[meWKuy%ROi<7ףvzeVpow]y^^:t?w+.WK,|BhoΗɜ#J)Icuz^i-^4uv+dKu,ߔ^.L6 +aGnH\Cqio5uG2&iIvr.rzjˍ֟PiI:W3=[-S:,Gt O{2O׿u9vg/ǦrOR{Le˗w}MLL>}VQؿyݮQ:NKū=]*~l!ϼ矼ǫC9Yg8٩َIog>EM]<x_^]x9/�v:D=IsLP]6dGD6ժ-\ 6G{e[Ѽq5\_1W)1oW+gWkިJmj4IH[^d,W>5Fq0p@#_L,?J0~RzviӪ։Yځd>EUzJ~ijDNkZ;.cdMKs LeKq{.kd_e)+WZW\e9VjsVj}̒/Y]5x= #� � � � � dY? qS03g7m-yvO2@kL:f%%0QfgzU=Ę0AsE k[n>qE[^9rM>vyg*wiJ|p@/!@e%M}hc 7Ag?m>URo| x6@>S@'=(:ԋ`6J:=4:a„ZtQ/)y:PB])d:,KYѣGZA7z[mnjcuQL2eiaĽW\qEݻ zM-V;7 G?!S_i1HJu*Ӧ}>,5m>xtՔz4inn<uVwY_siiY&=<@kE3 K=Yn͗g|u>x7*թR>A޴vK+g>6iPAT" ("*6"( rbobW,+,X@RDTQ@DAxOldl瓝3ߙ9sMmBvP_?\N_0Yҥz^n͛n[#պQۨ�+Vvٷ~jqS[:te{FR3[\HAz/]B:ctozvՋ.{TL1* 9),Lx%ӶY dO>dTںի̢%bQjwuYvDd$S[wz$S^͓6b:=$;獶L_%ϟQɜ7ꖉD=^&tړi^{mJuda_'lUB' bw,Yb}YxrƆq?Jޘ*Ċ=zT^X '^7ntw,@61D$s4eFݡ2-QSx:\~wpD]-jkj6B_.o)|;[ Ю$o5?._a?__QA\y}Z;yɶ=g2Qtd5֕ pTnH5|7)d°.k*é9~+ySmf؄ZL^˛pD~(;bm}o3Ud_˔l?!œ1{f&\-\I~%L^?Z_~dۜ8nٺ_x]ax@�@�@�@�@ AfCu"@?wnǏw<n:u;"Hv l~rԩn3m۶u}-�B_L _ +-gbӣGꪫ\;&,zK/jԨa?=䓶i&f_ufmlGO?FG2� PP{bᑋ{>zk뮻죏>r[M6z(O;$zB|Vnؿ/B7c'=Q)ԩMj*7Gazp{ȏ 5ʞJhsqRyA!~SK_l_V-j;yg;؋/ooVYfcoF۷a}yb/o~?;QFYaʤu* aРAnwyr-~SWۮjcƌguΨG' 쳏{/\ e,$~|VիW:|~5yjӫ+:Mի~PB/oOœ+d8Sg{~ٰAa/^TбU_nLYA믦�AA&v~$Z>4/޺c7^veqs~p?ݲ$$.h]~uR˗SO=0j)26@9v~㝗y .hm ?u[7}}}B( [fRǖ3v~ҹSOj~_}?{oM <sܗFаwҏ'P}iE H֏V__tD@^,uER߶QH+ovf2+?rvx_NOdVuz wآ-}}e-kxbu_~oӯp?2i9?xϴhj_o;vx/MH>ĖU]aڈv~x^u/2}/ys#״龎JIL- /:,|x85~Y9~A:Ipߟg_-'Ӱ_6v|:= }Jf-ZgaU7sͳ;͛77}\]gO o-H%ZwDp*_G8.qOuPxɔ)<d}S>{c=ֽU׫?&}O'hu'Ʊ]{j~ɖ'|٨;TTGo2t~D~}>Gͯ߉_k]񎿦=]ߒ+OxtB?D}h/JyKV>1I2䷣u%4w~ϯjmv.m{Τ[3麦r~w>7.YO-[X}�.k菏':N c+?_~\}__Pj;0c tT_㫌_9l.KY{O<ӎ:)*S*]:!2}Nat^s77&{u׏7:]~dۜ:n?揽5.ܥs/0 � � � � uΌu'A�%ՑGc*2G/G"% sˡ/rt#GºqAHG$K lǍ (].TtNocdٲe8m7DW ,+@HժU##?ݤ -3`nW_uN;4<BN$t_&uӇ_s5[ .t q5PeD+F:vQ Nm.r}79|p0|ihyV\ԩ߰aɓ:駟h+sm^ glAX]$ a䭷ފtYgyA+'isԆKgy *w}׍9sfI~7n؍+s_wy_m x02'O? ;F?-nݺĉ#gyfDmMu~? .t:wztt_t|"jwknZei)|hegq+O~*5HaH 2Z.k_\x?UP-G�HSN9ϺY_9/˂ ͕#TdW#F|믻#LhWO3?#M4qT;rg\eS?re־%%Rt?y:v:J|-sOn Y]t_-^7.D/ݻ~^vtu:?^YfxՅIq OAAdx݉ ^Wulb._”De׶ʞyu~vyH-2p0hɴ52~Ý/φG<"[mU\w侥s/I,>t־}HҜDm.@-]TV{S{'_%S/{]辮p vI&Esdu=N_Nvϳ}RqVR5+:=Nm]TK]>:|_&}Euv?2e /ʨk1(?:a?96ϳ^n^ӇtTt=g]%ًN?M:uʗkt^Grބ4mt'alҹO2{ _ԷC qu^WJKuuAvtH+=.c_{[w^$eCdIޏTT_Qv T^_cxoG%yGݴso5w ~3~k(11IU kYwW>괝pSGx=gZ ~*N;EL^$5F~{ڮߑGFg-yS%>=9VSKKK5s&6]s0v_vEZ8y<J;,sFHJ:6RuM6| ֗SGy+ .W*IPO8{jݟ@'z+:1v`Ǧ0> ѤsΦ_I2z'W,};,ij TktTӹgz˨iZ:5f=:w$֓N]36g:-SOY_?h[t � � � � @.o21JV�%T`֬YK.ą GuTDpWBwb#P(/`#[Gzٳg$W_}]>?\^=lԠA#r aJ P hڮQPO<fx@_Vbi<Һ }"/j#u/h9 _ru36`DT`mU R[GajN_\jh?]a{j'(t'Ľ> "՞Pu +lժ;74 r-;aN<A*_TJ ^8TTCr*[-%R}876<җI@i&ҫW/zb xxY_rUʮy{gD5jDn={۞jG}oI_~76;>ڎ/#llnV]v4 T_,TΕiӦEw_m^7n9(iӦ.l.:c̀:Ú5k.sS[׋/,VN=nx^Z6YvyA_T^o'`P_? ʢ 2 tL+~uE]X(@?X]KYur5ˬ4k6rqFqV�a5ix~?oӭ_}_]/ΫDu_L=o9]wA~#U/h>/)#SO=5@u%t}@c/>b_Dե[t92;Pp&_u=uT谾/yfsEi*ێJ^ l=}wMto5j3e֗q20ov?9߾pPR]۪۵kڥ1"Ll]^LP jN{pHjƌ;, ݷ/̨\{×A }YyRq裏6ӾdN^L鴭(}~O]ksPWu^x{;^)W}]'%>׈^;RvH"/枓lݑ{s&ۈ#ًNy)#<״JV~6vRLl?Q_{/~ܧǾ_j{R&Sƻ>Y{Z_:.Kuu<R9/PW287c= Ϧxߺ~1.کGtҥKH~dnW'㑟o]&:o'GLa__܆^N/n~D#'{5a<zR_%V@qdT]QM}{uթ<yĞzm\慎pP~>{^5a讥lR9+-;ۦNVij~j;Q[<k.d\AmJ~A͓L/k_ku;/g:d4cluҩp6eg>yޜ_j^|ő_~Eu]IL8{jݟݒR{{ EDϾ${Φ?s"W_el;,{vkqL5Dd*:Q?v_.z8SiLjtcrޯLuQ:O?6Sq3*=/ � � � � PTw{5Æedu(-6f 4arǂWdJv=HV믿ZA >d?7LOd 0gAlzFcm-Є'?vZS T`M[x* ,}~m?|X݂/XJouG�@#i@ף,? nWV'h"[q͍-ynɂ -|݂Au~Q��@�IDATOdt2Y.YĝQ&m_K. Ȃ0<m\&g̙cj^IY N ,tm0L:鼖Vz$|:.&S=2YfUAWoz dn,I^j=Ymmc-^~ LmSUӗ-M׮ x?`ɨ@qh!0PY *S}MW^Gfr+tړY=a9EYLB}_[޿ޛ,-|oL渗ArCin$sz究riY"?f͚$e|A@͟?&QdLWfo\b_OWta3EUk^aSa*uWY7WM&E}l=PZ,1!2yN{̕k_=W sUtۜv0 � � � � P, G}@�POrں z ~ۂ_ٵSO=vy.;C [AnE�'@Q){Y̚6 ,̖YK >3/+ȓ]@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ /E® �9)P^=lܹ~g :uXnlذavڜ,;B�@�(Ax [rQ2VʦMڤIkoѽ./ʘ� � � � � � � � � � � � � � � � @ k4hk3)bUTN8N=T;|yrz(W\qn>.O?ep�G|}6y +W֬1׶,Z}+cӦM6x`?G?m4kٲe9 � � � � � � � � � � ];}n#� � � � �I $!�z뭭gϞ0Cs=gzժU˅Cjz֭3Yօ@4jt@Pa6lX) V[\( @QQ(ب4Ρ Ⱥu؍7rsMt|PYge'|r-v=غuW^VB{Fַo_kРA3 @�@�@�@�@�@�@�@�@�@� !;biE�@�@�@�@�2+P.tZePL(kgv/͟?5jd=zp7.ko)>L̵BJ1�y?p駛oDG1}]~6b߿8pM0.R8+sb!� � � � � � � � � � � � � � � P*ʗʽb@�*{ڍ7h~M<ٺtbO<5iZje~-XF�@�ȖEfek7 Rm'Nh+VnݺY nGyZha}Q&7ɺ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ̱Bq@�/=c/ǛyV~}7<p@[p> � @Pdݺezmʔ)6x`=z ׯ)(.V^]"#� � � � � � � � � � � � � � � @AA$t@ʗ/ot=裶d{Yfv뭷.B!8y@�@6m2{zl7]r駟ns̱/ dsε;φ ƍKw,� � � � � � � � � � � � � � � �9*@d�'PbE;#'tov7P6mmc[q � �O ,Grv 7ٳ]vZFl]wC=9[reIEʎ� � � � � � � � � � � � � � � �! C "�%IRJֹsg<xo[˖-v1͛7̙3KnQV@�@�/{zR\sNN:6d<y)~„ ֡C1b5mz뭜+3B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�L݌%@�P(Ga?O6n8;Gf͚YÆ /?"HΕ!� �/hY}鯃%sKM6ڋ/hvZZuzm˗/ϭS@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�HI Ȕ} *l<.㎳#GZvVZvom֭ � �Q+V>u YӬbżyVN>d뮳 ;`F&MثZw=@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ]{4lXz@�2)0k,ИiӦٶnkGy}֥K^z&7Ǻp?hvy1.51ìSボRƼx�eW{<@mkVYfmhfY߾fдJ⯇)%OvO> \l)(﷝vک%F�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ Y>�e[`6j( M06md۷w c=6{1ENשcOf_B.l0ʖ�G:mr Sy*\9O=]xayyV ߿7.l[n=C֣Gs � � � � � � � � � � � � � � �eD AS`7@�2*Pn]ׯ/?ojղX I&v|`6l(Jv&Duf+)1C:Llu @i(-GȤ@,ש�ui[o7<åCE6vX{׬f͚rJٳu5@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ CD@� lvֽ{wPQGeF;Z q ^~-b N &2T%vݬuDs0 ʢ�GY<sAdVB|%fժş)%_cNR۶{ܚ5klʔ) a" � � � � � � � � � � � � � � �dW v@ T  ҅hg϶9s_o?DžBkn>}z? \<͛5l ;t @(Ǟ=/жmiȋ/N<SK@JKl…vgڵk]M6hѢ|wk.]O?tF"� � � � � � � � � � � � � � � @̾1[@�J@ O2cǎe˖СCm=Zjek׶:^y[reW ]=*1n=8@X' ȍ<<kv1<.;أ>jfͲߦNj{챇 0"Ht'Md ˗ۉ'GqN � � � � � � � � � � � � � � � @6�K(w{ÆrE,� }|oѣmʔ)V|yk$yѲeK+W\ ,-$[͚}e�Pp W@}lcvmzV٢Ef4Ɣ_8 ^N&MXӦMm.�RmK/㎲Þ"� � � � � � � � � � � � � � � #s@ (uvu٤Ilҥ6dmlРAnZZO>6tPBSvfX~} AbE Γx�? #`V~m.{E2eoLnlɒ%vWO?dZr>R"6m;FUc@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Y\$2U^ӰaZ#A�(L>~m{뭷\PfyGapUT$e.}oqV`ŋj8@�XXu7u' 8Xluɾ0^J7mwl:#@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ;峳Z֊� P(ӪU+>_^~ekӦKֱcG^}ٳ2WwFѮ|iۖ( W#. ʨHk@!nWZ֯_o)}ڵv1_3 � � � � � � � � � � � � � � � - %z@�m{Cټy;pa4\s5nիggy/Det 첋Af ]~> _# Sʦ-;gH[o9sF$t6l?|2 @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�!P.tZqiذL �vL2ƌc}'.Ev衇ZNCVJNQf逸:l& @͖.5^>;�(J,0T͆ )NB`ֲ̙e˸!Dzs@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Ȱ�Aeu �XjM0B*򫯾 *B! ~qKᅴYj;fq"@I(iGf[3Zm&ƍE_=X9rdoƍ–[ni} c" � � � � � � � � � � � � � � �N|gi@�2+Z׮]mРA6k,A6x`Сm֥K8pM66mڔB Tj{Mr(e쀲;hU<!,+xlI'd;G!ûc9h@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ "Auv Y �y͛gcǎu~Vu9;iӦV\ ,ekoff+Vի>֬Ycׯ 6} op\d@T*UZ炈*V-ҪT6۸`vWnC+T~�/ [r{j*WhWn믿Luֹu}Ug$D[5bſaf+Ud[l^ j+z7{Q~x3=ky: #l2[`{|wd8CTu{eŊ̓wHp.pwuOT߮jᄏ{ԩS{caV)Yvܹ6a7n3ƵU:X݉'hÇw}z^}ړ:wU>z?vʦv 龞W+WpW]}]^@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�L )Iփ� P %9s?||rS�A}^ vKrФBz/^l?~xX `),& h4RyM[ڐ!3 wH#(pR!D>R!CNH=첋ծ]jժO`dX 0ץK9΅GCח57vZip-A MT}>+ҴgmegipN'}2} S~(Vݓb5jpAdY2 (D//5_0=o5~{m8QR8N׌k'hk={=H϶pBwkVׯo͛7-ZDdR.Nyǜ9sܹHU_9UOu}x/vp8 ~ړd^u~{A}^~t � � � � � � � � � � � � � � �'@d~*C�( m>} T8ĉmʕ.cǎAA@{] ^xƌct!0 (̝;=͛g ,p�NP JT(4QBpװ2&Oi�,W/áx)nݺGÆ MF{ႋea-Y$zs_}]GlpmVC¡V+�LaaEe( AS@{~XA><3,w9uu]51c;tLĨGӦM]0A鞔jda|Rݠ?>0J=4Nλ:؁N\:V@uÏtCuVS;P<{ Vza 4p~=|Kc^ǾE؇TpSxzzԬYJ� � � � � � � � � � � � � � � P,[ǛE�ʔB>s{?t!. ;AG TS*A6}GyĪUf>r)檐9}6k,ꫯcҥL Q|ׯwm7C35jHiߋmG3˅#)$IX>ou >RBn ңYf֢E s=MtڵkݹW/^-r ER@(~8tP׾GzeO@!>VaaPN?O?EC֯_-L*U\@Bի'â+f + 5j{|gVBkٲ Yl߾~..+OcjGL6FRhTot͎>h;CEN6NP=v]E.\jY8n!>0=@(WeN`C!UNu^W뮮W_ڠ}:sLj5!� � � � � � � � � � � � � � �"@d ʁ� uC*I| <Z|UZΤPHDH׸qc={v:u܅,FGfa`ʕ駟N 1D";XؤIV S?͛7Ͼc̙.$Rі[ngDb5KXf_t͝;ם+K!RU\مD),JzԩS'WQymK3c),La>�m.8aÆ.WCA "ˮO? .O_׮]]%Z!o顐H7 ӧvae2@:gk׵po̙_WOz�At^mo`OWٲeѝi\ߨQ#kXR:@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�'@d;f@ C `1c 0a 短J*[C Qo c8/_n&K2 V~G6i$5kmڴvygVVZYͭ~V\9.k׮ʾ PN +OM6mpEKRWXu> vU:{Mk׮Bcu/) lذA*Raa UxX(L 0V@6mꂂ -!Cl' ^zI'd[.shi9"N;4۷ ̡U/tPի~(\>>.} Zϟph= ~NkCzmHӷgI@�@�@�@�@�@�@�@�@�@�@�@�@�@�@(, e� PbfϞ!'N!UR%`Hp SO@|gJ0_~1c{gǏ7}Dž *Ru&X Z`ƍ.OA` Rp0N:afڵ3ѕ=}.<t.VzkWoPhW藦!eL3=0(@-g S-[ի2lz!{L ~ݻr!.4c(|guK.ݻe]ΟҼ߅7MS{ WZ:*U!~G5 Y- !uBDPh7Mj+w^nk ȫx:@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� 27@�QB`H(qX ٺ om&4R@ {cڴi.<pC=:v K~'w(S \ ڵQV-?K_)SD Zb74hZha{キ }K}x\,i?36c S InvsA0 әv뭷}}Z~LA~eShСvwsv[ffɓ'`hD~Њ+P>*+=vi #z^ <y`8<M� � � � � � � � � � � � � � � P<A;[E�(m۶u>_?;=.ϯG >Fa/uZ.]쨣:ȶv[?;R"pB{wl6vX[f 9Nr@)2gΜi~}Gc&M>B%Qvvɒ%.xԩǧ~j Uq˖-}֮];ׯYfڷV? 08_{HB}wꫯvAs}oL+w„ ʕ+g52{ѦMwj {:<i ߺ]A (U@ڵkF֡C@Z9ֆX@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ % Sbf@�,afm쯿JAap6m;.r{mȐ!`{wlѕ?cƌW^yFi 9\($A}.̝;qo˖-v{*(}ݗ>. ~O4>cn:kܸr!oJ,ӧO7Ξ=.bꪫjժ%sgXj :믿wmgyfX|Vs?*Qa LCjժ_!2I(?w!>zҥN;YN?ԩژ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@  Qc@�2)0uTWX,),sαSO=՚6mG/ }w矷^{͝3r͍cڵ6vX{뭷c;A<Wkrr, '� &ȍ7#<Ҏ:(kժU^~|vM7{'aÆE[5#_{.DNnj*{5x �=*Uy �V$%]`֬Yîwڵu͝%})? � � � � � � � � � � � � � � KAѠ, �9-0h ͇<*oӦM2WRj֬iu1!}7j*k۶~vI'Yjբ3@X`ʕ /c=f|veY.]³1\ zW6Aoގ8nֺuk8Xz)RaNfϞm{v[Jub ޽M8Nׯ_܏<{&O=8im[Çw*�Xa;wv{!P:?v!أG3fXzOtiJu]� � � � � � � � � � � � � � �%S Ȓy(5 @1\{g+=GݺuprSkwV e%X?{hjX׮]K~u;.sԨQVBg~G/B\sR;w P9r]ze͛7/%9sXnl͚5g}\byꩧ{gO<;bɵ ~gqYZ\q€˗/kE<~E]# Gmذ |ݻ � � � � � � � � � � � � � � @An �D".4HA]ve֯_?vmRo[n:t`s).s ,ܞz)[b)O.]V[m &ʐ?h#Fp'O}>l YJ9suׯo QFN$jӦMvumfw9Yy?7n=z)bx) ̟?^|E{gM +WwF!� � � � � � � � � � � � � � �$ 2!@�H,>[}ֿ+jժb*) (/{.B-WRܵb}ҤIv]w٫j-[tױ¿UVlebF'~i<xmذk֬3@ضmZƍ7ޠ~;쪫rA{_ݴi\H/l쳏;7wn+WN,@0a=c6|pWZWv ʘ� � � � � � � � � � � � � � �.P>EX@�$CYVl-3f-B$FV6mjo 6^z%w).uɓ'af:t+ĉ>s=9Yxmŋ{uuYK.K|gXzujժeF"2 W\q TpG}-ٳg 'N }!25JF:vh?}wvQG@սmÃ� � � � � � � � � � � � � � � X >LE�@`3uifo{=kذf1L .tEֶm[{2Rzaڵ:u_mCuv1rH@ɧ~)vĈ.p=닭\p |lm-r |ֹsgWŲk֬/s?W^y@lR$0[oB*hW^vAW@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� 2"� B<H3fvZr򝗑dCz6|p0`llT'ƍ۲e\SO=Exk:LI8ꨣl#ؠAu.䶨cرuV<xmذ")S�QFѣM}*!@f~{SwqGw{ykC�@�@�@�@�@�@�@�@�@�@�@�@�@�@�J�A@ �ظqwq6o<8qh1l_~G}Ժvj,&?p;#Il+pf \`ڵֳgOKv͚5|"бv}"Xd a;LNI"3KAt lĈv뭷`V0੧jfͲ}=Xe]u{lQn6'j*wOQ^~__;찃qO7|Sd?utbӧO7狺uw!BP+-6΅{ezܽ駟nN<DS@�@�@�@�@�@�@�@�@�@�@�@�@�@�@Aς!@� \s56yd{w\�Y™K~ƏoGիW'7 6m/Ҿ ۰aC(qN?t뮻 .I&%M?>̦LbguV ,X.\hGh"OW^˗G2M]K}w0TlM\w*hޑ#GZV줓NS&ȦmvO#<bw|Em*n*FtSA/ݻ۹k3^l6lذȂh} xz3OɬPu׌39rPL>N,Wѣ{s@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�2#@d9( @aM~akҤIaV.+*hSNqNٳݣbŊ9^ڿwEY׮].EQAf}Gָqlm8)sI8_&ֿl[BcTcTIzl;B0-"g{mp O70[- 37xnڅ=Wu&;gkÆ z CS}5w\ME=$=vJ{;m^궒QF6qDܧOda@�@�@�@�@�@�@�@�@�@�@�@�@�@�@L}A`e'@�J‘ڶmk={,m$v5-Dד߸0PjUӣ$u 9s`TltCoNLW^drn>+H-05pr)yBkN2dsl?yչsgk]S^ mY۾~m;b>VfM;ꨣ>묳#<ZәZgz~W{q;XWVͶnbٶ6KVL ɶٞI^vYNuk_zda@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ T,{"� PH+V믿n/b!ה {gm͛=B.""?[֭+.^؞x 2em6뮻S+VXСC~^zi(owgyթSBƎ?7ԪUvm7κvjW^y%ɏ?ع\~6ydwljԨv}w0ꫯ#YwZVӼ˹kݺum͚5n}o 2$:O>{ξ[yv'Gt3fi@e:c\vWuـk5yMag}+g}f/Ftb>͞=LAx>6l`ʕ=zXy/tQ]A穛)gܸqn S<~Smm޽{s>hK/~Wf՛'S}W-XZje˖-sY| >&LBQw_W?oK:}Z6m Cpq.2y+OG}wsT.Q})-}O>dVvkܹs}YYkYT/~9s;u}Ļ]]7Own\p\$Z͉:u= j9"n T[~^|'*^d[J^G&q=z1µ{ hzsҰB$tz͏1z5 :OL?%9ZW^yojGx}vGX~G] %joޥoOwרߺ /ڟڵ*Ͻ([}vkokZǶ{U]-_kY&� � � � � � � � � � � � � ͒0��@�IDAT� �@"=@�(MA0K$YG~"ۭcFp?ƍG�HJ"A+u]رc?<nڞ{ :D87o)]> M4s9jժE0HDM7~7.an>e˖ ͕I_InGn]Zqׯ_$U L/;F`<7; µO/Lzn 2ԹAP$qw2=C-"E�H}=芲<#Drv;>K,ə2f͚r\f͊pn\iڴi$Yuי y0<-F=踂S߹uuYn 1SFȢEܸ |2{Dt>}G:-׹Y~}dvppZwmNQJs;huu 7]reH.iذa$6LsA-ӧ4.oA^-H| "^xa$u 8 ΕOTkT mOe"7sB6:+Wf|W붫{5u{?9ȗ_~nuO}M]A|_ʠ'5!vza Bo ˪z2 6 F0M:2{ -SOEwGdAy=@+KtG P@^z$!N:E[T~mEM(>믿mYz9t%]gjA{\Hoio'slUd,@�@�@�@�@�@�@�@�@�@�@�@�@�@�(I� 3ɺ@�rEgqa]E]+*(E!q Q Qa8IJGua馛E>ꨣ `* Ň~mh=쳏 " 3q }Sڵkٴi] AӾhu=Dիw}EۍS: }{P9=sG>Pq޼y w>͇2;Ve=믻ѹR{̅暁A*/{w?pEVƅ3hiaՌZL4-ySbzgꏶm׬Y3:.-F.ΏK^P_;*A[n<4hFIej_[)N7_i =z/B4hwމS}#sTGJa$AC+VHaϒ^ޕLx)Y6h wO]?}D GƍsPP[o=E*b͛iSNTݻwp ^O(xZ@GAK0qDw:wݝ#G�\?"${@2fq#˗/wiضbxIslzP8I!ɿۅ |i2n%N&sݗnjSEa � � � � � � � � � � � � � � @ T M� � f ,-"@!&Z*{3Zzի-իgA]wu,ڀ_Λ@ӦM|n ] `;J*nZ*e~ZF,g}fΜݿJ pnJf͢snX]r,g">ZnmAQn/ƽkvZ B³Xi|!z֧Ow,'AxseyKի۪U5Ke뭷vu5^nҥK;ւW lڴiFdS)SXHhÇ?܏vnUVͦOƫQݢz@ׂLu~ A�>fߗQσ`Kg`Ȑ!Ftdz_J*_l]v6p@ Mty-[Q<xۿ 6a}] f>7x/8cuù]|1 ǼE\O{.,tj׮;U˅^OAś\,cڷoo-Z !=-H< t9VR B-=nݺY:3?I&s*y':n~:]]n}v Ov?.^^q[gY6 � � � � � � � � � � � � � � PA` �9/|֮]"+`PBmΞ=3u<O"ֳgO|z%aਓE/&qep+)MRӦMFԹsg{7nO!t3+Iݜ9s\O=VΝT8Y2C'$ɬ Qi4(ERDnQr !MdNTYHf}}3 ^ϳZ{~k-=Oe2pK K}25+٫4'O7ߜ_h1=CeT>@>`>˗/w6NAs^Խ{wd߆ +Wts*TH{vO<,MR/ۯЫ׋/#F;TLؿƶfϰW CM+'NT :6m%\rŜu]BWlEL-BFBkժiӦyȂ c??GrСN-H"g}w>t_oϏ=\sl?,Slڵ-[VZ$9CGc< Сf̘aÆm۶^[Xbhk蘙y,<)}iL[h}NM\ב[]ڸ̧d[@�@�@�@�@�@�@�@�@�@�@�@�@�@�Hin�#� ˗wa%|IX45G:x ޠ]NRڵ]HPNܹwu ~~b|)&c1յj*w8222_|f͚ R S̙T?DpQԇcǎiѺS aSso{Ǐv]HC,K.:|}YH,\{G5ҨQ+X-Xm޹sgI9t\ܹscƼkԩn΂_cZ))כ;wn=Cn fAw}u[ 5;}l\oTxmITTIӳ~!u&4 ۲e6ni5]z.DrÆ QʷݻwrQ'O,jժQ\eXp?ƅOHemϗ/,s}Nb$'O?v~j׮]1\Ђb<-?! u sBMM\ˀ\ultR@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�p 2mA�[=zȂ lhj\?@)O?- |'ex<GPM 6 񗘎EΘ1CJR*UuNCb:tpn׵jr̚5+JTf5\xJ}x뭷d@7о}\_Z�S Mٳ7o<yvϩK9RESO=%brҘ1cdwX(aΝiӦv2 }~g6VXY-wE/҅]ʟ?;~m?|BSmI̾F/U?=fͪ{ε-!ӧOwWlRu} \`\VK9stɓ'ON:~o/3y({Ϸ#Eu!˖-ӎ;,_\{^lA]w]b,FnNyԺcA$}v+.˹>'Vւ8yw.{ܙ3gٮxXh9:qmzo2WUOr|gsmN@�@�@�@�@�@�@�@�@�@�@�@�@�@�@@"�@�y睺]ڑ#GpŅ{nWȆ (w;v6mw}W]vUN4h wQN&fKݺu6!$klٲ]oCb\ؚM:T+W3m4:t}9 zW]N|[ ASCۻgw?t[?^_|gy_`&L1&MԩSU@gbWI]xz>}Ϥ+m!&Mr~/A)?14L] }7nhA]vЃ> B ?3x-B,pʂ -aÆ8pׯe˪f͚Q냍MXYm6M81h5.s=3g[NÇ׏?Ç7tr>sW.7n~7.9SLN8Z9u].b&Xad>2c;?y}ܞƍpn>I;v螏迵 7!+"<YoGիꢋ.rb>!P-`,/?P^{,2)C d!ؚWvy\�+rς[v蒐$9K3Zol68kڳTre˗hso%e:/{76Vq3!nl~pl{RʅNT[@�@�@�@�@�@�@�@�@�@�@�@�@�@�+rO]@V@�Ң7|sĉIE/,@ƌzk`׮]:͛evNҥ^~ڵ/h'y@fO<Dڙ5kVK.qe̙3зo3׿1bD rk]1]y%K +W.PN_2dH\M9;/ '7o^WV*U^\_~cV^P;K/ xap/xݿ̙3PEeʔ dϞ=k+^fy^[  xaF/ǝ߽ ;ׯ/^<pM7%&A3¶ȥK߉jR^{'O@Ϟ=v`Ezl=zΝ~v=^j6zQ{N@j\}^(jnwqĀ@6q}{W/˯*A[/*`Q+~~F wB:.x!Qn}ߪ0Lf=ؘ5x`jժ?#pر[{�h}P$6߿?۷v[m^pD/x3ύk~:;wx :N t XKBJB^b A 9zự//%[{n Dt7camVf\KofϞʵ:7fޚ5kΥd7?>A_I<yn>}w^{!/p}ڵsr/d7`yLK\IB�+7g8:c;慓O^wl,$eϻF~6g5\ٽGg[ܢy̙Qޭzߎ͕1AI xk#  � � � � � � � � � � � � � � d]^O}3Ō(Q �a'Sz4rHyA)F½09yAm> Y[@$k={dϟ?XGc .xzHPyAVEɰx9r>{!mڽp98pz;{Պ+ *E ;yV.bFC4(L+T4 hR W ,my!Xϩu֩|Qc//�NyAn|򂲂=\Džm۶1 ɔB E6Ǣ deIV5fZ|lӪU+ݾ}_Rݻ3`CUt&7/mM%)V_%/84?wd&ɜb.^0>͟??ޒXcvvm֭^~eʕ+|Ŵ$srѣG-[6%K~.dKols +62!u%98 ./>@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ M&n#@�HN lٲ˧cǺ@BӧƏg6}89/CuyJ묆x.2~W_uX5j>5mT~iph`5‚B-H[hf XƷ<Sرc|E i\$<BjϜ-fcʘ1cTFZAܹ`˳N@814/Cy^,By/SL݄$BhOk^zRTg3fЃ>({o=J(lHcN8d=駟\oSuwZ_@�@�@�@�@�@�@�@�@�@�@�@�@�@�RN $]!5#�3/܅uIժUӀ\P ^,+Vg;g޽{e[nj5?Tƍ] ԝwީ-[cCS[n1bz_|mZpM7nVo$(vJ޼y]f|x5 1]\.ǎSJtA\JC / :y΍.طo}] 4Hsչsg%K[vmZfI+˅<Ia`ꫯHk裏0HK۵k/39p-iqxbk.t}_ULU� � � � � � � � � � � � � � �$@$JI^!ѣDA�@ |N>7|S/ UW] NM:UO<V^- С =K.jР,TR@س6l0gF}ks815ez7ꢋ.R׮]uwp©>.\aÆ={jժqƩhѢQ<u 'Pד'O+c=+yiâE4d9R%Kts2g]3f훠Ӱht*jͯ]w5k>,ł?C,?.Ղ!^ϟ?4@ &MzK3gT6m\Pk, � � � � � � � � � � � � � � �q "� uԭ[7}.HW^Qdddץ=*[C|~ } ̙3gX%_}y]օ ʖ-[)쟧\{ァ]͛7wA|-ZpY,%@ J7߿?ʵNK[jԨQ.vŊua;�_~e+|>Oe˖5qDeɒ<KJl9!wءoBZpeDDDTJ5kO>qcg:ur]vY]@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�G q@�t wgՒ%KԾ}{SիWO=-pI;V~~ӧJ*UQ'4c :TǏw&Vw뭷nˀPn(i&M0AGܹsUtiq.Xlٲ(mz]XeE? 6L]tq!fz$Oɓ}` po{j׮DC56nO?3-\PUV=ܣ[l8; � � � � � � � � � � � � � � @ 7f!�^JU~}=j۶dɒz;E˓E`Ν.pȐ!N:SdddO%Ç5qD5J|,SV\(daB� Xh dy6-[LŋM7ݤ;kIuV?ڵk' 3fʕ+ >vz衷~aj Rܽ{,֟~I vqmڴQFMM-BRǍK,;SժUKP � � � � � � � � � � � � � � Lw>!�A[.8%o޼[W!pq6l0M4I_|>=#*Zhx42B!- r„ :u PMp tCӡ\R3fӧZZloQ5kLU1u֩}Zf㈈NX4{{}vۢ>n޼Ycǎu9s)S&5l7nXUTI{#6kc~ށvءK/Tz뭷ꫯO@ � � � � � � � � � � � � � � nL7"�]O>ѪUTR%uAr.j'?p) :x4i -H-s):I,YB;͛7OǎSŊ](5\:u(2229@ŋ,o֬Yڳg *FWfTxTٿm㴅@k.lꪫ$]w^zwsDid.oʔ).u۶m*P-X0pz\(*i궧lٲōgvo9r~.UVۤ"� � � � � � � � � � � � � � @J Rԋ� ..\#F�͛7`֭[e˖.p�XXHԩS5ydY?֪UK۷WǎUH4سG03f�~Iv`kV5TfM<]N׬YY6WvѢE.hѢ.΂,�rʐ!Cw)QڷtR=裚;w q`r%Ji#G護R={vy=ۇ+W̙3e!z'O`W_} ,oY@rػZ;qFe͚ս4lP7[1@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� 2i})@�,pXƏJ&;wn]{jҤ aMVHXV V˘1,d?o&,Y2'OtJӂ ܺn:u%TZ5^q|򊈈/g@ Xh;rlٲR,Yܳjvdg`Jƍ3<]:uRUjdoTپ}ߖ=7O=z衜9sS3-^g9s渹tvtҺ+ŊKQQ8t萖/_M/^,[W8q"Z]Nխ[׍ٲeKP@�@�@�@�@�@�@�@�@�@�@�@�@�@�HA S@�,Xjԩ4m48pԯ__ZW]@ ػw ;wf͚YǎsjM67V<y«&,(@,Y\-ʞ=*V/\+WVJTB)S$k/ ߴzjZJ+VpA`6a*U\@1ZPA-`#FЀ7?cj޼_~qÆ S֬YեKuM >,9lXh[7mT.bo_mՎ p.<f͚oQ[m R{ ҫʭ5k%\r.Up. � � � � � � � � � � � � � � @ D� :uJ/̙3:o<Y.YHX\veʘ1Vu)`jg~']֕f:ٰaC]{*]yeiQvA|d|m۶Z\u饗&{lc,xO҆ d!_ލG�Q �Rڳr~w›7wI;wvsWܹS#GõtR7=裺+WmxB/_e˖paڂ ###eʕSl°G4)9,w˖-nlM ~=;~e˖ucVZխdȐ!9I � � � � � � � � � � � � � � �(@9q: �-d^w .tqǏw釽~JTT)B_F;v̅XίB̙={/"i᜵kV:ud!N,zjO~b!O%JP2ejO[/Ydp͑#ǹVa.`ͦMڼy6nܨ?í�G֍"ED-<bŊn̙3yOSg~X@е֭[A}ʕ4i+acKvtwy³gi3l]vF[_b\П=c\`s?dɒ%<;Hg`ǎXɭ6Xmə3g0 B mx9@�@�@�@�@�@�@�@�@�@�@�@�@�@�+ v@�&`a0-[ mbŊ` XXdd Txq(YGq;~zY�Z�ϩS,hgܹg}V?<iIZ8=<e8q"~Z@`…kܹװO޽{]Ν;]�۵m6֭[zH?y1 #  ]-1W\j O0a&Nƒ# W OQ5B-xٚ1c (-[M6j֬4ɴsNbsEoa6Eu!U; K =y=tkzٽ*]ʗ/O{{˂� � � � � � � � � � � � � � � 6L^ � vޭUViʕ.8Ȃ,̙3G B,4.Yھ}j~7ov<7o^iA;VPAhٳ>޽{kРA]>UX/-*\=˛6mr`|>СCQesB\(z]t% eqV  q{<y{}Uw< &u(u$o|K`n_k̙.\тe˦իjժJ*Vr-.`˗/I/^؅ڸPV-^ٴiSթS1Qnc<`c !ܝ<y2Xzƌݸ ic0a[m-ԮcKm|yjc6cmѣQl:NZcRjc  � � � � � � � � � � � � � � @ 2cz� BB,0hΝ<+K, @ kArRΜ9c\s!>SL.<ȶ(dYmCcǺ_. ߿?J,TK?ǂwʖ-VWB%K/^zg%()xVhTh#mYdł,V X ls;̚50icBDDDmL[m\V?6; رcQGQռl�Mk<xЭh!kwso-pB .\] ;9RsyaoW 6ya]))`̳gϖ˖-sA bk2e<d[l՞jƞgL P:?~hswbJ*@jժ5jfJ:Qw 8nc=v:+~{&cm\1_mЭ6ǴF.:އ=:t~{Hj㿍6myVo~5PMmpuq<@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�L H@�pnc!AiA~IBqB-ܖ ]mA~�YxPgw,�Ҏ%bfo^x/ >\^zibWCy$=jrھ-~hpVh`j+8q"p.fȐTep\g 0@L?ژd$bf yHWL(dvĤKW\ iÚm.Bw =,<&###]$t竛v~{߳~ D }B4o=;t8-xx~:V geA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@|<5A�@�( ifB'O nY 7k/xlЪЭ[Hp[VZ;CWo][i)*`cC;vLǏn}lPY;7mKBp־Y qV?[l SbS 8QԴPo7^f!m V{ضZ i6>!`=hc?gN]>xʗ?C}yc۷i @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�s \8@�E`}{J3_+ׯ4iaÆH"it_ Ԅ gB!V^Ԧ͙Pf|^BH͛ fH= � � � � � � � � � � � � � � �.W|� � P^Z>}4g_^ժUӴiz9!�,3Iۥ7ߔnڶL+=ӧ/* @�K` iTG󺜋@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H3A[IG@�@ j׮EA]8iRҕK]HfI7J<#-X 5j$*%=xq" H]&h  � � � � � � � � � � � � � � ��A)O � 6ɣѣG뭷ҫ͛ki ^dIGiiJ{㥫*V^yEZ6A@ l*y&6CT� � � � � � � � � � � � � � �  y\� �&裏jΜ9ZfjԨe˖v*@�dTIGZNG!CK/j֔ oOP 3oOg � � � � � � � � � � � � � � � @d (B�@�Kh"/_^uhA�.HV-ɂٶlNREzeD qc飏/ .F�{IݺIY� � � � � � � � � � � � � � � �A � �I,?~};t7_~I\##� ȘQjD:TڹS3F"G…nFIx� Xd uz}@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ү�As@�HFL2wիW/uY'NHP @֬k/8 RNgB!KSJ'O_g �&`;_ʛ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�0 y@�@�dxG5yd7Nm۶ּ5@ KiVפkͥbŤG͓0l<MB�9RڵKzi A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ L[@@�@ p 6m,X믿^OoR@’c nݤ3urg~%u"@ XPmI%K&yuT� � � � � � � � � � � � � � � @ 2*� �iIf͚3g6oެ hi{Ұ@ٲK+VH˖I:H#GJUJUHI$X`ʔ3cE @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�HAL'@�@ *Vsjذ!axh)`Ꮿ~&ql~}i@"֕oi׮8KHo!5o~&$6 w!� � � � � �L��@�IDAT � � � � � � � � � pA3 � �'PdI͜9SjܸFbZR$@ Rz#/V<Y*WNzYX1Y3ip鯿Eԃ�)-`wGn #� � � � � � � � � � � � � � � ~A=E �  .iӦjҤݛ.%L-WڹS1BʚU~Ծ4~tXZ5}A�TԨQo� � � � � � � � � � � � � � � �A � �a PX1M>]6mAh pa9rH:H&H;vHKwK")"?HO_X=\�%v4nԳgx � � � � � � � � � � � � � � � .A˝ � J,iӦyai;t뭷ĉ�H;]$[i&W/iRID 'N;'g7ߔʖ=; � � � � � � � � � � � � � � �  @�@�(&M4I?t-J@ w.~MziꫥH饗իԀ�/GiE_@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�҄�K~t@�Ғ@O>kF_@�.TL ?KmH~(U$]y4`eYq�TKԪ՞0m!B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ L{@ @�@�Zl_իƌs@�Ң@қoJ7KӦIW]%+*%]{Ҿ}i !_5kw[(mt^ � � � � � � � � � � � � � � � A&*E"� �!еkWz}i͚5Q$e �B jFH;vHI K?.)"i#}tpD XXɓkU%t@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� |Ը@�H&bŊj׮9LR  >YHmJFIvICZМԹTt҉fZ@zARRkURdz$ � � � � � � � � � � � � � � �$X Sq" � YѣGkzGԈ�@\wHSH۶IqԺTCR F)O?=֚1:]r%t@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� ܸ @�H62eO>#G&[T�@R׮Ҝ9KO=%͛'5h .-)-]=m _} cǀ6mZȴ9z� � � � � � � � � � � � � � � @� �$@֭GxC�R?>lbt_HիK]&~}"G &NVf=z Ȱ[4@�@�@�@�@�@�@�@�@�@�@�@�@�@�@  @@�@�袋&lNA�ҧ@kI6HIKo-]rT4xcG$"/Z\IU"� � � � � � � � � � � � � � � &LN � ~vޭ{OZҀª'NT2e&Ir̩CjҤI>|xu矪W%oϫe˖۷~w+}KI; SR޽բE z^`8q"xY|eOdH":u΄@n&}TRK,8D'c:7]wunIFJfYyFZvɣ &< D@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�4$@dt@�,`aR۷OӧOɓU-\qƍg,&f#4h{Lݺu6K6aٳgΝUVo{rέwyDž4խ[W[l ^4cƌ;ܿj֬ jȑ^3zպuk=z]_3 T3JMJÆI;wJ.oLzH*\XiXyWR E+9\ӧO_~ҥKe,iSUw3Av7^"N@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�HAL@�H ?zRBu5,e&i ŋŊӎ;Ծ}{]q.L2<x:5v~lKhvN>}zj 4HS5+oѐ!C\1[]G�R [6[/< HτB}ҩSIي +B7nL#un%p]GD.쮇˖I_-L֭[ y~^*@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� !y @�Q;u -X*\RJ%yrǏ)SU}_P!,YRFҟ?x^<y\lٲIvB˴r%VZ* %2IA�RP o^{モnh+/P2u{Ll`,U?s>}@p-,)RժRgg\rI/@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�҉@tO� �a*𣗰駟j.YfСkըQ#ڵKzm6=CQz2uT}ھ}yQlݹsJSy䯓'Oʮ裏[o֊+Իwo:}2gάgyF3gԬY\ٳgW>}T|yuۮ];Vi}1b, ^ܼy>C-X@rRҥ5``wޭkҥʝ;.A|K&Md>楔5nXYfr0(Q"YJ(W\}0a h˼yK/W^jР;yqmڴI2egɒ}oeZ`y޽gG"Enά#>7?XԱ^]kn>7ֿkQ׼xUWiʕjժvԫWOO>f̘S>T9yd77~ nWF`i=${ww 2Gݎ7ln A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Ha@�@  2D 6LY cBtm}Nłǚ5ks.d'kwlٲE QEC yP[n<֪UKGq[v!7|,oquu-#q8pr,k&x^`HW_ƍ&oWDDkСCS `;vyQ 5?UVʗ/ l/-… ~[+T:xĉ/ ˴L |�e˖Ϙ1eOds) ?,nL ϕ(o|MN77m֍V=ܣ6mDiH\sc|ͣ1͍&<|79jl6[΅@Z#Zls_.]xy@ θƸ`섅= >t9[lѱcԯ_Xx~@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�0 2 nM@�@ } w!wq P^V 4f 6LVXjUSlY0ʕ+kŊzw]萅L͝;םtRw,B:oc#Fp!vZmذA?,εٳg2d 9s;f~2i:ur~XȢ)S&wn5\<'t}zq N^N%/~ZW◱k.wB-CZgϞ2F/{n|Y\9E/?- U,o2~m {`aL~}4֞=ӣ-8wܲ؂s߼h<Ɵ5jh \gZ�s'@577w~ x޻Sh׮]v<){ߨ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ | {AK@�H7 Xx`e=zTk׎f͚_~ex}]}[l⶟~N:nUYXO/_^XhKbot9ʓ':v( W5k;jd;vL'Ota~0}5kVRJ0D eҥ 5n8;6ؾzȵB(ŲOB4$|8q},^x~] yŴᥠY(WvY?yiis}ș3gLq H6 yY^}4qTԣTԢM=:th cƄ;͍KpG|8|pwȂ۴iyܘ;X0;)*0h,/Ca71:l@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ҫ�Ao@�RP) !<Z`Kz5kքVlAI2er~o.\(]j֭[vy]mV n>pN:.p„ +=ƶX"ESdd׫W`,Yge˖-bϜ9  Μ?~> � ]ϗ]vYWPA^;wܪXb02z�T D@ xCZFv(/$Q^y!m <~:ds-_߼h׆΍ wύ%^3\5elk!C\q͍ c*c+jyYk� � � � � � � � � � � � � � � &/w � �.0gΜ(u/^}.lIZ!KBBNW9tAYT~W^yj֬/­GرceSNvZl:us]wiڴi}V?|V݇żd.-[T OuEJܱ 6Dn֭sʕ?EU;7_~s)s@�T-3ԱWҎҍ7 7>JӧKO͂ 27ϼh_ȼc!l$G;wʕ+]0p֬YUF8;x!swe xӾ >}表Eڻ-<UO � � � � � � � � � � � � � � �i] ȴ~ �a.0k֬(-\p|5׸tuر(ZjޅVϛ7/DЭ^YmݦgyF|ضm[}7.`EoO> *#F裏>Nk*_rʥ1chɒ%k{ ڴiSXBvjٚ4iR_JԩS %K(_|0.O</_^z >X@�t(?̙q$֮Nޘ+oN-VZ˄̍x Mb;͚5Sҥˁ.nu[z!7[c~0/ZK?,/9jYdm {F � � � � � � � � � � � � � � @ZH˝o � M4ц _j PϞ=ݱbŊ)S0.|j[lq<ܹskرjڴ}]uU:uҠAܹwv[kCL@ׅ͛^u\YQ_QFiǎږ-[mݺu%K=c wޮoWٲeUf͘1 ϺI*Uh۶mʕ+:9sFپ{ʗ/xGΞӧ~!C!Y@�%/VO8QQCPAzei͚R6O$tn .`xСqݟωMh6w=n\իQǎvt.scB*@ |tԭ[j-ڞ{nՏO � � � � � � � � � � � � � � �O :;=f̙ڵK)@�Ң7߬ԏ?ѢEqFOk׮ѣUdI{YtR}7}?P \a7/ȎYy�y׺Zl&O>c]~.%-hΜ9ʑ#(ܙ3gv7xj4Z;/xw\O׮몫*9R֭unZݻwwnР+1c;5o\}Kj+L2}i۶,BgΜ &;?}6eB,\{ufٸqcׯH^57J-ZHGJDzI.-o^ڴihs׸qV|y*UJ?xsS^24d̘1Ascddߗ]cL|mؼs~i-VgՕ-[XFmΉiZ+?)'pedۥ[no >ydv<Q� � � � � � � � � � � � � � � >2%޾l$@�@ VhР_Cݫ+V + ZX`<R"""gc.\rTxAeϞ=J0={TRYt)mݺUVL?t 0/ Bf͚իW?;wC6mܹs]5\B V@�bM./,X;V/aCyagBN{n1 `<BuoS27^o#8<ku"J޻D"{]ޑ{'@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�'@d@� JC Xn*VÇ{ab^  @ ;&Mr&r$B"5; ٦@ LLz__裳;;d=s?# � � � � � � � � � � � � � � � p@p�@�H&1c$SMlٲuGTRٳ2eʤ 2sIqAݺuUX(2@�T)f-_\@ ҂Ҝ9g dj֔ՓV2f v"##UZtp谽_/Msk,:o޼.f; � � � � � � � � � � � � � � �Q :(`}f_@�@ &hР8tTHm߾=ӧOo:$&{uqIB wA *(p]],QײPY;","IAJh;K!杘` $3s[>=gu떞] ̙35}t͘1Cw1g� w}7#e[W^];6qY' � � � � � � � � � � � � � � @| k� �"0~dދNaU'7|o߮+Vո, \ CΝ;W'NPHHڵk:u5iR1]+//vԧbee5xҪU|ښ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@��AY]3S@�|F ȴ+WTÆ 5m4 = 7Ο?%KC~TT֭z)<.l]rf@޽9 B@jL*^\1!h � � � � � � � � � � � � � � � $ � @L6UnlӦɣɓ'F�x'OjΜ9>} SppծRٳՆ tXо@#ޗ#g,0cbJ*5i3a � � � � � � � � � � � � � � ��A>  �YB y'NT=qFUR%}:@�tسg `ș3gjʛ>f"#۩mۊ.{w)td2֭8*M&t@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�` 3= �YQ y U׮]O� !k֬BΘ1Csә3;w""*(:vNRNR2D:3Vy. � � � � � � � � � � � � � � �>-@O� @ 2[o^xAwVӯczB�0siѢE.rZr.\31!mզM; B7ܐ#&$2ÆI>.оtll!� � � � � � � � � � � � � � � w~7b� � l*::Z}YF@�ֵ^_~Y˗/֑#j„ׯSS΅;w]s[;vO{]`J<i@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�b.oIҸqjv@�@ 3 /ٺ{̨95k6lFi @ovء1cf6TTTS>RR~;5%.]ÇE � � � � � � � � � � � � � � � @G � �d:AiƍZ`AB�H@SvXEF#uMgI5jHKo!ڕy¿^]zAiƽr4ec@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�+p!xɞ=c[7[- �=RjVRP_leKi8@Tz?N� y<oモFGHL7,?/]}4lC!˗gy�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H34k@�@�2e5ٳRd_Ǟk]BVuɴv@�\ 0!hZ9Rڿ_8Q*UJzm.!OD~ͱQQҧJ+J3fHw ; � � � � � � � � � � � � � � � A*M"� @B~.> z,۷bRƎ&i@  Kݺ)wC:p@s;%>}ɓc31C֭MB--{; � � � � � � � � � � � � � � �xO HY �$!p뭱QI\V`̊k%(TwO?4M< @țW֔)Ҿ}oHvEoΝ{,FӵG x!B $b#@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H�Ay@�@bKAAIگ_׸KK,͛ �d9Eϗo\ZXjZ ~-˱wBɓ  � � � � � � � � � � � � � � �\ Ȕ �\w$6"  iF%JИ1cR7#� ?>jntK HիK/$mْؓ TɖM1iB骫.u'@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ AT@�@nIʞI:I g+ݳgO;ֻ  @QCze?Ev>T42Çy,¸+Yd M!� � � � � � � � � � � � � � � @jIE�@�./ԵdBKttϰv´z솶@�@fһJ{HӦI5kJ='-+m+}tX^{-64:%${A^.3 ;WpT � � � � � � � � � � � � � � � (!� @.?rΜR qv͛7W5vش넖@� ڵ>\:p@7N*P@~dIGix)""i ~EWOZ.{2 J@Ć@+G � � � � � � � � � � � � � � � = gIK � p<y†nYʕs쥭@@@zEd2: El&ĆB~tԻTt睱aΛ'<RFm\<W ys H[UY4# � � � � � � � � � � � � � � � l Mō � Z9=c[:^7|J,rZ|yJ~@�R-P4`4md/,m(u Y�!ҢE݌׺B"#"[nzJNPt[5} ZUWDγ� � � � � � � � � � � � � � � �i#p!xi v2n\@�@�fΔڶ=[tdC Q/o� @L7Ҙ1R3g@`LB5c4mV4{Tpn@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�2  � ~[KEק!'nݺ_“!� *IO?-['Z%5l(%iC .W/ _v{w Ni\B E2h@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�#g � 'NѣG] ׹s\TWiP,ԩ={v7o^.\X RΜ9}z<oQ|o߮ *T; @&[W1߳GjH5J󥳶H.5lL,**Jm .$Zm@)[lnfMᘻFzڱ#Hǭl=f@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@@Lo5׳glKyEA�@�_0[j˖-ڹsvݻWGqv_ҥi̥ocjŘRĂ,hѢ*[ʕ+VJ(t7\IR^C=}\@�@ #NΞM~O>)ybǏZ{'OԩStt@Ϝ9#=׳1 G(w LSc/S,H2G.g;wnůyqǶp|m?~(P@m\.;@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�|Afwʌ@�tRoZ~6m eMe gT k,TP!W-- (88Xٳgw[ sιjoKGu*yI ܳgOիFY5j P n6:tH3gμ܁� @: |Էo;lVs/?SÇBmYkBښ$B ھ'0~ g?D Qk#:)[l<jXФ}\\t?mT1c8̳x?~gւˋi3m?p) ,5#mgK _ � � � � � � � � � � � � � � � A[c �^Zg֒%KxbرB-pxUW)i07icݷo\J_f,ɂԩMyj UT73f,L� t"Mre M14`O'49C[6~͗/! 4S~'Onz7-/{;-2~i%Jpxq%KtkҥK_  � � � � � � � � � � � � � � �$@/ Ƃ� @: ߿_SN5c <xPEQf\b&MԸqcC-]U \|"##UV-kN۷W֭3g+#<hJ4atMeZ@O:BwڥscBԡCVbݲ�h d_dޘha ,رc.?t8p_=[[>3qu)SFʕSٲel˗/bŊ � � � � � � � � � � � � � � �i-@dZ > �>&`87n8-X@]Hb۶mU~}ب|8O .-r͚5ʗ/u[oU:tP9?҂>1g@�|]ɓfOݶmowء3gMB-<Վ-SK(gA#B"([٣ݻwU;pIOɝ;,j TbEU[?R@�@�@�@�@�@�@�@�@�@�@�@�@�@�@��Aޒ@�|Xܹs5rHhA7]t-ܢ;ʎJ� pBɓ9{jҤIVaa4~xm޼9; �\@DDl٢7jӦMnkxСf-ıRJ.pن(o޼q@Z :uJ;w #@RPuV&Xb\V*nkr鹍- � � � � � � � � � � � � � � � 2YL܄�  XG}>LGQΝ5`�uЁWo>7N|֮]S߾}L89sԦMvTbE3j@�tkݺuz-</::Z*[ ˫RZchhƂ)ӧm6djm 7lZ BMk֬5jȶ`_"C�@�@�@�@�@�@�@�@�@�@�@�@�@�@�  3n@�HK yW4zh*UJ UL֯^pF!˧G}T<@ … 뭷2x@�8zV\իeuÆ :,jժ.�zT ̕+W Vp &O@T UlTZ5խ[o��@�IDAT jB|` @�@�@�@�@�@�@�@�@�@�@�@�@�@�@ 7@ �xQ`۶mzg5fU\YO>hMnz5bȑB>ʙ3gwΝ]Xw}i@�'+VhѢEZ|{lٲ_j׮j:u\Q@ VR- ך5kvժUڽ{!44T5ryjذa^g@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H\ ]8� _ 륗^r!!!zu-(00ЯK=z7|SŊ[ooٗ赱X嫯* Z4� ּy\]p~7EFF\rjҤ kР C \Cʕ+]ҥKk.eϞ}hBZrH"W O!� � � � � � � � � � � � � � ��A~( � ̞=[ <z͜M :T~u릏?X%KLq;e\׺uTF _*cC�HSdkiӦiΜ9~[74jH-[TfԴiS*U*=8\N`߾}Zd/^ sΩf͚jӦڵky\S\G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�3 1\@�<ϟSO=7xCݻwOh' suq}ԩS1MgPBz75x"�@XX&M~I-R``Zh믿^ZRƍ3g4럆@ yyi̙ZpռysPի'1B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�i }08@�8rzbF;39UӧOtA?}Yo^ŋ_ào@�/ ,_\~i.<B;t蠫ZrRO4�i%_USNuAZJxի5jV]. � � � � � � � � � � � � � � @ 4� vܩvܹsUV-owA{9rx~Ot'|K/c,#D�HT`֭/4fپ>r-ڵ*V3D�ضm[w. RJݻ/ۧ � � � � � � � � � � � � � � ��A) �ڵkZj hڴi*^8*$`ݻwM7ݤQF)000Fn̙6mh*_w@�4?XfRƍկ_?�YD4@ c8 ꫯl2]wu<xz)B3F^@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Ģs'@�2\ر˧ٳgo}<y&LCfhR}ӦM 1Z@�Hs3gh\ W֯_%K!i � q[y۷� n  � � � � � � � � � � � � � � !� @`:r䈦NB %AiF_~~m;6c^sʥujҥ^jf@�B 22R|BCCkذaڳg|MUV--Mq۷�.n  � � � � � � � � � � � � � � {!� 7Z? ,]߮g'Np!7͚5S.]7(<<<I >\zn͜93{SzW^2d>8p 7&ҧA� 믪_^uW7nܨ[K ӧj5o\=Ο?M*.\iӦGqT4ʕ+գGUTɽӧ]ǝSNiԨQ5aFw}'w{¾3컃� � � � � � � � � � � � � � � [A`4 �M{WZx[jѢE۷^}D)LZj_|Q}Dғ (~J,rժU0@�X(ܦMu]6lP~ L<Y;wvSNU:ud&M"fbۇ~-[رc.o?u?Nuـ={ ž;ޝ}gwǰad%@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�{-͠gIc �d{OO>mۦbŊe)jcǎ֭[O(00PvRJTpa߿_q[㭷4 /5h ʖ-7Y~j֬+VA4tƊ�dZB5ki皚UVM-['|̬YԤI͛7ܕ̜9S /p%ggj׮۷ɓϨQ\@}TdIݻWO;Jՠ}֖-[&/l^xbvm^~̙km � � � � � � � � � � � � � � ^c<� �%駟O>@?x|4l0iʕ+͛B B l٢x=zt@8z(-_hQ@�2^ ::څ@ܹS .!jƍ Ipu];vuXTTTAPPWlVe涥KN;r ?9P6.޽컅� � � � � � � � � � � � � � � #� @wիo$qGOO8QV8 StyM:UD9|p{Zv>YW_}9sN:;"""k wׇ " rv˖-{ u9=׆ G%8wĉzG]@o& :̕+WuoQSLSO=fӵ@5lPK.ӵo:C�w+~G~WƝĤ6la tu? pΞ=KncǺ{7~z"ׯCsرcTuʕ+M6޽{u}qƮX7pl]ߺja6۷K.z=5w\mڴIM4믿 <m}fjR=Զm۸:tHVZmԡC)ٱ QFiƌY}Yi#ln/͛n}衇:rРAjѢ;gkǯÂmzr.~L_ϸ.={ܚq̘1.XkkޢEq[w}( � � � � � � � � � � � � � � �'@d3 �X| \3hzW_&LpD7߸-.ڵ+;w[ wܡ֭[Xb.<˜B'OZ>X˖-Sr =Sp PE Pk=\ Y[X/vl~dAAAA^j5}iԨO Μ9{9;2ĬYԿD }52=ڭ;,Hv[b_޽kB-$V.5^ W-h1O<.qW ~6l ׯBBB;4-Z(v-HGʕ+UP!/_ޅq[=cA#Fp[[nպuyf5o\'Otv×_~~~-]vZ`sٶm;0N:jrwuWb7:uJ͚5SݚpΜ9R}ӽo[Sy,Y҅nZ۶^{ݚjܺtܸq\?FFFzi}n*gL2.R!C5mZȥΝ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�L))gŤ@�$SxqJ)ZJ .�% ~qFw<h!Dh1dł-ȮY?k?Wڵ]�_|cǎiȤڽS4^>hܸ4hF,@3::+-]Tl#G=c2eJJ͕*URDD:G|> PP U �d… uQqHg[3$.k׮ u X0@ZR[{.Vg#00Ѕ8[H1lRD թS=_bEvm[jofjԨ!-B#G0pYآaVZՅE{у>[l׿zj׾,{`q[YȔ�=sLVP;v OkR}͛WTYpa׭7nXEqy/Z0cVdR&wٲes[@yѢEN]3w}X(@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ e\� �PA GJ_+**Jݻwk ݹҥKM7B,NJ 7B,(… .TR.5\,7oB"-zI^(GaÆiÆ ۫\rn†}Y : u99ݤϻ, -̓� 1b2f{=`O >k1cƸ0i (_ (0UxqIjhG~zwdXbJ˥͓'k~w=m[cϞ=]kwn۽=j(zʳot)u%nhu/<yR? ,( bk?[뙏c-h:+m^ikĉn,͛^Ot~>C}Mn  � � � � � � � � � � � � � � @ q� e,ѣJnظqϯ˗''Db<xЅ�]-[65mTfҦMdA=[҇~( Zf{Νm=4on߾sʫ[ϻqcժUSpp $2i@*U\h_XXj֬y;3RR[cs=nH%KsqA7x,H-LS<alTTɝ:v/^\?fΜiOu= JЌgܶ3GIp7j̡C-[v<ӲeK뙇zuڕ'%Ɛ}^N@P � � � � � � � � � � � � � � �d@`uM � p9UڻwnMu I<q,m۶O]B,qڱcG˔)K(༷THHۚKҥK]OP缷ׯW"Etq OvgB~>@�hذ >|xw1.Ψ?^Ǝ+[L6Mzk\IdrMÍYSSNuwy kv7cV&N'{ٲe/3g;(nƚ+Y`zI15zj[NU gjsg � � � � � � � � � � � � � � / Ko � p@&M\ό3.zFz)]p! ;Nyڜ7o^ǖ/_\r]Op $eMݺus5h@uʕ+׃'ܰe˖q缹3}tyB)nzevWNn@">]Cz 5FʕfϞ`"gϞMp^<߯^z 6sȑ#n}a㸒]ݤ6gYuڵ߻vکpӧOǭ+_}N:O?P͛WǏow=::ZΝ;]άYc;vLv_5gk 4mԵ.h]OoͭXPcTT+LY￟Y<@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� o_G� y 7ܠ/ӽ{/_>M0A۷G}_}ߡCv֭ Oo{=EDDgvء 6'TB.nN8xgտ͟?􄇇^c==wykiĉ*QƝ΁4m4|j2ک[ ʰ1 kor޽]($oWܹ/G̙3kٲeW4={m.[vx-gLXfM,XPKvO`k[$\]O qF/n;v&MaÆsA-0\rZf3<]o߾z\= 3ϒ-bŊjܸgZ]ܽO\[*ikӦMkΝ;m۶sT)SNUѢE%ۯKmm=leРA2enV=zT{u<m}V<xl=|<P@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�2V (&yo !&<@�$PHKԩʔ)VZnYWv7\矫VZ.(B,f ԃ>?Ӆ+YP6md˗W_iܸq~… I܉M>]|_ɓ'kȐ!z4QBjʅYѣeQ6_OSRy`K7oȑ#-[T<yZS\2v0�dq %[lAAAr<&ƨS ]M3g,z:s<-1cx g{B-*۷o'ZbR Ŷ5QZK CZU\pR/^<YjB[~Ɓ+U+VuڼyԲeKu͍q3a~K.u{kVl-d}=fm먎;_W=¼mh3# QFŵsۧyotֿ_}Uuʕ+gֿ6֥MCCCeٳgqu]ήro>6x |1Y[YdsMA 1g }eaw_ [v@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� d୆{m)OA�@�/ X brdCMmRXX  fgϪXb( 4 (7nTݺu](R{ٹs [-}:.׷o_{;yp5mn* ڳpˆ 𿈈ȑ#g̙ӅhѢ Pl )딬.ոqcki!O8Ǎc`a6Τ:eYa|J鎅Zn'fLM_ڵk]gŊS4#[YI-_ˬYÅZ(R@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�|C Hx@�K [N 4s=aÆ]^xAuC׿޽{_ܹskdeAV^,;? 0ߧ@�L#`/z-kN> ,['N,qٗf9bo3Yg5dޔŲe/jzG3ϸ � � � � � � � � � � � � � � @d˘n@�R"PfMzUNu%% O<qq6j {´bŊLi~Z6lؐޜ� p 9sW^ jѢڴi!Cs Ӿ}ڹsdxxOj.9\r]zZ\֚nx{Ia&Mq̛=њ2e{=zwj*W � � � � � � � � � � � � � � �>$p!xk<={ƶ4nZ@�/0x`}.u/C?C0W^:{&Nv2 @vءwyG|-;P Rnz?la/&Mn۶+*U*.M:U?]ಅYo믿ŋKto߮QF?ןAʗ/&l@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�L&@d&{L@ s DEE_~4vXu-sOGggaȐ!9rF|tW<{Nbҽ® D�H'OoqتU+j޽_);wNgΜI/_>%8Y"""d5~)X`C}ڼy԰aC�٧O@�@�@�@�@�@�@�@�@�@�@�@�@�@�@w@�H !ꫯjС Hpi'pY5f̘Libw\ٲeK;PZF�5kFرC-ZP׮]թS'ժU˫}ڵkO?iҤIZhʗ/nM{Vڵo � � � � � � � � � � � � � � �  H# �ᆱ_j߾>S(Q"z;w7'L fZ+VQFڴiTi@�,l2M8Qn:CզM+V,3O!ٳ5sLM:U;wT͚5u7ꦛnRƍz~ @�@�@�@�@�@�@�@�@�@�@�@�@�@�AfO�G�kEo׉'[w!~=)ѣG3hĈ޽F"EH7$s…/QLK �!uV{}Μ9:uj׮kV-[5\RJebۧk5k(o޼jݺnuQ*U @�@�@�@�@�@�@�@�@�@�@�@�@�@�@ I^$@�Ⱥ4l0}jذ{=5m4xqzJz] ,_]q28@� DFFjŚ={ `p2׬Y3hҤׯ9rqF� ={V.]%KG k͕+7oZ۴i#{̞=e@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� #F�@ Q˗… u7pH p\ **Jƍ+7 _|Q Nyc~}~nk~< � p9sPHSppjժ!4h uQܹ/$@Μ9]+Wt ׮]++U ~-ZQF<@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�/@d@ L4IZb uIO>Zll=z >ܶm飧~ZUV=z({o|& @ ;wԲe\@)9rD Uڵ]`5jrʖ-[J~2e_?YFVEGG@ ʪ>6nX!!!fL@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ eA̋@�~I//^Zj{wܡ kaaa9r+:uJ}հa\UzyG5|-]ǘ@�Y`.nԭ[; RW([s Ni'`7o֦M\uU;R+Uu&˗OA2 � � � � � � � � � � � � � � w#� 2+V裏>Ҙ1c\PSu뭷Cʙ3gDwݻWƎ_U+Vtawu/fzSy /СCWO"�djpmذAׯ׺uvƍ?\(MH".244Tgճ_tidj#&_.\->Ƕ[Ç݄,>W]ujԨ5kmjՔ+W.4E�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Hw ӝ@�'Nh.pʝ;:w, l۶ iʘ_T?k„ ZpͫnݺoW~&O]ɓ@�|D **J۶mBnڴI[lqzcǎ`+WN˗!!!*[l\͗/̊ad[޽;ܹ}&siu׮]:w=gV\YUVu"H � � � � � � � � � � � � � � @t� @F ۷υ!?"FGG~.B!5k)٣sj1c )X:uꤞ={nPΜ93ulWVzjժ8  XHYPm߾UO~GFFM*.L2*Uj%d@qϰ?jk݋},�=łs "Pڱ=Z()a- � � � � � � � � � � � � � � � қ�  XάY\XiӴef͚jҤ7vArߵtRW,Y{*[l.ز]vjs"'yL+B4=] �R<]v>Zog{ر=ȑCŋVhQW)`PBkb:zI?tgٳg(Ywҥ]pgkʕs�рq� � � � � � � � � � � � � � � @z�  ޽[˗/י3g\8d TzuըQCW]uBBB\ɓ'gi?eu su.PT)5m4Ze޼y|l9s:E� ڿ8અھ' ,\ ` (nk/_>xkk [eVp:uꔫ'O_-܎-ȑ#n{q73{zO t}Z-Y1 � � � � � � � � � � � � � � �"@ Ɓ� DEEiӦME ^-[ϰ-<lٲ*RH\pܹs+{ ve˦H;w.AA@oNP?~,B)=5kTҥ=CbJ*{O<h@�Ç'Xgxmq1H &ڱOΟ?-2W\ncvl&-0~&xHAAAnd.pT91FGG{5휭+~pW-,STq&i [Cz9=[[_GxRc< � � � � � � � � � � � � � � �i@�2YТՋ&ܹSvruϞ=*Yp5k\ؒ]0dDCZR|B,r*Z Qr\0%J )SF^) � Zĕ @@SNm-\O}{Z)(~' nL,16I̔vńC EB=%=<<F{Kۚu6秞zJ'NTNGŊW3 � � � � � � � � � � � � � � �d 3ͫd" �@B\hcݺuӿszL ӅN@�@ GjվVJxBz!_Yx~M4I>U7|S 2*@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�A 0 @�@�? O_F�RR7<ݺuukРAe˖,, � � � � � � � � � � � � � � � w'^ymR"Q)*QQhHVP=}fϘ cyfx/ْmP B%(%?m~S:y_}~z=� @"ZhgϮI�P /Alqƿ/k׮qWK8S @� @� @� @� @� @� @� @�! z<G @�os)uJ�@~~D:Wyҽ{?~|\xqGn<6 @� @� @� @� @� @� @�  +SP @ E… +i"@�Rd*/<u֍o&l=z;/D  @� @� @� @� @� @� @� @@ub1q @r >Uj @�B+~QF[k׮N[ @� @� @� @� @� @� @� @�j) Z>V"@�@ͳ̙S:�(u:uJrVZq)[o:u>}g_}U`  @� @� @� @� @� @� @� P SX @�*&g bN P"jWiժU<q]wcvF=K%@� @� @� @� @� @� @� @�!P bjƃ2K @@E4l0駟cƌ1yx饗B8dE<c @�#YxU=2xxwѷo8bUu:&@� @� @� @� @� @� @� @� \ @@Kb=Ν;G֭iӦdɒ8SbM7m&tzB9D)v5f͚]w?p<S;Ĉ#*R @� @� @� @� @� @� @� @f1? @�m]7.Lf͊ D^^j4ڵۯv @ҫA ov~q衇Ʊ˝&@� @� @� @� @� @� @� @�UR@d|l&@�GM6]kՋ?|8I�ux=R66lX1"{q+2G� @� @� @� @� @� @� @�JM@dQ� P6`8ӣnݺk̲eCYy' @�n5_x'O/'xb|m$ @� @� @� @� @� @� @� PJ5 &tC�!zjq 4޽{ @@ ^5!26m4nx'w1~7 @� @� @�N(��@�IDAT @� @� @� @�(A  @@ufmb:u6tzv @vS#0 zc=o3<3rP @� @� @� @� @� @� @� @ v$@�T[>;Vߊ+C] @@^׵klfqwߝwy7n\< @� @� @� @� @� @� @� @�!PcK  @�5TC-Z68W;� P1 ȜcҤIѾ}ݻw\plٲik @� @� @� @� @� @� @� PAVG  @@ .H2dHԭ[wbt[nJ @�' Sj #l2x_^{m3yP @� @� @� @� @� @� @� @j W#q� @ |ɱbŊBz^o�xj(p N?8qbfݭ[ @� @� @� @� @� @� @� @�J' &= @�*[l?֭[7+hٲeѷoQ* @�L ?;:u:t/bWC!gΝ&@� @� @� @� @� @� @� @�.  @�W`Ȑ!|&MĮZyU g/;vlL:5v?J!@� @� @� @� @� @� @� @�% &K�{wlYRSS"$f]S}_:(C%K @� @� @� @� @� @� @� @8!@�(C+VҥKcűlٲl;nyiQeX~~~.{ӧGfZjԩS'.u-OlAԫW/[Vp eȣk Pm ^Y+xkkhԨQ 6, <3bqwGΝp @� @� @� @� @� @� @� @lj(!+C�>)񫯾/2[:bo6-Zi]tIR_K,)\j׮׏ [ F u.lQܒž6dhܸq:Tj @: ̚Ѻuĸq={V>87ߌ뮻.N>@o @� @� @� @� @� @� @� @uKpK @�-|/ snϟ??,Xi]t?.]XZjFmZa:S[nRb I,X4<q 6zeKn;[nP:mSc;c9&RK~~~%.e˖EnIi;.fY42mh�fNy,\ptZLM4Mvnl͢YfQt%F�*@7kqm۶cE]rJ<3qM7e %% @� @� @� @� @� @� @� @Tj( :8z @Rয়~-g)l%=Rc  ]Sa LUSأUU~ LA_u7A;Seі3ӳm޼j[l-ZȖԙI(O>h."~3=,{ݻWI @� @� @� @� @� @� @�T AU1)�͋>(fΜq̚5ku \5q7曯o֬YӒת@ L 9wu.tΜ9+~glٲ‰׮];l2Zj[mU:mn:ڴina=6 @ LѡCĄ 첾ռ<A=:/~Q̘� @� @� @� @� @� @� @�]@d�(M_|1cƌ,16l K)1--Zւ lE`ŊYXٳ#)phh:|ž7o[ou`ȶmFv%mׯ_Z @`]ӦEl}oDt/N ;.ׯ_zѴi.u� @� @� @� @� @� @� @� Ra  P)qZAѻᄏ:@.Xp昂fH{.M4)B"?,4NA)>:+VZѲevmCv۷o/$q Py'SI"vܱ ^ K}bQnݸ{gϞJ% @� @� @� @� @� @� @� @@uY9 @�j"gɓߎ)S?lBS@^.(/? T Өi_|E` )tO?8j׮ڵ+-;wѰaÚFf o.�2 ^ z ̝;7;xg/s=w={t; @� @� @� @� @� @� @�X]@& @�e,|x hĉo.sFn֬Yt1 KlYd:uʸ:\ .!y(L6--Z) }ѥKڵkNѭ[hӦM嚈j @L&MG;" d++ /0v[4iҤ90 @� @� @� @� @� @� @� Ȳ3 P ovꫯƄ %KDÆ `;fKn޼9;!{ɓ "ӹ!ӲnEϞ=EijoQZ^x! ׏?~UUG� @� @� @� @� @� @� @�UF@dyT %@�UC믿^z)ƎƍӱM6$vu,@g炴]v%n]v՘* To6 [8qb^I&ˣuY {{WNQN*23e @@qWӧGo_9sc>83ק; @� @� @� @� @� @� @� @�L@ ^ .1c3<Y]t^zesݻwBkժ^c�&x,W_Z_|Ř9sf4j(>?񏳀V?]((Ԋ>fz^zi\r%1p[b7ޓ6; @� @� @� @� @� @� @�(SAeʫs P=&M#Fz* K=z>}D޽0 PyRd |cԨQ1ulb}C9$[7o^y'2^y% "f̈hJY >:5kÇN:p&@� @� @� @� @� @� @� @�j, ?\S#@�%cƌx 裏bw>8իW4lذ 'dO>d<1wmCF+*C @ƍcY"ZZί^LrK <x}t? @� @� @� @� @� @� @�@A52(+Æ ÇǼyb}?<9jJڍb+Vc=>`vխ[4hP{ѢE*6# @ bĞ{Fγ2lٲe_*2dH\uUQ^TZ @� @� @� @� @� @� @� @ Hy @ϟzkSsL/7n\�J {wqG;qA)ڵkW @�+0fL{G̞5ס"f~}']tx ZlYe� @� @� @� @� @� @� @�Ԗ*ДL�B`qYgE֭[nB>9rd}B ]@Ϗɓ']vqGk V(�O ?9թSVg4pxWb޼yѭ[R95 @� @� @� @� @� @� @� PA%@r ~atIѩS1cF1"LC7߼:O;S\wubS8 7ܐC^uUxУ[ @`}rA 0{7z/ܗ  @� @� @� @� @� @� @� @ 9L  @JK, ͛Z<cѧO+G}4fx{XbE<&Rٳ˽>9s⦛n~ş^nwāX0uD߾}.>`] )N y7FΝcȑe> @ }C wϹ;vVMfJP:KhԨQ ><?y 󾲾`{K/TP:_M @� @� @� @� @� @� @� @@,F @�%[oEn{<~,2"͘1B.]ӧOaÆśoyd IaHQFea% 8*Uwovi{gbw2uǻzYf8?c ߕ!Cd'pB|?K @(x=eNT=mSN-tUzN4)^HU׿z*}ѣGήΝ/bL22u؛$@� @� @� @� @� @� @� @�RY*:!@�UG`ȑnž&L>}TAvi^WO޽{k0 ]|k:]Ƿ~83K4n noV ,X:uKEgώfA~l6q7|/"J8HzsΉ'ɓ�TF�e+˭.xM>+MxZ`޿Uoݰau]G[jݲebkXbor� @� @� @� @� @� @� @�JEj_ӗʔuB�jO>?O+/VJ6mTh]IΘ1#>蕂uOyOL%iocԨQbŊˋ;Vx ll&j{o̟??N9!7n@7.xeC1f̘H;{c޼y4u @Z .g$yŽK^/o&MDzUֺu;vl 4(? "pwKa͛7TOqm]狻1 @� @� @� @� @� @� @�(Ӎ^ @�.0{8c??cȐ!wy',D.-X {xk~8F[mU\ve[cQV<xpcɒ%qiA_WqΧ`t<R]tQVG:RfjsjzףQFq]P?3gΌW^y%6xzOS{ѧOϳ9'qgDc׿5<-Z]v>;ZljNkB?'OܒaZ>֭[i{'>OR)h*t'g+BzcL81Ram_~s-i@U^aÆy/r[IH?ϣm۶CeK :th6cJgqGsoKo~O)3ՔWӳ/d ?xvK.+];d<HN+ ;)X^zEzU#@� .[8~Ž{87ǭO?tk.?[l;5.]S';sp wG:ڞ{{n=:^IBG}I[ }wYC<04˲JOo=zYgǏ;6mZJ#u~M9N� @� @� @� @� @� @� @�'P{nw7 PUR\ _iK뮻�<R�$w? .̂RPdj) 'Lwر0&-{я~%\pdgՖR] (:#K/.bwς$SR L~?VbsLԮ];x~Vx L46mļybvˮO2R0/])Sa {<#@z*^},2C&'??Y@Q -Ms9Ya OLuj >>⎥"/.LsjРAydY'%sWF߾}Х:*͚5+ź> LaQ)1!NJv{w1f~xL6-><#/ں~O=\~ٞy晑4nj-ZX\0W'+$;9tM^$U)�O //i^Aڿ{w}pBO:kYۻ. 7.{xo7ӳ4>_|E_G cTOj°wԩSέ _xx뭷pl)XI&kr]x @� @� @� @� @� @� @� ^ ׋ @1"R]:u*mѩX;,;tg)/83|~e0t2׿ή{Ÿ SQo?nܟ<;vlp` {nZti{_~yv /ݾu K}<v6PzRP ҥKAS dsZtiyYe7.YdooK)))c߷Tˍ7ޘra=zFEZ2_ܱyUWeCw9Rg ׿L|1k֬lRRji>`~W裏f!g}Vw L4=W3SK!)pC~SSM}WYTz=Xvl]>Xs狞L)4h P6˖-/?}P{hE{=dN#NO׬gm}ꩧfä7ͮ>c)1:7</u]ާ)<;}nYtImmue˖ѳg{Y׷ΗW!@� @� @� @� @� @� @� @@M]&l @ ̙3'rJ?Vc..Z LzK,!Cd7tSN)/ŋ R@`j)8h;#Gfs)衇ÇgAF)3Έovm.ضmH<~z0{[Rbj)h{-Zd {mQYT:RK!)4)՘ S^Xw Luώ;I۩ژ=;?K/sn8p`Vo ,idMKScmf.X3~KigBS/[3gL–5(),Rg jӵl4i$;}ѶlٲlUVEW& @@<ݿTA]j5;S^O雧$=k{ץpޘs-}-_0,9Rz衑{V&Lss΍]v% vNaguVˍ[bfaGuT\pwjEdl @� @� @� @� @� @� @�8Agod P)X7,1r(j߿n:,[nN;ӧg)hs=iӦ=F+N殻袋^˖'F?Ka%i)GЙ+;t<jRPd cZuF=r)4uhܸqaͩ)Sduwy}R[50W{Ѿ;V|n]v r~кQ^\liݻαJ{*Y_BSKϽh@RWh P6s|Z{F) +{{=mE;ruoC9$F}s<Ys }[eع{[4(N8cYEot+8?#}wNEØ @� @� @� @� @� @� @� + z @�*'wqG̞=VeO?=۸Gc97<~ VZe[lJoXtiy+4l0W_]V;^܁ٳgqGW_}|<s+] ljڴi`YfŌ3VfMs(zQ;!Wm|Je?W{Ί;V|n;2˺=Y~H;v\SNq;t 6, eMo�F`Y%>({8Wmi|Ϯ⊸K㎋~;?Ec]w Y: {~8ꨣ4+v2<xI'?znCk @� @� @� @� @� @� @� +CQ( ;ǠAbٲee1D3mqGƍ ѣG=f̘ci^c?wB?#Rpcj۷788qb=YG}Txlm)|sύ͛ǝw#g傚,YygZqshРAU 0^z)~_vKmOf))׊;;zѦMҥ˪~ ZWKT.\v=e~?gqFvǓO>ҝ)uYJ'*N /~x%*M)V ~Y09sHsA[oW]uU}i qyeA޹ִ>묳@~7oKlM1~H)<WV� @� @� @� @� @� @� @�* <TC�LN:q}e;rH|e6tW_e S={vv/Swmƌ_|;SQGmr7Rc v|s#5k, LΝK]tEgל~YPc dqgF{mF ^ƽޛR}+[l2[?YXe OJK q_/'wy'~daH9ssivꩧFFbqč7gyf}qW.[z̙5uڙ5kVv,N;.D ,Xvc{.l7l~g?! ]~]R7ϟ]_nl}<~+#<mŪ}i?`[n%>Ogo6Zӭz<'sNbpTwoWmS{ޏuʽӺ$=zծ];wH ]Niv=3 N۫U ӽ_6tHAWZeP[ne5*;#Jae=  @� @� @� @� @� @� @� @]\ZdKխ~ @�RH!)$oςvmjJ믏Ƃ bĉYcҤIѭ[Kg6 ѰaZhxnv衇F Nw1ӵO<D$#G0:d/R]wݕ=̗GsW\[ub͛7tS>O3%祰r裏믿O=TwNÆ j6mZ)x1Ֆ#^l=h}oȑ#[o5vZl;vlT{zF4СCc6R8S:Ceo>9昬Ut#c˓O>yָ,S@Ԓ%Kbʔ)[g\sMv,=Wol[n 䕂#o,l19u)Rgj4~O[2dH.Mo8$~�De<Y0ez?O*ӟRp^F*Sj!@@u_Nmwsz'>W_Qw^<3ٱׯ_5}@풼7UHPZ L;vXw^zRKZK7.Hu@?8'ڴi{+wY6XI8}^p1~l?h @� @� @� @� @� @� @� P}j( ]OWZ=�( BS@I'&6k֬,>ΝkS <yrԶm\7|8}Z cJ"/// 3j׮]Ԯ]{.5)\1=Ia_u}{w1sP+ \J;9SSz,Lu=8={vl+7woY-[iɅg4hP8l /3ƒ{*K.>,Rdel)+UYg  @ڵYѫ 7źV} 'Yz.\06duxp Xwַ"_|18,<7j{ @� @� @� @� @� @� @�XOA v P|2dHgC-6T*ϱ"jK^Ѝ7QF>YQu VvEյZ!:w)sĈŝ.4 'L]vYfrG[}k P>[l]|qhх3QT`̙1`裏>}x:'@� @� @� @� @� @� @� @�[1� ]v1cO<ꫯ;.8ҥKe(JзoرZkoРZWɊ/Ȧ;튪+3occ=6f͚vZu~9S皮˂Spg 4M>SLvڭ  @.ulZF붼Zn/Bp qĵ^gyfya< @� @� @� @� @� @� @�(cZ+ Zi1pw=w_i @<F\sMֳg8㨣MgƪAO>d򗿌wy'R8A+͛W ^{&L6mđG+EmQD {;bذa7~83ǘtԩ+Vtر{xK/O=_+q_~y-<%ޅ @� @� @� @� @� @� @� ~  @Z ̘1#nlO'ѯ_?Wܤ/^i)ښ4iRtRl@ȍ6ڨRREL:5z衸cĉY0'6lذ1ˋSNy7\͕͚5[XUycnݺ9_* w:u*Tb_]D� @� @� @� @� @� @� @�- r u@�@ 3fLw}Y_|O7:رc˖-_|1x1bDL2%ve8p` 4(ڶm[CeL�Sk#2+g}ZI&ŀ"}?#ѵkb;]|y|qwǰab^  @� @� @� @� @� @� @�T Ȋ* @�UB ???Ǝ=c1ufmb>}d˖[nY%H@ <yr5*{lYhQѿ8Ccm7"@�J%pUW_1sf*K1,0w8ꨣW_o=?FH؜Ç<pv @� @� @� @� @� @� @� @r \C5 @L>=|xgb_Fǎc=#z%<<M$e˖ń _̖1cD j׮]?ΖڤIbS_Uv /@z:4nƸK /L)ފ#GFϞ=Kأ @� @� @� @� @� @� @� @AVq  @@5ˋW_}5;vl.`h޼y#vm޽{lhB {+dMŋ޽{gO_gBXU+"n)W=c p Y QG]vYvaYO?;w6/ @� @� @� @� @� @� @�T+Aq 1iҤ7n\+N+Vm;KNۭ[@XlY;gĉAѭ[,gϞ{DVlN�9/#O <L Ⱦs=[ouM9 @� @� @� @� @� @� @� @Z$ @@X`A?>&L-i{zAbQ lҤI;.;v-ܲOLY >1eʔ<yrB Sn]v͂e.]DzʹR @@yÆEAvyf$<?r,d2է @� @� @� @� @� @� @�X 58C�_ؽ1iҤHl7lGNubm͖6ڨ=wSM)1-)@uҥQVhӦM[ovQn݊- Pn\qQ\nC #<2^~;D)� @� @� @� @� @� @� @�$ !fM2 @�e.ШQ}ݳ`g.3ovNw>l̚5+VX]ڢE,]vѶmȭv:Wv]&P,Y3f̈> [u LAկ_?ڷo)qY0jΝcǎ!=V @#)a XI6mO=T 2$8∸ϯ$)� @� @� @� @� @� @� @�$ rM2 @�&[FZR -ӧG K{)<o̘11sX|yv}zuѦMVZEZjlVHhK?lGE>+ 6M@ӽ;N:СC~ǂMK�K Aʿ^Φnݺq7F >s0[n% }� @� @� @� @� @� @� @�G@d8�( D.]eR^ cƌvZ套^ʂ/^\x[PȖ-[F-ɢ-"7ooyl٨|M|駟fa)1)1<dMv=<z뭳�~o!yy [u?yl1hР,0ʾg\͉� @� @� @� @� m��@�IDAT@� @� @�U]֊VZ8z @,2͚5+ K}%�*Y5iҤ02C6k,6lՖM74R_ZRФV?~̛7/#-s]i;8gΜXhJjذa$Z4D4j*juN#@�e!D<teѻ>)S7# QR3 @� @� @� @� @� @� @�@4s!@�M ޸N;,0:N:uU#S 4 B!zM6ƍnԨQlƑ[ܒRO[dI|poVZRc:W_._~eiY`A=~'E>۵kТ[l=\m @" >]v٘USN/Gz{7>Z @� @� @� @� @� @� @� P# n @j$)tͪSy篶.F駟f\ իB!z 7gl-龴]tB%ԩKunIkժeŊQܒ3VZRbزe"-K.]i/^xu:hѢlI%jO6)Hsͭ*:w\Ι LlY�d @@U(xϫRj-l3N=߿\{qYg @� @� @� @� @� @� @� @�,K @�kHii۶.[!W]Ra C̅ Xq)\2/v.1΅5u Y,[ԾgA@k JֹɴsEC)v Z6jhؠAՂ0s)1lFY @�P e$d9kVH_v[t!>6mZ\uUYj;@� @� @� @� @� @� @� @�* \ F�X] "6m4[V?[G?b(Q @A ȕD*pda|{q=dAګ^g� @� @� @� @� @� @� @�Ov e$ @� @�ϏS4{WuX=zxעW^1s8Ms"@� @� @� @� @� @� @� @@YeB  @� @�+ uge{ #^~/Ѥ  @� @� @� @� @� @� @� @@ w @� @�[ /Oz#֠zxk׮{ǃ>Xfo @� @� @� @� @� @� @�< +ϳP  @� @{ Gԩnqq hܸq92N88#+"O� @� @� @� @� @� @� @�[C� @� @4Rdmo>JFQ =믏.9眘6mZxQ*Q?%@� @� @� @� @� @� @� @_wW  @� @�''rkC㣏>x 7n\Q̞� @� @� @� @� @� @� @� P0 @� @@GԩS/ƌ'O^z̙3kM� @� @� @� @� @� @� @�% K� @�XOug=ޭ[x嗣VZѣG0a @� @� @� @� @� @� @�(Ceط  @� @�JI஻"& L3gFXG-Wt,>:bRX75Bu /đG{Ws=ѯ_1w$@� @� @� @� @� @� @� @@y ,oq @� @�~Fj7Κ/^y4n883+& R?իWy  @� @� @� @� @� @� @� @`| @� @�"v;#u[u P@ݺu[nK/4~9+]:jԨ0`@\+C� @� @� @� @� @� @� @�%Y2'W @� @�*\c# rҹNZi'X7Mu]q 7O~o{'O˗E]+q.$@� @� @� @� @� @� @� @�A% @� @�QbӹcYyg|dz>cǎ}'xcY7i}.]K� @� @� @� @� @� @� @�  @� @�UD]v*ʳ[o]yG ^zŸq/}7ΝyyyYW Goᆘ6m= @� @� @� @� @� @� @� k7q @� @* {lDݺW~wm6Zj_}UǢVZ_! @� @� @� @� @� @� @� A�r� @� P:* Vvs~/j!i s=W� @� @� @� @�Ҫ@zR$"`ؾ(h^5XW1jZ&kDԠ HQ@APޮwJfk9=g}~>/,֚ @� @� @� ȍњ @� 1 4kѩSDQfWraEԯc_sO,ZhU^�=XxJ8A� @� @� @� @� @� @� @� { @� @� !pWwbYy4tt?D><u� @� @� @� @� @� @� @�)Ld7OL� @� Pŋ3ڵ#=?( C.7|3N\<Zjը\J]dI;̙6N @� @� @� @� @� @� @� @  @� @@h8K68XW&aBsqwǤIn֭[qWR[5kV\s5:� @� @� @� @� @� @� @�,/ ry @� @�B'T!lX~qȑ#_c=6Rdʕgp¸kc @� @� @� @� @� @� @� @|# @� @�E/Sƴib޼yW_ŗ_~uo>?f/T5Uk <Rx_QQQyql$Oz7wߝcǎi};6eqj_XixXhѷ+:ڦ(+U\ Zwem#V!@� @� @� @� @� @� @� @O� @�XqbذaƌS\'M ϟ_ZFve+l6l[lElvѢE\7o[w1b ,H3f̈ӧYΎevX5*8qb<1`엮_.Y\05jך5kFڵsUV~IՋu.M! b-׏ @� @� @� @� @� @� @�l0Aލ  @� @�MM /}<xp{9P/9ИnmlDWjHaui{Uc]/㫯N4$rZ)T2M2$|ַxlrdv}K+vm7L!imgm!p4)SuSX;mZW,*Uo!.]D ?~|ٳg e 5zNUm=EbuB +w&m{l`e/bܹΙ3'R9sf|'y~bw%~nԨQ|nVlr-J\MG  @� @� @� @� @� @� @�lEK|IYM˪G @�lhGH+5n?Xcƌgy&^}xs^գC u]vzRF5.)nȑa)2SN<9@}7>s=s0U =P ƴ?q\'L)1!JQQQ4h R�7C t.m`]U)ڭt.IΚ5+mN>=oSf!5k.[Sf .,fJ)q5}n֬Y4m4o֭[| @� @� @� @� @� @� @�* Ȋ܌� A7j7"@�D୷ފ'x"z:thжX{TZ\6C~E߾}cر9 #8"u5k,chѢ7n\|GFSM&MZRrz뭿(*�fmtv~yM6-痂:?�Bg 7o^<wJ lѢŷo-C� @� @� @� @� @� @� @ , @�B@dx A�\?{'=ztl2z~x~6loذa9駟瀹;.zꕃ-cKÇ> FF5?.X ϩFv͛G)iӦ*UTNǏ/)�4M5JJz[ |'vqhӦM^J!  @� @� @� @� @� @� @�^@F@�( 18>l\/FFNGѱc <} (sAUVqik.n=ྡCƐ!CrM)�rƌy5k!~;CK)/mf#15sm ~ M'OUZ5w9ve⚂D @� @� @� @� @� @� @�  ϥ @�MA@͑�D`…q}u]<x衇F*U֤ 6vmq]wEj⬳ΊgV[U9ˁO0!yxwc?>߲^zѶmH|㎑6m*o]>M.:bĈ 9lذG knݺѾ}СC[NQRMHT  @� @� @� @� @� @� @�_A @�N@d{dL�P/8ƌ'pBѮ]uxs 7y\xqEEZϟov?z뭼 bρ{kI&p4&rٳgG u4hP <8o紆k׮)sιނ^WN  @� @� @� @� @� @� @�5d. @�lZ 7m bvƿٳg\yѪU7Λ7/nƸkFqW)IH�_=wy'H]tN:kݺu7  .Cƿ0`@2Mᐋ-֭[>wk׮ѬY;Q#'@� @� @� @� @� @� @� An @�. ?!#@�u)`jxUW{7tSniӦůtP~9BOOxoV</ŋGvb+̙oCOvܹ9 C9$<t1<ms @� @� @� @� @� @� @�X_ ח @�* �Z`qqȑ#s9*UZ~7zj|qm~ =ٳg3<O<D<1}q]ƾ 4s4x%H } /׿bɒ%9�GqGG˖-Kڝv @� @� @� @� @� @� @�6IAc7i @@AJKx^z8cE? /㢋.o9.䒸+h;@W|cC=/bTR%:HAwrH4idm /sPSO'|k|ߏN8gz\FC� @� @� @� @� @� @� PNAa @�* >"@�u%׿5~GϞ=#רQc]j:+w>`TV{ɒ% /wO>dTZ5: zD @y8p`<ȑ#K.ѫWu)/4 @� @� @� @� @� @� @�T@ws @@Y @@ s=7~_e]Vvo=?=ܹsqby"1cF/'D=rp]nrdyH {7ܹs㏏}'vehРAՋ4-c%@� @� @� @� @� @� @�  ךP @�[@|͎�#?zW_}u\|9aL}ڵkpx\M0!ӧOl$@6jԨLXpa<q-K/K*U"sLu뭷mݶ6o<ZhC# @� @� @� @� @� @� @�X@d~xN�X ׇ{ @2dHt%N?馛6p6+qǕW^{`6mZ\uUq뭷FvK.=zDJ6ؘܘ"пO>dq1DZbʔ)1iҤ8qb)uԩ,u֍>vahӦMt̻[d� @� @� @� @� @� @� @ 0  @�J@䆒w_X__}Ut)RX *R&y믿>@ѡCjdɒӧO\|ѤIkCYcp3裏WU<9m4h`9yŸqb̘192Rbر"KR{_l @� @� @� @� @� @� @�& =!@�3Au]/cСѲe2"v8a„~~hѢLRP[ ߿i+lѫW|�ygDJV , />lw8p`/?><_+W.w's̉{,~xcƌ{KgyfL:5⓫IsHۃ GÆ W`ݻ1;v\i/7|s{]a՝_E @� @� @� @� @� @� @�(v/& @� @)0wܸsȈI&yo}r-ʺ?9|',Wߐ!C"͛7/~ B` [oѣGɜnH5Kv->|x!:={v|3fΜ!P|=#G?ӟϭjvѥK8묳;ȡ)LGSn[:eʔouoF߾}up`u l  @� @� @� @� @� @� @� 5Ӟ� @�hvo4sZL81>6a7tꚮAžݻw^x!6m}| ϟ9дFQS`a:u&۶m[Vݯ~7n~zif{E7l⪫|0_QkذauQ?1ƍ =zu]͛7.(f͚U϶nbeeuWv @� @� @� @� @� @� @�V' ruB @� @�<G}t0%C;B׷oOԩS#<2׿F S6ʕ+dϟcǎ*URZ*7t'9mqa\rI<ånqbvW^y%٢EU~߭|B @� @� @� @� @� @� @�M^^� @� @�ܹsqg?Icǎ_"ի .g}67xc|1tиcѢEq=Dգ]vq 7Dg?Y0[n%|͘7o^>FƍWo&MצӃ:(3pmZ_|qԩS'?GQQJۭ{F+[3}WqM7E~b̙ѩSn"?.4[vyQvu]8p`<Cy]5o<ٻw|7ވ{, }uYѣGΥuD۶mc<͔)S| S^[n}xG\[lGqDr!KB�xcw_[_q=xx饗SOFŵ^Oc LslڴiϞ=7nJUݷU\p1a„S#+#i"UaoSGuTwyyMpy`jԨixq9uW z\ί\O� @� @� @� @� @� @� t @� @�MZ`91u_*}RHE ;ϷLuӦMAm)2צMHi>N:)b-rxٳNn-~{#譨߫ :+빗5kN;: >}zsfIǵ.ۭʕb7gΜذa<ɓ'G MA)rMJ L{?瞋?>R䫯~ѠABLSa COOS_~qw59cذa|'%Ow=b1c"}袋CK/4I@ [L;3bȑQVD_ ֥Kq{ַoΤuWnՎ#[j*VV-[ó=LH6?rۇ~8R'w:Zj%y\sMl;$9pm6Aj )`|S)RfLwuW^S)2=c'] @� @� @� @� @� @� @�(kJeݡ @� @�A`„ y͚5+4(~氾xv#Fo=S0G})1s=x z|ػw:thy睱. f6sB#WGY+Β}9eV\R_y)+{F)oUk&+z+?o S蚖q*UaR^{핻I)3B`7|3i/a)<ry-VZ58.Z(tqzsNtg}^xaTT) rgJ L% }ʕ_~y~(**z(^zʚB!7ޘ{Y8Re۶msc۵k~aLa)0=˜2Sxaz?{wzu-3lݺrM4i5*>17*;)3W^yekkΡ+I-Vy~e9N� @� @� @� @� @� @� @`u_Z9O� @�H!q)Ȯ,HxG}tqs΍VZŬYƍQGv}厧pիG u[dIfmb}7jժF!;v[<r8u23fddTʊQ I\ݚ)p/NzKP KǏ+"x ^)00;.@tGiͥpn-Krǜ9sϟӏ;,ڵk=Xԯ_?Rpj*iIiMo⦛nʁ۷mG ELJ*ժU)7(8]QyNjǹnݺk>h|tI濲.{ܲc(] <>}:BZ 6!CuJ� @� @� @� @� @� @� @`u W'< @� Q ԩS',P_VeĈQn0`JLawT\y6+:>yXп*UDΝ_#GP] هY+5o<p¦MuoEhukfĉ1sHk[Rw|p?1N<Uvݲe|>#mN"3v=~ߠAci'@k*]vYy?z}+<8#f~{s)Sh+wTy>y0e¹UͿ_YlW4w] !e};nܸʺk @� @� @� @� @� @� @�(ש%j @� @`(Bjf5k֌ٳgG f3f7s K|I.[m6j=\a}9kH.wygYw]tͼpµEK.1x8ZիW]UÇϧ[nߣ[nq_hӦrT厧)37y/"&M癞݃>i?q.۴T)54ce7b-~-פ$wm oVs1e>˩STz:$@� @� @� @� @� @� @� PA%@҄� @�R\ Yfδ}K/4,YRo{.\ҝW^[D5/w8qb`=c4gWk&FNQV6lC ̙ʗ_~Y-6_p[}}ŋ0qN͚5]v%@ɞ={&szOmR{"P^}hժUԮ];y8p`tǏ~'?I|g^^ӧ///޽{ƑUئc;wNX; ҕe~xZ穤TӳIϴ4>;E׮]DzeQyرc^-ZJxY� @� @� @� @� @� @� @`뚛� @�R�Xn{뿢N:qm?Nn!kʔ)yG-w루(n?~fܸq@tpe/w|HA|L6K$'}ݷt3<3z1y\nͤggxCO<\rIO!vay{mG L,8I&ŕW^)>BseovשM6!C.,z?׿u?i,o/ZH|:unoÆ s?;sԯ_0mSHs~>)p2euH92_<H}|>xgQF_"[.};]NIOqƌ3">9rEc(tڥRhS8!>|xwyy>)83`dzZժU+,m߮#@� @� @� @� @� @� @� PZAs @� PN>ׯ_ <s=7_|1>xg;m&?xWN;ӧOꩧ"ꫯ�B8[ Kcǎ=3?B_*.~s%o1M%sN{uIlzk3jԨQ>|^{y'yehUkfm#o~GqD| ?XhѢH{nw?ywqu_Įۥ5I'ۤ5V[_\h޼y^~ԪU+^xc=bذa9@2KBSIiyF۶m+,YOzLR8i_z%-)$5cǎ}СCNy)\3Ս#Q^p믿 ) 3=ΙSk |r87߰?N9e]"%=C9$7}g W2a„Rl*w)]ԙޑΦuG?xפ[oE޽8scz<@^i v  @� @� @� @� @� @� @� !P]] /b*I� .f, !)w} @� /4i),K'ĖZlk >|x|Ѯ]}nSp` :thif/{nAI̧~+W-2yo1R.\0ZJzim.8`ԩS~}Yl˵I7Z`A5kM}c La)8rEeΜ91zhժUԩSI ^z�ɪUFFϭNz_N cef}6mZ^͚5-ZJ}4e6m4ϤsYMyO裏I&uxZBI Tmzw>HA)H7N<9?r0waKݺuz> @� @� @� @� @� @� @�XUM܃� @� P^8:̆R^Yֶmwкw^xamW Rh/~8Kdsj>}y>`\˲(ɚfmVMigݺu#6,R-*UD,[l7-vѾ}厥)2ƍmGi& ,veX7|oVvzWt1PJE ?~|tI91Թld:I eܹ9ߏ{/N̚5+`v%oEkOWInm  @� @� @� @� @� @� @�Hۿ]4"@� @�lp@r)__nEӦM7-Ez/^|v}ն))tSÓ\sMYtF}viѭ[z\rIjj)/?<yٳNAL0!oۏׅϦ0QFܾ}.G`ƩS=zt^]ժUcvG{Gta:_oM"@� @� @� @� @� @� @� PEKuIYxq_eգ~ @�6#D7ܟ�|[`ܹѹsVZ`:u|#k-BxWb^֦ǥ^Z?9Hnm\^~L��@�IDATqP W_gyZ g!|AԨQ#z)s-\~]L _{W8Tm ny督u9�2V\a }wyx_|H  @� @� @� @� @� @� @�Y @�l 7kj 1cb6mO?jZk'pF޽㮻V^J~r8O> O?X@g͚4?K*Uvk:HuR~e?'iqWBi.\qÇ6,a8cƌoXKC @� @� @� @� @� @� @� \ @�M\@&�L�СC-[O<!  Kw]s9 z-.F_s1!>ZjP6rC=L0!883]v9o߾sG}EEE!,XR>1* @� @� @� @� @� @� @�6AS4 @:quM�R`ȑѣG/w߽\" j0^xᅸO,ꫯ⩧/y晨QFK!vrHԮ]� lŋ[oߟG}4F;v'pBl+ɓ#<LJ~`|0  @� @� @� @� @� @� @�T0A. @`} \G�A`̙qq믿'?I&+c(cHp?я"A@.]T3<?-Y$y;\MQ`ʔ)95?#:c9&;,W_}5C>s92urM7O5 @� @� @� @� @� @� @�ʣ T� PAa( ^-ZW]uU\y9İO>Ѻu:xye]7xctA7n\ܘΝ).ݥ:a„<]~"~&0cƌ۷oxWbQFݻw=zDftڅ`Ȇ P}� @� @� @� @� @� @� @ݗ� PAAVe  '|r1";X⋣^z~%Kă>^ziL6-8*tV;!Cċ//rk1{fmb=3kرcTZu}i@ 5*oF~n)53QZ:"@� @� @� @� @� @� @� P.AbP @�# < #!@� '`[+x>QƆT9?7Ѹqr4u;EŻ+'O!ڵw=:uꔃ!wi'q轔ƍx;vƌQzc=b}5֭[wq @� @� @� @� @� @� @�I@u@� JAq�61Yfo5ka?Ob뭷$"R8>_}޽{\s5.lr+G}oV۹80͛mY0Ǯm۶wy \cO`Μ9{w1s̨TR|;)syu @� @� @� @� @� @� @� Pv RO @�R@FXM�R`ԩ?)n喘={v{ѫWڵkR[F{7'O;..СCܢEbĈF 4hP 2$L֠A;;mڴ-ZDʕ7ݿ L4)>x;lذ7n\,Y$jԨCI۵k;vp ']v! @� @� @� @� @� @� @�X +2Z @zݐ�*s(wof4i$N< 62qx'\nmtIqgGf6iny9t>|x)fEc/-[q}䱕.\0Əcƌcѣ~Cj@Sc!\4m6״*UT.b @� @� @� @� @� @� @�65A7_ @ \C0  @`H}w}w;,z [hQ 80SO=nԬY3O:H:^ӦM#FĨQrM!i>3g߽QF92r6mt;fHaJXdIL:5&L|I|Lq]MZjvE֭s`hڦ|'/**X�FK� @� @� @� @� @� @� @`#?`#@� ȵt=l)D1(>9DRJѾ}w}sc=I&?ׯ_ѿ={v4n8?qѵkר^z<9f̘BS8`!$0J �LaY[V[m\b-"7\hdnlS3r)SbҤIߪ'NT?X`A(jժC> iۢE⚞b.; @� @� @� @� @� @� @�ʽ r � aAnXw'@�/^{C ŋGÆ ]vm6Zj͛7aom:xK ;vl 6,{\R~y; ['Obv:o޼0aBLO?tiӦhի#S(dZ 4(ަGjSnmگSNz1d;gΜ:k֬Mi?8}MΙ/Zh9ڵk/ʙ:{X,g @� @� @� @� @� @� @� x @�։ uªS؄RXsMAi9\.T\8QF 5UZ5jժE Lr_~e|WΟ?8|. Ǎ).*UD˖-s宻ڬY|ޏMC`…1eʔ\SPac)p@~ZiԬY3BT5j|ra[Xim0l[8Χ�pUm IޛMsJDz/swMYQIN),P Lu--2? @� @� @� @� @� @� @�ظAn @�k- r u@�J$Bƌرc>|)1KA|)n� Kz).G$Svm-ZȵI&9hDӈ7,X)r9s&e )t1/ k:[lLeQTky # nWz L)Ȳj)5mԩi) @� @� @� @� @� @� @�(@6Ԏ� @� @` T;unge f嵚,EE=qrM� @� @� @� @� @� @� @�5旸� @� @� @� @� @� @� @� @� @� @4 K @� @� @� @� @� @� @� @� @� @@)A% @� @� @� @� @� @� @� @� @� @�,k @� @� @� @� @� @� @� @� @� @�Y 4 @� @� @� @� @� @� @� @� @� @�J# 4j!@� @� @� @� @� @� @� @� @� @�B@d)\B� @� @� @� @� @� @� @� @� @�( Ҩ� @� @� @� @� @� @� @� @� @� P A@s  @� @� @� @� @� @� @� @� @� @4 K @� @� @� @� @� @� @� @� @� @@)A% @� @� @� @� @� @� @� @� @� @�,k @� @� @� @� @� @� @� @� @� @�Y 4 @� @� @� @� @� @� @� @� @� @�J# 4j!@� @� @� @� @� @� @� @� @� @�B@d)\B� @� @� @� @� @� @� @� @� @�( Ҩ� @� @� @� @� @� @� @� @� @� P A@s  @� @� @� @� @� @� @� @� @� @4 K @� @� @� @� @� @� @� @� @� @@)A% @� @� @� @� @� @� @� @� @� @�,k @� @� @� @� @� @� @� @� @� @�Y 4 @� @� @� @� @� @� @� @� @� @�J# 4j!@� @� @� @� @� @� @� @� @� @�B@d)\B� @� @� @� @� @� @� @� @� @�( Ҩ� @� @� @� @� @� @� @� @� @� P A@s  @� @� @� @� @� @� @� @� @� @4 K @� @�*\pAiӦ\aɒ%ѵk8ո � @� @� @� @� @� @� @�R� @� @�O ,偍;6뮘>}zŋcȐ!QjH*|2 @� @� @� @� @� @� @�e$7R7 @� @�OxĢE�{klʕcԨQ1|p! @� @� @� @� @� @� @�Rv]� @� @�OK.W^y%,YR<XK㰌� @� @� @� @� @� @� @�2Y"@� @� @` ̟??nx7c޼yѮ]8sqy )kvZ4i$AN<9xe˖qWV[mU|~ʔ)qM7ŠAN:ѫW֭[>?nܸ{z7pCt=x7r'/tp} . 7|sTR%T#G}4y䑘9sfGrHU @� @� @� @� @� @� @� @ ,wĀ @� @�(9c=-"nƘ={vp qmO?{wy䑑GrJԨQcvm۶!~{L81Rc*cƌ:(.8CK/A}͛G6mrcrƤI"Cnvqg|{,_~x|q .IgqF92jժ6,Aj|zj @� @� @� @� @� @� @�?%KKY ˪G @�lhGH+5n? @ PT\==cǎf͚i+[nCUFNwމŋO=<KW^[oϏ3gsL4l0R@d*of瞱6Ⱦ}pƍLJ~SN4i/7Mu]ѫW|<cРA1a„r-scVbԨQQ^ܦsoǂ J*9@{nS~ׯ_s޽cuA� @� @� @� @� @� @� @@RFd@ @� @�X@x9.w}VZ981Av1TTTwum۶^z)4=XޘʢE"7VT)F�T9䐨^z�B93ꫯᄏ82L.\0瞸 {#882][ZByۥKۢCqM7E=}y_B� @� @� @� @� @� @� @@TdD @� @�Xs(-T;w·FY|jeA kSYdIb80FϥJʕvM6C=4훯ygrdz;Mo8묳[={O>9ƎGydt-͛W}3ܫ9gt(G%qiP`\a03Ӝ8njsg3(b)g%$Ijҕj]ӮhZ]y7 @� @� @� @� @� @� @�9! 2'A @� @�l@^^(,,>̣:u۵kW_ қ74j(;}7ΎW\߬ӎB%og?Y :4M7xc4h ce΋/ҼƎ'|rWEN @� @� @� @� @� @� @�n  @� @� P;s6s=WfI&EAAA7O!֭Xޭ[nѤI1bDL<gaf*:*to\~WF v%ļySNSfszge˖_u @� @� @� @� @� @� @�*G@d� @� @�J8г"<|ͱzm|AL>=,,1uv1;ÇǴib%tRXX}{^ y!O,бѵkw}c3fQN81H{G|ѬY8S7}$>䓬$h2XZj6F۶mZf @� @� @� @� @� @� @� @ 'A2(� @� @�mi=zt̜938믿>~7dȐ,0.7|3 t|wguV{q[o}[ߊ?0 L+V+"zÆ G}49g}6N>`o8H.qgv_pyƍKRI'SNN?xW�to~31wme)+ @� @� @� @� @� @� @�9'Wa6>u=@Eh @�1""Wq?5V� @&e=!Xn]lٲӧOlX2ׅ fቭZ**~YXdnݢiӦ~6mڔFQQQ.ټyҾ;Xzu4l0Ν/3N3_q  @� @� @� @� @� @� @�>5B� @� @�[n 8 o&MD߾}p|];???FO!iرc_-� @� @� @� @� @� @� @�YyF&@� @� @{7QX8P6lXٳzOB @� @� @� @� @� @� @�j D� @� @ [Y! @� @� @� @� @� @� @�5O@d[S3"@� @� P /8Z0US$@� @� @� @� @� @� @� @F ԩQ1 @� @� @� @� @� @� @� @� @� @@ Q @� @� @� @� @� @� @� @� @� PA֬4 @� @� @� @� @� @� @� @� @� @ A(� @� @� @� @� @� @� @� @� @�Y kz  @� @� @� @� @� @� @� @� @�  sxqF� @� @� @� @� @� @� @� @� @�,A5k=͆� @� @� @� @� @� @� @� @� @�aMi @� @�#VbʔMk-ZsF� @� @� @� @� @� @� @�\K @� @�6喈#6_l_AAĂe @� @� @� @� @� @� @� @ ZA!@� @� @ٖ7/oN8!q-_K� @� @� @� @� @� @� @�\++ @� @�(0h"N?}$@� @� @� @� @� @� @� @@N ̩P  @� @� 4h1dHDz^yӦGsG @� @� @� @� @� @� @�UA2"@� @� @T#֮-=-s"O="<� @� @� @� @� @� @� @�U(  � @� @� vXD[7Dvږ%@� @� @� @� @� @� @� @@ ̵Q @� @� /gQfb" @� @� @� @� @� @� @� @ A⪨� @� @�N;-bڲ)rЈ @� @� @� @� @� @� @�  sueE� @� @@ܹLW "m @� @� @� @� @� @� @�. J� @� @�8묈z {sG @� @� @� @� @� @� @�uAB#@� @� @TS#֮4??K/9 @� @� @� @� @� @� @� @@Y-I @� @�$w̢("C @� @� @� @� @� @� @� PAVR+ @� @�qY!n@ @� @� @� @� @� @� @� PW%@� @� @ VZ+W+Vd-^:J鸤}駱vXfM֭[EEEׯ_eڲe-7.Թ;{<VNuF~~~lO}/ի7l0JZAAAFEƍӻl @� @� @� @� @� @� @�2 g @� @�TsƸxXhQ,Y$>XtiiK}'lٲZ ~L)qk[ _L 4,1 Z nqkMc#KRdq&3iRt<[O lҤI4m45kqy-5o޼uѪU= @� @� @� @� @� @� @�,A5k=͆� @� @ `yem`… �|ͤR�c 4L%<㎥)0 6j( CL ǒ} wmʔ}PFqqq@ȒjժH-_!)8se5Sf t_~B!S8;Yk۶mo>k龼MqN� @� @� @� @� @� @� @@5YL @� @�K`ڵQXX9sDI;wnv\ic d8XcǎѧO,p0PSc x.A}Vw,S-I.]43qhѢl;SPoQO%[z]vY(dSNeZ ܹs% @� @� @� @� @� @� @� { soMTD� @� P>Ә9sf>Yfe-=_>I!mڴB�{ ȂK۷o6nܸ)TK%Scy?~J?~N2%ƌZ -RN;Tvye]k׮>] @� @� @� @� @� @� @� Pu ޛ  @� @�j@ {|w7k^̝;73ޘBRk/ ܹs�Y~ZfYg -}?}Q̞=;k)D4IbĈ`!Rdnb]w-vmhժU} @� @� @� @� @� @� @�AjT @� @�Z(rx77ވz~LCѽ{qY _׮]#vءWˋve_~[nŊ1sH3"v}ek׮͞k۶mѳgl{D޽8N @� @� @� @� @� @� @�Y@6y� @� @@Daaa1yx_Rc wgD=v-7nvH] uLmmݺuY@oӧOZ 41bD,^8=@>}^{핵7tN� @� @� @� @� @� @� @`kyTC|v  @�H?UO>c @�6裏⥗^_|1ۧ�ȅ F^^^.ѷo, /+wu| =y7(mSLzhذa~z^ @� @� @� @� @� @� @�|Ao  @A> @ oJ 0aB^xᅘ9sfԩS'z)_~Y{M6mD[bB!_yxcɱrh޼yٿ8もZ.f @� @� @� @� @� @� @� ,� @`A8%@�j@ {g6~XdIi&88>M47)_U`ݺu1mڴ'N;Ջ/ .կ_ @� @� @� @� @� @� @� j|'@�T 7 @` ,_<~3fL<1gΜرcr!q衇fmvy#$p˜0aBpԦNY GuҥT @� @� @� @� @� @� @�O@dE� kқ8q)nԨQ88#gϞ5n&D -Z>1v,wq'fW^TZ @� @� @� @� @� @� @�T J50 @fh @ X"~gmq'pB 804hP[i̛@ L2%Fɓ'gagqF֥K*O @� @� @� @� @� @� @�*KNe l\ @� @�U%BoGv/nݺŸqbΜ9q뭷G-{ @߾}믏W_}5f̘guV<ѵk0`@92x @� @� @� @� @� @� @�q kܒ @� @v ǨQ}7͛{o̝;7n߿N&)ꫯ^{-Lz??viկ~|I@y @� @� @� @� @� @� @�/ V$@� @�Q|0 ;쳳 lm��@�IDAT3fģ>'pBh"@`K}9sOӸ뮻@믿>/_G @� @� @� @� @� @� @�V r)� @� @`c)SsN 2$f͚7xc} ~qǴi;#GFco2*&@� @� @� @� @� @� @� ȍ0 @� @�Tbw=f̘_}4k֬J&P\\ c95\{g̛7RV6 |SN-[V ,[o5=,+ iǎ?�t^[^^^xǰa+#8" $@� @� @� @� @� @� @� A~eB @� @�lOŋQGÇz*?D֭g kYHݔ)S"om͚5{ş:uj[RKV6 'ħ~O<D,]_oȘ>7.ƌ+V汾聴γf͊;3fΜ)*:uӧOuF~^ʒ� @� @� @� @� @� @� @<D� @� P)o|<yr|_26{g {w㭷ފV Ĺ.V$;vw^ٳ_pƁ}#.m<u.qHǹm68sF<쳹R: @� @� @� @� @� @� @�K \w� @� @@ 2$R SO=M6́YB-yREGraͼ==;G1nܸ(...}CSiUNp yyy_"㏏SF.]p. @� @� @� @� @� @� @�'~3<" @� @�j$pwDŽ _ϹUVŘ1c{#GfaK.{,z5jT<裱;fv۷_K/eЬY~M4)o޼yyիWo}}~ѱc-bQQQ\{H[nȎS-͟??{]ݶ4ٳo摂nݷ`kʔ):uYqQG#q1}H<cΜ9Y@_xcذanݺhӦMfX2ĉ. /;/^8XdI :4ndzꩧ̙3sqAE9l>)d =[^X_?38#<Ə{W,\L}~x糿 <HT @� @� @� @� @� @� @�[[A� @� @n8ӣ[nU_F R_qqqv5{EeAGqD<쳱bŊ{R�ܹs;,2]wGK/4/ ~O_)0  /dlG~~~4j(RI')0/m)뿲N<pM7ݛ֧N:Yw^ >|KC|n_ <s͛ *3N 7G}tܘ<Gׯς~, 1GY_qP`r߿+zڵk(;|n}幐)SM\rIzqG L!)1C{QXXzҡh}N8l>o}[إn8Hᘗ_~y4l0 L!%ARj9}ɱm۶YA$ ]5kVU @� @� @� @� @� @� @�% \Ln"@� @�J8y8C-{v+{2S߿f}W_}u92 mLz=\_n?Ϗ7.Rxd߾}*x,DwqAŝwK.׬YSl:H^> 8p`ԯ_?L/#1RX 9'7> {_ LۑGx猲q衇\=jM[ K/΂S(bAAA6w=Hu]K;mڴ)Of3٤u/\m=ٳgPK<3&[/ĉI&(om}R`gӦM#2&tAw>[ZhQ|͂*9+f͚m;NiK @� @� @� @� @� @� @�VvuT @� @�rXAU ӖKǧ~陃>8sH)LK.qDž^=СCN%D kܸqYAC%իW=ܓ<oŊѭ[Ks|Sm]vBgϞÆ /*gٲeG-ԙSmuԉիWg}'Y7o|rp?> L)<1m5v)Zj 摂!;w-[vyhذa듂 +Jq `|C)2}vXl#}),3T @� @� @� @� @� @� @�:3Q @� @�T@ kgl֭ٛ.X~}sk{lvG})$1!nP?zw6@+Y@~h֬YL4[{ŕW^|hѾ}[c]wѣG{9\{M<9-]KӦMK_u_~,]4w,xsРA_uȭ>ixfz ڵkg˻>qiܴ ~C%CEz_yYxgoK @� @� @� @� @� @� @�e{:TF @� @�Z)pǽ?jO?hѢExmYgl2;.,,>;uꔝk׮Lwk֬N:) ;,بQO"nvmuk_ZbyieIVqRmi{7ʕ1^z92:8�Ξ={~١*϶2JL^x SeT= Ni*u'@� @� @� @� @� @� @� P! +  @� @�-pgC e˖U)�ώ?0 P~۷ovsϕtgI&EAAA~x\wu1cƌ8S#4dQ\\\r{L81/s$D۶m;#RHߨQ5\nݢI&1bĈ<yr3iCƬY{YqJO?y~~~vB/Ӗ X% 7ܐr)Y׊+.%V~kcg}RdKQQQ*7ԧOļz]ەX'^{m>z7Wq%^O� @� @� @� @� @� @� @ oN @� @�*xo|`*KBS`a6o޼?.> ;^hQi_:袋" 4(vi2~dRիkiӧ5\-[.\R@^r_^xawGӦM#8"~_vZtMe޹-9s1tֆʮ}{r!ӟ4Ҽ]v}78HO>d\~3deޑ斶;/ƌ'|r,Y$Ν<HfQ$FW_}uK/GΎiomYjժXre̞=;3'S-mY;fcÇǴiJxl̒}yo}[Y ?a{?)g׿4\R~MkڥK\(K  @� @� @� @� @� @� @�%Pw/T\w#>iU @�j\H?UO54 @�*hذa 2$ �x3$^{=ܓ믿{w 6,zW_}5;,0un:&NB#rO|) wމ`~͚5qģ>)N4)vuX|y6fzן׿gyf<ke!)cӧu_[�RSeyT_ _L3Y`n!իX;?]5jTYHG}YnݺO?ƍ>9lݻGvb:H)[ncf.)l1n:/f>kۻロ}3f̙̈Ia)1>N:5S3gΌg_>ׯ~8[4n Kc:?K)3\ #Sb2Ia>g=9ZW喼|c=Ve=M� @� @� @� @� @� @� @`[7lݿwm @�j@ L?UO54 @�*H)T1:4~_eAUZT<ls׭[oV,[, lܸzk'{ve}߶ Ӻ̙i:ul�&Sڵk#-`Ǻu>)rYa)sV\YYr=ZFT:/(((J[[0l[jJj޼yŶmn*~qWg!)ltw� @� @� @� @� @� @� @@ tb/ @�ToA{TO�j)S;Nqe]͚5Ӯg?QF}wܸq_xSA6W\zm ܶ\ؖzjӽ)뮻.-Z/sΩMJ� @� @� @� @� @� @� Pk|L� @� @ 7&L>`wM7ybvE3c9&z|M/6o<M7;ׯf}(**YfeZ*4hPǶʞ6T XzuO?qWF&MjM� @� @� @� @� @� @� @& o*jC|6TԈ!@�j#"yScU  @�*kK/ŠAPnRW^aÆ#<Mς;tP[k4uԸ{ wݸKYfD  @� @� @� @� @� @� @�j ȚfG� 2 @�*<yrr-%5j'tRzqG^^^T䕕!f͚Xre6mu-$y衇E]˧B @� @� @� @� @� @� @�m`n'@�6Am͗�,+V?w}w<3Ѷm8NF jք͆@52eJ=:yxWGqgg]tF3Q* @� @� @� @� @� @� @�m߶M� @� @4n8 Kr .QFŃ>8C##8"zY}&RP`ѢEOǓO>cǎ9sD޽O+zU gd @� @� @� @� @� @� @�.WaǶĐ!?%@�~#FD*gb @ ,[, {':vrH"wm7q3"R bY:ujasL}ѥKXW @� @� @� @� @� @� @� A @�䬀 Ȝ] @�(0}xgB,Ymڴ8 <l>D&M*"Ps֭[ӦM_|1&N~;ի_ 0 ]_~͙ @� @� @� @� @� @� @� G @�I@dmZms%@�@qqq1a„ 1s̨SN3wׯ_7shڴ)8J(Rx)SW^I&ū+W͛>8;.((U>&K� @� @� @� @� @� @� @`k &: @  @�G}/bKYKw .e]P>}{zݻGݺu͋7xzhذa; Go=zd/M� @� @� @� @� @� @� @@% D\C @�j Ț@�T@aaa@ɓ'kz̘1#֯_ 4={wmhܸqecL_Z`ݺuoӧO/mӦMŋgYc <۷oޱG~~~  @� @� @� @� @� @� @�V[[W޼  @� @�;\2|x7⭷=ܓ쥀ȴu!w^ںu]vZ ۳ +V̙3o1{-]6{m۶m=#N:H޽{Gv*,c @� @� @� @� @� @� @� k岛4 @� @@e4j(w߬m<~fmر1w(..noܸqYi"Ν;;vxh磏>ٳggm֬Y> \`AT-"q)dtܣGhժU} @� @� @� @� @� @� @� doWC|6T` @� #"yScNLK @�H!3gf̘ڼybYyyyѦMH:u}Ѯ]l_rB%m[(RcR?~�9sdtvɦǒ ѴOᢻKt5k-[, @� @� @� @� @� @� @�_   @� @�(hРA#k%}S_aaaRm1~,p?5vaֺuhժUi+9OM66ixUVҥKcɒ%hѢXxqiK . i?>+ СC79,4: @� @� @� @� @� @� @�]A6*#@� @� )k׮Y"+Vd͋ Ls΍Sf)x0ݿVNh֬YPԚ7o`ԟ%I&Ѹq㬥ɍ6ldun=OW.V\y]:N˖-۬}'g%5kl6 Lz*ٶmh߾}Ru @� @� @� @� @� @� @�v ݒ)� @� @)[nY=)pőB!,YR&pҥ)0f)0 jժX~oғB-v"Sej9Nue/:.VTTi[j)�OwP`tS fI8fIXfΝc=(Y)бuٳ� @� @� @� @� @� @� @�.  @� @�؂@ dl߾}ֶp]) rŊrlSK%$|qڵe?;_?|acѮۑKScIcqڧ02WIk)Tr}:82PO=nиe)𱠠 5j?ta#@� @� @� @� @� @� @� @e<C� @� @@&BSȑ]=[:ڗ~o< {.b8$@� @� @� @� @� @� @� @  @� @� n)JC \#k_8舙3콇� @� @� @� @� @� @� @�$ 6 @� @�A^81˪z"z(]A"/T@� @� @� @� @� @� @� @@Yl @� @�T;n{=7Jo4'"V8իs.U @� @� @� @� @� @� @� P3A֌u4  @� @�R`숑##.,!6-#֯ϭTC� @� @� @� @� @� @� @@Y}N @� @�7Gmq)7w=:b̘K/ͽTD� @� @� @� @� @� @� @@Y=M @� @�C%Dԫ?#~ܬQU @� @� @� @� @� @� @�T/Uj  @� @�)cĚ5^3:9s".<b#N=5U @� @� @� @� @� @� @�- 2Gu @� @�jCFjS҈ٳ#>;}UH� @� @� @� @� @� @� @@n uQ @� @�-cGģVixcĜ9GLѫW] @� @� @� @� @� @� @�@)E% @� @�n4(g3㼼 O*%@� @� @� @� @� @� @� @ wAZ� @� @@2%b.~m bԨ? 7 @� @� @� @� @� @� @� P  @� @�:n;ë[x≈%K"XzC @� @� @� @� @� @� @�T ȪqV @� @�R#/K;wxW^8= @� @� @� @� @� @� @� An?ko"@� @� P~-"N?SC>V @� @� @� @� @� @� @�G@q @� @�^`ժ[o jÇG7\3d @� @� @� @� @� @� @�T@~ot @� @�|&p˖E\tQ9ˆK/)߬Y3 @� @� @� @� @� @� @�*V@dz� @� @�-GEĶmpC5ꪈٳ?OGtP5  @� @� @� @� @� @� @�4AFk` @� @�J|2⭷""̉8^ٳь @� @� @� @� @� @� @�uF @� @� @ tSGUu6kѣGĠAU٨� @� @� @� @� @� @� @�YY%@� @� @ x͈c#.D<hDGlY͟ @� @� @� @� @� @� @� m  @� @�l%[_m֭#׈s#N:)bj:e @� @� @� @� @� @� @� P) +ՠ @� @�$ "&L;˫=&]F1qbķ]{m @� @� @� @� @� @� @�l]@֍A� @� @S0%GOĈqw*'@� @� @� @� @� @� @� @bAV @� @�?5k"n%E9;Jֈn&M� @� @� @� @� @� @� @&;%@� @� @@GFN*d̒A A\sMɥ /[,Fcǎ Ʊ7#//oq9ʍ/16M,X=P<q衇W\Ʃ臊c3fLEo< @� @� @� @� @� @� @�B@dX&E @� @�~7q+Ǝ;X裏^Ui<xp,\0ϏCkÆ ]w]ٻ(mW*RTDX>{1-Q{%Q5[TĂ`D""m݇oFȀӮ=9lYknr˕błiRbWꐟ|IT^=yʕ!@� @� @� @� @� @� @� Pjmy !@� @� P~^~9#>xB-[u3ATRc7K/_i}?J~{;DgĨQ4rJ;Se}:tzrԍ9rȒz %@� @� @� @� @� @� @�(qA% @� @� @ pCvE4l81[\V}+/͂ )͛{Q8qVjՈGXoKFL2Oz?O1xXpaaY8o8iذaԯ_7Q @� @� @� @� @� @� @�e[  @� @�O/" 0 b„ Qz3fL\tEgo΅;d[n}C9~:駟ꫯ7|3U T%*ZJ\M7~aԫW/:lE8yo[<d2Y6h yX`ATMɎ+Yd{ƈڵW<ȯk&㎋TW^Ġ=\<1y8# YZgzo1n>|xl1bĈl]G~̛7/ֳg8sW^ɞIVw_T9(9?Hu^[X#|Mt-+ � @� @� @� @� @� @� @@Y\V3 @� @�W l'NǁGyd 1re]@Ǵo=~,\06m4~\ș3gF^>o/;vllKXLA)믿}=ܓ{# /͛7/$ՖS⪶pȅcF.2"/GZ>:t9cr9Z2=쳣f͚Yb L,kޙdMή>)SNɾ5* LwE#ÓO>9=Ь… S~B7}8 Yy%d!'pBp׿5z.zڟ @� @� @� @� @� @� @�ʖ@ղUj  @� @�(F\uU">쳘6mZ\|ѳgϬs=7^{裏YfYHG)0k&yxGsc3>_C?<6lw\\tE3s9' <餓kWHic=6  I LϥVVe\2eJ8L"^h>⩧"v1S#=zt|իrK6( -v5 l|7c-\Y~0W_}5Riqv-F_~y{믿~6[l~a$S'x"4hw_' (S_}Uv-+=}n6y+X>v0_q'fA� @� @� @� @� @� @� @, ~[#@� @� @@@j"h!CD~~~瞅1cƌ\�Y89sb*N}0`@yG˖-c 7̾?Raj)�1>cE #L)m۶uFꫯٳghѢE6n{6R巶+վ"trg!^:Om„ E2K} <wld[r8J*YcZr^`Aָ{g!م5j(8>]whӦMy'g!=Pvo k L5!� @� @� @� @� @� @� @@YZV3 @� @�O e$zk#:;iԨpF}`[Ϟ=_|E wE~3KK.>2RJ Z &Lm֬YLi-͚5[ު\e$-D.3u눣Zr<QQ>V]O .,YIֹw}x駳A mlРA{qF LRsOzqg.I4@vmqG׏( @� @� @� @� @� @� @�(/ ˛ @� @�%,).dٗf?߉1cF4i$oqWxe˖:·s΍5j+8]vv\*L5�> Px}y'\sM1c,e~.rԩѽ{%/1~|G4o?XE ,>b|SO]wn\~ꫯ-ok6{W[lů GnVGYg>`.hѢEV?BvaqƎmڴY/ @� @� @� @� @� @� @�ʂ@P  @� @�(7q뮻 Ĝ9s/̚5p),/=zd^{{dȐ!m&Zj7~)R`dAK㧖m۶uƣ4aÆty1nܸrWx}7 &:%[_㏳ ʃ>R}Uq��@�IDATo䓊H!yyyQ`RŠbq뭷^\7~'tRy)(rE-:s9Ѵiׯ_}{K]v袋b…C[q~wB� @� @� @� @� @� @� @, ,KoK @� @�J@gLٍgs'OR'|^r%^{c=bw1cĀ ~b׎??Vyq+wWdR`` <30>.,W^ѦM޽{bС+<Rd \r\}Յ5x~^+Γ\alUGF.O-2x=Ĉ#4J ,h&LNgWh:O:5{&[2:3̘oFѳgϨ_~.2nT+)ʹԶvlzc=kqqꩧa7Q� @� @� @� @� @� @� @@0׊^4#׈!@�(iGH?O%" @�4)ܗm&^~^v[nFӧOSN9%xϞǼy?Gs?v)듗^xatM..ēO>x`s1ŭqϏJ* ')VZ?Vij7riܺu:5.,ڷo_V̙ʘ;77#rQyGd}'RhQN:Yez|ᵫ*N>ըQ# L!֝ӸB?쳨VZv텷n+욂>,3tz_zk4h L)2՜u]4NzǓ˵[/;ݻwN @� @� @� @� @� @� @�%Aem� P K�ݔ @�2&0vlDv=(D! 5UVSf)Tw}Çu]7ڴiK] &dgϞ֮]{f۶m[ު|I)pU$Wmh:#j\4ʊ|ۨ\r.<2^{Y,X?cXxq9')3Oa'N 6 [SpѣO� @� @� @� @� @� @� @@YYVߜ  @�kH@6  @ yfGQ kɓ'|YFvۈ޽#|G� @� @� @� @� @� @� @�r"ׇɋ  @� @�%!qK@Z&NZ*:E<DĠA)hS#@� @� @� @� @� @� @� @,?J @� @�q#bˆNXv &Đ!CRJ<y.+C}]+έR>c_q$n @� @� @� @� @� @� @�kNꚛL @� @�'ȅF{lDˮSOJFVJ6|<xp1s漘38ѳjLܾ}2Y  @� @� @� @� @� @� @�* Ȋ� @� @* <xĸq (!z7\-@.]W_v).+nw߆ѻw׉� @� @� @� @� @� @� @�R*P֥, @� @�J 7DwD۶2\^N0ȪU'G:;>|Ç)� @� @� @� @� @� @� @�i @� @� [gҏz`%ڷoZ4l8=zǮ~&  @� @� @� @� @� @� @� PjAW @� @�eG"unSsYt 5}}Ę1,H @� @� @� @� @� @� @�* Ȋ� @� @* ѿYgZEVZśoW%F.*[<F� @� @� @� @� @� @� @@ ,1z @� @�(Ѵi!r͚5˅Am֋w.8`t,\XWv @� @� @� @� @� @� @�O@d{VL� @� @`~1#U[a<4ioro4~z8~h%@� @� @� @� @� @� @� @`M \#@� @� PF&MZ{7/䓗ʚhܸqދѮzq;ą_s� @� @� @� @� @� @� @�$ 7y� @� @@h6b#zk#n)##r9Z 4h {!ڴW_C\{ @� @� @� @� @� @� @�E@dQ!@� @� Pf̈3''"6[ .5*`xu֍O?}6Z睷cwǥZ @� @� @� @� @� @� @� A @� @�,#./裈k];⩧"O_JHVZOņg6> 1- @� @� @� @� @� @� @�EY$& @� @�T, ȂUBΞq͚EvZĨQ=|@Z5D߾_]՘� @� @� @� @� @� @� @�_k: @� @�S.yysFv[[GL9Z"z*zw9sm& @� @� @� @� @� @� @�. Vz @� @�0~QW0K<Ѵia) ]k瞋4)#,(%+� @� @� @� @� @� @� @@_pL� @� @ ȪUR*U" Zrm,z7oq%W  @� @� @� @� @� @� @�eA* @� @� -0u򗟂 {,wqd6<G#䒒 @� @� @� @� @� @� @�,) rI @� @� |mD^/S^{=WK@>wqwUzR  @� @� @� @� @� @� @�.PX? @� @� LA[/ߕ)p&DzjD{Y:T @� @� @� @� @� @� @�$ "mk%@� @� PDɓ?Grʲ])GrH[nYU @� @� @� @� @� @� @�.P/ @� @�XyS~RsύŸ9+[{1jT٪] @� @� @� @� @� @� @�ʛ F� @� @@1LhʹA<5D T#ѷoA%V  @� @� @� @� @� @� @�TPA[6 @� @� ,X1k֢qzYS'bР==,UV @� @� @� @� @� @� @�GjY @� @�({ .3gӧO/\|v.o㧟~Z9s"//XKs\{:ORZjTReckz zތqZ#j׮j>yѰahԨQӵzEJ9Q:6xm8䐈#JGm @� @� @� @� @� @� @� PQAV7m @� @�kL .N<4iRv7Ĕ)Sbԩ~?/S[͚5 ֭Dc yK39.4QA@/E{&4z>< Ϛ502Q.*Wa׎&Md묳NV-ϴt/о}SOEcĩFy  @� @� @� @� @� @� @�, g g @� @�$0o޼cǎ-<?~|vXRcAa CdM 7n%6l05jTXF _VΝ[ gӧOiӦ_̑#G/c ɂB S0d֭c֋6m믿~T^(V?8  @� @� @� @� @� @� @�( "SH� @� PR#?<7n\ac:u"M74s0l SdYjZ|)YfQԧSɓcĉ1!>Y| mp)(ru׍gGSNѹs,@s{GrKĩ. <ꨟ9#@� @� @� @� @� @� @� @` \}F&@� @�(#3gΌ>(>O?~![AcǎY�6lڵSc&M*K_) qyM:5Ǝp5*|_g6.])^z8pF|BK#v  @� @� @� @� @� @� @�[@6> @� @@3gN|Ɛ!CbСY`~~~&lvXt);ZhQPIAr-YIbȑ'd!>``ʕ+g!oylѣG֭[ԬYsq*+0!"^{-b* @� @� @� @� @� @� @�XZqMqFz8 @�%-Wd~ @ |^7|3>Ø?~4n8wnKK!lATT3fL9lذߏiӦEjբk׮vmz^\U+1|xoG9 @� @� @� @� @� @� @�V$ rEB @�* ,�A3gƫ/bv1" wx㍣gϞ[G=}epuJ^U/2}\oFΝcwΎ>իSrursF.45rae~I@� @� @� @� @� @� @� @T ,EQ @�#   @�cРAǂ k׮;F޽cm .�w*sao㥗^>(V B{GvtС¹LԈ֭#Qf#` @� @� @� @� @� @� @�]@j'6 @l ,O @< |ѿxbĈѴimݢo߾뮻ZkUom,w />l<1eʔܹspqF.]y;ȑ O\jDʕKo*#@� @� @� @� @� @� @� PAŷf @ME�P`„ ѯ_xbѮ]ob}*X'n:P ???y8p` 0 FoqqqGVV8FYq7\W~ @� @� @� @� @� @� @�K@dz!@�:A(�T83ĝw>l:q衇~b-*y!C?=P|7ѷo8餓bw/r#;oͻ� @� @� @� @� @� @� @@y\^f] @� @�e[`qmEb}jժO<ƍkVd~e8\{idڛiZAE\w]D.<К @� @� @� @� @� @� @� Ȓq7+ @� @r~駸c 6/8ʥэ;6 {GTRe9OL` `ڋiOhګiϦ[ڙgFuVGG \Vg= @� @� @� @� @� @� @�JF@dɸ� @� @`) F~CqUWgƍ?ѺuzJdҞL{3ѴWӞM{7ᴗSڈ[t ^Vf- @� @� @� @� @� @� @�JF@dɸ� @� @`1QFŎ;|y1z8^zrJ =jڳi=rUq}]F1aByYu @� @� @� @� @� @� @�(A%nV @� @�?niTZ5>䓸+~|)gM{8崧Kը1p`D g('  @� @� @� @� @� @� @�% MI� @� vZtIqW /ڵCCL =r'xb^/aÈg7< @� @� @� @� @� @� @�yAk܌ @� @� /?x衇м3<3*UT] \rIlfqeZ@IӞNi^^ [x晈C#>:bŸ @� @� @� @� @� @� @� P4AEsҋ� @� @>xg_߾G^}C͚5+F~a.JrէF.vi=_^Z.D<X痗UY @� @� @� @� @� @� @�5' rY� @� @ '0hР6̘۬+=7???vi+:%O{=Kmø瞈뮋* @� @� @� @� @� @� @� fAg @� @�R9眓*ӧ̙TZDkӟ hem~oiѴ߁?<⪫"<3b* @� @� @� @� @� @� @� J7W@� @� P^~g]U[qmE^^^tAqW_~aVglM,X {o[n%?~SSNn)^zqQGEA駟΅ 80zhժUf͚E k;ޕW^_}UQfҥKp 馛?PXoݳ 1cu]xN;YIQj+xvΜ9q뭷;?SV駟-ZȺ,{7.[ynMFz/mڴ<;R֭[m{EݺuOګ~i8Im۶Υb "ƏH/2A @� @� @� @� @� @� @�kAZ @� @t <86h,oMWBSg:uʂ /ȥإ+vu,24>Yy)S*=ve]"qEE߾}c=6UW]f͊#GfF?c{q$S(>E c9&jժ }ѹ ѱcǘ7o^v_͓B o 6 Zkav(ZR[hڴilҤI(;참;ms ˳M!i3fSc L)1\VR%ϟt>1iҤ\r曱v=)3/Fnaָ&:%߁n9bĈ^\ @� @� @� @� @� @� @� Pv*UN� @� PRxߺ[bewy+U]v]Z~bϮ1cD LA9,$N&Scj_|qwc? 8lڴik=zDz"՜w1~ ^Oz~,tUV1lذH_?Yb_,Jm9|,rM63OWw}qqee$ĭޚIN0!O>d<Y7|zj)2???ҜիW6wu(E̅Ft9\F� @� @� @� @� @� @� @~EW#@� @� fׯV}-Zdpʹ-"\gΜ?x<c8iSN9%ڶmu֍9sd֪U+رc4)2<Ν;Z \ԺnE͚5#?ZjqgƂ o=zt|WL[Qm .Ѽy%>{uԉ/2 LsԻm RcA됒sK.'#:unqgǖSOE.3b#r^#@� @� @� @� @� @� @� @`9 2 @� @@ aÆŬYb1?VJ<_|q%Đ!C#5*ҽ޸K/kxѰaJ/XֵxmSL\&,jժѣGlyVd.S?~Y=<w?o߾G齧嵭VsELq !-+. @� @� @� @� @� @� @�M@o4 @� @J^瞕xlw]v̞=;eڅ ozSNB HAG}=J5j)q„ W_-1F˖-묳׋KO>qg;v,u;@ynmD [{'yF� @� @� @� @� @� @� @`A'  @� @�VRaÆqge]'N\ɧ{Vڌ3 [`Av_x8Oڶmu֍G}4 V8t#q^[I ˋW??3F?)7n#(zѵk׬^{m j*|Yp zD\s5!Ϣ<Ciϧ Z#@� @� @� @� @� @� @�  W @� @�Aࢋ.[/<( íԣ[ouԫW/P/瞸/x㫯ΧN}3f'M}2eK ILa)qK/4իWi&w=_gTweZh)1bD,ւ5kGuT̟??9昂+YҚRP-sOgqFFk˫w_f}YyGcvދ'x";_=X =iW֧OĝwF\qE]wUU[' @� @� @� @� @� @� @� TE^>A @�eC -l[ @RJ^qM7s=oԬYsMժU˾YH`~~~vioǖ[nna{3DoDڵ[n-./3gN;?n"pW^y%D߾}kT_,q'dR>,9=1hРh۶mԯ_?N?Hƍ˞ݻwԩSgbZkx衇{]iֱcǬ?y/"3,;_sȑ#{,nڐ!C"`&wF֭cv_~9{W)82^x!>ԩSfm UB-{HA/R4lpF)lYD#7"E @� @� @� @� @� @� @�SR׀hyk @�D @rc @oH[`d!y"BSbFOd!Eb͚5+F8֫WoHsz7.^{m|ǑBWwq.] \ϟ??ґB;SK6}U꘮Hc ??뮻n+N8!#\jy\5 @� @� @� @� @� @� @�X9A+7 @ p܂  @6mZy+u]'xbTTiְM2%=8CWد;_̙;wGs?mӔ -c's9'zoъr>[Ud k'@� @� @� @� @� @� @� !. @�UA& P )8o.(6tӸۢk׮0bܹOpئM+N:? 6̂ 4_kraÆi}Q\yqg`;1}0&MV'@� @� @� @� @� @� @� PzAw2 @@Y*^" @@;vluYYa^zik׮B5~xףGG͋{Q{7p, /cʔX{#j. U� @� @� @� @� @� @� @@ T.!H� @� @`ڴi_|1R^ǎCaÆ`J*kf͊wyGjio=ѣ㥗^pڲMF<\Ę1lW @� @� @� @� @� @� @�TA-[# @� @ YxO?&MnݺEϞ=s疡|u)"YidڛioG޽j9G<TB3#N=7" @� @� @� @� @� @� @� ,%5 @� @�*@>}W_CF۶mc͛駟nH{.^L{2ʹG^Պ.V ӌ+(sz @� @� @� @� @� @� @�(/ ˛ @� @@9֭[w}1iҤK㭷ފrIrlA\x… -ҞJ{+ҞK{/ӞL{S[5ֈK.媍) @� @� @� @� @� @� @�eUR>x#Uu @�,-q|'@�ȑ#Gs?|Ѳe;,G޽N:+?'*?gy&|ɘ8qbt!:8âSNި5bР]w-эG� @� @� @� @� @� @� @t ,EU @�R# Լ  @�1bD 0 ~xZjѳgibw-"T]yyy1dȐx㥗^7x#ϟݻw=3ܹsE&Z#k?Ȉ#^}5bȔ&!@� @� @� @� @� @� @� P K @�/ # @�? L:5{M4)ׯ[ou٫W,v??̞=;{,1>?D-]v%M40&a}#N"_4T @� @� @� @� @� @� @�O@52 @\," @@9rd+k'N*Uo=z-2umQT^:Džϛ7/>w}748<e˖vE aSN呠LiȽs#|3q2Ub  @� @� @� @� @� @� @� ȕҙ� PAVwn @< |W;}QOYd tMcM6)<YgQn7'|RxBSdZV[Ez땛L[GbD͚iuB� @� @� @� @� @� @� @gA?[8#@�A Pn,X#GCưa?ΎiӦeklܸqt):v}o>ڵkm۶5jsѣcԨQ_f>>_]ttlfgjժeaj :ƶF[re, @� @� @� @� @� @� @�ʟ N� P ` @@8qb >< LA#F/"Lr.UVѦMc׏u]7լYt9gΜ0aBv7.رc t/???+iӦFΝֹG˖-KbT^=b]"N<1P&@� @� @� @� @� @� @� P*ʪE� @� @R`:vm%1cF5* 3fLaH᫯Ǐ oҤI6Fͣh֬YthܸqTZ>.yL6-N)H3_uL<HOAK[B6۵k %6`,1}oРAAWPW8탈+$ @� @� @� @� @� @� @� -P>üBR'@� @�X])p7ώς S d:&L&Mʮz+ Ac…K<^nhذa4j(\^zQV]v5kF*UP ��@�IDAT#5|\駟"gΎӵ}̙1}HZ|֬YKRJSf-̍6(;oժU Spfʕx֗%p]qZo @� @� @� @� @� @� @�[@d~VG� @� Rpa˖-cZ)hqԩGAbg SL_|3f̈q@ƥ$;Y1HAP֩S'R8fAe qL!Y{M4)<R(F(gPՈh,w< @� @� @� @� @� @� @�/෮K;R! @� @@9HA͛7ώU]֜9s={v̝;7Rd^^^qiGϞbG^KsVRe#մFQv%k֬%{* \{mĉoJx� @� @� @� @� @� @� @@Y^b @� @�X 2q˃c#.aWs@iT)"v-o߈ߎhժ4W6 @� @� @� @� @� @� @�+.z @� @� PF;7 ȲԻ@F4h( rƌ:J� @� @� @� @� @� @� @ ,c/L @� @�"0bDDJ:>J@Æ>1o^Wu @� @� @� @� @� @� @�~M@G� @� @ |iGԩSFlK n3CF}t…Ku� @� @� @� @� @� @� @@YF^2  @� @�@ yeЗ@%b#.׫B @� @� @� @� @� @w'`^W?:, ( JefKViܻf[>XZW3MSKrK%]\@XU@v9ܙUa73<gY^|yG� @� ܐs @� @�jq}I> |]_F) @� @� @� @� @� @� @�. _ @� @�R҈AnkWq%Nמq) @� @� @� @� @� @� @�$P� @� @�%0yrIJe}ԭy ~[oEPȇ8W @� @� @� @� @� @� @�(\;4##@� @� @`kƍ(*{k #pqQoxܯ @� @� @� @� @� @� @�)A5%_ @� @�H`؈]#JJQ%P  7Gqa3g=뮋0 b;"@� @� @� @� @� @� @� P kR_ @� @�@ g4I(ЬYwG4nq oDXq8pC"@� @� @� @� @� @� @� 7q @� @�*0n\D߾uuvE`}wwߍ85_ի#jM O:C� @� @� @� @� @� @� @AV  @� @�l3҈An3` @n{ĴisD ,/|qG @� @� @� @� @� @� @�jV@d� @� @@ LlYD>Uڬg1ujĪUk(+>� @� @� @� @� @� @� @@M )y @� @�cFл޽A$P'FOĘ1+W? ǯ @� @� @� @� @� @� @�- G� @� @` Ȯ]#JJa'&P@?o6jqUG @� @� @� @� @� @� @�jN@d� @� @@ >}Y (Xw6,bժsŊ?1b  @� @� @� @� @� @� @�Y @� @� PME[M@tq/OP%K"! @� @� @� @� @� @� @�k9l61y @� @�R4bxA4('#+k׈ A^q+  @� @� @� @� @� @� @�X ?  @� @�˖ES8c2-pQ&D\~yDVA |啈^9{ @� @� @� @� @� @� @�[@du� @� @67.(wmԁf xӧG{0F >mZ2$@� @� @� @� @� @� @� k5) @� @�(0vlD׮%%qL`}V".4bĈcYs}Ŋn?!@� @� @� @� @� @� @� Pщ> @� @�)Omߏ Ƽybyqb"~^1eJW=x4,Y/ڊM֕+Wfhذ&kFyѬY\nvo  @� @� @� @� @� @� @@Yޙ @� @�ؠqCnҥKwߍ3f̙3+gώ9sT{/@uK jlxѯ`E cycV;׸q`M=6"˯-_|~a̚5ڂ <ϟA'SP;m۶ڵv):tPرc4mڴ  @� @� @� @� @� @� @�jH@d � @� @@U #=*[HӦM[[o:wܵBSamڴW!n:${*גFYc4hrB֊hѢ 9o޼|AE�f Ü8qb<9(3[$N:ڹsڵZ5H* @� @� @� @� @� @� @�^붇 @� @�,0eJIJe}Y{}HRKS0aBL4)ɓ'LJ~ rc.]"~9pw:M6jƍy0X 6,]4BΘ1#i;F;3__zunEѽ{ѣG={^z4 @� @� @� @� @� @� @�Y5Z!@� @� PcFeE5: XhQk1f̘ز:k֬|OFrngSNǻk.ѤIl@ ڵkkaYYoSdS(g L+Vȏo>{Gׯb) @� @� @� @� @� @� @�-e^&@� @� P),-dJ/R92^~5jTjժh֬YY@i8tӧO3uuM/8SMrYreL:5&LƍSO5\K,  ƾ{W!ᐕ @� @� @� @� @� @� @�W8&@� @� P RdYBZLO?t|gsH`iiii&s11`\S` Tj@ ,6lXRĉcѹK/4Ν 6a <8<u]+C� @� @� @� @� @� @� !* @� @� Pƍ:L R`ԩ#cŻ7ΡC . g֭[AߠV {3ÇW4 /#Ggy&X|yt1:8sN* @� @� @� @� @� @� @�T@d=}M� @� PwJK#Ə8ܺ3'3Y%KD |r4iRgqF|ӟ;4iR{A T;<e˖ŋ/?x^Og}v,^8zvX) Yf5!@� @� @� @� @� @� @�lke:[oC� P#FDYGDg @@x㍈=#^x!̨z͛w}wyqҥKc!CGFg0z+Vg}6|x_!Cc9&<~M� @� @� @� @� @� @� PY@de  @� \  @@ űF|aDII π X =u]q-} 6ʗ ڵ+Zm={vs=94Ca|}Ѵi>E'@� @� @� @� @� @� @�lP:I� @� @@;6kW!@GgqFt!N:�y 7Ĝ9s;o|B =!ѴҚKk/FdZi @� @� @� @� @� @� @�Ꚁ ȺF͇� @� @ ѧO o@iii1">OƠA_K.$f̘v[ ><JJJULk1ɴ6_xᅼVӚMk7a� @� @� @� @� @� @� PAօh @� @�Z`؈}5oB`ʕ?)z'xb9矏oѺuM<Hk2͑#G浚lZ{k9i� @� @� @� @� @� @� PAg @� @�^4bxA~!l;( sN|_iӦŵ^{Fp@a lZ_ZNk:m� @� @� @� @� @� @� P[A7g @� @�LX,O-0y2dH|_#8lLK.$vid@-Hk7ᴖӚNk; @� @� @� @� @� @� @@mYޘ @� @�$0vlDQQDޕNڭ\sM/VZj\veѶmzmbuG 崦Nk< @� @� @� @� @� @� @@mYޖ @� @�XG AvQRN`ŊqI'9/⡇={;im_k=7 @� @� @� @� @� @� @�j 𖌑� @� @FXtFn<F^6jkqGQM=n.]~x|'3(,\0n>|xnݺk'PTTzZ)4}[P @� @� @� @� @� @� @�. ߐ @� @�؄. B˴i믏 &*U^ѣGGW6,ߓO>{o, ,e˖}ͫUjt uLk>;,} 51:L� @� @� @� @� @� @�FAՈ+ @� @�U)PZ1gNXxP~Q(+'tRU9*iaÆ1qxףA)sco{7vu׍Vp;vrJիF_\c+פeZHB& @� @� @� @� @� @� @@! B~;F� @� @`SD\ٱ,qy̝;ww}>Z)to-[,ġĘ{ク袋'?Iׯ ƴ(..Gӧ 'PZe Æ 2}[HD6 @� @� @� @� @� @� @@ _q @� @�%cǦvȣ1cFm6.]瞋%KD㬳Ί;R䥗^oFN?i>N?fϞ]w]<뮻D+ϙ3'.=zth"N:8Cw 7DӦMs˗3<0`@|qn<c6R0TyM7ߣ<o#Fļy::thnS7Ա_}4n8<YzoN-&L9XM6y-\2k7M~cƌ?y}y睑YbРAy]j*{'ZI5sw~N;'O|3yͧnviѮ] ŋǛo~y+4ӚܒO/o#}_bѹs|?jƗ^z)nn_zx]<o9rd~oi<{G{q!lr})ڶgqFw> @� @� @� @� @� @� @@! ,ķbL @� @�6C Av1s] u<蠃r d [`Ap qUW<0>R\foW΁o)/12u>rvzիWyL3g!կrX_ ҥKK!|)L;_|1lذ΋o9o%%%q MF~x;Ha5QRh U|rdϞ=shz)$1SIA /| /0( _=N?x8jԨ\rI,\0_۷o,Z( Sc GM_/ĆC=NSj&RI1G}4oΏm~+ۤuLSwͥ9}_s[7kHA:jyX<z6{z*z豞.9U~O&Mr`f6AV9  @� @� @� @� @� @� @�*hPEh� @� @�jHA{2Х1f̘vׯ_H_}̛7/>._<ohѢEt\\}׿5yh߾}<SZ kַp@KS8\ )nlL7ozjRI0ٳR^۶msܠA DÆ iӦ982+M}wrfMͫ8vmOmڴ8wM7ŧ?|B!ӺH!)tkѣ:?SL\ w<cr?{^ڵ'x"Oy[nyM~_:NsJau]y~<c9\q>j碋.e]!CľUVɓsύ~M)tST1"כ3>}d4֭[s=,R?)1L3ό晾ԚW^y%X2TIi  @� @� @� @� @� @� @P� @� @�M e&F߾:t-.~A'NsRʞ{Yqz=G hL;n-8N;-wm],]4:v옟:thKSx|~gV\Y:hժU=M4O;'bܹ9xG<36k|k5TGZl> }:k#3~vk_(--qy=5JfW^y~`TlٲsiP> O>9@9s6XަV^\sML!%rw#C͇~{nܹs]L~7 .aÆҏ#8"~8+Υʖk]ƃ~ � @� @� @� @� @� @� PŅ:0"@� @� @`ex1~|ĹF<\ǘ<yrC.../yx7bРA kKϦRd*^xaYenuK ;{I&層 4뮻.;}믿>>2dH7|3߶Unt66f&LA/==lj)TW^~w}qWl8R`Eb_sI|,7<8oycecs||g Luy[#[*[{ @� @� @� @� @� @� @� UA̸ @� @�ظ@Yc,[ѧODǎ!rovew·۷8am͛7Ͼ m,^8f͚U~*yWǥ^?Ok_Z7.~_F&Mbʕ+sX_HzK_RT6q^Wcǎ~@Gm "[N<ޒOrKr!:nƍ)@rŊkݺdɒX|ym6ꩧֺoy<|w:%k=XE[HD6 @� @� @� @� @� @� @@ ,7c\ @� @�6!PEE{Gt!10 ?O/͚5)4*u&wm]1"FUqUroYqnc;zht%.<o}+}/RPG38#fΜÇW_}5֭[}T߅x}⬳ΊEs)1իWƶ*k?agy&~<pYJU̲;)s̉N;-N>|rm)uw> ng7|%yo }P\U|g~r77pC,\]pxk,+ yH߆B� @� @� @� @� @� @�(TAf� @� @&Ǝ5$"˽9`1K槧OǏad?]{?)ƕJ[m:xmܸq}9ӟt\|ŹO~ѭ[g}r0^z`ʔ)u4h N=F K}G˖-_(,Lay})/6ڵk[:r+|_W(ܳ?dȐT G{K_R9LkG@ʆF/{GHEqmEO?=N8N̟??oӏ={mR?)05cCc78s#`o>>ϕE]77Ϗ^{#C9${~ѦM|:9s=~n<;wZ.8#sp66d/Tӏ+WFRd& @� @� @� @� @� @� @@! 4,틫j#Fi| @�:"P yU:c @�(˽+ O່iӦ_kr 7zkqĴM!`;#{,~ /g>=P> ~x9rd~_Wvaq饗F ;3cܹBS`\j$%UV*[ꫯ +)d2:s1w6RH^[*ρƳ>;/b]vO}S_Fr;uGcСQG9ߴZyG')ܱGѶm۸+4AwһM矏ҏzO:(+䵜rZL?fSysaNrXѣk(}+[ji.H[ZRpjf駟lԨQ;X+/䒘8qbӸe eܜ9/N;]wB7yYgżybҤI9DܤgF\ӻJVO<Dlv.% rG-ٚ,YC@Ӹ.]lM3!@� @� @� @� @� @� @�T@RUwܚ\!@�#)2;XG`L� PDY_0F;c9x4^s(޺ai)A9mKp �[h۴iS\ Ku)\ҥKiӦ9.Unُ;vj6̙LR讻ZSH)0.^8>n=ygoyQSb L˗{.^n3'w 2Xx{cƌtmCTٹLɬ}55'LRY˿WRHf޽ @� @� @� @� @� @� @�_@d� PA֪e @@=(y"&LzѣGǞ{YOLsC) Ogy&~_ƩUj:'?;s]l2nmt1?q=ܳVO>[Rhe;8ovY> @� @� @� @� @� @� P_D͓� @� @@]<9bٲ>}̨cǎys8fnZ)6]{q_+vG|;j֬Y媫3&MO<z(7Z|g_qYgժZLo @� @� @� @� @� @� @@ "H @� @�.q,,w5=h"N8XbEu A?,PT8>?~x1lذcРA<+1ѰaØ\_"{, u x:{bqmEΝkL � @� @� @� @� @� @� 0 @� @�Z'0vlD׮%%M7{R@-w /+98bȐ!eaeif y0bi}>捫Wx ~_C=zh9rA+ @� @� @� @� @� @� @�MA# @� @�D`ܸ>});xu1lذm◿e̚5T4iB sS-hZ)3ݴZNkZ!@� @� @� @� @� @� @�fA; @� @@;6oz9u{Wz1eʔ8.N:`ȿohѢѺG ||ZLaim5jZi5 @� @� @� @� @� @� @�ꂀ Ⱥ́� @� @F/޼m0Ν;~x7o&M'm۶/~q7| z$ZKk.ZLk2ʹFZMkV!@� @� @� @� @� @� @�%4s!@� @� P&OX,O>SqG`;cĈo~3V\?< m=$իWǫ>`z*Z<C⪫c9&ZlY$L� @� @� @� @� @� @�Eet�;nMKZU-j� @r`";X3? @v eűF|aDII힋E{'ogΜ;S|qAn &N=X<HC=4 i[ZA;"@� @� @� @� @� @� @�@iV @� @�l c#v-lF } _5+F HA:t<08\7FH /_Fgy&ק~:f̘А!Cb="b @� @� @� @� @� @� @�z)PTj[oC� P#FDUݿkzF'@�nNX {j<v X"FO=T)!}'{0`@74iR;'jԛ%lٲ[N;zx^W_}5A9$4?FF6]7 @� @� @� @� @� @� @�꺀 Ⱥ͏� 1A~L@ @�X,_/*nXsB 9矯\tiݻw=#Cm.]h+zHM <}3fL~L8nܸXre4m4~w{_ @� @� @� @� @� @� @A+2@ @@ Y @�* FD\}u׾V}#ǏFѣGkg̘ټymݢW^ѳgϼߣG޽{m۶p&RG2gΜ<yrL4)&N&L2/^8t!{/%80z(f @� @� @� @� @� @� @�un"@�AU( P x#ʂ"^x!bk @%{/ƎSPd)h7ߌJ˖-[nѵkҥK.ѩS\wihذaVn@iY̙35O6-OSL?07B{ Lo߾;nn#@� @� @� @� @� @� @�؈@F;M� @� @@ QTѻw pl@ ԧ>kSd $4iRL<9N~cܹ:B!~ڶo>ڶm[Q۴i;C4jԨٺbŊxќ9sΚ5+f̘ScO5AdTy!�ݻG=r�g T @� @� @� @� @� @� @�6Z%@� @� PcFY@[DII7A5&i��@�IDATS`*K,wy'zxw߭6?~|<c1{7oz7o<~\[jU_~e˖ѬYHUVO7n)rݚ^\@ [,)|vxHs+V/?`<4:tߺ%ͭ]v9 3dp90cǎѩSܹsy>� @� @� @� @� @� @� @zAV^ @� @�|l٧nFj@ eTPddVXs΍9smyp↶)P2_hQEc ULmdiԨQE(߉NѳS9M6١<IJ6]k۶mmjC!@� @� @� @� @� @� @�(lA~� @� @@qCV!@@ @СCNoniiiE0%K*/_GYÆ ?6n8Re|?=[^:ߎN/}- @� @� @� @� @� @� @@]Yޢ9 @� @�y ?>sTM@ -ZZcO=5"N>9GkzD'@� @� @� @� @� @� @�*UՐv @� @�v'G,[ѧ϶CG1kVah @� @� @� @� @� @� @�^@y� @� @@ QTѻwu#jX8bĈ&M"=vMl I @� @� @� @� @� @� @�U  5A� @� @`[ ѵkDIɶI@GĘ1v!X @� @� @� @� @� @� @�V@y� @� @@5 >}C] P0{GrK 7D\vY @ @� @� @� @� @� @� @�R@Vy� @� @@u ѷou/ I#.4#Ff, @� @� @� @� @� @� @�[* rKO� @� @JK#ƏY#PpD|k~'� � @� @� @� @� @� @� @`An @� @�T˗˖EyG?;⨣">ߌ  @� @� @� @� @� @� @�uA.L @� @�ٳ#v%K=/bѢ5޽<Z&M"#b}"ネ 5 @� @� @� @� @� @� @�Ԅ ȚP' @� @�sDSFLFX6mքD& #HCN Pgv)⮻"8܈/S51 @� @� @� @� @� @� @@hP'geR @� @�j@߾kzuiʪUk!S�O~&,r? oE\}WDmK� @� @� @� @� @� @� k3z @� @�:(5Ċ"v5S6~+}㎋ˆOxɺ?_3$@� @� @� @� @� @� @�AuM @� @@/bOgժ.(.= P?# "Os6K @� @� @� @� @� @� @@mYߠ @� @�9=XrJq,K(#:t8ꨈE͖� @� @� @� @� @� @� PAƷf @� @�uZ An/U %%GČ'zu}T0g @� @� @� @� @� @� @@Y{ޕ @� @�֭#ڶ]~_s�-ХKG{oď~T-̞� @� @� @� @� @� @� P  @� @@i^$#2'ocB� @� @� @� @� @� @� P  @� @@0 qG~zD>g� rJ9D|/U @� @� @� @� @� @� @� ނ1 @� @�XG`="V 6&_E q13gn.  @� @� @� @� @� @� @�jJ@dM� @� @&Xj F\xaD6x%@q͚E|˖!@� @� @� @� @� @� @�($A6� @� @ QT @slG}wGz?N @� @� @� @� @� @� @�m/ r� @� @ 4kѩӚ.4"+=#׈n/I @� @� @� @� @� @� @�lKmٸ  @� @�+b…kEŋs]dz˖-KFVOR{˗/uqiiFUbɫ(Un/;=N9e@zjD aÆ5ڸq6mM4m͛M6]w$njG!@=4?"8 @� @� @� @� @� @� @�꺀 Ⱥ͏� @� PV\~|1o޼͟??,X ShJqqz!)0<4|B[n7JusAnSc*A=v}f0< LRX8e0Qp@aM4![lڪU~U6hS}F@{nĘ1s{WMZ!@� @� @� @� @� @� @�:A[) @� @�!gϞ9sO^szzlѢEE` ,e]* ӹXSM!V>񉈮]kfT)2C8yY7B$wqhӦMަmڮ]H5w uW]1aBQGE<|DYB� @� @� @� @� @� @� PC5[ @� @�/Soiƌ1s̊mOU.7a){) nѺu�ٰaԹ L)35qKiii̛7/ʃ!˃>Κ5+ƌAS:ANvСb;G:u[k9 ~GOqE @� @� @� @� @� @� @�Ԅ? u} @� @�j@ KӦM7|3Oi?`5h ڷoRx_^⠃KRcZxNHA[2Pٳg0"Z>yM�UVU4+S(.RQtkȺ"Za@%_q]G|;]v  @� @� @� @� @� @� @�M@dQ� @� P/I&ĉvʔ)1uHbŊ<ױcܹs߿O{| KA S@h&BJS@d *}ws([o1c}4j(]w5uiۣGO6o|H6 ?Gw\D~Vm @� @� @� @� @� @� @�j ތ� @� W7~xs0aBL!zz*:tݻ琼?u5oS࣐ǭ~bSh+)ӦM؎7.1cF~(ɞ={F޽sիW;M]_я":+liǧ?]gd @� @� @� @� @� @� @�% v/%@� @�lY^u̘1y-ZiӦMK!wvX#�YRRE}@! .]亡qob1iҤ\xHms͏oO>ѯ_c=6o~CM:G.(xD 92B~ zG� @� @� @� @� @� @�SEJUִtUբv @�jZ`ĈJWcMH @ L:5^~5jTv̙y:t}Mav)qv fF?~|ձcȴ1cFavƠA*ݤUfreijFlݶM @� @� @� @� @� @� @� %l  @�6( r,N @�?~<s1rxvΜ9Ѹq{ƀr߿cPR@䫯GW^a˗/mƾ_~VZEso>qEE|BO� @� @� @� @� ٻ(o"Y�A((`C"lҼQc,h41yhbIlAH,X"` ,AĂ E mߝ 0Caڳ:sOJ?  @� @�@@d5$]$@�T 6ԩSc/ƿxݺux^ze *G @pQFkǎuf뭷}ƮVZUN'J`;b=".(WZ梏 @� @� @� @� @� @� @�. IUH�Y k| Ts??m̘1QXXK'vyqiӦgPzJ ̚5+^yx饗߹Ľ#GƜ9s{{fƍR!î wqFsLU> @� @� @� @� @� @� @�j@;4##@� @�T/'Ɛ!C'#FDAAA7?ׯ_lQ9zͪ,uhѢxcYmK,v-<߿t!֕)DviElYD^e @� @� @� @� @� @� @�j@\)ayw5=`yը @�x衈[ceH @j L0!ʽpӖ6|8蠃b}Ѱaêa!@ϟ/B :4 }#8"֩SroSJX8racDƥ @� @� @� @� @� @� @ \[A @�j >G�"0{x0_Ҹ뮻w3?8Cb->i�#0nܸ<xp 4(xӧO|ɹ#I&UzR#fΌqLjf"F\ qA @� @� @� @� @� @� @�*U@dk� PAV9C>Ǐo1hNc=6b3=%@` uc1`6mZtIqyY7,Ծ{07~#&@� @� @� @� @� @� @�T@AE7~ @� @@m=ztzѭ[O?0janaV"bZdkGZCZ֔(*B`#x #"ZP' @� @� @� @� @� @� @v o @� @@ |'qGǎ;na;裏ƾuԩUM@M(((֎$)imIkLZk->]eE<xy׮> @� @� @� @� @� @� @@Y  @� @� c- رcklԚj+K`Μ91`8ꨣEY7J;.1".ڵkeuִoW\m]\qϞ=;8cSNAEQQjSQ$)imIkLZkҚ(o8rck_MzktAq 7yEdZ'c8˹f @� @� @� @� @� @� @�5M^M @� @�*S �wq+ĽԊSV:ue[׬Yoz*Rx`*K'NwuWL>=}\a)e_aeb7.Frj ,Z(=/;SƉ'oJVys.]!Cęg=\fMn'P_1~|ge[WJi6lX<ѻwlv^dIѠAH[\f @� @� @� @� @� @� P+Z4نJ� @�T̙3cO>$ YީqUWKC)k=ŋr}mڴO?=vZLiœN:)zQ|_Ye<ZV5|߾}SO]\yk={{nO?Y&^'Ai-R@.081#"rY,.nq9~u￟ \ @� @� @� @� @� @� @v o @� @@9 sãuXJ4iR{챫XZ=s]vY 6,Vy_^-\ [Y)=֕&\/eJ!_c7<-R|5'=i JkB<Zx챈W_8y*m]\tj/߻7oM6-JF� @� @� @� @� @� @�8z @� @�*^\BO<cǎ&MT|k#<=P̘1#:u}7f͚C ɮij>mڴ+"fկ:gĈ{;_}f_4hP[o5ƏrJp ɓ'\ثY}۷n!>}/g}g}v;F>h3guV?]hQ :4n7xc3&t{N;dMWjuunN;gkVZE ;Kqꩧ:tdӡCcĉqA~M7/r̛7/NwyYRw?׿*9L88뮋ѣGfrAt.egάII߳/2k((C'}5kO>d暄LIV<ѭ[\hcqn'P@{֑[s˼u/5{w}7ڵk_uQY=ˮi]OkRiӦeQZ?o$S)k ~wvmO/8,Xu] /W{$ w}w$.pf:\ֻ,,GzmԩѳgϬ( @� @� @� @� @� @� @@fc42 @� @@ `Wx[kK/gqFS@c>*=k) rBSU K{}Q11u]YU :sk & Ks΍7|3 5jjuz8;ȞO)1x'Ʀno߾ѽ{,IJcǎq衇fcI� ;llO?t<[[Ye=LJ-ۏ'd)4򪫮_ѨQ,D/格?},3Ej/ 80 L/%}gHaiSenjI߷^zeA)3nRe K\YVY?8;x-[BR\U.i Jߣ&)[ lW0ֈaʧo9vmH{~kG}tyY%[N\pѰa,�8 )5y睳5>YSL߿]Ru.2/ӻ"ݓB;'}T~⫯Cgώ<ޑ龴KYt={S0qZ#Soq @� @� @� @� @� @� @@YԈ @� @�JH=zWɿYbݺuЬ"`?N;eǷrKRHa K͋Çg׏* LY Ȏ[h/r6_ǒ%K_̮&M_(Sw}@tܪUfmaƕΥPN jРAx{YXz.{M0!ӟ44iuJ!\YnRL.ۏƚ-g]LoFSZ?EgIA)1:&>}D 1cFG)hCɚK4 /VwҸJ47nmSQ|5)ӦMK˖/bKUsZҚ<rG5tZ?>[GRbz|ߏz([cJ[Kڭ[lmJBk^?яG r5$Py==JzϤD_Rc @N!mQܳg+z=:szo55ͿK @� @� @� @� @� @� @�5K@d͚O!@� @�*I @M2Z_fS_~m] 2$ :s+hܸqv\2p/Rرc{Yfşxcuڵk~Wp馛f!:+ ޺{"K7> W^y%R0X*%צM\ ,,((Ȃ>ue'*菒ݻw3gF ˗Q|6boRe m,xx㍳|}8}k׮۲}oϕsuh֬YH ],\0;նme/Ui-JkB"Ғˀ\fck[<xp̟?88_~>#S\SIAiM}GcРA:B>ܹsf{ZCRc MmYI}]hQpN9ڑέziW\V.KҴ^pԿ^P @� @� @� @� @� @� @�+ έ @� @�Pz(u7uQG''N5o޼V>Bf̘ײeo0eU´Vp;#Znzklfc-WM>1]hРA޽{?VZJֵ܃t^zY)l1_GYϥ}N*ymMSg UI}q^rҬi OTmT̙\o[h}XN5(E(}/" 8؈RSW> /;?뮻f%וUYJgxײ7ߌfְaå^v Iap@ ><{'BSwޙ={7gA~O.]6~hڴiqR?Ǎӟ#@� @� @� @� @� @� @�j 2A� @�T~hܸq'?܎EeVm6y8#VT ZKJA/#<2?|tIY +XËv)z\ر1k֬nR2-O?_RYV]%ϯc*vYKޓBRIU^% O>$&MT{JV:_?lY … cڴiѭ[Wi JkQZ)IGxو.[6h_|q J[WVe+YRZe58N:u˞8묳"vmq5\'xb;q 7zzZ>]m)rG-{g @� @� @� @� @� @� @ Ai( @� @@ 4m4|/s=7LGuT?m6FӧO/aÆe<xGȽ;_ܹs2+X ) /-[ƽ~{H9x|(ط~[B J[i|VVR}Y~6ֲ8|tMc뭷.>ߠA컒|z^F__Z|H̜9ܤ`Ҋ(oqr!YhKY A%=i JkQZ-ȭӫڎ;=Tں.. ܹsC=ofiHaqoh߾}ς#=՟"WVV.KTo{jȑleUN� @� @� @� @� @� @�TcAxt� @�Z{g}6n8#VXY=OA7tS| rL!\ݺu͛/ե!CdS]w]vN;8\te]oF,X }xp�I&e(p2a?xRe*}mڴO>d0ԕ?p\r%=j<ciӲ }T_ JwqG;K+g=ӇM<9/O>\~_Z?JkP>̙}LgSNk6RxcynƘ?~Vuw}7.hѢEv.XWܥs sM4B@||q5d?N͗ϼ_|mS [AAA\wu~+)H*JkNZ{"8ȅF~zDn]+7 СCc 7/8;Uں_Gtc~MYnW]uU۷otرwRKkgՑu]1n[̚5+\2hwY;s }'n8sc[^ @� @� @� @� @� @� @�% fͧ @� @�,G)|{S`U)/)˂SPU KV%K'%@z1|_~ޑRpV JVS֌3⬳ʪzW#GW\KaX)oUK e]΋O>9~đG=V[6lz~YV kժU64D駟B*ShװaòSe }̗To :<cر[/Oš?㩧Z\g~VI> qeN9ϳ-ۏƚ7|=zȜRS` '\n4'N) .~_dቩ{.k3�GX;.V5 {^0B.SO<D76(6x7V|/) 8YVGϞ=gnbEeߥe'+/sZcZ֜߭B`] ~BpW`{G)1/Bq_~YOim1bDfS@pzRZSW_]tQ{/K,֐#8SSNYӚ۸qHK]ZS)]dtδyѶmY @� @� @� @� @� @� @�5SN [75˨ @�Q ɑ #\Um1 @�5HS)dK/.]D g}ּrzrѰa\PgѠAp R a l֬YeˬYiӦŧ\|a-a KZ)p1q-ė4iRo߾… #m)H0TGܨQ&6_[7֏ekE޽뮻.L}ז5*~Hᕳg΂8Kw[N-Zd?gPuQ$*ߝuџm+2 L!x)쮢d ,+0sfN;EF_{,{NJ?1cĦn;v\n*D Mờ;w˸ө˴&p\YYwYZ>,8RB� @� @� @� @� @� @�lA5{~�  ךP P~ӟb6 /0?XoL>rԩѲe 5\^a)drذa+"/~.(9昕W7 _\::6a„/y<磲濲-鸶~m 4(n,֔V a8*H @� @� @� @� @� @� @�US^^ @� @�j@ hk .o9.'|ru֭J 駟VX]v]5j}Yfq%^z\ƪaÆ1Ҫ(>WQY_Y#رc㮻ʶ"{gg믿z@ t ҍ=nRrR@ $>Sʼ @� @� @� @� @� @� P}Jyu#)CO� @f<PD{^fXSE#<wqG<쳹q]RV%ŋi{o>3?8餓*G]СC'?IB:꨸+,sE}qbR@ޠAb1f̘{SO;,u7F.8bK.?Oq!~@MA @� @� @� @� @� @� @ 3k\ @�rYN!@�|q=ăoݺu:ݻwԭ[*Ԍ3aÆ6 ̟??V4o޼GL 5*\x;vlzd.㏏mVnm8̈xȅ/Ǟ{&L;.3 @� @� @� @� @� @� @�, O @�C@dy(�\ a 4(  z)6m{WᄆGNV^;Vw?lذx瞋Yf;?Zͦ.+pac'GjĆ.} lA7s=w> @� @� @� @� @� @� @�j >G�X[Ak+y ӧOςz?}Yk.[.ѵkרSW *E(}9rd1" țmڴ=3,uׯi@E|eDG<lDKOϟO<|"@� @� @� @� @� @� @�pA5| �  V @`ƍB_|1N-Zv)vy\VիWlkߘ(/s xZ5*^zx믿VZŮ�-ܲ\S *ۑ 08[nY~{wyW_EF @� @� @� @� @� @� @ kh @�Y @�+ǿ9rd{w��@�IDAT+;Ē%KCY vmnmiӦ|W |g1zl{7�ȉ'FAAAlV;v}fmNGvXč7F{G~;m۶'x"8^pD� @� @� @� @� @� @� k @`mA  @@ ̙3' {W7ȶ> b 7=zDnݢ{>7k֬;5L`̙1vl3fL뭷/:uD.]gϞٶ;d5Lp~qUCFH}n' @� @� @� @� @� @� @�j@>>#@� @�x4ׯ_lv1zH!uov5*HSiӦMt5b}:n׮]ԭ[7_=Z'x<yr?>}g}y4i$ VzCVvHJ\~jydD.8:w8 r� @� @� @� @� @� @� PCJy-T|?  @�C}Q~k&F@�@&Mcǎn7nܸlKӧOφՠAرct%9ۧiСC4nܸ_  ̝;7&N}Q}Fڧs ,]-2ҖSu۷:u�U7/o߈ox刦M#F}G7 @� @� @� @� @� @� @�j 0H�X AkQ PMQrKx_uH6h,2k.6tӥ-[W2R_|'O?x} BM}ϗ-ZDN6,Jnna6{IO#z3(*Zq\PN� @� @� @� @� @� @� PAV; @@ ) P3f&L'N쥐 _~i&ڶmiK7xhݺuԩScӁ#dɒꫯbʔ)}Y|KK[:N… S`i~СCf;v͛7/FW"v-##=,[7  @� @� @� @� @� @� @AVh� PAV? Ps̉I&'|RȗK_D ˗zE˖-m6*SPlPB&#O;Ǵ}weڴiE M ͇o&Ѿ}(,,,~UG`O# |OviФII=!@� @� @� @� @� @� @�T@ W @� @�D u-ŋ@)Sdi?uԥBy ,WU K-Z͛/O6mZ5k֬8=}o:Xso&fϞfʶ3gs3fȶz} }L.[[oH!)$4j*z֭[G ~LtnݺV3D"ƌ8㌈˂^{8Ct� @� @� @� @� @� @� ure_#.}' @�+Cyk @3gNeӧ/*S`>0NV qƑ+Ӗ?NFeA),qÆ #oРA~V8K!iW^q\K:uJRdWڶdɒH+-Z… #0͒o-u6o޼l?;wnǩ/4| gi\R[�##^=r!;wH  @� @� @� @� @� @� @�Z+P֎  @� @�@>}XSx[>0|:uR!'r窱@- ,?n޼yY283?7}>1O VE Fs'o]C� @� @� @� @� @� @� � @� @@ID7޸r;^`A@ȴ_paEbőߧ[ \v⊾GE k,k[n,իW/;׏ d\ L{�UEiӈ!C"z< {e[ѣG= @� @� @� @� @� @� @�T aU) @� @@MHAӟFlFnSS錋� t#=cvrs R$@� @� @� @� @� @� @�j@A @� @�sDV:B`=M7EE%@� @� @� @� @� @� @�TA`t� @� @ ̝+ϲ "sύ8̈NVtk @� @� @� @� @� @� @�- zϟ @�*\ofSh� P"&qڬ`ƈ^">8b4" @� @� @� @� @� @� @�) fΫQ @�M୷յuէ" @�΍Ha_s�I~S'#.M7V @� @� @� @� @� @� @-3m @� @�UV`Μ&N 6 bȐѣ#9g6) @� @� @� @� @� @� @:5C� @� @,Ae8O@m={"#O M� @� @� @� @� @� @�TA5uf� @� @6SC#6 "{n6) @� @� @� @� @� @� @@ `` @� @�XܹQX;]'@@҈8Ȉ_~KD!@� @� @� @� @� @� @�TeAUyv� @� @V̙0A֊6HVS#t?b><kV~Es9"@� @� @� @� @� @� @�TAa� @� @F 748@ÆGdIDl}G~ĨQkT @� @� @� @� @� @� @�" R5J� @� @)QkQ @@6߅AqQ={FLxqD{ @� @� @� @� @� @� @�Z^'H @� @�j@ ,,4B@߅@1wnĢEնpaĀi @� @� @� @� @� @� @� 0KH� @� PA58A <qFwGE,Yt3gF<|"@� @� @� @� @� @� @�TUAUuf� @� @5Sm_Fqe?\ފ+ @� @� @� @� @� @� @�u/ rݛk� @� @RsF.u ,X#GF,^\6ɢE?1}zB� @� @� @� @� @� @�* L @� @@3Gd|'@` D qV o_uW  @� @� @� @� @� @� @�UA@dU} @� @�)qZM`(SU{><s爂2%K"nj\ @� @� @� @� @� @� @�T2d韎 @� @�)�  V1vlG4lQEFK� @� @� @� @� @� @� PAV @� @�Z' M )"??OGa#@� @� @� @� @� @� @�#<r @� @�X&D<HOGliDݺ=paG 7 @� @� @� @� @� @� @�*M@dk� @� @w } fW]ѠAD:SD fy� @� @� @� @� @� @� .ꭋFA� @� @@sF} ٳmN.!w֬Y17@~7ӹy=h~jL;9\paONj-ʶŋG(,YiV'0YVPPu-ի r~\Æ F-uܸq%0hҤIQ @� @� @� @� @� @� @�' ͙ @� @�0\Y.쫆 pu)<qƌW_ӗ۾̙3ۧ�XVI)d8bXXmߍ1eJ\ a}skkS@c+?^s w,y-"Spdگ8W22/LLaɥrY22QVILM6͛Gf͖ڧs믿~ۆnC!@� @� @� @� @� @� @�ֽ͵H� @� @`)R PRp)SmԩKM%�hѢPN,0F+ԩSv>\ 4iܖBrS\b̛�yjޛ S0"f�LA&LB&q \6P2MFoZ֭[Dz4G  @� @� @� @� @� @� P> Q- @� @�H 5Ak!F`ܹ1y㏳}:O>}QTTTz뭗u!z]&?h" _WE&fxRd L[״ ϒ /~Κ5kR(g6mm۶>k.6tl% @� @� @� @� @� @� @` Wn @� @�&0gwUc„ G-/ 4R_ r-֭[g͛7?b_4iik߾*<}NBAKG lذaPڱcǥΝ;G U @� @� @� @� @� @� @�A @� @�*Q@d%k@ Xxqߏ> 'QTTYfY8_ mݲ֪ؗUSN 1H)4re)rٖF'M?!CdAa-b6.]d[l]voܸqyu]= @� @� @� @� @� @� @ S @� @�5Y`FWXXGil@ |L!cƌ)ƍ>.X e˖Y^Νc=O{i!дi֭[V~~ᇑT{oL81w;n&Y(dk뭷ݻV[m^:G� @� @� @� @� @� @�\@d5@'@� @�s|9W{@y ̞=;z=zt~ر SNY@mY�d˳"P.뭷^lٶl)4C?>yx[oye;vm6n}۶mg @� @� @� @� @� @� PAVY @� @�&lܸxX fAFW_}5R(ޒ%Kb 7=zD~?qlYcFVj 4BMj}Q3& EMwuWL0!uѻwa-ZX @� @� @� @� @� @� @@UYgG @� @�j@>�  ̚5+Nj/Syb6^z~m2#P+ sv̞=; N}"msO\y&뮻F>}o߾ѡC @� @� @� @� @� @� @�& ͈ @� @�*YnDFjK| /?Æ {;sqپSN@ @&M/3f̈_~9^zl8p`Ȏ;{G^ѪU# @� @� @� @� @� @� @AV� @� @@mHAfc'P&NO<D<SYc իW/~_D>}iӦ5oFD7o_/^of1"9,r?8izI @� @� @� @� @� @� H @� @�( +&@\ƍ?p<Y]v{F Sxuf)| /E/>l :4~_GV;,}g @� @� @� @� @� @� .AKmm @� @�XF`\AːH|1p{m6=и;"+T@zb]wͶ:L?x<c i=㏏޽{W~� @� @� @� @� @� @�j Z1I� @� PUYUF&PTT=\r-1dȐҥKwqfmV# PZn~z͜93w_N[Yg4iRz+ @� @� @� @� @� @� P jڀ� @� @@uHAW+)p¸{qG-bĈ1nܸ.v~- 4k,N::thL4)8∸]vq饗Ɣ)Su� @� @� @� @� @� @� Ȫ:3E� @� P+RdaaAEEEq=o'e]t�6d?o= zرc\|_/3 @� @� @� @� @� @� @`-AG  @� @� ȵ<=zt;.8󳀸K/4_kTT@ݺu#Gc=Bv9 Ԏi� @� @� @� @� @� @�j 5C� @� P&rڴiq뭷A7pC!CC3T~ U(**:viqދ'ѨQUy=@`Nn0`@uQѢEǥKF^xatڵzw7ߌ+"n/Yg}_wq%{_|EK @� @� @� @� @� @� @ sh @� @�X`܈@ Ke1lذx'bn >(&MiN͋>8 Y}ꩧs4o޼: 5GWYfŷ~ig̘usĉ㮻ǯe+ݐ8ǍGbVN8Sb̘1l+zZ63K� @� @� @� @� @� @�- EG� @� @`5f^ qUWe-lq9FkY~uר C{/FZJeeݳ,Y{g,^xU6m駟]v-~sI'=z(Qc-ro߾qꩧVj*~w}cwyJS @� @� @� @� @� @� @z @� @�5T`U4iR{Kխ[lUo:F4+2z6lXm۶[+ֲ.欨hWrϔvnUQc]5DiUeqmE~#W @� @� @� @� @� @�T3c5 @� @�g뭗F^q=Ļڵ/:lx~a_>>{:4㏏N8a鹴M:5z_|q4k,-Zo=?č7cƌ*~ƒ%K~q%Ĉ#^mԨQ\s5ѹs8svS0V Lc{#Aq'OoꫯFaaao>n>N6-?ѣI&qI'e78 Pq}|b7ּGy$z衘1cFt)o̚5+ ] g}6ڴiW\qEl6Y_uvO{;_ z 4(|ĭǏSN9ede(^Zֻw9rd<kYg?Zt{N;dMWʺ|w3<^Z,SSO-uNA{Cٺ=q8蠃g?YJ tM{f޼ywJߩ<w,]#[^&Xxqxu]멂??ve2;QK:uwYǎ[n]? @� @� @� @� @� @�UOD� @� @L%zcv> dlٲe}qGf)81N<,d1B/hذaBSb0BS0W xq#{SZ :~: vӧOv>>x5s\'@98p`9M4)߅8㢠 z8;(G;`@)S=7; P)D5zPWK/eػp/Ǽ괪PcIEhK52àfƾf1vb$k_N2bم,I*w9uN,ls/:_),14;67>鳝 {CS`,нJ堃a7pC)5V Ribѿ5jTW}+z=쳱6D.]re K"VRs*v1I)sIw1̛7/TkQ\?K)lCk =3=O4)~go/=csz 6_1wk]vɡBoeƕ~6dtSI)t8_yRge#'}FRB� @� @� @� @� @� @�G@⨹� @� @@ ̛"Ly/8r!ڷo)$lmG mkӦMlFca@uW RVzWn)Rc aLaf)H.KAV)2;зl0~:W^xy'aa͚5~,HNʮNfG0T:물?~|t).o1A95Κ5+7u%DvzL!)/=ORO<d6l믿~z&SIyʊ+/B>?ܹsg*cQe)|6FFr9sJ(+zN|ѢEHϦ IK\}ՑBClwq7nyE!&_~9&OaUYRcz?P2yIG)2ri4JSOy.tڵEwT;齛  @� @� @� @� @� @�Xsk @� @�ӧ6Z~3f( r+nͻᄏp(SւK.%vi;B7)P-m&yIAm묳N|׹n۶m:կ_?I-[AnIXk*)m̙1{*_2O?7n\6ڵk)2;s1gmݖ|71t2dH=<BYLvT@֭e7[eͥ/"~ӟƽޛ~_rҁ{ ۴ix#=L]vY[ꤲkFB_V,^ϲ4QFEnbȑ96-=S^*oqIYV(m -O}XU%qjpm&;PpS j~_ҳˢgU$ڛ8qbJKim @� @� @� @� @� @� @@Yn) @� @�TOSӸZlXK[ow|҇K,STTR�X*oFt|饗7.Ə'|rSAyܘ5\-"&MÆ K GKov6hРXuU㪫:R>=:/kҤIE:NRj ;vlY 7^^.`ɓ'zJ\xᅱF Y-WQC=*[8{NZBvF"sM7k6z)zNnEKpggmꪢqTt^{[_-v LAB;ioy-< J~Qۅ1->=ww{cu= @� @� @� @� @� @� Y^7l @� @�ii-^3<Sf\zoӦM +}Af͊&@ᄏࡅuHˌ3bȐ!ѰaxWD!,r9s{ꫯF~x?>|x2jԨcĉ9`His]B,~gώ믿>nHφGy$8E6\Rj 'zK$ʢ>+,KϖnyGʄTVVK{J]uR@o*~UUYq1EG_ي1e*)W{~p w� @� @� @� @� @� @�| r� @� @:55ܢ$񩧞*K/r˼.͜9LڵkrgƼyJ?sqꩧ/j#=�<0N;Xmb~8LkQO<1VYe[usO:Ѽy<xp=`wa|Pr%)p 7Ę1cc-YY}V_W駟F߾}_WO>&M#Fs{}9GѪU||ZqmgB )`{jgsXe_*ilTf|>2e)o͵1>Ѯ]p +򃏧;wLӦMK+ O_(ܛZ2Jnw}qI'E \k*yj @� @� @� @� @� @� @ Ȳ @� @�,5A-i&;;3 x衇uq)Cm۶x RHE]~a>VX>(+_F-bȐ!.ĕW^ ~_~yP^I/|o>ѥ:)2~eqʔ)\;#٥).*RPܶn8sܶf馛~X?OCF>}oY]VtRIAoyl +i{)H1[v)~_D˖-o=R38#^~5kVkV,8Yf�S=.YV<묳⮻ʁ/Æ KQs*#SAbر~e~|ǹZSޱ3N ºq7tm*Ç_9wĉqgU3+R 套^}SO?=V\qQ M_s[wN M+??_B S;>2-:i._//վuF� @� @� @� @� @� @�K_g׮  @� @�j-0?E|79,-r!9\*4�z$k׏6( VZ)><?9|=9|-{_ZtA1bĈN Kaj f͚a'|r4h qsqG~eʼn'�SO=5o -2;<w9l/LᏩ^wI']t;/_%>cFݺu'xbiu~Ra<BVBXS 7n߰aѣG`M{)6^r%<yrIȑ#s�s=WI)ԯeQe)3ό6m9ytM9ӳ+T.9B;Saz}0aBݻ$p|pcy{QG[o<c7.;#O>ϳQ\ c>}zlƞB=*[P,~"4p 9|CvOWAM)|8><tʆAE L!?V^yI/w[o-_ò,�>;㷿  @� @� @� @� @� @� @+yU5⿵̥o @�Z"p D~m%2A�CFqⰳw 1cDvbZs/�PtovL[{z*ܝ2eJ4m4R\|Ѻun4ٳgG KlԤ:䠺 t5kV/B/r?Kx%Ϙ1#4iq4jh{R`] \~slI>-[,9~ɉQ{yϲ.ҒSIό;Wҳ(=SZj}UƱ\_ztMspeOcu-XM^7P[*_O+b^wPBT~m??v^uU޿  @� @� @� @� @� @�E? @� @� xřQT2NVZ)n7RYy +o^z9ls9V:<P2!nw K%UT7o]v@}=sN;-:vO>9:tQ(@Ҷm¡r鳖V+* ~ܯt<s=C&Ge)$tP`QQQ3r,ϢgϞc:yI'A~h8J_W\ sHw[pN# D.]RrS-Z(ieB,8p`ǠAr 2  @� @�Ǯ��@�IDAT @� @� @� @� @ T/(kфM� @� @@uHAM*S]UƱ +W_]e@uCs1lذxOSt)zG9:H|y&LUVYe iw_TM6]%~n&l}UN*;:cƌ(9V&/ƛoW^yelӦM?=.f.#@� @� @� @� @� @� @�eAC� @� @` LѼzѳKS= X[new}koUVѿ8cǎhΜ9_"^zԑG|.ݺuTҸq8z~裏G,Y]Pɓ'ǐ!Cρ;C{ォM5 @� @� @� @� @� @� P+.U5>}tUբv @� ' /UqYOI @�j#p9Gz PI)S77xc926x۷o>ѩSJR5R]ҤIHRf̘i)]VXaһI;#<+r/Rz뭷F  @� @� @� @� @� @�Eu  @� @�,+S#7_V�#вe0`@^Əzkvmqgĺ{^z[o71]}﵂TҹnŘ1c⡇g}6Zj{W<GL� @� @� @� @� @� @�uN@d&L� @� P]AV;a~@ ~~;o[4l0vѣGڵk4hujW>'|2{xGO>[/V[,~  @� @� @� @� @� @� +.Ux>[ΪjQ; @�Z*ڸ @@8䐈o6 @B)S�~8xwe˖[6l[nel&ѬY*USܹscܸq3< {Xar.={^1 @� @� @� @� @� @�TKj9*"@� @� PNh޼L Q~%|1bĈx'bРAqGQQQlѽ{ ,_hРAU3m/0a„x饗/ȑ#믿VZ;ݺuj @� @� @� @� @� @� @�, r)� @� @@A`ڴ6m {vv4>,}x# ͚5]vr-Wۉ̏@9s[oj3&NRShfmp@lVѩSW^6 @� @� @� @� @� @� @�( :c"@� @�yoѼyI P*O^sƸqbԨQ1zr-1eʔ_~ZY[oYN1)ދc믿>~mEΝ?izꩱ&Dn݄֘;l @� @� @� @� @� @� E @� @�XJ)rRg!@ Bcx͛N_1ceذaqٳ^zkDǎKu]7$6lXmuC .'o7ߌ7x#/̙33ꫯ]tv!;p ~ƍY @� @� @� @� @� @� @@Y'nI @� @�TGټyu1 P]R:묓}٧dXfazq-ɓs Ěk]kr0daB"W]uH H{BK zLӧO]Pǵ^;[os=SNѹs^~j8!@� @� @� @� @� @� @�V@d5F� @� PA;l~@Fb˂|9$ryxx衇?sK6lzLiYc5m۶%jR͛_|EICi裏?,YoUV%᣻[$СCwMi  @� @� @� @� @� @� M7e @� @�! z PVZiHof͚|A9/m�=ztL0!LRr]zu֑!۴iSy{W:-͚5+F"~91'NXfO'|~4n8NvE׮]:Z+ZlYnM� @� @� @� @� @� @�, r @� @�93fD4o4z 4j(]wݼTd2mڴs(dZ%B_}ռ_ܹs4Ӵi ([jUfYq#-/|^VXar˕i `_ee꫘4iBKw%݇BgZ0ѴNK۶mcW @� @� @� @� @� @� @�/ r\I� @� @`sr؄.$@` @:eQ]2B?/,<8nܸB S`a ,ԯ_8yhѢdIi<ii֬Yu lҤIK ,, 6,.**O ͋9 iiv j,,}]̙3ÀgYۼ?}lzԩodImWSf ,rpt_~Na+r^ :� @� @� @� @� @� @�X  @� @�,$PKqB�)BS`Z:uT9̞=;BN<9S8dp)42-)1NG,BSbM+8Ѵij/ \qsf!$sX~L @� @� @� @� @� @� @�W@d7FF� @� P A͛I(**VZ)/^Cs΍9s̘5kVL’"2gΜHai]z;]?o޼2KXz.)3kРA^ҼvuÆ QF%Kaq9q̘qLj7{.$@� @� @� @� @� @� @�j t � @� @=L)Yfy#Qt#;qwQ @� @� @� @� @� @� @�\~- @� @� m1(,uM6x#3gA @� @� @� @� @� @� @RuG� @� @ {@�-8찈s g  @� @� @� @� @� @� @�(PT'eN @� @�@ W/Y>R#@�!E 4=4 @� @� @� @� @� @� tA.]o @� @�ӦE,/ vh8+s @� @� @� @� @� @� P{A֞{i& @� @�5H`A5hȆJ�KAgψ#?Qm)t  @� @� @� @� @� @� @` \:#@� @� 0_ A6oN�,,лwĭFx`D^pG @� @� @� @� @� @� @�+ ;#'@� @� k3t,ƈCyKS] @� @� @� @� @� @� @�KE@Ra  @� @@]><;#7Xn瞋>=bKWY%bU벖 @@A_Y"~ag]8cM� @� @� @� @� @� @�dA5; @� @@Xmh`=wnĜ9[v ]ߕ=f�@ 9f~)] 3'@� @� @� @� @� @� @�E@dmA� @� Pm:wXc>X@68:N�uU93A7uU¼  @� @� @� @� @� @� @@_;a @� @�~ENJJ:wZUTqqmĕWe s'@� @� @� @� @� @� @�5_O  @� @�T=䒊w[yg @I'E̜1`@DF?9 @� @� @� @� @� @� @& w͘  @� @�jvE4k1}zC!b?((y0ȣy!3 @� @� @� @� @� @� @@MYSq @� @�h #v-bذ9sNA+{HA?? Oj:N� @� @� @� @� @� @�TGA @� @@kCZ <Ѕ;B�*8p~{j:N� @� @� @� @� @� @�T7A @� @@k ݁F!@�_#f͊w~pyE] @� @� @� @� @� @� l/nJ� @� @ n&e={vıǖ=f�TV"9$b"}WG� @� @� @� @� @� @�,KAR_ @� @�uN`}"O^N"ws &L�U$%\{U԰f @� @� @� @� @� @� @�%& rj� @� @{1{u!}r g!WK� @� @� @� @� @� @�,mAK[\ @� @�uZKmErH0y" "n%b#zx*jX3 @� @� @� @� @� @� @@ rR  @� @�X?-[. @)`;"&b]#F @� @� @� @� @� @� @�KSO @� @�~3?> /i/I&YOf*̞Sqwmmz4j(/-S![jUѦMh׮]ɲjE.?~O�"PJ!C"3G#"6ܰ<  @� @� @� @� @� @� @@Y3Q @� @�,#8f̘;vly7n\L8dDM65\3VYeH+rz9бy9aÆ%s6 .?9s㫯A&L~'Ĝ9srlAҹshܸqɘl @@Ha"zy'(~M( @� @� @� @� @� @� @@5YMna @� @�,{ٳgǿx^VXa9xwޱZkEvҺu<-X{W4孷{oOlԨQt5b޽{^H�@qFqw_ĮFSēOFtP7-̚� @� @� @� @� @� @�T7A @� @Rx?SL_>6l8sOh۶mk+\QQQIW 9jԨ9rd<qeE:vq''ew-Z,x}-=zD{ ⩧8ȸO @� @� @� @� @� @� @@ 7TXҝwVU!@�X'08.OTe=% @�_;#c⤬>veib׏zXo6B>#_~9Rn}}7VZi;?'@�&0yr"&M?z  @� @� @� @� @� @� @�YZ#@�:Aq\qǘ1cm۶{[mU4jԨ|9rȐ!Ĝ9sbw>84nܸ @`_FCDqVp<d @� @� @� @� @� @� @�JX @� @�O<}_o}<SG%\RCLƭ[~E n kf~/ۡXF+cQi@tK� @� @� @� @� @� @� H @� @�N`޼yq]wFm'L Ꮧ^zil6Q^Z7Ly9rذa9qqM7k3_4@UVx9s"v9/j$ � @� @� @� @� @� @�A& @� @]v͡:uѣGdz>zh4i?mꫯsN{q뭷ƸqrxA @@Xm#M#⫯j͈� @� @� @� @� @� @�TwA @� @@^~zc_?ƌwygTuRQQQ7ecƆnw\q@:aR5֘9iRĮFLRK'jZ @� @� @� @� @� @� @ 7ư @� @�*''mY̜93^xᅸrdZP P^9z[oΝ;ǐ!C U  @'?1aBnELZK&f @� @� @� @� @� @� @7  @� @�xbM7k&92B_ ԯ_?>x7c=?_&% @&nӧׄQ# @� @� @� @� @� @� k=4 @� @@ۣ{J+E L)P:d{<@?~|u%X;F<Xر{Ġ̘d� @� @� @� @� @� @� @ ZM� @� Pc9&kfd5Q^_f͚[l/b5 @%GYf]O� @� @� @� @� @� @�,J@t#@� @�v{n~='4hPXkO<ݻww9^x8Ms"@@5G"{."R8 @� @� @� @� @� @�X 8 @� @�J/yuŀYTRYfqwǎ;z7xWF�5A`M"|0b~"̩ 6F @� @� @� @� @� @� PAּ{f @� @�:)Oӟ#a 6o=:w{WL6:  @"#x "έ5C� @� @� @� @� @� @�,A� @� P]NrH;N;::3&McҤIq'֙y(F{owGՕ' @� @� @� @� @� @�X: ^ @� @�~HaW]uՏh.Mc馛o߾+V]5m㥗^A#7TN;ֈcˮ#n |oqO~xG9 @� @� @� @� @� @�UAuΛ7 @� @|q饗ƙg+r)Sb̙ɓȘ͛WeVe[uo{nö  @1xpĠA_&UxM4)FL6Z wߍ?Z!@� @� @� @� @� @� @�A k @� @�j)pM7E 裏6k۶myѩS%2<9*i{ܹN;Ŝ9s9S>`S  @q_qgBߕ;vTo~YǔM @� @� @� @� @� @�XF n  @� @�*'0tg}b喫KVQQQG~,3Έ#Fļy|=3ZhÆ ["k�GxcEEuֲOy]]KvЌ� @� @� @� @� @� @�@2n  @� @�jٳcȑqQGUN<Ę0aBԫW/nx7[6ucqU&Mb6/8zo{L~a\{/Fͣ}o;}Ys=DZni<sB1 s191 "9=Cqu_׸Kc̘1e]_"Xc.6ij>w\yU#@�Z PQfEG} /7|s5\3vm۷oweѤw|Ir!q衇>߱=;q֭[r)W>=s /sFÆ N'|2znӦMϏuY' =rs-) }A~q%+Ö?lP8oM� @� @� @� @� @� @�5_~͟ @� @�V88usU>Łc=R;vtlqCǠArS:v|Q~x#mS(d ~L%?va98*,.]ģ>kV>o) j=Vou]4T8ݻwޮ믿~[Uݬ @ qCגW\m]g?ǫJxѧOaEhR( 'SxrzGu]`BS(~7|osާ)Pr#_vRd*i)y[o5_pJEw}7b?3O?{B� @� @� @� @� @� @�G@dfB� @�uSLsZa|nEEEѡC2Ѻuc;cxy?_wy'メ:?t#A=ӑOe]w-2oi&6h~HRܹsc 7F@9sĨQr[n%fxƘΝ|ѢEW^n+]-O^-I�G䒈SOʑ9C۷!nmj{wealA38͋+tM911woXEӽ+7O%[O<ļOuf͚E~KNo,{@L>:?HsH嬳k? @� @� @� @� @� @� @vk1 @� @�eM431c2Y۶ms)1'EҮ]H!)?;/nLS;u#GV\P {」~&N尪%Fƍ@˚$@�(pq3gFQ8昪=߽{2 nSOw/9W]Y8إKLi;>(oHAOO?M묳N|XEӖ-[A\sMK ,|?I^xa4h RXe!x25qQ:thZJo_z ߍI? @� @� @� @� @� @� @ ԯ#7p @� @�Z/P]|w\SR*)ܩ*J 4hPqUWEbذa 5]:ܪQF1ytMk={.TQ,BVtRB�uGओ". b(~UͼǏ* ny7,{͛7/7":K%˸q"{':{) 2[l&M>xN\>=:/ @� @� @� @� @� @� @@Y+nI @� @�j@-b֋{LpΜ9ѽ{xW_~1eʔ8ceX:ꮻv-<HS:u*SvJ}u?ݺu[K]C�5X3#:+⨣"nOdW΍<3e[}~6mf͚n \T&t:R(sz/eƌ1dȐhذay+`E}HKeԨQ%ӧĉKm @� @� @� @� @� @� @@Y @� @�j@^^",**0T͛)iܹyIHAS'xb*q-u]{rwP3gt?p<}cӦM4+4ٳg_:+o>) P;/⤓"77<7SOi襗^[ne^,sA;]vg,N,MӧzjW=S�vZj^{?)`އ:Dc1z蒎;,>c6 @� @� @� @� @� @� @f   @� @�^#7|3,UdweGpW_{ohswygST uP;#>|vw뭶*۶m<@ો.( guVu]9x*Uzcذa~a 3®RAbر~UKcǎQ窪vC�5G88~눃\|z'ΑeCzhݺur)ޕ~a>WX>(+_F-bȐ!\y1`ׯ_\|ŹnE|G \~}QhNᐩ/ aӥC+ШQ8svmsN6Zkni @� @� @� @� @� @� 윪[*{y� @<x9|L4 @�&ЦM5jTfLի:cň#駟9ru׍g}HNZ1y8Crcȑ#c6B0բ8iҤꪫ[op=3N8<VZ幾+9}n{3ė_~_~y<#ꫯ+"Rpܹssf͚En0ұC4߃Spܸq¯.ڵ뢦rv3Έ":tX ;oVy/ǃ>kfntwe <s#c{K7Xj/@nyImwh N_}t%BV>-̦aÆ{mY>B8/Oe]ǕBӸ,{nOaO<D<ѳgXV @� @� @� @� @� @� @vԛW\j*}oo @�Z"p D~m%2A�,M8_X}.O)HqIL5{3gNL0!^{_~RZվ}s}]0FoڴikIAUU%3g PUh�j@/Nřq-=z,S1c]v,+S~7~;{$O2%K3wm֭+xeSŃ)9X* @� @� @� @� @� @� PA֮i6 @�*Y$@�S @z$wリ,?{A˖-cĈSSN~q%ċ/]t)6NXYqCD<@/5O� @� @� @� @� @� @�j@Q ! @� @�$5vl F 'ƞ{=HtСZ)ѩSEiӦ<_SN^s59)78  ׏ᆈYC[m<8ҢT, +W_]qg @� @� @� @� @� @� @1@  @� @�[>_z)o"5-Gzqs;?xtرڠt+dZj{kc??;>]#@�h ["8 WGlE7 7<ڵk @� @� @� @� @� @� @�. @'@� @�DY"FxsE|QD:Eg@E߾C60_{[*+j:thl65ƍy޼yqyŹ瞛:  @` wwDoĮF ӟVOOv%vW^ye!@� @� @� @� @� @� @�@O @� @�KV/"7S#:eˈݣ8X0bԈcxɓ#^=bРclY|>;CN׿u^er>?18쳩 @�h(bȐM7#}awyg̜9s%@� @� @� @� @� @� @�5\@d O� @�oq Gѱc+G0ȴ]��@�IDATecF|eGyfĎ;FhQ4m4EW$y'GϞ=?j Gy$6p?#F:]2mƍ# wI;GW_uw}Wr� @� @� @� @� @� @�A&{woSm8<gHyȜDRG\]`H$Qq+J7?MBe2EDDܢ9d=}g>s9gX^k}wx>@�@�HM5k"۵ʕu~MnyNҁOFI=$U,et#]ܷo_}ںu^e 4H(WF Xf۶mu~Zz4hy7 �$Vovk[o6m"6/-r̘1W( � � � � � � � � � � � � �A"@dH� � � �JL@ԺTTs҉ғO g-^yEjB*X0eFXn]ZJO= իkڴih$Y௿K/5WX?\&M_ $ @�ң@\ܹRR&BcEN_x^4@�@�@�@�@�@�@�@�@�@�@�@�@�  2Ho,B�@�@�@�S`ZwBYS^XE祕+C9s} lْs={vZnjժm۪F2e E=%w⋺k7`~zl2o@�y#B- rΘRy &<@�@�@�@�@�@�@�@�@�@�@�@�@�D L@�@�@�HN;ѣRZUO:w."񧟤3jזdI\Z[eʔqQ*WۻW 6<|5WR>{�wCm sgz �ȟ_Z@ʓG0ݻ gΜjӦƌ{ � � � � � � � � � � � � ��AAt3  � � � pǎI3g *V (u.gıeˤ#%ժ%eNtjҤI[oUtUWK.Zh.\pTAq17N5B>j޼y0` 4y< @(TH+)$Dtz:uʕ+~züG�@�@�@�@�@�@�@�@�@�@�@�@�@ h?c&� � � �9^}UjX*XPN#^,iz9n])K47Tre 6L^uo?{m%JgϞZd.F(Ǐĉu]wH"z^Ѕ@ozꩧ/_ @�҂SΟnM:pQ|z̘1 � � � � � � � � � � � � �A$/۵<9  � zCe ~> @ =*}4wҟ n=bkT*\8_^&Mr7nty TM=0/^<(V^/y9r-{\ dbL@ %5j$/XD=n8m۶M35Kw#� � � � � � � � � � � � �&@dl*C�@� 27 �K~f͊ؖ,,խ+RRZRLrj2_Uȑٵys>]Y^{nFϩի*U�'NhŊZ|-[i_=۽M/>A# �ոTWR޼҆ Tre}jҤIB? � � � � � � � � � � � � �D k@z@�@�@�@�\ 4c4sdA D>~ԬT`@.:VgU9b -Z)N0A'OTܹUzui!B4Vnֺu"kj:Jլ\gμ} rP3]|�$ @(UJ^ԨQZ/J*N:3f Ai.1@�@�@�@�@�@�@�@�@�@�@�@�@�t+`v-M\- � @j 5ECS2.S{J� @ xki?ʖZOaC)+;Vwo魷ޓvZܹs_|rYFh]P(Qm%Km 6 zܫϕ+%K={V=zTÇݫ߳gvᶝ;wj޽nm9sf)SSVR zq�!E )[6i\\c@�&qԸTS  � � � � � � � � � � � � �"@dI� ��A)K �\3ԩ^~NjZNj /pAzi؈}O؂ 7lؠ۷G4ZP48p8Zܹs0ɢEpG_ؤ.]Z*UR9ˌT˖Җ-A7ouN"� d|-RB{աCT@�@�@�@�@�@�@�@�@�@�@�@�@�@ L.IA�@�T L @ ] =+-X M$͘!;&ի'i*.A[H'KӦIGĉ:| ggᐶz5rHF (dɓ³sQOfi@�XJj$b%K+9sJ_~eG � � � � � � � � � � � � �Z k;?@�@�@�@� \(}4~4e`An]i�m[5Nӥ3MSF%W\XnC߿_-[LΣ34uԧOD R*� @YS^tmRݻUx44J� � � � � � � � � � � � � dK@�@�@�@ 6m^xA*]ZjHZDziVi2驧Ls}I3fHf\dR2D1B8PQ D� \w(k|3fܥ5U � � � � � � � � � � � � �A MaH � � � 1>Pj@PA=ZjNZZWo_TispAY=[3Gm1}^ߵkgΔ¤C<5 @Filx/= � � � � � � � � � � � � �  A]d � � � -~XJGD /;^WOK_(=4md7ߜCJ4m*-Y"m&ի'mޜás@�hH39:zH^(d9� � � � � � � � � � � � � @ 2]&� � � �&pRZҍ7J?(ĉRfR,6ԙϓOZ4ut뭩3kժRa2@�>>TC�@�@�@�@�@�@�@�@�@�@�@�@�@ ^F�@�@�@�t)uԻtUR-Y"d iA4|4aԢEf X1iBQ#),L?>UA �$Jysii5S. � � � � � � � � � � � � �iT kB�@�@�@�J!C?WzPf̻J"}ԦMZLΜԩR>RRifx @�(-[J~*s-[*Jv@�@�@�@�@�@�@�@�@�@�@�@�@�H'A0@�@�@�@ } ̞- $-Y"p4qԺI:eԳhW̙#ʕx"" r()44O �wKcH;FAdJ � � � � � � � � � � � � �A/@@b&� � � �xQ6M`U;Nj(#ɘ-\e}fLKu׮RR۶RX4}Tॴ5 �}I҃FA{&˔)sE�@�@�@�@�@�@�@�@�@�@�@�@�@ 52f� � � �YRZRvRrAvMZ|30}S/MJKH۶II7  @0 <4bԿk1gvtmҾ}1q@�@�@�@�@�@�@�@�@�@�@�@�@� 2�#� � � @P,]*կ@Xz4eTFPL/]LaE |yOLŰ V/\8 !� }Tz-OW 7FzmQ^@�@�@�@�@�@�@�@�@�@�@�@�@�H;A{H@�@�@�@  l.m+5h e.\)M&Y%pgJmHOK.bŤ F0i`%sB�=!CK1B:p@&iڈYP0S� � � � � � � � � � � � � LAd. � � � 03gʕ_fϖF];`C#?Vf͒,Đr9sJSJա⋗&- � O?.MQCڸQ:w.S?L^i@�@�@�@�@�@�@�@�@�@�@�@�@�K @�@�@�2ҥRZҀA-ZdP40qaäѣ#Ÿf=2D1""`cG)<<hD@�HK+}?f;{6&T@�@�@�@�@�@�@�@�@�@�@�@�@�ҽ�A2@�@�@�3RRÆRRڵҳJ!!DXZzшҶm'@׮Ҝ9̙RXtPrL; �\ҍ7JGD lᐟ~@�@�@�@�@�@�@�@�@�@�@�@�@� 2#@�@�@�@�t ~T4rGܹRɒ`A<Ŀڴ֕ ≦5m*-Y"m&ի'mޜF0@�2֭Rݱ@p^yExѷ+ � � � � � � � � � � � � �+@d; � � �nr~E9 : [7qO֬`i`UJ˗KGA.^@�2cR&i6IsdX*&� � � � � � � � � � � � � Lc7 � � � @Р~{~X;k2HƎ&L>X*Z4#K~ŊI JIaa="� `yH~+=%80A�@�@�@�@�@�@�@�@�@�@�@�@�@ AR@�@�@�@ ?/u, ,% PX ߥݥKj,&34uԣԡp @ (JFl}`k!mm|tiPLI � � � � � � � � � � � � �s d � � � ԾgҜ9҃&xi/J]HeH]Z\<Y2D1B8PQ Oi@� \s<{ d֬Ԗ� � � � � � � � � � � � � @ � � � �X-/󥰰t< {I? }LS5"0üˡCp @ h,b<w.7k.A�@�@�@�@�@�@�@�@�@�@�@�@�HAǰ@�@�@�@ e^yE0A6Mj0eKؾ]WGUઔhTZDڶMWOڼ9eU@�+ ܲEEʒEʚ5A @�@�@�@�@�@�@�@�@�@�@�@�@�H'o)8"� � � �I`ڴoyn=SzzcI%KʻGbnUJ˗K-[FAN.tSF�H/^_#GѣnkꘪW?ɓ+j8)O ٧SNno|gΜх t-̙3{Y{q퇄({ʑ#{M}<y;wno˗Oϟ߽Z@�@�@�@�@�@�@�@�@�@�@�@�@�-@dھ?@�@�@�$eGzݭ? Du3c4oh-[.R*+&-\(u IFIߟ K@�PC?o>Z]dʔI9sTBuLoMRDě ` F X+"By}|a_PJΟ={62p< 0˽{F?y;ǏP}B*Tm |_pa)RDW{_hQe2͒c � � � � � � � � � � � � @J RJv@�@�@�@ ] t./2gm؃}NIO=.xM>??/{JSJ}Dܳ͛ @ X]ܶsw֞={fQ:Η/_d^y啪RJd f|yU\ x(Jm -ѣHW dM? M۷0J_L 4KvW+Q̛� � � � � � � � � � � � � <A&# � � � @:3GSWp^H:Ip} yAFkqV:dTd!9jeN � XР<fmٲE۷o׶mf!%K@ " +&ۊ)… {%cR#Gf6I).\E߿_v|{u>-]ԅs<y2<ykQRVti-[6rP@�@�@�@�@�@�@�@�@�@�@�@�@�'@d✨� � � �A*pԳԾtgBdZ;vD@@42ƒG%m+IӧK &J �Çkݺuڰa6nmݺUnhծ][mڴq*XD -ZTI @f/+p[ʕ]\DQ&LºndʔɅwVXQRJ � � � � � � � � � � � � �-@C�@�@�@� (0dwgJ#펑/дdԢT4wT\p@ Xڵkj*/5kg7ٳ{rP.ZlYvL`ڻQd[jb~QmٲE6m@W^ɓ'СCܹs{תjժnYjԨC+*@�@�@�@�@�@�@�@�@�@�@�@�@ C!n3D�@�@�@� ^jٳ *RA˘Ҹqҧʻ/0�L6/I˗K-[FAN.tS5OC �,pYߊ+?kn-[P&MJ*ntʜ9s2Һ@|TV-En:{1cFd@dɒ%euq_B Eo}@�@�@�@�@�@�@�@�@�@�@�@�@ ( ʤ@�@�@�@ 1KyHWDp :}H]'k&E.:t¤QO.i@ .]%KH[͛-NM6ճ>5jRJʚH ]pjܸ!v>cV?}ׯRLկ__ 4pU4iFx� � � � � � � � � � � � �" ;<@�@�@�@ I{HÇKI9rD\zY&*Ҽy_K2Lx9S% @͛?zD�2?~^@B.тի={N:*_;qF$j֢EȦ߯+Wjٲen۷=QFu-0R>lA�@�@�@�@�@�@�@�@�@�@�@�@�t,@d:y @�@�@�.]7G �RMHM82g ʕx"" r(y!)!"�(<<\}ϟ-ڵk .۸qcխ[W9-@*.\X͛7wuEYF-rk^z5mT~5kSat� � � � � � � � � � � � �\�AMH � � � NF}Vʞ[HA{ֻeˤ Jo vJڶ¤ӥ3} �Cѣ={>sxqծ][-[o ([lY;L2Zjn޽~-x nݺԩSgu*_|'F�@�@�@�@�@�@�@�@�@�@�@�@�+9N#� � � @FG ={VQp_#zk� 4m*-Y"m&ի'm d7ay*Zzϟ[o={hŊ&Md>#LJ*ٳ 8=x̙ZjiذaP :}״sΌ@�@�@�@�@�@�@�@�@�@�@�@�@ o G�@�@�@� xY1~PZdHHHԃT_s^htUJ˗KGA.^k@ .Xbzᇕ3gN}ڿ>3uC1lbd˖M͚5;C۷{k\(dRtkĉ q-@�@�@�@�@�@�@�@�@�@�@�@�@� @dZ @�@�@�&II=K !2K TԼy {r˴pԨ&#@ Xqt 7nݺڴi ?]]wݥ9r0BAֶm7ꫯv%KTwd&@�@�@�@�@�@�@�@�@�@�@�@�@� 2,i @�@�@�ҁرRRz1kJ1Op$ KcLTV+)S@4$34uԣԡihp HCOְaTlYu] 4І \]N;w44Z@`2yƍkԨQڽ{ɓ'tz'cǎ@�@�@�@�@�@�@�@�@�@�@�@�@�8 � � � |K&D6;  ŋh˖7]EV"! (u(ő2&@ /^UbEKvCu?"zD m ׅ͛[N'Nʕ+UB=3:rH<C�@�@�@�@�@�@�@�@�@�@�@�@� 2o1D�@�@�@�ҥҾ}R#Q_ý9 j[nٳg~Ҡ@׮Ҝ9̙RXtP$CB�(a5lPݺu#<&oѳ>|pt@Ȕ)Zje˖iҤI;w pH  � � � � � � � � � � � � ZA<"� � � @f͒ʗ*Vg;MKiNiv:w>Ҷ@ӦҒ%ҶmRzi{H)aÆf͚*^֯_^xArJh@UV駟փ>mرcA=g&� � � � � � � � � � � � �iS ȴy_ � � �Aq7lAqWw}޽{RJ /I&jѢE;OBFI7$pCA7ֱcz;C;8w 5jH?csVÆ tRw|ܸq.<k߾}~^{M=\u>eV/\8eI>+kx/o7kb|ڵK={Lps9c`$u.b\pܥKW|L ZK/QW^UVsIٿ}qzדzyg}V+WƍUN/xz[?E�@�@�@�@�@�@�@�@�@�@�@�@� 28#@�@�@�@�o6l2wpY0Lb|.Lw,-^pAVZ%{ˁ̙CE΂[1l2-\0'O²{Yǵb W׸_[=oE69rWoO9bsyARX4~|W}V| :T zߡ(im۷~[֭Sɒ%]HUVhQw͛7sno7ʠbI8ci"ʡĴv@ o=ܣyi۩S'dA )))Z "wڼyKz=t[͙3G&xZ*] ߺukrwA{ � � � � � � � � � � � � @AI @�@�@�&EP~geဉ [oUϟw vY5jԈT:%Kmڴ!fΜ6*hT)kV#Zxi׸qb]uU*^xm۪vڵkʕ++iӦjذ V]׹5khǎ^hh UșSIRҋ/__/ }vܩ3fЬ?wYׄڰVYwܡ w޼;] s nAŲP[vIr08@x7߸P5kfx�v6k 0rq}R۵ݓO>A1K[G=Iҫ'uSWʕ $ *UV.0<ڜA�@�@�@�@�@�@�@�@�@�@�@�@�O m-!� � � �N ԑgĂ C--2[]x1.byMCsc<Y^b]vA.]Z%JEZ?mٲE{ ܹs+ XH(.ܴi\yz_;FrL F:vw\_ÇwRFkBmXw7|Z= ,O>D2eJmv5c7@i/%"~'y7D}*U= ۥ}vY0/Rۉ~崛\j'ܢ_\u?e۷O6 � � � � � � � � � � � � @&@�@�@�@�t.`Am? ӧO0e˖ԩS^ d+^k?CꫣX7}*SZ7PE|z뭷j*Y`ΝլY3wBqƌVfw:T͛7µtRWf͚zϺvaÆݻ.\wyGYfu!qT9g?^SN/-ȑ#n-[ڏo|B2wwN:y#?VZ'-μ}B!:gc9sF7p Չ~︽vlb+е7m[),L>]^(bʏ!ρ}F Pu>saG}z+?v/_>_;{~Ξ%=>c?ev0q?~\<Lox>`b 4H7VVb ;wgyq5_wI&GJĉm6/'r3!gϖhƌ5kbŊ%iqoZ>|ح#[C¤Ķ.gzƻ{nu Q2u-DiAo\d[χ!<䓪_~^m=4vX}WRP(3o<w_٣:x!^ _roذnz}~5m5grb5)Q:H 7w!4 � � � � � � � � � � � � � d(@�@�@�@� /i&n'eaΝs!@_| O?,Y5`L+Vtt" Q/M4qho+[nՍ7r^==tM.-|,T{\GZX�͛]q7.رc{ճXvyviap7nYo|B2yA; 6lFe˖uAFg݂}{q!HO<, B0 #-ΊRϟwI,i͚5Q·׉�;"дd_G/oL0XY TF =曱ȿ |~}!W?ۿ>e /ms̞3UVuٺukοiΝBtwU|}� ;-{dΜY.zzeoPkz9rp M{Gzwkĉhk7qق-?chbke6i;+h%Kt#.S ޮ=?zi+/_>w=y?6v 5p˨QԫW/NnAW_>|{׮][VH"uYv|U\s6פFvo`? � � � � � � � � � � � � �)-@dJ > � � �Ւe ֪PΞ=K @ _V4h9" _Ⱥ^d<y)S&h,Bd-EHZ޽{kvW_u �1cƸ} Yvl٢ٳg{a9裏sdf/,h߾}Y'.\؅]wuBd},e%OY"B cǎ0aΟ?yB} kZj y[O?䂩,dȊU * }+"/^'oRU1B># /N9Q_h͛_eF߆}>-XmΜ9*X^-ԂJ- ?ׅ -44wlŊ8 |իHS 6Lpl9<yRʕKu \=\fr4nXo;~׺^ \l[[Zh׮]Jcwyko߾:u[7YE&۩SpB"Ze6'{Y竭l[6.bO عI&믿](W@qlmURŭG֫R[Dv-BA5j)S=kSՂ *;w@�@�@�@�@�@�@�@�@�@�@�@�2@ 4W� � � �Tr'۪��@�IDAT `asWP _m ̕+6mq|-l'RFUGm>8Zcn\>}ZŋwZRuWZ7~'5 ;vZl|Eɖ-[{{S^=8p Ƭ3gݻ'j|Q/ `p{jWh…eYp[ZxեiӦu֗r)פ@b!/wJaaY}f,\[skeС nSfg0$}! ^K yG ]%iZB}ߞ~iBp˗/W^yHСCI0jNthύ{̅NWlmd }k" Rl׮ q^f6gNKTihgΜ<Л7iǬ_ 7naÆ0uߞ'T2]v}Y[v-<ְbX3fuo$-> IA�@�@�@�@�@�@�@�@�@�@�@�@�RZ Ȕ}@�@�@�Hu_~ϩSda_E _[|cZx|O+Wt?͛7s%JxkΝ낖,>rՇš_߾}{=ڶmZjl;yK͛RٲeU~}YeBł,gBU<{nGdDi򄗽S=0J/a:x *->p u9#I b߳R Ց#GTN9Lb֦Ӟa<%#;j/"-,p*W |M)SU¥>sb[%o\,)RDC Q#/Q؞av]|2;=;_IiRۍ SJg[Z 5_[8u[j>@�@�@�@�@�@�@�@�@�@�@�@�@ q53E�@�@�@ l$U/\m,UW]v-y8!=9-++Vlɓ?}q>c.T_~Y:uҺu+[lNXM8Q6/Rm۶Ur/ގr,UGԱcG͘1Cǎq.臒?}to<e%ezA^҈MYٳGӦMs gϺ7YPѣG](?Eƒb͚5??0FYbۉ^W^n={$@+:$Q~Ǐ-[$nϠziպ\rΝ7y LgNlk}_fk׮͛dsʤs]bMn\}͛ם{p®>JI'Q ۺBK,@�@�@�@�@�@�@�@�@�@�@�@�2�A3g@�@�@�2Rr Oj/*ZYrrȡ5kca>vMbKٲe;wnM2E?se@ia;v< pko֭[k׮3<# Jt]{U/9}w*Pe/tmGb1g}d2P+[@ WaiL),L:t(zwt-O-"*:sL\+hɒ% q)K,1GǏq< k.nY9q{�JB? 1WH ,C:}tLު[nU޽UHL9j(ٚ+ .tAzժUsI}v|Zk7ݷ0`i{&< jilf͚5a[B;7o_$[&_;=mTcРAn}K- � � � � � � � � � � � �d4 3g � � �d0Sݻ%/1bagmڴXț/|iڰaDk#-(BFuiΝ߫ڵPY@"5nX p7tJ.:uh-[k?2gάG}Եap_J5lЅ{/_&w}# 6,)hq<p-ZhرW̳aZ&%} 4m*/<QڶMWO .zaÆ)`-  Ç]?{*T$ý|u.]^z՞гgOXBJ?{_ /So߾??<Ƶ رcdϢ>Z#ꫯbHX!mvEG2kL4ɅG[{lA im|8p[$cVbω-qovg'z3s駟~O_5u/8|ܹp Nl4voFɓDžqښsz]wgϖXojؑ#G֙.jgm> yi޶^@M_`+B>;=mv‹?cUX1 � � � � � � � � � � � �dP 3g � � �dUL3ʕ+0m^_?|d#dAMݺuڵk]�ЦMΝ;{sCiX.]gh-_O?UYft-m۶D{oNoB:t<ܵkW+Wcxw_~q~stiau6PI k| 'ozʒ¤n‹.\BqbR,�ʂ'RZ\/ \8&aj,˿XĊ.ZlbAgΜq}b вK rέbŊVɒ%]q}έ=NJ-U ?{ck!.\SO=nԨQC  H+[a&M$fϡGz@ɓճuvUIc_hZ(ile. U\k+;hh!܏? [|뭷"C6e^{WU"RY3ݜ9s 49sW_uX8pl5<ڵVZnkĔ"ZI֤1 4c+y=}6>w-Z=m�q9Oh̘1n @�@�@�@�@�@�@�@�@�@�@�@�2@&aWƗ'_b\� � zC۹�478� @"@rR"_7o^.Bz,رc.?`׊dΜY JXQٲe]P/W\yXd|"ʞ=vޭ(ډ‚"˂, O>qFY&t$ JƿK![TI^nF@5Y@ ׯ=?l?G#`8@B [z{=( x热,Bm++WT:u\AdAʕR&k?YĶv`_[J}Kkb9z]~BV/vmMj@!!!#_B!�y%5kָ`ҥKGi!{\4B;-[PƍPO4� � � � � � � � � � � � �.5E�@�@�@�C`)Kya }:YVEAVdܹUfX$Pf͚HkB /^ܽ/6-[&5l$Vپ}{;6ł +V�8n,_qTy@H/{U="{uַ=?l8H ֗_~7xC;wѣYPU\9,~Xc|ł&5cƌ臣[~;&.>Q:1_}Լys}uqJ<y"w{f[=.B )ń֜q5>/eZp믿;CӧOWѢE/IE�@�@�@�@�@�@�@�@�@�@�@�@�.I {Iq � � � ٳg5l0͚5+K/J*]O~E+tQÇםwJ?o9y w 1xB0Q}7w}W-J\ej+PLo%N"@  ~gԺukY`jd?|1Ktj̦Zh#G1/ |o߾ x'X'*ǔ{ 1(P@'OVVRKF�@�@�@�@�@�@�@�@�@�@�@�@� 2^N"� � � @z…ŋզM+RVMpC⛺C鯿JEDOkWtim[),L>]*XЯBooV=S*Yj׮G-#�)/PK1c;_+V]w+N̛7= K.<xo'sd[Z.ٲe~_4\҃cJ޽[r;]EAHHHJtG � � � � � � � � � � � � @L4@�@�@�@ = Xn`< <SL<yrq7TlҚ9rd.66,ZՓΕ\xKʕOO>￯ [ @J 4nX .ŋ5d5lPժU{ʟ?JA7|~((@ϟw|f͚ *Ν;+4448� � � � � � � � � � � � �V s`7@�@�@�@ ǎEWzO kԐM ZUZ\^PZD`߿fͪ^x!T@�%pM7i̙ڴi4`}GUo~{"E;]D,R(b=cAHEBAEޤ^)ɷߕo"!0Lߺgu=/UHu]6mN>Rd'-ѷl0:F K.UUD i]3D3gԪUCHGNC�@�@�@�@�@�@�@�@�@�@�@�@� 2y@�@�@�RH sL6V+" c=NAIܹu OƏ\r_￯!�A$P\9 <X;vЧ~puQ T4qD9r$*#py͟?߅?)SFuu ]viԩjҤ@�@�@�@�@�@�@�@�@�@�@�@�@A@�@�@�@ Ne {5kH+w\2EzQsg?nݺN:4@ 2f̨m>޽{5b>}Zw ohٲeP Xرcu=D- {ڸq,Y\ H3@�@�@�@�@�@�@�@�@�@�@�@�@�RP C  � � � @Ο> $R˥ґ#RJ@<XPAzyRRL1 ;Ck„ .*YA�C W\ҥ[Ny~K >\ p!y7|,+˞s4M`߾}5o<}Zzr޻ԭުŋ[ԃ� � � � � � � � � � � � �$(@dD� � � �Y9 _Y AtWGlY];iSi4)_.u߯zJmڴQc@ fYܲf͞=[?y/ lԨ4h:u([lA6Ih"ٲpB]V2d}vm.ޫbKmN@@�@�@�@�@�@�@�@�@�@�@�@�Ҕ�Aiv2@�@�@�Xy /6Iכ7KYHEd@Lfͤ~nE믥 bkiʔ)zW5p'rʕ+˖{Lk.toذaz]UW]ڵkB!m]Z5Y$ DDDhƍ_ݲtRo:v ZW.5nX#G K � � � � � � � � � � � � @4B@�@�@�@�/RRHHڟ+3L}UJKmDAN&]{my,XP/z)=*_|x�"PժU-?|֭޳p,YI&ĉ W\5jд2e!j*XB˗/'OU*UTn]uA�YzuFWG�@�@�@�@�@�@�@�@�@�@�@�@�҂�Ai.2@�@�@�S S&̙8s lʖMAK(RD;WYjT=Z)zz| M/ J{Ͷo$<<\6lڹs;5kVU\-W^y*V([ے={TA8wx_^֭s˪U۵bE.;6r) uf͚V=DC�@�@�@�@�@�@�@�@�@�@�@�@�қ�A3_@�@�@�ҙ@A-̨2e"jA @lҔ)Ҁ7J?eȐAÆ 7߬ZZ [ @ uءC9rDVʕ+zjO?i֭p.\X˗Zziо%JȞ#~hB7oެM6Y|RJʒz PR) � � � � � � � � � � � � H] u@�@�@�R\ S& S&\PA6jt6R/LK*H<"Yђ=StMj׮j4i"Hyɞ:uJ6l]@o`m߾=*,0,,LŊSɒ%ex*Z[)9r\=8{ݫݻwe׮]ڱcGe۶m{k {Z5\/+ NҘ1Ye{ExRmil � � � � � � � � � � � � �N tw˙0 � � �K K5`AzO4R@>JMJӦIEoRJ2d jD @ fͪիqΟ?/[nՖ-[dႾ~E<x0ei<X`mϟ--:wʐ!篈w:|СCQ˖}E-�γ|-{@N 素N zuҥULDW^B!^:vwjNLO� � � � � � � � � � � � �-/}d6 � � �  q*ptTh`\@fO?I"/ KkBTRzgWԥK/䔔ƦHaaaik6ֹ9sF{ݻ .-ׯׂ tvxܹXa<y\(sXs,0[_}̙3pP|K\em{i~Q믿t ha#Gѣ1-\rL_frT~}Y ܴѩy˦K|Ԫiޭ!� � � � � � � � � � � � �B tq$ � � �W \ZYDAP % pUJKmDAN&/Lz'5f?~% � dʔ)*,c�C^]0!^h};w>ydň؆H}fqa el un%J /m޼y/_>h2cE.l}JKٻTF30 � � � � � � � � � � � � ,󯾒e � � � �M GRPD%\@"ܹRRӦRNY[oo?ƍ_J� pzhKٲe/'̙3:uTHyGm۾^(,,,j ڶ /ܶ~zkHc#7r_^]wI^& @�@�@�@�@�@�@�@�@�@�@�@�HsA[ʄ@�@�@�@B <r=l/`q|l٤)S"!7nj֬}Q.G@�%bȓG'rwnݤ~zJHޚ @�@�@�@�@�@�@�@�@�@�@�@�@h ;o@�@�@�@   <{6+a,Yٱ@ u z:x4r+R.mZJ~#� 7$M*m"u.--+})\#� � � � � � � � � � � � �~ Ot� � � �)P!OO3fi]Gi itG+顇סCԙ �(^\z%i6ii&A~}i@�@�@�@�@�@�@�@�@�@�@�@�@�� @\F�@�@�@�(\8={R^A˗ZhL'ioL. 2͓ � R3J;KKH HJI]HeJIGTe� � � � � � � � � � � � �$] Ȥq% � � �_޽4^CA[nWxsԩA9}փ#� (Fɓ͛{JoԨ� � � � � � � � � � � � �_ H# � � �@R-9| `"EsMxWf zE�@�*% ;%M(+'u񾆗/@�@�@�@�@�@�@�@�@�@�@�@�~ Q! � � �\@֭ _A{A+-4uj:uzGןSOZ) @� +ҟJGG@^}t-…ia@�@�@�@�@�@�@�@�@�@�@�@�Ҫ�Ai2/@�@�@�-!i˖SH !R\ ׏?#֐!ԥtLE �i]+3GFn6MO!� � � � � � � � � � � � @* 28F�@�@�@� =+!-Y"  5k&*$/>8?GHy/zA z >]jTY �^U+ii\)SՓ"c3 � � � � � � � � � � � � X +y � � � *mxCITIʚU0AڸQ:T[iȩT*f$2J&H 'ik"Cq]ys\G؏� �Izil_ťojՒ,� � � � � � � � � � � � ��A)}@�@�@�*;4hPduGDHgD ~Ed?V/ ǘU._.]}udPỤA�@�[W6MZL*SFjV][k@�@�@�@�@�@�@�@�@�@�@�@�@� @�@�@�L _y%B⊄ Wdg޼^HMEHsJ]'5m*OvI͛KǏKzIZKC�@� Ԩ!}oRRR6R:̙@�@�@�@�@�@�@�@�@�@�@�@�@�LH � � � w yǸZRƌqe1OLl٤)SG:wȃ#Ҹqc>T� @jjiڴ@bŤV"Ú)Έ@�@�@�@�@�@�@�@�@�@�@�@�@ 5 C � � � &FHTzÇ#͛70+AiF^~Y[WZV:wN5[ � 5ӥ #иԺ|y`ƣW@�@�@�@�@�@�@�@�@�@�@�@�@B /`@�@�@�Ҍ@R&R 11tU1'pAΖS@mIE:$ D �V 9so, sgi:#F�@�@�@�@�@�@�@�@�@�@�@�@� @djKԈ� � � �I:T:>gJ+Ϟ X|"D = .}SYK7<@�@fҒ%ҤIRŊҀѣ@�@�@�@�@�@�@�@�@�@�@�@�@ ~=3G�@�@�@ \uԣ!CFD]$g2gX@0 ̘!p?9� � KZZz ih|yi0i � � � � � � � � � � � � $ � � � @P )S*U=8p@ʟ?p3A`r];hkI_~)}}|gq @�%1cdpMKO=%YW_jDE�@�@�@�@�@�@�@�@�@�@�@�@�&@dz@�@�@�t&PRX?/RDʞl^`~ ,;ԷT@…ϥ]X^5 �$}wnTtR˖A�@�@�@�@�@�@�@�@�@�@�@�@�)@dڼ @�@�@�.G*ZT YL{…e(A hʔ^}UڳG>]jB 6C%[�ƍ{<@�H^ҥsݻjդcǒFC�@�@�@�@�@�@�@�@�@�@�@�@�#@dڹ@�@�@�ȜYz-)""2t͂[h+`wE$@ I*}cKRR^ .=t`΄@�H__/4lIW^) - � � � � � � � � � � � �G H8  � � �@vRzUŦv풊McJ\}.yFڲE3GgUƌEZ;~\zm~"� @ wtϞ҆ wHݺI7(YQ � � � � � � � � � � � � T*E�@�@�@�8}om۶iǎ:p>L{쪗_3gٳn]2edٲfͪy*_|n.^J,RJc W>n>άO ""B'OԱcǼ:t8Ϋ3Ji92 9ȞqNg<׾Zkq{ŷ[=//|~v̙b,Yomg3gNʕ-m@�&1B`5'^ʖ-*@�@�@�@�@�@�@�@�@�@�@�@�F P � � �$(k.ZJk֬իݲn:۷/Z +Q *B˔ KumU}WG ,�3[,pH R믿\Ibc<xЅLk_@ *J*n\[_y.4w^z[{w:rD޽Ho3gIĉe{6ŞGom۶=zTǏABBB�Ćޡ5jT)+v E_bܹ]!ױ7h -ɋ׾Jݻ,j!ł,j|@<yy}۶Ο?ł{ (s!� (u_~{/2rf5""� � � � � � � � � � � � @Z 2-E� � � @%KhQY/_wީ2eʨdɒn)X` /M zi-~j`}vl۶Mk׮uAcƌі-[\D֮][׏Z,245HUgoٳg۶ <uTYZ  +-0W\B/\s#[l~y^Xm4$1m9vXgB4}7ovM }@`Nu…UH-Z-m[g__k@�¤GKzQys[7魷.� � � � � � � � � � � � �O՚93F�@�@�@ , ̂gϞoV?Ν;' P0>}^z^ Œ y)8*U䖋Z0C\~͜9S!+Tf͚iӦ馛\�קכ6EΤlٴ2#Μ9\n*[,uǎ YZ`-90`Ђ-fP~j^&do LdO>Cɂ!- m{odxZxqYX-,\T)2lkpΤu �iWK{ yGj>Ι!� � � � � � � � � � � � @LW!� � � o͚5K&MҌ3tQդIS7p,+5Yf͚n޽+ĉ.s!#G5lPڵӝwR<Ղ rLL#_ ۰a6oެM־e݊pf̘=_,Ϟ3ժUsk_ /1s-.%Kli]cvr!;w- h"M8IOʕ+˻oۂANk@�8ڶnQzI $~.%@�@�@�@�@�@�@�@�@�@�@�@�@�t&c쇉oى@C�@�H#M֐!Brȴ @k7nO. I@ĻK-ZPJqAY(i\�_ƍ{1wSNʕ+WO..L|ɓ'i~k q`;{6nܨիWk͚5Zn֯_#G\x_ٲeʔ)ҥKh4b8}m断[? }BBB\W^)[*V*U%>@� ̙#?H':I뇫@�@�@�@�@�@�@�@�@�@�@�@�@ m 'A�@�.@I@Ь?P| jԨ >;dlYجYdA itszڵkZfW飏RZ8AI˗kŊnYj6l %K�+ }̐!CJc #�R{?bL #P_ ZjԨի%O<!@�"`!IԱ4|7oZ@�@�@�@�@�@�@�@�@�@�@�@�@�𯟓5 � � � $ 8pƏ9rk׮޽*WEYdQ۶mba 5j jժU' !X믿ʷ,[LGu].]ZժUmRR%eϞ=Cp~ﳫ-wgi\hԩ:|;TR.~}K/ �\~n& ��@�IDAT]zAyS(@�@�@�@�@�@�@�@�@�@�@�@�,$_}хG4D�@�HM֐!_S#�$]`zW'lٲzթS'Y!-a ^_M6 _gXY|̙RAPP0yd"߯|?eѢE_d2e%UUZTfMgsl! vB!-~7ofbߓkK {?CN6S2 ~ܫ4qԷD�@�@�@�@�@�@�@�@�@�@�@�@�4,M7!� � � X>cҥ7n3fm۶jذ:u\#</@5w\͟?_sxYreիWO>_U3F]iEDe˖QSӥKj. >{U] u]믿DZH* @ u +M ;@[3G^`TRU#� � � � � � � � � � � � @LW!� � � @ƍS~wyGݻwWhhhWq8>5kj.$GuAy ˑ#G|1/L <K8Ξ=Qgַ~BM-B[jn'O H{7i- 6oެ /%•-B!6m͛J*Y#�"]Fڵߖ|0MR@�@�@�@�@�@�@�@�@�@�@�@�@H_,>.F�@�@�@�<;S]dkÆ ٳ'!C]0QFi„ Q-Zt=%K:u?=Ç5vX(P 3g @H;>|ia@、(W>fڵK]X1 :TW]uʗ/{L}Ν;r22 % xp/WG^pԥt%w � � � � � � � � � � � � L7@�@�@�V_UkҥKeoÇW޼yT]WHH>\R+W_aÆݜ,nݠ+$pQ3F-[T…]8]L4bݻ8PM4Q֬YT"v-;ʂnݪUVW^?ԢE ^B]f�!^fΔf͒Փ&T@�@�@�@�@�@�@�@�@�@�@�@�@ V cea' � � �\uuשRJZl &>8,l//}@_zGbni&a�tNA#ٳgp"Eh*Sf̘}iܸqԩ (45SiEJ*߿~:x`ZRRjieH͛K&>~|.C�@�@�@�@�@�@�@�@�@�@�@�@ � � � � p'Nwܡnݺ|]~h7m4}Gڵ! r|)C }#SىGՐ!CtWM6Sj׮]zԴiSe̘1͊rH׽- ל9s\@ss/]쫯Rxxx #�@dIi<{wsgOܹt0q� � � � � � � � � � � � @: 2t� � � ?f͚兔tV߾}5b{ 矫W^pe`NZ9?sϩTRzw{mΝOԪU+/K!@ X(dϞ=h"PnUZUǏbp@ ,GI?-y~@�@�@�@�@�@�@�@�@�@�@�@�@ n(A�@�@�@ 96lؠ۫K.<xprXqp 8qFÇqV=[Q/pi 8Pe˖{lׯ,t�)Pzuںm6uQ? 9sfpLU �N];iBiVNi2`@�@�@�@�@�@�@�@�@�@�@�@�@ - &sA�@�@�@ Ο?{G+Wȑ#qdJHuz饗ԿZ*rզMR˖NY`Μ9>f}ZtyDb2 C ?=7鮻rK6m{$Ʌ �|dTԸ4yr`ǣw@�@�@�@�@�@�@�@�@�@�@�@�H>vY3 � � �iJ`ĈZrƎL2%u2?n6լYS<V^SN^Kcu v]lZj@ w9s;ԠArF XO<zTΝg CBBh*KQ͞=[s”,fzeofJTcʕK/<ߪZf̘T5R  ?nx@A4cl!� � � � � � � � � � � � @ 2;*G�@�@�@ N>W_}U>*Vbu ,payʒ%^uկ__ǎ*s̘1?v! D Mw:~m7V O?Z2dHLSԦM}駚3g ˜9s*D6Rs׮]{O7nu"C<y2EjA˖-oFO? ><˥6@ ] IÆICJ>+!;I< � � � � � � � � � � � �^ T � � � �/0eYO<AiӦM6m-Zݻĉ7nȑ#zg4o<m۶MڶmϻVztM7w Dqo4t]q e~z-^XXJ@xxnf GW_|2G*TH@`AŽz 0'|R&LP~d4@�b?o3ԺtxJe � � � � � � � � � � � � �Ap@�@�@�b:u7o… r4ڻw^~e(Q"jglٲng뮻ν.Y^xrJďnݺi֬Y:yd OoʜYj*Lo -={/ *N}%>쳚3g"""Rnݪ;&)2,,/N˝G;;ڵk=#�\@6~O/7v츌θ@�@�@�@�@�@�@�@�@�@�@�@�RL C � � � j~Ǩ@Lbz+gΜ0-Z,lرʒ%W!Ce˖ݻ <=z,`qԨQ.ָq\0ZF8~{hAy}w] ̴,83Uۗ={hI&:s~x:ξƏnUʖ-S8ǏQATN<YGQrKCײe4qD+VLeʔѧ~-[u0`|v֯_ziРAʑ#󫯾aϠ?\_~{ 8PE$۷g}ҥK7ߔ6ژx^/\PӦMsYgϞ@y-甅՟0VP=3vBuΝ ф n:K.,@>|xѶmۦ?XLꪫK vNB/r]g�êUB wqP\ܹtuJ|;iž{|I-^ؽ/l}qgdȐAaw_ u='w@�WNyGWoT� � � � � � � � � � � � �1i@�@�@�GСC:xTYI?iӦ.lUVz\У<Z۽+ T 8={4 fcV-Yv=9rwĈ5uTM4I?C&&Z=gZdhh;|qP<z;P n[(^ܹ]]rAn -X ͜iY2 ̘1CgϞ}ݗ&nE顇rg PիW`~~S޼y]Y0]c=ܣ͛7kժUa4h ?;^Ӊ'f\xI3Fh:uꤛo<7|ƶ nͅMZ9g͚uO?Ӈ~( 9~n6~%ָLjhuU׮]UT)8i Ȋ+}riϹ kQʕxܹ+V(W\)ϝRKŲ``Y=5j5=-(|-8[/1j w~}allٲ.pwuJlAIiW^U_lXN>>WRu �0kfϖ< � � � � � � � � � � � � @p D&gmT� � � �A(p1W_7p,aÆ.|ƱnɅkÂ,͂Ə믿[nn@VZՅuYX٠A\ɓGۯ0?,T]v.�.1  C98`̒yyy^ԬYrTɒ%eA,,t/K,z] }z-WZ >A:uJFh3ftga,m۶n駟֔)S\_B4|??,G/)CO3ͮ_r̩,@0<<\ժUSL\]m|Ͽs&#.… {aRiR|heg+ZD (P >{akZ( :4ƹqqΝzGda7v'p˗G򪫮ʕ+] }FDD{k'c x6g}/;vW-Z]}ݻ㻧v<ؚvZ@�_ _>y߳~g!yT� � � � � � � � � � � � �AN@�@�@�@�K5kvqM6MSNU:u|ʑ#N>bŊa-Tj�2[YYeY�م͂Y5ߵNH G'NB=s:w\mۦkҤIQc8O;^3g$ >yT ?~8p (+ϱVfMnԨzjWZxZ-0k֬.@vܸq.Lwߕn߾ݝo?k*Urka>GKh&-@Bl{}i„ .iZmZxbZh|%?_3]~Z k]73gփ>.\։'|➷[[nqzg l m[[abwܹsʅt GŊݦ/0^7`i-{N wd1 @ 66UM � � � � � � � � � � � �{I~ �� � � ,XЅ n޼.Lׯwg Zt[-[7ʎY/+,,,Fk.jܸ;[kΐ!^{55hfnڴ)ڥ'OT6m9͚5v/l, 0@7/ z?M4q}] IR:tнޫ-[n&J[\97֑#GܺPB.:/-f}}炅'~*R}YP_|m3e$nݺ5jZlS8^$4)6wZ vs\j;=o޼._gb}Zl3ft={֭,قH Lɻ xy^t# � � � � � � � � � � � � A&7!� � � ,ꫯO?d˖dɒ}_ڻwo Jk ,vj… G^{7}yuIw}wbk….N:aä;7_J_-P|yyzꩧt̙>Ν;1cO?uٳg]v^fw܂׾}{͚5K?u& D-_\;vt6k,N2Ņ[>J__ ŵӤxrr^$wy=c_l;s8{O/+ۿ>#=Ӂ@� `9cJ;GNDC�@�@�@�@�@�@�@�@�@�@�@�@�  2o!� � � [_|8 ˑ#&Oe˖EM?<<\]vնmۢ%v~GdҥuÆ _~E7tT-hٳѣ?,kԨ%JD ܹw3yC>z={CZb 7o:gs7gRTZ5}g.iӦʗ/ɓgI<*TƏѣG;K_h+Zȡ1ڠA>5͚=;j5v<>S_� 4cǎgsI lٲ.1?s{jmzuĉ=Gorws_.Wر&@ޯ^ߕm_� � � � � � � � � � � � � ҿ� � � @֭ ^0a_)S&]z[okUٲeUn]߿ߍycv[nQ&Md[͚5K SO=vv܄7nTf4l0<xНvZ5*'xB~o߮.]ߪW\rE '|x_]+H7(]sMp  )RD|kuQWPToaÇwX^uUʓ'OT}6  Խ{ jO?~sӦM&GFuV|GH`cĉQٳZFܺXb."zj-pʔ)Q*k=b LOk>\{[睵|P3fp֮]/҂,ygyhs ߯%Kf^xAz:u?nC:1;vݻ5/| >p;<%tOI)cժU\ 裏RG�\P#~Ԧd4@�@�@�@�@�@�@�@�@�@�@�@�>#{4_= � @J 7YCw!5)] #�}w.,[l~+ٳzᇽ10=C:tς-`1,, 7]#FP]ԩSe_q0`@T�#G\ 3ghŊʕ+/t[`DBj׮}9 Z Iki󈫭[NW^ye\w.B0f͚>s?K H^n)1Ws}gC?\@Ӻuky;vj֬ӱ}W曕7o^g 6tAٳ`3pZ~uoϔ6^"̙3UhQg${۷̶jJoN:5j>5 7홓PXH{mϛs5 iܹ7]=[:zuw0K[[c\ϩgB->S{VyYT)W=gVihF]жm[kA/{.Ν;/y=;-X2ժUVXQ?,,sϹkG\;V!C\@VVMv_ֶ :- y>h =Tg}7BG>;)U"�W} 0jOo � � � � � � � � � � � � pyA^W#� �i^ 4  d{RJҥ ~ĉ.|ʙ3g\]jʕ.ЬlٲtmB';wNֿʕ+~|.t,-K rwj 4'OT ӧ, S>}ZYdѮ]\/hjD -@? ۳g*T;v,1.H y/B˕+ 5 ص>ubc/863Kl[nUҥcԿm6hWTuqXLyl'ٿ@c\=M\nz\;8 @`_#Ԯ4od骫3"� � � � � � � � � � � � yf\� �+ f % |駺{d:\~/?<2-qΜ9-$N:jذLFj"2Xqf:OmA>\ իW0Ey)0rĈ+#5<ۧ-[&hOgx'ixk׮+⾷-^S"ER. @�f'-Z$(@�@�@�@�@�@�@�@�@�@�@�@�/!r& � � � ]֒%Kԭ[7*TH7xcR[nE*UwYfxr<|Bѣ:|xR!ίZyO\C{VҥSƃvZRs!wgp&,06ZjpL)@;w\ 2D_}n>5k P� dYHӧGn HyY� � � � � � � � � � � � @:ݾ}dO&GA�@�Hi~&{!_SzJ� gp/ K.5m45k#]b=dɒ4IR^R*I"]^4yd"-5~e)ShСZx7ozH)SdfR߾}vZY8k4h P0 A"w^?^|l;W5B@�HN; 2eٳ% !� � � � � � � � � � � � @ Ќ� � � �iA 44TcǎuSgSXrׯӧOk޼y<|XzYGL#,.\_~EŊSnTHu]s瓭nA-ak./|!ɦ@$pܢE /^\vm۶@ݢ@ yJlyl~oKޱ @�@�@�@�@�@�@�@�@�@�@�@�b ӄ= � � � paaa3f^xSwN<ypzR2eʸ`RJ%D_sw⋉Ө@ڵ5j(ٳGÆ ռys.\X 8q"ϒwpZT.EEPEI&,ј5zc7ILUcyc1U4k``P@"Ko}6 . l3s9yfŏ?GVV:'PRc |<s�=ǘ1cC{& ]/C!@+"|0Wژ#qn @� @� @� @� @� @�A @� @�&~8y۷o :>8ꨣrgO=Ti +yK/EzkuElYɝ 4m4?xcԩqƴicM74uoƲe˪< ;wn<qD޽sqUWE׮]GncCu~fGqĐ!UpD� @� @� @� @� @� @%4  @� @8wT7c'n׊,\0m9Tgk&ׯ`A'G|p9A5hݺutI9/x wrKNѶm7tS/Y԰ x+}'Zjzh1hРxbҤIqmA@�S8C>>y~y&} @� @� @� @� @� @� *3N� @�X7<zvGϞ= .s=7R@vK.e]|IwyqG&M֮õ88,Lxꩵ8!R }?o�>SL_ǧ~-Zw=."k%Ije˖رcc1bĈx饗⭷ފ~c}o~ѲeZme n7{GQ{ںh @� @� @� @� @� @�LNXlYuAU� @z wqX��Y`q 7oX`AuY9Ī]vwm`qW_Ž=/~]vݠÆEgŭFz=u:"͟_1cİ/W {W6[ou?;SmY.LHπ8rx7r}b̙9wwv-{kM6  @><u^� @� @� @� @� @� @�rAc @@u = @�(**?9򫯾Ax~zsɓ;?駟KG|_~ѷC5ꄂ ˿f͊#FG'NmѧOnC^W`1jԨxwJ}X~իWq9t]w-~ lA;; ^X~S+l @� @� @� @� @� @� *q � PuAVkcds΍?q뭷ȑ#cSN9%CnuZ6O<wuW<ѦM8餓3Έ.]Tyִcxߎl5=Z KkTl}ڴiy[oߎ|cѢEQn|o3n\SXj)ժr/^ƍ1c|^ SiٲeTƍW B�Bկ"ψvZB� @� @� @� @� @� @ \c2 @�j u͖�Z`Ĉ9r1gΜc={^uQѱc =vGrxG"}w}SO 6hcK'喈ώʈبC'Y91@QFѣsM{cǎy4o<Bv=v[ouisѠA^jٳsc |Kj.?>Rd*m۶m6+ziYmKaKFĤIoQG(� @� @� @� @� @� @�, r=� PAV+h ,(|"x㫯>}_<x@>ѬY1 riqȑ#駟_ ^{aoyzZM^=b=#.$+jA߫lٲ8qb|ᇹ>$YnHY jSN9o-Gjǔ)SC&ɓO> &Da9k֬Euk=bm[.ig�TO?7C"È� @� @� @� @� @� @@Y @�ֻ N @ z⩧wߍ Dc뮻暂K9sf1/"ڵkWvyP4!.DqY?ŁxUitw, 7޵K!}Y7.ƏB_ Kg.`}[D)82մB"=feVJRu,YӧO?<iӦiWPX�\.:uASX5@n& @FgGD q5bJ&A� @� @� @� @� @� @  @�UC@dոFA�,¹yHÇ~;/^ni'zm]IMm)kc {GQFG}Rn7o߾m)&W_ⰻaEAVTjꫯb92CgP!0s]a)6Bm6ڴiQ9U)(u֑k LJ!f͊:cƌH59)�2mO:=ӲP;t;v5k @�&p >QkLYj͗� @� @� @� @� @� @ᬝ� P-AVf) 7('|5-TS0X*5!^:uBMl)-j _kذa)+%Kb….Z(/S[?*)l,M8~%cfmrHe qs�ds"3嗣8:QdVtΜ9Ǵi2AH/ƍGz&hѢdټyh֬j&M"t32=իkݺuKZOmSXҥK0-Kg[xv^.X ;==S-gkr\E Lẩ%39zY)]v93-SMAW�K-ſDvXwk5 @� @� @� @� @� @�*W~v7 @� @Hg{g4uxO>oR۪BJVСClVѯ_:ֻw[ou[[]_UuFtS} ȸ6@ iڵkM ELA)2[:,LA)S%AVV@bEdzۥi}\MVLSmٲe~j*gB�T@q~~GqXy}� @� @� @� @� @� @� 5 @� @ o>R-д–B!S… s]hQ2 e!,?jry䑈ώ/#357^QFZYgOAٖB& ϴ|[dI,]dBIWW_Bt8?֭kz>^Vxvg5;>֩S @`= |EvZMǓ� @� @� @� @� @� @@-YK/i @� @�(иqb-r_ݜ_}5#~.[]k  ׏͛ZY裈sύ0ׯz P"&k"~4rc%@� @� @� @� @� @� P=Va% @� @5*C"7[M@U(Ε̥ @�%о}G7&� @� @� @� @� @� @@Y{ @� @�1ѻwDԯ�, 6_}s'@�O":umF� @� @� @� @� @� @@G @� @�G_V[E<HD&rM@% 4mQNDQQ%v+ @ 4hqG<| @� @� @� @� @� @� 18 @� @È}h.'"ZX3G @6k1gN @�GC#RO#-[?+ @� @� @� @� @� @�( 6^us&@� @�jQC ;ux晈֭k= �J ȢR @�V?3⭷"|8 @� @� @� @� @� @�JY:$@� @�Tm_^O=Ѳe 7՝�TM>}"ʈe˪� @� @� @� @� @� @@ ,��@�IDATuYݮ @� @�A`Ȑ{'Hao V @v ѣ#v;= @� @� @� @� @� @�YY!@� @�Tq[nw#N8!"46<6 ȍF @J l]1DKV! @� @� @� @� @� @�j% Z].%@� @�%G\yemEԫ8�# \k3%@�⊈?<GhG� @� @� @� @� @� @AJv @� @@ 5+C#3'jL�. Yq @ lMđGF\}5 @� @� @� @� @� @� 1, @� @ vDFE 1pxj@ ,*-5O @?I+DQ##@� @� @� @� @� @� @,AeF� @�n;Fz;W >TY3A @@5gvɀ � @� @� @� @� @� @@YE/a @� @�xڳ|ۼyD<ѾC�7Ym @@O~qS @� @� @� @� @� @� @`mA @� @�X`ƌ8眲O;G MDze� ,O> P9&uofO� @� @� @� @� @� @`]Ac  @� @�H`Ѣ#4)G"_'^,#v5bM#z+;~kXSAk*==EpBğ~Q @� @� @� @� @� @�XsAkn @� @8̈3bɒ>/\'qy\s:m9!5L AΙS&e: @@ q"^zҺ @� @� @� @� @� @�Z% V]n%@� @�Gq4K#&N#2eyHWDԫWghT5YTTFe< @@U7b"8 @� @� @� @� @� @�T/Az- @� P{,>9xpGGFD_oc V A.^`8 @ pB}BMG� @� @� @� @� @� ~AW @� @�Y`Ԩfƍoc/TYG @�E"fώx2c$@� @� @� @� @� @� Py +RO @� @�J6-#.Xn-"~ @`m7_~ ȵt:D{Đ!5fH� @� @� @� @� @� @AV @� @�(8""/.s)R!@@e ,I @�-oG<k͎� @� @� @� @� @� @ _CI� @�TEũgώ*/zQQQ̙3dS;wn̛7/ϟi= D5mK}/]4%KLRTիuSS-j4h 5j 6\mM4)7M6f͚)hsZn&h"/S볜rJīF?K L"n! oo/** R @�-pauma @� @� @� @� @� @�D@hiK� @�@ p6mZ|1},Ϝ93R5kV^ֿ긪`B@bZ�Bb!Tq6^a\90ǕTR Ȳ+P>+<NZ^-K]*in-[VZE֭s-޶mtMs-'(rsIJe+S'~hVyD�u(A* @�U V<wU6� @� @� @� @� @� @�A @�)pʔ)駟Zz?ij =,]Rb .Lmڴ)[n%a)0\Z?ւx(**5j\Sf!D0aB̘1#n`\Y�vھ}b-":ر⋷͇4lX' YMX|7\  @\xш_fv @� @� @� @� @� @� PJv$7U @� PRsM|IL4)&NieJ aoyu, )1XNcZ ^&Tצk"Ok!rܸq/@ٳEq =z|Y|M[o;w-]۴+ ֏@FQa @�5G"n-92 @� @� @� @� @� @�S@7 @�(C`ɒ%�nj}QI;vl7o^Q)1u1cL:u:�ȦMRuRf֭sѣjKC:ƒ%C?,⺬ΎG})DP4i]tݻnݺe:W׮]^zX+A @@-(U5.x啈e7] @� @� @� @� @� @�k) r-F� @�V'0w=zt5*{rM .̇o&9o뭷?<2TS؟R;3].[˞s 0aBǏ?8:4Θ={v>aÆ{Fm];zC˶� - @ڷe#^~Yul!@� @� @� @� @� @� P Ȳ]l%@� @�XlY{뭷7ߌ|w#} 4=zDϞ=#|lMڶm GC)4}R-L>=>\ShZw],Z(ԩ]v͡}w1Ҳ[ny_Y}F@Y{ @�5cAkz @� @� @� @� @� @�j z͛� @�J ;;6^{xWrȑQTTu֍ݻ;?яW^ VZ#,)TYxq3&Fow_׿KFⴷv)K^r T k7s WK./w5=Z{ @� @� @� @� @� @�O@ EfL� @�k 0w>|x33fDÆ O>;ׯ_;6mkJ` .ף:=jԨx7r6lX|ͱphӦM`~Y!P;R9cfI�@ 1{vćFn}9� @� @� @� @� @� @@mY9 @� @@͛/b<1t1bD,Z(w~n} T_ TE\.Z_ |W^.,wuw}F^ѤIa@YTT'fJ @@ :u"{Od� @� @� @� @� @� @F դ @� @`MF?x<1lذX`Azg}sύ;ڷo&]jK 4l0g1uxr}ꫯFEG<8CW^vN@ v�@q|t<;~[ @� @� @� @� @� @�XQ@> @� @@-XtiCGVt:(N>ַm۶Hb){^ӧdz><LxqDn#uuVs͚E̘Qeg` @@nAUlXC� @� @� @� @� @� @J Š @� @`} ><}Yqia{^')R kQG~8n|cqƀjI ͛GՆ# P)rI @� @� @� @� @� @�j@ݚ?E3$@� @�,0mڴozw=|͸Kc /E]$6A̽RRj=t{-sK` u�ll=#>`c  @� @� @� @� @� @�TA:% @�[o'tRt)n8cYgo9HVҽt{0݋LB@Y=Q @�"PG(*=8 @� @� @� @� @� @�T]AU @�믿~xN1}x衇b̘1,j!@ҽt/{_~MB@HAsT1 Pu gU1  @� @� @� @� @� @�* ^"@� @�58qbs11`hժU;1dȐ8蠃N:kԗT@ӽɷ~;ߣ^Mlw@ ,*c3* @ l1}i @� @� @� @� @� @�j 1 @�X#e˖ٳg|1rȸ{wkԏlto{4ݫMnӽ P5;7Ϫ5.!@�fEԫgUs|FE� @� @� @� @� @� @* JWX @� @`f͚rH\uUqw?}Y>4]'O?qaeUСC!94s9'ƍWݮU_^Mlw=tO+T͗@Ιvc6mZvmo;d=5dȐҥK< %@�OnynNdfL� @� @� @� @� @� 6 F1 @� &M{̜93|8c6j�-[ViS̾JjMMߛG}4{챘7o^6z鹌?>*e\SNs=7w7tSUJIw=tOk P5Rd*k(<f̘=\~Y4C)w„ U"'C ڴ(#B� @� @� @� @� @� @jAn @�zf͊>8:tC-ܲ g+Rftobɒ%_wqI'2˕O<۷ooʔ)qgnVi}VfGNrӽq�/6AgnmuY"e'?I<k G̟G;� @� @� @� @� @� @@Y{ @� @? Ɛ!CqJP*U`„ qqUZp~xbٲe:ε^z:ulUޕ9Νv)R [Nut/?CNBX Ȳg,lڪ kW�� @� @� @� @� @� @@Wf @� @JqwSO=͚5c* ?f͚[ouqqAٳshe.<:_;Cb̙CƇ~k\s5^xC=4nG?Qp aTh9q#Fu9裏f|=Lgyf./c88/^O<Dqq 7č7nt=nO;Ư~ 15Zi L6?~L<9ԩ_/~hٶm۸馛r%K9s8c WuMʮ<�ҵ뮻'߫*ڷo_]點/x`\|ѳg5?!P Aŏ\^y]e>8U=J9'׿Ƨ~]齓ԩS_~qEE˖-cU+2~ҥKAq%Dz6,I&_2uguV>sqý) SOWn,aڴi>|hѢEx٠ߒ�!W3� @� @� @� @� @� @�]~  @� @@<xpt%*59H* 8z<B p@y_~1nܸca)sV J%u9W_Rc /9rd?W_}5zXnxSN;3Rc*)?Az饗b>Xv5乤) +B�~yn?rPضnYRG+!~2Αm)3ٯ\)+,&URZݪK[V˖-'tR5n=#OB(AEr-;C۵ks Y >á@Haą)H8/:8`7o*1)Pr=#s/R?)24oo;a„r pY w}^Kağ}Yr!%ϒN @�Z. L� @� @� @� @� @� @ +L! @�TT� )OSVW^+c…yw mޚ)/9t D^bmJ|=֭[+霿cҥ/}B^xHatA92o>va)FޖBy 6WK,) {s@X:.{}y߅^-Z:uRWEKyMѣ w1ڶm¶‡f3ȴ+ФeEk<Uy>ߞ-}|-RdM//,ЬэQq<soΝk}`Y޽wߍLA)ܶ<{7K)8PmU ڦ^K%o?޵)diӦqqeyƴ?މ~z~g9re @r`  @� @� @� @� @� @�V' ruB @� @@hӦML6J) &=N>=vi2dH\2f;l+G�&MĨQs̞=;n3fLL8}jJN_ L?ˊjrc:g_CSVj/ҾСCnoo9y6+7ՙmS-G)4/סdjV aU5^nUF}Ms~+VY8-=u�+Poӫ/ 5.Ϋ>`aS^<KϯS4iR^w_ wݑj f֭[~Fzl&qaÆXSI /^)NӏFލ-xyy|)p:�R/7 @� @� @� @� @� @�V#]M#  @� @@Uo"'? )裏y\Gydpy;Ν;PYfvڵ7>D ٳgǧ[m;36|ۢGCl`† F.CZBWYc*+k"kJ){u ]V."s_~e&Hvӽ P΋wy&/jʫ~aaS^y>k{/Ǝ^xap1)8o^^s5nj3-Rn {\UIc^ջ0/d|#GK7nnm'@� @� @� @� @� @� @� P 2Yl$@� @�*pF>}⢋.RC\xqu]׿5rx'c1G-]41.Y$ O<D<q'F \%kvz+;={v>_:oR:k9SNA[ \U_^c,kѢEn1ץU\etoou�/x?b9y / JTڷo5}5m4R eܸq+o~MuD r-ȯ{7ꫯo-ΝSNk @� @� @� @� @� @� @�* H @� @@[nq#u]We8>8ߎw13fX{|0@pѦM}Μ9lٲU;Rڵ{7{@ʿBׂ JNq5D JK%-/MkRVgZVϧHᖩsѽ{̹/}]Sٕ]^5y_ӽ}wF6@F˃r €^{y=˵}wf*^z _~9.ou?Rc <cK.-"<?)`C-ލݺu͛#G,'[~'|R  @� @� @� @� @� @� @�?+  @�T)w9jШ56xM7ӧ D޽UV+ iȐ!s RgϞq'&lg?YpNL60aB^//pq)/Q{e8lye]![ш#⡇Mq^~R c LG.*w:Ӳ=srJ<1p9sfL2%|Kozlʪk:~uvey&N%˴>iҤ(YkV_Qi~to{\!@j4nܶ8E)Pxh۶m\tEySYϳ<N;hѢE<zkuYqq_^;0�ٲeܹsIhq L%rl!0\LVnlذa{w}+ƽ;vK:\!@� @� @� @� @� @� @� PaAҐ� @�G)﷿m|;߉?|/x~7;`okSM L5>4hp@@t¯R || 5kVC^~SxU YhI!{Gs90~ӟƠAzv!^8ꨣr(ץ^۷sJ{K.#T{sSe },o:u3όQFvmWUrue(>AG@}'9}{WG<yj;Wu]SGYާzj3&Oc{wy~y"?^y|s>;⊊ۤ{7)p4ʥ{[!@ Ȣ?H!) xذaѺu<gni{G:8]z ɧ~:?Ӿ+b(Sjڴi? /$[V~p%yS 3zy.N<.~E鮭 @� @� @� @� @� @� @�@PejYFWƚ @�T λ?~PΪ6Hj rS Իks8Uݺ=?~4n8L 6mۮp-oǣ>Ν-[W+4*0{dMJ6d:,]4/^)jɱ[-2I;w.ٷhѢH5mH4iL>=ӦMն-4Xij~SgNr�e.wZIsLc*m^+z]WgW]9}9Դw?)ߪ*2TL+*rZm6GqH1s|_|nlVѵkׯ.ϳtOMi&%3;),JzON.+L^ݻ1/**ݺuˡͥN�Ds+ž  @� @� @� @� @� @�_n{  @� @@HA=\~9Pn_W4@j]fB SСCݤnr ʟWu\!R^ .c=6w޽i+|`Z׏T+RJp򗿌杮k*噖t)P LK.f%5q,: }\1uYlm)GK/4^uUqin19'hѢmLEIM74wߒ+鹼RvZ/띹}q TCcw\p  @� @� @� @� @� @� @�@֨K  @� @HMgqF}q5bxEŠAQFv@e/hM<9ڵkWFuԲe˸KVQWf}68âgϞ垢I&_;Pu-kk2Ʋ,Xw_\{1nܸ8/֭[o8'hٲm,XY~VZ׬UV9M܄  @� @� @� @� @� @� @�Z@Z9� @�@ ϸ n;/?8餓O=zl!/Y$^>SOˁVza~"ժZ*!kYNcYmmcƌ;#XlYmO~m۶qNP`-{GVGiN� @� @� @� @� @� @� @@yue5X}-o}}kr @�UY8�e ̟??޸cĈn 'GuTo߾C˶Yfoƍ#Uz ~SNx xWb]wN;-1/*V}1!?yDQֱ# @�B/$  @� @� @� @� @� @�*A~%  @� P%R'+8sbʁ~xtuUVouEq? _|СC}?1zbc6͛GU( @� @� @� @� @� @� @�j!PZ  @� @: 뮻.>xcvȟzիW\xOL'P;ҽt{(KKVҽ> ͚ W @� @� @� @� @� @� @�6@ub%@� @�CN:{z7ȑ#cȐ!~hذao}+ge]QFcIJ ,X ^}6lX<K/… =rGG;S ͛ \wE= @� @� @� @� @� @� @�XQ@> @� @@-Hu^q1cƌxg⩧;.hܸq9rvDkFSW^ɡ#FG=F~~E6mj#95)85-hРLD  @� @� @� @� @� @� @�WAW @� PRsM2eJ</c=^{m,Y$t!;s0tueo믿)qQ^~c=)�C+35X ARTѺu?  @� @� @� @� @� @� @�X7Ah @�)5M󫯾7|xW㦛nI&eΝ;;k߾}O>ѽ{_߯5+Rx;vl;[oo \:vSO=5 O[hQiT ʳ @� @� @� @� @� @� @�4% @�X@ or-4:uj9T7ߌW_K. 6lzʵgϞs=y!YБ%J(**1cć~~=:y…QnHZz;۷Q� Px]͙Sfc @� @� @� @� @� @� @� Ȫq� @�@ ;Cs-Laܹ{ŨQJ?~|L:tC!w[out-״޺uBWV)0s㣏>5;6?N2%tm]^xѻwiӦ A  @� @� @� @� @� @� @�$  uC� @� )`owε--,Xcƌ> Bhc=~i,[,7dMs+N:Eǎsr-A^-Z'OI&:qĘ0a uyuԉ-"Rh =bm͵GѨQc:lHf͖MTw. @� @� @� @� @� @� @�. _a#@� @�*#~\WԼy?qs_Z><yIPd k׮]t!�B|ͣ}yjӲe˕OF/LsԩgZSL)z0.]ACBz׮]c뭷&MlY955YyY @� @� @� @� @� @� @�lhAZ @� @@)ȯw޹;.\'O'ƤIz LcƌaÆ 6lC!۶mnii=֭[GVVX_)pRe"9PǙ3gƬYVX~QӧOiu,]s!3-vy-;F L:*)g^(~m;' @� @� @� @� @� @� @�) f^W"@� @�&�vkyS;wn:uj^iӦE!0~'9pƌ9p_nݺ9 rM6BmѢE4k,oOzӦM#Y6n8/z55=9-4hP*V/t^ֲ4Kƒ%Kza[eZ_hQ^\`A^ƴyJzKsɵW_ٳKjڞοr_~lӦMIf rqs�fmC9۷oڵd @ ?AVd| @� @� @� @� @� @� @�J@d\K� @�H]tɵڛ gΜC!ӲtaB0bj3qĒҡi=0V) e˴޺ub̋W5��@�IDAT, "(E, v4آj"h yX5ѨDPT|a^"�(E� gpeY`]=5Ϝ99`.sKa0f 4( V#VW` A @� @� @� @� @� @� @�V& re: @� @�j tlٲ\VhѢH~m̟?:f̘8#.=3Re>Ϗ5j,w--MAk.:[o>]SczA�HA歺 @� @� @� @� @� @� @�M@dٜ"@� @�(_,ʟao߾W{KHs+qJ#@� @� @� @� @� @� @� c slÔK� @�rQ`qСC@�j- ` @� @� @� @� @� @� @�.PG4  @� @r-G%I�]@de! @� @� @� @� @� @� @�@\+X @� @@n L4)7xcԨ"vO+ @� @� @� @� @� @� @� Ph @� @@ FN(OAKj$@� @� @� @� @� @� @�%TZ  @� @�6mZ|׿5jժ[ū�2A> @� @� @� @� @� @� @�+P|3 @� @{:ׯz@ 7/JV, @� @� @� @� @� @� @�J- Ro @� @@ ̝;783N: @ %; @� @� @� @� @� @� @�('4a @� @� 4(ϟ}YEL41?1}zĕW.mOm_~ѪUO] @� @� @� @� @� @� @�TVAugE� @�rX`…Kî޽{o+Q:oxˋQ#so[^ow @� @� @� @� @� @� @�]`ɿ @� @�wSLs9|6T@V4) "?a} @� @� @� @� @� @� @�eYv+=  @� @�2 \~ѣGh Sg4qeE7jѡzxF� @� @� @� @� @� @� @jv @� @<;-ܲ&{�ֱG4i1}zԪq䑥?J� @� @� @� @� @� @� @j @� @� \uU>.R$@�J#ѧOD-Xqa\ @� @� @� @� @� @� @�9A9e &@� @�W`cYgUyTRwһծ?J� @� @� @� @� @� @� @AH @� @W_}ulqᇗ  @2 hq5k.[]%D'?[wv @� @� @� @� @� @� @�( Ȳ[I� @�D`1dȐ83FJ s @@N pKˋ}6 @� @� @� @� @� @� @�X= 7 @� AEޒ^zf%n"5[₂C]/ @� @� @� @� @� @� @�VO@yM� @�"P$k={FK顉�rMƒzܧOD͚Wvmow @� @� @� @� @� @� @� 7 @� PBG'ƙgY≟ {G,ZtjEuT.F @� @� @� @� @� @� @�* ʱ @� @�9-pǁm۶u(�h,"j,' ,__ @� @� @� @� @� @� @� ӟ� @�XFߏ'|2N?e @�!ЧOĢEoѱcXU @� @� @� @� @� @� @�X5&@� @�r_n-ZġT1ŋ̙3cԩ1mڴL}Y̙3';ˢW_… cuKT_<5kjZrܵ^zQ~s 7,oܸqlѴiL 6*&n9 @� @� @� @� @� @� @�V- rFz @� @�+o[n>;WK3T@ v?,O?4 t,?YB4imQ5iӦ(1:{L?ylUtE)(0,2]SdadΘ1#R gώӧgds4k,br->E: @� @� @� @� @� @� @�TEAUqW� @�%{' :SҌ!@@9sf5*F̙ӑ7|,Lq]. olM6BӵQFQFF<_z߽hѢ,rڴi+uYXd |饗bҤIE 6~sv @� @� @� @� @� @� @�  syN� @�ֱ_Gyd0K1= wމ^{-^}0aBvm$?ͮڵ-ZQcY4)KIM Xڑ"??~|v9f̘x;Ȃ;m۶v-;wuiF� @� @� @� @� @� @� @2 & @� G΂.VϏW^y%{xg7ވo&RcNGѹsСClٲr/T"7|oi1rx׳?Y8d:u2}7ҹGڵy @`|+Mڙ, @� @� @� @� @� @�rT@dn  @� @<xplYֺEO>$~xdz�ȹsFVb}={nlMʽ#8"{{e/B 2$ lA:(?lʽ @� W~@dBZ  @� @� @� @� @� @�,K @� @�V[`1t8}Qs=q}[n1pڵkiӦ:S@n)83~ ><;cǎqG,hs&љ� @� @� @� @� @� @� @@Ԩ1 I� @�Tqz(fΜ'tR_ @ ̙3'nc=b-Bwq6lX|LӧN&dlqNA[ E @� @� @� @� @� @� @�u% r]ɛ� @�k׮ѢE^  PovzѬY8묳b7{,M C9$ԩSETѓm2NSNH{&푃� @� @� @� @� @� @� @G� @�r\`SOE޽s|%'@@<~.j\ve駟ƝwtPԬYb&6 jժ٧=H{$MڣWi @� @� @� @� @� @� @�֖ ȵ%m @� PE lIvaUdEA�>|xY`:ugQFůhg`iOޤ=J{:ޥ=t @� @� @� @� @� @� @�hA-l| @� Pn8VZUleC�5=ztxѭ[h޼y[裏O~5M Qګ#Gf{0eS @� @� @� @� @� @� @�YQ%@� @�UP^ 'PWgIX=:=e]bܹ1bĈxbw^^iޥ=L{~M{ @� @� @� @� @� @� @� P5{@ @� @�UW`С6Dǎ"�ex㎋Sƍ7={2Ke}_[n%Æ 38#jԨGÆ A&dyMj#@� @� @� @� @� @� @�| +ߞ� @�TJ wguVOQX[zkW;~h޼ښ<kA z+u]<XobѢE7,WAzִi;hժUn:ڴinmvH @� @� @� @� @� @� @� k'@� @�V(OČ3_a P?%\^xa\pBUS |>qwcΜ91s̘5kV|g1uԘ6mZL<9&N3a„ꫯ26,:v;wCӵVZUͪ @� @� @� @� @� @� @�$ LL: @� @�C=3Zn �R_~qWF㎫m)3m6N>obѠAR,^8&Mcƌz+F\sMQ^{ٰaÕ! @� @� @� @� @� @� @@YԊ @� @@ ̝;7~ꪫ}l @ R_׸뮻裏΅X)vq1D-3\)@UVy?~|<S裏駟}􉣎:*>ԩSQ?7 @� @� @� @� @� @� @�U[F^ @� @�!#Ă %_=~e]VB SP?ϣaÆk>o1=и+ڼr�-obMve)rԩqWǸqsѭ[)E{SLYaUc̜93s1bDʠA⬳Z+Dɱv4Pq YѵX%x%� @� @� @� @� @� @� 6AMms @� @�{c}F M�5XhQr)~9眳fT[s̉o65kVδ_|E<s ͛*+}[HD6~ѠA8ScȑSOE ikѰj<EKތ5* ]w]GEW5ƌ3_. 馛[o:uĎ;:u*:_x,m&J_W_}]rܢVpSr{M� @� @� @� @� @� @�X צ @� @@ ̝;7 ѣGVd0; Ȼk~@vͳPʷ6:64soaܸq:x7/s=v6+:э7)cUc(gҤI3wq 'dgӦMwߍ5jm 6]rj+޶R  @� @� @� @� @� @� @�k[@7 @�1Gy$,XGydU\pwQGE۶m`8B͚5+p҇/AoMB&ҷQG Xׯ_{3b-e˖N3k֬뮻]v1cƌ:thV6Fz^zѤIlu]G?2cO:Xxq7g.>2Jx+(C3 @� @� @� @� @� @� @`\+&!@� @�+p=ľlI.BX9sK/=zXʈ#㏏c9&e//~< .̛By'Nu->eѿ8蠃g?Y6n^8b>}O?]qO<'|rt5ntg8CcԷH/r򗿌 &wܑ7M;w}Q "9rd5;96l2+G&ҷ>ww^f馛F-Jo/.UW]UjX|dvċ/XԿO | oz~it!.,E)79sfpN:ů;wn+ƕՙO??_emi  @� @� @� @� @� @� @`] \W%@� @�9 R`WE� GEEΝ+LK.ѱcǸ#͗~Fm{Y[ A<ò:* G>|x5K QF<q)D ,<nO'xb<1nܸ,@07?sNԩS'Rpd5]-[?1u,tp., p?Q0F?,n-zg{Nu?>z,/eM+HD6 'o_uL2/͝R8gZscر>e뭷^f~8  .~sue˂:kժUE)>n +bȐ!CfSrUG^^^p YYn> .9^< @� @� @� @� @� @� @� 2 @� @@%H`B*i"@@ t4nܸHo~S;Lw{w֖S] <#:?&N/RԬY3{k׮)'gz=3 y۷o;d} ve)s,^8 iL>/t̮)w}ZW 'k㎋?8u)0(=6mZ֞^HA)qvڵkg?83+f)& Ut_oqݥ}H%{,۷/&t\uU%f馛/[E ݤpɴH!lwO^bR+T8n Loy oV+v]:[j=# L!׏Aec @� @� @� @� @� @� @�ցwLlJ @� @ &TbUH�r[n6y r~k޼yNݳ@Ǝ;_H|),/M<9.袸;.s΍C=C9$fϞlAQ[~z 58~D N͑۴io2׍6({ :q BSe=}G^D>7zUT)^58Ӳ4/x'+*2y)ho6=H!vX~<_?Kcƌ_?̙~{?>7cUuwy٫*.X hٲ劆N� @� @� @� @� @� @�45*M% !@� @�*@ VzDzJUb jl`W5r)'///ntMovC=̚6l\%C yG͚KR8\ފ &dԩSߥ=UV<v1k֬ԩS 4(:蠬}mHfq 6,-Zu<L{Y(gړT… `ȿ%_Yw}76m^1ԤIcfm?^+"vZ5ȋ @� @� @� @� @� @� @�rY"@� @�UIw| ҦZ %вer-G]rs mwމ;.̙'tR<YbZǃ>rfϞ\[i ˚xW1mڴWnݺe7tSW`YjHD67Rǧ~gyflѨQ冿kgϞ1cg}o˽ O<D\}rK4nxSH޻L~oGMWR=R(^׏ 8 @� @� @� @� @� @� @�" 2WvJ @� @`- <CYVv̦#@@/~C yUXQ5k.p¬-U~hҤIq1xHv!6 Ν;^x!?^M6mb 6z뭢iO<1&MTVf%=pH?ϳg{Twl5<Hk(5kVfYڳU{{GݺucM7]̙3#3z=ڵklY07޸ )sEOxgA\קzԐ:~pg!p@lYkr\^;V#<R @� @� @� @� @� @� @�* J @� @�O?"E3<3 *lw=6p,o믿>.lh7q>ˮ|rL2e>uXAwSN͞r!u=^zezF]w5.8㏏d&O5㏳t]v7S^?-":uOk ?<k+#1cF֖Q)8sŒ+HB L!ŏ?uuo6ReaÆ/F~~rC/[/:wܳ~_&x٠AE={iӦvm_~yQ{?~<3_*RgYg]HC92<VU^/r�,y5הo @� @� @� @� @� @� @@YDA @� @` ;6RGQ֡&l7ިJիw^_2}lƍGfbqs=͟B'YhoaXGof,((.]d'|r=zO=T8p%D L!oqKY8d(U&^x![Gj{Dz@7o^ ٷo~㢋.J+;3O}{)nR`` L *j{ϏM?ۣu1|3fLַB& mwvE /L_uSe r-3fKa%?_|ݻwLIfC͚R~xwSc L\`rl҃dfEZgYn㣏>m.~iᕩ)h4' >Ma5jB ":A61z;MM&͛= @� @� @� @� @� @� @ ->WUK8 @�Zs]# Y׵�֞K @,h\gR^y䑑 _}hٲe~h_~ . f4oZ~+|ѢE<) 2J0O}o ]\cܹ1a„hӦM|/3i#)I&:u_1pxf͚LKVg jMa1v,�OSaS]S�eFm4gΜ(XwqU%�.вxdq$@� @� @� @� @� @�5㢭� @�Xc/5lozJ�'~{'?}7}|}naј)XpM/8|{]v֯m۶+߸q>+ 6 vyv/sY<,3MB7i$:v<N>=ҷ@YH-Z0|xW_wy'97hРO믿~+L *Y^Wuo @� @� @� @� @� @� @@y M\ޕ� @�|MTRԣTOA{ 6,:tPJ[C9$fڋ7ԭ[O+9rd)O> /0 7/^7=ؘ2eJ̝;7 ibdŃ?W4=G^ce8s+^˸ @� @� @� @� @� @� @�*& m @� @�*/F <P'@@dMg{W_zj[c !k/XhQpUq lݺu7R�;u)ӻuOv%@� @� @� @� @� @� @�: ^Z  @�('|2ڷo-Z( B�$?\rI~1lذyUi~-SLN8!hذa|QPPP0ZjE׮]PPW^Y� @� @� @� @� @� @� @ Ԩ . @� @`W"@@ˋ . cmo`*´i/Ӟ~1bĈ#CvmY8䦛n)G:Wt|g+z� @� @� @� @� @� @� @  @� @�)jqovO�n;,2y睱hѢRzkiޥ=L!iOަ=NGfͲ[n% 0aB\wuqQGE >5k֌5#  Ȍ_ @� @� @� @� @� @� @�JY & @� P]^|HAV{gu%n@ڵǾ'xbo>n֘?jH{*Yڻi/SdmڴN;-/wߍ/<u@O׵ @� @� @� @� @� @� @�TsA| @� P\^:lP=By1hРxb=B[n]tQL2eo{ҞiժUWiޥ=L{:G^^^qgǣ>s̉W_}5N8F_ @� @� @� @� @� @� @�j$ m @� @�U Ƚ{U<'@�i&}Q3daݻwx ϟ75W@O{"@իWWiޕǑkѣ<3 @� @� @� @� @� @� @@Y7Ւ @� @̘1#ƍ{ך(&ЬYKcqmW_}?Ѹѻw>|x,Xn+B 'd裏"IڛGA� @� @� @� @� @� @� @`m \� @�/bŏ[ ck׎w<6/Ngn{v|ͱFEn8 4icN>=z6lX<1{رcwyq1D-*g"@� @� @� @� @� @� @�6 V[( @�X /;SL @@Y><ny;b=XGC=={ .s~>d/4վϜ9s⥗^>yxf͚{ƀ#֭[W{'� @� @� @� @� @� @� @�G@d  @� @�u*0bĈ,4karTE"> "[/⦛"N>9"/ť`³:+;xg'G}4⊨QFl뮻fgΝcvw1jԨx^qŢ%k}]?~ĆnX ,� @� @� @� @� @� @� @ A.� @�T~N}<  PƎ8唈's"??|)#sԩyS᫯wuW|WQ^qc߾ڬYOO?=zt3&=&zkۘ?%EǎC.(chڴiT @� @� @� @� @� @� @�M@duq%@� @�[`ܹs)O5 @K%DSěoFê*nGuTv1jԨx׳k G|衇bƌ� 6*b-ZzWD5.w3gf6j( l%_y͒p:K LO� @� @� @� @� @� @� @`A @� @@Hboqk׮Jb 6sYgEcFavy,iӦE 3fL|Yaòy6h 6m)`2]٤Ih~EnݯQfͨUVvާk:.\^SpOsΙ3'9{>}zz9u:k֬Ӝ)r-v-?h߾}�-<Ǝs1b}׺pW @� @� @� @� @� @� @�) "uM� @�rD^N:H$@@((䒈/g%AkPoISG}SL) ^, a|7>+ k믗{<֭[2ٸq,2;E͛7֭[ges1bDWDqCDlmYև� @� @� @�dl��@�IDAT @� @� @� @@Y9A @� @` qqǭLN�\㏏XW]q&M9\q…Es̉ 0yƞ{ ,δZjeg͚5~_~qGqa={FKĀ}Fg @� @� @� @� @� @� @�]bMʾj @� @�E3gΌ &DΝ @z(WX4rV7ƍ78; M_XhQyѱcJum>bĈ+?#n%"; @� @� @� @� @� @� @�Tf8 @� @�/f?  DyfD$ 17#r=rEۑ ѶmuE"(()� @� @� @� @� @� @� @@ KeH� @�@ xc6>R1dH]wE QjCS&l 4ȉ۷1"b#t7.'JW$ @� @� @� @� @� @� @@5Y 7ݒ  @� @@q;orO�ƌ9bҤa?yUߏm#9riٻ1p`DAAN-C @� @� @� @� @� @� @�@@d5dK$@� @�+5jT+#D{DKsń r.pgڷ_9`@D]D[ԕ� @� @� @� @� @� @� @@ @� @` ,^8F-r퀉 W]q=zD<tDƕ-AiӦ|]G1rI;t80`-a* @� @� @� @� @� @� @�+ @� @:|1o<Aa�8(sY8hPDګzNw^hQ|Ѷmۜ^G*}#" ?Kqr~Y@� @� @� @� @� @� @�  s|O� @�~Ұv2w  Pe/8'c cȐ}ʼɓ'Ƿ~[% Ӣ#9r)., ,((3 @� @� @� @� @� @� @�U@dr� @�cM7 70 W-*@`ѢSNx;'X~Ve۶msڲؾ}ĈDѥKwyeDO @� @� @� @� @� @� @�  A� @�rU`„ QՂru/MXxiСS"/oxw^u[:=~ѸquXELѯ_ȑKe# *f> @� @� @� @� @� @� @�(M@di* @� @@5?~|k׮2  bΊ:4cDÆ _q*>-ܲJ}#" ?Kc-� @� @� @� @� @� @� @ D @� &Lm۶]Ӛ�J #.;/ %N8Xo*Uk'FVd~"F\:}FrLJ� @� @� @� @� @� @� PAVͶT @� P\`1iҤh׮]fV1`@G4nB^zU+.An>.%b§ @� @� @� @� @� @� @�_@d� @�@ *((6mD$@@y <LiE~ĩF <8:u;cyOSU ȴ9Et:t80}2N @� @� @� @� @� @� @�9" 2G6J @� @>l-Z#@@È=">:K"fϞ׿wޕ,p1uhժUENSin>bĈ"%bJ[ @� @� @� @� @� @� @�rT@dn  @� @2eJԮ];7nC>rJ#w|~wf7sLNM!-A3??_#v1p`DAAyk� @� @� @� @� @� @� @ ;o @� P>h֬YU{ �T/&bWo/I<c6^%V;qĬUV%TG1`@D]D[� @� @� @� @� @� @� @A  @� @@N 6,'jU$K஻" ֭:jԨ{.irvYnhܸqή< Ϗ/bȥv1p`DAAyb, @� @� @� @� @� @� @�&  @� @�AnKo#~ݿ_%ɐmڴjz 7|j/}#" ?KqV @� @� @� @� @� @� @�+2 @� @@2eJ4o޼  F4nqe߷ϟ??ݻw}ޥ VZUկ|E.D QP<%@� @� @� @� @� @� @� PR@dI  @� @@5ϣQFdI@u:4b!C"^YfI'}c5o>bĈ"%bܸU @� @� @� @� @� @� @�BA @� @ ̜936lXVmTG%9ѷoi- +np7GnݢyśIUVve]x~~D~#G.}c]"((( @� @� @� @� @� @� @�TgAy� @�%h 4O@ˆŋ#]o =|駣w>ƿL"s5}#" iر1 @� @� @� @� @� @� @�R@dv&@� @�.0o޼X`A4lذSX?U\`Ĉ_W[n%5jzhW(fϞ_} ȲqϏ/bȥM:D QPP  @� @� @� @� @� @� @�eA. @�fڠA`$@ \xaD{/Kx2dHxQVeV_SLV޼yj*Öݾ}ĈKCG%b6  @� @� @� @� @�<*K ޛjPT@[P(A+*Fuź,�QĂ ,E) UH?gLB2!{gr){,>y@�@�@�ȝAʨ@�@�@�HS`xɒ%< u_~f͚ /PY5dsYhs{pڵkΦ z?| 2ĵۙǙ':5Wׯ}Wz y67{lmڴI~{vޭ1cƨK.zӧzꫯ 3O,EDH˖%դ%en!=W_խ@�@�@�@�@�@�@�@�@�@�@�@�@�@ KV*E�@�@�@ ;:wb^W\95FgY=WvwLLΦ z]Hc;~mOVz<ǫEԩSn׾}4w\͜9SGM~ZnoܸQ7o-UY)XJ.*l=JȑR˖ҪUHZh7F  � � � � � � � � � � � � � �Y&@dR1 � � �+pI׹ n'y@RJb -^8#\I^hMl;kS:?>,M(s_A-qڴi߿i7zziРA;  .uǂ +VzERDlYD&RTw2_vNJo+@�@�@�@�@�@�@�@�@�@�@�@�@�@�-O]=!� � � @ ĸnw>rʩJ*T|y3&C '>6_VɏvZצt~V{m)6V[4iBBBt7'9yfwR_hZ_{fAU.-\(EFJ#GJ-[JW];_5jpk@�@�@�@�@�@�@�@�@�@�@�@�@�@�΅�AB6@�@�@�0'Oϟ?zFw;vy߮>HzOkŊ8pڶmw}wxI ڰ'|R?KuA/{mZtumj{{IݻK%J]E4x`ZbE͜9wpÆ +k.},]wV O\siuvcǎ1b<h=1cz<ଭ?7xߣG-[LFrvRZ 45k裏ꭷrc֭[;ݻ#K.ٳOA&z'O4"B{PoRT<o'ZIl߾ϟ(qNV@�@�@�@�@�@�@�@�@�@�@�@�@�@�J Ȁt@�@�@�s#*PiV@4 +WJwީǏWZ{W<^uz:z/_&'y#%ocΜ9.]Р0a&i՛mumJ{ƍ?woZnҥKȑ#j޼?dV)6miӦӧVj7NCUhh,Y}2K;\kZܮ]nASLq۷oe]*THM4$-TB"kժ嚰~Zu]' _.Xۇ޽{+((HfҀ}AiѢT0w#{ A^[sHyB;-%tPI<OٳgO>Q^=5k̷  � � � � � � � � � � � � � @ x!� � � 'Otm4@<Xu5h̘1n_'-wu%KԢE;駟V||,X6q=$>mۺ:C_3f_WuEZ3UE+}$OԮ]B6lp!r٣SV4ydM8Q˗WÆ 5jP6m>o4h_~EGvNX{fhk׮uqҤI.N�Is0k֝k!}+_|6l[7o[ڏoƅLW^͛7:BBB~{ZZ_1u]nZI| +RDlYBCOp{ꭷ҈#|k@�@�@�@�@�@�@�@�@�@�@�@�@�@ p {C@�@�@�2Ҧ,CbRشiSGn y,T;J**\[H+vrˌHFJ\;}2ZogKe"O?uܡCO  .@w[ٶm[ZW4z%3֪UKtx:Wg+VL={ƍ5|wՊH8qB.;tG}RjUY�}g>p>|XӦMԩS}8p럅Pz۾}LR9Y"`yB)2R9RNiժ5UT)&Zlٌ] � � � � � � � � � � � � � �*@C8 � � � @^رcGCܹ a3fLmgppps y`֛9tɶ׻˗ȑ#ӧ۾rݺusm% '0y){ڵ.~zjYÇwemVz-R-o>}IE] )>?^*T=Cuq٩=裾ώYVZdS]Y%`S:"BZ,&M$fUԋ� � � � � � � � � � � � � � A] � � � �yN"10@SLq\6߳k\۶e˺3fK.ʕ+w kaaa:t,2yٸqc]m75m{ǏԩS?~oy$^zZrzӷo_͙3G?+K-!3Y9vvܩݻw#^d…Rd4rԲ � � � � � � � � � � � � � �R seX � � � �-<zkA1118qbu\eOGųgKKJ}rƎ;Կ߁~=O@8qmGFܩ#FPzR(* =~4h?CbŊk_N:yN6LʕӤI4n8O?UZTHM<Y˗/c-[SɾOy-K=QQ'3b!@�@�@�@�@�@�@�@�@�@�@�@�@�@�%@dκ_@�@�@�@ xzTreuUo,yfo>߾$nc=KH_{;wVh/Beʔу>UT-?sYH/[}ޥml۶.N-ZTSNW_ѣGkРAիF=@/^\ժU7쮱pH+VPPY|Gl.St}yԺuk=nlW\qjԨM ̓'CTȑ售Zrƌ%J駟N"� � � � � � � � � � � � � �@ҿ.)@�@�@�@�r72>>>Au]Zvz/^.$=n?냃Oۗo>he޼y޽/ 057uz;&F'I-ɓ'uo߾ׯ i\I?J,.$5lP?nF.]g>c =3;#_}Uwޗ_~) ={(;6aUXQ={ܹs5׸qvг>}hzmyI5l0>SDD[ǖ{׍ԣGwGz# .O<[PYm~dMe˖%Þ(y<˞k � � � � � � � � � � � � � � cyHzU# � �dС5jT.}}@� L<م9jB Xhs=Ǐ`|vx˗'@ԠmϚ5K:uҺuTT)9jժQ'f7oVj{nذAYfM<4v:tH R}gٳGeʔmb?p#GhU ~ꭷrc ȑEI'w}k �d@* ![N@�@�@�@�@�@�@�@�@�@�@�@�r@971 � � � � hł(XB E~7NZR:uTtin:H- 2Ťev.d{O?+=ŊKig'γ(PIZR"EԨQ$!vݻUlY[@pɏղexPÆ%OgBGذ � � � � � � � � � � � � � B< � � � �X7emsHظqs1J-p8}t['OfHC o}}&MZz#;V4H:4;lk׮)d/ � � � � � � � � � � � � � @ 4� � � � J)ӧOꫯqZdZI{w'Oңl@ ԨQ#D$0}niС\rڹsg'p@�@�@�@�@�@�@�@�@�@�@�@�@�@ eF�@�@�@�@  m֍zϞ=:uTHCݰA];C5ԓ۝3;۷k*[lR<Fd$rl)=),xJ͚O>!2`nA�@�@�@�@�@�@�@�@�@�@�@�@�@�N 4v � � � � u!!!جk$ּiTF|&Md&rO6""eoDⲡ34� � � � � � � � � � � � � � ! 3 � � � �dN 'Of"N"`I'F:ݫ2eʤlN $piB)2R9RjRZ:zH_@�@�@�@�@�@�@�@�@�@�@�@�@�@� \m@�@�@�@�P@,l%U1ԩSRٲyoq'Eѣ*QDfl""e:и%eSh@�@�@�@�@�@�@�@�@�@�@�@�@�@ M  � � � �A<yҿvJ� 2EAf.Ю."##-U@�@�@�@�@�@�@�@�@�@�@�@�@�@ H@�@�@�@�Ρ@]kǏ?Kcҹ!Aiٲ~4i"EEIqq/ZG�@�@�@�@�@�@�@�@�@�@�@�@�@�[ ȿ-XC�@�@�@�@ BCC]A:::0֛j;xfpå HiHeKiժ<3|� � � � � � � � � � � � � ��A}{ � � � @n(TA ȿr6[y.n%J#{ ""eޤ%= F� � � � � � � � � � � � � ��At7  � � � @A;v,׏\qB6nVϗ\"g ,^x�>@xp))l)Zu8@�@�@�@�@�@�@�@�@�@�@�@�@�@ "XE�@�@�@�@ %0˗OGI0!aԮԨTTԷ'.ώn-M )YhQO'IkFDH˖% I)**aA30@�@�@�@�@�@�@�@�@�@�@�@�@�@ @ C@�@�@�@�r@ZѣGs�,qFiʄ޽RLL w~-pA/^jpiB)2R9RjRZ*W!� � � � � � � � � � � � � �'@d:� � � � -Caf<Y~)88&<پ}pT:pJ(E!-[0&M()..mk( � � � � � � � � � � � � � ^ +y � � � �IxAfҲO)$$J7<Ԕ3y\|8<\ZPFZVJyRq"� � � � � � � � � � � � � �_ [q& � � � �~ H ߣ<Zd)auK{ #mKҲe #oDJ`Իyscl!� � � � � � � � � � � � � �dL Ȍyq6 � � � �(Uۗzz#Ĥ`;uJ{ >|XEM<'.-\(EFJ#GJ-[JV%0[BXmEGK7ܐsp @�@�@�@�@�@�@�@�@�@�@�@�@�8  K@�@�@�@�Ȍ@ҥwT.5RWβe aJcS9' '>.[0&MgnUO+\) 1 � � � � � � � � � � � � � )tF � � � � 2ehϞ=HA`ԩH]&VYpOH."#瞓,,�[⤗_>Ի% � � � � � � � � � � � � � @F̈"� � � � kΝ~*nI*Q"ut[ =zTaaa<),p =-l@nUڸ1O0h@�@�@�@�@�@�@�@�@�@�@�@�@�@ SAf@�@�@�@�ȸ@ cǎ_ ( (}ڵ{yL(/lR9uJ:~\zɔ` � � � � � � � � � � � � � @jA&~@�@�@�@�HrʲgQ yڻƜ/tRby 3gp™ks+HKΎ4thp@�@�@�@�@�@�@�@�@�@�@�@�@�@t O7a � � � �Y*PJW֭[RyժRNRH,uWFq=zTaaaZroI=XKS|B�@�@�@�@�@�@�@�@�@�@�@�@�@�)@�@�@�@�@ TBOټy9n96w}RllB!)8vAg)#t]R CΗ/!l55} R;~@�@�@�@�@�@�@�@�@�@�@�@�@�@�!7XG�@�@�@�@�(\ʗ/ M#5ڇRݺUBE<)?}IxO*..NW|K[/RJ*%K*44]qugW3%Խ{4g7W_%lyocVl]wR 2Ӟh8q[m>96SZt28882}s {G ĖB z22.E�@�@�@�@�@�@�@�@�@�@�@�@�@�R 2%!� � � � k본]i˖-ںud}i..aC=zj ܂ -L2:TJUZշ_ p~Y ҽTI善cFϏ{W5o^8 <_~ɧv~U׮3e9z9▶ݶg0R ~ B!}aޏZ.V/%J�Z[ڹ@�@�@�@�@�@�@�@�@�@�@�@�@�{A{Έ@�@�@�@�@W^�= .ܹSK,˵j*YnN8:hihum۶*] S+Y q *u늫}?~Y`},lλn!u$io]\5k<!w_?"?|AKԤIY!2vcǎɞ}ݻw^ٳ';gbcc_߷ͪP[XhQh Ke@E۶O}mۜ[&^O~̶Xl|||`{Wx?maWҶހK[ZhÇ}a0Lk+y fae˖u!ʕ|M6 � � � � � � � � � � � � �9O Ȝw1 � � � @.03g悑d|Nʕ+5w\-^X-͛]Ejr!:uҰa\bz\\zZd3X)Lcu.ӂ;-Җ| dz yjѢڵk+Qc`�@+}Wo,Lml?-mB /: %`ƍB[PG `.mZ)&6n|]5k&1mBw9<x@{nK oZ+\s}L\3To݂6ʕ+0ױ� � � � � � � � � � � � � �#8@�@�@�@�s"ШQ#رű~5{lY]z߿5kMTRgD\/_>fakW]uU66lؠ%KZ;V111 Ծ}{]}jӦBCC\Hހ RK:kӦM-[<�B+,[78N:jժ P;fc)1Z/ZXXcFE;z]{jժ^U斶nTPts@�@�@�@�@�@�@�@�@�@�@�@�@�@A@�@�@�@�H@&M\0?]uM:U,X .СCծ];5nXAAA9jL;[V-٧gϞnѣG5o<tiaFroݺuSաCZWZɟ?[#N8c ?g!ް? VgJ*AX�AJ`Nԭ[7[=۶ms[ʂAcA<|rkڵkOzdwU  � � � � � � � � � � � � �9P x2 � � � @P/ sU}'z7](bXXt ;v(έpԩ-͂0LnAvnw- ៊~DGGk_}UViӦMwݫX S Y{زTR=f ^֕}wAޥΚ5K۷owY@ > *ZG�2��@�IDAT@�@�@�@�@�@�@�@�@�@�@�@�@� ׽T@�@�@�@�)p%hҥ2결ѣGk񲠱Ν;:(444 wy2dXcj„ jܸ޽{gk8fll#ʟ?vR并wB`W\+VȖ֭sv/֭BnVկ_m۾"E9+_ I^9C{׬Y# "1c^|EYhDsxEQFny\rɫb@�@�@�@�@�@�@�@�@�@�@�@�@� @8� � � � @V \vezGj&KSOiҤIXrYnNl .ԛo?4h .|·enV:z [d/^_mݺ5XjU5lP7p ջ UNOYwG95 mҤ$>c]?ҟ~IolNR lڴ7of͚Zu@�@�@�@�@�@�@�@�@�@�@�@�@�RIS@a � � � �Bm۶:x-[& Ieƍzv;vzM]:nb˖-e{N/|I>l0 MG-9I<۷k޼ydgaժUsyyҥKajB pO=|ݻr̘1z]{+P֭]PBV@�@�@�@�@�@�@�@�@�@�@�@�@�@@A � � � � M*_Νc ]pVZUn&ebm\rzg^zɹ=Zu7ƺvNˍ߿_|k}Zn ,t㏫yPBn>cdھ}{2رC/֢E`7N'NPݺuզMwUW]%Kz/a� � � � � � � � � � � � � @ 2Ov� � � � (e!r>`t)~X`{n=U@T@,-22>kvMcƌI wg\R}f͚K*$$D-[T>}ԪU+5k̅Azg@^k}ld͟?{eM6Uǎy]tQ^a � � � � � � � � � � � � �|k � � � � 9ԩ[:t蜷-+""BW]u5jk׺JB +T?=.B},AZ!%uSNא!CTZ57>]ve. r3gF+)9 , #6W,@!bs1k@�@�@�@�@�@�@�@�@�@�@�@�@��Ay.3F@�@�@�@�ڵ5s̀}Ԯ];k0aN+d_sKZn+WK.Od,J\ի]յjJ˖-СCaٱ^xA۷WBr0;L;6l.ٜesڃ>莝N � � � � � � � � � � � � � @d6$ � � � �^%KM66mwW,l٢-ZhZx0})\ =z|Ivmcbb\!!!~;Vx go~xx͛}w2dj֬SG(K6lnHs6lN8Q6') � � � � � � � � � � � � �6 se< � � � �9N׬Yt֭[պuk*Tȅ@^pӷԑ;S3g>}(>>ޯÏ! {ȑ#UjU >\W\q֬YB ~2H*`sܳ99is(@�@�@�@�@�@�@�@�@�@�@�@�@�"@dn@�@�@�@ XdttOc8x:v쨢Ejܹ*W\@+vꫯ֌34uTPWjЈ#TF M2EQQQڶm{9իW/^HCA6'mnjs� � � � � � � � � � � � � @N 2A� � � � *Vǎc߿ۧ/B%K >N\yz/?G|rREN[ou>;C_~EShhhN }E \9isU0@�@�@�@�@�@�@�@�@�@�@�@�@�*@dNs@�@�@�@ W 0@g֦Mu\M+U} :~X^zt_ѧumΜ9kոqcԪUN;';nf{8pvܙԶnݪJzꩧrJ]wu2ʹ﫯ҰaTvl}}:tV"ikw֘1c{^Hz0nܴ9js>e @}m۪sι � � � � � � � � � � � �d�A~ � � � � �r2˗㳍[Zʶ~R7t>#ժUKԻwo=3I`uQAAA ճ>͛B$]ŋGK9|5jH vwqI%ז-[4qD0Ό<v5kohطoΝ3gѣ~9gWes欅ls�9W {:P}֊+d@�@�@�@�@�@�@�@�@�@�@�@�!@?@�@�@�@�L _~7nN<czϮ\vՇ~6m~ӤI\ݧ1cccc 6hڴi.,;ԑ#G{]$,,L.4o۶mߡ{PW矫}<xO *dqT& 0`ׯ@o&C3 FTv3u;ˏ׫WO vrj6wms=nNܦ @PūJqqqU}p.;Ic@�@�@�@�@�@�@�@�@�@�@�@�@ 2 }B�@�@�@�ȓh{n:�B٫W/-[6;6-~SJhBիW7@qΝz'uy75jsgϞ*U~LWǩS2]WWrJu]#GtaޱzJ,>*7ov3oXF@(ҏ@H6x 7mn @Ysl[WD +V,g[@�@�@�@�@�@�@�@�@�@�@�@� 9@�@�@�@�򐀅 [? <۶ms!ZvVO?T&MT/BDK/W_/cByaÆ5j:v!Cz״h"EGG{*U䆐VSoΝڱc֬YѣGW\YI\fϞ/X\sM~[/PZ͜9S#FT0 ^�؂.ۻpO:>M<YP͚5խ[7:tHӧOw^|E裏~wμyn:5kLQQQ*R?SN:i̘1Zvn6zFj*H[~7nTƍgϞzWvm]yڵk{8p>C>9Xgʔ)'AlmN7h@=ʕ+3oݺՍsɒ%TVM/:o:{\pԮ];q#۷o-rڽKسpB>|/^nw,vڴiޭ~֎{wk׮ 9KsB{wjwAlʊ_nSO%QHg/VX! ۷*H;}?[jkQF}=ywkذaQ}ދmR5i$M2Lͮ1~ � � � � � � � � � � � �y|?\9/=jcH= � �-0tdONG�Ny?:GMq 00 ޲sU,>… Y \ի5h z|r 0@kݫ͛7wS~}c3gڴie˺H իl9c ]ve.T3z-8O]GҥKk֬Yeb}t}# ̪bDv_ٴeϙvt6ukyp= @SNttmٺ {7]੅]z.pn.B~wԢE �U{v, TR.tт�mX@WӦM<@es,m۶.vȑ ѣGݟ]0~xivy[B~\ g@W ~b`+WTŊu66y?+>jJW]ul|_~z}m?#K.q!>`edfV<~ZI뾼+zg56.{Yx7v;ʗ// om{С.מu뺶=Փv3EA�R%??{=s޽>d n;w *͛wϙ}Npg w4{Zߞw@c}Prz.ƒni<j3Olc � � � � � � � � � � � �  � � � �Z̳>{N;ehʕ˒+V 2 F @ }&MR֭x-lB.],ΊYНLj/0a �z'Nns՛рM 6l_Vi$.BfF�i[nJ|_k֬wޝz-͊7/S| x H񅆆ӓ'O:ɗ_~م?ѣ]�ռy\%FEE)::XUZUw!gV}bsJɒ%]xO+>>qy޶,{^Zye$\,Xyپӂ@;<)S[o/_>hώZԾKsδb[�kkQ˖-igv-h̞ L\4hwXW irbsjA εL >} fXp='V@T�asۜ~Q@ bcX>d,H~oYpw6 },Z}kiN\z2殻rU{7Zp]+}3;ӝcSX=ƻfڵ`t ;\%w͉a@�@�@�@�@�@�@�@�@�@�@�@ ݡ3r@�@�@�@�S`Ĉ.m֬Y笃ǏeEpD ]ЎXxNZtAdJsAhvy[Yh[ʕ]@[ŊexrW K eH+&=HYhY�f?Ir-ZHGC=}Mr6[f/YAK1/3v٣ƍ0> 4{|U.\ح7jȷre!SX@1 K}e֭[}{*U^-ъ7wr+i>p+fYؠy8ʙm!b`..\ht{?Yݳy}aҹsgg3h . 6l݊71=x3zUo`mԯ_뷅Zŋ] O|ve:_ :XmgX(Ng!ӦMԩS}+W)Rĵku-žOw6o�(wMg y7'u@�@�@�@�@�@�@�@�@�@�@�@�)@d޼@�@�@�@ 7og,\YDeڵ*V~gZ~ڴG+̓,{{~HHʺu{Nz 7x]?xgQ- 6x^fwzU•t?0>{&m7|M6kdsVV{8N+WyjJ K)UV,T5qg<&ޟzz2ZgjYHݻwviǫB 3f,0>sY%Kôcx峽/ϟ튉q ȞMjررcKf<l\ @ q~/witwG}r{߼m'=dȝ:uҷ~]`}0a}߳�ߴJZ}7@�@�@�@�@�@�@�@�@�@�@�@�r�A2"@�@�@�@�\ K+V|pNFSn]<xP ӡCd8ƍ:Y жm۴y$W\m/_>~m\qUYgCyY0ҥK"Ѫ!Iqqq4G7g{֬YX:g嫯R죅\ǻPAo=z_|9so߾('Ot3'`,=0[+bK/ʕ+իW/{d{>ӪwqzKJM2Ņ0@oVBFS\ 7es�/TubI:^{ZF޳t$uƱcǴs'a! o***JO>#~ /`K_d;w|Vt @�@�@�@�@�@�@�@�@�@�@�@�-@d}t@�@�@�@ \xׯ~a?~<ˇ٬Y3L6{lըQ#W#\获 *""»y?~~*Tw<A?l,YDXԭ[4kڶm"Ey <::o]LLLf kkժ;Cva|{G;v7߬~=Ӿ}RܹsݱΝ;O>q!۷WRG&gV9yܰaCײ=É:ZeFJZ~`'N$BdX8 03mV:vaAÆ Sr4i$7εc;ȑ#?#3}qX8iŞ-+֝x~ؽ{NA�(XDJ@˖-q{W{~<W'O}{lۗJTZ5.8]wN>|,(L%wپ&@�@�@�@�@�@�@�@�@�@�@�@�r�A~2@�@�@�@�\$OjϞ=*\JN-ZTSNW_ѣGkРAիF۽{[IOmXxЫ ܼy֬Y*Yd&i${̅q~w.,::Z>|A]ve׻1+ڻw7߸~;63{Νꫯt7f" ay8�+xsصkW;v, zhW96o\ 4P%onۂ&N*Vαe˖ɓ6m~g4i'<xНk?lXI+pҝGz汅ZZIn#.X%Ch"w_}gxzJZ~*UrU|粀X{gXwh̙޽߯?z!z֭\ l2GwZ߮*U{dG={Vdd;۾wi;my/۷ow$/U ʹ`)S衇r->s油 Њj׮{{_|2eʸwZPj*߻7γ}w\d֭㏻wkԨMRidO=bm/rgϞ?‰&S{ǧݜn@�@�@�@�@�@�@�@�@�@�@�@�@c'ONw@�@�\"嗫<U!1 @�lLy?� leaO= +^xwKO<N:rZXXڴiYfiʕ.|y&L .BZXY8ߤI]XݕW^) V;>c[NVf@P! L믿믿{iƌ{u=23˗^zI_~믅UXw?W,$~ӛo j;-—  <ۺ sn:v쨬Sg2ƞKp?ÅUZ]{m�3ϸ�-{-f͚ݼ? ֭~׷m 9rʩqgꪛ ~vjK/u~ ^?~ٸ/"z>gb 7/-ZV-͞=[sΕZ v*_ w,<BW-`YfbAcƌG3 -:t 2w*Z)R"o ܴi]`HV=;IZv-l^W^ޝL ba;c}z̙i<wȊ,$C:r䈻.GA�5*?ϝ{W.b,ؾ;Ɗ,؂yl{ܻޡl{=**JXN׶}kXȤ bA-|ڱbmM=;>;� � � � � � � � � � � � A)QPx( � �D`ɞ0.H' a �x,pE�,8y4h,\0KV^AAA~m96lpf`g!-qqq.ò` g< K+[lB eyڵkݳ`tbL_|/vOB9x Zx [mǏwARDhSɃt±o,B C%yo'??36n6]vƌL~0f}f^Df! ?Ю+{Q}eSis,y?M Ƶs-l?K>x}l<Vչ?&"JQQAP(bbbnޫѨ1jk/DT좈(* 3 E6;�373Yks>_]en)@5/F_u�oO#YcΝF~goc `-"q7tKcgoKe .o|E6o<]O� @� @� @� @� @�  ss]TE�A9 !@@ ,WNpѣGA?x`{m+K."Sc_pqu :`,T.֮]{OL;SL4)wU~Ĉ#b٫W+8>IJN&މ\4ǫ:yNkܸq<%픏 ">;68˧c PnA[:"@� @� @� @� @� @� PT @� @�j'p '^ѨQ cϞ=뮋;WxdMd=7i$.~<yr[[fK!5mKr'?I;;H}Y)kDSڳ0dȐ֭[iJկ_dΦ ;q5<SLMX @� @� @� @� @� @� @AVa  @� @�l 7ݻwςn u=sw¶|HeKCrӹ {<nrnݺY_512M<w}qUW]z>898蠃"//ܬ7UVũǏn;΋N:iC)ӵNZ=!nbV^O?t?F~x曱뮻Vz'@`fKԪUk}M7U @� @� @� @� @� @@Ae @� @�*SuY`w8cc}rnꫯC?OY�WRR ` ;zL{i[lvQ-Kr<H;_::h׮]|q'6lYYvV<pzw}ӦM{7Θ5kV 6,&L;S.o?<ڷÇW<3Ի# @� @� @� @� @� @C� @� @`R<ӥPFmb=}YG/ /Zj&gU`q '/=Pq6h yɒ%Z{U,k&W\qE 0 `MB [ӦM70 gƽ+ѣGϟ~ܲe˜QME="Cv @� @� @� @� @� @�T:q&@� @� PXhQ >Oazkp qea}Yk_|1vux㥗^ܰaÌ{Hs?яwߍ7x#zo>^{m;ka� HPz;ޭ8ܧOK^z@n  @� @� @� @� @� @� @*+N @� @�hӦMvm.xbrye'Ow1?FQQf `8sbz,R[n /ǯ~OP=3?;:u38#x;w;q�IJzgһޡ.w*ަw,k靳 @� @� @� @� @� @� @�.PO @� @�T7c9&)'N!+z)k„ q%ioo~U5իWgភ^ziw'xf{Æ AAVZ{g뮋:jԨ=zt|ɱlٲ,n}d-Tٳg/W^wϏC9$uVSy̛� @� @� @� @� @� @�j@^  @� @�rK4n8N:(**,shԨQtMoDݺu#C:4o V#GfsN|;߉@& Ē%K#oΩ{1|_Ϗgy&=}H!m۶]fkBS|X|y֤s%g==nmgDz7;ޕΤwGdeq  @� @� @� @� @� @� @ Bj @� @� @`jc'&\ݧOxWgn!_|qV&t]cn]lYw}q5'|'pB<Cov ŋ7iz4KfZ;6ϳ�w1z]w5i#PURpロ<[Z [hzꩱ^{E~~Uej$@� @� @� @� @� @� @�M@f6 @� @�۷o o?<R{ꩧꫯTC ;3n4mwPN<9㎸㫯aÆŨQk׮!Sݾ{QQQ|G1~x7?O_F^^^l;ggϞѣGb-ʿ8=(+bԩ1iҤxbĉYKի#0_xᅑB+󷬌r @� @� @� @� @� @� A9 @� @� q?^|;=7oqm]rH[omݖS1"<:th <8ի #T[ 㡇ꫯFΝдSN9%Zn]kԨQJYTjժ䥐-C~oDŽ ??'dRvmݺu~֪Ujej[`ܹ#A7n+veҥKvnsk< @� @� @� @� @� @� PAVU4 @� @�+RxnÆ z҂z믏/ ><裣A1dȐ,-ZTJ!jF|0^{Ha~x\veqF^^^4i$-Z3ԔBһf-'ے%Kb{ŤIbʔ)裏G}˗/.kܸqv_ K}m&:uꔵw@,]4OiӦeyJA/Ȕ֭=O;CvaѣGٳgt=GI� @� @� @� @� @� @�  @� @�JH_bqWW\Q)uB:묬͚5+ CLx≱zu]#B{d!Vςxgg}6fΜM6C9$.8蠃^z99T… sXT NMZ*>䓘:ujWOD K[֭@Ǻ-???ڶm+دuO7(R�9sJfDzjߵkܹsԮ]Z; @� @� @� @� @� @� @@ 8[= @� @�l}_WqyE~6(Νs9Y/b̘1YX>^{mEϞ=#՟ݺu^+Լybĉ1nܸQXXuɂ-O?4hP6֤I,HrUMYJa}3PcƧ~ܚ[Z6m"GZlZjk`;ZZuٳ�~WFi ;t? ?v)Lm @� @� @� @� @� @� @@ 5P @� @�r8#1~ҥK[^oYK}Μ937՜ȑ#cɒ%Y86lݻw=z;;vRYÆ ˫3w,</Pɓ'gmҤIY8[1襠s=7L!5Zoz"A.Z(WSWCSji˳ZS+OASN- \lZ]f͚e͛7Y;njw6քmʕx/ԸfK!-X3ϟ??mIVZ^z%![out9kh׮]Ig~ݺu׺ @� @� @� @� @� @� @ 7jƿM{U @� @�(wo=GuTkѠAr:l߾}vGg]> Rb ^LG[o5 V+7ϥZhQH4-"RZji?ЭX"Rޚ-R ^ \3/0J\gϞ=⚪ Ȫze=:u7ݕ Sy|+X LSa ]Yw4~ JMAw~kxZv-,yR ejyyyY+_3OҖ~WV^u?t,5#?X[jK.]W_}]܋m�ە%}l2]+LqZ5I� @� @� @� @� @� @�TAc͂� @� @@&zӧOtI?9jժU%tRp[ݳn)lnƌ駟f ϟХwy'O!m)mn8d jJ$SZ׮] 2ٱcСCRx[uR(] (hܸq>*gzRdqKa)8$q@5Sdqbq cwq`>ӻr(**Z*8#$+ Lkz뭳 5.g)Lo @� @� @� @� @�8��@�IDAT @� @  @� @�flM<1hР+g?YafͲ^zU4i)/U\3TϿRa UM2<?XdIX5� @� @� @� @� @� @� P\ @� @�[o:FYWfh޼y^:.\Y5(((cׯ_]� @� @� @� @� @� @� Puʵ7 @� @� 3vZL4)N9ҥK/gjSHl2+fܹY^T& 7&W @� @� @� @� @� @� @�*A 4$ @� @�I뮋8 =И2ef0UI8r޼yUl ȯ8@� @� @� @� @� @� @�䨀 ]e @� @�(xk׮qAEaaaytj$ -f J l׮] W0} @� @� @� @� @� @� @* F @� @� РAx'#}<8.\ ԫW/6lͫnS3&nkجM� @� @� @� @� @� @� ⪩� @� @ 4o<~X`A 2$ Ye˖ א!km @� @� @� @� @� @� @ +~ @� @�eСC<3G!/.. W-]4 ϯ5C @� @� @� @� @� @� @ Kh @� @�.Э[3fLL2% K,)ͮZsVX(((&) @� @� @� @� @� @� @� :9 @� @��=zs=^W_m.mڴٳgWǩS (,,fڮ]2c$@� @� @� @� @� @� @� Ȫzj'@� @� ;c9iҤ?ȞVڶmfͪS1*PPPuԉ֭[P&@� @� @� @� @� @� @� ȪZj%@� @� P;s+1gΜg}"j Ți+=yyڣ: @� @� @� @� @� @� @�*_DVו5/ @� @�en0ti/].n)@oܹr65!)2??4  @� @� @� @� @� @� @�.   @� @�l@ O{嗣]v{Ƴ>= ȢϪZ% f#@� @� @� @� @� @� @�TAUaH� @� @7ocƌ>8k~{\(Л5kV.eHA)F� @� @� @� @� @� @�  *� @� @fW^qeYg~Xb3lhӦMVBaaaeb|%]AE& @� @� @� @� @� @� @AV!  @� @�W^#G?1p9sf.r_~4oZ.6@QQQF$@� @� @� @� @� @� @�6^@۹� @� @@8bܸqpu]gs5 t1f̘@7o^,_<\ &@� @� @� @� @� @� @�j ȚfM� @�5\`̙5\ (@=0A㢋.rk@NAVeS? 2v @� @� @� @� @� @� @�T AUbI� @�WO?-F@hԨQqm-}w}η&Ocǎ1}L`UT0<??@ @� @� @� @� @� @� @@MYV|  @� @�l駟&L F>}cժUѓ[rU AΘ1#WS Dƍ# @� @� @� @� @� @� @�UA@dUX%5 @� @�m6^z饸+.w=Ə)<RYbʕѝ>l63 @� @� @� @� @� @� @`SAn  @� @� ڵk%\'NƍG~Ϗ/)Tϩv)VZ)TF* JV @� @� @� @� @� @� @  @� @� ;C >~իWop_n ;fL6-7 R2 vڕj @� @� @� @� @� @� @�*_@d寁  @� @�TYO>9LsLuY뮻Ƴ>[eS o۶m4h >裚`UP0`J&@� @� @� @� @� @� @�j ȚM� @� @Zh7|s;ѱc4hPtA믗\nmL:us g"PPP \$uB� @� @� @� @� @� @�l.:k  @� @� Pu?x3&.s=*v}=j2]Apq;__ڵkoL{{3<3>hݺu 1c,X ;kom͚J;X?[oٳ㩧'|2Rizfַ=cqywx.[x NMSY{衇R @� @� @� @� @� @� @�\  @� @�ַW_~:R`_߾}cnJ kA /|'6~җ+Wƒ%KbŊk1R_z&O~g͚J9P(,,̪/3fDZz(=*;JO<GM7nl2;tg5jڵEox׼> @� @� @� @� @� @� PA7u @� @�)pرccԨQ|4hP.q=VpbҖR݀GqmmxkS;Fq_Υct~}9{YQ{RT矟Aye>]ty/s=75k 'Ĉ#⮻K.$-[V~]H� @� @� @� @� @� @�ToA{}͎� @� @@ <8ƌoV3N9رc\veYZm6⋘;wnt9:t萝~GiӦ\[֝5Y5m 4֭[]\渥wFڵM6-N:=۴![z,w� ۵ @� @� @� @� @� @� @@Y} @� @�nw_|qiŝw]t!Cģ>+Vȩzkb1]vͦfa۷Ͼxe…qQG~i|qfAg...Srv<W+W'x"<,4 .,:s̵w{.}_s;VuFyyyYC=||qgO?]DR0m:Yge^ʮ{//yS(jzƏ8裏?i?'NIaJg̓)dK.e˖u]sLwG  @� @� @� @� @� @� @�5K@dZo%@� @� P:t:f̘�׮]8s7ިkj;v D ao߾EӦM;;o,D _|XxqO?p~JΚJ㤓N;,y,pp7|3=HƜ/rS>:v칻["=SLI&Ztݳf͚eOq,t4ݘB!ӳcŠA>:uDzkOJ}ϟS)+N3^}8 @� @� @� @� @� @� P AVE5% @� @�UA }1z6mZ ><ƌ{Glqe0jScZ[nY^ΝN(~={v<ٱK.$og]tQZn/R}Sr;[w/ݒB!?H!GqD|ך湴M׽/('vQ^O˗/Z)[Vx_"R0mҳ~׮u(۲xz)d^ͥ|1bDYXN;+.\'|rҍC @� @� @� @� @� @� @@5Y  @� @�Tu;_?>=и{bv.]ą^cǎիWW|ݻwɓ'ξ}Ʈ_~#=zD ?Q|̟Ѯ]:}SVk[1o޼}Dzų>{7.sHGyZҗ-k6le]JΥڴ%Ǿi'U>ѶmHwۀ"f!} @� @� @� @� @� @� @�[@d^_#@� @� Pzկb鑂ێ=xGb:N<ĸ?rs  I&ZgcƌSz>]zϕĺcǴmje5UO`YчrH|ߏiӦGK5'f!wyZ7KN0ʲ?gΜ/bZNׯ_|P\C� @� @� @� @� @� @�TA`M� @� @@u}k?0{1bDfo[=#.xbٲeՕaΫ{Y%K6aâQFqw|\ycW|yeE,^8?ƟϏѣGСC*O/x馛:!_R`իc+m͚58sZToRЭ� @� @� @� @� @� @� k:% @� @�*/УG b̘1?.}pѴiַW_}u⋂!7rœsQQQL2k=Ԙ/_q`sQuϟ_^tE1{8bĉoCHok׎?ڴi ŧ6Ϯ2dHȴx[nVSK/>Ǐ/9I_ @� @� @� @� @� @� @�j) Z.I @� @�7>:ncƌqG}ѤI߿'?Gy$ *3Ν;GZ⡇*3<3 |KL-ZTrӳ?؆9ܹs? \d)[nɾ7o<={bSplsB G)1L0!;_dd-^8֭[z^K. dg͚_Wٻu7զߏ/85k @� @� @� @� @� @� @�W@d][3#@� @� Pc:t'tR}ݑզMbvQFeom۶m&;HlJ,YuuԉxwJe]vBxgkRq"8N:5;6lذX7 vڥ4F߾}G?Q<ִvcUW` ȕ+WF X<ꨣxwO<guV6ɇ~8{ZnΟ??v}837M?ή{GcĈkSd r-^-bkR0{+VȎߏN;D;>p@\yq饗\g� @� @� @� @� @� @�zkQ? @�-0|_͂`* @@ n{�XhQTgoF̝;7R`Ϟ=0>}d)<nݺ9>+oՙK^߮L`8s@ק~:<(,,ߖ-[nbC'|2f͚ӤIhѢ&jժ<yr|嗱;GÆ 7?7 @ }q.Z @� @� @� @� @� @�rYN.6 @� @�@ o4hP֊6mZ%Il)2Q٣G,YVlzF  ]v1uHiK+bˋ.]K)vw,tB� @� @� @� @� @� @�TMAUsTM� @� @& l6СCR|C?>R뮻bҥѠAmݢo߾%sΛXAn^hѢ8ã^zYh9TBߕCO A?;S;vlaâYf]{w @� @� @� @� @� @� @ f j: @� @�l@^^^t-kwNV\^ 9nܸ3fLtMn:{GY@dÆ 7n+@>cphӦMUHA۷;.RkynEEEY( nS0vmǖ8"@� @� @� @� @� @� @�j ȚfM� @� @@ԩzکݱtz~ƥ^ڝw9 ZU Q|GC1dȐ1bD\B` F=kS[z"5 @� @� @� @� @� @� @`SAn  @� @�QSc6sxW_ڭV.w߬~Ѷm[r3`9_k@AAAW@ӦM+o @� @� @� @� @� @� @�5[@d^'@� @� @ڷo{lRw_~e;6^zx㮻+VDϞ=cРAqAe++޽{_1& iΜ9%� @� @� @� @� @� @� ^q� @� @�6J`<0~ǫ ,QFe=\|Ѽy8CoYfm8yS߾}cԩ1F6J 3EEE 7JM @� @� @� @� @� @� @@e 0> @� @�^aÆ1xcĉ1s̸馛b-Çgav{Wxٹ\�IAi{7s5XK ޮ]B� @� @� @� @� @� @�  *� @� @�j%vZ<1o޼xGk׮ӟ4:u /.]ZinժUl61nܸJ'PXXjՊmۮ  @� @� @� @� @� @� @�9+ 2gFa @� @�w}w̙3'D ~i&N?V)}Y)&hݺult @� @� @� @� @� @� @�sK  @� @�j@ݺu㨣G}4RUW]z; DZjl@~o].'@� @� @� @� @� @� @�䆀 XU @� @� @`-֭[xwb̘1ѢEw;wo1.]%AΙ3'O^@, ΋k6ޘ0aB4i$2" @� @� @� @� @� @� @@. ɥbB� @� @�_o"O>$n馸K㗿e\pqYgEF~S9ӧOl+DNʡG]p6m?uԉXbEemVѠAz뭣cǎqE7|w @� @� @� @� @� @� @�6@fP @� @� ;wn! ?bm뮻./_ =~k#A˥_( {FZbʕs^Y<%Kwbرѻw>  @� @� @� @� @� @� @�9+ 2gFa @� @�(]uqƴi3ό+"z=P7lѽ;^yM6MQF;Nb83UV:'  @� @� @� @� @� @� @� 2VA  @� @�-ZƔ)Sb=c9&6o0`@L4)ϟ_ mV /p}'@� @� @� @� @� @� @�䔀 ȜZ @� @� @`:t{orӧOr)ؿW_}u sr{cŊ" ;v, @� @� @� @� @� @� @�\k+ @� @�l@߾}#692~޽{<ۿnk޼y#^~M6E AoK_|N;N� @� @� @� @� @� @�9A9$ "@� @� @ wq1iҤ|s1ot ^ziw#Mz뭣SN_N:qae_;� @� @� @� @� @� @� @ GA(� @� @�"ФIg7x#vi=zFucѢEuHkn+W.lC  @� @� @� @� @� @� @�9/ 2H @� @�x;cYhުU6/^ؠ\L<gXzuIk׎to߾% @� @� @� @� @� @� @� ȪJj$@� @� @&4m4F~{\1hР3gN{lѢE.ϖ(o{ hz嗗0#@� @� @� @� @� @� @�T '6� @� @�rCOcӣo߾1a„2v, +Bk׮Ѽy뼼իWF� @� @� @� @� @� @�j ڊ� @� @� .ĸqK.ѿxG~z}7jժW/"' @� @� @� @� @� @� @AV8 @� @� [-ZѣGlj'G}t [ne<sx T(:wGydE _ @� @� @� @� @� @� @@ ԩuN� @� @�9)PNۢCQXXW_}zk_~1jԨ뜨W/2⋬-Y$.]şiʕ+cժUkҖN[v3Έڵkm֠At{lܸqֶj @� @� @� @� @� @� P +� @� @�]K/4 ;ӳoq2$ L})V}R`ٳ6o޼;wnI?~`Eŋh()|pܘt`c-25j)q̙kGJX" \7t8Lkժ 6&MDͣYfYKjժl2ڴi4 @� @� @� @� @� @� @`CAn  @� @� PN>,\Nq뭷F [wKAÇ^{- i߫@ v>}z̘1# SLY/bԫW/ BL!5m4va,81BO 4( LM0!z]W_e .Rߎ0e˖5nƍ@ȶmF#???L;vN:e^k  @� @� @� @� @� @� PAG�� @� @�"u֍c=6j׮rX~ڵk<䓂 ;V\qL:5>裒O>$ \xqI͚5+ 0nbYa6mJ>[jT;JNAƍRxܹsٳg|fA'N>,XP2DÆ @Ν;ǶnCş]t:uUM  @� @� @� @� @� @� PCЦI� @� @�o8#bȑYd kvː!C kkؼ˖-ɓ'ǻ^1eʔ,qŊY1M6Svԩ35B1SRj)W_;.\ݞ)S(;ݺu={Ǝ;ݻwz!#@� @� @� @� @� @� @� *xJ'@� @� @@y uQq]wI'͛7#F5D 3f̈;uΗ3gNo}`UVE:uk׮ѣG8#P,gkXqUy})`3GjmϏ> Lᝩ=qʕ+vٚ.ڮ֭[֝c @� @� @� @� @� @� @@YL @� @�hO<1,X~t!N8ᄒ![mU<qgS~˖-7|3^7n\?}lvE^裏w9z?֭[ S =#kk|,ދ'F 曣0SNG߾}{~z> @� @� @� @� @� @� PAVER" @� @�63f̈O>9R9xAӢ|/ /Jo[grJ'k[.Qui|9sK_}Ywm{ウwtѸq @� @� @� @� @� @� @�) 27EU @� @�tӧ1ƍ.]d5}qܹsUV^gU+`ʕ_xg⭷ފիWG=b}s9's6?@ �Moq;6^}5jTpȼݻw 4({Gԩ㯂| @� @� @� @� @� @� @�\re%A� @� @�UVu]{G5j( [n<qiXչY… 㩧Gy$F-]Ɓ#F [lū*'R0kjÆ 7o^Ks<M4:({SdӦMsr."@� @� @� @� @� @� @�5M M|  @� @� @ 4 ̙'|rvcÆ p|+S<xpj*N=ꫯ◿e|'o~8ꨣBd |@yJRzҳ}ٳ,g2=6 @� @� @� @� @� @� @AV  @� @� P%:vӟn)裏{N:+jժxꩧcs'[-JB%el!M2e`+Fl[,)kfcHYT*:?S}xܝs_Z13=zE=jժw}=;bm]W tyLg/YLg2tFӳtf @� @� @� @� @� @� @` \f#@� @� @@8_~ѫW5jTr!QDx ~{SN.,fرc̝;7ӦM/Rpf{ZX%tLg1t6Mg5tvV @� @� @� @� @� @� @�# r8� @� @�^ .?vJ6m f&LݻGZoN;-&MÆ Ν;o6K ҙLg3tVәMg7tәV @� @� @� @� @� @� @�u+ r� @� @�EFDqwnj3⬳Ίc9&{oWu#'N;.6l~ 4(>ݻwl:v6@:̦p:LθB� @� @� @� @� @� @�Aը @� @�()8n… B qɽ.kS?S\pѠA'#G(Y,3u_ tYNg:tYOg^!@� @� @� @� @� @� @�R 8��@�IDATWJ_O @� @� @ vaq 'Yg۷A= ><5j; kݺuػMtS d:鬧3ξB� @� @� @� @� @� @�䟀 4 @� @�u]JiӦѣ?.{_pa/ZjmڴcQGUdkc@:鬧3~ ߂B� @� @� @� @� @� @� ȵ74 @� @�@*U[n{.U{o4_裏k6 B zf͊fA~UV]okM:5\]gy&9眨W*!ѷohҤI\r%y|cm̫,7鬧y:7~ 7 @� @� @� @� @� @� @�k' r&@� @� @@8CSN`뮻kQH:co1":vX(7s'ӧ5 /Ŀ={zw]O_|?<J(JS@Ώ>(ƌXxg}'Nt-,%Hc= {N @� @� @� @� @� @�(: λ @� @�w믿>~嗘4iR<3}u9_瞋vi]Nc׬Y3w 6qW6X O_YBTRy~UK-O\YgAzK=+7~ )36 @� @� @� @� @� @� @`A @� @�([mU\zQDHE;67|s \Կtҋ~]/^,Y2guAڵWg6ADm߈B� @� @� @� @� @� @�5C/ @� @�(=z-2}٘:ujW^M4c=vsΉ?ѥKlqGO͛Æ ?<&N{nm6&OVk4iR\tEѮ]ԩS65*N9oO{nyO=Tt-ڴi̫<c4O޽cƌ٣ ƈ#SO &ĠA}sϟ??~㏏z+7dv}WW^Ѳeh߾}<=_//bs1>D2oEO6-:tUJ P۷ovmYӵ7~7 @� @� @� @� @� @� @�k& r"@� @� @�'Pt#]xᅅe1tH!\uUYߟ-AzxdzC9$RG#>1zZv ,Yd<ѽ{0`@xw}wyqq3<}Qn: nkw={78RpdZkJ B'|r6s=㧟~: p׿Q2$6l馛C=4靥$[h7΂Iԩe~ǹW隂+<)3]֨Q#Rc%gѼyUV\p1eʔ,<sQfѹs˲T6]r=ɹyC� @� @� @� @� @� @� Ȣ&� @� @�PcǎQvx6*go&OK p~[ou4hPl2>,25-'N_~9i&{/?Oq'ƾ<{Yh;3ѨQx[oYHh iLe̘1Y] [g}VZŸq"՝wyqI'emӾy䑸k׮1yh۶m*R}*)3NQL,qwřg:t)˕+zʕ+gs8sbSO=53JLO>&K]Rem8>6o$+ @� @� @� @� @� @� @ _r~?= @� @� @b){.:Şnj֬ |aeZM<ԩN4).䒸1fso>f̘+VUeƍgI_}*{7R8է?fϞm]6V&KG ۝w9W 6SeZ{ a<CiӦgAA˪ߴ8 K L)21}ѨRJ^]SCɒ%cܹYPf�ܔ-[vo].5  @� @� @� @� @� @� @P,"  @� @� Poh޼ytM:r7yhѢEO*U*_YD0`@t%@y1|QjZ2r})]pѸqro,t7x㥞oFYݯ]˔)ӧOw=vuh׮] 6l~+u]YIT>ڷoٳgv~{U/6Rf( @� @� @� @� @� @� @ _~?= @� @� @RgqF<_,TpŎ;w]Xo?~^v3gΌ?>H!<cK7cƌWQ|ldϖZ?pm6wv[4lpƿKgĈѣj3gΜo/J鷑~# Ң7{!@� @� @� @� @� @� @�C@P6 @� @�G5jԈo7>J.͝SYpa d)sA;K;S6=fʛ^>}}_ͮ5ݻw\W_}5;ץi++W]uUftQGeMgϞ]Wonw9}gsUu޼yym]TX1zwsqK97~7 @� @� @� @� @� @� @�k& r"@� @� @�elFq']wݕfaÆqE駟Y~lݻǿԩSW_?N6-k駟..\,)SdO۷o]g֪U+s=o߾q!GM4ik2y.w=SRJ1dȐH{[3]_믳3kss/~mV\RɅg`ʇ~8/pԨQ1tЬ8 W^y%?DŽ "92̙^{mz葅Nl2.EQN}ݳir`ԩy=⋼5o�&8췑~#  @� @� @� @� @� @� f~ljYץ{=~  @@x x( ("[ M駟ŒJ�RXW\)<p˫/l7)wߍK.$ڶmozB{^_~9 bLՋի 7O>dB ˗/M6/29Hᇩ;G͚5W> =3ʔ)|p61cbQb,24%JvYgeu'N Hwy' Lawygy7?}Ql6Yh7/f)1'!GH7|s<3<;CԸ2eF6m"7gώrZve]֭[g9}g]vqUWemStvRcf)2M>=5 cL!tP#{+�';c @� @� @� @� @� @�5(f]չ|pgj @� @Ϟ96N&@@HaN)dk;(@͛7B _ʯ| 6,;v\Aֲ_|`zUY`A̛7/ϟJ֭[7J,t)1]pC>,P0͓%9ʕ[Sf bM6SF5c֬YYhf TRϋBСCc:wߝ]}/Ԉ @� @� @� @� @� @�EStܖ] @� @� @8sύPmF1hРK#O>9,p}֮];o\a^*\zcuʕ^2edիիW_U}W4Ǫd'WJ.铂۵k^5.]dk֬nY!aŊc]wkWnfϞo۷o\xY� @� @� @� @� @� @� Ӟ� @� @�V*pQGE=']}An /8[n1lذ, 2GÆ Wrʭya&矿mn+mS<Yd |c+۶G @� @� @� @� @� @� ^Af @� @� @x TV- N|G }dͥ > .8[nkR`M6)ΥlٲѩSLJ{go߾1f̘ٳgv_CBW F# @� @� @� @� @� @� %q,C @� @� @�<#8"z駟 M Ļ+bܸqQ~h׮]^ǂ p:Lx:B 顰m @� @� @� @� @� @�X )  @� @� P|;,駟.rlMs=1vhܸq}Qn,8oʔ)En6T4YMa3r:l3 @� @� @� @� @� @� @�F@q5* @� @�[l͛7CYz&Mݻ7jՊC9$|;wnݻNt&Lg4tfMg8t @� @� @� @� @� @� @` \F'@� @� @@h׮]<EޠFѧO8qb|Yl8czѥKxGbΜ9E @:{ d:錦tfMgX!@� @� @� @� @� @� @�֏ l @� @�K6m_^R~8書~:*6th߾}r- p錥\:{ d:錦άB� @� @� @� @� @� @�_Al @� @�(V͚56,zb*U '}ڴiqwD /KԩS'~83Gop 3R:Sl3ZŊ`3ΦB� @� @� @� @� @� @�l8nj3 @� @� @@Q(QDn:yիWQrv}͛#GB}߿,X vqhٲeѼy[r~Z1"~a,Y2RQGm۶+JWAN  @� @� @� @� @� @�(h_A{#C� @� @�"&ЪU8묳" `}b̙/Nj/J~/o{Gng5j(bvVE`ԩoѣ7ވQF7|eʔMFv⪫-ZDʕWeHm @� @� @� @� @� @� @� ( r⛚� @� @�A ͙3' s=ÖWk)}'u;wnke;#.l̚5k.kѨQhРAZj\ R�q>w}7ƌN|Wzk׮37onr/E� @� @� @� @� @� @�,_@m<!@� @� @�|HAիWW^y%A4ɕS[o1dȐcQtW^Y(dNGjrC >>,1?χ~&LyERwB?<hҤIQFڅ @� @� @� @� @� @� @�k* rM#@� @� @�Uw}_s9gh �mf\ܹs㣏>?>;vl<'į5RJlv٧nݺ6l}j׮*T 皏gώ/"&N}>Owӳ6hݤΎ;FFqƱ;D U @� @� @� @� @� @� @�) hW"@� @� @@g}ꫯ.Pk*IAM4>e޼yY B SHaTZ5zjk͚5c-XSzXbKΚ5+MSLY3iҤ/믿ɓ'?6Sf:u"?,^z9KW5yXn @� @� @� @� @� @� @@1 ɋM @� @�lHw=N)0VZr)E~,X~쳬~Y _|?~| >< 89sb]Sdjb76,T}6dWT)ʕ+}ʗ/S@9s⧟~>?c̘1#O}w'@Ν;w1ʕ+g>.N>,TvY�dR @� @� @� @� @� @� @� \T= @� @�&MD%7NW}L>͚5[n_7|_}UtM1z8#c֬YǸq?*Ξ=;.\1S@e Lt-SL*Uj4W_>r)ry% *D Zjz[ouQz} r-}1?իW<Ñ&hԨSO� @� @� @� @� @� @�sA�> @� @�և@J~Ya>4Zƺuf#y1~0`@ti.X A9sfO.1w]4qиe6jd@G.+pr}V\9YdmenxG⥗^={.rJ/ \Y  @� @� @� @� @� @� @�% xo%@� @� @h֬Y`xGN:ud^z+쟂7d†ksu<5l2FsO\p1xӧO#ʔ)b& @� @� @� @� @� @� @@ ,Ы8 @� @�(2K{Ef?Eu#k}qGQGZ,ZɾR fnbY�^;C 2dMӇ� @� @� @� @� @� @�( K% @� @�Dw1&O3g,˳&N-Zo= 7ޘTP!.7n\4o<:u_k0. @� @� @� @� @� @� @@QYަ @� @� @� 4j([݇~XWY|6lذhڴi̞=;F]v-ZjŽ#Gݺu*g1 @� @� @� @� @� @� PAe @� @�(nm/_>>Byş8Ccǎ1jԨhذa{#F?^z饨_~/̙Wfz @� @� @� @� @� @� @`} \#@� @� @@1(QD0GS/28馛b٧\roEhE;wcF>}k c…EhB� @� @� @� @� @� @�H@t<#@� @� @�|W^|':Lg&MĴi_nݺ@z@ٲeϏGvN=3^yK @� @� @� @� @� @� @ ,|̊  @� @� Ph֭~i]QX /mƁoF4nܸ(la7_o&l-ZΝ;g}Vb @� @� @� @� @� @� @ \u+-  @� @� @`-A%Zv6mZi&ʸ+娺N;>l<;w^̜9sm֟� @� @� @� @� @� @�( K$ @� @�U9k֬H1bD4i$>Hv]V*СCxꫯo=~߿̟?}5 @� @� @� @� @� @� @� 󮬔� @� @�^N:>B´k&h֬Y[ٵ08tѣG0aBt%<u]g-N J� @� @� @� @� @� @� "zm� @� @�K`_̘1#?_W\qE<cQJ"ۢUxnݺ.:tcǎ-Z @� @� @� @� @� @� P A×n @� @�Pe˖M74 b3onm ><իW(Q쿨l~1t'Ov)<� @� @� @� @� @� @�;A0 @� @�6@͚5AWp^{ӧO*Zhg4hժU[q-?Ջ믿>~u=  @� @� @� @� @� @� @�|Ϡ#@� @� @� /rō<]#~)urJԯ_?6l'xS(Ydt=>8 .FСC b� @� @� @� @� @� @�X x@� @� @�B`-)SǏ+bرYP` T@J/qfVZŘ1cF� @� @� @� @� @� @�QX"@� @� @@Al++zGbv2e[oFڵkG.] ~,zfW_9sD <餓V @� @� @� @� @� @� @` `&&@� @� @@V |z͋s=7<ڵk+F]ww^.]:f2LAh޼yk1pxb/<~駂lk#@� @� @� @� @� @� @�V@d}6N� @� @� #馛 :ZjrKs=ٵlٲ-WݺuˇY QXJ(;6?+aÆ1xXpaaنu @� @� @� @� @� @� @�b! Xf$@� @� @@HA3gΌyEKѴiӘ2eJ92=lӦMn-zeʔ)d(W\;ƏtPv67oZ~ o  @� @� @� @� @� @� @ A! @� @� @`U .ӧz'-,o7x#vig]w]TX1N9唼:7S`-;#|(_|ҥK8qbk @� @� @� @� @� @� PAa) @� @�()0Yf~!CDʕO7|s}Q\z7[`]w>{,aÆѻwHI!@� @� @� @� @� @� @�6 nV @� @�[A?mW^q.5 7J38cg*t19+ ,C� @� @� @� @� @� @�gAt @� @�( W{Fߎ-[.5YGyQR 6h8c„ >N;hڴi< @� @� @� @� @� @� @�( r=b� @� @�"A)7o^ץK8餓^-ro_⬳ZstMg{V[Ł;v?xf  @� @� @� @� @� @� @�u$ r� @� @�-PBٳ@m|qm1k֬w}SNɮϤΝ]w]viQZ�c=6; {ve-6G^,kܳ%K]|6mZ?:t\s }.\Z븫3XÆ w<3駟Fƍ~auYit_}ե\}q,V[Q:B� @� @� @� @� @� @� B,� @� @�EEL2V~嗢|/M6o&F]tocĈQj:lذoӧ9眳JHcym駘3gN=e˖͑x7&7l}|Sb| /d)|t{Ř1c"oҺul)3֫W/nᆘ7o^.+w?裥Mxw^>W~u� @� @� @� @� @� @�AEY& @� @�FmkQR%j*kx7qynV;cz뭙W_ݻw7<n85k\fܳ-Zͱ̆˨]ƣXѳ~eϗ5RϚ4h N?5`JG E,YruMZϩ)?Tzϩ,y/}y,Z~y @� @� @� @� @� @� @�B&ea!\ @� @�X{AΙ3'>8쳣_~#DʕkT|QFԪU+?3<]w]L2% [ ԩS'cYM}?_Vӥ=KmW|V .^x!.\,RJ^g:wW]uUP;![{o^ttSxgJ[^n @� @� @� @� @� @� @@!Y^ @� @� @( _~(le0a„k駟z*Ra%9n Lzcef}w\^o+b̘1qiEVbyȫXfgi78nEZDL81.m۶# sLk[VYt5yh#GƟ8蠃Nx qK!tIѻwgdܭ[hӦb.iӢO>ѡCҥK>r͛Æ ?<38s#=͑'x&:*k͆x#̞͝;7~xᇳvM&M.(ڵk:u4Ϣ֟g̘|O_~9OM4SO=5NVs,,#8bq[V:B� @� @� @� @� @� @� B,� @� @�EE AEe;k,G2e"8nzc*Ud~s9'ƙg_㦛n"gϞov8z] b=X<>K@佫>Zh^xaVG;cѾKgʞƻ[e˖ѬY;F?!:w5رc6VB"=\3 5jT񑮩|gѼy,T3JN2% cLO%=C"1;wixײfm8S{?|wc6-\0#qGGɒ%'ݻgι}q'g)s=B%smfF?zŕW^?M;ùΟ|I],n~ @� @� @� @� @� @� @0 ,o͚  @� @� PJ(Qwv_`A\tEYPa |W�ڧOI 4iRvdw1WZ5FsO\qKsRNڵkvK>Ka)qСYVZec/3gΌ4~)rɾgʞ6f}8s1Yc \ꪫbz(,RJW ^L!FezkG5Iϩ{w<=ș4( Lu)1;kSN9%UK/]8[;6Nե֙BWw}w4m4{cĉ/Gҥ6mdkI_ƌ)}' Lcܸqy=7N~_͕.hذa<=U3GE7l\U,n~y @� @� @� @� @� @� @�B( 4K&@� @� @@aH|5 rq!ĕW^rKq+}?Ra+W.UVTP!O /{M4EYf;uog\f|rkcܹ^{-6F۶m<H^VƍdHOeɑBS!C�xivm+VMms{?òqR4^ w,UTڥ:o޼x衇&lYlټtSv,3ᆲͽϏ?<o)82qƌ/_> 0M-[?Y(QxҞ-˪[{ @� @� @� @� @� @� PA7h @� @�(5wBy>|xzk.Ha?|L0a㤀µ)iΑ R\qWgMS>ӧɺw}ۏ?8WJ!Kڧ۷ox7ogK=8v��@�IDATo|/f}d);I)qE%X0 b߿l1tЬK _\r:?l^zh|V[]wG0S81&MZx \Vj 1 @� @� @� @� @� @�( KD @� @�5W}͛7:|s=׈੧;>Xb_ZVcUQd٬+XJoWW/_>k ,s̉of꥾tӻꪫK/;.>øklٲYR?~Pڵkט9sfYgZc!,}ْU{fͲ@Ӈz(^{hРA\x1{UG4F ̕e垹 @� @� @� @� @� @� @�" I @� @� @@!HyWR͛={̂N9x -\*|ˣm۶Y^ LAwyg/{9VeUen5>|bx{]ӹJ}Uvmj@÷~;ۂ 0/"ny7l6que~xzY^zE \YIsNԨQ# wqG5<c뮻fS�Ajwy+z>?#㣏>~ 7׏+[&~G#Xɲk  @� @� @� @� @� @�( K @� @�6ҷFezN[믏ҥK8/R+ѧO\U6Ɛ!Cbʔ)Y3O81V&6mZO?]a֪otPySX`<Sfş笪f͚YPb Q0`@|1iҤYL<9K2eD=�ɖ-[_:h"ԩ{vE{/YdBFž+W.]dc,̙3M>y}}'RJ{~zk~Yh:W$x9~رct=sKgvYヒ,fʲr\  @� @� @� @� @� @� @@QYަ @� @� @Y^!Y-sѬYH!2�Ww/<RPa ̕]w5sϸcVgj7K)qRT%㪫O<1{B:up%;ʸKYz(?1ݺuBGÇUf;w%JN;->,2g0lذ_/?YI'gώ~Ź7K.$,X^x!ڥ%K[nܳ[B\Uv&~ǻロ}of)Hr3<3giOni<ӑ.{liwyglVycoի7N?8O[? 4>˪=s%@� @� @� @� @� @� @�EIJ~m̯C� z|(sm[2?&гgz4 @HA}& XRHgp@ <8/pmS>t U֪4wk׎:u,o6J,ժU[*f͚&L.*UK=Osofy%7dݤ>A~YdǢ%~C)t2] ry'Pd-UTqŜ9sI&y_V]C7 _\(^E @� @� @� @� @� @��`X% @� @� @@_ -[m4c|q9Ŀ| LP_~yYB uH6thٲ2C Sĸ&!oŊc]w]+KU LSc2e\rQ^{n5?g)@5k.y,>nl@ 4X,2) @� @� @� @� @� @� @( ,o՞ @� @� P~lu)(*<xp 2$ nL~Q}x'w11WyG:|puYQvx':LF� @� @� @� @� @� @� @ Ԃ @� @� @�/0wloq_.pĈѬYcԨQqᇯjUjwW… C%J×i2yCEzk^{LTy=͋: \}p iKB� @� @� @� @� @� @�H҉� @� @�Y+V\ V[n%:h׮] 80*W L;w#<2_-K-~֝gϥo}O[~w}wL81:윯ӤIn @� @� @� @� @� @� @@aYXߜu @� @� @ +UTHweqǝw)o߾QD|S#q ӀnWONiֺ{dU{wG>}GQLڪ @� @� @� @� @� @� @�EEdQو} @� @� @@5kVЊ+/c'O-ZĐ!C /p@.cjU@ɒ%[ng鷴;d"Q!@� @� @� @� @� @� @�\- @� @�{9|h֬Y̞=;F:tXhf P*T\rI7.7o:u/|"s#@� @� @� @� @� @� @�( 8u{&@� @� @+VWfSxqƾzlk6^,SVZqȑ#cGn⫯Zf{ @� @� @� @� @� @� @0 ,o͚  @� @� P~ᇨTR*UbܹYYg_|q<Q, {=#FKQ~ׯ_̙3� @� @� @� @� @� @� @�/ C; @� @� @@HAժU+4k4iRh"O<Dc>ҿ?)tBҫҤ"MCdqXD@tT&J/H!ͳ=$&߽{.Ϲ,~#...N:3 tY|}}eرG<==e޼yâ � � � � � � � � � � � � �)\ �> � � � � nr -[HժUѣG{niѢEbs)^ M42rH9y4o\z-իW?3�� � � � � � � � � � � � � A:k@�@�@�@�@in߾-YfuWҨQ#SرCJ(}$gܹsˌ3GdbΝ;ٳg � � � � � � � � � � � � @2pOcbH � � � � �"0k,?*TH/CIڴiҥK'OqsssO<ܹse„ 2zhqqqq>&άZ%re;}=޶H6a- ~zYz1Bʔ)#3F2eʔ! � � � � � � � � � � � � S�@�@�@�@�@�(ZlڴI\]]]$ t@&`1[l'N([N+"'NYZhIdJH~hȚV`߾}$a-e jJ5k&_|G2gگ_? MY3h@�@�@�@�@�@�@�@�@�@�@�@�@�k@�@�@�@�@�Ff͚&M >}j Z Iy?~\j׮mN֭[jժٽ{7!I2 "ի,@6 kZJЀ!CȩS[n2x`X_>e0z@�@�@�@�@�@�@�@�@�@�@�@�@� ҡ!� � � � �-.]:PB ~[fu y믿 JZdǎRdɄlK$U/sz K@ra)V4iDZj%%@�@�@�@�@�@�@�@�@�@�@�@�@�p f* � � � � <4`1uԑ.88X Xzܽ{7j>}*A| +V` t*Y9@xRJʕ+eÆ '/ <Xn޼0ϟ?/ s/ � � � � � � � � � � � � �$�A %K � � � � �FvڢTRI^$_|ׯKݥs+WHzdҥ&8N ]\\\×([VLsz 4h oF-[&%JooшFG!}GV%@�@�@�@�@�@�@�@�@�@�@�@�@��Av"@�@�@�@�@�42 #Gt6L<x ;VۥJ*rmٹsnv!л}cz@tү_?9qℼ[2zh2EjXlvO@�@�@�@�@�@�@�@�@�@�@�@�@� iwR*D�@�@�@�@�--[6)QDC{H+"%K|=l޼Yϟ/&mɲtR9sԯ_AڵKJ.m*\cz@L<<<dҤIk{ {lРHpp 4H'OHƍ/s � � � � � � � � � � � � � 2d܀� � � � � [FIT7f̘0ӧү_?qu w._VZ%2eWcgBDjqqsb+PpaYpl۶M>|hB!6l(3Z޺u˄AǶ G�@�@�@�@�@�@�@�@�@�@�@�@�@ Faln"@�@�@�@�@�b'PvmGUT:d/9{WȑC}ݐP a⋣)!a(GVZ}v5kڵwN:%m۶gϞŧ)E�@�@�@�@�@�@�@�@�@�@�@�@�@ BP}2D�@�@�@�@�@ uԑ`[=6vXw{~8}L0Hm#00Pܹ#J`J{O]IBէ hŋaMVںu:@�@�@�@�@�@�@�@�@�@�@�@�@� i7J*B�@�@�@�@�LPB;wnsMT"׏x7" v*ՀKnb9s4h d̦ \rE&Mda#Kcϟ/Ǐ#� � � � � � � � � � � � � ' M � � � � �x7.EƍE*_es�=Eg 5jT m'88X&L fͲGԁ� � � � � � � � � � � � �  � � � � � (3j%K֭[۽ͻwʠALddJʜ>L<Y4ډ馟)WСC2w\Wnݺ6 � � � � � � � � � � � � �w@�@�@�@�@�Jrx.]$n=ѣG3ym K%SݼySʕ+'Yf5[l>GR@)T,XliӦka΍5J4 2888qm_3gNիC*T$@PP\rŬ!k=]z5ҵsɓpki`\=Z&Mɜ9XkΝ۬k-͛׶~/Ɂfg9s;K!{Wڅ$n߾Wv=<x๽'?~,6u[р�'}~o:zwss3:^)kt6{ 2fh>C2ed  � � � � � � � � � � � � A>o@�@�@�@�@ h؉'ѣr1ϧN2af7jXcMxcMiX{ 1 aM&M$�5R۹v gP4ʕK<==lٲf+SxyyI|K~׮]2m4[cΝ;k&# 0Z|�#GYK4QCh8]<y<󬟳db\  5u[(G._, 5OC!uZ4[mwΝ;EC!:$kJWիW7zi�6FV48 JQm֚_i^5t0dtzmD!|Yani}}K6"* V+Wk} c � � � � � � � � � � � � �U : @�@�@�@�Bi|a^UHtָqcڨz 4ŧԯ__J.eׯ_/ܹs`˗ˍ7̽y5jjժ2d~fi[^e˖&h-9g Gk^D5NC4QC{-%J# pƘ<:SҤ[LKlkIF5r2uTjE!{ $.^rńW�Zk>Qרj3tԩhPja L)kI?4R1ow تn߷oh5\2tgS!8wfo_C<@�@�@�@�@�@�@�@�@�@�@�@�p6-KgE�@�@�@�@� h0ƍM޺uDCBu]UfB5/Jt!nΜ9Vr纡a]v2ozhAaÆ=ggϞ]CaUT ?~i1{4ib_.\l@?+NגX.ZeɒŬ BmҤ-Z4|w k׮ հ[khVa9rn آ>}zMq)iBY:Ǐg*װN ,6=Y^ � � � � � � � � � � � � @B ԍ� � � � �$+WdtRٶm ΪXtA5j$5k֔3&acߴ5hlzӧOO?5]6m*עE ܹ4kLҤC`컗lػwYG4DT֭+ƍ3sQ\9 ԀbŊcǎföÇ`%JgSN&2NLEuvig=C[5Q?5^2V0`|LcB:‡X \]5Vu}lڴɄLŋ%K4ѵy@�@�@�@�@�@�@�@�@�@�@�@�@A[@�@�@�@�@�$ ȢE?4W-[ٳ'atԩe̘1a*_~ń`oބDiFz!M4 D/pq3g,YDΜ9#E1[Zj'aq*T0СCMŋ˔)SLp[<==|,?}v5ѣO7 ||韇 ?}^ץ?FcOct@U ԭJ*a/_6aϟ70 Եzj"7P}u+SxyyM) � � � � � � � � � � � � @B {UwM ;@�@�d"0lR,vd"0@�6lXݛsO#G�ݻWM& . �N:If$mڴaMI_4lŊ&Eo!ʕ+%QhϞ=ѬM6nݺIǎjժ1#^gYlrEyeҮ];I*UrvK|||v!}rww7WT)Χ{xfd:Rd>'Oʉ'L5رcr}c;wniVXQʖ-͊ϋ4 � � � � � � � � � � � �_ H � @AFI@itک sk׮'ʎ;\r&^,Y<wmJ?_3f̐s皠ݻѣD)F<x |?ׯK˖-Zj޼x�V/fə3 >܄BfȐ!|p޽[4HSZ{qqq"E/_iȞ>N;D@P4ѣf;xߟ<yb֦TVl`J�A@�@�@�@�@�@�@�@�@�@�@�@�b&@d̜ @�HAةg L@ EZJ&L`BZh!Fڵkw? '|"gϞnݺرcM�]|v߿/SN5=СC%6$K[M&ҥ3 3&IgϞwҶmڮ\"nnn!UT1[ʕ^2##�9~5{IM(/(֖-[՛/"29*cB�@�@�@�@�@�@�@�@�@�@�@�H B:@�@�d$@d2L� 2@�'سg&dC2zhT1(K,I&7|ӄk�`5k3F4sȐ!;Hcr7oޔ/BKI6YS8Hb]}v)7o6_%>4A5kk�H ʤ =+;vm=^|y_^~eɜ9srzc!2JN"� � � � � � � � � � � � ` F@�@�Hc s@ ܿ߄> UꫯF)"F$3f̐cNJ|gңGh1<rτȑ1:佸q ל9sy>[rQ]V~7ٰaܽ{WJ,)Փ:uHݺuH"ao)D_4?0ݻEc4I&ҼysZj%2,v� � � � � � � � � � � � ox@ � � � � � *}vP,\P4`nΝ@Q\  'O! V={:͛7JWlB.5HT?k@ӅH͍ZڪZ{{{k%k:tL0`&2mڴflϟ'N^Cd-:@LLɓM [dʕRZ5YxT^]o~s~yt � � � � � � � � � � � � @ 4� � � � �N/zI2eҧOqqq]%\#YԩSeӦMgzwKeȑʕ+;zj8S9uL8Q|di֬Y;W^ QBiXDȘ1l҄9rDΞ=+GsI۶m%O<ҿٸq&*,!� � � � � � � � � � � � L@�@�@�@�@ [o%C?X~gɝ;wH7/KuʪU1Ԯ][v%7o6a@v޲e9йpc7oԯ__J,iu&&vҤI/ Ǒg9@"EdРA믿~greiڴ+VL&L /^t!7@�@�@�@�@�@�@�@�@�@�@�@��NT� � � � �K@C {)s̑Q}qqqWlٲɚ5kW^+ŋcp]ryf= H $ 9qr;v,XP}]X۷O:$cƌOOOG2Afj~cҥK;ȲeL d.]dN?F� � � � � � � � � � � � �  g@�@�@�@�@�$x뭷䧟~kJ6m4*&_ :Tz!SܸqC7n,Yd͛7KɩjsssrM˗eRhQOM .*Ur> R@\Leƍ&N:ҠAٺukJ ` � � � � � � � � � � � �8 Sܔ3`@�@�@�@�pdJfΜ)/;rWSL4^Ν;ɓ'b܁ҩS'ѽXf˖);sssұcGO>|Pƍ'ŋYr۷Oz-iӦMn.h�EĉRT)iذjJN: � � � � � � � � � � � �$# d2@�@�@�@�pn#GȈ#dĉ&ɹGz?m4)St5Ib:eٹs㏒+Wu ,sssseӦMRlYYd ݺu4m4)B @bD{=*iҤ///4iSE1,N!� � � � � � � � � � � �  � � � � �8r2rHQv_F-5k4?<z(N˲edԩSܹs_Ƿܹs&Lt„ R|mY*߸qmV*U$F2jQ]SeQ]s:':7sXE4vXi֬C8 mڴIi .]dw-[{2}t.ݓٳg>}E,%J08_\v-)D � � � � � � � � � � � � ` H � � � � @|֭['[n/B\]OٱcGYx/^\o.ݻw0qʕ&SNgϞNE{zzeҤIHK(P@}ݤCJs6mZOFAooo9sFvI\%F 0v3f}hiҤISL w}:O֬Y#k׮47|-ٴi1-vڐ>'۷7tY  Ǐs?yc֭GL@ӧY=u!� � � � � � � � � � � � @" @�@�@�@�@�N* 6իGt:[hԯ__N<) ,0W2}0afAAA:uD 1bhٲerNܹ#?h?+ v2eh`ڏ?hEx ̟??BȨQ"<g:7:G:W:g ]4n˖-KR\6l?nw}1}WoL```zB }뭷n2Vm|ܸq'Nʕ+�ٷ~|ֿT3gNY~xyyIӦM{@�@�@�@�@�@�@�@�@�@�@�@�@ LB|F�@�@�@�@�T!S={ xxxѣ`RV-)R؜|ͥlٲc !wҤIY|yB6׮]+~صk8בnz q+PmX]t1-j;f}xCC 9ҹ9KȲdRJ%dS)KnbMZڻEu:VYWT eJ޼ye˖g>O6v,?JʄO>5z̴� � � � � � � � � � � � @r 29*cB�@�@�@�@�صk<}T5j`駟w&4q̘1r]Ӗѭ^Zڷo/@6bi֬'NO?U/c-;v4YF˗/U:K/WDqWyںuk4V_ժUL2Θ]~u;vjʄM믶#sE֒֡H>ϟ_*V.UTM9_{=ׯ9{9ҹ?]`gsRjUqGpE?~y'uɼ{_2|i۶>}Z>Cy饗D9x`o۶Yz̼iإUkd 8P4h ͳ.~Ŋfkomމڿ:uȵkD߱޽{m1ct̳s}s.gEBdŤj0)SL} P;۫j Ow=C J\j9ߺukYhQӱM0DNb3֘tNoܸ!^^^�bOCd3gl[uIFOn!uS@�@�@�@�@�@�@�@�@�@�@�@�@ܝ@�@�@�@�H^'N0ASK}&pҤIr1y뭷L_~?v/\ 7o4}a[K6AY_{5Ѡ9snۺu&ӦM3֫WՐ4 ֊i ŋ"E%uѠ0uҠY&uw´Id栝={V7nlZhaDCth�^ds޳gO[pf5k!}Q'O;i} ZfرCo.Eג> U?sy֫! 6_~ń*vՄJ5 СCRfMqww7wz+Z_Rn]5kmذa&ѣ}~sՅ JJD=lbiӢU L!0AZB ju<jjժ%ݓsFt%bL5TS,?.}tI5dΝƭL2ҡC;`�ߤIymN<ټ^+5@իP+wu4q)իW[nEN-!IK޼y2W\f\" ||R5UlYlh-@�@�@�@�@�@�@�@�@�@�@�@�K rt[@�@�@�@�@ Yܽ{7}||D͛' 40`zlpE 2 06 ,oÇٳ^0Ι3GܹcBƞ>}iHm\i'6uZ+Qъ)K, -˛oit]i;vG6oӵZ]v4hcND CmwkݠATRَ'\G"JJĪϛpP xҴiS[_|ajP7jdʔ)zʄGwPԩECI賱n��@�IDATKEW ?O{406EP777I6{Iss˛4 Q=#u?:(%gEgnQj裇Y GEZpˈ o dҥǛpˈoίG4W=DNP5ׯK4$3|]v-$AS@�@�@�@�@�@�@�@�@�@�@�@�@\@�@�@�@�H^,a Q4Nڷo/UV5h/^@/_>tvLؙ^gq i>(P@//y3uԑ 2iZdGɥKRX1p|15JMh?~lnݻwO~GY|m 8Ь3ڌl#:s1YKֽסؔ%K0ȑ#ͭcƌ�YC5NC\%:ʖ- ٻyfb+ڶ4 Q5Dt{ .ݧ-C Q բ5VawiBŋu'Vx_ͻIY YܸqC*U$V2oVi+m9rj_nY:czGgƶ+mڴ1bm)W???VcNHfΜCB×gϞChEץ>@�@�@�@�@�@�@�@�@�@�@�@�p> o1 � � � �$3 `}dǏL2ɞ={l۱cԩS{4Q[SCsֵRF ĉfo]^˗//|СCמ9sƄ̙uǷB]K?{kN?:ڿYGz 3l#:ӵѽqɓ'KZLӧeŊo7 ?i_5IssPzA?SB5z5p֬Y'O>}hPʕ+pss]ԩE?WVMfΜ)͛7~=wQ.]wr9i۶4k!rO?T֭k |ht:|} .&36_z%sQ]9}&$XPbS֬Yz .)_zUo. 6Ln6 � � � � � � � � � � � �Q 8q � � � � `/Um۶٫J[=ӧ@ٳE]ð4OΟ?ss^_ԩcUol믿RJqm{^Ҏ;$0006E{#-w~ڇŶ$ZP@]=2o?,Xlk֬1ѐK=v/uttdȐA( MLvb[f͚r֭yGK6niU:AAA&4R/Zl dׯ|>h1Ҋp" @fϞ--2kfݺuҩS05YuY4HTǤcؔ侘ƶΨ05^%kRLh gϞ]zyykvgԨQRhQiݺ"@�@�@�@�@�@�@�@�@�@�@�@�H< Ϛ@�@�@�@�@� ( *TKFx>>+Vhn3f 5̪?sߞ={$]taNˮ]DڴicVӧOeʕҲe˸Uwin޼e^\Pxqɘ1YU|={ .؎CR 1ujYk{Ȑ!X޽c:_:W Ə/ڧ~h%W\&h3!?S۴i9gyM2vGZG\OuA۲eܺu˼'Oت_b lܸd˖ŤoVXclG!:SW5*ݻ!y}*:%JsFumLFׇyJvL8εUtu.4ӑeNlCFi@�@�@�@�@�@�@�@�@�@�@�@�,@dJ}Ǝ� � � � �#зo_voaB/_.M4iӦ[oeBἽM[VgΜ vd?3~W_Ǐ=ϟ___5jd͚5z4ɗqƉmݺՄ=zH>y套^z.+P,\Є+!sݥJ:u_|:"Q4Qի'~:ж-*ժU3Ef";ٽ3SNu_E=aVgΜD?,2d_~E:$۷l.u/^؄+ Vcg{ժU> Q3g.]Z] 1;v,[LFik`Za~C=EcStO:ܢ5j///ɒ%˗_vhL2c-ѣe߾}&4sٺ5*SW(58p֬YrQU}X`97ĉMsWK*Ν;':ŋk_4|5>&>c5D Lvuu55֥|kӠAdRvmG@�@�@�@�@�@�@�@�@�@�@�@�@�X K0.G�@�@�@�@�B_~&KYg. +ee 7o^ڵlڴ4k_|޲etRA`$6l0iԨ?^4H+(((zM1G@@̝;W֭+%K-Zkdpx? iܹsgÇfPY@xחPh0ޚ5kdvmBצ 裏dĈR\90aBsZn-Ec2iʁw1π-]*T(&U$5:7\%F)\رC.]dBݛFن+2x`:tPܹs{4lVC4�2M4fMJ\ܹsˌ36o<)Ryiu.�m۶|`i!ƴhW^1πjXlY)_iLhƍM=j𮇇 gdD]ODŴQy9rDʔ)#ӧ7ߗ7|Ӽ7&O,9s47n0.]V\jƍXc7_C&mѺѽb;V뾨:uJ*IfDt:wI]n߾-ݻw7+VI'G�@�@�@�@�@�@�@�@�@�@�@�@� N-Y8@�@�W`ذY΋A@�d$]޼ߓќ2H7!,O6A`Ŋ3֯A\ǎ{ 2ķ0߹sG<ybB!kȐ!&Ѕ鬃}i۶=zT/3fk44ԩSRxqpgr-i͛7%]t)S&{t7^ui&fy葼{2}tE L  yypJ}'~[je\"9sfPٳgj:ε=ǏECE/_,S9r^sy{JB}P<1:SAٲe s.k֬fVu1꽉fz'gx\RtFv^K͟?+xzzFviϋ| � � � � � � � � � � � � $E7@�@� 2iHX ֗@�tQm&{|ŧ*ڵkҼyh5bڵk%ꫯ… >1ێK[WbEWh]\\RkIt"[lɛ7okج^zՄAa ʕ+Ae M8Q~( 4Q4)38:aTa3f ]7n;-I~ $:� � � � � � � � � � � � $7n"� � � � �䥗^f͚Yګ$'s2rhQjhI 4`W^A E,Y"M4Çg} ݎqu-\\R֭[d!/E7&M2ۻ+odϞ=P޼yT}ҥ t5ԲeK)]tҥ|BtGG7 ??&_8p@4U@R#� � � � � � � � � � � �  {swK) � �D`ذYDa �-AV޼ߝ{=$c/JݺuE40.W\x=4o߾kN͛'p[ttU d~]\\]M=tP:u,\P:uƨOٳ8tB1ߞi�^߾}e +W!C V{C]8ϙ3Gf̘!Y;bw#^) '@�@�@�@�@�@�@�@�@�@�@�@�#\c5L� � � � �$O ʖ-[ѣGRF 9|pJøZl)CRΝt!ʫ-iӦq<|Փ_\א΁΅#@vԩ7ߔcǎɊ+֭[&dɒ2a9qDM|ru}lذS&ZhDs lذ)RD{'}Ӆ@&2!� � � � � � � � � � � � A:y@�@�@�@�H m۶`( Pn\<>}Ȁ>ٳg9kر_ބV^]=Cq~k΁΅i޼ZJ.^(}K/_ބB8p %K M6ۤSNZh!r2J۷ˡCdȐ!ᑘ]-@�@�@�@�@�@�@�@�@�@�@�@�H �&@�@�@�@�@�dϞ݄ 4vA\[&WBYzƍǚ:uȾ}L^*UO?�d2ڪZk8Kɛ79҄>|XڵkgB!+V( 7|S~'{ ~"d>А?PU&3W<yL7&46:I � � � � � � � � � � � � A&:9 "� � � � �1pww)SȆ G<==_<}4pe/^W_}Uׯ/^^^&�EL(P@4R-uݙ}US\흵0aL>}Z &gΜ1ϋ֬YSƎ+֭;07v _|!m۶}N^|EY|իWe֬YҬY3y  � � � � � � � � � � � �< Sޜ3b@�@�@�@�pB :| 4̕+WN,Y"8E۷eRtiٱc,[LV\)y{|5J<( ƍKwStMMRMV'RX1:t_^nݺ%?ԪUKV^mf*իW7a~pBr:@ R<i$�a}*WlB3f(\tɄjsڵՕ? � � � � � � � � � � � �Q h� � � � �/.]:?)ǎ5jHnݤlٲK@@0Gp59r.\XkW:t萈HJ,)YƄUXQڶm+vJN9ijvjjjKy->>>r Yt ۶mkʗ/kN&N(k׮W&gƖ=z$۷oSJ>}^059sHΜ98q„?.X\@�@�@�@�@�@�@�@�@�@�@�@�-RBΝw%{@�@�I`ذ!ŎHã/ @6l b�G�d"pI4ihT޼y_~ҷo_ɟ?2^ӧO%!!C.odȐ9QW6A}jXNy7cǎ6mZ'EuDzl21clݺUWnD[jxphϞ=c߽{9sZC*T ˗m*U*KI/^CɁf;~ǪUJj_V-ɕ+WJtyq4@�@�@�@�@�@�@�@�@�@�@�@�@ �Aa8� � ^ "|G��Ac ` ;wNM&f͒[nI˖-O>ҬY3B\bgΜ)J*ɀG>}z}ƍo+W̞={*U"w^?̝;Wݻ'm۶J DŽ^]J,)e˖5[2eTRfV  !kOJO8!rQۦϸ WX4rRxN d1 @�@�@�@�@�@�@�@�@�@�@�@ Ld@�@�Y Hg=�D.@d6A�Yӧ|roe˖-&UVұcGi޼y =3˖-m۶I @V^ݙ9Qw}'gϖӧOKѢECP\\\IHppڵKtuY�A}<y$u'O�> i=r4Ok!K(!Ŋ3sA|9[lNo�Vf=iࣾϬMuiܹsKҥ\re6;/F�@�@�@�@�@�@�@�@�@�@�@�HAܹg � @!�N'@MF�b-A~^tR?%uRvmiԨ*U$Qox~zСC![!T͚54i8j_{5HגiXZÆ qf-(Pi!]K6lWN:nUTm\ =u?~l'O4~zˢ!Z9/R.\ض/X-_|*U8[A@E[k;v9gZ/Ydj4�2s0d#A?Et@�@�@�@�@�@�@�@�@�@�@�@At � 3C@� ??F�M@C!W[Hk${RV-^m˚5 Ӳk.ܹS#Ϟ=rʙ&MH%mڴN3&g訏of-i'OTRRfM:P uhlkiǎr vٴiSX3 'ѣGrYi_… & \r@H ̛7m˓'95TC%)!ϦVA]r%̦{*:jjH/^YײO ƕZ@�@�@�@�@�@�@�@�@�@�@�@��AoN � `W Ie 0SAG@�Dp4 ۴ih蝆(?CCL2RlYL2%z?A;v̶=zT:$7owww)_ԨQÄZ6j%IgS`֭[:ڽ{ܽ{ׄ(:֐+&RJ) =s֓~>r ˜9TVͬ:uHݺu%]tIWŋr%.@}XiLc52G&0kpn%K>Ӈ/'s/oߖ;w֭[r >wY]^:5 Խn 0ᏺgA&?#� � � � � � � � � � � �8t"� � � � �WE*Vh6W ?vZM@^Z mee˖ahS6aM4O}`0 M_.fmMm l׮TZU*WLX5IנĦMMN___ٵk Ԡ3fȅ 9WWWz-i[55X/M4ϭ%mCN赤Ct^Kg# ] 2!/ 2DW.K6 GGu<x 5{}Y�Q )5ᄁU9 e̘Q2d gGC'uom֚;TS~}~b׵5&�۳e=clcWkvv}Yz<<<o>Vf…gi:}~) � � � � � � � � � � � � @r 2$@�@�@�@�@�(A[mڴ1Ui�کSLw ټy-x/P45 ӐIOOOiܸ > >R[@C4SE4 ٳamf4޽{&,2}[r^tK�ӢE|T@BL#-- ;յjjiПpD Եo&ZP g+U8DŽWjeˬY i}րW:ݻG 5_ԋ� � � � � � � � � � � � �!߲ry � � � � @ Iɒ%U|fiӧO3אTRIԩm{1cF`IIWJE6J]':{<y乵_GiҤ̙3p9]Kn)$"Z K3k^ߣw=GPPmsD紟,~nl{k~_ȤI˻eT� � � � � � � � � � � � �h S3x@�@�@�@�@ ~E_oY4.Gfs1o".fuϐ!"!2tG X- � � c>=�@T "(D+bF`o`DT4bQJ}j,h *jШώ� R0ah3^r}g`  @� @� @� @� @j թ @� @� @�T@߾?APy6 @� @� @� @� @� @� PAVG @� @� @�~gD̛q?A0� @� @� @� @� @� @�"A) @� @� @� @`>0޽ <E @� @� @� @� @� @� pI� @� @� @@cFԨѳg @� @� @� @� @� @� @@qA= @� @� @� PyE̟G̝ѫW4 @� @� @� @� @� @� @@ "  @� @� @�,GԮѻw?Dx⢎ԏ� @� @� @� @� @� @�[@d~NO� @� @� @`90>}"΍{*  @� @� @� @� @� @� PmAVG @� @� @�*_3 <唈~8_Ì @� @� @� @� @� @�J t @� @� @�Ao O>0?q9l’ @� @� @� @� @� @�XIA$6  @� @� @�}D*N=;W @� @� @� @� @� @� goe @� @� @�UJwUV8؈#.Ja @� @� @� @� @� @� P) +$ @� @� @�$=#V]5#~ 6 @� @� @� @� @� @� M� @� @� @@tPD]wEzkD-3Y)&!@� @� @� @� @� @� @`(X @� @� @�h]F 1{C!@� @� @� @� @� @� @|ܭJ� @� @� @ kSOE<\{G̘Q @� @� @� @� @� @�P@dD: @� @� @� ;1lX;D[W_-L @� @� @� @� @� @� @j) @� @� @�[ns&Et1a U#@� @� @� @� @� @� @Rԉ-@� @� @� @FBD͚:Dń� @� @� @� @� @� @�S@d|NM� @� @� @` hsED/̷`A @� @� @� @� @� @�,wA� @� @� @�#ФIēOFtn=V} @� @� @� @� @� @�H  @� @� @� LՋxok.o1 @� @� @� @� @� @�,WZuu @� @� @� P-j֌馈֊8Ȉ#9ZR84 @� @� @� @� @� @�L@d5{K� @� @� @`E袈V"ko1WGd/ @� @� @� @� @� @�TBUɠ#@� @� @� @ 1aB}E4lЛ� @� @� @� @� @� @�+ ȕI' @�X&M{, mڴK.,X[ԫW/[jR*ƍ+e.,j_a,,� @@5bݹscDl8eʔxGw9N;巙=,o  @� @� @� @� @� @�,g弾  @� @�P`K/e'|M;?~oF^rwmݖuoժUL0!1bDѨQx駳3g. @� luD̙QlBs믿g}6 1cFz/{r߸  @� @� @� @� @� @� P$P @� @m]xחkRf;vldr;5p{'vmAF۶mO훅BΚ5+6l7% @�UYu^-cLju8,v%zH:mQqw/ 3Е� @� @� @� @� @� @�,P7= @� ԪhM4B#17|u]Ҵi8c�r;j$@� @ fС]~E\z?xgcE,{؊x{"@� @� @� @� @� @� P]-ѡ87 @�&Ln!^~hРAnݺ0`gy&?~rǶnC o=,qڴiǽ_~yzSOE-sύ-"[ڿYYfUW]/R̜93O>ٜ2> @�|qnqqu~qJzߏu]7s8Rd={:^xaex≸뮻?;,?)SW\of4l0<laܹXx1pxwb뭷QFesk.:83bΜ9Y]NSOaÆecRX-ܒU|K*z<xp_|۷jܸq_ @� @� @� @� @� @�Xv9 @� @�+17tS/>h4m4RHJ?"B0 dcS, ׿u3&R`I СC|GeQZ_m];/[;( 46D @�UHo߈Gx]w(\kv) _L͚5:(w͵~Fm]}iLԭ[7 OA)P?;f]iҤI^{_o޴gFC7<^|Ŭ>I{Ǎ@wyꫯ ӧ~RezW;"oY~ @� @� @� @� @� @� lA.[o @� @�JBӦc, 50pe,8o[pk-۷/6+v!k#6><z3f̈_͙gN 4( Jرc|1uH-s̩h  @�{o;,{HWU{E ElذaԨQ# ^L%ѧsEeA`SO=5ӫW*r9d߷~{BnR~JByf};S*)qm?&OեNBzO7|3}*�ѣGGS @� @� @� @� @� @�X   @� @ #ze$w\2rw._~9vqHݺu[N: խY]vr!()dQ˂ ^;ZjU4sΑ;vlR� @�*+&'_D;J+,Qf* ύs=x WA]lfQP_T&N)? pL!{6mD uS-Zo͓Rc͚5C/is΍_YU ko~7ua}n-͛ϥu'G=~Es @� @� @� @� @� @� @` \vV"@� @�+M7͛7뮻.6`x衇[oӦMwIJ֭S.4'O΂Ur+jՊ>3fL7 @�U\`#z*G8( 9,ƍ:|ԩSVNQF'+lM#s=7^}oDZ3խ[7[;>u]7{6lX6BSA\sMJwYwGF/;˛V @� @� @� @� @� @�KI@R5- @�Xva9rdr!YG<L}ѱ.wW^yesBPϟN.긦Mf!+'NO>ذ-[fkVz7 @�Tmڵ$[##t23Y?_Si?IW^y%:/XdE yL?%85jT\zQNfmJ+v?0 !K>d{ @� @� @� @� @� @� el  @� zѬYô\l5k֌;#7ovZ 6X<Y}g!) 2~_VYeh׮]V5bĈxW^zE @� P;,#Əh>K?o5N:t萵8w~Q~iӦM4h x7w8>m{F֭/ς#uzF~鑂"+*)[]��@�IDATб;U~s qgV4v @� @� @� @� @� @� ȥjJ @� }1iҤlƎ;f_~ef!wygyȑ#8mڴ캴~8k1cF|ͱGϞ=.>?U}02p5kVV'g}v4mڴ  @�[FaH|fEW]ӻN.]?xO<kFqY]-M7ŨQb„ Y[;L81K)N$wi:v9[ovmSLɾJ8c9R0ctMSNѨQ8KzKs7l0}k?>90`Bs @� @� @� @� @� @� @` \V @� @�+yCѧO8ꨣSNݻG pݻw|0o֬Y:_ga&)4⭷zk;k o~�:uİaâvE}R]vYV /{)%WRC=qѷo,΋~&@� @ l!C01 #:( c{ea_~9FQ.ޅR}zzw#{D>h\tE1|,>U>cY`} L)�ϏN;0r 0f~)hdѣGrmzW]u\U�z[}cС.~|i -[� @� @� @� @� @� @�e'PcAa mTVf4 @0{Tl\G> 0ٳ#|YHAAFtڵ0eH>7n)|dIJ{ӧO-"Pd^c  @�:9 D}w[?W_}Nj*[o⍅w)1j UTwŸqM6ѰaÊ/Ԟ^c5ΝK#/.{|AvB'See_\٢#@� @� @� @� @� @�� @�X`UV:m۶΋#(5k֌6۬22 @�UTK# !K"N>æv駊WA%*mP>ٮ] աڵjB_޽*zKK//  @� @� @� @� @� @�X@dFz @� @�*+p.3&o[o~>n} @� PZ+⡇f1<}΍n8œF 6`,KR @� @� @� @� @� @��H3 @�ݻw_;3iu]7Əױ� @�+@uZW_}5zXywڧO+#@� @� @� @� @� @� P � @�TSw1; ?|MfΜYkYd5!vl @�o>Fj5,6u{2fάwZd?H  @� @� @� @� @� @�,AKՔ @� @: 4i$?u֭N� @r(((>9>zwgwei @� @� @� @� @� @�  @� @� @�@˖-Wnx8fz.vmoT; @� @� @� @� @� @�+  @� @� @�.г1eʨiᇏM;ǃ[또� @� @� @� @� @� @� ,OG @� @� @�UJaUcذbWF9[CgVs:  @� @� @� @� @� @�+  @� @� @�KI`7߼e1bUUW=V3- @� @� @� @� @� @�~+ @� @� @�@Z}ߋƍ>}_/ @� @� @� @� @� @� A.kq @� @� @� B t"8Gbmۍg,X`ڧ @� @� @� @� @� @� P5AV @� @� @�,@vcߍ6m+8!5ÆJ� @� @� @� @� @� @�A.l� @� @� @�j*Цͪ1f+_i.=8;f̘YMEJ?Ao?}FH'U @� @� @� @� @� @�I@O @� @� @� e| ѥˀxkb6z:w=:b؟>_|>uO @� @� @� @� @� @� ȟ,\ @� @� @� @HAxgދF>}mޛTԧ^mѮ]ŧO}R_� @� @� @� @� @� @�Ad� @� @� @� 1e=ѷM78=ژ?ժ##j*ȩ-Q @� @� @� @� @� @�(. ; @� @� @�*pe{ĉ[;o⋥v1o^GMmB� @� @� @� @� @� @@qA= @� @� @� @L+߾35!C0 !Ua#:u((oS]jK} @� @� @� @� @� @� OrwpG� @� @� @�64x^h .9x~weGi!@� @� @� @� @� @� PAVg @� @� @�,%n"Fӟ".4b##b 6DΩ.) @� @� @� @� @� @�,,P?Y @� @� @�(]N3ό3&K~#J_/K֬<MFgD͚?9]Ԧ @� @� @� @� @� @� ȅM @� @� @� @g 4oqoѤIN;Et1vlSā"vX?0]:� @� @� @� @� @� @�A� @� @� @�%O>?@niD>'/<GZI'E pPut @� @� @� @� @� @�JYZ @� @� @�,{FqѦMG|ݏ.Xq[۞=#g\.׏-V?:) @� @� @� @� @� @�. t @� @� @�Xb5#~q~ }0@y]FE̟2)C" Ye1wt @� @� @� @� @� @� P@ @� @� @� @@eԯ?Fq}F4nQPݗ Ln"eXr[}f͚?CgQbg'k.ԭ[𼍋>jy2f!@� @� @� @� @� @�X뚕3 @� @� @�+G\~yDV?A.XP~޼xوv(^w_~e7.&N}Yϋ,qƌ5Y]aUW]5 lڴiѢEt:D۶mc5֨p. @� @� @� @� @� @�l W'f @� @� @�sF PϏ3'׿xv(- %SoFc}NMQFXs5[n;cjY`c&MƍgՋڵkRlv8:~b3gf~mM_uQ�[o]O2%ҞSInEM6$j,$2Y!@� @� @� @� @� @� 2 \= @� @� @� rKĄ QvXRdavbKċ/Flq}K>^,qȑwEAAA;vGydضmhժUԪd}_5D:uJnk&e?> LgI!;̮4h r,}ѩS, @� @� @� @� @� @�KqK @� @� @� @`e3's̝i޼( pi^Xo\Kz+=\4iRĸV[EvϾ7|_~xWFL)_ᅬ~;|+_gώ͛GΝNh[lEn @� @� @� @� @� @�( W'a @� @� @�Ty^Xg<۟*G̝S]J_Sdi;}2dH|ѤIСC|ѩSvm0Ⳮw)r>ӤgAӟbԩѲeg}k׮n-^| @� @� @� @� @� @�XA @� @� @�*A`#^~ljMq~~1c"Li9aBV[M-]v@í:z왅n6QPPӠjtUN,2`uYW_B2{챸P.]ā_4lذ 9* @� @� @� @� @� @& rE{"C� @� @� @@h(;)yYR8xbc1yz[#Zk @._dwuWuQ*G}tQF n @� @� @� @� @� @�@2]b @� @� @� PikDnş.j׾0qvLeWѻB ,ޘ3{O>d|qǸqK.Fŀ"+ @� @� @� @� @� @� e%m @� @� @�#0y83UVw=~x饗⤓NXݢ6PdLm2N<٧g @� @� @� @� @� @�X  @� @� @� P~guVz+'N*6lrFjZdu2OgB� @� @� @� @� @� @`i \Z%@� @� @� @@9Ϗk&ڴi7xc\x駟7.gH<٧gE۶mk @� @� @� @� @� @�- EG� @� @� @� {СC|ѳgCԫW@O ==zI'= @� @� @� @� @� @�) 25E� @� @� @� h߾}[oFU0JH"=#Gf(= @� @� @� @� @� @�%P&2 @� @� @�-0k֬ٳg}qYg =B/?|\tEq'5\׏zE:uaÆYgƍcVZ+5k-Z֭[g5jXG6 @� @� @� @� @� @ * r}0E� @� @� @@:uj1jԨxcw:')((~Eǎk׮ѤI{c1}4iR3&˘<yr+),M6%7djbmu]77 @� @� @� @� @� @@5YMc @� @� @� lR`{yK,Ri)_.]ȑ#0φ .49sbĉ1~c;Yd˖-c]vJᒫB @� @� @� @� @� @� u: @� @� @�y{Y8/~wc%p cĈѱc>QfbS*gb 7ӦMW_}5{>|xG ѣGQnݒÖG7pC+ @� @� @� @� @� @�F`,c @� @� @�T?Yߐ!CV.n8iӦ,Sgz)1=۟S5jkwy3ė_~wqGԯ_?<hժU\r%oN: /PT`8ꨣ⢋.*8p`~E/OKLyWdׯ_s=1gΜ)j,(m_vmꪫɓK;}4hP|qG霹RzsѢ̟Kwq?w{OY{SܧvZ_}B=SN9h|cʔ)J%?kɶYŝoqJ}Rʺ_=5V= @� @� @� @� @�TMAU: @� @� @�Yw/h׮rO˧�ٳg?SN" gi LxqK ޽{<1~ѣG/M6$x≢iS`d |>[K1lذ>3g, ,ٖZn2֨Q# LkoF1wlc&EiS=͛B.,3L[nY0駟wqYhfnΒer%9 {uKꫯ~:zguV4nܸTG <bqWA\'%Wu1;\}vS{~[EߋNJN� @� @� @� @� @�UK@dzNC� @� @� @ "ڷo)nE*-Zc9&6xi[+^3jk_|q3&va{ /̦nٲe[y%+O~[ MԩSZk{l :iҤ7o^Ѻe͗:TKOYf=^{eA)rСEI(lEq嵥'L3f__j͑>%ϝE͛GZ}^%H!natܹ؞J['ס\)yR]I~?g4寙ƤR&@� @� @� @� @� @�/ ?c'$@� @� @� @` 7. {nԨQch˥p8e3Mg]Y%Bu]1pg.Gfbu-Z&]=׭z:^M<9 :gcuMiW^{~[ L!O)4k6U˒yQ/eRO_Es^s5YbUWpƧH}*:wE,({HsƔז?G^Ҝ/--,K� @� @� @� @� @�Su @� @� @� Xs5c^*;8SO?�=zt\pYk͝;7x≸G.; 7ܐ-&L/G uq饗M7xH/"ڷogqF4n8kO_Wԭ[7b0`@^G/FW_}Eei7ߜ/'|r62IN8=:2N8! k<3<sN:ѢEhժU* SPx?>G믿̟?I'Tt?&U qyeկ~% EyܿҥKQeΒc=g9ƤE9cǎ~Y*sdyזmƕ6{SO=rH5*޽{/ʹe%5ז>Ɨ.oLɶo&>|x3&n,4J|̙3'3.w駟+˶n=zXh~%o+zqǕ76 @� @� @� @� @�XyA  @� @� @�XARX.R,خ2ڿh޼y|W 7h,-2l2 <#;Ȗ?~|71+B=mC\ys=^xa{Ro/buQ$7x,-]O4)^{СC8hР,2O�Sha*;Yfӳ^N[n%ڵk4iҤ2)T.?2 |nJyӜ)1g%<OǦn ?Iyk?4n֬Ygᕹ19\&ׯ_,x4˟#\[ +Jn׮]`WZp c-̂?Sg l--2]rurr.oLɶ̇~n3;ӳ4o3# \r%jeF~0dMbʔ){fӟo\?/+yǒm  @� @� @� @� @� @ ~܉  @� @� @�X)l_jԪU+6`,1:kF6nO BSb܋$clhNqEG}u1,,[oc=6 mKӦM> ll Uˢsq=dg Sޒ̟-~IA~<R98 xZddOJɶ R 1tSx^F)J93m۶~-q9]vQ^{-R^M<9ʍIKO b1qĢ4.t_rmgώO?=>}dAqu*mѷolGg}v,^~nM?GE.6M<%uk)]ޘ3gưaâSNQv,1KᲹ dAsB SVYeHʆSN(?K\~lMa)$20Dlc~ @� @� @� @� @� P=AV @� @� @�,E\V~¢MݢEo,XpmYejժU&L\pAyYn-͛ݺu+=cƌhӦM|Y]n?)xnݺ+s%mYpd lݺup qqe]t:qzK|si'<l&' wL)ߎwy'Y)9jG_ƍgS%Ҳe˒MY_ ,n5ְaH(8%{%;va1`SͽCik(u)wߍUW]5 McǎYf.]ٖ O;+ ֽ SVC9iW_ͺlqg{4N˚C= @� @� @� @� @�TOA;5 @� @� @�KQiӦW_-mꂂc͚5m@jԨ7tS|queuW_}ub7zhԨQQ ZiSUN8!=ظ㏏#GF׮]*c$ug믿^f]͗(29=zSOy?쳱 >}7uY>UW]- {ԢNYf?9))p7\"SF޽A<o=ҟCo~E ]c5"o,> &@� @� @� @� @� @�) j>W"@� @� @� @`9 l&KR_͋v! LalwqGyѢE_~L6-R`FmTl>([obuzqgdajNߩT$u).=Q]voV^Q"nEZlw^9xefA|~a~E)Sbm-V,nfΜV^{z[?<xObu-֖~og"/bm&ӽ{?~|<sjeKjҷoH#YֱcŚG{,guV<裏ٳ3 @� @� @� @� @� @�%+ @� @� @� @ t%F~MT\@b _Leϟ_Ψ%kJzj4k,n,-۵kMޯ_l/^x83s~ǣ:* g c)_MV ><V]ux'7ވ'ƬYxsGשSvehݺumU�/%޹Zk-ԖK3gNie֭6 4iRQz+ Ke~6g̘Q2kԨ}YL0O e]4I'M32e\IRpO<t\ӟyes*CAl^xaQs=zQ.|=w) 0`@̩&@� @� @� @� @� @� K'@� @� @� @ `w 7,Le}ݳ8dȐ~|M`gSL| MRYCw}wgWǎc io^{mq!D DK%Vi:һwHA|{Wj*W]iM_} {qAo`afQ^hԨQ5X#vG}tq=nyˑ5b;ꫯb}aÆYPxBR;\i޸馛;/ '</hҤIo˯.v}-D wrnRxhAAA#~8rUž+O r-#[>CVtSnH^+sgW4U/"gXo]v8+TtƬuS*wuW??믿)11Ŏ?d?RfiaӧO<I?s) 2Mߏ~\ԬY.  @� @� @� @� @� @@ KeQI� @� @� @�He)/BGp7<R_ Oc= GΝcرqdz>MгgϸO?4~'|OvWJ[͛:t>}QGrJt=V_}:thh" SK{zDz-[#<=z&>|x\ _!׿^zWW&]̛ٿX7Y/)L- [IaXww(Y( <0X/~hӦM$#FdǏjGSNv Sۘ1cbܹY]_ e]bG۶mcԨQ6DC La`l?ɓ'gB]O~n|, s=3;׭ޚD.4YaEEI{M*VSi9_ytMcڴiq饗F T/)\5M;s9'J sw]>S2ȟҟ)t6y\MW\qE?9 ^͟'=ٳggdK?),4ve&%GYZ  @� @� @� @� @� 3j_ ۞sO~k @�Yo{c?]a P\ J/� |U'! DzRY"*6uuuq-꺊 * ޑ{}ɽ0s9ron' �xo7V׮]of֬YhϞ=^_Vm̂,x -P^zGϚK,c_G[l٢e˦nf^+Bxbs(YjٲJL/jBjFLs?'MF9ڷo]B}?WnJ܆?V%$$r*W*U5jxTpVZUApJV4uT.\8Ei&U`zYxhy,Z]vw-F^, _v4tt+ fwz!dzO<H9g5ixʔu-DBv:nCZ5-? � � � � � � � � � � �d@\6o!� � � � � � �N`6p]Kzԡ3[dkժ=C7n\R;)X�7|N8!ż楸B -0b~jmgd3<wyG_| b\/|c?31PDexuΤ Ci iCZvLpAnJ^oB6cytF4ccU>Nm߾ͭI[/]zՍ.4pR(djՒƃHyGyS,@J{l-B)_}U;6MoۉmvS:βwޣnaÆ :];_r D@ב0 @�@�@�@�@�@�@�@�@�@�@�J R@�@�@�@�@�@�@ _a=[2 e9vIuJ֭tmW|+rG^ԨQ4Vh4o 뮻N?&Nx:�HX6w.,qu]x.g-_͛81^v.p%zuJsƍ "^ڻ *%+�dž] .l<xӅnև.xrvun ׈o"^jԨՏZh9/~ 8RlYOԩ,4B@3jpWP<yUUti <8۶m2,� � � � � � � � � � � @~[Oi#!� � � � � � @ Xڵ~=!%&+S&ؽ{x܂ԑ ލ]\]}ڹsnrI'$y/TR9r c,-|Wrs=\[f֭]zGյkW,Y2u_zinLyWZ9Ɠȶvy[W��@�IDAT\8NW]B,2UP殖ҥ\覯w?Kp6#mըI7,|p\kܸq {,D^!� � � � � � � � � � �8 !g@�@�@�@�@�@�(vA%.Ɨ/],-رY3q{]Yіz sj኏?fX>w_o߾>|8oTu'&G CGNcmnڳ'N[ӦMA-KhJ޴͛!?BKޯe;î rڽo/[\eQF9nt^ "׻ ԭ٧reJªX*TকWr&"?5j?v@�@�@�@�@�@�@�@�@�@�@�8. @�@�@�@�@�@�@ $&JWC-qٲ X8XԡCj$[&ˠAԠAOSLѨQ԰a e Էo_͟?_/^9s#!ƹăin͖7nrͬGfF $VVq"nXr&sy"EڵV-0GHhQ 8ZY7Vv4wԚ5\ڱ#AǺ*zj-{unkg <Uc]jYs6k`b"@�@�@�@�@�@�@�@�@�@�@�ȷACˎ!� � � � � � v;Zcd]B:pgˑz /M0(^x7oJZҐ!C4p@%$$Dwf*܉SOiСq9sN8o͛7k„ ?~>SJ^8ÇhqӦMGLˉ n2)ڮ]=\K SH/sQ"c\c:wN#-4#-[\x][ͅq?$cE[\']]([eB[kLP%\XdYlYmJXQ@�@�@�@�@�@�@�@�@�@�@�@ E�@�@�@�@�@�@ ? $&K$zG ^=ر??V{NOֿ=_^}qwyg~ W:  /_^\rWeKLW_/֭[]a,KVܸqcѳFTB!�G?22(ٟ{]Uekڷ/Ծ]d[gn͙Yt^P%4}z1MRVPyplRbbX*Sf*VLt.,YjLR JJZ@�@�@�@�@�@�@�@�@�@�@�@ W+@�@�@�@�@�@�@XP:Z ц˗˅%J;w&NpafAw&Hŋ"Ebձc=m.@o.r)2d8㌼c8tP㏺˼PZjkVrIgvz M8  nVͯtMZ0eu4޻_B'B'ԱkBgOZJɛ߲e \3k[k҆ 11[`+<42> LT͚q.2Fi!6 mZ( � � � � � � � � � � � @V ´� � � � � � @X.ycd>YZzrprA0xWw풾~~bcvK/w ,-- 8P<LmV~z8~СC;vi.O?cn;7o_fiT Ym&坶{Cd@[(]+Və+BZPO(u9t-/kk׮u,uӴp͝ItkW ^]GVU'ǚ *k2ڿ?!vO*.Ȑ˔IZ@�@�@�@�@�@�@�@�@�@�@�@b^+gLF�@�sOqf<g@@�(0fq?sϏG}B�@�@ {/#C-=~? ܂pȡ-=ʭŏ?]f׬ԣ_O;M*U*^XO<w}W+W_뮻NkNeȰ+/륗^zLz;<� o8|{Ս-zu?8Bd#WʕK[`ZhQy^p*T]s-]dS/,2.B$Kjxm֋qkU 0҆]Ʈ � � � � � � � � � � � @$� � @AL@ gG�@�@ [v=Al6tYjZZJLSYXb=}z8˺uݻK*^[P /#GرK.D*T8 6m<[oiɪX?OmbN?h6~dzpPc2GCpԠTZ{D .Ԃ jvɔq 6lHusᏭUL#b[EVrZNw% Xs-y8ddPdR@�@�@�@�@�@�@�@�@�@�@�@`Y03{� ��ALNJ @ 2W:� � @ _YcdAXY͚ɃՂG*]Α͟~[eǩre[pAfv9x>Skٳ=\KuM/_O>Dk*THso ̡COMv B"mkS/PȠFDPHk֬I yiZ[,!!@7V&MԴiS֨q6m!- 2y6TʖX`dɒI0� � � � � � � � � � � �yT <z6 � ]Af4A�W fk � �䤀 ʕ"Cw{WdAhhA6b9o&׮/O;~]j<{Ivءq?ԗ_~;wztlxgSNQg&?cg&sy .p 4{O<uE$0:ZHCAUwsK@HvY3g \" kQ !MKjZPd0{^եjqF(@�@�@�@�@�@�@�@�@�@�@�r�A@�@ A�2I L@�@�rҲe~crȼ+$ RtG +n,}~HczأԮTP9p;3QZ;v<ZlN:sСj֬;:EX;NI&̙3 O<Q٫W/u$,ίZbd0d=^[3ݩ ^٢!ΝCZ8եKzeawSiҤ m-ZxƫT&mbq㑁kHRkF{kR@dd`\&?3@�@�@�@�@�@�@�@�@�@�@�,iF@�@�@�@�@�@�@ SvG | ],(J~XYa~d.;Pu ?Mwo?cGHܩ zj^K/uu"N8Q>;'1/CjJV-(w2+V,wX*ނge7X`jaz8x`/3`T6*`aV)tD ҆ Hc_q! aK^sTWƾ}~Mf͒ K[[bŊIvnZ7vBznNB~`92 2wٱI)Y2H3H aѢuC�@�@�@�@�@�@�@�@�@�@�@� r|M=:<1@�@�-0p=teƼ B@�|"0fq?s'@�@�7۶#m݌C,1(o82uGL ?N*ٴ&M=]*fꆳ1ۏ[n O*^<v%N>=i8w\Nj.!4h k׮MU][7鯦*W֥֭X ~\,�Ҧϰ5<*U*D%pl iV.ڝ^Ex\ȣ̻qƤ`H :{l߿_ N-28[h)צM{AH ׯl?Rl` 2ZXb*@�@�@�@�@�@�@�@�@�@�@�R 25#� �xAr" �S y\+@�@�!`[h7o!.NU+XTHל͜~4Iڽ[ryGݻe9ϣٶK#GJݺIԨQ[8p,X1ZȢ%H|`E ,_ ,2e$-Z e`jw^m߾ݫ\i0mۂ+Rȥٶ-2 m,\)sg8 2 "\iJC7o"C\g̘]3omz]vjٲz̊b 5kjA6F{uQ+ D`} � � � � � � � � � � � P,ЇG�@� 2}#@��Ayg@�@�$~}8ey0Ȼ+\X[{ z<N )G'`ko-[$ [ ѬZ0^>\݋DĵPƵ.ͪoݺF q}4.Y*22/K@Ie˖Bm뮻N*U҇~:d@ V z<ZH% &M T2͚5]ӦM/]v 6m4)}jѢwm-fA0dd`d4 [(d i5jV]콒� � � � � � � � � � � @~ 2?U @�D 3@�\$@d.:t@�@ [zΝnYЕ6h>CVgw?Wt&L?ZZɒR.ͥ\c|ӟ,M.z>Sc?QFij B iĈ3mB Xpܹ~@+$ tYƍU*9E3fL!Wto@ŊS6mt''jeȺkL),r*@ZavP!y8d -<L16� � � � � � � � � � � 1:� � � � � � @E]>AѢ~أt)tS8ran;[J|~ „So۷oAm_w:u 5=GdӦM*_|v|M:tȅ_Y&MK/eh \(PY \ CΛ'5]pjM6|,rJ^={~_>Շkz;vTΝղeK/t5r[Y=^\&MRߒ@{FZ`|B=^n^*22^\a @�@�@�@�@�@�@�@�@�@�@�@4!G�@�@�@�@�@�7a'}\D -d~}8C..hAS=f`h~>I'I\?Zhq I"uZkҕW澽ۼy*TڵF1c믿>PÆ 3@A֭J8{4g_G5upM_O?JZkگi۶*Q =v'+BW-1pmсaVbc0Hkۂ!l̤q{]T<"� � � � � � � � � � � Af0#� � � � � �֭rX~E~x ,vga[ha¡{hf?~2E.LjX]el٬KNla ?d nEzAtIܴiVGD.]ơC%v)xz4 @|Դ_#-,8=;ײe[ qܽe JE2EŭS6mԭ[7Z@d1{c̥LɪVc##W~E.d֟n5^C>@�@�@�@�@�@�@�@�@�@�@�^ Ȭ7f  � � � � � � {w8q䡏7HHԑ \ƕǚ5 {̆Ôl4s4awҮ]C?�҂8sپ]>-s[d3SJaÆv- %\'pu;  }ٻW7O=;ƅDu5.Z(\V\g*TAkWT={Cz*RHr=S+=~dul I Jr~X}n /Q"X! � � � � � � � � � � �) L.LE�@�@�@�@�@�ȅĴthd].THUKpV>}q 0(O9ŋo\ʗ  ,�Ҏ]A)FIw)Yً/J@R ,o.Kw=Z>#F~￯j=g'PtI~li6B!ܰՔ)!MR?<ݽwWf:j۷ZhLVkv)[ttP#fl2ePc #  � � � � � � � � � � @ {@�@�@�@�@�ȕI˗Kh5}ʕ~`^L\\8W/ɂ-@~})!!WZ!YhՎaR~c˖y#03Y-H'K#RٲmkK<+VXoK ȔC.}]C) p\Xإ_BX-[f1ԩ/4sfIWcc{?Å+oWǎt թS)R%Zfje˖pXURPYX}+THiի9g @�@�@�@�@�@�@�@�@�@�@  '{� � � � � � D?):^/]*Y]Ah5 2m l&}zeW:H]?xA ڹS2D1B@~ڴ9>X*\poK!wsN={׍7ޘڢLG�czzֈ_5kV>h 6<sKWZ-R[նm!vZij%Vzȃ+'Ym"o "- ߤO>֬׷PYƑjI� � � � � � � � � � � {̽dž!� � � � � �y^`:iB)2/wL?}eKQrM~vOK;i*o-~2sK]oذ R+-[vK<KtIW_}2LD�(ZTj>պz衺FvءQ>رK\}ʼn6.е7RZI l/pmՂS*~a9ud8~;j Y30VlJ[b � � � � � � � � � � @N G#� � � � � �y\`#]+^~j@:<Bmܪ"QC?Qrr}].[70OYy[n6L*_>pi Βtw''k?%U\YN?dx�9#P%6rK/g!S]Z?ቚ7v%K%ubŤ-"m6mM% 5,2Vk)kڵ~XʕU ,%H L֨!ǧ-"� � � � � � � � � � �d�>li@�@�@�@�@�7x`AZ֭nZ&\~cϞ7XZ(p; Ig'NvWzkJr B}ACϦLR Jf~r'!D%D-2( B!/,KA�\'R O9>D/һꭚ6mJNnr.ցM5cF!gTPȠZ8$Gf ;v<rMٽ;iƏVCmY RE];nоMZ-IA�@�@�@�@�@�@�@�@�@�@�L 3S@�@�@�@�@�@�<,`k׆#CW pǶm+4Ã,L. ?N m(+'|>~cÆy?rƌø,'+]m8pT|%u ~Xd:u4`�z裏tee׮8}x4vX{O)޽{xGCZt`H l֌pȌmȯ)-o֯,$2M, ##g@! � � � � � � � � � � 1 3R � � � � � @عSZЯa6mn7˔,;u>)o(ؑ?, ʂƏRbRҝwZƮEk_?Ǥ3fY&!!l=oڴJ.f5h 2D]"ٳ0Ȟ={B YC�,Ro6Z(;C7|S/իZO`H 5b͛I:Hlv>6#US{@H j63G3ij!8j"- N𸽮YS>v� � � � � � � � � � �T+}-Y- � @N 8FO?G1w#�81cƨA; � ,DG ׮;>^.|)hhRkÞI۷K'- ï',YyDzI?SOyt"._UW]%{W֭߱c,$K(}뭷3�yW`̙zohƍ=nF]p}ɽ1QCN&M.ٽxqm[=, )Y+`>SFD0'DEFFq � � � � � � � � � � �I ȂtW@�@<4VA��Ay E@�@ 7-1|\X:porpch XطO<Y0�- pj2TDqҀҶm҃J"*cɖ -[V?nl^O?TzG}s=7CkȑTB_7tj֬YO?tcApHwۢdM~Pd 9[r\ CF,^1@�@�@�@�@�@�@�@�@�@�@ ?"� �d�AYK @ l@�8%K>Z-[4H9tc(i A9ҽhnx_Bˤ+|eCU[o͆%ĕoܹsUT3y�y^`ժUz饗W7nԅ^nMzj{`H A+CڰukpaΝcd!6 ɠ+Ⱥu&:b� � � � � � � � � � �yE .t~"� � � � � �]`i#-'1Qj۴ ?֬F_gK&'J۷KU?<j&=,f]y"Eh޽9_jҤ/(.G:F@ j7C{رce|ǎu'뮻>E)ťΝްAp8k ҶȓNN9ů32n)(PԼ_Sڬ{6\4Izu)2(­!u0B) � � � � � � � � � � @n 27 � � � � � �^`׮pcd裍<+K-aC6h b4~hKeH]J??6nTf |t~ԣq%JΝ;37Cwi_#Fe]/\ݺuz,�yK >>޻:<yx ]tE^=ܣK/TTJR^~ ^XQ5Ç`V$ J XjJ]˓W ᵪT!#"m܂9a+@�@�@�@�@�@�@�@�@�@�@ {bBd֦[=:Z@�@�8p~2ccNG�pcƌQ<wN@�@ ֬ի>IW^8O<]r >Z�ȥK`N=N ʻ{nASrRjY۷3<S5jȑ#vCi~~ӬYTX4d9shذazw\PvC :T{>ݳ0S`H 2EڲE*RDjVpH !ӎ;b GyɽB!y-D2&&ۺ͆@�@�@�@�@�@�@�@�@�@�@G ) � � � � � �"xq8121)[Vjȯ={-d )&`'lդIRBRR߾~R%$3C'}TS=3ZmTs)k׮ѝxԤI{zꩧr/lGiӦz7t}y!Nڵk'|R;w>N(UF,ۂ-g~H0[Q>DH1g%KJ-Z5Mm "-h+?DDgCA�@�@�@�@�@�@�@�@�@�@�V V@�@�@�@�@�@ XHL9ÇX?aC"*8.v,p ~Zί3TL ]{( &u"Y%{>\_ g۹}+UVկݴ> >soХ^:h8d@C뭷ҠAŽAZ(B֬Y;,w~s۷KSՓ'K.%+'Y0sٶTqwA|yɪbkH 9}{g Rb82 5j?+K/ � � � � � � � � � �  2l � � � � �` {Ƞ`܂ /.YcFW4_2*`!7~_-Tj^~}@UZ;Vr!j4`tŒsfBXft-״QZ52s\wuzտ/2!!!{@ ;Zj/R ƍkС>@ Ԯ.-q_a{1C{_gpp p%2+4 nVO; g˥%K!{R:; ybŎl) � � � � � � � � � � P0bBd֮4ztfH; � �9-0p=teƜ%� ƌ>y � P,eB?q<)6m~_yaYkԐbb Ys熃'NmTwzճgO,YR_}dSOI=$U.=l8+[:6{wڷor:|qKj֬!E�)}?aÆe˖z8a.N$}_/ Z,jRr)6#% 422G>Y8dd@ '+V̑Q@�@�@�@�@�@�@�@�@�@�& � �yU ȼz7 �Ai0@�-~G }\BJLj8\ߣ )+W'L,tikW? 6 oj:UfM}.(N֎/rd{; 8mg͚-Z~Ss|Wyq6mׯ@�R9s5\c}0@ !ݭ+N?X8d9E6{C"p (e˂$A(EF[@}l"� � � � � � � � � � @ 2o7z� �d�AF͆@�l 2[ �d@($Zudࣅ?noxqapУ>ZcR||v M>ZU )RD~CjF*THYguGIT)kH.KTvo'xAw7W_}U}Kt ;wvY4ewpx/�dC]O> ϪXbٵTu ĉ̙}mLpn2eRm\ŋϑY2r|.pan]?>2 !:& � � � � � � � � � @>'n � � � � � @>pycZHyzn+U-5kJ11]Q poIRveNia=i. ԩS'*ZhZ3/\FO{q+. MĻ$݆.ew֬Ybc݅7rHjJÇנAr_W_}^z%%$$X0] ..N?tkF?ƍ,%/Kٲ~[ٶM4I`H ~skg tB,�H je#"NzKڸ_ڰH~}ΧhS^#� � � � � � � � � � SR@�@�^xA{|ɬ1N:/VC�@�@� {3ߖO[j+iT嗥[]K{ifBQ\o<SUȬ8N% x@' 쳭ڰ;o?Ӊ'67C =zm> 2N0W@}s_NchBs9lUۄݤ-4-.u]O>ӻO) 1b]uUGLШQ#.!C`JI~iذaIkEoKRv˽1}'.`ٵ}n06y6ox޳yΝ;+/׵^FFgDsz}n?:6'O|0i`~?;vZIv[s+IKj/z^z=^gd"Km<۷OL>{o=S5󎢤<ܹ.b;.O&?})SF.Z.VҦMҘ1rE{tg k+L>ȣ\ʒ;{4tHGiv_Kn֕.Fݩ>ȽoHիK&/sv J tNz#e@�@�@�@�@�@�@�@�@�@ onK@�@�$<Le}7ރCe?-[+VȆ@�@�@�pYY.GzUi 6~}D ukk~YhdcsK,\X0_~G c )5!M.|tV~:C@cǎW\D! kz,tlIW^ڵsΙ}6cyb?c//!!A*7o޼dy 4o< M.,576-(҂{6n!jmڴܹs1Oqg~mi)T,{^.-qo.Z�mui{nB�kbbbܽz!5lP։n/#\&z֮.<.ͻ `;S}q`7y!A#GnZ:6io۶-DB=m4=3?~NZ0`n99t��@�IDAT-Xk'NZXJV{׍|o,,kGkR?h۫[n^rjFOގ]s]tqA|zvڵx,ML{EҳʅKkJ#Gʝ{~)HXҥkX*,eaK/({:i* ili8i@sʕ+wK'$4i?_cm g?zZDy� � � � � � � � � � r! � @^?~; :{0dnۇoރ�(@�@�@ \. QK>\fѢr??A$^74-FZNS`|}U˝ۺUTI].TMC[7y%JT&TV [е.CxKBu 7?.ͩFsLÇP,B?߂*받n:sA\zq'Ԩ.EjKYfKjn[t'{!|N?ulڻ%ur dP?~M+q_ߞy%\jیlcuos<;os1Wzft_uZNv?\m} "m;3<3ly+>-oZ5ZsEf!%6ly[&cgJ*^k%墷a!V,/Զ̳aJJze-~4mlZNi6-#}\x^�]v�Z GMDo믿֢EԴiSo}Q3FK;}IUbl>|rt~uYgy=lEȝ~ҁr8MZ8yuyZ\._ޒO8Y-G('?Z_Go[Ho~F�@�@�@�@�@�@�@�@�@�<B=D�@�+Էo_/ tB\7$2:� � �yXS | H+JIؤ\W8N)6[1 kiICJ͛ݽbŊJ^^CnZre A1B*F饽5ra~xfsd!VY9w^}뮻qMZ$SO=Uw/izLLLL_uyaifna}9sLuI˗}x^h,}Օ.}uҥAsi[n�<X{Lv$fd6lݻn]{1>ѥ՞fD3Ii͏ Vu rzJZ߂g-҂g-2rFi?js˴Kklvns > {蝣I [6ej'ynPNFڲaZ5/ ȶ3Ldim?ymDm]_kbN >5k[Blm۶y "=F$tdA}-jW|ԥt~y=JkkV@d!. UGZ B!#6n!ܔһ7?- � � � � � � � � � @n 2� �b)S7:,]z^,Ynݺz7n7ߜlowܓaJ]uUzVׯ_/{prРA*]lݑ#G,(azOx]ƻ'-衇T~}aN%\U>C7p*K/駟~R%Tvm=I}ܸq3fdɒkd@�@�@ X`>Ι|cPb8Áի$%5 l,}h J K. CjnO,ʂ{뮻ᩧR2e,_dLKmvѸLp_S�ڱc-ϊ};6\Q;; \2G;4/:2%�[lQ޽,׬Y d]ve^pdգ=C\￯?Oςfv7jժ% ^&i?Fv[䯿|2X[o F8~p n6W6VIk~0Ͼ䒘{BiɾoO\m/#{%ٽ̬^DּELk߿~>֧Odmۋ62G4DŽvIk^lzˤ7?h'|[j̘1w aRD/ofߡ%Xf׮]^j0=rhR{O 5/X&ᱮg籅B/vHDnp-Q,X"Ecǎ5gZv }j>*?ny<"~G@XP\kWNv-z~)~ɽUI~uɊsʕr ~uy[o!Vj% <s!Qo&9Lo~䲌#� � � � � � � � � �~ s1 � @x5`�?|缇AѣG{{Hꫯ^lO}b!Ad{aÆå6v4i{8͛7 nO믿^oSctOmvi `gڃm{y֭G0odþZi?{k+%=؃P_l2~޾s9>lo!V  � � \hVwJ?r\N6 +TOK~ؽ[{?qx? $i#Y`?\.e)}@QF&~ b^yosMu(r :sJ2g{ / ^rl$R93/13=.[־K{ ;wb!dΝB0DYRZKomk޹bV֘Mdn?_C&AFn0`}jjժjIJ*yAGs,2XH?}Nt G[hF҆ Y3<=׭Z,XMHm" mٲnJ)2;>" ôD"i#rڋg/]ԅ{ΉSN9}]/f혿^?F.n:/`S&M0W#JvVM㟴E.=y齾uإٽB!-otʂ! 뾤^JjSJ֫O>}V*^F><?,1-ܥㅍZh[ǥ "m<:$|y?ݾ]jj ZDz5 � � � � � � � � � @.ebP*@�@ vh{>X.]y.^:4iޛ *?oSO=va!e=ޙg- /xN;4{k۷o(Q"NZ7 YHvI?S`˽?p2zJwwS'McK.׻>W@�|PhP8zPkBvB,kjPϞЭB#ڤIЖ-ZD 3.2$)&MB!`ܸPh۶bm?"roL:.,2wސ jk3XW6NAЮ]ibwŅՅ|$04tEyB5&cV;1ڵkCmڴƏ\r!Tn3W]uo Iuڵk\X\yaCej mذ!EҜnvV^l#Fx] myMvļW^}# &֧;v$XSf0?J*mgԩ")3.kk)aSgԮαȶ22Z{{ ԐHIʹm6X^G?rD)z x≤y]vv[Ҵf}aʔ)!{1X'5rꘚp@+@UǴ~vd~q sN'9`ca~/q: -Y }y(Ϛ׈CϢUB;'CaB: ~-ڽ&� � � � � � � � � � @sP@�@�HW`߾}:䓓-wS~$#͚5{{iV7ސ [^?wV½\J^yu=0ŅSj=+\Ȥɚ<y7q&HZ$8 aЃ>~[=4_.@3fYO=M@�@�@ 7 $&J˗KsHs͓{\ԴԱt x&r? =O$s|LixNd-HkK=zH7,u.U|~uM7ĉ5rH�-o}PFBi&圥nqw…rxI ~7WN1}gXR%&ƑJSҥ3už3o+.Ͼs2j(q3l0}G_1cƤٔ]=҅i;)aЬYlTKFNʔў U72dɒ3:X%!!!rG+Vc.VJ=sz駓MwJiEu xr!Z[Oi\hnJifxwx|y5h@<H6JE5j$UF7QO|:d _|K͚XU京?{L4EV2oOƍW~/EUvWϯg9Ge$wK m>_א6u-)!]ҝJ 6 _\Xuu-VE�UUlDJDADV7{<x=1>iƛWO8nMOIW_ � � � � � � � � � �D@dP@�@�t̗/O) |!ҥԽ-Z$ :_L|xcɢ BOo.hB_ҩ]A7{_ҝwޙ|� � �D}Z>~C >"0r}/gG},cB lwD~t&m,/G�{@pҩ[n.RS֋WmڴIUdbh:ԏ@t}-|v{mtTGlߛZH M6̙3 n{}xp޾ӧa_݋J\dTR{2!H[gرcuYr (2lΝ;M"E\7e\7f/˞g+vtA>~0Q\-8νqbCHI/n_~뭷2t[XўW,믿z!e{nq:dK>__BwNu$q5j( E/hO7dm[X,KK/49q/][@o<@ևti>iٲHLҚ5E7,#񡝞?3&Y � � � � � � � � � � NBf] � @ ӧѭM%K<z9Q2ɅeA5j$9{ŊK[Ǚ7n쾌D?_{$ZbE/xA~Y}7o.b}վ|ޫW/)SFKw-tr㮌3@�@�@�^z?_'VŻ?hGצbB *,2~|Bvv P~^=/9jNqueX+T S~Ef trA=?rU%GEB'peW^ќ9sT)Lg}F%fjY(nڵb/q1[]p),)'uY^{{!ĔbcOk�.`Z2l? ?Ӱ Ƣk˗/7l'9# qE/kڵn^.֭['|*oD6m,;9}Wd-Z .UVZ=o/d 멅'GԹ c~͓EڵA~K$,PN?ݏBKŭ&}i?Rbϓ'smk%Yw5%#K-Y(>qҎW&oɗ � � � � � � � � � �dt&@�@�&'/@7l; eL 6.ȑ#G?;tM^�oP7Zr̘1^`ҾyɂwuJ({ҫ}߾]}+@ޗgZY5x_ N@�@�~"YrQ0\HE8P.|${N2EںUH75K_ -H-~uTTԷc7˅SR9Ƹ -\0\>o7|?-RYMSܝbu:u?ih늬UVСCS{K/{\ 6 5 k^${ϩ%S] xνHK ԥ6Y$~\&zc~Dƞ+N4߿DIr Yoo$7͞= Y�0D}-jժ饗^#[_]]Km:vvh=™߸7IMv&?|~x}/OC=txZ|'G\u^y2XGNWUP,\tE޽{gZLuz5`ԛ1Cr"wiSPzӾCQ.\Ϳ/K 2垏Ʈ}f:U]]}8, 8C.Z,r}W: � � � � � � � � � �Mdڜ � ˗˾ LEN;M{wR+Y$Ҿ\m_)8㫭FW2)X>c}zWu7+}Ӧ M-7R,�yꩧz_Ծ˼X&[~I_]rwȑ#|1[n\a%w:7yoڴiJ*/FoF2!� � �')`{&NL$\E:55,&I6I E^>`:Y `}.אr? !y>``q=3}blj5쾞3g 4 ܸq:tEN# \̏Rdυufe>ۿcK^c"/)}ӧyTc{vÇ{?Ƚ}^]el޼yK(®<d8K>Ysk.Yi{ԨQ,:+IY[n NNrhKדO>xGj;q'  )L'E ʖ-GR?Wݲ W;]Oiv,ԗ+W.mqY\JӉ;Dix#F>sq_-8'Y۶m;fwqt? ZMAjkrȑKQ爔⮉f *xħƍ/sŷ>O6G9_UѻD)R_u''.)?[Tܽ}wcױߐPvqdsX) � � � � � � � � � @ dmaS@�@�2QlūܷzE틻طTvmy/b,) /B p_Ο˼|饗ٗ-$i_ ?/&i_/^^~0aBx˗O\s_BZԷo{]wy„x-]EwqzgG[}!_n01Ƅ� � �C`v駟7ސ S;k️X4~G/F/}nCEc\pM)MX. R.K͛K}$O I;˅"l#RZWؼy&O/h"oߊ]\*A2pR2~uИ~)9OT.?ȇ mE2&`ݛ$|Ic0ƍ~d-[{lv?Ԓ|'*k={Lܹ3ɢlhB<`cwp޽~7܋{ժU5|=Srĉ^1lCqS6�lJm<vƮ+~^X{Xg {X-gV6xcJi9-eNw/uԑI<o>}Ӊ/wN|OmǻNBLmy݋=u~/7l_x e>W<3K;|z駽ǏBmzӦM¡ŋO~qƖxm_d\}͚5]$N~]s}F.>r}Rd}_J/~TgB҂~r2 Ғ'P/D^.F,v־ߠK226Q � � � � � � � � � �D@6?gpkxEp5@�@�QzGi_l;w*T}Q>p틞*V_'ޚ.sߪʖ-Te08/-߼+WvѿS;b/B[ ҾiO K/7V8tnC[ 7!� v׆#0LT\ GW?7a*+D ,/Rg IK;MCaNdŊԩr؅ENN`6?kѝf늅d<ٺu&o~3% XP~§A`xK٣O?EK!9Šyʉ&ۗhDIц5m4ɓ焗O`7dZ1ܷO4|MYd~0'VmSw{->']Ngߓx=wi<L=zpA#ɢJc+Gi̵OE.0*]}NL-.\-Ɵ-PvZ5zuF 08׋b� � � � � � � � � � *ZA�@�bŊ鬳Juc-XRT?EU"=/V %iqۗm: R} @�@�\OE9sb~0g5j#7Z\�?X Ħ- $X۵gHi…^Bv+^x,lVnGrFԻwh7'-[zhw +5tPӧ 7B 5\ [n}tiݗx 9S.uoeJL~ZtvO4R6L}QD'`,{2EO;Yk׮'=.^.SOwK�2x[ wy.dJ)LEM9)?tg{pa+k7M%})Vy_ߟo} A B~,& i iD<_"� � � � � � � � � �Ī@#n /CD� � w9J?S^ziV%b_}_10@ %QF )@�9U >.X kyJУmERuʕRR۶~cGA"u̙:sauŏ\(UW]=zdڱq5 'M"Y@'"EBmEB˗/b֛]]wuid^/mݦ׻8Xȑ#S0yծ];C~G5'O\vgg834Uti VMM\Q/[q6m8M6aut/Nj.&^!W_vmR<nQ^!nݺ髯gʕ+{~pW_jO\nvN=ՏW rJnX& _$\QL|h˖Y7M 9n-eH � � � � � � � � � �૧ � @ +Vm58d@�@�Z5z\G=?6o-+ի\ >Z*y!غU8я>'Y5wnys`iL.+vFi,K/IK?,ʜٳNjvfwݻw׮]dAŋVZq%詧~{]y޼y_~č3R^nKzUZ5ٜѩfpEk/3hٲe5kJ,[,O t%5rH>}ʛ skT ljƟp'RIz=_ںu ovr:tTd?.8i˳Ǖ4˗dq� � � � � � � � � � Eَ)T_҇j,@�@ F}^5f~@�{'�@�p'/\7gx^ߜEȣEM eEJLI?Θ/aC?رԦ 1|t]ҀR߾n0݈?-ZrEܦ>Wr K?2!�3<S~kLׂ77|G[qmE{/S~d}&HY`zS+VE" ^]QßklR^."� � � � � � � � � �D�!ȸ �  #a` I <)>� PIK<yZ%>s2Q  <(M~'i>?4bG۷p,*ϗŵE +}+('D6^qTjU޽=MW\"r V~SӦMϻpaL;v^|qƌE첹H݅j֬nݲ+G(@@,lٱHFn$_>s[ -?˪@�@�@�@�@�@�@�@�@�@�R * g � ��!H @l ەB�,z<8wk\hDT)!-@t{ES̑Ə㏓&I;vHe h3!p2;wJ=&#CENf\7&Lb5b3҆vQF*Y~W=z#n "CzWpB*U*2ţضm}w K-)Q^tT|oCG l{E!C;nH ~r5 v> � � � � � � � � � @xAǙ � �Q+@2jo:�Wqy8@ J}L<]oi|[Wʟ?J6a"&q~�rhQ]EBoN?M7Iٳj,'nF}'%Jyc1cZlkĉ9sjժqd@ wV:uԢE Y?"W{azwseT^oӅ 쏡ۚMZۇb8dphHGdK2G"|_@�@�@�@�@�@�@�@�@�@�  %KB�@�bRdLެl B @�M⎉cvܢ2ȝ[YS_?\tm%E <4~ԣMcÆskZ/nE;W/駥 ޶vjPjW_}lٲEAtwZj*\L¤I#b@D=zױԱcQl 0`~S>My^ /Jxn[$% Bq‘ʽ*TsR%@�@�@�@�@�@�@�@�@�.Bu{1Z@�@  N @� 3+A�Ȁ=ܹF7oVlأ][Jre`e\8ضM4)!8oi?v 5oGU㄄ OHJjICH-[y.N64+qY6/3o?9X /5gwEzLغu^~y^ye֮Q^+_^Gz馛)gLY- E�d˖HC&sMIU � � � � � � � � � @ S@�@�'@  cve@�hXJ5ˏ>ڡKHKKu$>֫'-m[x޽Ҕ)~ѵͼU~cGm[qѱxSzNzQ_?)GxS`{ ~=/W֭#dӦMj$ (U \WTRč!@ \҅kȞ׈Ɔ;wawo#�ԩSowt݅3ւ�_4 D"Ӥl\YJ9fq� � � � � � � � � �ĥ�!ȸh@�@  n%@�h McE�_`i޼ٳ-[m;t?hbR*Rѿl8tHq㏒ U:tvXX8F:-w믥yF*U x8j@]tN3fL2G߫}*Yj׮.Ȁ@ 2_]܋]… {cqPa;VO?=Lv[\>}z;S�*k>E9CKHD֪ #;ɬ"� � � � � � � � � �%@2n/F� �]dY! Baaf% @\ Y#[%K=ZSOK*6;W??N(m.VK?v(/RdH"HO=HڶТR lwOT͚5S4i$1{Էo!A�H*\߫W/ 8Ҏ;ꫯ7p3W;cTM1L[Ns?"PAM^V;VupȘkJ)qr?ioW!kO˓'cZ � � � � � � � � � @$ [!� � @2n�d�!L@e @ 8 YM| ǫV t@~ݏ> -QtYrXY)ҭJ7J<ϙ3+Gĺ#M`ҥjѢZj}Ad18|{NY 7;e˄�$Jwu&OO?T/v]B Lv ,ꡇ駟qݷuKYke J-[ dX_a{XRB A,hPe!� � � � � � � � � � ^oֆ� �D�!Ȩ0 &BibB �ؼY.Aq|i~)ONb vpa@d> /ZN?6nL\dn,TzmgIr-%Ŗ?飗_~96nڵ}M۷O۷ѣ#n ^`j޼,-[6<xY5͑8pH_~_ÇK IW_-/ iY@ 1-Yrl$r"=%JHÐ|yfF� � � � � � � � � �%36E�@�@�@�@�HMi2)=V(^܏=v$}}/dOsj@v&MIsJ9rHMJW\[i^(D ,3ғOJ+2y,>Zl{O={tz#jʸu纸g1b ) fB~d% tСc\,(KL?!Wn֯zK^}K]&˗Ca "u9"mZ i$O$QODqH;REʕ˿ E�@�@�@�@�@�@�@�@�@�Z 7j:ᇡZ"A�@�j]Fl)tzX? ؗ-"�DŻ͓fÏAbtV͏>6h6JdD=/M.;JmJ FF03Fi:顇;$w latuiR\o JC{=ܣAZxN;,D�H>(پo @<x0še˖M󎮼 ؿm{7ސ,w)~dݢw, #e4Pd0\)>IժR8:x$ � � � � � � � � � N\B�@�@�@�@�} BlG"KW]%5j 8Y#,`_ÏISH{HUn:te-Vn]/J– ݻ��@�IDATvܩޏIK.qϝN:I O>&Lٳg-1bD8V:@ B, ۵kW/Z҆+W.]6B"府7JÇKCJ WH6l1*PԪ?'FhQB- (/} C|NO,q@�@�@�@�@�@�@�@�@��!Pj,@�@�@�@�@ >Z1?i6(]Dzu){v|�??!8iuT||e?HSbh,<cRٲҘ1ggXnX`1{#bC=m] ٯZwpXmԨQ[F\1{B�[窻##y\,;Ӥ;gd7͗^*+nec ' sUُ6,[&-\'魷K+"-Y˕q@�@�@�@�@�@�@�@�@�@ = ӣe@�@�@�@�@�8|XZX㯿v|fKUHI7ݎ.!gĨʕ uSOڵ}@֩fŴqr>< s;wLo2FoY9rnٲEO<?|ݻŬY4h r0O*UrteW^Zb *Q:$ˋA?aYv͚5)lj#Ъd /HG!۴j\#/9e$ ymGRl#z|_+PA(reI_ � � � � � � � � � @Jَ)32rZϞ>0#: � �(0jdB11!�'0=tO!-l1 F}yF]IwKrIs =ܸԠT`ȪS% >Z$.N9ŏt(| m׻ȑra>?TbLl#Wުd˗/סC2+Ο?_UtE y/dX%D8Mjڴi)lj+`?0tާo_sg){7#C� ؏X ҽ==V'0dCMyL � � � � � � � � � @ @2@�@ EB)p"  &d@ v,h3پL~?T~cݺk#1!@v?Zql? Ӥ}@vÍ*2UAi _J^|Q-SWr{9sE4iev}ž={TF YcǪSNJ�Q C?fe˖ի9C"oc4yTtL;:nCF@V ڕL\L.rHDI.5kJ dըY/ � � � � � � � � �d�!Ȭg � @!"� 4�d֭~Ѣ3f%KÇEIKիѹL D�~)!ϒ,ڱ?uTP W$Tuԯd_:(U6m׮~dW_}U7pC fI]+r,XPk֬Q|2"^{uȑcJ;7GW`"?9|a\XG:|{ޮp ؾŋH؋E"m{yE!ϵjI {@�@�@�@�@�@�@�@�@�)@2ڬ @�BBQx1d@  ӀE@� X4‚*-hgH*x�,N(`֙3? -U~A*QℋDwK'u&TrmRmŵkСCnNٲeSLfϺݺ袋gX6Dwܡ^x!I r˖-.E+n_|G!]yt/_L @m! Jv,]:iB,^<CJ � � � � � � � � � a #a8 � @ [ � G�&FI\ʿtI~,S&%q:dƍ%B|џ-Ʉ@ X|嗥S*RD.d%~n-GQW_px9sTΝt.,h֬~g}:s3�&Я_?+GcSmu1Ŝ}6Lz-iRN ?s!@c`A@m?NK8찏17+D�@�@�@�@�@�@�@�@�@AWF�@�b_dl!ħ�!j@̘t^_W~3Em&:pBYgG @֫ucS$׭QGz)opu! uOwyF{b<.￯/ɬ3o߮RJ){ڸqN9ZE�( 7ܠCz;v:uE[P+`ᅲ|S#a k^'Ҿ_~,?گ%@ >lIg DtISGaB�@�@�@�@�@�@�@�@�@� y #B�@�"JdD �!ȐQ 3ɓWkܼbʖMREg)5j$.g@l.(i4aBBq)OeK?رԤ#G!!I%{4|ԹRj2@,_?{I5 y+,qOŋO3v;wjǎ]dcڽ{&N'|Eu긘j?t;}СCi-&ý�hΕ+MuΗ/w,X y\&Hǽ=9dO7|ū]-NJ);wAj \`c hH魷ʕZ[^chJF3F*Sė%roW^텏7V@C{|َ۔}вvŊi1rDփ@lؐ4"ׯ aH;bEy5 E�@�@�@�@�@�@�@�@�@ AF p@�@�H iA�B#@24,b[ >4c?ۗW*_m< /zDL ӥɓ&#}B+Ä@ ^yEzA0s%[jX#]Uk^-gΜȚMv /i woO/be!+7blْd޶m`& ]Yt-1q \P\-&m[vM6.f)R$\hQ/ea.-isRd1!G X͛7k֭Ax۟} cb vhMr\tϯʕ+ &<&~'><<@}�{ Ⰵݯ$y|A/8^dI)cKÆ5kS.{25jYol1 \fb+sլY4g-_\+VDa 8dph!e{\nקO?]*U's@uγ0!@h\͛4i~O@dts @�@�@�@�@�@�@�@�@�4BF˂@�@� #[�$ \@ \H| ӥugG8CjX.#5jH;wO?|l?Y*p4ujBq4NA~lf@Y9Y,`~?ҝwJ=G?xX XL*B~^BlzHUVi+nټzjYϭwK<ɓ'IhL N蕅ނ"pY=p/xAw)XZO|EO*Q,Sʕ+ezXʗ//3dB =qnq{w Z9=vء&"qnsz i[q+786AҞ)E/-1ylɞc-iQHK.-{>9О3Rر~ҽ|yq/N:,]{A0L?vMy'{… {џ ZxbVh B*T^3d&{Mמ+W MZprɒ%^r+[0jժjڴڴim۪f͚'Z�ġHMe=}+ "q"ǩ,@�@�@�@�@�@�@�@�@�@  M@�@� _7[�#@2~nkزE1Ï>Z⏮CM*ńIcX$@2dzlF�LʬY Gؑk0UBCU&E#EGj^zeV(�4HԲe˴h"/\5˽X-yN;-@,bVʽ(ŋ=�,g9kڡ,<iEԢ*UxseW3!{Lm^("q7[<γl0Y1B ly;Ǽ=7X)e JZr isBڴ}ɞ ٢ALyTuj7%a!k`)ɱz_pj/kĉmh͛e˖jذׯ=m=u~?T9onv]ݺuSѢEb~z -iNl-5 i6� � � � � � � � � bB!eq � @ [A�|B@ ^˿4T\B1?+6 Xfڴijڴiڮĥ@ ''L A]ǎ~�=$@ 5#xYoKt"a*36/X>ZNTzؠ*T۽E]eލj.-,xӂ@_Uzu u\jժ)G7H5[\ .f.]Ի/ٳێ\ryk lA sf1W\j7^Aܹs7ٳ{ٞju͚5ӳ*:^c6w|i&?vSC8Pr,O>є)S묳R.]ԦM5nX9sL2}avLvoF&M"Z҅^"Wxp!ۋDZf E"Nv#� � � � � � � � �DdHY �  ce@ A#KfI?,MϮ+BRɒ &MvZF/Bw V`ijmG?֫gQЮ!+"|4st#X>#,8U~7mw8gYΦ… vG#"ܧXՔ)"7[͉d[H2w^AjذâEF61Qxx0["u6Ybaٲe M%Kg0[s}| d=>lxMXLСݺI#FH?\Æ _y .P=tgPBǽ~ioV}>SY4k׮ݻL ~"]ܽϗ ˅^?^ֈ� � � � � � � � � @ [ � �&@2n�Hd Y d,H>Zqlb,شdʅvO?^z%/j%4S_&$]#Ţ-xΙ3>}j*`Czuuki`nݴ^!z-teSPto޴Y Ң|u\.SLT`Ν Z,&|y}{5k;N3Ko n_\_ňgzQPZ8^x͚5u{̐v^"`EByÆ Ftиqc5jHgqL}s\U(=3EӾF*Un۶M^|Eԩ/iXv GI?U7t'v 1!@ HݺC޳{=ǹs{[(2!� � � � � � � � � / f;@�@�  WC�"\d@ w?hGҌ댸\ =ZեlَYDHOݻ֭[1cƄt, xpCBu5_Ա?[5@ z-ZUW\ 8pM8= 7oE,UV-p!ŭYƽgbjviժڶmE͋.^{㏚6mc%6l(VNTbNqh~l1QYPl*݇{h/ǥO%,^\ۄȷt ௻} t{1 *x1t+Wz7xûp ߿+C[ɦ ;i D ^\Re@�@�@�@�@�@�@�@�@ AFӭX@�@�, �!0 Ȱ-~ѵDdG;t=/le_أk@xIDd <^5C *\{<NjL?k'xʛAgk&X~ңJŃbq%0{lVcǎՔ)S]J.Zl͛{!Xv El2/ O?iɚ3g8_Ew9眣6mxq,bܮvM0m,ڙUhC-Bw0l۽XEb-6j{s :tne'˴طmȑ5o^Ҷ>WdӾ;d1ȧzJbv1x[I)"Ε{K]՛ '![6(6*@�@�@�@�@�@�@�@�@�H )@�@�"Td0 8IB' @ dU|%K#GO͚KH *g}֋-Dx&`YK;wJ']EeD#m+HZ9dԠA􌟑Fݻ/ҋr,YҋYm۶Zjn #(-?wiY|pw7+W.+ټyy믽C qn{6l\r&Q |r/9i$M8QK.,۵kWoQFok޽!>rAutw@ij\r9p@oMѢEkK.ql")??! iHEYo=֮?1!� � � � � � � � �   Vb � @ B|V�d�!Le \AӦ%-i1HQ&IÏ%J,=cժUP&O֭[gXX9$`qyiFX1}cj4bƂ@ .{ z)wo)[FU~oFT˖-խ[7/T^=wNdbcǎ"cƌ֭[ugK/UϞ=]L,܂+VO>\.gΜ9眣N:~ʞ={U#T`+Y(oK+W\ /{{Y՞=k-{v<ߛ6믿 qV޽)M$?Szޥo߾^~ԃ bC~u{@dݺͥK � � � � � � � � �#@2vnK@�BB@�, 7@ .lSJ6y;ԠԬYBpL.]i&-Z4.nK6~tpJ)~mۄ=֣屝6r&0gԯ4etO1H' Ç{~[~Q] .VDI-כ׮]-ZW^˸]zF>@ʔ)={:(o޼i\C k_9s.ϼsɒ%HW\͛g�3ٳg޽{5d/pE,n{7SNѣm\BĉN]֛Lj(d:R0/'@l& � � � � � � � � @ !� �%@2nF�Jd$YI vx: Tɏ>Zs <ykF?zJׯ3bNB`ViD?h =]#H;\Nb%\RرCza饗ƍ"@gxQND=o_]\sκ+T~+2!yٳNjAZiӦ8eqC8-[V^zk(yg C"j*?ԴiTjUG{VRB^ * o[S* 3fxdB�ظQ;ן- i$JPd}_@�@�@�@�@�@�@�@� BY:@�@�( E7CE�!@2X\RXV.~in`AI?!^ѾHK_e˖iYl ~LI?f7Yբ6i#wU9B(]wI٥}]!\B] b;E;u]ҥKc@T ۷ODW}ݧ . w<x^{5/y{QvŽMTl/_~[Çիwܡ-Z{YW[dAA)gΜZuL]P}^~e5&7B�t >n CqMc vXT>E�@�@�@�@�@�@�@�@�@dA G�@�b\dlĭ�!ȸp2$p4sO ʕRRZ~ysX;=֭[+Y8 Xp] M~Ǽ(zuS'C}{hXjX@Or 3/hb"w,z.\| \ysbM]d<8}J*ztEc q+V';Cʕ+ח~ի ?q$p3<_h:s"J_M7ݤ'|RD-[?ꫯna I{ܤHn?d?PN6~SNɤX@�@�@�@�@�@�@�@�@�ce@�@�@�@�Ș f̐o{WjRjD*T(ckYL/M`x9sIҎRٲRǎҵ7O`NGASM÷~?7oBHCUv4ydj*~�Ҹ]>nH]yjР38# 6lE̠{1ս{n6zW.]yzꩧqâlGOd&<~Č˗/]fZX$D@ 瞛%Ky"|#C*9rȅPJN/H!� � � � � � � � �$~}34SϞr>04c) � �Y/0jdB1뷉 �H|O"@ k֬O?I.e.fZHkԐ\3!Ytiǵ˗q�khQ�}�=֙@ kl?̝wJvI?.t5a,0rHr-*Qy}ٱlGV\{W}!{X9b{ x@~;sbeB* C>bX>$edQ 6T=4lذ,Aw>Y^2~-E�P <(-]!M8rY2\C}[<@�@�@�@�@�@�@�@�@ AFƘ@�@�0  #6B�(@2ج ؼُ>4e4}{TԬYBю*aX�+Ydɒ0"?,'ʗOj&!:#^K\Lŋ|wII]R♹F{uћ~̙3^98=G 𢐵jՊ5k誫̙35`�x+3!q~gp }z뭷ԥK^>3δ`U4c b632={qƪPƌp=@ U} 0y ?1%CeS]$g � � � � � � � � �Ġ�MB�@�@�@�@ XH vpE5VZj֔e aJ/y/pkҤIʑ#GJ=i LزmrM?hGy\~kcRܡ^3C�X'%keqN$awy^zԩ^DwܩO>D_|[mٲ%?r5ؗ_~>̻B�SN4g] hBgwE7Ͻ,KI(7=ƎEF%KYAۢ6{wM7|s=yiӦ_{>a^ўwn"^{MbZ*U\45i$^ތ֭[{y=zH�dD O~|ē;7!i=uK.4YwѢq@�@�@�@�@�@�@�@�@�X +$ہ� � � � {JӧE7m Hg)S~`XJ7ϟUza ol94`B ~uKtԠԥ3R6RX@�P |t֭c_?p(HbΝ={v~q/pf۾}ۧZ;vF7 ?vd Xkذaڼyspv&^+(T{W_}vڅk!_τ Խ{w[/b!T-W+W?\=xL!իW{HowᤆnIm\+̙EPsWϿ˼gCU{ _魷u]kڵ>{Ov_>CBs͞dXY@5kω/jo!ȑr1|ReA YT/_p@�@�@�@�@�@�@�@�@ m#g � � � �Ĺƍђ:*m+x@6Mr  HD 3v)[iѢmmZ-}s :?|RQ*RDI5JjPiiLi@kW"`*deҹJ^Z.nd-uWj7n\D fL}U͚5V p%KhI"vxGW^.*a?LVcM,fh-ZEo& <d݈ x('Lvt�4N\ebzm 6&^ynE_z%/8>c w}wf,>UI&y+V\POfnv0!�Y)Po曥!Ct]g$qT߲4i",(U&>V?-a � � � � � � � � �yIQo#H΂( HDPAPSSπgĈJF#()(I "$$# Ie,NyvWu,vVWD@D@D@D@D@D@D@D@D P5mZr8ʼ%&%Z�eZR1K>ӝ@VZ83qwc͚5;kϪUf]I)cm�o !O=5̅*;ؿߓ2ma/H@*~]C&a&6p ygp%J_E=pM7Xn]̃>W~.ٲg-oRh e-Z0l@ܹSV'/?L4<Y +6k[3X{x7LڵxѨ\2Ddq<tbT}駟b1oȜYnFœ'`&e~h\ EtH/3/K~F:i%% 'f8" " " " " " " " "�4WO MCgtho,|8qo&M{ggyUΝϝ<W_uqơB 8~ArGN7o֭a'~4@ غwkC0JaO?}FT`6l0y.1˗/SO=ePti')<x0 (u_Fp;1uaPHTX/bRn[lmd-Z{6gXI>s1bŊ.{έ/^8ʠq]6l|ΐ^3f|ׯk}A}_uobРAN _`ذa5jwy]=7vm87nLt„ Ne˖7cƌI:z+.b0DF 6m~O> .t}œ xoDZNо}{رc6J7 }/>g]ty뮻W_}EiFc@Vb_Xzj4h[ݘrE1=~#I 7'a:ݘc0|pݻ={DYJ3X7 {nL; J[{nٙxn |'Gom۶H]8oꫯﻱJy ۡCbF^;ʤo(8%8u ^e–2Hzu/^vYri5.MCRi+"!) Dm@eUWx9 " " " " Ay5BD@b�ʿ0,HTqI0s7 gPм9`.7d9^�eP(D_/k׮ 'd�WfMԮ]7nt;RHAfΜ=z$ E59-W¤I^q*`Ah 'k@&(vμKv ^z &AK,a$@Yc@RĹINÇ;!mےAׯ_奈˗wsIv!̐,Σ(42ܔ46 1OYmժkQ5~x\uUؾ}9\x�u>ĉ^UT))C$7$s匏?JQ`l,}qby湶d^aPFIlKge/f\IxL:>�̱>ܧ٦)z$oƝ7̓ɓ';eӧǁދ~K,q+?ý %?|X~]vuz~#be1(ϵ+V8Y/bs=N@)ܤĐ;xr}F [JXfEI%T�/Բ(46mڀV9 roψ߬Y\H,4j(ӱySF{饗D&/8O6͍"ʸ1N2e@džLF#)%ŷr3y\#'( g8kBJC(arG <7[Jn77 /[nia,ko׮]馛�X;]RRMi#F0Y/}kdsbHJ"y!n<"VD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D ػD@D@D@D@D@D@D@D@D@9W0 p90)pҥa̭[ab ࡇ`I 8sN-ZI [ou>FN.]?QF9I''nC$>Le[a뫯~ vn.n0JZ�o&(y5?${Hc˖-C|P17o^TV-Ej@E[ dUfF4XUߙe3o >'+܋bG {1'sK>y1Y]-Pxڵk$W2? (=Pmč뎷|ͮS5J?y)mdE(4hzu99*@yG}^FQ_VGqM:t_ٳgT~V Ǿxa,cJs:Ν# /'d^}U'2Eܥ\޽ׯ79akz Ű? R2}YwQnjYQK/)h\XbY7#~!^4W\s(ckp%xp\h JY  ُSK.N\wuj[ZpϱSJ#(o] fQُT( qb` }{gŊ]uFkz-ׯxF"/DSD@r@lL"l{It0U~=`Hr]O^AD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D ^˜8-ރ1)x��@�IDAT `LT&gJDK(5i 4p"]JRPfMJDӵ ?ZH͘&M 4o^>L>` "(z8aF `b]jD@r\6R"GYN; )v\nz)pYR|6f� V1 Ev~eT-[^zNZG$EX pp5tPߥ^ʏ.Pvw>g_0ܑ<)b`>xu i~;7`.v0JȏRP 6ĬYܙ1 @ӦM=ŏ\r.\[l<?>~oz/@( e ,)w^Rqؒ!O.첤Or]~쬄ƅ"E$cr)s<^?DF~rgt-6RI25ϙ /н�cѸk3f]^'_<@mm>y9M�콤j"/Ŀ{ ؋5`r`؜'9["$%H'%" " " " " " " " Y"i'|4N,=8ԭ y0ʖR9 ,XV5[pmaʕZjm<yJ�%szGs%at?a'm[aLf@ӌ/(~5O(ʩ<hs%]v%)b܉4 殺*;Nٿ +Vpe=&k5[k!7|3{=D бcGQX1i,t."|n.6QfI~ z-Y^`.o^Pt3SΝ;qYg9)`\SgJϔQ`K"9sxJ'8p :wlBvNJ9`zU# /˘\, +Wwq)笞ӡj)*C-q Zq!x\`,>g}͍&7zs_XNA駟~YRJeIfnFAB93}0(Hf3(S\=cJ]o\In+aI2s$n`^|8/<Ĥ, " " " " " " " " " " " " " " " " " "i46h@6l� S=aBa`v`<W]% ntI%+dM}ZN@tt@&^_?$75k`& I Q�e?]-ƏF2yL5aÆT"TPYJ6m=zݻѻwo'"+T+aGo>l޼WpXD ǖsA ј?ˣ2uXzuU[o,_~xq58/q!N\pl@ q7:i&iHVY魛5kcweKT޽]{#ֱ4N<G|0auaV9rժUszdi1v~!~'Eu5gK,כo+`(ko]cN(?o9 ȱq'a ~}Z:e~iRl >)6^yGr$٧~G$S" "zyw̘Lxho >  w"YD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@"C@"pU" " " " " " " " qN`Z`&�*T�>pW_;v� /x2J7" fL-b?0IԴ 찣W/\9vmǽz Xظ6 zbŠ/kQD nLԭ ^o.nJ Tlٲk/H䜊B (TIfefߕ駟J*N&j7S߁Hq-/ vP~}裏g!塇?wJbEduKF-<(2DBA%W^骲w^`tv&4zPZT}h I߾}i&w.\S ɓ'- 2;_Na'c�A _Kx>eu|ˌ d_j$ ~m~G,Xm?,? 0�)>-UVȉeC*}cZǗ7o1/A#yᇓ9tPu.ies CNBD@@b@fqx5ض 0/46^i�(\6  >1" " " " " " " " " " " " " " " " " "[D@D@D@D@D@D@D@D@D@2'oЍ~8/wع0 {h&<_,Y*Zɕlݺ|pݮ]믿tUYv1r$'\;v́;<r)T_vj.)@ЦM\ve&*7SyvR)K/Э[7Wl=֬mٲlժUGՐ1C:+>/kѢ|;Tsſ/'SOYgTVZۜȰC8N^UhQ7?d~m'ѣ^~eߖO0ܹs(`k$e˖(fFo2N_vYFk @Q ֭Kz\R!|Qc=QF% ~|g&NL {w {ޑΐ@NO./ynsR@a%J <hMp n]f E ioe$t_ '1 8R6;m4<Xr%K/$AE?({PV`feZfɓ%4qc_wy?#(Y{3:Wjk~xy"5׃3g&;ޅPEim|�GNW6ҥK~i}7i~w]PU^Ȝ1Pau a#?য়pT5\6'K%m*)S<djD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D [-`T#Gړ|PAD@D ~61"n7}rK P7':@E@}]V&*T(`4h@ժU tkzf |3֭[L2G v8ryM>L}VD@"KС@?  *W><)w^A=\نuqSO=57nhժUa1cL綛,еkWWO.䒤7YaHL0W / s=IL>0yenf򶀉ҬOZ-`Bã6͘1#`2WX68Պ7xT9aȐ!>}]j"_ns\NMmRCX˭3e`ѢEv&qiҤI,LΙ">7.Pl v3u̙T7?3i^^X}3yHmy= Ç\ LKbԀ)ȹϫ *L0b>/<N&iuy>.qo/^<`Ĥ2[h _B.k)Ƌۻ 6tΝ;3۞?}>lR7e6<LC^L&9 ^NY8ƕ)S&P~}7^ل]s[zdW6ބU.0etw-q޽ٷU0`@RL*O޽&5`rROz&e{4N+79'Q9v̀'-8@bu94(;7ϜJpGWg\D@D@D@D@ry^f9&@D@D�?௰>? <mۀ)Sɓd 7/Шpy^l(\8曪`ĉ;w1|[_3g&50kp0p@۶^<\XXh(" S}<@(Iy@dlٲ&UI0zh,2eڵka"H &\I26ϮaB+lذ&KtϞ=Xr%TE=&Dɒ%]R{nʹm,D08J.5۽w^/i]F deH2MF}7mY?~6zOw5\cS'؜&}1L@ F>|8ʗ/m-ڿ] $ȗ/_sر# 'xQ|9 ǹx�x`vp't)43~̄}XRR5agGޥK??iGROO<^x<SxG"UQ@;w TѼyϊpu0(/^ Äbf[l :SN1SoUTD@MhQh شy�ժu^e^"tە(Nl& d6Wq" " " "k$#@h$ oEwy7Jl Yx90L|sPB#p;СCCz;¼yci0!0@mxl٨o*("aÆ]:L(BDn #F?nBӇM~n O?4> kLdc,J(СCt󪫮to 7܀"E`ԨQUVNT#"eR|ګW/?o9"ϬVAn޼9˒Pˊs3XwҪ{qLk߾=֭[9s$r3RmDbSd9~jk+VCRzrSȋ/28yQD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@@l=UTX"p0kVҷh(Q"Zf%KqƠH7\@K• e0iLxW_ƂO!#""(x oP$L<tMW#@1p@'۝_Fvbt׬Y3bmŋwsmaڵxo߾NKzl˗/I6}7qzѯ_?P0a۶mx*O$<!hOZceIZf'G$gϞuTR>K{_6zO!5)0aB<aV[D@D M׹pa$r)(N9%3�'zQU?V@NsE*_D@D(20, "u8Y Y޽iy7۴{�0* E}H"a3)?t@!r֯O&N~ (V 8\s8L WA9&Ӂ>}� dx�xQ Fry�Tl!}vLO>$Zh-en7ntw}CѨQFe{?]?oҤ yt1[񗙕o 6 FÆ qwwZ& XIR : qg-?O<Tf{~{ƍ d5QD@`ѢHQҥ�Uuzn@AdŊ8aO5\D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@rD9�]E@,2*" 2tV3P^(]8d#SO۶'&yHz ~y1!$V/|<7jՎ7W}_23>c=z4Zl rWD K,qrCJ*. ի3π»ʕ+o߾NXhliΝ;SS@0*@vKqƏos7@bӦM,}] ˣ[oų>~8}1ky'~q7g[D@D .?,(/[{A*Ⱦ)同|D&D@D@D@D HgT HS!^0eJ6& l<ySv@z@\bCD ޽wylj:5ďmx3Դ,"#Gނ�>嗧։@0_~1bʗ/o_=N9mZ8ĦMƳ>=tb}sqFOt ![nl3QIVZe4h[D.Rs=h֬Y>ѶooG>}+ o޼VŘÇqw\)%W&7Q p̸kWJɂH!)C E" " " " " " " " " " " " " " " " " "5Af# dr5XD AH :_  x9 2&@8t`q$o8?m ŋ'<*+}z'Pp2Ю"g6mڄ{QwM{Y9hOs�MCyPrxW:W&M⧡aj1f 0[n+83хa¬lru0j(|ǘ5kVn^{-N>]hgի접ʔ)W [lǸ9sDΝSlȈ&!)r oS|QG "uΈ2E@D@D@D@" QHBD@₀Dqq{o;SO??2Cu s: F`OHw{+z6m4F v\~۶? >pyo�jEUC.GB_c}ѱcG(Q"rD Mw=z5k޽{; 4rtG1bΝrʹ>ީS' wV@4v޼y7nƎe:i=дihvuZh) ߏ7|Ӊ3vH"@m>}PL]ԭ[7iD@D@DX 8�S rHJ"ˑWX7D}OD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D ^ HGV02L D 쀨:)sd#wU+ ))0}8#bEqd`vOJI[۶^R%戀d+Jf �y&^z =[D ٳljF 5o_|/4Eʕ+ڥ M6aԨ0adL{\Jv$ZzJר(իAi̙37o^s9N{ܹsGQUD'aL4Ƅ .nʕ+K.NkU<wƽk^% ؼy3Npr7ڜ%+V,/h]~RH_d @qMQFJ9$E|@2qZ." " " !2$LID@bD1w˗_~N8d#%5)v#Y~=P'MXثE"~& ̓asr.*Sb}_cر67nt2vfleUjT(#cL6ͤyxb<k2G/![cR/ OOҸ1P~r,Y2#nFvϙRY`n-Z0q 'HTx j*̘1Sǣ)S`ʕNXڡC0֠a)Ne̷r0a;>(RHؚEy/ďJ;ǖ%" " O*ȵkK~ޱ`u3a/[9D? " " " "$Q*\D@"F@"ȈU!<N %ڷb !fD@b|\8ѓ?!|f`(/6iTTY('�}h{>ʫ@LXh& J(>}:݋SN97oMAJ/1sL|wXhrP(mo7u꜃+ ..N{W-!sٲ@Æ�瘾 Rok`ɒ%&p䤜<6[lq:NQJ`u9s`٘5kv3nI_Z}82ڵII!QڊWkxWsϹv?C馛 F{=#஻2 |Z" "v:Z{=P'DVRD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@H@"," " " "h$L#$  HGW;JғsNqE�aa誳j#"pM󤏔?ΛI/~`/K9@j}!`~7xEW{@2ޏ?)Sm߾I(Q jܿjժeR7�blذIx7ɑK-PUV�{s@&<1$)?;-"n-sYpٞ3΀ K7s+Vp~E9r't5jdbժUMX#cMTwOq5 `rʙȵɐ:֯?? 䰞$rz%J?˭[7NKwޙp2ֵk^sH/7|@x" " qGc^ "}ώ{+W3pw AˑT;D@D@D@D B$Xe+" 9L@">� Rԩ_xGsDX1 <c)$ 5SL'Mf8Ԭ,~l&I (j@0Ƥ}ϑPHX2Če˩țrwqrڵkꙹLYa&Stw˞={tR3f1Y`K)1c\2:,63cƍ.3I'a\`*/'͚mx//}Bx)dk),rȂfdfzMAT=(|\fVfm#% e˖EC{k�eR�YBRjÉ#=Y%I;vxv'$җ%4evod7o矏k]t1Q207N|6oƝ7`z6ׄ?$"  Or{ 9 Dn9ToC)/ǮVM/_KG�D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@bD1qTI9A{," $ d$&v<?70.-Z/Hx#`~'�ĉosm t+o-W{D@pos)W@O [. h V\lNt,vm*QQWzXJFB:;?3/_�.1Z-ʕ KFӦMѺukԯ_RJ <A$*S(󕒕P@rK V CػwBP�o,F.e?gK(_͌D+RBuc_e_DQ H;՜WFJ"EkZC zcܗNJd'k^Vݻwol~1I ^{-.I h k&ospĹðgo!2Wb(^D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@2 dpID@D@D@D�Rg' T`=g?=Xy@ǎ^X1jrE@"E|ŏ=m x"O#cj*]@|0a(Kms~/{=!9F27nq0gDf,O79ih7LO5 5r !0M믿:#5k`ժU.r2E& <)zm5m]g}gϞꪫ1L-ہK3h#(4aRȝ0gݓl [%54B eˌR'@n _WTEu~fPK .*6ofq){zj,䶎Un}'ǂZjqzvJ t3))LHv|%IV-{Ѫ)|՗P:|p3ӧOwsŅ^VZAֶ~S ϵy[{W_}S y[K/E=pI'e)2D@D@D 8 }17|J/L D;BP@l2j+" " " N@"lGE@D [H-=(~3Ob䓁/ď\�_ KP/M,dg?7Df#A-"J}n[ny(Y2ohO Н:?+,?p_@?RG!%d|BҥK|I\r([ݯ)SE K!jF͛7H#)`C?!dJ1/S=@$d9REWn1L9s|̚"9O޷/f/DӦ0L^c?QH�s bAJ)63bŊXF{1'`[(c_ܲe (# ?2>1p%g9T2i'%1R eJ`tsRqsғDRԋl.0ew )QmjTQuErv9Sc5~mf&❁{vk3^bRJ>@sv|1$ :1DX"" " " " " " " " " " " " " " " " I@"@2ޏ'"$L#޹и'y+`nAOұ#иpNW#>o~LE0>;Ye1D@D ' O<:а!@F9Y#-M<nj/ɘ<!<Efo)#̗B'I(2L28PLFTɒL Yq{QD w_Sp"9?(P 8Y?L{]\i:J(d͛&}QH^ Ě裏xwA?O0Æ رcqgϞ=ѹsg*T8rϾZ1s&?x2 ")T sdB9!+WB`X,S>M ,/(%|!}BH?Em 汿LIl6߿ߍLِ4uX;v8#FnBMhˌ?r|oU,[I!y/eƟS^kՁ5Z5: .e֘o}Y?`ʕNsL3VP=O3-E˼OyvM*(}m%M49c/heN0D@D@D@"BsʰS "MLR99TD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D A H^P H*)'" E@":^9U[*ϼ8uW {]�s " qBӓŏsx _?YhI  0bp}s7(1u\X5"Уf('佁LyFUӬ hQ />;tjɦh~"5& R<f%2+x`#&~7@"]QV̝L) OL#(w@a+;l�3;(/r\}8,|e:i{R9߻i.R|?kR%o)cŊvS�ϔBnٲ}*SbD_~O!iF}CrH?kbO]ZX?1uǀ`cjez\J-)L-8K1双lBJr׬d+V$\ް`0}٫f2Ħ,0>zB h"Z*Im~9+<(E\5˔ קJ6Q8YԩSs"X�\@<ަ)c7JkN),Ҝ " " " " " " " " " " " " " " " " " @@"c@"2*"H$L0z'z;& �:t�:w.&Z~[D : ٳŏ3g$ @G(:Z$6K})S<#%z< >|?޻'s`v)YبQxˉ܆nWIR׃6 )nϞ=I"6_R_1(?JZw '$I') O/s\1HqơO>_GV}} bs(_<z^z. #1(T7/9Rfנ…9՜|vz(;O i4yrH "; a p!~,`LkSt1:~P2'|=_6QmEqc�?+d\a/�_{{mxv7s}e aߣ%P~z'Q`#ZHJF2)U-K-7)5j漱NVD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@DM\剀@2+" !2DP ۏ?zO>V?2i$5S☀yxqqT&I?AAD@9S+x&ФIVW"k@# D7k\z'R%ne)୷^x0b(-GK=C-kG7Rΰ|r :5fLꫯvbrʅˋod9$EPN9dժ}:rs{x(4OiR(SƓQ(!}sezOD@Ev'\쿌 l!~ワ}gO/{@t\f”e˼mj>Z�Z1k" " " "($L#v$ 툧l#qhaJ.b�$ " M`ժdI-@R@5b@ Jf8G_-[>'z*/ܓŸtRJΙ|׬񤋔ΜWj< }~_5z2ٻヒN:–̒6nd b͑&@܍mۢw&,  [Yѐ%!>罬2 5Ղ͛{ i�(=;RHɜ/`cE ; <_[J^r �~ȓrקٯ|)#s@fɒey~}/VMyt@2ю+" " " Y$ diwAȁ c5 [03DԪ,l0)+!@ 91RvD9$Pe9R=*" D¶o&^x(S昲җD@oy|P ׾'ED5xQ� &r:ē,wڅ  u]^{ EfI_�u椐7Wـ˗{rH!v<yoHI$cѢDRԑ9e,<XQ(G1KpEsH@BHF^7nLLΝ):i2~d3%}1,Xy?u$ ")[(V,ǪE@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D [H-U. cة" " 3?ێ.SBI2?. RAD v kS& ̩IdcӦ@|F\D q < ޜ7Z.C_Gf .ؓ?^txRc@~{rhs }}nF,Y}I J,ÇM8+W65rWCH *VL)18|\Z)'!) l.B>P*JE@RG2R"$"OLC. 0Rg.Qbd~Z86,^,(rBoOO)9+Uh[" " " " " " " " " " " " " " " " H@"h<*D `*" "FAfeEiȑ~׭^=*ꈀLӁI<?|m[/s JH@S;(Q/}?|@N];@=y/Խ~ .Z"HRh@;<s{ pXhB6$g^ Epѕ=_ !)dB Q#OmMyl ݱ]��@�IDAT9^CB bH_*Gcg.S.W.,"p0u+`>])LmpPeJ%!eiEG^ɔID@D@Dhkd)≬9>3GFkD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D }AF[D@D@D@D@D: D@D > Hu,`O�I1xFkZ$@௿�'N�eժmxG(@<w|%Ыxxh AQ{Pԥ'?|D S�W]yL("H>b~'ηpȐ!&3_6f7?~< c"o޼Ny;9d6T!*ر#YK"WbHJ")Z؄D)/cK渼o_J\?8n~%JxJ N>�LHQ,S.3R٧3~_?esOD@D@D@=`)\z2<!cF]ASE@D@D@D [H-Ud; yD \ē?R�IqPXVDT" &)~4 rŏmJ({f>LnZJ8Qy/rox?RD# MCH?qX<.vz2(36iߔ->0w\Vu]޽{ ػ<$E`.M'RCRYflAR*Er9̒R9} yLX"ESP`0/~N?h$쳾$2}Dcg" " "[;ʕrH_ɗe0}bH.oy4 s|rAFRD@D Hyk|p飏`"  +z QPEUAD ֬ďqfOTк5@#ĮY�]E@bwɟ/o' lΝ=$܈&L�^xFÖDAv~dk[nɑC B6̤c;о}{'l(, IDŽ ŐD.Z<*ԯ!8ȉk&K!}9]L?_G=p"̤ZȝH_fJydcg?͟x "p4s;Ǚ 짾FNk9\VjDFK!<< EF*@v2<1ASuE@D DA*Jvμ&L, t[0 J!!w`dUedcÆ�# " "(½.`X{wॗrjO#S=1Y.D͞ tPEIff;;H"H<r|I<ݻ7z- /A3 ZD 7tj׮5"/sx)e*F0R!rhvZ:Q/S|Q#R~N+RPL(2HrLi\QuuYӜzH8|ҏ~OosK+rHI^V('OZk@$pn|y r|o/boOWڣE@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@"E@"HU" " " "'$f@*A0Ǎd;@!TBd;D(k8ы!&M6m<#EEn(@"8p�g*VDh(Y%@gyGs99Wǎ<<aXV9{/pyС@ұDAG/pfNO>ߔ# 0h Xef69qWp9RX)[,] P !)R7u&!)<- !)cG3~7i:ׅ*;R8iziB``2?]dsW؏vNIRf6ʪ EF"H^Ͼ " " "p(>8.[YbH (tVp21 i"  M@"=&Æ[ \}5еPp\5  7f𤏓&g|؟mV$Ww�7?N8!1Y"%(1sO:Ю',H#@M7'(0"H+VK.1)ޟgo>GF@ I60`�ƌcr|ѣB6n8k;އ_ɔs!y_DC&2&5bH9KQBKٗ[)E1=ρsA^ۂ#vg v(c ^Lq^w8*@484җH'x=%v:*#~? I/s;? ^vݛV+D@D@�?RIQVzjSE@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@DnjN_ dbgRD H]ǜG?{]s+V6" ) Pj1w'~8>&TڴďL˔I=}D"np/8r2: wJeGxdžý9W1Hd$;xEaӇ qNn۶ vR%KԣIGoBϞ=Me-,!ѓD!)Lҏg͛"s8x02<_]p\b<F3Q V<Dԑ)Sh'rH_Q6  z}!-ad42r*@<XƓbH\yf)5kJѿ" " " " " " " " " " " " " " " " 2=2Z/" " " "HAD@ⓀD9\ 00n??pu-Z|T >NIvN>9Yض- kED ~ucn)ʗxh.~گX21Xh JS7A@>>ʕͶ&GСC۷/}+;`Θ1FvUW[o5ia㨫k,UBRDV^kr玥$@ $ex;ޗ1g9^}@hɒ޼/r(]:en+[ۖ'OpZ!@d$2xU~^z/Q!3J)l) " " "Kxm CrG57_>vm {9TR@$6@2ݯ|�|!nЪp@׮@9W/,">k=/ܸ{Puk6mA[D@D <0л70pin/p }QSkD l�   ,\T kL,Ym{S<,@P \?<l.4Qvcuܷ~/FÆ Gv/p2(K`'O!bCJDVj%W8JVF"Iz|1$同u+eKr?sɤ(&,RH?\fJI1#Δ)@K(ce_cD_QO@a/ Dr9HVBsg~;.]R/{H=(@b2Z+" " " Y& d " "$D)In^={D@2'&MLW �Zď?6jɓy^CD@q@�%: 3f�͚y˔{/0rϫ+z$*Jn>ē?Nm“?r~3?38<bAN2Nα[hiC{[M7݄FBnZ֢4L> !JѫW/'SN8vuL!gR~z7D2VmUͣ�;wlM.)X0Y "zw20%HWIoQV˩#/,U[ /z (x ," ")ɑĐڵa1PUYD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D dAJ;@b21Z-"$̞ċy}0�ظ[<iI޼S""9={oď' z}S$Bc6ReR{?~DK{"HJqk^xIओ^.8y"#GocxO/|֧&@ժS%<;ݻwG0bm6 8^~g4o}5iiרcg �Cqro=dIrHJD ~"r=_@\ٲrHJMO;)+$o_J9ɟNe/R #y IoۂcB~.JE@D@D kqxK")uOo'K")KD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@⃀Dq  #V@2)|yM`8an�n)~%E fď&fg)<\XE%@,Іo䍛~)ˠB~(PߪT%qPOԬл7p@x[{ޙPم"{V %d)*ڄ-Z]oMiQ)׾YRvB%%RdW<\^w9s>5w̙yy3Yf@@2% 1cN:$kw믿BE,RScSO74)Typ .rԠM! /Đ_|}9$ZP;%OJ )\'K3}H!k%頃�- " o?)Frq/nɌP1$+Te >ssF," "@-ŐHޗe^2Tɾ*$ |)" " " "P$,p: ҁ_{ Xh 3`O1O?~ 0s&m/JsgR%8 :u+͘+OKgHv6?F(i@rH>G!Yg �O? {n'J59sDZ'& 2fE5j]OcÆ 8SpUWYjBX2(ԺHysਣN HW'G �)4vvm^GݺH.s*[6jC2(Ȭ&;moJe+?/U*c,," "*~͗C~ ".(gN Y3u@2~ύR&" " " qA@"ȸ8 JDDCȑ@{I6;b'yoP:e iʕ}#叜(DP%*,?p/g։@`ۅxoǜ~:p~{?x=_Y*@F'23;d;{eh8Kk.mgFƍqWO>(]t${8vi99$|a�%z2룏8QY|r]INl] \ ZO/`d^=~}_ " F "lh7sPR%9mYJP" "\v_A9d0}-*%%-ZKk@HlA&SE@D@D@D Hu�  }t`p୷_ x`V "j~~Asf/cee�:ΝfrT&@S}V"~x_z5Ц/mh;}O%K>xS"Ȝ_|;:u2)(\p;ߘBW^yEvꫯ61>]b9s+T5hK!Ysjv ::DF~�(A;S8CRq$g"+nbH #ׯ+ ]OWf@:R$j." "XPN1$<_}/jҋ!)4\<J@b2ϟR/" " " N@"|G@LH; n|a`<];`@S%Q8b_I+~:՗>N,[+s/~hJpXjȎG^"(ܰ!wg֋@ؽ<=o޽a27C/?b9ǗQ>ۯ_<2i2<fB׮]qyo~ <3xDZL'|2t1s|ID+B~`>RP4pQ~N!˖M+GC`XY^|9})FĶ~yRK9D"|q$-s]FqdѢ�吼O̹3cHD:VT'})$%.ry;, B|>{S?A[," " " IA@"Ȥ8ʄC@"}db6_2l?@3Zv7})" >�(tdpƎ=7nfŏ|N+T8H_ع/g-^<VD@D r천eyH`.Z1c2^kE Pd6wMs|nGOsZ)fL_O@* ?󎽀Tp <xp;acҤI1b(<.z !),&Fܝ5,�(=۟VMP(A " $m!/իǩ^ݗCR٨ީF 7 ,H8Ru|a$(??[PީZˡ%Pi." Ep؇R@ϼ'̗%(W6WHdA&SE@D@D@D�HY�u Ã#GsE�vVG`Ν6 i+lmfn'-v*h=fw#9)d\ .Y((Zf.,Q>SRPtis+_^ <,+&_5P<g0e 7ŏ]�;@_`]$W8X;2Sv[n}l:%ze+4zJyfuJɒ%]+.矾}K.MxGm- -5$@0j0mp}.+D�%Supi~;2T AFv_z%0{C#9/r„ ַ)+Dʕ8JXB3g_}巏XO{?QM9$ޯ{_IId0-Y[Zq(~}_&lLH5|nH"9'֗v%->CR頃Cu_! D@D f"p!C,j+ $!Ƨ|{ݡ'Т$0 )" " " "P$,:< gA,O&s˷pÆ nFƍfڼy6mڔ6ď9f3 X_ʲyZ-#v6/02ye6:e21 )s FRu8AHp,L˗w˜W GS'G2;eU�7�p3`6(}Թ?X8" Meꔠ A:%OeEW(x)ꕠ. Tdo<ȬɬaZbcc Xp `/7c:i+͚B۶}bh𛶁D Phʏa~zcLAn:wɷ?z> wII9b4hQoGG{/x'矏뮻ifOS{_O?%ϲ*lv?!@ X7 BE?/4+ׅu@lP"~}ȵkNrs֥A (2EVpQß- &r ")\v?(Wsbm܆3τeح z>ǓUFD@D@D@D@D@D@D@D@D@D@D@D@D@D@DV@r29Σr!"  Hyg`x/6kPQµFsr_nݺtz3!f B)*UTЊ˜( &J9PEqWլ2t932I(SʕMHQ%TjUtAn"h 0(x|)_AYsW?+W/-^D <̮N A@y9* 9bz%OyB2">X%rFr \--l�&2eyk]^uJJ'_Bʈ)PVx$6;>e"\ލo"3)Dgä @Q?DBD(dN%#7nf͚͛.8ދ/Çcٲe޽;z_!aӧCΜɺ`}{C_I1 BHvQɦ@I7/ԭK!)0F`'"@v{;M * D\ϰbg8bȌȃ얅@>[?ߗC 2&M ";,g  G?_dǀL2z= \?HeAWE@D@D@D AI@2I[~` &_?D0v�e[ O?1mlub#4CEAEQyy3#PUX6#\�B@)礀3TIyƍM6rbȃml͚5<X]6J,}v _>Ln[z(IAD ul۶)A}ZNF)d]Qjz:ˬS]og{.\.?Na]'s# o4ZjNQFZ-SxD ѣ}5e+=|=܃W^y$E 2Y)qaÀAQA"ܝy1Ǜ{}嗮{/~m<&H!9眃?Co#Ϙ{yv|)$-[>k$-;y& D\XW֪K!585m ")RH=X !)ė{g-~(a36R2ʾy[ NDR{rlQآ/ Hr`F�_<sD~C%_W𾸞+<EO," " " " " " " " " " " " " "r$LS @d$D! ~>AW|(3?I,_+VpUV!nݚvX ( @ H 'ʟ(xK!> |jF B'=)de luIׯNب+s9ȑ@00+79ݟgZ/"(+A}9EANrPUa$@q)zu tҨ]vZR^:uR…#�cm .�rA{/^~e,Y$O `z0SI('ni<}QҿD`޼yN{9k]{&Ͽ?�%&>&|yOi۶@ǎ$1db_:Eo"@ wKH?jBR H")=(&}/[v" *?w!9,uEU-E@D oBJ!A$|a#^^y챰{)g?_}n|<sx>$jX2g@8' d %OD@rI Edrsn ࠑT h,QՔpZx ^$pԵe:S]MMF0QXFBHI ~z`UJB)o6:w8/{#R`eʋ"D ܹ!Kzs pѢE쏢˵l}%TH &~FYh}:eʕNBi&ǡx}4lz(5jƍ|)J; `p5@޾p+3[1clٲֺ̾ gGAn~AΟ?mڴW\z(/Q%̾ >GTǀPJɃ5V9SӦrHsj!;uŐGoR2 �NCrn]'*Qh$ H{O#e˾H>78Q n'n9$D7qٚf " " $@9o $)< pK|<G @?|ab s>್bŊĨEHO@"<ID@D@D@D  3�GH*\0@r�p ,R$INl6me.\hiA n JH``#p_>(Xb61+ ٳ /X;n?&u,(Q!a<ďtr[Y("w("Fe~k?ؠNB 9#u ){ȉ hxŊN0JQu ݾ}۽ZjV_4CSp~ᇛ B.'Q:ȁl[t \{-Э[[9'ʼx |ر@y/2g_6koǙg$ +ȑ#Aqr>}p 7A %3qRH!9/lΗBvH Im mL/$)佦'~.Y^E@D #ː@ Ce7{67bڵ.s% ;%UWﱰPmGR|F >G|27o-Zh**" " " " " " " " " " " " " "h$L3@p" "P@RM~=`.<$P p$AA-=~;wuQk.+V 7v$J(KTF'Q2 "v2%&$]Ew*IlvA~cU Wvu 9ިc#ڃ$SXxH|<1d‰"R-Z6BhѢmsGe˖hݺ`)9d] YhVaڵYg7fǾ bG"R/X{n ;J.d݋ݯ =5+k]J1cvSO= BVR Cuɒb}9NΝa" RPF"{{\e.1K2D֨VHD@HU{g9^Ou_.]Z0E@D@2#0t(p=+*to?0({.oaF@ xU`s< !)s N # dsXD@D@D@"" dD$ TAn"�ÇLwm0L0*o5kfΜ> 08L2#460zÊW@~ؼy3ϟ&͛eߨTҶm[kL$3E�`A0-?72YpPNkD XxSW|W`]m6m\ºrl!TcHH+puF~6|ԨQXre;k|/7\-N9 LH \b裏v"`]RQg/4!`g'ڵk.jD!*:[CrC_ I9df0y{H!` ~_rH{`ҧ$5Ckɲ'n!)S 6+" H/w8&w:Yۆo@~L=N=u*:uY71"1Ê@2O&" " " @@"x8 JD@ m%0<&`�d賌ElT?eL6 ˗/G…Ѽyss1NѲeK4lh,Α{۷o^Ql:{lN뺓,(6.1d9kOP-ڵ 5kt3Zj%Jv\gVKzΜ9Z u Aǎ]º I#G_}50p`ބ> x Z*!2> XՁz6)g74%ޙaYOYuo*O> !?cdРA8Q/He6ɞ amz>bEX{CZ7%;OrOmʌrH6hh_A=E nbΝ>+ \T$;:u� |?x6Ͻo uW7 Q&4mZW 'Է!z>O"D:[JDDgE@D@D@D HTS4*o瀻 eӲ w̙3{iNwG;ѱ֭[TR ?%Zr"vZ̚5ˉObѢEN پ}{tMzhN{ ,^8N1c?6n:tpJ۶mqA$%[/~ ")DmڴiZҮ];)R$)Lgp_|Od4d={1l:k^e>{ɓ'gϞظqS$.^x]t(B7C oaRzސѧO׏Ju6={`/X}15}j|)$"CR "5cٲ}vv8hŸ\V�q{/�l߉H{\ gʞ)ܚ~vO##i_tM;jl9~3+Ve28f=JYtxt8*HA&YRE@D@D@D $!|ZD@@2 m[nV.vR|Qo޼|M'뢴M|qǡk׮hӦ +ϩP"6l/~!>#O]6N;4zꩠPBxJb@` Pu e@|>aҥKTqHA;wg}+_}kS4:OD2eRLfyv&8<Z`~a1fPȑ9M[L6[ʕM9=z1T@"O?÷~+xKx 7K.Aɒ%cS &,)upŐUm0+qU:a}` + rHt*N# Ku?DRVd t)fGn]_ !){*THج+" )B x>>idضmȹW6s&93" " " " " " " " " " " " " "$L3t@@0" "PIi^+t0gpY}0(n뭷0vX=Nr 'H%Ί&,\vcvgYЫW/}ɗaH$ &{S&MŒE@jowu|�"uvJ(Z@(^<,6\x#P\9l0 >ɦ{rHc@0p5/(\S!= 'M6u/Pxeı@=y'<8p J 3 G]hS^�|9{7W ٱct%ˑP[@زŗCR !)oT)D)d h˧R,"m󅐔Br E{\0O?7d{^2Hz> gYyz>TĆDᮣ@2aN*" H$ L t  l/O?qa?|Nbwq9d$T  n:L8щf̘:u_~ PU#Z *y%믿^ѣj*o)gqT赿J ?CWLf9眃K/ڝ L3y`&fE#<i)dN`a pu!@"n;`�̚5 _#d\�o^s9Jƺ~z{]&(RJ)<(BR 7@BGb.]m|(E )E +[6(YJ] ʬٵ]6syF?W I9ѬY (:@8>9JZ;eJ# d: " " " "D$DAn�u0j?0n޽I fAUNYxgT)G7KNrJPwףUk��@�IDATV\ID`ܹxᇝnݺN~ڻwoԨQ#Ojg޽xM ?p]DE2 \TLx/9|ڵu1<�~lK/-z~N9%k&Mm{Gr02Nz>}\Y6e˖Ϳ%p̛6mr2HJ!=蠃8WJzXS!/tW Ii]:!gt^9_ 쿿/"VΛ7((u(" Kީ䐔BN槣bE_!9ĶLM&"<|<yΥr|<~ύR&" " " " " " " " " " " " " Y2+2Z/" " " "H AD@@" wF(QŸ7 %9ڵky 2+„6+#J$)SX2oڵkg"ѡC˅+>}:N̜9=zW_Ν;ﻡֈDիO`(U K.E1R="q(j</)(.>(_~07v ԩ})T&ONo%̿qF4n't+HmO㡇{_o5kL)Q#O{ֵڵ0*б#SFQ;"#y_~ ̛Ͽ ؼsP9dfGaRE@ w s./\l'V-_IY'ԯx %)O@SaE@D@D@D@D@D@D@D@D@D@D@D@D@D BAFL@2θ+"*M<WnJNꫯ[n`QdˈR, L{YO1cLZÇG&M8GJzXhZL6 }u"z*[bB򬧞zɳ(8sύIZ ]wv-=c&Qp(8?7>|Qst0OB Pĉqg;u/HHwڏСCMVd:ŋ}1#M@{]�UÁ!/O/k௿6erH")T"rދ&$r|/rس._!)(2C+J@S+D@l(-" " " " " " " " " " " " " "/B_~ m }6Юl&1c}Νqeiʕ$LH1=36@u)ʕ+-Z\&P| @*Y^y-2ΞҘl(fm6~ ؽx~}ׁ'&6H|?3y\(8+V�m�wG×@2ʷ).V$pgG߿{CA;UX1jY(9:u*6l>}f"Ii? \u�%γg^ k]T拠wlɿ(fHVF7h�wL L'@~{Ap�[W\hgOQD@bAR:66p+s[{{W p!3>㣏C,үc<=/x:dE@dz"" " " " " " " " " " " " " "$TXbj!{Ad/ԨQ,;ɺѸub#/ OdR7P}~g<8</ׯ_QFᤓNC= d_4x9^VcV'L>稣$+XZ7X6Cvy ZV(xk֬q$.ς:BB BN2e N9gt(|<l*GwMa a2d`? V"ȿd{YfI.MKV^<rL`<zN:ߐx"bȑݻw! }F"$ qωk觟~PZgrrYN? r#B]"E"W`&vCq8scZ'okDk97nn꒑uiǸ ev;QƍkWa*c_~: qB s M6N1f�6oElO? }/SgI#�k曁p8{ʪeK5駾I2kX88bEvmӁ{>TH&ιeJ|<;xv{bS{kE:xL=yWD@D@D@D@D@D@D@D@D@D@D@D@D@'`" " " " " " " " A`.h�#W$b뮻@rɓ'ZjH={lb&1MD({ǬG.oɮl, SNub}6Hʱz/2X9D~; ЦM̜93E +6y6l]vbGrYfzB")g%KObŊyJK)=tD`{Ȑ!w3-(1 l뱮cۏ-&`G_uaKgOA}kG׮]ʕ+ll;6lp,f(ovUYg]5*zBv\F͛cΜ96mZKCiط67}r9֡VZ;l}d]tG`N߬[]\~N$l8;6f[p!^}U,XIq>lχ/3m۶Xs1N7E;vݻU6pvJa`_`hP&{ X,uܴw}@c5[M <(6_V|êET |/_KV'1rSOaJ�{$ℏ?^rgN8/"N P&x^ʥIє;y0¼7y|<*" - VϣC&q'eC|X2x," " " " " " " " " " " " " "/wP=siS;`"8ا+){񠍶}q饗6%X58K.DFYAE#PJqWD#O#9-Zm[(mƩ/FnW_['k&Q^fbK>4mXvi9Ka݀Lcv<DSo : x |gey$cmxDzipu0џ/>0];qF{OJqAn| >UzuIr%Lظdw}+Yf餎YqlO<&P{fsѠguMz!yYS,XG)_(}N|mڵ+gGy$Y]ig|C)rK|l!^M4qeElgesUIR8<`g~:&tB=@@Om$}u]Pff v 7dn381!�z,_$wD=?0g9s>#h {ǂ�'Vu?_ wհ>S5QN07t(?TZ 蝏H[nvtwsU|%Sz>3㋀^S " " " " " " " ";+V$I'%�w ,4~!N>:ukt?(p뭷bԩ</h)f\e~0yI/Ƚ{hܸq*=QE P( @"I^F1Y<-'<<RF.V<9m^׭[{5jH;gԩ. l-6G4(NDӠKȑ02LpXֲmW,|+jԨQ'ulx"9;L䋃l<2̓ ࢓;Afe%8�MYH+Weʔt|~a1Dt̮A�+(},e˖J>cVĚ5k[of~m<Cذa;nV}D,<L'{ם(psg`1JUtTX=<yr(g!"mC-H+|?͜ \pp/ U+{zص+(A^wF 7IЮDT)M$Wƍ0=ж-+u"|%U~9}Cj !)WX[)g|YuѲ/|_$(, ?%}g�G #1ʆpYь+Ys$|s~n/Ép� " " " " " " " "Po&9ݡC#G0fMpi8 ?F/KFZ1~xtA]6ƍgW$|w3Ago_=zR@4PDWZ5"ׯw|7Nӷo_t-cM3k�M G-#7qСC]xΙ_w A1{mc 2 3!c8j(%yF.nݺz9|w_~矏޽{űc'(3gۏyݹ6*fy~׮] I(o9C9#D X~nOkd8u'?>:?pO>˖-C֭]y:a&o~>|mҥ ӕk2aʼnA|n&'nb1k,)Rե<~J$l[pL2%:F̿d?M4w$t.Ґ]¸XXdȺ:2Z_~իSh`^<Hw 2l]lHX?ǷK8C抋,{)b.ȵO finYQeE2Gţb )cˌ f2>z)rjg2? X' KW[q /h纸 >weu'3k_{B1cwرcAY`З̬.`! ?f9ӜoupdYfxG]kAs4h:؍֗_3d"A.;Ok:LLJvX$}2C [PN6c*<rVt8s<mk$ڰ`?#P^]{D;Y\sM—iٓIo+U_z vן}l=`6_iv}?u`\8"JRNg֋@,;GO>~rI`g4 {iw(2}X h" <$ñ|\||_2}UP!|>uٍqt2$`|гqRH&بwUH*;!1ӤIW)yÆy1KJ<sL$Q;/o޻뮻\&u<@lD4sI><ܸym|{;wzW^ygR/ȧH<ux5j3yl‹rJ^zSO=l3igu{,xpgJo۶mw)YdDY3װaCԩS=~f0A[0߳gw饗ˇI5gx6ܹWhQGq'>`$e]1^txLXcԬYm d_3K`<" &tq<$] l{x&F-@"^&)+_a^.]\n¼�8: Zgb%M~nӦ++MX.2qD83 +y'fnyfD4Xz&LDHp&K.=ժUse=&6mvéSO<{3g0w< +k%ZuI/=-㚐2Ch]OﴰзgmϮK>bt7+瞴M, uUEG 5U++0E65q\2rYbcm~ ӶOvɟ{.6zV}ŤIxN:&PNC]O>`>5֑OLPL}knz94}=Rz}L oG?qdcDc*VI_+5?%^\ ƍmLt1QbcfXߵ oLya׾=]2^DJlQ<}*Yl[zbG! B :t($EQ!Vy{/َ۷^^7r͝Y>3BI)JYMvKқ1x[<jU|.^s]~%I2癑�>I )ύ%Y݋YAVeC82Rx𛰗'x z>ogDH%o AFbx! d CD@K V"Hd=s�6*B =ayr&J BEb'xbZ۶mQX:ŋw"~ɻ68'TtT,2+Wvs8lNA\[!cQNVlYs vq2H"Aįe˖nFځlMD, @ Ԃ@a) 7u?n'|A7 sg2eۆ26 >skp)mHd%6OJ ^.rbŊNtͰQC qI N"eiӲINՖ-[ ʵY]]Fa`(dܣhSm(>Y)HD)géSF(YO۱cwG4FRnS@yth8cy:k%u [Gux8Erm;6d11?; (9wʥ`}ʪ XMnbpk,4\{Y2AJS%�<Y#ARٗBN}@H2qb;uֹmgTAAhݺ+dvuAN ֜bɔ:&}]Ye+?m֏zcy/| ,H8Љ.k:)2炎fkrMݻϳ[[EfldWWD鐊&{]ϻ;8-iաՁm<-ˡ+"(,<{g瑔Ә1'jpF}2ƨz>:gC|<%wǗ[x;#J@*(dD@D@D@D@D@D@D@D _ ~;Ь//TUY&ԩX$ꫯ)U[61 L 4h: &ܾ&G?O=$!i(Q-7j(m]ƍard0m]v l�&N\^z0LjvXߦMЩSqfvyL"qH =駟OF5\.\>܅MP!֬YcC=?&ۃ<Wǎ9y)dM0.Zh00JC8u cq&vu uPfu)F:X`]fzń^a=SmLիcLt#)5A'X3l6-Ϟ=#U8|MW'Z &$v'M]+~ $Ƙ3gLAn6ߡi9>f%t`�`bg$$d{*�,LbʏUyHjwݵ 8V>ǚh0хIa,e:u¹;Ke77[�kdEaKPpa3}XξnKֱgm'4dUx|뭷h\EǾ-C;31/Ϭ>BM6s2yꩧ$xױd sαz* &رca`5As6O~mRਣ^A2 /#߱ENvuE,ҧcƞ�kݻw |qn?e p@Z�owا_)H^  ̛g]euvm\| }f\-$4O$9݋Yx_k!!$ `/P8K#" " " " " " " " " " " " " IKUZAD@D@D@D@D@D@D@�Y5i+()F/㨲8 sϙx*FI'O1uu9"ŸEyV0zhk}Dn9/tE+VpL)'*kѢEn >d頔pEg1_>^H*8h4VId 9 dN^m4-|gn�j "K9,7Lg .�W)oߞ!u Cʕ݀c=։~C%YEZgMK.E2e-^3n9X,CYh<, ͏:#?Jv>Z<ev-^}-b,xb;9Vq@׮u2{J̿cW̼.3J%ylSgBˏz+yLp<4L?h֮]%vޱOY eqv}캥NpN+SϻdQLaXv! eonc<裠:HGeȔ_RɸX hU*T֧^9ΗPKAi^>I皢T > H\a E+"7bJ<&c{'"+Yg/I\G|akr4q`qSGH=l/XS뿠Jlo V}J ,^pP4 yV|<="# =#%||2>8_�qID(" " " " " " " " " " " " " )I@"Ȕ<ʴ?xଳ`@#`%'d's8cаaC<Cq *(b8yfSL6e1b&_݉gy|%5͝;wطmۆu>vrg͚ _8=hܣ<@7e͚5OWSJ'v$k%Vϖ-[lS <kf(g!~!zmBgY#}E.bDp~+(VZqU:e޼yعsgۄ2:qE!u Tg9sB ZV^ۛi^4imB FL@]w ,X�@N6={v^clmֈ agܸ?(LPA؟Ҽ!a ;#A`*+Hh(y9{lC=fwӧ(`FbKڜ YH_6;wޙ6Y}f͚x&CqI'g (H"۲.z=3]W^WVƍ~Vmx�?2S'vܘ1& tv)o՗ SRz>&C{'VtܽJ:t�n4 JYRH>gMԮ `0uF%뾸ձΗ'{i Qc�?Y4>3 h@BxVd[{$ =[sds9Kû( x+=/`:d d (" " " " " " "71& ̗D0[̉7C9>,y睸H4% _=*WcǺQlofiӦ9Ef֭͜[ݾD3ԫWKkv|iQ3PNh޼죏>J9%$I}mCNxɆqaw6m V}NGUEҒQt,Q>2ҠW_l8SA�E36%\y_]ߺcJBIfk׮(_h)8((a &0#Ef:.T|9롇M9:%>w;ᨣreV@zݵ V_sήŬ)*&d0o"ÝǏ[8LhI -3BwrxBW2:, . 2,e;uBt&.BJ]3+O6:75vO4V]V-3 sRN; ]v;fI1U]tSxw;c θMVy&L>1"O[xvS=|p*>… Hm) 5y�VK}*$ޒh.>_拝kk/K8\X}Kb R흂`c䞀N�yx۔~`k`X ڶlH|q5={!n1vsomV32`_g]/I)H}fĄ?Z'!DsqG ܲ.7m)OL#_{lY]px֑D@D@D@D@D@D@D@D@D@D@D@D@D@D 3= 3"Z'" " " " " " "k?n t?#D0؊b: C.O<rDmH,j˖-n E֭ý $T_=mK'Ovry6:஻rۣN:hժUXǺ \b^|E̙3۶m?uJ:ȉ(zzh"porݓO>i{\o6.\dɒ{Xz5q(0C ܍B9-@;v[nE, 9ۼ@qFgDv{ġ̆>%(@<k&ѬdVя=;$^6iʕKKFvuJZ,7p뭷⫯.ꔍ�;'Nqz W\q;<'gb:©X0\|N`4dr8"-g#S( GPʔ eSؖ+W PYbEWr]v OH<>(O>q/m@&d0ق5`.]eˀn�̯ⲬիGxLRٕU ͚|YsՉ(*^<y;vth-S(L`FϬBpViG<R(3vfXc}~. anMϪ. e>*C=~{ /~%SN9uuq,YժUs},֕ >^;{Syu(%N-|{9FNt�,3A7 扷$п?fa9}<X$3䇶wr+p8E4_{ov6%FsVz3?`_3E)" J2c1qvoG̟ˤ).< z%Uz>)|ρi_d=ݽHK#p˺H0p vӜ+w/‰/̠3xVN<Y+" " " " " " " " " " " " " Q ={z'!0aq8]AD@D Ln!D-O[xuy^žw챞xqԢNNnxFi>/_3wUWyݺuZoϞ=.]su왼3WB i~뭷*UxEl 7o<v^%:t[uuayg/י۰aCZ|-3іg ]\&pt{{5rqT;#8³Aޟ]2Ҿˉرc=uCI@<hz&LNUTɻ=(z6 dzܴh31cgc駟zw,UN6-:eLpᇻkl39>ܹӳ)X5kLNӶ1ygjb2ij᯿==az3f̈U2t\Ȗ�M^Vy2Dѳj .޽7k,p9,YΛ`ĕ[#FpYư\3++ 0]X-[3nfϞـe/UgJuzqիgIW4ܖ9)<5ƍ{&bt{AN"SLs9۷gR-` ݵ:L:<<?/25iǍ~Lۂ gշ{<];4ɖC??l߱ݛU0y+ f4ʪ&y yK5o_Wޛ(3-2 ʯ)rk'x9щ#c#Ժuk uk׮[5ҙgo7I'2 Knn3p"裏vҗ.|`"gVmsLleOvu![<gl?(dN'xµy_믏_xqׇ<Z xw=o�kfV=<=oŊdewxzvuED g7{Gyw{vo׳{:ymy5>oqi +5y\yV=ZZyr͚W4g6z>z>yחb*iioxʉ@aZ脳0!:)x5c'@D@D�x m6ox�b`D9 `:uSO=jժ_Ą0L&{ BҎoRBp˥sȐ!0Lnn{n7 /:6ͅ-[`ŊWLM$a0 LQ\9cd&tʗ/.n@؛3PmΤ)&VK]~|uxb0m&\slㄓWnHmk$'SNrb~hذa"%_iM16( &:w3LX رcL&Ӓnr/H￷6~<7UXf LJ ,z1RΆS0 ܎Rڵ]IW^11,X�8.qewp)ll^CǎŲ `gn16Ld1Сa@ժrϞrW_E޽]-.DXqnF�.xQXٝ ]aBHr).vo,SMwtLiU=EV}y[ء=[>Vvw9&c &̴2*L~azժU`mbŊ} +<x0)dXV1G[Ylo}RD|�| ְ{dݺ`(<�W/Z̞wZ vhhhΟۭKWŵvS`v,bG,*\8_ȳ{f@рpI]xzٕuyyn(I\)" " " " " " " " " " " " " A@"8ʥ䚀DFE@D DCi>=\s 0nLJ FTl,qO]bʱn}\Z1KPJx F=܃7|3)s񖞌y{Wn瞻X c@Q7g>(6 (J$GQQITQ3Q #&9@ƃT$Q HD@aXveÄٙgkoFY]lIMEr飧~Zg} f{t,k)S )BΞz)YUƍꫯA)-Ko%Nʅ"Jw)]\KHY-[nA8__p99R\]rL%hРAflߛD" !'>|puQSNUFr( ,K}^z>.Hx$�],lB!-i {9뮱' cB�XZ8Q4Nf4<ro(C(rVwG� !Fſ~vUƄ@B [j'"~'väx@�@�@�@�@�@�@�=E$ � � � +o)rt!MPR)GcjAd}={T…sP_-[,̿ۡCըQ#*T(3h+OҺw{09x#VV4}tծ];Ey {L\rI,\z/)Qɋäܼy I|IO<^αpe;ؿw>P.?|@(qk[@߮]d9UZU 6UO?.LTI.N:lȑj֬Yb)]t[9f9O>d*U*g=XuE'tǕ.CU޼Y)cepY"E%^{+?3cwUƌ5mT˗yat X5s~ҪUҗ_PH/WOԦo3… >(p=gL䄀"vg{-[)S|0CsnTt R> IXN93oul-%W\9KU`A҂С~"u3}(gJUu͙u 6Lv!|4wg}oh-5ʓ DaRSǓS1@�@�@�@�@�@�@ zrvSfǍ&Ƅ� � 6َ21>\ hbA7骫_%7V)۷o׫Yx_. :dI-905*?,ףn4{2er4%Y'`a:ԍlѢ %ޑ5#=ǏW߾}5qDqպuy$B?ST��@�IDAT?V7wP /^sE+2J[PA>ҬY<TB<,uϗ-yuK\2\ּ[tOKD_|>;]E7n\Y(S&LS_3]رC ;w<jxSY"ZfMobq ӥ^>n c?vpJG`c iss9 lN_?矻< %vm&V@ ospH940#2z֟a:6qWduX?DS[OrA8mZ>s.p6ܵ,;/ oo1 Bxx) @�@�@�@�@�@�@�l 2y@�@ V-G@�`Af NbEץMSM]|zJ3fP6mԣG`UlLlٺul=?@ zw[oi:׍[tql(8) ߿>UREݻ_.rAGL6%IYa > ڔ1cƸAn˗/Jja�Yv+O`"! Bݳy Xetuԩf YK ,_] |.k&jUV;3iefE)_җ_ѣ?,PB!m>T)ںc9Fv.ٸqp:a\'r$yZM'-գ{Z~  %辳ҧJ.ח+ۅ?^X78cǎÆ SݺuMy�1@ }<y@�@�@�@�@�@�@ lQև� �ę�AqA  7O AR>&~(3S\[ 3 N;4(P 3ߊu!V >t:܈ʕ+}AjٲeT0qlа:o;6͛Eڔ3ԲM ?<q) m6 jP_|EƮ]+PO~bAE.oK "[,H}$u>T1ň�Aѳ{=]zZpS X߾}5h իWO=ڷoP\dIph7*/;ݻi|(Qw*plNj0{BRR)W^yE_|qjq/qğ8v&t<y/'92 Fi@ MSgC9PܹͥӴ -vZ^iAW[bB }<yT@�@�@�@�@�@�\ 8T@�8X V#�) H zQu_lRmٲEC Fy3B J*/Ud9s4t`΍ԶJ.]ԭ[7`I LĠqWhlKJ.#  -*UsxC~ԨQoy׬YMm+k/_G+#FڔѣG m )]Ⱦpq2jr]ԬYT.utMK/I]'/w�*=s�RJOGO(~gw4hBӉ̕QkŊʗ/_KHKm6:dy*zh֕Kկ__\2#<٫f}Ĵ62utיD4r?g㏗ ٪^s5_W_lAxw8h3?v>;^YOJ_W o߮JkMv9D +}<+uYw< x<o]� � � � � � �&@dmq� �S t8 # 5KCF'|'OT.Na >\}$>J6mRF\Hila^Ʉ@" XH nKR/] RWIg}:u$ ɝ;w"P@ w\x ʟocR8zwB &m\dT:r)gO zo)ӦMS"EGkS:tbŊM@|-UOL⦒ PB}P{nT:HdtmԧzJ} -J(]4 |;5v RÆ [.l]/b<@ X࿅<Y m]B!]&\6cMv?!1(`ݹso>qceK iŋgooyKdB�g ,͟/\!-f̯>S+MJƴ xڜX*1}<1;F�@�@�@�@�@�@� 213D�@�2,@dx! )A!=0t1Q](ۃ�/ 9rfϞ A'褓NrM[ZĄ@< ,_\&M5n87zdO<1hjfxĤN*`%>q"kau8[z>AvkaG!76>ύ$f vVZjժUЮ4oܽ{S&PµL<  ܺuԩ)m۶ UQo%==;㩖Q=}6#1j$2ƍUwuWtҤ(0f̘ T׮]裏Nq.M!8|[[.o.#Z -6mBɳT�^d'L .w קg gwSpHw-զ{^z̄�)^5hҲeR>s̫~K.qUh[9kB >4^W>W � � � � � � � *O"� �g�O g͒z\6Ty㍙:9SUnT;6[`ɣM6uAUzut&bH`˖-1c~Y8ɓ>պuk5k,DQ8 iBk!ajN_% y-XQ33@g3kSm`YB{fw`@ ʙBdP`.sw̙3rU?Ybmw^-Ϻrg]nJKo!ٹڣ\۱x$#AfD-k_sw%;bGO> <񫮺J}Im{+?pc4ܡN#Fȅ 9 l^];s >SuY^ڲO9 tݛA]h]]ffh)]c鉇NH0]_}(~۷\ztyRf\+:"ACQG`T7}<e;X~?XA^� � � � � � �Ķ�A(= � Af91o�@dG7ߔlp"SFN4 4٠O *V5jc=6Ț5k*o޼S9J6lrl۩.`Μ9vLK͛EAa,qqʭY]nhAad1G)}Gv_.ÂXMeKY*imGm:b im0! vs֦X)ӦM5~4l0̶6ږ2eDC ?$=4pjB-Yq ̝+u"X<3 ߌUg�AF7Zr*Ug}6L Y0*X<ᅠ]:C+_5Զm[==D_IGK iv^Br>Yh}@ !Ahr}-rސ  LnlX*$OFyGry*P\v};t.(έ{(ɫPdzUg�g)/+G�@�@�@�@�@�@�bR Șl@�> ϚwB�S ={.X.4Axβ^/j֬YAxyY Fpjժ:u^e]ʕ+ p,g9={_UwV%. G3Ʉ@v L]Y…{}IlJU |GۀxlBlmwnTv۔zA^<ZPv>֦-s]R޶m۔}Qڔ;.hS֭||᳸>dرr|>{wP,~sVe.L_/+ Xq ׇJ;gf+]`7?>֧lѣ>}ݺkc+Zw}&MDk5(C,rH>RVR~NZH袋rG�t]IPHw!3:jo(C"]sziN-&HH X]uK[\HֻduKV~YgelE ll$ibb!@�@�@�@�@�@�@�'@$@�@�TL'@�ԵkXۅHo1[- ~3f!da+VD tjժFnX`FJ*jT;=\*ҥK]`?l*K,='Osf\W^ bŊy+E .0{kcm7l0*U|-!as r }\о]):sNΝ[lSv|qAeD`žhѢ]lSsfO6s6n< LH˥W_ڵk'iE.XظQS4H6ܟ7oՂ&@dj:9 [[2j(~9W,րTlY=֭z?X/>`䔀]B!mK.^`q:PȖ-}PdZg}3 „�'c.!-B"7mk$[(oǍ)MO<DY?  0u\8Kn#j|l5Y`u]^{M馛zF }<B|~߃2췋2}<=C�@�@�@�@�@�@�2S d] � @ *!@ <7#л_AVXv,l7o^0@~ ¼LxAxWVR`\rp[)R$qWBaZP߾}{ b0XԂlYf0Z@S-`]ۗG yvr/vcAP=gu\Pav:>o÷An֖D+ ܔ?~g_96%lO쾅G.]:>03a$#oLYoi6na|XP%aR˥a,Y A@"(!]~︘b\e% 0~]0OV W.Ν}sPOVb_`)x?Էo_w]V-\RW\qYozQѤI}0N=Շ>o/qDEڵk>/e#A ;udn i}-ͮda8nݧg#<v�&@ECƎw}FwW uWS^R,}<6b6VdzB�@�@�@�@�@�@�T T@�H�Aib9@ 6^|Q~ܺhݱQpJgAL5aK*_#t̏g>Ô˒NRa؀3.]v֭{_L=nZj=m&Z` 2lvlchːsR% H۷Z_خ{-XnGiS~6lٲgiLQ)`Ǘ>me˖iSm�a  A#{J}o7cԉ'J={JgA{^ <t- 'H&@d~>r\pApb?` +ݻ Pƍkjڴi|TZ !`#F`H ~ڲEj. !cyO D ;wJӧK|!'LAC!]nZ&O~Is_$ #@ EևtRfi/.U /T-dKτ@< x<nՔ딙˕+  � � � � � � � O!� �'nK04@�bYˤn]S#uFd,oӜ.ի]{B쾅Z ж}=Ŵ�ҥK3[=f!J3߇yHi;h[6�¸6mۭZjllk׮'CQi!~}J.Ep-#n;E$hYڰ}\G zQcos>~K^7oB!)?{Jf%K#튵)I-`)c;]ĺukO}6ڑvߥ�H `ϤmJŊpynp_}opJ\-)>L_.l"oHS|ԒZD ]Gׯ_t~B~㒵:u꤇zH5k<Q>!ݵ]\?ԶԱtر})"eB EOf[ץtkduq@�ֿ4x Ҵi>(!w;MO:UgqF/;lذw[ǣ{xtoJ� � � � � � � �A)  �   /@wޑ4G�$gR \r>!QeepȰJŊ »,ŋ oE "Eo!  f_@pQyˍ)e˖`޴i6n̑ׯ_6sx,1m]I' w ҒYZٲe. 2S&S>8w 80nG)lh6'צXaئDF4h'vkIk_kS}lSl]sW۶mۧM%6%lO6lS6lO֞K:Ycئ$ z Pa xN Xȇ{'Hn];ء7o-wKJZEwy)]9Y}꥗^ .|`S >\wq;~{AhuՔ!Wε-}5a\4uj-}t{n sZ~'j.؝I' +!27$C B~\oɩ.ѥI~C q9@`�H~O !� � � � � � �$�A " � p0AE�rV <\/A9mx,+ ZvmFeA!U}{$رcF<bTe]aC BɳmrlpΝ;S|,B/#o->de00�32Gnԯe!\y||G݂'sxIr_A}TG GI3}[bHؖD/aa؞ح֦$ܶOrd[٦X~D޷ɤ�v#lcRzڽȶ$l[1 >Pw^"hm'mO̰-l_G{SX> pRqc}HkҙL[<6m>pB$tuo5T^nݺEwa)]kK{WxݻwpޝBbDkhi.i;j{d.)v<L #v13`H#-B!O>q( `mz9E}7Kիcڵ+wwԹsHU}<O"� � � � � � �$�A ( � 1 3ƫ@�kK7ߔڶݷDA_/`W6vAaEζ\f٭4[)Nv X'[\Wp/f C6oAbRt..u0!+`4k4{}ۅ }ˠSjR~�?|1rzRK٦Xٖ _kG)Bkc1 Nkb˥ԦX0e.\>m Wh[\ԽōRX,=trZ;~( M2wyZr&N� Tk'x̂!{s%UM` 2E6L>\1CB: پtQ DA^w~+` $ -]CZ(CZ ~J[oIO=-),H6=o&"\p }w$!@ diKtYWi-dz@�@�@�@�@�@�@�F ȸٔT@� ƕ"�Y%ƭ뮻':u^yE:ߍ Mx Xh}yKe觟|?y[IU:u$-zu0r @w>,�Y3#رEI.\KMc-Ӂ<P??}YOq)h3\Rs@ ֭[ 0]~aY (&lP1c."5h Y(TǎDsIJ]et Cn )![l>p&H\ :Tz @|iSOB,ot3~~ x 8xUW/ɝ23!� � � � � � � @@�' ikRw ߺBߤgzHAl3$Pn]vYJK8-̙m;׫'ժ%..HUK~(M rtHmHyuM,rR~ҹJ6xX >X V0{^_F n# 8aJ%K ܥA&zբEDE,4n0i}ϥJ@( <tXpbBMMuF#} d YBLTB"@؅K|з+st_dȑ:u[O?U%4rR΋% gB�@�@�@�@�@�@�@�ȝd � � � wK<#wB l"?ҦMRrR#@y<Yzy+qJj:ztR^җ_Jnf1SOe7&2ueE�D}K/ #z}&YoKmKV'^x[:ƺ@2x`m߾=֫B!PbE{UHxԩ~tE4g hnjn0 G 'Mۤ#&MzC5ZU*}_"PGM SL6>Dߦé]v8q-ZE 9 iE n6o;7P@�@�@�@�@�@�@�N Ȩ$@�@�@� XLҭJw%'U׳$M` Aibo|RBF X1ys; O_f̐6n~Iz]zTLlՙ"�Y)l4`tI?ڱ|4H:,@,&?ח֮L:JGY@ 5ݻkݺu2dHj\ 4jȅݏqY#`:uku!C UK8G`7ߔJOVMYE;v$(F 敚5[;C~ԵuD*[VrM^Xx$Ŀ;$ۀ;Ku@Ȱb 0aB v…"T@�@�@�@�@�@�@�( 2J7 B�@�@�@@ÇKn\~En@ԧ'ρ^ ,̉ XزE[g>/~XZF: Bo㥧z!VDz�eG�F`b[i?H飏ի}J eغUN$? 8O;4[=c "Ю];?ÅVZU6Y ,P[<~ԡ4tgFt&%Ǥ@R҃J&Ek5yty_GRhH&m\gPX l_VP֥Ŏw?&䮌ҦM{iZ/ !@ ةo"_NJ� � � � � � � @ [r#� � �$\ԱtrѥM#-+VHy  {4oWKIŊI͚ɅG'Ғ%>ah_??裥\2 S~χ>.J_|p]pj͟,W_ >xRKD5jV\P#;wn]veZ`�_ժUsWs)@ XYVOHvd/ Z%]rT|q|W!@2EHO?3ZdRw-+mۖ̊xb^V-aCN>fδ~nu]}R6o& � � � � � � �Y)@dVn@�@�@�2Y`,qcwwޑ9$߄!~y}`B j֯,VZP A]'͙p%/J:I*Dm( 57-HXkB3ƇܼtRQSl |챒N.~D�L8묳\!zϒ]^۹yZp=\wuիaÆ% �D TtW{C+V}TY￑>Ă;Zrwڵ}@)SOyDGi׮XeD� 4lc~"r tÒ VWC 6m7Ѹ]( � � � � � � @0t=~%5A�@�@�s_?{͜)uzDA+E(8 և,)m+ (.-Y?H6H'JO>)]p[�@ m6OK.'$!u,}t\͛uT X(]qH&H+o}"P`A7|3QL= Pڝt pWs\~MjwK>5mڴ4EH,ť.]EQ_hð IJċ]D΅^yE.,YZğ+)#=tqaI#Rs�[KSH|okԐn+4j(9RBW bTȋSl@�@�@�@�@�@�@�b@ H@�@�@ l ^q㤊ۄ#˗KG!Eo02 KӥSO>XZ~=n4n,˷z @ u ڵ}P,^,~7OzI)Wų#` JKGK>J8[5P;U7=cǁ/УG͝;u7mtod̘VZj\cM<Y۶mScwfe˖% G 55o.=\d}'%hJ_s *H]/XcY5K^{u޿dL ?fg)h_]:NqnGдiS͟??v+IH`͛ LO@�@�@�@�@�@�@�A n7emC˿ � �/GeQcP@ ;&NuvN:)s#v-9c-D@~K/Ei)V\ XnرW_ۥK…NZ*էR @ ر)ҰaСO?IE3ΐ:v4V (cR>R6oKeT(l6r?;[Y8:T<_%5j(5j  >܅ϙBQ'w?u뭷nS"EhذArW ")]<Sr ̓'KN@ =|n9fR͚7l,DjZf<jAb_t&;?8c@�@�@�@�@�@�@�pCI@�@�@�@ ,L` 3 RbAXʕRXؼx|QUWI�i&IB cySvI_blY;p=Z/OK/%2'S#vԷ҈E6˩4%|29e\*@@/^ڎw}=ț7ovb?_wA7gQj믻>&HUX1qޓ SƏ,ڭo܂/HryZ>U$D:مn[7Ns;0L,{TdNukW!~%KJ>+M/dնmiծ=V[Uvk@�شI[>J� � � � � � � @ 0"!ַ G�@�@�;eˤ /Nz)㮊TX\:∘+6Ea<a}԰tҩJ͚I @E(" 3f> cm ]k\VC1P mFIsJ7ߜ[Ba%r< XMϞҎ){>{%]~v;wTܹ[+9}(Pz/ !{. jӦ H <y|H{˖K @H 0Hk7O<EZXdiX) @T .-dߦkc}[v5wxƄ�Q.Pv^ pA.J׶/#<tר3!@T ؅MD@�@�@�@�@�@�@�b\#� � �ėȑ~�ʕ_[Ī nٰA*W.Vk@I`nvfMjUxCZJ:pnݚhvbO#߇Y U_F7N6B cofmgcڴ}k6 v%B 5=TjVP&{S(SJ*;wh;OY #5)`{NfR \pթ.| X'+?>ǃ$[@ù^vWRE__Gv" QgGdI/HKH/ -/f_?|פ~SUBͳ `߯zqC|Zwlզ^čMAƤ" � � � � � � �Q)@dTn � � � h.W@ Ƃa"?&E V"2Nl&NKMJCI|{IݺIKF(% ;wJ~+{>{wi"?A˗Ko)7\*^<kAA˥u|I:wlMKMࡁߖ/Ѯ]/e!PXh҇j׮=)=M5jСCW_i;WZ^:bnݺU\p9 4مx(Q ,=?eKw㏗<RS1Br_'&qK/gΔCZއW/V}s6G  /,/mݝguI'i]! VF Q0@�@�@�@�@�@�@�b^ Ș߄T�@�@�@ ~T}9ץw!L$ַ)/ Hi5K6R%ɓ}ټyI͚IM;*K"�I~"?\T)_G>֬FNQ#)W$+Or[K&{T4}JRD U'fAL%P`A>Dv+ n\֭[kԩzW][VGyTSO;v sivL @|R6ҀoI3fH\#مs;W�o;7`B�C2;߿i(K_v!>}|]gJ@ o%֯r'j˖4gzD&J͛"Eh @�@�@�@�@�@�@�ȵMU.]>0z@�@�rZB8/sF? ].O@^|V)Gn3[ { λ ݼɓ-cJ`i@7|@>(kWZ E�R`:믥 AZIg2! ][Iy[ox@LdD %;ȩpa鯿#~XYgbq,د 3!ͮyǃKz՝8ZJUTq8[YC=;#kgQ0eˤC}ȷCԼt~>@ ֮g0fx38$S}pl:Vk@ L"]tZ]=GMӧ~vn(9q(`K}&}vV*!� � � � � � �  @�@�@�0rA?@ L8l*A X!)CA2͓N:Hwoco>}�D�,ض͇8yԤtayI?/\a.0lJ@f٦ڵ7;ڀk!29KA& ̗Lcv/yK sNW%67I\_a�۷o_/jݺ HM6յ^\Ov;݁ÇE�4 XMϞȑҚ5>R%Gե5o&MX b_dIlҢE~_u [W:⋥wޑ/:SbY㥙3Kꪫ֭C3r(;q'iR"qW5*� � � � � � � @$?R!jGA@�@�@�?K-W_}Wzu?-jJ ,W.>B-2_|>[][0ܦ��@�IDATAn@Kr!~w H;ᇥSOJN9E#Q#b!.CRV1!p=&Y4/\K;wp@N;M*^|YޛD2E>͛+|Ʉ@piToNi?wm; J2]$'UhQs}۪URҧJ-ZHeJ]&6oNZ.gyN#2!@T"]}SXڟ]rs>uH"-m=e$$@B /רQoիLJs|gt AFvt � � � � � � �-;O@�@�@�-HְapvEU~J@" ,_.\&;W: IiziH駟bCC @  ~<i�L%K _- )0ctr!)2,(HȨ@޼rRdn`xuȓ'>cP\Bs, ̞R.$РA޽[YKn ;j=c مsr/qa.reV<nUK.*ma)^;;8;ck}owmQE)bL9ceoQ `B� ~hѝ[}}+,mܸ1m/f)2M β` � � � � � � �$#�@�@�@�FEGj RfּkE�XB*W.sbW<pTf4~ג RdB�8(XSOIg)YȊ1<t!>lX,y@ˤ ^@ [J]v^w}ҤIi[HN X ] "ܷ^c9(P%g Hx ٚ<dA[lѩ.?Lf B� X?}ɒ>\t0MJIgb!m}S^g@ ,|-^zI*]MwݥwM{0l6i3uĊ[kΝj#VO9K0R � � � � � � �Q"@dl� � � 66Ӥ^|?f'@dmӌB|ԑxVj2ku @bXYҀ9HJI J=R|.Z%}@ozİ!pΝɗǂlʛW:gc@FZ,& cCy. ʕkO C l߾]p}>WɭB"W\.Dp6oޜ"<�)20/�[ cun_$2}n?6/pd@ 8BC4H>S} D^q__K$@JӨQҚK.:u+y"Tڸ_7ѧN\ '%y+@�@�@�@�@�@�@� 269F�@�@�N}ͯJ'KW_{!@f,_. P8P:D?<[ @Jr!YҙgJ&ի'sG1CZZ?jNim<@ C}@\zKIuIGb-`#}HcE&�vg).A{(AgyFK.u.u�AΞ=[vuyFP!3^B1vA.]/Z,4򢋤GbP}=B$X bK5zƎ֮N>Jڶ|_"ÆIawD2!@.d.\[R}tf&vM[.o"� � � � � � � 0v)jkզ?� � }5eQcP@ ~sR[oIWfr|w"Y_hضM*X>(�ovLܵt-ңJ6 X6Fmܸ1lٲϼuVms;۷w%YLZnm̹sNmU@%-vƅ\ G\؍<,R-߹9zt\, N0A>ZA(ܲT>LQ,`paHL}-gsZ r\BcO$E>O Ac[ߗgs}?P۴V\Kk֬ n~gŊ5bCU 5iŞv>߇΃R.0kKV .-e`ܾҌWdn!8?>'g-7My…5sLM:UӧOV/k56^{0`@)| E@ CI_<!C)S|7ٱgZ�^| j7 w(ʕ, V-95AjY__ا&Wo1'O1< Zvxg`E)/ ¾E[)6mڡ  ^uӆWHJ@ XyNrs;?R5@�@�@�@�@�@�@�rP @�@�X 2eD�hXNC>\O+J(}ۄEoI+K/|tReܹu*UZrf k %%׹ 6g(�K[6X:B񤃱1{ۑ#cJ`q@n/6YdVX1\x[V%à%KH=b_z!+VHef6v;iGY$ <X>իgl*O;}iYX# Ii?>¾?MnG$O6aMC9ęLNwm:YVm] '>nP>B!$8ϯZ*l駟40v q8w&XH6vܸո]'>H~FYR%w~R}^cW^p߾cL'k=k7"mcۯ3mپaM֞>!g̘~AK64?}jРAmp> | 79UG;q_T' YSS;E3$;/Gp>b½]gjw,<;uvH2Yaa?Ax!qCdݷ}KX܁&; +Z 1_Wg`VO;o?T!Bxٷ}l} LY'pUckmtR\+Y3 K^}!!� � � � � � � @L3 "� �)@dbnwj�6MYn@բEו$2+uYw< |Ԭ~pf<ՍX`&?wnsE_|ف_CV\˗kKСի`7m#'4$20lms޷@*6 ;'Ayfmr_0.o#Aa ^dPBl�m?|\r.0XVnK}|gnw24-^,Mg 3=[nTƾbP`! )#,,* D'v"v?/9?ح(Fdpކ0�+_SQMVUMU?}ʌO$ra0L2#l`͒)>,4dʔ)0aB0O>=.Z]ST'<HYа}wRl_ܩSJzG !aؤΛ7υ/Q=[N8lR-\GeLi8;p@uYΧgg;1emR{>`uPH;n-Ƭlv[@vw"jKG[vԭہ_"H@Ow`O@V7^gַr=]wId縩عleI';Ϗ3~c~d_A> 7}C!ǒN~9YҾ>;_8 X~wޑB^ ~W_> D1!� � � � � � � @5@� fSR7ߔVj\4Hr Q;E'pW ԎQ,Ri0;`F2!F ?d-]}{i[ȣ;À1 ۭ ے%Kr~v`0[^xkm`x8@mmaoGuTc;*TWX1x:sr;VJ�1ieqcu_2 :uGW5pd :?D g7q"hI##,!?- B" v }O"ea?-,S #Fᅲڶ<�4izsN.gtΜ99s 6'j֬YApt͚5uꩧ3 c%8> lN 4G $@DX:#O=%vO{ܓe粜dvtme]D UK(g٧޷~e˖h}U)}v'}vk}~}E/;ֳ>o1iAdX?FŰO1>NL  ?^]r`A�xi)0!� � � � � � � @ E@� eKRJ W^n]z!oEDd4oM='ܠh*eZ>LzͳdaN^v5C.\ /֯cǎ6݁ /mpopEP7n <m-϶]yۻrʲJ*Zvk,񦛤qiYp ڷɓ?\ؙ4?h6n,(I ІphѢ=WDZ�Cpam_a�W\g?a#ve:}ھ!O6g^ӧ{�i}ڵk6m}0I&i.|ΝY=t:p_77z6Tl@(bSἷһdIEw rxXj_ѣmӻʛwN9e#/DblٲbV—pev > %-278㉼;W6܅6B5n@ /fև� � � � � � � ��A � � , "�{\;O7Oz-S=OE zP(.�i(*Er __nP4tԾ}{@7x#ߛ7>d.Dȶ`6tmq-FfL/`6"g @m),�zQj֬bŊp_Y[.@ rea%j }l{(v l~عsgŋ#l01)y"V^+@P9 n"nτ>"m_a Jr ~˝Ϛ5+h;w;kaα<gl;5n8,YRݺuS=ԨQXZM @�>9}>Oa#윫kWsm.PlYSׯtA^l]9P!~.78\jӱ@oyg[dEInYz)~@bkɕ[nqmp:XGS˖?_P1Z?Qҥy-ţ]4ߧ o.X`6ɓ'|XAدh}\'%dYd:A&69#`wlƌy@�@�@�@�@�@�@�D 22uD�@�B ȃ _-TgrSe cg[QҜ2.iԨ-=&{\`JL&z嗳 [ [ f_gaPg֜9sqƠ,\1yIQ]$AA( A%*b�0kD5 ׫ *E"Hf:2;ӳ;{Lު뛭ӵjپA"TuP(ve(|rP,|ŋG"ѠA#L7Fɒ%#>>pE"xٿ!ssQ}O`}7nhϦp#aT#?D F͕+V%~=?O4lM4 [ȢEW^ЪU٧㭷޲/^{XoݻweRwfnx~| 4W8+OK@TnG|H&~rev۷c۶&޳i~  8A#W*C1> "~k+!cd0 *c0Xc>&͒ ˡ}{Y3`8:YU�of12AD@D@D@D@D@D@D@D@D@D@D@D@D@D@Ҕ ӴaU- AƋH7O? u!#�$!H_5M!Ν^{-FCS{CEviVd^H-*,(2(}7o`YZT)\ իWKNQ=Wغu]b)@"m6˥ZjVN)b87s019{|~яͭGP"JW޽{QP!'8Uzp<yr+2;vmb0s}R)#^4'Nbr,\p۴i3O>¢w�_{a@*| B|wGI"@@Pڵkm̀q ?l\1 6!'7`qϞ=(XM61E (|8Nvg#GŒ" 7|Lađ SY@:d:$";v�W^ |cw$ԝ+!ԱW"ШpY#nY}={/̢IlCl|Q,Gɟvٲe5kfϞ˗/Y*U_qhd>)W_=.\hG(Bm,_6#9,>*&s鴴>x?O̙3 8PhD�#֭$ }v#'(<Bqc ?߿˔ZB֭q'Z bcTsG͛C׮]sx+z)0OO>TYRotim"i>PV-hεN:ږ| t^ h>`|pbܲe P13c J" ,]4[d̀&eo~\r^0;f c>]'D pΝر.ddHL6V E@'`w k\)!H*y4FZ(I`>Z5?sfpg?Q<MB/:u}͜9ӈm)ŭ|guq@%�EJƏ_lظ(bʥi/?125aQ3o=7mڄ/iӦaŊȗ/6lSO= GԮ][b:[MMwec)TBaӯ ֭C̶ou ?sg#F՝qUVţ>jfb�)9ftC07C3fůe\|$k:O!2^ΝkJ*mۚk=( t$d-C@󁜷%9bl>c޽\G1H}>0H'r$�2?z_I-2i~~cMIq)^3`@\T&" @@bȑ!" " " " " " " " " " " " " " "(LY+" " " iB@BiҐ@  \~9P@Ŋ92H2UOP4P!ǤFˡZuHɎ`=I$uVL<&MBU`pj6m@yzz$9#pA+~Jɓc֬ FoeD _D=:*gel͚5 ~}-^kѢrYjV*@_1{lPtXd|խ[7jߣo߾Fv9~a 0JO:ƻ2 oij>+2E-?o(Ծ| ;tNZ?c P>ԩ:wlK..UČL'8 .]ifZqk:^|A`ΝV`@$QO<`̠u33cL�sY3egt0_-cE@D@D@D@D@D@D@D@D@D@D@D@D@D@DW$撱" " " "|L>s("-FS> #�Xl̎55_T |вen}ˆfoDQ>}f2cƌ/.N-R]ݱcGiVg})SܻdKsAB4nT2B@:kl߾,F՝\޴iS BT}V\H_|a}}zs[jU{ѣ(g!C`8Sꫯz깰We}<<x oDrվk[vBK6Yx>7\5m^@ܰ.k׮EJlLq:L2n1"vك9sc}!֭J(z_z)~ =i0:8d|dLL技@ H2U\|10KUWyɺ"!Ȝٹ7�͛k:Z{졅L\5+}K 6`ԨQxwpB+Zug{FԮlN攐UL`޽1cƍgB7"{FŊӦdGI&YN:~k׮qHVEMc<ի_-ZĻ~|f~'OO6 ={׈?؈'ov%D048IH@ec(c|կ_?&"` pL8 &O Ev 8v&$cyX|;_b^Lv? +#_VH$E@D@D@D $B*ZD ~ 8CD>h2Ľp A2LCF=z�wÈHaU >�B`T n֌;-i(Z1vX 6 SN '`(PդI١D ],X ph߾=o{=|+:|#FmE(KѱcG+.mz@2lڴ 0QfΜjժꫯF߾}Q|d2v;[oYtR?l9oS* 6K>x}UJh_b#@lt6~Dj'Ͼ>|yi ?|p t %(9<E1>4颋.f͚'_4m gY'P&p=]UCH*X劀W L�4o, =*w%^#믇%鵖I=_~ 4n|$KHSrH`4h*VhR�rXr%{1@F"5 r q,qLqlQccci߾}9r$N:$sk׮СCA }CCF_iӦBqW]uFJ*Yqyy[ȹsKscGa[R֬]6ڵk˗<l4x}#y>Pzu">pI |cKt~d,Psi8sy$9m 2?1cL9c. y+�9j0dH*-Q"-z" " " " " " " " " " " " " " "er6xQ{w `tn  <bH8 A~zbh`wjkB/Pre3?0~5Æ 3-R2Jccccccccы/0`�:tUVaʔ)ݻ7 .Ee�bnO<y2cŧ4{$g͜9&MBf<bUzQxqL0O̠HXΝm۶WL8^hpj>@6>)-Pg@:| sp9 }0pNù $"1ǘcs1VLJ0v^RN,Y*+TΝ@bj " " " " " " " " " " " " " " ^& !H/lH{Ϟ�=PPҊWA" $ !H6JLںX4k!H.V,P@JWoqQ-Zc~@QhCYD 8888899&96FZjG1 o Ojժ^1Qv@h߾J͚5qgcǎSZ#FW_;#O>9k̊qKZMoq}3ND]G@VI"W^܄sU8g܅J" %ct1fcx*wƍ/L*WM$" " " " " " " " " " " " " " ~ !H?lH(5k-iӀ> Hhq\D'~88+3sD`ɒC7j>}`wjk|GS&L�~={6:wj> "$&RVZezjzMe\KzxWJɒ%ѤIyسgOҙP`⦛nߎ>;˖-ѣGcʔ)>|xRM f[H*7s4LDE u4H{,~ ËsI87V%4cv9q<2/[A.]剀 GT D@D@D@D@D@D@D@D@D@D@D@D@D@D@M@BnY'" " " " " "`_|4kp!'@e/"7*d-[`С8묳Og?8Vn✳["JׁB 3V<n8TZ DBRv޽G>}�,Z]tIJ*$#;vmQ=_~K/+$M>֋^O&Mf6õ^99&96{m*lȑ#QGen.\8fGxQo߾h۶-35jժɓyv& =C,eqov\mmik=܃۷5p}S!oroѢc;صk)똬C"|| Nn5pC)>OsϡgϞ Jr|U#"pn9 mSJ> 2ޯ>c7 DgQ9I~/B[{*|cwq2v`/ɄSO_}UΝ/V" " " " " " " " " " " " " " "uz >0kЩб#`4PJŠR" >$!H..tҶm_b„ 鬔qvpB@!Z<yq˩`Gbh5k?,<Lu޼y뮻?B$@n:Xvaő 'p8}ĉs,t^\xk]\7 /9$| >s;f9v|A\yVT?6"9PiNiZN:T\'(jBNf"GZV?OJ{]vh,ܬYbϪU@1Gy JJ~)Yr1|psknt  ȤHO.W9s/F"uվN4pHx=~Dr}| ܳ?}_NocOѣ�;tN{(p.Yؼyu1<r>/cʕ92>o`<14ϩ<4Kv2I01M꫁{]p~ޖP NRD@D@D@D@D@D 㪫n}5 (Z4(+EnΈM Csvڸg#ˇ+V`ҥțWAb7ZsV-|U @_|Ep!W�M L5H]vK.\ WJ KjN:x>M͛7/5vX\gNƍCɒ%勂tplkذ!(1˱1㩧¤IпDHgkvBv|hӦ z2eʠQ28/f8._/nE2Ν;K *V={&,?Ns\C& f="OǍ9ҊSmdړzO/wʉ]Xh#2`ϢYgUZuzåb>97`6mPJ-M.F;<} 85j1?#FϷٳgjT'M%;YHa.Y剀 l e?h?IVĉ-0B:Fgw@ZX~/m渮=܃/2G;6&ʁ+QDrm�g6۷n/X`)֧O(yжʕ+-eb6m?K.2;TP:B|%%c(yi-٭+sBjFc?y?qrofeiΔ)SCvY򎑀|D2~!!aRmQ*0YNޱɓ1 3;v5(f{Lƥ` ]r%xgjXz$LTAjd:(*UB˖-�]S2ڗ6k>_~eN,9Y<;ts '2i>H9[>"g;`+Wʕ^N|s 98`,%D9k{sǃDNMI#uR ^{5ԪU -y3ݺuC…1ǘg}2B~{ GgE@"عb"}" " " " " " " " " " " " " " " 9%?| ~�wY81nr)"l[RK#iZkXl(ѹsg\xv?UW]+Gߝ?=z46nhY.Rg P/[ѭW_}=^x,^'t,Ybhܸ1km޽{֭[nôi9oa*'L` AcoPxqpO?m⟱c7mԖuG�ó@VZe(DV+ F<0+Y|.t>x h]w݅ӧcƌ"EࡇBq۾d?9rׯ=>ZOm1Ypo'OFٲec83~GF,}8}Cwt ۷o7gyo]zqGÆ }W3fLp,]{8o5ڵ+~ W\qB}B0("I,eOpYM4Y #wލ_~Ŗ3j(?R-S el;iV^|Ÿ袋2 #@af0EDX><EXؾ �I5#sB x'5#1+رAkPh.X+)\`m7fe9k׮Yg_m$A'.?W<(_|L("XʊȊ_8vO?c8S<#ikU]_8䓃uM. 6̎ <PrܹMVb;W֭kMD -p8Dd}oൃb]tBYMV{̗s ;"~SuJ̙3rPflB!C2on_d=`˳ x?¹cgD7ܛ=| 3f1_ԩ�1奔Uȭdw8S%2s%xt,1g϶1j8gV>"<UV:uYn~4h()f"ԨQ#o n|D8)b0F Gcuҥ1ń`˸rAy sG{" " " " " " " " " " " " " " )$`!.ng@/%!{fQ( |q Px pi2q0=M8"9) HON{|饗  u E;0oj׮m}~g5kf#F 'p5J,0 Fz Y0-#h>crBJpl,ǝx4zꩀ?\��@�IDAT \ve# i۷osHM6#,hc9&34[#0O?0=FѲ2 ##0"]X#`[p>#1ΪŢ2ٮLF2Ю];}mC{ր @ 1{oH} Z? fM7hԨˣsg A#s{,`t!`DmFp,PpaˬZj޽{ڶmk+V,@>Lly^={7pC _|#-[8;N <Lj<&eF6`Euk=.p>tҶ, tմw}X3aލX,!X1njYhmʕ+vb2Z`Q>Wwyv|zQLnaD$wrx)e'PFx4☁+~6# lG�#j,m1? CJƄ"xp>sk\6>)>wHu~IKZF)`ݜc�d׻D%ې;e羌}6qa{L_Ds[?^ˍX|z6qL0t7<.Aٿo dη&}ih>~&ۗV4pg4{pC7/3=yH@0˜y,zLk /En}bDv5k ӗ(Q"!S,>{B?=nFA0"#gUOcYnbD1\qEp\Mnb+oI<&U]yNvJ1;vdہ\Ӝ̭]2XD@D@D@D@D@D@D@D@D@D@D@D@D@D@D SVpG@B8(ox챀Y 0mkdH:4`\}Ձ+Wrt M܈#f͚YcŁ;w8pz7G`s \uU̙csa(Eq?g޼y):$AM6M\I?9$p)!H[2ųݺu/X ٭[.x>x6\TP\($7} �R4 X1`�g 8q3\`&ni0(xz׺82yО2eE,u̙<h#:y6 9E^1N[; � @(zyG[aKHAryB-Zuw; ARIo2qn#I]'QP8~b?)0uT[S3;u f=wyf#D_|ъZ$"OR؁UVVpQ;Ed)Kh>\r%6k;e,)pSV<}D4~|͎,GDsm_m{˅l(;a„XNOڱܲeKBʤ58*$'ex!Ei(*qϗ~CsS7 TZ xĐs&XXm^b=j dVٶ|Q;Hl_ګ _~?i>83| rv@d~_?8-*9 8RJ|s ֙ex)E*T>ƩF5 =E77 IҞyPDb#ͣ B͘1rܽ{w$yߒ"pu v?py9xVCLE}+L>L.?6i1Y*" " " " " " " " " " " " " "Wy?])@ZسRg  H˪R" q&q#PذaƎ 8F C)F~裏͂'x"=g&c̘1auu]իÈryza̯_~0Rx7~Ǜoi[޽;Y4,B͛1j({؁ hҬF0C>~bf7bv޽{]dxY# ޽{c͚50Y]ߌ9F#(#*gO,}m? fF M4q`p 7kSX1qm3L .nZѴiS̝;C ۍ}/R}7Bʯ^zvǝMܔqqܮ]`<Aaq0)Fn:*Vhm7BWn?C96ɀL=xwax_tjӦm+V`D+</'ul#;sR DV,gL7l0jՂIQh>8cN:j=>ݍʊƏdGduv#51Bر#]􉼗Z"/?ܗ9kF4F^?xWr|ƿ/7cھN;/08`D`rz!hε^Y^{u> _oyek{<Gh>ŢY^^,[\q%O>F(~fKɯ0t-t#8Gg<0i3il}SV#s|< 0$*11G0Xtycb\܈_}}OV>y-)R_qln]4̃`ޝMz!c01J" Yعlf=" " " " " " " " " " " " " " "E!" " " " " "9f} N; `D`@ϙ(D@<LBSъl\Z9:fn~\|B9k`G&l>&.ڵ+MfϙhE)8b{(cR1R^{ ˗c5klO駟@A>/]ԖwwD7Nrp_E}ǻa씝|}_y~O<-[b۶mٖڬR>ඟfwgΜ9vlۅ^}bڵV\bvhO*U?q ?s!ѥKsg6vRv$sYK,EQH(4?Dǡ~晹dڲeK?GqR@oNf<y+'}Z13á":4nݺ5xg+3#w<ˮ๡eG.>M]:;իA!r L<8x nV+|#(lHDҥKlszl[N˜G8r{ml_'O}b| <:i$Nݽg}õE8cml_& Fk}yO=2| U<rOWñH48D=rvbJ᦮;,YVhѢ Y^Js%kaC}+WO=ڶmk*˜\{뻳=һyOC"c7Bӷ}Y}NԸɪD$7}%~{ gnwʷ~'Qh4C- _v@%?@[ C5d*k;&,믁ScJ/ A+W6l@ٲemEf͚B~Ǻ8Y;o޼`·M69_| E% f�z!\veO?B YfYlѢ{Ptl1uTšӚ5k2owݗH7}�<6mj?{n|(Pt#^9<?4QpqѢEB7ѣ=e3M\J.2?$jPbd3Y;Bg΢$ulD*ucE d֕L`Opr s,'"zꩨ]%"OFʏL쫹G.>M]'b/Ix:<Xbw}7:,[|?;v!CpW$oxyxw0rH0a͒*ܶxqĹ Q mڴ"q n_0t—gѽ\m| c,4qsq$nJcoZl3S_R'58`Y^InEm ;zg|HDǼlj+~سgOLԸ(>)qE$7}%VCᅬ:x7߮c 0Ui��<* TxΝ0qH) E@D@D@D@D@D@D@D@D@D@D@D@D@D@D$" " " " " " |u�s,"ɰ[_D@D_?ШQ#{Ό32;|Yƅy\E|nSQxqpQނ QXb(:WJ<3V8s5\cO;@hv,gb^}U+n7vX4n؞~ZI' ׿~-,h^7}ź5袋p]wB 8s0yd+0ٵkWeO3:S,}37p~7\xV6N>Ke,җ_~it;?0\%gt& 6fe%EGRtBLD?lQF\lsq3Í"E٩`6@t钍s l~vxŻ$^x9bf.#"HyM6 jРlfύ>"H>⯿ "vT7ueb_uפkyC[5)I(|"{_זT/"2v^ulv[{3O`tsbsվdF(ݻgon_ȱ@K DR˳582v踹GWubb0tk֭[:1\B,+)!>#'E <L*Ub8+Z;)f�%Pn|GGPh)͛|bd-)R_af ß͛7c̙8b8+y2ǘcN}W30y$"pyf 'H A& 2H6 .�>8d[D@҅ƍ@jmu3իŘN2e;ﴛ;8( ^{5pl ֯_o9Bq0gBN; >tJjp'c<ڐ9͛׊1 3{%JwޙO MV;vZyuQА!CpףO>xgۏ om0'ŝty>C8R`<裭(#0戀2nihn>?8cA1ӭ[9%p ep5r,,Y2Cƍ߹_7upUWm|AP�B=qpH 0_ܴ E-"uWXX.֦/[r%|M|Ǭ<xE_8鈗Q { jx9TmٲeA >57zB{/_hq kLl#wcώWfZCb:>SUVcc]ÉL>^zYD6אַSL`ǎv<7 fU9m4"]ҍpSV<}ˋ/ܸiٲ>9[x衇>;6K>6E+ _h :t�Ÿy)S%松By"矏QFYrrr_k x-82K� db]} vq{9[S2ڗ6k>p4xD@Y(oBid׸и1k'c%O>dp'_[R!5Xw=8a٩Nbc/`,i6.v=XO>h̘1" b-O806JQK'h>yΣc:@n|qE淤H}{к 1q~ѣG g%Py3ǘcN 8D<MID >h0;ID@D@D@D@D@D@D@D@D@D@D@D@D@D@D ?-$" " " ">{&ҧ>@zػ7@ o@ҳ{CU~" lljY0d#(RH/qŀ `HQ׭>}zF6bŊ}рY a߀Y0 %kef!f̂@[n쾚5k"`#0B,6/g[o0Wn&FPHТE+V x#0fa=DkϫRJ\%|s p)kc&zQ>gϞW\9`D3wV}%gm` ,~Wn݀s6w#`g ,0Q@~!ʁ֭[[{-Z=܈Z{2ХKٳmƧSbŀ EcƏ0f!ko TZn-`]mf͟ma<F WdժUF`D:uߛ6m0U?3)v4~}$Y8hР-RJaÆ5kh۶-{#40G5i$`Ď5>֕a Y4#B([lqҗ^듙]vV8۲`إ6nNM1J<@"ÖZ9o޼`_5J./G<H'}|ܹ:{X2o#x۲# #h'E5fü4b&^>bƌ|Df_0Bd\pի[pBW'N3`s3gLdQɚ~܈ACv/Bl͛7͉ob fO?dƽwsndIlg}2b9=FdquL|`u^q'җ;e@ؙ{S{d" 2県xX|y!)�+ʹ ІTH"7>{99|؈GrbV2t3`1Nmx?S\_l f7mGd53`FX3P^y3]wu7Xbn~KW[[y\!sq,c{+y)qje~ ,X%dxM7 [d3+{yPMw]E@D@D@D@OLToyѣnݼeWy8^1,ժ.M@�:u* #8K/cĆxb?1#6L0 5QT#E۰c\FFX%Ggf1cpY;wˆIeǛŦ_`zOa`*~KzI돬g};ˆY�YM#{-9e}vR`ƙEpGn�Oi?T{n 8o&nvp&t(\0 ̂ uY0a*PFpDZlDx mDkmp̍Əe#׭[#i :B آ5pҥ0"0-#;f;x-`{x!?v|^ve0"v$6# HڵÐ!CPBdoˊ'2 =Z[}D4~8d?4c%Zs#ԕd~%kך{0˜ܔdaͭ~wQvt#`#ЎB ŭ\xF$ddA̹Kj csDdS{| {ܢg'j>ͦT|hxDl"3̼ƚI2JTXY# 06jbcI` t}p#h7z{<yy6l`3alee<M̀8UZ%^#6 .Ę7/ad#2pI0cdج/" L(@D@D@D@D@D@D@D@D@D@D@D@D@D@D@J@B ūE@D@D@D$6T D =2+haxQtm|&!TnE`BI. :w>*+*d r-Px]VՌej\ > T.]9-i8BZl"n�zS,wnq^'\Ez!;6ܮ6.BT$?0O?m݆ 42ElnP^I/RZ=a zaf)^oK<C3FիgE%w%/9sM6VꫯN8m/Hz2ؘnHkkd3l|!]iN5d}̾sϡGx'>9>G:1Y' ^>xЬY3+AhYƍSionyet#?*3gV FP!w[H<ARbE4z/ا%ԬY,ʸ:u@�X fAbƆطoQ̟_Ԍt}gnWL;<y~nڴ]ݹsI[nY/ <] rl2 WnݺqTH{ 4iά~1h uQM6^NQFY!^xc]{ >5{2:L¬?8x ~X`ׯЄo? $F,kw˖-袋бcG$CԾ$/y(h>�+A^C {:j>JmdGspX84p =/rڵkϼz![}^~`C!C駟F1tФ<)?;ݻz@|t'@+uSD@D@D@D@D@D@D@D@D@D@D@D@D@D@DKLAz╣H5xTH勀ނ�: EӡVɭ2>aV@@ 0p cѣG'4g=`�uE?t-a_rIƪg^xaƍ@QPͰ'_(Yu9bPl8ESp?p9r$BʁIpa.~A+V+}݇?sܻw/^y+DG)�wףjժ)B9r^O$L46%T"`P>bhݺ5N~OMdN3M0|*U*S&w7\4GED 4>_NgIN><�f͚e`b3IB<@`ڵx饗0|p#W>s9A!̳OJ" yÆ @" H2t AA# "F(J;h0p0/@<iT$VEBI|G>7}g  ]arN; 2d(Fq}e˖q/+Rg݅ _J"̙_]}o}>,.\hE#=ܤݻwTdЯ,%a�Xz5?|vm[Xs1w\L<͚5-s(eıd+SVMr/oi>@|h>s䜡r."8o< <~!N8WKQbŬNv#U"=f3Ѹqc (!Kr nСя"j{.7Vudثd Ad U1.#嗁NX%%08 px10}zTFUpM꫁+%@@;Æ ԩS={W^hҤIQq" ,{Rح}߿?za XC;+=zc#:vB JYRFkJ9s&UV˗/2L;LJ4-~ _~2jT/o&7k>D"2%@!Çǚ5kЦMWTD`Ϟ=2e|vE]~yLpڵ0!:@ҞvEn#}UUAH) A H@n 0B.e0b@v։ Wю1"X0BRYn ȟ?sutr lذF;# jժ8쳭[۶m}+b\*-xҌ30n8?,f^fg>}лwoTX1mڵ֓>bҤIVSNOteʔI""O?_+Shٲe<Jh^7ߌ^z  <`aZhf>m4Px{T\95UƯ ؾnk[R:N|@ýAD <t]ƭs̱qE n~lѢ0JVx�ĉm`ɠdΝm̠H"28֘"TN4"P֡sOUJUE&HK![D wX8p�f PNZK2D_:0>q3ϤSThN<?8hGkWZ cƌ/Vq駟;3DݺubXt)>3L2{@"zs=իWOM.p0aܹs'6mj} *lTx�E⋠X~Wv|D֭7o^Oؚ# Sꫯ Nٽ{<xf(VXCSM}~hXj@,tln#�@no,}>1k,3;v}hFJq:an@꘴$@G: )ȸbnPDyL>4.-+JKqCW\D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@E@B¦D@D@D@D dikTH૯sUƏ=֋V& AdurTx㡅-)QxYҥn ɆX lݺ'OƧ~j6olif_mڴA}-j+{PGh;sLL>ݾ6mڄrY.FYSNGK޽{!'/^… [qLmSNY.m.U;~W̞=.Y|}bx1`�ϟ?t'K^G뇍7gŕW^ʩ}co?o45.4ޒDg#қ@nڢe/7oԫW>tqVZ㎋5[/ |71cP"'g1^@H>0qtO&|Nk{mU?LdI੧`bE^dlH{L&VE>⊎QE=k/ /MF'@ �# *p%I(PEx�L)dL6`(ԩS틋mۆ%JyV͚5By(B@J Pt;w.0۷oGRavо}{+~'O)_ZAQ+V _|hԨ-Z>vCʊ]pB̛7S֭[gxs|ĩjQ'۷<qTZ>(;tZ\l2s=3f:t(*U2Uڅ?J\5}h>| w h>�Q-2v !+W ΣZlO>7F"Er^r$O?d_m?p�j֬iOWdZʍ 5k`1scUg8Lگsx>ğ T9@ZdZ5*#!0x0p 7�?}c }T24nʔ>!Ʌ>8F0 h q#ŭK.ٳ1k,+|rp;EpI&v6E |78֯_.Ʀw}gis kժeM[nVZnݺ-fRL\`(@٦M⤓N rΟ?6Ki"_obGٲeq)X@?]a´vZ+t8zh7>t5L=S1bի'|;w]Qotim"@rCpV)'@ˑ 37Fn˖-66P~} B2c J" 0.3`|)l˕+Snh (@$`b*G\@dP ' AdM7/ #D�z_k}%6!@Æ%0bZA 0I@NC%'ip `)f[xR/h.OHKNq*%WjԈ ŋۏ?EqZNkRjl RحYf(YddJ3+]07{`ݻ >|ZjKF2(<O?~ Ec98G>O?Eڵq-.uӦM3<O>5k]w݅/<OPھGsοi>s!4/Ϝ@N x| Ds31` lj8VaV0.>ؕb̀={16ŘA P@hYZ�^y%"Ps97S�ga" " " " " " " " " " " " " " "`L0`e/" " " ~' !Hࢋ>~8|GK%V ,�45V2JT^#`4psy2ٓ Yp!{+�mر_LԩS GqvZPF p (RH2LT>'k.^+W˭ݖ-[֮xAR.nԨ7n,G=`~"|߸q~j~>zPh<[bŊ >˗3 PBUTO?#GhѢիlժUQ}mpy7uuѽ{w @fn)2sfnx~| 4W8mj)׭[UVA"m=yE9o 0Aʕܟ-}?`l1E'~ *XG ;`\0cl}�U\G_fN=5U_dRq0 AdMYgk-[YBj/Y<o\w@qZI` `E@<j@ �q/]Ծ(n޼t;ΊBVV UV:ެ˟?ƌ-- ߿򋹯]EG.լdb*W��_uֵ/O)m@1?_GP裏 :>|(V*,KsD`˖-5kؾB{O8¢~Bą ʑ :0^)[aW(2ca?~<ƎiӦTRӧ틦MԾiڰIIⲚSI7pk>mK@Xz={lи ;wu/X #|1'^ό-[6r OP1'^΃e/{0cNܠ^zvw8G}.31:<//k#p #(zr Ad S_E@.!`=kW@`Dq\RWSB)n�Y= #YeX ,^ 4h�̚j” l߾݊yp6_r_aʛ7/*TJ*WŊAqHG}|/^sva[6nh)B 6<xb'Y5ͮ*QD:R }E#| c9&#oB}+J.-P,o|~޽{wu| 'lw0rHq^Ltgqڴic*^EAfϞӧO>"e=znݺ"31}sc'Κ$J|K[4G;x(XR`iQrshHp`<14 ˛Z͏J$@q[3`lщ+?D0f "߹MD9 FE.4/yXg͔a" " " " " " " " " " " " " " "$ͨJ@H2ql�8н;P`tMD@BIb|G`@X@/F^=3矏[(8p]Ļnݺ \K!0mٲ\$.=c`w Qe~*U Gus޳AƶmbM6yPѾ<ylٲV-t!~ʕ|=_|ٰL?3?Aώ ޽{86D ~/Y$b@F 0GP!W}IOv=)sժUQhј !<+Ν={lݺ57o QFv%Ǣ#Kah"|f3 ?$[=\m۶ɄO & L5+Ne dZO| UTX3`y8 eNbB'3/w>J#{?x1EN@p 3 Tbc@zO /y8lPvjlP"*_}uyF*+T ��@�IDATZ@ H2t@c�}�;F,6rvǕ S=U@JÆqy^y pofoS }"aQm;/}(Q}9)FVxqPhg )Rľ9ڗwe_Lq;vؗoߎ˾;8lf%gs{'Uuw "M bŮ(-*QXbh`IŊRTPE#bgg]Νy޻3w=}g<7tn۶-AΉ *|Vm/!@P42Hۃ8l8l/ a6QF!HTD.h;?]yDm򪜴= 4*vBۆg9C@A ~m{0e[T.l֥Kܹ)( &S 09s0{lӠ@3g4ͣߪЯ_?Q*Վ2`f\xjT͋ _なC!c]Ԑ蜁sA#C2-<A9M-ƟWT^:}s|^QA9E~As:gcH=4BNj INǻذaf^R:-fdngCΝ@�@�@�@�@�@�@�@ ^@L#� �l @ Hx pmfovfA@Z,Ye2>P".f?Y" f0>8,@ (Aw<ִދ:+k)D@`oaZ'àݚN6{J PA5k깎?XNCX%UR!=Nô:^v˖-#a=Uyu>:6!l+´> ƴPpm¶!4hrPy{l!l#Ǖ0+~ ڨ%]ۉ"lX Fh[`Pp 4s IAѠUִ~j[o=TI ݺuvzp%xʘ[(kYL{kƇ1}(ի7r6}7б3t@\A E3Hʲ:qw8A-GC>Dk>׈? zMWˮunT  t![yp@Q#%龩Y̝.Q# <՘{(Vx@�@�@�@�@�@�@�!@ l( � P,KȓW]ٵךiAǝF_K2藕V`�6m:vI@U|Rt!tk:g ӍU,^}<6b)|]5orzM* ?jX�P`}86B eI]/[@{_Gj!dB&*o#6y~S=>@f <_آEʃ(؊ᷣ~3^GѴo֡Cw_o~Yzry<7N>}F}*qT=Os<PFOjx@.i~og<sy.0T^i@- `6B!+SA :_PAU-j;|_}՝?v"9g%ۗqV8wHT6C^{l* VxkI@�@�@�@�@�@�@�@hR � � �`ga6bw4^u~ Px kWx8K Piujкu^|3j+L @@fm̜҄yHΗM[ΝPeY#g\((.喹)?"@jx ڸWX۶f=z\c^駘r!or<?O6A.0dx URA;grG\@�@�@�@�@�@�@�b[N � � �Xg?3{1&dA� f?@ Q!C76RdW@at1S � �ifnj,UI s}EhjIM3=lpٲZZ A ǚ=ٺu %T@ sH � � � � � � � P d� � �fc6eرfuG�( ,XPVv\JV[h~ fnRY!0`� KcMSK@�@�R:լWR)uD�|rٻ}A>2@ mۖ`Ѣ|嗲dٸq@KM@Ʃ/ � � � � � � @>O}� � �̙f}ٛosW!@A ,\XV >o6cg1SB�S ȉ֬@�@� ]@ {.ZP~!tdv}Q-!B�\ iS<HB _ݺ#,XL#!� � � � � � � @{c� � �oo֪ل f]$F�P Ȇ 6۬ MQs*гAtSNC8|٤I%Wu*� � @Q bf|@ ȢZT ԩcvIf<`n] Gq@ -[5h`hQH)0dD͢XҬYA�@�@�@�@�@�@�@ 쪡` � � @ ~fo^u P: ٶmԗf&_هf6?s!@z]ڷ7{2 � �DW`,+5D(O6ӹ[#!@i (l6fVm>lɒ`Ft ZE 쫒# � � � � � � �؅W@�@�@�)Cf?QGdc  a,2unvM.$EC� d6� � @ii+? @Vڬ_?jd�"@Ha)f :@BV4kڴjJ@�@�@�@�@�@�@�ȿ� ( � � P4bv fovfMը…fڕ@Eb:ϛW23P ֭K1o!� � @N5ڕEz%Q8Dओʂo)( JKm[Anm?쩧6,PW ]@\͚z-(? � � � � � � �!@ XO@�@�W]pٟd)p ($AڪݲrYf7Pqf_?L@ 2@�@�@ z ٫WE@ 1G',Q#H-@w #09ˆ[o5;H-͖, jO`*A֞6KB�@�@�@�@�@�@�(uA7#� � �sщg\@fmxfE/ ]rٝwuk?m1SGQ*@a iffV � �A]jK@>kk,"Ц٢EQ) (U?7>l3 /4{)o1kժTew \iִi֎z!� � � � � � � -AFk}P@�@�@ !SxW bv}f?nv?@.4k߾JLYkS3Z0;DnlݺLV%aY@:f{E X@�@V23A⺧K^z/U�hۖ@pgf^@ʮ u*)Q,f֬YebP H}I � � � � � � � {Aޘ% � � �-fٚ5fMTVo58l貎w^դ P}g-ڕ8O*e^}Lmڵe֯oF Ȥl@J:Ӫ, @�@� K֯'da5J@a :TFf#Gv=(=TMM�LU4s#P}/(CmVeI*@ Ȩʅ� � � � � � � P,ƵJ@�@�@�, zٲee*>}I^{eqd�A`²2_GթC ȈBa~GE @�@� ͚um^D�.m=`ֳ&C@۶e.p!)ZQ cvfꥮ^֩] Q`*M @�@�@�@�@�@�@� d3J� � �Ԛߚ]sMY-t:3}f˗M`֫W!�9X,s2.@K/5yg*+Vygy 츣Ye � � %SͶά.wEiP^ʮM͝[U Ri1M/7v[/%X,ր#� � � � � � � P8܎]8늒"� � �.𷿙vj8@�XWV[J}s1լNyQy ԫgֿ? * � �P ޽]FJ�'pAf-[W7j�ڴ){}Ѣ*hbKQ4@a 0F�@�@�@�@�@�@�(LAz � � @֭pQ x>-_�A3a]Ζڪiy;v44ɬo_3KV2;7ٻ� d*C�@�@ ꚡ\r}ȑ]Oj�? lq um@>H| Q7<bN@=AMn� � � � � � � �? е' @�@�@�'3,>3;�+ @a,X`֮]aR֮cv;|Ab�UP Hm_IB�@�@�?쫯�ԶСfS}im/!@hoɒ|-"`vfooV~EX@E?͚Cm � � � � � � � d%D�@�@�j]`<[n1Stwn9\�D[`B]FJ?ƍ}aCiǫ Z`]{. � �DG`Բ2Q(}) 5rdԙ"P[-]Z ? �9b?'O@$I`ժ*uA�@�@�@�@�@�@�� v( � � '?qN EQG6.<]@�P v ܔ37dmLu A06|W@ )wߝ@x@�@� a[niֲeJFy@3;(G)RG-Y~{k1@Aq\YVMF@�@�@�@�@�@�@�h ݎR:@�@�@�SLA:4ԩc֪UW͟ovf={4 P,R_t)(r~;4,0@ű& � @azJm'DQ`P393L m[4۹U޽ˮO2H0.Yb@�@�@�@�@�@�@�@ t � � @ \qYz?-V{@we!/ P o_#GTh3?kg,bP Y3n@�@�bP H!!�{o֭FW X.Ԧ~MqL@ׄ|/@ _�@�@�@�@�@�@�@YX"� � �9P^uS  1;qI'5l"9 PV}YvhX{e6qbYs֙}IW#Gw7S7c!X4 � �d$sӧ2#,fB� (QG=HA ![$B(%-УuD@ ȟ,*];Wjڴl_@�@�@�@�@�@�@�ȭZIB�@�@�իmʕb ?rwD o͚5azڵ~z<j]Fc[n]ze:n":6jpl0ݸqckҤIKs[16l]tQ}#!�E,paYY+USy+?]r_z-\gl6_m.:F6>]k+ơXm}6YfּysXȧڎ;ov, F�@�@�t\ ޽ @n5>lLsײr,rG� nmti~ G Рk;hе0Aut{9t}'\Y6fmv}M;;3_ײu ':N&:O_ x4niu &DB g㓮ݐ@�@�@�@�@�@�@�@ ̽1K@�@�@� |w_aOo)?US2 M|T*~:t<c !�eXԉ᧴ᆫ]LJstL@Q-Z76h#?M7вeK?qV\p0S Q F ȈjK-[jC;C_yv^՞JjN6j4ߞ~zM6_B^_?t>k١=O4^ |:2aeWdM|MW[A$j"Я_Y Țg@�@�@ S{Y_K@�R `ZOXKyy [`3wܹ® O-;{4tM'~ttG턠鮋gC6.O{9*_ szަLCXgTďu_It)\ѽa0k;tG{½ʇTֺK~(m j� � � � � � � @vY  � �ԒnW.Eŋ+ K.-+'j[nm[ou@ ԬY34)L&MQ8a5. $IbpyG2T'bΜ9AC3*'u*PPH rlӦMm۶־}{?ȑ�Զ…f_6Y^Uƫ _VK,)k:PgIAա-5Դ.]TcuS;=2\>{ɽmȐ_"3V>2tS8t cΘ1<:[*d} T{땫6?aE[ՠD@@fFgx@�@�if=z$2!PjSua,N}KSn]"KӠPkg#ܷ8A?K/*'&\Xk:uwBC]ѵ]k< Ul~^ yp'Xr̝;_ zInuAxhнz(tH � � � � � � � PK%h� � �/M *>n: ![la;Sy`Pc̮PHP*IB=y@uP5k>xW_}e :hh)0V[me:t0AB�)@DXBle%/u`S[]CxWB_~ 6سgOƇAm7*ې!ʽfN5O9Sca9uTkӾ{[noXI#'f'oԛ"� � PhPz*RS^(VCs皊 ~ܩgAF{:8? NtoB|@A]j@(?LrnZKBl-eݺu�ݻ!L뺏hO2alZ!)p֕BA`Sy:5<Ԣ?ϖr(! � � � � � � @Гx%5A�@�@(tӸ=Μ9>SlC|GtMva;C}@!Ҡk﫡@SrאIV'^ 9~x߱@&CR'Ν;[oi֭[ y1F�$@n�=jΝp +vw KS m| VH >IRguTAB[裏ׯY*0ǎMwj!ۥwY\k � �AWV+�*pxf6j9j-(7 ]L:R- ᛺~<j=~uFe>]pXA⡏3XÄ]te(X}tGVXQgFC@ P eڏƺ5rOZUP�@�@�@�@�@�@�@�JD@%& � �Q}M>}'>d�CAB L=H-РA`*QG S'5<uDQwB!vGֽ{wS HKrkUPfj ԱLwmPB?T@* TA{ꕴb jA뾃iOl޼OT?h}Ĥđ "_L � � @ ͬw% 1|28'UCqȪ;NdF Ȭ]3f:;/zTpƎ;hvXyP?=Su6l‘[dBH݇*}w>0C�G8=pTA! m_?5DMap{]]&KC�@�@�@�@�@�@�@Yk#� � P  {gӦM>.\N8G7ww,6|s?wu@QuRQǔx{{Soノm!/ @ Iԩ] }W߷j5(`_,]u T:,߶}W9-YPV�4Q m}:bSHwoCh!�TZ~fW]en;bn]Fl@�@�̦N-S $fÆ-_nQ*eA�l ŶdI6s,V^~ ] γ]CiӽV`> [.,j5-ZXϞ=(S}B`Yf*W^Ç>!`ΣAt߇)繼w%G@�@�@�@�@�@�@� : #� � @G~m<y>(Ԛ5kQFoݔ}*3Ju7뻴Wx~ALAH5Vٳg@e a]w!!@i ({VR[mKyҤImG}djX{]z[](ذaê,yH+j}TA}7w>~㎶N;.7n\9+ϣ@eAjtە<E#� � @BڵK6/"�y4<cvIy) E�ZP,¥KkaA%.ZРy =LQAt]RPc9Ə5< GB6иlTG+'=\vcW"µ=T%L@5 � � � � � � �TU@Uc~@�@�(P'oaoM2,j6vtE]d;찃t#7 Pp'}4ħow|Q}o_y}7">PAF�?Wu0aYtAPs@(oA?1?QD.bQF: *t~Э[3]5kfnC Zgq � �d$I @6l}͝!d eA Hq|ĉM?Ο?ѡC0>ӹpT0H ]հ}xa?lz^zޤwvm7?(8$*f0jUٵ fe@�@�@�@�@�@�@�Ȃ�QXH � �ŋm̘16zh;v)Pn֍ sZ߾}{VNRa(`{B{{|g6>|]~>`21FV6+ .թA,ԮkPp/Қ6m<Ю SΝ;Wg| (@U5ħٳg;c v<r=ZjA>Ac6^.ӊf`fge; � �T]wG9>�Z.=]!@KcYk~;$]ҥkӧ�ٲe E]p~}~D4i5i_!z<HV$drA�@�@�@�@�@�@�@ ule;thYN#Gf+GA�@�ȷ#i?/{{˯?B=>v}wg뮻Zfͪ-"P0 ,phƍ>T'C9=z(6Y<-=9 gM+bרK/_Hڵ+PzFBD֮]kӦM~HpBSgY>:Hyf?l6cF@ oʽ1K@�@ כhav-fܹf:,/>�" z+E͛ga:e]y\,<(t>? lx]znaGv~wT|@�@�@�@�@�@�@�@ 7̍+"� �E#@YWog}֞|Iq{N;x{XF2Ώ(&/wQ�]o/�lGyVn݂2 b5QZxMs\lDjZX`M]˧zFnfNN r׭[<E"m3g`3Ɩ-[f={#8?pٶN:ѮDşC5[l 2|SFL̄� @{wIT(  ܳm=n(F33wڶhSxPx?M6} `W^5bR`Ŋ.gر6ydu1h ?l,BAh.ƬtSAB"� � � � � � � P T�@�@�j,O?m#F^xz<_ rjժ A@c=χ~;zCډ'h{1T: P cֶmqUUtQ.z!Sŋ;lsEl(ŵfM! (@>֯_;vMwq>X:A!v]y]v}1]I. � � PsS͝K0nE @.~3#  [D Va=Q(Ivˠ{5tƣ>j<Z?㏷k;\ɮ9@Cp: z؋/hk׮vGa]w-I,`k֬$N@�@�@�@�@�@�@�ȋ� B@�@�nw Q \sQF($@ ۹^.Rds GZsvgذa|W!P  j֠Aq0̙3?̛7k/+쨣G%yPG[upWE7vm喾WߩS<x&f={O Y@�@M3,߬Ib u@�b803c= P ȯ6Оԅn:{W'|?KAuyРAN@  yہР4c 5j]x㍶V[|ֽ{'* dT@�@�@�@�@�@�@�(RQ� � �e?1vygmLnv78o UhӦ{6vX;w~vwwM4 ȹAktX̞yS'.]J\p)1c엿%A sȼXU-[oNoQI6Ip1m„}O!� � @nN5;7y+ w/{3d#7@� (N~UJyyϟoW]uu<H[fK x̜9Ⱥ6lco܃k?}.{ჷ^:ˍZV5mRQ@�@�@�@�@�@�@�W@Żn � �ԉ[oi?|>^zɎ?xkܸq/[e]f|⋦�>ظq㪟1D� ,XP ׭[;ӎ9ӶGAgLb]tm6^d� 跦ߜ~{ 귨ߤ~wJ@~f']17 � �N@ {]�TCYSI>@4Riٲq!չCZNg+-Z?<xPg!MZ*ܓ/B{뭷l6`�Kl-n[T Wʕf͚e83!� � � � � � � @YcB2@�@�@ LOLO7o _zJ@a ~Oݺu<:  b"XЬ}«c=f=z;8/쮻w޹*C("[oRMoUYR m;9@�@�@ w+V͞mֻwA @6 20oy @ 1ozVN?~{�d/~amQx) V_O[ǎ}`ȯ:' UYkR#� � � � � � �� uQn@�@�2LA>l?̚5iڴifȦ@׮];!7dӧZQH 7l.ogΜi￿ 6N<D;w]uUֲe*@ wM9g[oV]Iڬu f@�@�ȵif sL Ps,.[Wk9 @ )eN}fӧO~*A�4hN:$2e9^y} z;^rLE~Lʤ  � � � � � � �#@ ȂYU@�@� 1kѢ<weYƍ sX@7{Kv.Mo?vm6h ?I.]j~g?o&Y&M+믷ٳg|йsg)_G}vm7M6?#@n )]wv1c2׬Y{ d%¸q~Ҷn|wvwoz=cyj޼7ALJ/Яc(=(>S֩S' 5F�(fluVVԨ>Qa>zΛ@]v1s`H PdMip1#|Iٳ;E.r='Hngӟ]C=馛ꫯ;d eʲ{ :n97|@�@�@�@�@�@�@�r!@ \' � �y`v7j(k׮]KT_~}v=؜9sN:YŨj`yٳ>k=}5*W_}ecƌ w(j}+b{챇)(ꭷj3gδ,w_:um6|oF>ò(I4K]}%\p]x>�ѶgwU}IVl6?٘'8ko76tP/~18f߬~ ߲~m ( (=~X4Sm=t`ܹE;:3 @i̙LO?Y 6\1` :>6m{p- E Y(r"PU6n Hwc=.rӵ޽{W̟F ~2ͬЪ9!LO>6d<yr-,1EN:ɦO淲}ѣ3pDZ`U ["X � � � � � � �^@|@�@�(2kn{쬳*^uիggqml&ݨۺu2vvAB3@wn{n9֫j rZh"jvK/:uCX¿^r1oO?hn.C Dm"\g,sA}}O<1"*bT}IVOJe��@�IDAT:f͏/KM+{r)v:)kvi';CXDoX<(f}H@|QǢUP_<쳫1E�@ =䨞NU [x6ǀU)Gyu^㏭n]nJD]@ n R>@A\mfƍ"jUǟFTy7rFzN&eydڰaCӽPQM-[."m**פ۴if[2[̅� � � � � � � ^Ώ;KE�@�@ '/]uU6rHw}s 2:f_ncƌqA\*lf^@'pB^*?Y\|yoF>oi~P' o2dy䑦 $ ˖@Ç{ӧv`Jh)m_UmN_xV;ʙn;T`;vmg */r+߲~mG\Q yg &N 0F�RH~dȕgr5"� 7?lh-[vr DdzQm7dӹc{&E J @TA|v}+$:?Te;PDT#*sml௞={"+в:N^h?A6kYƉQ>s̗:e.@�@�@�@�@�@�@�_d � �  O&˪J_|u]o[ͭcǎv7,Lo:ud=͙3~o[ 7O0x<~_ag'~ڶrKm۶U)-]{Y-SNVyYcǎ={_U5%_|vZ窯z>X }?T%}?Gz){mO;N ~.t~I'T?`׿쭷޲zmi݇}ld~,X`s.I=W^nFvء{[n=zuv,pRmCmviH<򈩌]t?>`o}ۢo/_y~(H7n͘1vuW߮i_Awޱ{;zv'|bzjϜOuڗTk׮5y즛n2m?z};ℶKSNfW:|om{V|S5o3]Zf2Lsw}mڴJikj|[Hoi@~hokq@Ax$(b'>6}tj1kHu,t@ŋ>%\ۆdm. mK>kۤI ڵ{c`È#L  틄::a� @>>cn;x6891`6R{l;pй>8̚5kqvqG6lJ{]|Ŧ:1ʳ>G}Dcu啪|z�W9@^rdȾ@Ae]D^Kd㼿p6(D_&_ d~~8SҥdkzN(:Uu4iR+5ok=:N;45ko3s;clX]yC]#-jUYC Tn}Ss~wvO裏|!q̗\rx1 � � � � � � �Yp73g- i !� �ȑ"/oue1$)Rekb./7馛i225wnW=\??Un=[zu΋�t7\(϶nsc.ء<9Ć?~|l}}>.u@ 12jժW_iڴiʣcݻw3&\-Z0w7: pA5XΝc_aÆ5s:b.aώ)_26qDͲeb._ԩSc tHhѢ :T_IwB'<쮃]߹(%*cJF lHmb-[FW?mF17Rt[˘ s}coTHt80ژ?>6`�fbjk\Xnb.C?t{=6q=/'p|jnye6T2.ȵ_N6gRT1f]G%69lTvsj_1ס3{}״>>߶~wqG]nEt j"7vt<7 s6V'k?h۞XTy1ѷ:VO֦1)'r:O.8Mt|ںukL\W\qE<E4C0� @~:љgҟ{WQ29xV0Uꫯ}�:$x& =I}n!�滠s:VJu|`'vcMb?2dȾ/~soMr=DQrd%q?s%;?$Tכye&3M[sT>pXu)5KFh[B.)Oq:(PGuT|2axy+Cu|].;w;fr61U߯{@^,[|*k߳K$@�@�@�@�@�@�@�%Ոj!@�@ :c~tJDI z> P8Fl iРAa2`z1UPR KRG4ҍw+!?)XdH Ġ:UI~y7}ڵ+-ݲk7‡`Bej t~}r4VM@zM7g2RஐFQٿrq{uR3;w_FQ`&LWװT*IT T{ I .K.A$dE+M\ܹ&EVP_Z-__)bH!/^U`5$ jӶzoO?i\b=g})9DuڗL=^Toٷ&MDms╿4Qᄏ/Cy&nB?AfO^UtvDCR'.dn�ؕS޽{'OVw)@{a"X{E`(H>w�!w헑Xtʔ)B| `PJo?tBC 8K3p|{^K/y1� @\ ?|})29fr T0fzRk ±iCo/^9p믿Ϯ AR+_yL @ m&\0ؼ#@ H%:th D6gzʜj+_ M$/3M[s4Sx^Afr_IMέAp }D g}B2ABC -xd\K3:w;ɹL~u̗-E�@�@�@�@�@�@�@]wc4 @�@�ȉ@M0ts7ے%K=|Y͚5.8թSOo6:J *h| d;M8цs:iҤvm_ٳΜ j3 {1s7*屮]Z?nY aowc}yH3OniJRnF|_?L'~{[SJ6LTk/9s_ϙUj}7dH#>Ey\μ P >y%sP=a\cӧ=S:yWоi_@3jk\PgV`־=HԶgն+i"TEeMM"y䑾ӾChV)t:sJhӭW-';͗.;찃Iڧ>Z&vfn^ێ (p3r5?V;܃. ۏdǢ5tnu*.?wqdm0o͞=^{5?o8/0baڵL B|ZE2=Q!CA�@ SSc6'ft7ǀ wA=Xʟm3<܃{ Ej>o:'%bv<ٱz&+_0 7N]4=:oE` -͖/AEer6'jz=GIB߷zSoLt=Gyjδ:y/stqA>㳭[ܚ hկL?R\ Gӹ9Ó,/?ddn3=J1_s&(Eʆ� � � � � � � PXeQ: ̔@�@�(pβelƌ KmnvQtԨQi ӥK?:6lw,e]쮻C9$5:zV%7x<yO?L,/룏>:"aLge@^J[T~}q5T.c|5n3j}u㶒!X{~7} VZ,X@[]RT[jժHcaÆٜ9s#0kScǎ-PۮԺukl>r|0dŷzuڗL=BLUmTLLoe5;!Or6Ŋ̦vM7o\AUI\xS\o�E,P=Ozr':c|?cgM-N?_b{챇}Wst.&A~JTdEBsb@� LS H-Hlo(T6\ŷ㙴p!:Cmر|ph}}W2&';VϤ|5}#dDr+s2CnTwyg0axWʬK$+@u<Kɦ_y2Tʷr~J4iULZUUӚ[SN[SpJ=\夓N<5G>>>2=RY HT PDn3W/~ٕ):K{L#� � � � � � � PSAT#� � ~YoHw}߷N8})ѣSQuf>0ug3 2$o6mԿ3iҤ Pŋoz֬Y_?~|ںu,_&7Tg-ZY垭K{޼y6w n6md]j}{1k֬ ˞?z>QÇ۩blJJ`Bv[C)8Aڵk}zȴ-饗lȐ!) ׯm7^7P�\LR-7}G|^)lj׫]6긍h|uS(̷vL O3~kO(7xBeߨj|u2Wiٕ_uC)Ծi J/@�ȢzY^f:u9PlM+Ttw9_s5v'JFo߾ Ɏir"P HSX2ţP P Գe$=8Kԃ RHVO_U^OGe67dәV5dսvNܚ~9s/W H^=8phwݺ@M4EmU81_sM)/ � � � � � � @~_� � @tc-bgZ5H.bkݺ[eS'|2ecǎ:Υ|'M|{Ϭtt6S׮]y#ؔ)SʳVyA?/-D޽/riAyU%:IpR?fz뭳z3{㎾,Zy41ydz?3 I l,>V[mmƿ?"KY @I D=&Gww}72γEyԩ~;>n8ꫯQmҠA<Zl_W]W}yu=;i3MohJI~*w^f͏_7T(͟v.GZ^^X+қNJ.nf'&w@+VzRuۏp,zWTϘ0ay �yqǙq/�zh,Rd<D& �5pq}%qh' R[hgᜯx6]F8:vhClg}_o~S.%;VÏq-!yj.@!5ϋ@ 믣Q}?. DK$+_U'˧:'Djr)Q~9iڼ=z u|]&)}%a&./sP(z0(*eXV {D|z=m~cTl|S � � � � � � �`@�@�P@|cw`QZ?)ߏßѣGۊ+ ĸxbkMA 裏 ߶QFτ`?7ϝ;׿l2?NGMAy?^{e;w]v%ez>oa\r}v}[oeVo~ON% �#+w=-Zz]s5>gyƂ^>}zX=6g[^z寧/,a͛_ cuU*U� %C˿LgU<s>$)y睶`9K6|pk֬Y&tCu>w_ARՉ�p{[\0/&KP`SN9:t T[WKwsQڶn;(=cuFm_衇LYƞx 6mZC=UDUm_2Xt_ԬY*,2Q\a$3MJgq>d[|o2m~(z٩Jƚ'G^Knݺ?|֛nGՁ4*IAǵ$HTʝr캫̙fQܝ/ @1 pTCR VZcjmFkfYg叏{11k'pG,Yt�r7*¶[݉O!@s$dz">@�m[76f%o&fL&: w+~kI WZ �ub=%? (+ɎL%l�^@�Zh֬G3w�E"s^x weyTjTzN/]Jt~(Moj:iڼܚ6mbयEʌOWskm]ck!?̺&)o,?٭[fټ0km±^BU=g~^6Os&}� � � � � � � @V!Cb1 $@�@�9E(S9RA \uU1Y2vܮChݔsc/c׿D\fsV[mҥKllb.xay~X6mb 4@wy'֩SX&Mb&_?|vaĉc\^g}b_~ey~&\� Ps7 ϻ>/,e1*>`N;sdc_uboĈ1Q믏c.Sߌu]7<U&Os7\� ns9ݸqʗkz}=]@Ř;v Y# ;s.fu匿իc{СC ˤ~^e }7v7g\w߹!1 3rQ=m!!POZV~T+l~OuN;!?~|"E]w5[\` Q}4-·.}F k.X_c K5Q%վ s~:qv6!YO6Ng(_y*{Kq} 7֮]6_N^5O*;%j] }/}_ czsV%>f̘gkc&t2.ˋ/r-(;TˎG\c1sAb.HS/HpܙXt„ 1߷j;vsTmz݄)tNGO.P?h_=·k΋U>_@�ȇ;sӯ~{ ?9_Tx6{cTmc-Yab…mV^!1:E>ڟgW;詎SB�y8Xl^ �Y=\og),faE> kY\DJw/]QRU>?R]o;,Deδ}==P_K \ILw_fƹ5]CԹL)/`܄ ɩN:v'XuS� pkԨck,s(RS鷝ɹۚ='א#� � � � � � � @nJ:,# � �D@G̴TDns9\;>|k׮knj7M6|sSCA\PBs|9? e h.hkfUV+VO??E-2 \*sQuU+2sA.B.wX~.fyj RQ\l* mr2Qy] #!Tcw#-^\T{cƌ1?ֽ{Z[u,0j*;f}ޛ?N;{^#R5 &FFM[cIQ&Fc]ш M U)Gg2r\ٻ2>s;;;>gwfng=5Zz}. 34mZ.뛶s.xZjqg/o̅) zc=Y~۟zC5TwR}U2S.^o܅o;__2.j=oWE~P+wYW^1w�̲FcX9]{5ה3@ r]wmƌͅ?՞l?\`i[%ԯJ>'Sk\zi&/%w0@�j"pf;=`T_~iۭRo(5Ff¦MoW%zMWYxj.rٚ55S@� [gw_ ?<u)o>]pwc \qS=%QWy>Tyy+oz卯ᕙjLQt?CwR:t}'~^zŗD+okolڴi#͚~wt7�3j.~2یR?'c'AzeݖO5&%}oˉ0 � � � � � � �A@�@�P yBN>ߝ_7A4UE''낋̗nB+>҃zӟ8㌽c@ +2Xp?I-[TdFd25V^x]oߜH4c޼yvG}dZSpJpwh;R[¾BZJ3_RVaBÇ=z/OP=|o`4@ W "� ڙ]qevKTFY7}Q&�!Xo~2;W!@BVǞyMMIi?GO?ݮZ TYr<g7O6)XIyAHy* ۷I0ݡ%A=+_f_]tEUMEkgeˣ쳇ڝwޙj0_@�@�@�@�@�@�@�rJEA�@�@�l֭M8 ȻF)@ W�Beٲe)]{ݻy4hРדbSmM6+ཞǟ׋)vò`[n~a=zM2W֨ C�4,_nVw ^u{K\r]|֢E4U>{ TطWUq뮻~[kYԱgjؚ5kL|衇OTu"?#n5͠ P)e ԯ_r  �p r700`w`xt!0fkժx�hڬW/w%23K"\c;k&wɞإ^\ov%{~՝sveݭ*~c[xyߤr֧֭O[~5ko- wi'ot>?^uU8Q&5ӧ�Ϩ'Uƃ J. � � � � � � @ rw,f~y$LI � �B@k?/y{hVNVb۶m?~RrΝ3/O~={)Ns.5X(# g9'0V@=6j(C͸WNu+$,6Q"ྊB>ʻ5Ν;|38~СC3RQG.*2d)sH}irXUs<yA셅"߳:6!C@a lfx' Q.q,F vvlŊ G�@\^3;06mG۵kɔ]( ;H;i澚>WD1A<36p@;3ϴ&MdT,z{;0{G})?'}*痲Mxܹ0|S@�Wf[9 Nwc̶%=?я,^R'@�@�@�@�@�@�@�rR Ȝ\4@�H\ ĭ2PO;lԩI'dO[3lbKf ,]}Q{衇 'l_~iAYT$C^h1 |wڄ EwE JgYnӾE:/9O&r/o?S;]% �:(UVoՄ6o6wQc O-�!/ � vn3sP@�H &o1W/M 6۫`q,[?ok׮;tc9ƭһw}~Sc0V7/7Nͫ6md 6u-O=ׇ~h#G7Mn}M'A;wK\ � � � � � � �-ͧ � �@:u϶ɓ'ۤIl}u?]`m۶5F=u֔(J]g HW_}es=xoK,'x"T!)d`DF`r#S +>ڇA*|Ng3fjpJv] LzfrY)}wM9}T0@V! o段 � � @M30 M3c6 @ >ܱO'3a 6Jݓ*m:vh]w-^؞}Y[?Guvꩧ_W׶=oUy~~/O&3VzY秥Q "_Fƍٳg|`ǏH}0\~ LG � � � � � � � 䣀� � @ n?`;BSN9y[zu t*9sr-vAY;]JѻkϷ+ڵkWDx2"bmFfҙvٯ.\ho No7tXIk]۵kWJ6}g>#wI᏿կwL5}t nnfL@�@�> ȽU�Qڵ`w膂�Y A Ȁ_A|Gq=cj*{衇L7袋 9G E7n7˽⋭G֫W/ ~\h?ΪR̕eM;@�@�@�@�@�@�@�#P;<U& � � ) i;A3ϘNvn>d!.F9rd>Sˁ_@6a[d|ַe7|颜<%I 0Sd+QV-;}wwڇ~h=au-[1cafƍݻg/-Cͳ'kfo}ַo_;#Fk8nTocYml � �Νff]rIp2wy a4hlٲi۷|ܮk/9=z ` @ۛo|8 c>}T}YwdQh  � � � � � � �s%Y<)=Tt@�@�2-ಂLyktUm/4x^3fXC=_p0|pkذaU&˸DF`{[o/~[|vG.( TOYT]̅qFy,^؇پ+>n͚5._ivAY]IkpӧOw\*.1E6vX;#}0zaaa"e ldsA G� {S � �)3sAf|b6xpJg@�uٵךB) q/7;٤IoH_tInT-s 77) n߱ s ,7Sq @U(OV9iGeگmv@�@�@�@�@�@�@�R+@dj}: � y.̏"Lj+{7Eo͛7m>rȑ6l0իժU+fbZ`6uTc|b�)Q1c (]T@Ԩ Mڵ3j.ظ&S{wTL]w}V^m~ݧm.":tu% W`….PpOrW VTTdZQFѣ}ٯ F!�.0u P}~oD�@ O>ivf7L#d @*>is91mHכof ε8BfϞCux`=h !sÑU|O\q A8n?!^ӦMs\שcfgY8� � � � � � � �15@�@�fm駟;sʕF)8-[X&MlȐ!dj]d>}X ͟(m駟nʔ)>j̙ckݺ > ]/3C]Hsh>s vZK/WXA U+׏͛7w]D׻woR\ضmvڴi%}]vZoگ_?1b{$VW.L Av1Q1@�@�,pBYϞ@f J;f Gh (o݆־k׮n~8}~4Uwwزek>Rro?t;xuFA ܎3f.8Cu#[ԍ>oFGUJlon&6>c!� � � � � � � @rHaI#SA�@�@ 'ڴic'tݝ<}t裏'NS^=۷@;A׹sgUVN (tΜ9%,\b)Lfv]uU>�RI d�A/_;sZN:ok]w`PTi\LX3&W@ 15kVIZ]w> )?]1a]K\> � �(P@�p)}n0qY,@N {R 4u:έ.(S@O?mrᗎ( R7ի?c<zܸq` w@w{t}-YׯQF#=ꆶY7h b%6m*uÆQ=uF�@�@�@�@�@�@�@ AFwQs@�@�B' tr /O; QB"g̘tҶNVXTp.2޽uZj ڵ˟?|�'u(/0?gf�@oE5Rmt ״%7rH]["Bm=~]w.*Tm:{kg~;v sNEΝ;}>c{vW&n1]~v.FBİ.%� � |lh m@�v a6i<B�h (Rݱh!<:(ٺu?5tlG?;~wWi۶?OCj ҥ4M gO?P鿩 |D 0=zqHn:ܥRTT<=$ו!� � � � � � � P�W\W& � � P# 4wZf͚5ˇ)O<%!>iӦb]u".6PЅpxl~j*'u@}@m|E9眒 DV^l&m P:tu/m.,m׃P^|Mmƍ~TDj;lڧm:C`_j<VrU:m냾.\x{.ƟuYI��@�IDATǺ} j.lQ @�@�L |\ *塹cFY4@N (Ref͊b'/ cn�8q-[pQS.((<N:<:֣:Sn݊+9'}INwqpGu/ݔN uǸqg>9g7{}3U� � � � � � � @n ˝V#� � q-ZQ7N!@/4o_X u_d e˖VV-C&_'?ҥKK. -[ԼM6%|!P RNA�*X¬}(oKjSW|WB]TW_}_P\앗gm۶5]tZw -c_Z8c}׶};m:}Fv)jN~cnJ:}F('bU+?&2>-F�@�Hs*ut͞ �)1܍̦N5c DSKWYe>}4tnԤ_u>F+í~ӏ?g]vxAנAҳy֮]뗿q)<T}W NS tѣGnN8't,ɛeA @�@�@�@�@�@�@�rK Z޴@�@� ԩSz黲*j*/EK,aO?a E AZn/0P`: jtABy3w(P`N_z|R?t!@Э\֬Yc JƍK.),,OAЧ+ > P- V7<piرÇjj;Ǔ&MiRvm=v=߮zP+@ 7oڎ|=|m;^v<(SpW;) 6_!ZJ (gvCy� � �68TkFA�JG33}!AY`iL 4iRsimB"+:oC7| A֬Y6qDO5QF؎:u:.x7Jt;tGy빎샢F-/}*Qv9$Tǀ4Lz /**A]F @�@�@�@�@�@�@ ;6;+B�@�@ k Vf*uB!˒AHb)SŇFlQXT5m4,:]p; :xBLz e׮]"wFBb7.7|/�u tq:MtQcʥvjp@I8. P:.(sHC2Ӭmm|4{>+ &,}q.6^}uv=l׵o絭v>ܺukv^zmmcm/i{lJ_}%! ~ /+= # xFe$@�@� y  !C'@E"+BdDiyA7ҥ*;蜍། TPuX7OJu tэ<uFp\'8oC!؎A91NM`BlKbO\6lz:.8᥋Lqx4hPIpgp H|tGJvCpoX@�@�@�@�@�@�@ :AFgYQS@�@�H@@':]R0C׬Y$x!)dj޼yNt"N>u5u :)^AHxtavYn?5=޾}lR襂.(+ȩt{t. +/,,, 3uQ:-BE%$ty�+2EK۾lm V *+):~j[6?#P9ms+*.ڞ-s/~[ݏ?Al\]QѼuQ. A_u޽$@3T?P{9PHСf7lnŽ#@�@�@ O7<8Lk@ w⫯N{i)(&XF]667mqcPH1 ;rc;gѢE{7츈8:s7c;ypqN:L1u~G\|cB58c}hvi@ XS}ѱ5Jn A  � � � � � � �Q 4b3+@�@�@p{.]U9x(BQ:t⃙:?P' 66}6d_vM>ȩvG_p,0=E ,)Qd}NG7!@HfۇT+iuw՝v^z]@AbpQ^|_ymۃ{Eൠo1ڵkWv?o/Pc.v>k_@T 3l6e!D@�@�hwAsN4K-@� (;l)�f|=bP\榮E!:Q_u;q ۈ?<.Np<Gҏ,1ͬg7XN:Σs@J yԏc;Agu?1/p_w~Qq � � � � � � � � 2@�@�X@'ӫkٲeJZvٜ9S2&�5C M ’[n]T@Q]|vV},ɬM?&23MC�@�ȐEšJgH ݽ[l s7aK̘<D /͎)%gY P%nΏ~d6m_z^gLO � � � � � � � @)Q@�@�@� ,^l֮D@ r˗WCU 琀(U6oޜC$.0tɉϘ � � Bk\nc!@z,8:5zu [qCx@85ۺ5uTU@A>u@�@�@�@�@�@�@�H�Aigv � � @UYXXw0. @E+Vھ}EcR7YTTي0wB*0lrT @�@� (KF"�T o6`ٔ)K z Cr ? ÒAf  � � � � � � � 2r #� � @. KK"@:Yt̍y P} o;_`Py6lB@�@�) HQ@�l4 l^-7qcnVFK@A۶E@`&}@�@�@�@�@�@�@�H�Af> � � @5oA�*Xܬ} F%B" ͛76Tp bMzQ@�@�.0}:AQ_*8L; DWQ#nݥ5W֭FZ l0{G@�@�@�@�@�@�@��Aa]2 @�@�pA1@�+bAejSر#UgDZS'->$͠ � �J@"7ϬPU �Ilz%K>i&�iPƍiA uY.F @QA![$T@�@�@�@�@�@�@ G̑M3@�@�@ zv*՝#�a 2Kz'4 <lʔ<D�@�@� ̜ikـ5 oF�B/зoqg }U #а٦M`2(PAg5z � � � � � � � Pe L@�@�@�,YR< \@ lٻMAmp Ԯ] p.j!C ɢ � �Y"0mZqGY �#вY۶fA`" @dRVQA۶hiv+@�@�@�@�@�@�@�+P;cn � � � ,^\<&A1 =Yf:i}:}Yf>j־}p7<C  ܹsgfnu. @xv0۰amX|=[5m0!� @zٯ@ 93[I^ wFeZYS@QY6Q9uF�@�@�@�@�@�@�@ AF{Q{@�@�bA"-4 H!=ْ%Gl={u v=s]۷<B Afz!0P (Rr 6,Ur5^Jرj{ �C@AcNȼ~ <9 P= ƻR/P.AWfشɬ USg � � � � � � � P@^y/0@�@�@  )u` @=tbf۷wAڳ&rO)A`֪U+ URGF>$գR 'Цkqyx`@�HB L933@�g6kVH*C5@]Pe&PYp<2lu>T&v) � � � � � � � ^ @�@�@�YX茈� PJ{w-K ,tN.5@@Ayy|EAB*fST ? ڵN>y@�$bfiȰ@߾f|c|y+@Z *#Zt) Tٶ_$PTDduE�@�@�@�@�@�@�$ΞeIK@�@�@ ̲Js@ #cǚ=k >젃~dR@A}x3Y1@ !2D PI'O7jwQf͚U8^D�@� LV<R4&�LG ͛QHH Ȅ)A֭i53D � � � � � � � � 2 @�@�HX Ȅ(W`r_;~_2)}@6ˀy_``3h}NA�p 4ibvAcwj� @6 hC- -о}qт#͛S_j;u YRA6lM-- � � � � � � �DC+% � �%f9p�$QCUˬGK̘IPd~~~Ȥ>A/3'FF=Zeٸi @t9`@tKM@�dtf6~24@  mb{ A@QAZb@�@�@�@�@�@�@ [̖%I;@�@�@ V,x ȬZ42 ЯY&eIA [Ucը:vmO? MT p1f{]k{@�HA•i"@w'2K!P~_P )I 0- RԕmUø � � � � � � � Pu n;@�@�@� ,^\< SN @ x!fy~k34/7o D TT ԭk֧Avf$K@Y:{Nqs@�@ } 3 'Μ@ ,AeIP.t^TTR)Anۖʹ0m/iS46L" � � � � � � �T,PGU@�@�@�(Re:g~f1c 7!f= ̨qf$23 (QaSiS#c@�H9f ?se^ @`AA @AP E*A;7:A.AYf@�@�@�@�@�@�@ {̞eIK@�@�@ ٶYp@5 �i8P;vV<B lX̶nj YVA@  *$ 0nYGSj=G � ^iӊoѧOz@�L tf~٪U G�  Ȫ1~;L4OMS ֯ɞ>C�@�@�@�@�@�@�@�,߆W@�@�@� (0cg @V d.PI 5ʪ&Ҙ,^UdW[eْ9P6–i" |.o7;T̉i"� @ {91 uΝ[Qo G c>EEvZn 닂@ Ȇ #Um*� � � � � � � @VF � � @ mK @&8tA5s]rI&kü\o#5iҤPʧ�8�Hմm[Q_gj� @6 (rln!mC�gZ̖,)u"@x/a{]FZ r۶\Qu  � � � � � � �Q 2K#� � @ (r}y4 HرųZN!UXnYfUz##mژkGd..{]0رD5@� LNd"-@�ԫW[ҥy7A�L eKqE Ȱ, QUMQPPw2> � � � � � � �TvM'@�@�@�/ O)"�رcm޼يJ[y[nuK?޾}ݶmJksrX,fujսkmҟYgZjtV^WvmSNIW]P]}?e4hP(T&@deBM0!@qF۰aڵd-49Ŗ-M ;%%byyy%\aڿRqYϵָqckԨw"�d5~+1?I@�lɒ^e8U4;DA TAjqP*A VM� � � � � � � �I02@�@�@ y`eJ 'ʔ@ (|.֯_o|�N@6+BJ?ޘh X:h1xaK?V=6kծąSLS[JSf.Ѣ6 &j讦 7i$5k̂N& 7o}E@@A/ 3I",}UV믿5.)m ~T}VVuJ8C7]nsH탕 !!z~" ٴiSi_J}-[Z-,ߦMkݺȃ@�ŵ0 ʭ @:u"z %|q *s9qCU-*@ގwґ@�@�@�@�@�@�@�*@dR9 � � Ps%Kb1 k.M[(gKUի}O|OxڵN+ć ۶mkݺuC JC )',k沎\ϸOZ ‰ D3_}͟?M-"U,`@uAQ|j)H+^}/t*Pw_\[n3QP _~ڲe+VXi?">H|>}7yǎ}?H kNn?}dg1;xRrԩkKP Ay~ ŋԩSK2'!վ}{k׮뱺}w� @M3[}՜"�P�~}"BeFMd`nfi5 � � � � � � � 2K#� � �\/^)5kl>G@ G;vê( ݻwAkNG;fKqMJIQbj)TEAxBNQܹs}?x`HuF(KaSHL`�1?0aP… mѢE/|_aK`B)[Apk.lA'XYӲݭL}jk}>d_<~?KA(dΝm}ߥKZؖAMx? @i  .ݞ>W[O;,c s : CHP ̢h1 � � � � � � �  ó,  � � ٠@@ bQO򣠟e˖t w5n裠)o%?AOWH% R 6ϘŒJwA4 =ڵkW,ׯ?_;vԩ+t9#Ԩ,)26ˬN LL2)97o-XwK.5hc= j{ jJr긕%Rov->k_ ;޵kW֭zi L)@�L(rL̙y"�p?pԅZ @ sԠ : CHPEEA&( � � � � � � �D Ȕ2Q@�@�@ ty"|p’nѢEB]֬Y3=Œ3$OEB4% UΝ;}XG)(x̙3Mu֕LJFv:wzNR5r&@U)36)HA*@X8{l1c~jNުh]=vam:~S/4jY+ R=~~۴iB={m~  � *Ot@� K<~Y&/5D�Qa3۶-\u6T&) *@�@�@�@�@�@�@�@ ABi"� � �5 x ]̙ϟo3խU G1b+D/5jV0\Phv|7dȐr96n! N>3{饗|x.%J]Aݽ{wt͛;\~/\6TU jP'|b'OSڧ~jfr|o z۷z֧O ٳF&L)ڷR:. ݞ;w?BN0/xL8 ?C—9 @u\6 %6Ӿ4U6m[Dd~hwdts"℔fCw  � � � � � � �d@ 3K@�@�@"/0Q�Xr͘1w kQٳMU꺫{zC==\X�)D]@ RWVQn`N<G*mܕ t~Ns,_܆* (6ހ@t&Mdhlcǎ>O۸zUy>!7:vhJDYƦM;v֭[ M￿pv Z�$]mjMKI3A@ 2[WUA'| DH@۶oPj3:JdV-N� � � � � � � 1 #. � �df]`ǎ>gԩ6eS�muUV>Nu'tzi;w7!RwgsN[h͝;̙;>Ӷzj?zkwv6p@5h YvnMR@ q(P}z&Mc"Pv(7|z-}7n?x|)$C@G]0=}Hɓ_;ӴoQF zOa@�*PB *@�V2SNs*;H"+@dd]NW s@@�@�@�@�@�@�@�2*WNg#� � �UXĬjal]|B~>#ǭ[ l?.@:>wmڴLy79*n.iBGʕ+m̙){=]}T^=}V>},//oiDڵk]z \v/.#<0gY&mф W^wyo ?ir׿#Gleb̺q ۷qF om_~mذ:t`vyvᇛB) �P-52wj7E @A tnP6m2k0@�@�@�@�@�@�@�.@dI  � � P}]hy3A$&pI&w}ׇ?jXflȐ!6f~f ݻg]\bJ@N(u6uTt4ydf֭ƍPQFA䃹4,/ܹsAH['v¿x ׿e/-]ڵk=z4Y\b>ꮺ*۹sM2&Nhwye:tp v'/@@� (r꽗w!�$tw DL-BJmˡԬP$̊EI#@�@�@�@�@�@�@�"(@dUF�@�@�XmFZ@&6+@u GU8�ug˳={SO#b1[`t瞳n4|6vX) aÆeO8C-ZkV@H ۬[~fӧ+l |ۑ./؎=XoVe@6l0]qom/=#֥K;SN!N@�R@!n. 8+G@�* lifM mPJ ,H;RI@�@�@�@�@�@�@�N Ȭ[4@�@�, HtVPw!0sLm/To@F- . (ȵ{;}PȷzwwyڵyG1B\J\˼ycǎ֠Aה!>LdKj4i${'-[nw}p ֢E՗ !Pzϸ>lO?۬W^>֡C̊"�DL` s7S0wU"�)hlÆLI"@JjwH,8Sj f3G�@�@�@�@�@�@�@ gr4@�@� ۴1sY {=ˬsζ~c=fC ^x֭[gop va!UftB.﴾뻮^Zh]u ZGh]uFzƪQ'B/r)%{o <@;wʞyG^l Bc\}6e=8Sډ'hZ&!�%0mYFf]*@� 27| gifWKm[vd@Q'@�@�@�@�@�@�@�0 {R@�@�@�" H@A�*|O<ak֬1cؕW^iuر SbT&G;kٲe>_7u9c M9xԇ %}V6[ʬu(՜J`@q?׳s=o t钪Y2]"#УG뮳7x>;cL_gaJՠ �d ^VV6F!�U J\@hjw Mu%um^DBK "QU*� � � � � � � @ e]h � � a #zZ6nh}x۰aLir\^z% Laf_@Z7huZwh HSntQzj0") HY]`}מymɒ%v7!e r `cǎ'|-Zdw]|֫W/~#C@�"- "*�$M ȤQ2!*{Vrf@:f۶%82!A6lP @�@�@�@�@�@�@�rL [4@�@�-@d˼+.!϶e˖ٿo?~5i$ z+кCKNQX1Zd(r͚5Afyf@f͚͜͡[n>�tvZݺu9Eކ@tp+[oվ ;3Ϸ#Gڔ)Sr"�9"0}:A9i&$ 6$0" @cGDerv0@QAZb@�@�@�@�@�@�@ ̦I[@�@�@ AF~Ҁ ^.ڵM6ۜ9sg?i&Ese Zh]u-Zh]u=,A9[@V k6kVV5$(d;v/>SOZj%8FC�@iӦv 7gϞ6|p] }@ K]Kd!uG� 4nLdrE]l̋ P:u̶m; (T]AAf@�@�@�@�@�@�@�U sun@�@�.+W޲/z]Ẋ{):f}v?ӧ>㯽qȴmK{㎳o9zoܸ}Q;Ӭy}e [jw}~o>#VO@!\s <خMĽkٲe.\4֯_C?p;ꨣf֭{Zhu9 >:Ht-;Z֭˝ݗ_~i_O+K/M# \~^Ƞ@ ü zs6a„ Jk'N!C>̯UIjQmNF+Söi۶oǸqlʕ@� KQ-uD�R/Уχ9 @rA5ej[8T/9Sc*^`Ӧy4ly1@�@�@�@�@�@�@�[ ȽM� � �dD`sASUZh=C6gΜڵjM:@" ;;#o#o ><2N{avVj;*綾^uږ5l͚5o @m`S@a Һ:n_4ֽ{wo^|ٰaxv뭷4:+UW]a6h]ϞҺHT7|ӺuVl/^l&Mvrǭ{OХS/q;(wuֵkWkҤ԰͛7;^@ S5 U / Mg=2/>h;W_a[T|UdO/WUqgϞmm$Bu²?S) �PdNf͚E H@v%ӓi!.ZwNܘ ԩv%q- @Mdu@�@�@�@�@�@�@�E sqf@�@�( Κp4nܸ�s95b~~͛7hܣ<}^Fauܕ23gδo}[QnN}Ȑ!6~x>}-:taM{.yKYze]tQ8=(>Ըe hB}=j3,_~ȑ#˜M7QW6[o>|SjݣuEZ'iݔʢ`UVTRyeU4^;>Svw_C05A|^zv 7ػCٖ-[*# nA\ZsYU.]{}UUyF5| j8]O?ݴ曍5jL-*q%YEeyӦM8qi+;v@z 0z] @6 (kǎllmB ,R+۶V1? � � � � � � � @HH-SF�@�@�$7\p٪wUWo.r}KUQFT`T&M0%&_ѣGۘ1c瞳-Zd{#ݾ p)W1kk]>,k^3dx'6ui1R}g7-O<чiAk)uEZ'iݤuT*Zq='Tmomرo޼sMYx$ (Re֬~xg}a&ڴON;͇?vaJQ5Q}jKo[gL?_1 @¢ L}{ZfL@ yCI2Bfu] N@ٰa@�@�@�@�@�@�@�@@{_m  � � @FZawrJ?-[{4iY0`G?:q뭷?l}n?M &X׮]omۖ��@�IDATj*;mԩָqc;sJF#.;>ڶmfƠA{]q~5.r{76U=>_$Tu:p vGWT??VϷΝ;۟JXxʔ)OOآE㎳%Zv[6w\>|^7j7yOs1>DoΜ9߾Vg5u 2d6mڴJR-bթSw_ZjU>U}/-WXag}vAYCLtTn_<YY?>SNO>/+U.;}xRYK/f5}'v0#8žyk߾}0(}2i H l_SYdGy7}~ߔ9ۉ'uŮ]gqVzۻ~z_wm{ov{GW_kƴװDʯk?ZeD8$S@YnA]Ӓ}{fϞk:(",X^?a{mP0Ry;v>#Ϙ1îZH[mOJo'٠AvE}Z+Rm~ NRl_>B /ySWvU}^ڧ vJv /?ϷYX-˴{e~_l2>7>_Zjŋ6^~Y6mGq"TMd{*d^Tд}Iќ, @*ϻn;iTLi"�p�a) #rڮh@TkJdTD�@�@�@�@�@�@�:wQ|)b( � �#S:u>{CKybu붍u]:ֿرccӦM1s lbzrQva~ vi1c.DN/\L{0 㸀믿ԩ޻w pc6m0I… 4oa+z1s:\(o~ $kѢEl1z7n\̅R*3Ir+x-3gzsRg\ȢoGc.45vX.Xi.4֣G YM4Gp=.�yyy1S2D򗿌{ kC :4-c.&guum%R= ?0WzɅ.oB~b~kYòUeש&+['{9k=*/0b?U^y=_s:hUYO~}uc.(QCzyrKvq!p1_\]�_7o7>O;:_"悭0P?}-.]\`dCjذaLE ;N_M @ Çb^{Fs_/d?.Xя_\A@EX觫\boc+h컻t?L 'hzW_}u83uZL>H~ c0eyQ]s̅;/j)R?z֭[cs!1XM/gZUglқwEmPo*'Mh$)A�υ#�$[`c>)6Uez @}T6;f�Ip?cIA bT 0Dw� � � � � � � �s7Q@�@�@�B xYAAksMlƌ :\膭[ξ #FXƍͅ r?ɞx 8qFsz%/_~=.P\|5bc. y܅ 2c/_@1[oalپa5kֺuk{? 1 b.\ho^~g|`.\`Xg؅- ۷}'ϺK.5j.\ȫUӸ={4>I~U 2_KԩS\ą Ht^.&Ol.\ "~Hj< EJ~G+Y>,kX˦ƕ@eݻ'm9kZEFZ2u|Hizmc=f^z4͵f6S{Znm]8mٲŦOne? |{]R(J(bk/W,د]vEAIw!=ωn6dl|&3;;swvg$u52V?o&*k / ]t+{?Z1a2n8_v^noP<ٲvZ5j >|u*'N}l+'$$M('<t kE?ZFas̑;^w-z~&/n%W7nܘ9#&OVZ%:uR` nj#O,&(L@$%%isz?i&(?8K~$==]S"ipvٽ_i3U]n]Zjy@k|}o`s{mT[n_6tq X �DE"%JTt"�0'F�`{`LL@+y`Z'B[ʔ v � � � � � � �d@�@�@ 24b6LQC)jժeCʘ^zu U4L)[؀F i/?p7J&MlPծ]ۮSҨ:hpG opG:'̧4C <X*T,b>`l>aQ4jϞ=Ү];ol87lۘ[<a2N7J{ km^բR{TCjCs40TR6hU4_͛7u.Eݜ:? 64 .p5Fzn϶^}US tݹsg;3?c=ix֢W99: 2a/H;l0?=^:aZ4EF7p|GYfϞms5Jګ;πPݎ >C ͛ )Ϩ񫯾Ns=N~,;n̜A\cL:._ 6L֯_ <vc0v}ٝ3k _AN~#o>^4~ [׸G]λ>[Y7?Z!Zf̘aOٖ}@� hd˖zߙ5Y]3ar{|ٳO䱻Y05%*+3P@�@�@�@�@�@�@�@ v" � � AVVi`x,P~}j*g_N蟆69>2w\;f?:Gtӧu{0U9K.D*ٰawya<G}9s q Vڵ:t(!,oY-dκs7nl߿ߎW.O=zV)_Kd}rJ6u|r=zt- ܻw \ qƞk _m5sg8 2V=i9?9Q?uh`ԩS> h@\Ȓdǃ ܹSz-YҬY3믳lrI�0] A og "9yڷLEjq}Nv;snx_:unwom¸q9f߾}}} x슶9s973JՐm čMœ^/x׈N:Ʉ _~΢vk\/<4?\ݻwz:O󼯩ssO h&@ i� � �A@ UNAaҥP1U"� � � � � � � _AB � � @pLԮ]lhÖ-[dƍ6\NFFk_=gLREçr+XohXͣ>*W^y,[L~i)Qt1jN8a#?c/6`i_I+AZ B뮻d"2ٽszi uKOOCɓ姟~#FJ4ʻ_{Ǐ͛'ǎLg:竝WR%r<?ۈuRRR Xb삞ܤ(=W5e˖6M�[n.]… ._=G³\}rg'|"Ǐ|*OwI{nwE^J\870m_35WZTVklm!ݟhС;}ܷwߵ89^?65ȑ;uػ>粛4?^lx^SԾ__0l0Wa9@� 2B@�@�Yg cid2o � � � � � � � @d4%ڈ� � �1/iS.6hP]TȶmIII}ܹRT)oiҤ-[V&N({5 0MNcd ȳ>k#/킣G ̭|ͲcKd/",Um H=6."]w}}G5o߾l<}t_iF ٷo_\]8/S3f̐ۯխ[׶ȑ#´CY|}ˮ&e:_=y;5DPˁ܋D1i^/&MdkۨaB|EzNs]N*g} ʪ^,]TOt>?6񫯾ʴ"Eȇ~(5k֔;Su? eu}n ;K㘁@6M @9RDnN[^Î|Aw�K/TUwy2eܿ~hsv@nqRpaphzQG_' k޻i>kW}^|ivWZ}nZsCfܯ_{5՟~vð[o k(h&@�<XL"� � @@whT@P */#� � � � � � � �A� � � |'{ijk./ lܸQVX!{ Ky[oɲed{[lёkpmf1z%?^=QFҩS'ٽ{]~ݺuvCW:4DNz꩒(˗aÆy"N4/]NC4GЫڗrfY kԨa4DeSbw<+dX{+*s!XWw)=P+Z>cod̘12|9~|嗲xbx@K^\Z\9astMres=g`V-9m뮻\{iuh@ݴi촿?mfu9{^n4g[·9tle1ۖ]cz]xWGwZx:;z-oqlY֬Y#gy }+&uZĢ5=9i ZsT k :h�8=F|4v.G;L@~G6jȐ!6l>i~x_{: zmؾ}S~W ,PHÆb"ӧ9OCٜ2ydZ86'Vi5|]\th�d lкk,ٝ3{M׻~:MwFv]W X>ٳ믿W}nn%'S_WϹ9҆N_|^@H9o a0a~1B~JvTi36y种Z'55U *@UK= �!0' � � @42--HS-A0ҥP1U"� � � � � � � &0$`].( � �#&aNc( T]j\?e\iii.&aUsmմiS mt@ w[LЗ]^5j8LPyߊsήիWLLeZV7!3.`ۢE [G"E\]tL@(Wƍm]μ{e圇vlB\&ʶSեK q�: p ~RRR:9/S<ȷ x…#+ko߾.r2\5<g[^=>1|*UL({;^6TYNO<z㄄WRRz}=zh1v rXw}M̘1ef^lР˄!֮]׶N8aaBl=&u嗻LȤꫯmέ q 4ݖ={LVyo=i{˔)cL_yjϱGNs}-.]eBk̄ s`3Wv_~Un]{\L˄e3gs^;p_ |uyaÆc{~Ģ=HI(}}5X;<}r-s=uml@qK+V2:rzѾs~2v/ :el~g;iA bΝN; U2a<bs Qwرc}L@j덞[ewknWߗZof\zNUnL}lҥEbmBӾ }nJ&sO{%O`O_朏O;4ofug2!~#zէo]&پ8o<{]6 ><۾6W}44'S 'UDW6mx Wǎ]>eMUV.:묳loF{/O<kgwMͭaٖPLP{)Rk  @ <\�/#,_9X[Pe󻼂N]nB=� � � � � � � � C!C3ӀTG% � � 0qk D"?,sbB*HZG?.!&-KM8\rrq!Yf4iDL[ngy^m4M>|XL@{^vG%K}5-q)hzgؿTTI~G1a.Y9k &<7nಈh]Nav*&QL;VL0W^n9g{?v? 4b_q~5Rbńԉ Tu|q=n9Y:cokrw ˕G}TLq/ApE{ݜoS:Y~pTغu}>e2i$1lT[C.PcY9n}Sd޽{eɒ%b5Ä/ 1^coB2ڞv^ߋ93bom­K.LmOOGSП׋wI͗kN6⫾Ti&1Aڭ}U͞ԾU5ջ8}ls8 @p6m#�SkDeRMg�Ĩ�nż�8jwE@LٰAَ � � � � � � �D@i@�@�@�Z@?kha wAE֭[hĘ>,[m3vѢE 5RKڵ׏WX(QE|6_Kw.wuhxZ8?am<z=z9{>րsVigM5E=5E[5HRg@]_~Vwʰar]. xt}_zS=N[O՗Wp_=7gN$!GO>@F :5Tж;︫Y̚5K}%Yw,鼏=fk |mC`MͭW_mSKdW}!)z_ 3boݻwo? kժh[n=?D[0׋מJ{Jk>S_~/~հW 累_r/ٿrz/N5޹sh?`<=\mf � ,Z$Kg@�@�@l;T(DWe:Q\� � � � � � � @ S1!� � � OVm_|!+W o"xgy8aoر#3~x{婧/X#G?իW-w^[u -Z不RJ| Ps=Vٱc\ L5 ~5\ ֱϮ^ &s^+ dn@omxU֪UK6o,Bj*[o;ۥ[ +0D)4pРAՓ~ɞϵ+iQ:Ur{]aB/_зȋ籍_ywy W={k./U, @ ,[&&,;Fs@�@�1 ԢJweTOB$Aeʄhcl@�@�@�@�@�@�@�ren>g ⧟VC�@�8͟~^z4SGOtI ɒft"ݺug}6vСC6^3b_&}K/T?|)_|XgOYbh%\"ƍX +r>7α'\ vAꫯ?SڀnA⊐Ɲ}<_5 zȐ!<l4횂@4V̖/֣g}i-/J ;Ç{-?b=q$- {n<6h۶m /믿n|3 S.8 @6C]"托K@C{`0@ Qt⬩}'wDRS (vݍJJiP74@�@�@�@�@�@�@� 2!;� �WחP4%E>D䢋0A t\py핔>(t –,X t۷o[l>`3HhjѣGERbEχLIc&֭[ooF~'\ +m۶!o~2t/l�(Ī@r"='2rd!ݻk9yWDr5?iԨQnyaJb險?/R5k&{ 6L)4 @ sj*wy5@�{lٳ 2o4ݔ)"+bLw"]{wND>[J@�@�@�@�@�@�@�M[ � � =[<)& *zLKcC@p~g4M~Zf̘!_|;VnFIHH>=zIjD F4|Kq?-Z$ 4cƌnݺI…i|ECbXP@(RG4 4m*fM4ZZjO}'K2n8ի >_$*TfpSD,\SW^-aƍ2`�O>1w!@�sKl~ 䵀� � @؂~!(h8|XLhh)mD�@�@�@�@�@�@�@ 6Id@�@�@�< lڔ Ayc lRVXQZ"gu tKLLg}V6l K,?sε&֢?>L6M'( 3y 4s}9A zsE8C wޑK/T/3ǀA 4Q0b-#7php)"'5jԐAo-C \ڷoo|\wub믿&2_ ijAK � � @�AA 0J*B�@�@�@�@�@�@�@ _Ie%@�@�@��hdbBHPU  <tl޼Yի5cSO=Ut=z }_姟~~Ax )TiFvj.]H&MCZ@ \.Yv̚5KfΜiŋo׮[ƌc5+?,˗/> ҚF{)fD&M]bg }>Ə/'O »[eȑҭ[7"A­[֨ ;vL̹p֬Y#5/X&L`!B� * 4  � �YX 8 Q=HM)]:@Q  � � � � � � �Y < � � X >IGA Eb1S9;?ȥD{v^ŊmJǎCҶm[iڴ.\س:@ 'O -Z`̛7OΝ+ϗKrs2x`7n y^^z%6󇘐XSޚK4;|9{ZjYg%}38C4h;KF ==]~wz6m9z+=!!!n<Q@� E6n+@�@� 8Aii[@ Dbר@�@�@�@�@�@�@� 2*D�@�@�X cyٷHRTVA}ّ̠Kk݀i 9sd68^ *]i|X>[VZIՃ6*E v%K.âEDŋKjjh`;u$W\qkmn޼YkyPDY31Ej&H 5_~vxWuhʔ)?M7dCM[Ϟ=G6xXv Cs8l>03f̐$;椧!&L<zGA�_%K2 �{� � :g>A3gKпY0CF�@�@�@�@�@�@�@ ADu@�@�@���Dȷ-X ʊsꩧ᪫u [#uꫯdU@H l޼{hР)R$Vh..7n+We˖{Ӱ"=?upkN4鹀*tK6HvȐ!([B N6ի ӗ@w5J'5ho/ѣNܹsgرtA6lm" kqI7o̝;Wf͚ekJAw.<qLp) �%`cAʗs@�@�-)@ h`1) � � � � � � � & f@�@�@�G@ MvtU&NmGF5pNt+ݵk \K/BtŋKS<C&M܃>_}]ĨmڵksXfk^hغuk;X,r}Ibbq'"JV-2eĜwDzј(0f9yΘ1}O+Wƍc/;lq%hij$۷O..\h8v9 >묳﷯ڵkGBi @ h@�@�B @dDΨJBA�@�@�@�@�@�@�@�w� � �4dQA>w^RJXmՀ޽{b Yr [z/G<h-\hHKÆ 3 g([gL#͛7 6m6/_; .͛7Ꮥ*U VƏ/2{M7kԋ�^&Y%@?焅1BfϞ-SN~͝;^?|\H ުU+9Sm0^O9{ Xè(*Ϥ:,[4c?+Vr-HǎkH_W@� Ȅf9@�@�(�AcP jq� � � � � � � @V 0@�@�ɍEdِA*THfΜ)~y@;޽[֭['ׯ4̚5;v̽8YNPZ5!MD�E_J9lݺ>vj%kVN[l)F١qƢWȟ)/~R\9H@ DMhcl&Oj9))~o&ٿGrKϞ=ElH%KlҥKO?}BjY lb^ΠNVzlbڵkc Aõ)SƆdkX9#[ 4&@  P= � �X y!D@jjFkKVV@�@�@�@�@�@�@�bK :  � �DM 6!"PreT3c x4OO?=V\.ڵBn2'4lOV\)? ;z{… p Q ұ1sn�B w5ܹSv!xϞ=rISɒ%m�Hڷo_W:hhim{%&| <saPv癉�0&/8uSk 8p@RRRsΕ'NF |kl {bŊI6mEiӦ@j`@jв5nݺ6$\:2 hIu?qF;<}hl}4mԾnFi48T'@�`l rHBB0jN@�@� [Ǒ,`~G!� � � � � � �ĺ�A~?@�@�h'dzP@mM.T s ǎ;fo>}L}m6Y` 0'lƩxRJOqJbŊvP/_!1S8MrR߿Gi}ݻW8YOUZj&D`Zj�H}P .ӧzJƌ#> @7C=zMNNv?jJ[li4̷W^=~֧w9v올_^6&4LPNj-I&=yl;cppk@^oNJiii/}j vgg;q{4 l֬ gE�b?"[njD�@�@�alA."H 551AFA) � � � � � � �q'@drv@�@�"I@ M&.I-&pomO}ܣFֹ|rrj`bF^. >wH"!C lٲvi}\ڜt(UTqɒ%E%J: Et8z{ө3G4yáC9BCAdcAr;S?jB3h3z!{㎠m@^3}1T1107~4/))tR{lӦ ~�ߞ={0P(iEv= 6oٲEnj5RRR,ڧ> k@ױN?Oδ};/YwE]:~XVڇҾ3vB`mgcz>kjfΝXuS3Q@�4'- B{@�@�bW cҞ_,Qe_@�@�@�@�@�@�@�M h;b@�@�bJ@ ׏]bgPo߾6fʔ)2lذ()Nhd=qZPHk0D5GB  0i 9DO7f CCt(^+V=x>.Zh3iA;A7 ރ_8--ǏwO<}@f٩lfhLM ԬQ4iĆnj錝& A (-b䭷޲ZZZ@ 4nO։m{M`/WZeڵs9Gx ѣG.\Xj׮m\kv x4T DtyYq}.9!ڗsh^gZޏ q |iVڷr/ yBB; Ա?j�@�h Hs � � @̟mm '|#@�@�@�@�@�@�@�$@d, � � 7+!(&M"2#l-p !E4ȑ#+ɨQeȐD qu+:c`Fϰ  z!_A:;H-I{S:NHbc rc_7| k+Çgo ĜE֯'2BIHvL6lӝ:u2}!ҫW/޽hs';iyAiXsዾ<93ϖ]ݜ>g,i9+cwk �1%A]S � � Ο͟0)Ds[x񍥁 � � � � � � �Ĩ�<n!� � @tl$b2H(]`2vX+ *a;e˖./o)["W_]Tx%99Yf͚eGcK"KJZ"EVhMp/_)q۶m6K.2bL^ YZj  �DhիE"4@�@�p wQxÇ|a7"� � � � � � � Ae@�@�@ 4rȐHo% =zH=a (-��@�IDAT ?.r"_-g" R=&~;7Ϥ>G9q&иqq'Oŋd&t]nfŋǁ� �dXL$= *<B�p' e$@�[HE (Aeʄl@�@�@�@�@�@�@� H^ � � @o_?L `xlRڴi#|A.LO@?0r"fL,rfO\.<ѼhHdݺؕމtb4|wcrrhnJ$11Q.ؾ}{)|:y@�wEDJi4%@ g3'A ) �L_"] 5 H?F@�@�@�@�@�@�@ c"� � @ l"r$AzxYÇcxqiN\`>E֯gDA ~WyWwߵeq#a̙a9 ?~9dSRRСCRZ5ٳ<#6Q .k},� �ěAj%&$;E�@�@ | _ JA  KV>@�@�@�@�@�@�@�b[ > � �DM_?IJ.{W&M$\pA\;;;D$brYK-DѣGk~R@  8}d'*fͲ2sLsjڵmSO=e[l]G�@� ȄL"� � @H'2$lYL+au@�@�@�@�@�@�@�(�Ace@�@�@ FSH͚5@ݺu3ΐ @I][i^NR۷˴iri"Q@MƠ#Rj$0>tAIIIIII2w\IKKFG ի4i$>k@�@9p`+au@�@�ȳAy5V@ A "� � � � � � � E ,$@�@�@�B#AVPhVG@wnFٻwTRşUXٸ1#dI[^+!f<R^`0 Ԣo 3,sILNN }arIiѢ |[l�S@�@� &c" @�@�@ Ew5~V2D�@�@�@�@�@�@�@�G HG1 � � b qBiBi6@CQFɛo)sOu!+L*R cKȑ#rW믿>vE \Voፍm۶˖-3!LQ=W3Ǝyή � @84qz6mDʖhc qD& � @ ﯀ÇEʔR@�@�@�@�@�@�@�bQ X< � �D�AQq⮑e_s5+ѣ~J@6Ve@֬)"+g  ݾ}y/h`EFdIEM z>ΰf)ZtA/cǎD@�@� #ҭ[Fuu=*%o_k @�@�r?8B<@̯eƌG ,]ZDX@v:OBA�@�@�@�@�@�@�@� :k� � �d P.H[矗/R.HkKEiPdd "a40L6M^|Eyw^zahD�A榔/_}-[H%OK/TziS@�@�'Ь/$qDnٶMX1E7Gw$2dH~k 5#� � /[IOGXB볶D&N{_c � � � � � � � @ 1[@�@�@�| hP4FeAF,Y"һH"&+! A`߾}rUW6�R˜<yR.\~LNNݻwKٲem 7`;wl g@�@�-ANBjSY(c9ҙ@�@�%@dd So]� � � � � � � �! 2Dl@�@�ؿ_? 4a:n6ӧ̛7O:tY5aXB䬳DZ{ҥ6@j)\kao @�41#y&@ZZ̝;"ʕ+Kbb}6]vR(jʬ#@�@ mڈl,!Jb"\ ҥg� � � 2(ZDN;M̗>e_;P@�@�@�@�@�@�@�@ 4|:/4l@�@�$iS3#pIر_:bEC+fMFdӦ"}Gdx[ˤId6-D@?s9r̚5өRfMq֭PB!� �DAN*rx {@�@��A \tȲe"滠|u>b& � � � � � � �I R- � � �A9\<2p@?o>RE;$~H"uHٲajE B~w뮻Dϕ*� hΝ8ŋgT?x𠤤ΝkBKÆ mS5k?() � -[8{ N |?\@�@��A ,+\XEZ<s@�@�@�@�@�@�@�@ 8AǕZ@�@�@�4re2er\'cǎ6o k[xx6oZUd@8 Cnݺɘ1c�~ԩ#rl8w_pBIOO7lao&;W,� � iyVqsE�@�@� xSj @BHZ+QbT@A�@�@�@�@�@�@�@� bp6� � �A֯/e޼yҡCo0- m!ʉL*Rb7AD| jĈrapQ~@ Ԯ[Gf✜~\|=_%OykիWח� �ĔY ;VDCA�@�@�hdvAi[A {!CD^]$--2E]y@�@�@�@�@�@�@�@ Aߘ- � � �YBŒ0`tQx#4+Xve@+&2mH*"=ƍI&?,5k֌R\V-1A"peժU7l \qzJB  � hysku0F�@�@�Ph_<==[b]@^z)z�zXd<B�@�@�@�@�@�@�@� |c� � �d vf)OJ޽eʔ)r9DdiT9܌);&P#%O?/O? TZ[kHj"[Fɓ'eřw)K.]UW]%=z]JR@�@�N=5s6~UB � � "ED?NA zԿ[&ru?f @�@�@�@�@�@�@�B'@d � �  s?d83ϗQF… &)QbZرsԎ"))"js%aKdȐ!rw !@d ԩ#m[dɟ֤O`Ο?_믿bŊҽ{wGǎ;Jbe@�@�bP !!8ǏH߾"}K � �DAGx#i^ /.ҿȗ_fN AD\� � � � � � � � !l@�@�\@_h׏sv?~iiժkr-DUil5lȂb¦D5,@, :tH,u֕q!P֭GYfIrr ~9sJ5DqI)Ф � � `Z;lIg@�@�!%2l_?{o{)@�@�@�@�@�@�@��Afk � � 'C4 4iDnvy衇/J*ESik^ddSEڴÊ,@ \.+eǎ2w\)]t)@ ԩ#jU%%%皴48p<ҳgOi޼y5!� �D37$ҢE4 � �9s_u~ )""U[VPl@�@�@�@�@�@�@�@ D߿) � � �ش)ckARmBEʘ1cQuDĉ"ݻG`iaxモ/„8C $Jvm쁪/hDsۤm۶RJ4h|7 sO?w}W:B z � @ h@�@�@�0h8;Aag~ T,ҵkW]%a@�@�@�@�@�@�@�@l"� � �+AŊԪyt /_^y.=zDj>+2n\F>a&q'l=曒w#kulZ~$%%Irr^Z)bC {-=WUZ6W^rgH>}BX� � P t9t{HMM#Gsѣrq9vXqZZ 9)Z<%Mʌ/u\+Ҫ$;9ŋK%̲%K4PڤI:eʔeA*T@F� � @ 9A~z=zC:ӞcWnJݦa+e͚dذ^OA!s|J{:ϹLsڹt<@�@�@�@�@�@�@�x 2^<� � �a H  mÆ >@F) .m@{ |ȝw<Wd}9ģ뮓۞р}F 4d)-[)q֭C;wCnݺIr岴aʔ)vݔ,1@�@ 'N={a߾}agrA>|vJ АE;X3F_cy Nhd3BdÆ 9g>hNEA`HҘ *bŊRR%;T\=Rh>OdN<� �   &#~{_=�zX@ y-Z}ߨacF]ϙNf9iSsOf t!>;hRyQzT:Z?E۩ sxNcރ~Ge@�@�@�@�@�@�@�"E H9@�@�F@ ׏eGcPW_SO=Uy{_4cȈ".׾d'b <B53cHӦ.6_{#jM7d5ҟ2p@u) � �@۷˶mxܹ3Ӱ{nEqN5XBk׮)QC)<'B,<`!h_]o54DKCL4rP/YޡHBVVMjԨ!5MG]δoD�@�@ g]kfh]Dt;{N3}|HN:a%Kڿ!x51IC?f4,RC! M5{OOgZaY7~WQ_'R ^zYzuhR@�@�@�@�@�@�@��Ag{ � � AK ի'cǎ5%\"m۶}XVD=WgUF _Zh!yx@T l[LO ;q̙CADgϞ ~2o<?~T;x@�@ ed~9h@={r7KC:Ak?8:v аh)f T4Q}t(hQs @=h�rC9=C<+&jղHoXA6lhSA � �Z @f_ z<p5޳h::/=/{ sۑ2mԢu:h(f0{O'SC#ikޗ .\~!E_k@!x|(:=4 � � � � � � @ ǖ=C�@�@� N,?+B̙#%KsMYv'C"~( 2ځ@BHo8Pe"`>g]ń_~HPi%))IΝ+iii6|F}YѣlJ},yIyeСla �ķ@jjYFV^mu?Ӣ! džjHM|P Jiܸ_ [n4cڴivNFMJfL{SiРAL8@�@ z ̱{A>g#8c ,8cǎ6O*Up%Jp׼6ѣP',k3f̰Et;% YN;//p:/B � � � � � � �y 2f� � �H@ /P@ 5=MNy饗&"\ b> "R$*p19Zj*@ +&b2h|^/۲}v?.YD\.hB4oܡeʕ_f6@�@�b]@b˖-+V}$ > ZА? ֭ �lhB�5A(+PreѡuÇeƍaw NO>]&L /^ܾN/X5� � @OV6{5qϞ=_=UVu/)Sƽ$_v|DNs; BH/0YdĉOܿH t~g%; }P@�@�@�@�@�@�@�?y � � �!8xP CHΦ(РAydذar9ȠA5׊,X  N'Oed?{B@ 7j|x֬Y)qڵ6<m۶ҧOyG$11Qf3b9SnS � @ 5Lxbv:ݻqmhuYҼysؤIb5` }Wٹsh?6l]E+;OmڴCBBkNE/Q!� �U@ ʲ1'dݺu6_:h]͛7NKrݻۿ29A}H=^QCګRr 7ՐH 2׷%)3tޗj J/СYf}S@�@�@�@�@�@�@�G 9) � �D^[L~Ker5ȢEVZ1_&J>Xd$֭cyO7モ)S@P@ 6K/iӒMP ܾ}*UJ:w,]vCvҀ &Ȗ-[䡇Mx @�ZpB={̙3/_\4 tw0x`;>SvqmLFx}i̒%KtR8q<6|FH5}@4� � @^Lfcu^^V\o}k p; ~gi:Cʕ#`J(!7/;EB~'yСCv * C݉R@�@�@�@�@�@�@�bO˔@С5}ij@�@�p k }+"<(R\x3zvaÆ6Dpz,W"^("_ʩ(5jKˠAt/h68v̝;>&''KJJ8p@(}v={;J}UyGME]$/Bз@�@�` ڵ5c Y`hbŊҡCҰ=N9H>"ԟ@jj}b6jժ6RC%54SNRdܪy2Q&s 5ؿQF�E :͛<s[W|PLݻw۾g bŊٰG kٲ4oX) D{iժUvl2ALL 4N;4?:6m/<˾VA�@�@�@�@�@�@�t@ڇ� � �ĒM"*Kǔ})[|G(<<D|\y?Ad&|}ᇄ@Y)ڰ! arQ]<c2uj9~L/߿_ƌH B�@�B&gkXAѢE%!!Au&v B ]lJ.-]tjS̜9Sx lA[:,ڵkB坶2F�@�<ē'#]i!s̱}c/m۶V_tC ֭[ۀf͚0luw:uzYo@ȥK/2Xp|'"EH-^~sw24v3� � � � � � � �A9 � �  _? UQ %бcGyWdȑҡC #}/%/EƏw  '|R4n„ r%�Q(sN_m?E?hڣGI&[NLaX'4rرrK56� �+Yf/? pO?].Rի.SU'PD :jۧa7z1}tGRJg!~G B�@�fGkʕ+m7%%Etа&ٲy�.i߾ PBL,P|,_`?͛gCZ>uǎ>/s޽Vτ; � � � � � � AFq � � kAe<#F-ZHV<f:L!.IM!u@A ^Nv"Kew%ТRْȒREB QH %%{bdɾ;];q3|1>&? F}S C⨁'KΞpO< ~L,T1wnCB 0`@hTZ � � <yR͛'3f̐ٳg!\4mT^y(9sn"CPBҦM;k4~Ɛ!Cl`;Er9L � �)`rq£zo߿_oCbKuֵٲe QKHηzkLw-˗/7E[*K,zKN:%e˖ƍY/h'Om� � � � � � � \ @�@�@ 4R(k4͍*#Gʺu +V9sFUC9qGE R'+KE {؝7ZI2^~ }\x]ٳG2e$jՒˆ>֫WOru#^8 ~cInMdB�@�BLܹs2|4i̜9X7iD f ,b5:V@^;W^-fͲK/$Ŋ3g>^|V!� �U M <v 4;wsN$װaC~.K,T?v�)(\8wi 9{ED &mkͥERfMI L � � � � � � �A 2(@�@�U@ o%Z[OA C 駟kNfϞ-ҥdMsŽرbBBT ү_?yWo߾7;C�N>-+W?,YD_*]~}ym𣞌a)B%R2g,<HJv � _~73f?ǚ5kf$k֬~'" ժU,۶mSʔ)Sl߭[7 ={Hh.m@�@�HD Ԃ oOn. dɒE5j$O<4mTJ(HkxY@Sn];8PzQyyȐ!'OiٲjJ"  � � � � � � @8fڴX-3 � @h|k@ Ο"2qw�6A zH GNU7m1YYҩ[oENh )xפ2bLi9l�АG {ŋۓ4 PB6AvYbEI6ovjJ1n۶"7דq1ٳGJ,)C>} @�D`vA�իWx@"rd]@�6tƍ3 Lcǎcu)* aM@~ۘ}3J֗@@"s'?X5z.-ȤIeƌ2aYp-ZT4_뮻NҧOʱgCɜ9sd֬YW_.С.ML !*� � � � � � �__qߘ= � � �V佘+= D@Z?;S/.FP Old1!C Aٰ� ݻ׆>?\pAʔ)cO$ܹ]^}~e]Ё~V`L/͛WzݳO@�@ ϊm^j*VZuR.PlYym7ߔRJ{Nyl� � |5ko-SL<y #Ç3  uB r-wmsΕɓ'K+]J.]$_|!P[� � � � � � �D@lB�@�@�BO`΋u"2j-[ȑ#'?^(5>^Dv [zJ~i5j!زe|ұcG)Y*THYl4jHM&͛7˘1c@*xDpOymRLS � �+VHݺu]vҸqcٶm?p^I }6^<(ʕݻˁWE�@�@0 5~RN9v|}vyWE>CoA3H"ҩS'_ðUT@�@�@�@�@�@�}_Ej� � �D"\O)X02C+F <( jذ7N*>HL𖘓{DKEAl@Wz-7n &BRܹsvZYxvˤvrJ lPlقچ̙/Tc@�]2`�ݡCϤ@B@z䫯c>}H2e^?Ʉ� �  /E/={c?"-@� dϞ]uf+W/,+V֭[ˋ/(W]uUP@�@�@�@�@�@�@�H 2Mڂ� � �!-A Kդr\`Ĉoի|xQ`1K˖ ϟ]ʤI#ڶmŠA@Ã/_tR+׷B2dC R^[3gR^FJeĉRF y'Is84iDd"s̉ox~-ꫯz" �DuM66mZVZdڗBΟ?߆.\P֬Y’,17iƻ+=zޣG`'VgC�3fٳ믗G}4 Ak֬YһwoM&>@A{%z8Z֬Y;D[k./ߛ<^T^ڷmygx,}aұcl>'͓C:Ξ>}lݺ5ݻeذaү_ ZYL6]*_jmLRF � � � � � � � &@�@�@�)}HѢe#i̙.V^=馛dÆ Y0թSbDʖ><CHӧ宻)SNd*,W@O(OڵkK\lP@kƍEכ9s=N:!q Ϟu[>k4%/\ ׯk׊vm�_ <v)o=ꫯ9rȂ }'OXC�@�~^kh!{b5s떜ru͛7˨Qw2yzgϞ6EojBX.ྦྷ<xP40W/I¶/'uɄ� Yz,rʒ={v_4h!!k^/}nڴ~?7/},zwܾ(pΝ+N~wVjUiݺZ2g.GJ,)osSRl ^8bԩ믡XU� � � � � � ��AatQY@�@�g; 珺N cƌ2c Px㍲u֗IbD 7Q)'4kL;7oh"*h4??]5\#VZ5kĉe׮]6H@owMʕ+'`SO?ɢE_L(]t'{M8'ލ9҆vj�Nz#<"/,^؆Qi&@�Kʭ*qI̙nw7i$Yo'JKnݻKhllҥK˲eqb:솱(ZLy衇Bz,@ wR @ 8/>K ]tѣGɓ2ժU:1o'<kKNij뱬[n$. *de)Zy}?gѣ VL>MmXi5,Y*?@�@�@�@�@�@�@ ?0Mc@�@�@� xsZYdٳgKѢEn'3gUWH A '5_U{P@ i=mڵ[oI۶mEOh+Q ؼyy2g9x[N~mpIk':򩧞ZjIӦMRɕ+ȑëuݕ*V(7vw;wn{brN< D�@�mSN~  ?U' v4S {|*V%5ot̙3idF 񽧆{~Ä� x~WW_o|cr =KoM>%w7}.Z/DzT6B97o^P-V*YHV "#cƌ>报ƍCT@�@�@�@�@�@�K).5 � � @ fO@嫯믿cvEu1yҪU* csT@=4$SI pIY|,^K.#Gjj޽k5jHLP<IVxΝ&}Ybd˖Md̯Z,XpɶzE9uj׮ԬYӆ|G駟95kL6M^{58q̟?w>RR%{%;=YXSN`e˖.^z2ٌ@�@ L "zrTX11bޚ5kdʔ)ORxqOd۶mr-?nF%K>s=r뭷2>,_|̘1CF)8ɕW^)C G~{Wm&7t >|-s΢C--[@p]O:iDŽ }_?Cm}#=zۍ'!^4\k?Һuks< 6ntLP^X{ hT˗gyFk8s}>t,^zؿٽ{19'Ozxm=/rwuϩzQjժc=&S|+Ww{< K4iҰaCy'haD'M$zq YfJ{W{N~vݻW>i߾+sNoa/رax}ʐ! 8PE/^^RݯkA-hd׮] }^?٩ s~k>@ xz& R:uW/M(KRJmcO/Se9��@�IDATAX:XVI}6$O;Oh\XQ/vXo7yĊlO%74h< � � � � � � 8>Zv@�@�"G`TɈ%pKs0'i;+Vt 9:*fv)Vq7*Nu p㘓sJ"G@_Guj׮혓OfAwq~gDŽDNi[&R*2A9͖bNtLHӸqcVcҥ8&y'㘀Cv]ٳv=�' u]gΚ5k{>nml8pŴ^{۞r@�WF9&yCqK&sL}UTqLXod¶zw1ӧO;={tLc.`7a \s5 :tLJ&N1?P:&ۖa+2erN['*U1ƍ9r8&>7ؾGf%m\r eu/7$deWA[ҭ[7{ !٥ P,Xi/ۙ@s,QG/b-,jf}߼y �\ŝ 䘐Do3fĉNB}]L[]`uiӦ au0 u v5?Q!зT:3ftƎbDŽMuH=U?E߫ʖ-tݎMc.c neh9Yzۄ;&:{vF}1g~?~1vܯe<S1$y+w5%Jpx r><?b ! p啭E=$BaJ&|I}y;4srW\ٴigqrR3s}IA7Mw}-&tݺuEB *ر~Ÿ7Ɠ#.^4Ί&Ӷ;s}64[ٳé@�@�@�@�@�@�b&@�@�@�? qqEyG@Ŝ(&MLlٲ%LjZ?^dL]Zu6B-7po/<e9L>Cڵɗ/qbN$`>3Ŝ%`1bN vrS4Wm1᏶h &PFɢʄ߈ b7xCL8|ϕ4rH1.`E F Ç\=ۏ?lذAƍgÇSNbB,@�@ L胘~D(8nɄ& iU3~b m(W>%&BL(=Zve~ .(&\V\i}'oMȠ,1Vǣ{{L0MФ +uɞ=[% n"&d[Lh;J.-K. l!&xĶRJ~h˻+I_Z/I`7=M2EL(0z}j?_&oG;Vѱ}hy\y啱k׮^zI&N(ڇ5OmB@} ~2`�[ޚ5kxт G}Ci2!#nݺPuA 'w F;/Mf 0˗cm{Ǔz2:A?ZliL=ޠrwi=te XAbZg&~6kt2v? � jO:0>/&yc>_G駟8 */;w5o%IXA[Q;^:nձN؀=&`0=JL7ƓΣ~'@@�@�@�@�@�@�@ yi:k#� � �D ȔM Izbb… z;|{sH߾bN~;D RF![!h%KHi@k p SiӦ*THJ,iO߼y ?, PhL&s I \`"7+D]J ;eʔ)]5kV{g@ƠNDA> Evغu pg� �Rڠɓ'hx]AYkHñ4<[5pK;wڥ5|Ý4DBO>ޕRqTZUf͚e{k;zWqM4wޱ+Ϻi]' ԀK ;ٝ<sKlmruӋ.h_Q'jNK,Ko?{ P+3gNKuׁkԨag )Q￶|5O>6]P:in pԩK͚50zs=B 1:iNy0c`2 Tv? 4ֺo.ѭ[7{BbG>LOڣG!b  � $yҘ?oƗFcSZ :X&qˏqs~3nq;r5hЭ{aƓ!� � � � � � � )@@�@�@�? hjbB�\rTR&zING1Qw7IǎbBD (8{tՆij LDo^6m*9Zzu<x<y?"/(?Kr7Ǜ69sqxr<uɱcJdѲ~ziР%i0麩+f>u1zr3IǬ]-g˖-^NJ � 'ɟ?,[,d*_p@=&4s$wWuߓ1cFe͚5߷I`VH.7Zm۶LGٶmlR4BޞS 5W ~XB[irˍo_z_COhXٳ>_֘_hVw޴io2`�[|b1co>EԶ%.]*+WNj5G� !n>89Tcc)_4|p{ ~Д۾~:u͚5Ub&@� 腅͛Jx>o<c|yE<ܥc':wLw-u }/ϲ<=m>܇/je/tlSL � � � � � � � 䛱 � � l LܫdD@嫯*UHÆ mU$m9RE&Ns?@}h'|"74+J}dү_?U ,iҤ te4hPO0={ HPLJ9QY̩S/K:ud6F! 9uI5j$SL7|dU/\`0wܢ'ڵKok… ۿX �:^^u=cqKq링:ip䧟~jdž]tXqnϝ;'ƍP+iJ֭ckӦ=֥mҶiper&[䖛оsjG\$g>zfkFNgܻ.[CÖA6}6-jV_ 6<}OMWjl�~|cF2dljF%nXg=o'yiʕ'N=Fń� \Ϙ1#Ib}$i0|;+POrĚw_ ;ew|+BG2eH-BR@�@�@�@�@�@�# ɢ � � AsG#'Y̙30y9"O=%2h9 غu W~[44z6o,|hH(P,\Pj׮-&M;wʶmm=B zѣxKOx,G5|FOՀ J:t jZ)]tGaokCom4 R'qb=ADxNV,}1n#� @x <6,J(0% 6>j%n)n]T\ibŊ2|ppmՎ?nq=qH={Emq׺ʢ<%O<v7us I4r5\. n?287N=T`Acǎ6ӭב#Gjꦾn~S%Kl0[vb޽{|ϑ?DGB:tH:w,۷o  ɺzMM|ǁ4�lRkрܤw(Qd˖MM&k֬ivAvL �A\=ެa˖- j]yb7m1>J;8i 6vKjK{eObA$7w^:%,oIjm9[`buz!Ǵi95)!� � � � � � � mwN� � �J Tqh(" sQ5{wym\V-ɑ#Xp~2{3gɚ#Fo]'e˖ %پ}=_d4DO뭷lPȔrhNDɜ9e$6$6wQxzK Ѡɓ'PVZɺubvo Z5k]OƏok4(&g{޽{>$ וH褯; #}t2r}6܁� �)+W.pqƉ Ӕ)Sl vKn4lPuP}ɋ/(z o>ק~jðt=/Μ9SoƔt8`o]UC5|:*Tjرcm]>4lpբ>L֯_/UڇǤe_Dy;%f_u֕ٳ0NQ^/lݷ;5^';r`0wĖ0ҵkW}'ZW}&ԴiS{W.]EcZnmMoz{{C:/kxٳgm{(,'4w *QJnNzl/{{.u]venR9sbŊń!k8NZ~-$yzLJ?6lh 9W]uV@� 0^q!}ań>o<Ca^@Ɨn_Ag.dc?>X`?;fsRWv2k;_n;y~J:{oxSOρusI옄7{to؋&@�@�@�@�@�@�@� /}6n8:3!� �DԩWO&H@K**嘓ĝ;Q;nM8˖%!Y~.]:}ɓ'#q&>@DŽ8]w%K3'wU.nر-u֘ք8͚5sk3&ƩR}MxӧOgƍ peȐi׮cB!m?H_uqVZe+lNUT1Ḏ uL cN s2ӦMzh9Ggܹ3's:&IXdIDŽC9&!z� �!0|9&:c+/EDŽJ9?pJ\y)\}Վ ,t똠˜'bW\hot~'9�}!C8Ç U\M@-WF_ccK솹Xc.J`&i޼?lGپׯs9Gm&)\3tPgȑoǙEkuѱ]wp[ӧ]GXhQ'I&T.souֺiЄAMS\9DŽ9M4uѣsĉĪtc&̹b}^L{1�bŊ~} =کQC@2dDŽĔi"c>nB1;179׋Be_mݫWP@ *jS8htLcth` v<Yf&)}o>/~sM)U}O٩Ǎ^zLO̅E=9c9 rcR&~fv٦}W6?);=Ct|wL&|I}y;Ա tL<~^<uzA;ؿ~YS>-OzA]qfܱ)«xRR}ݩYmWrz<AmdŞ.x\! tnVOݯ~~oqաC~tR{A:}g->-^)S~\`,g � � � � � � @ /}2isS}R � �i"]1Ehd,2~=x0Ŝ!-[?PaܚWEʖi^7R_% NsĜd%>hW!K`bNHs2]nذẢtRtiiРAlNW୷D /bN(&QLx}[nE̙#{ $G1H*ۄMȦMѣbBĜ0@�B[`ݺux?c-&\:> ޽ S &lP fmU>ٳgEgdh۠e߾>~c !&3*iM >1Ĺ>:0^#2]$T.wv?!2Adqj%4bB+.y;/k-Ą )&R^zXEرCLݗ}]IiBANnE' &Emmywń&RecQ_im҈=cBy ]B{%+sGj߿E?<߫9ϧB9voRD 1!cqoBFH?X޹,̓BEb{?SL@@@ۗ4 I}ބژ}|g%>etw<3P˄.qDz›6&䬓x39eEۺ&UL8Jꩧ$SL@{@�@�@�@�@�@�@� y� � � KjNBsX$*T)5lPfΜ) Lb}_?1']^ V2. hŝw)=Yf b!"n?j_Z5瞓K|B-^9sc?Owydž<36$ Ť!<*TEQ� �a PreYz ׾iLH)P@j} TI4H3Ls]k{`O^tvz?Otu… :z*)wBe:*HZ5~ _h׮;!Src647<<2RR?oi;a* . xpOO+yұo۶MFeOJ^tAHhJ=5=O}9乍{` RK@�q_|!_~ c{塇~٦z?=/1jJPBwYopAHm}ݱޗT.7uƛ'})-#^r7;[7vPW@�@�@�@�@�@�@ T|z!� � �!.c z5z_/˗/[nEjժ%f͒UNT#1"Yh ̟?XhƪUDA E acǎ' e˖\rIݺuɖ]YdI  yy>|ԩSG-ZmٲŖ9~x`a;7|@ � | N:#<b\> 0 I8p>s5$`s)L`5\+~ɓ'QXe>}Zʖ-+gq[Ŋ[dh`ɂ چĪ4 @B! 6r3g[o˵Y @ -Z{t=>am~tU4i"BJSa &Mt,_pD_rk{S'_mXjn9<j6yd3f_~2eʄr � � � � � � i_ռM%M)@�@ Ӧh?w`#x)SDWĜk*~H8|nڞ$]w ΉT"R_x +!zrذa2h I%DƄ@(ٳ>k׮ϛҠAG]/_>N P9aMLPk?Pb"EdhK@�h?fӦMv,ֻwoVZ*౧J+7om۶A&Pxl0<x!!y䑡CJ=аaCvgI >gM>]|M{a6˷{NJ*܇�o~Ӯ ( { *S((R۝;r<a`~͚5oCk븪]vAy>y<5B~չsgsaʏD-zL@ SIjܹsm�)W\q ҥ˗/ u`' � � � � � � @4 :mF�@�!@d2X^yE䭷$w#WzA>}wޑʐ!C$mڴ^m+!"7\}u8#Ccǎ_G^G _~7Q۶m3L0o?*Tϵx_ y_b{N3g@�@�_ ,X͛'5jԐN:ٰ\rjIs)s =m d]6}-[6Ԕ~qɚ5 6;vL8Q;foiUW]@ |D|v@*L] An;c 0a,\P-*vlRZ>x'|~|Uϙ3GB!֪ vWI&ҚL{@�@�@�@�@�@�@�8B !� � ��Hz&Ho0=zիeɒ'OT+sb/ gV`ٲeҶm[Ά쥶LG 9'N+Vȏ?hK={vS )mРԮ]; $ɩ;&_9] �)�G�@ n~1cE5kfl�=®#u0gΜ̀.v:uL2ìV?u=رK@�@�%}y2sL>}eɒE5j$M6s%UX2RDH=~eY#q6iD2f:P8 � � � � � � @l4bߕB )=["� �'0m|ko/܇@d l)$i?v:)j*iժKNf̘!UT ND.ټY$s!0W_}Ux 62aov{Mʮ5kȹsH"6~vYR%9Rrs*%{>Z� �J@ϗI& 0� [` zњYfYǙŊ ~{|F@ }x>+1?d1ΝS#/ Bǎ ܹssNsaӢҰaØdɒaN@ >gϊfѢEvF?.z-Zعf͚6m6>@�@�@�@�@�@�@��> � � ;vtSTx|.PF cmJݺueȑҭ[7'G}GұcG{ً/(=I?;Ԩp/1/?<VX>W4h` +JHQX� �B }Ҽys;<yR͛g/1p@yEӛ6mj{dՙE*4gt\s5rwѣE_2!� � jٲeoZ-[ȷ~kgx%RN=~_zu@ v-˗/K~SNIٲeqҵkW%O<j� � � � � � �D�AQDL@�@�A-g"U _|2|<xC;{ubrɤvmgvEtryak@_~Rn?8qBVXÇK{jmС} zS }9-F�@� dɒEZli sp#FHƌm[6lhog͚5;BH`Ϟ=c:oڴI|IiѢ(Q"jLU@�@�HZtҢyXƎ+6mZ)S jժً̙3M`ΝvZѰUV٥^ SL~?`�Wk@�@�@�@�@�@�@�BS c&_UM%M)@�@ Ӧh?w`#XEe=[[o@4 ̛7O>ɓ'L5&*U3V+\ Py'!5 D6m*&Ly@4cɒ%1'%YFΝ;'Ez.]T틍#C`A1' � @Yp|7veI>k@ݺuf͚RdII&MJ6Lcʕv̩۷S}=7nX4ib_ʄ�-Q(Rw*ݖG:$/֋pR/.+Ws |RT)ɐ!C>9 08br/ƍu٥?ѐZjYeO4UF�@�@�@�@�@�@� 2jz� �x'/9 l$R99|!'kΞas={E/ysT"2yrw]~A ">( ~B/\ ׯm6{Ф4ӠA.YHǎ)-@�@�evk׊ʕˆT^bҥKKڴi+'lVlcϳg XԮ]ێ7Zj9sf׉ @`>< _ +I@$A>K Ӌ腺4R 5Rʔ)#:e9+@w_&3 uCKXJժUbŊ%K@�@�@�@�@�@�@ ҇c3 � � .;v\iѢRc@ *TH[yGsʸq$_|aը?7ٳêT3w.痥K~0!ѣGe?e˖ɑ#GINuԑN:G-[6od(аeb^CQA@�@�? ;ﴳ̙3"9l^KyWm@e]f.Qᒹ`~!EGfmذiRn*z 뮻^VZRDh � �$(㾦M]I~\l5O?}p Yש@6$R%Kms<yܢX":԰Х{[Ǧǎmϙ3 O-[4n8IQ~| � � � � � � �-@dt?@�@�,AٳQ<Xts=gO:bŊ2~xi֬YX>-";9%,L%HP@Cz%t|}h l߾=&Q5I+^ԯ__ f=mڴ $(`ޖs&@�@�d̘Qj֬igwNkڥgΜ)h 5\3.]چhPH֬YbX"}lhh͛RC 5&M4rUWㆭ[jժ} @�@�/c?FgI/߲ek|…sNʮg7^|'zWH;k$uOYni z1s۶m1fΜَCX=R'@�@�@�@�@�@�@Aϖ@�@�@�^.  h`غuGҢE ٳ >\B=DyG|)d0cǎٳ[nezkECu޳gdȐAV*5z@rS<! C䉠 � v7RQ+ ٴi7ر8M?4$ꫯ ↅ.\Xҧg0;~xLƟi5tP=DC4Zl)e˖eL@�@�1w<ǝ/^,}Qt;+:+TPE.W}!$<h[:k{{׮]6^T_l-4h`q }=ng2@�@�@�@�@�@�@�@�@�a Cɡj/#G{AKk?~ԫW/$~СbB+ŜUR$)p9ydȐ!rM7رc+Hr;V|ҥKm?XBN7yJݺu%KA 2(@�Z@CunҤImN8an*:vp;w6mZ}"Eyڀ7 CB!eh.@ }wQɞ= 믿^tbBK*%Ŋ `B�@�@�Ȕ) n& �w ۸q]Ok ~?.v|.Ø/n:uJsf sܷo믘eҀS}}ԩ#[!xz<1ih. � � � � � � B Sf � � 7Y7kK{FZyG=$ѣE0 jE]^`ұcGٴi9҄TSpG~Wcoʘv.4iD~db@�@�H@+Ud>hcB4,PCB,X`C5A)ၞ _~xιs&8҅KR͏9"̢A \9s&f/2d pO u5ŋ*fn � � @D XPG9vܷw^оUbB_0~*W\e /s:ܥv9sГq+^<KK.?z_CCoD;M=~9k>`B�@�@�@�@�@�@�@AB2@�@�@�4x@ `c/Rƌ#9sرcVZCb;2'/t.椁1BOܹs2|pZF Yv.]:*J&p YbELҥKTYd5kwaCd)= ` =zqٲ@�@ҥbŊ95\PCAvmf Awҋh;kȑ#2hzYfHg 1ɜ9sHkN<ig95k7l]o\p!gmmjp(Q"V0+\} @�@�#㵫qO߿?fp@wvCq u\.4I|:.tg mw\K=:VYۣގgϊ5|)omw Kݱg|cQzΞ| ԥ~?yWJʕc>5To1&@�@�@�@�@�@�@�-@d � �D%$i2 E vjYo.]HݺuO> /.YyIiN20 `$_`Æ ұcGٸq :T'%%_"a,Y3[Ξ'Pi3<cUT 2D i]c' Cir � 2f̘dXS @H5 5tnOhK p&π|KCi>A -=� Hlipa'7/_>&0S6 7`CC4 wLL@�@�@_XhQ;'g:s53kxE 3ԥ4 IuE+7g5IRwoK;,1?lo;q;ٽcJCnͤt1=3`MK84KGg3!� � � � � � � .A3E=@�@�@ Kɴb~DvUD@eȣ>*=Z4ivs%d01"  d I>Ç^W.k׮2e$6}=ykղtҘG=yMO&\ |`Rl5�H" j<K{dTCx@�@�tS@;'R"x Џ'NذwnG F743lýjf9dɹ6CC>.5D t# rLC � � qn/EcDw'jPdX \86ɖ4l8^ f it/>'&!PɸASf$Rǚ:Ա;7ݥ>Ƅ� � � � � � � @ <F�@�@� qqA "Ν;K-gϞr 7HNW^y󦨼n4mT3)- cǎqF2dN_nUDO:ƺuL }Y �W=( b㏒)@�@�3gN;ˤkWE>~r@�@�@� ~sJ/))m@�@�@�@�@�@�@�@  ' � � @hdڴ" GNh &P`A1cL>]z%gϖ_~نI^}UU+7@N>-CaÆIjdڵRLȖA8ϱ-0��@�IDATrʉ>jh@\> [都S � �/MY� � � Ǐ`=hdxԙZ"� � � � � � � @A&m � � @4P!RFRIbeРAҵkW7n5Jʗ/j,Z$O"P8Xd^ݻwݻwåw&ؤ3dٲe6qɒ%b 9nˑ#ԩSGڷooCvΜ9êmToNɜٛ5Y@�@� ȪUC~ @�@�@O?-rlJD�@�@�@�@�@�@�@� G<{� � �.AEFx#i$AhotQ|AsB}U۷<mΨȖ-_Zk"Ԯ)T :tH  cǎoY͛g>pK5l� plذ>.].lb\tiW}vY\9=𜰋 9#)SA @�@�H"_@�@�@ V[ɟ?jN]@�@�@�@�@�@�@�@ ) q@�@�@ A@jdٲe$䩧I&/,{Okm_Lb)  |'ҧOI&L2EZn)˗%KȊ+ѣ6ȶVZ[ԩSG P"a A3AE" � �H|C � � �#pHnb.&ҹs4 � � � � � � � 䥀� � �I@ oOS,U mڴCI6m':ȨQ䭷ޒUdߣG\qH˖>)BۥGW_I׮]e+W.OAplذ.]Ԇ?nٲEǑRJ>j.+T ҥKN)Г%O$M@�@�X !/b� � �D;_/v EQi* � � � � � � �Q"@d<4@�@�/AE~|'p9~Il|W^RF ҥ ?YcEwIљ;oΜ9##F!CHbᅲ v'"Ą>.[LVX!GlٲIZUV6N:& 4!QTT&@�@�ZA dO#G�@�@�طOgD}TlY6a%@�@�@�@�@�@�@�3  � � z(bBDҤX'D {)V,^X&M$O<|'v٧Oɜ9s 1{D׮ޔ W_}%{ݻwˠA1cFB8w_>V֭[FKwu]VPAҥKx<�z;@�@�0ؿbE 'j"� � �0@$gNJE!l� � � � � � � �!-@dH?=T@�@�A@d*U9xP`AEqILH@"ED.,ZD@ >4?{UV+ȋ/(Krw %Ʒqƌf+�"`۷K߾}>oFS+qʕr$JȑCjժ%m۶kזy^@�@�@ C:wqɿ � � �)"'E&Qd>Ǵ @�@�@�@�@�@�@�  � � uEfٹ.HƌbDΟoU^-&0�%p9g]ʠA7xC^~eiذaٵKdBO?MrUV@oO#FСCM _KӦM? (pYv ~\l]6HlٲRNrIڴiC�@�@�@ F :1$@�@�@�"N@gԳM7qG5!� � � � � � � �AD�@�@�R*Рȗ_={Qg�[n΄@,wB رcwc_/͛7aÆIJlĉ"s|s�~;w}ݻW~iׯ /6L>رcG& ZC8#kז;G3gN@�@�@�"K@ u!Cd � � �'"[L}B�@�@�@�@�@�̉mC/ҫ MR7Q^!"`ᵢ bAT,ҥHQQt'_6dw˖$?וd$gf3{@�@ >Z!� � @ 4o!-xq^JUzٌ3O?!CX/Ç[JYW^1RDU`ʕ6`�S%\b/_>]fg[paGmȑÅ6kUhXWF wFnJQ@�@�R uY)Q@�@�@�bJl@UcT@�@�@�@�@�@�@�R!@d*И@�@�hм'CB}aC~8}@ 9?M2ņ fիW뮻=/S[ V2{__ vvaw}=Vvm9sj*vV kz>.[;8d+_~ۨQ#˟?UB ( ȬYc@�@ m3+Y2ֈuA�@�@�o9<G�@�@�@�@�@�@�@� 2>+k� � �,:u/z? ?ٲe]_l/6~x۷ 2 ,ib֤I3kcڽkqٵ^kٳgJGi9w\3g͛7v< X֭;p*TҵZ +8 � �  ,Q"vO@�@�@�XM%_{ͼ%>C@�@�@�@�@�@�@�@ ~mɚ � � @& uf^V#f'7/@ r酿kƞy1buu>[bqZ4L6hk׮СC`P4.]}TO?]repf͚Yz,( U � �Pda@�@�@ 3kKc|E> � � � � � � �D,@dT� � �$-pfO<q8 c_ O<v-X^lذx|7mf%J0C/^l O?Ժtb}UT)Ck [n };w)qѢE[…I&֭[7شiS>q/!yK@�@�bH@AjP* � � @D'͞m6o^D3 � � � � � � �ĉ�Aq!Y @�@�|͎IX]*?@ k ϟN8a+n){G'o߾6p@+]tam\`ڵvwkf584_Npݶ`G=6ol9rڵkǞ={n5,[lNdO@�@�bN`vbbT@�@�@ }n쪫;כĈ B�@�@�@�@�@�@�@� 26)+� � �%PYɒf[ r23ȺӦuTl7|7~a{ꩧw.Nʺ@y{ ;*T`&M.]j^6ÇmŊ.qΜ9|rS}֚6mjs 6ZO7B1Ŕ^3`ٳ % � �1 cY1PQ� � � wISOˆ � � � � � � � 'AɆd5@�@�@ :<wh@�شlɒp#6`�瞳zunv^zU%DŽ޽{QFY|G뮻r)8͛7ǹs 쯿2}ؾ}{]�dr岨@^1+X0k[ � �'p+{u � � �S.�;ʔ ?}@�@�@�@�@�@�@�@ ~m˚!� � @&ha{G s0?*"@ >м>VVM~r^}UK/YNlȐ!֨Q*n .RƏos6p@*Z@dpׯlٲ٩u溵k׶Jg @J [�@�@ &v4;rĬx>F�@�@�#u}$) � � � � � � � : ntV@�@�O4˞JLe1gA*RaJܹgϞ֣G{mȑָqc;]_MF8㏽}ƍb {!\9|M4@YƮz뮻TRF~ZUV%}A+] {TjӦMPBq _f'veN � �dGRXF,e � � �w ^xM1@�@�@�@�@�@�@�F qP'@�@�Yrzief^x[̮G�42 K~ٽK.=>=zujժe +"Ѡ( .8`/]wu y:u }\r{L>*W`xzo%}\`^j>kРiXbxZuY` P$@�@�Xؾh -G}@�@�@�)OY쪫/ � � � � � � �Ŀ�AYC@�@�Z޽{}?c~7¶O;tPr%t6/Px Wk#G>rz鑹r <rxyqy\GA�Xl.VRVmۚK.GyzmCo=/^xfCcoٲ6md;v<vizmW{hnj-żQlY+UTTh̘1Å@jߣr}ٵ^z؝wi/.]؛oi5jР)/\?Λ7u׭[ZצM`TuO;4/l[l|VL(TBlY  � �1'}MJ%sۄ #� � �=w̼{�wH  � � � � � � �dQ΢F�@�@ KDz),_ݻw{q~"-~B l : ,Qb|.284 6~~Tc|\@dN0uCp{)RL( :Y,թ~/ۈ#'ѣG/nׯhqyA ya[v-_=~GSׯwaJU; G;mq?QjC UH#&}c($|VBXUZjժ*U.I+m>;]�_7믿neʔqs̱;K/BjW}Ŋ.qܹޅ/.]ښ4ib_ lܸ.\8VWz#@ ,xb޿@�@�bN@A|cT@�@�@ DZ6!d�/@�@�@�@�@�@�@�@ K 67+� � @ (Ja[l[ڶmlЭ C+1\Q`A/%8P\pʕ+'1Ta~W?0 R*^ޘd3B۷/Uؙ~8fp~nWNmpEB aCl #y%dɒVT)7(du/4;LOlٲ6rHꫯژ1cl֢E ٹsgn)ӧO)S�3fXÍ.vߚ ,X`VrmX\9;S�ݓ 4=FkߴaÆ@ं'WhRF kԨ5k̚7oҲ=OK߿ۇoϟ-GuqÆ sαaÆ�HrR@�E? � �i/}}e � � �+0uyͻq^.!� � � � � � � @ }ۄ!� �  qܴioaLPܹs'T@`*U\PP… G;K)T(}D!d CQ;?} ?R\ri'x{(N *fکӧ{̜9Bvn6ݻ{\}Yq{YVGI+W>>�6D 4pa7tլY=4EA~xmj.Na+VpKz̳W^yjPv\v&L*R >|`n3  ~ܼyy5m.2Sv=kNM@ tMdm5� � { ,@�@�@�bYaCͺu3呂&@�@�@�@�@�@�@�B wѵ9MVsd> � �-0e㼴;j5ʺס֭[mݺu~zcƍ@RxJ.%K}dDWr<:=E|۶mvXn( N'tRQ|yӣB 0)Ēz_YZL=7n=s.K.1-~.\rϜv}ykҤRpSN?_{g[+/pRճ\r2j&ZŋP/>3I:umF^s57>V3QL>*qժUn^kҤ{h7^*P@ @z ryf/ � �#}c˖)}\@�)Y(_ׯ˱5o =}mӴ\W_5̻Usf^ � � � � � � � 9c@�@� (_~5kk׮u?&T@Wzukݺu O|z(x/Gix@R $S:#>I._ڵ+0<y'l*U2u+hX]ӷfj|Amĉ6fkѢ5h֭!{ a]]zj>|xBV53g۶c׫W/k׮5n8! z`M]Ϸ3fشi\fb/K/KeD6P?*}G=pLG.\=^tE2edxX  pռr  � �1'}Y1Wm*� � � fkvU@@�@�@�@�@�@�@�@�َx%0iZI2@�@ zL1q^5FϺjMvi?ZxO?ӭB䨰nbzg!ݻw@H`B#PB Y*Uܣjժ[F SiѢEM[o\3g ThÕlٲYΝW_y~ /`O?ְaC֭us {=,M4.\h+V>}XϞ=~֡C;]YIh(sDÔ͛7[z.j~W! Th&M+%3<Tk� � cލr̻1 �i)d^d@Y~[(KB B~O!Tn;Xe@�@�@�@�@�@�@�8F cH� � ,/|˖-߻NJ+.QUr*W p .~D?P(*J2zVfM]{?xq s){֬Y֪UG̙իgӧOO^:IFr緫z>[f h~g_{` <p}X�А>sዾmL/\;OmW\hQ5kָ)XiӦ[<yR(C�F@2eƏ*Q@�@�"hȬMhtFB�PB1Q&@dm@g^+?f=MƎ@�@�@�@�@�@�@�8*@�@�\?)qwْ%KlٲeuVW%J:uɪWnժU _rȑgdOz#:t֮]k?PշzRdIS ZSș`6 i!e'7ŜR7{νIhA 43f@G{6yd?z駭[n/_Ѳs>ڤIvB>GAe˖uO>ʗ/o*Tp]=#o޼i4?o={m߾ RF#,˗/Oj+۸qck\+V,93 [ [u � �H`ǎ7A@�@�@ }ּ߂Wwj� � � � � � � �'@E2g@�@�PϟU?m UvmHZj™( rV\=:t`[lqh A[t͞=۞yۻwɓDž)I&.M s Lm`fJ?lʔ)T_1o;cg}m޼ن b&Lp'AvٲeOF72v窫r! wnӦ 66lh  3e^ ,뮻E9r$0!ڷox_~ k̛7-ZڸN8ա]vEFuۼbŊ[c@�@�X`NExY5@�@�@ Nx74׼JZ � � � � � � � * SD � �D&_ٜ9s\_ԯH"֠Akݺ 4իgUT!h.2VB>~QPի]h.\hoڵ ,8 kѢ5k󧥋@8~8͔-W\nz&\1A+صkW6m_i>zM�dVK.mVcǎv}٥^jpA*hVz(QA :ԅԪv˝;; 4L+QϷmf9st Tf͚n9ɯc �){n � @ x_w wf � � >k݈1WUC�@�@�@�@�@�@�@�T *6&B�@�@ ={L{|w.8N:ּys¤�ʕ+dتU SQ?][{pׯomڴqD*@Uf^^rJpߌ{^D ;]BүC&NB?3+P@U:�nݺygÇwOњ*3(߷˗5kָ:Pa\WT|'9 5oߗ�@�@�1x_Uz7툱S]@�@�@ f{w,#� � � � � � � 1ACB@�@�R&ӧۇ~B &ۈ#\�$q)3elE@nUTqݻj)<Ofr>l С{VVhYꑉW|YS.].r0aլYӫ{&U>Jx 5ju9oݺ'n:S(,~Hv,X`֭z٠A\dbŒ@�.'KA�@�@ v:Z] cjQY@�@�@Ə7۾ݼ� � � � � � � �+^A�@�@�6{l۬RJVvmS`VÆ >]_~ r:sȤ4@ 3϶Yg^}j &mPBm%k _oVBlM?|R8o<;,gΜ0TJ 4kVXB:oVObŊ /ؕW^i?s TpB60`-Z(Ȋ8>x0+9� � ;w}Ѣ@�@�Zw@=ʖZ"� � � � � � � @dAFX � �ؒ%K\[r϶+Wڐ!ClÆ nѣm۶7o^@ 3Ͼ�j6P[6CFZ ,_>{C=dǏg?L톬eޯ_?+S3Ǝ9⅓ENkֶlb ,}]Jɷz ؖ,bO wVkn) � �Ĕw/WjSY@�@�@ K xM < � � � � � � �$!@d8 B�@�@`6n8[5jVZe#GtK~N:$@� j#Ц6Cm%jSԶP_  `:|p{lQl 4h`gqV@S_risNn\l޼yK4kذ=zj/\d׮]]*x2#�Y^@!Am��@�@ 6D-@�@�@�_!#̮ҬB/]@�@�@�@�@�@�@�@ �A =x� � ؼyvm.ݻƍmvUWYBB�P[6Cm%jS6Fm %~Mm]w}ޓ=zފqZnm j|'lϞ=6e駟?1cX~sVvm+X`۷~^uY6uTdɒֲeK[MS@�k E@�@�عӼHy � � �ĀIfbv1PY� � � � � � � �&O3#� �Dm{ZhڵkUN cJAnj3졇SN9Ů:뮻D1FT7)Ӭxʼa &Uc^oμd'ml2رak֬.unݚifjk^z%ϟBi)4 ?^XiuѳUIg7o � � Uv2_YO@�@�ѣͺv5R%ֆu@�@�@�@�@�@�@�@�Ȟ^3f � �Ē#G쩧jժ Yf٧~hS,[<uÆ Oo#Fxvmu͊- OAZ<?1u}yV~})Ni E -z |Cf͚:ZVț5 }Sۣ6Hm%>v<ŊEz^Heq{'i.dABD&RpaW]|6`�9rdb_s5ڵksα={aO>]yvga L:3a;l˖-I/{.saoV6W6;<{öyZkt >}x7߄^Wׯw+:u L:ơ4_?}n'OlOt~>uh]<zɷ&M!C\` 6Ν;}L•兎2{=Zl>xImw}:,>}zy!FBOs{>:F. UlhI:s=sTBkmRbC#%uHHdJ@�@ @@�@ ^2Pn:oѦMw^$iS9-^l6p`t֏Z!� � � � � � � @=ۂ � �dof\m̙֤IL 'ٳgPH4)?.])H;v%? ˍȟpa}%2y`+Wz?z_pgUT1cƘZ.JUrevW$ ?^QGalj&Qb_kV\76VH_ S`(I:v!-<㭃�mҲԮ]ַo_79s_|񴏝6mZE@:V�޽{n^+Q1h ڵn m޼,XO.$NБ]/ x۶mCJ|.]#צ[PbSxaŊ]flLxÇի;pӸA%I믿 _oԨ ,' 2}Yر̙~+T%xIm{MÇi_y'1I/~:_^^V_~=cn(F [S>)>ۻ0Y}iG1- � @#EdβY* � ;2P~Z7yt= @ m^ybw9 � � � � � � �d�AR@�@�T@BM6\r.Қfj)`誫r9rlٲ֫W/zOn$϶@pIxgڵ^jM6f͚ĉUVϷ¨t¢yTO]HTۣ6Hm$՝8_Xh`ƍ[Z.Պ|gкj{6Fi]Vj/ N2e_fM{駏Yd?1#{=. {ot?p@\H֭[׆ b*Ur UԖS&:rʹQK*ez<m jfqXҥwa; \UK|qe˖=j*6l=mۺ�f)[a%iĖa&M%Js=3O%yB@c -~i霖{]~7 MPج,/>"{+[az_^`XvONj@�@ t7,� �D |Gf-yw$f@4 x3Q'@�@�@�@�@�@�@�6~)m[ � �dZnmi] /t)B�CKhH&j3gL(_xP ?Ф_կ_tqNÎ!m7oIJevh6Hm$YĮ}G/_tmSNu!U3sY_.@!-�wyǴҺtڴic|ɁvT3֮]`oB)S; JH!OKSC *B [[dIJ]'7: ]F|TRB窮_B<l˖-gSqpQQi+Yf&5y3?υU>SVpa_\pߓO>i6l֬YcӦM~ضmO`=[?xݺun}zRnX޼ySN 7|u_xϓoZc}^w^?K vj{zݭ\r9֭f%K@�@� <Y" �ď@q("]ltN�+nxeMbw9 � � � � � � �di(l� � @ (\H= -@oM2vyW{* /?wߙB\ʖ-eĉ.HϷKaJ^a@?5ią (P-b…[o^{3?`=z0(J4hnvD,`9fϞmr岊+jnG,7olݻw1tȑc=oH8 3f͙3viv7}roLO ҥumŋIo;Mj)hIuyGw[o5E�2~UV(*p-R HQ ĦG;wt_`j+B?'[Hۅ^x{1S`o?|Ÿم*O/7A7$) ^h۴ژE^zC qa*y ;:7͛9@hi\N>ݶzk{o lSg}n.:>ѱUSjժ垾Vn]|a{髯2ڷoo]v suϓ'G7jnripM_K;Xpd~]BiXhw}vگ%t~u g}f&Lƍ:cy'( Zk_ڬ#FYgOt:MG6C41i>: y<��@�IDAT-Rww۝wi-[t:p&eܱ歺_}զO뮻tn[FmM6uu1>:nSdy{Z~yizZ%: C W@�@�2C@A޿@�@�0:?uNXߵ\AnܘMRtn7 毒y ڊ+8ճkfBT8 0`}\n/?{7 co: ݀/I>.dw4Fw͘@�@�@�@�@�@�@�} c � �Џ@`*fa(Ep pTtTvm.0hѢ ] fcǺz*_~˗O?d͛7˅i^ 4 T{5j�HWX9 cRXʕ+M> ֬YѲT֭[[2e CDZHS85 )>^ ر C2f�~rtDRHٱc Tt嗻iӦ#i8w\z RBŞ}Yk׮ -(E!]Ԣږ{)Irذa.K!TP|#]�g͚5c1D,ڂ v⤓N 񽌤]88Nq*֭۷}\Jk6}.S.ThUW]e [zRR9m#RmմUJ"EǏ{0'>QТ}whQ࣎?B:ӭ]օT7jȴ,ؼpa$ *ұ;B u%ݻwLm.V;.6Py-Zp'2tAK4qPᕺ@Uj]=SkGFnɒ%"Vm)Oa CU// h<O\0}ZBW0~j # MBOu|Nj}ϏX_~`3vD}LTV͵=4^'6Mg .peʕ+vXDbZFZ/kgbN@�@�}ǛqcI � @7΋4}obɓ's-s@}C۶mM 5uY7>4=^:OqtL,Q:@Ԯ]ۦNꪠ꼌oyI;0|+w!33/@ }t5~EA�@�@�@�@�@�@�@�"X� � @ (EO D+X]BQt!BjU_Aq-r̙3Dž(Oa /\ȑ4`dׯ{@Me>.(믿v"xb1bBzBeD,--\yĤ={FRG: zݺٳg*`0J]EmA3P/Z:u\K/dv=zX*Ul;kږE& RxG* XRHΕQE*dNA򈅢<Q4L Dk֭[OLX4z\żkn8N> LMMn_N;UAayj@5Ljߐz'7Uz… [B |֫�?p7Ot7E~-^⴯~CC /؅xGEӹA LԾOC?+4Q(1A LǿRo10}qt>T<Mi~L�F}/^nG%x~?OSP#*Gm={϶¢V1ßF]S*Q<Hխ[ {9w?Niwuɽu!>NSLqS0xN Vp兮{Z~?.zVQxx'ߍxCǦy猘@�@� ך޳ @�@�8xp{GnMu<Z%uH}t޽Mo[{uծz7nX}n Q:\_Ι3sJrp#2Lyw6Z02X � � � � � � �X) @�@�@ 5kf۶m{!(0EJ* NхrH QP̄ \SO=e?_ލ?~Ly/ş_9'Z]Ġ.LPJ]J$7n ѺEN*zӺ0?QOp W~cR&x\a&M2e$:3VPV$Si˖-zb+W=BK{mܸі,Ybr[Ǝ^c$BWKۆ.ȵW1#G#6}\#7BWA} .XCA%Gp&U0*$PEAo*Q˖-s/?N< S0M =}Shd`f>9s}嵎o)qɦcp@$uš^z vWXuABCC[1?ϪSE;Ͻ޽{}駁K3Or::tΝ; {Cf#G4/mZnڴ)|*+]8L#jyO>݅0{РAVRpEL>]EOU0d(>@;c{Q"]^={23$Y뚑]/Օ\Ҍ\<B�@�@  4_Tσ @�@�xh}\~@w$vH!SNz+ۇ}>G\%^ w̑# w+i<ǽ 㼣X4^<y]W=&C Թ~C7RnD @xDØ!c! � � � � � � � 'Ɇd5@�@�R&мysS(7| 3anݺ5\ck׮; u$ƒTv庥Jr6-[4]PF ??(!~pE ,0rJ[z Il~҅ ۷ow3_ws'QC~m~2Ӆ(WӦM~ǰ ;q듞ˈz TBbmR@Z (~KYx^6 k7"  Kb)Y~8pD{?yajBQEO<10w@*TṕzK @K?OGÑ_^Ӥx2/X}wVn]ӱ̙3d~]r%Vtiw5ܪ.N TQ(e/ܹs{q%R3cBX.Zqu;Mi_p`aUV ד*vEXEaߡ=z}g z_'NtdyKz|3깂 oN2U� � @D]y߽G4:#!� �YF$sOqi9Hwo~a١n̥it Q/s wLǏwXyWI3Z@ cƘy?~L� � � � � � � �YO ȬYc@�@�O@A* iQm@]ЖN:f̘a]tI RQ.&ڵ}G.ꫯܹs'9}jϟ.Ph͚5vn &]$_jopSOZ(eÆ .+xzϨ((+3<ӭ^j6 }:S]mݺ6n;NeM۔ #mSYd'Ӷ6ҶJ_نk Gj\ /VOԦi}jժ#<b+W}ٵ^kjo9Sݳy[?9S`<3n:uRb3+lɒ% }w; @z! cA;֭[gڵKW3'LE <<]qΝ]@um\lذa)ZF:U`z\dZ;V_yСn=yd۴i V>OEI;?bLⶃ\7p(RE{TR<7<ߌz]or̨%@�@�_@I2 <~J� �q&={F6;G>^޽{M7IsLH5ʆnW]u?lRFqL:p嗻c{~+-~� |ySoxFD�@�@�@�@�@�@�@��A@�@�s=gk׮뮻D+č7h {6~ҥ.�g֬YcǎD'<)v!m۶bŊi.8Htp|76x`erʹz*) bE%9t Dt_-&\m' &_`˗/0<xIK7m';o<.Q\-IjFQHk͛6>HY@Z4Zڅ6}?6)mm(< Q,T1W8 , Ŕʔ)c]tQ-~ѱL9sK/d~]={=`۷{ࢋ-{ nlٲVxq۹sԎjDn*VУe_]Z.$\xm97ﭷrr{-E *|5lЅQ0&Md>{{Gu!I-'д:޹;p'5s=v'ڠA\`eR*(2\Qإ9轩 |ywQ\<NH4zr7|rR2̿x/ 4|f/% ^ ~WT~h5I^χ9 � � #aj,@�@ )~nxJw ?Λ:}^Aa=Ҿ}{wBߥ+8SNֻwo7pS߿*U^pu 3[>@ 2'4kԼpg,@�@�@�@�@�@�@�@ җ� � 3g3GFcƌqUPcSõjղ"Eݻk]AO'N{φj-rOSNe˖IMޥ@"\V`A0Ԯ];{n/C%oݍ۳gOTG.hOHlڴɍu$֯_]ذawBS Ǐ+V&$mqҢGt˓ޯfmj*;hѢGZi[kaܸq6|p7iLcfoٲa/پ}{I.k쫯rJ#G4Zh`hzϚ&mJ,+L]bO@o S8YZH-3xۅ[?0}wӧBtծ>_Zmm%W?Ѕ]m6/Kl:ׅٳgwm?c=]l.kz)˛7V{Y+�[B3fcN8wwZL|nXR]Z5kժU8p�cD'8:ӱ_kZG-n{խGBUm>l+|/N61DxTaw۞\wN97EM:9sɭGz)dQiQve%JHvV Pձwh&["}K@:iܸ tTTOJHK_LlDpVuTBF>?կ3`R@�@�2A L@g � yqAE/єw|jZ܏-c=묳L7ҹ3<ӝ*0}OP{ZݬI[`H.27υknsw$H0s^ @lhn9]fL@�@�@�@�@�@�@�@  !� �$-PjU;w)F?W`*O= :}> [~. F1W^y[mۚ. eTx? ӧWo;EDI(?v k۷ zNr/,k6h ۼyn]QbEWի[<yF`F C-/O[*pĈ6k,^)L@k׮.G|r;Ss#{68i']vm97H)GDbi]p'*4>pn%KtOF\*ҥK"c_uWH̙>_LX~z<x^ykٲ3~ QHC՛@z ϟô\Fr킂_uANUOS GRmrB]lWfM;l…ֹsg6AOQZ+sO#G֠A֨}B}/i}M~Wq?lXR]]쨢jki|Mi$.qѮMw#x|} tlzZ?3菂 u\9;?}-I;:Pe*U\tFL+uHn B0/[]}w17!k׮,8 zNE?0t:kÇދwOe grx]x\paQ]QѴ򖍎 'L[t,ԦMwկ_?7?MrpVu}f �^zcbOymU*gd � �d�Ab@�@ &tK/Ժw΃;yٗ_~n=ߡbErH:p~Ǡu$}y`83MT?^7R!]q{_f/eNztI34-_y4w1,� � � � � � � �'ͻ`]+'k� �dU7 >o!T T5j5i$*Vz߾}.iӦM.hDz-X7n\x{w]y*IA=AlذN>dr(). qbU 헒mI<E +W_<?fZ³-r:fSw)2!tmɒ%6|p֚KbˠDS}lٲ$CSBJ}_k]`gtۡ}:u\oDQXB&P>+[oMt@\W-7˗/QcE/_>vPBAZܹs'8F ] T0prI>nP^8t͚5n-+O8\otҦv$JqxrH_m.1;FKnyI{Z}#Y˚ N7?޹1= � �'{?5˒@�"gz"R`y?X޾}}\-=ߡ戫Wʕ+W;ס߱꼆%uӟ䊾^\7wՅ ?#1cMhsW]eV{� � � � � � � � 3*A@�@�lx֭[7쬳β-Zvej_l$롐БC?y^<fΜ˳J*nj f҅ *[l:$;e]x)!\P~|e+#G]vrׂ 3gLr M΢̘1z!={]wu6Ż0P4 uM܅r-ϦJE ENm=zt@Ih[Z΅80x\B)jۄ7*dO))-&M>}Xjlڴi$7ԶM$\ xԔH/# uر1rÂIxC8O<HMIj=B秐7xÖ.]BCGZa X?JNnHCզUT)Q[^RVd+#(LJf� � =-( fq � @ /^#*'=gb xbn:%t:IyJbHgR$fWM � � � � � � � @@ u)y� � @| O<q.XK..ЦݫJ*U+(7k;<QFȰ!]1dȐ$룁5Jv!m.�9x`UL,Zni</_~e{][Ϟ=W_2eʤ %a֩S'y7'?QI;}OrmW;U{']0uT/K)͛]1n8[n]y) \j)(޽{ۣ>jŋTU]@Ʌp{%tZr!gy5i.Kׯ_> 4hZlg!Juh7onʕ ke{o  � �1' H@z@@�@� {nGӪUWex� 螋gmMnF@�@�@�@�@�@�@�@ lGɈӵѱ&OdlA�@�)StvG_ݻw~VXam۶K/."+T >#߿)INݺuQFE]Xe&d"6 zWi+kĉ'X͚5O>.Эަĭ@?GuPڣG*S#Gtӧ;n9rw|dW_}e |뭷\֭['Na6mJЏ @ Lv\rIyY"f?n^Y0 � �&ylÆL F�Z VϏ! zGZ( Fp:ODx?U֯qK=f'lf}) � � � � � � � @rj*&B�@�@ (o߾xb{W\`_omڴ /.SRFVZٷ~`EnBtMoLƍ߷{>s+V }^zZ7@AlϞ=ֳgO۱c 0 t~#^7O<D۾} Խ[<v W4… ]ٟ~ɚ4ibwQ˞=1 �YI`\{ͼ( � �ĜwT1Wm*� �@Gq}23sHB͊5fI @�@�@�@�@�@�@�@  b0 � �xo~FB"O;4k׮{y晖7o^tjt[81&7nU۷o}W6c XtUX.b:t~å^d=]Rn6[|;6f/ުP RJ6f˕+8p:t{a̼sNS8El_֭[|v%XݭALO@ + |YfUde@�@ V-G@�@�@ yd@�@�@�@�@�@�@�@ Loa� � wٳg38=Ьӧ? |kڴuYֲeKk޼p q !Uc~}6k,;w>|Zh=\UVVacT[ojժ_n ,p 9ĉnpٲe_-Ll.]ڶlFf͚m۶JL ٻ]x! � �Ħ�Aݨ5 � �įwP[ڬG]G @�@�@�@�@�@�@�2F Ȍqf) � �q,7= d ??|ASS:u\ B!Tre?YX5Bȑ#?ۜ9s\ -[f_~}kӦ :<KDlɒ%.дQFֿ뮻3Nwa2V;%zDRrmwq [)S&sJc<� � �1*@dn8� � �q+Kfym) �{_eyJB@{ "@(V؊EpSqUojuԁ: h7ȞB"I {szH z<'r � � � � � � i yZ|\� � @V oINNvr~ ;vW|ymVծ];[묳RtttB�"Z/)hѢEZ`ϟ~AWBB9WO? t}Mvښ>}^yr[>*Of[~{W3ϨnݺO駟 bccuȑ;p@x w= � �A BN1F@�@�Ti8#a@�@�@�@�@�@�@� [ }@�@�=zj4b ͛7Osմi/СCW-ԲeKW7oMrm( ]viٲe㏲dTRءC 0@lҤ Aq#h3(,;W\|PדO>GyD#2w Ǐ}�q-]T_z)/k|=3gPqާvءB!3!� |teR 7$u@�@� FBh @�@�c>%5ׄ$ � � � � � � ��},2j:B�@�@@.HYf:h Gb!PpB-ZO>Dwv+V!-iO_Sbbb`E�\ӵi&Z_/_.{qWUTɅ>wyզMX\TIX8f=ztUW_Æ W_H\SSS:Ϻ獹{kyFYӭ[7W_z%Pȕ+Wze%d2 h  @V//8q6 � �$/Rٲ4"Ƃ� � �DJTJ0s@�@�@�@�@�@�@�(8 Β@�@�8% yjѢ7p]viҥ.[̅IM0AJɒ%uYgڠA];oT.qݺu k׮U;nrjܸS]8>|~iz뭺{4p@r-}u"71…g+tnki۶Z5qD7Ns?!�HaL/ E@�@� 2t#G�@�@�طO<Y5*l@�@�@�@�@�@�@�@,>{zF�@�@PK,X~gYԪU\ݚ5k4c G)))ɝիnݺYjZe˖ luRSΛ7o׍7*n۶Mn쉉pnQF.B A9?@( Xرcϻ9^xo^W]u >;TydA~ϟ:uא!CTRӢ_nW}D@ _y#  � �!+@d:� � �a&GRlH @�@�@�@�@�@�@�( F@�@�(: ԩ{ݽ{֯_ 6dsqAz_R|y(F֨QÅGںZULLV((tՂ֭[ݶ/q.K*^4פIKsN7t+ pB{=.믿￯zms9ݻ.bu!쾆سk޼y:u>s͝;Wgq.rgpEyac6VbE 0 �Yf֭͒>~@�@�5 LHQ3^@�@�@  {ˌ@�@�@�@�@�@�@�(. K~@�@�( ڱcZ?vv!'Y= [jMZOUZUUT/}d_&iT]$$''pG x^wܩ;vȷܳg222LKv@=zڵkjZTreEEEaWFtW_}U_~>c9R>,p؎wU{Zjt>{?r/^, T>}jӞW6|2p: #FHImڄ4 � �N 5%^ � � @q x? {=G�@�@�@�@�@�@�@�p 2&sA�@�@gaV۷os۷og!~۶mӢE\ȟ=z4K;%Kԙg38e \(+WN*SL(*))Ipagx?gY޽{}y,.Q P q@і-[EmZj.�^3] Bի6+Vhʔ):uy ׶mۺ-ZiӦK._%K? H]:ur�٤IнY�[U'0Y� � 9ezL@�@�z R޽~ @�@�@�@�@�@�@�BH Y @�@�@>͛7?awǎs_yoՂ!-W}!k֬$hA[9YBm>jՂ"m;>>ո,K Z lá:tHV-̷fY> vav/,Wm;===G& ϳ>iV+V( ~j@JA�DwuŪU4{l͙3G3f믿Y&SV-5nXuQڵ]}5kt{׈)l`[em޼Y?6mʕ+>þ-4yС.�QF<Np- Pcd~kcC�@�@,`PC�@�@�NQ~O: @�@�@�@�@�@�@�A P؅� � �'?_hd¸,A /ܾ}{�C 3CGk.!K,X .Q --|,ڼs6 <˭ܳW#G\=|ٶ/�22hZf*UԠA=ӂ8˕+~,@ iAVoF7 mܸQ˖-suڰa F ޞI.kՂ}m[ZbJӖ?F|;b~n` OvM͚5snݺv @ xߎkɇ1 � �?*#� � �E+ҿU � � � � � � ��A! � �A%`gy10 P@H --@̪/<1p}`졍\f501-/LgN߅ibVC%m8ipJߺ/,}tYmۂ,ѷ( @ ~^z s׮]ڶmۗZ=m݊gZhqRR=w_F^ZN+W>Ov �I/c>@�@ @�@�@ 8y?#a � � � � � � � >$Ͻd& � �D&&&Z�?(j%}i5jT#O@ ,_9 ?/f� ?=͛ok � ��Az7 � �ĉE٤psA�@�@�@�@�@�@�@�`~7%@�@�@T3䇽OU@��q?zA�(zs-W@�@�(  C6@�@�@� I_|!]vYޯL@�@�@�@�@�@�@�@ AU@�@�@�2w&$p] �A#пP{/h@@� XǤsΑv-i@�@�b @�@�U`tnַ/$ � � � � � � � @ Y𦴈� � �$,E{*S&&T@�(WNJi<CF�8wI.=IO@�@�BF %E*YR*Q"d@@�@�@�4IjJQ#d@�@�@�@�@�@�@�@ H 0@�@�@ 4e?F�"I`iiѢH5sE�"Cࡇ.]/2K@�@�8x_BwY"� � @ L,c\ � � � � � � � Ad � � PRbb@�(йtҨQy@�BB`$i 'Cb @�@�< Xd||OD@�@�@�XFZVի�)@�@�@�@�@�@�@�@ @ � V@�@�@� $%I @�K``w"�]wIW\!w^AL[ � �@jW` � � @$ |TԩS$Ξ9#� � � � � � � @QY� � �a+,%& vJ0!Ƅ@�?-[瞋3i@�@�0HI|L@�@�R��@�IDAT.H*Q"HȰ@�@�@�@�@�@�@�@  [@�@�@8}#�GjUwoi\Ź �)!mzl_*ORg � �.*Ņ,? � � zҌR7vF� � � � � � � �#@d+F� � �A(,%& @CJӧKz @�H`,U+:o,g @�@�pHIe6@�@�y&tH@�@�@�@�@�@�@�@  {ƈ@�@�@  CA�8@ϞRj'=@�@{='_3iHt $C@�@�@RSBh&@�@�@�N(0mTԸ O  � � � � � � � pZA#� � @ $'K@� ~[JO3Z@ 222Cm�9|xf (|ԥK0_@�@�HHI#i@�@�3?@�@�@�@�@�@�@� 2/C�@�@�BHJ G�(pۥɓ iD�(@Y{נAΘ!>,]w� � @8 Jqq83� � �2モ:w122@�@�@�@�@�@�@� >2 @�@�(&d)1:[@�Sh@U9B@�"C)66kGGJ))RY� � @8 IKӌ  � � I@^ce � � � � � � � Ac � � PIIRBB1@�NI`Pϥ;Nr.B�(d #G(==s!P@�@�7 2@�@�o8Cj4F@�@�@�@�@�@�@�@  @�@�@ ,�@�Sg1�!�Y޽'⭷?q � �&@d1Ƌ� � � 0gԩa � � � � � � � Aal � � GJ7!�'(]Z:i!@�bC)66K_>8� � @ wq#� � @( |Աc(π#� � � � � � � @*wq"� � @ $'gl٠B�ȣ!̙y@�D #Cz}ȑܻCZJ)**8� � @ wq#� � @ %m(sN΀q#� � � � � � � @( Jw"� � @P Kp `@�| n-k'8@f͒=%rwߕ&Mj< � � .A˝d � � *sf) C1N@�@�@�@�@�@�@�B[ о@�@�Q bħk@�ƍ(Fi @&2/\ZVXC�@�@ \ ;˼@�@�@ X,ח*T2.@�@�@�@�@�@�@�' n2@�@�(R_dBBvKg �,p ^7Ls �$!3ȑK*W>LbSj@�@�9ÇRBn @�@�YE֭Cv @�@�@�@�@�@�@�BL a @�@�G 99s,eϘ  @ʕR92r @ ̚%+EEe}R>-"� � I%K � � ^٦Mx͉ � � � � � � � @ ޡ12@�@�@ ~%s|A}bt @^ t=[ A�NرcJMMUJJJ!/jZZ[n9rDV>얾m2==]Ռ Y(/1%J(&&&+%4ߺoiJ.w9mJR5|utX6R\\RJM'@�@�Av^|[ t� � �)q#_7I#� � � � � � � PLA<"� � @ XqqCV2@@;K JFI/  p矵v̶m/7V<xܺ�H zkF S};{Pc`x9h8QPL=zԿۗ=2p;3@Yt睩eiVzeʔq JLḺ/_^jn@�@�Eu7}q � � �-tiZ y2;@�@�@�@�@�@�@� ^0@�@�1 2e( �a"0d3 Q I1 8m/pv޽{o>2pY装?ZT,0{0+WjԨq\ǻC[*Uʅ>ҷnሡ\ll9oաC7L @Lv?/m_NavnqZ{93P g3<ӿu_T|B4) � �Ù-zߦR@�@�@�@` yO#ժU � � � � � � � D^ � � ) $'g�)^e �A&0p4|4aԿ @ Xر#ǺsN  Z,_|UiӦYBjA�A^TEYY}u,҂"-[/s۶mZd'KTT YreUREzzn_LLL#� � /d\O� � � @ Xd& M!� � � � � � � �' $@F�@�@�r es;~@�PrԻ4r$Av/^Z͛O?X-/$&&>_߹B,/{=3s ^NŊ]-Dr9V :w\C# X5\pZjZvmYc#� �+J � � ˗!!� � � � � � � Aer � � PA.m#�#0tԷnԠA^@)))Z~6l7nt6mR`cҥUfMW-`uֲZK;qEW 9^۷owA۶mS`4qDرC9 dݺu]WEkA�@�q#G2'@NxH� � �!#zԹs "� � � � � � � @7) � � @XdBBM �#гT4z">5khʕnik׮uՂ|B nݺu ʫU+Wb(_6i$x ?޼yhjV,X NKKsz)@ yYgaÆnygq5k?@�@�- C~1Z@�@�mG~]d � � � � � � ��Aw1 � �@rTl a �@L4hcIMA�HMM˵tRW- . Y kԨz +11G;֩S՜<vvءuֹj>{l3Fw' ٴiS5oU{DGG4@�@�XY @�@�@ \ߔ:@�@�@�@�@�@�@�(2~\Ȩ@�@�M_ {|@�<Xߤɓ>}0A�ؼy-Z %K~zeddtnY]Æ ev"YQU\pŮ]zjZ+V護r"![l֭[M6jժAI@�.G3S@�@�@� Y/+W,dhG�@�@�@�@�@�@�@�,Af`@�@�ȻAV9@ 44vF$24 F۷k޼y;w?ݫhh!t RլY3>Ug( ʕ+jȔ\R˖-.^X&MΝ;ek߾9W۶mKj@�(4#G2&Јi@�@� l(%$Hg  � � � � � � � PA:1 � � @ x**S&\gǼ@�:T8PڱCZ5-='HOO׏?oVfw}͛7+K+vک_~jӦێ?YG�;Z ,vҢE`W_~em>-ZwՂ%kժx) � �E(@db � �D֭R�� � � � � � � ��AE Nw � � >>w �Y.\1cz-"] ##C/ִi\oڵkSN6l=\nZJt.@ T\Y_|ݻWsٳ];v[n| G@�(t_d ~Э�@�@� � � � � � � � ��?.^� � �a!@dXF&�(PtuAΈؽ{LI&iԩи&Ms1btիG F \<LU.YD3fp^9иqc˝g%K @�@�N ==sHAݭa@ � � AMeJ � � � � � � ��A!p" � �A "̙N=Z@ 6nܨk„ 3g*U=z[VZ5Ԧx@ jժwy;!-ꫯ^"GO{Vٲe:!� �E}kFA�@�@�(d;x!wB � � � � � � � @6~\< � � @^,Ly �&кԮ4jT"pwK/:^zzwԽ{w}ھ}ƎS7JBQ **J-[Խ ۧw}WH @ȉ'ȑ#8Eƌ� �/2&&ƀ@�@�@�سGX1ń@�@�@�@�@�@�@�@  @�@�@ xRR ޻@�:T7N:p`ڣQرc/NիWo׮]ŋSeAp@Էo_9҅N<lE 2=G uց� � pA"� � � 3E� � � � � � � ��A  � � ii}LȜ?F�"Ek3g{2cIGћo&M+PjkҥzՠAH` pڵFB!_uiԨo[2@�@ @�@�@RS%; � � � � � � � �E*@dr � �3!2\(@�r(WNJiȜPpgu|Iжmkm۶8%ƌ�A"~iʔ)Zjԩ=z{.h6H0@�@� 2$nD�@�@�0ITa  � � � � � � � RAb � � ,))#!2X@� O`iiѢZ޽{F>}g-cԭ[7;Wqj ̙3G۷_=Zvᛚbe^:u & _~EcǎW_ P\pyiF=kjƌƍi9 O[ r|޼yz3ڂ]s;/Nj yg +hӦMjѢtkϞ=3#� �!ea � � @ xJٲ:Bƅ� � � � � � � �*@dY� � �*p`fd&*3#�A!йtҨQ?}믿/4e[',Ya.SBSvU\r֬YbH j觟~o7****OcKJJҡC4yd߿DX½w}k_j <'}Y??6;w]wBA^+uI .plْbݮT^x-[̽[jiӦ@�_6|j Sb � � @P Ƞ= @�@�@�@�@�@�@� 2o/C�@�@�sYX´�һJii7. }޽]5^pPKhb(?'k6sa]}1bf̘'|RqqqE::;׆ƍ+?իW_˅^> 8P—W󟳜Ӿ,'0+۶mmݦs=7dzwء|PuՋ/#m0 ^CszBIq @� N0@�@�w 3?@�@�@�@�@�@�@�WOnad � �  $CC�(0/;M҄ ֤z!}:KvO[-/_^'?3R.\9scǎA9F? \=%J_rڗ̦MԿP5Ӿ:dGp6mkժY|~gtMٳgkaÆsc?~|0 � �A%[(  � � @! f6Q+DdF�@�@�@�@�@�@�@�dh@�@�@ PYL^@�UjUwoiHyhy_ʕ+]%\]l!O?[2dj֬'x"K_|}m߾]_ ?{nZhdA־Gʮ5j^xZtڵk˗sZnAÇݾ .sM>]cfcƌqA}]}G͛7{#5w\-[Vuѳ>ڲ?>Wwܩmۺʕ+?J;V'NԂ r +^SIIIO5n8=9}嗪^ylw}?[u饗f`szիFUVo7vӗ콴aYߞ={day]vڥzKSNU׿UUTѺutEɎx۶md ${Qn]ڸqx(ȹ 6M>i;pc~߯?^p9|g9O=P+0+RSO=垻vwީ;/g,&Mrͷh"K7͚5soժUcq} Ur`cA�@�B Ƞ @�@�"@UWr[0{� � � � � � � �)]7 � �  PF�ȯС慤^{M]tqhW\s*we]Fu ۷oF{GKvvhV,,SN.%wء={jkw~fA[8eYXٳ~;ǂ-[v v{CJNN]{c 뮻Nњ<yz8 ʛnɅ=3ر,R8z7I&E)k^OZ0=zh.^g +~ k޼ W~߻-p? V=}CpB:o޼|DeW_}[Aݺus<XP=snPÆ ۷e޷؟g=裊s?v9;֟=[yWX-/֌3ܽK{k}.tXZ'+=sr㏟~ɝ]Z,WYM6ewuʗ//IA�@�8^W"ȉ?s � � �$@dl� � � � � � � @ d7 � � @hXs`x% xY_smpi!_,-(s7n~m,xBY믿,r6l05r `;+Çww}ׅPچ_^Hf!hłѬX;tffvr,т,0RJ3fڶmoƅپn,h"7f ;]PέZJRtIIIZl?Etԋ/s=5l װZXiFF =-Y HMOOwM_*TМ9s;'t̚5˵?N>k_j}Q޽]}ݧļ{7kڴi@3[lڶ0M{NXf}ϻl?,l-ڷȂ,hF up[{3uy{au0\Μ93_ñy lݺu.̵,go߶x`[}}b  � Ao@�@�@0, UD�@�@�@�@�@�@�@�D$A�@�@�**g @x H l\'|4pK.ĭN0A7V,t-::l݊YHǻ�G qԠA-[kV^04kγ;xpG_>dxV,o߾*W*Uʿn+kזY䭷B${=wο/']gZ?>2eʸSC|>jŶ-ԂK{j7ol hZj'4//C_߉'."+vZ`aVZ猍XrG>}H>sB X |Vs _^xk֬oܸ4ٽpCJn܂j?vʗ/vK`9r۬QFn@�@�BP ۷z!8� +q% �!1W|F� � � � � � � �$@dN*C�@�@�N"baB'9 �a'0x}4yrS[v; ryիWv;rX)Qka_ky͟?Յ cKvbtz5&Mr[oS_{5x]u |=zV#FaÆ8q;mժUJLLƹb }ݗ) QCf4eʔB`>k*ԩNN)YlC9rzۥ#'X0{Z|;~YN5 _b &q/[wo?m 봠J׆cǎnwo|oLG1Zx᝾m_iiB+M;/X@�@�@�"LO'?Ft@�@�@�@�@�@�@�@�@�@,"hA�@�@�HM%2(A�&РԵ4jTWT5kVjԨᶫTߟ@5J||ۜ7o^nܹwz뭲P7xCO?qp Pg}VJR_e;T瞫ŋJJJ]Ѷ-2{ٰaC]l<qs9k*q[_FF "s>#]r%:t|M5n8KOkAm�voOk<yqNϨef!U*T }ܲe6mڔٜYNÍ&MY_>n-6 /[@�@�@�'( ,;@ � � � � � � � � �D�A{9 � �Aup) @( xs;r}ǎ݁3gf9ansK SGf9D $ʲejܸqZpT ó0ǟ~ɿ/ ʫSy^r;S^,qذa\}]/s OԺuk?'}d0`.2]zڼysvNʭݻ[Zj}Aӂ,>l /2<{&{8/СCa0Uvmh"ۑS,Y5..{zOZ9p]nsc/c U r 6&Lz}%@�@�@�K &&g / � � � � � � � � �+@d{f� � �!"yY3@�r)!A3&[(o~_^t+UbEnW]P(=Z˗/mٲŝoK B;]].]?:^xᅪW:tݽ{[h|ͮ ff͚ .Pbb()) 04L_NƏ/Xnv_?k/0{i})k*O?mZoƍkȐ!n/o裏sĉPM6sy#/C{D}x.Lu֬YvZ;3gRo6{9֚19۶msvoi3m'+&MZplNIӦM/6-vΝ_Ys bi@ʗ_~YiiiI+Wԟ'UP;޽{<N:yxk^{M??^"3ݓ@<w뉾nq[Ȧ{o_GNꞻeʔoWErk۾W$  � � �  @�@�@�@�@�@�@�@�@�@,laG�@�@�HMrjL @$KK]'/1-k_AD 9s?쪫rfv-[={GqZ7͘1ÅN d3 ; _{W͛7c= _v< ^r-n;0<Ȯ 뼉/Xwxwtgjʔ).4[oFXZȢc }衇jY58L{t@*UJӧOWll;V*Uo:vXխ[׽z< ô@3 k9�җ ~n.<[v˶mۺ9Iٺu%O_}U]馛feXbg۷oWӦMղeK׎YkN|CVZg-0q[ ܸq,{q>u]bٞڷZXPEw ?o-`B.?=+Ujժ-0gnN9t. KP+e ,֭[O>{-+Y_nwE'Ov � � @ dNU  � � � � � � � � � PQǼRP=zv EA�@�(n/ #P0^n #y9]@8~Gv;-ڴ(u,llҥ]իw܉38c'adl֠AY\~]bEeGuʕm'| : ygG rmI)~ ]Z`8,B,Bujˑ#GdԶⲟZ ۧ> b۶mV V\wؖvO6mڤ:u͟?_:tpO=vء:~a ޞ=^+l O^K*TpK{H yaܹSjErݻO_wHA' � @ K!x2o׮MF~BDWìU+7oC%߿BN1N@�@�@�@�@�@�@�ODM!� � �/*/P@�hZjN5ATץK\'q:AXe˖Uk)}(Q…9 },Y;Br*۱g_{Qދ/qs=<x ",QK^^Svg ׵ռ `ٳIO{u׺N}z,!v>V_tu�ۜ:qX ,y5{~K[6os#ay}=4S9q0@=}[oSN^x u1)@�@�@�b(]:k?  � � � � � � � � � PylQ@�@�@�qF !"�С^ҥKbŊB3nذiXAqn& 8PcƌqAmÇWu7M6=߻w۷u,Aǝx;yo|-o {VƍO\\1ޗW^BZZZNM<˵#ʑ#G駟7W_}K.D_~?".@�@�@�ȿVNOo+@�@�@�@�@�@�@�@�@�@�y #� � �9 H5jt} �"pA'zk-\oΜ9BpJ;L/=R%KtCTS l{Wt9QF{_s5jРA3==]C 8lwy ,聕*UJW^yeA7{ZmVV|,oO?%3MmZ\'##C3g{+**J7p{3N � � �/~ W { @�@�@�@�@�@�@�@�@�5 C1^@�@� T)..( @�I\9yqȑA˗/w!׽{b" mѣwvancǎժU+vڹpW^pJiߧ};X@׮]5{,}/_>6+@?S}gJJJR^4j( 33@�@�@�S@�@�@�@�@�@�@�@�@�(J R@�@�@ l`a3&� pCH]HIhխ[Wݺu;ָ TNW7nܨǻOȎY`_UV-.X$9 7[^p1-YDSNuoQ%ԳgOKݻʖ-c � � �+oiik@�@�@�@�@�@�@�@�@�@x,wzE�@�@�HI| 0|@�Y:l7xayc?AQQQ""<l:l0Wwޭ)ShҤIw^5i BիW38- 8c ͜9U{4nXz%K<~@�@�@�ⷃ{$� � � � � � � � � �&@dq� � �"*>V  @ ,=G y0pN$PR%]Z@ŋ5m4Wo%''vԩjJJ:QC� p׹sjٮzRR{_wM=lYF 1@�@�@�@`ʔbb=`ڣ@�@�@�@�@�@�@�@�@�@ AU@�@�@��)..` �+0p?MVqY #F ::ZmڴquذaJOO׏?Yfouq7oVllhvک}|ێ'M;b^+L48vڥE~`mܸ Q-tkrlK x � � �  ~Iϒ!� � � � � � � � � @ lw � � @H7A"�E PteohϞ7@ ,< ywn߾]ܹs]㏵w^YdÆ ժU+lE6kLwǂovHW\e˖iɒ%Zx;wTTT{YHo;tB[ j @�@�@�N] NzD�@�@5Cv��@�IDAT�@�@�@�@�@�@�@�NE SQ@�@�x ,]:�@�U`o ZNj�VOcZh.\o֯_ jܸ6mꖍ5U $'vڥիWkժUXB˗/׆ t1ũI&.w.Xsn � � �D999&t@�@�@�@�@�@�@�@�@�@,[�@�@�@  x@�Sr4zm#jՒK/?TXtRY]ry`}5k@^ʪճ:-ׯO_p0;vxa\]v oj7x5k-Z+L@�@�@�8-))鴚b@�@�@�@�@�@�@�@�@�@ A曌 @�@�@ 2Jt �  ~[z1ɶ) pr8k:$ `5kָUV?׶mVPAuRԩ'-tRJsYA X=[jͮnڴI7nWN/!W Dԩ >ۅ?kS) � � � ?rw g#� � � � � � � � � �+@ r= � �D�Aw˙0 'M<Y'Op"PT)5k짤hڰaC:m4Y`k֬!kԨիWV* Pzܾ} 0G 2-[;v(##u-{MZ>o-mjڵ?{GY I�& W�"("#U<_EVDEr�"J�J@JJ*)N.l뚝{f<S 6J @� ~V\1y;~#'@� @� @� @� @�G@dk� @�V,P)/D]'@@n.o~# xUI^G2dH5/lο*`n^Jވ#RE]{YﭺUVY%+\ӊd֧OSfܸqƎXW_}LRUΛrP2mfG?ZW]t @� @J7};Z @� @� @� @� @�4Pg @�,@]dM @] ~xra&׮nZ/6ڨש'V/r}h_]_s=Aeۆ )+lw޳Me^zUSɆ9[y7P Z7?>)믿^Muy:ݡCxZj@ji5֨:um_ @� @�{ @� @� @� @� @�K@d:FK� @@#lDU @ |ɱ&_|kmtE # A;>r`G>cU` ,ӧOg-\zYM%|.ʴ˦G6_\s}eY|ynҽNp&Mɵ=eʔXL4)s'L225\džSw^8κ0gȐ!~'%n٭yyZF� @�Z@A' @� @� @� @� V<Vq @�  k91 MǖO}*AB �Ƶ^u3gά K(`ȆA ?ׅm~x<љ1cz٥z8 =_pSB K8d׮]ӥKjjnYNR-9&١CNe|f̘Q*aM%رロS릺ee*u,J),!e*! 5^zo߾ ܬ l8/ԅ?7� @�hwA7߸� @� @� @� @�h^Au @�Z@-*rbZe,aÒsI#iР&hq%Di5\hFJN8!yM:+0`t~%qҤI4q%4qr-.@pźņ ~ kWce , l8YDYsT%[-qLs~.%n^Q @� @�K*⊩"{% @� @� @� @� @�EhN"@� @@@]ܙz @С'/C`„{K<?&7ݔpe]^k  @� @ꬽǎ$%@� @� @� @� @�Omnk @�<y HOÓ+H|s~[XN@{dsΙlNO� @�hj W_mO� @� @� @� @�xO@{> @� @`L Eڥv zS P`ĈdCM3y_N:wn @� @�KK`Uf$rik� @� @� @� @�(  @�XLYz:uZmN�FW @ Xk%GlE2}zrウQ4ݭ&@� @�h"]VHA6j  @� @� @� @� @�y ' @�@ m!@�E`ذA@{(?yzɟ\tQ2|xY  @� @�-K`UA#7 @� @� @� @� @ l  @�hdA :QvvmtEBn%:49 _H|2  @� @�*\ܚ"@� @� @� @� @�j  @�XLٵbdsh|r%rM Br?v,\%1p @� @@X}䥗Ztu� @� @� @� @�hc 5 @�^`TAM K~;3}`ٗF@k4)wGINl# @� @@/3m @� @� @� @� @�% e!@� @ nZAGu�]`Ւ|$ofueԨ[JV_=9f Ј]~$W#6* @� @�&Wd᪘� @� @� @� @�@y.� @�+0eJҵ|W[A�fO*ᄂKwߞm3_hW?}w&nꪭt0M� @�h%WiӒM� @� @� @� @�@ǥۜ @� N @z(9Òf ,eYs? h%sZzB [k @� @ ̘1+ [? @� @� @� @� tA.g @� ІJdnmh@B�*puС_2ydY7lhҤ|&@L|ɠA-$^f' @� @}Z2f̜k|'@� @� @� @� @�4 ȦqU+ @�mXtچhh Dn<|ҡCj�)pU$|O$2W @� @�.I_ScK @� @� @� @� @\= @� .J vy �$0`@$:-xsA @Kxd]H.y䤓eiI @� @�+ХK /G� @� @� @� @�X<Aek @�A 0?o c- 0n\rf%'&wݕI߾-w@� @� Иk%1=E� @� @� @� @�,X@}%@� @\S KNK:tkU{ 2JYg%%srE=$l2W @� @�K. r @� @� @� @� @�, E% @�* ԥ  po}+ԧNvڴdƌ[B@ \w]2dHo&<TO?Եy{u @� @�X{6 @� @� @� @� @�, r> @� @`.ٵ\- @�8dmΝ^=y,!@y{,sd}| yӓemh� @� @` V KM @� @� @� @� @�W@d=FN� @(A]ϝF�N_{mҿa&;&^{-9Yc&ߞIy_!@� @�h?kf2~| @� @� @� @� @�' L� @@+:Ud+=tM�fXq䦛= ~#' o84(WJd @� @l) Ys͚I� @� @� @� @�hJ7e3&@� @@6Md9FB�'0p`ruI9y{}"@` \uUI'%<tԺz% @�-pWe,!@@ ά=lӵf @� @� @� @� @@0'@� @" Νqc @�;\|{ &MzO4$;p@ɓO&,\ӷ @� @�-еkҿ3-zG� @� @� @� @� %m8 @�KQwA.EnM @ L>=N~j8qb&OItDžͷv}+?R׌3yp*�:ukر\:גYft}=zd嗯j)x @[xH~dmSfA @� @Xwg߾"@� @� @� @� @�, Ѳ- @�jӦ%] @�"0~;6ƍ믿>oo8 3֭<t-}OPkѹ<6N:߰ȆҊD9eʔu5uzJ޽gV\qŬJM+rVYejVn$Pg͏~ɥ&L, @� @@80yM$@� @� @� @� @�ڀ 6p � @�+P ;SK]kXL3gV/bF_~9/RW^K�d YlXJxcVX!z6`pĞ={f嗟mZve }СCêg\Ǎ#ͶIɓ'9a„*߮[s^>%sPɮ]V%rVkQyؿy4Unj|~HjuN:) @� @�&|W[A� @� @� @� @�h4%F" @�ڋ l/8 h%p̘15jT<sռ| lXXBKcݴgUW0,!eZir-w-22TӒwީ!KfW_6~q2YWJf](k2:|۷:,%?f>>`2lXri]KT  @� @�ډ@ B/i'0  @� @� @� @� @@ l6z  @� ZMKtio._=O<D3Ϥ �I&Uܹs_,. HqJPfZkVX 9/ByW릕XkU@Ae<xpT: g!_jr'#F$o'@� @� z%3f$_Eg[ @� @� @� @� @A6 @�hӧ':a @ |Giȑ˸q~t֭ \{u] ,ZJ�nXMgzѣGg=XLnL2mWظ7dȐZ$s^oٛo&}vja'ps0b @� @�%&;&O>)r5@� @� @� @� @�,H@t#@� @<A",s}ψ#T3g̲.[mFg}dY{k֞Uڔ@ \kivml3f?'x"?xJ@?\xᅙ0aB:tPnftMg-L޽gǗ+y%:k?qrIgn @� @�M,н{暳 ) @� @� @� @� @�\#0| @�_`ڴ[ @"0G}4wyg*駟N }۷oO~2CTPMڸ@ ,C>׏;Fʃ>X?s93fLu 4([ouv)BḊJKͤW63<!@� @�hFٌ&@� @� @� @� @�F@d9J� @@c L.,C@(#F-ܒn-Çϛo={V|tPblY}5@V_/_zz;m]venU`zV{OL+9OZ C  @� @�Z@ A]#@� @� @� @� @�ڄ 6q � @�)P ;SK\[p1cn_*�?OV[m>C ~ [yJ[Me(%tȑUߞ:+_W +T{Ws۷}tԨH-įe* @� @�]Aw^  @� @� @� @� @� . @�,\AvlA�,kz(={̮O?=~yRV!Ќ%xtM6:ɓO>o97tS?~>}c4tf챦%w%9dOJ-s^[ZF� @� @qʯk;ر*4Nj!@� @� @� @� @�) rN  @� A �6+裏seeԨQYo>vmΝ62PZ>:ӦM]wݕk6^ziN9Z|!6ڨuc?O8#%O;:ǣ @� @�G` gA @� @� @� @� @ tl}]c @�4@ M5A:KM`9s馛fȐ!ӟ;,՞}'sgfvԎKs\.t99^rΗs\93d䤓Jyf\;Z"@� @�gWOVX!I!@� @� @� @� @�4&U1 @�mU` Am <#6lXV=zgv?#Gv6`6@(t99CU|95PrM(M+p6$ZHgSg$/ߴ� @� @nc\; @� @� @� @� @A6 @�h' Ɂ6LT஻{|5jT~f7޸v{dMs(B&ʵQqJ?cҳgrE%5n;j#@� @� m<nm; @� @� @� @� @ \|3{ @� fL:S,0|mOGBv%;<@nxܹsXrk\ (N;T]+QL`cP} _-:t7 @� @�%pǖ @� @� @� @� @�/ d6 @� @`3f'Jwyvl6t##G_^ b*N7@&ʵQ ˵RrkHY< NKL:9䡇ZzlM� @� @Kƍ55U%@� @� @� @� @�ڷ }� @�! }م�)#C jȶȾ"Pr]7*גpӓ_zV�g&_Z':-|[ @� @�XZ%G5� @� @� @� @�  } @�yAm v!p`w<u]Ÿ[ G_G>}{ڭ3g榛nM7ݴYǍ_Wٙ%EKfʵSr-kJ5פ<{lr3$fң� @� @@s zҧOjlh�ڣ@KVw v-{w"s @� @� @� @�F @� @} ]!@@8ӫп/8g}vu֪;?v ><_}OC(c-j)>9j|tVo[o&L"zYr kikK]஻vH>dMO,Yyٷ� @� @@KxcA-ڢ@ݽ2x?kF퍩<H|sY @� @� @� @�, %7T @�Ldkum /0rJ|mf\m mY>TԩSvo'uv1w\, eG^vʵTrm]tEo[ݸ>_I.?\~ymuE� @� ʋM~x @% ~/ķ~¯S-* @� @� @� @�#/1Q- @�3A.6" /TAz?!ycC9aũ)ym;>6wʵuQG1cO685*[-l"M� @� ZJ䣏&.�47}[3JKֻwٳ @� @� @� @� йP @�ڕ@oW6XZK_R檫W\gw}{䭷ʵ^[;묳.߲k䤓N&ZSms穧V[mYn{ կ~'|2Ofq~\s5)ӫ6,_WӫWjkҤIÇK.Yk;ty 80kƎ[^B /첌v.ʡ ӧOO>}r9Fr6(*̶͂41|g9p )c{s衇ڰ\/8o*[MKv~'g\xaO%C%@� @�]:zg֛}o @`QO<g=ATZB R ~3ΨXqg?Y|,9ê˾ӦMKٷܯO9rd6|<cUCg?ԩSe;CN8vm>;w}koK?1ua/b~{˖gyfUW{@� @� @� @�hm  @�x%}dvE�F(r/ԂٚWBw}w ꫫ`ºJcYW w}*<`Tv瞫D>!.z<@uGWJ]_}/{n8a„1z[,ҧTGzS~;;cxj,?Oґ _ <ꨣmg>5\z:R_jY , ;3m&rK^xʯlpE-q 7>֎?t޽z<V0kR#8:keԮ]S{/SS@o @� @�,P{ON-*y<Jc#@�8;WVy'?|G?Zݷ+_ʋ+Lv*\J+krTU{gOwu7f7NX6%_,ߟ%Rve)}#<2lٮB֕O V^~Y{u @� @� @� @�ڻ@>� @�V+ :'nF]mnz S w'gԩU~UA/on|O s~P0vmUa.]f֫Z*Ǭ {Rw3f;-ʏ| ,mL[^Y-j[?s?qzgذa҅ߪM6٤~u֩*JAf_~ӧlʗJyo?^Y041XQ #GVH , >nu5V35זIڹ5Zk2jT/'ݺ @� @@{XfYz2b$@�6fzhX}Νv)emews/|u/ ˂ƲOyAYy^_Vʷj~%T!K |US^WB(ˋK)`K)[O<DƎ[-+xEy+rb6۬ZWC?Q݋,c/m @� @� @� @�D� @� @` l6yײ馛k9>,C/{h<4LG}4s=7O?t^|6?uR`,Gicz-n*A]wݼދy睗}VuMnV8ea~ŭ;V_?]wU"̗54 2 -۔ϥJ˕W䨣|$yӓ=ȍ� @� @ ~#ۨ�T`Ҥ1<yr s=W]uUݢכxW rLGnڔ-\n|5֨>VW+uر w,/P:mڴzeay!޾^zoS6,kf}#<{饗V,=ֆuL� @� @� @�h 7n @� @] ׯ3׿}tP>G?є&M~ZՃIǏ[eU(;S@YYhZOֻ2=yg|e5lOՃP w 87\ϋⷸuί߾Z5nܸm1\X:w\09SVn9)KjYm6R!@� @� 0K@3�ޏiTņev>Sv/l~Xݾ'tRuܿQK-./˺ݻWu׵eYQ^8v[_x% /-/+ *\pA>jկ~AOSǺ#@� @� @� @�E-И @� @�8!3f4ȴiӪ.77tS-X,RZ*.M>='r 7[na].`Gy뭷RV<ss.SVK@)S,\Ey`lQ,ᡥ%-6X9G˃nZ{ oQk۔wO>dH.48\ @� @�,@ |W{ @@ر[5;s{^XY}W_G݇'Z?Z%䱼d׿u~Ng>K˙gnݺe-vrvmC=C9ZۖquZH� @� @� @�hc 5 @� @oW?RY~1W^A~8Cߞ7xczպ;W]uU{-nWO0zXio|ߜ+_~U4iR>UKY`=(6gd](a ,<UZXARkj$?o,K҇޷\[%4\km<Dj!ɖ[&K,ݖ]mat@� @� @`%#f$@�"Э[Zrw̶۷je~XgWw߰Z뮻n[n\q+aRC{fYgUG~9#򕯤E.p YeUr%ϯ=^s5߲c]X @� @� @� @�ڂ ȶp� @� a_W/GlRf:sK[o6({k^B/ <8Æ KϞ=]vY67dԩ#TAe7|ڶx >| _/+2__9s!'?IU ,eAmRJo>~ղ0XkQUQoy<UJ{)~xZ߁^z2 ,/bɓ&;cXp1,1XV7/=ztիbv6/8wyՃsVq3TT.>2$yv}wnh� @� @@3 T_d3M @U tz>eԨQKq 7O>=+/p+!\pA{{uֵkwqUε7'|ruO[guj/VƍWK,;vLZ;ߕ~;P݋=%u/k4yߗ-/+e^=ֹ� @� @� @� AÃn @� @@>|;or饗6 Dy?y>Wa_F ;T)!%�[nUb.]<HT^*!gA#?Y=HuW-NʃTRV={7Vaƣ: Ѽ ӷoEiOWu]J0g_oQSY߆nM6$�r7x\qclfU>[k]-/m)waQ7v9RE1}/~{JK)A(Z*T>6GW_MdRMjy~8Gz @� @�h_fĈVu&@�f(>OC{ケ; +T='>Q݇+ }Ѽkt?-/+/y;SRESOMy\ r[6v%hr[ PnGQ}_ve=jj7jSTu/|.Am]/Vc򗿜2c-* @� @� @� @�Iڃ3 wUF @�4@ok[''rJV=r',瞛 N 1я~XAK=yt=/Rv>}VG>򑴐��@�IDAT\UhĉӫWa6}y뭷Rʜ7Ƽ &@@ F:ujFuY'el=z,VWzR&;v=0AWo]=dv-ƲXhM)S_O~c9Zjjk٩|['U� @�I㯨OT/oh.h�O/NwHh)^ @gA믿#Gf5׬ιO ,V\q9W-;3gy&뮻n0jMVK +>^پA3:ƺǺ,pIh @� @� @� @e tn+ @� @�(ulI>OoL u]Kd)kFy}( !e9o|رkIO\"8p/l|Y7e]~Oq~~ŭMΫʼB ˺_~vikv[o~ݒfPYTK7ߜwܱz0!9Y!%3;I=6Yf_=  @� @�5-ZWEmmtC�M-Rwy4 bFYreСYsݹs%} 3UxeYoݢa @� @� @� @@[֏ @� @�#PF}ݳ>n6`t^1cdUViF{U{ao ۤQַkP{w<U˖q ]|ȟ*~CvԲ+kᯩ]ĉ''PT[(� @� @(A{oj/O _W\MA-Qe3x @� @� @� @M lS` @� @�'P9q9Bx-ӧOϰaq;l k{nݺ{E3-iifm2-c~v)=)~0#Fh| OOJGv'}4U%@� @�   @` ='>le-}_gz @� @� @� @�j$@� @�:�y7殻)Rε~s5RNӟ�w^Ѽc8mڴ\}/~o={lvhZ>g.$k;=:Nd' @� @�/V}5 @N`mP}ìYbs @� @� @� @�s tk @� @�Vܕ@ȇz( g>/'pBy&wݻwN hxx ˹^rk\ (Fk 93) KS9l_ @� @�mZ`-{mC48 @� @� @� @� @`) \#@� @�78~^z|[-ܒM6$e5 C ,@9˹]rs/ru-孩\}u2thrf%=8jMW @� @�-C`qo  @� @� @� @� @ l @� @�M& +c͈#2rᄍ⋳fω';#ӦMk>@Ss.r9˹]rs{n曬뮛z%?\rI2hP5b @� @�m^lS{P � @� @� @� @�XJ f @� @�]`6gg} ;=;sVZi|c/~<䓭}FʹYrs.r ~,v9˹ 7$[mO暩'F @� @�Z@ɐ!} @� @� @� @� ::n5 @� @@s :4e:3f̘PK_o}[9cje]vnCұw41komϘ1##Gswn+VX![:۷oX;I+{_J6߼UI  @� @�H-LEvM @� @� @� @� @�V( 4]&@� @�$7lذj*{#F-ܒ[o5_ogϞz뭳6d-Ȗ'fW_}4 }i/rZr=gz+o}?*�rM7m7ߜZkr{6ԮV~u� @� @@ jKӓNZpGu� @� @� @� @�h [aI @� @@رc6|jW 9r ><w}w.~9sfJfm|:th5 0 :thf(ΨQVC=x cƌΝAU;d6ju  w=k+n @� @�4@ 0!yd㍛ @� @� @� @� @�E@d{9I� @�h &TQGU`rgĈrgT.l6p*oȐ!` 2xଽm*̯Ek>y'W>h!j[OB]w*LcGrݻՍuQ:,�rQlC� @� @jI~[d)� @� @� @� @�AX) @� @Ew߽:oG#GV뮻.ZIn2hРz8p`J�`ݼ_~ԩS]UH`=zt}<3z*O?tLRO>U8[oaÆe7_uU�s @� @�\kM7M7v @� @� @� @� @�M@d{;K� @�h%o{OO%,ϨQ2iҤjεo^Zk{ ,˼=6tk)Kg z|/Bj*˧MVuweɀ=3?WJ+Rqɩ&wݕZhj2|xjRk^C @� @�C( @� @� @� @� @�%'@� @�h2�WSFfΜ1cT%T瞫oM2~6YeUfe]~?0aB^{;vW_/<T Jnҷo߬U`;uY\ ˺:mn]vZrI- vva @� @�Z@OJzlQ] @� @� @� @� @ leLw  @� @�R/ei")Aƍˋ/ѣG祗^ O=T}ԩSgۿ�W\ ݻw5ի=[%N%@reI-%ذxL<9&M@pzoVy^}o_= 6 \׮]4W[m 8:&%xs5֨Q+ zL{KO�> r� @� @�(A3f$wߝGG @� @� @� @� @�+ ;='@� @�@ `\eUi7VñcV%T cՇ$ĉ'.޲JYw%:umرl'O>4elaus7VGUe]e ѣo|Y{/ܒ5QcXv(g$<_rС>{ @� @� дpA6  @� @� @� @� @@ @� @�,@i[Vs*NJ(d]0IRy lW㼖v:[HB#Kd>9_>-\UܣL39 _m6Ї浕e#P;0yK.I YZlK� @� @@slߛ6G$@� @� @� @� @�ڎ ȶs,� @� @`) t)zRojL8"JN<19㌤9,ɯgɸq%`3BH" @� @� lw_R2mZ_`6q0 @� @� @� @�h[�� @� @�;_"v駛ͶTSOz0Y!\pȶt� @� @}l}2qb2bDQ @� @� @� @� @�M# i\J� @� @ |s=ܼɅ!6ڀMK&cdNN>9yG?JkTD� @� @R([idب @� @� @� @� @�6' R"@� @� t%wߝ}t2lXrAM^kǓ}mV':$S3 '$={/ @� @� .ΆK}&@� @� @� @� @�, 5 @� @�v/ХK&7ݔС_N~d͓ 7L.49dԨ}I:Mln� @� @�vHo;1 @� @� @� @� @` xxk� @� @@ЇN6$e䓓:W^I~Y/9Yܒ<kjl@� @� @@+~g[au� @� @� @� @�h[D/t� @� @�V)ЧOrɹ&'%$m1<^}urU]w%=z${^{%ݻC @� @�,[$ݺ%Ç'뮻;ۜ� @� @� @� @� PH� @� @�K*p1}%o|/i-cJN9%tduSOM^;d˒2^ @� @�X:%Ayߑ* @� @� @� @� @� \ @� @�,! =4'}.yEڵl4mZr-ɗ4+q׿N6Y᏿]%,b# @� @�,evHOƌI.$6,?rG4G� @� @�ޝ\3Y#[*{dKUnDJ\eܲjn%nBWTDu%,md e߷,cߝ3cfͼnGwΝ> � � � � @P ZSi@�@�@�@�H0פnl{Oj *u4g4sgRDdhy뭱uϕ+pO@�@�@�@�@ ZZNڱC*[VÐYd̫ %!� � � � � � � � � @ #� � � � IWKw-5m*) ; :*)?҇Ɔ?ZdfғOƆ?V � � � � #}[s~̙HQQRhTD Ԙ: � � � � � � � � � @ o!� � � � KKIGK?.}ϊc/^,M,M.?.]{wH%KfE(@�@�@�@�] $D*XPH[{$hz� � � � � � � � � �I Ng@�@�@�@�@� ȕK<X[ivmO/왩{~gʕ-+aäݻepvjM@�@�@�@�&RjB&DEט @�@�@�@�@�@�@�@�@�@ �A=� � � � � РAl�-HK< EFf@AqtԱTI&Y[Js1 � � � � @2Ҕ)Rtt2yJH<g@�@�@�@�@�@�@�@�@�@�  � � � �d@ҤInPZ6}>{VCQ#k; ݻ^jLx � � � �|Q)$$6,9 � � � � � � � � � �> }l@�@�@�@�@ S:u~Y*\Xc^xQQҿ-]~ԹTtwwKaa^O@�@�@�@�@� *VL: H# � � � � � � � � �  S5 � � � � *H|#=ԿԾtPꋈ&OjԐzFڸQ#i?;@�@�@�@�@�哦Lo27TP£|F�@�@�@�@�@�@�@�@�@� \ � � � � @&HÆI JWKkK秼9sz=-M*UR D�@�@�@�@�R+Ш#q].8'@�@�@�@�@�@�@�@�@�@�Lچ3 � � � � \#Z%5o.x4xtL['j%|Tv۱I@�@�@�@�@ FʗYd='!� � � � � � � � � @ 2{_Z� � � � @P)"M&M ԤysGDHKuJGJKH|"ը:>!� � � � �-&M"EGK/>{ � � � � � � � � � @rA&9@�@�@�@�Tݥ+cWO4)vTW&4nRfZ5 C�@�@�@�@� 4m;yMHmҥ � � � � � � � � � �AIp@�@�@�@�BjU菉}=%{:t6mzTuL@�@�@�@�@ 3HeJѱ}qϱ� � � � � � � � � �$%'G�@�@�@�@�J W.⋥Pȑԝ;KEdU(@�@�@�@�Q **J'OtS622R?izmk:{k^~y%m}1 VLLL5Ԛ;wnɓG!!!ٶyukajqSXXnXxx_@�@�@�@�@�@�@�@�@�  =P @�@�@�@�ʕ&m &{ԫԲO ߋ � � � � @ݭ:z;v֎?~??ZcJ c* [LoaF_pc<{uey]] |L 7, I[ q)}Y`ȋ.H TvPB*\9[;v7Oo@�@�@�@�@�@�@�@�@�.@d@�@�@�@�Q 2R>\=ZjDgZfϖƎϗN*THy � � � �d'tza:tH G۞<y2Ѻ 'B .,Zʕ+ }t =LBmk;^5SvS^'f&/$uZ(m}9&\O:%{'�M ߿_7oi-2bi+VLŋ?gkJ,%J,$@�@�@�@�@�@�@�@�@� E@�@�@�@�@�tXXSڻWzeO)x~-Ν:uNҡp� � � � �}iϞ=^sV; Lh[-(z/Tз B-|0P/wkG.wk <zu~DD;fan>'/ iᐥKJreʔѥ^9ӻ-<@�@�@�@�@�@�@�@�@�@ 2uA�@�@�@�@ ;& "tRrI#Ԭ)-[& (yҫJ $}g@�@�@�@�@ u;k.޽m-1**а0 kР,D<2i!K6&:u m-,ԾW? PɸZ dٲejeWPڹ� � � � � � � � � @P T"� � � � }fϖNLtIYۼ1z5馛=Kޓ, � � � �  ۲e~7}j'O?/V]`:uԶm[ +S .쿞|F߱pH_ਅG׬Y?\{Qtt{@wRJUTQbŒ* � � � � � � � � ��A � � � �9G`~ӥ]^7(7oNZZniSiHi )W?;@�@�@�@�n111ڱc֯_7jӦMڼyܹSv ̫X k߾ۯP � d7a @]v[^TT ﵭ[nuΟ?ߝE-ZTժUskժUUzu]~s|* � � � � � � � � �d�AFMA � � � � 0q4pTM7]IҼyO,q@�@�@�@�rݻISVuݺu._~щ'A]lRr*TPNaA.'Od"Ϝ9m۶S =_%K}vYHdHH =+dkڵj|@�@�@�@�@�@�@�@�@�2KZ,iA�@�@�@�@  xmիpԿ4btE+4xtR.J8ٮ]< � � � � (dqF-_\+Vʕ+]#G\˖-5k޽{FUX@i@ 9MXHdd6m$ Hݰa[g͚M24ZQQQʗ/Rn]]uU_l? g@�@�@�@�@�@�@�@�@�E ta! � � � � 7~H+ .U&}԰abW^ ~|Pj^O3F g@�@�@�@�B`^ՂO8pժUu[�d"E@ yŵYl>}څ]V? WuAΝۅC^}jܸ[J} � � � � � � � � �I 4q � � � �O6mzJ8Pʓ= H&I[KzI|#䍁gA�@�@�@�@ bbb~z-^X-r]v)_|.7߯JիW'.& Pj;wW{Ϟ=C+l2:TVB!Z6jțوp � � � � � � � � �X ]\� � � � �DqǤ^Zf̐Tu$o0t]7>^cHen( @�@�@�@� l߾]W_СC*]5kmݺu7o= eʔr[lѷ~Kj6l7Q5mTZ 7ZCBB� � � � � � � � � @RA&%q@�@�@�@�H.<)M {on7T }4bԿ4w4qTx@�@�@�@�H@TT,Y>Lzi6mr]w}Y]TR 9w֮]#""h"}OH"jݺڵkE͜Q  � � � � � � � � @ t #� � � � x{J>(͘!u%d}=CBaäV Εjז&O � � � �9A̙3? 5kN8kFwڴi+2'0F>oޭָz՜9sCɂ"[hN:o&)bl%A � � � � � � � � 侀{@�@�@�@�r@t4ntʕJSFdW㍫תURҍ7JK{@�@�@�@�2L`ׯJ*;ɓzu!}W8p !σ|Kّz3M:Uׂ ɉjgQҥնm[}G:}tW@�@�@�@�@�@�@�@�@�N Ȁ{%T@�@�@�@�XFjLz!woiؐ@}"Ҵi҄ KMH7jm � � � @0 DFFV:u&ڹs78<x뛚;S  ƦQgH@ܹ^֭[xbUXQ}Q2eɊkǎx""� � � � � � � � �d7 = � � � �dSҐ!RX!=wV}XzҤI`� � � � c=~Zʕȑ#]]4{luQaaa9ֆ#Ըqckڳg7QZl*WXnD � � � � � � � � �9P i2 � � � �i +7ސ^~YZTU+O˺VNWߤN%#� � � �ӧ5j(UXQfҸqeP%Q2L o޼.믿 oܹs7c]wݥ;vdX<@�@�@�@�@�@�@�@�@  wB@�@�@�@�8};ڴ66l Qƨ⍷K_~)-^,խ+-Y9u-h̘1ge]{, � � �*σHV`…]~mM8х vKFNf@LLw0`T"zwIc:hѢ[V\'x… >odϯQ:v2F 1Ԕduذae?_f8:sLjafYzvZY= y={6 � � � � � � � � �#ô � � � � ]_7Y?MJ>-nJZZޠ}eKy 9rD_>s8q"uVm߾]eA�@�@�H~LG@JNzJ7t:wunKɭ\ ~vءwyG۶mS\RTcjΜ9c}qVZ7n.߿qIX $R{ ~'8d=sj׮"##S Zj5kf̘W^yE7pL, � � � � � � � � �Z lzi � � � �i5iSz7]j& ;fϖ^~Y5JjB^Pa 8}W^0wz۷of ^zeqM(@�@�<=# "w}ƏE@|eHHzMnSCҥL2Ӽys#!uMuԉw,q]19EҟF_~E/) h;wƍYte׬Y#79o, � � � � � � � � �W ni � � � �i8~\0@ޠXy+瞓O~eˤG 䖦M o+t" #-'˗Ϭ(@�@�<_/ @zH|[5j(�kH|s疭]s-KI[bF'v9O 1x$?E]Up@\-O?TWVtر@&uB�@�@�@�@�@�@�@�@�Hsc1#@�@�@�@�@ 8>DƲ Ǎzr ζ5kƆA(yҫJ s)S_~QrԺuku=~u]%ٳG}W^C>ݻW]vwg pŠ Є K/yjڵ6lFh͛WC q!-r ׈#TreוۡCVim:u, sܹSo~GϺ*T1cxAZj ,nݺ9 � � �Ty0~Yo%KRJۆY,Pnٚ>}^x6)SFO<j׮o]Μ9WӻwokΝ_|f̘pnf?^7nTs?0}RS… ]֭[U^=:tM듛4iK9rJ,̰Y4oV{]v۶mn=ބ=ތ=DFF^wԩS?VTDD>3YYߡ-[V<J*wiرn;s|� WmڴigڱcCCCcJoң'Vb ['OM@ r2@� � � � � � � � � %:KI � � � � xXztR˖n y!>0y 7Y^0OrhBW]u d,QRy:v*cdž {q!Z#<0ah!-6B-b[cF�p@裏4w\جY3wB{HuQw̞c!X=mmݦ{}۷oUAwurέ9sx=5qD9ߤI9tP۷Omڴwbv@�@�@�l$σ<٢)xׁf$b}@ca7p6mBǂƖKy͘bA+Vtׯ_/ |g]M6r \R{-[*}RSZo^;weg6IfA^111.G >Uӏk.6j(7SO=%o?c;U)ȑ#]_g}nog!my]]-otػK.)(},Ђ.m[,&cN[Lw=-B gaibbuwVj= � � � � � � � � @Lw"� � � � QQB+ \@<Y䒠oZ4?B X^sgoǮ]{PlP^ӧwQɒ%UvmW/Kcp 7x ҷAݫVrl;Z ^襁ڱSJ{ ޲ejڀŋl`7|W_}.]Oz;iȓ';|P��@�IDATM7k֦^z4`?- � � -,ԟy0[~Q?ZjеO_Vƍ]Ȃǂ -lI@UV- 9Ξ=:ȖE'gq,YĝKÇ[nEm۶u! RBRZ 7|^볳p̈́x.j!XWX&1[ŞoaXZg~ƈii2d7AB6-ZX.֏Xnݸ퇌wa ?X]w&-6ݤ4*Uȭ{pY@�@�@�@�@�@�@�@�@�@$Z� � � � �)[~}'%oܯ <ؔܞc)]Z7O9҂oͼ H }_ɭ[v�焋 0ϝ;;m 2el 8oР[-0rʲAѶ)Smm=Ǯ ܹnmu$mr6j~wȗ/v{I`i{ցk͜9S3fׯO>~B+/� � �d~lU(\?U㢋.rl6g-[֗_Zh-;wtp-Wy?I钒~eH֏ > 8L,Kuu_j}oVk[%z={/;^Z5uYhcz-6I̴iToi޼{7ov!v_F e.رc0vLG{ Y M,s=_~.ȑ#s_ dMYZJG�@�@�@�@�@�@�@�@�(@dv| @�@�@�@�d1>k ֬xB M~ʲ,<H7[~9(++{޲i&! w0·<yO6ۖ7@ǟ~IuÆ r >Âmy뭷vԨQjҤl0Yj*w<qD*UJǏWժU}v}Ox_R_V\g<]@�@�@ ~&󵌟u?+635jgf.+~VB7GDD$( V6m<~#$v׻*U$8__YC¾7#Gb|6ލl-ӂ*nq[|&r'vMZ^eT^]֗8f,XPh9p@WioFgؤ:q[3`y~"!Kթ' � � � � � � � �  O � � � �_w$o>\z}i\JjaҊ-HK< EF%\N,Y$^z\dxS2< ױc\ d㶿uք\~} GHdƌʛ7 w7n|agϞUƍ?K.>ݺuӂ deٲe'Oj; � � y:h#h̙ $Ui vs5ӺukMayWӧ].]Lg&gرل-)-ZTk.oo֛8KR}q. lHwwرoq~n}ZXb]׬Aw(2@�@�@�@�@�@�@�@�@�t 2]y � � � �-~ԢIw)ԩS`9PkW4iҔ)Bk35r_hQB~'iӦn8ƻ|֭.yǼ1˿[=XУ@} "\}뭷zAs]7ߜ.pr*QN &O>D+WV}Zr9Np=hǎc � � �Qy0;~M7pCڲeK@6&H% T۶mvԨQ@N@<q;(gxzԮ];o޼xGEE>x3Cb}vKZ .TUV.IPoLxx| <iѣGW2kyᇵzj=S*UTfrΜ9>-tѩ@�@�@�@�@�@�@�@�@�C xO@�@�@�@�4 <)JҫJ qGTplرqN oժ O/Txq <+S?D ڹs;ڇ]vc߯ jƌoo߾ҥ^|Ew6 ,ATP`ᐶs}1w.niӴo>w:ЬY3zȅL ּysUX 8Y@�@�@�l*σ<MAݬW^yśplr~! ےT?KΞ=}wyG5j&f_h?>Ma:g͚É}vDGq۔~_QreuM0dW믿j>ѓ׿J={O>8p?|}n%ve:~۷Q#Gt}d`:a}HYlboxEuǒ?|&%4iA$0'NԸq4bwg}ʶ>\5NСC}-2P]ڵӊ+4|/ޕ&6J @�@�@�@�@�@�@�@�@�Kzwos@�@�l"~d;/Wc69Z%+s4G�dg28TO?7`TZXzyixK3 پ"EnH,/Q)mz`g}V7oև~ϙ3Gʕs]|ŲVܹseaO{o۶ 쎎V1m-[t=g/?w'M5k@H {m0}~q׏yvjwB/+wX/1e^ꪫx{6;?#^{{ ,\PS6m4j(Y, � � @v;w`6]˗/A/7<c^~.ςB!CBBa\?X Y�7d# +U $ {_%Kw,V 袋~)Qի"},`{=oY7M7k~˫N:n2d{nucZgڵ'hM?| ѲetuiРA.ώD-r8%nݓO>B7[o|MYYZ`/3ʧMb}|VmڴIiB":fw9Xߜ-Th}x_xׇg&jox}w?Zj8p&쇴/t-P\{ʴk u[n"^dzյlٲX̀7ݔ71Q@TJ Oߧ5QI@�@�@�@�@�@�@�@.mN܎c dA�@�&5fl\C~x࿟p2ހ]yΝ ,,KO@-jk׺pA6r[(Aj* J*z0 x!$pzXm@Y/Q[.(r%|#� � �&#]՝y0ؾ96aE޽]ѣeddr~ '@ݫ'Op*V9>slYߍ}Xҫ)-uJM3Kx̂#6l>}Ӿ}TJDRS 6pK 4\,DӾKEu[DfDK.uXXbA$j:` To4sf֐zd~>>~3j� � � � � � � @vȓ]B;@�@�@�@�Y/$BziKy2&0;'kVznQ8P? dNA-ZHF OL, 2]. :ŋs,VPw*:(P@uMC�@�@��?`qZlիW{}r/G>|[JY:#ɓGd�6mڜҁ^Zg[ҫߧL2r1›8Ǜ9'dH۩;{#a_[JMnٲDq5k&z]Jֵ`Ǧ!Njˍsk@YF>>#oZ~(*X@�@�@�@�@�@�@�@�@�Hofu< � � � �_`O_ 6)"M&n-=`Rժi <?tPn!w]v94@�@�rsZS^~L1fMn裏wz饗>>!BzofpURÇvޝau+\ r4hפm۶U5}\xxx3dX9)5###{Xz3\\?9sF3gԸqؿ;rJ]yԜweKd{@�@�@�@�@�@�@�@�l'@d{4@�@�@�@ ' XF>t'H+$lk5H;KI*ٱ.S.]R{[TRڻwoj3E�@�@�#бcǜTS .`A}O=W7XSLk>f ڵڷo/ ˪ٳ.~rUٳz!u-ݫϛC y`ek ._|~aWyy5jԨxAhj*׬*B??}]o"iQ=[˗{-cdA�@�@�@�@�@�@�@�@�Z Ƞ~}T@�@�@�@ � G 7:jfVNz1y%o<ƏIy};{I'O֎;j*͛77s% � � @ 4iA/CQоA*½κϭ˗/ĉէOx7oW۶mU`Le K/V_YL[e˖^?בg)N88ZtfΜ]vy9ݨqƹ`lĂ =b@�@�@�@�@�@�@�@�@ _bA�@�@�@�@�`XZjL[iB YnK_~)-^,խ+-YھڶmF@�@�@�@ K*;VӇ~o߾*^h̘1Zn]Af}{^L+O<xPSL]wݥ%KjCСڻw>sט+A@�@�@�@�@�@�@�@�@ 7@ � � � �Pqi�?irS�.2V jזZ ΞMYu*V]?L#G͛SvW!� � � �@^o6mhҤI:pΝz魷R͚5UL7amٲ%`ME@ y͞=[?7 P]Cy1zWs? Iy{j˵ � � � � � � � � @f ( @�@�@�@�&0cK'OJc8*ʕgqW/.oPp8PjTBO.ի,Xp@�@�@�@ MҭcƌѶmۼ~7o C`f͚֦M9 dA�oVK.uud4i:7&rJ!RȒFEp@�@�@�@�@�@�@�@�@ pb @�@�@�@�@ ޸R=4gtK\qg 'h!u,թ#/u|l0[oƍw &g@�@�@�@�B.SϞ=kѢEZx,(r׮]ʗ/ lذj4Wzu S`سgVXe˖W j-P맵W^y퇅k3ylV#� � � � � � � � �N H � � � �ӱTRXQ&5 S W "Nq6/twS۶m@PA  � � � |rҕW^>}X?ޭ&M҉'Zj^z.$dk"E,8uoܸQk׮?+WjժU:prέ5jQFYoK!dRo@�@�@�@�@�@�@�@�@ =LE� � � � @: ,X +) &=7o:B ,Lz5馛=Kޓ4Hz#G}'ѻロA�@�@�@�e˖wqkOtt [|VXBO#GvBZX]~n[XlA#H@dd6mڤ_~E6lp?ZdTTԭ[WڵS]jZ$eeq=h@�@�@�@�@�@�@�@�@ d@�@�@�@�@ %KHSJKsJ*N foLV[jT5h+׹*Xn6uMZ:" � � � �d[ܹs: xڵwVuݺuZpx 8q]SxqU^]UVU*U+WB ,pm۶M7o֯궶o /ARJ+~][U<y`yA˛ � � � � � � � � �@�@�@�@�oƏ7Z[3`ҥyѣݟ<Y [/_W[k֬QxxxK� � � � .RڦMcbbc_^7nԦMܺ`ܹSvޖbŊ`+ʷVf)_[ (&;d@TT,tuV-[h׮].XhQY͚5sAj˗͠tγgA<@�@�@�@�@�@�@�@�B @�@�@�@�XR^bSOI]KNȕK<XzKvmiD]s5^}U٠Çg= � � � �x\^:7 `N:~Mw={ ;y/vʕSٲe]अN˔)… gDFFj߾}.-ѷZpٳ⾋^ZrejVT}.^xZ=A"`A^.(  � � � � � � � � A � � � �*ғOJ^7,f`m NO bA|Pj^O3F _)6gCB#VZ; � � � �#k5K<o!-Vz}녰/-*]J*ߖ,YR%J8g-RHbEr, Xڿ }?6"""@b\بZ7BM˗/F�Yr�A9h@�@�@�@�@�@�@�@��^) B�@�@�@�t3HixG)W@5LI֭^o?~Xh>}4eZtrΝU,@�@�@�@�l,p%֫*VFGG�={? O'O{YȟŋE&.\X R޼y=/?=ݭ۷#Gt!>|ح޽}, ԂB-ԱQFP Ip,EYHJ $D^mRg9� � � � � � � � ��A% � � � @6غUzi[7ihyAhB t$5n,u԰4fԯ_lqoƍDՆ#� � � � +`}Sg'NC!8/(qx }e@H_0m xւ /"jϟ?j,h0_|nkPsCVsԩSnlnG߾m;V ~};oa  ,R?ӂ<PV-} ~\̊iA[@�@�@�@�@�@�@�@�@ 7 � � � � 3ҿ% .U(-\(]{ms*H|#!/͝+M"j CoOf@�@�@�@�0Ɗ^Ǩ)]N>/жq}!v/zx:hSX/BCCCpka5Cjg1yDٳ5K[n-15mL_Hh ,YTrNfBdZv/ Y%@dVS. � � � � � � � ��Aɳ@�@�@�@�H dԻeҠA'GCaäV]ڵɓc??䓚>}|A͘1<O4 � � � �/`!Jh. SBmָaq}!/>GGG5ncgφjԬX/Bv΂$K>B)S}ᕶMoPNG  @%@�@�@�@�@�@�@�@�@@@nG�@�@�@�@ 1#Gn7WT)+9@FZJKFi@ onAfҭޚr% � � � �\ *@jjRk@uA 8l­3g@�@�@�@�@�@�@�@�HJ wR'8� � � � �i2EQC>!2mܕ@"Ҵi҄ KMH*R׮]?H6!� � � � @� ԯ/X@*�AA* � � � � � � � �$)@d4@�@�@�@�@ u*j%u&u m u옺gp5)]Z2z ^ЩS㏧\� � � � �Y$@dSl 2[F� � � � � � � � @ 2�@�@�@�@�Pӧ#ZoƎ 's? T*}Է×R1z״lٲo, � � � �dA+ۗՠpR T@�@�@�@�@�@�@�@� `@�@�@�@� ,]*ի'=RFw Vҗ_Jvݫ>o,`j} � � � �dAڲbE?@ /~LʯJ@�@�@�@�@�@�@�@�@  ķB@�@�@�@�^Qwoys|yiZi`)O:̦ZIWKMo=lX� � � � @ -*UHdFEi11YTE�@�@�@�@�@�@�@�@�A t@ � � � �9K࣏/fΔN̉hm /.-XPU=]ӦTXS� � � � �ɷ�X-On@�@�@�@�@�@�@�@�F Qg@�@�@�@�,ؽ[VCMis, "ӲeѣR:B! � � � � |yL@hhl I@�@�@�@�@�@�@�@�A/�G�@�@�@�8@L4nt H&H_|{YS. 򮻤;wϪP. � � � �$ ;Ç3$' <s&8� � � � � � � � ��A~ � � � @ tCI}JWK]ŕxR(&+͞-}d)7s � � � �dٲbE?@ e ӧSv=W!� � � � � � � � �(@d � � � � QQ3HuJ'OJ˖I>+Y &Ю]liRӦK11ɷرs@�@�@�@�.LD K 0EΉyƶ Ȝi3 � � � � � � � �G .i  � � � @: \)]}4b4|wQUyǟIP "kA@P`ö`[@@Q!HQ@ !y'&�iS~92{<#/2 DjU{Lz!kWiwe8K<E�@�@�@�@�hՊ 8ED�@�@�@�@�@�@�@�@�` 2g>#� � � �҈h)>^:T*T(O.G@D==w 5o.MWK*͜)5@�@�@�@�@ w]OZ b|$2<Q"� � � � � � � � A2.@�@�@�@�eK^F_`FukigOK;RR>}TP /aQ@�@�@�@�NKY#%&]0& � � � � � � � � �*@dF�@�@�@� ~s5%K\iFXhwޓ:KviѢ? W^)8àc � � � �@VRzpaP#A+7C�@�@�@�@�@�@�@�@�< 2`i@�@�@�@ ̑ZxCzu髯O~CrSફxpa魷Cl=5UZR>}!� � � � @ Ԭ)U ^@ 3@�@�@�@�@�@�@�@� c% � � � @&i`cGn]i馛2*a&-m(EqZ4z4kV0\@�@�@�@�IeK ˄�A!2 @�@�@�@�@�@�@�@�08z\#� � � �?J[oIo)}TFH!@ΝҡCG?4"Bji^@�@�@�@�8u \LM pqƋ� � � � � � � � @h ʨ@�@�@�@�ؿ_zAsZ_~nᰃD ^}U2EJM=- r6ic+ � � � � pjldϱ) @Ѣcg@�@�@�@�@�@�@�@�\ wn � � � @. ,\(n-4vR͚8 7J/EDH  8^E�@�@�@�@� ȃŋO<F \왶A�ƍ� � � � � � � � @h(@�@�@�@�"&=tR/Hzم@ T.%$HI]&,(R 7$Y$@�@�@�@�rG~}߳iVb yf � � � � � � � ��A< @�@�@�cիG|R9S c1*TFci.i,u}'*$Efz;>= @�@�@�@�NJ5o.yRlA#� � � � � � � � C` @�@�@�@�,. ,կ/͟/5ie6@'<#]+M"M$͞-Jii_F:pۧ{eRRH)))Y˖CӔyy=knTi5ˣ+Z2b޷mx⊊r5z%TdIEGGKA�@�@�@�@ Z,Vi 2t疑!� � � � � � � � .AL3N@�@�@�@ m Nx@zH08CD ڹsokb.lS5j$k%$4Ӗ-mtQz^|xl{a_P9fmf<Vp?x2s[X-+E ,UJ.}D-[ʕ+'֭VPU[2� � � � f-[J#GRI "p A � � � � � � � � @@ PAg@�@�@�@�NU/o2'͚%up-q!`7o֦M{[u,??رÅ)f)S&KaʛTb/ %%5Tj@iE.eTT ~@@@dW-ۧ{LLLԞ={\ݽ{[[hڵ-mXe](dŊUJU\9NSjTjU|@�@�@�@�BS + Cs  275i @�@�@�@�@�@�@�@� B ȂP � � � �&eiiXk|ҥsyB o'$$~˨6lph3 iZ`ƍUR%Ya ,˕+B ###37TYD WscAܹSm۶`΅ ftZdb if͚Q[ںZjZ3_u@�@�@�@�hT*RDZ j*`A߈( � � � � � � � � @ 3G@�@�@�@�dԯ҇J}@hX;^5khu֭-}۵z. Bccc]h`ժUemi M մZN|n޼مyҿnUVi̙ڸqߟў{dԺu^z{"=3`XA�@�@�@�HhQy?"IW_D@T\@ � � � � � � � � @. 4� � � � &wԲp�WD vҲe˴b -_-m}ڵAŋWڵe~guZj?[VTI9 v\[=VIOO׶m۔A3/'Ou)%%ŝnAB٠AW6l薍5Rٲeu #� � � �yw\K"tAt@�@�@�@�@�@�@�@�0 y � � � �Νҍ7J. .=\A5kɒ%ŋݺ-7n8-z~KXzuMs1[gʕ]pËE{k͚5\҅ZH1ctw6m&Me-ܺGR@�@�@�@�_ 6V2%F7= � � � � � � � � ON@�@�@�@�ᅲҤO:@: #dqqq5|-\P˖-Sjj,`q.l;pKۮ] *FJ 5/,(Fwen:-]r̙;v,ۨQ#zgy,he˖.6 � � � '`A!m $ p<{dr#x @�@�@�@�@�@�@�@�l {~ � � � '.=4bԵ4nT4ի5g͝;W? ׳ ޛԂw|P͛7W \^`^֫WK.$޳+VТELG۷l&Mt9sUv'� � � � +-Z~[ \P(^\JL 26@�@�@�@�@�@�@�@�u C} � � � !]w4cf��@�IDATRDD@JtR͜9Sfҷ~[D. /ȑ#zLLLЎ@…eaV~z͟?_?{{JJJRʕաCԩ7n}6  � � � p eJXт {<80m 3T@�@�@�@�@�@�@�@�9 CnJ � � � :^昮Jfϖڴ 1زe+M> $!x#FPռysYP@S_~Zjj-Z\QFiРA.K.֭v*UA�@�@�@�E 6/"@Rrr#� � � � � � � � @  �� � � � /H//PL7N*_>0IBS_~ѤI4qD-X@J矯zHvרQ8B  <mժwu;zٲe.$ՂRN%&&/RK͚5˦U^F�@�@�@� l{&f�G"2E�@�@�@�@�@�@�@�@�` 2Xf~"� � � �a"g4`4a҃Ja2xYK,ч~k͚5jܸzѣG]v�< )`V T͝;WSLqȑ#Un]WS&Ml= � � � �# y?P8L SR& � � � � � � � � DAW� � � � ˖Ig-}JÇS^۱c^|EhBM6մiӼ Zr,:vHd L{^{-^{=  � � � .{@Oť?YC�@�@�@�@�@�@�@�@�M `1� � � �B +T,:u с2XpzUVMG_+VhzugD?.`Svo=fsv=h"@�@�@�@OOʕ}!QQRJʑك� � � � � � � � ��A2S@�@�@�Q4i0OY`V ̞=[;w֙g۷k„ Zn{1կ_Ge^{=^{M  � � � O 6VC'P|#x @�@�@�@�@�@�@�@�l {~ � � � ;vHݺI/$4vTHH@||t .@k5e]tE(^qYS9{I7{� � � �A.\  DEy|!^E�@�@�@�@�@�@�@�@�@ 2g!� � � �!*xtYҊwI]eX*o> 4H[V*UrJ:3 _\|v/=iݣv=k.@�@�@�W \DJM Wƍ@%JH))Rzzr � � � � � � � � A'@�@�@�@ &LڶW͓Z 3?ZlZ~}ժU@rȑ#8}SmNR`TNﳪd ~vo=jݳv=LA�@�@�@�Q - 3fNL -29Ď(@�@�@�@�@�@�@�@�@  ? � � � @ %]~t5¾ʕC| @&N:K.06mH?rzѽ{z_^ z_hJs]v˽iӦiɒ%zp@xٽjݻv۽LA�@�@�@�MQ#hQ)>>Fx8q [' � � � � � � � � l@�@�@�@ 8 ƏƎn=8A_`ԩӧ{9u]Ђg(^Mɓ'+!!A;wi˗tҹylk/w^+V^y5l٣G@�@�@�@�KHIy?Q.A  ٢ � � � � � � � � p4 >@�@�@�@�\ؾ][>u횫ׯUW]~8C *\Ǹ~X.[]^Zl^Â/j|ڏ/nA{qŋs!l#� � � �!+Тz!Cdrrt@�@�@�@�@�@�@�@�@qsY@�@�@�@ \VzRSs&Me䌳  ͛kq#9{ӏ;Viiiӧ.r=SZp;ւڵk>}z-=z饗dwom̎^w}]v鬳RZTP! 8Pƍ?P+GuX^~m۶͵e}/UzuͽnAƍSŝ1ctE)))I;ƂxU^ݙx;DKJJ?d۽6׃ ?x5j8e,D>{lw͍鍊nr}>nܹS|\Rg}~iEGGg\tjhذ;M~;ưc?޵uu׹_|JOv| ksu6g2qDYݲeZjCL2>s޽^u77pZYF:u֭[]6m+ ri_|!?ӂ F�@�@�@�U 퇕( pt� � � � � � � � ��AA9mt@�@�@�3I H&I+Gep l>cEFF ,>5jA6Lvx uAZY۷g,YƲw^uE˗׿og= F-Ns׳ j,,A֭\_&8bh111߿~7rhᓶkƌ.pޗ֧67|L8ba*UB٣ZL]_Z8[80͆ Էoߣς kjɒ%ZjڶmDiC3g{ァ /P=zп/YԀܹY ;`F3iӦiر,�-jeȑokٲen?wa6-[tYpR~.-(Ԃ(m_}gv<Q@�@�@�@�p HY=ZSժ0bƈ yr^� � � � � � � � �'߆<z� � � � Cߖz&/<N7B s ,^X.0ۃƍgZDDbcc{uy}fh٫W,ǝc=B(_|EUPQ.\Xgq--0[oW>؇zȅ7m[8"Z-ڱB+/fr۷vi65kwڥnA@hngZgl݂{xec"E~.x?zJ+TlY8XO||=z $j!͛/.\( <suM7Xbg׬+WI\=:t萾;URŅu1kvl޶ � � � �"`AV}KD�Af` @�@�@�@�@�@�@�@�Opu#� � � �w%/L#FHFI^V;K/Udd "lիWWz2+SL$&&j„ .Ђnݺ)))B/x0I߿~ahᔕ*U{d ŏ>HUVu;t蠒%KjժU.$UV}-Gg E닙˶mۜך5k\Hd6mK;vRJynʗ/C֬YӅ8Θ盐1G }ٽ{֎ӊ?t֭n!K/ � � �=&lH[?=F kaG�@�@�@�@�@�@�@�@� > � � � @J]'-e>_#mڴ Λ3gNT:`V *t*g9gӦMڵk )l\ҝ5rH͛7ո8^Z?Dx]wpıc*))IӦMS~N7XhOs9m?&79^+W3<;*::Z 6]tqI&eܲ |{Xbؘ<vXBKΘk|ZcjТ6&Md � � � @ J>JƇ )b=s>9 @�@�@�@�@�@�@�@�(h z> � � � "EK.&NLBFTXQzr| ^m7,XTKhA)Q;> uܲe1p@,YR>CY8bٲe?ʕsA6lPBBBWTe~l+O_-ÇW޽eo]so1qasgY eݺuv; ^M � � � �$ТA4ߌ5A' � � � � � � � � A< @�@�@�@ v:w,'Bp| <Zhx≀E…]_vޝ'8c^VVZUw^͛7/XgVeխ[WO?ͽ~u_w릛nҶm\buQ[bll{mYEEEeSذ[/ygco߾,&''kcN͙3GO?N$t1>MFsհaÎ,rG `eަ � � � �&`A+WJ#& E ȣ @�@�@�@�@�@�@�@�F Ƞ*:� � � �oIK7 8:+0IC &&F}_ AmVJ￯~[F6e%$$u IvZi&uVlw7㮹g2i$ >svYPԩSէOܹSv?\y]wp;O<F:v= xF{w}*Uxa'k״qKJIIqM\rn߱3x+^<cYtiw㝕.X@Є /hȐ!.0>>ޅ@Zi\8;c˖-.1sXH&%%7b!-[}l_{5 8PW_}ƌ2sKJj/pfaힶ{� � � �Az٢%Km Ĝ8 @�@�@�@�@�@�@�@�S z� � � �ҥRvRBܹRAm:=z=.o:7Q-p޽[]O>J*jժ~i̙ [o_y9ҭ1b &/YF}?/o5k̙~ ժU+h禧GZ06mT>&Ooѵ7߸ Ipb拝~ԩ:EFi 05-XK.n\rСc:fDZW]veZx;dРA.tx@K{x-?_x7> ̴6mh׮]nmݻ^z={VZ% 봲FpY9~-[L{vGk[_~ r1cl,wQ]m5tPzn{-qj޼ϟ/܅J ga͘� � � �I%KJ 3 G � � � � � � � � @ Dx_Mϭ]y?έi@�@ ro="@""$>}r- @h ??A^8�1yApRٲ9*x, ., KbbRSSU\9GE.m޼ k-ʕ+F = \,f͚B3nfzjխ[ׅ8 ><,TKZZ E4O /,i߄/gF{WŊsihaO;好,0N:nyYfBBjժuJA'{co {?ԙgyCُ� � @H 󥐞D�䒀(jZޏR4@ cg A1)߿o1 � � � � � � �"P8T8@�@�@�@�O/.:w>Hʿks%NT\atUWwAw'FnWT,T˨Q4q^ti͜9SjO5^Vlllq'b.83@nݺU]tQ 2ązځjٴilp*{K\ۯyY�dŊհaÌ,Ɋ@fv=lj׮}*9B9|p/pcvmzꩧ"3WG# � � � @Zs�";AP@�@�@�@�@�@�@�@�@�8op4 � � � @NLB^ʖ9(} ^M7ݤ~k5l0qyw<lGYvcY|r}k[ 4ի5{,(S ̲([>ە8VORRRKr.RBvZZ|>c6WZ~ZƍSǎ5o<t  � � � G%ǃ�G } @�@�@�@�@�@�@�@�@� 2"� � � �#0q/�_"#kt X܌3\wxE;PnqVZɖGyDo;5j[od9WP>3:<бXbӧIy5էj׮]/u7p:C瞓cIOO5vXM6M?-� � � � Uysin)!Ad}-] p0~@�@�@�@�@�@�@�@�[ ?z� � � �'HW_-|.yyvi.@ X_ j̘1ݻN;4]s5pڵ{WsOF,0_;w0^^d۷J "ѓovǯ\Rƍ{ァ]W]uϟNu@�@�@�@ l5=_ Ȱ}0c DGK;ve^@�@�@�@�@�@�@�@�@�Z 2{G@�@�@�@�B~;^yȀ:# {wi&w}<y4h3<SO>V^2eʨlٲ5ھ!1pŋed\+jlwٽf{vy;m@�@�@�@ @RLu?[ ,)݋ � � � � � � � � @�@�@�@ /i�i`ȯrG|뮻\]xƏzKÇWƍգGSڵ#0@jjΝ)ShԩZ7Tjʗ/ ݻڵ}!V z� � � �y(мhQ^R ܷ/H;O@�@�@�@�@�@�@�@�@  �� � � � O[I=vxPhڴ>_~E&MĉϪTR:եKW5j Cf e4c Wg͚DjJB u"ZTۺwRBt ŊIj!3Dz:R UA�@�@�@�R ?8(NS @�@�@�@�@�@�@�@�@ c`G�@�@�@�U7nyD߂uSh֬>Cڲe+M>݅Du]\:t蠎;}j}pa6g@jj-Z9~ٳgo֭[=aA/v*UdggtI6)#"z6MڰAJKe@H C11RG@�@�@�@ TZ\JNBeT DGKZ@�@�@�@�@�@�@�@�@� Bo&:D�@�@�@�\o'2哀]{kҥ9sf͚}qWD nZmڴ^ݙgK ׯO?~мy󔔔:rHuI7VDDI62RQW<#oIkDں=wߕobZȀHPdvD@�@�@�@�Fُj,^,uVt"%KJ{e� � � � � � � � � 'A +"� � � �+0aԿ4d89y!`AwM4q;tXz̙s/ѣ *@Ȗ-[E֯__ X6/6s&`ٕ+W*>>ո8�K[9 0@ڵSzrv8HN_=቉Y"A^Vl=%wVbRLTYmaeq  � � � --ZDd }{n @�@�@�@�@�@�@�@�JqF@�@�@�@�>]W@ X 믿 -99Y? /B= ,%5n؅e^ *j4'�ҼuZt,Ye~بQ#jȑ:묳daQQQ7RKO~fov{SSksTD-(jU � � � �*)5m ,ЎpqL GGa@�@�@�@�@�@�@�@�@  e@�@�@�@ \F2_?eԌvڹo,t/>>^/vu̙ڸq;hѢ.L~jРliᒵkUռ :,HR7mڤ5^իrJX-mիPN:iРA^b m^얱G{hb'))s,NB"11R"G@�@�@�@ /1-ʋi}> Gz� � � � � � � � @ 3ϸ@�@�@�@�L?$]|Գ[B2*XZjjvڥe˖˗k5^@:T;^/h. \UZYu*U"(23j[m۔eՂFmiY{ -`baÆnQF*[lh}%J Ïx ?C"<M/TS3G7NھwFBR͚GD#K:e@�@�@�@�Sh\S?3E%}ڻWP!GȘ@�@�@�@�@�@�@�@�@  el � � � xaMQz}ɂ( ?Wn[-_V+WJo??~+'h֭իF^(]MZVV-m%Q^ ))I7ovuF_߰a^MܸqcFУ r.tmg{p:]_WծmwOjG{/iU qezqj!/@�@�@�8A{= 'c H  � � � � � � � � lAی_@�@�@�@ ,kWeKO"ErqB�c 4yTH>+njh]xRCea .B�.\wط3RJ@ R[%UX eY|y.]ZZ`dy{񾠿Coߞem6e, O %v~ZZje 5uTW~i9RM6UϞ=գGm %7 In)#j嫇~/(rj_QZN:xw!H� � � �!` ,Z$`|@ x]!2 @�@�@�@�@�@�@�@� 28^#� � � �9ԭtKŋI@�cJ~+Me1z|Ұa {L)&F2њ,Q5j^}D͛7kӦMp@ؠtRJh;wTZZZ, ˕+jY/g2W vdɒj۶rcYhJNNVJJ[}-m޽[vrfjfb!fjV-3666#ӶO;4UV@+V,ٮ۹ po\(^SO=% }[(-m{6] -GDN(]+=;ûu< _`-zo  � � �=Ϸ a#p(ڕ~_簣D�@�@�@�@�@�@�@�@�S z� � � �@RtҡC9 @ O8up@I_?W/#9{tIw!)X`(i5ba\}vWm=spCzh+W@@D H<x`vB!mYhь[DBy…o�Cއى, Gjag[L۶ev71ri1mvڲL�MB jix)VyX…BNRFڶm={`ȦMf7|^ρ#ڥKֆ,/lYmsˀUzP×Df5e @�@�@�Ph\ő1&NMv@�@�@�@�@�@�@�@�: n0 � � � 3/M}JkHsHU=F�?,}3gJҹJ= [cmmniP'͘!լز`˻zg%-P!z߸e8Zآ?pbPF j:fwܰ/@~/ 31#:jyxxdmK-?+***#B*m;s-%Ycb[Zb }<+Y(ѣVZ.҂!;uB;uoTzyGBbWB7l1v [_eG@�@�@�> 4)M+A%wd?DA�@�@�@�@�@�@�@�@�M `1� � � �P;|as/$*q:a/|4q4apA T׮K^*T8:ԩ-"?Pꪣ,{- jrrcHI}jvZ5iąG4(W FJ.+U ݴ`L 1_y}\B;wv=5jCUJV;v<rXH@-;K0dȲel= � � � ͚I&,.0Ho7|(r=@�@�@�@�@�@�@�@�@ Aܐ@�@�@�@�xqM6E }hՂ +U.DIŋ))СK/I^+=TiUܓS G}T_=/a/Kdd9WGM6@H <xn6h 6!X; Ϫ+% /Ǐ֭F*VYQQ1Fz� � � �> LM-0RD,@�@�@�@�@�@�@�@�@� 2#� � � �$0nCرR^'!o?N$m ծ-]zҹ ˞gRo_)!A_).jȐ!zsoZj]ݿfΜ!?޴{ݻP /Peʔ 1�""5|/:´4?ҿ=۷!ίY ٠oi!^։}e*[ � � � SE_~!2:޽3F� � � � � � � � �#@d5#E�@�@�@�01C&#p))W_I}&M,)5o.  =ƼC_]^΋bbNp=:9YZ\z?y^[oU;v HkŊSn\}饗K32eW_}۫gϞ64J *$թf)^֬V, …K۶[ /P  � � �@alGYNT) n0 � � � � � � � �8 y# � � � �!.jtR>O`9طO:U|KnV1Bv8p@v_)'&`iiRV'vիW/pxw*..N,r\ƍСCpԝ>} |̐!CpYhNj'`!zx,2B;|yaC_HiY-� � � �'+Ьhɞ@tcd � � � � � � � � |8t疑!� � � �ڽ[^=魷P@p]ɓ>R:xP:<驧.V=w_KH& ;s9'3LS <_|QM6/DN(Wj{AS]0 /RJ .pݻwW*U rou9y(҆ DZ3|u SiC"+U � � � p< iQ@ǐڻ@�@�@�@�@�@�@�@�@  9 � � � :$/KڳGkx: ۥ |vXHj�^s0oԻ%ԨQ ,bc.3А!Co߾⛬PBj߾O>2B!u.ڲeK#4ʚ5}R+DJ-_ iicb$EA�@�@�@�Lqsd?@A %{OA�@�@�@�@�@�@�@�@�M `1� � � �С̙7HժI@ /O|F"҅Jo-]|TL ϥ;O?^*[6⤎v#Fпo 6L׿bazZdV$3f`7xÅnVԽ{w ٥K,Y2Ldo%J\-5sIOV,_.X!-[ >ݷߎ-VLZ3!! {dnu@�@�@�GysX%*# f ~� � � � � � � � ��AA7et@�@�@�^w瞓{O:BUg͒, ]ƍ nQzPܾBwd_hs /nѺ+u-]vy{0k|/Wmq^)S\0^kԩz!cbbL(<!ը^h H@䧟JWK`֬g@dRFZb@�@�@�@ Wʕ-"2&e+k/ў#rziGgi#{oMr� � � � � � � � � P` \@�@�@�@ O~AVi0͓K(-m[ǢE}Xdu|_,':%ҁRVy?+B;w֝wީy)222/Whٲ9R[n_|!GAI&.wöm S%M5*JIg嫙Ǟ*Y D~剺/۱q��@�IDAT*!3CںdP@�@�@�f|?*aP=7\ {'=?OK � � � � � � � � �,@d }C�@�@�@�NR`wo '8ɓ9 عS0A#믥b|_G =4jHC̉@\%5lVNܗ^zI͛7ky+WV]=xfϞB!?3=*_." y\r|-N ~RګW߁,r?~*ҥ}%H/oT#EDdm-@�@�@�] ,^?r_uk)6V}ۏtvC�@�@�@�@�@�@�@�@�G z� � � �HfI~8HL&MƏJ*TH^`K%J,�Ǥ7ߔn1W/{nnc {G=JUX1?.5_H"ܹcƌъ+\()St׺ڵkB!{Fa@@U \,1CH+ {+!K R?@�@�@�P pR utMAb-ZHU!� � � � � � � � �#@d=A�@�@�@�r$pҼyRR9jX$id飏iӤ4kW魷^}GUmWһt B>PEQ,T}ET TP^i4# oY7! dw:fsf~g,sRi_aäѣ A6h&dD^7.YUV-~o߮>C2Dwu*V ٺukeϞ=U#S\[ ,[cG rŊ#sJ?*W@@dGD~:� � � >kK6QΆ }W z, r׮[E%[@�@�@�@�@�@�@�@�@�p 2uA�@�@�@�R(ȑҔ)R*) wC L &OOڴF.X*T(*>qt-˥5פ_=ȱ'훶˛7~i]veըQ�GKP@ѣ_b݃c…>r̙X`N:D  XppӦ%x]ZʕG!QÇ% pZr � � �}͔IZ ԕf(`3K/ uR@�@�@�@�@�@�@�@�@� 2OD�@�@�@�{骫nwO|[")8o^ 7ZzJM*V,[;Kwޙ{T~ڷW^3fn89s洯G<͛ƍB!z߿xvCO kϊppj$į]p˥+$C[Yd͚G!%K @�@�@�}-_>٥Kh^$k{.Q &[@�@�@�@�@�@�@�@�@�p 2uA�@�@�@�)`!i]J6ɼ3#_]Wn]=r§}'|W4d)[[zkĈ.Əv].%lʹ eϞ=裏|0ѣ5`�.]Zl۶rmb+7Ըq`_mpH |]鯿[)x][ .i@�@�@�NEgP QjUuR6Tdu+:&Fʔ)x  � � � � � � � � @ 熚!� � � �'Z?ٳi' kJX~ATIWRzHIÇ_F Z#GKvU…ӧ"5YإK>|XK\̙32n8̙SmڴYldퟍ8V`AeݦMGD.Z$sg`C"-p) � � �$E&1#)[ )pgݶC@�@�@�@�@�@�@�@�@�p^ � � � � Λ4I.*mY@ l")5o.UޱWҚ5ңgRͩSLj- l v8PYd<(2eC 4`�}\xpMwqʕ+zt=_)666@m"ZxqQ 3ۂWKy_~y 2ON@K T@�@�@ ,rjT<F l¦ETG_ � � � � � � � � @ 0L9\ B�@�@�@�o ';/ Y@ '͘!YxYR҅ʅIQeOPo&u�܅S(`s_;nא!CԷo_߇ h&J,+/ק~3gפI4hN:snx˗/j!Y*T,11GZ?eˤ2zqc`Bu.-,fM)w# � � @ H 0HNA DM_/=d8YKӦRM"� � � � � � � � @ gz#� � � @عSCjRz @#DaϤW^MvڶƏ! q՜=[6L<995]+m&yf׽O>;v/phbJ ȑC{_˗PH dQ[ Ybňo3 _ F];į~ݑ嫯wK3K+iA@�@�@�!P\\AʄJzl& � � � � � � � � �"@d)� � � �+puAj Q` ,?$5h =ԫTd88:m"I6hn=NRn#FPÆ /+H&jժ%[mqOC0@7|jԨC!cbbԬY3tP ,PԪU` *6V&H6H\@൳^#5kJ.� � � e6@* (kA eIJ矟仲! � � � � � � � � A) � � � @^yE<Yz=Dߏ-H ۥ7?~tiRKBk#GFr+"~+'uծ{ڵ"PH/мy|(o!Cpر,sUAK F3KgXQ\eˤKOZPzEi)5Z5)~8]/Z4\A�@�@�P7>էD?f&a@�@�@�@�@�@�@�@�@ R3E=@�@�@�@ ]+pt-rT08tH3GzewL .f͒ڷ'IUS\IiӤ? |Knc2-6L`GyD '|2 !A [ljӦ_y^ڇBp#{[ҭ+guܹ s }Ai7,J? D*G`RK}p� � � kK'w]ؿbOܲw^۷/ήǿd{i<xPK;uz>|8n=ܹez~tԒͬͮgufdɒ%n mٳg /9r(gΜ~n˝;(/  � � � � � � � � p2ɄX� � � �K/*Wx" *D2B_ߥ-aYJ D϶mmI_/m= ,^,]|qxղH"0o]W]u{=v/Ȕ 'PjUbmbٲPG}ԽVY dLLZh  \UXz<RM|-i`ɂ#=n#Yc� � � >jIKwKyOIڵsmݺU۷oˎ;ܹslݶ=Иbhc/-H1 m }l<V4K!  K(Sƿ LN-Җ|nyϟ9)peA7+UBb6@�@�@�@�@�@�@�@�NmEyU � � � e._J˖Ix(;7So lY++dA IFU|PrcH5hP2Ħ$vc3Oi7rkVGӧOOc=]-6`|9s:tl}ǎevi)@R%X={モ, ,>?fo\0d" \!`$h% � � }ai q No ;￵�j~ٲeq-6щ[,X u 3<ep<.4W\>0~̙3?u r uqtǗG|[{ b/-(3 ҴcC7m?  BeѢEe{Yu;'@�@�@�@�@�@�@�@� QC@�@�@�_}%=sRj構y҄ ԩ />@jNnfT)MjXFI/(& N`")KnȚ5{-~N۷ל9s\KR m֭SOi͚5>҂!pijѢbbb|0d5y܄%4mXUUCZH}ؾ=_ʑ`H WO. xo.@�@�@�Bb@AwzWoKn>Z_ݗx *,P&20h (S#1^B~5-M[ -.i v/-ӖիWkйP%J<]J*%KJ0gm � � � � � � � �*M#)SB?� � 6>Sc p2I{SG�h݁PJY${ n^z)�ԠԷterCӢ.]J|s/-w^,3\E]~*i)$&ݥ}sg̘gٕ+W ٲeKe˖-]X.t鑐H{Rt晁 3@A�@�). �$ШtY3DP8ty駟\~g/~�͛7eg~K +V,/+W+`zbAॅoL2*],Wʗ/e W/I 6 � � � � � � � N9 F�@�@�@�Hv¥ uucN5{4n{RRR~Rݺڪ{.m m+A�kS|E!b)AqСQF[n% !"Y@n~_~fΜ!}Y;O;wVNTpHn.u�+Jtz.g@KHxq.BtY@�@�@� Ԫ%-[ lٲEklK .hEV2gάRJB,m۶>}3gΐבFRJ6&a%xO?ƍuָΝۇBVtBJn;8* � � � � � � � � l M@�@�@�@�3G3F2E:9&GɘnLƏ&L'}ˁ92׿]pY2&B:.0nMtaUh$ޓ2@,YԲeK<~3|0d?͛PȘU^=(^\:mPH{]7ߔ\q.x*կl pyD�@�@�#Pv`܇mC+~ZjV^mm}bAx6m ̚3ilIq׮]>B!'_/6ɓeV2eʤe�3\QVV׶� � � � � � � � �'tؕNޚ=[8@�@ :Ns^>5F 6Vth=X ۷KjɅAIoqc p.{LI:ZtRR)ktª4F6mr6&k H͚!S|[jU7R{);<C6oެJ*ŅBjJٲe;ţpwW`ni#rt/TᐖS) �dHP/eH8�d@ߵp~ו"E2 @6k}_V/[Na˗ ų`ʮ.+T@N+֗u[-k֬jVC!kԨ5kN:~)]tV. *+`l� � � � � � � �!`Q#@�@�@�@ t"YPȑ'{B6nƎƏ 9:tlpSL TL`PEܠEi֭AbѢ@{ɛ7x z:^w ^[n~… }(C>TݩS'@CDdhX طOZH8_HGKKs!<3i.;p  � � pj,_.n I&3XnEҮZ}_ݯYڵk.Su7Ajm9s Ua+`}˱ܲe|eŊ1b~i…} ݿA:uؤK3g>vW� � � � � � � � @ "� � � @ ̜);r!OV{.OLfB_*^\Jꫥr±W_L|n-~xG H ʕ+2޻wo;R7|>Ȩ4ܼys <X6l ߿:f͚PΝ;{PPh(p\HraW_IIiuʅY)28( � � @(]Z*X0= Ȕ=lb[kdgu+V̇wujժCgϞq/\&iٲ_7u۶mZkA,X 7h7޽{bM6[Jۋ@�@�@�@�@�@�@�@�(`HT`� � � �%}t5DVݩm 4~| 8iFM7l¯P %2=·}YWL2iذajҤ =zDJթg TPA7x_vܩ>@3]rO?[+V111jժ"ag+`hW[pȕ+~ao�Y5k_@�@�)If:w&*ƍk׮n҂FjРJ*$*P%i!Wv<|�y4|p߿_eʔYg;&ñ>y  � � � � � � � �$@d4Mڂ� � � �/p矏ЀtpcW5b;R|WFTIJE&N ,[9rЖ-["Sŋ /؀/\wy˕+Wd5F@>ޭ[7ʂ f̘!w ϯs=?;u "T,Nҷo`p\8K/I{Ƚ'INj܄� � �/`A˗G|3R6gAs~>#-XM8pP5\-|^dV v� dɒ<Zc>}hҥ/#WѢEնm[kN۷W7 � � � � � � � � iAF � � � ,4uTp6ҤI /H˖IMHKݻK9sAlsJKVHmݺ5ZYNo3÷'U%2D=Љ6vB.9sfYH-8ܰa`B6mC!cbbW".+@k bᐫV|Y^~pȆ rd � � �,P4mZ$ uu6Ξ=mwjӦnVjJ  #@67Md-'h!gꪫ|yvY-[TVE� � � � � � � � @ ^"Q]@�@�@�N sctRnFZ:?()M(/az#N!AV DV ivYWziqdɒz ~*[lhH@ t7eΝ3g;:tUX1.lP5h{/pᅲbr!jUR@�@�@�YSڲEODv+yfz7g:hذa:sUX"@ X-6+Vh֬Y~>|ɣ .@=zPvLS@�@�@�@�@�@�@�@�B$@d  � � � p*>(m&©fX#BR*R$(woFOSD¹WrJÅ rƍ;SzH@|ԵkWĺ7 P3fWuy`Ȏ;@k#`bK0Ai#_~)ΛWj@Y)S䴙"� � @Nn|y 4}t7YD?)F2etE顇R-\?I@k3@McG!={v7iZO?iә̚@�@�@�@�@�@�@�h #Qy@�@�@�Ea3%KFChCj ln04|vԾ;RrYSc~*m,v ֭[T FRs\3ϨK.tYg9͛eڰaC\(.EKm֬q.@ du֩X 4iٲ#s>w Yb#<@�@�ťE+m#ڧTэ7ɒFh„ .?.͟?_M49rg,ǂmٷo4i~oQ{VΜ9#a@�@�@�@�@�@�@�@ C0<<Cf� � � �*rtR˖R0&\JO`:ۤ2e @\)}\!83iaP+AG,RÒFrY^t7+666?)P�=gY*DzJ5jpu뭷O>K Ae =cŋ% +%ҥJ*BV:v|P.d@ E3@�@�@ ,j֔/˪R+\ڥUr_̾9R$2 =z0_~ſV 4He˖}kF�@�@�@�@�@�@�@�n :@�@�@�s瞓ܘE#e敥zi.EIg!M&=r[jҼ:Q}@& r_,r˖-oz* �LaT:@9¾l2ixT@˧nݺ_֟{նm[+V~Wu֔{"9rHK_/M }] /EHSH^(*%.c}i'j#� � j~o'7ne]+s.ΝC߲Y?'Pxq{Zf[5j}]~z'?ے � � � � � � � ��Agϑ@�@�@�@ C}IUfp 'p+Rz9H%@5;B6JaYaGﰈKv:гR^;w~蝧_ӧOW \@K 7RRݺG*3|pG R˖-uС#+,XVz\p.ҥ[R  QhѢ˗kڵ8p6oެ}Onڿ^:Z]U >o՛o.]@Z[ޯMs咚7nY4I{GI7$e*+{dA+KzICJ.M%%'{nl}J}@�@�_f ~!CF.g1ydծ];Oj_~ѣ}'%y|r%<?z$t[8'ݒ%KdJ#$vqxK/}iXx7ˇMTN}jQ@�@�@�@�@�@�@�@�Hg px@�@�@�ȸSt=׀87U.'٠] Ǜ?_n%ˑmZ?,e U . ÇXܹs{iG;X~~rivnܥ g…~ }9sfpUXgۯZ*Rs?,{%HX م} -d|z'TZ5URE~<x0Qu>+=n8<ם~fpxM 3/ ڶ[r}VO/`cig=&۶V-UiH믥]8sd � �O]6_Ԕ?M^Æ Ӵii`7dӦM/:5yǎ{~͚5K۶m ݖ>`||քnG,՗.]95s>͈}Ti}8 rjŊnŽ^bccåz@�@�@�@�@�@�@�@  O:MF�@�@�@�>]>KQn >ԳnRÆi]y< lLʑ[ >M�֏?8.jժieny5ׄEVj誔.]ZJYg5jhGop~VU ,A?W58.!ȟ?z.O͛7O]t9XbKkୣFRB\>{pxM 3#^/.2| CgS知4 |'ʅdD=7O>c(J@�@� X> eÆ j޼<&-[Cۢ]Ԇ |$c6+߿ z$t[r-̯!~~Bf*KA2e,X&G+W֙g+0W q b)�icƌqx9qNu. � � � � � � � �/@dcZ� � � �a>MraIR6aV9fIz  z@(dU/M(R>[2[,XB4Mv7+W.Uԝ<(-Yr|-[k՜9sdOVrέ.y+xߓmZo:E 쵭e˖z'rJY/?-gя?n}6-Zԅ A{AuBl۶M+?^~/X<X#Ti@{ZnA�$T]wIo)mby@;@�@�B+Qɒikǝ1c�!Z-T3r29͚5q{[Rs3-̝;wmu\&,p[ Z~pD]I>M]4q3sXx姟~~u?R@�@�@�@�@�@�@�@�HU:TC"� � � �I` 摆HAO>xBC^=饗K.p-LKxᇄ iW,XbZp&Mއ wyܹڵk]P9ڴiyo?g믿]{V>}0i!^wԧ.ʂǏs=ÇkzSO)66Vٲe=ܣ>L_\裏RJqw* , 򪫮z_+o޼*_d_^K.U||؛jY;f7+XY2e_fe7n{1ۉ\ _Z_�e k߾ \O:p<J^gnl߾ݿfYH=_- jժK-iUH;αqo@{ _mm_F S&JrejYer7=S¦%ɍK4j$%lDE&p'(l� � j֔;Vqʞ=pm[oS*V.]su,oRJB _&ܹ�vuT7v_l 럵(5m4wN4f7j:9ڻw }X?L7ˉ-ܬ\y啾_&y:6J eSۧ#F̯N:Îl/~ ڵ?W֧o7o.ʞ[9suygձcG|~cǺ[oتU+fuZyk}k6E]D?~(� � � � � � � �D�ˣ4@�@�@�?\5 r)Y2GRG7t0>:tHפ XMO0r˖-5j8=zN9R={pLZ 8mχ,YBm ~]^+>͛CVZm J߿&O۸q>6PkYȚ#ׯ/ _;whlVzC+-eu߯.sS6k,@z \~4ۀc v/n)tiv7Hxk.u\.B8,X„ >�ӂ//]q'T}һkvm\~g㧅ZH-\jL>/.ka&kS'?~b%M .qyr wo~qomϒ5`@`!)a.pևy � @: XW_CtX_~Ys^C/Ocy߿W\?p*Tpnmr/Fn:XB?5k;w۾,,c>c VNj냶ߤf"vi?𢡄A_pP`HMd- Xg'v'kfΜ#IOJU,+`m^`kVcǎuIuR^q1?v.O%t1dIYj7fo-IiCzlc; f>}  � � � � � � � �i)9-Ʊ@�@�@�@�.pM tyq p4qT܀;AoA|Bd~ <FE7 \8ٻwo}'}ԩSK/DSO;`˗/ AI GtR+-M6~Ъf፭[Z Cjׇ͛H6ւ!ؠ`d8}饗XQf)Wl  ۧ VI`nK ,[RM bUm0oJ% T/-y@e MO-�מ6 ̵{M-^|-k%iǾ>ƿצMo^A.^וp"$>/.-ӭޓ{>I۶J}p#!>(66yc8sdS@�@ KlV9sfYGΜ96g}l`p?X .\og|7w^}~B!ƶ< Xߎ㏻x?_NmNʱ &)Xl" +RS&>&M(_|nK9ہ1oݏEko yrIDڹ_7zd=ȊR/gZ,<^Vp))�H Ѥ � � � � � � � � A8C�@�@�@�pc|q9oGɣ9s?L԰aRŊryRӦr䂙ƍ U+Fʕ%w۷ϝGw";[oŻ5x Z 6(؊]b}L4 �Ɇ ł+U۷mJ*//B%=˅AZD0m.m`W_orwݮ+WN,fChAbfΝ>TlڴiqΥZ,2xv?V.R8w޳{ԯ_߇i7:Kp}8\믿^>Xu=,XBu^/5s=>( (;w_;s NCK%`-5bA.gB H# G?D\0 � �$.`p;O?v=u/޼yﳜ>}X+6yY~=z>��@�IDAT` g a I~Gw<Jٲe}]YJRKRrQF JmV ؃Jޖsߩ^ڄPoNsQY|uY|>lݩOvW ,ĴL2~9NDmR y?Ԟ={Nvר[~;4@�@�@�@�@�@�@�H7{E�@�@�@�2Yo_d&-l!Y2Dw풞zJ.PO.JUZV8Q^=CD\#x[t.\X7nAm[d7c5kV zjKD .VҚ5ktwmΒ@7Z7n|'լY3mݺU_֭{@Sa&LPɒ%5fq~I}dߒ%K|l Miq90!'ONtW׸dU 4+$4^C@{,_B K/:{n7|}Vj%J+Z -%ih+`C/D:T7O.LDroo )-\B.C.4Tz ɲye -G�@�7ǂ/61Qzl>裰n%˗]lذA\pl⠽cP"}1se۶m&xЪU+?NjPqbۺA'Dz-[ o^_Z׏c':$t[pǞRz̬_+؏܏տI&`{p]2}P]c۷y 8P/=,X_=TUOM crbO@�@�@�@�@�@�@�@ 3L@�@�@�@  <7>NCyu8`l. $//7MrsBvҠ ".1ѐ"E Ҝ?QG)mIXXYԁΝۅ4q/ׯ_z QF><ӲeG`Xvr!5mT|0r@@1o渻ٳG63eR~K<AcǞ`~a=J9 VP+ROs9zg|ʕ+}Zl E!#FO?z=[Dʕ%4!TYH.CEW_-`Ϯ-^78{jM`AV-+傡%{>x0T5a? � � M"[O&-Lõt_&Y,̙]~"&�bXl=4{lkmΞ={"NS탶#cv,Z(>\Q:P|B%T&)_~9OD/8p^{??|_L>up _~m~Hsr � � � � � � � �a.@d � � � �'plYiE^{,Dǂ+TnAn0_|&J l$-Ux.\X|Gm7o/J 2<jQҙ\uo,X;ĮXУ@Ss{9M\p>0٩S m.)*66V*Um%KcO7n-W,[B!|wܩ{ɛ7, Xp0[quu]aV3@ T^?W͛fǍ_>[Au<kIh„ iPqԅ}ΐ\ ,.OZ;KɅJ=Β CL G\0 � �LfMiŊnSO=$'\=}gںu k駟\r]>l߾na;JPA)Ss޽?ibZ,?oX]DunNMro`Ϡ}B/ʕ+n}r}-xv4Is믿mY-6r֭L]v!'Ovǎ@�@�@�@�@�@�@�@�X s!� � � �"ple~-+tST@�gn%cLP _cR m� 2{l-Z4.دTR~/ |g?ۂ/ꫯV|4m4uAG_K/T̕_Z*�Y@/_<m,Ҋ?s"ر_o˶[h!z{A[?vK`FmSA6lhr-(4}ٚ<yrkyfu2Dw+m�O?7]ʖQ@ i6XB,֞sZ۴iSqWwa IktnOYfEgiU .-]tF;WڶMZL1BQC0f~D i"U@�@�@ ~ʤo[<}/^  rlҤj΂6Ϳej׮]/?5h _e`X{m~}'[_?'ʕ'IJZZIXIn/Ƃ+6~o?-طmc۬B4m#(c{$tmk%s"4H9|p?{W  y}7k`}g0j(=裶J3gz'{CͤҥK;K/Ky˖-qY$cwiM2c}Æ 1]7(dg � � � � � � � �Q*@dX� � � �'Xi|iiP}W'i7?�BBs v|P뉎jd6PZb޽uWƯZiFXשSG-R׮]e}mgvFO>Rmu]M82D&Wl d=Νyʒ%_ݦMU^]?j^xA~͂n.۠oѷ[oU=: c޽[wܡZjK?=2]X{Tyd͑kSƍe;ˑ{5 l߾ J @,֞C60{K󵰁o}8=ƌ#D` S4^=%K, D.X.;eIm[Bm#Ǹq�I� � �$ AFWB-X#֮]i=ߵ> ;IwƎ{Ԥ<{Qݺu}Z(_>}1,&ɂyX`0G&K,0)Dz~au9&PɉUVU9R믲`end[{ۋ/֗mb 7m &vnۄ&T~ 6nͻ=~XlԺo0i6oŊ7dW˾+{E&9rdMdKjvN4W\Y:uFa[l60*jsj+qAJ � � � � � � � �/g6wL7~:Z� �d wüOÍVF?1@ Aٳ r yIpSn{%7MO>)'7hM.H9}'>'ć$~ ]P˗\r.%Sb] ^ls?vڵ~jŊ剶M;v(W\ʖ-[naѢE>ea6׎Pm5kTR%?DK;wJ Jo)]tQ6dɒ=zL~"m{X}}GZ/(i&Y 3@ (&&/v�o& p V!'G *o^aCiSIriiU+�D�Dy @zX7eʤG B{L:smR.R*UB{m gΜM^p,'M`x Znjpq+BpTU _~[X�az7… Uےsnv+8^jvqP*O<!waDZ>Bnso ~;CZ395~w|MeC}ɹ{uMwHӦ#IwdtWsp@�@�@�@�@�@�@�2@ z� � � �@0W/ae8 #uW 3 !RY?%? ݺukFE\k֭> 2M( `?8x[BVol%:uNbxƄGV%CvtI'O Zj_~ԭ[7yDk Rŋ=l'|ӧk8pJ* imGqO- uv.4H8{jȐ{pH¿@�@�Q#Pߕ+h\|Ϟ=u׬_ͮ׮];NNo+oPm>Ǯ;v ]>~`Ċoܹ~Sm2!+ m=Y;ԫWm 't[pfswRL[Jv)))q͗/_ܡfMOq *;X8[o\6lzq~  � � � � � � � @DAi � � � Zn,/I^+լZGb%pkҀ?Σl;ih`jՇ@R mԩSSQW|M9u`K/4irȑƿyZ[L{ygt[/`:`˨Qd͘1/cǎڵ];wVɒ%#͇7|3u-^p5ksG"`߅ ,W_ǎ_!JzI}PضM R%)Gm~v_0.\FpZJl� � eX!u=\'X.]e˖\@Eʖ-[4v˖-.kWj=F\]ʕ =s]6lۤ';7I1`ŃjgzqO $f̘1ڽ{?[dJͲn]`A2F�@�@�@�@�@�@�@�G 4憵ϔ){A�@�H˻yԘm@L}T@ Z͓ lOѢl׬Yr˥>}壳U'*%MpbzK]v=j{%{ƾ}Gu޽nz ܹ)~caX']֚5k|{ðT 4sL ס}jԨҥԩRbccSTNj/XӦMK}X^. H8kpYڴԸ\@C@Tj߾̙ .>.6mJq㢦I5dƍ1bߝLK.q)\|:ٳg[o'zY?`ӱV878Ghw}�6ؤViQysZcJ_d? � � � � � � � \ + � @?fNs$@d -ಅ\tghjEҝwJsJ\8w5jDTl2,`ȖgI<$*HK<EN,J*ԩƌqD=?#?8ޓږ+W..Vê\aԷo߰ATG0H .6ȅȅ6B!=sS=bƌY ȑ#GU##@ L؟"*�7J`AXW3$}෉'2e袋.K-am_ ,O�&S6z}^Ϟ=կ_?y晩|wUr@~o<~-�߿P/@�@�@�@�@�@�@�_ k7"� � � �i+0vlx{q9Z֯_z@̼yR˖),;$EIM~4I!sʥ{Fэ̯UVԌj qyһm9|[a!m/{ȧ:6 m-ZhΝ[{IzPB-`o?/< ݁o 3$d56D�@�HJrgnݺe> b�Fn߱cG{*VX72gΜ~;')ъ+4k,̟?_yq])S]vʖ-[Jw}[Tr@�@�@�@�@�@�@�@�$S'Jl� � � �D 93r럑jn!w-U.$M*-X@dFz )ϟZ>m+)S&aSzԤO>[8<D�x܋RF裏j@K<xvڥZ%JpA-5dZ*=*AiW=tOH~*m.-Y"<J|~Y.E: ɽWi"{bGA?m:@�@�NIfg_=DܝmJ}6h '馛wz[oAl۶-GȨ֭ueTR~bqƩ~}ĉ>5=C /Ϩgv#� � � � � � � �$W kr � � � �'.vm$r=N씞kƎzH$suRlY+/_zc~u PmasC9眣9sC#Fʕ 7 3fO?키VJԥK謳R֬iAa *i.%2[ro*Y…җ_Jɕ+8ݴԬY`)Y2ͫso'2AnD�@�@\Rn#j7\c^rȥ~9r ?.1E~i޼*VQmDh,p}?~wYk6m#]vPB5bi>ɽP@�@�@�@�@�@�@�@�H@ڌJKRU@�@�@�l7~ ^]ٓ p<,|rNҀRF Vuh'A6n{arwq,Y,rEA�ț7vX8PӧO> ,;PHSZ7R {kҪU`H 5K.tYrO]q$"-T2= H}Qo@�@ 2\^,}ȨsjI[w \R}7o>sM4I65j(niРJ*Ucdh i]zjp7L2~|PZR pk+sq/'*VLZ5kI@�@�@�@�@�@�@�@�I p:@�@�@�"VG[:|u@3,d6H.VtQ7j~JY!M`n,LC Zjiĉ߿֓!9sgNo?!}:ٲ/egJED*m&*%$!&D&$M,BY}%D?̵e-~wyn|{9yթS+֬YBZ0]wկ_ lժJ,T6 IeQ(`y.+BK޽RƌW][ʟ?( H `B�@�@ Al#RdhbO^8DN8Q/ ?5 ʪR*U+R^�طo~Gޅ-[Ç+s:fպwﮚ5kzA4f H7&@�@�@�@�@�@�@�@�-ibF@�@�@�@IKH|A^+^9rDOrk*ZT6Mj<Zp8vLJ.{}g?|FGd'wEzغXW{1ӧOB֭ʹ lٲj9 LDdRX6Vf7X(ʕ!?T4H.E*V`H@XQvcOq#� �&`A.ې)iҤQŊҹsgoC/^E>ei옞]-[VKL2!w֊+ZȪ@nڴcə3խ[W?Hf)mn{Ki #� � � � � � � �D�AnW@�@�@�KxYN N@>XziNOGQ;D �eJf ʕ0owzw4`�=a[�Ȟ=n65uTM4IWܹu7zM6_~j.AE%*\@_:t9p@my⾖w1TpZgʐ!A$@�@� //MbSW÷UViҥ^Y|}]/:~wb.a+<UJ*ݷqe�%.pHYFW Pv®]eΜ H->vz*l`>w,uE�@�@�@�@�@�@�@�@||>C�@�@�@� Ҷmҋ/ ]vd"vS [@%z4h%?nhwn.S2 XRJ2mz)Kҥ JbT!i]pFꫯ*.. `ȶmۺ bVZE*RH\,NgB� d*5iWC!ϗMN!]jז HXx@�@�,P\ <y:$\-Ί] "0^@[-\ k)nJ: *%J⧊(Zw P'a_^k׮=U,t^RZ .셝Vt;7|ʔ)#mdK^uGq"� � � � � � � �C `(R � � �Ĭ=Cr' vNѡC1˒"i`wo$3KhI# S XdZfciĈsF)ݦ r.}J=\.*7MSL`r+WV˖-eW_}O m@΄�!}: ͱr~Sj1g}̙5NCvN\^ ҂b@�@�*&M( C)mʹ-q5kڼyX" +EXCH}xev52& ~mٲ۴iwkvƍ^={N`ǣ,BLkvyqɒ%1cS['MS 0n@�@�@�@�@�@�@�@� X9C�@�@�@�9"=i!L#RҊ{aG6D@Zwt },hGHiNӧ:v( 8&>ܹs뮻ѣG_jԩzπ E^(u.̓CG#Y&Mb>yRZ\;/Я|2R:!-%m Aτ� � @(\l;ֶ[&-Q85ki?j [~gg|iw>kٳˎX(d6_|.3{V9Y +رOeEEnz),hG6l腑Z"Ex[=;|n;<� � � � � � � �  #� � � �ػW0@Mʕ3g 99_}V2Dj@ZT*]:Pct K';c Q}dG99\;C=zᒽ4�*`pM6ʰa\XM2[G@6nX-[! Lַ;VNY;ej!:73AE@�@� X(y\\* X_ pB[hEnٲEwf駟;w qV5v!˂(6p?gΜʑ#ǩbᒁL,Y\Ϫ8~8p,^CłAe׮]ZhhŊO(WX{-uԡVL=nTd`B�@�@�@�@�@�@�@�@ !A&Dy@�@�@�@�3,H΂ ϝܹusq0_W,l:v f ؚ~pnRn$f'p)_fϞBn]-Č@JdW^^B>#ܹ} Xү~&/oqW?"njzN^i+N}^%A�@�E\9ihMl.Sɒ%r1'Oz۷o!-$0xuN Zؠ;YAf͚U iV.S^<쮎f1cSg 2Dt.ڱ+w{a[á=woAgݷG+nmM[ ,VP=6h0%{ exiV@�@�@�@�@�@�@�@�K z?  � � �$֭kI}ȝ F Iq'Q֭#BU;Ē;g՝tK#NZd)ߏpA&M ݻkC@  (B;ył�fΜ &h^XdѢEժU+l M@ ҤVK׮~϶mKs'"Y8[oɅHyHkuJժɅh  � @$ XsP;ӥ[)go|<' )ܻwW,0Jxm p̖ <]͊8qDZM箲fv,{kYIv%mڴs6  Swbg޷G1Ͻ >wiqwA]=/X3ihaM=~O?r'^V)6رr]wXh@�@�@�@�@�@�@�@ 7#� � � @ t҃3K5MRr'"JKݖX o 92~ P*U:>\D@ƌG }Ђ jʔ):u ' h֬ ټys/L z5-?Ԧ_l$.cD9dSrA(~d:~8ݺ|X&@�@�$Pyt5ke.\8#CDZ@p#Gx%haǎ;og5p3~ԩi[97T2n <~ d,vJ&w@ټ9nEZb^~Y$RA )m+[ � � � � � � � �a-@dX=t@�@�@�Q`z7N:-`_&\CQZOTH�AIK;wJ"լecq+̻ԳgOƅA4(&@ JJ5jK.|8@H ر,nݺ^pdVTti@ +vmtwtZo$ i` xqt0UWɅ � @ +w!.r)f@a9r䈁^|EJsH?./G%w4yx5>\ZL3&Mo@�@�@�@�@�@�@�@�GB罠' � � � !.oG I:\ٲI\u^@Uҿ%rDdbv.=ׂ)`qyBLm۶iذa Yy@ d]jƌڵkƏ/{W^Q2eҽ{w}W^Hd0\"RC1Bi>u\niv驧ʕ٥믗}Ј|4 � RbŤC #y,.*7n4zԠiyf䩈ߥk:b@@�@�@�@�@�@�@�@�RX ~h@�@�@�"K`Z魷^i/Y/:\ZIC s{.s _ܹݻ;7%U R�N rÏ=\ p ,Y[nѿo lժN(o޼;5aZNj%8yp4zyGjΪTIziX_ft@�@ R!�"n]ZݰJXX9Sr_aB�@�@�@�@�@�@�@�@ A&@�@�@�@  йe#Bu.eKg 12@Bro)yϗjJ'|RRRKzbB� &Mկ__ Њ+rJS6lp+O<5l0_>53+T>Z5֭r!~`w(,)/ҠAs;ҽ}@�@�(_ 6=(WN[c1RK'N;#I.pRfk� � � � � � � � nA;B@�@�@�@ l~Y^i/M /sW-reiRi,1!tܹݻ^-GNh\ <%PqC ͛/17/#�(]iڱc|MeϞ)+Us{ou W+ ئ4p4wt4gz/?.*oe*5h  +}gOXN!� �Q/bT�ȜYz]rH\*Q)]%  � � � � � � � �I 2)z,� � � �1%`'(!oayiK^+U&T9#/m[pꢖ ؉FDŝ.>yw@� ̙Swq>ܹS3f5\BQ͚5uWSN:u>C Cn]{w飏`+#+eK+T:w~[ 0!� �DA['9]b4DH|#Z%U"͛#~<cW#� � � � � � � �C `(R � � �DsIi\zA^9nIz_??1!RqC}B ;LH@ǥ[KL,�\P }jҤ^{5 NK,Q׮]tRnZrRV4zhL!y(]ZAn}ۦ &O!q.~Hi# o= � � 'й  vAŋJ !CyK)җ_J'E�@�@�@�@�@�@�@�@A� � � �Co+on <vL:|8~\8R02sԽ{,k0(Xom˖l56۲ H[BuUB=ӗ9@�$Ttϸt h:tW#<+\r͚5շo_-[, (yU˖+H_-Y@ܹ>ɓ.ծ^svҞ={� � _Rr\_$ḃ@!M*ԭtґ#6$N.ImJ%B�@�@�@�@�@�@�@�@L > � � � pƏ}VJϣ)ٳw yꔀԪ%)-Z$5hp% r@UҷJoI;vj m]gJ@jKi<yWĒ @ϯOSLݻ 6lXb?܅t&h'ivɶ_]*SF3@jJʝ[*_^Iz-i6G�@�^JV2@"N U*wiM"n1.� � � � � � � � @0@�@�@�@�Y嗥%n(suy9*P ҜK={Jw%)eKg)!m|t%tM~oA'OJ0:ܿ7_ryjԨ|I͙3'9-@@3fT˖-rI-\ :u^{5e͚U͚5^\зKfB�J=CٳG;W./cJGHyJIuUHE� � 5ef@ (hTXԺT4ieÌ['YhD#� � � � � � � ��Aaf@�@�@�?% 5JJ& Aebe?x@׿nbe3_ӺRIǎݣ'**+֪XL.EF<y;)؝̄�@*EjEV^rIF)Sd;v] \=/UV.DΥ1!@TXk~=*-ZBZNu~g$BZ@drQA @�@�(WN>="NR;V6L)fE�ȧ A@�@�@�@�@�@�@�@�HA} � � � @ TUBp ۽;!KEH͛KK~Hd5޽ $ #=72t yRbR:?[nEO? EY?f̘;wjܸq*\^~e.]Ze˖U=4ǥYH$D@~OH}$ ICۀ'5k&!U,u*s7F#A�@�"AiJ-_@ d"?ғOJ/=ψU]4:5��@�IDAT?)~0 � � � � � � � � 2Xԃ� � � �Q'y4fSRڴ ͟-Agm.5h -[&}Ժr ( Y@'CߗXj k׎~}ի[o1Z@�(5kVmVvءٳgE. #կ_=ܣI& @ ,dcGmh6ik -)" Yo/!-]J(Q$@�"W\9i=G VBs/(M(w|EjXK>ƹiPPz¯@�@�@�@�@�@�@�@ #� � � @w)OC5+kW▍~E[W.G;WZ5Fx"EG)s q /WN, 2r_+TNϻL @ IF\sUViŊᾌ׬Y[oUsVf\mܸ1LGA@ ImHo/r3~ZTIʙSj\r.DV:|8-< � @@ºmo_BKDXxq9zhqyJ1 � � � � � � � � 2آԇ� � � �Q!}rA5R˵݉[6KՓeF*Q"FX"M kV<)E^uU*|w/Ax{9ٳGÇEԉ�DL2޽km۶MF_'|REqaUջwo-ZH'L{&JLFgO̞]9Rj߇][sC< -DB�@�d '[4�A_ ҥƏBTo!CYwޑl_ @�@�@�@�@�@�@�@�` \t`7E} � � � @dq:%ϹrTlQJy&ޓ%JKRƂ,Y<$N`\)cFr-R}QO�@n~wkĉڵk>SvocƌQjTpauEӦMӑ#Gtt !`!*I=$Yƍ[oIUa7O//up]֩@�e%pD@Μ~;Lv.!8YcZ�YjԈg@�@�@�@�@�@�@�@�H 2%� � � �*4re%<yb;B 5ʕf̐eK%K"L\C^} ̛'U.M:X=zp'Ѐ.< � !C5kLÇ׆ xbY}Zh! lӦcǎ$ѣI @ E'#FHo{4uԪ|ц%$ r6i0C B � v~ŊHG 6Ҥ"vo- *YXoŦErz>m[A駓E@�@�@�@�@�@�@�@�U cg � � � pA?# { 哶m׬Q7LڸT4mtQ7D!8B.TJ,̺oAkY;ٳgדO>+hQDP@ /{ ܸq]> (uPKH<JK "F GW^̑_}%u*ԫ-o5o.+͞->1C � @ʖۏ y34�!./s­[CXV}dvc3GQ� � � � � � � � B3Nsa+T� � � �DD "2#e͚NAI]',)})SYP؉{I'NNXc%M`>r xyeɒE/ҥfu@ " ,.]Ok.M8QKvT|y*UJݺuӬY\r}VZz_~n[K.  .2HKO?w--Y"^K9r԰rUԣ4ugO~ � �/PdMn׊ "Xqϗܵ.Tti& M"wH| K � � � � � � � �Q%@dT @�@�@�*IH=Ԛ$ ܱC:y2uEJ viӦRҧJ_)=(Ь6y"DT#2_>cƌzΝ:j($^&@ 2gάnIcƌѶm7oըQ#wr~^o^^)S(�g}V^{WygI zmyøqƍrFӦI[*JcJG( � de*\ @ /uᎍpyw+ &խ%b � � � � � � � �a-@dX=t@�@�@�S?{ IziuZ8b,LK-ZHG'e f.0h82dO1K=y.c ~w}*\z]_ @RԷ:uW^?W^ڲeɓGM4СCOZɓ6Hw=0{aA$"@ -*+)o>eˤbŤ"ENOu1}h@�]P!)KiŊdo@ 9rH}&w ?}/ht=:uJ|=,� � � � � � � � @BL"� � � @T /m$uaZM۶ɓwKV'(ͣel$PԦ? Tit); [7e+MV}رc1!�1(PdI=/c3Frs=ŋbŊСB۷O͛7O<cǎ:@ zrZ <f͒:wC"{)wnukB }.D#A�@�ʖp@�hH^zmI>(wl.|-Kq_io"L � � � � � � � �$@n Vkm5}Aj@�@�0Am5h X@rK*Jwӯ{% 1Cj$8uk-?/@^{m~! ڵK[lў={bq=_Uwj==zT0( JΦL.wk\~ʑ#[s… +SL1}=s1MlCUܗXbG%[4�}Ϟ=[SLq~`c4i>U8q,X2'>9t7?|93臨ml;L;ݗ aB|ɬRN}80O6ԹT2de]敌3u߶2goLJAk̙#,+m/լ)կڵ&C E�Ϝ @6-xuRqҽJ7 w _&<z޽pQ:rI%KxޅFиR+ � � � � � � �\Z3e.m � � � ~*4~|2Mm[ ǚ>DzEipp|bOf-_\qqqZz6nxX0ҙSwV_̿k ?@H8p L:38_$W X:spH ,RWʔ){@g.֍R_~Y7xw\V'B�[7n앏?X Lr?zaGVv.0gҞ ޽{Oݷ6mkJAkxɾ,`т!Ƌ;ZMt=o'Ͻ(  iܶ 5kVgwiԁ-[S-۶l&'6u~y1UNCZZ]D" Y;j9@�@ aJ/,zF@ v$?aCbH'^~.jR8quB ft � � � � � � � @x  B�@�@�@�d8PjL.% [ۖ-3j[^.;їX %Kh^G{,B/kT8cea@9\bkZbV3Qt.i;v88>7{*`" ^j֬%J$p]h\.qk_7p$g}V3gΌA2*@  vK.mVڷo3f^B t6&ضΝ;r@ZNxfhݷ`B thY%SL3z[ )iU izy!J 3pkA[nՊ+NjZsd~̓'+ {ߥeXl)6Jt/5xtT`H ,Z465 �@ٲ׷D.CC@-*v=Hv1% :]p׸_*wA1髯a' � � � � � � � @ o1D�@�@�@�K ,Z$}\h֥Lvƍ _.8~\v+##1,qKz/^NZ N`Ŗ-[B ^Т@ZHR|&~3%+Wri8,]ԝX.eaPsVڵոqc5iɸ$,V-)uDv^RÆ QF: �_`ʔ)^B/o/B={7oެ@,9Zt Pnmn-|�c xykV,3Xm'۷O(\|�O .]:/(B!m[->n!L/`7ߜ|-�zA0z? @�@�ppL Uap}@�T)? 򦛤uɓ#sE,Vgp@�@�@�@�@�@�@�@ yRXNŒĶ۶+$V � �a#0adyj -2d=ܒ*XL W>kN7$מ5+#-\ )ND[nՇ~iӦinM%JB뺳kԨ! }H>>{ׂ ͚5KW!"k[VӦMH[bRǎR^_z3*F�$M^z碅pgJ|kM&ͩ@`/_>&TǴi_|]q> H  mR PgZgѢEeV "f-^ẁptO#rr~7?&>T i+Jc Eyx@ .+]2I/|s"+a1 N7q6m"!串@vR#"m � � � � � � �D�g!Eʠ@�@�@�@ K'Jo%6_̙ [&^Tz_?B #>ZΤI\3g2f̨f͚W_ -T'&W:uoL}-]~jժ 3Ȑ!CXe#>[ݰRHK굀O>D7xc f@�常8ʕK 4٣]vyҁ^Z1,TR^=7oވ  X|Zd[ܱc6n 6Ȋ=]9sdɒ+*hNHd@)o/L/6+E!_|QrAʚUrPH ^]J>@�@ bbű¿"`K?_�vs˞9y2!2@�@�@�@�@�@�@�@  � � � @ n5 \dQ t9 Q5IR/U":&&`a:FSz-ZЄ Լysq ӊҤIڵk{W^ڼy9%ֶiF9rP:xN C5kcbO]P֭eC7pe3Jb^-[ ~G+[nl,B-B-ς-KAe&"*U*˗+ժU;ԺuvZYF?W,X׻@& ,WܩEW]u,<)G]lO<!]9BZ8kIO?-YdZ~(C]ec � eJ+WoO ujip \)=Lꏤ{pGGR+ � � � � � � � @ ,B�@�@�@�K '-=d 줪#G`PuwҢE@Ƅ@R:QF{9ט1ct7@S#xeӦM׿7|S u]nݺy!DdA+jSb/}QJd!rK0bZ ^j{-^XK. l9[l*_ʺdMzvӥK. ,<,`B;;v \bǎ{_q^ dEqUjU_EK&\zC{ꗇ;Ae_}%'8{enHF@* �@2GXw!@Pz vo ۷ ja]wHS!͚uw � � � � � � � @ r'K x۶k`H= � �)-0adyjL>I"l<[R)-пƍR֬鍅%V&^-*6_qmIb6mEG 5t}K.*W\ 6#:qΩOC>SիW/l2$*ծ-׿h׮~/ -M4Z@�dXn,X zk aPrSA{Wpd!!|n'<U<..Niwoۀ5kJbł jL1˵P@8O?]<Q CP(( Խ\�y v@ ElW厯H7QXfϖN6Li,B7n"� � � � � � � ipL @�@�@�B:w]u"CiStAZx}Ibf@`3b ڵ{1ɓiԩSnw}}u֪Z,TAgN{.tIO< y^x/_^Ó @8 ]^;wvءӫbŊ^] *(C }@,JO'h huQ͛Wuq!RJM8aw,.`Ŧ={9sNCZpTɒC!-3!� �(SF:p@�j¥#<D]2gN馛..%M$e=;w$Y~>ђ%̙rS8w#� � � � � � � � N)X]h֯U# � ��W<OwQ U*{$ &\ߖ:u~E*T(t#/v˼=y^hQgO驧EڈFJ֬YG}T<gCM1-]T?[oՐ!C/_d5Rƒ,y>bʕJ.y)@ N8}@qIgTa P;+kVJ0Ȕ)-#ĥY̛7Ojeƍn4ի뮻++W3Eڅ HG!N. T id1"Wg" @ l./wHj({K@ ]|@*^\6Mʕ+lvkcܵK>]ꪔ�_;@�@�@�@�@�@�@�Y=el � � � pAABi[BbڵJļr\Ce:FV׮]հaCwbaq0`�!Az*VhM8Q \Lr{W7g!7 =6oެ7|3MQ? /ݻwkܸqj߾ͫZFr4rHmذ+=#z@KbQ }:b늭3%[lݲu5[lݳu)bMH/(͚%/+%8 =v;Ժ4pptxd#� @1ٲI+VNjB�p;v]H@K6.N"ұc~>!u@�@�@�@�@�@�@�@� 2i@�@�@�RLϤeˤ'H.(!KVFC d U++WTj4~x/|fڴi*]t7E׿U?kN{9l}�u9@"EԹsgK �@^{M 4rԯ_?_^?F}.\8FbH!u-[l]uֽ|.E['md|m[�޽ҢEWڴ.ը!/5o.~> �Į@ٲ;l˄�1,p~]Ni|1oEFǸ � � � � � � � @t +B�@�@�@� (5n,UtR9q&qA1c lٲiɒ%bb)9L2iС:u&Ok!Rz!o(гgO޽[FJ̎�$^`߾}z7! {WUJ}ڹs& N:k@ tٺf뜭{3gE['mݴmE[WmeT*=4ic\XiaÆ(v^,(?@�@� )#Xy W+h=7ߔ^jDnWʙ3C@�@�@�@�@�@�@�@�_ ! � � �!lOd(!]FB\%h!,↨>}x㍺馛\,*T(1oVԩׇKʵEdHYyW^q?$$@ sU?~.mGkհaCM61S=[m]uM muY[wmf>͛ի^Gƌ5,g$篃ρ!� ie+O?Į |Ek/i'NH}IO>)te6 � � � � � � � � cqЌ@�@�@�bW`PNp3(^\ڶM.|+ fK;vȅIZ+>#/HG[oGr|%KԜ9s-[6}M/<B5@Ixҝ~I@� ?~܅wUGjʔ)ڰa jժo1C�uQ[Wmuׂ"m]um(UJQzmi:xihxɄ RӦRR͚RKEB�@ Vʔ-b}cJ S&iT?IwPzm_eKi0iXO)U`B} � � � � � � � �F иR+ � � �һJ<'�(!<+!%@\Ԣ%ge<E]vҥJ Ν[2d:rHHzRݺDiC=СCQ:J�-pmugؗq "?=qFMp)b׻ԩ)2C 1:k뮭öh봭۶ۺEHw)jub9~*j%%*}sgt0:@�].uℴzu!@|O4IL%Sn~W,fϖ@Y@�@�@�@�@�@�@�@�H�g_%Fe@�@�@�@ "O 4鮻ŋK\~Fʔ)X5RO4 j۶ׯCFP#jl\j'|5ko[H>g4H=zB bY`D.QuY6lP>}dL ۺl봭۶ۺn<S/z4|~ĉRÆr7T{I[Ď#E�@ J V0@tҸqrH[K}_Ԫ%w,J;fA � � � � � � � �Z P S? � � �H#FH'eΜ]ʒEU`Rz]gՁ4vXw"1͢gϞdZjѢ;r>? gэ7ި_~Yk׮<I}D9r^uͱ N._R[DҐT;wn=0`<6ݫziܹZ~[}ꫯk;4?O @ =zTݻwwAרN:ť[l&R#M qO<3f[nRJ[-L}̘1աCM4I斒Ӷn:n뺭g�S \ytHK{H,#}TtRǎҿ-[{N@�Hf+[D5}E ҤG-t~@]~Ǵa@�@�@�@�@�@�@�@�DĎw>#� � � @>){/J*7nvj DX+<yDh7oYJ,y}ׯY Ϝ9SkV;|p^ZuզMΚ/nV5i F}:Z2Z3܆O<8 :4]ܵkŝ˽�?\mdk֬Yg\;vkĉPa,ɖ-[( {` KH6+ğ9Pϛ\ސ!Cmm۪K.ݻwX:nۺoY2տ6o\tmr3RRRѢ~HёyL$eF�  eH+WH#$T U*{<oOB3nS7ސ}W7)]дE � � � � � � � �$�AɡL � � � .SCZIŊLW"%K|ʕSƍV#Kb *{':޾{jذ;#~Pڴi5j(“,4~*Uz}FB<=.e-cӧV*9sGՠAt5S`Ao+>3/f͚`\*5v6ls?ka @Xl ŋ}ƒ8qB]w?]_S_|KަNZ<J*uycq{NfڧOUZU͛7C ؾceu}۞m\L`B 9\߭W~0}p" !2#G@�RJ R/`R^@, "{.wѫcJ…Rv)ZG�@�@�@�@�@�@�@�@ AC:@�@�@�@ N;W.*'T75krdXq\}J&Mdt:Ľ̒%z) ?pª]*U*ݙ{UNOVY8y$zդ߱> ;vl+_ Y~Ъ tM6x)S&[>s3fk? ̘17K4r"C>3n&ȑCӦMn#Kn/OF'~z.Qal#7xÅЍ7xjۦi Ȟ=ڴimOQJ \pM(%Cqzʕ~I/AW@�HU 5 j^?>~-[J-Z!?� � � � � � � � @4A0@�@�@�@bCȅI \lоf'Tn,<(]~yh f7JEFV ,ܹs; ϝ飏>۷jժ.<e˦?CӧOכo۽k5zh/.sI$+V?5o>#Ghذa?>+Fpz *tQc3o۶M+V8+´lꪫ?*TN< m <ۖ{/(չCWd›qo}u֣Nh~{^X٬YThQy㏕+W.~׮]?3}.'Y(lM~&L}Djժ6m^lŊ֭[m<䓧«-ٖ={VZ5jnp_h&M=4j(\R:t>m`~g£M:v}{<ץ?9L.]d6Y0ul{By ^*UJ5Ҏ;m-[\7 !_rmo܆ ;pm{ >s7C+nR۶zwSOɶaF [͚5pʕ+0;f禴iz,XЅ CmӶ;/5vڥƍ e־m<k#\& H{os5Ʌ}}mF^gH7Vl7a<:� @ n;+ zW_o;"wQ�?2J˗K.9bdh6@�@�@�@�@�@�@�@�H.9c$FL; � � � S.wM| ö*m*U3g$>e˔!C/&}իkY R\\|A/>w;M,{n/ɂXRٲeuQ2Z`]Æ y]v^Hխ[ :_ .y;Γ'Oz!Tϸt jpF*צ U]|ɂ403f̘&₴:uT 'c=T <X{wja[>YX;V}?oaZE\pigl{ẅ�){n4o<u p̜9ܥX_nݴxbȑ ? e6mڤ#Fxù% /^j^ۥ^ M}_gI٢B*KUd_QEV-ZPZBʮHd˾$Ks1{}<{={{>mXrzXp1իh:/W_}I&0v^UW]% _ &Yfq>|m}Ckowca՗-| 7x8YD o f>] ͳK Gt 4PժU k…ʟ?XhA 2{lh!mʕ+լY3w}OYh!{B!jÆ /~Z {8eʔ` h,h+V?.QL6> ,> %b.sכ\ >VPH t^(p^(}s~LDu"� v++.˝ H pw / * H_S؂k7RVG�@�@�@�@�@�@�@�@ Y) � � � @ X�剸t-e'TFRٽ[ʝ;ZL[KjXG/ ~y>h]tdA?+ZX9YXGZ8 z߼,lעEo묳GYܝ^ jJJyu=ĴB,͛ {~I ܲeK>?3_WEi(`a[wuWLjb7#xfϞ SJ*u| W V-x;;BV) >[a8Ϝ9 %?}_|gz?x˽^"[e˖MZ{l +f6y>|X3gK x`묖J-\\~}s_2e>_ x>{-СCXC'뜨>~ԂkX +ޤI<}.KV"Eb[>}^B9&lڴ +d27%6qmy9w'w5|'ޭ% mذa̼ݱ1`{`^jco+93>3@Jl7n]&Oe>g~.sܻ)HW^)   m> �Y{3#+wHsIw)u(weu/1rn;BdX@�@�@�@�@�@�@�@ 2GZi/ � � � X" t.%kr.SFSjjv ){yGZr u*T;vxM+Uw{W{aPB-h) PS@daF)O<Zti'xB֭ӂ ZzZ`ABc Pł ]%z4(٭մiSoɓ'{!EA�J->uaݽ{won & ylӦ7Ph ۳hoXp+֬Yk?@2excgVg P]z=ګ'3xlZIϙ3߸Wcc%n}ݞ4X/9ںic.+9rٳ&Q쵲�إ@&xŒ?c?>f٭[7o7o^ݻ׫#0;e:'mϸ%ƃqcR*v^ާrrSR߾1….^;W:x0[m7ux&6qH;3�)`ݰm+}Yh.!wi,y]"۠6@�@�@�@�@�@�@�@�I<@�@�@�N`��@�IDAT1c[oU&.mZBp,СCڝD׼yb]˖-}mBdɒŻ ~7i?sYلmLzurk!TʯA֞%xL~.7lbYSJuqº%`S\@Ķc^ g'?#N&MئNX\ K?˝?ݒð\@KW]u.ٳ-`f+̕bŊYcY�`*U''>\%J믿J*O>9f3qg^zz7ղecOhcV>Ę&6gV ;o, OI {}cӞq+'2; �Q~ꫯԮ]D7+ ܹul<XP!'`ƴiӼ RvtrҦMg  ۗ{}NJ>+}dbAF+H@�  J !CH[K'IOrRNRǎ=9礼^j@�@�@�@�@�@�@�@�@  W!� � � @^~YZTdWW~-URa#`Qs%ϝ;Rgqʕ+JXڵkjժc?Sŋ?f~4jȫ*ZxŊlbݺuj e$ 0JI1C:rD_RR릓AZ;s7ł&{w1sL=.h瀾[ +U@noka҃zmR{믿v!.$X}i@/Fm5h@ ,Pm϶ƍ-taÆ%*2nOiro{m^s&uc1B7Y\vwՁ<.nС=z6m &ѧp;4w,hߩZc-H=,1b쳁@zX8*ptXiF2b]{JKC6o.=4kz6۴}] & � T,w!i@ 5.V Y yEN.uE�@�@�@�@�@�@�@�@ }L_� � � �$0oz�$Wk!˖E^@; RF*Z>괠#2{lDZSPӏYopc  ,+ҫ-ϱPʔ)EŞ}T>N9%5~z XXUϞ=/KT3,XbUNUXQAhڵeAٲeKT],�!`!jR۶mpjnt `_.\}O6M[n=a3N* e > l֬ .쭳k׮c'(OX=}z뭷taM0iAA߿7gf%țϏgf4�Bޭb;Y B0[lyŎyξwL2Imb͛W~Tfm|j3FxA5-Yj/~b ) b!Y` w "`]ʅJV}J*5lD^|Էd2q>¥+1P ء � .\˗ˍSs+ԍ�(`cUwhC\#]udbR% l$IU0 � � � � � � � �/9{@@�@�@�@�x$y:]fY{,?elT`7BB[oUռysk۽ dW,|ʊ+lj[ 2D{_:ýA|A*TțwOv裏za@3fš٣g}V{jT4l0VJ\Yxkyǜ9s;Z Oi8PA: u]^/L<{OJ&MQ@ :{oNпT۶m Z`e|w!dAA;wz-oӦMzꩧd3F~z!/v]^Ф-coYa+' >. J 9|poL,>#7nxo ON8[9'3:|嗲�mSY1 /Ժuk7BZ5kem fcFyD1Lܹ[~qw!Y;6w]/돵|WW_BAkeA.s{81(/lToY` n *`V"vazVB`'n[CZ$op ] @T_꯿ONƫ#w)sK۶Y;`rBnOx]@�@�@�@�@�@�@�@�@ 83#^Q� � � �.Br9.-0, [6«]P XZ1bĈPUs)xA?<7߸v7/|Vɒ%ծ];M2[sβ$+}nfiӼ@ ~,</w+ iT|da<Vtz K~9r JlJ*y9!?VͻZ}ٺգG=L ĄQ&`yZ\pZςO 0 &(-{}ٲe^MNUBy"Ehԩ^plڵeAP9;_s5qիoP{nլYSw7xեwk}vY ,h§ ox׵kWoY S@ٳgO>< v Yv7( mӦZP~s; UV%0h} v76`uKL;OfzgF駟t@tMk ڴhB{bc˗{mm6U> ~'ؘp*P,^{{lKbdX@O<{]P`ٲeuza F4 �M3Kɩ/A({jc\, $Pg>3C. tZWA q@ c-O@ rGT : qH'w*U$u,� � � � � � � � @dr'M9J;64Q  � @ sIr'k[h"`Ӻuv @\^ f֯ rl>VMjJzmGbJ\ гgO5J/VѢE!C$dAA~zN� cyFy9ѢɚoD, RF6mڤ2e$k[Yª,rjذabV92.;>k]'%,4e]/ʕ+= Z}ehO>ȗZK޽{*gΜn^ٳg?&n޼yWLhA7nTŊ ?}D Xдcݺux&`˖-^ .Ȧܹs{{+WeNt'Nl0dcKQ Nx86uۭ]�u}3XbfɒNq!eϑ#GiNpm\R&{)-IY7{l͉ym㮛ZwkO?Rk{ԋ@z rztZF(+5iOXjҬXΰ{۹4$B�Ƞ%JH< A6D]c]A4s䮛Sܮ[ cGw U4wHw?._� � � � � � � @pa � � � �%)Աc@rҢEMo-K9{b/dM,Tޘ,7oV˖-\{ ,^!d]ݺuKqy4R%B /o-po5n8/LK.kTjHG� ?kV=z ~~|!tUY ;YAq\q0'L{q)ShLSH͖-l J֬YeSbJP_R0VL-|nl>Xb|aIqIDF$MygoN41⭷R &? 9߂<_~e{-HIA Zܵwܘa >HZC[Y @ 8CZ$ZD[@ :[_~釨[ RһJg nQCڌ� � � � � � � � @wPK � � � @|رR}+Q?)Qa*`>cQF;+iK׬ Hpu&LZ.?.S 4`lڂ / $UQI<#DaС;7 "g![YVꫯ>&,E2z†-ž[.U[c߱UT96rYzX:HäZz'gȑ#U_sWٳl2YHbܒĭ+-oڴ |We e;-7rriTzu)<|?I^=е YR ,_?O "�(THk?pҜ9mIO?-@�@�@�@�@�@�@�@�8*@Q !� � � @ *I2Vmdp|}hShԩQF뮓 8 jP֭[AK߄-[yڷoL9s&~,{4w\ `vD )R q+dPgG}1cƨ_~)eAd رڵkA[MW]ut颦M*s'ꮻ=ydtM߿+Ԯ][6s1Lr'W6bc#Gdɒzʒ%d^'?T|a}7^ '|jժymڴyUy #2]Թ beú�u)wnCs\z\mOY@ qv( @HL__z=];L3gJ@�@�@�@�@�@�@�@�tĕPʝ╱cCU# � �J6 ݨ1{H˹p,B+aT4bԡChUmK.3D}']xajMz8ޓz> ސogϞV}p.Lp;ߩ\r!i RfڵgZH*ظqʗ/o6,YfiKg?~-믿^m۶7(/5{w^,X0CGRc|.i‚SXȶm#%\Dh7olyz( $eˤSNvjğKZ˙uߩʕIj #� d kv풻OWg@ swm!=䮩/.&w*],(W ׆!� � � � � � � [M@�@�@� $0ld.].UJ*VLm#-C T_?vM\hK ٟs9 ٳg,:`'+f/fnDܹDȽ`>}hΜ9}LAKH3gNoP)7I$`aq_pi={{ޓ6V裏>gKd:"و.]. E-ҎYY3ɍOm{>[/ó �B3 CHĉR͚ҽJ*q!Ϥ?zHN� � � � � � � � @ 1=D�@�@�@ C:$t]>l uhR.Ν;v�kj̘1ؽ{N]qꪫ4c /^<%?kTpϚ-лwomذAnx7!@X X0߭Zfnjڴ *ۯ0zC =f5{{ރ^7=jU{R@ tA0WuEp^z|UP!E _?傒}˺ � *Hl�X@jLjRPŋg@ƍQuݧC � � � � � � � �X@�@�@�|O? v Ԫ%Jrʚ7oڵkK/՟'UZ5{Q>|rku9G S.5-[V7p CLA�R(pꩧ;дiӴi&r|PʕSEեK˂( |{XS޲=g={{ޓޤ @T$rdJ"ty~0<$ \t �D]\rl#4I`z|k]L>]cɂeVCz+<F�@�@�@�@�@�@�@�@ c d:Jڴk;6T5R � @z |dЍӻGl d$~O)@ t͛KYJ_~:S1cN;8Rk+=qـv/_={V.d ի;]4h/ZoM%*]:y>R-[*Uhȑ^kv#@x >|Xu_.6͜9SvR2e\ ytf͚ʞ={xw!ׂ kdAyQÆ u{g̙Fd:DlD X֔)4u\hwYn VN4) "�$Qbue( oTńm%ʣԢEBK<i+ǥ7[C�@�@�@�@�@�@�@�A � @<k<(Af_�P` bEO+i_4wT^'!AaDIs8C'ѣbXh(au㧟~O? &v0`.Tm@>ђ D@p) ͔3y܃!@ <xP!g̘m޼ Q;SݺuevժUs9RQl0طo~7/<u޼ypBYd1aᩍ5 m\ծ@A�w[K uEƍ /!]Nrw"#�;DƚrciY6�"g4d~8CIݻ'wKGtff?.Ct@�@�@�@�@�@�@� 2,_� ��>-  絠%?,!^-e #GB·AD~vܩW^y /ܵkt颮]jժ߹TÇ5qD <X&M}Q6I ʽFҰaI  :묳4~xj*,D#@ _3g7Y/.ٲe  iU Yzu)S&!Xf-Z?Z R,D=o޼^֯_ߛN;3C xegrҔ)4muT܅�CA!A�HA3H6% VD�(pzmo_ivzI{K'V%HKH? .zX P q>@�@�@�@�@�@�@�H�Ab9@�@ ' <<@ :$-oR6On�p.A=m۽{^{5 :T˗/WFt뭷SΜ9)ڵk5|p曲_|nl25'~uپԮ]cke!l?Sv#@T X ҥK?kZp,(o^? (3<SUT9f:ӕ5k֨3-pAXB1ŋcsJNkԨڵkVZT2gٝ (m%Qq].0b!OCy4.t_@�-Wҥ)n�\{~�sԧTDalm3*PGC�@�@�@�@�@�@�@� 2m � qkĽd48 Ld6@>\Ji2eDLy!ie|u!2_kf1yd/>S\tWx\r8:@֭[>s'Dt!tM7nSŊX;OO$…mI%K~j ? YS&N-Z_i ?[z-3mذ[B ˕+}wY8dui)o޼X"r;wz+WB-tyiժU.%R V3U^ ,\pD 9v˂}mv?3Cz.t؅<yy@ o,n7I?(խVM1 :>vcrnAzQc*mR՗_]#SI* � � � � � � � *u&Tԃ� � � �" iPI'˗.tlҖ7oM7n c H 0H{iӦ^pSu  :tΝoF_}~/J�bf#Gl)yUX("2y|Vڵ]~WF#q,0 .ؽޱc,Y" 9shԨQڶm[̢E!-lٲ*SwܷmBA [k֬j`aSp Xw tg^V\7  G`nT83y9t=ۭԼy~0)]wIvIK.ȿ uO<Mc @ ]!e&'ATB&`zTzI"vIv1 w^5z^y%d]"@�@�@�@�@�@�@�@�"J Ȉzh, � � �p9q is#9HvRᅑfZ@Z (QBݻw 6xxw�]^B:ǽ,@'Ùݫ{SNMXU%t4kL{s̙'ܖuB}t^0WQ@�H=+w+rJ,ocVQJ,SO=ՅrnY/bŊ)K,1q'<<Z0M6mnmLn:_޻`r.Y~ڴiY˗/CH7Νȅc-f_C}VsJotݺInWTۿ}<W@  duIj .C�HV@ܾҙg> Pd  � � � � � � � ��A@�@�@�HR|RV^%l]~~PyQhH XRwMٳ).wѾ}d:36URŅf$#5#$,D zvkaCEѹ瞫}zUVMV$ZB+O~M4qA2կ_?}' Z�#`ZjyS<O!-/4k,/pDŽZ0u…Uhc&?SyqBd9r䈯 K-s۶mu֘ZuP7={~o#GlB@-ӂ>-f͚K0P lٲnR@� Xd<)}(S>r {rRJE t}@� &pҟfN]2Fy߷m+wA.-5HO=%%gPi}� � � � � � � � @z ޯ�G�@�@�@�d .u(̙*uEY9sҵ lȞ=,&+ `^M~ ͷ & @H-SLd=AR֬)?Lg/` ֬Ys̴rJ^ž,aÆ{ *Sa]OfҸTx]r+-^MP- VWZ5o:Q,07n ia6ٸn-ZtL@-9N,2͟?.h͛כ,:K &{+W.olpI mܻw7ʦݻwkKB &{sNoN pZ}q0Ν;ڵW76sB?Zm\IA�Z}$2n-{lz Z .H}C Cڲ.�  <sfw!,.׿1 ʕ桇.%iu-#� � � � � � � �D@pz":� � � �(0mt4n\8.qm:<i-R Cs6[•/_Yhݲe˴b MshB+r6YiSlټ,YddC[n -(vp! �Zjm۶^x@,Y2sBAjԐ C& \y啪~wBX3U!�-`Eի'3Xh6S`%:[ APD$TmA(dMB3g,mqrV:{S6/ྍς1*x?ZfBmd!6ƪ+ M=B-P3(3i=~Y骫R'|-. @bǽGM̒)[ƶѴ?YMF3f |5C6n,96 @ qd @ zuIH7$-/}}Myܹrpv @�@�@�@�@�@�@�@�R[ ;&3j c[~"� �DJ6 ݨ1M.Gi HON%Kҳ)YRÆru駧[=gK'e_ _  & B" . 'Y�GZP$iAP�iV:Kj?Q4F'0rHu W-W\Vb)@�TB޽;1AbX{|ܷ0F j  v\p:_@ɂ$-@2Rm9b+su}SYcpkU~!ߗ}IݻZj9P/-$|si6 + 7�aN矟6+@�[?xfh/=D #u(t=HJ_ﭭ_Pډ1gE�,B�@�@�@�@�@�@�@ RL;-D�@�@�@�ؾ]?^80B;f׭̞MHd>,&J6n-{.d o^}рa  @ X b)eaä[ x%˥;.8:Lw@ \.W]@W_O :sǷ? yn;G�HYO } ~"v:wWo)ۿ؁µ+&}޽k[i � � � � � � � �@�@�@�H+QLvj9:uYR~jE�B%RlRơz"QB^# @� _ZB;VڶMjT^]zui`@ ;wJAq;c=mH&-Y"]+T;R&RRf~H9ҡCqk1 @8 .-)-]M ܵJ:q ҪU#Hvm /(~0[@�@�@�@�@�@�@�@�W }m � � �Q+.wA*_`ds<y;wvy4x/ȳ �D@,~x?K#%Y8N~Fw#@ ߸H8uRǎʕ~!Fm^q4p`r4 Ȱv e2,G ",t{xxҺuҘ1~kR\խnE??Nk@�@�@�@�@�@�@�@�H�AIcy@�@�@�HW;YB8\UT;!ߤ Ro5ѭ$ Ν[wy^yܹ3I0 �*p~ٚ5ҽJF9\#M q|¹|yKKK<#!=dEJ]' *G0@ }*Ugl"cRŊf̐~AjZ Djy9?ԲU+#@�@�@�@�@�@�@�@�L؈%@�@�@�@ FN??'즜wtɮ@�TЎuLU{ڷozk9E�@ eEH=$dg6I^(լ)gOgm@ ?^$A}nV.ƍC|/Yw=_Աk@�@eolhϞRcIW\!-Y"}԰aGb~evR#ݴ@�@�@�@�@�@�@�@� T1G�@�@�@�t8tH5JIʔ)ݚ /.q4mZH2@ d'J KꅬJ*ps8p<ὡ �$] kVYyϖzʔ|PZ&u [GǞx}f}֭Q3u|y"0]7n~@ *U"2^/ښqXWS'k% qb03hA�@�@�@�@�@�@�@�@�@�@�@�"F%;ۂ 4i"MM=/ M&I͚M5}뮻Ik.*@�@ ԑyGZZӿo!f[K3fDrh;֣-26h =4ym̎tRɒRjwH/#�N,xIM |{?Zc*R˖Ҟ=~`k(#aڵ? m � � � � � � � �$ESwŲ � � � #GJ/Uƛ4͓v yT�$Z`NiժcJO.<BKk /� �NX1O<Қ5RƒV! xۥy% JH%G 'fCJRil"Eu޽0 e�i!PKbklN$pԭt~hEII~+j%er5oJ:H;Cz� � � � � � � � 2gw@�@�@�>Disb[j'8ОuXMiIU'~w޽RE}ݧBA�@�O [6];9s3ϔnM*SFzi:@�,`%/LO?I[HI H.l)*$5j$=4m?@ uJr攖-KP;/`Q 5)S#_}UVu2ʜ_JZQM?@�@�@�@�@�@�@�@�_ ! � � �Q!R6Qѝc:QT4u1y�@|,^xA:<J;rLy)[4i-� � s{ҪUKoom˅�b#cT1x,U+嗥ŋ#ʕ#O�ͥg~Q:t:@�d$U -]XR"`/Yx7H={2.4ܹ@~7%ڬ� � � � � � � � @x ^A�@�@�@�W^}E"z>mZDw#@ {쑶l^*\x%iڣr/c w}8q~׌ A@�8k?z4||tTֻJdeB� )}{ ZԾrb4dT4hdvIA�HXbEɂ( zv .״tRƍ.85W" & Ej?h7 � � � � � � � �}@�@�@�Kf̐n!,F]p4w{wH@ sK2ґ#ҡC~`Jwrɘ-[Tj /dL�z� @g:u~Q=[TIY*[Vz1iÆ$TƢ A&-_\5L]Hz >}]$ c@�lt�)XD[*]ZjNʕKSBmTo#kh77@�@�@�@�@�@�@�@�!@dx% � � �-RѢ%Dt7N.O?b<�@Μ W?xTj˱DC=Z֭ �@s?% !Wrp9sB@�غU*T(;&LǿKϞRGV@ *V-KFyH.7rԸTRn~gI_.eEN  vԾd � � � � � � � � AFG@�@�@� i'd.YRӿ&zH@ r>q3/3QC*R[J(@�$PҚ5oH.5h կ/_0 I0D!6%TҶmҔ)1ŋNťΒz,C�B�"HR%3Ђs) |s]%kL@>TLk_Xa'2}G�@�@�@�<��@�IDAT@�@�@�@� U � � �DKKJ7ŝ_ך5ODCW<yoYfw$BHyflٳ{6lvڕ1= � oϗf̐ʕ۾}MY1!@D X)Dd#ۤ;k RԩUWI K+=o_t"�)X_}ٲUdH^/f3gJ}HI~(h!vJ<SzEgSVk#� � � � � � � � ;Qzm@�@�@�HP`HzuV,_  y#GcBtU{Ո#@�@� 4l菽V!ʖ/0o^ +gu-[L/T0@ifihfM. ݳJ?(:֭d{ @)#_+mVl ?^J?O?-5n,͝+-Z$sThd1[I+Ppl#mB�@�@�@�@�@�@�@�@ ! y@�@�@�H7qӭ i .f&M7@�|b"?ԨQ, p)N:iРA:bɡ@�H@3HkJCJ JI>3OaivH[$[^{B[,.^\nG:5jJze#w8@LK˖|9E ԭTԦdv W_2Qjp[oM-Q? � � � � � � � �#@dR+ � � �@lڶ AePE<ҹJ'G@ci"D@vi֕9v>OW^. `>f �$S gNsg_S%N~ZdVj ۶I)a$PtM{N&+/=tRRr҈Қ5iZ@�T&eE #\)=T73'Mڵl66f~]ixB!) � � � � � � � �D�A^@�@�@�21RR͚IIA�C@cj'+er|!@ժUբE 80� �!?br? 2ep].b H!\ZwH&H#͙?ްAM3'mݚ<TX H@Ŋ9) ԰tҐ!%HII{XEI')X>m` � � � � � � � �$W ʱ � � �}Kmۦf®ͥu_ �8|T\8] ]wݥ)Sh!@�@x/Y# Ԯ-5n,Yǯ  B ? #=mۤoN??YT a%Ku'=a5@�P T -[ڨسǿHUWI%JH+Kx׳l,󦛤#G @�@�@�@�@�@�@�@ :ו^!� � � v"ΝR6ߕ$uNí@ 5di]qj4pH G�@ "rnտ.,]R( "E�T9.yF3GڲE?^:<ϥ-B /zJ?>jaFI?B.^2"IbEiviHj5mE eoI*VLj^ڻWz-i&-%;~N /٥wUv  � � � � � � � �"@dR@�@�@� &0fԸTTxfwKX eJCGhE KGv'G) � f:6aldKeH]H Y3P -)!Pt~8['dޯDrtҠAolَ>?W= �%P_-)D}N*u&(!]~bԯ~4i \D)-"ojI=OKFzoh? � � � � � � � @FtĕPuMcCU# � �J6 ݨ1{H@L H]bŤ_n-uεZfNҖ-RR?[>}i1Ӟ={w^o~{k<Caw=є hbO] =^ -Xp xZŋW,Y)k֬1ٳgwAq9\XINo}vI&rnIN=.Mv}Fg' � `#Gc.5i"y4yS^VҬ ,Y"}dSH۷ATv =WRJ!oRTh5c$v|Hb ۱Hc%=FG޷%11HH[;F#e(;x]pkA e//}dc߷5jmJY;ܟNT>}dc& 2 � � � � � � � iԉ� � � �)zKQ5r ޓ'g\}hxT ܹӅ0l֭[codƞl.X@bX+qo-DaAľo|`nW*okϞZ %ւb-ľX&v`S|7o˦.7mUP!o2JX@zGi-A�@ #uOir]ԽԥX*xS"E"E"3+K6g6'iDmr?,uRrxEkN^1n۶͛X'͋}|$oIc$vL!1Ŏk~'58I܀؏^D#1[d"AHeXiIIqH؎.\XvĎP[޲e:H ;~>Y#U_压iAܟV4bT4pt=)@�@�@�@�@�@�@�@�HM SS@�@�@�@ YcH͚I#~%wή4 Ȉ1@X ؉VyfmڴI[l\ʆݏ}; -0 vl_dI6Iv\ B 쾅GOR% %ٛ {zSgϞ !L iGz+fBmr{[X1& ~>PNRoCԌ� �}l/ zQNZDUB QooXpO`. ZT89c$H$1}B &;.be\/ xpL$>J,1RI1Hp$8&֎yH'XK.=Gc]qdƾxF|GxMŋ\<$n}<+nj@#Y>&A7ΟVpdL>5GHt~v!� � � � � � � �D@l@�@�@�pk$iذcfg^sIj.o�'׭[kÆ ڸqwkm-v .!!V'N;͛g'>qT@/ c5?w8#UZ@<b }v/3Ja6-YDg^{ ,3TT)(Q"݂9C헖ݵ^낦l @�*T^z1| @H HLZd2Ni|#<??{jUiú⊍1Hc#3 : & \r1H%vB-|r; .6es,d#w#}l$8^#cf .9Fk_hQ/21;.bKl?SO:Sr֎$;K$")?\Vv֭5Q/M t4kk9}D�@�@�@�@�@�@�@�"U H}h7 � � �Q*G~WGi- |a駟u!BWZ`Zfֺ7m�-[s !ԃիW'[_0ʕuy,R$]ľP °@ pѠX>.] <۲e˪\r1cP;԰aC͙3G?~ � @ XfwRl?|y^r<6@p'j Cy' @f|-yDG\YܔY]ڴu^h_c$u݁F ľ)I ᴩL2Ij={=FbKի5w\O]Bl۱sYd #XbE?L/@3]iTl<Ut~cnz-NG1Oq@�@�@�@�@�@�@�@ٻ0' wޑ*(M@EbAE v?_GSQQ@( ޥ{lf7d<s]C̙sfvP�(@ P�(0f !rjLOժAƀ)SiÇyflݺY5 R'PB&O/4oҤ\/0/@nj3ƈ йlٲnvqݻ6C;xt\QGq9sfzPT)xΥK6c5p^z^:  HO(@ PH h5o �]{TUkֆ- YmdЀe˶cժ|I+̇e>(~KwBB{/BM? ˈ%LTi<+Xtoz뚗z Et'Yj~G3r~FaB us|~^FR"G@L@,So46W&f�&Nt_i}v@ V/> G(@ P�(@ P�(@ P�(@ P�(8TrWx+XUҸq*P�(@ [= Yc[S p@^=:^K� :E8~{k;{gm{><6J̺ualڴɼeG5ՠG x,YX\u.&:{i6و:uBj(;m63k>׀SRcѢEM�_o˗//"W0k}?#F3Fʉ�(@ 8ȯp  l4k ԛ6Dk5d1ܘl%׮]kHtl'ٵk$;fQ7fF9Pu2VR„$YfI?6y.]2A{DC$\rQ+WΌ 28q1^#EŊq@Ms? p P.pݮYÉq3RFEތ'�(@ P�(@ P�(@ P�(@ �NiaO P�(@ PS�. hu\;+}S!~kʕ+ͬ:k8˗aŋ7|׮]]tA2e̅%J�Dr%ξE4C͛7jC|,SIxPH-\ZE׹p¾e;w?C_6�(@XȞx)WO?[C�aBbM@hNtq/)/gɚ5kqiy < Ļ[>/-_e{޸Et5]x۷o3Fc% .Hzs L&1=bh@$o K54=&\rŇy7>h ؈(@'[7eKP�(@ P�(@ P�(@ P�(@ PY.VԱqU"ˡ�(@ P�x#;Q U*@=:8v"[U+E"% \ wz NI-=IϜ9˗cҥXdyn:?\jW\*T0鲌3[K/ÇCV4Cg Yz5vm̝; ^:jԨ5k` R饗^ȑ#M"�(@ȹ 0hw:$xW(s�( hop  ۰aqe˖�#GV)R7p %y䉠VsMet|DJt^jY7ɐ!YVq}Y8D@oRիзoHvǝPȯQ_Ȗw着_b@:u-C~$m[8l%(@ P�(@ P�(@ P�(@ PA ZUn+ӊ}V։�(@ P Cdq`db60L'N�_|tJ8px Ľ^|ل_6fkA>:Vj ʕ+;)+pL5R4dUg}~Ydɒխ[\paǶųb۷oGҥ%L}ڵkS�(a?><_hh13N@` � �{ VNY={{DO>L2bhPz ̙3gVS .]4\UIVXaUJڄCx1J*!M4Q4j ):a-S@2a1{60mk޵ en h~ yCժ!A@@~+IH:Z+(@ P�(@ P�(@ P�(@ P Y$ȴk׸Rbk(@ P@ ]c 02^Ax Wm\012N9r…?5ԩSȓ'"ڵkF(TSzP 4U,YbX-Zd"ϟ?/ChذyX093\}̚5+D PEɃ7!-B~zrfE?б?Cڴ).`Y֮]~͌ݻ!Cc$:VRfM1F9K@|{%)wҥf5FV9guAƌ+˓ #m̙I؈RTƏ?ڧ{ȍp;�ڴ^B$|Fr%H~0'  P�(@ P�(@ P�(@ P�B( bsW�(@ P xX`dJ Xh8yXǁ|ÁNJ.edJ:l Ӡ3fE3ҥKr1\%ԫW7|3J*嬊6A/0o>͛M4AӦMѬY3/^1:?Zju֡|+B P@k�7݁'Jl@X<! ر=FBc$:VRZ5K.)@lݺՌec$k$X=FA iMއ>oO܊K~ 6 2 dt?Сt^~%xq~Y P�(@ P�(@ P�(@ P@ 02rkN P�B"?t 3wa Fٳ*㏁="!d~!5;cdCǣGb:uy<v*WƍQFhذ\3U(@d hٳ1g3k0dٲeѺukq_ AHfovE-Sπ.P�(<^`0``.ہ޽!Ϋ+kD 0ijSkқa,X@©q7GYJxs=lYt /Ul!:Nr劮F`kI>wĢR _>1&Z]#ÕrX cƨl:P'wJZaDž;�(@ P�(@ P�(@ P�(@ P@ɏ(@ P@Cyf 02F<zM޽@),|PgCLBA;{;$C7vX̛7\}me˖h޼9jp@ Y?5$K,;Q؛6mtҥp -;#"s׮%�(@ D)f?K*�z]nrd#(B<l̘B;`q.^3gbܸq<y2N>mBuDJ*Y/(@8x ~3F$iP-܂N:m۶r*Kx-j�6lt$+V@n<5tOu]�y UaXXȐ!,UN(sAa(@ P�(@ P�(@ P�(@ P1":FfR�(@ P�(` z!.;X55 \pǏGVP`AVJ̞=ѣq}12aFK{f͒ COpY@K, iw.o ~3 P�B+& $T ;o�۶>"I@IJO}# ׾}(K12@7:c:c:67бR3ձSCt@Re[\P@*2BjՀ? s}j 'r"�(@ P�(@ P�(@ P�(@ P- >l=(@ P�(@ P zmԩw*\n2B:NHΝ;ŗ㏣dɒr ^&b~  uj&ŔR eˆ{cǎ駟b׮]馛PjU 64t͋:X>(@ P%9׀{�/ )S.H3ZPIH@/>O}##i_ILwD D꘨ofLuTPu,UT9]ȑȝغ2>m+WErK*ش  ,^ 9ȓ'z M 4طyc(@ P�(@ P�(@ P�(@ P�bKWyfk)@ P�(@ P؁iylbk} �k֬1K 2O>޽{1x`ԩSD@ d̘;vĔ)S{n]ohѢx7wRNGXt),Y{a�(@ 8M@_4hC$o M�+9>� }hG>}!iHH(@[3ձSCձTS cAo\7  T VԬ J`l{RK*+H P�(@ P�(@ P�(@ P�( Q�(@ P�.@Z@bNix׮p4l;w{EՑ:uj6gl.]:gW�B.pu%u$2}駘<y2J,~… )RBqR(@ P1'6-7:АɆ6{Cڀ^�v96n4P!"> @@4ڷ>uϣ}i_(@O;pXKXتXT c3Aӧ}�U �=:Wyy`JH20l>gXb{#] S&#ŋ#5?(@ P�(@ P�(@ P�(@ P@$ 02N P�(@ Pp+W br)a…nƎMx=/_oN:իWoEʕcA-W~g;]3=FBN+W.e4zZ~w\1y˖-kf�&Z,W|61D& :>|\= UTܹsSZ=zw}'OH,�(@l%<,0z4Pk`޼hSj~%Ɇ7FVBzp"c@оio}hG>' A2e|v_|y:͛7㩧9bRl=SձUcϟB^u 6V'AF0<–7 l ?G�fczD,CM 8Q�(@ P�(@ P�(@ P�(@ P \ ps�(@ P�(@ `B@2Ц 1ա۝9\'Vߏf͚a$\u2ʖ-+w|;$]~vL'N?رco̙c?}tB|-K]A/_n/_w`7{ r J,'bȐ!ޫ]w݅5k֠sh޼9^u\+8t Ub,�(@ȗx`vo}[oU8w.B<Oj .^#WZeΟ}NI=A?9>eO}pr;w⫯H*_5kZ *2=>^݄8egiʜC&cձVsպ <۶t9yڐϺ+Z DnȒ%:تx=`l`ƌv`)@ P�(@ P�(@ P�(@ P�' s�(@ P�(@6 T~t 0HNPoFMpr@5еkWS4i]B FZV\9<uz M4HkYBe{ 4@ݓpYs L:=ҥKRjCNcС˗/mwr ;ʅrE9' P�(@ڴ=�,ZT9^~Cyn~A(i&:5<%1={\k021)kE.ڇѾio9`u:FG֭VW5p7ވeqV / <ѱ V2eEgIܹѮ][:c:&kAQ zcᅦܤ(S쳮c꫐Ϲ+}(Ș6P`7U2oNiY~n(@ P�(@ P�(@ P�(@ P�(D}1Y(@ P�(@ PI ,qGҶ5~}`ܸXV`m'NiӦРA `5NOǤ2xM OxYd3g\xjF_˼vǗ^^o'1zxиqu›uԑ ?0w\;UzGtR,^80 P�CV-`H`NyWIH4,6 _ or͙3'gϞMcn ; 4dsMJ2o<ӇѾ ' HJh>ܱct9W5KѣG_uȑ# WԀſ GqdjثXl,M֭Gǎ'O? Yϟ2> t+?< p .֒x`HPqKfy�(@ P�(@ P�(@ P�(@ PH\ګ߆kP�(@ P�(@4a*࣏.* ӧ,YblsAЋGJ:Jtu &1괔\1ܦM4o˖-رcQP!(Qcƌ% p^6n܈oC֬YM#y?yoСCa< 1i$|sa?o.Jׂٳg{7ǦxRJr}Ӎ}p} 4(Ftz衇PDe5{}lZ?wl.W*UW^k>= 52d zС c:ip7 П3-[SO=eK?3g4ef˖͔J~ jAbŒS\ȶџKq}mքcCJ矣&=q�(@ P>4?^zuS ꮀH#gc_aX| ֯_EE#i=2:x)~sA 0inLޥKj@? 4WF͚5vZ]ժU<�+]p,s>}�qFk1zhsNiڵ Æ mrgMYOB2JQdH_- &͘1}.0c!evg_Lb?>c5 &3 hٞ_;qDϏp@t VWBIٗ\@mۆիСC?#F_5~˖-[ШQ#}w^c}~e?>g6 cbc$:6m4蘛~k4Pzޑ$ U Hݠ49~utbŊ(_[yc:^}5㐎\ WDNGdYn '[@HCgvr9VA# !!7@T ψ*d \Cl(@ P�(@ P�(@ P�(@ PSbߠMEttD P�(=П D &0deefYVNm}eIcY}w99K@.2d`Ix*Uʝ;p?I&X�`ըQC3aʕ˒ {. %Ihu[0bYʞ=%}}}M7rrn0̙J:%"ryꫯZr%_|aVr3gΘ}/ o$$Œ@KKB,uYgS8\LncUPѣ`-\l*A2-ޜ9s,}kYRgy~arVƍ+W G4mж8gPx S+WX>Y&7֬Y#gjժf_~%駟6qP3]yf zڵ$(p!9f:u*0 P�[@Ne.],9_|,KN={͟|%- ˷$pќGJix}ß~֭[ҥK[gIpu뭷σ.:kMdBs rUMB~}>05k׮B.^^Aq 4}Ä́e:(\V˖ںmU)Ͼܔ%KZ;w6lh^gɒҟ]\;+S=oS XrCHJ?]BLO ʛoiڕ9s$.-WiӦfrKBt- }4"f$0,`[}&7kf-=~ijAbc$ZrCSϾ¼LhYnP_IٿMZ]wN_0阬g,MeX[oRs̲^{Ͳs陌[OX|N֐N!zc qQ}\x6�(@ P�(@ P�(@ P�(�(@ P�(@ P@Nn H>从^wи10vlD7P` !XRn.C @H$ bŊXt)$hbϱ{nHx$$  ⃮[lYmGeK^)C  ~7PM}]hy?,?k!a f۟}I#,Y> =dE 8ի!.-2 w1E֩S !@_Z ۾ #FB cL2~{k=H{w$ H�$½NrHLB/o>Hl,Z`>)7TuwwN_jAuea�(@hSY <8@@ΐBd~˖-xgIz.,Aׯ$=<yg$<f o"F t֭9Վ;ByGWԪU ׯ>e'Oڵk# _|!=r~7H@Y$."~]F>)Kvi_c$ } u$П5iN>mM 3}G;K`,Zl˗/CNH$}ᄡ۫W/H8!ZjL2o߾|[% ٳ!a1}^JSoE fY۶m ^'6Fj/2./ǛI"ϟUb/#ѭpw&\x DB-UV[4*97;g�fr�5r0+B!c!) O絃5J 8wΉ5d(@ P�(@ P�(@ P�(@ P�U u6�(@ P�(@ Pr2́\::f pkɺQ�&СC^:Lbzihdb{ IC5`DC 4P4o1|CM6a׮]f}GѩhѢ˴/bH Ef4?ng_~) .lbo4Ov˃>I5='_u^f;&tl< 乆Uj`M]V m@]~b 2h(4vi6Ayț7/o[.#r<r%W 6,"JS�(^94!zr(@ڐ>$p:K'M$#܁pv-Z0O'L`/r }_@C'N~y\4ϓ5kV_->4_hH5QC5ў.]rkx~6m$HR2d`?5k>cμO,NaQB ;)Jk V;lN_kjFd3na6H/ٗlJ#M)w4{,~?UVuߍZm17 'Zh@a~7k?v<?*O@ %S+K2%�2$ucP`vqa a+ Dk_Zr(kC P�(@ P�(@ P�(@ P�(hԎ+G P�(@ P@T ̘\~{T6/uݐE��@�IDAT@zQi̜9:u< nǝw /9{lu.Wt1xu>@Æ M8fh8IR 6 {Xx{`͛7o߾/ <| 5=KiӦ5EkТync?>6@LC�K,:uˍ7ڋ<zy#/sS̙5ԐI;@N<}LYχ~'֮]bY(@ P1$>=е+<wHq7#C:vׯozs/}MM~ϲeLGsS}{ k(23w\Or #Fm5_Ç^4_=&Ol6In,E{ 18}$~|.^H>-߲e6u/Yv/ޗϳŸ0{`<z~zyn6dDퟜ:ķM|[?)˯\ :[#dt"WSmn OBrA!?#z9t ݺ($@;HŲ P�(@ P�(@ P�(@ P�(@ $( y&(@ P�(@ P)!El)ٲm�|ITɓGN7ę3gۦK.@1cHEaСCE4 DCE:vӧcrak7hAJLw hm6E>__p,_d Ο?sp/fkzz_'gY.YvKɎ;a'ϟ?H}QlYS;N ե2̙3r'РƉ'O>AV&MPD |A/R�({7 HCɛ'q: s$N|L,X~΍= -Zd/r?j=ѐG ѯ_?[oao~ ŪUV|ϫ[.VX.]~~Y;wũS@"Ϛ>]:%ُȨ!y:FM64P/?7ˈ섖B˷I~ה^NK}->HE~h׮] ;SdwҤa{B=c)V ,駁!)p~ 5_ {/Rt �/�E P�(@ P�(@ P�(@ P�(@ FAq^(@ P�(@ PW@@$ D@C,4+7-"m hȆ^P/^td{i.ԩV\jժa޼y8rH;w.+ʕ+c„ &Yfȝ;&x$MW^y%N\'W1ٳgjpb 4@'h]|-&u\=m|Ȕ)8oB'u:~$%у>hpB~ɪUM~TgS^lݺ۷4m4`QR�(sCv> XS& }(gJX߬I2%<l YDzeŦʝԢE /^ l۶-za۷9gLhо_'w=z I&%/f. 踁Yڇqg?Ι3ǼժU+گqtD' h  ϝ1cFi<%qv Fų98FLҗkݨwrc;Sd?6+UJ7]/=6J{PtP3~0r$9nEB`{Qr8leTOs}EE P�(@ P�(@ P�(@ P�(@G vtX9 P�(@ P�N@r$㎨kZHԼ9'$4!$={v̜9K.`8zj窊 <ؼЀD 5Trٳq)ZI8 -oC:3SL/lګ[O8/<CvPG}Ԅ$,3<ҥ og_?Y2�IM%eڻwYͼڵ˼g?؏PB&KxXveN WCd4laРA8w)TK/!W\&PT8k7I/j:|x뭷-L6Mvw bWe'aj׮ Rϖ :9mJ d>|NX0(@ P1)1+hGs5`GrLd9+hI0z4}t͛v׹u[?ݻ Ex ؠA,Yk6K\8uо40__k~ֹsg'NAcǎuw3eyqB2wQdW3)yg϶aWb'IC+/_:Ơ}cW_}U_4oL<shٟ Hz ڼy3F gΜG}dƁL#Sg2{~e߇ZGu駟7б _JHN kɟ1-6'u= | 8}(ձWձX߳-CYpK urhޮrW~0U'q!;r> ӼM ֓S>N@K‰�(@ P�(@ P�(@ P�(@ P)/ wTHKgN�(@ P#0neAb8QnП N@*V,yrzYVٲqUљsg5j*\% (ZrQ%s[ݻwZli年-LXEJ*eɅV<y, sAE, $\Ĵwޱ `^WRŚ?%a%]o߾| 11raI衻Ğ\oպ/^ܒ f[lk_.]2SX{%a& :'V}_ ,] ZNpͲ/*SY/K,͝;72 0CK.7>keڐu$ʗ/UZ5g1`K?'e9sfKB4glذaf=%m4iX۷$P?d/bޓ@SKI[ٳg"`HK?BiE Jϟ?o~#8-ZHݰ| P�(`iY/hIò2d]-kbHДu=X2eufI%a+}?o޼8}oISiGhI 9KΜ^'{O>eOF$H~i%`ݜ>t_u֦M,=s'|Ҝj@':%/3+D?Ç[GƅYw>eO}L}uCVto4}O j$݄SZ7?͚5,Yb(Q|_ǯq wa<I")+Vc7oܼQ;v,#_}~cR:nL gCu& >9mDgֽjժr}:tP HȨw/LulOcYNtU^u VOŲ@m?~ܒyzUK~-9u yZweY~hYe9Te P9 n~sĚ�>.e}Y:(@ P�(@ P�(@ P�(@ P ҷ*2-єk׸B(@ P�/@G9 YcP PTq!В=bSn]jU`l0[t)P&M7eyNɹt>ѤI|([l+|9d̘r=$yuI.؇8{ 6B.wc?9q$P~ 7DK%�V 71)V apH)GSTP �c;wnw˒rl܅~׭['OB A(5"t?܉\rG=lA|G!}vH$2%^ԤI L|g� C Ap?*�(@ P 09%Aʕ@z@wC+;[>|W~w'ԩSؼy3J. OhU=wz^}iH=J9={~w?0X2:o�c�;Q? C?g:Fr]w}㏐93?OrÌk}El1ϟk Ƃ@/:ؐ]rȍ3Dr#x2cbŊc{LZ7n4c$f͂BWxIJo_jWrZi矮G9m|Ht.W.9s P 3-M   }\( P�(@ P�(@ P�(@ P�| 8_2 P�(@ P�Q@ĢEGcBߦ5n�* C*19`iK/$о}{r)2(hN J< y z^={~뭷v MZޜ9s*�N|A:yjA˖--CΝ]/+xZf6 &vX?əx0Wۧ*THNSSd W;&^3<c\Sd> mӦ r̉#G.p(@ Pf=k8 t(�<裐à2Ii�-6 ǻѿod͚ժUKlx޷Ojt~I#YtF!jjJIx߿?wnn/Ka 糯=Zo`yO>lv<dž<C c ƣZ <<'_}kt֭vQ>=T`$gzs6Z .pk׮5Ng8#YǞûOϏ-)>,Ȑuf̀_w޺r@p*Z>Ae)�(@ P�(@ P�(@ P�(@ P 02>.�(@ P�(@ P 3gƍ^tza/0`�o^Z0$=n|אG۶mæ {IѪj ˗OpIQ^|DwWVDI;6jťKb.p7QX?W/CӧO駟;u䥯$Xm9Q�(@P Hft0]al޽!)[իWcݺu)((( = ĐMrcћ=<C^9;싧Tݜ؇g!6އx5lg\õ__&.^'O?ł Ю];,[ *UJjQQfԨniG;q X'P\2nC߃-@ ȽШd+5Vn P�(@ P�(@ P�(@ P�(@He]-k׸`r(@ P�,@G9 YcS b7N=:0AxaH1l@Ѣȑ`Jt=N'sN 1ÇKk*t ?ԩL>tׯ^ׯBŠ؄ >=wLoz+T` A)9ijBzY�(@8s5 4Xhy]@49y$ڴis(*W^8p`jSJw^y2> ٳgM?HI4xE^8B/_6zczKmn݂ Ғ,1$E .0vXpKqbŊEd{Rr?<pTJ)t˽Qx1 +�R%]:W7B5NZYSt u�(@ P�(@ P�(@ P�(@' 0Gu�(@ P: ` +AzCAy'+Μ22(… &mĈ_QHm:uVKtr$c&ޭ ㏘8q"~'Os 7Yf =iWV j°aÒ!צ�(@ P)$0k$|6 җxx wP5$p„ ۂX+W 7I�4\Kr 9@`ɒ%cƌ~fUVȖ-[jwǎ@)N21c$yȗr*#yw>haūSs�@nzN}G4~oE(] })٩ma(@}@'}\xܹW P�(@ P�(@ P�(@ P��AS@ P�(�5A f,~=P .L ز(Yҽ8(OFGr!sرc1o<h�l͛7G|U_VH6 %K)勽iӦH.] N ^{ G̙Sxo,�(@ /u+0d+Orp@@ؚ.]2a_=z4ڷo&|? qΟ4h &\xQn2ƍɓF+Q~}3F$*Uְ@|/bH&9z-�fYN޼y۔˽4D q"@b(hz#3N�fao._G�>.&B P�(@ P�(@ P�(@ P,AFbm)@ P@!'#@ApXEG Hx :I*Fl$'E<m Ҏ=ӧcԩQ/R 5jd H՛�*Dsٳ}PlYnwq 3I6:l*TÆ C׮]V;V�(@ @  }2m�S.dY~i <C?x,zӔz� bUji8ƍQ`A3>ҸqcXTU{�1$:\ҌqhŒc\.+^rȘ1}?Ӏ%Kv>jn-Wjcݺ & ?*k@ o>عȐ(*#vQ�(@ P�(@ P�(@ P�/ H#֐�(@ UV~ܡ ta/Ъ)0~|E`hׅiKD˗B%1cOhBJ$of0 ? l.^˗IMX?͛PҬY34m%Jp~c|1k,r(@ Pp5J 8'xqgOࡇ R ƛo} @X1cΝStoߎ3g1 ܷC=HUt9ڬ bR@oa8ɚ5k7ø馛ԬYSnP;T"14-\qC7l�4R2|Q6pW9US{!c_�ݺEC_8_*\F P�(@ P�(@ P�(@ P@( e�(@ D�5b L1Z.�s <h74M۸(W>Ѳe* YFZI$⯿oN2AsJZ{Q *ic})1ҺAdנֿ-2!"EAfnذ!*VTzɓѶm[رEְ�(@ ĂAW_A]H{Ck@I| /w 0nX~O?$wC,I~]vqwލ 2@ uFIӠr2@ǰ9HV+*JҥKAYfEݺu#:V3fmvZ#7 MdhL!r% IAΜ@ZW5�RƉ@tl. v,)8 փ�(@ P�(@ P�(@ P�({ cS�(@$ ]ŕcDA1r̠ ̞ 4i⺠x<5r�&MXSAEkݚ5kL D.֯_+W3իWGժUq 7G�B8vV^m˗cٲeXjΞ=,Y@4@:u ȔUpQ׀gy/r+=R�(@d < <64m h dV@+tȑx衇'H9,(yV!x H7/;.&A:6c$:kȔ)*Wloc$:Դ2NRzc 'Ybӱ.,_I*UVu[G`&@'ؓ>[!k^r3g ָ߯e@nZ< P ̙4n ]>D�>.![@ P�(@ P�(@ P�(@ PTAFc)@ P@!n"JAuXY"0q"MT(Jw;wBHA1ZK9#WK.sJ#mڴ& R*T`f@lٲȘ1c]K&HU^4PUCV5@Dtʝ;7TbCjԨ5kX իf̘a|BJ�(@ PAL  P$@8$SLANpwbԨQH.]RР<y�z '`ȕ+Wȑ#UE1V#:Vys@ ;wN“7ItDHҥKȐ!y`Uq}9sV o{:ض-zh G |Gj6:|,CcU r]|}ʘs`�+}< m?p;' |tX7 P�(@ P�(@ P�(@ P@t 02/[G P�LPAQxP٤k3Q+�!w;p(\x@028T^ok؁k׮5֭[qY %Jwe9}hKn'elڴ̛7o6dp!,Y+B@4QebI�]6/ԩS'5| P�"Y@o1h׮Vt H浜&Us1A?�9zmڶzd)g@I�O6%͛븈=>K.ٳ's܌x"og|/&M*U :F=F7pr1RI7%CƐO uh>J'V }ϕkQxm`�@N>}hͽ�>.卹 P�(@ P�(@ P�(@ P�| 0ҷ R�(@ +?tG Jtp{\B \+p/0a$$}m^6 7d .ϛurůѣGJYHswɒ%aŊCM8/')NΝ;ͼcl/^{ÇǢES /й\r&@?>'ШQ# 2 \J P�"Hq```@Nqm9l 9'!R6iӦ!gΜmȵ--п?Î&+D˲L_RC!uѱ]vA)O<׌%uΚ5kkŢ(|1#c$w6a\rSVB,&rr…@ݺ (qmu5 Re\j3f*Wv>jc͚t-K(@ 8M@~Uc;vO@=(@ P�(@ P�(@ P�(@ P`dr(@ Pkh63Iza6 Dƕc\`$];!31B|Cԩ@VAĖ-[̅zqZ/׋/_l ѠB  +\{�I}]@X(D�KJ޽{O s>P 58IN3g6aJ2!KFLU~Ǿ}>}$lU)@ Ps\~ 81<$&6im"q ϟ&|ڭC_5spEY ={1{DCΜ9Kܹc$u %G8'}wc$h'S4iEDH͛jp =|ǥK55ժ5j�ի%i:1 (@$ Aڧ]:l (@ P�(@ P�(@ P�(@ P IGu�(@ Pat� XA <40ol*iLx#!KL\5k؁^d||8;ə3' ,hB!G Gɗ/83EcǎR{>p 4аA 6G 9ru~0 (V ~,^y-NПq5^:w}ww)@ P@$BH PH Lh~QSgH3qLŋڵ͛!i:tc%hVRIoa؏:F=>u<Slh~|x1cE T6 e˦ެG?ѱN' 4+_whg?)r�(M:A M-c[q P�(@ P�(@ P�(@ P�(.AK�(@ P"?tjTA!΢@Z5Q#(hL4aC`D* uh4Ok<^ĮaZ̙3#O<rr^h?ϝ;7r5 ~#Gd˖M.d̡9WrE8qBѣG5Ԟ:~ 09*TTNaЀYbĉa?wJ P�B![_~ ll v[Ji޼9W +TrA7L6KY\L \rsDFYo`�9s&鸈=6b?G{LQHg._~`%{'Oc#c%G1'I|{*96b<N}յ++@R!h0w2͒հj }Ѿ>װ>}\ C (@0 \�ȯDKa wT}\P9Y(@ P�(@ P�(@ P�(@ PI`d*(@ PEk,u91A&&)pU@3p5`$M,eBM l_ ̏[;K@/@;RS@G;`P/AIC 5 R}uϳdbB'5xRL2_g̘s :?<T uӧ|)5Qg 5GפavzL89_믿ƣ>jLs�(@ P, m:8=(W ҷzܪU+_ӧOGZ]K-۶9\ hG >z4:9Fc%>zhslsDHtl+рH4J/c9.b?G1Cѱ.IC9=oh9Nu|D\ | ۮ@H=ᐁޔȻ-|cU>jڵ-XЛ}sժP$492=Ppc ˖9fO @-(@ P�(@ P�(@ P�(@ P02=nK P�b@ML� L bX`D}{EĐOc" MM``.ɭ +I@/C4h%~ 1mvء^ܯ�LzѾOQ&Mf g\/ L8l6AޡvXEA3@}8Ei(EѣGl$[E P�|^ Ԡ-=(]:&^_,Xɓ'QFqW+G <u+0kQ-c<sl=&dh/C}xý#'z ; 蘈縈s+<_{x?DsD_k{D_kcRڨqxsm&!O> }Buߏwn�\w㦓:jأ=ڡ*@~\{z ߼k P/M�7_퍕bH�(@ P�(@ P�(@ P�(@ 0yDŽ5�(@ P:p2`CO=p҈nTUr^xq`4A&ߎ[R%ځ �BP;qĻE'3!`G2dv8>5@g;Q,NGsؽ{ 0]/C P@t 9 كU+woiӫߏI&aر;g� sGW@e:exh8k#I縈s# I{\ľھq{xJ$Oco9k‹yߎՃ=j5!Wcr@*Wg ,\8iuC`�׍%צ�([_+%'�(@ P�(@ P�(@ P�(@p Jps�(@ P�(@; 9^@/@jHdk=R \rE�<�<$r@ 'Zn۷D V�(@ $O wn>}ɓ]K͚+z]BoO</' l DX0ٳ9Mm{}ȯ sC^~<:DSK ֮VVr=jz^w!z. Pr#Q$ױ8CVHfȈ-aWZ*"=IJ-ӢB(#\W99q>}<s_u}x^}sKv1}$?ܓ@ \Fz^{M"2E�@�@�@�@�@�@�@�"Q w$1!� � � @ lоdHkRۜ^@ g[ڰA];gA@vTT)G#� �Q+`a#ݻK~*-^,r4lTt ڵ5i$| X<H5^nTj̘y"@ \Os/ҩJ{Kg)-[38 4mt5jHEH'pEʖH| O:)<!6[ <tHZ&kN @ wd#ĸ@�@�@�@�@�@�@�@� 2z#E�@�@�@ , W.UvL uk~}i„A� V@ ׅ͛GK/S` � @X4yFWjդsϕ>:tF~i,u AU5_/R}K{D"w 3g..PƣN8AGz5¡!-lNiB뮳cyV췿zuC @ ؿ).G � � � � � � � @tljQ"� � � u|IxzL kS͛cjZLBXT*P@R%TA ^h@�@�OT)[U0H{7twi:lRXxR@�XhTzYbqӺuK=$]zԬTd;J>*m*m+=hhM&)u.լ)΁z1xo  ۳4}z<Ξ9#� � � � � � � �S `8O[ � � � y:H IO>?sf s}c@Dի_wӴ� �D@޼R^gKIv p%ugM *%J̘ ('4d&MsΑ3mHcJ_.5o(V$uAZ(a/%[7syRÆQGEV^Ycb4 @v t"-Yfgg� � � � � � � � [Ad6 � � �D?HZEpz J]&M$L :unL8SСC1<K� �@>vtM=];z7Դ#k+bTjxۤ5@ Rʕ{O/dWO5+RGq>"ZpC-Za+JI/Z%|4f4oƍ҇JIH_b?jW)_@ N;Ϳ_>iOG�@�@�@�@�@�@�@�U x=@�@�@�,X@/?6otW_-!BEKڵc`"L6O?@�@ cn]ڴ|?PTҰ?�\`J @ 9ǿK<psg 3م3{7>ZPĎ ի'e>>H?^ eKD+Q3`�Y@3c'8<4� � � � � � � � �A!BQ @�@�@�B?_^]J 2vy$@ {VɞM)SdGw� �Ą@|uї__KII+J&_ӌIS V-Z#�/`/,M*֯/ť"%}+wHzIuJ !=m�6ad&},9s$[wRRɒ2/W o�D@~Я @�@�@�@�@�@�@�@�5A�@�@�@�4K-ZY,0deorD`r sNTo߾z׵o߾,@�@�X8didiZkg,ĩwo/bqƑ3%P9HÇK?.TRHd䌜 �Y'гW&=pR˿&͝&I/)"5j$U<({sҢEΝ4ftRRb)K{ Ad; � � � � � � � �)  k@�@�@�@ ȯ&2|��@�IDATY[RÆҸqY #@ }[f ?_۷oh@�O2e#5kPU-ƍ^Ouz~�YĉҮ]-H ݺunIڱ#+GB @d wߕSF{u$s3{5C˕<SV4UWu.v}  .?c/T( sj4&mej @\ kaZOA�@�@�@�@�@�@�@�@ 3y3 � � � � |A擓  ƌK]K Y| TPAZҔ)SԥKD` � @o_~)n`A\W\! $-⼙F,,/;T?,x; @ %|o iPqle )WYYY~?^/c d\re S' +:A<+3b � � � � � � � �)@dvj � � �q 0TTnL6ʦh_&Ǥ3\Ȑҥ|;C`T*}jڹs>;E�@�"US$=4i}I={J"u0. 5;|89W֭ŋ%_Rމv* y z <vxX1fMV-ޖmLI ǒ;1HIA�YMi8iTx` � � � � � � � �ȝ@�@�@�HM -8 7:Fc  ɱa1d?KkgCGt@tiD[o% � Iw)]+=lԼԴҾ}=22g-lZ #�!`cJe6jX:t~?ٶ&MW_v<ӯҦM_K'K#FH'5h@dV=UHVeU봋�D@R\_Dx% � � � � � � � @d 䎬0@�@�@�v /P"Sફ/ȾbdQ! >쇵ԩsm(PdIFSN1&@�@ &,iB% zb?cb6 `Jzwwt}og  Kq$p+W (!}q4t;g^wKKJo-#]~ԺTL,)E\(@ k?o^C � � � � � � � �)@dlWf� � � @l$ZEdi_8 ĞΝRڱ77f@@ٳ}*@�@�HSB|.TzQR% oɢNcSNl]RF@ Za3gJKK:H5jajI:!?^JitibF)~]fM)ohUq[@57/f�dTeK?@?Q@�@�@�@�@�@�@�@�[$� � � �M`|)Dfak@`0g$nǎYM"@ ,]wOd:bnݺiz7tQ@�@�\Bihii?ثiS zH90%XlV/m<8@V_D݊I{mJ#~R2i 2 "[ ~ZڳG*X0@�@�@�@�@�@�@�@�"K :@�@�@�X@WO*Z4[WjN; Ș?L0.~U*^\*U*.ϤDcC:u*Aqr̙& �DQG >O:i +$ $hP:t(|>}$"G`?q )p ?_/>쏵lY?-#N͓:KjZ3GX1ry$y3g|0w,r~髯߃ � � � � � � � � �AJQ@�@�@�itQ! ڷ,׏1A֨h8u.h=P @�bZvcE'[ri`Q~&gO΁Y0_c@� ǍǕ+[#ʝ[PAVxϖAp?Zd6RVGc^i== f ƾ?@ ^*UC? x=7 � � � � � � � Y_) � � � F-BV k'խ+= Y#@v ,_NdvzW tYGuOA@@�@@|r}ȑK/I&HK-[ B{tTH(N|RZҏ?cP+*W90RN={U=>?*XPZտh!]xhAZ?οLO%lBΕj1{A@ Xys믃װ� � � � � � � � @AoD @�@�@�A_4 2U"B`p,{r"bH  믄򆁑&@PB0ȩSNj!"� @|X؀ƏߟW]/U*m_xBtFSN-rn=fx@ 6l-1X޴)qjaأG=.[Vʕ+n$.sG~gK_|!U#1/7Ye @Z cҪ6@�@�@�@�@�@�@�@� \ � � � )o\ v4aCK}ɿz07LsD@޽]pEmܸхja!� @ qdիSW<XʃJ+VH͚I&y)ՊuI?/u[g0s_`3{M~!vo!|c@*U[R^-�裳hQiLuk ͓ h/Qrei,!�*pIR@�@�@�@�@�@�@�@�E P� � � � X'aVBD( ]sC~ d,| 8"`9(98F :t… k.Lȥ Q@�@�"NƌF&O/Hi]JyC?['5m*}T=Z?au>Ə�ضε`@أw{˝[P!1ܱeKB/%JH| zԾ\H8m*PFj}!�*::O� � � � � � � � ^ Ik � � �ĭ…Rq;A=H@~VF@"A $,ĸ@jܥKM6 ?L@�_ҿ͙#/]}tرR^?Yo[J͛a_6nܨ?S۷on;vH߻wۗM*_|ʕMpS{DE\jYbTx$\[ҥ( eCv-8іKWrʖ,DJr>bEn4'}ba\*'Ή㏗>'zO@ ʗJh@�@�@�@�@�@�@�@�H 2ҏC�@�@�@ N(,CL"p1ҥA 'O<@�(Wɞv /wu 6}ۖ� � mHv[BzQ"w!$Ai.ӥ7ߔڷO9,_~Ѳe˼kzgߚve *r: |Gϟ[Ub(o>l,X%-LrϞ=A-[ f^WέPj5kz. $d<@ MCa;wóc-ܱCĐG{lzVfϖZ>6;g}7l  AQ= � � � � � � � � Af+7!� � � KJE&Mbs~>aä^]rYZb t J]v*RO!Cܙ, � ժ.kWpD}Nɓ>}n# fh"xb/q֭^s\ [U.V ЂOwIX\9dɒ*^ .WkgcPm۶~'7nܘp` ^B'WO<Q5Jٸ( ^uRzm:ee ? weUd_.?#PRR7]Z Mk, oBSQ bW = @�@�@�@�@�@�@�@�P Uz � � � …~K "X{wi #014B HBA ,K.6mAqu, �ĚW_720Ç}%j7oY>'|~pmT`A5pi- 6t}\~ /xj;w`-&?~{ޭVZ)UmٲEw[l,m�˦MNnuI-6 /Wǵk{ v\:1eBi /,3=Z$axUvAzaiP^B=7;{`!υ` .]&I%Wx` � � � � � � � �u@�@�@�@ MoחK#XfO24HS`rɂQ(ěy睧]ЁPBM"� �Q/ ?6k\RklΜ95k>S^c}V֭5l0/v.-O ERJn-ZH27jѢE?_]vy ٦MuYe˖Muݻ-n* DĠƍ X]Z)*0xtԯ4oԨQ4Ɔe +kKYB,D\x` � � � � � � � � @�@�@�@ U l$lMV1cHQAi*F7h۶-ӧkС1=W&� �ĚCI&r]H'<{mv~m}6ls9GwZlŋE+f֩S'o… giܹ2dJ|ҥw;n `wkÆĠuk I+J͓>uVKvn^ҥw.2㎓ ě*UW$2i@�@�@�@�@�@�@�5 c2@�@�@�Y!ibKc 7H]J?(խiX`ji~ #T@^ʹicİ@�@�>Or,,ފOdaճ盚2yʛ7:,,XB8i͚5n7},sΜ9zw\D~W~8K AI7J',1BMϧS^'<k,YүW W\0$vg3jA@ oQw.COA�@�@�@�@�@�@�@�@ ] % � � �%bɥӪŶhI][zAaČ~TFZ^z@A7n) � �Q!rP?myi>mzPo݊3s2ӹ瞫… Gż{ ӻt4?ɓ5zh|j۶m)P`.?18s=j~Ujٮvsroxe%N,<hQ1nZnEz(|Ղ ׬3l@ [re)@�@�@�@�@�@�@�@� 2/C�@�@�@ mݺY=d}9A h+|TTxxۥ5Ek)_]a3N@�@�'`!o={ z@5kj\!%D\CVZy &w3<ݻСC�g jT @cBoOᨣrC۴? >ڽ@hR'$M$/5m*>ȼAdbLjU c2@�@�@�@�@�@�@�@ K � � � �XDVM|>g~K<"QCc0 RTb31,P@uԉ >L @�W`֬Y1b.\( �@ȳ>[hH92;KHrw[ou [7pZ,X:aعxܸQ Yc{eAv?䤏m]RYB ]$}t%RRl,r5,#�+`A_Ο#� � � � � � � �dL ȌyQ@�@�@� |T~<Z!C{n-jKUʕrL@ͦMtq%g@�@ :/^>>L]vSO= Fd`,rȑzu]wiܸqgC}|d!݇I RKD79rpG{lAb![r[Fr-nE;VKOiɽtQ@ ׮͂iBwފ3d@�@�@�@�@�@�@�@� 2G@�@�@�XD/vL+ x &իiČ o^ Ԍ34hРw@ � �"[oc=͛뫯RӦMo:J,ѣGkذa5j /�2-yx*Q ,B�˫B Vj׮ݎ=ش`[v~Ϳ,nM8wn<Zc͚'>?*%ʕKDda׊ƌԑF,r?א G�L²� � � � � � � � @(AD@�@�@�HQ`niJS((VL8P7NjB/S@ VTq2BRB ;vӧд� �dyEG /-gaw4@)裏._~I\s./r߾}ڻwv۷k۶m?ahڹsq.=5kOɓؔ\aɂ xmT}WTdDؤ}{!I`c!FjԐ{-{>[j6F&AӰ H+kKYݟ/hx` � � � � � � � �u@�@�@�@ EOq3+X`PixEdq#6/V7Sf*УGW[lP@�@�G{߮nݺ'9t 6ŋ5vXz}(ꫯc i ?on'Nmݦbj$gT޽{SN:ꨣBj/+,M/ߥ>ڶAwvoc%1Qx_=["0dxTȺ9W_Pʂ O>9e@ I @�@�@�@�@�@�@�@� 2�#� � � KH IUF,{JK\ M.,,UYDž@ǎ?~曺sf� � !./vCLw:CS9rʥÇ3ΐ7mԅVjnmڴIk~LλQG}!Cz yaPG p`@c\,cL?тkL\?ŃbxqRV'l˨@|kڵݓ @ .ɂ 7;@�@�@�@�@�@�@��A=@�@�@�H梁uܹhq4n{Nڸ1&TR tT)J'@…վ}{/D 0 � ESnݴ`/XOϢh6 6_Ν;SOܹsUN 7ys}Q}`]w)m=?|{=nݾ][j>8޳(;Z9,M/17 U @x|R:wokK5@�T)_af4@�@�@�@�@�@�@�@�H_ 􍨁� � � �Xdldu w˕-0b^`jZ@O "@=t%hKi)^xHP @�@ >>}/tQF?z̰@)nc֦M/3FW_ƌ~Aג$8P\7xzU1Bjw߭Ç:RݻCX'$8т-1xv{XB :t ZZsj,kǔ @uTeKg/@�@�@�@�@�@�@�@� 27E�@�@�@ KH]I0{͝+͛'jac8 jTJC{N:y� � �*0j({ ԃʸ *${e˖֭Y XI#H۶%6x?u.w۷zѣGoև~iӦH";gdcAmق {lbEs3m+]l;I]t~iw\݁ I' 4+=\2 e.#� \n:A  � � � � � � � �! @�@�@�@�d/T׫lcJdi1bN +Wi1!2-PX1uYz72;"� �d twk„ jѢEvb;wɓջwo(Q"ĽGzK+WmO_*_^.?Ç[CAu\~<}w~\3wX'4ͭ6Vvդt8|JoqcmeI?,f͚WJi׮\S\?㏿Ν. 7v؅J+ &]ptrKʥ7x;v=ܣU=N:2d=G.$-|j߾goM ?~zwSOպu\P${ Փ OJ}_./΅^{MK .fp~[_|Zn9sxK/_tOW.jF:twܑPJz[mM>yqX[e]szcǎ@7 vϩO>K믻{BgsοJ*K/R[nRܭxq; /=gRLC^O2# �1(LvoĘ � � � � � � � @ ;) "� � � ˖U+>ϳc<s}!>;-zTJd!ݻwٳ{@�@�𰫯Zm۶Հҩ}-n޽.0poߞ}GqOǻƇ]Ң�ϲ`G -Z`+Hi~I< "Zj/LҪ)ںgkhq؅A6s诿h}.^ZiDw$1-;rC'OGC9]PakWj ]v7ӕW^#G44YHaUH7_6 ={$/]('I~ꩧ;he˖-/cbЃ,Y ϹsPLoI^7x<F;,1W\^].P`Wo7 wL|IuUyZ۴imn~6[1c ]s5yziys??P/h|v.>Ӹqdaj[=GҟZP=Ϗ9b;v,M-`^?R[o!ÝVۏ*V{]'gϜ@�;4Z!� � � � � � � � _ k@�@�@�A ʗ2UZlYi0xbZ Ș>L.K`  � @d Xŋ] K䋠R\9]~^xZ +r%f&….P͂a˗\~}m(+AM*} ;wy=s:Ը. f_z⋥NSN>rr->ĴR;G>RFԡC/[|eӦM^d t7^pΝ;^ZcԵ:VRmKN l=XrzܗZhf˖-5zh)SFT^igD(U,'%6o˓' aÆiҥZpa>X}Z|@{]si}p=GV>6m>.uի ŏx"-g{ie: @< (@d<� � � � � � � �dD ȌhQ@�@�@�,fM)WU,Ĩo^yEZ6F'ɴb ؽ[.`"' 307x# ZI@�@�#@vڹ ?w,yQEȥZ&hѢڰya Ç?LƏ\. z8CF첎QT*6f| }\g͚5.LoBmRJ~-DzJ((jeҤIU[`m4`EB ,X 3aPB^c&cAV h%k%?܇vƍ{ %tDH=!$ kdDfj9{n?P16SOp/y("Wg/]qYHgjR]odU][2DvnV??ǚ"@ H_ � � � � � � � �?9@�@�@�@ SYVve(G1Bz!Gp XʟD @2ݻkȑK?d[y� � ל9s4a„,saиWU-N/TRzG~-,_QGkرС s`GPk=3Zt/s=W3g/oF'N˥Cw/^8x`h"7|SvF uܨbŊz~ƍY|ɺKrJC:tz쩳:+p,'7jzRzU`G/M ye.X3IV,,dʅ^o[?zho݊+\xBA.UByak˖-jӦMBhmfmμ_}U}^HؿåWZ]+'xwQn]oR e{bn޼y^۷W'/)YI<ǫ{/O{uc.]Z v$(3y]v[E癝cbsϟ?{6}غukou:fHۖZ9lJp{_f0/}]2eגaÆi̘1j֬gjuv>댕P3y饗davL?#^m)ɲd>~9ɺ,"nu/'wn]L"� X޽nf � � � � � � � � X@�@�@�@�2 @db}pɾ7uk L) C]SA,tgǎ㏏1Z@�@�$ٳ + KI R]M6Mo>lժ,gٺ, =}:sΝ;k^|f!M4ԩSeVn&/p֙MX@x3; !-ϧOٳgkΝ^(ߤIpB/dګZJ,B~.z_D z2.rR.R"~9RL(۷',`DZZj^cӦMzBػwoZ> ~e ¼袋D?m kze˖ JPF lԯ_?l?3H 0J K-fGXx䩧)S .۞GJcpA+A:uGm i&m&o';cvޘG^x*T vsO? TKOޞ=-684݂̈́yiA)T&W,P4y ?_>%,_Zm۶MڵG) W<cnC*&{jY݌>Guγ]糅S[UEJ"/mڔŝA. 88L 2}#j � � � � � � � �@�@�@�@ cH+V3[˥&LF0zbI`j? ) TBQ,hEڷot#@�@�rD`ӿI[(>{sTF w!+YX_JJg_|Qgqʷ}еe˖Y߽@I 4ڵÔ.]OhNHX\.NJnź{%WtZ{<y,prÆ ^B^s5Zh5j$ {wy@ ݻS K<0 4]ttr̙җ_J9\n q }ʕ�}&T+÷zK={ׯm@xbna N?_|Zh>G}TsVJGZ`(m !Ν6chb7P,s֬Y@B`J<T^ݻOn`eϣoFv[Z؟Q=Ww7z+V'M{leq^| eۉ'1�JKztj!vwpywW n7N|mǁw,83c OYfB0 h?_q`{9bcsҊ(lƎ[y=~A1f @d � � � � � � � � @9nu* � � � �ʕ pa`˰vܙ-,r\D$!ݺu;CÇ@@�@ ʕ+B:(YX䑄S+^dpuPX ^uznfXM;v ޵@cСC5 bA5'Z-Hy+J._1_  CӦMհaCM4)xl!�eު@آOnp]('J9ŋ'܎mD #@/g+؞d7 Li&-PjU/^)[4c9 ,]tJ{QԣG ><z]iaF QJz:u,dBZm 7=֭[\V |;}XHG}; |7ݻ*||iWs|R.L3F](1ch@ k]y  � � � � � � � � .@�@�@�@ e5oq \{gܗc} HWBA�TvM6髯J@�@�S[oofrXh22~ɫnaGZߊ-o6?k^Y_.m_օ^6 6(p|S`A:id-)/oݺ5ŀ+Bg(AgeΝzJ(dN$8`�o?d@[_p <D 宰 ҂,4R@կ_?Rϼ)N 4sTmԨQ^;lXTLN\r~a}'zR: 1bnܹf̘;zQ5j.ڑU;B9_I뼳:l^wyO-Rڵ5|^3/Я s$H[v|.i#iP) � � � � � � � � � �A!BQ @�@�@�,|yױ/|̙Y"j #(1WV7|3'A � � X8YA�A_B yZ*<0Aym<^_z\m6x6lfZbXtu .}Nyl% ȚJ7r]^yfխ[7z 6msi ԩ-'o2X[g͚=w}JsGinώ/IW#Ge}ystI^>Ƕmj^xg}>s@kڸqq;HrH뼳:<Qc �X+vZHs$H[ΗO:Կ�{9dR L±=뿁��@�IDAT � � � � � � � � @ #� � � yzZߟ=[l_0y0zbE`z cX2֭z뭬뀖@�@�BҶڴiӧOF+͛寿-B:ѦB_zuܹsw$c۱cGxˁYnM6@?n4 xaus,3+ˌ3ds;묳qy)SڷH = R @&ώnEٲee,eɒ%-0\b!vɓG UV}>oQEv)\r*鮴bSL TOC 42aC {E(it5kOZ~x T<?[h#TX1=#7g~/BC Qjl#lRsO}^yzuE%~&A(K`;8oV^E5J8leF {8#6kZY <k{:1iҤ7zTI.ؿҼ  � � � � � � � � �Y%@dV. � � �1,@d f_Gzn;PLe:hf cFk׮Zt~嗘A�@�YfϞ~)KѶm[] O{ԫW//xooBn7S\һaoKm_~*T7Ç룏>ҨQd!y*R^~e=zu]wyU}]Y:l.\*UW]}jر^RU8Կ߿_\rOV6 jĢE30ܹSNW\ql"3E+3gԷ~~81Y঵{}%Գ4kLW_}u:;Vk׮Ս7ިO> [n]BO<Q{SO=.Cv .5rH.ӥ^g7V*UKkS%dLJŎ{͚5�єiӦyrݻwh\sM`u'xBŋObJ Y`p۷{͔.]:Fl$/wM.]< u-֭[s_Jssx_+Ov,Ry=^) � � � � � � � � � @;:� � � �+`ߏwMı k Sc@lVaDRJ7ߌQ24@�@ ~:u꤆ ˒I[𡅞Y@ݠAԮ];5jHZҊ+0H 駟zAɲ@5 cҳgO-\[N+*Vؽ{wY蜍#XX-ܢ;w+{WLWlY/Ђ,(ڜ3g7 5|:}:Ν5ka<Lp Y` a^qϺ[ܲ٣Gq\rtI^pkp _wl@0hyIxh熅5Zh۷w!p4yѣGkC+{g<x;m<v[1ct9$gv (G}TvǗc¯_WZh{@mHKj2a/z^k&MPO> {L}6. LX٦UR_}:J-P4P?# }qڹygm/`η3<S#FСC^V192%,^͛' �H{>aٸ~e?wNc+ c`2@�@�@�@�@�@�@�@�@�lSoZyҺue@�@ w$u3/|5fp9kmO^Y# >;%�+k}g�9$`Ͽ֭@rht@Xвe4(1D�@�b[`jٲ&Mdd׮].ʂ,BXJw cзƍkѢE@6XD N|{[g6UzI*Ԓ%K/S3-4A^ߪ[n^H, `)Sۍ؎?0twr67vL#){_jXؤRJ9Xorᘁ8�̯*ɹؖ~˖-^`׭[ \tiM~l>KδJKPrV༰P{Hh#Қ{#DV޼\)!�\i̶~ @ ?؜?.6+B�@�@�@�@�@�@�@ Y � � � � {i|8ƨ7YVQ=@ _1LG ,@K02<i͝@�@�7oo]^{,E|`{0?C:t4_>}xkjJ^`C"E.p,c(ON8Q,$Ν;յkW/pn Xᆱ͛7g*PQFyai/~( sV*UBNr<iqVZifԀ[(TRTK+^iC'J8c ^s+/vBJ;Nz5p=GBONqY\*TȩQDo.YE9 � � � � � � � � �)7;;/@�@�@�~U9d{?yfDU+e6J Mt˨1c!FE7Dg TMdΊQ!� �-`A?:u9sQF7bŊoNw\M4O 4\kWUqeϞ=ߣ{U:u_y'xRW8ܽ{w,q֬Y~Z&MҖ-[Իw mA}FիWkȑ'O!gV[&tBի7|3S駟@rF6mT;wVٲeS3gj޼y+з~RʈhРj֬qy*QB<Yl>;$2!@�@�@�@�@�@�@�@�@�F @�@�@�l-2L}_ݻK?,4pdm7d\ +T~@< *THm۶uoe(&3 � ]rҔ)Sԭ[7uY1c,-+CZpN/v6^| eի'!׵G [jѢE˽0O m�L+;v?ó\ҳ5kp%/BvħHĉe7J <C>|xԽGY 3_|yfd@�@�@�@�@�@�@�@�@�O ;@�@�@�#pv_>&9vjՒƌ}6&TuC0#DuUWi׮]*\pa � �-`}wpNUzE&Ҥ`EP("+ubGv]WbWlHE** M:R^30Lfy.In9Mnn7C2d뮘GiܸzQDnkΝ;7K,qiݕ]m �@ is۳gOS\|f̘9sxկ_?Y)bA@ '0]pZf͜blZ5i֬3A�@�@�@�@�@�@�@�@�@ y#9}#� � � @ 4;3rzAihiÆD[ȊAfō6+ХK>|XӦMK\f� �D@g 5h /Ђo#,t-%%ku&e^yeO,IJo>/rz)/<2))Iw/_^qFK@7@�H i#+'n$}[x @�@�@�@�@�@�@�@�@�2 2c#j � � � @*5k5Rj pOx �q s Ƹ@ ԢE }1>� �ħ_͞=[_~6lQFDclV3fPտ%'tˏngرf|n-.9K+^VN:_kO>ǎkFE 6u"2+;‚ Uڶ-+i� � � � � � � � � @b X"� � � mի3v7tG J+ .Gc*DѣҖ-rQ>P@ tU'OQ{Q@�@�N/ҥKգGtMۋ-q&€nݪ.H:tz%r&tvKm[2-[,k[Ց#34w\رC 9~x(_͛7W|\=  ݺIEsTi) � � � � � � � � � �A�q7 � � �.p5~_5LOW@�ظQ:vL ~:vuJ;wԧ~Sa � @ (QBC_|y .P׮ݴd R"-`TZfK=zzlbntPwy[^wB>rnqiڷ!7G//K.  [KK|!?$2v CA�@�@�@�@�@�@�@�@�Z v00@�@�@�O}+g}ccD+P ù;@l4))Qf<4lPǏO� � 1u;y͚1c5k:3"DxժUׯWÇ�GeN]wu3fvBF{&hz[fe[B!�z GeC7wQ.+epI]5  3tQ:…ݫ{Y 2JwB�@�@�@�@�@�@�@�@�* jw0@�@�@�[`Z|dt#p=ҎҨQ}@ lϸRD9E ]vՄ = � �]A=nJ8ɓѣ^dzjS0%?#I:w}W;wV:u4qD=Z>߿)rDu%hȐ!Zn-Fzz߻-t]n_mw4r~\] WI.MJ~(Q@�(hN.6#CV U @�@�@�@�@�@�@�@�@ @�@�@�%ť%ciԌ5Tr3sjlD 2eBUy#u+Rk֬w}Nh� � 6E肺-~le Git[ ;h̙Ztڷo'xB\TS6x(?S~~]kkժUGѢE3E`='#}{9A5k.wmDZrU?Ε۶hԭTԺ\髯|)S;J Q \Dt3q׹_ q7-&� � � � � � � � � @ ;)"� � � YrΏe_&e/z@�S XdRҩp/-pbŊ8qbX� � q#GSoN;M*知% =O|ҨQ#K.$rƌ wޮnyuE "*8mORժU+-X@5eR޼YSr.0Ɏ|〞| ^G?tra_HwHF s?�ޓ-@�pȎWS[X{i � � � � � � � � � @Y :n@�@�@�? o{F J:IO?NJN\mȌ@<yt嗻b3E@�@ \GI濟Yi ?r\鮻`lPB|ot\.+ #_UVUfԿo׮]2n=zT .t<B-oѝwީoVK.ՃW=*Ee*4vl ^GzNJkKo!Rtu[oAKHw?>zA۶yFZF�"#Pdy/^Wuv @�@�@�@�@�@�@�@�@� _W� � � �.@dK.-??<} ,`AII'g dNK..d-m߾]˗\#j!� �,pdcJ'm&s4`dri6{->cM:USLq:,jJw6mz)_|ik+-󫯾>LUbEnZ/ >2gH{ycI}J=' ,S4U:l�;ӥɓvgGUn+@�l k_gJ j3Y@�@�@�@�@�@�@�@�@�, gY! � � �'`Am$޼qh9\駥w -@ K( E.̅n,B3@�@� B?wMB{zjJU.\؅ vuK(gϞ- I|Wta.\T r?dq4h:unݺ.t͛7| cOdb o\8Zd؛DWp \p~iֳiI/?W?ı}{J9S[tub.M$M Tԩ i%K?E�Bh?&ZΝRٲ@�@�@�@�@�@�@�@�@�H_ m@�@�@�NذA\D G駟5Ө*ȶe|Tn�(^ nd& Ȅ}0q@�E~qr!R>~czaXUPAݻwkf!_?ygIYS@ ^qn;vz-T >Ө*.ͪ@,eUT)+V,Qi.4k ܤY6゗k׮wudakV#PYfjڴʔ)s .gS:oԯԤtҠAr9/_|RZP믗 ȦkW[7>X @Æ֭rR2ZկcDd^@�@�@�@�@�@�@�@�@�H\ w3s@�@�@�BHNNA Cե瞓Ͱ:@ 7K+f!M@ EK.zGt(P e=W@�@�2/d8v\TtRRƙ''k9RН+֭]*+¸b uYfy?nWҥPH pF;`ޥ9v>ił+ v'PZeͽ�.IіjժCzE ibץ1c^7Lu>M"}ҟ,]piUY]  YG } ?BG@Ƴ � � � � � � � � � 2l@�@�@�زE0ʕb:L"__ʖ8tHڽ L7ٯ_?͝;Wڵ@�OKq�H SQC_69[X`Ru`\xޒ,٣7z�wȽY`cB!K(iA65̙]h+W*%PL2T*TAir,o]顇k~[zekg|>_,Wst}m=IA�2%`?xdaA.KXdIxqR@�@�@�@�@�@�@�@�@�D 2>sG�@�@�@ wZWi i0P`YyT_/dM3PÆ 5i$ FH+@�H DZceˤU=Ϗ  2i~Ϥ:uBwIleK8;.8=n.R.pԧԠ4d?e}NEHW]/Gȅn/ =tõje};D�=p5kᜡ'NQB�@�@�@�@�@�@�@�@�G8)� � � � 2c/Сx-C gYo]tĉ{@�ȢUғOyK*o(['=+!+WJ-ZEtծ-լ)Mnuko;.\ڴ)  H;JÇ}I~9)gH oGT֯-@�@�@�@�@�@�@�@�@�H$ io3W@�@�@�!`_.SF*\84giNi脛:F  ":G ! r G˗/O2I@�@ #k={yysi,?@<y2)z_DjRTIS©t@P!驧s~5Ə?Vo'k燚ZiRҠARj}#FH{d}D�׍ o^ᙑԥo@�@�@�@�@�@�@�@�@�x 2^$@�@�@�@ [J+Fx#tw+K^+ wScB䪀A,)Y@'p\r4iR:5 � n |QC<X:li ڴ_̙㏽IiLlQ]&}}{)ZFҢ7Rnr=]q)qR}?LNv bO )?NsoĄg=[F�@�@�@�@�@�@�@�@�e � � �ē}!|xs)^>=v 733|SN8qbl � �Q"`+^zIjJVM4H[W<YڼYzuK%wecG?rmk~qt+ZFcGK#FH]$Y.,u.`u+Ϗ~!2ۦW~mۢ4B \>FX@�@�@�@�@�@�@�@�@�> o0"@�@�@�R Ȩ-11Βڵ 2HbBcrL&CW\q͛_~%FP@�@�ʕ% |-sg@6nI3F*X0F(,)5oΏgdgNKQs33j˔n]=rt+ի'l))8mbKB CcUJ;wJڒ � � � � � � � � �$�A) � � ��#4cYiM8Q`\r*СC͛WӦMjC�@�VG)O'm*-]yTPN!ُQ-=+rz!wc .$6SG?_j,?|Lvm֬{ Yj>wK}3`+ w㈥WvÆX5cE�@�@�@�@�@�@�@�@�@ gOs!� � � ,|S^IWOzjB 2-"@RtkĉU޽{̙s:n � � gR.iIw!-꯳G ]*R$f|Pz'Bk-sF3co1c:B,L=w֯qf?zҸԪ4vtHffAEW9UzAf΋Z � � � � � � � � �)@dbwf� � � @ALFTyH+-Y'@dh@Z]\JҴiӴd=SjѢʖ-Uu � @ u&U(z?7ߋtRbQ7 1o_s9im;9\9io*n6{Io%u*c?'K CI?AzF ?r۶ B�AߋdRE $@�@�@�@�@�@�@�@�@�R ȄL@�@�@� ݌ x61l빅� -HO`߾}?~/^GYfzG`siB%JH)@�@�\8x嗥-[I$[Wd58|`ߗn) ky_\z)A^u4kht%Ν',d^!Cե>}o@   112)IZ>6(@�@�@�@�@�@�@�@�@�  sCm"� � � c `nT )"+YCQ54@ sGk6mڨL2֭}]-!7eF �$0Az?B =m ryNb(/u{4+co:Hs!7HK[J[᧹5 |)碅T֯/^̭q]@Ѣ~?% T*mؐD�@�@�@�@�@�@�@�@�@ L=|@�@�@�Ȃm~# GSڹS3@�~E*W.FTE�9sB9r:WRNZ @�@ TeT曥N<XڸQ9S'~>chNil? 0M8gAis&P駾_Vwm irVo3ۣ? \ AY � � � � � � � � @({y"� � � Af@5H/�dU`.)ʖjC�իz! {L͛W%KLn#� �HN>H6R%sgAȹs!#:(|⋥͛>6ҁfbXIIR&陨LUP eIUr|{+nݤ V{>[Pe۶9>6� 2kY9@�@�@�@�@�@�@�@�@�g@�@�@�@:fLȎJK_N?E QҥUy#>ÇB JRһ � @fϖCp.Z0@ZFZ@eJE _`<NA6-[3ԙ3o/ؑ[#9y8k4gdq{v"-]zr] @t *_jUɂ) � � � � � � � � � @lL>k@�@�@�@ ']dN)]ͥ^{t@BI搀<3F@ -�iJ@�Xa~&]r4_H=$~z=ُKl)YߧO(fǎҊձwrw짝&}odxNzV~gK_?.@  СWƂ7mCp}@�@�@�@�@�@�@�@�@� 27& � � �1&{T? F=H~(YCd`D�AQkX ri,_\er1YX$@�EHի`קl7_*ժ-nsHmHMH3gJe\NyR'PU ׮VJNuԽRib>֕yF:z4gV@ k Igmk;[-@�@�@�@�@�@�@�@�@�N8['a  � � �$=Rɒ *н$RX3B ȄL2 ƍS]ZAINrxo9@�[`i�3 .&NnI[w^6&L:v:t&MjOٮ`AKiӢs|4* PNj#ϓG:irG5,2* A"ʕ7Ҋ � � � � � � � � �$�A) � � �Yؽ[*U*iIշ' 8/H%JHw!@H\øq'A!QR@�Xy[zsS+i BhȪޒG%nQ3Fx,t'c^x4j4lHQ4hwl)=믑}"@v#GC⵵iɿ � � � � � � � � � p�A{p @�@�@�سG*Y2;X@6n]:p@=:صK*]:'Δ@]4tГR4LX� � ,_.=ԠtYȑWH J?$ ,5mq?Ԑ z^}UbA{J!p.{`A8z\jIӧ?b?r9ҷFn{� ؏%'.[Xح}qc"+0w@�@�@�@�@�@�@�@�@�?O܃� � � � -3PAS.t+@�8&n5-?4][)IvK@�@`*'&M>֭}V: :|Pz'+.oԬ)թ#M˕IoҥJ\#mݚ+Ci7,-]*//]p!52DP _>n NNJ6m1-@�@�@�@�@�@�@�@�@�)@d6i� � � @"#{:?K~+͝fĪ޽R:zƍ@ 1BKN(A)\A�@�4֮~Z:\vm祋.f͒֯^|QjBʓ'ƬJW1O?ɝӭwwtDd8w=F ,d1Jj'n[JN3F[ @ƍ6 � � � � � � � � �"@di� � � @6vJF4E  ʸBit*N $V Vr?OJ8 J  �6͛K5jHKg-͘!m$ &i#/29|XZ{O,u:v4ЬBy0H{_7=YOH#ԭ믑"}#@F,dTOHJϏN\m@�@�@�@�@�@�@�@�@�� � � �d$gt~&p]RޒT>h@" H{(p )СC<쒄9}Q%''+xi׃Kz|r=NZlly\ DzK>r?~o](P[ ,rB p])RDEU( � Y-[wߕƎ>L*YRUzQK^#D}~?nBi4uDQw[~_ϵ Xp#HKIgjݽTԹtĉ#v@w }҂ � � � � � � � � �$�A) � � �Y/+4D\#k~ʪ܉�N O; bGwڥ_~ŻݻSu}w'"X;Z(cf-ZHb0h1x:S6ں5kj۶mx {1\^Nڒ:҂*iu2Sll6O ,Nl)^IK%\`UIo)UTu[Wti)SƻI  �۷K?Ξ-z+]y4~ԡ\h3Rع[Z2M{reaSJAwY)yR޼?R]x'R۶}Hq/ .)HJ6m:eD�@�@�@�@�@�@�@�@�@ aL@�@�@� <(ٗ)DB3, 0 ڵkN&6;.nݪ.iǎi.G <h'i ԡ�\iz0Ђm)NJNnA_˼aHuٸq*W#ʼ-҂4S_Z -HB3SjZ&pbV1ʕSZKUbEUPAe˖u!:1֤Y� @*]텬J vtҸq~H! .;>LS'`W;JIR|18('!5k&=$Q:ԓu~8hҍ7JFNIa1*@dv}>F5-k|B�@�@�@�@�@�@�@�@�s'@�@�@�@Aڇ{/з҇Jݻg?z@ ,Dx!si mw6o-nh>&[MbC-q^0`2e ^ܙ��@�IDAT ?,X0UOy5B MÂ9|{nY`g03~_n,Yybg>Nd RJ)KRRR*U@�M`رҌ~ZרsVb6ʕҥs7Or _:uW.Tj29 а#r啱C \:wSz啰 iav� � � � � � � � � � @�@�@�@  ӁaujԐ, *ŭ}Rq;=&f ԋ>^RY`SVs=W*T ^K *Ħqھ%rm۶-e`w}n߾]ǎKلZ dzJX(@�H /M(YԩrWeIo!u*5lM[W 2;eMcG3)S#n]fMi4 # {O6i,)OHl%2}m+']}ޮy"kʕZ7/ � � � � � � � � �$�A- � � �Y 2Kl4 Q;.]+$ < @.ͅ}kO`K]jV^~ɻ붬]V-RD UV[jժVZ6٥-/_`.HS@O?toIBɲȍ. ! ^Z?ݛҪXb^gDR%!u{' 7Ŋ+ � 6hᏓ'KKf?JЭTYȱ_S"'0gtH| B7OL )}f | ..s{ *yyt 9y6@B Rpl쨤$$6Eˈ � � � � � � � � �#@d F� � � @ THʼn@NRkIO?'bD@ Fy]Bʕ+|r»?z7oNըQ uK.R+䔀&[9t7k./B!-t͚5޲pB5V,*UR:uTvmﲮKWw`j\"� :$M?N t6sIW_-/2r <&\kl_)]q4jKɲ;KÆIvN(ahL>i�k3Tq̺Vp?6Dt�'R<'f6J(DU� � � � � � � � � @ p #� � � #Rr2AQ;+yJ&@dŐ6!p x6daK.w}e˖yO?^]@/ׯBs, f͚*VX0R[7nl/{.XjpYjfΜH\"Ns4jB" *fD�O,㣏q={-?A:S;@L䩝z[oo:(' \r94uԻ&I#ss; u︶hÜ>[C w Mޞ � � � � � � � � �ī�Ag � � �a1+E@$nUz1?1[obSy3,\hɒ%)˷~+Wѣ*X<L5lPzu}]k$`AVPb b!SLs=玙?~YYgM,{%#"@"ع'an| )]xdAo\#Uy 3oj!CG BmHԿuk #x0S'馛Ν#~+@#GJ_,u*}TDC ;&^GCƍYkK+@�@�@�@�@�@�@�@�@�Y x޻ @�@�@�0 Cgt@.] ̀T xL&7�{ŋh"o6l&QF 5iD=z,v^p]l͒"{zg{KQX?^K._W^yEk֬UZU{?|o9Td]p@ ,i\?~PemsίO̚[FOgϨ6orr0@ǎҵJw) ߺZ]ᇒDR@ v+kIIҦMYkK+@�@�@�@�@�@�@�@�@�Y?@�@�@��ca@V ){)3J Xg}-~-[捶;Y< K*3ahĶ@~T^=o޽{dvޭoF_~ 9R-ʕ e˖)R@�K }:,{=Z?^ a[(, >Z]y.w =X=Vdҹ0瞓<SzIsa�ܤ7K\"=^eC#@z7ow23 � � � � � � � � �$�A ә2 � � �9.P VE :H7ސz?D νa͜9S|w~z.]Z^x #ꩋ.Hw}ǨO\-bᐋ/vb`;Vvr$Uծ];mֻRJ  �9,h8nNTd?$`.7ł +T>Ç^Kh >jזl2E%@JԿtM$m^nE KCU>d$@dFBߟw_{@�@�@�@�@�@�@�@�@�HL s3k@�@�@�2-Wϧ6bz^{Mzq^<i_bP!sGKI7o&O-˖-,TV6m԰aCɓ'wV@ d l߾X@ ^g|P ֠AuY_~ ilM@ %KGϫ5kp6 iƍC)A^nݤ iӤn[o"E׌'SMʏeR~w7qKv$<DB Xd| 5Mrei0Ͱ � � � � � � � � @S@�@�@�@�A|1}# ACL @,  YW?^zB;t蠯J7|kwڢw}WwFQ#"`A\=9n\=PB`;FP@�#wңJuJ͚AZH@,ܹSjNPeuk[Z{Sg ԃA~~}M:j}Z00mrplYkanHxB HJI[fZ"� � � � � � � � � A^eN � � �Q a ÈJW qԶV % ,P k=?sLp ^-<ڱcw_դIsm/arF!ny;.1ގ  y7zٱ� cI H8rt…RӦAfGOڰAbif~wժUS54gΜm Z[fѢԩ 6\n˖rAH�°̥/0tH "`WLJ~CiE]@�@�@�@�@�@�@�@�@�_?M} @�@�@�Ȗѣ~s H,zr`A "I[x!5W]uƎ+[o{*nHX;ر vlc@1b) � Z%=\ЮTR~puҳJ矟~HCduWZϛ'թs|_]ܹs_ɭS .XɧƝa-[SMFOK?.-X `ĩe۴)ki� � � � � � � � � @ {y!� � � &d! InݤbŤѣ3ـj$�A+V7߬jժiҤI4h64QFsϋadw�#vlc+a;رĎ)vl �kd+ծ]t4k~~`<+Fd,Z*U>TR~,?& /fΔJNVU?,=s.LKڻ77̦c ̗/'%KJ7Fp#t� � � � � � � � � @ ;!#� � �  Hl zFG  2k]" 7ܠFi7o.\[nҺoS@�L 1Îv cSb;P@�Dذ|l\QC<X:li i&i0M)oA?Rc&~`aٲiѪU+<xP-JkpڷO2gJ|P*UJzo+[1HnH XNJby@�@�@�@�@�@�@�@�@�p DW)=5C�@�@�@�pEȪ7K}'}UV{8u; xWեK=3N0p(.oW $G\? P}Zty{>\ x_M6 lr/zW_}j֬.1룏> [ŋ5p@]~z'zꨙKb;رƎ9v �.eKSjҠAҙgJ'K7K.]z?:qF/wݺujܸgiw/jٲϟȽ}UǎRҤIra鏾VZRΝ{\Czǭ톽#x m"CrG9QvEJߩnSN lci}%4mکF})ĮAFSpuIVڸ/ � ~*#!G�@�@�@�@�@�@�@�S y*C�@�@�@�=#Dc8'\֕F \-Ν;5k,F2 VכY]67#ZCpn/w͚55bp"ND@_p\ku/_aÆ v]vy!ݻw|Rg,8J(A? ,Q {I+WT-~`cc&d,;رǎA@ oڵ*W C Ǐ,u,E{X9R+V{λ?ȼylٲPTޒ;nI3F*X0r s9ٳgnž6GyDTqך2%_ɖ_/u׿|_zkK lcFnRϞK{7g4OW"2e}u;Z"�D�梨s0*@�@�@�@�@�@�@�bM Xc@�@�@�HN7Hdó #GRVe̙35h  f;_s=^d>}" A óӾ]p:3d۴i%Mc%B%O*ҬoqPڵkgy&kL8;FYp!gr,9Y-T{ACM4qAcTF ڷo>'ǟm]r%1ǎ=v u_~|SAJJO*WN7NںU=ZJPؙik|߾}_k…!OJ*^ʖewoᇥW^|8V֭5|#1ORJy]paYd" H_{v;9l'4x4a\&2GiuCKFcжFm_>c%k懃g5@�.OE`4 � � � � � � �IJ�A; � � �9 2i\c]֮]뮻0|QrZzlϙK uy={/^<)׿j֬Y d")7;o8_G-[8@eaHͪرcKӟK,@.X jCmڱǎAi$  k{Ho-u"Ye-꯳G ]*R$fw޽ޕ 誫rs<Mjȓ)P*Vjժ6 (=3O6b 毾*%e5c mVvGy!E܃+}S`R]i\*SF<9,^M,YVr u?/4#2G궩 % >\=;]f4@lAf}_Ud?D�@ Zx?-{q � � � � � � � c@�@�@�"% Ej;@z.l)W(-_ رdZJ\rdkƍ;쮔2m43F6mR^t 7gW-[lQfԿ*UJG}7kС4h =:@ Ѐ4g͝;+VZ.<No\sVis=z, r?_עE`3[ٶm^x}*Qn&%~9~fs3EӦMj(K,YH`5֚5k\SPc|r۷ {׮]4i}aǶ'jժz'UɾB~yY5kԕW^.5B z)[o d~Vߎ+V )p:묳s[ouqggC-'xv\Ҭ_m[E]tf-maÆ?W)/vmRI:u=ܓmn…ݶQ^=ϺI&ܹ{ >0{ ѣ?Ypc.Zkm/{ms^?޽{{iksf)Sljܸw|ᇲyFc1?;_ϛo{E8 Z`~ssiT8eɽv\o{_ej{ݴqrw4d.]ڛgFqA 7x*-ӽ5Ոr;CZH yV-H|K_˕+]k(bŷ ;|$|q_~c9GZuo% ¾F*X0s}d4V@ldcu  �Q/𽟊�@�@�@�@�@�@�@�a+U^� � ?WZg>psžEOׂMe35[rj PH gO#y  Zp!<Fn6opf:5kV}g޺jժׯӧO{\G^lG nګkgyf뮻ö".»>w݅ky}PȀ ֽ)x\F`�pV^Թ.\һ'eʔI履~ @+7o^M6^{NR+/{1؟Kn`…Cfzwgxcǀ>;Br΅y۱c[޼y#G :t(p]wp!|.1B=pAlv!Nʖ-ؾ}{v\Pׇ¤wqn[q!:u>%K pル3glmll.X;6h (g<o֥>Ao]RRRm۶ݶׂݻwgbd޽{4; .7`#iY6A.8S "LYg۱}]8ۅ.yc{饗kkͽ6.4ШQ#ok=6m~?ե$fޞ^Xdc}OA�Q [{KUh][;qs)^{zuy 6vqqN+CfoJ;=[W;wtk8a saցx͌Qwn#ۛa$>@s3=.O<~^'x~Ǵ;y\VFcoD{fc7M> �q/-a`f9+B�@�@�@�@�@�@�@ Sa!2STB�@�bJ 15h@W>\} ~} @|QBF\ƣ 4K{?cK81UV^PĈ#&Mn?c) ;vHNN6̫ 2[dnݺveMZJ+]H~~,0 [`` spU´R>N2/-S}[/Oi߭[ޚr{^} &ď;dGGɂXjiǃ-Z,Њ<q>/ǝQ[իW"|,1ҷo@彠AkK<xpJ  -Tz\guj׮-@%mN8W22M_ ܵ1 {;17w\ok /:N /7nܘ2Y.)-8Z=&Kl,1Xe[gS;vV몭a Yb!6w̼6iذa`߾}^a56-{bX'5L[:X*rn{ru lMy. ؽ �Ā :@`۶`0`z:u Yd5.X7^.K\1p.C~!><}[ *U?ֹuw~燴5_> "W_'NLKN<~w~^w? y�=!&Aؿ( @ D=t'}SaMt� �މ*oCޫ&4ņ" U]XE*u]ѵ6 ,(47{{'{&3L29sw3\@�@�@�@�@�R2@�@�@�P:*<B +JݺIo~[F-%jPT]`WvSߟvʪUɅS}E.O˗/ Ȓ z븰2??}=tEhɅuVrڻw\@\\0_nvnݺr!]rArkZ~yhȑ)|\IUwV^Vy ߄n,]g-s!85nX}c՜9sXiukڴiz6.Lퟒ%KM4IYv)ea7lݸqZncTnHU;w\j׿ *m1Յ\v~ U^_hYfLCv.SڵwmꪫSV<#8nذ?'/^:Opǔ-[?jժ%hѢS*Iؕzca?+97cVOyk1+v /9P.߿߷CIxh3mD�󣏤/W[w^~U3k%wKbO8̮_ 99ǥ(NإgKgK'K#eW42qDu?:i$uY)׿l+WC7.Ht>qoug4}fuD[o|IHJ] @vie@�=ߛcYI@�@�@�@�@�@�@�_ ?@�@�@�< '@c%p_?-8pE ~/yVaS~e%?@3f(4͟?_nͯw"EKV^~e?2dN=TYט1cԲeKWHkk5j襗^RFvjw_JfΜgY_w>YL,8ezϬ}[N}Ή'W^yE]vlӔRƅ^肣.ײetyBxwޝjnj,6<6lLg2+5i0XT^KfY9\c]VBAN $ Zι13z=Xrx N?kg͚#vM@A�[b}Grf!aoΡn_A/ ݻPj{/Q|j`h`Z ^$J}uBuڵˇjʿv۟>>>({4aޏHh|>rsK;~dv}zsnbҳD<@A�K}ְn]~ � Slbx?# � � � � � � �$�At+ � � �AZH% ㊍~!l&qx{V~caVZ^4%9 *Um& J[.]va?xYx٣#G;:T6}A"<S|_ӿaw3 XǷk�VR iF:tРA\hKђ=&B,( ʥ;Ymڠc믿w}W6N8Q}IUMk۷>c?Xf9)egތ]\9h8}իl~uo߮+"1mrjߴiS_Œ%KRUҪ\i֬Yv >3ec<wJP͚9H.Vw),}ܹB|}i!v]eX,eB|kM"빝Tu DꊽϿ{|g} n0#7>}}>Hխ4x-cGgO[$v�䋀V Η@�r,ߛ7 � � � � � � �I FƟ>1 � � �DQeyYQ=Uq ҥ?.'|_W_zpƌ~۶m<2wTeu} X:eԩ;Bw3[У@Wj'|&Y@&'oVUVMo^}Ud7zh5h@eʔ￯3gb!S]vVX$o_'z%^sKv[7o!CȂ/BΝ;<}k}㏲1}B!I6Z[,0ʨQ|ON\�K�pڗv4z-۶uV?B}*H?t5emݻwkӦMotNSs#Ϫ 87Cmق-XPTx/֩SLJ'/fkc KM-  jז hdo\.:*;.iUYf춷.Q5jH_ۻNuX}a{<y 'aÆ^Qd.w}Ҹq+Ht?\{=XpnNJ,O>)Y/'�M+GH@�bT7}j,@�@�@�@�@�@�@� 2/C�@�@�@ @ n5qw]1SFZ*uȎ;jɒ%>*CURE~_tG \ =SZr_۝U 4kTlY9Rsu駟[XkCz ˗/VJ fpH+V]m۶![VN;4/^ Akk΅CO<ѯ? g^OޱcGLdzo oA֭??&B ^1ڶӧOט1c|5h%<p~fX?W`G ii*Tkw`ki~.wر}Ͼ}觟~RFcjzxvۙizz~]kСCCݍ?^!+[`A+1xsR~z$#ru3s4h,s>Ҟ'} ˞7v|Ÿ k׮>ٺG[:~97f gj[fs <ӗ_~Y_u޼y8q?O,Ǟ6Yx+; y }tr\^4ufYV-{,6YezCeK\xwtzc_7n(;-&MmSCr>#_m>>GFV]ƪWϐ=av@ @:.}~,B�@ &{3o'"@�@�@�@�@�@�@�H6很ڵl � �$. "!( "` {mPH9sy3\G@—;ҥ:.*%K ?pE\YJw@-.x)0lذ@Æ }xG'ONO:5ª t  @-VQF�7tS,:tPiӦ`n@@}}.+, . P v x㍁.]n喀aʀ *T(B.??!yҥK.п־Uzwu^N~X\reܸqիllr9>P^=?F>Á!C6l20m4?f}:tp< XիWW\ڵk`ʔ))ۺ ŀI6 80p Dc>mch&M|;)ݻw` LOf72ͨ^;/*U*5}mUV ߀ tAc=6g}ou]GyުU\Pfvqٲe\C54ɗ_~pױ}ycܹmۦlgΥ< moY;dtn4ŋ\qJݷv^yq>z,tcbgyfKZ6DA�"-w9?>޽5 {o ㏑Sg%;O5*N@exZΟҭ (qqDu]G_J (בRw>$:w>#qom FaG8NGAQZR(JT`xLGH=X #�q `lď@oyFR@�@�@�@�@�@�@�Od)u\9<2R  � @ ]EDȳ@BpO<WEą…R̙RVqdAݥjդ_`y_?iJiʔ+r!3g¦['n9ʅvxf 4l%f&癭m۶U<RgtB2䂿zjڿc-ZH 4Pٲe3q*yd裏su1Dv'-׻ ؓ m^v\ac&d[acݷq(eϞ=*Q\/fcY*UJٵ.')q<+SEFn߾ݏ+Vs;zOC3st:#tkÆ r፲ ` Oo]&F,#T; ԺuQ3Yuwjĉ뮻tw*gg~ ~N{w!]xapj:{V0mTZ~z4�jW^)]u rooLn5 ׎hG+˽>Ht>qJviO]g~ڵkOͧ䫀HQ|@iTcEl�ĸ?++J(!ox6J@�@�@�@�@�@�@�Wh!� � � @ \'_\% X*޽:oYeо}}aX�嶄Nk5+L2.V?d!`a~{.R?o޼;<֦M,}[ l\IolǬ၅EM)ׯWWK6ɢ 4H]t_#pƺN{?zHGhU/C 0<T73?[/|]#7nC3< ͿI&)YFhmύc1B[-lv̘1.B͛7QG:@ ,,Ѧڵ?c'6y'[d+O=%K;Z,=p޿5 %g˲׸qAHt>o 6m^_[:u9;eȐ`. ywK.@Z� %P~τ� @ ~*:b@@�@�@�@�@�@�@� @ {,K@�@�@�  c8T+ g*_%+]Z9R0@ڽ{Ə,% sE28ꨣo#<N;^{> :1T6m[qTʗ/M̲ ̴u=Uaz .YdzeYA:=k,YiӦzw ;)H5wK/Yf9sq2@ R͚_ڶ�lw,V A~7Ѡ#T,̿u-sOHFj9sgJ2[5ǪW2\!ASroYc~B+Vz ݈t+R/YU~}]:w,G^K-t1䵚lmo}κή/hذ3ၴ'0@ s \.ux@�شiz{|3R⣷@�@�@�@�@�@�@�(p%RSjᑪz@�@� Xk_wG  I۞>}"PU ۷}W#K8h0M@ǎ˫Ћ/F<Wvʕ_P^B5kXA9JׯA4/d͛7n9sTh[nY^!CZj^i ��@�IDATF`޽>O>ь3siӦ\5.T9N68p@'No1cƨbŊ]0ӵ6bd_`gP._V/U*]p_..B߳]ӂ/n?j\ߡCuIs9`PvڕmCtɟCeq20}Pɟd?1R{N窟|e$ϥ>[G)S落X=ߞZ{ ~^>vu}eL>>gڲErABA�V%8}=.>בֿ|o<;D�@�@�@�@�@�@�@  1 C@�@�@�@ (PDpg"(\pTܾ@e(\rou)^Ciĥ*w}{\0,pXb޽?|uYeʔuy; i8=~.~!KDD`ǎѣG?X`<L.\8"H>իnI*ɅK>*uTHg/"ٔ e>{O-'%Y0k;w|UH*+Yd9%W,̞?.[]CJKҀFgvnߤ/{,`K  i{E]Kdm@ 2~)92Ԃ� � � � � � � �g� � � � ྏl{ag",ҞV\ |C Cd ڃ@Xg' }ƕW^ݻwO ٢E| +m 39J]?-�oQɒ%գGkҥ X�XNCG707pY`jS|OnJ XN&w+oÍi XKIe˖n߾ L"`V 'H*02ud-C?)ȖoHdՃcI7@�@�@�@�@�@�@�@�@�'@dX @�@�@�)EIBb3t.[?_y$<2t[wL6w)7a 6LwqV38C:tSf%2"`sɓW_iÆ jڴw{ׇd9H8ظQ9R>\nJ,mhi#⼃4?f~OKK{[lSiX6lpoG4uTR9Ŷm۲%DBF }6: "EM?8oذZ~@ g֮M^7@�@�@�@�@�@�@�@�@�/P8& � � �$�Azb3Ҏ̙ukz�#`ogyq͛7OVO<ҥKkȐ!j޼ a]ꡇҧ~*9Z k^׮li{mk^׾@fϖ@͛^ =֬) (U \^z`$!q+WKo)X5!-ښ45Ǝʖ-뛰}hJR⋥C#IG-=Xb^ @ Xl*Һu6Z� � � � � � � � � @A-O@�@�@�/ س'Lk##A=zᇒ}�@Zteڰl2}.\}6mNP˖-U|j6E i,q5c ?-\{{:ܵ.(իNt"#m4f{ĉRaS.oVo){\ldC-d%`NϹ)S$w KI=AS ;v[7w+ȿFkOvmҀ҃JZLA�"-PF0:R � � � � � � � � �(@d<5ڌ� � � @> ,)ޝ;ew1!A*H:HGO�)gӥ^ms P}O'|RWzZ͛7Wf԰aC-)@ ТE4w\O>q֬Y>ժO<Q_~N:$\`R.wf عS7.GҡC9H*wP%fΔt>Z0AT)[)`A-~ߍEIIIի~~Zzhz@ ,L  � � � � � � � � �H|g � � �d)P}|ǎ,Wc X"퓊O@@ !,XSC6lL~X\W hslڴm7nRJ`� ڵK~g?͟?߇?}"U5j-ZԺuk?UZC@ b {҇ߣu R^RŊ!#/,(䓥>J&U,_Ŀ_ؾ}{:qأҍ78Bf[b �V HzR � � � � � � � � @| Ǐ#� � � /.J۶ˮI Xdb1֨{nK'K�7@��seSݻW ,O?9sjɒ%:x *:u@ aÆ)S]>!K'sNZXhBŋpB\R@@E,@[nռys5iDGX ;uOcJ.VKO=%]pTJwHuP^({gwY(/^Vw@0ѣ% ƇxzJFJ Hs _n-_9$Ar � � � � � � � � �   � � �d)P}{B '[WjRp,m0-C�2nP)sYH/v{޼ynkצjG2J yS&uVX‡:|ҥZlY|Æ )MQAmԨ>l5n؇=ŋ @ ?i4|x0tN?]<X[^={Nr.ҕWJW]%Tp`8`�QGu!^~=K.l*TG~@6~<t-?"L$AOb � � � � � � � � � �A<@�@�@�@ Af)AWٳG*Q";g_6,n)C�r'`v͚5Svءŋ%K?^˗/Ν;S6)N iSZtGmaEIنU.a~W^OW\J.:ʇ|ׯׯ7h@eʔkȑ{I| t)H}ȝKsT+#u KzĀ8AU*TH0AhAyMҳJFI}F~jD�p=i?=G�@�@�@�@�@�@�@�@�@ \l6 � � �+P\T0%򡇤YV=@ lOiwsIU+VH5YG~W>o).\XUTQ5RMYZ5<4%Klˍz`)tڵ 6nܨCs&Dj-ZnݺJ* @lrJ8rx'pt@,WKA &GzQ'c4* JI:I|SN۶m23}{iܸ <hg!2cc sq>c � � � � � � � � @b XǓ � � � eۣR5ư'(ÍtM0W?$2C�@=Zeyff͚T~j*}>oӦM:x`nX_ʕSM}VXQ*TPyU%/^<U]_}$o!A[nՖ-[dσs Ɏ}j.RXHh}q*Lf͚>�Ҟ@ Vi`;5Z曥 /4Ֆ.䂗믗^yEzuTM˺7>+cߥ4xdB ߧ,r MO _Kp|k@�@�@�@�@�@�@�@�@�?Â[ � � � j"2D^wowi_U0AD>" d}C.]B׻ooذA7nL 駟R ٳ'j8B!-Ҧ2eʤ;.]Z6YdRR%&34/\pם/4¸k.?n|Ν~ڱcқ,14Yՙ^1N [Zn*J*jժxNςe <ӧ A66ؤI8qi8i(g -ϽZa9-YBdsYgII}MgH͛KCJ;% c_H@�@�@�@�@�@�@�@�@�"#@dd@�@�@�([V.8(Hvz5[7? ( J3,B�ȳYM9)8yfmٲOFhAP|)֭KmC B }b|0deC󴷋)hѢ) &k%~n/}-}~~ۖ-NYxbڔ6LYl CA*TM�ia@ f#qRQ#`^Q^iӤ?ڷH ezebŚHWM}hJ.8] n.|R=C6 XB ~c� � � � � � � � � @ O�@�@�@�Z ]6%)S'.iD_$;Ptq QT ]0P0ݻe-Ĵs[^آ,P`czCeh}p"myxd p)G|8R J3K,)B� 9ޓ. ?^xԺu۳&`?`?`a'<S8Y=p1w+wY-H}%y-$åJw!׿&N @rkH\3 � � � � � � � � �"@d ځ� � � @ + tK>l/J"(OAK&M@dT�Ĝ+Ws˪AmJ\"j2y@  8TԷo0�"@`V9GڹSQi{-}ۥ?:w%CkN=Uz@П,"Aud +PaC#� � � � � � � � �  c@�@�@�b[R%Ai۶n'@<AZϻu>X:t(Ԇ� @ڴ Tԃ� #ȇ6m*Աc0,o '%B ӓcY,\1k)@qˏvutҨQ7V䓥u>V`e �ZUZ>5Q � � � � � � � � �-@d|?Z� � � @TͦM;v#vRT4(fX ҌY �@BO?>n@�Э6l(=ԶҪUsl, 3gJ.ը!}TV<GCOƌ2aUY4}zVk[KZI_ ժ?ˏ2@�@�@�@�@�@�@�@�@�G qf/ � � �ĵ@Jׇ1Ǎ߹3I9޴@68`�ĉ{v� @, n&� SOՓU{5kCU<AǛ_-[J}&>~ XuҔ).`?Ҵ?KBz}iǎx G�XZUZ>ZB@�@�@�@�@�@�@�@�@�(XR@�@�@�\9L pEiQ4)bT� @T /^~9*S) nIg!թ#=t1҇JkJ"u$) t. Ǝt:wƏGPx-IiԨoJR6Y3i,/ x}G ժ@�@�@�@�@�@�@�@�@ ţB@�@�@�1rbŤ~ќ XdBRRQMD+oB!@�@ 7H/mJH`[:l#; @-Y0aRn @גX7?I_z]x$Ơ[9R :+EPcy"XaTUtyHhĵAn] � � � � � � � � �DD Ȉ0R  � � �/`_ݴ)I0Œ%a,[;JH_~u �wt#X �'ykRR͚-H+KÇKKo%)qDz[ x)/CzE0#qn{ҧr4mZwB 4k&-]*ٓqˤ)Se4b@j5} 4& � � � � � � � � � P|E@9 � � �#`ADKwJDMWGRҤIO� @n*V7gsS �'mR]_TTp?ZG4Hz %d$ТԨ4bDFk<Z H%fX3go-=E�dV-k � � � � � � � � � A&ѧ � � �@ `%Ȫ;w_wDd< pVt] U:�d(`;}WK@+ ꫒?~ԯ_|7ɰ<@"wҐ!Kf#@ީ 7l^|Q3Y1uU\*cE /z+fDC@ NV 6ܮ) � � � � � � � � �$�A|; � � �9TIڴ)j kdǎܹҚ5q� @ + x�tؽ[9R7xҮ] /HIK\@ l.-Y~ ?ҨQRRGZ\^鬳ե뮓&OjKϋ@ŊR2Ҋy%vyYb b_XH1@�@�@�@�@�@�@�@�@�d 2>}G�@�@�@ UX5^ 8C`?O@'@�\W/];i(C�ػW;V�) ~H thQHt'<SZ6uO}x>X3C ;۶Io)uTҗ_J@pk[F@ҪUGA~GKo]P-` U{~}"> � � � � � � � � � { soǖ � � �$@ҺuIR2PtIk=-F�HF'NFHgHd /=K+WJK*}t�d :Kڲ%~>[=[<Yj>YDg&Zrpܝ4)xdS (6TIt sK]@,Æ ?� � � � � � � � � @ ߻c.@�@�@�bLF ik͉mRQE* Π � mHtҾ}bڈ�d,pdcW]%ݥx |W 7!3GH\C:p зpԹhԮ]s k:qOϢ'Pv{~  +Aѹ]ystꎅZ.f̈WU% Ȧ � � � � � � � � � A&ѧ � � �@<6l,ԃY\|C5~5>O@�OGOc  뮓j֔9G5+pl7Kj_y /  餓SHelI/*ADD<~-^ԁ�)PAy5 � � � � � � � � @�AF�@�@�@� ,=֯pH0[7m[X1/@�SG顇~Kn1H @@кڵ3ϔN >.Z$͘!vtQ i@> MHGy t,?a _۹(]Zڹ3wV{K#FKki'ĢAڏQ@�@�@�@�@�@�@�@�@�Hf w@�@�@�r `AV֮ 7m H}6ɉ! @yTx0'qzEO@ OnU[W:tOkϗfϖ[j zMȻ9[oIo#tSG@GU*Z4m ?҇Rq^EWeAKHfxSh�ĩ@*ƍqx� � � � � � � � � @@�@�@�] D?‡/ 7:yQe  @, - |iѢXn)mC�xX*9SڣN>Y7Nry4}l@2qTH=0Kz#PRZ?̎bֱD`95A޴Ure o@�@�@�@�@�@�@�@�@�?Â[ � � � *%]J<Pپ/Һu uX  @ \u԰a0p-J@ {LjRڷ/;'ƍ㏗.PuCI͛g>D N&L:x@;6{$ʗY aڒY iu;{-[k" у*1}C UH6E{/ԏ� � � � � � � � � @l LJ!� � � S5jS$ʍ SOAA�@ ^,ǥ#)SմbU`vᲿ&MyK,|P:XE i0siӤ%K֭3G@pA,޿<yx,A oe5Jt>bvF{i͚Xh m@�x\Yڸ1ZM{@�@�@�@�@�@�@�@�@��;Ԇ� � � @B Ї7UvʕK8Xۏ;:h4@ t.ut뭀 �??R Y;^#H-[JMJ/$u(}bI'K@ {&H~+<zBۤ˥#mS="pEҀHG}VTt Bɒڀ�&Pd[i/ � � � � � � � � � 2rԄ� � � @ Ԭ)YݤN` CaSwh= @r <w{%g5MYgOpKmH J< i*N /V y,?3,Jյkak/@O [Hi^JG=  ʕnک@�@�@�@�@�@�@�@�@�A|4V"� � � @ Ԫ )ؼ9kُ|}0&:{V@�#кt]wI{FgԊ�'`a*@zjTg!ի' ,j%M :TЁs"!;ҼyҡCRbpΝ>,*9"aIQ P!XA+ew^gkW|#@ Tƍo� � � � � � � � � @MA�@�@�@�'P4jTeH ȶm}3OcB@�O7OiР?=N jΝڱco߮].%Ȧ.04{qm\^?nKRK{;B H"~*쒮_fslGq/rdɒTR~]lY)SO~, .N͸URN`/x`Dh1!4.m|!Ɔx`nֳCㅍ !|m3쵟vqD~͋-Y]ڪ7UFEH#PzWӽvjذڴiuz}|isc$YťvU\ϫVB;/RR ['{lez{wꫥO?,�dWN|q#  � � � � � � � � �I+@dz:� � � @ԑ֬,@YTF0 }3@ Qjז~X RD)u pܰa6nܨ~i˖-ڶmnݚjG ʪXؚ7Y6 w ,T2<.mxd({ccW~B*6 *Wʗ/TbEj, β֧Ho?_=ZR@f#G{[ Iv&KhVOV% K>.CcEh6ƄOƆ(CcGݬp &ҥK˂emCm<=Cllܰ16PHO`K QҥKl2\?ץWO u㴯-{Nk:l{[;իWOG} :m-[Ev$u7VYdںȶ>wkF# #+Km$!m&@�@�@�@�@�@�@�@�@� !i=G�@�@�@ yƥus=[ďA/.,/m #t�@ )Czy&) t,|m~Z׮]jZ~}J? uPȡ.;<,(161,-[h[O`L ЭPhf(H+YxVj\XTu`^#TV-do 0@.+PIK}0G{ XBݷ 8l] QL[5dh69z,ַyhP:'J,[Pgc~A7.nuasgo7L5bn[h_x-g(24X~Ɣ5k1B0)'`ӧ믿̙3e[+v;8s1ܹiF{VuqǮ\Xl\](l#G^ֆ38C_h;; ٩{~dDZ~l̽tו@�@�@�@�@�@�@�@�@� XR@�@�@� \ r%A~0� ty> QN>Yzل @�HBnIFa$D9UVp+Vh m@ZXXZ*UR6o܇5Y`M-- 2lD�8 Ͳ7YԩS}kY\X ޑGڵk@~:ꨣbOv.=%oXՂҽyh,C66XЫ-dЦ-ZBBk:XMأ=u',pP�%ۡWg|l)̎XbA6O6X '%ϟcj„ 6m5kǵ]v. N3u]1 C;wN/sɮO6mB;gϞ>2à'r92~׷ G\(ȶe޻K  � � � � � � � � �I+@dz:� � � @jԐw]pDηeH O\& < @k@�0 ϑ F|-]T-Z%KɂCAfQ�VZPY8:Q'PtiTNlĂ,& xYw}炖 w\]9 <(}\da8x┱9dXG q׿M[VnXPý1իWgl(ে+  H |n[y4i$?V{Zlh_ljР ;ZJK)3g3wUW^yKŞ+'p ߴ[jʔ)/]x i֏}{>D5۶CK2m+-7HW_[9C�dp4p= � � � � � � � � �F@�@�@�ȶːq!2r#ބT ۴ OzB@�Z{LC.@G:HڵK]eݷx jԨ:ѥ`[ wBy|Բet\0&7˅BZ@*7vWi͚  m rjWSvTLnƶ)!0e˖/^z~ 8cեK qXbQZk \5ka=a0k!W6l,ϊiviܸ9?y&C\?~zh᧟~}q׃=tꩧ9qT,gm2d7nF .^|źuQoA)#{cĝvtA&_DS]eS@�@�@�@�@�@�@�@�@�HZ q@�@�@�r'Pn[D ,[V.B; HK@� t.}tQ'}={~G?_҄:C6lMo߾jҤP. $Ruq.9E={dh:(M@۶mW^]-ZNZ=X,֭[ǀ9s .]Z6&лwo`mx +p$l;VVOm)G .ɘ1cdAV,T!-t& Ş<Ab>?>TR?tPXIV=`�?t4~?:h 3.Cϡ8 pN#]%:H@ *.^6Ej*E�@�@�@�@�@�@�@�@�@ .D#@�@�@�u UNOイ?@�"+ 'H+ٺ-6iӦ`iƌ>�rڵ!!Z}Qd![E?R%JիO?L~{9߿_:֪U+7֜O>YzL[#'|B,\tE> a-쑂@,h& ]`A6;_o�%K̂f ZЄ \1@.L6'z~uɓSOO;տ uD?jς -A^˵嗤g��@�@�@�@�@�@�@�@�@ X|� � � @nw5iRndxشI.%Zy[O<Q=Zr+*T(uy@�Xp`RpxXm)JO`ɒ%ꫯ4uTv6 \j.9ǂZ䠊ȝ TmҥKJ;ۧ9sh̙.}z}8dժUu)3Pv|)t9f�k!k۷oWbԬY3?t-%z9 ʕl /vܹsSfg͚#Gj˖->؂MOtom\Y 6-\pxIu{ٲe>�]mƍË:&NzuW駟c=O=2eF KOPڅ@ T"m I � � � � � � � � ��An@�@�@�HzK7##} 3QRl*-\(5n( �(C1H?/ _|?\WVR|S߾}}�gUI9<4@q,kA6]yѽ{`H +2ez)vm*]N;4uQ:uR˖-6, cw,X7h*R;8?\r%q vG‹"[34}t >܇Zd(l}~#8"|ӄ~=<xFႾ]7 4v޼>(n޵kW?KcR>wڶMn\FYg%}tQ#@T,ُRQ@�@�@�@�@�@�@�@�@�HV o@�@�@�r)РeyTb.+a Hf-~ 2Q)@�UronY.8H Bd~<xPSNՇ~kܹ>0]v0`:tފE 8 6 go}Wp{N~hty��@�IDATV.]Gܹʗ/^WZI&>UR%mV]wѴM ˣ LחM\pCdA~,$uذa{UD zYZn… 'ٳu_~ѣ>n}fAzI&5jk]}>D駟vB8;EdIm 6..{ݵ.]q>] @ Mq(� � � � � � � � � @.乄c3@�@�@�U}gߗŋ6mU!m_*U.FMJ3gJ%N  @r y0ONX}駟jĈ3fڬVZgϞ:t+VX4v gPY?Ol:3ջwoˇD qyMP:K{ * t X6l+}֭ɓ}k}6QE]vM_|D[8?+,,X{֬Yu5h„ z7|v _~)d*/;]YrJ:jMA�Aoɽwf?{DqWEҕ&R" "E^ ^EPE & "# "$ub-d7w>d2s2Oh � � � � � � � � �q(@�@�@�RRn]X1i”rvӥ|JA`[̸� @ 콷\Ғ%ޛk(M4ɇ>nŊ;|r}2d,[8w5fȵޝH曪]@^?x9R7o] >;O,qK:35yd[No 5mڔ_4/ql{:묳4b4qڸqv* }N2o\~| ,]Cm۾}{-]4wt t_ i[\*U;VN[:�\9cwLA�@�@�@�@�@�@�@�@�@ -LN@�@�@�Ȼ@rA]0 nL -L"�D+pdF;W=ܣ cǎ.}>^Zƍ%\" գG=Zr.j֬DFۤ池+o={Z(٪UW_[ԦM-ʟzAS.v=o{xѲa~'-v۶m e޷[o% 63(qشim۶ٳ2͙#-[&sL|ȵ)"ygJچ�$ }S@�@�@�@�@�@�@�@�@�HK@IN@�@�@�ȟ@zAO0n nLF: \F.%i@�DpFOOVF~GWh .В%KG颋.>PXbܹy8b͝;W-[QG1c( pjz'ռysnY{ӧVP3x%Kk׮z'|￯ʕ+ /T5tDڱcN=TM<Y&L'hMLԭ[ׅ ~<P:uvy]uR:nIοCiҤmsG�o@�@�@�@�@�@�@�@�@� 2}5=E�@�@�@ f`A̪X.AM ּ<7ǂ |M3"� 4suޓl uY:蠃ܱkyРA>21[MH<ҥKW^>�m~:3};3x E?4kժ뤓NҢE *$li.PhQ{zg}Cׯ_0^zo۸qԪUiW*4|>ז_PeA' ,.鲒5o^Z3yR<M" @�@�@�@�@�@�@�@�@� 2e%A�@�@�@Zǜ Vn{onLRT4cF* �=rjr!8.߿6m7/v=zP"Eb7#jB ,XuĈZxts9GGy kO~Mtu}#<%KnS:upe[L2 ɓUxqiFj-駟K/֭[j[Ruʕѣ+n]+ʭwքaInt $� .P2) � � � � � � � � ��Ai4 � � �WOZLھ=0ub Y#UmoZ60= �#piI$N%o,3\aRڍ@ Ts'$竞;믿^۶m+& jذ.EW^>XP@ *\+9slٲj.\qׂ.?*_=dΝ;c̪U_?=S13Tt 2/QBY=B�8_@�@�@�@�@�@�@�@�@�D 2їC�@�@�8qZ5n8 t1Ǩ{ .iACK俍k׮Ո#t' FHZիJ~Q}!" DK嗌zH>X=;/=a@�W஻y&qۘ-۱cJuY:vNٹ8ys d ,_\=?WgJjԨ_|/w o;#x(gϞ>0fΜ0I}A`X~s=_GݻNǹ\>łm͚5s2vcx㍲o=v&qMƍiK/T\rIzԮ];8p6nzhH餓r墝"dz )SRb'P@A�@�@�@�@�@�@�@�@�@ -LN@�@�@ "+,ܹs 9kΝ7^SIe2o^Ncfym_^&L{ァ= E%t*Y:}ZbUx Oe3gΜ<M뉚6lݾ=5S �'ಎt-O^;uN>dǂ+IvҥKy?)R$ A~)cǎ' tɇ/VREGqFZY%VY.LEg] ܞ}Y}>h񫯾?$a|[إm۶6m9uYO<D4iz饗twTR2Dm8lذc>; -[.YR^9ĞWrߩ͉NZ�!P"A$h � � � � � � � � @apKa3O@�@�Hc՟ܻwo5o<o!'\2vp'!>Ҿʅy'>}FjTvA^lJiT֬ԩ{\F ]r%>(vɹVYzr=q&8ȼqhU"� {C 7&եM% ˥̞=[^Rk(&`}Uƍcƹy4�.(Q'*TИ1ct1ӲebPkUu;ʂ(Ǐ%4 -WYĉ}+۵PD2dF/\>hܛOVZ:3>dѣh؂-uX.IO>1bD,ͱ.U.]r5mFCj_M(C |1) � � � � � � � � @  � � @" 8P&LnfOb7މ4ڔ.1OAv÷ֽD.muԱ*WUjTvmⰯKˍe]O" z[\S"6 � ; ɂ <>H|AZETcG 2;?g|Mm~%jtA:묳v޽|eaq`_X#ּ曺ktQG7_Ϛ5+I m駟^zIW^y^φ:szW<{s8�iחZ[w;<-\{ ;t_!.8Z{$sH:?#sl?F� ` � � � � � � � � @b ) � � �yزey}W?ԬY3]qQB&_Gjҝw՚5k|?իWOwqFؠ]V=iuR޽յkW *]tM۶m_|iѢ.]~ l߾Z}'z]Zq=>Xȑ#믇oR_{5믾={Ϯ}~Iy m~zkV,XN:~[+VХ^ոq/kʕ?]>%z~Pv!<|A[e7ܹ{&NO?[L~_.2?38ÇUZl_lz)M2E˗Wݺu]K\¶aQ;me(;mt˂cL>]n`'p;w.][P_DTԠdyf� @,OǤ[neͩY׆ mݦF%D';֜1c^yιKױcŋOԀqvN[oW/ƌ#;׳c;;~w1ߐ!C~!cQ{ѢEjٲ֭["E-6rV~[�࣏>Nw#8" =z�s=Wg}vh_yO4ɟknڟSX�MYY[2nмysmܸ1T[`}ϙ,(c S/, ҮIyqi]Oi}K41l=4;7{ٵd/\.++V2˗u`ԨQ/ʾlݨRX 욂vαO9;_Ӣd:k;Њ]$g(vѮ5FS:aʕwծذr2<>o߾⋽}CVչst9-m߯fv-RN׸׮Tj;^k~9MmT>3:r3;r7ff X _AG�@�@�@�@�@�@�@�@�HjP KZgAA�@�HW_ dq 63?919sf8\P\ݸ_. /tmH &65m4B.Ͽw!j/.!BBÇ}硎;q ⡏?8Tvmq!"r! !ra!&?s.Ψ> @?񏐻ۏ}v? fC.#.C."Bgٵo&7Qc.>c%Km䙐 R^`?>f0T fېn!oO.%4yL u'o͛CzuX= h]�Dȅ׶[qmυZj~[r~;n8:tpIO*V, 8plBÆ fϞj׮wu~B;r\Exz 駇BR `C|1)i"sPbߧI o%fu1 �?چpu;Nc1֭[CwC 6'o g.0{(t\0UAT[oշlٲj_Vvk~'fV\o._sqֵmۆ9s݆jV bD&1sr]BC]t ]rqiӅ\\O]q!痡sN訣mfۥ9٭We/`.u~_j(}{r~~g7r.2}ANᬮw }v? toX;\^xX^^ `w]ߟexOc7}.D5. X춷}eu-sƝUv-~_>S575\yǎ܏iNtqv[B ң2}+d(1": (l_/0(] D9!� � � � � � � �p=1v YR � ($ʒ$`7zsL_%KM?~ 67NZGr/ H x 7VP!xN '/uMV-|Bu{Xnn^zqPժUCvcvPڴi //Q&ۿΩ}A<fɗ@ ,A(ų>[ k׮?~xA�3|ҥK܍qF؝XHCzN7lo,(#(A;`S };v/fVw&2$ p}:0Xc!Aen6lӦM~ڰ`&ҳ݈ިQ" �[1&*`R͚B=z@kCv(%cM #<[-B, ӧnǼ:;yhaJͱoNsa [[r_fnA!8=;v~m0`n޼yIx ?,Mќeu`۶mjk4,=2.B|a?^˦X-e+1Voc!|Ax6vnUӾ VrѬ+2~/ ^~1r /p@ǝ{ E; pVI}֩Cbr|]w}s3Yk?'.1DeN7kY՛۾w|laӦMmQoAgyfTgo͸6.R2pݶ _ɇ B Il&2 LM @a YXy/AycJ@�@�@�@�@�@�@�ȟ@Q) � � �/^ ei8<eT\9@͚5+<~y|\P~7p7˅Aݜ^zׯ.�u!xrr!a'>\Mc ~؋/={ʅV)UTp7݈-[jra#߿Tۥ"ޤftm܌~ۯD߾曑ٶaBѢ+쵕~?ۆ .ۆm?VmO6dp}~\.9R[nۈ Ñ!v.lwa4h\֬YQFmi W/6l(Zg6hyr2egI&~$j9 iBiDm!B�@ v(u=һJ',x55viYfcFd;TC=T.NÇӸHlp7c8h菋yoNci;ԩSxn6!c^ggvCO=k;pkG[\j֬ '</En΍vnPD ?Æ sZ`ƥ@Vc-Zoo?,}Am\.u1yr_jێ;e}Aᬮ\pr?]7Ö^4)O;q=zWhT!G~'+Dw;~m{42?믿EG0Eb|r]-YXk:cӦV /$@ŊΝrWbډ� � � � � � � � � @2bW5!� � �i ƅ :\xqmֿQ\nZ`iofMswIcƌ?̂< |ܽM'p>?رc}(Pqb:,M/I'$ ?j_d=N]z% Q+}ens ^.lnFl<g_wu`ޙmbh'CUv~z;a~Ĉ<o?zÆ t6Jп݈Uִ{{>nϪdfո5%0jE�@ ]HC$wAB-oӦMYQ;̮%ܕ_ϭ]SO=傉K&1\~}#}o?fB0n_n ~,J8VXᗍC~K~ύ,~}FHgQ-[ƣص*U>G31UZn].n+yDn+h׻+h s_5hY]'@+ǣ>͛7?,>g.wDX$[hr<Jʕ}~?Dۆhwf<,P4,hGf׸qvvirܫW/?ǣXlb[ҵs.]wjr?%}mr#@,/d</ � � � � � � � � �$@d:-m� � �1n-ݞvpdYeiN#xa7e^:xYO<! CvޫRJUVYNop)iOgqbѾlġI#`9aAVZշ}ҤI!F˶a!%veѢEo8lٲEoJ( H?uᇻݴnݻƏ2ʕl*= }z? L;}dUJ.n@�ӥW^#%p' (a;̮mnBXBոq&g:/ܶmoFs̞k/?sSkivsndmK}v ,\PG2Ѯfذa>-kY]ɮ> ܹsx/Ϻ)ha_0eʔyz~.SrciԨQܹKl|ϖ&r2d4hN:ťww}߽1]ꖅ>F{{~`JӦMSM5q C#`._115<3So b'@d, @�@�@�@�@�@�@�@�@ LeF@�@�@Jj[V|駻fڴi*SZn,&hK}W|yk1cFx2.] [~y)/_wuȜJj*uYf͙O'N$4o>O;m۶mG?nGO]tM>4/Ѐ>ۺoLp 7z:餓N8!-pkUj|XO?6~mm7ۙЇ+VȅV?-Thz2<] \V @�h\A8P+k/e׎UPAֿow\PkfO>Du!A<-)%VǾ,ȕ?p9`YٰaCxV{N0a6=,kӦMkA(6+?1$*U<F>}taf3h Y zK{i]VwGA b_u}AN~ ,Ҋ~ aڵ>6eQ&M_-#al!O=Fà 9GŴXmoAJ,ٵk4z6nݺŪp=l:}(qAF lpAdT/@�@�@�@�@�@�@�@�@�@ AV@�@�@�'л~a*g(K,?oч%ڰ5j-,ge˖Gg{=׳k vGI,n^=ԺukpB{ڣ-Z߀muX@oڴڷo[s7A6#<dz-�ڷG HYƍYDΝzo<n8URE_fۅc�[s.l| koK.>|.2K<acAA8Nj۶Yv.W^yŇ d#7¶rT\eӼqR%(CO<D!28V )ٽxߨA<@� V徯 v4QǻoYkFw>LІYիuw D,ϭL2EmV2;* OO46zN 9I /諯͛u}E:ۗev~ޮ];1rHvp\3f?fhAyxb=>H0ݳ]CׯL,1DӦXYPY޽}Ȼ-D)v-3godn*ʕ{H-xBdu=f}٥yG-Ղt뇕m9f]f^پ1XPD['8 /Z~)#!/Ba)}ԩS}rt'\G+Y]C6 f_~jv?|k.i!]C6l:ufvi5jEen䢹Ɲ9BBZmS]o]{.ĸUz!1W7d6#ύGUAtCY/z�pq;mԆ� � � � � � � � � @RxR!{P@�@�RGWݝzcGA�mmCUV h"CB 4 <8n8$BfZp7V !4+ڴi7o^袋.e<m۶]Ƶ:;!nu+V,t駇֬YgTr7a/bo m }]~xhڴi!wctݬ:S|u4ٵoyn (Kh˖.(!Ceʔ P  �ѐ A [lݺ5�:\N ۏ.#4dȐ'|0w/?C.ow6%J6lzꩧ|qW\Kx ttA!" BېǶdYr/<ԵkW[VRap_ k]wG͐ eDzs%QG%Rh  p|c!7 U _0^*`Y.;Tz L|gk0UvmBB+Ww 0/\lsӧO; :Կ͛&O5=:vZn]T7y}q](衇\@U_=9~~ e 4yxn1C./-[\8qbT͇z魃eB;{56وYgv"4von[,;Dzmq̙.uw~;q?rAv|Voc?v^mזjժr?rf/kCGF|8n]\`Aվ '9obXVZsƣ~hǎX \?ghl^9 h 77/|If}1wTq]kpn1bD\{dۗ |j{ny5ꍶ#'|rxݰovhLj<.~Dj\hQ(Td(T@R.Z<C!UKA %l}ks T z(,3%yU<- � � � � � � � *E#?ǤԮ}gٲWcR � �kIgü5~h(RDz՝qn՜9so݀/bG.DC_UTiri&͟?_ח5]Jpw~w^Utip<,Yrzi۾W`-:8ppG\@f͚%( p+r!rA~Gl2\\@\ةf`"v" J^Xm;m~}^yhNھ}rw-e?H+WLHp|& n"Cw'޽{a)V~ >\z\\(a2cM;6smKuw˅ .m 7{;Gձ{9;Pjrܜޜ*V#|avc.幸nɅCAꮻ msnt)E ֋ & .5wL )k׮O\VA5(1'x{=w.R.o3.v 鑍 '?WVKA fG#}- }vae/UTx var?ʷ%<y~\Gv-u.4zv78.4 %k}.ZH5̮άw?$ꯧ:y%wL=[X!][sIfGA ">}Iu~΋eț?++J(!p5�Ŵ@�@�@�@�@�@�@�RExt~ � � �!`7j|:213|jѢE&D7hy/^<HB Y/z<͛v lUZ7B(>,;b቙Df9A�i7y-Un F]y۰`&M*gŐ5 O M. @�2[n/2-ڹҰaԩS']ve5j߱cXdǴg`bh}G4ur+9Njձogd߮~;6 tq/dee!gŬz>Mٝd6 bas>,t0 0@/;;˱ e粣G?ciȐ!> azg qJA {هy"뉬^g/Jf!YV쫬[>x̶D/~smz|5'N‡ӠA[o/seA4}4io%XnoAkϹ&WE֛_~~a1R~iLxh--,qci 5c<Ue_ҵ@�@�@�@�@�@�@�@�@ +; � � krRnf2>JB m` {Q\r>$E4<zQ03\,c+O<BjZln /e"YKM �$?rM7I#G&b MrawqܹnViӦ?6,_<nmPnoժUjݻ�! M)SL6-X7?oC][nA7j}!\1 FE;Gҵ\w:SenzRÆ uu3ό:P5x/ M^Dz-VW'g_c-]WkRJe6 >|*D9|wu?{TVO-o> 6o|c6!<Zj顇R>}ԡC&n|/m\v&٥K7kڷ"%v͂ ) @v>* � � � � � � � � @  ׮}jٲWcU% � �k,;@"EbPKjWgb]8tiٲW\p!-O+-e1e U"r˛.贘zGb^o^*r7ߔN>9/50 #p5t1[8a PgmSJVO㏺裏W_O<QqN8n8?~AzxYgiСW\R.$lSO=+U!CbKnS[휽m۶z뭷Tz8-j̙|P/QuI'e>r!_?,ԩS(-?}HkzJYx%%y,nѣ}',^>@V;WObᙯFCembζ$Bׯ^~e?^[N&T~wܽzjM6ƣ"s4yrRλ\/N>ҳ?qFzNqwwA͑ �gež7(!ߒc9J@�@�@�@�@�@�@�RQ T\ @��A1ĤU^)PH\vFW5L�}'5k&}tA Р87F q#CnD!&U!G),)MG-҂;袋tf͚5wnٲE,O[^' v w.^ʗ/XhV9KE/b.B/?_w^(͛ej?k,uQ{N;4UP!k_uK.-{PW`۶mu,^*VX䠘޺uwܹLo%J.LBuɂ[{'>PV}ܘM6݅I&QFqoIKݺ}e)]˝vߙ;p)U:Ao!_r4o5#�)@dAjf^-6Ԃ� � � � � � � �(I@�@�@�[iSi`*9~)iTPI j9 �*pr!lҘ1:ۤ Yu饗SݺuuqglYc#΂eZ!Â?G`#.r��@�IDATO_|1c>Se? lٲׯ[M:UMI0˧~Zk׮-D/aLJݗkC CJR@ZhqĂTugՊ+|hs@9[n۶mթS'6O%KCiPx@Z3Gpwi:hBV �Y T(K � � � � � � � � �)+@d.Z:� � � @|2>4gN̏O ;$N -Z8% �[];2=Trʺ4o<p^{ڵF+WZQ lq)Yի˶ P}Gzj >\͛7DCհa>zhYBZ[oUSLΝ; Xtx r)={� UVɶSO=UB[{CGɓjO;ydЛrTJ0KŊɅv@��Aa ^ � � � � � � � � ��Ai. � � �hP{iXL}-`Aj\ o~I 3 �!p]rAOScEQ}0۽[> nY,(ng}۷FYzu 'RJ>lٲe;b }:Tl,jHŋW.]Oˉ'裏֫mۺ*B0geߒs9Uێ.5jHuߩ{;vyZk׮ոqtE}N0s{1d٩S'-X 8lờ;wI&N:qW.tR/nI?|W C ׯGL� � � � � � � � � @ Ovl@�@�@�Hw7fJь< [݄x\(( �x_|trlrliuK�<{҂ 3Fy*W:t {ر ( *h"Y 4~xN"V] *$kbŊpX :t7eo]W\q;#xGyZ8f(v~З_~) UtibawZlES7N-]v ԬY3k ,`Kc\r#of̐[=Ԯ߮ϝ}w ?}~MrsG � � � � � � � � �I&fIh. � � �([׷&bhSn-j=K!]+U} �Fۤn)7S2nvg0+V裏>aÆi.xڶm,u֪RJv&uV+}>, JּysNzjժ /?l}no|ڴiz콅RHU @6mLSߴ{Gu.J* _4;S7xFO=Ԕw^:gЁꭷRn|nx`d̃IML)p'D5 e6m(Y($@�@�@�@�@�@�@�@�@�t 2]4D�@�@�@ -ZHPuҦId,v:� {Gb BX!PF 0W_}Uwq ^z>lR+VG,mۦYf͜9S6jժ>kA/Οƍ?0M ״ɓ5j(WD 5m_[8C'+66oެ^|~ĥY9-hѢޭ϶�L :<}X <x '}?5ޣg}16￯]|9dVΝEI ʅf6r+`A.�d)`AV6l 2C@�@�@�@�@�@�@�@�@�E;teIO@�@�@�(jzj~qUU kՊ,53cA.ˆ� @Z <7=tCU h ._~!p7m4w}xP+25jD ,_܇Y@[={o߮e˪KowL!Pzur)a-v޼y~?`!~{=YOeAyA@I{G&n^"P7n?9s�i;]^2eۼysrتU+f) wK/$ ۽[ԣGRj&]tGNW|~316ԓO>޽{hX;$sari@ 7mV\V:C 2r� � � � � � � � � @  !� � � PP.'ė3n j'.A^APdA@�M\9i`骫ޤH7oŊյkWZ¥L>YkjpID 4pA $٣RJA<#nݪ ܹs}H[fmVw_v�C= +V?#PHjaz ԂagΜYff#GjÆ ~rnGn.Xnn!E *`hR .jEW&Msfl%ai!{コ+4`�y>#$s0W/ٳgCnAn FN2nze" x14 U Bg � � � � � � � � �(@d!3k@�@�@�RErgԑ d]?ڵyk7{j`*@�Wo_n^z)yJ-QѣGp6oC,*xZtvdz H ܲP8 Gd \I0 B/֭[[,-x6 ڹs~;0>iӦVZ i^Wl٣K.tc-B>믿ŋk۶m~\ 泠O[uuuڂ"mJz B!]VK.%Km}J<jիW5F|I'<P3[,Pgw{9=3Љ'vx@bzQ}gz'Pk õ[ &.2uyR6uF RwV%KH)i !P�A�2@�@�@�@�@�@�@�@�@�HHJB@�@�@�H>-3ݴ8CAAY@�H7.ӥK.t'e˖#l߾Ap]SLypŊ<,.xX{[-q?{;mmi:Fګ;D b&vi:-ӶzHO?,DBbgϞcu)uƂ@@Z~"}0I 0' x\~VZ+WK~r_ 똭/j:J\pߧeʔIJ#mk믿jUTQnԹsgϷ�D/*kĉ3fRow]R`!;vQC7EbCRpv-X5;G@ &wʅPǤ:*A�@�@�@�@�@�@�@�@�@ iLEEC@�@�@�Hl-^J6ҺF=iU\މ6Lg@�ESm?#$@%|ȟ^,͂/^-΂y̙>�_ Ofp*eoAZ.r֮]+ yիAmlK!}ga[AmRHq>#7o<]~ՠ;v Ch3ܯ:XXnݺ5DoXXp=w}Rb#`6m/?,1xO֬Y)l,,8(f$ڤIuEO ?)_|0 &pK}ݧ9sh~?Zk1][5kL͛7Ս-[Z;>}&MNv|rAӰa|$BymGQ$L\\-dL�i$` 28]E�@�@�@�@�@�@�@�@�A" � � � @LZnM.@.< &URI XːIR{im:� .CJG-}t|ě$/ GVe>rZre8Ђ1k֬pPad0g[؛Y=[8YXB -0x/x* |oC,-xlpi%?,h,͞#C ,x#qZ {B(d%`8ftIzۥ5h`m;P{dWl J0h--!q=m 6lo~\r|-["J Ŷuocƍ~lm<lߒqi x? G{O8g2=ѵт1x)SgPwPgۭ[|ի ۾=ۺbN~m6NcKUZ c۲SN[|XV\V.HO:Dk]ǭnHAC!  � � � � � � � � �i%xwU?E�@�@�@ u,2V:W$] ] 9IL?@�\ਣ=nt$k+04j gjذ4[?,iYXق 6%ZZNł%#߂ȢETxȇxff^۰;)){Xc}dc۷l(Q\Z!u]zi·,[{)UaÆiРA>u>l-zk&M|Ͷ 2/g ?NJ+PU GD'J,t9uψfm'}׶ϰϩ*U_ھ# B2-'Af, ?l]С8g e;wƍ~'q@>k+r۲݂&m}g{mVRŇM{iPf͚c GJ&ꡱc�'`A+� � � � � � � � � @Z V"� � � ? )ǯK%w~ڕ 3 )X#� ]wɅH#GJ  X@=իQ ) f�൅8S:wzwhE\YEeiWA= e|G@a̜9S}Ao7x - 4-Lo{m{A6̂[m27D"r_ HҞ-p2gD 69w+W·?ڳCA ^ رc-[UV0G xB\#`ܶ{[0>Z=[q:ub伒u~W_mkA._.ϖ Nb�A7f � � � � � � � � �'@d-Z� � � @ Xx_'mӺKH=zAZq9>4"� ~MJ{K7,q\UXYaܔ7ސVZhI [oUw}ڴi3fI&I_ U{X#`!$>{P2A=頃Pz.Wc4{nԏ�(~{@6$ci3 � � � � � � � � �y(I@�@�@�UU+iڴ].\/IƺA@�H6-}4ZN{SMB >[.2zGț Ծ}{z5iҤ̛S!�ۤå}Ԑ@pqٲe HO� sk@�@�@�@�@�@�@�@�@ LO@�@�@�@ĸb@ZNݺqMBV^TjUB6F!� PjIW]% BB3={Nrw=>b�i)/e˖ںuOH"iiA@�)]stSOI}6͍@ժRɒ?FG Y@�@�@�@�@�@�@�@�@o  � � �S -Ppƌ|V*dI1ҲSU#@W8f� 7 Bw't3i\ l"zԧT~ w!Mtyw.+5n8)@`w=F.h1xOW:A4n] d_@�@�@�@�@�@�@�@�@ /AEi@�@�@�@ S*WNc&A*%_60Ͳ~ZP= �I"` 7$=!-IRҿr]CJ`…j׮>C;V;os'n@�\ ̞-~4}4qtٹ b PO1*@ %LJ@�@�@�@�@�@�@�@�@�r 2 >F�@�@�@� jEd Eu"E - Cy"�$@Rj%2Jնm( "]yTz~!֭[dɒ6mvD� #HvRkmf: @ //1 HJ sB  � � � � � � � � �$@d:-m� � � @ MZ�3b1 YuIWQժҺuIl� @JCzy6*F`{S=>b�i#CW.]4i$ծ];mNG@�X ,Y"u& 7H'Jjrԕ[ s+@ W- � � � � � � � � @z ˟#� � � s 7Oڰ!USa.L ʕ ӪE �I,pg$q7hz Y#=4`Tb5"#;wk\5jʔ)کH >iSiRϤ[nKDq._] PiSa#� � � � � � � � � Pp nV @�@�@�A C!itcҡEOL~UH?ש@�(RD:T5#<C'J;Ki-Ao߮z뭷SN)Y3@ ƏZ;W80#ԼdɔbRwfMiʌ0_~a&r߃I5�1 H+#cvnHA�@�@�@�@�@�@�@�@�@ LL@�@�@�(@ե5S ,@<j۶8 U$+  �Ec^˸̂J HÇK=$- %yf~4iƎ~P_TH5"@,,wߕw^{Mj(5SG^6m.,#q͚CSUkZ휃 ]Mx@: DAHG� � � � � � � � � Eӣ@�@�@� Ru Ȃ'ʛ%ΝRAn ؑ7CB�@ &O|3{I [`�~}on G`6.]RY R@`bO%{Ҙ1@&¢-_>g>H9SZBںuϖw?al@ 2 @�@�@�@�@�@�@�@�@�E tY@�@�@�hF2�gȬ,hQƤ幊J)֯O@�b.pagK7Hhrq |ҽJDA ]6oެݻk;)mZJO@ KJ_8qSҌR b(pu9Wf?rى1H rt-}D�@�@�@�@�@�@�@�@�@ C H@�@�@�@vҲe1 c,pd7XV㊓ʕ3Ih� @ qxqFNΖY?{woqH*@$*J )d~3 !CO!C$ăcdlBdDy[>ν{>:sZq%uԥKt."Mԭ[7=z7n  @3fH+5h }?H')G,R#gvIj޼X@ A*UJVN,@�@�@�@�@�@�@�@�@�@ "@J@�@�@�]eˌ_EK$~%d'~/ 0? Vk#� r]wIkצj/WI4u%u@lݺUgyKb4iR2 a @ 'u*5m*}MF@Ke&QGҬvR4 <4 Id68LB�@�@�@�@�@�@�@�@�HYW۔/C�@�@�@�b\Y:� b.&~Y{VWс+#4@�"i:顇p#TVv<ztENiy:\r>C9R-ZHk :��3cAZJ1B>]:<\Xk3/Q=7#-AFdv�)PfMz^#� � � � � � � � ��A5 � � �E.paA9r!l`aB(P!#< $މ4@vU&i"HӠt ^xAoڴi  @63gJ={JkK]'j%}4atRR٬ĤXQJl훸mԩә�+`dl?=G�@�@�@�@�@�@�@�@�H? oc@�@�@�E Gڛ6H>%V"'#!� c .Nԯt-R͚E)*G a>#|Ν;'Lh kH>+ ܘ)-\( *tP"6W% }Zԑ;T#@: T"5� � � � � � � � � @.{~"� � � PSyl.n%Kի 40 >lX@ *VzJ0i 6i]%  gg:K_}:t>"� X0رH.]uT4z4gNF.Z $>rT?-WNB�L7  � � � � � � � � �"@di� � � @1 4j$ُ7[i09%2>}G�ȋEI HGA ?~+K;XXvN<D>2dHr5"�E 0cFFȣ>v(M.{h+J* Se X-4^u?y�@*Қ5X � � � � � � � � � >AϾ � � �YyؠAZN:yX)E%2Ew,B�(t2e2^{M2Ы4SjJ:4,]D p Zd|MS HOG:�iS嗥K5+k2LzG[>X*o} @/ϒ � � � � � � � � �$@d�G�@�@�@�80驧}2 __*U*%$ 9@�_ओ$ iԨcI^yE?^4{Px5x`sk׮ 8|(}TtOHmr/ʍ7Jgs etT KJiXK0@�@�@�@�@�@�@�@�@�;1z� � � �%/`A HVm XdÆOO)jU:>#� ?F&2zڵ\pԪUz?uEsQӫR ɓ[oOjX80#@|̘\:B �q>Fw钮 b T,^k !� � � � � � � � � ZeS;@�@�@�I^ʔ>L."ZF[L`\m[,L~`/X � @ӵt-RN{fd!A/WQ([jK ֭aÆ7nܨM6mؼym۶GvN \`ҥR^9vdaTB㎙mZJ"{_TNM\) *]w]'+)pTtIR6r@g͢s?'9X8aӶlQV-Yr&MꫳΚݸQll ;+F 3lY $@* @�@�@�@�@�@�@�@�@� p= @�@�@�,\ysiD X9$LsJ!7%6� @ wtAkItͧ(`>(/[1nM!PBQFjժ% 6l2_yŊ ˗/WիWkժUg sp܊3ZX= a,W\$1PYY#ۼ\O_,2 |iT%IE?jժmyUzu.~^It%rWƳ}oYHzl1c2O{ /הs {xaam[cn',5 |)Nkg{c$l6aͷ+lɭX[-;'+l {([  � � � � � � � � �i#@dj:� � � @i#_2f9 ܏åFr^& L=N_@� CY3쳥oN9Er*8t]DRI뮽Zu]:uJїX]/ҥK3--kp5 3\n 2ZHYv *(|Y  ~zzo!v# ; d ʳ30lkԨy5kVZ_6kvz,V+L9Z}t92E'L>(1}\' (uu=y}/`Ƿ6V,Y$2>D/BR-1zxXnLMni6>X>۹Q7O~0uXs8Fd}:NXa?C$xׂ4s2lj]wՏY +l,) %:Y @�@�@�@�@�@�@�@�@�$'yIh2 � � �$`A?.#|'SS?ѿ}I~; 0p@�ȣwK+=ty\B:., ȴiɇ~XƎ} ?.\h",X>n۶-R\9e ]PmZ.Vz0ȭ%a~Xe˖-> r+a^l2lY(xN-ka0vڪSg{{ie$- u|?5rLi̘O>MH#?ґGʅ<#`aXaC8fk'aBÀA{WZl6VXxcO.Z`eʕ`D/>[dt_+=Fk/&HWw  � � � � � � � � �'@dsz� � � @ X֭_HYT^ ac~I.DA. }~WuҶt@�| ,�i+5@(ԳeTp2EO7xKَY,Ν?͛aa)Rce_:t֪U+B51*g g C6lWs,<rɒ%Zx -B&L 00tx[GՠAٳF2EY᪋.v̺Mk 3[=\2ձ4p`F�˪`p_�>LtuTq-' ;,2>DI)Y ִ}bxA=m|_nj.vkB8NXg8NXat?&}tt\ҡ@�@�@�@�@�@�@�@�@  � � �F~O?q"AEL-Q#< W(hS@�@ & *=tURVO{NhOA z!׫Wiu,'a?={ CV,]v. nFcYx|#Vټy{?{Xhh<yd]P;gL}ׇNnm\馌?Ғ_~)>';~t5RNRR29-/ž̙+Wz y}#c!iU xZ=b;,X1{キBk+8b)3/*Whs"� � � � � � � � � wy_5@�@�@�@� i#MuXh\\�ol_/ �Ue^+v%5|* ̘!=HF�_vA~O,_\-ܢvJ(m.M3gj֬YaAngF>h s }{ի'ThLb +W·;ZcvŎE cp̘1zꩧ53/UX~yp:Uf4:<343 @/2;-߮[N3͌8agKȴk9|_-U@.-akc/uksfdEE7L ] $u4@�@�@�@�@�@�@�@�@ A@�@�@�@ ~ |5P�._@'� I&- t� TzIO<!{CIt[v_ueK\"}UYT2dJ.=zr7o< q%}7tWfYw4i7&3rr6֎? nGv넅D~#FҥKVjAo y K*{~3Ѕ]s+]eOkv+[}w>t]*T #.wIXѠA'_rvl1`(j%{d-^lc5xuΎS'7olj-ZuD\95W'Rh  � � � � � � � � �E'@dR3 � � �-`AZj 9s})$}ٰ +@ ,;믗z+ZO[ [ϸGi5L2ںukaoH-[_azM´.=bm_hҤI<yf͚%7ժU!X~rkڴG�_ kז=:uꔩuK,#1cGuᏛUJ5lxͻ[˖ȴ^noiqnm䟿}A9ݠX_ ,[,(דּΒhذMӃT 0$[np7+,駟�C9}GZv0Njp3_֬I@�@�@�@�@�@�@�@�@�A b@f � � �J5kJ~Jd" I7J_(g<oڄ �WKo[ %oI7ߜ z) L=Kc >\X16a>qժU> e˖ҥ[tׯ_[*JNr3fر?wso]Gm@ȿpJ\v/.;RAڞ?\n] oΘ*矚0a'lP< 0< ѣzmv߽?8S"˖-ԩSjA{UlY5kLGqmVkd=^ PaŽe� � � � � � � � � @Y2l@�@�@�p%A7ݔv]OSF) AIA�@� XP߾9H7 p@apyJ.<FQƥJm۶ B }YuUK%Nwl �QF.nÆ jذڴiよaƍB(@yF-[N_ wq㦺yZ*Wv;P;찷.E䞥1C2H׮]bm=zfΜ/y:X UVvv#/ :ر,^\4��@�IDAT)g8qx mv)￿=ꨣԮ];UT)\g\JMYSb � � � � � � � � �$�A h � � �/~3[on\ ~QG;`#laM 0� @ qԿ}߈Ix[`wޑ|ScB ȭA@ ,\Pcƌ믿+.\R}F>@5jK/ՑG5kl#: (PbEm?z ЬY4vXx%^˗kg?^MwL/Νljw}WǏ{UV:餓裏Cu%Q7& h%!`vz;i$?V7N RRXbq DSf WNNU@�@�@�@�@�@�@�@�@� 2w?G�@�@�@,r*o.~Ajx<e2zOd:@0\N_:XiDM¨:A` +K:-.]4AIxB/UÑR[%֕e˖k惨vp:v쨾}skJmld ?zm۶iʔ)>`BV X֭w:l߉{?NX̙3Un]?F\s5+WNE(1 Le{XYf8gϞ~qNsMJl8*U֮M>;@�@�@�@�@�@�@�@�@�B?V� � � �I/~o]w> Ȓޙ%݊~!2 A�HNc nE0!9@.praۯ[L: XhaHߥb&Alȑzz:4bm6ܪU+;tRܫR<LjѢEh,YDÆ cuʗ_~YM6MvREUzl+v8[oO>qV͚5S#*V֭K@�@�@�@�@�@�@�@�@�At1lM � � � �*UJ:∌ H8JV  a  �~iD`:&0j4t4h\ ȭIA ϟSꤓNJOw͛nI{챇..oiȐ!:c ,]V\`vE]{Oد_?͜9S-[TO@K7nN>dթSGO>O?oY0/6;윳sA;/휴s^۹JA0, E@�@�@�@�@�@�@�@�@�H eON@�@�@�R@];ii۶LvarK'iaƍEE�@ Zun{TkH\"zt) ]/*<Ó3؃oƍA; 0`/^{N;vTo Ÿ;V /Pcƌ/N8A}Ao~L 6lyܹ*Tcjپ=5*MS/!`砍 vNڹi稝i.!q HAH @�@�@�@�@�@�@�@�@�)S � � �*`AD8}z0}l$A7e-E�@�X+͜)b^ tda u# &g$Qi&7.y;Q-5k?xjJe˖՗_~/B*TP-aS ^{[?{OӭުիWSEyW}quOւ K/m۶@hܴsU;gܵse  2?j� � � � � � � � � A&랣 � � �$@Ӧ;K|O&d?tD l"_nK@�(O{taLؕG|Rz1FYLm۶-@ lv۔)SԠArףG5o}_(p>85� `guNaÆiĈjԨ^xBmtcڴiK/Tw뮻nv FU;g-<a;휶s@^̋"� � � � � � � � �$�Aɾi? � � �I$`a{I%QS.oCKJX ؝0|B: �Y- 2~駺ݽI:t蠮]&Pޔ+ /N=U:[|&n/]TO=;8 0 yaիWOq1o%@]gP 6ݬŋkС:StM7\/?ٜ9st9rdt ԬY3?^ -@R2 .zL#ު]mի:mKnBT{9?\p>|̭$ 'iӦxv.H>O-[TÆ 5w\vmTRAe| G(cn0O{g{d/`7PI:;wsَ!;/c){9&@A {6!� � � � � � � � � 2@�@�@�@\\&+tڸ* &MZ4"2v7E�(FRptȯ^?co8[nOooÚhϞҦMғOޮf+A\l {χ徵[_~ѼydϔO몫75i$Z|ysYң>3fh]w!Lj*W=C+]ܩS'b_uE)S?g}Լl"]~ǡR2 lٲEݺu#<oQv.ry睙,wv]͜9ӏaZM~n:u]olܢݟu~T!5`vhחLowv.YPu;8sqkrOd817]#� � � � � � � � �$�AGh � � �).`A+VH|MYd ڸlA%Ϧ@�R^[?ZӱcHy睧<h7˔)ٳg{wcfAJX}W.Err.d.Xz9fWܷRK\{>.+/uᇫVZj׮^}ոdizkgնm[ٹtwGy:,3 6Վ.4h ]}6l>-[6U|hB{,cw<5kA,n=.M[Ν}裏N:;vڷo#<a\I'-,c,[D66\|*q"z<] /0Er3-_훰siӦs} }XC�@�@�@�@�@�@�@�@�HDuY"J&@�@�@�K`5~(,T. D*5iRHUa4@� YoA_Z+ƍ "S ;&Rq_TVM;Sk)C.Hr9:`a֭q-<o<YP]C{W\b@# grkȑZvmK0b^wQ_Rڵns Xltꩧƻ@B>f7xP5駟ﮮ]Fp>+L+ʕӳ>:ʷ5/u]#m̨[nIwg10 >,-D,~# or^(9n纅۹OA AˈdwcF^1`@�@�@�@�@�@�@�@�@�(ͧ � � � Sdl}$ :0NJf 3{@�Kzq3!Z kҤI.b5k=zh=UYL~.Huѽ.o߾YfdҥK#oU*U\y:c| xdj݇~؇lڴI_y:MVڴi믿^|{1Y_T{iذaz7Tz׵b N8As+VυJ*I>F-& v}K/ws{zg ѳ2w\wltWdЇ~W^yE9Y]tdgjժڲel] 8p'3fP>}\HiwMfu7O?}*T=ܣ +޽>~0K./`=3ꫯTrel5`Hi_Fŋ< 1pB|~SN9EW_} Xv=u-aXgy8DgV҈#xC_ԨQxxwq*XŎk?sccՑuKBiu:u^}UX^=?q޽{G˗{{'~'j_|AmvMwפOjʕƴlˮ<>3?΅{Ju 4e7v~L;G vbA]ϟѣG-׿oD_CkO8-[qخ6uyѢEuwkԮ.5k`ݺuV]ba ]s^#r+v ?թSLA|vc״_(6 2< 8co7| }'Yx?*6;cXaoV~/7N:V-g{_~Et?:NX{s~݂NwhA:zg3Έ)2 KrmٍxZ.t7?|A`ώ;̳裏}Rt,]R}cU8!� � � � � � � � �@PN=( � �#kA ( @D} ΝȷSOAJAiS`|B/7c_e˖{St/E( @2 <Hc,X_AӦM:ӦM \SjժV w_?F7ο.@OsR g \ȠߥK ] \Z0xdGy_cƌ \X߸qH.,0p. \s|]m]RFۮ] .<.8s WЧv.%po~X˴bx3hP)8m̅x'xݏ4z+\xq4M}n/4i9]8Q_Fsfm?~_qႹ:ah"pAh l }6d9V\Xg~k %ֻ"˴m6p vyȼDڗF"_}?f 5 N:unϞ=.ԏmrK3{w#Wr8ˮB 4;16 qv'Zi3?.l  \(m\ m+.7hԨ>cS0s`v \ v߻@H5Ż-6B,_ˬ_m_.-ۮcpLK/rᄏqmm^reXϫWZnt_Og͚寧V duw]vкkL8-x~6]sX]qF0aBdZ.ط1<ljy%.P3p˹6Ŏ_Xr:+>Ď? \no<6U[?m.7u]8Xb<ȴLN~9ݯ3VPM1>= .;s{XOl;Xck \D<P<䓳Jv9h3GϏ9WQ{@0쫮*ꨣoŀ&@�@�@�@�@�@�@�@ [B0A3@�Hj z"YDT6.052iTD;5+ʓZG_Oh) )-2\Syw_-$B͛Ygر>,\!○,^A oZj6֭[pEEn b9p=!e+b,', z\dd!\[bŊpUV~0/Iełx:T`7yߘXYZt {9?A{֭['|/fN:Շ,EcY`%ѻҮ];JjL<?[ИYPXv#~C}__8͂l{}ӵkDٗ"=unGAZZ0i֒8a`R-;,(5Sdclvuf7-7Kaow0Xk>�7-Tvvaloذa68s|=,02/%1-mYH+ 6dy m| pmamlZ HΏ? 6lz~v_zXvnek6- a2l†Òx ctșYmelc;pf7eʔpR<[8_~ɵMvp .W v3V_o~x~KsF"cVm[Dn,lkdn~ݯ3VAwyovߎ3VӦx S"old sߎd,n#v\~;G1*aW (�A+Uo%f@�@�@�@�@�@�@�@ ('l  � � � P JuHcf~c3gJ *1 ) � P4Kw-=m<rrbڶmJ*Ʌ=iƌ.H*:Ły{ie䂢H+P ¨ .TP.x%o~[g˖-z_|Q'p\HMd$ym/\(\: 1B.LW]uU\TQٸQ:LiS;ҥK yOktq ;ˊpB•"}iJ/O:$_s)\%D旵heذara~`7P.?ɺuarkrs?/xXT̋pzg}2ӎ=;]0UdzNvd⫯ ~ (o<{8i6Yi޼츳xOLcNծ5*T 픍7.tL !-c{F~~yK-il˅vڙWF웑8SbovuWٵ݊.Կs<_WY<ˋxzݽ/�.]f .e۽m۶&ʅHW_)/۱Xa V-15x`+9VmùvbJ۷:Mݍ_^ly3(Ok/o)"q:\rٳ|G}]ƕt(9'Xb|~廊t?N?.`1)i۾C8m�:� � � � � � � @ dR@�@�@�@ =:t <A-@�@ 9X8e{ ҳ0/\lٲjݺO? uX�Zwܡ)SԩS5g?ςm[cֲ{K.O: �, PXOG:eׯ}-y7(IjpL+gXA6mp_s ޏYcF+ᶳۗ>z|˖-~gpS6:TjՒ 5j( /ֱSLO<۟Y wyg}>6lqNv8ߞMC)H[?WXw5ycm-¬ij?~~RZF _Gq |̺n>1's<cZvFo_j 9z^Nco@d+abYo.0j:/c]O,@kUjA|-f͚5ۭbE6ص&ʄ dv[D[>JzvG]-[3<Ν;g]<o dϱem͚5O.dy=ka{{.ɱ"q:XaժU{Z_!5ٹo r ȍy.MxF�Lw s*=*9e: � � � � � � � Pt/ EgK � � � CS'~c!fڵrBZT� �Y~L{r}nAGpBj׮+YfT W&O#|aMK, l*9dYx=ܣs=W3`�:Cr\fXHG+~}޽ }17L ؊cl8qb%ۏ@~X(O/d{ 7x?6l*Ww'sNgu94v؄ؗu ֬YV |r_wNv/oH>ѳ u>4lPw_<2쏬 @Y+ji?Пv~[[Q 2Y6m_0jf-⼎F`_+y9mo&<lS {WRJz'/-4kW?[ sTټy?ܱJ.⸂,﫯ѣzX/=ֳ4z{ 6 '06k}/cն}Y<L<~5NXCTSRcEAikW\zaA y;m }L߲e7?Ϗ"'_#@ ,BۊweCA�@�@�@�@�@�@�@�] b'g � � � `iQ.IP[c � @'(n-zk˄s,`y,7S\d "-Tg,+%V\YNY,qi9uꡇݺue]eAJ/!rӦM}Oe!mm_nێ5 .<3֒Y=dmS$�2eqrm`N_s>߻wmgW�ygoG.]\'zըQÇ<>v!?bn*h"ښuvX[ogtn/[,-Oj 7ܠO>$2///ƍڵkٸfłkÒ16\'g;ןz)=3>T5s~<#k{l^jڴ|MyQGz~ѵ.Df]? cLSo^'c"6l0-z g++WO۶�]+;wϹc㵅YM4ݞ]f?1^a!K.Aoy wtI>Xb' $MbfW>`oca[\B9!z`p;,؊V {(cլY3{ҨQsyN97s2?c],|8 xNJxT5\Coul([qͷsy 1@Nc3ݗ1Ut($'2ME�@�@�@�@�@�@�@ 2~qJ=/ � � � 7o?ihn7rL$~ @�@�~ -# XИ{̇?[nŇ%ڴ=XСC5%a/$CWg{pB{f,Ӯ];:mV{キZlClٞ+zfGV_mڴN;OP ç I[u[LkiuX`nۮA44.N>ZJ-\9ZZX>C뮺馛$ۏV}e?͏ޏA*U4|p}<xJuYzm\@VZ{MaY?YMW}?ps:n^b;-Ύ+9ժUӟ闱+ |})LOvY8oĈRYrkbA˗/SLsc3˛ۻqQ,]|c폰@haV,$xɒ%۷?mZyWd7߸?rɇN>=rG5_'1- pl‚ꬍ+R;:_4Y]=vva~\6l.?䓺{lq9_o$jb e}%\=s9;}u}FX{Oݻw~�ܮh%{׫W/_W͚5ey-llםx =&Jټy ЇgJn]4i"3$pXzXcE"h6ZJv\Z '{ܶe|vi6f̙3G/&Mucad/v>@ 3鱞+iS<tnc];<yd %\kMAu?#9ޛOJWϏvwsDSS$wϒhT@�@�@�@�@�@�@�RIB+utAA�@�H^=9uCO( 0:wrP@^Xj nc4^yއ@" =݋P@�T8 8zₙv-h޼<v]аa6.!R \^.@ɏZ fϞL\S2-ku`ƍ:\apꩧGd ԯ_N{D.�%p!o6�LݺumtArg}׉վL`W\]DŠB \Hf/ƍf͚y+um ey|ݺunrF.d,=z\XYdҶmRر]\pw.8c./p!W_{x:Ծn7 .˶2?xn 0?c39s?fm..8Q;Wl|SNB]x>}za爍%16zx_?S * \hoB]Ȗ5N<v!`.i<k۵v~<zG{.͏ol_~.�+pq/1*ׯ_\ڲeKp7`paogǏ=v 5e]यl87;{zBvsf \(pбcGݽ+u8 M N8ȱno'MF!CC9$8#Y:{۞ \`h<?O0_cП~) f邯z0Pod +]onz<cŻ�P?1_{#{>itc֏wkZ=oEXbE<^(zxX ǡ.dۏ~i\^(ޱ"6Yx c#^辄]}`6g pv?۹m}s>#b؁'f f1{*a7 (*`%^U� � � � � � � �@)ۢA i ^+@�@^]:]c PPC&=PVȑ 'HK5j=G{l /fr75Vwޏ^^fIU�i 0eԲ;upir[rۭTz6a͚53g4h ͷmt$%tUFbÆ qB2S['KvųFe^z%]|Ų~Zqa>1c\У\hv+P L G?[ FΝ;W݅so7˅ɅEeݷY^Xm۱h"};ܗY &3]vyޮ8&wqzBhBk8X3Ecs^;9.N.J.0U.pO[y"kuR.P<b\mc֟d}N/炎ia\X.\\;flt\rmc;쟭Oclq[zyg;/\x?]  Hыir~[fGAk31…c)ϮOPl_<X.Uڵӳ>+1Gwy\p P7s;+\Wvڇ9VyX{lu<l+X{D׏skWv+mSA=x6mN/mm_p r뮻 4g{|q1O*h!͞-w caŰD SGz晨Lh(-[ͤq � � � � � � � eSOt @�@�@�DV8_3F:$it6st$m<F�@�8Sn\ ۊM u:b.slfV\Y͛7fN|nlٲq@Zi%P9?S0ueNm-d.,XgQ9[>Ȝnfޖߒ]P}Sn  ŵ/sj' &b _AN!eA.rls cO 3g;m۶WzunԷo_5j(?hxZۀٍƳ>\.{Govv"ӬqJml e zܹsXu_44vG+۵1bE/.Ww=\5泅% ߇-,,Ct=ȏƐyy1b|{e억wҥcPn ٳgQX⽖\S;cqc5zcBÒ0{Xb3VۦŬ [ (4h^UӟKb86mT'O=SW ̪v9;`Ur P.nVkvءhA � � � � � � � @vo&٩0 @�@�@�E_[KGY%nr+ԍ� �]epG9gz-mٲeLo^9DҩZ#qb0gAYCnX5m?>m]rڟO?]ݻw׋/ zͺLAO~>ߡy~ǎUziY Ҳ+‡5i>L˖ԛ샳+-*&tU7 *Ĝ_3-oεC,JAΝ[.pPkVdgj2xgjo^^S}z[n%֏wM8qzuUWꫯno5E\qx<,w5+αbƍUTZ5u-h<m,]T?!C(U`ŊnIz]vz,2,I['zMW@�@�@�@�@�@�@�@ L@@�@�@�HcMcbi֬6&@�@�<XֹJw)"+bAaA3W L0Amڴnz~&\tenL"C~j~ҥKxie�SUV-H$AZ@SҥKYP6aݻwOՓ&Mrġ?js>oѽlժ.2P]uuIF\~Fы-ZRvp&rɯY>}3Y(ٱVvڲc Ĭn3|o4J.ыk ;%S+zhmm۶зo5V$q0^ۂ.W+ʻD:uzj?UV /֏7xC5r3a1lM̙_^oORXHT@ lڔ{"U�AI5 � � � � � � � g L  � � � P:I'i} f M7N@�H @jڵh"8y킔YW%0`kC{VXkJm%'`!;cUV\&3WXiUVnɴB@Ç_O<믿^\s=վ}{Ylq#<R_|EUV-{${3e9|r~Vۋt_XحÆ '|M͊+bWeM{7N=:tzE[\qƊ.mXQT)?^k׮ٳ8ac]m5pDm(Pby#6c+u::gHn aC t@�@�@�@�@�@�@�(=qJK@�@�@�@ ZvIc jXdfEU;"� �[Wr{ϗ*TȨo…E:u U`h曥,�9 lriʕy"JG}ȑ#ϫsΪ^N<Du/_@YćYJT_jItR1Boƌ*U3Te%],K,s6Vu]:u'+0Vp_RcEJJ[oAW$ lYfjfU2 TqvKQSf2@�pC ,,2^X6F@�@�@�@�@�@�@�@�J#� � � �@Yg*:t,votsS @�]ۤUG' ,ak5jg" ]知ON;MP�z��@�IDATB H9͛7hdʁYУYŋu}i޼y:뮻!Ch}@ l۶M_}S<CUV-[{챇?wwOhB@FX\^4œYf^s,XlYfMjF�| عd甝[vٹf59h碝@rT)#qݺ9. @ L=},r@�@�@�@�@�@�@�@\@�@�@�(YcnQry.Pdےj[w̙ҥZ �e=^wԯtRժ… } Q]+WJ'"=lQmzH- vV^]^xtG}#G6|eQFItv>USD 6n8;V|/_S2eM4ѝwsĻᆱC۪U+?No^vYB E֯_I&)+,0TRj۶v/4hPRci$PHnݦ45]E�TpUBlZ|JIh� � � � � � � �)!@dJF:� � � @r }tK.ǁR?,]+5mZR � P7 =ԿԷoF{Y[JغU:4 G HvQ\K> TԩSx5?jÆ jذڴid׸qc \仆 $u7>ĉmkٲeᒷ;v|PGuԩ=yLwZ%ا~ljzSutZh+ZnZjW9K!/֗_~ +lܰ_:uҭ꾫oHDJ !V|y߮u_ �I*>dn*i4@�@�@�@�@�@�@�RB Ȕ؍t@�@�@�__.A# {ON&!p@aL} � @ /-}ԣGFdT\4~TvI-@ٲee˖tjB>`曵qF}Wn z*ڰKm8CԪU+|A}@A E6mڤ3f�ɓ'b>nݺ>GRS!- ҥ?S&Lcǎ^{q zzx@ ?{'Eyq{\ HG Ti ]h,Qcdž5v%Xb4P JQ@(iWs.yfw?53󞽙gW;khOV\)tM W_ 6ӟ(�_+۷gDYi. ?;4A6om � � � � � � � [A7 � � �Da9A]e͓Ҥ5C<� �%`/vj* 2dyyDzEPI-ċ�A8ҩ>ʂ:޽[̙3ooS=daWx8�98֭ӗhs u믕:u@#<R7xf͚]F'5{l}'\1f ٽ{wsER͂h)D].]{+V.l%_x:Ccrt㧝)));vdO)ĜΝAFAݼYjڋ� � � � � � � � @d,E� � � @ ߩ0FbC!A  � 5jH7 ]zvZh펦F?Hw!xb4"dЊ@ںv꧱c;v`͙3M>]>l߮];ٹsgSNyYF ,… -JƍeCUW]:t蠄ip짠j Νg}Y^ 78- ҮJ`-18Ws Es>s]{wAA uǎ7!� X=ܤ@/ܲ � � � � � � � @L Ӈ!� � � =CHIwߕN=5z߯Jڇ� �Os7߬S˖--0cti~']sMRv駟i pׯ[ے%K_ʂ,0kĉ{r>4i" H _~Ps,`C {\lrKOOŋo۶]n]BhAs:PMylK 1bWo߮~M}VZWILLT6mr￿,tm۶~yՃ#Pf.Ej ;G5&[Lv߹' > )));vdFci3 7nxC XR@�@�@�@�@�@�@�bM X;@�@�@�(SG:i #uQZB#R5R � PowSBBۊaa"iHi0t >YTejԱcG?=:wYYY>o;YZV0M<Y}׵`> �֭[UVs{ܨQ#wJȭ)W\)V/g?Z[FFDZ+{?YСCu>m޼y|׷o_?m֭[<a?c=ڼy_vP k {?Yhs#\uQ;W~~n\R $ۗId[@Ad2GߴIW/Lk@�@�@�@�@�@�@�@ 6H/@�@�@� M(!7/ oI  � P\X&sIFUcqok@v or( PF [ڽ{mۦZj6 @RRRn@dرr}7>,¹,>7nb~�~E~ެY35mO}ݗ\y`k׮Bmn^ڇ?qu冷Y',8Ԧ={0Q P7{:k@^6lPpٹb֬Y>%Ag}!8W{$8?s;op Ģknc`a9#b˖-QFnpΝ5b/4h.uA&zĞ�AwLmXfY@�@�@�@�@�@�@�@trv� � � � .]wdTs`� �D!rt≒iL"WRĉ˘ @9,ˊ7U(¹8�?~ɇY`?~z loG 6Tƍ]Dܹ-`H{\~}wMxd�yvv6mڤQLid6c[wݽ璚i~ ǖ-[G ľ@wۻw;k+W憆 9s?Wl޼ym:3}^z^^u|;w+yp; ȼnݺ>B>\aaAX[jy1,`Vvʌg�Q,@d~iHNA�@�@�@�@�@�@�@�*]ۼ! � � �&pAR&ҤIfTԽ{i`]@�@ <FI={J_`EOKn,lht0i;-E e`N,HA 6_hQnV;+01 z & &N:{-<f͚>$--,.Zʷ=E ciǎ~ݥXZB9m2? k;= ~ Œ-t3׳�N:ia|MWM6. XMXX#sE.h/_ٳg+v,7 :Oy-'sع68O犼爼/s0<avh۶?qs|a(f[ٱ#& "  (Q"r}!2JD�@�@�@�@�@�@�@ Jw@�@�@�f#s 6{[~ @�@,& &͘!_w##իsB 7_ z@$,ɊrQ(Y XIC333s,,$ B mnae^fC 7Zj>-` =^Op_޽OʖqA˲Q@o{_  3o]-r4 P3tV@ $7lূ,9\bEc[fj eL?Gs{=8w^}t>(hGl :Wzq%))ɟ+,79[xcrC4sy�'`+MW\+(@>PD L@�@�@�@�@�@�@�bL ;t@�@�@�h>\:lG{o󥫮6g@�@>xtuԩ-~w98:8/?w}}+zWִiS?B,$.,mK  V -<f< Lݻ?C# Z -q\PȜ-p< ;LDz[.ZV Q 6sEsDȚ\a2;?v(( ;jy�煂tsD=b+ۖ�1]2PZ�"TYP[H>_q4 @�@�@�@�@�@�@�b^ Ș?t@�@�@�a4jTt=LH #L- � @n]8Pz]W* 'HgK/x` _*V6luU쎨r X`>rVU[KgUW_}l"Sm*< qs'V.D&$$Y8( @ \mv-`&W<i6 � � � � � � �T@*o @�@�@�@�< -N<,K5jH:zS6@�@�B%0`4btjV(!ҌҔ)A4 oz@>l ii孉@ ,ix1}E� T],#@8vj G[hEVj޼d � � � � � � � i #-J} � � � Pn !|gK=zHj  � *͚%Zڟ22N>Y6M<YիEĻ@Vjժxghٲ0@�J.PjA܋5G ̰;P@�(ؾ=f}Qm2Aq{8 � � � � � � � 2F � � � @^ \Z꫼Ky\9s=K"� �8`n 4%r{9}@ R-[ʕ+#U 9MOK.p ήKe( @ Ad6 ^@�@�@�@�@�@�@�bK :@�@�@�Kj('&&:Tɝ ydvv� �,0~`s(~&M$Կu"ZҪU4 Xd&Rڑ@  w#L(@bb (EԀ�TA֬Y;fe tl� � � � � � � � 2T� � � �澱6,'&5Gm_-Id|mz� @t,~4nd)bt[ĉҠA @eiFk֬Ѯ]*cw ,]*y4 B*`,@RR@Yzib *7 � � � � � � �{�@�@�@�B)pQK[ynԜ9R4@�(@X!=d7 ,ߗ&O;,H@\n}7m# C2ӥ+cObI cG"-@ f}AFρ۸1=m � � � � � � � [A7 � � �ČarһL*#٣XidG � @i#!kٱC:؜t/hsݒ%K,]*14F}) @aII).2Y�Z }Yi*gο � � � � � � � @e Y@�@�@�J$R߾ohuV#`A={YC@�@ ^ڰA0!:U4bH}bcVE�ԪUK,rK{tW{}P aΖ/~E {siHBA� HLLvr@ vP7 Ȅ @�@�@�@�@�@�@�*Y @�@�@�@� uҞ=9?(qbV4o1]G�@�hL";VrylqSl tsCk׸:E ]ٳ5ǥ7h@7tJDedۇX q rIdj@,rWK C).0 4( @ XdJJ6<NlAKի)�F�@�@�@�@�@�@�@�*pk-@�@�@�A~l_[ΝR^almB�@�"#p5҃FhC%CGd40S/w_mVG=ܣ/R۶m^`!Vڵk@ 0--{J@ .; HR1&Aa;čAMwٺuw � � � � � � � @ #� � � $5o.V4r3GQC9ruR � 6 .Kڲ%l|{V 6lM:u> 8ݥW(pF |ĘҥRzR11�.Pj.CO3v�Q)Y;*;D@ 2]mrr\u9;k7i&@@�@�@�@�@�@�@�@ H@�@�@�uAd)A!%&b#VE�@�P+ݻ{ƗɋKOJ1"@D,vU.h:k\b*K @ eg$5  YYAFa[Bj:ZL[@�@�@�@�@�@�@�@ #J@�@�@�1f͒֯UPwfϖzʩ@�@zҕWJ+mE). (5o.M3`T�85tP%%%UKܹsX cg *ZA-MD@RR aψrkLc[Wq/[&i.@�@�@�@�@�@�@� (G@�@�@�X#r~,3iRw%}ԫW% � �U,pRjtUܐ GICH=zH'o*@T< S6Vk,D .%2+}B2 @�hHNNqL7Eci3Ļ](Q irDAci" � � � � � � �Ĭ�A1{h � � �!Ptĉџ_K;wJ={V^@�FzAi𴫼-yMipiذqpZ孑@ ￿JDL #LQ!`L|CXFT,@˨$Q@� ͯ( @ '[{Vq_@�@�@�@�@�@�@� Ɲ"� � � @)>Z<Y9s5ΝY@�@�Bn]cSO<!ptҿ-F"p 7AJHHثK{\2^ZbUC�)#egW^Y ΔZ � Pai![W.@�@�@�@�@�@�@�(V bX@�@�@�Zc͛ӫ%R9?X wKi � 95믗}TZ:rVEMK+]{mNh D�jժx@_sbR ==[c)*\ ]b ɮ,JF� Plk!  � � � � � � � AaS � � �Ė t$M[tȏztԇ� �_`XiS[ւZ-AZe X85h %%%vvڪ_~s KJ5kJ͚r/T@bbNAV0"))AdJz@\ XǾ룄_`}"� � � � � � � @l Ǘ!� � � 3CdQ3+KKgϢ5@�@ 6RRo|RmqIyEWi-*0aΓ`նmxq(.k'%$a2[I妤bV >+S1E:�1,lR/`A:@�@�@�@�@�@�@�b[ >@�@�@�8hi"iҘRD;ΝAF@�@ <SjFiuҐ!gISJ=mĻ@.]t%())Ʌ%sNBHi>:LW@ 9ShT�/RԔAZJz@\ XdFF\v=:Md2� � � � � � � @L N!� � � {JIo{}D,<V-HF � @ ,6'=pa۟./m(͘!6B[f<[n]ٳDž⑊bYaiiC�)P[ ȊTn[ %%u SZ�)PcG|=zid7hj5mE�@�@�@�@�@�@�@�Xp? � � � �`å. {+~*%%&V � Fv馛Odtvޒ5ʿ@ ԸsNm۶M۷o.4edd(2]LYYY);;O]tѴi4uTqRlTͥ_MIoSrrrc[VF U^SM:aS-w�DR] ǎw�e ݥ�(gqw/AcH9 ;� � � � � � � �T�AU@�@�@�@+}e>0V9S:8(]D�@�P_Z:["Vy&'<먣${l? @}�ܸq6oެM6):[nk駟s ~*X+ֱ0`nau֕F_޿u{lGZHd0Yd=eAe0)-r׮]%LuQ0ծ];zy؞~I 6 Jc�M]J}q?  P@Nyc2 @�P Þ??MqN =6Ժ5 � � � � � � � @ Y@�@�@�J!0|\P4y4zt)6U]މ,n%;J@�@�%!t%ؠV qr*Jӟ*iXpukڵ|x(m?> 1-&*  -ܰQFj׮]n-UVnbhs, mn&̝;WM4Qfʲy1S ;vm۶bc <s͚5>\3ش`M _(y԰ayƍyr Ė@zzNb_*O 4c  P@jj[ | @eFH…978BAA�@�@�@�@�@�@�@�Jldֲ_@�@�@�kLқog9}]c@�@ >r=V3Gٳ\F9Gz%oƎ6")!  oVd,7mڴnՠAA <~>Ђ-0LVQIMMM%ZX/ @ 3[`M_~eno%ѥ)1 B27oO6-[#M K%V4B(A9$ LefV' P>w_=H` N*~?@�@�@�@�@�@�@�(N x@�@�@�B%`>wޙ|h8T ̜) Q;g � @9FG&iĪmqI H&ICVm{;eغu/_e˖iŊZrVZ' y�hA_v4`�hM6}l᎔ X(c:udA%-YYYZNzwkڴisMIIQ-\`+ٶiFm۶mR!;. �eA Te /) @ XҮ]r7nM-FQ@�@�@�@�@�@�@��A!>84 @�@�@�~)`AW_-}\/_%~*= � @KÇK6V۷*% LHvT{n'?h>oц r+[kݺzN8YM͚5sA$у$=P\R1֬Y&zjFg|fR‚"Ծ}:F#(t1`T�q'';;N@))!cKj * %6]D� � � � � � � @ .#� � �  x hF\<c� � `ÆIK7 MR&'J&xkRÆ@~={hŊꫯ`-\0wڸq_=99a{})v6mȂ )WG6pVeN˗/R>ho'f%%cǎ~ޥKuU/nOW[#@| $&~{HMMq/gY!@hڶiA!=Jvl;4 @�@�@�@�@�@�@�J ȸ:t@�@�@�9RzMCu뤾}S "� �)p-С?I:쳥 ˰ P[lѼy4w\?ǯZ?oIf;[n=zѳ = K *@7oꛯl߾]K,ѢEr?X?x{ܶ@Hz衃:E&%I,SǩN*&�%PZS b pz)Cy&MZnf %fb7 � � � � � � � �U-/@�@�@�(J#KۗzO%MT  � ;LiԈTYd%;vH+t%:/"1[jΜ95k>s}R٣}ׇ=ucƌQ.]t~?!P5kTw_r=?,�u�<ڵkRSS}0dϞ=էOM~Wǖ#vV:�'AV#ի2E`l9.`,N -ڵ>Z� � � � � � � �%@d|oz� � � @L (Z"t1ѥ2wbL F2W � @L / ,}dUV?^ZL4I:∊" -YDf̘ jٲ,sQ=|H^ e;8HHHP֭tQG:++̛7O_|fϞ{Njw3`�?ñ\!x)G"@Ys$୬l@ _)K{<!;L@ :u,lN;6;m @�@�@�@�@�@�@�O ;@�@�@�HrhXAA � �&0h_I7XqA|"p\pgRZZuT`ѢE:u 4@}֭[}G}щ'~W^jܸq mHr_$tOv_yϞ=Zxf͚O܉|ɺ]P !C�u衇AE N^]TVMj6N:L7@B<bŝn) @)~yFF<.pE"�!Mz6fN:o@�@�@�@�@�@�@��Aa9@�@�@�J%0rtƍ9;8FV޵K;WcCt@� C NG^SJuD~jOM6;֬YMj.F?ҥ d9I)>5HHHPǎto߮O?N6MO<vܩ:H#F}KcIOZRS"%Sݑz@ RR}#K \\ڲEFh…YgEKki' � � � � � � �ĺ@|:!֏*C�@�@�@ \Go-޻_|!edH}g � �{ 'u\^ mv%cI-ȅ_!PUVW_ըQCvjyԩSic](@͚55d?d'wՔ)Stw}tGkԨQ>VZeStntm `Ldx -A l9AvފV؎A� t.#͛' Tz2}'m,u@�@�@�@�@�@�@�(�?G+ � � � @ zUޔ*kJ H:TY1 � 5K}&MX&Y# ,_/KFdU㳆up}ժU+&O77tozá[539f5jH't^u&Whӥ+tT�q AfgAg"I 55oYj5f̨ꖰ ,~+ex� � � � � � � �U%@dUɳ_@�@�@�(qI&Ʌ-`Ll:F�@�*]gOƏ7(StҖ-ҬYҨQe-S ۥY1͛Gsjҥ4tP%'''F  8 Z~W^]gy6m[|Ms( G  ݻ@� HI,d@ Z On,Փ }g � � � � � � � ]AF � � � G`HiVi< !Aqt* �DD`x=VݽII~*uXz*>лKm۶駟C D%KnS^#)))>駟ڵkk…֭7x#y8d.vIWKii!kA�HLi2AQwh0&YidG @f( i"&.u � � � � � � �  s,h  � � �ReKGKa n|ԯ_ t. � �$ಹ_K7Tao.rtUҭJ/$թSIf7Q/`_Zj'xBoV=3LpիWw׉S4eW^:3ԵkW=1ldms@� TV._=l�+;g H7J |WAFᢱ � � � � � � �ą�Aqq$ � � �+pqқon ̙RBԧOak@�@  k z-}W4I_ z!,oꩧuVZm2m{ի}8qg̘սsS(@bb.KA� HII񋳲2 ze @T ח&OM#N⦻t@�@�@�@�@�@�@�@ (8H4@�@�@�  H9s _'_ Ȏzbw @�8.]ѣo)z??/%լ3<∢U jtjܹ:]Ks P5k#裏BV+qcV4fegg6(@:utkٲe8p K.D;v4~��@�IDAT(}e!‚ 4jAchD@oA_^>9}ݡq>X~FX %%ٷ>33#{A@ ë憆a3{7P6m4eʔJU]C@�@�@�@�@�@�@�@P @�@�@�ZDCk#F /rQ � O7$͟/bpY_,7gKԺuz:hѢE: ̏ɺ򶩴vw9x뭷oG,,ЂH-daҤI.b|I-X o3cqi+ nݺ>>{ァk wR)-ªb# y7nԩSr۶mQR-o{LA� 2W[#�U,p9+n\9 Ma3,aŊ~^9*˒%97-R@�@�@�@�@�@�@�@�#A;@�@�@�@#GJ^ͣnì,O4@�@'K7,il^zA PF[੧rﭓŽ>Gi}7."C*iT%kY۷ƌS=lzH}Q:u4ak׮%8׊{$R ݻwٳծ];y~ZbQQ`�HLiZqxA =R{.‚VeSK\-W .EHII&2$G�#r ܽ*1!\z>ϯp;XXnM@�@�@�@�@�@�@�V Ȫg � � �  7OG#, i(h.MD�@�B)p…9aA|S:`i..餓W#P~c ;7`2 pN=Ԉ7ԩSgϞ2ZIEܹS]mRRNKKT'Hvf͚zt!hذa駟"Y}eAV(1#7ANbI2 FZIzIPk 233#<Dh`饗*/}$ZjU n78]@�@�@�@�@�@�@�@�*G]"� � � �80Jo!5L.5h u62@�@ :I"/xt ]wIg-=TF{@$1ciW^ы/M6]v-n˖-{G?yu-3fW_g}ڵkw=X9s/Gu}Q-ZHs8:J`ժU֭[RD7d[N[]pݻjI&}ݧ|P_} k+{Zhn$MfjU:Aʸf%$$6 (ۥ`5lP=^v\i۶m}fuzE|vޭ߿?m?wy =Ӫ^?{FK/H`~wNdڧOu<a_uUut)7%\m,y%\֯__sU:utYgiU{N8Qn{viӦEG}T8,0n&ٱ {6w]h[J@  Hw̙33ϸjٲ?|ɾ]O_[}N?E]S Sѣlpjed 8PW\q,�v-?z-=.%Kid2֮]믇u/3G nRSS|߳2ր#@!BG~1SaߕSQc&[1IacqƹQ9$''kG}iӦp_r-f^x=}6f0~LE|%gnpPB*VC�@�@�@�@�@�@�@�JVbW � � � @Z.WHԂ   ]h � U7(-^,u*"=DDdTP4V^CѠ|@@q Z�4!GhY~+7؇YQl2_A>(F׷~Rh^_�YfkQO-LKzw4vX8]I ~bgy(m Z`p >i>p Xi%-Ewq.?'?ׂ!{=Vems}b]v,`ʔ).~ž[O:$rK37 qѝ�lٓO>2[B?x|buXhZG{L`@iiqF?P bC9 }@epy{y>dg <AvZؗZHhʕRar٩@.חߞC=Thaliޝ6_~6jJqהhlx3:FmP{C ;L6l㑭[plVz{U|)lLc/vK0}jǎ9/q,`bV23sBX㘂#@ r!r3&=f*spQc&kQQcL=jXؼy_fc.Š=žz&~OQcuA%kK: � � � � � � � PAV*7;C�@�@�@�p96M&r7\FxCK@�@�hk;K3gEkOhwU ̞=[:uRӦM)߂,X1%T^]ƍSFFN߯~׿G3fsB+h}GlY~뻿>oL4?M )q&Mԭ[7{( &[VTlg}Mc 1o|*թSDž',|(S'IdӡCoѢIkO,H[|M7¦JRi~>?pll-[;~,̴8GOKW[, t?៟{~Y+>SOa],B>kW\aZ!-8ʵ^=-҂æ/{10Ͱ ˰sGE�(Pm^C-4m1x`{ꩧ|(bi]vE_}lb `낕) ,uxȊ{ꥅ jݺu~]-B5j䯁5;wo,Dɂma*o]<F RSݿ\Ί_A)x[t;6f*spQc$,/BiXVl f%Gc^L5k֔}7|dY)jd7uJZ|-)!� � � � � � � @ Ǝ@�@�@�@� pǾoWBR%rAAp @�R]/eely34X?:ȇYE]eZ=z. ,=G 9O}-_jTF ?oٲ, JOV|ȣwV0f5oܯnAiN6.gZz]`)?#GB#7;XpcyK`a! juT�P nܸ1Yu-44(;v O{bV,^}U \@Cعs_7xB{Y.;)e9y6a;.S YC@9n3:TeV,H8(ϻv{-VV^]kJp=?6" ϶u(}h h+hgRSSm[<3z:jԨ]g{ .3N߭>}F;G�pApߥH Cl|.hd4n*lddLRؘi})e˖ޜ!nOm>K3f*wVoqž2XFj׮5y@�@�@�@�@�@�@�\ +כ!� � � @ X J^A;IӧuH={A4@�2E}-E矗<S0( @޽pB}iSކ|:쳵|rwq;v][nÕ6m_KII=׈#~MTbO<6mG}T:tp~A/oAI>Ԧu%1-K;XcyKa%q<#c Ydeffj 7ܠٳg/Pzz :Z$}Erʂ3HV[!u*j*E�8 ypM {RyRRnSPmqה`#j}됝:P`O>τ |`R?4܇<5wUWR#7[/ĞСroH_J0n .hd7n;fK2& d <o?:Cd=ݻ +EJ:+]涿d۶y@�@�@�@�@�@�@�z @�@�@�ȑ;H.C"fA#   � @)@TerҲe3ϔBVGg>Z-Zp$++ۥ~2eF]d[wAK/$ǎߩS"/ԯ_?͛7Ozl٢:K|^U 7(oֵNxRӲ[.ԩ_`̊*%qQF\p.2]}3fLUfMY~Q۵v_,/nA$Wi_駟tw ,mҥRU;"@ lذ!<)V4iH\S,B%{1Ytw߭TW^m,AQckq,|)YfL( � S.Z^*=g(Tl5j)ɘV,˸<c>0ľOiΝze7~@쒄g7f~E {BA�@�@�@�@�@�@�@�B%@dA�@�@�@�whSSKcip!� �aغU: s$˛iLK v x\^R $%%?zgK}EopEw'/T=Giƍz,Ҋ ُ+۶ms Id+B7?|nP]v<m_XRiAĊ,X1;۷nWxwI| M0/n%qܱc ؠW^yE_|>vRmڐNĵk֋/z]Rl,xkʕbA[GݨWc~gZj+qeUz:AecK/7rڴi{<{l~^t xk]HPks=>B?|JY\)jLcc1+]wu͘1C\sM9 �Đn %T߾}%3ي1,�7Z5kLǹh?ydz}QGL; H7X@�@�@�@�@�@�@��A8@�@�@�" ~ݥ7ވ@e!bzCC@�@ |3F2Ez-鮻_6%A?X@I;0o=XI6u,x݂tzՆ7~0e!O=:us=ׯ^X^z%~{>믿&͛m rIB 7oo,,km>P7yg!8OhKE΋3-#<9vXw>zKG֏?o}}c@ȅ w+111wyq/^W,JxW0yH n ~WZ~?6]r%>Cոq4hڶm޽{u-J޺Y#~}vtI],/^,l,4�DB 8_wt.[pP&M ꫯ ג`n+^گo^S ZE{y3s; twg}t)'z^\ؘS^~e. /ԩ{7o<F�@�UKn|!^(Y;#8Dc&1w%X)yL$cLV@֭[ׇh7 B~G-3t\pe^e9 � � � � � � � Pu"{}Wu#U% � �T7߬CaúU4˛p!%3ݜJիNwzwA,r?Kh<yf|эE �%rt-r|rwr[R{ד%'?.^ %d]v\ :tRSSKmEd!C<f͚).u͚5..j_,YPW�;Ç0YYiڴ>M>݇=#. lҤ)@C,HK8M6)==]7A* |Gem,c_Y&Ν;x֭[mر&Lv_fM|W_i.N)Zqk{:uh̘1ޫ}:َb .>h?⚕wXo`3f/0ZP_ 2qΝek׮Aև'^ӳ>+ ?߿o{׮]Z`0/N }Е#ڱl, ?.j>1B]oN~c8~xu?-Z=b↑.2l0mݺk׮T,+g6a%@H香.4hlaٹ`%.]vd:^z_f; X®)l6αmmlwl4C~`׸ ˆl,rg۵ˊ]lS}[ؘwa-d'_N+] *G}(իd9rL_Ԙ)w% i w,El<Rؘľ*ɘ>۸G}:cv keYٳ1\]⾺pc?3K!� � � � � � � �#ǕHe˓|UV*@�@,$7̋ܨ; B#ID\V`D3G.#Wi.,B*mFܝݏr ct,.EsGkݨ7 @A˖In`rarateKY@I,&[bIKZi۹s#[QÆ cD߹7 [4h:$33O^dlY5HcLVoKs�C ˫V^U:ڥmhXpBIKqVOaZ�\wLxݷ֦ 38?.X.e?q5jȅ4rB@-8¼R zHlyfnL$XTӦI*(YԚ�LF\ ^c+PmAKawqQ,JŕiztR?&1 (=6xW7{C�(}-ݍ6lؠL\1ɖ-[wCy .ɘɶ-侷ȹ Pama9 � � � � � � � PIUS� � � �T?h!zAN. XQrԋ� �Ć3H]$'͚%uZ~i#utgHI^:u, ~༻wqUSzu߾ŤYVyԟHl*IYnFQWSN9ů׾}׷v*O<r-z oЂNe`[j*iA!ARR|U( &7{~(kV=USArUXnݪx@_|g_vOJfͪbGBUk|e/wņRBS * zgAOO XPOD9.*8Et~!!![ϼ^<=<;.' dL>fL;'Hk.�n;ٽm? � zHz5iX{^NLy$ ,?ʮ3ٶy=sFq5d #� � � � � � � �赏@�@�@�@�\ 1"כK?$sO6!� �Qؽ[w|LFI%JICJo!Y7~{@/`4H7t}Yt R)Sƿj-ɦ_~EժU K{,4seq9.L*UTYMx}޽{Ӵj*͙3G˖-ӄ "b땬^ZGָq܍*j4PX%%Z8i(J @@wԏ?ʕ $ШQ<"*e � } ٷ<^~V͞=[ׯ'`7>ѣGP7sX @�@�@�@�@�@�@�".@dɩ@�@�@�-Ы4fv\0EkL.WCK;F>jA�@�I`4_hCҧJݺ|ՓFnQ*RbKL|iW_}UO?x5h:쳣 6z^Pex*Yڵk'cuwީ]v?~v-f͚y_Kᦑ_W_};O^ E8OPLN6(!@~ %zn==}z饗N�D�@�p_iX4&YT){mڴ)NZK㪬� � � � � � � �D\pkB@�@�@�@ ]X؊4eJ+`~+ծ-թJ @�q?IB}{iѢ@k`[o@,ի֛ڸq zFւ ^I.K(NRmۦ;wzvPɄ@  1bfϞ~M׼yt}C.}?0WKM6… 5sLSi?IIR~"X�%$oKSKaj@l �"P4dB +R[nR%3 &tW^:rD2w&@�@�@�@�@�@�@�@ =B{@�@�@�@ ŊI^ g͒ 3  � �Fয়|I.<rJhWtȑRjjhʤأG/@ nM:Um۶uak tzoNJ+*\dɰGC~NCanƯDHTTڼy,E-6ON6&8Cw:G4@� \ 'jŁWbiP۷V#2(.VB�@�@�@�@�@�@�@� apC�@�@�@�%͜)Y]wAӘ@�@ ~,'ϖW-}yDZFzЗMU{GsѺu?Q ,PnTJSGֲe�8tf̘G/:-^Əm۶S/%-o˽WqL @H FzHI) @�LHo;p_qjժFm)`c[WmL � � � � � � � @ s!� � � @(.L*TH Ei-!2{@�@ V;Oz)i(髯:uӲnF$&<”z@ڵPiӦi^\ժU(5kL5j5\W^y.QKgB� ۷O]bŊҥ>S]|^(?ӧʔ)c$_6w"Ee@�țytcOr6l&Mŋ筲ݦ}� � � � � � � �Ē@Xj mA�@�@�@�B%Pԩ4et*5:|di2:S+ � m4ii`iSi\yG&Mߖn1Q~ ꪫٖ-_ k֭С9}:3TZ5<"@i 0?ٳpBz�y]wsΪRJϷb?#Pݺ `X@�&m++yg^"[jݰϺKr Hdr9  � � � � � � � @89"� � � @zTg $@ @�(hkHH|#=裾PH84h p4r/\HHJdhIm۽7W\YfyIO0]ڷoBu)mڴQZ #Gl2-X@ӏ?=qiK>7`s=W+W.`B$խ+/K@{N˄� �x-}i>$\էO-Z ̼r Ȳe}a9 � � � � � � � @8!� � � @z[6M-bՆ" @�@�$&iIguE^GM |o5"UQFoܻwΝ~_uZJidv٪U+p67o\*UZ0Ks_n~g-Yě-^<xP%JP˖-oQgy(Ba=,5l-"�yî˰fB�@�p=&t]YIz֭[{7/8qbXrB~ʕ;*� � � � � � � �DM ȨS1 � � �[Nӥ)S7eUhVspkQ> � ;kJJӧKKÇKŋG}կ4rtRi"p"rjn`ڳg,�o9s4~xfWFj֬7n&MϧUB<ƪ}rJ-_ܛWX=.]4gf͚^c.]t}m۶|Ѣ7`kRԮ]k @awNMd^� �[T)פ]}Dž ҰaԧO-ZȻGy~bn qux@�@�@�@�@�@�@��W8DKz@�@�@�@ "zI+F&& ?r./ݞ � pRKgy%nG &LBdJB |˗ZҴ%.^Xl2-\PvVX1խ[W 4Hׯ-*T#aM6i͚5޼j*%Tdol0 /0s=W P-�J*}` ۷~"@$,2555R � vo;GBzݻZn#Fhĉ $@� � � � � � � �Q 2T� � � � ås3wm/߂ ]v }ٔ� �ĒuҭJ_ t4DhaFK#GJ]'Yp (`yu]ݻwԅm۶iʕ^؞W~u+Vmo{]bkZG{ns5g7F>I ٳG6lk\:K%5;ϙ6s=zPÆ ;@*U*ֺ/o֭r;tbL<z4Es@�@�( %}4pǙc w+zX($Sp@�@�@�@�@�@�@�@ -H � � � PڶԑL ș3/x#� @HK^}U<X.K5K:#H͛K "&PjU|f)h޽Zz9shĉڲeJ*YflիWWBBhmT#Gdq޼y6n͛6mSRR{\x@:n�ߡC/l^zޣ-+VX<˂&Ʉ�\ 9+"� @ -+HgP/w6mhΤI2ɫl,}� � � � � � � �Ĥ�A1[h � � �R]A>D(K YKʅgH;.j@�@�!rtmG >\*Y2-ɹƍk|RZPa @rԺukoԧC_~E6lHj*}w^0]2mn~irJ-\rق#+T1zԻ}alܹS;v2o߾]6[1H">O m/pizꩧz\_j$'K8@� %55R  � ' "ORNR&ǺdcaÆ+… <C�@�@�@�@�@�@�@�u c}>@�@�@�ȳA-@"կ"V[Qv@�@�X /],Y9qRVҤIUWEJ ŋz|<x mf|駟C-X05@JWbE/҂!mJ\ly/_{]L\tG{nsRPI h8p }޿ۧ1{zq޳gvޝi>zh]iF:-;(ڣ?̳Zj^;ZgaKbK$tDl>F�pY &[M@�@�!M*]w4{Iz?|iF#JKJL � � � � � � � @L ߕ,1H@�@�@�@ :u >PXniYdǎ]̈́� � EG _5o.#{@ x.QN:Vi*} )ܱc7ڵ+=0s[ǂ -Pr޼ Z.n>< DpD++|Yء&m.VXi6'z],,X1l9>r:>>|8?ZdbZXfٲLpf͚53jC6fg2daÂ_z��Yϑm!� �1*ྊoncߝⱆw ÇW\ xYvA|-ݦ,G�@�@�@�@�@�@�@�*'ՅՀ@�@�@�@ XeISWҟwC�@�#̼�g<S.Mj,omB{bI *T;aSR|.)|XXA۷ϛS1t-hu-@-8޳P@(mUZheقuҥg ȭ@RA5c}^ ݯM&@�@�l,nA:<骫})ٶm[1BvId@"� � � � � � � @ ;& � � � @,;ʕ__^kXTڲE9%= � }ᅲnUZVzyi .ǩU+wo'$ q(0}4pk(뗹G@ ;dK{ @\1Ay#dk@�(�}:`ԲԴN6LW\q,XnZZÔHo � � � � � � � U8.fT� � � �q(p饒]`'x 2)WNj>>K+@�@�@{Hw%u(ժ%-^,sO@#ܹsno77_l׮.Y52    "Qu @APԂs� �N|!ݻK۷۶CM۶m5bĈc yPT) °@�@�@�@�@�@�@�bB Ș 4@�@�@�-`]HSДoAdL � @< |Ԭ{oH.խ=v$'Z&LɓM-wիG {ODK  � }aN.Q[ɚ?<"P,@�@�@�@�@�@�@�@�bB Ș 4@�@�@�"!`|t`$j[3fH; F�@�!aԻtK˖I7G̑"P:dHI vZ,˼@ oII4[9l�d'P5 a9 � YZ5OK߳gO~1bD xIT) 3@�@�@�@�@�@�@�bJ Ș4@�@�@�)அѾ}ԩ%eE<[wIJ@�@�H X/K͛پJz JH"ruu u&=D& R҄ Rb4yPU? եeC_6%"�&`AX � �+Ь駒L#G|[6LSL-WgVN@�@�@�@�@�@�@�@ D@�@�@�@ 4VK\��@�IDAT*o/w1Lh W)nR᪃r@�@�P ,\({?Iw--Z$ubV6-6G/))ҠAJV~K',5l{E ,H @�@ xΒ>٧t O׈#/Y @�@�@�@�@�@�@�@�X 2A�@�@�@� %}jTAv(L � @, X8�N?$=Td,:tmK |ЕII YG8a(M,%$d^W Z$AЖIi @F;f\s@�@�`?_:UNiFS4o޼`(pXMfń� � � � � � � �ĚoL � � � @[ڼY3'v<cԹs춏!� �&-Vf?)-}Բey1ɂL : 4ںdԯ_ʧ$^ 9Yj0yȫ�Ѽ � @8iLi*鬳lCڵӈ# &H&2 F�@�@�@�@�@�@�@� U~*G�@�@�@�H X8QHL}KJ[ � @t֮z,`S'irۥNfpGgP+QU[&LɓS@ JkH ^hħ>:$8 '+ٱf~iviVߍ{~Eڵ+>H@�@�H ߼A:F܍{h޼ynJW7x&@�@�@�@�@�@�@�@  %yh � � �DRW rv")B] � @KFI͛K+WJ_ hV-m>*}4gN~)C ))ҠA^ n--Y":)2 [' 3/ p/$(!*%)#//I'JUJST/da;@�@ M3M}ws=TJ{=舂ƐcoviS � � � � � � � q #NN � � � m \`_Av(-z;F�@�'0sԶ4]G<t`ԥKk5_ttYғOZh#`cV |!'Kh�HJנAd6ȿ^+*s޽s^5@�@� X1@COgVv[g}D$?  � � � � � � � A^M � � � V Z\Y2%4믥 /l� �E`V曥Nu%KKuq]#H} Ɍx"," $u*n;FP XdŊR*x�IBw"E/޻b'x@�@ ;brrw]u*]}%)-[oyƍ@�@�@�@�@�@�@�b_ G@�@�@�B,`w{AK۷K]S � A!i <MM^zIjT=q'RzVf'`mHO> +0}Ԫ4a(M,YXDO 9Yj zS3Oo;oA � @ժһ֗_Jksի:siڵ@�@�@�@�@�@�@�S o@�@�@�(ЫwҶmy,(O*:[PB�@�8P{/VjNzA;eˤ>}?,M3@ @J4hԵod O}x@4 F�(лTx=+ZT3y@�@ x݀wn~)2ۚv#1^? � � � � � � � ~ � � � Kn|q.7 _} B)T(P4 �h#ޒ YdZ1͛% 5EJ>N,`KO?}x,0}/q)1Q<YJH("HN462e|xTteRrǿk@�@�oEZR7N7Oj^:lixiϞ-9>#2>F�@�@�@�@�@�@�@ Y2}D�@�@�@�,vJSdy+* F袨TO � P�,tG}GJsB!7Ii i$|%] ~[Z:ESq/"  oJZD/EWmA n%{?_k@�@�PXnc784;ե}Wڽ;5voeKl!� � � � � � � @ sz� � � �K i| /h �Q`,Vt}KCHw--]*]yeƵx[뮓ԑy&[>W{OYoqD'K xش Ai7-`7R%kwϺ% � �y4zct Rժ%zcƍ}X<ZC@�@�@�@�@�@�@�@�cA � � �0=|aԩRRݺn #� @~HN.\:z4sҤ;5ŋ#ҥ3ë - | _r=[ RRA]WԩSYt0!@L $%eO0!�(RN_رܹgO!Dx� �_bE[n^]VMzECrew{Li)5zTFHᮋ@�@�@�@�@�@�@�@�-E�@�@�@�|% u4eJeA]v@�_hZAT믥(;}O?\H0J`tU+i]_W}4 P5 Z/DJÇvtu^ @�@ *IIo-maOKwtN{wB-(}=Ҙ1ׯfC25kFd+ډ� � � � � � � @Aಾ+ � � �dKHYVӂݻ$2L� @=u$ X9t}'zr+P?!mݚۭYA]֭%K;ǫJ*.<0!@ $%IK liĹ@vRÆ:Qt^ @�@ -ZHw)ʕҎҴiСR:i?tᅾv>״% |-oks^: ȟdԅ� � � � � � � �,P4UX@�@�@�ȿCwI;FvLZԥKtV@�ȟJ/W_.=ڼmIO>)3nzķҀ'&JX'MobŊwi=\ 99s@[>.C�( عc*[*Y2J Z@�@�*U:wWXP#W˗K_~)_/Ml*RDQC:4n]^= &^fnFв^@�@�@�@�@�@�@� cfW@�@�@�@fRFҔ) :UjVR%ԉ� �Q`H7}a'_ 'i]x{vJZ!]4̈́@~HI#)+%$zK]fn}@HJo:GG@ f,(zP_s.fEC@�@�r!PdyeQifiݺcjHkJ| ܷϷ]R&RӦRRKje-7Kڵl6mS<G�@�@�@�@�@�@�@�B!@d()@�@�@�ZW/_sE. KNԊ� @l i :x`G[v!o>|pc穩:R?_[]v媛 .B ).UubTxqc%Kzs%2=rIݕ^[9M#=hֵ\ϒu ۳]Xk׶iCdV-Ni(饗aV[#ӧKJvI;eƍs9G͛7ϸ ҭ`h\R=XY2m<8βT1V*#{w_[GX\?:~ec,ec+ke|nm|qee1!� �NƩfMl?,nFb|kLķvr'I:I\;UnhO?I_{ο � � � � � � � @ԏ� � � �Q[zyiRY6_e|@@�}޽[;wf{goYG{w^of[XI0$C Oؘ1tGk 1(`2cH^i3Kʔ)rʩlٲ攔6]QEle5h9:t(QLapH;׻70!C1c|cJ g&O_~9B�W_k14�q.col8+1?sµq)Xx)fؘqyݺӴ}KL?(3Sf|a@n4Ʋ1W役B Y+VJ*y0!� �,Pdg^)AK? }r習Cv.uRyNT4oAx � � � � � � �DF 8S  � � �İ9HUJSD>rTc!�h ضmn۷oׯ.)G #(A,@#cx?helaJڣ@D-;VH hOnC^6m*9s8*\x QCV4/w|JtiXRreURErJjժfGÔ; W_, 0}4`\(Wo,o߾W`)Č@R) LhVJ6v1֖-[+k mlvd68β6uceSeoecWh\wΝxL qq*xf68Ʋ׶/&oj`?Ʋ@+wXh @�@'ྲVNܭܽ.>XHrXK.5m;6� � � � � � � �S pR6 � � �ą]ܣ/l-B"[/!� `A"6lЦM2͛7o^-x$c?@ha!5kTV2^d XLbL,LwBM,?HG5k҃>wWh$$$x3?תUKϙ|.cS wKŋ#@ |$ "#)+wȾ?\sPZ� ,,թ ħ/ڸq7c. }q[HaJyݺuevnX܂-1\a6\9ԥf.nD`>6zPΌc@c-cټ|r}ws{hzWe|1q_ڞ@�@` si~XZwS7ސ^zIM<Xd g !E�@�@�@�@�@�@�@� 2C�@�@�@� XK.A&nW_B].!�l [뮈֭B-?:H"Zg 6Tǎ,޷G @ .GBel}JoߞVG͊+ IMMM/@Ȍs,ui϶NA_ze_n~7ӥBe}wΝ;W+rybB )IWOrL @u-?Ʋק=;w8Yx[lVu{,]b2b.9:mdVj㬅 /Y.ln?O6:SX6^gB�@�zY<"Y('H/(u*]tSҙgޖ O @�@�@�@�@�@�@��WjFyP= � � �Ć~',)}Qy,waJl( @�x8z,qժUsr^Y&S�II !l]qW:Zh?8f͚^c…3B4b5HϤlܸ ñ -xgϞf 2u~ޣ=~^ϤgيЏ0ՄH %E2D3F�c ?~4is=7D-ANaʎ_UIÐqns;OqZ(߅^>bL/`67n޽{wc.۾رcGvoq?"p4' �  Iݻ3:tNz%Z`R3,R@�@�@�@�@�@�@��A>@�@�@�IR/>0rAS]+'L �عs~g-[L+V+Wz$6  ӫW>lwukcj2B*`a8ve[EZXZzj/hg{ۖ(QB 6TF Iiڴ7oJ*e[~,1xrҵrKi\v~wgokС'Z@ \8O)q.]˗Wls[ x1u{c{΄@*T 5kmU[kڵY߻t#;S $9,cYm3!� �(pҬY$+WgY Yg  � � � � � � � iWrũ@�@�@�bVW/鮻L7ӂ t_5 �Ķ޽{hѢm޲ep {{=C,|޿|g[giiiڼyƓ=Z0g}ѣGi?VbZR֭ղeK+W.KZꪫg!2 m ,`c!C1c=c^hIdD7tSY�1(~olMB$9<.\P6XVRjjxiyxgy r /VIfDVlٲG={(٥c LomR}oѢ7Ʋq֩H!� �1)`au,=o|{;,1ԩ4eJ%<G�@�@�@�@�@�@�@�'@d@�@�@�bL{wۤ/"sעk _Pxkt@�Xs꧟~ h͚5B,-f ()LrpJb 4Q7_pJ?z֮]e˖yҥKObb,Ķ{ڴivys]p].2tr%JE ӧKJvI#~r_q W".r[u\^īBB"o>͟?;?=ŃhѢ^أs,PX7Vɒ%CR? =nbӯ}V%K_ֆ U+WBڶ6β1V&M~xH^#� @Sd7tYd2"G)Q1 � � � � � � � �J , � � �HZ5쳥)S9gwtE'j!�Ļo.U~w={jӦM^h]FԶm[\Nx2G ,Z^=oK3ձn:-Zț͛7|SÆ U-XCluY:3UlLGw} HSWp))Ґ!Ҙ1RϞر'w1ի5ݥI~UZ u$_4zSh�9 l|cYWZ ֭[h]s,(UTQǎ9cwDŋ{c, V5k;7L2XSO͸9@�@� \ve|qג7/tQo* @�@�@�@�@�@�@�@�.@d � � � YW/$wM^(_}TԸq(K,@�h lٲE|7Ϝ9 M@ ztC\g6mD5.Nԏ@(,@/<X a]`~G/u:t,PBW/\z"Ă.P.$VݻD_n %$$K.n#@ $' \`}_lvgvݧOoծ];լY3@ŊDZ5w\oe}=ZTZռys!h E � �'-20HK_Sی{i<i\6D�@�@�@�@�@�@�@� 2J B�@�@�@� гd<}'wjzdA䢄ϗ@�H ݻW]z֗_~Sjҥ*]:,u]O?RJj (=sN/Dh֬Y^Ӿ}ԬY3]tEչsg+WοIXv F&N K@))Ϙ1Ǝ q z,+ZohQĨ@R\TD6f( 9;%ݑ#GԢE ~ǜ{_~rD[k<|7z9|ϟlkӦM:S\N;-ͧ~@�(.Z.ݯ/ e{7AVE � � � � � � � S\}S � � � @67>0|A۷K?$=H{K �'#b }GߪXb^ !tA a@K\6YЏ?iӦ믿!-Ȥcǎ^k=y;1 4xtʕRFa"Bk@i.)1Q/rXswe 4`m%daXjm)hkqԪU+uu w.U&)>3{k۪U񕍳{1vm޸Wv oS � *TBn|n8r߀|@@�@�@�@�@�@�@�@ f lh � � � %=.<_vI"MW %#�R`^ASܤI?^ڵӧ~ꅔ|z衇tghJxB >bYg3mmg>^bǀPN}HK?R) RRA|%KBi7 jDip;$Ai (0ݝRꢋ.Rjt=PBz饗e-X@/z/,0?t4w[oUo6n荥, r޼y֭y[3!� �\)S[o:t, 3!� � � � � � � �Q 2T� � � �(У|bExZgwT\xʧT@�X.EjӦ+YxArr Z/^hICS! @TJ(}mqg>v hٲwLcC^/t< _rAGy-^`tuki)1Q<YJH~i^Dh5C�p԰a 6&;CiĉUF =SRk}^p Zj;B w*|q̘1ڷoCt]wiܹ~#� @jז rA~B�@�@�@�@�@�@�@�l � � � Pp,reI_|!u)@ 43fЕW^ZjD|Znf͚_ME�1-`ugߎ vlc+2T4zt^Ja[HI vZ ; n`ײߙ%KUW]&�1 paԠA 4&[;<xj֬;Cӷ~իWr竰%e3!@(twնm]ׯ9k:p@6s � ] . {wim#� � � � � � � @QO@�@�@�@ @"eI~<.?_ڲE< �!HsI'N駟~\+kZ`|Az!@ `;&رvh׮wcHn'YH [&L 3&OB_۸q`ҥKpJD� >=*5l*(� ,q%3f6nܨ_~YguV `}u7xNJ#Gv1bv  � w wd9ujXP@�@�@�@�@�@�@�@ ( bb%@�@�@�(h={JfI;v}&U.ir) @>s/�oוW^kj߾ʖ o` ++d cIn;Ə햬@0:hԵԪ䲸ԯ_۝sq/OfsA�( $%*w9}LL`ݺuwN?p駟4m4/Xb!@ TVM=VZ)S^z5j:?:I/@�@ fE~&weuȝ{Lh � � � � � � �@ N � � � @n]Y Br"�yضm^}Uu]?| a ~֭/"\͛  ݻ֮]G}T*Uyc;y}駃k޼y>P.вX<8Y~Sbb暐|fΜK.DG+a;رo߾cKS*-H/(!R҄ rAid)!!Nvq-[C޴4U_~ym @re˞|/|]~2՝<j޼<pz] K$fɎZǁ@Tg=⋽񕍻<"²^uU^xxoIt;iƌմiӘ 1;h  @Z|PںUrr7GrB�@�@�@�@�@�@�@�2 � � � _|ysg飏Kwr,J@� mڱcMO>D)))nV^cJm۶ݻl2 >\eʔTԓVwYW v@KjZσ,< X|ڵkWXlnAyLA;c;رĎ)vlcL}I݂^~$l(%-Y"xg߾}zw5p,e<V؛0-`Ey;b!d6LݤX*_ޥrKa[K/k&iʔ)jܸqy|tdX-`ex,hy_u_R{5j.\药n^-Yĝ^wu^ۆ S^;׬Y7xC˗/?B <\8vM@�R̉Z3@�@�@�@�@�@�@� �A#� � � @=zH}&>:y,]τ�DD,̦&M;? ?i;CK/T;ڵkG^* ^]v馛 ) i@ry9lA ^x~3Pf͚[մi̛~֯_̪QYǎ%vLccXԠts6 R疘(M,%$d~yt/5c+ssXN+WzA… p{S~ ̟6n|(W +Y\Žp] c-c:,7?Te%[ 4 O>ڴi۷Fw8YŊӌ31[N$ֳc@Μ9SnƸ3ݿ=nsh. @~C>T@�@�@�@�@�@�@�d=E;@�@�@�@ gEB%۷N9%4Q  p"kt|nNTv8ޫSN8RYpq ~L1)?ȢEfY5в`>>GVСC5m4ek^ow%>}^!F1Ŏ-vcsx@НwS'i kWU+i_oٳd:Vs\ˏTbE({׾}tȑ{;hE]$ 裏TRxlM,!}q11Q,Tdɒ}֫W/]r%- sYgt|~=D0t//p.=E�wʔ~;{B@�@�@�@�@�@�@�@ ^^ = � � � @֕Z]r@y/@�={|M-[Lk.ڿk<duE[nɓqFq>s6mڤn ,˸mg-[@B ^@mk!g_5zh-^XÇs=GXbtgh̙^JO< ;꫽J[o% ۼׯ_^{MUlYvizӛm6oU\9?= }߿_7t?fqF>o<Y_T׬YݻkȐ!^5>to]=,Mv?g lUz)%$$xωEn3h֬Yϐs"\Gmz /(11Q_~}Qn[?8`u͝;W&M>C]v|rr- _}1aY?4ko/5 δF >⋺K\^j* 6ٸ{RTĶ xǜ$1D5Qǎ_"ut5y. GHw{"�i 7^�~X'|2S{+w:iRgmo:t[}xfBvbI׿PO>;8qb>;W*D 5Uڶjݺu_cf>/X0V'QgBu`X;wq+ԡCwWm չDg+Xַ@ ' t5w}7ϩ-6fW1}7b68lLl./l""7ļF0&*&1- _Ѹ"j&h\PAAE7EAAY;3tOj9>ﶰ?^1Ʋ>[ 9x`@ƍUIwk[YnĈYZyyqkz4a5l09ys{NXמW6%/5ϫ~8 �$Pܿ/=K:T=uE�@�@�@�@�@�@�@�2!3m¦f lfB�@�(;=}e_fB�,7 ƽ8@ -.Z.zS/Ο_(xc}&Y 8qb6{,p! 9]xƍ׹`Μ9{:t)կ~Ԯ];pA{{wo1ׯG \GСC`Ν\˰z#pa}xp]wer ܗʷvaAfff .]mnᆬmpI߅=uz̅.P24iRB]8e6qX'ͺٛb0zhl\اoO<DgϞ+*T> \7رc'0@9w.=�Ve˖־NW:͜9>lX{=:r `\.#p~x0rOWSK. ;8_t9p5owԫWϗ̮'6-=ٵ[n.N7ߎb9;)'5ǮL2ǁ{Ƴ5ۤG3g6Hx ra Z "VM~-E\Pmt|= +_a9.:p!<[\(AזޏJad.sYfꆯl۠J* /h.-[n`u~I'� 1΅Fڵ \Z`}Zj=ȾLJ?s]<!X1mٲ>1p`ž~m[{Z?%g(^z_g_7Ɗ5΍9kLSO)R*tˍ~Xb=mA=#{OyzNgl vʹ UH ׼>q� &eO>9mx@�@�@�@�@�@�@�(.78KJB�@�E d9#yA&.74sO? ��@�IDAT4.ˈ)IbiM 9 �йܯ6mr-ܒY`_߿_C,Ek/ud^_|oo-/z\y*j+u<`O0!kaÆe-1"3fLwyo߸qu,Pyʯa6} ,$& x焅=Z8M79x'}sm,,2,L 2s.9X°JHںEn={Na qN )##ßB&vXj,օxuLi-ʶI ر6 +ٮwiͳk]{2n]k<[M: Z`o.*Ix i{rEb]+ޒ[_$|~zXM|=-Aق{_al^@ Z35j<HcN[BU�QYb2Oy[oUge?` N:h۶mx׿~}&~~"XXyb]CbXy.?[fMVgq Z>k|G/9Ax-X rodީ0X?RuvˍXb= HQpC=49p^Ր,7A @�v NL � � � � � � � @ w @�@�@�@ c4^~9 \=c4hTB; ݻBٲm?֗+W.}ӹsg/xؖmZnuar!r_Һ]ڴi#q!o3vV ȑ#_7X]mzꩧBo>p&`4@e[hѢ\\pܗϵyf=~~ASLѿ]ve~5jPxlНnͨ^oM׮]smɒ%ͅsGz4i$ jժ~cǎY8p,V﹈X.AM6%\(_ Om^Xs]xnwυ㏳%baԩu waY;6*Sxmprj֬ { g -l`嫯i˖wc4̔Ǝۀ.F*yTZ5mܸQ_|DHkeXܮ񾷄כ}_nU 鿓 ӯ<y.nRH<}Y@ 22ڵ֭}_Ú;O.&`iV:J/\ M؏keljʕ5*j;xei׹vp>\ȵL",o߾~,e؇&6$jN]߲?zu-X$%nݺ69pnx0@�H1z.飏RT@�@�@�@�@�@�@�R^} @�@�@�@ 7 9Tiڴܶe͛'7-C r 7=}<ܨbŊ~1 +[bt\pyٲep)1^{6<-,ѦG}q:uV~/[anSF]v~?>lM7ݔUEc>ԻwoY@bhv>U֭[mۦʕ+n9oСC5X3 E9Dz@-.?F?V\9_qb!ֺpe˖>$G"'{=òsm}D,I1,‚Xn6?ϋ/U?ωva 뀖gٸokSK3s.]䂑%c('K!YX߱A\+vS�nz+>(BqfXa%7Awn}xJzM`*@uױ5֗OcЄۈ[Y/~ }:3gt=Ʋ;0y:e?B[1}&Xeye9MnYofrg,h~X:dzɊZ߮79)c\f ?O/s"Q}ܮk0l@�K}~,Em@�@�@�@�@�@�@�@ Y1-D�@�@�@�" ~;r!U+7\. R %og[ݴiSaÆU^>sp=z�B yK\J|R<Ki|._.Hgϖ& t9ܹS6mʹ:ȑ#UfM*2j{^UN,4-K.Uvn\D?~P,zZp^r>V 4{(ʱJs_ v]rzꩬyڵJ<f=X5wpե_Jz/!nT 3S;V8PUZT5t1kO3&2"\+ p xoG ~GdZ}g_z}؃z?.j_頃Rlm _1x}KC׫WO6V[ddiW9<=Ʋs=W3fRkǔ<2ssPNn:Y&[86H; k׮x}H?e-qa$U+sf&^J'"� ~Fd\Pl� � � � � � � �  2� � � �eQ``BW :qyԬYg/@ 25-\;meu 7 ,ûyZ�@Z5nXgqfΜ&O=<IRa0SM6Qy-Z( ۳0$.끨U^M<9Y̫yrܹjѢtC,dZ,+SQEt=7Ⱥu]ܖ֛֔qX7gаarۤP{:Ps٩bŊ ɞOfPA-`#z>3K-^/'صƮ9v)t啑�$Ϲ,HضO˽oImP^ZxYge/ϵ2� Cnٲn=bVt)My'yX^w իW+|}Lj/^ek;t?޽{qW\q6nHևkyu\=C O>d?vl1dcYc]CbmcM&Yg}k S~}1۳ǘ9βYO&MdG2N>ugܠAJժUs'yNIܮZ6r� @2 XFڒ%\K� � � � � � � �eM ȲvFi � � �$\fM_?iڴrH@�  FN3\lޯ o_`& CꫯcݱK/T5݅Ͼ?%N4I_~.~7k�C=ԇ0aa蒕_|`g}uXa^>}d ƍtom۷?ps1N!cƌGpG [ۣ={vWY(M4aIxz|m_XMсk֬lo﹈X΋z|駾=V �5kV~z믿˛7os]:om㜯X#sBJ{1}gO/`'xB;v+&eWMK.ćs9df *pX( ya;iלN.[=پX~رR׮ҥҨQ:UVͿN"957}񾷄גX}gXB(-O8ժUK#G u[H<}Y@ ,#ܺmJ[/[k:$~$jvmG}O?X|Bxe!zj k*?1Ѧgy}z^ 2e$L<J?s]omݷ)5$ֺR^&&-L'/_\]w,/xrq_z)?|衇tmݧyyBo<Ѐt!~|l%{~ާRE< zNֶ~9a%/5~(Y@�Hf=sr>̵n � � � � � � � Pܗo65kvN`3 � @x9:hi-A n`\s{q0!@Z {ozh[fYy/}%/`}0! _ \bPjࢋ. \QB,FU={]v۷h"ptA۶mիӟm2º֎ײe/*Uk.u+2p!Y\H\ЩSd_ \XErr.1;vlp)5a \ZsA v * 6lPƳKl_?͛{7ԫW//fO>àUV l[n T~vf|q7s\{ =upQJ\|oW}|A|r-AuV^<#P:{?7]0?zJW Q~ׁUV.^+;|Zda]PEХK_=y䑠gϞ'.?^B\ IB-qm{Nqsnh;+goA;e9 *v-k][Sɽl];7R 9{AݺAقz˿ g_$r޼yq]{zo/a>ie g \uxߺg?۵cרޏs+e+;$ ,Y_ɯa'g^ 4m4pT؇u?lxsĈѣCmojku}"}g'j??qϛykcXy\}РA{s7k_sls>cXc,+?87Z>~O^+4٘ZCihq^ϓ~9џcgߴQٖ qs{NǵۢfU:$b9NDY� @l� � � � � � � �]cgB|s )B@�@�J_s]7/qo5@.E.Iw}NQbH!ի6mٳCIeTre ˻sk9b_uǺ[Ņ=ʅ&T S 8 rbAŽBd}o>c\P\aC.\PϺۂۅVȅmhcedds܊u ux �=]ve,k 8<%|9)"  gwamJ6ב=yYn]_N;MӧO \-ʅt{u$.P.ҟkgiD0eff;󩧞_5*LQOUKzlSFHK'JÇK&=.F-s~נʂ-9^hW>7~l_xxMk\w[k]\?4%s6뮻t뭷ꤓNۗzwޭC9D.d}>W9۸415ƹ.P2=9g=D$xbr+ȹI�yV<^l~O}z8OSsYJ12%:uЀOъRw<Or> Ҁ u Puv<� @"^}Ur6Mdɔ� � � � � � � �{5k@�@�@�@�\:uM+X˃ҠA@F[�~ޒd!u"s<j Na@ڶVo ):ԨQCݻw=gΜ·UW]c�”Y}mnjc9cQbEtmBs\DZn6Er>ayuٶ}xڰu֬`}m}~ׁ}s.Sdzp*lda3n;ݸ{լY3?ѐ!CVk:KZRj.aRP ̝+#m&M,o,9na6w Z){Kc`<!VxޏWʳ<@ w,5n,\MvVۯ`w]Ph{(:uYg}_ҥKXMM4ɳ9)c9綟/h8Q36oެCUe~;92 Ai?ֺX&S;jN{s0Sa\آ '˲q۸OKY5n`~F,z<9_[J/5˯<� @i B կJ@�@�@�@�@�@�@�I o} mE�@�@�@�b &t]1j.ilc<*@^[~~06x` >l­,.G^z˖-ׯ/ soz;vUVD>lնscAJ9x`iӦ9wv?) RZ _?P=~iu/[$r>\.Wr9.p2%SVdfʅH'Jv'M\FqRO>2]-HS%%:vE r)ۂg1 K|MRD^+ ꩧt�=zNc#Fd 2_<Gl}` Go{6ŵA~&S Vܷo_ULT;K˵/lXw=þi?qWazSҳYih @X'GO�A)rҨ& � � � � � � �).P.pSмz.QER � @) X̹^c)7#� t$4@�T7O_ZRj6O.F&YVWo+`Ϲ^')<59l\ֆ $0]uk/#8B^x.|t8v1c^˗;<q:Gql k̘1>F,fܸq袋tI ׿'|R}ꪫԯ_b@pnTvKX`\ihivQJ<qw}{nW^y;2!/#Mw-)w^߹ڵk]z|xe~wZ3*V"ι)_J{nK~eSN�H6؏|$dlcQ[oߢcy}")@0nآ+n”> � � � � � � � @AoŖ � @Z F#@d>@<@pNj@:^~…o/KKPo-6mڤɓ'~5b?n:, I9zM2\4G-o۶-۱-"Y+U;y ^څcM |0_I6l羉zfͤo6QRNi dfJK'JÇK&I.Ø (q=#?v񗿔9` >X4cG˗/QX%]qn ĕ28ݯ'8W^QʕuK&ҏ>o>XK֛!�$`?hɺj z@�@�@�@�@�@�@�@�(A]-L@�@�@�@*VN9E˪ж6,m @ ,w.]O>Dԣ>6m#͚5KfR Zc\ D[&2d^׽ny{/^_ 챒 451c,)Εt~Z.hX:>ȐڶM6Pз>mذA_gYXFғO>oDD uMؒr'L/.uNRujժƍDdRR)@�(M> /)@�@�@�@�@�@�@�& @�@�@�@�`G H0On}v-AH5Ν;[oU^~eM6M{,aq PϞ=U҃@ dŅ jΜ9={ϟ{Nѣu駫}ކ+HSHSա̔Ə&N&M"�� زEھ RT!,;͘1Ïƍm۶k׮'x/aJX`Yc,kY諍l|uM7Ip � P`!C3*� � � � � � � �Ho@�@�@�@ \f^]:5\669&mx@ 5,෿psu kɺUZ5[}-שS'5K(C0{G };wSN4h,tYfR#IdR*"\h$pͽMhԨvc#@X22"ŷiSpȑ#~}~e㬉.I<Ȭ1n:G?c-X~mhA?acVZO(@�(&֯6-P, � � � � � � � i� � � �@^=c-4\Φ �)'`q~6m[o7|S\*߮m۶.K={TnTFk/F UvءO>D .￯>@.|ҥ/6$J0@.I:$,rU IFA�C`*R%E@ ZB ~dcnAwֻロ5z'e}= 1V8CM4.eHXc, ܳg5kV7tN<Dqsq>O ?E!� @ .*W̑.@�@�@�@�@�@�@�@ LMc@�@�@�@ *=lt58e �ʝ}~z[@Yp{ァ;C6latٽ{wuQڵ:wxHIM]C`ڵZd/^EHV\j7n샄.b} JҽJgrSΕFo&OF}[A�JCe#U+1!rΐ6YҥKY/&L;찬1C.%0!@۶mc,gY~vڥի1,\kU޽}d܅! � U},|A  � � � � � � ��A)|: � � �aҍ7J}$}u1C.K:c  @z X܀|ƍG~~G_кZj#%:uRǎܲeK-&pYF˗/e|0�}*W j% }3Gv5jTfJ2;%9˔ĉҤIr$(UB�XJrL@`jA6_z饾 ;wau6Ʋ̙3u=hϞ=XPHcB&Hg-le+?[γԭ[׿+ҏ,\}̈́� �qˢ2H� � � � � � � �.@d*� � � �&нԤ+ ON<QrY^L �$`t\?O?͚?3Kڴiߤjժj׮,Kemʳ<&R] YPjFFV\g[]|#8‡=^tEҥk֬y "!=$|s`)̝+-m.M,U  @սƹ1!ժU簺ŋfc=SZz,H<[+*U U.8ze+Vз~Vzu#6;vlVjӦMST@�(@~҄ ݢH/ � � � � � � �%@d^:<� � � �"p꩒>tS 5co=@� X]%˗/!&gg_DZPI֭UQjѢwn[e˖jРAqRof]V_~ ?[ T6mSN9Eƍ &SN)}!ү~%M$]TrՅ#$ 8Q><r~\>/ yI]E*@*V-*Q6Zl³@>D˦˫Yf~u+1YL$;X6 Xvk-[jH4o܇vUg}:t_'&lR@�H&57ߔFLQ@�@�@�@�@�@�@�(Kt6i  � � �acI.lt ,K:ֱ� @a,O>~.>au9G\RCsPff#U Y懸8 uL,pI&:|IN, P@{Nn޼Y_֯_upBIl޽{wV 1=3|Ў?Z=_-)eIҳJ?yǸWsJcH۶I'KF|8" PP޳ '#P6,pK.~٢oև[x^8[o`dTGYՂ1V8KEؾ}{cʏnݚujժ1ձ .쾍$@�@�p]+u&.A � � � � � � �F ¨ � � �AREʌCxMڵi� @\. |)VZ*U9Fji@k֬D,pҷsάUPAZXIƍe6[@d[x_E{d*퓅|㒯-1z޸qlްa`�  G{rZlI,4ze0 t:,A}[ 3S?^8Q>\4I><�$@FF&m&K#`c{}Pol!nmec+ -[dۯvYpհaC2 lE@_62}gK[˛6m6ƲVty1=@�@�'ವ}dJ$@�@�@�@�@�@�@�@ �=@�@�@�@ .5OOc 6B�@ _ᅬ?ΞmҧJK=zH.}Է\^΢SN~HxA&.sp AiARAʕ+C=ԫWO6[X֭[WvRNl}7b,х]vi\ynݺՇX装l˶Osok,BOt" #-ĞL#0nԧO Ed0ѣ^ҨQ%{|�U`ժHËZ#^r ȯ:kۘkҥ>�Ђ-X2z UlcUxX5kcX.~{{7`cp9[~s�v!Cdc5iďL � �%&`>\@t!%vX� � � � � � � �i$@dl� � � �[o*TR ҽ&8� >{0Jo?@:p@.B:$i„H(t9ϲ,‚J6o0,0ւN>u)abD +UV֭p }Pb(y֥UTɺ {ɷ֖-qΝ1;v~F7 q oszy4c.* oP RJ[|0,S)/M( .M$SrH @\޷5C%DA�P'mڴs.֭ld6βU* },lf9'*zenXݯDllX᭍R9xA6gcٺLٳ9z\lcp|eO,1ڏ&o^ǻN|8pevN@�@�S>Gi"㒳 @�@�@�@�@�@�@�R[ >@�@�@�JQ`PkwߕObu$š@�RHB?H5+8\\pH$g (FY_&Mo-YaZbaMrlh!hLRre iV6z(+po!'VN`-fk~ m} l}[nmncgjX uͦMf ޴0ĖS9%M:7N/7NN[ΕFI'KFN=8* UmQe @alQn]?w)bl+Smذ1,0L61H8yk6zecu+S𾍹lX9op1 9Ʋha9VafڵYÄ� � Pvj\> ȲsVi  � � � � � � �%@drj� � � �)$СԺ+ iӤB �%.rk9smۤF"< lٲīZ`8XԂ-!mÀe[s9 g CDGaڕ[Xd0�% G CS~\JZJ\jUZ80!pҵJ?,|3%r4~4q4|4iRz]\ǣ\@$22, g@qX(͛7/r6n YcUrs|eT8+ S*筍-f> ^* m*zS* Y6_bB�@�@ 7ݥ?Q#� � � � � � � �E͏@�@�@�@ ^}UiHHL|@�~+͞-z$�rZV-_H۠AґG؉Y|Xzu?gd4p6H09H14GK۷K'KFA((USN)sHH*0,K{C:Ү G�@�@` 7A�@�@�@�@�@�@�@�!P>P � � � *}sҞ=gB�Ho{?뮓z;, gKo-m"tU@#Px.\KeرR׮ҥ@HU맮['i- PZV.-M � �eAਣ"WZC@�@�@�@�@�@�@�@ *&[ � � � JHUH=&%5lJ �XD9Szu7]OnIZu4A�MΒD=ΕFo&O5Q�#ҁR۶S'j�Xo� � @r tAȕ+N @�@�@�@�@�@�@�RW|V#� � � �/Pԯ_j� P2[H> 06"KkK/Y#X!=t@Y(ر~_L,v.%2�#K6S'j�X8 � � :HI˖%g � � � � � � �@Ԯ>G�@�@�@�J_S'iLiذү 5@�(}ދ\횿pTұJ]& "}td]ԀR@�Z?q_`\ii6id c He lPQ#[A@ XžNS � �0dV� � � � � � � �(ྦʄ� � � � P;#{}QJa_@�d+GL__:HHQGI/ m"t1l .cJ>+}m81̔n@KiRB #K) VIm&s Aڴzu䖿 � �$@ǎҲeV+� � � � � � � �eA Ȳpi � � �z4cFV#�Q`^ih!]}{tҊ_H&I#FHj�$@`(ZHpmK"΍\~:;uԨQZ4F"@ ddHmڤ9G�h2 A&ݩB � �AZ@�@�@�@�@�@�@�@ A&ޔ@�@�@�@ ,Da2i�WӨ4(#_} O;,^=i@饗A3[ӥqHi) HHei oLf4vlZߵtdAL @Z%m. **I͛KA � @ ~xү@�@�@�@�@�@�@�[ |@�@�@�(/(խ+K68@ Ε~{KE ꫥ{?9<|׿JKU|i�KlkAdd+\޷vOK'KSJ G�/ڴIvZH ֭ L!��@�IDAT3E-@�@�hJڼYڹ3=O@�@�@�@�@�@�@�@*_є� � � �} 9Ti reiL췛"�$7ҫJӧG۷K:HCF#1'uE�,ˮi w"Ym:OĉҤI@#kF#ڶMgڎ�*@d� � `qX82@�@�@�@�@�@�@�@�DE@�@�@�@�زE?_JzuoHAit d,M |}4oU6L4&@_/zҼyRrU YmNsJGG &OFJW ڍ�H<@ ,rΜduB�@�@@j2`?@$@�@�@�@�@�@�@�H�AԤ,@�@�@�H+% 2$SNn]:p@*_>(h, P;wJfElhK*/ $ըQդ @BfϖOzHs߾HAݿ_ڶ-L23#åIFRT(6 ][WA @,Bu?k?� � @2 Ԫ%U&mؐL. � � � � � � � Pe,@�@�@�(_j֌~Pw>@ݻTA@�/M&R$rgOKaä=rҊ"@ X"DnsiXkSsݮ]Rժy}\i̘H�ҨQyoϣ @Z%i. jGB Wl @�@�dٸ1jE}@�@�@�@�@�@�@�@ ʧz? � � � P6k?#ͥ3~Z @b/&Lz6Z*>~ɂ!_&2�&pmo.j^l ].ر.]K -ZHW mtm=F�dWHR?@�@�th8P~ڍ� � � � � � � �#@dR* � � �q7ސviM<X97!�%(wҸqRVRnĉRK/I~+4f԰a VC!�,Pj$eKb+}{#H/-_.}pΕ,駥ɓSFގ5 @: Z%iYFȏ=g!� �-`e?VÄ� � � � � � � �$R DjR � � �}t э2Dz}i۶,#�D瞓.@_?;oK'_/=ti1!�*PdkK*VkjO&H>`?Xd93S;V8PUZT5*@�~ijmֱ۟�$@AvV � @(Pw=n@�@�@�@�@�@�@�@�TLL1� � � �(_A"f͒>Y� [`&BvN'+vtR˖c- v}KwKdٱ#T7gt͒i8fMixivid Cn@�X6H;wˆu <dIԇ � � -`?Ƴxq@�@�@�@�@�@�@�@� /z� � � �{I_-ySGK9X� ] #C_N4JTIzaɂ!-¾=@ @nҴiRr9~QpTsnמ=رR׮ҥ@⹥ PﶩM-@�d +f @�@�mH � � � � � � � �( @�@�@�(SDt!C=cE�]`bin]ӤN<XV-݅h? P8?o;x}29p@:\nѓ[n, .5j �V7(@� HYNQ'j� � @(p衑*"� � � � � � � �(B(@�@�@�H'S#roA~lY N J]'o/u _=[ڴI?3$2G-L1զo~[ܦqur{ �@FԺT\[@ ,Ҧ+"E�@�@ vJQ@�@�@�@�@�@�@�( AH@�@�@�@.>< cԑf,jq @ @?_o-%.>4|`A$,THy~a_Zzuig4zt( jԶ- @r "-_v � �)`}U j@�@�@�@�@�@�@�S ԥl@�@�@�(sSH J{*TN:Izܷ@ XX׼yWHMJ' t҇JWKtqʚA�A;z}{2*:|ty?=,4ڊ@�226mp@�[_lI+V$w= � @z X}}&Ʉ� � � � � � � �$Jb @�@�@�@ ,3%br^WK?(Uז<�? /H7J]HIGm @* ڵK|nݪ~ϧEh&zg꫋\Ge}1+V<hT_ws5TfͬpVZ_ի-}s/{LΩ\9B իKK' ι-@�~ K.>K @ t@d� �AڴgTZd � � � � � � � @Q, #� � � @]+}?d ٹS?_0 H \۞{.aC$ˤsϕ:vLPO@ ,q넮Yw͛7[[<1\jbj ]0L͚6++ vX%,t0(r޽Y˶&>;vwy:uA:-7kL-Zs˖-}G馛wiJ$ \8P#psHG-[ۥ6mұRM NMZS_@�@�t(2ؤCi# � � � � � � ��AJ � � � PKȵjتԮkm_h! |) \^:W?vTKS@�ҹVX˗gͫV۶m˪M-m޼Q.%Bf͚QW. ܴCJ! Hkv:ݛǏ?]}kQFPyn֭ z {_S FƶmF wl38 � @3cB�@�@�@�@�@�@�@�%M$ � � � @2E6L\9 g+@ >Dzig5k1c"Gl> @r ݻWK,'kZl6n+^u2۴iCF IlѢE|衇 *!V *v~n֬Yu;p .׮]oW^C0g\~x߅WRӦ먣vG#Թsww l1�@`-t[  ;˅K0D�@�H;L � � � � � � � @L8)"� � � @Y[魷"h䓥%۷~xb;@t22": tdjJ922wZu @* X`}>qϞ=R8uͅ:tP֭}b* u-_7n޽{gQ9L__C?ɓ'[oU?]_sz?^{jժ �,`{ӻ^&@ (*A&ɢ � � � � � � � � � �E Ȅ� � � � RJСvH¬Yǿ["�%-~쳑�ȅ sϕwJ6HM/Bg֜9s4o<[΅TTWk^zzC m=O-ZruC=zkѢE>Ls{z't-Ȃ%vtܯ_?!qZ%m .3]IKH睗u � �!㏑v`B�@�@�@�@�@�@�@�%%I9 � � � PL jԈjI+A% /HO>)X&%utrZ ے A�RQ`Ϟ=>W_Ռ3rJr!.@8T߾}իW/U^=4uޠ,p5|zu=B SNiC"E�Y #C.d7h;@ҧZ/ � @Y - @�@�@�@�@�@�@�H�A@�@�@�(r3҃cߏ=@�ػW.,KRȅeItRqTD�ʎΝ;/e;vPn4b 2D}Q \'I&:slo| k. 7ܠVZ3X8gr劽^�HFUsMƚQ'@ @.?1"� � PZwT猥U� � � � � � � �eQ ȲxVi � � �$Teӆ/xyʕRvߟ=@�Dn$g-[}>[];G @ 8p >>r0`~j޼ym|A ?+{Q-4rHPǎSUT(+֦MR6E/@�YZZ^q@�@�[ x@�@�@�@�@�@�@� .P໰ � � � ^SH' կ_v%ը!Fe@(_~)rK$9sFI\BdQ|ʾ_o!Cպutwkƍ>/'2 ʕS޽5a-[L/օ^?{woոq[F 4 ͡9DE)!#Sq[(2eҥHHs RI|ֲNg {<:kﵞ >Y>l[oܦ �Q.r?գ|LJn]e{jZL@�@ ) � � � � � � � @V � � � �Q'p'gnjKZISdxB�2"{R6RժK\"-X -]*/h�Ğ… ս{wUTI/:tIZgM73{a3.IGqAȿhڴiyҐO9/ӶXBWֺuam߾]a3�dV`*)_!UdC�r^(\X@�@�HI`X@�@�@�@�@�@�@�Ȝ@\(@�@�@�@ 6&Ov|)w~�Cl1K)#G3�ȱc% A#];)wsTDy4`�M4IM4[o.]QH#zϓ' Jn-7ovaСCN3R%s.Uʔ)ㅀ+WN*T%+tիOLh6!�/r]T` ��ڵ%K{@�@�~ ,^<@�@�@�@�@�@�@�->["� � � @,TiS?8!&ToVni"Q@�I7ߔ=,+u.XuLMs0 SVR~x!ӧOW֭c &kyjԨQzǵ}vCݺuӡCk.o>#lhĉ߼zfwǫf͚[7n-]z!ve1_Os7.F�%PAi@�@ gYozC�@�@�@�@�@�@�@ V3<@�@�@�@ .E&HgD˖N%2 w@ XiRrWK={J\CA�H4d;T7ewyo/P`A~B>#sϩsΩ^?˗{… okϞ=*ZZj]S۷駟j{D�C`J Õ6@ =>~@�@� l*,C�@�@�@�@�@�@�@�'7}ը� � � �Ğ}# 4a J*@�d^N]4~n䓄@&F@ N 6Ԉ#e@@+VK[С Y]v8yB ^nM>̙;voFF[ ~w_@ V"2XtƍҖ-Y0!� � I͛ҥ3y0!� � � � � � � �) @�@�@�@�c*U‚ Bڿۢ ;^6Փ&N.ğ ҥJqqa,@�xWskSr)t7B(*UJ/&OSza˖-L|zpqiӦM^[[3<; @ _UNh&3^(:Y@�@�2(`!ed #� � � � � � � �i4؍� � � �)//u5oVڻW3'kڣ^onA*_^NSӥ+.y33@ '>xz駟ZdKA y.}Ū\5kiӦ%q.sB 7;ڼyZhviҥo @VWATE�DlY䓥 d@ @�@ [z*]:�@�@�@�@�@�@�@�@�, 2Ai@�@�@�C`li&KOJRjԩY @t --5j$5i"Y䣏J6Ho-n-]sf6 @N u]zwϫ<9J*充vqtASL9(P@]vus4ydjذ~a( @ Z7fEP@�Hp/ǘ@�@�(,\(SB�@�@�@�@�@�@�@�\ 2W@�@�@�U`8NӲnmd]{�/wR>I'Iw!ծ-}doM:ȟ#3@�A`ذa5jƹy_~y8 )-Z|P 4РAK zsZ:,/h0R/y|W^W_Ν;kɒ%Wֶo\СC5x`]vemЮ:s ʺu7LWq4if͚;k}>5dωΝ;k{֑#G{W/t|In={zFA<z:vB+M0ke˖ I W}^zڵk/pտUOf&1dչݵkwmX�%\_]۷oIXgvn 8P͛7WŊիW/{Szl^(Z4g@ Z3˼@�@�ps=/Fψ@�@�@�@�@�@�@�@  @�@�@�@ W,.]Γϗ vi "K`~魷k؇~M.Y3b @x ̝;WwF߅h-xmٲeZx~1n۶ O?TK.Ջ/f"~F33^xA7Vnݴo߾414ywkڴiƎ;СCڲeK_^e˖SO=1tqv-YٻwݶS\*+V F駟�_5Nzn-S?յkW|z^d/حUV7H_kƌ)\;A^z3sޒqZIf踒]Xm[j.P-iI U֮ /PfO?,U5_fv+{lXg}. '?qv!U+e ie;vD � @$ rɑ4jƊ� � � � � � � � @d$%ƈ� � � �9*Wr+rr%Y,!@['=Tt }XlTir(dD�"HBn/[o ۑhBz>cYFO?nY_=EʁS/ҁfp-,0qذaY_smZگ_?DI',Z@KZ?u7n6w)Zre/BH-1#e5T <X ]BSvԧOI2TBƞPݰzRI*]FJ*%4ZIٵpo߾l ؍*&m3؞:vܾ{^(]#իWWFǘ1n8o_V_;>4i⅛>Zrԩf;83�"`A=ʌ' � @ ؗYIm)?@�@�@�@�@�@�@�@� A0#� � � @ +# s-UJ: ?-k[5g EREzUr\V\Ύ, 6Op=cC�"[O>eGx_Vee˖ymXP^ѢE3^$hW]usd˗׽ޫ'|R{><LgyFʖ-£+SN*W^|D}&7"E$c!nƄ]ŋB rI~mn)"w^x!ؔurcq/l*U`{N`ڵk*^6[fJjժ5ᅦ6*f?ujfչ~5={x7ξ}J0. VR'֫VK盹"")#-\cN � �$`An GҨ+ � � � � � � �D@?Q c � � � @&>@LC,mҤtT DoK>+-Y"}[~ d=5�D[ɷm۶.ۥ|gc3gF^qܹ}Q/Һ;]*TիzJڵӝwޙY`A4k,xڶPO>9ž,̙3b 5iD=Xȹs駟jԨթ_WƾuV3 ke˗/w;i޼D|Ǐ-<װaCO%J`7}^?믿^=z*n֦Mmڴkc[ԸqL9nI=,`sVk߂&-OqG ^ziĈ>|?Ttl'N6խ[7Ѯڵk{?#UXQ>`BQwyzw:vصeq7~: o޼yz嗽kKڿ˽c ;I^`AY+(IcΉe˖^uc> T*9r[=&# m#ۡϪsk/{۷x 5m3}ֽk?{rK@?pw صkǞWKxs#}ǎknu۲J;SN#KBS{u"\8f,͚"@4 AFeN � @ Eag � � � � � � � G?Σdl � � � @ ̟/#r=-]*=*䮀=s\t]rT~`eٸL,攻w@ fϞ /0ۧm!gy�`�ʽ6 H6mZhᅘ^@m{2=> >ʕ+{mX�"Zbj}Y= |oxjNP,sQN駟za[n6l7K.D}B /R/oݺu^PCvAkz> p tn޽tkС^?v ˋ-RϞ=7x6O+h&t7̻QF*;ޙ>Z}Pi*JѢEl?8kz7˗/lʕRz 'xg}^xAi׵ժU KkĂ#-oÆ ^vmYx?\˖-矟U -0ZRe„ 2elKgW|j m&p7Rg!VCRj3n?sskmZ=,,֞;-q^bɒ%nӟUܵkF=YplJYkkQժUkBn-BFyem^ӵkW;Vv\J۽1Jիę.D�AQwJ � *E4 � � � � � � �@\!� � � �9*0vFd2Ύt}5njR.m"@n̙#=ᇒ+n%*O@�86n腄儈 ;36{z7%رCVrǖnm p@ K/ Û^Zc~Pl>Ӽ`>9^v,Բcǎj߾h,,x⊋ԩS1؜Աsz6U4]Yx?B j޼ƺ&M-;ނ$;8/H( Wڳ[nΉPeG5j׿м}Z(ߋ/Y^J=.wcӦM… nVp?o|NjAdA|_~ׯyd۱muvmkҲo;-$7AvߖϻV Jr^@&-I ݟ> ɴ9Z_6j…^DÇ3 ] :qjCJju~{~PCyvy{1_ }g5}t91YV,Ҟ`Wgr2) @D {?nR"=� � "e<� � � � � � � �a+@d؞� �, � S/]qEMD A O9˞®&MC^]&@� tI6 +TN9唿ɪ tR/\)-t~Ҿ}x/ך5kۺukBbŊ.--,҂,ъ\׬Y/2ؽ{ع}vo[(gX h366.˵~8p@ H7qZx%c ?;Z,ЊǠX QU(aиbIKh[v]ڵK:tHvαcbŊ)Vkw)?^~eu LrvXȑ#[]wDs Jk|{\UVR-Gbs6lXBffuV۠];w:`�oǏH'Ox齖ڶm4kΙnd&4̍d\.;W'F( t/]tY5t� � EWKW^Eb* � � � � � � � 6yf$ @�@ ,'/B�@XϗC]K+iۦ4}z�)2R5X4g4w!0B 1*=O ey4/_lRj}-[VO<ZlY\h >#oe˼E]Z- v BG/^ ^b[ؠTR2KobJftjI'Ur=2}-JF Q`_|1QCsD`?,3 6B-1i,�w6j% f$Ҏmdd=׽@8pׯ.]:#Zw5c =MiTI4tPrI<*Ury'8A~zϭg6Ay! .=?q/vnjL [7]dIu:,eR@�Zu( � �䊀m$kS  � � � � � � � Af(!� �Q&W>A}=ʸ @ Fw"[K?`${{uJ*T/K%jz=鬳'B�*-ZxkY^4ϻ>Ӵituש@v.ou]ׯzꕨ^f)R @ȤN) BLtTزe,XgvqR2~(tZRƒo^ gO[. F^{Isz͚܍~)[cǎ֭[F׬Y;Ƃ,Coݭ]vf 6̅UӾ}~vinyXcA7oVNpM?>Qvgۖ҆uSOMiwZ38 <&=, .#<=f͚V?ĉs/4-tꫯvŒӿ׆:ܻ+{Q+haV޷?]hAGzƍ>-@5LJV5@�hP.<<|@�@�[ƶ.D�@�@�@�@�@�@�@�h @�@ g>LA�@ ,d{qyDr9.1#g Q.bқoJ%KaN.K'gz @C;v~:8BC:e�,JN> ;5͕ݻw':v޽?duVZczJZc@\<AsO?KO?qOO,K/hѢ.֭1뤷]ndؿfo}ո lmΟ flޮR\"Їp~շ޽-qc5}뚼;5at]xa;/:o\u5k~|ze_;fF/_^:u\xq}\X p{u7{nv̙^3<cw,mڴIΎ;TxY(>zJ#F/b<yKgq?t?C9#[[,aڵK8, AU^kK*UO~F;pR`A:q?,ͳ\7ިKXb^&Xu=+W6o�)дLttNY!� �mνMJA�@�@�@�@�@�@�@�\ ,'A@�@  Çk^@�.D?3[ѨAI7{^x1%gk\ @ B:t ?O>$[GmAePGuBi}ڼywm6m۾6bWݓN:ɻR_A`ޘ1ctz .P: >|,[ a͟?_e˖U&M@8{o %ĿL DnСC5n8/s^_'N0 5km[n<K/Tfwˎ{apBn9^KBPգ.@;'w>[kNwNbs�JӼwl٧BJyw풻l|o^"YzB& <m۞umyH,xPgorz )^ogj֬muA{^y 6JM]JS>}ci?I/\/֢EUJ]; 4Ly~X25My]l۶kL26@X ;-t[n=zw}c~^~AӵŬ=-vԨQ^ e=N{,~ N=?X0ճ<N;{N駟TD O?T>jY�lc,rڵg݋q,\J)m-dv*h)C�X]W{"|̚y"� �Ar{o2"Ɓ� � � � � � � �$7&\@�@�^}F+Q  �,{~[Æ93Ks/zA� ̜)L%$J˗K7Hd$�@ (6i$=s:"E.o <>l3/+"!z{wYޒ%K~y})e_|W1B7p@YPd3cAw6&KϞ=վ}{/$-k\tWǂڶmm[l\˖-e]xo֎9)Sxoku ��@�IDATO,ofs�~3gN/W_}UjRz`Y;Gߧdiؤ1.mtͭ԰a^Sw  Si�?iǎ..[7-4uYV-Ҿ}ҡCRg{{\`\qH^;ǽ\@p) \o15o.w;-賸 ƏϯÇPʁϲ|Jz BOSժr!һCrayUԸq.Gw}sC5\eOw--jV]~H]Zܵkh~lBɔx:V;i3[sqZRk'龤c|뭷tUWy{myAbVZy`jw o袋-Zvtn[`=u] H?xĽ%ڹV?-Ҟ-skzGtwx66+}ȑ^.޽{{iI{b˭uA)gD˔vKy~L@�@ 콵SO Á1$@�@�@�@�@�@�@� <C.`:*tZY%'P@�@�B}߅vӧ }sW�Q$P\p4dHLϤvrrOzI]=A]&%Fqҗ_ȅpI.++K]۰YnXM �&0l0w}.nmw= 6;S\Lc/.88~߾}U`A 6 |W\X`a^U]3Z,oK?TRB\FHO]{EB:usHꘁٵٲeK7NӦMSǎ]>PfoX3X,] ?ovu@AoH-J=h'G׮\pa&) [K|uy]:혺uk{A-=,|BW-x1ťs(rnCgזZ=>SzK `{ϓ-.{BwiC�rMJp\Ǽ�>�7!�,`f输}Pu؃� � � � � � � �dV .r � @l1ddžD�vsdr6�s$=;cԭ[ 3?[,.H y3C�Ș?[N;w;C/<c dv1Koҹ޴i wi{GݻwOV[J^H ?>O{^WFZn'?Rzci b@TuM7wՄ իW}?f͚ySf9s-^X |e.)13/P@B mpvI5*R(. HOpܙ7}үuK8n仲|p?U>-[oApd~dJ;?Yĩvw5B c9!C[+WݔK.�2h$ ,_]*/M  k=\  � �9-bԩSNJ � � � � � � � +:@�@�R Lو= �/r!4R97E3ϔO'2 . \PQzEQu� =nXP!]q<x/ # R%w}iL{Aeb'+U$ ?w/_"fqa+RB ߯ .@'O;| {m1b B{"u[[ƍS=6KY(--޽q-_[pA_ix9r}JhZΞ=~={n�ɔ<yTammrA.|[iM%`jʮîݕ+UӰB�2-`A%<@�@�/-ٸQ:@�@�@�@�@�@�@�@ T@�@�5A�$#G$ 暜u҇|@ |4pht/ll3@ 7}Qviӧf͚^{M˗!%wdwf[oU۶mӤIԫW/Ź7j֬kVÆ q#N={@ݻ:_^g۷oߞZ9ssa[Ծ}{͜9S-[L:}8vk jP-Dik#]dqw pK=gum)׺['wmk(m ܶu}MCHW^?C ,Ҿ삂�DAnt43� � ?菎 p>K @�@�@�@�@�@�@� 2G�@�] l'@�\;�5Ҧ䲈a\�QOĚ)ҿ%cGW3Έ5� `gy*ծ][C M7ݤy,۷ϻ'OrAvK{kWTjUV#G9Z?RYt4jaS  ִ0o_ʕ+{%RR})Q!pspt8w_}Rq׋X}{wEJb']m9Y.2FEU$  M ȅtK_Md4W� �~y>RƇ� � � � � � � �*@d9ƍ� ��A9M7 �&{iI7f̐wX ?�e1颋o �3O@�ի z!wy^z%=: *s?pz) <Xvʺu "X_~E\ڲe˼N/֞={\8_ s90`:tSO=5i3܏˗F[2[,!`nRk]1N.H2WhDRN̞͜ͅ9΂ {Ι) 0H #z@�@�X ե|b]#� � � � � � � @v ]� �DSY3~"� %GHcJ];:8Q#i, s k ,Y"/}Ԫ4{\ SϚ!�WK8p ~m۶jӦ׺u6CؿaÆi׮]ʓ'Ol<p; 裏oxJڵkpի7n'ēq?E=KK&wGC!-D24$2} \ȯc,|Ľ!I"KC$-H2B(+V-{u@ 75>( � �䔀A֨S � � � � � � �Ģ�Ax֙3 � Af� �#ҺuWސ[&N̽h�ߖՓ>Lh)sB� j.-kܸq7oiaM4Q߾}եKY %6oެ#GjڳgO܎XR|:Kʕ /jժ*SL:9/p,Aia ,[m-˖mCZ /C #-2m'TM Lʕ~ӬJ@ ,r(i^p>F�@�@ 8CF�@�@�@�@�@�@�@�ks( � ; ߟ;+ �){AqOjm[OAA� l&=3'AW^)ɓ69@ v,3pB=ѣy 7W^^_hDL-qƌz饗x?:hܹ㏽ݛ`SE86mjv"yJhKFD#Um½B?ᐡA"ta<m+4DA:$-X sNO!� �@|d_PF � � � � � � � @ '!� �Y!PʁYm � >.Eٻw)Rǎ;zG R,A<t-q#�"аaC.I=Z/ ͛{ᐗ_~ sc5fZv:,vUz3T>}o>͜9S'NG}5k(_|G -۷omH"`%ɮTﺇl9 i!AHdڂ-!%YXd4s\Y+f@�vҗ_X{ � �!zd_ ХM@�@�@�@�@�@�@� $X#� �$+P dy؈� fIKW^8N =&H#$qtRDYa @t|8p ?\o[oUmڴe]K.D*T G,,q޼y5n8-_\+VTճgO)δPB eĈZj imY@YuХPܹ3v؁�pCrx?,2 "Cכ7K˖ ܱ#qB~C&oeKɒR<{iKիH =-[JfO� � @ VJ*o'UY#� � � � � � � � 2t� �Ć@l̗Y"�Ď1RR͚?-  #@ r~A.idkW.r?#E�yꢋ.={$ g^SOl޼ ,9nv o݋ թS'+:묳\`[۪Uo[ݫ3fO?G}M6E@ ;Иi)-矒˙M(g H[+/…+WJ fk4�䪀A>t^S@�@�6 tE F�@�@�@�@�@�@�@�D$ � @ K;@�(Cq#<mA/$-w\xQ ۶IH?/խ+͚%c� @N)RDݺu.Elڴi^0~\):غuk4i^/5g͜9 g\tT6;t{Yoa֮];o9rVZ"V2{-x?82`mv7趝;ZVDO#CWM˪U~P~@@ ,rvo | @�@ ,2T2< � � � � � � �)@dDT@�@�b[ >V)S�B,򫯤mbH 8rDz {%s 7HyP @t)bA0M!OѣG롇R\\իM3Zjyc阧c-ZH7|Zk֬qz VZx_z^zzR@e*oLtC!]"۶0 e?LbѢCK`mv2r!GݵZ۸�D@: '_ Bd]� �ްax � � � � � � � @ }!� �Y*'r d\ � -+#U3:djUil 0p;[?G8 @l Tq/.op)ŶX/҅}ڿ{, Z6j$~Rս cw֏?-ݧ{}^]ti5nX={ghc�(PTԁGC"-҂"mmˆ …Gos5 /[<$@U|dۂHKLA�BsQ3*$@�@�T w1,@�@�@�@�@�@�@�ԜJ&� �d}h e@�p;?^4(gM-0UĒ<RFr!ZRÆ$\@�"YK�媫qA-YD_TGqZhڴ˴u=.Zj vlŊ%JD2,qK5[vm²zjg^+W.+Ź2 լ]zA\rDϟ#�) Xc R`Ν~8dhPŋZ#FH۶GHA`Cb_Ft})RɒG -[JO<#dl � �.erFL? � � � � � � ��A~ � AI` �Y&0qkԵk5% YK.HgI4@D |tҟJ#GJ7,Sb �1.߽[n^nqvخ[|~Z`ⶐ$ŋ{'e˪L2[J.bŊyK"E.l{q}vm޼9׺u믿yץx^POСjdU^ݽq?\> stiҨQҚ5Ҿ}~8Don_9>ݿoB"m`අT}[+ek= ?^;K5j8@�@ zog+� � � � � � � �'@d2 � 5P(@�h3F /^1+͟/uVx [Hw!t҈xIB�eˤ>}3޽CR(QBM4񖤳5.B!eÆ ڴi/޽;^dѢEeCں`Kvɗ/ d<K*{݋ yȂ'O8D5ܧ۶mXVX[WpibAأuo+u566 �C`J0]bBR*ڡ;v!. ]\d9b9ڽdzd p J'͚E0ϱk � @rgb @�@�@�@�@�@�@�*jv@�@�W 13@�صKiJIg~gK& %M ]rINL? �d3$=TWRӦԩ-e!uVr/zCC[WVK6pcBxAÇ݇$iᑅDAҥKpR5> 5uҺG�HY 42ZX�oZ! n?\.Xv--uJ t@ > yMn@�@�HQয়${7@�@�@�@�@�@�@�@ [V^G�@�C>i@�"]t ϙhAcTd-HI7 &(]. �9#0vԷOK7,͛=}[Hc%eKje`/_lZg!O<!j%]w4odѵjPXU.,(U/)n~`! iKp)N<mnCV,U"kmA2"OeK饗"o܌@�@ 2V #c@�@�@�@�@�@�@�"Y H>{@�! sn@�]`RLu`AJGHyd B >X[p?7 � @}Hۤ)SPʔ 7g͒,4'\KRnRs:^ƅ�ү֘cCQ_aiiW_mV,bEjb[^>d'&KA�@�@ +=K/i @�@�@�@�@�@�@�H^ ]؊� � "@d7@�"V?Iѣw ͛K6eˤZw صK.W=gJȊi@�سGz'5/>;wƒ\a[O=VdK_/͜)=TH �&`XzO޼'Kr 1,(an^ZZ\8Q7~ 'R_IKEu#A! � 7Uҩd� � � � � � � �*g � � H 3 � | Y@N;9s ߳ȲB`|{w?tXsh6@�=mۤ'˽$…R mq_0ͱU+y6k+qX(b$<yNe~i?j'-0[)V갰No @*$5k&M&]{m̋ � �侀}޽e /@�@�@�@�@�@�@�@ +JMB�@�T ׯ1-@�x]}{x4i"Yd;NF@f9G9l{� @n XK~*]s^x≹=5K*SFQ#ḵCi"[7qc|p+cB�rSB˕Qd_ a蘴>, O-+VyD;߅J oN:G#@mV@�@�2'|B;@�@�@�@�@�@�@�@�e2u@�@�bS w͹3k@�ذA>}4n\!q[ɓA{x;� @8' *=t~q˖0`A-Z?\T(C#BuČ y &Հ ~Wr5kLWdB&-fMV~ϟ߯OO |Ai21dT � �&`c /4OƋ� � � � � � � � {@�@�@ѢΝP � cHŊIۇ,r?R|ԥte9@�H;-[GS q;rDKiT % ۼzi<?B( �ʕRjH$ȗOZ_ڵKw?9[z:u.I+Ky$n{ ;K%JHS;g^@�@� H[� � � � � � � �@,-'@�@ - "2-%#�#u,*ΣvY~W_I:x!i պdҥ: �/&LR6L:kQ-Y"m)&I;uחv5^yEHcE�GB*Ϙm⒅Z퓖/wҥ嗥5k$ V/@H[w-vHV�9!`amAߞ= � @, g9"� � � � � � � Ay` � @X ֧!�!b`ciT %KJ.͙CdInF/i@)oL6a �OHCH*ISJ瞛D׳gKxeaU^TRn?^oX(g>3Ə�Oꫥ8?=WU*W~ٿ}gKh]ᅲN[m_vcdat^NҰXl{) mJ/:?7foo� �  y90S� � � � � � � � >@A�@�@ u Sa/ @x ؇˗ڴ q mF 6m:w/Ǝ.<FX@�8*gK6H=tܚ5Kj<zB-g-oΕꌔs8@� X@;RСRZ~HE^uT`f{PE`[@ȢEG'6nN;MjX:LI"9kF/"7OT) � �/H=zk+� � � � � � � �O 9Q @�i ܻWi &� p啑zcZ3F:tHݛb{˖I_}%թ@ 2֮>76MP!2b=ȉ$?nݤ .]oJ:$_ @X ҁgd/Y"-]C{ _VU]~?<ey~df~Hs$U{MBdnF�@�E޼/<@�@�@�@�@�@�@�0Hƈ� � ieNO@�"E`<iJ#e8-ai7EB-_^;H@�PGj֔^4I;6C W֯Z[IRLs,u@�H8LG~䈿GRÞ8dcGi`O{WM9sk*VE}C<wd@t m+MscV � �9+`_d^ � � � � � � � �9!@dN( � ŋر#'@�bN?,QȚzRɒ~0@dƲ1EI\ Y d2@�"Q`^=i %Kk81Ϛ%*$5n5n.k4btyƍ5Gf� _IZI['#PE%#GJ%۷K3fH7$d\Tԭ bE^4w튴3^@�@�pXQJ62ƃ� � � � � � � �*@dY� �dmۖ �,/쳹,o>OY3 M`(v-BZ@�H7?pd,{2"eӂ 66^6h ͜Zm!�)`WMy?{CB-^sL(m*-X 'C~T9vgs0@�@ ,X1"q@�@�@�@�@�@�@�"Q H<k@�a s@�D`Tߥʒrͥ/n <tmҠA҈R@�'ϗ?ixRH}8{ԲeGz ϖ,Ǥ#G"}VH,`_7']ptYs/|6l(KAԽTtO?!9%PT4eJNH? � �*vm?y!� � � � � � � -S@�@�H] }؋� #5i"UKkT\Һuid?'CҀҨQ8@� ̘!5h =t=ҥRm%_/Z[AvVƍ\׿Nm|1B@ ~G|}4d߷%ZҖ-]IUmfidiPBBN0—n�ly PTD;T%DiATguYvݙىf3眙YibEG5c+бW@�@�O +Uq3b@�@�@�@�@�@�@�> Ϟ@�@�ȗOiΨ2E�s}>^&M|3gFyl XK/I7cet �#qtKU,8cL* J>?^v4y4oԨpaq"@ 9ᅬ;w;z bA !ACzui&W_BZ�x8lk5kq@�@ X:z@�@�@�@�@�@�@�@�L߈5@�@�@bҎP � }&+M IIgyd#H6!]}u@�D!gZӥ>5cjlL"zd-㵴n \YjR5*^%7ĒSJ9DZ(Om}m,^۴i#=d׻.]?xcpaix1D�@��APN@�@�@�@�@�@�@�8�Aa � @�AIA�1cebӦҜ9YEd /HJCJW\ I@�2(0m/ n~Q: V[{)SF+[+Y*Y !AT-uAr/r{ߗ.PZU2Dڹ3$c +uDd?? � U{_U\Vka{@�@�@�@�@�@�@�@ p bM@�@ @�ضM0A'jg-rСT3 /@ᇥo {4� @C2_}ywb顇2TMԮl.ڴ!rI>*}diZVjT�UE )?>7<8X X H.\){St}Ҏi@t&O bT� � 71۷Kq3d� � � � � � � � @d� �D�AѰ# +/0=5,01C<�@ v, 5oM(tR9MۺujKwyI5AA�QIBn.w݋qT,=n4p4lT3iZnΝ% �@�@�2*ao 3* � � � � � � �  Ƕ � @ $$H;vр* @ -u*.CHxھq̞4;dK:ICfKh@�f͒,[k-4V2ESG*Q"憖U.͜)u rT�Uqc¥Ç7MX )"ujtwK J D * +{~� � @2}u%@�@�@�@�@�@�@�@p5D; � �-P=z� +V]x 6ƚ+Ԩ4gt51&F}I^(pے=/) �D-`#EZ"ԩR۶m3Z+P@z ys_p#g`@ -h޽I>id~ۿ˅56:tPҭ?>ڴ9r nT*u#elʙ3r޻J6o޼ʓ'Oҭϗ/Mۼ ;yڭMV%z,r`˥Z\=E sΑ^{-5Y@�@�6o=.]<B�@�@�@�@�@�@�@�B).u#� �1$`_߱#P@�bR7}au;6&N0Ziji\P?=F�mW^ cdt{H H 7H*u&5n,}T~|0zbM`ڶmvMv:?|y{Ih W E WLlAFh9&v߷[+~RѢkT[^0Id@<2}eF,R .|ThQǢJHH8涘CŽL(VM4yҒ%ҰariV@.ҠAvݺn@�@�bI~lȽuciT@�@�@�@�@�@�@�"] HC@� #dG @� XdR\]-6k&=\\BTuƀKv\}\H ! �Ĕy-\(?H.fΔڴ#}=zH-ZE}"Ko߮?C6m`֭[l�H ;LY,P } 3,Ww<ܰK/Po$bdv߂QOZԦ o߾0L(ւ2-<3e LiV iJRɒ%-SJy=RzV_<s$ФyYAg  � ގR@�@�@�@�@�@�@�@� VnC�@�W}}q6zO@�b_` _}ckMJIK[cc4-`A7(rԹsd!�ėmҀ> :{N2HoSB[~ 4INOilrT?LB7mذA7n},7oBn LhTͳ@b /1\aGu8Z rg6X(CZ@?鿵`O/_B-[֛,3.'pB؂99G0sϕڶ]#p9:lixz(t@�@ A@�@�@�@�@�@�@�@K<@�@�pߟu_Δd@ �a=Z[Wj ͆B 9s 96 $ 9"]vtc% �*`ק#}.gk"q @'JyS_up4nxjbm rl`!k֬I֭[{-bI Ɋ7Zm]fJ.- K>(P ٖ܍t<yx!ؙbrP ]hK/<Eł-yTB/_޻T*W4*Uʿz֫ QQl݋��@�IDATs;c]H];;  � �xHլ� � � � � � � �)DA�@�@ }m߉L5@�E௿|-wݕ-͇fͤٳC $ ͛4; �dp]V5eʳ*Z4ۺ kc{x͈\^]FwߕZ.9U`֭ZbV\ydAi%DYu p>@?ϟ?[C)`6ըQ#ܹS6lH 硅~k׺u?vS ,BVVMɧի{c=pԩ/ quE 8CʑC8}# � �!`A쐧M@�@�@�@�@�@�@�[ @�X]wzO" @ƏvzWmiSiIk+2t=ҝwJ Ư#G� {w}ҰaRRǎ;잹sm[W7OWjNz_i1*pZl/__~{loڂ-jժ^x^̝OVBB{ڵkٯݻw{ fZʛfΜzKpj%KX@yI'yj-R\H\@/r4\XcGwMO Ϙ@�@� g�( � � � � � � � @XEXi @�^%}}经;z� GK.8ÓA(t 9FF9H%JH9}' �'pd}K.+*x)1/-u,D㏥nfϖ^zIʟ۱h8xh"?zʕ+u!Ycʕ0&MdO<QWJɓ'OHp:䓽)aڵKzj+Vw}W[l6)T,SׯM˗OʈW4q/@3}>"pK%͛ B�@�@ {0! � � � � � � �^  �  cb �!}4~˱1F5#/xS[yG`|7ߖ NԂ� @F\f̐Nzaɂp}oSR] p .NKH~(U�ػw{-X@ݛl28p@sի>}v^]5\*i3P- zSʷ_̲c姟~KUK_WPHSOUFTfM/H5e]ti髯֭sϕFʗ/zIH_ s_5@�@� � � � � � � � �d�A١N � @ w{ ) �Dرr҅FTڙ�i ȠRY 7zL �Ahkע]Ε O: 6I!itG~0>[7OU.K!f@ < f͚MsL ;|J7 ;3uwnݺ^h]޼y9ZA J_jmJ^vh^twQ>|ڥPBqּys'<bW(M(h!]s5:@m, ȀX@�k z3x@�@�@�@�@�@�@�M la@�@ J"2=F�b_`h_8b"=֦M}A=JFl4~o~6 @| t_&IW^)qE<%i?H6mfq'իK3gJW\!qB ٳ5eo�ݻw욺7&MSĖ (V1º|r͟?M:Յ^?B Fm۶nO>d'@@ZҹʅJgC'h, X&̙@�@ S*Z4�@�@�@�@�@�@�@�@ Bw@�@�Hp֭C� o*͘!w_쏼Y3i�ȑCb_Z`sPD �+R~r!eUWI>*(L)rc-Y`%4 IcJO>)udaگ*,@,l΂+M4ɽWN:jժ.RlRժU JC� ʕKhS߾}o}>}7 4H7nT)k\:tPǎթS'U\9=|g-=/A>e.D ;.P^ǭ[gGh@�@ Z h_@�@�@�@�@�@�@�X 2&cA�@�B,`A[G�@ .+_DoTڹSZ\U+H@�.oB| J�+  �Aؽ[zAg3%{^ Ƚ\Ji!79rAݳԢr{Al@`8q>SvǎWڷo[oUm۶UbU@ yQ&M[n^rM<YjըQC{9w}oܹ_|nM3G.RlpJY][Y: ȬY5 � {Fh?CA�@�@�@�@�@�@�@�)3 � @t X֭=z� ;GHGK_,;Jk$74~Zk0 )%$HzeD�@ Pq|֯ p@B ~ ܷo_MzSJmݰm:^ƍ+4G[/;v2eov94tPmڴ~Zw!q`/Pͥ _uU3f6lؠ%Kxa .ԙg_~&L;~eP3Ç4!e]}AY @�@�bZ`~@�@�@�@�@�@�@�@ A@�@�(U ރ-モV.4ƕh,n]i`>xmG)_ �'|ԩ/x_3"2m~6oڶM{_reits.]G ~Ԉ_{=Ǻ\ry_ oG %.],:u;_- }w^޽N8XHx~-hQiXiiȐfq#`AV%͐( � @&Agbc6A�@�@�@�@�@�@�@� e6E�@� %  @�x5Q#}/>nʩ7;;]DZT06JS �q%24`\h\/4W2P`A۷/TAkFJx xCzinݤݻZMk;Tbb ν^UVմi\*=SjӦ O )RDzrac]f 6L֭S-t)hĈO-wkXzA% -MH+J-= � �!KEdv& � � � � � � �-B{3z@�@ Ci @�[`.} YP:r$Zl L(뼖-c{@ {>P][zEii<ТK;|W[PgS]s�`X7,M$Y(gҊQiK]RU^]sua=j֬YDN!@xT=zO>sC=*sΐu^=^s*F 9rHݻKZ*C�@�1 cl2@�@�@�@�@�@�@�H (Yt@�n2e|AOe}@� 쟋./ \_f+cG)'@�8�ϖ.P:4ir馛\aAVݛbpUJ]h8ٹ{>rԤdXv飆 9`M< }˓'Oհĉ@G{}NRÆ UIh5J$=L 3̘SĀ � @ :)"� � � � � � � @|;@(VC�@�,!iV4@�^_tJ~}I{ 3vQu � 'ToҔ)oHeGqFnZ\sw{>DyԷoLlYYcהk˖-͛K/sѐ!C2]O7pۻ�M@iӤoy9Ceپ}3"g01;=:䓵{n-YDoիCΡ_^Ç΋>h8zhtcŋKm^whpBw}^A2]vij޼tbݺucG#Fo z5˞H6^-Ok;#@ӦR*ر: � �(po3 � � � � � � �d@l@�@�Koz� [kJ'K^[ d4 Hk}?YVS:e @�S3g$ʲ,mڤUƖ 7ӧ{Zvge֞5kVHB2ՙ,l4u'OWdXȢl۶ͽ֞kϞ=~{a-^X < K`SrcRrluN;;=v,`Ԏe˖qXN:iСzFq(C}n};/f$t &hǎRns_,ye-`avIf,lqK^Qӧ{x@ѽ ͣ .@K.E]3<6>kwKJI>'-[vG P=w tmC�@�7 o#g � � � � � � � Af}@�@ ʔuvӦ(4]E�97}ټsZ@> b�\r`eVA�@ Usϕ;OjBZ\V)w46 z['$$xڵs'kᙪ|JL(fh v.&#AءCp5knQۍ\ؿޕ3gty?J;ys_Wv?۸֌;X8^=6W^-[*o޼^ةQ"KT&K.:e@+W]ujժIj2rMyζS wsW\q@f;v=3f&۽y饗2*H])�9Ž@7Z:ogaO?-daԁ'u[vG P \R;7-X@�@ AQc<"Ɗ� � � � � � � @ D7bv700@�@ :J컮 �)`A{KyA <#kH' Y@� 8 $& _ P9_aF h $WbEŊuu/eTZի#EtEUP!mܸ1 0@'O>**#Ag7+EWr4o\؟Ԥ;?uq5]vcǎ.T}*^x*d hiȂS=vNm^x|@JH"2o^p UTq?~a!Kf4c }曃 .8CW-Om!Fեq2"� �ċd7 ⅆq"� � � � � � � @Az@�@�_=/UJڴ)z@@�[}w]"]zit#+ -[uBR" _ @&LnAZP8A{UPA}w߭W^yE?pҀϟ_ VΝK/i˽mlEIE~ڶo6lؐ4Yf7t/:,[naV?w+,ق'w%/$7[yf=eXVz۾zgsiɒ%jx~Go .ӝwީ˛׺uk~^`mca]T9~x3F\܋#FhΜ9~\ ->#o>̲=k+!!!iy8T$M&]sQz鮻_[ɟ;i;sNm{{-q.4pv''L~zwcUVMw<L-\PcǎUbbg =sst}~g5m;عJ tx}m۷O=O;X G_ZG\^j@MF\[wze_{pmO 5|t!u]+YÖ-[j;_=<:'&\ޥKuG͏vڵӮ]vh'6;ƥ=_kzאv"=OzKz ; k!� �ć{q@�@�@�@�@�@�@�@ AS@�@�([V  �!kRz/gGЦ񾨼`~?vIŊE(? @8֮ Q=�&驧LYX.dn8rHB,lfΜP.\fadjR&MTfMm۶-|AKSJVry̰a\@-_T^pqϗ1.Zu W_y^j*uɫB6l6W\q 츲=inrYcej_N?tխ[W~Mv}i?Y}RhgҧOuA\2_|.()Tc˖- 7R__o F {>=oC'ر@ܹs:{cB,`8�쬝Cj/PBsίwmi{cZxqXU mֻy;XrʕZta_ԢE ︶z;u9vNY؟?�0A;uNyk\&Pֳ먝K.ro4{]>39}zr y={7ڵk{A<zu_g! 덅†ˬAg!>ڵJ*:"֎;  Hq{ / pN '[6C r*;dtkG�@�eÇ}gby @�@�@�@�@�@�@�"L}-� � @e}Y?Y@�` ո/謧H餓7: oPd �dDe(G$䂻/6 ggAZ?,?|.p%b!efBq8;m4oYժU*AcA"-*/rÆ _/X_~{^s ͚5S҂,'/uђ%K G]b_M>[okP.[nſOƌegA=z5\kaeVƍ{r#fq@gbg!s˚5kNy^_lޅ<=Z̫J۷B/ϋuWJ&<PVR>S;i; ߰u6 . k̙3r  ۵P= {ʒ]BZkm= 0H;WTk֨Q o?&wJ@ O<ϟYX ^y;vNm^&8=bAv5jz.wٱcw :&'ۗɋ]دfS|o]+Ji!vP`;:迶cǎ^f9hz?~)?)Noyy@f5{7l� � F> � � � � � � � �a+@�@� a �Q%Ҟ=R>Qt2p mUr,q7l� A v~X8PZX)i<e.4mT 6B +VTB(h2E.7DYG}.IyG I-@+Rn]/�Ζ}+f!h!_W… {ں+\pWgrhr/׃&wY0y睧*ʗ/_}crefhyӥrڵkR-8sΣɮ:ȅcQ.,/{zڱ־˞jv 9d˖-O>u^_(k3-_`@;[ /_~Ѻu뒆su } m 6L˗'V:_mZև7} ;vʕ+睗uiƻ?lY[8i\mS0ʃ>~M?Uk_ FQY#papw) .'!L@F%ϕ#Plƺ � %kM@�@�@�@�@�@�@� cfW2@�@ <eJ6-ZA�@ QgKv-Bd?? �p.K: 䓥eˤy~ZXW H[k7|+V@(\r\bA\7nL2uß9iv�X o{}i޼y޴pBM[f[Vm[cb!`;wvz|^h>X;XGN8A/N:$}&˗/WѢEg\߿ 2c3O>\XOj,屓־Kڀ;YhРn:iҤ, z.LW/ MgeǎmBO> m֪U˛R7YfmY֭[Yv?Oo/ mև%?ʭY@߬Y3_Mn[BنbKɎb> vW¢]3!|mۤ _75ƶ˹J7=hF� � � � � � � � � �!8_!o@�@�]}oW@�*v嗇وm̂ 7l 9bwC�@ [.K][Z@r9}CRXZA}\K…/GFGЋӥÇ LLLRJyO6^/_{\6Yzb ,ݝ;wV޽{ "hq <X\r~G 2 kܸqR9X7o0P޽˥b^z^[0\ʲjժqBҸq҃J{s@xNxmdɒsArA/wޑ?KuݵU+ji(<qDشc4o҄q_^ϟ>'svjR)Imyf/^\ޥ�Y*RB <hOsHy̙3kuFf[q^cYhtbkB-2]8曡ncM"k?ֆx@�@�@�@�@�@�@�@�@�@ A@�@�h� }/@ ^]r9:{(zܰV f � �<Y:Kf Y˂ S NH 5ja^Yo-k2EUKR\9<kLW ʼyG-[n-<̂,-Rzu/pw… 6;)-qS:,U\YO=ٵkW]{Vς"+hVenjW_}ՅbG} x8 5c u]u;`'NxxX詝츱6K~pٞ={jѢEޱwi۶mivouT^=}^dNTD o={u\YQ㸯P})yi,SV| ۧvͱkyFNk} sΤUk͙3G;DDڝ+W[n޵cǎ!wKk2 .pҧy${J"I2 WH}A�@�@�@�@�@�@�@�@�@�h 2 G�@�,`i@ N^{M/)mUHA! �dZ`Fwo}{}aeʐmhRҕZ0-[lAQk֬6;^YjF꼩S6m]bbnݺ'  68qJ*;ӛeq/-Dqȑnuy`<Яo <%۸TZUM4ݼywk}HYr̩kƫÂq:uԺuk-ZT]tQMk.o^ɱc&.]x[j]Hypghs~cꎔ6)5j$͜%?vףoɞ&Mrs#n{ f͚yjbŒ7hc ݴiz!\ac;pO4%x-�?ŋᬞ휒q{9^[W^) N>xXЬ 6x+{r|뿵uw٩-o ƭZs={U~=ܣŋm?[-Z�۵kذa<xg}&k5G~}eiڵ^<c5ծ=XfϞ- n׮.˸:w;^pېPyT t.w˽Vnlp/Bd6G�@�@�@�@�@�@�@�@�@ p@�@�P -k}� @XN.F⊰45z*AQ( �,p\0T4k\Pr~A6h *뮻 Y׌3t}y,@£XܹR۶i!W֫W/~\e!s\)SP.۪G^x_Kz!~# zG{AnA^V>s/-$m|Pwq,|rРA:|8ydo[ς&S+ jժy/0BoBdݺuӢEy}RgW7t7[oSɒ%_xif㳾5J˗O;Ԩ! Ԕ FO/iڴ0}G+U\¿,^z6FnawwzǼ/޽{u)xǢk׷o_oqNd!gazydǎA;Ww[ ` ;_]B駟V\{Mw`Bo; %4 ;M0y#AyHyή]vl]+75Zzxmyn<bho ,],ԮǏWKVr�dXkXw|z-{нhz7uN:$zٻXd;jFGV0$]{͛ŽkCB $$ȅ0Ko- k � � � � � � � � � @r/o8NXWѺuS! � �D*TMZ!"#G0NO==,.p%ҲexH> ԑVJ>Ypwsk).+6nJtL/"S7D�L*'\P\T@h f[Vƍ3ڨoBBƤJ~…5tP ںu,Y֩>?lⅲ(QeͰ+Vz^HZz\nm*U*ilYdS,pַ0H \Pɜ9s_.mbz-}a}sGKgFy SС|IհTl.Wey=x7o ,mO<8!ڵKEMMI p'Xǽ_;oZ?,0Kj2o9{/s矪_Ql_cׁŋ{_[ /=p,t25'$ fҏ> 3ÇPv%sصjեھg,d(D˯uAǾVľҧضMryk}S"?}@�How � � � � � � �-ׅb{2:@�@ e}Qڸ1US! �4d1~)B(YFܻ�� � l$$-ur]o)kpi틔d[?,BkR$&&zmti%v1ɃY lРA:k8e۹]a !VpY0 KXp[ZR[?Y艅/ r3#%vKի GuUnݼbB yxB=\7岔Sev+VɓUud*TȻ}IӺsw袋.Jkq<oZE7`6)1}oA=w3S2ZHv+fB#^=#Zz.CF&]'Cށkmqyj 馛A `Ν}~ xCV[e1_%` � � � � � � � � � ot*@�@�COY\@t^"�Dر. OqKGaZ E ԉ� �&p⋾_F(-~rx./]v3G)Sm͘1#>ǶsN:,XsݻK5jH\ 5i"}d2S&M۷gfӣ)Q:tp<GKv3f  ;Sպuk]ڵP֭[Z~ Ԗv]tQZ^-B}6׸qt @L-Xv1X.j7]�W W_}U/٣oQrK6.T)sP-[>g֬Y:.d[7wvբL.}JFI+Y)  /;!� � � � � � � � � @#;a � �(WNڸ1- @ )v!+irehQi"/֧K@�@�9SnA,6駟j%!|:ӂXc課l.ۧO=ul7&LpBx7t5"͝+Y(5[uԩ:3\m6:D @:uxڵzO={tU}լYH'NԭW_/?2eyֱ0L"˗`Ⱦ4S.j7+OO>ћo)ߵksCRuPq,rh֬.ĸzz+wؑaw^]mN?=�B,@d@�@�@�@�@�@�@�@�@�8 2Nw<F�@�"@dV@ P~¸4xp[z o@�ؼYni(Ck5:2;vl`gԶ olĖ@R-H=zȅ~II9r?ꫯgǧkD@JO衇Fy֭UB՛Zj9sڵsa.6Y)/8$Ⱦew+o޼իw6j(Mg+:v[-[2U!juM%1" C^% � � � � � � � � � �A 2hT� �ďA_?e �#`_uj>{ڏV-rh)}D�@�p >,4`T;pB#0eTTVhRR~`7ߔ9~t~M_~Wdi X[nݼ, q{9Y�Yg ?~D<Mhҥ0a7M6M 矯qƹŎʓ'OfvY^kɅن9@ K\z뭾X Yc\`>� @�@�@�@�@�@�@�@�@�@0Gs � �1 (ma �+p4zteRN>Hs?կOd8,@�@ ̑6nYJ駟Aikb< \u4y4{ԼbE[.vOGy}J *UJW_}&M?CCՑ#G9f-[6pVO>ю;~ �xXr^}UG0u+ /QFyi+Gq鉂@D S8�Aa � � � � � � � � �dV(ʱ � I71�CG� ҦM Ȑ7 XΝڵQ<� �AضMZE H' ZT4}Զmt.d@˖ҼyR/<+U.5QFׯ߱+0'/.Ho6oެYf{Zpw[dIwoz曲9 dsgU=իA( ҪU|r 2DڵSܹAϞҺu̙؈U #q*?uP6E�@�@�@�@�@�@�@�@�@�)t@� ܺU/)ox5D�}}]Ukn]_-*Uc@�\x}RZ"O`B? }U M*(u ~{1tP,X9}eb^\ԴiSo8pCNuO)SxAwVRԤISOBbSQ!ϟ9sxvn>p*y6mt}z[|ʑ#Gw:=/UK7Nb ,pR`~��@�IDATo#`?d?^rQ@�@�@�@�@�@�@�@�@�@� 4J*B�@�G 17֍ʕg܌@ <6I}&zxڋV|ŋsΉw@�Ȭw 7H.[H7(=Thfkch?ǧ ȟ_.O;~Az%iպ{u=N:G@~h~a&+FtR/r֬YzC*S4h s).j֬~_�vx=.\P݇6SBĉf͚yAV!!=\ qTNljK'( .=| afXeS@�@�@�@�@�@�@�@�@�@�` LMB�@�D\9@ 0@�0 Ttan8JWOZ(J;O@�@ B1p/eK_Qb_`U+bOglw)'--_.*Ud"֎Y\rt5xܻw,nK =3:prAZ(dڵVZQ{~R q,uVOZlwk!�~zODޱ]o&5j;rYbҠAҜ9Rqa/#tF|`6)+ $ � � � � � � � � �Ĵ�A1{ � NKQIA�@ #GJ}XpIk,csl @�8rDzu鮻|%ާ6sbQ o9GƘ*й4{ԥV] yfZa K_<"o5f\RURE'tRt'zm~<yUq@T ڵK~oZbwܥnٲ[!g'|nƤG؃y (ZUS eJ=r{ߖ*tPs XdBB#� � � � � � � � � @d ^!� �-`/YRڰ!I@�PBm\ބƍgSՓxB:p@ʗ/:A � ~f͒^<X*V,,MH<*9ڴэYS7zBrxOA Pܹs{vl׫W7l2Y͝; ܾ}DVPAժUsoUJ*rʲp<@$޽ۅ5khժUInݺfX+VN_֭j#ܶ唴=i"Aٽ4|8A?"AF^O � � � � � � � � �D�߲}@�@�l(W<-( @ !5n,rJ1s:xP.Cj S! �D]K?/5i"%5l a}σ7NQ#`Cw%]|h裒 i|_")eٲe~uI_~M6D/<ς,?Y?yΝ(dA`K~ʞׯn׭[?n۶- zabڼys 4իWWN,rPijJm[֭}}v(Q"#� � � � � � � � � �Y 2Ԁ� �ĥ^e\A#�H}G_'=tjkԐ\/&2Fw1B�s1c;?tRq÷ fͤy$+4dd\{RBB@(Uljf' [fgg|i[n=jb.ʹ%" ߖ-[VKV2e;.رC1ӦMkƍIOȝ;<Q m׮FZre/RJs+iUm[H (n!USAhJ[W>@Bc` @�@�@�@�@�@�@�@�@�"J Ȉt@� \2zKO@�"_B,袋"CgڵE"W@�*tԯ4ut#H%JdVv{>V- |!|"Y<p X?p/6-"7lpTٴ]-�pͲ``*YDi%ExIK'D"..)r֮]d6m߾ɂAӖ-[Z%ߞy^ڔ̙3,㣑c,eoj$ aN$ \wtSO';dA.� � � � � � � � � �U ȠrR � ?9eJ"�^`{whзk--^kb< �ħJ>(=԰4{Ըq|Z0\>~Uj<B =My]}acJgV,G |Wսx9r ܴi i!䷫WN A LY, !,nm*\pd *$ O HoO>˗O<hiӁ}i޽GM6oϞ=޴{n{!>ڴsNֶI?nK*Bkke˖I~['Qz!)W3_}^{Mׁ+@&A�@�@�@�@�@�@�@�@�@� uCj@�@�R ׯˡ3h@�,\(4th**Փ*@�q g6%祫 A3Nrh&@@bwJҐ!-$-Q!`%Jڵkg &ܾ}7Y ?0?pƍG-ٻ8)_ X�) D Fn`b-v[lPQE"JQb)o弽;v|kٙg33sw5͛7W}8Tdhb&</!m/ܯY1 }:&Lk7z\m۶ tݶ"Pϡzf!)2D*#9+kНċ>/� � � � � � � � � � s@�@�9kR_� " _R^&,lk- }Ծ}2 �KС҅rL/ڍNJzRVy\.i-[o$q[oIÆ)ԕjrȡ:uK={vpȹ!C< [+hLjL]51=ϛhD~6:um{*cz0e-ZCX$%XBG?z^pn~ l�yuңJ]ׇ4u 5@�@�@�@�@�@�@�@�@�@EY@�@AVH/ @}Bfn]:΁ϭfJo �`s.|<ei Գ9p`C/啢'Jk!4aJ:⚲N^ Kl׮]g^9.s + X`-矗N=+I?V Hv ?x� � � � � � � � � �h2?@�@�H,5f-@�%p~k ?ߕV^Z?ו5D�@TOZ}u/^{RٶX3%~oi><Q``W/Ǝ-GYG ,&ǝ_~)ZR7~8hg*࿎Y [Lux  � � � � � � � � � K sɼ@�@�2hFjZ/@�E_~;ie.|ARAU`Ԩ偂� p'JJ&m4at7\XR bEDA W>=ZSu=3A�p'T</*?Hj  }+\x<S/7/g@�@�@�@�@�@�@�@�@�@ Aϖ9#� �%/ЩA%YA@ | ty^P!.W+*"� PsH&g}o& H7gW}5֐YK\OH tR*U+!PBF@ Ӯ[j=bIG%z4sf2rpdǎ7 � � � � � � � � �S |2o@�@|Ëo| � P_n:wۮss ǏO^� �$RUWI^(&TCR#GJmV赤~*дtWQ*͚UkC(/%ڷ'zqC ^~8OS`ysװ)-@dyo@�@�@�@�@�@�@�@�@�| O]� ��A%Y=@ ?$|tARP, M~ag @�@ G&I; sË́ 1H/0p C ,ݨ+sg^|͚:Q@ KN̒Y` ^kJx кt?\2i YrB�@�@�@�@�@�@�@�@�@`Y(MAE@�@� 5F� IFӟ V[A_ȿ � xsJg-4e4bt +4^Xr 4ŻԼx%!]UBO))й3Ao>sf՝GK_~Yq>W 'H8@�@�@�@�@�@�@�@�@�ȵ�Ae~ � @ YFUE� J; rf^Ujْ 22 @ <XE�%H+VIST#GJݻK+TTզE,*H7Xzkxe:e @dlYE Sȿ@N^{I>K1SK\ϙ!� � � � � � � � � �RS@�@�Ҝ9?HgҔ)҇J[KFg|@\&N{NzrYgs={i� @SJG-=ex]ck8PO*C7LZ}$? АZItHo] Y �8ih\喫{4m4aBuޓ.PuƭKG 'Hk%9LS1T|~0nJu Y/@�@�@�@�@�@�@�@�@�hL Se#� �E$0wnMx!ot駟~iI-V1Ώ{<C�@:n:v]W` C�@>?b%1=6+w%b?gEae*< uΓ\S:\㮻n VPC?@ecx +(ᅲ|]p5[k4@Xp_h+~ z"&M|׮ET@�@�@�@�@�@�@�@�@� VI֌!� �@˖RҔ) @&HnkzTթ  @ qҁJ>nPr'@d, �<dE@Hg!!ٸ1MfV5ͫLzi-6m~OB`=^0҉_꧟JW\Q{E� 8_*~)Ka]}Nk}d. w%_왼#)pѣ ~*'K[K-e0g@�@�@�@�@�@�@�@�@�(_w۳ � @N;.pFu5@�(#fΔ-nUuIA H� @Y |?Hm'4~׿J͛%+CW52}1ci$h۷b[z0ȧZxɳgKo/ +ȯ@ǎw+BPzVmzQ|si <׿ۻv-g@�@�@�@�@�@�@�@�@�)@d>u7 � PbݺI{-5kyZ< �?YqxTP\8Ps9W� @w4ztuEI>'=t}RΙ?;E`T*'[LjN?2O;KA?/ T1\uUŒoE(vXj|@:$>w@ kUJӦzg<$p h„BuɷɒFNA�@�@�@�@�@�@�@�@�@�!@d>T' � P.͟y_<� P~(=t퐯ٳ8<~||@�(]å.:HZ>kKg-t;1, k*6LZf='вtҹJG]qnE5Cn/KA�7@dx >5X>u'S#X"7V Xncoݻ7ƒY& � � � � � � � � ��A尕YG@�@ iݪiysir0f� Pr7 4hPɭZAPRnA9 @ )rHE蠽L.'9] )iSi`isT@N>Y~G*Rgid  oV 2̿.hst0A +$/SOC裆]6Kk<=o,@�@�@�@�@�@�@�@�@�J[ ޾ � 3ΐ~'i ;1 �Xǎo8@Z|qL%A˖"�)Ҏ;JIO:I3ˤVF~XzAKt` CM!/zR ,б׿p;:c/ 4�A R'KZUt*]pA֑N}#2w @�@�@�@�@�@�@�@�@� YU � � WA1 P<P HJ̟-sF�(= `7w6)H+3)򿝻CLʿ}14KR=⋥  [ sr/piMsgU/9"/oU:5_Ka"5ѣPjD=@�@�@�@�@�@�@�@�@�@,- � � $p /aՅ,<@�U`ذNUaA[Ij%@�K Kߞ|tR˖ŵnԶ=6m*  |pq/,͜9k�+fM(d yP7 oG'(9D/)MX/y##?V_xaԙOٗ\RoS � � � � � � � � � P�A1 � @5Sq÷\|W<_@� |4btUu`)Sr=g� @i zc Ld 4*T%KsM7-<.yGCӤ7ߔ[Sqキxr!@d.G;NjץKk!P,wO>YFOԳ>ٓs@�@�@�@�@�@�@�@�@�N 윘 @�@50áT3@�_/u, GzXoR � @w!o҂տ|}k2O;C`f*$%s=$@.Xzi=-$+fxҬYս8ȕ "Wsc>GM3=f P/u ]tQ1֞:g+kl?t � � � � � � � � � @]2ܒSY0- � @ +mmM{KnX7 @MsJ7,|7z4=-KKK~h �JȦ8(S?fjA 7Lz;.7e.J[m%vW^ltx_1"twx�pCf\8pio>>$мt 7H\L5u?^Zm|i@�@�@�@�@�@�@�@�@�@� Y7/F�@�"pْ1ZYʛD�@ }P=zH'6X �#0m4xpylZ;|/ 2kҥ4rd@acXt֭+u_zI<Y:tS6kV/%H&,T/ H«+p ._۶=U+s)55 8`y$ik@�@�@�@�@�@�@�@�@�@�Ehh � �&J4sL͘1C}]aܹ?~V\𸸆='%4fxhN'\rI-R,_~yjժhY@l ~{C%h_uU|,@̙ٳgk֬Yqk%~ s?말t>x|WqAU�Cɸ[LC^<$-5o7+[lY9, =9!=U] Fa]* \eHn('GAN|'!s}ꫯ⣟g߅!I#jm #kSΝک{ TgQ11_7޸@4vw1?ފ~HC~L\qǡ~LSݣdH;c])yL㔏G([ =w|/_/$Cr>Jv:Tm:\!v^v_uBvj!i>P]Ko>V3*欳*~�=:/dRh,D@�@�@�@�@�@�@�@�@�( K`#  � @~N)SG?w(_~Y987U-I.=7%7ڭ!<r#yɍҾq7�&7j1y?VKyuL(_eU�lMA�(\qQ/:bzp/uc@�rpMH-tHϷ=|V!~9Wj+>KBQC-?:ŃW}/C6=]"DlǡkӦM;iB%=kuI7Q׮m( l/Q&/BB{ァɓ'k.~_Ci߾]v V׽W^'2&_ڵk{}w񹿟Eɱ'9x<9Wc~4�:@6jv;N! ^cr 2=,qՅ<&CF&(_]_?&_cTﭟgS\$pǗ_w1K/sn׮]GA@8ĄBpwx]Jn&V' յmMqUuz9(nG?_ss^nk=.]NtumuN'6N#2I<&vz[oQG`} /<SYrX->a[ � � � � � � � � �4�Aϲ@�@�<_) 8P~ׯ_ ]t@GWS ْe&o8͇N҃)g̘_!Hl>xgWXaX^zwZ}Э[xSaƅ @ &&Z[n c!' ~+ A�h\b9?=:CGUCS2Ҷm$tcǎͯ}8$ڃM<:X` >`$2ypѣ?!(3*|fB8o.;XXcg+>okzts-lXjꫯjȑq;vl۪HZqCњKm] i}ou)!cOo!m1킯L $lҏw_0$Zki6fmM6$uY.ӖC’kl>5~LѡYW|I;~8%M²| q'<w}1ci} !cu)q%) XcA~W ۬.11ɐCrϋٹPw#\*a }B)Kbv9i<iǤNjMZܧw19/ԩBtr>+~W'}>NUW'F!yaڴioXI[gUw\" 餍NhV{:Jq 8(sŸHO>Y!8׃ZVw߾@�@�@�@�@�@�@�@�@�@ W5j)@�@ /3f^{5z7ܑ2uT&d=ܝ`A.10ѡ|Sv.K}o0\ڊo^z&äIbO>>,~7):apU߾}k?#�FV.sNn\ѣ"a �GC=8+'UBdp] &!~LB럜?Ns;o L9I`;!&y}f͚C1rVty(#x衇ci1DsM7I'd+;I@&zиqBx1bkBnvqR>W2X<w8V^BcN>}q' rp܏IX.C HUq?q)1' KVJ;,O$m1ccJ Ldl>?n: ~t?3?骻u{㹿UhI8Tӵj/!sEp_Iv3kӋiSz"in}L.HO:4ª{)a?'@�@�@�@�@�@�@�@�@�@�lFi@�@�Ma^|�HL__x`)7RJ$,Uo{c0{duY;ߴnn 7!=L!@�\ v[E!#V  Y Aft @5͋<yrsY`A+ؒ\c tGjϨ,pId[%~;G磊9?йs8|k׮q֭\n<Nmw[:�jlp1�۫|MСCc|m䥗^?CC:Xkj޼y!u ϏG'~L†aG)>$!QCRM<&R{㹃<8.+I\$O㒾}!>f%Ǯ|P]֍ik f\;k֬xO>wV{4i$I[ހ6:i}RNQjI.$}dp<%+jK+I[ڃd{4@Wo+l7A6ܲYRB޾v)g � � � � � � � � � K+Nv䓻s5K� �o=zy=O?$SFA@C?.;<)upC!k0ٳg@7\lMIA6{ݺj(k>}uוnm[N: # E`ߴ}w[5\+Tܣ%n{8qoM>=XW\Bw0RHI0R&ru~ IXP3fTCdw=z,4ٓsJ?6r7߬~;nB`vFm$8s~s=[￿[ob^>(^d61_~`)_& xrSJA`Q8! K[s̩\r]!d)#[!\Y~), &stxr.~Gd<(. Vv[>?uyvG 1,K#Gg̵BvV8G©[75E��@�@�@�@�@�@�@�K ƒg � @53g#<G}Twśj+ytMM[|Qu93vX=zgMY#5k,9r1a-PӦM8g&/ a+*0jBp+R:7>_Y 6>.ϔ㍥A߾΍hfbˏJ3sdpH3#2o'k𹨃/:l!>u>WkZk-͚yk|m¥^C \ro?m5~t 魷^?^;c^vq`ބ 1>\ 0c?zpxפ eR 8,Acc[~C:�cqV.Q+a.}:9'HoroF'I[>] {B鬃\!I[ɣyK/P;zN)C{.l|wߕ\S7NZ{ƯO֠חf@�Bo � � � � � � �)@dynw@� HMM4 xEɿ5^z%=z;]v1a=жn E fSQF2Dz-FD/_}p\+s:~9XJdvѲ~i ~7GijѢE p(QVZe�B-9XΏ` .t u]W뭷^ܷ ˼ƌ:+˱ [lC%s=.,(׿jHv9D,9{aԩxGa' יj'f"/bid$�Ձ.۷Ac{JkP`)8!d27 ɘovl}|$NN餭Сͅ_mv[<:at}|~!d'>ҫ*7Rf} O஻}UA]^ʥFx\-��+ĭB@�@�@�@�@�@�@�(屚% � PXGՍ7ΰ;nmڴ) Amᢋ.ҤIĀ^-k/pƷ2 a@�z |tW{|0!kF1 @Fo^g̘!wwM}>!Cp.  g=Az2pȑ#uui޼yrC[!G^sq)?%�/Xt.ryWͺw1`_ǙqpV_s}u$d؁b&%*<lBkJn;|Ϗ>vG@;cAd ,k?W*pȝA\ 8l_Je {q [;2 w{O+YgN1~饗:+^ .PR87: b<b~@�@�@�@�@�@�@�@�@�bX,|U;u=OB@�@7ip( 7 l2dvi'n730qw[n6`{ 9cef@ȐyIӧKZCKwީϐfϖڔ,ʨyz^;FM2s{ TǗ{x/_ɓդILѯ_|ƐZ96%P:r`Qǎնm~萮M74.am~g եKrve Sh;ʼ\ԩSف8  6 1ȁaqas#e9.8ߎ-XVo ?JW_-{5OW :H4i8f}~āuxt[a֊mJ+T : РK t[`UV;`#/eI;!褓å?T8kr$EQO76KF�( � � � � � � � @ x,@�H`袋bob=蠃P7fw،<^kNs?piӦWA :`1i ,X" ,]ye٭~Ap} 7cWpܽ{AU`+S7YcƊhzg3瞓C_|^5`8lFZoDc݆7\.PuS=G5k[#R-ƍV~GƐ2-j\#GVA/\CqbK/C_x:o<r۷o_K(hspH9؃a>3ofk׮.Q[F'<ے+ݗqo޽c[?Z��@�IDAT;e˖%$W_PHv[=m4hB믿vz7K/]HUoV]M&QO t;>ҙg_Kx�@9ضE�@�@�@�@�@�@�@T,-z!� @AL8Qgq.N8A{g [( Rz |ꪫt*Jm{GUV', g[Qӆx챊ȐVk_V!Xzqi_,@9XJdP)~G=z,Tا~W\Q[lE6|sիP7B(%zxKhoUVY(֥J6LGuT >|]B9̐zr饗jw-R2<n~橧AFsa{( f͒0j(}7,m6qpq\' ^!$+w'frjz"Bqr$�qI[ou]Wnml-֫?^urs5l̑ZV?4BYLxZF"�4@9A Y � � � � � � �Y :@�@voCowHk>[;SdpH͕W^K.D-ZЅ^O �AmYE<X7O&EsXtΒEW9̡o,%R͡t>ҴiS9qj JJ믿xO>iZ{뮻6̟?_sL.s駇Ys:(tvSǎc;ݹszΩq?�G}T?F!#[n,0T wމeyz|>};w] ,볯*/M"[?N?#z7նmxNvڃlk+! vgk&vzp@R.?pNUcI_kZz6vBH|E'wg @y { � � � � � � ��Aű% �=9-5kL\p?rsbmV7s9Ͷ5|pٳs.@do h'K*&]vij4g 6"m$O3 ㍥Af Rmٺ?!z!@i-r1![oZlYہ!PcCC=aЃ�Νhȑ}yK}s}N*;~籽.`I&s{tw7P.]4h 80@n:v,�/` O׫! q嗏Aƻᄏ6d5i$)%|ԣB'nT*x۽⋱v _~alPV۷l]-T@ GSBbz!iCǻuVX <z+EuS0e*t4kXS9^/˚"�'PJ+<]j� � � � � � � �5 5  � #~A{s8ȏoϦm۶o7GÆ +jS?@ ]'("`NAP@�BpVt1Ǩk׮1b?YH!=3όy+9aM/8!Gֈ#bxaU+*`^zi-|PkkcX~˷~[CrqEdnB*@38CF_|?_!}cǎ:5~:ϻ>ЦMEkmmmmmmmmmmZ.p}0's}4cs_ʶV`GK?\JkVR8!73k� � � � � � � � � @Y0 � @1 __/R +7"Խw1OבG?7o"̑"�!0wt!pd!m=,A](gT*|Po+>zt]Hl/u/h|7nƎ+tAr8E] (mO<Dlk *G}4 8P3g,53fL+G 8qb 355\Ke@ ۷СC/oFl ;3qfWhc5+mm6FVfv(-p?>rvRo㏥//5*xi5J=YC@�@�@�@�@�@�@�@�@�(  c;P @�(bѣGk6J+`B)o&MĐgyFvm?7 k�%/p] !@ҁ &M*5  hZk-~p GG;ﬦM6ZX0]`uUW]iӦ3M7!>lj)e;ԯ_UUVz衇/h}u&l]'|R3<SjCTe @ iFӟOkzE9K4{}ݫ ҏ?mms{L2%noo# l羜t +׿J瞫ž6QwU-.ue-@�@�@�@�@�@�@�@�@�@lm@ @�@^umvjSOie-ⵡp(QB�T 4Hs" P0\# S%*t͓> @ƍM7TC Lj]K/q _�X"$Mr!?~nRr7r1YO?G?^]`3'^z% 0@{G 1!>P@�:wB΍}??wMW_}u 36!! f[;n :uTlH}9^8}=+rRFy-ʣ}R屾% � � � � � � � � �4�A  �g!Qiw||f͊tM~[3f;K.ИT*;:ׅT1bM8Q!U �93Fz5s6Kf#AL jA<8̲pYg 6@={ԤItgk饗~&LSB:oJE뮻nNo,= :dBr-?֙gc=VԴirgw'`bTS׻cBG#wF#)>Wj>3gԟ'm1?qCY}'@aÆo[Ŝuy7.`;@ zj_p<yr_wP}_tE۷o.l@iZrUc[Զm^JCiL.;i o)/^{c uq5w}<龟,Ҳt !<*6aV+Jxlk{YP;A�@�@�@�@�@�@�@�@�@, !� @|ӹLoA0gHG}44Z]!jn\irzu7)rE]Kڭ[74|V@�iM7-]W^Y!h Ȳy\~S]yBvЁdoҰ| nAb} [ \7fi#ۆ>d뮻N~ag!U㡇O<o&?>*>+"zhܶßFEV> *wW-*Ǘ=6|su5^Ɲ38Cs΍9mzWblwމbڵ3p_~^zx=ѡй.uiqoc䮻<tʡ>x̥ZJnuXC 4iD>m6ƦK zGVҏ?AҦ)/PHp{A=c3gNNxi|0vm79DЊzumL}b,;-r4o^A⿫&Lh UƼ͛KݻWS1F!� � � � � � � � � �yY"� @ 8'ԭު%\VW^:óZ/ߌ[+e5zL䰉<PZ9yuYXr>2`�p :L�@Ș Gp%˸jZԉ 2rUxu3"C8�Zrw} 8vXm9^7մܺS{yQGiUWiu~ꫯl5\)Tm :tiC P#G{<۱cG94vyuLJ` P8@ 砨-R^xᅜ!9)٭zqx}e)cOSN}jR/uw]묳׿K.+B8q|-cC;zºnN _Άm)#sKﯡC Xڟvk;<,Gt}b,f6MƩ}|.Ҙ٣B}@�@�@�@�@�@�@�@�@�@T,-z!� @^i=믟4̳aSNш#9q^57o X泞v ?�4 7 K۠eau2`R2T˶Ϙayݶm[i&og 瞱SOi嗯~"6@}ΛjS;wn8MQӦMcu=ݻTxvVم^#<R'Zwky7|S~j<.�jҤIqy\ѣ.Ps=Y7潰@rm.y\*cC]cJ+N+R_K|:J9j(7r|!=q�{Gzj!UNuiJ!tN6݋/ON*\39)/`w^Awދ^뾠f7tJ p& _꾫r^?>5a^ � � � � � � � � � @wE< "� � |zFi7pV˖-k/7e}њ1cxRK-!Chp¿/UVYE\rIuyO?>xq0tEp:v_;餓CA/2zr8ov0׭瞋7ydꫯb-4W^yEvwt)8壏>Җ[n/R<O;L[h|p;C|.gͼ@�FX@Zi% P S .XN?V#Sw?!Y*;1tދӧOhk׉'~)dMtqBơ<rK>裺uV?v_|[/.k饗x뭷 2o<oխ[7ngu0#<s$�_z_ &O.6yaMM.5V]ujϩ|8mڴx~vwFs9'o^W_}B 9O?5XCgqFD/* tLy :T^\Pmb˺+ϙ¤̛7/n^x!x|疝CzDz.sN8!<ñGuve}yۖ.fie5֣ԲQ>s:6lBudžL._Kk9-w9s!I_>o2(ާYf}G>O󱈜ͳǚcx]BkwaYSӱǯGyD^zt +Pt˲;^Rf.UVLmzgwmvӮ�T9 XhrqǃdV{@uXIrM}ϫcxw}^_t1n9._ϴڎ5g{"Zk]|A:ztm`vI/eS6tAM/@LmMY3mYS.9A&' ߿Yfch ےj;[M3Yo_pZHy0o[3gK[6^:Yb|tС#4˺f%|BԼs꾫қnIO>dnryCM=5<\rqm/S~~?.>@S3 � � � � � � � � � TKǎ<P@�@�RSK,D*ܼ 0 ]T,JRT,5iҤTSÆ KS[lE.TiM7MuYu!9ծ]y/yzCIm6nN,BpAW^q#FqTA:N0RFfm_dSdj p|j٩>;k%L&I]{͛nTA/B48MH*r=.%ܤ 7q~|/Qc;K`q!osR=uޡyO]f{r=Su}<fg{>!P* 7!.nL<ݚk_'l橋/8nZOT$ǧvZp ~Vz_-‡R!ЪBR!,S!*[B@}|/s<wMi&<z6\!N.5uYV6MT,_s*BHbHBc/s[W\qV[m_ j} ?;xBARm•:#R!-y%%@_< ~R!,R!`/ q>ofK@TLlӸ= 7q5nLrRBy a`@>Jr\|MLd_B(ZChnC@cl+Odl17!0բE:B`f64>~u\q=򱍳C6ej+CV߸9!6>W95!'u~ auGOjڿ]VNK)/?Ə_zBVUee:8$>CpүXkxGb AeX~EMٚgSӱǨd]sGN\sM2TM8cM&rC@BS8߁B/!`8~PЫYmv%sjNYLmM!m?qg\xf{Ncs'qجJsV=/PxKe}Ǿd\lnm")^wuW,pJ]}nj͹FuU/C>iRST,^XSuѧaJrK6S3MC]7+@�^PV}m� � � � � � � �$[K uA�@� wy1�|N &'xpPQFśrCߤ&Łu)phEVquqIh`  %a*'M^C&-aLzĒA:Uo*N'oQIzloe4ԲYN;OT?&(. !R@hR_[aAYegF_t؎~z b/(-ro6$%A5ǎ>;>WwWyџh_rX~vZ5=Tcp:r,so8`I~ꪫ&/c'qV=.d?|eesޔ ]_s 701}f/| K9/B5wT򹺞9&J/-z<Yn-3fLߙgY9u]7>}z帿/q_^9n}㮼qC N.f=ʅm~/r"W 滘it-|u4PRLoOvCy>6p U?6j56ph..kWl5I~ukbu),A^k\AOz%mt?z$A.9V ձ?.e꾳wX~p4<$H̙3!4%ld>5] pWgP[Oxi-]tQ `*G>"A6+R[[S9-9?ԇ4ٴR[џmY<'ͯ~iҷO_תIdփgV@n- 2Ͳٞn|?~FR|յmcWmuk1Av_X2PS}kFu$?<IM=Zz뵽۵/Y;4I?S DB) �4@!!֛e � � � � � � � @ 4 � � P!�2,(;*xps>epa)֭[+gs 7+ܐpcKyZ5\SMTtO?]h^^EqZӧrZ%#VӖ[nY9iZkUx : +j__ Hiݪ}OKGY.k\٥4ogŻ<sL˺ߔ?w%ޝw9=uR]-Rnaп8[oՎ;D!x'yk7`,+!+ BBz! .q+V۹7B]s58qBpW<<KN̯wqDz-,+lT瓩mm!Sni^˵}43-> Zo4zh 6,/٦3f̈??>[|~Ѥ+>]{Q |ۖllq2'zld|W^Ywuxk6Rp;B!1>zW_}]{W5ޝxJ^jj+ۅ;۳gO�˱&iS">D^liYc}뒔8&뙌鱦~Z25ƱۼC6ǚZ*3vq| 8'>Gv.׎}q6ΦRWmz BH{|O @?kkk_ևM6gmYV. js}V;./}~ᅤ|m颖o7ٞn} %j$sJ?'hq(<%ßqx,XCe=|AGٴIgaeogSɇVLꪵL � � � � � � � � � @!&B�@� bBLn\Z'IJDqk̘1q;v> w=xnF գG=,蛌][MCՍUVY%|UދumidpI 7d41L'K^qҤI^MQ\Ώ@r{5Y sE@B|CAZAU)2Ab2*0~EJH6}lM}ƤUSIxlzb! _馛<B띩<aiӦo>ܧ<j-}{_SBCN;ŀ9sXת*/.bmf1?=#ӌϙK_겲9oJ_nMϳ˦mi{tI±}Զ4o\>ׯ9z=k֬_]A5 zT'W-͚5|!v<n\' /P\.ce>-bu@I^3dHɴ͓V-䒕o{Lx%~ZDNM[YuAɵX1kݿC4땴Ic{{Le韫5mE9T =:=IWgӆUuLN]v/$ SO=$V[}|=rlV%۶&}ևLlL߭iҟ'}Σ?<O_V. k[Թ\ՙVlm&V/ZXuuOz[ԳX7t1Kz{ qRRs /$j]eyy(m^eCOos@�@�@�@�@�@�@�@�@�@ Ɏ� �Q794_'s3yr3kwx_~%ި:n85d=쳿L.FTwPu.7,X UV}/~)K/eD-\|_\h$C Ϧ }`^8Hdu։10>ڈA6">.pXѿ-qo-jQ +,9*?bhҤEr6}GE]s=Wjq%İ}8Ǯ̩Z&O\u3~;5q S4?9O>vۭ x}Os*[94$%Wc6M? PVA>˽A<@p ٪U+9x[lC9D׸c֢-bse>\=y睧wQQ|d۽9}IڵkԩS1ӵ&EϞ=㔯BXqm.4~Q_;M|vi y6meJ'aRnXg^u͛7uM媽kcM63ǚ\ojMI/ӦM/Xc}E_G?c nTԐ=ݠV6]lۚx|m}.\d[lVԴ쥖Z*l)ac9F'xZSz/\g<#Xeͥ#:J>~kRs+hrqm/S;Ku=y# � � � � � � � � � 0A63KA�@�XuUկ_? 6Q֪{uֺ{4v:8`8Xsqi߮Çxr\= C 7$q{#F/>kv|Zh:/./B|L3fL|:`촨7'~w9k W 4lp75˻M7)ISr S' s@YhbٸnjCɦZ<UVYE]vY =wC\N8fJM>}ďz:>t& P"`6[F5jb/5$5{],XQQQQ,PD<ss]n{3̖ٙsLY3Qd,|S8ށyLtP> 3g{{O/j|F!ÇWO|_]PH1TV_uTM4#>gn ~fu/C<r*;C^{D!q]}'yU͒v1^nٞ:0nW\qEVݹsg:o!78<6^fUۖ-[ߐzƍ[f1tR6,fQ[:dȐ,揺=[CUW]U9|b Zmմ5^>7I'ty/*ugc_Ծ&noچUe_^ypvu 'N~9;lǵ>1US(oRJab+Ά8TUs1dU˩k:^5jj4nzN2xu imuKe{z?7gΜh?}Gˡ\>ִʑ붺{>&og^w 7} 5\V6);vfmV}fgL@�@�@�@�@�@�@�@�@�@�]gւ� �E&pꩧ{3Zo&Z;ǃ;{Qh[l>; qCTzpv!Zl͢3}hx'3f̈^~ꪫFa5jTѳעy衃6nf::Ck:d~I'iʔ)Q_] ,пom6l;v>\NO<pL4#8"a [.+b䩀sZ!|Xj6O I* Ad%^(hbd|+S/4>V4cת{OmsWoڴi}7|M8$=;>ñxmQQG\zǙ pwGL={v ,arPCڵ[�՝{<s/!a硇s@SF)p2!T+Yf%5UwN%$\#FܹsW_Eq@ c…s[.͞|k[<:SϿzᇣ+8pmCh~;@4s믿&owx~'A*b*˫jW^G}4 dYsOu]ut'_սk^N|Gu&xћc _Kvn]:o]kFZB,k*m_q�gYklM{5:@8ovsύ۞x]5MS~u9PK\M]Z;Nl&!ygc=mEO?פ=V۾'gJkѯ{_롡8>v>ZA-8a7pCS֭kYBnߨ1|ryiX /NÂΆqjkjkWwNk;<!EuɯT lÓO>/"\Z"| \o&L@zBϓ:.C}j=k'2m  džmQ^iJRihknZDf*U%뵽aqmmfȆG΀� � � � � � � � � �dU tIе누G@�@~%zm3R0BCܖ[}"tGu"t{o"tO!$!G}te=TJe}饗kV17 C2]qѲBNQk!2Zz뭗qcDHΊ))yn.z>pDVH|9>$Zl9rd"%BK"t:._ԢE.W[mD^^;6ڎ!$݋fyY?1xOdyŬ<xɲ>ȓQ9$><YKz&[ZT*VwXӱk5m4:&ٳgAS /+nDlF!Xѱmڎ_}D ޽{",|y憎: <C^^sK@8$4o}P۹_]tΏ.'| }>S۶m!@5^]Ӛ~iJ弩„j*H$BTTnݺ%DO :4:g[dI"k&am&:ӟT~^J<OՋ}mBssI&ضpDNn{} 7yH#: !F9^fq=sOo[ﺆ\P:|իW"FmYuuTS|>?Ν;']6{! 2o}WMr\8J+%_:|$̚[0u .;`E]G<k] 7: ^`PS[o> !W\1 KP۾&Fmے'ƍ] ۨ-2Bg˗Wۃն.!'Gߋ>k+߯8}=[jl~ǐ:#?/;_"__ojׄ@Dvln_ ok6w|렾F\6Nu_Smks�oGmV ?`h޼y_W>NeDhlC[4"+jkkj;'jk;LL PT (u뜠6KS9'5`zC] &O{U;[mkz\LթnㆴծcFb\/B("xo>1a1 .pQsxVKۭ}$n{ZC簵n赽kk326 ]V\M4l.@�eeK3@�@�@�@�@�@�@�(&FLiu+Zey,@�gE!C RrPkzqϟ)Sh5T|_[ӱKN vO<Z~]vI!CBP N灷AB2:WZLH_sBAm:t+d>S)_sO2Ba |Ծ3ҰaUvJ@:vQZPzt,edKs;&O s=IZ#FfSj;vxWuVw2V>wC({t,Xb5R9>e|?{}I{˰黪Z<$)B2.ky ÎECTTU~@U|^FySMEͯsiӦ)"FW> ]V?=z4C^Xx<er!L!HRf[U2p=}:餓<kQ.z} iZޚ ~SOo~ZGz>eo1.H autN as > Ay\tpÑp|yGt]*mL*,0@T��@�IDATBOt駇sp㡦2RGCح.BT*CUܷT|jw4cƌ]t[cmMUߑo<uBoj_Sq%?ƾ&۸:JռǬYjfˮ۝w|p%Hӧ&!�W!4:N9A者f kkkR='2IsKS9'p{iS6+j۞>Ao&mǺ!Vrޠ!U  aꪫ$Fߓ 6'5ΝgUh7^T5[Mem m^۫x;.{C.w=4<[jsm@�R(JyPw@�@�@�@�@�@�@�Y b޺ @�2.0~xm6>|xi/DV߾OoB/j3)Fq�8ONG~LHtCa ;,]J@]B^vۭf\  b̒˒Kci Bm„ QH'pB4f3#oLm*.ry.VU<U1Wv ]w2EsH˶nx 5"Ϟgu'd{p]>}tG/3|{}4dȐoh[+GuԩSfA\sMʒv w7,_krit0]gqԚ=5.U}>dsBgz7{9k e97 k=S|  mȷ}Goh.}�:q̘1z駣vbs<߷i>-Ґlc~6lT?^4xt A[,xҸqFdХx(7$B� D~+R� � � � � � � �) 4Iq>fC�@�B`РA=zva( +bsKm۶;\6lR̙}/2!묳N-ŗ^zI{gFcY-7-*+kfSfJ@ZZm5iӵD-=$_XelC}RܬgϞZbXa/롇ҙg880cU󦊵<VʘsD9 87Գ>#F6!]֐4pwqM%Zn]k]v_C=4 (ܹXaHOH6|sz'uyEE_qC*iHd\j7S}w+3+}M.*n<>}zxѾ.jժ>4mp,裏!~owT'ӐVWu#t5mQ9f .n8>BH8}G뮻*7/6  7PsOJ7m '+d@ɓ'+嬜[mU@׊ pjɀ� � � � � � � � � �dUQ" Zcn{E>t- � �!P o]C-rg ;CK,#Gfc9Yǯ.HguV͛7IYXi>TZk-ixsW%w<4餓򵔔:i:+HlR\ިto2Jf3is1+j%9sp6}WuS|_~GtGvIM~Ex]kq5\1ch  <+؀L0! 9o`WiӦKMG?p}Ѷsp Cz~' 6, |뭷ԡCKsyzGb￿<O=?(03{wt(S!c9*�:s~! ~o,WS'&0jB@WF_yC?h=qy5ɫ, wT98筽{ց*�=T)SD!vh/MT.{%wޑVX w۷g&%i٣5_~Q{iN˦@)^Ϧ/B�XVP[<C�@�@�@�@�@�@�@�B eF�@�_>Zw_~,k /-Zc1~<Nu%#,jt&>)i *_bW]U�9cBKUC(B0RiuӕbR zp�&CaCGw}7 ٻ뮻!}u}ѐ!CYJ\%E*.\0 <,Jգ"yʼn'MGuvuלVW ߀b]vF]14!὾+W^ Y\>;w\yr77ԀGc~26cЮ]<.q5|Q�C=gy& unSBUUL4I7t|S-9pm;vL5+9' sAr+VK}~AiJRwTvIZ3RuV: iΜ\\8N@�2bm� � � � � � � �)и0M@�@�XaF:ҝyK}pC YN믯ƍ6@7?D]YŹѨU+Jl0fФԩ9*�E�||k֬Ygi뭷֪?B>և)~\*i+9e˖%Vj5#jC!{9y7 =>6x(_IntWzԩQɓmݾ}(7Ч~B굿뮻V_}GyDJ}M6: G5J79hM6 羝t駫{z5#/.H6m*Kt3޽{G6Cvsl: a^>s|lc4~ R 3KwQÎwqGr!!8SkFis^ � � � � � � � � � �%(@d nt� �1b1ޡt3`�=Ù])Kϙ;Q0]wݥnA/R^" HV+<"يTO>)}tu$@׮ T"ʂ�.ЪU+zꩧ4sL{QP{W\Q;찃.r}GNEȸ9sZ:F.]kTu]5qDM4IvZԔ4pqȑ#& 0}DK7nۀe1=S4~xM6M'tj>C|ugj̘1dwӰ6$/+cǎ<xp(6|pkꫯtUWiСM{ JFVfvކ666[ dU>򱖏|c0f>F󱚏* K"?|9~{7!С =[Zi}O!� � � � � � � � � � h|! Hln{EOO7e#� �%+'謳=ܣ~O::5uoL5kJ]s5QToۿ/jݺuA׋.3ҶJsJ>?s P mIO?] ):\$bj5 Bw {]΋]2.w햾g}VO< i3B*-2b WpJ@ |z?{lz(Aݻw/U]T7tS՚kYZI`…mt-5mرѾp;hfE&l{*d]য়~[oݾ87\֭ l:u CrrBS󱄩ߟ{վ}hks=>5OB _uc,o.];nΐ/(i*K!]~7t;0+,C}J9Bq>ܙ(e �5 o5՟@�@�@�@�@�@�@�@ wAΞ5#� @ L4I]tN:ãѝU KZQ;NGuڴiSXxa t7#, S߾ңJ;X@>Z0A![ر bG>( 3fLXwߩcǎQC`p0h -A)1Yp�ˇ~_= rgj6ó<<X͚5B �蠃|cQ&M[[CB}ʁ>^z9A݊;o޼(~饗4~x-ZH]tцn8llnKgnZ7Лoü/ի CFW_..y}f]BÊ)o?BNC|SV7"hdT4GwCz/ ͣsvc۶msTYԩ eozm4m4ynMyg}ڌ? ̫@�J,x@�@�@�@�@�@�@�+@dvY �;;DnٳzfZ_/Bwun樃2iZ{wQdȏ<W)-^dZORߒ&O鎡p.Pz .y)v,%2ߪ/;%( /i;v|޸qc:rPWտ ,<Xd9@!- ,Pvk7|n۲e<M8wy0CcHizHoobKnƍ:p}P׮]G뭷^8ֳg(HT Zĉ-n/͔|L=СCV+zi]m]rMj.9s�:]v _sس zu׍UVY.Tp'|{3fčkDq;b zJak#�t o`sB ?Ü(We  � oչ: � � � � � � �d^ @�@;>5j|ɨsN;=3hߦMJ ?;Jw}u衇@'C Wx%K@KH`\N1ǔPŋ&~paV0 *ŎAዓE2C�޽oʃ)8a"2#>(ߏ<]Zh!Z}\{jڊX}QgUv(y?X?uM7O>.mŰyEc<N0!O7oyӻwCIR1l}:0'MTE;`[ 6h 8PݻwojKᒶv߽&6!SFmð:<8Ht߾}is,l>&>s[8`قxl۶m)etE 7PK~sA¥# R#P#Z@�Tx @�@�@�@�@�@�@�!@d6Y � P;:l/ƍk-!~sU 4 ,^XcǎSO=t[.hãniZ)`./N\ @! F[}_a?ly+0f6RK y[̜;ӯ\VNG⠮8�fĉO믿ʁ]pXثW/n:0YXt>(šsq8ˇ~8@kWNx-;z-=$n?xxQf՟(W_x]r%zǢSN9E#GMg[+&9AcңȼYnkDtq<u,-fҔ)S xP1OQ:v9pց|o9�`' 7RUhҷB]p5nۨJ>y縍:u*jSn* u>Fx7Fy1iq;sg­+fpx~;V#W۪mE` l*v:`T|(f @ [? � � � � � � � 2w@�$w5zh͛7O]v[oC :W /Yq昐/G)v;r)δE~B�KW @9{H^ZERI\RXJdDYXꏼ`(a]P=9*ukW_=W"E|Fd}w!,eGW|tG=!Z~~WH;ԪU+vl9[6u? C@h?i穯ypHdn1fV.]M(0iӦEc1T<8˃æ�Ty>.ҸAjXHB s\ i9׃ 9#jVږWs#/xcm۶Qi|-[5%g؆oȴNjUA'p9眪geB=V_y'9(9&g @I [Io~*� � � � � � � @N)?+G�@�pqgs==vDl` 4hРhСC HO?7ސGwPرb 6,€@M"=wx~iBK! F dLiBwģ*RXJdU߄~h>-B�<:﫯R"Vںuk9ţ_<]uU%?gϖW<:D+N:5 rQ<k. ٳgO¹of9,!#FN;M6D G}T /DߥOtP I2 Ywר4<zy49(�!+~EY+;+*NrxXqƌ-Ê+9=(ː;f %cΙ3|̋ |C;,r2S`…+ns |SVl}K|=7D|7|sC+PW7R {z{sgӥcuVfȢ@j} Y\)B�(YΧKvSq@�@�@�@�@�@�@�r.@d7@�@�RpG/wyW[ouD`Hwݻw4:аiӦ-7o>hoG}TKlzH <XC  ) Rj?l@h"BXLVbW)оtX%b)v,%tD6sH_qǙ3g_ ;pá/z:uMd(l߼a֬YG?w�⩟/^ztGehCZ>Cn|;#<"znV>رc/m۶Q= ;C*xf%W>+q5į{L 3 [ iqCWo6 "v=ﳼcYUV<xw)K#1j~PKSF|>q׾U<8mpŶ:}ӉJmRr>VǿoFh{:4{M4ggZ]wtUW7%:tϟ7|DLn^g<Ȫ@)^*0+C�XFߖ  � � � � � � �dQElV� �4DEQwډws ;?^7xc ѝ{k5׌^{( #X!wu縸}&M?:hCzz:쳣Ζ\r&L]wU￿_~)) )Ό@Ⱦ Ҙ1Y| ]@dj@�+|nQࠥ! ɃCSqtG>s}B OVLYW;wnw)0-&О8Qa,hvdoZ!xrLl5Gao{/6L81 B/<DTRj<zn~!~ɣ5~cqTrk%!1>ω;@햃/0(<Ͻ~*Wŏ>U>qh"U'c4n\e/Rw>}Dcuߨ.sf^{-:pv7murB:BxA? Vl>>=yqiy>ތxcQJ[:K:hB-Q .@gyfx\ 9c<@�@�@�@�@�@�@�@�@�@�&(z*6pݺۍa{$>� � P_ D|I?/W[m;8~ѝ35Û;˹|wX4y6m<܉z9W믿nЩu˴{fZ,H ҝwiAwUN!Hp,= 7\1"=+Uv9/w!2J'y.pC`<Κ5k@8\ q84>mڴ^?ْ;a04ܡ![lM )?g1^>O4~Mg&>猃Zѡ-KEn5kl@Ί9tΝ<uVb,o_wy'{v%ӯ_?_u :o0m_|<x} niJOJS۸5!Tɏ*Oj-3ԣ_GI'?>ACM~M&QIWţ+>v:>۝x_݊eyn|rH)3%KqX`Nq[v¿sTܖs^'nrũlq;O 8mi|n6:q|N>w{q{ת|.ӞƁn=uu!_zy*Tiܟviz;o߾UīZIF> |, @ [mq� � � � � � � @?ۂ � �ppL:|tI)Sw,tĊ;g#3;{lڴic?wC/4~?;Ł~ɝKH޽੃,;Tx≺[]Hĺk.KS`u__/ tu}K*͘!]j5Oر Ծ4ikd,C!zqI|^_ϷhRUHLRw+j<1ǞX^W<q ]8`bzWŁ7>u N|Nӌ5Ǟ:PA-, 8q„ P8qF8Jp58�ȏ}-#:}O=m rȤǞ={Zoc@!J*N+cyk% T&Wnq4y^cOS2ƣAcO}moqi*}Oqxf<*Nǀ@uw!r¾9xܞM9k?Fxqp1jrq|v9ϓ抏i$?6'?On6:9Oe>%nV!ni|^#'Oj/ly!=Hp[yl͢^{-:<KB#'ڍɟ �&oũ/ � � � � � � �#$BI@�@�2-P_?[;9la0΁U@Ti<Ξ>t mN؝�Sn8258`o֡! O맿:2fj,8ŸDG]U \}B(~Uk.25n\ׂ#�/ Ν;GcCjp8S?x;(crpJ{q(V49%+&MC}<畇raq0Lԏ]xe!aɣ<9X>$ !>[N:imof7̙tSK}ߜڷo}أ8Zo "2%6ԣo`HO?y?N"O19⾨>({Bh!wZ~(9|,'U._>xOxxߔ<m'G UR MmXbwri<!nv:>~FW<gϫkboV`O&ϛ}vx8)Q^Nn4y3 Ph뫇vMz)ШQ4`�_' <8.e0 � � � � � � � � � �Y 2@�owsȀ ?d|<2dy]|Qwީ믿>Xnr @uIQnepˌQVJ� pxMn-NlNr'ࠢW_=sW ֌@nm۶9+}?{"b. HHE /yfϖx@6|y(.w?~HwU9w:쳣qkBjreC�y"@�@�@�@�@�@�@�@�@�@�: 4̎� � @Q 4 ={N?t{Q&!䘐B *PxhnU'騣JT@׮Ҽye۹[<E�@ :-nΜ.!� � 喫aBV^YQ+QRXo=ᇥG>Xp'o߾UP%X*Mu@�@�@�@�@�@�@�@�@�@ /̋@!@�@�r-гgO=s(}Qg'x"by(0 yX0@ ˤVZ y+ХKYѾ2oH@�DU+E "٠T@� B`By(*D m.xt [J=$stҥVa|M7魷_<a@�@�@�@�@�@�@�@�@�r!@d.Y' � @ 9R&MowQp@.`pgL <GgzM,?]}ƌ\u#�+R*ۚz"� @~Բe~R M+6<2ke]v>/,[u]WgqF4N2e7KA% � � � � � � � � �P j@�@�رN=zէO{YXJUw[Xj:eedEKmXIդ4sf j@�JJ ȒT@�@`B `3Pm+%=;9(�D O^z)%CΝlN=TSzIJoV~: � � � � � � � � �L Ȝѳb@�@�|ijv>w]fbS ̟_JX498QzYrrVUFWV؟eu @D, O@�@ g?LdYq g裥/yq(�9:TzeOɓ+JӦMuM7W_5\%% � � � � � � � � �P j@�@�hӦӄ Էo_}_pJ 3B@K>}m̓P tDdƑY @$@_@�@ l"dmEI;JO,d_`qv 72 0@'|N9}Q~Q#� � � � � � � � � c sX= � @alVz^{iӈ#7F)e,([TVi[$ B W^ݬYҝwJ'5jT}^)> oR#@ _R-C@�@Xٲe֎z!Pzҵ>?s P"?()yuYg{:Ê u }]ʳ3# � � � � � � � � � 6 Fɂ@�@�]`5\~Zo|ثM~II/pO!׶|͚ڴ8% g.JR=@� 2/6@�@� 66UV``䓥O>xhLM{__3Fj5j^x]%aQS%WZk5 � � � � � � � � �dN ٲd@�@�"6l&N]wU{F~HkK,({֪U<Fp>Li뭥V:HE©%m gj24 � � �XPj2}cI.7үj-(71QzIl#N'j[Y.kWiLiɒ,<EF�@�@�@�@�@�@�@�@�@� 7G�@�ȕ@6mt 7GSO=[O/Rz$e+3uYMdԬJi_ SW&2O7 B�N ȢۤT@�\/veE<oMzM*Y y/ХK͡GzeiuV8G:#8"˟ơ_ɵl@�@�@�@�@�@�@�@�@�@�AMx@�@�vi'߿j+r)_R<3�A(meoKH]J_,͛<<*NNٳn @ pGW(  � P|A6FXw]sΒ&Nr$&^'H/]pA }(bj#lʿ � � � � � � � � � @̖4A�@�(ZVZI?ꫯoɓ'm}Kbi΢5+e^*)<:S.]/ZRTsSy@� =̙S6_@�@� O]KGN<Q`ŋ  n-KG49V<S̮;*rISc( � � � � � � � � ��Ażu � @V;0!$ QFeu,ye֐)YR[Җ[6/s =8@�L I]� �Tpd˖_JU7vViKUz#P_x4suѵז,jnW:MJ=zk � � � � � � � � � ~ o@�@�JX`5+?r0>y数HqU_͋NԦtj [n9i=WjԨt\JqdᠥhD@�#@dzY  � O?I[:7!PgEI^uUC:Li4I?(9 K~.R k֒>Li@�@�@�@�@�@�@�@�@�@,mH @�@�LiӦCE=z^|E 0@ƍ˳RR8Y| {BIw)5JA7VKбcv;"x@�h߾l3gNTj"� �9{]#4l4r`A"!'ZIK#=4dJҾJ&}M8p)i\ B�@�@�@�@�@�@�@�@�@�R !$fA�@�@>Çׄ kRCtg1|&,ǀ@! 8o&СH~PDdokj�Z""2[#� @Y*[zG- ;| PzݻKg)M\6uaI:II.%M$%mԫWY= @�@�@�@�@�@�@�@�@� MBb@�@V^ye= ׿U/r5Jmڴ)zP2KB =?ncRLKAu ,-M@� 8| oJ� �//҂R_Wj@}tJ]w R )D'͟/#+t? __߿,(2+O-[ٺ]Μ)u\e � � � � � � � � � PA6 � �y.ШQ#vitMjPu}P'CA ԸqA"P.0{H?C FZu `@�@ AfZ#� �e_6mN`9D8Qj۶9yX~yi]FϳdeK>+]qbj!{Zqեfͪ[K_w#L@�Rr��@�IDAT@�@�@�@�@�@�@�@�@ AfCu � � r( rM6u]#GbS@!s *:EE@3gu4C rMpJQAfbͩ3 @̶8C�@�R;ۗ�F 5Ltcn%0T/6ؠlr8'H&I'o-{o7(rHd׮eUfaz=n<^Zv;JRY'kA�@�@�@�@�@�@�@�@�@�;� � @:gyF~: [KԴi,UW |1,ԝ2u^xA!JFr!bͬ@,-N}@�@ W_vrU֋@awvM}(7D;Decr4e駿~SR;C"{(|߾R~zI}(Zq{u{1 � � � � � � � � � �Y 2kԬ@�@�2[N^x >X&L}'D2䷀;-^etT'0sf;nj^zIͩnN^/oYJ@ Y\#� �/@docj>v9D6|Ȏ +He!'K}$M$-]~hԬYY FIl"mEٍ*.7@~!� � � � � � � � � �u f|@�@�1B{B>Cp Ӳl 3ZK]z.X|9P\pa4=?N/!Ht*Nڒ%KtW%jF)ylܸqs?nҤ@;cƥjbr]vBɦO~޼y0hL~Zj-[FS?: K ^(dAΙS5 � @a̝p Hr.peҘ1ea]lL.N % |魷7ސnQW/i0i]V#u{ϗܮ]> � � � � � � � � � @}HjA�@�@ Mӛo}WCըQiZ<I;??~;͛7/JQ7yk?SyS E+ƁR1~^119)(2 Y!Hr=6t4 t�er0e8.ut B/_ilӦ<m۶Ҵ]Qپ}h CV^Y\6ƀ� @- F�@�phUn<A�jzMeq"Y͌�9OxeucJ='-]sMYxc9D|A\Qؤ%@�@�@�@�@�@�@�@�@�@�L ia� � @-@{t'j|.=vkۭ[K *)e}0I z͝;Wg֬YF9s*M=G@:5& WYehn:|ZT80yڢE ţAB>\ZT%Kh!+Fe:<b7C7{ơvQ+ӕCa<z0M\¦j=_@�2!}CE"D�@�B\R3A`-㎓iNV:fE y=^p҃J. "N߶C^=o*CRnҸqeM3̃� � � � � � � � � �4D ȆY@�@�$\HKԷo_uQCGۣ4ŤA dFCȳ AuiX $/R_}k͜93G>:oC &q=(A?n۶mauIPY6i$q(fr:qPgOqzW~^նw(dNUW]UC/b֩n A*| �pC C.w8.R � @m>emJ@eϗzJ:gnUy^A�?ƷߖN:x鬳U:!"K)! � � � � � � � � ��A  � @ zիc :T>hfVDU,tPV|:Uo3.]4 y:uq1cF4:�[% ot<ׯ_J+c˖->|hڴiκt hA}OG[{ԵkWu%j޽{1NH?TӸ!W@� Ļzs]! G�@�JT \. 7B)Sm Тt&HW]%sLG@ /^:\+TaT ?oS!~R`@�@�@�@�@�@�@�@�@�@�2*W(/ G�@�@C 믿wQm{1߿ iԩl_-F_ ~L>GAzhz٭rCf(|q@[. W_}U6G=}4m4}wiժU F#O\sym[։Bj@�H@HpDY � P7H)  P 6N?]:di;c!|N O, <h쳥Viu. ϗ~[wڪU@�@�@�@�@�@�@�@�@�@ ]AK � � Fks={;5r !rt|fѢE5i$M<Y|Iܯ͝;7Gy[ouqc&Ϸ"k6$zݻwzu:ԩSG;S8ШQ#u- ٳg4]'2"PD� W v@� K`,i ̔|8 sI([[@> @}tu1H, PyqٲO |E  � � � � � � � � �dBԍLL@�@� о}{=Z.ꫯa,tg/ cK,{=y>ҥKC޽{ae~i֒z衦MX)n ,ӧO4Ve?O?BO|:eʔo AFiݺ W뭷^4vҥEk˼(@�(N-%ssR+@�Av?$[tҠA҅J^h5 P@tnW7~i+ JjfOn҉'.:@�@�@�@�@�@�@�@�@�@�t nQ� � @7jԨ(T#ԩSuyQFi\ @׮ҴiuDa̻`z5~Ih"5 =`{u]W￿z-ZF)% hz0 +.fNHG}|*͘1#CQ ??pБ|^{(HⲲ<M}>@�R> R@�)@d6YW {`SNvQZb)Bt|7&&ңJkvIG%-\;o@�@�@�@�@�@�@�@�@�H�Aey � �d@ଳRuᇇiQ8df2&Y@o o͕/]T{ף7ވ~WJQvI'~Eu|{R |ͣ1}M81 V;v:jݺuw6x`c.]?Af �$o � Ap͟/uhJD㤇8@z-y8D6X ?i]%?~9:!lmYK/I~̀� � � � � � � � � �dJ Lɲ\@�@�,0rH^=ڴi浰ƌmz…7n^ =<:�r~�6H{6pC 80W) )Ю]Ja<yƏ:_~YW^y-Z]jȐ!:th4ӧ5j;r֬#�  @�Ȭ̙e'2,47n,3/.zSKJQ \饝w٦uו|&8z4A � � � � � � � � �dS lj.@�@�(0|(A[l|IuܹKupǯ3ym9=3zgꫯjɒ%Z_mfr覛n5X#{bM [NxxD"/ֻᆱcF9眣Z;v OѰa䶿{itIi_, D�@�AHx@�H@| JXGK?Qe0UGZN"oCN%KD@ $(*OTPN|N3{FPTșT@ńdI䜡8lݝٝgvf:TW}{fg+uV( rY3kWwNr�� � � � � � � � � �*cOA�@�@�Dhժ۾}[`A"5?ڲe .-ʆ 4fOժUSvkuz׵n:͜9SÆ E]Dd\=%JP6mt/ ?5pgy2d&O]aV>:( �\ Ș�@�Hqpd)AJ\JҶmQ@ , &M=C? 5lܭ.� � � � � � � � � @R T � �M:xoRϺuZ/,hڵ1b:w,kVE?_3fУ>?TR7 @D~.ug=Z 9{l]ve>}t{iϞ=ՙDqcfc� @t'!� �VJesȏJ6I7ޘZA ǎ;.wפ*UJF@�@�@�@�@�@�@�@�@�HT un@�@�Z>cwqԩ(о}A޽[oz)k{U˖-G 袋|HhqQG!C裏>O?oNF=O5kUW]o6׭ 2d̀� G l � @˖IuD81!@Лܡ8 .~ij1!$ƏB 34@�@�@�@�@�@�@�@�@�B ȄXM4@�@�ʕ+N@={{;vl24څNj9TtR|ͪ]  >ŋ#cǎ*Z]@ /_^\p^}UYFÆ 2%ԶjJ>vQ?-ejǎ&g"@�,`AyvfD�@�A a"F#@ܵXԷ4paC`&H c ԸrhJT@�@�@�@�@�@�@�@�@�H(RBjuX@�@�(Q^~ew@H9r1$"4gNTʹ9n!֨Q#M6MO?~=j۶m0RCts/_?+6mڔ-AZٸ1t_@�b%`A<Lp@�R] 2_?O=b*G�8bI?/a݅a4@�@�@�@�@�@�@�@�@�N Ȥ[t@�@ -ܙ~|S|R*ĉ[ҥKucN&MoIA�ؿ4z۴h" 6Lo6l_wδM+ D�@ 7ieݺ=@�@�+lA6\Yz9i3HNå-[^{-9H@�@�@�@�@�@�@�@�@�@&r͚5~AyYg顇*|ZN;4#nDC@�@�dmB0a4h> .=裺馛@OY.3Y#\.8#6A<͛k֭={Eq(ZMZ|y3z|饗t竲1Jf30&ЄӧOםwV3/u]v4h⊼Ty,8s#GԳ>-[j-#yA� @TJՕJe @ L2E7x6mW=ZqwJuIk>9/еt;U_5~Tȟ@͚ra܅$F  � � � � � � � � � uB ݏ&'wѶmƒ ~5k{c  � @ۅMh=^x,Y/z1BC 7ܠotrpm_~eAc)s.Qt>Dڱ#z-^=%L>z7[oI&[�5K`՚:uoHfk.{ڸq-a 콝ٰHۙjYy~^@5|P ҫW/͙3G}Uem/j-bځ�  RAZ&bA,@ s?^xq 7`;s5ZeFC~xa.rK`Ya/P[ر#� � � � � � � � � �( H駟pxƑG+2z=RMŊӂ |8DѢP  � }65¾,/m?=SU;0ծ];sq:{wiP4:t蠒%K0z mėFپb36m6Kfrq*lXyp@ǎu%4<&LPJ`˗cQg@~k! �@�0ʕ%;n]<_̝S#�] >.UVy0Fsu`ٳ׻\.8d|T „检HQ(WNzEH>ժk4@ EH}"k@�@�@�@�@�@�@�@�@�@  -oפIA{n4f*PBX@�@�RKBHemBk[z.a矯qiѺ袋wޘaÆ[ni|35N 7oެΝ;˂CKid<H?3ۧlA dÓ|PfjaZڶm?\'Oֵ^i/ҥ%DA�@ *Ř*G� >uS9q-`*;4\[qyGLń$pIҍ7JKN1/_cNVS'.&-]D�@�@�@�@�@�@�@�@�@�r-pp E|/R/~ӵkWY8Pu=㟇zWrJZӿ(YF={/_^_|~+nc>sO<ٳgܹs4[֟'|ڽ{v`Xċ/*yo-[L>kr!_z!_?~>ŖUbŴ<@�@�RA m… ;sf~_~ѠA`n&j+m¿D[5e}'~eʔw߭F+ۢ}a]kues&nWP�z衷~[mc[cQ,Ͷ*9jx޷VڴIn{?-2dJ,QFlu9vXڸq?pҥOW_}UkV س:KrK~Ԇ ?N8ohTV[~{>|~GV}[>#r;vԩS}?+Eg`fv#]7Ν;O_˖-u5ׇ-'ZB z)&lcV,C>[]⡵GUntu/6kժxK}5o؆ݻuU\PDA �bs넾#�i?5]^|?2tPAp[;hƙwԶ_k%]guϮ}6VUpǪʻu"3mkJ:.e{Meulk%WIz=+]Wޯ*+8GN>Y.zyx-%!� � � � � � � � � @ :uv{b92p A e܏#<4iR`ϭ|g~Xݺuf͚_~yPRl_}fѢE yqz?my{lB:1c5j/^짵etG}s). (p' \(nϞ=I;.H?w'A+WN׿5:?#F\ЎӦ � \vNۄV ^B6al]v\Ym~/ӶPRa.?֞ի۶m \�dТE ?wܑ6Mvۄ9mUR@\eBcTYeUr|<| (U*~SS׮](<_P3pJ*ׅ~z#.L{پK.m xMk 8s *TG?ޞo޿\OqOXhɃ>#"]͛w߸`޼y mt4iK?0H>3ۧlXnM6ui̜9�]oG{ ,n_0;NGviڴ_ުU+'0ua9WXv<xpUt.43pmh PW w1mT*vCvkx{;;ASR] P_{|i@ }?rdmxΝQG CtѾdw 0}R;﮳:fc ̮}7*ʔioi[+|$ǥrzMeulk$+>d(p;esޯ*W S@ZAp!݊Z~*O5Lo@�Z@�@�@�@�@�@�@�TpDXd͚݂ҥK5|D>}ci'X}aÆ,J޽/kٯ-+h =gڴi;_x𤁵ÂW?̂>UlD ' AZ?t$A=ӧŊ .]6NlÇ  � O?m+m·~o'Hd0m 7mN9$hذa2k҆Y\w}׷5<,mB$ִ;B8㌀衻2|e\⊠jժ"ZO?A9} -[̿,$7n~O Xغun'Z}´ygD$˲[%\?,A[[2ۧlX$&ܷh_z~_ɒ%i}B@wl 3: Aڰk&| i,`BLh7+y 3>Ov!o&|lZh<p~qBi{Y(,47-';nyw4i-@ 1A丟jl:i'  oXbi�'wcix<]Vwnke|$G5ݱH F pw]�'_}U_5Qv}0;~֣@*/ Z� �߿e @�@�@�@�@�@�@�(. !eǎڹsڵkw@.?;vlp8>ZEf,_\[lѸqoʝo RF|rmZ`wիǦ.2~ݻWF^z%;'mVԫWO.8H.D^ZcƌӼr!r'@`6С  �  |u}ۄfvaVۄ6}$\YmVPA}ŋ'XuiۑG )ۇ.<\.ˏ?&t5zжm[@6}wrAre^WK_%sOmυUcф BuUW.+W߷l2ܤIwy~h*S̙߿._O=,X ȗfX[u6oHK$,˅%\܅>D>p!㰰cv&\_~Q rj:vקkw=>]A.tJut܅t7S@pHgʖM �I.pҺu_{$9=@jڴ9q:<UVᇲu׎Er 0}h}w1Hڗ1$…RubŊ\mkeTk$ˊG(pm0@gm~͝-S# !CfͤIbQ;u"� � � � � � � � � @ D=rޭ2=餓 AP S{woӧ맟~,JxXD5yd?ϻCI,ZЇ;fW#GT͚5}Gz?…ytMU8@�@ eeMh:-<_mB6Wx mވ#~o^ׯumg'x[�xV%mH[;- g͚巍mťDݶXyn֭}hǝӟYg},ǎv7nW|P'|oڴi9gDfu_OsIEv%yO?.V3~Y2>}u~\^?X-J1<.|><,Zr~&/8/y^'Jd0�$@8Ҏ[ wp� ?={v?'Hq:.}h}w1Hڗ?]wJwN_0qlk5o&Yv{xx%ugΕ͝ W~_W S]3K.얰|@�@�@�@�@�@�@�@�@�H&A-Z|g8vay5҆GrbAAٲeiӦowA3 n 0({z!rgڵӌ3|͛u@k=e@�HjH /ۅ:cզMsN*Q?4p _ncUZlI&nݺiP{ ^}kr$.I0ػwWdw|-ߊ{ldɒΟב/۽{_~]v)1/̆eֈ&yVreY ˵dɒ$X:*{_hܸq};PKq� 87_jժF9gR@)~j^wYF}>~-쑚4+Vj[+Q_9wiY< 4ibG47F_#weJb)ஓٳEbF�@�@�@�@�@�@�@�@�@�TzdRzO>�o~sp@NL4jHr^uM>=mK A׮]U~}=#>8w޺7t,(2bPzu=Z= ǏW֭wq [n ?@�H H "!k> t뭷VZ:۝3qDݽ{lQvۄnvQyG0˶ciɹB ~*U-ނ-r媫ҪUtk̙~gʔ)Z~}<yի-Zhر>3pV˕m۶ߔeEψ:uvp yC¯g{mfl:aY1j`ϰ}feʔIۺނ'lڴ)mZGv ,`7^"wv}t75.@�d(QbҿժU+̶߭lD9@A�ȫ@j I}p[q 0]gu.ؐ}>~. U:ڰaCFWZxvSN;/Sdo۶0Q6"L X |T[^#� � � � � � � � � @D=tZ0 pyUjU|~Pڵ}(9Rsղe=Y|fp�S/@ǎ;aÆjӦv͚5ڐ-ZT_|hϏ:(tIPqwrf?,}䫯CPlD=O<]|y:33+T? 裏� �@ۄfʂ-;- m͕6a+V!lg% nvbmH[_7o '\f|,fh7?u.-. &8l_?w}={s_KlM|I rTm_[ֵ0嬏V^yM0A~`7NfJJd?_v~t"PK+-+:p@MvFܔ_~O|'?6M@>uflZ+٭kO]?nMB}i߾`ic ܛ~a̎W^" קOЕ+WꩧraI&U~WSO=U?xڢK M{@�b&ЬYsWwuG5Ř*F�RBS/q? 2ۧmnwYFݺ~ Dzl>K~럖Ǐ;$矷rǾ#kֈ+T"`צ /kv � � � � � � � � � Q+u aÆeʔ .+. $pair! SL 7n8Ҡ\r.#p'il߾=p'(Q;#g}6m.!8}]a/RO ?6Zڵk` ; \MpW]v n`~?<p' 6|\u@�HVnxoEMk׮e˖~z/Ym]V\nZ\sMB/=׬Y{~m΅..m[<̙3'p'.,paQkю;.]:Xn]׊.IPVݛ<WԩSpa.L?bFn_{.䒠[nԩSMuzNlr?{?c}|' M7.{]H ea,\0e0S` /0pAgHB"밾|Ɂ 4:h؈#" ̸Om_ dD҇L>jժ[ʶ.#Tl٠x5fl.7pAӦM}błs=7pzal߅F^zOa =5{_qvځ7 ^{-8 QG^Z h|׽vKO>BD!hk"�'`v2p3S>NxH;jf;hj4\wɮ}c%Drl>kk$kǗ(&M]_}Ud'W_ u3ZmIɹ& |V"� � � � � � � vptJݺ-{߻͞=[.G.㠅]Vdp4`֭駟ԨQ#&?h-jժi]\\Hڰ .D+V H? J?) � @* }<iж\�\xAT9ywkrrAiʸ6"ÃH mnfXl̞Κ5KvZj% s'1Ѩ7^x1ۤE5Jxu]wO׃>&M䭲(εsNPO@\`\ OV =m;ֲFDA~?#Mp ra~]Bl:ܬhv^Ӗ-[>.˖c+W4C>X/v\"ksǏ/*gyF.g_w=hTJ7Z}N N^'vO_]vbw֧ ֥vш9RDg@�<.R<i?5>uncIل>w=T5*t݅FԿМ5ɱh5NAwo陵3~Yy^)Lܱ ixhQ!'ڤg @ [#Z� � � � � � � @ 42Y � @ 1&0%XEñ��@�IDATzˇ[=.+х6Jg!=\ZtR*y^w6?s-Z͝>l駟R[l]I&e7Iƭ^Zݺu˱!Co߾9N rZ7Z�JTr-0vX{u-|kfu]zl4qbfcSoX*XJd9-- \mխ{:tؤS߆@� X�$Рt塋,/2b@ :hgO�(ħ@׮!HoKVdYwHDKĵF@�@�@�@�@�@�@�H|PIM8n:YC?@�@�,,3�㬴jJԹsgs97nJ*c+ Ї~78mx^zDIsVx@B+{իѣGo{N:$ 4H{+uX"`=ziӦNYLlGsdŊu뭷XViDbZxqݻ7.DZX6 ,9@;|pm۶MW_}zY+EJ.;� @TE4?<whb6Mf u q:uRժU ,<۷KZ2j,TG:ug )QQ^],r:jڵk4ޯi<CϖnYڽ["Lq@� � � � � � � � � � #PąjmݺirΤk?$C�@�Z`%tb5kjʕ^Lo|dǎo2?ɂ^y{z7o^g98`Sװ'|R#GT"Etj۶m}p .YWu;ەRB/ܹS&L/,[\@gHERBZ@HNiǫ^{M'ymY)!`AFޢwT71M+Cdڳ%P,@  %{O?_x$}͏?JMH}k㵽.~k!upHgKz`/tWs@ �ęERF'H %6x>6Ԋ� �߿E4 � � � � � � �  Ѭ}8MUB�@�K}>.2 &V=5qDy>5_Divޭ^xY8`l@F Xcђ;3*^zz4tPԩ޽{ۉ'EFeyVrꩧ/8`J*'#)X/u˖-zw4n8> .;.׋s=3 � '{i4;3!� K s .0wqC3fFA� ZB,*jJSLq]~0@ ANLd2� � � � � � � � � @ ) � � m۶{ァ?=۷O۷oc=N,>\\s:wkԨQ@ȧc.LFiݺ #;sAp+W߮3gNS5\z嗵f͚|.)K.- ~LlN�&W9sCOWժUuWlٲ.5ZJO=A"G#� [Cql[L � @ ̛'qT<2MbEiH iIρoٲVX8g 0k9M0ͥ � � � � � � � � � A銡Y � �@@O<Q}ѢE4|p5lذ˿I]&Z e.q;W^\Ak[ 7ܠ &hƍk5#@T3kG#Fc4qD~խ[7(Q"_v9*V,_U03 � 1"� �9 ̝+5odL�(஧Z.j?1cy� %ЩΝ l� � � � � � � � � �q&P<Cs@�@�@ :vqƩGjѢ VZ0~R3RϞHg۶V\Y}}.o?{駵w^uQPOYFQ;(g}5uT}gZr,N]wݥ XW^& Ȣ\&$/t̃�  , � @fId1 7v(wm (~YjfΜN&GA�]r'\i0 � � � � � � � � �ĉ�Aq"h � �*pg_W>}צ],񢋤+̑, Jbt 'wܡ;w/ԧ~O>D/nO4mӦ·c=Vk.& RRBZG_kڴi>r;[N:;S'|7o"Eɂ G@� dQ,@�Hj-[E֭t([V5J:ţ+ZҌ3BO� 'PԨA&ʣ � � � � � � � � �đ�Aq2h  � �*ЫW/ 0`*TԸk׿%utхӼҥKSO7kqɔi7xCCUzuwyks1Dԣ>ZGyJ,Y8g$ƍ5{l5}t͚5K;vPr{̂o&mAFWw{ƒY& @* Xus� �DWむ RhNi3Bq-[nRb-piҤI^ #� � � � � � � � � @2 k!� � E /P[nW\뮋b[ݼԭ[?ZX1Iv_}vYXw}oV'NԿ\]Txqi͚5MI&I ,ΥY7oU \|gRx≺ktqSѢEmNLh @�H6^>:J@�@� Mre^/@ j;@_iذaMv̞�'Щ܅m.�x � � � � � � � � � PA: � �$_ or!8p`´0ڥ4dtRr!p̗ٚ]lYuSݻW̙3mܹ=z-ZON  #H5n?%JW= -yf-\P ,~Zv[9w6oܽׯN [=;vH*ui @ XP � �S]E[fG�(YRz%ti*-v .DA� ={>tⵟ#� � � � � � � � � @ Y � � P7x,/, .HVcG<YKKTjI-^`y׮]yɂ,oڴi>$rÆ ~YN~jذaڭ^z_, [nҥKmɒ%Zxq͂OXUHխ[ׇlR{ v=ҿOmXd2jڋ� i{kv#� @X)KkhD*Тt]Թs3|ƌAF tę@͚rI_}Ed� � � � � � � � � @0"� � ??e߇A3~-)QB3F:i`驧ⴡ4KlX[ƲvZ-\P>H+Vо},YvmYxY0df;tsr%i&/|roE{l2~:˖-J-Ĵ]vׯ45rɕ>U|Zy� @L,Ҋe,M>  � @̑>33 M7I4p`)w b*�ȕ '],-W01 � � � � � � � � � &@d@�@�@ 7<nݪ;ON9̞Ӻ 9)#0'| UVڶm{P-oɒ%>|-,(Y*PRR%ժUˇBkԨjժzܒ-/3lܸQW>믿jժUZreΝ;.^=YШz>~>тIJefBT1}E�(L Se#� @̛'%n,=F^|QjJjРfΜZ�$hFz$A�@�@�@�@�@�@�@�@�@� Y � �'3hÆ :5ydw1g紖=W2Dr裥cio!|ze}/0~xΜ9>o͚5`lٲ:ԥ Y݇WRE+WNYdyŊU|y)R$}U<.�={hK!PGgIƛok׮M{ٺ֬YS-[T.]|ڭv>PiMIشIro  �">@B@�@�$kSfI9@E,8ZݏH&)`AUgRݺGz� � � � � � � � � � 2vԌ� � @ Xѣս{wuUSNU#;}IӧKzIӦIիg;yJ,] : ή[z,$0N A X, +T*{{|!l|yreneʔI{lO+U9x-nv;vٰm۶֭[e-[c }&<h6OflAvoM4Q=-3hN(ypo lT  �"m#pY A�@�R૯㎓5W( I>R}ȭsr&poh:+p챡c}A: � � � � � � � � �US*| � � J,ǫSN:3|dZFX1פ6m?QCRr!`UTf͚E<nذ,0J>brB ab[D i{ކ٭{aoݙvofᛵ)ۗvPs{lݻwp̌1i37ڰpЦݧ\%͇R0-^Rj<� @Z�1A@�@� Xg}~D�xS\zC.Z� @d_SY9D>S"� � � � � � � � � �&@$@�@�ȷ{:餓ԵkWM2J.P&H:HH"䌈VVn|ha۷oOY8Ν;-hÏa{I ` ?Ag wLhD!Vu#1T2S\%ڭtieʔvouQO`͚P LuG@�DpA&  � P'3GBm G�( 4n\FÆEIg-u T.fA@�@�@�@�@�@�@�@�@�@ $5V@�@�@ SU>Љ'={GZਣ7ސw}4iʕ+]&MN;M}x7Ѡ8X: d @ ELM7@�@ &|#뉨]TO PII\"͚%UX` / v}˗$3#� � � � � � � � � zES@�@�b%P^=M8Qsy睧{jQISgH='=tI-:R;Jd'RJ` ;2TfVS0@� }SjD�@�+vmN3=E yFڳGT-}D ,r&i=B�@�@�@�@�@�@�@�@�@� [_jG�@�@ 7ow}W&MA oU,PԳ'A0$RR@� [_jG�@� ȶmT#Q8>'@˖RbҌz� � � � � � � � � �+@dz4@�@�RB;7Ԙ1c4dȐs~;y5Ұa_*ozRZ 2XL[7q E�@ VAJz@�@ Bj.zJH=Β.Dri?=F J5M^v@�@�@�@�@�@�@�@�@�(  Ce"� � ]tы/G}T<H 8] gCA{_'5gJeJo<{ŋ  �D[ hR �ҪUI'J''Z$Kys kZ@�@�@�@�@�@�@�@�@�C X@�@�۷z! 2DjR1ڝ7^,oݺh/REtikWiT1̭O?Iv.G�@ AϏ@�@ uL ĵid(_^z}u( @A&ʢ � � � � � � � � �đ�Aq2h  � �(0x`]0`&O]zzN-N8A˨/ SDswƍ)a@H 1"�DM mdUIE � @JXdR)]:@ zw*uIK,G ,riބk: F�@�@�@�@�@�@�@�@�@�B Y4 � �"W^6k֬Tv٪GH'$ygOd#Nl$;&M �D] -rÆWM � @R X)$u&pR%HvA Ŀ@fݡ 0ki! � � � � � � � � �ċ�A&h � {;,#|ۺ5ԑM A5"EhԨQjݺue˖Edzu'yDjFd1}@ŊiIEfKtٳC=8D G�H4 2od,hXiC2E�ȋ{  [=v2<|o4)$rT LF{ȫ@rߩ|Z}WӃ3 OiS}s ,@�@�@�@�@�@�@�@�@�O [g@�륪U*U~]rIysΉfӐB(UƏʕ+0ȍ7В tw裏>:`8OA35} A 2޽C;vD6=Soթ#YX(@�X M| (u$uTԮ]hi]ۢt(Rj "�${x<l*cvL@ |dpm&Zi/U3nE??T>VofC�X-+5h@d,l@�@�@�@�@�@�@�@�@�d(̝o � �^=QH/i"*U{O6mg]vN矯{W<LC䡇K'ʅiJӧK͚I:fI!VΝPj/jdL� @l_dIiP¯K2Vjݺes@�"أ_pb;IA L @kP@ Wyw&5*)AWH{Ν  � � � � � � � � � Aj � @ X]NAŋKcGWN:> r̙߿֬YSN9Ecǎ ׮]݅&Qm7gҷJ+k' .^D+QYSj^=*( " ]  �q.pu97p3r)@�J=1t($G.ʔ g6b/駇 Uh|yfFAΛ@�@�@�@�@�@�@�@�@�V Ȥ]t @�(޽bŲ^UT)izG},nM6uj߾}"5*Prc{_]xa(r$aCi`V-䓥>\@ &`o-OF%V, ȦG�(Νo`N 5,@ Yأ8SH4~.tI^ȯwI t_hk,~G PKJA�@�@�@�@�@�@�@�@�@�" 2R)C�@�TBGOtV@1wf~ɒ%yfN7M!~<^S1c5kW_?\Oʗ]s7H۶e_cS.֯LIѫ |d'm@� x\{s{Tb� @$v 2}@Vy, ҎaڱL &0qbBK'h- W䮻6mBrOY}>P@ ~ח6m6n6@�@�@�@�@�@�@�@�@�o<Z� � v񙷴T)鬳2  No%.\S0CfHHlYsC7a/ݞ{NڱCC֕<RjDj[Æg)'`[K&~zN>5#�%wjL� .]B\K`0@� 1H;sY9؅!!`Ao;g}1D�+Fs6|qf,@s;X&@�@�@�@�@�@�@�@�@�@�(ͧ � � нd!tKq;~98-SG{Q~wLC M{ ><uPb# ۔|R+iVi|i8i äᅲO3 gc k &O֮A'Sfq&Rq(� F>dT4o$lĂ( �WkرH;&8;IA v풦L K^ȻR^9Ͽq4cF1@z,YR0c) � � � � � � � � � v � �+PtR. ƳXx^z%$lDڴiS6S1*7cg-zgIVI[Hӧ˙K^*ծ-M&~ԩTTԵtmرʕY:ƃK6H| %`СZr@�RUB3Ok*@ v,ҎI/vҎ] &ҙg&Zi/GREbM,c߆s7?̋@tʔjԐ~9R � � � � � � � � �$�Aɻn � Pv=.bENP=Pg 6ٳ㏫|$Ewbe߾}=ztcMCZ"XD~E(4pŊЉCHիK&H}"7'_f+KKک3Q,�vŴ@ Yʕ :0-x<E@,,ώI/v̒դq" L(5k&իH -+Vj}pk^ ~%2m@�@�@�@�@�@�@�@�@�@ 1LD+@�@�@ʕoy\pA'>RQjwϺUԥd~=SHW}][: Q9sCIKʭGV-M鮻 4&@߾ tyB| y$)* Wn7@T.ٵk �_9b$Ӈ 1KoK #`o]βY*ć@ҌR'S;((ג%l� � � � � � � � � �'N � � bŤ.$={ /ԐUTѓO>YfOPp sշ~}/ Ǐ?֭ w4lX(dB!{Lڰ!NM3@>ȷ$U&N<3U{O@� [^=W/woh@�KIڱI+i,%DX0tQ=-P4r4fd-8\ާq�-Р ,@�@�@�@�@�@�@�@�@�EDi1D�@�[}?ɺF 餓ⶩ4,7o>H&LP= > ;[wd&P?H<#-_.RҝwJ&]r7ɰNB' Y^ ,Y"͘!uV᷅ �@ZVMj, �DKI DzcQ୷ʕ.  .fΔ:c =c c= @�@�@�@�@�@�@�@�@�E DYS@�H�Co"E41nzQʖ-ŋ襗^Ҷm⦝4${bŤΝ#_~~8٦M(pgl,�͛c,_K+ދ2Z� JղeݺR+ @A 1I;6i.Pa,)$!w4[O@ VIӦI]ZvF [ -[r;'#� � � � � � � � � @* p@*u� �R`ڵ._6W·;vhi{kŊ5g䒕*YdCQʕUJC=Tul'^ No݅ ƞ{9u]6m۷of-<r߾}ڻwo}!\bMfv_T)+Wο.>[ ?"-R"IiU=K %J"lIeWH$>s{n{νgy9yl~̜;a LhMۦN ڷj�UEEq+n\ [) 'ҥԈď6~}567l;dF#2wi8&Ö+WsvC1ݻ<g>o޼v=5˗]! ," G}kc|{/ҦۚPmپ4it8\rtks1)]߻vOk_hcGN%`1gp->)" L4OxXxys_]ٱ=crc훹vED.J{ J]ݼ-ȇ$ @IJUV4V_~ 7N,u'Y+ Z.N.QbyXM d]v IRLQv:,}v+YW'ݻw[q~)4ʍ۶mKeY۹s'g7sdAR(?Ei{_!cOw@嗢bŊSOE)3K(a(dֲ%mѢ4A=ʕuLB9?@By+Ob1s&яK1D�;vmf scn+EPW˷M1nnmpWx%K0" p)8$+{LAcs0_0W2<ˍ o � /dYn?lD@D  p]߶;=qm Pwhg|]3(翙ƙ֎׮_+cڙp]3m$ T% `Ric8ɑ#B�#To-uKnǴdh\ɾGBeLefǚdm>cKF{H`4>mpVMt16o3r"A8L/Hi2 Az(m" " " "xb̛7n*y(HrʡYfd* [P#7`^'afNizs\[.ׯo _7KYV^5k`ڵv۸q#(IDŋ[DO9[{|rhe˖M~@N^7pR&'t:}<f9?1y3@ N2kF{ x4AHC ={{[”D(N`(QcǸ'E �0>і-[(+ $:v+R"w4ƶt|+L)(nq4;zy P*߳>,|'j /f,]QH-j{ǻ߉D�3j ]=@6WǴ;㸰a}=q\[8cz-mPX1}q퍿m9mkc G1C(ɱRp߾hgm"^oJt+",Xvn޼n[`*7co�-&E{+ZcҥK۽+t=mF;s~{1IX!WsNV6wh7mڄ~)&wlS$w.Í vq }Hps1M<9Ȓ1柗^z=`<t3&MD@D@D@D (^7gL4 SN… dN6b:uPJ+HHN*$+Vmɒ%Vrҥv2'37lLm6mڠr^Ivʤ]UVA;➓8qtyFr;ӭ"ݍң!, {bk ttH3<ӖikDdt+W B~&p}J2̯53�}F;6jFD_o vL5 ku A%+Ç|oM<^O1l H pn!B!tⱻQWbߎ\ܦ;('Iva@WT0kywOQc%z^-JD�iW\w{𣿨#ő\ok\]{=E)>([|]ko\og{WЮp! ş�5Y7@�ׯ_omn9vO;6;rw]BwO;H1x#?=tE8=m"]N=mȱ}I[ABߍ zQSN%`4IׇHzXD@D [ly+6H?:!1 L>{WhbƍQ^=P۷-1m4qB4)y]vIu\`xb,[̖-FIr-T*Vh 8 +W NOWQHsQG*5yUի1Z]Nq &xq�{z)?|Z$ 31#) /0շ;`l&мSR Aƿ܅MD Xd>|؊[alܸnqEݘ)+=E\A& O[|ǴOr-q|qC=E]($w7 ȉ$&׾pO*9+JEѾ@6Ƶ+{# S_{wO{hC\BK\=q5*m\љ6ctR"իfbLh_}>Җ쳱n EaH@wc+ <؆ d[Ys_sq9'`~.E^y8Rq>>+" "Y-<@$:+Oथcb̘15k( Ҿ}{m @r2R2: Prɘ8q"[x≸ Э[7OƬG5O$9wmҥv[!)JXjUs9ŷAa!F1N R(ȑ#ĺuaÆvkРD=hS oL2 BF;LF +n 4 JTX*!HRhm۶Yn7 CB+W.+N! %|)B.9  Psg6۷oONB%($s ҁĜ�h[VZu0޽{Tpa+6D!>WPJCtM渲q q"h,=0EfJ/P/}XD�gpa%w9m_shW]A?~".AD8V0klQ`;]"igy],v)ޞ 2P1dH=9NHSX" " oodX*$9NFb ��@�IDATd^}UL09ѡCwDe b~G={68몫B>}r pr7|ӧۍcEׯnkFJMPt5Vكŋüy�*'R 3n-[L؉&;V`&J2Aq*{" } Ty78TB-L2#Xѐ+VXm P4+¶)B#!wdž|@޽ۊuQ'asS"7qEJg?rʶlK'J/H[qEQ0Ƹ"U5\DN@B,hW|m #]HҶv欳β6Z'iP80|8p啡=#_"؎"I˗/oi&mh?woe˖=MǼvt{믿ZAR+YoqR]`Mq|y1ڬUh0 8($eHr" " "m-ڄ@f$]kTC6m뮻 @͛)m8 yȑxDVZo"Mbc<y2 |v 'ƍYfLQQ{.mٲfŒ3FHխ[ڵCǎQN+Y^NA~;M!sbj/M_# 3:ҮF`ছ`D;EC{&}R A&^D(dQ>lK qŊ\ˉ@2عs?)7Wdʕ?moE!>l+PBynzj2 PD *kc(PEO? 85p WP JĚCabXmr(F͵1lIX;{ o_ `t&Lu둅 bѢE־R�.h>1XI撑xy8&NmJ{Vja͚5QV-^o:rAe`K+8^/֊WD@D�o*" " " " " " " " " " " " " " " " !xW" " " " w=P~zUrl:p_~^z _}ƻߨu)u n۶ Ǐ)SV}hݺ54h;.$sf)9qD+ZD [vs=7̼I<x dD;hX�fi$BT^"89�˚@*N,dk>4-7B~ ,0ƍ+V^ PhB ?qxI<sw⊔PnQ t  PRvm+l'(e-Q8WjCҥM+S)RDE ߿ߊrpE")uvY5@B!,sTum'3T!vZ̛7n}70ӆ.`͵eʔI4gذa;nAQMrŽP7.P!~5 퓘JSq+HE-ߺ," " " " " " " " " " " " " "  !HoBD@D@D@aÆGo&z8S>GObj6ohIreϞ=7ny+ IڵCΝѡC+V,IrldE ?3[*T_|1z&MΦJ�GA)@r={r%@=De``&P6l0M&LʼnL"hiV<o[a! uTfMU^ uY=OǙ; +PB۷pSO=5)V"9/Yh]%_|V"=UcˉNV\ËM[1\VY1UTAܹC A}PWKЬ("�_)<sL̚5 ssajfЊwuԱK~Z*>$9DC .YNӦM\B^y%mA3\x}pQo9E@D@D@D@D@D@D@D@D@D@D@D@D@D@D@M@BFE@D@D@D 6f̘>}`ժUׯ>+ؓ7N۬8b=�`/^<i2L!Çc$ˎ;8p '$M>ذa>#3};QTkpWdɒ 4O*ш ]'<%em\+itN`b咈@6i4)2嬤RW\d̘(U#ߏy#nڽ{7)Q8[ZxQϑ \ ,)@Pti+NҬY3?Fp>*hp?Hƍq[GښڵkY)!F0/O M:}1mFAO1ׯy&] F 0r"(OQonܻw/ʔ)cE7nli K1a_EP2>fϞmSߣ(dVE0(,=k"f'Znד9GE@D@rH U!6=." " " " " " " " " " " " " " "�D!" " "  o> 0�Æ C/bŊш*;v,۲KǡC /`'LS~S6_Jxt 9r$z-ڵ+nv+rݘ#Ѡ"TW*#D&T ezlY`8 S%ɟOf&l:R AF.TF9 M2ɓΫTpkԨʗ/;ID E)Iw۴i-jIZHP}|^E ֭[nc(R0Fpm 5j0bRˏQ"K`ն-ژ˗cmAP5wܾ%Ɇz̈́L(_/۷B hٲ%Zh͛[Ǥ@ P|6mNj,\ d.! :D]0HS""=)" ",Rdy_ʇ$ A&T^D@D@D@JlvEa:tKy0#{wߍ!C+y`J'1b d z[n ~BWEhVg�_~e̜9N}Dݣ}{ʲe�u�> ktz5E *|WStKcG̷ܹ>Sqb 'D L0wap\c(ҬY3c<vM2 P\ܢSN8ѤI+(IC}Yf> E# 7 'VF�ۈ3f̰6fҥH,O>䄣x1x.LހM.Jp0f@ n(P,Hڌ˶[2eR-'ެ_㫯 hܹc.]t2%`I07TLFRq> $-" "E[)hd *$N֭T1chN$f/N0@ųx"9wy'xp PX&L'<'~j1}YԬY3!pa Ѹ1c@ &򭷀KXh\#@`4A/�:t@)D*N,ddZ1ѣGcVħm۶`CN9{IJQ/_'ڍ"ADž^Q,(O<G= "S8_Og+CÍcor" O`֭Vvcl޼9z.]h tu}:Pm m}1g-[ֶضkjTLsΝ�; ÇvZ4j>ՈK3:ըV 'ଳbĘHD["YD@D@D@D@D@D@D@D@D@D@D@D@D@D@R@T͸-" " " ^$@; ӦMd_S�o׮]vԺubУ[hի믿={Ě5kOJ2t�QN:F$:;>cU`t\1w./%Ъ̤dO$ϳbwl0wdUD <>}J,iSL-[{.D cbD�o6lk K(o?Bؗeb٢  ˢD S@(IOmFنd[mJ- ۚeۓmP`\uWSt�0{lG} 4w}իW^0 ĉ�X [7o(UNJˬ''" " " " " " " " " " " " " " " " " " " A H2(ڥ^~7qS: *`֬Y(Xk͛7?{׊@zXb~i.\ S@͚5_b„ V,rʘ8qbBqĤIC@yɏy".xG#L`T૯A"X~=N*U }Erlۛ?<6m\4d B<M$qi|r1[W^ аaCT^#F=%{XfXvXXXXXXXXD@�ےlSm6̙3mmOAek4k)SzRÇj5p炿Opѳ>ڵk:"_<I&Q~fLd~r%v=ڃr" " " " " " " " " " " " " " " " " " " "fţ" " " " ,@^pۉ9UdFhѢF@n?xشi<|p;QO>Aٲe3ˆ@g-[nݺo9Pf_۷u]�KD3 ka30o^b_N#p]@v0b""" !|r+EÆ !C~IR""syE駟bƍxPL<F˨bɉ@,#,+,3,;|dYbbbH] J!ls6(ۢl`+nH}{JHHuFŊq뭷 .rcƌA6mp1Ǥ:"_�U~v) o4m~C@pwN UD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D yH2yޥr"" " "ve'7m/R"]H|Xj㎸gիC~@=&% ˗QǏH5' 3~ L�[Ԩ?0YzBMs^=Q)(hKcР(E`E@D LKQfMʕ .ԩSm'O<a&" NXb{zj+ʕSO=&{0 Ll̰ ,ɉ/=)˶(ۤlʶ*۬tk'\T(n9sPvm~v2~#</'$~MsaB~uyగYo�D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D ( Aţ" " " "}Ν; я1Žދ ᅬ}eH/~ܾ ~srR|yVL`֬Y9 *Gd=\TV LG2erW>}ݬTWt}([,l=﵇:uٳgc袋8,=ZBy~}UT\~9fMREFnnjEY?э,ݻNફ҄N̶@D >|O?4>l޽˖-UF4>7>mO>r�|?syƇh"VȊunf&F\_|9r$FaӦMn\`Y EXfXvGq;U8 <Ȟ@u\)~' \7@Ϟ=M?*;62N<6)ǜFecmWaጎ-J̐ĕ�EYh͚5 �=ZԶF*]mSD/H/`s@ @p+fAp)(VoGÉGF 0w\\zJ/RmOz6mIQ c3 W#o޼HFL\v-|M\2 R`QD1uyFT%Y=s@orK$it ,Y#hଳo6miR<Y1In߾SNnD':fVOayؼym?NO>+Vp, .؟7mp8bG?` 'N(tkݶo~]PjŊ%ezVmȐ!V нqԹsg# k> 9)1'w2@q9 9oY~1|>Kֱ0K &A.]0x`;ڽ{w\ 5XcmUYv0۲t\h>2f% ]H18‹/T0+?ĶF<1&@~g@.rN:)m>r!*$d$ !d|ʓ@ҥK+L4G3F~{VX3vopj)Dn< N<Dm6I|G'CQ?Cɓ'4+ ^7|z(@2xI~d>}│D{QNh+O %ezĽz?  |)p=_%br"E`TDrZ|Qn!%7j�Ŋy!"(ԨQ#wqXtJItZpΝ;䔖*U ^{-*ULkx j* ek(M6W_}P/۷/4h#q:3f̰F<!Ӹ$ZF�9=, ,,r!@ڊ*PcGy$?ztN9裏m:7n_}UplNa[mXߧ)puQ(6ؼysՂ Pnݣ=J\Q4'5j2υXN  AFBd' !dʟg 8LONgrg3df{Eu6ʔ) lٲ8cO?#GDŊ\NQpرd=FO@PjѢEx뭷0l0,X0G(ºux_ y iD,-mڴBwqGXka@FoѠ}ň@O�{0!s D.APȥ 5MV˧|@$ ܹ[b?&L'V -wNwBM:5C;25t?wլYd;sLCuڴi[!Jc O>ݖ9}aC3y7RC^{ %KcnN8Nꫯ<gەmXM˶m,/=zhQXV PK.(Z]PB=j6݇@P* W t-_^ao ~.`A.?8x0(&pίr'" " " !xblݺ~4~xp۲ezwZA_~%^ux8]l?a~m+XZ5 СcȐ!oo>FuTR6-]tۼy3~ /_/xӦM={6FuԽH]ԩSTW^y X!?W\qڷo?~!va .@vz7_myPxqZ -[laרQЄL?wy&M7l߾ݾ _~fX6w={bڵVu޼yhܸ1tR{@a3jdgȒDs~#O%J'+\zD98d3<|(h޼Ѵ{4x%`kFs6%ܹ¼S3�Ce岼SHB*7hX>лwo; Ǟ=Cxg<yo13f̰˗>(*Tnۭ[7+2 6X9|x≠(>ƬtQ80 &Oɪč@@;{2kR}ѶH!z%_뮻EdvFzSOY</X�cǎw+W⪫:ʾˆ/ '. L|7ctؾ=ҟl<ېFw5ض0K#w,d{Ph"]v-: 5j/ˬ|'BXg~GhҤ(X\`_qfͲc^qf ʅ:>zaܸqp_`#Uc‰S\f?cbc"1vD1P,lL8F 6, ~-/8(vm:u0`�ێ,>s&`~"0™Ma@߆/_yͩ[(e2+N&X|DXH*U F Ufre\nMND@D@D@D kfRs;fk֞cN3Iy31x޽{^z9IhZj9F,xJ*9F`>Wzug۶mNժUs=Yd 9 Lbfzaȑ#|`[c&}Y:yuv_Nn2F(I8<by$~իW;F41 qZhaˊIpN…2b3NV#V$qh9Lj>s#c1⠎K׮JgԩҥKFF4Ŗ r9Fi֬}6[bcWs>jԨvmvϰɌu])R3b.6h#�i5#f!9PzbͥG f|6c[:];9Nٲ;swɔ=(z5P wqȑ##a[}8wkO6]U\ӧ)kjzٱg3`FՆE)F<(=|#ŊsfiӦm$rN>d{?YՍp`LIS4HSd1cR+K2ʲ%:6F0K:*-W~xj{kF =,#rlK1c}7lІcs9c!9F)=PP2cNڵ3ö-yO?J22q{Z(6ވH)A[@y7iqVPهmk¾e33*e񱯟((#>(U:sH.~C?i/|M΍7Ν1m$lL~L87B!YŽ=ö>9~]n| TEjPorraءl 6V=Hⶏ| {ׯcm۬Ƥspi(z^rF㺷zk꿩JʶӮ %lk,o3'~X'n9s4Sn>@xdG$NzJ@ PWp-}'RmnH$l;}S9b~6l۵^k׭[)SX tP<FId^\;wM/ӈI ?0ѻ;ҥs5פG2)Yv;EMW3gt ?w2?&]Wxq``(8\JN\wE}藢s:  Jrb!ݯjQsښ5k쵫ʞ_|aBvekwp($X~snw=!D9?S 1(ԫS|yvCJ稿K/xPߕsEWx {97DQԅvW^߆+"{[U~sq7l~,-?ct181ccGO ͫNKʼnh'OuerrW)8q(E;G.(OQ N:gឦ)l S4a-sPl f^\G)^d0ϴ}]k0rzJ;<"|$sˌ+Y?~#|]" A+'ks/ O>X`ͪywy$랬1E.:JmB2cG^1dʸ<>3 ̎=k5w̠ }<uβt-gcu?hEpE (x y 47K[BDr~]u\mUsF?md)7^\xo䡸E@D@D@D@D@D@D@D@D@D@D@D@D@D@D@bG '" " " "dqQ-I0Bv30u0X6F;w #8hp^7‘0'(]4N=T=FF1VӦM?~/XlYp ~ŋQ|yE!On޼Fp]v x_'߲g7cǎM/S}eO LF͚5駟ˆo ?ի?w9rk׮k<01]cQñ?CN:$… [=XAWQ {lٲ:#g+U~φU`LD S ׁKa$cGysozOE�ݺ<;ǏO}}'{j&^1ƍ>'̈bƌ6<Ut֌. +@?,u?|z)1=*P`OL-�sSK nݿUZ<I ^uۍF(^UXFan}bmС/dD"3Ftd;6$T %.#fs̋իg]?nݸtj;<9Mnͷξw70n]l|fԪU 3kg"Uҏ %.8زeVnKoD cG{!*fF߱@n\F>bzСCR=,L #I("9بyQ-s6 F,nsr" " " ws /1)H@ByLD@D@D@bFSNB l[r%(ߧo+VɼfONNw^?4\pMT` (2<t)]ڴi^h$$1?S_ѹg߲?L-ZȖ)ޣhh3s+ڵkqBpq"Y8 ^kOeyǎ>c�L;=�}y '~YP5]09i9mFp0OJg4p!I٣]s g&M[w׳F3IFרhSO=m߾|(+rl=aG%J`83s/XTpyE,Xd*S>R \`9@S&-E'O@h ";U+gy͚5}2Ko;/3?C7.)mf}ދֱw @\{w{/e/n[+q4~;_ ]{ưʬߐ1R Mݺu1bt!Gӯg^n??ѦíDEuLN3n\>ϟ""ign'9/s1X߰m+n S_�s1!+,�9T{:KcTw}iq0H&ðf[Ů]mX%C[tl"G9oa0?ɉ@ H2Z9˗G ';w!n͚5<]N޸q#֭[jϋ/zN6mjr'UVF_E:_h*T|E(Ĭi۶-(t2E]�E{b˖-o`ԨQ`ѭ[%?@@#GX17{^97. R5U \H|z5`s\{-L\5J۰a狢tf)37PNYZG}nرcH ņ]Hx})ܠA,^z+)SJV�>R!*1,5,KLw꒛g\"Epۆ^uiRB ݻwǗ_~i�ErjΘ_`{F#9 3P е@@s-_<3w\#>wqGdIȂn9߽W]~Cfi`j\k:El8]T?Ƶ3g]\)'R6ƟH+VE怉)[b*U|zmYic7n`Aqk׎9߼F/]eNd[>uֵ0 P3 Qy7\M A8Ċ�k׎UlGD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@# !XHD@D@D@bJZjgTQ 8ϙ3wuWy7qÜ1cFǾ{+p3'']pG`̙袋 &L@6m"l8jѢE8qbPI e o2M"E֯_o7oF=d[f۷#w'RHuSN:v+s+쇃<o.HzqYgYAր"?3/|sɓnw3pׯoo шjƅږ3 =R�K.wߍ%K /W_}e;<(:2E+{?~Ϊn<*^10Q㭷s?@:u9/H2^#b)ZA )Ei@Qz S".\fqϞ=\w$l`ҥm:ۗA*tlӱ}@47=LKkd'hs}.xp?.b+ݺuXD8<@.\l_\ɳIo,O=9BGC鱇PxlY&ݤI2d+P4е 9!ܝ;w)pu+XE؆e["<LTk0t(p-0cQB@XF9;n~oio+}@}@2+CuCgpuy'a !"Kh09M@BG3 \rW^a(~I :'tƎmW_E /`ںuO?oE9^~e+Ň׭[~݃O>9hfx\yVܑ9hРA;Ѹq㣞 'G͛7N^KQaS+W( P3Ceyx衇2ѴiS+Wuֵ bSCa UR  96l~=O6nhRJ/"e:]駟#(曨T_/Alb|޽{VWzx;wt;7<~Ot۶mX|s6[FKAp ѻ7 c#  #Yʐ.^{- Rĭy"YE7}}NãՂF1OBF:O{}GB.R7n0�h2@'``q4;vLv"Ԍ;l`Boe@<yIBt)C{+)e[6)S{nd1GQF%{bAƍҥKEv^8`mJ7.ff12Eqx͵~\y(<rH/]w#2Ci>4l)8M }Q8`?'?JȮs*n_$D9)4ޢE KюN{�9#XX275+ ;p@|GVȞrO>$b6&~L(UW]eg͚e~+~m#/Xhέ:Ϲ|8׾{s틻 ty0=SWbcOY9.6u]/ڱB yq,mXe>r}N0"0 D:d'#o}?*0 Tb-.:u1pÓ4yH2'e]/C b儢�w}X0-#usnr" " " " Xj'OLjA@̙ ΎiW`9fRc&9F{gyfzf2cܹs;_|c&Zrc n93#h nz�YAIcWP1S{0bN "ZxIȖs6m#0a2~# `]Lj!ژШc&I;]tqjCٳCNŵ^vz_~ņkfsZj6 vcl^cfG|tҎt̄?;FΆô0˗/wy65ߓOLBtʗ/oqz)'_|Z#`atc7lͅ !G#X'k޳w8F9Α#;L`=Err߳gOLjo}5ncϟ?$a��@�IDATO8F*5#bώ=su7|cDSN8+WuJEs`fYA[Lj:7tӾ}{k]Vu?sjv:ugT 8 :x;)/S+^<)ԙvǴ۽M69-[tN=T{*ګ}m1F7#)R$`{K ?گs7g̘t 0iCh0cDCf d�K?ƀ3F˦Xbwi%AFX1H6 Yff?kFدj@By7!?ᡲ'>r:#gf[}C}W8i8:sε}pfˆg%9r[KM|,, ,,^qYB0aicv_X`SlY׺tBCN=x uTvyZleDLR cpq;!pƍk<1Fd4q@C3sL&82 8E6+vlò--w8"'^#rbB+ Fͻ v~L9i*.pի#qGN~D1L=-1c" Я_?0"r0B3zf6$if=VX]vx4 ϛ 0- #ʕ+aTPD [;=z4 4ip ySƎyx޽+X'Lzi3b0 (ZhH[Fn9 t3FҖ#D5hsIe`D)PfMVAl� .P630qbfy3�v<۶mˆh:co(O\ȩ=۹s'PejWCn#~nF_?99f୷ 3IHz6+ L�f=6+߉(woAb'Ur0}:ТEZ9X{fsGAV|=`U#8#}bРA0LbD/߈ANm##em4#AvǴ NOpMz 8u;}l9غݫ ?FFZD*D'`DaRm6sqRVP':nnzDEñ r,*#\f>5٘f3m[pCFژoFdFpڛ^�f(Y2O2FX/2n۟:U꿩NS-Zi~9A7l0OIOdF}ɓa~oiOf#�="" " !0xM LD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@"K@BD@D@D@D l{Q8qb@ݡC,SԿ+zXzp^zaС1訖B۷G1n8)ShO2 -lٲ(xˣ*dM0h]v`PjICJt=-^ y'׀%SOge3 .�̼PMX&>�ߠ`_9 MgEYӗ^.+߉hukh!~r`4P4<hׯ=܃MEvUF9+EhG ]0GS{&݄”mV d"/xśpS?O<k⮻m&QpA& ܾ`T՞2eZ᪋.ȳj'"XRGƄʔ p1d>5^㚝{K.bW}ufE4ݞ=0 K�_XH4R"SsM7\s}k^v)RC8M(LSHݷo b\l⯍5d _FSf?L"$!;icj�3" " !W, 㥗<@ @XN:$3M67w g:uK۶mCǎQB<s:`\UTAQ RGų =oG A3]_/rr 'R;A<+%ի_}L&YZĵ)^Jim%K�n͘9sfډ$I˝:u x/ԋ \{-I R퇚5^~0u@žMjDf{[f #4FkFu)T:|xZY=Ef4y8jժ&Mo߾ҥ fn^,}J*""+&ݰߖcGTpƋkkȷ)l믛m8,z`Dqg_=^|Ek[(zԧO\s5G?sߺX:^Bci߻{P"X|Ƌk n½v!+Yfk׮Xh8 Dž(bdD(`c6O?lEˆ %;2z/T~Mf\]݄4Uo8FL;~ѻwo#wL4SH0'aÆpTDsBQϊ#` %�W]H2)6c"Ii!#90 ?ވ ]lE}0H?Y[رsA%"|¢x<`'_rQl>| ?Px(:t-+HF=O_|ݻw/F:D=dvn ȗ4)i}̈́K8cӦMN,sqٳ e;~pnj4|F iEc=�ΘatM;xUvOLvdׯǐ!Cl{B6@f$/M ?t=S9D5 D}s{Oz|ߕ+W(&',G3+V@qe .kYDo0dcb<1Λ7ϊٍ=ڈ19ꫭ`y <HbU<"cF3<ckΝ͂%עuqSwPnA5gaM<#F�fkFΝ;g, zp' Ac#0mZ6#" " "5Jf0t[D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@H@BQE@D@D@D \I$SV:)SOiFpB\wuX|(.\8S<}ED$$K$E{1OPBY?(A P`]Oxއ<|5X(^x /`Æ qO[&gO`$`{nfZ^yn:# `QDh #8ρ_~IIjoomg.]]t[ƍ+WXb:y|iX&~]L9ƍsB$]v4V)B`i@s Wwyp礓N9OyHƄ)<1p6+)p۸q]窫°oA嗁5k,f͚aÆ?)b{XTx異=Y݆;oݺ]tn0zM4N"S %g\k9/>6m2e[,&@Vʛ:U}tUD@D@D@D@D@D@D@D@D@D@D@D@D@D@D $KڊKD@D@D@B @nݺJ*3f ("Q|y|gF(yqb;#bΝvm݆bŊy8JZ"?>|I|'hѢ-|5kL'T7o?m]E4k,PӀ>}G iӦn8e .૯&$pV:<cgɓM:+A߾}[o$ipi'?H OnE۶m:]vV`$!3Dd E &Nh7ϟ^x!w֭[#O<D"A|L6 9g+~CÍcor" OW_3 )ڼys+RGE-kƚ7nP"QosAٲemmf$wOdMØiVaڵkѨQ#C-v5hBקG#dS7O*" " $0@0E2v%" " " " " " " " " " " " " " "  H20]Xr%."l6*aC%\${{5qƐ!CpWbذaț7od1b  r jԨ0yPBO"L/0 > Zl%y .Mf й3@9zy=L] l�\w]o+0a/&5DA j]=&~U@=l>K<?f;ʕK—_~ )0R|xlpkf%^KL"]WԩS1edk+VN:Ϸb|{w3%y)Bʅ?hg~g,Yڗs=0 8c k_hk,YbۈMGvO>&`X_aD=$%B"J`ƍM9kl7E)S&)07 @2Ϲ`\&MеkWU0դW 7޿iߥYw^C).[xҧԈ. AWE@D@D@<N`߾}0`%_|ъ&x< <NP߿?63J(�Ȣѣ /`…柗ky*X`½%86(~1rH[VHovԫW/6 P,8TG曁p0 GAyA ׯ&9O!䜀 2sa&U'1@^]@|9gbKAV-x2z1?Z>| ,I6|R 7nlFY[4(\/?`Μ9={cѢEA6mXAeˆ|@ ] P k*U*yAj@0vm A1 ZC;SvmΝ;X01bEZqp ȉ@ضmܬ4Aa۷B VlECKRE�WjMfŐWZ… [Վ;Z!"ED3 ;Lk|PM9i.- " " "3<HvÌ+,L=-" " " " " " " " " " " " " " " $ !HTX" " " "3f@>} =}?{w/Sg5Kv^-k(" BdM YRʒ=Y}~t_yyfsvs3o]y~{,l)~_ų>to޼9}csBdZf F^ d`;luA)BFLapʔ)¤̭]yqBC4Ҳf}>0Wo׮:t 3}4L8^ciRO>H'J| Ma­3aG|�Z@U64DQ`j*``}();?`ڡeӧO;As @w{M*&4I@#֭[:A<駟 .8>+VJ*H"H*鴱éߴiӾdɒalc8X *pas¨bH'wa jM*9^i_~�?h6a'm }£H h^ua…μ|r={r9dɒH4iK.6lp}0 \߫PUsicsvڶ8M7߄AFZ\$p޽�d;#e=$  H@$  H@$  H@$  H@! ȀT H@$pcK.gy 1;nFzϦ1m40$fȐ!x[.T8s N> L$ jժ ⡇BLBM~:ӤG65fZrZr@?@@aÀwjs!"@Ѣ@ʔйsH`Y640a0yUv: } @تaLЧOG2n@~�dC-4"YN("W4-[#ep,RX1'K#I9 D.poμ~z'̇Ν3)1p.[KAl[pfϱvm(^g[6m W{\1X 7ƶIKb]w-n;SԜHHd܄p\{x1PM_~q– P;l ]f2cxP&B^d2F> Ne#y]3qa՝h8y>={a�fP@,$ H@"] 3H*̹`)) H@$  H@$  H@$  H@@|Pd|U_ H@Z>|^ڵCNPpᠮWla0sM>�s:1IG׏M'�ouB!/\ҥKvڨ^ޡRay/Z=̙{"K,I&Z* )mz42׭{g'O5j t| Lx!P_}&T $He%..4kgݺƍ0@OٳNF0& J(T' *h'OTc x ؁A{-CH <NӧG%`0O $"sK cvA=M{Q GN*/n;!CBzJ B?kgְ%K0X O"E '9Ѓi6M[ s$J2J nv.3xw<~50f;/lk5I x3d=oA�SJ|ʠ}ιs*?!ڕ9jZޥI$]]z�^ Gw=Z^$  H@$  H@$  H@$  K@Av$  H@p2rH|Gرc*V:iӦ 1rfcرNEjн{w<C^Kϻ1 p??.?@J;)'x˱l2gްaNj2PuX<OJj\�!yۻ7:OV,\xƗ_Byc?_&Xu/p&M *T�>vL FdÆ&'& E=Z*Eevp%@ʔWFC bXM69Ν;qŤ0Ȏ  e> 'Ŗɓ'%۷; :r䈳ٔGvE9{U,WA/o߾6!lg\8e4 & Ne//_>I& H bw7|AAF޼y60ݡ4q9hP"o;~giӦu~C=%~GbWZkm9zO<qℳlٲ9AށGT~l:]}̥Ns|qTF嗀$  \ jabџږ$  H@$  H@$  H@$  H@1PdN H@$ ,pB!g̘n w!k׮<B�ߚ0Ptҡm۶ر 1PK.uBЛ%KG2eA#Z `O?իWcժUN'?vdgʕQJe4?j~W_%xhH ngfH &P6n*[e#�C�=*09?gw0aLnpכ)V X0šXd\99}=#(/\Dn޼ c#9o#G'(O<p\r;t8ӧ:={sf?L5s1|3ﶂi{(u{d}a[w^uN2da¿EΩxI @++d۾m a'uZ)\\2Ɍb큷ʪz�ceo ;$_ x -Kf괃l 93px~ˤTo++]嗁ɓa*$  ԩ@Ϟ@߾vpM |xJ$ H@$  H@$  H@$  H@@ EJ@$ 8x 1bPHA֬YիWw:]P+W5N9s@<voР5kćNQ"츶rʰ-/]vd8wtVc ;M6ZQ`H9oܸׯw:28!r&3C;u`]> 5 (U 6 &a�dݺ0Io?h~fQ*ЮCN�ѣwR^7̾zA%}V & cJ&:GҹO|̐ "eu1X/{a3$8K,H<yt6e%p'~ǰ-~9>uѰH a�N9_|rЈ0ݑ@ 3;ahٳgJ>}6mWض|LPye]q޺m 71IQklS>Θ1c Ko{1s0A0QCNUNزgp;p~ܰe˼rܔ^v[nuwb2@ sf {5R5cAgcZk狆 cOⓀ; \^|M s$J@$  H@$  H@$  H@$  OQu$  H@8B2qҥ8s)< +B e6vN_%K3C1 FN�$0Kq/\Xn6l؀~nq (\0뮰NnMOv O8-n=~)l߾ݙYu֭N-[81D!EL )_<tbBB= _C ]vjh`L/�Ɏ_~ ŵ?oT�.S*-?sm'ر~,^ >W?fh7N3˗$?0 ` ;fYfu̦'"G2{f!Ç_7:t q=x`wGnd`7܆-M@p 0Tm_ܶm_E_n޲n[ "rB~"jcyO2dpγ}̐4}-023f�I@5#7hwvrK$I5xmSyN*oٞ2 WS pP<rD w80;q e[;wnڗ`nWJ%<30thW823#ʖh{odKy H@�WM/Pd$  H@$  H@$  H@$  H@@p (28?7Z$  DYŋD]l}P?vLr"E(;dG͛7;ƍG޲{ƌQ\90ܒ !_W:)7m\ cǎ9aHvg8nq7*ف2!Btbh ؑН@#G'H*XEu\"ǃEaĈ>}:'DǎWw9 =`BC^~&?ug�d|P؊9�;@,\(+>U`jW/`H{0m_p4-V &ȗ/ʮF,0{6Шc10/g}+?Gpߏp q'RxL<{?}H.]?1RNArI'Ha2< ?3ԝޏw4c3Z(?S%\<6Żqq�Ϟ={Mݶy)oƤI _ 3sۖmѣGݶ#�jy/n6h\'f33fC'WB{y{=q>;󸌿޳{8]uxܦbsuN]1Dwc<:Ww⾑ɶײz & DT)A4EM} Td.9k$  D(`k&Mi˘& H@$  H@$  H@$  H@$ O$  H@`0 zjg^nّۜ9sv g[Ν;tbf{^33ʼnW ^lYgΧt[bh@ȝ;wseGJ;1,᜝w<BT2eJ'$ǟ( y9s3>}N ygQc'Q֕cyAn[~رcMj͚5ѹsgԫWτ=)j7!CÁJbW�&UڀboalL+`~NV@VvDzyॗ`ڮk G&k۴6\f͚k M,4 `�`HUNo_~~&)v>ݙiOrͤ�=3ğvpN -G=9}󸅷}>rf(o&Zz0oG3$ HMsC!y"uކtv»a[) 7ͻmq>6m<[N2m[ܶngݮyaV֍ށ<_}cl_xm4Ş@  {њ%  7m&9-e{ rwp[Rwf޲Menl3َ3tPu m%F}tx˶m&t#G?XloOܧ6yQن} Ǿ`HtӦ@~\k;Q�ݺn=U3 H@ :(Qhܘ'fӻ$  H@$  H@$  H@$  H@@ (2> E$  đ�;رLb۷_>܂P vBK43#23|$0qXΎ_;g1xx *?2�2k֬ދ~C߾}D3;O&ǎMv-g~g^=g{t;!"G2;ݹ dB>2D]fbcbg̘#Gbȑ#ڷovo(6t0gc6-6;~<ЩL+p睱_9A:0,0]I5X͖u:!;c&E| =۵+`L(w JeUˁO r5q)}i7!n(a[Au<΋x?f.܇7}>[owv ؈lfȊ;L}r?םw}woǞ޷nHu ZÇag<v6y};N$  �S6cnQ; Fv% ӸVmw}n=/n_>mJn+ޏY~wa�Ut�/VD ۘac7XWS` ;p= h� k-uglSvjlsn6cyϙm'D ?c.ljm!8{}h,;mt!lo6l'6 ɼ|^,[J-BjkLqJ'P_^aI$A|+Jey={>݌)hηn9U2 H@…x{\}BV4h�H~ ښ$  H@$  H@$  H@$  H@- %  H@@9r s!i!n.޲;~Ei3ft I !k@Αnp{51AvDw yMU=T5AtvЏ.b|5 &Lp6lΝ;J*NBDz.M}&xug`:N> jՂ "mZOx1PX(Juˏ7؉:-Zt;JV?ʡ-^`Fvm}qh OoCk >%]>=)^~9'*W={n*|no7o>}-ށ]w_ݽCü'K p17(1C$  Nmws6m{6Ż}}=qo13+V<o;vM8ָ!X3MŽQ5=BS|͝&Fp@> O@@ sul?c3l;ϹvmNϹ#OMmtx}w9l7gx#$Xwv0o_HzBsWBS_u V M�5k]$&C�6\!2K@$  H@$  H@$  H@$ (fBz]$  H@)SG *ݰ":TzĈ3& :u6m8a7|^ z7� �Nƌa۷Ä6y&頼mpB iƍ{(PCB&SXS P>o*V :$݁]wU-a$ �'͚DqT`0ϻ[gB$ 8p2A;w@M@i|2E¿ |ehYE09 *zK@$  H@$  H@$  H@$_Ɨ$  H@@dЪU+X6l@jPϞ=;ڶm5k7xU)_2g*T�ڷ=E,A_wK{�K(2?Ϙ?[6ƺu+p@@" K1]k콏' 1Z9r�˗6zuۙ.jD!?oC5~jjPmLH@$ ';�[o)26|N H@ K;j/z/k9sH*p%9q^2)2P?$K@, 1M@\�? |B c^$  H@$  H@$  H@$  H @ ! H@$  H 6J(>СC/lٲ(Uƌc:iBR@`|Qb,P!}[$I^q}|`^g?k…6*/ƎaJK <-f&+YX)S~ "йPwl`Q @}=mmI$  s6re駃*$ ZظxU[=|5QC]ڮ^UdT>g3~cէOT2$*%c�7#G&3gT$  H@$  H@$  H@$  H@7P͍$  H@$ H*:u 6`Ŋ(Z(v&{UV!O[ذ|>v?zI S&7k w ԫ<б#p!9shM�G�vZ �r�{>盭|-Sf+Wb3p$�^9`H[nyU`GZy}M$  H@78t0ྵ& H@�%z%d.o8ǵ<bCW mI78uʾ"0cap` ]ȗ+$:˗kٲJV֭&'&$  H@$  H@$  H@$  H  $  H@$b˗ǧ~}wޘ;w.+fĤIp& 0lf p4P$Яp­$M =ƎvΟ Xm.'ڨȒvrexh@@RD l૯"~]φ@:?XW 7N �;^V|wu H@$  LbFR$ ȕ [`lar o \7V%-/l"֭)JIBW#x(XXX-uW$  H@$  H@$  H@$  H@@T%-# H@$  H 2dȀ=z?y>}zj 9sD^L}þ9h .d $C oubg=kꚂ/G�}g6lY&*m\ Cpnԩٳ@Z@Bo,o^Gm@ի߾?ܹ+g:v4% l+$H�\ 2h$  H 8Cv@.@XY@ <@Ϟv#^(:up۟};'sTܶ% H@/p 0q"P&PL׮yM*m/  H@$  H@$  H@$  H@A@A)$  H@ 4~I!۳g:wO?Cݺu1sL\U> l"Q"Mla*@1~6π-[b`y'i%~ɓK-T@Hh5h�|=y3P0p #в}_{tۦ7Ip`~Vfώh+0KnQk$  H@!p<Ьݏ:44ZH@dɀW_<W[ТP6Sl9�>6 9ȕ$  +ܹ@@O�? _|8�|!+5I@$  H@$  H@$  H@$  \+ k=H$  H@@ѯ_?'rʔ)x 'k<yP8t萜BDL'&Mf�MyVW0ЧO'Kdž [Á,Y*_u{}Q޽@@޼6pu׮دI/`(ƍ@0!@۶5R ly@ڴޯ$  H@v9Od`& H@<s}gsnBv  Ԯ��@�IDAT*KAN5~١У l H@$`r%Э-8qΙ4o@T H@$  H@$  H@$  H@O@AD$  H@F qhܸ1,X`iӦ:t(ri~s,Y$`ʪܚ#�65k͚~F ͙} n]ع0�`8_2E_ٰ>v2$Hx `r7ʿ͑#|ƍN-u 0trۆX'SsE�*J]Z`@ȤI-/ H@ر� `I$ `WwE%K\ҫ p$ 2e(wuZuAh z& H@ڵ@Ϟ@@6!|3\ڢ$  H@$  H@$  H@$  H@FA㧦2K@$  H@ `Ȑ!طo>'T… >Tڤ/yhBÆ@/GXxD gNP5-K4Rb#>oan 1vz{krz |+I1R? 񷜡 G0a^j/իoW/w /$  H@ ,[tbĸIC yr_?{n!<cQ~2.]pץ`C\j_z Z$  Ķ�_z^7>`dMm`TQ$  H@$  H@$  H@$  H@@=/-- H@$  H $7=(q\֭CJLX+Ȟ=;z)oc�v}-`\bv`hE K/Y1 [4I .In]A`pQԗ)9K)e>v=f}ZK0 ^&6 `8cL~UB H@$8 ,j_x)J" H@Qț9>GP!˗-) \-ϫi[+3f)RHFA'XtyFk<Fw* Q%  H@$  H@$  H@$  H@@ $WȞ8ʧ& H@$  H@&0e Z <'O4AQcĈ&@7:T;w6z-L.芻Oַl6d`B@z}_~$+6brܻHPZx!xqFېoVʰI5kt逆 m@d@Ҥ1ߎyGnXG ^s�SY|'KZҥ }>ԫI@q([7kvKzB78u (WH\Mɴ$ ํAs<Ix9`j>uVo/J6jJ@_/Ӧ m'$iSL>!V$  H@$  H@$  H@$ PPd(~$  H@$ #dM!k''@Np]w|[ZΞzcƌ2e7mJ�Ə^%cO?ٙϜRXR([ֆ<Do ZZ'{7v7k`pƍڵa~WWm_„6<�?`"U+୷YE֚ 3޻_; YdZ\K$k 5ڐ_1xa{,9s|UA H@J`N;̙@!@@esY ;/�z Eqi$ 8q=?Ι1@A8\F^U" H@$  H@$  H@$  H@$J OSu$  H@n( ſ�ѣM�NT\;w6!I$>ߞVKm�ő#mͶڡ0w.@7[_gX/681P(p}@26�hwZC` 0ooF lpȨj;{Ӂ]g.8z((k0oyu�ilm/&E7{^$  CcK:v>̆sM$f}�=AB8 o=x" C0q ,ʗ ̗H$  H@$  H@$  H@$  H {Z$  H@$` I?>FYgeƌѮ];t0 r力Bi18uv7h6 H6<oC^z)bڵvf�֙3nb6{R%FӺ}wӧ /PTvNf($nn4|q#p7ZRs瀷߶3E|h`& -4m -˿8{$VZe>} 4E H@A§|e87h|W%  H z.<<T4IV*T$ߦ[vlT_ H@)+ ܼH Y^5;̲T$  H@$  H@$  H@$  H ꟰' H@$  (2"ݻGرcqaԩS;wFڵ0a8+6}3a=mg+F~wmӉT~XXGlc@Ҷs%&> Ν ̘̞m^=T v۵ۿ ߢ~~ w PT)jM?hhhl4e˖ tU[$  M@A~ 1LХ y+੧BZ$  DA`n;�Ҵi@&С62 o"NH;X t='ؿ>vRS@ :dc@?VL$  H@$  H@$  H@$  ?lĿ\5$  H@$g9sD ?W_}gϢnݺȗ/ CYh 0(_0Vl._x={i�/7zQVM +Sve#׷r%0k#mVRr#S&W uj cg~!r&; LB~u}WĉU;km|Ȟ0g߫i߁㻌?p Ц У0~> *?ڊ$  H@!"73�(2D>RUC@4u*0g=Qm.\j`seZsT KUO H@#A9b>vPYs3>'z~ ص 6 UKSI$  H@$  H@$  H@$  H@ <f#5M5j=$  H@|'0e lyM[MHI;s 4iN:RJ%�țV�CK\̼ym6lNZ5hk# H{gۿElwڎab Ha+W5I[^֭ZSoo_gΧƌ>;v զ H@@P X׭~I7?hd0C$  o`D<93{@Dի6X4oA8@  =f`, H xuu@lv7^[^5T%  H@$  H@$  H@$  H@@ (2?cP$  H@W@AU8w&MB1iEM!qI& as rX`'+@ƍ@*@6@F@.G.]Hyz:R Ԩa;8TR 0x^ Ӟ}�szɃ|g-Z؎ [~a8 @ƍM0I$ H@ _(VB^=;x CxI$@}js Rz} toȔ X؆#ıc!o"]:7 zQKm#}d�s 7ŋcTf H@$  H@$  H@$  H@$ԍ!~$  H@$ жm[^?3ʕ+_|ٲeCnݺ* s]wV[͛;&2'^}{fM; ElpB 3@$2; p d'mhkca諦-%;0nd P L3gO9T #"@r<xٷo_$  H@�Q4 yC*( H ^ dp'P+!^rQSN a7'0bл7uB CsV}$ r^_xAu H^3`@;آB Si$  H@$  H@$  H@$  H@@Tx ;r<_ H@$  H@$0e $QP .4r |9r$6mڄ2eʠs&h9)0x) W.o+ĬY�)S+F[^$ XTɆ@20 iUؙ ) \ |10p o }e oki9w z<h~oK1Y# H@9uf!W5U˗*h|(VUH@@ 8|pc/p!C*cQ:<2djꍿ |wt IPTa$  v￷l2,YjlSjM$  H@$  H@$  H@$  H@!04ZH@$  H@@( Mt&K.5aQyѱcGӱ!;wnMhX`(\Rԩ`gs 0L$I ʕfx`ZWK>}%{߇Wv*/'ڵmF Zؙ\ſ9vgYcҧOg}'uO$  H B+:uZ!$ kx^w$-'vbz > bNt@mv%~{s WL`.`8ǀY"E^u6Pʁm(2>>G$  H@$  H@$  H@$  ܲ oP+$  H@$ TT _~%݋={p뮻Pzu|7|?mDQ wn `^�\xMwm!ro{oW$ 0yhvP۸̚= Z"pk[gGuAoŋU%&m[`V`x`z}X,7fjg s* &`I[N</$  H@u �5kœO&MAM-'$  H@ddgp3g?HޠC:HWu޳x̅AdԅyM.]n zMw'񩧀<y`yƆ=>nv옽s@bVG$  H@$  H@$  H@$  H <f yĮid_Q둀$  H@$;)S�(weӚ/pH3gFf6HL: G_k~ t,O'd!mZ|y Q"S'ۙTbZ$]ۆYpDa׭?�,_9^wP7"]֠BMe }-}(W6h�c|ƎO�F]VTN<x?1 ”@:%  H@F"[7k& X33`m0\$  H <A.^~`;bS„1] >KW9`<G0jegAj$ [`#xr;$Iu*UUu1tkz$  H@$  H@$  H@$  H@VA'rK@$  H@Pdɂ {ѣ1n8(vCΝQfM"ȧhа {6 t (]h'`�)! Xqҥ�C_o6�C!Ww=E؎o \֦׃]m ]w={=$M5y^{ xU{~M .D۪-I$ 0AQ O>iCK! H@8q>(Y6 @�@ 7/p4`wv67 ܲdA׹-xwc�g^J2j2J@$  H@$  H@$  H@$  Ķ@ހ/ H@$  H 6F <8驕;wn̟??y8p ݋'I#]6Ϗ~ gym;v *TLw:u&L-[m۶oaڿSDq_so[v$EթStk-]6nK֮d`ufNj?nvp6yh�8[g8;v, o0iL~=СPpvo,Zwk`Ӂ~ʖߋ\l�CU[-� �ƌ8իѣ֭{]dr,& H@@ ,5I ? 64-ه`6ml88D$  HW �{ǁ|YwbǕ>x$&^ڸxZ5 C0v3H" �c7mF}șț^ڶ ?`D35j(2(>\R$  H@$  H@$  H@$  I@A~f$  H@$ p=ŋc֬Y8sL@Uf׮]سgxߧ$IyXdp |$ȑZŠ+JtĤq7ov{٤:5j jٳ'yt } +WugժUNC/>_|^z% 47!l6-*Z}͜Xh泱aRL^&ojL./~hr%ϖ v_8q09<Nd[2;ٗ,iǏ&OS0d&}�!!PT S+ٮ]oگN5p[y?P]^27)I$Hmݻc֭TDT[/ < @7ߌ{$  H <)ev`]5߉=[w&{vQr3e()yՌ7``%/"LyܕS[$l׮׼3e 0c:\;S$  H@$  H@$  H@$  H@P H@$  H ĺ~9.Ttu֭ٱcǀ,_\pN1|plٲ*T@%0b:u*֋~٘jfW_}!.Dq⡇O?<43dNu{wqtxM<Q]gMäIa4`݁ & H DmL`wYoTtkCv�L|&P(^wZ.޽!Oft@96s0 U0!75/M9֍ΝC޽SOI`bjLM_ }Da۶mNHv„<g%  H .·O< 1i96--3&!x<I$&M`{&X1AoC;7ի38-Nٍɗφa3bXby>wD}ZR@|)?'^*[6 ]7b}sɓg5]$  H@$  H@$  H@$  H :i--+ H@$  ={G a>P\rj\)RpB֚^nk֬qy'HSN&TʤJmgʔ 9stKcƌA֬YMNڵs>rH=+O<:&,eʔ(P@eL u: ]儸͞m&Mc) H Vwԩ@60!u\޼04ɓU0m6<q09�;?k .v|IpDvTo7>?l@?ْ?nzkB/ \ @wepu4iʩ;$ @P[�Zl@=;0I$  H؄!f '}7PPu?KqsGl<:ko姟5d nje %cHYRP$  D&`f`G ]:{| ]sݴ^k>(SH85y H@$  H@$  H@$  H@$  X@>zU$  H@QU&-?78zkF͝رUTÇ1m4߿;wFbܹd8VZu׼q>t p/^xMM,wܸq{6l~7 ʺ$Iॗ^ҥKMG-SL^MU|ХKgL.UMAoY~5vX'0UT;1x`5Iz~zNt4>yСOQF\rgLL9r8ő#GPzu.aM2M/=\Gӧ*U}ŋ?~ҤI׋-?{u!Ck,�<1#ШLpCƍP0A@j�;1?{^gd�f1d�_1WmY {)*W8  <0б#]_%di0z6{};Lt,?z-gLO[ 8gd7/lߵޮf$Zi *K,qw}/UΚ5wÂoپ1# H@yU8wJ(a:D7kKy~h„ ? k sa[Q[ʁF>S\2l3ym)2e 260;ᵘhY ah|9PxUPՑ$ 9ɓa�mxsT#A;qAfw珸 ȳga\w*V:%FM$EKuo+_9ܜvyiW/ﶃEqZL$  H@$  H@$  H@$  H@/y"Zo$  H@W`Ĉx�2fʔ -Z#<Tn#Cq'dѭ1b`.E޺P&M8eM2l}0ƍ8sxy>2<gʼn'@rb9аaC|c0\3 { 3gڵkg·ƻ/]NaΜ9:!˄-wnvt 7oƢE$78Gؾ}j^^=p{ l5k C ,}wPw*Tʔ)ㄆHy ܗP%~d{s)/ ~&4@ bH@>Q OiOao}($]:[*Lh`\= 6i5Y6!׶S&ws.XfߋG\pEc`jժ-qދwݺu_@oNLpj۶<l0}&Qiʕ~*a8(@rlR;J}SNSNhٲC!F7ڷv߯[ H@@dOuy~,0R8Š+ݬ-ju&mx'6w*DWMϹp`>Pɧ~gm)dbԩS}7F DGpxv0(I!!*\\/sQl_|סqkxw8W \r 1JƠG3 rsI9K|�s}˞"f,:'R!1f% x">f00 h!xN9T7 [l8~<R5%  H@$  H@$  H@$  H@FtXԬY$  H@$ @<]{Ltڿ*Ubtw9s^ [nsk\ry8 :yl<%пժUYfԨQs&y;駟[1!<y-G׮]ÞݻW^ {<{lg}swvpȰe֭vQFz8˛°Y\< $ԨQc=.] ǰa:\%J8]Lxg̘1Ç_0{MEǏOc@=O{>ݙ 䒪l@L,xRx~9>&kwO߾OzOl_3:u<zٱz5ʢ5ߚz<<M$Ml,Y؟Gy̾ӱs7nٲœ8qbOw-]⽆Fe0}W?,:tyɓ;}w2a}Fe]n%  H@OWj;4gl@ .8GԖV^YF7sf_l;ݬ-]xlf' ٻw3jKMв'cƌcǎ9< r߬|B!9uh$  ѣh׮FlN\8c΋x5ݻ{<{y {^2]:\^tYΝ1zQ_$ Eg ZA\>-1_7ټ9!賔$  H@$  H@$  H@$  H@}q?J@$  H@kFq_S�<6<oyŊ s}NsÄDt pf6|=:˘mÆ p9/M4hٲ%vڅe˖9˰&NN˗/Ä :dɒd&  � /YԩS:u*曰u) tlYY<z%K0MܹӧO 1BӦM;wn@P۷4LPW^<={^309aB{O;0Ax7駟wߍG:kʔ)#|_=YȔ \:ػ7JH@1^?XW8}:k[>Я0c=p 0g3@Y3UہJn݀ _~i}_.1-6 ؿ9رö) �u;nt=7Q6mڴk]_|E.\ikD\&}רFھ}{SDOg+W?Sg} wʾ!# H@P),_ιw+۶mo>Ғ%K-vw؎F-uQ3H$ȑ#3sjKyȑ#{wp D|a ;fo穲^9NR%  H ҥ/֯9^iuWF|W k^<K^B=wf<hyIsI\-J�F�6o;מ729V'$  H L L <m[@2w1m[{\B7c' |@jtG$  H@$  H@$  H@$  H@~H-j$  H@H]fkAnQ*T?ܧB�܅ȉ8mݺ t\v8m38'1c8s%2[o\rXrN0aM,PQF9!ÇGV֯O>޽{dӸIPNos άnn~f#H?c8C:aѝ *u9xuRH T͛U}d;;6j԰ϳC,;hS|y`b>̚u1N9͉v y$ao.?`/^ ř9!Mq Nvq d@d߾=3dSOـя?x"rl߾y gX\4oQ7wu{]s̉:u`̙`9>3qIIѣ /g"n}֫%  H@xp_-a`=,[ Y_{ztRIrQ[Y;-mn,Y f͚``ߨ|,G0O& l'a$ H@h 2a@Ϟg<>EAT@+hX v {/h%h5j5bcD{A,(ذ!Pzog,<3wܙ3;sS>  0�X;׸q /GWw �nSN* �B$518u|Vk/s (Sg@�� �@�� �@�� �@�� P4?ʞB�� �@�(&K/SrRe$�9gRC䁥5JSgΜjԨQ&wLDzȊ<[Q!sh0 YpA;2T>}v@ǎuw`Pa_S- cǖXtN2euVbX-,c_ I/jbٶm>wUF7~{;,5/M% �Jhl'˸\VrM5E?ȑ#- (lNZyeiN27ߔf̨-ZJ_~)=rQi idWjNp3h]T(V,tҋ<j;v]v׽4BK-Dw;Or[LM4 2ͼrӢڮKӶ.w@�@ {Ǘ Z:wL|=dm'|2> wm_@� {*GKgXO0hdVϼ, 1<j>H @,t_m)<#* @O?= �\z N$AHόøZqcs~yya@d� �@�� �@�� �@�� �@  ǣB �@�� �j'#ri-?k֬ueldUHgqF&I{%XN;B f{졡Cf~Uy 'O> ZYwun&͟?_=:uHiz뭷-ϋ1QLq C� ANn&`:skd܆;oqiAW%1w4kʦm<쳵-WwEÁJ'J*u,n ŒTJSuŧ(_v{pw<xս{Rp4iR<w\e*"B,rBmǙT|,V͡ G9G1Bj+sWߋy'"o-3dL+:vP"ʦh ԵZKW\qE&ktfU8S)0]m]Y,@�u@۶+YfJa3~YblWK{G6ܰn~+@�?8 R#"qD6 "(Ejީg^~lkgYa6Xq?ߟT,%+qu( �&�njzP0ZTH3o'Lv=>O׆odռye. �@�� �@�� �@�� �@���"|>: � �@�;찃ƎKKz'ԦM Ʀڵk?x&ڱf# BJI(<cB0B vi']{:ug)Su(+Y�BTANC:y K\[$e]nLG c`m s2qϯCdD}Q t v«q`b^",@]w~r?oA_\̿/YdqCYlժ.².7cƌp8Pwy $ !R>C>`‡Z+|V,e Uァ ƪK4>p3j\ rKC.|tRҜ9mE!ŐDn`X/mHZ rf 7DЦJ_.9*H.ײ?z+vn;M<9k#`Ymb7߬Z^۵Šڮn׸}궥~R`fZ~3v=]ke֥k@�@.m=T<^uU٠~oA,1F_3Y:]Gݪ:~ |=�!uh44$<S v?/u@��)zB$<RyOWw?H<"ϱ/8qу2,l =-% q �Cz-rhnL\U:8fI_/݃&]tQ(ğ� �@�� �@�� �@�� �@�@hZ,ANKB�� �@�' c7 |j=zt2 BdAHg)篹:suO>Q-dGuTѼB '>6z]:r-$siǘ9G:Tr_$~ijEK?DJZca!2u_1DY:{.V#zi<BfD]#FdE 8cݻ/^z) ¯*d/JU`ig">&w/\}#il6U EiZn(n]Ȱ_O.LZfou` k[(OfA'>N}p usEZAe_.}xP5��@�IDAT}4 g]n'8aIxYm׻C:lArsQmWk6iDi~l[::YL6۪)YZ`Km-* +j׶ӧOZ5% �@L9ԧO캸꫇>z4\}'+ 2pWM\[o5Kz(Tk`#F.{m۶D}Zjc=D>cgKRP m%Lo� @�@$kK~0T}ݥ7Suϼ<TxCc`"?smF;JM;%. "[�<oSgB~*-0% � �@�� �@�� �@�� �@��"zqI@�� �@2Ȃwqɢǎ;.ɒg"dž .~E3O?4,YY1DYʘd:~o-"͛/R~Y),ԩZlYz5^߆hLK! $("Ya1eJiĉ2͊/)SdW^9wLB`8BQKϳ]"pnAuL P@8^SpPWE~ױK.]9AE z'Ӭ9kV ڷ28BJq( ~p-7Žm K=¶ nJ/K.mt[mџ9<.2i.mzQu}@�+g}$|M=A>Ju^KgΜ?h H82ڴiSz״VX3_=( R`s� �Z$0cF<Kb4XsnL= Z?詧Ci睥vP??l1}vdži@�@Y~:wG 7Xj޼b!�@�� �@�� �@�� �@�� PL�d1 �@�� �:N.W,+zg4h =jժ8{챙Ʀ!\zieY'J!-tMZw]ieAT [[Af,=@ �mz: ( 27;)zbH "} ib(=4xd@mgA=XZzI'I/ xX{?Fܽ �s"z`wd'3ΐ: yL*@�KM -oWJ׿?[jaaLGW_UMv[_?oVGAY_U@�u ȑG[7ݴX& ug@�� �@�� �@�� �@�� �TDUAu@�� �@�A�dA:Wɉ!:o 7ܠ/kvҀ뮻`0Qi)E.njfώrΝrciAdN" R&K?/]~h-gIE kJ]Y^ujň{L(#a%K!-1MZ_d? +Q[U@�@&!GҝwJ[mUC!�@�UE7/,|tERvU <@+m(<vMrX|O@�((}|o `T>lžQG@�� �@�� �@�� �@�� �.D˟C�� �@�5H kpUhҤIW|o~=yU:HwqG^)+3wQ {v{KW,$yuF}yIz7DY9R۔-CWXACzu֑6]ϚG)ӥ7vEzi0曥\r|'pB&ʬ.B�T1_|Q{x~w(Ҿؖj9@�(�<>4FԶvΖ[ř?:'y͡뤓åW_e�yŹ?:O S=FR˖Ue@�� �@�� �@�� �@�� �G�d;1 �@��-kB }[n-r9z(7ԨQ4cƌyHpz쩾}[nnQZk^zՃ%'0{v~C2 "]6JԺvbHj|ɷ'!P_<trQW_&s/c0);s7l-,${&۰hPi`e9so+'vn#< | HX7X7r1 � P B_7ӧڴi74,N:pAJ$ }?@� �@l3?S?"õ€A*چ e>͝9sY&NDO=TSľy[l6i"sOծA�n~|;oG٣ŏGKy{(|xX�R}LX? �@�� �@�� �@�� �@�@"~o� �@�<F;_+,t2)Ac9[oӧgGm Arp.⊵RO6,�#bȔá͚,\1dnz P|tOKg% ^0?Ł[>Sc�کSIAdpiuvsV_|!'}tő_ 5_Zi'iąZPa� �N/<nQj>kM �@�AM]qō ~jE708rQxBz1⊃쾻dQcWvUk� &O}֖>sgxe}I&q;|G� �@�� �@�� �@�� �@���"c˚!�@�� �<#2fR'Bt3<oV 6~W^#D5v4 "]:#MwMK(-- _ %ՕWJ&)~ԱcD;.S%ĐIiqdpgE(Lbܲ.J"}WA t ))-4IzIiPi0i>}bnŗJ@��j@"Z1B:0/, @�@:uԠA&,h-S&^Jwqf睥]vv/-Pjë{k Gbc>>fh �@�� �@�� �@�� �@�� PA,o@�� �"DMWO?;3kѣ&6k$/B\9*nӦzEIdα(|-W*;H(}(XYF'RK!dO?~9VysI٩SGFIo{NsOi Z*QgBHK ^|1W]Ufic֍) �@AVUm,9ctWHcx暵Q @�[N@=t,X];|~x00E۽~xe駣�71N *m25{L-vzzm5@�Ѳ}ϣFE'% =ݶ- �@�� �@�� �@�� �@�� �|!2_� �@���"jG+kVwI!E~X9fLviܹQ%ŐISOHKfϖ9G(&}uw_*D:PթIC(LrTvp-˛?#zhA~{T7ސ>f ~QZqEi-8`65[5, �@�&2O=%  M"]v*J �@�J>" uw_ eOWqɈҬYqФJR G4I$@�A[;6Jq_^=Zď~ouB�� �@�� �@�� �@�� �@ ,G!�@�� �"rpp:un]wuO[a�jܸqՔ9s ib-7I ٹzrTM;LK颋G|Z=kf_iܖΓ':XdmC\{ܦM5m˥SNN<QtUw͓F^z)f!-lHr~%mqS](!�@�(�"Ȳ\g鮻4ڵm@�@'k!_óǂ l;q!(%B@}fimу Sƙ6-jE] �B&y''_<{]Сj u� �@�� �@�� �@�� �@�@!@YG:C�� �@�KD�aCyD`zꩧ4h =jݺ8{)S2!]:4wnDdZC҂H6# ̙ҹJG9k¨;<Cر,Czc8綦M+͊??_ye@tREK/{G%-@hVK3m-Y �@>Ꞅ ttR˖WKV{C!�@�I_ N ǯh!A:k)}0fLHGvr_Qh9v[os- <8GE)嗗w/)|-qo �@�� �@�� �@�� �@�� $A. 5>@�� �$Dyبt9Kg_}_~Aɯlza|I򣏤oh4YG҂ܲMzcFIG%-9znS@AA:(4rԈUWbH!S!No/-좑Κ%tYvi}^ԑ##^ZҦJBdswd_@�Aqw;(sě@�@׿֙g? }gkWʸ}`.^j,elJ+U{ut{,!'A�(IŢ$||}},YأGqvmI� �@�� �@�� �@�� �@�@%[ � �@�(E�d) ΝGyD O?fu#*R'~~[,2"-C!=1X7._ J:,m[ꫥvV?F9q ƒXWZiAkKW=? HȟH7b~XNr㍥6H �@>@YG錄M(w.Zu@��L`^L;Cٚ3gj78Q{j]J�Sץ@:I[lQ7PjԨJ6[#+yW޵ԢEܤm*]xaT@�yNw]X.Z-w-|�Wy~X �@�� �@�� �@�� �@���"jCˊ!�@�� �$0qb 6ϭ1bsJIWr P>c]wu[4m4^0`vBϗƏedlrƒ$2L͂5j'$w9P("ඡHvsi̸?>5ls߾Q󛅊k‚o…#c[ҧ+JX5_@�@!pmJ+;7/T=|ygKg� �%%0}L~<@;<Pw0(PJ$;TtgϒMJ:/{b,ss_H~xX[./N �*&1cދG\|.-ޗ\ď[WqEX �@�� �@�� �@�� �@�� PA� �@�@y\a)ϤI1輼͓N>Y`> yt_ 4Ht !9jժv%3O>>0&I˩Sc5:u]waQ$╼<uRO>)OQHԼy=v ̝+-lɕ-WSOI'(5 vL+&Q%>%1d*,r5=ZzmiԨ<}zNq07 ý$@�@p+[FdYE=ړ.9GZak� �@j L~K a]7p5*)vrرQxfJl6UmMkm\8OJqcɯt�s㍣0Pd_2쫴 |9Z~UvȽg!w@�� �@�� �@�� �@�� �"H@�� �@ Xd 9o7c`ZK. !"BȻ;!ˤ9 j" !$Q8ͶhQRd.[zEwi /:z%"qt] 7 [Sz=]_KBx6m$ !S,2M 6TXkA;}MJ]1`*9S� �!0rdU5=EU- wKW^)@� �@ Avvw4va~*�l 7C W_uIk#{,E^% �|!Rmshgcc>\oʗ}� �@�� �@�� �@�� �@�@@LjB�� �@�KHBU:Qwyg&|we21dyB`iĒH!-8{WZX+t˖y3T`L,qt-R%H;T0էH`޼((9R.+Xd#wq*;edD~yvIQ5i"o.s-<M. Yv q5tH"-zu֑Ue �@"k-YHXQG!KW_-Yt{.X� �$0wn'Wz">x,h6# D}4Ԏ;WX6k]v{ΊҲFH '@}t9f4sfǿ${LG@�� �@�� �@�� �@�� �@* J � �@�;ʪ<S:e.^z)BCqND@-pݸqQ 䐩4mXUW-)1H(9O?]zQifM[u)HqoR:⋥SN =d_! ҥ\,YHR\QX#MibPO|>O/L!tŐe۶R%V @�("G)Fe%7X�MZzn\stRÆo-t+}m$@��򏀯ݟ|R|/|Ciy<.Ǐ^\J?/tᅒsr?ֲ,w$?wJ${ts߬YQh&nѢ&kʶ �@�� �@�� �@�� �@�� �L�d}>; �@�� .9G*O@"ILoY_Ǝm6hRF `jh @y+I[ҥĉQfQEhI [v$5n\ cISOF?ʂ:v,]KABo-^#G-xKC{5Q+̝HȔڴeϑ.U,rƌxvz̘Lʟ[i(TZri(!�@�KND3||2{w_X?I_% I� �>w{sߗ,B ]GKϜv/uuT@{E%鮽*=[o]oq/  m( \�|>܇f[� �@�� �@�� �@�� �@��'|6@�� �2�Խ4ztY0 4tP 4H":Q!cњkHF駟&Ec*%0}z Kb쯲c%I_;y1UZVV{?i@i8 nجJՇ-,3ϔ.X7v}>餓JWuք eLe_~>Xi)dCTZٲeZzJORH_<mQj-,ڲi@�@;ן~Z7EDemϵ�"M=�ɃTˠ+!�@�ݟ=KAq|_məg.-n,.XP6鬳ヒ}'"-|k2D:`WހlH[ne.̅T=8s]>Zvi`1It7F@�� �@�� �@�� �@�� �@�UA�dUPd� �@�@^tS魷$hRZv(J@&_oQ'OV~ m镑=3݃]*ʠĬ 1 OE~M-Lr\QzAΕnA:\㎓N=UZuպY&Z>{4|x$ׅ6pgHK-iތ{kCEZ YV^yeAgw-mO$$uJmwK"}|~v;JU� �N+N+)i@d7W~,(t\ԧ> -qsOn)އ� �@`i_vth6݇ac*==#͜)]ye`b)lmw?Je6?LjҤ)!%eIAp|~ot6Io}W;njB�� �@�� �@�� �@�� �@�KN�䒳� �@�@p@W�XjC�&0g=4hy 8l/iڴi!s`[5D:6,h+/,2t2|$,LȵBA#~uҥNw]:F $w.ue&},ʲ|+-17󣙘$a/n_-[.>A&-9OKZ,1>OJ(|� [ Y?U}m|A92^+tғOJ; ]pԫWׇ5B��+P7I\o^wI]$]uU8(<0o>\jݺj[ L%6K P6 7fLlqZn(>z:eq� �@�� �@�� �@�� �@�� PsAk@�� �285l(WK/�*&k A>;N[ou&g+ y2drˊW̻Sk)[H�gF%IJ$Q!u 7H\"M*}tiG[<d:Gn::xAŖ,p[(%f̐&N\A=I$D&qenڴ3MY qK2,HENn{I١COt{ �@;^MNq }uҢѣ#sΑ8$#sϕ\b >}J.+@��*G}_MM@BN}yU2׃}tH/|;H,]zEE|ݓ˒.]wQXu?Q~ɿ'R5z�ϑ �@�� �@�� �@�� �@�� �e e �@�� �"XY]]&w*Z @`f{'Bk֭ Et4 % !^瞋\/ @Xh!diQd$ҁ;ƀu-t BYYo.X2E:H/ǵ""n@0W{׿^}XPVMem」`Zy0;+2 "sKO[]^׊+JI YZ~fr$Irܸ(ݰdW'y-uv9  �E}@a =lFWZYS+%MHCT:K۷ʫ !�@�u@7)IJߏC ,|tiBO' (=H<2vy qB؏<㎅_,x,}~t}޳1 S~A �@�� �@�� �@�� �@�� �J�d}=7 �@��[n:8(u!Fv79Rg}{rkՠA]}:]7 P|mIAIlXiA:D`Fq9ٳoB/' !{\~}$u7K͛/sjE{Q<od+\̭WҤIQ@e9dYӖV #[RH!+/p=-6-,+;0"X'K:}9{5.[�޾Z߇_u6QP$|[ҰaRޒHj=@�W^ Liok޺u�1suC~XeOYK}3vH Vv[Nf~a.SNbTܒ\食 l]? �@�� �@�� �@�� �@�� PA<s@�� �~ڴn9B%$8 ל9s*ܳO?]^x,$Ab)d )`܁9 t^{mIJ_v<zkS]vQ8 [sb �]:Tj۶O b6J-_7 ]ZD>>IiUyL5o,"W],kڢ0K,zr%|g #s_Ċ@MO2$^aAl/_5t[z) m]ԛ@��p<(&2 S9mZq-BG߹L9f�sΉBbr%ۮB{uҿSjoa@VZhc[`oM4m, � �@�� �@�� �@�� �@��*O�dY$ �@�� PCz/ejYδdGw뭷[$@ˊ?xaQ%'EXiغ.,IT3}6 !-rp'KG[bvǬfjV#H'E=YqI%}AtʔbQdGi<,\eXz+$Id!ҬYq $&xM �T W chݥuZ|Oa ݾY �@�uyh-=b,־?bDz ُS#~/ő^:?(<` pK|Q=-_o=Kb �@�� �@�� �@�� �@�� �@YyV, @�� � .W>{_o;3fhΜ9={vg-DtkIjܸq&sٲe Z1+Ë#Բfk-Mjɓoըm^ziyDZfeԻw c}D/|%>QrYSJ?Rgtz̜93Șb:r4}J٢4r~ ^LS;YzY^6ܼlĥמ$3i^&MAi:͂yBir-$\ZRV81:%j {KwE?傹 z}'}S?Ca/K}L=w</Ʉa0bYm>Zˆ WA$Z ;Ԩ &28- EsEG~rIl$ #dҤ뵈2W$tilVE`@Au퉔S"ӾKs{:߷9O'wMmti˹s&#ssq;#M4{2k2M~+CҴ[n8))s_f6^H") ^d� �'`Ѡ£9s=]=ے?=iy9Ғ`)W\x?O\ϔ^`*sBNm}fjS>Hө ~l`Cqr֧݇ߢEn7s;1=tKz UAZ}>Zď;t()zF �@�� �@�� �@�� �@�� �T/D˗C�� �@�KHWHC|$,klݺBASw~ 4՝wn{H$J$==9_ǥr0t/믿~vnݺ9K POXkkܸqAl&Hs˅ʎ;>2-im:;вd9L9˒'+ZLE-)OH}ISHIDYz)2t�VdNIRKҜt V<R}Ԅ駒8sE̒KK"ڢp%-% ݶRAR]<wX7xnT?SL ⃯r7d{zԩџ)|L })}͝n,yo3+*}9/ J r'qS>J|lȷ|m84۶m^%`W Q)}zL bHiQ_~NEJHKgC%;OV#|U3I$I3䐾(-LV-� CnGXD;ixO)+궃/md7R#s%~{G)jo"S#k7* ᾪ[}, ~'M=FnɥaIoK}(ԯb d_}U|9LC��j}e9Y$ o,*+-}(HGg)S|R7SZ붾v6[ɺ}KybTOԧ~ WƘ;R_Un;Yj?7}z=h7<yΩ* '=ϯ`,ngNގ>LTnn,r F &ߜGV'^̖<r""B�� �@�� �@�� �@�� �@� k;� �@��JpqĈE7ȤxС,\tҥ\sMo>Z䘪Xɂ &d$ti道6)3,ֆXB<@:bGxF3,5tfYҏ$KB$'L/_:`ͥdUBg陃MPcQ:'cnN :g͚ KL<ev0jYj a>tcǖD&Y)3Li)dEpHI `W`eiР# EKǏ/ݞ 98%Ku�IJ+y"BN?4;gYmQ%!f*H׵\{)_kJd#onPEqIDUZ /iFܛđ[- M-x:8ߢ4[z"J �ۆItkbJ"7YąIhJy:׹Lvǩ%ŝ=|rJYIJCr!,v-W#.Li{M; rK^?� �T -x`)NG+%y[toc~YPߥj̚5ҍѣ42xpxp;4<t^\nq(otNvp/qX2sK?oqTr1qГI履~Nc׃xrq.!> -yLOpuU԰Xg"A�� �@�� �@�� �@�� �@�@@DŽA�� �@^p3<zJO>> Q*LW^Lf͚-kZ-t eK[lvqGNپ8|&`镅E xݶ AIIJp&`P{YTcTg L,<M>I\c`]g L,# K Ǎ~Z,gI<=!hXiQdz{:[KJ*:g!~EKՇ!b;6=? eovwmҿ7|.- *Sq䚩NS*7~a9D]H@.Mq�ESDj\{/>_[hmFprDSZb}iJ8=krnyti� (\{q!qc.ON�퇔ݞtI[HZ$)dpt,`)-`uk2u!֐dB뀯 ]O, Lu i� � XHoq7}K9Y^e>=9&A}w{e}\3%s5 �Q dGmBo+ )B=H}V~|nNm~;r 6@ݺu*˿1L11}>d\@�� �@�� �@�� �@�� �@�E�da/j @�� �&`? <X�Fev!'ZWɒ{(V#Z��@�IDATNÆ _|VZ_~w}շoHcBiӲK˫r%]KK@T2˭V  `$)dL\9+6m}$&СC6QF@f>L ,) l^r΄w14!(2<&V3y̙?0httM As=x;3HvC�z�ٲ;vׅS ϒ?;j wigIh}%A29EZlE2Ƕm%H^ZeyşEZ,P$@ XniG}=8%KS!uRkK +5MhGIs <)/C|j F "EZk۩WN\.$@�@9s=e;+\M3YXV[o.^uZ#vZ4pp_-%g*O~¢x'ʴfhv7Ύ KϿ2kIt ׸qђ$|ti;ʐf@�� �@�� �@�� �@�� �@�A�da'j @�� �%ࠢKs^z i]vE{,lݺu[e+nӐ!C2 5Auvi'D r"`>Qc8/ qt/R$He3)% P,"Xieɂ�ϥS0"<R"IdEr!n;p-<6Daݦ đ=j%\#|r,Y _ۢ\ϛ w 2? 2 ^gaEs!w, @\?mE˾`{;o;o&lͲsZ"�y -2%J#*scKnrp-9u'/gspJQ(L/#4D'v|ѣGgt]7n\&tn;l@^<B_rnhZDpٲꙿXs۞UCݻw׀p A�@  s*˻oǟI}8myssyR!~G_~e1Bzv<Th< Fn[NM7T={jn x>Ӵ-a "c댿V_�@�� �@�� �@�� �@�� �@`1 \ X, @�� �TokV3!ŏW߾}�*D4qD=r1s1:#B@e P X` HʖLy޴iӲ54i$~Y!DfH&Y ,_}U&0&M-7I/TK!t颮]epH5CI Y 1K q5$r8E^~GJ7߬ .@: [2vѼI~ A N'"fa'WTfm?ꨣP^QC[zurnX`{<ҦÏA[l~_eْ&@GZD`Asy~�[-w MLT˳]v<sh7?$L*(e۶Q:JRݢ0:NuoF)ZA&|hԨQP'p}o_*۽$v_S. ȃ8&I-^Íx �:ø*%mԞ^v޼j_ƾ_SNm:]}Hn>z4|0@`R:{ gIC`VSoF_{"+[}Ѷn=g*=˕)|t_S} I 0Uѝ� �@�� �@�� �@�� �@�� �zI�d<4 �@��?;O6`LrxUVշ]z~駟tj!�(D� Xpg;3ey< @6lZ+Y~g?H2> u329%]Xj7i`${ĥs֭27KJ! ѱ9Vܗ,ij+WEb"Iu%]w,'}糀x}˂+lᆈr1$y331 w[fm{: P,uL\Ly}W|O�͂qx8R{T,-!W4I%k+TKu{L#v}nZ·e}?,"u44Y%7|MveO"A�Ѣ0-s;W"t6N4JrHJ E<(СC3dPM[gXkYTP,̷,}+C}OqU`.iA~l@ݪ /GnZbҤ=o8lEGm'cx'k �@�� �@�� �@�� �@�� �@�@YC�� �@�EGѹ+k맿ݻb.੻K_|q&;tgfҟʤ>%74r,[?fBǵC)w54E,D`jRw}(Oq|Hkf&ձXyM7ժzQfϖƍSyƠ$t\5+ !K ":p,r賅1mDQw~{NO>db׿d9+bE=I`s/^xAf`wvmբE2?L \M&w:In<b ^9wYoIiMi9NX 5E`NZs*[>XL7lL Pt߄!24y]* @=%yʤn:[+-sDnj2[v&.S;6L>Vn!(?zgكڧO㎲}G`VwcذaYo=rp=Ȳ۫2Yh* &?Wg|eb0U7ܾ${\Ttך5B�� �@�� �@�� �@�� �@�@]".M� �@�@>'xb&.g}4p,R>]pc-s Çgs<Y`eN=zFmTwf͚fB�G`zKdKX-cu[lw\Zcâ/(�ܔi3K>L:-lNjժ}, dVY\܉'G}T<L&H;찃j+!%tU<_΂~LsvmvMᄏ O@ 䑖 #˚l~XX<ej(q,ٱ<"8J$_ $XjQ";K/B^TG[24R^+i%pH-ꫯ6K/$g_~j7$Qn[νT-(6,6ݦqqsYmL acʖ6\cvI7b6>P,z{S_Ν;g kϵlWXE Kx =c2dHỬ_}}~TS^sM}G˖qԧ2 J '!y ] @�� �@�� �@�� �@�� �@�UK�ddm� �@�7~LG]uU8�u_3<S +AT[d5Ag}V/b?-4>ٳ([N�jE<of&dϟ}Y&իW&1z3IOkbliL)B׋xI4"M[لe75<8ެ o~đԷo_%&`,`,rZ5bs]&a~]z#=X](Y BX ,<2_V^9J!,\OzݲefϞ -Fq?~|&C8>}h֪ؿzB`ڴiz>˪G rchT[ eau[ I�jۄ9'bgΟMnZv_eۂd@p_mݦ[oUcƌl'Q PYsMx Bxai^91*V|;6NrҤϹ,;u*<I� �@�� �@�� �@�� �@�� �&=@�� �ÇĄ?cʹ4 i(R.Do5\KYQ `ߞz) 6L?.l1{$M5Y�T ' /W^K/"-or-;hvfmP#8{r3b͛'mtys@,(~СAgޙ-`$ 9sd%;ȝwYzsJP (YF$C Gj& tE-qגט喓KH * ֘}lD˖^zG4|gys= UJ`doyȐ!ob}W=@peadKK>sB\ts]yWg>?o d|0mՂ<WiO xwRV:5`�eV{\d:wV<&ѣK;5n,u dc*4<e@�� �@�� �@�� �@�� �@�yD�d @�� �B pW/K&馛j%Cdclպ=V&L ? h>em]& dMd (<ӦMӋ/-w5jT&0ׯvuWkVr+uBQٰ>OYW%Xm"|Iyz3QG;N۷ͪm)L|mдΖZ}KBsBXf` 6iY\dIjoNj۶X E^KV1f0Cx~UM8{ xZ&8zvc0z @U?Cp⴬\Ȫ RqTHm${-yy:7›hLA(\h,\K@  Xw%vpmow1+M2Ez /BxN;4u%5O_vJ?'L|> SD✟QB�� �@�� �@�� �@�� �@�@!@YG:B�� �@ ̛7O'p:]tEAtJ&&̃Ջ*8P$d�=R~p�u}iĈرcv|,fmԴi(�W(4tP 2$.߿&lfC)/Kh/lܸXըP<<> b5t≽ս{,&A@ ywdAcǎSO=Uݺu+=(|#-H'O&N\ $-T1lQdyD|}k<J$-?(Mbi#0-ZU#Q4{4}t}uȑٽA}'4ll%ŧ~:H#dkVq B \21E)[ΘSY<Ď᧾PRkIJgӼDnې �'" jgL'|z+XBnzK/TwpoznU6pO;VfO=0X^,@�� �@�� �@�� �@�� �@�( (QG@�� �2r!Y=܃Gq^뮻~RM̙3íުaÆk׮w}4lO(z@={v&4q@<Dss-آɯ]yg)ļg ,2=Ν߮^zLvݯ_?uRX?dbq !=\Kf>$iӢ4H˖,tҤI@Rp+W dQ"ٲe6YԺԶmGԮ]Ky]Z<鬳+18uϯwW_+2[:J묳Ne>2/:4hy`iELWGg>"A@ "H fbk~&Lk]3*.(  f1�D% wƞg{gNԩ)=k<~Ws+1arkXsms# ,X(|k7nxʧAon~_tĝpbvv|@�@�@�@�@�@�@�@�@�4 2;� � @: {/ѣk׮XU~{w%jۋzc'{GLaeʔ鍊([hQEc &wy7Gi͛7K/N<DPBdI3W}[Vfl֦f܍Ƿ`v!CP( E@12e]wu6{l|zZE!@PP$+$-3gUWf!D2`` xRsGUB!$@5 ],Ijz|K^bb^wO^2h9d=\hw:uW\?c: L<ݱNj~̙9:+Qc cM=o^AeCy0C5l1 Dk]k[i"o1]ں;MA:|esdC( � � � � � � � � �  2A,@�@�*C�+Y۷nfmgao͝;ך(.?{CvرktW .QiСcٖ-[\ 2tNy|XQ#3,3g _w}ݦ:J믿nW^yo(}%E�8ıvm^ ZV%"zB$\a٦Mf7gyij*M/3HRT Thnժe.1+LR!ժeM$ü;}ηӺ 0@g֠AY|MK\ۍ7hr0@ιx�;*k\_M0<8!a Ϋ\yGKK;M1ˢ{:z>kyu:)QӱRՇq.;%t~I'ORĊu&߫K/wYΗٜ9ff͘mulO[̅f؆R\@�@�@�@�@�@�@�@�@�  � F�@�@$ |ֺuk܍5YNup]QeʔIwwm+^zࠃ*6dž @j6Zx≩Y9kFhs pitPu.+g}e]VB%lH֭9C$Y! T�a Tx~\vVG<i~YB`e<<ٹZ}=ڮZ[Bx| _D"ꫯZ6m $! })ڵ͆/"@ ( jƬ^uiz<_WbV`B+Uk\Ckzi!ؑyXhva>DYg} Pn'wqTY#N T",E^d � � � � � � � � � @BL(' C�@�@x t^5}t+]tڸؚ_ՇxM8vm7;c7E/N^O;.\h 0`vݴX_h.c´xw3ϴzB:vKKGн{wS Ie˖٘1c|Jƍ}hTː2e[諯J]>m%\bO>3ϥjF&qƹ🝬o߾RJgKA[li=~'3<n~-ImԨQFIY;X2uT;vu̫SN̥q'fXw#?mN:6l!v.lg}3b_:˷}z!� (R!tiV$W Y胾6m2ۼ|dk9GRV7\۾k4i*mrl?mlȐ!\%�|֣G"hK+}GxfCJVm%R ^սsk>MXPP.c+X!X!1L@�B |v!XӦM5JCO>7|_åu0]_v=]ӧuՆ ߤu.;6>� � � � � � � � � @z d=B9Di@�@�@ 5m45kV7ܤA1SZ~ق }>8I!|_QGa/Pp z4g}|�䭷jg}>~zw-b_~yZ>ʗ/oOuH?`3g7j*0*:SߢE|j*iq,*|w5LNixʕ.c-_N;4OrE]e˚BosԍzhQDꫯ?cuN2fD٥XkxnKh?=O?bSqIVWT \PoB࢛nɇA{kl UV#< Tm*;+J|օ�q (KdhキsV5Sĝsaݺf5kh?h=Lf!m3]'ۭm۶O*2$o裏kj:ww`XڵB5m6o1*HQ۟{kZ<CpcX ,s]3xY}qu 5PR> P|6\=g:ONsLBo;U+Kud)U´+*C^ӵڵkgǏ.]ؠA;YB c0@�@�@�@�@�@�@�@�@ JI6pB֒^{-QKd9 � � PTGumtw*ȆW_ ڿ/eިQ#L^lYv]fͬv6ylݻɲ'&hDag Q٩Ŝo&♎�Yj")W_}e+򩧞*2*`7 )>- 4it޳SMzjsϢ.6k|[o4Í7]ǎkz30A47|sE*e>|.^3&m9sXO<DS%K\oOq'xc 7on 6szGV)�r3fiW\q{7X&M4St]vY U/Bk"ղ@ u;/x.[\0.T~N9~|0iڶ^x/]/^:o8d& c=dEa V^ dwM583]pٹmV&uիa\:z>Wд:`Fe)\s!Qqw9@ ?M~ 0%'wQF롺%u%:w:\ʫ l&;|7M2eJF='2@�@�@�@�@�@�@�@�@�J@�@�)aSLQ,UѾR)h,t _<Iݙ]T)?Yo?TκuWh_2:NpE ?/|Úv|YBjՒ8ZV )ii'p1ō'￷O>>ŚfcWu7&tM㏧mߠAL״iP| ͥK/4m ln2xNT \fvm_Z3'|b-Z0^RH" Tp3 dI@t @ S<Z˛]ts|;-矟}3xٔxޫW^ܛs1$qx;{pt6sAy@jaW{_a! \~ϸ~0|5*Tj<=]=MALFiaƓtRF� d_}QQ!b DfɼΝ׺b!D|w}|ӧOO"Y � � � � � � � � �i/> iOE@�@�(9gv7Aoqa. !I݈#L˭uvW.b[ncz!駟6}=>4~>F!O?͜96mdz/p~˭_~[ nٲeW_0]'|<L:t5kqa= 2$-i \rLHGB^7xÅr \qO_mM:R=#~0]s=~@Lzڻwo0`/?'NaNΝ;Xk²^u[v5jȎ:(榛N1sڗoVmMy'+V0~ǦO?U+gqk_U [n><VF?y䑾>g´?g{뭷k/?o_+C{]ƫCN;4_{V@E/l:vvM 1j(f&/߃ԩd]kU]߃~cƌǖ]\uUTJx^{VZe]w]g̘\cooQw%XmVɫ(/(+:N4hmfW[Iumu:Vu裏Ljg^^Qѷo_?lf1&WToX\RUQϿ9r5k~z6w{GAu]s,#U/(HBt @ (-tʙ 5w~c2ܱ1c駟ڴiӬf,+R+oFvm7 DEf{7!|m۶ۜ ;ɽ]jfԩ-fpx b\LA${sTF֭;]&kb}Y. E5*E_==륺[u_C(k-# pC�(]qTv^JF;Uۙ rjs'ߵfZW2q=B]]3O5Zu\/y("� � � � � � � � � vG"@�@�@  JFpH.]"~䩧 :lܸ1r'Gٕ]@dąo1qaps-Z ۉz"ժUڐn+v `w�>.|/RV-_ΦMFj֬q!9I 0<�qaȔn싸@9{/| ./₿Hv|.0{Mq^~ ~@ 2,Z(BZg\xYg[?ͅji.0}nРAl=_~zLJ#5j #t=܍P1iҤ^+h{<듅 F7nQ=8}H׮]>3~B \WąhF\:"\lą%i?|?mi>bq!&~ކ F\`cݰ_WT)2͛7/BPTl2re UO~=s".|C]�g5ߵ^맹͈ s..{. .Hɮ]/~&MI/%^SN/KTGujOh_ӴPV u}!VgԩSz]vzًʰd?(z`„ ͛7Gbw&OQMӲTȳ_H^x<FA狀>V}((G5]VCaf5ڴEi(Pں;ȷqPttL.1<wn~(|0VAeIy.z֭[3g?_qsl>46IѷI·vm$ҧ+*U&kwqF"Tp.!F֬뎑4B� @5g"ٞuNPµx7"N:b]Nd;5k]"|]UX]}4Q Su3}+hVG�@�@�@�@�@�@�@�@�@X[#8K� � @Q y睑+)EP\2erOu*$R7=?̯It)NF >'N*LAFZn<xpDW+n&>T=ztԻU؁w%~%h]tQDaYЅ@G? (tp~n,"&ji@#GFr8.�*DЫܡka?6qٳiaBېW}ry>fu knTdj׮#dwԨQ~7tS%k A6t{aRC3 QQ�fU}1ci!Roz~s==pV:uC=ˠP݁sV.]9eʔ*Wq)\pAnOEV;wc2$#}AjO)GAj;v_a:xx֑XŲ㤦#<ҿk7cK8oxD~t @IPNϞ=j۷oхR{;Ajz^6z/xMKyk�Xa_P\6IѷI7=LF皺 'D"+fA 1C� @h֬YkMxuN ^o;5uDSs_o~\]-;V{7-<o]{, � � � � � � � � �%A@�@�!B|-昖/PGsaknD p4@f_ Zc9\G0݅֙X~}}mذaB̅2fYJeyP#.~Gsa֨Q#9erʕv >֭[gGu ><{DJ&t/nٲe˶)d rbŊ {h޼?9CEn4w~is7O#Fof.lĿۏ0gϞm.|\hߧߌg_?qEUV쭷2:f^xa]lx!V}._SʕMw_ϩ^瞦L]˖-,vu?8{ZA#.ִl՝.lϮlٲO4;ܿ;M =oə H^G{Sa?.,տs|r_5ks13l0ٌ(rjW__1W^fqvZsզz"w{u [uoڴp ^:0F^ˋ5=Uqj]讻2l~_6.wq2R9}&ԯ\/B�R@ma^EخuC]/.C~ZwێhYB6IzIgOuzܯsMs|6;sج˕ٖ-9_ @�"k8jMnj{A:SCReo0]A׺}k|ّq]�,"� � � � � � � � � 1AfWEA@�@�HnWPІ ү߼Z͛gϷʯOʔ)XUN¼ 5;蠃o<>SnzG>*(r…<ump/eϘO!;:s[P|:߹SOO?CMKP]W $Յ}ɿp|>oСaR0}={|F `?lѢE>\U!4|,x!lcSؾ믿>~裏|v4lU`叵MaZa wvou7fѦC) S6ӄޚ4ibсTL/n<yr̰t۶XuӎQhO<9rEN4Ν qNPHK`a8lɬC;7A쳏swMW^y/knݶ)s*'}&w0t*@�ҥ)d]Ȥ/5Yo^v mnZ޹s ]x9sfǛqdͦF �Hu6cƌݢDS کM27 ͻ]k]e^n^ӣk|q=oɒ%`ۻ >� � � � � � � � � @& IeE�@�@ EmڴAeɸlwq }w'Z_I7}9}ڵk瘞:u ? L{WM*U 4ݐtٳ˙>}!*:|- KUV֯_?;lƍq}&g:SZj>'O?Cږ&ش`aÆك>3׷nj>߷TqYs+nCTfus̉X|61!ayP R`v6m1ݩN^b~ѓn|֬Y#ؐ!C,=6  t'۪U_΀&OL'NcEϹ-.!G†8F/H [/ESQoD9z<azi05k'箓BXtTn]SXs9t\Z)X(;+gC�J@^L'7xcIm5C~,4 |fK[O$_ZE]=9Ǹ<hfͦM3?3@�('pKJ ҡڔ^vo;F!z}H��@�IDAT9yMg{E/c{u}L`w9|@�@�@�@�@�@�@�@�@�L 2S)ʉ� � @ ׯo-Z_=kmٲ_^& :e[XԩSs|?+fPn:ꨣ~7[z-Z({_Y&DPhȑ#O>X\_n0ۼywq~b顰tR΃:ȏڗFՈGUN+mrG /Ж-[f O?SLV}PA%T]aӸqc\>xi@  7\7X{&MG"܋OTѺ)c1:^dӵ裏>;˙~񖫁K~}=O?ΧjuKrC:&YB UK3�#FXa.1g“N:׫9f >Ķx*܅Uƚsut}|cǎ oBc̙.ǹnWc͓iGtL>}(IʕG}4;>=!NvC!EG X05O^rim${Zxqڵ~+Ar}͝l� @F t_5dc!vju۩jW&o㙖 Ln~ٞk|-/,X`<_2!� � � � � � � � � P, 2ۈ� � vy>mŊ?r9X*Ulᦀ.;lׅu*(ko`z衇La{ꫯlРAVzu?-7 GH ϛ6m^شiqvW[ǎ]ݻw7Z~K7nիW:u=-Q#;V2|r}7]|B]M)4w*w}7 MaVkʕ+{ZB ;ԍӛ~!&~a?W5|~gժUӴo)CfC Ƶ }\r%&.]؍7h_jm۶- ua%Kh=TՍ3\uŚg[~lÆ sپkۖWoEƍsU�ܿ;3ުU|RQG+pKP^tsp:v QO|0Xt뭷>o]6vUW=cv-r5ʷ["V B,<azAaÆe!86]믿z;/G@_8qbvpU 2TՆވgC}&B0^SOYδMj[RV]{5؋/ o(NVjC�J·9oQ =z߷uѹB 5><nP퇼zoGkX7-NG Os1$�LҬz؊ڨM6@IZ E�@ c~i5ktM)݆xu6h~ԟP׹ZW"\ C}.ֵ进TnXg"emPеr][Kkۻm|@�@�@�@�@�@�@�@�@�|KX׿$@�@�2_E܍RҘqAwQĝAwQq7Dʕ+7i$nbw!x槗)S&ү_A,lzf͚-[F\Nd7F\d7n8ҵkȑ#͗lٲ޽{G4o6m"6wSTDv.bGs /׊+FΈ 5GѼt[l߾}dĈP./rUWEOq7iKą$nS`(7~mw'N:)#FA iK/|i>l?o^6g TZ5rF8㌈ >Bռ/<P"mC~ɖ-[".X1"KmB-#M>߮]ȷ~=ͅD6o9zsg}s|_ˬ_~TF\cŊP QY]:ti{mdOD5jp!~DkѢEp엩UOo}]Gk%.}i?1rn+QyVZE)n-;S8jٳlGyd>ٹs \p?&\tEmv R rU-cH؇Ֆrw9s\`]w5.*WLq_Ƌ>}uyruZp~g7DS]և�{DDt]a֭EV,qA('|_cP{@m1$sxu5]q^k\? \:'pabiI ŘЙ{Hڵ#GqDZ� @jZʒy}[נt= #bxک{6׹DSFĺU,g {+Vbwy.tqҥ{ � � � � � � � � �;R"+ҝpBb^{-!c! � � P.\�M4\@BKSc.d\ \͛7֭[g.,*UkךQ\p~2,Z\?x}% /`_}HK`ܸq悳7l.\H2իzy{V?\@]N|nmS65jxoGxh7jUTɱDpa*ͅf+Fm&Hs>ͅ%(I_VB*ä`s7@o.ݍiQT}w?vBOSj蘢ߨ#]nʠD?6WAmx œ̅owqPZsX<ˈ'z<U50 ˗[}݅6kjՊHs៖xB@ MT?zY\`?\tʒ \h60:kv$%-zsAMb.\ID�@ yncguI$׵Ea+Vrw}efP寓M0Mf{g@�@�@�@�@�@�@�@�@�T 3 � �H_~6c @KZS?WvW�gL Æ O<^y?LKܪЏo^qvi%5#gW7*P,w`XQ+] }衇駟֭[Pnݺ%e u]gsq>0ӂn1bD[ZjULfM>6KIoAQ򫏣fˈQ_C7C Ij0iFPH@ ߗ^zvڵ^=Zu_uAq4d,3Iו{<?fkn>~?V=֩SL)>D�@}]?DLʄ(TU^~Â?ѯGL4ibÇu&z,@�@�@�@�@�@�@�@�@�(% � � P<uzmSLիiy]vŇ6m4KJߟ4i~v *_lgu=)bgym6(^}(˽j*# ,r%ooCd'N菡ou=d,;Nrٝw郈?|Ӎ7p{:?>}ؾoQ+V;ftk9XEo{`0Or`n`%!KQ>(*ڵk0(<ꫯ6]#袋|8ˤ8{2'{=eyR\ҮK|^tʇ� @Z Νd0[o.+[6{`QXP*md/?lgav~/ uJ/,@�@�@�@�@�@�@�@�@ JE\pB֒^{-QKd9 � � /Ν;n7n6!dPƒR{v1 /`K.)6۩cSO=eF B!o͚5KrR!ї^zɶnj[ K/}?'O7> z>\iӦUXJ-Й~n6ilРA6p@Kfb3tD.̾+4`�~ š>޴iM YRQ@� йaL_m'tht h[w?UW;EUV-u @�b(C=dۿoS ݶũm?(mܸ~;l{?0. � � � � � � � � �[ u � �$L~=zؖ-[߶?afA <vŞ~i+SL|d \ꫯڬYLao <#;J|Zڵksl/b&L#G`͛7{GV_Q%Xnw}Ϝwy^7P认dj}d{}K.aUTG�(1c[˖-2#뮅XJɚ5S-e}]:tؠA ϶ʕ+#7eB�@ c-[f]w=sͮzTRM(x&v#tUצ.OK;||@�@�@�@�@�@�@�@�@Y\I@�@�Zgg϶G}N?Ulذ."c7x <4Xx6b1c)\޽{ۡj{W"!@a;w;v}>Dqoy HM373<c=-\gyn˗/f8-ѣG;c7/{ۍw@� ̟?ߞx �=(@8餓o߾VR k%O@QSN^{_7QG3Q[� Zonf6lv饗UT)am%N@W䧞z*T{z@ %#� � � � � � � � �#@d>8� � � lݺծZ뮻c~֭LI)S|`/ 8∄,$W`͚51c{gK.A]v5;v7\&,vT@Aj߷ɓ'۴iL%ph.[쎮ϧ@$O>[=`�ҥ y}_'K@tpjuQv9pjB �P} 6m~G}<aÆ[9KF ~Wߞ0j(uN:N8WH �oE}g=)bv gR*oomO??GjҤ)3ΰ+, @�@�@�@�@�@�@�@�@�L 2%ʈ� � @ L4:,[b]wuv饗ZӰYŋUW]|OX:u2sc(}>�AVZejղ:lm۶oVjU@TΙ3f͚e3f̰?tjӦMsֽ{w;C[d)Xz?6}tQ;#GVr!M^AK*O!�V@aƍ7|?`=yB9Kwڒ/0T?M8?CSeʔnݺ1& t � P/sꩧj}ݷ H 2N@'уp_I2ۤ � � � � � � � � � 2@�@�b$i&[{=ӆ bҥKLY~f͚v=B D"/mڴi>PLs~*Ud٦Mkժ[haիWOjyX8%U`ѢEG}d|�Bz*T`-[[NCڵkT&;O?do1jwҫW/S~;H&L`w%իճ\@�B V8ިQ|pٳ ]뮻r̎@ (TQzԩS}믿ZF|XO;0TR#� @?~zH~gw?\77lO$#G'5u=䤓ND:x@�@�@�@�@�@�@�@�@�Y-E�@�@�} <^y{mРAv)Xٲecm~g裏+.Ri)N`զ@B*N%Kv6h^7bV|b! ~C'ڵkL2֬Y3kݺ)!_&2;v;>iҥg:u& }"<R}B֭ԻwoVZ*ź@�S@uIlĉnWH|֮];p\SNc>_е3g~ׯ۾j+aÆ)�KE�@� M(o…8УGa9I 2b}:n8<yֱcG;裭!@�@�@�@�@�@�@�@�@�4 2 � � @ |v뭷K/i:,;3mwMKZucO<aUR�yZJN 裏|nO7)dq>,D!oҤ!ˌ-$N@Ai/'W4>o<S8:)P4jʏWX1qaI%Z@u{oVhB~VÜڷooTf/b % [RhX5LՏ?ڶmC:we̻ �i)/mƌu|vnU,H˯XJ!P ," ]P(s)k\کS'շ � 3j({w}{UzHU.]Lj WqS/SSL˗A)T!}vۭ8n>ۄ� � � � � � � � � @L5+B�@�@,Zq:tAҍ@7Z`>LO?}>γSO=vyCaK --n0po6oWzu{M*0aÆW.]~:|w?)XÅ 5kf͛77 +4g=H͠ %D@7J+RN }Vu-;I!O>K#f*VA!`iܹ?tСYRУBJ*Couz-c{-!@h.l^"�"s|ᇦO>6nCtcz񨭫i˗ϐ-$گްa߾hڴoz\N eA�@ 5ׯ7�N4ڨQ#Bz`MTP!5b- Xr?5k]*Wlru=PM3%"� � � � � � � � �` KϦ#� � l-[7)o߾֯_?;KT%Koàt�ٮ]d, P<B*OCi$)A>RAdsf1/>�M!hѽ~ \t)\O]*U <U0^VtLVt3Bϙ3LJ)|GB|CBLC_N,V|6}ٲe>`I!K�HLNAZ mڴ1[\�+V!Raa cw}!;wLh\̄�tcy ڧve˖mcbw}w$[FR!~?ѽ0W_BըQ*<jou � y@=�EuV\9@֭[PȖ-[.yYK:P`O!LwۛL{9 � � � � � � � � �$G 串T@�@�%� @C9;0+tҹ>/7l` ?~M0>3\vG '`{&p/sތ*BCDpB+PO!uߏ?h[n&O),$W)nݺ~XvmSgA ^awW:R^>QF>&ހ<իoV[A7ϫUVN uR{g D׷MZgϟʬ^al֬ZRR-|Du cPڡӦM V=ڥKڵ@ 6n j;(h8wtڴi߸ *c 6סDR2>w"Cd͚5^H݇vC>@�@�P8gϞ,>\o|c}mmmx|}.yp wNǶma|̅� � � � � � � � � @L$A�@�@�3vğvuW;]v}^fQϸ`nt5k}ᇦНza={;;SQ#C@A [xԸ#~}[*ݨYfMUøڧ{u٪U+Wڊ+Luq6(#Q.nիWՇ&`FN%Y@uB~>Ww;E9))O U*ݎ (VplTrh"S2ep&MPn%\NA`3g'O:wӭ[7^!�NVP�f]a�jCh\{ ѰZj# S$Χ/_<-$<>X+Wt~} 7n{S@�0IB|5Z'햽܃+tBPUICB:kRN@N)x-́� � � � � � � � � � 2,@�@� `|M4(DQ7-Ӎ!I7'5oÊSY.]ꃙΤ/7)lٲƩ:ȇZvaVnݢ(*D k֬BE*0aEB SzD]v%PӪTb+V^)` 0_~a|ڵ[}իM-[r]Bh 5vɓ[ٜ9+X\Y߾Y(C�8nI!ImpCP:UaN!IC?uxtX!%7,x%ѡK'C'#B�CȒ&Ln;ͭPH TДvk;@�}6DxCk:F!W;"<@ Ps0ẏΩtu52TR C+$Im˞@�Hg1U z] '55.PQ 8;uOE]V@ЇP\ lڴ華yl � � � � � � � � �%] Ȓ `@�@�HCܤ@ȏ?-*lQ7)FBt{u#X  y]Xy+Wj\=2 C)�-uŋ{#2h=!Ramڴ֭[V'z|  ϢC0.]_(P24Dj5mvBKr!qK!^>.]T7~FּzmzkM uRPw+% øusqVs7Fj\NiVapCPgPu[hz9ӹjyl(w5 +Cs,y@ ' Cxo7 jD(eNS`SUNSVul^WP5ԺļUO  U-Fs^tʠ ɬSNvxCؒzo{|C!C0E0duHCB!%B"B#ws%t 'z}>Z<CXE0MaC#q7Ϲȯu r <sw:'U+j#eE� �w1C`#umKaDwj:V- ہ:\ mpM+ 5]j_ai^Ե^u3Oro֫bF1QPpm � � � � � � � � �d�AQb@�@�JnZp͟?tWhԸn 7Ki<tcnRn }ׇz<l+ ޕ;0ueR;bol[j^n\״kp7 "Ie,iӲB! ^޽!5t!@tnA !(ɡ  JP7`J}?XjЩX!Vm>n"1s̙C6l=^t �=`C]QvDAT;"\N)nݺ!'iY)HmPC}p: m]oR!� �^@.Rr] P CfjF_Rx;Iz*sXk׮Vv( � � � � � � � � �O V!� � Pb0nR+�NCE+WxWHZJjt PV!U'z!z[BE4$+,K4 S^QC]G)1A|_ tֱcV(d߾f͚D j Cյ hSMS0ԑuc~—44ձt&M{fϞ폟͛7ݻ`Ȯ]p䔀"�'vzǸqlfFP"Z§PmЎC)bk jSf̨gw='G#A4T{Ca: `a\G� � jg*<Cj\mkYa|Сl2K}{3\ PøUE>*vdff(= � � � � � � � � � 2,@�@�@�@bYcbQB!t1Y@�PHԩSmĉ>O>Klݺuv0!b 9C�@ Z`ɒ%֣G3~x׾w v<c_•*@�@�0`>|xFoG�@�@�@�@�@�@�@�@�@� 2}J� � � �x?493+r(>3\٬gO>}ڵK<� @^&M _־}`ȃ:ʕ+W$c �!ʮ!?n8W^ 6eY׮fKթճB@�@� ͛7G}4KO@�@�@�@�@�@�@�@�@�@ ̄o2"� � � �x~+efmfBkֺ5P �E%O?{!'Nh?J[_]t;̇~EU<֋� P~ qi 4wyjԨQ0[l=̦M3;")+E�@�0f͚ى'h7pC"� � � � � � � � � @)D�@�@�@�!qل YG1WPH9f;#@�H}0}85knݺֽ{w pz@�|`Gq kom#GEYJf>jU)X/ � @& (n;/MY@�@�@�@�@�@�@�@�@�@ fPY)* � � � � y<ꨬ^?(+r(6P[7}=(# �){Mk͝;N0Cs9yfo|(dϞ=K..|5Hqcua\5΋+UʬQ#3QL� � @[l1=Тv  � � � � � � � � � n{?s'5rk@�@�@�@�R'|٘1Y.֯7;B!۷7+]:uaM �96mdSN5)>!a;vlժRr @F >N>d0` :ʖMgsN;jFqRX@�@�"Xd6}tСCU"� � � � � � � � � @I $|l# � � � Pl12%+r( vó!{2e Ħ#�i tR` &r[V- U={ڵkAI) @~ ~<sϷ|0}2`Μ@�@�0;wiϟo7@�@�@�@�@�@�@�@�@�H�AIae � � � �*0o_ӧ 1)+o_Mӵ (H>S{wmر6Uֿl cǎV\V"�"pڕ.m뮳o9JfYvE@ � �i&0fӧ[*Wf8 � � � � � � � � � P\,.$ہ� � � � Ph15*kzY&B* B@ 6lI&`HC~VJ޽~ֻwos=N� P8ې!C/pNǛirٮh@�@ #}Y袋L$@�@�@�@�@�@�@�@�@�@�d ,Y� � � � Qa6cFV(!ҬjU^!]֘լQDa@�b)pB;yP͛gBvʗ/_,B�M %\b==vg[wf͜ivAٓA�@�@`;÷ou @�@�@�@�@�@�@�@�@�H�Aɒe � � � �-B2߳c l"7#�B`6m4 `yYʕ{vG~b[@ n f/VQ{Ŋf>kv)9 � �9.2 >>y� � � � � � � � � �$R Dj,@�@�@�@�b)~YcƘ-[ff!CBeƳQ @ |>r6qD۸qx>>`+SLmEE�S@A &؛oi={Lς*>| 7z � �D 0bĈ"� � � � � � � � � � 2, @�@�@�@ D"f~ r3i' _#y @(l6%*rVF ݻa3`K(" ^]JGkҫFAj[ � �%^ۤI{K� � � � � � � � � � <[4KF�@�@�@�@ *eֶM7eB.Ybfeʘ]q{jevffg3`@�LPx?}vҥKO5kZ.]쮻ye&QF@V^л_|aSLL {;&9#@�@�Hs˗[ڵӼ@�@�@�@�@�@�@�@�@�2] L)? � � � @ ԫgvYf#F\i;f;Yfu h6|ٺuEZTV�hM_n'N+V/l 4ּysɶum#�۹sgS(δi5[ZOkܘ ȴ( � &AA1@�@�@�@�@�@�@�@�@�("K6pB֒^{-QKd9 � � �?{02=D e_BQdK*mHETZT?-BHD}Bd+[&{v|hhqgw^~=y{"�?K'Gܖ.R ϑ֍Y @ iΝ;n4iw۰adɢڵk^zU2gΜ @ o^ҥK3g*o޼Iܢ~NQ)SQ � �-`?6mZ7N 6 ;@�@�@�@�@�@�@�@�@�HR #� � � �CS#B!OnP{ҤI)HC!-Z UREnyIe @/QrέiӦ)[l pĩrf+R眜@�@~wg |xZ� � � � � � � � � �~%@_=]4@�@�@�@ Μ\kE��@�IDAT&Om$]{TVD0g=  2e&N腟?~\wq4hBvmAZ�\F`]l)S7>-e %5nJ@�@�F`ժU.46믿>iY@�@�@�@�@�@�@�@�@�@ EJ � � � �$#4iʕ}_^{M:p@jJ *T~[dp�0,YGոqtA;Y%KbŊy]vղet.9sTZ5+W H{@ � @|b_R@�@�@�@�@�@�@�@�@�@� 2q@�@�@�@�-*=4k\ИWR"K&*$=\�tTljd@�_ KNw ]K,Q 4~x-[VyucS={Μ9S ~70a2dȐOȓ{˖<u#� �AO^mG�@�@�@�@�@�@�@�@�@ %e� � � � 72I=$ &#ҢERR֬rcc4 +WN ۢ5k֨]vZpW9su֚:utRհaCjJ#FPppp@u � �> ȐIe � � � � � � � � � @tAF:@�@�@�@�@*]ٲKWK;wJ'=+='TԳb M@�(Pxqk^ CvE?>/<y4iN<u2G}-[sO&V%2R� �T HrR � � � � � � � � �\B ܹDgل� � � � ? +o/}tPwJCHv;Ԧ4qt?#�+PH/rٲeھ}z~M 4P9ԬY3/ԩSIZ�)лwo6z-' h ={'t @�@ <E�@�@�@�@�@�@�@�@�@�8 '.vF�@�@�@�@ yd թ#}szS/H JYJjI,mۖ<L+@�&?~=sZhvڥ7x l޼&OFC@  WϞ=5p@/65M Hej*D�@�� I  � � � � � � � � ��A~DL@�@�@�@�.%P+?H{ʅH\P!ۤ^ #ΞTMlC�Hܹs駟… ]N˅^z Q˖-5e>}:!NO @gİu.<c5Jڵv@ZY$mH/ � � Wԃ� � � � � � � � � � rBlG�@�@�@�@gZƍf͒jԐƏ*Tr䐚5J?E�@ O<ԩ/^۷Gڴiԩ9s};wΝ;�  \kѺ/_T+C .קR � @ O$@�@�@�@�@�@�@�@�@�@'&"� � � � _`Z5_6n^~Yڽ[z챈Pʕ}#<� ? ^{?h۶mڵ/_U*o޼zglٲUQ @ ǏWݺu5sL 2Dׯ׆ b;V-*mxG � �W&pY:req4 � � � � � � � � �   c. � � � �7J/ ͝+wQ4b2[7Kө4k( (P@]tѪU\pFkNӦMSٲeUpa֭[ l95jh՚7o4h5wɶ;nX"Aڔ@�@�@sO&}@�@�@�@�@�@�@�@�@�@'&"� � � � 3K?,}hԨ4g\8-԰Ҿ} D�IF۳gO/~C=#Gx*V }K;vp#� sJ*i׮]ZpJ,J9rp.< ?߲%tn"� �ZVBBBb} ;"� � � � � � � � � � 2r� � � � @� rsԧnm[KO>)%)#-Z@+ XP;m^p[շo_,XP+Vua? MD�ؾ}lMp , R޼y#A)|W  � @"� � � � � � � � �  yńT� � � � @ ( u(M":$M((!  *%$o/}tD!�Q (( qOgM4Iy?9s~;vO@ 6lؠҥK+88 ̟?[  <wN@%}C�@�AMVYd� � � � � � � � � �Y 8q� � � � �)KફzA]+vUBǤY:u$K;R E�J,mѲ!CԩSzG\sUxxxR5"@2X&o+V_t#GW_Ϻ@^QHDBC @�@ :r\a@�@�@�@�@�@�@�@�@�@ 6AF}@�@�@�@�@ Jz/~])]:K@D W~Ν@ 2f̨{LӦMݻջwo]VUVuruMׯOfP?$C{cwܡ5kjɰߤk lIssF@�@�+`A @�@�@�@�@�@�@�@�@�@ 1L e΁� � � � @ )=7ҡCRJw]8-h!'=t HFXѩS'X l֬F[oUKV~db� %߫VZ^�Idak֬I]EwO F�@�X z@�@�@�@�@�@�@�@�@�@ (ܕ \ƍ#; *P@�@�@�@�ɓ#nKHT խqfeaOqd>*Zjʐ!׶d0@ ߼y_j:q %֫WOҥK ޽{5eo*RyqgѠAtƸ_ [lG}uU5jp @<FT͛@i*7oرcʘ1c<k,rqN8ѿw}ʕ+_e>>2>㔏@u � Xzܹ5t>[/X@ӦM>;Nw~%'3}vMy&M> � � � � � � � � � Lܥ@�@�@�@�@"u"wtDΰaRHԻt ҍ7J/ ͝+>Ȳm6 s؛6m\,ϝ;uiղe $@PPTYXءB={VM6U\ԡC-[,Lϴc-] u?.ʭ[jؖP}矕-[6-ZTY(=zT~{oto)0`�5kL:u]w.QlΰvxX ى_"^^}U@GgJP- � 7s_/0)aaa^Hý9}{QFiĈ^Ν;ό@YpaeʔIf1 � � � � � � � � � 'AE3@�@�@�@�g뮓yDr2i|~}iTjU){vqc]GvZj^EVRN_U6l8HH{H 2dP&M; ֭.\eꦛnR>}k׮@>u]z>gA۷ns,B ={wﮧ~ZYd}ĽIv }uh`%װK}` x1AFX֙30]{wK6'/{LRq*)9@�@�$p tҩu˵9߃ƱcǪ_~t^P͚5S Eks#� � � � � � � � � AD@�@�@�@�$wޑ֯BCŠ#Gm7ߔ֮ 'L_,0lܹ ?<9H=SLɱi )+W.uY?~GըQC,,ΖG) HI%M4nc>}XG>cʓ'OfgLK.zW{xZfśRc ;b} ֳgϞ?(λqw@�@  wkWΜ9/~n`Ŋs?ShӦ<`# � � � � � � � � �la@�@�@�@�@3DK9S<YC# ԑ֕ڂ|w^ɓ'0KzalO+w^-[ny78-x?׌3TA.h%mS8~iպkԢE ժUjAGÇ|j׮0-YoW˖-)[o|z4o<}G /77n =⵱^zYWץ? 3ҥKniU{ݶjJ;v?--[gK.5Dmۜ9s4~x;w[ݴiSf\Q7n3 YkR;I&y￯/ҽݻ{{k[.Rl|{@tDz.e O<ޣ>#>E H+[A"m5b5/_>o^dcP^^J/hĉաCwڴiꫯg5kLqv۷oJ*͡2g)Ȏ2dys( ٳ}]o K/k^2dP޽eƓO>靷QF^XsN <X˗/Wƌ߾}o"s, � @ 8x}u]vc8gkY@G.lժU3f9`޼q۶m;Ϻڵ]cSlhR> � � � � � � � � � @�@�@�@�WBplBje" f\N v@\:|.M:U 6j(zZxo-B.9.2BnݪrB,pl޽^СCeg*TP=d-XY^G(P AP-.IB T\Yҝwީ? �5c�?X&LЦM~zoۥ? iӦuku׮]8`6^r-^ \.5\ܯoمOV,YB m,nܸkV,3 Q6oZw-Rb7pN>Y`^*J(u֝/\̽k;"OUR%q^ c9ԤIn-8127͛7w.b!?mA6Obㄅ<XѰaCo<-SdƎӧ{sB-<gѣGuV@Zq D;N>*U*o~٦Mog0p_@�HIYhMQP*Qz!/µ-=`m/ ow%ᗸ_Z#� � � � � � � � � @ @�@�@�@�b!$"(I+WF?瞓 Ñ )'[05.]v?/+VL4l09rD& kIhA.1󫯾BCBBH>ha۷Bꫯ$=>v~o^]ޮ];o]n)]wuh[Q_xEsXQԩ$eRp@ ,B,4ozXfsBoRcOԾfE۶?#^xG}맲ez iǏQn96Ǻ%BLrx^@s\I/Wn/Z4"2445kͳ,Bz,uܸqRgPBޘh"u�WYudxիuis: Bmȑ#JB!m?zϯk! .Neȹm={7ﲹZtZVdf͚{a)= �T.ˊ_jc=fgjժ~\!,pY駟Kz߉wxc -ƶ.C�@�@�@�@�@�@�@�@�@�Ht � � � � @r V:tH.H*WN.`P.QʕK.pK..؎}qO|̘1O?MPj^P (QnMG.f 'L{ءC)R :yr+>}z׻: wF w,v̙3gHZQz9s].]˶`iTɒ%5i$/cǎ^/׾ *$.ڳgZf5R<y0 MQνX<u|xf+m|r{ZؖĶ^ ,{O{ � yÚ5kb{9qD\&25j-6jnes- bV"|Fgzͻf6JܫA^=՗)S&5mT޹`o_k <u7Ȱnv8esJ q'w=ve) �t+Ӽ)QͽlXgF Op jܸ7WPؖ_c[/!� � � � � � � � � @ D\l � � � �  \Bծ-}\vԩi\0-\8o]ѩ` 汰0FIƅ^KW6oWD`Zcw+VxUVi˖-6 ~<>^\˧OR9-B?soO? ب~alR۶mSeaKw@ l|hҤOv~i/X[o_ע)'jMk˱c4tШ\@o< Mq}MXP*U7/ЂZc[,|o"EAJ'Ҧ|b)r}dpOλl&7I@yoذGu;<ͽ,g}ݿޘ{aw�ގQ6ۘ3gN 8P_wٿK T" � c%V,t;ySԎϝ;W+WZnr…]1ض@�@�@�@�@�@�@�@�@�@ qL\oΆ� � � � � PԭxorȔ%ԣ\ؑt-R.raIҙ3 �W5v.]e'OQHH #:? W]u?^I'Np2,TrРA0޽{yZ~tҩtҗ{2,8򫯾kƌ.ȳ|ѾK  аP͚5K CʕK?ݠ KLcOԦj 3f v,v9/p-U= _`ܹS*TJ-Z8nbk֬QAZhxlٽiݼ˶geyqٺuūTRϯڻY8&B˖-=<7ԢE ͙3Y� �)Q`޽^0c7Eu6lC).!Qe bAݱ-ٳmz@�@�@�@�@�@�@�@�@�W l � � � � ٲI=&.<(n#ծ-}T#Դ4rtp7&էMV~wKRVX 2nADcf-E\:fƌ5n8ZaVfa;v8.Zj@zx@۷vܹ,(rcǎ~a]]g+nv𝀍CժUӨQ뭷ƖoֻᆱWXSLc(o S3gN⋚7o^:w\:uD{V,X7= SF,WS/^|տdɒ7c <uʂx}neno{d�);(%r^+\z7]ƪ&[Y�d&MK/yӽX /9<x N8熗<9@�@�?Fm _iիWw?Bkl}?u{lfU~gFۥL_/ � � � � � � � � � LfOA�@�@�@�@� I#U"\@Խ\ ԪUD(d oK& X> :o߮7[n^X˝;(da>C m]Yv-ڽH=3\:fϞ=@ BN8p.fJJڵ�#{|뭷zR2e.cǎy"&-?]wuEV]}cHSOyA+WTժUo*o޼jԨXdT-ik]KvѣѣG{Ai 6Ԛ5k70i$5l0tMjݺu][geϞ=}?}ܟXz}:W\do)QV_]P/^X6l`} ?p^)P,=|.O6M\x.]u62eY8V#[=ۜkujz'#>].;�̙3{Am%2x극X85%[Ȁ{'Vsèu� �@d}VidFy͢~ލn>fqZ9iޜ̶G-c V.hs_2 � � � � � � � � �$?ߞj � � � � �N kV\9E S'dIx[>\W )4TJZʗOJ$(P@JrmcǺzWDH+v ߫K37ofϞC.:wYfy,nݺd/_;f̙] |ۻx݂v m\nWW_}_{РA̡b!ؠAZfmb,1B3fhzw?~UX1{$o pNnb^(n?UhQYplb bn챠_| I1Bm,ukAo6}۶m:r1j(^h@ i!p:t9뿍W^=#mF-<;N*]tׯ~7qJ רk6%-|{ԇ>~keOyq,Ƌӧ{c6?{B-�r͞? ynۼ@H+E骫QXwu|y"'|q;ecՖ-[�qxv3@�R|[ۜySǎվ}{3}ff u\d7wclhf}7׳,lҾ^ئMg3gxE{ٳ{.hK_m?  � � � � � � � � �$_pW|ռƍ#jrךP@�@�@�@�@�p;.P<9e֨!(#̙4ݱ -Bӊ/uaSJ0ƵvYd�cΖ-th>sŴpIO 5�ɨDs틬{H7n]^жm MH黱{e!f'N@|%6WP=i԰aCլYSG8^i<|zxNRUW^: ŋ5Z+.C]F.\|wl8v,3j(sv< ߶G~^1 @�] o޼ |Λawy�o Rq}@�@�@�@�@�@�@�@�@�@ qL\oΆ� � � � �~ s\WD(9+wDBZ0dRr=~�$S0M8Q}:+W.jJmڴQi/ݬ })GޙB`ܸqzG#hȐ!J:u,.˗e˖OZPdJ)5q!?']0Ĕe� � H3VRE|I4{\٪AïfF�@�@�@�@�@�@�@�@�@�H  � � � � @B '=DDCҤIAKKKyHmJ~+?P^@ p,`qƚ9sBCCȡCH"]y8do޽ۯMc`7hҤ|I}> (QBk֬O-4%@@7` � @8|N>3ĉ q>3&+"� � � � � � � � � AG@�@�@�@�@ 2d\& vV e֭|PʚU.Li۶ܹs3fn6qE͑  *_];v_p5lЅWݵ}vOбuҥ^;K*|XlO\$ NyOne\fzZaXuԆDyF~>W\)oN"� @طo̙3kذa 27UwIgc>/'#� � � � � � � � � 'Abp_q㈚ƎUԃ� � � � �$_)Sɓ3? rȲeԩ~oQ޽feʔI;vTɒ%VQ]Je˖-{IH\g}Cjlk֬۫N:J&Ma>=1C?~`Mu~PZ5]wuXW^Q>}d:uJXpir… 'y p4HZhq1}Ĝ@�H$yy//5,,LOޫǾ~p7) � � � � � � � � � |L -C�@�@�@�@�?pskPH tJʚUU+".d~O?^z޽J.G*423ghҤI8pfΜ\rM6j۶g}V:w:8_ SO=<X-[).m,l§4hp`.)_>iB|{� � `cƌѣ>* lL*( � � � � � � � � � @-& 3'A�@�@�@�@�@HV^]-[ ^,\Ǥ٥ʕ}/3\R}٣;SuѲe._{ � &M=>} U-4`�,XP״itܹ8SN0.]xaq:H� <}M q%xu!cƌ*R֬Y�=*2dWi- � ۧlٲ+PA�@�@�@�@�@�@�@�@�@�X +&vB�@�@�@�@�&pMҋ/JIH_~)+tRѢҳJfIaanݺZ|N?Ce˖U͚5xKV@  *7|ȑ#u1ծ]ۍE>3裏ԵkWXȎXɓ^ĉ5yd=>>C/^\k׮yeopa SM7@�@�h,2$$$mD�@�@�@�@�@�@�@�@�@�J Ȅ^@�@�@�@�@k4FuZHjH=[QCʖMz!i0 jժ%Khƌ:qʗ/jժi1@ kܹڰaׯwyGSӦM5X_~ A섀O/trիWa헯DZfwL{X@-)t@�@ Z ea% � � � � � � � � �$�A L � � � � @Tԩ{֭nX>~\z )W.lYץիr pB͙3GΝSJTre{�M7ݤ>@wݘo/رcDر>z7./CTjUmܸ /-ko\/~MW"9΂ CC_h � @8Μ@�@�@�@�@�@�@�@�@�. B!� � � � �*Pr4u27RbRRɒR|'K}aӪTsj VjT|y͘1y�@ ԲeK-]TVrk׮ʓ':tw]n Ŷwnջwb5Ҋ+Zh{woIPJ(K>YIrJ ܲ%INI@�@��AI  � � � � � � � � �@ SN@�@�@�@�@ y \}TgˈҊR6ʕRzR֬RݺҀΝB 9s,Y3f͚*[LN,!�)Dowgn;Ι3GŋƌӧOG'pc�kի_ zV@)RWUǹ.kڵk|l`OÑ#܁7� � py /o � � � � � � � � � {pW|Um5@�@�@�@�@^<Y.Q:~\*Q""!KJO,_ 2PtiC? @6k,_}gϮm۪]vʛ7& پ}{oٳx [N{w7m4/_^Rbblȑ#@ذuTtTL > � �E }4h7o@�@�@�@�@�@�@�@�@�". :8@�@�@�@�@ rZ&L l\~*TFʕl{˖ҸqM7#'kʕʓ'ׯ%Kc'ȇ =z@7AAAQ7nuio`j TÆ 5{'H իy~ \R0XR%}̙,B K>%C ~sxraҖ-~d� � #GԩS QT� � � � � � � � � �N ]]/W{}@�@�@�@�@7"q) [7v[|n6u]=,�D0?^|/^uA-ZP̙5tPY(/썟)ш>N`֬YjРV?OwSnQz|V%!� �͛u ZJ~&"� � � � � � � � � @ˁ) � � � � �,pR׮…K9rȅI7 5n\B |׺ oV&M@ѣGܹsuڎ�K mڴjڴ-Z5k֨bŊ^c<yԾ}{.]ڍoW^980a fAZ 3!hQ)44!� �$}s̙0'V@�@�@�@�@�@�@�@�@�@  ca5 � � � � ]'=2PS֭o̙ct?+sլc[4b={K@�+(^ݻw{ ,P%4dkN}B"DT F/&MgO.RDڲşZL[@�@�|!`ARR}Qu � � � � � �,] ��@�IDAT � � � � 2T� � � � �MU(~*%xV:|7oBnV9sƿ:Ik@� dΜY<6lؠٳg+$$D5\AvGg Я_?=ڵ>nu%ү@� �S fͪԩSdzC�@�@�@�@�@�@�@�@�@�'@d8 @�@�@�@�;…BΤ3Au~ۤ;+Unu4Xw Vk֭^8dLԿ7f?PO S> b~GoF2eAHǎ^ � @i?@A�@�@�@�@�@�@�@�@�@�[ | � � � � @2C--UiVׇWlA__3ߓAi yU޽~}G[Kuԩ$hL^�|@_|TAZٲ%@�@�R�A)y � � � � � � � � �$G B@�@�@�@�@�D K.�;$g<y;^{MLj<N�$@tSO1G-YD7pڴi|W_ݻ4 iΞ=VZꫯmg@BRAՍ@�@�ػwBBB@�@�@�@�@�@�@�@�@�P H?|h2 � � � � RvҤIҡCKeHÆEF%n-M WB@�'P\95J۷oW4x`,XP?-ZL\ԩSjԨƍ;'y ~RNs`)~)4US! � @2طoAi � � � � � � � � �@P+`5@�@�@�@�@ 9 ]+Mq[LJFTI[7Vprj-mA�^ ,,Lc裏|r,YRO?6m'|8C ?~\׊+\p{=lN1\gD 䯿J6Ʌ ɾ9@�@ ^{5/?$$ ^x֭[7e˖MRI<q~@�@�@�@�@�@�@�@�@�R�A)噦 � � � � L1C:zTC!- +uj@�d,`A~ƍL2m۶.@˗[M+vںuOo=Uq\\)*m,m(<JNE4IJ,i~Vq\r$h$D�@�@^daiӦup9sƻ<@fΜYsք tGn@�@�@�@�@�@�@�@�@��A>'B@�@�@�@�@ XPҢE'G*e"ժ i]\1L}i8p߯x@O?*V2A>Su?=ػw^|T3g 7}XmΞ|;-eR@�@�\`…\f!V|@�@�@�@�@�@�@�@�@�H{i � � � � @T{Oڴ)"{weeK)G wޑ֯O ^_j׮]T,LdȐ!:yTϱ$k׮zw/8֭[U|yE@^? ڶҤt  BlE�@�GL2J6eܭ[ � � � � � � � � � rD߸qرkG�@�@�@�@�HGJ3fH'KSHJ IuF*W?+t+V?Ԙ1c)S&=z'+W@_СCʟ?N8РA.4 3^5j>OٳehtsӧI~VQ#髯Z@�@�쾈?~ ϝ;vءԩSǸ@�@�@�@�@�@�@�@�@�@�_KW( � � � � �$@!J_|!'-Y"5m*wѽT5С޽ jF�Rt>|(b,X@=cZreR6sG#[o),,7TŊUpa͝;:'Ա&M};~k@�@�Sz صkWB a% � � � � � � � � �Z (_UڸqDMcFA�@�@�@�@�d;ɓ#nsHNI.+MuFJY!@J8QF_~Zf*Tg}V't$(~w*T HkRTT\9͜9S2dHVrz_ /1Nʕ:@�@�Xxʗ/m3f~dh@�@�@�@�@�@�@�@�@�@*_VF] � � � � �E _>CCo,q ;yvIR3"�[ ]tjժV^9. 7K,jԨ-_GuΞ=zv@^oٺQ+Wtl+9瞓Ҥ٥JE � �)p]w>]\Ҹ 3<C0<F�@�@�@�@�@�@�@�@�@�r,ƍ#j;W5R � � � � @JXJ<9rERKuH T�*?PDhADbᐗ*c޽('OKʶodѕTR)C Zp .vŔ8|Xp'.5mp@�@�_jժ7osN̙;H@�@�@�@�@�@�@�@�@�@/RE+i$ � � � � @|-keˤ{^zI*XP*VLMZX:w.a@"E_~ڵkzp'oTzǘok*S,L Դǘ9sIYp̦Mbڍ~&puR.9_ϠlY@�@� ի߿`5k֌�z  � � � � � � � � � ULzڈ� � � � � "rZƏfΔUƍʗlcIcHG:�,)S&=sڲeƹqD:tN:uK,O?=޷o +_~vb/`nGӧc<(((H9sĸO!ÿNZ� � 8UT`o:w8' � � � � � � � � � AD#@�@�@�@�@�"ҦW?4i饗;fͤ%w={Oڴ)(@�H*|A-X@+W ;t|Gڻw}]Iܙ3g֊+Inݺ)ES"-ZT О={d%p\^yEo Oz?z� � @ҥ.]:o}Ynw` @�@�@�@�@�@�@�@�@�HpW|uƍ#j;W5R � � � � �8rD6M<Y:U:|Xr][7VHnؿ/,gi]j47 VrY˗L2/ؽiv]qΝugVrAѣDR@�@�Og:6w\U\9:I@�@�@�@�@�@�@�@�@�@ Y J֭q � � � � �Ak&M# 3Bl٤F/CtjE+y�$@Μ9իW/ر yNjٳgu)ըQÅT\ev4iҜϖ-LUVZ~{Iy]*G(@d> @�E/^H @�@�@�@�@�@�@�@�@�@ I]ՙ7iX_H= � wQTm*H" ҤcP@@E {.(.U@zAzлo;BLB&fwvvߜ=;3{@�@�@�@?[Hc\MNU.L}?:I~+}ԵӚΝ}{ua9rMGh~ 9s&b:Ë܂,4-&M1cFeʔMco#GʕKҥ &@ :tH yBCC5p@_/7G߾}رc7?~E㉅XzتmK&c{*_W_}d㌷,K,L:U7|[dwE;vt.@xx/h߃9oyMyU_.|Y0fm>-[6eϞ=bn@O&-Z� �ݫؽ{{d"= ȷ ;lnބ T~}*U]s^ 9sɮ!saDJ @�@�@�@�@�@�@�@�@�Y `>: @�@�@�@�@ <2Mt!r8i.)<0X�id˂X._mۦ[G ~kٺQ2ZphkQC$Xm nKZФEU*X0=kU`A*T-X+}QsR'|_~\ =Z53mΝ;/oP= VgF_l,mCz܂\ll6S@Yga}4w\Y0`|ԦMiN޼y]k˂[ƍfZ~{Л,4(r<6Y o{j/>>Z~?D}yA}X8}oM%K_&[@�@�jڴi;mdAQ]oxvg7zû[`MRH5""<Ү-PI۲k-,ߛn*-ZTEqϰ( � � � � � � � � � @lAƦk � � � � �^yi cHK6(YcX؅B"lTL0B 5~dahvڋ-[hǎ.`nf!TP`a^ТYfu`l*iameRzE~l0K/, ڊ/RJtnnӦMj]JH,h]S>S=ѾŶiY؊babh&h*"?`= ~ ColpJ/g+V@ [kPZ u)\ v1 xՃy|r͟?MK.uؖhs fZ_>{ϗ#jNzs<Y nžs-jժ^Q@�@�&`VZ+Wss{l@]cعy6E>G,Y\�=Ƨ~˖-[`ȃk0 k1/v-e| %J+WysXw΋ � � � � � � � � � Lև!� � � � �W`.i ._TBN(|Ae_Δ/@5飏$X؀[-PdA 7Y(BI_Z#+V̅^YMC,T!,�sݺunCJYV Tїi _jm֭#_&+9[_W˖-zjYd,D ͳPYon&ɡXPKzK_9u  뚏7Y` 1#˔)ymo$`sѤI4uT_q~kUT8vl,4XY MBjnל9soTÆ ըQ#t, � ?,8{ѢE;w5ٹ29?z%b廩d6Y]sކ tYtލڹM`NA�@�@�@�@�@�@�@�@�@�'@d;@�@�@�@�@ \)Mv!җ-[ X/QC^k8,`� 5k͛ j.!GPn� ~)W\qr\.ӂ,҂/_B,,zUjԨ3&O Z>{FLZJxx τW,Ђc-<Ɠ%Jxn}ܸlcZXiZxm6UTI3gy >\ƍ]` MZj<)X =[(mF-!o65iXx@�#Gɓ'G?rܹ5YMJmv`{입-^X<k֬^]?uӬ� � � � � � � � � �IX $|: � � � � @ ̘!խ>S/L[z׵Wϝ;L"fϞ- KȔ)SD0�TRŅB]zafdiaixVBկ__7|j׮M0$]&XȜ9s"& HG B |,TRrl X0X(e8djc5k֌xPbؽ{ p 2iӦjܸB/X@Ə﾿,[oU۶mAtci �$qp &hĉ.̙3*W]ar=fsuv-[6wkav[@n@�@�@�@�@�@�@�@�@�@ DD�@�@�@�@�H|モzV-~#?pƍ, !<<\9sTztM7lٲ <";vӧkڴiмiʼ5k-Z+ oF ֯_N*{쑅U\Y^Ȋ,X0kŮ XE"^,ĉʝ;/\ mذ/)M4I}ѣ] S6m8m;;w@̡C0 zԱcG+V,q^@�2q �#Fh׮]ʗ/5j&;ϵ zJV\·xH?ZnBf#k!� � � � � � � � � TL*Gz"� � � � �$5jtlܪ:| 8 >�¦MI&*Wl%,bĉ0N۷OJRVtw| W@N<ɓ'k̘1n޼Y3fTڵ] Zd4i5VI,ӧO -Ӧ3gѣ*\> (}U߯|W/qFק}Q�.o| ~o3<B2/^^G�@�)j*_tvl-}O:F_WZU:tpS#� � � � � � � � � �&@dѳc@�@�@�@�@�$?R֬҉1:U*)4T@ ={iO >V]0Bf͔%K7+ *p֗9{l0l0mݺՅBZ}ݧ'h}=ZC qWR%5o\5R5~܂!͛d]uUjܸڶmh?hbo ѣ;~X:uRҥc}_JܹsԫW/ k@+)݆#� @,pРA/`)RDsNw=eg1e 0Ȉ]CZO<5k� � � � � � � � � �IT $z6 � � � � @ |kRttuaʔIʜBH=NkŊ9ZlNޯI* [qvYw Ծ}|ǯqji(p?H hР  S޼yw6vҘ1c4|pM<Y|)yiӦJ:ubWo5 ԭ[7i`ӥKʕ늷6h"{.Bb-Tnݺ)"� @�8޽{?סCtcǎSG/K?X>}h…\^|Ew\_q@�@�@�@�@�@�@�@�@�v Q?@�@�@�@�@�b�ݗkҤI*Q Fஜ9sED,lرꫯ4qD_uzg*CB=/;bغuk޽{U~}}jժf[y- <xP#F?SD,xPBI3fp߸q~io?+Vk׮2e}gʓ'&@�@ ع'|^z~#qΝ;sD‚ waÆhѢzݹ At  � � � � � � � � �d� � � � � �H: &ZjjԨRJ׭[ lp&MlRǏ^zC'NP$!0gXH 8PO<m& }KG10�POX߰>b}B$bտ^z*\VZ傅9,W&OCj*] 䟍@�HQg|avWo;}w PjU/{P5kTTreY:@�@�@�@�@�@�@�@�@�_ ?F@�@�@�@�@ H-[5k ʞ[`BR`XuIݺuSbɯ(ӦMS:uTV->|X#Gƍkk A>a}3wY_ b4UTq! иqTD`r߮իWɓ'l{8 �$yTB.{ӦMztUW%lE[-nݺ{o߾xm@�@�@�@�@�@�@�@�@�@ aLXo� � � � � ='|R+WVhh-ZC|ɠu4Rٲe;# h׮}QլYo]꽼 ZJ77߬9r1djѢSPB 6ޱb}ƾY_>e}+ĉUZ5eɒE˗/םwlULv^zi_Uvmɮ4@�'phA]wwݛ1cF-\TR5jƎYfw!1;@�@�@�@�@�@�@�@�@�@� x � � � � @J={n 6LԔ)STRʑ۝={vS+VP]?uBc8v옺v *ȂV,X#FP٘+,`և/Ye}Z0_~ErZjiӦ)PSqXm۶v� �qؽ{ԩ/RӘ1cTPo5NyZrnVs]= � � � � � � � � �)] Lj~kv.pYi? � � � � @r޽^z%mV}Q֬Yc3ie |zU^=%KoKSu)}nIM+0duEҥӀTFDȑ#զMW$@xx7njΜ9k2@�J`͚5jҤƋ/T2W.`<5j$ jk  � � � � � � � � �@hpTZ � � � � � Νӣ>W^yE #2xWbլsβkoԎ;*7zڵkP> Z0Y zjԩ#{Q/^O;u$B \Ϝ9sjҤI.',,L'Ox!� @Xj֭%Jhܹ@&^`?H0m4͞=[v.h?N@A�@�@�@�@�@�@�@�@�@�9+Jv4xv@�@�@�@�@�H\~k9r4hbA/M9suڵ KGA zJR۳gτڭ9 *Xb?~BCmÿĎ6mڤʕ+N( � r W믿^cƌq)W#e-~<CBBRFi% � � � � � � � � �A,_j � � � � �/믻?7n\ ܻw+{�5 G6cΜ95ydeʔ ~g}}F!K.u+V;4ӧO*U*h"xؿu]z4l0E|6$ܥK-^8f؂G٘g U^{5>|X?!>t֭5jBԩS: O)C>}4k֬Ձ � 2Μ9;C9rp?x.]ix^$'eʔѨQԣG9T@�@�@�@�@�@�@�@�@�,@dJ>@�@�@�@�@ V ezߪvڱ_ܿNcرclBtg-q={hٮgϞ XMd" Ʉ ` Xpl\8`&M|ѣGhٲeƥ. l٢N֭K{ eVZcϫ]v.7߼עE EJ}@M6*W\]oBk֬>H+VЄ +Ȏ˹s"ꟐB,-@�R.YDCW_Tzm\عձ2 � � � � � � � � �D SQ � � � � �\wyڷo %KtmK-޺hU jРxRJ{ݖ,-%_|ꫯܴhѢ@mmSOwQf͂v>~!KXWT|X^-ֿo!~ndΝ;ge׮].l#Y{ʞ=>yV#No޼'oK$m{믿ȑ#&MM>[C4o<d0( �Ezw/D~٦?7&ݽ->ڵ=IA�@�@�@�@�@�@�@�@�@� 2q; � � � � @ <X7oG}5OuV5W^ԩSuyT&z?x@n&Y%XH`… /$FNpYM;F^6U޼yu-Dv'NԱcTbňuBBBTZ50`@@?h}7 خdq9nHl<,,ӧOLn65mpʕnz.-� � %߻s0`-ILWݲ{!9tPVX` � � � � � � � � � I/@�@�@�@�@�@ ~Iaaa*P@4oљ3g4fY`=s.$jǎn'{uou뮻o]Ç͚5SΝ5a„^߯&Mtoݸqj׮={hȑzpBld>CzWua]z-ժUKm۶Պ+Snlm?xW֭}v[7v۽{E:q ?kذiȐ!u dK㏻clu$CiРA|&U3gny6l{~2{݊1ݺu'| kOLmɓ޽ڴi_~+ 1Ɯ GqA0bĈh-Q ,Pxxʔ)ȁW,Y4n8ؾ~z=?UVu.]- } 8PGQ/_.*Pž{rwilR4ƥ2fxѪ]ełD$V?iѢ&M? � rB˖-)S4:&Wz]ؽ ̛7OO<< ;O۞>FW2]\n쾍5@�@�@�@�@�@�@�@�@�O ijg � � � � �A*py͚5"w,B ,`ͺ]X_Ukܹ.?[Nk֬*zg>}zYș cmZxٽޫ ǒ%Kp뭷_w5j5j?S>fmYkO\+w嗮^n ՚>};:x9r [dGϞ=#*,,‚'(_`̙g"Zk*U0UVݾ.N֮])So (e~UVMǏw!6~ 0'Ξ=vw7˂m|o\m(:/^<q_cԶm\ ʝ;;vR֬YKhlA…oZ DYrҥKs oO?ucMW. Ծ,8~~vk1EK6mRڴie}JbJ* U � @si;SNkgEW ޅ>}nݺ\-0]vmbboŨJ[kKV6|Υ@�@�@�@�@�@�@�@�@�O ijg � � � � �A*p!Y`tN? l`Q`A>ի; >^s~AJ* p|뭷\ȗ{1)SF ׷o_~, ɣrʹYxǖY`@LdAW̞gQ[׶coƏ>(εT-Xe˖n{/ yZÌ3"kѣ *Uz衈A9\ bw#l٢\r){ Z믿gB ,t +իx3f̘u B(m<ɲe˪VZtAYpƷ|4h znvw^W 2޲={~n^{ 6Ŋ%M룁(bc}',[}7㏮?=.HmYLߥSK?i}9>{?~i*Tm"w}xx4 � @s/ 1PMԵY]ز7Сs07aaC q)um'{%-׵I|y}Hp1 � � � � � � � � �H � � � � � @ ˗U -رJ*.aĈ6l{n{1-ZT3fɓ']8UXQFrX;wXpۊ=c7`%겫ڭ9  Tm;^;z',ԩSnQ>}tתD*V{+�d*5M4qM(ɂ~Y\䀙ڵkƇ׻|o1 X{!edvqܹȻrO>6T\8pXmXX,J6'={VZNܺuN`ߑK{[k?u1V6x RGE? �0gE|]0rȈ'iڴ{:|ȋ8ĩ¬� � � � � � � � � �A+:hkF@�@�@�@�@�H$ ʔ)6mڔ 5SJ?=gy&bywqMNv7n, ˲+)S_DSG{͛*TȅL<x[<.mi ٣}馛nhu`Ae d \wuڻw߯ٳUkUAd; s۸RzuM2ETR=FyGWݭٲe5\^ٳ6lӧԮ]jڵڶmۿƦm OZߴ>+W.c?n:eΜY-qs1ǧF+ ?&MٳgOvSsU9 �$s;`t; mMl ޾uoy|y]b?o}#o^g<F�@�@�@�@�@�@�@�@�@�M]'@�@�@�@�@�X( W]u… UǏ֙|A2��@�IDAT3gԿ 4H^{&Nmk}-m3ek܂Ν;ŋ{bǥn/?ŋuԩ% XCԨQ# g%PvmMVF 6X`!w! \l'OȋثC F,8cT%\m԰ӧO2e\[nE>qFuE^E+IGQʖ-իW}paY dԲy樋.<?~.2k֬/ɒ%KThQeȐ!@�WZU3fH~Ԣ�Vne֬Y֐b E_2|UV-bU@�@�@�@�@�@�@�@�@��Ae{ � � � � �BC3foߞ(p3jȐ!ZtiD,P{նmԹsg޽[wqVX *hڿx(D SgϞugԩe KK㲝+{:qEi,| SL_ QpYdѝwީݻ_ZYCEl6!zm,5`fѢE.t{=W jls-i7ͫ-[jn k㰍ڵ]4߰a:u|7޸@?`}@rɂv3Ο?9s_x OtQcǎuޫq4l0i<ѣըQ�@�R@֭5rH9r$` kk`];6j֬^?+nYtItۈ˲_UGu5qYu@�@�@�@�@�@�@�@�@�@ 0Aƕ"� � � � �$q *\eLŷ{uoٴiS[-ꩧrAu[o?]WժUk{ZA2e8]zs؎;6Y* rzXߪ_~Zf[n5=>v옾;*UJ=P=Ki%r֭[ݲ} /iӦiʕzw2 @3bBie#;h7x2eʤ}nݺ[0}6k _={EqG7>aA'{ɓ'vlk׮/lٲi۶76ys[M<:D+l Շ~mR~-7j7o VfϞ~Oۍyo^|~}Q׿-8q۷q={]ԿcZ~> u_ҧO?dm$T?? 2# � >JJ9T koLY6hذ~#o)gΜDě۪57e+nkJM.l%ڏb}m^T-& � � � � � � � � �K GƆ %#HA�@�@�@�@�@ I X_ /e=ex֬YꪫTR%:u,XB 'Mf͚飏>R4idX?.\'jΝOT`8u̙ҥ߯-[6O?Yp>-`ٲe0a ʝ;;VEJ 8Pׯws�pkc̙T/[RmP3 <s w43 3#+K,Q-t7ĉ.73[kR *؅/ 1,Ykѳ>+ m1$+n믿O<s-7Pxxm>7BwW/tÇ#GԠA8UBhf<xOk.#h.p9?h!Lk1 GF]fր2F͛Wkcneҥs(cٳiA+o ɚ5k\ul1ȎsA*Q}ϟ?zi.оw,8oKG-DO}v>}},x׮]ZbEdADZRX8r\ z)^G�@�sVvg9r"6s{.{!6k[oݣv®Q잁[(P N^[F]'qj@, g@H! � � � � � � � � �\B ?:q~) � � � � �$  -ѣ Z]vѣڰa [`F<yRӧwaiӦuk[CZpdzµ칅YP6 ЫǏ$X {ю;TpaW/ `@C8>/iA&ؤI8Z@jlS 4>X!Sr\dB!z{XygȐq]-p0UTO,e˖zwYB„-ps͚5.lПqF&ZH8V#/K3fM7]X� �\?,-8Qڷo>ZxdzuY M.զ9sp{υq^j}^G�@�@�@�@�@�@�@�@�@� X_� � � � � ,t][ E{Qf.Y{΅A]rxʝ;٭[7"-Ȝ9NiIzhM6Ձ4sL˗/i5Uk׮/ԫW/uɯ=z6F%fbַo_=Sܹzy,B *VƏQxp7oHdӦM\ڷoƥ J � @C իW_1c(]t &.k+]Wv`/}dP@�@�@�@�@�@�@�@�@�@ qR'; � � � � �-`߿`I!-K,z饗. [JK޲sh o*U*fȐ!׃+Ve˖J>ONd0.\͘1C}}Fz cmJzVv!=c:tz'|23eej׮mAɩ$~b}߾-Er:&@�/?~M0A ؼys v%.k \bEO@!� � � � � � � � � p!}2kwa) � � � � �$;ݻŶmۺ0Y&6^nΞ=zH?Μ9J*r7gag?ի}_N7oڷoSNO?#H)cԐ!CԥK^<`�ըQ#ᐣiȑjӦ}RO <<\75g]s5W� �A%f5i]1Bŋ%$]<#jԨ~w]i � � � � � � � � �IQ ȤxԨ3 � � � � @ ̞=[w}DQ"˦^֭[N:pnݺ0Ȑlwǎk޽{N:UJo<F-ZH/f̘'|Ra{,hC{믿Vڴi}6vi7[nӧ5e*Tob @�HQwV֭zjK)@'ĵѣGյkW}z{)444~@�@�@�@�@�@�@�@�@�@ ϾhPX� � � � � @LjҪUt뮻7߬%KĴzZ5kVE{]BrtI,X ٳ-[ԩSZjjժ/^ DqrXd}`twhر1bի;v\]%`72eŠ ,Fބ� @k\?|Paaaںukowb60&ƍSٲe5j(3F|!y7 � � � � � � � � �1 @�@�@�@�@�I cƌݻ o;wT6mh1Hz7TH <X_ *SL2j%M 7ܠ'jʔ)ڷoC4hѣG  Xb}ƾY_>e}+Jƍ`:tH˗נAɮ>ǏSO=-Zn̙3'OdN� �Pq ={l٢ҥKޣGo'l)֭ӭު[nE7t֬Y͛|�@�@�@�@�@�@�@�@�@�.O s] � � � � �B 6mƍm۶͚5ӤII6mO? o߾z׵aw} I-IWf̘V2gά-[hѢzws@'17X_>cA=և/s)Y-ZK۷wa4g0W9mذa`~I P~>}$*� � +PF -[̅B~w. ƍ۷k#G45C�@�@�@�@�@�@�@�@�@�I'@�@�@�@�@�@ 6m �ȳgϪq*U(<< S̙39r,x3f>CmݺU>2dȐcDf͚1b,Â,pG6lɤ4#vX_>a}3wJoʛ7o 7ܠrJ5h@mڴQ;  �$ԩSACxGos7|SwJ.\НY9s\%KTN;D�@�@�@�@�@�@�@�@�@�)伯 ] [<_[d; � � � � �$= _/?~\͛7Wt-D5`� 8Psឝ;wv24J"1VH7=z,`Zn0͛7ɶ_Z`׮].tv<yRJ-Z{[0OR/O֗_~nݺ?ҥrʕԛ_x{=Z\R%CuMzC@�Hw}!~ر  I Җ;vL}f>}dA+W /_j!� � � � � � � � � �A1@�@�@�@�@�+8qFޅyOޅlR͚5S,YtO7{l6lnݪRJ�OӞ 8z 2d&N( 7 mԨjԨ4ioT8o<M4IƍӒ%KtUW�ڶmۺȌ3UUlhSN*]v,s9۫W/M0AUV믿Jl0B�@�8u ,X"E{ѝw鮟ɴvbʔ)+,Pf͚ɴ4 @�@�@�@�@�@�@�@�@�/@d?ƴ@�@�@�@�@ #c} 1cBBBtM7iӦjҤʕ+AUSLv,D+Zj;C˗O144i<y҅ʎ3ƅm޼YXvmխ[M+W&2?.^XӧOw̙3e vaaajР,<8 8۷ ڸqӏ>ڴi.uwء~o=~3ϸpK@�@� ZJevl\KGڂ7'O#GJ�ޡC7eϞ?;b+ � � � � � � � � � hA&=;F�@�@�@�@�Hиq4~x9s^znȲe*4445{l6m4J6 l֬Zh%Kdl@_^NdȐAy7FR ,ݳ8 l۶M-Ҽy4w\y Νۅw֯__ 6T5i$ 9zhןml@H NΝ;5|p&=k,e˖M<:vbŊ4ڋ� �A&p9Z(d|ԨQ#7yn<y[+Wa;'tkݺڶm5C:j� � � � � � � � � e yYl @�@�@�@�@�XhҥK5e7YP#G)S&U^]ժUSժU][3\d,X ][,-UTP,xoVڵ1c BSΙ3'bZn,X/W\TʕSUD I&%$XO>?S˗/׊+l27ݻW!!!.hf͚ҥK'XݒvޭaÆi�D 0ƍ"E$f]gϞ}w-p!m=u뭷3H.%  � @B صŋ^L0ǜ9sFv RNToa<.v` ^`9[6iD Y@�@�@�@�@�@�@�@�@��AI@QM@�@�@�@�@�!`P+WtWpB_ޅȑY_BJ*BRο[y vZdk¶i&g&L]saiV͛s?ۑ%S.eѢE.p>i㌅@/^\FhCsgϞ=yUw㎍h6s sْ%KbŊ.ȷrʜ9j6k. iӧOױc\ԪU˅&n&r/дit!YsF\�?O>5"� @ h~zΗsG/ʖ-… 'sb;kcwj<k֬k\BCCiC�@�@�@�@�@�@�@�@�@�$,@d>xT@�@�@�@�@ e<xЅ-[L6YpY m�, ,V ,1YTԩ4Ԟ={m۶i.΂m]GX@f 7UN\wޑ|PN/:9<W$`A#W֚5k"i+ ebA$]w3e#^{'ҥKwE7:uJv[ۜmٲE6&[0Mƞ2eD dAB&MԩS],Y αa}/^uUL<GZp \3g3gNx㍲pK �V  � ,~ܹnuW_};`H;.RHdyIؽ 0iƍlذM֝URŝ%@pL# � � � � � � � � �.@d!� � � � � @40}vYM G;vD6 k|!+W&[f 2erS #GuÇwh' ˲YУY`kBTxqe!_`12{IGHO=%=-[4,B X_>"K,Bzܹ @ȼy�; ͑#G=e̘Qb|6&%D?~ژs۷Ows{=w-�ibuM[_cqժ/X0 ~Ps,2W X05|7-]c[ng6/P@dg8Z3 /ȓ} [J �^-{Cy@�HG|Vrh-4sp;Q'Ǒ9sf7YX:tMvb^y/(QBniSrs{l@�@�@�@�@�@�@�@�@�G qg � � � � �LvB-- E n^,B!-fA`ٳge!rM`!l`yaln UB,»lnӧx=e7ϥ>sI]xmHOva' y/XgBt%C .҂!)*U1{l۱%X }<v mӂ"Vcs,0d3w_O n, 6/7nԚ5kdaB~a}MMgX?&ɾ,S.b"޲0J,-�T) � �1 ؽ Ws: !#0ڏKD-v~  ͽ;;ovma&[X`G> J"B#׍ � � � � � � � � � LZNj"� � � � � 7 жp:t`~u>}J*Bpȡn`^dI{ll�i%Tv?0KK|: A^<llpFSFon,/9 B!m|o,`/\қ{, Ƃfͪxƌ'^z1GƋxgAB9I/Bz^P/ IZ(Y$@�@ pvfv_ mҥyjU95h/TGaDQ$-T �y욄� � � � � � � � � �\�AW*@�@�@�@�@�H6x`m6)2RI*=d@ oSǎJH*D] � � ,O<!͟/-\,5 � � � � � � � � � ? � � � � � 2g>PڴIjFzdIٔa@+@ I+VHsKիKݻK� � � '0}Tn=!� � � � � � � � � � 2b� � � � � �J OϤFGʔ~dui ~(P@2EzmW.;wal@�@�&z5A~eC � � � � � � � � �  F@�@�@�@�@�@ X_KkJUHK*HF%P_@￰4w}T4|x ȶ@�@�@ >3fH!!M7]� � � � � � � � � �$�A @�@�@�@�@�@ ~IZB*VLjR^]4)+N@ A*W,nұc Zv� � �XdٲRlѼ"@�@�@�@�@�@�@�@�@�@ H A5@�@�@�@�@�@ ʔ -r7Փf zRH<Z1B9RXQZ0Þ@�@�@@>]S @�@�@�@�@�@�@�@�@�@  C@�@�@�@�@�@ *Uƍ�"ծ-5k&-^c 4-[J+VH]'լ)t\T � � b/M1M � � � � � � � � � DLj#� � � � � @ Ԫ%M*M$8 U"n-^`o I&H}$Tm[p֕Z!� � \f͒Ξ#ɵ @�@�@�@�@�@�@�@�@��A8 @�@�@�@�@�H yQMr V $Dzi|)<\*_^4(hK@�@�Hv3fHKKs' @�@�@�@�@�@�@�@�@�HfA&Js@�@�@�@�@�@ aZ.-4#Ҷm �+`6.}t]ҽJo} � �E`tNځ� � � � � � � � � �Y |ti � � � � �T $DjNZZɓ%v8@ KcJ&H*Hsy � �IXqibn$� � � � � � � � � �)F si( � � � � �J U*u뤞=aäE_^.$ͥ+ҥ:uޒΞM 5 � �$- ^?}ywҪ9E�@�@�@�@�@�@�@�@�@�(@dJ<@�@�@�@�@�"&cƍRnRRoKdl@c>૨6?IS M@4 **XPVEvUY TTpeiJBҥ Uy$!Mro;8sgΜ;9synAid7!C ͛CT@�@�R"EBT@�@�@�@�@�@�@�@�@�ҭ�Ap@�@�@�@�@�H.p'bx#&~5q@ ~XZD7Ji`1C�@�@ t""FB@�@�@�@�@�@�@�@�@�ҷ�Az@�@�@�@�@�HF9-[J NJshZo^~{ΝÇT @�@�1ER!Q]*� � � � � � � � � � H> � � � � � @2 # $m,u*'p{RTT2#@ d*4}4wTtդB � �<)5j2U � � � � � � � � � L�� � � � � �)'PkƍRRRҸqٳ)W΄�!pҏ?JիK7,=Q7j� � @( DFJ]'(J � � � � � � � � � LW#� � � � � @)" ._/ի'u.U$M* # 3᧟RB@�@�5 Se@�@�@�@�@�@�@�@�@�HAKO@�@�@�@�@�@ JƎVnQAQC6-k@ _ZTUFLp>@�@�BS *JZ@j84O@�@�@�@�@�@�@�@�@�@ } >;F�@�@�@�@�@� (WN?>&P!U+aC)""*IU@ n!&|PNd?-'@�@�@ /N5 fPy@�@�@�@�@�@�@�@�@�HgA Ns@�@�@�@�@�@ xT&M ˚UjDj\Z(xL@ 3KK~+-Y"U$͘sp4@�@�Ғ@dt5RٲiU@�@�@�@�@�@�@�@�@�Һ�Ai >@�@�@�@�@�9:u3cNjזڶ~1B@274ZÑ6@�@�Ұ@DԨQn MC�@�@�@�@�@�@�@�@�@�4)@d4 @�@�@�@�@�҂@ӦҼyҎR*R.iu.&'gȑ1k\]lG�@�@ =3n u  � � � � � � � � � JAբ � � � � � .Z,>\ZRPA^itAHw=zH˗KٲI5jHoh0 � � s#RFnf% � � � � � � � � � Ab � � � � � aaR1AGKRٲKvK 6J̑zJzQۤ}f[i � �I: eXE7ݔw � � � � � � � � � Au � � � � �ԩSuw'XaÆ%=7!^ ޿uGJ|R:p ޷w߮W^y%Urɿz}7o5A)) 1AkJ+JS^USϞ3#� �,YS3}y¥`}7{@�@�@�@�@�@�@�@�@�HAK@�@�@�@�@�H~ 6h h…nOlHTz6n>P*QB0@:r$ѷF r!}w<yN8"NIl٢m۶BI^=irE y1_*<r-N9k΄� � ;7m:ΟNqϱ*XǪgϞʕ+e  � � � � � � � � �] e � � � � �@޼yUpUHD'F6$I kVG͛ߎ p]5kyWe˪wIjKJgA<@J!prI| }ILlҊW|؋D� � BWKvPE-TYf:s7XǪ3f}ڵk!{E/,; � � � � � � � � � !|: � � � � � P`A]wu VDnOl$~ZڲEzɂ KxC:yuE;[bnb5`dXbZ5@t~Qʟ_][z5)::Io䝸/7 � �$@d)/~ g}V}rUɣ\NA�@�@�@�@�@�@�@�@�@�4-)M!� � � � � @ XUB@ ȢE&Ձȝ[zEOi˺ЫJ='{9q…裏n:ٲeKutӦMjڴۧJvC=t MO?Tw]wݥ>ݫjժ_~5***JQFyohذaZjy:{׶^ӊP%x%[l8pJ*޽{vхUZ>cY߱c{=-ZH9rEW^q?כo˗+gΜѣ̀@j XiK+رRBV+oKİ7 �  L<*gY bd/q4h9Ol80jյfw*UgϞn|{iA۷fϞƷ2eǺɓ'_| &4>@�@�@�@�@�@�@�@�@�@�T2 � � � � � r VZwٲeݞpE HlFm YB/ÇWƍeh!]tQN-8~YwB{x E QE 0<Z(c\cڵo;ÅDo^1}tX~}B-<ӑ#G:;@ZzΟ?_ڵӸqڶm_V 4uTw}zcmٲEuu$gj}bwf>.kVbEy@+O {"� �!`Y&:Vm wVi$6V8ƵU+z ,pRǾdظqFihҤ<(C;vL>vgbcұ`@�@�@�@�@�@�@�@�@�Ns  � � � � � pح[PDD'F6DP!魷~ {n(ɔ6yx]w 2d5j?\cƌ5\J*cu@ [ *hժUzw4x`њ7oۼ|r?;Z7߬}.v͛7~B.ۺ}-rΜ9Xaaang֬YٳϤ?n@H;FL-Z^z׵p V{}X@ -[&/TNW/ĉk-3~fq'Ya+ � ,6u^͜93ѱ}@Μ9ecE{qKbcՋqR;w5n:۷m5kָj4vXnXbca@�@�@�@�@�@�@�@�@�K CpU � � � � � @ Xc��@�IDAT%F%/`B\Y2)T4yrW_ɓS9ohٲ{=a„s[&/2Ce+;wt>HgΜtaaJґ#G> vv^y\ԵkWmٲEn 8uꔢ\Xa۲fjRX1Y;>.O>q-cĉ/cCY؃@* \u{>1SjҒ% W;O[@�@�G^RƪSu U:Lhj_D1cF+Ƨ|[e_|ЦMΝƪIK@�@�@�@�@�@�@�@�@�* *Q@�@�@�@�@�%}Ru}]oAl+$/P.ի'}m47nt;A 4p? wʔ)[v׻@ŋ˟֮]+;SO=mA n2rH72d֭C?*{ P:kL2}߾oٲe~-<<<òTh^Gҿ%={auc~~q_`  � R͚ X_ƪ{U:}X:Au֚={;N2BG:|pE~'6VMX:c@�@�@�@�@�@�@�@�@�R_ Կ�@�@�@�@�@�Hq-r攚5,* pΝ{Eqs'%`#gϮGB,/[l9U慀_|ᦓ'O/T̙]cR5Μ9:ux!+ԭ[7W=zx!g~ܿ{zV  vΘ!H7,qn͸D @�~HzMXrƩv+ڗ 1BTݵf+ʚ5jԨێ.6Vt|c � � � � � � � � ��A)Y@�@�@�@�@�@�5}!TtҲeVvnEm)/vk:uʽNTv߿ 7|o_&: ҥ~i*THm۶7Ln:[d߾}U`A}5jΞ=f~RJ)G=?plxl߾=c |R{i>R%i?jǧ%@�@ n7ʖ=[٤U-P1***=[8e˖*^^{5wyxw꧞zJ6XIlv@�@�@�@�@�@�@�@�@�H Ǖ"� � � � � �!%ШdӦ W:v֮imݦ[nE7oք b6{Cկ_?pn>eYH]رíbΝn?իr̩/R͛7;C޽{[nzݾwsC| sB6:wvC52OcGu qϴgl~ʒ%# iܸy׶ Di\V,vS:vL.C�@�k֬R&M$i}Ycդ8ƣ6/9*TP +W.{8?\X5)cK@�@�@�@�@�@�@�@�@�=|y̑) � � � � � ^xխ[W-ZHM'-,]Z^HTd]b/P#umm6 <X6ltRM:U]wʛ7k-_\ӧOws99t萶nݪ0={V>[gdz�H Ɏb M<Y1zhtM.%sUUZsJ̙k.kNjr,oox_~^eu7n6n( ;Oz72-ٳ5c jJC @(G2NkԐ^yE=&ծ-/x;>@�7&*Vލ?xiXrĉnYT)+VL=EǪO>d3&iZLw#FcB&mlWؗ/qM[gcϪU*<<<KWT?4s@�@�@�@�@�@�@�@�@�B0[UNb-@�@�@�@�@�ҁ=zAk_ } KWz9)[Zj ΰlXGŕ!C7'jӦM.xdɒnxQ~ f<pޞzGEE̙3e珯ǏwAb!BU`^gOiLi�ao O5F�@� `_`еT0 4H{q>x0gY/\8q=O8ܹs_*I^X`@�@�@�@�@�@�@�@�@��A' � � � � � ǵ)4vҾ}҃J<c.0lԯTGR<i!� �]R"ҌҜ9_|իWH& � � � � � � � � � @?YB�@�@�@�@�@�@BLEڰAzeO%g~Y�%׿J? ;&UZ- � �E "B1jݺ?tډ� � � � � � � � � �iL ,+jSN1G?>PG8 � � � � � aaaTÇ+wܗvN'ٳgkĈ0aN>: ^{ڽ{wԖj" 9sFFҀo>HNM � @ <|`ԥK}g)\:_CV- � � � � � � � � �Dnl  � � � � � p?֭dϞ=IS XgӦMt3F#GO?$ּysiY94iWv-,YR)]>%C2f̨^zk׮<x^u:uʅ(qbk/7F_ѩB! i� �!;b#CiuoJ2eP� � � � � � � � � �J@S##r@�@�@�@�@�f @ǎ-gֈ#4a/1?s^6 /}BC!۶m3<O?T 6Wzib!SR @�@�8K J'K[" � � � � � � � � � BT@�@�@�@�@�@ 4iq^PDD63kxGMcz lYih̙T(E�K(^,X(zkM/ص ک7ސՓ6lC3 � �2xc=,C�@�@�@�@�@�@�@�@�@�RE Ta � � � � � @h ˗O?֬YH/|0Q}QaoKU,V^R gIѡ^j@z]͛O?Tseգu U*^$h' � @ Xd*RV3� � � � � � � � � �\�An;@�@�@�@�@�@�4lP~vڥA뫯jL^@puzԅu|u7�A-ЩS']V?ƍ{˨augաtPPW!� �AQ40� � � � � � � � � �R tyi4 � � � � � xZ}ѪU4o<ժUY+WU֬t_Զ][1# xYꩧƍվ9,YMT4kV@�@�OayKq@�@�@�@�@�@�@�@�@�= CQc@�@�@�@�@�@ ի1chz!ʝ{W:Z7K ܹA *�@o{;+U\Q8pΞCܲ N @�@�3G6Lpt@�@�@�@�@�@�@�@�@�@ L)i΃� � � � � �CܹsGъ+pBuXCOk^GOթ3_KC@ +WN5c (]2TԛoUիB^CAT@�@ d"# |BT@�@�@�@�@�@�@�@�@�HT Dy؈� � � � � � (ڵkkԨQڻwzU*jԸI+TQ[nѲe4b;ʝ /*UzEÆNƳrh@�@�"ҢERT-55K � � � � � � � � � @ E{%P)H@�@�@�@�@�E`ڵk9ՙ5k*V ~*\9x@|/V#4s':{6J{ݡҥۛu lǏCRjC4mڟT@Ք � �@(@ ՓK/I| u* � � � � � � � � � @A&V@�@�@�@�@�O>W_}U3fLٳ*Tvܩc ;v\}ӷ߶ӶmճeX5ܿg5}Gʜ^~5=h`*uB�@�rB?j!S&=gJGf}T-[7!� � � � � � � � � � dH`=@�@�@�@�@�@�su^9sF Mtݻy/"3gKȑҬY 7H}H{$�)PhQMnɠ)<p6mJx;[@�@�ҧ@1H[0yc [@�@�@�@�@�@�@�@�@�@ 4 F@�@�@�@�@�HqjժDw/k׮FȘQS^ җ_JJItPbd@&5o_Fc5+YRĿk@�@�қ@B`"V[ =><}؂� � � � � � � � � ��A~ � � � � �A$УG/lK[H)SF*UJ`+H@CI6IJG "^xA:z4aOH{͡+<yb xC.}&}QLHz@�@� Ȩ2xף ˕Kx � � � � � � � � � �.@d_!� � � � � @ t c?"-(@ å'6o,L!o_y&�(^\=[z9驧V={;9ٳҐ!Rdd@�@�BU 911T|0C�@�@�@�@�@�@�@�@�@�BE PR@�@�@�@�@� TbxkbIA 9rl|P8P*UJ6L:u*91@ cAsJ7J7$~tG tcK � �W *HwQP@�@�@�@�@�@�@�@�@�@� 2/G�@�@�@�@�@ z.xU^]%KL qt%'4hyQ_?'{I^)TvmirBis׳g^T @�@ E qVd � � � � � � � � � @,@�@�@�@�@�+йsg9sfȐAݻw?g/HN^6nZzʗƍ,T�'n4o}a,ϥ>pk@�@�җ@޼6[db?qz^!� � � � � � � � � �*@d^9� � � � � @* )RDՓ?嬗שS'%sRL8jpiz~}yRJĉ„ һ^|?@�+8qB^?q<uc@�@�+&YdbGRxxܵ,#� � � � � � � � � �+_hn9 � � � � �@=bh7ֵ^RZD ii*5i⯉]zH7.}X�GڶM�R׮/c @�@   2I{K %@�@�@�@�@�@�@�@�@�@  +H@�@�@�@�@�H^^XXX왻w)P4~td!ZI JOh>w;@ p7K|#Y�>.8ITh4xX� � i*P@2$5"� � � � � � � � � @ 2]\f� � � � � @`ͫ͛fRڷop4PJi$i)kVIy٘9 {?N`a^u,!@JvV^zI__ʘ1 y~#~=@�@�҇@"1lRݴ@�@�@�@�@�@�@�@�@�ҏ�AZR@�@�@�@�@�*pwnZs9SG93& vmFP: bs 6i˜u/PSҜ9ҡCҗ_JݻKǜ+ssٹd-@�@ *3V.e~Z� � � � � � � � � �i_ ,+jfN1G?>PG8 � � � � �_ /:v옛~-v_wI:uJO>-~w76ҙ3gΙ⮳? 2(,,g̘Q2ers['[Kʒ%]uYfUxxxٳ˦lٲW]urȡ9s-۹(#u"z'i<R j;w֎;}v7߻w~/Pȑ#~{ֿmn{ d͛75\뮻NŊsB^ݗI>ɓ5uj^s\4E>>.{οWƟllO6.߷~묿_~~:>@�+`c\08~_Ö,=;g) jwN?lnrʥ|y/� � � � � � � � � ��AxU � � � � @@P7 x;:|=* R;e ~ JX"<nT܀qQ&?_:n�=rHý?n`X>X0tA] l`+`aaymɓmٟ,L C{R3"-X pC$u^Zk֬ڵkch+v?]{*\9>߻>ޱ(k.ٳDž,PB!˗/o1v^Bw>.U~&[ ?}6gr73?Όٲ?=;albybA=yqϿW~ Yz?9npҹF2 @̟^['3 � @瘝;wΞ{۳me ~Ph*da OVeˊxKaXq{^C&4is=AXE& 6>�I  � � � � � � � � � A8C�@�@�@�@�Y ڻww~:`6Y�8_,˜A gmNy@ 1 \Hba V.favek?x,n𦭋g\ , C.l$ ,xd,<\vKzy^8H<4{yo }{?Y�X@kٲe]0.]XH"E\?P;vhƍ.)ׯ_U-xł!k׮;Y8Qҟ�Q~ϟ:; `m mo<ng]֬ٴukI!n-tɜࣸ}m֯}>?+wŝ !a@�q O?_޼ysl8,My -۳[r'$q=XygU}[eܐK/,tM�eʔq;@�@�@�@�@�@�@�@�@�@ m 'A�@�@�@�@�  V0`ݻw�@ E "0, q-L`?-$PBn [� 5AI9!CgvsZwpk[l7|3fh֬YscuիWwajRjt˂XP֭[tR-ZȅX.YąY`mft뭷y*QD06:]]o tc}-1nw~ٽ@ >hi%៶_H σk [f~g?C( � :6]r{_b[^jXYCŋƴixB0-3dc$ Rv+jժnWT)!@h � � � � � � � � �) @d s @�@�@�@�@�> l۶molӎ;7,ŒA~6? "1uk0!#,T-[;uTlճe>kaLhZ!#$g+~!e,EE% i'^͓S9 I_jƍ.@QF.,oM7$ I b'ߺH i0:tPǎ]e(1=P[y`c>>~ɕ+Wl@ŝ[g}"~X `H_jq9rp/Ϭo;`Y{ � @`֭[ `^իs_UR%bhcʕ+œsy=SYƍ,TO?9ھ�N:n[=QԠU � � � � � � � � � \A&,E�@�@�@�@�H1gϺ 6?ߴi6o& :~KfVw= ~ KK.OdaZeΝ;gJY,gdɒS/n򅇇KmÒc plp9c…Dzgʍ7T˖W+ffwq,#K,1;ZЩL4`Z}&;uꤞ={lٲi,ǭ_>ϳ~&9b}Vf.ڼhѢQ@tt E7mB#UW]~*Uͭ_'3=Q@�@ ~ &5k,}Μ9.ٞVڵkf͚V[ /(8qVXKEyc lذ4if͚/ Y9  � � � � � � � � �U ꕥ] � � � � @?5^rڵkO?y!nu)9s<?8D' o` ,`Yv풅ٲLٳU,,p|^`n~5sn7$r?\YQQ9#SԥK;ըQ#(ېRZx 7N;vPӦMC]v^f攪F?ϱc\g}?Y ^pXϋ;k Kk[(-8{ֳb!ٶ6uvu �W.p!M>]'O̙3w^ɓZ` Tz4R咁?]yiܹ.KQQQXZh֭[X)@�@�@�@�@�@�@�@�@�P 2ԯ G�@�@�@�@�Ҡ\Y?+W-8(::.]څY@k "�/ ~ h9ǏwjY n:74C͛W7t*U'lnsqαxq >\߯nMw U fPb'ҩSjĈ.@۷ 7J+V>[M+*[ yW󬿳)W\I; {!"lπ~3+d~֯U\Ml@�Қ5qDM0 ڗԯ__-[TfTZ5e̘15;c1c/ٳ=ز}jժ �@�@�@�@�@�@�@�@�@�b  � � � � �\@TT {\tlZd ~\؏_Y?YVɒ%)S+9-E M ޽B^ZVr-[@XSՕ;w4iqͷz@ϟ|P?)rJz;([l.G!|O[pŋ]g˗H-+N7xzeȐ#%`?-4 '?0PB>Fn^fMG"�iF?~>c͟?_yqڵS +yfM4I_}̙Ym۶֭ [!xQ2 � � � � � � � � � 2@@�@�@�@�@ ivra.\肰, T⦪U>Z0L`.l-[斷n!>]ԩ& ]MOs:yG}T2t7СCA{uHr1-X vúꪫb; f~Bdɒh3-`m&n-0̙3*Q֭;sfƌ/\@�1̙3{ﹰ@ .][o" ǵ/R~"##U@SwJ. 5 � � � � � � � � � A>F�@�@�@�@�ҁ}w3g#M6p0 Uj֬2eʤ @X`?E߯ZWFTF4zja5 ״0 9r*T-JZ-1""Bgvs ` X534=B 0ǏwA֯Yf?rƍiӦ00@~W3ƅ[Os:tٳ_AyW6;VGuzt-L( � � � � � � � � �\�AWǻ@�@�@�@�@�8rfΜ3f?˗Y\zTzueɒwR[`Æ 7o,HI,E*UTjWo|}YUZUo,xK"<DtD,-^XӦMsނ \>6lP 4p^ܹSL•_;w &_n >n֬7oVZhѢ`!� "[o1o{rʥ9Ip ={VSNu WXXk.*Jm@�@�@�@�@�@�@�@�@�@ A"� � � � �O`.d'k֬.8ovJ*)-+Lӫݻw߹oU|y~;d2d)G{2e^|E/R^eϜ9_~Y mݦ>@r f.믿֤IdI*U\YccgO`׮]5k[M>ܦMmWkj� {̅_}ա4 +W_>S[79  � � � � � � � � ��AvE � � � � "[nݴd+Wõl҅`eɒ%DZB5@ k֬Ѵi4ydEFF@С:u`|ݹsZn/Pzt ?IwAE QSf9sL}g8qN:%,زUV*\pT @l2s])SF]tQ׮]3nO@�ҝ?.\?p׮]{N&Lpvکxʑ#͛WSxxx ׌!� � � � � � � � � @  &B�@�@�@�@�ҸoFٳgrرN/_>!@\C,bԩԳgOCŊkP,o۶MM6uSLQ(`*q?~\ca&\l٢QFi̘1|۶m]?fϞ=N@2v6 <_`ԩO;wUW]uGm �Uĉwy ˄e~f{ٲeӵ^B _J(ҥKp̙3^V"� � � � � � � � � @ ׀ � � � � �A/`8oF!#ݻ뮻R T_,0kرԦM=cjԨQ< g8pիB gΜy&]\y[da/_:e722R ;_ 99s^1y#ƍBЏ=^zO> ޥ @_}qƑ#G4rHn:UIC[8p^z%J3Fm\ecݻw]vɾ�FgʔIJr_RZ5ըQÅ\nڟ j� � � � � � � � � vL;ג � � � � �غuc>=.�'b >\sRJzռyvMugΜq۷ow LrۧuXbpΌ3&:{l_˖-sUX1i@ X/4is{w)R$XL@�RY ""VZ7n (5.`.]x2eJ_p`Djի8{Nzn~f͚ u� � � � � � � � � @H dZSi@�@�@�@�@�d8v옞x -[VrifR'98@ʕ;h۶mձcG5mԅOFÆ ^'N!q?] &vmvټyn67իWO[lqcB Sp~Cj۵koVڱcJ. O< �A#`?iٲ:uꤩS4W&+Ҹqc-\P;;[%TruAݻw˾e̘1.~Ѫ] |gqƄz@�@�@�@�@�@�@�@�@�H& "� � � � �*0m4+WNٳ]PW5R9.T΂RٳG:t~FrNsoԷo_`d)/׭@z饗ap .ә3gR B._|Q*UJ,Ĭm۶ZyY?~\?Zn?Oz7_ߕkbƮ]*o Bɝ;֯__~Y\sMjUǝ>/p;wt~_Ƒ߯w}WVW^y2oi޼Zhڍj_N4i$M0XhQȷ �F`ժU;գG92MFz 'ҎRxq}wn|֦MK?Ϧ[/[̽ݗV^}N~5h {qu � � � � � � � � � #@$@�@�@�@�@�X'xB ,PݺucٳgrJ-_\eZp ?rbv֖1cƸ൰KjJjG^y/=;_uK^p YfO>QӦMe!)QhѢzRtAsUVʐ!KkѣGc~aլYS/ָqO<y2v@-صkd*cǎ.O?u <��@�IDATC Uطo͛ɓ'_rmCˉ'.ȄΟ0w?+V(***kSr-Ztڷoƍ@#!�SԩS'؄Ks mR&6ƶI l]IR K`?\[lQʕe<};ڵk=Ŷ&V"� � � � � � � � �   � � � � x衇4|pPԷo_]j@`r3f̘Q6lṅtUC>ogwʕ+'[bA~?% ZxTf.)r&A%S.wY֖&Mh޽|KyZO>L2][6dmڴI'NtazGŶyZn^uɓG5jЋ/ӧ>"v�-صkdʮYJ lӦVZ%KȂ.}B+RZ5uRGʖ-޽{'a ?$U:mnJK?d~~ӧ@�ҺkYcǎM[< NJ#环}َRJ7ЫoWz.{Npk9RGVÆ e_RHw… {mMD�@�@�@�@�@�@�@�@�@�') < � � � � @ 6L~ SNϯʕ\dLm6uu}YٌN!/=I>x*x-sέiӦ.]7L2E~صk:EHׂ7-hѢܹ[.QD &誫R2ebծ]-[8drFv욥TI u]R]W;?OtmL~$a?5⤘]llJł>wߥ&&@�>}څk*T"{IyI&睔 j_r˗/ u.R{�0TQ, *]zXP@ +6bAPTz"UzUD:J8<o&n l&u-3;;sΙYͳ;ڬYl˖-֬Y3;PB7Ν;ף7A�@�@�@�@�@�@�@�@�@ # dψ;>!� � � � �D.m6{]`A "0ܷo}'ذaLag϶/k_~۶l2G7xs=g3gt |7r}ӧ۠Alҥܛ4ibAP[!?ƍsav 3W[믿6=VjU{"?6m#GM6ֺukgsu}vܹsmvYgٹkּyswLC&L`YƪTb[n5hQ_}i.]Ej*kРm޼o5j+|nС}v+Vl.2S8C>}j:ur!v<_n}-_j֬SmLPb} T! M<\믿n:tnWXѺveh73ϝۛڋբ!CX%MQds4crW/}w(lw…[oizo*1B#9ssFM6nݺ%KXpa#3ƪUkZvڵ[ȑí^\9Sn3 ,Z1XM2sT/Lf49-Ƽη;}Ǽ;w7|>_z%`=zhٳgO,?SNN89R踗ؘÍ#{Te|w 6lvYpo9Xk!MgVa2gL=lƌ6bucu玮oٻwoȑ%wu,{Ai5+L*wy-^8@�еn4QbER+꠮ukp݇z\L;8}wm Hx"ދwڿ^x!kgP{KG%}I$<utmw߇$<6uիX] @{=<G�@�@�@�@�@�@�@�@�@�#jMӃ� � � � � ~p<SN8=?,<mСCޢE .={~?~wC?~8>}<=?L-{7=?0`)z~pbfŊnn-Z{=?<-n{̻=?P{w=?+] ŭ܌rի[:w!rLyʕ+{~HyAqMNOu`uW\C<?�57z>ۦC2m}ã9Sz~xw%x? iԮ!^ɒ%=? ~;z-m3նIEGRva m<]F~燮z 6,XG:wuq[zWxq3~-#^:vZyt뭷Jɹ_8q֭v>%w^;;eʔTRR>2W~>g< ^gGlj+(ݻwwhhH1/M1O=?՝~Ќz~{'OOK}a>ޒ%KEo߾}:IyZ!q$cV_~>X]ዮ7#kWqk+ӵ phv~jLMrKuz$(]{Es/h3~ ejG �#{wݣUICݯڵ˫U{ݵQzBr6a,N{vP_w*~HDۆk[˓!뒲e&}L`1LK逸J^Orc^D�@�@�@�@�@�@�@�@�@  X4 hjR � � � � 6ݺusiڱ:*Reʕ˕+޽-S A-<y[ >K)H1SAdh((ƦТ`I(C*L@}zCWMr^!&-! :]t�77j_ԇ݅:(IYAQ C {={[M; +D2(.]xz R:^ BOuJ(C &ח{1سgOZ:w<L MXA7nVpBYqSPO?zV_~Skj=zH#qWCs}֬YnH N)4Uq=RR/_B_R]z~^*My䑸joZ|ƽ+(Z%<w$[ywvݠh9]5à<3nYܘ=$*Aw }/&l_} 7Gr-m#)w>Ү];W_ y۷w˂q,Om@ 2kh|u< ft=`) @�PCH˒ؽEr+>u/-; Ȥm]èp;\}Nj5O?Zf ]$q̦M~N81UZяN(� � � � � � � � � �#) � � � � �XN3Ӆ\rr>l˓'/[n޼9n:uXJ2?9{s|׶~]v6 lҤI=Z^9s]p6tPkܸqr?;ŋێ;Ec&+,,U]s56p@[pAK 5) *ؼyYֲeKZ͘1?w!sqh&hGW*Ug~U\YMĕv?;wl~;q3ۄ.Oj>$swߵ ԩSîO6?ъ-zݺuh?tܦMq۵k}W2K{:>ᇂƵk37n4?�4պ}:%Rw?5}W뼉eMWH6jӧOwf~=ֵkW˞==ϸ{Cᄈ?Ӵm↓@*Ww~0L2=:/֘;Xԙ #4~ 0 sU… àn6|A5n:7 <"]FfUP l7k*ez}Ƒ^{Es/wZL/;x`oi� ryҲd=G$+T%\-H^ۄ^רz!Hk;]辦wg4Hgޏ͟?Z_RIpnnj@>@�@�@�@�@�@�@�@�@�H � � � � �dn͛ի]\FȖ-[ݸ;v!}ׯ7]Ea* - TY|yb[`)PS ˲eLY?scɒ%=z$\=U+Vջ}v[x * 4 GkԨB26moMm۶.hSlZrK]PP!XW^=SFJQh_C'5I_^X T8chQBP^UD[$-8/osu^KPt^ t}EDㄟIGz^hOj۪U\U }y /Hw^ =vN*45Yf.7am4N:_AIyoA]>)Y aڷm۶ПA0=c^hyUZ.|bC }K 7p Ci+{'|b !SE�=rʹOloÍݯ(]*)&z/>^}gsg/j?|x'l;yVRk~.?f;:'L* @�@�@�@�@�@�@�@�@�/@�@�@�@�@ TTɮҥ ˨{| 7p>;־}{N;)S~…O?=;ljrB"Y&TyI<xO:Mgذa.[nqamhAU| ?hmڴv9ƍ玥BmHضZcԨQd+l/O<[n)42o7̚5+7w^۴iʂ{̅}ݩ֥իMK4Kj(P "Un]S`pigiwֹsg'|2,S#+(-[4}~Ңh#1/[y ;Rs蘧@$J}<ǼD;ƱĖVz-<5# m;^u}N>n~/@�hܸ&SkM~e˖-9sӲ ,aBscԮ]_ᄃ@!(mG=Cmih}^Oe2Y<t9Y?u!� � � � � � � � � ?Ar& � � � � �o�*۽{wQBlÆ ֻwoSaPjժf'M,rӟM/x駟gaݻw &Ľ^re7裏 6m [1ٳ5vfҠShQPUXѭ:zxzڶm۳gzAAhV;ﴍ7^`މ'ڟ׶B/M!^zr)q o6Zir}Q=I: ,h;Gu)t#p wʕ˽q+^͛׆js rnk-_~| _fl۶m>Nj+X#"OX̙3aÆ\J{}Oϼp2X阥E >g̘awqG´h?-HjKx7~xGH"n\Pnhs0~^rc*L8c#= iXX}б5#LmJnkׯ_>h H  @H }ٸ{㡐#t~<H/v}]k#z/8~+T}' Lv$3kGۿ֏ík׮ܺu=SGc/ެiӦPS/ � � � � � � � � � @T # � � � � �[ ͛7[ݺumҥ1C;wt oeA{~ J £5jdW6P6xꩧ<UԞ>3$кuktg_|5nz-_)�/rzX0`�߿C~m?rH Sx*pӦMO¾:vXr 8ЦOn{_|ѭ$>c6l0{衇T)$N 8T\XK/}UH믿W¡ʕ+g:/UԶ ,|7#<bs̱W_}eYxEb\_\<N:7QZ5;Lv Rxln]O~a+P@DMw} ⋭W^nN5\ݱ7q(q%jJ*>:͢U$ TJhIly$Ebۆ֟ؼLzW];v;{l = >ZW^qJ,Jɒ%g>3ʸٴj?vRkSۑo:WQh~heʔqZ ֵ* 3fL\0pbcM8s6-j~ݺuM5}cbԵ?k$BTBҪ!\ X>4jOuM>۝cYa6#�1.3تUK'_Yz뭮ڵ{~]M Hxm5L띠I]$7վ]t,auMR3Ve_r;~^zvW-[fv.\w뻡}sW:˗#')u@�@�@�@�@�@�@�@�@�@ 'Vڴ<=( � � � � �Sj$/W\^߾}Ď!yyշWvms;zM:ܲO>? ku޾}{0B^rjʕ+#{-Zs9n 'a niӦy~[j??m&gr=?ڼN;ҥ?{frmC^b<?+XFƫ?wf˖ͻUz~}voĈ駟i?.Ro޹<0 w.TXhz~VN:$cDt2 ? {;|q<9apUir} wt~ݻAX%Jx~mq{Vd䇑zz/R=zy*T,Yf]fR:,{ItĖv,Bj <y?+T(a&?>}R}^9X~zOu%~L1O&u☧>z?+R;~~^vEc tk]7p8z~8$;橢pȱj[W<yU[懵׾ő^ JGvRYߺ,Xk ?C=?$ۭu?L5"O5$wu{A;5H=?4}ks� YܽER+8lҍ+Uw3kp0j$N${tpŊ殻4im'=I~,GC#t=Qt,POU?w\[nZ0o޼^Ϟ==?m뇮6"@�@�@�@�@�@�@�@�@�@ Y?E\s? @�@�@�@�@8 |ֵkWWO=]D??7?0/l۶m vh~du"Y(;?P͵4&^ruڵ@gMUn3? 0LAXL:Z?)C3?+z2=I\da lc[Μ9M/=ٺukSN{0?@2IFҗt.,t?PD?׃䎛ClʕVxqCMƎk>leZje~/~ETN Hϋ{:Zk~8]x]/R-[hTyTu7p.h~`iJrc^ηc>N( 6x3?�9<@uֹ\j7ܘu#W՟\ ~±8ɵyGAڎ;Qh;Ѻ 35Y:h C~}ffԍ� xÝ/u>]S}78AQsk;) 7U{uI]I¶UOr3kKۿ?j3G-XqZ^1MXtm>?mC3-bX.}IP@�@�@�@�@�@�@�@�@�@ AFߔ@�@�@�@�@� !p{뭷\�֮]D2NN(|iӦɶҽ{w]/47Lv\!}VF۟pe I7n6fk߾ R ( 7\]|6xe=}zn<i۶M8͛ggyf$\y޳`K.$U+L믿Nr7J:~$ ^ 6mڔAANܵ@,}F(U JeϞ=[߾}M T`( � ZWߡ+.;}9&C ި~wNzx]sdRk]{껢}7}vwpȄENot?@H]7Μ9̙B˔)c͚5֭[[ڵ+8кtBs@�@�@�@�@�@�@�@�@�8v" @�@�@�@�Ȑ'xunV /P,yNJ*rSsN>d{衇mzɮm?"Z?-Weõ'>2}.lb֡C{׭XbZ1m!CXƍ﷗^zꋵ빩c1|pb !:oB{dڪU+Sn7pr)vc? QLR%W\IqPB^;OOImg_e SG׏֭n-\7cz… ݵ~h 4c)�2%nL C�@,YLߡs9{)SXMrUV۷3]dCm]kCjߺgٱc luBGÕYڃ>B9bB VfMڵ"E?}5gy>@�@�@�@�@�@�@�@�@�@ @ Y9E-@�@�@�@�@ ߦ?<wmԨQVT)ӦM+Ydߝ-]mcboazPň#O>ѣG[ٲeo;\СC뮳^~e^s&>4jQ{gY:Ӯ];kڴ)pi|^j}>|تVjw}o>{[={^z6gzWBVCQȶƍK/u! U@�HNoHMz{5)gMf'clٲ+$N02ޫ\r;S&Mrn4A � � � � � � � � �$)@d<� � � � � N`ƍ6h mV|y+EVZ5r¡EyMВ?Ч#*}wW_ٸqSO5{tM.h"URÆ sA~裏,wQj"ػw Sx7L<ٝ3_~<xЅA^uU֤I+P@zٍt۷Μ9M\˵!j7_|a3f̰2eʸ�a-Z4O@�bW`׮]C[oe5r%VCKZyMq/{aR9t)QJ,Yu) � � � � � � � � � Ag � � � � @Xz :ԆBs ,h7vX 4…  ^@}SLѾ{[h{.UA~uIW kݺ*TȆ be˖ ,ŋk͛7uFL+?X\`_~]zVjt~H+7A vm&MrcWZƄ+ڶmk+Vn'@�t,Ҹ{lڴivZϞ=]p:%e@*'0Cuzm峙3gcB>l9rpAQ~}?~|X� � � � � � � � � �1"@d� � � � �d-[t7nmݺJ*e .Ef]eȰvӧp,F(l"K,.I&ּys+_|uֹ(T{ٳ}+_ܪUf)R$V~9rą1/V@SƽzY L*+#z{qĉmرn|gڲeK+^xu@�]?*o޼y֪U+,sP#~O^˗P'|J(@Q}l;w!˔)cK, = @�@�@�@�@�@�@�@�@�@ 6@/@�@�@�@�@� 'y 5=z)LNsN�@ .jԨaUT\regHz.[f͚±>]` ~{S5rvsNq׷o_YX1ׯ׈+`dƌcݺuիW xe˖vu 6<֮]k't]x.vVzu˟?zE@_mƌn|2e.ոWreڸqcuh:tP&L`+V.]u]b:IҥK߷ؾ}o=z$�Xmwv?C.^N;4۴iSb@�@�@�@�@�@�@�@�@�b@ 8t@�@�@�@�  ]SܤI\(]HV٭|q Q�B<y2 @ =|r5w\={.Uau fU@kݺu]p]޼yӬodz+VX׮]~+ž|It<gO<a_]vekYɒ%n S ɓ~%K:J.m5kִUƽ|~6@�֭[gs1ofΜi7ova `U kzN:.-C�@ ̟?x n0ȑwDU`˖-6tP4hO(^zv-X֟iSN-ZD>*A�@�@�@�@�@�@�@�@�@� 2u\@�@�@�@�@  6،3\XBuV˚5 S B"G%kT*djM6… w^˙3 :Tkժe~o}wֳgO"G}ԅe);gyFaUTz.֒qW߱c:=4fɒ4UT*T+^˸")ؿ-ZȍiئQYjVvmSЪB) �ݻw]@oZr ̕+Wz F`6|pꫯlܸq;wn+}֠AØ@�@�@�@�@�@�@�@�@� @df8# � � � � ~w9o<`[j.tVLx%KZ<y^U]oҥK=,Yb۶ms *Tȅ>*\Nr ,[,XI9*԰nݺֹsgOeڗ6l0{wl.<S͛7ϴ&)qA*Rc-tS8;/^rȑfXt'}v[|iL }^ڎ9₰ʕ+TM\CM@�Xn 2ľK6mشiSkҤ&LdSǀuO9j(:EA[6�1p � � � � � � � � �Y |�h@�@�@�@�@ y{ڢElqa@_f R gy(Q ;<8So5A}\¯V\i+Vp_:zGaq*Q)G'0n8߿ >g7tkΪUvtffϞm ڮ]UVv[Æ 3؞ٳ.\7㟂=ϳlٲYѢETRnӸ1Xbv(R@45mٲժS }8Gݹ@� o=ƌcwv}V89@jO4t/9qDwf͚%\ c � � � � � � � � � ;"� � � � �DAj* B.0K(M Rx_qgX֬Y#@ e)mڵq~P0ƍ*̟? {SA [ }nڮjYeɒ% hm 9s 6̾ w~*|cǎ֩S'(%ue˖qOc gG#q/rΝv_`֭n<m�ȝ;w5u Vpa1tnӼe9@�W6}tS رcm֬Y)b]tժUݧTZ٢>i&w4c CD맜rիW5j˔)@�@�@�@�@�@�@�@�@�2�AX' � � � � �! _MAC#4hqkgϞ݅)H 0-ӂ fз8fJ@ ܰaCt.T!֭s{?o޼qAm lSpaqTmf6tP駟=.RϏTt*`f.dFa':۴iժUHe.TAzh#ۿ$4 NcmȘI o>7i ئύ` =mDa*`OL O@�@  !<yj^! Z>M+W+Z p5d#G mܹk%J /֭3ˏ01� � � � � � � � � �G)@Q± � � � � @P8!wXSmٲGA9\8VB,xviqz),2ϟ߅/3M vܶm{lݺM&sDЇ~hѹpа |϶EB(G`޼y?)SgK*ek׶5kGJ,Gb<MfΜiz(@f.N:.̅ȤP1O㝞+Fa~: o #ys}x西CoB5T!;v숷'|uY.T4ئyM/_x@�/0vXlѢEnf`,ʔ)c%KP~ ]X"CCz R Tf5qf5c@�@�@�@�@�@�@�@�@�@<vCj@�@�@�@�@�Ƞ BG0 I!'  Mis'qI'ś*0I! ٳgW'OR.yݻvPӿ˶on&|؆= NxgG̙3،iطoM4&Ol3f̰YfsOrYٲew+@Dǣ(mնxb[d{h^a1:yTF Uխ[իgr:]4gBN�`S�n.[l.VBLr:ޅrΝ{C5o`l?s v ƶ 34T Ԕψz<G�@ m-[f=z#FX^ҥKœwݯpCj`p3h\Ws`qK}ڵ]A5kLN TпG˗>}X&MBg@�@�@�@�@�@�@�@�@�8j @�@�@�@�@�W@ \RЩBPҞ={(%4%|h z(|N Ca^#y,Y,+Ja=Ctz<x?`:M+1x(/°BZ+B82MZ)LSO=Mtet-]fΜVڵkk UgPι< ?oC߳A383%4M SIPާz?-ZԅT*B VfM+S{#@R:ׂqNc]0ޅx.TW='O Bi׃q.w 3p 4sS\}:C`lK8\{5Lpk Ts8X75U`��@�IDAT/7j| Ƹ`pDY� @Z'^z5jdʕ.R}Ci] Otݖ; ]bS]鹮kMevJ~_EקTE׌ vaSȥ՗E!? >4h`}ի'\ � � � � � � � � � @L+#� � � � � }(R44){ ? ? BL XJS=RU~;~ TWhf%NJ QSEA U@5kVH(8OРt+M 3 <\PZ($uCc^x:1/N54mI~sPq蘚VPehLmAf` pIc]G=W@�2~m{܏<:u*Bؼy �C "!G)5T~A|iSԩS~ڴic<(Q"c`  � � � � � � � � ��AiFMC � � � � �7(0`:aCAZ-SG K5kV˞= PUCܐOz j~֢E^2_ L!BTPXB ޷o4'ota'C4^c]%.t ƹpqNcۆ y;Y>S|=:BǸ޷z>  � ._[n㏻HMu`Hk o]w%|,]b{QVk*]K>t=bS]W_?lVΝ;PPE�@�@�@�@�@�@�@�@�@�t*@d:=pt@�@�@�@�@�.0qY&f7h;}o?@�&Pٝw=Hz9E�@�&yf{> kf~zۍwu֯7; ?`�իܹӺwZoy~9@�@�@�@�@�@�@�@�@�z� � � � � �+pfC}.g@�X_l„X }@�@�*A>*UƎk1cdH}9rr#-[6[mŊK/d%J7|:v#� � � � � � � � � @ 4� � � � � � hOϛV� @ (rT~R-Z@�@�'0{lYu[di&CA @Νy[z]wuvZٲemС*L@�@�@�@�@�@�@�@�@�@�Aea! � � � � �Ċ@vfjCf+ �]@A{͚%@�ݻ]`Z,_|`{g-O<l&&ڿ,KOS' ,h/-[tڶm<'LpL1 � � � � � � � � �d\ 3e@�@�@�@�@�0wefn6dH-v@  ,iV> u@�bL`ȑV\98p6~x+]t2zQv\ѫ/j:smРA6g;SAv嗻@X}@�@�@�@�@�@�@�@�@�@� 2v=A�@�@�@�@�@�$ڵ3$V%@�H L#jA�@ C lذڴic-Z:uؒ%KSN%K g U\{3fm޼٪Tb۷k0E�@�@�@�@�@�@�@�@�@�L.@d&?}@�@�@�@�@�ғK/]YfӦW@�(PԩfeĽc@�@ ->c+W͞=~OPBiqoc߾^r%6k,w\LbJݻ۟@�@�@�@�@�@�@�@�@�2�A � � � � �G,Y߬qcfO{A@�2 5?'� �i%akٲoڵkg .uLT2Cgˌk֖.]j? 8Њ/n}}B � � � � � � � � � @ 2Svv@�@�@�@�@�+-矛Ujvef+W} �[dI20!}G�@�㏭\rxb:b꫖;wD Y N8vjVrӧzJ*e #G1E�@�@�@�@�@�@�@�@�@�L"@d&9& � � � � �I͆7+ZK##� '2=/� ذahڷoo7x-Xիw<t\lAv|w[͛mf*U#F0E�@�@�@�@�@�@�@�@�@�L @d&8" � � � � �Q o^Qr6kl۶ @ (rTCb@�W_}e*T%K؄ _~C s̼�gq-Zdeʔ-[`П~) � � � � � � � � �d" 3fW@�@�@�@�@�h ޽fMޝA�uAj5+{J@�@xoToꪫ+绰їXkSArZҾ?JaÆ-k֬veٲeiZD�@�@�@�@�@�@�@�@�@�4 2ͨi@�@�@�@�@�RCpaѣ֮5kh:@�/PYgMu"� @1cURņn_}'O ` RV-r9VXa˗n6lE!� � � � � � � � � @ 2CFv@�@�@�@�@�-P?͙cvfGdn@ m'2mi @�8ߔԩcŋ W\۝>#2<zfl.8tԨQV;w߀ � � � � � � � � � .LN#� � � � � @BJF4GN</<G�@ u9u١CS?"� @X~5lО{9{MA~gyfف4)Acg͚:t`˗/^zٛoBEgL|C^A�@�@�@�@�@�@�@�@�@�t#@d9Tt@�@�@�@�@�"/0SKnm^G�@ : ܻl֬G- � >~rʶqF1c}ݖ%K3ik GΙ3VZe;vzʔ)F򂬁� � � � � � � � � @ dž!� � � � � Q4ib6h٫=QT& �PdI20!: �d#Gأ>jMFٳbŊbRs'\@ַo_[|]|v7ZjlёWš � � � � � � � � � SA3 � � � � �  k1^=5R �I ԯOdB� @X~5l^z%{뭷O?yf̝^rг>>?D~5n.R3gN+c @�@�@�@�@�@�@�@�@�8AW~G�@�@�@�@�@�ORE�@ANjv" � Y&NhUT7ڌ3nD) 1V,_9tڵ˪Wn_Y?�@�@�@�@�@�@�@�@�@�bS <. @�@�@�@�@� Cf=zu`~@B* @�P޽ff%@�@ C k֨Q#S͞=*V/-vf~\ҢFzl6tPw)Sƺuf[n͸;͞!� � � � � � � � � A @�@�@�@�@�@�}uh֦ĉa) �*PYgMp5= �IJ~?}v=X^lذa7oXrm> upZnm-~ِ!CxOA~R9@�@�@�@�@�@�@�@�@�bR Ș<,t @�@�@�@�@�)[f-Zli6gN4k.@�_ 5C�@ ]ԩc|9}Q˒%K4# ={vҥ\Һwn}%JomncԆ� � � � � � � � � �,@1R � � � � �ĺ@V dVY&f˖z @zPԩfg@�HJ`ʔ)Vzu;p͚5˚6m꼖o+W2+rc={UVW_m]vۗ_~�@�@�@�@�@�@�@�@�@�RO Գf@�@�@�@�@�!9=0+QK֮@� ! Ƚ{N � YQFvEJƒrL T!NW_}Ֆ.]jUTq\pM<95N@�@�@�@�@�@�@�@�@�H�A)cu@�@�@�@�@�Hy}YAnْ~#�Ğ@ɒfge6aB!� nFڵ}G7cط*r<檨 bŊg}懕roze˖hѢde@�@�@�@�@�@�@�@�@�HM,_5SӐ!Ѫz@�@�@�@�@�@� lhVI'֥ij-~_~i#F[S7wm5n8۳ nLA?R#%Z� @8`7| g7x:wF2qaVԩf^2'gaҥ)8y%X\\RcGB X'0R_֢E ۷ںuⵒ;wn{-[p}6|~…tVF {w?zvopOG^ڹs}P5jf̙ǽ  � � � � � � � � �i)5--@�@�@�@�@�@ 8lhM̚77۷/ ~?ǻ={Dcq͚5o@�.С @�h lݺ)hPq@FSp?31\#i_>C[lYDۦJ/6o<|Ĝ9sl6n8+Y ܾ}{Ի ,Ybwu)S^}Uȓ'=qm9rĞ~iR 0j֬iO<{/3ƚ6m݊ޓ NW]UXE*,Ϸkk9r{MӧO &< � � � � � � � � �i*@dr � � � � �Ċy٢Efmژ>;z*,]qѫ<5uͅ"vmQ@�- Ƚ{fJG@�h ]ԩcO֨Qh7A}@J x%Uڷoo*UrOllŊ.0k_3db7p |\b^DU*guS?۵kWu]gy{ީS'ٳ5h4v;v4]'|nݽv"Em۶駟nVuѥK߿{]/-R/  � � � � � � � � �K oB � � � � � )ʕ35lDIyޱof_}\@jTDEj .JTЍل )>GʼX@�Xx]tE#G6m u) |Gl=7z?~;餓1ֹ~=ի]O<aJ>y%wVP!;]U3P|n6՟?ٳg_|-߳gNu%Uzm5jԈ[e}vWe+n%f@�@�@�@�@�@�@�@�@�HCiM!� � � � � �1'P_5kf5o$ӧ۠Alҥ.0I&ֶm[ѪUAyfίmvǫPmذڵkg7xc׵6mU<> +kf .^z?N8{衇`ˉ6i$Wo\쩧ŋwmӦ >|'0[oխ{g3gδy9c/B\lbyB 2 �+P?A~fQ\a`;A�I~ɚ7one˖#F "% ,YWbEڵ'kE!}q:u"E3<?Zb駟O?=a=p@˙3k_M]*\uݛkJ:u'{s*PA~6lX܏B|6tP۾}c˖-.su%?BJy{Y+x]~ .%UtTnD!#@K}WS`U;S!#W � � � � � � � � � YSND�@�@�@�@�@�ҕ%}oxo_|UVXP!kkq)81~QtM.d1Qw}.dBA Q4(=jP֭[Zj0 ۢE yUWB%b@ɋ.-W#۱c[z~N6ͮ Os-("( ]Ț55n0`@Y.ʠ07uVf :С??2ہ]G�҅5j(Hdi@ w>g^\r1VZYҥ|ǎM!aÆ6w\¨5^NvܸqVn]{}~8A*0DGt/Hн\҅@E߶m\]K.vu׹ ztW}GUm(N�4D:RED. MPPV`bUQ ҋH/{Iqi6I~;3/ЦM~z. p~G6pv kFZf;oFU5>TnǑ#Gb >=?rh"lA( � � � � � � � � �$�Ai@�@�@�@�@�@ , `ץw޹n۶ms!۷XĀtwhҤIO?~r-nbŊP[ Xn $x7]PnzjٲO?ԅXZXH-;v cY۵l2aZ ܩRJL1o<\�ELԶm[W cM-{TfͰM~iצ'x-Zy¶a@B3g!;ɂ@ &N[n,`;vld6lՅ/VPo}1pYfs {_,p.^۶k1cƸC8qBgO>]g~:OmR6nܨuh7o^=ݜ뇝n&MwSe%{Mnf~0K.9wĖ-[NэM&=kc-ZvCmv yDziӦn  � � � � � � � � �%:Ny@�@�@�@�@�@�@;g/}:wW~ŊFSNbT/˗w޽M?3]|Y-|.a f,Q? v͛6(-[6iF;v6VW+ yy`^K>M 7 B]?ܭ/BSL ߓO>g!  J ΕV @ 7u]#Gta}_dRGERNeΜڍQUXlטa>!C *\{--+PD/@nдiSeϞ~!>|X*U_.4gvÈʅe-[VVYz{匥_c)^[}?pc3gTvm#� � � � � � � � � A&*?'G�@�@�@�@�@�@[B >v[nuO,xѿx!7o_B*ҦMfCCCtӦM.q6lgux0ł1M 5jȑ#.B, ?`ml' Ї~R$3ϊ׾_|1~VruAA�[n? G~`@ 0,̯Cի JA8pnvWV{CIt}lƿ Q)ƍ~3,q_w6l;ҺukuI5k&ٳg\/׮]Çq%K꥗^ҩS"kzg͚Ume˖-1/ xvsxJF � � � � � � � � � W~S1O@�@�@�@�@�@�@xU'6m~yu3?U.T{?+$L2ĉ@eǎ]rʺ5yd8w, ((ȅ;$˪^֬YmۺtQ?~V-[vչϜ9\ @JWOZPʕ:GJ~7v@ ,�Gs=~;*jd}V+wΝ;hqDcAc7pnGno&}RuҥK.8rv͚5K-[L}l Qܹ k练UD xb_zdzL8n'anI?+xX]@�@�@�@�@�@�@�@�@�{ ޔ#"� � � � � @22DzAysiRZjUϿu˗/wk֬^8.'z,h+-R>}QN-4z!W Tfw߹ƍGN>ʗ/Ǝ?X!!!/]C,Y4i$Z*8ނ0~e �HeUΜ@�@1bt"{曁TUӧO*Ul3f(llq*ƴX@aliԨnF;-Z4w_yge}Jݵ~nZk׮um7ooĜ_t环vmlaj߾y)SF&Lb<#}{1k֬_D.ov8r~ٳgu]wE@�@�@�@�@�@�@�@�@�H4 #� � � � � @ +RݺҽJEB,`ԩaU9sɣ{- v3f صk[Mݻ2o㏻Ѓ)Sխ[7mVСCnjuX�d]PLX)Q~ĉ7XHMkժtҩG.|. N:*Vnv-?@�(UJ_ .+@�E>sA~/^y@VǩSG1c_d* ݉nj`eΝڸqD[fl 9Rׯ>lt}lC[_B( \r]e˦6mX(ٶɕ+ɄnFu7cEժU?^a�}*TٳgOwO>_xQ? p_tiB#>|Xǎs/}Μ9jРV1&( � � � � � � � � �@* j&N#r@�@�@�@�@�@ qΞGڶM1zI}Wj .hڵ4iʔ)*j,іp .\^֭[9sfOХKeoz)-^X?w^woQFQUvd!Pʗ.f!;w ǂ$ʖ-�id!? ,СC]JZF>c9st!Vgk;X8'tu qlA<2@�?|ݲ ߉O~?xw �$_~-[w0`@bU%p}}e|կ__ӦMS/`ܸqnKǏZرceO>azM"Ξ=B'ӤI-Z>P޼yF\h7G킂: b7Xז8իWwvsӧ;t~ /q^f+aFF|'obŊllĮYZ1s1l <Z` ,YX@>뮃tNGU{-X1 {svt � � � � � � � � � �AE  � � � � � 'NHI6'Bкu\hAbŮ\ܹS:uG#,B /Qm~ _%- v }%gw)bYD e͚5ax� R^ұcC~X0?x �$5iD< Ч|{ҧnذA'O-n~Z4W\WE<}}j7>}ZٳgΝS  ҥKa< 9s\ʕ+M-^}U7>r-հM6*P!8GLe3fpA"jl� � � � � � � � � PA&4A�@�@�@�@�@�$-pT|AҼyRΜI9T@ lnIZPY3N)@�@*EV5f̘k,YoTOn2LbҤIׯvڥݻWܹ@�@�@�@�@�@�@�@�@�D 295 � � � � �={d!V^|Q? IS C @�'; _i=@<u� խ[W'OVڴit)8~k+emZ~}ɓ'I5zZbEX/]ٳg[ kƍ.]m{&uz@�@�@�@�@�@�@�@�@  /:MF�@�@�@�@�@� ꥗^ҫR о}R`i2 @pǙQo#_|�ij޽{Uzu+VLfRzY<懷@B\`j׮Zi&7Ncǎնm{ŀ'D�@�@�@�@�@�@�@�@�H~A&kJ@�@�@�@�@�@ &NN:矟fr{ԩ@ Y!%;&_Qh@�@ N::uܹsZhruNi~4fLJkyj%K\ t!URE3ft˛nIoo|YB � � � � � � � � �%y) � � � � � �1hժ~'mذA?^MClԴiR׮1ؙM@�R@zҙ3Ҳe)#� /_ݫ3f1?ٳ|{LիW {?.]Z+Wt9KJo޼jԨ!f 5 � � � � � � � � �/@۱' � � � � �0ʕ+)wѣQ>}RE�@RRp4wnwaC@�@5o<_p4+V,Gb 2>uiӦսޫ>LИ1cTR%IƍԪUK5kԯxF � � � � � � � � �ē�Aa@�@�@�@�@�@ y (P5W͚5ӫ6QVh@i^Z� {z"G@�@ zAiĈ7nVlhA&}8sj۶۷O7߬ŋ|jРݛ � � � � � � � � �ķ�A-@�@�@�@�@�@ O^G[o<}룏]Si @X…ŋqp0� � X`>_G F ȀZy{ڰal٢x@ׯWRԯ_??~<Q@�@�@�@�@�@�@�@�@�O Sc#� � � � � @xg4m4_`T.\_]ĉɺ4@:,iٲؙ]@�@ Z]vUVj޼/o۳A ;'e̘#PdIM2E;w+ÇD4h.\8& � � � � � � � � �đ�Aqa@�@�@�@�@�@ e 4nXK,Q 9jnfL@ bR`i܈׳@�_/QP|4jԨ?{&ٳA&(x:YOk۶mҥy.]ZcǎUhhhj UE�@�@�@�@�@�@�@�@�@ j a- � � � � � @2etRUVJP[͚MҢE �)H^= S妩 � (Oj֭/%K<3�AKȑCo6oެ cǎ\@+@�@�@�@�@�@�@�@�@��A@@�@�@�@�@�H9sjoյkg]RVMSs@�$ `A J/&RE@�ȑ#5zh;V%KL"NyܳG:tH:uJt^… ?֚5kTH5jHwuVXqd?@�@�@�@�@�@�@�@�@�B Ȁ T@�@�@�@�@�@ڴii}aozhӑ6-HmX�$7 <sFZ, � 86mR=3ϨqƉS #|Y )M)U*'ťr5ctH6J|/Z]}F~ڴim۶@ � � � � � � � � � LW6 � � � � � @@ tf̘˗ h׮7d4xUY� LJsii � (p�WL xfNu=͛".N3qizy@o+D,PN-ZHSLѪUd {Сw`) � � � � � � � � �*@d^� � � � � �I[Q;t2Gݞ_/@8Pȿ3� #2y_aZ� P}֭[+(((NySY3)44S'OF khѢ֭[_'OV%ꫯ1� � � � � � � � � @ !� � � � � @RT,y@gH+<))g*#�T ..^l� �[ 4HCUɒ%ïy� )"/u,󡇢ކH6q ۧOsatRͯzn?~mZ��@�IDAT,@�@�@�@�@�@�@�@�@�@ !Le΁� � � � � �)VP!諾;oo4i~ @ H ^,y!� _ǎSΝնm[u!NqAU+#*M)kֈֲ 2eʤ~i۶mjݺ&=U\9M2%ʝGOΝr;V"� � � � � � � � � AƇ*D�@�@�@�@�@�JBB^qdr˘C�HJI<wnm#-C�@ >zP 2$>OñAysňl{,u,EZɣAiƍRZlիk޼yW/#.\趻l4@�@�@�@�@�@�@�@�@�P T � � � � � N6-2ғ y{@ ԭKdrƴ@ ~f͚QFiСʙ3gƛ@ bGt%5#Z2OXb;vVXlٲ^zjҤ֭[vw}WGug̘ #%4 @�@�@�@�@�@�@�@�@� 2A9  � � � � �D?ԑ/._XEixi׳@ y 2hpd@�S㏫e˖zb[@V I#u濄yNRJY{۷O+V#<5k79XO>Ds$@�@�@�@�@�@�@�@�@� 2 V#� � � � � �+ H.E}T>z"�$ <sFZ,yV � }A q:O͛GݡC<"@Æ |r}駚7o|A]p P{]' � � � � � � � � �ė�A%q@�@�@�@�@�@ /#*$_e,(rܹO� Js}Si  �q"b 6L' #P=NVjTʛe!_|wh۶[ovD|׎={?jp\@�@�@�@�@�@�@�@�@�a6 � � � � � �\?v !;&M:qB7.u,E�H^(A�/PC5k|+Jp@Z's$@}7ͬYJ@�@�@�@�@�@�@�@�@ DR( F�@�@�@�@�@�R (H]wפ,Y73 �Y ..^Lέm �^`رZd/XߗOI-Z�i)P@j0Y4F$UViãC<$$D͚5Ӳe˒H˨& � � � � � � � � @R 2)^5� � � � � �IR S&o_i.g ȍLM � `Ag,s ;) �)LԩSӧ{1UT)>6ׂӥ}]Jb`˞~*7Hca }/M6h6B�@�@�@�@�@�@�@�@�@Z^l� � � � � � ;97ސz^{M> _ƀ~[j _|vFO={VҥKNCBB&MM6ҩK̜9{|ƌ*U+@�k(UJ Εjּ@�!:Y,Dرc?tQ?=.\ {TpV( Cs}ܹs+O<_LeCd%K~sc(Vq{٘==Ae`>?}p96i:ioަ^lxlv6ڗjxDޘyG 2q!@�@�@�@�@�@�@�@�@�|| ,4$ZH'9 � � � � �  о}dA6ر7kҮ͚= �ؠ#G G HbDfɒEr?~`Q@�"hNҬYg) �)Y`Ϟ=*Q}  6h˖-.PoǎΝ;]Xy[(M,l!oYXGѢEUlYxBb*`m۶ױzj�Z+.)RDo[~) ;l??l>X7MqW8aӧO{7Ɛ6#k֬ʞ=e6@J  � � � � � � � � RL)Wv"� � � � � @ؗwa!wv{ Z xr̩̙g}_?:u&-ڗ3g2zþ,ԾoA ʈa.҂=Joĉ,X=]8=� B FA�RR^ұcRPPJk=E�@ jnݺoqlҥzcƫWXEk׺м/,xܹs9Z_B:ZѦǎ՜9t9\@P V,8[nQŊUreծ][JWl5uGoؼ1{;Q7>1cưixAMOC3`oޛ߱1oQ=ll&l 'v{{_ڼ7B-m=0>8Cȑ}~xS,c/S\0  � � � � � � � � LJW"� � � � � @@ַl/luְh_‚C /Y^*[IҘ� طoa֊X dɒ%K7%q%\ׇnIZPYg@�[ߐ!C'fl,(nŚ5k,X%Knx/_>h^M?f,./0Jj*Dg}:unݺjܸ Lzqg>,1|F ^ࠅZM-<B mJ!O<7"6>{ngڵϪ IA�@�@�@�@�@�@�@�@�[ ľ@�@�@�@�@�VTi&0aa_cs ),RHXa%d 6,ZmK̊YݻsNo.Ds۶m͛~3ft˗W ܣbŊY΍�ĕ@Rn9 �I_gϞbO3gh̙7îO[^=ծ],Zc .h.҂+aarʕSӦMլY3UV-N ؍%,v׮]6n`7>т-4o޼Wym\mOI6^g +oꅂ:tpŋa O:{PB*yS>K a@�@�@�@�@�@�@�@� Cc"� � � � � @ u!?.]UViղ@ <Z-[VKadʔ)ɵ5+l_߸q{XuþoB*WnMUVu@A�@v#Of%S_@�GB5|p=s&`Gĉ]߷FjҤ~ 0 Xۼy4}tM6M۷ow7oر~azQw=n a7G:u*6b|^87o(XFL6gazS .] ;R|^/ YX1/^=l>}a2� � � � � � � � �\�Aף> � � � � � Ο?-K,ѱc+J*�1c$ހN DzedA1V5kT:uܣL2IRR^O h0MD�@  ن 6mhfX!Ch۶m[]@b۶m?9d@rJ3FƍÇu]wwjԨQ@;V7oެ-[\1Gs9Z^ѢE]?rm q!NR .1'OJJ.hTRf1n&CHd]6N� � � � � � � � @ 2I_>*� � � � � �1/sXBg? ܹsK۵jՒ=UvLU; Xt 駟?̙3.A;հaC( |_`| r@�Hi[n7߬QFC)h>|:uR׮]ݍpK.iƌ.�ʗ/gyFڵ#t:֭[׻Voj7pb7ٰG +YZfׁ.!ȂM-Ҧzjlo>WԩSMJQlY(W2e � � � � � � � � Au � � � � � 'NpA0sL:t?֯__X^=x85L$ 9st i_oܸ~i_ʧ � PԽP� @ t믿*M4WdvӧOkz5kV=S.�2W\ɬ1oڵk;hܸq.pj޼y>'WZ%s6b%O<.,Kv!S :@ȍ7^ؼyΞ=+*Q [TbEU\A�@�@�@�@�@�@�@�@  />MG�@�@�@�@�@ 9 ?~\SLqٳg+$$Dwq5j*THͦM?^wAj_ϗ/5kVZBA  T,͚ $ �ÇUpa 4ȅd%`F ~GzRƌ`K۶m / & 2Dzk, O֯_Y˖-ʕ+]3elL|aֿ @޲ϛuօ=,T"mZ =Vի`Q � � � � � � � � ,LF � � � � � .]$ O4ujܸZhO9rH@>LdW_iZt (zH> ې@ F/I:vL Jr@�L ˗n %޽[]tݻ륗^Rܹ^C+VP=\a~\xfP ɓZh,Xŋ۲ٳJ*h*UM7$k @ 9sƅZJ߁lH".f͚7+VF&qGϑ@�@�@�@�@�@�@�@� RP@�@�@�@�@�V 6lFCaÆС6m,Y\> رC&LѣqFUZU]vU6m!CAs@ l/XGZPe|P@�Hqxu7j߾}?~Zj fh r5X!!!z]N8Q%KLV=}ϟٳgk޼yZzk_ TV-:wTR%s\(e\@B_Gq׮]ʚ5{֫WOwu h%5\U� � � � � � � � @AFn@�@�@�@�@�PUVi2eOSNn>@L\G}?܅ZpJϞ=;w�9C� PԽ|Cɡ5@�k۫hѢj۶^yk;�[;P z7SOiJ>=:(}vlRvI&;#M΅YcjT~}թS[W -\̙M6 q/_m�5C�@�@�@�@�@�@�@�@�H � � � � � h�i3fPZϪI&J&MU$QG Ǐ[n۷rʕD[D@ )k':$͚jK@�[5j/.]/"nOvy=Co5|pwxkٳgci„ |,k.�WuaÆn,%SLq|V� )w^9sL_r>UiӦjժJ(\ � � � � � � � �   cǮ � � � � � 0{Q>}4n85h@/ /Hs(p=ZN8~gϞ JY`W/1>gd@��Xl 7oΝO?T[l ~Ub_K.7|# ֤č^zIC Qtcƌє)St7vҢE 5nX rXHlPXBӧOԩS/rjݺ:t蠂 &v9? � � � � � � � �D!@d8B�@�@�@�@�@�/3[ /EjРA. qkS5tP+.<c/` $]tpTfœ � Rn:ZXlRNRƌz_3iF3gԜ9sTRsR[o^&L>=zTFȑ#i&}j׮4ilٲRU $m4i$}gڸq5j{LRN@4 � � � � � � � � SWOL@�@�@�@�@�T`߾}jذ> iРAց!>}z[7oVUNK 3R`i8;$B�@ ?ɓ'[n~{Tp2e B WO=:u_~%rmݺuw"EnV`!o{7|myml@(QsBWXŋcǎ*t vN>Kc@�@�@�@�@�@�@�@�HA&+H@�@�@�@�@�H˖-S*UtQYFzR4iaKiRRȗ/Əqƹ/7iD'NH*է #2 \&� iUVnjU2d=W�a7Kxea&Uʕվ}{]x1oGU2esNM6M6lPϞ=7oD'F�X{=k| |wtܹ4B�@�@�@�@�@�@�@�@ j_'W'9 � � � � �4ySf f@{ؽ{OjҿW&ܦMk4G3gD E�$0b|ұcRPPrjmA�@ bu*k6\ov2d.]O?T 6o\[nmmօ_r_hU6l'u*U*Tlc*X`X"0_jԨtЩRbʮ]JӦMuwFꚗm߾]˗+gyϟ[os^~eY[bZ=zG};Ack̙1c;(P ^되׆up :uiѢ/!N{8t萫1Pvs/RWciFŊv!!!4i tic@�@�@�@�@�@�@�@�H<ԉwjΌ� � � � � �\)fסC}g@x^׳ϕW"p<xP .7|˗/DJ.~IgΜqW �e>W$_n@�d/sN-X@?muօ-[dΝwQ\{G2et]wuŋ#'O͞=[]tq3O<*Y>CM,YǏkذa.H.Ι3ǝɓXTlYeΜO)RDUVƍضr歋, ꛒC h!pk"1%v;{[oѝI+W &C H;de&tp �3f֮] ބ=u �@Wtg{16PBzfͪCj˖-. 2|hpB\ψaaŭ[v?|NVD۳ @�@�@�@�@�@�@�@�_ 7  � � � � � v-\}Y:%Yx\?=4$$Dwyg ĨB/p4ihq{4sLm۶ͅݑ9TR /* n@�$`بQ+>PB.6ʗ/ _tҩsβ0G+nUJծ]=oذ*TgϪN:Ջ/zJ9st۴mV}'|atsڵsDz'xB et&M ]ۼ1<[o.rQFԦMdcqwi-a Q,E4h+W~ qgϞ.^ ]ҧO>=P%1ۛm4G}4!Nust횏wjjժ j۷-*M[H%((ȍeZ%WVMV  � � � � � � � �$�A o@�@�@�@�@�@ _~مt9҅xDIZsNY0˗`2g^~XRnA#Fаaôt@@�$,PAIQu@�kOC)mڴWeA{ѣGbŊH"ad˖[Y/Yfu2doy?ok!VnjOEe˖SNu_m̾}|sեKhLoFM7A- _ ʴ%W\j޼><lDzX4du["<u,~qb!]no|/=cҞF!7I='L~w=ca" \x֬Y<PfJF0|nݺ:rHTz � � � � � � � � b)4@�@�@�@�@�I.Lﭷޒ+$Tt,\?֠A\ºuO ֗_~Pʕs){aճI&رc*^6m{'l}t3vr,YB,~mYXHuAw{ o]-_|m]wH ҹsg׆sι  #M6W^qyﶷmb~7n<뮻l+K,g}[KFԺuko={VZXp w1+6שSǹO2%Nq@ Xd^ŋ}FL@�'`}X |P[d2;ov1)%J'|MeZ+?\O=z?~RÆ cZow! <XWv!;vt}6;@dÇˮWdjZ׻[App3ںw}W{zm-L4|LK?>8yޤIӧ9s89f߿_Njc?ï;v ;>}[ב٧Mo (۷O>d}|g߿Ο?YnL<{⋮B1^M÷׶l\'c_}n{#GhB3fp˖-СC8O˖-]J=TfM7o!65o<m޼YUVuF6b?n|j׶M64n8ϪU{Odl|̿6g~{}L^C1?nyVcrʹٯJ+V4SL<y.6hc@�@�@�@�@�@�@�@�H8 w*΄� � � � � �D,w߹/[AB oE¹.%z pH 3x5p@UVWX/^Y}IڂL֯_Mo׮RNoV]tȑ#'|[}npab E/ۗ4kLKv< Ѓٳg`z[f_ݶ#.3zhge5k6l '+Æ Sݺuum�|> |?N<_V\鮇X[AFw} Gu @A�b#`Ag{(6Ga_@�[O?7߬*U\UQ }} b *Kjz*Z@3k۬\o֬Ye»رC5jԐ[ХZ Olg/;Y0-ӭ[7lԨQ4 O.7n|LjjG_v[7}`fZ:Zk&  #]ؠf+v {8V3 }B c2vGڴibܹ?W_}խ#jmٸNdljhytic+C{넄G<0aBgmkȖY W,n@b6cM[w?ЍEY(d8]o Pݽ{ ^yZ8f޽]eMPLǡcF6ݪ ^Is}r�y1cFw}|�@�@�@�@�@�@�@�@�@ e23D�@�@�@�@�@ V^2e([l ZO2Z/o߾݅@xz7e%jr! 4paʘ1c\c4i .u1a_�_`,=㾼o%[nf]c=_2-J \r\|ٶʬYDǞK*eÊ+ɓ'Ķ={?OY(bڵ3<,BO۷TRq.B?ъ+W9rpa;wvzx&RΝ;^ q>΁�W>%_v @�d+`AS=P{/Xbj۶U۞:uJ +!XY(ӆ +'[8z}]Ue7 OO<Z /঑-t/~^Z]K ~;v h}Q+'NЯӧOwˮי3gݣdz_eڴiuo Z}i}zb͛7wn`vmjwy `P{XwP1j%׶w7q.F3ٍDl ͿX8iXW^AAA.Pnr7Z-*?wy][?kѢE.h ѵ?1; ϘÇq"{x7#k(&P-t5/so@[CA�@�@�@�@�@�@�@�@� w>΄� � � � � �\%`ٳgjyB,-_ԩSJ*�C XlѢEXN>%JnY+U˾Ka;G0c_ صk^y}Wmi_m۴iSU\}޾n//j> ciҤIi>%KhavҨQ#1uTuIÆ SBda^ZgE{}}b똂�V h|9:@�ʕ+{nׯq/D-ŋ_M8.`B,ܰG.^>OTvM\2dnkZo} 0~ fb}b[/g猨lF&L ^\iavlܼ}-a7.޲~wÅ pAur!r_ǏOCyw( )̼}F`7 ,06&c9~aws9s渐CoyL_QM{t\>it6Nd!Wg ͮώi7:9Ƕx7%\r}&)RD9stˊ-i% /[1Vb8;`4?ȑ#>rElX}P@�@�@�@�@�@�@�@�@ L8k΄� � � � � �(P@|M$kw4i҄hӦMp˗- ?Ӻukd`͚5wn1)#GM6.?tPonǎB'^M>>WdAlcaV/{<nyz Iyf<xP Nk7?罐{S@� XK^h� @` |.#+*T6XYb<y裏>{uab}U;^\YyջwH϶qD˭M,Zj]?n`%1kaavQC|kknvjB7kkǏwyG#FO<V!m웱�H ]n?_b?VLs(&:Q/nqQ˧_N/5.3m}xѵxޘ2y;/1&C'y ݾ}>3X j K.iÆ F9\O� � � � � � � � @rɭe@�@�@�@�@�@:ucy_NgʔI'N}!=|zZ/H5ʅ*THfR˖-o˗/zZfڶmױcGΐ'OFK..$Q'-m{,ʗ_~y?y?Ju7b ?G#&'k]{ɒ%RA9#-[MS@�RAFW|y=z4/mb[ ܲeKlsDz,?@09p$,8ΝWbE,L4Iwyr#E,Xx7Gyhb<Rn]v{ƅgCv*1}3vS?nᭋ׶w옎xG4ҥK#Y}[j3g'r@qqLoֱb:&)SmfaeϞ=ir1cdw6FIA�@�@�@�@�@�@�@�@� 29 � � � � �D"PvmFE.[ а/ZH}qϻw. ehݺ֮]+g޼y:rHQXO?|iر}?q/9>}Mh6 ߰bVl{ضB PSNyu&/U͟??l,_=Y .\rٳ7&犓>|:ut͡X-�IXT))8X;7 7#� ZJM6`ߋ,ʺu^ל'oyo]ditF;ԩSxOc5ݻ7V߹Dʒ%,HѮW}?~woQ0"f̘1l}ņԂ 9SY_B.KmT,x:Knra{N?{wgc컐d߳%ZJ"pT(( Z["J lu) %.kd7~i0fΘ93gμ:Z:s]Wʕ+Wt{Ѽys=SwSN5[϶׋k\s=׊lqB zڋgו9L4@g(Pw}yqvK(= &Pz→_~<xw2F[@�@�@�@�@�@�@�@�w }?@�@�@�@�@�R@뭷Ғ%K{ ЫW/̙S_|n=Z{w!X)1 J*.>$mVZy7h07|W^X-X?ף>cfSL^vvK{6XŒ3tm^pԩSp{ލ+W,|IiF;wֳ>ς ?~/Y� =zp!hd ޼/RgV 3xɀ�$T� :vaaM6QS…sW?Y>[8`A :oB6ˊm=Ⱥ2-ۿ߮]]FyvNT kҤ<AҥKv^U?ۂͷ2,7Љ'2l٢?C=xmylUn] &hjٲ>U3 $}n}b` >a=sQmgu 9 {w#9_MlE9gv|7Ne˖M3g?9sxO 9ԯ_;.؃FZШQle駟ʎǃ Ҳeɓ'{\&dϪ]z1m۶-( yl+U��@�IDATale ǜu):f̘^[4k,b)!eZrXʴZ@�@�@�@�@�@�@�@�H_%pm>  � � � � � z뭾%K܍痲yq;2fsW\9;]?s7{l_oPH<|.עE … bݺu>sx$|=ٳަ'OURūL\ oڴiB ymvKJ*˚5ov FnҽJ({}j5n9|O%?V թS'ڬF<a?.p3u]N:\x_k#<sa ^9.$}.wwϟ.0/\Pυ\BkhH0˖狌L �*`<v`;ݺu;gէ~s4;rg:6l/eȐwu\H\t.Wj;scd]kX}6VPsJyƫ6I+6y9+]Hyvy (Vw[lY ʴeυڷost%^{%mF˗/B$QPE ُ?zc` _2e<6{饗?xb3dm;imsիڼ!`QZL̙Z] ʏkű̌]׉Xgw}=×;wh}F_10dw;Юqwυb\؟'+_uiן{9_Žzz tڵ>mg;nok&z_ص3cvBv|_;vr\ s >ks\!X ס5ݬ]g6)̮?680zdJz@�@�@�@�@�@�@�@�HD% a  � � � � � @=&Mo9\FRn``xSf{eɒE.R.P/ hn\.8C;vw7̟eJ:uJ6u {u y捞g/n*l]-Kl w^Y]h9kժUrr-,q7krkĵkKtE�4*nTpt5in#�#GszK.+޾P{-X@?S k֬Ӹ$kիK.IVdj+l;6>|X.pN.-IʍY9<.\8$}ݦM<B&iqfO<\`C(|!Ca]ÈJ GRHlou7ʅ[ʅf͚Zlw-DžaFWc1ɓǛZ(šC;>zA2]KH r*:ݻw{&9[dhԘ1cԺu䬞@�@�@�@�@�@�@�@�@ �A10x� � � � � �)/px ӓ&MnnOVނ={En`:uw^B8as΍spZ8|p_ ékBHX1ABQ4@�K>}ڶm(P R{==^p??ލ {L˗/zv^ܮ];͞=[͚5Kv+VMѷo8`]V~A'4Hvp2!Chڴi!ַtl@�@�@�@�@�@�@�@�] C쳙� � � � � �@<ywߩ[njذ^|EGҥK%ܹsGwZjŻN(ЪU+UX1Φd͚5p߾}4uT5J={ Ak#2w MB�yZJHWرcڸqʖ-{ 5&/f̘ݻ{9=j۶mS^<4*UhOvꝣV\9V։E X<UuںuכǏ+s̱,ifI Μ9?C\:wիWL2ǣ@�@�@�@�@�@�@�@�W  :D8aB � � � � � ѣտըQC#GXEEwb޼yzAB@�1R~RƌL@�HkVݺu5bĈ:pQ̙SIO7V&M$ iӦzG4xo >|X׺'Ojʞ={%6lV^=u]d`_KPal޼>)R$|;M.I?#qa&>J,yI � � � � � � � �G R* � � � � �$ tkMO=-DS q ̟?_>,lazǕ%K7b) IK.I\R �)$p!Y~܊Sz{oW \Rƍ[/wrIQHڪU+YF?J.z)9s˖-;v7ܹS-ZЭު֭[ ;&HuGFFرcnMcɓ5qD-_\7>XHll& F�@�@�@�@�@�@�@�@  D@�@�@�@�@�@ J`ʔ)zǴi&s=zUdIxy4d}7^СCU\E  C G�@ f̘6mhݗvL1B}Btҥl v_ƍ5g]}!+'{ _hQ 馛TbŐn?C� :u=8`kM6MWVաC~!^^ � � � � � � � �-@dx_z� � � � � @X 9sF},oÆ MU?L<yR'N?uz'Uvi"@YڻW5+S�� y/jժUt;Wٳz?^r Fh |]vʖ-V|mi:{,X}ZfJ*}66m* .E�W[:w\}xq5l \n۶ʖ-a � � � � � � � � p�A0@�@�@�@�@�B\B &O_ 7VzN:)_|!zjvرc5n89rDwqʕ+ZSi11cGRƌit@ l,Xnݺ1bD)T;h"/B ?=T#GK5j &. Ŧ&Mׯ?͞=[+qƺkԠA$$Sl2-\ϟ}L2j޼7Zo8GZ@�@�@�@�@�@�@�@�= Co"@�@�@�@�@�H/~[?-[oW6m={ĪiI`˖-^ǧ~To!&ڭ[7ϟ?-QWauB?BzB4 @�:tHyn߾EbvR ܹ;o^YfM*²uZO<\a3g觟~w}=X zuԑh]H> 6hɒ%wԦK.Չ'G k{|&@�@�@�@�@�@�@�@��Aԥl@�@�@�@�@�H6 2eƏ3g*C t7u*P@BS`ժUg>'|anM;wvk$^U PtҠAX � k/Ϟ=%{w+_|<x:vt%s+B[/  *hرVZ7<ZxY\R?/^aYF>OK,WMͥDIT3 vN:?Cp/_M8֨Q fWw2 � � � � � � � � @X N!� � � � � /M:U&M7|HլYS7tnFթSG3fLHaӏh_?ڳg >MB)G a.A@ Z+͚{B@�Ңs=>@ׯOO>ܹSO>dtСC&xB0QFy!SOZ7ҥKl2op.L*UW_=VXQ J-3ghƍZz$B - 2K,R,Ѯ[ڴrBk7@�@�@�@�@�@�@�@�*@dPy)@�@�@�@�@�RZѣoW_믿֖-[={v5lPM6jR̙SԟH}i…Z`Ν\,v̚UʖM. RzU87e! t1c~,G.$Q �I*жm[eu??$-&rJ 8;'V~au1MڵK#GB ;>}Sܹ>|bb ɦjwO"+T+қ+WNe˖FÀ@8 ٳG֭S׮]+ zT46[dI/т-Ѧ˗W <$? @�@�@�@�@�@�@�@�O � � � � � Vv9s-B - nݺS7.]:n9u<d?j͚5*UR&MԬY38q;:{6p}4/_۰&  'Bnk F � @+}jX|^}UM0A T=ԥKYh_8gɠ= bܸq8qrʥx@{VùA]SYz~wojw}v`W"E@2eȮږO *@ 'Ozٴilܸqc -(xWxjUW]+z#� � � � � � � � @ 2 t� � � � � � h"o\`Y͛WիWWjռW_ݸm7u3$_UViʕ}ddr٠Ah.ltMҁ1B ۵ G}9s@�(^\.H4(k>@�.],m^HĖI-uV5J~vء{7|-եXyɠ?~G^0azԽ{wYdIv?.{]sqÆ ^xm۶͝Gg̘Q%JPɒ%-Dp>А>2)G,+ /Msܽ{wti٣M-F -sLiJ*F�@�@�@�@�@�@�@�@ U *wF�@�@�@�@�@�` 9rDs\fR%W^y YbEUPAe˖ |0X r-|n?CfnS ܹs9sjժ^0g5TfM]uUn+?0HUj-@�dYڻW5+Y@�D`ƌjݺ,=O<IR&$}7;vMcǎεڴiVZy^o%m.4;7oחӧ{vw[nΖI%`{yfmٲ{mSk6pĉ i!.[ps RU@eʔ)z;^m;ٳO/mjhB`ᤗ_~KJ.-1 � � � � � � � � �I%@dRIR � � � � �@ddV^+WzB 7lDZF+&RJy7ۍT/_ c`7Mnڴsɓ',B6mͫZ+W<ӥKHust-ҷ*L(U]p � 0fԯt1%& �>?PׯOک27g/DB!-?W\_5j z!v*.YD ,_~ t0˶mzիWҎ߿{X]ClS gZC.p{cL1o޼ucA -p]9p7Z}>lܷo9{]Tlټs1D-\BF/=@�@�@�@�@�@�@�@�@� 2@�@�@�@�@�NԩS^G 4͛7nT2en47[�c֬YСCcv#3Xh?^g9ri2eʨlٲѣk8sFzikl:u>}]] IK J\5S �.`A|v^g]z!l"voygrCTW]ut9^0k۶mαa VҊ+EӧO=8q^`M|!]k?v"*8Un,@B!m;wn/ȑChc >>;Gȑ#vu%{mjAo6=?Ӛ`3@^`  � � � � � � � � @ j{ � � � � � @ E9޻wwSn?s,={v&w|3l ¥Z@lS 8mcFFFFߤY?&~6F|+#`uXP`i~Yxqeɒ%פG\9CtҤIK'K.C@5@ _4(Ś@ �$Hշo_ 0 A۱rh lݺUkha7nhO A gYls];gG;ǴP-,΂yS=+TժU Jh %>j0A>~9ʔ97z?A~cc0Bo->q 3f>i6uw{c_,b6Zx}bkD6Ͼ6w2}=qgsj?v ?l;}~?iSA*v|1K@�@�@�@�@�@�@�@�@  G�@�@�@�@�@�T/K2d5-Zآ?p1?_Mvئv!翏X3pʟ={ IҥKGxo7&} #H-=v$&  pWQ=ؾ]9R3F:|XRr#IsgekVT^p8u �ݻUpa<YfaCdݝ8mڴl~-B-\9?�gpv~?I *U;sQ[ƀ@B6oF}W.QjN[j$!"Z ]0Djb&w 6k;1O̠sD~ѐH6R ]Z?PF[ M-1hלR>B�@�@�@�@�@�@�@�@�V Ȥ4@�@�@�@�@�@ AcJݻK&=P6M-lq. ,Y"?\~Z @)SmmKÆIVI7$  5mzzC�)`IJ.@�tjΝ*RHH!@x D͜`;IzIw8QA.$C�@�@�@�@�@�@�@�@�M,Z� � � � � �) !"""4~xmݺU<HXڵK2e-/^֬RʕҌC^wT璅L0 �pYZ:vL�[@�B]?P\ E#W^ʕ:s ͛ 0ڕt@�@�@�@�@�@�@�@�H3A]MG@�@�@�@�@�@ ͓:v |PjYm)UF#FhڴiJ^~yT2din"D ۥ 1cSޖ @b,ЦhѨcPba[@�C +e@ KHݺIŋKKZIWKsHy~G � � � � � � � � �\T ȋҰ�@�@�@�@�@�e7KmJo:QjG\ͥ+t]g0H2sn%֕"*\iS$ i{-)22rXH/E�H9 Xb5@ _][_~^]ڱC>\ݧs � � � � � � � � �a"@dH� � � � � �C`Z馛z?ҧ[o(O<ҥΞ=:Ѓ奷ߖ֯ZʖF"2@ ȅ S,G�H%k֬!2+@js?X1{%;' ^SSoh+ � � � � � � � � @ZHeE@�@�@�@�@�@ 5 Y4i)SM9'h<xp@Z\҆ R۶CIW\I`[)4(`AǎI?;O@�R'e S=bڴ)8qbTmR~Z� � � � � � � � �  @�@�@�@�@�@�$8tHjBʘQ>]ʞ= Oj֬W^yE>ϟ̵vuŋK#FDB_QW^))|vZ�/PT4o^跕"�]kKnPBE h{C%{7GSO,m( $,*(�@�@�@�@�@�@�@�@�@� 2E@�@�@�@�@�҂@dԮ{4s?u>}ԦMqڷo_PX17$ ;jԈI\!@؃ OHct@ d֬Yc@ ?umZpϠ-H]O@Hwxa@�@�@�@�@�@�@�@�@�@ , H'@�@�@�@�@�@ T|>Z*U*T[v{ʐ!v*u%c_JnI:iɒ Ve A.\(<(͚% $ժ%U欄� @,;ɔ)ScǤ1c~6h ^-%!?rOz� � � � � � � � � @L cj@�@�@�@�@�Hb&NBZ5 OɣO?Tg+­ ꯾Z:U{)^=KPn9C�P8z4*_\|o^{MZTʝ;TZJ;@�Һ͛Ut@@ �~ET-}۽5k�  � � � � � � � � �T Th6 � � � � �QK/I#5osC ? \Jij 䜢A.*TNHS t `9jE?ZMٵK:{6Ȩi (U@�mTD @ Μ&ONRbC oƍMͽ � � � � � � � � �.@dV� � � � � �,0c /H]Y\ԪU+~ڽ{wCr7[,+><[A}  .01f3f9 �A,Y2@ fRRRRҀR!l� � � � � � � � � @ -#� � � � � @ZX\Q.ӆ¸q-[6uIgΜINd/d \FjXAjLZ69@. 7Hx!]:P-e> �+`A%JHJ BV`k$r u${{XCv0@�@�@�@�@�@�@�@�@� OK � � � � � oZՓFN;ϝ;>szꩧNǓEJ.GI%U"=tdN +etXn_@�K:rAN=; h(reIi&w$fR2!p� � � � � � � � � @2 T� � � � � �-`A'\(1cxUVM#FСC5cƌ>u^yEZU;7X�iBxqi0)]ػkA ž �$֭[J(RK< j׎:]XUʒ%DJ3@�@�@�@�@�@�@�@�@� C`'@�@�@�@�@�HgJ;K;wJӧKs>]Jz衻K]tƍ/4MDDTXg//]wԭt@f z42dp3@�ضmWAɩN]ĉRӦRJ̙3H;vH'լv@�@�@�@�@�@�@�@�@�BU P3 @�@�@�@�@�RQa_~)*}7A)kNǎKB%KJSJ&I|1cFZ9}D�A ŵ%@�H ˔#G䩐Z@ ,}Ir?iZᇥ<yRiT� � � � � � � � � @ 2U&� � � � � �,0vһJ\-Me͚U'O ѳg4LkqYZJjLjZC:t(L;K@ ^ 7]*A0@ ,D_15"@ |Ծ}C0xc}R/KSH7odk!� � � � � � � � � LE;"� � � � � @ tcI;^RE_~>SM0ARaQo<҇J&IӧK+KgE\@RR l=9?y� @J ܹSŊK$`$x 骫T矒=V~*  L � � � � � � � � ��Ao � � � � �Y`v];^re͛kȐ!.b͛ {ZMoIuD}zH 6@tҸqR`K  �"o>(P UYRQ(Z4 J"-\(1EfOÇWDDD* MD�@�@�@�@�@�@�@�@�@ bZ 5 � � � � � @( 8/4~\nۀ\Xf;uA[lIî>}Wi&B�xʖoO"lb@�I`޽o?Z@ >DjHZUryv~;jɓ'տuI7N} � � � � � � � � ��A)O � � � � � j7*o)gTۍdi￯".oѣGp;e$OQCp1C�W[Ky� @۷O Hʩ%mRR.RH}HsS]v_g&@�@�@�@�@�@�@�@�@�@ A6+#� � � � � �hiӤeO {3k׮K'NTtیgΝ9s7ސegC#@H <yR'NЩS̙3:}l}Y/]&}J;g61}􊈈P >cƌʔ)Οڼ̙3{cHA@�ػwm =\GO rGKX;4tP=nWf @�@�@�@�@�@�@�@�@�b 2v"� � � � � � ԷooE-[֏uf^(PT)}s駟p%$Xi0뤻.&OJNpQl�8{>:佷yGƘ=cǎ]0?~ |Gh!ӌr,\B!drΘ5kVHBs9s<絽ϕ+rނ*@�RI S~iSiXi(i:qcix[6߿ *~8Y� � � � � � � � � �q ' @�@�@�@�@�@�:t|wըQ tդI >\{Vʕ]K`HmB ۵jՒ>Lj<IF߯}EkhbuȜ99`h D 򿶩$61-T?ft;?͐!"""ǘϞM+һpF-DѦ6X-Ҧ1Gwo<}tkg###e^1FK]iL3/imH ̓'9c޼y6͗/6f6{e@�H;P@i�"@˖Io)}oK;IwSo 4uTwm`[ � � � � � � � � �&@dl*C�@�@�@�@�@�pX`. :[{.lv2eʨZjl:*%-\()h!)@*?q{mѣG/7Zx`̰ *D ˜c\6m-1q[H` y!Yj?ӂ:nݪ_ O$ ,荅 :u"Es`N@�ػwW2 @nM�hT+R.rio?զM7dM@�@�@�@�@�@�@�@�@�U 4JiD�@�@�@�@�@�BG੧B?:u|.%B2\õf/8b*Z%F d&}rt=҆ ҋ/J.T'`[lѶm۴} Ɲ;wza1;f ^ztZ装Sc%k p^J푑ڷo,?Ww}]vyA1뱐OTx %J/}@�8x𠷢@ 6oF}WwԮ]a&ֶzK>K+@�@�@�@�@�@�@�@�@�@  � � � � � pСoK*Ez+d̘}_ڶm+%2$OKeH=zH{JcHIV<!$ǏצM\`mܸ-?8p YXbh}5j^)RD6ZM9DiA ;vL iSwᅌgp{l 3@HX\m+Ttig@ Jދ9sB�)$p4s4rrחڬKO'd=x=y@�@�@�@�@�@�@�@�@�-@d )�@�@�@�@�@�YekW[7gOOyݵ)K4%l֫WOwy .]K/-/EʗOj^:tH dH/q͚5Zvm~z/y-cY^ӦMCJ,gf)`Ahc\@ҭ[F^|<mn,lٲ*_|hHyB\,C�p >N0s8]{O=Ztu҄ 7KY x w>QO>dˢ�@�@�@�@�@�@�@�@�@�H% � � � � � 'OF2G 5'`A\'OVf4p@ˉ+/hR9SiNҧ&M1# :uJWo=zӧO{> ʕ+>-0> ˳т  F6ɂ 7%7lؠuy!pk.o .q"RJ+ *3@ ,2G@XDzMϤ̙dѻTbu_o&S\`JB�@�@�@�@�@�@�@�@-*��@�IDAT�@ ?�t@�@�@�@�@�..п2̴t5kzvfCLfD 4lPvf+QI_}%h!yR8p-[˗BaVX@Br-nVoj˗/O0T\j!E9r `TM4I/NTREUVUսr @|3gVc9$R gK;Kٳ'X6ӧjժ.]IJY � � � � � � � � � pA^!� � � � � @X &P?]XCXƍջwo+VLZJ)%Z M WzE@ Ncǎph"o%ՆŋZjwv\*VAY( c9ri! rJZʛoi)SF5kBիMeRt Q pܫ)AGK/io/ &5hV~'Z`/^t"JF�@�@�@�@�@�@�@�@�@ w:]F�@�@�@�@�@�6mzGs׵ '2et%J駟֭[7oM,Or} \ k.͟?GXBO_:uW^^7(P홁� Xsػw/_o@eȐAUTQոqco,\pMy�Aʕ+EHgJ3fD=b,D gO`B ݻv@�@�@�@�@�@�@�@�@�HAN@�@�@�@�@�@رT4l؅EFFz3-Љ!iz-رC[Е.]:i+4zJIW]%iJZ믿4g}7vZe͚UuU-3x JTX 7 vޭ%KhZp{=?~\˗W&Mt׫Yfʛ7 @HXdΜ9C-4.ಢ;;MvM/M,w,ED$O,^2$y*@�@�@�@�@�@�@�@�@�Ҙ�Ail]@�@�@�@�@�[`@ߥdpSL2]9Ȑ!>s5n |%L6POiJsg1+/\9+gM:U3gҥK-[65jHi5Dm~Y Xjk cٲeZ`[u]ǎS͚5u7m۶UҥK 'NpPDuI+қoJ'JٳKݺI'+Wƍk_T[ � � � � � � � � � p ܍>K.M:t=aB� � � � � �iraJ҇Jw{S,Yujͺc_?U~})RDsBU _ )5i">,50#Μ9s0tvZlnAu!17]  #fW_}.\ ԴiSEDD?=D�ر^_\h,5~|T�/H.]/urj7|֭[+V:,@ooZ� � � � � � � � �V@�@�@�@�@�HJۥnݤxgK6dʔɛ�ș3gj[͓[}|?LڹS':{r)Euֲ!CxAgU   ;3z]w]mqw޾HNH6yRrSWjXFOoR*ҢEr!R)iaSN L2ڏ� � � � � � � � � Aq � � � � � gF?,(wnb01OB ߻n|,\;HӦQ0Ç*.Ek͛5l0ݻ sSA;1 @wھduwߎv,';60 �s̙3G U 9#M,5o.U([4HS'խݳ_Wrkk$ � � � � � � � � �M ȠR0 � � � � �CEO>e`CL^U Ș?\Ktyp@vR׮R^.gNcŋ{owu ٮ3fSNʙ3g -E�K}o�;Xa@�` X$Iҥ.k RRRrҀR_ ~WCA@�@�@�@�@�@�@�@�@�0 2w.]C�@�@�@�@�@�,�g_U} 7!cƌh޼>#1…f $p` K)0٣zHe˖ղe駟jݺu^[BT�*`� ca ;fݻ7TM@  wMRǎRɒҰarrBV!/8wޭSPҥfB � � � � � � � � � %B]� � � � � �$CwH_/XݧNV̔)S`XBz-nZj%)s!."nM#GԓO>ZÁ԰aCѭ9|}Iw} m27P.]ouTZl_3h+Rftay;ոqܹY)fwĺ?uT*UJfJ&ѣUB-]TsqoZhtŽqcjժڵkWzbo_{1tWO j+VgԵ8Ծҳca ;f/_;)Ҏɓ'u)IiGwQʕ&MM1c$O/,)TnwhӘCLFiurOzǽkTC qb@�@�@�@�@�@�@�@�@�T 0ݱt @�@�@�@�@�>1iX׷5"##6_y!L3fѣG>9V:{V\_~E:{f~wM&۷O .ի>}ZڵyuA槟~:o ƋEi޼yޜvGՋ/6mĉ:tMw҃J+>'1 زeKHP޽[͚5ӳ>Ο?_ 4Hv~)},hŊ:sML5cEB>%eg7oV՚5k-b_l~qP^m ;fX0C7o.;0 �I!`A&$eVx@*ZT.D[|N|NZX.)KbHk)[l< !)}} shgϞ+gΜA֭[Z% � � � � � � � � A^O � � � � � 7'HI ƻz 7P kxUPA{.+T^X\oӇ>ŧzJzr+^>`3gyըQC-Z⦅9sx3/?W]vjժ{NVިQ.*.v0=7/JP3<k\߾} {kkJw.cYza:*CJK2gά=zQFBr}ܵkWo@m\r.\Tj^b_U uJرSD*ٱH 4a?=!"`A'JMJ*ɝɝH;vH'լ" }=I&.Mo8ʢ>JBK=G Kva RJy8r7?rX@�@�@�@�@�@�@�@�HM{'_jR � � � � � 6lx@OƄ5=22R3f hAiܹP@/61\r%GUz!/ mʔ)*+1g˖T%1cƨH"jժUt={^=ڛ&z^.]+fO4IٳgWrת[!mLo�sQ߉g `$Xe˖-;RPXJ,i6WS0ӲeKM:U H\P8dȐbKUi N N {H}ɵNJc;1Ŏ-7nm5!� y YT&`Ah;ʝOKvR<C8A@@rF% *f=pz1Fg'`@T *ID@@PLegwv0;ϧ힎Ugo#<+=]<Dxȏv1gpxW~z]tET`_hّL � � � � � � � � �",@�@�@�@�@�@�\سG:<Bvڥ%K K ?իYp=:u;Lu]J/_~E{~?Yf|8plVv&O?zH>;o^siF u]' ҭ[7ԧ~귱{U;V/^H?zJӦMSrT~}~_~WVv*TY[V-[0zXֱ2گ6j>k֬QϞ=`cܸq=3pԩSu-hС:ꨣ-[LM\˖-}7k׮UʕS3Ƴ̝;Wg C W\R]vYft؊Xȭ.>װ{@nA&Mg}[L~h/_gyܮ )2F2S54Vg ʹkOuűym6K~w6>޳ڹ뮻TF }:JZȑ#}ηgmؾ}F!;xvJժU/O;zX}s'>btK�*R^z%-X@v6Rƍ}kx@cƌG}k3}0M2şZłQl_v.t)C~o}h׬}jذU^=_p>`0un}֠AYdx≺#Ca3[oo6 ovZ`LeJ]v]i:5Kf`>*]-Np 1P'S/_l,KJR @�Hփ_w :HrҔ@f̪iڴGgC=4{2b 3==.~TWO>d# )Q6$ؾt잷UV:aҞ =[bg+ۇ}wbb߃Xiݺu"@�@�@�@�@�@�@�@�@�/~=ʙg @�@�@�@�@�@ Qn-J^ y^=Xgy&p!S \ 9r$Yf~'|k+Wnݠy%\TX1pT ,^8pAtѣ}~藻08ڎB_ 2_7O?uѿ{ \CsA*G<*U,>=O>dPD ޭ[F TR Cܷ \sAۤI̅:e6…e.,.l0`7܅7DDx^͙3Ϗg5.,kdժU mt6/k9q cyoŬ{ T?cVZBG{(:7tSd̮Np:&KąDC9$8Ӄ.]xKh繀H\gΜއ/v`N߇tX9/lgp=a„`ǎ~^FO_0Vp]x+W]u)qA & \]l+V 4 ͛޽ױ�| ¾'NN..8r/wuh]d+.6m\QMSx>ꫯcۗ_|őZ_|3;?cX^ ɬI�dW>@ lJ?woYZ= >WwOg^3#{Y.JtP~!p!1@v^+$^}5uAq`!^)|nJ\Hl3JFVe=e6|lшTݷ|� � � � � � � � �$g9W9K� � � � � �9/`yz.(xBj֬都zu*D- իWghԨQpSO=5<xpd//B~aڏaNWV*0lwqGd>}i e+VXL '=a~?~|n.}Qv K[;0li 1 Ѵ�I'䷽#=P ۼysd~NN|9Z8uѢEq]#oa"ulp).i|a qW|dt9sGE]CaX5_W þ*sz~B6-0,Pb'pB8Y /KRJ'N跳p01 PF =c}bxΟpƝ;wǏ^A0t>f^ b)zu,Akf7n ɩs1 X`O —?O?Էk׮>v`mL|.bid״X>Yu< y׵͏|\0Y;^Z|)+ 똗c;W � 2rlg~-\~cr֬DmJ{3w\li,Ss/}gFG9]ƥ^TRŇ=g >dVW^Agޛo9Ra'P炭*g̞{u;2YܾuV\MXH B^ � � � � � � � � �\R@�@�@�@�@�@ n=WC7wΝracھ}\�XpG}grAeEINUVr_ڴ˗kӦMz뭷TbE͚5wraV~}; ʒ N9?5.Iwu{9 8ϳmvޭ^C ј1ct'˅w.zɅj\pn6K~^xAV'f˖-.d/2/'逸>9۲ Kw}ڵk̅ȅ/3?q}iڴi{P|y2P3-[6\5G%JHÆɝҵJ͛g}^{ӻNb]#~<`kąr!zu_|QB l/YF⽎}3^fjԨϪNZ'L2e|9HZh!Sۦ[njݺ\X\УׯoⷱW^ S#<_ ?;k.\l8vbQ9usb^mڴgy&ϻ@`Y?Ѵi:.TOׇ9~.Pn֢KˍsާuXe%zi&.,7U^֩S'zv\;Yj>3]�\ *U5h~윯%K\ fo{º{  ?MA GcK͚=c=_=Cܖw?]v?pBuO^d2.#.þ=zڶm+r? ύD<uWy#Ut?!(%gxQ2{{uhG ;v#HF߫@�@�@�@�@�@�@�@�@�"ׅ@�@�@�@�@�Ȧ?)n$?R͝01ܛY Oª:TӧO̙3h"B ǶbW{kZh1mB,x_e0~67o㵖~iǏãB3l4&,,;~\∽,<B,JK4rْ; UܳNһFlYfI5bsN{oaVq>ts,$|oJi5ufo6u ޗ+\Rgώ>%|_öڹѩS'2tY�3|@d8?ƴ]Z[~wY֮]w^ؖUV͇ZDkFdnqkӶ>~b͏^aÆoI/dekbxFocǺi} Ȯ@<}}vv䶀CrAy}4a4~ʏIHK{c}F֏z 3._~G iɒ%۷m۶]=YJǞ=V_u\(<[Y}f3=Jt _ۏ P@�@�@�@�@�@�@�@�@�d 2Qڃ� � � � � �+2Ԯ,عsJ,Sm[W^=2?n/Ӗ[jigB,T'w~ sPA С>EϰΝ; ]*ƍ5p@M8^-?SY$, O9۹~4m-^8zԲeTf͚k4rH]|=aÆee7Y^ב;7ސ93_ժU:\#bv9۵k;_][P%OXjf׈kc>g~=;9UXѿYp 1˗kҥڝ^k+<쳲>3Fgcgub;v숹[;:,/6(z)'>St׏5?z a9ַۘXcȮBAs\(܏ H\"",t1%3ƞ~-vw>jNwww?/v=Ιg#ߵD LȆ UdlHfٳp4 $͛7i[Yb?߭:"� � � � � � � � @ p@�@�@�@�@�B#r4xtyr޵k,g}jӧOt`]DoiԨʕ+^{M3gΌlfalٲȼXzRSO=ՅY4 WZYBf-Zjz] >̂ڴi7馛RL:U_}fΕa`f[K/+Iohg֪U"̙3LJYp[bat񖫯Z[nE5jԈwlwIWwѩS'Q<׈Q]zGωsЮ �nA>W|9ݻwzɉ8r?&ZhJ~,z 4Hn6]xᅑXaw^)S&<ܨgϞeA"- }XT^~eO>/ӧԩ:H~vz7}׷lٲ%U?s'7Ōڕn"u駟^z:C3:L\r+,;b\Ǖc �>2 8>wfͤ㎓֯{{ޖ?ˋZ1anFُ{セ]Ftzt6';s⻌+?/??۽I|~גA-yHb=[=leʕ+?g8[N]vGu+4 � � � � � � � � E@�@�@�@�@�%pR҈| 6R,`,+,jժ,DgܹsB#,_O,ɂĺw[o:y:ձcG6X:-xkÂu˖-խ[7bihiKb4+D,J׮]˗/7xÅfѣG/g4\F> x]{7ϫX9><rȇzHhA\+V]wݕ< ^^xAFBU|GY;/^#qG,46±-F쵝ߙ]# PM+aH蒕k$8zLs=:tQGiɒ%lnذ!RKkFلص| '@v~زG}ԇx2]`|[fd:t,g{-T1 XhB+ǎh׻$! ;ywSBk+CqA.ؕs^[~;/� &DB_~eo[om~,Z(L^VO{m=}<+׹3qH8 ^ڷۮxmc[n'/s%k<bf}PX[_b}-P@� dpNM][.`_EJ.(PG%rbviiOwOcO`<@w=Ȉ?�u{&CG.ڕ łoD'_z8s4l0߼xgyF٪Bnڴi1cF=Y=?y*j~ީlٲ@�@�@�@�@�@�@�@�@ +g6P@�@�@�@�@�@�Dx (R$>$j-pI \\PL` W \@H=r_|`ҤIAƍk � \Wy<HSq}Bj[D I&SO=9f8/ 6 3&pK?v駟hܹs~!p! ͽz \�aBvSN \8mW~zw~}3ɓ{٦M… cfv.3u~r+.3r{;tжm)kdǎ  \8^!5b5u{>kڤ/v~7o<p!~,?vA"z \ FHFqgUrfq[=V_bf׺u૯裏\pcpwI5/|UvYd}]C\*Uҵ^_l};wb?q ':t?'\J{_;V:u.7pzVOuA5 j \ip}o>j׮?C~a;vNĹ.#I0su^.&#fYuGvNG_ &u~_V.]y~ꩧfgرmѹh\Чwbł38#_3hI,>~Ʈ  `I>>pϺ.9G` ظ1jwuq?L{?"=] ft~~=G.`>2eoZF ^W_uaumh׮]`KF^<(^N=[پȞ٧G=P@�@�@�@�@�@�@�@�@�dph1gYgWsf@�@�@�@�@�ȮRVK>ݽ%\"Ч &k׮w}'b'.L.Jt>2yf-ZH5 l}۱T_[lQ "bM0.\M+V ^7YJƉT^]r6lXUͅRJrw3{ o&h& (O֭矗9'sͅ~cm7F{YMs{G3z 6}ݧ D/.֭P>yiӦMrrj?uArA?t:"O<D;V.F`Y=O}牭kuuҾ[b"Lw׹ Vǎueirr!Y;_Թvr?~҅Du8$@߾}g OҬ$>4z҆ ҩ}IݻVl]QɅgӻ6{ߙ,+epk.]Z\BS}''\,yς;^zՍ~6g|1W^ퟱҭ83@�@�@�@�@�@�@�@�@�$ 2IH� � � � � � ߻r4s\۟w .Uƍ]}<SKuEiȑ.d,:K˅jĵ +偀^uUd!Vv<8rrooa#-O>ppaiA&'zmwFAj>4 l?O:^<:@�, ǯʯgَ rFݹ{cg?cfMSs(s/׶m[g!HU � � � � � � � � @O@�@�@�@�@�@ E`(iDiԜ ܹS%J\xᅪR [f^|E,Y>qrCI7ܐ8*5W,:nI 69眣+B۷/<n>}t!d},$ ]B-2ۚ!Zhّ *&ΦCm-0c l]tqq-X�dO7oޜ ۭgF/H/$(Eɂ o4"� � � � � � � � � @N  \ɩQ> � � � � � E6m,.K~ qW^yy䑘cI\H_[ov5,Hsi̘1{vt…R3ڥ\veW`_~%%K=z7ey Y*Uc٣�ݻw]vꪫ4p7N5}}ϟ/ Դs{Î_^}YM>]vuܹ7#@ ʕ+5~%UK&iӤ̓J .\.;Zm&M(&Onݺ^�,gf?l� � � � � � � � �$�AP#@�@�@�@�@�Ȧ޽ґGJ[JQD6wf_|/_,6ƙ`eիVqƩN:٪g}ݻkԨQ\rկ__~xns۶@=bfٲe 2$Wt:餓r?{g|S>}tgOܯ\pO:{m(e!TX1%ظq{=;vjժ .֭[7{e3@ ~]N81X, s/@cnx9RٲYY!Y}Ś1cF!im=VR%;H-G^~ዤ1m۪q M@�@�@�@�@�@�@�@�@� 2g  � � � � �$JCJq P!pRػwo_އeY@Vh4jH_:t &'M,u)Zұ|0J,u 4i$+>Bz) A^�+dnl&La~׿"En; %p{iOA -F\ֹl :O $Hx{f?,= R@�@�@�@�@�@�@�@�@� @PG� � � � � �d*0wtҰa@fUWWL͛먣YY]dYݴqI\"928nܸ+$O,�裏֨Q/Ȃ,^{E?w}W6lȓ:q?V횵k׮a횶kۮqG, ?kF� /_^6ml@ {OKjT!C^|1pd6 � � � � � � � � � 0A&[AE@�@�@�@�@�@ {H/n-]{mvvEB ?~t'|{,5TRR cA}f ȅ KTxٳy-YDgvկ_?U\Y~ ~[[֏!@v-5iצ]v5k׮]s״]v۵NA�K\rڼys~&݊}԰Է[o<xTZ5 � � � � � � � � � @/� [O@�@�@�@�@�H 5F*V,yEKrODzgԨQ#oAZ>l~<N:6Xn%eP-ڵ<@7NW^y+0';0pKݶm>sM4#FЎ;ԴiSu@ڥU)2��@�IDAT,Y2NHV;wiӦ髯Z�qǎuq;TnTLde] Pʗ/M6P:5%xפeA.4q|@�@�@�@�@�@�@�@�@�@ n:+eOS{d? � � � � � @ImJ*pCz- 0@ڵo*UZy't*V1cƤ_X^#D&(T&o8 mٲEǏw!sZ` ./ի}䡇ܶ~k^ dIoօX3g^[dչsg?tEZt,ퟕ@�x饗tyiqxY@n^|1%�r,2+傏 h6$`!xs_SC8, � � � � � � � � PHvL@�@�@�@�@�HB 4H:0k4)ON=Tx׷o_uQ;IASϟɽX16m[nk\m۶�\J98wQG!O?ӧkƌ~׫hѢjذZjC!-EjҤ g@a`~Ash]S{UJԾ}{S_:t蠃>rn(˗_# HFI>+r'-uG0 � � � � � � � � � @> o�G�@�@�@�@�@� 4{7QȮM6Mgyt'|R; 0aBaCI\"(ꕺ'pvء'O> X0 veҥ9sW^qw�ŋ͛ˆMpH ^z $ի}ࣅ>.\PÏ?诉bFQFjݺ m~Ic@C@�ry͛7鐮ûJ#GJ,w)xtR*nL@�@�@�@�@�@�@�@�@�@ iLڷ!� � � � � ._I"zԢEr@<GiȐ!:5e=*Y> +V3͸"ϤΓfΔKԬYSmڴѸq$ׄp'Gf ,ܹs#{ァEi~<ЇBZ(^Æ `!6]^=Y$Dؽ{-[ŋ맟~cG ܸqrҥոqc5kLs(-`K*h͢> @ /_oӦMZjlU'VL wr*Z`#� � � � � � � � � �(ݍnwY)s^}5^#� � � � � �9'gԵwRb9o ׅ^û^{5խ[7={j͚5\reŖ-KeH'Cy ^a[… `am۶uI@j2i6Uj׮MT<rտ]|lXt?gmlJZe籕2ó0Ԃ6m;g< �Q>-믿V #mN#`=&uҥʝ'iV%䈀Bxs_H  � � � � � � � � @ 13@�@�@�@�@�HXfLLط@W,кuk~j׮ƌ^zEdatV,,A-+ԩSJK/EԻwoy睚7o7o 5hw\o/>2 ݳ%K4c m?JR| ]5kC5RMWVFC"d+=.9WZʟgvEOX@ر#bTul<j!-[}M9lv)R$> �)tXn$X`f秔�K I_?tB C@�@�@�@�@�@�@�@�@�@�4A% � � � � �$E7KCJ-Z$v]]h֬+]z>ꫯw߭%K0kAZ`da/K*)rI'i@ƍ#$jժnݺf\8\M<ُ-ςbV !T"l~tJZBYh%%ݫ 6|Xv֬Y0oAa`P;�Q{t ~ ;( �Y8e}-AYK-M |ying퓡u@�@�@�@�@�@�@�@�@�y sޔ="� � � � � @. XEIMJ_KaD -[Vcƌѱ+B|^z%YxY %Ec#3zA䃀?x*-`|6z1a!aիeAئ-4p֬Y=UH#g`V˗Wr=m8�hΝ;uVm޼92lڴ)ƍ}ȣ=FOk }CbŊPO <}>V^?U~T@ Os>C S|=>4r4id*ܹU � � � � � � � � � @ oD�@�@�@�@�@�PǥɓJ2F  .]VN:ZbE�KK/jז Дz˂,,@n +VL5jC<ǰH q<h0pʕ7o^䵝[l'0V ʔ)RJtґ!|]dIY}txiCtѢE}oC8c{cg6v)Nz׮]Ǵc}vرÏm:|m6h`Uk}lFm6lпC9ACllyP@�Gk&NIcOHO>)-xqYv"� � � � � � � � � �I'@dҽ4@�@�@�@�@�X\zi l#Jlƍkʔ):t :X+W… P;~Y:4O^z &SO͇qH�U!52kyftjcl^=041 NJY&01mXcBðGkAic <IE ~62u^ia_tnia>+Wh6/^[@=+SSGyG.Y.]R^l/B�@�@�@�@�@�@�@�@�@�rS e � � � � � c\"ը!zk!e%Jhӧ8 ;Vuggy_ɺe=\ԻUԱcG7 d} i,0 6aP_ҪUTR0UD�(pLd{2ƍsIFII]vC*Y2MY� � � � � � � � � � @ @�@�@�@�@�H^Ə~Z*]:!D% Gŋk:sukՅ\滼LԨtqRn5.b @۶)=;_@�X ׮]-,<M3GRV-_{zi,i |B ϙ@K@�@�@�@�@�@�@�@�@�@ -Y� � � � � �9"?!]~yJD씝 e˖Ո#4a͘1C͛7waO+{߅رRr [+Vl K @͚Rj̙T@ WN@z?UmN饗${֭O?K^^z≔y � � � � � � � � � � k!� � � � � @> \udrÇS8,/AK.Q=pL*:H#h*^xc\h8D ڴfJ R5@�-PF ;lKuJ睗5d*FQe@�@�@�@�@�@�@�@�@�@ L7!� � � � � PƎ^yE=Z*W0KD(Jx}Wڸq;0vmڱcGW=W4qb*W=.mْ� �A@`WN~+ %S , p9&oQ@�@�@�@�@�@�@�@�@�@�*@da}i7 � � � � � .ytR '$xeo^_{jٲ{BӠ4}C.fxm['�|hV7Oz̷*p`@�$Qvܩu%q+ v~]zAY3_- ) � � � � � � � � � @A S@�@�@�@�@�B&pMA>P!k8-ŊӐ!C4|uA't~߶i!H&H~++m߾?{c[Ȯ@6Ү]gwl� @l z+$_FBvm[=S'MJȗjqP@�@�@�@�@�@�@�@�@�@ Yhz� � � � � @ |4bRj[Oj@Fu/'꧟~R˖-uK8ݴiSF%C>H>]:tiΤn.C !68@5+!G@� @} VZU[߱C3F:}{/V{Lj*9I+@�@�@�@�@�@�@�@�@�@�(@dA|ר3 � � � � �I"wo%]tԣ4p`eB p',6|p5JM4O<={w۶>@2E:4  E_ X(+AYcu@�Tŋ+:rK#~J/dt ˦RzҧJ}']~T= � � � � � � � � � �@ş[uV9)@�@�@�@�@�@ @Rݺ3Hڥu睒 ~+5jkK#P0֭[aÆ@f͚_06M:8[77%sl�q \vYJqoŠ �ظq.]FaoÆ Zlܹsռya ؏,XȑR͚ЂMS@ V ?eyK9Ϧ9Dr]3@�@�@�@�@�@�@�@�@ L7 � � � � � PX~QjX*ZT*i@#nH(pBw_wyG={w߭::0 kה0R  F _\Z.H|E�Hz#)^{+]v?lٲڴi'CkצY�_"]~Է $}f߯eVnYG)2[ � � � � � � � � �y-� � � � � �ԩ)S{A)u.ծ-]sMׇ#"M6oI&i˖-ر8 ͟??/:p%,f۶|@Pi#ƕU(L#@�rM*oaٽ{vܙ*Җuܙ)>hTtR>ҼyKNd1Z~P%T@�@�@�@�@�@�@�@�(+BK@@�@�@�@�@�@ ?"mޜJu?G8&y+pQGĩzw`jJֲe"x4 0Ak[2B"pr]̙4@ 6ls9G%Jy%K[n1 ~ NNYVyD:Ś P,ѾO˨lIߐ@�@�@�@�@�@�@�@�@� 2?96 � � � � �XO]RAߗ6|Pڳ':B N>d͞=ۅG|4iK/Bo/M(}t ҦM.&GR>g]CA�@`b'ܹS;w,Z$ "թ#9)A_,-[uh;WqcM/^\4(r � � � � � � � � ��A@�@�@�@�@�(7Knel.]s4|xX@2 -ZTw,X#F>(T[˅`J J={J'ӻK[H<CM _MQ#@�&`!_UDUԩSe,H_`^zJ ~|5~YzEkc..% |Lky � � � � � � � � � @d" @�@�@�@�@�B&0m]d=H7{= sE@ą!/q7 2Sޭزg/H=zHwH6V/l �%0tPıtJ*Y tRÆR߾)o%-^,xTZz[1 =ٳo{#ws@�@�@�@�@�@�@�@�@�C x � � � � �J`Teݥ[ʕ_tWa&B m f͚3gNs=\ڵ+ui&Mɓ-[ݥ+v H ڶ-yDK@�Oy:U袊>ꨣ N{NvSG>Ӥ >H ,V,d H~5nݤi5A � � � � � � � � @AHO rS; � � � � �?v޷Ҩ4stq.gQ \R`ƌsu:5eʔtIfϞJ/?xmڴ)ufgIvӵhQ֔z!PpZS n9 @b r-9/^:#\ӥ-+3?֭ғOJmۦΛ'S@�w <}3@�@�@�@�@�@�@�@�@ qL � � � � � P(\Nl]O:I1#% 2z `ԿY{ァ׫[n>X_מ={"L#GHZɓեKZ* LԬ)M$U&NiΜPk@hX*UJSgj� Z)G{Ν;/~ґG@>D溌wRZҕWJ&}eHeޖ% @ZNFk`Qc*WN&@�@�@�@�@�@�@�@�@�I ~%R  � � � � �$^lg,�҆;|S*[eL!@}є)S矫KLׯ4iGyD+W?]vwޭCZpa;LйZ1qԢԽ{JlVj!P,ys \թ0 @ z뭲ϰ.]ZYM׎)uϖ[n[oI={J"tsI:.S @V*UzHj^iu@�@�@�@�@�@�@�@�@�C P � � � � �b/(8@zt�BBȖ@׮]]ZV{_j۶m۱^Z;vԗ_~cFIǧA{lt~Յ"l-[l)A�[u:U\0ba2Y~W.==Aʁ֬I ~\JvA3RR-NR%+Ʈ@{dVJM � � � � � � � � �+@d7 @�@�@�@�@� H ư\ ˜9S..)J3ƍkĈ]C @h ܲewi&K y _?䓥^HR; @VRO@�"p뭷 "E#,(V=-t+nws˿t9WOzac>}}d uNJ --~T� � � � � � � � � )?uv � � � � � M ۾}v]v| ±MT6Ck{ԋ.Ƿu+n6o[,YR\ _ dM`Μ9ZbE̍ڶ븯K=z.& yjUi�ikǎ\߅>.DZp~[Hg!l9 eˤ̫r@�dgI lW=W4}tc!EFy1|f v/tlٲq2e~pwIuG鮻JN="�Yg]k׮up<ܱ㡚<6>X_gMG+W*U5+c]@�@�@�@�@�@�@�@�@�(QXS?묔=jN � � � � � a?ltIL6i&m޼yۺukdЍm|?`NRUgnsn)@.-#,$BBʕ+q.٪B .*el2)I)pgD7kذaja}m֯cˬ ֧YfCt8k@]>‚Xc /~ma=m $`1׎%KN8b �OWZ+W~Ӻu|N[Xtc^}Kt8tA~`pچ5kVZ(7خ>}/PG.FK@�h ՝7o~-q7?.]cݮ^pC 7mdھc@իg#C ԢE կ_?. � � � � � � � � �+@dw@�@�@�@�@�B$`ek֬6 X~҈[>v0": D qhc  _tɒ%P%QtXb*^lvkߛJ;ݻϳ?J`ôiERdؾk׮Tcgqaaʆ�uLGzhѢ>!+U GуD_Tn][G 'x"mivlX`}Z: ~( ÀCpݯE%}MG\E]a_2Y=XacP0\ӖY+sr?Xbd_G*EO%9qYZzh@�0Xl >Zc8΢,3ߦàE{^ ӎXxe!CGMiϋvdFb>}:6m}ڵk#6X k׎-謁 =4{JYBSZH os �9pƌ.}f͚9sH .맬{FEK{(6{cXieuf2i6XjŞ;0nZڵSnԤIT � � � � � � � � @3@�@�@�@�@ I,H,(6^څ8Ӷnb<aha6׶܆0i}S'`4o! 7nL[X]t0M-3iiVZ55koc[frRu]*'vNA:p 'G;7?t0[gv]X 6P[GiN> C9ӎ>1 yb!iAUVcáFYWJ{<^@NGH=a �9/`sK.a?E.Ђm W^ Cm>ش}f[PtN{0,xfae8لgV7 Ukܸ'qfԼys?62wt1r?_dcI]b�U/B~&O/d/Y0!M6YE)U*[_0J a̙>#<H.ջwoN# � � � � � � � � @Z ӊ@�@�@�@�@X@֒%K|#pڂ",+Xs ñlh5uVFk׮c@m=mK?PvmթSu֍-s~bsBBo,Ƃ/^CVXCp,e Krj.Q ߬ lڂk wpTJ bAIC/ZȒ6vY],�+  >+J ,_H&9" @yk\a8uYcxognmРA?0n- ۾i6VV|0[ɒ=4|xwm o�`.[{ GlR9L#@a_Ǝ럟>խ[7hX{ӧJ ~PN>dW,Y� � � � � � � � � - F � � � � �A`׮]P v, KR|0_tpU¬('~zY +Wc , EsI!vׯ_ߏ5jps@-uimٰlٲH@Z8i`3 n =A6#(Tc7oZgêU#mݻ#,_ s-47e;)9+}v~ Ta) "EtQ^ 6bAJQAH{ɗfaws]ds~ɜIs ҥKʒ%KL�͹!ʕ3PXdI)UQo5Ο?/7o 6EC7=}>󦽘e;/I֬b_ӥ;Z<N<yܷct M9rL0W^]7o.-ZҥKe^… eƌ2}tsUt";wc@�@�@�@�@�@�@�@�@�^ HX@�@�@�@�@ 4TO6md-[L@ڕ+WL3f( B = solU4 <`H=f5}tJPӛcxc%\ٳG .^(;v udzgϺ>LC4/pˀ@( g:5TȽ{"5Ru,wBsݧQQQܐ̙b҈8q-*d+J@�pEQ֮]+z-!UTh͔믿dŊf?MX9J5vRNFzp[E ;l0Ou}ŊM@o~!uǶ?5j;V9" 4ݻK&M9D�@�@�@�@�@�@�@�@�"N Ȉۥ4@�@�@�@�L˲Lښ5kdݺu~z3ݸqp4:k֬&(XbfZhQ=FqiҰ ?5T͛7� .&\L.L˗//ٲe4lM`::հG A3G'V5( A:>qHkFF\}\dI d,u}$vTy"�V@ϟ/?̙3\gU VZ&Pjժ&۷[4_ <y S~wO:u܃@47n,v7My BGСCEtU|I)W\U55k ϶eK/$:u)SoÔ� � � � � � � � ��Aa> � � � � /^ |\|Zʌ\%Kf0J*eBt=eϞ=9hF@4$rÆ ׍z1L޼yMxTXQnv$ap=*W6^뾿4 u)RDSi@ hȊC:{ N: ts5DB 0kϫkgmJt"Ç)@iӦɌ3L~i{ͨ2e+4zʕ2w\3+yҲeK;x0T3gwߕ{> L?ԡA,cǎ5\oje@�@�@�@�@�@�@�@�@�ׂG � � � � �AЀ7.K.e˖H ̜9 prʙQÛŽb!-w^T˗/h ժUիKΜ9C=X_+VpjrJ.mk�[π�PM6:!֭[ch(dJL(EJ ђLmiN_ B�T`2~x4i͘14nXniڴza2e2k,c)PiF:vH(,@ _{5ګW/yu;al۶M#~ԨQC>s@�@�@�@�@�@�@�@�@�ׂG � � � � �p |\p,^X,Y"Ǐ7+W;CXHI,Y�j&< `H &QV׮]+YpaYV-S,Y2�آcǎKlO�y!rڇr-~ E# ;w΄C:\ҜMּ| HZnEzKi 2e1BΝku^ѱ~&MW-Udԩ&MDҹsgy衇$w![o*� ><2g֭dϞxt3Ozm3bu(<A�@�@�@�@�@�@�@�@�'@$ � � � � _^j;{l7o OӀ: YyRJ)U$OܯupٳgE V c=|ʕKj׮- 4FI:uߵk,X@4V5%ERlYZh?ԩS_.O@ |vas\ z=y̙[n]X§e״W/TČY@�,sNOM�SE&I&#z&Ks5z̘12zh9z4o\}Y뮻 �x;9'4_NպR~FkRxq0a-Z4H]@�@�@�@�@�@�@�@�@�v6� � � � �D̘1CfΜ)?;vկ__4@I s0P_~jXC̗7n,sԩSGRJ&M53g6@j8\٥FRV-V ~L>o6H) V}fܼydɒŜhxfacO>-,Y#�Xi8PNj՟~i�5o`C8og}f/_^^~eС?;GeYҧOk`+iҤ61۷ovډg8qb@�@�@�@�@�@�@�@�@ ) >mG�@�@�@�@�|(o>0aL2E~7ɚ54iD6mjԛ+W.n@ln:8k,.]:^/7kLҦMML 6m|rzծ]%#- l us5Z!o!5<Wp'K;Vd.|@�Xvk2}tܫW/ _FeEx i߾LRs4*.\0z`Сҵk׈o?x9yo  � � � � � � � � @R 2yڍ� � � � �@ԩSK| E*\iFZj%UT!�@0=>g7.]]wa$K,Ǜ�ݻwKժUy&ЭRJa<6a"gOΘ1L mۊCjn8 )bg[Pc�Oѣ+;av.>ػw 8PKk?\p�^\xќ/]TfΜ)իWb-F'HnݼYe@�@�@�@�@�@�@�@�@� 2v) B�@�@�@�@�/b 2d x@:v(*TE@fϞ-wIܹG\n喠)!ݱc 3fh[FL`[f$G )u@�#Ed&@ܹsҺukڵԫW/䕲eyMRA@ hz /^ᇢ S`ңGߖs�Аw?M(+84_��@�IDAThksv|[8!� � � � � � � � �a @d$� � � � �Ywߕ_~EZl)O>ԯ__'O*U �'N>͛7KΝ套^bŊ`7 o9sY֬Yi@[,Yn@@�r,\PF%&My~X2gyzu*UD>(8g @( :u&LW_}Uz-iҤ *S ϔ) L8"lӜА¾}`DR?|Wd)Wk � � � � � � � � 9|37r%-A�@�@�@�@�&0|no^ٱcL<Y6lH)'xBVZe'K{L2 1cƘ  ,_lڴI,X` ]EE8)R]w%#FK=dذaR@ӧ9r$\}dU !�AصkԨQC/^l~*ЬY3Yv,YRN6mZCP`ʕ&B Ktt<r%n@�@�@�@�@�@�@�@�@� 2vA�@�@�@�@�BIҡCiڴԩSGv)˗/I]BH@C�*͛7z+$jpB4XeB4#Zjeҥ&RKJ*/lB+w- "EZfڷҦMtDT2zhT5kDݪq,Xʓ@8fʔYF[Yh-ZT{=xfe^"7elY5k˖-*Ul]}QPvE+QFҸq z;uT޽mքBlkz(΋/YܵkW]|zvKLRF)[l>(X@�@�@�@�@�@�@�@�  #hg@�@�@�@�@f͒2eɓ'e&@-{DD_!!6CD >s̠j#dӦMbj;W^ 믿D??^>cрH l p yUVҩS'ٺu<쳒!C@W%{ڵK,Y"SLcǎZpxA?.\`Ǐq,oޖu-;ѐ) 7n dXXߛbDA.]jqB�"^@ϓ6lhgϞ-9r6쵓s OBNW^-V˗/tu%K&7?ХKc|+ߛ{KO?d 5(W!/^\V*)K…M̙3>-@�@�@�@�@�@�@�@�@�P 2uC�@�@�@�@�$0x`{_ /2/0w\c.jh⿵Ihܹ)(E/0%4p *$$>[l 6HO6͛77*s=42P޷o]Vz%ҥ N}*UL#>,Y2 fV1J?gkڴ\ҜoըQC P!GAl1]M:5Bt3NK<g}}U^2eJ_rz)O>tQ8mQ8IM࣏>f͚'^0?}"?cRn]2diwn~aԨQ>/@�@�@�@�@�@�@�@�@�Po0B�@�@�@�@�L>>}g}6jrtk&˲Wyo 5t>.><+2FEEI̙[,^vM4IڷooN5P߃N֪UKZh!s̑ {*?>\nEd{͙z3s_1ՙJx=J&2aѣAmA})@�,0}t1ch%k'O%慓[,YDp!gΜ/S+!-~Y`h�**:d~ٳ-c\e˖MZj%ƍsm � � � � � � � � @ OG^} � � � � @^Z^|EꫯiӦ!Rqeeذa'|"k׮5͛7>|X>#@L2I.]I&L"'NǏK…{ƍ^ݻͶ.]*3f {'۶mz/GO6M'O=qoPMg'|46}GDpyٻw$K|Yg&s!~mqF)[{ҠA6>%Kȹs|yq- $/TR}Q>hVqAǓ\/>\fϞm ʕ+! 6 i>O.^hRbEڵiסf͚&K#Gϙ3gʘ1cLh~e׮]ұcGs+ĉmݺ1s]gb˗ɓMrw.衇4|뭷>�!C~1bY6Yϼy^j>]yc˱cǤsfis}ccΝ2vX?F+CݚrSNpBټyTR;7}787-Zϙ�}ķ{D0mذ?6oٳk"cG� iFVw9^jyzTY:駟vvW?˞K(!9<x=ڄd߾}瞷K999ZGg:kDĠz@B{Ͳ "Z@ޖ?gСCͽ:m۶/B_mB!]ch޼{ɐ!?6A � � � � � � � � @h ؿ볡];ґ@�@�@�@�@ <P.nݺ![y;ﲛP Ͳon)RIJ mفEi;ʖ-uׯoA7ZjYYfj8p8ph͟?yv�<yrf.\`uͲC8,;ͬg+Zv0YO.]gn9(M9v3E{^v/jѣVr嬻˲CB[QQQeN<i~Emװ6l`!;<U>}Xu1}嗖zv;põL|'S-4u*Sվ}{4=f:Νk,YҴQPBreIvaᚮbفxhC|fCg+uԖ緭߲dq췍`O~ݺuVͱ45CVu;² rvF>+Wy޼WlbyG:vW_}ղ;]e'>;4jفf=㏻>;lPv\l+V̲,vwVf|s&}`A{3qoYzŹ/"�/`כs+;;mz7sSNYvhe]~-;dߵ5kx&~,;Hߜ *TȲ-;l<u7K99hJ9u\׈B@ϙ@x9&-гgOsFuIgދԾ\ǘBO=̜9s/^ܺ[,e|*ϹW�@�@�@�@�@�@�@�@�de&e!� � � � �Ș1!}<h~>\buںukGqU7Ν{'9rBᇃ r-߃;w|Mע͚5s=1cy7p۷|r3Yoq-Sre2a?VY}~=2p>\i q.0o<S7 NpK $[r 0 H �Lp9 >sxG dꄙhH3hxf8C|ǐj@:8Z5AA$?, s گrtm<6lhiHRJY{W~) tt֭[{BJO>mgyw{GC~36so+N.ƨ9=A:8� U]27. H M& I2tmѢE=zyx8!|s&/Xv߷)g@�9sL?"^Ow=N(=sɓ'y yyZ~'j?lO ޜG܃ 91u f@� h =ܓb=']gm~UV>[?ggPkL6- O@�@�@�@�@�@�@�@�@�Hi)@�@�@�@�@�ܹsbv_V-;KN:%SN(C3˜?^01:tTTIIiѢTXϟ_3~ɸqnXNte/Kttf>>?ljmرcn޼k3v8qBH!)om3ԪUK2d vAUWn6)^w.;Rt_zw-st{ Gup *f-[VΝk1{vMV*ȑ#K.fw/_QFK/$G6ǃ>Zs=qW_8^�>~l=ViӥKgo>)]w!3?5k= CZ@W_ h9sfҥKQ'JF<珯9;(¼'Ȗ-)^g;(UYf5 ,h[ڮ@ jn`o;XȼGo3xyS^|Ӹ�g]ϙk:V`M~}#/A<F�BB@upΗY)zW%⻞uhukM<I$yz|׮wgݸ =OS{{N/O׈ZN=V6Pd;DDhK}>o[}&Oq zx~J<~Q{[zϰM6d2eN?� � � � � � � � �$I@�@�@�@�@ ~2ۭY&?"E W-6olW-[fƕ+W֭[E_/So^v*;w-[J&MLxhUz뭢!Ŋ3_~{~yrwM\<w_f&=~lBC u9mUV5OO9z t^שgi&nذ쟞={cou@mygݸ!34 v͚5˄hb9ŜƵ_}s{zנz\EX6vM^*_~۷OVZ%N;WV^-[\0Lݾ//]*~{3gNywv&dɒme|}7˸ A\}ӷs>gAXu=~L?k܏Co3f}{̹<G�{ x=]s9zݩAܯܷ~^4y͙jUsʸ<msjOSygϞQP>`UomzsIˊO4?Poa_l)Sȴȉݻixދtޮr � � � � � � � � @8 {:#� � � � �~ܹ :T*6}fy &9={V<(/_6|ǏnMfϞ-ڵxϯ\"ժU3k Nҥ̛7uC/&Md'}Q[:ǓĶGt/q a(_H._\.\p2OthМvs lnԛccfjȣ~Y/~[/Z~{%+Wv[ƇqW_8޸Ep̿Xkk<3ƄpkTnN$**ʄ7}szHի'~|53\>M_Nߨ]xѬW2qTᆗ7>gD±a*Ѷm[:@O ;�U0@o!�#-C s Jy9b sJ84y͙j(~3,V||rӛ=v_7Џ5\F4C " [li۴!7@S# zN:!CSW_}Ů]dҥ7[xwB3  � � � � � � � � L;&"� � � � � ˄=Sޮ)RD2f('N4N4XBݺuHeRbEYp?qN5G3gN87l0\):aMΜ9c ._ix.qĶ\rQFӧbI>}Lh"`ٲe&aÆ-[6믿q)wަ-΂1͠lN9yݓi|&MHd&|uOz)~uڗ׏9bB N} -OZh!-[cǎc!UHtU/ uy:)Rcǚ๗^zI4}cν/tsMsoO2ń@:}Syy',/k|(23xu,�5ܧ~:/f;'˝;^鵚3_:|5t^i^lۛ?yYf-|-;͞S{*#P b~3A V*۷o}2Ο?oܹ7j<! Q<A�@�@�@�@�@�@�@�@�$@d, � � � � 3gSMhJu=|~)= KS&VZRN4;k䡃˔)#QQQN1N[& :! 5j0ɓLg͚e74 0`I&+bYt|w4B%kY~8_p3gJvL~ 7 <Ò/_>Yf۷ ԩn OD-7nW_}|1_6y fdKLdɦmC~Z >a1MwmLɞ={<zs y:L<yrV7pY{cǎNا~P�ݻW=9R4;[{s.?נZN8*[o:x ^}6mTZGx^ѐNt{z7-mڴUV|u<xм'v99{'5Q织Ixje}j}_0~xӷkb x,̛>Λe⩊�>g9|C=dރ�VM,(v"vuy�$9 ޴ih^ \z7s2='|L5xVs 32ܯy~i. z-1BJ,)zsJo<sjOSY;cӦMP.IJ@%=,{NRޯtٳgC+zO@�@�@�@�@�@�@�@�H!}6kgY:2 � � � � �_e(P[e?Dcp,CVT,UX1뫯rR yð 3ء�anڲC-;<ZxklٲŲC#-;Xzg,K֋/haf .X˗7۶C,;@̲5\r:7lZ|U`A+]tրzcƌ:vݔʕ3ea_|aU\٪]eۺ|@GJ*f;jm晊ar-VŊM{-jA.={/rriaeq-Zd4n m5o<>ZVLSB۫RXyv1۵JLSHam:t U߿UpaSѣ-;yjveժU-[~u;-[?ls>Cpgޟ\OMZs|q)ퟴ#K,{CDaΈ뽢{Z˶k^xZnuCb͛7[ 4pMeݖi_C%,']t1w|zhµ^f~5}mf 8裏swUm?M 7WVٲe *X^ !wn>P@ xeY+n|dvȸu=ΉAAouI];y:/4O7[z~Wz7o^ t땘sӧO{Χau:ѽ<_>>u9^9geٔ@RHzȹ 9|C(=0wB0(ޱ+Wϋ~ES � � � � � � � � ɴfp}׊0'Q � � � � @db~(~X#6m<֭[b!Ο?/v؁bJ9\y|;K/a޽{;Uu;LCk.]ӧOo2Zȑ#flٲ]v)vH؁2ĶGpKݢuC+YM6l;hBɐ!u gL]N$mfڣ~LBo7ۋf]]F~|>oL0W^2qDׯK ؼk;Pu&s疷zK Bk@Yj{P8iC\Ib\_fFby_L`>gb=>dz[7Ny_I 5jDG|IԈz �x;JnU޲7dz>n׋/)v9'u=x׼ys9shVg[^s H9qℹfu/We&^%KĖ E.>/Qb9yB )'hXzb`j$z#ޢ(�@�@�@�@�@�@�@�@� eOQO@�@�@�@�@ H'O^xG:vh%ToСCҴix@;m{iӦYM <?~H[mG/l}"ժU>L+jj;#TTIz!*35 jj~.ȷ>ѣGsWzjyfa U!�IK@C;ud nj#j.{: <x t ҥKPPv-[6?@c  {'|RG&֮]Z߷CujQڷR~}g6S@�@�@�@�@�@�@�@�@ RF| i  � � � � @ڴi#͚53n/sI.]$K,*;V6+Vr. *YdUI.]H](lkƍ2d>|*UJL" 6 8,?d˖M}QܹΝ;$Ε&i\ .aÆɼym۶H 7Ⱥu ^@�H27N^}UiٲoHԩC۶m3u<wk.h׉G5ػw A<8v Ӡ|P#O<DH3f#<b|"W\!]_*@8 2sLs/AC %K͹{h?n $<@�@�@�@�@�@�@�@�dd=w |U" � � � � �ٳgeĈȁC&f͚TM�~~`ԩ&qҨQ#ѣ4h[M|3~x:t,_\7n,۷7>�Jʕ+pB8qL\4IMO>_!m@� 0ډzNYzmW>pz3F._,Ѯ3gHڵeŊYÚP u8|SF%oVXf f/z߀¬QSNIݺuE56C Qqj� � � � � � � � �H HAR  � � � � ^*s̑/R{ɗ/tQڴi#*UJJ$!_ȟ={L4Ʉ@K΄jK%`͚5&fرrAiذhB5kf}®AT.!sΕӧw}'O{G:u$M4)SVD\I۵XHޜ?vpn =qℸ6~e̘1;m3mڴc( cz6dsʕK>sSN(Q"^`ȑCɠA_}M6o&   � � � � � � � � An � � � � @ >|X&L Ǐŋ/l|VZ:um5G 9rD~G9s5HFC:t`BRJ:& jM6Mm&+VƍK F  @L?4TV5(wvhbUVfLKEVپ]󺄔: @ #K&7 8 >\z-9y[{9s NO?5W^yE  ɒ%uܼ(^7m/:lٲ7_k � � � � � � � � � @dD� � � � �={L/ .iJMNK,*U Cŋᅴ/kR; ,k֬&U]4i"ӧVd=]n̚5K~'_MNSԬYSU&2dFJիvZ_8|9t萔)S [n]}DnMvyB @φcʛoi:v(>T\9Iz _|!:wYygG={N  (oF}Qiذ3F2gΜ˖-֭[{LӧOŋ'eڎ� � � � � � � � �I\ $~�|@�@�@�@�@_'Nٳg@5޽[cB4PVZ&<)Yd"@Ν?jxb9~ҨQ#P3 AL"EDK ,0+Lc+U$իWUJ*UhѢ@H ~RG =~*TȜh@l D;11†+WDҤnCkA� 'O˒%Kyc=&۷3aIeL6L&MdBu&O=d˖-J[{5PC GeoT�ݐ!CgϞ $***5`S � � � � � � � � @ z!� � � � �)qF7o V[h8p@f*ժU3ajNZ#4 ` lݺՄ9f+W˗/@V 4[ԫWSNofF SǓ'O/ ό6E)RD ŽH,pQѰWu|r>Sp˗/oBq5�VC﹐/ /a 9 ?o֜j`XǎaÆ*U*?oI`ڵ2n8;vܹSmJԩé)$%o>yGdΜ9 ҿI.]2HHclb4LO>һw$# c@�@�@�@�@�@�@�@�\ #w2@�@�@�@�@ 6m$/ TqÆ rU)\+LM4T-W\!*@( H`iǎKʕEtY& yn:?eٲef\z\pA2g,e˖rʙ9s e@� S?֬Y#~թ{1a]}!CU8[s >b%4 'N'7|#CzآE `F6U,˄MO:Ut{ N:Ƀ>(ŋOhѬ�A6ltS0`tЁpРAJ%dĈRbEK2 @�@�@�@�@�@�@�@�HA&N@�@�@�@�@�/;aj˗/7wa3gNWVdIɔ)Sȵ !H]afhgϞԩSA@3}L2ULRۺt_jG5j[ti)U|o ݼy }>Rtܾ}\rEҤI#eʔ *F #w¦6mDR0!lLE@�ؽ{L<ٌ[4mT7nL�`WyɬY~+X?h۶m+4yV`߾}ҷo_W[oe~öA>shHfd?<S*U*n@�@�@�@�@�@�@�@�@� 2!-@�@�@�@�@�"V@4LmծP5 t/iNZ%LFbU#"i6… m6jeWirhȣ{j$C4E:ҩ4FiJѢE]}X"Epf̟?f1 u2:j�':S=W}u O^Pnŋox �8x 9s̙3GN<)yKzVZ0` ?~\, .4+W4hUVf͚I͏\l ?ѫW/Dw.:tH!CH{N^}Uɒ%)@�@�@�@�@�@�@�@� @�@�@�@�@ I \zUvq]ƍMh.]:愩9S V+Ph0$!NTCv%z'OS @utA 'pwmڴIt�[c̙3A)S t/n-IKަ7#`Y>|XƝ;wӧM SՀG#ph}$Of6Ͳx\@_/_K@y!wyTVM4@o7׸&L@W^Ē%K̾Et^խ[W6lh>B�{O&L 9sGyD|AsV =+9rL8Q2g,<<Ӓ#G,@�@�@�@�@�@�@�@�@�%@dߴ@�@�@�@�h4@o۶mf`SN'KLn4(*o޼QCt9|!p%ٷoٳnjw!ĉMXxqqƌ3Ad hއiǒ!wrr_N_s6AB:͒%KdѺЀƽ{Gy3rͨ:_S|+0vH׮bω|[6!�x> _DC5`ѣ,m *Hr${ bt߬_^V^-b 믿}J*IեFRvm}(+GA![lië5VB ~o5?æiӦ}E^A�@�@�@�@�@�@�@�@�p  � � � � @$ :tH4RCԜ05g_>}S Q1O<&LMԜQ4xM74!i ?^:xhhlc 5-2H0f7ehV1sl!C Jr YоKE8өX>|X^*3}s/Ü1gΜ:FEE7gΜ#G?s]3g63:uk_ XPn]?m� edfǏlٲ&$R"K,i!a'O5߸q7l ֭3\.]r~RreX-D^ϙ3GF!ӧOgϚEҬY3"N L[f̘a~D~;D(Q"w'mC�@�@�@�@�@�@�@�@�"@_X)@�@�@�@�@ N8q]i{Y%O܄Aj9rpYxa %pee:=zԄic'L>Mjh޼y]f<M41e: sΝD}B:YlӨZ,YLxo/2:L;v̌N>~QF1OQ}Hch/v,&jHYGj�$U ^zׯ_/V9.RR&ELRP!<g%kR5sc5qǎG#4�Rota ׀M ~mJ,@fDΝkB5R"^ԪUKj֬iB"3et3uY7tR_̨az_4::Z@J*� � � � � � � � �D�Ai � � � � \"AN rs@( jXC:uF}1cF/Oq D z��@�IDAT>\xQΞ=+OvN2u6pFir1;'Ol:u2 zk3j=�y|…Bgim\S˜̙jߦ>O.n`vͰ,K4LDC5?tϝ0TC G 9ho1@>1Tɤ0/\>=[apmF�uDwoZitN=Մjء^8CԩM̜;wnҬ~;uP4̹T ֩:aS> /P ̢EJbXH/tz!wg[΄+.ZLkBz5Wgu Z}}{p%W8mdڵaOz\rRvmXSL@�@�@�@�@�@�@�@�@  =D@�@�@�@�@�V@LQh~Zc'|+f@>׀ kH& PHg0 gkRaak)S41k[l~yӨb:uFCcNu[CtsG 8өZm(u!17p3? v3 >M1 ԩ 3|Pk8jנ} L_s7sFss5"N{9ii~/QBru7~A18N�Luq_ .ҩSd!�.fH"s{;9 zNg;$rǀD KD=׈9hP^ysף:O˜ئ1ɹntΗ> vz霋jynWC,K Lإ~5Ȍ=w9#@0v%VrW۷Q^}:j(z~XsS/>=Jgо_?{kzXT)P ԩzmȀ� � � � � � � � �  J � � � � �$Z@9S OsBݧn 91uZp8l81Ds ?Ⅎ9!mSҺ`˘S qΜ,oMNM)Z|]�>оD1לPs<eܟ;}߹?w7<Ny1NTn[a$OOØ1;}1C-Naj<֩N8 $T o^ݯ -@�'pH߾"ÆDG ,RV⶧AΏhТc vthsiLz.~}Ls}MosΣ9uJ`YF�U ݱcoګ}9TlFZؙj >R#[oU ,( 2ƀ� � � � � � � � � X @�@�@�@�@� h;I^zT}xCdHoj5,"<cG[䥗Y˦(@ٲ"mڈ6DL35j$2hPf @ &QYEICC7THC 'L ڵ5f � � � � � � � � � � '^@�@�@�@�@�[ٳfZj zxF ;Dbg5h z#["ʉc+@ 2f9}:DcU W.c}@�,`Y"cƈ(q-W/MDx <B @�@�@�@�@�@�@�@�@�@�y C~QA@�@�@�@�@�+|r|r UIBd9N-+"6//ҴȽG�b 3gbW$[n9r$ZD[@�WD:wiHd>}Dҥ 6Qs@�@�@�@�@�@�@�@�@�@��AI � � � � �?$W\R@TC*VѠP4I䧟D֭)UJd@CB]@ӧCd.roʢ@� l.ҮHZ"Y\)W"ޚX @�@�@�@�@�@�@�@�@�@�BG @�@�@�@�@�XdTV-uQ# 4j$fH"+'2{*S@ n [W#I HڛMq=د]+2cȜ9"ˇ[K/ � � � � � � � � � �&@dl2G�@�@�@�@�@ ,]TV׬)jU膥N-k"6)#ҸH۶"w'ɬ�ID Sے. 2l "~*RȈ"_ o "@�@�@�@�@�@�@�@�@�@�4 #m@�@�@�@�@�!p ;qTP!Ԩ!rȒ% ." +/2e?^-RȠA"/dlP C pQ hc"W&�VC�)3DʕC䡇DnM$eʛ*@�@�@�@�@�@�@�@�@�@�@ L E5@�@�@�@�@�fJ.#R ."+6i"f+'R? l D cF dWQMh@?(@ VUD4iBlY D}W$KXW@�@�@�@�@�@�@�@�@�@�� #`'@�@�@�@�@�|%A2d $5D~5QEt4iDRHÆ"'gO@@  D|*-۵i� ?D}T$:ZԩkO'.  � � � � � � � � � �$ ^ � � � � �x)n:)e'!&K5</VȒ%"Wx~=Tjԩ"fX!R;\5^ H Ͷ-u'N&l,sD|SX19sDFva  � � � � � � � � � � tL:"� � � � � t.brȪU-7m*bgbJ^".RȼyYWj� 2pl)Y\A�"C>/~-lWE6m~#@�@�@�@�@�@�@�@�@�@� {+D�@�@�@�@�@ 6n(JJt;˔ɚUdDҤٻ(o ޕ*{/JUDE"(],(RĊzAA?(^ қ"M^, BM KHHa7lyΜ9gf7gML d RVK۶]!1\` <~\{RA*tF @:;WjPS 'gO'!� � � � � � � � � � @A&H@�@�@�@�@�2ɓ'}v.]O<,L2i޼n7P4y4exT4xy�@ ,JDD+?H3Kv8ϒsC�+iԬ 5o~=eˤ> n� � � � � � � � � � �/@d_#F� � � � � @ܹ 7Tɒ%_Ӧi*$iV7i@駥ڵ3Cbh RI Tȗ Ȑ ҔKUlЂza9UF: � � � � � � � � � � �A 24� � � � � @ZغunR2&MmۤHs!HҳB^ztR!1<�AA>h 2D.@�4#k|yi*Pzխ[^}I9� � � � � � � � � � �#@d8  � � � � �!/`Aaaa*QD@ڰ54~@ F,ZZH\Yz-)**`@  Ȉ�7Ls!zq=Ԩ!=ԳgQYDx #G/B�@�@�@�@�@�@�@�@�@�@� +@w@�@�@�@�@�BF )7z(ٳKuJmիAڵٳCt [ W&;oJH#yp,D�.ҕWJ7(ժ%Y#=O?< Z_|"� � � � � � � � � � @( W!� � � � � wvAiSi@zmYK&)#l)u"w荕! X( c,=_gR&}tRzґ#1=IӦ}>@#Gd|  � � � � � � � � � � �A @�@�@�@�@�(p!ɓ'nAVIِl\9iTi$ire.B�)e +x)4)`Aɡ3h@ h RŊҌ…KӧOW߾}/[o h@�@�@�@�@�@�@�@�@�@�Ҿ�Air � � � � �D K6˝;w@5ba(N#oVzHz n]iΜ~֜G8;)A@_kF <X4HZVI ֯_:e � � � � � � � � � � � 8B�@�@�@�@�@ # :tHy ))"U$͟fC9_VJZuv3@HDr LF ts)98Oٳ;ڵ6n }Ϟ=}y۩bŊ1by � � � � � � � � � � WsD�@�@�@�@�@ ^Y &My0tX|yo΍ |])::,@ 2\hN Xc` �W`曥-% _\:T*ZITT:t蠣GjK<]5@�@�@�@�@�@�@�@�@�@�@, "a � � � � �Sȑ#aO.MJKn8 5g1WK>(=Tn LC"�A1 d&?NOB�!oԿTdaӦI~+U~A=-ZZ]t؂� � � � � � � � � � �#@d<(lB�@�@�@�@�@ # +***ޤtdINS )jtRfRΝi4,^  d(� 3d@wߕʗƌoi k2d>Luԉ[@�@�@�@�@�@�@�@�@�@�@�xM � � � � �dD,Y%bEHiz9W }4a4sT(:lA� ÇCo\` UD�P<YVMz1{ 2go9JlE�@�@�@�@�@�@�@�@�@�@� 26#� � � � � nD7/(MFoEZV[8PWOZ ͞G XdDD9]N4 o�N "ttM7׭^{Mʛ7aDn߮'x"A�@�@�@�@�@�@�@�@�@�@� 26#� � � � � dɢ(wSӦM` kJ;W^;6du-*Uo߾oK/>|69W^~U*ZT8= Rlv׮]6lڵk'U?uꔮJm6x2  ȭ[jС3ꫯ&0lї_~`ʅ B/mwHKǏK JcJeʜ{Wʕט/묽ӦM;*,^X rW-[{vL*?zV=ժU+OK,m3cΨ@�@�@�@�@�@�@�@�@�@�,@di@�@�@�@�@�"5kV/�K@ݻZfMOl܃4LA_w|\?SL{H/ZHf͊{Q9rĽkѢEpW*U^?^>]/0Fkpb!73gԩSua zI\R˗/SHMܹk߽Ki@nR,&O:uC_ru2@x z6[>T4{vL7n)GFF}:q&M̗waÆ3{@]v=/{l+gDŽMN?ЅuvQ&LP̙լY3}7Vݕ� � � � � � � � � � @j Z� � � � � @ .\ kRD ZxqGb֯WOʑC^Y-[TժU5tи$齵s1> Hnj7IKa[o֮W_j@Z00 UlժUl�]%/w)h)XXLLjz\`A֭[Wݻww]}bs }饗<m3錑A�O? |mgb޷ݖ>3g&NbŊy̗S`p;v쐅5֪UK?.p߳cB}:y|jӦϯ;u17 : � � � � � � � � � ��g � � � � �8.Ha%gΜ*ZJ*d 57/fw{qK}ٲelp\^~U^XԤt]B:Q<=䓚9sN:7Xatp]͛£9 3F 7|iZ(RHLH-8�uYnAڸQz1)[~IլY3@˱IZ7nۧ{'X[8B/Ŋ>ځolyaթS'Ͱ05lP;wԘ1cvcb+� � � � � � � � � � @* b_t� � � � � �!,iô`%K&8=iSi„[}wM? Uyc+,Yī?AԵ뮻NÆ ӺuԳgO1V|m/>5Jٳgwa.o HT9ݯV,M./  M(fzAq)vѢE=z֮]4Zvm1 |]^]{a;[ou5:ؾ]^R,_\yQ=d[r>\ UV^zZzSvmqzGu w<Ú%19r :u>s}_7eʔ][cҤIn�u뺾"is^n]uU;vLwQ=ӧO/^<mK?xvZ"zj  SK~@ ˛I'˛Ƅ+ 9̓;D˱^ \~oƽ֨Qý~TVͭN.\Zzݻ{fyg 6mA3D-[m?WW@�@�@�@�@�@�@�@�@�@�RS `j@�@�@�@�@�@ 5,ȑ#:t]vʟ?]'?M r= #1b"##N W_}U <| ŋzذaø]/>f̘f͚gq}[mOtv,;v2'}ԯ觟~-ZE d�o]xm6o[-v�/B3-΂ʖ-[tepI ܱc Դkj^.т,モ,\m:w7nt!v|˖-g>/ SNީS+]tB23iڴi=.{QoQF.WW" PRw^k֬Q֭]w^d>+l3FldV־.]>F?}A-8O[[,d Xdtt2: ޯa+/YڴISQ:WdBe 7y5\|9�}pk/>bŊoh6oY~=]?Zپ}{?m � � � � � � � � � �,@d* � � � � �* c<Sjb|RX�=[N<%|gn@ZhFW^yE'OԼy> ܹsLq~+ҵi<xP6oެ)SڍM7ސV)/t1&ruKǮ]G \|ռys}O](b<yk-$ѿXxݪU4tPi0~srB[5]mGs` իmٳkK/~^Z?nY88)RDWn]BbΝpɂzl,V/_dT/B"I} M>N5m8W{1pY ={>kwC p|`/YDo ޭ\3F{q=#._d,nRjR ˕rU4n{6Khla`nsI&7k֬p~98޷\ar{1 ڞ:u ,+3J4o^?m � � � � � � � � � �,@d* � � � � �*P\974 F�OAѰaCթSDž ?J*\ri?mH(^;BgϮ%K% ]*UH?(#/DTIY!]Zs15nq_{W_}݂ +ս)SZu+[n4N8Q&Lpx' i~o&׎ճ,14fᎾbDEEuZX 7ܠ|([lRtib!1iرc]ѣG+::Z7|s-8x3  XScvVo۶z?Oڽ+͚5sg6lp!~J(+Ⱦ>ݿHuȑD-� @:𦤲Dž'7_^踼f'|9Kz+^zi;:n̗~͚5;CWl_ފ͓+W]u|2q׫WO}վ}\ۜ駟vUkժ#� � � � � � � � � � pA/Ht� � � � � �!'`ab7K0`@Pפ4o^M{.@pƍ*_|,0|J>|)%~0>}åߗ kfjwZM6uׯm Jxxb߱rw\k 4e8= mO>D1B:uҰa\J׮]n:͛W˹`IؿKW@gcV,BRKm}v5j3fhڳg|Co.{M ΍i �d,%KCs%'[p_s0/[/B};>W񩜽7oM{me�%e-,r.dZvϳ^Ii: � � � � � � � � � �C S0M@�@�@�@�@�Hj XҥұcgޥKYG}t�mI>4D+IKz ;"Ep(Qm/VXAI ̙ӽPȑ#ڹsgg\@]_]/wիW{8XٲeS:G6Vx ;wգGgclٲ%&#pNuu&MtVȾK-�j֭ʾϝ/Dr^umH=znD H � _|Oj@.ƌI~ĝ/[rp*U- ҿl۶ͽVdmVo|Mҽi& -v� � � � � � � � � � @ ,"� � � � � ʖ-ྔZ&҉?݂@ZP'|*FA9ZU9S=Z2ETI^t5j̙3Fo_~q/rj!eI:I,ʕs_|-[{Io�wrתL2׿oY{;GE&V,VѢEkIYP_ڵ r,X{W$5ktlQF)"""ٳSO)k֬]|9ru*X,?Jb}no߮޽{c  �iYagcsJIKӦMA_{5˗ϵ|9Et:~u-dTR.{cϋ ?fƍyxzgw� � � � � � � � � �  9 � � � � �%P~} Kb6o۾޽[&LЎ;\?k.͛cH+;KI=zH< /4łcΦm۶ꪫdW_Ş.\X>f(Nr!#Fի]9_ٺ5٫=C.@Ez\cfd 4p:SLիkÂ}jԴiS͛W:uuzA49K7vVxv<y}uWkСݻ:{ho* ,\V\N5O?믿ޅ>) 6!Cرcn}]VO< (ٻ뮻4k,K/Zg%Ks>ﳳgͬ#� MQUҚ5R?drխ[7|95jn삭J3r:FFFbŊ.(YކE]vjذ:Wm � � � � � � � � � �\\:⋘5&A�@�@�@�@�@� XرcUreծ];&櫯զMԷ5guEV~ k}v>|XҧOYHƍUhQթS6,po31{lhfnW\qǿ~ZZϖMcy)3H-]~d!t6lؠkҥ6m Q<L8QSNUrTtiOP;ӷo_ڳŁkeatf?M6zו9sf7߸͛9snݺgV}>c;-d`馛bڵF 6lƌ `ZluŊ,O>Q͚5cf]^_~9Fo5Wv-5g,d[Jr͔)SFr멧rj!]v=ힵ\lyp^>7pcLYH,Y2)@^_d <N*0c3 Ȯ]֭ucÇwJ_2_|ms=xygɓ'RWh <X'Np%_l^|EY>_u@�@�@�@�@�@�@�@�@�@�.@?t (:vi) � � � � � ,H"^-.,P믪^^Z0zM i"#^(/mVZB-43n{ SL.1GDDF p±EEE|nKh*l۶M^z;6mlQHĉ_{ߑ7jܸ1˅+V,ަ\f:G-6n [ #G{S %`!� Rk�E`:GW:yR*?;]Kd ߱c ̗mm׿κv v}V 6_wd`ȑneLOA�@�@�@�@�@�@�@�@�@�@  ū˜@�@�@�@�@�;wn?A嗷…k^=(]ШҳJ'ի'~̫_V@ 'Nta|;OƑTE #F #=1o%/1xgw``I+2X}. � � � � � � � � � �*Wq!� � � � � p*V+VM6ʓ'O{ժUD*-]aa?G*Wη5t_?g *L`d W^)-]*կ/n6Y&pplzϞ=3Ys)vߝ7a)m&dς}&( �\'b_|Qʖ-&;L7#FB zQn9)Sh֭!1cƄx � � � � � � � � � @?8) � � � � �IBW? ilBE4AiF'PfM曪V~}ڳKU ^MlN #PD A/29E�@ &țJO=%=q=5r۶mZx:tڵkh/i @�@�@�@�@�@�@�@�@�@�;n t2~|Z@�@�@�@�@�ה)SaÆtȑAiF<xPyEEE{14>@S'AE�Wڷ컌@z @UAz@ "  ͛'u,TTJ[P xY&@�@�@�@�@�@�@�@�@�@�.)p � � � � � p@nݴqF-ZҤe}{�Dͫ~Zq/sƎDݻ?'w~}m  -ED@� �#_ء cgI=1X@�@�@�@�@�@�@�@�@�@�H;AkH@�@�@�@�@�H5uz㏃gRAiFȓ'x iSЪUeu5jܸT1A< 4f,a(@�@ %MEU`4~4wԠAJZ@�@�@�@�@�@�@�@�@�@�@ m 6F�@�@�@�@�@ {رcwހe!jjIiL@\裏j˖-zlgDŋ]wPӦIh*dP+  �$]IipBC5k[oMzD�@�@�@�@�@�@�@�@�@�@�ҋ�AJr � � � � �X{ʚ5,lp4MIș3~am޼Yv^@d_ի]}H'1!@SE�R:}?n( (y#  � � � � � � � � � � Ls#� � � � � :rRϞ={)222ZRDDd ȑCӦM[o*SR/A/FNJfTG  x_|w˩!�N`Z];uktiiJiPAK � � � � � � � � � � @Z 2-^5ƌ� � � � � @* 0@;vШQc&RthQ dϞ]>6oޤm._W^wq4C+VaC Md: @v7jԐnO_r�wDs � � � � � � � � � � @ 2^8� � � -��@�IDAT� � @j*UJ=zk6z,ŋKeJ޽gocK d͚UQ~8D_.:uB! =!AUaL � p4xT4a4tyԪU(1 � � � � � � � � � � �#:Ca$ � � � � � ?>3Fݺu;c˖-뜱-9o4̑.͋YݥwMNK @,YԫW/S#GO~qir6)SÇwY,ʷ^Rg0 �_J=&1Lɘfұc:˗+O<gloܸ6 � � � � � � � � � � Ny%P'ٱcLKEA�@�@�@�@�@�P뮻4c ]Vٲes>+WjժI}҂1&I6Hђ9fxC^`b* Dy裏>דO6h.>)kW!F@757S&)sf)2Rz)y! eiM/$w�WiM"@R~Y0 fߵ+RɒI9:Y EHɑ#vڥ\r%R � � � � � � � � � �/K � � � � � �xsN}ZpUz4ss{Ƅ,(/8P׿KƄ@Z QM$T޽{hϞ5zOuOoԿT"*5jH Haawwd@�(R.Rƒ#[ Q@ksܹsō7HdRT@�@�@�@�@�@�@�@�@�@�HAǫ9!� � � � � `%Jx3ϨI&?z1cFz�֭OW=qAzQBX sz鮊X>*U><8Lb#I @�ҶCҠA1~R3G_?m@6m xD4Q  � � � � � � � � � �P x9e@�@�@�@�@�+0w\?^G)/yIYmKJyŘL%u.@̙t}Y~tRRҪUzd@`:tdpM7Iaa a �i]r?XPA嗥ի[nIg!-[6uQYdI<ykIp?;@�@�@�@�@�@�@�@�@�@�Ho97@�@�@�@�@�HLӧ7om۶@~o\ϙS$/?xsfg ,( *PNᇥCBl  !u >}lE�@ =Cwoy~ƍҀR֬8` tE6o:u:gPd@�@�@�@�@�@�@�@�@�@�t"@d: � � � � �ؼyU{5}2̙3k̙Ikn?$_>)[5ח-_9RTI;6H 2}n>"� ֬ڶZ*[VZJBY1+{%";wZC@�@�@�@�@�@�@�@�@�@�BN Ȑ$ @�@�@�@�@�K#ȂmI:uJ3fHhw-<&GxwD5mdS^ҺuRvR.իסJJ$KXԢ;V@�HvI{K5kJ6G1Ai}j d&N]vU,YH"j޼Yـ� � � � � � � � � � @F)e<@�@�@�@�@�@ )<.\.HrIiI-EJ_- *$}h!ժ%/X4f=s&"c؆@j <΂!o)GB �Gq7 IbsK{GZM:uRddiݻwW%jS@�@�@�@�@�@�@�@�@�@�ȠAf i#� � � � � T hʕjݺuAtuڦջysy2eNg- 4l(4d4bTwyjԯgg  о'ϙ#v;@�BI`VOR*K}J6H={JzLA 5RR8܂!;w|6 � � � � � � � � � � s � � � � �@@:u^}U/&[ gΜ)IÇ <]BfJ8!`u6m䅾HZIkĜߎғO>W ۳BM [6{,YNbEKNg @�P8p@^Ү]B4n]jLZ>& 2W Û?@]M֭f� � � � � � � � � � @ 2]]NN@�@�@�@�@� y=f͚B }ɓ}oZ|LȌZJYg(\X ZGzH:q"|OVڷ/pFi_W/)22<,ȂK) �ͯnAڸ1f3g?b7 9iHT] :u͟b&PywY@�@�@�@�@�@�@�@�@�@�@ M /G�@�@�@�@�@ 5kUVI&G H{Mn8PXQ^['2~i~F;H~(}EL\,tV[+R6l\ٮ݅ }#� k)͟3հaҡCOH+&N7֍-"pUVU*U\3Qh@�@�@�@�@�@�@�@�@�@�2�A@�@�@�@�@�H@ѢE5c 4 C s!/Q_MvkYH~*YX%c^,W/XиgkaEsH}{.@>1YI_0@� xt+EGޓ9tmR1 yM밆@zᚮQ�dm  � � � � � � � � � �\ <?� � � � � �)% jڴ:vh֬Y];={h߾}Б#Gt3߶Gz5Ѫ^f\\G2QhK wo5Gʕ+r^mݷضܹs@*TgϞ³@ "m"<$/+Fj۵sNw=w^~8q%22uK0͚5K=V`Aj[1/x=߱r|z?=]?RumHM}_iǎnN{nj[?~6'͖-ث-6/(\{k"ETti7' &Yc❖V,qpɛP2Ǿ1{N {u۳7?%/s ?ٳュǝ{_l[֭/  � � � � � � � � � �"@d\ Ɓ� � � � � @ XX`bySJXBO<|I X5ZX{ν n,[מhmY/h?dķBK&-H+֧Y(}}[."@_;lKK%H*IW\5Ff^ڽ?]@ :ګ/4c4VM ñ'{ I{_RJ�K.}fV^-zJ]Ի~�R6 [j[nzr;Bm.ljs�ߜ,md K0<_@H -[V*TPZTfM)Svy|ǖ{wovӷ<xPXbŞ/`hω{C'nsdYg53kbgno{o?k/)ǞAm'O͛׽ں=ؒ=)A�@�@�@�@�@�@�@�@�@�H@Okq:;?؅� � � � � �!'`7oƍ],BrC-0<,<,H1/_0dv ԰ [,x\e*zsH> CZ/{{nY("K.{|=˗ץ^Q|yM@.Ҙ1IkEeˤr}駟ܲʻ,ъTXQv,@. &,,ܝ$C63_X_6ލߨQ#4lЍ%n؝`^N]'9@ y؅8IΝeV,Fn^k%ܼւ SZ,_[Фͳ'7l,`_~7oMB#S/5wϭMuzJN =X-v?ڵŞSg=pheb7b=bbϋkt.l՞|�?`ᗾB{մu [, 4RhQb-V|/⎁ � � � � � � � � � �C q9 @�@�@�@�@�$`" _-‚o|XH/^-1= �?_0o۶ͅXp-błW,ȯB RJRZdgSs@q1I  hgH1Iiɒ3,g\)Y^2e\bݺucv#&%::څ>K.u Ժuk]uU.*V=@` '7߸߳isYk5ktKry&VzjXB6J -m.p 7p,Y$صQ LZoi其nb%ބv֭nŞ-|gjo}AW_[#Ag0}>|Dڂ:<eϭa ?`qv) � � � � � � � � � �K Ȍu9[@�@�@�@�@� "`Kͳ@_-8b%wܪ\ Tʗ/˗/(i8p@7n]֭[5׮]+_},^z.03-'1˼yB,�҂#}F^^zi&OJ}-[o4hVZqjذ-zf'i?dEL :uk-4r:2L+T '@dmn0zh�is5 kӦ Vnڴ,:ԋ3ϟٳgkʔ).(v;vT۶m5krMe+**vs+vnj W[Xoٲ%v@?- ڷ8}p@{fDXn 9Ν;c?mȀȀ#VW/ -lٲS@�@�@�@�@�@�@�@�@�@�җ�Azr6 � � � � �T`.8n…_~9sfXvmըQ#v)UTJKYre|r/pfy~..sPD9S֑!I1bGa򎮿z![l`jAPf?.Xa:t,`4# ?~R6os:*3ZLdjI X蚅?~nU\9]vVLη z <`ҤIn^P`AuYwq^W͛ >m0m+`H eK{='HYhq 0? ߷bgٳ/֋/~Fp=%# c]h^-T>v튥 HnPKŊe @�@�@�@�@�@�@�@�@�@�'@dڻf@�@�@�@�@�1c ͞=[sի]I]`FT^=ժUK9sD,9+Vhɒ%K6\h,D&,,LUV|E+UH¡CkСKjQ*\+-vp֗_~ &�Dw}ҥɓ=پ}{zjذa>N.# =A֓/`sy;vݻI&,DZ>LFҺu�ڻK_ɑCR^G ~2( <~ӪUf͚łN<鎺⋽gʖ- >݅BZ=?(%VR{V#Ŋ;1� � � � � � � � � � @ --#� � � � � 0(-X@SN?˗+SL.YfiӦ*TP ٳGܹsb!6SvmnZm۶_&zشi u=z]S^E ž>#?^3gV׮]5p@Y0Qz*I~H%@d$i'}YM6M*URխ[7 T XqvjTn/( h 2e ֭[tR-[\҅k<[l.Hr-[Xrʕ@9J׮]®sn{u[Hi / f͚S[,(2=_R< � � � � � � � � � b SLǁ � � � � �Wȑ#.f„ oo>UPAmڴQVԢE ˗/T8pfϞ] 6@kվ}{ws̙cJ֯__~Yʔ)sNOa߯>LuE rEidz?$ 24]O>O5SO=뮻Naaai?6b3|M}'Zx 7Lq?O?W ܽ{_.RnyժUSU|yi %~ӪUbH;vLٳgw 4PÆ wf u@�@�@�@�@�@�@�@�@�2�As � � � � �!&BG)Sj޼n&mVʕ 3` lڴISNդI4ge˖MڵS׮]]O,Y}}v\ha+VtO:u"'W ::Zcǎ+" ֭ ,^x2[չ^hJJLZkK.qn@w[vGM86LJJ畔8u 7ol?,84SL\,~.VZʓ'ORF **JaK,ŋl2?0a͚5SӦMz9͹s" � � � � � � � � � @ Wq!� � � � �d( d5j(ݻWW\q, *,8!-o̙*Xw{DžThow}W< (_aaa=!}ci߾}zԷoߐ~΍VhjrL!b q.^R>}Msw߭;v֝wޙnDtˬYܼpºt嗻z)w�իh"-X-(opaÆjժJYʚ5+n � � � � � � � � � � 24� � � � � @R,kʔ).ł*UBZu릋/8P/ 4b[_ڵSZ QqwU+W?'|RrʀW3x|a+z뭷TfMwL(_t?_*@dR,Cꡇr~ÇWrUkرczg<GZ>}NiӦi۶m*^Zh-[P뤻Jwּyd᪶ʑ# dK2esb � � � � � � � � � @j � � � � � 'c꥗^ƍe,}q%�!\ٳgkȐ!4iʗ/zJ:uR̙T=z^U^]Fr!yBwUViذa.3Rj�A ?XQQQׯ>=zLuLRڮuA%KɓUt6uAP:N0A3fPxx }u5רrd\t@Fسg `߻�5j}ng:  � � � � � � � � � @20B�@�@�@�@�@�Xw'p6?3dײ%kvHvɒ%[lY*Hem\rEIٙBٗ-kB&ٲf̙93s9s-^,YRv*u1As%21\cj֬):4TT-c:8ׯ %ի[Hܤŋk5@Hz/]:A W^&M.ϗCUV-ټyrʲ{$K/_,Aw} 4X.X@"##e… /A+!.={vy'er1ٶm `Y ,Qrȑb � � � � � � � � � @¬cWt`w+@�@�@�@�@�H=zڵkg5a&yICfl~8~ 6L>SVL0! oݺ%;v4SL6mI(1c<3ҲeK"E 0~G2;F`{�[34:7o4!7n%KHŊ׭K.IƍeϞ=晤Xb7 E?KάWڶmkִaaa_:@ :tHf͚e;w ٳ4kLRL<@�@�@�@�@�@�@�@�@�W <38@�@�@�@�@�-pm9r+WN46|@& й:t9sџs!-"ҏ7BÔ.\h惿䣷(!z�,sɚ5kdń@zx"dȐ ., 4H߯5bժURJrI>}hBV^ݬiW;W!7>0`yܾ}.]Zu& #Fȅ <u#� � � � � � � � � �A/@dB� � � � � Νz[o%ƍ˗Kɒ%+ \9sOE(C3fȂ vm: ԩS 'zo|]=χ{Q%>L>S/M `(WcM>|r-СuμyLp\ǎMo&|4mTRL: @ -[V!Cn!,.] #@�@�@�@�@�@�@�@�@�@ � @@�@�@�@�@�J*r ٺut5 =:uNe0aÆ@ʺuiڊC@{|t|HX/9c^W^yE<T-gΜ2sLYtL4/پ}TVM:w,[GʨQLh_:D 14iHndϞ=&wܹRH<yڠ"@�@�@�@�@�@�@�@�@�@ \$@�@�@�@�@�CIZ$_|a)Zh􍎄A:'unEz Am޼tMUW ۷ŋgI۶mgyv'>={az]q Uk__{\"�*k><A.]$C _ҲeK;vܸqã.?2p@pG뎫7oʠArRD d)S.1]_ծ][5j6X_jʕ'OuzH;sL8Q7nlBC aѢER`AraaaҢE ٹs :֫WO4� � � � � � � � � � �A@�@�@�@�@�<(-?{「 3f`YUbst<7Ou.ԹsT窷ˇ~hmƍKdɒ%т 5 I5_~Һukѣ I h+okaWA8uꔼRH?~W58�&pA/ߖԩSWTTI6olL  #F0k7O6k�9a„h}ևH=ydO>ٳ{90n ۾}{[{ׯˁdԩcujMZ|>q:oVX! .˗/{Ilm_ #G nQ_~ERH!+Vu; � � � � � � � � � 1 =FIE � � � � �_4"""BҦM$˖-!C$AYԩA(1;ĬqԹsT7>{No6ukѣGADåB ҰaCի.zo{|[|Ы?nQ*UG}5<U@�d$VZ%Q%n(_ƌ#Yd1iÆ 3}Q*uqĉ]pYvmfm6Q*OBMJ~ٻwhX=^=<ŋ={:q6g@D? ޽{G?reaΝ;KݺueժUA:� � � � � � � � � �xNs}&@�@�@�@�@�J@C[&L ƍ9rT h׮](+Vnl3qUƩsSU*AݻwVA[ԩSܹsҢEhcuh5j(X.]{g(z^y3ι<hR]^}|�N`޼yҶm[PP/ϗKѢE(*Wlk8K~۷{hn^r혿?h fLڍ)S}q=zugg@_@sXX;ҷo_iҤ y@�@�@�@�@�@�@�@�@�@ A&@�@�@�@�@�>#OػzMoy&DW^ ȱcLgΜ7xC7nlv/^O6; 6^zɒ%KwClu<xPW.OܹO?S>ci߾TTɴ{%sL:Fi?/,mڴ13޽{s?b}̝W <xhժƳ~zׯԬYӄ}7QM?㌺otjYo~dɶۮ>ի2j(iٲ?~<03|pywEkcǎ: [9KxxnӦMrY)UTc̙3ˢEDXb[l\!+'OʁJuکS'u_eqV5t\[+Uo|~r vuAtLhI{TPAe&k֬d/dڵ2{lɘ1ccܹsͳrk9L6Mt^^=<U˻kg;,c9g}sHנ=o2Uxy)0 6.>32k,y;ך=Z%n~Y5_Y-1]pߦM "<ߎ;?EFFʇ~(o+ 7I,s:Ğ={9s]|JϠF|F]ʕ+'}Ak4� � � � � � � � � �L=VZr8t � � � � �  ۵koYA.{׼>VpŽ &8֭[U9駟>Z+a9G:uGNP]a8yӞXbCiB;VИ q޽ۑ)S&SO=eY!#+\g+ Ǒ={vϜda8=G]W}:7Vx 1gZ!#Ycژ~L2q5H" 4׹?#Fcntϣ\9;QTv Vr)SQvm{[@G,Ye˖׫[Bwu 0q{V0vXC+pG縖3gѶ({J NC+t^SfvXsQ1t?ubIl;n{O>1uyu} WW<rmG LV8t7~gϞ*U8t*=RXx)S4z kѢjժ+ϴz!>2 sl۶sgV@ "5 6̬7 m;"7y)0 :tJ1ydM_u%5r|kvS\,Q{f7n4??b{mL?#M4<ԨQ|N>yvK{F W}5WY[nQϲXOҟYΝAQ0+HG-  � � � � � � � � � x_> � � � � � :$V0jrӧpc.رXaO?IӦM_+Q Kw5Y!"uԩb)\(VX7b3߸u:r-e˖5uY +W'V,YR+&?9rʒ1cFB=5 g+/Z'9r䈶U_+B֬YcӬp] +G�ARaÆr-s:W_~wSeѹs[ ב{+7]s}߿ڵK0s?y>3Hj|Y!?b۷~n~FXB^s?mڴw7+oխe>yw^=ޞ -!@ Xf9shWon־_|t+PgºEZ+.ǷVuzum_>jN:]# 7r+SEkRb"FsXazbKf̾-Vի~}~ٳgG]oJz 4ܙ3Q[oKg+ T~|v#q=/vAy饗Cf=l2rHeΜ9f+WK5r|k۱RJzqۘƎ+V8^/eժUҹsg|_lmg<jb*;J7eĉyfs3?XŝAmBkџ@�@�@�@�@�@�@�@�@�@ TR7 � � � � �E O<f(X1+V/ʂ $K,!Z4p末W� xD1shF|uh]4NҧOoB4gq.8;}z J <z 6Lf̘q%}s4ibd4C-vǜUS35ԕ{lb֬Y&R]4DQ ՐPmCI-3s̨ خ˜9٭1ˍ7̮y<ҟ|@�$ L6ͬ}7oUZXؿם߻VPAWF7I H_hDFF`t]P<+:u;*5.`׮]FC˕+' 8i$ѣ$!sn駟6(vqg>ύ6hbΟ?_:u5睿3ќ}ҥͳ;v̼8>{dvy\7yggڸ^@ٲe3 ̟?d͚+XyvygbzMBSR~i[@�@�@�@�@�@�@�@�@�@� )ZB�@�@�@�@�@ y h޽{}>H Ԓ"EW74s7om۶ɁDiݓO>i;>,M6  ̄p;u ȕ+hM5$C b{\%M eĉ&l端羥JJΟ?/*U2/ 6}s]>_/&[}>qǫwgnkcij;!.+W6]w>7׮]ÇKͶcsـdĈbPu��@�IDAT^t4LGdt~z{|.|~o?y{>v4�,={vӽ3gxL2Eu-t] ϴzl]+hű]/nF2!N~W>$<[9t'ZWCWZ%{^l^zx'rq知qf 35�r˖-&ާg]wyD/Z9m׫!Zu}>]_b^uEsٯgEv3s?2bu5k֘  � � � � � � � � � Ag � � � � �W,X0 7Fҥ3gOw}9uܼyS>39s͛W.]*ZvSsƭ[uֲxbY|tQ4L1fq&1W鋫kuJ*&]vr?sqܹsMf.]L�Ll|\Wc):Wuz)SFnݙ mT5رcrȑhwCKܹO _ݿL>=jM5/Xb&~Vh@VRWzϼUeݙѯ'oߎ@ Ν;=M]/ZNbCg_Ns=K/_֭|&rС){5ݻc fT#={4kzʀ}%K&Im̙)Sץe˖ =5y^r~>ə3^vm4swXG넋Om}~J ,Zk>;w 1@{o N@�@�@�@�@�@�@�@�@��AP @�@�@�@�@�xL>… K dΜ9m۶hO?-@׫W/9y<䓲c)_ZJ"##ΏM\u؁׮]Fm4nݺ-[63: Р؁*ECk]}N\ /K\LXͧ~jꏈ06#G~_|%qw}`$*=iC=Yܙ mOHukYzu7o,iӦ:`>lٲMjؤ5kpa'?]~?{!(zt>=Va>Dug>Dw|1|7ZB�@H"?x_=ںlҿ勵Bl۷Y# <XEu_zuOWUSO=%ժU3똋/FOo4SNr 6lh8]3gt4h Pmۚ S9祘'+W6Ém}Vj7챵cYM}~+V]5y({t8fO1oy7n\ u � � � � � � � � � �> 4� � � � � \~ѣGΞ=a9sƴ!vѠބԬYS "G6!/wTT?~DC5TR%Kx_5Uy1/ZH4LOϔ)7sLe4ׯ_ Ν;E b<yٳGիgp JV?Ǐz42;0k֬�>;G1GcPoܹseM6W_}ev@l4x:GuVy?~8qGpgnk]A1FrU#G/"d͚eVˈ#S{Q{|Hj9w\+_̇8@-dƌQw ֭d̘Q͛g֑&L={Jvd̘1 WkWY+hŮOȸoN6m|G(ZBц9{ls5 V[ 寿2 =꺆lذ(Pc= S' >36zy)>7j8>g:cڷ9rȫjiBGG~`u؞x1鳥]yTO2<=x_O:e[~w\"}u>jq8ݝOݏ>} @n& � � � � � � � � � 8_XiЍ� � � � � @ \xa):@�U+ѦM]wGѢE&Mj WtXA+TJVHT Bh޼s+ınݺyW׮]s-[ִm8G X4}ʛ7wq;|s>>}CK/OVL2.+;*VQ pܼyW_V <qѠAcc7|ȝ;V`c˖- :ҦM>|x'qϤsRQ.ҥsXm*{jsǬ0GΜ9˗7H"+D[=fg9"E G˖-Ov<۶mkqFk׬Yж7_v>{ۅ?:g~ we<.rf϶4抂t U+ ң_a s,_^w}\kw #Gp.IHiKt% PtԩSǡ�VJ9 vtX!CG*UVxе+WcƍJ?VV-SVh לsXԩM=&Թj>Rl'VxYIǎ^ѵh;ךݝ9W6bO>y~\re}b}Vc~>}T|9W@ͭLSݻw;Vu9[9ў?jxҥxj9Oyiyڵ@�@�@�@�@�@�@�@�@�@�%ñҨGJT3{G@�@�@�@�@�RСCb!VPX+~4!… G<"iҤ+KRJ%9rHp? q+dE2pX!.?[*lٲEo0 +P�%DoVXHBY/m<VfEVXq{g?J&M\U \.j{b< suqVwۉQ߻w#VLRKҵ̚5[s) Ym6kσuw{/GJ ̙#sݖ9/z) M+c׿c+t ԢkEoPv9sXar+Wv5sBy]EI<aÆv)O?1BgϞZil旧LR;KO OٵkX ~ƚ=۳sL7 ʉ'3e̙2{&-iӦ2uTџv|9ɓ vԏ� � � � � � � � � ��AAq$ � � � � @ hL LbDD-Z4hpiiذa}Wm۶x~i֬\~]/^lBASObY|ԭ[W>C޽{bky~M8Qz)Ԯ]'̇?O&$I $qq;&%K=z{w+@\+Rzu0at۷o޽{Ν;套^ U.WQ+VuO{aA:u*@mKO>l޼Y|AO4ϗA;ҹsgOTM � � � � � � � � � @HlF@@�@�@�@�@� … ˆ LpC dҵk�dΜY Xb m< 5OLNʕe֬Y={V5`P?# 2I0.zO*Ro h??5Lw@哱cʳ>k q?ƳMZ̙3ҦMW_B U|vZ7oY3矗 x@m5?ΑM6>j?b oYd7N405O<RD _ߞ$wU:uĉ /H~$C I@�@�@�@�@�@�@�@�@�@�(fO ujAr  � � � � �Xoߖ_,UVKɒ%A{޽{eС&|#<<jcǎ&믿ie˖IӦMEX ks*aщ�3g˥RJ˗SN͛%[l~J{=ٴi4lЄBj_ʔ~Aɨn2aӧO7o >@)&M2!ҥKĉMpj/~رCӦM4iҘ^zIL⺌c � � � � � � � � � @H ҷ#� � � � �J`߾}ңGYv 4hɓWN ?~\ &~TVM&L ŋhܹseʔ)ҦM);0c yge˖&2E~a`>Fe>1v�As+B#֤Iٸq,YD*V2c@/]$7 gbŊy׿m6E?KάWڶmkִaaa )ph4P@*N~M6k_:$f2ٝ;wJZ瞓͛;@�@�@�@�@�@�@�@�@�@�? @�@�@�@�@�!A|+Vٳg… K^h:CP@)[s-B vh_|!}vɫ*DZy={H17U+6\ z)SKʕGCˆ9"իW ub @xOԩS2zh9xyݻˢEڵk^PȒ%8oAɁ}v:t<RP!ߺukP˗KV /D�@�@�@�@�@�@�@�@�@�$ 9ZWw:MV  � � � � �u̘1Cz-9p4kլYFUdܸq&(H"oH۶m纷6m )]L:U%2~q }ze׮]2qDСC@ 9"�< k#/|oʐ!C$,, D\˗O+)P@"j%gϞ5y晐9 Uԯ__ի':Gs~%KҥK?2eH-̦t@�@�@�@�@�@�@�@�@�@� '2B�@�@�@�@�@� HݻW,X &DCL{=9qDb9sEҹsJCtr>nݺ sHrLx˗A75`P5Vk5He>fz| @ hM+><x0лPz_{1k]ȑCt"}h(HɓǬK(!yv,k@:@0 [|yə3tYN>->|Xv!B g@�@�@�@�@�@�@�@�@�$0?rxC[Sٞz@�@�@�@�@� _~ń|&Onڶm+͚5ٳSܹs!3f̐+VHl䩧nݺ@8/Ѓnݒ>d͚UFi}XXX88 ?eСA.|  jM9"�< G@N:zK#Iq-fxI3f qs}vge˖mʕfݣ?TZռ>!C$=G޳glܸQ֯_o}]w%=Ԯ][ԩcKRbO@�@�@�@�@�@�@�@�@�M C3j@�@�@�@�@��q,^XM&~\vMjԨa!5j$ О-o<xP.\h W^-SƍKA&Ǐ믿.ZX18p B_;מh�;c²4(ߖ<ywi@g>xv$ jI�A:O Y1B ,h~=n&`D]G-X@6l('N޽[֮]+vp^R%X/_^ʕ+'3ftZA ܼySge˖-yfٺu\rE2g,+WիKji&3@�@�@�@�@�@�@�@�@�@ P ;C@�@�@�@�@�B^@;7o ?hѢ&ԥN:RV-ɔ)S;%' .ʕ+eٲe߿_fjB[ha}tӐ_5!OӧO{W^|E0,YD;Ο?oB4?9r䈴okjf0C^rત TAi̙3MPo!׿$,,MU};ߗ>LJ,)Y? ӧOƍeӦMfлgϚRP! YlY)U.]Z)"{FPN<)v4QR^*iҤ2eʈ>CgiCo "� � � � � � � � � ��AL@�@�@�@�@�@͛~zYp,]T~g |PWnjժIك`4t8w]V֬Yc-[۷M(MݺuQFRjUI2}IH<xPF%ӦM[nI֭[n"$�Le&C+H…ݬ!8Nc>wBe>Y Si͛7MpW~ip> =z|&0~ұcGgߎ;&m6LsN<urGm:kOޟݦmCɾ}_~#9sG <-_TPAJ(rϗw@�@�@�@�@�@�@�@�@� F @�@�@�@�@�"pY|Zl{a`*W,UXQ4!]t s$pٱchpƍͶ~ 3a5kj׮-AxL>]&L`z *$-[4[JB觟~sMCʕ+'=zKƌ N xC HoR'4Lãuk^ @GyēT]G/lc &M�;ݻwˮ]DMC4]=#E4x3kDsY/_ÇG]8p j7n0uʕ˄jȣnJ2s玷 N@�@�@�@�@�@�@�@�@�@��Ae@�@�@�@�@�<&pYٰaU/\ )R0˗7Aeʔ1XTtܹ3j۾}hPϭ[$SL&J*ȑJM`֭2{lciʽ+7uJZ$sO./Yr|7.٪U+vUB2|HЄD h:.ӧeڴi2eҐ>]k]oGmN uaٲevIN$Tk׮4&_L>,Xl }W}<y$UT7ސAv鳣nη_9bK,YD-Znŋ@A�@�@�@�@�@�@�@�@�@�> c@�@�@�@�@�P ,ٲeh`ڎ;vIsm L@d%LpD"EL&@xxi۷O֭+NM˗n)[44aaaa lӝt^ϛ7O.]*۶mTԩSk>C+W.K潆lڴ.[L~'2H'0(h䃎22M�Az{ܺ>}|f 6{LW.w_Pי֭UVɷ~+{1ktpIoD>|؄iH> Mn߾m:kU7o^Y!w~y x9۩S'La^7AvE5�^f5k֨sy� � � � � � � � � � <LQ � � � � � 3gdݲwިM#=T-[6:9h`nҥs`=ʕ+&Qء/i.緬IxxJypJ4>{h`/k֬1sW!5SOu )Rnݺ%d5J u~iXPѢEMXUݺuMQ`>o$D Ȅhqn Y \hlܸQ4O׶ժUʕ+Gv̙oݿzYkp]Vvi~ѵ@&MFr]w40 ;v9yg ;$ҥK*,1ٳ>ٛY3fh֏*Go9r9g@{ϺglM{ 9iG  � � � � � � � � � @h Z"� � � � � <xl ;Mhӧ"̙3Xh(B$퐒L2K4ibm[;5Xˢ.\ pklj'_EuIse:4CufK:9_/;Vd̘.W+:xY@CZ4PQÞt % :բXbRHީs9k֬UR4EE~}믿0*mGPLHT`}$]tCjm C'zW۶mԩSf-] 5ֳ׺iӦM4?zS:l>km}ՠJ es4�PPjUa L0AbBqs! c}^5BjYus~!C2ojoYts}>ٛ8f? ^7/^mӵ@ rM_~RJe[NϏw}8wt � � � � � � � � � �B dq � � � � �p (P;MALbЍ؊8{ I24lD|պn޼iBrb{}AA[6J;R_sm-54#!(BƦ}:4hiϞ=U`F mA]we^\ qy.1<1Ԁ);tRJ(!%K4C�wִA=dq h?l6]+AcǎE]!yv蛾w^AZ^{;Oפ9r0(Z-[Vʕ+gZ@\:.{^h :g$}n}v\͘c\1X:ous罞m_7{}ӱǶi~):}wlA15pM}Hs � � � � � � � � � ;A9 � � � � �   'C5tD+WWwh{hiHl!>;C=/^,6m?X2g~ 夵sNM5J=o`a3pyA1j<�!=�AwYuk]:ZShHʕK (`g$TCg4}.7=nw^;oV\~E>j&mv|kqiп~M?|hj@�@�@�@�@�@�@�@�@�@�E @@�@�@�@�@�<&K"ELdN<Vob+"2r\� O O @p 3OΜ"'t\} � � � � � � � � � �C괉� � � � � �^(Po^F!oj[T9ȠA"+2fH"Æh` @�@�f }< � � � � � � � � � � 5-!� � � � �   ո"2n"� � @p DDԬ)%Kp^#� � � � � � � � � � k }-N{ � � � � � ŋO<!OKH#B&Ds@�@�@ ]; @�@�@�@�@�@�@�@�@�@� 2A�@�@�@�@�@� kuVYxk\UBzΒ@�@�@?? rHӦiV@�@�@�@�@�@�@�@�@�@�F g@�@�@�@�@�pKB R~}yw:_'/yE�@�@� DDT(7oRkz@�@�@�@�@�@�@�@�@�@�BG й׌@�@�@�@�@�8p^Z֭['2oD�@�@�'۷EZysE�@�@�@�@�@�@�@�@�@�@�x@�@�@�@�@�@ jԨ!?5*hA d*:� � @H _/rHf!@�@�@�@�@�@�@�@�@�@�H�A &@�@�@�@�@�6_~Yk9p@Pu@Ƞ]t@�@�)VLD:F�@�@�@�@�@�@�@�@�@�@ IA&@�@�@�@�@�@ 7o. 1cCw#w@�@�@@ -  � � � � � � � � � �$P q: � � � � �@xx2e B � �$;;Ei, !� � � � � � � � � � u NL � � � � � ;wTRG}IRL#� � ""DGreTF � � � � � � � � � ��A!v. � � � � �*>}z޽?^_,LA � �  4m*ݧ � � � � � � � � � �U H8 � � � � �R矗sɗ_~f^'@�@�p8rDd6f͜v@�@�@�@�@�@�@�@�@�@� m*ND�@�@�@�@�@�`ȓ'iFFCBN@�@�@D>Ԯኩ@�@�@�@�@�@�@�@�@�@� 2Dn4D�@�@�@�@�@�+;w+V$[!e` � �A_"wݡ � � � � � � � � � ��AAw0 � � � � �$EGyDƏjZ!6I@�@�J95kD5 nY@�@�@�@�@�@�@�@�@�@�J Ȁt@�@�@�@�@�|!ЫW/ꫯرchm[@@�@�H6|#2HÆfH @�@�@�@�@�@�@�@�@�@� srD�@�@�@�@�@� lRr)&LwW|>>1@�@�@DH:"3&1(@�@�@�@�@�@�@�@�@�@�|"@Oi@�@�@�@�@�I஻nݺ'|"ׯ_/BF@�@�HvW,]*ҼyB�@�@�@�@�@�@�@�@�@�@A@�@�@�@�@�@ Pw.2gΜ@A i@�@�XD5&Mzt@�@�@�@�@�@�@�@�@�@� [@@�@�@�@�@�@y͛|@I d@:� � @ Dɛw]c � � � � � � � � � ��AAq$ � � � � �xCw޲aٲe7: [F@�@�͛"[ 6MB�@�@�@�@�@�@�@�@�@�@ \,B�@�@�@�@�@�xjԨ!K>(sC!Cn3V@�@�XZH)^<{p � � � � � � � � � � % @�@�@�@�@�@ v*f͒K.p4F! � �$kiɽo4C�@�@�@�@�@�@�@�@�@��A>a@�@�@�@�@�T:͛7e̙E+X!Ϝ9#'Nƍ˨QhwpHڵQF.^@�@�x L.RgϞྮZJ^~e|7/`mM]F�@�@�@�@�@�@�@�@�@�K ȸt8� � � � � �^ [lOȤIX:` DFFʊ+d…re{_o߾-;w۷ � � [=*rV3;ym~a2e۷ϝK}vksQ � � � � � � � � � @  c@�@�@�@�@�BOK.qFzO5RC\ԩc2*^3)R޽{%<T� � D.]ӭ Șk;Jr<VܳԆ� � � � � � � � � � �eV� � � � � �TVZRH4iR2wh+Vbɒ%dʔ)F@�@�C` 7oJ8sk"|F�@�@�@�@�@�@�@�@�@�@ @� � � � � �@XX<{'S=$|cEƌgWDqO 6ȴi_~K '4Ukȑ#{哷~;Z/3gʉ'CSOE?s}vɘ1tԯ'h؍^駟| ƍ]vɃ>({1u/_^:u$\~V˲rJsMʔ)?7A .ӧܹs<z #ݴidȐA^5jK0۩SB ̞j7 � �D8p@dn#eDӛuo)[Gc.om~idҥRP!y뭷$wQƵ6?rL:UҤIcc=|4lЬׯ_o|2g9c&M~5 � � � � � � � � � � @x<9� � � � � �]pA͛ @ÇE4R! 6L䯿G}$5k4Ș+W.iӦnTܴiS)^y3ψ8楗^21AСCpI 9y <y9>&'0K,2eȏ?h9sϙ RV-9wTTI.^(=zmۚ9Gh߾w}']t}=oʮ]J-LhiʕM � � - Dg)R$4f<x9PK)U[om^vmٶm H4it9q͗/_.իWArϞ=Eid^<65Ǐ/ ۷/*�>E 7 � � � � � � � � � �!fe_qA\￳ٳ:c � � � � � @` 4k-[,0;dDZc Ԯk8 /h`dBtҮ];@GhS5��@�IDAT0իMyj-[)&ZjҠAYp Z0a l=zէٲe Ѳa y=> s\j5һwoٺuTPA "Ç)SpI=Y}v?L`?.\XokQ޸qCRL)GB3 [o%iqߚ*Vh+ox4rĉҭ[7?@�O ̙#VXA]@�IGDk=Tׯo +V w,jk.I*Uku?`UV5}rU9|ʕ裏J<yDΞ=k˗/ \ΝkYdkך>߭g!@�@�@�@�@�@�@�@�@�@�@ xs@�@�@�@�@� `cǎ̘9P<4HB nj+Pd0 tDDDp*UDD̟??jXXX{7$5}֐ ȼyDu n̐!iWՠ-yڵkWI"wQU;;ґ^E)r8 ({E E"E(^HP$y,I2$dv]zgełl.\qƹcǏWNbC `֬Y9 )W{9 0@җ_~NgT.]bk@z:c� � ZP̓#G,0i5k9sD ,k֬ۜ=r ̖-,�V[57;,`v$& ؁� � � � � � � � � � @2A&i@�@�@�@�@�+_|σgЩ0ҫ ܶm)iӦnw˖-CJ,l&01::Z{y-_ܭVi,\Ow)U콱�Qgƌ.1o̠nj.裏\c[ݟ~-#GbŊoe[չi&ߠA6g@�@�&`SR.mI8'u 9><y篹y=d1;wП9s@�@�@�@�@�@�@�@�@�@� 29!#� � � � � @dɒE1~sjJ! *\hQrK(>)R$/a3ȑ}\lYn:x%0`,TrԨQ:t^yqڸqz-e͚UuMx[ϑjذ֬Y^zĉ۷ϟjpٱcGC|F�@�@oSJmHٳ˅!Z{ t.\p&Lk֭_~vxE�@�@�@�@�@�@�@�@�@�@ H@�@�@�@�@�@ @>}aZ*Qv)p 4pOX|ܸqcH T_kVrɓ=(&T۶mUL;.8K.׿4h,(2{1.\XF-ajLNZ> xb=䓞l@�@�ɓҼyR-N3gNmn=&-3wMsx@pk׺1-\Ph @�@�@�@�@�@�@�@�@�@ ] #� � � � � 5j$ 4%5Cjժ}7̚5K O</^%Z⧟~7jgk6K,8p lѢ^z%جY3+WNs>|mKhh^׆3UiӦʓ'zY-q&'Ng츍ٖ&MsέZmڴш#tW^6l/ � �[` ńKzGF_gϞu'vڥ͛7駟vav0I˭_-\>T@Y0-ݗ܍|A�@�@�@�@�@�@�@�@�@�@ L1d/[@�@�@�@�@�8 8;vy$pfeb2u} QLҹsRZԩ,`fȐ!ںu&M+Wj̙*UI2eO<K.~X<wk욇z,`׾}tR㏚3gڵkC*SL.pqFL ݻh"ȑCuԉ*V5jNZȤvmZc]?v]viȑ/m6dٱcG=裮oэu͚5n|3f8; bte*s4� t5Ҁ%JW^Ѹqܜ|˖-z\@m-$Җssgϛ7/[L-[ԠA4w\wl1}-/n:NΜ9/^_uc�sڻw|M͛7O̙3ǫ � � � � � � � � � �$%$u1@�@�@�@�@�Hg!4r-qic o敎9׻r]2D uLS\^"wc_pA1ubA9v}dd )_%!ou'd'9�\@ nD�He e/THzU/v޸qc5h &}nڴI'Ot :7?{ jx w;<[@�@�@�@�@�@�@�@�@�@� 2x=#G�@�@�@�@�@�$,>$TJ $6 E y@�WvҮ] aPre~z#� � � � � � � � � � 'P?C3 � � � � � @oVgϞPJOɛWziNGaäe% dA�@�@�:US!ˑ#GT@V@�@�@�@�@�@�@�@�@�@�2 3\@�@�@�@�@�Mk׮:}fΜ \7=Z 4PHH ы/(<jvαh~!@�@�/u?蘃ǎӿoIhѢ� � � � � � � � � � @aI � � � � � EUӦM5y�8 (A+zϙ35khȑu ɓGݺoC\Q*o/ȑz5RO+V r@�@ ttmHTT`ϫ@ʕ  � � � � � � � � � � Bbo1w,ݻ_lg$G+ � � � � � @Z |zgt!e˖--K O> &PȥKSԩ5y顇y �@/1YȲo,A�Ha'Fں5;y@�@�@�@�@�@�@�@�@�@�X 4@�@�@�@�@�@�$v͚5+89rP~dYFZow--?vNʖO@�@�(0ebqd @�@�@�@�@�@�@�@�@�@� 2p � � � � � @ +VLM4ɓ.Fo>1Bر7@Tޛ1 W#� �\ƍ֭A^!!� � � � � � � � � � �A>Sq! � � � � �@n4m4={6cΑ#.Zv:the^%UD<)z(� � @@L")"5jP � � � � � � � � � �V h � � � � �Ck׮:u~4G)$Pzuڷo>cͻGZQC U L!{E�@�8SJ:)fqH@�@�@�@�@�@�@�@�@�@�D~e7 5!� � � � � @/^\M4_05QHٳgW߾}/hӧeYJM%J/G  � �(g|tm8zƌ� � � � � � � � � � @ � � � � � �PsΚ1c"##a[rժU5|p߿Ocǎ 7PDD \AEѠA ׃#� �$:Uʝ['� � � � � � � � � � �~ 4� � � � � �Mcǎ:r/^цɖ-_Y6lнvTH[zR*TGD�@�@ ۵fG@�@�@�@�@�@�@�@�@�@�@Aד@�@�@�@�@�@  TTI+VԴi2kH_>]=W#GQb5~|[]sMy.F� � 1?ިV-פcǤ .]ӃQ#� � � � � � � � � � A8!� � � � � @ر#Ay/:[lڵ'-]I tyU4xQ@�@� ")fRժR Id @�@�@�@�@�@�@�@�@�@�� 2!� � � � � @X͛m۶)J"P^e-^iG ~@�@�@Țbe.\#m(j%Y%t\@�@�@�@�@�@�@�@�@�@�HAG � � � � � JM6U5mڴTnR[ o^;E dj � @ dviw_<v4zԶ4nܥq@�@�@�@�@�@�@�@�@�@�^ ȫ7@�@�@�@�@� AG MA�@�@�ҭ ȸ v;Q@�@�@�@�@�@�@�@�@�@�@_AKv@�@�@�@�@�@ tQ?3XtKmHO>" � �)TdLRҧfT� � � � � � � � � � @F 2#<Eƀ� � � � � �"жm[EEEi޼yB++⋁1@�@�@ @q?]7R< � � � � � � � � � �G H8  � � � � �@Un]͝;7F yKRtŻ I@�@�H[9" &pE�@�@�@�@�@�@�@�@�@�@�GZA�@�@�@�@�@� hݺ̙$e 3;?'@�@�R[dXԩiY}#� � � � � � � � � � Asf � � � � � 'VZiڱcZ*0~ZtD=&}9� � @ZL"Ec � � � � � � � � � ��A)J � � � � � A7n9rhܹt r</,='  � �%=7ǾFʗ/*@�@�@�@�@�@�@�@�@�@�[ 7G�@�@�@�@�@�Ȓ%Zh9s$w)Hy7}I_Y@�@�RZ [AHo)կҽ> � � � � � � � � � �xHE�@�@�@�@�@�|hժϟ(ಌ.0vt@򣴠Ⱦ}+@�@�H) iXԾ#)"� � � � � � � � � � 7 p @�@�@�@�@�HBu:rVZU 祗^RL0o#^)S|@�@�@RdT4n[=@�@�@�@�@�@�@�@�@�@�HN ΂� � � � � � p9իWW"E4w\p s+f@-[ $%:Af|q".٭R;s٘O)""m=gΜӧm쟏sιgY/\oǢc+ZCBBL2Ůaaav<s L,Y=5k֬n͖-%1E9rP­˙3rVϾ͂� �cǎ:tPuIгo[<wMڼZ6'FD<C`̼nm?Ν[qׂ p1abvUzx@�@�@�@�@�@�@�@�@�@ BbVbK&EA�@�@�@�@�@�SG.oY U7=zTwk 1ڻ7/&'_Lb8W}c{fZ,!z-<ѳz=ATX%hǓ Kz C&Sݷ�#O'Ҷ};gPL >J\,2O<V 9ʛ7;/_>ٚ?~ 𤤞 Ȩ'K{�*Ÿ@�lc1s]糅?\(b b9]lN j[u܀DŽ6WJi̚U's]{nldܐ'N0#Gěo<G%KT2ebҥKe˺㎃}@�@�@�@�@�@�@�@�@�@�T CA�@�@�@�@�@�HNyzg% cXsaY m1 hVpEOsY X,xL0ر},ǂ}<}?Z{,,HiE–<'O%\ݫǏرc w!H[ *Z@y@�N+nڴɭ7o޽i-8ڵks*^ P9gna)h!ըyMIva?|7.B,-[:&|URE+WVm)ImN"� � � � � � � � � ��A+ � � � � �MYf.@nڵUڥ}�m}[-&_XE!!!.c=*TPZX�z-@зoq%d_/iAqmbCB-2b)R$&ܳhD.ɶd  �O={hҥ. qZj<cJ*0D P뮻NeʔQ<y|5kV,XЭIalؾ}{laΚ5˅Dڽn^#&}~~\jժ"<)Y!� � � � � � � � � �dT_bK&EA�@�@�@�@�@�SK8p``dU30ǝ;w?tݻc-&ac]0_b\`_>۷B-&sA&p} wnm:zf흲wTR*][+W. b f'&O�[AGȀ@  X`=Zh/^pXlYlXNZzuUC9q6n2WX+Wj:r̩uiӦnmҤ|S@�@�@�@�@�@�@�@�@�@�4 2M@�@�@�@�@�ҳ@ǎ-[6M,T۷k֭ڶmvZ�'d/$$D v{`=ۖ,Y?/^mgϞ*u cǎi޽VY-O<\ Bz˫bŊP{CCCce oQC�&`͙3gj޼yZpeA5֯_?,'p9[N˗/w燅^z馛t-8k;Ƃ� � � � � � � � � � @F 2=Qƃ� � � � � �&0tP >ZAQtt,oͱ#;oKB\-[6v5k bQ`S[-Գֈ7l{=*URʕZJRmS �i/Eiԩ3wjٲ &me,ؿ,Xֹs9P|ԦMuY:tP޼y1-"� � � � � � � � � � A:]"� � � � � @XpnFZh,/`ׯnڴIOv,XPpgu]kօ?ByXF Iھ}[nݪ-[Rm̙3pªZ Vly F2|A^!!@Y_~+_.Xق۵kƍ+sjLX̚5KӦMe[VϞ=um)W\e@�@�@�@�@�@�@�@�@�@  ‡ΐ@�@�@�@�@�@?ʛ7 ֭͠DEE+WjZj9rčdɒ.΂lR ,P@aX_OamܸQ]xRrTvصN:*Z !@dx عsƌcǺ?k֬=z*V]N+p9i$͞=[aaaYO-ZH@�@�@�@�@�@�@�@�@�@�+ @�@�@�@�@�jժoYo6qۧ_UK.ղe˴|r<yR9rPeA;>ɓ'"٣5k[n* i-Uׯz깭̙%^: 2>4JF�d~}1c Cӧȓ Bرc8q \d{v<{r )@�@�@�@�@�@�@�@�@�@�LN � � � � � @ hѢ$6mڤ~9/ڱcfͪڵknݺkʕ)SHNҪUb j[lqߣr۴iS6o\ J#D oQC�Ԅ ohڵjӦ>uؑiZ=?n:}G?~2g, |衇T`A?@3 � � � � � � � � � ��A)J � � � � � $cƌ߯'O*,,,HF-޽[gz/^܅5jHZd,YƄ"=~M/^Ϝ9ի릛n7߬-[*gΜa! 4 1 ھ}z{LUVMS9r}]EDD?<yW"� � � � � � � � � � A"6]!� � � � � @XnjԨ5kָmEEEiѢE>}f̘׫hѢjժZh֊+f3.VZl.\Q?σ͛}[UB'2?aƇ@XrB{Nʕ؃ft�#FhȐ! kK!!! � � � � � � � � � � PA@�@�@�@�@�Ho.\Pܹ]؈d%22R_Sرc.m۶jӦMHϑ OgϺ0ٳg`M6f͚ڵJ*쎶X 4~�t�W$`A/ -[mjծ-nJ'N5jѣG^~'#� � � � � � � � � �R 4CA!� � � � � �$իkʕcwvZ=c*Qtp:tΝȔ @@ d˖M[֛o7j˖-ݻf͚Unݺz_d� k̘17n̙#B 33OltyСCj*;wNjrDbs@�@�@�@�@�@�@�@�@�@� 2@�@�@�@�@�2@:u\Hz|jԨl< 'N={*_|yԎ�) PbE/hǎ֭Fd-]4zI@�.6m4h"Ehݺuիץq$,zѢE4h.= :� � � � � � � � � � xA3"@�@�@�@�@�Hgkի*Μ9Ç\rz'վ}{ڵK ̙3g#@)S9~z-X@j޼5k9sMQ� cǎmݦ{W?+f dʔI/,,tܸq.U � � � � � � � � � ��A)K � � � � � <jɓ'cǎt3h 3fʗ/QF^^%JH7PLƍBv u涫V ̂ @ L0Aא!CoBX&`… ջwtm\C�@�@�@�@�@�@�@�@�@�HAF � � � � � @_fÆ TUlٲEs?֭[}*s̉ęt)p)?^=zP;|F[oUoV+E@ѢE]UNgu,@�ҕʕ+u]w駟O<jb-Sʕ/4vϞ=1bWZ8g-u5m4 <8ʣ@�@�@�@�@�@�@�@�@�@�  26CE�@�@�@�@�@�ȝ;J.קL~l/ 7ܠjժiׯBCOF~$TtttWr;qo͜9S{oǎ= PdVc6/+'=0^s5>|,YY֭[CԈ� ϟW>}t7W^ *SΝ;5vX6\"6x:tHWFFF^RjٰaC{Y|e  � � � � � � � � � �CE@�@�@�@�@�@�` 6|kĈe,)'oYW㭪+ixUr&TkVcI ͛^z鲆 5jpajRfʹnݺ2b@�<FҎ;dې ۷j֬K\ɼ$N:;L2%rÉ;js͛@�@�@�@�@�@�@�@�@�@�+  @�@�@�@�@�+PjՀ9s~aM<Y~{O!gyF ,Ptt_z.!1_z%с]vW^,Ydվ}{uQǎ "�K`{TT)52W6y`^4׶WrpBYJn@�@�@�@�@�@�@�@�@�@�JuUq3 � � � � � +**Jxbϟ׽ޫ{LzkJww7.2<<\˗WNt-hժU8q/ej„ ڹsӓO>)O8YॅlٲEСC+W.Y :uM%K^SѢE/ݻwO>ҥK]eʔ[o% >m߿k?xbM2%0<;iA=ƍSlTF 6Lڵm5/frW޽էO׃qYХYٳg~ә3g>gŊݳ‘#G]w;˩ۻZBlRr׾}t}^z.0wӛm@nݺk׮z׵zjWոqc eĈ @@�K`ںu/,C=6_Sx ͛7.'=Z7oV|ԥK͘1C2g{;63ffϞʯ)uٯ_? e^kM69/dsb[BBBbHnm.?6睦M\rg5kuC�@�@�@�@�@�@�@�@�@�@ i , � � � � � @Ŋe& >T~ 4(z.~Ws=.1gΜ.qƍ.Gʕ+?~glA;cٳG]={ 6Fɓ.`Ѯ2dN:M6<#""\Ç](o7߬3gʜo ܹ fϞ5k8͛7ק~* 1Ypwwr:w?p ,]N^kAE duZpќ9sTR%ظf!>/_JGoTBĉի,l?PH{_,L/Tڵ]kػZV-haFwܡҥKfz76h@K,qUTqAzjᡣFR6m\dbzd,Y#Z{f0W_!� -8.Oe,?u6]b}u.\㯨nIժUq[ OuiAHw^bsN e^K6϶bŊ髯]-Odr&MxߗY,X@�@�@�@�@�@�@�@�@�@�Hm@�@�@�@�@�@�(`Al۶-g%JPYHNhh p^z"hBwa-Xo ųP3gt{3g]{u׹?Bpn6SO=j,p駟q_ڵ]Y^ƍ;wn~c Re!xڵSdd-[& b!dibX{b?p׻�E ʹ!3[ގY$Zcƌq(4vX뮻R b,~3YheػZHըQõU\9Niǒ{79Z#],P&.@ݷX޽{DB�@mS:D8ի]:ڼv9{۱Ȏ;C k,jN0ARisi%B˼x XBoµi\(^C)}bA�@�@�@�@�@�@�@�@�@�@ LmqC�@�@�@�@�@� )PP!͛W[n YmvW\6lXj׮΅<9sY-ؽ{w76  P\~ݻŮrnk_,lc.]Zsi:t萾xyk-N:Zd [s/.PI ,Y[='lsܟjժ0Nkm͸:ymj-rĉ*V լY3Y}y?\Rq-%wN\_M/=vRKrm1ڴ2_@�KSN]z"$6?z[bݺujA^{?6Pp5K͚5couc%<>r6/,w֧4ϽqK$��@�IDATR{<RF�@�@�@�@�@�@�@�@�@�@ �A E� � � � � �\@Ŋ2B-e„ W8ԻG;sNuYm۶ՙ3g,||xx.\Xo7o\r |LL2%v*R駟hѢ9rOd%KY'|vŻ>4KŻ9>Vx۱x>/Z y<mY 4pl9ou|]Mh˻/]_rȗZ.)@;V[V9"@�Hms*OvJ_$3ʓ'/_nڴI۶mӠAqFWCm\"qky9˶;O_fO?/d � � � � � � � � � � Asg � � � � � h/)RD=qݻ7ʋWυ 4fZYD ͞=[ݺuwMcGFF{5kϟ}Sb6l( իN8~=K ʅ[}/;t&a{~R{oǼyy;%/ Bڳgv {l.qM|}7kk[yΘ1CjjvK_ �@-oIX,2cǎCK.O[Ν;n_bM_<͗:c ]l ʦ@�@�@�@�@�@�@�@�@�@� ɸ@�@�@�@�@�.PlYܹ4>/F[q5wѣ֮]Zji…:zh7*]W€,u*P'""Bщ',6 .?\GVTTNꚴ >2tPwgf/ykݜ_Xbe}^]s-[~x/_\ٳg=U|H]5["YPUr7G nk_<o$U �L2E{ァz`� ٲeS>}#0Ԯ3xg/^'|R*Tp%-X ^iqNჷyIb]]<dɒn}-Z(ٸs˙y?6l+ۧ@4� � � � � � � � � � @A&Y@�@�@�@�@�@g # ԐE TR%5lP?J -8>p]Zc TjU˗/ԩSɓuAꫲ<y&Lp}grJY@ϭ[MEqv;reĉu֤I-^ O?T7n'W_}z]tR}:|m/ڋ{>}ӞCcwvxaϞ=gk혻1KRs?,<ٳg]\7oެ~Z}Vޞ}RaK]5[f̘! |y796jHsva}GzW\lI. /ϟK/={Pu� lg@ N3J8?{_ڴi#FW^d{V9ܼGռy߁˖-r=s4<[os oO=˂$mmss[, }ܹn.<ͮVOB?CL2gΜ]& � � � � � � � � � �I $'@�@�@�@�@�@�,2<<\'OT2k֬ kܹ,XA]EGG > 5jBCN>5kqƺ\0^>}\[2Z`X>_0,_mu9agu<;#{-ZոaURE>)d?~ʖ-,_~ޅ [nv[{$ݻW:urav?O͜9c|yג 2DV(bh:s|IyyǶYf.LsΝD \jժ^|EnM%Kxq[-$^QVX]pM hR,ӧSP!+VL J-Z]Nh@ Xh[o�”i]s5nguXءl4f(Q…~ʛ7 gի_vsn۷\~ӦM]wݥ{Kxx <נA\-[t2eʸy <x ysk=zpu#  � � � � � � � � � �i!7m4_- � � � � � ~,ZjZ~VЅ[C=~Ʌ~Ӽg*[lڷod˗^z.d_w!*T'dz%gFEE… 0H \,_%XHX(P V ڰٳg&o%vmJVGcY= E@V c̙3?m+w.c׮] A ń:z:ػ?~̛9sfw:Z<mvժU.BH-,g}Ӫ&M`d ULبos 8uT͟?_kN۷�pZxyHmL2nʕ+e[Hos󒔘;wN{Qr\9x滞12OV~l#""\p,µY@�@�@�@�@�@�@�@�@�@�H >@�@�@�@�@�@�(Pti7?3 +V3fhΜ9z;_~UJ4{<iKœB=&8Ṅ^+„Ko-XU9 x ״>OVo'<iСCj׮]ӗ|н={^rjxێcl$%,Y ,WػjpIsbsmޙ7qI} 5k g͛7lٲ)5#�Q-[SSU Z!6Tך|\松.KMk?|JDnA$<[Q?|9r:uº͔H? � � � � � � � � �  BW 7"� � � � � �XP{M7[2|pU^]7w߭.]`,ŖС*W䰳gϞ>7o^=SvSndI {^8[ -_LbƏѣGԩS߿qyt� ,hqҤI{ԪU+.<j ̙3e>iqNzjP֬Y]H'2jB�@�@�@�@�@�@�@�@�@�_CbK1[͂� � � � � �@ŊuwgMߵk>cvaNӣGmVrJ1͚5K<6o, ñ… YMt�+qxܘ2eK-[LM4qS9rȈC1M, "@ zվ}{5*+Vw9 7n+Z6O;C{Nmڴq?˗/U @�@�@�@�@�@�@�@�@�@�oAzS � � � � � pM6U:u{]a q~G}:uN<oY:ureʔIBϞ=+[.}W`=W˗k.jժVu޽{|H 4[*%Ko߾:t^u} 6qstxMΝ[2ew,?<>mڴIC S@�@�@�@�@�@�@�@�@�@�Y H@�@�@�@�@�H^k׮ ĉ8\ jʔ).mǎTڴiVZYfʟ?: e"l߾] ,ٳ5o<aÆ[e]wuW,�A(W_}Uo[K~^y]=?  � � � � � � � � � !A � � � � � @ڸq~@)ul޼Y3fpp-ҙ3gTF hBM6UFTD K :QQQZ~~WO.v޽nRv\VR zI3 ӌ@Oz)}W.1)m67n } fA�@�@�@�@�@�@�@�@�@�@ (jB�@�@�@�@�@�ҫ@BtZOuW\Y>:~7͟?}'PR\ dÆ Un]ծ][r}.B�˗.]'Ox.g@VT)u 7@�R|4iVZ_~Y:t_~XzR9n ߺʧ~ohhh G  � � � � � � � � � �x + @�@�@�@�@�@�+ȟ?ïtxW̙լY3Z.\իh"kǎ TV-լYӭɂ�#۷k͚5n]rVXȾkԨ;te˖M@�PSjӦMz5p@=ӧ{,Kkj޼kuY!!!k0T� � � � � � � � � � !1'_#bK&EA�@�@�@�@�@�җرc("""}_Zt-[UV?t=+V̅UZU^n͓'O VDd|{jÆ nݸq֯_uֹ?,Ѿ,Ղիe˖ae L, .{.F�RLѣ3fF!mڳgOC*TH~i?oV'Nٳ+W.K PկqF�@�@�@�@�@�@�@�@�@�@ LepC�@�@�@�@�@�-0uTuEΝxիWk͚5uV ,Y*U뮻m=eʔQL7QL_o߮=vݲe۷$[-jժ,>gɒ%ȴy%j܃�M~g}1:tH5kTΝթS'թSG!!!mH}iڴi.�r1j۶ Duz @�@�@�@�@�@�@�@�@�* q3X@�@�@�@�@�Hi 覛nÇU`.Co.;vBn޼٭6mr[ 5- B kZ\9-[V͛7o2a0-`Ν;}l۶ͅ?Z�rʱk*UTjU]s5J ȫfHg5eY޽{UHiFrZlŋQrO>_~Es?k*G9X~ǎ?70*F�@�@�@�@�@�@�@�@�@�@ �A @� � � }YU{CnAT!*ͮ%U,X#X%Dk7נ~FxFMk1EP)" Q|gmr& 2̻gګs6OO @�6F7ވ=3 kKAO3lO81ҹҲe,2k.vlSI=EEET`…1uԯ)SdixlՋm& ?MA%7ҹf լX@ c=zt ></K.w1z_o[Sc])^xWJS�ap@xYs @� @� @� @� @�Q@dukL� @� @�رcK.oGn v5i`yL4L<9R^|'|Rn|c뭷B!S0dn۶mi&rˬ $&sDy̙3cƌ%?8R6mZN۩^~_~/Ma۷>+Ӽue ,i P)9>3 /kK,VZ{u*)N:>*_ pOzN)=-)dsς6铽U uJ� @� @� @� @� @AVn @� @� @�! ;tj^c>ŋG}SN- Ka|2},oѢEͤe˖Y8d \[tM#֭[g-Zv!lٲb1gΜlBf͚BGS�>K)d4<Gaiݮ],4Z BB@! f+ȑ#`  ѬݢSN\[BSqV+cƌ}L{gt=+=z-آn @� @� @� @� @�p A @� @� @�Z$иqlk"jÆ cǎYY͛B|Ia)/}ݒTxROV`ȴNAo޼yV6m5ZM;'… ?篵̝;7V-)1u ~L׭^�B:TRci}ݸj PpmJU1~ "z(>ptcE OK "Ao>v۬lv%mFzo-eŊٻ)S"_&OmDzWNKfbvΝ;G^r;n햅`<� @� @� @� @� @@E ha @� @� @�J _֪yׄɶh"RIa5[/_Ξ=;%|`>\0S` &\3X0_z"B&l7i$RhZ\*)8(ogCi/x L%j[nԩSg%7͡-[i͒/]4+K,)NŋTNU*_|EVi|̯ScWug 'J)3֙vuגc)1֭[g봝>' @v ^w#~xC:rj0)qܸqY8qb> ~:uj. cUævzI%_0t,`i/}kYhvZƝW FO۟~ifszWL!)2>}w}SN6fM� @� @� @� @� @ �K� @� @�`g)T'ҳLa<)d'BK>tgdSI)0JN>d?&WZᆎuN˕e5&|50~ gL54WOTB�:1xpěoF\tQG.{-p=zde0ۥ3g'||IbȑB)<aٛmYΛ,1Rٮ]H%_Qc. @� @� @� @� @�* Y"@� @� @�DNW%SF JE-K,H:vˣRdie##QG_JQQQԯ_+AٱNBz  @r9ӟFxcľFѵaz/z뭳RVRw Ce˖?c?A+;Xw¶Spv ~L%e>SG� @� @� @� @� @\E� @� @�X8X)L1\~wۥ"6 @ ? #G|; MT6l2u޽{ׯ_D� @� @� @� @� @@ ԭD� @� @� ?Y3-ZD̛W L�'F~xĉ'F1n\WMd-6E @� @� @� @� @�F@d&J� @� @� @A @�X4⪫"u2%"n-bM oFD� @� @� @� @� @@(~C6b @� @� @@ @9 ,GLM @�%KELӟF � @� @� @� @� @�j.P  @� @� @�%xl< 6,q Yޢ#@�Z`܈sΉx睈.YE @� @� @� @� @�j@QM9 @� @� @�J ٨Q~ T Ja  PIq+VDuW)TRǺ!@� @� @� @� @� @V ԭ6i @� @� @@ ,Z(kaÆԃf  ¸FA�l)GqE'rD]M� @� @� @� @� @@YAEI @� @� @@/^lԨQP@HAWϱ5 @`Ŋn5bg喈V @� @� @� @� @� @AV @� @� @�Z$_dmܸq-F#ͫ37g @ e1dHGѫWu @� @� @� @� @� PAVe @� @� @@ ̝;7c- ~H`cG|Ѣ%K6 @�*O \z\'/|3?hذƠ' @� @� @� @� @�$"  @� @� @�'lٲe5%(:7/b pD�XE`ĈΊáQT4&#SU*$@� @� @� @� @� @@% ԭľtE� @� @�)QFY5Z-jd0y @Ϗ<8"rLnWUW] ܩmp @� @� @� @� @�lA5 @� @� P)e˖ܫT 7# a>ѥKăFyXnE]a M� @� @� @� @� @�rYΠ#@� @� @�jٳuֵk ZqM�TK+y ѯ_āFśo~{ԫWZˠ  @� @� @� @� @�9 kν4 @� @� @�f̘[neT@+۟7b: @`C?K瞋xш;=˳ҵk iN] @� @� @� @� @�T a( @� @� P[Om۶7Z$P~D& kM7U P<8#>:b̘#XbEqѩS2dH @� @� @� @� @�MEiJ� @� @�hN;Ut7'P͛G̟_C1 @ }wGhSo71rxW?- @� @� @� @� @�RnUvo @� @� @@MHAm۶i2kHaK @� 93c#8餈^=rĉ$~ǮZ @� @� @� @� @�*?s_V) @� @� @�Xti̘1#ڵkN k}4  P;#OGx(..3<3:tA~ @� @� @� @� @�V@d� @� @�A'O˗ga35hZBTA8A�TYD qln1bD924h  @� @� @� @� @� @ AV!  @� @� @�%0qlB:tY3,a @Bzhed&O=ѧڻ2eJG?!CĞ{J @� @� @� @� @� @ Vaߺ&@� @� @�(ٲehժU(M@di2 @�)0wnĩF|QGEv!߳:+fs"@� @� @� @� @� @@ [K"@� @� @�r &Dj&;iJ�TOF~zĊ>qmO=TѰauWv� @� @� @� @� @�U$P- @� @� @ 3&:uTeBJHAvq @ˈ?C#oeB M\rI\tEѳgϯ߹+  @� @� @� @� @� P +X @� @� @@xw[ngfZR� Pw޹{oDdРA[ĕW^j @� @� @� @� @� @ AV!  @� @� @�#`2e ȚsKͤ ͛G̛Wk2k֬#kv-5Pqqq'8∪^ B}#<۷'xh#|yB#'b#~;b\jnƍgwQeo<cqꩧfK  @� @� @� @� @�6Jhv1 @� @� @@&fnݺ!PkZX0bٲ2/)N:Ϝ9sgaÆ{]0f+VȅN 4]^P8iҤ<yrIL1p`ĨQ\q{o(g̘^xawy\TEć~Xb/#FX} @� @� @� @� @�*Xk5O� @� @�ѣGGӦM}cfI ' 2LGtP,_<N;Ź瞻K\z"&;VdVg~:~eS(g< \\ 4hP6V PcnE,Z u,{d}zh{1/~}cٺuj8ݭz] @� @� @� @� @�) <5E� @� @�ZW_}5sϨSN50'7os<LTNl27o^C3&+O9唒4B}ضv۴ PsDpBwpֈ##tٰA{ǭޚAzXo-vڭ~p~Wj� @� @� @� @� @�r(*Ƕ4E� @� @�J۷kA/ru]1nܸ,L(='xbB mq6dAM{'OSO=YnQFEfvlٲHvmqo~xw`1cdmn|' K,Ɏq%ij>]STTӟaÆşxJNLgiӦvŵ^[2@̙3c=j*e@X3>a„8O>ɞ?8d=C=?k+VDK/{.F۸q+cǎqf-'RXeJx <묳{=56X8=dA5wO~g}v<S7B 7dYy(Aw3  @� @� @� @� @�+Pr @� @� @ ,\0R\k̈:9wYb dLC'tR?裏v)>㨣Zt_5:-&M}' L3f̈;,n|ۯ_,Dygv<I).͍?> L p1{{cq9'+..H 0 ֭=Xy%s?O(wgt=z/2ݺ~Lid_:zJ{Sh~=)1^x1o޼XzSdZwK/sL}ɓu=*ieH?aG7>⭷�g7οV[)cn( @� @� @� @� @�Y&@� @� @�j+VR+I*2rBx1pH!)pqСѫWcPf͚E:uŴҵkxw⦛n*R�/UKk ov>,2'Fz&S[ Js=S^{ƍO>$;Sk q|OS(),矏ȡ%5*ӝwޙҥ>}{阅@oӦM.T~M˺=C=)-=o)2=iI1;#->m?3ޤI8St<Ou=oǚ� O~rs [ ]Գgz(1tҖ]8 @� @� @� @� @�' r\M� @� @�뮻.֭n- JaÈzKE>)зolBJvV֭[ Ci;-}Qƿ/YS pLeѱc,mѢEYݭ*[s1Y;^z&SczpǬBtͲe;ƣ:*ZL̎5L[eIv IJsN"Y+/_{l6w Kc7o*$P]Ξ<i)qͥg<+3T3޼y8cҤI1bĈB \xq@|0l!xYA:ȅ-7ވ\:vW.3gN{%7VZmW^Ym @� @� @� @� @�!PT0  @� @� @@x7e˖wFN`#{>%AlZk@\m0#OӸ׬ZBӒBW]ڵk~x<1~ژBK~U[s;~Y7)o{)^[2jl,?=ڂ פx/3{g<]YgW^1tg}g;vuu5/P� ̝1hPG7_uK;~Ӓ> +28−wTg}CΪEe}}]TB� @� @� @� @� @@ D޸� @� @� P-̙ӦM.]T$XѬ^xazlM6%TR9ѤIlW_]p_̙3r|)$.Jr-Y@\ :b̘1qFÆ cZSRϞ=cq)vƘSݚˤI<d@5<sYT< {<EŃ> =e}xvcշsj/F[G<DWoxd2| 6,뮸馛SNI2? @� @� @� @� @�5O@dͻfD� @� @�TߟvTb"Pg dy6#F6^{-w}u Kak˖-[޺v:vM6%UWX9N2Xi}.,8JA��@�IDATcAe7 .UL\rIl?9nHcxsVt$ vrK(kM ^g<U\x͵< O:餸Km۶qG?~ӺZgN;b#z+d{X]f ~c69W @� @� @� @� @� P d'@� @� @�A෿mVkpc!P>l[lOL81zfŐ!Cc[mUBo3fLL:5;_>(; 4Yd\~,fl{gug͚\֭g}vF fL]v?7o'|cM{1cƌGof͚Ń>rHtMq)կҶ􌧹 >< fKg;NW}~z> Om�-Zd'xb:TOˆ<eZ}j@z=H)2U[ 6N%?0>olF ֭[.,- @� @� @� @� @�T@YglʫE @� @� @� WoT|F6m wFFFwuWBnjꪫ>/xxǢ]vY+V/1lذرclqƜ9sP:uDsd&O?8+ij>O>dva1tШW^ҵ/B4i$7=V;}-dפ)ܭuq1ǔMgqFO:}ݣQFq7wǏς,_|quRhe]JڶA: Z#;_?*3g<=O<H<Rh>)JAe)Tu}x<w=Na(Nr7fϲsƞ{Y3zUPBr?ѷoD.k0rйحMfuqqqLzXFg}C-_dI\q1o޼]q%l @� @� @� @� @� Pyur8eK/� @� @� P.]ĥ@gp5z&G` vxY!,E̞=;y,1|Qn,qsOX aL!fmT- F-JB&S˗ǴiӢC<Vg &D KB �`}xzVR`vmgd} ͟??R٪k>,xvcJq5A -^q\kr- ,ۣG~}}䢋.뮻n{p{ͪFUC� @� @� @� @� @@ Ux: @� @� @�@_1q3fY)_?΅<m歬馛F޽Kpc†RnVj;fEEEe L d]|XkW)hskAP`}xzV[n3Լyts :Pg<Uw@u lj'F^wD X32dH|c}Ee}6ʍ}P7Zj;F� @� @� @� @� @@% Dl] @� @� @�5C瞋+"5jTN5cbfA`Rdzucʔ7ZR}vب�Zd*0{GӨQׯ:j8Ef {ogGtr_y晸cϖ{5uo񲽨s1Q~@b @� @� @� @� @� ^Nqn)Q￲+C� @� @�(,1c78}'w7pCa hT@ _Z =U.?]}'`Z__VK>-2O^zgPE". [";/k#6,.\0ve8qb7^Z,}N:4˹sF-6  @� @� @� @� @�zE_2W @� @� @�jѣo߾ѵk׸;3qiV0̘@N[o䒈y PS/YS̋@ȽFNWqdMb„ A-hN35E @� @� @� @� @�Kn @� @� @�Fo~Yaâq1s̘;wnNU3((�-",X�c @@ qG^{E4iY8 @� @� @� @� @�X@d� @� @� @�-p'pBz1|h֬Y6{/[wԩ'at*P A n4M�T_D~zwq9?Ѿ}H @� @� @� @� @�E|O� @� @�0/ ͋{7Z_cǎ͛V[mq;j@ LK1#$@�j@71}z#DydM9 @� @� @� @� @� @jVmz'@� @� @�@qqq.k⤓N޽{ǸqFwԩ&`4*Y  - @@뮈h,7@֬k6 @� @� @� @� @�T Ȫ7 @� @� P0-[o5usLl6oğhӦZ9vXAkq6 Mw\  @|eęgFzjĠA#FDlmmy @� @� @� @� @� @* = @� @� @� W`.n?~|qfu <Wy5Z@d&G�P"N8!⣏"~8k!) @� @� @� @� @� @AV0  @� @� @�(..'x"n6lXlqǠAM6eSN.]Jj@&Eq޼:C"@�G{":+roѾ}홻 @� @� @� @� @� @2Vfg"@� @� @�TE⦛nΝ;G߾}#9{1y2@97.RdjB h1~Ē%fE~Ze̟�T~y'q?/z9$@� @� @� @� @� @ Uׁ7 @� @� @)�cС1px[nem+Ǝ 6:|jG1{vgE̛{#^}$6lc @�ÈSy}EpBah&pNj/ZǩvZ񢢢,~뭷.9f� @� @� @� @� @�Yz$@� @� @�*I`>ʘ;wnwyqG6m6zcƌw1իmi@uHG:uZ=5 @�xȅFlMkEƢ8ꨣ駟^o#=z!eR� @� @� @� @� @@ ԭt@� @� @�rI6ݻw . ?0aB :\B tƎ;w@ pBD˖CG: @�U'K.e1D)FܿS:K!YI @� @� @� @� @�*G@d8� @� @�$e˖Ő!CGѼy=zt׿-ܲ\G0f̘ҥK1AaÈsΉ(**}KFvX!@�N`ƌᆈ[oƍn<z.޽{GݺsַU>j� @� @� @� @� @�(_nT.&@� @� @�Tx`xq-3<:u*,^8&N;w.5H: Ki ӧ @�#0sfރKo{Ĉw6-#:SN;R]^\�A曗Z  @� @� @� @� @�*O@dY� @� @�@{/wf͊#GgQaѥK C Y`"Hk.uDѤɚg @�-pG5k\`>DZ.Y~u8nݵs+VĩZݧh @� @� @� @� @�jo @� @� @�Aߎ޽{Gv_nݺUnjՋwܱB8Be˾:ܣ}# @@ <HCEG{lo\>`\vY:-ZTX^5-r7ׯs̚ @� @� @� @� @� PE ^ @� @� @@L>=;i'-[Oheرo|#4hZN_c = @RYgEԩ22̿_k3#~JDSO+VwQQQ._4klv @� @� @� @� @�:AUgg @� @� @`#/^w\4i$׿FӦM7Ų]>f̘ܹs*E .Wo nuYW?f�X!C"YzJoѻwD۶oѫWŎA!pGDFV̲bC� @� @� @� @� @@ Z @� @� @�!pǻ<Hlr#ZڰKSd.]6" @O_=~5% P?q+W FqFĖ[zvMhܸqQTTT2M6$;찒} @� @� @� @� @�T ȪF@� @� @�| QF/ԩh]lٲA~=>W0V" HiY4Wn�xŋ#Ճ#~{ͣk Z{KZ^ 6S67 @� @� @� @� @�N@deL� @� @�$GϞ=cРA 2a„XdItܹRB85i|EEX#5. P2bK[/b޼8S>hٲe6 i!@� @� @� @� @� @A0 @� @� @ Ç_~9SN(*cƌԩS5%X`="szhҤO  @@5x_r!i:)$2EvZDqq5~m\:)]馛悺%umL @� @� @� @� @� jW @� @� @� ˅+}zj)};iw_q& X"ϟsʢEbҥY9w{+zh|ԯ_?+ 4(nԨQl2+͛7u7j Pg}/2,Y{o`/Siڴin:Zj<r츮LPr[n1p`ĉ'F.м<zFU,^8.\XR⋒ݲe˲ߪm&fϞ=GY^mRdM+;p*LI� @� @� @� @� @*AV  @� @� @� xW^_\ .]CK P)Th„ ƴi?.Yٳgg ,R0w|jsRp j֬Y 馛V[m޺dW;v - @Rĉc1eʔ:ujVv-3gN[B6vIA)r6׮]vmK֝:u6mڬnx뭈|"� \ SvLM>=>쳕>_޻)x4B,Æ T6tiܸqI0d>4}vӻ[ZZұ-s.[ @� @� @� @� @�X A� @� @�{gU2c\%} QFeߏ|I!W+"SO>k׮y.I*ҢEu&M~.m*_QsΘlK.%KDZK 07o^_ϝ;7f͚"0#Fdii[n;FnJ�l̙3@7|3Rw*71#%֥pToO>}VZE*).` N^z^ u ϲB'|M7.|,9?GΝ[^{{)/-@s'Gxb ̰*?< Nړ'O^-X;?K*wm&YIvZ箨(xgH &:mV ou.PRGZ`aiNm۶)aivesKb-VeM� @� @� @� @� @V Cy+[jQ; @� @� @� *r}RX^ӦMoO?z HSJKode*¥va,*Sرc+  d%tĚԩ7Fݳ r \|_Ͼ;J8BH{)g#Gf%%]iy#uo]Kioٳ]v%z=s9͑I'EB+{䵫E{wݛ~ޯRI)~i F vmW D\51mi&5jTrMuH3.g8ziӲs,;t落w.7tJa @� @� @� @� @�6H@qL� @� @�Twgyf|'U*{8qb/g!<ݿ&xxcĈp"}FSPі[n{W%}5S-�7|k1cƌ,HgϞYI 6s2H* PqK &<OSO=7`BSp{[^W3u.#TVrKo?2>y{pp5"TPS`a z|뭷J;=$%nnvY0u 2L%T*bW8)Sbɑ^̯7<t)4w9[7nܸ'@� @� @� @� @� P-AVf @� @� @v xge>U!裏F~b޼yѼy> ̚5+ [xozo~zv(_7>,֓&MMơ=~xP! & rüԮ:}/B4h o80W\dx粠voGf⨣N8! W𘂴Gz5*,X>v! #L)sι{ 4^W"Ǎcǎ>s=f̘Hc,5QTTf#@� @� @� @� @� P  @� @� XlYlfqWJ]_}&NZ@^ +�Rԯ_?88##̂ uk:AaÆų>K.}7VZfs'PfAeR ,Y=Pr-sE&Mo}[qaeU0*>ʂ0x`M6p9DݫdLcYx#23gfa]v͂w}H)l0},U#"x7B:_{H7ګ$= p  @� @� @� @� @�" )$@� @� @�\B>Ə;vO?=MO<D)ŠwqGouF~⤓NC9$RؓtO=ܓ@wi>~3j } u~atMqǜ9s0ַohԨQ5},4[owy'Rc:>zxgbܹY0t c}={U}R~G]n̘1/Nj//B#e|pG3;{r% @� @� @� @� @�YZ'@� @� @�I`С_: b,&7=zd!1__*g7}Qx1p8yڜ9ǃ>wuW6Ĺ    =U@ /~m۶qgg[ou{饗[nɂ!5k\rI|{߫a)H{Ĉ#İa"}~S޽㠃>}DnݢN:| )�g~:ĤIe˖q衇ƑGo!@� @� @� @� @� PH n  @� @� P1EEEZOk6>JX`̙qWgM39رc-V)O0!n馸[cٲes=dȐhӦMwET@d5q5l)F\ve1`콰M¦'u]K7l0 QFgU4S_O?w988b}S}có,No}[ѢE*.  @� @� @� @� @�.Pw]{ @� @� @�?O nԩ`ҥKA5[`YU{+"kY>k&dyOc^X @j;w#Gwcƌo6l_2&O{n\yѩSx7¬>\rIk.9xwK/[oW]uU0o_jw . 5kVqB?,;A6,Rx� @� @� @� @� @@U *y @� @� @�e6mZ|'ѽ{2_Sǎ5ˆ,[c>~_Ą ⢋.MwW[C 'd=H" T3<ݺuYX;u3#Z1nܸٳg0>:f̘1VɵK.Aoڵk<YߤI"ȧ`l! O:餸SvmYQG۷Ϟ3g"@� @� @� @� @� P|� @� @�P1cdteC/-i [lEl֦L<9gyf|1~ QFp*Y 'tҽH$ݛt, P9˖-GqAn^ 2$4hP9%k.xgwߍw9^-f`:thwG^>+]vYvZL D 0 o9nw}d`:%@� @� @� @� @� km7i @� @� PRo^!cǎ ^wh"p}Ů~iqG˖-r:(A鞤{QWX9soC<Ѷmۊ޻w=ztyY+ V/ɂ8cԩqw~W6H_~y?1F}SN &� @� @� @� @� @՘ @� @� PcRdU0 Ȯ]Xc<Kꫯ /0 4L{k(N:mfѨQhذa4k,}-kHl)Y$EBWRZ,(Y%B(?3gƜcz<s<{뚇z˜ٽlܹ]` .\XyQ)j@�.uV5h@Oւ TBNgȐo֪UK<6mڤaÆ),,,h}QFw:yyu]o  !:ujֳތ3K/lٲѣ,{@�@�@�@�@�@�@�@�@�@�!@d T@�@�@�@�@�T`*]tV^-[4GgϪcǎ0aƌBg.9J:ﯚ5kC.�F.ѣڷod:|,ӊF*UJeʔq!UVUjՔ7oD5F:�\km۶oV,Y4w\{ڵ--Zy?Wʔ))ņ C_UϞ=]$|$7nFiܸqz5vX <\$3@@�@�@�@�@�@�@�@�@�@� trD�@�@�@�@�@� l߾]׏i v\țQu}iԩ5kիߪ8/{ϯMʞG6Ӳ֭[qFYƽFW^yD[uw†2d x9➅2eҜ9s-[ӹdlbL(yUTI+V ."E nZwy1|P|ÃD�@�@�@�@�@�@�@�@�@�H) � � � � �$m۶PBl8Wvm-[C_wޚ4iONd^N kgЮet%M4*^ }7m$g̘ႅOiF9stB},(�$7Ν;9s&!r-9r{=}WA͇={<^?3!A 4hӧW~O?;w@�@�@�@�@�@�@�@�@�@�H`5Q � � � � � �ĉ*XCYf*Wo>j…c:,2C @, hGVݺuc9]Ç}.̳I&~w5{jԨ{I{ɓ5j(L2z饗Զm[H"z/\_~Ņeay<;nSxxM1}R⯟/a\Q/ĉ5gϟ%/vءz˅!+V.dxٲeS7;ŠWu] 'O8C-SN;#ӄ ߺ駟~:z{ks/^~m HQU@�@�@�@�@�@�@�@�@�@�@ Dԉ� � � � � �$X~N-[6>uT? ρYtiR/&uUڵk<isF|kرcGwMƷΝ[=Ν+Vz\Pڵkc.т$O;wXaao/eAmV .m۶>pŋW̙5{l{) xgԭ[7yI={'Tɒ%5h ;v3VZʔ)uֹ0۷_v0,Y_ڪ>?i$7$HC9x BǏ(}Vpz ]v tȑ@�@�@�@�@�@�@�@�@�@�0 @�@�@�@�@�@ Q X@9sY@]~}+WN}6v%߯YFeʔdW`:zyOI2zW4 b 6S8_~ڵMRBYEdh5jciӦUΝ]pdz saaVRʔeر0`z)5l5e!eO<^{5͛7OYfɓ'c#�>aÆh\_IpcΝ޽nhG{nnZ*Us=EF.ӧ׫#F(AQk[7̓QO:ïE>n_;ܭXLgϪK.W] � � � � � � � � � �  � � � � � p 8Z͖-u ɝ; *nݺi֬Yڼy6+΋阨YP 4h wʕ+[lQvػwo͙3GfX]ˇ~]ۄgʕoiӦ`X RJ1v5fΜٯcUXQzcl0$ } � >mn�[o6_СCz衇|_sB w-_ܷ?6ڶmٳkȑ Ue?~\? G{`(}(>#G0~x͘1#C@�@�@�@�@�@�@�@�@�@�Xb@�@�@�@�@�@�<xЅE I@ǂ s=O>DB7j(KN_ƍ;rmܸ H8 ۾}:vxpY͜9SkZr ~>&M${ٳGUTQ^%K_&Lиqta/^\wum6… 1cF)RDӆ t-h޽;w{^ :8qXkf\,Шo߾nsn 'OԎ;"E 3FL̙Ӆ1zt߯wyDž5x1iӦu.{^uI[/֘'4m4=Z| m\t,T,*Z+{wgu|~̟?__|V^5j6mU!@yB ώ@J_Ls];>Ȃ9gT[[>cj޸;c>}Bz#˻'OVJ"uiҤq6 W]ߕ*1b"""vcJ/5߷o e˖)SLy2yς[h!N6ߦN:~mۚ]vC;1QG]3=efxdS[}o-~zgz#oeffkM+ѭ;/^, Ob&M4tP{|-DL[G ԩ͛;[Q@�@�@�@�@�@�@�@�@�@��A<@�@�@�@�@�AfϞ,WXا~W^yŅ.@Bʔ)ӧO˶wJN˦M\Oҥ= .0"6,/tmݺU.`gܹ. uժUѣ �pYz!]V2dLq l߾n6͘1C}ڶm -ǂ--p_U^=j={tI֮}ݲ0G {` gժU7o^76 \N(PekjaHnBAZ,?TR\=s,)}.|֭났~iwXP;~ɒ%ʖ- & XHې!CO꣏>rQvcƩ.F�-h"[v 4u%yBׯ\rGڵsϻSBb*y+-O<(6> ̨ ՞gsRJL/X0v |fiv<hk+ J0nl*k R<Vmdhk5jD>s]p+mk5g~[o9cYxS*i[-֢QγT[cX\lMjk}֋Vlz"fa*Nue@�@�@�@�@�@�@�@�@�@�#2>'q � � �t&5��@�IDAT � � , _|ѷ[n.qn߭BY샅_ڸq,BL,bkVW" Xh  ]Be@ZHX8Y\X7ȂRLB|ҥKT-4bSeCV6l(oRY@�-g!AϟWŊ&MdRg+5kTL\@c~ D\,T+jՎ'rn۵kRD d؟d>& efle#G=z3X\9Y P͟?_v/XA[6l%;t<J 7nFoU�@vk! ]-[wyluh֕+W>sͫ\;|{yz-(.޽{]Ux?{]Bl/^ ۷/!˗'xr E O=[<nmck*+?B 5k�ZlٲZۦL}f֞m%Qt sz,,܂-nnWvwnkL i=5Ҕ)S\}o&?u5O n]8o<׎?뉘cK,ܮkR@�@�@�@�@�@�@�@�@�@��A<@�@�@�@�@�X]ԨQYϟmZ8YpZ,2_|ʘ1c\Oxt yכ7oU,`EF <r߿X[=#~wp.B,~Nnjs)Rc-B ,XŽm۶\E v<1T}ů5duر 6m ӌڧi^f^o lݺM L4Ʌ5\,$ʊGQ@�ɓ'67~ݼi׎ _ւ6yKݺu]u|Kc7J֬Y]U>9s}x1vU;̙3+fy,Y4qD?޷޽[C`':rs[*Tqvm[읯ݗ 7;`iAq)X\wunmʔ)Z[;QB|!ibz"}ϻ~=zh|N@�@�@�@�@�@�@�@�@�@�@"� � � � � �Ȕ) ab֏?׻;aaa1ۗih#`Mϩ~ݽfh"y_Vr?<󌫻M6ԩ6oެ[PC O7o^ :TJɓ/w䀢4iê^ ƍ_v|NDjMk xzjw?iΜ9Zx/,͹S/:[>wtMnӞ@+`r~LwMDt-΂޼y;*U*լY}>\Fwoe9go^ZyCϓ'efK/PK.uk(o DJGڧ"E{8.s{:mQKԩ.o(i9ϊە~oH) � � � � � � � � � �W q � � � � �Eɓ*TƍǏ_ۻȏ? $; P& k0N|ڊ|N?M6]gϞ~W*Pf͚VZE=ϝ;oQ˗/Wv\{ d|R䀢oNvE|ʔ)Pvs|;cٸRe_5kӧ+""B:1BOV˖-]esZs/W\ywv_Y/  #GhΝ] Ʋe& з-[\rjqe˖uoܸ~ر}._%u9rYԩSG}SvY?.;={/\зG <|us('~͐!n` � � � � � � � � � @ 2^X� � � � � @R8qℊ+, J%cƌ0H 0*֭Sɒ%:Ifz:ro( / .ϺϏ<vޭ6m?tA6?<;> |ꩧ;wn=ZÇw!C&MryN:嫦o߾�Ikӊ75r<;ƂBX;ގP#oxݮ][ ],V޼ya߮>}ڶm|ӯ~I VŊ/;zA5kt/h"vڗ$o5j(M4={vC3ťQ맷qRo|޽;m̙nń(xWn@TSN3g[v^%Jpycҥ^رcGmݺ9r扼?![E/lڴit_i_5@NPYOؽ0p@޲g@�@�@�@�@�@�@�@�@�@� _9C�@�@�@�@�@�X<u].1F-8m?~P'Oj*UT|d.PHtM&ݽ޵kWeʔ,q裏ԣGkNw} Aٳ0+k֬~믿v!v7\N:ӧ{=y_|E}7z1 .ɓ}YȐK~ecҥKM6MZҡCsNM2B&x\#~aԮ]Ş[foD*i[ܫ\ :3ʑ#GK/Anݺ] Ѵ�-;vY՞={.-qmVv޽ص J{N0#gΜիo @ ԰aC9217#WoY lٲEW?lٲ}W:}?\rZ'|{9k,7ϛkB{'>mN7t!kf~? T+5N_zuuAӧw}={~pY(g\˶m)w`D~m[WE]EϝGV,t{Ĉ*S:ww5xElm-Q>n%r]sdBz"*  ;H-  � � � � � � � � � @R˯$<_+� � � � � �$رc2eJuIo ^кJ޼y]?,tVX[nEq Yn ʳ@|r,`"s,(ɂ-hѶ͛BTׯ3fh.<Bs>3]> L/dEc;*\pEi=C՗_~׻f͚@$ ̲S !Zl Jӧkۂ$4d׶lٲ.�2qD%J}ٳgkΜ9;w|AUdIɓDžX9W3]UtiߡdAaTigNr}Æ5曺]X];eϴm~ M P~MK,qצPB. ~r[LZ01 ]pQ\UԠ( N K ߕ+W.5badcg=6%4o͟?=Bs: ȑC4i $X7vB W7Y裏@kG ՞l[v,4e`6XӞ6[n Qs,0W_ut'a΁h] "7�:PmY1]zu͙65iܸԩSm 9ξ4i[DDDh޽4O> Bܼy uO<ټj5ktk#3ffv6/[()2g7[eVZ傯m}vZߎۚ/]tMo m:S 5^cnie[Ķ麹/jo5j֨@�@�@�@�@�@�@�@�@�@ Gj[_߽S@�@�@�@�@�@�hٲ =z 2  F:u,ѣʘ1c0$*РA޽ۅY@NU \Pݻ'O I& ~ϻY(s\ocAD̙3uY:sxxT q㣆Z8 ZФyv<cٰvW|K;|͚50` ~ f,Z J8q…G=S S͝::]m pqt݅itbo+WtŊpO={|vtt/,lϞU?{?/~l]hq ;} dЮm*Ur!bk-Z�c •--1jwƍnyjժ. iӦzUn}uߝw´m}ak,YȂWC$`[x ><H/ � � � � � � � � � @"HD@�@�@�@�@�@�ߴp;jȑzW<0` vɝ;7!L،X}g$gY`EWk Z4i%~Ȝ9̙$+aQ�SN-{yKT\ث̙3Gv…}ۑC m;!6n߾]ӧOٳ]@֬Yܘ,*r9x`䏾m 1c&L~4uMO>r;6g%ur;JbaS7|sBTE >CUREo^xmL_|q >}޽jܸq?j۶mE>iA#rݶC ?n׮ @|k6|-n·rsu]wv-9k(}֮,;j:/|:u{xӂ@�@�@�@�@�@�@�@�@�@��AI22@�@�@�@�@�7c}ui 46lmJ$'`cǎU&M\믿hشiS)S&}R҂>s=۵vZ_eH38|N8KK,т 4w\[NdٰaC=څEM6Zh3w8 :˫_~.’-0),Y瞋uHժU``īVŋ}C˖-]-[ͻJ Vnٳg+y}yQEbl^JڧO˲Y  � � � � � � � � � � !@dB(R � � � � �L eʔY8]Ztw$H{7nTbŮXצMb'Xxȑ#u}zeL*Ud/ʿ ѣ>#8`�sɂTΝ; 2c3f̨Uu֪_֭+?F/UL|@ z@ D{1\RmڴѴi1DrYߪU'< _ouիKcǎ+ԩS'J> uAFR|_[stY-rmvWu%1~ςg̘c</@�@�@�@�@�@�@�@�@�@��Aqp@�@�@�@�@�?~UV>_F<yb<}j֬Y%qh׮, d+믿ʮ֭[]'#""AoWɒ%eq)zRr_Z3g.9+Y,ȗ�D'0d;vLM4W_}+` `N[k=Z5 p1W_`A͞=ۅ0[~z-}1x X tL" vXX}6.]:&qXv잛0a,H_~ʑ#GjP@�@�@�@�@�@�@�@�@�@� ?'B�@�@�@�@�@�k$&M:tz d`M6Xbh6@V?~lRժUӗ_~*U$#%K\�Б#G\@}޽{,l… :|^J.qPvvHRL5j !lѢx Yn)8`<BΝK(C/{qk_|QM6M4bk]fzYF}u#[C:uBzLt@�@�@�@�@�@�@�@�@�@ q Lݣw � � � � � ҦMSNq;"EmL*cvլYS/N<"#kaפFթ6O04ڵKk׮e!Y3ft#J:è" 0!C۬Y3ٳu(?rZz~7%͛WCʕ+UD 5o\_ 'N$ҟ駟\hrl27N;!!v. � � � � � � � � � AU � � � � �$#4iA-[\A>4/_>͜9S|{UPA&LH6OkP|ywM^{5uRs]2%KZ8q9 W_M7ݤTRas[J�.˂ WZ%?3]p!9"ң>[n3UŋUj8ʔ)ѣG^zz'U@|`vB\g{π�SNuA-Z}@�@�@�@�@�@�@�@�@�@�P 2TD�@�@�@�@�@ MVN A z4|RHݻ@ڵke˖S~䃐HFjfB=!A)dK4nTT)uLu=_?h֬Y.H.0@�U,ԯm۶0.Y,X2O=RJiر5jƏ9r$g}<xmۦ_~Yg6ߠ*Uw֭[}DzW ""B_7on6\ҭ7n=w@�@�@�@�@�@�@�@�@�@�"@dPi@�@�@�@�@�+1cF;v,< ɕ+ҥK:8,ƂeΜY~,rĉ&J`֌ޮ] &sIo-m -Y"o/M.OxTԻqc4h}jŊڷo ; \�d4idᐭZҥK.8wƌ믿^>^^Z:tPّ-[6=.w۞ɺ'o[o*㡟 /p!}{vwgܹS PajD�@�@�@�@�@�@�@�@�@�@ @@�@�@�@�@�vtѠw`*TPۥ-PjU͘1Cf;wnZSdIO�ڻwoIћ]J.%-_.i#-U Ut10ғ%9rxB"=)@�x TVMӤIi&UREM6uUa2<ɓ>|ʔ)# 3ÿK Rٓ?ژvs ߿ʖ-{LӦM&I9b!ߋ-^M7t"98p?[ڭ !p=" � � � � � � � � � R\dk;6j@�@�@�@�@�H}Y:t(ڵ5y䠶KcDXn#G Cj޼ҧOPcpAb_|{Y߯GyDJؿu;b 7̒Փ<j%e{@bs'H?+HlC?!&0}tk?'|v fb# |wWZ%[G5ʭ!ڷo޽{P8ZP hԩ{g'9,,L5jЭꙧVZnM8zL/*p9矞5\Oe7˗O5rwq2eת9@�@�@�@�@�@�@�@�@�@� pb@�@�@�@�@�@�3f 9{Tso-[VC 󹜀@B <yRSLqaN}ҥKf͚d#e0Zr 9s[2dž cǎ뮻c'^ӧib(iyrԢԹtmRW�#$ M3qXx>#:Zx<6'\Ν;5a}W_UX1*wɕ7{~ٳ]`ƍ]0 7ܠoQ5kt/ NdsKLw .t ?`o&:6~.(61 � � � � � � � � � � �Aѩ@�@�@�@�@�Y`[DDÃ֯2eʨ]vӧOڤ!# x<yΝj׮;ӅXQXX?U%cΝ;e˖S~Sʔ)Un]}ݺ{uҧJ.)"=ԩ$wP 2I]$9 =z͛ӫiӦ.rȑ$yPW֌34~x7e̘ѭ;t;̓g_;v_~qn(|r9sFYdTʕ+bŊ. >mڴV@.\͛7kŊ,YDںukBN-VZWF � � � � � � � � � � JAբ � � � � �$CYݻ'O d͚Uov6i 9rD3gԔ)S4k,߿_2eCZ( ZQ ZuHq d Ŝ9s+ mԨ tJ Zb K<OOpԹ<eR чAFsbصk C7n ; @H{Yh$zB[={o.[6iD[VÆ .]P5ɓ'ݺ/^Wy&o L*J*r˖-K,h*=}6mڤ5kBM믿ұc\ v?UVU`&#� � � � � � � � � � �AѲ@�@�@�@�@�+t׻@ \ FpM<Y$GA .\~N,^h)STҥ]Nʕݻϟ?Ν;.]*kڵy˛oYHwnb8{V:b(RHݻK%J$ҟ,@dr=G? K׻|Q{U^ٚ/ x?pBZ`l>PB lР{٘0B_Th;,>oذAe!1Y3PѢEUH^P!l}2-g!`yfڲe6n~.nrc9}^+VN)F�@�@�@�@�@�@�@�@�@�HA& @�@�@�@�@�u )X͛:ue8RRX1Y؎PUM6iɒ%.8g7 2xBJ^^T@Xdٳg<B,~-`iݺu]ɣ*U[ڶjduOCmۤ G4',TGE�AIJ2۷uh"EDDpH ]wu*\,^6W۷^A{߲ H+S͚5}/ ̘1cFW8qB~;''K9ȅ5v/vY�]G{r[e>&w U[E~ٽjk8 }wqXX1g^%KlM5kR@�@�@�@�@�@�@�@�@�@�H>A&kH@�@�@�@�@�I'O*<<\SLQf͂2VZ.€($%ݞk^h-B%mڴ.(W\.'K,Bzl;}J:%4iҸO>3g\򲺏9Çw,,ԩSަ]TtiTi. L9iTi`ilH[7sg)gΤ8b AU8ygaE^~VY y9ܶ}yAesbTgw.ѣ:t γw{ݻWPik]o`@ʕ+ ,_~l9RG5SOyyZ71&8p'QΜ9^I=,dJϟgϞGݶul6 ~{\Rzm}7o^_ȥ7~i>R@�@�@�@�@�@�@�@�@�@�@�A  � � � � � ,dȐ!ԩSP:i$hy0 p,T /t _ؕ7ni cY7LnAeaA ɹx҈8K[KTrrVaB kNZnݪm۶͇�<c7hyiswL2$-DrzR~-dB *^ҥç+L&=fC/N}رc{mz+PȁvE y9ERX3[&Pza[=e6 � � � � � � � � � � @g � � � � � p ,hPU# 4 I{{+W.^öB+c^| .-/R*ҭJO=%5n,y2( �F{UT)�Se ,\(%H&H6O'Tɘ1e(_UV:@�@�@�@�@�@�@�@�@�@�@*دS@�@�@�@�@�@ 89rӘC�5HC @4K]H˗KfISKMJ*HÇKNEs@�@֯ڴj֔Ν~M?>aC T� � � � � � � � � � �!-@dH_>:� � � � � @ȓ'4jB�?4fΔVjԐz^]:xJ8 @�bطOz1\sIܹRZ1Ɨ � � � � � � � � � � @3' � � � � � @ Ç+[l&!� T }yһJ IO=%� �DDHRҠA ;م� � � � � � � � � � �$�A H � � � � � X<yh݁m$R"2 xCڶbp՘1RcI۷'#@�s'H%KJo-%_/u*%'@�@�@�@�@�@�@�@�@�@�H*A&+8@�@�@�@�@�Hy՞={6B FMC p2Hiԯ4yTԭyUV �$a3+VyDi � � � � � � � � � �$ ͥ# � � � � � p%<yh޽W:T�HbҠAҬYRR҃J� �~][Wj\PAoi@)W.@�@�@�@�@�@�@�@�@�@�@� <kZB�@�@�@�@�@�x Xӧuxӎ9,Y$F�@4CIkJ|"͛'-+=cG" ]@�@ x=RRX`4vT5"� � � � � � � � � � @ 2Y_~� � � � � @h(PutGRN8 @4RI:IVI,͜)*%=<ќ.@�=RRҚ5ҷJ?$ըD̰@�@�@�@�@�@�@�@�@�@�@ $ D'@�@�@�@�@�H t�۷o AAa@XڵoH~*/~q;"" @�cҫJ%KJSHCJ˗Kwy:D � � � � � � � � � � @$ #a� � � � � �S sʔ)Lׇ^!@HVzIiƋo%(! "9O@�WY/@/-['=d@�@�@�@�@�@�@�@�@�@�@ 1}@�@�@�@�@�@�X , ȓ'O*<<<>q� jL]aԦԳT4}z"� pW_TC|/?= � � � � � � � � � �  Z6 � � � � �- SN… A}e8BQ W.ի M&M.~g@�-0oTwj۶ʖ7rH.@�@�@�@�@�@�@�@�@�@��A3@�@�@�@�@�$ 'NV#& 4F'iNW:|8iQ!�$- 4n\[w֮m 5IX5NF� � � � � � � � � � �IO ȤwM � � � � �IRPBڶm[vYFXXXۢ@ |d4h4zTGҹs@�v~XPA�ʕԹA' @�@�@�@�@�@�@�@�@�@�@�D,@d"8t @�@�@�@�@�(Zl@�T ov֭:v\ZU??A2@�-pKRɒҌҐ!ʐ.e͚9QiҤwݜ� � � � � � � � � � �S `j � � � � �[ #""wxω)R0A�@,һJ+VH9sJkKݺI%!30@�D.p4hT_V>3;hӦ>}gϞGA@�@�@�@�@�@�@�@�@�@�@�ׂ-@�@�@�@�@�HieӦM?@�+pu_H&Ie\lԎ� IIO?-u(m %@NLR%K$>!� � � � � � � � � � �\ D~ � � � � �\(T´y栐\p!( ڵVG~Q#i˖k� ?,լ)i#xfԯ=4tP>|nP*G�@�@�@�@�@�@�@�@�@�@�d(@d2 @�@�@�@�@�PH* , P4 @f Εn*T 8"�W௿fͤ,Y%K?h2k,=zWվ} @�@�@�@�@�@�@�@�@�@�@  G@�@�@�@�@�H^E xdXXC=|e kKKJO<!RݺҺu~! �"cԥT}{tnĕ+WUVj۶l!� � � � � � � � � � �!&@d]0� � � � � @r(V6nPpWDDD@ۡr@ TҦE${TZ@҅ :"� p-zJfϖF,4WwVӦM= 6lإ_ @�@�@�@�@�@�@�@�@�@�1 C]@�@�@�@�@�@ɒ%~$m@�PTIZ@Sz aCiPG�ҀRСC׬:tR~]w'NT4i.=O � � � � � � � � � � @ b"� � � � � ,r˖-:sL@ҧO/ �,:koI[J+J_}9|� .\8W)#=Թa`aOepڸqOٳ_v ;@�@�@�@�@�@�@�@�@�@�@�P 2ԮE�@�@�@�@�@  Xsy*P^*G�$(Pt<A]R۶a��@�IDATHǎ%2$@�Gzu}{^=iZo_)k+W۫W/�9i$@�@�@�@�@�@�@�@�@�@�@ )"c@�@�@�@�@�@ x_֯_gȐAm@�&. (M"M*U"-^Fx@�#R&mIr] 1B*T(چw}WÇM7|� � � � � � � � � � ��A!t* � � � � �] K,ʙ3o>63c UXQFC\=[$BM|׮]ݽ90Г"x}}<&Nfͤ˥…ڵ>?O[ފ6 <mۤNʕ{~<k]}}5k}QKǎӝwީ~~bI?.Z3QW^x5mTo6mw<}ަ'|}itte@�@�@�@�@�@�@�@�@�@�d(@d2 @�@�@�@�@�P(Yd sȡ;v_Ν;;wn?^lwZ*^s&p{>[lޟ:uC?~'+?<XR>RϞRѣq)rk[5F�/pR/H_|!yurJlRm۶Ճ>9shڴi:~( Pܲe%AAjf֭[wj٪U2eʤ˾Soν1u^̓3?^aaa[Ogs|_� � � � � � � � � � @2 2^x� � � � � @ *UJk׮ h-ĉ4nݺiٲeZ`A-P8 @x{~*W>#Ga?/3GI)= _ VMZ"nc>Cs?En{+ @N{O*QB>\z-ijy)kwݺd!Æ u]=zwrz'\?o.{ZXcJsϩhѢ0`;[޹75Yyu׮]zgԢE 5nXYfU~dZɓ']g#9@�@�@�@�@�@�@�@�@�@�+@dҽ @�@�@�@�@�$)PLY&c˕+:$ ,T7o<yhСqn7}z|2' R{[YyfFRX132"-]*+լ)#?Cz?En{+ @ \ }<ҋ/JaIT4 jٲ܋'_I,\p[[si쬯C*ɜ9 ߵ|rE{}Eو<Z\5jhϞ=/d@�@�@�@�@�@� M/<DgE13P&BB(6TEjNiR)$DT!St=:wg3~kk|gk=E@�@�@�@  />� � � � � @Z -[رcaAٳGVRdIe͚Uzr)jwҥ8p ˗_~jٲ{ィ}lƯ'JH=m)G=zt?OK/պuk|W)bŤٳu*=tthʳد# @ !_}%]vԳtҺuR|ײpBs=ꪫt1y{1X�+6U4sL.02v2eަM=:p;ԩS6mn{vcM7wI?m߮ދkZzvp5khРA:[nՓO>)kcǎvxKl۶t";p 4V YzuQjU7;uTiݧOhcuvr6S^=ҠN?@�@�@�@�@�@�@�@�@�@�Afϩ#� � � � � *VBbpA޽ۅϟ5qwI?lfժU{s魷ޒ9rDtb45R'M[4vX<yusΜ9jڴ[7n]~v:'d%/tuRPn~ Y̽'/@�D x93 4fTDU1BW\qԩ;FRعsgY�#<swޮ ޽J.UŋGOX(k;Å;Zt }۵k"oFM4ɅMرCM4qsZ^xHZD+W5a\` 0H[~g]߇[oU3g֌3\xi&5jHJr;wt&gţW%4"E% {m-j{Ul??Z?'b � � � � � � � � � �D E  � � � � �+""Bk֬ [w-f߾}zǢ([Zj#GuUT yj…zw5dT9cx≨yfH{M:՝z˖-w<+Wjƍ6m ڵkz&</KI*/KZ,纟B}[ֹي�*`Y^(/,Q[?V=w 6lp!ݺu߮2e^Pf4qD+.$C"{v7o\~H5b .=w/)-اOٸcڵn|B(mg Z{o<yw߹2eʤz[8_fϞB&s+bAVGK?~hܸq.VS߾}z믕w]I4-[w[/ۃc.j9}t]tEj-d^? ]~| � � � � � � � � � �dd 3@�@�@�@�@�Hٳg23BiN>=Yh*UJsvZ(?D-D`ɦR~}ծ]6/f-)G*Y|z%K .6\ cxf^ +=Tt㏥E+V)St1=JrR t뭷FmpZjʜ?wy+۶ms"##u 7nݺn`F%Vz\{!uE6mŠ}V,@:uyynaMKҥ])oM0aˡCgiQׯ럅-חW&n4ɓ'b%WG_uUjݺurL:ut } ˶mjРAn5k< � � � � � � � � � �W Hn@�@�@�@�@�Hs*Uڵk hm\wu.nȑ/DDD/2�@߾}5g_yN|_2Q4wԴKCy?vVl*C�'`y/(/Pz]嗥UV_qb /PKJǘn?dPC}`KaDkwnsA,ѣ /Fi9uT7Y=UcǎUQ%g.Rwo, ߲e\lc}P/B:tMۻ`ˬY/ A�@�@�@�@�@�@�@�@�@�@ .9'� � � � � @ 5kքD,&XX>}4i$y[[oU<y4jԨwbKȕK<Y[7g~߈=@�8}Z?^PAz3 |z~ . r̟?}ܹS^jU\Hhumgo!R9x`6mY˗]vի6?%`N^Rfh#Fy] V׮]]zVbۺGj׮]6RreWƍ}v_hC\kK/i,<93C@�@�@�@�@�@�@�@�@�@�HAI!� � � � � TիW+D-Ŋ,yI;17�qX7N'Nc/VgTZK{ǭ [@�9S][[jFZ^?yB s۷W٣7nǏOPcjr?L',X@>hHuYУܹ{1+VL:tЗ_~&sc= .>@cƌi/Qsʔ)*W ƞ8q-[Um޽~uׯz]bᔥJr!AfmX,Xxq <8f@�@�@�@�@�@�@�@�@�@�@ �A=XB�@�@�@�@�@�4 `AG͛[?rǎg_D kNFΝ;De7wިu Էo_矚<yH6n Q#}4|ԭݨMgO<a hK+<xҊȑ]eԁ]w*E/U`A=#n_ bۖ,YW_}U[nuO[ضm[y^Pe^7ָkoV׮]5tPo|c ̗/ʔ)[ncV̖^T<薂C? vV4ilٲSdd =Sܚ6m=z}Gy=ZkjժU5kʝ;Y[~ \PdvV,\Pm۶U߻c � � � � � � � � � �Hu2" � � � � � @ H++W Ko H?T&f#@vZznӢE\p͂ 4h `ƎPȰjR /W^aܹرcT0dģ,sktϥcǢ6EaÆY@ A6 LF(wҔ)RJ &ޝ'NYI/vvӅ^获~5K馛T@1is7|_ʂ$kυI7 ,.]oq[cƌ9rR5`�EDD-[TʕէOh[z衇ܺSGuظqc{ٳN:mhm9rDO?~aUVM<Lù{pL{Zh=^K/k6f?4,vS~Y`}W*[l]YF�@�@�@�@�@�@�@�@�@�@� L?=_퐐e}IBb_@�@�@�@�@�@ Jr*<H ܹsСCʔ)S<GLT3!G['dԪeTPHqLIC;ݡI_I4b>y!ҍ7V9j(YA W,].<}l٢2e(snBmذ/<9s*k֬Q?U`fߧN#n߾]~l?|֯_r)o޼qUwwQgu ڵ:k[Gu,(3f?~ ˢ4c2 � � � � � � � � � �D}%@�@�@�@�@�@ mTZU+W Kg;=r6ok8MXR@�'P4gtR_ @ [z59q%h֬Y?zJwu9Oc <Ah˗eX ZJdΖ-;\}ȓ'v`~i]-�zݻ' � � � � � � � � � �(b @�@�@�@�@�H@j7$ mnMŋh+=+_?SN}Æ S…ϻ*HBku*S"f=�*UEԀ�AHixi`顇\°+Vcǎ'X!NϯQF%yӦMӶmےVh~ab8@�@�@�@�@�@�@�@�@�@�ҍ@ts& � � � � �d(իkժU4$.EqA5rr $P@#DA )r@54gwIN%Eԁ�dLӥ5}%/7!O'ǫUV^)SyR (B-, � � � � � � � � � �K ˹6 @�@�@�@�@�HժUӱcǼ�XbvqƲɂjrέ &$iT@zPwj' 9Ȓ%w/֬BڻW1Cʙ39{B[ @XXzi\O?*THsʜ9^zk <.>J@�@�@�@�@�@�@�@�@�@�@ 2x� � � � � � *UBe~D!5kO?� 6Jٳ+#�FK-H H҂n09@�@�@�@�@�@�@�@�@�@�@ LbPC�@�@�@�@�@�ș3ʗ/ ^jκuo߾9)ZA�SZ5髯ŋnݤӧܕ  @سG^MҔ)wIehN@�@�@�@�@�@�@�@�@�@�HUAAg@�@�@�@�@�@ !5j/CA-Z(ADZ3 @xjז>\6MA @Z8zTzY\9idiذ3A:3 � � � � � � � � � � @ 2^[ @�@�@�@�@�t/PV--_<lYP!]r%AM@� 4k&M %=t@ DFJGKK/(=~tRDDz;[@�@�@�@�@�@�@�@�@�@�HAY � � � � � !,rڿοaÆZ`Ab@� \4bSҸq ?#@�"0uTH7$m =+Wz9C@�@�@�@�@�@�@�@�@�@�HAY!� � � � � !,v͛7'O *F�HwHJ}J~9H? 5m*Y0njҪUқoJ 峢 � � � � � � � � � � @ 2\k@�@�@�@�@�t'PD ,X0A-ZБ#Gxt !�i]gτtn]Z?�/o=7""EO>ʗX@�@�@�@�@�@�@�@�@�@�@�H=YROW  � � � � � pڵk5SdI}7jҤI;S5k͛ΝggΌlYRXB )2eƏ7N^h?RL @صKziihbE?ڶM]}7)+رcgubʛ7o 6ޗ0� � � � � � � � � � @2 4� � � � � �I+PV-͚5+i+Q[-4g=1@XB1o& .RR )M*թ#uv&") @z8|Xz嗥|#=pvCR >\m 2$ښދsϞ=ֱ� � � � � � � � � � �/9E@�@�@�@�@�@ ,rժU:qDUVZi:tP-,"qN�Ӷm|{(ZT4I+ϯ.F�RS҈RСҺuR^@еkx%KuAsw_v@�@�@�@�@�@�@�@�@�@�@� ^_jG�@�@�@�@�@�0 Xɓ']djݺ"##5k֬p5A9 x&6'G8waI&Ш3HӦ%YT�$JUJ< u,m 읥T#ЦMxOy zk3A�@�@�@�@�@�@�@�@�@�@ # >� � � � � @:Xrzt˗/(P@ 6#u<8m}($]wI={JݻK[&W�$R7KuHkH&yCQ  dϞ]:uR֬Y7o޼jժUـ� � � � � � � � � � �'@dY � � � � �A ""BժUӲeP4c d .pRq#6ۇ@r &+&u"EF&g˴�$N^jT^҇J_8* z:yd�{9+(2Y� � � � � � � � � � �a 2,T� � � � � �)PvAo^;wԂ h T-% yBgw6ۇ@r %}OSO%g˴�$L`o_yҦMBǥٳ:uV{# hB }Z@d׮]c@�@�@�@�@�@�@�@�@�@�RN Ȕe@�@�@�@�@�H"u ӧO'QgWSKT&NxF t\mRBBՆ M& CRgnj7Z @̙խ[7/B YfT> � � � � � � � � � � A&2M � � � � � @x,ZzuXر&O@ v$иT=u@J +k')R]Gv<lTғOJ&!y}D}2FJCv]2eJ6@�@�@�@�@�@�@�@�@�@�_F~Ԁ� � � � � �),PZ5eϞ]K, kO,r۶mZpaXۡrҒ yB򅢊:HI!#τ@>P uf@ XdҼy>Չ*U>ܰAz)GsV*РA*U*a ٵkhX@�@�@�@�@�@�@�@�@�@�@� 2ei@�@�@�@�@�@ :WfͰAV^]*U҇~ ҏ yBQ`&FFfL4K{u o *=@8w[ k_.(Y@R _Jwٲeue%Eԁ� � � � � � � � � � �I$@dAR  � � � � �@zigؽ{wM0A'NHuR@R: A曥Ν;N = ӷߞ9eˤwf+WJI͛KI?$Tap t >ҝ%K3\MQ/ � � � � � � � � � �$R Dq � � � � �.uj:uTX;vmi߾}>}zXۡrҚ y9Cn"k(]_N"@<GRd2e 6oj֔mf:3ժ<LJ*\ðG IA�@�@�@�@�@�@�@�@�@�@�%@d@�@�@�@�@�)`Aǎʕ+YCh,YR-[C; /d965A.z:…_xC4q�R嗥C@ݳ[ƍys$@=\sիWW iB�@�@�@�@�@�@�@�@�@�@� � � � � � �^rʕ+,Y5kҫW/ڵKE k[TNywQ?~t zIkԹӧO{Wh?uwʔ))s̊85kV5e˖MٳgiS93ghS,J}JIޭHA�dʎ;sN۷O{<p{g{&{G٧{>~|tE /,Z+->ޓ #G_~ }f<#xwstѨ1]?}ϾO1?c:taثsQ1[f6&qRO[[d.er~٧KA�@�@�@�@�@�@�@�@�@�@�/bwa- � � � � �1 ] ݻwX{7ט1cdwB ڿ<x,'d>BVgB�ŸBmdߩئ ?D,S[W̰Hق4iǞ+B,$ 9YHNdDMy\y5z ˟?:)iKIGjՒƍH[8$wӚ5kj*7mڴI[n?=f]bS sO 9އ,0ޣ&i{g/^\KVRtJ*nT{'s gsmAo!=̹ckrv?c:Y+v?1Ӷw&㛷q_A/Ծ`c|eA1?Poc.c_c.le(PlIA�@�@�@�@�@�@�@�@�@�@ dQn8ij̎|� � � � � �$<0$6֪~aM8Qrd!,#`>gԴw^He1 ؊X@Np ̉-_gqMsJ;ϜaѢiҮ"?(–⚂4c[XSPN'N yE& 59o!LdG>N{:y߻Kjo'jNq~R{_]d-\P-ү͛7{.R7hsҞfg{Z(MZ?Y:KnHZ[e˖U5T~}5lPsPW Ǔw>{ {cDXsNobݻgϞ&1Fbc* 8?_mHmO6 o˗{^r䏽,8ccce մzb 4g_Y0 *m*\) c,#� � � � � � � � � � P * � � � � � j>KNd!x,,TbE}j۶m80 X@k. dhAA tKYPp]!A~h}d!A.2HӧOఢy ! mAٲe # -Ë-& T$I}H/uLoW4cc9sh֬Y7oV^-{F(Q+֩SGUTQʕU|Tfׯw]j.]ŋkkm֬lRq]+<whw!ھu,hvmBm~ǎngc8Y`p[ڸPGJxR~۸ܟȨܮ?MD[076Qf@�@�@�@�@�@�@�@�@�@�H�A@@�@�@�@�@�Hs?aÆaW_킎f̘h qm۶hY M6o!3a}g@~8}d,Ȃe' "1q'e!i\dEsvo޽;*xm‰잳bŊK,m{07ߔ L_yYP8&I&i̙.<тj׮+R5R )-rѢEn8{l-[L.Բuֺ]Փ\X!ްAuJ'Jrz+(`Ӎ7jӦMnڼy ~G,</6@?: ]?me_-~8Viai|6*]ʔ)/M\rZ|"� � � � � � � � � �C pR' � � � � � <X0m4o^+VP*U D81Ymٲ%d-�Q,_P=0 /¨cA 9,h.+#>޾}=յ # 1 ʖ-d?37 FF$. I׮]O>M6vyߕ\�!ba_? VwB<?ǵ[QCvƂgʕ<yңRB7Y:/ן,�Qo+Zi< 0e 1>֭[dl>-d7l^«c˗wIHdL]@�@�@�@�@�@�@�@�@�@�*@dB@�@�@�@�@�R^? {?-swˈ X؝Y(І  QX,ł,€d<f;(}\ d`T[w \rʕ+'hFR>2@LdFa M4i~m͟?߅#xر6mN>N&|c;{u#.UzZW_] ~JOw@򟃽~WZ{֚5k޽{]gl\g*{G{>mmʨREma[0~اv[nGoJ�[bE@�@�@�@�@�@�@�@�@�H�A8@�@�@�@�@�HO?}]֑5j>YZ"Et]�n:hA,)S&ha@_|,ȟ/V']pR$B7;vp!Fdd!iwnYX]z.Œl*^x"ZN;X٤ wI;NΞ֮]4tP3ƅo^wyvxu Mx.1^ H}.lw߿?bQ |\lVX0=;Azg!ziޙ3gQk׺LmLmle!bjB֬YS]vj׮ | � � � � � � � � � @ 2]:� � � � � �#0sLiF{Qϧ=v 뮻3τtLFi߾}_& 8fbT|y7̙3#q$׻ɂWm@#,J|\@ըQ#j /)Y@zw^PaRb$,ܹS/~m͛ZKL[uǎ7xCy-Z42ЖSNEiZt,ɓǽC,jժ.$>c.~Ӭ\R~^*UʅB֯_ nuqV v@�@�@�@�@�@�@�@�@�@�R�A"@�@�@�@�@�H: ,PNv%] -[ .8ǞkXM?-[m۶9"EzQA@+Wvv(  hk.ױ^bbڵ]Q:udSSӉl K.]^Jd%0 =x C 0`lAG/O?xژ{?lg6w!wtg PL2% H?'@H~G-YD6mr oҤ.r7+W.1� � � � � � � � � �  ž � � � � � &,TnА!CW2e裏jfjkȑ#.d…h"ܹSYdQ*UTV-gժUPQ@ m Zb 3`W 5ZjN:EAjԨ6lBrΝ&NI^vH͕ d{C&LPu1=S-[V��@�IDAT8%>yȑÅwTtZ,Ht޼y={̙_U3gV5ԸqcNoN+I,pB!7CXbjѢZl+Re˖M@�@�@�@�@�@�@�@�@�@ z =C�@�@�@�@�@�D K7ov!5"=9rk7%$ػw;4w\TR%կ_MSՕ={#E�$pqfF/vӚ5k\^qj֬6m.(UǤ%#oO]LNbI={ԻwoM6M6>… 'YT$޽;Vm۶՘1cTPtAc_|,;""޼ysƽbrVn,e["-Tku},p� � � � � � � � � � L_דA�@�@�@�@�@�O`߿8k:ʖ-'|R?pr4mX5k,7ϲ /W&M԰aC͛7YEc :$ scѢE:rj֬kMHM!;K۶oLyԩS'~w\ J q X@vϞ=uQ}.7}SH=yd}gھ}TVZg@̙3v~!.,\~k}w֭[oTv/_tq � � � � � � � � � w�� � � � � @:_UF -[LjJ3|G5n8mܸQyIvЮ]4m4M:U_kqjٲJխ[7ق6uԋ�8uꔖ.]ٳgkΜ9Z`kRԶm[)R$9G _}%/LZN*_;fMA nw}z;dT޽5e >\wqG2|~,^X>#߿_h۫tW9G#y >|Boӧ-[n.2GU?#� � � � � � � � � �@k@�@�@�@�@�@�TZU  O+gjA'NЫz4f6l.r+VL=ʖ->L{uT L#הn"Ydq {vX=K>Slg=kc{DmUg]JN$!CԷo_ <X'N$2iyY\ޮ]Zۧ^{M+W}YF?{s=@֋G2nF?^~P3hѢr e"� � � � � � � � � �E r%9@�@�@�@�@�Ȝ96l>j]r\tEz+诿J&'Ojjݺ/QFkъ+~zjժrȑ$Q dl{ƞ-g=sc f${6%Wڶ><Z#`c'xB#FРA+`v Z5IMŞRYD >\=zжm4k,KOMݥ/ $ Xj3F;vȑ#oFj޼f̘7 � � � � � � � � � �] ~ � � � � �$JI&i}\`s=~'A{q!QJҽD~4x`UR%9C[ AYccaFLgٳ*9J҂Ҿ}m } ^{%} Ԙ [kaĮMJ 6k׮Tl٢)S�{LEM>$P {[\٩S'ծ][ӦMK`m� � � � � � � � � � A:m"� � � � � @,Bnoȓ'q[߃7;w{Q2e4o<1B[nՋ/HcJt)`,g=e*{fٳ+Y3i u#~뮻t}jM] &vmD9|xGҥK5sL]s5)D�0+WNoyתsjѢVX֨@�@�@�@�@�@�@�@�@�@ L*IA�@�@�@�@�@�T%P~}EDDh/ )Y{do\ ?~\?u饗jƍ.`mܹչe[ l۶Moڶm{.䆗-[Avzgq۳gFCӗ?Bk: 2D6mJU'ho{63 e.{ٳ,@B aKׯJ(C4Ԃ{q>&MmBO߮];gVj4g}7:uj֬y&?\e˖լY[EkmsNtGS@3z衇TRI5o׾e˖1Oz/^xqSҥUn]=^еtMA�@�@�@�@�@�@�@�@�@�HuAKB@�@�@�@�@�@ )B^ϟ%lٲ饗^҄ p-N:_ɂA(O`5}tEFFÇkZ|,Jl #G[_W ޞcc믿VF7o^[Zn4i" !MŞUs˞a,gZ8JIA M Xߌ34|peϞ=M=\ݵkx/_^Æ sØmY('wQK,9ɖص]*6mӦzꥥKqtX-[ $p _^~8H@\ڼyy]6]G3믿1rF D,\Ə~OXkY@�@�@�@�@�@�@�@�@�@� 2>!#� � � � � @hڴ_͛)~p~ yk۶~' % \ve޽`DDDjaO%u+Vw[gSO=m\y啩&@)ZRh!6R;wTN\Pc=e_w!i>5f2 g[R %uԇ@x^ylRW\qExJCׯ6lkl>lۓz]Fv 8P< <xdɒ Ir;U3~HjÍb8&5-3gXT_骫ҁb^J@�@�@�@�@�@�@�@�@�@�RP ci@�@�@�@�@�H~ _tokW_ŋHԩSչsg=Z? =Jp~Hꁱ=Ŷ.-[k׮g>Z7|@ j~q9w)k߾};xp~A?s8cm,g=|yy!e{͜9S):k׮- >.UTM6RJñ;tʮY8رc]JҥSKRC?$G_C'6I?~x'#"E믿֩SԥKH9#� � � � � � � � � �V KC�@�@�@�@�@�S/w!v ,P֭ϳn!D{րԮ];͛7ᕜn6 [ϣ;t֭4ɣ2e_vXl,Įx*[>#m޼Ym۶գ>*?B&Ns~Sշ~M6M~^uM2ETdI 2DEMZ6ڵK]vy˗/Am.W֬Yy[G2eʔ$� 2;v[nٰaZhݻws?ԯ_?}gڰ{?w~{髯riРAQFB .￯5kָ/r-Q.]T'O]kV#Gڵkus1˸ի'{Z.,<ɾV|cǎiO0gqϰ jذan_~KԾ}{j*jf zvZ[`Ś5kFۖf=VX ni/(I^Rb,J89q,T!cƌk7|}=饩ʑ#{ :/=9n?{O{arzVOZkv74,dnLӤIq>;>pl $e\qF7ְEܩS'ꩧtq괱Ê={G %fpߏ꼽gǍYfƳ>+ mӫWXǎ=>Y�b-Z }ݧ/؍lemڳV93}twM4f=eq=:R~|'ngL!S> � � � � � � � � � _&Y1� � � � � �K/4㏧XwE]x^�J { >}:NlM6 x>p/\*po6rjժgܼB vO8Xre xaqnTRছn 4n-{Qu:OGx!+=ԩի^Ӌ/jW~_~;7[R+W7?u;w xn={* qg:[w^З x2f͚ܹs�C(;><-[رc^h tu_VuoԨ[U;̙3pP'2.'vy着P?J^36Ǔ'O (7Hz: Ar{xF+2pޮbm_/˭UZ)lkkϺ*˗{IS ~-jLI{2mMO>:sv{; ov疭gB76iٲe_~qO/սi%zVlŞoms1]p/3CHlqycPJ^;CUlG/Hյm6wӯڽm]ʕ+x^Hwy/ ?\Pl]uU|ݲmۘȾ? ]?w 7W6b7/x?}ʀH,ݻwxnzwO͞=;]|۽@M& � � � � � � � � � @,`MA�@�@�@�@�@�ҭHyynzohŊڏs E&-[モ4y/lQ^؝R~'ya<hjԨQ} *%/tJo ?c(/0?c4i.\8ݵ}O>օږKW^T(/4K{v} ^/#w.':/<G5jp{d4hy{믿 }?Pvy:r^x$= /K^u&/F^(kþ'N讻]+^O}]y免ܧsݗq9yᛮ/J^`ڴi#/H?k76G�hzE[g t&/4>Z9sF_GۘJvu׹-;N wXbai$'{?[ѣ<4hYe ;M6M>{7N=<::vcllڊy֘ Ա'/XNœNmΜ9flc=NVI7XVE?Cϸƥ9>6裏d611Ɛ1ۍml=oI 6Lv_o�/�R^`f̘Gvr * Vm(^(zEk0,3~GOA�@�@�@�@�@�@�@�@�@�Hy)z� � � � � �O.,رck$- Gx؛-B-d箻rAI&LB߄6 (--SN.dς6-}>[oiݺuںukT=~.#-x? uBʕ+CikĈ*Q __ԟժUsV[0[bMZÒ,H,)˔)S� + dŷ/UuKWG>~ѢEL+-cˡ;?SkvG#C>6j%f�ɓ'zZIcZ;ǔoF J)n7\]7-dBj}hz uPB +ꗦM紽l6g~Vu|{;rHiavB޽ 6>} :tH}&O5ׯɓ' ?{|߸?P?k֬m|k>~kg|."뗊+Y?{~I̽=?ẉ � � � � � � � � � � �A @�@�@�@�@�Ҵ@f\… S<,iZ`ƌl/d@ИcǪhѢK/TSNK.~YpaKko=~̹*8X]V\p,Y5^Zׯ׀b=Ve >?k>K,!u1UL_lV{\.ro6lm9\C/Me&;zڴik ĺC,+oS7oVdw,{ƾ_ r=e?,3SZW-˾IU>S &읷cǎ5,|mYo;m E^iʮYJ:u\�qJ'Źv۵k' w裏\ ѣշoߨ:>otҨQ"4hPnٲen|g,4~?Bm8&uoK|l#k֬ ?:!{Siy5w\T5J"� � � � � � � � � �$N :8 @�@�@�@�@�HFg^d`ܹ3Y^{-Y;F"##հaCڵ<=zhΜ9XpѩS'͜9g[(_8J\\-x'fٴiSU.8q­ ǏǺOJ-(&u1iaIOv%Y.T;|Ѫ)Q[.RH}l2i$اOYPU\aDŽSNiܸq.y֬Yرcrnߍ}GQo T#I&(* EPD"X6 X+E@HGҋ޲CH d7gvvΜ<fil޼}XiC=֯_/{k!2XԓR*Uru \>ϟ_&i&ۍ]r=cv,XήYr-]v-zj"굀޽{СCzw5au%? >Yoޅ7}o]kk{۶mџ϶>{=ķ?11vbP{\}ѣu]w5@�@�@�@�@�@�@�@�@�@�RA T@I@�@�@�@�@�HY+R3fHFhmʗ/8 2ehĈz衇4jԨ7-<*R|⋳4m4X+W>̅@^uU*P; g#)_VV̙͝RgR\?>g)n1M:}պuI:ub~I7u_ /8;j%}f> /^,-v׮]sO> KXUҥ]km4{3~Z6n2g V]O2<:${ߤI׫ؿ`t5﹘`fθٳg>yieۿF5Kq,XPy͞=;9H:-`|PZR<yA˂;w޷VYr+W.}'Zpat.[aÆ}gH|o|gO5'}9ߗu̹UR?9VWjw^ߴiSwvh@�@�@�@�@�@�@�@�@�@�A  � � � � � 7n, hϑ# O?T_~e4k̘1ٳ~a;v,EMj#cǎu!wv xWVݏ?}ҳm6 4@6 & _Ս?ג%K@Y~ܹs;SsբE wmoم0Ygڲ0#[z! ű>xl~m'[lqm߾=m;o׶i&[EK(>O4I/϶Bw,sذaZlo0s[,pኌtr;/,ɂ,_,`PB.>~g/r}Q{ߞ-?so?.Gl'ꦛnݻel-ʂ!|MwZHQŊ]ȬyX`H{^;ܮw}9sڞai43.RٲRƌ5_YBXZlC yرõkK|]baqo9Nw+[w;?f C{cٵkK]9Drɯ:mױۻі^zow{1Yx!z޳x?n԰aC]xᅺ&ϹN|~ ??׶;yb`\s"ͳcε޺u;$ڿGbտ6{ dsg~@�@�@�@�@�@�@�@�@�@�Gm@  � � � � � Jk׮ x>%DnրIR?^b seƌ)nbZjU _|/d'pw�@~^f:.]:pEի”Nt3^H^ m DDDJ,xg\J Ȟ=jժy/44Dw /`]K;Jٲe^Ѝ;^HP['N</xtB&~{ 뭷 *Ua<H }V_B6b{^pjl\eʔ xn\F x!^g׮] L xN"Lԩ֭[s ]}g jr}{|gϞ-g޼y^e>}W_}(Zh s/`*`\3ϸvrB^PnVZFp+^h < x/+ЪU+7 ^hpҤI;ILqݻs̞iɱt=Qsx9fLgSc϶=9gm_r%߱{/Ϙ1c}/8V{ Xg7lO9i[㏟vC=m{gs=`}kcs`{zSO=8~Mc73{yA؁Εbvի}<ޛYfu+v=l`}b'maC:FRV>1¨ݼmF6o 5kN{۶y߬_6W=\>7y/d6ʗ/Rڵsέ[n 8Ow{z]|I^lXb:EL � � � � � � � � � ]tpqR � � � � � �A  ZIh׮]T5k#F$D煳 ы/(/OO?Dד\'x@iD7煶 S>} s12T_a>:):M6U/h՗#GTs욬_^^i^X\@ֵ^+/G[nu}ztUsN-]T^Ps ݒڽm vذa@#wؽa{AVʖ-&yŽ{n۶mD'o p̙3y%Kʗ:u|Lîұco\_s5y텤*ؿ`b^{/_\",/8ij_5jԐޕ)9)S lկ_?%Oy_իU\9y݉OR>Ğ%f_;?XTJ ߕrދG\>A; � � � � � � � � � �g >|� � � � � �iD{.o!1Z]w>sp )' P4h M6ʘ1c# y{z8p⋳o!SN=12׸ H ,R$d nh!Z Ν;s~o9Z:qj  1N<B&LW_}Uϗ=-ȨXb[u{b*\X4I޽a1c]a`׭[jժy7+9ߑ}j\rJZc=-[ Ut7L{z/<\p zz饗kx  /@�@�@�@�@�@�@�@�@�@ dJ�@�@�@�@�@�҇@&M4j(>|XٳgOA[p߮^zA*TPɂ|M=zէOu]^WWvmPB%1 ܹyĜc[nȳP'.& Ȅ!SL^ܹjժW/o޼zy^;gCy@BSMp-[ÇkȑRϞ=駟z^Bc2/ly%sCaT} eFN] ]vv)p}f<kȐ!?~|@M+W.+]n͚5ռysjѢEORb0z/<!1q%5._|xI&  � � � � � � � � � @h dxKءéƍ Vԃ� � � � � �G`˖-*Y&O27SʕUvm}'hj9~&L{O? l߾J(~~iŊ.ȳcǎzW`8%'OT=\Ȫ8֨QC>֭[$iQ-ъm[@@iF3gN1m׮fH&CѣKǎ|W <wyDžMzCua/zի5x`[T)u[P8 `L3:zK2e6lzHZ:` � � � � � � � � � ��A!yY � � � � �$e],@0T ꪫDx5~3FsE]kF[֕W^lٲ ݑ#Gd%/_N%={ֲ#u>O'jҤIZfׯN:_LW/kWzym!K9R^ثeM>G}TO={0yOhРAs{{n >\VZMp۶m+/Xv{/o?\QQQڵ XbF@�@�@�@�@�@�@�@�@�@�d 2Yy@�@�@�@�@�BI{q ,ni.g…*W\m۶mꫯ4a_֬Y3TV-e̘1dKG@ 4,_~qE~k!4o܅^wu*Zhv~deKijyTJH5>bt!-:�{O} 7ܠaÆ)w 8CW`߾}^xj}zճg2E5;Vܸqc|nӦʔ)"}[MToZ,-]�͡`ۍ � � � � � � � � � @8W>"� � � � � @P,]vھ} ,:QɱcTNe͚UfRLQmP8zw}'+r̩u+pŶ *;!P4w\͞=۶UE4h=Be:H%͘*= ~R>ҡCz8 }=|p5l0qptfΜn=ƍF%P8؂{mǏ͛7B ݳ+TC4+Zhw߇om۶?͛7͎!� � � � � � � � � �I t+ � � � � �\`޽*TF傑BcY﯁Rˮ]\PLM>]-DFFvڮ\~\rH9v"@,$vɒ%?~gWVX 2Zj0 C� $<qND wnݒ{S;vP=_{zgUHx(`< kV| .R*M4 0:ٳqƪW M2/R7մiӼPMNʕ+kFZR&M-[,#@�@�@�@�@�@�@�@�@�@�8M 8� � � � � �i]+e]?:du]]Nu,:x~Oy鯿RLTBWzuT <Ku|�!(kҥ.u…nl28qBŊS:uTn] VV {͛9SK^_rY\?V~t=۷dJ;vLo󴀶W^yE;wNN%cs6Ob!RׯD^| F ,&ox.iӦj֬.,#@�@�@�@�@�@�@�@�@�@�8�AgK@�@�@�@�@�HkO? ܰaCHm۶.DqѢE*\pH1ڲe,X]lL6mr[hBZX 猌TZ=!@2 X@ъ+|r. -ՖRJPך5k/%JH$o^.PU@H}Wz!i)<,oРAz7\ <={*{9TÇ{_s=zG'OTQ4{0̙3Gfr|f?~n@`{GTZՅCfȐ!u:J;\pd�vZHA \)W\*@�@�@�@�@�@�@�@�@�@�RC PM@�@�@�@�@�H5s^zZl L={TF ]r%o]HH<]viɒ%Zx+.gas{u)T.^zʗ/‚Q KNCTºOZJW+Wߣْ7o^{*URre(P DGn}ԫP&dğ2D^>5[j:trέ{W=z4/`a|^u߿_{i/^<7'NpsyvA6߶rr CmM�x:AP9Bo Ѷu,тm)]vڪS,(Y, � � � � � � � � � �[ }= � � � � �Nɓ*Rl?4h'xB<HH1؝ڼy P: ۴i ,饴Y ^.ȭmۊ0eȐ!ݢ>V~7K8˚5kܶ@om*UʅZe] *Tp`!Yx-駥m=/ͻ 7 6m;UW]`F^&L|LC-Z4-*=!.\(+nAyvbމtłmL2܃iYXg[YbEtͱ,Yc ζS ^:a{8 � � � � � � � � � A&/#� � � � � @ tYa>0`N j7_ի]0YȊްa \NXJҥ]p-[m[:_@ v-,B~z7رc;3ft P0Um_|rȑRv,˼乄TB3& , .ёdO?TC ѬY\rvԾ}{7Io8sLg2~xkݽ{v&YfMwBnzvr6w. 9^z}o$uFkav[.:<bj?@K-DRJ.2SLyZE�@�@�@�@�@�@�@�@�@�; a@�@�@�@�@�8_>H={ta39s<oQӯbŊ%[;Z'\X�^bxn/TD (P /^܅]k3B`U��@�IDAT/:5,re֭.,~T0" <CP-$/\pO(ujm^*]uǧ_=_VXrƎqWѢEuuyԴiS*T(MX@?B¿+m۶M+VTԱcG&bھ} нUVE ߷o_toma~ . 2D]УsmSg ${H/m[(iz Y#� � � � � � � � � �O YR � � � � �X_|6mڄlݫZjB '"-q*Ȃ,8?tV'Oɓ'uWDܹSvdΜYE9X`Y)X`K뱎)g>bcٳ(v9~xtbeZǘM X s/p*({C˗O?շ~ٽ?Wf͚^zS{6#͖-[\O?)Sh…ʘ1j׮-[}qhiϻvB]?ςؼ_l.3YdI7Hk۶cY[6Dz�W ׶mu+oD6fmV."w0Ǐb@�@�@�@�@�@�@�@�@�@ LTD�@�@�@�@�@�[*W{/;dY_{꥗_~9۽{z-YK=4`�-[6gA1~pX8_̵Yp;v,\۰y!}Η/ގmɣ9s$yh| ǃj߾}.`Bٳ'm}fBvl̐QY,Y\,j!T<sTYPUKK.z> FVLKb,IԩSwiƌH{FZB֨QC*Tp\r!^} l2Y_]�Y=6jH-ZP&M:)>޸q ?y6=ms9X(?mƒ<v}yϥlϯl??ߺ܂m>eAmJi/_v,  � � � � � � � � � �%@dj. � � � � �3<7|S GV.]4fu1U¥q <x 3ꮻ}B~w 4dkb~hq-vYPܹ]pH۶}1K\?ȑCٳgd͚UKLj>lYѣG(V|СC.Ѯ:fٿ }.vf<Ϙ!~X eaD~˒#}jZ%[ $/]8|8o<Yuֹg^⥭Z)S \5+fF{˞{|B�a7 |.nV.r׏Ƈ4-`�p %f5b/6~ȷ9?˕+r:}>gs8C:[l؜ζ-4#G(fyV̹Vmn{3`6?ϲPNSնmNk&|F�@�@�@�@�@�@�@�@�@�HA(@�@�@�@�@�@ /VժU]Qڵyv~jذa;w*U-_vBu ޽{` a81m_̐˜~hthu&t?B*c-<3bu~ ԊYg۶%?@'OTTTlW.*~Ցe.L~f̀MÛb:YdkZTXG[(NZ {GBMBVXe˖vZY 3ZP='gS,Y\mr1.{XX?:O4i@yB DFF>k*` i_9}qzLZQ/'o> 7Egk} o!osssmֶ?uBm.b-~ \X|W~cnڶ, � � � � � � � � � �5 e< � � � � � ` ܹ}ZZ ^]ҼyTHJHko^x4s3! uBzPHq+gu~PֶukmCC!ZE1&c(-(ZƵ�% }Ym x9XjH`y!Za>~Ҝ9O?@c4aa۶ms!w^[bH <{[o].Z w )0iԽ@GiaS(iBmsfs7+/o!h<-ڟscϟ<~;1|Vbs.>۶fw#m#� � � � � � � � � ��A~ � � � � �$@/jĉZbE̊wܩ:u)S`uY￯zJs/_p}F�d:Tni|Zdl( Um^KJӦA1@  GySPԵu<U"� � � � � � � � � � @H3#a  � � � � � @"ڶm+WO䙩sx]p~رH:K&QtMZfyB C BI`z顇~Lu9rDʖ-1gp, .j֔F>X1B"2@�@�@�@�@�@�@�@�@�@� X1G�@�@�@�@�@�4#P^=+VL}Y،K/ɓ5gu1]A,I&*Y,Y^{ME HG@ [oJ~:M ->LdZG/KuJEJK:%O[Ԋ� � � � � � � � � � �iO ȴwM � � � � �$P ""B7pCXAjժI&Ե^$p}a/WddX'Ntɂ�' ܹȑg~ ̞=oُ�_fͤLJN@�@�@�@�@�@�@�@�@�@�/@d8@�@�@�@�@�Ґ@h"Z*FuWhڴiԤImڴ)N:U+WkAiҥk[ #@:.j0܃9PU �iH`Ji۶SA>(y, � � � � � � � � � � @!'@�@�@�@�@�@ 4nXEرcnhիWٳuKYOvc8W٣={iӦT/_+s:@ l"u,xԯ_:H"2t�iP`>[N[t,8  � � � � � � � � � � $ I � � � � � V2f̨kܸqa9/X?6l|A=z4,ӟ}*T]/B%J}@�3,M)~iذ3fGrJ�a3*Uᅲ&N|Sʞ= !� � � � � � � � � � @ 4� � � � � �.бcG-YD˗/ٿ\^Jק~CjȐ!V8 {QNԮ];l]n)N@ [u뤯rNi m@ ǏKԸ HO]sM* @�@�@�@�@�@�@�@�@�@�HA[��@�@�@�@�@�hРJ(cdž5w-+TVZٳg՘f͚Ujƌ<y ,@~ ?\*W.uW#ToK&H O� � � � � � � � � � �#@?l!� � � � � @:Pǎ5jԨ([ƏSjFi:rHȎɓz'Ըqcxbh"dK@ 4xC9Rj04NڳG^o8"�:T^T] Jz^jA�@�@�@�@�@�@�@�@�@�@�| }  � � � � � tիWk޼yigϞӧ`֭/]?ݻCf֭_믿 &PB!?:�!K#tSx9{oe!@vڴ/i|7C � � � � � � � � � � 2a� � � � � � լYS5jԩfH5j$+۶msc?~,2""nݺV*VrʹȔ)SԱcG(QB*T Oz%;ȠRy;w@G�RH`${w)[6i4yA)0 � � � � � � � � � � @`CS5@�@�@�@�@�H9A7͛)Si4k,͛7O>sέRJx*Z ,TJ|7o^J/!,W\IH/|Ao^Æ S9T'!@8qBZT^hm|Ey?c؛x,['-9?[R׮yK' � � � � � � � � � ��Az7 � � � � �]`͚5*W&MVZP0** Z?ӭ-s֭ھ},4rΝڵk٣G1,Y")$K,酆u={,t;رcsy;^  J| -[&/~X<XzU{OO'uI =8U .]}wޑ:u ՞/@�@�@�@�@�@�@�@�@�@�Hkڀ � � � � � T.H 4t!s-iVv"-$rǎ.8$-Trԩڰa?3.S:uTB 6M~7ꪫ$#@:9SzS�=zH}vj W/飏=[nIH4t E˓dZHe/]/$=T4yTt*w@�@�@�@�@�@�@�@�@�@�@ ] .7E�@�@�@�@�@�s tMs :̗/߹Owg͚UEu\?%^Z-?ӧ@ eʂ e˦+BFɂ�ػWQʐA?nQj^'/֭cvlVmԃ�ƍF+V֠A5`h � � � � � � � � � � @Ɯ>3D�@�@�@�@�@� t ˠ1c$ O SLTNжZn֭/R;wvA5\?ZfM|Uҡ@ϞҎB +ծ--_.͜I 2efD�RO+ҥ7zϯ@ՠe@�@�@�@�@�@�@�@�@�@�ҷ�A3z@�@�@�@�@�%'OmVb}Ǥ L0A͛7WÆ 5eiF=\t/]1cFR<H##FH|"8q̙#U~w| NjC�RK`>[䅑K5j|̙"� � � � � � � � � � �"�@�@�@�@�@�%Э[7͝;W+V +0|py뭷jʞ=iUTPB_^ƍݻuWqƚ9si҇ڵR^qՂ!DžG K2 T�)&`S*Uᅲ&N2d뮻VyM> � � � � � � � � � � [ "|F�@�@�@�@�@�t/ЬY3)SF|A8>H=z?!C(cƌVgߵkN3fݱ5ҍ7ިիW{_ @8yRA:~<qEEIO=%͛1|s~fqtWg#�)`G^ %KշjڴiSk� � � � � � � � � � � Hn@�@�@�@�@�@ @DDw. 2<~4X#GoC=AE,�rʔ)oj*U\YԱcp6 @8 x?utĹGa8H8/(r  !կ/҄ RҘ1c+W.]s5M� � � � � � � � � � �X t|: � � � � �/`!8>cvm0`}8IΖ-[jѢEzϫf͚r* @ ̙#.EE3:f.~,&M`ŊSEF&|B�RS`PzS=XPތ=ZڵSl � � � � � � � � � � v;t8UӸqz@�@�@�@�@�@� ˆM4):f-ԩ_|1h_vuypn*B?Cra>r䈎=ǎsk;?ɓ''NDo>WK~ 2gc3/2e޶}D+Yd9cYU֬Y\ȑCٳgX=)'U(mrf74.^jJ__XA=å[rD�I`GiDᇥ'>իWK.͛[ � � � � � � � � � � @*ItD�@�@�@�@�@�;ԱcGmܸQKNb/'OoYz j /Դi4x`/a͘1C/_T1M{nWݫ}^mW<( ~Ƅ,k_ࢅ(ahux?[,WX.i1(cRڶ X-2gΜʕ+W%O<ʛ7lsϟ;\K>BYp/h!n}*DsXB FMԁ�w.-o(5lxfFRѢEդI3d � � � � � � � � � � P XmvpqU# � � � � � �'`jJR޽SO^G ˗N:ڿ֬Y۳fr7aUX1Pÿ[۷owŶwggx*Z``ܹsdhZa9ve͚5zm!sѣ._[C\ b д{i*i~0dYSWÇ_z'ԶmiFF 4h U*V 5H3 @WxkSk/8%Kmٲ^}8g' � � � � � � � � � � A6m!� � � � � @ G}{adu-VZʛ7~7^ZʕРkѢE㏽A'`7o֭[_ h1 @?y5%X **ʅC۷O1;mۂ;mk׮>m#{$|Ͳ@OEqXb*^bK,w)]Fy.Գ9�@ .t7yG),XW͛ڵk � � � � � � � � � � �)$@d A  � � � � �ڵk]g}n!<>y򤮾jhW^y/_dlTǎS>}4|pիWIݻW6lpłRm{ӦM.m'd̘Q vA~ Yd>+mG)*v! јžgdϞ]JBZ2eʨlٲnmT˒0+=å_~jL9�־cRBۥҥރ/tsֳɷ � � � � � � � � � � @dJfh@�@�@�@�@�O /2 8.?9sh֬Yʑ#;ĉq] .P޽]cGʂP׬YJm ~ Hə3TڅoAѡ|WD ha,(Z%ķH ܲeKt𨅏eڸq<]AZ0E]ݧ1f}lzW)sfR.@ ǻnUS8P0@8{OȱcǪ{g?o@�@�@�@�@�@�@�@�@�@�@� 2i @�@�@�@�@�SW^j۶ ó0S_~^z%}GQV^H H:XcQ/MO>:r䈞y+ڰa/_+WjժU-8 ѳ<+͚5sk +S+ 8GK|@,PXbس'e׮]{g 3]n~G퇙Fx bv?_r%K/e] 2DoA+Jdcˠk1cťs6ӧΝ;'B�@�@�@�@�@�@�@�@�@�@�R@ @ @�@�@�@�@�o뮻NJo{4-[ԣGu]r4SSi$y^hYV u8p`"NZŋdt� T]^ tG$F,Jjݻ]W/q4sNwNΜ9BV+W*U8+M;E^oC@�4#ot]ȑ/(eϞ= ~~G"� � � � � � � � � � �+@dR; � � � � �3O>zKy駕#G40!**ʅ?Zp믿]Q̙'Fn\_WJ62mY=ZE}-eʔQJԴiSׅEFFPB!3:@JX_JoXB+Wte˖iȐ!@U[~G2YKMbAs0v}r|͓OH3gz&9"M(]sMF|1?^<HNh@�@�@�@�@�@�@�@�@�@�@ Lf`G�@�@�@�@�@�!гgO9rHyicPI?RyΝ9sFג)өdAvmڹs~/^\;vLH|xm˒%KdGsVժUUzu?VPAyI,` 4p%8,PB!.]~~Gڿdɢʕ+N:ѥ|ʐ!C*Bz_Ç CtҁM'|Rzyuk…?oF{Isp � � � � � � � � � �@V':t8UӸqz@�@�@�@�@�@�eA{uYf :{O`6e5mRC~4tP͘1CjJ擭= x? 09sp# wY_5j袋. �dCbY=WĂ dS`ņ#CuyW[C ҃q.]J/,Q[(m4mڴW™ � � � � � � � � � � @2 T� � � � � �iS`….`T&M 2* ;k޼o2g|z7o^M<Y-Z8pInZK.u}-RHJw!(EEE@~lΞ=[Gե^+իWO>EJ=/WX~owʕʚ56k=O-5"""8kr?*@ I^_PA5J*_>Iո8EW^ѝwޙ8@�@�@�@�@�@�@�@�@�@�H *@�@�@�@�@�@ 4h@*gA3?P={tf_~G:tH9s_B8 wٳGժUs~m%ڵK|&N(뷍RJjܸ mԨ ,š4�+sN͘1CSNմi\Pm|ԲeKlժ (p$|/?{HIwߝj8HR?KO>)Ot#F졿+U8' � � � � � � � � � � @ 2]\f� � � � � �;vt?Se˖ V!_޽{U|ytMz7Ǖ%K}<&wΜ9(>z衇RgE.:n8͚5˅hGY@ m l߾]} |ZpԶm[+V,E<{+h4�\`${w)[6nTÆ^ S! � � � � � � � � � � �Ab]T� � � � � �yvکhѢzXc'PTTsiۙ2erO8qKzkҥٕ3>tv4BM6Uɒ%ꫯvڲm۶iȑڵ+!gȱ!`ߺo�{3 gEJ,|#]x!!)aM pJa֭/^;?o@�@�@�@�@�@�@�@�@�@�I C)@�@�@�@�@�U ;ӧ}t,[Lo}Yϟ?gȐA:~xǤO>Tnݺ)B*ͳw*Vf͚Z` <XՓY @߼`{&سg=;s VF�XPsN5JcyR<|[ƍS֬YզM@�@�@�@�@�@�@�@�@�@�@�d 2YX@�@�@�@�@�Ҳwީhiyc +GȜ9sH-iȑk*Eg̘-ZjժںuƎ 6_TjR/4�-`{63ž̰g=CY寿$ e#2زԇ�JuJEJK:>?<nP9ο2j@�@�@�@�@�@�@�@�@�@�@�A d@J@�@�@�@�@�HEQǎS5T0̙ &SDĹRLt^۹KeO<6mڔq ԬY3lR?_zkd>P=wYa {v3Ğ%LgKod6 Vԃ�)qcҔ)Rgw{֯_~I7|V � � � � � � � � � � @ lMS1 � � � � � ,Yɓ' zH7vAd 8\yĉ8 >} dZ8vlS/uo8ە1cFfϸMʾ}o߾_ oP_]eʔIJuD 2dZrЪ8#F ڷc :K/%zCgȺu3Ş-g.}&5o.q5q> 1R*Ҷmܹ҃ Ď;zh(P@W]uYyi3Ip7i@�@�@�@�@�@�@�@�@�@�S '+NG�@�@�@�@�@�B\Zj^hVs吷^fJTP^̙ X<vV^>H/ɓ'QQQ.hsѢE.3rHwmܸ͘1C˗W-}Nh>n^~-\Po .z8!y,tٚ8qYح[ѣG7hϞ=ڵKSNu<x0v5g|ulzؗEq{3FgNRˑ;}y @sgKy+ys7:t ^b,XwZreRsRiG�@�@�@�@�@�@�@�@�@�@�D h2N@�@�@�@�@�@�N 0@?,0-.tuM2eʤǏy|֬YգG5l0c̘1VZ˗+""JǍ^{MW_u}O>Qzd9r$fAKT1kNsQ V7GnVW ]J(;CѧĵK/U߾}9ۆ=5k@)S'<۩껤xgVbϘmۺg={|]r6 � ̜)U"y^8Ro,Yo3^֭Vzq#7{woSg"S93)D(/)$*MեAzEEm f!3!y3sߧ8>>}<k}"� � � � � � � � � � @Wsk � � � � � @jժ7Hws7o{=K2gάs{ES˧<yS5f͚E}m7t{eٲejժ ߹&8h/a_oԈo?9s(222m۶Ο?/7mzs5vϱ{݃[|\)ϟ#�.`}J7x!fTMcǎU%t_tlח4;Cy@�@�@�@�@�@�@�@�@�@�Hf]2wJs � � � � � @znݺW_Ub˴4p@5iD7pCddc}_+W.,YRC -kaGuYAt)M>]cƌї_~) Yb -ZTJuVqzg\ѣG_GW۶m]?֎→xj޼瞘B,Cի_ǤUZ7s/] `cǎiʔ)C<{gnznGqu,0tƍWsm+w[xOÇ׆ sήNb4ilٷojժ>}(o޼ k^/" ,kJ :%5k^٣/zC{ȃ>Mjnλw?BE{OֻᆱEߤݻgڴi魷r:u+*QC,[luU|al-[{6nu]Xrg=԰aCX79k5[wyzٟA�^ ԩ{ң&|Lr԰g;C~=9sw}Ş#Fw}ލ,`p¾ugFܹեKh,xԨQʖ-{Wo]Z`kFڵ{V=駟ܹs=>s1߃~|ϦgR@�@�@�@�@�@�@�@�@�@�@  sˆ@�@�@�@�@�@ ,ςetDSof̘ 9{�I7tfΜoօ#is,pQF.h6ǎB%###et|rϟ߅Y 8.\P;w†!?/jժ>#� &?,@т)-'y=.1gΜ.Hӂ,?CY5hZKw5׸yf]V6mu]Ǐ$k˂ 7nj֬<<VXQo1͟?߅_^׿9`-[՗)E+ A| 0mܸ F` *֭[P'_Hf]x?}Ŝ~w}[ Ur]>|X7x ,oj!Æ s_X /MM*UtIeT o뺴ଘ묽��@�IDAT%Jp706[ ]xTTAZc=[oA5@4 ߴp[Yح?edyR6Ԧ cʕ=㯟\Y_tKgVlυ7kLUVu!fnAh7nh}uA<ZXȣmۻ@.!-ڞiNb}}7}{߽;K`߳)Y4@�@�@�@�@�@�@�@�@�@�S ,0Ũ@�@�@�@�@�@�=z-(-= ͛'z:qAg!V,<aÆef! ̒% dAҤI :} Y ,ZHٲes!noc,�0W\.hςy $ 8qFoSQl,ga\F0e̘YYy뭷\m[xqZxY:uʅ]Zo;彤' (bG-\O ?珕+Wʂ= ֭,ɂm} <X˖-saLsAM=?C:vMXy\_\L;wnw-Z}.\WMo~y3)mڸGBS~G< l}Yis+T~'uK::k&zMF/q%z@ܶ{]oxZ/L*P#�\*eU+yaSO @LHe@[tr3+o6=~xY{VO?{?֞V^x^b +,$BMyOYz:u\>  m �V)gS|s � � � � � � � � � �@X@A!� � � � � �A$`0f2^,f̘1ٳ K|,1G�; ydm7~7}tB֬Y/ڕ3gNB,͊o^ϟwunL4ɅZu/믿ڗ64h:k֬)S'x"j>xv.X0c]ȑY{ァM6iǎQmX+ŋ=_�/(r<և[ B$[mۦ2e诿rG|]/ի6}גorV7]۶341DsL "?~_PS FiB"+V8sLԾ6.\1Ih n0wfϖ̳` 3f V- (/(:F{f]uU5k:v:e_DD^ўa|7ꫯEq.bOVѢEݱ~naŊspG ߶pG_cΝ;m[4뫢q=_Tl � � � � � � � � � � @@ P � � � � � @0 XhKn[oٳ81G.BR,҂>SY U\9M<̙e˖E]RKv5=6lP 7oܸ|-gڵڳgoW@uU[nU֭eᗧNw%Kta>B _Wƍe!HC�jB[6lؠ<yhҥQݻwE˂':I RbUK\ckcrG?>m3`:_~}wH|>˘\1Kc{d"e'y?�\,`O>)l)r˅ H//8ՋCn q=y.D^wzYb{,g-ZB2cfxəlaĈnXm񕸞M/v@�@�@�@�@�@�@�@�@�@�Nvg@�@�@�@�@�@ z)ݻWǏyDDD?V.]={$#s̲  "[j:vcǎ6Nj9rۮ];/ b V{nY�ڭ .։UV*Uuϝ;炇Z~w a^Ծ}{͚5KvNzɒ%K'9r!c-[gX3gb; k&~|l病`ܹS۶mF.j(^яeKv{݋)FI^.6u@�Dծ-#'-/Ss̲Zj]3+{dɒKk߾}쏹B-?ԠA/B׭[!C(k֬SN.׳)9wQG|@�@�@�@�@�@�@�@�@�@�@�T 2ը@�@�@�@�@�ҳ@%@{4x`s@[GI-<΂x~i*T O>ąN4vofڼy:t/燹sUv^hw뻏˗/X ,]oذa~mg̘QcǎiС~x ZjիUF ͛7Os8sqߵlR_ [tW'O8J߾}/jzgjXbnN?u*Y]#Q_RYo<ֽ/ʟNł=}?EoĂb}_e|ﺌß06[GY믿F] %�۰{{d1/5|�#`Uޫ-Yf{زgV]UTh1Y=.: eʔQ\4qD_aa۷osݼys,YҽZpd۶m裏{vqdA;{@�@�@�@�@�@�@�@�@�@�H SƕV@�@�@�@�@�@ {9]VSL jܸ*VgΜم}.l@+_[<xЭ-_~@Yf_U8v옫3`ԉ'wc: ,wvsW6& kVdoq\yӧEPvmw_x׆/`S+ rPL Nʗ/Ec9r.z!ɓ?~?/ 7|5kDa{۶ms8y�J;wn}W[5l0_Rǎo{uO\/8h׌ (ܶDsߎ;w}عs[ۇEK LOpun}7c N=X41׿b}Z`;CӧOf{OYBa-]fd%?al]w,ּ?kO6M6b=ƮooAr~~Ԧ c佻ɻoJgKŋ̝wbY=|i=mm=zpφ&M.бQFkTn]2ibA޽n^e1KพMbg@�@�@�@�@�@�@�@�@�@� ?;;W;Z@�@�@�@�@�@ x,eʕ>}~7R g|GK/zIe˖M6mرc5 y'\SNua:K.Ur\ \SKH 믿f͚n>R9d69j(cы?vZP,\P Tٲe]VZ7 +_,TB[7%fL2j޼ X�(B?s-YD}vڥ_]%JpC1@< |Weg{Kֲe˴j*O.,- 1l֬ $`D[4gΜ޽= i|.voF͜9g- [1bN-pk׮SNG 3Zji֭.N:*Yd|Cqߙ}I۱xb]uUz/gaM/{)Yzi}X3[ No67v:u P?/ʮc'G0#M0A7nta6e6߷·C{׃ocB%K-0G 5/0?'O|IwW <{E|Z|~JOoyW/Ť � xϺy~yd] J,ڞ5eC̵w^edd{/jڴzlME]I{~4h 爽K[x={^מI1cF=צMֆ/vރ{6Y6> i � � � � � � � � � � @` dZZ@�@�@�@�@�I ׳01 Ż[3<}]\IX( >܅=Z %XZOݺu^޽{]}!ӥKY$G9v옞}Y}'.!.,B <PB K˛7 &^Ƕm~+1?'J?tv=YaRJxxvܩk'0)}%  |ª,0}ŵP.|3fU\%vBeL_1ccm>`?~kX|}z?؅0o1qy9z1yi~ {eQy ǽr={`9rĽ{ZX)'̊ϬN8-[]l{Jl%4G�@�@�@�@�@�@�@�@�@�@� 2y=i @�@�@�@�@�ЭުgjΜ9AѠA/_^F1[b|.=ߏeK90e˖FV􃭽>}hѢE.?J(J@m -PB)26 ЄYu!j}' %t3/Y�bJ.wd'W%=۾} e=x`ծ];S__^@4n\�!Ν%/?Z~*h�Ȟ={03 � � � � � � � � � �@P$sD�@�@�@�@�@�RSo߾`5l05NR_6mŋ/'eʔI7oĉN+Wv,Y"gɒEe˖սޫ^zI+VT/{6{l͛7OT2e0z]hhXXe :t5k׮ ̛7}]N$G@Ols~^bޟ9X#G<Ϙl._l./""B}>͘1CM6̙3ոq$M˥կ L�! =*ԿkR˖gwcǎUr4k֬d̞W^ye@�@�@�@�@�@�@�@�@�@�@ @Hܙ_8r„q � � � � � @/_>M>='dovޭ3^x{a!5$O{aiɟn:mEg:uR589z衇4f;wNjR=ԥKV,`V+{{4hР!oqܸq:v:v~+Wu&-Z$e5 N6nN"y*:TzV(QBK[`7 � � � � � � � � � � &A ;"� � � � � @z1cZl+Vy_B5kT5lذO-ыmDyꩧ4zh/i .]6o}9r͛2eʨM6j۶4h 2Xq5|ыʖ-l@j^i;y |&M?SM4Q׮]ծ];ȑqp+_ @:>\KY/V˧ 2@�@�@�@�@�@�@�@�@�@�@  p@�@�@�@�@�@ Xbr4a„-[Vngjĉ^V)SJ{W_}'W\n-z **H=ӷ~^R 7ܠ[wudKHvIr%k4�A,pCҳJK3: � � � � � � � � � � $Aɉb � � � � � |wjݺuPB@N`ł3ecLA͟?_7x>C/KGJbap3gk֬Y:z lڴSƍU@T]!@r:tH?Ν9s~S|ԼyslR~ Mb!)#n-13҃JٲIGKF�@�@�@�@�@�@�@�@�@�@�R_ 7G@�@�@�@�@�/yrʺ4bĈu#/񧌗6rȀ_ZO>6l.]˧PZl~͞=[Μ9Ez5l]_+VT dt� DFF… `ݰaf*tMUvm]@24I!\dn@ Nz{O <yn @�@�@�@�@�@�@�@�@�@�j 1x@�@�@�@�@�tQF顇r`H*TƏvb,hA'Oŋ+W4Wxx,Y=<^zխ[WuQZTti!1P͛7k.8~z1˗ڽfɒ%Y4wNML` S'i{ 2@�@�@�@�@�@�@�@�@�@�@ D 4@�@�@�@�@�@ mΟ?J*׈#fq:f=:x ZHޱc Xl⥨M81,,nƍ.*mYf,02wܺkUF Z*W̹ȀI׭[~MVʕ+.Zj_~R|4d)4{ԬY0i3VHNi_?yUœB�@�@�@�@�@�@�@�@�@�@�H�AѢ. � � � � � ѣG]e˖MB )sHǎo>/K)0w\r-ӧg@ٳZv{oXPCZ%J YbEUPA+e 4\goذ}۷owc˓',тVkժ*U(si>YZZ^`eo�"Z _),,Tf<@�@�@�@�@�@�@�@�@�@�@� 20 B�@�@�@�@�@�t$pyU\Y 4g}3TB3xa@^%^#G[oݻ[7Pܶm PH \~ ;yrT|y+WZhoɟ?Nq!d#G?hٴi6nܨCvsR+U$ zի@$w%]sR׮1]!@/=T4fTf � � � � � � � � � � �!-@dH~&� � � � � �%{!\]]uYrTS+VP5z8AAsiԨQb Ao i!x <ț7&wMRT),Y҅(QBW\qEB]=.paw}۵lA[nՖ-[ˍ),,]˾ TGWPAhw R}a>.eɒ\cO\ץكa@�@�@�@�@�@�@�@�@�@�  C<3K@�@�@�@�@�HcϫJ*W LhȐ!`uYj;>^O\gj9sm޼YXoB|!z69sŋꫯd)Z *$ ܣ pPjݻwk׮],;vp'OL-tn`Yf^6ۖ[˼$,0ԹtR C @�@�@�@�@�@�@�@�@�@�@�Ȕ � � � � � 3fT~ԥK *_|B̞=[͚5#2g^SLʂ}D<-bŊnm}vX0mܹF,ԩSQo`ꪫ.Z, \gɒ%X6ҿ@xx8cݫ}oẾ={v>ZX1Y &%Jł C|<'yP9E tΞl)/Z36t=9 � � � � � � � � � � "\lBK&$W� � � � � �UREuѣlbΝS5dȐtd p?]uGq{-[}\ߡC-sέ \\q͗/[۵Γ'츰v =:v=zԭo>|Xvc.v\!Cw-$pQEq۶ꫯvAcٖ, tiCA�PظQIZP8@�@�@�@�@�@�@�@�@�@�Y S0#� � � � � �$`t˗O\R'NPFҤ / $޽vءw}W3fLSK9XH-UVڿ[l;zPyQ, +W.Y(d޼y!m19s*Gnɞ={Զ˖-[Ԓ5kV)Sp>}ZgΜqk۶ZN:}Iw{Fł} cz13_X]۱J*]yWPBnm~S1n?+/hU? ÇKzI+K+VHi@�@�@�@�@�@�@�@�@�@�H ?ĉL~۷҄ " � � � � � �K ""BUTQڵ矧i:p,4tI&SN.T/pIo#+`Gq ;vѶF1m|[dl@W ̒%[2gm!h똋a 7%<<c}>{o>[,A/3fxﳅkZfM߶p@>%KAիKuH}z*O}V_K@�@�@�@�@�@�@�@�@�@�@�  2NCD�@�@�@�@�@�%0n8w}Zv*Vꓻ뮻\ɓSҥKպukY(VP!=N3ɂ-ҷX8'r̙Kֶ/fﳭ}AFg[ ypF>DF_\M^,=l҂(/V5kVb!1׶#GbQS礷ޒVʗ90jHX` ץѣR'| 5@�@�@�@�@�@�@�@�@�@�@�G 9@�@�@�@�@�BDBߪWJ*iĉ>"EW^ݻw^;ܳgڶmuiĈM );o߾:x,@l_~)}gV} ^N'` <y}V@�@�@�@�@�@�@�@�@�@�=Л23F�@�@�@�@�@�V ,,L W_}˗`vޭ{N:oz5'/>kNO=_* iFǏٳSW &ի] XHRҘ1Ҹq!. � � � � � � � � � � 8Aι`$ � � � � � BVn]7Ugl2eȐAjJ~C,Y™O?u] 6ԙc*/^n'M E <(n-" lg @D4xԠTdޛQ|� � � � � � � � � � � Aal � � � � � Yfi6˗tʛ7ojuQ>P#`)$`SLQddd @(pԮ݅O(e` M7II/,͞-y@�@�@�@�@�@�@�@�@�@�@�  2O G�@�@�@�@�@�մiS=6e˖vک_vTlY-X@ս{w5o\;w ULw^-Z(Z Уt4ytaF|KիKɻK} }@�@�@�@�@�@�@�@�@�@�@ Ã1v@�@�@�@�@�zW^yE?fΜ*sY|jժ*}z'3gրݺuV?8YeTVMeʔѤI.MO/ .}!,.=͍ ǎI;K:H:I^j e� � � � � � � � � � �? 9eF � � � � � D 4PVԷo_EFFۧ]vv)_,`xŊ֭{1tM?/'hӦ&Ogmg9s=Wj6=ϔ!Z_v{itwCˀ"� � � � � � � � � � � @d(e� � � � � �-0`�ZJ_~esZjh?4~@v/iȐ!Zp8Uj:{쥕ك@<a_>Z|,K];O/ϖ!J/AY#hsg � � � � � � � � � � @( g9#� � � � � @@ TVM{OϟգG͛7/j'OV&MkРA.drڴi*Q ^2 ԭ[W˖-S+k՜9sK 6T5iҤ<McRVRR҈T+%Oz}iy>E�@�@�@�@�@�@�@�@�@�@�H@H$Xi b � � � � � �qT:7뭷rqիW0eʔIQ˧2eʨrnݼysկ_?{6RG`˖-Z@*ZhtN/A-Э[7YF/y0 DD\ddTX,Oz{/ƌʗ1@�@�@�@�@�@�@�@�@�@�@� 2e\i@�@�@�@�@�H#<ٳgĉ:tΟ?Bz! 6,Q;wN9s(�2f2d-Z Ș8yԩٳ߯}zaP5kT]jJ;w$<4NeOs .1G�48p@^4}RRi:$:G�@�@�@�@�@�@�@�@�@�@�HET싮@�@�@�@�@�@��͙3G[lqiWXQqΔ)Vw3o'2^;Ժug5`�U\Y_uwLA+p7+G<yr΁'^`(ץ>"2z@` ̘!U&^}!u@B  1@�@�@�@�@�@�@�@�@�@�@ Lycz@�@�@�@�@�@�Xt5j;C7oVdd%uׯ_>v4lP3gL!J d˖M/6lؠ뮻NڵS&Mlٲ4<^7oI&Q,\(=3R)"@2!k :%=Բt- @  � � � � � � � � � � @ ')#� � � � � @`L:Uu/?}]|;k׮Z%SLjӦj֬LbŊ?עEdAv}tR߶oߞ6׀9s_XX\۶ҭJ<m ${t҉b佚ii8ih)OK@�@�@�@�@�@�@�@�@�@�@ 4 ,@�@�@�@�@�@ �N <X nݺu ։YN:+\" >@z\@ pBUPA}ё#Gd #Zl3fH <)j%,x!<.OAmF^}U^{e4 VO @�@�@�@�@�@�@�@�@�@�@�BQ&g9#� � � � � @[FR!CXǕ)S&%%RJʚ5%mfΜYsTrw,vi4hFҥKSN@M ϟ_͚5ĉSo:L~iNi)w^@ KH/(/[:wN3髯;n^~Y=[*^<s � � � � � � � � � � @ 2Sf� � � � � �A&йsgM>]YdQƌ/D] UvIs^BK/t~vwC7oVݽ UlY 6LgϞ A3Th߾fΜ'NJt*7u0kIݾ [w U{ohԧ갅� � � � � � � � � � � '}= � � � � �@O?)W\ʔ)EUV]]w,HWlWr|X@ܹ]K={TJ4fEDD,fr mV:eʔl@`xi�ƍ`@ xIi.DFJOKŊIKJ5k[ � � � � � � � � � � ��A\ � � � � � @ԫWO .|Iڵk4:uxD$Y``]o6nܨFK.VKEZ%d tM8qb9&dSOIݺŒ#+=zgBy/[N>؃� � � � � � � � � � � �A\ � � � � � @� /_^K0[gʔ)jd<ߍڵkX{ݼTRJ%KԈ#d!پ}{ժUK'O1D y5k?wKmHMHC\عBhk qX>s>Қ5q@�@�@�@�@�@�@�@�@�@�@� 24;F�@�@�@�@�@��(R.\ (cƌQ#]n]Զ*UR֬Y] ^RQ~=zA"PB?^V5\m@M$3`#K <Lr9pl�:%n-#7-�b elw +Vՙ3;@�@�@�@�@�@�@�@�@�@�@�P 28E�@�@�@�@�@�%jժ.ڵk=v;z\W_}uVk-_\ŋםwީ:u/ɣ+tM7iĉInC͛SycLb<XZ@:w.moL"sV. � � � � � � � � � � �S@�@�@�@�@�@�RS 22R'Oԉ'bN:ӧդIݻW .Ԉ#}v={V:[bێѣ.Lr׮]ҥ2f>:̙3+K,ʚ5kڶe˦ٳ+GnΙ3ry GvK=@54i$/pj^z%iF_T֭9?ivfR˂^?ܹs\GbOU_}%}TluC@xx<{Vlk{:,ƵK&/i1c߶ϯ t .={OZveR@�@�@�@�@�@�@�@�@�@�@�H  #/s_ʄ "� � � � � �A `pAFVȑ#ſرc.Ȃ+ S/Z�"YxR]8cl1\m8*UgpJ#/rmA'O͛%dLWxHoJd��@�IDAT+҅2Y$%yVZ!UZ zAڵsas .b;uVà$ |dc%C hǎ.Bmٽ{{W%bF h>C-w%H{_mV?f>,2b%J\;xTj֭މI޻ՅokזZn]mr}j@�@�@�@�@�@�@�@�@�@�@�b 26!� � � � � @H :uJvr˞={o>ݻ7jٿT$F/hpC ; FD\r]XQB ciӦ;;[lqc+P@u`J1"}!Kz ŒmuL33z(SBtUWE-TH]}n( '@{N;vtZB@hѢ,(mɁ:DRFHKv!@ްa[~w?\�CFjŋw=}am-:%p?~DX}>{ ,U7Zj޼^cۯnU;`J΀@�@�@�@�@�@�@�@�@�@�@�қ�A2@�@�@�@�@�U ""B;wԶmb!?go?R+hDhu#lSƌ}C:z [ &_/[[dH ۴PbŊdɒ.ɂl۟R~L3X+cǺgyF]vUl7xȑ#ck-\^ΰ֕*VfΔcf!pYYxUrJYFׯd[]eʔQ \lN鴖;v8gN-[vΞp ]YrUVյ^떚5k´#� � � � � � � � � � ��A}~ � � � � �$B6oެ7?Ж-[ܾ[z=g]kXH@ -@EFm;s̉蝪)-`onN۶O j4YHLZɒ% ,]-[V/_^/ϯ6 $ Ю^zGU\RT~ X~駺RLNӧo@,-Z$yLw-.Ғ%K\�3g\@pʕUzuYС?bP nfmldZhիe&nAuaÆQFȿw|@�@�@�@�@�@�@�@�@�@�@�LH@�@�@�@�@�@ N8uֹwl `rʹ  h`p'2t9YH/�ֶڴi:z0RJRJ+ڶC-5aÆЯݻ QKe˖k{ʔ)5euN.-^,/6r Xx9s4w\͛7O{uEVX^=թS-l})q©-[Ke#?zrB!6m*[, 2'Km@�@�@�@�@�@�@�@�@�@�@ )3B�@�@�@�@�@ ] l۶M˗/תUzjl޼Yʒ% {"[*T>[�dӕI#G@H , >+C .0zkUZTd@�b![Μ9GyDzRbx -g}G}TS޼yv� ԯ4st-40nN<λfoە3gN]jҤnխ[WٳgOi51{_ M ܹs n֬n6q*QDZ ~@�@�@�@�@�@�@�@�@�@�@�H 4[@�@�@�@�@�T-Zŋkҥ.�,L2.ZjZl]lYe̘҆؃@"Ο??Ck֬o< @:u~jР .^ >\Cu}O>XbpL GyQw]~ܹsK'Mޒwq28|}]ر=znXLA8 `N[ܜ8qB5jP6mԾ}{nb � � � � � � � � � � � 2`TG�@�@�@�@�@�ԺuO?iZpnB-pŠjժkVyIiD;vLVr˗/ג%KpRJSFԸqcU\]h>?qFnZ< 聇w}N>=%o^6* xcD/piM<YF²o6wnٲ *Lg38sΝ)S={N:@ߢE3@�@�@�@�@�@�@�@�@�@�@��A>  � � � � � 6m?yСCʗ/ ӻT~}�Ic :  @ŋv!GUԤI|n)We8FDD`A9[e>}ԢEt|87cǪK.0+dؿ_WO̙iB@k׮|1cĉG `ܹs#$_4~x}:r;?,3,,,Hf0@�@�@�@�@�@�@�@�@�@�@� % � � � � � @N:QӧO׌3m۶f͚м*U&$] HevBNK,-ɮٳʐ<BΜ9SUVU޽աC/ԎT$&'OT…(i/.5m*'/LUs0_=v/2d̙ *GQΝU``ٳ6m>#}*^z쩇~Xr q� � � � � � � � � � � yd � � � � �c4uT}.Ƃl6l͛F?b )!`\+WԬYܲ`xm]v;'O:\f 7n*=S.,wܩ6:[SNھ}ϟw%I5]o-*UJn( 3믿_o;=)S`֭zw'wD<[ @�@�@�@�@�@�@�@�@�@�_ H� � � � � �qk=z[g˖M~ڴi-Z}]f7~ X834i$͜9SOV˖-չsgΒ%_b;v7G}3S=Th@nȌ8e,Y2d2Dzi4y@!c &yW^Zj:v^+V )0{OCUDD^|E_raӗ,"� � � � � � � � � � ��AiO � � � � �M6iذa9r :`K93g4k,7NSNv(+W.0Ǩ=>@o>N:?*WTIngϪH"<<)`Ꮽ[K./σ@,{UϞ=5amV*TKMv'4K}7TX1 >\73G@�@�@�@�@�@�@�@�@�@�@ ] 0@�@�@�@�@�H9sy.k& )?~zZ@i Ț5o~3۱ߐzo~[X˧{N[n{ァ jժjٲΝS 1gΜYw}Ǝ]+u(/`>0/B*Uի??ܦe <!dV S(=f=%!Md $e*C$ɘdC8d{?}8}}]{ ޯUӧ'&kH:۷x\^|Eeqh@�@�@�@�@�@�@�@�@�@�@�( E06G�@�@�@�@�@ ! ,\P˗W5t]wiڵZj{9I&!0v,`s!K6ln͂.۶m~M3gԙ3gTJ)Sņ榞-[h֭Y RݺRȑ<jKK.]v@Ѧ}ӦMz5qlȖ-,(tƌ:uʕ+={WT� � � � � � � � � � � pK oI @�@�@�@�@� l۶M=j׮ҥKǫTRMxG�dsl\9gs/[PP'.].˧?ʟ? "q\T?ܹsU ^,=t7Rd>" 'OZj>}Ν{~K\1ׯ/ M. \|y M � � � � � � � � � � @ 2�@�@�@�@�@�@W\Q>}t+mڴھ}F9rz' @lnfsAʕ+)ShΝWz衜9s{:|p0N ߜ8q^Ɨ;v֯N2*裏СC.HBiD$%K-ZHիWW5?G @�@�@�@�@�@�@�@�@�@�@�X 蚧ƍדq@�@�@�@�@�@ wޭ1cE 6hOwޮ<^:uҧ~vkn}͘1<|?~<f˽<xЍC=cX??6mڨ@<ye5FÇ>7mT-C%,PPBZ`Um#G~gV5`[k]4lذ[y ūS!+H~+խ7eQH� Xo͚5ݳײe˔={�>_k֬Y\ttzyzb ,X0@(@�@�@�@�@�@�@�@�@�@�! � � � � �DU`ǎP$I-[$HP]7n_{jwkNŋ5g8q¯ʻ0=zT 7 n7L867eȐA=zо}4bZJŊSZ?~ �+Wƍw[uZr n(`6:H :tnݪL2O>-K: @=y ]xm%v7O@So_B c8!;kkG lgϞԆ ֲ; b&((HcǎuM4ѥKp@�@�@�@�@�@�@�@�@�@�@ < a � � � � � Pȑ#VJ.PȠ+uzΝ]d.d˖Mm۶UB⺔U=裺RJyo FL(͂l.ڜis4>ɓM6_… n|v'M+WćalL>=Rak*$_y[aytϟw\ ի^z%y睮ߦM__|7xNn8|ٶMSV?(R`Ν Ѿ>kP رcB>}nW7t_bƂ>j!}Q @�@�@�@�@�@�@�@�@�@�@�+@dt@�@�@�@�@�x**{.@&YdtrbYv@ o[x]v%$J}dsh|jAAA]]VfshOOÍ4$^tI3f̸cGkd)pf͚9p[#խ+)".A Xd…]@nBxd Xm i_>WĦΑ#tŋ1y(F�@�@�@�@�@�@�@�@�@�@��Aфc7@�@�@�@�@�YtR;Vɓ'!^rEx YԬYSt}jٲjժ=zɓ7<}t=3n /yݰ>:_mۦ^zy׺udDqFuAUVo8_={N:sް>_/_^{M< г^ǓT6b{:pvzi„ .\izw\]W` 4h =SxݻwWpp mۦMwn1/ϟכojժ8uTz[D8qaÆnÆ Sպuk9rۍ{9S}9ishDGnJ.J|'ݹϙ3z}̔)q7.R#\yEɮvO?6y)7ׯk>}CQFڼyǮ 8͟?F4o5{nQq&OЦ<͘:w 2e:v쨘 *8P69Ğjm<ds5j}v@ŊuQݳ׬Y7?WD:33EdaRWTk;{ � � � � � � � � � � � @d, s@�@�@�@�@�E/tA [hu� 6m s c裏sϹ8 %*_,tڊ+ܺÇ{fhnk\&MRƍ`J|饗d5kgjÆ .jw^=P; G�B /`Ejʛ7 ܱcG]X(Z`'| -!͛�H [rmȑ}Ydr4gg}'ZxU`A]VݗHqi7׻s1ۮ gTd E;Gho967-4j|ns疝ovM'NT|uӦMy126?:nw,\ ;uRJp5Ү6Ͼ;=ckU$IܜP6wx#3ߗ:uVglwgJh(}9w}鱇l}̙3xb2j(3z6f+J"V^-SNgٲe?W\. _^g"23Eda}2gά%Knl� � � � � � � � � � � KA4A�@�@�@�@�@ l٢xoJGyc@{+ZH/?^=ڶmUG[fmܸqJ('N…K.uiӦ߿ )Ra -}իWl2ʕ+}3ZϞ={d7oXbJ, q.aasu,|>f WyR̖/_B"׮]ۗ_][nuvL/t YgmiҤq6~6`�Y8>}zXڴis+4hPA K H駟B9 0>w;g駟%J@'`ds5\~? kڵnu2dH}B,HX[nYo^>Gf·yeT$iܖW&ۭ,9asСC1cFY lǎod >سѵk=nOj]zm, _^g"23Edan .;ϟ_!� � � � � � � � � � �@+@�@�@�@�@�@�/-[6ł,رL2ҥ,'ٳ'OegB%KYnK<H2[fahRr- ѣGui͘1Ånܸ-^Ӆ \X[Y^=*Uʅ18p{zgϮ 2 i5[@<y:[ɓ5kVʕ-?*VƹsN렠#aȑ]ʕ+>[Ϭ$ђ%KtEhsw Xi˖-˂M 5j0<J4z2? iݻrt˫Wփ>S@Λ; .^ k.5~9ZUoK WA z̳'| -6]thѢY<޽ q2_\g"c"E):3wl#� � � � � � � � � � �$\D w@�@�@�@�@�n(VV\y8nA'NZە6mZ]6k׮]zvM4qqSUfM?>p};vpիWh6lp: l@'NlٲTV lp˗/m!s)_jG&o_zc;vLyao?n/1u;D|9js56 .C֭/_>yԩ[j%-\޼yBoΝۅ,v|dv[5j$=ɲ! [hoO: }=*=XtL5{f7?eׯQy֘{¼c8� � � � � � � � � � � u n � � � � �[-Zhܹڶm_;pAdysۻw[t;V_gϮ{»<]qЬ^kk֬ϝ;?_o`ڴi.Բm۶=z *tMo{w) e:x©w߭X^.]r׭[/id sԵOܴ9js5%Kj„ ڳg7n~[9sT׮]uСﮋZ "3-PJ*<yz"\nkW^= |9}FI^=@y0'"@ҥe!U>_,׮zk5E:Ad" ss1)-xbŊ1=}"� � � � � � � � � � �ܦ�A  � � � � �'uG}*|[D WF=tڵВ/__}t5iD7otR?և+uԚ:u BК7o?û(+$$č6>{z; "'Yd6駟nvڵJ2[5YQ ʑ#2dȠkٲeav/tp>sZesQ Xu.2o޼jٲn u2e,6\}'NI&)K,ҥ,YVW.[xۦvanks)_0B%sݕ'X[yl*(<yrh;b}yDAYP3gd�ϋްǛ犈31x#2Zdanj#G*}u6&M � � � � � � � � � � � [ � � � � � &NCiӦtRr5ٳ'v)M4oTzu5J;vt5n; >|l˗}qB;Cppѣ[0O> '<yҽw-x:u-įO>TbEY`]ٲeCC$I&={Դiԭ[7}՚9sk0변E <oPI[~q"W. 6L.\pml۶mSuwqg-[6w1c?oxvViƅmٲE['m…v;v̧?l.ڜisotҹ }kš5kTxqe!4guخaŮ#W_'|R6m .kww}>ڵ/PBdvu7kgDפvїW_@\yFCd1ݼ?[ER\9=s?<y{Ӽw+=?X\k=WD::鏈 k=SXy>j rE !� � � � � � � � � � �@b_4㫲N_OGA�@�@�@�@�@�H: N0`f͚:u;2\YիWl2WGR{ʕ5g@6{lYرc]k!&L͟? 8PrXF~[jsN>}څ[.(N8e˖E{YYTK/vR̙չsg,Y VZ߿&Ml# `[h�CgAldv kVrhaOf5Z͍<B—,qaZ𥍯Fn[37nL;vB(---"k;3f̐';~|SZHqRJ*S ӌ>-W\IvnX[~֭k>{"WTy, jΝ;wTHP'NX%KtYx;vPX />ٵ|ƍZbn<[eۧK..Pծvݰ9h D:X@{L&MrQ �~)SL6mʰ`:ko^zn;G4o_>LC{<>.C cƌ.X 9fǷzm^w|衇믿jʕ.KvɓZj/, ˶{]6{Vevo{N`G͛7O{vTa=WX8=E:^Djժ>ܞwiϣv}" @�@�@�@�@�@�@�@�@�@�@yj=y @�@�@�@�@�\{ݻ]?w#aYP|nwpRH%K#J9s [@D 9N| 2et}BBB\b/^܅ yw&JyKtA͛WΝs;vo&8G=VDYj6mT@M<م}F-`e5sLFj-ZPq<_bfEf._}d?[nKNzw;͗s>:<vp;[7yEےuܾk֬m,�;{i4z>hs-a-tgXȫ>Z&s\LD:"z3LD}De=7o]s-`Qٝm@�@�@�@�@�@�@�@�@�@�@�bQ XP � � � � �.v<y0nwѷ~{òMV/yq}?zjժa^3D?oz;a߾}zW߫{ٳ$Ir;]G;TΝաCY0aBihj͚5жm k\wTT4m<!X%57'OG5|^c>o=Dt?_W c;'$]bE_@�@�@�@�@�@�@�@�@�@�@�|(!&]!� � � � � ,xO>jҤ:u꤂ M6z7#GnڵUPpkO2e}Buaeʔp !5:۷ƌ M6E{q>{F~[} Bׯڷo/ 0˚5kI8Zn,ͮ׮]ӏ?b8}ʛ7oL>-D/C 7,ӧzIU?'m>֭[W˗W_}{,wvG8 Սcǎ::f?>9rD5yB 잾@�@�@�@�@�@�@�@�@�@�@�b@ zƍӔ)~@�@�@�@�@�@.\=zhÆ .҂J*O%R )~z}ᇚ<yJ,{OժU ȱRѧNȑ#](բE k*P@ #ʵ۷O7|IW^t+W�wԠzf3gt{b?/p%.K.dɒE?3YZf q!'Nԕ+Ws<3g]v*_| e@�@�@�@�@�@�@�@�@�@�h Q< � � � � �q#xb_Wr\�O?4iMA�8}kړ8WzuRJ�&Kx 8P{SO=nݺP٭Q,V]\bnC4ל8q=SH!{szO8RjK+K,1b_#N<ߣI$QԩcuHPScǎ4h__}1n@�@�@�@�@�@�@�@�@�@�@��AL2@�@�@�@�@�@`Ν5j Pp֭gyFjRd" \tIsW_}Yf-[{ǿO�ՅhڴizqFլYSo*VFolܸ;թS'ލ/0AjLԢEt{a?|+puYSLO<~`=3g\#G}'TRO � � � � � � � � � � �H � � � � � ] Çk'=B,X쮻O?ZNn@9`s #6Wlܱ9DĉI&ڰa~={օk=T*ׯL2i0jԶk@ƃ%KM<YK,u}yڶm[' _.4o޼6l}]m޼X� � � � � � � � � � �@5OUuڔ)~@�@�@�@�@�@ N<YfoѼyteUPAjR5TD ڰH ؿ~۸qϙ3G˗/WҤI'Tݺu.]Hdžq+l2e%Ko *QI<{쑅`&vTTw߄Y1ӧO[o[N:zUjU.nC`߾}.q̘1;iӦ^@�@�@�@�@�@�@�@�@�@�@ 3@�@�@�@�@�ϟעE4{lY1cF=#.>!o ! B~W-]رcʝ;qծ]SL8-sl{wﮦM*I$;]v2sLPϝ*V.\VVMPvXAxb,XPڵSft]wJ $,Hѣ]tΜ9չsg=sJ:u@�@�@�@�@�@�@�@�@�@�@�bM X@ � � � � � sN-\нayӧW C|*['+-XSfZJ/_'NVVM{v }m۶_~4irʥnݺEJ,Y;=W,-7!6O4'UZZʗ/!*0@0#Gjĉ:sjԨg}VuQ4i}x W犯Z'OݹС N8q` � � � � � � � � � � @B 2!eƈ� � � � �  \oo駟?kŊڷoTP!Yti,YR%J aB(ڸq6lؠuֹ�H o<ybŊT)~ 1J{￯/Bw}vm*E3}t5jHwv*ž;҂R>.C .h̙7n7@hWڵ9s8C%pE-YD}f̘ÇXb.ȳYfʖ-[X @�@�@�@�@�@�@�@�@�@�@ N"C@�@�@�@�@�@ ZrVZkj:v ˟?/q- (BG h׮]ڲen7o,1cƌ*Uʔ)pqW1Gj=z2d!۵k)SKqΝ[͛7W~6yB0#矏oc< ]qh"]tɅlW^]X$I:SΝ? uzޠA5nX 8( � � � � � � � � � � @  @�@�@�@�@�(~[N6mk޽pdɒ{q9SP!ݖO>Gb p Y�mۦݽ컅d)o޼.tԂG~.]%}Çk5jҥK^{M:t@7|}w]BqRNT@tΞ=̙yIܖ��@�IDAT?PTCG̅]HdF ~M˗/ҥKSNUFSrW%r\@�@�@�@�@�@�@�@�@�@�@�8 29, � � � � �D_̙3.Tǂu,o>3fB!-/{J$I `Or:B-0tϞ=ݻ]c\'V<y\h"EB3AiĈJ&^u=~id6&L~:C'N*P@P<yS:"۷kZd &<r{.*Qʕ+2eʸl5r Ե�k׺תUd!wqʗ/*Urz4iҨu � � � � � � � � � � �J xu:  � � � � � [ҥK.oΝڱcvh!/_v@5kVʕ+eٲes!_';vA>l7 4Ydʝ;whhO۽ߪ9I8p L6u+E~9 ./ QQۄ'Mujj)CuL7&/_\+WԚ5ki&]xQɓ'$/^\EUµz@=oX,6oެGAAA Y P,d�$� � � � � � � � � � �Ā�A1J � � � � � W^e϶܂-,''!,K,C3gάL2鮻 }Ϙ1ҧO/ E^O8cǎ鯿n!zzڎ9nJ׮] =@ԩ]cΜ9]>z=ɣ9r(QDr5rHwMy7Զm[YP? saf_[VI Q2.nOn7nԖ-[\ءZ.`ݓ(ugF{vqoӧӤI1-(<UdI\ԏ� � � � � � � � � � � AƬ/#� � � � � @� XBŽ!fp #ȴiӺ7 ;.]^^`x+E<y//^tc{_gΜͯSN^'Oeah/[} ,d^iAׇqf͚U;v r[]vjIw}h]CO?ԅ[-ZP$IždĊ+(kIfI?Î "`>Lo{)_ GD{w႙-,ׇg{mI硘n>w{V�Go�Dm mLRp7o^XPlٲy7@�@�@�@�@�@�@�@�@�@�@�( %.6F�@�@�@�@�@�'`d/ >N8fgaD7 jy}8sdɔ8qb>{^y|ҥАGoأ[dd�( v +2eǎ3eEO4~xgڰaCo^+Wll@ <xP 3͓' T{es>]jyܹR:K]ħ1bG²x&ψ#Լys >\iҤ =ٳge E{!Dۂ-L2}v�מy&Mr-0=\r%̗=>zfǰgo8[t\-!� � � � � � � � � � � k }-J � � � � � @hIp"{%{YH7|-eG r +ʱȰB#ZfaKBi/ ~)S6y?[h*UX3ɓ'Pȕ+W{u-ZLG={O>8q-}vqZ]gϮ^z8-Ƈ߾]*_^__KvLW$ 6gÇ5j(5i$# moPݮA tuV޼<! H{yK,T.}O> w>2bG@�@�@�@�@�@�@�@�@�@�@�)@d4 @�@�@�@�@�@6m!-\B3z) YbE+oѣ[=ׯ{+Ν;k֬Yڵk :|uiKl뫞/`Ճ RϞ=UB7N9sISHy)� � � � � � � � � � � @E{OvD�@�@�@�@�@�@~1B>|o߮J*H"2d[* ?3rJ%MTZڠAm۶-N|o>͞=;N˃HMHcL/m+ <xPժUsAo~G@�@�@�@�@�@�@�@�@�@�@ P4D�@�@�@�@�@�@TԶm[YF֭sz={TlԢE -_<i0@(_-Z9sh޽*Zy9r$V˿{Uzu :4V{Ui2o,Yb@6m/C_]ϳͨ@�@�@�@�@�@�@�@�@�@�@�JR?9. � � � � � @*UJ|򉂃Gi˖-z衇TX1 >\'O:8Y6lؠ>LgVԧO9s&2d_~Y .֭[}_\t2f4d4vTt\T1<δjJ5Rƍ~z=� � � � � � � � � � � � � � � � � � iҤQ]իU|yuMٲeS֭eh@DԲeKرC={t9zh]z5KQ .?0ƏcGGI8}"V\%J�ڙ3gjԨQ;@ � � � � � � � � � � �~"@@�@�@�@�@�@�=e>Sppuֹ`H 1bN<{p$n!2eJV{nOaOaG*UJ/Y_~Y'NѣG}i,RÆRZ;A9 ,~[+V=ܣ͛7^z<"JG�@�@�@�@�@�@�@�@�@�@�@ 0 D � � � � � �1 6mZi&XB%KklٲUVnY .@ƌ5dmٲEٳgWժU=a e1՚5kԩSkȑ1u{Tt҄ 'ϒ�ݻW*UR~4x`ʒ%K8{ @�@�@�@�@�@�@�@�@�@�@�|%@$@�@�@�@�@�@ x;V8p6nܨ *Xb:t?(TfϞsj۶m*RvSN|p)S?#Fŋ>^&l)8 ͜)O@/ǫD:}֬YN:ySIO_g � � � � � � � � � � ��A|v @�@�@�@�@�@ ҥK;jÆ Zz, Gʖ-5k9k\/PF m޼Y֘1cT`A7N, ч^Љ'4qD3]4c4m7o^6~ihB[v!ECc  � � � � � � � � � � ��Au(@�@�@�@�@�@ 6ʖ-ѣG+88XC J*ptر,c!*$Iڹsx jJ?6n~Ț5 }2y]@4tTk� ,]TŋO?svɯ߄ � � � � � � � � � � � KA4A�@�@�@�@�@�\4iҨ]vZv֯_ zKٳgWӦMxb \y*H C 1bmڶKVNtԩvW_}U[n՜9s"}loeԼԾԡCl!/_VUjUw8իW@�@�@�@�@�@�@�@�@�@�@�x*@d<= @�@�@�@�@�@ fJ,#G*88ٳDžk,XP ѣGc@8\lƌJ _[UxqլY#GmRz~) {Hjذa5jf̘3@�@�@�@�@�@�@�@�@�@�@�x)@d< @�@�@�@�@�@ RJ֭[kʕڼyjԨ~)Gjܸ,Xk׮t@@PPZl) ~]6m~Vz;k׮ZtV^};t+WFiRҤ>~J*%6_^=\@�@�@�@�@�@�@�@�@�@�@�@ >"c@�@�@�@�@�@�SbŊiذa g}ޫW pÇi}<a dȐAGֲet!sРA D*UTlY 0 ZN;KkH3gJ2ՠAuA=e{w@T� � � � � � � � � � � @< 2T� � � � � � 7)ST]�߯z�\rPٳgG;/nFQYB ڰawﮞ={\rڴiSԵkW͘1C;wO#/e@ ̛7υ_xI � � � � � � � � � � �L xvB � � � � � )RD~=u_ԩS[ɣ޽{k߾}Q(Uk H ;TlY曺|rݰaC͛W~知_z|׽+pE˪UT͛7RJ; *G�@�@�@�@�@�@�@�@�@�@�@ O0C�@�@�@�@�@�[ɓiӦZhvء?=zϯ5jhԩtR@tR 4Ƚʔ) 6Dz܉%R.]_Ñϗ8 =Tԧ/{/[`˖-9=vX7N&MRt{PT� � � � � � � � � � � @< 2`� � � � � � ? P~th7(I$zg#Gm6)J❀9vI7oVU|yW!!!kV!C <8Rr̙㥠 _N_k4d-[?nڴɅ h@�@�@�@�@�@�@�@�@�@�@�%@d:ߌ@�@�@�@�@�@,�A={ۧ_|QӦMS…UbE}:wTJ Q Zx %}on׮]5y.tԨQ:vXr֭3ԩ}3}!V͚5ݜѣ.]<y`@�@�@�@�@�@�@�@�@�@�@�(@d< @�@�@�@�@�@rȡ޽{kϞ=;wdɢv)k֬zvZ)J@Dꫯjݺu:J,qE8+E裏"W4u4e/zW`'xl2K'Q9 � � � � � � � � � � � P x2 � � � � � X0_5<wSu!UlY(QBÆ p* hOVr-[TӦMuԩ[)UTz5|peQ\1gԣ4xQܙgΝ6h@ӆ T|x6J� � � � � � � � � � � @ 2agF� � � � � � @2e+_U˗/Wҥս{we˖M>/^k׮Ј(՟%K Z9EƍoYK/~mgfͤΝcH [N%KԴik̘1J:N � � � � � � � � � � � �Aa@�@�@�@�@�@�xe_СC{nUZUsCGT5jԐ@̙SOSt /裏>ҹsv:%կ/,(O#W^͛7' Q9 � � � � � � � � � � �8 ! � � � � � � �iҤs=+Wj˖-S>Ν}>}._�#DȒ%,X.]Cjժ.\v\&=t4c<ҥKW^.fs0T� � � � � � � � � � � �7y_@�@�@�@�@�@�E꣏>Rpp&M 5j9r�~A~+8qb;5k'q*VPoL/j:{ nK'Tٲno@` |׺{nUR]ۃs0T� � � � � � � � � � � � _$,@�@�@�@�@�@�@ 0%Kƍk޼yڻw^x}7TB3FgΜ P Ԯ][k׮ULXt >{Oco'E 0N:͛gQ̙.]:mݺU!!!аaԬY3 *U*=z}~]:g'@�@�@�@�@�@�@�@�@�@�@��AѦcG@�@�@�@�@�@�G W\ݻ٣ (w.2K,jݺ~)JF@Zrʕ+*UhҤIg̘Q:u}8RRR۶ F%Jpᾏ<Ν; >>Z6,Yr9;!� � � � � � � � � � � @6;"� � � � � � AAAV+Yx￯ 6Vտ*"H:fΜ_|Q>{R_}U]tIÆ ]'NH ' 7|SXHmٲŅf˖MN5*Z̞=?[,C�@�@�@�@�@�@�@�@�@�@�@� ;KzB�@�@�@�@�@�@NgAׯW5`�̙SuՌ3tebS QD4hF޽{C Q Թsg*UiSyi4)ihuNݻ]P=!C+sʛ7fͪgϺo߾(k~X-uam2@�@�@�@�@�@�@�@�@�@�@��A'@�@�@�@�@�@�Vdɒ6l5qD]tIO=gϮW^yE[n),�oї_~&Mߑ~,?V\I-Z$OwG vB Ǝ%JŋZn:v: iL>3(E=zt'Nh„ jذ8ۺuk9r$t;'G߯޺3 � � � � � � � � � � �^ Hߛ# � � � � � �~+<yr7o<۷O/fΜbŊ\r5j,`4hsjPץK <Xǎna.[o_ip|07a!NQFԦM=Zj .|8 ,ܹsesn|[6bY03dK.ٳge=\h_֏]j k{!� � � � � � � � � � � %=!� � � � � � P9sT^k.-ZH +(k֬jڴ,XWԘ(6v*UթSDžY d_Kud۾]j\:mHf]k/+Vh…8p%KQ͛m̙39vk.>wMӦM/駟lk֏]j k{!� � � � � � � � � � � %=!� � � � � � 4VJ?^46dݻWիW[wȱQt -[nܸwY Fww ȡtwK_DTBҥtJ(Lm_c 6^89<9U۶mկ_?1BO~7nHK KÇ?9 pz???W5kTk.ըQ#uqڴie˪dɒ9rdhĉ  =W8v޽z/ � � � � � � � � � � � xA:="@�@�@�@�@�@�bM E޽6lؠUV3fϯjժiĉyfĎ%Pxq-[L6m3f";w.]f͒<<ۜ8y+WΆ8;6w?KiҤyLdLB>gG =77Oq� � � � � � � � � � � �(@JB�@�@�@�@�@�@ *CԩSZpҥKgC"M0Y׮]vZG(bYTRZxV\9rh:t#ki\i4)[G6qB`Ĉ*]&L;vIA`d۶m,Y2ϑf � � � � � � � � � � � Zu!� � � � � � c_K4uT7n8͛W:uRlcTxUiZt Me5L[///%NX- I#G{_1G߿.PfΜ (M44k֬՚5{I}&UeN g.^.]g< zg… a&҄AO>$XBVZ wbrz~r@�@�@�@�@�@�@�@�@�@�@\:C�@�@�@�@�@�@�H6hڱcׯ^rR͚55eݺuˡjvblHIk.<@޽~oȑCNPɓG)R۷oGvH[~'jZ~}xjJһqJ`*V+<8x'4 ϟWƌC}u]z5ɓ'w Y N8 &!iQ<E � � � � � � � � � � �<�AOF'@�@�@�@�@�@�(^[9sFsUdԥKeʔIݺuڵkA k׮\cMta߿_W&qƌԧOժUΕ/_>2d'Rҝ;w[4xW[oٺ{:ɳlFJH!l@0믿v^|EܹS*Uz5G>+Qʕ+A`WsdM6ɄD9r6o۶ 4E//ݎ;hӾmԃ� � � � � � � � � � � yȏIK@�@�@�@�@�@�G $PÆ 5o< 9x`mٲņϟ_||||ȣ]1a)R-ZT5jԈaԩmH ꫯTT)޽;8q''5kӥॱ!Lc2e4uT믚<y?\p Hfƍ6,֭[ Ҏ;TlY5s+WTڴi پ}{{=k֬a>ZYBxϧy?<A�@�@�@�@�@�@�@�@�@�@�p -#Ǩ*@�@�@�@�@�@�@ҧOz&~4hU;YfJ4;uƌM6)Ydʙ3L8⃛+WK&qС}-Zdf͚%Z}ʒ%rʥiӦĉWgۘl_~mfL({]Zl!"lc]prέ_]y2!L7|#8X|y-YD9r�w?`1{Xbz7{,N5[׮]-[6}ŋ?~TZ1c뾾lf_=i'OjҤIJ(oU:u=[~mSD uI=oNzzzO>e'Nh:|s̙3 VZ"6 � � � � � � � � � � �-Q � � � � � �8 6lΜ9y)UT޽LЖ Zr r>muMƍ �K$ 3C ^={T֭ [j8&죏>҇~ĉ�p'O?Ut;v2dȠVZEL2iѺyD̻_oMNH[ $jqʖ-k߳hB)RD֭e4lP ;wlCﯯF6d׼gMxo.]B/?~\*T!fls?LУyXB+WW_Lk 6 >6AzG!f|% ~|6fW^yņ]Ν;WԾ}%ETm?@�@�@�@�@�@�@�@�@�@�@�^ HE� � � � � � s $Hp͙3GgϞ_|{ʄpʕKÇ{_ɓ'fGժUK+V0cm7m$///yxx(}8qJ*6~7pڶm oܸq%JYOm/GU޽ծ];p4TfB&T3gj„ "R nA}vN..F#Bϊ+SNi6 FiBU98h#XhQUTɾ\bk~~~*W'Oqͼ;MfCMfHiӧOۧGۮ vM4_vyv1o6̈́Zpc2elxŋ9hBMcx}a~Snnn]oͺQ}@�@�@�@�@�@�@�@�@�@�@�px[T D�@�@�@�@�@�@�H6^um޼نgjJƍSlרQduˑ#r-ֳgOЯ_t-Z= a„aN%M9jf6c֢E @4{27oܹˇi]vm{lkۺ[2Fא@ ܸqC]vUӦMnYM_to&ʦK.Ж- 9sfwnVrew 6!![;38x!_ի2f;wfϞmﭹzR޼y,Y2̒%k~M olnNpGhB}C6ɓm@rʔ)CyG*Y,X`|"U_|A�@�@�@�@�@�@�@�@�@�@�pX P � � � � � �q[p:t|||tR̙So2eʤ͛k…68˙L 4k0Zʕ+u0ae5ĉ<yVOy5.:#ĄM4I\/Z!6m 3A? |^p!8D5Ch볘ÙǼw|re{T7} b۷˼;52 ||p˞=֭+ooog6ׄ>?6駟lX}?nٲ:u'NaÆ2aoߎT}w@�@�@�@�@�@�@�@�@�@�@�7{FB�@�@�@�@�@�@�8,`jժ_~Eϟ׈#kdɢ7|ӆ&:A@@ʗ/;wM6v:v+V)„ Sf$!a >ؿ=e'#O6]vm.Yf3f s>*TP~ԧO=z40'|J*ɄڵK5zuw<Li}=N>'O)%Xd $I$poݺ%gϞ6T҄!CCڷo+%LPeʔp9m4u@]E81@�@�@�@�@�@�@�@�@�@�@�bD af@�@�@�@�@�@�@)ԥKy{{K"E@-娛fȐASNرcy)f͚4h;֭[=frȡE>k0ʕ+gW^-[qŊÜ>H&=Z@IN8jժ /Ҿ2g<q{)S'kݺu!O<tH>4XĉUD {݄@w U7o^%KL3gCwy{ԗڵk+gΜolpdƍգGۼo߾2A^{5ܲeK>jִj*N:=nn#� � � � � � � � � � �<{ 13 � � � � � � SڰaV6\)N8Q7nxmӧ.3/l'T4!mfz_|˙PFsڵk+Vل]pyxxٳܹs5?B9gΜk&p3]tzwCEח hںu ]2T/^\W\͛[o AYfeɒ%&ʌ9Uhu[ɓ'u6,ќ4& ׄ7NөSlOs0l>Ԅ�I 5+WVܹ /׎aޣm޽_~2&S&�?=7Y4idB|&hq=86 � � � � � � � � � � �'@*B�@�@�@�@�@�@�ʗ/#FȄΚ5i3m۶6Lфf9fXx uIo6l]ۖعsgZJ%JcƌQ5w\5kLvLxbv-Lgի~'o>4F-[_mׯ_ZjY&DUVj׮M6ڴiV^6>y 6A.Y$e]g<[6!Ey"Єfʔ)&^K$ ̞={ɬYu UPA{ տehF޽{mÇ;ȑ#ݼ~{μ;Ԅ?w͛7wޑy <X .T.]l{o޼yh0d_L<yl=zIM lҤG? Ё� � � � � � � � � � � .xPtUmƌq@�@�@�@�@�@�@�._rr2a&u6TRwzg/y?ߖ-[ //BϟW|l XTt%ٳG9rPܹ2TvA-rt?"k֬A}~~~0a Qy#szo>x&8wҥJ*c:cք8^~]Ŋ!k2M4!"QB��@�IDATy 7o^%O<BӥKrh|0)S =/wQDtYyxx'OT O@�@�@�@�@�@�@�@�@�@�@�8@�@�@�@�@�@� ٳ֭[GW_oҥKH"2>>>1*eBM`Wĉ%1SH D9Ҍ6mZUZ5B ͜FRlԴiS36A޽{߿U%Jhݱie}}})SW^ |M?*Tnio&M,=<Md3dswwTioB ͖%KpC ͵g`C�@�@�@�@�@�@�@�@�@�@�-nߑf̈@�@�@�@�@�@�x27jɚ>}._ʕ+]vj֬RNdE+4rH~fϟך5kl XJ|'Q~}o {E 4枌3&i38|ڶm{oQ=,… 6Fgh4f ~U<X ztA�@�@�@�@�@�@�@�@�@�@�)טy@�@�@�@�@�@�@�(_~G;wNϷjolҤ̙wFk)5jԐw֬Yv΀h߄@رÎg6oެ;wD1P޼y5i$7N}lXDZdIj۶mi2Ϲ2ed?ǃ͕6-!p� � � � � � � � � � � \U."� � � � � � �H ׯoׯkٚ2e7o)RYfj׮T" A޽{+{j߾me%JA]2?J*rU V\d)K.[nZ`!Cȼ3a3f˘1#5P6]Q � � � � � � � � � � �pd;!� � � � � � �N+<yruI˗/שS4`�mݺUժUSΜ9կ_?ܹ33!˖-d梺0Ix1q7a|[֖-[,-Z}XB_|Ä@z0aB[@�@�@�@�@�@�@�@�@�@�@�A[@�@�@�@�@�@�YdQ>}m6ݻW۷̙3UD )RD~?8+WֺutYUXQǎ{CQƬ~:yd|X2k%wwުUT]vjժTͣ5A2ezt � � � � � � � � � � �  � � � � � � .\?FXzu}wʓ' q*TH6lPUBm޼Lj/mg Tn]]r%,uƠ }-[ƌ &hڴiJ*U V.\@dh� � � � � � � � � � � S 锷@�@�@�@�@�@�@ *V(xY-^Xy￯,YN:<y_i3e$ooo.]ZժU… #754-ҵk׬7}FAAA>|ʔ)dɒiΝС3-z=2f=1  � � � � � � � � � � �8�Ay[( @�@�@�@�@�@�bK=4… 6�2A֭2dȠ͛kΜ9scK4s ,P6mԸqc9}klٲ?U~}ݾ};Rh0uU޽mի;wh c6Al � � � � � � � � � � � w!� � � � � � @$IVZ0G6|p]|نAf̘Q:uҥKșLѣGW^6.(( hٲeڵk6m*??ڣ pB+VLҚ5k4h EaĘJdY3 � � � � � � � � � � �%oh2f̈0/ � � � � � � Ν;b__ӫYfjݺ<==n&MRnln~r˖-R͚5u飑#Gڠ^ɓ'w"]CtԠAթS'}alTB6Z3Wߥ4o-1 � � � � � � � � � � �"@d3) � � � � � �Ǐ@H ge͚U-/z-[TrZմiS.]ZsUʔ)j iڵU6lɓ'0H~ضmڶm .hԨQ6pq}{0aBEظqc͙3>NA>kaG�@�@�@�@�@�@�@�@�@�@� ט9@�@�@�@�@�@�@�*;wn}ڽ{ ҥ-Z\ׯL@]VfMYFRJtԩK|' h6Xᆱ|E:t}2gά]v9eYQ dc cswu!� � � � � � � � � � � A:z@�@�@�@�@�@�p "Eh:xo߮-[j̙*] (ڰbŊiƍrqqu;wtU8N)^^^ߵ|r5jHov!L 4H~d˖!j@�@�@�@�@�@�@�@�@�@�@�@QA>J � � � � � � @J(/Bǎ_k„ *Z{9=Z? *ʕ+kٲeQ-vԟi ֭7nŲ'1c/`վ}Օ i� � � � � � � � � � � �"߀v&E�@�@�@�@�@�@�$PlY}ڵkUV-;V+Vԙ3g3gNÉ''HL2־}/ʕ+Kø'puuI-[TVm6,Y2-!� � � � � � � � � � � @ 2Z� � � � � � �&J*iذa:u ]._,p={8Z^OѢEzj>}ZUT^ĸ TD -^X .Ԉ#8q @�@�@�@�@�@�@�@�@�@�@�@�="� � � � � � �O)p( 7\vիg?Ms=hǎO9CV`A[NPvɊG}ʕ+̽7  � � � � � � � � � � � A:]f@�@�@�@�@�@�S! .TH(dڵ5yd,YRS~y8YL9lX1ԟ4lj;f aÆiʘ1R@�@�@�@�@�@�@�@�@�@�@�@�A@�@�@�@�@�@�UPoV'O_&Mh֬Y*[r̩޽{k ZckTR/:uتyĉUD ݺuK[l믿l'dt@�@�@�@�@�@�@�@�@�@�@�@ d@�@�@�@�@�@�@�V?ѣGm6kN/VJ-[6rJ<NCSN:tА!Cr?-[szWl j"EoY@�@�@�@�@�@�@�@�@�@�@�@\誹EG1#Fd@�@�@�@�@�@�@�٣ٳg}J64hMf͚J0ax乑#G7Pƍ5a%I$N3,[۷W``&Nhe3@ڵaKnnλKKY@�@�@�@�@�@�@�@�@�@�@�pdWG.@�@�@�@�@�@�@�xj׮]hj߾}_ҧO֭[k̙qFġ={Բe˴rJUXQ'OC?Kw'///-[M)[hD YԄAD B ﯄#� � � � � � � � � � �)@s7F�@�@�@�@�@�@�Bg 7nܨSN>Ӆ l lذ&NK.k_U͛7+(8%L2ZjU\[Sڵk/_^?~g͞=[iӦ@Kt /_:t W@�@�@�@�@�@�@�@�@�@�@�p4 P � � � � � � Y_׊+ty=z(cƌQ{Da+W._^&f͚1bD޻w/\)S0R6rH.]Znnnھ}v^3C %ּyDW� � � � � � � � � � � <?w@�@�@�@�@�@�@ rҥS.]oW 8pr̩2eO?޽{#7J4f̘A@:͛V{=6,2܎'l0oAzoi!j"3_6-N � � � � � � � � � � �8KP]%hH @�@�@�@�@�@�@Ab ͝;W ,e7nF|rqqq#_ҥKծ];eȐAfR…C;^ZժUl٢bŊ^KbŊڶm͛7dɒ2SNJ(L"OO虔QkRp{xi55yԶ8� � � � � � � � � � � # :rqԆ� � � � � � � ]F3ghݺujذ̙cdɢݻkź{nC#5رCS /I&ٙ_6mذ@5mTn݊4} 4!![ꫯN:Ν; 3\)_Vp×$PA�@�@�@�@�@�@�@�@�@�@�@\*EG1#Fd@�@�@�@�@�@�@�سgϟyi֭J4jժFlCc{յkWݻwOB ծ];?>:c`ˆ7c;wn}G6k|GQgK͚SRJX@�@�@�@�@�@�@�@�@�@�@�C HOT� � � � � � �ĸ3g` -Wre ٰaC̙3kʄf-mڴ͛7_UV½ ܸqCEq…W^8wHiJnY ž@�@�@�@�@�@�@�@�@�@�@�g 5"� � � � � � �,p5-YĆBϫWx!l dB!K*%X2/]ʕ+ zq$I{nɓk@N4uTNRL(cƌ$ t g,H#� � � � � � � � � � � _""� � � � � � �Ķ@)Բe _]0aʔ)ٳW^6,ݻQ*/1Jw~WtG秦M޽{Q*5k&NHc7Ծ}xŸ\]@&H!OH@�@�@�@�@�@�@�@�@�@�@�G Qu � � � � � � �N" 8^? m۶͆,nڴIuUtlItҥ'^UN]p>ԩS5w {n>}Z]tKwiٲe7nN ԩm`Z۴1@�@�@�@�@�@�@�@�@�@�@�pp-jlߑf̈@�@�@�@�@�@�@L… `XBX4h`]Nf4{lIF&vڏQ3gΨpº~"ȗ,Yy#)]3ժU tww%KaÆ64tґkfxC UpP� � � � � � � � � � � A:m@�@�@�@�@�@�@ ݆B.^X.]Rm wRJ[nـ@0[oiСi:/_?C-ҩSfC!ְo>eʔℿ]۷|&LxfMf7!4&L$I(q|7確}ׯ_ ϔ)SǗ_~نkM6? ܹsG._7n淴kWYeիwDzo:uvO"Ebi � � � � � � � � � � �qA ȸpY � � � � � � &pÆ 6r…:p [S 4&�rŊ fsi֬Y*X`kOspq iB*-[fBB C3*Uň6hB.}}}~&.&΄]?1bk33!zC{nҤI 2̙3\ 4!&XbjԨ |8Z;Ƭ cYC>O>ۆ? Go.-͏lf_5,Y(Gʞ=|)O<60p@�@�@�@�@�@�@�@�@�@�@�g(@3eh@�@�@�@�@�@�@�9"i5kF60߻w/LGf!u-̵-[`ŋk6wU d~ܹ0ŋeM U /H(ɓ'W$Iާ 4Ynj5k o7!!MdHA!̧ ?fׯ_hff=3gasM ˖-ݓ%Kv?㨀m۶>[{վ}n~?fK0fh~&T4$`|=Ey̧'ONgw0ٌeiVܞ:u*tzjh  P…^dI-[V3f � � � � � � � � � � �R g � � � � � � �0AK.͛7#Ӹqc7*F0M <|?n?w%0uؠ:lh3e>}zݿIEbzlbB'M6lؠgʬ?>LPfBB6+WF͛WL h_<C&4mڴ*Z{9h>n!Lv5<xS߿_f7aGgr^zu/^<j D�@�@�@�@�@�@�@�@�@�@� cƙY@�@�@�@�@�@�@�#p!,X1$www8}tU\MaHہl4!&.d7o߾-Zp">e ]xQOɓ'uĉرc6T 榜9sPBv ,RH~>;w?C˖-Ӟ={dB<˔)c˖-+Og._͛7kӦM2a7nԥKl�l͚5K/VZ6YD � � � � � � � � � � �+@*C�@�@�@�@�@�@�7|~vuu 8p dCM'___m۶vݻm?hЄN˗φȑ^4v[G& Ԅt6L-[6-ZTŊSɒ%?~D{= ݻwtR͜9S ,=1!fZ&M~g'<۷k6rݺu26iӦB:}d@�@�@�@�@�@�@�@�@�@�@Qt;A � � � � � � @<\Lؚ x|̈́.\XӧmL2ٰ^f7!=%J$C6LǵgϞ}ǎ2aZ=.WBv[`^M6iȑ5kn޼+Yf2A֭[ZdudMeդIyxxD/<!� � � � � � � � � � �i eq � � � � � � s\zUiӦź* Ez777IFڵK/d3fqBk.m߾]&pڿdϞ]2UTQ"Ep_1:u~'lTu-Z(s̱_`,Wp-]TƍŋK.ٳr1= � � � � � � � � � � 3 w@�@�@�@�@�@�@�8.paM<Yɒ%Sg tQm69rD&$x6RJXeuXnܸaC!׭['oذA׮] QTvme͚qC7oԏ?Zׯ_ݻwY`gΜرc5f;wNm۶U?zq @�@�@�@�@�@�@�@�@�@�@ @�@�@�@�@�@�p ͛7O/TD Wzu�i"H @&<VXիW֭[*V֭ \rrqqhxsΝ;6l {^}U[2d7Q]N?܆ֶnZVܹ:4@�@�@�@�@�@�@�@�@�@�@��Aq$@�@�@�@�@�@�@N8_Ug֭[:ujթS/att3Vnf-]T .ԡC%K5jHZg 4]>}wyGo}V:|Y5k  lk5ĉ;|� � � � � � � � � � � sAƜ53!� � � � � � �klI~zeΜY͚5SƍUrec38xϟ3fٳm۶ҥuϟ?=zhjٲKӰa'(}3fW=3  � � � � � � � � � �  � � � � � � �#m6 >-Z]v6yBqFرc6tĉ:|V^ziӦq6tѢEԩRLc5Ǚ` 9w^u͝;W}է~gWFO9 � � � � � � � � � � C hP � � � � � � 7~7UREK֡C4j(?^G!t@ƍ쌫ȓ'o֭S9ԱcGΝ[_}nܸzd̓VU^=ܹGJEυ̙3k?~~⋺|r ( � � � � � � � � � � �N+@: G�@�@�@�@�@�@�_`ѢE*U7nlo.׮];%N@JbŊ4iN>=zrʥ?\ovj�uYC ȑ#m0aҤIzMT 믿t ߙ3O � � � � � � � � � � �,@d42 � � � � � � {nyyyaÆ*]9)SD ҥӀtI 8PÆ So@uA3f̐ g޽{88y(Q"UZUNzS2> � � � � � � � � � � 7@�@�@�@�@�@�@�gz&ф۷OGVΜ9q9'N7|SGUΝխ[7K:qSɼ;={~7[SNJ͐!V\ɓN:zj[!A�@�@�@�@�@�@�@�@�@�@��AQ  � � � � � � c?J*ӧkѢE*Pc�GH,={Ν;*Y̙eMoV'NT՝^dԩtR]|Y]ve} � � � � � � � � � � � @�@�@�@�@�@�@�L`ƍ*[RJݻwqO6ըQT^=}WO;jO>#Gڹ? ޽?XM4Qպuk[.ңܸqC'OV˖-eU#ϗ/էO5o\}#.\^z?l.i֬YzzjmVر6oBYd ;wL3  � � � � � � � � � � c @�@�@�@�@�@�@�0!5kִK,Q y͗/_ʕ+h"ݼyw/^f/=Qsш#vZى]&&iӕ+WYEcE&WWW 0 <X LXiӿL򑁇RT,O:|,YynٲjƏUj͚52I&B ?jUTQϞ=շo_ݾ};@�@�@�@�@�@�@�@�@�@�@tE � � � � � � >}ZS˖-5j(H ԫ#s=8IRԡC{xZ~};nݪѣGGz,Y[n*TP}O}Gً&8d gHm7a}&Nra>ͳi㏕$I+6 1}'aQj*jԨ}<wvI,\~]cƌ(tE�@�@�@�@�@�@�@�@�@�@�p6 Q/ � � � � � � @]tQ<y4rHhe1\]!^k֬/[lgȐAʕ =v-3cGɓjӦM7~Zr"]3!&h7ސ ^ẗ́@IF[vb[S .nsQ޽UJ{={8pgϞpDd31vبE@�@�@�@�@�@�@�@�@�@�@�'pwZ)@�@�@�@�@�@�@|rmڴI $ʖ.]iӦܹsj׮ڷoy.\PR*eʔ?3gjժU:tʖ-C*Ydcܾ}[_|֭[gך3gN{G/S {6l.,7f̘0}(00Pjoݺcǎ_~QڴiC{=|ԩSJGUuE{/Ξ=^z^5w\[2}zqe/_>㏶M׮]㧟~8ׯ&M?<qs,ZH 6>u___}wڱc'O;vv,iL%JbŊoZƍ5e8p@&ьײe5o&*_jժ92cy&M#ۼys=چa'."� � � � � � � � � � �8�AN}(@�@�@�@�@�@�=SB *SL< W>}Tb-[ @GSfW_ٳ}v%NX[a{Ç횮_nLfΜYf/K?2yufM]tI&n͏ tuuUӦMzjؤIi0A&Ҵ "ì7-k ڶm+///-YD5A&:(G6\ܻq{Իwo5nXSl 4v枘|Aukcwww!Cᅲ[LLݣG=Ǐ_T߾}Un]=g1W\ԩL hBgƄw/spB[9rwĈjժ}Vg̘+V<r ̚5C$W^cᆪ6?!!Ѓf RCREt D^B^EPAA:ttS'& I9w֚93{ϔA|<~>WЎ5kwի>Аt� � � � � � � � � � �  )\#� � � � � � �x uSN]lYmڴȽ{Ⴆu=zn@@ܹsZx $̘1ʔ)cyZf>Cʕˆu-xb1n]I~עEx$ń<͜9s*SL2qjղVTɞbj7k%#1sL+vpKir}z B 棂Un]τEFGG|&jv&0G6@Uzu>%~kkwܙ_1#Gty/^cѯ_?{LФ3fW_}>_FO:%k.͘1ײ\r2:uŊӠAl 4rkkKC Q@@^$Aʖ-mi B � � � � � � � � � � �J_^(@�@�@�@�@�@�@N>mSV"gb>v;fP-[Ǚ3gTD EDD(K,6:c>*TDUV~cٶ>jժpGbpM㶿EڐG~ 8Pƍ0m7oʕ+kŊ67绗k>& ,J 4=~ʔ)7f1Ϙyhv_/9sf.\8 ρ Y5ըQ#иqc-]T'O#<r~/5~ر=ݘknWd � � � � � � � � � � @ 2]R&� � � � � � �$ tۻwo Q\ cضmz7xC ,s=ҥKpwa;vLjՊw;|нM8F__x}yKb|n<F:hС6/PN5w:y.I&1cFײW9p& 3gNĉ ۷ok۷o]]z%t,,,>ܹtOg= 55jޝd[s-c@�@�@�@�@�@�@�@�@�@�@�T#!TB! � � � � � � �^%P~}jΚ5N:%x{nEEE]v3g.\]`BwۋA��@�IDAT/ڏk֬х ܻ^o+NH7SGb瘘g5~z=ޘ۸KƉ'q޽k>zmilݩ%2wʛ7l){,VgСCWގ&K  (oR1qǎCO,Y2b�@�@�@�@�@�@�@�@�@�@�@�!@dT� � � � � � �x@=Kﯘ:7K<y {'O{̙3m .l;wNqC"##m[wƉ8?LcbJ7S``{ >\hԩtwhcPA@6,qݑӟ s_$. 6LO?tu#Ԯ][ϿSնDʞ=&Lkƞcs.]o߾}PzutҥNYz^fxLc2e/u%==\'UV͓ � � � � � � � � � � @* 2_JC�@�@�@�@�@�@�R@"E/o߾ڳgO~;{k8psoM[94i$5jH_}|I=`6m?ŋ5emܸ4֭/^l<phBܮ7i|{ή]F<x{Cgw^b0'pdY5G ?~Gj6k̞qwmPPΚ5K&>ꫯjĉ{+WO?dgL#e>~ypD֭[kܹr#p֩SGo񆽎&x288Xwu5O6l(s}M8{3g &tl˱cǮ8矷ytٮ&B +N&Lqʖ-- � � � � � � � � � � �"A*vWOmzGA�@�@�@�@�@�@�Hs͛CٳgOr-[>}6Gzg{�Ⱥuʬg5sLR`ŋk͚5ҥKUV-5oɄ ?v9hMdʕfUVUҥ:Nrl ?45/ʚ5#X&dV Vׯg4j֬bŊ]dg$;u$h+VXVZ]w-z{aر z< 5(O<6psݺu6pv Z_ZsJ*!Cjvf&\WرcGqkիLXn6Q,Y^3gDF7a>2lҤ d=~i=zT&pф֫WOYds`;ܾ{ڱcƏoCY >}F_~e=a3&PpolaذaCyf;ț7o"_}w@�@�@�@�@�@�@�@�@�@�@�]'Y<5v\=9ς� � � � � � � N"""԰aC:uʆ�Զ߹s 4Ꮧb˾9pE8p@:{:]7NܶIfHU fTTT 42dwicLإKdV|7[LDŽL&ru]? ]vr }C|zlЩ ?O™#Gto@7mڤEg#N̳`B]3f(D˂� � � � � � � � � � � ~L?ך"� � � � � � �I&`9]Æ S۶ml[oS^sJ&rѢEl>&M\w^:tn;oncuцΜ9S*UJ1իW-[&T[-PB{w4p@*[lBM؇� � � � � � � � � � � F輘 � � � � � � @2 dϞ]3fлk�'O>H L*of͚t,<K,<s̩_~CUZmAdd>3 0@w}StL�qTJS#FHLq ]>74'|B8|G�@�@�@�@�@�@�@�@�@�@�ҁOxjڹz?S= � � � � � � YF=zΝ;+wʚ5Mz9s <p}u]>>>S9sP>}4x^no2:uСC|  � � � � � � � � � � @�@�@�@�@�@�@�n^J*Zj ?X!!!Ot̙3HXV-hnmfCN)Ұ5nXcƌO>dH#0m45mT>KP@�@�@�@�@�@�@�@�@�@�@�ҩ�A3m@�@�@�@�@�@�@ )|}}ճgOg;CEڷo_RMܒs4bWpp6oެ!C(00Nɓ۷oɓ'Sft,'ݍcq[lGyDFyO � � � � � � � � � � �Oc<5v\=@�@�@�@�@�@�@ -9sƆ}ڵk {G6cƌia֭[#GڀHϪD^>YF[sFXN qC[n7o>c! � � � � � � � � � � w dr@�@�@�@�@�@�@e˦gyF۶mvmPBz駵l2EGG{ԨًvޭA)44T*UҒ%K[o\TUT Zիg'NxULoVʕ֭[Ed^T� � � � � � � � � � �$G1ot2~z@�@�@�@�@�@�@�*p!7NcǎժU-Zy6.SLiu+6lؠ hΜ ZzڷoN:r)XY=f׆;ѣ2d)+b ~kB7z)ʞ='@�@�@�@�@�@�@�@�@�@�@�4 @dL@�@�@�@�@�@�v0M<ٮ+WTlT~}w}v-QOSH ""B ,ܹs9ڷ||N9|Ub5ʫU3J)00La?hС*Uv 7ޡ׮]kC'M5kO>q;!*G�@�@�@�@�@�@�@�@�@�@�H N@�@�@�@�@�@�@�nV <<\g֬Y4|:uJŊSzTn]s= 9/ _U/֢EdRzu5i ~lc*?d5k{]( BV6(u,ܾ}~m;>_/:v̙3{d~{=ު⤊p͛{o:A�@�@�@�@�@�@�@�@�@�@�H{Akʌ@�@�@�@�@�@�@�4#+Vh…Z`/_ .`UfMUVM*UR֬Y̼Hm6\&�r2Nկ__ 4sjǎB!M8 4]@C!|?ȢEڕ ӻᆱ^ٳgW.][O'pI=ZÆ ӦMTF kjڴG;@�@�@�@�@�@�@�@�@�@�@�&@dZ@�@�@�@�@�@�H&rժUZlL <z|}}U\9UqBCCm0dŊ#G4fBAO[Nk׮upBwX*tKv6$4d9B!;v uB!M8d⒏- N>|FaCwmMz!jJAAA,3g&L)S(C Сzi?Y c!� � � � � � � � � � �x�A{@�@�@�@�@�@�@عs \z 4AN(+f"MHYK.RJ){إRk.emڴɮ&L2/ϙ3ҥyuj֔ZV(- ϿND)N)*JʕKN�+ CdI9A#9{v/͛1chڴiA@iF7Tr֓c;vLϷ3gٳgUV-`̎;* %bL@�@�@�@�@�@�@�@�@�@�@�/ ҋ/#� � � � � � �\)c7l nܸ H2h… ;!}%(QB~;nWz|ŋ~{dVs}on?_tɎY`A-[V˗W zfʔ)^MIsJ&Iӧ  i!˜d{zW( 4͒ yr,$\?^fɓ'԰aC{ェS *5$G&r6@] `0۶m넍7Y@�@�@�@�@�@�@�@�@�@�@�Y oV@�@�@�@�@�@�@�J[?Ԏ;wСCsɝ; 4&0H"vk>nSlb! 48}iϞ= Wtt=X9*UJK֝NbbΜ9woeւPȟ~*Uڴ ?9C$rႜ�RW(;|wr9PKJ"lK'yY **J+W?yiŊ6hAVV-v5؞윓iV1s$yܗ5!'$֓� � � � � � � � � � �s @�@�@�@�@�@�@�ӧOk6&�Cl.*G5*X ̟?yQ\&\2k֬^G}%<yĉ:rHxI^pjPMi`5I8YZX0A2E:|XXi!d[|Lm?r:)cFɄAVj"l t& ,&L26|og'3ya۶ms kwljժ^zj[@�@�@�@�@�@�@�@�@�@�@�B ȤPO@�@�@�@�@�@�@�4%`K=YӧӀ?8ql@;2hB#""iR.[2:i9r9>%K9|}})C 6xь$^m5ϝ;g^skᏦ勏gϮy*0006|6& ӽٶM(%ĉrTԾԮt_?('P!]t+2n8dh3gy#kͱ&|ф0gŽdΜՄm@@3`u6y&/^hWܫǏ )uǎa{ɖ-BBBl0;lK,i3w; � � � � � � � � � � �$�AIK � � � � � � �iBOTҼyҏ?J<pi>}:6Lwk/exA)S+ |4aq#M@dgB Hi>tMh sWϛt4a+Ei]L{+D#G\5/.U$PH5U~۷φ5U7<G&Gs 4}}y ,T)bעE6^E � � � � � � � � � � �iR 4yY � � � � � � N5lOjT sZ׳gO 80F@Tx+sd1Z5}{W(d:rAvmuW@Ȋ%Z[@�@�@�@�@�@�@�@�@�@�@�@ L"XE�@�@�@�@�@�@�~'F$7tI?#FW^ڻwnb"#]yxi)"BUKAjVʗ/i`Ow8u֭ҥKRLRٲCV /* )@�@�@�@�@�@�@�@�@�@�@�d 2@�@�@�@�@�@�@;W:rDZP I+V(5*yd.^̑ƍO.\6tB>i)m M(dQWi !M({-SFʜ9K�@�@�@�@�@�@�@�@�@�@�@�ҍ�AR3Q@�@�@�@�@�@�@� 'EĞyk9w^f*W|kqΜqAPH!ԬԱԴ)džJKڸuW`󒯯+lYɬʹ%KJ3&YIt� � � � � � � � � � � @ 2^z&� � � � � � � ?H HIKJE&*ihB'NpufIرR@Ԧ+N'U`QQQҎpM͛]gHi!˔qw (;@�@�@�@�@�@�@�@�@�@�@�H�A � � � � � � @pAjl+.fRJi„ jժUr 8 .'}vTîP n><۶w@-Ү]H??)$ y睒{un_e˖3< � � � � � � � � � � �^ @\$JD�@�@�@�@�@�@�Hz(MibZbҏw޽{k2q LP ;VڳG*_^ HD& ?[%3_ֹeu#-*. 4[D @@�@�@�@�@�@�@�@�@�@�@�҉�AB3M@�@�@�@�@�@�@�k # *-X լy>… 7T߾}==%@LoҨQҩSRÆRR˖RlXL2 ) tEY͒;q"@�@�@�@�@�@�@�@�@�@�@�"@dz@�@�@�@�@�@�@_}%=4nԾU%ف>Ho߯9s&8t.HӧKGKgK2IZI]JI>>[OJ ܺյuE<_;] 46K1@�@�@�@�@�@�@�@�@�@�@�Hz ޘ@�@�@�@�@�@�@�R?KMJHFEE)$$D͛7ק~0b=*4jjTԥ+Dd)!U rmty@dXt+$ۥ2e\eJʹ>g˖B1 � � � � � � � � � � �ܰ�A7L  � � � � � � �iE`>R%qcSfV&MRv}vH)Þn")#T#R۶R)ZZ)0Hinϟ7 CWi#3eJ)�@�@�@�@�@�@�@�@�@�@�@�D (&!� � � � � � �5K\|#\)e͚23U˧SLbQQܹPi$__M[7{RT9ptsysu6O*YRP!ZHE!� � � � � � � � � � �s @�@�@�@�@�@�@�*Ч4|jTt(^Zwu-ZuL*NƍF֬BBvRE}aCu>WsKRJy7, � � � � � � � � � � ��A)%ϸ � � � � � � �)&0{ԴXرl٢kצ\֯wB#EDHKݺI/e̘M7w8y̺it%T+J9aRr_ E!� � � � � � � � � � �A EeJ � � � � � � �W8yV+-oF]tI+.\NuBΟ//=ԽTWN)EtIڼ 43g̙PW( ZU*UJʐ!EKfp@�@�@�@�@�@�@�@�@�@�@�4*@dL @�@�@�@�@�@�@ a]y\py$&9+9r+1XM4|+2<\__CjRKң[իU\% U&ըZWK@�@�@�@�@�@�@�@�@�@�@ M&.#@�@�@�@�@�@�@�HRӦҴi$挤isY)RD=^}դ^Ӥ .5Kk6wnɄ>tir>K+]2BB YSPAM@�@�@�@�@�@�@�@�@�@�@ H � � � � � � �xQ*WN ƏO9IjȐ!۷߯|%0FFν$5h )h!' iB"#"٥եjՒ׾d.@�@�@�@�@�@�@�@�@�@�@�L H/`� � � � � � � psIo)TታbbbTtiթSGÆ DY$'_TsH HݻK=zHEs$1߲E]$__Wج vm)$*n@�@�@�@�@�@�@�@�@�@�@�V Ht� � � � � � � XJ^xA0 g%M3fyڼyΤ^ӭ޽С҈ѣKO?-5h [dyk]LZ^217N]A�@�@�@�@�@�@�@�@�@�@�HACi � � � � � � �[<Y 2gL7K'_gϾ.8 \B2KKO>)u*\tx@ "BWiR׺zdKHTkWO"t� � � � � � � � � � �x�A^v(@�@�@�@�@�@�@å%>zt+44TsUF<=! 3FʐA,)`sv&3oIKHK+W!KtB֯/`$*n@�@�@�@�@�@�@�@�@�@�@�R�ARP � � � � � � @R-M"I2%k׮?qğDK<$pҗ_ >}M% B78{VWi"׺z)+'PH֭+̙.i� � � � � � � � � � � %AzɅL@�@�@�@�@�@�@�8~\*TH<Xz?ߓg_5d=c욾!iOBBg}TʞN-.tI2HUJ&Af͔ @�@�@�@�@�@�@�@�@�@�HAK@�@�@�@�@�@�@�/)p׿ >\{UL>>3 [>Fnݤ޽儖zEicǤE]ΝR,RZ`{BC%4@�@�@�@�@�@�@�@�@�@�@�4)@dL @�@�@�@�@�@�@ &F*YR>KYgϪhѢN^o 0 eat8qBk/\ZIIի'И])"dP $>, lH2 Hi � � � � � � � � � � � pn=@�@�@�@�@�@�@� %K0W/?WΝoVZ9ѓ;9sF:tϞ=[˗רQ 'o%"Xܹ_vƌvjԐsISHщvI%Pԭ4vڵ /HGs KeJ}H+FNlZ8/~NziҥSռcTYf.A�@�@�@�@�@�@�@�@�@�@� 2e@�@�@�@�@�@�@ &N F[|/^:u_Ռ3njTw?7r 4hZliO3㇇+00Pq:z}֭>ܨCҪU S͛WjZ*UJ2D:F{}RH ȟΕ6-rmWCiӦ"4Wg9R۶msJh'EuƍZnJj(� � � � � � � � � � @* 2\J@�@�@�@�@�@�@�=SU0v\P!v*Sꫛύ<}tݻWyT6sYL-={`+VHTwqM 4BG'? }bŤwޑN9ݣYHIK {[ԭ4aBڸ~&TscFEEYˮ]bŊuDgڱcLo 'L@�@�@�@�@�@�@�@�@�@� _@�@�@�@�@�@�@� ,_.:5U.MUH0Λ7O{wNb'1M? c˧ .(k֬ <*P椵%b{n" ,)'<U3 9<(P"j8aiJ'mۤ\N.}WZV_-ZȩMbj\rʥX5!� � � � � � � � � � @ B � � � � � � � tKٲбcavXpasʜ9N<1cƨUVڿ>s5jH=vqyk֬ҥKUJۯi#cƌQf|w^[<xΝƍO?۲E 9Ro뮐ARΝY c݈@篃Kz5_Gc9:re)(HzQix9=iڞ?^8mڴQf+(<<<v09h [n߿1ᰓ~i7h?{СC9rD~'̙{j`Nnٲ]|Mv۷gBͲxbn38w&NhEEEŎ3yd;v&MSOsa� � � � � � � � � � �-@w_?G�@�@�@�@�@�@�H@Rɒ! sA*UJժU-seFK.}_~z)S�%K̙3om{]kkBCC&`,&x`\&(l… Uvm 0@'|Rf,qϵ;@ !={4d GL:I7@A yCӮpE?g:vԑ(mtC]{;sN2cʲe_ch¹眛Yu,7on?ԯ__k׮ULL>۹qH"ok;Z`kԩڵ+fowM~uuB9wٳ |4L=f1ζm۴e{Z@�@�@�@�@�@�@�@�@�@�@�4!/=0Gf?޵' � � � � � � �-pႜE9_Wu9+cʕ^&L6mc;w֘1c4rHev(P5FDD;?1_Lcmy'9/~6m}9kĵN^z;wѣv… 'fX QQҏ?J+'NzAWʕE's39s#GEf$U%'_QY 9$>\{qvwE9cwaߕn׬Y^͟?F֬Y{jJym0d`p]lBzzx'L֭hK(;v(gΜf1~~~6@rĉ _l/u@�@�@�@�@�@�@�@�@�@�^ π � � � � � � � GrBFJ؀ݻw9XZ5UT *X,YҥK+SN: &]O?Io^&c˗={j63f9sf{.!TWzaiFi$9R*RҢ)+A뼲4j&$QN0d7trޝultREM(; Rvme˖'Cs~bXbrӧOې)S8$UZծz n̞= ;؄T:7w}yNddc9ѣ!f_L&vQ 5M[O=T � � � � � � � � � � Azx@�@�@�@�@�@�@�֯r .ob?Zpv42_7ǯZ{VƌUH́Yf6qСX ʿٱ$kRZZ1$h![ 2.G1ե]4<\ 945JkI+V ޽>lAw~~~N-N1β}vA6p>sbB&ڹQͺvZ{3zwyӦMxb{άYeC[;ΐ!Cd~GyD{qjܸΝ;/@�@�@�@�@�@�@�@�@�@�@{kE � � � � � � �0AK9;w&xVǎ={v 6,㷲ӄ@16i… 66ֽ{wM8QǏ{xo+]&@iO6Ǥ)SG9sڵ1c5]ǧNΜ9Ν7ܽ{PB{bXfj[ZꊳΞ=C]&ѼA魷R.]e}ʔ)VziGFFG27oڶm+Oo � � � � � � � � � � @ 2^ C�@�@�@�@�@�@� ]g(,,,nL 4a\/^L4_~u릜9s.reC'MYB tFa!&dM.<(U$u SpG:}I.-m(=RR|C{bj/]4iWV,YbȨ(wnb%Jw vӢm}b]CƍUX1}G68e˖/LPzJڷo /-3%KaMR8 � � � � � � � � � � Su @�@�@�@�@�;O݌��@�IDAT@�@� %q3u H'ѣG5i$eEDD]kǎ= W>}5.RoKBhذa:rݽL4"pIKeH=zHWFM#N?(WNzeߤRr2կT4p_O,ϝ]2+ذD3((H111>|F-[ľckfk&{m$ԩ7x:֮][뮻ΐ!qK/$lٲUS'ԩSv;hXɣի>[e]@�@�@�@�@�@�@�@�@�@�T H/p� � � � � � � pŋb\BBBj ۓ^|E\҆DC$;vĆA~j۶2 .RvePm۶顇,YbqC&t6֭o̹B[m3ޫ 8YzQi9AҌ ȡC%畫o}VZPO?iϞ= ҰaC߿ ڵz͛m;]wnݴuVQJh9sFoys,:IӧOc=f_l/^\:u ٲeg۴i 6}wɚ5kl lժŴ3A&TZv@�@�@�@�@�@�@�@�@�@�zg,~@�@�@�@�@�@�@�H@X+XnjJiرzGt9&l`X)) b8sGү nuٳK/ dI&iy/̻xMRRӦRRR DEEӧOB ݭ:I&<1O<]?6,DθqNdf|ŶtR-MdΜ9c]9sf?^?sn>w?l@�@�@�@�@�@�@�@�@�@�@ u : U!� � � � � � �܄RzҡCR`b ըQCvRppMxc4iD&kѢEWk„ ڲe؁@z0!}$ $'DOzsg9Y%y-@ȩS_J-[J͛K}f� � � � � � � � � � �Wj@�@�@�@�@�@�@�҆yچݻwW޼y=6ɜNZ_M6iΜ99sf/EڵsmN4')4 5RnݤO>>@j L)$(PԬvr+t@֮W rٲ%E9p@.]:]ΝI#� � � � � � � � � � LKW � � � � � � �\ )G5܄? .$UL5i$*UDxc2D%PWRҋ/J JM!(PdIsc;w ҝ3g?Ges* b!^@�@�@�@�@�@�@�@�@�@�@|bSh~@�@�@�@�@�@�@�HH.ݛs< СC裏zK@ ,\('m$=R\%DGGk5kf̘7[ moovnW˖R꒏O'a � � � � � � � � � � L)!� � � � � � �UץI\qi /hرڽ{shB M 8NR һJݻ/e ٳm(yuiex.]jyuZj&֕� � � � � � � � � � �ROY@�@�@�@�@�@�@�H_%""BÆ ӳ>Kd3Z:0ᏽzI;vHmJ={J5jHW3E+nݺiʔ:y,XgiocoQ6ʕksӥ C�@�@�@�@�@�@�@�@�@�@�R�AP � � � � � � DE%СCmO< TJS<y/֬*U.=`酶.1cFկ__~vު]vOQ:guS87לph=~@�@�@�@�@�@�@�@�@�@�HAūʜ@�@�@�@�@�@�@�t*A/^'|\9sLL -F'.-|3RO?ŋgԩ1ctm 8q>'uO5 � � � � � � � � � � ~Lמ#� � � � � � �iR &&5zh;vL}IA ԹmԼԱԤw/0Y K,j֬ 罼[7okjժ= 2e;SDDzb � � � � � � � � � � A`|@�@�@�@�@�@�@� d,?QttN:PBlA@ҰaҥҞ=RٲgIΣɂXF|w#M;lY �DOT۪Uk]ժZ-UDЂ23Ga$?~ӛK $$7y}9>wzt߿[Çօ6ֺuo۪|S.wq!@�@�@�@�@�@�@�@�@�@�@�s*@9a � � � � � � �)yɓgEv/0ZC=;@ t*W.HZ='~Xv[?͜9UӧuV.[oSݺ|!K]݅?@�@�@�@�@�@�@�@�@�@�B_ �@�@�@�@�@�@�(IIҒ%ΝңJ7 o/U*s[ZҘ1cnK/O>jڴݜ@J Z^]:سn7(taaao?}(!a ՛0jդK/_ڳ5!� � � � � � � � � � @;[/_N@�@�@�@�@�@�@�|XL0@ڰA:|8ޓf͂K( ;Jݺuտ˚={:wq.䳀}}Vz9{wiv|~(/6L$_WƑ/D]sTb&@�@�@�@�@�@�@�@�@�@�@�B ^@@�@�@�@�@�@�@�ȵ@RoxijtC d5رC,nܸQ򊢢4k,<x0cB� jnZ>@CD :TK;wJ~(o4dT?s*Xt߾D�@�@�@�@�@�@�@�@�@�@�B+@d}54 @�@�@�@�@�@�@ 'geH͚ev$}[-Io@H+zTzu=ڵkY"@A t t mItx~-+ (w*$ o8+#BG@�@�@�@�@�@�@�@�@�@� �Am@�@�@�@�@�@�@�\ \}Դ~w~jj>fڱca@aä/&Nڷ,)FnhN""VJ׿ F�@�@�@�@�@�@�@�@�@�@�?)X@�@�@�@�@�@�@� yFJK%n2?-[(222|({И1cy@�GZHREpX cALbcn&L,';< y5ݹ@�@�@�@�@�@�@�@�@�@��AMO@�@�@�@�@�@�@ +5j$Y(drԩSmoݺU@FDDhĉٳgn pNjՒOTh]wIǎ&"&PtҤIҎ;HG ZU8P?>g˖I10� � � � � � � � � � �*YA�@�@�@�@�@�@�@p XFOgƎ> LMM=T &K/=8;@ DFJ/ '#u&,@ҭJ_-m&ʩŠnFJI QÆImHSw>g!� � � � � � � � � � @h Z"� � � � � � �d"0`Tf̰ԫ'UaW73 q4޽{\�+p5ҼyRRԾ4wn-ʕV{i&/.\^]~AJK˼yc/ � � � � � � � � � ��Ah9 � � � � � � "")]tQ}gR ;vꪀ#l"@4ir*�M7;*-$P>kK=$͞}3WiTiS{N{LO:|,@�@�@�@�@�@�@�@�@�@�@  G@�@�@�@�@�@�@�nQ-oΝ3mۖⰰ0=Z^{ml @ +'M(y4`KZ:Kx|RNR=G{g_|!o/Y$  � � � � � � � � � �@IߒWݸSw3&}@�@�@�@�@�@�@�^{N]ca[Z}ǏWRw[ckI=$꫒΂9XPaODdI7X8dT4vtef � � � � � � � � � �@x"� � � � � � � -HU:tielO֭[ϱȑ#G. EKO5J6L&)%h^m_E:q"g!wSg~{@�@�@�@�@�@�@�@�@�@�@  D@�@�@�@�@�@�@�(QBzSv ߊAp8_: Yn&Nƍ /]cP7sNR߾Å#4 @�@�@�@�@�@�@�@�@�@�r;[r<+ԉcy!� � � � � � � >K:x:֏9dy=zTǎs/[OMMWNȑϨiәjnZZZq[%DZH3[_n&M޽{SN*UT%+eʔImlٲ(22w�!&0ctRgI2˂@~ /U"$^5o6 `β1Ws7'|Hq%pf_۶Kֽe7{l`u ߗmPd,/]+v@�@�@�@�@�@�@�@�@�@�M5XG�@�@�@�@�@�@�8c ڵk+{U`ٷo8pZG {@ kU,тÜj ڡM6G j}˖-SϚ5k2bY>9-f Ur2˫bŊʕ+ss?@ uJri@O-pG><HΆ+OU4Kբ0e/Tjoh]l mLT Um-Ѯ,p :p=pYg�,�`@?%0@ V!iWXm@q@�@�@�@�@�@�@�@�@�@�/4ן:y̘\\ĩ � � � � � � �VŽm& Dܺuoߞر#=т ) *:0Ѷ 6 ,&YmS.ɒXrjVV-{XpeuApvf!iB3/eVVbJUfMW,VOAp4|xޛ_ ~k`N‘\)e^Ͻbǟ| A/d ̬w×m< ~8?B!�I-@ӛd-îֽ 9۷wCZm¦mYDms4 � � � � � � � � � �[ ϭ7OC�@�@�@�@�@�@� P%$$(11ѕ7zӦM.тlBBFh^XՕ+Wvł"##ӯe%{ JJJҞ={\ݻC6wڕi*P' U֭:uի玅g"i_~)]s#v\vܙm;nWl[/ RK+~ @@~uƶLZ(K{ ޺ն<m!>{z]R%7jong^8}FI6 � � � � � � � � � @VAf%~@�@�@�@�@�@�@Xpիn:Ym@b> `AbS,C %%BnٲŅvzyze֭JMMu .Y lР6lFqƮԯ__BƂ� |tKwܑ9-:m6_[WllPG @ = BbXWm sdA\XJo>YL@SNNN< B!-+^zuWu � � � � � � � � � �d 2[ � � � � � � @H <yR6l]YlWZ$קRJB�]mmnݺɾ,,"-JBB-t͚5.ɮ0' l֬Zh͛ҴiS^zI6MPrڼy+^m޸B-J\\ ֭.W¼K(2k.W@Tmm/+QQ?\ǭ0(2:� � � � � � � � � �A � � � � � � �Iرc_/hnݶ<iA;ƍJ:u^B[ X`.rZrVXD-4"##դInZZR6mtrrekyW?m 8qB.‘7nܘX�oRbELWF u6V`/pt2VJ --M6ǰPH Wz֭.ڂWuFZ|տXX[ � � � � � � � � � ��Ah# � � � � � �[ Yl̙sjZtRRRTlYwyɿTPz4 %Kbd2Y dԹsgo^yp@!HJ/ծ-M*_n!nlmځvZbku\ZiU}/B5ktETn!cmڴɅsXxk \(Ս5R||-$Y@�@�@�@�@�@�@�@�@�@�P 2TD�@�@�@�@�@�@�b!͜9ӭ<xЅY؞kNm۶Uƍ}!dF!餅5/X(Z8dDD #ڵwJ\\\!i5@ o|}]x3ң) ;G ʪU\�]I.тׯ^ի+W '#GhÆ .իoN:tL2jذ l֬6mJ&MS$ � � � � � � � � �5 ? � � � � � � Rv5o<M:U~[?~ P.]cǎjѢ b!yf={ /'NȂ.b]r%ѣʕ+W,<dx驧 E7/}Ώ^0Kjɒ%ڵkHXXԩf^G dA�-}vaV,4ʚ5ktQSfM7nٲ #Y@�@�@�@�@�@�@�@�@�@� y. � � � � � �[]viɚ4iL$ǫgϞt]ժU+>t<9sj6m N:+tXeTsgdIi ɗWȒ@rr {\pb᏶?""<ofa7VTTTw0 p=rJXB˖-sA˗/סC۶mvj+UT9fA�@�@�@�@�@�@�@�@�@�A |@ � � � � � � @͛>ٳUlYK{e]ڵk^6EB–{}W$$$^zׯ .HN? J#FH7T]-B͛a^tR} *UR6my睧MTRݒc @<yDoҢEejժ;bs+:::OM@�@�@�@�@�@�@�@�@�@� 5XG�@�@�@�@�@�@�P ))Icǎȑ#5sLըQCW_}Z]tE*QD>[!+Vиq\? <xnfLJF'h%n믥5k 2,,.Ԍ3O?B`+T:bjm۶%~L9Z/?Z8dDDZjnݺB� � � � � � � � � �!@dh'Z� � � � � � �!$`2oƌh_ R.]B=@bb>5JK,Q׮]uo߾*Yd>#[JI?/=@0DnҦNoVsщ'Լys7ws>  {q!>k,nM4%\^zG l@�@�@�@�@�@�@�@�@�(H Rg#� � � � � � @HKK/j.殻R>}TD"O:@~ ,\P>cEEEӐ!CT|z$E O,�r8iz)22OnY(oo>M<Y&L7|e˖] *ʶ(@ /,v6m;͞=[)))ԩۼB"Y@�@�@�@�@�@�@�@�@�@�` Fs@�@�@�@�@�@�@�lƎ'xB7o߮|` 6 !@V|^{M;wtߧC*666K؏@ $&/%]}6%w^}g=zf̘]ve+]qժUGj֬Y/]Yz7nkРAj޼ytv"� � � � � � � � � @Y�<@�@�@�@�@�@�?!ChŊ#bŊEsHKK'|~Zӳ>[aaa2W]%;&MrPۓ'joTJWS.]j] 9Xvƍ1chjժnfr-\9iA�@�@�@�@�@�@�@�@�@� 2t-E�@�@�@�@�@�@�B"p̗c7M7ݤ^xAUV-$-T 6LO>5k#F(>>huބر 7H۶7fwݫ~}:hڵCS( 5J#GƍoC=֭[Px, � � � � � � � � �6va{#@�@�@�@�@�@� թS'?^ӦMi]+/|N6oެwy=?>-\PO<ڶmgyLnQh9yL~X5m%""BrJU\Y>쳢]W\!*%Mzطo 7SFzJ[n?uޝ{nqfef~74m4(WA͛AK.ܹ?+%%%_r*TPկ__ӟj*M<YIIInsUWiY � � � � � � � � � P|,>"� � � � � � Y 믺 UfMҭ[c/߻wO/R ⊝;wj֬Y٩gqss XB-*tAgܘ7jĈڰa j>jժ/EoQd(SF33/[_kԨQZd.EGGq&ll76X]0Kfml_0 srW},ڤIt/wUV.{„ Au;JPgϞ7n-[rʩ}{c� � � � � � � � � � ̫# � � � � � � w%K/uat,ݤI{Yڵ7ʓ{[Pߞ'˛|wzꩧwiӦ wqV ѣ? 8&'нO<֮J :T/.\>}P8sbLix_|r֜xپ[nE[mY2ۗMB`n9_{GtW111zwe,5jHdw~΃壏>Ҝ9s`i, � � � � � � � � � P<,^#� � � � � � @.N<E>|xd_xf\0ȩܬA:+{wUd߾}]w}֬Ys&\Mi<upΝҥ^d ] gpzLӧ-]2/3$~e/m ʏ~ysΏg~SVZ:ud8ԳgO-[6þ62evM΃?|ٿC_ufc � � � � � � � � �q_ql� � � � � � �)0f/Zr 9W=ѣGk۶m<xn ?~رCڵ{+WΝo>;V?V^ .@/bd 5kJ(ukCòzNJJ ?^{Mo.]_jҿo׆Aӧ. }n#>^w^gf|ͮMnz 8AFܹs]Xc=&Ι3G}<Ԯ][_~ i&׿y9K3{嗵n:cAIuV:t]c߻{'$$m۶ڽ{w =7| kժ>ըQ]G nrɱ|ɾgӸ=9 4l(_�ߩ08#--MSllNhY?3#))I&Lp㊅_ҷ~~x {=|7nꪫNzˮά5rLȮmYvz5;pc_uVl,4e7~?쳊t3xM4 }Uc.nȤI_wĉs=jժ-ͬGydzL9g;_{XX~ҥKʫ޽{wgdz[&OVvΗ_~).bWYv.ZH111[|*,VeqimW^Qe5 ];i � � � � � � � � �@xݚ;#� � � � � � �EC,~CC B,|R߾}M;vtaAvZ@#4rHnxz֭ = @-[{,s}|~gOmZha\VӟJN}>Z{ ZH7ZC^yڼy RaÆ/"2Unp!I7xW_;ݡe˺G۰G{V:urϡwa!i,kZh…y(>.0|a-\Pz{/^C{9Y[~"vl F 'kU۷^ $O>$dC ;w< K\ȱvBtmpcZl5߯Zw~n~'yY71!W-؂m`_sٳ;NO-owˬ_ngǶ/wa8oڼK/ua6NZ}txg"/kӦMs߉'|[l>h,]ҥ;d-cͫž;w}fmi|;/fxM(l?jݺfA�@�@�@�@�@�@�@�@�@�%@dz@�@�@�@�@�@�@`ɒ%.\ .K,oҥzw\1YX--r,4ǂy,B,l%''wA%JPոqc5^҂ +|jڴﰫszd Z~ ĈfSOF0}_w 6{l9|wW[o<؅lխ[W/wﮱcǺ@D͘1Cvo[.2>fqqqjժP7nۑ{qRyW(**JCUlll+}Q;Ͻ{ ܿksF*T.=<sJKK̙3rzZlz .fh/-̸BXo׮]U^BƜ믫SN66Z?B -~m1ͳɒ%KT7>xh-N#f5&d6{\V㪍 111.}F/#~Y0`f_+8n\s{c=7 _ϸ)Yy3ȋjKRR-[l&M lm gkz?,s=ndԶd<{F(lmsK{, � � � � � � � � � PN'ū@�@�@�@�@�@�(l޼mGPk6հaC8p ZOtt Ы5kѣ6L5kt .Zh-9=ΩQU.X۾}{ma]նm[YUW]6mڸcaa9!xAYַ+Sk׮킿l.]Zh㝏2v]8ԿoxT~}fi&=3OSk/}G+v{o=zH?o!f"e~駪^ N֭{~-8Zj޿-|fΝ;]{u' 'N|i~ >|xmGڵs6b۶-N#-DŽfg5˶kiݺumbta~e/]{u0ޚ-<[l�cǎTR물osL|BmSVՉ<;nqƹqobUٹ6g.̃a@�@�@�@�@�@�@�@�@�(A7D@�@�@�@�@�@�@,lo޼yގ`!XxbS��@�IDAT-VRllϟ3jժzꩧ\xӃ>( <By,pϞ=ڵkKP'9^PDDD{ 0*1BW_}.R,Yl e].c;]]ǻgzjeacԻB z- <;՞_l,_mРA>޽YRr2c}رM&kR __PsU%ԤIjE ,oԆ \mH5?=nݺ.dn.%Kw[&Mʖ#w2ۓ^w. m8Y׌|] xˬ-?:q<gdfչ9 f3q.k9'7mbO<z(K}Bv-~Y@�@�@�@�@�@�@�@�@�@x [@�@�@�@�@�@�@ 7t&L_\@W)SFIII.2 ֏T]]@-§s?V,XcǎyOsziHII|ѣGf͚2ewF9!sJ*3gfnK\\sԩ/^Aw`>f͚;z dR7oVbbbcmp yY2w[pO}9-2 ("]w Çdd𹴴4ǻ>guwsAL{DŽmO7d/~+n3`> ?kgڷ̮?vȑ#ڱcimA^;}Y7o@�@�@�@�@�@�@�@�@��A}[@�@�@�@�@�@�8 Ll׮YS(,mڴqӟ$ ٳgGտoy%bŊy֪UONN Բ%縓cȐ!ھ} _~޽{"윷gufǎݡ1)w^x }UjU}?Ə pljʭ}Eɒ%GfmJ?&l{v7ސ?rn@QYPpϞ=]plLƎӧn^q~]p?x9\]{3Φmv? I\65NϬ_ꁁ+r?q<<oL lٲ;v.\~27|6nܘ%ynS3>s F@�@�@�@�@�@�@�@�@� Ƒ � � � � � � @ѣGkٲe]RAvwӦM^m7ovVLL>s]zzwtjРAzWη~M0A/7n,Y ݾg}`éS*ɻvr׬_VoM -Z|)a֭;wL׎;\Y#Goj`߾}< իB-_*W駟K;uŝ^F WO<مw9qmpI vZ}ᇚ3gk+">xQwD\RTBα 潺 \?C?! %ؐYfJ*:劉�B;ll~GM@giqcy/w]ٵ71!#W~fi!Ç˃hS2/3獓^mW{sά_o\vYvj[2'ٓ&xN^m{NV3Z޲e;5!!!<Zh]tz)7w֭ׯ:ϞYv.?,XN:�H >C4@�@�@�@�@�@�@�@�@�Z )ʫҿ^ݑ � � � � � � �C /2X?+TRyf̘s}6lpiiiz> �7|WZxKUVjР,ƎYv>}hʔ).8[ou4h(e{ڵ={j߾ ֲge-[I =6Za2e= Gvϵ�oSNP9!<<\/f<xۂ--qݲ /-BWgdh!g{]ww3f д׮]۽w}WFrךUW]B -/-jѢEoOǜ:l5{ro 7+QS֭]xRƍDZV^,t,ebiѺ~f ʬޫ}~ ry]pZ I=/Զ0.]Zt!'Ȃ7~ ao�ikc \Z5M6͍Kg6٘z+ɶmŔ]{3765iDÆ s}l\}lcm7xcP3d/WZu> \ؤ=zСC<(ϟGu=m ƿ`WPAds^zyRRR\�{ouOlm>r]we_f(oڬY3}65{ĉ͍,![b6JkӃ>i( { jݻ^|E7<x;fϝ;wիW/yžW67 &`F&6@�@�@�@�@�@�@�@�@�G0?=WSw$, � � � � � � @�}< ֭[u\'|YHe ܶ}ܳyfկ__Gq @9vѣ *Y <'6nsܞcaK.u!-eQ`K3@Jα* <^VeLʕsIWX/-) { G^m[ jM>݅t/n}3P7J'klo,l͂ tƿyōr;,قm,Tiw;qℬxvvTTi͎ڛ٘p6mc[,d پ`W^%q<roL|->C�j -``A\go ܴg}V͂� � � � � � � � � �[ = � � � � � �ccЬnI/2 ;[sO/ƏWZ `/ũg,rذaz'Լys1Bgz;C _B1ٻw~m}hڵz=׵,cǎ|-rZy 80x(1ٽ`-tق[r YXqkn\97!!AFȑ#qFC�  � � � � � � � � � PL"I?& � � � � � � gJҫAiȐ!jذ>YSŊ9FW\q6mm=*S_sN'駟־}\w߭0KcA�<ף>I&iիT~o߾ҥ"""yy={mٲ%߂ ˕+sjws:%_ ֹt:zhy9ol1rq85,YvZ7NcƌժU+s=[Tr,� � � � � � � � � �O%~w, � � � � � � @;vx YmݦxC�:@ >|X|^{5ܹ}<| B ,Lss}׽{>ѣ5c /]r%x&LMMwܡ?X)))j׮~v&}/w?7@:k,M<^Z7]`|MCx  � � � � � � � � ��A!h4 � � � � � �647N/ϟ.G%J(lͥ=: s!nQQQ4d/_е!@Q }\ل 7())I-[TϞ=uk׮P%|}YtiYa)^hU'NЂ 4m4W,҂g;u6oҤI7 � � � � � � � � � '@ � � � � � � @^̛7Ooƌh_ R.]f)a, 'hԨQZd {շo_,Y%BN(ATo5uT͙3Gּys=sjԨe#�!%gټgΜ֓]c^\{=R � � � � � � � � � P8,V � � � � � � @HIIѲe4rHM8Qk׮UTTn& yEDEtVXqi.H^z<xnf|@  W`hsՌ3\駟t!UPA:t\m۪vځ�@RR/^G ]n"""ԪU+u-x{i� � � � � � � � � ��A � � � � � �޽{~L˦MdaĨVZta0SlYK{e]F0VC뫯r%!!Aد_?W:v #ț-r޼y.$‘SSSUR%i&wyjڴJ*x@�<8ytR-Z(؜ގٜ&`ku � � � � � � � � � �A|@�@�@�@�@�@�@�,?b->p2""96h@WÆ ]mV*W vɓ5i$M2EIIIWϞ=]޽U6#Gзӧkڴi.B:u+BW^y,(@do599YK,… ]_\q-Ze˖j޼ }QQQYߔ# @6Ǖ+WjŊ./_. wsmJv\]J,n@�@�@�@�@�@�@�@�@�@ o[O� � � � � � �!&`^c`yfY-˗w^]N(QzNo֭[�IvU]tQǎ]8e P{2o<͞=[3gΔ8qBM4_^zr\ ܑn:im^Yv ֭[4mԅE6jȍSddd Po~Gwc͚5Zz G֬Y3=h¨2e9:� � � � � � � � � �#@d+Z� � � � � � �g `06l41!!Arw G tx_ }y.d͙3G?f̘<ho^:tPv\Wxxh@ ر=.\PܹsuVYH+Yxi]C b'@d޼r Iȕ+Wb fnwvH `H-m\r4 @ 9rmnszoo.7Zi֬ )>p@�@�@�@�@�@�@�@�@�@ 3 3Sa � � � � � �ɓ'}vh0ׯP,αRJ. Ƃmv.̮u<--M˖-s`} -[VZr|g-[T  [7hO ?~܅-YD^x }XI;uj +eA IcHwdk׮uyp[liU6[s`]fM.]:ʝ@ G<~ӦMlܸ1C;wߧbŊ.՛[(Z]F ُ0  � � � � � � � � � "Aȋ � � � � � �g#GG۶dSdIիWﴐG/1&&H0;v̅-\gA}tV5k^4ir,+<<HЉؽ{ R[z ~\bXZjj"##e֭[6mڸ�ʕ+M EL Ȃ}lq67ذa[9gsiAbriBիR+qqq*Uw 5!`6ǰG+۶msav1ob!UVu!6G+A<S@�@�@�@�@�@�@�@�@�@� 24D�@�@�@�@�@�@H <y҅=Zo@&/au-^-_\˖-sZJIIIς6lF97? ܉@JJJw>wʂ׬Y}(Q}6,@yjѢ6mJ�Z,Ѝs#@q>ӧX8ݎ;d^Wo޼:/X{N 2CZX*U[rʹ@;Zjڵ˕;wʊm{V{<Z-݂U-pVZ顫^BjQ@�@�@�@�@�@�@�@�@�F `8@�@�@�@�@�@�ZBC-رcQQQW^G/т +ЫիW/߰RJSNz,L2RhK^WoܸQ^ٺukz0ոqcWQ0i"Йb܅#G!7ֿ?>A*22R+VTʕeWۺ bxVfѣG]Aݻ={h -i0T/ Wnw@�@�@�@�@�@�@�@�@�@�Af` @�@�@�@�@�@�P 55U7oKɲp/ѿ0:;f簜 �DW,@7m-*---1Te>V\m? bVɓ'k. $aN˫f͚�Ϻu@ObÃk g! yFl!}FZ ^W=o ܳڮ \,\rr/&&FZe-x!YWl[mV¾-ۊ'pPG/BSoN|쁒l#� � � � � � � � � � g"� � � � � � P,D w@oj <q3:<z붿t2T�RRRm6 uB/j/çu,PȊ[yvWy3>+^m!Em�T T/5Y{aL}d /g a%/x ڂS-ъ @ YǏ{^P_Vg+A0Hl\[Vl\ͪcJr׬ozɒ%O+)|҂mkѿ;v붝슅z`ms{֭#w{6A9"X̛ۜYm@�@�@�@�@�@�@�@�@�@�s+yn@�@�@�@�@�@�@0 Xƍ3<=Z`-cs^cnm_ժU s7i[."##UvmWrv!ٓph!W^Е nڴIK.hAGdJ-Bk Lp \gϲ@%+_??ڱ Ͳ% g򂙬pL/RJ. -@h X{&=1̂<(/ mMzan㝕.6z6wqjn66S>ubcܮ{o6{ֽGs7wM/?mܷ ̪GGdA�@�@�@�@�@�@�@�@�@�- C}Z@�@�@�@�@�@�ZpDŽug!cYcգG~asa?gnP,([ZYh\e!UUTY}m mpٶ>oݎY4z^SY[xneXm tsֽ& bW, �䕀aSzm},LY/ث_uo|jmߢE“Wnݹnl7+xU6V{Ǽ| ph=@�@�@�@�@�@�@�@�@�@� 5XG�@�@�@�@�@�@X0ObbbG/ꤤ$K > {rvJ] gq%TL;@�(i#[kao)C�@�@�@�@�@�@�@�@�@�@ �A=B�@�@�@�@�@�@ $vyZcBB֭[-[(--B .ܱ~KzÆ euUd$e/F"� �&Ptiف� � � � � � � � � � @*"� � � � � �GGjÆ =_;|c)Qԩ4i޽{ |ő>#� � ϴ."� � � � gõ*gEd%PDAgEq_jeYLc䥖eeq4-!9fGx7͠n{]bp? @� @� @�I@t7� @� @� @X"NΠ)SD:'Mڵ+;uQҥK4hР[C  @�Ԕ@ \JS @� @� @� @� @�' rY� @� @� @ |9豢bǴoѢEYI&ѭ[ثW8caѪU:& @�6, gy @� @� @� @� @� Pj Kh @� @� @@ɓ'8f̘/ev(;p ةS_~\+ @�lXEc7|3 @� @� @� @� @� R#C� @� @� PR_-豢"Fi9ve̒%Kr{5kݻw}O>y͛T4� @@mh2b '@� @� @� @� @� ]g @� @� @�@eeeL8q1cg̘ϭW^tرطozyyyt!9& @�6  @� @� @� @� @�YJ$@� @� @�(19sW yLǏe˖hѢǙgeeey_Z6mڴz9 @�ꮀ Ⱥ{� @� @� @� @� PA; @� @� @�|fca{Y~; P\///$@� @%7J3  @� @� @� @� @� @� @� @�(0s(;0aBTVVfnݺxAy睗ʢ{ѸqR6 @� A~D0 @� @� @� @� @� ȒB� @� @�K.cǮXQQQܞ7o^jРAtڵx!cېzO� @ ȔxqDӦuӺI� @� @� @� @� U*nN @� @� @�jiӊcƌYm}ҤIQUU;Ҷmb)1@6l蟹jJ @�N AiAJ� @� @� @� @� @xC)$@� @� @�ŋGEEj)o…5nݺv- eeem٦V  @�ؒ Ѯݖl  @� @� @� @� @�|4A @� @� @�:-bŊ2eJz,;œsneKyyy:z׹shРAy @�>@!rOV  @� @� @� @� @�lnA[\} @� @� @�XpaTǎ-=hҤIt=<~ӟ;.eVJG� @@mh wQ  @� @� @� @� @�uS@dݼzM� @� @�a4iR`4u:tP w<zyyy^Q^V @� 9Z6AS]] @� @� @� @� @�5! &A� @� @�(1 رccҥ͚5اO8SaiKgC� @�A% @� @� @� @� @�VAi7 @� @� P*++c„ ŰNJ=ztN3f>ՋN:[\///;iG'@� @ 4nѨQĂZN� @� @� @� @� P7A @� @� @@-3gN1q̘1?>-[{Ѳe(++p@uYŰݻGӦMkAo5� @�]` ȏ  @� @� @� @� @�-, r � @� @� @�uW 9@5C+**ٳggGΝx`^/?o߾"9 @�uZ@d:O� @� @� @� @� kp @� @� @6̜93{;vZ&L܍6mD!;ح[hܸqm6 @� @` ܬ*#@� @� @� @� @�!A5 @� @� @n ,]ڐ1cg D׮]sc=C)1mouP  @� A~< @� @� @� @� @�l1A[^ @� @� @@mxscEEE^BrҤIQUUҶm?3<3~GӦMkK� @�B@dMI� @� @� @� @� 5@l @� @� @�uO`ѢE1vصBSc \paFiԨQt-cv!C6m,XCz*n>|xCc @�ll6U @� @� @� @� @�A5 @� @� @VXSL)=p8zsҴGYYY#9昼6sG;SGMe/^h޼y<qT{;oxVݵѰY' @�)2cMӧO~8{8p`\zMqѣ>_|q?;lSTL @� @� @� @� @�-(--j @� @� @.\CSs ~\xqI&ѽ{(//+?21o'|2~8ѠA٭[\=N :4v/B+ώ3fp7x#hժzJs� @�uGEXBիf͊g}6ӧG+dcǍs7qU'@� @� @� @� @� �*  @� @� @�.PUU&MZ+8mڴb:t(;tIqsGXg}uqm[n%1?O#acE ʗ0:N;ŗ_jG #@� @`kHY l|/S#v.qE}ݷl3ӳq?T  @� @� @� @� @fUE� @� @�_`޼yQQQQmرccҥf͚E u,//xꩧؼyW16lX?,[,//~wW^yG.}=>x׵m6 4Xy @� @. | q駟~vZl @� @� @� @� @�K7>  @� @� P"1a„jnj3g-W^tԩ~Sc6IRRh2M[nںy晸뮻cn^\rI<qwe Iᖏ>h<0_SO]uUѫWJyŋo#GƢEr_җrk\b� @�[A7M[ѥK8SN=zttA1mڴxGbqf+LC3<s4ѻwˢM6|lxǏ馛_k&s\UUU4j(ӟ#F妏 #.\I'*Sҳe ,Wnuq7ƨQUV1lذlZ'l @� @� @� @� @� Ȓ A� @� @�ٳgXQQ7.dަŲxѿ8묳ai&M6;g ?Oi j SO< .{'qŊ)?y^{- 6A/wcYfc#)hO[o5~￱E9� @�^ӟ4g$N=x衇Ϡ)F'?{// ?weg}l?9x7spc*W^Çgt?}-ח#{xgυ)2M'|rL{^~^+YsGyd8H:seX!@� @� @� @� @�( Aq� @� @�e˖`1cƬ͙3'~ѹsbX\///AґB=?я"ysŶnկ~oV )\x7?|^ k<;/~_ 7ܐJ ohy믿cǎZ;3>8sƍo  @� U yFW:th~.JKZ#Gx ?3}ѫWƟTٳg<㑞ekH/B5jT\t|8iҤӟÆ /~/G ~\`A|[ϛz?xϏ͛m@|pzfMϨO)|2M_|EA� @� @� @� @�(-Au?� @� @�3 yL)q„ QYY٦MbAbnݺEm $L) $d>~;߉{w裏/~8㡇 W&MuM-&RR=)2lbŊcǎtm# 6b"@� @@]HAK<o߾u#F?)005B Ӕ4qļo~;Xpa#Νu)/=\g?ټݺu8nm0`@,^8K 4a)x0lgofmϘ=/)״iBі @� @� @� @� @�% % M @� @� @�6%KbرQwL)D"M)K.91HzŠvm7}c7S )$3g9[nC4M6-/5kVd>1gΜúӏ}��@�IDATIN>3; WձN� @, #],9{T] )?Mov@_|qV[/ԝBל. S 7_w9ӟjkgBW楶  @� @� @� @� @�JP@d M"@� @� @�5!jɓ*WSc8(+++?B�FM˨}ƫ\rIs=1lذԩSt=N:#<2-Zw_/.խԑ;׷m6ߏ'Ƹq"Iw1] @�ƌyae|+y]I ,+͛7y@]ve 9z}S ӧO<q1ŋ't˗/|++"ڱc|"}PZ4v @� @� @� @� @�@-Z  @� @� @�-x7tS/L{gh":t萃 =ܸ뮻"?9_~9̙3gΌ !,Jd )k_Zo>sP7O4j(߫ B"綾^=\Qxg%C YBH+V;ָqk#Fv_f͚v @�Rܻꞓҁ⟦B�%KQx+c紿/qoT1\pA<S+ޘS o#D=e˖+R,&=[uY1~>+ @� @� @� @� @�! 4V @� @� @�RD o|׿u\s59F{GuT|ߍy_ H)hpܸq#y.ӟ4 '{wifz9uLPh~ [n%;wn{sPd|Wlm<… ;]w5;ⵅt4eʔ®?a/IxyoVۿ[m۶x @�lW.~3c̘1?1ڵk]vYޗOD OW&L ˴1qļLLhժU<Cqaŭ]tQ~(;}LmnJ[nq)SR8dR_{uр/8*++oyӧO @� @� @� @� @�#PoK+j9'aI_S%*� @� @�l)0D9WTTD AM6ݻGyyyqHU-[nPw^pxc=?Rf^[V5*6l_Ϗ#<2m6j(N<XtiIҷo߸3L|s<e z,++x vabRW\w LS Kr '�w1:|СC㪫Z+<p% @W/"Nu�1t+C'|ƺ4R+#[z>?vm|rڗ]wk#=-\yѯ_>|xq__җs_!?:q9x3!˖-w9.jCSX�>OGǎ4} 9֭[3h5} 9?AX@ /m5?YfŲ @� @� @� @� @� ҸZA� @� @�[@ _4iZAiӦ{ޡCW zԩSq(lҽZ|y0N8!~裏u S|Ai&nOTneee10BKL @�[V@W{x߯ ~<*ydQsLӘ9sf919gqE r_׻G3{#LˡciƌѮ]:g,Rյ9$GѪUu� @� @� @� @� @heW; @� @�)ȡ2K,]4wyB(RXþzj^O ifj?F-A x7V 6#GFϞ=kGtkbjРA5Q2 @� Pk5myB<u'=U V9wiU|֭[uƄ@R7n__Zl{ZA� @� @� @� @� PZ K~h  @� @�@eeeL0aa3g̭N:uA)_~ݡC&x8쳣o߾ַv¡O,F&M۷)� @�>*AGB� @� @� @� @� @5JC  @� @� @`S ̞={AǏ˗[lY w߿ 6,oE4i)M bŊkͥ?3vm"zI].]D͚ @� Pr7oÇׅ>SL2_  @� @� @� @� @�M& r*� @� @�JI`ٲe1nܸbcEEEq}̘11gΜGΝG9q~K[R&M^z_]… W٨Qhܸjjry5Y @� P}v?>8J[qM6bu� @� @� @� @� @zAջK� @� @�P`ƌ;<qĨ̽jӦM1qРAqu)TwRI'Tw: @�؊3]'C|ۊ:+ @� @� @� @� @�[ ȭ @� @�.%KرcᎅNJo 6]pǝw9VBǶnu  @�-[F,XPt� @� @� @� @� @ uL  @� @� u L:5 rҤIbŊ Sc8zҥK0H @� ȅ ~! @� @� @� @� @#-ح^  @� @�jE ?܏ƍGnrcϞ=㨣eeey٦MZ_$@� @�6@ \`֡t @� @� @� @� @�5) &5E� @� @�bŊ<yr3)Sڷo`c=6<eΝ~s @� @�h"bG� @� @� @� @� @4A}* @� @� yLcǎŋ7m4w{8a)�e˖%O#@� @�J_ /WB @� @� @� @� @�A K @� @�( TUUĉ#;把=zt6mZ>^zѡCbg?zyyyt)9& @� @HA+Ya"@� @� @� @� @� PkA֚[ @� @�YsPBqҥKs͛7طo8ӋaifjaJ#@� @�|A˩ @� @� @� @� @�%! $nF @� @� @/_&LU+**3g֫̕W/vqb_ ~,//:|H� @�'F<TĂ_}5bFzj^90 ?F%.!@� @� @� @� @� Anb` @� @� @`S ̚5+V w\5q ԪUbccذaݻG&M6e3M� @�#. VyD4bEDUU[o^Ņm� @� @� @� @� @@,; @� @�F`ٲe1nܸX5qs4h;w.;80z葷bt @� @�K`m#N<1".]?w� @� @� @� @� @K� @� @�>}zzѣGGZ'LUUUm&Rcyyyr!Ǵݭ[hԨS @� @V/pܳn[D.?Q @� @� @� @� @�[J@䖒W/ @� @�uF`ɒ%1vbc!䱰\`Ahذat5<1x۶m[gt� @� .X9t[[_1{  @� @� @� @� @� R @� @� @@:ujA1zHI&Ŋ+rn(++C ) z  @� @�lj/})K"*+׮iٲZ{= @� @� @� @� @�JE@d @� @� @-ZCnjZcNa|Anƍ[n9q=>:4nݺq @� @� p^Z}d۶}Ԇ^h# @� @� @� @� @@]YW~ @� @� +bk<NZ<}p;^VV;wϵB� @� Plqlٿoĭ.F� @� @� @� @� @A @� @�6 rcEEZiߒ%KrM6ݻ޽{lj'X {,//-Zl6*� @� @`.0׿^? \}- @� @� @� @� @�%  @� @� bĉk<3&>}z.^zѡCbc>})cǎ1 @� @�@߾+V|Ά+Gan� @� @� @� @� @@w@� @� @@;wnuѣGǪ˱cƲer7oeee9qO?7k֬V[c  @� @�/})2~"Z\<{ @� @� @� @� @� RB� @� @@,_<&Lnjr֬YY7;uT w<;$@� @�8#K> W/c @� @� @� @� @V! r:A� @� @v 0B+**b9 2UVQVV=z<0>bcݣI&ZK� @� P[G _~h #@� @� @� @� @� IAnV @� @�˖-cF v.qܹAѹsb\\///vmH'@� @�ؠD~{;ʏlt' @� @� @� @� @� -� @� @Tb޼y1gΜ={v}iY-Z/,̫n֗,Yͩ׏ FӦMYf֛7oZ֭[ea}mܢERQO^mc ~8qbuo-:C-]FFjY5� @� @&VXf͊iӦ￟i=;˜la-X .]C$˗///Ļq7"1,iqѲeKӘiatyvm6իWU @� @� @� @� @� " @� @`kHSLY%2qzxƌ1sqzx)3rp W\3x1-}959d_3qͰ"qu!F ,O Rt% ٵ^NA}m]۵kW\s~/L+**aJS@O}*?۶mc! @� @Zi2);6ƍ2>1”I8e dLc4.N;4iǤV {|+Ǩ>rO\5(ƻ 㥅 4vƍW'Nc_=ݺuݻ,++c>X @� @� @� @� @�z+se5|;￿v @� @�jP ;~H/i}y٫՘B )xX@LauU)IྐྵsFz0'4W L/=r՗SdzSN9�v%eΝ#m*}SSsT>LORcusAK^k! @�lzvI'm@Ҹooj4֔%ԦM i0fi3^QO&B8i-if-ӜYӔ>vm}W[  @� @� @� @� @�T' : @� @�-.˵n{ィ()0<X L/wرRB KĭZ*\bҽH)SRX{4qș#;c9N;;ҷi|ͪi)OSƍ{ŠtV }L& @� @` !x5jT=ov|lҤIKy]wN<[Ӕ>!z~0Ӝƴ,Y"S?F>}rMnM B� @� @� @� @� 1A~L8 @� @�5#lٲH/ ^-,˲bl!,Ҝ۵kW3Q'X|y?~|L/AG#ro}.ŗK={5^:'MTmc |:ujQ%.L/k� @�EI'}k]ATf̘#F?y#X`g><ý;=)},'˽+9,^4ϝ;76lzDv]; @� @� @� @� PA廯 @� @`3 ̜93^~lzY^z+.]V%߭[u]s8` yܹs||37Wu5,dɒH^;ާH6l{g?OG޽z&Mj5r{>՟  ΅dRW y\uE1J @� @�) r4">?ĨQ{ H;qۍc.i\_^x!j^q!Gp@4jh#Ku @� @� @� @� @@mY @� @�HuK/Ǐ-a˭{4k֬{iR`ڴi^|Ns -|A~9>o{ 4ؔMeqUWc=Ʊ[VUUń ";XX>}z3vqBc:1 @� @�[F@qW'?~<ǓO>͋O}Sq衇ƠAbѶmO^gώ{.~xꩧsZn?> Z*o� @� @� @� @� @`uO!@� @�[L`?9?|Kv)n}>}{D`CW^y%Rxc…Ѳeٿ8o߾ѢE S W_)aÆ|Hy 7%\zܹs yLaƍe˖S?ʢ{SWEN� @�JL@dY%K}}OD0`@ʑG=zX֬ѣ}xGbĈC8>q}.4iR*� @� @� @� @� @` ܢ*'@� @�W`֬YO?wy'奰?otܹvRKN 3F/B ҍ5 4`ȴNof|2Ry㦛n*Zm"Ǐ_ {(w&M׏N:S㚡;j @� @�j srK_{7M̛7/:8r�n[iJi,1B{yu1t8c=,vj @� @� @� @� @\I� @�?x<9/>1pp~YfuEԩS/Dpw}7ҋчzhy1dȐPo\sMw}9�rٲevna*ԪUH!ݻwƍW[ @� @@Y,x7ƈ#b]ws9':СZ߷4_:x뭷b/9w1z @� @� @� @� @@Y;V @� @�&׿5zxᇣ"RGLJI`ܸq?1|Xpa?>N<ҥK)4vs=ѠAX|yXu+-ZsS9)豬,/{Q\o׮]uG� @�l \ ƻ~c=6/Z؝:gy&n~;s\q1tq:� @� @� @� @� PAֲ @� @`sq]wpػw8c=ss4AjD`ҥ^~G㷿mѿ8_/$lٲaÆoFnݢQFu @� @�# |0os9q饗N;Tx~q4]w]p a @� @� @� @� @�RYJwC[ @� @XdI<qmň#bwO?=N9/oʿk&? nРATVV72qq7t @� @@Yoz vg|_cag}v\}&%TMƍ|;qwƀo={~R]N� @� @� @� @� 9oJA� @�̙3kݻDž^[92W^yҽuZׯ{..\7pCf͚E԰rjذapuMcƌY!  @� @�l1˗޽{GZ饗oȦ[n{yi? @� @� @� @� @�J[@di#@� @�L`֬Y91@򗿌+"&Nzkロ^(͛e]oFqF&Mk׮qi)Q mmԨQ 4 ,X @� @�ɓ}{q7ƈ#b*i&H:to oD� @� @� @� @� P Kh @�$˗/n)vix'?I;/9ڴiIT(Ru]og?p뮻bΜ9Ow8裣CQQQQ6 @� @�:&/g?٘7o^ . իWt7to o" @� @� @� @� @�JSފSM5?,kD @� @�5)# &Lo>6lXU(@:uj\}qǹ?UV~-Y$4iRܶB� @�(fN:ǒ_Aw-Zش*V,\0&}'~Պvk$ @� @� @� @� @. ԯKW @� PnӧO[o!uСC?>ҋzQFYB� @� ^{8裏zHVu MH[1 @� @� @� @� @� ҺZC� @�j\`Ŋqe]v[}Ѯ]g]>2dȺN٤N/N.?izѳg8s_^-?~qqi9眓_XN=~/c{ls7A} @� @�7o^s1ѯ_կ~ 4s,>[Ǻnĉq뭷溯Uǽhɒ%o;?e] /-X 8Sm۶ns1&o#Fo%fL @� @� @� @� @�# t @� @�M"p}O?tuYZUUZ5*Ə#G~8fϞ٪~7 6,O~3fl[㎋o1'7o}kc5kC)-N<x'j| @� @�8^zi,]4hذ)b̚5+}xc…=N6-Rb_gyi:}(՟Ɠ??΋8S3gG~7ڔ~3& @� @� @� @� @�Y:BK @� @@ U_f[oL 4w}7|ͨ_E>կ~ucZckK}2?VZe]=\n[zs_Spe޽#/| 9'bM7_O{oC @� @�XߞvM.E]IPi\Q4A/> AK/vF7SN1|u]{cG?ʿ1 @� @� @� @� @�O_(~k @�믏owm֭[o64lp=nܸXYYYcu~2N&Lt Ӧz9P]&RuǎcȐ!bҋi[u]={/xKTN @� @�Y }�ST|ɛTds0ّG 5o?cF;w.߾}w}1c҅[9/Vo&vL @� @� @� @� @�!RJZA� @�@zm۶/}iyѢEw>`_zx衇e˖qG~xsΉ3<37Xo)D[ni&||q7ȑ##׫WN:k3N;- yHs ݻw\veژiqAŴir'O /0ӧOo1FZaÆ^,65}N.ݺu2c'{7M/1_zy}֬Yk]1{xOS;> 7ܐ '/Y$1bD~!:֥Kڵkk.NV׏B[=cƌ8CrsӋ<|ؘ ^z_=c,^Y @� @�6Jw]unM?1+LC-_߸ƌ=q}{ /DFh*;ɭ:4nxǏ馛^\5qղ +";ҘqauŊĘ1c{ۮpIb%5r$ @� @� @� @� @ @� @�M"?!?-:K%2mzq7!_#5½;^yB뮻pد_xw /P_~9PÁo_7o^ZoZ[>vgd*R`u]of\tE902Yfko>uY9 "=׿/8#K{n.&eРA[ pL)r]eYwuۻ{_WNȧ7.S/3}ob_xq>y){/]ZBֳ2~|cǎkվ}ܮy~ufqmO 7* @� @�V9sfK\S Wt\ze]dR644Ӹ`ԩScȐ!{AÇqtQgLNi ׯi4}�'}'@TFMc´vkycXcS,W_}uת.e @� @� @� @� @�lX_Cu:� @�E&L-ΘB{]lG '뮻v۶mcȑ9l˵?|>֠A~)+_{g~;cΜ9q9ҥKצDyTg!TpԨQq綥p:.waW^HYYYL92Փo~y^HN ~͎u/o$M)t3hѢxrheF"ݣO}S: K/ )N*ރ;~Y2 M"6˱*2 @� @�3fUlgϞy 6}|'m nDLlMwyuoC1<0_3lذћy1ǬVNu)1i&4ifaҵ4n Ӿ㺮i9MPM @� @� @� @� @�'aǻU @� @@ Vg͚U-L/Ϯ:BRPa-ޝTqyHdȜAI`Ȑ)CQKs==BIOРD&J Ieg:s=ps쳇{}n ζחO>D4dRJ2vXׯW;O4Iʔ)cC DO-zwAp~v<y tp„ (:u N޳gTVMvH9쬻viӦIXnG׫o Ç7|ǭ?-5x,^ؚܹ_Ҹ|r7I5k& ,;Gp!#zj9rH'"ʕ+wg=AW!� � � � @z ݻwۦԩc2u:eڵv]5QFi\iڴumѶ3ptַqmK=X͛VCwθs(z@�@�@�@�@�@�@�@�@�@�bH-\ � � � >l2AMULHHH /_^~i׮WC#5h13n\lH._EǍwԶ-[&9kɒ%b ;?AmСjxW?˛7ZҥK˘1cz{ Σ>H %K'|R=\)XԬY3Z5\S=?sрL-K.ʕ+K5XΜ?+VS]d,z+f{\;yqYg � � � �6PBp жW--Fj{6-[>`_\[ƲNٿuCKz3S{@�@�@�@�@�@�@�@�@�@<6/F�@�@�@ G[ꫯ2MS5\#EA/C\gc q [H��@�IDATzu˕+gߗ*U*8W^rˤI NבېHZIQ߻ʺ^-;j{ʆ $11Q7onC.uf9sd˸u& otW\q̘1nS'Odk.P|G!-[}v`6mZxĺV{siPϕ+W:tH6m$~z\pAFlm"� � � �ds ;6Δ$4U=<xV݅h `*p<uSGN=w\`Q30@�@�@�@�@�@�@�@�@�@ ]LWn6� � � @ yrUWBn߾=6[Ҏ={[nmB 4h`߆^Ο?_\gJHH'Jҥ;/.w}y^p7|#wuW}:-WVM ,('O ?r\wufѠKɒ%7ސW^yEw}JRidԩ6ur'۵ٳ'NԀΝ;˫*,^8覟G'R)Stb?YW \*3|2j(y%wY� � � � z-|o]5Zcm}dΜ99|vR-ѶcgJcZV_=g F�@�@�@�@�@�@�@�@�@�8 Y@�@�@�G'׋,Y"bD&M3FVWMdd׮]V;wmkc^Yzߺukp馛D/Xlg#GiK=#Ŋ͛7= |7mb.]l~x7JBdʔ)ҦM=z_u&<]>ʖ-kg裏D(y4h$&&y'Æ s-J*ҤI;$sМK۶m>CשZ-[[Ύ… orO?$iӦ… mc߾}E7k,Oy6cpf$~ 7A9s{,8_i֬ 0 8-GXvUnfԩSzo!� � � � С4jȶ;j!F/&77k׮0Zj,mC ԐB}xG1NӇZmGg޴i]Fhs<EMMt6[6l`\v,:\b7=GZϙۧY! � � � � � � � � � 0ߢG/uio}gLA�@�@�@�,D}mߞ4Y<$$h_""ŋ4!u2uTPQ{jD~X͛g,;vݻ۰"tػwdպ袋lvr-|h'r/^7tP>}<?K\dr 7ȥ^j's-={^zi~+_~ynJW_ fQXWZJ5D,u]GZ 8̗/X.kժ%O?7u֩S'\? ξb-Ӵ/K2emnG!n 6:QwhFۏ`Ţ̙3Gz% RJm>\WeɴXW_-WƯ_~kE�@�@�@�.`e"w3yT@;6mj]`jn믿툮mQrYgI>}l>)U=4ZcC}}YXdIiݺmZm+ێ>kmwum3Dk_yvlرcG'S|}O[m0Im 6j-{mnРALk}e'x¶ � � � � � � � � � �ć�Aq � � @&0?m3׶mIn|wIѢ G s<qW-[; ']vL1uVC{ӧPM"%KL.W 9LaaVz\ڹyբA9s nsݶtjդPB:ÇEA; v\I*ܹU߫!r$}lxv4_xhpkXfF ؎Æ 3l@�@�@�2�AXe3Fo ݥhFh{YvTREkfϯKgLG,U4im5j75Wͺ@�@�@�@�@�@�@�@�@�@�NP dq@�@�@�-`LS g G 51UXi{eZ OЀG}Tz!OKŊOxa7nK.$qSmOp=nĵ6'ҬY"뇇L⩆SmVFl1ܦM2eJIL[>Lh.Ǎ'^xaY� � � � R0N GyD^yѣG:m5l&RI^믿^^>|x<U � � � � � � � � � �\( � � � 4QA.1tZ;Dtyڅ %k0EU r zPG]G\rСCmըQC $C 1fvV9w}w7vi:@ƚ5kFF|"~~,&&&Ajc*UN:&4A͛'t5ln'"O?$wݯT դ � � � � 7o^ի,[̶gi% mz/#F xu@�@�@�@�@�@�@�@�@�@�H.3%we~ � � �W`N[^އ8r͙SL0] QO<51;}K+zTP!yDZ^|E9slܸQJ,)[ m޼ye3Çgϖ\f̘aR~a]vf:uD�@�@�@�8͘fPHWI&I>}aÆ2~xTRnŇիk رc+Q @�@�@�@�@�@�@�@�@�@�<  � � �'"p ptCHoY5QArYȑ#oO<!/xVZ?�#eO"|ez]v[o%?=;u$s4j(;� � � �#@dƸՀҥK{l21b}KBvx'$,yK5d„ RfMd@�@�@�@�@�@�@�@�@�@�X 8>8T @�@�H et[9q;ytI sPGKC=N/ZTD )#ȑ#?KϞ=kիO  gϞ-L2EN:$ѣ|RJt@�@�@�@�,@dV>c54jժSO_9*O-K`ƌrwʕ+m!C$W\ǵ.B�@�@�@�@�@�@�@�@�@�H? Ϛ-!� � �&.i|vK^y^pt $_[`2n8?~,_\6l(W^ytIN;<C _wyG6m$Z^zI.]ld 1 @�@�@�8f H`բ'O>[ &\pAmf_|aܹsk׮6�RJQ� � � � � � � � � � pA � � �%pȶmP͛)MZ+50G oLi\?˗/jx ͛''NSʚ5kFҡCKl<ydv13 l1>L>Cnm7on;D_uURL̸[@�@�@�\ 8?@ٰz?<GIƍe(sΆ:dxOK/Çgw=@�@�@�@�@�@�@�@�@�@��A쀳 � � ?.QCS rLi֭"(q<rA.ԱHG 6T:m4/Hϗ .֭+9; طo̝;Wf͚e lRڷo/;vef@$ � � �d' \`y'w1N>}H^jժkGimW\);S,_~ 2D6lMEm@�@�@�@�@�@�@�@�@�@ !{� � �q"gȦM8w۶hrD5 Í�֭[' M/nNs=W>ljԨ V0l l5ɸ| 3grA] '袋l@iӭNl@�@�@� s mw6TpryInݤK.r>M7:e8q̞=>F;'ʕzR@�@�@�@�@�@�@�@�@�@� X @�@�#" sL)1i'GрF q,Q"i. A'|C 3x'|_ƍ%4lP4i"M6իK OAg1 {7o }\|]CZE6ϗ2eÚ@�@�@�H] Sד@bb}τ ߗÇKVSNҡCҎ>o{<M&3gΔ\rѽ{wK$!!!|� � � � � � � � � � y<NJ"� � h-"&ξ6mJi!-<х<j?M/Xп4d/ o￷/ Ԏ~6 ARn]9ӥ@ +-ZdgY`,]Tcz"ElhfD_gy -v]|� � � ��A-RC`׮]6|pԩ6ry^zҦMi޼ɓ'56:B<(}|GC4s6PB!K@�@�@�@�@�@�@�@�@�@ +"� � @6<Ç:>j?1gNXd 1\ y̕+Bv0ȟ~)d߾}\ԩSGjժ%5k +J5`5$_%K,!�E/ئ0zIFի% � � � �~%o-ҵ*dm9sL>]f̘!V9#{6mT˗yv*j?̙3G+;ܻwm#⋥]vҪU+|Q@�@�@�@�@�@�@�@�@�@ L+Y֋� � �,p@ q}i?:iS"%mB;-*.1x"IA�HLL+V… K!5 ڊ7_SO=վ4jժCl*Ulٲ{9`-kիmG?k=?D?R\5�T_~ԭ[׾J.y|� � � �ġ�AqxP h[._~ .\~2OҶƍ_P<yжέH?~xb9|m`͖-[ʅ^(ժUj � � � � � � � � � �D 2 #� � ut.1;v$V"J%;<ߗ(!ay�S@"sm(j8/IVL;WPA*Vh:K2elGڒBAXdۗvY#ٍ0t PO t5j|X# � � �d�AgϖG`ʕ`yO?${ܹsKڵ=E"5Q۰AG>Zhh{6jH4ib35kfK爱@�@�@�@�@�@�@�@�@�@�x 2^ B�@�@ o;/q޽wh@<G7^ ) _@;ji_8/õkךN҅'!!\kJٰA ԗ)"ŋ/7^\tV4q֭e˖k͢ B\:rV\YTb_%4� � � �d Af 9rĆΟ?j Z>(F[!1^XR%C}4D2ˡCCqV^-}s㮭Zۮs bjY޽{˓O>)'|r<&uC�@�@�@�@�@�@�@�@�@�Hg !� � { Jzi ztݴ"gN1ajI&[<pG{ϓ'iY@�رc_>ᅢaPC =<xQU(Th {.\XtU$͛W|߻qjG^9?]kgan<txaٷo}icݻwˮ];wm&M/,XІe35DS_9lٲI't#@�@�@�@�(`rEv͎{>#$mK.+VHpE-mA>a"EllJmy ' ̕+}uچ/ݎ\ۄ::ԶePPR]Cq4RCuxꩧǚ5kb76[o㩧=z?f@�@�@�@�@�@�@�@�@�@  >� � L鰖&-Y{or‚E;|Hҁ:K0H  4$q͢[nMBC;{C bt\xE/}E']Uϟ?Y4.+ ,^ ԡv � � � �ylf̝!80իW{Vv[P=ifLZ}@>GMuy> H1 }2Rt?>yE2zhH  � � � � � � � � � @ 2{@�@ ̱`9{m$c\N,0)S&)QC4ӟMrNZ1@�&yׅBC"8 u|Μ2dʔ쥝Cʕ+Yأ ~aM � � � �d�AFya<xP>l_?p Qzl#ΓfͶ+8  42Tϟ/}Eɐ!Cl8R@�@�@�@�@�@�@�@�@�@��A � �q*w`pC }ܾ=iSi@G uBM6  @ L,r"?3@�@�@�@  U<:"/Ҿ}|>矗CJR_֭[ge � � � � � � � � � @ Jӵr@�@�51;;DJ ;-+r"-Zas'- � � � � � �Md,ڢ$r-rˠAM6rW3<c! @�@�@�@�@�@�@�@�@�@ L}Sֈ� � Cن "^.Q߻qnݚ3\"E;/)Lt jI{ � � � � � �+ Prdʔ)2}t8pԬYS}Q۷ȑ@�@�@�@�@�@�@�@�@�@ .� � pbv%<G7pGשLVx ݒE6M |G!<رai@�@�@�@�@�@�]f׮];iժ 6Lnfyd̘1R^=1� � � � � � � � � � ̂]B�@�,y"7׮M5qΤ͛𨁎u`G' c � � � � � � >1Re/O<t]'gqvm6R? � � � � � � � � � �dM qe@�@�l+!6h{WEH"*ZT|@cŊ"gM/^<i~@�@�@�@�@�@�@ 2kSW̝;Wƌ#sKv, @�@�@�@�@�@�@�@�@�@��AY`+ � @vشIDfM`.q:C$J:V RX@!� � � � � � @pA9sfȑC':unMڷo/]tg}Vʕ+fc� � � � � � � � � � ]@�@�ΝpGPO[ yԀG}կ/Ҷm`|@أO:)i~@�@�@�@�@�@�@ k 9د̿J'JϞ=RV-ye33']fC � � � � � � � � � �&@dQ"@�@�H[a.эؑ"E+v$>j<͛4?c � � � � � � }r۴i#-#F_1cHFf@�@�@�@�@�@�@�@�@�@�,"@d9 � vWї;ׯ9r$P<yDʕѐG}5h45P#� � � � � � �E݋LH,5y4[nү_?iڴ 4H. m%̅� � � � � � � � � � wA!B � @| l"jU ]УmKwb`JD8CsAKȑ4?c � � � � � � $&jAΤv2{l7n 2Dy9r\ven � � � � � � � � � �H Lt* � 6g ==غ8)#R=^tQ`+ J˚n@�@�@�@�@�@�@ ̙3.Y{Ko;JN瞓g]e_@�@�@�@�@�@�@�@�@�@�,/@d?  � غ5) ̗ R\ Q5J }'O`^E�@�@�@�@�@�@�Aȑ@-~gV/%JKϞ=_~Rvmy衇d�f@�@�@�@�@�@�@�@�@�@ [-3;� �A@WY2] 9s)#RJ =jȣNPA$%fS}D�@�@�@�@�@�@  H]\ .~X "&L1cƘQ@�@�@�@�@�@�@�@�@�@�Z><T@�HЎKk56$[D Q۶M }+ɓ4/c � � � � � � @fHL Av =Λ7<Cҭ[7۷4mT $Ç fJ@�@�@�@�@�@�@�@�@�@�,+@d= �dF={!/UD U"U4ʤG {?Of<@�@�@�@�@�@�W@%AZVZ2{lyWdȐ!2ey}n � � � � � � � � � �q$@d � �C`@"r:$ҥaժ4k&C ԡ~FA�@�@�@�@�@�@� Ȅ+#GӧtAnv;ܹ9Rʖ-}as@�@�@�@�@�@�@�@�@�@ ÃB@�@ w Q=)Qw_"+zH"]$=jc߁=@�@�@�@�@�@�@�CA̙[m,YR&L =znIjժ%< P|<j� � � � � � � � � �F lsQ@�Hm <jУ{i l-o@=wH>"ժ+UIHHZ>@�@�@�@�@�@�@ y1oݺ,\Pz!dK/Iz) � � � � � � � � � �*@dr1@�l[,_r:ܽ;75D Hz_Hm/ � � � � � � \$g|#<"ݺuoQ8 <x<Q@�@�@�@�@�@�@�@�@�@�2F Ȍqg � GX!lY~ H-'$Ri\xM7Tx-Kc@@�@�@�@�@�@�@�vs̘Vԩ#sΕѣG=#'OQFI6m@�@�@�@�@�@�@�@�@�ȒAfN!� @vYNd@أj5"vXQF &MD&Ꮥ*>]/@�@�@�@�@�@�@�2^ȑ@ ,razxtQ $]ttMy)Yd@�@�@�@�@�@�@�@�@�@ LuRV� �);jУ ԬhQ5/Ax"yfd6 � � � � � � Z2ed2}t0`ԪUK|Iݻw+aN@�@�@�@�@�@�@�@�@�@� X@�2J`6%K4q*3H*VDn)%KfT. � � � � � � @Z 9bYsڵ-[СCo˘1c) � � � � � � � � � �i*@dr@�8Q D~-^kɗ/XH":԰GrIy@�@�@�@�@�@�@ k x^`<\`AygknAի'wu]'Oc[s#� � � � � � � � � �,39@�HC v OE EJiJLG~RE;DOYRdn D&Ny]E%2 F�@�8شi3Fڵk'O=T\ߗʕ+˧~W2 � � � � \dٳgCSxfZm۶MZ5nXϟ/#F{L6l(sMn۶M9odҴ>#Gk @qFYe?,:t=yݱ =vRob83ƅ@ZG =7MfdPsRjU93>^Xv=~GfnބSI562w&~9 � � � � � � �ħqk|B�@�!uC#/ ҿy牜rJ E|Pd"ڵdUo[W^ Aj? <N<CZ"� �Yfɇ~({쉼P:իE@�@�@�@�@ -\dmŵܫVlٲN9" .Yt<KBBy0"Pyc 馛dǎ͛7ې%Kzqe,w}'_~e8|ݻW:d?'Cjo?u6OMK̟uto;;n߾}:C?sa5LhIZnPLC t",^>/땞 _ d{vsD7?oBϩHmm)}g- � � � � � � � @A*| � pL?̟/2ni#RH"-[sȂ"&r"nȶm"s][niZ\c43#� �Y^/aÆQ 6 qXn1id߾}vT @�@�@�@�I%R.`R=~qǡ ˙OIb8c 0aL:Ujժ%SLI5r@Y#,\mi}<5i~Rs{֭{qLuNct)6@JjZGtngZ"܌yp>cԟ]Yt lNMݪ5j$]wВ]؝ORrL@�@�@�@�@�@�@�8 Ey@�@(YBL?1Ob;*$ҤP"YDJ ;N.jΝ"~+"|}<c � p<ح[`e]s<Ke*V֛` � � � � k-%{>,̿ ⵝhѢRpaoE/YD.b.kמp5/%K *u)k]xjg8HaJ߷f8pΕ+WezJ\w"HN"iu-ҹz N܌ip&٣}o5`i\ vCev9Gya~g � � � � � � � d_KM@�2\@U_C_Pd9D*UWO+D N;M(7ëN@�@�L#wɄ dҥæv+m9eƍ妛nJo3f̐zKo޽\{>aiԨ 2D)"]W^2rHYh 6L|I9rΝ[n={|Wv哇zHUfBvՆU>n;_%cǎ~vتd~|ꩧuܴi<?K!.ޣG88# � � � � @ .yѶ}{o ҢW?|駟JժUeĈɇHmK޼yvyK754h@zifus9G,_~m^{U~ᇶw UN5Oj<yl߾ֱCrEuE9eܸqo߾RvmyGl{pJ)mRCж鯿ڶWkW_m#uχ?j1<RmY? oҥ~G2emKe̘1l2իWX[ۻ-N:ҹsg %\[ΓL} 5u:LpwE_b~E,2q}b1pIJns=W֬YS6m*׷޷tuұsQo dgkСC5I w[~ܹss?{8mFh"Dz-+W~o` . 8OJ#q~rE:Otpװ]vxoO]RJuyhDM6-x_~Ҿ}{XM/Ã! dG:,tmwS7m׀p_C]v\u>3/QM~s$Vs]>uJ_rZ,֭z7Q=nr)؟׺ dҤI:Tre{[qv䮻 ^s{z-~G4X3keJ(P^zFsu\ᅴ! � � � � � � � *Vv<}Q@�@ ^yy׹Uy9rh+X<_9s<oǎ̿ � Qo=EU<y<ө3`<h~hp<aN3Yfy:mL3aZjzC-g:w;<;/D^5{zݺuHt,M>t̳]w] L f:ׯ1={x&�ҫ[ ӢE τKÎWXgg%ѣG{#ײeK  � � � z/Mz( |[ڵzZ~Wjl{j1AL]TBMSk1~=Oymb��@�IDAT&,~Dj/lׄ{Um m&LҮ?m&оwhy8g)=m5vCYL�g͛7{&3aj }E[ u{&4Wfͬ<`(7m&PLce˖-9q5ao ԿK. M]ŋ:i`Pkod<9;_,<,J{\{g)/x<SkߴZombL~]־"_?v"Vp߷H+b9)HŝWG~WMࣷm۶๧~9r'MvM`gBhq7e R=\y#]b9uO<]^+Ak֬4 41^6m<ؗlz:?c9״n<5,ܹ>Zj}"7Zgw N܌t9K=F&0`@]]=]up Mp7o<M!nj3O)}H:u)H6k@|3g^G,YbPޅ 8uJ/^^ t9-&ӞzZ z?a{&֎4C;cBz6{:ޏ9sf&۫^g8==f g+\|}g @�@�@�@�@�@�@�@�ЧZ!2(Y �&[mx{N#A&2}b=O3~~L@�@ A+l=�/v2}t4: ^|^bb:j(;�`O;h'1cegzO;0i-8芫7&َpǏ>ȮMpK]#˴m68ީS'oeʔ Nc@�@�@�gFd<!ꖕ^}ӞxmS\O>hKjHViA qE)z0] jh"Ki=4<mذNҰ%Jx۷owxM6˹ ~yr ҙ4G_p'8pBy6R!u_Oz뭶}\2 kv\w~>HC\YbGCvm'k@מQpm /i ߖܷ`ëS}rAϢ_4P0X,u߷XWr,?K=bG n0<p{Yo1XP ;; 꾺Q}pשXE}X:5VK.uC dL&7MzεXΓhװpj}m#7)w6a„梙F_+҇9~z]up:+rlcD;W "}vZU yiJ\:KFкuA:] u>aug^3wy|6lhJVtI68-󩧞\c9+d@�@�@�@�@�@�@�He\( � MYH䧟D, Ed>\淂5E4i60O&8& � ?U1fĄ;W_}%SN={?3^nN:b:ڷ:tCKLY1{tjժ zLd;ر](cߛNrW/lb)M]x 1tӁYL'i;]1o:RbE1ab:2#Ç7|γk.6m-ZT~g;M}NAv: � � � � �K|g&͕ҥڶHy-@ᅴ勤QFXEEY K-0]ym4Ahup #k&=zӵ믿.wq?^:t &|2\h;!=ZLHH}Zmm&@QLL<Y;IFӤIĄE=?~Ԯ][LPf1AUt-7nqĉb§Ąj#n"t$<Oܷd&Z~i&~E4Kܯpt,6Acnrp';r,wunڴރ?N ٺuuhzӢW̸q^RN˹0vX[y睢K50wbu瞓zJƄB^;V}~F;ע'Ѯa/jwOK [J牮G'9?K{H}?WF_:>^M7ڱ:} w z\C\r߄>Q =ot͌:嶝CwMW^^# ^ݨ4kmkגұ/?M=JsX\c9t]@�@�@�@�@�@�@�@ -L U։� @E~1ZPDk{lGb:-MG88U@�@�@b!;s9Nw~ ?vriҷ)I˲eD/a۶:~θA?y{g v WPC%S@ ҽ{wq7tPí � � � � @6];IJ5Ph̙2Z[NvV  m;6V Keb [}>60MÊt<R+m>.6m05k"/z3ׁm 0@4ȱw6Xb1NE Q{}mذ31upտOXD'j !:O|<u-w>ݯp0!uX֭r]xyfdԬDž^hC~#.YnK/~t~*Urv=\Tg kvSۍ7(#Fx]{s$ܱʈ3~hɪU"^v~кty=4ibG/s-Һ3n+pڬ˦Toy?eȑ1;/g.q-[ݶqqC7=:שX}TZծB% p?~4<rҥRrd!)[]Iɒ%eذa6n3® 5D@�@�@�@�@�@�@�@�H9#}g � 9LѐGҿ> P!3_~ӱEp-Ev7OL95D�@�/0gΜd;Y\9TRɦkΝ;md+2oIGکwޱ˔)S$wܶvPְHE;57o~t֧I&Z?-Րw^7d2o@�@�@�@�@�kE%vicuH{^z%zH:l!5n_>l"z-Ok׮Z|yɓ'ln Ӣ:MJ* `kc;IKX,mծQٱcGi3 L}sV%JYc_iw8?h{í•Ԭǽ+:utMr뭷ʐ!C 5\R{9rDWvz.?y}8~'G%{Sz Ȟ={ w2 V*h牫okA}b%Ova>dž|jޱH í+kse[h&k3G;帺Go'5cNƶÅuIGwK˖-o߾ӦM?##Kϥ+Bf̘a7}gwLtX]S\TO>C�@�@�@�@�@�@�@�" I@�S4Id`RHzP~1=⋁]DNHbH2Nwj!� �W_}LaYge#ֱvjР]F뮻ۈCW]u}RLle˖vT4pr%dɒ+b;jgjժIm W#5kA�@�@�@�@�Bv�vrJNhJ*mذi;3vt]y믿}={h[F^~6вcǎA@m۶]lٲRxqٶmL8Qw=>\slڴ)xܢW c9uֵxmp۞߾-_ê9IT'Wx,%DWvS2ҥh{i8cZkh-[dԩ2p@;w {uuyBtZzYfw2\9sQC�5QCn]J!eРA@w'۠X7Kc秫Oa$5lݺu))m/{)m#irn> Ҳg;ԐXKnn}n˵-:<SwmZj{"עX,UC;=Eh:u, c-E쎥_~ u+WJΝm]xqؕGٺuk맳9ΛX]}l � � � � � � � @*@�a|Ȉ"ډ(!btc19"O>)7՚4zvG5#� �i#pvtN+hSN9E b'i"-}o0_ino֮]k7( )SH6mC3<cZ) ,R:xi8]Μɛ\$hNg}h'C;<6lݷ&J*ҤI � � � � �) ڵL6OF2rHPoղtR{lXNvV ҇Ռ7U7\ciÌƪmږ}9c�YXjlΪ>v Ҁ)]>'X-*cƌ D?l}٨P>ݟ:6Op :3lgjPYڞwZ[kѐ>-ٺukLYXBYp:toWNJmAL}h׶XWDtU =h+"pnI7nXD/q6_~!'O6qB~7q7}<߷i ?/-SF!={7אRtiw!իW)O31s-$5,ܹz=H^)LL w? P}p{v<~]gvݳg.ve!rl#틻D;Ww/X?cF xy#]3cN o֢~tՆ:VA@ș3gaغoz\5TCu4O?{XNJVw[omjO?$iӦYX\c9\="� � � � � � � �.`5J׮/  �@b-\y/yzy^Z#>2J=G=oL۱R � �'pmo۶mg|y=zL_tLg`8իW_bEtN=T@#<Aɦ=svo3켺J*-gznܹgիWƎܦoL'$ӉZ3zttDVjg:x{#gz_|wmy-Sg:7y]tLo޽sA�@�@�@�]@vג!56ȴ+y}D^ lvPoþndM6m&,VӴ 4R =j֬i6/3snmNu]?3qoz]tu͛{&֭m:u򴎗\r7w\L%[y:ٿg=mwV?vFc[?m#>|xXTHmjU~}￷^_-[~&ξv;icpЈ ߨQ#OږoR<:j͛ݦ_dBMwo? b =p+tXo MS,/W|yk)LX/R=e÷-jc)b&pC#N<p3!qvhשh nLgk۷uuoΝÇ#z}ﴛ?هaޤ<]v K\M>+5{>W"7 t >J*e[~Gr?1}MhdO{3Xu:F:^NwG.pD25\\w<ϑXXSZtޘ�Xnݺ&K^ƍs>*Bct*"" `QPEEUqu]kU;"Ho;RI/"L{N6 $3|n-|$9s. ,ڳdɒWV/k =[ߔĞ{y)_'PwpIΙ359BL^#� � � � � � � �BKYp)޽/ɏ\@�BZX?_Zk;;ԸԪԲԢTRVנ} � @ >^/ pZvoJ&^M7J^ Gy[.:+Û$o 7nqMؓ7y77R%J~ 7Iޤ޽ە_O8-[Zj&7%@�@�@�@�\dߛ+F5j4;̙#G6lؠǏ $oo?YX%u }qTɓ&U׾3ʓ'E7%Y\n: 4H^K=Cz']cA夞ZxAY߷"SҗmU65IWIj[Z+̔'TG[Onvm2So+ ,*/>CW|| +5ǯM2E^YW]KQV, Zz)]QT,9߽ͮIg?m^^arY=I&Wr6'to|Ǔl/Ğ<W/ॼ nؘڗOj;Ҽw)/7f]^`s=׿%/(�Ʒo4ڶmeo<f=m }({;W}+ @�@�@�@�@�@�@�@ L � /]sy.~\ƾ.//n}aɛR@�@  R?@�@�@�@� G2eiA:{Q3<eXЯzK=ʔ)?СC rRW>C qA .O?iڴi.�ZFr*UTFoL͒SƏM{-@ 2T@oE �pano:oGJM0!VX@�@�@�@�@�@�@�9@h �)`i֜9 -h-5h m+=ȅ\MR � �,`H ɓGݻw$G@�@�@�@�@ ?lWcǎ. |0ECdɒzeu-@~.XE-Yf1n޼Y{Ѱa\ ČզM\1cƌQ*U2ȋʰnSN)Pm涋.�d@fZrkߒ%K;x9?~\}WTnevmٲEk[y+jbB{+~I � � � � � � � y+f^Xz}!/Cfd� @ ?/Z%͞I^h!_}?[:Gu@�@�U`zvkIy2ewm�5G�@�@�@�ȖMͥ@DDr0 Ԋ̝;[[2Ç裏ˤP, � z믿^'NL}܉� � � � � � � � d"� \_Y$ۼw`AM] [fR\͕@�@�BQ`xrH@�@�@�@� d?j'K]';'/(d:C-ZAi:}k׮zwTB`>uD A3g(wf tX%V-ɓ'?*r@ ;e3)R$Xr>o޼@�@�@�@�@�@�@�9zi �ذA <rD*TH {LAjX g� � � � � � � � ɄkUslR+W믿/6mj֬^sg]B 23bb2C N$-QR2 � � � � � � � d{@{H,  //թ#!8qax`~+=ԬA OV � � � � � � � ¼6 -[nӧu}y߻hg$@�@�@�@�@�@�@�@�@�@ � c{@ y{ipn Ci@iQG7'cdh> � � � � � � @�DE@%Bʖ-qiƌTV\ 'йsR7 � � � � � � � � � �"@ `yR@ 6l^zIY*ZTjiT˥ϗ7)<\ʙ3ݪB � � � � � � � lp3fޗ46m}7oʞ=}YըQC ,ȴ:Q0 � � � � � � � � � LO]F�HSo[\YSGziP!פ;/]*X0 A@�@�@�@�@�@�@�@�,#+W.=. ܹsڴio]Ǐ2! � � � � � � � � �  @H%ԵTd-̑&L *U � � � � � � � @2M TV>}k(QB~]JꫯB�@�@�@�@�@�@�@�@�@�::ϒ �X\9RjBpLJr^}U7iJå9[@�@�@�@�@�@�@�@�LsN 6Lǎ_+Bϴ:Q0 � � � � � � � � � /AK|@�2] 2R5KzK&MޓZV:|X<Y4H*_>ӫK@�@�@�@�@�@�@�@ٲ9CTy_հaC͘1C*Ukp@�@�@�@�@�@�@�@�@�@ L #�d@D4mt]RٲRǎ'-^,RnR<ZU G�@�@ -,(ysW[or{߹ΝAC�@�@�@�@�@�Zjiʕ=zrȡ_uі-[A�@�@�@�@�@�@�@�@�@�R@Aب4 ҠARR.ҥҰa҆ ?!5o.eV@�@ ʗ֕Μv{;׽{՟!� � � � � Y~ݫ޽{{ 9|pEڗIH � � � � � � � � � @ 2UE�B]`{rΝeˤ#[˥U];ԕh? � @0  %^S jc%!� � � � � @ B iܸq矽/͋qU/O> "� � � � � � � � � �,@ 8@� l$=TԦ4st}?>ȅs)˕@�@�\=i^*S&k8� � � � � @( 4kL;w3<#G(<<\^{ h[lիW2mG�@�@�@�@�@�@�@�@�@�� d<� ?GޒZjՒƌzV֭z]+@�@�MdIS'),,9 � � � � � -[6oǵw^nZ_/>"zѣ㏋s�@�@�@�@�@�@�@�@�@�HAf6e!�$(%͘!'-+=T4}s4j԰as@�@�V뱹q@�@�@�@�@�b (QBɓ3gN 0@5r"+V^p7޽~J?EٗUH � � � � � � � � � @& 2)@sI5jHW\!!/K~(u$Y � �YMMFUaaR׮R � � � � �$,УG9r\j*VG}Tr (:u$g@�@�@�@�@�@�@�@�@�@�t V:= @ H}@~4otRQ@�@�{w)G-:^x� � � � � <]UYW [qi̘1Zv*UQF�җO<w= � � � � � � � � � Pn C�B[9ƍ6mۥߗv^zI � �'p-Ry O[г � � � � @ZeKܛԩiӦy 2Y鿍}hz꥝;wf&@�@�@�@�@�@�@�@�@�pAz @V8|XzR%i`aCiriΝZI@�@�HWK>zR޼;+@�@�@�@�@�Hwܑϟɓ'uٳ ^ @�@�@�@�@�@�@�@�@�@ =� v �פ!C$;RF !� � E[ʙEDԯ. � � � � �Jܗ{=͛7O@sk֬СC � � � � � � � � � @2}\i[եS^�'RB#� � p~ K8� � � � � @lI\ػwdD-llJB�@�@�@�@�@�@�@�@�@�2H@M1 @(l.qT҇J7JKy�mD�@�@ :Hŋ_ςBȑ<@�@�@�@�@@2AzꩧԽ{w.\ص8,,L%{_pY|yB9� � � � � � � � � �U~$3@ 47w/;VF)[ � �'ӧO̙3n{mϟ?/;wye˺2ʕMDɨٳg~훠jrx"\> -F�@�@�@�@�%PbE >mQ^t 6hܹ={fΜ}to?ݽ֏ߣG^ZŊ_RoΞ=;w\{Xq7ג'Y|cq_̙Sʕm׶1ܹs'4#� � � � � � � � � @: 2`/΍^xAz9T)i � Ϟ6"� �YEĉ:|:#Gѣn?бctXz{oh]Zx_G>N3@d|T`A*T(uѢEUH/^<zI$@�@�@�@�@ XX#'XT(֩SGkM7$߸q͛%Kh:ୂjAwޭ&Mk׮nɓ:uE|-b%1؂o˟? pc q6Qp'!� � � � � � � � � @L؆3 �'!yqs=H9s&r@�@� gϞm޽ڿۄN �yܹje}-8Qɋ羀6y1o޼nt1k;obmٳgw;Tddd&=fJmri܀1S$U d hiX6a5nZ`Hkwҥ\r*[k$JB�@�@�@�@�A *mkBCG[zmmSܽ<*sm,ou#m<ʔ)}m ;f -Dsosl f1|,Xl {XBcvYXo/eܽ/ ~i 'tm^>"""'fbŊ)^(Qh$@�@�@�@�@�@�@�@�@�� } 6m fϖF%m?Bv � �$ `wڥm۶mΝ͎6K6y6 ^ذaC&ZCfmBMĽ4hz!hdFo<mRMM]�M uV-\PX&LfXbEUT)z%J*n+Ydy� � � � �]q~' 0Z-d{ <hvܷ{[(n3`5[G[b&k<% Ĭ-6e!m6{^6f͚`6aA*c&k=K؎}VY@ΘUY0I � � � � � � � � �*9 Uz#�!,!=RfR! B@�@�M&{ZM^-[hn1q\rE -Zp˗/&D@={tkV8O<fi9K.ĉݨ(]UjUU^]6ַժUK6i� � � � � u~^^~@ϟF~k?(0f3RH+=ʝ;l瑚d#:kσ/-xXω-fcC6Vd[ _ۢUWj= � � � � � � � � �D@)Z@ D֯nU^0We Q � � 7immxnذ}<w+x.xlӦ &XreUR.$ȣG2 lK(Y;vh۶mھ}{L}yKEѥ^궺uz뻍� r@�@�@�@�4]¹t`}ȓ믮o؂=y~}[ɂֺuk`~m+Zh:Ԓ,Qp²ZjIVƖfCm*v>c9[z{m%}6c|'!� � � � � � � � �  uD�H7ڶ&O <UE�@� g/_YӧO{AƳwS׮]]@ڵk6&z#LqE,XdZ(o&]\ύ76 :ÇK, qћ @�@�@�@�+@a\z6m/{ �y W`XX*VvZ:vY >,cΜ9_9r |&`<Z Ҹ۲e4~x<x0v[j֬=ah&^ � � � � � � � � �@6o}BN_|@ Skp%jC � �&`?-Zŋ *P רQ#]ve_ԩ[oݻWk׮u+WjŊ.Pddd .͛Enkժ/>!W@�@�@�@ 6jߛ+7s Io-@$yԐ `A֬YjmQuֹmϞ=.W WJ8ըQ~V*UD4sk?~\,kٶyf>9rp ֭+f"X� � � � � � � � � @ZVAG�-R&G|ԤIl$MB�@�𛀭1zj͚5Ksuہyd5k&f#¸C%mn[diKvکcǎ*[lN@�@�@�@ACJ!#0et5ҩSR޼!47Yt[gժUY߿-d}o_vm҂ȊՂBnذAշ虍Y`Ȇ *[,Y6!� � � � � � � � �� @�`7BƍqŃ@�@ ٣Sj駟tAߎ]06mȶ?*sʕU!8r,Xk?2$ܹsnBr��@�IDATNԥK2_|!*D@�@�@�@ 3ꔉZݺI'OJt 8vK]p h p,] T~}\2;O8{ i WY-`b 7F& ڴiS8ZV'!� � � � � � � � � � 8 |#-|;RΜ!@@�@�Xl&N)ShժU*P gA:v&dQ!pir̙eW DڡCu]]wʕ+UL@�@�@�!Aæ' y℔?U/S*{n͞=[sq [NQQQ.cդISFT`L#"/_%K`wA![nv� � � � � � � � � O@>  @ L$#IF8G�@�Xt>3M0A;wTZԣG]}jӦ }1/ ÇԶGe˖իn&-[6jKU@�@�@�@ 2<I}'u*r #Ghot֬Yڲe <תU+mZ�ȢE#֭[xb-\Ps՚5kMպt"*AL( � � � � � � � � LUD�Lnݤ}6*Ou@�@�.g=Z6mڤFyAs ^ "n4/uA]~u7*w\G�@�@�@�P d<i/o#q@@aiŊ<y"aNSxx:uvڹ>9rO�?`Y3f~oBvս{wJ$!� � � � � � � � �YK@Yy@ [a^V7R|;7 � �d!^^{MSLQ tm_~QFj%M uH7>  }ݧ*U:G�@�@�@�4 2܎@~A*1`4dFEEi7n �k.тuE-ZPΜ9T8rfΜS Su릛n%\@@�@�@�@�@�@�@�@�Aȃ @|bjDYS),,8� � Ο??\=yQ¯Z 2D_~٬uYX;v^u =7n[M@�@�@�@ =@@]B6nܸQGv}{UǎճgO]s5*W\06:#'`]WXJ_~we˖[Էo_)R'@�@�@�@�@�@�@�@�@�,*=f!�$C?> @�@ |[+B۶mӄ ԩS'@fM(X UViƌ:y6m* ~n � � � �@V\OKUN-^X#G5m4u] #B 0-PO [l7 ڿ-Z(q � � � � � � � � @ 2UE�)K~(-Ϝ @�@ V^viѣvء_|Q+V S?M}:u.]3gΨaÆ6l;ne1 � � � �O2*yfVNǏרQTre=C˭[jٺ;UX̪"@: \z.(-fΝszm۶ɓӹtG�@�@�@�@�@�@�@�@�HAf6e!�"!=tmRR)� � zgԴiS.]ZHZxt/ƍs+{իWOӧOSO@�@�@�@�BV +<{^z%UZ[CΝ;]UT gKElƎ۷WfmF�@�@�@�@�@�@�@�@�,)@ ,Xi 1�%~g@�@�ÇuWW_VR i`TT.ru-Cʋ[Ⱦ}4zhx1bD!RΝUn]/(m:ty䑀nn\>m۶-iVVM7ݤJ>lׁ@�@�@�@�@ ^tP3g~z7kڵosΔdv߾?{l=cjذ[zwt5^}2ٳ6m|AU^]ʕsK.޽z={o� � � � � � � � � LW^2G�SW[oʗQ+@�@� $֭[رcZ|ZDnϟך5krJN;wԢE4qDV|zL|Lm@8?כoCeGJ ڿx7&<8q"%<yɓ5j( 8 ~%#@�@�@�@�+-ۅ-&]DD g }cӧgܯevse}GZz"##IEnOEQɺȑ#�SLɓ'u?.φV||<y4V3շ-ZTߵa={-7ߤ:?nD�@�@�@�@�@�@�@�@�\h涝@�bhZiРl>F�@�BN+TLOXbinRZfL\m޼1cz)<mBK/۫`1bf͚H3cbY{G-[y8^wX0ь,eZ)@�@�@�@� M @NR.]b4 .O<ܹs|fÝwީN:D@JHZ4d gN]uԌsMgʕe }YK/Brn@�@�@�@�@�@�@�@�@�� d=�-o5K@�@ 7Ԃ�fV*R *Y+GV;Էo_NMKӮ]d+{F&fF҄@6m/B&MeG�@�@�@�@�LȖB222RݻwסC4|5n8.6fٿE3gTT}23- R;56wN<Y#Go%C�@�@�@�@�@�@�@�@�`T % CŴ@�] jر5kV -riM2E~K٤e˖i„ *PvwyGnvz뭮??D& ֘1c3g_עEd5h@wʕ+O?ϟ?N|j׮{W_ɶ#FuVuQpyٳGs<W^yE+W0`l-X{lK /(<oN??ܝ;wz!ȑ#k={6mڤ͛kԨQwٳgݱ9sɝv6VTI%JpA'k/`_qy>k3g`nuG�@�@�@�@ K [ Zf/_ҥKܳoѣo5qDm}x+VPA֞2eD[ݷo _=z~lKiwx?]OnWZU=zP.]\H_9wyk>nqO>D7nt}ߧO_�}.^~e]}6lXљ$ƅݫ[n%znOj"9c6d۶m-dAL~[ʱgu|-vZ}{FիWOpl&vYȄkbHN=38}6,#˧,@�@�@�@�@�@�@�@�@� dO܉� Un0֜:#� �T&j*:aJ6QZIQQQZ~ h-~<yVXnMK,qE[�F hYpE h{ɓ~w9rgykKdբE}A mM>4hnF=jѢ .7[-% ؿ &Eڳ6p߾}nѣׯ h8p|3D^ԩSMKlRɶ+YI C u_&31#{u׹�6aRB툕QyG}v͘1#[A@�@�@�@�zxt]'x SOVo4ig>p}vMzȑCs `S<CoŵU6akUZk[DZz뭷X۫I&.aRtM7w-Je|Io}v̼3n2I 8|ppٲŨ|m%>cnn鲶Z˘ *Խ{w7s 7lA+߸PRMM%6XzI#zfy ٺukfF(@�@�@�@�@�@�@�@�@ Lw �A-TlP7#� �$S v9We%KtA7n]' ,EGs/_|ۏ3g ]v;f֮]&N֯__mڴq =*yܹ{Mܼ]G dh-\RfyX0F&{.LGҥՠAwE*UԡCٱ|н<xgXz~ǎ;wl.]uByڹL,+W2f:}8[R%̙Sj֬&[l ٭[7W^=O?L|}_BY  {S? � � � �YJ[(;vL} Ⱥ׷olq K> gcpΜ9xzBS6`vSNʕ+_6N={vY# _ ,Zߺu hl,K.ѨQ\Ǐw6`Zn:n M)acXo:˷XVRe%5Fpa5\##ț7~a*T(V *,p% i2&'%GI]=WGRHN]3{2u(2@�@�@�@�@�@�@�@�@�R)p!@*o6@�(_75F�@�HbŊt#wܱrI,Pak >hno?ڶm ~nwMd7n켬,/|7o&>&#P h0Jn'(22R_}'OZj2˔lu|qM4IEqR-+IgΜqur׮]z_T/ϋN=j&ZKM6ɮ+VБ#GArA�h� � � � �#L :$7~@NqڵkGWg͚gϺvo?"Swm([ȗշ߲eKDRzWԽ{Ő|eꫯ\3]uU.(ĉumE-�e&mص)Iscvo%lI:vv-DelYJnl*KPH6m'GJQR&{io1O8>)R;  � � � � � � � � JC@�@�@�P k49,,,޺:Tϟ׻ᆱ={hժUkܵ4&d)G.Hp.ѣc^^/K.6lؠ-[&'xvթL2zwTF M<"|y^tJ*^ڵSseo5me2-mܸQ+WVZ]?m悘q: � � � �YNM-h-ȓR|7# �l2SL3nܾ}ZY@Ӷj- |c1|7p򇍑XŴ[VbcׯwUZ}?gr>K]|mm@گ]%d =� � � � � � � � �$.;JBr@�@�@�HꫯĉDS"E\?0`|-^oڱcG˗/ޗ.]:߮;jܸqzWۋ| 6i4n)M%K\ũS~EFFe˖.e߾}]=?S{|y:7V~޽߻2\r9:uN8:h@&M~mGͼy\@R"!� � � � @x1\ @-ZP͚5;p�\[ƌsΩgϞ:zhtmշoc)|Ǝ+_6mz]G_dIwc&b7{Oj'FrIdH3J]bc>׌h\-ho/y!� � � � � � � � �� ח@�@�@�4{G^{L? Iwvݫ~Zւ^ve9sۋK*o޼XXX>3)SF=f͚e]׿UQ1f /X@<$ gϞuVVM bŊϟ?kΝ@>J*O?TW_}宏gt&~zaC-dΝUX1ɓ'c9_U7p kݺu|ji> ^zV F�@�@�@�@�)zw4eʔo8 =䓮ov ,q:TS>}zjٳu+ŷ,&x֭moJθA7`rJjA1V 2,%X7Mb(qeUb>׌hG*-C qc`#FHZ.@�@�@�@�@�@�@�@�@�Aγ& � � �U5J=.\׼Sٱc-ВMرc{T}{aA-m2TRSz饗9 xywڸqk{ѢEu!w3?MNj*wR5a]yze_~9V)W;=uT_&o^O=sxxTf͚Ǎҭ[7wM6n7Oksrѷ޽۽>z*TǎZ_|r;wN&MҚ5k\9sM&܌kGyYܗ^XP ~ꫯW� � � � �@D lKzҷ~Vme__X~ܾܴ[y1x -ltw~~[0@Ϸd &YǺuH"bAѣ]=C[@խD;x;e-rqwN~sl#h޼[j޼y][lG}EԩSzdiS|3o%vGjmKN;Q qXɓxR8 � � � � � � � � �Y >Tso_x}7� IZ � �~ 6Y *52ɡwyf͚.UdI=#ڳgN<&IvJRF/^,XB֪U+KԸqc7/ЦM㏻zoCɩvWvqj6ͨO>С;rʔ) |4hQ rJz'ճgOVkY.̙3,;C>̵&v]ÇwA.ӌJVСC]'N&ȞODDnv-[̵{Μ9j۶z=_^vjA/^쌬_~}](jGRɣ6Ҝlbܿ:v$ݤ^M�&!� � � � 0 Y'=TpƔRZnյ汾3mO>qA_قYO?r|9BE8[�@'Q+[oMs߾-e[dũ,-dcժUS~\?-LS7oQXlbŊ{ fiff6&bq ٚ;wyo߾ݍ'X= Yl,#IU&:F`6{7ll7ߔ-հaCUΝ,',,-ehY-}N3ܔ3oe˖>l$sdzInr=믿�]vYZ^@�@�@�@�@�@�@�@�@�LMWw\HB�Pl}B0�"B�@�!C\ķzKs ,Z_6tÆ :~ h)Sk֭dm9i1ZK$j/}ɮ\jƼϮK(O_;vMz|stY|im۶M#Fкu\{j/`[&;MbSO@�@�@�xc3ޜ xԼ>Kre[@? fh^{5i&8*ZK3g'O0W\*QE;t뻷3>|Xk׮uATT7HT\TY1, `j NŷhURX>II=Q#kz#5my%x-Df+lA>15 � � � � � � � � @` 20 B�MGFK � @ >|zW^yIa)xb6ꫯNzKL4^3諯J4B i̙^ܓ N٭[7۱nW^y&L+d̋/f{pB 8PNҤIte%v9@�@�@�@�oQc@f ,]*5k&X|UX<yR#Gt w'xB 6u oR.)wk-IH(5iį@h}=^zI}I&"� � � � � � � � �@C�@�@�@� :T0`j׮~Zwur{ )… GM25m4kqdgXʛ7obSt.22R ҂=VfP׫WOaaaZdO^z% 4o>=zuwɔ L6#� � � � @& d~po횠L /!C&M>u 4E%X S\xn>xCdĹĉ裏ꫯ1b~s(NE�@�@�@�@�@�@�@�@� lQ^WY{_[t� 6/N{qZH � �!*zK#GTɒ%o& d~s7O?TRnޫ-[&7&Pn2e͚5ݾm۶]g*� � � �%xl`=jZ+VHK7Kի۷l+nj+Ekn+W.G @ IY~>+VL<N(P {�@�@�@�@�@�@�@�@�@ 8ωZ"�~`(@�z#G_t, atPBA6~ș3g7o+$s޸q^u=Z*UғO>nIٳgP � � ��0 Z%]viTF0$vݭ/ڰa:uފ]w/b!@P [N_~Ǝݬnݺiڵ‚mT@�@�@�@�@�@�@�@�@bf_l@�@�@�BBXbzg}vq׿ŋC€F\  +<{ƍΝ;N:Ztƌ#dٷo_@ � � � �dbt}Vi}֬Y nݺ9rʔ)7_}Umٲ%4v R;w{1]z饪WNk׮]<ywNȐTX@�@�@�@�@�@�@�@�%lQ^W] H> �wW/L~ � �.`Əw}WsqW^=؛G&wcz_3#P٪U+@�@�@�@�4 0fB2@ kJK6Hk::͛Y[f͚ꪫԩS'o^ PIBM`۶m>}f̘iӦرcjݺZ]Zj^@�@�@�@�@�@�@�@�@ d#@ 0(T<F�@�R&/?g}&ָqc7&շ$Dܹs9s=i$߿_ }a2t<G� � � @0,OzfEuz$ש[py\Ps?TӦMծ];ڦM+V, 8�&yf~7g͚J.Ν;K..k%ҭ|2F�@�@�@�@�@�@�@�@�\Af @0(]X@� .Ԅ 4qD79rʺ/\ q'c5}t<yR[ 7ܠ={bŊ(j� � � �A!xlP<&*E6l�rZn,d4={,Y/8fhm-[*,,,9r $WĉwnŲlE۷5h@ $@�@�@�@�@�@�@�@�@� dH?~�(ģP|@�U4eM:U-RռysuQ:tp d۷Of̙3ݶyf*TH;wV׮]խ[7.]:9q  � � � 6cE`FKիӒSֺԩS.[`ߕ?~5lP7,XdΜ9�A \R˗/w۲e/VZjl*?C [@�@�@�@�@�@�@�@�@ #�)`QJŸ@�@ !#G{3f̐m6mrD5j6mڸEPBBYp DFFjne֭[g>o:ur[˖-b]n@�@�@�@� 0VAG ^jՒk',YKmŊrRڵ@]:[pJ*)#!gϞu3֭Ӛ5k`~ǎNlٲjڴ4iZɒ%CP&#� � � � � � � � �T@)z@ x#� �,g͝;msΟ?/�gޚ5k& i#!}�6 yٲe˗/ɓ'U@YǶm*<<\1Iey@�@�@�@ ]MW^2G Q͛5'J]襜#]EmnJ{�5=h۪W|ɍݘf/ 6~WH9aÆ1ϛZ#� � � � � � � � � @ @x @&e 6E!� �!.p -]T-?ܹө.]ڛ{ի뻽M ͛7on8k;8O $a"Eî,VMRPbKKֶE[ZWb]^m�"UA}{'=7!.y̝;97+|E/_\>lWK `5�R?שS'vh9 � � ��cPk1b^&#D1jn޽{mʕ+Ei@{'qסC׹sgҥܕ͛Ws 9< 4T67 e})uJLLnݺI}~$4^z-@�@�@�@�@�@�@�@�@�D J6E= � @d ڵ \.]*e͚5rq;`4--MӥGvjF#Զ@aaTvZAz]߆N6TB322_~dB�@�@�@�]~_4 L7D(E"GsKkmGPHP=WnjC"7/;v}! j<[rssm`M]ϣt@N:R 0gQLJ&4@�@�@�@�@�@�@�@�@  C@� 0(@�@:N^TAGOJJΝ;ygqs-:hEUBĉ|7o,6l7ڹ. `Y\\lOժU+;RC?]ի*@�@�@�8_;VNIiiE/0 )j}Z4O]Ѿ;v"Mu6}Ү];qs]ҦM / Z'߿l߾ݖ|Blٲ>ܤA4,uY YaN9 � � � � � � � � @m ԭs^@�@�@�@@w޶xgi uف ._~Yvۼ~vОӁ}:P չҨQ#>,/BuXhcnnN uS:Rˈ#k׮ҭ[7[6m|@�@�@�@�D >dgϞwcǎi[v}+V߶ѣv>e t-[WeQnyҬY3INNԥ‡Z(,,={ݻmٹs-y>�HkBCP߾}mhJJ}Vsh( � � � � � � � � �,@d8_� � � @ �= u2|$8 7oEF,YbC u0P@QCrƍAb3o>ٻwo.5QԹlsאGD7322$33S:vhY\Zj' � � � � PAքrQ^= }PI5п`@^j/@Pg M4}Y%�ZeR uYj0Ç3}ΠhCyEG5kzd}A.гK.9<mVY � � � � � � � � �  W6 � � � :W^T|/npe$a:_f]AN:\||C3�z`HhJRRR:xQjp+f4[TeKǏmRѲ~w!ۮ}mW6]:?3--MWj Թ֝ @�@�@�@� J&-P5dP]\]@Ljվh&CZ\8>pEex=/p t^h{u='y٢[y±clq:/,,E/-lACI!mMYv%t_&@�@�@�@�@�@�@�@�@�bQ X@�@�@�:u%&@F n`Νdʔ&Dѓ[nu?^:pRR`G=vـG78]0tnNjll߾;zXowocj+:p @�@�@�@�d;ȫQ�^t` { .Qsn(ڵ>\FYgn@_T-keR"ifE.u}&ݲ ,;אJ`nZ .7L � � � � � � � � � pA{ � � � @ IM4y)mHvHF-D&O#};fPq@�@�@�@�@\ӽk' ae�}6ZyYD>,kI@�@�@�@�@�@�@�@�@�@ X b;@�@�@�)B #.qvϑ*j� � � � � HCHI͍ζ*@�@�@�@�@�@�@�@�@�bQ X@�@�@� hdVH@ƺG s@�@�@�@�Y\--HM)(),IL,@�@�@�@�@�@�@�@�@�@ kF@�@�@�@\e""xZ84a)@�@�@�@�@vbNP))"'eHε\N� � � � � � � � � �U ʄ�@�@�@�E@C 33Erre��@�IDAT3]' s@�@�@�@�GKhRSK>YZO � � � � � � � � �D�Ayݨ5 � � �X@C ?ұ$#� � � � @4Ǘ h<6mDDrsu � � � � � � � � � iAF � � � rlHvHFFO$ 2,/ B�@�@�@�@�pAw;  'ҾH^^T*"� � � � � � � � � @AVJ � � � )aN9 � � � �D ,.VPw ކo@�@�@�@�@�@�@�@�@�@ 2D-@�@�@�@b=ґ$#� � � � @ WzAl� � � � � � � � � �*@d^� � � �*@di^ K{ @�@�@�@�[`$\'JJQH&"?"[w{̖̚l� � � � � � � � � �.@d_!� � � �! |R wa- � � � �@z"3g\?/GB K)4RP@�@�@�@�@�@�@�@�@�@ Ι@�@�@�@� 20iD&O>=|� � � � �ԖqyMoD@jHAHaaԘz"� � � � � � � � � @EueB�@�@�@�bCளAa:%@�@�@�@�}>}DuY\uU &"y"[ti � � � � � � � � � /e@�@�@�@ Z<+ӦAN~j5 � � � � P7 R75,RSKΔWSg< � � � � � � � � � P]AV,E�@�@�@�LeDE22¦ja] P9@�@�@�@�b^kEgЀqD@6" "� � � � � � � � � �N &@�@�@�@�Ȭ,B O*jN'O� � � � �Ԟ@ǎ"C|Hqqzh@UW^'"] .NCHo G�@�@�@�@�@�@�@�@�@� � � � @ eEvᏄAVE}@�@�@�@�@:$7pHjZh @�@�@�@�@�@�@�@�@�@ O@�@�@�bB C{q 'GC�@�@�@�@�|"*R\Nj,!MpM-- � � � � � � � � �Ħ�Ayi5 � � �Q-!3S6mj/snn50D � � � � @rHfȻ줡Ʉ@4 ̚-M � � � � � � � � �Ė�Aui- � � �Q/!YY"V+Ǐ6!5@ kRs!� � � � @0&̜Ye|"' yy � � � � � � � � � PZ |B�@�@�@�p![NX##ܚ:a{m � � � �(pe"8PqbQ6NJ@jHAHaHbbv"� � � � � � � � � }L � � � @ eD~A <8-0iD&O>=L+I@�@�@�@�@ &6u̘.@ ' Ȗ-2ڃ� � � � � � � � � @l ԍZ@�@�@�Fl^[ ҢEhlnشI u0HO� � � � �LzݱcǤΏ?.z\TT$'N٭-ɆKϞ;d܏%..RN/u}億[tIshzl&jK 5yy";V-8/ � � � � � � � � �TU Ȫ ? � � �Ԫ@Ȍ IСCk^rrHd\qډ� � � � xٿr!߲;|1G& g\/+VLo;9Bdׯ/ 4s]QFҰaCrƍI&5 ZR*[G�@�@�@�@�@�@�@�@�@�H 2uD�@�@�@�r423S$'G$;[DC ?./ &+C/@dM9" � � � �+PTT${]v*w{\i=V4%9�C 6.y撒R* Q]PbyzL]rݺum"/g-wR:5NoxwR).. />1;vu tsLsNY6@S?+U!mi֬IsnѢE۩St t u � � � � � � � � �D�g_aڇ� � � @ M]t1_:4J[" 2< B�@�@�@� iϗm۶ٲ}vٱc4߷o @ojp tiiie lڴ e= ZDs}5X6Skˆv_ޮPO-\?i8^VZI֭OiFڶm+ڵsL)`2W KG@�@�@�@�@�@�@�@�@� `@�@�@�"EHEҽ{HiNԓ0Ȩ4@�@�@�@?n$77Wn*[l)Ut?o' P?׫W/>| @#/W/9Ok׮REA˪UlXjT~}پ}{СCRSS%$&$$rhm0!� � � � � � � � � @ #� � � :9+K$'G$;[$#‚ dȐ!W1jN� � � � G7eÆ vy⊆<ۖI˖-mS.Bi׮ k۶k�dR$%Fu*jN:=j \Ξ=ܹS<ϳnj;+gq=gΝE=ҍLF̚Cr0@�@�@�@�@�@�@�@�@�a k!� � � e#kIN$Ye L@�@�@�@�"H`n:Yvm?j؞ kԨ ༾}ѣ%դiр= W^F6ǎXk[l!4TCJ5k׮ҭ[Rs d @JrD@�@�@�@�@�@�@�@�@�9 kΚ3!� � � @ ܰa:dȐ*]C!@d(9 � � � @8 ʕ+eղf[tYoCt"zA:u:oѢE85 PaKT4ڵKO~ƍ_ B3g ,..kNz!}z0RP RX(xaO@�@�@�@�@�@�@�@�@�= kϞ3#� � � @@,X 2p f)@durl@�@�@�@�8|,_\-[f+VݻwSlRwn%\b<Lܹh Z pRs;f!+_JNNsN}嬳Β޽{y>}A'' xȖ-b='@�@�@�@�@�@�@�@�@� QC@�@�@�bZ HE?_b,Od8] � � � � PV@C,Y"/?\.]*Zw INN>[z%cǎs]nժU45==ݖ+YrhK/${:u؀վ}J~KϟpRCjjɺ< Oa  � � � � � � � � �!@dd\'j� � � @L hdfHNHvHFF` oķ5.@dsB@�@�@�@� ֭['͓ ȢEdŊ61դiW_-}1}VQX�+AÇ6m2rdٲe6G\ٻwo4h 2D &]v5&۴IHcͧ � � � � � � � � �D�AQqi � � �'!YY@߿}Q" "@�@�@�@ V^m^2-s̱۷od9s+~X  [QeG@W\qF%KdŲpB1cݻWژD @ .@z'VD:tˋN@�@�@�@�@�@�@�@�@�O 軦@�@�@�C |ː!C"� .@�@�@�@ |v)~̚5K%55=PC4E Z@/2[牆.X@Ν+<qҮ];9r5J.iٲeX+TKI!2T@�@�@�@�@�@�@�@�@� 69' � � �T(p:!z0ٹsgi۶m 5@�@�@�@�M/7|SyYh4kL."y衇l�dNɴ�מ={r7Z 6ٳ?={ȠA$++Kƌ#ݻwZ+ ͍0@�@�@�@�@�@�@�@�@�^ Ȩ4@�@�@�8HmeС)a1|i: � � � "w1cXB#G\/!:A�pРW-7p˒%K޳Oz-cǎqٗIs[Nn"f^l� � � � � � � � � �".Wz � � � U <q|2dȐWki"'L9 � � � �'pt">o|Cvj&N(6mKʔ)Sd@%Ԫ=@zO{#4Rz{KaJI͍@�@�@�@�@�@�@�@�@�bS ؼ@�@�@�J6dr:thX 2"� � � �ɏcI1g?dȑvZrұcG@�ޠ}3ޡ=E-<Fr+; � � � � � � � � �+@d^{Z� � � @XT5R1|iڴ+,D% 2x+D�@�@�@�bM@Cn6ڵ,^X{9ٸqL2Etk w=D%zO{c"5YlRvE�@�@�@�@�@�@�@�@�@�Z 91 � � �"R5sϕʻ: 䩧L~Vq+Uݕ0H0Oׯ~j7xC<� � � �#pQ:uy晲yfe֬Y%u)gY1#G/fNX,۶mgyFƌ#sOo#cMU&S}PS|=E-6m'Ԓښn*M}u]^zھ熺=@�@�@�@�@�@�@�@�@�#݃ � � � @BUY` :4`tNwٳg{' OMa;T6EK;l0N8Qmߖ}رc>p`@�@�@�@rrrlk&-j{bY|,[Lt' O䭷ޒ={CzPU6w5>ʫCM{F9HڴIH=_7s='_~{n56C#� � � � � � � � � `䇀� � � �5.-[@A2eݻmVm?l[n`6m! _~2~x{mԩS-H֫WO|j9>E�@�@�@�jKW_s=Wdɒ%2rڪJkի%>Aɓ˭[<~4 B3>]ާk_cF9z{ދ"aA$/j[O0A222N 5umsk@�@�@�@�@�@�@�@�@ xi> � � �԰@(C , ˛6m$^{|}]]}TacǎU;w0HxvdmdB�<Ե5J֯_Cs<@�@�@�@^~e駟qZ=*;qrrreTuF<{WfϞ-yfk]jt뇯UaG>[:ѰD}SJʩAwko qmsՍ@�@�@�@�@�@�@�@�@�@U`@�@�@�v Ȩ)x i֬|ߔTKꫯeĈc9slݺUnR'W_|;{^u?-۷o~=#M6"}ɣ>*O<XBL"o фO~"}̝;~2uTҥvmcǎJ׬Y#/h ͵-Z$54~cAA<cl2iܸL06Xaj߻woַ%^xOѣ?A>9b~:;e\NqqqmtR� � � �Ġիms{O%58mɒ%oھ.Lz)/_JJ&MG[=>(5k=t57 \(}ĉcƌ}`ӤIdȐ!~?)3f̐iӦɋ/(m<``?r-Ot*I~'JI{衇窴3v&ݮ6U7jTQsE{X+b&z*8pDbރ<hI}=zCZk%7|Se;>Oyg_tY|AiӦ:5@^xAK;f_ӧ g-^aÆ]w%s̱Z4矷eﹺ[oe{u+K.ѯn? � � � � � � � � �y;zȦc=O  @ ߤ_=|G@�@�Waϻk- M;?y&l9rqF L(ضmu]w7{lO͛7Ϯ3|^rr=֧~v w6k1|& 3Ǐ2=Hiיk}Zn:t3Yge|ۜwy �dτ^[~g%'|3!&ҷM$/LxΫc2=30=3秿ve ;0!1ݽ{  GU;o3ᡕ3w<]0yLxe|@�@�@�@�yٛxΓ G>Ǐ{+Wl?xE# G M2}ޠAv&`L[ͥKuG]oxgӟۼy؁|U`\stMv4 }:u JQ 6S`ѴMݴNnvτmz&XüjgBPk]*kC0)PߴTQsE&d֭gߺ~HV#7tݞ.e0yAիm{an}ivv\3==3 ĄI6l`ú7'}&su;5o۹s׿<x{Ng7@�@�@�@�@�@�@�@�@�L@ߚ ȐQr @xTm@�@ @u@[KLL_y c7wߵ _qz/Rĉvg0uiz)HϏ==ŋ|߾}^F<&W;íC}{<N->o/ܷ|Wz'N}^pݾ]vuP]ayyyg?5ҁ:L7mf֬YX=`td F z!AV[zʊoGC*0!� � � ^?y1)^ lРOq:jNO:vAN_`\_ԗQFm~>G7A/*6вF u[6^Pw 7}%<:ӏ},Ybq}ggέU[Cg\YqMM;@닑/^ܤt}ܵkIQ<S%5 [ƺAKܤM6uʮ w`\}Rnn-z�Anzh*+oժw^/Dsoe˖L[_+, � � � � � � � � � &u˄� � � �T#"YY"˖dgddT3gg6tPAM̝;Wg|Mo-[L:@;7ńD8h??.] z`F;7ic-M4kF׿ںpJ9z^bB& x3Ү`Z߲.tQLbL/K1v?INN6LZ_IϗdG?wYRɓKsU//CM{mM<E^{51:;<iذb 1ҡC93&b�U[jܸԾ+ZW^E_@�@�@�XsӾmFDկ_;55釞={u;vsgذao4CLXHZZ<bB6GiߣN-ˌ3/?GB52;i>3`t+B'~<x7?~7]Vϸ6L*wh9PX&tMP⋶y}tk'IQgHAgiߗNZmާܤ^O*{&~&>HIIq?/&L7TTT$/G?-I~e{7WK,{ߜ, � � � � � � � � �Č�A1si( � � �5/P]!ڒu5kLtt@N_}[e jtխ[Mu/EUgn.DRCN:[ ho~;0{…o HPn+:XZC%z)?Qƍk< ]JbE.5}JtN܀^Gv;9sd֬Yxbٵk [s`~K.08,#� � � � 1#]vYT4Bm.7t3l݋J>O2/Zia `Z.t޽m M_85J}ݓljC)PI`eVwv֭[˔)Sl(6==ѹGrޓN˚5>m.Ao@_Skwq|G/>g}AjP.j3g}ѣOS7olw T@;@�@�@�@�@�@�@�@�@�jC 6N9@�@�@�@ 423S`P1CELaHVZ С]ߦMRsPK A~;f6l(:R,=zT|MIHH:Q"M:sϵ¯Z[ &BNFXv:|l߾Ӧ >M:͜9۷D ׼<ٴiSmo̅H.YD Kmo~ҢaL � � � @4 x㍢/@9tP46צ~l򗿈5k?ʿ믗#Fk&?PYT郆Knرc,i_꥗^*{h`y_oM5sjC<`wv7*lߴn]~"ZEzObO=Y=]`kDe\zӗgM:UƏ/Vw ^EEE6,W_׿%cǎ='Rs � � � � � � � � �-@dt__Z� � � @Ȝ F 4ȶgC s71PP_C>}}g&m,X ?ǀsԨw'?kNF-~ wunZ^z%fOkxa.]QF2c Yt8:ZNn޼ٷ.ZByYgY^xA<#裏o`ܹuAcח.H7o.8o<6:U':T[֭[%777`ٽ{= � � � �&p=H&MlS6j{4H뮓|/Y*dN\?REQ{=V:u_mʏ~#3gۮ(]esR/NqSپ/|v_.)))Ai0^}v_ qnҾ4#Tmu4\C0 Tʾ 5~뭷lmڔ.Grc{ޛ}wbOɶmC^`kAiiiOˬJJ_~}/M0X{fuc@�@�@�@�@�@�@�@�@� 2C�@�@�@ j"RQ:wlmv%:M|l7@}�C u9//OgM7$77|S.by'nkVOn-((y4�iӦv`:Kw߿~kAiС6pҤIv/SL';<ԩ 8nm* nTY|s9HVV|ߕ_M+: 'rӦMfOj'Nx>_;^@$Yh,Y$`sOwL � � � @$ 4lPoڞ}xHX!Tދ=nV4j(رLΝ;z> |W Iƌ#9f3ӷi7>R}I3<#eԩvw}BNsIzzhNI}Qoa_jo@/:ih7Sb7]Nϸ6o&W5޳g=ܫjN^رc /ѿ%}–VVk>#O[SZ Vg"0W}~ի 6̆_s5'qI_Ԥz }Ve;@�@�@�@�@�@�@�@�@�@iX„� bDz֏!� �DÞwע-[Vm_5hꪫ{&L A ̠E >3}0X^׮]g3{ᇽ9sZ,Xv[?--͛5kgz&KHHu{}_;<3@ڷѣuV:]0=niפI ֮]%''{&K/NOh뙁Ԟ,i3<=3;"ʧiho7:?:z vz}: ZjoDŽn߀nWTT}ݞkcz&L3Ͻ믿ޛ;w=\E%sʲ$N}'|r*`[@�@�@�yÚ�ĒaO }1'szE y!>:'?mKb<XxRm̋g<lxz]?J~*= ~z+WN+ㆪ?JOVg^TcA̼3ay\^ϯߖx&$~ӏ;xmڴ袋<3ΰ== @&OlJVëjkhemAUQNoթ켲~ZgСSg7nÛD\s^AISr^mC\^c 72%߳]4=W{/SgB};vSYM/g^>yy\瘗uy +u4;_@�@�@�@�@�@�@�@�@�0z7$UWCr8� P qq"z;!@�@�bZLldbe׮]b 1AbBO: N3hPL'}hv|b j@ۗnb* }sNiٲsE Zo3V^ٲe=y?x[Nt"&EE&O6M;OyfyQիWˁ l zvfߟ ⴿ3@vU-:@�@�@�@ ,x[ˢ,<}TlsݻwKf*k ?*?JŴRs=g~�LiѢEUIWynSUq} b2`PVQr7 ߹<c6|c\Q?|_o߾g}Y4i<b^kg$,%۶}${~f=kl[zM>#ѿC{Geu8z$%% שg-U_eu{@�@�@�@�@�@�@�@�@�B%@d$9 ! < E5@�@�H93ꫯSF @ CY'� � � �+]{}~YhzPڷoOu̙4oq_ H kݺ[P5,UA%bj |G 4H{1ݻ)#\65YMPS~Vz � � � � � � � � � ucѴ@�@�@�B'!YY"99"";vEG*((kСC+ڄ1"p% <d>Hi& � � � Ȗm:̙#SLN:| V_~咞(vlvAnm9Zy_yd;ërZ߷gGdҵkZ@�@�@�@�@�@�@�@�@�@� Ή@�@�@�@ ̬HmmFUNXm۶pAn)jm{14iRԶ!� � � @l h@A~gO\ ]t}{r5HZZZl-UN8!'NFu7~ &T!?Tm Y@Seܴi+/_mCe,X ?C4nݺe¥R 6,\C=@�@�@�@�@�@�@�@�@�  � � � q*��@�IDATi VVG믟VceXim穄A1s}IFFF97D@�@�@�@�?/ӦM_~.{2x`ַ%G]UuԑG}wXtf~֭~[z-Yp ?[k-Z_P]gBiӦ ]ӣ4@�@�@�@�@�@�@�@�@ +F}@�@�@� wݖ0 a$lJ;vl � � � �T&nwq-W3f / ?яgϞr%\"Æ UHNNʼy?{OVZ%g}3F~iМ)u´WQ#@�@�@�@�@�@�@�@�@�(_ ]X� � � �vdb5V 0#FٳG@�@�@�@ Bz!?lYv;c=&u5h:v]6j#@"Yd|Gwܹ;<8qdeeIn[IH͍*@�@�@�@�@�@�@�@�@�U h @�@�@�jH3vRrrDE22$* �~Jbbb � � � �-o'O2k,Ӈ-/?Fɐ!Cl<xs9Ҵiڮ6G� '~,\P,X`W^2rH[ .A2j6A$//jDC@�@�@�@�@�@�@�@�@�  c2H@�@�@�.B -#* >|1?O>D?G�@�@�@�Aƍѣmn߾]̙#͓3gԩS<ѣ 0W#III5XSN� =zT}^Z䬳ΒaÆ 7 ۦMsRRN@�@�@�@�@�@�@�@�@�"^ Ȉ4�@�@�@� 9CAvIl��A � � � @8 hPW_m!--=l۶M֭+钑! >p%4/5kHQQmV $\s{AL' 枼5 � � � � � � � � � Aﵡf � � �@ff)-fsXTJ @0#Fٳ?yPb#@�@�@�@� .ע\ҥKmyMZIZ˖-W^ҳgO޽k*ϗ/RVZ%+W;w=SMa߾}e̘1vޯ_?uL ܶ̚l� � � � � � � � � �!@dx\j� � � @X hdV!ayqTAj+"Gdž � � � �'sZFkݻeb ;1oye޽v&MșgiC!5k׮tE7o; Ċ|ײn:[4QW_}% 6Tw2vXYgL$*@�@�@�@�@�@�@�@�@�@)i΃� � � @ hdf&!v٨nAjdaa,X@FYF�@�@�@�U s<m7ضmYƖիW۠ ʦMĉvf͚BvY8 [:udiiiR~}C@D1wqFٰam�={l;ԩ#;֭ 2D&N(鶴m6"i49RP [$11jO}@�@�@�@�@�@�@�@�@�M cj@�@�@� /#T0T;AF5 � � � @mhÇ:m8޺udڵ6O}СC[l);vTަESRR}ҡC;oРo{nÇ֭[e˖-v'7o\[tyΝj4lP4T=7?vծKHHmB ۇx'&@�@�@�@�@�@�@�@�@�@AVݐ# � � � U@F1eʆA1B4 @�@�@�@� hݙgiKy*((_.\(3f̐;v 7)99BkO�6m:oժ-u97(**iپ}l۶7e-6q޽u6TCJ;<VZ4Q{L#`dd; BM@�@�@�@�@�@�@�@�@�(/@�@�@�- ȈwGȢEÇA@+@�@�@�@�jE64?~܆mٲE\ٺu ˗;wJqqڧ:oѢ4o޼ԲnQFc kԲ{nٵk-˺?\-[E;t 슆j)S\XsDrs#@�@�@�@�@�@�@�@�@�X 2@�@�@�eG n{\͛'_|q7"� � � �uі@,**a;v(5?]A֭O?xرYn]͚5&MҴiS߲kܸ- 6 銮ԯ__4dytKh:$X^9p߿W[޳g/Q{٩^zO Ϟ={J֭}n3EɃ5A"yy6Z� � � � � � � � � @ uF땥] � � �@ffy ll%aetӟVד#� � � �"A~ڵ%6k�ݻ k 3IrTAlhJLLBj8]T\C 5RKem:u[LJYy-Zg'N-jǏRvP=*5Q mMZg ԠM橩Z\Pgٹ>j 'N % Hg@�@�@�@�@�@�@�@�@�H 2uD�@�@�@F\YTL'QO) jSA@�@�@�@�NI@tX5PҿC�DsD!5х5/u.ySfK|_8 ypII]./҅Uj et.~0g鮁LRJnn(ȱ@�@�@�@�@�@�@�@�@�@:N]� � � @ Ոw'-'0a$ � � � �&ZZj57Ҵȇ\|qV!P-))"fUˡ9( � � � � � � � � �}9Q}IHwDT@@Eѫ"ņ\Ċ/vEi{/{udd73̜s; s8A A�"@�@�@�B #,p L.qA�@�@�@�@ 2\*MAn} � � � � � � � � � J� � � @*ȶmE.:UzTt* @�@�@�@� #D̐-*oș3"3 E�@�@�@�@�@�@�@�@�@� DLB�@�@�@ %KEW06@�@�@�@�)6HtY.e! E8Ȏ"JEBi# � � � � � � � � �[ }9z@�@�@�T&!mڈ,]Jd*;n"L"� � � � f2=f9$@Ѣ*پ d @�@�@�@�@�@�@�@�@�,@d )�@�@�@� 22  < @�@�@�@�+1#A5cȟ_$}zmۢx8 @�@�@�@�@�@�@�@�@�] h? � � �F@C ۶YTdTaA�As@�@�@�@�O C ТHVpaۓ6@�@�@�@�@�@�@�@�@�@� TAG�@�@�@ %K SEP00<)4 @�@�@�@�L�^H $s � � � � � � � � �Q#@dԜJ@�@�@�܄5$V0Ċ= � � � �)'AgΤ\Ԍ@J hm@ ;v?/R?YB�@�@�@�@�@�@�@�@�@� 2-@�@�@�@ I,ҥH<!2H�aIc_@�@�@�@�O@ ϞM |K-^T�y#ү_Jz@�@�@�@�@�@�@�@�@�@�ATX� � � @)ҫȧ?a@F %@dD.� � � � J2f$2TwKԫwӤI^qDΝQױ@�@�@�@�@�@�@�@�@�RV mVO � � � w߽4o:9p@DC ۴YDdTՓR"A("?˟|"2?YB�@�@�@�@�Ȑ Ӧ[WY3t.=;RC"4HɖR7 � � � � � � � � �u � � �  ,rjd"\IdAZAe |1o7]Ä� � � � �)@drjSWJ H& |yކO@�@�@�@�@�@�@�@�@�@ L~sjD�@�@�@ (| r?Ei "{+R?�p Hi8EV n� � � � � h3 oçDu׉ԫ'pa>#ҧz � � � � � � � � � Nié1@�@�@�8rDD 5{#8  l 8PD C!<~޳� � � � �#Ag&O]Ԃ@8;RۦFC+i � � � � � � � � � 2@�@�@��ADNPԷnu[O@ ;w=:v=D֯w � � � � Z 0@"UA p;_@�@�@�@�@�@�@�@�@�W?s?@�@�@�Q D.\uBz5a C ݒcbD^}+ � � � �$@ A&3u+\xy)QA�@�@�@�@�@�@�@�@�@� 2-@�@�@�@ Q}&rx»h�M9|�W&!=Ή|֭o' � � � � \ Ii!ЮH"i޴_6i{@�@�@�@�@�@�@�@�@�@  Ak@�@�@�HP@CzKߛicL"={^ ӠB|oZr!n:w"� � � � @4$ZM@C_y%vtݵ^;@�@�@�@�@�@�@�@�@� \@�@�@� |ȁo.H֬"{!2`Ho@ݺ"7|, `o:^dPݻۂ � � � � L <{6%R!p睱5J@�@�@�@�@�@�@�@�@�R�As � � �)x5ϕKDvO$w>g B#Po,[&ҮH4"qD{gE�@�@�@�@� dHdpE)-RE/$}G:wfK@�@�@�@�@�@�@�@�@�O ;'@�@�@�}w)Q?A| Ȏ"?/-X�!ZUdkEtINDzO:hkYF�@�@�@�@�Pd@d(\)32թs8 Z� � � � � � � � � @3,=u4G� � � ].\sy&uMk|/^9LDZsBY4i콬ߧ5It&E{.F^z)"\}9y≣ҩ)9~<>#ӧZ$@ٲ"_~)"o-2tf }C~MGCԩSrY;o.od0W]Κ5Ν[r%2e @�@�@�@� 2NM H@}ḳyVT h?`nW9sfݏ @�@�@�@�@�@�@�@�@�+ƄX!:uTΘ1)R@�/C;ݱc˦D@�H]ӧOɓ'e}k~Μ9cgw}xAmDf~̣|O: ;{9cƌ6,N_Ztŝ_uUv;}ug\u Q`n4RALFٹS$[Dt`MdÆ uVٶmuyraj^Wc ̛7)RD-*ŊVPA (pe � � �XcHy}E^dʔo -Hǵ~;8p?zWt1Ǐ,Qj)|}@ٳ{^uYJ9sܓzj@�@�@�@�@�@�@�@�@�T)*F�@�@�Ry@:L'Nx^4Q ` ^yȑ#`B 3e_t ײN鲾zqץ1Y/]}^ŝ5:=kצOʅ 2s/ u}9n@{7HS t60Nxz ϴ,ZYd1AxYE_A_;P?}0!  "~(2pU[-K/VuME5QrIf$O<A:HVк!w~w}Ձb {ڰ5kɓeǎ6h+VJ*IʕN:RV-;7i � � � �>cB $ڏX;6OyϞ=y߾}-n#CjHjW_}'PQ{.ƷG2/iR iߐY ,w%zٽ}Mz{Ҿ8=|ه47D_paϬ˙@�@�@�@�@�@�@�@�@�v s| � � :{T#G.{jpc|p=d:K~Jsgu_sOҥG@@Y׹5Pԝ@Qwty4AqgutQzt5( P hҥKe&/ɝ{_w%GKժe䦛n^zᤴI!uNmAWT? ժUKÆ EvPnba{@�@�@�@�CtMQZ>xk֭i&;oٲžw_5Qq'S+T'P痼yY  oLwo1 gM藴H1߿?9w\oXbv.^}-QyRi)U P � � � � � � � � � � � �p<xPggκ>3g*GhȢti7VR%V@Y: +@F7$J^r|^ jÇ=VƝt`q_˗W1!N8Q&M$SL{kAr^zdμ\w ipTֹy*߸q̛7 6?gniٲ4mT2ek? � � � � R~wlJN"m6Yf[k׮G7QzVPp… {fw ;2><N.M"?ՠMonυrË&L`׹}>ϣʕ>lI+VhH � � � � � � � � �@`5SK%)@ &Cwc`Ly �^ ۳g5]W7}PGw+!nw�.W\ngL ЀH jNUx3j2o޼n@d@>g ke~ ;v{9suҨQ#آE YhhjL'N3fؠK \| [3;JVlPq/ǁ� � � @bM#|>[÷_6%F_tWXaC5XPt҇@-[ֆk2el ,XPA:L!p$nٲE6md 6x<7olb-ՠʕ+KJZjRzu~8@�@�@�@�@�@�@�@�@ ` H <JD�7ܹλvwu9sS0G7;0ײnٟ tC\Yu{Ǐj ѫZ *d_.`ĬYڏ7/M2d EꪫM6rK֭Eߧi6?̞=[dbz!W^ja8@�@�@�` '9v,Ś@)$i[`,\о.ZHva[YP@ X Ԡ@ϟի탌UklvRN;רQE@�@�@�@�@�@�@�@�@� 2OG�/ě @t h֭[!VqgV7Ma;F5Q!OɓLg ظ: ѝ40H"EbŊj-~ >\<(7|s=ҪU+ɔ)S6. jk}̘12l0YbԬYS~aڵk SA@�@�@�RPħj'0bvb f .Ȓ%Kj̙#:=\J(!jղz) h̚5kdٲexbpP>ltW. 6^keRG� � � � � � � � � RA<"�)$Z@�d͛7Y}eOmJcpƸ!l k ٳgOcBNqDh54/n^h;ȝ;|Wu.^,Y3g˖ͳ- X~2Œ @_>?+| ̞=[ b!ի<裢L � � �Dl>,ұc4%dž@x |HN"V,S \xM:Uf̘!3gΔGJ\~ҠAZ^={L'46mKΝkg =wiҤ4mTZhAh|G�@�@�@�@�@�@�@�@��AAa@ rx9犖"�$,4Qù6l`_uƍ'Obbblx\X1/Zd̘1HÇ9 Omiږ*UJJ.meJ2eD_َ hp>}dȑ^]޽{e2x`BS2eXl� � � @ a'F/zș3"2D!ƍ'ʔ)SR`Aqv\ߘHSl0!̚5Kt] e˖rM7pH̾ � � � � � � � � �q+{@ x'C�PzjYf}]vgtra4�Mмg z$+ /  ĉA;w*ʕKʗ/ogsŊm`$/$ٿ`¯~6mZ;֯C>w}W4ޓ:ݏ @�@�@�4c#h0AukcDf#c>^~1ͳi֬p ҼysG&B-гgϖSh"ɒ%۵k'ru;(@�@�@�@�@�@�@�@�@ !� 02V �ٳgmedb YjlݺUǑ2 /@rײe@09 � d˖-~zn:;vm̐!AUTjժIժUDaq )Ոӧ/퓗^zIz)jm۶ɳ>+Ge?3)X`p @�@�@�@08 4! L&&0PܹS=GD�l߾]F!F%KH…nmJ&MldDZݻw@ȟY&N(ӲeKڵz뭒9s=v @�@�@�@�@�@�@�@�@ tAΖ@�`QX�:'Nŋe…h";kr9!Fd:WTIʔ)c?KuX0 dcǎݕ+W] �^7 2GRzuYԪUKj׮-›6m $;2`�i׮ 4Hjdfƌr}ɑ#G䫯n)CA�@�@�HǦϱ̙")_v~Q*Lz>0;N:Iz$2!'O~>LsңGۧMI � � � � � � � � �a*@d�JG\@�.^hfϞ-sΕy.\ٳ۠1 Q  2W@�B$p!Yt,YbzWZ%%K;x~ҰaC;h<(۷{rha} c Ⱦ}J>}º4@�@�@�@ Dms+S[xEطo}ϐ!CҡC{iӦQ@kG =zTƎ+Æ [<䓢�D&@�@�@�@�@�@�@�@�@� 2!>C�PGQxR9$@ 4qѢE2}t?d֬YvWLVZf]};�N:RLI81!�3gl0$ꬁ֭qtrJ&M믗%J1k֭[ngʯ*UT Y@|?r]wҥ r � � � @ -1cD:vL: b ݘ)Rlxr۷o7|S  =rwK\RQԌ@Z ?ʗ/qRhQɛ7̙^^YfB�@�@�@�@�@�@�@�@�T9gv#� � F[lĉm�#G쀖ƍK>}QFRfMI>} �Ș1ԫW9sؠ_ 9r Q,UlRnFiѢED bܶm ̑#矒?~0yMF|k^K|M6[@U � � � �$!å1~a ÇKeR|y믥} sC+PR%{6ޒӧOۇk'}bpRP!*Ya\Ydޅe@�@�@�@�@�@�@�@�@�(HcYac$vE�@4";ݱcHp@�T tR;vO|r;믷_͛7ʕ+K @ tٳeԩ2ydYpĈ~:ckPΘ1Cr)nҺukyGދ&F@�@�@�.?2V 7)#h%{T%>dϞ]4O ?b1=ju0@U&}<yȾ}k.ٱcܹSU](=)ZTPAV*5j԰^X"!Q}pp � � � � � � � � LmgE�T/T ��$I`֭[Yv(QBn6iӦ4nX2dȐ@ /&L_U~w9u4kLu&:t̙3A~6rRPh=zq2rH  � � �&@l1&OM3GAh<?&O{~SOяH`Oȸq7ސ~:@'NȦMl_ǯ^Zk֬PՆ ھ-[Jڵ yX@�@�@�@�@�@�@�@�@ 9&G%ԁ� � �-0ei۶,YR>3[d…yfyya?x_~&MJ{n>| A׿6,^X^~eY꫶Ǐ7|#;w\ruS<}ݐ)رC,7|} F:QFfh1{… (Hs8wW^RLL|}}[͛W.觃}ǎ+s|._#%' 4eԨQ@z]}=?SN{߳gO^eQ6<ògϞI! � � � �K}nٳhWX!u֕-[7BޏR)j!~}pޛo̙3ү_?i߾/_^N5kVmk<FmO)RD~/ر<ydɒEV*0_|>q꯿KΜ9壏>zIl޿x2:$^{}8 }k!� � � � � � � � �G 8R  � �Q)0~xSx㍒.]:wyGjժQǬc:,Ƕn*sε|t0M('zjYd'ѣ>|VA>}7NN8I�}[P6Agv.O:R5TC'L Z/:&$sbiI&-{KkSEI_1cF[m]7 .[t-E~gzHd Jֿo ݩS'_иqcwۤ뭷$GK/%(G�@�@�@�H涤L`8נAHXBdiDJݻY%ƴ/Yf~ ԇ͜9>d'Pt_Mctے~ՠy>ܖ-[?Y[4'}.e˖>|K2[ha^{B&]Ǿ&ڇu � � � � � � � � � 28� � @T h`b֭[n5jȺu䧟~iF_#|I٣G9W:0駟N5{UWBw˗Gy$vd͛75׺_vIG<e˖M4lÆ RJ}s\W^/^`{L:U=ò|rdRbEӧMÆ cǎEwb.;ws}Mڵ3gNyw%wwӾvuW]uφj/ � � � �Ȑx11͋mRpˈ#$sv)՟锜}*Gٳg /`~ СC@~)un[.W;c ٱcGC>}[ժUw2|Yj}0[/UYpas_@�@�@�@�@�@�@�@�@ 8c@�@�!0n8^94��@�IDAT<yR-[&Uti[FުbŊhcbbꊻ>i:h#ZlmviPt}pu |}xc{ %. ҥK۶jJ̙#_} 2D5j$;vHCϭw|Hf͚-곹&M'NnN:Ts#}:hwy k @�@�@�@�l8==}MOQ<?WHI̟?;ҷ:} mLjɵ//2sL8p`PoiYԵkWyoՇ/_σ@ A�@�@�@�@�@�@�@�@�)|)$>g% � �8i߾h_~DCeZf1B4 RpB;vd͚Un&dڵr=ɦM瞓[;C:u$ZV߾}̙3ңG@3Ν+~\Ν;|gڴi/ڏuu]'?P,Y"ٲeݻ{UNM0AF%v풻hz=۶Ot@苻_ŋѣPBRD [,iZjޅ ) #Ӱ2˝2}l Sʽ+ywyꀪZ2e$ժU_Zn-O>de|H1^f̘!֭nzw6u6m$T~W,+Ve5ͳu/^\}]^Ϟ=kZ~{:x.գ[nﶖ׫^G '|ѣG5:oɓ'k_m6n(_ݻW~'ٹs<Rn][Yjժ%׿$Gu٬Y3g͞=[ (cپ},]T :;g }?7,9h g̩SkO"r�'ׯ_ow?~xb:o&뭷TA("@�@�@�@�R>KL7S2 sw[r[TjO⻏ҟjz-5kO^C}Փ]|oguk?>O7#O<v'vx61U7}DaݢE v{6__"eU O>ҿל9s\r}vAڵkg_7)Y㍯Ƿ@�@�@�@�@�@�@�@�@�(``ЦGg&@�4fL!� |s� JFf�TZ1}rL Ds6lhיB :rL5H6c$L8 պ^z9vgZ >1Ar kuK Ҳ~ |sL0 /8[n,tΧ~cNӦM>&XSW 'NX쮜9sW:+VtL50g73O{_LcvfSF DŽ*:&έ6h&̖׮@9{>Dhgj?^i˹7Aqv_G:j[NR3ϩ^@9Gu7:e˖uL5Ä9&x13P1a*wԥKz赠]ƍ;h`Sp� GqԩcQ׸(Zzs56ykNm|1$v|-'pLا]ך tLp}%KkrU%t~v饗^r4i50tP{mwQOM&1AC }3!'sC~G8`߶e˖kA<.t\%v?uyO&8Ӯ7ޫ#Gfnz_")@�@�@� Zre*@@ƌcn{3%ypw)OQSvڎycB#{!j2E)zr_<X1Ur̃zlڟh嘰GꫯCf=^0na$kZdh%=}=@k_ @CUh?\bmԂ 端rLd<@�@�@�@�@�@�@�@�@??Dd,) �B%K @ |6ӑ0> HdÆ v]ʕ=`:`Hj 8SJ:7Q?Y3gqz=!q_|]4p.nPw}bmJk0w ;(N1_f|=ZaF9/^kТKٶmwI^v ?lې#GGbCۭy>WEu�΁֕k _]ьzvWL[aA}5P=>C{M͟?!^{-L={בSzwC@ϗ^ s:ܼy{q N;^U|}ixbqCbu>>3wzUٵkWȎK @Ι^`5ٲeӦMׁ9sƮ\N.EgOi:0TI ?CyMݔ� � � _ Lݗ�G&3lX4&4C^K)9ҟ>=> xN]AGK}]}PxO0m۱c@ڡ? oyN֬Y>}x6Ѿ�}( @ _i`2/胠xکS'ۿ (@�@�@�@�@�@�@�@�@ I11!� � �sN)ZCQ2glU;K,vRJu޽{LN*&|ML,ZHLȡ4hnO? ww4bBĄ=wyP%lҳ l(f,YĮ7ab u@E\RCe,DŽ׸\jժYr 2ZVX!E{[l~R@ϫ u>s9 .MإM|7bI59r9rDzSjUϵH=zmf)8(f࠘LyWm,C3NL0gYfm=lٲkp’;wn[~bbbo J(aϧ ^5jc>|qsq3oIc1!@U4N&^+w v3_mwDѣG bŊy۸qc]֪U˳γCj׮-O>|bB,ƍW^=\^{1!� � � �  DΞMl{z/SWZN?Ew_a/E˝P'>zt[p0jH;w9Fwۄ^;9~iƳ_~i) -?&>}L � � � � � � � � �)@dxZ� � @ hXۀd֭!)\at.kA۶mm@ܨQd6G6l`kuyՅe˖n/O?k|x:=orRÇU!}mԨ Ps4wk'ZWo߾6 *x WZeχ{ܓ=C;ﴁ<']wV૆1jzOZz^e;w{˖/n(㻶uӂ]k]֐ٳ˂ mƏo~/_>dǛ#G9tPH~hc|@b 6{Oz]֯__M&z}i /-Z3f?wd͚5?Qwk  � � � � җJhm Fܼysh*HBn}܄S$=QH=q_7v >L!Sb~!>="SdQ7M6 Yݿ Y� � � � � � � � � $؏NRQ� � �,p뭷JեK.6p-%m@=<yR "tSM|̙3=tAT@{믿~Gjꪫ={Ϟ=yuyWkիbٲeU!}͖--\rJL{^(9e u]pA:u$&Lqݻw : ٳgҬYURe;oߠAYt9zh4.m f<uhriC|hŋ%k;1n'Otf)mcb/ZH^z%ݻdΜ9&9rDv>nscuEP|&7|;68ZnܸQz�i ͓'eCql� � � � ]z ̙:p>}رcùmڟpBs}'nc ~^}RTe߳xbPJwaǿ � � � � � � � � ��A)O � � ݻwK&MlS5/śr_Һukɞ=M׷g.,XkbWN ,(<.]Zf*!sݺu[Ut=uZ0΂cbŤjժq> ӧK2eYf:cĞW#IsH]? $wܶ'NxUfM<0O@ꉵ֫W/ɟ?1B>sknB Aj&5U%|iy[vzy@�HA5j԰Ž⋱6{ly|UtpkNGzo)S^Oϙuf`a>}?ߤƍ_y� � � � j5T{~O> _=O)RgчTy? ?sTՓ\%9_믿Ǐ{v1c}8TR'_Ә\J*ҢE O+VXYozgmߜ \WFC�@�@�@�@�@�@�@�@�$@$W � �xt`Ϝ9slýa:z= 0E ȑ#Ue|A:]�;u=z�M6s &H޼yE#uڿ}4rȑ6 CtRNOE ۷ 8І`,YR֭k?;wݻ7}۶moon׹Fþ4(O.Vh3m4π. ܳgkmfOqǏ[>;)uSյWR[WBQ uF_~Ezmd5`Gp<uТ^Ν+'O{O41c7zh4nhbFm@+b{Ԑڵk~?=_z-9=NZ+ҠL]wRCt/R*T . Klٲ$lR>SyGK.#?;+qC1CulYdoQ`OkAM>c9}m9y/ʕˮogUڴic7f͚ev8 wuҤIF2!� � � � X LYR?C}Ƥw%W-r_ן|rO <MiN"Wn,q%L{inLu?-Zip/,m۶ׯ=n@xS3gMjh~>|EUԴY%۾}`> N � � � � � � � � �0+hSǎ3 @ cƄoh @x\x1NXێ C ]A+ *U1[r�. ^r6n`E q}YZ9&Pήˑ#5nN͚5WyDŽ93gvwyNʕh矝5jزcbb={:+Wt/nץOy3`1m9fcB<u[0 ̙1昁Uv{u9Cuʔ)cיp4:fZu}nĈ-ڞ~k׺̠.kްaC'O<lW +s:wq1N՝3fxgj<݄YkW@{ҥsLc}i` G9Wq*\=~}oB_0XbZj9fc%x}jkYe:Æ G~z{c9Zrz){%p>|M窫wW_Ue?j~{huvlYinf&<~7nA{s[]X1 o C/LȪ,s]hQĉ_z;g }?FMPe&Tnb΄@k_:?) uLc=m!Xxg@N � � �N՚R2 Ԯ8=lݴiS\r c Bh}\LOگ}Jz?<hڵcd}k[t`׽m֯گ}nX"v臾,Xz?16}*VIyO /t% ղy~}]sLqW^8L>]w0P['TT)Q1 � � � � � � � � @ Ѫ? ԩӥb̃@�T M1O1LH@�Jb/ǎn(&KLpWX39~1!XVi &&.}6lҥK8od\ @ܹs{ꋻ 3L~ay뭷 -yv v˖-m&g I1MyMJ>$:zx}EܹSL00T1b0^Vz`C 3Qv!& -Gϵ~̀ƸUI9_> 6mȸqd׮]b! :MhX%Fz\f^,�>1!M_#q2a~b6 8+ח_|QL@m ÕsΉ �Ƅw  R F[-Cw_}hfzEۙAbB}e_Q� � � @J Rԋ@lki@dyZne2vXgtq}@ Rgìb5_=6+mG h'bDsUφ&q| AHb&AY/Uq'GiҤW=/aW2i$oxb#ؾYw~ѣ<]+ � � � � � � � � @ F' �!P@ Μ9c|2g;sҡCSNpnotv9x˚п駟.["SLriU>S8}6(+#\&pi ׄWN>=Icg7rϞ=>2QG4'N??0PsC!^SpZr 4|Ww)ؒTɿ1:q68V:t24gR@�@�@�R�s$дHbxNJm{|=|wkSO=}�O}D=�OE7Ӿ%}ɓ%&&>J/}MFI"pB;whCn&[EܸꫢW � � � � � � � � @xĄG3h � �@ƌ[nv^v|6ޒ… i@af$[l|(ݶ9r?R2};vΛoY*T3w~:6ה<xp.<$o59s$Ȩ+ƍS 7iD(:ualFҳgOVs,6Do_zJdA�@�@�@�R@ "&)2Ç`:}0И1c䣏> @k"H3{}Ehأ1j}>}z/_^_Ŋ^zҽ{wRL$T;w;6@�@�@�@�@�@�@�@�@�H4y_yv2v @ L̿5^c0m B�(˗A(̟?_4O4o>iذK[DFhc'L O=YƞΝ;o-E w}Ɉ#lHiZ'<҅ݻwˌ3d2m4Y~dɒm۶r-/_ѣ 7ʦMm;SKÞ}Y_VZ8@�@�@�L(;N gI<"_} {<|waA H@@Y믿nJ?.iӦ/&ǥ4H@RfM)W胭tR_^wyE�@�@�@�@�@�@�@�@��At@ xv!�Q#o>2eL<نmٲEt5jHiР*T(j-pi{ʙ3[XÇj{LD4�ŕ+Wܹse2k,.]:; QC[li3f4٭[7eԨQ62"eK bW5H @�@�@�H?6R6SmGǣ{m,tK^"hh5 ;wN &?=z4 D\w.y<[$nիeŊTlYQF۳! � � � � � � � � @L{#�';e4X͛7!3gδaak֬qH"Rn]SԮ]E˗/b#�(ׯE… e6�SïZiܸ ~̑#G2!}JS<xPt"?0dQ@�@�@�P J]F p;9{Vda ~[&L 6zH:v(3g}Ԁ@m&Ç<:r<Ҿ}{Yv}>PQ6mZ}MZ1@�@�@�@�@�@�@�@�@�H (:  �Qb@�P:tH/&6o<Y`޽VUpaQT^]U&UVrILLL(B �^ǎ+Veҥv^lzX|y!׷ӧ*!:?#yge˖K(f̘!ݺu^ǚ̈́� � � @ gG@"$rDuz?O>#F;Cvj<ăz\Gќ8qB~godҤIRdInzJܹ/; 6N:Cj_0!� � � � � � � � �D�A9B@ �bq@ v%-%KY6n(/^ 2J*IʕbŊRB)[d̘1[N @ h 5kdv^ruV{03gn0o͚5mc,Y"`s̑K=*}6 cxZ|eҮ];2dɓ'Y� � � @d YFl"&-z1LH4rHe֬YRX1رoذaCh8N!z?.&hRҬng[h>`iӦɔ)SdJT>P1z8@�@�@�@�@�@�@�@�@�_ARa  <ˡ!�Q"pILb Yj]W *sGҥK'ŋ!ʕϙ@�*6l yڵn:ٻwe0]tv5ljժRti!ٻwoON:GIS%֠Cʋ/h͠VBa � � ��)| <>&1!kD>,n,XPn&;p ={H9e6m˸qDCujٲ -$[lA9b7r_L A�@�@�@�@�@�@�@�@�o :@  < :)"�$i;kxvaۊYT)K,)%J<y$Sk dΝyfсq={؊Ә/\ G˗//*TML6mhE.X@z):C6f͚Qtw(zݎ3F^ux=W_ܹs'_# @�@�@�d0e߃ńC%ST�>~Zd\1|~0_~E~W9s=o}`OͥEv9}a~4/R<(ӧOSʔ)SCr%[mpRI#n@�@�@�@�@�@�@�@�@  Ak@� 0(T� ﷁ7nwvC40q۪,YHblXd/Z)RĆe̘1*@�Kl}vٱclݺ[lwϟU r~[tiZL9sfX 5p…vp / ^{mJ"N>-#FzˆvE^z%LG"� � �VcSM0E7@I&ɓFݠAiܸ_!ENk>?ʕ+֭+-[nA6l(;]QQAY-K4M}kL[;6Yi[+ " \\.^>Y<:ok @� @� @� @� AƻMXG�Z9s g}Ry \;wnm{YB{^z&lR[v~'EӦM_~92gce̙֭[^!%ojQFŷcРA|&N<ѣG\%]dq饗W\3f̈?>=ȐR @�hk"<T4oo|#"xySV^ _ww宻)SvlM;ǎ;o}xO裏VBb|x7:taÆ>S|!T[; @� @� @� @� @jo @ <jjq#@�.`>}zm[V *F!loquˆn뭷Μ@+W_}5^y啥21S7oH:�Ryy䑸}C?JÑqF.]We6뮻.{b-(2O9 @� @@[Vv6w|'ⷿx^S+<Pe^ǎc1dȐaᐞW~P|~OW`-=XlA pExnV,-qjI� @� @� @� @�F@dB�0hŜE� / \Ved͟?۷ 6 zY;^}9ҭ[[ @i{ooX^{^ob&D^y.g-;UW]U}ѵk8`ȏ|#ynk?a„=zt\{qkzhp qDvG @� @�V&?Pi??y3ϴ&* d�SЇ~82/J¦n튲ƀb뭷}zcf͊I&e',r_+_\4x"tذaN;Eߘ @� @� @� @� @ @ <jbp#@�6'r Yu8dW W. q YCQ=zԻܽ{Ȓ!9D- ̝;72ߎ i`r^r<n…ecupk}nam:묳筴 0đ#GCFBfu]Ė./Ɲwzko^x!KG㨣#FD~oL @� @- mw_ۛ~qGZ&@>7n\nʗ>u)[mUlEx`9lBCʾw:uj%JxI1eʔ"1[1?ڻwڐρFAy uJ� @� @� @� @�+ rB�$`QkB�A &eh]BVz-Rj7{%rSA<e}+kV}K\ )PSS3gΌ3fw}7W;S>rYf͚DD R-V_"k׮KȿnK[bѮ]b;YlM;j۟!O<D<Ey⥗^:dwjM.L� @�P@l3)&~o|#Wd5z%O'N >U f`~6$2O}n} ,zoF˥yi3CMV<P| ǜϙ3NOyuѧ UB7: :+( @� @� @� @�h> ϽP4GM" @IrSYW徺{7ַK.kC9*Kus_<G}׹sұcǥÎp g̿W]2hz=s[{ԷaՁyڸN:`ZA<ec [*M T3D,?p]oylUs�q>}=Zg' iM6]v٥deD� @�/?~[ 4/ 5]5 s=W<fPaZ~Ha/ٳgd(nlAQT/WU*6Ϭ%Oٷ}URYz>2d3<Kٵk߸E*S"<3b-b� @� @� @� @�A-^)Dat Ъ2 AZYUo}ա\__nˠ֨ Pr^2,no{uС(-2-Kr{֭d9-/kyQ]2z=m9_ܹsˠXw9[)2 ́r`\`2LݖۻuV&M 'N [Ŝg<yr[7o馑ˁ9ρ}N{9ض >}zd@eotJ0`@JYS80zUVɜ� @�X+M Fvڢ&Ka 86mZlX30_S~!Sw#9/XeY%g_JiNzY%+gJ|].}bm~|]b x㍋ |)ъ UDYw'?q9ÆU_2 @� @� @� @�h =RC4G d @rrW˰zPXAguX*ܪs[zr6 w,mZY)_jHdYˠ{u-s_meHf WWฺ!^-3n<�Ƞ{.o,䘿obγW~'x ,ffm})J~M @� @ @Cg q6 0ٯK{z0^my!*mRڣyR#oeO2 ,G<m̩92'b̘8#Fh̫:7 @� @� @� @�h8 w*g"@� @� daַ͎:*"E4@9@vMr=!@� @� Z*Yv!ZoskWu޽(oyԿ쿚7_w;_zkDx`С_J'?Qɸ4 @� @� @� @� @�f+?skF @� @� @� @� @`e:uZ􉚚 hq-<V!&"; @� @� @� @�h }J @� @� @� @� Am6k$% 暈 "'3""ߏ1cm @� @� @� @� @�U@jwq @� @� @� @�hH2rΜ<s R/"L8昈΋lo~3[J+ԓ� @� @� @� @�Z ~� @� @� @� @�mH iCT;ߏ:5K_O#6mm @� @� @� @� @�M* I]� @� @� @� @�SsEg٘M^7([ߊ"" _x5%@� @� @� @� @�%w��@�IDAT uO!@� @� @� @� @@iQA?'ZkEyfĔ)~ğV1y@� @� @� @� @�U@d:9 @� @� @� @�4@9gNS^յh)]D~Nj/Έm8ᄈ'l)PO @� @� @� @�h [T @� @� @� @�( kjj7Y @;FrJĄ W\1fLĠAG1n@� @� @� @� @�T@dr: @� @� @� @�NASߵ <#;.b؈##z*b"<rѶ"5&@� @� @� @� @� %%u$@� @� @� @� @�BL"@kD|cD&E OF<D @� @� @� @� @�( 8 @� @� @� @�4ΝեIMh9y=qO?1dȢmi"@� @� @� @� @� ! !� @� @� @� @�@N!Y b2#}4#}6bذEcǶf8 @� @� @� @�4AF @� @� @� @�|pcΜ~.g @@Bvآ@nx晈#9&b> @� @� @� @� @`AO @� @� @� @� @@3ж iS%Z. 92bܸ#N:)b,'@� @� @� @� @� r5$ @� @� @� @�4@N Oי m '"x"+#x bm#N=5bԶm @� @� @� @�  Wʑ @� @� @� @� :wn*h*F<deE~{D-i*O� @� @� @� @�M  ]� @� @� @� @�NS'AMJڶ@'1aBO?GDf۶z @� @� @� @�X ȥC� @� @� @� @�-P iWeZ@ǎ1iRw_FlEw̙-Y*N� @� @� @� @�$ `� @� @� @� @�V@AԬk*m[K3ό2%=#2Rz @� @� @� @�,. rqk @� @� @� @� AZ@n@N#:׿X4P @� @� @� @� @ @|>L� @� @� @� @�Ms爚V+!@- lA1iRDvZk[f @� @� @� @�(A @� @� @� @� *:u*nFhEnqEq!B� @� @� @� @�+, rH� @� @� @� @�-A@dKKHm qu1~.DuTĤImC  @� @� @� @� VA; @� @� @� @�h9gN+mf *v-ӟ"ƍ803"Oo @� @� @� @�X �M� @� @� @� @�-K kjZVՖ�)pcFg7VnĬYmC  @� @� @� @� VA; @� l^}ոKC /Yo7<nfU/!@� @� @�yՃ 8묳bmY%|… c>ɯmO@U#N=5bҤώ" ʈW.(N<ĥ7ߌ=3ޥc @� @� @� @�|0Aϧ  @� @* ͜x㍸k̜9s|gbԩs @� @�h):\d>ƯxꩧUs,Xcǎ1cD.4@]?g׮_@#">#* :qw,Zs=1~c @� @� @� @�|0Aϧ  @� @* ;O_4/AgRO� @� @�L`e 3Tp̟?'n4ԉڷo&M*ڵ5/}սEcE~ľF~Ȇ[޽W^K=UiY,v @� @� @� @� @ AWA @� @Nw\<slfm\^ @� @� @^ 3]Kl<so k{묳Nm=-h(W %ٰ~o=:b䈁#`b-O>K=I׮]c 7\1K @� @� @� @� BV( @� @�+,pǕW^&L(GxqGCPL>=nx饗b馛ꫯ_~9N88۟+İasΉݻǼy"?_2~E]ƍ;/.X`At1ĝwwuWq5\3oG~O/{Gaن*2 N+.|0^{۷o\xᅵu|W?q3&u'|r� @� @�4@55gώ'g͚;CkիJ@?tMk/[b-|;F_3 ֻ+K.uATWM{9 ԧg==3:문;g:t7EP_ڗL]wu1rJ0[E=1bDqeկ8?ڌ]m~}-*Vg>/[? ߻rߤo~={bscc  @� @� @� @� @a5i� @�H>Ď;X2nq1QGU�epb8|8餓R/C<bPh-fb)_ec2~(webj}<#"|E{Ql җov-ϓ!9e=s?~WZN|k.FzjW*w3<[gMV j>`  @� @� @:u9y睋pϭ{)|aŀ QoxNJ|I)R{YokF=_Ĕ2T3ΈxFKw/<yrw}_Oxws\{q .,> 㩧'|طG:21'MJc1thrc9x-2X9ѣGjN� @� @� @� @� , A� @�ڦ[oRiE '9X4n{ȑ#׿ulF;H[lE13S>7n\\|}XZF3fLmdc0�ԙۮ"2ϕGL=P <6C(Zc5jy{1`k׮qqYY@<G#Fw߽:hg?b{!}kX @� @� @�-AS|xo}l=տ[sȗ-u-y/zt饗W_]8}g+(N;?_g4T>kN1a„>}z/31{o=;y|ySJB\.]΋lWN˪}ܬ Zt[w{?*oQy\T #*ƬtSf_`9s9_"?ܤV @� @� @� @�G]Y  @� @@?JOٳgǮX<b[l{*; 4s9^x_y18Ë9 4ovqL^?<yL�]gucgy&+E]ss̉ya׹sNUF v>W F__}\{?_/C(D� @� @�Bϋ^ul&JRM{WZ1iҤ"$^37x}>+L|f/UʐM7ݴ(y w w,|�| ԡ3O^Cƍ7X]q+TW@U[GTec#.s#f\[x\Κ @� @� @� @� @iA6 @� @@i=,V'NX96<C… SO=U:>QQ]'O>8v;epcN/[?(9z@lq`?οկb7K.$_|.)~=XQܗ\M @� @� @)~{r2j_T^3.j\;W>~n_~vYė̾O>я~49QAe_K裏O}SarYfyf{, _M.'*I7vlD6Cy  @� @� @� @� @ ,L\k^ @� @ }݋նwFmTZ];YwzgnZb}ذa1|Xٳgǵ^;v,Wd@c]w<;>'|rvm顇Z^+Kl� @� @�4…5Ӯ/BL:uK~UI?3|S K/㤓N'|2.ܹsNսʼyȫ:]rKy䑞ׅZwU__Ep@ıF_T~O @� @� @� @� @@s\z @� @@뮻?\żL:gΜŎ[ʐ!CC?ZƗruTsL|+_M6$;참曋ɏ~|NuYUW]/cq 7D~b׎#Gc=V{ܟW{m @� @� @@c ̛73Xc=_s5|EHSC<?o߾xg*}ّ7q1mڴ8'(twƺIu_ "Jޢ L @� @� @� @� t ڕ @� @ |#)Su]Wڛn)6`8smz*F ?| /Pl+g[nq_|q~qqW_}g2�{S94߮ _!Aك>8g{DNߊOwyEkb-bűA� @� @�[qJqE/IkN:5&L_Wܖ.\XWU<}n"ė> >c=uY'=جbSٟ'1뭷^.9N/FצW_OA<`T~"~"r_K.$zw~= @� @� @� @� Р+ 5G\t#l3:4WDNW  @�P曟<H1{^L4)xGcѧO9o1c7\)WR,X_m9(5 wߢ_9/A.k׮1lذZٱcx饗xž iz?.S~?id|͢^oV㎑~ɓ#~c3<{]Ȳ;#n8蠃ϯ Xڜ� @� @@*oFP .q7W\qE|ĉ}HyDկ{~ߋpȇz(>gߊmC9$>я.x$ _Bk/[;vlqZk1׾K}ž ̾|_NyOEr[>:thw}p+#y-ċ/\pAlf}vvUSĩF!_F"K27OD� @� @� @� @�/FM 2GL4S|wZho3AE�X3?Q�l믿ƍ+Zfb)fc߾}]vuw/s=O?] Pr-k.CU;yXs5 f́lAQ/f͛/30!& @� @�mA@l[Rz2z1wgǏw}7vaƘm;Wv>3gΌݻ/*gώ.] Y߳ZVV@ⷦ*ﳋ}.*/8ENujwX @� @� @� @� @�F(NJ�+`Q7jF�lZvkԞ� @� @�U*j>CqYg̘Xsg%_U-.hnsΗc ό/4>+r @� @� @� @� Pt@� @�4QGp'kegѣG\z饭UC� @� @�Q`֬wb#o i5-)o}+f%w_-ޛF}"jjnw޹)9dP1dHD׮;xq)ԿV @� @� @� @�XeAL @� @}SY9  @� @� @�"0e{",h~TE vW4 g?ݻWBrkJģF|sfwT� @� @� @� @�* Y"@� @�&z]+׻&I/b @� @� @@o|1"#YV WmFD39%=;{ߋ/cLj.<xl @� @� @� @� @�hs: @� @� @� @� Z:uZt9sVk5\�^K1c":wi~5""M @� @� @� @� x ֙  @� @� @� @� @`5A55.I�(GďEl}2 @� @� @� @�Z rT� @� @� @� @�VL@99�kqO>1p`~E|oY}e @� @� @� @�hA  @� @� @� @� l:w^TfS%!@@;"F5*b( @� @� @� @�Z pT� @� @� @� @�V\SE \q3G @'?1~|āF~xqEzݣ @� @� @� @� @\5!@� @� @� @� @�f+ #@ qFEmq-K� @� @� @� @�f( U"@� @� @� @� @�U( Ys$/pAE|cdGG- @� @� @� @� @ tXM� @�V/0f̢nZ|{.6k @� @� @@ A55{g'\_5;Ѻѽ{eEuTiE ӟFydn @� @� @� @� @1A6s @� @@1#"fZ$rqk @� @� @:w^tA-E@Usm1n\ǢP㎋O"]m_+  @� @� @� @� $A� @�ڒZkEvXDxBz2 @� @� @�M+ЩӢ lZwW[}V}[rn\1jTGl}ĭU &@� @� @� @� @ \y3 @� @�q-"tв� @� @�hx2rΜ?3hiq"#bĈ/|!Zw� @� @� @� @� ! !� @�ڜ@bm1⨣":w^1 @� @� @�#Ю_ƵoQS8wVQ@Us+mN?D\uU~1thk% @� @� @� @�VU@ @�i z<昈7͝q� @� @�h NA6k4W^՚{lرo1~[n @� @� @� @�,[@}%@� @�KȠ |oZ}= @� @� @�M!й Ȧpv%yݏX޽#n9G?8xٶ( @� @� @� @�X eK� @�*z\rwǎ'^ @� @� D: l"jiFhU"z(w# 8 @� @� @� @� @H: V  @� @ FI'Edc4wnqUoL� @� @�4 Ȧw 9u( xE}zɋ! @� @� @� @�h v @�9`)>}"v޹ze @� @� @2rΜXV=Pt_"F2$o� @� @� @� @�mU@d[M� @� "0lX替#N>uK @� @� @ ȚsmW%:_N}^Gѿ^{E|K;v @� @� @� @� Am>k% @�4>ѡâ ̝q챍x1&@� @� @�VHsgA+V)Uߨ6=:ߎW"=47Z|4� @� @� @� @�$ r|� @�/-Zvۈ{% @� @� @`t$rȻjs:'_rwD<XСWߑ @� @� @� @� @u lW @� @ :b]䓛.A� @� @�,W@rЊ_JcD ^pa+if @� @� @� @� @`:1!@� @�E&̙g.\ϝ;7rry2`(-/:*Kb9ϩ]+<!3ވ5X؞\n׮]Qڷor-:tXj)wbرczܖΝ;ז.].� @� @�F t-4@[e֬YjKu?WUy<*ra-eVn/rߪzN}Tz9Syu)eSSUI˹}5׬-Wyn׏_@~wqˆ� @� @� @� @�_@CZH� @�e3gΌw}7f̘Q;mY{b^rs0\WZ[䠱2qYA21?W=9U^tӻw.]W& ;. z9o�˺۪/+;eˁxՃ𖶼ZkE]˹kGnjy� @� @�4@AVL~~(Nߕ+eX}+V&>2P:d\}ٟ^;wKߪnd^Rܖ+۷+r^U;eS}{Gg7f-;=8舝vڈ!CuU� @� @� @� @�X@&t @�, n|뭷7,湜%`׷\>s@Ҧ\r_xkwy9K.r[zrW4fLH|`dWYr�^lr^R\7X" s,m9Hz:S伾rཥN� @� @�Kt-\N+ٞzkEɾoaٯRߔ}Nu#bM7],}\<圗}_9~gcSLMUIQSeSrk}y7ӵ yޯ[oy-oEY~4=o}G8昈\#N>F  @� @� @� @� |/ _G @� @J @rP[s@[Yr[\m[J堨2 ˁP}-L倷2ȯy9�.0%ׄ i‹s*gwn9P/e)CyW_}5~BHs}/sdMf(dΫ.9@\,={,L @� @� *y{ [mϗ]eߴibr˒2LT6fA+dׯ_1/C\.?ao֚*_䖎5-\xqYA/+>s^<CA<s˹SmACfӆnX[6hŖewyL[vk }zkĹF|S<G奀q5$@� @� @� @� @z]� @�3gά̖زTpAmWnˁpSJ+rzo}=U2P/ ʫ*Bb`_K 8Ȅ jOs kB,e8d9h/˹dY!@� @� @@K J| /_,/rT|YS|}aex_90BS�ɲ&RC*\<couĉqwT=e_RBy^bM7-JrKV^.'1n\@Ε?O @� @� @� @� @9 lwG @�hov1^Zl [\ )u9n-fW Z XWJnf+Վe`juxj ,VgϞ]{v2|D� @� @�W �5ʶ{ԩS[bdͫmeeX^|/6p'gD! 7|N/iӦ9^~'bžu_)<ek8"b#;,bn:cm%@� @� @� @� @@K: @� lf̘`}|_,rҥK2`n1bĈb=%̕jV\ EyP ,acǎ-M>=,XP2r^T-rC^V8� @� @�!A55qy|N>iҤL2%3K|yY>+ӧOl6qecYgps^cǎKEa˚e=~ⲯ8QKnb{ʖ[n[lE1ׯ_ʋ�+؃E<PGGG/Z^}� @� @� @� @�-E@AKSI� @jx"e)=1uboQ[=z2-^E0\ 3 мriGΟ?,U?>n"uΜ9E۵kW ۷r@_Vo߾ya  @� @�Z@΂ WvΞ=;&N;K.g�|RN* epСC#7߼>[oe/xB _$Voذa)^z饢9˾ 5jT9e[o]aen[{k)Rn)⬳"=6*f[iv @� @� @� @� КA滫m @�3k9dijѳgAm#F(ʀg�+9.mh{Wjb?7s;v,~GW ʲ@<F @� @�@%0jjV6vؼy⩧c֖'|x`u=0 w8b*J>}"_d"@`)CY{%N0k֬'O.s?ϵ}]v-߾KZVя/, .]Zk� @� @� @� @� F%`ѫG$\�'s h||NydI  @@x饗bK21lf[alΖal9-kvn 2O^ ˰,@ }WFddl[Vt֭e4T-  @� @�mP@lܬ=7⦛"}YW+/(z+֖3dv9f4hPd\> }h>NL0q%_L)CưaÊG|Q트ᆈ6j>HM @� @� @� @� 2 WF˱h  \�3vx'j9.>`rvmW f+3SN= X;'N,ᵹrsӧOl;sPuW� @� cWʑB"F?j/x#`ݻw 2 |̗h3f̈ 1c%}ڵk뮻.RkjSOErHļyG/ lmR @� @� @� @�ڞ ȶwϵ�6.`Q|B^{-~xGG{,y晢kv 46(mEo %4�,wLR `26"s_oСCcwv);wn,F� @�hvc-Q6.F\~yT^z!f͚U=u]%gΜzÇזaÆlz!�.\O?tїCO kb.h?��@�IDATǴF6zġFq @� @� @� @�yAmO��mMvǵ�K`޼yE[ b{jC31ev!b9`u5!@1̙SC3P<{رc[뮻F=أ]l87 @� @ m.0⢋"Nmn5[ˁ%izkQ21߆ R<}݋yA P-`e=SEd믿~~G>՟4{vĉ'Fx㎫ne @� @� @� @�4oA\'uBhD";;SXp^;[.&l҈5qjSOŃ>Xn ԗr}٧7`05%@� @��-&b~7[v|=ztn)f̘;S|C*Jk׮-jOjx饗o- ٿ8CC=3:tZ궢dgG^ėt @� @� @� @�V hr  @`%&NFo9^ze{W@AEvV'@@9sf yw{oڻwcĈEYwu. @� @�@@l :䒈sύx<iJ꫋oqxqAG>Xgu&.C@[xg ۢSNqa1S4P җ"_#~Èe& @� @� @� @�4gAAF@uJ@ .xv 7ĤI{'ob뭷@aX\`ܹE0[ [=#>},!k @� @�\"hR/_6cF^v/6o޼_]vYr-ѯ_y'>6l*  *g.~2o,^xƩ^S6gF8Ĉ<+dt @� @� @� @� UALZ}SkF &o~SNabw:fkoY A|F~->2R裏=z4z @� @ mnwD}ںUWE˿D4oӧE]T@fM?8餓bvhW;ڌ@dlѕp+}8c]/ iʻ([6s4� @� @� @� @�&ЮWu  @�h͋?{Ƕn\sMp Oĉ .( Uچᗜ"*Y (L`Tt qߴuaQ(AAA [=ÄaBwSUVuuu9wu.y+/2MG�V||ōǣGVÆ u׫nݺ8p曤F�@�@�@�@�+Pv_u饗Ԕ)SOʶ=@&UaO2eʨO>z→o߾[}=sۥ4yZU<F�@�@�@�@�@�@�@�@� 2-D�@�@ vvÆ Sƍտկ__~.\{G-[L>AN8A={,6'MoY[ֲe 6mK/,.fΜnM~.tuשyn,(*/,j^ziȐ!ٴB>aiz_|#P׮]`@@�@�@�@�@ ʕ!|6ok?M6_hĉ:UT/Ğ{9y智$Hzʕ+OڑHܞjUwyN9裏@J^\.ZH2Q&WZԩڵRǎҥ2ځ� � � � � � � � �O Y� � � 0n8hB7p=\-YD:w%Jiii={[zaO;D ̴@Yfiք 6h;v֭[= 67o7A6-^X/~~٭'mϧzn+Vpjɯ&q۶T{_WTIԴi@d{ܩS'?_~@�@�@�@�@�"([6rD <yZj &G6mOv'-mM.%%7;YƇZI slg^b5kƌzWuM7S޽m۶^Z$Yp9眣s[ne]kHvajPgRRrDhm@�@�@�@�@�@�@�@�@�'@,XC�@�@�|@K.D={ԉ'~IC Q:u,(? Ē% PʕE];xg֭Aye m0`Znn[V>cyl[RAnm۶U!̔@V_)kwO; j>Z#G􁐿;0?q@�@�@�@�@�H ȧzJݻwץ^ӧ]v{{}QȎ<H]{ֿ<p^5ƙuf͚//GϕW `%U5|=êZ뮻4~xGN}aufkΝ;uG-&B{_.tWrpWsa"6 � � � � � � � � �O1A@�@�R^`ӦM֭F'A)jJ~ *UiK.]h\m'Xpɒ%:e:W'ǫ ˂8G*3|N[w^9uQ> oANx@�@�@�@�H]0ݿȧ_4j(p J틺FBgрz,vKEU΅:\b\w}W*UR&MV!} xկ_?uI?CB4Z5iJ]HӦ%Dh � � � � � � � � K@�@�tR7bׯ޺u|WoF[ҳ8>{=}W,N:2dKw |'>Dz۶m 3/;_VtWnݺڵKvo`:tbնm[x㍲sb =հaCs=oh"7yk޽{ꫯN.SfzK=^z%}Gj&1/'>۟*뜗6e+kkĈeK/Ի}ݧSL2:S%Jwc^|E/_=zkg{Nc׻O>:餓;>|w?tgk׮їEs6`ӧ`ڵuUWFdD=gfΜ7xÿ: Zxz꥿3mH&+Y@sxE{aʕoUʕ5`�{-'iA79眣FE?;/ڎ� � � � �%AQ߱zE۪ϞY믿;k^r~iv?`A>4s=ׇك~;9X-o>3]&={ڰaCx5|;M_3R7JO^pΕ]8~Yg}V<q͙3י6dukKY}jkV;{ڵkguҤIZ`<H_fVZg_~-[//-ZbŊzjըQ#n>VCzDO;4}wѾY܉]}nj)W[?([Ĺ@�@�@�@�@�@�@�@�@�'m/lfB�H\m-C�H~7 &j|I78%߿|v7ok޼yn>nPRm.$1j./pat~l28YfSL 4hTZկ/<~W鮻 &LozAΝy�.`1زeKxs?WǏf7PosG ,[,p~  &N̞={m@A SNqJ~)zZy'7*xL~m<97mˎ5<Qݯ?o8އnZ0o޼5~fw?8p5{uցT^=XjU'xbrEϊ >3?ޟfS< tS6m~z`fcǶ  \آnf駟.oVZ` [-7P/څ>ٹPQy{d] 6,pA_7`1zd_k8 =&@�@�@�@ P-�h~,Nbmn}ꩧm#rqjds w?>BF? n:hFE ̋(;b?K.gSɩU!?j綾Z=C h5LZ\9!;Yv9|[Vq!qY9t1z]] k2v7@ 4i0|nɬidﹰ~6Y ,Ӛ5kZm0&wY `DjmA�@�@�@�@�@�@�@�@�(5& ϒ#!�%& Ȃ �^[n ,001 OmbԮ] nAw6 G`ȑ  'f,Yn >:`<AK.ݺu lT8Yz~p ؝ pp= QF67m'À<;W8YHpB<iǏ03 Ȭ⹆vB˗_~?rCF mad< C{ G{|饗5k!vl{[(c�o= }'x?>hm|ᇣ c=6`�_0H{q؀:˂H3d) vϳ?c!]tQtd_A'3bB�@�@�@�zlqH9E, C>|x6"gX#lM6#ڍl[썣FiE 2�}<]@Gi AڶxYkrع2aPneSO=:sC<ٵyG}{h} ^{=Dٳgt=`\rfhNOƍÇ:d7:Z=֭[ofs>KW m{Y=]>ZG{@�@�@�@�@�@�@�@�@8 v4Ƅ� � � dz*T܀sz\Ȝ\x5:tP֭ Bt qo! DӱcGr4gm6\c>)S& Ԓdݶyf5jHׯn+c8va㏵qFU\9,v]W2n>ԦMpbzF{ァm۶裏Nw87M'OD(7(I\tAV^\CӧOL>]Æ gt~PӦM-q4zy\�%ze< FKw'bW_^zEp{D!&\?F˖-j֬_oժUt[Ϡ}Yg_|FVqcں}FUF9ϥ߃˄� � � � � P0eFJ+LyX# &׏n1VX=C~ȪT_Iow=}Ńΐ]=+zMN5u^an+>yºi}Ն>`_sz]wݥ^{-Kc=BGݔO/Z]1.?A<>dY{:fYF&]ƶ8wJՠjR߾Kgc7 � � � � � � � � A"@�@�@� <XӦM#d/S#+B\ry]~!x6 vKK.:J|,X. -8"-/~`3fdimbp TNbu ϴh֭^=^p}8-< Lܳ2YXxaY7b,ڷo{QFi>4}<Kƾ}>^Щ[�= qgs6UV-=Pfa`Ν;cwcaÆ~[Vx�nM^{mJg)Q:� � � � �I'A{xԹsg}袋q򌵄Q# f͚k7a b[ϊ^]'uklϹC'USVgs=WO?|'?)XcXvmyw\scݴ.|]~փg3g\h?U.]mNkjʔ)2D>{+Wn-M � � � � � � � � 9r � �@Ntg4K.-s'?|UZ0$D ó_UK,I8?om�;vo߾+V 6AY^7p T345i$S{VZ6(v=vZ:5h .j6}ڞ͈x3r׮]z?P˸[m@M_D3ǁa޼yYu}_klꫯ2?[lc7%[oGyD?`ߤF�@�@�@�@� zoѣ3}U'\Cx =cZ^bYk6/cݡfׇx9OGnwo^h7;|=vCp5riƍؾa}+?\zo0fvA1 NW^ H[%)^}5Q[J@�@�@�@�@�@�@�@�@ UL+K@�@�(B +_T3y"lIџ 8P. i?4c UP!|] O~Ќ F)<)pw}}\+�`̶eծ'z.y~QGenO{y:޼(k8tP5?6ovիիk֭ F,PӦxw?W\q-[?k,I&i͚5禖-[/6mq뭷ta26}&q+~0Zƌ ەgv}BFi}%Μ93zH/ݖl+և!C;L~^@�@�@�@�Hmr"+ HK<>n„ gnDKhSzo-ٍ)?3.cYkXwȯnϹC'v0Sڵ+g5e}]٭[7_w[=.YkFV;?&yk}# Lmp_rԮ~Gdh@�@�@�@�@�@�@�@� G q, � �+ >裏d}]te]+W& |cC, Ϧ`K,V^6 G>h.nˇz?k۶m);u7Zj~۪Uwm7N^zt%rzwԽ{w 6L_~Ph s3~kn[bEPK.~[[<fY7m~k6BE7o.(v^jZ '3YnF)79<FV)\~-㹆 D M|uM7}9rde gϞ{clpi< NroIڢE UZ5v,/Bk{w:ÿ.τ ?{ggڵ~?|I4҂/_,զ=Zfmh{9-\PW]uܹNر>`o>lNR-Oc9AZ-ܒT � � � � P|:׿zx zDkdM2i`!w;3wyx~~ZoO=FH65Ja0<VvΔ]&'cj Q ([ԇx9OXXv3Fgox;ο4qXOzej |! 5WZd7~sh0ٵӧIYflF t_5L � � � � � � � � @| @�W@.7} @ Ǝ4i$pᐁ \x[t @8_hG0`СA ֭[.-pcttጁ K-|j ڴiA<AƍнC.</(W?G�nEx~<9-�E_ߩS''x"W7(4hPPdI?vnsAzۃVZ4hQnW~?ߎityTSs9Z0 8sj|xyY5$^/]> o2e. 4믃:{ v.[֮];p!\pp囘y7K*7puw^PJOۅSNͪۙnw!gm-v3a`}oٲe0z`Ȑ!m�.״i +iذav5j܀N߄>dvn/;k 700p={ξ/lb/I/=N;-H&@�@�@�@�'/Ix@ >ᄙ&Mn׮:aӐjdSAVfۻ%%լvf8o ΝX˶Y/'=ņ+V糺} ݘeԳTseVw۾ZjfXRn.nc=fϱ.Sq<V+Z]kk՜f7}XO>ccSFck]c{pGxLkUZhE[{Fnkn<Ln$X ݀ڲ' p%RWk#z@�@�@�@�@�@�@�@�@ g#|:+r7̗q@�(QB~ @�,v)7Kw\\\\Р\(ZJk֬QjղȤyiƍr^ 󸐻,ϗEn ܀AyrQ2֫W/@?q!yrx_zj͙3G.RnPU/,=sy D-pcNml&hc9 w<~KL˅|ʅMʅ,>+W.2g"]@U]ve; x73qNn. tKM6i…jԨ\0g͛[oiذar:jաCDn6mC�@�@�@�LzlsbkIg.z=%; =,v Ff:X]ϖVpAQԳrSɬS"|X\!'kfNkWeN~+cffa(jփ\v-zD]1W#YȮ=Y'jh׵}?K*ן8^. � � � � � � � � @#/C�UGzh7 6wO<>9sղed{wml0ĉݧ -_|M+VP=r< 駟/? bӓ^믿^/)6',ʦ$m 4b?8]uUj۶m¶!� � � � @=6m@ yFoOGvS' >ۧO*U*mZNvu;25hٙ>gÇ,j^z\~ɼ]\Хtiڎ� � � � � � � � �,P:G@�@�@ J.C-q~P/{WM4ѩ޽{c˔={Tͳ=` }\z?oGn)&w9mۖ~dp#k.Θľ~{u4~x3f֯_ᅨxs9Zju!� � � � @(WNڱ#1Z^= 6Lwuq]~~>տj*1DZNlv %}MehL25h=;V/F忟,HXv?mp7NN9%@�@�@�@�@�@�@�@�@�|()_rY#f~ �@}OGx �MI2}t;9r~G`O<Qݺu 'M*)vޭ.HvڥmꪫҀ42yƍkZ :tQ[jKM0A}M wN?tq_~O+@�@�@�@�b*@=^xj-J]: >\~5j=3}${-זe-`7w}Ldɒ>/V֭~a<c]=hH]H � � � � � � � �$�A s)h P8 <*g΂� w h̘1?~&O-[nݺܹ:v:EA&L#nݺt)_lfB ?lͱSժUc͛})Sgiԩ'tlVZ1@�@�@�@02@ wgPxtչ{]QzjY:ut'G.TRM,v秞U.y?cO>Qٲeuꩧ�H)]trIKF3:u*Vݧ � � � � � � � � PA00G�MGvEh @v;vдi駟jҤI~݂!+W裏svgw(C�ݻ?GyΜ9]ɍPp.]yƅ"� � � �!@=098`"a{evZmڴIVym>Tbi0-A�}=B'N~IM4Q^Իwo ”͸@�@�@�@�@�@�@�@�@� 77^�$�p@�'k.͜9S6>}~goSNmVGq_jJ}%@�ؾ}{}o_モ)SF]@`^dB�@�@�@�(8gˑȫ@fҟ,zk^X|W0a>#_3 @~=X i˺u&Vi @ZZΝS--F:ԭ[7uڕzR&WjNO_ϤCd'6!� � � � � � � � � 2`�$� ~@�VҌ3|ټxb>;lR-Zp2F2!�$`{m >Ι3Gfٳ`se˖q6q۵k֭[\rMڊ� � � �$�ؤt rti]w`\n ?sd'O7oA۷W8 j֬ EZdž5u~8ԱcG?wט{lpaI'ݬR2E:=va � � � � � � � � + s @ 0(!=@�Y`> B°4 N6UVBZ(M6U&M԰aC(<|͛7cm[Yf*SL4"� � � �-@=6n*vD}sԵt}v"=<bӧOߛT^=6mfq*UT# lڴLj~m}ƍX,裏QGg51MKiÆH$̛#B�@�@�@�@�@�@�@�@��A@�b&bv. @:~-e˖lہC!-QF>J*;@�XB?~g\p, W\YtiwOX\r^Nk@�@�@�@� Azl! s r)prhC)͛woV++WN͛7a-ZߥɸQ JJlpV|𣅾Ν;W/Vv#1 ~ g<,Y2%(r^ǎr7&MQ&Jh � � � � � � � �$�Avh/  <K@^� 7nY[f-- ׮]BtA>0B#4hmYJS  [|,Y_~%2 6�Z>;[A2!� � � �$�^x\ţr׮]>Ln (--FݰaC5kLM6a7nX6ׯ_`x\ lݺ5z#m6h+VC=TزeK?׫W/gc ,]*u 4a>y=C�@�@�@�@�@�@�@�@�,@dq�e �{!e?n,mp5kD^jU?|enݺVZtV@ vޭ+V_oniۗQ_۷o+YsZ gn(UTr!Z@�@�@�@�lfÓ@r7yHNt'ݶmqڼydlްaOrdyg6 ժWt՛~w_stlh?ٍl:Sڼysr!~T H;ʅpJGK @�@�@�@�@�@�@�@�ȕ@\ � � @1XZh̺iӦh(%K| αA:'Oulp*_LOkVAtL P6p/_m�n}|lp]͚56k׮>1 ~ҥ g@�@�@�@�@�([Vڱ#y&ղZj%-\0z3gw񿯇WT){yvpRJ;KRFdblҶڵHhVk:SԨQ#5iD7}WiSixKsߖ \⶗!� � � � � � � � @ Fxׄ!� � @ >EZW֯__U,1\oرcl2m޼9]w_ ijٺ-ckԨ@tz<(6nݺuZjUt^reu{?r۶mQ. x^z֖-[{R%5  � � � � v- lСܲe/^of7O;[Ο?_~wbMԩ]Z~(J;wKVӵn&<v7,1 Cݻb\)C\i#%wmAOnh@�@�@�@�@�@�@�@�(" "� � @@G[hm7m [|yt݂lGbف-lzZlV_mY|lƓƍ}:]6>^fyJK['t͵AvTm  q2eҽ � � � � �+P,Aq*VC=ϙ~ ¥<k,\zOTtis02\7M¥΄@6VX,\ -V;Y-BKVZOVz|-m1S wR>Rݺҽ~! � � � � � � � ��AQ@�@�@�g}dsÆ :$dPuDgbv޽-D"URϱW\a;pJ(Qbs!}e9-1zmÆ Ù۶ާ L-sVZߝ \Krtti:J.A֣w � � � � @ ~f*b%Kjsvl#-[旱a|͛q֭[8 nfc׭`ufYfL+`AV՚2bŬNjuT[;蠽7@Q mڴ:tXBjcQQ݃XoCz @//t@�@�@�@�@�@c��@�IDAT�@�@� 2N(vC�@�@�M ֨Q\5Eb`%KTa-3T6=UXQ6Ȯ|JKMm*TK`g23>eʔQY73vY]l%em2]׌mt7ou;fV C&j0`VZp8\`j5jZTҚ0>}Vnt RnR׮Aej#� � � � �AfM~Yͧ^z~3VXji-ņٶEXMֆؚ7D k`Vc\a-,w.K*OjMY(\)?eU7Ů[=*cV Vl2߰j0 ~BA-f ~ Ki33e[J!]yTt=@�@�@�@�@�@�@�@�@x kk@�@�(5iсW6�+tX[c4ҧtԳ*Yw(h,7 &c`8� bx[olsi6Pg7 ;-mL5\'p/ifhˬ]v3np6 q9{LgDq٠ƌ3>H[= #mf͒ pH{RƑ@ݥO ,Vq|@�@�@�@�@� @j 4sndqCZ8me:l,Tr;Ul`5=k5V#Vٚa4V gka+geu֭l([u0юd}]Ì0dv>3of ~1!P7,t:ʳ;ek87 � � � � � � � �$�A~h � � 6,Tۼ%K*TnQJF[cw{ 7oަn(g-⋻*Lf@̖ᶌq@F{Mmq֑%ǺvTV&}bن6 /ezvs6H. ezɒetg0ĿF]GXhIevu|urE:5 it1I'E#kj@�@�@�@�@'FXۄՋ}j֭>BΝK^ZS+VcZk\a˖zYbX*jXa*:c۬[ʸ֧2 mᔱa`է;ne) Tx1i2OiET%}B�@�@�@�@�@�@�@�@�HP � � �3G~פuAJru=v޲>{M_nobɂ0x„j\ҫJW\QM3fTK/I'T 1n졺t+^-)wO>)rJk֔wBڲNo'@�@�@�@�@�(nĄ@a7;v_ws3C?4hU �vCW^O>Y )f4@�@�@�@�@�@�@�@�K � � �y2E[jƮ}ҢEW}䯿J:H/}@歍4$tyRұJw-ޝ--6ը!soIfI7(-_.]rI$ån>TڹpY@�@�@�@�@�_ 7Y XWH+]f5 ޟg@ 5ʕFV, r'B�@�@�@�@�@�@�@�@�HЈF�@�@�(8 >@:8cȠbAKKΕ9&riӤm} ,Uϒ׫'}RN?xʖ-n&L֬=bԥTԷo$8rٲT9}A�@�@�@�@�R_ oO~â^~YzMG%{1!@ȱc SOm+@�@�@�@�@�@�@�@� 2kA�@�@�عSzEBlJgISH{K%Jv #Ƕ�d,d+ۮWK_}%m(i#R2^+Vz{Li"{͛/֕8BvBJ3!� � � � �$ؑe!Y=m _@�ZqҜ9*M@�@�@�@�@�@�@�@�@�P #*fD�@�@�(*ۥ'5.(2m,"ٮ?N:I:ixj<z+ CA^x4`t9,c,ƎVl QGEBQ9Fo?^]Z6#� � � � �$@rA&uH6%xc&jg)}ԤI~!@^=Tz]iHr^� � � � � � � � �*@d^Y� � �mG .2mѢH� 4jԧԷR}=R$W |}HIR6QbEWH0Ҝ9KF kՒ:wOid-G�@�@�@�@�RClY SJ&^/~MEz å ^g|W}h � � � � � � � �$@ET$m@�@�@�R_ {,�yҙgJ�i L}W:H +U`SGMKK Т[7i,E S'% Sfv ҧJVI ,5k&5o 2Ӝ5@�@�@�@�( ƵVO ("r_v$aB�@�@�@�@�@�@�@�@�=� � � n~X:`馛Β~YzQn݂C5J:lK;9M'Y jIvzH^KxWOz%i i$W/,tӦx~ � � � � �{+`A۷Qx='K'(͘!v: @|a}9s{ {!� � � � � � � � @ ז!� � �q l"�[o??�iuu<' ./D<_A!UWIӧG [FaRN,͓nAZ0~YSCzii}@�@�@�@�@�r+`A;vU+WF \z5i}܏- @v='i#)-[V1!� � � � � � � � @ ט"� � � l,=@$�;#^~$_7N&ztҰaz"9X*A@Θ!%-]sgI7nQ2%h*H^+խ+u(=P2# � � � � @+'kW4f$ᑛ>'e7h4$!/Zc8-]*u[X"� � � � � � � � @* W!� � �l$ *tt]HK/ծ `ӂRϞR.ҋ/J%S_iR%"tvy[fMi�wUߎ}԰adϝ[h0 � � � � P eӎ%E v5iq7Rv=#�Wƌ`;OZHMi<"7_#@�@�@�@�@�@�@�@�H5HKB@�@�@�ز+]rId`}INWXߝrԤR҅u=O*ARK_-m&m+~ PA:H҇JG-=taRӦM7I_~g � � � � @ x^uҩJ7, ,Tj~c �RFq"%ٽ[*SFPB�@�@�@�@�@�@�@�@�T 2կ0C�@�@�b/sR=H^ 05 m&ZRWvfҴigH&pkW\ -oԩR>[oIG%ttB&% � � � � ,abڙ3fDne7̚81R)Q"ZF@ 9F]?>R:MV2"� � � � � � � � @* `DE*^&� � �^ԼtYgIE WҘ1Rq9yb [`GBE?^B+=`3;styȑ @ί*sT@�@�@�@�@  ;RW k:Dnf: 7JzIGg~u뤱c3 � � � � � � � � Au � � @:ߗZ:w,yhmМSj$2]SAZ_*OH_~)^-m+}i*6q֦4x7H+!yt.͘8% � � � � @" HW#۲iS7+nY7NU+L@ 9~IjN#̙MKK=3lC�@�@�@�@�@�@�@�@�T 2U$@�@�@�ĉ1H&5k&͙ҠAL&]stREۖ:{H%[Av$u*=@Ar?\2DZPk쳥ߖڷ6n%lC�@�@�@�@�@r^Q{O-:∝H�wO>�'uԫWfve}\{n(i͚@�@�@�@�@�@�@�@�HnbQ#� � �̘!u.pTWpyuntYRn Ȃ=[=- \Yz-iHgJ7}q=s۶}IIЯ+R˖RV,):@�@�@�@�-Y;"+G:aZfΌԴڗ T }teRR׳g@�@�@�@�@�@�@�@�@ yLkG@�@�@�͛'+o/m$M(/qD�]$DgYRu T_f S~1V`ŋɓmK;JO=%ZU- � � � � @b A۷'VhM l* $ (ծ=:]�R_jU'#7{eUgA@�@�@�@�@�@�@�@�(A+O@�@�@ ~EBeKiiHϥOn /H5j$V5A ,92@RH 1-r#`?___i=W^6oQ@�@�@�@�H^0rǎ-1Hc73[?\gyz#"�mR*Rw̙@�@�@�@�@�@�@�@�RCFTƅ � � P<6lnIjL4I~+x.]~׿Jݻ'^Eiiǩ^=idt7>woi⨐x}.SFK@#NO%@Ƅ� � � � �@rW8z-];~Gi*('tR+@�ݠA?KFjα]e� � � � � � � � �'@d]Sz� � �)({SR3HCHK/LoRС)xA2钅%Ȥ|yGC:\i|? ̣@JyIFIjagK]H F٢Ey<8/C�@�@�@�@�XlHLTHMWKg%OԩK#F!+V,p@`O# 0}ԢnBssݘ @�@�@�@�@�@�@�@�RK ABR � � �{#0fԪUd`?.\(Yb2{sԂ}ر[oIO<!UPJ[dҚkǕWJIK:EB5935%N3fD *َå 2{%@�@�@�@�@� 2YA_"[kEjXظq>~qZ�Z}{o'*WԠWx � � � � � � � �$@oC�@�@�YK}$7L9RDmB:,׾4 COR[Jm.|e" v}I~(?ȫ|\tԥ Df@�@�@�@�r'Anߞױw-/խIRfhݻիWmd ȥ;\<viܹS̸>wڵ|%e] fnFݻ4Wپbz`w0t-96g|\dI\T)]2.Kr.eVʕ˗Oma| � � � � � � � �)$@d ]L� � �!ltKmJ'K;&O\Z\zis~Ӹq0LiӤϖ:w^zI: xURy:7#AٰdF&jh � � � � ˞r[Y=Tpi6th$'SNTzORF7nܨM6o޼9y˖-ul01 _ '!{*C9\K^skvҘUch0 2\Z/ad2,cYei2' PBsJqcU\Y6>~iυ>i"� � � � � � � � A G�@�@�I!уJ/U&? 8ȧa֮ ƥ%׵*W=Z*o{/3sZU<w4|CG" z4&@�@�@�@�@ )\vAIq!{3Dnx۷oט1c4xO@ׯ_u.fk]!:\67lzؖ?Z(aV ںZ@5k>hNX|y]=Ben-v mY&9ҙpH[پ9 ش-m.s_҅yU] a8d*U\{_e窺j5KL � � � � � � � �F!b_@�@�@�'7PEfk Yt |<]ǒ%aE${?<ԬY$ ti0ANE0N@KCJ#FDB!O?]o?i@⋥ :;!� � � � �E&ಷ,2?'H'%M&jy>cwie[@ ,qʕ~>׬YBmפ2L?{w?ռqݾооQTDhDD\'Tv\D%%BTڴi(|o_߼ifΜ9}3}jԨ&M,B`๭uf&H&zQuw)@ZC!сCE]p^ᣙA0dŊUR%?σGoUTK0C�@�@�@�@�@�@�@� @>@�@�@ ~}3G8PpZ6V7.[&#sOx`]T,*bc ʧ%fRj@:,iRa%`C6H_dJO?YRG@4@�@�@�@�Z ȸ=V9iwHg!=\\ƫcQ͚53^w@ ];vhNk֬>Z޺u\SD,N::ꨣTB?zя|Uy^$@!יo6UZ5GmPI ҍ7.u~m$B$KawI;-2z:ݙ/S@�@�@�@�@�@�@�@� � ̮! � � HVICJK',}tԂuvZ5iР% tc4(t.M.cvһJkgފKuáiXOÁ_,ժUR � � � � A~tԩHg=cgĉꪫ2_wH2;wjŊZ|VN+WhxvE\g!{Av+WAwXtPI dLS;R-$R)x=|ׯ>ڲ<RJeTS<֨Q, 9X � � � � � � � �] � � �$M~XNR%7=_g{NX,Hdlyܼ4sf8 upQGeo,v~zxZDz4bt)%Hݺ{Z � � � � w}{rϘ!m7:ج[k͚5իW D,qҥ~_l2h6^::WB-t꺻wquh6Y$(V&k.ʾ:k֬H`رʚ5kKWdK(KX@�@�@�@�@�@�@�@ C\V� � �D L* ,-Z$]wt RRK$o5>;qېӚM]nL>LGj^zp``gpdr;acRrAWsj� � � � � `A;v$CK< ]ԥ4nTblo5jHvXl`)D`ݺu?zQdZp}\e;:-ZT5jԈu!gq6Yc {jTZMYX‡FZ_|!{ܺu_MBwB!-^z_4h?+qG�@�@�@�@�@�@�@�r.@d Y � � 5ׄ,~8GoyGz}ɍHbA}-+tiIcJ^Y2> OKO8 ۥ~+ZϺS+@�@�@�@�(%JYM?!M(}w8 2;T]:묂B{D`:b_~Ň?n޼+Xx\ڵ}uNdHBޒ䀡I#Pѥ!Դi laK.kw}ןCl?[u9CQÆ t衇G;.\8m � � � � � � � @AnŒ � � @vx@6L:pXbZEB,|ݏ7kN Q߼$AٗuR͚ҲeR ρ6�wxGc=Vp0 � � � � �y-P8Aym C2Ej>{[3g/^={f,@> B!wL?^? 6p-fl]tQ |=֪UKIA�*W,>ّk֬ . ,З_~^)))~9;yqjҤId]@�@�@�@�@�@�@�@�WT,� � �.0y4xp8Cx~>zJp,R$c%T7M]&-_.=>4}z8򢋤k  � � � � WAlǥ+ڶ^xA:7T5͋݋(ā͛ɂJ?-[UZ5o\Tvm.\8Z@@Ʀ֭[i5|?͝;ׇԎww\hf͚#Th@�@�@�@�@�@�@�@�L߅ � � > ,]* "ԫduӪCTr#J-؂W֬^zI*UjWT%Vlر?UZ � � � � }{7kVK%7oS.�o`,gϞ*TоO!M6i~5kl5+eʔQӦMe8�YRl"�#`6m)z۶mӼy|0Z>+V*V>O-[Mu iqx� � � � � � � �d!@DE@� � �"cd#FHjI| u'w+qK.i1c-+W.qÚ[d"9\IS>񤓤wޑ*THrjդonIzU顇vHi60� � � � �䆀]oJb ̝+{I]{;,pB}_ D FP(>3͘1C3geTC>lhu%4F[C�(Y5k';%%% opwT5jTتU+*ٶm[{F)2@�@�@�@�@�@�@�G ״@�@�HK˖I& f6>reiРF.R7oq~1jw풊9OmHA 8iR8\5+fq)PԿxrc} JCJ^j頃T @�@�@�@�H Y:~ݔL:jL@6_&TԾ}l~Z-htԩ6mO 6BҎvwѣZnTk) @X:tৠ7o7| }u78nٲ_cǎ xD�@�@�@�@�@�@�@�-@DE޽4@�@�R`&Y`]:yYco6n>HG\ƍ/ڶ>Pj([DcpGihGGF:KjyX2 � � � � @Z%;gN l.]yeή%Z^9d ^`z&iZvʖ-Cn:ڢE ߟ  v~LpBk/#?, )&M$;G�@�@�@�@�@�@�@�*Pf!� � �y*չb?^z 4Gnt%R~x!h޼yyj+ߵ+lLը!}T�iD9̩åeoHxR(-y@�@�@�@�H6w?+ h<(i#d}rߟ;!W֌3ԫWҠ(ub<:tA /Ԋ+܍W_}ק񮮻:jՊx܉ FA 3hɒ%Zxq࣪\<oR3gM � � � � � � � A"@�@�@�pw0wo䓥sN#=܀&Lp6l'DMd*PA#裥irJV@%K3/}Ax逸JMHcJ@ � � � � _,rZ6݄Mr3RIwK. /SO:u;=KZn>cx:cjE�[ص5kgĉ]PtիWOr~嗨O@�@�@�@�@�@�@�HL sQk@�@�gPHd?(M"=Tb>W$6{үJ^we5jy=# Ed^ҥߖu On&% lLI۶Ovmۤի&#� � � � @,rǎl}Y`Ni3~3 r&L!@?TիWוW^Zj]j=sӧʖ-X @ ;Eqm5j(9s減ϿvΝ;sr~CA�@�@�@�@�@�@�@�P iT@�@�Wয়vH]&ԩS!czߵ/X@yz[ɓu5Cmk9rߍY^A._\9SO=5[ɢ{yf 6ڵZ^|׺ս{w1B/NL^(VLzEi�wogb+ou~9w>k,Zo[>p'a_.ݐԑݷuO]VcǎѣGMS|!s @�@�@�@�(Q pmo/=r5%gY/d[^\'|;,' &=CM4q3dWZ-aw9Sou뭷E뮻|қ爸UhyX ˯J!mڴ߮]ʖ-[|a?\B ?6O`zw6$oy䑑*|*S~H~饗h*"� � � � � � � @$;f"� � @, vfϖ ȓJ '._4hY! ˫gzgd*T(O6[o=}լYbކ(R$c^p͚5j1.mpqQFᅲ 馛t'̃G@Gym6Oym{,`XuIn x ~tl�O{7v9sƍ&bZUp 1rB"O;Mآܫ JJJ>cغuk0{?ڹ~w{g{Ũ� � � � @; la&6mR(o{=zHwV͛k&VG~Æ KԼys_ߨnΜ9~^ٲelerҧl{sݝǬ"8'7/`]эJo^yvr99rZwyZ$ -\tĉ1‹ƍglܸ1䤍Ji=3<S^zpqFaΝ;7]СbVo{܏{( � � � � � � � @ ;j"� � @ Xۣ ȓ Nq~!AIw5jg̟?7rUxEsyj%Ѡw}wknAEfcY~ਣˋv>\͚5ӺurJM0AŊ'|lÿap [bl@H~#{Frm+ >0ŋgϞ>X'r`ދ/'ru Rr~;ȭ~v'FBc|eeEy ;-XAZ@�@�@�@�Z ȼWvS]7zbě"0B i>|I ԴiSM:Uo[9餓~l!{}.½޼#Lnnv^Lo^ ͦXi=Ze}uvűc{.]bZu#qfIo6_aÆu/\nH^zzG?Fɫ+@�@�@�@�@�@�@�H�FZ'N � � [ʅf ח?骫$r;p6J**_228 ,4,l6I&bz $"*7xR1,r'6KԳ"6 t~/6l\_lٲ>rƌ3gN0;_-ҎEqa|pn$طcnn 8d]U\F׺?DPp@?U ;mnGWu<a  � � � �!`A۷ǖF,W˅aIGK=&=t|rߖv￯^z˒t3z-%']HK)$K[t:|ӛKҥKտ 3y ╍ek}=׬YyvQsN:k^V/;Lv۸ۥ1?OwYZy8'`@H ~~g?Wi6*#� � � � � � � @M6D@�@�@ & 0@ڸQ?^:>4 k:0ܨQ#?!xwǎz5}tڵˇ PVk̙?uGj^z 8m4=ZxZhN,-]V=;)S0èk/W_:#tg褓Nl޷@>L֯_<h+:u۝[mNїoaG��@�IDAT~6m?p5k,/T\{jqA,q,v,Z3a?vb:(]wuݮ('|*U'l]6Yq "?n;H_.Uu-evʣFAM5k¤IK/iժU:suyEbpS.cƌ!G}~'͛ .ǨkN׸V;glڳ>\oxk>֖_l?yKvm#*}# � � � @r X_qO> _/]Z ]]e7NZ|^QY][@~Z'Ov7:H3joƍ7~xߐ̮~aw%7Z^}UǹN Xɬ~~v㬳:KC8Y2?nݺ`ɒ%:SuGiajK/T=z,v;dv_bĈ:ŗ1mҧŸpF爅 cǎhʕ*zޠAd'N߅>?'?d-#`YevlXl;meU_X_͛sk<̎`cicz w~wacLE[;αQ덗s9=z衺j@�@�@�@�@�@�@�H#P8f � � �I&kƍ­Lx S {Wjذ ^sk؀mjѢEztW몫JJJ=Xel9 à f}�@D lӦUo~_7s &[wNOɳݻ?|? pܹܹsMq^fji<m o٠@c%hwfm,|3Y ZL]lwb;u_cjZ4haGqrnԿsgB2DZ۱ck н]m{UV|Phv5jA:6mC "-ŝ]$w\*v~(h-KJsgtsΐ!C`,0duNem p[ od3fm n/C m:tu16`\(E|66\vǃ!XG@�@�@�@�2(Q Ȍlk] t҉'J[Kg}d5{y]wݕ?*kWbyv-n\vF2:uTsS]d,T҂)sڪk7o޼ |2_<h}Æ KxRXڻT;}J7}@5jҾ3GY^=+裏�;rޭmvl۱1bSNlFX?@j׮ o-csw@3.Y;jzeeɪ/(c˱v2;w*IXݱ>6 U|}q`ԏ1gRΨߖ0X_X.ni7lؐM � � � � � � � Ps DA�_J֏!� _ 5n - =T~o=qjU(TH(kPA } ,Y2D>O\`h!7(B C.@0Tai`!7�&}кuBʕ 2WeCKs'Bvzl[.?f6 <8y{pB <k~F/6m T!7/;rfGy$BѼ yߞp ~[np-nm >׿ef[3kqCUT :4VŊV\gOx ?SOk~~PC=Bmn˗/w90}l[؎eA;W$Dt'{clȑbŊ`Vt}ܩ!Tx(tšX-[V}gqk}~b [zȯkn3u?V7@1zj?v^ٸqcd`稝;wyK,oIPwf}@�@�@�x?6u@  Uv>sG`P.+ uY2_6l:suq+l^zVO:$Y<fn寭W^=nZlumx'Tr r7 +<'gW";^#kָiӦcv<듴~]뗲c486gϞmoӎ޿=\?/o~B1<j[)Po ˌ|$y#;3ٛZ~X_r%\y)+T&+X:6c9bNfXw3l~_^s5Ur0CC1X61c_Ŏ<HެYҼh3 }[zD:E�@�@�@�@�@�@�@�$(~$DA�@�@�N`Ni0iH}{i$vc/,pԽ{iذ\\x uI.17PNv n.љ~ǻm _|!J;FQT)5mT}~7|S˗sdjР\�+&|FO/[1_j[dvɅ"F>B|\x>m۶M[oO\8>SPE]prmQ3(.0?5lpԂhrҼ,whĈ7%%E8 p/t }ԭԣ4aܱ5ze˖ rlgn0Xv" qضE2evᒺ{+ >?qd:TJg znA:XnW8^n9ҳgO70گ/g<ǍkV=N;4p_F{P^=T뮻/e>"^ � � � � uؑs<SڳGM<ߤ@p;RJZ~ڦQGuq8k͚5)SuU{Y]' =>5k|ɭkcEr7q$=Լy`dvZh}V/08OL%kGk횾}7K|g}PaR&M&}_q>BQObe} Y)Gm6ןftk{L=/7 P1~cϩ뚑W,}AY l'sw~]b=?ccicϤ:sAiގ�3@�@�@�@�@�@�@�@�*@dݱ4 @�@�2.Zd<HKg!7H-c $dujhu]-*V^ eVZiԩnO?ߪ_~A1[ʭު!C㟔VP!ܞX_~?Ѯ];?ڲf?1pXl!-KTNAAc- l �+6kttpMwesV 3Ƕ$c믿rF͛_Vfʰ H nད.a%a?颋^ N>:|xdVb9u )*kժSN9}9[-O? -ԞgV6رc@GyD{nL߇{ � � � �X̉c]#y�IrVkOcauA`] +}mnlf%>rj~|3<O?_3)g}&fh7m:{ev=:7n@9*݉�*Z>X[G^̋>GD?c*yџu7%;Nm쾎o4c3c!dvn3Z~_Xژ67촛 .m|pOZ@S@�@�@�@�@�@�@�@�x(^ � � @n \*ղT4gt@fl.Ng䡇F-[/kΝ{}?C/_K~5:H;v-0Rv+Zdzdc9)))"0aBydӦMRgczm={ԬlAƍ˲b 9[8Alܸ_ ˊ+?<z~{ޢ')tUEV26 ,evl!cۆ͛7�<{]/^,.eضps9Ggu BtII^ bg)}4i9GQlVw#p,e1sJ=Ke?FaÆ}ѣU¥o?;>[D9sǎpା@�@�@�@�vynDA#e_ڂHkbpB:YeT f']vKvM<Y}͕kM2<17Zpf"̮g֮s5wk;j=>/Fm7>}_n~&KzRo#/Yl]eulr,IJ[Kc/S;֮]x--3c p d@�@�@�@�@�@�@�@�-@l@�@�E^w!P%M.rHl:7  ˼)6Xf͚~`@Ja`!t6py~~g͚RJ<H?ς h/V4h<PbY ʕ+eᔙM)9L ܸqcdh K&[ԪU+?+6wX6[ve_Uׯϴ+v%wU<=72_נAIU,VZ>-j~}ڤd~k^u6mW>ȬΝ;+}l s7_|񅮿zcB,/A<|ǒΖ+'rtrǿ׉aA<sJVu{իWq5tPYPdVNUZUǏSO=y!u> � � � �^%ڙ]g">|}ծ["q.zio-ʊ]w.Q6?^~ԯ_?}zMYff}h֟D[#Ћ/{ dv=L6Mkז )+[nה%7'>)f 1h[+ݻwh}k>|?K_PVf,B,&dczX*RZ5A LKsNb}';G o� � � � � � � �ij@xuC�@�@�r*`Q~Bդ;ٳ뮓 C1Z)R$4jH]8p.Bg~0<%իWχ 1ch۶m~٥K֍7,>/fΜ?Cw+`iAdNvW_>;ɶ]oKٰ ?CoVCsN?@,ZHoFdXreFimbv6wwyfAcW_i{ $4׎;dɒtyK.޳A_6'V~I'Oc=8/^W {uaUrfv,[eFضb_VvV>eʔA/.Sck_cۧ6XlٲT�X] 7ro_å_M~?,bZoZў[Hnh:زkaKaGՂFm` ׇ;8;ug6o[{/G۶m!ʙ� � � � @*w+䝀4n%w)xoؔw[zgbwɰ?ϫk]WƵU.VoDeov}/c??^Oה)Sd}wb7LKĒѵL:5rc;#ϠhѢ~QkK[ 8nӦMZ_XWcj[)[b-v#6+k6޼%xD|v,Y�#7ϖ ĉS |gta~x)+%p ^ϔYߨ-ձ˱гg,չYYbۂYAXpumgh7$CsOd|Bݰ .7> |5C@�@�@�@�@�@�@�@ I\+}B6Q@�W@.W~ @�X":PhP;B;ssɱY,J3B.+F*]BJ u]={DVTj޼y9 3gN n(RHO:ꨐ(ڸqchǎ!rr!7P$"dх=Ⱥ? tÆqW ϡc=mtᖑnذ!tYgy\8Z 2v :4z!&r_Bn`GAZͮnݺZ':Wl  C=y?9QPaPȞF>mdulDzm=_|E :u<{+[xFiajw^HرG CviȐ!O>ğ[m_Ј#B.`vy?p;yXb8O>aժUAyBw!޽{:ZZnrC ,/_>‚CW\qEk׮oCw#u9 � � �y!wؼeP6pE|<][C!B7 (FWO#VO_EEl ڪDq'Ҹڪ\cnBNз[}hi*_@gFs;B~a´4k_n|i&TRH~A:wr7;|ШQ|_]o֬G{N:t[.̞duƺX3G#<Y7>n)޼.hAFSɅծ];n6γ[vz\cP\}̪)VX*WV}AYVX̶;vI&~_Z/iܸgp7gw!!wI;.\diVbi_0O 7[ t7񵈻]hРA7.:b_6 � � � � � � � @#)g^+X  @ *$yo_7kD�@ &L.HXQzex]kޒ,.PLw}@6x'%7E.D,J\Ν]nP\PYelL+W_ GLܖ-[/Ar*Ҽ3[G?3ukiڵrer?zz2n�.R.Mn`^6[V^-7@l~:uv>XY3wj>؎ee BcdG`b{gqs1%Kfg-lV7Rnp�fbۮ\rd7`֭swVΙ}wVX!;ޭхC@�@�@�Ux3+M:vcTIvmyR>֗#'u׵ٵuw2M2E۷ϲ?*Qn۶M%jKs7m`kzᅲ&g**w#o-EV]\H\`G.dOR_:l &vay:FcSΓdR'_nHoީw}W. [ߊ d͹VVNגU_PfVBVۉ9_r_ژٺ*Tg%em~GrArjذ\ȦGz,� � � � � � � �q!@d\*��Ϛ-!�!Cc ?u)[uW^ҨQfҤI֭6lؠ_'L3g~V @ Xl`' A\R $ I?.7J:KE � � �@c NIB/mn$ըQ x%⋥&MW_V\TWb9rUѢEb$~g=?~\Ϟ=տuهo&R }<0*׺;Zf~aÆ@̶e]S |odkѢE 7ۙbdDikJ~~Ӣ;'/[D]y啲\� � � � � � � �$�pL=F}@�@�@ Cot#7Kz5w ܘ&-X vZ HCKt'PݺuOʕձc4MڼyN}UѢE r!q֪Uپ}yv%K믿FyFrk6@oQ^曥{XE ݨ3fV z=P5o޼!� � � �\D:vXdW_-Y^K/7|[#%}/Jv{1w߫_~YƍS=T\9<v駫K.x/ׯU\awʣb.7pCkoٲeݻwJ|ׯ}:2VӒ%Kj۶m5,nbdDikJ~~wv7䜩'@ߢwy 7 6 � � � � � � � @:B3fyfcOC � `7=t߾16� @> <@8瞓j̧_{Ypl ݳgJ.۷[]v>}zZw[&f~2xȥ]i=ضΝ%{c~+kE8?`K&G5k vvc4dtR2S۝;wA'OΝе <X?pmB�@�@�H4cmQd#% VFiŒN0驧>}f;9Yj׹UzuY%c/J-[_]o חZXm۶'t:()R$+OL4^΃?0~iԨQJ:U`X5~xڵ;:`tf!tRM2EG*%%E 4PϞ=wQ֭V"� � � � � � � @RF"� 0o !� uA�\6LC @޵~L/=LmٍCPݺW_ISPZU0۱aC8 N- Cbk̙3զM٠ڵk!J ~H)*-s-[}GLZR5 � � � @ g ̛'vRӦ9ZURxp\:ҫJ4/uq|hڵk]@Y١Cp jѢ/_Ŷm&K_|? lܸq-tw@,\ߐsڴiK(ϣ]v)&M$ D�@�@�@�@�@�@�@�$ 2v8E�x1� P>T?r!mu-y/K{ߺ$֗,#2R||4uԨQ5&u]ڧBj*DR XJ=$)" ,S&g"VLRJl|@�@�@�L<eH`b~}i,s]M7IGK^(#w2))h4 B!8̦O Bv'X֭uǪVZ7@�(yf}7}ƌt+-[uɇ@'Z�ڄ� � � � � � � �L-k@ 0`�$=ҝwJ=zHTB4>9ntҁFx3A&sKԵdn4a۰}v?H7TϞ=3_w^F?Yt5RN!͛;N^u4&) � � � w.Bx+5?JvV m}T0 ;fY[!s>n86|*UpH ynJVc��;{lӂ "@mX�v:M@�@�@�@�@�@�@�@�l @�@�@ qV=7<PZSĩĉRǎ@ƺ /lQDlY.]ǺAzhƕ/Q*VUv @]wIW_5*BKnFoOt݀k7⚂� � � � �1 K,GI]R:h@ ;xt%nڴ͚5?&{e6m#<R͚5kܸ*UͲ, ۶m~\|[g-[N:ZG6� � � � � � � �ī�Ag � �:U:l\9i E40#lȑ$Y˞=IL7·AvAWzu\2xT*HÆICH>JW\;N/飚5kꦛnJE^"� � � � @zŋNya67g)=Dg]+s@ʹN:)ټys$<mΜ9k˖-~UI&~`HyԡgkVuxD�H`?Ν+,qѢEH"dA ֪U+jj@�@�@�@�@�@�@�@� 2!-@�@�@ Bnz|R�7J|ҩ ZUA&-[6|ja:HY~VVZE  !GC^wtRҙ|8[z?Mwy% � � � � 2HƯ׮9GSi2^w@ wʺv)Xcu/[̇YКM~^z%J(C9D 6k 껎.{>Ep#&fpB`d `s4Av.*GWlc)@�@�@�@�@�@�@�@ W� � � 6H/}A84M*78HS &AZh)%ʕ AtԱ4mT^vք9XQ>\{;_K%7^3rKΖdJA�@�@�@�@� L;2\7,쬳B[@BTvm?uuj_އY0[0M<هm޼/k!y [TF )Rd ?,YK5-ZȟCl+6{G z-I|2Z� � � � � � � ��Ay@�@�@ '|##٠< f;*RN.r&QkWO|yO A~I0T q8,rHi{o Cr\UeYF,_\{֧~͛g@�@�@�@�@ Y,ζoOV=ztZ)H>+us ħ@JԦM?u|-\?ǩnv%ZPA֪UK5kk tAE5q,+V>DG=ӯ[Xجp.޽ׯ' aq � � � � � � � ̮! � �,'ڶ^|QR`/^[eWaxc<֋ x+ٯS G ;t, vcAV{ȡm>k#FnU:Cfی zխ[7FfϘ1JoY!� � � � TxcX-q4`{v]~ @ T\Y6{iZ |_ҥKLA@n|͚5v)UVUedя=pi ȹ.w7J^^:2Yʕ+9xy۶mllٲڮ8wU y[S%J,@�@�@�@�@�@�@�@�#@qg � � J]&=tM]w� fv L.q1W]WAYX1٩S{0m܀pmp ٽ{)42I#]wtҥJ#GJ.bŊ7!?sUDS  � � � � 2 f͒<32Ԯ]e�Gn2e]6i&݆رY(d6-ZHa7ZlT9#Y & m^ҥ>SG`QAJJ֮]uG{::і YMTR:#-[wF>�L2ɃJK@�@�@�@�@�@�@�@� 2wUG�@�@ ,]*)oKݻ{N4u,6_uTI2E ?Tn �={h~`;oO"+pC8 ÆIggʖ-<dɒ/\@�@�@�@�XDpaG N8A?^.my�I*Pܥ֭[Ol߾@қ/^*ng2*;UrsW6/_>ͣ+ܥ/z<G ,׆ |(jz~z?q{մ3с 67;p#d}@�@�@�@�@�@�@�@�#@dٗ@�@�6M76{T^B7'a+oA~Gɞ ;Q @0 VoݪU, 9^a~:ymR>QGIÇK']RAkN{^y٠1  � � � �-͔*7ٖ-]G㭷]OL"��"Purw)bwk׮Szx6oɒ%oday7nyv+W.2eȖ{p)z.jCh9jӦM}vޝFt>тڵkE{Z�je!m᏶aJf � � � � � � � �I#@dj� � @ # "r-(A`[nOM*$�R |Gw)S$ <$wL(/F_n)|nU:xiǽ7٤IM0A]tW_zhx� � � � @ p_g\ƚ> |; �$`65h -Zmp iS<e˖EB?{ܵkW۴@K B%KJRzo)^b\rq?s Y's;wt;":۷mGϳ ?mںu^S0 +/ljaX~BG˗/`G{n_) � � � � � � � �dG h, � �䪀 $=4lX8*W7ʲ%0mZx1KqK(h\ApԳ )UVfҞ8hLzmi a 9|tQWw>sׯj֬C&@�@�@�@�Hr tSI[?wIKA@ A . I-80:̂mu֥ X@aRQ`f!- hѢ~yԏEMbS<x LV=Z}:S Nv{nYcV>v2IXЦMisZhcڵӄzF|<0hm2  � � � � � � � �-@d~=@�@�+WJg!4qԽ;0[ϥM wMsnxJUK:5sg5-YBd Ѥ6mG![ -0ƍM۷VX!C0ȳ>;!F%@�@�@�@�kd tg<XkF km֏�ď@XJ<nww !{A_[@MY)1QchzhA8X~.] B&сY| )%ܝyHHc@�@�@�@�@�@�@�@`? < � �(0cԻTRFɨm9Sj:(5:@iD-̮@zҔ)R˖[ u͒R'$[ҭC|?_vm骫ҲetVǎG5& � � � �q%\W\U)+`ԧ҄ i&� Aa2esU&MtWcIvPq@�@�@�@�@�@�@�@�Ip"U"� � @ 'u }4!7w풾Fj*jXu9�i˖Ī3͞@ÆҌtҶm<K#v~3ҴiCHIGV^?Y � � � � 'PxrAHv[! wRa@ _7nʕ+k]6� � � � � � � � @2 {#� � tҀWK'JecTsH)nb@2͙,[Bå?fϖzNAbFvW=W7^חyY5o\ݺu `i � � � � X /K!ҙg~T^z#�@vOp� � � � � � � w`Nk_"JT4)XQ`Ǯx"]`"tDD ��@�IDAT7{B6 n IN3;ds  PHY/�@�@�H%`{NnX#$.RJ^{%[n+PfͶV8\^=}4~tIͅ*J.XZP顇.{%^AG*N*E�@�@�@�H%$Թs^,F~S@�HD#2= L@�@�@�@�@�@�@�@�H� SN@�@�("u"#%yfH["ȶmIЙc =/5o& k')}Էuk&frn^OZ#-Yz<N6m*ݧo � � � �(PtN9bԺa4eJDF9b@�(xV\ٳgGY"@�@�@�@�@�@�@�@�H� -J} � � -0sd,9ޤIY !W!tVMʸT*Zqͦy8�wޒ.0+)ߤ{,8֭P}* T� � � � @z *U8An"]tY/I>@ =Zj˻gJҳ @�@�@�@�@�@�@�@�B&@"BvB � �"0bdI4J٨QvD 4Ծ}@үl[9D:T<X#PԑyFpܽ [_ � � � � c"eˤ~X4H2D*[6@�YDر# s&b  � � � � � � � �I dR9 @�@�Lǥc>XRt<Y Hs.Ҋy3Qc^|PLm. MHcvĉd .O:xiΜ{� � � � d 7m*<~*n-s֤lg]xFO@� Ns$,8~� � � � � � � � PJ]@�@�H%:{;QuLՓ,!%kKkH))z33N9EZN_XQ.:H.wys鬳[ovݵ"� � � � KEdl,Đ6Fvb9d/K*dNi) @z X"țoY?v}n,C�@�@�@�@�@�@�@�@ H'#� � .HjPi3ҥe#̙R˖b}<:u҆ m(pY "+֒EG}\9r _#z^zI.Oz啬\#Umh � � � �$[`CX1s%{yY3ߕ+OƌzHLh5mD�$۫TR7nN=Lj:mE�@�@�@�@�@�@�@�@ g\i0 � �u%zHv'(NH(ufmdI;Y׿o $6l.^}Vgv9((ndo_i<ۤJdc%x � � � � $ծ}C!i˖D 騣߮ XeDMil\$e:@� )SFOZ@�@�@�@�@�@�@�@� d"Jl� � �9 ԥ7رҡ)+P`Fi|e4l\5fMhѢ k8M%ԻӤ#[C}w֡|0+8Br)Pt…R~UWI͚Io @�@�@�@�(V,k\dɜbt&U6,]=<ΞL&k};"� Ν;2ԁ� � � � � � � � @Ab5 � �,0wԱ҄ R9o˚5++!]پLkUz$̴sZPK P(h˖I3#S/\Y>iiN8@4)u' � � � �%з߱~≱ZŒAژ߳ƙmUY'@�R!pjZre*N@�@�@�@�@�@�@�@�� @�@�@ W_~V$v*`3w5*7n@tnAX1%Kg֭TNO]*M,,Oitk)A�@�@�@�@ g=_*C&9؜ϯ5<#u4_-oD-GK^+3@�T f +?>Շ~@�@�@�@�@�@�@�@�@7"mB@�@�@ rHVb1cjD͚Iw5+PC ^-u횕8o˖mc'M,@: _V"ޓV{o˥Uҹմ @�@�@�@�=,q×ŋ,)T&䒬p{5ܥKzE�@ ?*W͛kܸqq8� � � � � � � � @ d=t@�@� tGKÇKeJoZLV4m*͛'m\zCr+tiV%ZZ(YRz_o/}TzuaCMkS@�@�@�@�(޽R?rq;3ϔ{ۣZAsΑFjv=@�N:i„ q(� � � � � � � � @ d=t@�@�x%$ J{eD=Kյh^m4k9~&E_{_{M)dN;IK H\"zԤ+R(sVv~=mX� � � � @ʕlretqKsIGo?YƏ~]#"�U;jڴinbg+P@�@�@�@�@�@�@�@�<2x� � @Qx o_+&2[:{l]IWֽwi$5jHCHuxs9y(_^6|tR۶gEF'}_ѷa) � � � �8Ic+&_TҜy k@�H@ܳ|2T@�@�@�@�@�@�@�@�(n)g#� � wH_,yt fi/0wnV-y!%9;,ԩɩZ2SkWiipAɂY,GI ӥ]vuJ8k?3Hʄ ҙgf}_@�@�@�@�SsgnNI' >siS#oْ59ގ �BaÆ.8qb*N@�@�@�@�@�@�@�@�p$2@�@�@�W]%|sVٵܔ&0oTTN5<͛ۮ4yr7@ϞҜ9KkA(0WKCKs8)hBCi(ibeK_~ނ_{MƔ4J@�@�@�@�Q&9<DMlqx%飏$kGRdo6l%@�H@HZjE�@�@�@�@�@�@�@�@ DIA  � � %pKֿ?*MA6jTzUDSH[|[hA XǾ}E*WvvY�Od!HӦIK#GJmf% f; ^n@�@�@�@�Lq`Y3~MrE9;HҀYO}Tl@�T tQ&MJUԋ� � � � � � � � @ d�@�@�@`{KtSOI&r۰$,dƙߏtAڵܹ2SJI]&-^,tTTDVЙ3/(ql#$>3GuXr?e � � � �F+vU'zyҟn[ɻN1CG&\Z˿ �俀%\d9" � � � � � � � �_7Qz� � � X /?>*ϗz̼v{[vYKiӽ/?BOh4hڲ X .M6鯿eomݺmſ۫ķN;і.⸤Wtir+_; `^lY+W.eRJ? SD+buh[$gن \Zr~7Zz{1^{̾@o}*U_UVvuWU^=9@�@�@�@�x۬[οoܸQxm4x㧑SH_&A[NR{^XjDEc}._*T {g-䏛7K͛KW/I� @ m}8qz]  � � � � � � � �2AJw@�@�ȋ%f_zyi02u`Ըq4r}{ϥ~2x{kjժUe֬Y{m_l-/[2ewߚ<d͘qK'_1< `h.8HCs҂-Y^b,1d\bE˂RJ\Yr=$٫VeԔp6$+R:PiTiw rY-[YfܹsO?%+,]AGK~j=Đ ŒDnٯ iӦՠAX2|{>#� � � �]EWX_6jc46\ec{F&e &q`4Hznl\KfM$ ? Y{l4<exRDkPY!te, d׆EkwUT5.ec@� Z5wYt G�@�@�@�@�@�@�@�($,g>!� � KtK/Io%}t.*apy\r7At쳩z*`I,y/__uʕ+?ZoddЂyk׮MCKh/>UlYZEJ_[#w l^2+H$ȴf>{m"I!-F۽jժk֬IH~reu r\"T)>&M䶟'kȊ%x{U~}#;1%i۽bҒ,YDp2xYO?'䯖\QFjݺK޿g<`@�@�@�@ ?l\_~!K._ Ym%VX&XF>>{ml5_ &JXޏ㨖�[Z\"jͼVMK$6|G<~ǹ1E~iԨ$69m6jc:unݺqRKxIA�@ UڵfRU?"� � � � � � � � Pd%9Oz KN}Ԃ� |b$;uS# @ =sYI <2sB{wsV |ԩ4o\c˼ X%cm ( *9HDn\d*Ki,^rAN<҂WwuWl/ *D X7蒃fb-F�C@x@mF'ĉ߬>g-|RE{oڴO�iR,19s|NSL+-۴i㒾vskOJt;@�@�@�xU6޶h"ٯQI0ll5<QaŊx\0YL0ت%y#q`Lm2#Ki xD &DqP{իW/e$#f @a4h ߪvکv~!� � � � � � � � P $,v��Ggϑ@�tWå=ҵ+>+![Z+o K,=`k…eA@[RX `:ud/ eʔ v=C~ �ҥK}P{ #-Ydx { -0`|w;j̬ԩrI$ J[N{n>zw}HKjv_ڵS֭3w\M<Y_l~,Ai.]tGQ  � � �)<oEՖSm ?,XY-QlY~쳍j0ʤ+{D$DHMdc>c6%І ɫI&kdI"-$@�X3fPVsI( � � � � � � � � <A&ϒ@� (#ND�UKyG. QM7e%lD!?OKÆ򎦠{6mҼy|0r&Z*1HgA?{VKI)x_AAt4- =P A7nC[@]OHQ,qw$3fvmoRWC.1ur!;YBX>#ԩ^zt @�@�(<-8;e[�;7[ǿ?3."Ā 0xxd+T&Wkm%KkYfj޼w'-crf +Vԣ>>;@�@�@�@�@�@�@�@�($,'!�<2@ \{tСr CQg%ԓF(ϟ>?t]rsL;͛}3fYfwKfE|nݺS J$[0ʖ-i]i&C5gFeZfomr{iӦe쳏6Ӭ; :e~zuid~{kjkeT_XK7|B}߿wN2d S � � O<'h/7 M2EӧOoƏ-jz|r?۲$(UTA o~l~ܹq`l~MSLhBZϏ*Uu@h t?'g;@�@�@�@�@�@�@�@�H� gIM @FX &ͥ �)v[^N?=E.Szɴl^hqJcHݺ.6lASNմi|pnڴI%JD{t^M4y:0;#KK9{W ?Vꃟ-)+ @ŋEc7Kvjmtg묳"f߸qO3hܸq>E]?aN|D�@�@�Uzf G.\ &hĉꫯ4sLY2}6VlB&)=za~ׯ%lٲڶm;\V6� PW^y{=F_u6#� � � � � � � � PHYN(A� xO @x!i�i@BEr[z .f|KԁJ?zӽP($KgA@}߲e,y^֭}PhB�t-ڇXzo%6 M6j߾Zj!}P[;L^z?pgƹ:,@l>ʕ+' ܁� � � <M󒉭qVw/XMN%xv3[nռy4e/}0f͚:ԵkWG� P^u7Zv-K@�@�@�@�@�@�@�@� RDϱ@� �9$ fO?-/=@V24kO;,tIp"|[oK%-^,Xx!o�^W ԶmdKWϲR(dvXP%<yYHK~j|ΝեKjذa!}o%/4c=V7xw;v;+VvWɒ%uM7 /ۘ � � �*P̍&]*tR}ѣGkʕV:u&:P￿hu2f[ȯZ&Lرc5~xZJիW'9CUNBc� `5jH&M~A�@�@�@�@�@�@�@�@�29Ԃ�d�Gsh( _8CT?$\Աc48eKĈRܑ(M$wFAƍӆ T~}΂- yVţ" SL_|-(z͚5u]u!f͚c4tPtA>a- e_Sv qzGԠA=2|[  � � @<6}E&$ 1{Ol&رIEwU5k&rF)]}ƌ0֭0sizi WREwy*]@�@�@�@�@�@�@�@� dHl�& ٤/ |tҀ=ؾl]\N2<}ZDSp-{ӨtqҽcoӟѣGG%"|֭Opxl@غu`hƎ׫uզMB J*W^·Ν;WW\q>rwS2e@�@�@ �c K?ưaôtR5mTGu<H?N%B c6o&#%|5kVիWlٲXʗ/_+W,UZj tlڵk$ˁ#@!lb^@�@�@�@�@�@�@�@� VD@�| (9  '%kN8A2$-D# P7>}%Mz饗Oy 6@M F9rl٢]G:#Ȳ\R@ W =qDo5sLխ[W{v}Ծ}K qFp/Xw};%$`I7/" oI& F � � �yll3ŋg4CWv6F 2{.\{'?ϖ&ȱ,{oeVX˗& Jɒ%'jܸes &H xG�R+Ov_@Ԏ� � � � � � � � @ d:t0@�'0otrһ]ǤG.nu,Ir҇J]c(^ovi'y:}r%ԇ�Nয়~eƏvM}U~T~7죎:J_iB%K}x z衅gt@�@�LfyKUm?֣>>'|<uieĘO\ ,ZH/@%YR݃K/ԏiuK.c6~j/~ZbU,)dVڋg$ @^{5~K. @�@�@�@�@�@�@�@�",@""|:My Pt-_YS3F*[Z^9R>e|J@RҰa=N^j_f'|RT#Ȗ؍@Ȳ/;.`: ~:  m6[}K,#FޞKw^yݜx≅@�@�H[Ǧ׆m޼Y.&ڹ tk;8,0vX=S~r=S]wN9(Q"n7nܨ o̙35c M6'-1o=zPgqI�+`x4iɓ'm۶qg@�@�@�@�@�@�@�@�/~ � � ڵrMrMrIH�Y_ZLwӢg-jUZ4gF,]T]v֭eÇW^F/@m9v>pق5jڻݧ/]/JnTR%?$tbJ*!CSO=UN"� � � PBÒ$ٸkϞ=ehؤ$,^ 7{wlK;͛O WGl /v>PUZ5wqna?cU:@�B UX� � � � � � � � �; @"bS@�@�2E`&)i pʔXLr9((лrtWqeK}Ҷ)SW_ռytUWzqf5@VSOiɒ%>Q߮ jںuk~5#q6nܨ:'5jQw߯?_rNh � � �qӧC:6vwuA=b36ePǎeԎ:x ͝;W?llݺu~y5th;Z5#�E^Xbjݺ5�� � � � � � � � @2HLMB�@�@ B!_?i4=HFф drOKܖǎ<bHXRFiĉ9r s1 @Ŋ}^ 5\mꫯ*_yZpFNuNDā{1uI}� � � �IزenfkO1|d6CA�잱{ {-r[pJO>D3f5k柋̚5+U P$l3fɾi@�@�@�@�@�@�@�@�R!@"TR' � �(p-[oIo-lY i+@"Ȃ95/͜)W0Ƿ:Cu7ɓuAH,!#,/zԫW/]}҆d?cYB ʾSr')K_0o^pnqnݚrԞ{Z ncǎթ07jNKy 7߾;S-J:B/M7ݔ@�@�@�Xrwﮧ~Z^yժU RiŊGui,Y"cu]o%6m?x5iD'|(C~~̤uֺrܭ cqENhCv/=ecv.~9sLZ]v6nܘ]o&L,CMr駇?\~logczb_.ޭ?~73+;ڮÏh[xyo;|]9xD#{9}#E/&r}x"Y֭[^yY[<ωhu_^z8p zGgw9rxmlXGod[MbYw.W\q^Esx;[Ī3vݎ!hW|D|M}ԍ� � � � � � � � @ 2E�@�@ KO>)`-Ɔ*'bj,m%M>Z0MvYf_~*VX4ՒY=u~ҤI\ܷ}WAh}2d~>$SJ'}"P >ceU*}'!8ۥKwmyձcG~'~Y Oh>%HvQn'8ԇ� � � @QXf]kjƌѣGr^Z~F!KƖY0;-[6g mll’ . 6ٳtтcI:vO3^ Qو%12e'Uo'mv}u[o>l 6lX6oެ 6d' _`c6)j+rk… }[m;-1]3Jd~a?NjXk~o.ZE-6Ό;8 kwdk֬Q[ѮW_}U^{>裳FA;z!{イcE+G&_v yd-}䦏Ç^{~=tܥK{&`,\gs3ڶ,pܮ6m<^<쳏� � � � � � � � �y d @�@�pH:l_9'-D#Pbu,djiظ"ФK/ b$YKh�fA5 N;,x 9G >5P{Gڗ2~]jԩdiӦ)lA\xmLa:jY-Z={{˖[ u �I ʭWh[rgnݺ>6S' � � �EY y䑪\OVV|hҤ.|?M6:3wt\2/ :t&Lbߴ1K0hܹ:문T6,6H)ͩ]^;#|do߾~ҪҥK`թSb]wzxm'&+]ux&9C}5Fa?h"vz}W6MÆ eG֦N:uG.XZԙhla:"|>Yn6G]]tvΎݑuھs̑%k{x=|ꩧʘqd}~/^wy'5^AC;s4N;Ϳ̙3B`J*j?gv_ 7Xe+vhb/X֬Y3(Q'MF}ԁ� � � � � � � � @QL E]#� � %  HZՕU M2#..N.ff_׭[Y'|rVbT"fTX%ф_>SB~2)C%g?.<Ԕخ/Ohؾ}v([>{n馛n[nI ~7{gI 'N3fd/Oև 髯},TA�@�@�@6Ê+|撟I#;GS}ܸq~&J5T } ރcDRakvٽb>s?Yqhlٲ1>n=WgWm`euSL㌖t&Ypav"mWюS[lZrNO,Ⱥzc)͛7?/ֺDoXYNKh M-ypPl/+^`cʕSFO;h!DXlK&ٸqc%X~DxuAlk% /+W%cTr]WVbm~Z\su|#m¿Ǫ/v A{b/&8&Ksd@�@�@�@�@�@�@�@�“ i# � �)XF.ɛd1C. TYhVJjKՑ%+nEfJ7nUX0#1b^y>AԩS[o A s3駟k뮻4ydْ=~`yJ4d~ƍ�I&ɎײeK$ς:1coݺկ ;#{-_\mڴW_-;V"e„ eիnM>~饗jڵkeoR{饗4j(Y{-?(}}YٺukY\>{Yee AX{9ϖNq~]uӦMcǎrvԶm[Dk/jwFeF|@yZydZÃ�Gyğ *?{?jA$ "|':餓RUz/"}G<x~a=c$vm<g;Sv+vEa [fVF[h߃5k?Z >,NQ?o٪UKE � � �e&ݱW666kٲe:ӲT ,⍣k~*v㒱,[񛠝m_K�o-aKaGMF;-K9/TvX, zcy%2^3V_c{CNw,%0`@yv{9.<hq,Z /Pm#=2dx=>(uiϟW{Zdlcv w>2^·+'r%ɴ1P{O?OYke? _Yobm66qYC769gL6nlozH��@�IDAT7oqP*Ʈ33TR~7kd/*73Υ)\ؽaIR#KxlI,guemV׽ %r=\~fݴiSkη-Jъ3rꈵo1?fs2z� � � � � � � � փo � �d qI䒇I/l(Oc @�ZRtyrYrSo`c?O$#KQ[-)%Z/ ֵK.Dђ;ZGK__~ꫯ|Ŗu-;_,KvVt`9K|hg{>%%uhgu'ς>oG'r%yo4tP_s5>ϖYb:+v;sv'.@>Kiu,Zog "9g jԨ>vY͛7zvq:c=VM4YMJd~k|N{ 7̪k{Ӯ{+v>XԶDMP4;v/>Ѥ/J׮]աC 4(eM` j}M1by۹:۷OtjvŷE=c,X&:uDߡ aZ]vfYn(Wti}7:@�@�@�(͒Dx6Y%`Bkcqxh֭2ӦM.6% KױbXfV73{#1\MP7.=>o볍vɷƨmIxk,D˭X}5o 9V jw &ԫWϏ)XMRr٘Kۘ魄'Β٤N6Md%;Iov]ۇ/hCWm+{6c,=۱Jx݉Njٖmc .^lm >Zi\qjKh{#mωo.=>ھ,٢%bѬ_"i%AlܸO\k0YgdJxٯ:,=ؤq֯^wrΒ[N8?nϻN%Ѯ:m1fI/q3s8's. A}c/޾yYoIwy}@�@�@�@�@�@�@�@�@ d I+{B �e �;&pePٲдi;[]_ J.Oxc(TZ(n]j[䒵$=P.kwA}aK\rX~ |죌7/ѣG2:òs9!rղW_FB6m ͟?m^{rAu2B.X/{\~e>|G~[o5{Ӡo.H;{Ks 첗uY~ZreRJ!~Æ + L:/q .w1$Sz`A5e[n%hfe./O]w5/^_>} 6t(C.6'㹄~KrIS$7Tx9okK#l\}%@}^\� c_]R[.]mP昧 \ %\K � � �yltB3qiџ7FI1`L5޸_q4F7mcsεq~ٽױ8NCc~۹D~qF6j&lc=6&k%-W"5qDƐ9ew>{0Ug;ZKrI?cfl¯ȍmҮ%KDYwIe \ƨ iWm{3{b]RB.ia% _NeGbfar=#dyRvmюSD-[9Hd1K\4믿F]2P*{KVqh7[J!6oc]cV'×_~O6gʔ)geJqᾞgvs˗G:v\U̙3C.IwV^q,ܮs>C&M ?kv &r,@�@�@�@�@�@�@�@� @ Ң � � @ #kI[g`hrZ%UV aW\!=W(b]mz삾wLʕ6m][:u>#d$Q.J>q#8:t\>uu'OVǎoC>ĉrUrA]4h={Y>nժUv.�Y=O~_֭[zskѢ_,}9iF.8O\`efOZ\�oK8k~K)اufo 9w{z饗d~ƍ~}".Q.P+Wο u1ө%X;X׳gO~\O<uaAcǎKĨ~)7u͎ |q4lذzk6D:u$P3 � � � �7oCl}x~6k*q%e7u?nױq` &|&\~qۆm}qMGtY06eCVJd<^!ka[ol<y֭T"}tIJnf\2ȸF?K'7`YA[8,;#fn%!Թ瞛2rH'ٞkX+9.ʗ/lb#c*HPA%Yb KnKwg[.O d&C~ƖC\2E͞Yd:'CgT9U~.dgr{%\ջKzm*JoK]u]q7ɔ\=̏bK,$MdO?ݿ=G{#o tEۄe � � � � � � � � @c3@�@�H#Jg/I'QhJ X"H;D)`;]$Io%A2?^-KN9Atjƌ:ꨣ|-ivAK(!K"8fYbd̙~Krܹ>adlԕ҂׬YYfC4!2xTR~{ ~=z|>%<1j䝖0O>%DsQzԤI$;4ڵRF YѣujrPJ"AʛnI ?vNaի_~I:E"A`m݂ |;uA-h$nש%a�=oSx=[e%Hz.-P~wedTG � � � ,%ݝױT8 Z"~lla{m=c71 o~1rX-ɘ%{wuUWi~sJ^~"Dyca/vM6-c5Uƺ[l[_|я}mבݓV,;\o2vD8dɒynҤIzW$VlYp ۻ'Z oc/_deׯ866\JժUku9 l+K8k>l>Xz"?ڲgA V~ɸmvk=Y#FoVYg1l"NudH7Vbm/vMgyt 7Zy,v[OAY � � � � � � � �E`) K � �Xz?^QBQ₊RR5%Yۣ;yzG|57=SUreYgyF}Ulsyɒ%K:uw 0 Y`СC-[1Z@mdYhQ䢔|[QF믿1⋘Dz< 4KiAJmҭ&K8rHYd׮]u`Çgo.Z>}裏>?$bi&V` 6hg}& =sS֜2eʨA:ujҏ % /~ ]stmj{Z2tRYfዓ7mڤ-Z$N*B�@�@�@ ؘʕ+ogEqDl<TD;N"7ZXa>F/e_;8\/\W_}uvRdy妯ACOw޳{0ǍիWD?}>!\dcޖ<!*%5 5nί,(Xf [O&d#8"ݓ]ƍ}"qaKb e\v>)O<ǣYYŊ;Wm_lfG$k7o%K5xo7= {7vxמYD(-/\=ggc6Ե^&;b ,b^d`m � � � � � � � � @H7?F�@�@ _\~!x %,v)_ uR # իJ'{:t7$lBR,_~4 AdZ_ǎ,SL% ܏髯'2tZ2p M0A\sMY Ia'ۂX`[駟GyZl?5j]zq-DïKiH,@xقoFYb6-(؂ wﮪUM!0H҂-Øg~){YAX'^h׮]Jc o Pbו%lڴ * YK`jV /dtvS'|igIE � � �u=C^xOe ҽci9qG[_l>F0hceɭkF7>F/eff_|lb &IWn91`tx{m޳{0Ǝ-d5rU%)Qjx6%;ꨣJӧO=3IlҬJid.4lO"fD=3ji{Q+В5S3fI-MfΜ鯗XIM׮]l+y-g]qwc='Mr饗ElDTbyoײ.cj;Sd/w\[֍7cֆɓ'S]l2VpN:C=$K0y$LA@�@�@�@�@�@�@�@�2^D � � @QZsc% ŋQD+b SU*̟dI,%K,d?_zjg-Xlw_lYkΜ9TJAvZj^{lKfo=P 8r)>ʶIt+SO=oj'gP{?Z!C^{3<ZW_ _ԤI|<˗+H<i|twuWp7x`ߦ.]U_-IZK<T3(+V-adxX+״id~Dg-7o& p|nVmuYW۶mY`.]>X|ri{/L,k<η5$: ĕv}X}P,!cuSvYom"DŋO/Kj GZlѢO:h ϾYfk~Wʕ+avhn}YUd`*`c@�@�@�Q1.:c~K %K[{1xh|M%ƲtlKepױ:c`6X6j%g_6%'ʩ|Iiw+l͒@D3~Oi;'2xy"}<1hNq; {9]ݺuЎL�&l@/F>x'$dɒ~z̘1cڸghbՑuԖ>%6K�iI[ŋos>òI.O?OywF],_ϝ,!dn>Q3Z}6Y]ĶVٞoq5k&=Z՟evvaٜX3(6]&'l6  � � � � � � � �QVzEA�H_e �9  / k'p!йۊ)p。Pٲҥ=KSN% �,N.a%[ dwM:\p%]@\誫 �ِ *Ur %g Ć-._Zjro \"Kv|C.X){e.+Y7˄ B.i_n6.21c-t{\sB.Ao l Ć~W[npB.Qanݺ!tps悇C.1\ ަMЃ>ZfM% լY3d޽{hԩ!$0TLwRs`a[ҭ.h6{fۛMr[p !g<zky|P".�1䂿~vlr֡ 6:%nݺ|;ݷv%{:s}I'QFv7t'\i%bTow1 s*/\xv~.\*@�@�@ <6nKjڴih} ..q7ɄrIY裏fKd%Ac.qN=ԐD'{-؇Y$bw9d)ۘXl|o_̏>+W$j~DH;m7G";e9:ƽ!䔨A{1ג}٘K/Zj%r ͟??&ήD˦MBn)=XdNŞCuEM׻dۭ1]]vYM<6 mW~=V[moَ宻Kj ~r[iK诓w9jժe1baܸqٞK3Ϟ7ov ۮ{o=㟡XKmmF7XZjxnҵ\k-[ٳ_om^{6ؗXmv*: 7l /]ɼo;7bϖ؞ծ]/m%'[."9d<ڄ� � � � � � � � @3NRJ>Y @ ŊI;ݻw *J@� ,X i#q); xt6CiԸtҠAm K 鮁gڃիWJ*ʩ.XSgϖK'O.x+W-Xザr<^ʭ.طޭ^QG#F%K)>Om_ /|/2 /{+We/KڹsIytZhjrBڵkUbUmE<KfZ 7h@.hqI2uu%r?ըkO<1M K Iz*tAZ|vmh .8^v~VNm � � �1xЭ>0eTC Q=Ҷ""[l\%c+6~icTu{TW"}i`HKV~b ?k.n#IB&e1}Md 9?17o.Tz¼Fw`RTyrF@2C$$$ŀ*1맲WEQDװpU(FP *ID$3$93|?l0'tu]]_U<%zۿ y[@]VR^'z?| jm<꒬Zn6y!yh"V4)⿷/i{miӦIC^CQNk]>K=Lԩ__0� � � � � � � � � 2S\,�D�"= p2ccg@sNA6J t7182Dwv \}F-h-w 3 e #G \2eJ_fVl_|;g^z~Bceu1_u=䓊w6-ZIs >\su*$NsbUOش (A^;'T7 � � @ p?6p*ͳ\<@ƫCx*Tʒ|R })Skƍ5l0Җ2m?~;Wr^Ѹ+VkO?){M\\\j|x -^X]tSO=3<3iY L�3 @ TXQ=C � � � � � � � �@[C�@�@�ôtτ@m,nonyPnuI/$oAko$mݦ=z6бYfzd|=%0%K:n޼yF$}uV7nݺ @z%5… qeV@oaXF /$k'N�[d]viСz7o^Y^͇<5k 6mʔ)e9}lxL:T|@�@�@�'xBݺuS߾}Uvm}.)>֬#u /=ł -Ԑz_x5ko<CB&?cYhgb!gq$%@ l zOKs~vQ@�@�@�@�@�@�@�@�@ yx_/f}Ikz|IG �UWYŨ @ޘ$]yAa%")ҥ兇ICJ x]:\髯]sr8hro*V}\\ٲesIzx7?ԑ#GԴiSu]ݻwddkiڴi Ǽ袋twUVQgZl!CܹQ\9 pM7@-mܸQmڴQR # ;KPnA@�@�@�~laY?m۶`PB8UQ8pƍ9s(_|_zߋ-ĽGަG,=,03y>P{?N>=(eҤIZd @ɫ(ջSX4a&޽{ vof͹^o] .tC@�@�@�@�@�@�@�@�D (94TGJ zU&M$ \:4!`aÆI^퉶VX?K*/-w[c[.toڵҥ:]r%*X`V&Ff y)Tlƒٶ`葲M6lB?| .pv=͛7!zjWkѪUVk8t 0YzO5ڋ� � ��c Aa/ÇO?շo_m6 jGrK4=0PNسgy曲ԊAOO>I_[অ<o=_5o<͝;=P7x7Yzرs$>@�rQ_րBBdW � � � � � � � �U Ƞq@ x~DŽ!� >,s4{I-gdN 1Q>LƜRP`~}ᇥ M-pC?Ι8]|֭:wEb(X�|/4m4UZU{ 7ܠ5j}Ob {w#+%^ ~A~:t%- � � @d p?62[jmǏ%;=@wቄ>`<yYfɮ=xc'H|r-[L Jn|Ycڵոqc5o\͚5S-,!�9$0awOb˖-*SLm � � � � � � � � [A xI�D%4gT^dԙZ)"}󍼀op@驧EjBo>=Z|[7S.]\( @93gkˮ_~EUTQuWe˖˓ho;C;S<wC ;C*Tp!u ھ0 � � @`܏ ) w}4:,MWVZHBcDz7?Sv ?ZX1<xVnصriwN:*P@dA@�P^m:uSI@�@�@�@�@�@�@�@�ȴ�A&c@ xǏ#@lt+tSlV)H'J>K68Cޠ̯5{I&MW_}!ׯ_x]p:_*U ./ jZg5iD]vuSӦM#.1cYdI=֭[jY6};v<x .-* � � @N p?6${;f҈#Cx֭[O?]\rզM˗/h]T Cpf̘%=ŋgڵs}М,7@�8v옊/_|QrK՜"� � � � � � � � >Aϱ& @0(W  e]ƍFQVD U ISJ眓"|&K;J|#ooT*E5,n„ UvwR۷O5kέsdׯyXĆ]s5m47yǎ.0 /Td˗J7B 4Xx%R%`SO=^zIjСCնmlm@�@�@�rV9[�%CQލ!w@;O]tWiРAT<<$ڏe,~6}^wv]v.Ryl7nk-_?ǣGwgj޼yi~ �h޼, mE; � � � � � � � �*@d8�dUGYc=@ wnQ[ySO͝}XJQC'A s=3 >| V6*sN7`Ejٲw5WӦMUzn C v @sz?i֬Ynо `ssu-vYCb {~g]~߿5k Q7o4_yϟ_<nv7*[@�@�@�4>D4cXn{رc]ޖ-[TL[4iD Lg+|@p<g̘A8[nUٲeվ}{AW݃p*WfEܹ>fge}K||V .  @X nj,К� � � � � � � � � 2f�D�"Qyr#+K/Ҽ,^,կ<haÐTfB?z]zL&&&jѢE.B!gϞ[()*`38C5 \Fضm~hp믿СC*V <֭[B m8ʗOX~]wSNʛ7o<{ͳ!C7TѢE]wεm@�@�@�%`v;;4}tu[j=pSNYbɕ[̙3o<Ydug]vnj|c?,v3n8}7;&J(;voyE�3G}T}pC@�@�@�@�@�@�@�@�ȴ�A&c@ xǏ#@ X]ފvҲ ̟/op{Rڡ {L`P; .:Ծ}4; Ν,X`|ydm~n`H֭… kW l޼Y]fa|oijڸqc75kL 3fkҤIZnftMRJ`8M:ujժ% [UH � � @d p?6_~1c{كJ%ŋO,p?U?ǷX}i*P{S-pڴi ~8q <y켧 �{ァ>}<F @�@�@�@�@�@�@�@  C@�`QA@ G,�˖U#d#$0{Բj|ǎIIvIޘ^/01 +*9r`e VXG*?^-N:.(^-f͚nbs6Y Xأo6-]Mxi6}vgLڠATjm0=;-[^aÜ9眣ݻ[n\r6k߿_cǎu_}W W]t=fQe@�@�@ &=dX9s܃xa< .t} ֿZF קmwt!3;}Z?%K~ʕ:ݘ4=3t=QF*X`+O @�J`̙pU?B!ձ2 � � � � � � � �!@dd'j��r !�9&[ᅲ $ AGuk)!A^YvÆsXˣXJ>*=`o<L7wgP~8֭[j]BYzuUV .F6UZ %Y7 +glMf7^Zd-qϞ=N&o޼]jO6h +�O?T_};&ZRΝuꬳR\\\pv98qD?XbCW^y7� � � y܏cm5؃N~W7Cxls>|5\r.Ns߱(/?g';ݾ?~9`A6Cpl~h퓋#K @�زe;L0 Q@�@�@�@�@�@�@�@�_ ?FQ('C�-RR /d{sl�tO?6nTRe $=4oT^U.sN7hlYߪU\߾}jdAUS*W즊+& X_ .3!}vmܸQ6lp?vZ~u:tPRʖ-j5kt p HZXBZ XdIkM ٴiS*T(4^-mgϞd ߱ES.]ԭ[7ݰ* � � @p?6 UHUȑ#?(XZ?Lbb[H"Ih{Z%t{Mcg=};n~g:up!8G/_5=#�D@R3Ϩo߾Q� � � � � � � � @n  A  @2=~~U^P/E SJm OʗdZ "|Û7ov^@X{AڵVZ`䩧r%Zp`2eNJ.-̔? ؀;vh֭'M[lM6ɟOhXYg%/6t38=(Tk.ZBZh̙3e LoԨ,^{6?l6~wo3g~,XЅY袋ԦMBHCu_@�@�@ H܏ , Cw;' >V[ I(Q"A;wRcU{%c;>RQo N>n/cPjUiI>ըQY@ -ZB[= "� � � � � � � � Aq  <O@ F.\;V1GP$/w S;J xyb^xGXì<|2�[ pbC`fl{[6TX1)RD R…ݫGBILLԁ<-Φ={$޽[6 yl@]@&u 9k �g �ΔX|f͚& WE;r)Wl` zO>9cת]o-{`>X!ի]�$;v ]4i-[q A`}@�@�@ eI-0Cw<awg}3g}8~Z&OSWWIއZ@7ַiLDWo^m>m۶~&Om~-BM{\{(}gˡ � *k-9rd~@�@�@�@�@�@�@�@�XFG졣 � �,`;'2cJ\\՜K=&I]L,dVZn d 68BlP ȵ)`]ׯ_hA ^%X 4⼋;ۦ жѣ唓 ޶̩6lς/mgiڼ #%3ey\# @H,Y" a3f gk6yk˂\0Xe]+v>|8:kؿm~bAC'۶m^&/!ɵG�@�@�@�HJ*)6XߨBݱouժUI'Zez;~P$;>QJACm>_k|| }~?d}@�"Aef( � � � � � � � � y 3o � �d[ I/M2⍓D@~ҨQҵJf 1ІDXmPM5kR-҂,ҟ/ 0&PAo\ k3G C"2XjOpQڷo.z[vlْZcG��@�IDATG?_^$Woe˖=i|� � � �IJp{HFfZB&GMOW4R3uꩫN Q4_j6كH� @ Xʕ+@�@�@�@�@�@�@�@�V6� � @SJCJ~()r|@N xyqxc)*`&MG ІXɓ̦"=ǝ@X8iݺu1 � � � @ XpM˗m^nn8 �1!PzuڵK0.{@�@�@�@�@�@�@�@�,� � �8|XGE3[c}2'pXg84瞓Ə:R^-LJf@�@�@�@�#@�QU»@�@�@�@�@�@�@�@�0 2  UB�@�^ o+FZqq떘uf |tKKE�Ai! � � � �d_ @�|xIuyʕ+xE�@�@�@�@�@�@�@�@�� @�@�Ȯ ҀHիgwk@=uY#JF:r$Gr_`gEA�@�@�@�@�HG tp @�L (P@+V$2n,� � � � � � � � y� � @. ')#. B .)mD /.}=Ddt ^-Ues � � � � @ *$<e9 �PFZjUk@�@�@�@�@�@�@�@�L|Ymj� � @d L&}嗒 .  {�A>6~[jY3w쇭R||ו"� � � � �(X Po@�Za@�@�@�@�@�@�@�@� /${a � �İѣҝwJ:H_4=qqǫ`$%zzx@GYJl ]+Y+Ayi5 � � � �.@dV,� @ nXR@�@�@�@�@�@�@�@�@ S24 #� � @ ~]1"ӫ9*8Jt (-^,u&͚%ը]5 ^}| 3b @�@�@�@�m cz@�Rr~l@�@�@�@�@�@�@�@�(_ H!� � "ۥG Q%-8zҊoIsHSJǎyH| ykԹm[$gE`P!S6 � � � � �#@dkZ� ;UVՖ-[t!{A�@�@�@�@�@�@�@�@ JEI;h � �a)0p_eT 8 5n,m(ot_agub8C?] -*-n-]z4q`k 5ΊՒ7J JA�@�@�@�@�H[ > @�rFc'׮]ZjF  � � � � � � � �1 7H@�@�5#=TDHNcXP!U+iAޘTK\ԭ[_a T(#t5ѣ% Ҫ� � � � �ĔAC( � 3Uu^ H  � � � � � � � �.@dV,� � @,�reoL@>RZN,(wF@7H&H7ߜ9 m A � � � � @`AR �*pꩧ@JHHtC�@�@�@�@�@�@�@�@�O HN@�@� /HJal�>[Y3+T4I<6m?;'&D�Au- � � � �N ٳg@�ȓ'*x`Æ @Z� � � � � � � � @ ,E�@�m6zmZzoR^uUi t$}=ܞGݥOO"K1)!AzS[@�@�@�@�@  Ib@� ȍ7Foi � � � � � � � �AmI@�@�bZ`diX^i zILZ9|XԾhDkWRھ]2ϙ<M#G@�@�@�@�@   w� AFu � � � � � � � �ͲU@�@�bWB:w??v hy+']z/�+&m>u&j^+ǥ:;^X^Uˍ@�@�@�@�@ G@�S <. @�@�@�@�@�@�@�@ R S;@�@�Y`hiù-nU[miD$AgO)1QKzC)'`AvTSc@�@�@�@�@ mq�  9mڴXh*mD�@�@�@�@�@�@�@�@ x1J6� � R׮R&h >]$yc.N(GJW\qGrkHkD.^,nDq,R%)(n$MC�@�@�@�@�rH ȡ@�pqF4@�@�@�@�@�@�@�@�@ AfE@�@�HO`XilG[}Wʗ}I:1Cz5)Oz''/`A_Oj� � � � �A<5 �DAn۶MF@�@�@�@�@�@�@�@�,@d< � @<ԥԼy촙F7JGC^pTXԟfO`ѢGHZٺUzԾpX p?F@�@�@�@�G 9@ zʗ/iӦi-A�@�@�@�@�@�@�@�@ A#� �Ć ҏ?J>'PǸu=@&nԾw6,(͛^oS`jɮq  � � � � @Afl �dVlٲnB  � � � � � � � �$@d@L,� � @?.u(lr|@(,�v eMwn XdÆǏ{!~(%`AUgj� � � � �J Pɳ_@�h(SkA|i � � � � � � � @N =@�@�bM`diSOڽ{٣0?zi6%z>,S烮qqqJkʛ7ow P…UP!j󩽷ϊ+lyJh:K?^ZBzuiPi^رS9" "jNMLHH͛m۶^%|M>yK-TdIr)'L+VMvrٵKڱ X>h; � � � �dNn]<uX@�(]we˖[@�@�@�@�@�@�@�@�H 2@�@�&0htR6Y[[`?] xغulނvx n6rsNxR);!h,X`RxcG?Աjz]@m>ypdj~AoDOKLXBZ_Rd?& +[ʔ)&/Wʗ/Kg|5>^zIZ@N%%?yHI#G *oו+Wj͚5Zz6mtF<n灝mY;Cڹ_#v9;*WxUVMv6l y^� � � � � w+k>>@7r�",� @$ؿAA�@�@�@�@�@�@�@�@� ̉@�@�HU`BixoSXBܴ~z%6l-/ec"E-�jz }C- Ϧ%JW/\ Af,^,Y_ݺIX%v,w^g6YH?o߾mz X*UtTjUd xY#!%&jFI3fpkiΜ99sxIv,;Iիڵkm۶.mpO;Vvg~켲oݺu.pB'ӧkժU^[eVf͚un:ӽ߻�A3@�@�@�@�@ � =Hm  �䐀= d3 � � � � � � � �1!䐘 � �d,K^:uxY,;wjٲeZrVX^mۻwoR,1yPa:uTB C?Ђ,xx9Z,Ά-H矲�Muƍ`%Khʔ).p3yhdѢEkԨ!,X^O;4,Y2;Պu:Kz}ޒ^~Y^f}4m!Yرc5i$YݪU+W dy 81ɎqjΏEB/,ֳP:x۝T~6Qy9^ȦTXDU"� � � � �! 2d@ D!� � � � � � � ��A9@�@�bIˬŤ^l2J X˓B-]M7oNjY\լY3UZ5iVJ*,3Y*U)-رr&$$ȟ,B G) KrTvm7խ[Y_Zd!x_}I#F֓OO?Uoҁ:? O[Ö΂Y:/v/.E {DžZ dnԾ}<'Vw<� � � � � y@FK= �dF vAfFe@�@�@�@�@�@�@�@�b]ԋX?h? � @~[b^Mb. X`… evTի38ŝvi. ->iSFRelٲp &hn k۶Oe޽5j>#7Ny{|{\j$XgӦMtѣ={k7|7xCڽ{wSs AFI@�@�@�@�@ ~;D�@ zJ,]vEoi � � � � � � � �9,@d9@�@�8vL:TK*Z46I\vf͚9svӖ-[\*W sׯׯ K(IMXp駟٠ŋkѢE_e֭[-[lR``ղeKUR%f%K\}]Yf[o.S4_qqqjݺ{1-_\#Fp믿:u; 7靦@�@�@�@�@�� @�ȤcްaC&bq@�@�@�@�@�@�@�@�bW =@�@ S n%a8r z3f7o^խ[ׅ=jҤJ.#e#)`O:,7%om4|͛7MFҳ>DUTIZR6mts*_'Nt5j馛dAXjժzM ,kͥ{ZjaIcA=zeը � � � � AaR �Q PdIܹ3 ZB@�@�@�@�@�@�@�@�N#� � I#/ Nj褯 Gܹsev'Ov{Urtg뮻r!͛7WŃ\6-r.7mڵk;fϞγASѢE]0-YfW ~A<>zhuusr7СC5x`zozpʕ+bmաCƍR||- � � � � _Ae �9)`f@�@�@�@�@�@�@�@�L X @�@�$>|2#f,a3ƅM4I;wT*Ut_9眣:ul>lc6?дiw_WUdIإKuY+Ve˖ƎjmTJvͬo߾6l~[s~a.\8s雄1Z\!A�@�@�@�@�@ (84@ , B@�@�@�@�@�@�@�@�X o׍!� � ^zEM,Y~Z-ZPʕuwѣK*K@{tM75G=bvٹg砝v9rĝv9k9r!/IqZv 0a!80W>}+ jܸqJp]vン}� � � � �D@B[u`46!� : CgϞ@�@�@�@�@�@�@�@�"S <n@�@ #FHmJ*Qk 4h5jziСjݺ,n֭9rn6viQ*@"ME;'ܴsU;gܵse;믿Yfn9o<wy]ٟBZ ŋղeKuI7x %Xd"Rr!�E�@�@�@�@�"P`&2UF�k <p{bXW!� � � � � � � � &AɁ � �!pҕWFF}#=O?T]tkcǎ3gVZ_~Y۷Qg;G\s];\sm;\s>W-TtiY ޫ|{1+jꫯ4zh5o\K, I-Z욝"� � � � �+P Ȉ=vT@  .*o߾(C�@�@�@�@�@�@�@�@ L A5@�@�"CݻK.s-l٢jժdj'OvzVf¹ sB!'Mq;휷s߮`~Xz]wݥ)S`'ַٵkW͟?߅mlR}Y#n! � � � � qqMFt3< �a'A8p F@�@�@�@�@�@�@�@�G P'@�@�=Zj@^=l۸qnUVMiݺuzԮ];ɓ'@Ȍ;\s}Zk"ʝwީg}mРA@Vo$+%h*Ura:uMƍ ھRΣԾ3@�@�@�@�@� ȨJO@�ȼ̯ � � � � � � � �Ġ�A1xi2 � @&M:t޽{տլY 6LK.=ܣRJ2 m!;휷s߮)Sk® FS|AOԻwlu3!P-<|pSW\qf̘Ago� � � � �ĢA<- �OPBnAϘ-#� � � � � � � �D�Au<i  � @n.??;M9RuuaioϟZyIӬ ܷk&,HЮVR> 4Ho.lu!`7TǎڵkV=vLJH 20-B�@�@�@�@�N D!�  v!2'4 � � � � � � � @, G6"� �nձcgpY9XȾ}t 7Gxb]s5ʓ'O,46"] vMصa׈]+vصhY|n6{コ]rX -lٲ뼿^Rcˆ ҡCAM#� � � � @ !�L Ȑѳc@�@�@�@�@�@�@�@� 2BF�@�}E(_:\ڵk5d]r%z駃ϟ~I_jʕ9}ٚ6mf͚˅bl\pkS.]{=jܸ6nx2ҥKէO5h@۷wml۶xkgyڵK=Zj宷Çk6kŮv5;UF wj#lgwְaԳgOxXcѢEch fY㳾�ze}#AX3ԿAhD�@�@�@�@�0j͛5tPw? V}W^ƏV2 �#PP!؃Ni) � � � � � � � � 2x� � [^^j1cJ7mڤӧk:zhP9qDnZŋ׫* �: NYf;<,YRsU&ML j.Ҳe{_~ v۷/(>3^8ܮJ5j;*͙3'w#FVZ9s4C#S@~h׊]3v5dRz~رcGOoјȑ#+K/_~ѣq;z{1oAqqRʙۃ,eժUzwdx oxX P @�@�@�@�Te&[ݶmLݻ7uaoC2G�@ n`z%Xa@�@�@�@�@�@�@�@�M h;@�@ h Hمm޼9h7ܴiS˽]Nnܸх5nX<WB>>߯K.DժUsuhż,rѢEʛ7oOu7{˹oڰat:uD'O;+0 'Ls?Xڵsˇ~C˧CԙA® wkk׮k*/B#)i <裚4i  mܹ~ܸqioz!w|YBƫ͚J 3^vMo>iU޽e­7<< � � � �伀w+' H_X[nv7n? aE@�B! C>@�@�@�@�@�@�@�@�"Q Q"Q:#� �ļ>tee!qK 1_S[&1B۷oM(Q…@Μ9S ,2 ֭[矫PBYBάRT)/$Dl,[s%ٳ]s֊/Ʈ"iǮ ;XB*^,ϿƪV֭[`P[ڵcЖ-[dTjB[:|v\UŊu'r-n~Ȑ!ILʕձcG}G9ɓ`ڱyzع>eʔBNX7<f � � � � ;A^Zߒc ~U=d� @A_@�@�@�@�@�@�@�@�HTHӧ � �#x6kVLsƌ뮻[Hޛo 6Tnt&-s+~5jH?TRegyFӧOWKH7rHiӦ׿%K&m'o-vgx QFq'|ћ76ZZ2e2Z<hߛѣ>svB K믿V*U4p@UPAO?C 8|WUXwqx&o#G#xm;ǶA8?vX[zG;g r}s=c*Z?IZ觟~^:,Vg? aeZh! bAe˖+ێլYS^z Ƀm{v5p׮!;'-_~MiӦҥKsd~޼yX}^>cZJ\rA{W֭~Y %KOv|/^ ]vYpg޽թS' _횶@M=?m%;횶B>r:Վ˃>BSgX�ػ.xΕ~,͹]zꩤ=mڴIÆ O|Iߧwl {o /BX:3fmy智+܊=~[7ɎR<Ol@�@�@�@� nݹv|7`(ꫯv˗//?{9ׯmv{> 6{_ ߧu(6vfJLLt xwX)\ Zjowꪫ\X߰{cv\BBd}v=>sIuL7i!f@�P �X @�@�@�@�@�@�@�@� ɩ� � @�^l@XŊrVeP1 z]Y2]t,ֶmԮ];+W΅ڵ Ȳo-{n7 /@:?.y N:Uh"7??3lrY-gK^/ lH9 XÇpcǎ;k.ToϞ=/l @6mڸ0H D N?mr<SΊ) Z�޹Ixe %XxXcuV1駟\ \F+]ҥK-hW,XG&_gϞZb~7[+B>ej+Pi& r-HB'- H>o >߿ ><Bj.wuں[OyV\E6X=#;K.Z 9s֮]+wwV\ Ⱥu Bdj m6 5crJoaZΝ;@ӛn)[g+z67'o A9]m6iFd7.sAy7u \] jl-JzB-Y^=Yȣ0 |]hCڱAv[`_~ouvoEj>O\E � � � �ČXuwPm}\s'|Y=hfիW/߻l2d߲{ m۶u&LWVһt-zؽE{4ic=h!VzX-\\{j߾3n8ׯAh^@�0 9@�@�@�@�@�@�@�@�Ȝ@- � �ĦUv :eg֭ڀs9YDZH_fgq;hǎ.˂}Y͝;ׅf*Uj|n}?waۆ . <lZzW_}M6ͦ Ղ,` d^6-%/6H/w=n]?>A ZfuAf%kfXٳ݀ (|RZ(5ZR,K+-[tYٲeOX}@OW:u\cƌqAyUW%Z=-$B#cbgImU.vbג]Svm,;dA9]<6k!m0?o 3:~ZvWJΙ OYnGm?]6-6nVAu[xH{q5ydY >%`W �X,o6cVxZ`hU � � � � @>ܻOr:wdc8PO?TvJ5jLjԨ7هoomՌwddVV4iWؿo_` 믷ұcG^߯  �dF h, � � � � � � � � � �+qTElPW5/҂,Hkڳg.䒤m\|ڹseF+=\-ZTK.u^uU\م˜uYnxYtQ]qg޽U۟|۷/黴f,pڶm|ÇVH.QoKjYph:ٸqc7N6@۷['<W^.%-/O^3SJ;-B--[ gv8p iW~0]Ks]+Zr'4i^zI]vM LZ)gq/˂^{5Yh,;~Vlc=zp6SN@:_�R0k~_;,$4RdIHbbIFe] Z,B9&3%aÆn�+1OX]@Zcww.YpN\z-7<퓂� � � �dW}EA�0ش %&p#Wb_|nᆤR[T믶bV֮]^oSD S]],ҿbvҲJ?xv_gZ=\)!!AO<>#Ww? �O{ڽY@�@�@�@�@�@�@�@�@d&|� � I[He ozgtObMI$O?[X#yuɒ%_sI-Ze˖_~nU hK - 11 Ub)w Kt֯_ $}r<ڶ-�rܹ.39ɗOm>3#ԶN=T7&u<xӶi!6qĉ.>[xWu[]}nUte >PV+ . ڶ]KvMv=~6ZJm.5k$BdtB'c_G<H}HZޔ~췻B ){ؔ+W.J/֕ *;R}bA~[V.]];v=-qذan?vaT$] � � � iY$Afuˏ 7 ì}&Wu;6~AZ4hZn5j(dB)cu~]СCUvm-/- � � � � � � � � � @ àl@�@ :oN9寶Ym޼Y p_97sN2f֮]~z\C$m()RDvrRlʕ/<{կ_mbŊ'ljݺu} N<7gu1bD 2^{J*ǽݻ|v2:˗?m:ݻг2:'l$7YOʑ-G;v&OkAѢE]kNz,/LrEd DEAPQQD&VEvI氮+ʪ׀1 A J I 9̭qN9<LTU:=!qo<ԥKPQ}J+Y j*s);2 WŪX,}~j_ałr3;v~Aߟp >7n޽pum(Ӈ? H_%իW!¹&e7X9s_#lJ+2Dݻwܹsc`ئMfn:h'  � � � p/ya@ Z>_7|ow9{Yуiܸ5kwyOvһᆱ ߯r߼ys+hy7{n � � � � � � � � � @."� �aSѢlv|`رcuI',.T&N{E6lW_שSzsqAGg|e5TwCI&AhVҊ+6nܨ={[`_x5 .a-*TP^4p@N6ɶ ��@�IDATի5x`#kjڟ/}ٺdAtݺuz,ޡgYNH5ʇ@ioW,:w<3gN-[f]~9s_f.?:vÆ \sέ̥e˖~'|yQ> Ӯ{9ס�Uj�mifj_[iokƌ/] \|y,_+Vq'LVʂw-4vppNbAIիWdwMUf#wku=>K.~߾}eAٕh'ٵr@�@�@�@ '+=$'k@0`U_gq^oVr;vo@v 0@veOϲeU!r}Qk^vU,C�@�@�@�@�@�@�@�@�@�^zk � � YI ad駟nfi{W]t*_+(ز$7 <ׯ_oY}Cـ/B7tJ(w}W{{9r-+SEM6-ɂ-B#s>+V̷?s.mmX?<gVlْބ+^,(—dׯ_츰pD ޴{f o3gݺu a<2 Zrjdɒ7|KӧOמ={{|Ͳ&L#GʂQC~iBRܪ_J.Z%ǯc ߡ/[@~~>pK}}衇آEj1v-[6:v "~oX�iN]X.]hӦMcLJ60w~y֭5h $تU+j֬Y7sm߆ʓO>+ tZk4e`\EU\YVN*Uǹ }5߂^m_j:ݵzgBGs ]oBo,� � � �KGP _E�۷V?|*;ݛngUw zU}N~ު@*U?h~ӳzoZK~ >֡C{u3� � � � � � � � � � @K.M@�~y=C�Ui@oߌ{Gn XS\cSO dSƍgpgr6lj `3}[o߾}7B.L2_}૯M4)Uz k o*./'}Yg׿jEpAmpZ-*[.@/BQn`^-Zv)Lp۴ipB~Boڟ./B ۱aoo2R31  ,ۯ]vohSrFw|3f΀d?3ٳgَ%܅xLO>9tҀ ԨQ#"db;w\@\K..3樯+йmmD'ON_Ņ+5k qp}(9c玝Cv<gU&NͅfZުU}u\kgMˎpu=zg`Yj_Q;vHGNg\ا5}X`AN\@ovޝteb3<pAkY]Bkx7;_CvZp??[jU `֭[cF\vek׆L]z?PyWf^u q@�@�@�@� [>I 0fLn KO){ѵ^p ܃һcy Zj#F{=TbwgO=~6v[{KzmxqJ~_qA{W^;FiuXox#� -bnX@�@�@�@�@�@�@�@ l?H5X[oE:*A�@Zd.]P9U"�I,pROsQ Bti֭<c=.͛7O۶m4&7@,lip ү*'v&إ:*z/\ͰB.X\pY.y]�:vVFr.ٸqʔ)sHߜϜlZg>g֭[7R�JܹSK,(;*V"E d G ]M+3.xE\6u 9B2rJM6M.3Wje*={ꡇҚ5k'|Z}g˗/b3_\pjעE:yŎ);í">4Ç˅f.rZڴ@_|75$sk;\vھ}J*m_b}d!V@�@�@�@�"aix鬳!@\=tMU|+Zi;yîs;i=3H{v7{[>;7Ńr~d@�MA߽@�@�@�@�@�@�@�@�@�ڇ @ t B� ؀zgؠ Ae\;/`or^u_s .N ѣGg-N0!uZ6߻whءC=sd!=\B$WZv,0rw֋9tP=ú+ݵ aYBa6lzGZ5ƒ /XXPC ,_?/mS4J RVդI-\uF-D�@�@�@�ȹYsrҤI{�9sN99$։m㴆� @ ;C�@�@�@�@�@�@�@�@Fe � �$@2ҦM޸;χկ_ FQQG#FSNիW>.rE+ - 7֭`3E=9,mwf0H {<ՠAϟ_? u!VOR4`*:ߴiӃ~oZȑ#]@[o%7Y}Yu]'||nذFicꫵ~z}gQ%<TbU\7|Su0XPY.͹lٲZ � � � @ލ"E�)`gg'WE܅좋.^< � � � � � � � � � i.t"M5X˭ �ĩ@ZdiDA�ȅ7J6fL/=Z\rIݿ/;"[}v=?ڵk뮻HT8_y?ڭUu9͛'ΆAO-4… usXb]I>r&w̟?_4j?O1=z-3ca, }O6 p>D4$UuviٲeRm� � � �)0goszⳏ 7xCW^y%YTPAWb !� pp{(fm � � � � � � � � @^R@�@�0JENl?7DX߯nM=z|w뭷nPҥhkٔZj%ٵkjdZyf6l@yM7iرGZ|Am۶M]SklӦ ݻ/ f5lY%DgϞ  � � � @ ۝)w}e^[nڽOTr1 � � � � � � � � � � 'UE�@�@ V/ONiw-'t}x#<ʕ+{/ ֌nY]ѢEQu\ivl1nǺh瀝  mO?~kE9~-F[c/؊VYg1c}Q>:M� � � � @.v ~ \±:y `{@�@�@�@�@�@�@�@�@�@�< 2i@�@ jԐn֭K^w_˖-O+VЈ#zjmVwiӦ;c؎e;ضc܎u;طs eСzSOe˖E?TÆ i&M2E[jb � � � �R`۶JYb.PÔSA@�@�@�@�@�@�@�@�@�@��A � �@+͝Y%W T.]n;VM6z{w\ZqɎY c؎e;ضc܎u;]>Azǵo߾h7[W^;C:uԩm c !� � � �B(Kbr%VE�< H+w_@�@�@�@�@�@�@�@�@�@�X kqC�@�HHJ2e3 UyϟoY}>ls1ԩ{9-Z(a&vLڱi9Y;vcَi;c],�rڴi{G5ĉcݍiς>|Iխ[WSLј1cK/AOdRl � � �$A(!%ƱI$�AIC@�@�@�@�@�@�@�@�@�@ LF@�@�FY3TlN:8p~\ϟ_ Pڵ}^/jH6灀kvٱgv,1Y@ڱjǬv u)T,r֬YRڴiUѷ~]K-�k^4{lo>Oarz<iF@�@�@�@� Ȓ%Y An � � � � � � � � � @J Hg@�@�ȅiI/j*VnO״i_hݻo߮rʩEj޼N=T5mT%JX(mۦS�5ydn:+Vg={tgI&x._K7֯ߨǩe˖wq4̗Dd[ݨ_~Y?V^=z讻Rʕ3H+VHժŬIB�@�@�@�ȅHd.XAڕm@�@�@�@�@�@�@�@�@�@�T 2>ێ� � +m!C%KWY9gA6Y(۾}4}t}ך4iz)ZJlWN5nX5Jʔ)PUlܸQ?f̘';~gp{*UWV1U@b;4|xprY:ܣ5th\yu]ώw!7ղe&.=駟3^SZZw~z]gh]\_"U# � � � �DR`&THH] -Pjz@�@�@�@�@�@�@�@�@�@�Z 1+"� � -ť1c=c$@B}_5eM:ՇD>CZ~_VretIjРիudɒ9hU]`֭?͛ٳgi֬YZr4 BЋ/XM6i*U$fgI='}d٧7 b{>lv9l0{\P乺9xb9O3g 'x@]w]\]- A&)Ig@�@�@�@ 6lxJ p65LG@�@�@�@�@�@�@�@�@�@�H -5X[oEFA�@Zd.]"]3!�!dѣSc{i+WX! x MpBٳofJ| ժUOkE&EoΝ;d-Z$,X WZ巿PBk'|rTjՄ7_j:x饒,um|M;VSuW;߿_ L~Mr.SnԲeKww8+.N)%st@�@�@�@@'g@�xX4$wX͚{o �#`bb4z� � � � � � � � geF�@�@ lg~˙s )e C ŋ5o<͝;ׇΘH/\InN> cwqzU_ҥKL6o, iui6Y&g6kN'xի5k@_b{_*^\`�dݺ +VLW]u6nܨQF>P߾}ճgOwUVj޼Wm񴂝;ydM0AƍӦMdy~#ޏeˤ*Uc � � � �K   {{w~!� � � � � � � � � �$@^$b@�@�JK޽ѣnkt0,N:~N.�R;V*RDzjٲ~A >}ܾ}{zGu*U>UXQ*TPe!c9 6ӥnذA֮]jW֪Uҧ;v -ӂ Oq#;uC;kԨ5ӑ襗W;V^t @1sGG~ڳg[3Ƈ'?*m͚5Sd;#;>ϟ9sh֬Y2eN*TR:u�H MrO]xe""� � � �%`Ae˦6$d Ƞ"� � � � � � � � � �^ ؛" � @ \?o/*A モ7G曥c9ʭDM4ƍ} + W\,Xdw ߷H Meʔ^mdɒ*QDɾg!ED{x( h!vm۶ ֭[yf?mڴ)ՂCSxmW4-t;:M B S/}I0B ݥngXP!nVl?YwiZl?6֭ڵkj& D}uA֎Ov%#&@.]TP…qӴiS]s5>�OTZZZ2n]iv#� � � �I/@db60-d_Lʦ � � � � � � � � � � &! Fw@�@�R[骫$mFI`I}^ڶf̐N:)gdv6r)Y~֮]uilW[f/NJܲeQ  y,/YN˭.]B5iϞ=>BÃ-2bjYʥZe(KkԨ,[lkr|�d*<fg-^zI1BZZ.Q.D.0oGvy~ kܹ3g]d&N/d:w/W;fCvvQv^bAv_+WvL]{_4hZjՂ ]%@�@�@�@ q}kCA�_'2v]D�H8{x&@�@�@�@�@�@�@�@� 2{#@�@�@ @ǎrvҋ/JfXě9Rߤ4魷.]P]ݺus]| 67z؂BW[f́ z,82(i,x҂B!W Gl9%nw_}%v(]wtR/߰}ꩧ)s;vXZcduG  !ՂDCR赂Q_R%*ł ]%@�@�@�@ !.V*V 'ķ{.{Dd|'z� L  � � � � � � � �d/@dF� � @En~Zǂ2,M ,_.)}ԣ#Ri P\r9z/^}Uz=e"ʂg?Xj>8 5* GR;k׮(6UX LF"� � � @B Z{v Dpa=ψ� � � � � � � � � � @˓Vi@�@�6iZ7|CRÇKK"M(=||@nI oz*W;/x|>z$fdJ(lZ^=ʟ � � � �%` DZl/,r` � � � � � � � � � �p� � �REUz {~c-`7(}ԯ4hd(} ޓFV zԭTV^6]`2)-MZ5{J@�@�@�@�XJP!x'5jO g@�@�@�@�@�@�@�@�@�H& io- � �1WjX0K.i4 >z l/*شI;V` ?yeRjjV ˗IMd@�@�@�@�TЛ@H9 Sn � � � � � � � � � @\ W � �$@ÆR׮wK;J'RvIuIO=%(ƇҴi1cɓ4ɂHGbf+H  ^=1J/@�@�@�@�TX7 2G�@�@�@�@�@�@�@�@�@�] D߃@�@ O N<Qz+4&dte;H^Y$`A}ƍ6l*Uڷ{TTڤ 2w1� � � � .`oZN@")l. � � � � � � � � � @7 � �$@ 7HIݺI6`}$u.U&M&լ $ } i"hQ3 $e Ίm� � � � ss+D ^ &2^@�@�@�@�@�@�@�@�@�@�RQ _*n4ی� � @$,r&"Y+uV{N#2K~*yԸTtҌR׮k1R>!Y{4w˗Kի;� � � � ;u(M� 2ԁ� � � � � � � � � � p|@�@�+JKHW_-p2رC`HK=zĺISH.߻W__jNڴJJƭgR`@cժCG =B � � � @+<#$ϟ_ڲEZJڽ;8'[r"l}D�@�@�@�@�@�@�@�@�@�Hd yw@�@�6iW/[)ё5k.. hFFI{~im ~m[c8"&I_}#_>gO'5ǥ \yT`uy� � � � [?m  @ ؽU{>ZdL(r]u(K2~;@�@�@�@�@�@�@�@�@�@�"-@dE@�@ %痞yFjRz [dFϚ%]xT4yr0-杠'u~4cTtYH+ծ$5mϞ?:~dA6}Ժt � � � @Ttpʛ*d'`}dTԾ} � � � � � � � � � �G*@ }@�@�_3UKjFXh L(]tԸ{R2lM`z4]@KUH_,  0H y%pC 3B _@�@�@�@ ,F<#@|ۤI=x`vyQGl)!� � � � � � � � � � Y|@�@�HmG c3B ,[!Rݺ?>M;r .L=Ѽy}ȧ zM"� � � �B k֌EK�G"pR p, % � � � � � � � � � �DR HjR � @ +&4f<GT�_QUz P4CI"kkZaä֭7xԯ_=H>$f$@rRʇޔ^% � � � �XHoK/aPܿz� � � � � � � � � � <A&ϾdK@�@�DE ;;/N%I7|S2^O c3".`o=wuGK|"\))+VX}xT@Z>5ή{MH@�@�@�@H췀5�(ZT*`?d!mHKy � � � � � � � � � �   J � �)/0xTԵ{wsDz}VJKHTd&H_,թ# e]B5J:|iɒEyVIZD$z6'N?׹!CiK@�@�@�@ VojN7J{|kt9|� � � � � � � � � � @4*u"� �@[oII}</u&tG\$Q#m[i&R lp]Hk-h#=)ıAۗ]SN f\;@�@�@�@�X02Ayh vZanH:e � � � � � � � � � �DO R3 � @ 9 .  KqS.Dzî/&޽ҋ/JBO8A6M+sg)=i$5J>[iaUy@ |TPnX? � � � @ ,X /.Uuȹ7g !-M:Tcs^k"� � � � � � � � � � pA G�@�@ ][nz.bET知ϗZ^yE)>ܿ_z%ɂ1o4rԸ5飶m۪C^%ĉ@RFtƮK;s � � � �y/`k~ȹ5H۳7=  � � � � � � � � � � F%ڴ� � O<!թ#u$mۖћ7K]$ժ%dhAo)xtM9HI/ JgK2e{챬Vcq%pRB.8 q=:� � � � F�Gc"�H+I;@�@�@�@�@�@�@�@�@�@�X +iA�@�HY…Q k,̎u&!tQYsQ#骫SOϗ^V-m߳g.w]pPH%w*--v@qt@�@�@�RJ Ȕll / __:$86@�@�@�@�@�@�@�@�@�@ !LD'@�@�]JwO? J~ 2YBۣ5K:<sW5sZz/&q `AV,@x` dD�@�@�@�}_~ԉȍ@Gq&"� � � � � � � � � � Z@�@�@ ;-$GU:s쾑_]zQWfRӀ~M.iQ#iMlڴInvUZ5 "k.m۶OvܙaៅٳGӁCZW"Ϩ`=;.f|BThQnj{o/^\%JOA�@�@�@�8|ŋ{ <|AJěнW{wN NiK` ~kgeƍo嗯TZZ!'/lg T܂~ }Vpa\{ ~mo� � � � � � � � � � A&~e@�@�Tছw?>p]͓n͛']{M:}46h'!CҥW_uxyx*? VR XPo.utݺuZ~6l'߸q6o'[lmqVŎ@@FeRSjկ i-x24x:4o*6B!K*ηҮ2>h-[Vsl\r:czY2@�@�@�@ U޻S'UL{�ݺuDZgcm߾=5|>bJCC|jk}W*=V>{m%W9,kfӆB)q|}(ҾbC)V:(k}zPWl}%KW{OA�@�@�@�@�@�@�@�@�@�{ ~@�@�x)iB )S*UR KAh]dC,0nԫlԯ\x_~EÆ sO_L4 q\bVZ1^ڇ?]Vml(^-FBmЬM6`64zǑ*}$~+7\WiCC6;4o!K_Nӧc b˗+VTJ2LUVM&IA�@�@�@�Y d W^h7=}Ѓp? ?ڽCZТC!`BksPࣅ歭XѣNގES Bkhd~O?zMϻf͚`PHtfw(2Ân3p} Ռ !� � � � � � � � � �I*d$b@�@�僽Ԣt7Xa[InUrljx9K"u(}tqG2`�+ɋ-Ғ%Kdj} N8A*TH2 �eoBX e(p c0o4C6؂5gM0nFڀjժ㏗MijRR[|@�@�@�s [7ϻAR@-ɭ[ߧ{uC9,Bծ]ۿu63 V:uY9Z {>5|(O>0>ٱ^v-[?X\r~k<om=#G�@�@�@�@�@�@�@�@�@�  @�@�e_}Լtc|5҈҇J<WS#Nt;4rԻdGK_&O~[|jlkٷo/^yiܹZ`.\'*6ԂsM4QժU' !̔#*U)6o8WXd!6xx;mzؠ`dnS:uT^=?լY6+ � � �ĵA6k]sq.pj*\2}ؽdg{łC{jzs裏V|«`>Bx8Ŏύi^0z4{lۼLch6UXQ+WNaNGp9@�@�@�@�@�@�@�@�@�@ HH6"� �ĥ'Kg)!r\v3rn; /|rAQW֮`>d*}Q֭uEEJꉢΜ93}5k~ܻwo֭[W't:wZj@ BJXM'|A;sNY0z.Z(=? vRP!m[=B>) � � � @< X5SK ؃S.]|r{ [cxgy-ZAz6ov@U%��@�IDAT4,lٲ~i;{^d>}~/ Hly)|ŃBZ"� � � � � � � � � @,{@�@�HHFw  ZС ݻ/Փz(X1xI⋟|"]tQ҄ r;?Dbj)Shԩ>}֯_ 4矯}kC=�YdɈM%y/`O<D?e֭[5ߥ'̛7Ogϖ6L+WڀƍiӦ:TJ@�@�@�8sbĩaAГŋ؃PBӖ-[{^= ɂl [v_4H]:3 *`1mSvłR=$^{pM59d j֬eA ̮I#� � � � � � � � � �q%@d\:� � K?/p?SG_?_3gM2P+9]; v:|?;~JM4INڪ}ǯZ&Mɓ|N:>ojRqm*SLm]~z~ {ƍ3Gс�͛3PV1U�G�@�@�@�s^ OPg1g.\-[5jڵk_mަիDY<SׯȾl۶MvYj4qDKڴinyVV-ծ]Q]mմC@�@�@�@�@�@�@�@�@�@ W� � @ "nUXQ1la~Sk c#CI3dt饒tٴa.eWw2iZӦM_|۷\rjѢzC6mʠ,%Y.pGm۶~ }uV}8{]*V,?} � � � � �py܃*"]3啀>ZٳӧyGilٲ:|ܙg5kxM^9Mf PmРh"-^8} 9Rׯ_pzeuZ@+S3@�@�@�@�@�@�@�@�@��A@�@�`4dx5_v.]ye ٻw *C%1UWIUe m޼YC wUV-USWW֧~]qeUREgu {}J-[EZdɒ,T,XoF_~}Y}*U t绰eLA�@�@�@�" rb*D`׮]5k~GYhM�+_|:T~}s97"g ď6kO{qF}B]ΝÇkҥ:p/!5j$6lN:IE\@�@�@�@�@�@�@�@�@�@�V*E�@�@yFrjBow@ /=,`^' )Z#-:t;`5B^M5O\ l۶|A?0VZH!so 7^h>s;CM4QΝd) � � � yr޾}|?O~/_^'|Zh={u{Q{ZD %,{MeΝ?.̜9S?}]]V׉'SO=O2i , G�@�@�@�@�@�@�@�@�@�/#H- � �DD-қoJI'}TBDJ 撾Z*QڳgAfIO\nIzU'n&,]>{LJnc)Z+^#W;ꡇҙgyE<od-dBi޽ʥ^y啪Zj<o }C�@�@�@�8X@8]Җ-[4i$}7~�H ~\6m.]4nd?°@ [ zmԨW^fO.{�Mʕ+}0BlOgqE1� � � � � � � � � �-p尿]?xL x� 7ii]  @ l h!7H.qCvm|ɍT߾?q,\6xw|>{7V^*M")]pA|Whƌ3g ѣG׸q|X^W?ݤIH5C=\钗rsd!\M.SN|o  � � �'o_=*ç0>O?… O?]65oޜ<O4@" X8ɓԩS{nr)[nժ+G@�x'JT� � � � � � � � @2 L{mA�@�Hcƌ(]r'RByK^+կ/{ł %z~ɪUҹJ7 6&>mԨQ@F{zg5l0m۶{^ǫuֲ;]LmzG_꥗^u]%J[oUϞ=UlDL� � � �QXD0ڵ�f+0=y?G}o?pOز}ͦMlYP=DȊia'N{9 iן /P:tPݺu � � � � � � � � � ȇ � �ħqI~*;N%Ϝꡇ3W^ ;Cܲt4yrlB O>ݖ~ ^\%@֬YVF~iʕ}Emڴ!2!]̝uYcݎy;s  � � � Y`Ѣ'je^h XZUwO9r7lٴi{ 0=dt~g掠nRX`cصǮA;]d(V5� � � � � � � � � �d%@dV:,C�@�@ 6{Oz];3GСRzYWw^hfMK @)#}TJl9j(}zc`}v}ݪQ&L^zI .wܡҥK'VYdcݎy;s ;7 � � � �! ,[V*U* X@t}4ZҜ9s4p@^=H{ 2 T"@ صB Zd$65ʮUvͲ{v k@�@�@�@�@�@�@�@�@�,@df#� � gI/,rawqֹtg~ƍo YPWd1C:Llriб+ W\f͚ŢɤlcѪS^uu+_>n$gc;윰s;W( � � � ,^,լE8ڹHN8M<Y ڵkGoT<"�-`&FٵʮYvk]f6Q@�@�@�@�@�@�@�@�@�@� Ձ�@�@�p9w>o_a]| i,0-? 9? +X`X ƳgKIcJ%KƮ=/_x v&QK;vu]]5|D[ɦ$@,ڹ`Avn9b犝3vP@�@�@�@ , >'">nVjJK.g}ݻDo@�( 5ˮ]v k]fvk@�@�@�@�@�@�@�@�@�R[@jo>[� )@ ?@￯ *Z!Bֻ8p`6z@�vij0*\9s˲?ҽJe_۷ﰂ ׭[QF?T6mtwf`Իwo=n%ˡˏ?C 5_*R$_j[lqx=n׮-?8CcfŊرmۦ)S OW_}1cO>ZBm}tGʶSOUFìGvmoO?MoaϞ=ڿř… kȐ!ܹt-ZȮjE F�@�@�@�{]G$FK }ݧnݺoSx]yy_G}'7wޭzH?̙ƍW^Yϡw{iӦx3f߸l?_r%v&Ns0x)Zʕ5h }z7t;ㅟ~ �QXfYyCy8',ZHYgs9G^xaG#� � � � � � � � s|1o@�RZ|FKF-B&-XNl K6KiӲZ3>)ը!뗳ݻׯXP}e!bV6nܨ &۷%nTe\0$elɍP&4x{l%t| Kfҏ.AnZJrבi1 mk @fΜj_D;vZϥ[_u$h]9o{;^驧J{9wa9c玝Cv.Q@�@�@�@ 5^U魶�:nisU*Ҷ9/;]?)*vom۶A\<rX>Iڃ^6o|o6C1^`nm}?fdM-`g: k]ZHA�RA~_<yoCDŋgPlYժUKgŋWJd|g/ + � � � � � � � �y%@d^. dW=Tn]|4 4`CFzD�B -MzEE o-}?~ mTNʸq4h j:ut-k1_B,oyhp쳥&,Sҥ}`v`pB?3_;w /Tj4fhc$:ڡpºժUp^u^pN8}w~6$򈳒yn}hvEH;w袋d@�?ަrה2 !eNRBI(jvE4yέ/MWn)ͣP)R MeHe2dZ8>3k=g{| � P,e}̙jݺ*Tmǚw6# Ǵ]S?~5馛'g'JygS=,l)A3ZǴڔYmYbr.h"; 1lqgFA� @۶mu5ĵ'ر;ۯ~np_^~t 7l'ܱcG\`&@�@�@�@�@�@�@�@�S w's@ W,(ޮ]ud @n XFIA',^-w[xEB+#{v'{V 󊅆}dz;HeZ٠:uh~v?Vm+m@_n[oUׯw!TTjM[ŋgǂ+_mcVlr7$?~衇T~}YzuXVTj͙cuS@�@�@�(\rEG6m?_c* +12'>3vUVMGuTvW -2_<F]הY]M.ZZ>f}hj@ dd}NjwrcAY?@�@�@�@�@�@�@�@� VA|\ �NO6xc:SC6pÊ'ЬYdgn޼?C|'5j.]VZ0"E˵kӼyT|y v_^� !ewߍ,\}gl֙_/iذ-f׮] Zp}Ygu 'h͚5z7GC%~7n{{M]f֭�+=?W1B?NY ޽{eA7xsTӧOՖ.]Zs4h!CLJU:3]|~_C-\r[~hBGt*Ukwzžۂ9(-^  l@}ݗ=im i9w#8Bhٲ.BA۷׵^+dۏ dy}Pk«`޶ڶd%㸱j*gUʕxFb-;u}F[~ۿ5jPvhO>^lZvmvX*'m;gۛrС~{$\ƍ5qDh"m֯} y<HYlT"{3;գGl ,_|fΜk?~j֬_3=TUm>ӯ:f"� � � �NuG⺬(~پ}nmǒVOZY?>3fp;`%Ԗ>G{<y?&Fv2m۶_~+9vF'uLI/1e˖qƾOE~`%Q Lk]-pqDLG}ԟ+}K.DvZXm.N혚Ŏ=5{Wvbdt-,Ԏ%ꘚ#>^prWqZj^o2C�H;kma~xqߊbz뭷1Ç륗^G}$=}$bA�@�@�@�@�@�@�@�@ G +}M@�+ A 6mׁdnt7|Af͂N:}].%p�;.)p>SLp  'gy&pT?µ0@t'h}v Tu;@� ҥAPz|rڕ7- R`gʕ3 v \dsn^p].B?8le:uM4:mЭtB(z~֯_?_"7vGy_?}]n B)}./ZDž+[n _n<:t\`p@љrƍAмy4lWŸz$ۂ B"kgnij-ڶ0vX°lֆMDvB!|.4%Hk[Hk[V>7%g$~\xgz7H783c9޽o|@Bm}ܹs}~=s|]clSLSDӞԶ5܉裏cۢݶɾvFոF>n \erە]lL0Z=yb+U[.pΝ;L|e}TkM\sM {/{[@�@�@�(<dRcȱ*GO5(~ӝ(QP1w:9ٳ@L;N00߷aÆ_]p.uwwr0-xNz飶6e>uT|0^3;)1 w[|^+V,駟n#<v} +AvLͪ ?-z̫[nѥfvyLSN﵍H>b �Yg}v݋/' Wӝ6n VXKwW\q-J).02p;QbJn~RIf � � � � � � � �$WL%5!�%~gtvQSBulІ YZÇ}HBc,B_,~P ^z?Y/Җe;/<|VXL�v7Vv k~B a�ۼDp)ivO? C,,ׅltiu>$n?c#7mlPAXvlP\l{pK{ N=љr}e8 pc&[%Kwp[AֲeKn pm]bK<B<ҶpmmfX6t2NժU?3%dpNk[g[Vc`B Ckӹ瞻˰`c{=,0,o.kAha'x~֓(xۓڶ'K31N`eAXɒ%}pc8m؇ٳsUV>eK. TUm{]|Aw{k};n Sޢ � � � @n,<kjO%~飳c ֯hAv_rujZbl@kDJ<AƳxfq;36ZbX9^u<j'e>$$:7kSxLoM -a'hd<}bق H ~ b%+뜨cj֎ymR/@ ? ؾ;djc u L“P[rXL;)vJ% x)} � � � � � � � �$R @P :YuI.1r#BU4~xFtA;t wlbʝ[3gΔN8<KVf4o<_]> hѢ*Q@SR{@�@6رR^R7ܹҸqҫ}g.?iΝj׮] \O.7�@^xa1w%/M6߮[Yrtd#70߶?.lf ={4Ʌ gmqڱcl̘1z衇ʅaq%ë.LRn�@}5t/+?myJ{I8C'u~K,?z_{ 7ܠ:K-Z-b%m!^Զ/X^|E]pX;GC꥗^R=LFVȶ϶8]I`ͷV@i;0}'rAޮ}w{BUn]5Jn0l֭8e9n~>'m-lO". ]PF}9fXv_ԢE<ꨣjÆ {O>3rr:Zgk [2e8Xu"� � � �i Y#U,<XRwN_1>:w+ժUK5Ja_xz˱юǖx;x=u M4;7 /YxGϺdXNڵ}x//v(+%>p/KXl:uw:[}8f'kkuP@�rV/KxW_}%~'ꤓNڧ)S/Z=6i{.}*JxǕS@�@�@�@�@�@�@�@�Ȳ�AY&@ ,wA:[}Jlˋ/.V^Xdc�3m4Y(>j|d8x t5$ �p\.KH*̕b!ػwAڳ&�8+pNx;ì -qvJe[cbsiA6N/o H0k Dplf!O>=޽rm  5i|M%K0Kߏzn mVQ>7=Զ:u[nzwdl}z} dixմN*Zpex;ॗ^!Cߪ{k(|w;�ivnaIFړڶ'QժUӝw^}>x3 reX� E ɵT .Tzt衇fX tZ駟fـr%ӯ_?Y b% ִ0Q  � � �u$kCɂlNN#DmP]>5ObZ}t֧~zD• x}#\2u OK.>\ю\wuZ``JQdz/Oy>k׮Bef}˗uOZ ݦζDSzR^b=;ػ74&"�i qE HNxEZNb>xǕ㭛@�@�@�@�@�@�@�@�Ȉ@Ӵg̋� Oذ-s>~ؿrJ-_<:֪U߮^vϰdTJ2e#_>sl۶M˖-SϞ=ӝ,� FUWIKf?p93_s>$bgZڼy{]~ڱc&M%J g*خ];`gf֞ ..([>sTZ/҂.]ve_R2X}O^g 9r{| f?>LM:pm YV^glu~.s5Afop`௧]6vm}yIe–Ķ-m{۷ޘ @-{鯿ABQgj!ƍɓ'O>dMY8ómVl%{O{� � � �G`Z.dA*w0Âz,Ԓ7^bz}tqoƟ'Lo9=/gcmٝW^ceWw3WVr<uYcJL9`�ƍGߌAgXJVS$☚'6/Cžnh0v=]t€<ӫl{Y.6lw݇]13"� � � � � � � � A 3 @8PUƍ+DWXZ7re˖ӧG+gVҥ͛7}GI+4h-&NsF?|6_MsڰaC\A�H[eϩK]@ߴM.OY~f )Ni?dc q% sr 7sLp 4/-� >lx㍪Y}dn|N^{Vƌ?~o\bEu'kFrap5cuQ JgUnV۾XqoI{J<6hnݺ>|,8Zh뮻.@P/m!۪-#,ga7t֯_ޝ.m`^?Cw}8n)}eм/|Vd=*<UR%[&,;͢w~p~Ǩ=~K^j:,}wO?T90׮]ZSr{K )s1,@�@�@�rTh„ ;vRTWLvھN@{¬;<rr43w]::;aâǑq<ڒu c1OՊZx15IOBMJ<zgm'(-S SNMxbbXСC'dީOx)Vȝ � � � � � � � �$Ph*@�|"Ч?տ]>t#P} 1b4 1«l=ɒ%.,jf͚m۶GaW\qбcGy睾:o^_}4' X-sQpH@Q  NlId5om>O<A 2>@UTYHZ [ /ʕ+"z9p@/_^&MI'gyFC Q~裏y-ي!b+V!= b"l޼ avc~]${>,GiOrr_eҬ\Ÿ=zȾXIi[Asim mvֶ`6xBD\B*|3-ij&?{*W38#=/d)9XM6EiA$7x`?�:v> .k[.ns^hۖm0PmOZۚoh:BX~?CVl2n8[ٽ̙;w_I-AS'OWa�=߶'x®Ajȟs1|{O[Hg>}-'C=Fed1 ׂ=d${OQ@�@�@�@p XdQSN_/NdK^Z{3z ">:;nŎ[ ۅPvB)S>G_C;cXHV~xQ:6ų2ӻ(;aͷ~C d2ﻃVac룎g]K~|x~5;3pIƬ%|M=4ZfxS:frxinYYgJ"'mYXO%y}I>�;֗9Ŏ7۟%<~K;i•_x5nww{k-Cc: � � � � � � � �"~lҧODA�Ȼ2nܞʔ)KPt* w? Vl2꫃C9$pA}t|v֭Cn`H.By7X paz2rŅ, 6u.|2#U0/ P(/Ճ|AЬY֗3m470. \X ᅢ͛]\~Wo+[lpndq3gnЛ_nm9[n%c5jTtW.駟e&Mn^>7| `Ł L \�sper߆D?4(nwu̘C׿J Rƌ\O\sM駟&ySrw[pEku套^ \hx_@ \mm]v Kw[Hm[MRyoX[lsAZSs6lM-/g6d.5pdH뻬 \zPdI_w۶mmyV{uK}bsns;mo?sZj{߶e˖.3{Y^ f̘RҼ/={&j:Ӭ3qc!۞) � � � P!T[;ݺuǦ~ݻwgעTwկhљW�C?s9'p' kKZID]O?'i}isXi~;ǻ~q'eڥV:`Gkk83ho;nWr'% 2z~/p' j׮N\h`q;'cWw{:Ƕ=+Ԭ{mcۑ{>w9h@~)O{D%W]uU?l}]/Nwcߣl>;i/wÎ=6oDw%}h\G�@�@�@�@�@�@�@�@ ;\;jJ߾&LHPT� p"E$Gr?, / ϒ>rD`mٲEǓrZcw*V(7An >_r^jР�}@� |tuIޛWԑ}V]N<Y.XX.hK_Y~@Br[T9 L~g�AFۼy\r} S*UϺmkm_ostҿ-]|>;̙6mhԩSۂٛaJ2ά:'ݺu߆kL<BVՔG{ĉժUfmذAp@x˦OT{ko<x5}w=z`l߾]K. 5kʅ`> {H TY]? s> � � � @p"? ݪg 7Nr\ nV6%օgC+߶\\;Ѣ u'{%Dg+mG<^݉-N /Pk׮V֧BB/F�(k.v,n۱D15q'xJO:m"^|رrX](H ,w΄O޽}]6}rYKoy2 � � � � � � � �#�M 6� Yg0& ae>p4&j[ZTx@>4p`Xo }3g *`ِ!C+nm,%>{ܛ7Hsf [Ӝ'sb˷{ꩧ0)6NҤIHCv{Wׇ&S|0iDangׯ_?=Sy4 @�@�@�Q嶹pBפ^qAj5jy`묾؝VZT$}];e<}-Z? kڴi=mF=/o}l'{֝Uoȑkup<J@ د<��@�IDATX5><- W3t/ @�@�@�@�@�@�@�@�f\?#�9<ר4vp J@�"JI]$zԼy&9'!ֲ;w*VX[�j,6O;ɭJ/wB yg'N-(5lP-[)SF/z.L/xuY9,,qiΔ@ۜXF ٳG6ׯM⯿ZSLQ>}R z*Vo1i&ڝ~9~xtMe„ I{@�@�@�@ "||*c^¥l<X '1b> su᛽T|Yx!53o_~a]n]//pB;6MŻ5W1sq[l믿I;8=:Uh\lF�_`ѢErbǹxfvΝ;RJٽG�@�@�@�@�@�@�@�(Eܠ Q߷o&7.� G rOgQy�҉'J+VH|#'r0%gI ٲ:J5j xjz^xavmsA-X 'dEn@ף>* }›*O=M5k֨Zjnr m׮]Z6v޽~`'/^>'efJ� � � �D`F fH.K.?ԬoK.>Nd}W-Kg~?PgVդIpH koox 5kʂl/rgˉXg�$(HO5k:m@�@�@�@�@�@�@�@�&@d(C˫J@�1GjZjJz-R,8p|髯R䠀 �Z) &<(j*=9rlp⥗^�&I yCvءҥK`?s='|@oQKA�@�@�@�Lu~3Iu'jҤI#8B'|$&H)֟YdIw ,A /%k;YM߸YgOզM Ƭ @}O>юŖRJ&  � � � � � � � �Y v@ Af �D`L;n%+eAիK7,]{m룆زE:Li WSNɹe!n:=S~6h;vdmx iex駟�H (_ *UY !� � � @a7vH1ΛpB;zw]_ �ޥsZMVDxZ�V`׮]PZW?c=Vzwƍ @"+2m@�@�@�@�@�@�@�@�@ ڃ� � �#`RyD*騣.]>6lzZ=<;g~]n j�5#rv,-X�߮nIoFN:N:۷>lWV$7hܸq0a~WuY/ۧ$ %0C�@�@�@�/PyEl:tnݪӧkڴiw6%K0ȣ>Z6kN5j+ͧ OVjf_|' -Z~+Bwʖ-Oֈf"� � � � � � � � � @^ 2/@�@�lri soW]664|<3g̉wX47^MYZ(Q' {W4f=ê[z:t@x^{y Uw�|M[Z|5k!C_~>P � � � % yr,k׮~7mڤ3g?ӈ#}vժUˇCInڴiVZׂ8w\YأL.7.]ZGyX@w+U � � � � � � � � � G$-}Fj0!Q5R @)$jC�'7K[KK~(-9G=gҠARv9|V~'k~ʕSNt)K.:C 6R`ɒ%2e>M6Ml޽t衇 � � � {.#L5kJ}kͽ޽[+}rڳgU͛E~j΀ոqce0/ ]p~wowi͚5*V;0mև?ڥTxqη^aZ�-`O~`' � � � � � � � � @Aã @  )ۦcn]喌WttR>9]kFNzAl9|Tzw5uTmڴIk '?ޅWF >k-O>DV\+pnݺk׮.%5P@�@�@�@�L l U,w sLV;|8ܹs5o<٥D3hwgò084i";sVT)OF @܇ɭ,X i;йw^+ mժZl/-TRW � *  � � � � � � � � �އ;@�@�(G! & *u$}telAPR۶{s?KI?(/훳giC={4;ō6m mݺUUVձvڹύjӦʗ/_8XlزefϞJfҌ3vZ-[ogG^1o5R@�@�@� @ґv|.`AoGyU @˗/ iɓO~NJ*P ȦC9_paU\"@ lܸQ?bK,v= \no[0@hSݺueae@�@�@�@�@�@�@�@�@�@ 1Zx*2aBj@�D ؏دz誩@  t*-^,͛'+ (-\(Ms3g^|Q2رR9| ޽[sg}3g]E.[nVZE'Jݤ$asɶ~I{Ձ9uAM/yORr>@�@�@�ȺumiD3^5iʕ+q~Yp NJo|W>qrzʼ%`'ٲe~Y;!,aÆDcwp̦ڵk^VZ�\~8O~X_jV@�@�@�@�@�@�@�@ O�"U � � _^jT.$Xzo㟟9sN`ziȐ@d{]x@o[>KB Vڶmk?dK͞=ۇD>ZnVZj֬\j&MA*TT`~  ?o׸J*>OW6mtQGB�@�@�@�<(2mTm[lM6 3SN<$ٵk.]C!-ή4uTiӦ+Vgvt R6LCחM݁ /ЇZWDN!� � � � � � � � � @  � �QC9R: Ӥ=r\f4IRn҇JƣdSX Ԯ]ۇa<-6ヒNqܹa7nFt԰aC?ta5\۷/,YE�Hke?^k^>Ԛ7o'OA�@�@�@�r[r\v/`soiSJeƍZ|VX' v"?Xg YĉWoeժU}?Z<.+֯vZ^ZV^pXN,UfMzAa6խ[Wp@8; � � � � � � � � � @ @ � �[Bi@}{Rp6IќXR27åsn, `NN=hU6ւ 4|ha\ "RH٠^zAa|J Rl0{8.-[.]hSΝua}K5h@6藂� � � �Enr~:Zl{՚5kdxa8]Z@͘1_yb#@@j|(*UrJ>Y;-b;l03[N6ٶi}6M6%zm۴G 6;NjՊu3 7@�@�@�@�@�@�@�@�@�@0Ȭ" � � <4ytK/=E=4x4\N{LNsԩRNٿ\@NCM={LH _\2 Ӝ9s|�֭[UtJڵwx`t *E.]:rؾ}zj?76 N۶m-[s֭[W-Z撝v|>쑐(W@�@�@�@  ,=)  ; dz#H |Ʌ{v{Nc}g}{IRXB >2 /΂%拽n˗/OjѼvl٢͛7Bmu>wfO6m{Xb~QWҦMKo) &m� � � � � � � � � � �Ap � �N3H=zHg-zj˗ ڒʕK}~iӤ+,n12*e lSrt=;4z~o]:Vn0|X"fڵ+)S\6 h[Vxi69y"Yʽ B,Bbm;4ڠ poxi)6֫D�Mka'pB4lN:>�RJy6 � � � � kZ%!YM ﳾ0.$<D2\�so4N c&}}J,- ݹsd~>N^&_UN׮]_:k}ڥ[n0$.< ~~r :!� � � � � � � � � @ndXs� � �IN;M:i iA|IpYj.+z+9,c曥^w|Sj ȃKÆI/$RXJ>(]|qI7kM 6h͚5nZ[.ɠh{JѠM6$lA�f p `Nm*Zht ޻wkSl ppAU,1kw˺uU+ ^k̫U&R1@�@�@�(嗂_~0CXd'p0h0u $ C 5yPaoi)ևj֯j}j{;o Wvid&%m-<Ӧ}OR_m}olˆcoϛbasJAYzuY\ XQ[ Q^S-.?Qhϡ � � � � � � � � � ��A@�@�Ըtm]O^-լ#ܗ˗Kw%y{Eۥm͠nwI< M E})T 4}eXТ v<01m<1vpc֜#Sl<YT�p Gq  � � � @|ƌ=o֏hSZt U NKCH 2n*tVSk S\Нu˕ƍ߉Cadld})]~\,1 | vڐr}ҧJÇWCUӤIUWI]$@�@�@�@�@�@�@�@�@�@ naG�@�@  T" & $]pԪվߴIXq'{,nĈH�d /HIEf"0kdZyGj\3F7g6֦U.ډ� � � �  UF5" 4 OXV0T@JǎMI>*]t%H]&x`YQV@�@�@�@�@�@�@�@�@�D#� � hv"ݷ͛ {'k 'H-ZH3fD .=7g6Ԅ@bL:u>ZZNzmi<yo$V@�@�@�@�R8 iFi˖>@ 4j$=5H?/ի9ܷv@�@�@�@�@�@�@�@�@�@ YX_y@�@�T 3'2 ,l;wJ%K&YO? jԐ8C*[VCi|i@D.#?@zM騣OMB]-  � � � �9!P~d)KX uʕ[o-oɎl)u"d}@�@�@�@�@�@�@�@�@�@� 2Y" � �y^YH -H[$m=RQH[7J'JHuH/}t x#tR&+i�yysW/f{䣏N(�+* � � � �;u#M@5  Do]$}.u&5m*%ؑֆ"� � � � � � � � � �_ � �d]wI;wJߟ-JM4I:裥UCZ@i|i<륃*D4^>{F5??woHmۂ� � � � @ )#ը!s%#�Y8d%{~K/,kZ;G�@�@�@�@�@�@�@�@�@�G x@�@�B(PtңJ˖tiiǎھ۶IsH/$tԣTvd:,idE i8i:i ۤ&M{(L[F>sח.\EZH3Fjڴ0I � � � �yYqci¼Bچ�'ЬK?9Y٠A|'\ � � � � � � � � � @g<@�@� !OD!_|1iA+m ]+Y\ZZ"2@ٴj~I*~tRvґGJF=S1BzHСҁA�@�@�@�@ ,sk,H@ҽJ7,1A;QܳJݺI^+pBI � � � � � � � � � @a o? � �i(!}t 7H&~}OJCwK7K[D'ndΝҮ]ݳGK lvNv;扝;#Ȳ Tg"Eʕ:uz"Agޤt!Rb\"@r RO=y\~t啑Uy� � � � @^IJkh 82eAߖ:uZF`v� � � � � � � � � � u nH  � �hϖ|PVפ*U~*[?K?(-Z$-[&\)Z%Y x 8?h]^ymڴ~RɒRRRRRٲRR �VU\GA� X!=4jTt-Ґ![jbn@�@�@�@�r^åk%;I9|�d[;4{#EI7(]q4p`Yv@�@�@�@�@�@�@�@�@�@�,bO( � � @EH'v4gN$fXK'KfI[HVZRR:RFeT,Y0TL$тm013m9 "kcH5kF  s5,@�@�@�@� lyܹ)d�6mcaä7骫"˺N@�@�@�@�@�@�@�@�@�@ / ^ ڂ� � @]j:23~MkJGK`d',vGӯ9@ ؀&M6F9'_׉v#� � � �^͛Gd Xs AI?,q4jcғOJ={J^+}t3a@�@�@�@�@�@�@�@�@�@�ےy. � �[n^=�kiƍWKuJ#u(͜)Y#+ ,mKdڊ<@>}u.Y"'͟/]x!! � � � �-[Jv  Pʗgi_cL*SDX_@�@�@�@�@�@�@�@�@�@ sAf΍g!� � Pz4A/^:F6j ||A?>Z*!Df&�fZn{O3GӇπ � � � @hFB��bbŤΒR3z  � � � � � � � � � @Dā, � � )"x[R ҂)~ԻdIW\!.܋�G ^l�)|{䓏ԬYUԵkYO@�@�@�@�hNZLZ@�#''[7曥:unV@�@�@�@�@�@�@�@�@�@ % SR>@�@�HQ쳥UrB宻}V92\܃�I`n饗<>fTts*Zz. � � � �m#'P5 @�PC'V>rsϕ @�@�@�@�@�@�@�@�@�@Hc`;@�@�@�J ֯fN>SzIiq  KO?-5l(/i#ʗ3u;مCbŊg@�@�@�@�p/5n,�+PtMҲe}Ժԩ;RA�@�@�@�@�@�@�@�@�@� �Ag}@�@�Ȣ%H{ȅE.;Β x:i~X__jkWib骫ρSԱcG7NŋA@�@�@�@�Ȫ@Y#�W` .V#dIGIiHi � � � � � � � � � �A 8 � �$R%k㏑ƌ~]z$r ҝwJuJw%stSҖ-뤓NR۶mꫯDhY@�@�@�@�RpD_K۶8"�OK~ڷB: ;5k7@�@�@�@�@�@�@�@�@�@�"@dayYO@�@�(pu^y%rR^R: \U!@XJ@|y$fMiFo6o\oJ,'M#@�@�@�@�n &͜K~@v4jb4dHS9`4~YO@�@�@�@�@�@�@�@�@�HO x@�@�A*[VzUi۶ מ=;@  ,[YwH�i*EVlܹ5j~[KkL@�@�@�@�Ș@ZR'dy̍� U&uW$Ǥ?6uLA@�@�@�@�@�@�@�@�@�(Aט5D�@�@ [:v~E=[ڵKj.[C  H/5l(裒B*+,]T:uA{υútX  � � � �LK飏 J @SIv|⭷ۥOZFvL¨ @�@�@�@�@�@�@�@�@�CA � � B gSi+$3>x4xTdҹWXC U>@˗O:@�@�@�@�($'O۰0�d@"RKsH͚IHI< 9MT� � � � � � � � � �&@dѳ`@�@�'J%JHӦɅIE" L.rԦ|ҏ?J yM *裏>|n#� � � � Ph:w,lʔBʬ( ZI/,Kxſ9)eIKdY� � � � � � � � � � #D3 A�@�@ X rp ~]ۥ>fϖz \OiW^C K,OQJR@�@�@�@�(4+JG%M\hVE�rLvmi0_{O:PW/s,@�@�@�@�@�@�@�@�@� J@�@�(_Y͛ w{#!ݺI*DJ~tiݺuԹsghԩZjOQ@�@�@�@� Y8'M*$/8�9.Pt;o:tN ٓMb � � � � � � � � � @2! � � Pxz˭][xXs] /H&}԰4gNdpǦndeVtRG5jHI94[ozi9D� � � � @Rݥ?fNz?@` ux :uSO=5ϴ)Q )VL:LiTԯԠҖ-ZR|1Bw^3oܸQ۷wu � � � � � � � � � �LM@�@�_R*{<D�ؾ]z Cϗ&L vL 6XtӦMR_7lؠm۶D?1p˗\,B�@�@�@�@ *ТtAoG P7zwu\;p7o<ZǫJI.~T4tbEάY'uiƌZ`A� � � � � � � � � �^ kϚ#� �  ˑK"@ l" &կ/]ԣdҡ׾SoV׮]qF5*'\W^y4hP/!� � M}_ ٷD  D*iѢEE*E!E,IHh!;%N$d{nwf,wf>u9ssA�@�WKW12*^xᅊX=p;"`sȡ5k3T lkאƎ ȮS'i==e˖U2e܉ͷ2 @�@�@�@�@�@�@�@�@�r � �@.Yփ#{R SOIaimڴI;vѣ~zY(dhH[Q-@�@�@�@�2ii0C�'͘1C@ NhѢ*\p$V-Y<lc\)uԴǒLRٽ| n7*Yd$23@�@�@�@�@�@�@�@�@�@ O1� � @ K*VLھ=u@ a_~OXQzҳJJw^ݻwWu7ߏ^hݺu:ssN6ܨQ#ݻ7z|.d."92<ZR>}e9ɓ'+MS_|>W]u~WkѢE8pnvIV/+wq>f}ٷo_ 6lٲE=l۷Fy]r%>Ҏ� � � � ~Y dzE�Hٹ@0W鍊nϾ5g=Nٹ=_g6?WСC_|Wa̙;x8墢ԳGo %u, }TtR_܁Xdr78{lhB_uD`@�@�@�@�@�@�@�@�@��AY��@�@�h6c[lX^Mr ]rAE`˱iӦW~mti\s,Jܹ/_>?ަMs=Pnusyռyt 7/[nOy5lw<e/RyW_|mۦs9O}׭[W{YjU uڴ0H޿6TkVٳgg}oYÇ҆ |eew[ LŒ � � � � ٳѣ%> d0_ve^?*{RP?ǙسK'vښ3gvnTtok{o֬vޭ:Kn6${Db{ 8b!TZ\q{5ywEKhРA/R'Nf/*PMR � � � � � � � � � @V 2+u@�@�x~:7@ ^eˤΝSNP(\ԣT@֭!Q:0@M4|zKݻw?엷H@ZT֬YS\ gyw"%Ki#GxhժUi]/x bV׻$:ڲ 7|g˖-Y4}dթS'_ndK´m̙O袋ԸqEcS7i<b>) � � � �{/f<*}?;w *${vmϘH1KbΓz.гs{ҭwzNn_V\;vy% J(K1سNFQC:TڼY.i06kW*7uY[Em{DC# � � � � � � � � � W { |G�@�@�+P\2L y/N?]ZT3z\GP)w:c-|>+qKZ={q[ٺu5jtW:VZU_?7݁vl,\:v-7믿Z]X'Cȑ#6/O<]*T xiv{vҤI0aBtnv_? /zc � � � � ҥ Q2VbQHWuz'|ĉuﹹLyϥzvn9rᎡJسl{^I"m۪H"E<g#.'S=f/^];7)SFS{rR@�@�@�@�@�@�@�@�@�@�LJ � � ӤٳBZ@ 3fH-ZH J۶ɅuLVhZv_8Zq~tOuꩧ uh 3gN?U| VX!o^2}[ոł 60@5o\y8 YcB<|ptI:tU׳W[j+}ŋ}l^޼y|� � � � ~-\x,k_iϞ%~ססz{~4lپ$ܖ<nRϥC|jݺfΜeO2ſBGaسp' ;ٚms2ɑM ][UTШ8 � � � � � � � � �d  3ɢ � �D`8]$ד!&O B. q4i\ˬiD~o6ze q|WZjI&ɟ?+4lذ!|[:,?Ԅ +W.Ng(F{gkҥԩ 7ܠv:үL@�@�@�@�@ {d(, E�Ȟ=Ggy��@�IDAT6lٲ~zRXz\^d|M |I]Z|^xɓG׷$Xzv~<iam-ZI_~)-qyBݺI*IKwg � � � � � � � � � a̰#� � Y.?N%KJ_|Y6d4cc3ΐ.T:Di Cy;  |:Z?oӦ ud=tԩӧZozB_X�5\|PKv{>`u։oѣoѣV >ŋc͛1� � � � @rzHʙ3Ǝ$g}E�ȓгPM,XG7n?ٹ*9r$H)\/VŊK/]q.ХҫW/?$<%'0e?iFK9o|y;ի? դ � � � � � � � � � � � � @,O\@ ÇB SOV:4igdz1L.Mr8q1B͚5s'w~eʔSLutΥ[lBe֭~Z[oUB4alRC q$PN4p@Ν;!bEZ;tpH+c?uk~P9眣ܹsu6my睧ʕ+묳@�@�@�@�#7rp{GbEr y<T??KÇkI>;tb=J{}Y=\.\X;v U939y,0bM$<#wn瞓NjԐ{i{T:t-~:e� � � � � � � � � �rЃC_[hx �%Я_?5j^]T3vv@�un7l+X0 Cp$C௿%<7NjV;BR0mvi&=;wv)vg}/^\,Y/Bh;~ƍ%u$il{�J`ZR,?SYU UpI[oUUnX5ϕ+~]~jРg!ΠA~B+^מ={T^=YG1chڵ3^׻I&~̙35m4jJ 훂� � � � @r,m6b/NG[u$wK,�i-0p`o3fϺq k֬Ϥ-Zٹ=۞4i]jUUPA{o{s9rZj~ol+2iyzKn&ۦٳ3<SyMٹ=O駟tt^޽t_״ɓ*/U3gf-L) @VvZLA�@�@�@�@�@�@�@�@�3 gW  @d XhOKFV @8x0\gq=zdcH.P/,/|ԫT\jYzGOO>ڵ,h1nXbEeۓ1qۣu*U8$u޽ʗ/_`F <]fZ9(ϲW}Hk!@�@�@�@�EgD-[^y+ "O|޶l mZlyٹ=grϥ>'g]C"EJ8Ώ~ kH&HeHw-r9➧0�d } ) � � � � � � � � �A0tAfS!�'`av JG\ը!sg0B X{J~O>z4|pu%w@�@�@�@�uJ? b؇Y4~i|C�y5F(q4hv_n޽RH-uB�V ȴfo � � � � � � � �[ {Ʈ>G�@�@�HFi#fغUNÆu6mz*B {99dB r` � � � �@㏃/Ei ! �8 ||jv8POcƼO:t΅@�@�@�@�@�@�@�@�@�O X @�@�8^=iР0W`1257KUH'J<#m(=TH G([nʖ-CҥK aO � � � �Z=fӃJ͡Cʕ<YF`x^yy6;\ hK}TZ51ĵVTT6MgK< � � � � � � � � � @șCE�@�@�4k`]JiSv@ Co`8jUi`ܹӾ\e˺2͛<f � � � � SXsJq \HY3t!@d r}*W/ICʿ+]oR4t'[\<YZ@n9MY3Vc,( � � � � � � � � � U� � �).бR[o -SO;~4ztՒuN'Ok.v~@�@�@�@�TQQCIٲI@#pa0/TN8[6o AK!c'M$v[0Ld � � � � � � � � �d%tJ+ � �YK 7رiڬumK F]O>,&}C @�@�@�@�H# d/ �dMSNlO1BTIiҬiQ#� � � � � � � � � @l c{ @�@�RHjդ=Shl>6Zr䐾J3G)[4UB�@�@�@�@�ȝ[Vs%coʞ fA_Gƞ7@�%p #H7JCJIuH͛K}xp֒h@�@�@�@�@�@�@�@�@�zAfs#� � &7hP0$o4%;A 1cڵ+JΕM??ͪ@�@�@�@�@ :u y}ҁRRRRM7I͚]d �''tҏ?J|XRZ[oIF\ � � � � � � � � ��A @�@�-ZH_.u-8!p)H_/թ#R9 @�@�@�@�H@޼ KW_- ,͘!m|4 @f"/mL־tRŊOH;wf@�@�@�@�@�@�@�@�@�@ $@dHO@�@�H^vIͳQD:p(U,uԼz4jTVT � � � � @ -'Uj �%P4bit-+H*HݺI+WFTU  � � � � � � � � ��A&@�@�@_ezIf;12=ғOJ+J}J:H6HCJUd# � � � � yBdZh@ s tԿyKҌiI\\G � � � � � � � � � @H Ȑ � � j7(m+u$ܙjaJ>(UpwҦM2eRl7l@�@�@�@�2@ΜRdC0@�X ~ۥ+I?.@[W5J4C�@�@�@�@�@�@�@�@�@�Tp?C � � �/0bTtuҔ)RvbS=$[`f祷ߖ ,Pdo@�@�@�@�@ d&''"S㏥>]o). ,T!6֎jנ H/(ً%fw-zThԅ � � � � � � � � � @ zl@�@�bXgq㤦M޽^1QY`*gѣҥ瞓ӧuܦ � � � � �I 8 EE%@ =J,nhEѣRnYSK'  SғOJ]J#Uﲌ!� � � � � � � � � @p � � �i#Р[ҋ/;ڥ^  ,^,]}tiҜ9қoJkJݻs@�@�@�@�@ ]Aw@ R6ʗ=Zpk|@2֦EA *ThoV'>N9Ej.Iu. � � � � � � � � � �A9 � �J}HݺI'F ;ukn`رR.R\#� � � � @~ ̛)8x"^o6[@ *$!['-m"5nƏFjݩ � � � � � � � � � 2@�@�@ ]}7iCv?_|!5m*{w4ehԾu� � � � � tipUy} |@ t(w»y HȑCA;7oORժI"uP˳$ � � � � � � � � ��1)V@�@�@ CHZImH~̕YdĉRKIf;) � � � � ,Y"Y�W˖�+piҩ&\?gPHIU֭ʗx@ں5#;6f˲ � � � � � � � � ��A)gɖ@�@�@ 9rH֩E` QHI#G#5v ?4I=-@�@�@�@�YtҢEnee/Eʙ󿵰i6@F8dפ-[޽dUH;K'|THӧK/G1@�@�@�@�@�@�@�@�@�RV Ȕdk � � \Aj%}Q2Vf,%H|!:$ ,U&u*կ/4aT^x`)@�@�@�@�@ \ :L ťѣ]@ =FI-6QoCI7JÆI?(խ+]p4ydnWv4n{sgh. � � � � � � � � � A.F�@�@�$r{Oz骫7LrbR~>J=kH+zj1@�@�@�@�8V+/ɝ[A1"vֱn@ u*T6ew6nl"`.pt4m'Զmd߰$kba+WJ%&\"� � � � � � � � � y� � �-#4dԷԭtRTqo dGo 9Z =-&'UYڰAz`(d� � � � �%uxҪU矧,{_ٸM Y7>LZL:\2eS0Mϖ֯M@�@�@�@�@�@�@�@�@�RC YScl@�@�_Ǥѣ~\",B!#GJ6n᠃Kvu6W`�+HwRҙσ#B�@�@�@�@�XP*VLR%XZ-gR#W}{^@*6n(dvNzKڼYYSʕGla۷ W| � � � � � � � � � @2l@�@�RHS'믥~Փmbeݺ2/ Xc.ҨQqXdwH+C-@t&ǥCK� � � � �Rc*F�#PtRm"-4oAԨhQ0@�@�@�@�@�@�@�@�@�O cm@�@�HΒ/T9Gzwba]&|fL;_ y: @=paԳT`̥G�@�@�@�@�F H jVトҦvkK$,l$~T.oԤw/\@�@�@�@�@�@�@�@�@�H�A7c @�@�H%a=$sԦ}{# sŞǷ)`-Nz`![oo !� � � � �/ҪU(nyeiz;DKr U ,1%8 ]x4mZRK3@�@�@�@�@�@�@�@�@�#39 , � � ]tcI-ZkזxCj^:|XzA)[6)x@:Dk״+*k׮]Ν;={o߾C.wr=l9s*Gcy\b-LOT%PX1SXG2 |C mZ@h|)\ 6� � � � �)`AYf]re_?o6RG{Զm۴em޼믾~?dm+kg:0Wdʝ;rtHkC)R/EBJRUBYtie- H`]3dݵlwu"^ֺR۶G]8_fA4`67[9F3gi6n.;n(4Ӧ[g!tko۴P?⎇g>cxӦِ7o|qԆl";k@�@�@�@�@�@�@�@�@ c E�@�@ K 4n,-]*wteIu vF |\<CS: YаuX}ݾR̚Z \<b4tI[BCBu4~YuV7 N\1V\9?XG{h>CunBة4~|!]_MԽ{h  � � � � @ ̝+-sϞ'H:H=ߍo)!@֦O?iZbE?Z[ BpFVXzu?n/dII^:o P:{aˆM6iɒ%_}v<g+Z[Bz:Ӣ?k֬t,`j޽{UڟzںkoΝ\`6wrqPą:vaE\[fwߙtvF%yT_aܿP}Z�}h۱!P(c3Fdܐǘm~`ȸ6?t{Pb6/~ik }}4C7KbŬ@ 0PB*\B6̛� � � � � � � � � ) d2n\"�DGqzW9j� @3fH]g`QN5Ԛ?k6l;~sR2eb'ZpbR|?I>B!CF-d*WSN9?CYXdǎ҄ @Vu}8]KNH)|"� � � � �i'p.%M>ݣSխ+5m=-OA�\ぅ>u -pQ,m8䓣_Tem&nqkpYPE`k׮Nj*wRZ0dÆ  : "`mp~?<G 1 ^PpqC{'- 0,s>s?r'v?H`!!w; 0w ?Lڰ@H Bv] ܍9ؼ܇A~8}{~uD�@�@�@�@�@�@�@�H_d � � 8`hbmH~+yfC7?Eiɒ%~ܾ[*+Zj~%+VN:w;}z֡|~Hr.q֬Y Ȝ;|MַBkg8@^ӋGo:B[ fاMwd9.cR*H*U^@�@�@�@�@ \>7ݹl)=гķ\`k{״i\tdg!uSVc`պ]R$'�2t,~l[dƍ-i޼y>rر>l͂.BhB-M^EɺF;v^fsNbg%mdϞ -f_…  ƸΑ mHb!iC( 2fhq "[QoB� >K(ۧ(dɒџ6n/ � � � � � � � � �YQ [:ps{+@ BǶ=zK/=ET @ uHxAu`\'ƘrIͱN,s }NY駟fXV-ըQCKNjYzm۴rJ-[̇h.].OQQW9#ʙs:pTEu VR@�@�@�@�@�tpq2Y&Mȑ 7H=',@VXp>Ҩ >\̂Κ?* K \{A TgAk6W_˯C|ɺꪫԾ}{vUyf?_~E6sMG ыY,F4 ҳyŋwmj|@z Ϗ- Үg ޽;z<4M- ^hC2e|Vֽ-050.3K7  � � � � � � � �$.@F>E�@�@�_.1JtOy:$|hի_7Ysgƍ{Uݺu}cK$K Q|;1l.mWiӦyZ` Kjþcy睧Mo]) #� � � � �%_\S~x{:${B^z,@fXjy~zZ"^zjԨm&3kS&z?Ç}'z5`�UREW0wEիWLڲekߺu,-/T, -ʗ/ J򡏡O z1$gFkBmX8q- B!-55[p}B$chѢ%|(}`Wݛ$myS A�@�@�@�@�@�@�@�@�"B T j~{+@ B=zK/=ET @ jդ#GY(Ƭ.jUtrObgt6m>SM:U7oVdს:cɓ+3%}r`B jٲڴi-Zsj` � � � � @"A٥pa" 3k@}~YIdR[&M!Chƌ>SNj׮ꇛIm,Xk̘1>d^u/W\2QGaujP6l^lOкPP]ٲe}0]O i 8&#iA 0CJ,ە+ʕ+J ڛөHJvƹo � � � � � � � �YR ,y9hAfϱ#�_`,w~V S oU:?{n}G0aO.e [j͛aÆt/cNs4w\}d"΅^J]vN8t#;G�@�@�@�@�%!$^{-RnRқoJs'@F= <X/v_t뭷vٳgHz=zԷn %J}(Ȍ2dk֬`rQQQ~G !r0+9 +_J*% W BZׂ\mشi;W{?}%so5ɸF2 Ȕqd+ � � � � � � � �YC Ȭq9J@ Z h F@�2ʕa*駟eˤ_~\_7Z\n.L3߁e˖+Ժukߑ.pdCSLѤI4uTik_?]'@�@�@�@�H%"E/.vRZz}ǶB RyR-�ԣG-[6RQ5p@ 2DݻwW#\/_+V֭[ۖ3K'kR,E٥n$O^iׯڵkc ۶ms-TZUzjN1k/Md>= � � � � � � � @LK#�^  9�@�0֬>l>G-^|PQQ'Bz=jR(P -H ߿_|{=}zN[gNު:uDz � � � �d@66l ;pdjNrѨQEXH0ÇO>:xns= AW^Q޼ySOk׮~Pp%K? |<gիWC5ǫU%d ,+_*IV7Q-8{D~]Bc)  S@�@�@�@�@�@�@�@�O T�db 3@�u裏/k:ctMku'?tʌvѣoN~M4ѽޫ.wɌ1!� � � � @ <k?ݻn܋mcxB.H~IrΝoهZ  5z-5lPÆ S͚5p 6|-Z/֞={|PZj *3UF ,xͲۖ-[?m :.Z<Lխ[gu,`bȦqƩ}p � � � � � � � � @A&l@ (ǃ� �1c駟իuW{0@J\O'SN?N:.@�@�@�@�)~۴{zʖyG.-͖Hm ˲t=C>_X߬} ?;eϸTZ{!$}i}޽[ŊSUNqFʑ#Gf@ BrJ-YDK.  'z-VƍU`yU ȴfO � � � � � � � �_ Ȍ9@ YA&@�2)ShժUڵzꥪUfSXny >\իW׀Ժu%F�@�@�@�@�L,\ȏwn,|W]wQH!{_/ky'Իwo^ʔqg!dѷo_iF .gծ3g^e_̙Ӈ>ZYg3dfk?,v:rFWЬYLsN\@�@�@�@�@�@�@�@�-@dl!�^ L9@@ K lܸuK~:w~rYʀ O`Æ z4j()W_UJ[@�@�@�@�@�-jז Kߖ|P.LOzlRg_lغuҮ]4~x5nx6Ǻ={ڵkO<q+W.[Hŏ=yiԩ~ iӦ:sP~}Ν;+K @�d>|؇A~wa֬Yڷo,Զe˖~hРA O&2 "� � � � � � � �dyq  � �  :ֶmw%2452gصc@�@�@�@�HʅIu$g-{MWK*$͜m4-i&5iƂLmnފ ;'<xP'O-ܢҥKYf>$m۶gիW/]*uD�vf6k{Cڽv/{) � � � � � � � � z#F�@�@ C ߿_\sN=Ú;w4hʧ@Ccڮvkɮ)  � � � � 7HI9r/SҢEԪ4o5H)]vE*Z )rʥԦN2΁ ;'4ѣ>}vRJFj/:ݻׯIc$C�'`6ٽyv{ - v{3) � � � � � � � � 5d8% � �B`ǎjҤ;}z衇|LjLqpD Xgvkɮ;w � � � �d\ <T˅I_~)܋K/{MՁ=!S **J۷}~*^xٌ;vNڵk?ӡ_UUR%uQYC Q۶mU@xe" g@=v{3iP  � � � � � � � �dn 3@�@�4vRӦMu}:3ͱq #`א]KvMY]c@�@�@�@�@ !M-[62T /{)}܋m䞑K-ZHӦ0` "I&dɒiS ;'vnwYbzf6{l>^}ٳ>G"G[GZ(eN {S) � � � � � � � � 9Ee< � �JúKd Oe˦tg />֭[5dgy&mz ԩSuO} Ů%ڲk̮5  � � � � 7HsK 77mn �H{L۲T4riS̼l'H՞_pjӦMb7'O<O?=Qv`gJ}g޽zKά-b̘1:p@;7v\G_ԥKիWO Џ?)S+T\ңJ3 cmܷog:tbŊ7f̚5˷1֨Q#0;=JC_~^QzuuQ}]DB^ 1ƭKB^yUW{C^jT=� � � � � � � � �K u>9@�@�2@>}zjM<Y'xbo3fO?Sm?mxǎ3;***EuѣGyf;`lҵ>)sڲk̮5  � � � � _KK77m5o.}`dZ]J+Iu{l'Hў[Ԓ%KdUr{M*D~?#yj߾{tvWժU5g]{ FƳz&ٹsd*lSOՑ#GrJ <ؿ\,'pmpj}}w4aƸjժ$+sᄦ\&3C^mנ'N7xC~nOiB^ 1ƭGv/{[kZ  � � � � � � � �d 3ϹH@�@�Ȕ+V/ArʩzիWwܑHhu_gȑ#movk(w0vm5fך]s@�@�@�@�@ YRӦqz1c1=*T:w{P-#§.4g;Ab^\~͚5us/ z.={*gΜU7̳'w܉.;V͚5o>,+5lv\RX`Nԯ_?M0AFr!w#dcm,SLta@fnq{O-8}t=㡯3=Jj ʝ={z!n jذaa넮Hc[~{[kZڽ� � � � � � � � �_ }~8@�@�H#wwѶ��@�IDAT_|Qv4cz:o>䀓[$/kqZk� � � � �WijIS#g|yg-[+sϕ ޒxCȩk$֌3bg;Ab6EU…[$UM2EGQǎSu?i^ҪU+߶P *$Bm+kFTR%e˖-Վk#;WvRXp_?͛.~* k`|M =yӦM>.***<6Uj:t }~bnorEO.Y6l=ܑ놎-w~${d=v � � � � � � � � @Q{@�@�2u\?~xt9?\cǎնmԹsQ~ᇲWnݺݻ)>ЬY\jР  Fˁ\gw)W\XΝ;5h -YDYn_엳N|VǷ~[/^}U-[Lojm wd̙~{6lЙg]vcQF+e~:tޅuF0aG֭5tPZJ7xcL7#7t}Qѝ2Sqwl@�@�@�@�2{ԫ9sΉ 'ua "Z?Ns{+lzXOX׫WO˗/St>짝;~ٳy{oV3O?TG&-.31bh_,묳J0c.pkkɮk9u]wL2-`wU޼y`{' iӦMoSU,0շ~Rk?]k={.]ҥKRm'Nmz{Q*UԶm[]tEڻw>c?綾^ȑ#5m4_3JIn6]z~vrBK3+6qvء#Fhԩ޻*UL{OA;eq/BU=wƍK?)\3yddmVO>O뤓N:%m0!ګOb1;x[ׂ.gϞ~@ Kׯט1ct 'DF/g$68DWuqK{}r � � � � � � � � T( �+Y1.r+H@�!:C߮ŋǘSߧ 4 zꩁnݺ-pጁsFG 4m4`6,իWN)~A,PZ駟]뮋^u !):VXp{9Zju @f|סԩnF.2w(pyq(VXq.|2:-ׯ~7or>|xu 0LLϡ{F4ױ2PV-`ٳgm%e`*صfvQ@�@�@�@�@�w뇾e={_qJ.RF@Coۖ#M 3J8 3ڽmu1A<./G/X[@J?s rKSrX=Ά$wԮ];p~^+T|O>=`mAn Gam4サ}h֭۹+\ׅ~\Hcx+eSb+;gY\ YܥnRu.1Pxq>\X7s~w}ws[r@ǎM4 (֊]O;:;.0^m'K?]'M.6$=;t|H|Ӛ7oj֬p/ GݽDί=N]pW[;4ktm YO~b;qAB@_/\uUƍοCĮI'j[7A'ڹp:pab~M$u`k/6d=őV܍7.ҪE}@�@�@�@�@�@�@�@�H{c| S !�&`?$2x0 @ ̚5wN>iUBk.u>2x`_P/ \7ougC]}CO^: ,TM A^qn)4;0g?:tuu ;|̦?XM6X"ENm--CAk׮sU7b?ٖXǮ}iצks9nךˮ=  � � � � 8@gзpad\^ ^L-^q)ڞۋbp ;?иPzX㯿'YpU%{,ҠA^(^ΔP[@Rm&ثW_;9|nڴ)_}7yY`ߌB8EVe?DH8A>hc Vse,5]v,3gLݤo'}.,gg%m_|E4k㶗Y M/+5?j(=v2` :}DUb͎g3 P`\k !O{a]5gsNtZprJp'Ν;zż,Yҷ&>;`)^~{vmX]c s{&si<wTw;wAF. � � � � � � � �,� � �D@|\@iZZj){~6ne֭uܒD(1߿_UV|駟~uȑ#f<x0zy.eSN:qqTv̓ޝ[56hH*o4@$"y2!e<B%ej0 ̓9(&Mn}nw8w>~v{=/g&hѢZdn״kX,o0AnߕW^{,_+V7E@'=ʊomiٲe֮Zjgĉ7;VM͜9Sna˖-Ll϶~7L M ̄q @�@�@�@�;+C#Iױ~}Wa}-ԱTԵԣ}S_[C; ]禛n?wyɾ󏍍ջᆱ+\q~ Ɋ[/H0Ѿ$9NL^3~1c{s׬Y3Oa}6˗/c\ʔ)K/N6/]/mܸY|E_ 2jO\Z_TNk^z/\u֍kWF_f絾w;w+ ]ͦu( 0iw:uη7|E *'vO/k׎[kΝ}~]CW^=' =>wP"+Ó<X]_u옄ö=-O\{/듏|${݃ @�@�@�@�@�@�@�@�@ r#� � ժUSܹh"U\9kuشf.\X ,pDz~~k.5mSL\v7p@y'+Wv @}]/nݺJM111'je\~?o{2=3j>k~tfԵ(@�@�@�@�"C` y⑼ L?h $yF^0K ぐEqNwI52;55, K/.gPdN *[OjJ/ #sI /L)~EpXdpFiڴieSnCcuZe2J^{u(ZTf:W7rHuA\r Ka˗wg۽{F<yd 4p!ڵs?I15VP�{z &vONl-~M ޗP'?cB*CZ^\'p(mJ1#~y?'R^7XxĄ� � � � � � � � �+: � � 6Ȫy3fLXU@ڻwb6mr6;w)S=z8a�Ƒ#Gi .Ç^5l?[sر#x 6qu׺Zl`c_>S8 ;ҥK%K<a{R/3Mg5%5/=GY � � � � ^FՓ*uMM ˔OZZ3GjB2 I/y_KGԔC  n|Z˹[çCj޽,駟!9IdwV9ĮSzxƯOb\V/t'NM ËfKͨF{fϞg('|RnGUFll ]e/R:uJ^z1URGm۶ݻx p$ H0UL''=Vr/&x_j~i6䮓ZהzSZp8^i\= @�@�@�@�@�@�@�@�"[ ~= � �Q/pmO>ҥKæuuuyN?h]d֭uic미cxjmhlc*Uraƍŋv _0D=zz-Wĉڵk}_} X~65j-gΜ? ,p\p)erg>kcB�@�@�@�@�|ӥ-Wѽ}_yEWiXy!*%%^PO~mb?J_ƕ/_^Æ s~ꪫԧOE&7%߹_veڵkW:\lzxƿN<y$ԇ?͓͌} =?g=Ck}gko߾d[۷oW.]\_}nf̘tM}ʰmtb^+>PJ'=\/zZViZIr6䮓&z'*šv{sޛ3E � � � � � � � �$@I$l@�@�@�p(xM7mٲ]_ڋ[moVB4~x]r%zt뭷kճ>… ?C}駺h"9rD&Lвet=czy#gmPm{6 lwq8֢E =n@hfTbE5hsNܸq[3 \@&M]IZPuzw5g8p@<;<]|Ųk`"2e/F@gӞ={CyfnmJg>cY � � � � `&\)]xa�ȫ/Z$y_W+&Fz!iÆ5Cram@#FxJZB3gNu͚5մiSеkW;i޽u ȈܫV*xOWZ_3~ ٴ�_|QrմիWSbŔع)mXPfiРA4k,Y 2&~I~{eYfL5j]xYXL3K/C,D~-zB6Yȑ#Uzu/Kܹs>>H{{m�P u( pǎݿ/ ol=m=_qV{=ٶ4i$g۟,t=\mv_I)]/)7v\|>_mA]m_(Ӷm\?sϠ v__䭍2ֿn\2!� � � � � � � � @xONS@f&@�~uf �$  )R$%76y዁ʕ+婧x^H ^xw~! <r˗x>oXdnJ.F׵kOw"2J(^dxo;Ϯ X x\^cq5N9w~*Uou�m۶~ ;v,EX?cϕ+WM6uހݻG=zxS�7X]kÆ /ҕad7i*{iӦT) � � � � cף={)kײe]wJ}fw})+'3Nkѣww1c }v믁oރnjWO^q/ -\_@F|>uT}OcZ_3~>^x_3ԭ[X-b@:vSC^zAqww:UT)p0bޫ̞|ϫyo&yy xy!ao1Ю];׏d}i{ 6 )Sƻ5 x!>,PdIg׺u… *TXYC'+0~S'J`p`_|s/mv~8'_ ;lÇ;;\rz/ϕUlYw=~zW_Mکޟ :t{ϭu ̝;kgO_mNs}8g~lY9}ϼ|rWLb }J|ruv//=6}YQ{?ǎžk"� � � � � � � �D@G72u|cӥ8 A��gAjذNP:E"� q5yԷo_0ﴬAU.`͓w^y7"/Q^+@q~zyE/yZ ѶmduR%thHۼW16)oIڵK y\[N: əXLȇLk<yZl� � � � �/}%Es)iNF>Tʝ[QKj,%%e}sO;W&ǿ]xq}1P2;:hժU",X0ڥnsZ=X}'/w$t\Fn%/N^(ekիWOg}ϰV{^ SNYb\#:|¼ho^_|V׏g}e^I߲㳟e{AtlZ7u(}ioJOl;/Wރϐ'/ 2D^0 v$gr_[yW'wʨשG(m̨:\o/HQ/Lܜ޿wSSPα۽ @�@�@�@�@�@�@�@� 2i"�Q'@dԽ4V&Mv 21bD vkĉI6+-x3ڧot!ǏFʹ@�@�@�@�R&PIO<!}폇fV*WGT$=jxuU-4f̘ @,{0Yr]wݥ]&wXp.]hƌZd<Lvb QFW^ѦMt5ר[njڴi%Vn wؑRZ^BLJg.ꓐYp}O:- 6YN֎^|~Mt-s?=|[ouM{hc$MAFһE]@�@�@�@�@�@�@�@�Z wVW#� � � \z饚6mj5lP6�f͚qe]ի'i?$G+Vx#3ոqhhm@�@�@�@�@�tضMZVj2 ¢N;M^zK:TzA˥o.D^[4駟ּy2bz :ٳgjocǎKԿ 6,UIEѽޛl;dO_E݂^*ɓzf̴JɵvB(QDJN p̅[} ~_J,?L}MPdmI%䒙Mȑ#5k&L {pԩL . B8 @�@�@�@�@�@�@�@�"Z 4@zs%y˄� ~z1:i  � l߾]=zЌ34p@}a=H,qDf zJV-;TRuy� � � � �$0jԫ(@xTayF˗ʗnI[*Y2c+x믿vs{-=-A~Ǎ]nӳ>+[?ׯ^z%}.@,kf.blYB #={iъUuw ,E `y_zv]t‡&B@OS&M䖧rڷo_7F[% � � � � � � � �$-@d>E�N Ȩ{Ki ml`k4ZR< mAhx6ڱcx r- LMV@�@�@�@�Ⱦ7(_/͜} ңkHo!o#[ӣ˸+|ժU>};ْ}u/=x�\ap}Fyɵ;vLo}SNՊ+TbE]tEjٲ6mz)Y4޽+˗O63eCdsTh#V7ov:iӦiӦMYڴi~6kLr :2AU@�@�@�@�@�@�@�@�@Xڊ� � �#`5?_:tP&M7DO#iIg>ϊ}fc!&@�@�@�@�@ 1/ $Kl/CVMzii۶ぐ?$h!թ#t`%v\BI/q),x𫯾Ҍ3԰aC\2ï iȝ;.B˗{m4h>_*TP2eԥK=3gIypȌl{B CȌRW=]v{f8=tih xe� � � � � � � � @t ]'A�@�@ ,YR#GԒ%KTxqn |7nbcc >.`}l}&ag @�@�@�@�HJ`ifUb_J.!/ I?_[W6y!I_~IIiKd6YfZh f;sSO?+?ج-�=鬳 7ܠ{ϻn֦M㏫p^h_^~}Gow/ɦsl4`p=EvO{ݣvϲuٽivo{@�@�@�@�@�@�@�@�@�_ Gi]v|cZ#�d@9ԯX ).A �d?C@ A={z#I^`֭zkǎԩ :uD}i  � � � �U?Ir)D~}H\#/;Kɫ^ɒ)x6>ѣz'裏*&&F>\|X$_?6nܨA{Q\BaZ}4o<͝;ׅ-\P[lqժUev:sTfM/_^72L @ZO-qŊZ|.]@fᄇe˺p QFAJ'@�@�@�@�@�@�@�@�@ i a/ uAF[J@�ضm^y1By#I[nnݺ+T9͑(~M8QFW_}%JoԭުҥKGb3 � � � �d-M&?|Xz}geˤm=G”XYhS [N~NdyΗ5+ZC=Bڴi_|QUT%-Zf{XY]V?vիWE\R%r)i*"@4 ڰa,իWǕ+WsέUi뻹xȑ6&>NF�@�@�@�@�@�@�@�fAf7"�A@�n6?;CI&)W\KuUW}*RHv#ٳǽ&LpѣGڣG@&@�@�@�@�@ 5TtԔ9С̙R҃J]zyƍS.]dXxb]~z԰aìL^u޼y>L]_H6'Ӫ}Z ]˗u{qFw_>VreDVPeZedO?ׯ_/�YG~{GԨQsjժɓԋF�@�@�@�@�@�@�@� 1Bk"� � @ `+Ə>H={tuh֬ڵk5kfZPVXɓ'y֬Y.H/j+V,r � � � � O`RiNUx;x)޳;iy!x#/O4HwWPB xi3e=f{X6jH's7cǎʗ/_T,̯z!׏5|pY_g~!Xa^թS:|֭[!-sjԨQݡ֯XlYUX i붴3TΜ9eHرc_]أ>nڴɭ-[GrUJ7w݅Zm˛7o � � � � � � � � @4 9^ xIcǦW� ~jذN]4!� Qw֤I_hʔ)?- y\rD)*~z͜9SӦMs 9Զm[]ven�iѢEٴ@�@�@�@�X`0ǥ~ŕZXz1i7_8Mj۶m:묳?=*`O\@nuM{n#\/pBHj߾}СµT/7ȍ7g,(t*W-4m?(QhpЖ߼8?Q[lccc]`טjKG3O!yN}b)S2 � � � � � � � @-$@�B 2D(C�VGՂ _yΜ9:tJ*&MqjԨX@leY=plܹse6Pwʗ/ۺukʕ+u@�@�@�@�@  \ztҸqٰad |ideぐ'MK.U:uzjUVlZo 6pZ;vTÆ eӐ&{vyGiJ*gϞիF p͛7K۷w޸Xܙg!-uFڱLdwG{(_ϠmCͬpq˗wK gg,k>]Af;WE�@�@�@�@�@�@�@�L #} @L5'"�d#Çk9sfϞ w) AWzTV-7-l�ϲeܼh"YFyg?_͛7W 7o H@�@�@�@�@ -+&=ԧO ;Y+_sĸ;vvq^7nTɒ%ժU+`({@T2e®i֭[ɾ+}7ڱcvI6{i)sP`߾}B!miYp?[ؑ#GjiSc ͧ~/~œ'OYA \s￟4[>ƟOY8?NU-T~'l,T 0 2� � � � � � � � AC@� 2M)@ {lذA ,p60tW6zRVꖕ+WVPV8p@ׯ׺uvZUVi׮]hsSh6 RJJ% � � � � yԢ7}_yJ)<Yzi㡝>*yi{{дiԲe˔Y"dM:UiƍaÆn>H ³ 4K7o̙KWM6uamڴQݺuěfY0lxB믓*iwyi0[hѢ"Eu[Ν؀@bڳgvu7[/3nSO=kK[G3E�AQ{@�@�@�@�@�@�@�@� 2s Af[@@�H`�ӥZbnݺU@@{t*Wʖ-2e-uil B۲e6矵m۶8kdڀMk֬ڵkTRQi) � � � �  I'm 6x_w=YdϞu'+~(l5Ke5kΝ 2 Q>>[5jpSN[7nʕ+ðXn}Gfi| 4PFԬY35o\ϒr8t Pȝ;wu ٳݳep[?^BY@d…f _ Tlٜ+W.ö,8zA}6߿?n@׶w^h "Yvph𺅑Z@@ e".Af:D�@�@�@�@�@�@�@�T # @*L%!� `~zaÆB-(knA X`f Jldc6,l'cAa*Ur+Wvg@�@�@�@�WϗjՒR^wxoKpE=|k՚7o-[-lLer̩%KUXřg)g2?B,L2O<.8Җ6tKقmi!a{wءcǎك,ZލaÆ^aT7,>6ٳ'n^rwmZ,d?;~(d҂N3~EЖ۬^~P_v [&n/6x6mqXغuſKlI>k/&;'8�l}@r36vXu)Cُ� � � � � � � � @ȝ�@�@�@�Y;ծ] mxnݪm۶ZA6ڀ+lexlQSz,Sl@d#`J vmYD .]ZeʔqB"� � � � �a*ei|_0 JTP!'nSZZFih!{DOcGXE5\e?ȟ~ɅBጳg]?ݥ% f&JrM4qK P |$ d;d}m~L miC;Aٺ~hK7$g5-sb/ub?kvӧOwAmڴQ͚5]߮oq}AݎaB�@�@�@�@�@�@�@�@�? =F � � y+dl@?ʖ60*666ys],Tܹ6�ȟm <bB�@�@�@�@�c޳uZʎ6W"}4yH~@i O^VtV#`{zѣG] =|k:fsp8["E\@ʕĂy@ XpgqF KԶٺgc/e>V?`_ >smveuiۃ3NEtjȑj۶x խ[7%Ep, � � � � � � � � @ FoUA�@�@�F~`cbo=of@�@�@�@�@ ՓN?=1I+VHC҅FLh: X8[ݜNER d&l!L ԯ___~M!u׮]5x`$|[@�@�@�@�@�@�@�@�@�V g֌!� � � � � � � � I^.$.e2\ o^顇BV(l)]wm[_ � ]t͛cj^n6ر#CK � � � � � � � � �+@dzR � � � � � � � @ l,['na H.M(͞-/,K2D:r$S9�@�رVX_~Y&LPJ4h ݻ7M@�@�@�@�@�@�@�@�@� '@�@�@�@�@�@�@�@ [ |TԤIfw \)  ,լy< 2M@�^ wܺ馛~z 8P/ |guo? D�@�@�@�@�@�@�@�@�"Y H~; � � � � � � � @Rj\ʛ7EQ@ '=zTtҥզj �$+?~/x6lؠ^z N=��@�IDATPժU;رcɞ � � � � � � � � �/@dsE@�@�@�@�@�@�@�@�0loZ Q ([V3F[_Z;#/@�PbŊiȐ!Znڴi޽{vO3� � � � � � � � � r Sn � � � � � � � �Q"p�K.ьZ-^}U;V\Yz)66"8@�(]˗FС4iYfe} � � � � � � � � ̎:mF�@�@�@�@�@�@�@�p_~)ut9dG_O-['|t=? ~5h3 @ TVMƍӼy/_>5o\۷ײeˢ@�@�@�@�@�@�@�@�8 #- � � � � � � � �%0uԺuzF9*P4djTԡԢ4~z#� @ 7h>֭ݻ맟~ @�@�@�@�@�@�@�@�@�2U Lb � � � � � � � �"o4gt%R#+Jc\;&5j$u*mڔ5 �]?z,X_gVjG;wL{ᔀ� � � � � � � � � " S � � � � � � � �"0}+n--%`fIKIիKI^W@�F GҥVZ{NcǎUJ#hYS)� � � � � � � � �dC N@�@�@�@�@�@�@�@�Sz3@JZBzYGe%|<[@�ܹso߾ڰa^wݳ :rH4z"� � � � � � � � �+@dľuT@�@�@�@�@�@�@�@ -٦MZJ d[eI#=T򂲲�mD�f ƍս{w 0@ժUӨQtرhn:mC�@�@�@�@�@�@�@�@�T , � � � � � � � �Y!`~6ySO|P^PԭPȪU#G#M@�_NO?kꢋ. 7ܠz/a� � � � � � � � � A#&E!� � � � � � � �D_J I\#p3 :$ڧTұcSOj� @jʖ-zK˖-SJԾ}{5o\?Cj@�@�@�@�@�@�@�@�@�DL � � � � � � � �+0uԲt)FZ^N^]ZF:|{wvmix)kS: �-PK95{l̙SM4QbŊ4#� � � � � � � � �B l6H@�@�@�@�@�@�@�@�_¥iӤ6m-,H@L;R͚RNRZHǎ\D�@ 7noV&M͛ٳ~pu@�@�@�@�@�@�@�@�@�"V Ȉ}8 � � � � � � � @j~AڷOj65gs T.s<N5wߕbc> �D@vxb{9sV;Sv튔&PO@�@�@�@�@�@�@�@�@  � � � � � � � �d)RRLLF_gKGKVI/%U&Q6#�D@9tjz{={LW4v � � � � � � � � �"@d0s@�@�@�@�@�@�@�@�p ȶmå6#ZTF֮Z*>] �ASNmݦ뮻SO=J*_BI=ڈ� � � � � � � � �i 2톔� � � � � � � � !;vH?Hd]QQ͊eI_.'H='WT4F �dS jڰavF F�@�@�@�@�@�@�@�@�B 24'B�@�@�@�@�@�@�@�S<y /Є([Vz%iFsg$f#)T@�/g}Vk֬QӦMխ[7կ__SL98^ � � � � � � � � �#@?!� � � � � � � �D5k&zj7慭Yg ˒~YOzMBwoiʰ6C�@ Ykȑj׮Zls&{. � � � � � � � � �M ^@�@�@�@�@�@�@�@ ;&}Զm6a%pҋ/J}'sԾaUU*� @~}ƍꫯիST#� � � � � � � � �,@d4 @�@�@�@�@�@�@�@ N`|i. @X |nV&NZ4ƌ jR @�R,ФI͚5K}֭[޽{k֭).@�@�@�@�@�@�@�@�@�hm = � � �iعs>c7 /]wݕ@ VZ)/ҩTA�@�@�@�@�$0eTTfvj5m9+8>ϛ'=tuҽJ&)vZz"� @u饗j4h[~{mgΜ)N4ISNURlZj_|E_>Wy͟s'.@�@�@�@�@�@�@�@�W g6!� � �*`X?]_ocǴl2-YD΄� � � � �T`dm۔d@Æرڵǃ!}T*SF[Z8@�H@Μ9uk͚52dFJ*'ЁZ|9rą4Zt=蹩~5j(Wnre .2&&F _<x0@�@�@�@�@�@�@�@�[ ~i � � ^iժU�jժ[oM> W\ZnVZ%$Ą� � � � �D`.i|]űd矗myF3G__jD2eY1!� QymذAwqqU\Ybcc3-yU^ԬYd>j w%:?߿ڴie<X}-C%[@�@�@�@�@�@�@�@�@� 9#:WZ� � �,pk q؀pl L…ñj @�@�@�@�\`TɾÄ@ ,(+-_.M&yԣT4hȈkF� #<!;vB!>lwQHsQתUK]tQ+VL{4<擬<;@�@�@�@�@�@�@�@�@ ]B+t � � �d9s4j(^Ze˖U۶mեKW :t[իʔ)'Tsʔ)믿[nܹS?,Y"uj+;s=_|\{V\鎩[ns=:rִiS_~;;./ѣG ٲe|M͛7O˗O?ʲ&N;v~ZE  � � � �dɓ&M=l&{VF@˖[J. .=t"m_~Z� ]%J /~iڵ|I 2D_|q\__m۵w6 Gxb3Fgu*T'o^ p_t˧zOO?؉� � � � � � � � �-3kO@�@�@�xWբE h6kQΝy:tPjzϞ=uWPsw*_|.hт-pѦM6w(}vkN#Fp/܅0_rSNUZ4{lݎƾ}ׯw!V^]vAڷon7ǂsu)gΜݻwm ֱʛnIW_}l MF܀τ� � � � �CRC{~YmۤVʕ=!A+@�AbŊXdInA.X K/9P{8a ;v~,{(b>3f>i |C)<nbCZOO?B8@�@�@�@�@�@�@�@�"R Ȉ|ۨ4 � � \cnd!hR7oqiȑ.PBʑ# ^f͚Z|^{5=.wߝӧO]pnxѣGJ{a7n]7쎱26]>wynoYʕ+]g b}Gw6oެYfԦMW[_d{ァ&M9]t֬Y#Ƅ� � � � �G`Bya>R۶٧ʹ4#]{Ҳe$!I.>XAK@�"[v/d}PÆ ]ڵkS԰ 0;C[yy_ QC N?쳵h"̙8|pmݺ5$7lHO?؉� � � � � � � � �-@dD}T@�@�HX`޼=:ƍpPtF~o Ȅs9G9s_G[XH 4~xh!}UJT`Aw];βJWgtMʕ+ wtxX]cccMx7ZH"!ʛ7oܺ+WN+Vtᓷr,D>pnj5JGUW]WGcuܳg @�@�@�@�[`$tibB gm}ɥN2e@n>C�"{^ʱKXBC{H/R+K.{!Z=D1SOuX`^jUViP'ܧj� � � � � � � � �#@dW@�@�Yу?~rӦMڵkMqT6$;wn5?wZ`/^׻}s׶lٲKߺs&ymP>W_}UdkFRJ_W*U'S֬Y… j*wm+ � � � �dɓvMsi(ʓx�)ҦMҭJI5jHMn]ڻ(@�_CZtU\YwvޝdK>qZpacbbjr򏷥? X"� � � � � � � � @=%-A�@�@�Nș3{wߝtuɒ% L pϟ?8;v= yPI3tP <Xݻwʕ+O+o޼:vk lܸ~G]{ޠսѣM&@&ʄ� � � � �Bߥy=&[4F"p@rCI7J_~)yjrMй,IGt@�{`Ϟ=n:=cz7dO><`=K>aȑ#رc_d/ u:3ܡZ&!� � � � � � � � @95E�@�@�R$73gpނ .--ƞp\R/*U jܸqZxqܡǎsa?sܶVڶmkذa.8򪫮R>}w},(2%Jhz뭷du8q֭N\_?/Y"� � � � @ L*yA(o(C _n-}}Ν<SҬYSO v#� E0; 7ߪG}/曮;ZI%w revrMjoU9/}VZ'f}6كF: � � � � � � � �D�A^@�@�@|6_|qLŋ{q:,7BG+Wj˖-n[nul'OqnL-@f͚bŊjР;v &8]hk֬Mp²A6{MAcƌz#V.s&M *K.k]{zgq� � � � �/0i}u)B&@ѢR=ɞ4{ԼTt}p!� ֟ciСfKc~ww={4p@/,/X7 QiӦicW'K?/nӯz.Ox� � � � � � � � �Q#@dԼ4@�@�8Y`ܸqkԭ[7p yi̙*V;sʑ#+V/6Ŧ?\O<f̘ F}z$o/{꥿K<.s9zG rn#HɎӍ7ިW?_>}SO= BY;vҥKݶ뮻N .tG\oݵ_~6~:u,믿v*]t\٬ � � � � @ ;&{B]m#-C e{xҲeߗjՒ֕6mJU8@�(U^~eZJSNԨQ~-8[W={Kϛ|MUVM&LHڎ;pԩW__o& ~ҥy~P6m\P(},@�@�@�@�@�@�@�@�@ r)li*r@�[Ba:wє� �a$PA۲ڵK˗/WrTbœj+gΜ:Nڗ܆kT *'k/^<n{ll ,RHܶVyxm6*i{7l.-t{ @�@�@�@�y=G:fZ@z_͚%-/y j@ރlI˧U(@�Xx{=0uzǼ`Z% ,~'6p"2do߮ʕ+Ԕ矓\\/?~Ʉ� � � � � � � � �I E�@�@�PO?]-ZH0ҚdA s ,u*ҿ-)w %Ҏ<y(&6Ƃ* Y"� � � � =&O>XGdxie 37^]^4e -ǥ  '6nLkR �iW;kM={qƺ]?q Zv~…Uj4@ZY1L � � � � � � � � ]9@�@�@8p`ƍdOJ*.2f^"� � � � @ L$]zi5 Ԧפop<r�N骫ϵkgA$ �]4c =zyu];w>UVMZRǎUh4y-Yĝ?L鏷l3NF�@�@�@�@�@�@�@�@ \r)*׹ƎM)ٻ8)`Ɋ$�HTQ9FLb:{fE<EOQsVPA1"AAIɩzjaݝݙ_}>ӡ=; �(R x]L9 �$@͚hI $?#d !� � � � @ ,]*U&tI)@ l.+!)TBuThVj!�Hŋӳ>Yf6^{4hPʴ_w={2"� � � � � � � �䛀{^;@�@�@ uTz~+K{@�@�@�@�@ ^>J:vwC�ȳO}T<9=)%|AJ$ݻoSlNζ �\z4a >'%ܺuu˻#TX1tM+ܿ?,7oMŎIA�@�@�@�@�@�@�@�@�Dg � � � � � � � �$RR2I]M*@(RDjJ^iLit+tR׮cI&@�$h۶~i-]TCժUďӭ*[;v՚RJd1ڑ@�@�@�@�@�@�@�@�@�$*@�@�@�@�@�@�@�@�ضMc[m5G 5nY+iJnI][6seK*#�$@ٲeկ_?7NfE]ŋkںu.Bz9rd7!� � � � � � � � @ d4@�@�@�@�@�@�@�(_|! }@CreޒV>TU3FIP!?'G @S͟?_}:v쨴4͞=[=z !-a$@�@�@�@�@�@�@�@� A2@�@�@�@�@�@�@�@�3ѣM:<;%'B�8K% $M.-X Yҥ[.TFzȗ^.l� @-N8A/-[!CQF.!Сׯ?Ges@�@�@�@�@�@�@�@�@ g$̙[#� � � � � � � �$-+I@@5kJ^(b4iԿ4gNz2;L*wkAC�@ ˗ץ^O״itk޼yߒtgĞ!� � � � � � � � �$N@�@�@�@�@�@�@�@�(0sJ3f\PRhZnM?^ZF;CXQj\P@�<8Cohƍ6l&O +@�@�@�@�@�@�@�@� � զ � � � � � � � @=Z*WNjӦ7!Pʖt ^ZR.9ԺdnݤZ_b?((4@ O/ .@?y曪SO5$ � � � � � � � �AL@�@�@�@�@�@�@�@�B"` :u\  ]zQiti2W-Ҷi\wի �MA�s4_g7B֮][?nݚ � � � � � � � � P$IzuD� h"Eh5xpD!� @> <tRvLLѨ4H|(E�@�@�@�@�rY`bEiPo\>G�X\?>}7NvԮԾ}Z6A�H!.ޫ!CJ*8p>lOmU8 }wfʕw}UdzKzu, � � � � � � � � @�@�@�T8Ti][%2?Tl!uF�@�@�@�@�pemԵk|۳ʕOyDGi*iHS'ou%֕;Ozi֬~Z� *T?f矯ƍkԨQ$<,5khD$L H@�@�@�@�@�@�@�@�]D~ � � � w6h],g6-@�@�@�@�(eKRBڅ� 쿿tҠAڵ%=Li|+UH>4ecGg`;@�*PF 6LӦMs%ս{wkN'N,T$}ɶiiiׯ_۱ � � � � � � � �Q 4!6#� � �)зog � � � � @r RnY?j�+PtKI_~)]{ukͥNHg҆ [oΎ�  6[oZŋW۶m]}ujv,RHݾ}z� � � � � � � � @a da@�@� i ȼ9mCA�@�@�@�@� wIKH'TP[H@ ._:Jzw+wIIUJÇKeKi�d_ҥB�(-g.{1ch"5nX}ݓ,/3Ν;.ߴv-;Dlk֬Mn � � � � � � � �@ț|'F�@�@� Nbv{ @�@�@�@�(FI5jHM.M{֡JK/ ͛'KzEU+iXW/u~a$KA5 �"p'jʔ)EM8Q 4pd.pr7^s='EK/Y"KKyh˨6 � � � � � � � �/@"7  � � @s�Oe[ k@�@�@�@�@` X"n Vh @RҐ!KkH~(yptURFRJ)H/}uk֛#�䟀%?ӧKW^yEkwܡG*6i$O?[n%^*-T\Y{޳gTjuE�@�@�@�@�@�@�@�@ ObGi8 � � @"lauz � � � � �E`RiAI;HVrNO?֭&OnU*^\.Ԧ~1%> }dmB�.Ӝ9st 7hРAS}Qm۶M]wɃ w߭z(w*G==],1+Ff@�@�@�@�@�@�@�@�H" � � eH=z _+l֕-u,!� � � � �M`hT) Zh$ôh!]}曒%5Kzq^u]J*HMJW^)Fv.� 8V1xܹ:}Ț5kjĉھ}.'k /.^pA aR˰DR@�@�@�@�@�@�@�@�@ sAfn; � � @ u`Uۖm@�@�@�@�('u(s( @~ ԭ+' &͜)-[C/>}ח.H.oYc΍� +Vԃ>fj۶m*Z4vw?%2jԨRQ\9uMŊx:S"Y@�@�@�@�@�@�@�@�@�bGk@�@�@�R@}_EmQ@�@�@�@�@�*e'R RYrezH[iigOi NKSw@�&NիWkΝ17 @v&Ld]ygkǎziii> >쓬ե^ � � � � � � � �$� 2P @�@�@ 1ŋKg!<z91G( � � � � @ |atIW7j�du]_HI.pteRAII?>qx� z۶mӍ7ި"EdZyK}vuESNtd{[n*SCR@�@�@�@�@�@�@�@�@ kAfû � � @ uƏɖ) � � � � @A5JjT^ !@A(UJA,ڵҸqHK_,ժ%ի']rҪUUv!�['tIʒ=fUvܩM6cǎ;wnV&{i>sIS7*� � � � � � � � @ %kŨ � � ;vpi֭~no2l ^  ;v*W$Ϸ|(V)>pV-bŊEm]iiil/%J>@�@�@�@�MKٯ_nc#�y'PԾ}d!7oRi0' ԶdQ@�WbHO- Vxuֹd4ydUZ5f{6/-[: 60!oaB8?蠃|}Zl{&X;cG/Ek<,ѤOA�@�@�@�@�@�@�@�@ q7Y?V6+}_Nl� T9`<g!� qƍiÆ e[o6mڔ<zy1\Nn_]'f7G8H#asJ&>\o9l*]t2e(ʖ-Yu I̵( � � � �$?JM%ǑZHR'@ .'Ǝ>8}W~c.]Ν:u{N� 8իWkƌ~9sOiӦi…v&36Y_^y?Пsx0>"b 'mHbI%cX\@'=g}2ٺrʩ|od( � � � � � � � �@Z~s"� � �%L )؀pB+dׅo>ӹ%*`6 - 3KrXbe[ږm %W 'k`lߧ/7mz¤6'.\ ٹsgd֙M_1ä[l=`dϮs8pDO6$- 6lٝ@�@�@�@�@ wFV7pt@ Y\*rJduZ@3&}&+zғBZbcKS@ X?Ub kժsW\Eiɒ%dGa}֟۬Y]܎^}+V%9b@1A?XC.9,v!VBӐO7pkl[) p D'X/w3EŖϒBZr *Ĝ8�TR%?ٲP@�@�@�@�@�@�@�@�".@(؛D۫W_^2 @2 XҢ^=Z@ ,5k`g\^n֮]yl2o PـS$~ 66D~)~U}w6#& dL:\>; `p@H|M6H$2Ab@�@�@�@�=hZ:p驧lB� 1ӓB~4uԡԵtA@ ,iŋemD˖-ҥK#sX, J>hay,q%X,%VLbaŭ+6}H��@�IDATc]:l%ז25RΫU&W[RM  � � � � � � � �HQ @ d4H%[|VX' h_jlulIx  sKgS1\N5RI! ln 󔱔(Q6l@OŊ.G+U$*W쓠f<@�@�@�@�(.<P92=Ya @FLcH=&MSNI6͸@�oxZ`.\|ѢE>=0,�$O8[1%5, %,bk¤6Z2P{heX-kԨ5kɒzڲrYၦs@�@�@�@�@�@�@�@\kZ�xAr# �SYyä|ӦM )Sfdu.LXWBdIù-/^|(m6>6($rL7nܸ Wҥ#I!6X(D=@�@�@�@� W}Mrʦ �d!`u;Vzw%%JO{Rr{Y@�(`,Y4{l͙3GmnaaF'$~@Zj~\KGA22GOvEOL2,JC9DkVݺuTNY�@�@�@�@�@�@�@�@ ]SZ�d)@",yxH9׻AZxb<-<\[md_%--M+W ,-&^ur;Kj>6ϸl\mo\%U^=2(\ HJ@�@�@�@�RY!^*#�#0e4rdzbȟ~ʗuzN<Q*Y2Y@�͘1c_ܹs#LKgI„|̍q+yf-X'?~dnIH-)i(b>^zjذ.%$) � � � � � � � �)@"ԼncA1;"�y.Í^$oi…Mk׮ԫdɒ:#¤oUVI@xDR_ \'Đ.YD[l4iB2N64YbŊEg@�@�@�@�dp9STC'Sͨ  z.ߔyGz-iDi}SNzN8ArϠ �)!`e6m.Z KW~}5h-cݺu}EJ4J?'f̙3e Lmzj`lԨ;Ըqc@BEC@�@�@�@�@�@�@�@� d _<�� D}@�mm<7ʒ>%ܾ}? Fla¶ZjEm%}h#^) @V%/ar Dm},2--ޱTvmd,,@�@�@�@�=Z]o]RjU ΋�<׍7ߔ^{M4Io?SӓBwTxk3-B�$ySLѷ~~O YlYoӡs{(^ѢES({X/YӧOL˖-[كd6m&M#T-dF@�@�@�@�@�@�@�@� dr]j�� s � ,_\6_ٳN7nۗ(Q'Z;C" k6Rw8M dC„0Y֭[}ʔ)uF˦ rʹYM� � � � N0@�rK`B7_ZPA:4sms]`Ν:uKkM<aX=85n82كH#k +?F&Kj"-AYBȖ-[裏VV>|Z� � � � � � � �$� P5@ 7Hlpo惧-ڦ3fi͚5TRW,y <5kd7$ ZF}Ι3' f͒M7omհaC?5jHtA62D�@�@�@�_I^5jH\"v[ח"�A`/(M];=!9/6Hm۶ M4I*V֭[Dv͛7Wf|r95A 6m$K髯ŊS۴i:e} � � � � � � � �� !�!@"R[㏑駟~kYJt衇g 4P8ժUd}=d!`I",X3gF&KkWXw}?(iܸz  � � � � %jB{Ixb;@�D R=KҲeR۶I!{/Qg8 PM>@|&L7ϵo^,l.XjOjI!Ǐɓ'k֭cǎҥڵk%K9& � � � � � � � _$V@� �  7|oR[={ %.dfGqOlva% �OAZBHeSʒXiݺuuGyn� Lr� � � � % .`] @ ov>0=);蘭S .?^ o@ l>9RcƌѢETNp :d +WZ͛_?- %޽Nq_UTIQm@�@�@�@�@�@�@�@ yH׆!�"@"\a P,ĉ4i$lΝX5k'KVִiSծ]'0+@ͧ) @ XBݹsIvL"VZEĺ[V6md") � � � �>Zz1<@�E`:7gkK.H:<QRK�-`}m6hN҉'0򻎜uݒB5JGuQGOgU„� � � � � � � � �A&�C �$@"TZB}4n8-YDŋvH[jC9$/9@�B/0o<}~/}H�vc;8;�@�@�@�( H$}ԩSaU @r 4t ҩJ_,?%wݩ䎀=駟֛o;v{ٳ\')S&wNQ@ !oFo^u-p)>}>˫lٲ 9A�@�@�@�@�@�@�@� �  PHYo�([lIicƌќ9sTtiYGK0־}{TR �@ 6mڤɓ'k>a%uuQΝխ[7dɒP]� � � � >*|rTD.#�r '&N~zBΓ*UګC3=sz'4}tuES׮]ELF \@@&_ڵk}rW{nŊTreS*UTzTF +W.#@�@�@�@�@�@�@�(|$,|ל#@! d!h>T{z7kÆ jҤO ֩S'b rגA~G>?ec~w\è0 � � � @\*_>=X\; @Rp:T.q3ϔJj8)G%@ ֭Ӑ!C#b1.22VZ5gP [nuƌjڴ7o|r-[LK.͖RB|:CT^=կ__ 4PF( � � � � � � � @! d!40Ar @a0a~i[n0&uQ=z'jժ& ڊ�Xŋd#Fg}@vi Զmn� � � �F?8@>\:(@@�$ 凓%Aj=IE~hY=c뮻|[nE={TZZZaf )S{ȑ#ug;P5"m_jo~4g믲RV-qj֬Zj-[bŊ㰀� � � � � � � �4B' = � @!ضm�:\7Vv|<0K.I$Aݺu˗+tR=3$j7pCan ݻȹ{vmjڴ׏7N^{6lٮ.~jӦn?cǎ<mj~Y۽G\n]kJ>/U^nwη"`` @�@�@�@�J]~[h PXJ.X6MoH*SFa~RzK�'0i$GC ԩSէO|IIwb7rvnYᆱ>${E'I'{gbGčo,!%K.عso%s]z}ȟ?w֬Y?^tE*QWR%UW]lْ9stwGso紒ppv@�@�@�@�@�@�@�@�X$:@�@� g}V@- O8QO[�O?~Aa0t^^ hZfM7-P{ڵs _~�ϟ̙3#eMu'C=$0fuE^=։r?[)Cyyo^{ =ub?@�@�@�@ UyGo>rJPo@�hNFf̐tnEQC0@Z0zK@ YR}7߶E_x2}9[2Qufo&'[Y|M>lmHD},٣ż<swÉ'UVeyh}a}znV[:/[/Йg铁ƊcccԨQ1ϝ1v /xӦMڸqppv@�@�@�@�@�@�@�@�Xi6C�@�@`,c֭u>._w)V)68"?FlR\sMTVM^x6l,矿˺}qƻŧ~o}ce$ya]}W?fϞF˳9N$`˔b}^SJEɸ}v3e:,aAA�@�@�@�H=,$|r՝#�d-PE?OR:r}Rω�"`9=#uL2r>hIn(:y:s}y.-Z5\zkԩ tkoOOSzuO[, <Hf mc"lޏuL!� � � � � � � �� C  � �))o-wƌi+VLɶ._ʕ+yZZZ3b'Py晻yZ d7o[Ǎp+8cg}KIPc&5ֆLNj*)m;]aAA�@�@�@�H-q㤵kIZW"�9pݤ:iiP/8I={J}c5^Ǐc=6O36ݓ~真%g{ĊUV[<ORƌ#8B;vիp~s92EwEW\q5kN9լYӟK.G}cqO+'zmm9y?x� � � � � � � �D m3� � ^ 1B}wܡni/oڴIGK/7|S68aʔ)z뭷>k׮nP|ys{4ydlI${1}~ӳ>߷>&M$;\Pj|g;woyȑ#eӲetGn+75|p]vmy睲9nD .Nwﮫjun^{5>X>餓ӻ' _jvukiV?+>+~?_p}緹 TF VXB?~۷:w췵$?J*C="'%3YYfOgAZl)k?,cǎհa4o<5mT+WT"E·<l߾xGC Ѵi1-y;4?蠃4hР]݋[~s},`X/D6ݻ`ޮ_Z+쾰KFY}3g> 1+k_a]CѣG #� � � �Kwܟ) �\xqu//I:D~ac 8�C bAI[Ϊ?lt<}ޙ1? d+O[8akxb+8sZ<ŝ%3k4 .mea\2['3ܗ+gאU<oXͽޫ'+cL~<>nҤcoVڶm+fcsxwN%J?/bI_~Ԫ^z>f:A:}%mkcbnF=SXK+'z=63 � � � � � � � ..)EJϞA`@ yܗ@0`[Aj�)/_>p #7ss=7pAہ޶m[0}ਣ] \o{ѢE7.ho$F.<p UV~xбc`ԩ  gVf͚s.Ƭ,Xُ[o58c1\t7#ظqcdxEo:~_w衇.^>.9fҥw׹?~ֹ@% \%ċ3Q fk l\~K̜9ӟ.1?nu`ЛZ=ܹs:uO<D:tdK$wuÆ 7_ƍ}uvuV.>p7|%G \`ԨQ]Lp,jy~3Vv۵kИ1c58u͛7ܠ>K}i>a 3<̟??pP{c7#pQ:\A~p]B%۸;7#4WV[VX[}`{ϾK( � � � �!u �p]=A \ ?N98"/\|[&;~~kR<}Ym~"%cŬTXco…>b’Umgg@x ["t . *KwqgאU<4k,p \2_~V?R6lX7{m1Bbt\H*vG,˟|_rMxCWfX+aq VVl]Vq8YI7eٽn@�@�@�@�@�@�@�%"WH8K�䖀2t9.СC}9 .h%LhAVfϞ-:K>gu[_u]t؏wy'X%Ug}}0:%dT/XbIKdcukq0+]8Pł-^X, %:Kg۵i&p+TR]6x!n2e?lX_|1r:e,cEK&xDV}W~<Я XPX{rҦx%-YdVRn]aصӧOOi"Afw;?(~7>;#Ƿ$9)W_}'lEXiΖ>vX"ލBsIYlvgu<Hd]߾}}3?+XG* vZ'|2[B@�@�@�@�!`:rr ܟ( �\ %?|A2gk%}O+][:Ɗhݺ׹rᔶ.Er<K. 8�Ѷ1{`kcĊGxKi]w$^{hX,$l2OVT)XvUc$ܮӐ!CrZcfF_7x#rXq87ZN=^#� � � � � � � �HsA(@�@�RN ,Kr'-]]]6)]]fM-[/7jϗ/_ٶm۶jܸ\R8DrrA6l\GB\;ժU+_vq]HM6M.orrԩSd{[p EֻdyS֭[Y ưvaO%u W%N, B#8"mիW/=ޡF{=w�t'# 2O<3u[[G~۵0Ejao3mڎ]u-$^cV?+W=X~>~x]~+z7pAr!2{s8p?0SO=;%j<#Gq_"BΝ5~xׯ\K-, 4v%]ާ9|Va]S}n7K,IP@�@�@�@P?ũzuYB\� GK| .vԾ\_tR˖Y[ 0UVck ;fnho珧;۰{O1ڲ/cciOc묿b06m*Hu]M41g`Ot<QbM,~p}v.Hw}{9H-b,1wdΕDrI?s ;bN&L_9]79#sz";� � � � � � � �$Xh@�@�KgI͛'K+V,f.rܹ'?ꤓNZHKfKZZZjW믑N*K3Dօ 3g~_~ٳw ϭ݊%.cǖk׮W]6[{Dch'ҥK]F,=ƙ'9:_G[S<n�^{> {?"am yb׎anժU5tPիWONxl疌ђZbaZ߭6V1/^ܿܶm[ݖOs̩nIa!]BA�@�@�@�H~Ӟyvu �y#Цgr֯L9jyS ΂@!RZ=0JN珧;۰yok][:Ӿxefݻ@u)7nڴ?@5>;fVq ~c7N]p^V`خ]jر>gÇZA"vgu|oƍ>ƫnݺR 3gsx3|mrz#� � � � � � � �5L@�@�% '{�nJYgY'|R}0//ZGU^ݿRJdy睧c=Vyz[(S%s ؎.c-Ko^xO1D|7j˖-m}WS;vW^3f{e֭~qĉgZaoݺOzg`񔰮|2&f9VJ*CM0aC<^>3z/Ki%@�@�@�@�X@^v �#бdM.gs?e˺G}4eOhvy8s;"XHٵeO/dN:G<}v,W_Gٳg$>!>2;gX)Sh˖-mj>w߯mI2 %KycfI0l0d:]A\+Ѥ}>f0V"|@�@�@�@�@�@�@�/A<E�@�+Eꭷ7ŋxeg ׯ,Y5iĿ?~|Ͽ[.]:,V^~eUZU]wƎ뷵qn_g2avt}uUXV-~mG-Ha? <\o}-J:u|o>L;w�3%:> ' **Yq~Ku+g^XBkV+WK/~wȑQ[eXZ5UXQk֬pK6H~jʯy7>pnoı"4gXQĮ}g;w @�@�@�@ yG*WN!I@�WKuy>dҡJW^)ZT{W}M4~xM`V"vڒY[Ҋs[yاc+_KxSxqƩTRgt~U5|=0a\GwYtL@{MzYYW^YR,.of}ݲ姞z*!C Qƍ}O{p�KiqÇp@�@�@�@�@�@�@�@`xp� � �m-=><kw5Ä~neݺu KeA]h'Kj]lgЛ7ooٱf̘nI￿V\, +O;4/XO٩S'oe3C=}lw͊+"ۆ/_YpBŢEpnn׷>@>:gi%V`;$b[}ovzF1믿ܹs<a{>3={v׏9~ڵ!-Z(xCpnۇ6աvW_ջm 1B-[ImP 7kҤIڸq|A192kk|6ݺuڴi׿7 tzڀf͚yk;%4g 1c:Kj%3QgϒOFӌx>?>h4Nl;¾+dBA�@�@�@�H~{%r � ˛4%!<&=eK@M=fӰ6Ys]?y睗mmlEf9*V$ع~>ACHG={~|�l}"bGⱴx4V7 n+J{.p]vq ?S` aśXT~'~9=�V{mh۶K_N}PY{ .;sǎ}yVvYRڵk WꫯTdLkI5-&:1HA�@�@�@�@�@�@�@�M%@HX3l �$  x=y+H@�=ؾ}{p} AÆ 7 ضm)wq l1p}ݺu.킼믿>8qbu_Vq.?TRФI0 [n .Hcn @pWӧO\4xE].8گm.9ct,ݻGo߾}7=XPF 7|s~;K ̚5+pvY-[Gq% \}u|ߦf͚ :ꨠbŊ?{ T 'L2%8ҥKwuWsFK̙3y_z%O}q5;w \2EMhbK误}̪Xb駟q!^`'%Jרz ~aڮXfúxGڵkl3vzÆ m{\qAΝn~;=)S{8p1\F_{o߾|(7vnp?fA,.y߮~Ks؉|dwM6ܾ ;>qAA�@�@�@�H ի xԨ/D�H.? n \_OҿOrU\6${O0ʤeU߭oM~FbEjKh3vÎi~nﶾ'|2h޼y`n}Y/cz<;..1b`X_Ǒ{/>bZ,#c<n1<aW\98묳3p-f9*!w^x!p×yVl /13[GN{S}܉{mpu{4<{ _g$m+'KdK( � � � � � � � @n ^ 9A�(J. G @ ,[?R WoW zޏU\0~rITlXe;1g=P7pj%K菜qK8)`S^z^-]T.!fdV'r(N6~_m2[Xre={ԩ#8V-gW?CnF>_.]rDr$"ۇ ٝ'.57c/^,?!&޹)\TnGVZiӦmܠtާ}>3~.:/n@C%K`+TV.!k2U � � � �d# ҅J+V1y@�L\WnUzyysm3٘ cO{Av:cs|!xή6Q*V$޶Ī˂ |ŠTFmپ,ssTJq.)÷"31d|9PQA810.$ٮ6X7l .;z\x$POM:5GdHX,F>w`K믿K4q=ڵQuI'dɒ=džX@v%8}@�@�@�@�@�@�@�@ $L(C�\DI~$D`jA6Y 2ӧzD&$$K;C#Gr ϳ&ތNwX2.]> K.8w܌wy팮Hm%z߂Jݧ$-6iĈzWjժ~TR"N1@�@�@�@�X䒞Hc9 @p'raҠAN @,)]խ[7#CRvVW(cG޾Wn!T?f̜9?v>?jDmݺKV;viiiyDX@�@�@�@�@�@�@�@�Y h|G�@�@`O,׭ުnI}y]y啺KԾ}{|~Aݺu엍 hذa[.]:sUV/^8io?x1ߋ^YT)YpzV%?]xԼy r*9dw ={Fw}WǏW%QFSN*V]@�@�@�@�AI>@ 7>Xz=骫 +}xo-@ ?օ^56m vgRܩԯpǎdU}0}5d[VI m{ҥKsNFjԨ6k}O7PѢEC5q@�@�@�@�@�@�@�@�<(DW#zq@�-`OQ0u 3чx @R lذAF>@k׮U:u|�q:bŊI* @&3f̐%iݻ>U\91'($@46%;v>SwΜ9*_t=zk׮*[lY� � � � RS${ρTթ, @ X{'dTҐ!Rǎ)Pq@/zK/CE]>}iD�,,=ܣ~X+Vs2$+ZU^p Ou5}t2@�@�@�@�@�@�@�@\Iځ�)@"8  5qDY>H?,Sնm[}ѪUVv(Fu],d>M ,З_~ &h6m@ҤIȷsjӦҒQ@�@�@�@�\prhhҤC � ܹWK=?N>(UƬF� ,YD<z)-[%>EgqTR9>; @ L2E5k֨x>hѢ/ǎqUwU6ލ,~g9U\F�@�@�@�@�@�@�@� d]0�� V@ ^Zƍرc_hԩnOVԲeKhB͚5~W h ֭ o4yd7~w+VLGqڵk:cQ T�@�@�7C-��@�IDAT@�@ vVV?s<@�P`(骫˥?i�Q2G�'襗^҈#, 'B@X=l=1ަהYf2))! P(OÓROIhԤP1dJ(Be93~u{Ϲ^ms>{>۹ܵwiʕ^}֭ղeKҥK>W'Nw}͛7+`H0`�o>y*Q@�@�@�@�@�@�@�@� 2>,�DB H(r Hv, %NzbŊT.Ro)VXZ'@� X/-?Ν˗+ PB^n5,s9 � � � @t 9ThTltו!�^zdiE`߾}5ji={x]s5ꪫ>?�#h7nƎ+ԱN:ռys(Q"Y0Mk�{|0A>S֭[E@�@�@�@�@�@�@�@ =>e 2 M@$V^9sl7o6l@U|yom۶,X$ @زe~׸e…֭[-Z.2/\vTҥK=@�@�@�@~X=Zz;#� _{,S'gO)G qɓj̘1.|עAW  88"A4e/qҤIaBY0kƍuמVe˖yÃ!> � � � � � � � �Ħ�AQk@<e:ވ�C`ӦM_`Y-[P!-[K2e%K'@�XY+Vŋl޼ٻ9sꢋ.iYh%\K/T K � � � �,~[o>O@�8@($raX[oI `gF� ZJ&L*Uj֬5jZjʕ+WɁHO7͜9S?f̘.9{],WjUe̘1Yh,i  � � � � � � � Lw�׏�N ts !7"h͚5^ E,K,ц dʔIJҹ瞫;[۶-g}ɓµt @;w Z|yb3}`+E\ /0n�HγR@�@�@�@�HL`<bEi,u@�WeåvW_Ksrt8*`}.Mӧ{YrʩrʪRIrql!9"O?iΜ9zܹڽ{Y ~G[W385@�@�@�@�@�@�@�@� 29 A'@ = X JԂ5 RH ?~/B!t*Y,X0=3r [lڵke^?˶mۼڿ%-10[[?|o!6>� � � �3=ޓDnrtv\. @ &\ԯԲeV!6mgyٳe֭[1cF!mPʗ//kui'`mϟ3gjKطxyU,Yi}:,@�@�@�@�@�@�@�@�RY T�8= A8C�&o>\2.t-_ ֛7o;PUD /TRvUX1o… {KÇCZ~u@5^mwPP *Bs9GDA�@�@�@�@ \fC@�Sؾ]zQw[nx&;#Mt7w\/.X[[9s\ruElٲ 8HVc!"־?uTM4I-7n3g:tȅ4cWϑMIA�@�@�@�@�@�@�@�H}̩_j� � �flXHuŽo3g_Ž5SL*R,hѢ'\l@A�سg7cÆ :b6 /_>{v{_*[dɸ5Ak@�@�@�@�X\Z@'@�H\ o^-ʗ}Wj8$@ҥeKfNsNZp IPHk;=6T{>k֬qbB}l2-wA Kjɒ%V,V Ë 4m@�@�@�@�@�@�@�@�T 295 � �I`6`ˉE_>n8{l!q+VЌ3m۶:%G*\ *÷ @q3<S2dNS>رC[nՖ-[֛7o֦M÷wV?c_Xb^裭lٲŽ @�@�@�@�M`0uIuF[ͨ �G.~k{^}Un�+'OլY[k{n-ZH/ ۛ9s>corWT[.2ygTR l=7AATo/1vZj1KhaAHMxw /:KWv4wc%V:u$ #� � � � � � � ��A)i@�@�Hn $T<7z?S>g2eCZ8-@gK|% ț7fẕx@Z۷oBm-y ~ ÇCaj:ƒZ)?:K,Ǽ � � � �ĢKuF�ҕk'H͚I;JK~(ծXbN W\RX]&O;k3v]ߋ=g͙3=V69gPrB/^ܛ//X-ZT֎k8(Cñ~7ڶMn:N0y@G K٣oFK,MZzulRW^y,2TPAgVեKY D2|m`a@�@�@�@�@�@�@�@�:"Uo4dHq@�"-!Cu4D{9 @N[l ;~; _v|-!`H[ ȓ'ķm̙S60:4 +`%޻wv صkGowwjΝllر {uhk <dv#- 5<5.X`\vS@�@�@�@�HO.+E.GG#FaڹV@�ذAj^=ZYzؾ&j@ZX}{mm>5Ŷݼ}(Wb͚5^(CYȟm[rx~,6 mpZ/D`m[MLh=m`"V2K6ZcjXcRf} +_jС5kwo\R[hkZd4j( KmI ]~[._2f+ � � � � � � � �) @d s @ O �i[8X -AzA=ׇ~"m Lhɞ=dB%d_[h-2e<[-6b -1Mm 1Xs�⚻}1Ʌ8vBJ 4<4xb{( � � � � oH]ȅ@�xY2eO?.(u@@ZR B'OVia%x*~K8p 0ض D/m?!|9XmLi}kA�c@}Vuw> (_7<<ϢEzTZ(_|3fx6mTz iA:v_OjꪫԽ{wM:USLgvծ] rT\!X#� � � � � � � ��Ao@� 2>.*�{ NX%</xޞ <g~.>{2-'.6" _[Gz{l,Yxˉ̙3-vd̘1n<ymǶmG#v|m0đ#Gs6P Xv|<`9p -^vf <>4<4hv޲%p&N< | .Tj_y'v� � � � �IJIY!CC�@ ,tۤ},`-1X֬k<61rM|֭qA�a&ݴ 0.pC?Wg`mm6IfDAyNB|=m{lYA)`TҖom_`&y` ķXvY~ 9tPM6ͻ-ZUV.ܴ..e^b}Wz쩮]]}. ^jNjiǭZ7#l � � � � � � � �DD Ȉ0r@ v3cNCԻwة45E�@ >TziirN{To Aڶà vRm} ~oCZxc|</]sFo%_dkXU (ſ.m@0@$``lA(`-m =Z3FZTʝ[jh0d&JA�@�@�@�@�SضM*RD#[O(@�psI7'K/I.Ko%yftԍZ V8hk ~__zu6v6~Y dhg#sLJ(߃~ CЗ_8Bش?5`'AxeA[^ᗶ s`iu7g}k޼y*Vԭ^(d*U4c kYqu[n/fδ׭[ݨQ4h^w "/"� � � � � � � �I 2iN�Hd8@�$X�׺?4 lb֥ԳԽ{'l,Җ={ /C!70,R@�@�@�@�bE` Cif"X7D�@ ! oێl:EA�I-eyk ~t9Y}jfiҥۭ!CԲ%U;ѢE@Oe˖m[hĈ?GO/ӂC-<d Q!eժU^0dMB!-҂!-� � � � � � � � prA{#�1/@d\� I|ԭRV~�7佘ޒ:v^2fLEN= p?5j/~υ: � � � �Ğ@Ӧ~GSc@�mg'WsiH˳ }�u6ZzG?x@vKv 8̞= ͚pjC#mݺUzOlիWkҤI.u^f.Yvm]q^0d*U9s � � � � � � � @ 2� @z 2}\/ >&NYAU^>-C/)%P&vԬo :;V=Z0AڱC:qc?ҍwPΜ>@�@�@�@�8]RBқoJڝh/G�@ vB!wokW?Ecz9)`,!!լ>ڤ|.ӎNA&`~/>З_~ÇKo-2RA+W<&r<;wnխ[ pK/TvoP@�@�@�@�@�@�@�@� X!�i^ 4s @'CFz9rtMΕNMInjԐ,2W9o!iLig)KN?!˗ZS@�@�@�@�R^Ϥo6nOsF@�RJ`U+B J3sW`ң/j ~ZY3 i ޽[CBN2E V֭P *DK_n ܲe ,B6lPW^yʔ)sr0@�@�@�@�@�@�@�@ VOz#�(@)6@�X\UӺdB^W/b{I髯S씲C :<li()wh=ӦMر~(qPF:HyFk � � � �'в}4~|##� -y]j={JR R;@ ,Y?ZRΜ~;~?${ 2?+W?+VbŊ׿6mڸpȦB!-X pH ܹsOriiA@�@�@�@�@�@�@�@ = ?uҵ�A@�4'uқoJ'ti2O^yEOZso^Lj)kV?�T>D}Ñ#O?GKfZi*1/�\ � � � @}RBC@�@ Թ?YGI KөRh?֮Oh? <-qԩ4d:tH͛7w&_MW\' &x̙3ZUW]\ "u6 � � � � � � � �@ t!s @�Al#�ĪR>~cSOIK2%_yGziǎ;ljlxF/? Ng~|Ə!nj?.iZ(j`x  � � � �iM`pE izHvu\ � t`_~)U@,X>bhK*R,Q cݽ{>Sۚ={ʖ-W۶m]`}Y .Tvnݺ^(5_@�@�@�@�@�@�@�H�AI@b@ - >MHCH>*m*u/rO\С-HI3&gviSߤQ5"{x_~9 9}t?B!m^ӴsM � � � @zhZZ J5#� `mZISJKwމ %hѱ6H~_?f[EmO] SwΛ7 Oo>5kLs 盜O;ͤ9vX/rӦM*Q u+/_F�@�@�@�@�@�@�@�RT b@R8 � �.\VҥSOH%&e#BrD74nT\|?07.TE4<6CTB7K/_α|@�@�@�@�oo-b8 �-P~֩Ծtr .n_T?CI? _??Q !iR/\8qay^~em۶-7Fٳ:Kwq,rKurJiF\5kgϞ={9r@�@�@�@�@�@�@�@ 2\-ʐ!?@�Ofdizn}F �#q' WR%y*^hc!kJ%JĻK<y?xm`9m;ɢE1cᅲ*T5:u,YesA � � � �iP`H]//KB�@$FڶlbN�@2.9yܹ%kWO_ߟԎdCZ!#y˖Oя0jz뭷ժU+/RJOٳM9Ic\ [/_C^s5jܸl]) � � � � � � � @ CUE�"!@d$9 @JXpK=zHg)\G8s:닯%[_tQ^MCcҫJ}H>'ـ+ e)W.aãgWI@�@�@�@�Ҫ]-[&MVB�@/5oҟ;8u ~6 qӦ?fti[ ȴZG}5kz-ZgtR/r;kPYjU]wujҤ.2HA�@�@�@�@�@�@�@�Y c4W!� � @6MTIzq?,<yjBv:G]ֿPχu߱g7ȊK/IGH>*stRNرψ+F�@�@�@�N\V@�ʖ~Qr9Vj@z睰D 6M(ؿԲTtR׮zSҬY_I~OWDd?@ ̙S:t… 5i$+VLm]RԽ{w_>Ů<ྟնmۼu5%5h 稒J([#FݻS^@�@�@�@�@�@�@�8 !WN {C$!�pܩzR@�2M#~(]}ԯmSNC`v)_>i8骫N@~uKzM)#DT[1`dI $ � � � � $ԤzTdjԀs"� ֫i礎2g:S'O_6o.oK_ߟ<?qHE)B`ݺu0`~m/yzeU4G-SNu}R2kڴXp%@�@�@�@�@�@�@� S @ ؜ @ 6_ҥ xX}NÒ E_K"]{4x5k.C+GC!'L, sB^q+WoI@�@�@�@�".Юh?4D�@ M |ԶT4t?<.&~B?1ܲE:c+V~L# taw܌W?ԩGyD_x)p׮]nq9rulv ^zW/ R쾥 � � � � � � � �!15N9@�@�@�@֫'=:r{  )~QW\_^;qcԡb hMZf͒5 `, 嗥 N$ @�@�@�@�$<(!l@�t.`M.-[&U&{:Gkϟ$paB[7¥̑n D:w @#2AT^D�$ qjӦ~'M4IyM7ݤe7޽{|H;wn  6]6lZM%JPǎ5vXY%@�@�@�@�@�@�@�HI SRs!� � @~iˤ;6(kW*Y2>lDFiΝ9VrҔ)M"}w֮-=?kFwb H 9Gn~x� � � � oZ8cN@�ғJgKEH5jHGZ^ [ w,|kW@6i6?Gʕ ~LȔ@ 2].qw`ܰaC<*iya9%cƌUzꥅ jzǴb{u׹B[g~6Q/w � � � � � � � @ dQ5@�@�HfI+J/(= XꩂLWeAvn:ΘU֩#Z޼i֦ǒB@{ j%wSgHPFA�@�@�@�@T WJ:#>@�ҟ@ĉҍ7JMJ?Xv_~ςB{x~ܺUkᇥJ${FA�RElٲ0`֬Y?zUti71]ZdI)eʔ5i$7q&m۷oB^{zwy𷱍� � � � � � � �DL]@ � � K]JjIŊIjO?ٳ'v^?\ݻO)sΑMv,X'Tq2HUHO>)M.m"}f7U"EO>V6@�@�@�@�HTihݕ@�@8YAɻ\;n7!#GyǪU?ՙgeI={JZn?KWRN?KA M tɵݻwիտM:Uʕ-n]m;аa\_-/ThQ=:묳ԠA/(rݺuQP[� � � � � � � �iE ȴIr � �DO?I+K/Kgm]]\Ym6ʯ v Ak'u6j7Բ :w֯ڵ?3 #NU � � � �$رΝ @�/4td{R&ִ >}f$K{4gmnB;ןµ-bE)#= U"e˦kѢE<x/^n/s?ϚhƌQsVϦMiÆ 3{EW^*U>Zvmԙ � � � � � � � @l +6?7j� � @:$u.ը!.,-X uW̙6l^x78$ׇ+AvyHcH HW_-}MrpSPAz1iDi6U"}T?IA�@�@�@�@ \3%Ÿe@�NVysyڵ储N h.K,,Qz)CkW_Ϋlنj)Fc4|vNOr-<9?~v}Eh,E%sjذ&CӦMS͚5ǥ.]ݻ֬YE* � � � � � � � +$'E=@�@�AeG*Z;쳏^c.QnݺjҤ'ي@,Ag* *n-x'7ߔV-zJڵK~09it@N!@�@�@�@�bV`~믥[oK �D@ժҬY~WTϒ 7H H*I=;{n"tGz*ʟ? J"x<�34c Mr d& ZժU"2ZnvW]GիW~,CmkڰaCU � � � � � � � @  B�@�@ {OXQ:xP'$:9RSNK/#kA)ңJuO9eG=Zں__q?6;3GB�@�@�@�Q={-b@�(YR>]b ozZ?k^VRRϞ/H7KÆmm矿Wߥ;C{M態3ү@5n8r<KŊsS^BNQZ$W^yEVB!kԨ=.^p%z-u � � � � � � � �' 0<� � �&_@3 /<X?u$@,A"6wo?KY.=Ԩԧhr\_ʔ,8򡇤1c} � � � |r=T#� @@<~�d˖rY᯲ܛ$&kTʟ~KʒEzii|?/*T8:o慞1B_,U>F  V*:[pa]{U&L ̸ɾW^^ʕӓO>:Lh@@�@�@�@�@�@�@�@ uLwΊ� � @=[XvAiɒ%zR(.Aca~Byd(%p~0W_I[J'J͚I&I,8o_iغ6j� � � � ]7HZ%/{ � XV{IݻK:O1x X9+ HUH/ e*=`id< ]r3ZqɞsB_gHo*UrF?xUW^z^b4[X(d:uԿ_޻B TH~n1 _sn � � � � � � ��A)%y@�@�Hud.P7O/x߾}ѣij ={"z?X6_K.tWFHa4^|Q?@ ܐz9眣wG@�@�@�@ 7O*pb@�҅AZ uEC.т4';sٍٲKmkm۶t3w}2eJ*HժUM̙3~+5cƌɔ)j=mܸQvn(QB<7:NP@�@�@�@�@�@�@�@ n?z.@�@�ɺf顇nݤѣO|>}hǎn()"#GAT҄ :G)IYX1mҐ!Җ-KsH7`ٗ^Opx@�@�@�@�d<XjHʗ/YA@�@ L];髯>Z{͓_~Y:g.=p\4th҂+нK5jr �@ڵwiҤIgc Tc(k֬jѢF?ӛDTŊu饗W_Ն bZ$ � � � � � � �DN Yr$@�@�ҝER*Ҕ)ғOJ2a֭z)ryeݺu0`4i^zųGd8qQ:ZwU[dGəSڻ7+S׬o+VHuuOP)uWqȍ?rH1)Tߗ^yEnGWL_iU> iܸqy'{֭[N:j۶\CA�@�@�@�NBl+  �JcJӵ;tH5˟ -ڂ\_?wt [7oެzmݯ\ywݱ@7op+܌lY% v3f{gvÖk�v3f$aovIwjGkժUKt=h1C?~uM:M˖-Sf믫dɒ뽰ȃPQ@�@�@�@�@�@�@�8u Oݎw"� � F^]r}5w�9lԹsw>nM6i5j:HC$:X7nX3f /k;w&h!GiϞhS[A-ծ--_~rOS զM7ol F.T#@ev(-Y"v<GL)@׬YAy[2$w'] gz4uT͜9S~j4V � � � �I3~GٴiR~ �  I K[텑cX?Mf(N}[xR6o["E%xm۶}n۶v[=|%veM ,(sfp tRM<kk~X$-[xB~$.]&Μ:,{^߉?_ݺu>>eʔQϞ=͈:k!s~6X_-� � � � � � � �iV 4ra � �$sI7 h!}tYkժUz7Խ{wʕ+7GJtwxfʔWO!7E7gK>|~s=ڽ{>?A*!gNA S*V#.]Zr^Λß<B:tڵk:M?*Un$ Bi@Z5Hrg%}o]JD ڵ \r5k@�@�@�@ 6ɇ.9{@�@ R+a!eaEȱy ~ts_?'ը!#yK?n }?AYr'ذaø ˖-B$]+o7ѣ+s'ژ,BlD  bŊ/wiI:tŽ"`]֗h^K:sk~2L ~d"./_^IKgCU@�@�@�@�@�@�@�HNzn%.F�@�@ +l)=Էg$".OO'mܸQ<J(-ms9qF~Zk㯑��@�IDAT\"ի'MNp_͇~[yu8n޼~}['͟/=]wIEypL\IW ~XuTdI=… O@�@�@�ҧ)tj@�A&Nn'w4*eبd5kmr!~M@bө?5I&) Ž4rHo&Mfk^K͍"O<YΝ .,k_b7N6yhb%ulٲs׿ԥKoR/2%]v>} (M ?z}_~롲 � � � � � � � pbԛJu@�@�B7ټ6//7 }•5ky-ZHE_|C*sf!믿3gj߾}Pxrpd{fYd$ 2x#F sT {Lgy1$x%L0A+WA8u; ҂<OdN*5Hn>Tī~/_^7tʸ7FTlŊѣw⡇ fl->*h3F<Xz9Gl-uOvO>:uQ\%Zj d'垳&Sn]r*V-[;q.70wj۶w>{R >,P1=3gc � � � p"A~O~G�@�0&]qԺ4dDS9v4Ai9D53&;,bW^]Rڸ?c-'dB _|Ew *&5[+n3pff8kӦ >P;1q `ﺙҬݩ_~.sצmAaV.2Y[:uGڙ=fxA\c'|gʔڵ^{ZMD}>8)`aA`ov[pʉek:'LB\Ur s/_On[MLK(~WիW/}W8pWZjd {xi@�@�@�@�@�@�@��A � � R&Rl?H睗[lHn\(ߧRJ\Y6ƕm۶ymЋ Pٹsn6 0@|7]ԠA7(,oDyuy|'`50K͝;W6P^ޓ6&<@cx2( ͂ b9 ?�:GR'ƍ몫ҴiӼ{/ZÇ{lUbN|I_/Ʊdܠ8ihr᳒ xt ƾ*װaCo`L"EurY>#w}wn `Aګ"~~%b^{m@ $<eǎ^]7o<@�@�@�8)rr>'|/ � @ 4rt~{Iw:?Ξ}4q ?њՓz/ r5z7eY۶Ǽ {4l0-^ `|uULN{(֭[WhmEe]2z%swz!de͚5ںuV^?Z[M nرn >{=S=snR^(_(?ZPkƎMnA&>OYa߰l 䳒gAw$߽<CAtJ*׾z{イ'D<{p,ҖKzk3K)S&%Ĺ@�@�@�@�@�@�@�@ VJ˖-@�p?;B: R3@�3&ʓ'W/ں5[.+WPݽǍg#FB.1Կ{ݠN8!$=vdqas/ { ǐ W8p`ȅyvx K, U^=5kָA9qƢE6j'??kruÿ矏}ߟ Ϩ?{s.uQ7p,96ط/﵇ .п_r 6 { Z<cn0`([l={Ľ ې %;q˖-3<3ԪUcݻ}? ȸn]w؅NzT6z?m@�@�@�@7SKNy@�RQ`ذk b PhڴP5*HbBn z+ k^e˼66;; uc\ȣwN7Yڜ^?{\F!хJz xvs ݷo_8.8[FA3gH9k+r5oY6UVy}ٸ}܄vbqo`#] e +?w_ :4q;@9E\@i_~CE{}ć~s~/}߆) � � � � � � � ]  � � [o/n-&O <XwV&Mߐtmrs\(J*w/\9sf_pܠ/^\\pA>nB%,&7 &ns=W;vPܹ^;a(5sLNre /' $sCDٳ۷/=TҦMRngpB޻_1c>3͙3'6SȖMU1cǥޑ5ЩҾv_n\`c!O}YR #%\yyڵKÇW޼y㞳HNt>%KN Nw/kȐ!*VX4k@�@�@�@kUԭ~U…Zم � ִ@չTU:fϖ&O\:ڑz>}$kqM)RFFǜυ;jʔ)6lv|r]zmN<W|yvm+n2;%cuŵ4k; {qw|mz{ۅϻ>#]ry.2n6 sq릵k駟[I}ۉ?p1ףbŊ0`Zh9/F k׿͛˅GE F wp{  ~,YRԮ];/VՐ3#� � � � � � � @bbU: � �)ٺG_vΗ/,t_~XȞM..-dz8q3[[nU:u쥸@ŋ+O< YPکO^~-[T;+!Үӂ CڲEz})nYx3<W{ۏ‚mM9yϖ:t%C-܀:n]qc 9V^Bx[6nܘw%Koyo/SLa\io'm?+b{ۑo;ꫯ!9 � � �A +#G WVi@�҄J H&\_t\?Κulq(?./R˖-Nl%h׶J*ym?ODڭȊM,vܙ2e ,k7|#& v]AdP{OZM6JJ|B-p/t_[ONL_+R-[t}Bv}Uz^yf};p=xߖ@�@�@�@�@�@�@�:EaD] � � wޑ,*rgxo/!m۶Uv! -֭.]:ŋm+?QGf=>9rhΝހCW\EzT7t_`Y >\^ )~馛mۤC%w(?G v .]-AمgkOd�s,YK/ _/C>ԩw٨԰Ɗ$X{nK<&IW9sL;H":`#]*ډ)ht/{xz_D غukz� � � � V\@Z� �)2T߮fe5aX&g'*k_{nU)*T{}ڴi뮻 ڒ׬YXX0A]Nl$c-ZQBlȑ^�؏&9H v*U$t/<Fބ\MhmŊs ϟ- ^!/9>Rh-^Jjp^dA_Z߯rsw\@i,3.\XݺuS.]${-z#rʱ|y@�@�@�@�@�@�@�4'S@�@�@�_`~E /<H;%\^ӆ bL]vesSLsQvZxUWyvfhr!oU'P(?fB֡9C .m֮] lB ʕ+LA H'yJW^)Cw޽;BQ-<5|i֬WUn㮅 ljNsif aCgys@A^Wm\Pwى *xo?~|pomߋwn}W uɧs΍^UN{G]t1Ahyܸ� � � �i^&Co߯n7,6@@�bV ߤ'Lps�ʚ]>7V޼Rݺg%l\ۮGraR@P=6۷{j uqĭ-(hޔXdb&b7okӱ�> L؄fAb|}]-& ڴN>رy=} X;Aqo>lą ?}lHI*ovlvVZ}]J.@�@�@�@�@�@�@� � � @$v쐚6,gTNwy E{Q~6p@͛7Xz_~ތٲeիh"Sc=F 4;ֳ>UTX (ի %9u6;9&,s#I& nV1)}2bA魸>:U˥Tɒ/k^'n)&Ef$ժ/oe]9f`:+(ubA+=\"ƒ>+,XPC w߭s9wb;Hsyhz;sLڴicmJ<yZ60߉vΝ;kD8pJ  � � �_/=i2-W @�revLMXJd+l:yfY\[XTLdϛ\GtWj„ 6lJ([n ]<3W_)cƌl- Q 5jxZlà$^Vlm*Z{҉y,ˊM2feŊ*^a6$ j_Y;zV] fł&%>A-*f+k=yoG@ ln^eBr%"*`[XnjxΝ;J̓ҟO[㮣  � � � � � � �@,S|$e@A�R 2S!.le֐j!�YPކ ~ rZ:۠\R% <Xem$ȑ#P4ҠAcXmJk׮۷<Vpa]վk7,r-dׯ_tzcJT\ \ 4˗OZh[>}$ә.{|%գqxpvmOuA>)&`YgB!mlF{΍B!&N|9>{[nd>wcl0frɔ6Bts}Zmw<rw| �I-Ty/^ .D/< � � �QHȂlƉz}reE@�HcaCiViS@ ~v Ѷm: ~`qdlپ}c:tHE@>\ʕƭJNt ޝTfK!e-_ -(Do!կ)h&%Y/!Bd?g~12Y^8̜9}sf9FܸuN+W./:j׮yh!dɞ=ס*U {Ȃ 6$ ᣏ>ΫGj֩ZeVٯ_?.v:oH+:%Z:? ܈9\սs[lIk@z ض:J믿$:3kٶx嗽k)]բE :*E�@�@�@�@�@�@�@ ^wz#@ o=G�D={ 6?F'xwȂȬKB=.^X;vPŊF/ۿ,+پ.b+Vx]p4޶:Nv%'r4]C1TVŵ#q+IGKŊmg 3Q`6iܸ@(رr0@Yƃ.pvn;V&Z, ZB aΝ^ü%K*O<s@�@�@�H@ /u#z蘭ã � 9T;_+P(urYȣ8iRs}yki=3-:-5j넯v*;G:lv1ZguVC'<<.c[:`v[ݬC/۱#p ة)5UۆvI 7߬7|3sPZlْ@Xxs � � � � � � @5oE�#@dxY  +.կ/e-;T׬]v?~.]ᇥΝ#8V%.ԗ~Q9҂2(8,B#M"8 U,5j$]{tRlqBU@�@�@�@ * p}$i9A.KBEe5)4 �q+R^g'`!ӦI8qb q>x@c:?XʷhlnذaUV,V:!& Nj#H}k,Hׂ7oA oQ޽{:}'ժUûV� � � � � � � �&@$@ 7"�I,Y+TH;V*X0''EbŊ*Y*UWE.Rۢp(SFjZ= "wzu0K9SZVVM*R$ +ED3ҭS\5 k3SOl[l*m̙vdO/"=쳑]HJ� � � �aX>'y_u, @�2@`)з~Gg̐,D@?h`_~eu}:u@\TΥ9KK*K.$MvI/Ke@ vء.]ۺ馛[os~[n+>}}{1SM4R-@�@�@�@�@�@�@�"C [dR � � @F X#zo<3<k3!g4ʊeLe˖M{VXܹ jS!cJZM,[LK.^k-yp)MܹutB!-7K^ @�@�@�@ S9G6M6ouZ }@�9/pnb@KG |hhQ8h L5m4| eIİ@cvT-ɣ[ouU\9O-ZI|Gj߾yֳ @�@�@�@�@�@�@�@ k͚4bDr@�-`=nw8B{E<@�(X@__*S&;wbIjUn]饗Ҵݻ]ԧOծ][*W_-g 4l R8W\"O,YD"Ep.@֭+)grAEn5j$]{\iV!� � � @1ͥe>;g%mDǫp@�سG:U8Q4I5)Wm,R$r@@ w!1 K;wT.]oI&z뭷±Tf=8pW^y <@�@�@�@�@�@�@�@�T dI+y! � �DrbGK@F[g.ۗ s̩_~YӦMs 7 +[^qҿ-3U"&5kV*Ukҭ[7 2DsѮ]|r9RJ>?Tgh„bСJ|ffOw"@�@�@�bZsBj$ |t}h�z"2?T@ „ ғOJW^)+]}4l9 7ߔ, e];7 �E ǏP曰,;RRhQW+2S.@�@�@�@�@�@�@�M#nW5 ,uʀ� vǎ#Ի7=nG[D@�t@#wYryx q$P\ԿU$U=p^xCETҚ5릛*h NbF ŪUpB-ZH/̙ܼ:xе"j5jMbx@�@�@�Sɓ1w\?^�qLȮ>q3Te@�@�HǩSkgN ڵ:u+uVtUһ-@ 9v}w!r}brxNt رu6ow} /:$͑#GtV&3f ⮯YBtZvЩ%T@�@�@�@�@�@�@�: � � {VDd콻ɫQҾ}{n<.F ̙B4rSjxvYdQɒ%u 7k׮2d-wjŊït-K0S\9X1>Z3ʅ� � � �$Oҿʟ_!!Vy% lڔhzo)+ @l %n~Ai@HkJ˗K'j%@;EG<Xڴ)6 �iȓ'?XCU*U4.ΊrܹzԳgO]r%s1^k� � � � � � � @ ,@�@�LXHjor"QL 2qr.AT/mEU4mޜkx .@wy>1ט6nNڴkt!)( թ#B`10 � � � �رC0@rV-ic2'.ϥ"E$2 � @ ?']s9|y)8w-;y[ry �ī@] *9Zjӧ(!Og͚U۷ҥKqU~},J6l׏F�@�@�@�@�@�@�@ MA#� � ˖]p+YܯrR8ti߾[~/Bŋ wZ*],Uq YF g3C(+&D\Y:\鮻 qB@�@�@�@ kH/5i".,=`؂?EӦI $#K<� �DZcnݤ5%?O/>PO[crCg[_:t(Q#� /PhQD=ҥڸE,T;\ceٲe]W @�@�@�@�@�@�@�H�A) � �DʕH [)W);% iIŋǺھ#UZ(jI}b] ~$ \^5Kzai U+`#u� � � �G񮯿^j"hǑ=\hEC+_ԎC/X 5mE�@� ~|yF>*T XNZTzmCmWw_ T53 � @AzSTR%M0!#5\sQN\kիcT@�@�@�@�@�@�@�8µfK1"\Kd9 �8SԱ}k@�"H`骫$ 늭AC| }w֘1퐒/[4-[OFI_W\"S`6ixɶ6]W^ц …# @�@�@�hزED hpſn=#Gi@.։u`WpyrʖM:cub?Ϛ506ܽ[ǭ[͛?f �bEZ5V-zu)Gc'V~R[@�@ m24qb`Ξl^TN`][:眴'n@:@tr_@ B[o$owءvO?ճ>nݺ~ K]2]wݥ륗^< � � � � � � �M5 `@�@�@�XW_-y4n!ަ.,!^[ta}dF ʋ? jKohZX(B"*W|5jNĒuA�@�@�@ =,i\it_Bŋۏ~[ {W׿ƍW<gxh a62mziP66&{3+TTtb9V[L C�w?Nt|EB;v,3GXe@uf!sjZ@ 9]j^KGyB~p\z^K/!R܍E>\:wSj:묳bթK2eGѷT`@�@�@�@�@�@�@�8&p7[aȕ@ BgGwoz܎зb!�80g܅Fs;~~X7OFd )mPoO 3 vI?p,rŊ@pǂ!ƚQf@�@�@�GߤQѣN:_>R%B|y %$M=4{lY�JϞ=եK)X-^o!mA+e5 �DdYҡCRٲG }S'rs¬#@ ?䓓.7Gڴi wI đt[ĭ:~:uziaHUVڸqC뉒@�@�@�@�@�@�@�Nvf � � @D X(>|X7N\9P\kdܸeO8(1pܯa}TER'.ޗzǘ@4X VˏB>{w gx啁�heD�@�@�@ \.@KÆ<SW+8%QnvHZԩSp)Ӗcǡ-π� � l]&q N=ӥ%먐 ~7X?'`oN͝p eu1gl;ЧO_EŊ5c =.6h.hڵz,Yd~( � � � � � � �$@d@�@�|iS pfM/:uM~LMΒxN< zd! TE5wק:t:KN)wq(UJᇥ}ɓѣo^yEʙS[W@0dɒQ[U � � � I\n8bdH7,b :IбcGw\iƏ*]Z:Ԟ � hkGqT\ugv)Z֭ߖ :Iar"@ \NrK ,x(P;>Z>X!M:U;.#GmիWO{fΜ:&3a@�@�@�@�@�@�@�@��]*I@�@�@  @Z! r+zQƌʔ Q  2dU1k7` }I ۶I{nXȞ]j ^HZ:~qiRn҅ 5Jڽ;jO]@�@�@�Y`\K/͓֭___Jn䗮G zIN0!`ϟ� sgj@a_Xzu-\(tiuNh F�N"6kL yQÆ yć@,YOk;_hÆ QyW͛fh͚5ʥ.\ڥK3 � � � � � � � '@$@�@�H`riDB m8r$p@c#ExkN&צnؿI@ -7-$rӦ.!EJ_oi$[YgI\s,82:jE)@�@�@�8&`wG2?,];)gcKέ׻׵S۶mg:;ٳzb2T@�?V8~ رKZ  mS}wHÆIFh)d@˖-ݵ Jiv[AVpV@&4j Dܺu ~Wq2\tE]VB^(fTj"� � � � � � � �AI  � �%п w?aV}k;ҴiM eks=ľ^uԫ4gnRRϞRRbȑ#c߄"� � �D!R2с@f t|ZqڸEͫ^{-5L8@�iZ)m!5jH#FH7JK}:M7Ղ }@ ֭ O"oc&*Pti/ lٲ^ '|7gy^Yƍ7ި7x#nNE@�@�@�@�@�@�@�HL d� � @ +Yأ%6MH{$ ǫ%ىW{K@cÇ_nj@}tҰaҦMԻ 4v`k R#� � � t͒YVҥR˖)}!.]2wܩ_PrT)p+A�@ }૯'hǴ]NƍBGP@W//Q"P2T K,jժN2tɸWYr  pu1>qwyzeI` ;V / � � � � � � �$&@@�@�@ vLH7R6=_\kmyTߒ>&4X8@С =<GFv;iפn$ lPjHj@F  � � �d9 C u^yW\<UF,+#@@ n퓲g_un&O&M&N~U.IPASGz 3]e?}t6vmܟ;4X0d֭];y΀�'d͚U.b… 5p@̙Ν;kv׸^w0Ƃ!@�@�@�@�@�@�@�G@�@�A].O\{RϞ҇&<O L,0>ERWk ciʤ=z0iԭW!ځ,RҪU  1Cc@�@�@�[`H+% G~^�d׮]ӻ C_~jղ2@�8Ϟ{NִAl"}ԱTTԴO?6m BZ=FFf?,mF�^)r\ &b@�^7N?딴6[q2jJC /N:I& � � � � � � � y@�@�Hk|laY bY�D}Rn@Ȉ4X9 X*U$ ̚5ey.I?GgwY#&M[bEi@ C6ijuG�@�@�H/[6mモh8Ν;kڵ<xdK3ϗv\  �"`J/Dz); - G˰Ǜn [jז,s/C7turo=@NwݝHP%_z] @mdԩ믿\GW~OٱP5tP=5+*Gm@�@�@�@�@�@�@�H@l6HFy  � �(曁!tK JrzبKf֢hQw$ =7P1l=~|!a|n#@gh|kckmi p/fm,xdi +2@�@�@ %?/u8c`:Ɠoo護Rb13>]ʓG*W.fDE@�"T`>'t-](޽ҬY:92H ~@Du4:+w!M(�zw;)^X>$[tҚ6mr̩5j~m?Yfz޽>hG�@�@�@�@�@�}Q��@�IDAT@�@ EA'#� � ۶I]0lݧ"]tQ dnlcq ,23s||.]ܬ1W^k?s�0Nq-[!ծ-|pdr~ ~>@�@�@�bYR�ƍնm[R,%3\Y$^�DR /HvС@\̤INJXTt-Ҕ)Rz_:3GzU%;Ð:k *]r^]rbf pgN'|xmM0!!e{]�/{vV� � � � � � � @ pY~ٳf@�@�%`!jr IHI'k< eFdz| {& Hw%e. (q\O�șS׿}~/z ;vk s,8r߾&u L{_3@�@�@�W~_>Կᭇ@ȑC #hifI]A( �1%gOXoʕ Jl1}ԾT ;G =[[}pLO;Mj<Бa82@ NB\oҥcr ȓ'[w~_jܸ Ak<jڴ\֭Q@�@�@�@�@�@�@�2@#nz5 ,iĈp- �[SNQǎ#{, ߮e;vΝ;wݷd7~ͥ%6Zcܹs+W\nSTRN/AU:Iŀ@Jnr)YM?H/矁/@ν{jڶm=Z4ڸ{T;۾l<| zѶKmr J4=f 8 o1 i8y4fL`\([Wj(0^xa.WNZX^`5`}-uğ-[z}mLhe۶)xcgmBBOsHj?yYg=/Z\)' � �D'l)᭏?>#wdլY3 pwHJ! ]hv|ʎNю{O蜝ΟsLΦNvͅvF? |;q;C<S۱6 Ϸ6fw=USm돶ٵk>htŒSGJV-irua+Go=(9.`;7&4c oϱ?m_<a};4j(wK%)SO>U6~ѿz?\n*xO6M'CGۯFO VΝݵ'zcb UȮ׫ZwܤICBc � � � � � � �"@C@�@ Q0vӦM?\h/m޼KpK`Ã]Ev]Ѕ6m'ݬ n#T�Mr * W"EN=\".kD8lb6lƍmklmKZ[lYi-_~~2�kkX9KBo:C6ضo`(B,҂j-͟m. g&LC C W^ ]zad@ 7_;S >e_klgۖuy_lcclj! |ܲeGo1{MhH LſmۏmKBm[b L<ʶ'm[ *䍶Ms7v@�@�Hԩ]wuEgG]O<!='KS@ Z츲vn?:cC ~oO`혒䟛6߿O5~۟n'4ʚ IۂvF;fO`9;vlпmSo>3;8*x 1:cIo)>UK @u4xDd8DYF4 ؾz4;\|۟gS[&eCy |nI&v6oԮg]/G{;xX-G/ڗNR3lGs~51ͷor+N'l}ao~gRu  � � � � � � �İ)B]IFfGHI<� vqXǎ#ԻZV�[._b ][Bז{~Mk֬џ](Bs N ϯ3<ӻ.d=E Xc: v.Xm|q<g6/^- !KīRJtGVopH[[ůDjn HlDž<ۦYYf D�3ێ͛=, 򦛖y6YdfcY"mm& C֐n;mm,Z/yK-c̘8w>]@0e0?ԉ].,  Wy[۵rJZb_ljc%{~@moBC۶ohfSkу>ԾX`eRZإ]ߖbŊy߃,63e6 � �D¢,h#իWL2%S~weu'~zA]^փ�cJ0v7tcT<?;ΔXxC1q?h)t?fCvfJ @ G? A6Z0iqihIlvFPʿ<".}7NjF8`<߭Z=z?9xNZ駥ߖ;.g(+`@mfD_߶=H;W|&Vv^ugml Mm<ھ/7HGu'.P o{p0Cݶ}FO&>zd?ҦO}hbS{SL0Ķ@~Ծ}{=3z'c`>9s*Uu � � � � � � �)@d|X.8%2?�T.\{ tR/,D A .8.t‚X{uYbZa&IUBoX,!qM7eMN QZ]*/YAmWlZ i5PH ˴Mm\njvk` ,D^ۅ^(8Ӵ ָ֣0[;x–H/(︇S|~-Yw? lԶ;x菶6ڶ$x?~pxߦX0v2e.Hf@�@�@�p.YS.EGc-ĎeС4}4cF,ג!vLێZv<)}ֱׄ"߶N|Cwߎhy lj*y ~p]9,w4Ǝ=h;=ރkRShlb?Hj˖-^gS}ٔ`!>/?4t�dL0 s\ߧXۏ&Hj!td~(lWm߷k6C5#;C_ݻws= S::ux_~ ӢY  � � � � � � �%@dDH ߘ5 @,Vֻٳh"BN;Ms\rG-.gAZ(<ei lK/T]vWjժyKo|Դ54`XUa ~,4F[/X ȂJ,X/l,^aYz꣣pa6Y6콱mfke8<DMԉϱ%?mkm!믿zgfYC{۾X8}oϷmwlX NX( pM?~Xmwlm-ñ/qod2� � @f XF 7HfI?,GxK34аaC}jݺuxKWO7\e"!elbAV֑uwcmCmjchWqm@< dCJmr.wF3/9BNsW\PV>B"t >zA7fuTP~7:N`3)N_~ܱniР[K]{c3(_#7Aw<xxzۮ;a@ lS;o`TRawJ]`Aor>-T0cj׮:w:3t`׎yܧzJ]vR=@�@�@�@�@�@�@�x 2^y�q+@dܾTNɓ'kʔ)^]lHRhcʕ>moڵk5gΜϮu뼀* X+񪫮r::mEթKIɵqzX@Ă?¶~z c]LYY(fhaf,BY5Pa@ 9ӦI5k&癮I +ŋ,7ekFam{>4<e_ ᴐHێlA^*UjժԾ{̙3#ɺ@�@�@ zyF81[ }v ?Nˢy.0HGu5(<.`7XuHd^-*8ʎYx?;A<vz8no#+� t޸w~`�o֬qaqYT'ڻw0U Qݾ}q%s=: E#8dOzqyAJMY?Ɏ[mpбx (8S;|H1E yjS-Y 6ҫ][.[rh9oj [Mg}GjӦt^zQIuh2 � � � � � � � kA;J}@�y F� 3gjر?~O .PZz*_ӕY8BO5{l<x ̻ՠAկ_Q+Ea(5Pla[۞lݺ 35 TkXێ+V J`Q̊"}yfA6Ν;kHfհ}HjռF^5c@ TOawG_?]Cњ1cm;ڶ}ɑ#G L+V%g֬Yh ,t#5]bW\ڵk{2�@�@�-0nԨԧ~YشiS7ļyd!S>:!M ի뵥~$.`:k֬vBm,6!O<'YX@߄))`s44BZ-BlH?҂!E-Ygyfz;*ݶL8PN-Ѯ -saqv<}5DW!-߿5`שZx2>xg/aAyacTwo Pb@�@�@�@�@�@�@�N"@Ix5 c>D5|3f oj E2Xϵ.f ]vyk; @5 Be c|ڽer# M8-t^= }Z.�ϕ+WB`^ _~AmjfA|uzan!U\Y.D4ɅɅl@uAnZ@_~ļsʕ+a g:cשSh86 S � �!d\6:4u~wȎx&MO"}:S`8;h 1?<.w^P\hߦ< P;?Yȫ] !-dɒGG c]'MFFۏիW7wiy~?7[2ďY8kS?(ֿm;vE H?Bm<Zp]p@߾}վ}{_w߉O9?wM]sذaUA�@�@�@�@�@�@�@owfFf@�t 2]XY(D`߾}^Æ ѣw^լYS7p5j *d <)iر!(エ-`Eh9"S_YC,"X ~ Ǐ?Z#*U誫#5jPC_}h˖-ԩSO?iK*d ss5x.#E.Q9sJI H 7f˶SW9ӴpT\3tA*_C| wۖL< Ǟ5kPZ5_6>@�@ *:4$]t.RuA?|xKsU.$EC 7o?qD|r/�ҎOpY|i 8?"@ q=Y^p(blU)k֬^Յ^ҥK{Sfdɒ%ڪ~Զ2~!OpN|}UVy[-SBd99?͟.\kG�)ضmѐ@fF~_}ٳgE%J8ܾ>Bs 8zGn|mŴD&Mug߽@�@�@�@�@�@�@� c坤 @2L&OC�̜9S;wnݺj޼nF" ٿ{}'ϵ}vunŷ9~+T%>_u髯_|@̂,^z^cp?܋a? `NvY4hR$)5ߧ̨}l駟jڴiEͱφ}.!d!ߺQ7߬f d@�@�@�xe[7it^'v:Kep1#/u!`.\EySxbWvLTRG,P=\bc@-H @=?XdpY 76|X\9ojǝe˖.ȅZK.3Pɝ'5s%Kx}ܫ su~G `l�#`vw ~M7l~u0_tEh۴x ԩ#Gz3]/v9{F@�@�@�@�@�@�@�I te @  B vۧC_]R%iF~k�Z0Ĥ5?PFR޼yu=衇yuJ*5n,Yc,׮'{lÆ s g3PFt׫aÆ*P@DĎ5m7|~kyuשEw?vjKMB, )S謳 7ܠnI'4 9rDsB?3/Tqjݺ5A� � �#r3H]]B-t~XD< TC80jM]IQYnC`lju`C a+Sl,RaFSVD`˖-GC!|FkVvL:+[w>K.vnݶU6qs. 믿`ost, ͂-k72bU v]T?B.]zt b0h660K,a/Sf/]vz'N~ab{O?fg � � � � � � �E Ȱ0@ z"moW_ݾJ*VʛFkp{ߖY?.(Ki;V.\QSʓ'-K kAȑ#5`�M0kִiSz뭪Se)` 2K/p^BmVիWORxZ4/w?XYfm{Zl?퉆w0˸xb 2klj*]uUb =S#@�@�(8xPt?ȅ;2`;û(Xp?IO<1/p/j̙G :6ٳg-PƊ+z/-ɔdݻwˎ!ZXkӿ+YѢEUjU<?=ӾD0b9asR\(-ڡCٳgti&F(_F->Kv Ov߂!,Yo!GG+Xsʕe\rE5+C;nZu8lذA\pz:b � � � � � � @ o:UF� 2j@zٳG^|E߲޷ϟcQ$`'z饗FL֣G(Q"j;E;aCi632^˶M4Q֭ՠA/-Jƚ8&uV >\ ҴiTBUVʙ3'r+j>/'Y×5j{QyO]΂N4I>3͛W۷<ݎQj@�@�"[OKIJv,?£`i.s>Ht"ƜL:U?~G/d޽ޱ nlK+:�B O͙3Gfn-:|ý+X*_tҨ-ULxV\ӧw�QB-�G @$֩Ey1رûtQƈvܩ+R1vs8tɀ� � � � � � � @  G�R(@d x:$)0bŕvR.]`h!= `k=Zxy=SⳒjTp8k<3UHӋ"={zAXX ̌¤&8,Yk^cK ;С:x9r |ڥZJJܱcGNTVBG͛o7ސ5(HΝcVԾQ@�@ \]|RnJfͼ�: ǎ/J #.,,P~A7;cg5k/\eX  @, ]Vֹ98{l߿_ VڵUn]]}պ 3 fgzQ�ɓ'{A>oڴ۷>.s_,:.;ӣ~d}oya `G Tm{-kժ宵ɄmRhdicƌ0Twƍ^'ĽzULkx � � � � � � �,@d$; H E"vhv4~x=zg/_8) ?Cw￯ d<7 yK[aA)|>ꫯT^==.%R2 ez<`�[fa'O(IwҤI^ҥKu=y?�4"mKa۽pl ͖-[DB!� � M^+$ w1%twkm~]x,mhqh&J(f̙oFÇG :W ,Ƶr@ zTM8 ɵ@WD ] 5v;ka}&5o._/^(wi„ 2e,p: 1 ;Q>FNJn@x b!ӦMB'-w=#dɒE+W|UW){ǿ8BYG[nψίoG cX| � � � � � � _AMm@�ɇ�*_M6*^w%\E8ضm:w, l߾d~5$Jܽ{w_uQ=t嗧Y,pA/W~1WS ?V˖-ճgO)R$KB?{"@�@�bW`XQ#e"vsŊw,3K@G3SjJց}'PBjذ03#]| cƌѷ~ /Ft{3?-/�:̈5F:,ſk}7-ΡZGz{tEO() ?6lɓ7˖-SΜ9nߞs9b l?akD. YjJ*>H-ZY � � � � � � �'@dٳf@ SvV@<Ӳ૎;W^;9.*jZ K$>r ͛ӷΣF=ܣܹs^ӵ^+dd5 [V^]$l0އU~wjݺ׻ᆱ5k>DM#hz3(K,UF � � @ :$(,)w1!jժ%;0c vi]A-Gٳ5bV\u66x`^ZʕM7TR }(Dڵk7x?ٳgWӦMնm[/tЮJu%ke8p@9tP=2U[P8%D�B7E ݳgw^y1R_}UuGAՈfmw/Q_*� � � � � � � *#� �x /x ^~eB -5sLmܸQW]uĞ0 Y!SNuwh@&bƓO<,X Tא/k5x饗-ZМ9s޷2Jn #F_~۶m+*� � @Z>@ZTr? >XXyiVI%Jƙ4nX^xױG^pYժU E� p 6W^qUz袋cwJv g7/_/=N ȮXnOz $2>TbJXb^#Gtn֗_~:(]?` ;v:-,ΟXYfywZݨ � � � � � � @| _7E�@�R%ךo.MBN?Soyӓ<=Eۅָqaz\hW_xz+ڵkտ]wuիWbO |51H.O.|cǎH-jԗ+ ٣&M?^|EYP^zݰrlrGӻ OrH?{lam_jԨqƥkK'ꡇl_Ɛ;w֓O>>H}QfsL4a k{[[}_@RkܛCrcu *^jU � �a8p@CjN*]:֏?ǵ�eB|~mDҐ~]x$՚D~.;`F݇_MU[]ʕzKٹs{̗/7/z,#CWĎIvBp.??~w}wŋ{AݻwWѢEe^wܝ KM6Mb2ed{LƏg}vV"3}.4\oBBp-;I2#~+Ѽ/I+1O?t8]+c:T{v,a^ǒ)]nH"^8q uU rRZ{]bOvw֭^ݦNϮCȕ+ٱ==K� � � � � � � AO@�@�|^C!CꫯNKR(Yp7:9|֬YYSDT4YܓT7nB6k_{;wvq!Yc1k`rfFbG >:Zr-_5c /*#PsaO٤G}.'x{T/Ҧy7kZpА=}o^֘!^xVh"VĚ5Yti CoAi޼y/mr͌i8U\Vr,lkv 7xĒ:� � @< vZN5 ۶mSVteq]vwi\ZFVs9F.8*q'rJ5l *W-Zu:f[vL!}#˳, sVko߮}yrخ ) Lh^t;#Cٹ>pNG견ӢW_} &^z%< 7yB¹^˽5k[mﬓs9' ҥtJeĹp_VB0̚&fRShޗ$VHǤQ,_ioڵ3v훝mܸwsGE9smsOӧ{e֮]ۻӧf𗓚y5bw?/td ?ټyW7ۧpAY]eLNNx/a � � � � � � @ pUuT@�85vFjuM7izzj۶m؋fͪvyYvz :t D饗uQ &駟>~[5<RT> 2g?XÇ{LVDLnݺiڴiufXsaHGӻ ۃd ;ׯsuO[Y˔)%Kxa|YVj^sw_~z,פLTݽ l,TT)pl֠֕W^ylf:Jwt\}ݦ%<Y۽ hرwN9Iy@�@�h]zIwB 6m=jl~$[A:MSHcv|ĂSgϞ{i"\pH1;vzs=zOɶ6z%4_v,N38dKHs >\~/3p]b 5iDM6:5EN�Kk ׬X,p̙^`x=KŒ!%pW-υڇe41F$:G>&5BWh}Dݻ,WfdZnݺ5ܫ:,>}'{y'g$Lo]z>B$U 2z^|@�@�@�@�@�@�@� 2>wj� �$K^s%i}]8!"{]E="ӓ OXzCyCbiZԪU+=Y] :̚5K !~%2ba _Q~_? ~,-$T& tȑ2_k6d˖͛Esng PFwu *C>}뭷zHwzoBC|I&ĶiI&2sw뭷R߾}`c � �ĵW_I&f^!Chذazc[/%5Kjk"2%G?/l <yru?9r &W󓻭M^ K%V'+=k-}"=\pٶ|T5n GݯNڽ[p,-2apiO>x M8QUT&T-b=I曕|C?5=+HZ.+^i|wK3ޯy ۵5˖-Sjռppd˳N{G} />z܂%;_K˔Ik 9h  $V9sTB3t }^<@�@�@�@�@�@�@�$#o9 � @v=(O<I<+Y kp2tPڵk,آEV4}t7%Kx]6jH͛7?9ӪUTrem޼Yryy; Vmjʕ^}w&6U^BLP籢7!BJHi7oJ%&Be QIJ2HȔ:=ΰ眻=쳇{^k=u%r9Sc�=Yw^<x̛7@^B󗍇=oɂeҠA3H"ԩSw588gʔ)GyDJ.-V-ZnظqWjժ%ӦM30atO>D֭[gAw4f& ć>h3(5oܫŋ ]$JGf͚\fxxZhqpIF8a;ze ge}7ٳ _wh> z!Q9܀Lu5HӦM$eSO=UMI@GɲeLٗI>p<gɡC3۽{wcW^yr)TR2|S"% TPg{�/&NhDMa;b( M9GAھ=zsNM6:ݻn va=q_MnѢEUC XB<i$cǎW(u:uNvL}ޠA\1I&_a6zHHHHH  ~~Tȇkk8Ӎ msu;# -R p-"<<|v9s; ,( m_ ߓ ([ eӐ43_$�D@֏L.;d;v`"+�mTo]KOfEj ׾v۷3V!vbp&hk3fQω׆K& m@#ں*|ޡ mBpw[qVb3R;.V뙀?^B{܍7h/F.'Q2 D~kM;mw/\�rlذ 1hmoz炗<1E6LJ~3<?gi7wi Lf7^뭷>>Ko?HyMgz?;ݾHi=0"L^%_ttcE~{Ot��@�IDATM,hk/,,=u%Ҍuͬ|7EE _f \m6S_ĵ=z0߀/(зz$G}&?ƘXH4(3u7/+V2S{_~Fs_.\8Qij{zi g&"9-Bȑ#zqC{ղeK3vFQh mD_XI              Ho:6nsgBG$@$_Z9o3  5HZTDŽYhQGD::Hɟ?9x U:: 9j<GE}tTD믿|М3vArÆ~9[vtzvT�ҩ]sNaÆ9:Y|bJ< w=8g};:0Q#_jժ&ވݙkU(PfmڴQQHs+tfϞ]v4<<\KN2ey*JLU*x,j8騡^2J0pkvv_g4>3+P#Q$Kp^ &OB7Pި3|pS4oG*ڵQYG{͵j蛣֋xQޤN -Ó;v85r԰ؼ*JiVZm75k4ς1}s *cj;?8M41(UQcu<yzve֯_o >;(ӽ:5s+f5 4 Σ' a;j ,]Ԅg^s/;묳J Q?\.c[!aЯ_?G5vfΜ+W0'P[n|K} 8*oo � � � � ?8^֒x Ρm;z^.7t8*Ln4"G7*<fmpNߓ:Dє,Yщ~HP/imň#TĹˣFzT8żx6Q^=G'38uEk ^b֞}SreGLv'DEU捸Ƌmh}^cۿ>kå+1lI@{T%G̾ Іu2cfKCz=hDzաNS!GG',3b{8)YD?*�:2m(󭋖>{NJ3*L$ɻlٸx;O.nىGX`<BէXK^?b8' kbq  p:5R=u/e e ~FKw02);8ЬQ?h"981R"=~Ŋ_f=x/b$08px.taGH<D_ �/kZ)^Nh|}G##E᝵}~Ow#sHHHHHHHHHHHHHH DzA$@ &HL0dzO� Ig@,Y A: E1BK?/ `Tvh /!ae a�Tۈ]֞jD٘>}[w YgEΰn֭[gO1nĈ &#`XK:PN3a< \nD1z D`ʔjzͭ\<7_u̬G7w6 }G! ;] /իW  p^}{1 imܸʱ5 `C8m۶u`n2nXmYl6DPGbxfݲbxp%wkϱ A@"{;ٰ:N0"ָb^ZٺuBuf #6bhk?< n@|W<{oam}";,p=G,ksґ� � � � � d$�~2:񸗽Hm VpjrMj^|EaѼݠ +<\?`b Ygq 7CmXPN2Ѷ` 6olmLL.;1HgylEZ+LBXK΋b然sϬ@f7ΩTu"<ɝ7/*dOtE:f'B֡E*ckyiz& 's%;![~༼{38<6> %Ls%hWLf❯<#ۇ嫈e32^^/X`B#էbm8e~/^X~+ufG^X.+Mw^pe yPwl]�&Bn<^+]Yy)i᥂X9s}FڎKn<P/3>~W zcϋ pnB qHHHHHHHHHHHHHHK vӑ� � � � \tEtITQt L2ydٷo1Nlw6h"xNvڢBfc.aÆV6msGRlYRJ?km<THWpHtPY6iɈ;\j?5j,.Æ p]yRD yd˖-rM[NqH@\|t7f;%)صkL81*z`{/>Xґ@hc9RZl)*0 V_~<!mݺuԪU˔x:[Pc)\ �853kO=qQQk9cyFKD4~ ͷ8XnV x;#+W6ǼAϣl/_^@N԰QTuP \S *`*�i֨Psi/{k     ;V{wy3pm f pp؆[~Y{i#\pmO'tu�so`gA V ﴍEʔ  CHmSN_}A]t1}>iÈ.lju yщ ηTNDkG8wG<fNcO1;|MX<6•1ݏ}{カX.R;|?3K8Xi7pYde"Xm,xI_͵hLkk-Rύƫ/'i7&V^+_Np w]1/,qMfź3qk~+Lu`0&訣?xsbŊ c++\K%~K'^EpҌ÷Kv¡o?{߳5n\rWQј/.{3 @$@$@$@$@$@$@$@$@$@$@$@$@$@$@ R i$@$@$@$@ TPïv @oџf~e˖mm:hƲE5N0v1W\Y va["`6?1/.˗/7ܗf؎?o섞:]_%|1:syBᙳ_BJ3! <;K.^Y$Fv#@ w@ G^ %_x/VHTTIaY,0ڳg?h.;.R=�~Ξ=[,ڵ@ z͚5r#{ƌ)rEW^ xycz'/KҥFdsq/WƍeԨQҮ] d$n2\2*U*KI"!    !�FI|ɒ mkؽ{\vef xhc籾 BF=&!{ǤI&m6o!}A# e=&~d('PdI8"JSE{K="VD$"SD:ǽeWO<4kL0)[~F˧8Hڰ#1{] iĽ -c~L{,t{wG{&z 'semݱcG# i (k ^w/A /piJ۷oCu 2uj|?hg޴iSi2>1q%K=7;?K8Ob%Ho|gyI_, H-^c^,{Yg)Zgωs*҉0<x^5]^G6X{_^ӽZ{(oQ9r4>L[nGLB>6k֬p~pdN2aO^ofO$              @B    HG'|c=(QlnKٲe>r8`͛p;E|饗$ďl Ĵ*TȄA͡n53J w_/ ^xA~mcdoF6n(-ZHfivqs0Lh߾/zozgG(@Ppqݼy|?]~̜9S.Kn�c lVA0bٰ!h�XZ@.,:t9� 3fHΝc&oTo+Ƌ1=ւ30×^z?wq`Ӷm[kAxpnc~0Kt? � � � � dq":7 dj9cذaC1]f @|`ٷoL8Qg[^|E'x}Ce; B'$�z-Ӿ,sLKD '?/9 ҥ|ᇦmm,+Hn"Xh\ Π{O3yK뙰m^%΁A!o7D{JMG2׫V2;\iӬNZćUF ~UW_�}6!;hX^.XyI|1;#}^YgzDvÅg8G+K^֙nn/D>^5]^G8x_^3v<ދh?LDqE oDG1Y*w}w 6 0YN/X&M)p{) D$@$@$@$@$@$@$@$@$@$@$@$@$@$@QCh<HHHH \}2j(ٵkW{j[c~&.s'A5mTԩc?c?0QW0`@bŊIfEBI'd [qWǠZq6~ϟ/~{p?ֆMt~D;iPƁ8f<1c;CJڵsS1;ɓ8_|;kNҌF$6oz`d#{!֭/vm'{Ae%@6msO |Qxqپ}5Ȇ 졘kر#x}l]!ǍVZ}'tݼ/5O6m$]voVPW3gl۶-7}wA{=^e0*Y1J=z+lc#-p{1k/yD|x _8p`VLDCdʔ    uM9'ր61c1֮]k<E3\ GxB ݺu:RLM/`rh.7TV~]{,Zhݺ h'jaO?Tʗ/o9.-pj mxwk'MXQ8'.4]/ܱp@&s1nz&z '^E2ŷkN;Y}l[-D>aL_01I@&U<3q sDE/q 2͚53BݾT"ᥞ%x$7Z^+_K#}^Ygz>h8\xĞuh^VHǪ{yWJWVk//x/B>]4i"T7] 䩧2K8 "+Wrl:׬Y3c@$@$@$@$@$@$@$@$@$@$@$@$@$@$@Y @!,@%$@$@$@$.nFT$ӭX"|`h>7o^cP#au '` ~*#F�k… 寿'|R6ol/ҥKKϞ=kQDˬCpz}wc-OO>r ~`9|pK/5mq2Ę(y֭? ȇ>} Fpt9YnfqBRt_oFQ2N oHpkذp,޵r7o/M_< zC y Q /˲epظ0Ԅ&)>lyLuYg!ƍ{m\~'2"q[t#�c hʏd2]#O(ܯa0A=74֋/(9SN5"$nq?\n(Q?5V6'sϙ #5kJѢEͱ| ȗh!Þ /=cǎ ֋>q%B'L`SpE3gDpM"rp �ۆmvXH"EޥqY\� � � � @&O- w|C6fx;˷L{!�YD+e`fߟo5 4 Ais /cKzWDzܑ5kL F'=.kj m'pfL4gEʧ危g߸q6L/y-.MڭA!p|Wphߋs11^{nXVH13qi{sH埗Lӹsgs^2/}"i 7MU?҄sX矂EҩS'|G5֪"l<C믿n!ۼysGe9 x쥞W_h<hyI|c?l~b Gy/,Efp~>X~X>xO,&/hazy.3.cPGD_{&%!\Qpռ++u7/QFo{^D9p1Tb)+VS9"\uY+6G�eH/Ef[c43A;ٽ8w|}Gx� � � � � � � � � � � � � � @Ν  �  h 8οdH|G@g:*`h=5juThȩ_>Nݺu9sdZ=;:Q!Gݻ;*P䨁W<5*tU SC M6fA$:j<3pRKrN9vt9СCm樁O Avt6usPjA|ոQAc=f`_8:�:x8:ٿSNs|Ό3/;\{g8*yyjpDT8ʹ뮻8SlYs_N:[sQ!p}Nr圕+W&&3ڨd'P1װ8$3@zh'(TQQ9oQc[GEL0ϩK0X>x^xA?ի 6,x}6xؔ9/Rd8JG5e-ʾd957*T<<CwCϣIQh2SC0Gyā?j8稑3j(D |8* {TlSQG0]@s sQRR%b3xovL6\GE XjԨa uDN۶mv`yh]u)S8*n˗A>W_9jXeV_~y%\Q^0qPHïiӦ{i͇JPMjiضq#    9:ۗM h@m6 | Y v=�e8f#"{mN?+W6߁RN 1իWw#ܷZo|i3?ކ5 x'j*GLŗ/_<3;xbMC*/^<;]bРA/vC MA~3Ϙ}5}n7 3NtIxa8h?mX*Ԍk^.!iC"1ӄjj{O'e퐱}Oў5k8^^b+O 9 e-C]w/ܳ?T˩]vF; \9x.ѷ&ZB}!3m: >e0'Q}qGۻmMh09NRf2+_:sOVǸyoz 7;ݾԧm#%E2 1sbqgYV@,=΢~x)Kl~7Ūy /s/{~pd@x'ec XXj <ܯXL'sV^m2~ :*3:1ӻwL_zN2hy6-xc1!xG}G Mz CG$@$@$@$@$@$@$@$@$@$@$@$@$@$@&0%ϸq񏾐� � ğ<С9}$ȵNyEtPTQUK�ET(bp!5R {ŊJ5 {ސ!CoT с&:P[ ^":�Ff;jf�WD;q,j jяxآE QNQ#3;{<_o!ҫ!w^:8_Ə/-[LL@|gE4)@zUt-ț.^ݻ5xqK6_(JTAdp%p뭷ʳ>+cƌH53e/"*pw%7ki/ 'G}b֢F?.õ^ v𞁑Ɇ N:{ggҥk}G5gJʲeGG Unrjբ?IHHHH WRmN>^rl?Cm9wאsN>w4/PHMDʔ3GY3y${%Ko{ׯ^G|g*bC*$*'}'*bTB*.{i ΁|)#zC2m4It3Tά:?gC}$Kkp<Cqbr1;޺uDE^M_-ۮJ3+V#F/lڞu"!0`vw"u,Z$of'_`Q@TZUTUTWQZe.V=;?6V8)/`~8xWt3V=Ǟ=[{)K] |b}7yMw0B>c?RK[wr"/i{pu ou(o?҆ At2aѣ褀 &!L0A:wl1|[n% K_wDsxHHHHHHHHHHHHHHABJ?IH(è @ U!ԵkW[0r5j0u5 ^ v#m@|{N _| :ujR/O x9s*U*)c 8:Q#ĥ\3Ϙ=(P q7Coɓ' gϞ9zjٳ&0r?.wu_ CN5^%g릛kYE+�o)Z4K"    H):\qd=_}4im.:+lH$3ca=餓/7"YjՊuw A [*B_ܼysX!/1q cxX,Ni$^A N@J*r 7W_V2^ٽ飼rʕ+emۤyFXϗҥKD$U^sM{S0͉W'Қ,#~'IwyZ]'[DɊ{h8>e��Tt|e˖ՉJȧ~iIE3 � � � � � � � � � � � � � @{zɬW� � � � $� J,i /^,>˗/!%K^]Vwܩ9EvD,0;b^`r7JժUbΝN2EJY+VXRM@TS>yʓO>)-[޽{ˤI(A,>38Kjժ(VMCxx S~tR)W\jD>BՓ=z,#GMf>Y~}'[lnIƎ+K#vfQ=W=m92eD C  $    2rY={L '`Ǐur;رc0u!e\C , L+,7a.H:udj06lؐhBI*:CΘСC>TzDx ҚEDl G7k,3aۅ^( aN䯭Z d$ħ_:x`[omJ߾}N3$m֔w.~~L<1aN߻OVT2u䣏>ӧ~{~~L TtÆ 3c>bĈ#c?޽s ";~UTL:ХK Qdl]rf !/&             G]R}ƍ/ � @ `Pd� {ψUXAp)g}|g/ÔzN:2v<ү_R`= Z*&V=eQ)Q8z+[ 2 x?#;VQJ_7Nvq8߂﫯j&'=)s>f%�ns;reɠA(ipg}֔'xrRuf7Dy$ r:ߑ[7M In="V4-i #HHHHH 9ec&ȩ4BC7|T&NE DOG$6W@wߕ_LJ,L0t|7z 8PVX!@  Ɠ<AW^o vÞ={f3^A>%I"oモ… K�3sҽ5׈&]'A&BD $Iч 0n'PgN> HR&äg6B?BE}ns>K/T>SiҤ,\ДaE2Jeo(6oޜū GE_lfʹ.<5G @$@$@$@$@$@$@$@$@$@$@$@$@$@$pL8b@$@"@!HƆR�(^ٷo_yOٳ'Ǎ_�FByUeZ s̘1rwGA{~H~ZaHn&w枿h6D֭8|#�4Fo]}YU*1|f_^8s̑oQ~Gݻ~RlHI@"/yGUyw}r 7AQ킍 _WTW7q؈f ␡"9P,UJ"jkضjE 5n� � � � $O~'#4a _m\%KԩSDF#,s\b^XܮhѢ]n!"G}`#T%/4L$|F@}?Oƍmb"mڤ*3f̐3g+wm!<LiڴjԨ1;}# O l2Y`)g͛'+W<yHM9۪U+#0X@O~I:t0ǘd߅tCxNҨQtܛb, � � � � � � � � � � � � � � � ~? 3 A(#4'0n8[̠Oa 0iLDJU1{l ѣ… G:@`p{KFy8qTVM:ѣ)R<r+d@E]m,VXE!{&�c< Wnݺzy'@<@@vĈˮ]L>r뭷W E#j<xpF>-h"6۵KڻaaH+i">%^     2k'<K"|Z@ (Al֬Yf 1T\وdA(30B#C$[ _^Yb 믿L6SRgii޼Ʌ(SJ|F c>#;Ν;W>sslbj֬)7B6lPj׮M1K H ?la-UF ޳:ˈҧuI*Ue˖ʩRoL#              G$@q&@!8w$@w^6l<cfsd%-ǏWeҥF|O>93#k*3֬Y#/=\p<sAS H "۷^{M,X`P]~RPdɦLl&MwҵkWS޶\9sȑ#2D!޷o_V2DWD/Dϲd虉תaHD"֭W ]6FZqȲeExT)|_-    %ZGRj꿡_@|st%tmی8D͛gDZgv0DZ4h@rfR# "ajVj7o6Ta5QYTnJX\\Y-Z<K,V^]֭k:uHZUHعs@\o5 1anyt3|C@|駟.ȗW I &:FjM3$@$@$@$@$@$@$@$@$@$@$@$@$@$@IByߙj 4&@!4L: $�B2du&_1Kpg`Ç0or饗ʝw)0P9z9aۿL4I^~e9s s\i۔V!{'&L?X ,hljcV0rybaD:;c&\ver90>Y[|[oիYf^|E`E}VT]䦛D|0Y΁H+ q}lM`Y,Y0[$ҽsHHHH T ү GOoɐH w}g ~CIf͚F$ .k6%QIG$@9L�~hC�*˗7}VaÆYX& ^_D?D G4b\ ̖-[E1>,5j0fʕ3Bi$@$+~2e-믿a[~Fp¹"J6mjD2!ďqǩ08f̘T6J$@$@$@$@$@$@$@$@$@$@$@$@$@$(7&H_L{ϔ@@ 7Fu֕Jw.4K}Hv8Tgꫯʴiӌ1R޽0-[6axa<+\>qQ/B;8i۶tQڴi#'pBǐV˖-3yה)S 0Сl߾ϭigD b=~xy>SbҩS'XD!aDG^ ,YO8QTXQ ѣTTɫ7>oB|r/ deǎ=(RDGFtR8Sg:    \DqD[OD:oq MG'>*E /^<(UR(w$%}v#??Z!5:kKՃWǂ*9E}"|*\Rs02ڥgUT1eX^}ꩧrF6L${lժUfY`PBk+{RV- <|KAzȑf쟧|r]w%)'}%FHHHHHHHHHHHHHH"dD4Hr' AT_ ,^XF%cǎݻwK-k׮rK%m#?Κ5ˈhFP Y\s\`<zӒ@DYFU 'O,~9_nZZl)M6… g#^6l s̑O>Df̘!/jbw)=\g&L P9x6\$R/M|! z|`eQ~A/.]iiS+Xa#qu !!i#v2"#   ?mDED>XU+77P?{GT!7iI7n�DBY+W eA .'xHء3X!*s @BTXcAQi8Uh_СHX< X,FիM+:cLYg!Ѿ^8YV<",C<.vӦMKQ_G9ko!^Z5Ddɛ7of!n3eIѢEC.&Kxţ>ڿeHHHHHHHHHHHHHHH@ P �  A grI'/SN~ۈ۷ψuIڶm+kILX`4Gɴi̽ܵk4nXuf2Pӡ%Yė T b~l'5f͚|I& K1mϗyȟو⹁( Ґϋ�:sSL3g *H+i޼ʗ/トi@�u%s5W_}eR G^:m?ϩ}E)Y2 i!C<Oc@$@$@$@N`JQQOwM6O$7\F �6Ak,q_d޽& ‚ !Yh/~qґ� Z ֮]kDT' HuVvM+WΈ;B "Tv"  *ojșCXmݺu2<95&@6rv肉ؿfiqM$Y;w_Iׯ7طe-:d2RO9nnl af0@ـ: &~~gN=7ccHm��@�IDATHHHHHHHHHHHHHH(ø� @P2P% @@ n'O6-[Iq-[,W|A`Ϟ=ˬYji !>A /4e$6Q*/zdFUɑʕ+ARbW.\iaO�Ǘ_~ich"c Cm<Erg ё00ZpEYبiӦQQ,u5?yNj+ 7da0\P=\9shѢ 2HA-2b Fa;QCgzo`ݶk~sHHHB@EuejQAAO# {p@.$vg7B$.V$ BY@BYǂsHG6}!y`hE`!D*@0}t L(*"%m'^L)gٱca[n+Ɔ}G>/r' vmL"yl: @R ykƍŽ<YweИϊuҥ)<ka_>}W_<`8yꩧwޙ'� � � � � � � � � � � � � � @ P2 � 0 A `$@`%f裏O>1b;0 ~RfMɛ7ok|*Λ7@B"X=D IO7(S>,$mj)6|B %O<FgSG`]jؿ˷~+gb1QX װaC_-U2 0y 7,P訯n_Ƞ> AKj91`֭[娣2D?!"{g ҃V)X@E_;"V,dIzJn� � � � d Br f}H @�7($l[,+&ѬBdTRf ',1I {'6m2XcqQmLXhEw- 1*+1"Ed/bi~5qh6M}4G2[ a]BL.ﰍ>%JYZj\e\oޖ2c8،-ZB�b}t&^@t1O?o � � � � � � � � � � � � � @d?@$n(nw%"g#4w\3pn0+\URRZ5#ΓZ)Wl׫ zd 5 Wzu9묳ҬY3c36%зxȬY2g `p5jv9Sh7�D~'#G,˖-+Wm+Wl|hР/^W`dr7._Ѣ_w}'00ڵkp$]r @ ƩGAY,[RJҨQ#iܸY #U:D@"V<?_qjTFH5[}HHHH:UcGbQ}{d&56L꫓ C�hpcY9:CD!0$ıbŲ>Dunaq `:L*X1*A*+Js H .*j˖-kA!ʉ 3`KȎ6KN"'{zh{}V(ξ?3CoDeܳvXb2A@ltE=*?#t۲v< [_®b(gQ⽦0&3f\~)={~e$IHHHHHHHHHHHHHҗ� 3$@iJBizlHQ0ꁘ…  !sA3Xbj *AX p͚5F8 Yѣ۷ʗ/l{qa.#ЫH:o!{'CVXa ~C?Bb9SB RbEB@(oڵy/"VzZ|N֬Yئ^ }>CBX~$TR[lO6ُEzz^' 8"/Nb:dz>7N:k}Ty ,jOC &tC`$5}? � �  L(r%iU~a2;ST@$#ٱX5<ޏL[˽ q,CH >I,vm Uر#CTƊ B4 ]/!Gtr%I!s4 ' H]Y9@]#Op (#Ge>- )"XPnS'�<FوԽ۶\6& ux/l=Ҋc=6 >ZO>LY:/hƤ-b2IHHHHHHHHHHHHHR� S1$@$U*9^G$0rݰ@ bK֭ xLV\ J'z ruBlGWE@X A a62ԩctg;"z5y}G5iܵk@ B|x>YCK YL8` 9aiӦ| ›AI!uȗ!<x*U .=#T'�*ZafQ^C> "vAAZ ρc9-W< QĂl #^1Y!$<D�:Z4aH"vA:+ i"5|#?jqqHHH x-=E' % Jd&i&E"h@.&6m+Q,+gEkq \Ў 1H+޶ k)\-.ho۳g޽<OxC SA K~)HA mmVʽF~9K=*ҷԋ?c00dȝ[V(yV8Qe(vocXc")vcLapx,q0-mYgѽ2'kk.:VԖV[в}4�1o{'i9>yd袋; 0#B$@$@$@$@$@$@$@$@$@$@$@$@$@$7JzD$@ABqK ܬu(8!A% v/oϟ?x}6!zc5؃!{q!Ak+<FD &H7]MTTd„eC@yǚ5kv= rux|0v۽Zk rȇ f FRPn}Q!_B>#dan'+ A;+5*Vh6 5es3S ْ%Ky5ܲ\v6A~%Aה)";&>Ґ جAf5䵛7ּFp!#pXL!* Y;9&"}MgD`$ C C!B*`mHHHOEkn뷗矋yfnJBC�mJhu6Hb}8nFN$v&[l[ھnmw >NaDN1#F].H[?.#Ųo߾kom?#9`(V][b]u/9I7Sj=i{FY>SXkBS~ [EZ|e{} ` s|:`e-?-CC?XPn,`p=^z^l cl[k<t$   1ݲed~`d:              + A0^$@$ p:p8:sB$@$?8Ĕ frV o]=J3FlV%m *ǠH  0x<À@%!d m!a`? #ܫѤ[oDzB�yfM> m۶Z-②᢮1,ayL%O<CX �cCnODs L`iƂ|ɽ@oґ� d�[6G@q |ȝX~Er/.6Bt|Ҥ&q9my 7ƽ7k"u*k^ۼeݺ&2jT+a O*V,mH8 +P1 D|5NF 2T$C,RdHHHH7^}U_?Qq D)-"s-C"_-R~Z$$C�m@naH :tmBvmw>muT̰x.mt8L--e�w~׺בyq }XNfבhԏn*Y_@_#w߃{߶= RUVS#<[G䦛ȃR�@0=ۡ"(Cٲ-*Gm#CY߽DZ>wiQm,pv;ܾ-/q:tPơ,K}e{Olى5ˊq '؉{pBù*6hLjT}qض,Xpex ȧ0qv䥗^ʉ(xy0޽ɓ':H$@$@$@$@$@$@$@$@$@$@$@$@$@$@&t$@$@$@$@$ `tɒ%Ұaèp*a`5TӁׇ;> 淃ga9c@:Pa@!$><:.cEG[HkfUjB݆vۮ?}[q kc/*sϞ$ŋo3X1@q #?bt$@'�C;bPO0GiCjs1E^zDy<ms`|mfEUelr;YJv0ARXWH?EԮX¥^ o"?@T0_TXZKŊ"*Dm%k{"n� � � @@/uE$v,Yu?$"SU[K|Avp+~^Cˊ:a.cVɽv]ˊKat:Ҷ=BA6?ydk[Ybα5mkhSs/n1Klͮ]8DnpHo4YB~/wV x/VŖ<:ܶlDyie]hyoCvA6vߖy1p-KmiApe)F[n}>1'&o{eȑ^pg˵^+_|) @.#>AW_- Zj6Fի}GFHHHHHHHHHHHHHH@?:&0&<t x2n\<$@$@ !C;'zJ$@�DP]HQܔ2% nQ4$�%DuixdI~€r"\O �@gݺvHq1pLH8[(D,ȕHHHC@55_@}%>>/9LEʖr! �Df ?N"aCߔ ߌի|XR"v+Ն>]bjH yD?A$@9M�3f̐#FT#}UWI>}tb3lǟ�LO@:Lfkڴ4nXyǒQ#             Hw4L''   K;2@ă)G�tn3LΛWbӦQ2o&_6$"c|~t',2oAD ɗϏeH 5 .G8wP@(T s \'O@,-bIOQ1   ptpXy,1 WP`_ D�~{Xq@;m \oJC&'ɍ߆]'r"/R;&8 #'H$@$hcx۶mͲQ3QFevblRӊ矯YJ�&'|"Z- I3ё� � � � � � � � � � � � � � P7Q#   9='a#\2 ē� -s1e<v;OkDv9ܞZH |s3Q^U1-P@D:KO/7Nrt$@'p(X!pAcfC®-9eȚ5"vk E#c$@$@$zػ7 ˝@*زET�Fd@}gE {SJcesD*U>\}t$@ 4l)ŋE � 'j}ݧw|uҵkW)QKzmsCR4'ТE i׮y,YlYLg2#              PM:     7mD~8 Tn@8pB{mE9u!J_H X|w__KD4y5S!# n0/]:~zB{A.O2eB'|`$(t`_  Hd}&ӑ� @4%KyzN"W_^+<H©ƞIH_z36" dȫt,t֤QFi]i <XZn-]wё@xX5jH&OCq֍70f � � � � � � � � � � � � � � &t$@$@$@$@$@n0ʗO;GMM`~l=nK/2mZv}$@NDtAUYHDD0c /.ҰrȳϊL"w"v@B�Ɖ }ݾ]d$niJR%Eʗi\䪫DzH7D5;RIHHR� sAm9Þ@*c^"ȳ#9[}3oS@ j_+HH  ׆쇴{ڵ2a͑ /P*T _>8N@z.{WC:}B6mm|              aQp< � � � � �yyaD=6" I A+ mXK/HdM x9sD%,؄x\Ș1"g%r "KNHpH  i"5k/^X �vr@ણXQEN9%ƶ/R$<F$@$@$We}m&� Q# ~Zdƌ@yر"E_n;oΝEܖ:GqcLHG$@D(Uˆ�$_q{ȑZO. ˵^+ڵ<PΦ#!?-kժoe]X)SF-[HR|?FHHHHHHHHHHHHHH@B|HHHHHEE*Wu$ @bYtM@GE.[7Y0$> IA6oiaI8,xC?F Dg;âVSE/'= / � � 7Iru423q$�׋~hsO`BK/N߱4#EI �!ȭ[{]Hҍ):{ѣ>*=L4IF!;vrxҫW/ @j+q(K׮]o_+%J0Y(#             %iC3$@$@$@$@!>LwEx"`7wI hB)}  EL @XV�G?C"+3iJGD� ć�DEN:) *ҳ#o=NbDq i2O̜)r"[  |#N(7";w'HHH sgg" d^M$>yGnK  o4GcvZDO2$�r!\: Hg.]Lm^ם;w~Z'+*/_|̘1C(A1&�_UFxAHHHHHHHHHHHHHHJ5֯QdHHHHH 0n[A'><@&_"KokNdڴԓ@:XDТً$qljL DnM;4� #�UEڶ7 <۷Pd"_K\9yYQc\E)QBE.T{E^yEd܀d<6\xHHH+FaBL^ H  _{w| "R ᐏaٱ#$@T LA$@$@U4c 6ȫ*[l6mHJH*V({~XlbŊ$/FHHHHHHHHHHHHHH%5 � � � @Z?`FG?U嶴1='�ۅ bGW� *o[XBj 3(w߉4h  � #PH"ݺu"g['a+/ҴȞ="&O>; YH"; (s"~(rHncñ1  H4 A&pxQdx6<J$ 拾y5cEyF$_�$ 7rä Q�D@Q2&Hs.~?Hl:qQ9mmhMG>#pwW0sQL_Dgʙ}tW              PyBpHHHHҍ}+[7R,X7 n0:ԓ@:XJdt?%Zw"KԬ$6o1d|HR�ħVv"O=%{"ܸQDFED,yvDT O=U:TdEO%+ � � $D[.]`rXߑɋ C"1ׯ_8-#~ZBݻIm|"ÇWZE�|,O$@MF*lvZiٲUWKW?餓ꫯ6| !ȝ}Tۄl"M"O(Q?*D.J{koI%F"IV2S١_s~۽x|Ϲu=>}oXy@�@�@�@�@�@�@� H ^#� �Ĥ=#dt tbt1Ew7&LHqVf@�(1\~$_r>;-(x {ǎrDrh; 'HMHݺI=$)͚m4o^0g`?l<#k'gye+K-[J}YEWi @(PK7oh@ 2,ؾm , 8?7ŋb݂#'pҺui|G�H\ꫯv}~I-ZpR]U1cF 2 n_Çp)`ڱcG32 � � � � � � �$V� � @6ҝwJeCX%!ص+X{6/`(:$d~*F$zIJT)iFij)W.AȑC^s+ F׏#O >+a wV8ҥk[t)w{m_?')*@�Q ٪Af;kE  -1 & O =7%1>G 6,Ҋ3sfkE�HY^zzOkԨQb;8WkV>}`ȢE\s *Ureus=ݻtB ہ& � � � � � � �$-@C6|� � >(=u1Yw]?% ڴ[3'E�XDZRz9i*i䓥y}YСWz�#P`L{e+4mv܃…^ThK5jHv_Ժt-+H'y � -q!b{DK"6`@nE+ _ciܸԅ@Y}>l: He_IA�H@Awrkռys܈hw}zٳgR@ 3`M8AgIM � � � � � � �Y#-YJ � � t4d4xdU`׮gqGk?Wjז*U&N R$s"@4<`KA٣JͥlY髯zVz H-M@ 2,n+a,$_-_|)m̝/_[t)W}*F#� $[=;p@ʕ+zCO@ ? o/uY`K^qtoKwu^${@� vi!zg4ҝ$n:ˍV]ӧv… RF UU]tc=ϙ3g:jE,rΝ[)!� � � � � � � u=;CU � �EkgF,żD@\PhF0!@ ,C)nb!ҸqҙgJ˖O�}E�hp-AS'{wޑ^ ^Ԓ74yt-ҹJKKŊݻ=)}ZA@�dϞ_ yh!;6[fMilB oh*[[ !]6p٢E'z�d뮻N ,p狿w U\9[{@Vj!zEA�@�@�@�@�@�@�@ L C@�@�V`jrT!HYvjG qa.A=fA?(m-} !t饙YkdtQ##H(Pxح}۷KkH_~?ui4ttRzLV"n-zԩ {@�B+`aw+kݵ8 €9) ԱԣA|K1GR}J&MLG ,rbpB#p;os`@{iO?]ov^} H~bS@�@�@�@�@�@�@�$L � �+pts]wGoGص+xQ�$8|)_Sy�.0fda97'JӧK\#]yt Ҿ}S@@ Vr*TZ[XzX%_ѣ޽ҥY{츱|y*;6k`?Q@AZ݂ -�'`lw?fOAZRӦҠAQu 7pE �)PhQ|Zh&6]w7\r Zpax6VE]wݥsjڴiޏ<y耝 � � � � � � � ܲf!� �dҊS]EyUV-VDyIhFXwty҄ Ra$�!Юv8~?ԤtҜ9AZGk@ , +aٸQZTZCU$h!W.jUFfߋIX@�HAٓY2>gδ/ ޽dFt[u֭ Bí}P ĝ)l  @ {݅aÆiȐ!ztgO>ԩ 0hn3tM5p@w_y\" @�@�@�@�@�@�@�e?9>C�@�:]F .huC$&`?ܫ ڶLbA`zi,KcicǎҼy4l(}Y` @ ʔ5z{.wiN駟#Ν%   BMZnIbi4ɂ%) �G elϓrX,�%mԪ!.L*VLz̯4;wPxq"�-PD ~neUbEK˗׭ު%KDvi}Xu]?gk{r.M@�@�@�@�@�@�@�R 2 >F�@�.gg6o Koؽ;eIsǮ@6ҿJ3fĮ=G >X*TH. ;zVev o/t@`n@ V,^=˥F,v,(rۤJ~WplYxqI \ɓkcE~"�W ʥ9 ty  moTWoϏyJ=zAx0QC., F@�{>w~v.vƍZj¦zw-ݐRvm=ә]u˕+Aicf@�@�@�@�@�@�@�P p~Y � @ l (]y,ٳ l8vI z/N:I&NFȨ1˗њ{y9tҫeGw UJ;;}̙֭ҟJ_}%=T~0RVRŊR"gK={J>+M$Y.@�Heȟ<tHʑ#dm =n!6׭=툕#['+=$-p)I' �(]+V/Pɒ%ս{wUPAwy wi ÝP]$xy;oA@�@�@�@�@�@�@�0 2L7 B�@�|JO<Sd 1 `AP8 EBD-ҷJ:DT6͞-ԠV�D@ٲK7N*m(4}SKVA[~8 k^L鍊 :�I 4qe̞Gd@R a.Ad<#;d tҠAYjG D@ ,w2vX^Zr>CU^]-ZѣX"ҥO^z ԒE-@�@�@�@�@�@�@�B @�@�G知ޒ\1c pbD`vp,LA.^,\EY�"H`8="?OI@:ܹRRVK~yD�H@ҹJ}=Zc\A@KO</ дt5[n̅� yo_;[Ld$o=ڎ@- ŋM,/$ a￱@@�84`�wƹ ԕW^+giUqi7|Mܹ3[eᦇ-@�@�@�@�@�@�@ uAΉ@�@�"\; .ۣYf΋|R/@dbqN ܱЉccE ӳmA0cI[KX@ FӤԧOki`?l!5<"ծ--\(sdŋKyᅒ 6Li@�M o^ CM\VXQcOXd(lv⋥rðq4  TlU!�I gΜj۶>3?;a;bUZ՝P|8:9vz={h)) � � � � � � �@pmB�@�@ &M&OF.{ݻW͛7O\رcQ-8Kb7W|2d.0iW u˄G,DeKi3֦o܎O\eK.Xey.� (-*"B`׮X襗"an<SQj@qi.qg >PӬYud֮,_/ yUL%N>YW/[7^DՑF�W =O ;BA�(cfTfI Ea'üKrI^+Òh k薍+W g,Q+C�AbŊz衇t}i.z2-[V={T^d[ٰasX80&_֊+3g}V$G%Jk׮2}9Bs ̛!m5+C�@�@�@�@�@�@�%@�@�8xP.Qj^jT:uN:$xIvn굲e~ 4۹sggVZ%NA %;…ScYm[?Jw]!niK\RÆ Ӳe^Q.q!,X {MA ,`]XyD?_jPr9ri 5+B�PAjZNw}=d~(]qt1t饒{W/sԧOҶm@@�(ۏSB'` AΛ5!* [jז !2T$if4uӎ<g69Gms1^JǪ�F�"S ۻ>s?�{`]_DӵիWgoݺ5I{zwzힴ5k%7JԎw'Kܘd#xɒ%2eJo> C @�@�@�@�@�@�@�"@dZ@�@ 쁶-yI㫯҃>^zu]IΛr-~dK A@[X=k`ai)D-tRw];ׯ*B2o\믿ɩcqctjV6X1O:t0B@ ܡN9E2顇$oҿJZ{UHؾJ`P@ `$��@�IDATi<y AR@ X>T\8T@t/zS\P4hPZQ^}o,-q$268}E�N>~=kαV#<g{8 /v_߮VZ:exÌ3ThQٳ'vD u3P c'( � � � � � � ��aah � @v_:Z5i׮]3gNAVRΝͬvoA@j,P<*Ptĉi{\xT/M{㏏o'/-yr]__J&͟y'mB#�:K[zitiViji8gOCQɪU"EsϕnQz i P=㭡@�ةR3'd}2ZB�lX.,YR4a$ʾ}o !3J"Jc( �-`a{;vԗ_~e˖SNz饗TR%]z/ Խ͝;wV{ ,Obnk6EK1?s V yM2̌� � � � � � � @(RwGC([ĺ@�@�$' 7|S6믿t|/o6m'|F%HQ&l?S]vUW]uħe7nܨ p\HDp@$ :T/^~e/zOСCwz}'\+ G&zvôU.]T#GA˟͚5~-첐Ky3篿G_` .ݻ (/`AnSHVm[ϲgf͚ݻw^z馛TR#]Lz)uOSB=c{o&ON:I>ʔ)yr$ >|W֭}̙3:NuɕW_}}&Mo״i}=;L0o~GV;VGֶm6kNZJ} @g\"2k6t9rz=cԴ0/d@Ŋ}]tu)-\(?HÆI6BjԐ48e!^  @& )7~&WJu 0@A�pkբ9WiɍC  .;?- $wFw}׿.Xr͔[M]LxR6Os,^odfOڦ]wMJ?r( �Q$P͍kD}v]~;رc*.GG?Y]O|F|3fߖM+u+>3ނ{N#FpS{'>b&VR>"m/X+W尀P Pi@�@�@�@�@�@�@�) � �DڵV+(!?no"�ҥK+G[pb\ۭ[7?d1NB燒YТ(b7Zȣ2^vegyfͬpo!d6ʽJ6n؟ny뭷Y=iSNۻvŕ.]({2FOz뭸va 6jG?3/N ȨۤYҡ6mҒ%Җ-[tgxoؾv_r%^Ұ#~C-k8}=lqKV4 H۷Zmb ?VryiC.ڰ%FX=϶ˏ?X˖-5wDQgj(Y$+]\0~Jrd~0XjVc0d@rSa%uǐraAh؀0Xŋ=,w@nixiݺ-@�"] GpHEd6Z8V`Н_J%K;SO~,$78u5k& _ mt>k)Ofݺu34k]{=īh Hq[@ ˗ϿVoZW0p@%`_$f͚x7O1{ؽv\bXiA)sHqvli/R{t׮]!k^7R@�@�@�@�@�@�@�[wD=Ͼ( �+~!ya6!�$ЭUy{z *UӧO6m~хͽz(~3fܨ+μ\ryW_UV</_ܹs.s!+q馛&y 'N닛rJ m۶;t3 @?"z܏7theJg<&ȑsa0Fjܾ\]iԨ?_LE˖-\`d2exE>iԩ~ʕvY CgÆ 6nO}mqr8%Kz[nޓO>N}08tʗ FQsϫY-Jco9FM9@ ֮q<=)UlI;,ڴcZFZh/ uꔽm_u]|q"]v:uk+]~-Mٴ zwm tT7^L}jmxR63}r6Ss(Dy˗G|W� @*\;xn@[݃QNIϒ-믿s܅5jxcǎ=„ n0JY7ovfy/Z܇ ?HPR{}0bQ\( Y n5!� � � � � � � @ΰMa � �S`|i'yO>D{͛n̍Յ;M ?;꽽Sld}ڵw}W.$R)/U=03{zl>GOcm2rH٨ <S޽O‘O<D0IHtM6iԨQ۷o1cķB(}yuΝRQ5:kJL>@.(Vo+{ ,(p~嗸ɉ3cP(5} Օ U /W^rroMW>ܟ6h׮\d< gu܃$jР>35nX7pC_)/syu$wA H?(+&q,-[Q\奋.O }m"}ԯ_N!bEtiukvVܾr@ 촭뢄NS`믗F7N:H7T)ˤA]۴GĮm&v]ӖIfjq^̬s]L͵Wk#%z*WѳM  @ԭ[7͜9S .?j.]qLn$?Kȅ̙#B)7ב4Wʩ-+ ,柴^LM4S.Sn5ێ sTȼY � � � � � � @m@�@�K%{.S_+V_:tHw^|g4i^|y4{Sq3Νi7ZYl8ϥ-}-YD;ӟ'.D}x SO=p%E|Ȗk[oejV׿\ E\~t E>B(+cG<4G6̞m+͘Coo3<_7)3m#q&O[wb̊.-M66m8qkoh nOH/\W_}V\K.D�ݻg&bŤpTɂY#r],#]u\\=n{(n7[Q~�#`-ZHw%\u4| ~w)I>4a~eP@�;NS@ BxB:Tn`F4.L"k %vm3+zܺϬs]L͵ט(!L0Y# �u+W_lڴj׮5n,_YO}VGNOJd3m۶-Ջ`+^~-Ͷmm5S@�@�@�@�@�@�@�W u.@�@�t |\8쳇/UB,(1HVX%5L1;8a{()a?N:}Æ u룏>1c(O<M6 zJftg駟~RΝt݅J|V:wcֽk.mܸL Bd j%X=[k׮ժUZ fzViFIO0!CsyuM/3<|QFG=$ɓձcG x|"t][n~9Hvtw/ }d1?C�Xp(Լt{ r 6;ՠw !D^vW_I+R@ ;,ҝB @ 1ʅHE`b.H5kJIq6g̘qD4OڦQh7Ah(  TϞ=]0?$ _˷g͚J;8r=zs襗^:4A0mPb7%S[o$g۶N:dV� � � � � � � ! 3 � �$`uԩtه[vgo,42o<9J\޽{SOg=Qw:fΜB,�+Pu 'K_9i&z,pvQti9RCo6%@UZU ѣ?c7#[pի"A>mVD Pټ*V,دM>~@~PԖ']x.{9?̶Cӧ߄;3\nІ tk…~b3S1/,tp"}nf7ϷLӤcw9o޼SIJfvnÂml&NVڿ?iRUUKr,ˍIay,3w@�4?iXY@ ,#ǎn1 DR-.|RݺYeG^یs]یkFgư 2l6 A�]<x֯_`n_^{5pőrm0;H=ltSKm,+GGfr}bɍ5 x#m߾ [8Z) � � � � � � @. � �6P$<"{?F{DΤITdI\)W}KX3 [f?-Yv?-{޽Fnj .WΝe X�d"E`3 %b7Zs<bGBͬdܸqc&okk֬|AoRJ~2۶*Z4:G2_ xF9Wq~HeժUZtn?,Ѧ~\ٷzK/Nqi6OJiiD7kk׮&MxsWZ* +SxqYha)見y@ |ià0mel4뤓$. B,ˊoZ.[QE�p-Ժt}gI)w-7؃tEy[;$vEA� @i 3$^`F?Z Ycm·UK�oSɝόsmګ-O. dڦȨٽS6,v~uzەpI_|?ZZ`eMƕMIZWvܩaÆFٳ?,ʟvB7AIE۫ʿF:bĈ,m_Vv @�@�@�@�@�@�@�p7fZ싂� wmoi Nm<dIϻc+7n{dJ^ xݻw\H<Z޽{zx≞a; qύԴ^z_~̙؟UR%믿\ИB<yUV{7y䋛n{'Q5kziy't_QsAޯ-Zsލ7]xnguXٷon<܃Yr.psQyv?4>ҳ??yϼRJyz? kqk9rgׯQ387]s5fI =,r?6m _hux]h:sa lڡCغukI}GUXs=k0n`6w=VzgyWc1j IxO?yސ!;&:u<w ןp率=g<wywgJG=wz^F_/kD� yMzmْ:X*zu=o֭5m&<G7u3kɝO͌OfR^ т>ϫU+j^@�hc$W.ҝm߾={>S[&wޭ-Zȿ˦}]v/Yb_Wf=TPsznޣh~N:Y>K7v[];b?/ &Okj@�@�@�@�@�@�@�2&w3tTᇙR �d sûک>zKZB*Zv~2e.\͛7_~ z M<zFFwarAr|;]P=~f#ʻn.F/Yd^X8 p֭['[b߱c3ZUpIU(sg(]2;KPtuwԒ%K{A.~7ŋ?泔&dtpi;wH")Z{QP޼yf})6"ReJ;˲h%Tn[#m$!]xc8@�D!̑>5KڲEWj@:sD` v܏M2`4~`A@ & ӹ;W: $;^OfO͵͌^{mR֭1K@@�(zԠAGZuE.\P.$2{Ҹ.H&L Öt׿'D*~+3Gs\w�ܨQ, )8@�@�@�@�@�@�@�0 2 7 MB�R Ȭԥn.+5o> 6]/2(;ҽLZiѢL@ DÆI}JYPVj$2km4rtCɅꦩ fF�@ M|`H c~7 CjXj$^҄ 2 CF"[X8~/@ LF s 68%N;M.H><AHgI\"-7WZd^@�XFyw4 l2y:\_]~qF.]:3'PV-wyzײc̙wc]V˗ϒuP) � � � � � � � < � @ Xȝ\wݱMٺu~'c?e /mThf@6Ҝ9A\Lm  O?Z 2]G҈ҠAOK{n� @ !U.]}…;eInݤ?S__*^\jZz1iڴ #F �a-'X7!XD}nhA^F6oR8`� @Zv.]Srӧʕ+玑oqd|t;0[n]ZƼ)C\={R3}oڴ_TR髀@�@�@�@�@�@�@�@U � � egK/}d&,|:K/4G@ٲe]OD?HEDkWF/_N3f/[*(7~4i=#3e*ro믿^'Oג;$$`� @& ԪUeU8 +HHyJ.5m|5n,.ɍ:@�A妡Q Ѯ]Zg̋Xj:,mذAɒڑ,nM7ݤ^z)B;?j?Uz@ q7X]o.X.۷?fㆆ ̞PbE^: Q;V;w6_:ޝk'8( � � � � � � ��Aaah � @n=!h>W?0 ϟ(ضM*Z4;H2$p)Ⱦzc7[0} Vժ][n*r5jDeTt|ktџhEժU_hԨQ۴qFis͓B)Gh}6m^̍�dT jhuAm R\R!=W*^<kgy@�p\nXK@o;D@J4n85kLUq_9OpVV-$GA9Q/I@�q#w7ٗ?`ȯlfWl:uhΝZp;8wyjٲʕ+ϓ?%c9+Rʔ)㮓[oeAKN� � � � � � � f#� �H}$͜)͙F͚5e_bU XwR8ǤK/ ^W#K!@s:4Bf֗V+R[V5dhSw}WzBj �/pɒ}]sMPڵ!?\z ~}ys% tWS@�@ o^i(]@ J,{@N`5j Ҿ}y*Q.w(!r X� 2aCu#�d@*UԧO;w 9e͚5K6!+6~xw>#нwCZr*W}ݴi>  � � � � � � �,3G@�@�HJ`>K=EA�$L) i#m"PD2Iya @ѢE5h n>S UaCR@�@ Rrŋߗ:K818)QB: &Mv iY @& X @ ԭԶԻweL]v<K]W 0:c4$Plwf5"�@\ʳtou=l'|M?t47*_|Zh Fɴ~0M7t6lXwֶMA�@�@�@�@�@�@�@  C@�@�xi:Ǔ@ àE@@jԐN:)sI,�!{Na0n>5)_OJMU&R@�W{S'ץKcå1c֭bŤfͤG^:x0\{C@� +ߟp*@ nIڳG:4ZCB[nܤ9shÆXu"~%KJ~E �-Ppaw/_+W_!j,(駟VժUU^=:p@dw:Z;wnuU#FV]Vlt#  � � � � � � �a,@do� � օHI+&>S@ ضM*Z 'Ц4aBe)gFuƌ CNwq/^ZNѼyft_5 � ' u,bj4hT|n|9RRe˲Eԏ�  ܷ/#5,d˅HC $kp]zpi@ k,￳vԎ� @JԫW/=Z7oٳs/kQtK__z5`! ]3gԵYdEn.TS*C�@�@�@�@�@�@�| 3ߔ@�@�XG<yxET@1`A?$[` jqvR=;3'\رcg_P:4O?Y �$!~ޓ6l TԨ!U,+}ITd@�lp:x0lg$!cGpԩ灒 IW_:U]3$*`A&JD@�,ș38 w}Zh;? ~S 4"T.H܅؃2%KNu#֮][nye*TiuR � � � � � � �Y!@dVR' � @ X!CRY*F jlБ 4o.:H҂yQS:hɒ%ٳv죍ô4 @�rՓ&Nկ.\5KRdIY3'ܳ@�lBVv/dH۷K/mGZ&8Y '`}@@nB\O͙3ч~{K.B>~ V/еkW{RƍeuUX1S@�@�@�@�@�@�@�J Ȭ^@�@�,jդ^z*E vJnљ /4aBWʪ@ ]!J{׼ysu){J t5[Df' @ +ٱSO)TRÆR9O? FY*:�d�AFϊHT`Ѣ �ǥ2eQ(`E[ %� �*'O]ve2e/_+B*U$mҤI:tP1VޥK7x7E(yZPB&F � � � � � � �d�AYgK � �X؅g̐Ǝ~Zʕϙ�G l'hޥMm[/}/d3R@ <,U+('РA͞=K/ xU#GVZCgWz� eJݻKFI6IfI={J? o rpr[K+WƮ=G�B)@d(Y) pTԻw2Gt +}j~9ߗ4^!AF @ |8p֮]w}W[nU֭UjU=ڸqcv>D=X5k_Յ=ݶU9`Cn!  � � � � � � �a,@do� �ĪR:6 ''l)i2 A/#lcGk=jIw)s䜼F�عS6Mj @Μ9u7ߖ �֪]r g(V:@�3ϔyD?_ZNze)~Jn]C8V�Đ�A1j #M.dJLi?,H+ b˂F@b � yݨ|W\q6;MK:tph># 1ر+yv%]]v@?s)G}4^ZKV|Ҽ, � � � � � � � Jn 6B�@�H/+ .U,=4lMr7Ϧ fB�'eKP]&{r xC^+Id`dñegO8M>t }kYWgϡ4 � IzI|"٠'JriRJ7KSJdCY% AF醥['`hf� ΰ@RȑRժҳJ[m ' "`AV盂� @ ԨQC=f? p.pȿ;ܻV[t =TFaHo餓NJb̏� � � � � � � @~U<Md � �&K޽A7JKuƚE aB=4X2>XVMx[/<bǕ^[` Tn @vq"]r >6ծVJvFJȊL �%/Ժ4xpTҕWJSH/)#]{AXvDu"�a&@dm&Y#=Dlm`&0ς}WZ6L/\Dn<t< i.!�Q,?~]uU1c~v7]xzGU|yu]ǛŽXז/_wVUfM 8P¦+'^bA'|rbv@�@�@�@�@�@�@�B/3d � �$//G<(w Rz_'<"@ `AEa ZMR&VPjkd>Jϓ&N.(+B*P|4w\'5l(Y0hb! ?= �-`uҒ%ҥR~Ҽyr\KeJ={$24G� 2Y/v\Ry]'U(=iS_;gdsA)HVm / �&PNw=ewޯ,Yf~ /I<,b UZ5AME�@�@�@�@�@�@�@  mB@�@� |,!=dh!iN8@ఀA/~=H@{IM|rJB6l 2TẞVNќ99ծ>|<=t4bDWpB�@ իK+-X t֭2e޽iR{'-@ :H/"[u~ Xy<$VC "U Hr@ qkFg0_ʕS5s̄vfNΜ?ҒPOW\Id̘@�@�@�@�@�@�@ j}b � �1*ԲeIwhʑC<Y# $-ed~*вtR\I/YHҟ N`xbE^Э5ҋ/J/}tukٲ~/+@�"W䓃$pĂC{ys~)rG@�P߽;kc P`駥oJJ)]Q#i̘{iU7yHȟ?@:mE�HIA4h֯_^xA?7nӫ'*G}ȝ;wLZfۧ$1@�@�@�@�@�@�@�0 27C�@�bMwa&Y,�4I5�A~jԐ׾X͒ yyEW5E5HfIkJ_,Y @\9p@9Sz)|G�@ 6N:I sJGK*ծ- (mHV5G s n-s꣖hV<8vxnP8|OiDn8� @BԧO͟?_s駟Kʕӵ^sXG v(z7)br7v'kPrLіAXZjĺp@�@�@�@�@�@�@�Hjy"� �/$ #+^\{eˤ'!#yJ}$w!-zt @h֯~ ЪG B<<K+W=w �Ċ@ݺOH.͘!5n,Y~ qرR+N 2NVM{YW/dЮ  yʶmMe+PAh9 @j,rСZ.>S={8 5lPC\";}ݧΝ;q9Z2ehMXP~WҥK*@�@�@�@�@�@�@�H$!{Z@�@�0wB +W͓ R#`AJA 5jH/xҹr4t @h&L,C^/$ld\z{w@�bSt,=W?F,DcG|yۤKcӆ^#�G *$@q^#@(F6m sXGx <ԥdN=-P0Ai= @Zo/;թSGrʕ+뮻N ,HW^yѣբE mt&M駟yI8)K,Q͚5@�@�@�@�@�@�@� eK@�@�_য়䰇@3G:#?5$'r'7!@߾R۶ƕlAq|G ,=ף 9fϖ</Y7Ho<|� @, XWJ_|!^-r ~xX A'`<?R ^o%5mzzk!AᵝhM vx=Ԁ� @ s9>|֭[~XӦMS tg֮].Y8?z:xf͚ϳNlFx.r^r%#nPq}JkŋUVנ � � � � � � �"@dli� �DO kN:U*V,B:A3M M6L*ZT}9 $ػW+Mkk?-[Wł"oUZ&Y@�(_^0@wioΝE�D$?^pЯ5@<ҧJrtµٴ 4 w\Uc@�FxޭZdYjUu#x+WN7t|ɣ~w'35j$ ;s $2ҷ*G�@�@�@�@�@�@�HN t @�@ hrѫF飏|;H^`>ҥOH@ɒȑҡCp,< UӧK;w֮m*��@�IDATUZ<-B*vp5I}t@�b[[>DZZak7ʕ]~mz�#@dlkz>K ;ɾKe-K"[-"iQTZTO=ڐT ExlE5Ȟ5Nus<g7f3;3wf>{w99|Ԫ81& ~ɓO/58Q0p� cIHH@zdСuVyg5eȑrԩ ^b\ڵeҤI%?3Fdz$B6O |HHHHHHHHHHHHHHL@Ma#    oP e\zKo_L#]ddxwpC H ƍ R 97ש#;"۷̛'ҫ'ϧL<sIaHHHSyӂ^-rU"^+2zt,OE! P" @=DoM+?'GF#T!�!cR%5L � � CPBO<!w@OqҬY3Oޓ,'PE7!ȕ+W(              _G$@$@$@D`ٲө͚UoDy$Rϴ(.Ovk+wZB*H Əi<q`'P믋l$dSO-{:ިsףȶm?IHHȖMK Df)P@䦛D*U:T$`O< � $/ A&c̓�:u:_DBW>.#$�!ȣG35 � � Ě|Y ?ҵkWy&׿]TGޫ#  s%^x'x � � � � � � � � � � � � � � $mob#IHHHcȑ#gl8l;q℄N:%6n`(j uYb6},Ylg}JNj%o; gQ VeϞ]{r$0:HLxfgV3:ʆjFP&؏?˂@{w eyٛԩKTfKmT=5`9#Gn|9=zssȡ|={fc?j}}t$֮֬Y%{iC|ժˎd޼2~Yٹ*WDYE(L[” 7m@p0M9l0e 漽c6- e � @lV^޽O /؈/!H U@rTI A'W"-[2@?;}~9p<xP:8F k7]J5U_ 4裱:F GL{Cj(G}[޼yuMd:P1L3 � � &0|Y|ylW#7nO>$ScZ/ foSz*flTأ}>0v8b9ro\ь/b?hjvslI1v)folS0v[b;wnmb8ё� � � � � � � � � � � � � � @( EHHHH `X:c&1L޾Yc, B9.cOB'0>̟?-chGc`5CJaedaԭ;Z FMTA,{j1(s>0Ĥ%훙ȄILd'6 $ݢD}ljö@^2�}9c0!!9ctnҍ:D,P.!2eKtr]}1DYI&7 dž{C9ȿϛ 7Bk$+NjEj׎U77"G9a ߜ31 +CnKT= h,?PPJAdua{ao/@e$ m!̰Q#�N{oPv6·sH?696 /L?AG$@$ʗ<XDͫGE^{M䥗D:vH~1' Fӑ� ā-j "F!0*#lW;vPn{V5П fL3Pgc`1w,P˘cGbJ~+Ӝ3cBL ~,XP *8.R-ZTo8.Vxҥ75E!z  JӰ2dlڴI,͌}?6i%QxdzB5㎰OxW1v*f-f{ccP-ʹiT_kG]55P1D7v)أ> ,P'a09\=#Qxuh<GG$@$@$@$@$@$@$@$@$@$@$@$@$@$N)$  p�!D7v$ %Ha2D%J!"`1I.]D%fb 1m1Ƭvl0Khڍ4q? sxt$]D D�߻hr)#`|oM�%K SN8>fD%B{SQNS1y>ڐ#7q~zmoD:q.л3Xao&"O/~|6OGn7NqcQnF?&IA( L[ 3vr� &copLo?vC**]MxFL ~@bo3cL [n.Ō9a[ ^(Si;=:  y _AOlx2&$@$)̠dx? DIN/Դi@m۴ ͶuV?~I>baҥzzLm}GqX Ou/$ԡ} fվ7bceʕZ,}hva!/vd_x6ҥ6 AeHH'Ν;:To0i^hq̙R])39ތCIczd]u\bN4vnBC'3^hX;4cwC4f[3޴;0v x:              #c    `B #aXg6Lh6L>1{' 0h4FvcN2e$& =0Uu*潹(d3�Z|O?'1؄-ŋ= 7aIGB�_ f'(vءϛ<�~؉RJf6S.`I%ۏ5(30YȻaoD>ĺzj]@_,pfc~8}t$�̚%X^ޔ`o7`rD)퀲\rv}i3`vC<E 6uSݹH�#` uKD;{ô޴# B "/ ҪHÆ"}\O8B$NIKL4 Ě"͚%^/5k~k~wٰaokו*UJo5mqŻ Æ :b}l 1šclf8a</K/Taٱ�%�!H,FFG$@$@H�[lC8F= cø] dlU GIQGX#P_EDz꩙qhsqBԑbyYf1vA;jf%              P}HHH# ͛7"00.2.k֬zr `VtiY>6xb 0KoaRW$ߧ1ڄXtB8^jL6Mbp` ]H^U 4CR �%LĤNF0IWZU!?!r"K)W|CF8u͝;WOl$WD !/7.H4O+$L"j 7D;�&T1hSfw4e*V'Nll@480E0L 78kfvQio� @hJF SW/*UD_EU Mͽ#ƅR�~Q䫯R3}^Ia!VXЦ6"*蟅 ۶mD,l?6ύ3l*TÇuv֯_۾{}l:1~Z|y%~oÂ]解K#rTė1%  H@cqF1lW`c`a1֭m#*aB[C,xx {Ybm…z 7eO1=JrK= � � � � � � � � � � � � @8KmO4|[>   @W@ `DY0Yn #b/ca$lq #Mc 1S=~lb=hn Ml9͞=yKh\h'k 7=`&ui#z39Aψ홽EBY b_t$K0ٌH�1 񑗛|K.ѓqR@n"Kab}i/`ߘ\@L2�8g?ݎ&#h_Ƙ&h`6 SµWDHҔ"=&J`HE̸j`I *wC{Exw(Jl\IA 0 Yde�]-[& ,ŋ˒%Kdҥr=x >hr>V,A<ē~7Yz\ҷaa08yTQتU&իW} ɓ)K*jl<Ԓ� � A֬Y7Q`h6sw.cۅ:*lV:SHdJ0^n_ьog {؝@lٲzC[ K~| HHHHHHHHHHHHH U P2U,E$@ABA' @k˖-z #A Ƒ0D;qℎ7A$FH|Ō{ٹs42F72ƛ@:pD 0# v饗jNDb䕚&닼F"`; WZ%fC9ǣG{;2 r2<NܾAW.K,N||PKz+w!IW�1GL{{#o~B( L;0 ǸNGB�DemlǀCv5eأC|5L' @f [}B-ZQI }P21zDMEfKKL* {YB䧟!I#M~R�͛7O ?W*'\T>X"b<+=~W-�=Ao1UBVZRvmYwyF޽EvNWL7 � @B\+T%l[�$[X W0bT:=3nKQpXH]v\~ZT{b,HHHHHHHHHHHHHH :" %@!Ȥ}u)qAeʕza$aH :py NxF`vg}vsbI <`=0 %!UPA aoɓ(8PPzy8``ptҥl2qGfͪcz#h?t$߯rcիDÇC+LrƆI0:TX3sEMPNxS#v�6{#h&T:"rr+:҂�&+QΘm۶mW K NL$ � DJ`xȠA"mD'$@!ļwA>%80THjStytH;i0̙3eƌz >OըQC*^8 �Dl-Z$ .ԂsUA2@0Ze [ݺu}ş<ZHH<A� Uc|rɒ%ZdM @>*حf(Y+d$2I�[cũ10.hǖ?LIHHHHHHHHHHHHH =P2=3SI$@>A l߾]EBl*a #VƆx @;v' Q%.fD  0= D㳲UF"}&ҹs4>${$< q/Cbvأё� &�_+VZ(jժ+\LٷyUݻE NL#p_[| Wxq_{P@HbOѣ6[(6{Xwa$@'pO#@" P21Uw՗ jā@PwZhuFR=ѧESNI&? X, ~@k[CH�]O2k,?5mҤ4nXgw"=PHHHN௿cϗj5luO"0u .l$60VA1}C8bS۷??m0$@$@$@$@$@$@$@$@$@$@$@$@$@$� }$@$"("/2_~Ey-\PA_3$6|Q"^06n3ڄ&6}qm\Jp0.%*$jBHÆP7oެ'͛7O-^XW|WAN>pF�%Kd6lؠoj֬7L\2a]_::4 &S`֯_/R6.Vn'`0*wq'$pN�" F?r,Ϯ'GbL„I8;IR0o)ZTd .H15$& AIӹ_kXMJKsH9#D:vQ]$ryΟK;7m$GV1ZE诼VF 'Cs'ӧO)Jڵk@ҬY3iӦ;2D[7+DG$@$@1'q9shCccY1& *毄�jeK3=a1_vmtԩSGʔ))fHHHHHHHHHHHHHH s(9~|H� %U"6 Ν+?6nܨ'`UjA/!&tg2%edIWpİG�#<y&a2 7ast!l(1QbD9P3d? r̩W(6)QGػw,X@Opuʵ^lٲ8} I@7Ez?#TAe ֬Y'M+Wf0BlLG$ ֱnݺ h?`9r h?@/f"HH mDZ UH � AS8QI8 H <ȴiY0 &Ç�_ͥqo bKq c\Ydd{U90$5#CIO$@$@$`T\f_8l)p" {TcAyF�{K,)ՓKFtJHHHHHHHHHHHHHH IP2I^I$@n[$@FY3gV>|PD N~7CA�.k׮Նy]  inͼyNO޷O$јw)?M2EN*YX1-$Pl('f͚�R H {ϙ3GP׃+D=\;!>&_W,]L +Ҫ(4…cpB=  }TF+ԂNHVz_h?6[0 4.()H� @.ѣEF%,O|R� nU%&Ү]bPI .64(S<}'NN>s=PXu|Ҷm[8 H 8 cUg- &h;:ȝwީ;dҀ[nQk ё� � +0Vr+XuK>bDCΑ ZcX@rҥzYfiݻw%\"i7أ6HHHHHHHHHHHHHR� S 3}$@$GB~@o֯_/'NԆӧOUVՆ\sԩSG)|H u ;vL @D@ MX}٩ !)S$[79!nɒ%2f7nɟ?\wu^\ċ� C`Ϟ=ƌ2ydYzk޼hB޳gN`GD" Ny�h36m`r4B1 ml# @ _FOl߾]ʖ-+_P̝;wyHC/2j e2H{fxC{?I" PH"={FPܺyf裏 9r[L7#!C8X{ҹsg d+MZhPq&<$@$@iK�[crZq+X F \~LG `ibamB nZnF � � � � � � � � � � � � � " A[eHH  AKA gaK/ՆS^=ɗ/_gyH  a #kժ?5?Qڽqs/Ç o ' 7 W]u>& ğMdҤI2a-5kVm߮];d˖-JKQsO%2Pc"6 ؆T 6" ^# !�a,F6&=zT-I*Q \EƎ5CҀ� &~'H\2 *{/ŋjjj*L׊+_Z.y@ȼP#$$j*56|gR ̓'O&Qdb3t HfgϖCʷ~+rX+%KL1$v01A,B {jŽ;j\r&HHHHHHHHHHHHH u P2u-SF$@ P2  @`ٲez7|#[l  #5kE]<S$@$h0nU 'O+ypzs9Q)pȜ9k./drJ-Ӷm[mp[DNI<Iرc:O5j`C;jժy2)&˟kN-Z$Æ ۶m۴#&R5mڔm&ƄR�Ν~xHm9r-"E\  $ЭUۢIOL5 ?啧i�  ftwaݻkq$1Б@*8t 4Hz-9r<SңG"x߮Qyx' � @z lV>ٸq[W-[??=0$bQQ/NEO8!:u{v()            HWgk™n   3 >|XEV^]V*K,{Nvܩ}z*ee˞ ϐ� @&ɓG 0ȑ#%gΜҥK __>!ߣ۷v)Y 2D A4xԩE cIdVZ6Ek֬)jO:en!EQ/|T\YJO>IVUD1m&FR@֬Ynݺꫯ @>Z,~ںuk?~`R � $3U咫U9x0S¸� EM0 $=k׊>}/ϫN 10}t!E Ν[~aYn7}wB z1< ?$@$@$@+ڵ*UJK޽WCF-;w$?H!g}Z@Sj;v5jH:u)™            HCL×$� � ?J1']otAnݪNɏ~t$@$uem6m믿ʥ^ΝX$,Vt̚5K4hhad;sLyGxHI@9o^6mڤ'u?rK~ɓIxF~$ɒ%f ̘@O?[՘Lyf|� @Oŋe…RL;ޓG)& H%Hdp-O=H"%@!H~pN@i"JO;VRǢ`gϖ'cRgpL {?~K6mcǎr~덖)gIHXf^lRJ\R.]*=*TȉH s9چpԨQzai,+ ё� � � � � � � � � � � � � @2d25ƙHH\"gmYZ.Zl1BcIѢE] ސ� @t0A bƍr_tEҸqciذ,X :O) 1InMJjմ!.W_}ue2I2K�⁽{ jf;pw}YSE 4in޼Yn6)_2ydYhC ,H1T B�?QlٲEyϤTRoʉ'<$@$]^#E6wcF@ _>{!L# ğZK-pbUXBZdŊr-+hC ;wny_~˗kQTf'` :+=B$@$~<'!!8~ԫW/`0$@��ƍSNҵkW]HHHHHHHHHHHHH� m1$@$@$KYf-[VV^-??^ Ekz({ϛŋs='UV^zIG0йݻwˀEZ,{)N[G\ݎ֭[D]h1СCZcǎzulr!]^seʔ}jB;}y-[BG*W,Ŋkja%Jx"{/B:t 0_91?tyzӡ6eУ>t^̻ [lr=ȪUW^Yfcǎ@"0kȱc<y�Sdҥ2l0k<^ƌŢQ'nR|uYq)~ /PCe]6O\< 4Hioӑ� @&Q 3<dŜ%H%eWl*QK ]3yX%O<1G>xW!bD1yiaT.0ɒ%5% HOSN *ha9sСC"v:g٤D{Oy,P `qt3h6,Wzuyvot$@$@$@$@$@$@$@$@$@$@$@$@$@$ ( oq$   I&ꫯ &L4I> B�xnHQD,Y tn޽2}t-qȑQ@z7 Sׯ[ڵK` 1e_MJM�?o^u&?!]B@ek+V3f@ i3={u]s&LCgE)v;ߌԿ@ĉr,#" 1y8AE͛7ƍ%ļ9y衇t$YJ%x jbHɒg\ o09bԨQ2e믥\r1 /3oذA6m$A,u!ChX╦);JW$2  $-nk;#Y bWV $;u$w}?~<2� pê5M_ � 8'�!H5t@G$)>Rνz xu]qK_}nF,zn!?Q_s9sj*,^E.\䱴Biʙ` I7Ԣ|̝;vs|e/I xcNyؤ^r.R' ("8q|'EIH6 � � � � � � � � � � � � � x� ?  pvrgbt!_xƿu1*9<(0:lԨQL E*7ԳgO)[lLBVvmodz-x}մiS޽"^v_|L<YG!PEw- d B/^7v7b<'.2㑔<Ye[D`O,Ο"Eرcun"I({ٳuꫯE ^v}hfϞ]v*Ce&OXO N3w{KʕL[=Ľk}e_z@$@"t$w"! (#7 ` y1~aa,:37nE҇vb=v|^0 tO$/q{ァEiڵk'H@ OJ 3HH+ .Z)}^psF٤D{Ok-Tl `q<l sNУ ϑ� � � � � � � � � � � � � aFJ � � @H@�*UȸqԄQ2aN:&fz@`8ǿ/>}X΋W5Ff?J<`+VL7o Q1y'A DiщlzDGbErwy?H|O9&f,ov@?4 @-q+4|p6.y=`u2UJ="+VdYFZh!WD]sΉO TR!s瓙-OGdIlJ3)3~' nc]e|3Wti駟ԩSҶm[-|~(HbC@UT;=6~W G�BGI"%jBz7)WOd՚+ '`} umB7?.CݖT6B!ȴ|L4 � d$0~x-.>jԨgIX %Y/7®^ g'"'… ˴iӴ$ڨt$@$@$@$@$@$@$@$@$@$@$@$@$@$eg*y9 � � @q-_("Q[lO>D~-Hvʛo)J#F~[ɓ' V/PJ| Bݺu-[̪2rH۷|2vX)YRhQ?N/blٲҠAٵk۶mrKe߾}3go&5jԐ_]'jw}W}Y|<ZT2N=7|#۷o[oUt"{t5�׵kW't_g~g/erR:tݎU;ͻYf2`�ѝwީ1͛7qʔ)r D`Th&|;vL=z߮_{53g⻇;묳 4z))Q|ɑ#;z?Mrue'OA5d0ҥK s=7TS:AH%sj!6|O^uw2l0ۺ袋tqF-n<ɔaˈ`8+,#FLT2de3p(]VˏcQF`4/C#GHΝIW8f̘G6lUܔ gn]w%ׯzK ׍5㥃~ZPKɼDe$QskO PϻPPꫯbs7�u~ ܾ}{]o|ĉr}#b^iOD& oݺݱdUNւ:u>A篿Z]_z%-8_`A]τ_䫡 &@yٴ"l8Y&{+M6zN@ebPpRVۤ!}89I 9Yf�ڣxwh;̂Hbv'}gZ8ߗ_~Y)b>W\A u(Б� @2P]8&t$@$Wf{E4#'ԸF$s„ vZT6q0;wJj a .Ty>ܸ/X8Ƅ1P.>.'i1v=��ׂٳԮ]HnppcG_|Qeִ;X8y% & 6`SK;/9CB3T">~E1싂Íia d߱x#\88DG<!␰? + `{קO)S<ncI<b}/?m5\ӁP:             $%kβё� � x*^{7YL(!K EYʨ)&ӺuZJE{ &-e|ϥK:vh]{W={V@l) {؟=,5B?weYj&[hqGY緔 -%d)Jkǎ~q9ۤIK.N<iXR"1A*9 Ҥ&YJ P駟I\'M1\Ls`U|yK XjkKX .%c+WN?IGYj^JRtAj}N ZJTFG(LA*W*VհaC]ہ={*V+. `c8%rj]y?5!ZjDU=ʰB8_so\6Z?\%0ߜ^|_ NO{Xw<xD,ˣ^zDރ8=P:7rJ*8x}1 YF ` oPq:uΟ_'aUB8 WF@ t.pc%T1@Ğuɤu9%g);ѣə3· 0ոqcKMpk⺾:eo >$ϟũ 8~ogv+aV^N-Z[ WčJi/��@�IDATUuVg6u4DEMo)o~Ag9uU@_MW"W)ʣ`m7Ҋtm,ԝN@eE0_s^@f]uU֡CÇ%&S(!y *EK 7^'矷hxė% յ`˚<,H } !q^ui<HuYӑ� L@uZ_~鲧 NX5kL` a#j> c"k8pg8'^Bຓq=*`cJuN¥C`m~3{WiJ_dkwa,G߷…"L$ � @JNsb7+9s?J3:g9FEЬnMߡYz1M|+lX.\Mbw4áqBcT-m. Q^C$@$@$@$@$@$@$@$@$@$@$@$@$@>j{/cIHH VD)az˵V2Fe/j}FA @G…&/mnV}yp nݺY }xb|„ &0({Z0ҜGٲeͿz۷o_ ΃} |9dP1Vt_~ 0`9y_3sn:-Xg}O>Ç9IP0D$Ǐ[j~~w{Ԋ>M"aX)n4^FL<18G/s-}5a0UTI_[`9{A%ݝҜ͔hF8WY+# [  A`f9ɇ*#?t7Z#8҄-X]*12+9' ϺnF"ƍ=Z<yNilb4 l/sƩf|TO [^⦯B}s ~G?^3FtwBUZ՚;tiA"�_Oo&k׮Sa܍ę:_$;W)Nʣ@i&D{K*$?PswF'C2+\:%*́.NNӋz>?{>m۶M*л# AS)(ǎӌoH�*.b8@l!6\ {Ajx RK5v[<v8^x// h ɸ^p@bL)p}\Nx?jD$1cFI\8,cu`믿є}jHH q"/;/9y&II}+NF5j`#ɘf8`?=޿ŭ;ÂƙAv=D, � � � � � � � � � � � � � x@VeIG$@$&N@BKŊi`&G@ ۷JARD2$%"/ (ʕKWRw~駲d}xRZ5Q.ҿ}ne]fNiFJ<E0(FPJE3DMґ-[=nxV @JSr|vZQ{>nݺ(Q"k8ႋ\q:lxc8eOxs#މ)c>QB2rH;ļ{%5·QGn0O?鱖 6LЏ6 ޽l%)%JK/"ʸTۙ"JEԪߢRPBNE- w-j*CV}qItܹSH8*^tQ[ޱcGIe5]o^n{C.6Dfˈp2o<2BML%p)JO_>?nޗI_f4?.Zʭ2i}O&(O!4hro>p9?,={o.JRxݙe[ECQݷo˗/>JSܯ\-)L=i$n%*j-% +y^)SF׵y[ԽCJ0l<2q6[i:t(viѢ B�:jB5ڂN$_'eo_"<p'|G&^/w֡oXԬYSxwv,J ܢۊ-!su43~$@M@ujt$@$wT: w @f6 O Շq5(Q_T9k_ɸ^px1a_r ^=$}a=Q7X{/ߡ w\W]-[$ D�v+a3^¹D9%ki} ;uboǟCӄlXͻDԢ"jJȶv7xCh%E-"y?l (  � � � � � � � � � � � � � DDS"z7� � $)GOGwI F;Euq4'M@BLfKd!rj!8^|'ҴiӐϛ0`uA ΧV=VZicǎe_@p`Ft3 uA?ɚ8D.P<?c=!jgԩb'cmGkY$ S\Ԟ٣P1,1agϞ?*0a6δ?pw+u/OB\-n  0_xH/3D|8PZ'Gf`/PZ<v/7$?VNcmL91perJbŻ{>Fw%h=D˕+A JD&O% QL~H6C$d!oFOoyi .>OԁW{9Y` q-^"t&@94O Wt|ȭB_&x>`ҀѦ#7E'/c۔)S$JܳzjH#;'qVcko۶+kc|HHHHm[~= &KH @B*ۮk֬WZkqP"p2$pPם/Z:O_~O:CRyEG$@$ի'9s̰ht2HDQ9/tl4?+ fnLa n2@t[n4^uqņጝa(iD$@$@$@$@$@$@$@$@$@$@$@$@$@� !� @0tF. 2f4hPRL_SNZoFY�ÿGFoV 2}Z_h1?ќ`g}EdJ(Ş~Aڵk+׾}{8qNHݿHs@t?\= *={v/^ cp1 }n*6mxЉ'2x@zGi뮻N~7йK/TO,Z~}˧NW^~{]gbN^k<>3!z!=A<)#Lҍ|X{M7fAcvKx:(z4*'rέPJet33gއ~] !Xu W^y\eARqsF^p-b1 xQmV^ܹ/H땃ֿ՛oY 0Q acI<=_uDRݭ8_G4 @a"oۜtfr%Ǐע5j.qs#vrO͛_J   <)@p߈{ :Av6с۰aC1ӷn\/\8aG>Hx" ߭X[oiL?dS~ 5LHHҘ@<yW^Evؑ$ՕӜ9\!Ut+}{ )k1M kf쟆`WVM/8bw}D◰0b#`a$|=lٲ1|:             * Az0^$@$J_B;A`|A-ru`裏J…x,!HĤeyza|֡C#Gvݻw׆kҥQ3gՑp]oȑZ믗=$ns;=N wL W{#VfM}Y2<`ڵ3?XIiӦZ\xAx| ǔj]pown r F}E*UX1iݺ[Mŷ dp˖-S"YIÆ wq>%"%KF &}{oG1|22љ1c^bŊ|8Ҥ˛# ~:,, vOa.?6#;Q»&`eWTI16r¿={_kRQN\B !/gQc=&-Z =1>'6#DZDmwQ׉O2eΓ#FŋqJ;vo6-Fg΅C\Bph?(7U'yȿq+(  M2zgկMj /J;T<B]s3Ni6m`b _yRSO aTH@$@$@$@&;Rc� $; ʓO>#jzLŲb?\HI5pzqO>pi E9t+}8>`�7o^4AA$@$@N�cnXgRWW WOsRt{(D9J`ienL~FkÚ8KKz�-ܢ`SتU+4io֬P,|7y�6�Xvp#             W E$@1 Ŵ"1^z�Hb?.wybݰa|zqk&Cnj"G]vZ`b=/2zh}lX6mڤٳG|oŤ@)o޼Rxq}~~[7|#HD-Z$XyԨQq;Agx۶m]|:e}֭[9DŽ)wB|tʕ9 |7e� Dx M8Q0 ~p(f4`'Hݺu{￯'qի駟|ja;xqA2e>6yw^H-$i;crg-w}Wpeo?{B8lС>/;qT. s!5h@Ǝ+}тΜ1xIAVwoܹS $ODRF o en S.q)Ӆ 9 }ÝNP>21G~o܄ dƍJ,YA b(/֭[~VjG[oqFѢEoSNz9=ׯC'JP\TPQ@ޏ ;{9-X8"n޼P߰Uvw8WghSQĤΡ܁8+ Փ^xAQW,]T^=CiܸVƍqGum d|I…*ÙDnR t}m+pmٲ@_a:q|B.~G:!!`QxabLB]ň#JϦ7{k9/:I&?8� � � `M++y BiM�^+Wo7O j۴Y{ܹss_xԩ; q3}c¸ԅr2pꫯ֌+=ۯ_?ok8p.Yåu,',fă>v AËfIH a, ֩SG/摸^6uMGমiJNiXl2ܘ:o9o(}Hc(dl6EpƟ8 gDPi7 9<yȅ^[ppa[hwXI1lnVm A+"Qb$@$@$@$@$@$@$@$@$@$@$@$@$@$Pq͵kgYHHI`TvfPC۱x,%vZK(ZJznիMJE}b5jXjlK XJ1iTc.\h]tE2^yKᏚd͛7Rk_#%/ԁd)L릛nմiSkΜ9'NxRJYJRY,AY%J^}Uo߾5R"'g=g+) ~SVٲeuعrqSν{Vx@<ԛ* H)1K)D,%j)aNKh~wK 4(qT𽁏2n`8UBK MZ5 u[J+J*TV|38+! =ƿKExI[D4KwZx76eN w8)Q~ֻ<7w\Ky[JRf2nAwbjժV2e,e`.? ))/U@KMR*F٢ă]+#?D^@Pv#A~DoYNW;9T <B8خZk_.9y_APeݲ:t^蔮w̜93CC믿fxȷ-TVR]ͭz=3ܔfK :,x/hUT0N[jB*qm_=< \|yj"TTu~Iw~C+gϞ]h(E]3y'{_ [J[q e=닁`?&oSUW]h(C%f<B2PVZnpN|ʧP鈤= J1w4J1|;M6:Jޭ }QAm*<sjY$%g)Q+gΜڇ^- � $ ZÇ'MtQp�\G o:  j?S.S qN>nӢ]OtC@q` gF<"q¥E-6tX�!0DX=Iܓa=W-`iȑz'CݖTոqZ#`IHl0^uq$yjL+uΗ^z E9Cdnl6m۶hԪUKy eê 3؀pqv2lάGl`S|3±cжk}lRHHHHHHHHHHHHHH HjW\> �  "Ǐ1KJ`uާ~Z5B'ңDMe((! hBUx^X|w%r)} ~S"0&lVNV"~3xlڴIl_%+Hս<?-q9 %Wu</#ķd8E<:tHv%8*J8ozժU{(3Szx72߰fܧ&%Jd~)c|sqDB<^e)?ο쿟ͥEqٷϽ$#|wEeT{e^�QPEdߌ ֿ{kw7ef.?9{`ys{c}.PE܌PB]�ecigPŢD@E o)K.!hx7)?iݺ(:]y( JŊ"VbD e>%B؈ tMux{0n+>,֭%,JDDǛ7oDuHpyrǭ޽[Z #ygm''sɍtۄ>qB{DAMmcǎ%*+V`6&~n ;C({|pIHn8lvxGOH !쮻DԐLx0tH5\?�^mՂz,{ #AN…P}\q?X0~B#b( g6}0֎w޺o 30?OKxD$@$@'N6 mZpW)+G93;~_n/ب?1@vPca4&NN`OkzNY8 <쳢gyFu3 E$@$@$@$@$@$@$@$@$@$@$@$@$@"@!X$@$A*2h 0}<xp�OR.RBv^vFXpΝAŏ2+5m47={cnӧ|!}Cˋޗ4ݻWgt'7 .k0]~ * q#GdĈZ, s<RdI'=O=%2i'» $Cf2jt>><qT2֒, p3&sn^I$pQB^uU:{=]4²:ɔbDƏU=z"`7!! :vov x2S.E;*oNkTHC^H?&AI;! w}T~W͛_} e˖-]ƋH""BQiKB}jZG[bI z,4nMx _̦Ix) N~= &hҤILjoYbD6Md0$@$@1 +bX�m۶z^J]-UǖiZhng~z!(# � � � � � � � � � � � � � $YƕHH sn%9?t*eZq֭'nZ繄ٳG ,.\8&˓'<U0.JB+6'҅{_NҀw]Dp3Nfx!fzHʕ+'֭Yfٮ>jψhXA}ƌ_ 4-*{t5h/ƍ|cbJ+C 6sέM.]TR 8 _yN;~$~kP{_N8g͚U08s*W|/_^ 7o^X %1gԨQ˜9s?뚱 7Fl"^T jϞ=e}>sҨQ#A�5.#v._.<vZ݉U|BQ׆$K.-W\qXEϟD} RH6!CȖ-[t:BZ-)/ � � � x�b~ � DD�}{KwzS&_<㔁cA,~gG~/B:w,o,X0~HҐ԰)gIHbJ gΜnݺi=zdQϼ;lS*nM;vLۡ|jjJ*HHHHHHHHHHHHHYrnEXj[ґ� � x7l+FQ믿M6IÆ oL8X"D+ !TZ5-Hs'2Z ; `2qzرҡC9묳 ݻwτoyj9r=ytMZlA:މwcynOQm:u$6I쬉'J^dՂI1 =.zɏ?(5kԆAbb|& @< M�ZUWȡK5k6ða]wiF5k6C$2|櫉<a裏dڴiJg']&p"ʼ_UƌE--[&vI:vHqS  %|+J6y; #$E* +NF wB_9rhx]0վ9'`coro<Od*E.\T~)o0 � @8[0`,ZH/bqVZM�HiCٳg<CS aBIHHHHHHHHHHHH\%@!HWq3 6+e&+ގ'c- ,=Z֭['UT.M4Cٲe{ߟ!Lua&/ d"Yfu8ɓ'˄ d٥iӦZx"R]G25qR䡇"63OZJ "#F 6(1ʫ._|fYcy屇}e9rDrσg4i3"_`q˖-@lƍuQ#P<;o<%H4\ X6&7,ǻTQŇ�pNP o&Y7vޭ <kF;+U@HH PTJ&/JKfphԚt$@.HСCjAwخs離7#0w\۷|RbEygm۶P\EDi&im  Xd^cU8%Ƙe'J$9XHz֬YzaQF޽{m!_oƤ>M$@$@$@$@$@$@$@$@$@$@$@$@$J(Joi! fw_rKyBט1cO? ԩ# 6TZjaQ% Xv^{wRTwJ"(5bXk51kbC-Q#FRA#(" mp/l3ٙs9̘1qٲejݺ,Xl;ᖩ޺UTIzhs_YӃwW['}LUX/Q:[G}6pmҜ~𿢃Ϝ)k'g+Ů8|1N8QKV=ԯ_?Gݺu#9?Xʌ@ ,Ѷ#ƍ  ]y1p)(D�R'AQfa 2ԩr@Ҝ9R- kG yn72dx&Svs.̅Wr2c.,zj_3<3f-n{Nh&y= ] G�P]vm vkb7:ÃZ$h  N>QMj}Qp8?7J� � � � � � �% d~Hqi6Ŧ! s,? |Mi.ٽ{w^s֭ZP4H-[df-6ZA@Yx/~ 5l0QEȺܭ`?mt!E4rH㏵yfu!00 W^8 K)@@ۮO<Y&L~Y(uҥKjio?.)q|Q%wʔ졟7cLu zsШQׅ"@bv}SժUߌv?~薲@ K9(*K?rG < I~tԠ~钼rV@ ""O?tЦPZ56sN9 U۸qy 5j\+B-[LZMJtm)%A�HOݻw>ӈ#~ײ裏/sw!=?_J+V;6hN:97T\93*K-@�@�@�@�@�@�@�|@�LxNrL(iO&gA �m۶ !mܹs0֮];L@g[:K[_|M>]֡UVAȓجY3${Kns,wd膝;wʂ}> :[@X&Mp }ENT|Е!MvᵅoYZ42ks0o߾^z6$',. Ud6m Oi߫)S^UVڵkp`ƍ/`A3ݝJlblcB,d -,֎,L&$&5 @%4W |i3Ν|S: s̫R,\F;7i  )TX1x@-[QF魷 ں,ntU\$$W;kRC@� ,_\|A΍;X0?\^'` ,>'Fh}Ƭ)ʱˍ@5@�@�@�@�@�@�@AςG @F x\\@WFWʅH`ǎAuڲ/ ={v T^ ,L֭[zÀ�`^7]vnݺҥK)[ufHSOI.[t-駟tZ'{PCȂlر#K Gs ~@. 糐ʕ+uۦ;xOc>qxmu҃FC/.1cF ;Bf ڵSժUC_/ �XdIp`m}]eXC 5v`<B�C=Hx!Ln{x@S_J@\h^ x&Rqc9Fm۶ 9J iٹIq:餓h*q~o쭿Mu@�#`tNnNe}·aXnhs=ph-m"p#8 # = j� � � � � � �{  �)இPӦsedTA胅B~W믃[lٲjٲepBƎe;M>`1 `}5kVԂ6mڤҥK}J ™|g yeHo+4ujP5[ߠu*z;׼y;- EA'#-˗/ mbvኅv9do3Ѕ!9.W}HsJnYX,0O׮]4l0nBVr,R#sN-\08nc?ھfÆ *RM5jgƎ!7nV@ JE ȸ0h!0L^(qGÛ@ F{ F`ȑzwGi͚5,;f/b@?S>eAP6~'ڲeKO<QR-+\ .! &yf\ �K~ndj7:׹Z@[)kc:uj@Z fk~~k'GA?ak?d@�@�@�@�@�@�@� 7_]իK_fAbZ XMۇBZ̙35gm߾=8蠃\N B&Mȴ)l,e)?G ,l:3i&ZL ^>̟r$%海Y?, yjժd={vNrE*6X`mm\`n ur_5[Xp17ظ~ضݷ? <ӥl `!- 췘??Y r?TR%I@� &X b{DBzB, P(b5ݻe7=zƍ'jͪUwGqDpGs$Fڟd駟) Q |_04ҨQ'xe,@�B̟??`72~+6.[,xSe"6Z_G2Qk|Qʕ+m:u StI!L= @�@�@�@�@�@�)@d<5Y R?4nBR,XHuc G )-kזBZMm<sJ*Y2O ɳ+ :]Zȣu v\˖-sF NjժUg4C](w]~8=[Rnݺ5Su͚5H֬Y`W`%�xos}vqԶކ NljavA Czڵ}6|e s/_>^bE5j(x?n (2̟0eK 1;?ر/FF;S !YA�l (*[?yqTꫩ+kF ؿv 4iRhmdv;n}ɁX򕲄D"BɌx̾+6ZJKvd۩;9kc^~iS ,rxP3 � F~!v3f̐oh7m'=XFLm>(߮M7 h} p=<F�@�@�@�@�@�@� '@d᜘ Hk IjPxr~ǜf;+, ^n 4ud@ 6 =0%KAPL S\[*C X]wI\u)n vYXl +bO+T6mذaϰ}w/J*`\2MyC$.ۆ_@;ZjI$qt?)`$:cWcwR챂=@; RT ͷm bbԩefl-[!5'ʹd{ю@�R#@PTjYkxҰa)S+n%m5$N{blxwʔ)<yr0N6MWVf7رcN`I۶mp>51E2j;,F d>}m޼9s ڭ[7u5xl7crrR)%A�@0+\:v+6i7n`_u֗˦~ <شiSpQɨ;j֞f͚`=Rjj~@�@�@�@�@�@�@ >AǑ �WX4 2pIB]|'5Zx^:]޽;gmvquZcݺub+ ƃ8 w:R׏bW }=;+F5 k|ak U4jt!+\Hc?m6]lYNxuf# �m?a%1 PnvoԾ{>˦PS?xA8m-. شr~Vi,0btirx} Iضm[3رFKy(]toة'Ď/4Q ~{36.;A< @f\wY+%B A&Cu؍h *x>�`^xi_-򫯾 -(Bz|(iٲeh7V7W#,{C78S��@�IDATR`~G]vءCu)s琨%M*z2Լyr@�H΂&~=?Z;oX/̞[�Xw~/[?13σ7isM-ԂK@�@�@�@�@�@�@�/@dY R-[~Z4(EaFunil74,l:ժU B^,%hAM6%6qؾc֭ڵksx9]yo]R?zmj~쀥 |Ե܅nrwbw6Pwu % ])vתU+GNOjl۶܏-m}l-{ زm}mc,m5H~*!<v2X!vjw_`m`1bc`S؂cqB۴iS.$ ~ގqP \t<A�JV�A-7{}.}.zZBƎs79 HHrcUŷy9yKM&_[n V`B-\XVr6mm/LґGʵɝJeIX7 �77YV*ׯ_@֧bormmD6ƶQXk`扵QXFk3}ko]:qʗ,j/Ʀv|cm  � � � � � � �("P@�D cԿ"²H/(wl+w7v\gL<9pg;?\|AJiI1y*UwZ6Z+`]`d?֑ҏmu}l-;X`}>�ȦM4Qn݂>8wʵvw #0rt 37M_0h 4q 0h gcQ*U :R[mmm#=a(O?lmorov?,�ҞG"\`-۾6F۶E .ưƅҩf5A(+o[nЎl~ o͹HǶ#ymib# yb[x,! 7;v?V;g}KԾ }bDfco~, @�@`O3ԵHT "� wǎ 8v u8ݟvئmЎyl΅Ğ'<XpMsv;uL6mf͚9i?ϼoofwMb  �dd:ߤ"�>i~Zkcc6Jk&S(ڑ0}QC·f۷oϵRlghm۶ ٝ5fLSMr;wSJ͛G!X_w_R@�@�@�@�@�@�@� &b!�>\SOr6ڵkW[=g|<?}>�ĦK.yCWl.wP0pd,2іiUv9X'½7 =FF(hΝAZ::Zk֩:mbqYMm[Ўur`mj)cvӬy1 y.xXlkmSѦ_믿۾:}۶oo`?ԏ~`O@ީ/mc?M~otئ<vou6߶~mڶ>v~nsئ;d]pjs\;`@g@=HQamA)m m[b_ۆm!v?a}t`S[yxbo \4vȻ}!X!1ߏ;ľf yGۿ2XΦ UV۷Ϲ9W!€� � @\@Ns �);v ƽ- y?Z F~A 9Οy߾ؿfyS`cs)M\;Iq^sUVl[l?s&v>݇4vw9޽{ϱkz0dA@�@ F~Y7X n{nK}?FZM]o M7_oϭoov/>oV߶޴߷֎<m}RoW½fh~dj߷A}G~j} #ȑ҈K\#u"  a_K � � � � � � � 2ڬ H wNYY,;;llX^|#y7uڌ�:#Z:+&f91R-|fo5y/I.yr~j Q . NŢ̶v70ؼvnSMm?ˢT] *x.niumm y�Gb[{^+9B`OcAz7^LFн8'b?Fol_`t6 vTzH+X;e8bov~'4s;0 � � i>q* 3> Pt;?ТE`,v>v|7oPYf}b P];bP9x;Oϯy;lM|݀l= X$_tx@� >EmBs:_]vIj˃vJܖ;ZcbΥ8sPK-;obkSo =}5q{#Kw)5m `Ȟ=A܉,F�@�@�@�@�@�@�(XQ  @Z -1K:G |H:uVoX^mSw;w<E,l)Ot'CVrSmwh);[И NvҤP~PnB_ԙ|Зmc/,ԿvYg?SK~v6g0 Eݺ]RR Dm’v~`7C5M :n>c #T~ksG"Ŀ#Cea � �Y!A,@pv^nTgcV eeboy\XLc/j<?;^>^ߙ J"Y �R&blw~yckc߮6M}lmOJԷ)fJ^zJ#?,w"|r4cB. a6@�@�@�@�@�@�@� 7J�O`pKQ!@uT1^GtŽ;Fk, '0ot)0xv]gU#Ǝ;oo5R/`CٸJ_}UzP@�@�M\V̶O"@.!%}{ H^taae@ *@$@�2S }T2S-rF,͙ `HcI i�餓Z_� � � � � � � @=_@�LغUz s36.0sTԸqKJ<-[˥3ntŋ~2 tgĉ[&KB�@�@� X`�\Y @ ֦kmˀ@ ӧAY@�@ Zn5lcҮ]UWIuJ}Hݠ@�@�@�@�@�@�@ qA&Ζ%#�)xuɂ.(` %vPVRi~]f'N5$`τ �;V*_^:¾@g@�@�R!P^4X7D�Z.Ad)ذAV-~cI � �SG2wիaâ7ӟ-;&OS+R @�@�@�@�@�@�@0DFy@�42D:v4,<EF�5Kj6MzRRӦQ*�dAv.UUզX曥G3ċb � � PD  @Hڴ0 l(UQ@�@ _: +1cc^yE:0aC骫ߗo>j� � � � � � �[ x<@ gK&H^P 3%X/0wtA%_5"�% ~J@  <8jN}@�@�H�A ( ɟ2 & iP@�@@*[6ڧG iӤ/>L_UK:\W C�@�@�@�@�@�@�(�AQ= @{.z yA)d֭wIv$_oV^ֈ� P2 E*rx7(Pڝվ~F� � @L=kF�)`mkm EƒU Ki( � @^CKh^xa4ҥys@�@�@�@�@�@�@�O@�4زEzy$ F`@�-`!twhg@~gK[W^G�رRŊᇇ p \|T@�@�L 2>Q�*ЦMڙ�Aa$( � oV=ZZ*wjUۤ nݤO@�@�@�@�@�@�f"²ӧ ='YUWedP`,\9y"!ڪUT*"�&`A={Ja:$IB ܇Anݚ@�@�A]+m @: hm93kA3M LD �d@H.^-ԹRѾ7$M ڕ-*@�@�@�@�@�@�(�Asb.@ -sKTfZB"@AvPٲP@ Y#غu"�Ȃ J"p5 /d)@�@�"`AreQż �a]k%2lLv = �d@ 'H<#-[&M$y4rԧTt%҈/3>qj� � � � � � �% Iu"CT(�/0kԶmW "Jo P~< W`ΜAK(@҅JKw-̄� � �%mX<:_@�hF^ cG4Z02 � �CT)#7~tҀСX#@�@�@�@�@�@�@�O (1 J1Y|g @fΔ"!HRJR_7kD�(1RRn_D�M7IIo � �$C^ZL6@�+`7^ ~}ի4@�@ ZI&M$-]*=dW\!GpDe"� � � � � � � 2 B�,җ_JZ@ BW"!H%:@�G`Xwol)3%E [褓 k ) � �%Ptы3f>k㵶^ke@ 6DKPZK@�@�!`_.)^-Ԩt}RRwHSHH2J:@�@�@�@�@�@�@�w֊�U:'Kݺu, (P`iN D$PA&p,@ I%`,,iDϲj#� � d L29C�"`Akm Z`h WOuIX? � @*W8Cz%i*ih騣_oPjOg@�@�@�@�@�@�@ A&ޘ5 � 6L+*V�5K*~Qle @fϖZNX  @\f̈^@d\8Y@aI= � �$CࠃL3@�-`mkm Z T@�@ٲGN:U2i$ZΓ^{Mڸ1e � � � � � � @I,E�B s?H+uQ*3M TP!-X jP@�B +U&u\70J曥[?P3 � �@ -+x+ @(z͗T XdRRժ. G�@�@NwG!-V.  ٿܴ$LeA�@�@�@�@�@�@� Y4/F�B'0tpacK G@ 좠m3TP ̛'Y t֡,B�G`OL|fe(KI @�@� `AK ̊� Zk%2OV̂ +WyV}T@�(7XJ2$[ 'iƌ".@�@�@�@�@�@�@� B|V�Tw9RY.#�E5KjӦ PrZYrK�$K >X:d =z 0c͚75E�@�@ ABu"�^ke@ YFK@�@�E~;^x#rcRR7K|"ޝ. � � � � � � AfN@ cOڼY瞌A�4صK=[j6 MQ ӣA*dP  |#]+zHK奿=E` � �dAn M@�[z~HAVn@�@�ts'(=l4qtp޽uK/~[ں5]kI@�@�@�@�@�@�@ SOz!@ ̝+ ,R_]*�!X@' CP,1#z,.D�2B`xZ5cnj@ t/]yҶm+B�@�@ c,҆KSE�H_ 6߅ ӷ<3̌ϑZ � �(C_fI7$͜)  լ)v4tfMK@�@�@�@�@�@�@� H @ \wԲtUiZ�i/`JZNPR`t  &H={rOJ6H/t@�@�Y l;dZ0 J SϺ@�@�cn>TZLzaiv+:u#f7Fg@�@�@�@�@�@�@�R!ePg @ ~[z]ǥeK0ގ�S.jP\ m Pl~͓ڵ+"x# @ ƏIY%Y$PtR$E � �$QfMiKRV� k6_ B nTF � �Qڒ+iHijWCԬԱt_q̎� � � � � � �@ V@ [H_/sԷo*J:@�] Զ- ٳ;Sv։� Ps+,A7$w);@�@� #PtAŅy@�.`mAS_/U � �P3ϔ^~Y飏_|Q5y5҇J;v̔@�@�@�@�@�@�2S \d~'YJR5H Y6mҢ>]*WNj2F@�?^X1z@V! /8顇BR � � @ 4lHd~T T|T J}֍� �d@ٲGK=&-Z$}t%'H+ժ% ( &mڔV@�@�@�@�@�@�/@dMY" 0@֫հ`@`Hb Xa@� ̘ 0H@�0A=%7K]J� � @X,rɒr!�E|-ڀHuRZ;E�@�@;K#M&-\}|y4 fM㥧-{x� � � � � � �W >@ ۶E.jw4(+gu @ᅲ~Q"2 OHRIZA�E(@߾R.CbffA�@�@�" XE~o@�Zۯ3 *Sv֋� � 7N;VZJzYR%nLؠtҟ,͜* � � � � � � /#�CVy& fEߦM~=:餓\ KY~m5v>UHAkJ,릛nR֭->訣҉'X727? ,Y"-\H$_-`߼f_<L<Y � @)$@�$ۀc/}u+Aރ) � @88@"ipiju9U#Dl)r4q{w8PR^^=ދ� � � � � � @Ao_@�|4x]Tŀ�Z`w]oQ+hٰvZwg9r~½9Is-tL-r!M. oBR4 NCٳϺo4m4Q;{j'00aTԽ{S�@R<Sj@zᒭ8)#F�@�,fM4)jFm@�6ߺu3Vw1wnϫW:@�@�@ r7D /? KWOR?m k- W.G{yἘ @�@�@�@�@�@� YT1G�,qtұJ_䕳:@ /zb=z`VZ骫*Ļ?u]A׿NY#EpYtlC)› XG]v%4hn]L͝;WfRҜJ )?^E.H;Ťpd@ٲK?/[Wq<S<7ޅ� � ug~]! m-H^ L5kB�@�u%C_n~=i SN?]zU_-ٲd@�@�@�@�@�@��^) R+lJ i!)dUJ}{ѢE8p`N´:|a-B G`4jUIx@ wرc]K7y~zǀ@1,Ob @.L*WNzɢ/㙢@�@�AKdO) m 5~᭘sAۈ9@�@�G~[ϤKm$Gy:R߾#H Nt � � � � � �#P6sBM@�W_}W];G@ }֬٠Mj_ַ~s *6|OV[oe˖+U{m^u /w{+Wԡ[oUժUΝ;e}\Gkj.쥜L[}oKnX^5kLW]uU޳:+:+0/<2d>sU\Y5C=裏jKR  `A;�ZgmO<+n꾷uת~"ѿ/K/T 4ߟS |9Mu}Ю7CA`/B z~aھ}&M,SN⋃}nC^tM7iܸqlٲzʑ#G7x#'7믿 E+);.XVA fX&z_7E ,g|pA;dpx|gm � @Qj֔;"  � ж9hE89d L8C�@�H@zj ܴI߫\X{n<Ti�>*Ut=sokC�@�@�@�@�@�Ot~u@� ̝+#x\Lj@�X肴k׮:#եK K=sug[p~֭. d/Bot9 鲠E Q B8 ټ'|ryB رgϞh_6lf˱H6?<1 矯ҥK@wuerwc^#8"0+V!c(`A.P l޼VvX뮻dIֶkN'N ~ܪU/ D1RGuN0Z(%\炶cƌQ޽?!n[fW_}>`` }ϛ7/Wk\z6^W\q;`H$Öc( ٳgk̙ *_0d ^3ʀ�)okf`x'9x&EHV� �d;9& @6 X͜}ڀ?{Y^U&ݬ@�@�d {ݷ<wՇJ}HCÕ_v࣏;[*oKG�@�@�@�@�@�( 0pY  �%ض-9O%[F�-0z%`)]LąrZ|>},+¶y=ܓ3'|ֿȮ]]]WL2>}w\0O?B(>hɓ'Sq!&Mחky;y>jԨ`y.x!s9sviK/4  W^k<@ _RHdȐx/!?ueRJE\n΂]clѢE䧟v5/g&c s9/שS'RZ;6XF#.@8x`oCYlٲ+Wmܸ1RVsqv!#5k֌[.x>a„<<WrʃHCTP m߈ xPg) 7;6lo5C;OrQ"I{:}Z]+ 89u^=e � �E/OS$ұc~mpݘ:^з+_)� � � � � � PBwe@� \}4k~t]`LTڽ{wÅ;|\0\IUt=aɒ%_ l%.LL͚5 z q^trl>[^ժUuyi…?~|0϶mۂ+">;w(կ~u|9.LR.0R.K-lڴI5|]yA\r-'A`\iS8,E 00e``[WӻwoӧO/}ʞ!3'lol>…}Ah † /,߶۶ox^z%r)r9O>pܹ~mSW)_By&Hπ�)fɎe}Wz뭷p<%G�@�^F;uπ� uH5jD4zkߧ 8h$B@�@�R-p(}`t]ҥr}a5N~ZZ%%@�@�@�@�@�@�x DwD� P"g^r3j޼D @B,<t}_Q^s/BLe˖ `:{ qʔ)YD[n%ǯ¼hó>L#ڵk5bĈ`1 {o2?6uuV-~wygNNfc $B`4UL I;vl m<Q{}-h\>aÆs 7n\5jT>l?luz'I>s9wSO!oݺ}D>^.>}Uz#d=`o% _Jg1g7) � 5"r_FH'-Vm 9gR^ G�@�@ =ur}+%ttAr7px@r]j5X?\h/o@ @�@�@�@�@�@ AƝ"�kC:/w"�cJ V'ZA uzaBbPR%mܸQwXpaޗx~=rnom4|p+W.w,L׮]\_iAy 1cgɓX-[\;XdR X8D J֒%KhѢ\K~8[hIlϸ|ꢋ.LvK+u5W>ٹsgꫯN>Yg>"/T?4I.hT;!>!fiXiZA8x&$_M� �A.^,w%m@@�bڷځr~6oErn u1 � � @\Uẓ7~am[eK[%럲{w7V-ˍ$}e@�@�@�@�@�@�%@dx U3ϔ>Z/%"�pY.`qǏϵ)S{L}O?E5sO:u}gzvmiS �s=WoU^=zzN8[Mʵk+{uۭzK͚5Sʕkԩ9˱[A#eY]V2XG󶟰] U,mp% <8=_:(-"ۇkꫵb s9믃:}ǪQ}e'LZ͢JSUB,`\l4gA)?p<L @�AvN@�a?)=&IA&J"� �d@ 'KCH˗Kvw%iz#+]v;svi/o~^G�@�@�@�@�@�H@Tu"�رC:liƤls B#f]йŅ3 ,X4n5{f͚n_~05j,$/^dɒ%k~_JUTuꩧUW]a~`je`ժU ,e/gcq`^{-?x{s o~ #twuݻ4inݺ 2ޢ,/Q}<>A(gѢEoua'"HkK?ka�X vکW^Z;<[m!~OpNҶ f.Xfv>YM@7K&.9F3R @�@ >8Z\wڇ@ ڶq`Ws$_h ^=dm � �u!J3fH_/}t)rx3ΐ^|QZ6wM/1^n}8 � � � � � @\B܆ΊDld@�(/T|U @&Lpi]ZFE\cą-F*V4hPąfE\�Vąx맟~t1 :4Ҽyӟ7n\{&M`^[_F"cƌWz˕+E!C3^y's^ڽ{wM6e˖f\WiӦ\�XYFΝ^z;FH#7pCĖa#^ziąsg*ٲeKwA +VH䣏d@|l} "ovVZN:O`;+Dli7ޘkzaK.$g[k6muL23<3j*ʜ˃m-/RXF8㌠VݻG\qąGlqiE|dĉ{ *_$mDʗD^x!IH;;" #+X 3i 6 W;Eζ)| %J#iaeAQN]έ;*iN7wkO*Y � �+ti>~E"ToHG" ^rf*� � � � � �@)+ 2p ű@ +x@i`3H70K[uwF۷ך5k4}tG=BB{A/O5ӂ7UʅFinv;wwҥV͛7k޼yj֬Tg/0rtI;tרQN-`l fҦM䂁BXmmz}Pmp}mGUVm_ֶmTB`J~{ݷ|,3ZO޽ ƍC]T @ Iw--^,x㙬/@@ ᖬҸx |kÆuI7ߜh2X{iXa9 ԣWWiN׸Shj��@�IDATOY � �!lwޒF6l9D:Ti�~^% � � � � � f P6x7ސ좵G6K@ ^OE?=\hb5h jEH{^zI.x4=K)W 62{9_=sY  2/ n Y( �U�  1%u,=x8G�BUk]Ǖ3]vd=Hv՝ڦV7yҭ@�@�LرC7N1":.YbAPH <HlLn � � � � � �Sfp~. @ϥ.,"#0stA\4zhUT)cϊTPA'|r<ɲR׮@ s|_OS͚5Sj֙DI=BV�صkeljX`],83@�@�,i‚ �!0~xUZGcǾ9|>2S—-ժp!@�@�r l۶MSLsnm6.X  i7y*vԩf@{yV~T@�@�@�@�@�H�A)g v1)H}J< Q {^/N*$uݣ\RVJ2Z-dt\ ldػ ԫWW3FOoϘP2BL2Zrꪜ ? p<W@�@(Ey"�Q`ݺuo|9?g/XdժY6KE�@�@ [,'-p'Ng̘"{l"}ItYYaSU@�@�@�@�@�@ $A䃠 =VI+կ/2@�شIZD8\E)$"x\hԵkԈzd@DÆIgٵv$0wR@ W^y;Y8}u*J:@�@� ƍˌP @ jԨݻwwO,JlغUڹ dy@�@�hڴl ʯ_^&M <y<sNzj׮f]5ztoN=U0@j: 1 � � � � � � 2,#`{tSYmR<2P`tiC3rT @_^*H;g` pa~hc: U@�@�@ M](.jNAX% @\ڴ.چ;,faUR@hԁ@�@�H@u 'kKf/`H 2Q-_[~.Mzꡇzkeh Cvט2|@�@�@�@�@�@�2YE0 �$Cয়w\B.J9@� ̜)U(5n4طAjPb@ ٵ\pR C Q^G'{s^A�@�@�B X F� ]6akf@ >jdu � � @^e˺nA-[ s7>D翯cК5uԠAK+KCԳ,իK#GJ۶]2@�@�@�@�@�@�@0AFy@� %w4m  @Rb +/Ȥ2L`h �!`A=zGY)%*P\9 >]RW'׸qkz#� � P" %w8A%R @x-ڄ g%ٴ)Z*U2@�@�h.v O믿ڵkQڋe2miSMyN:ϪQcN;m^zIn+%E�@�@�@�@�@�@ ` ;];R_e*�*0k6C+G_Hݺ@ ذ!z4A|!@wu'Rժ.  � � Pd2e ,2o@�B,Цdm $C d(@�@�J&PZ5_{ƌ׻[O֟{l%խ7mvFAf͛5oVjѢw#� � � � � � Af'L@ W^)RϞ)/@�-0sd0 @r,!k䮗!�OϤݻ#(y$W^zz7)xqr@�@�&M˔P@�9 3 ͛k\9kc � � e˪xuiذaZ|.\_K/ Gktuոqsp |3]~n<V2@�@�@�@�@�@�( 32 6k^t a+A� /uk"N+7N^ֆ� P<Iͥڵ~ޅ�8<NGnֈ� � @&XІ@ 3M~D Xdi׋RD#� � @"7ngEiÆu9}R&  ƌvLdX6 � � � � � �!@dz|NP/SӰ=[ڽ["2$IOC*VL Y  @,G-7#@ʕ~ RrV� � @4k&͟  � [۰3 h D#� � @VN8V/|,H۷رօFC >:zU{0 � � � � �ޙ]5oҤDI2EJ4"CHe)\\p<%C6jR"C%I"8:w3|a ߽Z{[(D,Ļ4W�c�pBʃS�" "(+{" �ԫhPLD AmD"" "q | 3~#(sB!NJ_/3ߧ" " " " "  P[?$>a B3f1ٗ,'AذABA_" " " " "ʖ-# 70ohp5E' ԨQ4ʕٚ KD@D@D@D@D@D@D@D@D@D@D@D@' !G'pUaE"}8 %_D ' T~;p@V�w^/x1 @j L-e^]�+_883{,Y4!Z ̍X@q;y&p-ҥ?(~e0'\rQ1g̾c!I%$O%" " " " Bm\LPG&%bv"C2WRx@Hdt@x!૯w@zjsWD@>�*ڵ v.-?OD@%0gNѡ|s qcY6פ A*D { >P*g^ND ]g ];`Lc]囜@tMxqZ" " E}e0'{ٗ,'Ad}B/'P0p 5ȑ@FaEkn_y%0s& ezCH sE@ Ue]�??}6@ȗ_N;Ǵ%" H xJs1u.֪ԩ;qVL I'm?e�|!@!CW[R@poRT䓢#^ի )" " " " % @j,:]"" YA}c_0X}>KB+=[牀;=x)`J`TG�N]vѸ1c&+wJ@аJ@@�iOa^'�d@˖@ٲ }�ڶ-/^RGB:։'.YEF'ED 6M'�z>ܭ[ȉ&P cneo nw>d9�m*U W'" " " " "8w,Z̛\p{j( /CB$ !BJ@pp?8xओ7�F. (HD@@f#v� }C`, ACR}1n>GGD _\ ,Y"!|JGaX6 曢rXNBhme0cx}ȱ~HD?$h:Co?x0Pf~+b" " " " " " " " " " " " ";$;J10.(d Ǐ_w]E@D 4o^$z+%4*_>Q�(*ֶmHou᯿NK]Y mdSx(T<i@ٲd9'!|tDD@D@D@D@HBNd]DD@D@r�~F}r"4e{4S'" " " " @`=/˱f E_s Pp 7�}V4F\&C!@ƌ&OV66�Ӧ|LହP?Q̙@r pE](|{v&@!H~CUTD Ԯ L Ԩ[ "̷;M^=`}" " $>`ǚ)Vr:㨰M@ .HD@D@D@D@D }hsE␜ǁ-!/(xR!@tE{E@D L`V yС //ц<jՀv6`==" $5)X-5N; `u RŻW"(y>L>ArpH2Sk@&[\DD@D@r�}r"4U*v�uz{`lSN�^ԞYRNKD@D@D@D@D@D@D@D@D@D@D@D@򏀄 *E" x1o{8@O" "<x)ձ#еk'"ӦMgmEK)N#Z9(6,!BJch͔)@ۊAL[*Ӯ@MMEk&O}^w=m(  AjbԵ" " " " " pƒVn-X8$F voO<Mp�0wnе_D@D@D@D@D@D@D@D@D@D@D@D@?N:KD@ [ X\9?n( '" @E 3:?E@RI`Z`<}T"E 8w RH먣 C>@6bmfs,7D6&Mʗq(lj;(!~ z|!>a w,' ysqT!?E@D@D@D@D@D.:Xx衢"/]h૯zU`bGM|X<Yc" "Pn e �̙_\&+" AY3`˖RS̍+"OB!r=%!CYnpt iɉ@!`]z !J7-q�elqn @,K2\">a }};T坠2aO$AQ5 �w 4l4n \u0kV-O? 4 x"~,m?Ig KCPl;G'rgh-" Ay/Qr" !Q#=)@.@jE>r"P((ٺuV'Ю;E81Hȉ' !|tTD@r�GL5D 6oh*" " " " " "@J@O+WS�Gm Ԯ s0v,ic((ٴ)GBq(N@By \vYxn)Sa߷/0cp!p@ժ?іy�uM� ۷OC@ B$@~<^1@d9ٳ6m<@R:wF}:௿B'@dr%XD o}t3f߱�'aT,?E@D@D@D@D@D yvŋs!C9s.�enV`rC{D" " " " " " " " " " " " "iBނfu.[Mt/3*vk>vmh=ڻm_eLO|YH]ʕ+E1C7s&0? K>@ ظq]vͧy˻<n3]ԪkTN3um5[n/_*T0u@B6 ^|qSuBe WvDYD+K>vj&NGA[۲•,7v+7\9,G*Vh $D&fM᷄ +D  pE"믿v31nltO\{Y7jfq ;95_Ҧt@`0]_2#ٖv n-˘n^=Ƈ;v: ];k;�.C4~VXiVjE@D@D@D@D@r@f�k~xiT`8rw ]'8o[#k!ȶ׮3]7v];l' !lC4`"~ ;xw.uaHI[h7ݲeIz .vE>[Rv s>;vRR%]reD.; X+"PHh<{ڵvYH8ĉP@ ݛ3?]μ:E\t7Gry"Mo)RJRvi'TV.<.'FԜJˉ@$K2ŕ!,G\ĕ%m)<a:˩ '`̘AphɲÕ!凷,qe+;ڕ\<р@oQz6{vQ[.XJ,`Fj,]+Vʕ+-V?lʞM;ۃSI@%I,jԨakmw}B@Ög" " " " "4aڞ;h'ٳ ];?پv5]ۿGv@+|y3p©xf[Of϶#(9%(V" " " " "  'L~QƉ>?Ə4^{ h.YGrg/lG.tvc߉>M+. n܏aB/pavkgִdi zA~9c5;[k5qx|tt㒝0NfϭɅnۭ>Μmc-R™"uOumw^nAvto5J a~NZ~0]od:XhbWGwwu;hkv;q�#网Hk֬?իW~ D9X=h>w>.k.&| xns˳#,#\~wd|ht 9XPmo^fm'R5NQŕcļxve[EwuWf͚V\d+)Sualo,O %]lθЕ+<a綹vemozȲĕ)kSep+7" o9⎹[;rr[|r[r[ȍvyg[P|%?ٱ 1r"%<Wն@6ި̛7 ,7|^i^!v ͛7X^̚%\沬tme\mŲ65D,7' L<يR/3OӦMzd@ÆE1+ Af^(|`6ٗf{?9&d[x4Ƕy>d "lwvB/ٻ ϶ ϵkwӦ[eѿqm?Nq\_[;ן5؎µW0L,ɮona 5Yʥ SWKWY'N'L�7\uױfvnЭ'^ȵ^ ݸ"۬)8ߍ+bB6zgЮ0º`pm \kkڻxl2krC[g?׾m9ƝjsEUE@D@D@D@D@D@D@D@D@D@DH-R$vz;U]*@~nadecc&;\g`{=(fcp\\Ge'j9ױK^s BPWGPw}6^g=X|nq]\g㘝ޅr"PҀ WXaE7V\^syq 1q4iԨQx3y\. NTv & }G?@gLv5K,Q\sh u#kժͲcO3e/d.,kD NڷOw /HcY…S,?"/Ƙ4sb;mrk$}Vui Ļ$H%EY~+GߕG0ns.:OXγ`957`…rABmFZJvlǛ;w.fϞmsǾmZAEnS\91G ~wv '`ɺ'N~8,of͚٥E8C>XGD@D@D@D@D LW.tIA�RD@Ll$Dn$\msf#]߉ ۮ}ޅ1�ӥ>cow(7ؖ~׏v!p}_u Z29a[؆7ϬSٗ44˨yXI#D@D@D@D@D@ Jal% F 4ir,k;m8$ұ=݀648A#1I5hK-6{i?F3(nӻfGtmlGrle:(I[Dr=g[[8N!Xe(L̇4$EBR4uٜ!x>7P;G;Xp`XۼV؛\rt5#v$/X:$hɮcu(s-iж"b\K.ª~]Sd = %.8'm3p4%X}?3VJ64 +Y޻Y{`J6,)EQyv:uؗ k#:?Nlt0xpt,P F~Qʉr:ÑGi}{q䷢ _"²<]]e'2dŘ>}�LcO(` q[Vni|r;*~Ϙ13gĬYځlc۴iS׮)v8" #ZPK=!ϟo^=wy'(To BRK֭Dr0d/3." ~^M[ sC;�}ַپυlwwCϝpa_~g`['nsWp6[kl�na� 4ԶwEB2#@GYol9Cn61fib`- b�:uo쒫ܸ$fۃ\v`,i؆&vkglڼ6} mik/'" " " " " " " " " " "{3F>"KN*:gĈ �:hdK#ʼn<qN2o?{XE{/P, рu(s^aƗh9؁ʮcmK(wpã8*Řk|WvNk˖- !|4z6!gZr Y~/p`'a 6STo~^uE H ˗/_ 28 *70�[|iFLq +6l!pX8?n瞶\u pCr JSe,38eH:~gYaY2^,?8s;/rAd|�#qV,E ǸqBxƍ[~riҤ X+T6bRAqMʕ+C֭]MND@D j(ۧOn[!(ܘ͞p 墳7^hm tl留ٶ݃8`߱^}\\?mny&7PNzمj_9GVkH?\u<gNV1ՌΦմc*hXm'Dک󙤭l۹vm}g8 ڵ-|&D@D@D@D@D@D@D@D@D@D@D@ (FQPze>R:mg:Rn[FQkD!qpGCm;v;Br%"h9r"�b X&8_)PPɉ93(u^4.y(G!R>t~FQ/ xD#}$pu / AH {`|vm+NbŊv�+WXFrO}ʗX_2 BQNKGH>c,7PЬQF(]8L'7AvM|!q9r$&Md90K.ڵ+:uꄝw9_t2~xL0'OڵkEϞ=qqǡcǎ"N}y," 0D |A̍v ΍*"i*Kw6ׅ }f]^:G1G)-l64#u8AmطL8e 5 y"K A'@kTgnmz'X# rcD \nݍ];E$X;N Ꝙn >z3}G@d,K7X(DWv:WLeь\rۈf&vc= z<OND IL7 |٩J)ի[c g05;R ܩZ7oΝkP@ |   VZ@l#~q8 8srӬYҼysfv7C6{,a{4Ogŕ/M:Nxϕ+,[Xאq[?ّ> rpe-[0 /8rzpv0c�g|PWE Ufoॗ^ĉ@Ν;cAmB.Gaر5j>S+y '_~8#S("3c G�+"Pj,5´x`>18D+@Ji R@NP6ElNϷkN&#ُ)HۃJʔ֙i#~* f#3͵d|9iTSӑ5iW}XL㦀D@D@D@D@D 6rΆ? ( q8PJ$rƍ&`kډrj ҦkM^0*" " " " " " " " " "!B bQz;(H/:^1"pnaG c(DJuYqH7Ӡ~83!),�;f\`@FE"]uV[.v@5 \"i˖- L4. ,�-[9蠃@a֭[E8d.ŕɻзo*iF9sXNIvyg+Xf9#Bj7 Nۉ򻙎[l>Z!bȥ) s'0c <xW0Gy$N>d @.5Xm} gaES|( \.!Ȓ5yC@Bq+k38};7X@& |NPmG‰8!m(Ƕ}.6UT@d)c2P}QS~eʔɩJ2n"+" " " " YEcf@{*ҾvV?M.'`{wZȉX+W 'p'\q8hsvږȉC@Bp/-39Tnsrv:5jX79^͚5=iSDP pfA7۠[/Z8c;i|F.{ >}:(AGPzvp5oQD[ b㚃~';*߃6mCa&!RG=X uliԩSm2sL+Ⱥ(GU1r"֮]Ц6ֻԶm[k۷!ٖga⩧-v_|E#z&q)XII~Ĕb< }Yw?i#BBD@rr)' !3LfN 30Qa@nP^t{5k>Cɉ*WlS쎃̹sMϽb_:88*Nf3l83'tG/gd6MD@D@D@D@�EhsN)NzicqH͚5 OA|Oٓ�Dr�yhαn| V96l͌_H g+&)I١ÁNΠ7n\l=vGND@JJN@8mAׯRTF n@H J+wN8MK|ӟ"Ee}-E(T%K@7vטQGΝ;kF<_ O(QR'OƄ 0e;؍4(SȨ,E7@f-_~<i/žCԩuf˒MDĚI7009qEU�'yG0l0^ ?2 $ VAZtڵ(" "iP& !L7j pkt*B-ٷϾcNvL AlqNd(4P;ds̱ (e ARGfС?MR\D@D@D@D@D@2I,bƌI#8:pL�'t(�IQ|9-?ȱ\5퀪Wr&tImQ(" " " " " " " " " " 9N@B9~}g,J!".4`X׭[vRt-|,W\pD@D�7 Teʔ´yG(<#2ٰa~3f]Ssv (BA4LKB,4`8 q`ܺuL]tQGe!+W<eݻÈ!yBK<?Fw}w)lǁk2+!X]XC!n*"&ٳ':vhX5%~9E[S̛|I#s֮]?Eڵkis?Y|`]wy)" "{ U(*b*L=x~9W[>@(}ٲe}rժUmvm Wz2I˴xm_{( ?<H&26ŒFCd�mai;i$[w(B9 m9VlٲF`֭vG}d' '/E[9(m}9cJD@D@D@D@D@D@D@D@D@D@D@dq75kX!Π):DG ;r<vRH2͛7 ]zrD@/ҊB~Nf NPr"4  %O`ʕ9r$|MkCȓ"C>yu@Twx"dz;jՊzvfbau`D=/~qGFz }->ht͊I4wFa2WvL0cǎX ;u 'W^RJ.'1q?t`r]I`̙8_XȫϫuZ p+ v 0C52-/" EP *IdR2zСQ ;")>7dX`Wn'5ܹjذaN#ER�mg(2qDOhڴ)vZQtupiED@D@D@D@D ݀m4ɠiۮ];iUV獎d1f[-[ࠃS-<ȉ@d?ٲe<yN #ׇw= ﮣ��@�IDAT?/_^D@D pŋ[AH pAl޼يP0!Iǎ-g#ۖ�W^y21cE8TTiۋGD %~w-7zh+GqVe}',Pӗ^~\98s' >xW瘢<z쉺ubgZ֭øq㬐om2jv}h`-@&0߾>GGD@V@đGOz?袋A<spru)*S7A( AfR"0h`QlRd(8TSqԩxm_Տ?hEؾ�N~{ĕ,&@˽`'Ydr2'5a͜#@;X;%N~N֭[ l9i5V)R&6mٳY6^w޽{GqJD@D@D@D@D@D@D@D@D@D@ 7nBAcǎ3}v-[] 뮻(!%[D 0o3g(*ӦMF&5j� LLa�<v&V\>}ЪU+ )CiC[ Qbz93ΰ2o}U)"0x0hLSD~W+O`ܹvFSO= @NRτR~D0a^2ʴo{xy灓D'a!*LY W?"  ݑE~>C8ɩ?Mr�课j+y{[bK+" G rb ܧ!)Lu�;SD@|d;�$vj8x[mzE w^ڂyVSN}̍RX7kV~ J1GFivflcf^m~jyD@ڵk($'#ؔ [n Jr%HD@D@D@D@D@D@D@D@D@D  AƁoI2j(9krnƍqGSNvoΦ%'" "PD?&M'ӧO֭[qcʼn'  .#<]֬Yc; ;L(H̿~i0#)n{EFtsG8L'Nɷ~< T: SN:W" 1Ш_ǣ>3gZ1K.`Ǹvxӎl D@3f 8XEv`DY߿ k׮iQE@D PT.pV ĎƎ;jH./j~^{ ?`}<)ڝ>-y7l?p;qdʖ-hb(mq-z+D@D@D@D@D@2H`֬YP0Fkeʔ`@6ฝ3fX;w7nƙưC(+N" " " " " " " " " " "(MeM6َ^zY>ll޼wy',Y Xᕞ={B"Yw! I֭qWb?9p}QF6+Vd8 W]ug+$wW>S;NZ|G90,*;w\f ̟|}�$}wV~Vtg5bj_H2}7B!@ +Wƀqg}Zj裏&LqUa#`]%YXw]MK/d'Qׯ&N@&K07ڵc;4E?,'" " " " +´#@ l׫WC A۶m_cԩ<x0$ow\)T|N;w<} r;�coGD@D@D@D@D Slق{|0:t~ A._<pD 3usd9ay 0/a¼y+ A]x1.Ԯ]G(?WƘ1cpK`%Or%":UTq܊{V o^{e.Əg8P䒆ƍ? Yȉ|.w:y;QX)33]w6lY&Oӧw2LPX"f͚'^ZB=&8 !.{Q,'VxQly�DMf'"ҥ V\UD@D@D@D@Cqc AB믿'x{dc?n6ԭ[7=P(" !w:yN4<y'"dPZWCi}" " " " " "@q{ 4uN: ˖-ѭ[7f(\Qd<y G0a^#A@\'Λ7}o`O=TTZ5EN:Y!LDO2r:R>HO>^<7xMr}ӥ^FeKޅN~fq=;s6D)-q~ =1bQ޽;7oW^yŊ%2)d8蠃'GFcvmC #p?ٳ' LB2i|/~4Lђn̙77FI&YAt' <nTgm_nݚ?>+w|:t3r-V1Dx2'cń˗/oy љ[#!BJ/̓ ߾ tSO8\~A%#?ɖKQ=IjժaP?xާ\!д)`r" y@Hlgk_}9TX1#t9$WN"G{%N$Lo*<\uNq|3`^<yҸv�6o.VD@D@D@D@D SX7l,Ytoԩc몬'Δ1JJsI?mԩSѿva8AlpKhüc0a#'" " " " " " " " " " D ϥFVOˏ?ڎ+V`ԨQ/qef͚/Q NcO?4“MfcEh"<s;w.dH|h6`:ھKgO�/yv<K&TiԵׯvڤ͇g\rVwߵx6mpie˖>}zL2}}؉Gb8%�雒NGAbvq1yd;ذaCA!];wy\+LYuTDH?ڷo;~wy˔+:H*9:c %[rd*ljza}F? 7tc„ v�e*U`_m-iI^/l +),zm!u`V )J#@SN9[w�Jw}Yf7/`J*ri[R曶nJ} AD@D@D@D PrB9:@L}ߴC32]GNg{@:?ɕiۻ$2qWi7W~\S: '.y:f)[j]'" " " " " 4h䚂TzGѸo6#{<IH%ۖÛ8z zm�%.^~itӦM60_ljIly Exl͏ZD@D@D@D@D@D@D@D@D@D@D  A"C_u4ngƘ1cXϞ=2Tr˔)YPq8/_gq? `8|h8g&N믿ة;$óhL6A\_vmyhԨQڰaC<㶓AV/:r]x6O9r$.TT)8f� z:w!](H޼y):y`^ SμC@ /\}vvk qPB& ᄧ`㠃€ו$7{,SDGnݺ% }Vw\'t^yv{ .r6޽{cΜ90GH.gPfpkX~a; ē)tSK.&[.lԯ_z+n6;&it@h  o@Arq]s5vbzժU #= l?m }<4qN&d$;U1O`>CbȐ!4'#&5IL@~$> _~98"E]d)bn$#*%ۖÛ8zzh;Xv2e " W]uUI/?füy"Ir" " " " " " " " " " "үIJ,7t8smGƑGe1LVZ5)<lٲ)ŠϏQ5g)ׯ_1hǠ0$h4HѯdӜÇ/.]d8΍78~x#3)Pm%̑();(Q\9-oKwL|#<y;HHFԇ(DYhuh ڏ9{]N:aw,ϟdW^y :p4Yo̙3m?| <i$['=@#Bp}=|{!VihNgDԩST^7Z$[.MC籭z=wOD@D@D@D ,@<0~EZQW_}+?[62]GNg{�3<'tɸp.i~8%&<<È#CasJ狀d�'`f@ze"ŒuQ'.ΰ$LxxKUI'Svo P۷ooӳ^{kqy E̓7ɉ@.H].SҸsFn84XQ_|=(F4v({x71zh;x[nAZp뭷bsa<Vi3<Yf5o?hQmnj;:mƅ˪UhΰR(dOcܸqo@v /FǎAZ^wy3[Hy+D#T82pBCB}AƉO<akڴ)?x+'>G-ӧN8vmO^x!=P_ϧ7<n{"ύ?Qⱦ?%̀p[N9StRKЮ];\ynpaiիWTO?>ў_>Z2b_G}ͯ(grIM6ȨPy}HtM:o޼ M6;SO֬YF#Q^Lx c9>,kPO(bx2@ȑ#B,Oθ~׉D̙_ݖ|}Q+5h vi64BqgaoAy|v75j֭[*WM̼}]XzjLo3Ζ*:<8ugg']v.t!Q)vA.R,[~Q",Y0 +_w}<c +W쳏oGɲv_}+YfP;z̘169e=zhgSE{Vxo,o&26l]zGL  I&Ql=wYRuȐ!J¥ǴV@9D> )j6 K\֧8.`+:^\ͱ zPYX=3q=%A1>` Pԉ̓ o&"Z4u:mh"hud?mΦA&5Jdx'e׻4P6K,k֬} xDx} mMb~/'O)h3~ '-LtŻq?qM9+hح[7twƜe>]'d�O>d+qL&1JD~섿\q֌pL+h_M6sαc!d'gߜL V}럟zDl9ī icb8>fco(NEн{lK\8hͮ|v uԩY9N'*n" " " " " " " " " " YD ȥ UT)tw>` CF.d:CmٲņdDBFL3K!#2|Ϟ=9c-d>#TN'|bO!#ԩShܹӧLgnZjv]ؿnwaÞ0aBt}\sM= k23q<#2!#hA&{ʕ+CF8p`hɡym1^292aJC;C詧 ʹEL\gtH\t܆89]"<Ljdkܽ1 >3<%7~)롏DiK/CF3dC?^~δ[^#xgc̳Ӷm[{Kuy䑐 r]PG}@DX<nvܹؾlnݺ yg}w1Kh]v -6/! t~#2]vqDžRȈ^<y2B#2B\x=O<#?<g#2º!#hN 11Ld>2⥣~�|Sʼn}>XňM8oeoXy#'72Eb%]4nߕY<F=!I"aC 4*[\!AXrx>lbDp˖-C1wMywúPCF9ļ e O(I8i=<݌-SzVxA: 3d:?wn5료1,v1PlsC թS'T12 f9]w#v7Qz_mf#|hj&kW]uUK*ʘXF|ޖy}Y۸p3b&qa{@p؎0bDp'5Gȵ; ktˉ!aC6hud?mL_[D6o{@PD}#]z7b!3gLk̄Ķ>OdD<خ>i^}fRᐙ*?qĉm-~ڀɎa$ڈՆ8Vb]8KG8f8m$.(dޓB犀d' fG*!bLt~z-{^~h ٻwo7xD�l8zgUO={؏-OLTN1^8bDC|m$5o<B,xv(#jm9($0\%` 4"8|H( ::!HSOe4uf͚V@;̌nWhԨQֈ�l,QĹI&(LD]'+Q(Xhf%bc KҰ;xm GuZGdHS@9 Q`9b34v.>sˆ 9z-Z E8I'><)JȁFNO 鿟x'z\</kvh3e>>5vߒ%KAD<�gg̙w΢O?̢(B&vfmaÆpXvY߼ϻ{jԨaŭ;#.s=:>>|] _g#QKrň70&wR%JGio;~{ۃg 1:~wz ]mxNzyZOyrs023̙3aZCyWN|w%d AR(̴\L`Ez_`幷zkL34uoyh~tMΫP=~lPPLhLnLoϙ3tTR 7 ƌIi0\r�'9cSw?uW[SO ?Px~1<7\$1l$84l7kd; ]Yf@`-*!pʣ$ {ܻi(g%'"@ζ`ѱ#G"~|NO{@O?}99"mئaBi c9q7ӹ^xg?pC[pbDN6K{1.~\6g-WtEO:70 _w涛 *}E@D@D@D@D@2D`vMO*1ưu'ɋ<Nkx!vg<I"kh$=ŏ-Gp1Q8C9{~x.x^i?']z~"BK-[,P@Qr" " " " " " " " " " "ʚ*$j*cT9Q6"!w+V b3{8 L%,kx'`:5+#;쏙+W1afh 0`�&o1ƠF ,|$úuR4:״iSaeQJF+6"1t-Zptr⩧§~ƛo7 ԩSat<祗^*C aX1}óQy>e)w<:Q._c=`Del|~˖- #�wS̠N3jֆ/C t8;j&5T2mxm뮻T^ļGN`2G`s722w0;0իW|385Ɇjذn޼yx+XLL~Zj٠?<0ݏ?hy}Ho^k?q"[/w_NիŋѠAp9gt;ry 錐]gcߜd3ؕ>N|7laT>^}IΙv{O-?̀a<׹o^>mzq~(Ya҈ۺo/k]z:t6gĴm< 3gNWH4?*Q<pvEz }#ʀW_}ݺus}1UW]egF߶@&Yvad,fE@D@D@D@Ei6 KR$H{tf2N^d&5kkHUo/׳m6O;vtɱ}.Qq?<ht1X[.#a9phsGg&62{O$J {ti#HX 閖r؜\pk;H1;>(h㯿 'vk<I*m$'<ijHT=qLqm{F}9?m�~vץ1;Ĉ# \ټf<JND@D@D@D@D@D@D@D@D@D@r@Jo I}WXFN4g,S6q2dTHg�)TέH ߵiE^GH3/afG}^ SS͸E<oysvCO.tiPO'}\:'fIdP>uxz(ma8D3r '0+w,w̜h ylyb)f,A]O7Y`AP^E)K1$s$yןwo߾Vvҥ8cA[yy;㮏NgW$+.i:Kv]81xu?j(�Hy,> ܳƎ(в.\ɊBxXp�0׹έyh ؾ}{;k<_:>EiKCW.D$wNuh{#L+Mq''RmTbIX~*/Ν (+IfTunI3<F&Y ܄$HiCD@D@D@D`更(W^ 9 @A<m:xD9fc'k= Ud|;ۯCQxLMN,6VZɀ:b!p=SgXx&J {tiͼyH2$OBtAaÆ8 ^ثW/k;;|p;*s9x&vk<I*m$`nԅuqNiG0ιRp'[K4c&֜Ԅy* Ac q;<+(uo8駟V( ;0 ;=`nݍgy7oƉ'XLRJv 7;"ݒ%K"wm8 )^oEӧ6b';8b[n]䮴LDwg ݇~. wZ*ft 6{9L6 \rI N%r |I>4!w`QL(@cʕN~4a5n8'%K杉+?,I/<|ϻ9߉΍u<(ꫯqgqcDܷ4;=<y\jpEaʅ tIvVE3Bx/Q8ӦM1oß w}&Mu4W>y/A0RqnNBЯ_?[Od=i 5nz7vٲe&Mφ?wazv6-8P򠃂Q~@h֬>㔶U2%V'4 ;W^}ݗtTJZư믷p�e”t8!E@D@D@D@RG4~"M iӮ@0hgs'Hi?̗ؖx`kHUooz?cƌL*?<^{5; '`;GDS~'$^tm8~DrxIu:\AiƼy*I爀@ q7o t\R>!=\pz--db'a.(k?${-v߶D6)m:G$J7>Ɓ9g}7Ȭߦ*&Qr" " " " " " " " " " "$w\rvP1g;ӰqMIΫbŊAC`80EԩSn@+]tu]mPYtΟC" +O D+^|~zoӦ.w8CKo(4@G~-|ڔ)Sp5ׄ'pF^HvX$.3ׯDi+-k7N</ѳSn]xW Rv8`�|wa8I|6?r-hݺuIIucYu6ڵkz_K/ V^Σ9'Q6 +W3qΝ;ͼT(I]D6%) ije+JlRAƉ?x \pࠨo=xsےpyB)u4֮ЪP|ZhTyk>\[rwo\7ߞ{]v p~1a]׮] 3E{<>ȼ:'K /eڣ &.#K^{e(3=rHp2o4p)F@N8+?RDua$Xap0뭵je]{/֩Qao.n[Fٳgח3Ѧ#p�X(L[?fbGD K v3G?Yx盨M0~bͿ؁RÃ}`=\8 zZŸDm8+5NG 2c-0m\\sE@D@D@D@D@AiX5[Rect1t0h7mi:(;1LmƓfoAz:Q]8Q[_D6-#HDrpӃ|~BW^y%ns9oVq"o* A3fӄ  8kY.:'FBa8(E:)u`G;X{o!;�X&Yp!*;/XÞi޵^kEK(hN*_Gn#G~p=k,_ܞ?/￷ݚ~ϭ@1cƀmHHGci.بQg>$;iNIȴFad#zv;gqc:a^t7pqtktݺm۶>S婧?6Ny wg*Z:K6WZe E|8S ^K|4 ~pǾkZE}V|"㟉{[oͨplSW^3|͉NO_6<[%;iвeK<1yw9 &MZjGP|ωwz'QNJα̡ǓO>iE%|K \ G0^ B?3+I۱cZh尻ns]lX3,O٬M7w6XB=zt֕Vac_;37`:M?BdjժÇ[j|l8;8yMI멏e˖ٳ89~ sz˺h GWn8Qv0\^z'&>pqhʕ>SCI__󹃃@ Rr@ о}{ 6,eSqy[32.vk;{w}\ݎP?,[O8[wHF2DKR{=Jv?<:,6͘Omf7,#Al/wqGŮ(:uxuxoKL,[#6~vbcM^O[5kɟϾ^Nr9k,kKr]w;n֮-ƭyk7y'}$N|^5  J޽{'riT 'ZqtE=U0`yH2% ^ND@D@D@D@D 6c06rسŒw^x^t;~=^!9' t zh-L@:n;ŏ AQAL E1g@τ(>1+"0a$� (bE z3;=zzz~]u0fF ` z`:h+E{|Mgic~߷˴cJ«A*Lَ~ 죔AY鼇;v |z w:hcYa]*3vP?l?}wʲoE$$A0vBy:mh{QǎX:d9f,H0+U-8KkZj hK|U[ ͜0] Ha¢%_`nx6|v:tHAuI ~L$Q^ g&.vm0QM%/_0ĺߌǏO_*:<yrm­h}ƍmq)0Q$R3|Ӝ9szu6Yhn \ ֙f&.Scl9؎s%lB;{L38a-qq%LL-a%*rK{"-Z$)]oLԬY3a|0~L4&5㥓Jk_>,aœ^COڵ ֑W݃sӹsu<o&Yc ,~&Tt->R]\q?L&0&l0ĤIrYr{ Oի\kYؘk 7y&Qt({~O0ᄉj{$jժ?SĶu[mUŒ4&ʑ0a`;KI0V3E(c{^?<abAx`H&c[L1 8+2(Ä%t|o3كۚhWϘxZu,iU=�J#PN?qXB|`z K/2DV|ncߵjժ2n~P}kNHh~.j{=؇l}; >]?xtҘ1c9dN iu|οꪫGmUzfاOg<|%S3XLe>%s&+ZY]v-%6$"P>벿;GRi<8wYw'a0q, .\8nukvBQZfܸq;>q_~pl 7,|#(dÇgvڛDs.$a=pħF-d@>-{ޒ%K"zG@EioRQY6O R:}//i(mΗszsOX�٠-իWOX38믿rWetaoy0Bo4i$`DA=ҩsi!p> eFAic8&y\e+o!{xϨH0sVʕʼnw%_|Dw ژ0J%撐$:},ww$̮+a~6$l7aJ M(>oK^6.{Fw>-}I$U+q1$*0 N$.,a J/쳉ī&o&2%xC ;(fϝ۳nyn]& y|'c=«K;(~BE,e!?߼WtJ*cQڻp:c8%Ǡ=8#叐l?7KL5vUd[SٳgU)m5y= <gJ" " " " " " " " " " "ufz ̤cq><3^GD`{0ccvѭ-Z:u&>S&ZR5��@�IDATv駟Z%AT2bJ]Y+b!qlr㕵L~oX0Cws5l/uuZF$w}g ZZ0LV%?`b))JFc0»ub5Œ&r+Leues΅ "yHur|_+V>Lfܓmr&S/s5�; Jb>Ԕ~2z7/FFeUk\پG?FeJYQ=#xxguM&QҾ*['GHOOƴh裏)VV&L@޽a^xg`iU^B9=/Bi5`M0ٌ,x;aBy= Bỳ0{a}qnEO\=fix>]`^òtH7#KssxƠA`"Rc@h"y&S>L0k)'g.:mT8˓O> !-oJٻ7?u !L+D@D@p=z$}"P dblX8u}kԀ�3fƔRo"PH7;{05uS8l0^Μo|gPΏӖD& \+W;pL-`d:U粎SlgNڕ7VQ&pQ_xꩻەmi_̛ }hժ-O^%̮lYۄ%SVxZ}:RRV*=}S>l4h�v,(qo;[*[r_LdfW}[ze,]8yl#3됎cYǩh[GHe?܎%d(lDEqcYw,J@d8[niкukFٵk~ _=FQj)B\%/BdmqL/LYfQB+ԶҮ4Mh1vX <=\pӧ)PdQ#q5oyxQmN} [ʇSs  Ə^{ 7tS[V/x袋{]*e@Ӧ_:QxRZf֯]v,5N:$S 6,$mk'/m(΢ȲOd; "iAecD T?{W ϱ0 r<7f޿ =Rb;a�©m[`-"BQu"I$k3!J>F̈́CB!B|qAs|?ryg:/qBjk:羴m& UW]7hi7mذi1˥}I jl8n2LhwZ1y!E>/ NwL\L7>fbrcy8 R;ѡC2k2 Da u,t96Aĉ;I&JK% Y+:GA:u*o߾8p)!QR V+FqKerdR7—6ȴ`5 饗yځJKlgƢԶҮ(h}gL~x衇lD؆ Ą/4o={v}8޼l[VZe+[|h:,qhܸq oc֬Yx'+*8އv>䓂RءM̙a=Ɲ&[swaNpط4jԨضP6L?O3_Z6mն|GX8]עz3*"PAlFDīM6٤{Ϣz//[n6_q2ڰ0X iu`@)J02h!B%<'P&5(p)"vhoڵ Rg:.q (sapj 0 g+^M}o[GݺN8˦-^ٵ9ĨMq$" " " $`E^4?{Fً4?\.-EFz.&L/>+R1/2qe 1矏o9'yq9vP(DWQ;ùa ڧz*\=sLK8+a_~" " " " " " " " " " "ak%,e4a>ܕe&@ƌT4fDR| PO7GzZh@_IJ#k8Z}ԨQѣh".8cqc뭷.}>}:nƠ?gA2fJ+V6mN;턓O>90,0bĈ@(Qw/<x666DƩ>oLxh,e.kU)f߻woJ#w3_G_5x^zML�ѺQ"<P=*V=E Kt9x !0dȐཨK>X(�KB @q]k$#i$l~=)nÃc-E nؿsܐbp;|A8Ι5h nG'߂c?>`$3ą^ڪl8_Zh6GC>4Y- "K*7Rě�8j ^ί /{Zjx�\dHcx}u~;7,R FCaРA=;8tA$f"7bĉx'1l0 Q{nWAh"" " " " " " " " " " Y# !ȬAtn:_k SNرc7nW*L9ֳJ"PBv,Ybo`„ ?~<�m۶8߾,~ܹq(@XnA]yHSL bx @W^Qvmǧ[oOӮL䭷savQ/rQ|*ϽKcȑ#뮻W"=f͂ݫ PkE2T裏ƌ3p=N<#tR?*\}{ sť)3_ZT@PT4( AfgVvvС�힂N[n |#H ŋ-pc{̙3x8#Pv8.I �` "1HI'd7ig>ԶY- "S6 %K4H[Φ][9L!%6DX 0@ы5?^si0:gdK/^t~8$%`pcG /8NpG[n(ڌ$" F`ʕ#iGq /r)EhJD@D@D@D@D@D@D@D@D@D@N@Bq?åoO:50$L4i{7ڵk첋Q_ă7|ɓ'T~}Bi0R+|/3k4N2$0iԨQ AժUDžV@ P3<3?>8�|Ɂ! TQi/(Қ,X~>#/z GѠk zh)d+g}6xぎ1uN;M03HGݬ]qL `_~&}k<JǴӬ'�4!R sꁉCtl+)թ`uJRE@D@,' !LP>(a?LYцN[@ĥwq- ?}jD@�mf^y`vu]إuYc5{leS dX(�S16UlbF^02,u\J" " " BtF3LE.(#וLAG]J|7Yhe 6ϾL>N.hk]U/vIGu̞ | x"{`QF?mb: Sxs_I@D@D@D@D@D@D@D@D@D@D@ v.ٛoo6n#(hٲ%Zj=3(f|o'" %<ѦMd2s2͛7Dpgo2.)c~m 6G!l vZdJ" %p"W_} b(נAV@{/^{aY7#aÆ=Рu]ID ECJ:v92A5;iLYJE(fGݢUZ('_gy9]} <ʹmc_ _C<KH<,@ocN;ơ?wmD!)D@D@VPiIG@BU[({\:vE�ݻKm'"/SJa><3p֕I.b& }\>?[ܡCT^v0CbD"Â\^xh87/ԭ87}"|9`sXcIeX1y9,tiɵf`36Rʋ2sY~$q'@$AΕJAof?b@a/� dh74i$73g lۻtSr*+@dt<siIAH/6k,D7ԩjn`6'`OID@y4.s[lRu&ԵjժOՏ\]((K/:tń;u8 бgCZ)TfqJ:ҍ?^`�CC9$+MR׏&`8l3Mؽ0RAQ^x!_>3l8O/a$"P&e˖} )6}tԮ];p#PJMʀS" XnWz+nf{F,<ԩ<jd4繣V[mo=;K]<\ Rx kN@^s&M`ǁ;/D@D f|5Z ! iS`X�f� Ԗoĕ@8Eq ͽ;]{]$y[/W!q9zο矁 D1'm;ʑey"`$E!M}fu6|>TnBd`'RD@D pəsL~Kv OlkX-Y`cI3ؙ@ жvLgz7s%qwaTڃ Κ5SN)S` ?Rq} liN?D%G@BEC4ҞaVS+'dhZ,$~{A,N¬E@*@믿G| |i ,mEµ4{Æ +p$$](T tiENvR^vL;3ɓ]4ὌiCU=sUW0\B51%trK15$E_3 FɎ;D�3|%`yD ,F1UfM]^tt:swZVD = L1?FHEի=;I/=UW`;`�<xqn7;π (L.W C0<04Gb?(�q*ӧ&f 3�1X҉yt46GrH泍vl`@VYv-!PH/80aBZ+0hϚǏūj5oiӦaŊ-_бc 'AC'v@{QM|`d*Ȱ?qVtSX < S2N1mzU" "ӼP#EpcrI.vKf�c)5Jk25c|")`O['f=-ZuMe}= e9J" A~<w`ȻjѢln&Ԫ4Y=|o l{Ώګ" " " " " " " " " " "$!ҵ맟~?H|_|-fA1FcnڴiPR U$HCWE@ 1{ S ,㏀fmVLyu]mVR˟fQgN t|W7դ Py ? ڵkW}u2 N'8d`X!y BORĉQHF^jnӦMQFV˔ NG)N`> oܹ oNJ"0kHh*d_~[o<j֬N;-vm3x7s^x :8Ju._\{HØ@_}ѣa}qgo )@!($B8jc Hr'#߫)ѥ ,1|\R( } 4eAqN,\0תjT)2{Qs̴.iU"XLbv F^g ~\R3, ER4Tժeڏ@!9}6΢e|Orb<J 5i[D@ �D[( D2Gyzn (`{'qYfH-Dwen:țmnk?kY΅}z9\ QHeLPB# !B;UI/K -Y$z뭇mt4iƍcYpTӡD V7fL!f>2ϵ_Tìxɼ7oOd5XlYыdDH S@xw/4 ` 4jHWxB4<o޼@Wh?{ ԩts}"[A CN7N Bз0/sf:Q/_"{T*#g(>)~))۶m[FT)Æ'�]RҏE@J O? PW^8#%\lСC裏%ӧOp8d@83$ǎF�^z 0#>8ED@D  Y(*T* AW?`naC`dx/ƿa�./r}t\P>83gN0oFS%)J"P(x_�Xrl8Yr^yQHSԂZ9QDӂU2|^ $s*H[p5*�!x+:=s% )Q1U_jJq8řr~{0A�.hww$MqN{;\9vw%T�8&1)N>Yw4믏'׃+k "*BJ.S$!j6u␾P$$" " " " " " " " " " q$ !8Ƚ[X Ctkb>S))"QpUQG7 LA&=dE EPH`t?8:6(9͛7Gf@OVZ~4@6^ft3g?c~7Z>:!c曧؛V+}Sիښ~Ev"5Z֋^ <<mڴo:&} ڴ"S<  -3S$} 'ЀUV&2(i̟+pbcfת$"e5j >_~9u=z@׮]̼͑Δ2J?o"Ãg&>#x8ӂw,igú}p� xi4@QHdQH{SXa sJ"P$^ ફ8L|+l0|bW^R 7m (\)H65p G*@T Pؑ>2Ex{ +|VC?ߍz nlHQ fA(E!exY) X" Nsd/E*/MiD3J/HfN%/{F߆뮱[&@;.U,8~!@&f{UCgW?! %}74W? s D+qaq!ЩSğ\wYB2۰HQiqLj BL.[59;W  :F,Y$PRX ˜P+'8ڰa 7p[Zhk˚5kXD|V*Xo89{G:iF®4Er�'>9D8trQzX0ח`.*!gh3bÒhLE�KI5=PxN;. wz-�'43>Q0s_} K Q3w-GG`k#Sؑwu@4c\exj8s=z &|h+Bٳցܹs�1Z.]_cǎȑ#u[nٳ'{/=uH{�o&l |'s:@D@֒& !! '{&�!p /�~ղ?q))9ԩsd`ИB#_XGkg3:A8y)9W3!qũeo) %>)qnJ" " !a1Gve^OHmhFFFsås,$$" "1?{^aL;{-b:m&3mL;tgj"ft3%E>sy܆6#CX* |:o3M~fg*,(^lՍS1"V@҆MJw6%<a6֔ೂPeh" " " " " " " " " " & !LN`Ŋf3Et0OW})T^@e-*(JbKo9p"VĬhLJtU�p(L (18}E"i r|k; dS3Q }4|aa/cٺ)1cR<ШtpU0@n3gœwZG y0f+tc?MfN>_aҸqG}Jʷ,?|:v΋zN WѰ)�=׉:&: �|sœ֖.o)6t@…ڵ yP+<yrB�jj<2Fk8k89e N0͆NG8" L`$Y_M7e0m瞰9\<`?q6Yh[nqc)@P3ͱ~RsvDC~G Dy�NTH(6B;6+ӦK?1^^/snsP4en8lc[hQiMvz2%k%D@D Vt"'zGjj#mK`4cXN.#McFe͹N.> Lkv`'A[͉RERIo6c޿cn%p,J{W9qT)o2"!_{=?i-98 {-+e ,)onʦ(dr6W,1  Afs4p'Âu˿ٝ՚t$@$Kfڥs4yӮ B`ɒ%M z%EK:{=R،B^L՗^T/#U\`@C:EL>@;xRoÒ5 6De A #zai>9C18xQ8FW!9(I֥b2$�$Dٽ\⌜dQ'E!}/~)4d/OG_y;}|Sgyo 4dZk_mY%CF2ҥJwyak`Q⋁} 7q>^3K1cƘPpcnݺ5k/i-[ (򮩐O:5}Q twN:⏝;wp }0t(K!{w`⢰PH" q {n<"QD$Y^b~@<O Y!uL�t萺Nbz7JAwO֊@3JHzQ33yޏss~?l 9`P*/AT9/Mǰ8oq&6^xbq Q+c_U/˗;QH C2XiE"h5kDLDR L+3ڦڈď�/TldnT%큒5r :p6L1GA*D�|_q9G q/ w@氯8@#هyr*8@[Uñ*:?}ldSj8\1,ꦚJ`_s nm,Yg@ō1.6N;LH J" " " " " " " " " " "P$Yu$bŊ`f~/L[d@N9'f)/S$2U\I7fiR7LU˞r�3K[2'Ùtj'ZM8) |FkVI@Sa.{?_NG s?UMZ+�E`xg{pNǛa É16zcN1ÆO?X?׿3Ri?T0vli[黨{(%|> /4̾),<)}~$~Ⱦ#й}I9b4"> <;iPɬg9<ĉ�O͆o&}D/ (ikF|R�6oKPr샣,R,}ONn9m۶ 21)3CX W/,F" "RB~TdVft C q3>Ac$}go p R8Pg㘿Ϝ;:_r\8l/9Oq?9F!\( r2~#v^`/p^N岟`[g 5Fδ*%tΉjH̒Qb^ҋCC20ao >Ӵ/?s[,{ hq /TP " " Im^ϗM܏xs?n.!0_}x1o.ö`p_ex۹-ZϻLH>SQ ;=vm綶˖:QH33E"L6f͊gDQID@D@D@D@D@D@D@D@D@D@A@B٠}ƞ�'n\Xp/ ;b}bS7M"qH3S,Uw[£ɟ9,\4d22\*ӸYzG_e-Ay*Q/DKNӡ0bJ"  <'\;|>9Q qwiYϼ^^NyϾ_%pft(|ȝFS7 4T2LѣѨQ0c,ukN/4p!M7>QJ8o₾o ; ?ܧ$-`ٯ}όh韩}2_/x|'CC|"9HW\azX8:H"O.x gO\@>*?`܅8[om˘m2ۼ'C)@AqKy.ùY뽦+? t<8\kW@fe" ! pQ󇀄 \Uj \rt_ݷ_"s� pңF@{t�9wv s~?"@Q?Yr8<<q||t!'{ۛ|ἀW%YR�49<7b99\qF)^ئ �8>e1OdP.- /PhZE@HG{d*"ձGb:G65_܆bLD@D@D 'hqyx/%U-@œ6,`c C3m%W&9CA="?M"dD ,v^۹s! Nrx'ؽ~GG _|j !gϱL;;H>SID@D@D@D@D@D@D@D@D@D@*C@Bߊ@pbŜ={)|6^zishYSNynҽ8%'cJ 9qLpIfn%רQ#eI@)m9Jw_\M!EoLɏ߳d^t-;bhD T%PV-'bQXF~<J" 'y8^Peذ/~4 .{=/{7A292.,K[{K?}Q_f 7.vOeyQa&.2dCJ"P rC'd׍sL 4)mk~qdS`i-F`?D}Ky2/󽢴/CX} 3 _T&/9%Fr39p~KI�p57wd _~ W r6NW�{q瞙?*& *~E^\KGE}}$E!}bww$?&Ke{wg/~'y?Srm-23}*G/ g 'ʵR b "P>,\m=kN)oZ9zr`�7ƍ^6Mw/N?G!ǹ999qLq-8Yrߏc_XO/3rY96?'?{{?Kd 0NM𢚾g�T敓iVG={6\jc!P$h|,Pِ(nMM\GYlne;rɟMF훲mDID@D@bK6 '۟12Ar7mRvS2˰ѪUۘH¢u~<E$BI OY75U H93o…iS,-DFo%KKަ v#3=" :^}ՉB  88{wcF $!i_ew v͛,)Is%H ӡmD rʁ/86Zqbɓ~bai.auQe3 +'b_~}l&Lvm~~7y$ oK}MP|@3[\<ܿ$ A7 ~xO>W\1=//_5LR_G{'~NI9 7 J" /3vyT`|�vJ۪pzM`\R"P>~ėO|_^ /ٗ$/ߧpZߴgįg ߏ ?#p>,}~GI*BbtD'*{FDdtޥˍ7:cnѸ;W7eJ~!(`vNsgw~|%3G?&}56La0z鸹YSg =V1gp=Ncͅ|OP| @0 AÙPrE@B"_N1n=0}zş8!guDy�PPD ԿGesɜ?s~˅ k qD918 eoЖeLޮ?B_$y�?7mr<rS~N yed&L@ �^99r;-oP$"9~K$>Z,"My1r'^Y<@БcB, >r9Y366us̒$XD@D@�v XB䲷3g{ {d`C'uxB2QTW_~ok&Nߞ=wm\a-?exc.SqSȑtz; =s Cc`+/IHw;j6ω-" " " " " " " " " Q% !Ȩ9;(8t .].8œġ/ίSI5: }@۶U?FD@*KNa^*7^wuy4gdceyQ];'ژI!>{.)J5LrHj?&Q sSυ?4>|<x%3_;[DmG}4n9y';�>ȉSzϣ@Vt5 AÑ8UmW΍3g„*Wm:}�ۻU+X0G$*iޱ:wvM5]F%kjx-sJ" $!3Lւ;8E'/əbwDU/HG-UѲ_ adzQ)" " q$.I'<IC<60p.^|( 9n,x͠($!M3R_~D!9?BٳaYuH1HΛ+nl RTeE@D@D@D@D@D@D@D@D@D@2L@&݉@*琲@џMt1ԩYgun�'|?E2ѣj렣@6 @b gh"+4PsД)�ۖ/wB^-[\y%,Zs$f=Lc d-" #0g@!0\*d� ;q lefSi��@�IDATTO?č7hV ՑΪ2ߣoݍn-з/pjFD@D@D fV&Lp}87̔ <;tB|^1_˝S(MPID@ cǻy3ُf{5r cd4a.j@|KNIs91<n#6u~~=QV\ً>Ҏj>qj⍴e64wsn]J" " " 'q΃ i3~G;#yƉ lFj ͽz?E!sW٢E4gI03بO5k0$O Xm馫!w`fp-+ğ `kQF�?<ʓCSh?ϓ %UNH?\x!p_;QD@"IWXWI@_]رc 5 On8;T&>p;"O8tm@@S|a4S 3o={V݁u &n!`6ڨ»E@D@D@D v\@߸KR& >}If/\  zu'Iz NJ)D )@\ ,\_޺^qm7꧟ƭejOPL1i\).~�cE!\~{ :B-ߖ-*^6RgxpI1)^S}7 /|]C;1cܘG8?֫>X>dz:x7`νz'W왂r|"!o7h@w C278-āZ Kj1Ǹ= =j?"M4H�$8Qs5�' e<g߾�Ś8Iہ/?a1OD,])%*s /�to-;>�:rhth7ܐ"Pw=:dW�kAIDƍh+.rc٭[7G8J#@\ BsP/�t5E oE% {oHK!^|G`,__[5e;dn;'֮ *y};6[ԿW-B9ڙg H%9YG;O>'`xG&sAa"Iq& QyV LoI(4 Lqe?)bߠ˼^BUUR^D@D@D ZVS<s̺fZ�PQv?S]]\/Y;H3f� wȢ<3h!LOD@D@D@D@D@D@D@D@D@@>'q&@-N~>Iq_9$rKƌ<d LV" !:04Ȣ xhs/&M"" "P}4o^_h[0_~82x}=0pYg`ak Q}F)RP{e/p.w (SNʊ@F PtoN >$D{u~ىBN 0_z):9}{`\6}D@D vI"Q<]g^ z: 8(Iٳ]Isz w\- E")QCŁ8,fQ,|+M"~%y=J, v 3|sgg{=&N̴;mǏ8َx"p@Ӧŵ|"31̃ ~ߨjQV�f4T@X+a)S<')@!c7:__)T;4:uj\7q(d^�6(?Z@in6jJR߉@2<s8Hc1V.%úu^suMwN@9.УGZ62:1rW2]*Fg>}wݻWl?qmMl'nዚR йʕ8Z",U^D O }+OOUedPe+t zk`̘AS�c>&{<LJ&&�^j+'jIaK:xt>rU'=}V2=:Kc$Q"@,%.YlAj: B&g B{_S r5 ^4H{Ò",<\^hu[( ڰ /+j^Zz CsRDP`@|>9R~AQ>|&Q' e ~xa {N %3y05i!) nYc4#" " " " " " " " " yG@BywJT(X8sz8E->8pi-jt�:`'dI6+ND@~C_T#H&0z4ho"{YΉ:}xrotТ 嬫 @'x97�kgbG$ss.8a p=/ 8<`:AD _}+_΄+{?8Cܹ~M~L最_y9MrCsQLP) 3'Oڶ9sM]_ܲe@27͞ ̜D"iG@H^ *Ff̀Wv_?yoM['8o*{OWՁ-t珙R"<[ڷ@e|ओ*h m1ך5h0j:,3ݲ߮J<wUuk۴vۭ3 :P[E@D@D@D@D@D@D@D@D@E@B:_m'# p%(\:W/g$7qb:[64;@gk.BZR55 ,^ l)0t(pk~5"/y"'�٭p{KүǤI@�Ő6<iK9., 4d>^IDl'xBb…T7t2ص4Oԭ \wp� D@DUY} H2 QQt1NP1>*| <s\ )QiԿىVVrA8Ѫj+�3 SsPg "?P$s,qm0;P:ğOZ`>_|س6{\) ..3E kV-_ q}Iਣw|3m:u_O <0G� tU �>3#i  AQȽreΣ$" " " " " " " " " "P$Yu<8|` !_ V%Mh8+pY9?�]�,ǎuY9v*" $0|8pO?:AUڤC0# z(p.hP;z+WիWu819.!0x0л7P$LocfGvÔcF9s335ovw5�=4kz+pAyS=UDD jg 32;nN,裋sȋq㊯'ATy;@Ql{sR:;{KԎ#n jP u\O0$!<MHR ys ,Ir 1g"ǐȒ}{ 4pܤc&2S`�Ĉ�'fg]cԸ 6ψ$1R<P駁A)Scʵ"p ~:eڭλ&1֯E@D@D@D@D@D@D@D@D@Dl,�9o' ONϜHc('F>Hp h֨" @ tP|Bh5/7=cp@Zf}lwoֈ@ q9g0w^R*J4 Hz9Ono"g⩧n wsuvaptZNAg9~H{p<q�`VJD }:B~d #2"U6ؠx={ts\DG_ 0qD\ZvT%UI;Ǣ8vmZV;wॗ jC?/E!" �T)z{Yԉ;~Ld/=kލR,,)HfJ" " " "P((uBq\JW_9f0#1+ŋw  l!pmչNq9CaHM!�\&K%]iO"O˗ tˁgzXV-`=+A݁NW^;꧚@�#6R k,'@>}.Xg+5XDF.}@Љy\]'@'ˋ.W`ÜRlgjݺum&!rt19Pi9dsڊL`pk5E _ܲF<1)suGm8bTg(xQn"ʭPEhDCD Lvrx=Ϥ~lmUjqH/<̀;~BqcX%'Jrɀ~l}e(D|fd�w^{ h۶)f>OA9Z)>vfp4ओ}~|Z[Іe]7tǀku-Z�ۻL:u*wlZD@D@D@D@D@D@D@D@D@ @Dy 4" �s.s뮛DcƸ R!լ t[Vt8YAG`4fZE�KA6NQQ7(N-R[D@DY,6".=g ?GMm`#=v_|oVPRbEdf�j``�1" " " G,&�O<v\IP\#: ~{k VD@U@:1|"!ЪFJ#@E2m>eCq.8gfnW/]^ Y2PϜ<;qXy%6>Fd�rr{d�1]ÆI�gxE`͜ᥗ윜ƃ廆Rqkw~ P&yp;cҟy}ZKD@D@D@D@D@D@D@D@D@D@J'P&F f;fF3=@Ν+|%mӱ .D@D 3Hu|S>hO?H+pP׷-"},HEϒZ+ @1>ӽ?^8rU]v`OQ s7t̛" " " 1&sn7 kNMQ|�S ǫj@~xvN]SDZp x$"P18! P,Y>p�;n-s{|=9@"QrO>]=&8/iS}X' ˹vb-]N;&$Z/" " " $/s:C@~]ybooK`sq?} L쳙.5 }c0O# w<ڗ]q $Fz% Ht>]3  ԯ_` \1 ݤȑqk#"uxZIԩH3i2ID@Ob L͛RE@~sFp%nl„1eu]}-akF[oUQ"�HtD@D@D@D jx`5DZZ}!Ыpn~RID _yj$_jz@ld8"L`=D[4 $mbt΅:Aɏ?h NOD@6Ϳr ulGbEo w[O"(�#;t�~I7kV֛oD6h^~T3nݶý7 w d}8͍S 2ЩP <0` #k/" " " " " " " " " "/5F*N7g ̚_vߟ~Y�E55rſ' =  PG�tG hd: 2PA`tࠃ&vj\$" "=tb#aD@3cq> J!/g-ZS% `J1͋_~?~|%G>1:^_}3Q`] UD@D@D |5nn$t*T&@F<dU+=($ j@UxAh@ID} tFՖ|&@Ν]\ xƃ⌴XXo='©f>2ͼy�mp}>�(97 is۞BDT< ]mX9v+1WωAb&�mW}hhxi'Rؿ?ptW�={SJ�rni|`l`-]׮�kQID@D@D@D@D@D@D@D@D@ /R&t)p@v�#Q}!p5UN91"C،hFq%5#uqF=_fv<:*"<|.P4¾zhq,Qͫ�ڶu￿Y.[ 7pCUW)ǻ́`BcH5,%yDE%wO> ԩ~SՕ4/4!Hb}NӦ�EH$" $pNk}3WKrO@B?Aa#P(xC�$EӍkrnbGvJM� N,NW/`$YWZ/" " "M}-[lu`uq fͪ~ygl8gG8dl8*z6y:t`0য়\�b㤯!`@ID@D@D@D@D@D@D@D@D@ ɓ(@ٮ=<򈛬Rf ,Y&k/B!>{,ЭfOD H]O.~8P @'B֢˟u" "W42l<SD =V\2Y2[Ι3 u]M])#ڷo6x֯_O;w4@uC5(,?8*qi\Y4<jpin ," >DSrIB? |U.kcxdP'�˦0 qh BqNrI~�:=hCy8I=(d�E&d-q ek;[w j'Ov휐;8CRͼtફ)S`+Ǵ^=꫁mqv4>/E@D@D@D@D@D@D@D@D@D lUI ҥy 9F"Q'jĉ.Ws{NNQX#|3E@ � i}!@-=?Q>ܕUk>eAD@CB$J`Bࠃc&t.0e̺w~ [oH($]|10cЧ=$ 5ZD@D@D >�C'RRu)TBl? N+\z% aGE$nLrڴj%q'@;r\{-�)`-Z8A y^ Ə8С�E)HԷ/kmlw}, ;MOD@D@D@O{Vݍ]wm6=f#t jb�z75:8]vFm `N?#~ٲ%ESC" " " " " " " " " "V$E`$Ħ34{QhwYƎv `BIthhdrN/' t_Rm �( � %>lYVXGA#D 9`=g^~es|DՋO&ЦMs8 \r JO;.wNO>}QJ" " " "O8׾^Q҂O*eZlɒ"!}+_YJIv!$!ٲVdm6޹w;3wys,3ss|ѤI ˗/8O6Jп/M}W_E@OZ|^P!eD(m;p^}&T6O}jՀO(zC;ȕ+ڵأ`:5kyh�1 $?Wi'n�^z XrGD@D@D@D ?O> F.'6TǁsZfU7Һeφ B^ڷ9F4;Ɖ@1 l]t\|9Z:SB6z4!+a:\D@HYHS @/цҪR%?Jv+" "P\GLI.{6h6ֳgOm֢{>%}݇ C +S� 6 5Ci%H6<tPxk֭Ci/  y$z$E)LUV_"$i'rA9_ N;aШUs>�S'_H" .ް T~p*g]lS~[ou@x=` fzS?o[T4jVЂ>/~{c-|Ĵid47>.\ y0UYuCD@D@D@D@D@D@D@D@D@ 5 r߰aȑgEK˗F'\M)l-0v,ا,]Z*P" YJ`DӲv K/-椼; x^ʫV" " % @5JPx 3-7>vrHKZmVW_}5nv^:i3aN%" " " K`c m3(W.sYg=z6w7)CLjd7:WAYgW9'kfW[H6&O;m7ߞBC" Ls@Ѯ]~�,()B{_ yg?h._쇒d3vz8ݳ޽{6#Ij9>Z�}fLju*< Y\+ ;wXN[Æ|H[D'pY ɪ]劀@jH25UK)1ءeG.d]SmG:˺  5֬V@* Ш%J+7/sɎO;@QAID@D <(I! OR()>}.n=ڟC[èn&JRj^>|m)z뭉.Z兔.�}7p-@־|Hfd�_8> A`J ,\Xp>hlm@f8X`&kdT/ҁo 2SoKdxA`J`8cG_p4`m\s LX xe?mPzhAW?%$<L~$^-J}Ӧ_лJ3TigO=Poӡ9I3c+Vvnb\ԭRE@D@D@D@D@D@D@D@D@D $l*PlU+?bpQ(ؔRK9޸wLC}Hѣk3$@ x#ޑ{}*~_eP=\= ufF_ EN]�w t_*6իWAY=*T`wc"(x-H=y/(v ANΊ7D@D #{uRP(>ի}ۍZ�Fњ]}A◞#wh0�>`0/E-9�⋁# 6 " " " ANQ0d+FmƌN=NUWg8as)Ҫ<_gڵ K{9sWJdd2R'0s&p'\L)Sԛ :8餬zN@E7_m9r0ݶ3}TIRMs̸.^P֦jZq%yzBt5ZD￁m\rIϘ1>,xRJ\p8#qWԩJAc>*W:>" " " B੧v�9'vCX套ˁʿ_[D@D 7�`~jd$YTI nv⡇-�K헺v$muFX"̱5׫V>>_D9x>ItTȑ�P̌� 2yN2/_fd}=egq%|Ϟ(Rx_M Ԫ{C�?ΚU$ QNsaCJ̙aʣQӀ44:4 Y-FM"q#dRԬi! D 5gR&Ө*U|'< AIQSD@D  ᅲd Lڝ]o€^p("<Sp-ؕRF`+St<x0># 2$ep`i2K yS+E@D@D S;0n}mCRt{Ro̘yUD@" p>akq[^2� ?@8~g7q @Ŋh/c~Fw ;6z~[ז0cUD@D@D�x Gllj'hov +S`Ф6mĉɯS5�)!�W\k8Vr݊^yX 80Y3w3]D@D@D@D@D@D@D@D@D >r񯿀s#hq0~<Y4ԩJMN4�HJ" "hӧ7`5]ty39v L&" E`B4c\fL- M[SoСC8v|h-4h`DǍ?$66n <$Чн;9q%H63y.]⫉LltwP\4zm�uby*a'@!ȿ_RA`bओv`b@E ;X!էRٲ;'`|ᇁUO8<XYT@tBߴ ҷ}ʔ)^l J)'y'�.�h 7.MPiL$>x%N̰}b7;#fw]daP1EuBD@D@D@D@D@D@D@D@D  l}R�MH2m~;N+.7-xϞMU1SQ<3lABW')ka?|41Ǝ;O>Wr-&p:._ڷٍd :^LvuE*moDZ"^&e,M2]4>,yUJo �O? ԯA&ޑ UR%)8c`=}:H7Z⫛VMӽ(NGC0֮*T*F#֠5k֘mꪫ]u.\b~s=MhKj}ؼZ/\ _L[osX|"j|駹<i{`(_9ޚ筥}/_%XeD<{o=-^z8֞w_+d#aj֬:9=6-8Xsd%z" " "jtRlh(nl w>]y27DlI:%cΠr?h#$@m#%BP& V "W^M6W^tiC4 {EH SK\|9_@s� C /D[*2>+iZjy"^@[@&%nt/j} {4dT^-ZȽ#Os5z=mm^"M_/J{kw) 49眃L88\1о;`ɫ"+͛ JxbR~&:udìYRtTd' AfyϨ^/I#,u3!?0zyX*SL{Agq.*L8AYga޳-ѣu`ԩSݶ+bola1+1$.3QmSy k&J%fYfqq"m&N܄MV`/zEHuZYej5_|E4u%@Fժq$HpYXކL-H2mjX}5j[%݋d$) 2a:[v$VEl}6~ @-[c:6dnܜC g ŚZzo b)o>(<Lm/D6{1`#"u'-E/{> rl@R2"u%#ώ#p;0Gǿۉ<~ڶTvXumkm ߜd֭1yds &:A^ ŋ/&]ckz"`ؐ*Ā E:`瓱3�3f�<7be2uUBYv⳼er'@QCN0a60{-%*w9h/ܒ$sPŦht/IvLw8T{``6K%1r9{oU\BPc[%" " Gk H#G[nn>r_}瘑8.k-o>t΅DNQ:wމ^z-mTJ�A ЛR4i&X.;f͚h+S805XD@D@D@D@D@D@D@D@BB@B!9QjftQh{=�or'C[С+NtB'c_,љe˖ΈۙV\ׯo"|EѦ{<* a޽{֗_~y0'#<RK/MaJ2…ˬFv<'xbn^+x.HfT$/]Mt89Bɾ,n-[b41%Bu_[ҽ(Hr3>i,9eT(Mv(\_nٳ1tP 0�;#E>;za"sPœ`zc=\x汘)8}/+VghͱEh ."lذyLP>}G!>ґ%ZU3_{r; ,UV ]LA .pt[>WxG183oFժUϏrbcA)y;fAb˃e\>ē}}ΟV=J" "�E~,I䓁3aX=uJJDB\Z_�Ȳes,!To's~Δt8WE"1u8jNr ؼ7LhRf/ Ӛuk_|1֭[l c['" " DA (*þ]-K>u|;ܐ;EA7Z{E p)pdclϫG.6jN38R%l/]jɯ�ڙ9=� _jp/a[hI k*~WŌ;<T\]v;OD@D@D@D@D@D@D@D@BKD |l Мs;7 o^eVN9Korq2R &FB(pٖ(F{ڽ _݂`(@lu Rr">4zl߾}ۑߋ!D@B`$bE So)ooo CtVPPX%0lv0f AuFZhmp^]˥_kբ0kQ"t/Ι9.jJC}PX.=gW^ A8tASjon3�o֭[W;g�cZj1*,7pc+H[m?pZ t<a<&N?QիW駟ZX̘_+Vu| rGy碶0SdB`,,YgbtDwxB*DD@D@BOkwL?ͱ]ΝvrEgðV.?lSJL `qlp ź'�(kN4ql 6x)J7|δm(0P5"!6M? !'<oOvҥ|dxlvӅ!" " $TQ|2c5Q~+\/iJLh{$ԩ3H;�OG9:dX1t;قDfMT1&ϘJ} $%-φ+M�W]�M��@�IDAT%ZHyX࣏hW!5,D?󉌴Qdԗȶ,3=1Z[) :j3,sV-v@[1iժN:餜oذ<>C_|0(:@ q� }Hqe-t5h^5eEᜑJ*Ef뮹,n+_D>(7"nUF" 9I~ʽNt>SѮ];i)N5m-qe*`ʔ)Α~Ŋ&zB\kA 7m;VY-$1 Ȍ;77;#w}ו㮻¾f!y嗃iƉU\&1-]}_&5{ƃ>/v4k2P�&N8̚U"GVPvhTصaA׊CMufܹ SN7--51KkӧOw]<Θ{u F Eb]+ /hxFa/'i~P(V vO:%t'O ?ֽD N5ko߾VZN Q8`զ(-x'{̙3]e̘1PآE 33k0Keп"`2HGeO1"PBvr"Gk{=s͹z[9bqne>b$Y)ycxzLDѱf-矻͑D!Ot¹`(emsz"b${{Q<2oc 8Fda;pHΛ6Y;̙W,9٦=mD+W.Skas,U3f�sE-D?f<Hf}Q#(ĕWD |3&uV!yu3s'F?s c&x0o^6~DRL-%4 do& N27n a0Mz8yuЖĢEe#i5l P ܔf7k&*R&yT<0+;=Eb 2SO/,sڭ[잆ޚ><4m9>wEaRl3J Y]"sy{c�s0G)loϱaÆ9Wo͞=D3?r>RD@D@D@D@D@D@D@D@D@(- KmxD YfZ<o޼dբrKJ<om<{g{vL3s <3?x}ƌ_~31ENKMi{fBļ383j;<Zqs=9M[=[v >3Ho,qFkӽ1,tNyoLų K.qmo‹<*s/\c}xqW_-<!C<bg ]LXrJτ6Y~mȕÄ#zy^zc>قLN1l߾+0g xfdwe Rm&ܖS>cڵk+{w-9c޽{H9[%{3#9Vڶ.^+L]Vtx<ry3vnDf늉Ѹ|O+ZQص,�I:4z EZ^DC}M}.[t�#Gt/2x3uϜyrƔvZEo71;\`"n { J9~ڗ I+e Ҫmj<\B9Ή{mt._iyEb%ޏ8O<)O{䳘Es]a,lFޣ~ccLeK܆m޼sqǽ2"ű92ϜT=A,)\~<1m}ծ]3oΜ9ގ;Y7oXm~b8`;ǏQ1G6T͠A5࿯@Xs]4P R˂IB@Z=B非F^wk}oya!{XTz=7=ڢV@* |gBQu@z:*W~v-[ Ƌ6 br< n9_J~!NM/\gsžE@y;{ /xޚ5onp(mo9N~\gʻ>޼6g+z\ n>}\9L]uA; ԫd"sw4NO{3L<Էf6`@C7^nޮ)ҿ+_g!*U<%u5j6mL3>سg>,ti* =^`o~!UT,@@`hB P/R%'@'J<}Rڒ>Ǝ=zo=4 6:PSpɒ%9yM5(.&_~n[PhXAyСC$+*r`%oٲen;EXs("SkWŹhE"{Ld6.HsEvL裏|`M,<l,A[f9tL+s+T>RЎH<&Mr(nrto>ҥK>ߝ֓J"9\஫472swXеnsY.j*Z1X2)$uAvZesEh" nްa9hF�0kҤ}1>aDB+)ֽ)E1f?D݋]eP=)}.F8b5&cCi W9n+_{s2<X)r{OXb<yrjf͚ <1#E%yS^!ȼ&Lp 486o<RkamA$XzuǠ%B H!}t~npcZfT@FF1cEF|Akv At*&1 MY3#=PY"'ӳ1";k"XWq,3]!;a\:Tyb#TwjE PoLk8HQ4shSv n F9-ZNiԹ>z^~@uUoG?.[jgg`A̻><ymvk12 )Y8mxbEڗu5n>L"XMzس {)x}Yg{YsD>8a.hGo1%E9|R PHLpOsݳze/&^[z:{g9'Nҫ@ v%H{oy&vۥ}S *lr &D`,zx`f9y9�|0Bc6,TN[vM̽>m_3R1C6XaW-<mla<_[Ľ 2 q-4֬YyloQ_|j|A^}UlذGyd&w}&BN: l7x ̱m{&[`r2S1Gpw0|ptmgyfm`o0Qw |{$a0yx\sرcA_%scl,Bۮ"&M;3wmZ:Av]+tڵ+'|;vtM6ȣW^xꩧ`F0cXkE<ײxeu{KQ&≿mG[zTw7Yu6-s!t/_~Ny_2A>kL܇Lލ)(D݋x}٧!L$ݞWD \cOc֜ӑ6o.*Wv9m@ ̘t \s гg䝓1!lX7^79] fXZ{z 3E֭{M)< 4X=z`РA<, y//v<ld\r{wՂ&1e̟?u-H6GTfM{$ Rk1uǜ9s\9gZiYo :>cK�'+,\cAc6fO" " "F,=ak}e枀a_G&iZZ*VKzU*JC3kW_]MQ"P*fCvZFXP0 X`XЌ[7 B96EԹg曰ysnjԀͧ'�Mkiyn9fYfw̙iӦ9ep>ʱ݌eGfAj "`n5hv 6p;y_bε . T+W^:-]ؐޚ⯿ СC]7N9�a]ge>C!Q*m5q.̃p㍰g%#:ɘY?:t|Mz�&8n8gIګ)$+@z6 2[7"yZHpZ y4(O?9H/n/c-Gq,ʰ9)_~M4ᮜ8t4Yr}&IR̢ Ex ZD1`{ N~&"Ŵ(iJm)r vlR$"l"6zKL4`aP7EnC!(�pw㨣|~x E�"E?69҉Jr"v An3kh$"� M'=m~Ah׊X ywԝZAcN;4^31E`y_>`i$Tص"kYaek_حk8@27%{w0QE gC1kXbQX1aA!{Q;M>-Zr@1b3>AҊ�VkU(KЖY\mԵjUW]8'uKm'(@*|fޱw%cu<`5|wROSP#3h޶g: @;iDf>7&:сN тĪjժf۵ (T1ul2s.и?_k~fƢ5j` 7l"`*?'#2<bƳ.{0_u`{qG<gM ;OMZNya[ϰ^;"`qC]uAI�͛(2~ g{v@ NA/.:7!~3ueF P0؟m؏{( ?>k^bfj?`%bR[eҴq-fiszʠJls[<lv#ۡ" " " Lg7}o abR Ξ+-.gSb@m&P=H :z0֌g?;߻W+:<O'OYuDQ wK1Wwg.-oO>_6`˗w~|Zy&MA9D@D@D@D@D@D@D@D@D@%`&rJ" | d5}[.�' ]0N^z \|j:\Vm槟~ &nG(s/*wn9q(,/Rdx *#Rz #[lu� ut1-\UTq%Θ1-Ulr]|p})h81F{饗@1 6_wtاDȁ4ٳg[Þ`;:wJqмiݺu@1/Y2dˏi`u\+s`%ҩr„ fj}>EC6|F =U]+Jz-+bGB> pX~O*@j Gْq/<"m)\|ꩧkoaN<mrJr~O< A&JL=3cyI N^X5jki3z]X"&Y4�ΡlͿZy,uMb=/^le.#<Ν;@#YLb-phKrQO۶m/{=׮#F7{lslΉi<HEkL5 rL)5c6D{(:d?]яzy23wh<kXqGaka_ߴX;VԿ#>:_=y4U0HڅA ;TJt\0nDP)ZD[L";¢2)~GhӲy~ l:_= &^;l1hٲesY~eKAX:sʈ|6ΠdEY^6uݞa(M#>\G RA[nj`=^/6.)h@߾~s6{C=u?ul<ǹ@@<sgCҸyËAn|Cb</Ml sE]͚5sϏM7݄l!8" " " " " " " " " #uQ"|޽a$|ډaTXtAqBt믿r*׭… 2aD5k~{[:qBA ӿ^r0r̙3q 78˗cUfWˠnu7mG8 E^ven#j#h* -%X1G2RAD-%.Ұ"`{FKBRr&Rg*u$vRHjժxg@yc.n`4r|9p}F,#@`j֫Ό*R< "x%wH, o*eXHRAm*ZkYAj{~<-#aoIb|0@_~ILy*EBJ]S݋8^Խ{wsYv٘K'>PXMcְ|S YD l85bn1~<3v"dhy9ظs2^X9h@OGί [vsVXtw~iѢEy}~W'ܵk|GX2t| %FSY`02֚vaj#^fMX um)(sai`;(d^@9s6OĝZ!Q7?䣏Gˡma&`& J"~WhbJ"hKE!F(@% kˏ}qi a S #%]0} '4)ϸWrÂ-$m }x9]wog 9ўӂib7 p3 cّ1@|"mvs5DD@D@D |cavsE u =8Mf`VZf#G_wrofo} X9^r٪ЎI&UJFCrsOs ;Mdb0Bhobы suSNq$" " " " " " " " "DԦOIJJ+=L{SM<邏Z�n ^ݫ *z&qn/21gyaxf n۝w>0aaogn9yk^Ŋݶ>gN12QE5׸./k۶Wn]W^$}[l<gτ'Y7mc:u<?a_عsgrʞ-m&X=τ){69H&趵C[qEKf`UTɫYgF.ԩS1<nرn߅^67"z+VpM\b7>\qo$ll"иuywsp]+Ly<]x Z0ֵ_~#G&^wqG sop_xTص"kYP^KF_=o=Wc"\{ ? wqb._N<ϛ6X %vڶsE͛7/p{S{&hSF7%g"9ŚXvm7iA`Ff{ᅴh!"`vyއp>y>K0坓6]I!}EZwsb&Y�Zy,+tjUT~y+>x +hvewsVV"&;"6?S ?(;8x+m7ngª3i"n3x41gKަfr<o-3- NRI.-ދ/F%E@=G׊_履~45k^ [fmƇעEy'xnyXgG0]GS%j'yfOYB\4S8̎d|?)hg z{oL3щIfo 1czzf<=;mu}ufwV't{5p@;ݢ" " "?߷jU- ֡60߃ҷc 6eOj=zxfFn6{kY-[ Ƙ<̙{֞du.j4Z#JKrC\&ڞ'&o m>3=&SgC@f0s%9^$eD}HӧS ?|oɓ݂$|?0#.tqZϞ=Zjy{v"*CAAQd10N �R ?:hO+sʊ|]`k:t~{M6|[%~;z;n){h;3 ? ̝;7'FS2 2KQF9C{ӧOϵL1 b-˩]JSsb},W^=Ϣ;#<#YOvm^qީ,)`N#GK.[nۯ"K";x oc^+yNBA׊~^+(JX$q\~Gdb&l#Gy;ϊy(Zp}(1}KQ_};WE? 7s}C&TDU0{|Р z+N=_b!hc`kdž]tQmSv/bog;h<z9D5 -齨}n {g66o{-}~C= [~Fgj%#W_Y xD/K3Uvء9ub'8ӲeKBRp\<X,gvs4k9_�'2@IADm=zGG<` k{sԱ)Ѭ'V{'P8 M1 Y9:[GXms0]d9yOCclyťx^4P:FC8/[P@=BjO-<gůs%{1'IZ,Kr Σ=#ϫ wRb*wD д̋ :bwlx5Sw0@7'h#ʀ +hQɩ_ ba fKްa 1Fo/2$Kl0yT<-P{fg�S#X{洋knk�9;0[hm֭[HaGFw2s??t4'{wEo}… zM0(o:Ji@=m,vJn3y=:F2vO߾5j/rwPD@D@D@D@D@D@D@D@D@F`+dF ImżbBS!YF/F�h*�d@wg4�>8 a`}fB�̐ -jo 漍?s^ϗό`ή\3ŋ}^seHkժUh] /0Gg/5aBǖ=;6q&.B?EvD#sYz5L sAon�˖-s0ZM �--(= *NE +<С`?3H+֮]Z&cKYw>]RmZQkYF( nXf >&؉~3ׅ;$9|+BpqcXcދ6l�O룎uKz̔DcE س(PBV.; h6,x>]xᅘ1c_ :Dvpi裏g×͙+<οq|I7gN0fn.TX8·Y*~aoJlM9ydK4-NFu6mvr@=B$Wk`Ο6+b9Y8f̀~l^)Cؒ8ʔld2&j`FO>IZ5*XҞ4~7X "8S`k QN. k`AB~shͻٞdro�dƍsǓ{ify&N{^tOZjPDΫsPD%g�&N?Du#EwuP,X2jqرONС+W,oq#W>zNjS'v\]a{MNyf$ �UE�E uxw`kٲe'p}0C/0n8IhFdG`(aˆiZ*"݂KӁ>}NX75l&н;@!hIoN25;l7z4Sl ) UO}ǺF=&~?h+ZgΜ&Mॗ^,R4z{֬Yh޼  -ќ1ӷjY0L;^#"Pr,9CnL{!}v*~'Ovb{.◜GrCI`di _y8L( ~0%_$bŊDrD lJN"kr?�ND 7(^�hH~o8k<N\7(d{'n," " "P4|Α`㦛n?bLS�E9~;\?[zUbՂpו^p3t ~;Z ̐Ω" " " " " " " " " I'`qD P"4HjѢۣo'@Ffjo^nݺ;`̘8д)4i0lذ;U2F?f @QΝ;Glr}ҥ ʔɼ ~w*Jj�0;<L(G*kocہ$|VPJթmQ+D(h̻j@!@kWZxx<zmuSN5;szÇGJՏ- lDfzN) "" " NAy`oذz펶n!hߝorLXWBXjd*WXmL% iq,01`SaJ"z4l;`ЧD@L`q~#ߔbGG5Œ%H@lnsOzu_L: ے({\-3}gE`߇ b"K. 3m{Ih)Q ?=eB*u&;U}}:D6l#SUF`mbPq]/5rmA~2)IgS}HO3(GF%~6n O>yKc1lB(0lX Y38ŧG㏁ի}?ne'ZHIR@4GE\gdqІHtP Z#;^fojΈYDhO? F1.4(w}qYgelڵkO?͎ΫqPb19sI)@v4 2JUf0`eppi�WD09`ʕ^{#O2@�o}U3�v'>~#<ӵ4^qť7n h֭ˢB11fo:c_ovt%" " Hs r/OA;.emr_9T1->خJ"1lxᅸS$x&Ic޼$W" " " " " " " " "r[yՇmLI!0lp#9Byҕ�Qw֙u,R f!:w:%'pg= ({ \{-гg)T*W"@N!j*$Ԝ0Mx%9G_檑"F.W@D`<W4n'Oq LDl޼u4ƷnF\D@B@@[!8IjbR !xs o -QJ=sv˩BoJHओM[3Q稄% ea<@˖%(Hf,1cvm{ &#0cFvY}4dqL"z8^?84mJl{8[+[@*w矌+1J" " " !@G[DžÇyɩIof>ubMk˞ YNЏJ"^s|y�J)>7o&?ltj[G}Kmj@0p%(/;#9uTV"嚷^{;_6ݭ" YH`D?Zlv]]NWâЦACҼ em|E7T,$~8]Nv^]% �x/N)#|~'δ5QjU .22e&6`Q& 5ZQy|q=b݁u d;?q{B=N`@3#=Eϯ"-ڷEt׭˖HFd&S3Tiڴ) ˗/ܹsѯߵ˖{ NuGq?n"S~`K2nb{N;0 =y& AGY�ol ߟJlm*-S 0pԠA@@gjoӯwuʂaǘ'j@*H2UG>Ӧ"ߞo6o!lzV[GcRw͡j+"x+W.!ēUYr| 즠ދ@X}6H Xxylh9Mr'&M+u mp_ΨOYInݺjU34:+" " "  <|in )/I):6@�4UH 5%GU;@&@6UWm!Ю9eM #`ӵ6}7@aS%H6zᦛnW_of+-hcfZv=| Njz{n&0t(б?{a:}fWK .}*T`Px'в웘TJ62? K\_Zjaƌ)f*V}aA}pUID@D@D@D@D@D@D@D@D@# !H}RN`BsφzU4.S䓓PGQ3A3g7~m'('=}VOӋ�#ҁW)6 /bVTXدfTըzDL#S胂J"PM)fɒ%8ꨣl\�{&!Ոpļ_5CuĂ2@֬FzHs2 J)187߭ڵ)S@TIa6^1hd#*USNy&{>ܹy:7j ThΝ0}+՘8q:{abb}DժkXX0cYD@D<?oק0`@C5@:u+.]0mڹh7[եCY3`L?G@J5?v㢋.ĊZП&6?%+^m>2%ξs^=_gkF%ցT;Oh4A?mušU@:88x`ҩUjK6`I1]6lw9ZLj$l}jP"WÜ}ĔR�;}s=TFqsC5w)g!/ ',xzB6,t:uJlʹb!Х +$<R:5(@$1.aeojg[a .:o68Oكˆ/j}f"vZsY>\ >5P֮\.pIt͌^$�᯹~GjQNlٲ{o`ߵh} eOp8�6Hź B@Ŋ1bS?(ZL 5b"a" " " " " " " " "1$12;iƍʕK6:hy+WbL6 ZN:1Ppjaʔ]TMb*@PfէD.0[o Rt2u뮻3g4C=at9HqNP]żywY�/z-" " YN]'F aٲĖ+ЬI0I& }z~/nh8H`nܵ4h�{,s'-[/ U3�ܭ[�yom&J}4~z^)Gt6оpWS#~˴?" " "P27 <гg"@'t&M2,HHm@ժa>oʘ7} 1ۭQ6\͛zU!" " " " " " " " "$'%St؆,��@�IDAT~ v^fg(Ʌ!U*nu(n$~XJ" YE` ?`Qٳle`͚4kT6gڵ%Gb?TehR5\MMk~8fϞvaXr94\˗uո:jnz:T@xE`*kHիK2\;/(]e@0d*hQsۼp!~ۿY!&,^?@+EQ0jVN`}Gٚ$/l (@jh5ׯvR@6ΕWO> \zi6PMrx AXt�ZT^&(W;8L}Lo`\՞cOƔ)ml9ƌJ" " " " " " " " " YG@BYwKC�ÆK5X8d2clԩ#Xٵ_D (P?iP.Pf$$@焟Ne˂wN֋@dgӦm_ Gϣ"P\;#0 <)O/ݦ6hB[o5&Ol3!쀚," " "P"Z{Ub <x=%Y h([xCK@ iq%p\rX Mpܯ |m[`4H_ߩ pEw_kYqC瞃#GꮨYJJ֭:^y6 pm }QN` ۲-" "%hݥ 0t( Yqu3&}jq5)o* 12e|_Νsz*ĝЦO;zh@t2@T2%EI~@˖,Ye�}i@KDs1x֏>'0mCسEiYaC$"*kzH88PuC@lVBE8,,e aQhs_|{f :3䄧y7Gڴ/ҵ@׷ow@ 538_55kUVVZӧ9$h@)kuTE7{YmuTD@D@\ӿ䡨^=Nj˞+T�N: 6nϞ>gZO!ȭʴ?%Яq#p~  Au0oԽd (>�z/Q^3kz;(l|2~{E714e\?|J" " "(|_ 3nɽUҁ@9mA^RB}ZcG`ఴ<yǘ1=:5mz+" " " " " " " " KrD y(Hv[Qɩ!@''UF�:ȏVWdroॗr5?O8$"^4w?blP//<v X"HU>J") 7Ǿ{[V@ٲk#S1N̔3~|!3= 6o`^wb~pOOXg}/ ʕCJp[3hѢZwxBD@D@D@B@GJ2ylMӦ:TrL0x1g1փv A9h+m pG>Ǐ4T&VI/"й/~%(Mrߒk}G{-֩nHU8cҥ 0v,а!,0`�tirV" " "Lkcph~|5_Ӣ6H<ڸ1} 6vDI}f7i{{vHޗ5C>3p�HӖPID@D@D@D@D@D@D@D@D H2o\|McLdb>ixNq. Ѩ+pXs tz."w~7oF4W/ A)? Q~}kW<J"J{C*k w]f+UE P8V=쬳c~H-odjhʹ~}78ףиOE ZzypؼgYD'M7dHy(:(cDKLnH MYcHSO93Y5dl/$L)bj]to-}gNxiB`[kWu�i O~oo'FcG_cܸtkړm؉7kAn�E!_|QA|:8ƸN{,0p <:o" " C`ci[ _Z= hca?Z"wso'x#izM/ U"EDT(c"R )SQc2R4P(s"D4̅2E2[t{}yw={ĉ[A~k)/h*Y  3&,' G࿿68m^t_`TIFS~|*iOz"~'̈LIgٷ _ g靟8m:`>K9qf2>lG~+xbˢêV =^U(`}bp ޟ+W˗K_4Ǵi[tm|6`9߇ƍQ`Vk^{*naCs`Pe`=O!v^}KeBst*A2^]~A@oy 7i;oܸDa& B2/gy#GG>E _5ths< PvPZQ>{($D{(L4v,&A�u1j{q!qQYE@D@r�o@ؘLl1(̙8WzLh #E>y{ q;Rx`Ȑ@;muQ ~. ln7AD@D@D@D@D@D@D@D@D $z:x=Qu@:ew lMjSJ9DG~%%@:|*@& l}杈2y\=;�|WE`MsL HՁKUE {(k<"@ 矀 S㡇J2Oe˖vk;1c g/<餓f͚L!F$?S$" " " Y @#1tQo�Nch!OewTKz.<$7 .Ja/{X;xA`=3τ�,ج|W6/Z(`@A9s/pXL'[+�ޟO> a?PDK�G;RD@D ̼R m 7(ƥ$$+WKN D bp)^J"P3�vJJ@chw8tS•QD@D@D@D@D@D@D@D@D $Z:`<)�yeBOj,4"kѣkj u]Y‰o^e\#@!H?,^9@'gxkN;Gt!_T&p_g_Pd=VOB[m "P:jy/1@׮ͅJ"I*UB^Lb.tmd0^n7c-p\Gd2c:W \p@;ci?N " " "%+t H2[O|PMGO%߷/!TRͽc=(0{6p_ABV%Qhv~~NA|P�b Pr@Ōp`Lu*F-qkŷGL%�vZ 6g(^D1j ~;`AJO{@,͆/?�L4i[8($ =D[m"@ϞA;B EE~K/A4kP�VID@D@D@D@D@D@D@D@D l5�~Dzjfh6ի F{a@׽dF8t% a4Jv*&>{SQpPN~:H/Z7fJy̧x$`x'dr2?GxL(N @pd@m{{x9s&6tS|GN Jv۹)0 & W:@09�ժ?k xEяoI  'bs̾JI7t>pE:6#vT2 j@= ?p]矧?_:FѳF�(ܢ$&@ܒO>떴]@6 4hK3*/f3ƌ#M6[o%P\~ٲշʕwflɱB{DQzR\vp]eԨҶoQ СCTcڴnqFQȳ " " " " " " " " "'I[%H```( 1ʶRY2q2G`=|0Zڙ),$"8@2:�:Y2:4o̘%L tuH u]o8ֈ@ H2@9{z)6ip"&'дiS,{9T;.]`N-EJa.0p0 աD@D@D@"A^֔s"_ <;S PZ/�JI_~ 0nlzL Ag]/.>:?�<� v[B]|?N Y($$@A|&XBw/O5չD j(@=hP <g8' ӦW^ 2ȑo_E@D@D4tS|mpScŊK;~T7BMooUb5 PK]1P6M6^|' )6kP`'.aţԮf(J(ݺ֤� QK?HtFULB[| hx̞3L$$DZD<D jhXh(j9S~ �EP-_j[vA(@zvo~`ߤ?cmH]bEoaG)K9 ЫO$" " "'(D߷/p@z+ L~lB*u~ AO|3p6۬Y~ AV0R  xMkڳ D c8K@L,c'ՉD0S஄w<Jh>uE *[8(&OZw(>aPDO0uIآRVCD@D }7 tkɕ~X8Q<HVs!?Ed{=z|~ג/Q @[;�<tr<\KNAફ%K_'#t'v>Z$:2R#U8Ş?_D 7Gɍ2(K`�:T67V){[m!D`DaH:)@ |M-bB"@gx\AӦ 5PU9wqV\i*x饗v6jժRtE7~J%г'?<*g" " " 7c⋓ۯ[S*z_M>*W* AFd&_G_|\sMQrY믁^v1hZ>нŢt=/ h1cF ΒeUC=ȋMO"[/ v/"%b N{]w[loE@zŏ(z$N_[n)Y )@6 bټ6ʝs}7pсϚrQ�0.@bŹqKXb*@ |x}�Ux:Bt 0z:}b\ D5 D鍎t$M3gT=իJ / \WE@ lw3\<#wl 0wn.^y zꃜ67/}*" !lyc P1 ϶'Ø1t>_Fre|̛77x#_}ua /7SNu{.\w>7N: -XID@D@D Od5D؝\æ 6GKш6~sE2{0b�(`ٳ[kYRO`=V;Fꏮ#@|ZgpC w-$KE `�`a} Uf'h~i`}E]kD@D@D x~:/^[ҖZ/!pg"+`R`ص_$oÁf̀~XsU!CGx b%"s˭+!@=wuN]NBv2j1Ǥ\:jv5 hnuNT=n_mXd#lSh0#v^r'!\Zg28`rkdֶ"Yttv=&zkgD/R@ lK=dԪU ~-=PmsY`Fr~Q J$`|/)S" " " Ix}`DK)EnU ±reìFvz;$޽#!_ep࣏/._}ٙi`#Q<宻>POM6 .�Ǝ ދΩr/>P~ǏO$"d*5uep]sK`ŊB8pB +8 q(`p oa~MA2XǪUX�<O:.ZM|Wnph巓@0#%N I) xD^k fxmu#ihLXf 0AtvF"-[8U^W18yQ.B4v!�!D (Q͝U((;{vPZ~o90cp!B@WUmt6ʀs֭7| ;SN˗c@mN .@CcҤI%v^@߾9] e^D@D@Dy'Ьp(zy,HuS*,mgrI%&oG3%P$*֋@yuf[@r^?Y7`�.o}rG" no�}^}-[,b @<b>S%"z?m7Ԭԇd p5Z XW,+pqc~ ƍӁΝ6R>Ri{ j{=s@EE�;=t>@,J|{U9(@mslVK"]L_|>Zr9m詒D@ *_+1f7ؽ];`L`W[@.bF;}yԯ_#GDm30yf2c W\G5.&NRMfK.N)>LF_GM ˺T8<7\rv[/ 8{W_h|AA9 b6 $7\.^ (;瞹[\r�[z)xA# J@X4;g(GqH s<Ʀ*;Ԩ\u@Aȁ z۴CtSL(ʥf�twg':kX^<`0 $2-%07%(? nО#l27zy/^k?qOSx OYʕW7/ldt?ǪU7j &C)E�3Wǎ�Lo[,^x/py@yIk^srguԉeF!y8n#~VrH>'˾zyx(fte2xSJ3ѧx8JT~uU2ׯzO<$CB?�|=L%= sF>.-L*un{rܹV7nܢ]hy.{=j7{Gl\;mŭlInCPs�v1狡$@mx~0}/s;c v;K6iNl4}A+Agn=; <mu~wsb[/'緃D�1O87;z2դՄ Y/N{P_~Q/ZFG[ vxs+?r5j܌Nf[͖A6{g_mD;_<]i ְ]RB"˴R+8JJi sRO 4͝kR&/hd'!ȠDC D ;}w~g*SҼ:+B)V?_~q=x_wv)Kh/gWuut{iiǯn_7pC7xJ" '@l?e|7|9p }wy<|x]&^N>-˱bm=v×4X{|aİM>ɇewND m2/˜d2^̯#d~}+8sw6ڝwְ6e3Wv<g_ ߽;3E s0`o8Ůi.Nz)_'}wUYۊuWlk%X[F> \xaN�mڮ‚::@Z=Vi9>{FSLcgk`'vQB~ ;p~WnٳC. ‡sB[l9oƦ@)kpR>Oy?{cklbߨ[ h/{Is/S< I҉#x?mӶnkyM4q?UT�b |^Oy~B"^< \OXw{˱ΕΚtWգMpkjs_?}]sNÄwHB3Ӂ7h#p#)'B<i<{Lj6llA|L&?MĚ}|G7oib`[vγkbw>]h{q7;v6ڽmڴ8$(e�D |~0A8hol'V7,خ}[s^]vp;?e?v_|[lq/J/FkKKm695`6� (@ tٽkRO}/|.u:g'>v.Ǜj--'>7MNg9q_s>8e?]v|8~[48/i6~/iP,v| )i*7MDfJ" " "aÀnm} e|fv'̷̛yQ ە-<>8ҟǴ_2dP2`7ހn�W_ ð>"P~|'y&з/г'Rci-GSH8ehC+-Eylhk*m]jŊf <`'cߝ1?͇m~sΉ65oD@V'0`k~h`b0/~.X] 8p\<;CJs>wh}>^[K'>y2%z|χF-@�m2NK,q~ζo~b(%|,,Hx1<~lϲxm5[xa;>ru_;d=?>ޏM0 |-sA? lqJ" l.hp}~U+t .MZIb["\WYuǫ\gCTgosy"RQ?sH(%G#޽a %`qف 7�^ntvXk@ d/c`=1&6Xsr^ 9uT7;NLh^FLT`|\>\vpm1H1o։MRpa(Dߘ NVunR |W:t`u�# ̙]\ۉ'VrMx{xOb/ʡcvmf͚.W4? 0Gx ;)~{&: Aw`It9'HHz̺JG'/"Z^sXl<VDa\88x׺ l=7&OnIG{`̘ JjrPKBO?4}Y'wncۘS}l5 ֋]|?PrΜ9ۅe;B2_.] D 8ؚaF8>tA,�+ ,pߏ|.16?76hl܋s8giP^lư3ᶹ_f=>2',kfJik*~NzkEK) p'[[x-v8~pxꩧ9J7h[um\;-|8?䗽=?F?zo' xSI;p6xA|\I8en.s? %v6$~أE@a?BB[]gy9RO`qꩁZꏮ#�/j}0k:ΠcFR4x0p0NI[zF>ᄠ)ʧdwC�ݺe'zVڶ0||gbLh3ijĮ>ޮy&E=eՃ/'lק<OFO8H='4hP<g-qi˧=UIr�X?hgߖNxpa]2[nչ"o`M-VUݴWGӦ8yI>m )%js?F{|6}z5}=,c#p3D }> OWouϹo69꟟#BAgyOo s~>lcx^3HI!{,\g뭯fw몟.c=뮯cؘuSBb"\gYwYf[?O÷mI}ȈW9XoY%*p 8|^fgFOS6DD@D@D@D@D@D@D@D@򁀄 *f ~nzqJ" s2~xL49K",{챇5qbT(‰/ӦMç~6lmڴAp:(9y ?}ۦM:q)/7Wr,=p%;Xiܼys {gV82'OȎx@'؉ x/<흉s?(  t@0,Sh;TxعwϹMhc9-Rtpp=Ssb}ΙKK子1ny lFZtAw}[x9oɘ8q"Ǝ"\wymahݖD uLi`hꎫ#ض`N`~y=N| 8\fOYwׅtx@R~q^q}X|6si8_J"P~ҡߐ$ڼhzW~ּ{{sb~X/=ms.rU.7?zn%rrsݓmZ/ ~cؑo-R1vJ;yJP=7Dsm$(,m$YqdG׮mګo_OTQ 0p]Z2ٳ`e-'@H{Zeq0?ҷ˧_ɥgO`ଳg}+@3}:O \Ci{0ۗ_~4~ H}i  riۈHLQ3/DmzΤUXP{&ih ziTL`?m~s9FO{y{ۼ{1#?6^0[}>V*lzogx}V{dGY%:ց/sW_}נ|؛;sü/Jbs>w5ռ`aHwFE6lW?W|z笿NJ>z+so)$@'+_gY}sn{(~c-/+>y{:_K.#/ :8(x+g`OQ ӎ8?OA6}L櫧F{{ds$E)+Zj墳1 )?4jTA!!ȵnƱx9z@:xg/ gm۶n}ݱ뮻#}~-٩M< r!8#�\^6.V'>^‰N tHOreCtsw9Ϲ>ViK 1I )JC5R567 DHwy'yأ�#O>dbÅ^;]H~gX{YH%O]Y9;Ν[<Гw_NFlѩs:z'e.wRwmRu$*xq3~m睟L!_0߁J"@7AS<B$sN9p4|l5D</y|^t$  OM ml_8 E!66>=y�0\\G s))# !6 d Vcj^xBDSJ1a�Rn90fc ύ<+'@\L8ҏ�l9o~"o>н;/&P>5%(/O>v)N!V 9r#bL-i#![ك{ZƋsҾiܸ Oo2w#%(�5> X˲Ӗ;\彽so׳<(k{|.}?a_6$J}=F_ NMc&>sX)sa?Wɷך4i'nr�릯~u6@럹k:|u.X.E\}epS?Q< :{I'sIlj?Rt" " " " " " " " "}5\n>a=Zt]v3ٳ(FnP)1믿^,vȎϝw g,DQ p\Z R(�+UX(BAW^y1`ͳD]tq.(Exm,wjـNt|vᲟYEXLN^P 2?2#(=M&sjMqH{ SOk UoܳW^8#}KвeK\͕31t9@Ep8+':2q0[bO�,^ ӳoFgT,8D2t"r{fr_~ |r7_A;ПY<lӱwӅ24`$ZXg,PES9h'Je=}Vw<ZKB B H?Lةmo'ϼ}.xXgo9=ȷky{fl*ZJ_?X&ܯ?o7 |_g n0S� yOT2;N3M ~>+hץ �ˉ} T2lB!y͙3 xrN .D1>i2ufD}%fzDܴϳbŢ//aqG iWm\/|T dx2 G< ܕ+Wv'.B`Mŕʭc~c|{Q}]Ǽa7`*l}@ +P |07k6m]vŽ _d1|ooSCކY#s>Y]>~O>+ :ձOB)7 0EK.zr,ʵ  A˕`9z�^x!pD7u(5n8sNdGѻcM%yxJ47vM4 = #=I;t;ω 8�; Ç{:(w/2^<yz8sLl@E`ݣC }?sXG!G Б 0d�ߧg):_;Qۜ(LuabM:p@g :PTD)9=�:A./�>2ʮg�o&u]]~58ymxg0:!V6`0fy}=�ֵs2{1m:vK靓-XE~^씊niL9hN~9X9Д4H%;,ge^oiʕŧ浧 "VZ.0sچ)FH�%KS> nON~7T9D[YfyІ'Ž4,u$ !䯛śCG{��@�IDAT!{ y  rJj/حG4 @Q2iWVnY, R}>u;!+,{|ނ"ώҪl"Ew悦?Mi#2p; $xC&>(6EO }B͛7wAzOS]H)Їԋ>S~vzl>4/^3qN;@rhgĹ9{yRP),}FeD[G�w05X1c w_0lOMҥKFANς-Z6nVZ{&d䷓~b? \}a]ĺl!UE!ʺK_))[Y~gGg4W`ܦ*virෑ#Zdȴ(" " " " " " " " yJ@ByzaU,~CV 8Uqt߿saWQË^{9o^zᬳʻH;k,'uN?tvir 8+d}y뭷z϶^' @%HGNБ^GE^|X?gdG2:U>.t9DٰaC4iM>*'s8AdK/ "D~!F`g(U?~k;15 wsd6 /W\qڂn G'2]y=&ṆB%Y8m@!6Fg;&{'e=0Cy P2N;P(6z]wzWjt` ~Oѱ.S1V#8@/?X-<oР""N~'7 p?mT9($^,sB r mZF$g�?;7p:Cb+ S7 A,6]Ds-o2&LD ʹmd'\i՛_8$_? Hku [Aط6:Fs5yd7A QP<O_A`qF D{=ŨȀFv/MKT9`Vr LJiã}^rqϨ&@< 湎>;Kz ϳ^>>WӴi9䵣8ĀyJ"K̙Cg}Ew6mߏ|b &?'Y9Ma:+}-}( ڲeKWo{oSq 1.XW8XPj~^-8H3xi3.?˩R@ H2W(b4b# F,s9v 6 ~?3p@w5 |n*tj׮1umEx}N貃͚@xͧ~ۃ@ժU oVt6`v:zpb1/_D\InFKƍ| 7,xvP|DN>c:z6YW5kxe>gmΥ糈E`7̡-T�oW_}5c=s6d8KG`#~\i �=zh'09HS'fMь !q�9o;ǥK첋s* ((B+YF~#=́wʶ7-p)s]+Pzx}8G~K{'ǁ$M8Є8q� <!W /L?(e>(K#|0 >ZjJq#ϵ֒d.2qLMEց(L:.j�RLˀ7�OOu0s (tgcȕ�y<WfZ8 +sـ s [Ud̕OMA}cF( ,/& @2Dkk(wrDl5.NDĀNShUJLy w,z+ LsYp>:d�>~|N3ߟiO~U裏ꫯ_wL1|[1P8$|6>jca�?Rc8ivMg)ʉJ"P^de�gj m8m۶ߜw_(y2-/n-gs#`<x`9}gӑE@D@D@D@D@D@D@D@D@d<*ZW"ow~MCƎ .E<q;'v-M~0oC auqws9Dž/0kƉ\AE{B@hkMT\et8Nrxr_}{v섒(Nb:tT^=+IE bΜ9NH>(1d+ds#R\PMz`)v3ぃV9d:ca>fڵkђ3�O=mah$0Pֹ _(qtժUr-]pL\{WG9. Q4;mt q9TboDa|9˘65u~lvn\ZJZ":O ӯXllp*i*6?PHHI ]B`߈o%&d:J)&pu3)>6OZR0ִAy}4}Rv,>Ä`eo_H[ ,Hp}0,(L|!~&MQ/hG}TS9ѶG68LgRJ-ry @NoX#PBf/ia4' PD|>OG�2Q\m>:$" y|f3I& $W^/ĸ_ZNc[R%}eb8zO;⠃Re;Ύ7^TV hB|] o}ʔ)N$!-磘n&`lts<%C>q@~UW7 OVD@D@D@D@D@D@D@D@D"$Yz/mLu¢KXST\i It<qw(r9R.#< -آGnt8c9 YRb<s{�BȜPKaQ:lȓtQ'@Q9rݠe�ʼn)rP1(JQHF䳈PD Kf9{6�+Qʻr;CiqܸqNd%wrXN)Hu}1rHC9:UAQ0yo/8 ˟$M7N9`lSE@Ӳo ~'b (A͟kذ$V6[m!"P2fSNwKgLh` 9MxR@@B ΅`}QG%_&r Q̲#`=>f1q.X,AΣ#g�ssAժeЩ@ 6({Bc⬳`" W�Ŧ(;!23x^/ C?'|Ҟ3 P'{Per~DyQX"lU. NdQGGȱ|gdدA~ KQ}6zQSkE@&v wF=T>ORE`�[qWܣ]X2?~H/S{>=#qG~HD z)DŽY r*J`ٲe'u"_c26>klLD6IrspQ͗" " " " " " " " "eՉXg1قK)%I`Y{^!yߣG'׿t-VX5f{hЧOt%ˣ\A /td}w@FR:l3 DaQF6'FVeS6 �#ɝoO? `c߁Zչ|NLt.Y.~mf�7Orgm. 6tM.~a'%Q3A?k̙8cA6:&sp[:u\[lsH1}uh`:? mp~+{hQ�DM/fAڃb *Aw ?n hʍ9 <e'NALiժ[fۧ a (}{wX_R y󀭶L Ô^v>F)G|dHͤl JC†ӁJhB[_?ছ7 ʜ8w"lrʢ 0gOAr(GAUlc¢0 s`pڵ}G@'[o>olyd*EE,!!y>)5iy.,p@z'Li]6=P~WcU)E 1 ɱ>D\bIcxI'�˷D,:,1[o=':{!uXIL~PYoMcOĞ{ۧ4(ܒ ))!*ff2<^@ H2̀6: �0TJ�>lqx饗M|D6뮻ΉzȐ!RJ"fd%y睇޽{CNEOM RΥsdE&4'gϞ](b~I9xa"@'7-믿&:cPcǎ8Ü_>|{ԥNj80:`];@& QFˏ\r ( /8|)ʑZBh6*p@Lo<1Pqn09b{ kg:?s4i8X裏v8!_EcA^Ɓo(Vl2'ܔ9He˖&J -.@ Z >} rӭO- $Y�YE, KSE]w(WGfhhYgE&[y3Y_t3/ T�76Z(pqDX>h41�_Ђ}۾зx2BSSQK"`N\pЩSI[Es=;4"y'|~ಒD�Okȑ2};IJ*E-)PHvg6yi6AT{)ů| s3xM<csވNyXn8F ץK{h۶y~xƠoc=b*qnCP1zh׷v(Fz\!?81b۩S:gnݺ 9kG5] 'jټre sU.i{h&Wr|@ndn^z\Xhg GOȈz裏C9Zq '8_|QHpBsFtfvJ!w߁80W:̜g9l]tk;VTv&|_K..YڷodT-G,Z.QGJ{XgJ;<4ߺ6fmV0؎CSqDz_z˿V8jժn*W\0|TЀ�#X * vر<x0&q1C&Mrʥd�ms orK9+ jJ&Lp�3(?ՠt\SD Sؾ)S9AH `mi% NBIyG@B]R 1#h$(LhHf/g3O1P `1mL fÌn} ͥ`1+l`vyH`b-�\�̚~:,P/l�8`Ш߇߬{�?0KڥR~J!Mb?.Ns}S?}ywʕhذIw1E0s)" IH7ǙVX 8<m֭$z!ύ/7aF5ʗ$MI oqd…^SO=ՉY'},@An9(I`-,v&0o<_Sة/؍7tܑ\УutO[r ,8 0hp<-" " " " " " " " M@B}.�Ӵ3Gw+ )֮];':Bvsq믿x~ΒNySTHo=(Frb);[Ŏt`O?䜡<HYN:;$:N1J4%;wIt4]zo##5`vF6r-6m5k%JlQNn)+mp;8G8oW^{XUѷo,[̄;`1 ?9y=Aʲd 31E ^zhڴi3Wxs9ŋ;$h`MxPNMD WPO?uP8l3a֭[.EJئjJ"P$Ye[�i#;[vS=s|=СfRP=d}Crɴ0Lwh,Hx7٧a>-y#l+!ͅHI |.0Ց[`nfsϵ6yEJ)COUP4QW^11]0X 6j*y.T|&Yvy|Mkwioٲoa;&c޽{w'zcEQvE iYtC~8 3B1b)Z'Mk$1ǫ&?G<(pA ]�m B;:0}DD@D@D@D@D@D@D@DHvJ'c @>tR@}qB tn_~>Elz++t�M Sxß{_0wߍ'|҉e77t{l:{GIDp?bLzg@!c8&::Gxc\Ԃ^QAf͚ܫW,ΝkvE,Hky"{td4tPh nN*HQ|e֧`M{qs׮]mYHʘT�*Voq(v p.+Vo1cƸAU뭷<@t t쐹pG͕Fƍs^yԪU9۶mӢL�/CATLO-^ٙo-YOL <?eK-imfNZ{ I|m: #?QTA,Yg_8D` ㏣9p^w-l(`B?8%+Wtwڃz6rzڸofmJ&Lp6&>v۷GÆ ^OD@J>9^}~56tS%<<#uQHb7Ga/2qZjZ"E6l xӯ.J驧ruT͚5EE2F`Nշo_l9?i0(sRC57VovW%dXhh [̈́Zm9SYM9s6mrTZJ6i=g}6RaN{;!з~kŃu ѣA[hQcUt兎Kl[n\m٦" y@9j('Da2:^q[nN9DDv "*�ş/_ Dq:bTcBRH/bx7vgtp;Sd2Ӷ"`A�|17NO[no9:PsrO(�|)?m Ѕ(hFƋ/ 7ЄBi_]wu鲨," "R]Owqv~% AS~SM@B5-\h:ҷo  5$iv#}FSG:\�NZJGco6hPreM-~ 馠raN]TO�fsuٳ g_D"AeDRLb0` 1xfp^{ :P) ֹsgקЮ];TR%Tt8?#yg]?쉦}G_"~:7t58?ʕ+QIDO'}Eb-8$,g;}W8>LJ}?e!@(E]侻-4iR H!HU)w;,Fg.leTD@D@D@D@D@D@D@D@D [։u!׿kJe8p ^z%0D ĕ ȞQx-xM2.6e/ ̗d&ɗ~.:R%Hl{ 7vBtڦ]wIl1yE TݻwLJ~ifΜld~^…f$2@(y@[&LpV6W|@#:wY*f;䣔m wCyׯF(sr_vi'<nԳ`&ΐ:Cpn $d" A6z S r,(@6vXp@g̓ ~i6 k.pm�2y"`:9ae5ags�g.mMBl L\ 3/@ 0NgÄ#<ves6c W"&~B7h#w󞧿%[gz~@#/d "mڇ E^15(BqĉڡCˑ(�n2֭[wR4K"<D.Nnήd11'|޽{) gYk|GТE P2ݩMC`}&?[ZyU9$" " " " " " " " ""L|> Ti^q3U ot v[NK;vĭjcltL9_uUQa=,Q7 q' ؤ*^Zd"n >Ec(ڥQ\)siڵ+X#Q!im4j(PDkM<-t99 U5tBvJ)b|#Gı5k矂}vub7|J0ɜ:em|h0߰b+CF&Msϥ)? oS)_~!EaȐ!`[O> -39~z3,�쳏kOuQp `{QO;4UT%\<G;wvNꇘڒ%KDLGvۥK\ven{Æ ]ۤ C?~q}o]b4 slt)9Li.8N۬GJR =wCf}`"f˗/_%pԟٜsIGmkĈQRMKU3HUK;N<BiWDɷ<+_LY:#cIݮF֭|fJ0;:aW@TLhMYlmTrTr>j5 ~I�?7G: ɚ{e{cܤv S3JG.7[I%#VJd"߁IeMIjd3}G =ftl(鼙]s'@�CM>݉d"Wٶ'ӏ <Er25`he.>0\p 9dVɁBY�B%Jb rpFm&D.8S&$W%˦(yz)ԩ㞩SNv?#p3/[¿|obY?0`*S)6>3囑)0"lq}/&[fgϞ%g5{':4(# P&} y-=\qNP Ju6 >黈;S`J's /llK2ӊ@d]tg,e,Bچ.w̟~ ÓTNԣz4hRG1:>'QH 9`\)>^W 0Zr)՝&6H1�ᔀÇ[ξ.R4c?;9x'FtkOH,4؍77I|M6qJꫯRvܲ3ϸAż{*RlY26oqbOXpl tO1^taq)'T*_xx¿2߿|KcuS&γ?^v;QQc(_#5eRd3C!dn`ҥ.B:LO~螃\V ŋgV,0CաCf3Չb{챔z6s:={kÖ%Pvl.+HDgx8%Nljժ^zN'Nw[G!Qlޟݻw_(Ŕl"e?AS~?&<{KmQK10wKet⽿)AH q Æn$uǒ:A)gQJ6RS<BsD,$T7LI=v&eie ;ߒc)msywqNCU\$WXg]9Zd/Zk%/ n'lHe9KB:3w=L�,( w`*aÆ9F*[cqpoX�SXGX0OX*KyrC�sgZ3f K/Kme J No9v9π>F{vs)8|~Ds1N�hN&}ft͈._µdє>0\׹KG=v!9ߎv>2Y d;cǎ=V`Nٴy[k}ݸ馛\;tE1-\Љq+Moc>ڂd7@5!֥L$?|;"tRM|QG?uQx's!wԖ-a"74:x ЍZ'�7ի$" " " " " " " " "PQtEE@6EEgUTdQӊ9-38h_?լYy^bEBP]D_dRۙSc_dhE&V<yE&xQd_)kkkoՄ^y9 խ[:]y"?:Fz׸q"\\_6.UEDRuRcβEZ4tRӏ%{U\9LlMͭWZN뮻.(޺6ȳ,RcէO,md8AMaÆE@U"+*W/yȕo_TtD,{'cV?ooٜ vW6s`{(hFj>ۭ=mklGqD \J኏caM69F`"PgW[gB_?6b٦ngζMh}(+**o%L9)+i:NM,<]ʵ][jVx'X^~lJ}dc._wų-.N.$yL鴡ؙ8=>x:)֭[z`{2yefOjm,yE@%_NkJGɿG6-9f袢NmڜYlo$N5- )2Prh0/**~DF,*Z0}L;9}YĵKSu0{Ժ �iEEݻg3gtߡ~{v2`gͶ<~AJ߰ ?nO Yt!ucRZ`AlPt 'gv^w~,>Q) Ѱd"&*TTj"L)sd/\mݗl7O%B:}L?C+ PmE0cwl<򩏕|7YbSLqmu,33 b۱m۶.rL&]dGyjg!֥L+SĹP Өr>(s|̤{Ʃu#pZG" 9VE@D@D@D@D@D@D@D@D ֮4n txwy'c^{T923,>,#]1ԩSOd瞃SNId:{ց?#VR%lN>dwmxtQFa]vAVy9O?.mڴqy6 \{n `[8$QyNF-7G<\D={ ۭItV{nuY++cE;Piu?B"*Rt"־;&O U d+%w +KY?_\ꪫ0q]/k"55j�J#`ΪhѢL<s'-Lχ_>zyw3D}WmѠA\ξnbD6+ކO&YI &[%\0.V6,E7}뮻f?C dN/q(ҥcb%Kwi޽{Q %'KImFR*ƙ,>ڦ}3>6;2tGR/\1cDjm;׹D@D"΅}_\Rd~v,�~13ҽ+I8O$~lo|zn.&f+MQul~ओ`6sx1Ԯ<Iׯ_2e|=�ƍM 7#i3�7}Cy0L}>]dFmI:N>lXƨ8wDvw .tu::ºdpػ`f̘}N)S~ln7. v>>{5w_ʳ"6tR<`y8묳p뭷#< իvl<]'KcS~4co÷xZjPۇmk/}{I&~:U.N3q|W޽1rH4m4*تe"Jj|QGݘO<&ԵJfc!k'mY˚rov`J" " " " " " " " "  wr@+]/9t:iow#F+tGaÆSg@EsR?(r@):N -y젣(Dpb!':57\:~mFM\xn؎@gu~I磬CN}u&L�QT}� ;Ry-Us9z6uϱ=z<Y)8VNwm!;y1x ,?-Z{fBaѡCZklb5�t$vnFt4OW趈WT4tzᇝ& :ӳÿG?~<x}0`�(kLG Xy"{g۔@g1X_ LCu g,HWbkܹ5k,(fz̲ެ|=t}ꩧ3ɢcȐ!u$J6V9oy3bQI6olOÇ[mnfԭ[_~%,:Fm|}ʺ}:|4l|vRPSN˝i"yIf_x{G0y=g蔷馛&s:-O";JrPs8šP\pw)p[(qP\9܄$$fev滣sJش6V=bl6',kVXa=y9_R:z%i2$( #OBRyFwAfL~GqxvBd^n�][ms{şZJ_Ҟ2mR㮻r}yJO?[={W7{"v#T{2m+J>ksp gqLgދ:vy"<c@ĥy m786xc(ȐX\ Mڒ>4I~@{i^m<{9S|Q>rI4 ;T3n/BB"`0FOҾRdXoaΏUߕnghIdK.dCލ+iBCi?2Od<:Μ9X?9cڣjv#dL fa^ bL{n12Z6푉g䱃 r8_Y <|ސ$#&yrYNB4*Ph r{A ?DTiGlhv腑>ΊX`Z;z;Zqn`_~yׯ#mE:읆!`T�[\ SSWE:u!tJ <ON'A̙*g*ɜxN&aÆɣ>^;ˑGNN͸'j H9;wjk:mA^F(֒O>/t}eVx.VR]f]g/ ve-/$'F\pb mD6N%NtT;Eܳ@ Zgt#OzܚQCXNF"8cn!A Y?祪cJi܍Jiirztx>Ύ\y49%~h5*F͗h[uY쵑w u;Jkx>Oi}H 'zocOZ uNMCˣmHcMj;-7iHBRVpi=6 蚢 K~y#k}v hyhKe!kWլOk#X{SO_q} v2t_sl_^Z+Yc]dTe^QC%rF3cu6[{Ny_G.V6*jكG�S5opD Y0̓ݲg!`!`!`!iBffaР(b9<,fQ<b~z*Ȥ.�DJH邩D?믿p1RùHIy]tq{"R™H#GFof .%)OۢeYqFj$hё.F1mS#H"]jP%pU?)CmU_WhsiRHI^WEH]ʎ��@�IDAT �0RvH s>h*߿JwDz*^]J wy*E;Q|Z<Q ky< ߨQ ב*@6I+N7Q7 5tAݝGJhSq'RH #%TuԠ!)Z3 *']0,FAUCynU܉bH*q*Ѹ~#wq2 e#ϡRϢy7"%pVI"%K̵WjR4IwݕX#RBwq.L0AUfm)s;dÑFJ+9{TYFJ)Z*qK]N>MD1 LCp%TߥvHI #%p׫ c*)A16CU974E[oSu(PRߴvc(OVG7ޥ>sch0&QfwOR )Q_ \\ўcsjTmݸPz?od)aMu^M+KD63S2cW>T1ӍΔ%?)e5^>R/8RN9G0bU*wvm+s|Hy(sf:ݹ9J.%>硇 2mZ͋%|wL12!mL"wfܮD,. y {tUqlo)Q9 r/BV}WZicۜm|ވ7q+ccDu�:2xPHܩ>,QX#5fwf^:8Y,2!RKwj%vQ1>2%q..c\:ʝK̓7+IH*#$!4)nr2)M!{G[S!sz}k,Ij5֥OV;e`t<0'VQD.ee(2-DGW*qBdd<i<SI2LƾU:rA1p$ɜfĺ:|AlQ-hZk U5 M+I<0(ED~:<_JZ1lj˽kGOi[+RYa~zknmEG }]w5Jt潱CQGKV\H;FdIbRYʱ&uͯ49YIpO5o_ϰFyuOdX=Ft`g:lJOUI/x2"7Nֱж'$/zC97)>ͣZt| $ FICZiiנNίe}E+C9GiYc徴=Zc IO}zX }ՙvq,68d_NfԨQ6s7c%0w$ɨ:ďU[=F+Mut5jL܅x}+:ζ:: : jM>yʟ.B"yv1R.ʸe0 C0 C0 C0 C�U.EvX%&uM.ҵK0ǰP0ȇIS\6a,z+' ~s(#r'gD( Bn2g?)0Gڶ뮻:�#0@|UUa܈ 1/ *Pj_y??-;W<Px"H�y樣*A5!SiRZgC(`(4QAԊҨW_(<sш#f)'JIւzev}Y! lj}# mmtb |mϻ$wEԓX9Oz.ș k�Yz WCI2*x9pA| 1ΩguߒK. 丗`H_}Cpށ$c v0[ߴ6,dl om3ڢj)w/Ee6J;) jPV!b<(#R esu|v_e^˗_~Bgя'Lo>N'#0hjZY mg=E?O=OmD?Q0nFQcYAr=d<VO%">4N(CKf6W'tRqڔv'0\=g1m܁xC `VrcAU׿VSoa>|=tBM/Ѻ^{P"c\?:OdG=d` l}XH6  Ҍ#|~8 * |;7z9ID~ _IF2ORvֿ!}G9JH[|S*(w#ʉB_^ OcZlSZc yg3a=!#S$d>>˜yd΢"]Z;0-Iu Da2rcsx tK>p5.#+o$ɜ#qOO#E}6 w3.۩3:p:-W%bΧBiuρWXb> l_-8%5x?͓.èH76/ ASF862Pka l]NBh;2iHڇr:xIqǯ qĝӓ&#OH<]原yZ}GD<>@4*m5>LȍCju,[{s䏸ӂԯ 6 i;)7BVVBpK+yu!]vuP* I!kWܗZz ֜K1o;I/'ϐְ9dT|jBAGu'xWZVg(k{N~imV_>B@ e@~8jE1.Bj!`!`!`!`ԆXe7߈3DnQB QQ3W_}(D*N;&i\wu2Qgp E_%>}ȬZG ݱ* *%*bMhegvS9QM teI'uqxP%a/&I/W?YpEsUyLG.TIP{({L=sM7T^ |.Ң/{]Ege+{N`ʧ*U%%5s'^[}?辙*MPbϖPŏeiz,UIP԰GV^yeQD5\ӕ*[k@ ]m*v)f19ӝ ! ]iOꍵjgy5 8o=.--ʥ#~y睷f 6Y>yUAzdO?T<zk&ЮXHn֠6,dl1c*M&uw\a|AۗP:Cz_R4`y͂3ў8&(Y{{}+o/J*"m.0棾\~W\!Q%j";n񘃤&m|#"2BжehЋL?ȸV~6;\ԠDi{\?uO S5}z;N?e)ENQ6|\xᅲˋ#Usy}2qca-Ң$݂ܧ7~=Uƕ}ǽFVkub"ĝ˪益ݴ1@_ou46Oe]\яۿo >R2q _ >6l>1d!d'!Kh[RHo3ClV|Jxܵ~jҔ߯ɂcvbR+%c&KbF!`m?}3#/?ߞic{6M<2gPn4NT90Qgmȣ> zʭ'!FEɭu~JI2,4@+16-u@ 7?K{.V|*mRgQZ{u'￿X'Qsc Y]T_8未d4@a|m4RK-% _A./"sqh;ŽuG!ʿrF?BWrjgz~@ZHv}w9r(NXܣ5z/YׇiqH]=|B#mhvrsa'͇Bk[@XW[JZc%ȽF޾ߴ0bĈbd.;kqI2CvQXgOGmQRai:5ڪ kQA ]ElXV\QDU0-!`!`!`!`@�f�R7߂`/tca+?YP$4:~1ڑ콢߿ۂqz+nE^CQ6mXx%x=QYZSL!6+0 oֽrexvJY꤀3~bx _:`-@kQmF O>+(!5 _Ϡ(G v$Q{#|?sG8rJs3kެ!mjd'1dgOR,ڞZʓ/նA>|L3#`G.KGsIyBZ۔rPrUHFCĉ1!J A\zuUrȱ}{ZDGak<_?N:qGqN;Ho.! !O 3d|]+ q%m^BHY ix!#Q#3JݑC^:|W]?C}'B⪷OyG;"SMBa/[dټO}J\?jٗA8~ay >~q50'EV}W5}{%N1(~ꩧ[|;rAƞbl0lFj*!cz*f|ȳI2yrV4Z쐸K?4Ƽ/g?ğ+ҧgRV#ﰬ!PeL@FUz;Sa)r;@_UvP)Mz̙kicqBxƿܸ˓?x<z5l4W97z_d&l)֛m&ld]нBL2 izX̉2A|.{Q;U Umq"w)XYv̑}[^*w[fp*+d_##*ק>Ѕ~?wCکxB1\"u Ŀ=NԆ =ti2~3#qߍ|rس!}Z ,XRiyۄ/-nGVlO!m'H sO?$T'Ԋ[y=A1krg9p:=m }ˇOG+T[, Q>U :ㆾ:qdTIk%[M@w]T;Y/ QOH\sEm3BRet8L&E[O:)wC0 C0 C0 C0 C1dcpX1laEc , p+ r/}q2s?S4M(/>- ڒArQ@Op9+UY,)!k$xssʕ(Ah6d[n)=*4!, GVЩ!p +A8QCTm\D}gns#?x:9U(M7T6h#G!F/22Kx,;o:fy*1h{Æ1n:_)yh{*+~>z<su\NɰܹD{c/^He{Ɖ']&!mic "%nH~c\p:kBk}kq]C䐶 Dm'FR70=#oN:$iRHoHc>)^;7P.,ͿyG~~רꫯvfiQc[ 4GFzkYn뮓38ǵjBSF݃.-/L7tri<-$u1PV%K/uiXj2*@T?/w]<)9ewUnj9H qƵK/x.?oq'2FƝ~%ZJFȘ&?Ԗ$oze'!K5ma("636ۿ;?W>4tA:{{챇~6HVdR:G?dȷJ0 $EǑ"NtWA63Ng;.DL+;YpsKƮl&hrCi2g^q6"r1[F@};:6ͣF 3JX!)?KnRA?,M8b9.rmQkm7UDRR<^deE*F@UTIR#XwuGu䩩7p@\=CONųV"g/$9W5_mNO<9yG:Qa%pk)w0بw2ސ>LqE8SRiy yG{ȟ!+W\gBB_8CJe[yryHO9Gֈu/XWkզ&?u ![c$UӟKԩ4=ZLAlOVggQTgW_l<4!lQ۪&^+T@괈zhg1 C0 C0 C0 C0r[0*#?r$,<,t0l09CNxz@oVRc E5iI O(f]O>Iܾgx" !b5ŧzJ lF"%<<,&r8%d;2ͽ[rJ}k(Cr8D čqKB]4AWm`1[[mF x;2E#_tE]:I.E[Pja?,^`WvG|VN(̇{xG8h|ki{*U^x=o {\h\'D.wRyA˕<}{˵z5r/eoYfq!mJ!c b(\->f.,/%\iqHh;WYear-YЇw_GؓƷ!iq(QBTҨRBf'~ߨ4xM>23SqPp2w 2{W]Ȝ(`c�!>#ݵXi~L8O}zizrלtF Ae 5GX*cH޽'7%J <jk!q\sưf(&Ω4>K 裏.^>TBMon3f_y8(dƇs+HV]uUIҵaڍ1M=Jv2.Cc|߇Wz6|8t$ m C^NU].4'47ܬV첋s|BK\H|K;q!YAP،; CCEWgO~|@=l+_ԄȜg|]*$YggY'Ƒ k8YYk82&&%IqbjhD5G,8:T% D B%]T<00H:k8o-b-[3/"^GƬjo\"Q>MԱMH,vOP8u**ngw:8U&|iѲ"g/$9W짖5tX k3 u"SeYNxVߧqu5R^~_I:ܼ<Y`ci;)7.݇,q+}_veN>5"(]9yW[Zmz `H15z`ouFH_K!u*Fug8l`uNu֯1u8Vg>ߌ�%Ќ;�L;NԱ\Sii2 C0 C0 C0 C0r'f "6 >D HFJ)q?sFQ>}"Uvbo {‘*Ysj颜qǹ8h&RbH3ZʝSHI"M<.6G{n$Ϩ M9$XEJjH"]$LyrjQtgy3Jr.&0_dE"%Ӯ;ĕU1[^{H =`͹AZQH}n-RH"Ut+ku 2$:#T3RBj~ ߆oȠ%5i+{]n%Utר@<tM]=RH kܹx%"{z͎\Fj] *2şjE{VQ&C9{#Bx_+.;u>/x1W^y+JZ<rVBޥ*+Y<SN:餈/4\Swnv*F3ls0\<7\ss+ɮB EJJr;SI\|JΩ!P1BpE%]jW|7s-^H8Po]wݵxzuE<6,dlQ|P&?^{-۷oDUCܥO☻d2AM7(b )jʧEJ8v\s5cZRN4VA \j�Q8ӕl_D{ݟd=/&h(|rRBʲԸ +4,񈕼QsH5:##_n?ǜiYg跩s %4-ޢ}DJF. %T7|⹐Xf==z{?~) {<aX ??bNҫW_ly7Sn( +3=ꨣi Ӧ!v^:`�&<cHU)/&,@,+O-3(0<,v� 4wmecH4ȭ1RCySrXD+g>,xy?j "w+(>6܍71^Clq=Z{ d BO8d$ i Cr26;;S/~ː4aFh8Y:jGi,X1:f2BbVL/?p`cEK.9Oܳ^2*7 9gdΌ'dhfX% :ԍHF̙ШEmToHǑp4]2ldA~\~^?JAp-TFELEE#G3tXbMAE 2RB')Ry\I=G/T> YG _p"gWW+kX49~@'4-X )Qc :Aݠ4#Ӽ6nیwg5>LȍߝE'-/<:(c_:'fnr1@B)l< OZY %~t6+N{P~ki+yU<X'<6s5$=ƫ"L>;i@:.Aۇ4/t#]:-+8O޸/C.5#xN;V[OިSl^ѱa=6oIRM#dLu'0V]5Rro!`!`!`!`C@ͅ fxyi"%(m[o YXd[p#Ńz_sF2RoP~xѨXT aYFq;,BC=U1 [,bl r-W$(bgM?ԫy馋Pqzr#$IiP.仁鄘/KKGrfB.DV{y$q id#H 1od[WӌR�-Y$[M @326h"L~OH8:eEƍ7ؑՠG>mq(+fʜzv2Nj.CI~ҽaK@%쭫�i7h!@z3]J:u03lE^hGVR\%Zj| /o6=}O?3(; i0d_HGpiKH;F<LTs(HQ~�Բy6lX0n[)# g]?Ӣ/mrxnDA竮ʍALdV1=#=Ρv|N !. r>rD㤑ϸ1r|m{o T<ie3,1cBG{i3=~iqw_nC bEdL@yOϯJ+3ƻ{챇#re9:3A�q !1/Xx7Ǖ/Oqu^!^~rG; DMTtЪԑc2' D;yy@6M0bĈq;# H ch>'F lWRl8۠b@ȪJk7y@A=sxҟ#P@_덷ϗj'R I}v#dLSsiV kũm?|# >@p26h4}B%BIi2yrҙֿpOZ[*)'C!6;VB99')4CڏHu*5wf}e#p_x,$oڤdPvO"`O2TZk 'Rcg䧕Dic,X:ƁT:D̳32g!X|mdCFُQ\z d}=*[:Vߦp՝ʹ&sRC恍30_"HcL-#]׋?Wm.RO]ix}/tq6{O+kmv*tx+?Jߙ?Iȵr:xiqƯ&K q%Q8Cd?@iJ:@nI<2U:P1]q>ykxi}H ',X{Tj{:|9?M[<$/c_ ^Iض< OHYI-8Zc  8Pw}v*']'rPi5<6{4'{oāy =KքI78rlHQ~ Fŏ#8z<I]4 b-NOu|Ct^'"e8_?ű:wiS^iSl~9R,5`!`!`!`!`1<�%llXZAsK/SO=UQP ݠ$ c>gtM|M5j(ٕb邇((Q(B(?/UɞQ2((aBϋu[}E EIx&jT,J5FyT?-v<wR}+[Q7QjT[SO]"r(Js㏋‰*"M>%]U0%s.~Ǵ ~+ِWҐ(lf\4%"UO2x`Q?2d(y(Hs:gdm6eC6JbMT^SRQeqqs))QTu,TaG!mX؂KQcQekՅ~XH[LTH\sV%%7 ¼ YF+?0*<+ԋjCm'VÏk3kC'+7<BR:z,cJ|"T%XW-CZԐITXT́xV c~xCuϩ7gʼ+U4? Usj{~oq#T}'|(lV±CVIFOо3c~D5ZIPsu< ,v�u*e.NñUC6n~r;9 i|Fټ;)ʲ ߝ1r0^z=mJ=n<}!2yrV%-q ߗE])njY 9'1sdmƺSX%~$4_Y/Z|᥎]z~34(~밃5!s|5v}]bѦL9hSQ<GvKE9 Xq0A!>N3"sVitL}VUyJw#ܱ_?E8ԪZD[;!1buC!/ .MGh#{vɁD?_JIԑQB7Kǀ5r!*\z>,>ZirOk !˫tݺi-y@5ܿn5xdƬE;jI}ZIgUW*ڞм;m3|L6͐g,pk4:Iu48#E5bGM }b2+dNdU^*=V?icU0Bo@8' (Nכ:2t~%tw\}em}ݘ{6t1Xc::x q(zkVmKE~NYGTh ;"+$;LY C0 C0 C0 C0 0" @(9DEI%$}Tz饗LjT d#( 6LXbL? QYL^]* bf'x‘ȋB^;_xG٬6=y!y hUVq$/r]$!tu]'|S w}e/VzUЗꪩYg}BMܐ2'<sq(c<?eW\Q$Q b%CKxQDڏVCaD!()% 4DW\CP@>lqyHqh!zyg916PB ّBڠ04c<VAW>[%DѪ"/\BK}CXRy9ug 'X%s <A0Y]�i1DE 7m^^ʶDT-g\aJIR1E-!%!|r-8H;A0K2K=AhS&_+#Jb_1=svtYPDuDe6 3k 5#0thhU}o\s'ƝkETNxEhO"C" X H,yD('#V`T<t=1_ 7Cv֌w~ze?&i[n^{ҿRHb0yαk+)[E6*_nR:%v>Lc򗔾vٍ79b-O>AGux ޽{<]풀f])CRtB馛*:rl&45줮9T{H G{-ь3,=ͨOxGCX;tL20ךEJԟ+8K`|h*] ْC0 C0 C0 C0 Cc`OF`D (TL38nis ,2,UAH[o=G2 3T|Y4%)0D,t3)?I3G9xh3I 'e8e}Ђ뮻cnᆮ}K㏗?&4׌ErH ${rb:x9rqsYy/s1rI'y'$Fr7!{NHdj*ilA# ,e~1ggF +ԕ3ۅĤQ3!t<xkW! $FV;neuxA!b馛%~ꩧ|ԙGC3V)GqׁA*tvt@7JӐu{}.WCǼ͜Gtqf1x]Y0j㛼w$d 1H=-2ftkcW2* !~l;FC[o R3R<Bj:, cZ w)C0 .%][jWN/$a鲪AV+{#kQb BGjٽE\~HR4rd!]{Vtj]R%=([MDʌt `H[h|N8^輻 u gZHs2dsRy͐5^OwptGuXuݔ:=)ŦY'F5;"N!1q/Lԧ5 v)i|<޶R8%/з;'VâwsWJ_C=9vm}5?T,L3Jͮ2ׂ8 G8y!f_)4JnٌA: zrljmmh̙>H!<@?Ap܌Ԍwijgu6F}}ek/7b.Ӫm|<Z}RaOKYj,3!`!`!`!`SdQV/`BL_UOPb]up-Ⱥ[RG;ӝ2WA3JW~frP(ꪫ_\Х*#�a&Jv(A7FM(ab?7 M!7Nsd1KߜmͰa@dI9N=B>{A?$B(WW,¸fiiIw(H:b iR+ۃZyAvZRȧAn¨B? a` tkđq AV؍Ώ?W_mW DO>R^NeEJt~|7rq9ri筶ڪ%s|#e3jCy�w*a!`˜kurGWV(ҳe;ii4[s1cGe,9$n \!G�rL!dMQXcն@:-]@#Yf@F^N8AD}#_tTAqN/zꩵ姠)ǹR"_,Z-3|]wݍiuD|-[y\��@�IDAT @"G-Jx&"3kyIT#_{5Ô,D&!nߤwZ $=n!DƄ= }= >C>:Y^xA:;]ؐw:DŶnNcXkG�bAbi㤙b-V{m$:tgTxKK!3y v~`cӱb.իW<%@~WUtBSNf _ k">~=EɖEn]DX0 C0 C0 C0 C0#OƋȨQa]Rv G gu֚o{<1yI?#FpL03HUᣏ>R -3cegT6MME{=9/w #+#@έ n; swtiv+& %CI %$G ZH?Xd%d<%#;S;GySd>\vY>|SM%Ж@Iu#u72+Lm< 'VRPQmdL((T!'EZ݉�$]v{ǎX{GwjBx22H OS,ڱ8]G�Ycv#|MyG\kCk MLϹAѰnDi7\ PGIe'E�D}dfͻhpŷ~{I'R?W_-_Xd ?:Yh!!CD0ݑv%u\a <ABp$ N@ĺ_r!Lhq)A/Swh#~*Z8|frydqf0Z@'A08fzם>zÔ"k ]s5Cv\AY<L猗^vqGn:֡hSSZF>S9s .pzw{キ·v͵[/R7?9iٵ@7Yc8 yG!)\y݂!PD@E`Stn]p~"iC0 C0 C0 C0 C K2K4;0.uʨ fpQoo\xԲ80xDx,c!k&kc/2/Q,4 ~|7pYy啛:O<!]w좋.* 8PX`5Z{JC7 Hh '4uz8Rvg5`'|L3M5zkGqʐ1ʞ_DZU (Z<;OEF[<Fsc!Ma /kA 3t U4i^z{5-㏮XRuP}; fyA�#^xATưi吏zjgԂVZI铗$g#N vyڲˊO"q᧟D&D@qlRL>$3|: dEtHyկzj6<lVǑg*q^}:==knH^{D暫9Fw+IhnsyY0G}(NpIJZQ>O~q63:ټϥ  ChWpxSO=!GD6﷩]8FY:�]n֚!DȂ!)tw:ǚs#s=aŖ2M6 dy's='w Ц ȥJ_8)[7cxUQh:s1V"|*-Ϣ}曷25nC0 C0 C0 C0 C5dkpo*wL?ᰨp$;W `F_w_9Rum?Oa&'xlfNip%uF+; lwqm ^G[(;SSrv 8<s8_'\[n9GӬڎY4]�D<7t3b '0CHٝ"2aL2ʰadI'6!'sD`+SP`qG:(7o@@?\qG}M c>|#t[K k;zC '<)~dFVe=cnrȑ2B - mtF݂K|zˢ!Q`3,X ?<x .6Ȳ!d7|ec,O0nyE_TR^ˈ\y,Ԉk0up)J*DثkB@E VTF'25E1C#r%"3%;%@2x衢oE9EO1⋋:⛟22,Nsfj~썆@ \uUNowunN$! q_E&|~E˶R!`Ȩ!=fo#-RE=ķf vz1a5W7pCYVX[%3G}Fsԡ6 C\ \s[[dUT'[,]F!� @5!.꺘LYlIx9Nmvύ0 C0 C0 C0 C#%F+V]L3|jkRYsΑeY&52 !Y[o[( '$L226횰#F{!{rNСC~y9" ?Ch (C†"7ďQG!%q>ug RI蚡i:=uzO$_#]w}#n{'J{yr˦nZ1Y`ps뭷:8<)$G̳Y<I<ȓOvN AO#g1`�7vi;'C ѣG_+c )I(3bŞH S`WsΎ#O(Fv0r�NHq/JOHC|<SLT7? F|Bij{D]QrKVJS�@M>_x-zT89(ښ@C}2HJD;\]ArʸD=6;Ѯ3 tUNj!.ƚ __}Af-@wo9*ad-P㭺}"/g 8E&5\Nn_ C>Y;D6F5xdq|^j|Sg<spHph޽1lL0QEG"Cel 4h;`uZ@gYl0F:;p@W;-ϖB�=(駟vev]0COv%h̪*5"GVɶ657:C0 C0 C0 C0 Cd oW/tN9鄬p]wu0,b }- k:H60flxJ<MT3<yOvG-~jե^:7x}G'| oQ-t;ݓzX@-@/:Em(HT_|qAL}&V34 /MlY~`=#s1G=zW8j:_#;@-mŢB!"}':︬ 1 xgm6Yve ^MЙ+sEx0Qg,׳@* `~} N{nG 9쳻OSVIx C vo 6 1$L7t.L7H,0"H+ ݎ@tL .5wlL)v:l64c&o( \}|KE tx^v&d+UapҎxIdD?\i%C:y5gleJ S{ӡ#jArbh?#뮻;taBL:՗Gu tl=kAЅE6u?dN:i!`)0nO]Ce}ۃ,>.q-8"dӢ~*H!2~vP_ *|ű&W)D묳ӧ F0!/,%ٕU8ǜ֒ѭPNщqq�A=]{]6]mXC֯kED<cB C0 C0 C0 C0 F 5%$ʑ%h2/R fbh ݂@)naذa{;1Bu|W uY2cˡ=;bꌻQ(˟P xG) (( YCHG�k<\ kM?>Xc9Ek<^/bNlwk0C/߭ٝY �A-_j,E(oFJS�q/HB!"SO-r%AIСC塇r$y(.cK:O(.C Mdե8Aޓ{NIߑ^>V5Lx=dcVpM6Yd*)ř i_~2,83<7x9ϝ%0�w}Whӆ~pI|ɬU"d3c/dDG[i*raN%-D}|:<7"&oSE5jl.X"pQoqmjOVFlk7&騪2]v%h|kYTKd)E2+ GM!C_G+PE M ABJ:Gk|g eXkQS6/{$L wk\>O`�zՕT佌GsW_Pb9!Baly7և=o:d #c66 pzεq>J$u͉&HZj)=Bӭ )yvO=Oe9}}8N{)Bީrcyh4_.6";\ǣ+a0 C0 C0 C0 CdnFy;h/y"h?fE]nn;E5u10&B\f{:a (yNvy4%1@̛o)穋/ÄNH5w-�( n{7Fx"c$ޔ~Ў HP >!Ly/ǴC~G M"[ p#@I'$n~@$75'F >lz#kdo-mE:ÖOl,Ԝp}Y($|ST Ƴ1?7KSmv#*HQj~睼ėi"~ne,ddM#RS=h BGs$6u|ud }q34m38O;fԠcF�iڄ>@{O6�X r~ #jp"U=at(Oa=NyPKn|9|<.y> rˉpBSii#�)NyeEe++w:s:TLN>Y!ȹu^>!Gʵ"EC~S"6$:} LL>`yH>L?۾{ּbwdCkq  3:�1{<{dڸod1D�mIyi8q+'7|1Oё#G:$E|zIsG;$tˍq 1<@`Aeg6lӃ&dK,?UC t_:yqQEN96X0FM6rK7 &C0 C0 C0 C0 E 5/*"}WP8nޛM2\prg8/r,Nkv믿߮UR JAhYTp=).,ojn:)u兺rP_RIyq΃}]w+o o�cJҢ�Pe޲@4d%mĈmyu$AZHF M_Fx๚ʞ? O>B 䡇:G1 SEqZR`̇1<KQ0eclɂ!;k=T(.,"/袎c% ޵j%,uZ+y"mHc dἎJS  m\c0DX�!ȾJcDEJyC  ; rO>zh`"~؜ "u ̳ Ɍ2[L-BijsH us^vEԏ]=c+oLV_]䨣/ݚYm5Q"Κ- hΑeIEuD([mU $5+#l. D �_":qo%\RIХV\>/ǡ }Jydx|c#7Tt7K'z>Pol^/gO6G{H{W5oSrTSMD[ r�5 /(G 17=>!uϟ\NO=cYӫN}9Ytp;zh甁y8Np|^+fzDFש΂Ll/LTǵo8 C0 C0 C0 C0 #`DObr'm?dgub}L>zɆnܗe G}Q䦛n_*."j/Hc,KO_}%c]yen^c!>@�yZ}5֐J+u|y7l㱡8B@!diqJG(|~fpF(2xMC"@JEb<zgq&ȑ̪VZ~CY}g7:׍؝B�%oC78(ny)?](,C@EۮE0AƇ>E?:8 HHe:3_CC[7ߔez'vdcQ|8!`tDA"QHG)8rH};V'/ybHoƼ "Z}qN*cV`P7ʎCd&1}=u4/G>L1NA'qŘj& `DM�^kQ˄n<x?MfC'AE#Y]CáF"~iȨQ"==.T B;.-C@hdEo"dE<?8QSVJr9HpsϹ!c�9-r[( 9@A8 cCv\5!iEqdBȄ,|)t\=Q l^&_y6!�eq<rx꧗{={/G_T>O{waT8w'k<#`FWR?o8 睌&l˨jp،;d,X;<1Dr8פXh,?;u' ϡбbLe`EYB-R7+2Ϣ, 2ֽ8 D'!_yeEC0 C0 C0 C0 C0"Ȏ^19oD�kU2}58R�e\~;NW%s.(@��!FjQi<1CxZ~1^!\qſN]mСr; sm GEBsBRʷa:G1kރ>(A{ڳqa`Ԁ� (2Hً={͞W<̎=PG M1FptF#@~NJ6n$$3&^X "ZNRhhu".G:Q.+=c.(e~ {4 JsX>71"ܻwoG Tc<#U/$*_5dk)$ lm޵!@[C܆_ (|1HrJ&qcemG�Sb}ؓ>r##٥r=`km^ȠAm K!P3&O K/tӚak1|rJ|k|*0,%Pv{Kg2䪫Df[tPq[w߉콷mrS"8_M\�^~eyIqi5DXgQ8d9H-,(c):^0{5AL.gi?Q{}EŊ@p$|\F=r4 PF>M^\ӵRCwIMN` w}j-h48KD'>+Cǘ82AX=d[~wL5@7΢[-uqA�=9˾=m4uٯC6&.|kUCt:[8Ew˂!P O<!2pÊ.Tk!`!`!`!d;|qmEE Ab, .\V}s/�<˧T#?, Uc. Pހ�Bx- \˺ RH<:R- (] ]<22mҬy|"@El@B߼RA/㛲6Mֹͣ{ e6=Ql+DVxRH&c_ Mÿ`#cw6HO<D5\o@ !r-a.!oFKd{@zl_5SeZQbE VO 8Y<镹EWLA8I۸ou cǜA@Γc; [4KZ^E^x'A$*/#T۫:~� sE|ȑ#{R>aHa3{ I$e4qnI'5e|lp t 1!k=䎔 c0oeq ㍧ǎG bl/Myz輩U=ŀkyD?XYϷwu DnKGhq<u@ 䮻f]f9^Tm,4 9,QQB&ɯA�) $z!# [@L2dq t91 t{i}v TaQNZ ĝР 1\ʺa$B6+eT>uykI#|˗[i%)Ae{_'9C>wT>.^>!�kf{'`c21۷{= t5hw-4 _u,-{GRD+1^o퐅C,s(_gU!zK[ ,W_gv^ǥ='uoM4Q݆o2=6h9Kϋ PXGNr9@C0 C0 C0 C0 0"Ⱥ랇/TdEĺ$o_e�!|T,XTbqE[yef%=HPBL?N)^ziYeUdVryHsӀR-hR.PzkBb5\ e2<s!YB8DYXB-xk3@͓P(FY{=IO02 B!i@y<6Ϯ>+C(Kz%{WDoq�YfhMp=@~W:Ei* pcv FH~a[m&l"vzA <JB`l Qognx0hs {6ƃ0V`76_vwa0c9Ğߪss,O{d<!kP"9$$P T%rD!J\k(27_)cްQ:7%%h5T0`Y??nL4˜q?{Q*mF4{O`^VKLI#w,E:4e1B&ybs><*|rfXW XnW{n_>FJ_QQǧ\eVʩׂ!P-*u2+rQ"/:?6ZTMBʏDyDT~Q΢p>_Y @FG@?dygRq9*D^ncXZ r}/Dw|r ǻB&Gu4*.;C9/ a�uY<zå2|ctƐ'Kqy=2rr9Ϸc) Oѣ$<׼lY?{ΡXXAeqy|1Y~ @`qĂlC c6pΚ|g4 90&;c,FǞ -NK'A �ge&=L'"@SgGQg9'_o3bdaL{bWβb-�]K嚭{۫Ysʋj5{6<&jw(J*j_+0 C0 C0 C0 Cho_RkKkC5P{ꩧ38(FP,a>Q\CzJ[(cc܁IF@Oҋ.,nc!BLgQN";)| j,N7 L$o(Hnw212)A|ec@96+Pk;_/sW\JA;PʠA7H1JK6P6ge8('PJ8q�c'-(UM[;c{i&pT< on_ʸ1=-!_f̈Dc|/ˎlqesSCi4Yf<J- @"-G^93@1hicL~~ϳ̃٘@1y| ct{;n(a Bxgm6s){rH!wcͦ8tG֎d _gSo|]*ō i*6ڣ1moS\\.Qsin[ 1_ܞc6^6Rn9 Ih{ǴR<Q(qCeib(E K݆@7Oԙ[oͻKZ0F%鮼כ[׋`[cD4%=+Vt8*6 2!�($K.\tY.;%""+Yܾq!f  d&qBY`+3Ae 3r>~%.SC_#3r}dIq9c9<5F9J4y='d2C ˅6ƘW^a4/Đ oyK^F }|彜>ߨg://W63i_*mMϣk7y~!K<oh3Gߓu5<)7hqL7ꈯ+XцfY*4sΚцoL4OǞv<ݦoȎC2;Sޢ_uぺ+|]_gS2C`lA]'^G:$um`\W1Po1,-85н 7nLkw )*TUǂ!`!`!`!`!de@>Ki5`RT? ~,ⱐ< ^y7{ iՐİA2\s Ot��BH6O9Pl}9`A(Zex<7UBL6ʋbG<vOhf0N8\,"d_TW-=k {@BJ�^+pۣ`MYg_zL erJ lGǏ9'6@QB$O^1;34 dݙ7~iyT mw$}�o' ^QJx+A8 MTddh0JTTPR)2EP22AE%CƟY*)$=g7uusγ>}Ϲ{X]ߵ>{祠dyu5 {'8IIP ZN-,L~,_"{w�{QR|=|֏<w<;\;YẤ!gst&/y':}>}&7yd 80խ[73wXN ͸4?]r+ d?*b�Y{x/sbG }&41:>O>wԝ mw4g=&qg=?^{B~ ~_ cn3Ukq$ xwcyO߅z8}% }:c߄lD %7ZwOA n/>M8y @69yml^1f Юl55y7ϏL9Tm^E@Ƒ)C%Kk2>+vVM AeHF)yؗ?8$*�,wwd:~)sqJgb߼W&?q qx+3?>S'}{ѓ6^{N<?A^5yw]I{fퟏܿ=@ PDspԜO>q;35~r,l>9p3_FRd?l"g5WyN'gɘ|<# 2`[Ng|jS7Y,\ktޥչvyH*yjB-g&ur;\9k45k9D;{[9{#\]C]F<t*֮n7f>6 Av3f~0!cd8pphHs5kY^ӄ9`C}tbc@::΀xIq:sB@,U;&FctʕK:9Y' 9qt>y}8ItbP\#rP qL:Q8ǽN(\N)Gq⧳YqRD䓋ɧ=@ׯ[888?S ( D.%K 91AcGs4Q-RFxs:t>2?'R rghs|I tOg=;�Lp#<{+p'r=z4zxp.Qr:wYb޵($P Lsex?=-VB ,0g >ЧӗAwYiu':>you;}lݻyÆ4N֧W~oe(DB~k5NҟF"EI 'ALb0P|YyeO8W_ZE#!&*J�f(dx=PIJ跠Y3`jwOk:>)>_ /ږۢ޸$`_Xľ6*Og,gܾS EطF2C!u>w|fZܰFeg<)&7uA䓚2gC3g3O|":BˈdbyN{{.s9gt3p9͛Ko ԩ WCy;# u<\gb-}_5=ߏ>_>R{UӒq'w=d7}E=IhY!" " " " " " " ":L<jrP!&Tce"UL5*+'`|~B~2\9+x݊y"pM4= Gy+I<(" a# 0Ö2{LncrF :cǎ5"4EB[HO'|sr=!ٗa&8UXQH CX\ Pn]{͛\|6 AFXO{i`?a&Agy/" _ 0@mr[EĻ�Ll (#2v2opZȔ\c�}0oa1Cw{ Y J,Ye@ 8Y[e d60"/G{&E0bj-"\F7Y?ɓV[WLF`F;ø /mm0ѧC)9J@xϢdV 2o2R$#P*ٳ3< :t�.V|P"a}D@D@D@D@'g&%NG[B`ӦM BӒW͗/y]5j0Z ``]2�]m # | o䄸 />v[�и10h^ %@ŋcea VE�Lό*Svm`V`"\ۺe:fGZ{$98`iejWd ̜ t u^,v*P/YGx_ے%6 [`ֱO[ID@#@Q4 <hb{i�?Lf(p;E|GPp`pÝe_qَv|Qw|6" " " " " " " "oTIG ]:曭h^" " "0cǀwJfu6ox޽Gq&_~%J8sC7jSw}g"g 7܀f͚aid93�;;' d*P>py[G˖E.*A$p*ܫEXKID@D (f@6Ai3ȕ ӤV3Qɻ16:B'PpSO#FXA *E@@&Vh}J"e*�[v ~ TfƍAllp�8g D)@\z'NʕvС�*@ PbJ"N%KZ_ݻΝ]yؠ��@�IDAT@t4:SJ۶vr`*D֭O�FG diЯP@LQA" " " " 1B` OŰLIzH*_<>C|'ذa.R# {x)@u#3gw(.Ѫk0hpV"8<�L[hIpk#:uz>1�  P�-> rZ$@,̒%j:N`F:#w%^#�>CॗÇwSM gN%K� Dv*t�,_me@ }70i/_%@ 7Ln7upHKT"}�W^ rwl%"p옄 բީͅ  cwl%" " " " " " " " "L%s@ժeh'W$A}f)�9v,F7Ĉ�k07 |$" " " "F{J2ux"(Y"*�u~ѣ(UyGi>|aC<u _oa)ɶt[ py@v_i8}_}U@J sf"4m ̚앙D�':ЦMĊUv^�]WfXH6 A&k;+0opq7![F֬/K%. =x?>v9D{` l�'Oo_mE`*Uxط/)/?h!vu" "p;x}Q#`:O?FVToOL޲I�}p @1ȝ;S7DD@D@D@D@D@D@D@D $6{ ۵x߰g E@D@D`n;lYm۬0)"" " " "YH˝۳0U!H6Y йsg#TLganP|y|DC0h3N$eˀ)M70q"Oa3C/ &MZ_VCF|S� AoDCIa[,YY Ԋ\`F>4axa``lNg>KA\tQȓxA׼d P8�P XEJ" "p=v\'󅈈@rB@@͚_"pЧРp�$O<T_\E<]nw. Azm<k'P=k p�'Q|pa`@vmuqT  Arš_ ]"sՑ#GbժUFqo` o Ntj@׮l̞ |3v2 81 ^$F ]:`(GM+ k T_3^@b;R֖.mY̟K^4vj9x#3F:|y*nۀH0ݦ(XвVЖHQV p6֭OڠEW^ TO4P" ^%СOt0Z)D@D *W/ݸ1yH27ߴ}|WH|sΉd ["E 77BD@D@D@D@D@D@D@D$VM/1dk &MT+W> /w4," " " "V/T3)օ ]t 6.\dVP<`_m&vrXy#D3|K/:vv׭AV<H`p+r8(D@D@D8{w!q pr  [d D#:$hpVL�\uШy>5x5`੧—r0ڃ?dŐ0�uwc`%$Щ0vgq=bW `@h`Q%3XFl*A)ŋ[1;uOݩ&" " " " " " " " # !H﵉/,2֡HX(T(W+rHTD@D@D@D@M|99MII`ӦMȘ1#-l}_oxӦMC2eB'N}R ΝS ہwߵ׬LӀ"͚#GKSRN'!Cl SOGD�k"e A/A~j5ٚ\d=BEĉ6Bb)YF,"$)L`<{脗@J6ˀ[W 'el`ƌu*[D zyo_ _eD�. Ԭ5'Iॗ f*+ 8`k={,^uv@[�7VLHM{Ũ<sz'" "|@Z%�s�> 0}v| _ ke_PQ@=O;vĺu`3m^{ `"(BR8`"{�{y4ZcX*4ANѢY 7�矟C}7ǏIZ*ѵ,Ybƍ:EL AFJ:E W.l >}N׷ Ŵj޼M|Sb_f@a[P([I@08`9ı'%9|&@ÆA(G.0 $~$"PWA$[>qGFE@D@D@D@D@D@D@D@D $}){w Jh%ؼx1I}d'w^" " " " "@sNϙ_vZd VJ@|0n8,_G*ŪgϞDцȜa;�۷w/yʕ]v숎}*E"Ibҹ3@Gn%-͛{opt<o%kD !ȬYÑ'+.lE™oRyQRIҶH(YNtR KLj<@W"ժ?Ǝ0 j׶}Æ[zR!"I5 xHE@D2Ӧ=y'ءRE \xsJ"i|9#MZ'PŜ<[;^D@D@D@D@D@D@D@D@D $m*曁&UUD@D @Ӧ0"'/:Xgn Ӻx֪ٽhl3 A&*%ŋɗotxWp/J!p@vIڵm0\whв%??p%V@oLg* CD >=jWO>(�Ʊ3 ԭ HL.Z$g9x2D*ot:֭.mڀ!o p0})o#G!%#]'qc+M�/aﶞ,`1JufŦÓrOۥG+~+ﴏ,I>;yLKqSRK`>{d\Alj@ +| 2,[+J" " " " " " " " " AE>�{w;9XzР!Q8:c@ѢqvW(at$$ !ȔLgfB53oD?C2Q#P�м90jr%k0www t5 ر#j H3 ArbE.y')HcP HL7̭Z#% !HoѴ&q/9sx4j< LS \vc޲d9xhg|x`HᇁOKN:VD@KQ :7z4p]#޵U@B e$ !hPVI`?ŧ}^ud8�$" "KXg"Ea�:Z,X�l d:" " " " C̞=v꬚FcnjH(QD X y1cJd0QfV^z g*y@@eItIs�*8g_J" " "ǁ>6utIL S͛{e$Y?N.T/ˣ(hWY vTOlxPWdt3+@ر[=�S�_ Ԯ 1C!`LWz!`ؘ**"cZc�T]`q�}g޽@z3YA}t2ˁZ`X^-~=hD E:Aǀ_:j�N8BF `jxuRZ\" " " " %8Xy0 R6oތGdɒ.Yb ?<&NK/Ԉ%}^='0]�u`M�\<t&qcPs 6on+" "˗;wZ1I(V =82*MfMS:8֯.7'#; A&v8Ձ6maD,_V}f1 AyP0Bm  71H�D PL<X҃Z@UN'1r'PP%4"}XСm!@!\�G N&3w'δ>cF੧\5" " " " " " " " " 倗Ѯ�4(UD@D `~"ѭP2ٲª@8pVYc#ZM6/يJ&xgfuYW^y%4ho۶mKu:=tnx}v`tlYW� wТ0ie{dK vm{Zw@ P-6R(B0IM"3dU%0*P(P~m:|M``>`P- n]<eL%U2�gb јQV;Y"JzvA#Ч0x0Х LNK>{�5j�7x?3fRGyhyf[7ObCΝ 0hD M<1ԩu$" "vkY+?8W_PeU' !Ș?"Bٍh#ez`̙Ɖr N5ʕ+ & ݎ58>f~ F` !ޗ|(RXX4q[#>"1s%�ڼGTcছ|_Wn]+JlYċR"5̚5jũ$ɓ.x9"!ȳ46G�<xذ!J`1;͚[;w �UYཧ{wmkq k% >cqL d"` wn+re2."}Jl OW1L@B1:>�8v,icC .J" " " " " " " " "m.F*/Z T@J 0rѢ@60Q?G#_t)R 3FOIF_~^%РA3 Z3ӓ+@2V�]� ]wLP:Pۘ3` %6sαy�v{mE|g]];k:_|1{0o^ʎ"e|wZݻݱIBpW oo^ o4 ҇G1qT�i{S\gO`ժ`SX$c@N+"YD PzBBfM`X'_|ocpS'e Hmo(P `P]D@D@D@D@D@D@D@D$V2�Fى|I" 1Iq{_R:0caL-[4 FyAID@D@D@D@HNTpdK(Oٲeȑ#|r>|+WƐ!Cp8{ P^=``F;qg& <{{[~@:b͛tVH+g]#YJp3'>:$!H/&�@n%!H7d'̞ sb{i}Z ARksiMNj@p|ukO ;o\z)pU�%x� :vbj("r��c g?)^%л7Pp^Pv�n^&)pv>ݳP\qڢu" " " " " " " " "9ۘ˹vmyv57;_ہCaIM=#]Bѣ੧2ED@D@D@D@KBٳ7O&,Y@D@Ŋl2 6,\y"Xv@r@>%0}֭-�ɀiʎ%Es_ tK5W]E@D@ @ٲǍVfݺvr+ d, oX=w� AFU PbkO>y}G \}50xs@.Q #@6KXA}a{>Y$"  @iӀMwo>nۢc=�c(8.ӵ+y3_"+י-禥*[D@D@D@D@D@D@D@D H2Z<}}wE@D@ )p:FZ�֭nv9d ŋ?#ؿȑ#(Q=BB%QӧGCٍW\GX ^q…V49V�Ί$J"IFoi'g)J$I+o W.%p @tg%'&@!ȬYmcX7q"@zܫ c&Gf6nLx ޽5Ͼ}S@P Āӧ e#tPiժ^`0k];{MvX|vyi 8!:" vP;6T/Ȗ fNO0Ϙ<__{&" " " " " " " " & !HKu cWuE@D{?\ru Wॗ-[#Oo\&l D@D@D@D@D ZA]/m&!(b|0rRjU\2(,<0L{u�O<)# 8J"1۾}9s"V2axLy�W^i%&& !Ho4S�:�&&kS]3B@<-[Ç۠J0Ӧ luaZ@ t,^l%sRR /�ha�ڶf}uTH�WQzh஻`_&6@ @1f%p "r"3'@!͛0$xQ}MR`4p:'>trS89p8�GVlJNз+V`&2kfJ" " " " "` pT_oR ΀VFk׮hԨڷojժw s�2g5;T{ʗ08)嗭@ĉ@V2nDvTA#@!ҟn˖@,A#" "kccF2{FuW_2Y `bMsؠUQ%[0cQnct*ۻ2dt C)2 �NV-+n'jB+�/ (԰!Ц РI_<T+_1 }}v_WGƋ@@0~o9r$6@X E5ke&)" !Q&7/0t(p}0lqLt֯OQ֠bm`�q.L/{>cq"|OU`:_[+lo9f0)Q䧳sFْ + ^'kh:(p)" '`Ƌ0s&7t\\3W_}5n\i/_?&_WA{MBIҝx/X={6L*UcJ:Fag�yNV`_ɤIقcDX[h Xȝ;R%D@D@<@`EƊ(P`aB:OL($~&_ A߂ 2Фwf^>Y  uЧ{a@5pP!re)g*S*cB7kPrPDFbwi [g=d�6)ZM5?4=>6mѣ} CfB@@BiCSL`ؾ};v؁;w-k.1'$Ͻ&b?#GYOBiT?e4ъ0,YotDWYϬ G&%qNH|ѣI ~f20(8:ɓy%?˗w+97FVD@D@D@D@D@D@D@D@! !HwTF'VWE@"JƏ&OX@vu)+_ҥKQT @!H_$a#/$tf&g.]h߾}(̈́>!gJwR&@p2`ǎWݻ[aH �G5]^Y0�/{r%H+ȕ(%�E:6 M;zjۍz5mI};d'm^":O ?,2z-Z�+VD vdn+3Ӧƌ. w� TL(޺V/[+D@D (Hx1PP00D bF�uX1XJz +Yw"$ 7n^7oތ[!ǿ+.[l')HÒ%K&HP.̉|߽;'n?:Bf "<>O.q.~ʕ+O c򸸉R5E! ,B -ZŊ`d\h." " " " " " " a"0UFx�+g@<$" "| qg XAqAxڵ3u%Fr7mr�r*.%J0˟ã>?L䜦IUW. ,\L�aR^{ T)ȵVݢM5㭷5!C*OD@D 6m23LLad*&)p>L;' PRB6ĉ^@ݺҏ7[" DL:g3- Κ �+'o&"&gC9$9lSUF*[H )Ji^J" "D~\&4@DOF =zD"w)'`tBIBg{ݻ6l�4\('P1PaiHv2t )H % R:bi$w grپ}{s۶mڵk`f\&!Џ 5YT)Ν;-fXIfNMS Eν蔫RD@Dl^~x%Aছ=ܖ4|pp@lСBljHwMyTHg5%oH.u:u;D 0D{a s U zJ[_JTW!!Px!c7eG eLywx@+A$%+ Alޡ!`T; nn*`t A&(NճRqas;MZQHR^ID ƌl|o͚E("  V ͛߆{F*#l 0bDcݽZW Azeܱѣظq#V^UVaݺuX~}hٱcI(H_ /UTAѢEO. ̓'}%u(p=[{ qn6?0B~g#t/-KP\9\d)b$" " " " " " " "p&DkHoM�EID@D '>ƍy 3`oT˨gO?A """ " " " $@!HEj5q\~X|9뇎;>0^y);eLd _Pʳœ GӦDl=vt|Ъ(\8vꮚ#0a(N]RB]~kESO k8mS0/lH>}lO[C;?lw*U OED,Y[nVp-X1&"d˖�ۛ4N*ED@M G`7'qhۡKKț_XFp+?XSs24L(?\~駐6h^BPlY^Tx  )RR|D@-E=7lpRsغukI@$ۛ8 (D@D@D@D@D@D@D@D du� L9tT]iF3΁kLn0caK=z@"EC-Oe$" " " " ~ @!|`l :P{$8rH443$ژ4td:&4h=ceQOnԩc'p< uD yel4fQ`xW!PE@D@@cBǏFLa ]~K�3' ~*!HL'!ȄDe @ӦDB κvPB ѼkfTY+� %TQ& �B><P4@1\.rè&0vlxm+@TyȔɎg۶ݺX ZEqey)Gd% ؿ߮WPe+Lg+WbΝ6VW~}ʕ @RWP?$y?3֬YիWAǚ-[veʕ+J*Zjy" " " " " " " "dH8 thf2G " "3q〙3a&;07/ĬY@3 'E@D@D@D@LBYxB'޽{%FYf(x.]B?yd͚˼pPX0͏F޽!C$NƱW[oYѩ|2VI" " i!` ]f )@gp$ @!Hf! wOtۢ">ϷM}WBj <1XU2=ooL/� �Ԩa(@t| gcR0"hW" n=m=ܺ&&ݰFe@߾@޼?TI9l$cѣGCBL$%K`ٲe7l+қN2eʄDJ&/ (yW -gƈ#̻q*T^^{mʨq@H2` z:k&b @P%%|ufF[@ā]^z!H<E@D@D@D@D$m6m ]dIcΝӧO7Ai{5_7 9nl08Ü@1Es= N0d,D@D@bڵy9sL;opC 'W]<薩,a}xYoQ/h xq˶Ŷ .�xFgn݂R3CAjU5(dCw4m H)+Gh& u,>ڶm^}U^eN'x1@L:N"AFj[r;+VO?~<`|3IyY_U"3gXB@>i3I k|M<0dtPh:LT 28SD@D@D@D@D@D@D@|O*@t0*. 8q":epUpaK.8nV1ȉ@/2~g<sncP" " " " "  A=R+:bv[(Rt,YBSN ZUd`p"tDvO@ń;oOsv@D@D _9 SjYȥKS PTBorg@ǎ�eh|#1M�{`'P&0t(л7LE@N cF+>7cW^ڴ緂|�޿@X 9Vo>$+3ε"~{D}�|,Q"yn5J"Zq[_)iށ_AqZj7n *1c`~_]t^2xOz\r%S<x\9s Ezk幪$" " " " " " " ~'!`0s&L`p-KE@D ;_z)@~-62x)157\r)@G@�H2�*PQX%(QdXl1܋mۆF#W-&Hx(@ǵ$i%0a rlI+K/" F`:)LK/, ,X\tK_%6x-`>]藝T9~<=M'ދ.sߖXW/A{Vp@wZ@j < lS'uIE�MLt~;Ь0~ન i.~4<,(P #F LBLEzfVi*'-(O+J>!QY[om޼[{KNKQ:VM9{<y.<z(xү,V?[6_yP0�f+"E@D #- n |1�г''%pPV=8qx F~BTL2g}Μ9Z*~GUD@޼vr}~>}$&: ~EQQ=Z@D@D@D 6l�="#KpZpR<Na@74M8BM^^zgD>f@ `Mb)% wй3o}˗7`u};e�_yh>Yj:@*WW6nL|_m�5Lڼ9{2d9)n_ AleSXoQ-o"-[Ldԫڈٳg(Uٲv <'yns.a<yn+_aq%.G׷9wn*MD@M}4i#Lt}3� L^5vX 2ĈQ5J%QT%KV^;_~EBa 6l~Gj0~\'`9gɓQ-C\7K�'Иx,e}ܐ2]D@HA`v gL#w| p@3"͖ͅcիEN>=P];`>[<[ҥ6Hmj 0p4EgaSW\. Xu"6A*p@ v{|"`�@ʕ/S%ԩFal=қc$F 5k*9rfB:uPxqf[=[3f j@`V/9s,]<yN9s缒x :m9;:ͬ@  &Р?ۨnx(^r%С[&\G=a�MF#�(@…矛 =ѥKvm޼+6my$A )`QL5+۷/@AV$,vPD@Hˇ ޸jL/N{^AMLwD\͉3KƊ 4QYQ"L`XD9%o([4Xފ7j2PPٰ*:=UӦV rB[,D@D mLK^g5Ӗ. �s"gM3<FY8#=Ao4N$5Lz+j"m  Q@oȑR7 "J<y.󜦟(q<yP/HEdS W�'I*_ЙukH`pIی E 'Ν>G H`PsNV8afo(YdZ @gAf<`#v%֮]dB4 \wd mpՀ&F~ƴi@j#" "~fI(sadΜ9Pf.~Sr2<cK1]i埍{�EHʔ-5iE=ڵظ16"'W\<;4QƯϾP[M2%0|> ARhU)]E@|I G`;gaC` _VCFG /� xf D(66 Xb<y2z-[~Y7`ǹT s:yx-P/H%cdKl\0& 0kVl]ƍʗXo0j(^HGhn݌ e \^0I68yAD n݊b@%Қڵkcʕș3'01}]Y'SA}:KyիÜ(Ue@sمD@7c��@�IDATD@D 1a=Ȕ)Sbi}2 P[Ʉ<E̞Sfژi^hzg(/}aj`;&hp̀ʪb"YxE 9a|B\3V02 UV5D 1 $RQ\Dؕt=ya2 v :eWS@UGŒjB~/�_}U_>4,O<1E-<9ߒ>^ k׈xq-Q02u.�#U{vdH?;݁Uo/l:ʽucƌnDqf8JIJ`ӦM,$V;H"XhZj[n}űcǼg,`;Z$$11198m['(" "*7F̙S:EB;t:}?p6vqDqc`ҥC/3(wάX!L].YcڷO]:JD=F'۶}\z)0d35j�Gk=+Ux@ƌ7d /ͲPD@B}O?m==^A:v[޽OUz4'ә?ȏgF2e0c +qmZ9պ"*m<y Z5k%pzn*U;vKӭCe V```N~+ܵ// 64^$" " " " "`Y% <(%K*T(<*O�C}F2nΝ;=e,ف9suzȖ܃JॗݻīQH A-*!ȴQ<u4 9G1H%N] |ЩStKM)s8q"5G> A lU)t z `,/Om7?E藸};EwGk#T/*"A֩c5-]UG[7;ׁw9-*}[ZGr>ݞ F8DF8h!ڶm-[]vXf nvcG@Z5k^3vD@D@D@D@D@D@D@D-t=I S&n^Nna='LF&G 3rt 7aÆHfx/�XL'>g0yz3mׯr̉>}Qi8@/k 1ViU7"~1/ݧ3nu5`ɒ% {rеkо%?oR Щ﫯QJ|QAGbL;m?믻gKR%aKwe&[Է"/XN7??͐㏐�.|dyn[/'5pYRZ -/<NDydNkQijϔ{udW|~ヒEG7CzYhD@K}tm:01;֗ +K@)o[Cq .[<yWۘ }\h:[͛M$*KD Zu 3gؿ?t 'sx|)yQS{ h:$*znzgfJWz_`G;ӷo_TP۶mFR;hW^z)j׮ut6}:Fٟ#�F118<^+QFpq#U wdO@ǎ# RNNڵk,X`j?'s}lzkx�k~}T)` fͲaް4i+V\i#F -1i^*" " " ";8yD 6mڄ%Kٹs'/^իW'mH%23;i… mҺ(�+B"{<yrJU^! PӦyò}=k\v7+z9Lxhsw^I2vOr{RJG & S(pdG2E1 A&G[IB ^b)E�No~B{ČG0ȚbÔImhRpiEck|mX1`�y0A3|�qo_ԫ|MQN;{YwoHP" !`4o @͚!<9?Ȝ5>t0SH0hPSUJi?Nj?xf28O<!7kD3ذa 0?cDaTb2 (>-)*lBOH V| }Q>W/ſ])2,yg4w!ּD@D@D@D@D@D@D@D L7x%؈6Ɋ`G= 9F˔)?yGq/Fc$ 5pPS)v 0א!@@f06ZgɂŦQ'ꪫʄ诶" " " " %@wEqI/%iR…C  }9pvgd {裏#]vٳ+rO�'КfG۶0ImzڴiZSV^O5n>}W\29lH$8ŽX%8'"%WR'%F x_;hx�i~JQ `Dbn+R]0S8/?e@K/p<AWK͛939*/88}:c05cV!udlI.N.3c[X}Zg6qEUD@O o=�I7n460S̸oyrؙ<_x dh}(Rk{W3`Ս52A? ڥwZwCU u-_ f(A tXti;Q<xݞ_hС!7Vߺu+fϞLF/uJkq5$" " " " " " " $ %hVYg%pMsb$[%`ĝ \'Nɣ' HFʕ+W*a~'fbe BFhsDƁc1F*GcDq+si?> sLW2Qjȟ??-`ݓڞ6'3 N&>#OAD4j!7Ͱ<CNG߾V,d$R_{R2ƏB%Kr>]_>.a0%LRI@ի?~*^"p /3!=Ub\8.7DG@ H2QT�o׬ ޜo PaCWۭcժ"@IO wW@1+›jr"=G%"`/+ro]dooqkI4H2k$e~m `phs=$<Y&0y< o&-幱gcO0!tiӦMA_^;(PkJID@D@D@D@D@D@D@I XZ$"FaI jE(eL˖-tNx;VoIT1bD;&)R71};]wurv=r Fs:nQ;̴eT86`ժU<*VmۢW^&кkݻw… Cǰ{ʔ)!ʹs^3Q_2b Bo޼/21x/^O?IUv9WلMdY{´xz5pU0 l 3`:ĵ2X$?#slƣSc\R." " " " 0ά;$�l 4:XJj{m`fv.٘nO,c*U*$YB}Gѳ@%I`:;Y3:t/(,MyBBŜ篿2~_<4XdI 1(PउIr"Nr3({2)}f͚={llҤ ի?)B;яŭ ӯ dϞ }죿p-o<%slQ8ePLfQq&NRx*" a&`拄R\!ȳ<pFrqf;ٹB=D $VρދNyi)(_. c_I8gJ.][UULD Bw\^|X/I- 4o|3ϭE %Hf}:~G H7nhAsuVt4c玉'ccȑxh,O>/_=s0x`\d8FM-Z*9A{AvIgXOXfY BE}ހ6ƍ/{+*-3Թy12ԳTR)=KumBG/H2rK~)m_hΜ9w6l.PfGcǎ dgɓ'juߞUg[?c!%nc<Ğg's>@I:e#4?Y?;qn{׭[cL7~IVi/R%ɖ)}IlPDSTG?e_hSI_39{9z>9,w朙y֭[me_" 6r#<ҍs@ c_OAߧLz:Z J&7sDvDڣ}ˠҳpR9l)[qiƍs-L0Ybc"Eo۠ӠAwޜ9s~g裏y4j0`c *u>Swe˖9H<c::tp1Gwe@us&X`?c˗r\ς`qCcN4N>}t۽{s:~A \r,{:q,@m;2ч$ӿ(8%K:Υ:΂ikV{4 |ڵ[~z" $0uJ<W " " &c*"P } Xp1ϸ3 ]fNungqFrXMw}H&XsXa"t 5~s5kp … GsuPɒS_ �M4~ "tzHr{mٟڰaCD$~͛;۷oZ߫ J:˗w,KcΉ'3Ƶ172֬qq>1gvǜ?I8Җ-[ XpN;4~=<Fa\n =wͨ,=L2|}EEҕ@Ӿ;]q/"2Vy~Ɏsl>8[mAt0ǩVq;[@=NY(>ĺ2U�=y$3L戀č�|uzֽ\u̞8!q)]wmNǎSw8cl<۸}}uyw[}N>&='YL,c,_vpcC Nn>2֓CD �q;ϱ_~ױ581Jwwg!XW1]r[F&:͜C¹>%{+ү% 9r?DŽL(p?>,,& %u.C]o0`8nw] y_j*~u?j=%{mw0^±'s^im;fXb^~%vj%X$iժuV=%+{n9ze(/ ]oUafr KM '&_D@D@D@D@D@D@D ;^J/GB5E�M_Qꈄ}xBK3uXԩgw`_R߿?v[e矻]A~z\n;+Vt,{J/a]weӥK3 , {O@vs<c}}H䘏qrwyq#yl̯%K,*0H Ԯ]='.KXۉDM'YiM/>N߭xf͚>wYv|!dh%bT� u+Vyg`YUzAj)>U{Sx]_:~a:%W:s_UVu;G.s,S+<H(dx=&eߎTxg# ~Y䭡S:oRп_ 9>;'s<?_Cg{ g;k3:vgX_C !,T4#?ccCQg>V=bc"ᮝ>81X<K)pD s ɲ1 XwD6p59 NBe@ |㘻 yL\Cig۶6;oM1H˭}1f>ocW=+;ܺÜ9@bvs T7tcziw>>S %w_h+yBcP'^m Tv!KsӽT|fr ^/VW\1Uc/mr[67ƀRB~OסP_fΜ0/^{|!HAQd(GDtN&dAslP|_/.O#z_/fV--Zp^ڝM ׬kS$Q-B"IIX1Wr倓O6lHJ3S֨ŋ?, >L4qGeʘoAJC?4mg ^cƌ6mcٝ.rԭ[|Z 2н{w.H#,]jYsϹ&M ·@gcF0G3  ]矇X2llF`T$O?ժ�u�s~ \y%PLb_?ߣ FY{_~n=FH5 gq5՚ĐQH|Qˁss^*:Y?kŅ^aÆ}!Uҁzf<oLKO{(Y$/^lZֱoɩy*`+,N߫jӰr! ~7œꫯc+ò/a)ᢋg4ydl۶ vZƆ=W\qιdIܾC=4sw?W^K99=첈Eac>|>V`ڶ-֭y-d"`U(Q",J=[xX?m'w RHࠃ<SG*W9>,=" &`ݳ`B`R`pг'P"p3rmYjo_Oo<bn6>p8夓o#9ܫjAN>\'>{co:8s|͙ Y^x_&ăK/ԝϗH|ʨXD@JMJT4^,T, 12#G];vܙ)*{.'h0+;Fr/yIr >%{h̤k<Vp�аaC/73ޮ];oon>YMzʍH=ܦO>$x puszĞε|2rX EfTo9ꨣO~-A.;0}ݱڅ'P(-iMbݠZGv Mkqoos 9s%7.\n[˔(NQ ]c -իWǩƲ}|^iVJq 0a9V?2F& X&>? CUeq u8d: (iq)U`o2bcƌ |7/=H"" " " " " Q!�J*>?:UIp {uF2e,_sp'Di~ߧmz}J[zgo߾Xb0o[^}>Tx 50jTd6K9f )e \o BCx^SvT~YD@ҙ�(Hs@bK^7f=@ H2C]_ZbhB^IOMfϥܣ.3bo�}"n۴@0 75kca~pwd>݂G[3&}|M͙^5N<ϊ9Z_vǘuC?s~8}]?Of6m@sr*اXON4_z ҄u+1JuBmsO?0UǻwdW&lF5R˽Y|^^o, IE6m^*!]{/¹׋2E_DtA)rL.KLî^2Fza}s_~)/G$tіh>wڷo or?LPLٳgc-ZZ6ҠA{N^L4 .^~*j[o-sS&P 3ցe7!er"*TmG}EժUsS/ DW[nݺ}ggN'J>aQtP;lMe1nժUBg1/6f+@޽lR^x!{=FfAb"*!@͚@^�5ClÆ6n"o[^;k׮{Lɓ^$!g&T[ BEHGLLuJ0Y TR�Ņ,(إ ?!mYVZޯ)zT¤=/ۇ;gϞQyn]a}t(T+dوץp%_D9>pxv=ω TD@D@'`:(][1N~ cš`$ E� )ҥ/z-cS,jd,X`> b՟_kÒ/o-ND ϒKlDžK*v0|Iy"?|O_gO']ySÃb`l1fϭ>Ĕl?lGy+BA]1m4)Rƺ&`"fc ~5_D z,<o*LH ض-:u3F F6c7ǝ)"kܓN]!uC|yo+aHs^r'O Z"ҧc ;\;<h~_e(|H=0qD71Yg͛7g?&c\>Ǟ\+"޻ ˷~ۍ%;ȯ LqtL pΘ1#sN>hϛ7#Gt y쓥[*" " " " " " " "/i@v,X'lt2,7.V s/޶m[*0eZ9/u-م^2o dM},E/1/:u213f+yg\crPzt(R3 /~?3pWpb/ǐ!Czsa< Itbʥt9ꨣa|e~ߣ~)}q" " " " "-[͛eq-J5@8餓~3ff&5k2:27jr redsm:}p˃zWbڵ` m\‚ GN=[ Z~Kfu{9ߐoΥO>-ʡ>~>Ys2pMQgMoE@D@! [unŒVt?b^K IN`v&Lr#l[(L<80- H TH\M7yWmH$>.z" �M+pEiCDM@*Ǿ}_(d(֠'d_~cn[&C3)�y9`Сn_LfYPƏr+G# }k@P!ߋ}׭r(е讻Wok&¹'a^VkEN /<1/){)+ͻrp |ͼ7K5(طo_;ɵ߆}z+y纱\{ӧ"0řľ;ߣσ _Y8('Yj 3)VID[o-͊F'hx3`f:T1ūe_B Yle0EuwA~YjkN;β :{챖M+o7u<mطp`K/u0#7iڵC2eN}avTPIfa@2K* Z9cܺK.vwW\a_o<zz-:!C;nI�jՊvb؈jV{1S"" " " " H. d9#m!ɓ'\.YbATm,rѢELiӈ^ʖ #z6 xsΤ]hGauˤ<  EDyPNȢ[$Ð-܂]Vιw뻋BViy/^}\'rAh{YD@ BB6薿LIt?G›BZWG` AƊ>c)y^_/mdM9nb8_{-ЯoѨQu: 0Ǝ뮃]{b:Νq臛4>{:KbN8;{#9L}o>N|�dY̪YRs,(Dcn@h,"8-[7SX඄3FɽhY_ʄ¯o= k*|Z32-M$RW 5}@2=zd!etҏ?2vF)}}I.rw=x֨Q#c}~ø;~6Gd,5{m<^µ'<vi(_l3/VG/W_07᫯q, O~^d}s,@wcj◜|dKnBK,"QxIsY" }@bܴW;O4%`Q+={:'%>p%woٳ'{J9iӦM98ps:ɱ`]3� ) իW},Yҹ .4oرu&;x#.tgǎvl-R~SO=OÚ5k:uu&M`}:b]iGXGxb:t,SөS'wcn >6p;sq{LuK |8ŋ;N2s啎OjymSƥ~=iD`TQ T=?�60 k䗀9}u:tӸq㈫bev;u?}x: @S|yg޼y0ZVUS{yuxTX1AQO}0k۷5?unfrիs{~6lXsYg9ׯw^оWKc}{erh9ig>r0 E? 8+;5fW^+8lВ׹;vYq:&&Xӯ_?gܹnuNO^X'U7C|ӆ@ i6,t `8@xg//1Oŵ?jw 7 Y:g_pavnr0X6Z0w/T)qssڷw?q6lŲQD Y yD|q[7wovO?u6Y-O]N^kvڶu*U~sOsM~C3cOrǞu\}-DX?69c O籞Pv,A"nqT8_~Ypտ},TfaZgkt9n-/Z]v:~᜛)^ѧ;c'iI'%L쫊xnNq{_�=<2v9u]h11@g̙2>v1??Xbna (e79kg(}{N}h%2w,X 4(OZ%ejժ=#+VpL3῟y普 zdcvssDZ2oNQo!*" " " " " " " "oqIҫWԩQN@_�KT `~r\U Izurf v)YfZ-A-=˲fl۶ Sn]7{i^ﻜfXP+of1LN\:lHĒ%)&ZC Tu]%ad`x`K7O?MZٳ~=OBOb/ zOI" ">nUD _.\s@%�L VC;d 3x`Eݏ֋=;w’ٲ'['GcS!8S^?n s~aA{etfn7aJXrL}+h߰_O2 ~8|7l�gWT)ۍ9̙V-!]DL?<ۤ;$2(ޟfO`t\r'X;N!ٖ. <,ܟ^a_~{pl^><({v\`?&1UD lz? mסukCٳa}5C(8jM? :uO>ϾO* atw.ׯ-c̾}A͚5ׂ[C)}3!{nc=W q>6 5 %1Jw0pU+zu=ĵ=W[ ̉@Z^ؐ! H8RLrJtCzZhjI=wRs N?Zcs^߄3V h6>s6f{q0!xUT+`n%ԅ{z):5ED@D@D@D@D@D@D ($#%;xmӁ>}'<6KBD�0(hs Z(�٦MwUYf.7HeJ " J@٠R)" # ıO=[fiW̏bYi֬Y,(ȢPLh]繻+ 5DcUO駟ƅTPIy B??QiĉO&>QaJG@㦭R@8fy0e ģ>}J0/ I O�|W^ g,[2"Uvȑ^"ŋD&0k˖ެ+`FKhͲK*o^xMR,ٛƾ-H&氯OrMK&dĎ@~^R [}Xh6�\rIdu1)}Vv󀫈@88I`ܸ$0&MI!y7["b)5;+k[3gN0?uc{E+aBtdJׯ{{ϣ 4cYLAL2co!gP&Mce@(-TS�2]%ʴj/p&eر=pzDLӧ{stϡࠃ".7x뭷AM\{d!c$!" " " " "v\repTvm7#f޾};:l`<L% U -Er,p{|XN: $ s.(ecUɝ *RR#8 .�zӦMM--LjSY" 9`?LEAH ~Rd'@R<ۋgrY XL9֬dP΃Ma�^m~X.;E@@Y3Ӱa;�TͤJ/[6F& ]"0 NOn$9idݺy,2J/]\ D@K&a֮ Ϧ_o4^+?26ڔBvqWxMܫU|D~7oV^S/Snĉnl&4~1Ҳ}"N%6l0OZ} )Hئ9&9@?t*ܪUl'L_Nì\N^N#" " " " " " "^$^;Z{iĻ<#1hzf)UW_cǦTb=o0'NTKʞ>'{DsD@D@D@D@D@ N`ٲe_S6m /?/fYfi6QR+]16b \v}(\0.0J>Ck.}-$W^Aް+U 9Tm%" 8lX}y08dO ?ji$ Ah<P|leEJ2|Uw PJp{�vW6h zY*"=&{v) ipKӶ-й?taAiYvRD)51Qg}i4=)JJR R `ùZ3b5Q@ pUAgQO`j* .T~Vɑ@~tM `͈ބfN׫b y^sll*9r>dЏ"slM7*T(g|IKp}Ov 7cƌqǽދ>:t,+7Yl?robn& ؁" " " " " " "$63g²t W:1 mLuW6*"P GW0`��8UEE[HH6˗/G:u2̊dFr|'A&xؾ};nkwq=`6 ��@�IDATӁZ2/7:R嬳wܑuI͚adW*dn:=\L<9}, A&4[_D�~`r:@2<& .&)+l yn@6b^{{ Ql#E 8࣏T`J}H~ÁM἖<?Jabb}v4n؄c)i~h޼9&NFE^R 򤓀gZr}׮]M8*.BWT'5DD@io_O gF9Y^t:0ۊ+PLV:hKOUIXD~iX/�mڔv J PDXv ӧɍ)y oU҂ N6ڵ p@Z 裏5kM$ BIb8׀ar.Lm,Q"aAK`/#!.(V5" " " " " " 1#@!ڵkǬ~UZ<  N2UumHzdɒjnZ>l-dnuL#W04}2_2mHvM_Ä6 RٗRҙB>i@qΝ_w<j_cOڇ�)zyXڵS5ğGv' Gt%P'D˾t^CTˁKaz޵C�'4V￿%�5e-0={֔A~'R2}\|Ůn)IE@DBo_A?;vlNh~ ̞]isH"ܺbe>ĕ�|A43J5spӧ} h$vgLZ"s:y7߂D {j" " " " " " " Y H2+ (f|Mai-'@o:{S=.Z9YRA qHM2EzȂ/lX c:~8|Z_x 4'.  <$pOWtTM'+^[|]ڙAd"XıEDQZTBIt4dJ^y0=+4iT0QJIMh*" "oo f`\߁3cNqN1co_ƍ1|vm[Ѷm[|T[ǔ@�<8x@Hλƍ1cƌWO%'~}h|$3|/Сj$sq˟Ɩ-[ξt1eTʕ+1qDY'pjժ/Ljg9s4m<yo@ED@D@D@D@D@D@D@@d4J6@~ t9`|Q%D 24k{,Oհ~A" " " " " " "hͫ}E֮];Ѧh)@wx饗0aO JMȉ@i[o<U^=,Y$IK\;[TFE.]\1Ȍ " "xL߁oF7AIz20$Une .0uǫF AƋSPԮ5x5ID=xX<&P{H7Kxa/?{˖OZջ{y`'P|W-[bϞ=o|ZH1` AVHzn?c=r 6o.͹]wwGy$畴$_N, m$IJfMUn--$8FEAϞ=g{+0k,o ]cvޝș�Q<g)s2i<yWd& !d>:-_Z2#p^|UD@$]йΒ%?.YV$$l2* A& Iݻw̙3/K/8m@vرwy[fo[Zo?ࡇ>�^~ذaΝ:!%5ZD@Ri?H2ǷiSo#BIOhJQ4 hXAPK~`׮@v Á>}|0cӥNW3<A!CRj@p 0R)os}S &ͯRŻj`oܸ1ϟoɣnÈ#жm[|Oe$pA$)jUf^fs ZP!P.Pc`b7)_m1c`$U57[f`C* @-ᅲ-[`qH!1pB,Z ǖ餓NAvsL7 +mR<'yns.a<yn@PH2(GJvFDY3=ǟ_hs," ?Ha~h8p/@O2'岱@@,_ 3X@WPԩ {W1ZQ% o).� aoe{gSZ8(d;SLGbpꩧ55^D@R=^`ϞTlYr☦$#?.Td.x618~T~:x;wO"l~5 xAп^+zyf쉌>'#Vk@Cԛn}|MK,PТp mio" Zk},y~x>P'zu֭O9ԪU ?xօ#" &@^oCwo-.<ٯ3/�w@A }֭+-$>Z 4aLs,ķcYb&L~)["R�5s<x\5{y\9s簊E@j`,G Y2XFZ5/!xNN?�\{-p\@d5\G$3Mi)S'_ԭ y&c6[-j!yU)O{x,QDʷY t#`ztku۴'1LHFQymOw|!H1D /A2}0Q,EB! oz2&V+< E%ΝQ/�~ 1h(_8hO<VrըQ#̟?~;F6mOV^A6֬܀BPz饗gu2/76&1yu[7Oxy)o[&=z4oߞu͉�R�e3")Ic8ZCߑ,7)I::R ."L6͞~ç~/M%kq6383gn%s'9FqGs<x\9Ʉ<Gy@ H2GPJBu~ ׵kuu-؇� Ϝ t˖'ԩc> A֮];%ڢF$:) x1dȐ3PE@0h#*p%^ S/^Z˗N8+ R D@D@(RDBY`ơz ~UD� PX*SxyO]|!ȝ; |8tgO`ذ̍8{"̙[ (cAllHgLdC j(Ww�_=lZ`8fвeKcقiW%+i\6yPT:U@`֤I0%cdm 7`b;0~ 5'"˾#L+@4ilTƵy˖-=ݍ3L֭qM7aؼy+>ӌ;|]Npָqcn g6mJw|jxnP<gxs1 ?s"IH%S1jdG]z'e所x'Vlɧ(%H}Lc˿ ^x wܑhY 8 20�W,Y=ڠ<&L}ej+d@N(aCNK5?Z jaѢhըzD LJEtq¯A^ $#z ~X<k(8o|WKOՃ&@D = P~XfĄwR(cv ڨQ#̛7?FӧcĉEl~&PwtA>y,CcO>L@ o?u `RAp>Kx^y.z ƍ?ZMBYMi.iW\9*(lrDQ`UH/_}+vpVUf͚iӦg LO]I/)K¯l~͏7|cnLpexhժ:(r!)C  >:L p%@׮c%T؇�ݘwuYQ_E@D@D@D@D@D@D ,[,TL)ybÇOE}0 uUGڝ (ӄu:{yd@"E@D@%P$.(1c+Uu"%۶I2J(M$gh՘z|;g,k]mtgl_/!HD_J14&51m2-v" "`#!w"ks?{i8d<qC AnЯ_?W6�6%(.SI(5 O8 a_f7N'x".\;,9 " "eۀ}3�|~`d <+{{3T3M"¦H#*u� UR�8#a+Wty魷رc]9TՔ)I?*NLڵkK\8b0>LWLxb7929Q�rn#-_R@O;e@(mWӌ%ӿdsiAll <,lֹi< *" " " " " " "n:!ҡPEbM"A1/܂⪫.URY&33ڶ￟̖6H 0sH!РRۈ@ H2z8TWgj -NREJ`F`O IcZd/aCNkh~ 0yoG qۀh@J�M^Ćя@ @͚01xMcP3#F60ݔϟ1&Mf5bUx¡b:!=PW�mܸq׫ D@D (zG}NMTw5j^x4))\?xA TD hQkزeK7U3ԥK 7.]~=~'|73І;o? o҇VZn=5jȨTȠ6ۃ3}j9/ QZf\h~ƍ-B#ԵN VB@&YhF`4FfO=7]]P_| "Ppy�?7o>@ԩ~WB. ͸k]'֞T TI9 fάM6GSjPT@nK[$pؑ<%|qTn<1[NC*HXx /,I\ٺPHtwdC<1vۓ&YD@'@$/O7l]n2:Esy=Vnu}#pE!9TOZ5` T B`\RJ%PY " 1"p^ s"$wA1{S[nL _SD [%- P q޽{&%]e˖e Rd𫯾rd+aUV4Q<`0dm٘2M_vou6~LWF#d |S೦eOhn<줿mzdآ+" " " " " " " " AFKkYԿe+[6Ef@.@&$wp@ҹlE" " " " " " "F<B4Cb͚5Os*X]k?q$P2 'sxbuQq@ sbAT"" "(-J&4l3NY۪_n)xA LA{p` 믁;�.u8gsg.TRay~Eȑ)H5ID@r 3C5L4{G5PBr l͛ѣGBӧOĉѤI,xu<D w>'O)R&в%:r ж-0kPn%0Q\qŋ05&+CD ڷCےXC$P:))„L)Ղ~2ܽ{w)IAr媡T:&�ʕsL26~S:(")b I)DNFN[lqS395~PqG]|!FN0䤤pT#=OFU NLtT+$NF?=su=z�<�0k@fTD |A!YΝf̎`P!5p=EK$ 7|/E@D@!P YUk aUZ۶ R%)Sn<1T B1Ea! X|+Ȥ|m� ~K!:8`"b-8E0|2ST&vJ6ޯQ Ӏ^Cx#Ltûoy7Q80ҲIhv~nvm<.SI,>G %xiڏI2F{uv&0x`?ޞ!UW]'KaÀ-$n ^%кu@(@ȩynIcunܸ>\h} oCCt ?QW@rߝP2T9~>6KYnϞ=2=鯿r)*H! )jIaM\5kִN W)+x̍@l H2|U{8pπ]$ AHHӟ976[́aBAD@D@D@D@D@D@bC`ٲe&R;6Vȅ~msϡs4"'jSG%yx/1iRm\{-PX5Q * O]q,8| (] @ )X J+ hNE ~H~#ǧ%O DBs8i V�,Ǎ1K�L^*WDL'�ʟc( AH}�k] zJvU" ")z5 !)I{SLzV0ذaCcƌފӧ[RhҤIxhQI'w}?܎@`nz�:t�Ms=Kl \๝| hnsۏ@(Y8(RDvlR_0S, ԯ2Plk.Wrun_rs0#Csys"}AId%KY2?rr`djռ, +3X_pA v*E NV|қ֭x `Vb ,hi AHKcG3fq5v)`޼ynQ5'%DMdELBLv F3٭}" " y([ X|䵶@:,(CmT)6uKS׵G*;RIjL @T :rgN/M{wHzC6; Zu:$!hLznXPLneğ�sy4` 5%L3G,VS+GhzK3Rd)9w311bn?pPI5=4A7c=&!ȄXD Ls >]�<07>~ڒ]os? |'&(eD@ǎ\1(T*D W3ȑ@#䞬*VkZ(" " " " " " " " &hU}$lR,ϰa�3X/Zu`ю0k\|1,"T)5[D@D@D@D@D@D@IBG2JED)Z[h۶Kt9sPDYƊ�ʼnƍ)`ҹszJ|yz.JED@D (IJy3@q&ҥ݇jLRLw=X_7Hܹ3HhY+V�? \M#sFAG>#r'6UDڵaH{׏' Aƚp?f v-pMp<HN| ׯ!){o?~}ONL,ᗆ  F[oM,3Ϡ)UUFV-Xw2?ct0˴c"EI~﫯j~{xD*Y LDEe#@ओ<a>&7Q#Z6&�{.0w.䓞d">E@D@D@D@D@D@D@D@D  I Jgq*xy9p#9(a>\xq`}{=Lؠy&E@D@D@D@D@D@D (٫WZ]�$*c֬Yd^K/YE~"}L"x<e," ",~쿄 s(;ٗ"ض (U*-n( }':?>SoThڐD'v|NG?u>RџBŠ-J{(x>,p^B=oZ(" %�s'U/;w}oݺ}Ao0x`O~SaلnF.iA17X ^x 7 EBOb„g,6k@{x�>ۻƇ!p1�̞ˤNԒd!@=>y<dMv@v4ڟKkC:{۴fht>?&� >�.h8LA" " " " " " "(;w嵨]v얱I~6mN:$7;H͆y(wa�y4g!P>B-Ȳf@r6IW#@%\ :(_J]T4uk@Y0G}|'jժM�sWϛjRUϠ?&20Jx SNs �E9~zV+ Wqʕr%oٽ~-64{'iӦ{+ѧhAq} L (S&&hg" "p2!4h$%JI]d ҥ'UEK~I2goO> 0*&OVR9j@`/E 6Y\ۺ7=V #x۶ctza@ORk@VX.dΌ$ڷoo}pwbʔ)ݹLx`t`ҤR; 4�n9`\L(\@y+Ӣ'H&[H ǃg IA� AH[o7kTq'G#?(j0ks@.3_E I7'Ȃ[oA~+~'"P*е+pml䉙Z!?__믋ZҩVק3"_|1ENpE%}$@s Þ={ض-%kVt&d?g+ҙMv{xhW=.±Z5@ 0*pܩ,3'pn&Ə ~ld&l2< A&QJ?.bK -g�uѪU->Dk<Sj^D YZ?O櫯-#\+$ %b$O\ -j?"; f1L ,Y~xԨ}.$H3a;h3n];\`)?J2?ԂMJz9E(nzoZ " N"&O|M,X Sƚ55\)?Ej�;{ohH>X7jTؽ?<x靖@:8vSO8 NoCLs-/\H'L2d@NH ;<8>[W@X蘊@N8y2@\fbf;rZ[E z(@@Ӧ쭷 <, VM" " " " " " "J` Q4N(}N<ѣG[_Q{~Xzu Q'0r$P*з/@%н;к5pMsYD@D hʗd//H[z(T)Jr:z(w%�}YK6@tђdrV-w�&9oc7-" "Ł#.^y#~ͻ7y-/ U �8gz@na^zܙ^4?R xbAH4GJP닀&7ؼ8`ThU@{_ P>pԩ"qsgLܑОE@D@D@D@D@D@D@D@ B@Bmӆ7z0t\�_@́O@CWyt�xp �TD@D@D@D@D@D@D@bGBuԉT)zQC"NEdnD=|ck,K&5;Gg," "P91m qZ2ăx{)[6{K}P�{<Nœ$LCn=2@cGX`8`:׀.TI^cigXEu'+ƍ?KM(.t%S:4 ہE^.(Yx Drsg뽱֬IWkwÆŞ$@[?# )<! JWjd%Ы0}:gOe#xvO?oN눀@(lHV'|%p@V]$ŌGyoڔy~b@[;~^2pe TV@^x|wcڵie�Ị$# nɓLT�{fP&SOj\j63v �* SPn݀-zHFQa= AƗ;-[)U�`Pg A&ݵ xa)t7s&ФIrڛJmP\",>M*1cKs$P"G4&;KM=yo['wNJrިgoj'+%Hu PXGC`4SCg[�׺^}@*"  At' :'8X^2ÇFW�n.1(T(s=vzMٕ}s(VȎrXxi'^:L ~:@g+عs'F2[#ıC=0qC9$v@=jH:ur!0*A">gJ'f,+u0j7TҔ]p®M�}۷uJ2MO 5[D @$߃GUOMr# !嗁*Uvr_/K)@!=!`9d@T)yKK$,G"v0qs֜}6`l~ZDBJ3DnZyˁݻkB֯_%ޫV L"Nq_ Ӏ_^ oM#]닀@0ّy¸'{go;5jk} O=  }[ Qݱ"@-X: AƊr˱? ,h7Z`W JxqN: `CKŊ9q \uL wuU F j2aɒ@߾ހiKđ@֭ݽ"86mڄ>q5/"h'YdwމUV&J+0MǁZK.V�Lie<uV�v(R Me@.(I``-+TD YH2Gbt{ ֭g-G<qPZOB SmjOdzN.y1thdkm$P2iU9g`oP*?O-*ZY@$'~^QP$SPC;~]KID@R�3'M+}}m "йseApg)q񡇀ƎAix8\HQ�c2: PsB*" " " " " " " " " $ GQmHfb;HOE qcbJwʀ#f=;g1H:p9tpК nfA@U<D@&MPl@dD ,(ɢTD  HO>z‚ PR$N�=rHY~0ڂ֮J b Ν<$aY-"N8Ķ_bmE �xO_t\}΋ҥoy rL1|Y+=Q"S|B%w̝O-ؾKJW_n^H+SǛ:vn&Zf?#z / IqCQ$(DY8^5|O<}|5xqwNv%|33O}T" Fy}f+Wd"O9%IA( 'o曽~#@>M7/ ș_;Wc-9ު}㏡P2L!*CJE( f˘  3υ QiB3TJ2"J%mνsξ<wﳇu={}<=*q{oSO`1V ٭QXG3%4$D Xtb@'6qҖ l;J" " " " " " " %y5ӋA:"1gc=MژӉMK@'XyPmPc):;yg0QR�S" " JBek\X .c _xYh۶ll>pK`J쳁lr!W&!\}r+7T)y� O?=uR" " I<qҪex6".X(G/Dx5rM̗]˦=<@cc:Remzdݽ{?aР@?Ńwsi\a)8O!OBJ" x@~j/ଳ;k<K餴WD@D@D@D@D@D@D@D H2ʞj�FKI`NQ-�=zDɎmЀ;,h� R馉" " " " " " " #ʼ>#ERJ8^֭[>@v^:{9h UW]S)M`988߀sv*yD�Ah](d7 AzG.i~"^~<\ҥ@d#c A^e<r$Ӳe+%�?<RxUgktf%=1.]Ϊ@x>f`iٲ8uKHc54kₑi17-(v\(:Ot=Ǝ ƍ(@`L6=ms~@>8$Gc�Fe'a֬%}_u:}޽ v!=uϤX:w;w{"&0T%@K/hr� 4~:ZqŽt=pc睳NC_\3yKHcz~+? ;p ?OD@D@D@D@D@D@D@@fͰzR yU)!ФIzӧiYwI6 NXd´sx;H2>:zŰU@~EtTD@� )|le͇ծo\(p(·:Mv,3 .[y A QT];`Ŋ@LhyŖPI \{m ٵk "h:HDre`%޹g aHCr8lӖ q|)!|+(~$6wʕE y-h^^t.Ƀ`PolD!H_Si?7%Y+\ �C�<PTDA;]w-~\D@D@D@D@D@D@D@D@D @n Lzj Ȉn}mowqDLֽ.~8 cJk|` :+#Ԛ=z�X$" " " " " " "()cEd?ݻw7�"l��@�IDAT#0R,'pE?~9 Zͨ0sv5*dOx! tsUT+@Nn31b|㎱Y3%V[e,pZZR�b- ƪcdٟRX($D!HX�8s3`W9$% ,_|CJ" " "P1︰8q_]veR`\kqv<k JF CVppvC_}mAJOO9`( pkrP\$лw%}u |G3 \Zb_q K;CD wз/p /'ӿL7ѢscM]d|3^wS0 /96m H> .;(˖/Rx,_'i4SOA1FCॗN+KN:WD@D@D@D@D@D@D ֭M7[bkW^ye} LࡇBƍѳgO \T- qq W&N-. 5�+͛'!Xl_D@wRZ8@A6;W[I hA0 {)J Q{3V?~-g)nO)ˋ⥘:S|Ce/" " qPk-%i1KR<:z(H/>8f�ƌ g9J1/ IAҶ/?' N s1uYL[" L>UÆ*\s 0dHiGot?%K? 1.yTE@HS j1)T}ŋqm}qip[}; V2BЬйE7mۮ}<S{hѥ ck&i}<g5qbqu@F0 !'eD@D@D@D@D@D@D@rѣG#BKBKҿvfT$PF {  E!8㌂6}Z~`>bD/f΅UCU8yGQRID@D { xa%KTh|꒻(Rz?% IΙ ǝ:,Zj;_T &^| ɑG k�9xR+cۥx^EV Q}^췣~;>r $Ĺߔ 9旍7^}lpW? \{m򲯤�%>?g̜v '. ck=" Πw& x7MH ~,&ڊ@A%Tx% O8D7.yN&>|2Q|͝i}x8(5&�Pz-5p,`trFbmqKKJ{E@D@D@D@D@D@D@r@-0ޢ?EoKׯ__"?kNE EF4:=<pMGӪu=mZ1輴h v!!{֪@0n$gKwzx. ,] lmtF@`Ԩ`}!A%�Rj ="odHStgŊd|vq90}|6G檓@qo?`؂=6 :v &8N| C^s /r�D|X_UJ. ~9vWrVD  tq0cFuE^x!IGt"K/I.E n> cHAO8Xa .mnG AȃV5Oׁ} &z�}^rL@r;.y8 ;ƌVR{yl׮s~" " " " " " " $ЬY"Jr)lmv<ƎSN9'Oe.h8JC8FQw]{L3g+�8Q 8n.sV@D@D HNg|f"黣$ { @ &@yګdSpb~ k3&p&g}Y_[#S[(@<{qN�qoxW'6m S B]� @Q6DIB.[M5~.;_((4gNAXt-_լ PSL_ .SOߵ=e`Ȑ/컯ߛ}Y<dIb3n9X3R`Оcx}U1?I(@d=lU5}~% $di$1";T7kN6vP+>`�пP?s9 '(mϓAD@D@D@D@D@D@D@>Q^V~򯒪QlB={o׺ _|q=_+ڱ#ǁ<E8t> /!g8U_D@r�5 'ESyRU# H2#n!5p&E/%'d ,pF iO!LU sY P 򩧀.]C -˚ мys@W_ rqAH  Ȇ=x …kMSx$Pcv\M?Ƙ8sK& oaHno嚥g G$υLU+~m}@?p}b;sf{s;�W$"%>}\pAtfnx@`n7ѡCܬJ-" " " " " " " " $ !re"�}HNү^lଳ֭w^2wv$N]#N2X '@Z2PYi6 [o5~ nmUQ)0ᄏ9] ;wFÆ @U^=O^y%@ıL%8pW)3od;|I2}OB>޺S|' Rdj6 aK@B﹭oV |0~`Ԩv2@,M�#GB^ B6 j//Pۗ-tR,/_#0}:@1;.ÉN]Uk?sVqIR�OI �W^ \~y/ LxS^<2;i̚c鮿,J%N}}$Gjl/WeA9`@ ;fM'[]#" " " " " " " " 9KLD@M*2B'#A҈bH;PSh>-_܌ 3˯XlK?2doD ŵ_J@ r x`=+E\fTT7&V6)L49 rjI, 28glj"FT<s\wSKq+Vm{p#u,RTzq_8F9>q Zjn8 TL^|Etk˙(<֥8?Ƨ F{K_ofK>/22ʕ+L%pW˭iJI\s|͝0.8&@ф7�9$b۞d ~*@aªs&kkgwS&ˠ{' !HO"v6{{'I|n>!!=ɓaÀg ^RwYB+Rk <p �^{ h۶"9Z}=\ГOb7>mݗql`ы'yժU7|Iωy~ϑsϑm^l8ϔi߁TPKشtQH C.\,Xk>IDQ`%8$"c-nXt6D .hʕnae]V`РUu[׷~m=YKGZCqσm\_S{Z6?u Kns]tM3ߤܼ<B,5VpoEzCsRN5o(HX": K;u[SѣG㠃$(6$" =<`a$3QW^9^ƒ4h$E?:k. 4̟?߭2eEB~gm8)HhF^n6A' >PLBWZ#!:oe[o5f6?i~&^ij]%YdBbX` [8m9B13^jh|+q,>G;`\5?_3_pdsfy_^pүi| 7dT^H\͋q\d -K4²+@E ?#hҤ >}T4K];w/̙31g|S~hqѢB#?LQ]_"ǾK1f[ۚ H.׷q]]&ZeJ9e t2=N" "jسu^E PJ"iڰ!#tIr ~zn5d2iɋc/h>"戶E@B"YXp'z( j+" "PhO_�ΝsngS)U0oމ'p.9{b`XIF9>fF4"m^hϗS. os\8g9r9 _sr"\GOt"uۥMONIM62 iS (z>}_%qNf}96fT|_q%L"M׋m 2! 2'9yr]~˒ؿ>N B10-mB>J"Mn8'B6aOKY-ƍZZs[&MԖ AȃV53O\8ax@N_w]&7If19nR�>q®S0;5"s9q9Y4kVpvǕ27IIYNr"<vXsXE7D$Gv;[իgv'æE8Q@xs#wF| [{_l?9>DxB䚎  s=wߦ7hH|AQG5 Bzu1 vgM:H�F>Ѡ.kvc@ l[3h-P.CqG;Xj ?>}G|N7xFm돵1+p~}hYǁK54 B 5SO㼖}3>͛J'PЦHs%3ق#mPǠD@D %8iJi"@_}6"�E8$BEΝ㟗G)ɺ+%OzV)E8DkJ"Pf4iwkWS'Ai$" " Ls༹_k?rO .H/ۦ6K>YN3Ciw<2(yr?WN1qnܯo9)xK ɹ BrAyrΑXfamE#�(`_?ٔqc,PD2zߕ�vhBY.췢?~<VbTRt3{]`!)xC)t[r5n\;V12 (<(~Vr@&KϓJsXɋBz^?niŅЖAIRA"z`_s p睩L7|6{1(o%xʃ>} P6e�*@* pB>_|/&f-7P3a3agMq{smiN#5hPO�%NS/#(ЃBm݊=c-o�PXE[bb" " " " " " "P(8{l)i @Ci4i9k/jr*L6mZ" CʓB _$tc`! Bgl hp12VO+>>߭u;?'L>9w?a?6l6`[jյJM!dUxG$0oi}̙3`?4in(-ZAۛNҲоJdjILD@D:O4Ӽ7[K40\ПR||u{?/}+R P__?SF*FR%"4J"P )À^ lʓt\.̙Spޜss&^po{ и.)!`�%ø'c~@"s;\p< )wd%^#-"BHi-I/ ifEŻ{v!иqv'@#C ǹ\?{GD,ey}<ui5Q 뒋LW_ϭZRH\RzqH/n)Ʌ^z._N CRԘ`\f]~Z:p9@U|cm�r+ƌ(WID@D@D@D@D@D@D@D@ :hlnIsO@.RO>qbS5u]B'X VUEɯ\}N'X`3ɘƿIf:&S\bu;ң9FI=!hp7'QD@D@ �'^}@;ǩ;.{ʔ %pw}焽>7Ӱ/4xDC\ nSKݺu ֐ ΅2 P&:y1NnsFq{} 4RH1Sx�ty0j([X|9vqG'<C5k澿]]b :uĉ R#@RE;aQ6'm Xpe<ˀ7N)8;t()4>'~ V㣲ੰ  �6P؎(n1mL'C(۞pB 9bDTVULuw E!D@D@D  S{_�Y?XE !qޜK]3`KJ'9(Γs8_W\nB:ΏOcv31FnaE{`W:Hi,@h kmzM<x"l(`_&*j*8Cϟ_SBщ\~}^sA*@,?/(J&nN' )00llAU,d+`R3I+2ܮ;ǽ 8\a"ׇ>mM)r" " " " " " " " "r ZW�#M>SLq;O4`3<"6v #{J� TT�&hdbOB͡CWلv VR9.b7 m "ѣȚQmFTB @> w@Lkvv(0ȱ  ǚJ&\s~'#e3` &6AAHH4.JMM6֭."r!ӇR;8”3uɓ';;bРAN�BزeK\xxL6̈́믿Gyi7n"ǁ сCA!廙@pNWeCPtRbNiYaW/JT5j�Z ti1 {J|T .q VD36|dZ`6OA( *" "ak"w|GgY G_LhU.02ߞsPώs\(9c Xd87y M6u6e.H_yQȑKdń!"�c@<%jG߂HDƍFZ�8TܭlyRH" ʠ>0(ٶ)6R(yѺuk'vNq=kժU˴re]B .tvK-5(rs(^J46=P* +aWC-zK-Wz�z .c׌$<& )`E?>|D 0رcmz<&MK`uѵyHJ%`Xzso9SAa{]vh߾Hot7o?8c$-#y)j&"=D`bSSL믿vA,(Ņ(Iljw R$\h矻Ϝ ?X‰aYfniժE.\rk@zwyPJ)%{xW\?۹sg{Nn%:pPsQ S89лwoԫW/q=x =M# Jg'|O<:?TvG* q*gW+Y{-0QtػxD J3?S�bb`A.֠begXSP8N946UClr}@Y<P Zku!9M~ʔ)ƜvN;)yT֣R\aN> |RsܹNly9rT�>@")?1Q8Xp5,6Uw9/)Kv}Lpzm*ਣ`P˒cs<BsW_}y恶;~YlYQf؝샼i.m_:\(J1T/u(*ξ6NܦQPz+~1`:apu6+6nzM4q\T:(" " " " " " " "$VJ>:qNo,4Umz0ʙR![o'_#vل; Cv=-HD@D 45֙" "~4.t!HM0 W*U 6M4w̙3DG' DPtz ipN4͓F;e]f_8'e矸pw;G֭[W^N�r 7,:78>l0<dt8qE9|biJ{G#Y}?|O zOGl>X2˙1  ULn(SA! a&P6, AsV~% X|}8[ ]t́Rqܸq-9W ZZ`iӦV1mPsSNu q i[Z3&fBR7�S`x$䡘P곀ukׅ?,P`}aN`eN`tM<=EJ.}/K:P ЧS-P7YbMqHB2XjÆ Dcf%0Fp+rRr?ơ*L\=qͻvl[{]ID@D@D@D@D@D@D@D@ Ρ 03Ո1cƀG͚53N8"ƙU'RF|M&\7/2 CnYUfFD@D@rM?|q\_c)" 'PB9 ,p,FFA!2.-[t#K{̅;ى.~m,][n%ڵk:Ao4jȉ{rS)y8Ln ˗/wQ<LP_N Kwy'w㳹\[=|mQUt[e<gbTJ:/Lp Bw\w] n<^Y_L&6Qv Ajg1@4\RLs3`AR|#e_p Dn۷ય T~lG:9v'3pD)9s0yd7?N; PPS1ێR0h,cOb@CՄb3cg{,b xr6iĶS~}R^=lfH>ŋ㫯r u._~[O}ݱ{NHE7ORv0L~x 9:N"^z饉NqKǪJU� ǎGy#G: s1ܹYumv`$Wmaz|ӯ8#н{wo2ܣ@Br4M|q\/6D@D P'|^z /2>cM6}{,lP$}M0nM4 d:,6<H uQ`_q.7J#zjs=&r}O>XdEJe"=_k&r)=$iC{H5955֖'/is~~[lP|E͚?r|6=2`�0㵏iO@Ld G(L*nZT^fϮ@&440D'@hN[\sMt@>}8бcGh ;J5@[F٪_c *1 (G:4nܸlO?|s W XU\r p lC|GnB)XU.vm74h�\x(:KD I~`֬Yn/"K,:6K_BN/[mUlELrФ '+WL]Olȡm^E%(D,ħ:J`xp[@nݺѨQFhg~_ /NzBϞ=]j%" " ! Gq=|u@> иg>o;;0ĂcHM$ �j*7V`ļyPn]t{sh:C@Ulݺ5[o=L81g 8j޽1w\\pׯ6tl(ZNO?5 1~x׿ 6oZje}Rr=+@Kd7|O38~}hw`k|>k߾oD,ÇB,G& 4Q YTNǁN; rfD"}yLdMࡇ`pgCǡ/։" " yO`?n)Ȁv lתU+y@LSLq9",z'얝比,%*U.{ZjWaNT�DNSW@c)I!iq"wU7o}M6&lmU(L z 8ᄂ~VW΃% f7t RUID@D@D@D@D@D@D@D@ pov o9N?t9;Q �4|A 6 -,%n " " "M�:/QUҦd|Yp!{1<Ø9s&vuW: \IMjMy8cƌb d*UPzu'ۖ[nu1Lek'LX,}HwM PԳSN)Ofb \|Ÿ{бcGqe]׈#H/.]Xsl6CzJTȷ߷@4ڶ93~sʶ&4f/_PL ` )NrdH#"g�{QtmX KJUuƉ'DGzU$7]+" "O ~pދs iSTX-Z0^8/9?}L f7jD"ʕ7_Mu6\Ì +W>|-Ӌ6� ʥvyS\E6٪mK%ϲЧp0@ 5m׮|z! !ȼyHY pb9ruE9E,+8(jSckMRD@D@i8N<+_Xg@ Po!C_[lO>rIߤt8Nn om{}3)o_~EMg,^u= N1wwK ШQ#?έu>h̙3tVZwu˙K]_nbVq|y2tp]w{Nr 7̚=Qd{{H|}VG~ȗiӀGgM2L �=v-Jh|>L#E>\'~�xuBԫ<5*ss!DLE)M.7fS6KM'VoG$" "P`;7wS駟VZ U7L2Æ sٳ'?|lP<?f͢qXmEbj n%,F-NFm1&w;NvPoj߾[7ժU40347cځT; 7-b0 p<昘<W͚5[n1w'E' wꩧht6;vuZ?ll#6h"׆ؖئD@D@D@D@D@D@D E|Ĉ^۶m=n@&J dsρB-B~>:t(ysg,;!ȿ t֚<y>: A~p衇6U@ttA]ƌe˖%̅ Ϛ5 >h]f%Tzu')}b*UpwW^qAZnd˝a/T{H"̐Yes{Y&" 4^R@A-^W2E香{71/.dC*<1T T( ]\F5&%H9 DG}& B[" " YBhN;W__=D b1(@6ȶ6ɶllJ'nwRTA[~Ν`Ŋ-e}L5d)m!PjUk:�W^y%F%KO>gЙvR[G)ud@x2C*A1Nь_>H޲9NP535]E@D@D@D@D@D@D@D@D ;H2;JP2dve>s}qD fv|̶6Ŷ6$" " " " " " %=]vEӦMPfxc=z*@`e[e Lٖ٦ٶvmsp\veQ.?d@/EXdԔ3w_\wu裏vԯ_gq* QBr>,:uꄣ: 'Nt" / I#@ӦMs-[tI˼=Z/ɶĪ)+! !>h/i:J"QB}dK"O￁SaEז�W|(b{_;.,_>JD@D 7,gϞhذUb03fs&lP)�"$&(fvنK'9p>S_ #T{&{~}gX'D@:묃ƍO>.bB16mڀ{4h"IJ'pZH>9rLLw̾2fǗXg=5Bڵc" " " " " " " " "P$YY`|LIӧ;]) mMID@D@D@D@D@D@C`̙ncqΝ (O~F2M3؆ٖmctla|}SO=o7'СC;ca9Qj,YdK/O>\pyT\9:2;&Oիd)WI߱li髱$"OșTOիs?Ebd,2?�o B:fЪU{V$][V !ȲB"뮰q"?-9s*.Bw܁wDܦ:{d#MMd[9rklllJ#h" 4^y'Fߎ3׎&X}_MSP"P-w~e/a_>sGRJ!C�婜`,Z5wawƘ1cp;ED@D@D@D@D@D@D@D@D H saWrҤIhҤ /_O>_|M_PT`[bbZlkklsJ" " " " " " "?~:ϪUbƌQNY<jllll4rfg/kzq 'Ə? )0Iqcǎ7n\Y-Mw޸[M$T"⤓N* ڑV;v,6`t+Ӭǝfn D@D  A�ݕ*K2Emhj4|$0|cDG0{4hLO&u 5IfK[2b U+OD@D@yoo48pԩS~TN(l/`f[ffVJ. x≠O?^z᧟~o⬳V[m*7A} E7b_>}R p{a6d0ߊxuXV$0q"PVkwa֬Y67(Q8@ada<炭#\T;EbDE%H-Fkc[c$*=%HD`…80x`<fի2$6ζ6϶@ERӦM~#G:qɃ:m۶u5ɻP۷//^4 aG֭1dȐ̬̝ٗ;R|5٫=aM[j@e=^sXbr*s8kȗ%Gm'>OTN|s(g\YGB*Lb``}vQ*20Q֙^h|{XJ"vنٖ٦ٶƕ*N`ހvl >'vy灁'> ��@�IDATĔD@D [ObDG.wf}Ry$е+УT+F2<pW_6853f T/ѩ:." " " " " " " " yO@y $g/=*W\0r`=t)�dOUu/bʕOX._~w:w]U,XaÆc%\RteN<>.T4щp6;v,Lƛ{oωC&ʟSo.r4nlmg^ŝ:uuJ)$xZN*P:uн{w|͡Xʱ>ݺuÀA?]|UtWO<!'C{Xdquס}ر#nZjHg#8M4qߩ3fuNEw㎸{1tPL<م^8_>;0pbܸqPיh.2(hT??wA7W4}KBXXG o?*$Y[^9|~T'*]"eV$үM_ޝc~ÇOs,[Q`A`s,1)XE@D@2EGu gy&|M6%X/HrO<sp饗& sa[ffۺR̜9i_Z~0W˨[IA ̗~s6۞*A8M[!ھitQ 6RF\g>}mط)�2(UJ3~shEa BD]P4hP&LO$2LD@D@D@D@D@D@D@D $Qy̞='p>l瘚(,;3|| ֡5p%:CQ mQID@D@D@D@D@D@Joq:GI&ʼndJdL0/_^)I{/(� %مm<.;ԲeK=܃ _ ='jȱ> |9pꩧ vǝwJjժ9 [bEpʇT>>ӡIN8ҠU{-Z:ݐ믿v"7x#b5S0~n&1W\:PCq™n!ȯyND2لt'I8_;y\{NX}2S:C2˭D@ w0aziƻT)RPGUP7`4ػE 6dE4E4)Or\=Ɠ*RtkteG Z0xA6 Eum1 iRUW/>3p;afKG*_ʖT;7O=+99|Jlgg[g}w[nAn7o XXfL\g"e_Iv]YOUtSE#] ]&LYh@H/e]禳1bUط+ R6+Set@p]VJe޽kPmɱT]_gp:ʳ?)N!κTyJ[ƍnZv[o=Eav>&=Fkc[xǺN" " " " " " e#@: ;F"%կ_7HWy5k.(]hYr(}~]wߍdfJG?vtiݺu"p<kΜ9aY(s9qJF(:Szp8'wSP^rer$v5Qر,y֩S1u]q*cٜ(ȹ6۠{\̴wctK/RJx뭷 "Ν_|.ze˖&tܠ()E7R ÇGΝQn]6l%}+C#G<-8&׍H8U*˭�萪To^&9iǪU9V,)Հ]NGk/r)VĻvy1p*צ/qʕ+;]d }7п?l\UU>FD@Dt Tù[I)[yd'ܹ꫓UOyoAsl .y?qG cǎuқ1B&S HWRQO9*o鶧.K:ލf<SiԧOgr'bs\ٳ'{?,Nhkþ6 )�Ǘ?8X\uhvV3\a0%YϠ`8}-e}"x<" " " " " " " " ' !ӕYJ_vwRa`bQ,TI=A:;M*'ތPςsٖ=~:= vsW`„ EʐuFOw~'Hvs=JP(n )XZE{]vѻڮQsfH˝%$Gn3w̘19&J*r-Mt~&S 󩧞سDݓ<N }qر>s :AS hԥKԼysgO"{Cqa#Ev'S>gP>@xaBsWJNd"!et^JdӦجc?]5�?U;>ur+~u&޵ <WNv!:Qg b߃uf/sLszJg/ ;?{RNJj`|.P_͚5fޮ-|@)Ϡ}(ժUvmr_IuEVI ;_&L8UvOҦO^LD+3b>}]@a+sn`۵+*a6A0nP)p7:ѣG�J32Gv'JGE@D@D@D@D@D@D@D@rYlZb3jg5Yd y Yf#ёSNuϗ]vY(/!2ZYV^ > M7o=n֢¾`ayoqmpptw@m-9)X;ÕA`@FH5jN_0x`|'`MFQNy%ڞh3�˼yФI,Z^O|:y,~!Fw衇:/vuSR<E'pmmw)Vm Ԯ];c믿xo cjNo駟Hkѻ?駟ͯZ0wu˦,Ǐwri㏝`:uPn]WvK/-7fBC=q?wcUVu0ofϞQn&7Nj(v׻mh|c96~Ω .p5Ɯ\i7En߾}.Jƫ\s !cEWmn܍)b kNl]i{3Dz1ȪL4lGu<^Ka?/q9>xm.E_F8nHU5v?;rJݰ;y!S|sWW r8:|xWV[[o5D' Ecǒ1oϧ*=M6L{UK<auJClFkg=nI*(p^|@$4-bBS@:ЏRZ/BQm&"` xqhC11%ATtAkncM2*Ur\?DۙzNTXsozh ~\XfK5|$1xu&ĚJ 3} 78|>!}n#<Yߘě/o̹spbYYg}͋/:M0ss%ӯbX<˝4ikK`@Q>1ĪG3:)Zn軡T:+sᅬZSf/7 gϞ\ٴpN'pEb^u`ݻwOYm b+M� ?cwq8c\ۦ矏-[9B/&5a|b$*҇l)=I5Lf!}*jzV^KիvO,G̱hS5l0׷W}m$qFrhr˜C~_l)Yn\[ 7#w`fwIO};N:e`a(A_eOI{Za`wݝ/3gL})ړRtGuAKP|VID@D@D@D@D@D@D@D@ X䣤㎋D(@^:RJ즭3gΌ$t"f(ȅ^gQ3#իWd6sdgQl&Ҷmɓ#(1H#}̝cu6YQFѵ6TD_ 4g~f$1#MF,Zj"ELzcsؤ[Q=7b<TN{7b̑ aꫮnx{T\9boi ;&)_|EEnMG ;bNj>H"E'xmuIً@vx9/gGYz'OlJ|7Ԉ +fXK.4m4bFg{6gW&qsݛ6#Yw`89Ms0}7}w=z$b/<bݾ0.b6\^?駟RXsbq$3X,(6㼈EvyS`Ʃ#2#~7^2M0!Lmƍƪx Ǧэ;6ޘ;!`w$ɂD6`UW]s<=?+ :~&f̐ԍqLl]J֋m K$'[$0W&DXN@-t]늮 ejL/e,n#fZwz<k.駟f1ʗ}[y9˱ܒ9YZu`ԓeh`e7|2-Yn(RR/1Y6Tf"@o0:|x pRO{Ĉdՙh|>{@DVedZi#^d}#kYl/RI*DȌ6P95S-AĂG8[+ r܍>:ie@.cǎ-VtkqD"j6_ qACX [[$b?ΕR" "PX8LqsɄ)*>/r#}a~c/�q6,X8p+ ۸yg7쳋5+O]5Ξ-(e~\L<O9r^A>msŪ#k}~J'lK?3{eׯ+X~_vוMt*rGU2-A~%wq6z' |>Ges'^T>xo֋pMԧ{HtU8^c٭u~r=]v%[կpU`+0rr)KVif]f_WS{ٛ GF"'~q}kIX}[f=]tqC-q1=m|jt0^ϋՇX@0s|qHn �+ vә8H3}WnE yhAqhQN~9r""myN _x]>=}�#vQ2GΡhOGus}]wV[mw%\S"FN<ĢsK/I^nh(:6ڴid<W/[̝l͋`&LX6M%(r4 ױ<x3+oq]>};8| 1 oܱcG :ػ7n}Q04hayh@VZEh\Dc_9p baLh|Ȅx-qDAMv?:aM^1"ހJtJ4nPADX.mc9c9E#4$T%'Q3x ɉAJڷok2y. A2i{%%vd~̠7qxP,?_TҾKNe{ۊe,oXb})m|S|.*E<quٳ#͛7w}&ŏݮurv1q$d[CY?sb(E*RC*\< ]-KuT@>ht}[ Bzk2X,Gf$b,YZ k"(- $n}YlZv:  !V|/|{׻}^2ѻ3c>;5w[] C><bٸ~HdԨ," yN[nNd;,9f6 )o0~c%Z{kDsΉK˳(~~>͚5NB9H4OkgiҤmգ4nЗ o|g;T.%_n/ɲWh: m_Lam +!0' y$S{0>G+Oi}R0TŒ=$YU> Ziԫ<vOG4}t9'ZFY;D|h2ȟc%b8BُF̶.Y0E8i}pKq*BSL)3 S1cP'Kh/Š>|ׇ&*Sk# )TM[f͚.7 PF nݺ0Cl0g nQ L&o``<9,#,eѹ&�sMœqaa=tysnMx/!+, WEċ/M7||f+Wq̬E,:k6E;,^r2Mt&M @1kժUݶErk։GD@D@D@D@D@D@ @v`q,P{;-qgn3ô?j=gdPhѢLD|]+hԨ8c?w,LL8#t ̠}6J7a}xan<?#sɧ06lpfw9A1'|[0RAi=S_?QRCnۜ <b!8Y)&e k׮ncpa:<ce .3 3vgdϬu֮b?žd< koY6I{IÂ1s5=(d}ێ aЖ 7FFغZ~fK1v,Ц PrX @Z&0kӎ5kC]w ):z ; L $ý_[g1G8&q 1ו !@^^xuW/}%0hpyQ5UBD@D IJoиqc=X`$<0W1UΏ7_7fYQ߮a3{<d<'ԋnkA`o/ϣym@>7ۯ{`kw͏>ϧ0}=%+0˄>G,O?)'%eOk>-CU> 2E3SׄY?=Yfvt8c\Fu> i: x|a۰ dcڭ/>8~}opwOaJh+WϞ=ԣրN=Ti߾}(mOM|_cn !nD#`uE] %rY(:^ڕE,ZfΜ NbÆ Cڵd.z9!S.]8EG&X1E+iTbFeEk}7ateAca'wg̘qa<ddt /K1zMNĵ)p"J" " " " " " "P~}s , ` }NhWT=駟 Ivc+ 3f'Jrq 4UԊq~c%mb#ј_:NH* )O1F)m<-^nGVd,=G#xu:5ݍXm|3=2(NSXJr}c Nɾ_vM!ܱ2|Ž, 7D~9ǹDH?g|SwP{6V{5 E"=SD@D@D P_ِ5>}i41=rhЀ;`8Am("Laޯ},^XqǏuw$ZJ{O׻vtl/];-M@>0g<(.|(E@b�H&D1 P 9`P1`(FPĀ $( 8=5_zvLz鮮zsaNZD@�mgϞ͊lJxN,YYfypXVr?Ϙ,o]'s;lA2e` Xղe˒gH^˾߀Rlu}bP[cW3rX{G}-R+~~9sĺ~LCY"rMtOdc~ϓ}@"_5푌-QbޱcƌO hIQF9DwG!9`AN^?f-ƴȖ$IzO@l}ۢSDF۷/Ml^|Eg;F{8dt{t]yRD@D@D@D@D@D@D@DxU\+v%%^zg-t'ӷ~9yC?ˈBtfbD!$sYfxWp!KAǡC:Xs: p9\jV!C2<M2G'F_lY星_wމ=7ҹvKԘ0>S2>n싻 bMg*DD@D@D@D@D@DH\L'O. TՃ"];-c9+o詽t3f0`�^z%761gSw,#Ҹ1q%јS*uԾMH6҄ q( 6㍧E{u`+ߥq2ܯyEәN%4M%qN@ 9uѵd[ ~#SyV#1^;R_6:q|ԫOwX9s&b 'P&R9Qhݺ>(=֚6m>?e!GC_  Ԝځ/ 4XOXz[XCX{gmboQ :1xkOC${84~U-w\Y&<T,|}6[ ΂ �>9X@Fx97n;=1?Ϙ˓=cqxOoϜ߹eTl?jzO7̹N =S%o;'S߳sn` [β8~+K*S}uxO/ 3^JՖ }o;g6R"#ůO=)xLpMvO8${sxu=WF$duLڱzjSG_B?`:쳝0 =_% ˺Cc= NRibI'|S(m=izAI0잟xfmʜ̳)|>ϔ9·LW%\: ,;vjҥK7ǻf~ O/E@D@D@D@D@D@D@D@ @傮*/1pw1&&J:ur_{eM>gy&(y駻h=.3eQN0R7x90V\閑ua11I6IS y{1|L+%FF 6'FāmĈLo[z>#ڳgOoSe2I g_>|xJT1" " " " " " NWw\Kn!w?\rz!x|%ےx, r1';>{NM4ѣ]d}Q7dPϘIp"{6z["Zbm3x S:6Ɯ r[MHٳqE9?xZy0% .�aG~w=EVG&ɢ3X)�4$%^BMA!e_g҉c{N~~臭B^V[oS)7־ Xľ /q?:=qXn;s=g1{QBCbI:w 0#oĹ w۔eCF+D@D@D@C"SߨA`TaCXMFi( }yq\)db0xvVw UP7^xij8ߒ%Kp„_Rߵ7b᛬ "4Ynj/" N0}qBoT!b.?/C-~s8˓=c4Ɋ# sN6]f*yzlJF3>yxdHbiNqCh4-C)π{w` y\ԩSrmS%w_/9iv^~OG/#)d6?I޽ {ztd͛;Dc~S6x%U8YX.˔ݓWO.WZ|1 =ӭFoyM \/ 8PS>4ufs,p0C@coc-LH{e)n馸ܳAlx3 "xP afO7@ada^7:FE~ +'r8BKN1vDq�n&(Xvm$In 'p?p\G}Db}qvadnȻ% pb}.7JCF� yNQ:]a"|<y`9rlct4:s Q7l3tՕ# 62+uAsBzܹΰsZ0uiI@/Q`Y8& 0Ef4L&�Ww@)}Q:ZE@AX˖-]"͸ =X 2ĽsnsX΋-rxK~ fiNQC9čyЉgu~gW6)9qDwl~ܘ2?zC7;8vC#Yu3駟9N%ϸxl9ĭ(vSOb#'ǟ(v+mbkO1'o\,` &thhO1P:O#?9>E#H3O�5:PJ6V8g,LؿV11r0`>J޷rn;,h:-v�nrN<7L̙>gŠ3Wu]QfM'zG w܇oƒ1^{Ճ,(AexWúhr7nw^}%0UƍqilJ.CrD@D@D@EZn,{U#�^v> # 6ii0ZhK.ĕqP~8~cƌqy8:͂ϰ<9;SLqcكݚ[3fHN_FB\nl7ǠJOgh6 ` BgO=庮~~#8b7OC:GF&?Ϙ/E7:眙b;dlΙ'[.m<`^~g"dyS-+6FD/޼uWӾAۢ }^=y{`}S7Lבɯ-AJX7r,zkɻ8/z>7=#$uO=ԳlgGť~i Ͻ;DjiK%wӧO_|Q;{q|w!L-n8* YW�' P(9cLrKB{[Tu <L|u:NC?;|}DX:PYI*W_}ɜ)|!s-#d! YPϞ=6n?!pYdmG}tȄ"C65(d|M^z!] tI!*2Ȑ9M02dȮ|3XI&w62gPjyx8d!>&<Yr^<EwAȌ]96$s iƝ" }ܹs >Bf2СH>682aKǎ7o^']dm�úխ[7dbZR˾kþ$" " A"0iTG))?%ED@D mM!dэCf9ާ9Vp3mn{ZB_~yl3/W_3 ukz &(5;w}${x 2̈5tꩧq]Æ ?,o2Іn2C2cyyVZLKn^#rz9dm0y7.ñQFh*ˌŘ_tmI6v}fx~w?#1 ̸;ԺuiV q|Fw͍q} `2Rw-G!s {^M�24`�7my! td,p3!̔B~$ˈ-\XH ㎌ %3uJfFmCf>!\?㽆c^^rhgN.! h2礐Q9Mol'R~w#?bsq}H٨2햚Ϸ~۠D 4s:=!c[\afyV6 d5_׊ׇBo\Qg/PdžB{oc c !YxﵴYȔY+=#pvj&Z*Swe *];ZJuz 0n7~kף:*d,b1Ő3xU8`UB*g0quL;gYQO?3J=cxƴ }!mĦB&lJ4F$[UfIp26C&СyM0s%<39=G.>`WdHPՌ~>ξ>�;-c ?8{gI_/ UmXf}%oI| m+m58wm7Ss~RICS%ʾg!yҵNvjە6 bߝDv6l&[f|{i=CC6 bv/Rm̱?>潋ɫU=#ҷc|m9mKtLf{ۂ:,K<@N>e &&_AD@D@D@D@D@D@D@D plB-I˙4)3H�#Ux.=y,Hꢁ[|&sQݒ�uIUAo.z\Æ Kի]IUeqM snF&?fP}ngysJHqu5 h#L|�f>sL1kߟq]@9w<`p0c A9Ka" " "P{ {A2 Z%#" T 8!WN0SSOur A֍-x~>fHĈ#pWbҥ02)<g1DbgFwRgo{y2�صAeOu&٘S³c]<ōIj0zh!8e§`72㐋(o<R-?Sdׅ۟gu_yav?`Tyf2%\/̉ύÖt[AG+)3ޱ>(,;c2]!=ĦWPsT#6�t(4s۝[W\Hwt`�CtZf8hacncLz,X=hݻ/A){?~mXhhD{+Ff?%RX_axlUoÍ]UW ~;&@СC<y3ǛUׯ_]W?ϘgL>N3aor2cۢ#?s~sF|727WfA a:aB|]{lk/{{;v,L$O)e֧~:~m9D)>$?(%ۏ<uQ7{!_yHS$9Jf{'{m~'%U8џ3eM쇜nҤIm<❳<pu1Âں m۶-OQ:&G 2駰>E+};N:)<q=�y:ѾW^?e˖Im3;cao[rMvdPnAߋ A5SS `aQ][Xb am믿W^y &$@M&Jt:uj];NRh¢Nܯ_i"" " ~ /`&fSD@R%PB˖-3Cx&6g ;i )תU![n%1ڡbL :q1 3T#D#ɓ'cܸqxWۻu zB:ur޶L-#p .Nz1+kL$>CAY =Tt˧4|lv81~TM!�t')ۘFu{PYLPxk|gntZ&2 .6^V0k0C><*T`UX&<<�M4aAnM6֒¨.hoނ 6'QiRbxE6 ,v76d/v[{{ , {r_@A7쳏kfD۞{ d;YiY䑦;}6F._|1$|'|2:vZ!;.LWٞ"m 5(I..ٳqM7X��@�IDATtK?|n8a;?h> c:8G`+KPA>Ν[1YE@D@D@D@D@D@D@D@D T㺩j"6 mF߿?f͚':A .]i8]K:Ͼ3gc4Hf$z%+(o &D@D@D@D@D@D@D ƍ� ]v3xEǔ֭:+).]믿vёB)|nLU믿Ҫ3#fpBNoY.p:J'|JR~tufn:zs?uQNN4+VW_DN9唌8PP,_SڵM}vi''Zz7kUUT:AŔP86[kY-V!̄o)UT'@~7bH/2V98Gl:5 o2;Ia `b`^Ge\"I9tRGuժwm\ˢ#\|h7Cʦ#d�?q<&" EJy3gt(6})ɟp E+/{r_֔(I6 :t@*Uy)S%` "m۶u}uTJ�Әy:{~낭f@ � і'mnShml]Oq7puN�ٵ�z?bWl[8P嗁瞃dW\ _1f͚ĶZޙwuW=ǤPG@dQ,|fҀr/RI�' 87{ENCժAp@`=')YVZ5kUW"衇}6_/%" "{A2rR 9ޟ*N*"0*`/9L>Æ # 7mڴ0*|饗ܘ\00qUW9u jxdĈJtj0tP͒%Ko:ɓ'[li裏N;z-=:'ud:fL5w7ΉF54r蜓駟vN=T;6߫[ĞfM4y{r< ?ĭ\(,aP&PLi=#sۯm<@.n;G~fz( \LeGfiX�tK s))V9rd5vvyV,fy*>]/7|ID@D (^x!Z\W\De:AA0_?ݻ7N:$ѣB /w}3{ʕ+.A8)(v=6#zB~L@lA@m-O^U,~Ю"}lӦ PB= fϢo1~A3t`{GC54J vGE&H߈@d_\5,:|8s&Xe?DVB5@'|%hX`դ=E@D@M_br\j)" %PBYe:3�~hݺun8QY@Bp,{uY .YPt>3' @&|ϟP@pv{;w1b{?<ǞvAM>(  &LիEg^9mV C_r|%J>�N4sn;mPxk|>٨}߭@_Jp3vE<JYa5I "22P< 5a<MXO)T�Kwn~WsAIsԜeȊH<?=.r KQE'-0#x˾k ̱-}A7RJPTHݞByG`ڵΦmg̘lմj߾}9;K7�|Ԯ]4Ll/f^$" " " " " " " " "R./Yt,?d. AhN;aʔ)=QVӬ%`±ϰ/@}K 3Ԟ" " " " " "  }sxs� g Gb#s=5/_ÇVZ2d@tYx1yL8W\q=XhԨs}qUWaŊ8#K/xwq8)^{q}e}<S&Z -Zu. =jQ"P+CE@D@D@kؠA476 </Qd)`ۤ v⦓R PY3�^XxOEJ" " @=q&`%j+ڵmD �+B}}}}}}}q5j.PpK.9su-v 6nfr6 SQAAn;xὄ 7cx=xH"SO?N<1ꗉ;ЧOXs$ *CD@D@D@D@D@D@D@D@K@wolIN]vuk֬J@}+3;c_bRL!F-Z3pB<t <ԩZo_E~qqQGa„ X`:ts9  ]tEflSfTZGq;YLo6xG2Y%_aȑ.((z뭼qS{ٲE>5Z< Ak)d4m}%6,vIZ5`_kc 3T}a4�ѰDaaj!" #ЪU+g=o<8sdAD"=oҿ}V Ps_~qfM6mVb.2L:+WJ" yG#x=Q⽄C?sxQoi`]Tkg7j% `J"L;v?3\}8qcȐ!:t(ZlL0ju}N}q衇d=N̎ " " " " " " Y"N;yٲepcǎ5#v8CпfMLj&Mr?S|` QJ8{isE<x0:'·;Wtu*4裏(7pZn]*Ɠ?I›?ͷv?B ID@D@DP~Bq?{swb*1I->R f /PzФ֮dRHڡ` l0}:p Äǀ1c " ObK\s݋ǸyJcйM`^P5 o ̚5 >  L0z;%OV}m`ܦMxټyXX:oձ(3ҥKo{ \p]Jh۶-vr.]@5k)"j*v! n_Іcq&MX`N LԳ󿪛T-(6" " " " " " " " "B2%﯒N;ŋA#<|*.h^nᯞ|IM|f͚aذa>|84QX*" "fd-xxZ&"?> abSL?vc:~w}ݘF52u*#%1<xߺ`*}b'OvQjժXk^)JO`ss &qySN1'sQ^=Iٳqꩧ_wƍCƍ,5?dq;m"PLi.(5>b`Dp~/z `]` \0u≰�)߇ڔ) QaW)@10R|2lxAQbn&" Co.ܹs={9ijo֬Ywy>,~i̟?[n%0nРA~ 9s*LjʅE!#\7mB<!Ye:uT۷o]IU r|OJWv3cҭ[7t=z�ak׮]3|%߀C k-{� Sj >_%" " " " " " " " H2m,*^<3ng ׯsh/^4Nq<b-VoT\9uM_br\j)" %fB͚5{i8Ct8N5m4+Nf7nB*:;J_|^z%7[o1jժaev^:(0:\r%,y-اodž't1h(E3fe]u^{-zb)CCҒ|[b@Y4skOAloG]v/ƌԤZ.iv퀾}c(D&%`L0ECQ`_ ~6~UR#D@DhpO= u ӧD"jHP5Sz嗝_Ɋ+СCtAΧ~!R2R$#is O`H D9&͜9$~{:` 4pmڴqYf٬(ŋ۽x~ds¯[&6tSgD;/SR)8~UWVmW./,*Z(v" " " " " " " " "d Wۓ?saҤIo Ĉ^(^UTIZv?k׮u)b />z�o_U#sr4q@P".]ԉ!u`[z;bvBϞ=x"D �E?2/ӧoJoFavsR{EA7o_$) :Qh R~X`3~{we+vK?~/\r%?m۶)yott]vg Ta]&~kv/ 4snlPxk|> L/އQ6$,nX\9M49QMJaA`dD(ذ9 "s`ijFs[o=[8ɹsΡjժڬƔ7ϹqΑ΂}~ Xה;BL%sc߆E") IHodI,tQi2,IaHvU.)gL]ˡ0(fϞ2(~rle=f-,na'" /;wnI潝_M�L ΢Pܷcǎ.sN:Ρ:1L!%95>iXiB*" " " " " " " " "GBKHB"cEP~}..sA5d|MRNӐgڴi./_͛7 (ػwo'Y15YE@D@D8u,&u֞" "[AzHDSN57"U梘Sl4@WD$;ɠ~X?j;`wƮ 3I[j8N3|'6s޽wuWvNPRo-܂y9GÇoݦjrwwLDFJyD ~[_(4sK[W~fzhG~ V|sX88[VM  ֮ٲTzYPX[8 =m=D l,:gչD Xlq~x8wI5Ms^{5gKukl/l=z�t"1f+Ew}aٲen}>!:m+rUfeN:M0a8P$sfa!\[(B_L[R11[l6lEXoRD 1)m3m3薉7 6\1'XfPk[@cwavcfg?`ϹṈ¨j)" " " " " " " " "M@BDY|-b+%b ;֭&{g "@3'=#ӧ;y"{w3|f'" " & GS׿Z{@n E!40wL p68HF;gnРA*k<%yP|֬Y.`WynLHD*1JժUsuJ' \s J kdȬXnsxe0 B20Mx/^'|?'fc9w9Z'u/nú4oVڳ8 x~ϹA+g3Ǝ{Dqgf6(]@_}ϺR9 l`ذrÒ8x`\`ʔj(:k <0L<蚨@Q%qB?* ,Ν;sΣ7R\ٳ̙3s\y {d9hr<G8HO\gp)e:N|2M+�t~wNv;O/mF [haA Z{CM6~EKH�//Yo3/\e ?z~*)r 6pMo*n|-[T0RZIi؋.:+#+f_1☜ Q(`,Nҁ 'n;PO1fN*e�Y?3 f̘&y0' 4ɿJ"$" " 9# GSq@PҡJCZ:> ^M4qA}*|ߦxRxW9sL.]*Z,?)I%/q)ZjB3@N޽'x L4 Rb T{T|g3)<<,'O(鐱Cq jԨsR!W=ߦCObO9=2(5>~l[8XQYLx#̡8ۗV#и1,@-.8Cpw_j%{ؘQNbE 0d3^QJz" " =G}=@o9ڮ];m?yN<r´!g(h"|iM/pv˗/w݃'I.]?DzeaqvOK E2{"|/bLHO‚7D(n ER{{\)~Gچ Coo2r (ԪU+,Z!rJhO)̥Ϟ?DzZRiEnP˖&D *N =}ܘߐUUD@D@D@D@D@D@D@D@D@|OPMR%)F e idTNgҾ}{gҺuk0ӉZISk=!jXDcN:9C Fd愶@?br\j)" %LS)9LP\w_la\-3 n7pLWK_~9�0So޼y.s'Luuy}$s )&ҙF|7@ Slu~[]jIiӦp( )Yf^膫??Dd|/v4sn{kPxk|><:|#s}OG-eUÉ?pa8Cpʼ0 I$Kz%4[oN?f<`%J" " Nl~9 %ypUV&7yK'`J<98/<1CΗs^zN"z]`E" S0$!Ͽ>6s'IH Fr魛RxbL<3F?L 7uF-PHv=K~ B}"�GF/E.?Zd_)#)^6ml hWЬY3P (}0ݻÞ7߄UXU%8& BEJ_@AdA].U pkK2 )ĉSN^P#cլ j.9A P�9qDqG gRH;vD1v ID@D%+&u֞" "[4ě4 8ܞ1 eЙ|o;< zDrcx\}49 ɕ Ffx$\FH@ŽGS38fU$pWwN%UTno>}:^}U3ΞDC1Wҥl׮ ({k$޳LH?rf0;qK @N)9䌴GDϷ A&PLiz_mO o_9FUxmsDqCS b^~9plʆpiaQl#6w)-} @�?s"o4 ,\~;0p`PqޜB^: ㏒SPdE%sWץ[Pڋ3+8G)hǹRm2@? O"̜''[,_0ĭSh64N$2r&Ozv$GǍ3}w8y6C%.u0XK"9:̀2G [OΪU z⣍7.#BϼGSRIlv˯mމ@Oω@@d\H5 Xx P!hBH|\2'_9ZV-9 +W BN@#2s)1"!#uz 5(hHBJz# GSZ{@n E!T㟍dad?78 J fjiD{Fџ9p2*2^ 4rlBQ4 =un4G86B&,#2~"SLQ @g6ѽkm* E{N Κ5 u9ys{%yQi-#yoཔL~<;oq9sq_^B޽tSJC =UUR!PLi=r7(5>~_t H qv <:v ,ƧR z�Lg2pvI\zi̯1MG y&͂t UѣâtlLHf$%_Χpܛ_!�D5S<\Kܹ-)9g2*"Qs\9e:} 8Oy(GU^D(3r.#_ĔrC¢d]4;.l`Pn/.Cv;c!y9ZKD!%WOSһ\fM5jɜ;/yX0+nE/y<Go2%^'O9Ѣ'czc"pw|=agv3t"N{ȏ" " " " " " " " "  !LPT"e<`"3E!'ȉWo'?SG`/G~f9vdf7oL#NrЛ8Lt~oKoQ(jIge.9a$" " "PhVkO-MrHnϫ'@e˖9QH:wx3.ʽ%9]:2<QH0޸OY=eo3Zx\DxFҞ4Q4y ǎCX:Xmp:u;Wx]7o Ls2Y5_eR4׻/^qhxyϢ(j+'HH*厀CX|WFbO9W&||n}%=ŹϸqZ`cl[)=#F�3f�|^9::6S�O>{mxYcacuݺ-" "M9=aDΛ{"l+PAD?OPKf? z<zˌ+Qs<9sJyyr.uaq䲱EQ �#!)IH `#)FlYM=H'{' F/#<%#a*-7{潆c_gP02gS x{K2E+c{sKk9W(K%{#kI{%O3zYNG9@)jZVWXYGF'J" " " " " " " " " EFjG$9vQ$r[4!'= ooѱlHKoԛ<$!'κ(D@D@D@D@D@D@D@M 7р4g<medmCX8<;3)4K|8Bif@oۅ^>qD,~'6|sk? s@^d>蠃9#,Y=]o#أ7L' zNx_klwA" " " "P.D` [o H2R!K@> 0XPhk PH# b,`s;f{YmVD@D@m=�DΙ{␜ޜ)͍s͏Gn:$"q~ɛ#&?s'ȹr&`z& tn;)TeS%@$o |W*w zޒ\L1� SfT]Ywy/o%R06ʼq{.ֺ'oQ,`&EH'yιx22s.߻zKsRcq ^L3Fn@" " " " " " " " " s`]o6�˼ gH~iCE@D@D@D@D@D@D@D =4`"7k,hm_}`3C Aǎq%SOuy^}U/@&K۵k_SwRЅ y86R aPC)}{^{%#/O%%@GtӳPAiS嗁o<<xu;k$ @aET.&(}%d}y 0^&;":Q(rRK3E"yL`?J0$"[oFV.2hN1X;ID [=vSwY9@oXc J" " " " " " " " " I@By]*%ХK̘1W\q>lL4 wuڷo_-R@nݰ),d?Â[�իgȂ+hܰÎ;\0ETɋ*l%L/< qGkF*S�N>4v[`X`btV+D@D@D@R&磍7=b|yXz2%jԀ Cz"\r;u_H�ТEE@fƇ'>8-w`=+ +:@. H2u.AZj Я_?{ܹ3=\' D" T\}qBGȪ" " " " " "~h0ovXβJP~!,\z :"Æi o3K&%V *#ڴ(\taag6 BFH@�sN߰8". ErV(=:eEfnStG}CB -E X\S8j<)ط/lVSkE@D@D@D@D@D@D@D@J GÏAūv@ oӧO 7܀??8n6.SՑ ,9M%2(6e6 vW\3` R0Q[ox+93SG@BhKq.$,pQM`8J" " " "  pa9Q;ut;୷~=qf̀ܨPwA kOAw%`2`s>U¢so\k3䊀 sEZr\2F8�Æ C=1c`+G:D'ЧO5/)SࠃJ@ " " " " " EFB YRl >8Ń{ M¢E%ZoN9Ei\P ADD )f9'|oPv`㍓D@D@D@D@|S',Mx|̋3f-_^z4wvfCzzJZahBc3}U{HfG \yeJKt@Sm$[߉ AT[D@D@D@D@D@D@D@D@D@[l^{ wy'8 <Ӹ;ЫWmIn/J2/j&" " " " "P.OW_;XO],4@&/wɒ] }X}¢CE(V;hPԑ" " " " `#soyyLSZF͚#7ȦXiV^͛;PnyKq" Lଳ{y8촄k,7aAymyT@~d~^JD@D@D@D@D@D@D@D@D@!PR% 6 }5gu]qqꫯFڵ_D {oL0!P" " " " " "P(٪UV?튿P2гgE� ,Zhm<yx"pK!SpO%brI`睁O?(,qQ &ZD@D@D@z[nΉjaAH DCxKfO0rR’^ #!c7n ԯe. h>g$K:݌c#  Aa^͟&" " " " " " " " " ! !pYD@D@D@D@D@D@D@D@D@D c5kg}'Nȑ# /cmN 2c'QA"�I/4OKy뭷N`dÆjsdkOڵՋܪT PpT>CgXVBHi/O`o ?m8"РܡCzXP2^H8'`͚ҲW5( keUy Kcc3Li>" #p)@� Cf5<,BID@D@D@D@D@D@D@D@D x4k ; {vb nnaPgmkSLd>_(MD@D@D@D@DB]={V:i|]b@`π#�أ|RT\Yk" 'Ы0{6@~0b#E@D@D@D@@:�s։w_~)+l�5+V.-R%￞0'ϱ2TVzJ ԭ Ԯ ,ZTMk" #ЭХ 0~|f >ǀ>}U-z0fyRrĈh׮n& 0[J=<MQFBUG :@' f Xm%ɥb||U/l.b{EǑ ᩧfްv-PJJS9" \{-paߎ/N;M5x|&L/BS8$"m୷\dW/|>#3ܱ۹?'7. BKFD?8D`Ŋo}|wuUW x#@d^YKD@D@D@D@D@D@D@D@D Po?83APL8r 6x@qPcsK`]v\`"2=QD@D@D@D@D@D@@gz&:1Q=fM`H`ժp|N޶=T ~;AaΠWCJ@jv +SG)r@0ԯ0oUBE!)yps_-<QHy\[g E `Ѣ'/,ѣcJ,-" " " " " " " " "P$YP-Gnݺ0a;0 :ڵõ^!Cd� 7|'ܹsVΡBE@D@D@D@D@D9iˠ>hrˠ<6h�r p55ˢ`!#@Ivƌ.(|ڵ)kj"}Vij*" " " "_8 6in"[~ |Qx;dz- Qys AV$[�_{Ԑ y&0jTNHH:dٳgða0qDqhٲeΦ"LChذ!M&! w]D@D@D@D@D ~  ;�o_>$@K,ٺ5> n tpBX\m}/? AA"1y-8?pYa!ۛn8 cPA" " " " "z-Zs#\T22SDJYJB뗊GyB'[Sl|S(|?x⸼/~0�Wz(V,+v��@�IDATf ) 8Т ]~8餓Pr@Q3GRJիNjQ>sdU@!$_4(Vt+bQ`HcAV5kw._:*6:n0h0s&f$LX x p%(ndLIe@fԬ PDoZXT2Z4}($mW=CjaHO2rXGR�sѢ@0 '?o}OԎ" " " " " " " " " M@B}}:޽9e]ѣGG]w݅m) ;<g^U#" " " " "P(I a?Xٳ`݆o0n\:PpGik rKX_Vd\5x�8`];`S� +@!R%,HT�(@$׽s_bn⑞Hh#�avn\j !E 4m MMv[D@D@D@D@D@D@D@D@D@D# " " " " " " " " " "P߿? bFǙgi&.˞fQ.gՉD@D@D@D@D@D _ йALva>N: F`͚H,L}Y4 63*S%P(·je>m7O+=ছ]wZn" " " " "k̛m?,#%pρEe Y:u "9%q BID t*˖{ PDg5D@D@D@D@D@D@D@D@D@B@Aj@ t:\xxq]ws΁g#�'о}{4lӦMd1H""@Gq:v1QS'9{8uKU hvڒ>֭;8�g J T)(U;E P<†1hp)�!h,ڈ@`e5WxyGcљܶd 0kSlUR q둙۽\޷'/.+WKaZGj/ d*" " " " " " " " "xUT&pbС޽;F!k֬x>:J߫W/8S/@G@ӷ2Y c F7i<p-5Ew*R_2<0b0s&`hJ>Bagvj,b( i(٦ pyiիg*VD@D@D@D@Bnݰx�POZ", CrX(&vmiժPcEuR "?K0�X>=vR,e5 VZaڴipg⩧wib RkL'`C{+2%((\ ^\ ̚ 8wڒ:G!/ ۔M7;#Gf,U. -N@w_`=kƌ7'**@h<,j)ޞ,_X\n2:K|R]hdaHBnqu~fnh*odBߋ@B0-ZXf4SBGD@D@D@D@D@D@D@D@D 4tˮF�+aYkޡ<vygp No 6"MGɔNϟ7qQD@D@D@D@D@� wء[M}Yl}?t>0X_^L"\pp@ÆY>a/!"jBQY8|ਣN gk*1" " " " "3-ZE߲yʕBkdD@?9a:nҒx6*"9}d*iMD�+L}o^{ ݺE" " " " " " " " " "P 'f /ĩ~;8jptժUû+!!Q" " " " " EDBtZWB,Aky{Y1w/]Z{.p]UW\Kx3J" yF|x $dN<B^<#" " " " yNy Atd2ȿ Qnɒ �޾|yi X~aqfKy\27hPzD (+Wn}4z+~V$ !HZ�4hsO|kpGGLEMCf͚vmA=q~>" " " " " "PB!_+٣GQ^ kEn zÆV@V-"yCI@m7`L;B c�TR1uYE@D@D@D@Dp\AP 1,g8'UaHE.^^{--RLE ' -[dUy&B ןW^⯾ [<uE@豨h@F裏 'mbׯ_@~ 0ӧ]@QXX% Q :+믿J믿\#~ڵ.δbE]Tt)U�w?bNU2rr-S6亷@4h TBi]|3pE%�pD@�y_;PKNn;'ډw'2W%!{BBTRI(HRHӦ'QўJ}Ӿ)m*RZE |?ץrY^3̽=s @"ԯ/͛5):xcFіU{KH̼nhdW,!6yXd>]S9\" Yƿg2>wz*3G�@�@�@�@�r 2gE�@�@�@�@�R[n:t !6^Nѹ x6{xժUG � � G Y3EMfϖ,OÔ/θ;f/\0l"awK˖- Yd职=q&XX"<Wf?:6#0#3=p2sȤYrʅ@HCm5Tv'fW^=ӤciDAiCHCAD)H*UGBK믗ZLjR@�@�N [\ٺүF![?>7ºlC0ouo^q Xwo(+o;LsOiX> � � � � �A < � � � � UV߯^zSO.좛nI}MSB(>co>]y@�@�HY %݂ MF]ğ~)l-ۜ9s2ׯ_LP3֭fgSpE߼e [EK,[lyrcհ@I:-r}C W^Jߏzg6;WRN3|lVo5lP7V !\N?]'eaܒ¯{6a�%N /H'K\[9R_NA � �@Fa/Y-#/}9^tߺ2JJ!kdXp~%u#J?/-qe@�@�@�@�HNV � � � � � /Ru)'w&gϤ=ԪUKӧO'2^|ڋ� � �>yD )݂ ?PuWɲ x?o&l~|RfC۵kNnF>v? 7g –[N .  |�\jU8u2eݎ;MI&a?Hb/zƌ!2^/�o?'vY:\ir#@�@�HU2wԼytLPȷV?/2~ Θ=ċ]pM"~} #wѢH<V =JPr  � � � � H � � � � � lV[tqijѢq68ѹlt~& � � -V&}d4Ml2 矇.ڵk 5k#<R7*U*Z*UJu [N MٌoI&{ʕ+á5-)vw&D+gL-|h> xu裥oF/ <L\-g@�@�@ T: L$[շ8)魭{C˽ {_?H2Tɒq/vI*[VbixF{p� � � � �O y7 � � � � m۶ W^y=\=6)04>xp / � � KjW[ioUkf}f͚*VZ5lRڵ >XgS LN:͝3X,f髯 a~;nY&N 쳏Zn-mڴi/@bհHc|C @ xR~EK/nY>\:d) � �Ν x[-E[v\Z?߁zHznͺHzm ;:5Z8뮓z~T~i � � � �E!@dQ(s @�@�@�@�@ ʕ+#G{߿QnA/Дc=t꯿RŊց#� � @ ,Z$լ^3Y_4[|r{aPATzuݻkwѠA$Plyߺt^3g ̘1#x;6Czx/JҾ}{u!tQ$AnW$@ժQ9HW\!vt e ${? � �/!7@INƍ-7Z7zҤ 70!-ai'+WJ~(볌F>}-@�@�@�@�GZP@�@�@�@�@ ZliӦ$t駟!TZju3Kw} 켜@�@�HU+Yj[0yh;r:ڵk_oׯ_]v%~j׮MYݔ(Svm7!?ZO:U7t.U\Y￿>`z+7ըG{%kV "byl(i0gOi=QΝ\@�@�? (-+5jm]BXd<$o'o.P|=ݺusSG*Y2+x" X<0]e )'R  � � � �$�AQo@�@�@�@�@ JۈeGk{ua*W\Ԑ*;`UCXAE)ϵ@�@�@ Q/4IM=<uk ,[L^|EZ|yzl)T^x:t蠚5kƥ9g1 x8>Z̜9S'N;C#FsϕCq֭[,UTC�/ C T7(@ U<[e+rԶmk@�@�F ? mKCn+5lm" 4iCXd,aK*xBYü&@�@�@�@�$n � � � � �l$R.{=~2d{9" p#b=AiX� � �l"hԾ&yH{|O𿒖4w誫R.]B�`^%@fguiƏ^zIcƌQC d^ԱcG{ ҵIc-3' i 쾻҇yN\~t � �$͛/aom]￳PBp/:J<,2 5#e $ ⬜@�@�@�@�]� � � � � P %l:K]v@ޒ/kij $<rJ � � �i(AjO]{u-ozK{74vWT)vazt衇RJ[~ΐh۶mFٳgEIƍ>XuQ>}ԯ_?5mڴ@m;$rSP{9Ha6m_>@>\: ipH � � bd뗨Jm& +"vl0ڲ5Q(ܹn=.ǖ.ptQ(dpHl`CX$ ^w1Q0/KuhG�@�@�@�@� 2{A�@�@�@�@� mf6Cxý&o8$<oڵkU4C$Gu@�@�@` ,0LM #}|%K 6}ݧ>%65lh;PzGCu]gdkРA֭SqtҷJMq H @ 컯,Y:5 _A68h. � @x#L/(WNahJVE?D3G GoPHOgUaEv>Pg-k  � � � � P,XOΆ� � � � � }!:K:u)oQUV(7o5k~PӦMS4 @�@�X`R -2Tyj֬YSOU r8 /P2tаM<9x≪].ffEGǕA\.-N@<�㭷)S@:v!"@�@�RG^-g"($@ ;G[vZ" 4(rlpӿptjYDzhmTSKJK>ꭥ} � � � � PA:D�@�@�@�@�DN:zg3k;CݺuKkffTdI}AO@�@�HkE[d{͛#F衇 ywW^*SLN"%`z}7jԨyiلX/;t5='j s9G}{å<P2Cq � �+PQh^궒o=4�S_hӠH_ϗ;)QB``~{_Z~?<Z�+ʕE@�@�@�@�Q S:!� � � � �d8c5sLuYG};8-'ddޑI/P|y!2C@�@�@�|M iӤ}ի5ܒvi'M>]ƍg}>}7BL_ guY}شiS>c~O|/- C`<�rh[N:�C"m(  � �I/P^ l"PԲԵt"(>*M$d]W~Zo=dc6ml5 8Di8<`1ыMmZD֧-{nט!� � � � @ N֊So@�@�@�@�@�fmW^8pve|ݻwr5*мys}W � � @* ,\(y ZjԪ2{xԺuğ<yN>d\RvY^ɒahzk 6Lgy.첰XIW~wV\=K݋މ~2ekZ }W:U+vСu � �[.P4oޖ3 lhk-ϏR΍n̉n_=VbEAɿP!w^|q^cJ]/WD�@�@�@�@ M~Lf"� � � � �"p!/%\>}']we{md/%%Zh~:%B#@�@�@� ,Z$ը>F}_jCW_}jѪZj E PZ=SN }Qu)OW0 >I=݋Aw+~N];ixO@Ȟ=w<P%BA�@�@ Y| բE-5lm]6EC"ַ)S|x"֍ԭ eӍ7JK+m[Pg< � � � �  � � � � �@J„?^l|uui*SZ_ϫJk֬Qr咺-T@�@�ȫA֪׽eK+fݖlnOK{<yrX,czGEZYGhzCM7ݤAZ#j֔x@><S~eIf@B=yFkG6L<8oP@�@�Hx&D a/IhˮKF"΍x%_kK< r7F-H6])ǿJ?ZQ#iȬQ@�@�@�@�@Jԉ8 Xxnao~t/P@�@�@�@�H}3<3Lر[uI'`ߑ6[.Ou~O֝ZhLdmF�@�@�-nA֭fZrt/BӦMSQ@d6l7x#J>&eҤI2dv}w-XV;թS'q.⢯H!\3Fs p2K'˥)#-=d/} 2� gM~Q= `K/R@�`@rN ^۲&PoUqm*G@R˖ґG!k\2Egi((rTd͢KZ&H]VMvE_-DpQĉ?ݠߪ[m%$'"(H?c:;Z|� T :4sŶg͚@�@�@� 2[@�d4> yW_>L0`OA�@�@�@�H ꫯ˖- _}~}]uASmd+j,Y$?s<ퟬ;*URPo@�@�(/]pΝhga,kcHN<0qmmOEP|68&6i=O#/7߬+mvs=}'w!Hr)Gy$צע ;x} P@�| xM7E!' 䕶^:4E @ 0_Ȩ$@zҊdhιgZE9"]l8{m[ /l=_駲~K|F٘%Yt-RRݺO?I{xNR R:Q_wfQ8ҥ9DZ`FOϙ31yPgV% ᭷ҾZ~{X4]v4I^SN� � � �E)@dQjs-RT;8:蠌AM4gp}|^$?B � � � ZҌ3„aÆM6aaDnlp]~j.뮻TM?΋ʥ%�4l0ǥr;i � � Y kH?fN0AǏW}Oy*r ȁ7\\r߿'h1AG aċ.(,-+ -v+l"i6)fPvUjRzvJlY& PժI^Bxےoy4iR_"�l�6@ ]]jz;bĈsrٿpXQ@ԩVriXwҪU05=JUȂؤkem1DzXFI' .4}U@4 P>xa3_eٳgX(K. +o?7� � � �+@Z}1qDWFGgATjժ\rAs � � � �@ҥC䧶D 6xvB柲QFa-!@V*HZ RAթym𴍞 � � �i"paA~dهjb0KzR^ 7kRIsΕjؕeȐ!j޼.\[ٷ\wN<rn MC�"P _o~8 ~(H*E@�`@,<�i(P^h.sKN8[.Ds, $ P5kƥIG-ka1#ˣ͙Gƍ%2 }+rHV[I5jHu>[i8_~l $@ɒ%[AzJ9کqj!|>쳌ǹ� � � �%Z#O뵣ã>ol*ޥKwq>k YSQFmT_]OH_U{I'ŋղEkm -?~["o֭ު/2L9ZlO>Y]tQF@uw z(Uz3dUOӧOWJۇ-i^xA-V_拂� � � � Ph͚5Ӕ)SBСCmgC?>Shω=¼x|fe׷P5m_E  � � .IkGkg̐lȆ-q{x-[&L".>DŽduDl2+z/篺*թSG?.0FD:Ä;?׈#f 80c,KNch6m 6,ß|169<9}[}<hVyKmtM7C9眓is&LO<O<9#7Oʢz3]v-^@ٺuka,f5ltncx2NVw|re]:J㈲+ /+zn܃ WJvB(c!M&xlܩlܦtY6M]  N9m|tz'VM'͛aϜ~h)r;v"8_, OpiΕݜƥx_os>eҤIOWRدJ klag^=zaT?_@qX7F x_ S źі],Ms{ ޗC|-]~끒Ȼ/.3 {Yg/e`tm1?'4h֭E|5kc-YDQRƏNBj8_|Q{? � � � ^$EzZR^;TB2z'h|л7=7i$8OGyF&~y{Т=w}Àn cǎ > ?<cBx2N_}|_!Ophҥa+̽#bω'k0`@9>Ac z؀wR@�@�@�@� W'{0_|mVm۶ }?W^8g>1,Rjհpk?>#qᘰc A}] !� � �|Ulx,y^{>WŊd!>㏇�Ǒ#G>wƓx8aΝÄ+W*}l&o>}XO>$oڴi>qKnchNK'v=Ls/9ͭ>oj}>.x'>r2u԰o-oE0q0nݺIMY_r!6z+9^ƿmW[`7RI@|]qdB%˥Qh̜Y @ A@ r;7z2*U~1Ĉ\>9in\ʯvڅ>}lժ=\-_<<;gϞ=&5'P(.~ŋe߫uPgz8g)[Gdݥ! fϖe lmdoQYpd]^b},Nb_C%-ߕ�/w<xp}翷V>?>||硋F<#aN;~뭷iF;Yss<9֊\j*s8@�@�@�T FA�qJMb˗r)5hŘ ^1h)S}l0|lݺu93<6z ?8 w [GfcB[yl|3>`ƾ^D[pax:sc5k֌-[,c لٳ6 c駱RJŬ593 �l7Ӗ7|ͽ){A� J'&  YbBb\P 6mZ7z3]V)~ǂ-y @ۢq*+Ji|?,]/UVW5+<LC.l8I,Ӑ67j(v5d|]wƏ:the{<AU\9csAxØeb i M0 ;wn좋.u)W2ɼVZ'ԭ[7fƼ^;-b 93nJG _Ϙ1#|m-㧉?_c98XHBx scbebKg>eX>Z�#bE,6fL,N1pΘ_8u& @2 0_ c@2c+#йsY彿(Org4"/s3*q)ʘK ?Kc6_˭ 2*AsO.%}gb/~{,vűX^XvX16l.vX>M{o,6aB,fݶ+\-�qi;s}>œg Wxǜ;YҚ5k_IJ*=gt_l-(; ϙU.s=q� � � �i&P:( [1y־Zmڴy w _[cWxhB%KF?jyiŊzv-w~]/6=r~oO=TYHzǬ]V?px,ufS\~Wҳ6e^NӢEl-[zˊ Fu:j3x}%<  � � � @ ؂%믵n'ai|h 0]wݕ]V)~L~w)R�@Ew-� �Ԯq/1UMDŽx*T*ٴiӌ.yI~uY- n?_>c /14~>}hԩzW[s?y/q@6wZx߄-|*[ V [6}܍-* OGfXd8-n3>~-4'쐠uT3 Z"V[I+W -ՠAҷJ/$)vԤtͲ Ҟ�@ _`@0�ֽb󢤼jUvsil:AZi֬YzB{/l0&^Mr)~EFnM(oO{p:3k\2E3'ꋟ=[ճ`rK+~5c=W&MYpIn6HVˁнޫ<Pؘ \槟~}ꩧdap|ϾO/.G;v%|뮻s+cXxdMhx3'|ve~ � � � FӨ4)vxcۇggd|mя兀;l0wy]u>f.׷|V?硍}r; 3}رc>;oov ~+sƌ � � � �$|qلA?~|ڵk1he(_vqnjR6pDj 2'۶mڍu � � >KZm*F}Bifn/8$rtW(O>F&{c?nĉobH GK^676gwylٲZl{olRzh?O zW|6lh]e%1<խO _T6 -哳3er;,w S%1$ j ~J'|[  P`@q>(��@�IDATA|06%]es˜~ m׵^}^|E1FY6os)~E(BJ{O~hB#9�Iok駥 d EGP. }o8osKA ~7VW>�GksH;#?a2>.w>҃*nKk_Ȍ� � � �)P2=M@ /%K M%22kx4ޱ@.w+|6)wVCI>u$O`&p a�^{i<<M6t '?P߾}CgѿO7-*@�@�@�@z|5#<2,Y*dW>UR_UI{FTH^8$: � @b ,Z$mTBb֯ kij}V�|Wc?wq(/R;?ކ5kyC;>ս{?OAs>3<.]ؤ!\iӦ]j+K <Op8P4g&LH;w%M,͛Sn' S%A$Ϗi|骫<YuW>:zeR@�r`�rx{d#!i͙w%sZY/6^Z>ʔ)cdžEWs[#ʆ(4F6C 6`Whq뮓z* WߊfvtԨ4wngH([XT,8V:8颋^~Y6RߝZ'Syy׬gΟU$y C#3ss/SNͼFs}7{lu-֚s{d2߿Q4o<G�@�@�@�4b8n"@UϿ{7G[i۶m#ýk׆OƍämYO?49r)>|{[j!8裏 /0 @?_jc=VZ^xA-[ :4N/- � � � @1 T^]<H (OSm< aVpÆ ) �[&ܲp4 �wiCҢ|Y7_~o1cdC?!>y"ꁖ+WΨ>6&~.L>/1^ϓ1Y|Woq>3ʕ+í//nq1DŽ~K/T_}U'1<sŭ+tQGqIy]T4n\^N}l]0( @ ϖF<lN-r\H` 0_ ߞT WOZBj"oE�5kM1Ƀ=�%\m6y"~;SMAsXD}W4( <>y3l-_[GW6LѾ/vGѢ 6-SmD+tQȤOIa8pC$F6f\ ͐"Uki>v?*o.^8>ש`v-of<iKn<l_~`չ9nN?p_=Ⱦ[tƣ � � � @Z LVhȓ@@{.hQFzǩE_믿w`Ƌwjz[8:JZ#B~g+J5 eUn%K?O83׾M`|Hid|ʖZ`AxpJv¹z]ΝmÉ3t '覛n  � � � @ t޽{w-o_%k7p@-Y$)ԷU*Y\\RU � @ xd ZK_|}66 tȑ61rv,’՘x˗g.]ED{3O14'ů7fvI>'|>[77lsYlYFJ.{3<ӧ_ !n8qM0~C>^'mDٍ?_W_}ug|9Hm<R;o  Pwb=K2,YFG6.5Y3wu> P3_߈T�$ZβM_s?>=:cUvs|/Ϩ~<�^%~}V ˜|}#PukSe‚yd<w͚^{͝'4sf7JݺɂdH锅Im< 4wY{}-*F9*Կr)a6i+d}a̷zkEol!CX6o/|6䋐"a?~a}Ro7M42g!*j9m~]-AkIbg&>wy  � � �X#�/P^oQbMo߾1 WYb:3cŬS4lw^lҤIwц*f*nؘ1cbw:ZcaaTƬ4feʔ N/;klv?#,1eNرqb6<ǪVYgҥKl1|{ckg~y睍 � A`8.ke/O  PP;7Q@ P6=v=dB֭ck׎ַUu*k]X.u@�X6syٔi A ԟ߫~t~&r }t*OK2 W}}QGIz0QrM؋]{a?ǦMƥ׾p1 nܨ:>Nd=9Yzu&ʕ+}> /sci9_+/9Ǐ饗bM6 /UTЈ-Z(/XFc}lb&3Zhc,3/gXe&;lq?jԨcf>q1Α<W| v|'8&KID?lxHH?yeCNcW_-XեR @ 0_EfB[Hz,Os֬YmBJ b>F}.͹r4uΕcРA;5k�C6k k$`S"c.槵bsbSb64}iءl.j,VR7uXVXlc63騱[nŞ>Xl4Ǥy߅SbŊw+6/ꟓԬY3ֲe0g?1bDg}g)rHUV1 ٢X_3e~:vh � � � @Z C8+ҳgtq |O~zzҥ/e:q6 WZM?3+ju-~5jdvZ[ejeX.lWϗJvdLa W � @O?-WFIG)^Eڀ�.y?U^S�-j*ϾVP'J <3ak Đc}" "1J{N:i@ ԟ߫|pt~ (pJ;,uW,OqWd_Qq衇Ԅ d`l:e6fzK[Posof.)|<m/5sLⳲEYVX!￙5k,S_}lq\lnrرce jȑKrFXTtgoTa/vE Eo. D�$YGl誎<R_I664G@�| 0_`6Xp&PT rȑ?p@n3>wɼ^lϨ?#g2ȭ+^̹} +~]n(h7ސ}J*vXAUߤ9sd?-}lѢ gTI6Us3mmsbÙYyϙ3 \‚e\şs�YuoR Bj…_&WK@�@�@�HG UA`Ӂy8]@�@�14oTV' PP\ 1cN9唰Ǖ6 sjq_;c!ī!5B�Cƭۀu բ%JiZXϛ.g͛KݻK_^W-k~z6eJ믿l<yxs1{x /Bʕ5qɢF{/z[Idйsg=vGɖ\ptM4hfWwh"{m)@BvI*�i(`k1.jH0@O0  HW6"@a T|/}Ku ΋�$[4Ni EVCo㡑~;ol1>~^C"=<ҳʕ+jrR@�@�@�@� \t"@\tʴN;e˖}Z·� � � � P@{>c]}2dƍ_=c />t KjtAmYF>{ʬYԸqĮ,C�@( � Ik'f Vg7ogX^z%]veѣѣGjժy;AaM6ͱ*Tܞ,kdúua-ZPRG魷 O,,X^{M:u\|0cOS'߇'o%m8@I'E̙Bx4|,X_:04ġ Vf@><@: ԪbUo]O!P46T^yhU6_Vyh,Ko9}zʕё>?PM  deuKd=|uҺըQC;vp< � � �$�AIQ]R>TϞ=IuAi̘1IUg*� � � �@['YmfV4t :ꨣ{J=HRzuUTIgNf6@v,tj.� f ]+-]*ժY'A?:+U.YFC9D'|r95jT( xoY}!;#.Z⡋^{ڴiy"%z]w |P-哕m zꖞ-y6{> �(ЬtM5H='ws(rC(;&c˨3 �r6b@><@: 4l‚3*7A[%_aBV.\8Pa¿W(\H~hk.k-YuPoKsm94fͬ'h%l@~T,۷ɓSi @�@�@�r 2B w\h&)h; � � � @ 4o\nf 6L<Ǝ+cOF_дݷ->gΜm? G�@�@�XXTvj5k=;o?}e'-H,r-6ru-L9"TV^mX eŊoh ?|,x,R/^Agkۂ< @+'mf>C|0 ! 5Tbԏ"�-|| Nuq#1}u:"|w)-_.]zi՝o@o٭rlA(҃!㛯l `~}tm uR6ݻwW۶mc'Nâx16#@�@�@�@XV_*� � � � � P%mY;O 6m袋.*_=eW!yݶn;͟??G+ ,D@�@ .A~* 6<ˇ^[VϞ=?y'娤(a-6{wС6iw{vm}7hd8(%PNŃ .MVHuF+!^}5 _S' :5h � @NK!@q tҙgJjwm~ldIäOx Ӳmq?H#~tqq}N9Ed">p,PH-*߉ԫG]K0az5J￿~k(-B�@�@�@� 2m^j� � � � � 7 oN[{nI& gڴig}/;EAN@�\ -7  �@:Aڟ*Uj4}O}ڵkڤ6l̙e'h2 L<Y'pB|G4b͚5Kg}ʖ-iς{7(s&Ù|2}ga2ԗ:"�yx8ijFW\!zQj^jD񼞏@�@�RCb|yjV *ybhSa x -TǎR~>e`HwH"l+|Cj,}ii 頃w"mdm+맖 Kz5o1~|s=W3f̰V� � � �$�AIQe@�@�@�@�@�-z+ovUO6R?2fxn:=xjS 7k@ Gد/  �$ERrR* XҧJ{Qp'lԨQXaܹ!?ֹsg=a^]3?QFY8W?~x?O}VbBYSw_ 2 wr@ g ϤO>9DFYԥQ D*6@�@�H~( x!]t9-GAJڌxc^%>8I?H`ϗ; %�H'7*Uޟ{%{ty-D}lYA:0}L/:ֿ<VK.MF:@�@�@�H9 S%A � � � � �y—^zI=yd\Ǐy6_%2K$2{A�*E{  �$…rxQAAƽjԨahzWUjU 0LkG6YiݹE_=zڴi nQG3gjҤI}TtWXyIu鼵kK�h_q$5sIR:H'Kt1 � @: ԫ7 @ \uU7w X9>i /HK/, .[Z*UJ:Uj[賘m }w !!hr┧s˖-nAo|]wU&L� � � �@эn,r}@�@�@�@�@�eKtwIg}?p[7|Wq]򑚔< x6uժUPBcG@� � 7p@�D3AKҊw󿹻t6ӓO>O<1=fCv5<;6 ֭[iӦ<^ٲ۬Yf3dGeg;LqztҌEE{]>S( @ X΀=6?.=tRFQ8d>RiGC@�@�REzk @ l̗tuErT\YTmY;͙#[<Kh~*=|CR6[')kRJ gq:~\˧ E�@�@�@� 29_7j� � � � � P5j԰IC!O?t.[ճgp%*UTWNykwL:@i~!QrZ@� E  }aROL,h*6_~a[l^y3<”s:աCլYL`̙8qyqa1ޣ&MxՓ^{-} ׏& [FgY�/U@�\/zH+vd P>oU+qA@�@�B-sJ"SOvIE`MYn$ڲ?D6 [i„(xH_A(҃!}uS?%P_ ?O}QYq � � � A&@%@�@�@�@�@�Ek׮ /Px q>}Zn(Lz4/E�Ţʕ,j �AT.٬T|ѷ'$_zw+l_}Nm۶ AE_SXPLOM7u԰M2E rʡfĈ:C;% <&/ ^NzO.^@5AT (*k7ߔ~X:|s$ᡐer努F\@�@oy D`i$̜JM`2ed$E[Vz~E4(ҿ1^&:ҿOYpd^:~o߾jӦJ]p*6<� � � �,@wf1�\@�@�@�@�@ T"ի `aʹz xMժUKJ �K �lex @� ] ܳ/S =(*xo^/_{/l8vXy`5^{g|}HI8O}QZZ9x`u!Hb9>i1jeu{$b ̒@ k\]D۟J='=Գ,X]:$Y0TDj � �.Xw0C7iiN6-鯿nFΙ#Zᐙ5ʖ u ¢b7jÆ ӫju<l>q*IM@�@�@�@�HQT � � � � �@ǎ_hȐ![m#ܹ5jT IK*hѢl�F�@ I @T@�,<v,H>,DhMv6*k6mZ;+P-[Eak޼|sP _ fK͛J_~eí>٢ڴnZvZ9J$:H04at≅[W[WzhӦk@�TI'~Ez G`%Nv-1O@�@�6+̢ @ :3G,,C},]ޟ[۶Y?`ȟ>~ \}n}Pw/5QxE1{oӠ㾨 � � �l�A[L @�@�@�@�@�RYbŊ[l ߿vuW5J 6@ZU@�Aވg@�(.=xqjAzqťVPA۷[e˖O? N2E{o}j[g&M¶N;q[%OlK`Y~njӷ~+]Ck֬B:3ժUYL|]+wzhoGdiZNȯ uC�E??,#9Bz0~'F;<aD1@�@�T^=٢> PL"=laC |3'-Yq@d<0嗣?G?G}ϱ}Y$ 1c.btIz*{wjm)s@�@�@�@ ' s9@�@�@�@�@�_`' /PO=~5k \@�\bh si@�A`Riݺ6 z TZU;v [a|M6s0σ z6)q5h@mvۍt$,_h;w~Ys V |v;:t?jڴMEOsgҡQ'2}^mZ�)W_-]ucIGKCJB!Y2@�@ <r irJUA ƍ--sDA�"QCmg9aBNjwdz]˗ ~ׯvm7=C:@�@�@�( "� � � � �$@ٲeu嗫{:S{hذaaҥr5%2;G�&`9E7/B�@(.VvQ^hA}RC%?V;Sغvʕ+O?H8oSN^treCִ YZo=ZXbؼ5z/ +XmoRK:?`zz!{キMl7nnK*UKux}ԢEBUP*co~)SsR@ -Jڵ1c7ސ\"s?^:hr  � @B ^#2_N7ek;Ίm] $w`R?H$II"PHVQ (Pz L xU #("AE@d:ۻ;lsyj;LwWկg{f̕V" l.Qp CrV42'B(N?3c[wasGID@D@D@D@D@D@D@bA@^2E@D@D@D@D@D@D@D@D@D@@1sL<x1n895JvE#uy]WD@O Q@ID@D@D $d=)Rg8cݺuV6lN… +n۶  u)0E!Y[*T"?%ɺp_wo)~u%˗/o OA9tmf @)S&u3&%I''_k" " 9'S]e?~Fo@)" " " "s&6MW::SD {> ܻ^u@ 0ũz9Tmv!WHP$mޜr*Bi3m>_u 0O[oeDR5 AFJ 1iw 7p6mAYaH6(MRvhMD@D [Q3̟{:? ~!3V\4‹njN1={R ;nV SF˖#z!|BD}F/2&ݒQKm�_~ ~{xWYXFl}<!ID Q '˽l1a' I!H@vpDm-" " " FD X1`͚D+I`ron݀_ ZmQE@2'@FPGR(i"Mx#sȪUS G^{hժ*q2dn63Ɲ'T'" " " " " " " ! !Ȉ`EE@D@D@D@D@D@D@D@D@D@@M>uT >w}7{=+Fe 8j;%yTD:@D@2% @Ѿپ}E=K,isN4JtN, s�F3ЉB ] T親q" "3_e С̻Х peqwbvTzoVE@N?`ـ^4 8P $ E֫P޵+H$E#)II>W\Kj'jiF .xQhܸ}vj)" " " " " " " "pHauE@D@D@D@D@D@D@D@D@D@D �En&o}g~'@QZ&y:}v3 " Hrjd9>;!" " &aP\K.N=5vuH)yqd~=ر{YmDM!H~GBE@D z^^ 3x]`H ɣkWOLWc"[]]D@D@D@� ׬I֫"Y[yWC}�G\]]D )rtH BR2%5xvq`'IH/W x'Lu&E-x !x @ T\1Fn 'NĈ#Ю]@/(U=u.dy" "p< }," " 1$qc χjՊ!$/zbv$NŊԩObd6 |TuH@U�yyٲQÁ=QJID@D@D@D LVtK`:Oј[!~>`�paPdݺ^N3{7>o 6mJ9(IqH.B,KID@D@D@D@D@D@D@F@BG#E@D@D@D@D@D@D@D@D@D@D z?r .\s5&Jspټ\-!Ȅj@8!cQT@(Iq& ARJ!@!H qƆ}Jm 6 p]1~S&tiO5d PG_|T lL}PE@D@D@"KW}2tuH? Fe�<�Ij@|lB])+VxSxlIiǧt<ؔc&" " " " " " "d^- ewѣGuK/]FrϪV" "d޼qY=UJD@D@� 4._~ne%BMUnjPr RrɒHh@ PL)|3?/Qh '" " "L+kmjD�?d cZaÀ F Td@")x9;wzi"'M"nM9\9ZbGBR՚@p H2V-:uB֭1p@t A3V˗E Km[1Fh""  !@F5BD@D (I'ںo׮j׎$ܹ@&O[Ah " # y;E!ǎ( y 0^nȓ'xWD@D@D@D *Uv� (Q"%"L+V�#G_\|1@ f{*"Pd-@k۷{B|LO?^RҟO<ۮRE@�H2�7QMo%K4#ѣGus=k&+.\  TH:L[$ÇM<'rIGի)ņ%^jŦ|<8` Ayldž"" "~"`~QOr8OaZy-[uE ʕY#!ȠS#r>#ͮzȕ+@(^hˡm'IqH'{dPd ( FR(Ҙl*$� A&MRE@D@D@D@D@D@D@D@D@D@A<_~ދ믿o6FUTR̄>:}7ofG3hO\hʡHRl,Z/GoҢwv5 Ap!ШQNEB>0`'Ia_YtD!>T('" " "*UZ`*%3 ]B`0oF;w&�$5sP nҊDr<H>k܃?("Khc" " " " " " "k*P"vM]}m S@=Z"E^_^z!O_~&J ̈́fmwes~\.Z}cǎ8j5AD@"GA2c]YD@D@rB`Fﬠ A8(^R%'ttN8,^ Ԩ!p5Z�~:ֵ|'о AFJpxC;(- tBnpD /iº@(Q(V XҚ5^01 A:JFNv? X3{+<d@nx`h V"`$otV TeD"+T$sSW+" " " " " " "5$"|JN嗁}SӖ@ 4k ?G}vy+UV/gg :?xZ5^&L0ѦCp(]s5$D@D@D ^]_uvrփL&HΛ-[w PfIz\̟F)" "j6 $@2@N(&@@ UOD a| 0k'HA% QL[Sg징rD X8Dw(,FAԞ=aj30g~H'9}no׺USD"\ E5P^<[MD@D@D@D@D@D ${@ t|3uP*@c[nիN;4<4h1rn6 ƻ!M#3I'5j9B" " i 9(:JFg  zزi$N}Uӌ 4ja ̘l!Hh;7cDD@D |2p^^,ErHT)cGOm["J" G@wOT#$i#0/a_n$N8(_>+A!0a+U|/ h4(-U;D@D X(|gu"j$`jcD" DΟ=" " " " 3��@�IDAT" " "{E " y'g,IB7}mD@D@D@D@D@D@D@D@D (�9k, :?0Ǝƃ3J7oƞ={PVqks9SN="ik[D@D = Ag=" " "6l�ʖ䉇ڄ \|q+f�,n5k&@QOknkv_ID@D re(d@�&ڵ  &J" H+=q3ڴs}"L`^[ G͚w<." Y%9O Z3l,/Y^(r|࣏kSIJN< ,Q"GD@D@D@D@D@D@ Ϋ"UW_|fox@d˗׿qtgp hܸq? ,nj3@QxKÔ)S2CU8*CO@ظ(W.*ƪlP^0^TUji:8 ~Ҥ8`֨m̸Pz.ˈ%UL=a.]…=Q /$ $VSE@"F "r-B>HLOc[;w �7?zjbK> ^s<9T2&)ᅦ =2Sɒ"9@Hf^cKJ" " " " " " ",*,wZ`yF Q,ZF믿K/{&Lȑ#ьj'b̘18cpcذaY^r%(S ϐu*i,<̐i@jLC[" " "/,uvcb͵k'_ۃb<,_hP[ $ܻ@z*a6<Q. vP {w⋁ '="?/?B5Hlz>c  F{Cg~ Pm�O= WmQ-E@D@K5jx9T{�+WD:ox#9ajRWÇ*CD@D@D@D@D@D@D  H2, @*㗍3+&yR3^9"Z@d ɓ7|3:t>}e˖[e< x!c}MƋGT6 ,xx͘TgیBJ" " G'Q,_>~ΚPX1@ᤚk-ZwPtKB3h:~ۚ. PDRH>*�{y&6y8gO[ݺ́�%J$XbE@"rE@FP!a{z+RW/^m@|_x&[�ٺ{V{ns {jHEV@rv,pBjqH'eŊ�V)@P)S@VcǦ/΅LID@D@D@D@D@D@yrĪj+" >UVg}fo~!ԩc GРAdo(p 2dHQBJ" " Y# !ȬqQ" " "m6�RS 㬋Q)gGTUAY$fh~ƌlѡ" " %P,L+/'ڶD!^؁aqD@qt3T&pM;vno5 zD Phk4`d � g w'�xk�p5W-QyŊ3=={<F{NZH+W.,B" !ĺ_D�tq9}LID@D@D@D@D@D@eXdrĪj+" !\s5h׮.R|'8x .1^3c|f@/NRѦM|`]ʗ/q4ޝJ" " Y" !,aA" " "u7Qh"v#U>= jӦd@a3(z}@D@D@@2@^^޶ &0nз/л7p9(dN'5WD@QbD@Of=y<6ژBU7_ L@ap)n0HСd 8UYD@D ipl37q/Peo)m !,U*GD@D@D@D@D@D@"I@Bk@eo UOO v3U](^8V\c9Jվ:]{ixMQׯ1$7$֟$Xꦥ+5TD@D@D Йh&|`B[m*:a+@&ajS4o ̝ yf#OD@D , \}w�>Vছ<].]Ν?6/*UD nxA!sz+@ PqO&;~ T w^pŚ>UUPccfMzȟ~X.׫1!]V-zj>h(" " " " " "V]TW#Gԟܧ$" " " " " " " " "[vt"V0a^xJO8I;vDҥe[<sqR;UCD@�uif71nj)" "4s.W.xMCU@k[hN1�݃D_٩gӦ=�+f:fM3$XwN(V /|' y�Z�uD!+UMUt7X0f]R ԍ}%6}ٳ29HA,y5]3'" " A o^jU/ R˗{y oѣ?Hi燝Hde@)jMD@D@D@D@D@D@B@BYcD jn5ܧ$" " " " " " " " ";?ÇgZ ~>p@4nC5|X>,3Mh:D0]UD@J@Bj@Bظѫ~ ,J0_PZ&Fu)8 ՒN#ԧ'" "  )t>~<a%Bv T+"9 dG@vkL9z�(#@Q) Gp%gL~=^?4@+ o]ED@D  �9To\,E0򣏼;vxgQb^=`$E9O$" " " " " " ~к�8tUa s@l:t}"Ubfb;wQlg|'myCJV  d " "4N| Xgj^Ef:%JUϬ(^s71?t!6m&(7o(8X `xǁA� ,Sgj]D 3Ȍ>ؠ1Ǿ85rrz`toyޘˉ' qRc9sD@D@D(MoPiqSjwwVH$CҥC]]D@D@D@D@D@D@N*@j=z�=㺒@ck3f`ڴi2e ̙F,0$#lقݻ/4a,[jeߍJ" " " !l" " "6xbAtơaaT`t/8)ȩ<vm/ ;`D@D@D 7 �ڷ2e< p=@@׮(d:)I@r@rgRD : 1k":e&r%0`�^=g^}T~w y{=N޵u@dwj>vڵ)N(r`D3ckSb<m(j� R*LEwOբ8"X5a:Piܭ%љf&':3:x3C;lFz…χy䱙;:m:3өܭ+uu~^Xmёݟ+hŸpiy@cնm[{1ٳ3_m!g͚e9&<<ڵ w>5y]Xt7nɥ[wtӷ~ƻ?u'r\Ѝr.AeBRc=nsIn KnqT@!"  @@B pTE#q#P,(%KZ׮Dj8uet~mhԫ='*;NK.kaPy̼P'ɸTg:^�֭[úuV<۶ms}n…I/8<+Y$J*&ʕCŊ|^RRE@�m/V%-6]:???'-+Ŋ0jT_#VbDpGw>X~ >pv\םU%m4rNf1O? <7dbf6o)8{6=P8д)p@˖gEfz)}(" " "8\:+}BN --F#O*U/ֲJ}&ڍ3Ӯِ}0Kؗ(}*7Zw-}rK\?n-igLs.y $" " " "  !hPVqCC:8ܹ39=:nݿtZGPȲNgN;Seډ:~&>.yۭst;zժömׁqt\:n46>r);ηf<mvvEIJ" " " " " " " " ")믿N[Gkpu_ŋAJlڴɎ <8U(;9~\W%&nK[/_<4V̄,G!f686s-qc}nLg]XG%JY6ʔ)cV>p0|3wz" " " !@!H ddցlZ4tq S]U4(itxt)Pf6ON9<+" "0Y4{<lQy <[KAHFYdH} .\XVի~#�89.uѩ}OJV(9sɹD Gr>s~[~^B F9 U:u9K.i_$"8GgRL}\w"#N`m;,#3(;diy/<8P-Y'׬9i6 M`ed',羜$} }~?>6ͼ'AK ] Mݺ=a' 4dg<{=-󂅜|2Ьp@\RԖ�_N:ˡGh'_;vxg񽁂~5a<xо ~s9nüݼh\/'cfͿ:]쟹~KV_{?sbŸ~חh+]wv/6sndͬ#:NW١?wveZtrPPvh@6;rTtΓ댹bYOcP"nud]gKg\2;\>v c-jPvXWNzNvڎ36qKv]Gܿ&91&ݺwnb٭&B]qvv밻m~fؤP67QqQٰaGL'+?hiǥz5֭[jN@Iy;~txf$),XzmBiv zfs;x͛-c5ƉBRO˚]XX%-*XtĔYgV"Bлw.�R[zHPϙ|!H 3>37LHtv?,/?<0s&0~<CxN]zM=anlW|g6"QrVH8_uQ:(E46J]thdRJY;R.͐2[ NRtO>ϛ8,_~}41dM6KEID ~Չyq< tY\:%>O.6>7w\b]p~X/geFu:u"um_9_,E*{_:+a8[ iS1MⒿ!%S8 qK׉uw曁O? #FtH1O?[IgOL/˼$=;WN9`t bwg^DR FVp۸,{g2݅'+sٍ~^ܿ![|w;[:B9;qٜ8]?E"_2?N(AM[~ hc2m>}gj( }uQu>d'5TvR7)!0Ψ_X4 p;sv묪BvXq IJ.II7I˴wߙK'9*:dg>TgN=;"}" " " " " " " "=4С#;vTcE4385FFrKqcH+M HcMɂv%ǻyi5o޼#<ޟx(Ia *N8WɄ`vc." ~N-E@D@D yϏ}=]ӝ5 7p^o*Vp^U׊'(=zS_ A?W@῾(" " Nf^:�q0$9(d̈G�&OI&ooFsUVT:uln8s>!B$ݨ`-4 sū|ЊC֬Yӈm9D@rGpj??v)6q 8!>m>{X|B-9oOdL&>g\%ҿ)Y]NJ£Qq롄T(JC*N9{b*n?&6qbO<{]-$?<ҥxQID@D@D@Bl3H9YZ(B?L�_.CQj'>34a_?\{~x``WѹGh@h ֹtx⻻{u*UaÆ׉]֭s6r;NK]_}H$b6?SW?i;} اM˴MwQgn@dݳט'~W/1.6qb/'Uu@)(CԮmv cマj)#FQvy'bŊT⩜M8%9.qWRq LǦUFes%::9̧vtnq:S)'.Ā2pˉ~r]ĉu4rN}t;X1sOID y q@{r"`^ѠAltFl#r^=Fɍ{T(+e?$| cyTOgx ' Ia矇qtu1[o66/ݻwǙg&MlٲѫPJ�/#W`ٳgc̙2e ^u+lIvڙ.8ӏHfovnI_B�NΉܦ/ҿM*©0 3rJ+m'B+1J/˗R9aHo.mxgG6Fw VY<928@E@D@D@D B:nRmn*}!4u6N2"M Ei3h34O=u[;~Oh<޽ gڑ&e$p|Ǭfl4mԾ;A?�J @a& ?[q_~m\?[BeJ*/S" " " " ' !3 8!N�;.[2qegN`Й/Dֹr WG%\yNR:U. r#A8Vy(K*9dGKw -E@D@D@D@D@D@D@D h8ʠ ^t)y84С_-6׹tPJ4}g,q90BnN*?w9*9O>َϻ& ANj@oqT0Uem>M.d� oL9LBToc;ǸD@t^[@r; x/c tBn i %; 3f Ǝkq^CF~6_< !F}6?cHԩS$=s_KѨQ 4[mThW@?- Ky>59|MU^=A'Z J"Tc#3jf7ڵ]91[_bFOn4;I *|~9YzWo|Y?%" " " "mk{90_,۳fR{xg11P(hq9?93&v#Eat)#wǎvvi3m{ oOae"Pܒ i]Ԟw9+Bn|c{/g5kր"(O?^>(D][KiBθ%Y|)9HdNϗ '2|agDIs"щ>r CvZD@Oy1g51#'%0$.E_<FLtbgY)vc7AV5И{Xp͋-ܸ )L'5j1Sr\$o޼nO@tTpgP!Dqʖ+:f 27vmԩct_~B]" qF J2#" "KvcFdLWɱttU+5P �ژ(#cWFǎ޼y0cW," " wa<QH #Fxܝ:y瞫P/((Q>|8~'+صkWt M4Hιv4/Æ ٳm`4 b>F+ŊKB>?S`8?LFcKrD囤vF�})DaV]k7aM;#p\lЗ)"0>84ir#T1xD@D@D@D , iˮћK'R -Ie^;׸�_<�pC!d,pBN?{(|t~Q_I@…XcueeW7JL>̎g8A|^O6v d c}$" " " !L(y3J?WLpB(݋6'{KK(;EBnuN(gZID@ ۷Gp*iRI3A- C2s^Hp06FNjXօE?&" ЀgXD@�G`EG>RLF94R3 ܒJ"ohlù{_J*SN9:5lf%"p0N&VU[' *hW]p~E2V|_|`|MU`s"RD.ze0dbV/`l+#E0f3M&M5'0vC?춪u" " !)Fm<8ԒСC1zhAnF4o<Hf̘3czAۤ�F%;w qI_-mB(@ ke$0_> )0gV̛3BHys(n- T!\iNJύjFhݒE<-D@D@D@D q p.̘丛n6j/r]z }>},X`3hW˼a{e|8KfA`柔co&(I_qg"-1S0R]Q+E@D@D@"C@B֫2*w%')y�E1h~;q6�'\FSHIN4rC:qy>8QɁ23I\!wHi9q=֑" "].o&F-̙Yf٘;w`= Néj (WN*T(ޚ@p^_~l\RƮ]\Bݺuq駣I&hڴMP$oNZ*H@_? AF+,5>K2~#=}6JZY c;Lj9 p�^|1'')L3>`WuE@D@D0̙@b@(/ 'd<x뭷{UvmꪫQUʐm0j(<+}g3<I@.0ҥKd ~[sulٲGڪ{fjuj9RZ %L?2Es_E_+f~|T9q5kZA0y$" " " A c'eE+=5v?R�c L|om83EnE_vfG`'N\h~W۟9tg-ZjY X_ .˗/.@&J,8诿:Q�%tXfʛ7(H;5 a�| {J" "4^`f<Tb'|NRR ~v"n/n'(sk3(Q"OD@D@D@D@D@D@D 0xmXѸ;=3п4lЎ](:ɿ,I|:nf\?p΁?J0a5z;cI˖-ܼys9":pZ@طA2�6n +<tL+QZdM�NDfss9sg`0 ĩj*" " $`Lq^^6EkWpa}{O�3ܮ֭[g )fH_=z I&KͧP-FEQx1x`0E4)Yb,]G޽{… m-^؊I b Y|W_}DblWl0QVݺ1g'ݻ}m<ƍDYD+Z9+.)n%eJ" " " "(lS WCs[SE~l![q8# g s+F={1Bbϟ?Ç:5vMDuhP" " " " AFL&̗YN$2oB8IIp # P1<|T@PNE.~۩%h<p=qQX8 W^=%v@ 0KL2_}TUX5i]]f@c )s-q`٘1c>S<Ss瞋>@!t19vdhcL|HmuqG?RL j׎I*4(9r$@>S?x]a Tm:clb[2<z"_ 3p)QȠRxTRx7�d<yR,ț7/z+ B};v,y#p5D1%K�EE'0hTڦ}YgwF$+Wl?O>jj@J['>V^m;h̯VZuGSN9^6̴+˽y\T6s`<߶ň-3<;Mܹ~09&B QSm1w\L8O>$'A!Hz4of EE@D@D@Fq#tJy᧟~?laKd%Q"DH=F" qM>gH|2#or[ؾ}=xc- 4hN;>gLMKS" " " " " " "-rڴiOlasҥ@ݝwi zZ[f:)d�k֬i3v܉SNsÆ 4|3D@KB]*MD@D@2#@!ȲeI<.M_X)F(>݃݀(K!H3eI`\\x�~[BQFD@D@"HB/@QHS/+ڷD!ͰD!#xҴoh!{E%|8uWcǎ<xe;`ԨQ&ݻ?` Eǽ{ZAGfQ rPZ:uڱR1s(";Z O|o!C@ds>V 6駟\QxRID@D@D@� c3ثci ۠vc#^3U3~f%x'PX#BάYl>|Oe3ϴ :)@2d672Jٳ1gp"0Sdv#2'-NID@D k((t:tHuڹJvL:S<g&MX BB [ �Ǐg}&+#? 5P@-Zm۶WEX?s書{GΝѥKuY֙*|5ЕD@B0ӎ FD@D@D F6l�ʕQ,v2{ZKgJƴ"S >cVh$K/8S" " EnM0s[125( IQ /(dоGF>}}O?$q` k>mnԨFa8#T.G:_PErA- d:[*" %@[ ;2m=P.ܹsb׮]O[7nMg(Thؼy3 k>fL7#y_lI7E֭8CjB)Ce@Pܑobo駟1|`\p(@ d4wx۶mom1cDx!Tׯ8̗J )D�uٙwBD%y餾gkFh%KS1Fz#>P/oaV…  mf+V~h/ҥK.UW]eDf*I� )$" " "6n @JlbX@eG7MaP{GؔetYP*I26w@D@ٲ);PrX{wV)U)A >|wuy 4"K0ї{﵂|ꩧ0F|t~OmQ_e}զMwgf͚.Qi"  B|N2Da~ s̱}뭷U% $VZj&M@ݩZ@ =޳}?{.yd~`D O1e0+$2eʠcǎ6;wcB'OkJ*ԩ:wl")n$" " " A#,QF::u*K6!9]F +$v Ik; <uD�x͓믷 d9scL!CXF=slnݺ :" " " " " " "  ,\Ç8ʼnzGNSYiKbIZj0`[l ;yO>}w ˻HBFwUID@D@D NUü+Ő� ??PQ'`|Q/6&R+Q``lvbR *" " Q%PЯ7lD!*vVWkW!pA\s57n.y0ɹc?6l]w֯_o < cҤI#e] =ChѢ (Ybg^D 11Uf+mek?bƌ>}:^xw}֯mu֍mU@BXr; }` 6̮+CBVUZ"JhѢmfAk׮'⢋.2 nٳ/s$C"<ơpʣ=-Y}})d}ƻ^z@s˖-Q|Do/" IM`ȴiӬ/)"ICp@J" " Y' +"<8wcݓj$ :sQgԩhӦ z.]` UYuW_wW_}5NzBQE .2jքMEu)H0AO*oa|TNG 9t'<++feiDs_3> xE W}U8ؾi%I~ S*" " a&`ԍ7>`4wP8Щpe^_#0˅�E Ǐo1RL2jWoĮ"*98`m>EqRJS Iہڵkg:AD@D -Z /uVTZXw {κ�598n2Qhqf2c#*U j.(ؽ{c (YDbW[?Q"D@D@D@"K^>pB<V𑑍x TX#GN0@p@&ֽUmE@D >9x1|3"+bC Q(F(tAG:pЈxD ÇYW|ʽދߌ8㽺tR;ƈ˗/Z=T5Am%" " G`FījbPю"z5`L_*R%HIA`x]D΂ uEH$fH8V=,^ \t*̼HJ>x{Ydhs<'7JMఉ@}B h۶/��@�IDAT-\uUaTq;xM7I2oj'"pⳘ|6g5|vg9J" " " "l޼<�*WeIgΜo]"" 9&PDV.XmqӦMm~*UXٹ2c:QD@D@D $;lDF[x 5́ 6`Ѡk@xYI>77b Fo@0yܡq*K/&D@@<ypbҤI={6mۆ:u`РAصkW·O Xػ(P V\?Y` ʃ)r%PZ& 0I,?W,L:YZ |!`D@D@D@ Jn8#<0mppŚ_~Gy/u}TGsμ'7GJG`֭:t "G!9syGEf͐7oj$" INf>3n>,3Ox>D@D@D@-[}h5qr`0\=WPj(Zwe)�YH4o[?CW" " " "nI+vZq8Ŀpgogy-[LIE$;_|EGM3V%s4h`3zR.XhذBc#F}v"!ETH|r-X|y<U+ӺpM` f𷃿!l@2iO<c0e˖2edQ>cG:E{5ʙܹs'Fe#r*U*C3c;uI'ɐ8?qD+ g~v^!ڮ6@ ,z" " " 9!@'IA6j3$$I;.FP1#Ф 0kV̊z&>߼fԋV" " "(}0:ҥ@@@̙qߌ@VpϞ=ݻ7:w>}9iƍ!Ct Fyp{{{{֯_ono3SOSN_xȝxQQ"*BOXnG4m[5KdPEۢ_'|wt>糞|>D@D@D@�‡ 5kڠ9Oneb͚5V :Y/oK' h#T8uU^پSN9WQEg$ ܶmuQ>S+n:V;Qn'V\}l0yXd8xVD,\FrN1rW_}? $w-a?׺P ٩c7nytn뙈)O<7͠8$C[B}(dL`Ksρ"G 91믿TapXk,Ǖ3C޽{KvoV)~8ޔL鬳βz쉶mO櫭"r)]DD@D@D 4MBqv1?3J!!ZbSJ-3.ufE�W_ ?02Y"`LTqO?&5Of=ڔȵyyٰa^|DnFX ݻwbP]}EV{g^z)sJ)(�yYz SNl+ĥv;-^/K(%v4m[5IdPEۢ>ydN Ŋ*hP"%>)g<|fN;@ sO<a׾k>+E+YM6o:g=9굲۷uCZV3U3mPճX`ԯ_Srz='" " " $TB�3'x u .Ma-[oB*Y`A tFb9T^Pj~p}ʔ)x衇R}(>$R:UB/dD{(xM7LZ$7\𷅿1J" " " " " " "  ر ]y9{4h *5Xk,Ǖ3ZbEp ]vfEp1k[#G?ϟ<ҍǪ^*W35$" " "*i|ulT) 'i-dz+Acf4`2Ǜi*" " "@4⏗] 4j3<0Lp\3!@M4�2)`=c■o_|G4h8g{{{)ņypiaĈ~…sJ#n?̡y e#P /v#_r4m[IdPE"NK/$_Bj /;ܟx|OAH𷀿 J" " " #ZҸqcwqZǎ㮑ẀՌfR" =9!+I6+I4T8+euU3a,M4 <�:ud\HH!HF`GkˌC<y"7*ׯRJTɨ|eQ*+ԾtW\+"&tW_}e+xo.QV`FG;/7l0\rVOIT򷅿1QHMgϞؽ{7˄s8cn+';9-1ʙ;2? 1dN\p 2x`=:Q"-{J2[tD� ql`!15 Špi PǘX(%!&Mw%O)feb5㥗j13gf݈x:pB*3ٯ3m4t5(]^x!֭{d_}ZsNCºL)>34oz]뮻.FBN?̡gd vVm5B+ԾT7"DHb֭ݻC/nE 3CVJ!߂-Z?O" " " !,][ cƌA%BbL f/hkrӷ=Z]s/=UX/>ׯ>P_>\D@D@D@bJ z ~1l&R.]İ&/o m۶aĉ0aU&mJ*N˗7FƁ_n' xz{''錹goa4Fr-|kr`DēO>i['Fs*V�2"8;`UW]e/C6mi&:N{#իȍ>C5u,}Y5*J&HdN'XE\0~x-Z]tXsmj3o;ĬYwlٲ0`�N<D˅ly[MXc%O:}!+ٳgۺVZ #2^,םKC:#]믿!MU4'My`l.۷FoG=@N.evrG}1+V@hQFd9Z`!CeʔI5!rD@D@D@D@D@D@D 7`R@V|Xi#k/Pzu<c(Wzx<xݻwG׮]mўkttX^fcY1biruKЮ];{jq;wڱPX1fDcv֋WK,8qΌҖ-[e_|ю^zvce&iٸ+3N:)82d5M:Վ._ yTuu6qWpkErIC~7p7#Ad9CNJD� i`|Z(cdbD�8k׎QTlL pX^=Bfx)i7sԬ4VCE@D@D 6;̔~g�VFxff}kIvɓ'Z%2/-qΐ#G'_0|pLv8?PD?s=g+Dn,#P$^l(E |yOGKV}<2<pVjΛ6qp~]OBt݇zNp7H狕9L(0~]I֠YeddŞ#+6{Ead2=ÿ8p ֮]k96/T{G=}ӆ vwLV(BT~TGI|4hD(Y㥟"}yڗhmQ}E@D@D@R}>Դ|g¦k+\M3{2580[[ϟR`2s;r2q<<7䬴_߫b'sr=mƼΩBV>xnSFߝɕ}4]ꨤS~>+'ޖ_?_uPID@D@D@⑀t-u~0s<%zL6xVXb A{u4/ӇìWvq4F4HF3#b&.w?M?ӧ6`]w'^yZk֬Dam&g:k UH*BI4)Dd,\ɐ {5u לyL !1!!B?ucwa{y>콆{=y~U`ub{Ivט&frי`etXWr1A^ts`B7|0;C ƎY@p`8q߂sppL10`mu ض|o1SNpmp+ς]Q6HlV;v Lѵfl$rݰ [WΝ~60s Ld2@9X`?}ٳgJ O-g#LK^o}fm,\00׀ݜ6_|ѝw9m{fM60Nj/Nk~p9Z`A^z%/uϪIt";#h:l &yl( 5ªoI3T*lOUk'~СIIDNCa)(6[bȁMNܧ'szpxuQUEr&hܸq`9L63{:ۮM s61._6# 4 ,�+0G&rMW퓻ӦMKڸi}lСn{1h g&sq7dvv<1Ld96,يlH>t[uUWFGX6~Gg=RM~.'y:CL N4{8߭j[}xgbdݫ`=UI%0yrbͺJJܒRY_40 8jZ+" " &@} 0 0W|1 0hj/=c rq,cb\Sn?q r? .΂3&s>&:U&Z༫<ړN:}F^;Xyݾ _+3`l8^)%jGQxfx<}߉:b~QR^~0]=&,|=<Dr2=WU%2wmI}פ ?g21X7C_ϟkDgX\'G(?6;ӊ̙3ˢ1QlH.\֭[@Zt~ϴ.KVN&<QRd擫-ɼ&<{2۟<3jGKY)=;QΥˑQR^o!CJ@ȫDK)^c'*fv$8x`wz>5i$`@m81Rѧ.]=#;mx uȣN� {m!|Yg(:9 hM7 e|NA8yJVx=@ԁ/>9bWc B_h;ƀYmZO>]g3y&/ѵ^<v!3RĒ ynn;g<suN8ѝw~m/˛={;f,:Yf%ϡr-c6{dw_>_QYu9QuѣG11cJ]u< 5AU֕"5%T 4~K:SD@ʃ�R,{ZƗ�mzkI60͇ 'N‰U|'B<t~"(V_n1=k:"G1dIve:\~,m^& .E۴OǶnu m.d̉zXW&ϔ}wxw҈j+E8~~'BQ^/[hfc'^2O Q8EBx{I}OHկ.HpqkV4fp=6oR>�p>s ̩v" " "P,t}&EIߥ^߃6XjQl mvn kq&LpLǣ?;뺉}ҫlB^jذa.K<p\yqU)/ʹWgJ#@5P,.)WK\11dk8*lc#5N*}߉ꎡb^x<G JLKmWcq ےMg"Dr2=WwQSx(߽t"EA?*վ𵙶9+o<8#BID@D@D vinriE~E.\dA>1'UdyZzOҖtQbb>QQ%t}U+JJGyv).뗮QQV0e˖] /" " "  h2&`A}ݺu18O~faלp ٴ`xtL4 6l9r$L-ZHc3ڡ^z1cLU2%KeJ+%/\<V_}u; t %Fǎ]̓L_~[?&7cl3SΝXv[Mjar C8%^y=PlJ\g9su?NdMkmoc2!H4j(}c +s 9qse'==c&Vo]|Ν}[9l:oh$Y;y9gfH˶¿o㎰�K+=gr6۶m}6.6o<Y7FPW_E@D@ʛ +wT{b SԩSrvFUiG_~x2ZElX@celF1'szn fD|w#.gk8["gگ5k֕esU2s5~n3nGI;$Ogiv3m4lχ-4YQm$߸*%" " G.MƯtu\Z0UX7m&�ܮ4dpu|*j�]?̟Cr|V �<6.^TR@18ktw~Qǟ}qk|kzf͚0GO_G[6m6xE rŻDÊNتyG;jTu =SݳWLX6:,o ח뙈Z꯭|$[<$˜{O/J+dBn1J" " " " #_6{2kyM79fD&oUʩ~%zOҖ(夞\dUmesk{Q~g'Jre{>gx mS`U+" " " ~f2'p7fbPWH_2; Bpb`-|ܧ�ĉ(}ٌZ0xP?vyDydͺ3댤;Z̧WL0_3]sKw_'|=WrXkG<N l:ul7|s?A߾}y8(Jʎ?;2M>{{K= 4H>w|0B6H2l gh '>OQM#wsxnez#rV?  T*(@R-" " " %Э[7Ddb&;c3fdk͔WM&ga'駟RO>L{M1"tOQ&Mpcmuv_*@ǟ3_NԩS)ކg>>}>\|Bycf6q @vaP_OE@D@D@ Bo)9{6K LF @!М)q#@!P~Ǐ[˲qX6w|OE@D@D@jFЇPx}W/џ|2,fejo}yo^18Wbe:|7 YJE?};w8Y{{T<ݻIJ)^-[t3d+ɏs=WLL|R Θw\~;\BngHWtR0o=Q| JOC~ҕ>}3mShq9)h\LƥmjT"N{Pb0$6{20ͳ l/|įSw\ɬ^_|'jTL}mjҎty|3'(NRE%m)q1%(U˪j-kP +JI|?c`[o?iSzZjԨ3i^8oڴi0nv,1} =:SuFK";t;(nϴZkƧxfϲWo3 rƿAa8C/"gǃ>ԏ8GE9=Y|ud䦦3gJ@~:@Od<ںgd FG-5Zz!sGID@*� Yn;<#t7|jlQtRPȑ�Ѯsa9/?"u'Ge3Mp}3<l{,,QvQxyYnꫯf:vL)Bk\ִ+d'ω->VID@D@D%nz}P|ZBѵ]+_%<n\iԥ$n,l  g y$f%ʇ >[&`ҤICy\2 [mۺze._թNZ{{T\ O/n*-WKb1bb2QU}UЫӮ(פGcyURLX7(>QI Wڷo駟.o/OP(SNfSj۬1H|˦C=yͮ 2\dJs'jK dOIρԏI7}1_|~uzvr:>RXs=ξ{iBuTHK Bl0̼`zYgeHcLj}A<gZ|W!oM?@;<p pBUVXm\ɓNDƬYNJ;!kggرcǻ[Ӫ[lIǝlUγ:2D[<S  uGEXK/LSg.s|s^{5q.\ֵ(5X=|F(ʁܳp{Gx饗29DG߃(D^Ŝo5$" Lt] " " " " a4?ҾR*)'j]$?Co[D2IlQ:78{gߥ_wTȐ}Ygg#]tQ,N/'kd޽ѸqcW~յ..TYLM7ԝ1f̘e់,[h(oҶyӤ*@@Bqj:(� SN-RɅ+p-3dF4 ͭl%l(y" " "P wo}�7ȉ-`?>ǔ1p9η:C q+}ԯ_~<-Q7yxxϔKe= ϟ_ 乴\. xDɔOUgf^qR5zUvkk|nw7 "J9zd;S<$wP>)>j߱L8M0[޿WF{'q25Ԉ�߿9A==[Štq.\͛7w?Y@㓵N#UNnd{OՖLEL~zO?wܤD: t'}|E$[g|vrr ~kN*_D@D@D@!H63c=oG\)2)ܡݱy湵ӤI 8}[_uU@̟0c>ӧOwg-[<3s3w7v{ 6�o>ʟٳg̙<=ݱ/}ܡx!ѣAqK։i|hm݆S㏻m'Yhp'?%x;>k!1} ã?g%kGz=z} xll3q&0~9g>s`~>uQI;3nfwq4hjZ5x;0wء֭{޳pWEC<9U} / L.DG߃믿>opoŸ6'q@|.sZmRE@D kb>S" " " " 1 pwQRhV.mc~cvƭ٠8 7tT<䓠M7o -eGha"iX}ݱT… A[/ D[?.ODDG0Z>l7%K#A_LE&h ŋn^t4.T#lmӱ1}Ǹ;oz_y啮]Qٞ!e ֦|}F[7 Xdo'" "Pfq|fĤti!)U8sRl^K/h6m⚮@I૯�C ʍf`6V͌0-ܒכ13SQƟ2]?v6c?k2rR pLݞ2fĈIצ%fwg<rrry8)?m>DuY xez 9<.;s95M.UASUI!|3~wDz[M<վ(mdMĮ>]fzdSP4ʸ@ln{N9[j~ߓ6{2mfE2yL>Uǻr(mIOxO&\Ql^'J_;oU_!jޙJXl<Dyv).땮OC~RK<V}ſ/xQR$" " " D- \J9>8䓃W^90rp뭷ZUX7Pn!XG1Y u:u쉁}LL6tec~*Z+0`Сur l00qDKm: bvZ<-7l`3Sw@]_Tε z X,H4HwT]=Y'.:k_~%\~-Zc`Džϊ Bl'aBurֻ:'9ݽ<C8 @v\v|I`NdJ68;ְa,#mހ瓗 &6X\r%cn` QڶmX`vj3jW '{4gO<4m4Xi &Nl1袋3%=?v>L~4yB >db.~dž  y{V6+y3kF`~뻗{d6^_~ +΋pe!_ %O (ʡ:GD@J�C**n"P1hˡLg}$ڝcI{&mgm<f-AvdN߮]& ̉'-#ZP͘vצ+d,I\:tX0@{"a3"s>dجY3gk>m&m6r8ՏXcdNNiGҮJs.W:ϻlHcv^8|K6;<Ojχ-4B} !L|mj E Lnj&k?+J"PdOwzE{+$_ lG Γ& w*īMԚO<WsSUB0IШQ ^K?Os4a,ZTuU E@D@Dp=KV ˍ|<S@z7i&8d:egcXO`BX#mqṄ| _lJk0+I_m^).w ~0-?*+%JGQeqRK<=k2NTw =] GG]UJmkc¢dC9>3|a}2C{:_c6l+&[Ga&;C@rMo=_$" " "_61Ӭ/0K-E՚`FyO{"uswIxAT>`]2'{rP7!UO{2K!͋N׷>V U%jeu12e{F).Gj0)26.Z%G*L2xu*7ͨQyɮ|eT�/lp 2A -hCDV:M6m.\ ƭR-8UV1m=|0q@SɃEƍݡwY ,x&l=o<L2�S,X958}%_3`s&b3__\lb^7!FL{{w:A"pFΞaIf3LXՁ$jfQ{fuXi3pfΚg4jtx}AkP wcYN9ئ9VHWj̟<D62(S&<LW]5 @% œ ppW`׮GD$̫QFnMT&Rjr9XcUVg5Ǣꔑт geRS\d~L9MZDθeϗ-4~57noҾ>blv5R׋@Ex=S'm+j,C N4WүbBT L<S*)|_}f/acݖp |iEsX%R&0'GJܹ0B30e(W0{ |Xg` ``s]Ws<i7F.] ;yNKRƟR>MD &f \:Y伆cГ'Ovq+U} C=&~r WKl119Psy38)KO9RMYcڕzL1a&HgNQ| rgj{.&=5 A48pM>~ _.ی7:#ͮs#K@ _p tfb~ѣGY;m{q>w;s|7b,Kdr/{2O{~:D{r.|ټ2mю~i&Q{T]|=jqmQ]tI3]X!HOS&:QfD~V[aVj] 6#l3(xرY)~Џ+t;’vFS>ԦBE%m3|;zh`eNc\h@}© 9O,hzͱ<Qf^$lK&"Pvh?!Dlz#6Y@ HUD"@Go͵͂ZIW"UO*U{V֫c`s=?<N8'KQL%x-`-`U&ڵ:[D NJ&,Rx{!Hpb?nxa +ai'%>* _>w5>0w:a`|'i0Osaor1BQN"La_|{v"G}tY`r ;83;cM7w1[,3ǣ[n]lP+VG9ŗoG>b(0K\)_45ǥ}zO7sLcucĉNrV<WID@D@DP?/vmSN9{4:(3.5}Qvʔ)ꪫp: $" " " D0Scq i |P}.^za.OU)Fepݺu~^͛ꫯ AFim֬Y֪泝Q6,RN=r࿣yQuy3x9E Yra~5lgyf(Xoq3<.dߡCr!٤f-G@P4D@D@D@D@D #iyq9ǡO<9gP=\lxn#NCW_&xor !5%c,LID@D@D ܉`,kD t\`jnᇉ*"С{:>M ppE0 i)" " eJMP׀.8,40�6z60M)0xyI6pC' 洲=T`7,Ǐ`ǣȫjwťnNc=뮻{e#Rr/ߎjҤ_(Q8Xt_M=XrǥQrc [6sѣOwu1Eoh6T:hܸ1 {~58͎Lx>@R3.ջj>K& qE0rHvmNc_~x ]v-DqSD@D@5ә��@�IDATD@ N`9 Uʾ&r5*_9^>}3N?Snqɒ%x)a{H-aڻ?*?s㋿7>*'=qƹT9*g`,gX=[ 2`zywO>c4 >aj~?~<^z%|SzTҶmZ* " B x`ԺSQT" "r-g}Q,:0TDV <쳸\|vpcWzp={6nvP_v[rG-<l:`|kR%'{uWA N*ͣ}hg C"'6Ǭ&ȵMjPl GU6>Af=\ओ*c"1�ER_2" " "P,DanژЫڲeM!#KxpY4E{^{�qE/_V�^2{n}nS0b;;FU^s֊ 3PeW16vX,{Ѭ{GUtA77|s?Мd7o(0r,^ew\7m y)3E@D@D@ O@Bnk.tۿeV[;9 m&Xi"Sʉ|FՅ*nE4Pv"QւmNzxW xo:|'T<6tS4BH֫W/b:MD@D L~VѺ5wb'NG Nڧc" "P $Y wAuM7݄ P b0C9L(&? Q81^BH1y'TV X, `Bqo' ɞV)„fq?,suqԩWRuM _*Qx?QC%rq+�}lP<ؤ@.ȑH@mx0 |'[w]ࠃ:w),F1|Mwʴw bcD WRI$nj0={D=ҹs璈RGy=f +�c&O X?ϙ3U7جX$" " " U$@{-uՉKnJ" #P_}}|'cUWu;{~G$d5rW_u &L�)ȁn͎(PNjKD@D@K3LI&eĉxw&;AB)DA%D@D`Y^`~e?_ )p( ,Z@U /@=!~ijmL�k/X}%#gq�ry嗱k8փ,zs6d1 XlT48*ETJ S*Q*m8DSj\GN�{2? /C[SOl9Y棊y `=W^ TLP-3`B}?`,xBB5,f3hOǕW^in/vEK.g+.HP쭷rc|?-i1 &۴icÊtkT@1^~m˘X]QaÆj�vmݻn#WE@D@D@B>#<xG\oN;^ze MJ%h"#~MB)S9ׯhBJ}:n7 ArFG@rp Jپ}{sM6-I<W" "` wŴi@ t@dǎ(  ƄnaJWq \םQkD@D@BqjKX`*|My0;N(RX8{9<1:9(XwCT*o?J%v@@i"LX*n~a`pb Q̺•Q9׭ Pxk.�X|*Z'O>Zǁmxm̝ ɔq{WD@D L;/6?Mp]w}7>h|w]v%в?[#;xPh.:u|7xU^=եKpaViaUW-t4z1V'Ov AgT1[lo|?Jr" " "+O*}b 6qmOjOo۶mڬƈ'0o<? W\qE[. +J" " " "w,�3gӷsKDK 4p/ ;R<RID@DOM9s&8 EY B0qM7-t;MD@DOOxxBD $ǻ6U2>O1ѣG?FƍoF !4D%?%j{>p&_1_r9NXdV[m]w-)M7 T48*ETJ M?EB?~5&9.ɺ�_Kʧ'`Z11|꬚&~o +NyX >Gb U'7q0v,ШQB$C`$_Kqƒ:ŋz8묳8]k)Zu%+pwuD7{#g48q7c!1Y 16;vtFmDDr6 %yVӧOwBSLb(+;GXQ0[nN4W1zƊ5[kD)\ͅ"W(_Ps}e9K߲[1!\cJ" " " "PI$Y=g7FvJg*`:9) ɥM6hժ[Zh!A"/'"P<{駟O> n0\ʈ%KM6M R葳qiҤI*D@D@X}#sISzJӴ+" %C@B%s+T(^|E g&\Qݻw[o�k|e*q @GR^s xQ;#vi''@*꫁/U 8*ETJ#@qU A[}uˀ*d)ۆA Ol SE|0+%pѰIa0ۆ|L[(E_~ I7 #m Ic{oÇ7QFKq~ J'1gq{\p8^59`J0Bc׌O"EQHnm5o}g>j@o6XL.}ˬYq⚓|2>J" " " "PN_}Z&߉ַE [wՉ\wŚ5kVNMS]Eb,\ЉO<&Mr m5ԓXwu]N:F t$J-YCpT.4/XՈ뭷a-[tVv\Yg <½S" _;G 5|gN ?rPNPL 4w .۵k疆 F+Pg7Gz.je[X&" ' !b5P!@ꫯIxD*!7lӏ&Xv*�sSCSy8q Gݺuwdm:֬N% pEwK:8ӖQk gE\)K[PgE5v`{[L[lÇ 8BL&\yeڭx> �p~JL,@D@D@*o�#F�#G?kBr݀V*} [>l')ª;S�/v~t.2c9ĕD~5m4'cEQ8-0p1[>nkUWj:_D@D`fMYʹ{2&N+.eUݚeJ" " " "G?~ovJmܸsС{?ZC3QPJ?wlo,̚j6le9ѴitN>l|%xU%' ڿ6޽[Rg2@{98f|i_r:̳B,ut~>;J" "P}aK~#g#9Kgo$ۻuV횕^<E@DLofن0!" " " " ivr ݽe\ngTsn7;vtN?JuHʏ�Lj~w{Yn,A�GhS[ )&~_XFR"@K3'Ӧ-عϝ(q]#7G)"W;}Yy1m\s @Q!C=+jT.- ($"liPYg =P8餓@1CMĕq3hMT)v$%@aM퇃Kjc0F qJ>sMzQHkqZܖ'@&s~K>ΊV\#|bLsc5^ڴi䷞" " " D^z6F-}} νɓ'v7WYky<d{,W_sI6Z&t / ֳ?~v̯ed2uTKj0FJ8!8%,8Sݺud%u 4h-"P(_r~x7?1D' ?̶" "G hO1ZS1( J') : W]5Q" S5}@ӧOǒ%K`y@FKvkMZG p&c |h!|p3�F9GrLӮ]};)SN^{ xj* '{WaJE P){ {oXl1q"LP& �?Oʥ%z^z nrYL;xF,fӮ 0PN�8;H,|HB4n\8> _qN먣[o]/r^3#j6Q|8SmD I`ѢE9sfrXmQm]îXf(df2.Mmv$jCbC`ҥoM嫌 3/^lZ6+mٲ%P/Z\mT�c?L6~Go\F񽋢\6pCp.V5:;>طO?m\mNj喻Aƶl{ܩSuT AV밈;p_4VYepqvkn>sЁ %D (yt"t<m.4j?lJ1/$d_ЕD  x,74N5 D@D@$Y VbFN t($~2cƌ]aÆhݺur>tф1{ J9 Et#_tDSg.o|*?㎃9/XmQ D&dOaš|^[)/H +O8(Dfs)~'} 7ݎrر�(i.ZJ"~^v6_>fsO " " " !A�<`b2=; ӧߙ(}=ovQd`}qojelN0n8X'?cpZ;Fʹҟ~ BR$ R:X-k4i<Nf$"P;81'/˜vy(,}7Zh @֭[vRE@D@D@D _Bw~?nK^ Nw9ثVR7}vAz.,|6 8Kqm۶Evg: 暄=KrY}uhyN$bEMA6~rɔ8N*# q`_w͛|g~lԨQRk[~c\hjLCE 2_,￷ww3yGyw&`A48^P\w^ID@D@LfzնڡCkLG Q259=x>^OBч\64hZ"FǀP5s O|LӦM 0MD@K4a-(SD@D@C@ø-rܴ(|\析d� =�N?xUg4M0.8T]&Tt@`wmu% o-!Ϲ=4! wRK6!I&c< _Dv}w QaK/1c'pb8p Y`vVIq&@!7rɔW0{l'Br9.o%1^ /ܮW^zm,KtVm+׌򢏩+j뮻%E=(.݄Z/cЯ>o}|'1!4D9ACx͉+~Oi0ށ۷G߾}ѲeK0&r4|8ЯlBĤKf;.ȇ]%@b?Q{uƤbL ˅HXD%x Hn\.Pg[V^y,/eGBtjɴpv.o /;穉BaU?t ?#/" "P拊K/Mmm,C)""i" "P:tj` rѥ" "WrK q}Bg }|d=t~ 8۴hO|׿kr%:p⥰M8ЇD[9DBѡ<)E,/\yWEOqѩ~T?r(̃u 7? mz'�?_[5rMV2Ps ٹs3J'({qOD@D@Dؘ =8sĉx衇san;rKt OFjZ&Ŵ޲7x/&L�/unݺմ]/ c8klX-^PN7,-s< 礄UţF;`{XwqW\^= X+f_ #" " " "PyOB?r}8J+KO {�J"@A sv^-Z 8}܂]p)02{aZ@\Yΰ`�o<J& !JEl;Y)%</h ˇL!Hvj9u3Ț3e[S ;J"�ckSg3ۚh:uÂ�rz!TTs|8LR" "  `60bD1JOq \]QKD@FΗ]U{D<t>\\s}ZLuN>״>D: C6@o۷i~عOÉNj~rTzAPMG9qi[D L^s նT8*ETJ E.J٨j=N; xXU-)J'\8m]av�;:)_>>d$ʱSNYg[mQE@D@D@O<~)X�pa]濼|q' &3ƍ {Xb˖- dWkD{sСDc~3<oԩ6m&M ?ѦM{F^{)[ur&\w#]kk~L2)iySdY /flV0uM)AH'3V+^eZ||k<W1g/nJSc>~9R|X?k{>{1?hO '/e반ǼF؉mm٩Eoy¾ﷇ;&{|AXXtN rL)vziC`@ʼɪp3y�X}` '!I" " " L` n^DcKU;^2u@gE< R>+pFNs/5!D\xoS ;ٶ%|ke;a l\ )8ٶ9XͅπNgX}%;u _ةnݺurp<<k\Rj_D@DT ̚xd�@�{b6ˈ& Fzgn{1Af;CTfNTرv&oJ]3 m.DT{z s osۏۘ7Ng͗V N@l(٤IM*@MpxtdD@D@D +vɆו Db6]@btoժ+PE!УGP#`dKH$Eg d1Ś'" " "�u#wm7�t ~xBtJ2qis +`z o[nF7}9^նm[矾z!0Wi\82{lW>c5㣏>r~,ر# - X.J" %`JUnR'|~X:9%E^x2%֏>/!u>~XoX,֌X~cJH^X,cR[cm+2| dJWga͛'cqbgBID@D@D@D@J+(>W}Lp/ I+;$p엥HgywyQH6g?̯}|;|MLsT~_/ľ_{tOE~{3\ǼEfG r-=921iKHLJq&L�8nJLv C%H^^ 5g+7.7hl?|y8^Ϡknsao5;}6h-lsX .<mqy~ۯ iבmIcd˅~ۯ8}m/^(mp[5Ŏ- 46?Hq (‹7b aY+@nػ.rWD@D@D@D@jN>bqhc�tapFp!чN$ s]Jyml\|�gSa;dm톩İ1uO>mr?WbٴyOtw~ߋ?V$" $`CS6vQU@9]Ž؎Ri[kXYo^kuU Xw}kW<teeӴt#wA6K" " " h8 y&pi�Ŷ) �cߟ^١b>}> M:խgΜi믿^cub>\{68HG9n\f.“+N9t۷w\E@J� Ė5!70`mqn3Qdqަ�¿AUo {O_,RM?1X~M.~;Q|(|kr">t~? :Ե-" " " "PiؗbUi; }ȹƹa9>c~a}0;ҧ]0mB&?fۗ|˯}++|o5Y/n3f_(?;Pɦ&7C}}kM!{s/:~CSFf7tP?Y@68&l{[bM<ⰹc2l̞  <dŽ{q }h&1@HNj�; 7)}xGD`Zc{N!;1odx-Xx@wF爐^x<ЩSw* z89cm߉ζM ;~Z c0f}aLo q kϔD@D@D@ K'." " " " "yQVZU maGnIn|`"ގm>mCz;_3N-=(\ӎN^siK]hA_x$" F|.qjՕdSs_[9[| V[0 AVPwB0J &S3SoN\92! ٫в%0dp@(OXsIM={6['ȉ(1x`޼$E$9YwW^K!}i cԵʴ=+yӧ7I Dx]/"6'| VH|U5R(MWxy2fE!@m5W7{#L>%9Pt~)d[I]h=<ƲkNj^{5 >Cl3q㨣škYK=bx4s$hMl7a'G /Kr8q|tLD@D@D@@@#qjC$S{A lI&:;DS׮]OUo=x¥sJڕ\U!x)x " " " " eE0ZE)D&W]5:QD@DB xs Ad&˿rd퐷y,hӦvWE_?w3w͚7 _pFyXVD@D@D8"L vp $; B,zR E(/!TJ@ пOXìvE4rAE+S@ux- N bs׿O_ϲT[o5|qW'O<;vI%y-}kxN`P`rW:ѻwb7<\~9@ȽJCR4?D@D@D@D V̝TIMA=t?о=;SOVԩD.fM) JvfMU+\fwL.^Pr3ŋ%gND@bI@BsO>5?�XLR PY*E.Xŕ%mX#R (P)q! T-`A_>>@`u 81MWD@D@D@D@D@D@D@D@D`@o_[^z#UW]cM61x'p׃>>)rK/࣏=6!@Ӧ~<e!" " " %@@B%pT`_ ;&  Q”Z>>\aZ ;qDŽz?lD@D@D@J7$IID@D@D@D@D@D@D@Dp~Wp+gxda#,…W龰+#w ArT%B`=d:V7�~;CD@D@D@D ;V[fl,JoOE@D@D@D@D@D@D@D@D\ |IBto4`8`˵%QUW]D ԩSOc ۙ_EGC"ֲQ'f9cGsI3y'?‰}l&%}$" " " %N@B%~Tx1kW`�m[#ܩ 36۔~*�FGpؽZAR  (ڨ" " " " " " " "_$" " Y x!H)ܹ<4޵#.V_=dXǥ7".-O;WzYg'O"" " "P4|k=z�'м9&& \Bj@ @[o]ĩuݖg]v3&`wga8Sgvjv-[ 60c/ hgT=+" " " & !jӅH3pV 7L(ѓ*J=g*aY헊\t[V%E@D@D .(I#)ED@D@D@D@D@D@D@D@ C`R_Kb´^T�ՙ4}CΙqs`A kX: 7ڨ[6W@>@F}U7^׾=pWO<ve" " " %V7|u@[~wŭJ|1~{$Evϛ x~ n qjReP!9�S�rcm�Æ5ˠ!?Bʛ�_w-l Cw Us:S:t; ~j@|tSBBJ" " " " " " " " #㏉W]pe(gxXnD;$Yw! M'i|]#J>�ޛS;`= " " "O(ygf+['/�|D@D@D@D@D@D@D@D@DpWrSOO,ܸqc7gO?=܃n-ufwbɒ%UɮB` ``= naB§U5VD@D@D,_fUuE`p[`瀮]9M;)}61+C9 eP5 iWD@D@D(>p1�fWV( ŋ׫WB@,Hm:PNa)v $J䤫J#ᇉ$Y<q)i wSҢ}D@D@D@*@f )SIĜTukG[￯tJj@`l("j+^+"o?kx7mv8#cذag3D8ڼfUW_~ <8ZM`N"da3 !Wa e^WFs⌤;\-xy`8O&oTs(W_ Sbfj*" " " " " " " ILq;AE@D@2X 9*gfTOCߤIMr(koV+ŵVӧ'SDFIB`ḿ{Usnݺ 3dH[-]$ = |2 aHNT,Kv=BxS*}ݻw{1sLvakѢE b,J &vvlNIM-s>,@D@D@D@J@BEŭjJ ie+iӀlQRD7]vzEiV+�3f�;̛WTD@D@D NN:r%X8z-G?1I2!)DZ s%W~ ,h6Y\Jw_?בDy~bXao߄X7$b8�M [D@D@D@D@D@D@D@D@D /�olMt 4&/"|0at;}Q2!7;ẍ́>́#F�Z%컆Kf\@ HU@2е+p V �pJ*2yD=u̝ l=@%`啁SN)\YD@D@D@D@D@D@D@DO%%'m'@NϧGФIMs)jW׈BŽj_PHh,>`J X 8\੧ҟ" " " "P?g.0T@I'% Qtgl-@]^6 Y:V.֭#<SL hƠ9mڴñ`riJsK.>x$w^b<*E@D@D@* +֗O? 80!::!꫗OJ<l9Tׅ*K�={f1~^RD@D@D 3 atXU(</)³V " "Pd{KJs�kUuI!޵7] о=н;p"a4>=ۙLD@D@D@ CiSO?Θ{,@?-L۟q0iRaV" " " " " " " " "@3mvzG K O>NG߾}msmB8'ĩiˊ+%I~n5a}w[ R2_@`0ΫO? Pa]8h>տ 6._TD@D@D 0Psg˹/)o/Qz˜;7B?Hpﯿ3g\/C�? ,\v57l1n�}D@D@D@Dn w^B<�ЭЦ U?+" " " " " " " "/K$D.4h�sVXaxQ@۶mq/矏{ <^{aر6�bC`HZ7{ j\y%0~K䅀 Q/?{%EѵEH  ? DA@IJ$9*#H ^3:gٙꪧ٩[@|ȑV0H Ygի^S4D(4g�(@ P9~ l I3s�(@ P�(@ PK@Aƍ L�(@bİ^e Ȱ"q N< <y@U5i^ݜY#mK'ڵ;�(@ P(X>8u عӚL<{5wW?FF.wE P�(@ P�(׮*dSdNp$JYI&E+��@�IDAT=qR&,X�7oDŊ?~L>> T2vlA`ZqH0M6CmQɟR�(@24n]yE q+pл7_.f 7+<1) u<(@ PQgݻ:�%KF-/M P�(@ P�(1{ #v �(@rb H_�tDT;s ޫp.Gg-U>0yoUqd͚Y4]qI P�"#c?8{ض \4 ȝ29S+�(@ P�(@ P*p(P8p"]QHa!;J f̘r?>lق{ }d̘˗#͖ 7p뾳y `ݺ(@ P@  Y@Ty3d%(z5@Dn>'NSCV(�Μ٪b�(@t"0b[NǓP�(@ P�(@ o �(R_09WM uȹb-, .pehسطϱy٭G`)@ PT1ҥ/&o* d"EQZ�(@ P�(@ P z~(YHK,M_"v>1@B0{lY,4$YW^1jH'uN�~EWTN= ?A P�` (W hЕuiZA6W'K] hPH Q(@ P| (Qď�(@ P�(@ PQ` Ȩh P$`_{zuTs>w ݩmKA'Par@@+&3Ҹq](@ P@4 h|y`De@'(� d /  & P�(@ P�(@ W_5kk+V<'6$& K/?Ν~hL2Xx1>}Jp^=@ٿ(ZԊ% 瀎e�(@ PL|*vF[�:Z5WA&H�T` 4�(@@ʲڷj첲t�(@ P�(@ PWW,E P |S;G;d@2W.gMvy{|~ήUF@g~�(@ P1cU�SW$~ o^`( {v _>mȤmgQ�(@ P�(@ x~o#quYXDVa@qup?6l؀)RH͚5z[n9OC93f�OM2Y(@ P�AF8C \9wogn`Ag<BXȓH>=|o{ʔZqQ�\![Rƌq'(@ P�(@ P#Eb�(@ '@ Eu;A@2gNgMVV:^gO@4(@ Pر5iӬ:FlY`d+ d:/�(@ P�(@ Px/Z�8,6 @ڴi}5@ d/Ð!C$Iz|8~x_~@8{? ٣p(�(@ 8C <РB_|hhtsZիj\{O=uj`:@;3jִwXN�(Iܹ@T2�(@ P�(@ OKпR@2rn $ͱ-9}! ^h& 8C yriS`g?yelز͚R�(;1c+Z/\�v�.2fv & P�(@ P�(@8}(U 8pj_>}�ݺu 6.Ȓ% Ǝ 8l0Z rBZvZW2{AjUXѮ$WzP�(:\5s:ȠR%ogMj@H& #@?'A0Aj,FǏ=,(@ P3~:3(R3RP�(@ P�(@` H7(@ 0d=BJ޵ߣG@ܸUfo.cVsZ&CMV2.ϤIK@ee(@ P@X1b�%KI`>+u@r@5?_�(@ P�(@ Pہŭ,wz6t۶me^�p-='fĉq}TZyɓO+Ǖ'AG)૯B;u.]@�(@ x�Az,Z\ Ċ5_ʔr4ٳjneK0yv�(g͛ڱD P�(@ P�(wEoxv P;ӧQ^o*իR5dx@ƌ;' J~]YØ1sIrՙ`^�(@ P : �>8|wm`^@N h,\h3(@ P�(@ Pw ̙TdH*.]J*SwU8dRݺuqF߿_7_2d@~pE+(Nm[/eˀY=D P� 0dP>w{Ԇ A :ի=u0?%K +X$`)@ PA{ S})@ P�(@ P�C@Yf�(@ +`LN)S:9S#@3G@BWg>�.Ο:Ȳe&fN�(@ PrLΜΝ6ڹ=@ P�(@ P�0 `�k~�$xvĴioaر6 _tL>]ϙ g̘W^yEbΝN8og;6о=G+̒yӷQ�(1РvI#wuӧu*N3P5 ґ|Wŧ�(@ 8I@oJߗ.Y+$L褌 (@ P�(@ P@e (` P~$3UYtE@R9?_Oc n\O(AAj & 8[A M/V^~qe'O~YC P�S S&{w`f?Ţu`߾@ƌ@BkM P�(@ P�<Uqc`H@=/>xm *:u«`\ uԲ@={ yq(Q%K/kcs4Sw2g 8(@ P` H\"0aP5(A^=: beܺŊ]s`oإIW/+ؕԚ�(@ .9 XO P�(@ P�(@ ܹ$Jsl�( ],ɹd|ǹ^-t@(Ď tl(d䧇&I3KV0H|D P�|Y E eKky50ԩV@H )qf 0Q�(@ P�(@ D@r6mcY0 <8B' đA&-Z޽{eK͛71|pܸqgNz9r�f\׷5kC P�AFT)pд)е|Zk0.X?ɓ_wy-s @fVz�(<Qՠ�(@ P�(@ Ph ĉ=<, (@ x@̘V8( HzBO�@?{?=mDI:1uj+Na�(@ P 7.P:=@vm7j̙"#(@ P�(@ P Pcwʗ^&LСCTox1QeʔEpI4n !CtGqcIT@85'EZW�(@g03) D1nz2F Dl]0CWYCٳ'efj�믿VZaNs]̘1C6'xpˣVtڵ]Õ 4ix =ڕp˖-+b^(@ P%u Ua)@ P�(@r OJ}BKVXj u^/*F< L�Y@"l �(%/7H~09W5 ? wK蹝9<z@ $K0nӴAj �D P�Mpa㏁}g>nݲ&"kl 8C7֗{<uQdiGg�(@ P ,] � $Cu޽;^}U{yf3C\Oض+gʔɌq97nD<yPZ5Z*ܘ.͛7͸$;tRxHB:>sZc)4h _r$4i 1HɭN2c?O<R �( ]՛?:MoW3<a \>l|\ܹs9s |=.˕+[_ٳQd7|l[Vmd0hРx+d A^=k}DEtC@F+dҦtZ?+#u7(@ rFf@@~So֔�(@ P\k>~:!RY�g޼y3gmƌqy|Ѕhd"ۉNV:m<N Pmm<(@i ^] +*):vǎYșW@`=ҵI v-eNdF<�(@ NCNqիjC�@2<l;@Y P"`;ғ{ܣȎӈP�(@ P^.0j[@5}O?adm 7C m n<e„ ?~wSI̝;7&Nd۷b6j6" zLHl:aӦMKd`gϞ=o:~GڵCsG#q3 Ba-2Wq`< S�'@3&M֭!f>YY/Y65"dLIҶm[jI@}4JN@$bEiX~=>*T5j0|pt%e c$^2iM9e$ǎǞO׮]@5(@ m @Æ ~QeV�(@ PbŊGT"O,|a{,X`.(ӳgOsQ=.,}dڟMLIH܇ܱrf HW 3_ P%`߲wp3Ldw}0{.@4@$9a1?Z'Ol�M )YY93 P�(Oݨd5௿;~2P2x֓%�(n QR9_:(4Q�(@ Pt!w߅F&M ~Ǐ1׍ælٲfmVZ!](FU6\CQ!CnjitG/ۑX$A |;Ѐ_|9H"2dD^jr$Ϡ_2GZ{wT)߯WϓW)@ P` H׸Ewu~ Y-�/5EPQp*dLv?:[; 4iӤA!L"oӚ Bs*5}7ɑ;5z?={͚5 ǹ"X od+(@ Ν@ժU4h_T�(@ P�D H4XcFF{Pb0%%Kf-zr_^O 8M�(wv?A:z 'OB8\I LpN ۻ"/ ]Da@ݑϋGR�(@_>%!p"W@@@֬@\y�%`�(@P뇍70=<uBdiT(@ P�(@0nܰ{zX�paq… 5jaiȓ'&OϣW^7odɂ b.)Z|L:X$ P3g65J ={݋/n>1?V߫DBgI §�(@7 ryx8sZU`&D TgH0˜س ;;[n_zu4mlh>|(pN _|ܹs@dze\Sh 8]7v"߿%FzE$UV )RxBRm0Ҵk.+W~.e$I\Ҭkx5 F'Rm+i=Q9F�Zƍ<y*TN’%Kp%Zt~|6Zhz8+dnN6ͼ%<xY?cKDeT͛e3_|Q Ɋ;:̕H 3ƴ^cM0!2e$!%g\_;/�(@ L`|Ns<D P�(@ )6lŋ͕jug-Z+V0-Zd.r,[ .Ę1cdoUDuM]\F:u#h#yr P63m& P@1cZpp;M)SZ}_bw|nXīe*RT >TLQ!SX _2'ȂQȐR�(@HhnȽ<8~@<*nZ.BZ�BkV1byԻ 5lذr kQXzB{Tpa9r<G;t_={t.֬Y@AimnD P�(@ XǏ@k9g z3f0kl@�|CE4iNVٳ={6ŋg�w5jԐ>Ǝ;<ѶРz:֭[fԩ3); ^ݻ7t<6hݭ[74jȌhFmgG$}A߃ 2!&ϝ;gq8qbkK mׯ1Qc"Syτ} 3gҴt y4 ?O"M)@ PQ(1mۀb k5@FL}{< +[u"tҥq)3R~wY BE͛77 uC(&v^F~I׈M_'KkY'\5 RDe>5@sQ?}taѼ(n߾ -TRI I˦' HJ݀&M,Ў(r)Roj@F=O9H4pQ'l hZ7m<jLm'W X_Fs]@s꾵k6D[fCwD:՛QGU/ݦhHMZNm|֫Wϼ\;m3NxAkC۶mNa]_{�(@p_\:=,(@ P�(a=ȝ;7~Yɒ%3yI2 <DԴ?MAVReTNHЁ"J2 wX/ +F P v ĉ�(@=}u_e]LhY}tי `r�Ac~=Ń6AttAuEY�(@ P mC/> 9 <y| wVY pFv|W 7nݺș3Y֭[sW8G mk_~Ŝgdʔɜ/3|k ui~aknD P�(@ X#%J@Yq; i<u,`f`^ۢbŊطo9zԩG�L28pgcǎҟ *٩S'-c'L>TJ t j;w.4;HO55o iҤfFΑX$1Ix'Nچx,Z qL8`,wbUtåK 1tLwoRY} �tA>OƓIDU?(@ P2IiaC&=01z }P# #U*8΄6$؟!{TO4ZOϐ` x]ٳg7=zdHH$!}H8!mo!<KRLat9>3 /^47 sf>ڵ X"Лٳ'km}0Fٲ?tr<tsLN7m۶&A,Ms}Anƌc')4 ppXa3i$s47go hHJCV8.G`gʕf~3gΘϥOZu}v P(ի [m}{أׅaɯ/?+O I@۝ݻ/px PO`f~>t s<|+W.CPZ65uDs,~۷f?o4h`o Hi|@ PE)n 0[ x/C3G_u u YƎ5d\o=loϓj%Ce˗{RX_(\0zk=ybc;}(@ P/ h;t*i9rX$XahQ_-B ϨQñGE1rrd#zB{$ͱ3g 8C4OsJ%nݺOqa=rdnT@|@ P�(@?а5h0$t<]:6ڎDžԶ\N&^bƍf/ĭ8oj[tH2qMX[n5n>|N4F߾}ɓq<4NR")SW]_~kZ /H,_+khj-xx2'D PpfcGvD.$p8=x*@X1hy]AI8u$�$ϟoFϘ1JC2w} 6 */BW<4Joŋ!_͟_u~⋀s'Lt%0w -ҥ ރĉ!ev rC5% h> _7.vE޼y! 8s>t9s 9!~S{MvիgΚ4W@-lbe4w\H0OYM f-$p]7nc} & i' Tk]_|/(@ xD@…ŞQ.�(@ P?'O) TBɒ%!}e_Atej*P[>.M7;ܪqԑ(@ܹ\x,(@ ,*o&Dk׀)eew _ǭss ႌwT@ox,(@ POx�rc3N<ȝ[DZguy?Xk PNqxQHT!G m{ASf ֹ@:houԁ=gK7#GF(@ P�(gzG}{@IhIt<>ҥKq-ob34^+i[jժI!}f謶l&3 ,QtitɡTZ C @;v,v؁|RJX|9B#hvmHyD:B'BITD>C˖-aqĞܨ\:v*|c<*S9Î'co-�(@ pڐLb^@>1ȑkwض(74MI>WYltk?m ŋO˨#Gdbb/yO={?k63I&6Vjo6~uJ,^z%{C%%ta!ZMA^us]cσVcMxtLFh@GN=zݻ}Fza#+ GaNFҥK 1?Z2rY&MY<Nw R@4 h'^Ӧd: : S�(@ P~-B{ #xD@}2ed ghrG Pr 0 P;t%~H5yGw S`i7\ pn3, D.`0Vpnṳ.A uNг?K{&F P�C@n];`"doMakܣ%� o(֒~ڀ[*?vB{޼#=6#G:HlԬY6m2*\Oe! 1c 'N d=927*h~|N P�(@puYcVΝ]v"_>>mzNg-7nwyG 9#6ue!xc֏~Ǐ_Xz5ĉc'r̉ǛP"apf,-Icȉ%B\$&O/x*Th1#.B}z:  DLA?O읃ƓĖo P}^yD V]!uj]7niDVB a(_/\gzH.\#?~|]GRi'~4�bѤIl!-Sۮz*vG^n Y=Qvmi3P hs 𢡊O'MϠA7{^HB-ZT,24�ŋeBAlsҼ#7c[W8p�5kfUVذaY>=ih? V&n�(@ d - ㏁qWg�(@ P�B)cNA̟?< .vhe/u4?G P r@EhG P&@"E ݹJSL2:$kV.bffD@,X yO$н51﫯 c cꢔ�(@ P(Y ~=e~ukp`X=])@ D /5#G+LxӡCYɓ1b|'2%9b7.)7(*s(@ P�(K}@cA4mvg}E۶mQ@?عxk≬A{^?36lȘ^VEUT~b}=o06bhiӦ58(N,]$4 >K|.�AŸ<W'aœ-�(@ p(Lu�K�+Vߘ p׬KF!"$i$7ojnXԀ״e˖={/˗|mڵ lL)\O0!.\hFwtW<ύEmfO=jDm iPI Zxe<x=BFE, �5Lŋ7/*U|nh"_FbkCFh#Ioj�H Z50CL}a%mS2m4.9b�(@h?='�cgDkqxr P�(@ PB{ kj_K/diӦ/;xTV`}t']= / !7Pp1aL�(@`~vp?N \nwG/~h8& h>Y甉nQ{O~j?ޓ5r%Pd]2+H P�*4)P>0ip\bAwo K [6@͛#5p$(@OZ]&1Zstnr49c^OՑ)S&3874hizK /5sQ᝟S�(@ Pv�q>xf1p} 6<0pݠq mѩS'3FDƍڞؼy34p]X1+ /+W.|fmc.ZH-Y1F'ᥨ"Me5Ao2h sEu2e qV>>g$#yT)@ Px=YM]@@<Y ERܛo}]i}1.\3g6oPjh;>#ܺuk38H`j6~W?7Mv,(Wl]FZze9]v{ko?zNMz͠-ZhC^RjD|Mh{Af >|WQM[C̤+WSN~zH2_~e2W;Sd3o zA;/^Uʊߠcǎ s_ ܩIR�I$1oʪ&&V 1$Ҳ̈6ºE 5S4&vw$7\��(@ P=umsw}g.RR_fzb0v O~mٲe{̙3@_4hk4]|9K;(@ 8Y (@ i/ruKš$ڔ zǁ9]At 6 㼂QXQ]t ύ(�(@ P hpΝ]Ahpn}(ed7gO+X_�(x:<H6m9wȑ#sB{輞"_b4>ϓ'9Kj5m4SH4Bܨ`' P�(@ L7|)lxE5>+V4A5pE"vm mL0AC>I->i`Dk|e2uA8k,<z(T"$+$j> g_~3g&N $mt)0zNH̗ϓQ< n-�(@z C[m(U0Ҥ1Ç.X'ualh0/_n|gF2d0i#UT`H#Ðhr4L6dⴙ4Uf>/T!_[n?6db!ws?irϐ&q)S!;v, [ղk$qף`$Cb6Xܼy_ [je NC: pi,,wƌ pnO AC}ƦM_رÐR@e=9:hbǎm={vcԩ sΆ46uΝ;!1db'7k i�'N0ajHN>0d?`Wu}+P@1t C<GF9;f܀SP~/m(@ x9gsh}OK.5&uXbݺu>Æ6Ӿ8 ihn+Q! UMm/WX1#},Pc\r9#kԨ{Ȣ,ƪUϑ PNh0zə2; x/cn{7w8n k|ڵ>Y=ˑa"2cĂ'#ahgwcuϞ5^3^2;xb�(@ P/2 0ںr[(]04͛ C3Qp@ eBCÑGs5?=zg6(y=:̑Gh9HӷܱcG[̄8N#G͍z.s>�(@ P HoȘhCDŋ74CCm8΃mڴ t<uXm G8D +X%ڶh֬1|M5j0on'+7] }4gРA (Eq?tZ ).#F0qs΅۷$aB{ޑ< -�(@wHAot:'5jd`sc.}^�a+3FM@jlJc>Lh/7'O̕$8!QdjQYݻ Ӑ Ҹ7_K$ ntG B)Y"QDA_vs-F:;3կ<+X9_D:N'Mknhl06G4�ͨ^ҕ 5vt['^x""G7h�,sރ Q*x�O}}X: P7t2 1cFX P^. _+njx+ @.SHq4�>�(DZ _3) R4W*w?yǏY]h-~qxɓ-}7oɓ*^<F.�2�[Z<\, ̛g}> _uwWme76mf<w<�(@ P $?¬_ϙ3)c \�d||HGs(@ d`M<^nH o9;ɵ.)z3ҹD3[WGEunTxe�(@ PT 6m #WurCJ*Xrwfom[h,x28CcDĉ'XQmDNGywkL4 ciӦڵ+ , E83 VWTR!Y KЬm$'GGW�(@ � wA[@ժoƍ@/ ԭkvR?c6z,Y^TO)|lyJX Po3b 5 ӿM4qݛYV Pҿ7kK x҉S=Wi;2+FNc�(:)Uǡ}Wŧ|?͟:G)Ǎ&D 2 B5k AjБʕ!R<  Țț vA!\# kTC~\sJ P�(1S>y2>Xk*�+ZsXܛ@XAA/_�(@ P�|O@4E~aF ^@VȒ% -[{P,AE̙#cСC([,ufX)>w|9+? �(@o+w}V۷AǗ/73|" aPFFfg@jD Pn r候31c2 O P�(@ Du]EE]툉xG��@�IDATH**Pt( pM x_Lድ:;$M weD:e`#UwwVk ぁVǏY�(@ P $r8p�0�xCW4iƍ9$En�(@ P�(@ P~]~5A \'Nĉ'dިLe�/ڶm?udmbԯ_ٲe_|TO޻9:RA I P:KK`sԮ hM _dہU{v-]6RbĈ? 4s0xu =6m(*p PpDয় 97ov9r�(@ P�(1E_uĔB 4cƌRP>-@>}yY9 P. <Z{�t˓9̙{@ÆVA<lVN�d P<2Q�(@ xL@|@̝;=y}N w课!\";ҥ\L�(@ P \ . 2*ˀArcﱬ:={v/Bm6wE2Hj߾}7n4h Rreg8}4z!x& xm-ZD%hȐ~>G(Rd;?O-ʓR@ X <ybݠ>|زȚ|k@Z8-\lo%K*O<ѣ#x|q<iE9[@WJ`�(@ H,>VA |̙�(@ P3raf`gfku޽;6ĉ6g>?3c^�BE@p{#ļ�|S b H][;dӓrx\=<Kx~P^=`nhQ^Ȅ# ~`T�(@ PE5~U?`fhm$i\9|y o^p/s7 >S%WD0Q�(@ PƎ9&29J鎬"=I3b S W\a}[ t,XڵYcZ֭[%v3g4ވW> *5k^ xݕ2eC[Μ9R3wO3=z*\7"x < QZuU6mu묕 Cۗ۽C`jZeLQK "8vl .]nݢ/s�(@ 8"oCgѴ�#E>�(@ P�BH_ :7R3d,@lQ� ߸;.=C{{eʄ QuJY__} tiV@"EM�(@ P#}+4]zYﷂBjpȁ[�Y,P2_>̒R)Rω[ �(@ Pn'O>�L> Ѕ&2g a�"&3gNO۶m/\RD>|~Qݻ2dԩŋy޽zLxF5j}r]B�@@+3?D Uz'p�3N [l3g cD D Pp fɆ4@ZS�(@ P�(@}r/(@ P hd׭ җ~`rGٳɟR 2#F�6�0$�ƎvxŊo s �(@ PQо…=e�+1[<(P�HS9㨟9P�(@ P�(XD ٵf(]ӧGf0qD:t׮]Ò%K#O<@dEĉc|wU0]&u=?,֭OCg�(@ P3||g {b)t@҆eժXB)k�c[JFX1uʊ}eF'ԯ7(@ P1 wo` {vǎ^�(@ P�(@ P+D5%Mj�(@G48!`rwH9yyb.1bXb H]'`ϑu`Yl<8z߿H`V`rd"k!ʕ+ω#)@ P�)E,t,] 8n83(U/_2yyw<(@ P�(@ P8y(Y8zԺߘ(@H!4Vѣwł РAL22eo={x~e"Q|Nʋ9ʗ߉#�(@ P tRP㣏 z~yYBtUę\/CQxi9RCt y P;3 +�N۶ Ċw 0(@ P�(@ PKzH/JS@$>AF/4d!#q@p7[ 9-`Ĉǽ.P{7n(vm kVO](�(@ PW�е+hp mdL"B.] ˗,-(@ P�(@ Pl�&vx*Q$@4;ùs0yd>|E-K_B[-̶,fX/b�(@ P z#? @kglr] X$Ō˖}ĉС%\& PΟj�ڶڴ�JpB̂�(@ P�(@ Pknݲ4�(@ p"3@V,*αc@ƌ@x>U-V4`nAh*+WZA4�Ǝ>/Tfnߎ�(@ PQ�ZOipe;MklـwMD P�(@ P ̘͛6痚%�7׽}gӦMH*4i" dQp^ݑ<|v֥h޼,"s@^h�(/xX@j`:V ^/w/p*PWū*U0֣j!_*> K P&GƏNtc�/aeq(@ P�(@ P�\.`K (@ P4'>ThL< ہ uQ&h 9]7s@T ~aTsQ?2g/?�YZ;Mn]+(=b�(@ P^nW{@gY3trt޲ƍ ֙%�(@ P�(@ Wh XjP@r?J?o> 2cǎoS͙3.jJ08xM�(@ Y ]{ h+Vtu5֊"w@RG_…!auX5 P@%K={:TPw �(@ P�(@ P>.A%==̬(@ X4W_Ƹ22ұ9r mo„Ӧd)zbǶw.^ 0y2E۵Uh]r�(@ PQHR2ذ @wíP#=ҥ9P�(@ P�(q{Ǝf #�I sr_}O?TxY&F͚5dž:hPw ~…ڵw�(@` HaW}{Iয়Iޗzk˷ZV|;G`ذȟ9Li={< (@ ]Az x 탬 ċc%(@ P�(@ P�")p&,Y$a�(z+ )>0&Y?ܘ/Ф P $|81в%|9cҥL,L*fُ?oG<<�(@ P34(xX%K'N@&@(�Y _yh ?ػ@qY P�(@ Pe2emۀ{8\_֍Y إK KѣGVɃI&!%[7-[6<R1s/)9I PXS$4S!+lBۋ۽E W. mZvmȗh o^@Wooso#K%;]@o3 Poᄈ=|L�kǕS�(@ P.]{R2eʄw}/2> (@u{�(X2 cB@/|T{noAFUǻZ믁^ƌz~v6 ;nP dLԳ|^ qh5]xbEBti Ag�(@ Ppџ-uqc/A.(?>P(P$PP*)@-.}3gAFn]N3 P�(@ Pst4)s'%疕%�# # sA>ݺu#dx;t ӧwOa|ҥȑ_Qp-n]g$|fG P@h2ɗ�:w>Q×k?uӛǎ}ċgx<p49XxRM$ ׁٳ1w.еչ@tX P' }{߆͛!OÁ)<<3(@ P�(@WlVˬ˗/C<Nf xT39P%@|'P@dbd ȸvê9Avף)G7 dY $V+W֯> =iџ!C?6�d5@B*)-k2Ԁ�(@ P@D@J֏桁Y`H B7b]k`H)^ (@ILa|zg}1(@ P�(:@'R,^l и �IR+/_>L6MǤI8zhԯ_ YBWm%K&9 4eqRZ^V �(Ͼ:ԡܹc7ouo!A ? 6 t4{tDǎ@֭0B {óQg \ t`MZyP�(@ P!EZlX2H=k֬N|(@ ͛@d>SV�$ y_9:F-}y1/;fNDgr.!fp@߾V-r~6L0ye 8z2 3(Zg^= U*ھ0y5M(@ P�\@wԩ#֜+&M>}[tm> \q挗Wŧ =@ G_}³8�(@ PcЦM�PZÆ@ր2d'n�,TrSv8{,f̘'O"-% ;]AFȇ+s#\o)7(@ Pp�A8Nж-ӿL!$PȍL:gΝ1oϞ(@ GU\�]eyrk_VZ֔�(@ PGMʂ6h @fY٦PB�W-^Xs Pa7'G8\ k/fA& ;fLtw�n~Xx.@3y@ڴ@ 6]hZ(�h e^0(__�(@ '}5j�C�z!a޼ @ܞE4@:aڵ־)@Zbu}Ma�(@ P�<C@Ϛ̝ hG;i,�>p V1:l�-�o6vލm۶ɢТE +p׵.vMo %1h|@2Q�(Rt)oe>mx1$B8KWJwXIjsPgX5 ,\h :Q"pp~сL�(?:QBoeuw Yh/y�(@ Pg|IPĒV_�[@r)=(@ }]w&z<֕ ]{m5dΜ=s�yY0A׬q֙;@@|_o�Y48;2Կw+{nsgyy. P�(@ h?OMo}[�}�'U}0wn+_{Bsny|Y@pF_}(@ P�(@`:�v׮*A?|A%�WtX(GN:%}M1rH30dvpWz?9DɢO@?/(@ Pp�A6r>{ZBh+O"CJz>eJ`Đ^6W hPFWCX$x?(@ xN $0QQF8$phC P�(@ Pw4У| )=l`�(@nI-�(@ӧaAr`f{2]2G)L+2f P0ptCtNvc~[k@۶Vw_~3d�]k @%K hvw` (@ P? ď)c5Z�йGWXA.z t 81P57q4ܟ/%jS }(@ P�(@6 Eh (P�xر^=P!1cF5 .\ѣEViɛ7,R+W# /꟰Vp!Wǎq0c0bկS1k P_ <үIzcukH4pkpw׆I@'̐�UI*J`P`F+7h[]UK Px_X(WH.3+UM6l�jִn H(@ P�(@@  7RSxW�\#4Sn�4Pf''D]9?{g7Wq  �E ŃS(P(^+ n iN?ٞ77g>ٹ:wwGΜ70[pA!Af +f^Z)r\tRG/)?o쉢!$Ɛ\cW+;O(.ĒwL9(B@! h&flrcf?nc:˂yN"y{gf*ju 8ᜂB@! G�&K. 8Zdm ! SLavif뮻ns=`{bSN>S[lr9l]~=xm~3zUu.'B(A'un1`lˤXת/c6p`<v䑕kfcTNW! @{ < $%;sy%V0駼0"+B@! Bwym *A%& (,(! @qP:-&TB@!`QH%@<fbr~)Tί*#re 'O<Q+l"�#>gz˂aN;M9Сf,<FYp wf we*B@! @iX]xX͞zok1xUR0Zk nJ3BB! $B@! h<j= ͶJ<�㣣#B@Tl*Yg;^m9;3>c<xp<6bĈ%3оdM^x.Oۀ"B@! Z [6m^H:("Bk"0t+c1|fךunZv 7 XKE! h쯹} ':@�&fK,afÆI1QB@! B@< 'w90|B@A", ! @Y(fl\&,�Dgz`&"W^[9 j"0Nߖyk|j>z;<2{1QfW^'6_A/7L$侵;>\{5櫿J,B@vF�3m7.2Cwrȇ2;pYf1}ڹ〝sChN;՝ooq-@1)! B@!XX8:Zrt!.;<{zdl؃>a8s H/z駭_~Ad#†׃/lQ=S! @"TZ<0IE;E�B &OBغ5~hcyO>=fB@!`Wfn3foW\[|qo4`qwB@! B@llRVXf}cB@@<Eh|M+B�/Z)t?7~ 7Syҋi~QTlFl5̂|svkGY+fG`]4uy ^! 4oN5?~pMm ! B L6ي+棗ݞ|2!?(3]z0[f|\r<q9}!{㘂B@! G`] 9%Сfl#5! @=>((tA~_ozʶd�A)o<1bٳ[zyn X/>唺=ZB@!E^WX`ΓA6к*90xqfP)4aSOb6*B@TF$ i/LB@! B@Ygo?7mB@|eB@tPFg׵cP?cق<Ӵ֩Tj+yR EEXb 瞳`\bvYy'x5$~L(�: -n8UGm%Ĺ7Id7nˌ8,k+B@!=lUKSv*K͎8"O9LyBH!1 BtS=[rSB@! B\}6X`}gؐ ůAc^{ey @r- {]pEwYJ-̓A< B@!pfGQ0w9G iGV/3l$ 0xaS*YE�OboQXoj-T.! B@! @vm#$ Xl*J#Oځ|*_S ! @[{.D8ŀE@lS z 0fgizf[om^ ^~ף$zF+#|1f[KCk1{-~_?fΛ'$%3w B@!lUK\cȱqPN( Kf(#�)K:pB@! hc@q:tFXklcfK/ݸB@Go߾6D ܴ#)dKkvxkmg6$fgB@Z k|acmʨ HM<yACuA]\rY>yV0裏>Du}zB'(5h)uq\yB:.B@! Fmlo)kM?cOjK! A5q.ЎB@`/Rt0DJz< EW^y*7!PO~{_ίv[ɬC""zz}R^XXs3{ͼSOO?hSH&gOdk.3B@! �KfF=t ;/CKy;&kl=t!P #;m! B@! 1ǘ}$[t60ObؒB@w}Ϗ=Pd 2H"ozjE!LsHuSB@! ZA6}Y2;|35LYi{9=}me}5lMPN@)]7{eUoѕI !}5o7[gvGNB@! B@TF``ͳN@ 2$x nsB$}W,ӸB@ �RU_~iϨB̂oF}5Ap>W z#0Ez{ifwޙg0SD` zJ8쭷DDt@n%~m"{y$8#B@! G�RGr^K9rW1CBf/>n\A4?w˗m! B@! 믛tR~Mq:desivW:=Y!PO>& = ~~=^s5F&' e0u׼1T! @# &{_dpM ZnypA]8fs$g')qI }f@>u=6sʈs8Sf6,U7C' ĭȑ"_|R7|_ToɂtO۳>{D#(�[+ط"\9/_UosH}ѧۅy"mNmG"q.ʥN:M\w\G1OY u# rquq"! B@!0 ~w<29Fd[1i SKysZdd~&rK:j2enY,2ƒsM5)'<+I=r|<5KA!(QA B@%R΢V|ڋk,雩}|~ .X|~I""7"XKyd:{ѽJ/[z齂,q\~2"ׇp2!%9FHʆX}]&.7ry.3"E\XD&,eCM:TSE)�XgC I *rS=6ԉ!I1 DR! @`=%21IrIrL#_b,RM ">F!1qI SxX%"Kq<9&ac֪|,)!Ю Zl|47<cfwg;61"~(dmwMc`ۣI<|=S{M:v=4_H9MJT {IɔB 4{ߕ'! B@#q{<e(m_?'ҾR)fn6H6)!9>.nrL\͸1rqO3"YϞI &ޤ ǿ~,)%Rʢ owCm'm$'g# n&v;<e'I}�>d} r'9N=71{V>pp,Wp,vRRX>#ُ qI OǼp)! @%DY v0{*.h5^xᅎRp?ᣇ!}3=^<.�`2r/Jz@?5ָ6k~ςP ʶy.A(HG\,ʶB;ݿ1+DBnp.qyJ;o Hd9$),hB6ʾ& 7;F X` $M�>m$oI`RMJi€C6_)m 0 ]@�pr'#~qq }h{ 9B{r\%8R $)dʶz>|f+rQ ~u-Af,pF%<qӞB@! B0WE\/6χI꫎}7/7b~IK1x2a~69M_<kr/RiƛRv}.qO&s2}RE2J�n2N,}ipЂ/|]A�+! 4aB`ɽ f ê�_[gTDټ5 |@~;Fۤȍ;LT@((G[o}͂gwGD CnC}%Mp9Q|:!r"!8#Y*|yG?md@݉/J6T gM\zܨw>5̎gweA=蓠7$t+! @K"zcִ|<\rLE]*06qM>>au-?Hcb۬e#9樴fL&M<^_n 3c$Sh5ӈ7llX[yHqa'DߖSUڢ}GW!_jYnN,3kHsO LjQ)#?IsO)o>DP0aeG7cws>RMΏ 0Oc's0~T /~<B@!j0B6PJ׏3vKOFׁ-'Cp%)[IS\˜ɱq1G9Ą9{} 11o'}lc`7\81-ęD2ȳ~ѣf.9 4xXʸ:۞",ͳu�n!r|GqO>ry@E聶tw<0.I^}})Xaѯ'8`}w$G\L >$gx ~;r0/7(K�~~#)}l{RB@D@DM^ r-|V`>mE'${}Al@7Wp MdpUZfK-uxY1h7h$azbo1*sCϞ=mVK,DHTD�!O<a=XGd2E;pō78gsdZs3A|/r$⋍oa&K־}v9DU5BvʍP+]Qٞ2ONS350ͷLv6G&mRe[ A8N;+yq$?|{̘“o? 'O÷u|(J?tJīΧO"%>(! B@! sYd9m \㑹Oa@,B.2dϼ79Nn<y.FP6:ϼ9#:Ib2 \Wlz"'LJg=67! �`AB@"AwB ˚a>Vx`7St,(W7_z B�QaaDSd 'qf-ʌv2 xSFBt&@7AyEz(.rKdnx㍨ !F #B,b}dG C =|,V $36,AcPBH96/VB@4|\L؄5d@G~I}m 'ls׳|\L$Yff׬cvr,ۯzx1 c€,c$da-i`H0Lf䐐DqGFM8d/>6B@P+FJ~2>)Ǔk侍 U>sKgLj?= I}z?4>䔻u=Ʒ<u=-}{J62R ^Itd/F[J]>fVJB@l#84k;R |L.eXpك`ٷ}c业ddL$o 0C=$icb&{")5qSP/1.XʱvzHd�n+L/p3H ddN?m2؜7} w57\vRoxǓ}oIlAO$S<fۤ+ B@!m&xezupoj^]ew"r6;vwnsOH1DoI\r%o'ۥ(9}!/dP�հkZar[AL ~+qdAr-#$(d50<P(]暶kCAC�#}Ţ #hcFxDw (!v% -<r {mZO" +c ? %R%-sgH&]4)H()?{V-h,7Z;M[=]B|=,QS ^׺ ܁ G�l0qI0L7v=zHF2)r! Zd^w]kSEiajUljg?.]Nxキu`T`'#1�:[9;|_߿kYߺmuD[os ."wJ%#2ldAN#'I+3& n8'r!'ڤȁCǀG!0H Qd \I ""&9"tД !iv8OM|_q Ř'Ǻ7;j~NA)''uz1u)#6Xd抑nL\ (C!PGҾA 1G#: vBy;EͧlA&usI{[)zv0E60~2E�!Y8ξoswcOIVc!PB@! .2>&:9BAq5\ �z13eǺ uAyo2<빌7wx}F2(v[GInL~DŵyY ߛD7HMX"gOx%Y*T&! ZA6^a CW_*\k:��@�IDATa`;`H꫇ޅ%� .G=;nf[lEfy@one yD]=@`I($Y:+b0@6xT#!Pr%to&PB h^*u6B)%v"$SRW|g?$#BgJ)V2\o޷ !߰'�~p 1l1KCٌыE,sdQeWA.h |Ry 2Jo ,.+h^Fcv[\VU_I< 3{A kűt_oq >![:eNfլk]lUX=7ߌr$dIoVL㙟#<eHNGk(+Nˀ<uPq\|3ȁz<Swx\:8΂ς~V>e~BF$ 2l;`ӆhS06!MF,y`~QH'kq-߇ 3I]8Șocd&S͊@P^2{yQƦaXC0!0f̘Ϝ>24/ u!(q'@@ I$l {IJsr|0E] D9l/EB@vD[=Mc'u {> zɔms#?јn2e ǹMO\kLomR.8MoqYOn߅E#%?\nr;ǒ}Hr�@@}rd~c7%rdQDA!$jB@tAv܍>D<`J )BK?%\b~:NX!p +/<A<,Bn&`m-Ҷ~(j wu]q6dC8!&lb#h�)$L^ d[mUҒoJ힛 <:`҅<ua>zdNiCF�a:6\ ]S*IHd\S)-!JCW%B@`>'o*H0b|; 0cޕ^ocOt=m@_OR(|I&&dh�x7|6m+!m_l̎9&T@h%yZP;}fwmusf-` V0Q%ȧJx.t+`1+!Gz7"+#?Bn3!#"CB876z|3#ND@z~N]r/ä,hБTz=%.HH#P$,Lw MVGAĂk>H#;`ӆ<ɱ :apJ_5�_BLFܙݙ+ >a7DIE<t.Iaҹ z B#,2i�YBzڻw~CzڮG䎴6~adI~e̍B�B}IUH\2C:N2 O!A^Fް+�2s2'ey[IC¾~vr͜VAk_y}.J|qP&'q};*#Y@Ǝ #G22^ oxJ}GMi#I!IWx)#a\P:43-B@2F"Y)'\њ@O=yvWG\6|s0`@)t}5\@8ᄏ-M!E]d~TPׯ_Fm'ims( q bH&[l/iY)ABqF&,~,23rA~ )7Wr!Dv=g|߻AJ2r#%"JENOB@G@DҕB@a>p/Rn 1D c80 (Pb#*Bx2s@  bGD> @6:B <m DYϯ>aF'­7?OS0fz5 Kxa{-5zfg^)W_}cuihdH%#siVtu]_Mh8B.Z4,"f=4oyp"Q$I X_F=ĸZA"@cQ:ָpNL_'s`R@`]}eD$BGpu)!-X0AdߘW-7{/ᇿ˅o0> @}A@1]! �\0]}R'F@gRgB@!=W[rowH9'o_l{DVuc({�d̀}>,Sлi3C& �2t7\FI_>=߰)!F Rg&Lߠ,]gs=DA@m!#Y޼)@=d=P3 Ga̶߾qVs~Z>}lvڦb6Fel!+ J+dGyc/j-L=XOv[y督sWg}GL̖_~y;Cmu֩a{'S=5!/)BhBwR"'eA')LjJR秊 ׫rB@TAVG"�c\ GcanǸW&Y*_; ؂ԕXd;s\A"9Z`XPB @+&d~-V~!fl`|VY@Ze࠱^Os"ݧgy#BNdɬBJӻw(KB, !Ь@V!$2 /IOEX|K,DGDrꩧn*e!iLI>rWnG~9Dd,v 5 B@Fu,"#G*]Xߢ&̉ QcҘL@±>s͌E\rɎ:B@t}fL>Ast zKY~Y;[ު j�F N~b@_)IeS\B ;ٵ˯}.uǞ={}9HNUG�]ϑI92z+}knJ-kȜ =,@�>P6$|K[X#}/5d<UA!noyeW  ~nĈUVY9:ʆn C6k`RwG#Ad[mUTpm:ճ;86l-vX*ZYyL`&^pqW HGp B@ iwrH.gBh SH)Bx! ;k[p}l%"Pi@w0~:F7/:! }Ƭ̧(ѣ#)$FwDbD@RK-SdZX/"gefjM BiL`vfnZ(i'! $OY}QK/5uW FFQ2pmzYНN.}@G6 2'x#| _| r%o*vA`̘1QsHǞ}٘C re]#"V}2bGH'OdƎHT $-.c !Ъ0a,c?#m/dc1'uU(5) D` c[.ƾ}>%t* B`tz]K!=EH 'hNY !J/ ҉!zC D􅮯OB[P]'Az8*#AI ~}܌E߈j:BW_{ycZh㏞?rP^z:BUjCHC @@?A|KOEe"j�z B\ڀN,<tu8L>49L[QB@dAf-t p@\׉t8akߠu jfGK~sv#Cnw}mv'7/ wyC͂ G�҅c=n[qSOeY^~(l ~.غ #Q@` <x nN:i"Pmd^:+h"lz,=8 &ĹQ"|CE�ϨݹQ ;5@wxZ#-|wrҽBh%yZ;fKl'9,(>g-ipCڒw[sM N ޡ!fcSҹZ <eIȓ /b=zD85A0t~OCW^ye1m> "}~!)<rIIc8i 3Oܣ �οY::‡Z{@UY|*S#@u'|#K 1 vJ$ iDE� H<"GiO #D1;>zC$I=}x@GD|;[! *!N!k7tDȗ xLh}p&4q.B##c܇edr߆j؞[`}RYg5WF0'`- u`LcPkgxS=iN 믿~FJל2d�㏷w9HW\qE$ExG2kPWB=#*L>F xtDI5D̀�^\�wRpx[B>}Ĉ`<dw**"Q@q W#FF3de]6đx/1Q!Pk(�#<@rE<�,{P@+cp?((v]U;!YZINĄ}ϵv%kd5Xpux0[X060z<_{,{dȑ TZ>0{s9(^T䶏>hGD.9$ �[uUNf,ДGrH!$ԉ"!d}q K#QGN?}XT<N⨽#:Çc +记 FDJk\[9Q$xO"B|>c!kF$i/dTR�B=~ L38:N$� $d B@,"�9dN~ǩ.afOo;B@TTȑ#m̘16SGE]4KBؖl߀�sxƸ?|{|Ⱦbs/!Xj4mW1D蟣Nc7Ȥ|r/]UB�~76TSž3$.*l+"+{En4d˫fv;Cm2X�:N:$[s5K.ɤo<BTyM7n,aU>q2AoB[7Q^k�D�kO<` hE~H؃Ņx(%a !mJTg! A6{R)0cb\ [qcDiCrFT@`ûz(*V[mh|b[}G ty @+ډplV;~qx“ǂᒅqn+Ԧ|X'|rt6A 2;t!O۰a;t|VYe{N #5E~߈ȃ ?YghWB(D &⯼$I܆,I#= ` Afd0v>禘bto)rBJ׿1\UBo8#^]wݸ<V-0 ‰<Ai@21 %*8@ 2Ht!C@O>"R*غO!Ц`'  >[#BІS tA6;}"k_QglwX']!@І$1�`ܓ83g"*D�n+`5<.mVUٳd5PB@$donfA_D0Lh|ډuiJ޲[Do9RZ˘o@.U5h??w1_=ܳe"\#TBahGp�[-U! �.|wA+b(f8q d!O>y7[p=hB@+"l7zgن bv[\G!c6p1БQNߠ&*#J;A|W�0 }! #p5f[niHBX@+ډ0 k; )^o2찃G~NN;yWVJ/ַ,8̏Rf.눐]Bㆡ:5XPc3aUYHϜsu67pè'oGSbN9|>&mx!IuFB Y."Mxp6GoN c\Zkٚki3OSK͌I�`gsaL>"#mQtZ6D5sU|Iy�2Et% <�3�:<a<v2I vJTg! @iG |{ $0leZn1B GC]ꫯ["Nz Uhip$GBD!8c{Ygm\!d! Ztp ǖ/M=,kخ)!  FJ'56 y{U"ÇʄL jMCPp4hP<W] b*W 7 z ě'x]v8Huo<@l I^DrFSB@4%x]M GhW#Tlɚ JsB@F" "Fg vu]gcpzE~Fr B@.(_a|wwذaâEdǛWu߽j5>,8 K2$Ok'b,|駛هf-Cіa)&:Z H̖Yk<vW5%ǜQF�[o5:IDLomV}T%AErT *x cg2Rw1fmS1:Ԯ(!(&)!Ʊ-bwyM34q,6ز.$`Ni= h^~eCh @`E2EB@6E�QFu!@+_ -Pqc\ B@!^\?C ߿b=<G #�[�}ejq,Hd9Bmx7'-q|UVC^@ !P[:Q-2z^;:{(RA!hD7`8*^u)Mm~?f"袋.nvah܏nPGtwnZFaWB A(o]vYSA~mEt{6>J6V&%C� TFaoFTE� /xzKUBD@D-ZU&A�8fKM<7n&M^%Bqw7GrX!~,y 'Sh.:ʂQ*J+@+ډFgސyY<PssI܊k@ThD"|zב\Ϗ;88]`RB)"P=>z/bQo뭷m˦|*t*aI_݆8}K¤% fL0`ĩ`|9^-s0;3Ďv݂3;.bC7}tta!@,e>U`͚5lK;D'g٦~zi62K4$8:٬$8G򀧟~:,z8WA! �:=P$B@oȑ1S]ۇ<GcYD�o1ƧymF+ObLB@@p(w}Q~{!B,HELun!FՖXb8WٍSh|I$?g`ذaa]h˲GGp(!  zm]͂ΫV<,< h¸H-8ǫgY 믏^X�w D{キtI~W� ,�ċb\ÓO> LQyעrZV >s5W2 ! ZMU>`|9$ AzeiZ Zpi_ .@# "ȖŪ`x1x933fͶv[r- WEB GƫW^�fqF_j;c0b BM n�U[AiDLXT; q!Mn ;͎?4ɭa9<]pA8<O4 2E{SO5 !`aN<i9`iU$! �w_x駟FBHt7y$Q$N ۥҟEA:1dV"vVus̨DY n4sN=0ӟ̂9ux"N8Hd.N;dmM6dЅB@d"gyh@9gh$ 㗡qowYgf}vٳg3O\^`N9( A�Gr\{v-ls=w$Ys5mrPB"{qvyN$J` "1D\E] 6e=\oBU&:4:$DP أGy)#p L2$>{!^zi$\uUx)! qN4dȐHosvmg묳NXw B@:! ":춛Jf<ݜZ~`S#�ձ6??tխ -,3nփ"p뭷 i-w]v/r{m {_~y-PfB@$}lmMGJm! @dކ<vGDohx_+�߼'~ !>lc~V E4Aa}!  h%yv6ݴڭ 7d~' miX6dtf[!~ Z?5𨣎DU~[B8؇]v=hdW>B =}/A)ic12IJ0C&I"GB<S|B[f 7 ]X2 vFg89g}>ztBD�o٨Q\䠃 m?> {~z@zCB>}ĸKF*F�'#ѣĻ/袩хB@!P;z*%3VƙK޽k`,UGO?nf۷m3! @#O?E/Xq׶^%)2!Ȇp$B@f4KP#&,Ho' quRK-e[mU$WO'p#]uUѶΤ]Bq B@Z# "Z#\ä@lhvUʰz뭃R}|pfhfj}YT߿P O<M<xc99瞨L Y,^:: DVA! @壏>${キMB+7*퉀 E�㗿oQgpիӄh)nv;㢌メVe*! 2J|;#Jv"&7NxC |a-YPl:-yVi͓椽GG)D"*F�p(2D12Jgh;')!x~a,I:%%DHztI4y|4nMdlan~δyBKQ$p 4?puRg@K!0lذHH)bء 1BE|O>��0Aq".f.[n%}GBmC[B@ SO ϡ?\eU"ylSB@q[v|w9p! @"UtGzc=l)@ yCnDo~ $!G\z#<B9bĈ 69Dh-XNB@27A|n {9\>\mM#0aǧD I˫r:[/]V%"!Dc=ՀbW^is<,C~J+Aځwn>T’H yi;@FÇ/ozk$@s '4 !CgϞv]w5>CuEo=jY+m6tG;y**v@]iii#iiiiB@! j�ށQ^^󳬓@{YϹ4J'}]}ȑqs%]";~By$N[6hh\ +V/+l^zID k\|%�IATM޿M3M73i۝+EɕP֌5?϶]A}0u<dJH(-'z6,ZlFxzV/x),OWAD[@@@A[ @tRYf1~ G3MlcA܂,,p =agn맟̾^{͂q`7t| ~#` #f7`m0;sn|y(׬Z0ε`Tkv1>>X g3ӟlE {|HjӨFM^6<G5y5jUk 8*x3xChh⋒54<^(:)uZ !ѣN:$ɳIF? ~?/g~ۅ tjx㍱tMmf끯J% d5M^]KkwqC.u>u`L!&_5ыAsj?i-Mg<M BB߾}m]v]|ə[ӸM;tߑqea4*D4AdwQF%\d۷F:+ڦr,A@r&lq$tw{&}a߿$d]oe 8'xbt R$fgqF$X,uM_|\sͨ[jEBL" d;.tVKZ9S]TºW5rUq`ǰ8zGX|/8d>! @9DYC/^HX~衇n똸T,~cX:UpൠÂ3wyGydbBi.TL,!g|G�r <Znj~. ax^XP4:5zwN8vi۫V)x[kA>m(Pf A;ݩ+ iQe@?F&&Fb>3fL"!( Ŏ^}!%:SViii h!_ͧ긲3Z! B@, 2© 1jiQ\g<^_Ϲ4(`\vK/˖9Iwּg~%)Ky$rH qfȖ VnagC O?d;gQ!P+D}dYr$&E7C1b.oB#|7|`A7KHd,a2`mB~\ѡr"o3iVd<ɶگgS`N{=0AsUUw3mmmm?KVB@( ":=@f_b󄏐CBl >O "}'1 dQy+ȓHTl s[8^tZFiuPz rx^s5bU/=KhwXU;k8ǁ.k8N8Lb u 94rJ8J@; ŃJVm!I 4!F�RpAsbmuc yWH;Z)ոoww$2\sMԳ|00>㺗i -M$66_A! �6WCGY3ݦr5)LYY)SĚXfe\ ɲwv>UԄb x>XqSɅEAmF Xt9)߰sP#4Tt}]=eY&Q?ܦnfYډw`ֳI+gjd\wټW5rWѧOꫣ",T#o!H"<WR6M᭚gV| [`+v=zmfqsAYϞ=dA";P~Imu=xLp`5h6qw»20 pc&4:5ծ00V !Gp/9O>]|ڌoA≩wxc.JPuvKʦ>B{1?Tdbemo66 }B@! @uꫯl5ֈ,!`BgըW=pQ'k/P�aiU@fyGt+OpwF-*n.7:th7!3/G"j<yL<ᦛnP}_(F�"șfSB@*%kUS.N.sD/Ӕpi:?i5} {'ʐ04<xM?XDN3id<mQak_6oI&wܱ&8Yhh#h+0PPB@$l<d^fK,apƂX 3f]~ t㷰Ͽ1'FMvmjmZ=]-\Ck<X1Cwܱj`\Qr  DY; g}e(YH0}ז;ǵ}Ζ L_?~9H|u\X[]5̼Ŏq ; 0`@+c?QОwyt cvxz|~! h Jq &CqM_Nj:_Q~W֜0BL:3hͻYg$o߾;tE/袶;>Ȟx b-"Ag}#o4|SBq7rDٙgiHc;.xkֳI+gj'icWb_1_Z\7 0|+(!  f chї {Z*"kN;ԑ-ސ@*9鸠7l38Zeҩo1,P$ 9v衇m^jx'Q-J<kYfc&4:50B;ƌS;@0q?;N6 ,43{^1&iw{Y$/v,M^FdB27" m?s! B@#o&:uYarH;VѺ2v곧 ֋Y!S(C=q(|v}ml8(v]ck!GO4{ YBaâ٫*MuuhJ~ F 6%`*B@ ǃڍ3LuzϱӾzϏ_}'f); g}god ސDZbmQ=3,'Q6DA!t5^b ^d@`/gku5O精]>3uEJ{UUʓo b޽{AUYG]`` ?O$c/>;^O><ўC{l Kb#y_Z˝Ks0_|ŶV[Ź Gsbmucibbǚ5HU~ v=Y컫W)j*CaϷ +XϞ=m &W1jxzGO E }=o[n<M΃1MK۽;j9ΚS#A)L_[ݓN:~v'FB[cÑ:*:뮻 EHo?myrRt}=ܦnj|[?-r͢׷B-wۖFshOkYݝ3wg.Vh!2dHtryE%m! @/Sھ7ګXW(  /^~Fꫯq=^a_Ǜ>}{1S<Ǐ?x{衇ws/\PЏ&pM34J5aEж [n_|sv ܰڃ8`t]w|vDžx b!PGᦛne?!S|g0T}WgT$wCx{}_W<'|bvZ"z %0 \;SL1jNx7SˀI-kr3ˌ>)bkx<S3Έ9W\,.7|bY|V iuk*=+i~ |Jy7mm#GqDwJ8SO=h/: lÁA_~I㏑(ۑJd!NsO|>IQ}F񔈷:b@LtO8w1rxǎ99rdBH;3,om뭷^IJJ}t ?X'Ș.=]W~A4bA1@> YSwHG;D(ׇztL[JZh(PdqJJܙqLտoP&omm!SB@! zkLTrȋ3e΃!M2GueVj.,WRs+dv[\0o߿hv.\5iuɂ0/dj9СC;s=r V"Ðcz4R7x#ʤЇ~hkWJGoVk|̟ܱ3O5QṊO03wl+C0��@�IDATbliy 0dS@XADfU! @ҝ7-F[alViUn l_a܋k1G}8N<˭aҋ`nz&K,mQ?ㄕVZ)*2?c͓㥗^Ώ|sJ"Ȱt*]~?𨛆KC)9Z8AtXFP9ȸ(c)$N3#񤕣Qr+VcڢϪ+u<;묳> Roq\~gb_3v =@>%;c?zqK{/f 0 )$CHU ! 2@XXI&CoAlAlx:8r(76ܕ *ݵ؄wqQm5PN~K.ҌCد_W.M.Yn(ؠJ<]t!jB!ڣ㏭FB߾}׌9a!6+oz}VW:_,CvN2B(%Wo34x'tYKw_`>A?k&%bOtgܐm両324uIVqú뮛|�;s=wͺ)&,W!B>ѶkzyjqMtw!Yה_gh%yH4cb-W4srkNR4f ^Xwdle {(5RiOGVm1럮kX5^CnYr-Kl{^!@ǚ:[ ʫZp`9:ȅJzpx6YTF Ng*ULo7ޅڭwfM/L#gJ+<˥~OI>w7oCgrggr|UɲV%kOCّ?*! @0Zt\P].8pr&&hE30\  Gg@ H瞋X.,w\ sK/t.]G^O`x?\}\pA.Lr .`˅e.,Va.8żD#o6Y<9^i',7Ju|PX0a\ 9a —'X uw�0r-@BCxO|\0fcָ0馛 \XɅ U{ te# ray睻r{{x7Zq`TPGy>5,&8炡z.{;sO<q.|P U u(oW+]Oⷜ<V@t YK|V=m[^X -@vڣ0AE x _2{.x8T^{-L@?9sn<V/ď/yK1_p 炠-b@&֠h*{s;u(G6ǂ8YlWӾ4oFxQ`Ihh Bˍ\8駟>1X%.sAY-]" 9@)^?/SoҸ;8wPBɧ{f4PYhUϵZ=Kyd _}U.xЌCdwyg1444sU˕[E87bDG QB4g}67|8Bn,P9Ay}!t 72U\/8\ 2,rJsXSjs>DciC02\0Fr#<2 ;4wLa5$|M'1? ?Bļ=ˁrO2$"Tل@92--u9(ZV_Vպ}7~-0mqPAh㎹uJ31fNːϜC5rzcƌ1$`cBW*5?.5&rMֹk.a*ȉ|#bns@fCCYBAKtEƓFF*կ\\yJi< h\ \/8lx:CM[mUߏSӁDBbf�R:+#@j޹Bro FQo[n)~APJj twlr=uTyʆgpUgqQr41U‘k*J_i(ؠJ<_ujխƍ:Xl5׬ `@ 澬~XkwnnL<Q|.oUB9BZrmsgi0-7O̳9(lGc]bua.�Ꜧ4ZJ}m id`V.\Ss ,d^O#_R/! S;z 7U~J5Tjk q)[qMOPIF7ظcvSj)Mp\ɱr4%a=xek1a-o㲂J|/Υf|<9 tfJۨ'k{.O?y(<ȫR*uj.mn ݱ[O_I]{iLieg*UO ͻ\ r'xJi|:46:82 !V2*rA98O1y(vah"_.J{'NPBE1A'.B:k9$J:װP5rە"$<Aq$bǓJ!"C5zrB8F~`ߎs>x,Xǁ$׉ !䞣>=` #Z <HG~Ki?.ݟ& Vxnl�d| P3*R":ɨ+5˷+L\ӕgXs+IJw߽je!aÆoɉ )믿aXp[nĈ`v@>V&L4n'CKJۅL/<?!\sPdׯ_Cd>NG}i}5*?;] ޮ2qR%73FG2pB>q�J@$1ƷWi\U[qԿ^yNHYPR`&Y*"h=/ޫj8 >WO{K #dh#+Si&[q9$tРAq.S�BiuXSN9%{8ql\f.]i[H; JApA;~(k<c8B9=p mQVS�_2]NN4 VG."}Iw}I)ғ޼Obo<~V$e:luȮpcnL3S72oPi ^7Q@9P(!fiN/=Ώͧ+,m^hs!1tgYD!7\�ex;onYVzAr= W tG?WN'-M*ڢj]IWgipwDz<Ic1%71yp"HTp0kDL?OZidY٦�Z4f*G ԥ q-ҌMҬTӫa3�~x[qM Tg=i48zJi׌Ҍ fSj pUͺøQp*AW:={(><i!d\_|ܨW <,o9<m*<s¶;fUQXmw6*jY7Ti ~w7;3ƥDl ?)8UB@ :} sf YTKow![I3IS4P%yH_fl\l_i<<ؚӄqeYS>ԑÄ2OD` ? n^IgiwW �_޵сСC].=xcfMXT{3A)O9xI>y_SWU?/M_N1R&9*C`00S8f6D Y0ε0x`iAԃ?{>IQ!pȓ(9C� HAPrp9ґ$*pdPקݙn섞wBWWW?vmQDZj^/\YtrrF]uD(J%s1 <rN؇u% vcԡZ8*\oꩧ+jL:rM7MǩrK]IJ%_~e#d>H: Q9{qO<6'J&:lWC9i+y[4W8M#7ȵ^+M7] Wv0h4)3hTщFO|<e$YO|\ ;5> s9+۾M6$+UFLMXQ";9r(h=Vx'f^g9&å2½uYE<؇b)6% t(1G#()1BWkH,bu]陴~a\y啢omdy_Zu߇1*:I!?yr}]t>ƭJ4D3w<.}43)>g>}5mU#p }:K5iئdU?MׇQ�}*Eqe 7YA3fLUE UYL['wp\i̧ݾN`RQ2$"*J{rGpGk@' ]_Ygu|(|eȎ,J5V9XFU7BRwoe\veD�my ?J ,"=C -i q}7ZV+<#kEm+gճdy~G7GM&8{9Aѹ&_qGpB,D@}O&4nM0Zc(%x6s_l]̦]Į*J!\phP'e{E{crPr|\k<[x_񨱳7m G-=Qg xI̎-.!u%Aj4ۑfu<iuھrl-ʫ4[6yovYLy(QhPc;%ΕId:ei{+Zη{m-Ep g 3\QS-لf7H.M4{WչTR2;9E (^pP?YpL+:˼dsFdّ'"9ʳmiXwb? ~޲Kr- &(7uKaۋ-7ۜ˳\c,jEK|бqr@RO"74%]ikr8%Az*gbA$+R88@4PثAu`C rMYs5k/!IӇ gmT66Y?K;L殧CvZ<h7"_[NT,prbVݳj-m6w*T=/IM5N`g}>)ͷuolI58UZr]nLI%mw-6̪4jdne]ߺճy+)"Kvɍ i)jd}I9_Z|ݲsrrxrG 2[\.2a $$rU&]HFd; $1 M<'wu<#7Y1ֱZ /a^# jνh#:&+[#0QЮ 6%,L hL U!d YB)"ʜ] [`H<!<#ru@soGJ0ᙂ4d z,P^$S}}vl5mr,y{,r wUiw_?khTytw‡N8!(vm ,YI;Ig߬Ҟzʜ>`<N֟mۺF ݷɳ`Z}H])єYdZ}z뭃 ^xnPf dC5"Q Z{.4]R^^\*:jRoi{&Սtf~ U}}ǎ-T2#8#EH|:'1S+m%ǑxX덭Xvw;bט ˸^} 1jֱ4FbƩvxd_nرce d|~GVnѹCI0,O@/"'~I8#4MW;dSMb?h0OtX&3N6"҈ <x q=渙g,X`L [ 1g^5&X&^>d8;i~RNa6vpyX,=@Jg-`D]B{_�f;'O[7 Uv@KcnO< yMKYڞRM_Xz}G{k kәgg` (ش>\|I` *U9,8e^29jIik׈exmvNkʻ~{o9и|V/?~ea?ay*:"ԫ:+Vrvg[u\=8!>֓*X"Zն\'|Lfu<mo4Ob/P~HrCN#-b됔$@O?7zh꫃l+tGGeeN:gkՇtJھ"MB4N Ҩll~%s[iN̘߬y{^)Ԑ!CƫF'ߥ @guVX?c}Q^ qP,6u.Y]�[V[^>@b`ӟ_,Cܻm&.M"2\$5*=nTYWV#55ʢgʪWۗ6nW`˶myOC\7O:}̓#8y Pf.ˣ$/e/>8YcV`DbPL8D2QOoh1s1Gk(ۉ(]+M9Brd/"-LLcHC/Np_̠d?Y`%*Aۘ:k0V'Z F,m]?A { ʑF~ V'M-LF\|+#({ʅD8;g,:1q=^zE<2HG6ԬPw|{qgʟ j5Lb5y?X1ҊRx+նUw1nG=h~i2@>r0CPol[neD>nit y{-xN4w%T.ܑ,|}M^'qhQځ_G.J5#8#Tu](EM&r-b{+yt#7We~mkdذaCdU.:cqU##ٶz=CŶڱyGm0~s=C(Fm^D�zy&Gp6 S!)&7")"Uߦ(lt V[<77㎂~f{Pk<G|($'~!ل@nLYt8z6g%dNَJǓwoQ^e=e͖AM#b,m5[V!G>8aݍ=[~TOa>ya-;pGG2ǿ49k uȂcZ&?ԛs(>Ok9\ծUC}駟 8GlN!OF̎? 1scWDl~!me-B|Lr=i[ۜ<w oEy,jEm:O@ZsP!M֖s4)+y,D?$#IFM Ҝn8@;8ӃNSZ& dk\WLPKqaE<7Y?v$˵ihrozV[Mvmk+:3+0yA,2A?x/ d2Ah<%ZvLpShd˭zꩁ_K-Tu({/ ;5{ܨH߭"~ɎIAdiUYQ\ˎy ʶmy>i|qb\N5,czrG 2[\4ӈF?(_N�-_BBHZdEB~]?{`Aiȑ!G}Tb YkdD11$_2Y[9tA! .LJCD6N5\aoO[_o 9"#i4 cs#g}r-a 8$q ~"]r%r9} !+"~ eM\|;rW_} 9pO7ܣV&"$a~^{r-VXqYucT*'탈L(1F;jߴV^ecD�y4t0_FIӟh￿s=V/Vǁ AmC`~qlG[H˷^zԒa;~&LA1?O/ go-w%iRgmOV~7<#E�]*t#^gGpGW +BP�&f}vadرajud<#4]^s5vlmVib~y䑕pkLe\WpJڸ)X:mjzUuE v31=@ǎqyݣx<Wu _;?T5#+OD"9#L4Q:$F9d*QH}"$癲@u^Ygy�ARq"t`RZij^Cv)vm;nKYa氱3;ڈݘ\'/َ4Iӣپ(loXے٩ȶgqկ~n.$ei{/k=u hpfjŷ<kQz}:vy Pq&49ˎKY,8&M2/Q+̓umVlKC�;,`fc|pgGyG nX'EfǯBp;9d*" 1R'2k+dksӈQfg'd)cjEm>qhrC=FZ[b\v 5~8|!7o=p|<9#%X"Y}t{kjk򒥳rM^KӇS#!?ςURϫ\YTkS=]m{嗃oxB}0KbR<A6l(fm6xt鵔fm9sС< Ώ=Xg|7@8`P]3,Ί/Qg-_<[Kgƿxnje{9 ϢgʪR4=xV,dg,;k=&ݨNbW?AɞG sK[nY*xnTrѾ%e}4`I;؛JJWA]I Js1GI 1:X.i'_Rvam:( 9POtұ$MVZ)lSE|I[KlYRM K/)csxPN#?JXA{Ii:-TF7t@U4hPIɡ<3p| m>묳`˖\pm %{=dMJJkm/ʍ7X|KM4QJ`XҁoIKjW¬pe]}=]:K%a ᄀ%[4VhOee&poGLJ@ZAHIrLJ0]c5&kƉwꫯlVҌ3XR^dYswidԒF%)hfOPWii 諒͖4jKxfvaJ54Aئa+t4lS6[QҋO'mS%L5*wDʉx≰-} e=ṱܦFWK|{kT)\IvK9ն)!q8nȐ!O>$D'aZqYFsYߢayh+븷 d^znƳJUZxCߐUcϒF.\I ·^ "WeyWřd;8..di*vԫo=r1~*\z9# o#P z衠P@ :4Z"GqDfqd.]WZtVꍭ(Coݘ1cB:Q_ҠA*Ѡ-%bic )+YuܗÇWJS#-֏wvEU`6aF ۲ƩjDԈ%tZ$0Up.׹ Ę01=mq$԰"o!t_O@/#SJmz!K*6tS'﹧l_m/SX5h^*-@M'癘oeNLK9,v Ƴv`Ӥ՞kʞ iCR4ZX*^%: ,zgDI 9,X,P]Bu� RֲiVǓE}YQ[GYl|'sϱMsf ufm,Wi-:=Ed:$UڞUUDWxgV8@+2EIYd,i}z^>y&݊49 _Rr#K*S}%9-˜Q y,2O9<dmo73ǽ<&u/a+O^®_E!+R+ჂY~ #1)BO,)ke1bDZzzNbmV YX"նewU{/m+O�縴ܐ-PK-`|)7h֒y)a'͉o;|{rG,ho4(EkdiZ>d rM5{,rM߱Rv_E6&맵#˘Wsb{+蚲WI 7Ǣw:KpL0T eOYYr)|3hгpʝwtaMblqEi'6ƟN}K/Tuy7ʚwyK`3M]U')gh7~DUɵ~]z9jKʪgʢR,z,}UIf6[,8$2UYUYd,1KJ[s=+\S_pz u//E~ $sUWqe`QK!l|1!%Qmq AZI)a8x衇VQ.D1".8L#̐0ֈ C�뮻Ke^ǐfwbsW/tIOdMVbgYb!TFCXt 70eK/! Q![ygD*t3HAhɄ y$e0 ɟ 2Kέ`Lg^pO4ϲ$<S=y S= A`0FX`tz;6a2O#R4^Iʵ,:1iit?:kCmרv<뮻By1n㋶O 3% <Lp|C؆ C8 Oz3}eC{ 9zKb)+ `Nb3luQAo3K.$|7vBʷ63;MHz!?nUG7skS# T yfCC* ,ni9o}M=�em>L#gQPzyYP<q5<= Jޕ&wT{?j||e"6cK*/f^'Gpz'-)ȥ' &E!:>:@5@t82M6.GǗe,Zc^{-1&'4Pԕ tIy urJЩRqL"3mL }my?Q<xp R4Ʃ]BYO?iғO>9>ciׇ~XJ;62=6$Pct5%m8t`<h0qu +aH4@/#hD? OxM{=0V~BYEI{H X�g0c0[o՝jA@UnD�8�kk9'JmV1y=F9_l+�vg=#袘هL }og,zIAj;t lGp4=vH"t~y]V�VG[x ?`ޚg'= X(Fg !`0ldno,18YڞkX |h3 O#WHwAyN uL7H3lB QF5Nirփ>8M)}-)?49&-QZvnڜQl@,ڕ6/ii'P^uchN8gr߈?euFBjM3eC҈ opwߝ:xD^0z뭃76"S伞^zrLo~To<ucjs|ew%SWV4�[o~b^rCZ_˻[4~N#-E{0 [76y8#P  ?wϳEkťY{h8s=];MR}VF<>$m9l\M֯׎F<_mcz:裏*~䦛|3&5U$x*}?Of^n*a4آVQVq{>䓠cb4lɑY0@_T-!R4"Hꉭ6(unz<Lb[. o=mNZK 2,z:?M1'MZ}UUY}矟ُ^:磌 Xpq_pzo>JsI[mU.+r) 1cD_GD^Q1Q!_PNv"mXN0ǻúv࢝((`CTX80>8x4kIԹ3?\;QUQZh^:"LYvWrE}cXH` v<sO[V H;?o?D/uO<!jn˹_ؿaQ^YQW Ef;R3U\q P%5H}:qQ5gz&[ԬtO_9#MsWDGi?<qV9\fEԒ0n,s j73և*1BTw?yNaB.Jz䪼ޕJſ^*w$ϳiO>WZEΕ|;|wQ&QE7uWі?.zM~#t/RN8am(0_O4暅1z6%: ^tj.p�'-:1Aڸٺ;X:mJ3A.3EǎXÈWyGT?{qU"QQƒ֫ η\/zA]Ŗ>\mOx?Ȱa6vm.=~5j;LEW *i6E晪\ecVSĵyn$4;ʟ,fWfErQU.&@@:":a�q7gD4%Yt iש\`+wʊ'-Q68 Vr3Ni޵ؗYQ__:Lu de<Gp"0bQ2 (v*uAJ7ҧwgJ M))W%'Y4<˼d^sFiuavՓyCkg۲?1<w@+`}1m۔P4Ae3 c%u`l`}򪫮*]0uUNV=\k_Ojj!ff_Q| SիWj\m2NRrދ6 wwdߚOIEj4gS-Knd`i_,%p~[䝒-R5.#8_#��s1d[l!J&di\,v䚼ڗg㛆M?)۾<Qkɮh|nd.FTlj_yZ~i829j-yHh8^%T.l=P|=| 21EЃN %\2:SVZ*I\YgU17=:^M՞븭y?njf=˜~3f{e3eAdc==8eWUO'Xmf{hW_ Yρ˂t:?vNq,?p,8d:|ں)qUWlٸʠ|a07j(Yn~8 1GYH9qu]W5*dc$~+_H,^YSUޡ]: 4Zh7 )1&F1FM74BV3&p{"zm=N=FzW'-n5 zO;4>|xp8箻8 ꕑ徵Un;jսQ~a8yʕW^^x< 0&zmG}r D7vԠGԘ| %#8p"ZvG _cQ�C:u'2\1]72]nlk@فrY@n=o7:?ir"0t"ȏ~T0-Nٷ~ '"ȇu!8hpCחKʥ#7Q_OM VUD3!QaG:蠃SXjvZَn40tI8L@qdžcIguٍ:=�%2!!܎ }o+e3Z�뭷gk],q'0nСyYh$˷"ȴu7|3wy!pRK-3R;~m*Z}=3i>Yo[^~jl 0)+֬Q^~#)d7]` ?V9<"UK0BG4hPw 9#+@c w)$j?,q駏)^{m L7A):ݾ|7F͚}a@rIqi]l}ˢ "at#EN|AC}ƭl6lEvWխߢ}7Vv?hExV{h7n\\ls@=!Gh%p/; QBw<-gqFpdY/첁Qy/LY`D \p#BL/Ol+ $c�#~pV_}v5-)ڽcʺȹPQ @v��@�IDAT\.Rӟ$Gu>AYF\sMviP垨Xf!d󫁞x+ʽjeض ZɍT%&l0yH徵W,QG v /o&\G|!Y.L3P&y UvGpG +3s=ev NC q P1]7@iW7N& h2Cg?qO:$Jof-Əszé D5z9Gp!0D I>Xqɓ4/VmaDe.| 9Y-{]4@mP\ 7lz!x'K|qI?:u[zA7�vlG7|:<8yA4FC8dM֎5G�ԐT?vmY65pG/M&D̷[o`7u f;c 7ܰ?f"}u-lcT|N$~_o+]vYbc+bǿJ+I7Ȋ-ڷhml٫ö<m{/Sr{/5sHV׿%ۿƌ3(V]u8#P]|FBj$sЫ><+wuZ>e2H9|;ZG }k9>#8"M}g Uc3O]#̺!tIڝ{n n۠ǁb8 hrť+-whiSgtd{h7nYO>o-"0k?p# e$|R!0l@A4Ƹm=sApkkZ>)&dI 12K5J#{� =C~>{(]w]p &҅ �<C5rHk:SW}'s CALXTSM4?drA 20p:c Km6[_ ۄ( m1gw @DUrǸ駟_﮻ a cu(_|q't8{L̲KvG09>W 'lYzBduUWg^ ݶ~`LdLO#} L©?jɓ#Я@ACթFTݯ(x=W/@?፾yDƌ5B~+E)dEO<:,"o TzDo#k%/&`N;-!ַ,Os @�a?_x`v(w8I>|goY؎޿]I#Plx^k8RN RJ@L$nƆa؋j` Q/$CR*!.Jrߢ܉ >b[Z?ѣGc1X@̋>bk!GNRH|z!$zr#p}ɩ)͟YJ?Odo?2>E$Le<%are9c9)U#SDժ7F^Ao 뭷,bN_ 4n)yYs5_[l!SO=u5o#tN%wKJصK*\j2aKÇ7U=X<UG�."_|q YS{xgBS"q~BnJ1"DKLd8[adРA,kPY4;l馳U �o)` P\Яrǫ*F DΠowݠ@!h/%}PQ4*&R˼-#',ν/S駟0AWzU;-w#D95z!.i '.O@#pX`~GTG ['"Hyy\:bE>Z;~HSM5(Fڨ&2rczGFs ·n]NG;9+2^:묲ۆIxrG[ p-=8<4_,+rȺS# ydZ·z+]aNx$L"_}UݪHu+#;_ypFaGPbOxiD-Xfa_~; zO@Eߗz(,Cng]^{mIGp_~YZ!0r70 YuU;œ,%L1EV!œ2�--H 7xCܖyh9;4bH!8T^zI}c 8 Ș>`O#Лt:~x ,:Y pN"DDkr!pU=ꨣ`D?I+仂ӟ4cy< ?\=P!' �P . .!xtyz7B!lfeY&D>b%:.5^}G"^uy\ P<#?Ϡ8:tPc9眳Z\UgM䠃D޻,Gp8d}||#n0"8dA24[guX?ܯt 1Q~뭷Q0 *ѩ-*G?'GAV7eB zJ4]9!*^(JVѣg@|NVxj}unT?!F)]vY('B.O#P aȇ~Xfe"*ŸU^ G�\uUXTSMq Ckn�t{."Ea G.EW?ϸ;C(H5b7|Sf}/*<~??B.!/,>ύ#8 C� 1i3n_x}Gpȁ{@X 9VZ),+B=s?'zGS0E`Z? "$ g.yJ"z sF Ip |8 u]S|ƯCK F0cEYă8mA�v >_@V;@xa0A-8#A�Tگ+\eGQ]zp p6eڹP-Zjԭ*2zhq0j*Z"s9' V^O~A{5'|+@dkn%dB.V(& 7#G`'8i|׿5>Og0H-zb{nT-\ӼA#',mJ8U?!rKXDp�Y:"$D9Q8a> ê_?ۓM6Y!r�S&*O#P'oNE G%E" - @EKX|{=w9Pe#zm 11/!b뮓oY{ltI .`wڎ�v{oA"%lds# ^[RE ky.'Dh+o\s#r睏 [τedM74879v0DžsG#$x=|08bǏO  akKVSYe'Gpz+|Л>}ט1cN|)n'8'8@`ۋ= $lgEL߂ NDGk^y`>{A`<-;!m@F>ݷ!/bX1!q\gӷ7/2ȩB/X E>EV|WĴz8@Qp"ȢޙD>D-/|N 0 v}w9#BL'AUi;/Sa;CN >zk9 ]6@%`@?û5L3g\/Ap;QXzagxɢ0RHX җg]p;# _x1!ѱ-Be "!$*hF#8@+`2p}Nز{##3~p~peYBG?2Ϥ4LUG`PEx `8BAp&O# Ouv#Nُw=6}"[z@]4HM>S)jR2(部\-_`UXB#?s+X@4p!\W>n@̂3@3<sb.h_ _uYg묳H48''�s]8a+JP\ gWp:�I!@@M8B}2hD2s!2čU_ o}pm?`w*vfˏ›oAri_H#`JA$mO#tCv�5Nё8J7]#8݁g}VvBmCގ ّ38@O*cyۣ _| Xy[1 g3?S>{2jԨヤ ]:p>r'< {)#S-.%!ס廍PO~o#8db%VfzQ.tz~j?(<eG�B;Hڒ㏗ W_}uxF{Dʴ)Hꪫ)(ox6bœ Ʉ$&XL0i9  N}ы2PZK/o9 23CۅqV3֣վZQGpp"3N"8D?'!;x'_}d<hAO(xG&y(hO# L*#͝g9A]nMR$UO/j("KUN E[[:m.: ϢkPa,⢋D&)~PbJ3fYde Fw3- ^lO!-�GA'\sVQCV[-T1#� :8ajpB[Lng^DO"<Q 2_vJ6tj8zX S%G Idrnų -!YxH|C5gG|^#I(mY ڲ:q#7bN6Hy^}U5>f1!x?<ȵ˙_:2/SO?} 5GwB?X5AO| Te|YG8[o?:G[`\r  ~[6hР0,n,NBny8݊Avѝk/QQA*]Ъ;V=P93c/~ 'p�򨣎s[IK%U=Q j0K.>:(Yv[9ey^H DEa¤,J V BH8!@ !$&f- VJo# |w^y ?PH$;FV)"NhֻNRwy %'yG(NYq�xLA،HAbL${ ~w~n?"@&Ͱu2?0Èr [n0qx[�/~aZOD:ըFEds=ڄl%Z+UŭdAkfġ<7T$ȨQ> Ca, $GjTkO?48K±ʖ>Lr *@V\qŠmsr#t=|SGxTž.>_͚A햿Pa^˂'G_nrs&@>ȼw@B|p#Z<$ ",R9ZОz29r_O@ iswu7#1vfÏm?&i&vt3w:�~lco6C&|vHkbF_NbvGh/eskXQ$яџA\|ަʯ�~ȷ66yͱG?%cϼ-Q|<9~9KCx~GA $y~!8݃�5z /Z F c^~ݭ'Gpz ';z\Af f)0=#s .!HL}r ;S5Ƭzj ġy+ 9 ꮧᙀ4leO!Ec�c䯩EҿQ ʉˆe晉>:H03\j4Z@&%9݊�h|Q0O.D(LHx3<Bw#<净DĦ"*r$Gp2NO#�#?A0S@8^0?dȐJd?~E`?8`bJX7#f!a@$9嬻#S>5v!8{nq'{Vc{"[nY:|%njuz{%sV߮WElq;_*7$N"x*.sᣏ>Z%8*:AC`G#[)M77k0š2g[r'"-Bʌ3'Gp ,c2=C!eF ]Іͧ?36diyGlMAa?r9s'"`;4<aD>($P͵ծRԦV2:|PQ #?d8S"@tW#!h@xrYf ܚ-4LN@нh_-Iӷ <#Ah`$aO߈O4}+DGp"@X[_H~[$g 9Fr[Doѓ#texw+99.d$ggAω^`m_G3DȜӇ=!ϖlݍENz~>Чg\�dՏO_=:(^ 5 *O9@n1fm!W_}5fd@twk&{B�{Ivޟv\s%UQA 1 nV9&f N;$?e{j/ hz-UV&#G~ƀT4J9|UQSRDAB (<۶̪I5\WGm|b^[>@9 ǖ&Y=GVsDӟD_ϯ8@!D>\!'e5-p0C1X'I| maYyI&[ὁ�:n3b[L2A΂q9zQׇs> 裻^cG] BnO:\b"ܫ~[?5b.,T:xȆ@ܢ}6`_Nǣy6oE,j83f~J 3 Ď%(.i)lWU:@f tA@K b%`@ FX"3~#8i(yq-S=Ȍ3떉- /ȪIX�h\dsy.'R'_q:|Pb9Q_dY`jƙ_%lv CYd^0j9\^XMVL AdE<u1}Qw5B7l݈}i"76 Ҏ;G;1vn?G3YYGIcYrNk8#Zpnɍ!E֯ZϬ-;=9@/|Sڸƾ0ε9T#Cw w~fv CiW aBAa hܯ8/+}Ġ]v8 Gp".+,ک~UKq2m~ɖ-BzkYiz^x\/\]ve dnm qy�Ŋ+(<oyu<jb|-nTꪲ뮻,0L>0 ES5%|%g0,#c+xRH\~*Qi (*p' Ζ/yHA#=|',^rG0"NLVJJIz*g^^Gpz'셻mpA�~&Yc13 Rp|fF#Pu7Jx)!̸*" 8<dgq"VL'馛p (ˁw*Up AtAREB%rw(t)T/Ldˤ-X +ֿVbګ嫯р-P=|xy~l\7?j!"ϫ[¶ttHi]9:`�q] dUGJ8yaA@M8nUH| DK.Y~;N w$^¹Ĝ86b8˙lb9 d$xr@�X1YĈ?p9XMd"4!#' "ͩ[I#":礜:=>Y$贞| M R[S\I/my393foɜ 5ly?^rqu׼f=vw$GpD�IbƠ6&(? 8'+J x5Ijnr.65L2$AhmN>/'P6GrAς%x6Cx 1{tE'#9Nj}EraSms<p"<Plc#BDy~mp^ bH"0Zk:#kv{o]n6; ďlM0Zv6goVuzBnw)b\@˝wHAB [n01d0!J4ƂF6"K-U6\f$"%٤), lЎ9b`,e ̝scǎ $EGŢY1ڊX1Ahĭ座C`ʆ7}u;#Ptw8Dd쑛5J=s0cBMNGFg ŹP#,ڂ֜m%t0Lq8shHyqE^;G8d'kc[S:R{>1B>1>[dDq5v^7N{_SnnI&D:9_ۯž yK4L'98yGgcQ]~bg;p  s0]</]}͠  Awء,ف'GpP/%y򗿈eǑ>.ȢBx@I3drl߀D*sZ$6l &B~YJ S=/Ȼ!#j$!CtIY-#6=\$HTi ;K"crH N}5'Xg򛾶a18gBIO݉�*3/l 6?v68K3G̸[wn -HkfZvo~/fOMP`{!#8#YLn撱nc'm댃=9EB�.Ym- uq¾! &9˼1jk#bO7=)i?/xGZv5xp^{j=w%$y lb3K<0Y>^sG(NYG(C(? 4?p`�p2@ x}Iz#VXaY^-xȉPYt- F)܃.G3τjYϝN{'fB n,Ҳz,{Y0b閄Q?\YPk5&:dBv )POG@Go~bB!j L9_l1>+`p8R)đ&1*fI.(=9BFrar1lrԛ翚Uo-ܷw:'(r䑢 8@" >W 'CDo#Pɉ~'?8e0&F_f|d~[ ]#^!FVd9:MRaB"Ȋr{)PM}D}#ЮBKd{:G` 8@s"H sC�}qlj;s3b| HHW9O{EA$#a,!%tG3<X+oW (?S `wm|P3`: @2hР3KT9 b7ܰL `;4WG(012GxCњˊ+l9 Tz*:C~ 6lc؜}9>[Q!2}gN<)@B6;?넜\jQqnM [,{OvB d])$uGbd#2ISv߯;̻js8#~Yf ҦX6>&mRGtn%iϷcóYilr>NsGpV lmd6&N/>C1u,_:u-}~+evm,2-fqXM]2$^n}ϊ׸3s76˩t 7,g;}3WILGqa}z8Dglc:s3x.=9#'l=ƹ_aEXC; |>w}92)=Z`{gs1eh[Xo-tȁI^ UP[| M1!r+: >>;3<=P0bґA",R BnuL L3&4 ,!5Y9T]c{yGHr_s4"+T^p2;nsmhM2'|2̰3,(A%ކ2G2d}5g1(uF΂" ϧ[63 I*5 !-Km)ӓ#D�rH!�8#m2?<$G�NsL고;"7?sȰ&9\Xncdr>ًΗ"cD6Vl3FɄ^&U<ysy$]Ԃ)n;e@p"ȁ"ؿ6(i_R&(߻\K. x/~q}:d6EVU�:,r"mVy}�" yf@e?5UG$<80'tG  0G=zFaCm xa,7)9`]]9Pxty$TTW]U&NIMdDvEԾ-+x#t/c'~1"ʷ[!}qEEn+~5bp ;x͡J߮m!|8&j<22I2g> vO�x˓rH,p d\X:Cx %Uy C,қnl^L<\1E2KB�YN4d s[8p2[#Dgd_}}wnqL=urwӇWTK|}mullىZ|[c?aSQfяL~lA0&[u[L!'<GpGhtW@ iL ٚ8GdBEFnAab屿,,I^c_z.cXuU17ȳ˷:!׽9+9@և}F/I\Œ;Gg$0T;ozn?:}%=/_غ_Xl2I$#8E ;SW?2 $E7,i]vl |F=X0�@iCbr,Dd0O2!38^8xab+i(zeA$Q6C /;t<V`H`83ZLpmAH9قϞnQ�s3:groσ-$0x<L<`㩵@r={@eFCӭK1)4kf`y5e)TޕjJ |mAaEcz/~oM=`To?b>ٶ&[fIn :9[:([8o}~pm=-ՔPldTMdJ͕^y!ݒ�rE"lW^#8� 9? #PDǘ.}=7}9&rD�q2YwXgl˸oc^&x\g kcYxIW7&g cM:zZcN[&sO#`῭:3ma^٤pjh)Yk-Ѿ@tޠp@ 9hٯBd--{SNzQކ@b8 #D}裎Q~ sepBRco h2w8G@EL^eB�݆9Zn#tE1#7<+KlGw-i&?%mb:!%A/dsh3 v}9YL&r"#+`Z{rGP` #t^XdUDV^@m/ `_@W//#{j,2lB[-!<b9sY&&$LsϬ&rIrAby$mLbI-y$) brv,lg.-/!M9vrN "5*u]o&oq RN73Y$v$\p<rHo~u:4P?7G\aE%xH!bD}y}'mB=~: Q/|?fvbjb;x>!o}y}|m=Nnɭ]mmic}78gll=cmeK=D@?Ocv,uvul3(Ǔ#8#8݀�'cE.{:(&S'#'Nxen%M^בc8^]&3<,#n<^7ٗz1׶&^>x QcE&$ ˿I6ybv)Ǔ#>|o$Yr5NÂrj%WXnzx_غl7}L_XB/#"viO: ψn7{ak.~O 3F!s?=9#t?Nمp6IkjA AL_*pBxiDrc 3O%Ǹ蜞:�pyx͹|=Y{γ`ϯ "r ;D G\eCA%5|oO}* 8۠rLblg;vj=zgOd`LbH6g ?MЙ`Ym%N녲EdnJZy5J$S$ٺ)Me9e{rKO<59#] 8dw3##d9\ēfƘ87ۺwӲNwk)ƨ:u]Ɵfx`9G;64+rƓ6;0>O#%a,rz 'm"HYg-Sc챇tOryjW_%@sCQH@r(JS&T&Yzib Q|BtHtDI Y D7&L'd%‘œ+(>2$8wlE ԸžGD'7wv ,,Lh_ٓC%}-ܢv% IsR<EuEudG,o<Vp;\bqzR&1Ĝ>M&? nk6<7ܗVXA6t@ }z?%dl!"_}^`RH[Zh!<xpp. VzԲ@/l?z& �$6۸fqrQr|r^rn6 6[͎ۊ~N%_fYev֏Y8*;#8@@as:-pR#Cd?,іgR[ Á""2fguXurmo^U=snd>@SGGh7ݭmLc}7֗Xn}Got^߰>&/IJ=vyyeȐ/e?mH}SGpz's2hȥvi^H4ƾ+ؠ`1%dQ�@F>9 "2O΄4 <6:OEȨ>Bˢ"Z&}\}2sqv>5{u@C%92a[Pj&GIN^maE N,bNO8aP}}pHlI.|o0d68Sn{E~O#P.;>x|#8@c 8dcю#0%XƯ6ֵl<6/HvaSzw1i<e,icP83sLԟcG6?^{'l/޽t5U $D'3\&;aSc"/r㍍G%e9yPO8oףG }?_p2d7b`]Ob]"%st9\st-zjEgd:!Cf`t#j9R7?\ r"/P&*m21t;r#9$MVuM|K7|󺍣/5rȯrvxj&r[n[Lp rGl)m*Y7<K)o 7l]t@/"XRgWY#41c{`޿/CB i$ .` +ϥ9$o-[K@%Fj:xm�zq /H[ޡ>۫!8v[$|7u ˭"\O#8#8@ȷWAn69_ (/Voq\7uI[7yںȾWMg<K/D.k@jȓ#8}@t1oEgضuur9DZ*>#o\a��@�IDATE>}o*=ȱNJ\y\smHvITGܪ+z#8݄Av݊zy"?qyRu]Qa#L�GFp+#C^Zd 3G<ȏ~$ӢDE9%&cl׀u@E^ٸ"Gp*0DUM#t &"&lСJeG( PvNVΫ^wc~Oxx  9YceD^y1hֿ(xk!sD~[HQ^!CjAB#}ᨴ#E:tB]w>\d_#8YPAyq~XԑPd?B/qq[?ofUpvxyI1=DओN:J}ݚ dj{o @t!j˻\ d/*3CC6a2<T! iL qdr| x> 3Q$Iak#8#8#mC5ƈx2i<<cVDGpNwan?Oܷ< 78@#/}Um(*UIE;,GzH=pB!Gl䏷Z6TcQw5(Wi48rɰa"O>)w=9#0<Ymc!dK.:#8#8F@} C0̓#88pmq}pGh̤ء er,1>$Ht<eGॗD~|ȩ"ؗsIyW)y2g;ɏY?^3DN?|"{Yv^#8M wQeZwZsͲuEw)%�^h;0DU R8M?r :4U Pֺ`馫ro5c9䓕!k1q:dM6!W[mp|?"7餓.Gcƌ CB9b9S9:X͡F11�3b6Q暫Uybe9$,77(lV2bH^Q$mrv6r[8ߓ#8#8#8@:"aq4HD>XDU!!0}wx8#j`CDN<lt]D׃5N;#o|moN9/rwzW^)F~[@/ 1ȩqR Vk2bB+ I40X&,8hx_D;@`HG{rGpGpz'rPO#8@@!7g 'l{k\?P~@q>&Ç<2Kﵵ-+8d+P3g"W_]v<Q&Yt2vۉL1EGpr@@9{DnL�6".r"kݿ1zS58:C|Yg@`hCiȑ#|mӋ/(.l#}! UH,a9cg CR 70<<S01!ek!!dys d7 lB.BH:VLas+52^ꫲ=رn¸uNj$?ʑ[Yźt#8#8#8M"p"GQ&Zd& 4C /?\cD޻<ӓ#8#P ftD:l{Aۖzlj6Gpz{i2F"~㍢^iᥗ%2OO#PLfFLeÍu+G -fͽVEP,󭦟ՠĞGh kQ6Zo"#8#8@hE!E8#0. Gp0vG !U ?y-vջ`_p"'P&w_Tdzͭl.N:i 6lX+/egD`ID٦]&c"SX8@+6e>47&FsN \;01 ԸuQ{5>4 4͠�ɔ%^p"t1TSY~_kH!7|s|e]5ld 6P>gCAw&VMDR$J )$B )Q'$!)S2"I%~ "$cg,TB۾{{Ϲ}k}>g>uP$E"|7 ,~ &( 7C{ݺuA\MOU<2+ǥv8UNƉ8$L`;c%QB8dx9XW\JE[E@D@D@D@D@ʊ�Qt�{nY5@[Éyc7.; ֒SE@D@2G|V~F>)ٲeέE@D@ Z\ Zd倯x*" 1 0R'? F:vm?c sX'j" 9D|_f|CWQE@D@D@D@D lH2`UD /,] ?@/!Ȓ?):LX=E  <|`뭣Uϲ oիgcK:_K7;3ubBJ" "P*48< ݦh˦y%wL7_/�\~kqo|k]vY$𽤁SR(h8h 7-S~˼EO(q}{)$PNp:# l2'IqO>M>,iK" D˼6ߣ86mn*M=o~&\OGqx=3ed yz΋.)2MX[BNJ@ -j+ ZW^ \x!p !>?";W" "! 8T?`=8`_'}`K@C79~+G2W&O9$oUE P|=WthfܒPKM[{ 7XWtRcU" % ,t009 "" " " " 9@@B9pTD2%f bPVV'(SB%tg|J?SKW?w٥t#@:kQo�R%꒭%ŋx*mW_ sm.`ps%H�,s&|bc E )Txw�/#<{],jժO>9s&f͚%ab)%^ٰaC A&Ɣ5ה$8k"S0p@C8͛7w":廡Rr(+t |CR$W^_d5*$QT d <8+zH7`9<w;˴9/GRNaH."u6΋.t;%CD@D@D@D@�'Nf�IDK1ŻqL31$" "  oAs= RD@D ' H2'/B[�D0jk); Pp"szR@x!oad~��quS{TD Tk'!l.*@z H2<@X ;ݕD@D@D$Y:,IQ;,Z)2�w \u/qy�7S�$OP&&~G(L!T^7ηjwDSf}T@r >9s|{ɓaBd�ŵ頃epeᩧcVKjS $bv?گzVM>ρ {ig3(dh(LrP>%K`ݺu)vuWMᄏwfr)_vە"C&3pd_xZwߨbv$L ##ߋ[OHˢD@D@D@D@DXQdËE+S$P?x9} {  # @^.^< `q~YrA,: j¡ʊ@ H2s'?Q9{/~-J&%ꫀ٨8ȿ,,:t8ktz ,0Dv(+G p`Fu$" " " " Q# !Ȩ]QGD.sdiIxdk:S*R-$UsAמK&�C~ZܭSB3fb|!t9t|8=b("8+Q#`Boy%n'\~{ѰaCL1c;.1u\T*[,gmm4Q樂:k,' ywE )Ia8@פWc+ &GNDAO?@$,`/6ޝw޹8$"{eZ(e me_])LE͗/_G/eVL*R@$&SYʾI##ˣD@D@D@D@5'5di!sXl_{/�T޽;@R%C3x> �jԈy6 9RN3ͨQʕ�;�ZE 0 wocF)~^wFf"zf^ʾл7@Fg4q%(Ӌ/ T* R9DwU+Q-D@D@ʗ@hL2EIXѯ _(i$J'@!C=zvyEYPoq"3,(�A8it`Ьб#pzKLP{@,Y<LT eO6^}U5m뭷@v s=ի6xtB$IKwq$n kMwq̙P'MQFvN0cAσ쳏¹iѢE0d0=s馛/'YL Or6lJ$@CNn[6c00dX($y%vYPl2b I >OD@D@D@D@D ](Fg�P\])38F~-jOts̜WD�cQr0`X x\4jZ@d9f) }lqڨD#{ӈ530鈮]rC3L^]U 0E9V-㵧5C&NdY9D@D@D@D@ʞ ˞("wVv_'ND@r�GqLg@- <pdכBG3ބ �nr*kN;9HA֯_N3@�'AZG)d!ի'^{ ^ݷ~AࠃYV)S}`|gc /+WβROqvm7WL@Bw7͛i,�d' 9<\Vj- |'q\PѸqc7O '`79sg߉imiv(0d YMaZN� W}x P'mɬ�esE/%&)iZB} ,Ǜ@4 ̘H=fL=SNz `|.ۯJ"f†n�Р D@D@r sz,m.?-<tݴ@C˩�::3M7R^y}U6mڴ2†y@@UGÌ('oom%Эc$" " " " Q" !(]MED (YV:rR" " "�IB>T>]r͚Tht7}:K2j͗..:�`,U6{E!Hŋ~nYKN< ByvtduܭJ."!s}Dz'�^il�x1`�| '|2:ԭ[7Aښqm8-\ڵt4mFQ?lƷ0йsg{9[ourj~6l&^ y1d␟| z-<C_nM-aqH~�YFT)1pK ZccGx]O0OFxtadX,)ux}x6~֑@GW/?iu6`v^}5~pB |Y %I}1}'Fb‡B\ID@D 7Tȍbw~$9sNt%5h7:}3Iԏ(3>x6f\G?01 aF_/ԩcg,!p 0o(^YR,CD@D@D@D@B@BiLD@"DvPTr% !Ȓ_?6ԯ-˕K_h6@J l7 U ;EvW5j8 AvaWX;X``0qc epZbJ q〻25vR(voGf0�<$.eEwTNBE\zAaSO=6F۶m(dG{{R:(ΩCNߚ'nPl|r_S+*ճ�(F@)@t ߎSYڲ0 σeQH߃9 hSB@|-oX W+O*UA6ԛO)d! eURD@D { O夓Z+`.:Q^h*Y,D>d,*hGkLX0'SgP"8�#~g75iBqxKO6 e1w`~xXl`@PPE@r�8P+Q(d""柊Zґca'#2-UYo.Y}?F"@4bpe�LCoxׯ%Kx-Thӹ?03KL" Iئ[)|w�R=4h1Cػ{Y^vMBYx]+R-d?ݴrJ<&B=w-ZSNnqBʈ@ڵ=C~( "{9,]U:l`{`wvŸ("PBf*aIN?6Le}S7d y0o8X5j_U\%p�EKA p�Yڴ7. #p�'jlPa{|N|<v&" I@BI?= 5'P)`wݻ|(�U)�+F dccP ˡ19wڷo_LZ}v�#CUGЉFGJ" " " " "ʕT=D@EB+7#" " > A~'a)-!H'd͚)M.m}_xWSNKRɼ3R$ o3}[Jں^}/ 9*k$/*s�c�O? ԭ \z)Чv`UcξU{93pעjժetv&U9sfir&SOuf|YL6#FX@w}MRvQ8nݺP(@Y9xVR%umР6e@ȴ$ q~p; pQ=Vd �"K2nq3i�]  7wl&sb,};t�<8(_{3Hu ЯPJk@{EVh7ccUYm{oQ:#%@{ .�>8tߘBAZv-zz:+9n5;IlYaPE@"@ओg&wh " " " "  u#@a &ēJJ``&| Bh/mVt6 vgrQ_�yRʕ}}}޽oCab�<?8}J˔6[ڵ6mH>Y.(.W_?o^.eIKG` kSߦ +8Qn ]vԩ۾56RJgh {6oM3@$~a'*n:'I1HB"x@t Ph"2$}UؿD/e�oxEl3S2<QX2=6@0q=9dVD@D@D'`8dX-.M}X_Ф 0t(еt" "Pw \qp-Q~Գ΂P<J " $ !4i*L83i0dHY$@gAS%X5[ ȑ#;66خ&NL Zv" Q&P?fVD@D@D@D  H2/,"6?�jED@D@D %^tv6 b> ph]B y^E'}u`r 3* 'O,yB{ �.h =Y3O "^xl}-#Yh75ԧ8 |f98ˬCg E9Oqm2Xtw0lL(&Lu]:u lٲH6[nf͚)\?MYO?-$9qDa0d ٨Q#0O%EMX CR$‘E[UtU4ߋk0dQH er] Yw-" " "-}{jεo?8G d~K/\A1s1UR(%3 hqu*#Η#Lz|H Dcԙo"r/Lh_mؐ�`)j;b.@v5oW^1c`=,~'$:t4+<#yU)CzQfh�TeHd$/*%"PBK)j 08$NM\9ƈ$L(0%OF.*EoƎߛ_Ǥ s4n LcE[w f~崘?jL _ :pܹz)py`;^4%NǕ 8Ѹ>LB?k-D;1r Cf^ժUCǎ0$z/Hoޕ*U{puOiftfc#SL[n0d I*TGS4`[7]’^ʟ(,s^ŋ㜓MnhST,ebPx)$" " "~2|k egU4Ə9çSID@D@b` ?2`#u9a!:RE@D@2IH` Gy&5̍:=8p!@zQ^RԸ'aEŎFBm۶g|JyC`rgOil\*Xv\~UT"Oc|cq|#WX ̋ˬJ$IMID@D@A|֕JH`j`-JxpF' A&X]yj'{k6Ŭhåvi'xg.R^ hwZ �U,wG֭9s9 z~Yg_5ǹqꩧF(RpQ W!ELzﷲEС:w[m MM,w ڵҢ>␜꫸EjժUp,!|WJ" "PnدJ1@Pd~J૯>�̉tKZ՟<خG(BD@D@Jo}3�tIkʬp(qsm3$" " 1 fb½{zys|5nAtb " " i& !4͖M`T㲥dSPD@'@1cC}C@ǟm!bDN @cO@.ӟ|IfzW]E@D@D@D $kN@B3" " Rjh㑯Bm"!$n0:,'0{o75�<Ul)I2/o<jW/C 7�Hk'? :(L. (}`R^x!Nt~;jԨQtTV RY!vuW\dj 5uuѣ6?L8sЩVZK' ^S^sNA ,XD")oGUn C`\D VL !q@(r ("I;Rgvn; SPsSQE@D@ʋu~-U 78f1 0l0zgH` a.2qV)" "]gFN'ǍrIX_vwT!"řWe;0�s�.ou)3)$ ̎GID I`ȠAE&M"&Цf͚II:o.8Q?ЛuRE@D8g ̜鋼։@.xc`\**" #tT b AYSrvr%~Mϗ^=WvЮ0}:P^#K\Jl6R~0-Lx 8|p뭾I~QE }xOfՕW5([oe=O?a8餓J*|ͬ* Svj׮s SzDLs=}E˖-($!֭[vә2N`#do�:B΢|QS I3=STwqG QED@B`�N~ C˗[ ߫u)H?1DeV#п0wy$1N"^ 0W�] `5T?h Q@e\�qąKWNj@<G'n 6苩Q_\uh_aQ-L@B x5ࠃ"e YQ8=r�#~:̘ 2$XhUhhN AFd4j!"Pz+v(}>AD@D@k= AVhhn(5*'@gciMD) opNN;- "%M`v’@}5飴cT t싻^tp)OjOG^eA￁aÀѣ_;řyW]umւδwF4FjSJuTRZ3NsjS6m VOa0`�tB6jԨgҡN`{t*?XHBO{_ex⽱)s "wygl&cDN$6 ER9)x?5`~u|?3Ӳ@n&vE><ەQ~{_7?@͡$" " q з}8/.LaI@~�h@<U)('O[GS+O?}:CɞB$",CaC`TLgKz UMTU<tǡFʪ8Чt)P@nxc ATE@I@B餩D@D@H`ġL[lQңs8 A&wfV){ pW;xZ\B/.y:2r<D_qc`*$&@q]aBUw 2/Zݻwl79.S,J6lj? R u1fNkL_Ɣ)S K? BRr<!@VZ)\e,XDR]w݅ :f(:CB+6tpVZ�EkdP2,iwN82<8fN[2[Բ?_a+αKʿ@*AE8JB쳁A/D" " YI`[o%?KbP" "$-BmxA[vNI<f%7%f8hxIRlcΜ9搓94@߾4E"  �@.[^K" " " " "*بڵXrYD@OoڵӟrH�@uؙN:|;v!j9˿'L�ut$mD(֭r3'`+GNڠP0e<?pwqi]rƛq~_3jP{"^J#\ׅ J2z7-5h꣎:M{70yd<c9r$ً E!9hlIZΫLr@*U`7K`Xn*z CrNFEjYD@�l ~&O˖ቢ+`om56XqsJ`=7-d@~U_ۘ7ht6c+ N xQ3. c�ŅGugF>Sh3dдi 2!" " H~a&M .�'̖QxsmVZH*d%󁣏ڵ&N,$WvСCqW*Rjrrv0 \w:sb" %&@N/8eOE@D@D@D@D 6XBīE@r� 8 ⊀aN8 B,Y^5+? Ɉ3*?x Z/J>#< SPN%Ƿ;3RTeD ;oz:8,}n>zhPN)j[$ʕ+3Siٲe4+Z6M7d()Sp-zرw߲͌)\?ⳁ8'|I&fX@$!-2E@D@JA;Ob *9Z̘ц @L $,5`ӒB`8X6 7T@fR9\F�>X&0j/u�}mNID@D@`{ن@ind#![{6!V)'0BՔth�ۡCN;' NY`+dTh( ~־=LOVFtݻwwQ1/b`d<m38'٪b" "7 <pI w" " " " "vmO2%@!H:r(@lQrʿ|(Yj՛5|s A&sW%$?z�/SRP䧟~o/!]t{^xN`u# @ASFʧ֭= O|H 6tl*/8]}ɓ`2N򨣎{oF@nfZ"veӜ‰"9( LӦMs"UݺuC"&eH?Br_z@$}P| U&@͚9h_Pogy0q=D@D@D L/}8<M6u/h9? }=\w?qK.'ZD@D yl al8$S{� (L'?D{ Q˴&ⁿZiN{ 4h5jTNt2ЦM}щvvHHRnSm.p#Hף>"Zl7ߘ]8cpثt3 ڵ3#y 2}1tP;9r (R|fjrY"bьv1cd|ɞ@ϤdIi(_ )<JR]D@D@D@D@�sK"mT^gyƢnj3" %$@3JH#:_2by>&0ǟ|yju^dbjϦ9fo5 �/XBLK,JhgNX-]ԉ` fK3цAwn ={L!vX0ؽOTWO}O-fIO+{ ￿k{ϔh%YT A<}2l0>+ G*OeV(.b̝;_}\lN>dT^;vă>˗g-)}^.1e8p3i0, M7ԉ<[}NE駟g:C94ժU m۶5&~'f͚~$cJs ZI|k\ɦ+D@ʰXе+py04G^vw{\�z(}>}|]w7Yg�(+~^:@ [f[O=S";8{8U6 LZ)861$n)Xo39s`mOXG)fVƻKt" "<rW>G(K`=g˚5qMl72Ql멧ʘN&ʬ<E@O\.ر~i eWWO5Ѐp$>d . Ve|ݺum`>$%%S:RXɦ{wqvdd;߰h<vmIT_EMz|>}:.Ro߾o%;B3X3+8T� O[0L4iRxe@b ̜9~h(-IϤl*GY0<3#}u>HFO&hfk\~&Q>"'֯hyRaUSD@D@�ǯ%gC|!ԞMU=)\Dm��@�IDATbq9M4rx_Dj{` &Ogn]?ϛt1^RFMBnFp-Jf;PZ[Anֈ@kiZP.hת|j@ LuG۷/^{5S\P3z[JyL9>hERy*S{T(Hr#_6mpgyp1?܉{v>RK_~(V3ՓMQJ|cHyRl6͟מ` sժU3QC[n/ot.BydڕRWJ8$_rƳn3tϻ*c�{_A oԨۈ�'ނXD�>'~}Ğ:Ա;?2 8}=gjX&ޔd*oi Px8NiSsg`޼ YؤQB:LD@2Hࠃ)Sɨs�3u,ۍtn0XW;;{'"C$C+Ezk 0í#G&Nrt # /z�x/k)32bMCu4H`�#=(I'F=ݻH"o&{ӝe#;+M7ML4֭ۏBc yqOCBj@*S>h؏#YLʲ x lPN@ "/cĈ Fee4 �$" $,1'" " P,T}%ח?ʧ"lRHɺ\IY͙GRj&P٢V^ AѴ;$QYpN,aR܁6gq5jT։,"; htڧ1_GzDAtl3ߦJHvGq ^>n8x>%w/I"<[l˺ک?ut PϚ4sq'q5~իg/#0[O>=ˉ{wQϗe SHSM}݇ٳg;{<K>|87n >|Qtmwܽ9žy> ndٚoY^L2(o+"[JGꝰ͙/+دJ-s}/I1a�vE 66{w Y/@iL�:ϚBYxtLG@Y`L)kJbh?B1>O;׷bNHcS,vGP,.8h6CM*ۢH vr!`~N9jX�Ar%ŲHg|X12HJ" yOBC� ŶZ`y!#UfT% ժU3g,/٘H-/KN}4-USI4r7#`g'8Ts4qb„ hbȑYmmʼZ1~V  ~<P1MSTuJH~w%Ńdd ip,<̂Rgk) HG,%H� nMR9Jd�!m8:/3/R9@jϦ5 $yUW'���Y)NXd b 'Snݤ*_G*dvNa['2/;@QΉO<iDT|# @.0q.`D`-@{SN.7xHQ3}ps, v"h>3 cO'iӶ_b.b'Ν;R<L\) 3QdeJ_ڶm[hw~'X`syp$_(X{`wws.bƬe+T2-.U ڙ<Qz$""h%;7`qWx_�rM7; ; pLnJ" " Lz�?8-l{ԬY}.@*ŌN`o==GTʣ}3OӼ8M x5okG]d <MD@r�}  y曁^ /v5jgl_Z5bGulARE 2gQ`Q*l7-*5+zPLe+;!8o?@ӦM, lt2B#"2z# bƌ9Sqf'H~GtV[ O/'@4,G8{)`3{N; ]t[u-LtРA5kn6p`aSes2SO=U0P;B:L4keh!ڷoϬ|n}m:z;/vΝ"N~hҤ3V2^{5|`de7Tx≅26Q&Fdbd # o‰0)I &Fds=<`MS$m}nrI΁G y¼`O<;{؈@Ϟ= 7H<§7[ ϗ> sB$ϤKO? N˖-A}QkD X^|\**" " " " >@2^ $>ϳ8:}مkrXmXm#F h0Lu?i77K~\۸k׮NT7d \N#C֑*(" " L`j:gs 3W6 ARw0 g_ll[8SڴtL>llfRŋ]͹L g[t nnرXv-طs)h̨y/hG<5` X:L^1I&>&n?q衇&eGG{LEX¶NE9w~ D-0̌ ^ ,:"}>t^o뜩.6|&Ftԩog}f"7K>w?Mocs{0n+\;6l3}n{~W_}5ׯj) y!T-W6l{6%O&޽}㍛RaiLc9C )ia>ť+W:_7|rK?~3 %L#XO[zmWx QԻ~NV*$I{e>K3Jܰ8$"w5O+𵣿շDpB fqkg!<3񨽨^o>^A+/M7f͚9_ P8;|+[dĻ[PnE@CmG{̺U Š=BT .;-Zy"%+4`4h�猱v|FD@M>ꂬ1o\Qw}׍kӡC'O?B mmEK`H L)|h0njQI>Kԗ@@F X.8]~Uͺy/,=u,^uϚ:4٨Q;AMPD/^v" "2tI[8)e<V-)7ʛ|}a7<ex6xi<|lγqg'nߙ3g\ony&pӳn(E,rw]w9Zn1-_L }{ 4zց^ի=ths&ggV<s~z꩞B, cUzftg=�r╯I%o\~Uyv <3S}m�ý;<g"4l3q9 <<3," 5j/io喝4p@WNCD nnunZO_oīV:j^vu ~b=x}u23^z-WDݻ< 0z&辛KڞI,H˖-=pe2omu<>X3>rE>} B{<{x7JUN(?|8+," "dztR]xdڨ<a6`69y7p;'BLoւu`yl0ǂZO6jvtA&Z4=C"]EUNN N{吡5W'\-3;ꛮi=φ2]կUO .v_[ ,=4Ҙ;ɓ!{^7o^ݴ!XgƪZpDz-bS2GoA`_>:˭sѭݏ Fz$&)H-r8 8K.ꫯܺd,g=tv W\qQR#`_&x^.믩E r9gJ$`r#uX)sQ!`8RqwӧgzA˗/wcK| 3xca~whx=o`u޴i<Xerאф\^z饂r$W+9;-G{.sLX{&F{&ٳq|ˏ+cy`|n|x-an]2;o;3lwq&kD#j`DZqY[^NnSHt}Ëo"=qtnAJ*}L3s6wot;tQG ^ tя̂ xla\!%XfJw9{0_ϻR;$ڇymo͞ ~=syƳgg>rzTyg丹gͩw9njc݋{뭷궳Li Dߚ ~|/l5h# yvܑGf<oTK^db>Ku'k}Yw <d!J,cĂ>+ypdm7bi=>>MTD_u9Z" yFӗx>*ٝ4rR) ♰X!E(șp\`v I Q"_`h>} ϙ3MC&:#\|H#91Y9'Ab98к rSzuϢ ^BLNk!'y7Ǯ2;h@}9#MSLqj}:(2n0hb0 UЀ>.Lt^pnk"E <`SÉ\6o2;;X3; QG}笠gR$aQlY[Fx⿉~S<"<":|hL*H<K i`Eɂ+i-RG"KhY~.Ze!罄 ˇ*" oUrN:}tzR2mdڀڨa1AbSXwe k2d4.j-SD d`9M#|oqSZMm@+|(o|}*TT{6Rlm&ߎ|k+9GGqE컡3رcdXNaA&@í Y1A Aab< D}A?b]) $yB6S'`ffY�Tԏ"Lw<s*fwhM!5>WngP2DcKdMG{i ~2carj9>1#}g|{%E"}L$}T."]v%8g2jweA^Xd- 3> cs|lͼmtF@$jn BѾ M5 #3%SศOx Tc'1vwv>w[oA.'ۋu-XպukA/ #:3QH߇c}q¾'87OoMA " %$`:&$y?N/Z5 1E@,.:LD@�u[ ?ܽ_zl4nܸ``;`$-߅BE=G<{0` ?Ǜ6<(s;2R)Yzs" "� -ȶƏ,P[c?e;1g&Yۍxib_)KiA@PcZ^ /pay UkO�'lb 0^z9l f�>ȘtKfQOxa*ڤIX X7`Q50|^>`ѰAQ)xn&XN:;?P #G?^z<"qGEǎa� a2lft h {cEZteLT>I)?f=cuD v2lyO>}N&N^{ fDN; &PڵkaÆK[oD /nyw%6m~cq8Unnn[5 bsowܹjI~XX$>a22&o%x..xuy u V`]?~;Eְva y4uZ\!P"} :ԟU˕" " " " "�̙s<֭K*cijs={o2qJמf=,̡3jk&7U\Sp.E@C`FJ" " " Y@?hJ Ȃ”C VX6Ϛ6 A.j$gŶ7·cK|:s<ʕvm]u-�n?S~7|s v3 ,4}Bs΅ `ĉ8# O/ a!M{=, ,P %"@'�Ќ`DJwHT*aNYڵ})D L`vg}^eϓ cҎx„ 0ø>lO2ca4>w.RXtg#O<А領GժU3SOŚ5k`0s$WyW mv6}u^C;6ܗ&w?O!Q h1Q?+vqGw}0VKÜx8Ld&`Z0͘1zku1!EwOL3u˗Uh~G)9a¢ X6t~]}�_A85ka&փ/=`DWY{eO?ӝ\fO=\5" "ll_am`={kZ�m;f;' xwq~S(z}8TCO? |!߿yYw['.k}eHR{@hdazGY2hл7]%q<P6m`6 $_ ߛn$f)*(C+@Q,J$ 6lx]J)367Ly(,>*T�ʽ+$Q38sė@3 6 \p[.E;d:t�R9hH,>Z$'?.K4a+CC`ӈ)^m"/_쏃LK/CUnm.31;/_^m`<6D I4ȋ/,_~Y }c4X幵pMQmvm?+]a~{q3)Tpϥt=XnPnlرc󰨩UGD ' k`Jߠ?'+B%5k|G@8ON Q2mEۨ<hD!m4NsxԩN>�@<.QmGӲ@4 P2+TD@D@D G"ϒI؟L1yMAA2Xl@ds3}{XJ"PiDEmQT2X̋K2/?|.;-  ‰}Lk9>iF3u4_hd;fc }O2ꫯ"pdAB:JnB;gf?1edyk9prfs3<ɓ'o߾83ЪU+t p )GQ}٧ Dt^Ȧ B?;_nE50b8p (>R%Ls28ˍ%s-Q}KxH:^Nn:chN$Nno}0$}/(9R(x2qΤjSCΧ~ؙmxx:}krh." &@gv0毴~2 h1 >(Yt2h%+ԉXޡAZ=XԱs_㜅߆E9bCr5s"|V3W\\|omzX1S}e㈉PD@D 2ص0M`<nٸ�}kUT)ă-[L2؀*@ 6Na_afaiHjh pt:Q1ke4#2S5 TߦgDuh$Jth=㜙*0#_N؛;ug88|ިX/FcDt/i)\tnvrqSZ�Yb&B.]ܜ'ef)b4Q&06ŤdGy%r^{,H ou_7n^e:R 3,dY^7̝.'(O>(h(4n!#_idU4iDIr�p A\," " " "֭(irSKP3 ASO}&MБtط/%j;P sz" " 'A&A<48NJXjڳ%U*J4M-M$YP~1caۢt6<EO?v9M0AS7%c;H)*V挒$3U4{Ed/!m:9 7|M@e䏤EC�pIMv[t >+{HRPJDv}1(f]jU 2 ~0ިQLDY%CﴴxP{5wX'X ӮXԡCp̶[n&%Mq𻍕ors&1p'7Q0 =X\d'suǚ6mw{g. mڴA͚5v۹{7|il&:S.y'xٺuk'J!)S[ښu~LWgKzO> Q#x_W^ kaliy`W_e_D@ʇ�ѷL[oB={67o^" @Yqg"92QnY:Բa/vY3c.I,(YIlylil\D@ʆ�gqL &b . A/9Na ؏hl&Og_{5X(ʭ$" E l\t' S/BjmØ88xk[zowy{ֳ8l$8Ɉ )U=G4 foF'٩S'7hȼP"gfLjK.29hlx|_) pPlLl4q]dKaq4{tToH44R y"}7g:.-2Pg!I8nݺN.>>p୷� ㎋b-Nm+\wg?>#>c egСCrp8A6%Uڌ{jUn<`56*k+G,2ho'tEjղ0}tdCR6j2}S6h;_hBBѸ@dP@3hk~PJlmW: qv% jY|a%H>Haۢo lPKX<2l[өq&M! /fr%/bY&:)a8^YϡE nRdIGhѢy~Q^g##Ot& $&tF Ʋk[>l)/{JhV[m=4bwwB<|Bw<7/=ٜjDj2m5()v6oɓ';vEիW#2|O3E) ^ijSO Ri<ڵ:i{A'l˸+}h"ɾ۷w RF<x+;y?>h7չsg<h% v*f!=.ߚbNU" "PD@Xà5=0-]C{DžG.CنcLVH'R0~{ �ݻoR`�Ķ E(žTTٕoPgƞ 9n`p\}'=@E}QtNY? €1+WtvVU3Ńxc3n$צw(H&SA5M떑RӠq81JRrlu ~FmJNLF駟K.qC\G8Q?P6>܃D ; j"Tp-[Nh֬{,.QdQB,~oܸ3j'ዦ`2䱷Ӣ9P<(•|Eh38!qz?0\< ZnMrzvP4Dqjժ\(LbJ#w5-Q/O 0a=#vaT3bi8ahdBTŝ3f஻r*neD?WfVw@'phWRZI~2L"6{.ļ'L0b;w4d0+8[$$@k;%v߭/I> m0 {2mxmTAmtاaldžS~SnFMo7E@Iz\d4j%" "{@1jP!H %YP{6` 0 T &>F{':t1(k¶ES6l=XgO"(s]#:<҆A&iww⪫l�LaH11,O?܇"Ǐw"'pI/$c[=tߴ軿۟ l2w}�bief&UN&@l36.XL-eiݰaC l=٠FY:)iڴi%n @EǼ ~*U Υ%@{wC=mP9 څ߅nNEs\&M]9(?O8ѕ#VO O<|.5ya͚52e1w!s]q\t=>ꨣ '>E6m\~w9iޗc,l}[p1 pw}ѣG9 .4;R*љ(nvkWS'„?D!R 4jpLs|' m h#NOOoMZl'P:p衰VaA_"ٖ�> & m l?q’lw!k;3ul9UpCvڮmx )@QŽφň[dfP�blwt2}e;Sωt>@K" "[\@} _ha-@ǎ~G15f8~~1RL<o``<ږ͝;7N 5)p lQ۴,"G2mkW㤔n6LzU{(|6~l0γ;z {&,YAD=k`{#7]pXx(.XxγBlpгB2<ӝ]mҥg$ , g.`ݣ>8V̀3TWF렃l`3-N:2`gx+DyJ3 uk6xjAb#go=`g⣞*c=3pLL3n^=؏)(wayN)M?<OQA9?:u<IV3+VNW]d~?EI{vޮ\g/ Zw8w ?vM7uw}0+3K3r1Qg_ݳ iܹfϞYgo<<3 ۠Z!F?<=r*  dٜLgHHv=篿,ۿ^z9DjjڀɶQG=Kl_f>V>sWjƮO7^5^;:E@K`= ̄[GL2A J=j&nb7Vb/z+z^$#o_8"@5յOM@ِ]Sx\8z <3NhñpmmmhƁoi-mzL]>y^9K:ۼ&Ύv\|?|gL୚7"cIJhPd3gΐD iP"2KIRi(Dۺ;s=s~{}^뻇ֻ,sa~~B ӧڵkm36 !v5O{{癿I^ނ鹆*"@_L7ܐ3F< gPyFA  &?n od"tZD><I hEH};Drք11g ׯƎlqz9žMтQ'k~yUT)Џ7L}6�>my&֭[0|q3s`+]h~7(5&s=3Ӽ:x>mؓF6lx1͘1#~ M>?&׼y<>GlqL ? zh 䟒.Ν;{c/6cgiϔVD@D ڼ?ٷ</o>3ٷ޷iwʕY9%UD {oCM?6 g« خF�gnj 2dɬm"M~ pנ0ϗH ZM,G>|lp^M7le<*<Yz(W" "PF4۲vk*w]wA=[o5Lɔ7nf.,߯<o0ݴWq-3|E@r㖚pyFHt#`ga3.~88gqiӦ !:0{l믰<;,?sf$;/lYF͙ʋxv)8g3Mx+։ Y8b<J>wG&I2a'v>{ZfS|`F=U˦Պd>sLoM* V=vHf4tqIsH)\ܘ4 h6%`+5 ڲe~'[$k{l V{,X}5?k]W\|5|l(" ",Mfmꖖ" " E#Ȧue{l`(ʶMR<I+ M7k R$F忔m*Tmٱ(d)\Gy~\-1jT<D~iv9g̮s|а!ޏ+{CUVrjW矁N�> xEmҹwJv&pNV\ `M>+fL{RJ/[_H=ʥL%\5JoXP~1O407d|0pqw/ӧIaLر? *s#@m&e+lE(nhA2>% eA"PWf,=z|^ &kaHYWW:u*8�} D&w~_/?Uo.CLLL|91;1-ՠA&xҥKq!|xw_v 7Lȴ@xݻÄt`޸3}+lJdx?mckBYѦdc\<_1FZ5 4i⏹k.IW"D@"DmR۠w7taС/"Po<`� E_k/I$z!|u9 }79 '-thb$ f*ߍxvy." E! !ȢЊбh.ۧJP&ޭmopi͡zGժU z~qD BL482~ 76m1L%`)Lqi*d%CH#1z*ҩE@D H2 o,"@Xɓ*s" "�'L� "< A&JG$5aĨ.[oO `p_ssvL\!szxc<AXʹqŋI$MssytD )tiTtX77Пk",ӾŁ拕ne(|<aZD(ε9R` "%QK/y "ARBwVOWp8p`.&(8Tl~m372") "G6L, xruAxmkh5*|*" "P8!N eIƜ(k(D"  `sUY3_aB:%o1K.$A+eH?6/�kati,$`s{�j_ﲋ/0| 03J@ hHjwnr`_XYP8;^$D`vvf?C TLO./G殻fY1cD-4mԛ4=v,Х/s@򹐫úuT&%k׶lJ>R,s8T@sYz#l�M~Ck7&8dve4 [nQFD@D ='K[AC _orYxW6!=;{6p@ժI&"�3o<cTR{7GΝ4x�Cwk#tAiN/IϠgZC&Jt&J>?D 7!pef1b'�Vd;2!)JC駟6 ֭O q2eM&1s aÆhѢM.q@E! / fa3J`wmT ;~7ȑ#|rO ;tRnoޏB3PPW5Ռk֬i">ax>(Hɠ@K " "E1^oqcNJqM]j��@�IDATJ^lzl " "Pb^ X _3gV^-Оjܸ1ԩSb>:Ag3rM=ߟ�gh?/K3?7O8XW>k?cl"koڵ @M& "  P:̬o[!G߉l6)F�g7 �wF*T66~xr!q~l' ' NF%K~p &)bd?ؘY͚רq9H8 V>`Cd<̏s�g_9MHD@D@2aн{ HI&ZjXbE&P)H $"@UtSsTߨZ~SqO#l4b8x㍓b]@,oԭ zv;V|*.]ǚ|x hAQ?jïsk:!5*"'N^L-.a? %:-iƄ!PS"@?oTu"B,ŋc=(( 153<3Ripmy:�ds!N>XO{Ҥ&|{@&Ie+@ǎS8d>$>ׯ.2OP:YG6�PYY!.qED@"N6Яb&hd4srIQ֭}gof,r9}0g@ ̘6lOdg>&"Sn]. Jd*8x]35J. A.o]MD@!pUGNcD@D  ;L\̝$#Kn 9uZ~c/!s7H6eܹ�b#qA=zOG@ "A2ZO7 N 9}E_bxm!'}"0Z[<+_|ôO"?`]v1߬w7KYIAA9C`U&*OvZT^mժ3*iZΝ;N֋ c *U nj]J@Lpʕ+׹/zj\ oo׾{BUL*Zk/Ԯ]͛7GfРAԨQÝB@'BrdVB_ V(@,KߌSN~8'G"^#Lᔢ&L&L8svgaX?ILRhG~뭷@ڧ)2ܢE tlq{aR/꫁McF;E@D lQ)P2@ƾCG w_'T8t?kD K.E [|,JZBǥ$-" " "@biɸ%^,'tW/1݊#d j T +$Q<78XB^vql{XKC="P8ePbŅ#D Yg4rH /S@8I',$p<do߾=#<K2&&,wk*,8 #M}SI?!{~ ժUɬqGz"yq>}{BtAhda`( EAʚ�T-/49! D$/_CQUWs4 mlCmsO7!`ň7΃c=\k_'</c2($}})*ܞz*n@~Q|"m63˜9s<Aȁয়$IqYͱhԨ`6 ws<@I ЎܩS'o$,' y}wU&̄!/$,u`6\s W@j E5<slg9qGr6Ie&ox٤A"), Rcw<+" "ǟuw~D@D@D@D@D l 3(=" K` ;(!宫@"6�%8` 98�D$(phѢB+"דO` ރ )֩O"P,]6xp=DvڡjժxŜZr3S',"( ٲeKokM/L:8O<_SBzÇǽދիX=a6m ֖OR�irI&7dP,r…ꫯ0|,[ ?3 o;]Eѥnݺ0d @qH쳏ާdk\N;O'( bU, h{n!7QR$pmi.ET)W>~g}u5QL,̞}'u17X D@D@@ lBB6)uUk_̛&4b4!)6,J<-N]kG 6%@'_9;F- ,X�̚h: *@UD@@F@p{׮ـ1J@.d.]MD 6^ L!@!Ȩzk bذ6>oڻ@@ϞA9@t# KBO[R^;&(|Ldg@^~x%z}+|ZcOop;>D"Plޚ7o^_(JwB޽{6i ʕ+{˫Gy%U19q 'xSfa\Ξ=P$.^MbR,v}NDV@fd/L}1s/ iU)n0aDF}̸J�<�黎,Bm6(ҥKvϓ6sҥa֘3<+#+zJVXh>ꨣe?~' 9z ;fujv.&8L}" G`һ (xj:6{�@Gx'Ü3CݸOkK5h(ٷoS9l#p�wܑm)WzE@D@D@D@@@BQʣ@"䷰zDG7$@!Ȩv[ A&zlxLFO.�xA@HZjaѢE;$E$P/g_6<:\H4<m4:"DN:$x뭷'#ܹsS{RMrҢE \}xױj*L2]w(oyh1cйsgҥ 75k eIJF`;S{uYg{ޝ xg} tnbnvo?lcb<w9 Hu֕,AoFgܛx,R=�~`ھ 7Dq$iMN."P~V:tmzq]L2@͚5ѧO;vXԫW!ϵvNueȟBe@b&@uS衇߂{n{T4-k=A*ѫOgtV8& !ڵ:lNQ 6y�&LgZޕ_(axFEGWq#G"W^)ʞ@Rpaf@Iijr:ʜ$$@!]w E@D@D@J�'WA㥆<.?6Ltx%3iH),5"*@_d@|a(!l$p`X/My&)8^CڵS~~P(xb " I ͛Js<#!Nn ZL�O?lٲ% >@"+iӦ8Sm;0zh̙3k׮Ō30tP-ҫ#{ 61㽛O<&M$!(>Dʳ@U 0=`</ iM  > C6ڷ _~ AAD &)$n lxW>7`3&Ю#54&e^D@D IʕK<XϞ/b\<s-0H AdNs0ucNP6 Vpʴ*IO'h$Pe!6q N9h<P<]p6HD@D@D@D $܋f j L"`:4!H�+ 0nй3LP�&!(JaoPW Oa୷�NǪ,Ls\*S4qxEg-IS'P=$C"@_~'zj|g{pGv={w5;vN}" 1TP5;o=auaܹ`o*۸p%FJ㨣_㧟~q(K{'|Mabhh؟؄{G~MYV(*?"3N;u.Uzbg*;g}7W dutx&g Flx@9HB_q{ Цͩ'y0[Zꮧ3@"LDG%$0p۩ ͩm24t /SRfD&O~V-t &G@. *i" "q[lw2@_̔;tK%YVu]GBurv[ ZE7|�?-Ab%KDB -Jt~R!�z ",쑺ȍ7PtّvJ2;a^{ T i"PvmüytVIM6e]f믿0$~߿9cF;}/ Kܜ6(l|u:<sof"b 1fO�l Ѻuk ;Sjlz.VXQE@D@RE)1_0mLL{Ұ!pU&IՕuTK#S}vOr!bbOY?|?ן Z ~]T~z}Ν*'" " 'кu34,Y-0aXkkEIW+uX6SD ׊Eڵ(KM㏁<?g69u(ݻRN(:'ftYwDܸWkD`Tc͚Ato$`Zl^Xaƌm@ t6@W%l " " ")зjQC!H�۬9,z<X')@:TV;[yB'+TL sF`^|Ž"<N<6JΝqG;Hu@ŊW&ΝuaxݽͱZAD %(ڸqc) &M2&d4R }bvXbuypN {$q2cl߽'x{֬Ye9n8\[.fr>}p뮨\2Zj?hz/<)" eO}͚wV}a0_a"@׮o>LطӬ@F`޹PADpo=.B|T|eeߝիM(c~"!" " ڧȑɊƎ&HrfTW8D#F\:C_&S-ZdO&&N)]v87xK̉'p@~>mRM Uԫ Br`Bn3QpӣBW3 pf`7л>_8(?"  иr+`NWo6<+ -5tP`-ײ@VcgTemSnAY1%RD@J@}N6Fʛѿ@$ ?BD. '5Qo* GVfTѶ}2HNۯ`lй "*-sRae…2e VZkŋ{ا (-?v0Һ(`=pf#az^'`[*+@ cY#E0nb`ة 08~_2n. ,nfnڄH˵uR~Z*m#wynVϜ4hP`f O5R"`fWp4߇cMN/2"aÇC�<؜X+>j߭"nQ6qk|h#L=WEDE@D@%�uv8i~W_ ЧLh="" " !TyW<nd˗_; QCF츗Je rj'}d_,VX9:g R Kz|0A,`6B[ c%5=U}7�̜ s~E`mBzOg,sU3PE@K@Bѽʹ@fDl{&3cϱ9nBD@Ei[mo^뼹M@B}ә #F-xv^sϥly.>81;ӟTr LůǥZ~~ڏ>>Se{\s'BQ |Śrʞ8dO-7 y?#r+oM{`! \~& hNDO)xM|`X_i,0'@/ѣ=QHر#N8mfsFAD^tN,r0X;Yn|q{쳏ݳ{ " " JBǦ̪S6MJb!p /�*b7hx ଳ"Bï1lXM<Ԗ.F\uУi. " "O̵}w+ \,@)0.(9n8XG)0yrs> `6il؄evNqc?OkdSNV(9&M6=o淁A)d/KC ^dIkl鋲K+[yD ~=/ar"|{UD@D@D@D@2�h9ǟd'Q8D@D ;ɛ%@6XΦ4:T5wlj0ٷƎ=ر+٨ǿ gLH 0MD t/ qbt&@j@.YRO/c,uѹYPV-O�x"5k֔dt 4 ~c6wk1w\xN֭_~%S$@ l&;ޏ7|DŖzdp8h k5!pffmаaCkguM7dB-@q4*�}(@G'6 8Lv߶f8O "Prw* vgHg"*V<%ؗӽ;p 0з?2UyD@D@A:SL88wop-�'Udq6!@Q6|93 w ('Ri/:rD!/>S[&෮sgmrT, ζB2v."=~ڟ7M3gnTt8E1 V_-" G7y " " " CvQoH2ȶiD:p_իG2F}h.N^ʖSAʘ�|,hBPn'IBPxqࢋ�9#xb}ٞЩ?((;ڈ<:E p@_[D ޸+1qD|{?Z*:t{ ?Ci'Mn2Lp 0|<l?<rEw駣֌kFN<>Sbڵg*�" "͚̘  XXu+x%Po:s@4LLO<Rʂ�MwЧzu)Ԫ +6)|ED@D$YTb:>!Mbw2;.L|6lv@`h|΋R' @~@Cڶwg:9S7|LO0@4P1P r ʥ@Wh$~[BP(Xc@>]$/M׏ԭT2@/8D^-ZYET PLϟ\vY^Z#Gl .ȑ B6N: 5m] i&p'QFq),SuӧӋ'Pz쉷~~�fovxQ)H?+_Ir)1j(̞=L5}̙6l' ^u$mj^)�;d|'XfM+@Dƶl ,_g}е+ΰ3۬><f -K1^?n ‹T" >ȝw"]p!)~r&Aح `r-ҥ~>% ‰'W(H."LNARKGĖ\k9�t@!W_u�g{N~(*T|/oڛ>։4miV*};苰nD<FAD $_Y*1UD@D@D@D@JJMpbXamvb}" "{QFK9l' !Ho~'ӗ~|_g{^GA-^/ lckmtNT !A7G2$YJFm }/bEMAL *S!F?V1hdʕ+3K/d*?gS}wq꫌J#Q&Pԑ6lhbc]qM7y?ךyGR >\zhٲ%*Uv GyoРAOG." %%.¾7{ ۹_p<yI\%@ Xq\wS'`ժ\%|@fnzǴqŸ~ ~9Q*D@D@2�FQ`x'rbcI<֟"<Z^[+4 8C/&1j5 8M wP? |pgCbh83<ТEO,ct.V_81|pF5}ä "gc " " " " $pɛډy-�N8B " "Y3 9UE@D@D PBJsSޯf,9e pW9[\Ig^LTjcZ6 "IL\3MDA"o tRR #0}tmRDoZ-܊4icvd*;ws6ʕ+ob DիOFq^^^ODD'?@ pڵk#q"g}SNn~âE.{ǽ{6PjUozϞ=ww#NT^& LQ<˚8p6p 0ޢW!Q dIrǫuQ`<@Y`5�l_{ Xw%ir=R֭ Y)@�a"ԧzMVQd|H@4 ا@ARK#�(KTP~Μ^Fsl04 Ak36B ;c. K3dSCjƙD@r@ŊSO?X{///" " " " !`hKiGHDeʽV>E@D@�[.PO!H+� )b?h6wG-oYfm<1;9.@>4Э[4ˍYQ P8?&A>t"b{/bV(P:UPD@@/ ?s -Z_5MRpCDB`)i"PXjժ:ؤ&WbȐ!O?o1q7fƏ:(nބ-[Ĺ瞋~aر6~I`ӔUVD@2@WDywDzԭ PĪYX:Ĉ@0M|i pDŽYUƄh]D l= D};?:颶Mk^R03U#`D`]` �O<Xק'?y.Q Ϧm(dr)E@_*'!&B5n E"=tZ; ܦ Go y}W7 |?J(D#Fw/MpXg]XD@D@D@D@G378mTW6^PAD@D@D Щ2Bm(lJ&>Æ3oJF{D ze/EQ )@&#F�l_sM&Pi4o8QLK_[n͌fi' 9L(,EyzBG/BS}mlxժUDƌ?8H!a6#4lƍ+h,"N{<#=aW \r%~Ot?2J.ѼysOo߾xW_Y6yӹE@D .sX{o_$4mm<_M@Wf̙9>F{E@O#={ amd[mS+d+hsx^'pS LVJ0wnV(.yA/&*)bs,/h@~{X�d=S:K~LaG'ޚ!~/i{86<=YKfx=s@PȜ3KqXb]qqQE@D@D@D@J@N,-uppD� jԈJnOu!H'>A a`͚M+'+@YfFTmpb˜ZhQ5E )z&,Կ蠈/kQ�E_|wk"s7Gx*XGšD@r@&Mllĭ1c͛BǎN;ᤓNm U5/bq7&5J@ժUqaKO 0�/_\=a<|GlQNfm݆#G⫯T  {;`@`"6PpO? Du jX \ZaQE  /Ι u}ͦBN C}qL̇$" "9(~m[`z L)WZٛ2'J@ 9EARGG0g}0,p!~Ь ͡²M "/Umև㢋`eAz馓M@.|Z9ٱYP," " " ".[m)VCڵ@͚Qɱ)" " C@BdLSJ&K N+Iի>lt~( LӁc>۷drZ#�E?Ґ-Wy<@!FyOD@r@ڵqWcҤIXlv($wU� # b",c*/,Ni+V@TZl;رcdOuʔ)f7{G}O? 6l[o54h.]xCӱ~ͬR&" i&@9QBnjU)"ALsڄ &c K[" I0xqR `W,B'" "&@*N';[/i%jMj'(FSz uWcCs{2;IXfR%]`޽KZj<S{s,eO'OR "P.#l DR'/Kv@ qF'6:xqDϩ3@XO )" " Q"@! M>)lJBsZnrmgdߜkS~6x|٨w_fG}1)<XZtIfw5�ӔR(�E(#\rE nvOԍW[ӦMQ]AD ft)Z= Y.bTV{ꪫlMAH IR,*(dm͐ڼysa0}W1|O S7{g<H[G3<};vqWNj2fC�8Xx!`\ukX & gN'0f),г'@fd^Y7 gώ{~5^! -Ӧ;JE@r\ʒ)kc[Y߸-[nYp6 g^ye`:)dD@Bh|`'_T:@O#q%L ES} u 3g",i �H7 |ҭFt_WL !L J&@!HD9P_X TLد|I(9U޲E6+v~9lKQի><0l'$,)!駟<KqK_t{=zxuR.wgu^y6lvuW|`t lŚ5kжm['_X6t6E@V[m6{0rH|W@Y0|pO<cǎ\8�o=cy4 <8q"~.#CR`˲'O%`Cwl1lp*Nzʕٛ7\xe'5Tz 0�X17&pͰI O~`w9#D@D@K_041sbŽ" Nbٞ?c ԯ.�J}>x%'_~=61;C.v5mn9Vpp=sNUW oYʗ/,b2΅켡S SmzUVyNcjmuo¯[xvPұKEY"3q0_t irKF&QJ�;\2'4#;7/aLlNuf&:.}WGva宎\瞿0x.4}C禢F^ug.<[gK[g}ճ㭳\- nsº8nZwuu˹($Gu=מd[Ůꋌả72>fg_>¨Q+:$]CW/d1cD@D, PjU9=еE@D@D kΘ\BtsY]BXߺc=\{udbSޚ 3`lO)mmJ;v3<ْ(돌Dz%9;[ o}@Qv�'QK?]Q[:Ns$zJ(&tO(:nf^/yT.y%n_.+\ o~(+$]9UV:thDtŽ@\57bʬئA`m6]}_x}Gc{xm>D 5h[;h"O,\>YG6@}1wyR~wxʙ6.]l'ܷ5= ~o7qo+r!~Cݷ5up=}S~j(@a7eǟTt]4jT$G[֙[77mΫbB[ϚU!_Ժ<<z ">e߷ $'%_ r&id]=1:/>Ww zEWgd^綫Gcop둬_2V\$` fl#X :XFtI-c="\ +_ ە'۱W %]˜ F.);D$#Fd:EyS3O1d~bfJ 0cF[c%1͔)H# cSk;YԖ ) Ic c.إ&s}mf-\6gHWJ+HO믿Reɒ%^b Oq~6:' dUZӦfYi33ϷB8XǴi B{u]-k׮r/^e˖y&c.}}^ʸdw.bBp5(kժzyWܓ0'XweG[ۮ^bq]z[#:r8 xR[ns(8;:[`}>\wۮu}}<FADse#pEUvwAW(hS /vtۮnp4XtLůK'w6k>-RJe1vnŬ׹mn6eD K\}5{�EuD@G jUHxBQ+jߢ>9c6E^ݦ@5ZU�w\xaLn{O>:(Ⱦcyhk]FO> yf_).�BwŴ+%Zh[r%bڟŴ3)m<OŴ-9{_`OcL?} GV.�7…{vݢxd ѴiS<޽{T?)mT"P /8~xH嘡f0>K<\ű}1p~[~fW$<#pm?Ʈ|XvyNGu9qٳgs&C3!@$KtѣG{"W=z7ߜVɒ4>Uqoh{羡ΖSe}W]쾯o[wVע�Bɳ<�S}4p5@ֹGhX>R`ʕO?.3Xhkorc2+wգ~kPoip +W.i_jYE];<��@�IDAT/`X/tnfKy,_^yW~SS)gcZrׯ qnȅr)XcB+]=]zkP< " "6T jeHil0ݐL|Smn-l۹ho(WPTw?eY<A;+W\82̉iK`Bar%X˖z+S1,dRJ$Iw#B5"0UVySFGBXuFV'rȏoh"t>_yy^ŘX ?>{։iB*>qf֨-[Ss, Y0Za?`�thXWt\L=2W&M4S5k7Kܹs=c� hu]}|h<dg/^}v_F^v VNẠ˽w^aÆҤI<qk/ݸ4X_n вe.&M8 >N<Dgw}o) |GY~3gVѨos3U.;>R։M:I=uN/Zh Dց@u>bf݌`փYoTX{߲vF `WX3V-0vc&jW7:]!zփ3fljn 3d%Zwz9 6l%]u>CAD 9VI29V:JD 5Xq尽vWpqNf.;ɥ~k 3\+ݺJ!Y \g-m3;ϟc cmG^bc}N煷6]sayc==̯G=FAD 7t?sQ(& AތZ~K[Á<gq% ?ӚuxM](Cue&3r~8'QË $^-v ]&BE%lgrٗ±1I\ҔJ=|;SОļϞIЦ]lJΆb Ǵ-9{�`}xvZr9E G`�ફ`>{_P)*mFl㚋KsNuԱP<Q)w>\%X n~yϰR$"@A> arڮ馛ЫW|ndg!^`;-s>/A綝?A_ [ؿ\b߭3K۱\kŋ]ϵqm6_ >]|AAځ_h0 }QXa_KɄ}nx:_k]ي9G7ү}K]}n\DJ= wKΆf\طw4m~}[V74}uݷ5De\h? _>- \=Q<f&rn> $cYWȼ*EE'˷oDolf?xaZ#;u~=7mcm.eL3]}>q,K=dHz K+\yy``8|wFj ,}cY(@ .ú|.oU[mrjZ}}v3hdSʯ: ].6cW o~Nu#2YOd-Xv&Z%wݾpmN\~\c~\ח^ n6@`.Xr%ϕ).veKquDݔ r^ʃ=,a]m߮W23+[b+,[DeK7Wmc._ۮa/ϐ|q{Ͳ%\1\9l Ʋ$X%?QLmY\a,WBndnǤr 1 0˜f 4 8NϠ$Ώ @ LvIYYwFuˎ™L3PHӠ ;BX!79n8L0|'2NJ;(D׭[؝r%yw.Z8%;"gΜm甂-M￿Wˍ;TvB_xc٥#Wf#S?~<>SL2γQwx.{eeatp Ul?::#Z{#Q{z dǖsǮ/f+^`5]5Ůx b4(֭--ƻpAb=V`k4y3:@..!\ʋ.nn8].λXq<:ZbA'W'u1sud쭥K+zW}XNjn ;/Xmg:' N u>g " G:>@M)l! !lSNfȼ#EQoIK~*ٲ5tn%Ӈ>=|r:P<)_-۴D~zclOڝN;h> - _ܦ vx AٟP:x= cڏ\y*'EiCrۜP>n_B m]x_OW|7�psRCCi;#ݩ$I*if׹T?ɮf>9ٯR\g}vדmYX/Η n'j9?i#p/c?jB8Nڎ($c'q 5rRP$ګxO h# I䷌ߛ;Û,%.B[Zp]ќ]1ǡ@ok<{JNs>+=i ~KΆ˦2Y.v4M徰MV~uӻ=q"з/0f?Dv  Iuuaɒ%޸DMŋw[ x{bG!8׏8 +VxLADZ\jժʅTGydǮ\1m-. ;zw⭳t8v_Aٵrݲ8z'\wX$x/+_@=-f+\خte'| 1nە%8oIBe+K\UʙXv.a>^9$9D)aFA.]e˖9# AC% ga> #4l8Y[Tjg XvXРÅGpq�.@c4!k֬5jisgˬF:B6(v0"LL64i'fڶmۢ}8製NLKm Ӵ?CuһC_|z-6ǞpX:uwi-qֈQ~ruYr7o7s!: ڵjd])+i$q3mFn88QXA \N˚�h&8'D1 lX}цƛX smBa.AӲ~"t`UB!%18AN^iKc4\7e(H# w%! $vٵm;\].lwۜ8{&#`]/JX4uԙD j$;ZU^BÙsg7�2 7G90\?=WsÆݻc|1_$G'Aw cN0mN{듡͉mv.nb[!hsDcNۑ:pnmA! VD_G%)R\]`&Z-?r*`Bl;O{�M'Iҁ%$I ߳�}Xvm?7.ǵ vG>[kۃ{ξ\+Kѵ19P>G6k%je[}bN~sAq,H;3B!gq6]3Ҟ{~O),~/iO}O]쾳7#m8]{꾻̫)Ys2>͏eSs67K̲lfoqݕZK1cLxE^=O_ eGj9s9sxc Y8a~Y8aB_hJ!<:){ˢEgl.P^uz 3*@ '9\\wn=.l0=FkS37}na{GuTY/jd8.5N uT.1,tmwo+pS Ǻ+ڗhS`y'YضoͲ&V-n.?e7>,[X2mL8XugWu3-|*[XF=L۔3-\vMG.AV8 .x.I-48#D +5.P5 Br፳>4s#U:1 ُ;tС5j'EcิnS.Ԥ*4PpnܸqEw ͝|^'"1 s6{7N}L R!>3X8:^pVn9C9#<HkJ$xw<w}k4l֭N͚5+rMt4;SY.tQ2ߜJ^u(H͂ 8B.4^uH$ۚevu|?D VBp'H?[wҦŶ c76/:3;e|s,:` W\葉P4s.aͶki<.q87?8_`̅va_#ҥ@ H2O@o A_ԟP/3 V֟Լ9p=W} ~8w򕮜769ڡŘε.Q6%'i{rwѤutBNX1h$ي꺘 iÁ0'д)̿7Z~ބcM+'I|6%{~=**)/]Gc~2{6]k1�gk9߁p/?19lhr>w w0秨ٳ%(1AX)ǴhG˖-cV`3mu]g5(g1]uo[3Y�6Dm/M ma[wKhLg B SH3T05/;k,̜9KS‚d\vmp\!Ǡ]P({Q_ vRs޼yմ7j[o?de2.l2ebpv~/o~,}> Q w1l-^xlM.gL;kWn\>G#m |΃e  >mp© 7\o2v[˲9QNb1ŕ9,}"uP?/]b5\*}dx4bs и5ܮ�bB= q0cvHTnUd.B&v`;Q!BaR~a{3p6.TH: 4O>Wa1Nh@W_}Ռ=aH>{:u_C9$׳_͛nN<,U`CrȐ!I8.6MoVnXg<y2F ղ`gs=׫GC3`B#[v0f#WwIi$tوc#6l+Ȕz|i{M(cb!G) G`w7Axm "N{I2un(=t�C[h:cMY/ EsEn ^ADw /G#w}tDf!n](=Ekq8)3s� HRAq y@BŅq-�֌',bΰv2l"ʸD㎃ 6�>;:toN?}�n~hSɴA9;[g~M*)Ft/[h3r}YfM~8�d%.�䪰cIG9pD0Ids)S<a$CT?۫'ŀل�Ђ:%9$'u='雠 Ju `ۏ@|_d ֧ӧ;^n8 }J:vh vSξF.>S|I->+ip>[Xg9}[UJ,7MrSg[cB|߻Z7`cK~I�ǔScijQ,NS( 6 xrWБF(DS E?)oSs7߷1.-LKǓ-n#5ic~Ra Ӻ�g{qyng0vϵxel9[kc*}|g<qeJ8fg9˘pYЦ "Z b,W\Ø+gyLTưQpFFlsqa-#ETGbgh)g�qs7nu$8~ 0`�+h8 ;:42T5j'I2^zOWx Ǝu-6FWx#xvm=|iV�MfRgϞ8Å P (ig̎f@ n41 2Z7WR$ц1ЀL 44:r^t "P\,.9  ӶD;[u+.p@qpVl7;kwGK�Bۈl3Rs:\gQ98RJav0X'7̑1o(9 AaT`fm AF'oM wOr3τ9cp&K5 5 ~'ɠ =ざ-3(arfڡ9؁l(c.lߺ?+@ 0%.\$.Ч".ub'E%|0̧xX `}%Nq_MQG%~;|OJr_u1-les}\w> Q'@2~~np/҆| Xf_Bf޽3PR ~[ΞƘV7( 8 ? }me{0hS㷕 |徧.w~cx\hgaL;�.fB puM0'Ng} 6$i͛7Gfͼ|X(Ҝ8ؖ Q._LVZCxmu6>}_s;8Iˢq\r],y�ෝv`~e}N|~v37o@|�rXeLp 'D3qx"Ot225Pq6(Hqvzp 6t?so& Z UTɟ~ACFD ٟ={v, n63bϙ?6m}Zhg?M�7ވ?3]tEܹE!V]h6l'RvMtP< |Q oڶm"c#n6\׮]%D&gj9r$}Qn sL "N ((rc #N.nKzG" ΐC( ľ pQ " ~(;{)r\0l7?w} .+@�trɘ Ns@?p?@8 :D~B?{gvGq) -.Žw-`A"]8$P\Cq VB(|߄w3{{g}サ#gfϜ9s{)P<<d4~+٩cGOEߒȰJyX28OGۇ"[>p JYK9e_sUN?:ˮ3RC_IK�i~~wPeC)`?1 B@Eo+uZ2D)zB1qTb.%5s5רwQ:Mbf%/t`Ԛ^>~A}ȟ�c7{|h8c#~/=z @Hv@>FcG pC] R'pf@k@AwSbE·U>?$nLA O<qLRJp}J�}>{H"bӋOshfcZ@. SO5ؓ`<*HUjk8GX+X3|wcYK7n�R }> �xr3 쇏( h|ύ[N5 5!Ce֕:C/kvLH�|apGԬ1#Ycy2k'<oa"Q z1l0 BEYP㓧@Q�@*?�Rqh[znYqXR; w/Q>`P]]?}pil,O9?Ho�;Q xzH`qWBN;mu]b, }z#8BH63d 0M#�5]wݔ'$ ?'ȧ$$Pn>O㰑|+qPڠ14ǐvKG~ՙgc}=jMdT _~e\ _�;?tC>Zp7S@S�poG5Հn?H^xam<$x*z t=VkU~Q(twLP+էKV']U$q% R3B?\_ֺkĈRI0c%kNЌf b_D0�e �(>g{߃zS@+:":d{utJLR }v6P<ǎoFm'sIGϷ)ЭI]?}mcyes ?wvv*>g#P,߱ �P@e p/tI;$]Q*3hF7'` 1N~| @0CQJ@$x. ulЫS[l2ť_)FH/ ;P{zU|W^ye+_v) �㏫G}T=c?^[SC@85mc kɀswuHHSSi �> 6 H+\]:10`؃/{C'(ܻwoϋ]Y['~|+695�(`  1CҬ1f@nA0b~ޠ* L(٤.R7 Orx;=F"DիW|!rct@?|G�5$:O(� '. 1w[{o&/pTZev6R_ 's> ˥.-b~뭷s .%Gj1FqbPGybb }Hk�Po�6r>@M((pP[i~uNO&b3=d{ 8R�Yg{W"@Ǩ8^ #|> `|1>[1 C%XBSyg%J Zv{ TPVt0b9#J,qhmz?/G+8ֻE^2K}wxBI֢U\_|E"tQ+g픾袋$! ,ō/S ".{8%b=! 8PąV7ܠh].N-m̓]+WyYe�OTAKIIM7S t|y ytъ`~[~ c}-d(|Q�"�!ߧ~m;5bO&{?{ogpO``0'i,UW]UJZ>oV@�8Ux dP.84,y;5kC ~a nMlORkSN9ez!@/Ճ>(rC]w%A?R:PxѾyFeQICF3`kt<7*\eS�dPk> +�_DpO|7b_l> # ˺b> ᓧ@;(٬-|bSh-zf (Ycolb6!T`Hz=x@+" %7`m,68kx@$=SZx`ꫯYg}Iw}e]4xͩn;ZIWcmrX874QRZ*uyJ՘iaV(x'=X w9h>&u\U쳏:ꨣkt1l`"s =59tE%󊓎{5|<<2R�ʁ� g9_ F OEY{S W`}D냏W,r*O.1b)#6l'`pGSi1fUKZFORAVwl޲nF:xJ+~Nr$F8J|^T bhP9]=؊_NG>3Gպ(%~ �30C=:[))nA�†; p2y�+W7UNScam]^)m'`>�8j`X哪o@$|{LC`-�G@�c߇}I;S(0rH 6I��$~+vN~nA#:'|RO.ފmWlFp_@)UU`k .y+; pGJRJ\u}uۻ+%ۍ7ި67tSkS7C)nAe5/y[l}7i,<m@}$lio@>y x x ԅ/ /9E/^&GF_0DƘu5 :xǬ/|IX>Q?))Pu Y_Xk gi&71TA:0G^'ZP(:'{v,gh?@~-ԃZkh �C"d11쬳RSg}o~SǮTlN.buMM7ݤ*%PyOI`8]eU4aUutQÇW}Շ]�A~Ȥ$ 7ܠPwr0e @aC<6?жSS| |W(8qH?H!,S}) ;vա�*?p߂c=3:[)I`l pTC9=#꤮t$zk%:@( @ۀNS'[JM:i/WM_QTGV z2ms1LR.B8䃠�恈>y x x 7}™6Jͪ%T뭧We=ES@԰aJk5կA �T)yJ)P} Y>)J'x<\>Cpn^$SS@5J. A}F�(${?^�.[b5 oE ~Z{ x "� w[aG 9 ;W_]ꭻߒ` ؜x\ &@{i_d\sKognӧc9ڗ)2du'lKm٦5!“B#$Ư,fh>@-)�Ӏs#� Dfv>hLP,b c�E/�nw�Dw3lyA29OOS�>@ sNZ�r7S4L7|n5x`5tP5^[�O?}@O4 wީ^Yc5 &f\Ǘ_~꠰p+ T8 `?z>( `I%bfžOv a9 2r|*(ĻJVXJKr` )k(MbPQL^%SS)z9 @C)8D2ɴ8GU Pfg} $8.rд[SSX  78"ľ�(ZisXK@/PI PACmu$O+nQS 8ORX'n{WğJlioNkqp;?1ĉ~_WѾ%/OhzH;:X06g즪`Sx!cly>uğYo#ԓ;v|'S3)PHuKfaG;\s}@C!` ~'L?}�||믿o\mtjx=#TV]uU[Yw޵o@ xr�P d_So&ZbKbog=:,uen4<NwB;$Nڨ<Z1+_; G>}<<ʢ�DlICNk@{bc}Ib@.<|+>C=Da p/fSS@g_k vFYfE_O:Cx ȌaCQ6gM6Q/PZSS�a\vM7o ȆndP 3v��$�sHtbIו=u�JXwŧt @# q`uWz@tr~Q6l(@"U!_b` %X�.FM~{}#p�B?|�!"!qH!+8+)էjRAVs\|GsO>V[m5NGʫ޸y x �."F'b]w]4C8<AQ)qBRJ|}hummuzsdڧӞg[[ @R z:6/N+<ksqRr$`d%7W? y<v2묳AQ?)) p f` Ї,tLpH)zM晧-u[X]qEZPz9_dEyWz#|R:}]M'yo�mcЩyї))`�8:T?vA"�kM!Q,}nv 9j2qHBu�@4o}SXntjsB ա6) Vи\/�wqꪫ ￿tIk/�>]w:35J~ԑGY[�Z3?KF�8 ص4LZv[fe>gM4yz x x x 8P`]{~|ͧ= ɀ^c�c},:X#SO=E}OOOOC/B1B ck}F>}#}z _H B%bzEip�' (DxCh |wuWտJ C5 NACiSDDy 7ܠ uRz %rJ7q)7ޅw}W#{O 2Dmjґ &۳՝ n"9a{kpO 8t$<'�P`d']P�0_7�.S;苡2 C|µl#}Օ�r+:101AtAn+?)@?{;C;}_{8pKi(@X!2-RAH.~ۀNm9~RG3>DzrH4ve/iSTj)L]}:+6dFN6o}͞Q {y$@8�BD@aAtF xw;mCbJ ɽlos=~\M<&ȕUO �grm:h:x}(bˏ]xѶnm?7o`o>lCy x $Q�=nfc)h+glj9++׿9LkկWcQ\pZpGXs�~c5pZٴ҇;Sۯ!03c9\x x x x d�9@D/y6\Vtu歷ɖsU 9O{.y$z뭧f8z >Lq /TN;0`V쓧@gP�E {}nxۙ`ż; yxT.@fmnXn)CJ z:!†O�؉s=ԑseR�}kUK c,�<QQ0p\"BTQh/� Po[tM}pIr e:L駟^mu؀x x 4(0bmcn.6D y&k_<;z$ RLPD LO잱λmmu\uR]Vק^PrĆA9zrÔ%`+yQb)�"i2:zhueK/T >\;oi/ 9.OO +jڶCn",1 ̿l_bu)J:궱]-#H6.2yH=<Z@f/kkVlmsل.Bȅc+gN;j\(n6ukPKlUfiҗ)))L?\OOj{]vEzܐ&2]Rodh6?۾҉^zN;M mnS0 yAoV}޽Z,oѲ&СC+ZwukX`k{ x x x d�>ܣ8BWԖ[nYP^0/n@ّCx51]uvQ~~i{}7L|iG7 ZC4ȚNj͜b hUbMT[<֩/�ؕwwwC<}x�]騣RÆ =<d{Fa<AHqoxv@>lq@ >S`ȑz>}RAƂ101BՐ!Ct4�t8LtIŨQ3<��@�IDAThxEJF̷SSS  �.�vD]& |rh�>DOOO `_2'pZr%V0gh)))6 %@n#0cSn+| VA0=+X"׵` �Y'@NtB *2:}G2,d1,XOOLS }Zkm 3Dfg&ԚyO1ab'%/CG_@h|we ;!C!KZlA R(EB7�]!#V)U\pgyRK-z-裏{* o@)� J�“M(xvY.xITUzkk6hP`hkyZol3ƓΜwwJ 0NM7t @ 'P]qA 4`-]E|> x5רO?T=CSs5gSUL#FPs}*{9uj_נ૭.6y x t<n gû+ <-z& =le~m4tl5A>LB/"O>iH쯵q9d?<Hbc=6_DtT$Qwwww^�O(;1ON=TlܨϢ|Pi>Ѐmyr.d̡Ƿh Ç먮I'߈tkO<QP8z.r"`eQ!PLG�"Ky%PƆ1jgX M!7tׯ_,-!s2 |'G�#]c."Μ~酶)P Ľ Uh~]ivъLjҋH}rzꩧG}׋~ZPK,+@>y x x E`TF|e??Vsv(.SF-[G?[2sM<=DqDJ2S]Yi23jG.PL{{ X)ЬZ m�@?|v!$gb?5z>1e=.=S5ispΤdy3Q |z5j=СC3$+95u*�9],6ĵ^JXc =QjI!_A@�2tUWU?|aD[tQ%]vyu=h$]7ds:̳F!26Bhm7XL-OtҼy'/Ssִv'cש;͎qF>*X.d\J_AFBVBfBvH Y ^ߊ䫼OSryV\`3o-?L*!ܮ*=$ iU)tTC#Gf_A�8pns@jNw oyk^.K~O }sx ˓܆G.x4x[+ wHXZdeYFD}X:Qt2uq~5h '+Z)?S@zy> C -ž[SL})Sٽ}(tE&gn\|y#EH_- \DL 5^y?u�aojp1|V{*4ӷ!8_kT.VRӬn&ͻUu8z`bpx98=v4kNȇ6[wuN;^~e뷽kDcg � 6AcVvan ⋕DtG<(.>CL 3wqG eӮ_+vygs&PU@VZi% \2ؤq�W3 MoK/Uاĉ" �}W)\OhGޫx@C 8SVwJZ}.޽{Lb: 7.c0F60`E�?v3nf h8I-!70 cÇ  _~&qXoȷ~kN(e)Z4)P% Ľ YWĜXa��|͵,aHL3ͤ 1|~饗K/ϿKԍvP�E2h_x jyS;eԲuqøu˨Ԭl<=\1@TGoVO±ƌq%.¬uKٽc{))))P �zwygl:?\bBBI@Q$A(3)'=WuᘤfTl/['9J)54Y UKݤ*چyjq yfܚ{^!ܲ.N9mw}iХZ0ۥ-kfgsjH؊睄e >VuYMU&{Zy<CChmL_ y:9W;^>ӫs2{1N3F3ϸ̢6Lx㍲_S_pĪrv{hcuYqm o-?LV.'Ҹ粴ͥRhYB. +dv$hD{=A-mў:۩SM[[~=ow7Cf+؁q=|#XG҄Ny< ^OUqX0J4k 6mO?[2%%/SChTjcߍ0 UOh}s H ލv{W-" -¾��؎^g{;o.OKmU&w[QybQu{m[LG^ڽO L 0_.g]}uu5jOէ@%Η,`nd+۫]>u]k -mV|Hw֒^Zzφw強!rK7P{yIsK}ULw ĘrMlkb lVJiG[t'@H裏.J/(m+& xEiذaz~vUվ|Ql dS\a]h=EδvRrMPA`3xG@t'xb%ȑ# _|M 2CƵf Dmю{FWM7]`xmWC{Qf Dy(%SM5U Bj!talJ;@@N˪z-OrQXѡ/&1J N5n/@akrQs^$1\_|9 T,7J|�n3g k]zs-#MFe/ϙw]陵ܤy{؃#U ^{5sh>LOq("Ap\<<@ve}߮f%[ߦ'/yfL6A}e^{qD9CFu^  t(s~3E_؃]S˗s͹ ~L3Mp_a5t*r%Ѭm :r'c) kZ&A6*�A}~뭷L0^7gRP@Z_)&4$|/kg;(ql^-ϙg9pl%IaR.yNҌoyd, vS%}6@0Z}ƎhSIZߑ[ ;hە<+nWL֢e Y7Ï]@Xo?<mڀn dYII&$w}(ڦiNxk3ZQc_fh,?[k7 zw?'U.m㮼 gXO�AG=W闀ph{5кvSK.:`IՅK`u>2nGA;RVh7~;SRٽ/f)6#Cl&l4[;C_lIUI�s WSgv}gL:DE4N;-Q_2jj޳lӬQ*ͻUw$:ۡ+Ɠ WWmVKWϳ2K[D2S[t_˦gq-t DLG+N�+]Umt$#<RꪅSWW_}ui+J-pro2>9Sw /0-qi;e))Qꈌ/Ҽ`}\f&%, GŻH"Bq˔�EGA)_gt1FmƬD 7Pz}̵"v}nyly)?JC=K~ܵMS .-bAm!^@ : /l\JV6~mŃh kw|=<*HO>DG:EGn'ZPR7ɨIoQ̫xRnm=p'}J.?VK$$e=) Ԭ:g=<<<<<JDͮ8 #qF-x:o)Qe) x.D7eF܏{kL4Rr<S \Ҕ %Xj>[m xZki]s=[l9MzH[L⬬Pq.w1mѵ.L] E]&xba!˺xl0$`s #&O6RM7l12hize$M6 ZGhv?Z^F`nm~N=?PLn/Rg%ӥfN|2JҸIyEf@jfSկ\yO: ,LYmzr)JWyW̧ MzWpCyq8K?Gm6ꬳXB.dʢ駟k/ujzի*[.Z&a�xjZyaiD|:tBFE;d(*h#k<n=T*Vji:*g[C.]nr~y::?3PhKb}nÿJ baMY8g"e�KPK*3KS�\F3-IGVq2D55+_V64Sft5SF+@uYGas)i"1{<_ VXAI»?j}aÆRx|zulqv5Bh`,"ʍwE-싢}2ʂXRq-( J+6U!B %V_~;�L$nD:U'x~{ァTO@( P~A`Ç;Oo09PYX fq؆R&@OSN?3&ΥnQ/_HzcQA+F_|quk`*,6(x㍕ k?쳢;_+�'|y7IO>[8�JL%JHZYqgj:'#4X^ HӘ|,(`P~*7 >rW-6?1gLdvmF }JsO! Pv > `C;\vG}Q\Om(ʦb }`a{u@uQWl1m{NX&=6 FQl ፼k:`c:|'Puz &N ,ɻ ˚pǘ(4~{5 }j#�0&` _g lcmzk+׌kO<ASDbhc&5B<ź|Ⱥ DBq}z ĴcvA%g?ÍkF %q`c|A]D0Y�-4I*+뼓7p9r6H2`ll,Q2zM"kkyO0>@zZ/B` qB;�I~4bn/au]7^^ ^Þe9Pl6.rMNm+U6q)qs6qA+:C .<@d�v)mm;� ^lX@S�9z+@딢2j:Rha[w*ZG{2*dWk\螧J{lis=8�5b-^@XQ`864h]4?=<~" 4v7ϥqI 2Z0mh'(v7l3Kⓧ@k%{W#Q� ']�1z$(`/R=ǕY5|[@/\]l"ޒ OاqL|ʛh=."P.z˹mHwUBv}wmciDUyc'Ii4NWZ[9yvi630Crec uh{i+#a_)gw6؆/Wj|a%Ց37mk2y֤jxuܼ3^>PKflD')HmIs捏 2Q{l馛4 LuI'f=Ȳ:6l <///Ͽ3F״>P ȗTOY[J%Ѹ {:HRR+{ OмE4=xۨChԠė=ć5V.vִzq~s5W2_I54393L3d{2Fcym;M0ݴ=1*;r^{5uWu(7K̽ejmiEԦC5e}/z@gMIkB8_T*{8P &;ĠA4_Ad|h X.ՌYuUfҜpkE`3Ib"dmk$*NV0-Ele"ӊ,eo\uO)?j* L2IO|"c=mhOZc9ט!K].%oZS^]L,,z:i ~̝eҮ5rd1FR=e1.}&N?I3m`_G5C k�I" H&E\  UjV-rU __C@ 5P 6t@RИƳ⴫AC_DX L_ |h/r ̓[o.k8-@l8k"`s9g ܁�}r(p*S3<$؁(.@7ֲ8`V@Q}*@D85¤ #si g]vOh(hHD@@|Jj4QNKHp._ $I%B8h'p@qcB @=NʤciXLD @_ s.K87zǜiVx</"N3NsCusL Ja^3K9.i}lTEV-�;3dk:n !W +O삙xx|A6 !# >`߼뚧0O=F;kif[>QlDe5b돭*!uvl1`m;Yu [&gj|(ldJ=F#p.21VЭ$bDSd5'HDk=0P؀@Tt;]O2_ C_v ܺl1lvyg}MGza~f{w9|1 g^!#I@ 5 r@F-c wM7}&hwf-ܔ\x84^o(Ћ~~"c"KӟlE dJ3DqR5Svj EVɔܳw:ʆ7.7)6IK]?aG~z'|S~'tr}`ʵ7S 8 er{Rz]#$at]SF"<yʨ&_C54`_ٗ:?]=ۧekyH1 4A�ƣ696`z" )z/<+HՋO9Pv 0oW%_纍"- Ϩ9S'%D;8H ZF7v7w~sE_Ӌs!GhMrNrWx΀s^xh=,=\6$M �;RV4 >П7VAtDc[ֺVƋel 'S–�]k^IL+SHPnGV]Ejlæ ?M{q4ݏ{ӯ9Nes7`JUٗ'wl8哱>#YxN<G[*B>�ęU_!*Sa-zς$CC_r!s l|ucf j l$~I4n瞜>_Ubk]<e f.)N[`㭮:5EVKKIʶ;ؒ ouߥ [m[h֯$~lmL}z(lў㮝L9rd 6Ap!u]-*Cٖ2ejoӡ<oن_L[L=I _3e|G誳/»J |04'5i뢫|J49ՎEpmO;lk?ll0q.Kum2\e Ex5}ອYO0X6dGj$AaѣGnhYp.4izɴ7I{[\ȉq׌W}E:(4= }w]tJl4FZ=e1.}!Ottd<CJߘ}QZo{98Ľ TENjzK3Ptw67S_q$@�( '@O`{-XSOl\q &I \hK�Yc54i<$_$J ՍKAqKQx<+10Sʽ袋+hG?ɀp Hx�A G*4iRT6m.S�>��d&(ZH B1 e�|Bg#FP&4A5gLe|+  K$" @ExIK.4]a{k{M=OoF q?ۊh /\f:+KGrnC;�/$xCeA(c\€\3@yK~߀4� '6\&۾/\!`ƴsg՟I]&7Gh#0ucČ-`" :ST2sIF2 {\ɟhu�W~ԸݡM.)5$:E%LNh8]CMl@9 +\٥]wNd@(9q"8ΒlkBeW>L +M%7mu}W3}u7/.?:mJ=t޳gјGUۛ6>~jQi!1@uH-)'#u]wԑ&r2|8l\ndH^$2ixޕtHnl dV&8n0/ DΦu4uoksu Oy x @zAӫ՜Fno󃘭#a^iȐ!Qh/_8_r\HPR(#cdyRjtщ*icm7ꖊCA2P.zsM[;di|<'*Olq4 F׺<쫯 vwksn̆~`@-:h sM6ӋA6Ow `nc^@F'n^>Cx$mX|iγ7DG06iYjgh_}n�:W {DId8/ l|_:ԓ�lɶҸ{rfm�$ly¾>W><ٲdL׳z.3N[[]tj/{\<p6 r᭶zO+5!.ceI̷gY P(,uV$n/GYi A|*niQ25G^~gyBU6N3/&W_3>f5\x9pU])*ڀ`UO e]tmvy]][[vic.0qeȢ2 ׊,Jm{#5 n.]G]SAzrk>t[lkK[ch^6=.W:xQ_2bV5~%5&s?.Rw.:2QvTwϝL_ˆ0O?qҬl?mM2$�4?JFe%$*Q(:dFȧO%JHD0%BEꫯ*Amׯ[Jj &h\-ܢ$b ;}]Ĕ�(*RTxiObn6Qܔ(*)hn;} =6}b@Eи1e+RӏGZtEUҮ/1>}jysxF wazD@WQ4b @<L^!`FJRsd+ Ux'j x>#:�Ovy)1P<b%�9烗qr~RK퍁o p:t7%Cīor^G�S4LטXH?mb'W"<i&pB]΅蟴e-R+?4<y6kj⮻(~wR DS\s/)qz Qy}]ʻԍ\!\s͕c4ܬMl !Ii'ynV=6ȣ$GU~-xl sg5l\w}we!E$33zͬ`׸\+eq#i+_~uqvi>wj*D(_kbإeM1XҿmkBA-dp1ZW_\lcy&'5u3pzW3}5s0̓Sm\u$}73:-jYoFYfx x ԌFr͚hnڊ ʨeHwE>pl8\BpݶɳIrm$p# |�dty} }Dmbly睷M֙|S+%V<<<<<<*J~R8:Al7:9B_G_lRr{㕜q)?S/g.fXNRl[=3sM!SMOފvX<И߶~=)7)Kv'/;|W[՗_bFHqQn%AR98|ay',bRvTrlMƾD@GjOK2^>a[ǽ|2gen8_~(ٲ*iSnL OMjwm_)ĩ&]z VvV\̭+gxkƗL=I}M;w:cQڧ/LvwqG%lU؆"U/f{p+u)lS _Mө xy`Kf{>dsL.;d.G oMC04 إ_<~Ƶ>OP؋ao`]xkt\ Y)4[Jϡ18^b%Sږ-SfCuYx}LpyqO>ӎk#+E%h c9r愋\o O:"瘺{(MIṴ aGu6e4O5mMleҟ*We 04BGX 0bQnv$ǢRTC /KK6�.K].֖V'nRtMz4Fk oM-6EްC[~]2PN3ɥ͔[w>.8{9NhziH`DXuO?8]�􄅊4K.D:=,BQ,K/[o(�^҄o|7lQ^+!%Ԍv?@hA&@ȾKRK)t%GE<FO5m# 4$6&[>zFY3E|+Coye8UnZ9ѹ%`n+8NAk{k{g&tex%Tz_3Ny[tYO<Կѭ&уeygdxt?F $ָp2 p]wx7]aO26 -y�WN͇rM6$z+U)@g׆0s=td@'O#?q$N#J+B cLBNٮFȓӆg8g=yhlkBAY@m/`c8 喲ɱy=MZg+=lt ʆ{|{`h=qPu4CKsX_߀aKԹ�/-'-CGeQmA"čs6+%3)v'{rnKkIp[U<ӊ~4oJ?|;Gb"4޾F=<<<<q@�ۛ|qNߝpxs׉]wJ:\>ZC9-cdSckP͜U]e5r at4<U~6yc'TCCc~L\IbtM WOS@}H iRJw=ZG'Ճj1/M^>/Aɸ ^>3e.r֎W^ ߪhщ)Is=5Yz饗F~ֽ_Yq2wq 7_U}\W:ӊ {� .`,3+Ggr}Sى)ԠAV$ZůFi|)\owCg|VW ZO+5'Lc+~g|N34ڧ �i'K^"ҥө*E֔ljg'iELߧ<x eMEQ KkSLtuq5d<`ҡN> ;b|ЋlfSSN9^D(9kh˺[ n",{X ;w-sOW~WGq\ UJ.2k=&kL~bß5ɛ&(SR3kLX/ f߇h]. pqkJܵ3|CZ3)J+#mq7\)z^i}i`_Wր5 lh;4̊r�G\|oW[o 0ÇHtNtM׿Qmf= _DݣF^vM 9j4vm ] }� $"0BlfwaVny�$r7֟ᄏw}fK>2GHO<3 Ur^πw�5E-3<7x6|s} Bq֔޺:g%ޚw(N?>|k.�{ٿZkOx5I"R4QuĀ[q m^�:OW@81Bli@#~l?xߑ-veb{1}馛&d'(/ "=#aX ɟviu|C-Ia*nF5hР3E;s숻W'2BֶEք49X ϼU>}t569L699gdu6뻢;ÿlW\m\^M5>ZO~á~Ujo@(kի6o:(0lʋfO|`e,[ޱ_Y۟g}Ouq6`'}NЯ_?!OPA6C5@H|�z2yIFB"KopĴʫ5顚9ʜkd gxN#\+]겝7VAb;O5424淭_qqg[CYW:x8Ny~BM4=`ʸ=ǽ~QG^mtL`h xY'O̠H9e dkW$=C@- 2+ saDΊ󖹛'_i}ukZ\ROZ;m\~}_;S^{뮻tc\{jQUR�]:%h} [V[M 8PAPD+3MFc%VKR`FfW4LMKj}|BW2tH[c\1mj3_qUƿҴʟ%h?,t�o>Jq7b5)M΋C<xaV1qYl~Qхe'VovCC3nA~iywqޕL<@ irau]̣?y.Gmmaʉf?cC"[榙 i2K=<k,e/K9&*"p:YgUDKy.%Zwٿ֔kvuCiXekLå4۶LM>N/J+_T@tOcjtN:սgG}>$4�uQxc-TȤ9S2D &?8AͻCw&'{('ʍLI*qOHԍ(-3�AMSN9ETjtHyԯ+gFf ^^{iCJ0HKF 3:ܣODMXbL@%<7Fҟ_yGp0G6lXG:+3{l v[ŒSY(dzzUWؓGyDqzm1㙴,e.s oQiI&"~G7nKb.8�.Lˆ2LEffo�kDj2 @.@M3Ϭ?Do1b_~\ˍhe=kg݃WFv$:,Қq|.o H~a}w'< 9:ʋT}`tJʒzY|aa"澅t��@�IDAT.mMH3("XnMXX#lr,ߤu6BFpln?:mjO Ph2�4[m&;TvB>SSS dD5.WgQۡ#mѵcq֪RG8M }71#@b`t=|vlAo4o3t}_X4CL@З)))))P40 $@hpP"0{q %O ,)KoKF5x06M󹨦 /T PFPT]U*7Iy]zV\v؆t#d\te;ov1<ѵ.?%q @ 38㘋V7|swpm&.[S Is�-*QGQmv.8[x駛OK哱S'?k0(Q|2v|8oK*J>;bd d!솄"�p#GT{LΊ _M2~< ޯh]W:m[.{-s;QؑzQYh꒗w]E]-J�C햔SYmxlJVxѩaKMi|q\jA.ե1-jBm%Q~Ff5m= Gs1)mO7x3l{[m@Lߧmy¬2~4q}ζ&P/<i<MT߇h.[E])2O+=q\mȳfDXqYjoﶋW{)'*CPFܵc'C"[榋LROVz&OqKCk_ϳ7xCzSDZp᠃.m͔KRg?k{z\xKֶ]]K[o9lka'i,^O[cl}Iˬ1iy싒h ?3k8I2 0;믯\n7nmm믿v}5 6bĈ5EM=96Z*&l}M$yZk-kB0`/[^r!B_�@NgqF @>�4qDz@I둈.<y@_ fu@ 4ő~<N]r2P .$γN�oFҿE"U|\~2O>9d_r% -Э@"|†!Y Q;.A` 2I2u9?m}M@�01+o b85gz4@ycWtƬ缙wygI?6vaq;y,}`ԨQw}7ORs^ޛ[9U2~e7^|{6t@Ns�^&zȁu U]:xseӥ�kyOvo\a%S Yj$]84Ņ暚f<M]tf ^o?�xbVd.#Ɵ1+# pj+rXFǨPhx/2}M ̗$o8l�L3M `}SO=eNjY (:˻ӨE>F5 ǘ5N#r&:߼|׺khӅ/d]Tپ;?Q5!2!lBA=n/C ,-69\<.Jt6ِ<蜗C=٘}٧5H{ƍ~adm�\=w%:`M{Rfïop=[)N~SLV9YZq2j^:R:#MFeTW w{^2JOtf z9zutj.eJkI^ s= &t7oF=ɒK.H@ƹE� uVtwS"=BVЧ(m:DZ|) !scOՉ9<iyب9:V;uA9m3_ʩ41=zJoaCn <R弎>rsk؆t%ʾz?6?7e7׊vGc[qtJ@4k1'|b}Qrv<o1gycz,rYlqؤ2ѡ&9biwk;-BMh哱n:n9nɑGlvgؼ!J)R> 22Q]lYdUz78~CrVl y!ڹp9w.tp' a({\1tiBEy=/?xhO7jL븐%H%kkQuRGN-+o ouѩl|)uC.c[m^Ѕ?4?8+ʏ9?rmlN qP�>{iT6#gu*~ Z>'n/ o-k;Æ k[c]lK˔]d|Wjڀ-rZF裏VXa}W^lk\x^_rKVuw푝wwwf:q R9Qou e]*&Eqv?n]!EMvy3,C>"II{#5 n.!?8VZ)|o&k)!0/�]J]SC\l?Oc{\rﻎit=Ṹk.v1q۸kU\cO>[rYcl2"o/E1.}y#seR'%鉚"Tu M4hsy1ZݻwpT|P)|I`~! o`<裵*@t; e&jp?S)N;^$B!ˋ`!JȽKΡzD3톹p `@kH6^zn<swܡ�b">l1;??^].BȒlSt%Z$$ -ŸG �Gr`6۬d#un1P_\+Q01gL|7#HҼmnNcs97 Sm[o�lQ2vO�n?ԇCO\ХMyU@a'a@'xNi~@aQRl�~ )yAY�˜Hz.s:Ǻ`˻k(e߾}5-0bI_ؤpI6"3P`'(IEra2{ァ7� Q2j]qJ)C)4N]!CxNI' k0c�\lJ\.1C7w'ܖw>�=ǎ^c3&6h ]յ^cKq׌0@d~@6@/B04H ͌)7[o5-�� xy1? 69c�yGNXgu|.rMN4}d[gmJtɆq{qu{1'gOEt5??� hW{<dUGǷH ƁV'#M[w֑"dT|8=Fw)R^ž5,ߧ1<�NY]=ۖ0"3"tkmrnUo-^#{B*Lp"ew6NA 1|ȉUGMٮz ,k1oѻ3'�ْK!H Hq:SBΉ`IuWm׿ƜыMmrF@*eC1+lzl>\5]lC\t?C<{ m: ٝ弱yj]ֵzb[xq[D/®!o{"xtX2s=DbAaDmI AFSH sۅVOR'vqkOI$Ћ;Lox6uHE'i4@B&B6BF-ULM;vw28z뭙mdIs#RG27elqpkFW[\�Mqd=mf7$ N@iB,3OaYutj[]tjK\+o.zAޚVO5!.c|K2.{s7@!]iW>x Y ^Wd|1B$A 춧~ivXVʐm퐩d|=M4N Ƈ0<aꫯhn Hy7N0 sϭ}iڜpkl"rEVԴqLs\ \䏴6{wμ>a3v)i2\hI{#۾ n.RM@ZmsN@X~iG+bpk_w}EG_=FbuKik }qK8 5&}\xm,|08;u]\x]]I9lLFR=e1ǣަ#6^罬}QRvx<ކ *R/�`vFȏcK|q1|7~y$NTل2yX8^|yߠoGy8p7&' y.VtFAǍ&_u †E@9.J>1@5jTws&&.xCiO{&A?ݍf<tyomcX~~1mmVQ<dk5Qj&}*(a0Ys|#Ў cZ擦<eR~ho%�AVD*M}ɺ:-3Ǩ])&o8ڙLߪ_K?i;2 `�ixwZi/G1kF ;k-FME#4*|qb~$ 69(RCM"'5ll^J̮a9繤q5efdge;ϼOj͡/9 U 6ϾW,lYmhX�& qQ0v:pyu2\gYVf]_p|CsSv>ioY;]Ɣ)q4x<Jex x @:#a`>_6zw[[m[)=S%&ت^mnWk%>bp}l-WND;djlk;[*:>ߕiz,.!Q]C7灜!GN M겝7ۥ?Ҿ8+nЮ'y ky zB,k}+|_h5)qNx'c t鸵 cϷ\qZ�tiƾ,ąFHJLuKߢy5{΋%s, _jFW>�]mĻEivq4){fQ3?k]:-dv$x N6`َvUgN6ec&[eko͢SNfKIoQ|(N6FyN7eV[=qmsfCHqqX)ƹ sx< b|1] V_喬m=QJ F%Lϋ%mMp<vT)�D~i}80b)4 GosZyKY:G[My.򇩳8"z-plUt.FSM&'䑒F5 4�\Y3U}W\f�$ <L7|s0k@ʾ}jv'Kik %[Yk>SgYq5ƌ ]S)Eް3E}KZc(5駱td晲g'`_K x;<%LbHK|1 Kq"TJ.HmJ6]JV_7|q)޽{+9MYT^x%@j&2sc%2MI4 k>2zꮻR~ߎ_{(ajiqT:{\Ģ9u7]wUIDJ%RI #jSk+s67r~i +9d|l 7l>JM?RW] AVAUP6r w\X"/A\EY/*z%%jsYh'1_ a.K%J \0\Dղ8G.d%#Yhpy.'cWWI6ݜk$D{zJ>j]vQug=(E a Hu}Z,?)P_ YS6#V*[NUul˚e&`L~^IxF]|Z?+QIYTEСJ^Bm7|=*E#M >~BtNmQJ̈䬸Ւ:Wbd�1BKoSKXQƢ`_IZN;$@c92⳧QEv֖עJuuH0J 4H:ꨣf2>ܫbSO5`|΢Y}s~ ^>ӽy ^>iuDy'бRʖO\*`�Jc=V �{U~T^\(7o 84,yPpZuux}]pei*S.G裏~>k|UYk~Iukց,5T,Щ;h~6te)RNԏ?WG:8=_wY;9眣<|Wݗ/?QGnEՍNP쳏:Sx%K9?�ÇW_]m 'ԶUYYrM_;cfzTw_9қN釭@k 0JJ@lr; 0Y;w5\" !$ I $;\Cp _> 3=3z{ZNwWݺu.QG5M3e{Vj/pocLmLgb侾0<Zƾzޯj4ew;^<My0܄�쎞~i-ɷ}X6OϽZ<@vqe,{WFƖX4" b@#ss55ԃK/U)1L7m޳Ң.!#OQP ]bKnfil{OfGv@ ,|Ȑ!RK-vک.Ow.7E]j!n `xij;!ӷ!6H7U#YR3Z3Y"y0;-:S2eE]5XZeU25\3zVxrP˘-rko/dOj\{oCNg[{pX8k8R4(A2 +VEMs0=!@�P[YD' t K&2f[FKˡ҄7x 8XF^#R:ZLWW^|Q)I {#`dP'U#iO2q<xH2ǺuwdX th40je3XvZ+jg]%{fa`ubnTpxk}4]`bK#`,Lf_O0,ת`:kوsOA[�9眣?\{キj1[_#Ⱦu +ѩw[+_[6˓>L]Z{3[e]ӚivA&li6k40NYfw[|cn8ۓ{2Y32x≚nz;uP'D .:J<ӟ”d2w-\fxvޭGҌl@Z"OS˙'DeH<wZYK~v![uER䚲 ԂmzǷ;TKkڥ -ܒ+^r%z3N)HkO2$N}D~E d?tpamƙͼ;huύ}Ye{Vjϭ\^kj! S2~{7{Z{T/f?{,;fSO=uF2_|fniMȭ_]>zWRw%9՚y2,N8e9E[J>\apM$@]m]WpeN]i[I+-gu2HJU]GydG}y24vRzf:Ͽ,)Mg:Uwc@7iÓSYf%V!lKXV㎾U?1I/l2E G[]6[B -ԕ&1f#3YL~f߾QO?+)XRTKNM]Kׅ^ؕ,kl}BNW"Jރ0Jm])Rk7[)re漨Iu 't%I'4gqƮw޹J ͩ#ȸÆ h: !.!g'cٮ1ĩ=|Оխ g}+EZi2]lZ J=O >5�ۯkypjhU{o5$`mgՠiȾNû;ЗfH@P?kzɶص`-rK~o/?)u׾;Rή+>+;^쀇&VE c.t)xR?�عgk-4k# lkZ^zٷƑ JOl.kN@2-@ ,LlE 3p tOEB7 YzjגK.:j]'tK,AMG�"$|uZg9Uk54eC]meSO=U8lo:/w%:|+d{]+dbH88}G_|QrMiMMykVn~3wM0ٚ\;x`W+OnƮDޕHdivqǮ/w-^cLykVrs{鋱oHJ*I~~"bbJ#:䓕|'(Cj6+,Νy4*wr{Ĉ vdrwi1]wJJ!.%-7xJ wYTCv-vtgg}N+widU>`|[iW\/4D7IX -vd" Ԭ:ZJJ|]}՚~t=?akq3- oNf߅|V2ɾDnIɘMMs5JDQctà\LeS['nlٰo5<[wyg'h%,f2fdVT_y5‰RGi9+ZAF"<v^{mcZs5hUVQ"DA=ʌ�:(Ǔ_|qe(�wm}WimF)F`hu{"|,bWL@i+h9u>ѧ]w~ۈN8A:�)?zA&.LZo^nI}RZCmtɯRY;Ş(جZkNj)lН}ٞfOvB�;IR$]o錆 Nj:v\s9) y>{}w"93 OjAX>i> PFH$lwgvC؝/>F@ѭ@" lx9B`5|Iѯy2}|Wk0Y /_*}L)v^S#9眥koyyiYz;ۿ'S~bm0Ӱ{ꮻҖ[n=`<ܓo;0oK/C9DK-58yذp ꪫo)(S+f>H)kܦnZuM!Dz?�/|bHz[GͿlAfK{ѿ_0M%IKATTcL t;3B7e_ =t= X3s=7+!p G1v2F\|J츺u饗?̜%zs1UBmEzGꠃ^{U՛@�e7)Hҩ o.(S 76d7 &dDNƉai!V|q$X,Q/"aAĻ0F@,}ݗ)y䑬ߞtI[.Swy ~A ~eB� @ f{a|0Fl|Q+m 8xDM7]٪t�ɖ&YKs4M4MBDM oiD+ށ菖_~x% g!gRMq6@:!Iu9&3^ 7R"Ey^X^Ba:0E�'(MqDDf XY^|q[Z=5d#8p:K## ؀~!s>|<o}W_7~Tϧ#|Ǚ#.s>vs>~7e!ةuWѫ{zvikd+}#ꅴc:W_}5ӥѷbOke>O륨Xp~;@M D7iut5ִx>#.쒂ײM7*jA9!ELBj}RUt�y'FU<8d~K,\rIQ8O5Ft 0_S !F+t >fLAng=2I&>s_g"Ѫ10@ -1<S0 EX37 2d/Y__DZ}ճ�d @wI8ķq YaÆeSO=U8G9׿M$VNl#s+uG)fx`ԋ-av衇j|:,M4DWܙH 1  - .X S5\tj�Ծ0FG E1a?zH=Qf�pA5lDoGyjiYxF. 18/bp剹F3@B̧ ,Q +-GX3މ2rTIXZnF0dk=2նӈV:}dkXm�7P[HJ*dLܖlJͽo#~ ǰI-ҚlY_G>0:zwf&*p&c,)3=,K\f `y6wqG c`%'kVO>X0#c$1#:NNFxw@!am�:$}a)7HW!}7NO};~"tZp_EFgyFSM5UP٩W/i,)N)˯fsHH*;8]tEb)2?m)hNF;׿5#FdMgNY\z ,,.6짯6g#С1B>` @_d|=cbjx!3΀z/ӗ,B#ǙyGc|d@HQg$}% |I6 3Ɛ=34#(08k/gu gnC daԅBV^zI30Zk,`oV[mM@PnFܜR՝Ew9{~kdA$>.d,~xnʠH=ꨣhBLr?gݶkh !|kwooh!#퇐 ԗ)ceX!=ق6z]c@# <SР!b)i '̜1)"?a"vn_3`^ 'dSHw,")}'2U󽌀hS `^\4 A;f6DhE9iX:\iZ(!&,Ci*uJw!WO,/D)@mO;Mm7)n^/;Xzr# qN`�~i dPe"tkϧVr"ϳ>$&>̦byWZiiH4tJ2,RNBzmȞtIYf`i棌@'#Ide7|s\jAI`:묥 g2aC@ZtDquD.d"'|#UJ9#Й#UV:52To_Sjk9ۯb<,l'C f);emG8ϥ{><3}ho}!Ԅ>2/Bǐ!C>~92M4Qv#ІC|9m1G_8$dJ&R<mD#<2raM=,BK#F"B?4[_gН?f"x pDKbb:&Z jDK=DM1�}j"@/(1sEPx#UW]5P $c~Z3 Ҋ?e : zq' bΜ`裥\j0^SO=538Sڲ+\Df"  ,@Cd'!+)T;#`:@Y&^e~뭷20�c92O4(j6}QL٦*'k1:a1D :le+}-,%OK\ #PJ0B}Dzo̅ c k8t8q)+U@�;LlFu~0BDO4Nk@_nG:\7`"HLq҇JE;@KFJ:%#ׯÆI_,XM#W{l?aC?vD"C9V>" v=Ȍ]!8:b.:#lw'tU:|im.ӾX^2?%'e{"h.*4oߍ@ļ ąw(qPvoc=F ǘ1n>᫉}5k{; 6y-d@{!=UJV|HD:5l>=%\F %]�2J$bH{o�+ɦJ~ I k)* '뭷Ygx\[>bk~UW+i6#(|ͳ>Ԭ3@ߍ RljI07&C%ľNF"GeVKf+~  V>ƅ΅q&M-1PK8#`ʈ�:Ol bl)3ISL11q12MY(;RXd#c=v&` s=:˴t( 4��_@f Md$N;플׎;=3)&٩&qQ!xvm7>5 * ;HGjvD텨BFy~k&+{KYwyGs=Xr&i'Ie~6JdI m0C1 #CX,_uq #0H12 h:e>Q8H2 v,D!-8gy>9GucxX | 80eLw2@W4El'纖A ~ɿEv_wouu `)V^9w|g/`J:*K46:%xM7~bW^�)%1HH2o27u3�#p:!PHEc0%bM2|ۭ(wv_; �=39M^z_N, @4z"%191Xb%*,lZO>$c?l Hļ?}*{m~}FJ8H;#PnfѯRHH[SÂLm˕ ㏕Hsy֬ƩTfm!Wu]˲ O孪V[-+MjOoLoJlC` WA z" ̕I7yYg|rupYF #|u'#{DD$p0[7y4 5c Y$СCG-1,'O2FpH1߀[ Ɩ(w110`?8SVl�I#9$/Ό*/L;�a@㏟)_|lBhN; կNƥCwYg頃JN'?g$ѼiL߈<q#"}ݓMqWG/b旿vuWM0zF6dLd( { #aTeƀffȔDvi@y'M/aGf~> $($82 d97f&l6⾟66pԍA(yT, };{@90E5JObQDe~[__=Iɏ&u}9#& & yk5ט7V愃v䳔)/uIJkA#'t WjszI6 =|+DfM9Bpʉ�}ix38?b-D7|Yfo]E쒓 K܎ImT?ݢI>8W|: Ȓs?!!W Q>,9'ҭ]ӖG;Pט1c{e(4`?>XѧNYD:(k d@s[EA}jȳ$b5՟ѩ*d{4NILTMHG{[d<kStKrNe >} +e]6[nA@;tk|me}ފ+5X#ůͪO_]幰_ia\'S:4-eX'#`@o`=O֑S)XO5ޢ:|L>c|* 71m c3_AykbʊW_}"_xblq3ǐ 2xr&*k{ {~21"b(! a dXEy8dV?D}"$-dq'w$DnJw p՟*E!"p *!c>ugK~�>] Æ)][2C!Y^gu2ҵZ"kF'|lH3Ȁ�J6k VDF Q$ωĘ<4dR00G7d t6  A; F=ϥ��@�IDATd12}#FO6l<Ҏ=䟌 �Ysy+3c b`ȶ|Fo98,p nV=C~ҹFd74A6涼IR-l}h+@4Ÿ"(*^vK; 6&Hg;YDR1c4bĈIA(9I Mk>>[ ٔ8Dg+氕-flKE)Ryy.KyHgGO<wSM5U}eJw=W|[)A#PN1dٶhG lc%}l$L}lq`?z^ߵb،`ׅn3}4|NA�W)!}[|{T?Sv Tui +Kg-%Z:Q/}96H]$}{1^L7gs _jK&bip6 g~{ٻsw2HK,?Jٻ#.2l_d_ҰgmOʸG|d@"/s?Jr??Ph+E;6!y+2dƕۼ/_|Ev(~0cM-1ΰ&h]Q ȥo1&ƙhg0ĸ߮LYwIc=62h,a>N8LGA%<BLQ(RnCbHDjwyGь:ݿ:() $mfm}`K/7p "iv;{I\dTK.IY�Aѹ[jM6Ѣ.&_3ᄡuQBBou6rԎAڰxCQH* !QD.Ϣw {tP3}D6LEi l!H #AEo�z04 ,H?裑Bqb?ƒ& 7@0Cv XXY`\XCvH1bA 2 kM6YFя%ڹnh>&l>rGLÇKv_w)u+R|&;^?.9$Ʉa;e_a  ;;zk{COQ[0.o`"$=&"_#h%P~;�ӔpTZ͠BgI<ڟzGum 2-u哖z\l|RQ0|>.1cDuc1F&"|ܯK\ �O܏;H1#cuj/w!>[)ߐ0:5VSt ˰/ئoE.o Hѡ_ŗ<TJ\2殻e]"SU]v d= Q E3-Jݕ@Wd qĞ@p>ݩ}zGf {v˥^:}KdZŕc2Q#M>d'(M92oR Ny'edr|"1_㛦g/-@?P9*1ș9Cĸ%*T;j8{lX!L'~["ꌽcL +N3`=ܟBH2$g 61JatKs n@i29P*Gf!uBd $;Ph%*ETOp뭷^F9%YMIZs5j洞@R ,TIWVD"=ef^ ;J4vtW/ >ٱ/G4(O3bEfxĤ,H>QZ<fn35(2J Bc�wDd*f.(.P)*|AKVAKI_d c�QQ AT 4"@Q3ƞXq)_1v!Zlݚ#Fb(!Ed_j|C,Cd;qa9OwiuVYEU:Vooʅ <Z6YD+ށ_.,-:\~%R S_L"srF ʩ 0f?Pl,+vS鉒tA'h8ť(%_t2}D(;`'·X4*s%tѣڟG:j$@g瑖OU=#`g|`]5R~1G&l=Hc{qەsv> |*} E<$|{|13Cl9@I?}+]ѷCإ`oVSCǔ6׵�&\N~{bV/>5[G8^[B !dM6zrrVJjSaDŌ 2vT❆xꡇuy'eğ|9ak5c4pY;E |<EDn$ j",@҇9uƸ%c\O F1a_,?Rd=2$NFԎ�zS|@3JdN8*ˢ7(> b??#ļcMsKƙ1,D�~-6( \Wc؎{ضޣe"긔z/ s=6Y8:3 11c@^|0vr.{x7dyWP,3tҍweh"2c."rQΒ<l-Q|A7߬?_^zi6PLH֢W\1S|2bHD!�b-Fe%vSͪJڔ&D /0#Dԙ7/V[m5ʚwy[h~?p Yv"iMk)~CH1(-rն9/0B) 9LI͟Ƚgϱd XPaMow(>Y`#�{}+~1d,m`Ƿ⳧|̼\'eFaÆ#zO56G9 z/\*&W.6g {؆aIq O|fp(1*.6sȜSLbZzX3m/;Ӽm@Hj1Ҿ$j@W|@7$Q?RZ6ic.u%XJtKr�׿U׍q([]/pÆ/ы褘x㍗Ǚ^G'tTc9fto>#Ac}>E2BWٔdlRyKjGGlr'󥖪<>X^Y3l!<.1A"+[S;B–�9sbx{<]�ϛB�} 0+f_rNW{gn[*`BJƮا>/rя(Щa녿(Շ V4W :5ɣ=HK.)]{m%j%gQ~]PwNɷq]#Iщ/!9CO!srH#[.o ziE3)þsϝ{J3_wkEC3/a̼qc&el3-&BcL[jeZ+VD>?e,.|Jd"1^0gmJtU̫K U2ƙSK+>|K|1& Ї U׳32^Tr TgBe>h1%r/DggYD&;f?e7ƤDL 8p3\Y,>0B#5U`mtLtlI3ltpG((>Nʏ�{Mk6,ҥIKDLa%wߝ$3D5tPY^%yQX� t!Ҏ;I>!oLpFٸ袋fѐ_|q->y:9;xRVHZ|,t@rWψ@5X\BA)W_H>:QZ`6ɳogDX=F[Mޭ*F(^"ʌIglG}K%,ۭ�r0(%bFR {,+@w9c~GYQnر5)zT06䨘?#`A� ЛE`~+k&1Ie̫"7kr~6AWˏKR{.3OK[m5uݍ@!`"v{kORypܝmD<dRJ(3 wҙg*9P5 g%:1U�6cT4HwBzbrSi"?".Egvb#Jp p�lwЩ칧Rg%b@ȝ|el߱cv8O#P)l򀴖OtƼ/pF.9>ysUbv1o{emCa#POb;X }1cmJ`#] }fQVԩuk|_LaCC:'߹[֢_d:tj~r;|W_ɕc6WTcٲIߟVP"̓Qc~[g}]&Und՞2SO=姟~:# : K$۲~އ,AL #q5rbsB9k92ch 1va3],LpdTǺiG۔MPYCx'y3*K~'P>V?(}5(e1eޞ1ǫ60[q|a\1awxQmrl/1X[D۵":\/5 ǝjc T{y+ǙccKq̱cOnǙrX/l[ lՄHHfQA*&G]bB:\SJ|p !η(GGLI �.{6!SQ~Q(K~oK~5URE2ۼC<g9#eS?U~Z2QcC~'/[<[ >22u4Hv%RA%ҽo{u؞W|xl!I\s͕f-6>AA(L kF,0y`~F&ғIZ,sMY@v[nS"V69ijZl,3Bm&ĕN0E.2ʐgiea?%y/r1<a2行lCHD%2^lWodb,,W9U̡d[fn<-W"; Avw[@cX=]l#Jl#v'k"5}rNR>a SUE 2݊^q;:djrэK{Ņp =<klG6kd@ygsFSw2F`vإ:h;י& ׅ,6KS 6Pt;|3W^YBi]IKm_zaxN?&PQvsb-]A~/֘蛪eL췮oH1?BXDݭ'<Q7f>y/ ;;^M|DzC Cp{R"`x7n͑OMM8&_kI&'|v!/}9%9C)@\mWW|/9!}Äiܯn~cdv{bsg\tcU>إJ?<KmdWPW:JZIXFJ\4Vr[\,[{Wg[WCFɵ%[اYVC .mby7LI+]ye! L]sMcքzEkBb([ Bx >Wj|:|ak۔J!2c]q 5CpL C,*踂[#JA6(fl+ɐ yavQCjeF|,)cs@%}*2+' ,ʟl#oV!�hw&C؎*Ʈj%r)"69J1xC@S-1%g+8v8ܩ]0o>r%ݍ16T3?1Dٝ"ޟ[b6}~W &8q:-1A,cR%t8tL=%jQLl% Lv}t6 Wۦ^tt=m b&&x4z[RG-LA|e"TC8! F; ?};!_[D0-~ l )@+ٱԏo"d!{W{}+-TS-�9?.F ijL�nIE7ʸY>&.Po6_@ #f|V(eOxGr q4|"i?&d^/0|nS}f] 5/F>(Ⱦu1>|dvQN?!#D-MYXi(gd~ʌ\Rm;ҥ9kXh;%2xwߑ#]dgd;50FL` ~?%ǐcᦲq%iT5{rHQvvB,l\c62dwb+djem)m#"EY܎}䓮D}/d2`Q ].{lGz<b5e%rr_,uWq8:#ydU![En(&,ϳhĩgM[o(}ssM7ޑyAizխ4-J+u׭zwVA�RN;Mz* `W2Ȃ]tFOm;]Sb?l(+3Ǡg*ꟊz(3ѻ+cM,)c }S薪E=SG)#uW>v RuHb(blG (~Oa V+UflBB:^;0Bskkyg} 7ܠUW]}!`d2 (vQ.vO>lH"A .]߯d*Aߐ ڋG cbjEY9y^[X,E=%f9acP96Ź?x}QϘ F]iܯh;b(7,i3T`?e/|8wKѥnrz>ЩuWK+zKKַWSZiiԹ>чVWW_-ԩU_MF['*ЩEJԙ$*t`0nI{;kZKZ[Џ{_#edH1JK%ئwLky_7ӿFZ~E?X#+Bv 3|v<~ �H0r)GeB)%uu2F:8sy~*f>MbY7戵$dW9ߎu2_W_혃SFȇj(?rl!C}(}~O8omw- #Ȍ.Gsr2F`L1&Ɠ(+Ǜc*/_O B18BYmrq<qXXex{[b-)'_mLa_qoc >180ĸ %֒%"1TgWm\a(cZN퍀gt|::H}Mt101P`U ts ,b ئGA4g)*/\*>yR<r@.JED*9GgKM7- o˾!{5gy Ue)bPBFGR?{;; ;x׋D:P0F$H Μ�@8K,Dbb!ohWd"7]�SOe,B$r6)c2FIm9"X|,Ǥbm�k"|sy&^8$> pkfB%;WsCT ~e"\X޺B"2E<mҁcC=b/*1!/S?Ss>p :?mT$ 7Rf퐿c"'d_Plev''}](>1Z_m}!SVO0F#~PysO:#IW *`2gzGFDDFrdȍ?dJi d/GʋȈ2bȄdD佐+˘?zuJ''ΧGΓC[M֋}ۍ9Cx0FbOP Cq'#`0F5(gFXˤ.R6 Ik]:-%hg&�2_dNkhПFhBGŲo(+7C*aew ]Rn)W-68t+HzG/%'I_/=G'ƾQ#v(#_N'I ;}G�nǝZ'MSzOb+ƩɼJ{!=%󤣏"'%B'#`��/$Qa[8ϋ(1cWnr/xE⾘Q~ZiBjc܏6G_Z܎}aKee_KZٟF?K}+5܏~EQr0C 6e~?^v\ Gt=_۝nTI<Ok(?_ŏ/>5_Gc;bZmFjѧFY[S~5Vtѯ>ʾ?ϧا\ +RUx"CVZ}m%wX~&2Hv{Co_cr->ȦACIJq|ЕƋl_~5j%~:}XlS"omqPoBc3Z[-yy2e1Ǿ(W?C,O>Zr̿G>6(ʋ?)tG_G~/ʎ8je緘#;M_s)#ǜ=(-㷢o#P/Ȑs3Q_Nqr_wc cia,cLiy|aY:ivǛjcJq_b<+G-PlG8cJ'cIq&ơac_}̇:PDr1lXnJmj^ݖNcwH^*4\N;IﯴۼzN�$E]O eq cM7i>x@69q�/[�RK-T U4"[?>dad N/m;6Lzi}!_ )er*#.JּNF#`0F mh]ϖ~#騣  3A|> qW[ػ'öT"'?9g޿Us#y@MrR8#`0-@O-҄U;wdG_^>TÇK뭧6T>0X&d'%?RЕ׿vR@�n.|0{D�<Gњ p@'$'CsߋN~{irB7%a:ڰ6 l7ͼe@+ 8utW\͑;K?3O[@#Ȅ?N:I:QW_;mvuo;NOh, 񚶆Hv&ND"E EYz#&06if`K#FB #`@2픾53NF|][FWXL {=!lJAHv?*,7v0%F�"f+q]5#`:wߕ.Dm7iʣzw5wݕ2$}^~9'U g9$C8~#`0F cC O=VkE=v?)mZ8{mUڴFFt/ A vS0F&p!9 GE|rJ z]1F G`ꩥ3ΐ:+'(2.FvX:mk[d:E8BgV\1'b#�_}LO#�=<xf)r瞓WzyH?!#`Zm!lQ 㪫JJkl2'%W*>0'ҜFW7F#`0F#-&`!9GK/ߛ'Ҏ;J>+W!dp8d@g  ;YFb_"'|rE;X# +]\ď==?ω+7Pa1GH3F#`@ %y2,H?,n3Nޞ>k~~K骫y $j8#`�G3T+ZF#`@mFߡ?X&cMϭ0eMP5'#`�|8yg?i=|U#kҹ;>!0$oh#PJJ)A=lX^^Nǥ+e@x%/r;&ҷ1F@؆kK?_^}530C�[L־AoE¿i JK-%5z%hym_#`0F#`@0d]vf!W� fc?Z!FIԋ1_>򽍀hO>)Ad  kfi%&L`馛$T.Dzms 3'h0jz$|IcIkzp0F#`�8:tTSZe>kaL9 { ]4'zF'/`d*#`hgL4{!0 ח+UVouF Cq[n)}eF9FtRik9#PD`'ֈ#m@#sϗ_ӥYXj<-]}#":k^0/KtM3M#Hې^i@sPqKtyR51J$ONE!eCKs){>iwM 7أi0F#`0FA:ة9ƒÔSJ+;'aZ~yF4 W^>@w2F4x V_]2DZy|rEQ,~X:\`Dw^'} +H#`0FVEG(o5DӮd$㌓?%H+>{]`s&0K/I3nr{0F7߱(?eW$so]ƛ0#`�k82>TE୷N U:rh ;i4D~N9F�C|  O&uu@c\E#`sMw2Fx)s[g_n_DIhw-4Bˤ}\wiۿoj~|Pg?^xYCOri<YF#`0F#`M_<͙m6d$K-%m3婣kb@}x:&0 'ЈN"GHXw\Y<fɫ_{{F�'> 5D~uK8#`0Ftϛan`ApՕWJ*m_K;#`�2>D#`,ڕxB=[a|p ?YgWFԂ�68G ?I\Yk:FdI4bĈNjj:wEv?C87F%zcqÍ@G MvDSH#б<@N8<ҜsJG%-`N J^>Xp#`?q>ϨvQ|w\/79dW\!2ҵ>q`v~ (Y'#`0F#`0 [)D�"$ /WXB˥'0ROz\~8thF`<qyҏ~@21%OyQiD=:D2ǐǏFzi; #`0F�A6\%=7-NZ%90鬳ruו#КB^C[0FNED>yL9*&K84t4J>Ziw뭥ޫ,gGפNGo/Ft)Vw1m�ď{,>X}#~{ڴn` $A�;~ i晥EsV[-}7S֒}#0rޯKSO5gq08/}a^/Wyށ Itᅒ5F#`0Ff#\(Fk/sƞz9Љ'J^/xǍn@ -LNF -5SM%mG~]骫aä9Ŀ9D[gܠ's,`-#`0Ft~*mt챹1HmtBgeҫ%z%F,F#`/J̚jF#`�707oVL4Qr曥WU|0}EӤ<hK_F?!㎕#`jE`I&ш#j=#Іh^niUs2YgXBb)'#`ZHhm-_Di[Nji-{XS?hinko@@�!OcV 7H5щuM7X|G?.DZtQi,FפyoWZ#`0F#`@{!`SznM7sg&ߺۍ>z|i・#F!˚.჌(!,` +*#PzX4<8 I'X"RK勜3@p@ݢgZ sKtt&(r0F#P\63 a.>y˔_\> ǮLs]hpZ:VxZ0Fo07X,cQ1+9~t&f :9'܌;OH>]vF"�{[Fs#ޫxs%7jIg!~ 5U5F`$Cj"ȑx|u)5I!7{q'IZa0-K묓 FJ*n,#5[o7ҁJ=m}>^~[ou[}P/~!'U.#`0F#`0%GD%@^~z闿̣Lvy:x> _ϥyY[kj݉EE#`FE�;.S܁h >xi '|W?.\�#^za;]_#`0�퐱OD.Ba@geYNvҺ憡NFZ0F#`ZO"tW_I\#^{IÆI9 ])68s;# #F>DyKg)t;KSM%mqn7Ytm0(#P'^{MSiYtA_#�J4&H/4Sf}%0F�92gn!'鞷"̴9)CIoh rb]!?|:�Ě`a3F#`0F#**u=@YsOS2KAcC#ؔ0 p_KK,a<0F_^wyQ-&m]E!Ss`!B:X9w]0F#`ʆ7M7H6s}]'Uc)jqϖ_cGNj~N|7f#2L #`@!Hd:喓FM6iw3'>Awn)_)]6۸frF>G׼@'?XcUJF  "CHK-VYvzp@�[[Ҭ#PN `|?:tQ9NFf# "1?,LmϫJ/Qy {?$K/9$_c jr fȉ/:'gmiIsjW>KiǶv대0F#`0팀 mMA�?AqGg?]QؔJr~W:<ӿ҆Jy58|';#`@୷˝(yGi+'}d_uUiIU AfM"b +40F#`@`N'�Ii ;i>+v] wK.0t2Ft/Jݯo0F@b_~u-c-Y#r%:tB ^{zt m7i㍕r%k�LFO#FДSNiP0="0~7ސ. XCXez4F`xui澥0="82-ycKk?F4;Bl t Lo7<vbhl3}+H}G%'(N(77y챕nЅGf"E&*~եdcX؎2kM&Q(KСkmwܼnJ`',ϴ#`0F#``#`?߿-~{c_JiJ"p]s|I?ڡuki~2j",r{t~}"${-43l0t/(|h#`0F"M 6OɓIJ'Xxb0>e6-;hwpivog0FkYZXNG`A'I}9F-p-z"'#"tMߍ!x{|0# g;/'<xi@p[n)3Sa "�, b|k#`FA'rGlx '{qذR-'#``#9!>%9Y`-Ǘx jM>XzMw_ $i߿"'lAXkE%-`��@�IDAT drF2khsc2H!)~>U38fm,09zz+o+fJp@!|r Rj[Cs"6F#`0F#POLYO4}E�EGH*xc^묳9G/sbK8#PP4q0�P]?R(79J"M0AgaR>gqu]simC5vd0Ff#pm:H-vn$3U(0LҜsJ#mriI89#` 0FHm|-q; <8 qI֮[l磍h [oo#TS5>j{ �d3mr+`#P$F._z('<l頃X~uk[7O>@xҘc~#`^[z%[F ђǗnDn!$>[oqW"\\p\VC !y{<w_^FNɕYO$| .@}ݛc# -e0F#`0DDDjk `">G!iCf*F ͝xH?lZY� D`Zqm[f@�R|W^?DDe+'t$-,?2E(90F#`@#�y :C }`՜ :HϭBジ㪫_ZjcwNFx";#`0 G}^sL9*&}oϤo[ogC4;9};G#8N8AZpAi{úLlI-qݍ@YGduClta{KK/B~f05#�䪫|4F|t9%dj"ot)h:�K#Pw^|QZc ~lYv ao]w.8}ѢF3N[[PIaHs${o?!%Đ=Jd0F#`0FVƨ@g@`0|K?qǗqgў{FAl 1$N͛lRNFs:irp-5�d7ܐ?B.BfIGXP`UZ/~A4KggVyx0F#`C +HL'|r:kRG8B~iphjkk@cМ4yF#`@ `BQsd^?"HpBs2FL8a"pQG娙kQ& ɠ?@ebZ S'<F{r3\w#`J��H']}.?V[-'pCmJmsI;Ԇ s@ _ӭN._im ^dvu0@ZSH"M=uKr.-'tu:ZWbD@}-=x^x "-hN I2ҔSV^#`0F#`HqsΩ<7W뺃qI'<RzIi%"[cE'#`k\sp# H¾|dƼR@6&lUx">fH/i1v!EܼF#`0m�:4wIX6tӶi@B@>U I?יbd@σ #`0F6A~Uk L[^GLa@#Xb w[zFnE^yEc<6NFI[ߋjFc)t9!Yg~\y2 , ,'#`[oI| #'K[m! zytgksAƩw0Ck%@K_I 3mWjW$z:>H).td~(uW{z%&HSM%=.Ho1Hm0F#`0F|r@ #_JnȪ*sS3WXAZ<Bȃa@xM{n|#`�29;p1(2҉'J.}wN* /o>H"72=-5tcu}0F#`@ {}s :[hk%c- NМsҹAom@)rJQW#`#$k2ִ�5űԗDֹ>f!^K+$H�tuI?44c3'kʆd) T\#оw9)QGFD3)Vn}ܲ@ /:`4�Kg-1~M>Itֆ4acl[e@!H뮛k]'M<q$^tj-'7xs|q56%K /Itꫥ֓x@9)C _/(YC\#`0F#`h*&l*ܾY' 0dH XʝQrN^!kK #PnWRLKkQzvF|.Hn<z2䑻VZIz߷>+xOY8< 5&-=ᩣa'#`0FFscC2' ;?,~w46*McL୚0RR)I@PI!I#" QRIJ(!yxιs{kg{}^|1p%m:jD #MT@dZL#>س;7(&o@ժ-E@�PyZ:Rl5 C'1O(Y #U5A~~LX-s 8<bEo_UD@rGB դE Z 4ibDGcq lܱ;3f�z/qD`^W/kWsvCN@J@s9%?=|c[ׯǍ7ޘ? Qw>Æ9aȷ7w|<'L rp"" " " " " " uxQH<$7Mq8!D0$ز%UjG0P|E6wtb h^q@.(Ҹq&!IҀŋ wk4k3pM91fF<Ɵ@7�oXSQj׮|R`‹]R/ԃ4 >OS'*" G@Bwc!`RBiyۑG:AG&01+%.1m'yOAƍsR% Xz+p@:Bh$UD@D ? T�K 96K :+T{,1)`|@QG{&Lp,&Oބ^ӦM1p@[@>�<Lrۜ+�*C[nq1xݺv2E. 9`CM\r67]�g"j8-" " " " " "-&.m,ȑOo,S.￉[G�2k#Yg9G޽#3k^ 0ȋO'U Zk(tM!NmsY8Lq5k֘=[TQHzO<ᜮMN9f4[йs� '΀oS�B|TH.Lފ$ A=L#7>[X;ν@lR]0&\U�{ 8TH;9)"7J* TP!p =�|K.ժ9aH rQ`FED <Z[,^섢N?݉fp[տnݺ&`>_0KD@D ^,ZSmȴ|*'TK 0w�mziFgIv-0~;|ǎ@ٲ@6{it0<$P C@Rh� 'HͩO"ْ:tl`RE@rCY; h"7h_Hط3wW\YCu揬g^x9f>4BqgE )bMRED@D@D@D ^w, SL޽{qW?XBVN@tQ6:" B`N[RXHd<J Prba yLp6" I%:v~x�6:$%KJ29Nz)qINGˁٳHG w̿ظ1.F@bn( 0>c8O|&@sF:"ŋ}f͚qs5YD Y L~ʗwTY(]:RhСq@׮4j(nEz/LOŊ7�(^:bll &5tc muGD@D@D@D@D@ hxA`J7w݇?ԯ2Q(TD@"@`D*" KΜHzਣ`G+�_ ˔&X8t%@"[g ʻZKt zr6l9`)AFED@D@D@D Pv?`e= j s�M% & W#͎1I,ᴟ,cL""QBCHQȜi9q~ω A2QED oZY/ <v:֭D@2z*5@ 4?J^r37 y6 ر#;@>7 Az6 0ć={:'>˜O?=6n *#cƌA&MV~GȢ\ MD@b=z8<l͙Y6%J(�5'gС`z4}Yz5On׉](IRlX̏a|}vsǎU�^%ɥn$Tr&I[uQ@Ŋm9gON$zaJfT)Ųys`D'#%Kn1T@p۷;+8‰<R,<CN-V57sʄwnp,u7o܉u[ED@D@D@D P8^p -ѹs""HBϷv|$yVD 5 A" " "L�y۷>@@ .\8PF*" AF <{>6'`N/D@)sHްaC#@0!^˖/SgqeۻD @.oRFE�}hz gD=׉Q qzKz'5^zᦛn2?;,L*" "-\k'|n#эebrsSIοR#0s&pi9zh/^W)3  ,]DG�nuWD@D@D@D@D@D > H2>ϛZGwgF粩tr}`l\sYv$$Yg&S;t,KVNG<t(�,rի]t<7Y|ԩOԪx,v10Cj>}2n%" " " " IG`DQEǎk UаaäN�kW8[6 =/3y�hRpPQD8[kmJd4h$#˕qU@`ɦM@% 0~$؟@(i07n4UFjQD@"IX1k\lPn=u |#\u_u=jZ+"}U2E ?XZ0-[ؾ? 6Ы"" q@},�.<z7-yMƨFy.0m_3_=f$. LVʙl[+." " " " " qL@Bq| 1%:QX͑j_~ 0 Unk'@džW_n9@,`Fq):vv w/ U"AQS۴~ٝ^:ۆ<|:D@D@D@D X0лGsv1q칢lǴhRq0%|=O2�}0KED PRz$" " B yd~J2=}g{Gz;m!"[Əw On1ڥD 7�L˰`ׯE@2'@!ȽfLmn怴TD n/>|FwX2j8ύ+8ᅬ"`E@ذx9E ti"L3dl@[o?><"K.5wYG&E𚤭D@D ,wI&Xf@pBXb8찢_F�ŏ<Q(ӗ^z k֬M7ݔ~URg b9Xv@t=" " " " " "G$G'KM__ 4o&~ *Y,ǎ=xQV8շo_4qLw]Gv!%P'SCZ`'GՅ ٱ,Yr8&ܸ ]&ㄫ9UD}'1c L4ɜnJgk[ѣBa{7FӦM-[&O#-;,툡Cy`Yvi~j̙3Ѱ2{xj#" " "(�Iq؎W-æMpue\撼)ٔ?ڵCqךC -MyA.@>p;3p󲛱jk'g^[+v0 c=j�NEA%Bq[yTC"'ԴD�)0m0aBdL_wF'|$Rud'PT)*樈@0W4_cBxSSON>"㹻jÒcb"E&[;IWxi'sE7olY'1_D*nkk׮r%+8SN ~_WU@_ݺ�p1LJN_ŋRRK"grVaݣlRS Xb/VwB|T꫁~@T !xU$5X,/鼄 cDO'd #F$~_3!Ez8Qۥ LV w�otM0?q49ʾ}<=[s<1pN\ʕnRAWt6L֭L 8&?nːwiEQ(zhذa[Lssśoԉpj35aÆYxwq .Hc+̞=ZX1=} ի J tfql<?cVD3`1" " "$m:Cvfc3Yf8ꨣrL$6%6<)9|'7oy~L--|M<xnG>I;hcĪHc<;>#U+E@D@D@D 8 AD�<τ *GRMg?`)e0yMFND渒%jtc{9H;@ɒ%$#|ID r , ~#]{ 8X'yի#51`ƪ f0v?~M 6 {aYV"M'L@Nfv3mO}S@\.Ԭ *|5@Q(sa A~wSڶ7z4, %S} 9zau<9bdgx<moqX8>-&R/D*'?%E#� H; Hx�vsTgskjL(_ o~@ӵ^k4-f M?X[ÿ r:Ț�EM|GCN̤ܦ PhuhM|K1vܤ*m۶u]aCi3бx},,"oK)h)-B,,E_ow)V~o۶_6夾-bfozVJ83b}!x$=ݻae@˖N/=:.Do\h۔6m€|re3&SȜYiSl׮\�])$#6_ztI?vyF$ !<oj@Rz# �CaU'KxǻQ5;~ܛ6֭a#Y %D@�-dz\@ժwĽ@s[nO&V[Oagj0i|&p 94\G|EBLŊe9Wٍc(R$<Q~zuȪ^H Le3|̫mذ?ᇇlt w2ų*#GD5pg$1V}$?2+&d `lD@{:"MX@HU_Q{F&I KT)_<:` Bg:ema~r~`bR+@GC)}*Q9F*VM�@ PL׿P^֬^xE9<v!;Lw͌ٲ)NN޽e]]I&e[1 xxlCzvviѢ6mミ3uVM7w-AqHf. VJUBCvwGw$'&G31n8-[͛7|l, ؒlrW^y}IqX"NEѴ)Gd,t^3+Q#Y4IKBc@J" " " "(<Ys 7\~yj…]  y+\:Ff$"u)T HED@?'g"ɓ&6Dm7[$gmV:4dB"D unՉR`駝�Ǐ]Be f̘b][ŨÊ@98d< &ա͛e?<xgwf/„A{Yc<X{f #H/`*"mڸ} B~-P:б#'-;sKPdE@hy"㡒DD>@8>bLMŸsN&}  tլ k Bz׮]q̛7;wp(Y ذaN:SQo3n=Xk??#~k_ LH|ޔ(l32^ݻw[*No]w97}1j(y9KI7|z gM6mTԴ}#Y_EͬV ;Wۋ@ذseΙtL|ʼnkb o%  Ȫ|;v,~G`>Z2՘0a^u,x_O۶m:fEhJSH`3'2=4[&M+Wo[o忟r)iyI'_{5ziE mLqL3p(y[ n)y<7+WW_ۧYyiF$mLsϞ=`zT?iSQh?C`L>{@{ィRexR}(š~SsR>mۀ9e]ysO88ӨQv;ؔ.+[-C*Ŭ5 *.+Z46%d$\&&0}vNxNFlPc6֮̎Ue&V"1֎7VD B(I1iD9FD@D@D@D  ԫ̕$Kq9p'Bg?8+Aけ#Ν[z3?Km[򜨇M<"@9ña*" "hXgE嗝0$<L\ 1`6=kޱ>,F#c׾qn܏&|-[uJp__�',{-Ɏoѯ*7"+[?C."L8I ˱[[m!R6n4JɒE`XG^ߑP£LmQZqio�)g.F;4'8"@B#QE@D 4ퟙB F"Vڴ<TD@hN:v]ݷM*U<<_?۰!g,gGy}ާ~pWD 3k5Vg?|r YgOߛW.]j=3'aÆ6&8O8D$=Lh۾}WlYc &:?s<+A߻k<hoMP+Yn:D< >_}i/tg;!_}9=O%yMyMz[yyZyԩm[rI-ޫU]}xޖ-iأgO MիOz ݳO6ALĻ袋7z?oۅ? ?؋Dfw~;F!<Mr ;vL<_^|B1[j7tP&b\Fm-u'z7poS7&8Уy֢]cτ:X y&7mG?Ӷb1Q[ĶS}VLv#/ڕ;H٦A9;m"߳uuʆ "u~TD@D B<zJS6%m?q;pƪ±)YW0[ jKYf Œxt⯋Ms-C#l%<ӡJ([;1plPvlV)S"6]iD=oX#^�DGF8@;;qgغ3w ϳ),ˏ?n)ow'KxZ!1H=\9[6c4\oFZsg+Z*ڠ#'&ٟ9; 4*" " )8/Ёڵ<őGz73F"e}e0b" 󱱐STEvv.{uJrZ}}]ΛWؾp|@ت`>Y:S{%@E 12{ۈ]76t_X!bq1\sSnX1b<o׫D@�HbmFD@@<`gߠ糼=/:Z0+r%U$&_uAÆ%fr+yGᙠgI2eɠ?3e9sUVR<]cp |Zlu)]VGu/(_y|yBW1@ X -{Wti_lP7վ@xF6~xRӪ2pv"Lan9Mϻ<.L;nrtŋCX|w衇zwuW3f#\dM<mƏGG:O)w}dsSd^[(l6ETOYEh,:p9E+#]~zlXx NiF1)ݻ_.o+Xlٲ.1c(}F׳`x9昔}ѣG2Ԣo__`6Y!CRi޼yP:eC}:J2u�HLXT6%�"1 (=6UcS8߾PԶOxc`+S3MɄ0R7%>ө(y)jwWX$1plpجlHyC]SR>TVo C dd^;K hcc続?~ocX[[4oX`Ik �]|qi|'\oZbr͜?Q/sv~:,73u3L 0\{L(;cK6lOF4`BJ":j.8ԩ׶gΧn]c,/侩78mEV> U "ow!c̒{y=-\"wLRKJ4s2e} p> E277L'IV Gx!Dt@z꽮Z 9@s(QcU�w  ,[x У@׮A@j(`8SvhР-_~-JYnJ)S8SS|ɰ,lݺ@^~eؠ馛PN a׮]0H_%gB z�${Ϟ={I+'N%\LƲ|懺u„pc̙WuVT/M1+z<h{h;H.̙t y$к5w5 Xx5ફ`E| L⮕Cә<y2)& :t �vwS*nb(_<?LL[6D(cǎRJ#,QF :4%J?6J]LTFVeǰ-F˄M^x^HM-f߾-F{%`]z~=X_qWI&}ѥK.Kz;6IĚ`Xf]wvY \@0F;m6!œ왥3L$Kj[U)yPPbBړ9dC_LiSriy&B#|h īõc#5ug$%"78cS�="oD6v 6p?ϲy ̑E/&5"78UkӚ6 <cj|'\~Z{1i*"�}e6lؐqVG૯�s�}(-恁ذ<BfYQrp�? o7^/t'}tt}H=Z֯w|<꫁ksG?r߂PYR||̘Ei@,#X\ `a:@ұ2`˖~Cv',#3d+百tSYK |5p5i[( nʕ*Uq"Eoh3&B~Dx`]&" " 9# 3+ Xx@~=)xH*LC>6 0}, x8pZD3<DADEՠ?ܗd;ѧOs?" >/+VDf|a�P㷅bFlxׯJ۶mBE-Z@&M|Gk_zsw5�A1c2eG[@S'NMQ8+`{BÅ�?M;A=gK t1wrWi ,9μtxf /~G=֛O`Y`wn| Y( =k,̝;׷wS@eҥ]XwI,Qٟ`RzYϩ0.駟|A/2fi>-FgyYV@-Mwkfs OS}a}Y_Tr̘1O<a_W}ש" " " Mv3%`ZiJ8/2=3V`6% :Ci$?96N .8br3 '! K $֡ln%+[;Rclp@.yIrq^QGO=A[_?;m^T @2}98&F=w$';un=#&PT#V3S@H +0Ӡ h$uugdžes>9(I!> <q'<v`� GE3r7n ҄{6}e{g k{bD>~_Sg&nj=%W{ry݊۶mm}a-oon 3{'KXp]N BqO> E.w|HN$s]<in-":8ϰZ/" G`{xF $3_g:zOt΃4{@ `pO`^dMਣ.tM,0E!'rOF`*S +[lpn)ۇ"Lsbˎ;r6E%Q|{﵌6`ɒ%xqAvO}Ϟ=XTSFc8Ƽ2"Ѿ4 \\`F# vpm"I@ժ~l}J2 .]4E\w]wbi7)0k_w4ifMݼyes=ߜKjbLdR¹??Ґ/+P(H A(Q"?wA.+d夓NJ8⟃1K}b[l@SϿ{ES N:x饗׮]ᤸ#i+[.;zwe܂k\[D@D@D@biocgό ؔLѮ];bXU@<M#f ܹ3=IbցBۆ.UMi_~1sL%>pfESJ8'sbgs ek}׻5f\ *" " " " "�_|fҹU.9ɜ@`"Z4||3Δ}n6V ϖ" ڵk3[e" " YK4l0V%IA[\td‚`%;6,<en�c Es��@�IDAT+7X! R0\Q"p|fw4;؞pEss~_I3g?|p(T=} EHE@~)//Xd[ou[ .Nf;Vsp֭.YRA7F<!K8tyJ]INΓ?RLJ`tB`9%-'}d" ۓZQ_E@D  pAez>)p2 ATD@�Ǡ8أs\j)ɋ`^fcn|~0~`=\LQpK:Tۈ7|۾}|1e QeJ0|p_8e˖[PCܰ[nXjڶmM}Q8 8Lsv=X>lʀV D PT"g wn'0dRAQg3`ȑ14q 6 k)osTE5ʿ8ЮG dvPJ,i\;L ׯ()HEۅ"|Ms4[o tMwy'2R0%370ᚕxfVm qwq/>}EHfʙA-͚5 ?QGl2e0i$7< \\+E@D@D@bcq6%)((MXUƍCڔ7-DjO0+LTBիv￾MѲR4%))(G-z7i➕ "nclP?"Al_ED@D@D@D@$S>< *௨X"d6gx~%@ 0զ\}i>Ft-^ pscq)"[Xn]n" "/⋁)S8bXc,2'Έ(;6,?`FZ9_ݖ"q.M} KvA5U:rX<V.Λ7τzMJNP^=]af" yOa-YʼoIxGܶm7ט{='�IsɰO?=sz~{ 0.EafhaD疶Ӱa|UYD  H?"wz"qxd3T?rg'K3΃4'#-.Iu9 c<3/ԧ`I)쥐E~Xh I xxϳ·F x˗g~Ϟ=}ssx as ԩyxҥ~ 0jׯŋ L3,I(>ANAAPw o;Y]POy8`[j$&:QU+a[' K3H̾W''@͚i&kW}h:ޣcǎ(E@)f͛QF=W^Iٕ⊥K-htb…2dum_}UZ*s=z]w݅&\GA"P {6zh-&x%+9)K{*`٬vӆ*V/v/]킸ʼQ}Qn�a sK@6K]a\7nfuBplEcc ȴЦ,RĝwiA4ؔ\XU(r!m!ڇ_|EHc,hlJG5cTѴ)rlo#KY&IQO5&R%qHylp5憢"@PB-[vE/Bz/L0fKwwBy{P㥗B:@8g{m#" "5 QOcJᇝ%8_vKZC_(C)kMFw`M(]]_jIhXΫTaU$�s8a\ #3E muɾ7+>tP`#\5D'ȤV;1] rٱc ,V|??D/�V2)$xq1߼'J.dn~�s,~݉hG飯YD H?"H/GD@Yx:jk�ZJ6Ǘ@<*y fo?myyO<yexay{ގ̙3=vi +y6�hg)&M`ӧgM,t38_< ŌݻwٖuX {p ~ ZnY&嘁+W=X'z&d꿛wemd֭XgbG{-[xzs ־4G Ի~];`݃mu",p~Ҟyyyބ ukbWzW_Mwk~9w{]|^5kL<:e7z&r!޵^]y啞/{&͞={{&c̞I|1C AR* +WNio݁w x Q"#FVG63Gm|{HgLjY6rH͟}g) *U͙3Ƿx<@]ժUcfO=S)xmń}eMXD D>ݮ˦:XveA@dM*" "{^ZYװyf=$+MɽCUcSl!N1ڝ~ 6)iN*oѢ:91=>3[4I1Ϗ>(]8יٱS 'cڑJRA`z[6kV4jW"  $?G{N6cw…;#^9?%3Z&E\мR<gNfsqVl.س\ϳa^eQsvܙ@X,d6N=}Tyy_{ ;\m�]t-p(]f@Y`nU=3Wby<?7,SX`,Z#dM<[?r˖5  :贰ls0x6vӭg;w)7{vmr~˗U4Kǜ>+bJ@Lg`';ӧV|'PBpc|O "CWd嗻z^|12HgI)L*#mC#�\{-C6~֭[aBC0Q [gL˰2Ămv_ղUA 3!vKYc3Sq@%oߎ;,(]vD`bE0ѩ4vm{7a#c"o 0K"x gs։@bXxu5@@ŊG"춈#ǀK/1֮]SO=ÓO> Cٲe3=h"h!L�0mL8Ų/3c EIm^ܟо]W3>z`1336khoow<o36qm=mٲ& LY6KYMϊ+ӞL_\o@H,ذ(_1%:F K0`6e8c'ؔ2I𥑶)._}ԬZ {.PBx Ώ_נdEooO?VZ.")`Ui):'dl vY'^)%m??{&Nݚ_~m6A*k!\f"+%P5 ظQ;\o$ΩMaC0߻HԪ:D 4_f!?3-[uߗ̎e" "l,&OL8{ W^;vdC)dRr7. LMs{Zh{xk8ZrO> xA{t7f꣮=j$  uOg_SŲ}m,J(Cw_ 'cwt,]/r~u.K72s<gOu^5p衑[@3V:b5" "]+^௿@r3󚀄 󚸎'Y;vm`(MiqHV9cݠ25 6&v3 \9麯'/8g BM%i~!н `�h_dFff(obl BCHD y%Θ+GA{cNY9*նAիsׁn6E6u"1ԘiibQ_X<s]3MSCD i PI+8q@$L& ': w7xe$H{K(Y0~<Ю]ڶ\GU lv$ vc [q+{.>ʕ.qL@9;yL^jU|m?~z*^" " 9"06 S*m[Q9|LsiSI@6X.xPPt ୷|Yg-mX= _bAO|g}v̷Y HNgݺA[BS_idÇ>|i8vUAwhذ!/3gN+޽1wkUD@3|7" "K AROq8ܒtlf]g.i3~6G4j,\4oqP0zu{2sp,_>=b%ZEy?0pD \? P;s=~%^Ip~ԩzB*鷊~e}=_}d*Z:t`Y/xO%s%JL"" " "LñD )(W_@~T1&}dtۃ*Yؽ{7I _<h&@^QlgK˖eH2/X" " " ",|i�E4 Azhk&=￷ L t#-$cȐ!~u0?7?Uƍ@O39wUKvXm%"  A`Æ cY}_/u4�֬87ҿ?л#9h�0Y}* i<l٭&tQM*xK]_i&i& |*\x_`#ʕ+M`qMr>6O&IxfŊѶvX|ۢ YYσ=__viESc8Gf͚:OYc@׮4]'O<[ϢZ,"!8`֯\v@ςlU D@B t2Օ'0h@={(zpҥ j׮|fV`gOcsF(4|rցyD;R*h}^8|miw,A`:qENbV}{'ʛm1=q΁tԹEwPM6;H\g4 O," "  I,sޚu~'ٔY & i]T(lSEH! qUZj믁͛3΀DD@F 8@><ER ?<:-5,Yge},G)K*ps/w'F rSDAZG5(iYZ[FVZfͲY6o>ן hCG.,9odv39(X G`K@(YriԨ! ii_?38K.A\X}_~z"g0r$Xgexuࢋb9jLc \R J`^{ X ĉ6e[4.\(ܠg'V7bX'ڭ̾ww#@~DaOD@@Rgסu\ixV"B*{_yr4i8)3K.#<[v"hԨ;;4nNlƽXKG+#Ke`vH̤Ϻ ˋmN3LyA)NdB;T.[2㏁Z,"[޽_r3ֈ@|6 p9);:c#$^ nի#߃.rxrʉgHb�{Ƭ*" 'H_;\xeH{KL rH{ zʭOFD@ѷo_KF^<\.~=̇~ 1v{պ%˜r6>`�3hOعs'>S_r9|2 wAS{<4hc3ᇅ,vh*+h pn1*"?;W^,�7.Z4." ")LB1763ۀs:V^Ӿ93c܏$/'.bvmaB 'nԲ!SsvFBDrB@49}D@D@! p(id$P ;>@,hMhrtXnilc5'l2|ٳNJP^L;;>`ǎZ8~ ~{L'JvJf̀ի]f͕+ݻD ^U,["٣E@D@D@D@Eॗ.sb:F2lb׮dWZՂ?ѣ1n8pI =ѦN*" yK py{LMD@D@D@D e 4c?J�6mʸ\KD@@>}CI/&ONjO֭;r M"z.NtXvmVD@D *1eR믱fL8aN، :> ?^bFPh(_쳨4K){?]P@o0';rˣ57߄ـٙBT|U)" F`r+ Ɖ-^ 8"<ɻw SrO96J]K1cG=;dr^/95㏰8~E $*" " " " " "  c@%MwZ=tl60~6T+kX4Ǝ8"".| i :ה)9;bfckgn+T{"t'ty-Wʕw@"<舤= OOԚ;w~n5\`VנnuȾiD!?d֡D@D@D@D !p>\9`܌aƍk@bׯ/3fLOs& fUC M6ms dWOGqQUED@D 0F+8~6Gx WGٲL: d" |1o-L֘$J|nsc} Ԭ L�>c5KnѮ|=I:@Rc{(`0sM4:(O+)ؿ!C\*)I X{N?٭[y`I-%z]e&g\]{D]D@D@D@D@D@@x/H|A3fRi8DeH"ѣejB|;vԲAF[0|xcs>�.$oۥ%>ZTwCM>G_v6]&.P¦wߣwztg1. ?}:@ fMsc s#tK=Ӽo9k׉s; F�<0guk/0@m* AGK[&P>^ ~8X'п3Ջn끣:�W] |GoDO>f8ˤ}0@Z*U/[ݻ_~%f͚/6aSMhN:l\}uQT;y w{!>�f̀ĺjՀmV:uz*" @}8d$rkaW�˽/6pXD7QvCƮ@^<}Y t␌O͗u x$ x<kjsRZ`DS'믕,R'yu^uU/_IJŝ-~M$ ֍UO2ؼ`N(O!NG :X̙MO;Â?jqby:㇣v" " " " ":96i2[e!@!]"SWreiذ܆ѣS_ -kw%`q*" Q"@jFZHh4ܸٓqw}Hlg0a0xpW{ob9/{Gq2 eu,h80/^U@ 0^3_Mc&fϞ o,^<?Pwyq)pMDi"xb~svzRJ-RK+�oƾN?͉?RJED@D o ,Y(@Ŋyۆ8V.G~L+Wv+Wv|_+Cqq~ɪT f{;G?VR?o֊@G'Fqݻzh􎫚E@D@D@D@D@D  H2Ϛڜ4y65NnYGX4?__6b=}z{,Xp;:Bv4A"~֛<kP6lp"|:~ga@f�P^@w\]N>0tF3uTD@D@D@D@D V PO<-Lv14TrGxx'Ѯ]; *;2)A=1A{dF`2T.2e" " " " 4h.jؿ%KZ>$>&whFsN;={gw(""J[棵thS+E5f _e|Yx'p@Y7|.N<1:thn8ŊU7lh;To:Ƿv B: 0mXj優.&b*s3URv!HCR1Pƚ5.F/s֭�8Wt@r.V-T(کS|8x=aЯmyUD@D@D@D@D@D@# !H] "9Ɖ@nXcq۴5kbԩ&P<Ǝ2 2xg7Aƍ]%0UD �ƌeuE]##[,xoxn}7лwL;7_D@D@D@D  ̝5v$љ›*!P^=|69^bϞɖ{,&M-#s ""� ;Ve$" " " " 8T'Ji i[RLED  0�3At .%݋.N?x5H@(,#L aUTD@D@jsW/vdɒ%&9'ϲg[ѿWrK%T?9p� ;.B}{3+8ysZpVqIu@D@�cFSz `2 A')׆ +C\m[#Ж#_g�e˦}Q L@":ysOg#i)[1α"" " " " "s9;)yBG`4S'5M{,4"ƈ裏c ѭ[_ r ,!%`IJqN㏁Jn"V~ڽx6i/=)wr2PBNk~" " " " "Z8=n2fV9:h {ƔЪ-&$p'`p@䎥D PJ+A`pe�={ߟ~WO" C; d~G믻$O#S&dhӦ) `3T@.]3U4(%ʪVD@@W~=-Kh?ĉf[7"(^2ga,3#RK!8_:c?S vر%JD :@p~ aH߾ Wbݹزؼٽ(Ըt)0ni[x߾=#"E%ݫT)ʕZg@EiϪ'n=?joO" " " " " "|$|\=3t"3T3Zqց8l.w0 ՜ƙ�p<h|{b5V a׭|<dIs^~80.C' ]� 9yF8=o^&`@B S/g ];v8G<v0{6ШQl/[ |P<K͝o>}t|3xs@T/瞢j%w ݻ?)l2ڵD=d'0t@ZYwy|$w}ԩfG]kq Q D#pE5iÆ &`J *" "  Geo֬bV�N&Ov15W\D!kN'd(HN�;ROͱG'+W_X.Ow4G糫$ŋaB.eK}8m~غE"gS1κ b2Ic(Xx^\uw;D@&E:i3@}BGD#?H۫UZ:X$+ A&W' :s"jոj~6@7|qNZZ1 ߂mr't:4CI/�7wo03f22 @~ @(flVQt-3g ̒wー'@a\%۪ߗ .iFBi@@gk=xAfM9VڜH`?$Rb/,PnТE \~yW|ѹX9>5BWe`SB;$1&|ڗ_g@PЂBok,"/ u= <E<"Kx<Z7s<>J*i 0a KND@@f[Yf 紪'" "@x''I_Gu15W^D!U ZV#TпO]#L7�q=(Z4CgI3f8~�h%;(\8]BD@D 0c~D6|#oOc`Y3,#?9+_pvBb@LJ2 ;r=LvO䉨F?|8ثDz9Wd#L{GȬ"` AfFJ˒@d)NNiq0T,y W{F= ٍ}Azp\2u ?Lo wW?UW>7?�87n S}:~W[�~8z�tzIYEBED@D@D@b6\ B`9*# ٻvE>Ք9 *f_D=q{0kx4hZ*" A֪޶JD@D@D@D@^͚ͩ| wH&O?}:,q$6]1Lt!.] g`Fwϸ$ez"" "�v/&U<;0#}xJ?{g/E,B) A D @[&b`#X(b ` !ϙݻqݚ}3;|gv>/F,ksG*Nӧm-�Zo?R�r@`{w஻�PY\J%⭷CrH`ǾV \N4Q̑۽_sOfG@0 wQ,گ##\y\=[xqZeE"6CAx~iӈ("Qҏ(^\D@Axl&J%&O\\D@�qѺu uqNӦpё#g$bP6;a/O)B[O#s΁=6J"k4 J)䓃Ο_8"RC(JQqcg!:*G#UD@D@D@Ga4j47V-~]EgabZw}~" #`PN" " " " "IsgK. z A6oE@�m(j@o*=G3Hcޫy/f1<zaNBlLau,\P0D@D@n?_}5pAA?t">oY)(WDZcv>R>PE@_ˢx"e-s0?K\``N[/Dn/Xs9aki LY<@⋁A�nS,Gd." Lxej܇>fJ"P짠$"/ ˗^>s}7I|ޓf̀OآKhL=z�?[$1# w΁nPѲpu>x>r 駁(ʧ;+pu@~ ]Lebm;$" " " a$ШQ\0rm吝U#zbU;GvM\cz*0{vЏ߀ 3g;֋@pveNBFsdNm|]D@?N_?x x#xO̘/^ t |9{o" I`5� QHID@D@�{Lw[($ivQG Z Ary+e�m^|1|9c-Z�g?n}+@:�`m֢usȉ$'R-wV`?NAjaS{G~=-Iʛ4OZ/xi`@2_ˤ|@>~D>%QD@�|R(^b{(@!%|"pe-&O[)w(I$ Ss??E]2weFcYD'F,+EEq[?L`։@`p`l<d R<:Aπ3 )=6㮦VJ <@lh '$" " " a%P~п3s5xf�"788࣏~-z PhJ" ,X,Kr-Tm^ [xʟQG;:a'#3pq18-'J4f\OQHyM YH~ZLBBUu &A P>@mBuߪ7ƤckE2E`c".cp݁u3ueWDϊBUމ>ί<r_.GNalb]J6";ED˱+m { yx{k'2qd�E6 Z.J" ! pYE@D@�]7`dmGI@|#NQ�Fv|+A嗝Jz+pu]wJRx:*!Ψ~8 (wܱK̙7=li}Ӂ5žs/X8ti{[)L`'=>; ;(@X ps-� G'u�tEEƭ 4h8=yܸU}]>)@�J" xa:uVӒT�X9F{b>E@7�G 6k= }vx V0)P ؗ%"@5k… CD@D@^=O�> t[>lS`\)ڶ G&dP.J%Qi0yrvu$"e "*3Q@1#Z^~]E$R6{Sw9_o@xG粟6=ќ6k۫RlC;;qoQ&L�<0۹7'!yq_xU;\ix�mR@ ~D" "Pw,OmjERr@eࢋAZ:*�Us FSu$:sLyD#wd8#!HaP4#L5 hāH%(b>d[o_`5*zW :� &#;_Xg`AID@D@D@LNñ ><9_|.;v`No;h4K@z Pr�:*@*(BA8٩QNJ++O{n U" l,?_""PljժE[U^ж3(9z40bP6ЫW ټy/1>}`(2rd}h>_UӼy3ӧw9X� [e=ֲ_Wy>\HF ?Q/s/G).z9?/ǚm?W*e.cYk37pz*<gTID PDm: ߞtЦ p˗6rY?"(" N}lF'p @~SJ`'LwqM=Va G$)FLݻ0bXr cA!3k9 }E`1q">ٸQhٕF<|}1pA, ~ <OdF` EjD@D@D@D (9mZٺ #l}sw !t~z?,mFXDнf]" 7΁b!" " " " 8`󂾉zqR=G \qE >F'ÎV(i@XV H{꿍GD ԬYovSuAH CϣIޑ~m8f_O'LP@Ĵ-ʷmhѵ+Je pSv[yo��@�IDATo}f93'sXwdgL`;?Ķ0߷#~}^xˑ$/ֶss^/N{oNA_uݟ;z߷s*H P0�1K0�)|*O&D@�MuW,@#GNgHFm[`-~('q @`G�-[`眓E)،׫<p0h#:] +8# }w*~\ߺu`\q^�oU$ �WNQ܎=6I65(rAS/[ˁ+ ;e7&o,Ѳ)$" " " a'ШQn0xpZ^4f[W)Lg:*Ջ@2g>cF`4@J" �UT 4lؐ tЉ He"  ꫁z 7DA-%[yM" GBhP$" " )},G9MPڴm"<U#w#~aӚ@fH7.TO?mArpC`Ĉ]ٽ~c@ ?rS`-n�-uE6S\Se~y_Wyc"E/G^%Z>e2 ;#G.G6?~{qKǜ}*Γ-K/G;8 x JU'1[J" KuN N8!wB4wU96#^B'\M7&bbqo @h<f :1*R 0q"AN;}[mU>78U\D kNCdիku iqsn Z]tо=0y2~>ZkE u_}p0r$P:pفHf~n ?h֬FO>`=H}&#:�{E1ɨi@XPp"1O싹z`’Gj�rO ,\?рlk։@q(Ҋ@xr0zt-t ?`@qh#n};(ls�k )1hSH$,MS]Hπ"25. A&" " %7[n&M 9`Q~ QHu|*6l;pb_yLesۿNf`sOm|S6|sE.G=r[DoO=|Ng_4\o3G;+9ϳ }<RV# d[y3/G#E/Gr}uuJ׉އusLEVID ? ̜NB;v!?\o%'Pnv_$ Ǐ|w9˦@~D*" "  0�5|/)[YID <,pA$B(~ ^zi` @c\v41Z#1$SOƺ c Q|s;O1oQ4)2A#hi ,#} �^(E뮛kC1CDq}@~ԩp|`}@E .e J" " " "5ZK֑OvR @n8,xY`z(vܩSW%,/pW?~Ū^]g+ 6�-cb b(1vl AVQQS A"PLj֬e˖JA]1{53m ~9sV؊}xWe}cRc#Xek*:OQNo#=wǦob q'o-zk9r<*=>>Oa=3eJ0%ˣ s/־*=zchcn u<_\-Ay܏"w(vCkF~cmDo>{eW08)۪UӾ褓� /R( Kqй3ЧO{xaRgUE@D@*J`7cj�:% -(3>f ϥ)s =z�}7@aN므i cCQF@2I3HR�ڴi>0п0hNȖ-WmӒdɁ�K/͛>y2ɼ=f peK[od%f>o"P1 (B;W/h{Џg?'wjՀ?,r02r6$2Dc%(f] " " " " $n>hS*:@'/1 t�Z>o(>DIo6:pz]D ](mXx"'[D jb5k-BX#o/{t"eˑu~y?W$o[+s|~'d>">>BM& >ɶq~LGkX*}~kF.GO S`ɒ>g@ϟ#ym~yrc"M>O :>~U…9"s!gc_m 7{j." "~2ǁ#7oe=CIDԯ">ʧJ]]R@U*-.+"`QJ" N`s I.w ;8D/9AdQ)R٬ШQr;?tj1b6E?(^q@~u뭷j?-@&pgw;�;4g$"%H'F=gnD`-"�|: Fy׼yAv'#ˑ%h`Q�MXOXư'̚%X|8SdqoRD@D@D@EC/ٰa k:" 'P@ᏻ:+軡0/E, ʑi� 4h}2Dr 0ʕ~l?q=';[9q=p#&Ogz>\r,r:?9_y\^9f}u˕T䅦"ngzr<r"׫~I-ȺL}dYl퓎D#VcqU'R]Wo}rrx'Z6,>?lU|b>PPK\-`2�8-rW]?j|ғ\D@�n5_\{m-8}bJ![D@ �A֢E|/e@>Gd#" "^`7< D@V0w>%B @hp{]~M6 ;u :h�(YF - nJEN+U:kuykȃ_}leV6\ZtgB{U3Jc8X}:v,@ Ш>C_|tD6m*WEe]`/^\w+JߋY+e/N6ڨ{-MghDgA[n3/}Wiy=5P:'o` 6&Vs97 S嵘1]D@D@N*hF~M9Rt\#'$drK`cbS2H�!)>BbJ:|!`+쓮Jݼf[÷-ؾ˴1Nfv[ڶm 72+5D Suim2uWD@D@D@D cu H� ?%O@˫'.`] Ɯ9On?֩y28si53ԲE<z6"zuF,gr6[^Ⱥxл7pӡBP\":2-1H,] 럄Sdh|䇢 ?sw?;'-}!Sm9\Eym/9sE"Z˱V:u{ܞh8)@*x"Oiŝ84x{=l?жm 9]9q㱾Mk5xv2.v!kζ&;MlpLs0$}]xa �ɺ{!ʃ@:O۬. $qv#_c?@hx@dqwnU2 o/Y:Џ8Ie|De]WD@�TCpr>BK,)#M6<21Aآy EPˢOJ"PUي� F5{bE k|UB0a"An >7w\s-7?>;7u_Q�o1j֜lƉTE$i(j֬uA^M4;vD!?3ҐCS/C/a)J) �Cyߌz?;rOﭏͳŏ믿7hnފ|/rh<LQP׋[] zwc {iӦ2WgC˕; n8$um֊'/= |n)'>ˑYq͚Z`s*D@vpZj^^䅿ŢY7^pXDHwZy_ <yrٮGә5jX m9A?ƴi#1ێLO88p`-uџ 4ö5O?Եf;Fp ˴1`[÷+0$ ɷ1-[yJ6 ƨ_җ AVHD]S$bJ" %> /9#';dE :ɱX $KN&/Ysjf~><cav~9rk=njXdv ߹qj컡'OrĦͬ/-xs35Ζc7횟sw`R#m-i(m+mk\ݖ=:l`~~b?i9qFENs̠W[ < tC)Uz} tT�E*P}/=С;�jD[J:rm#؆v~Ͻcmf̋J|;#Тf;SH_:xb;c>BBl[DN .GN,oe|zq_hul{H2!MBMRqdDZIcA}]D@D Ə͔\~y|۫&rpί*" ;bࠃS>P)(hT?b QD@D !ES>Bϛ7 G?}?v�RF\nWr<Z+ʤN/" e]CDpQG _.ˤLћ(>흩OHj?[ Is7|M>7{Vp~{<�Xu"Yw/~l Y٢7#I&aס@dMrw7n.c $hu<N+qy lJ�-GވN<Fאd0WL4xzwKߍgvb|gREDo߾##H#TC-)^(~ `?qhѢHDf㎃9~qiV˅F"|߲ 3g:G3E)w^y@y&YČn`a$ ACU/8ѣv<|[l֭[iKpvm(4٨r$buUlQ|x,u6%'=p0^oاiUw pUidb_$؆*p@0# y:ywk lv8Ǎ5>͝Kz%{(GD@D@D@D@*B7н{ %Q|JID h8O?9&6q9~?pE R@ NA~B#ܟS2n!r@6|5h@AH?hcx 篾%ͳ/Zϯ&xݨx?XNh�щp_]8ƽ)qQFeNt>(g ah3[\:H2#ʹ4}4vkK'UCwn#'?_^/ok%&߇Y8,j4Xeq /9ʱ4amm9-^٦˜|m ΓقW*vTNX/9g#rbmXg'ۀe'G6_^rg1_eR s;[f*xv3 .��À1c`KfAg?IID8y]~:037xϋJYh2m]oS@@1oA"?o8 4p~zhVfB[dE`b ]/ߗm[nqIGR3DmժyQ|"=M)GpF+S=a ?M)͏E*(IDFfGPA_˦b@H]s�"bmڴq * shs纉3lF40#{mbѮ]J9eSHÔ)4'WiDEf:;/0B M0q"ߍc'{"6m& 9 ׉FF>2"|Tn<:]uj,"VA4 wl5"(>ӧOĉfHC7>C|)gGiD�;[o: >w}cRCD ؉{OছmFtuJ({�ξ_!* + ng<$Sh@\M)ι{3}Xx C2@!w]w:urmmV2,eT>C` `zٹ""@!#OvGgpx[yS}tī<Bzߖ/]0} UiR !yVD ~0e9Gi1I <v'-p< yDQ ~l <.סѿ\`g'5m."(*~,ڐ1aK33p"ȇd_&0<8pC&vkwLw䲟sً?FڱPθؽnQ1/Si/B{o9 " " "�lG%&Eʕ)Hy-s6:l<?|k m #^KJzI1ȥbvE<LO_oZIQbN0[vwfvޫ+$k@|)@g W  Y&$;֕{~EF `nuV+-G4iӎ8&e]pZ-_?3͢|.0Nݺu}mC:kd)$'j(P`oaÆs=h$a& !0MHtfvN[œ谬04 .R& Z)Da1"gX?S<4zɼؘ, YNԒ 6�{v Ә:Q:l`ۉZc]]K"P J(fѷ/@H%t`C ! ߋǏ7WlOc=c!q) 9yd#C:u $ߋ|fbL6M jZ ǂmt^hSN ױN *3Eƍ]'F<3gtDLbBSQ6PS[n]|++"r WU2A_.lPm 6K/dǹo 75&r.DwKg$:|jV׌V�@0E;t`+>H:+'@PvÕD@Kg+!=?ƻʛ$^ |½"G~;ʝŋyR ,p/-Z }hK6~Dq?/5L]<BSB>|>X wODC֮]MWh{)ׁ81f.Bqo˒4Vi~j&Z~#|V &h,G󢏜Ӷ*[}32eX9�}4+KJ" " "Pťo?p6E 3Os} ˠyn?/6_bӯXx~i /�M~ ӬtScu6 %mS *�``"oA#oŚ sv>S uJA&9�~;,Wq3QO 6HtMeoN*" "N"W-[: v4hB!qPwqCߤ8ZhES xK`Z?.:I'/|(9vM> Y`ȁ@.(VJ0dt 5O> /v.]+Vf<_;^x3uGVz償i8DJN4Pejx݀yF"Pq|ۄc�g\x!9YcoԚ*)}Q`lmݶがT(ϙ�o7-{ %S4S*ON@Ѡ;wO)�ob-S| D@ΫB@!>-={t|oS2=+w4,py:51 }Y\l_Q}Pm_~1?J0;V*j#F5^rB aQ@1}],6VT$*O޷K5}"?}4pϳr("@q }n/J)HA?(xA!>_PϹ̉ըD$ d9ΉQ(rbc'>K_~AK3٧d8;C @Da3'p%M ɉ<R1rEG5Dd?77g|rXɊS㗩N; } tB$Nĺ[2-fn*4tx`|!>-,ۻ^ދzz~mT6/c D>fh." "oa-~dW^[R x!Hs91gF):j@N9͎..~[ 4#u'D:uk׮w}0 1f )S`ĉ?~'뮻bU<$ !<iʲT0Q(qD8$"g-ҥҳhr 8Gy3 S3K:9eS33yol"X&Ll.2]4zhhH3{p%4P\uU`<}A�_j;R>5;(Pasnݺa 7Lyr># ,\8~E=q<])g<+ax!?p'ŖCA̧z o&z<&mРAPyE@@8 :_Ӝ9s\F߾}`쏱9Hy-\QPᮻȑ#-ůhgglcP�OŖ@y19MGcvQ؞,J-$PHd[,!,>Lƻʛ$^ |¿"^ݻ_7 �/yVE U4;wH}ds?u^Ӧv9#z9 \G# %LB(\NLەF֩@6η~{4i}_mUH_2XUyH: 0 l})hn˜sgd)H:/3V8_VU=$" "Pplm#)V`!zU}lO{QVm?6\gP$ԑ` K,_D Lw Ϡ?Y~|0St˖|~4 AA/"PScs T\vY.CD@D ˬA#8-&X>BOUV:o}hѼys#tEm^zޖK{@\m6{M` y@ć| 6{N;Amwσd04: j۵; fk9CS]&L4 V! D(J%*F=0R3�N8!p�sDaŋc„ v&MdsF+ v#6|G&6d6iD .B8n),?Ȟ{iPNj)h}g+  НD2HDxȑxJT-PY)(vxM7W^18]PJ:QƴiӜ Ұ/BbP[ֽ$"e$L&><ƻʛ$^ |¿mc`#ŸgP*Jx|d_|Nޘ΋5lЉQ˛QUI�Ň8Vg?/:7o'Zӌ7m;s0A=:dƌ@�giGDi݂_Ay 9{rKĵ4~YUr S_VԒ@⿑o[o#E{x e죡U�E iKK[c/Z)2dw]6g%ZEDh XU1E@- A"ͦ2&"e<;/,gA^ۉo'棭" "�o<.XL3 A[P)>}z'Lh s18PNZ,d@2"+f;]wN?&\躩5\{[n%=\wq)!@cc'LoԪ5>!:b2^z)hű֦CXԫW/iaƌSc*.Rp>8qm4NHW1KK.ŨQp78餓pE97A`NrŊ^via�9%/ڈm݆ݲeKڵkrˊdI[T&zKwiMC߳A`+f-׉l#Fp}믿볥(l@m{-KJID  ILs}xw7էI,mǚ'ؐʏ+"�ͲN9p2b4ib]99Y<' JS^3B( ǸiEiѢv35E+VOF>g/S=n8r!󧄉R3@XP8u# ?"Gl7pS�RAr|#xbxz 6 E"oE!)XiwFݺuʯ�)hn\ +nB:aZ[6W"!ȴ�IDpL6e~g+@RPEU=߮7%"P\7d~ 0;ZE-H$0hC=[n7qDi IS981qCIe{^}`$Zj9Ѯ>}`-c_a` o`4is^۝GZx= W^!v0ʟkG}4,93 ;o׮]xi3*^pϼBF)xN\uUΰ_~`K5NfSNQ:0ʒ@ȑ*]$u߫ƍGKo`@U#+O`ԩNGn!ʕ*G1>|eЊ}rj9sCU֕Y($L&>ƻʛ$^ |c |N=0q0E~[,n4$>}:|M7QE͚5ݸ(Aa;H L8Gsb̙`̙%l:;cf]A*/SoڴiyI(u:;^8=3f F9x<zUb$"m~( EF:72%-)Xׯ_Q" EHBa){U2sr^򥗀 yf=*.{ lMֳ  oF~;=u";B2E]^z>m(I]ڪg"PyZyf:BiÁ޽~ʻe_^w9_k*sw)ȁO&�l�' 7qDL2~3&*@U|%г'Xw`4g&ӈI+~'oF]M߸D +ΐB/ [(R(k ?|PQ$a Ȫ3=35k3Dر{:qԪQG"{,*[W,j.DV`ua:g̞=Ց%YhlƶؖS*L- = T" " " "]�n}~\)"nVto97n: _q=f7Ͼ^x8D WԒDQVpI';pª+Va[HTx~~bKJI [l?TT(d ,? T^y b {̉-[ {п0hD PH6+`=C`O<>,_p馛 :Bp .æn84i[VB"}ʬ*?|ƍ$w$?\�cNd:pn.o~;<u6&@BQrZHw9ƢE>Ȏ ɒLɖZI2IED@wk <qFpΝѺuk7X:`� @p:tࢣS@neSHhgÌ`Of=H ^{NR$G7.-Ϝ9m+U�sB?=R +W_~Nemu]_=6xd2sBaW^yO=3 ID@D@D@R'{ #Pu JKX`u_:N.:1.(Nm5> GMضS*,4 UJ҈i8^PyCLqoދ=z8]v7|6p"4^d3> %RόJ>t4oF1?el/mBc jz/XbB^$ ! ),$;|@|pǢvڨSN>dgIa'|}(;` կ_5?@5I~?>|*cҥ}7lAt8s1~xg" "PE3WYF>eU̎K)"Pz<88yZ ogߦ3Yg/O?mڴ1Q\ &jGuQgO-XY)2WLd"2 zQXdhp28m0a<=z4rKI5Mlo&hٲ%z4Y(dM'aCGo=C@)5 9eAUfoeR'?=R3u8<j7#:2ZR vaM!C?B~:@P=sP#52Hu\uYXVJ?ƍ6rlө~ƹ># :׹E@D@D@D@QCyU(H &ACwuť^^Ra7o9SѤI6*GL`ME߾;5=ߛl}Xl=c A,XihF6w%x@8ocHrk;4h�]vQ1{l'@u\s u놭*W.D@R"@MO>뮻0k,0qD[ᅲ)lfhժ{7a jR^ID@BL` +X=#?gZYKD@DB]N9@0 DoC3X'!~bY}]!C0%2%[sRo^I2A@Bs@H m  vH3Yٚ:u*Zn8ٵk"%b(}߿Ec9\rIf/-vLtf�|`~ 0;kGBq7ڻwooa{h "')/ 6h#)гgeHznsǍ= .,ҫ" " ">e3Z}J;]Om붬㲮;,XeX)ؖ@/vtfa[O0|LL0ʢR� ^~:^J"E3fLkk΍3ǔgLq:ud1W@2_9nB=ͬ?p 8b~:e V ~HJ"b PE@D P[oEN㤓N??3|g*=8 tFU(tkpcҤI&:  dSOaF @Z7 .sS0 0١$" "Х 0g@�#Dd]QRO婳�N ҸqpfrEdM?=PtX3'ӹD@O `gG3go<z_z%brԨQ СCѤI9E>|x O>>;ӽ{~?=~<[Mi ۤHnΝ1vXi8NQ?8htGmSh*ۦy[SPoBlUƩE@D@ٽTa:�DV�:_ѹbru@ ۘZ)Sp)vɎy&@!HBQsN��@�IDAT^X�X=�ZFߞ?+pL5j(b2*/jժKR|iN`s:$tYm馠g Q%;>?cس@8>ѣGÎ;h.2dڴi#ǂ*�ml!.])>s۷/-[iN?-ҵO6lz""P1c�\r Lbj Oʥ@Z �ϭ[&G.,9T>J@۹3ۏG͔." i":-Wa?=pG`5İað.At9fB(j)@:H2u#t~!ysXEq_e�J6׫W/{=Fm{kuUW74mv\RR"oS@>α$^Zn &F`RvP| 7ܐ*P_~퇎G0}tRnG(%{).RBU|Eq1:vm(6UrN;~oA� [+" " " " C=7.F]9SN5;̉mvyg yaR?BCT*JYfD9s8gX,щ"-5ktq"cqnݺW (hrM&m]KD ?xg1b+3ӡ@l8aڴioγ("gpNHFa;vnb;FID@Jp0 mt\ _K QD Q: 6qpϷr Foe?^~v4%}G'pGϻ XB3W٭[7P RIA@B頨s@`vy{w g(~NhQ$F}Tϛ19%9�˗7 vLu=Y$x1tPQZY6F'믮cwٸv1_١|ꩧJ2&N=E+0djB3eAD@D@G@ޓBilMd4Ô5tXlxv*(rJK-r4"% Sw%Et+ܹs][]{($"Pvi'x>N"z p)BEΊ=>sL2wd) ٨Q#7mNhb,(ץ${*d%K0|pÿ޽{nD@D ]ض`P8 6 O=h6ȶ־}{'xb,\A[Wnb9( I 6 M4qȆsH<" Y%'q;lz],KV[- \$`UKVqqh5aJ"PJ@ۥ(B eDD Gu^JRN m]< : lvs]0H0J!&б#p饁RSX1E)4AJ<*zQO?tn?E&}U9`w晰Ì f+__kQ) O־?M-[tU'Oj~3k( -[Es=qOC^R:L0tõ)!{9RwjnK2Rt^Ne|=0k,T^=wX A�.)" " " EKNWT4x<αH~=S/ |u*7k&(ȉB*NW_lD믿v}]ⱴ3Yt۝9iժڵk֭[c׎>@JrK'It@L\ƍ4 ;(@& 8Tu8QB|m馸гgR>7okNmwPԞiN;`]wn* wZ&-'`Z&�wд) @ϷrXu%JBUg#E@Xn9Ϡd#�mۊd'A/ʕ@.wމ}ݷrkL߾}A tf uќXcEsUP(O\6mb#FK.k3R49zB>}ObUM<믿n<J 8.B6m=ztiTGTm5\] pŀO?ovE IOSaAS6މ;bIzhjo;y>LS3MQR\r%Bcӹ͚u;/c%7S?F`d-(%{Y'b+E;l;s8˺,Jk>{챇saFH:nܥҤw+ƥλ+" " " " yJN0<-+Vp۷wÐ!Cr&I1p Y唭>tjx衇pGbM6ItX,Jvڒ-1o/2נAlVt䇢(< (;w\'B;TV-'gF›o yQs/n;5 $M=:}ԩ~CU\b2BZO>=&dc" "Pd>{аaC0رco;\ Q1mʗ"?E](?Ȥ5j8o9R0wu'V[mwy 8нæLyƌs<%}.'v5mz|G 3l{“k@ X!'H!ș3% J2uI(`̙ [UW\XxA\̇vcA޻x9묳bNJVa-ۏf;QU�CD@rNs/Z]`ǜg($H,%ԡڵ+xgאz^)@*$ =+yN-xaƍYE0auq4D<ѣGviy_<xd.U:G衏?8ׯ F鰝 Z)m3 %9H0C�nKaLD;&M&Wl2rfv@#&dJ ,\4fc]C4U(6>.ꫯu],{6jbsK/9Am,Zeܸq3zGueW(J:*bQ- ދO>2Uh|W` *fvq cg]Ye]V .A0m4> :JK,b1#XWv]͚56 M&T/̯܊@h )OhKS',C[/Tf3e(cL^x ϱX?>YʍfKeɼQ@C]{W$E/6lN?tp vVS"sLtb+{ e}1BS-Rt`.aÔrۧ$ߋa"Bӎ?&i~;pv:u !*+؆|){Dd-uIYgy/7ſʤcshݺkӰ/ Ϟ=۵w(XvOӦMM>x蔬l{]D 75Ԃ~Q�PR],_hPD #fn6@ǎ1^2c'lv;wnSǐK} o35" "b|wqJD1܃j, t'#+%HRcE�tLD6b4޽{̯i/ 9ફu3p)PT4fX⢋.EcRz(0H 4f4ѻ+#{\Q.š {4i3�2ʨ0Q0!)D6B(ۼys0rfzU񹾪([TJL{}6mOյkTV!CܻFQ|Q°SNuo({WU`$tP^' 8"_lg"Y+q:+뮬*"w6is!8xG�Z`AFl3\t5Sq%q3&*ǸDhkC-[F3* 5n}IN2gBmV8餓QzQbI=zQmy3oa&l +/k̙n)X24l'x"x PA{K>lP8"#n/%|]O޻T8SVR.~d- xO`}@;wk3T~YÖԆ c-O k| 6_ChvN;Dz vFF9|JVLݟGsxYX(pY@Ϟ0W /V*^ҺZD@D lCpw <TZOEAaow~K9rHc+>o'Mqf�%|҇[ned;LË>aN EhѢO?^1J"PUW@'"P8, _ sryQ?OW)5k{UhBF0T%ӣ>ԣ_%/R(kwwsN,  ;�meG銙}G#LAdw,H'|ri7pC'o(*{ *%'.8x3_ňRJ/Fm/()dDנqiPJ&ݺusQI>(|Q }?pK@ ^{rJs1\#NZHb?OE2>N5:\Ps9۷w8؎K~Xу>ۘl-6ad$4^B Aҿg2:!pg)Z_D )/AH{H)C.H}_b(W3ngo ڑ51 k>Ð/:D.#SM|~^;sb]wӤ�ӶnjƻV<yr~\?qo?Zrֳ�.5>?ɶ'*@!7o `jXsM7 mqs~ZH126D,ժ㨣*v]_Zr.+7ʘ;x> |&LҥKn_~N$Y=2bG*;|!H[2=lYXr|d17%H; N 8 t_&#'Ttz~<G$[.~'ȿkOϚ7<_$tD@A` @-X�zj6.HB,\Е'>L^)@U *q" )0Xt4>L0S=#3'|wEbg}J1cv:v%` t $Z`)R pŠ*?STѐy$~9pmFx?daG6p|ItMx衇0qDΌ\D7 g}V:p T;4y2JLG۶m2+!dcyncMm+I�8f;$Y4P3Q$*|v}VJOX&0m(3h`໑>ϴPA+NdS]|15cuDjڴ6n8g)"Ʉt'F8yիWIõ.]X K=\g "2̕W^ޕo?>cƌq%K`=K:ٜ 4=C!^k೘7Ϻˋ/EAS',bEt?B`&{%:/NSD&:?>JvyӲ++?|gБNX57qa({8cҤIBg(%j%V[3Έ`;!Y_p󲍒,1fQ_t]l/LlΙΙO`}L8N)" " " "  pX%$QD �SEXfAc=L{rDc$2>&ogM= iT2q^;/#W$%cxG,XS6̒ &vjv8˔L2ō`MV!^2oL9㝍3ais<p\6FrK!Q Bvӧl:r`ʠFDڂR1}A[Αϛ|(HDN2dȐ-Zȉj}WVZ۫ҟ[gvp~D+-Dl7=ɶh." DW^hӦk7DJA*m-Qۓ{S:v:jptk}EAJ~,<@^!XTMl𹣀Oƌi9^A 2M)F\sq(n{=<ӎ&}T>/ѩS'||oQN?t.WѲ1O+ 9ߪ:_^{⪫Bѷo_W-]7x\pv,@>xMgΜ9`};Y=2TE@*G^�7�|RY$Y/$`n`H@0(桉[+Q;Qovq-ՙ-Uf\%^t6Mv@?d]yϱ"g*~;Sdu^LLƍѰaÌ\*&A,&gQBNg믿[FmHG5DJ⛶t%%D@o4lXRҾ}Ig 6\b%6[b%�8:%&".xwjPW6X!<,~5J�?.1e߰a~fD[b%V(F_u2۠fi'ҝ Kmoscx 龕DKLɝKle{KȄ>7,A]b%3Iwm@;+J!JB*QH%*!d"{vHRZdMT)[ɮH%%Kssv7ޙz͝sϜ9=sg=ӷo_[vlqTb+tڴic>XLGUqn*fqf5zhNjԨaA!0~yd+5k֘}&㏎ .:۷wԐjժ1t噈_xfӰaCw5fjoӧ~/_6{~5w (v?lݣ7S{6H"{v;j`ٮސs :8x"dz/bnF>ޣ8a PG`/QWJje)+#*l㽎{_G M:^GU<WβԎS7D019v-'߿ :(a$@YsbРIY$@ Ojnl? K*ͷaw8Z3RB<7Pg I&ڵjʶDvBtht2N.kٲf_E@Ή6!چ !p≎AÓ_H Jq&Z۴xZy{#ݸtܣf6Ύ;3uq`lӦM+N<bhc|QF![o[ҍ{"R~GQ #SPǾut9LeADa ^2q[gbb(N޽fۨo%Y&{B+-*rTPQQt}/@A?-ϮZ*]Qjڵ 4UhNwu]&ҡ!}IEK8)U@?eS7:MN56 ԩiœN"1U(^\ssS/ "xL8o'{cHL@'#z֢EBQLꗙV:v:=>c͛771cģ"oh3{f_%CFE2"8ص$]GEw'BVe]ac {{%Tў.=="k|wOs /6^xo m2D;WzBoٴ`w2\veNzd#HN�b/Q{}wG퀒$݊t)SJ,5 @a SG;鮻 {n2RA{igM.V@*Qtmtv7n~;=lS5oO~x( @QL>X_4EeQaIGذ4n93@ ׌r%EX)! 7I %喎do ^}adUR|("f 6ߨXcN$APB{CΝk~y.E510mM41vW5"=T*ې<qN Ca8iwDߊ<b7:| AB Ջ=9#6 `lȄgx|_0 @ #? $ӵF.ӿF ,Mq?C539?3[oƌX315?n_Bqԋiha5)c/ῗ�1H6F-8`gl^0fG:�Cg3 x dz/](!H} FWO8WQ= 68Y )#X<ҥK`;8]tQY!H[tof;IG�4 A0C!' I�u1NLp&๔O!H[G SSotrx%ZIc u|LTm %Y6.\yM79m|C )BAhmZ9y') D@M!ޤƻ[[6&ƥ & x&0ydc~z:D֩S'3N:\4e -YYj-rr&^2qieZ{a4`u,=!һꪫ yu &Hv}01@049!H16 V\iv.cpRξD^SOn|'i{>M{ v` LnCyssq~<Sl92qN3� � F/7Ĺ]hC ]~륎M6Ȩ7t9g1b6͘DƜ:W^ nm@Zl+axmczi`ywH yR6yRmu֍Gy Jg}fǂ U̩r3I( @ ϫN{ԾG;9[|2@:g  `c_O⵽KKovmxUPvW6v{V97he'>:}>Jm 2  hѢEC>O/"^1(#sQ5k9Eq1vk@7+ � 콷ȃ%"=z*ĉEUEEix蠣蠣WQdQP_yEED=J5Axڀ7j&򕧟~Zԃ耞ٯŲnNs0adH'0?Gه%l&+O<K:X+G6,rKQA<50nbUJ*FZ)?uA|`TeqAyQlbG/9SMXNᙗꙨ;yE]9T%U/8.rm5HVnyePD,/Dd>UW\GOqxlkĈ5DDc/%0y A PGs*0#01~qܗ5k4w/#ܑ2]x*+,dt   Z]D3aÆa$g]*ϐ\'ҮM֖}XwŦZ[oI&.s̑{LT<5 ,_.ҥK E&   (:3y9=C� H`2H*a֙=Ae3É2ql;O^}UQ'; Ѭx=Wb</K<&w/,q:).sx:;LHi]vG~جِ{.]v6j im ?dذ'׿eƴǎ+zI @*hR.Bc2P=}IlDg"!2vRQ-…s2ڄGN,6m߅'1Ed?=s&S^Q<0� � !@(SKK۾osmCjJ6mXԮ][F%*l.tP'&o^T=~s+c^ϔ)S<BYܶ7Yfa!69mAE:u>1 Gb]jws[(aWrH|q * BZsoK,̲@"hET ]1נ I< @)&y/a: ժm[^[Mb0Ukovq.*ȓ݅48> k97Q m/;Q%>� � w lKpdcWGCK c*{L49}2}e7(. A?N$гȼy"g)O` -* =DPfA]w 6¢E ?(vg;F< !lltM7ڗÊA21rT^=ճ zꥌS(nULeРAf@<[Vp$a Çh/Yp` a*W~ʤkcS%pk'*(r9"fd F'6z&knWXQT ^f̘!dz&8/KkHbϓj"Y7w߭ьLժU 3gcݍQdtLBR!˟͹1j'Oqַϝl_0JKv|.eC :S`p^÷~kb   R';�M0!c=4b8~0K1N8A T3 c}WM>|}}vH7߼k $K_0lpT7ti4`P']we˥^*mAl~Ӧ:9: � � � � $#<cDD9ke+v\^=AMEy(H$pHqwq: te)1/^8fJ+d餳3dO͚538;w⸪ ɮ'|bbXMH=׵z@煾4g̘1!HؼaۆT%֎ vJ H1#6lI lK!xߧ-&`7/  >R~QOF 6J$@$�nf~ V4;9RMWZrt[=\۷i?FyÃ܆x%h+'tdu8^`׆zibLN3gHe:}:Ls�=wNw奄C$X yNhٲ̝;Wy.EtmT~N:M'0_'4;fr$@>U@yt&"CL"%v $@$PP,*СW z~M{+>h/6(]vq.*hkdj%K/}Ε\0a3~;t6 @>}'{{6MzarJ9 ®cΜ9nO>^: JZ8 VQ"+jO0h/'e~񿙕?oT->z @ZbXn=n8L DQ ;`><a260VVx1s$E% a'(q&x\HaLCݑ&- �x [6X\Sx&K C`LȽ_dϯTD^a h M=q\y%_5jd\!BzOM~|60k/a/%~_#{g_ʙٞ4!!D#@Αm:Wޗ=IHH JX_r~'GϛcW}}c8+q\8x@}~|k�b`ʁ̞褓N2K!&)v"2#-! A`j2e.IHHHE\ �j0kdʋd:`Qخ9RNj+lڙb|^Y&_:;3koAxSNL#hҰadh3Ɵpm!`k 8ݻ@n7߼ST%gf„ 2p@S\Ivqq,V6Y($M$\7?s۩s?gρ>i:  tP͛ˠA\S^ꗶY^l`6G6uM"AoCغ/he 9fg?lӵOl9 mskvǂzɓeM75Qϳ!][ + (߿SF? Lhb6l HC�s\;ODumuȬY:@ ;'EK!`_""K@ "nhFN5ͦ},~M\vO=e @ ` x'XG}h+nݺfWniK!Ҹ,% dM�&tO'}aA~ 篼JiѢƻktARfM~Ih0wl{xZ  o˖-˸<ѡ | Ql:Dڵk'/B6+L(i@% yaOnJk�qN|u6192 g}aWkwPǾKl9~m=k׮9 \ tj*ST^dЄ"юQ?رșn!TDS":93ٲ_ٴbŊ:_~xw!ls8KG|1lE x�ϻxW=wK6 q]ڶm{m<5Q[3{9߳? <9M;1>\gu@$iC+<nBe   ff= x^l7Q{6=Pp.}^[=lL}JƍK/G=0b_}U|z@6D),BA:yPd$   5R{L`&GEw<'v 2C~/vf(fB{⋥s!M;SYlĵ;/?eb=Y&{BaEgnk#;m-mU֮][X'-}K`�ݺu3bUʝ͟~fY5~xfZ$vcrb l`+ 0Mki[џ=,?s? tJ`W@$@$�&C曦w)Y}jC^^G)1v@СC8M7mVZUPs;C˗/4Ȗ׏u}bRsVHsH8I:yG˴id…ҥK!jH݀~G<6ԗS @.QU0g .HI L�nG~d .0_5,%aIJ�xi3IE~:%j>tmL?~|D14{l3U2M̌H XA>1HyA3�G:skh"5c ьo  @t̟8[n8L*HJKot<HF 3KB?~Nj5t4nfG'9tTlQ1O"5t.r]!C8~.x^7t220`@^z9@t| 5pI^OM|As NG 0p]=F;ιw\50,X7ytTѹl G+!Vr5*0сTc=x멞sp)UW]JGTu֭[稁bydu֎f{'8NӦShOT4gԸ¬S=qkgF?}jc{y&Wz\F٥^Pm9j`dAeΚ5kL&M2Ud|lo<Nʮv9w&k)jXj7?Kjhbwaxg?-ԋH&?PsTo߾{ygzTI,/Ե p_⿐Ϡ<*B0m <sbРIyJɒ@`=ko^n7RZPa B _[{QgŻuXCvm򑪝/8]^ʨ3 ۾ZT}'|9F""8h-o:Pp:mӂ'$p=)UP ƻ[ۈ6&ƥ CqoPf 7*QL8+ƠяهqyL^Hտau [9KYp�pN2{ıLF| ŋٙy'T&=sp ԙN9]-4obmرXؼy ^nѣI¦qmuPNwHg_Wm\;�b*WlldN<5^Wgi^wu.vN*A`xf C`#F0т }> ;Bysm8&>ϔ?L_|є[mW}hQd  'G*z^ц@y2/{ԱQszl7UahCs=]]BsP/G믏˘QGeQ1qᄏgm1-[L0uLKlvQ<%ĺ9�8Kk@qsիM~WLV1cL{Xg3O]&��@�IDATϝ;ܛ*kkdm.FicM$Pxy9)ta l<pN  v]:WQ>t yio%Ǜ]\>tmL8$6hС@߁LZ~vh @<!PSzHjү11fm5l:L^ywZAUsW\ }CɄH PtSGʟ>b &;gzs2&H(/EA`!  B  38#>o ¸+ 7yT5\rys99 + g FBXҀ8@otn@`ՃBQF1Hic 9LX>@A`#GK8k3f'"n8m۶5╞2Y̹^{,dB#^Tx!O۹lWk}%N: Ϣk&LD:~/}B$ψvڙgI> V 'B˳qٲezz5yDZ08Ct|=z0ӧӹsgG=ΛXf<%3'j[_xWxw1O�_6tS 8yTykἸׯo877~_|tϣtz)#u1;"ϏmtHH d8slv}D| A:<w~s6: uWaڵ Slhk%-L-|MfG@u"̤9""%{Qo.V" Fyq»ڴ o]`gA[oS{CR{7/c嵩Կ|dP}wC2cV U B&;/I{ XBN5ؙe'|g8=F 8cp T(DcwXt}Tp 0~x'`:{lÆ 3sQw/9{0!.S[H mkDl0lQ]&6g %k}+Vv8}O/]4?}ٖq{.1Qnş; � ?#]pWJWEz/򂐪wµzwCy馛̼QxQ2r-q?-[ݎ` c;?kmu>#>IR]7LS}tkժn2 %نFz;-% r-6ʀ6d빸XNF#p 98ʥ^$-H80Q¹*9Z'NyX x1G:[h]djoጉ}И#T1t}^^URAgjdjM:}}q _~ 35 38 ϽzTN/'Dؗ@|W]uUL; u8#DiK8X2&!EOD7/ƾ{8Qc㏢%EGEՒъ6N5V}9^/,[._,UT1[ԸLTLԸ7Gy< &Z(Yx.m<?;~PC8сNS^PZs iEMԋ`j<=l Nf6dVt\TlnM+]|6.QTSKtHvyQ.N¨ҡCQ LMN(^~/'9W\)*ޝ63E1ϛ߁j#j#+*+,L$kS^<uw֯_/[l]bRZ{iCv)*cLM` }~/ϣ;H?"0ƛҪU ey!H�lH%wq#H+߽*LUtլ9W-;P>.'D�Q޽{LH!Z/} WV+:)Yz%wuWhQ#D,)ҳ$QG*N`s 7X.&" Fyq»{EZd9/k׊A ~ IcTewL㞉cqbT*%lE ~bJ3=&G/ Kw^?] lX حW>qtQ,xmOp^wb__ &}v@Ϗqƙ-~lÖSհQG7,W8裍-g:aS4h`Ug?G{ҋ +fa۟N1/x^&GEYeHH\P_5jcCVQGTRRt�aA="1$'Ʒ ن@X;mbaׅ3rҵOAyj׮ݖ k/=w|?qfXySi8f ڦ͘*^x7ܿf)Gm.]{>4g`L/qH tZD;D[^!*WV+ee IC/EN:Ip8󞩽>h/m/?Ϟ=[ڴiC(K^zG{;|u@moH `0{]'|ܕw6Y/,/@E<r&?:|Fk$tx P� 'A&G%`oԬ0FJA�0a)  Rq0[ V3f"C.SLI "3gLN~ieO@5Mg$!q4 8 TT){(=0ē[1Cp ANR? `)\xF.S<?~Dh]q21?4b˸!PgCrT;=zýx$@#H1;$zcńOW\nws]N{ VF- c "w8A?q!~/_dc*$@0rr=xZys/qeIR?uZ'S'a C୷ޒ . wyf;.|g ktsu; 0ײ-=#CUF8F]DS0Nh"=8(p -Z:H77<Yr}p]~FNpނ+b3)MM&@$@$�鷨,݀I+Vt<#&g!R_{&2?vmrwʺu&;,E˗ [lqָ<P4iCAiCLG t nKo)*+i-y&TVQs9� voʥEzmj.̐)>b!~ )!23fa&8+0;?ӧO7g|1o'_#A@;cl)YDmY#1pdbk gc{^dɾ?3XU# E[{D<8~xۍvQV(Ä˨0DΜ;%³>Ɉ ?uJ@.ۀz{k5 ,Nm~ z8 1x7/LHL&M֭[/{oʸa!hWxv΂ $@$@$@`}c&=iFa'K1>.oqQoDM!h^&z/E R Noe9!  LRd:� @Ӧv%"pH!�_g lQUQ*@ pQH8cȎ@X(ܥ x َ5,O!F?qT"8~h$vuWiР}^{e>lYS3]f>jժe]ecǎ5B¥té[{IH\PGQr.bc8x`# >}dJ P,6D%(3@Zd^Dٽ>3:0@mƍ0!.&DǟXyYιIw $@YXL:~ZbBX5jd  :ذ!mH$@E!�cL]k^D|St쳃)S?Ďc|~[^o[o{%x$@A&^+ W_}qR^=# f;c\\#(/Sn[sHsCH dAzhiV!ky 't<1Ҋ+lj(oϨQrܠgq<#IIzfCD}y@妛n*k׊7I-AϷA{^.wmre]fc5y饗1g}f:^*sA}<F3gy??&tA>Τ; ^hئK�bD;vxyS'1A;2H /X VOF裏OaSδ*WlDL-xlzP]wɓO>Yg$OY6 @&QG+1!J7gO8g(ղS "�1H51ѱ`勹 /^{MLv'I|+fIΝk0U\RD+p !M1;էx⬜u4S , Cx"8ilV^- .;4Q`D (q0uT1b̘18z ڹ  $@$Ph'˗/:)K93=z!Znݺɓ߹A$jUQ51wg>1H {p�{%1$@$P7ym:Yge^Od4=76U>A54i;;I$L{i,5zW裏;8-,nnxdT$A$6SKc^N ~.CYӦM3Wbx%@b �XC, {GޢQ147*J6x"1ȑ#ڮ_^0? kxE(<"�D{%={4fms10m̙RVH 4(KŌ�QO G#~+<Ǩqҥfp X:;k&10\~y8\@Th(<WػxS2/tR0Odb _ @ha̘1e˖Lvs11 8*D5k&7~I /H qmՋ8r#gnRJpHH 0&N(͓[<Hx晜\ $@a'믿= fiذ{_v 6x.^Ȏ;_~{gHE!1q/b\|ʢd'-k?_ 4TFcuzl,vQF5)#/d~;wv<H g ?rI';IN?t9hDւ PяD @ihFD/Qc@AoֲnݺK0^z%ܮ];S. 7 ua+믿ہUZ5ϖ&MDEj,iy�@+kh�FζDA\vŊ x'˞w.UT1-ZdkAX�a޽{Kze;S� � @ ^+; xU^'eV[W̙c&^5o\ƍgϣ^o1Ho'A49DWPD$@$@$@$@hJ䡇D~MR%ߒeB$ 5jԐ+,o<c2d-Z0 pִiS" 8N5kX%KPG} n[? g̘atb H"O`w .,5q,zl6zYׯy, 7po+bzK0ǬK.:7>ԩuL{W_5_9D9o&cAjpt{˜_H|%z(SR)>+j) $%E_I $@$x:"z췟㏋�ac)"h3� ;lN$$@Q">Ǜ{=8)48*V|\!mn6<x,3B/sJ=Ñ@X@5: 0�憐X¿.\P9u0c]8Rtwޑ#GfM@ƣw  j$@co߾ҬY30E'(Ց38CVj cOԲ&:An;U>|8=rdM0 V~饗 N;4cT!Y h@GA;NFX 8X1o׮":/^t a9c<wyr7V[m1Y`ƹ瞫婧}_Y ";,= @ =iS_px<XR;vxm<E�[+l4XycnG�fixghv!ԪU+zgH  x1<hB\?`B۶mqR뮻z*}Q\r̙aHLN~'Oi1XܘIytMʗ_~Ydx, � @9 :ȴi6n:^7 Xv@qfӉ]k7ہ(5 kv/,~9p�kGZJ{NrJۯZ԰p C"mā=ge x&0qM_䮻8#BQ#Oj_c"$@$PZ}=Eձ97!b{;&@mfNۙ1 @tL0A:,Aq8g%ϗ{6< vb7 LB>er$PJDbs犤s8tP3F `~aX>YnvzH/0j[S<裦B9F+tFb#s%*x1q9_}PPz&(Vg�2�\.袸ۻҡA\r1yd"LZWeQH FBHX(>xwg Tc`AHLF#%h"8pKd-$L>\Mw߂'$p0?\�_w/�/,J[/ [Uְ 7@h.�9ZaVZ et܇�l *o̙3G d;]vRRr*Q"FܙP{1ǎ+g}7eF$@$P/6bmf2oFfE!@$nό3 ?BChG4mԈӣmʕ+VիW믿n1@>`$T!,9I6-;!h# xl;Yr\2%KDn"ӧT:X)*{&"#ӜHH Tp "^+IdhѺu"` :q}-[|�c�60(A$Pb Nx)|`_veԊvmDǏό?( n� @@ u`NEDUK^jeҥ#po0ƤlxV{g=\tMo_|\qrfm`;7Ӣy?%OR 6L;ow݈i&)n/>| 2DՌ <2�AŻOC`:8ˌ3t2tw# + d)KwJU^A"v?vL)9ԅqi߾@t~N{=YLgg4<)3D�irX!)eb)H $LFޅ[ĉzK^8\ SN–s7J3`DY*!xlm͛Q8� D³,E#`U a, a?V8QF A掙%;r@B@UTIHH@�s5X/X@0/@4^zk1 $?/Ο?,^nA3t�l@bK>|'6dcku jժ $%RSJuEF}FD,K쿿hGrͼ� ?tXNz/2i~KաC_p;뚩(f?ÙTIE�r-r'}GK.8˅\yxzLχ� x Tr"#tK \}Oh k_/wq1rO 7|K5\#tB<!8zHTTDGy Nbk套^C=T??PFscƌo\Į-CUg뮻?Bːyq)SoL.& Aj1Q${WpEU+wf<2;j<xq:veȊ�1h~~۫8S0>2&BO> D@(Q[xS2/tRްř9ST_OD5 [(Xpv O&[.M41+ہe+ka{qaVTBX.p�.{ Dz裏d=7qF$@$7w І8[ompfqmT @O?ԴO D6 v>c'psuځȋv؆h$6TXQh#!nȦ-;$9 QX)]fiY0bV"2$@$�$zu&2lȀٽ?Egyu ~#S!+VyAǏ7%OAHdw Hq,ZHN9K.dc@(4B$15ڵyHtB6vXׯܓM%aԨQ/o}ꩧʶn*lڴiF<rš!8.@ >\1!2t9 _] 5!!jx f믿 oM=5jHL~gps-10g}1r r7 {=zB3uyQGU$@ @!@)H=@_R/X ᄁd"{gŘxgM;cqBϿbˈ#}>s &3D6'^t2N@DIJ7t 9g+uKyEu-o)Xn,Ў+A>L֛ !QvAK:u8_J7IuU "vWYx8cl!~UcG"p߰E知J*cǎ&HH JOȅzD X4̝m us[mUAʓ@T@8?71m!1HLm݌8+;w> ~<-?)`~"voy�?,5 E�s`cq }5}:;C n-&rݩ B0!CDƉ#Rr8P&NhELo۹qQ$@E�|7h5"].�1C觃]w%K.={aMG0@PPy(gv9 -O<!ݻw7 =TqcOTQL-AѣG< K,1p_|Y:g?^sǶG'\ gHZ{BWӧh>Pǻwނg# &�Hp}1 HW[lo ̂:Ν;x&E$t bJc]n]9묳XMPwvD'9N(Ep/*rgg͚5"|I9rpLx#e\V䋓ӫ? ѿf  @ DIJwŊ"&P]Vj.Qzz)ovpo1s)? ;I."!t#j]VZXHDze*V`*_}񨨕7EK;H* ϐm?3�g6}9CHHN`զ�QHP_LpAzxv^^ lذ~k GLnFmCpFA}7k7V2bV8ҽvoDiP.Lqg@n@`Wq"1!HGb9&Hgۋ4l(:焙 � 믋|fL$ҬYޏ15TM{i>33b  HF�vڒN0:O'Q :dKvߜ9sIZc^zɅ^h ,h(Y4<1 Dc!r"S^xA8p'%_UÇ#Qx&-J�gyFqy嗍1j&_c!xԎ_>:6N;xydG�'*/߾A ʕ z p4\Ă3複(i:8vԅeĈ/Pu dNRaaˉIbO=gy7J*jLrf' @d]s80)cǎewu!: Gwb^qG71"~VZ6Fn<yK/6]vgNNO-j{爬X!z/Dd, @(QxS2/tR0QQvx`K<@YE]-Zd] N_m]\Ŋ b:uid-ڣEo$�p {?Mnf#bNsc3d(„ę" � @` @ mc Yq4D0wm6a${ О"mbA=B mj@u)7R[w}'t/+t~6dـ1H<wygXd;NB t]ȍ7 J-)_H?\'E 3@$@{ѾQYD 0 yңF~ɂ {X[L.Key � 5kG1Zp܊>B`iJI<' '|,NٳEB"@ @ D Ezt"kx C @ G>`|=6￿ ͛G#eM&p5 4^xx"<;3փEu:E 'Z5dC @Ab*5"x69<':wlu O!=9oą żyY4l`E)<@L<Y=xM2BB uC=tD^RR%ڵp 47$PR(YR !8 Kvj8.Z9aЎSo&xi_žG{)16@Dh_q'իWQ.J[bc%RdK Jd(mVj!9~8Aa9lvxNQzz)o@B*_0y&oo#g\0nC`oݺu0NaWXA"` l)pFhUk|1MZj @`N q2�}о}{1� � �`mc {K+ "'($DPws1>xc @{-gb&Ƿm^iBu^ GrKk}aH{am`{5ls>#}^>NJcDZ}&r"kFY08H3sÔoH2P#<d< W+oʕ}l%PhM@ݐ @̟?`͠/Hm,vaҶm[(8Nz &t0OhbYd/La p"*2e&IB<Ge_0|~W婧2QRtpbv&MBg|�C :͞=LN;p﨣nݺo/L+t"bС"#>�w}wL�/Xzy.A6c #Z_nX흄|`3g4~LfxlF|tH@`UA |h/h�*:]kh�$ UJw<J P2=JA"{FaM70Bu=SslADBbJ0^,hc`3p8Ypic?1nІÙ6mH.]L[+QM-r-Q-!E!%a2[TFD朖M77B^R?pKyg`Q"@%K�Ns]bٲebժU B߽N.v [j[Cʕ+ˬ"+s!6lfF h]w5XQa+5[Z\#g::[=c-E$@$Pr` 3vk+zfE `l0o!,bB pK�,c>A[-t{qM{A�ƳԊG@b5b6d|di�C+DWdX trr p"[m%#9CHH t q"ve3=w\3Op|fuC 'yiӦ{g45kft*OyB c@+tU&]~h_81IFB  DgL(:y^{%ƍG,˧~j&g˂$m=phB{os=aÆf o"` *RTM65F;A 'vӢ6* r"}?ap ֡�$ J-�@hC.xEc S<@0/F|Es?zK}]}=-[4x66j(Y9sX C!CCQ7}YP u,@E `[B�Kk DL$$:K<_2|@h/1A}xpD^QGǂ PA k׮5|ik~HnF̲]vqA2(.�Pg$XHK Jd(Tj)Uj:Qzz)oX萏Ue:R0$_gBvX~G [xrq!AI+W6P@R"ׁL@n㺺Vwb(lH jU6+υ{K.8K]`?r � � �h?`Nm?5A EqJۮvFaCO}״YI=6{AĶ+ %;C�!믿v?,X&XMlIl`VH&"X 1@ iakqıaS@-[ Z/z"\#r%y>%sCe p,~#&=ExC;E+[N8y\=;˲ 7o*1$@$N nsLO1?Zu  6Ȓ%Ks𞄆L}ח֭[9B:t0v@Bud\i@@ߙBS@ǾRefb- G�Ψ`R6Lp^p*_~WZj Xym-+ 0 Ç̂J )w‚ׅ_:Ӳe"G-)U'Eڴ+eSj �Ng@p߿賩|$`P}6BrҥQ["w"aTgcy;l10tp?<dL:s eN0(=PGcwbsoXÐ.0Z14àuLW xv/t�7➷mJ$@YmРIu,dt `=HWɓE>S?ŋhk/\ІF}aט̂INmc<91�vv6CF{Nf4h 쳏q6#|$ -}3"?,ңGN$PhQU4I6W roAwכ/\R0Q__:a.N'�p)XAx{b8&@8A lKJJJekce8.[p/clk,+F/8X5k6Zc\ k#$["+5?? $PHO{*<r?uH$@$@nkE!WQ'ngwɧjw9t<?=D]9Y&hWh?`Aý6]Ѧ.;hW?lA` ahg bk\3,h$na!dNJxbv cm$h@J�Hwl5vWv ٱX{ J eQ"g%گ"#1EEON @M�`4 )>:TbvIKf pv{eȐ!!-!m ~ےHHo"裏qv}2}4见SQd88q_|!-2}˜C^9BD^H L(ż@  @@W'ĝd֬Y*GEb_J b l1!1x6ŀq2*fm @#=   F#&CiO5M@FcE DN.s_&H�tG܂XXC>!V0F:xng]ىg"LFsNkt,�}6&ئq>&�tǂ:Cp�5 Hm�('t?J` � JBq$|eCo7N䓳9qL�baEF @{ö1F;ng`rXpLlB.h[64]nnO@5>T BWD $ @ DIJV).+ (=o7q_tNAj 0� �(lV0q> +w5K>T'@,1Sxl}'v|ֽX-D=~<$.iHos׸a/^j0 3w+i6k۷}( �_)SNJ  (yD[���@�IDAT8QT<6EvM+RZaH' @(Bh[BvZDgE3츬{Cuv-[0a7Ղ6 Zk+-Vk% V$D1Mfn"VLH#=lN  dkX$OvNvXO�S  9&:lo)L ESE`s:#C$@%�G4gذar:Og�&HH,KyBXCj\gSЉ.]/ӄހNQF<!SdsfÜyH T'n\0�*NXrqǕӡ1+h0.pa{Z9zA̖+_aP܊5<b5hhC߾";<YO1,-KЂN{5+�iˁ$LP@cz3ѮaHlDBQj0D^1>A � `l�~0u{ϣXC$ɂm]o{ah$q[!Ix5gVHHHH 孿ˑG6CgCG0ł�+IЎ>hWDp1.~Ѧ 1E¶1l;hk007 $@$@$894ebFI[EFqH ?7GX11bN {@Ŋ`{;cmKklc Jx1fLv V |!juĜq3� @`w�'5G$@$@9Pb0!&�" h{zN;d2p3qA[.ma۶i-vmkصOlo [oO>HްmHF[!݂`}kc 6? -[LY<0 ;SR+<0}t6)6k6m)7ai%_HEzJT?y<% @G5A.F$@ z{|ȁ{H>"zH.BTHHv.' C$@"y|͚53Kbl_ʕ+\!:/=Opۚ H o@Q&;<We#+[K˖ wQ=@/q\lb"ѝw6NGڌ% F.X䦛Di+VLzP @z) ׯo/D�*QeYHHH ߟ~Zd4qщgb1 Z1)2bBO    (:E< @f͊MS2~HϞeF&U!>@d}0iV9f"()5j0dI]vHJ�v7P :UTl0&sf5L snp:@H$Isr'MV(bvYx̜9<;!SN# H6CPTر"컯 /r/U,w P2W'ȅ%Ɍ"W^)r"gcly3뮻K. i߾}.Iv/L$@!! IM$ A0S$=;A@ZQtDT9zdH Y#ң:S SN)E ,s#GlWsNl;4y � � � � � d"NL=:}g(2\ A"$@I SJ#-eN  #qJ,1 *sυN9Rr@0 ]s ]!Rz0M4\}Hnt ;%vI0o * � � _#âC5J@:&_sR7 Bpc ̒켎T�+tRꫯlCwTV nݺF(Ү! 'Q x{э7QԮqBvY^ KBniJPy"O<Y<H0`{HHHHH8(Y<+ $xxU1b;2JF`#E`ɒ^4Rp#^#[nDUL77EgHHHHH@�ƒq('HH hVA&-g � � '@!|+ D96sd,vf#/"Nj׊4n,2aBl`_H K`ye=1F$@$P0 = ϱ*WpD$@y'U>Ա4o<~և[ Kt# -[aHԫW,:T-{h9EL9eY%( w� #??6ܬu)_ܧ?� � � � @P P2W"P'WF MAHJ-,E'"'R;$ d$1O {箻DN?]ĊdLHHHHHH !Hb(gs� @Y+WN(HHH t! @8mC֎K,. ڵ"O9#:b@2Cv4@E0HIF73 <7 � @|ȃ׬`3ψt"*8T&I$PpUKӦM�W_QHzԩfZtiXԪUˈB"wm7s)̘!ҽȼyRȝ� sg#ICvmٳE8pwo ꫇H=azf     ( A =OLK�3gm|EAQ"#rQ"ƉluXK|pȤI1^0]<$@$@$@$@$@$+~?U<3� &jȎ;� � @P 8NPs|� t$2d iWf#�2~HϞ^ g<g 5 @tT˗/NX  78DŽO;ò ̖� vmgD"S ER%Kȗ_~_2}tYllذJ*F Cz� .98ѣ9W,%�l8<5B$P:6LiZ3g8ryё%%    �N�/ D@aCxj.88P םe ?3w\yС/K?\Ȕ)"{p"ls2e     D`b1֭[Ȳy \ɉ}S$@$@&b_CkEZ3ΝJڵ1qUdգOvm}c6!A � �Q~b% 9w5JTB?Eu&mi'륥dx @^'@mB믿dҥx2ԩSpmF$rwU'R~}67ib @< 7\vYB"@�tV "� F�s|٧t0L" c&'Xٷ � � � � @v(/&@e b>eR$;dt.2{cŶ}?  scɓE9Q, � � � � @ժc 6,#r1Y UD'RDP, ?{goSՆGy3sf* !T$P2$D$S$2DtɘC22g {w{ùasi5>g$@$T0 #ʕ. AÏ$V@۶ի@nmv�LLm;h @�PŋPU  v 3ڹ v?t(Т&Mlkgy]wdɓ � @xǏ"gСCu0e\?1ID.O<ȟ?)Gƌë6m.ѧز%Apq# <C� \>`2UM®]  J     H P2R<I$nEXbAA@͚ qY? D@z 1@xVF�֯y]U+F$@$@$@$@$@#. ޳-?$@'ˇ,H^Ν2dMHH"@!Ȩq? /]S l O@@g&Ni&O2eeAܭ0|8С,ggk$@$ O̙3xN � � D@_~;4ib ?t9FT2eJ@*HHO bŊ>/-U$R"q|Oe͗ ZIJ")Y@,XL8qHOsEr/S)C� @$yQУgߤ�    p� l$@#P%bdu_H :V5LYj :GW kK�rF *UL$@$@$@$@$ xT� qdi@+H'th| � � ؟aFZH$zбAKN *l2{6мtƍ %i+ ?P!{x9dΜٟƾ� � 떈g*Y%fޢ7&X#~I}2HH\O 81g S!CEQ!"_|G,# ٳg7E!3d˻E $`xT' WЀ_tQ#dI`|(+[`]$@$@$@$@$@gdtHc 4b>VҤXlH Fo*0e L$ p60kߓ#GAӭ^G� � � � � ] O\hW.o{L& 77�`"  _" kH@ @^ ]'7{~z,CSҦK uj7g$@$Y9/ AFIH L̙ܽk9K! O|( lHPGGժUs>l C߿7¼y]ly!:($ < �꣈'p$ >� @j�V 믻UO$@$@$@$@$( moAP1H PD$nC&,?uf"4\l \ W     ?t og XѶu! � ؉5Q-$@$@P!Hp&'� #ܹ-A7?c;Vݺ%իKj'XboOi P=9y$ʔ)ߝeHH"%ܴ (P�{dH&ҢBt!LVE$@. AqGTQ']08{|{</_3gΘ-'OTQ c$꣨�O<& � $T%Ku mf` E &    !@!H9T4:_T<f -[`$_H4h�9X<],&)zhe+:uem> � � � � � D@ƌGc `m3e$@' N>u  $ Az6"{xm`,`@i#"_!pУEL^KnM)X9;u.T=s @Bh ]THH 0 =1~"\|bZK*0xח/*D$@$`/*Y&P;@KW_(dmQݳgO Ydv?TC_X)#ۈ AjRĉ|&  /4m ,Z??� � � � � Ğ� cϐ5� @ƍT7au$@'Q#@73Ͻp!ǁѣ)SΝ2;sN�~e    'rYcP'_:Y% � ؉5~HH|� }pXp dɀ#֭Ν% +%' k4i[MIDrԻuƌ^#]$@$$< ݂� m <x�\ LZ$J ŋ~}ۚv|2 N� زUZ9>0`dH/R}Pg}|p%Srصkv؁/׮]3吅ŋG%SO=ܹs#N`1 hjMnQ"g @oYb*h�e˨1 � � � � @ <",A$@'ׯL(�+27D$fSdغ"n˜,Z . иqCXы|H     hC"}"N`D$@v"p$ 4-$@$@$5 AF͈9H *PХ L$@qPQà ypR-~$�s&N"S�L$u!$@$1/[^x"_’% 3 OE mq+ � ڠڵUw_L6MƏ ^x2(M4TYvشi^cǎaٲeԩ@т dQc')SЊ2lW#޽vbK@UkŁ$@$,̙kyV@o;[HHHHH%@!HgI1 ȼDR 4j 1� N`ic9h,aC`F @It>`Ĉ#!L֖H}3w%-%     A RedI /6O$ $@$@$`{!$[0u*oرi_F܏81EIC@@eVf  Ț5+N<zY! � } 5OZלu�{uȑ>}L^'l2x @$@$ , gfϞ cǎ.c#Gԭ[طoYFBe7%ŘdpL2 *(/;38 &H nkuMq_w#    ǑA HXVzK$9{@l.a <L/%<&OYŋ A� � � � � %tgHG-� DD.P � � ؛� }|h x@ѢClmu  ,J~{E}C^X]J}"qW/6KM [l o�;O$ԿYLwq޼=/`xhjٲb~dƌ>g6 & #AkdP-M&L@f$8{c&I˗GN0qDߌk׮aϞ=6mWѯ_?-[e!irеkW̜9h>@, 8nŲ"' �&KznR|N$@$@$@$tTVI$ZmG@Pk[`m$֬ؾ]&@̡⣏ܹ6m…!QT�Rˤom!+I@� � � � �  BnF81Ҷ- K@ ݼ!lD$@$@.$ S;L$@$`ȗh2K($@f϶~�8p�_}ŋ^1n@V 3#�$@n#BgΜ+& y} gNys ]:˷YtХ , N6x7{8)W "Ɲ$@$@n&b 7o}Yd5?b޽-qʺxW1f_W\}Lqȧ~Z^{ E%QTPzu x4˗/ŋï[I ꣨~>� @L ֭@ݺ֚tnsLi � � � � <$@,Hԟv @'5PNmci ؘ.PǘA&MSIml0Ms Sq)S?W/ {v29%7m$qˁ`$@$@$@$@$@^# >ȓ9k&hm:X@$`7=$@$@boβb>ӧ&Ybo!pЯ0q"P0y2)n: <o޼T<{Yb=o)j'ߒ�  {L1ȬY%VM$@$N;wCDف$I]>ovUT'5j$"1rHfڀ3@$@L@t@A?ڊ+TR7z]*PPHMz۶mXp!> xd@}Yڗ zl[W>� � ĜޯϚT`Ik̙I:YHHHHH1� 9zրÇH9/Ck�cB"9W]y@o:A=Nnڜ, aQFa"     ?$P }vǺNtFsI �dBQvHHP);D&P4~UfM wXW H +ڵ\f϶D S.] -ѰaCih`Z{]`"oYvI Aj:y$(hG%u�KZZpaϽE K ݻuAj0uGw :M2X|& <]/4n0w.P?e˖va/^<,Y|tٴVTr˖-ظq#z쉛7o"]t(dJPJ(QO<{H<M Q"E)z<#g\iikNH?3� � � � � D�Gό%HLO+RCowl'!o` n@H9l.3sjF ੧L_ݯ|󍭢 +"     - qx:Y޾m+> � %BHHH|k_L$@$�@Ӧ @n@PPgCHѡC JG|*ĩ)TzP`b_c\ � @dɒP!H&   ?c޼K/I>I?E"QL"p<侊l:*H ;fvn )S&4h fy&MԪU C upUSpLRZԧҦMcرعs̛qg uAOэY5 @@(Wе> i    5 A!+ |9|5oX6Iw|93:Z c;-9ND VvZ$xQFf2#>[HHHHHH '_I„�#m④$.^5> � /]dl{|3)} '1H ŋsgK@?TYD6ΖS~bD^=|y`g! 6˜93(mt,@$@'o df]/֩|Elm@eː8q3s; lH@˖@pML6 ]t!e,'S}$q^Ԉwe EƍW E%L͛CI>}:,~ :O~>� + KZ%Hݶ-o]ɗu� � � �  Aqf/I/ $ zJ_e7)lD{.^P)xG4:Pfĝ Ø1cдiӈ3r � � � � � %!~!FVG{|4HK� @dhvb@@O>w@n@PPg äw۷/Tf?Ĝa¿c^K� @td9 AF� g |f@ܖ@{m^5_m!uD1LuTRE^{F@41ךg$@$&OlPI +:3?Mqd �vT* yQ"oP9Q*ԩ|I SBdӦM`%B:J!G3 � O�:/t)7OGnB$@$@$@$@@@.HHw HP&lj-A?ݾrp5oD=t0 3+@\@SOEouj׮)ٳg3s/ � � � � � ux-ZضO:`m=p4 VҧNk$@$@~K@0: � G@IjL-gm$_! -Y%KLݻk ,!CO"P:DX0 Vհ0 � 8M@ O:t~f$ p?ðD {(WؿqV1]ԩA6l#G`Ȓ%KԅkDg 2xy6L$@K!0a27Ct CH~˗MAUb…XgeEA)޾}dHH~ղti` o[IHHHH7P7$@F WgLGH @hRA3 ,�y(_rsqwsY$5jd.l>|bHHHHHH |׉5kǭ!@O'Kf+$@Qx@$@$@>C@ u= � DD`d Y2E rq; 6]ݭ+4o~y۷_}و K >a}\ � DH@ O<~  ;w@E�/L #o%k jݺ56oތ+W"_|c/89u/ȦIH/  ,:Gڵk{ ω'F50n8:t|̀M41E2_ Yf'@:BnHgM "ܹ!@z C̀^<lHHHHGPG$NT}P)S"Ͻ$nڶloldk_~+�3[Ÿ-[ 8GY+W D$@$@$@$@$@FV-k!quW,5g pAM}[h � � D D!Rc~,)RX5.f"# /̝ ̞ ,Yd~/%Q?Ɗ6]80Vհ0 � 8EBNab& p+W-9^܋-T~ӽz_oK~,q3zY6H$@M`v/ \h>>TT %K|l_ o(P�^u3g0aܽ{:uZ2xڵ@W}׀QCΐ� ؘ^̜ |)0|%kHHHHH' L$@$TLwiTѷ/Ȯ:0)XLȡAAA愍 ˜ݻ2eKǘ1΋FQ5wۈ޽cT֬�C"==CuzH,<xcF7^*_ zj7IHHH zAQ~&o޼"`D'so&ѣG,l$@!RIVETy/\>L"ѣ.vRKMo[|& oo n\ U*o[IHH <y ΐa sa1?q +fi<]f-Z/vځyaÀ_~D9c[˓� @dTٳpGdHH xM {v?r1(\8f/p?]Ƭ7n l  7dTh/z);]&=zxtWgҧOo._lxBo^2AXp 7:YQ͛m> 'zf�u]%  6�]F    ! A$ 47hԈҡR;&=fbo(5 nUڱc)<Vt+bjڴ^Xl߷Et`)࣏ b7ʕ+Uŋ%J*U6J:|q    38q¼8\=H<DAij>+׀rD$R U+WZǥK?BCy9[=(iq3 dԐ<B HHH K.HH J-[@X&JZ`w j %KL"cǎf)t#yޒ% wuJl8, @TRiR52&  e�mss@B|jO>3|ԩ8p)ޮBG\o3(u17Zf$@$ غu%?͒% %~nS?X{H'ExWMs6i$f͚ɘc&S2X$C3|Xڽ.^M6a޽6p $I87J$`#< F      A@  vPsA\[?kKVVZᩧYen,7n\SdE'E4zӵk@&FEPYl1m]p>r$'K@{w Y0JQ7Q .${~Fzi AvFV   �A,X|j&gϞ/l/["SvWHڵk;wbGcT2x` K.Mvrt7f$@H@ҥEi3 � � @7! HH#0z4$ d0dع2Ev".uŁ={ͣpXhϋ[lr '0o^ljaY  Aj:ydHH Tqc+h@H})SƼz]oP\.;wlνϚ5 b%UǛf$@$J\LѦ 8M*^8m4t }!(|*U*}РA"dj8rH*Ó)mgx) m ;� ؍@@ֵon}=$@$@$@$@$VMXH TlfE)W嗀Gu�o):: 1DFsھݚ۰�6Lil1ms^Dza@8I8xGAPqUV!Gn/zmɞ={  � � � x ǻC<~|2:t ?Qq-[`Ν!H5^x ˖żǏW^ 5uCmVDjpg 6LV}  GL$@$1XUw*L$` ,X1`\`l` SM;t4PJǎ1j(E%9 4ѹw%U x@ƌ?~|8q}@$@$^&P4p%w/ж>*yBK: b{<[ޡLc~ /K�]O^/pK"5y}i8> >#i5k?yE*UU|ӝ)(fȐ@GgT?Q&  й#!ڀ{"[* � � � � ؍@<D{HH䁈d�MZ3gB3\rЉ &`֭HݻwhV)$#4ڵk'wY;1cDXܹs$0S#]pdjǎH<9Zj%N$E"It$h1cƠVZ 6ol)QZn-QFucŊ#X<?3F U˗cΜ9CG/^ ʕ+C5#'](%h }ra+yĉp.V;rOy/o>sbOϓ&M+=nFΜ9s^ SCCΜ9#Ea/8wJ*eS)%t=ײ-p:b <\8- 7~zlPO0I'СCG~tbXVxAC'q iv(矑,Y2Sr!6z\ ioHHHlO@ 姟~2[IJST3꽃^vI |EyD#+T\R1( )b~oSO÷$@%Bի:v԰aEuQu|CN> o1 Z[5J= � ؁� ph � @L H ii#D*.CCa w ؙ.L�dxy eO4hq<ϳGZ\HP5g ak$@~K@ c$@^$ o.cJK2:&E埣k һr?`�7`uA1 � _uqaB~ȟ?::5\s` .#F*jমl޼9:u6?\r2#IT#*UZ}$ Xx%@4h`?"jY � � � � 6rYj0D$@v#paaqƠA,]{t"Pbv26nhp!Q.;q6 (K۫WnnAC M0?׮][wȑ#'O66mdH,3k׮5q\`ACD$ 3DC$}"b֥m E*rƨQ q6Zliċw]3JiҤ1DKZjl̾0É! .�׫8p0z6ԩڬaS̚8q|7998v!§X 'qm"jgϞ5S=/\*T!ymbW?uT\Z"P¬WHCME@裏zniQȐs]VCSĘsW OBTTqIL 7_h$@$@$@&]4ʔ)c^\v6DE4w3O 7;3蹺L]yϡ=֬Yc轍.BގWFm۶ H\C`\C ̙~K>"?06HlAfMh PA},9u+@7!'nEWÙOySslF@ \ 1/غt]շysΝ +3[ & � @ ܿoF|n:Ǭިs:dƨOc��@�IDAT?1cRH-M <zf0aCN2O͔)~CO+Wΐ]СC#/Q1G$c:FƵ4HHHH\J@.u,Y {|!eKa':Z`ԪAAMqǏtzݺuQ| <Ѥ+*,:93TёT1eʔF y˖-fݙ3g6:|dɒi<yMo̙g}R;Tܹs6I>qʕ<:٢u: ;rt˗/y~>eʾJcFXܫ1 ?T!=%D3\W2FTDzrY.]*\HAՔkKҤImKWFT%ZQF 3g*IE"qƙl߾|z,Y2Y+ (i^vM&C>XئZfذa!eWS碣=� � � ؟^;,YۼNRxG}kQAxGi%N"`Ա-P{zkӧO;6_Ud[׭[7v~ p  N/3f9 ϙO:t$?oƒ%f p?e 7[ Gk AF&wΟߐ p3etC .f"[е]Z>apDyEF[jefxg_O2d϶H.x#kժ � 1{4`!L ' Iع3v?Gsm.]Z|JrAP{AƫFq �GF1qbΆ} ]O}0Òr`8a„qϞ=a)20B-C4/w� � xZb/LQgK$@$@$@$@v#OۘHH `t,4j< @\}7u6nQACڨT&M?@R}"'z*cѢEvZ?oRŽ;"ւ<y'[ v!k֬!uu|f͚q6k{/oٳg^zar2^TP'O8@D b(QicTMIWݻC:w>H865= L ̘?Ԭ ,] Ԯ >Ϊ%K~WC'wĆ xw!G8q";Jt)/{"nd~'S2Ez49_|ѬGDW"MO5mdV9g5 "2 lšePc " {Ő!C0w\3^\ 1oHHH|kՐ$IC hQl޼zSjՐ:EybBS?>D<2|Do$H˗ҥKZפ>L"To~x'n; MӁ_FXUGu%"hݺu A3y߾tf$ xH֭Mr  pymճb ?'C'N�ݺ: )L$u@v+L摛x5 {4^[tsCo&[ ,9rXfoIHE-E1|8x@ܓQ@Psԟ8Xʕ+ŧv>j8xw#[6O6HH ȭd\H ꇺ`p}]ۉ7+W>$#NǤI0~xT^]v7Q9QE  � &P_<d0?l5$@$@$@$@$nryH\O@/@<-[XmVq8G :":fd7ZVNB9ʾ;r~1;:dIp =':H$-̊+L1;}Ta<M:Y#IM41E;닀_MNIQZ(^X;"QBY?5UQKErdWQHWɻ؋@j88{ϱ9s1y$Tq޽{vԑVI;瘊Aj9r$~iS[QՇ:h53z:)S&|gȗ/YN8[*%   6CwYu^⼨s:Ƒ?ܕ;wnGUO DQȨz-&r;u|.\c_I\L׀}eVVŊLQ+%b}֘HlA)iA#HHbD@c~=["F @hZhm[r`ϽO@bSAAL=@T"juxy:u GxDrz- > | a$@~I@ZO5 � 4`ĘG޼ΙkTq6}c+FD䟣5`7xӧ7G5箙Bϻ;u &OɁ$@~M@` kmo?S $^|E?>V|M.Çcҥc +/>c3H' &n t ? � ؓj|d,YnD$@$@$@$@E@ܿHH 6nDQjԀDT <q8OԩSxjuHSƌC;YhOM۷o7_C?ݔs΅{SQ)SsCE˖-b.GFBQ(SLe5 GΛ7Ϝ [-ʌ7v}6BCjUR@:s .cVTF AV\ k{p~ڨ?n%W#$WEP)&kLAP՘o5oT|ˊ_m>nǢE?~vȈR *`Νe=ZAun;#IHH|ʕ+q0F{RQgܹcݴiS:BEEթ. ^*TȬȑ#_e~.RH@$:zT0l:ûҽ{vo)'煎0� h`vBڴ޶� � @1+R$@$ A*UV-c+_Is$ޫ)8w.0{6d $hs?:7sL,\cƌ1+Ǥ8WWR}^?,vweͬH// A$@$qرE}u "E|$Vj5E;uԏOpfD \%-Z4\k@[oFo(iASHXMb?]v5E5Wx~n ݟ4`}ݺu*b]OY{8xM`B@R_ /lـ M;žG� � � � 3� @`Ё[Ð!@a@@O }f :*/H81J(anI"uPQEgS<y$G2!)@V/3k֬9rT8R#guɬMQ[J|N3ٳge veiЉҩh7UR_LGoD8}4?ۑhtAL|_:XNQ2W'?a#}PŌ9sfg}|uLގ<0`)}ׯcz�dӦM[oկ_)0YvH˫i!C<ӦMd"ƹHHHg $J 端 ޗ4o.\_q\G92qjYƱ|{^>}'9ǥKkuZ|u<z6Vql& 8P@U6ry[&?Igqq$ ot\V%+"  Gq1[?G%KwvՀ A[쁌GyEFR 5q<D) I\_rSH ` &g|K;N$ẗ́[)$J'LO Qɒ% 5+< ]Au� @v�-t>(t ۷o;?n4^y7o^7 b?D._ 0!ev@ec5 AF͈9HHԟ|k}Q@:@޶� � � � <2 � ؍@s�I;vnߞ*UZ@|)?~CbQ^o>}:OS�E#@&}Չ=z+W6]},*U\([)ޢJ8IfuѬCs"EPbEHŒ&hk׮΀*3A[$I4u ]TxR}L6-s'ж~Z[ClΜ7hV^< ԨQ~.]dz߾}M#<Դb dOCYϡɓˤ"<<y2tW^yEL )i\TȔ)S¬*!Ī:=z盢^IE.03HHH Tsvy]zz=NmϴiƼ߸qYСCk[Jd؛裏L ƯC+fO:ի밤IqdI48c0[/1E~ 7͘hEIH b!He"  _$ -$@v#(t)??d. h7isgCB2Ejժ]X"3sx^LR x1>~" zԇHH ,qq1U�R$hHvsqp9?c WG}ޠ I{*Pqٽg[& '0hx{tݎϔ? ޽{C}/Qra:ȨSܹsk6駨~&  ذ@}wʹHHHHbE@\76 }0� /8|07i c_wl?!wҥK%JϽ q6lbas1D`|!C$; 0<h0KmO6ܹ&!q,XЬ#nܸFFχxsC&6̺fϞm*\FÆ Mծ *"g؝!,F LQشiY&2Tɇ?42e #qb30<$3wق~X|U cH8{{]|<J$Q~}CK  1bsqɞ=1sL|Lmf͛7"$i=Xnyȣ?~|s_|?<ownL4)d*Ts=tUv!K7"UT6ݺu3j֬ih\q.IHH|^K5>|y}EDЕkܹ}!RJ<g\rť#kϒEFժU �= !!z=ҪU+YfolU4~6U 9 �Rf"Gk l؏ 42]kPw-о[g<Qz0J6d~0N:?s@t \n]ca~L .l0ZE3  7 &{g3 7nGFƌX_ypQ_eߑ\o9wѰ-kgwoD$@$;gj`lԩO7B? mٲ\רtɈ?cI<֒)rSF-<K$@$`/:~Q5!L$@$@$@$@$dO'Z\^~٪G0� O(C&HI(ȤDZ @ DͅD ]E .IЛzu3U<y<yrʄΤm_Ȧ{Ifu%JC (>Шl f :jW+V�3g}$N O63xZ^K/$n6@DPQDȌx.B>ÇFk׮ Ȑb!;yvy믿s:HHH?_l,baE=kg4hd,"Ȑ!WW^ $Ν;lٲ7$@!Ш/ Z-E0K[`D󭎋ԯ ͂N$@.&d Рp6d,ŕ: X'Zƍc$hK>I@-оnuAժN 8ȒŹrEQS۶ի@QpnO?*U`ȑ([,bk oKHgTi1V>C4VHHtmĤIC<Х @1kӧɄ<D=ws._ԭ Ȓr s� � 8O@�v숸 /`[vm\1G;u[cƌӑ,Y2ݺuCT35%\SrZwF;HHlH@uxر@^Q@x64&� � � � @,P2XH 89&U/E kl{ZX%uZy4uN ;7nQ+ܹb5lP =С̙}`m    Wqyǎ A(! };@r6dP@{ӦAτHfIroѺBPc.{Ly2%-zΗeNxhމzɓLWEU򩧞2~m*a)@ yZ߃O?XlFןA5y< [! - S�R �x{8UϞ=EA�\w]cHHtYѢ1Qc…{"& pH*ԩ)9snٲEDz[ Ed8޹ďO $@$@F@wo g͐z@{IHHHH bOD{HH p "u뀭[2eݻ{z2b H, <x�ٞ"gOF� ~V?~Z;#3f`́gY     @Μsl_ [<  h i#ý$@$@$`gO'A2� d[=9X_QV0ٳa.u2ܹ3n4Ug=L hp& pX}qWT:HH'�yXXZҧ^Wmۆ YfbNeˮS$@$uÇ BO#6Ef͊G{|@z6lN8!chֺl۵kWsv_~*YFȨo$V7$@$@# cg?FZD$@$@$@$@1%@!Șc9 'PHPPc 2Hj>gqp $tIAρ G`hjUKv~`@k=}hĉ͉=ry.>~.vߑ� � � _7L$@n%pKT ׬݋# བྷU[Ar pS)PD$@$`[a$2d�~HP1HGg"g ܸtfd+4oliyٳ"tsj<Ϲ#\ml{9HH **"L$@$(&O4-�ۇ:u|xB8AU\|zM$@%BGsAC÷>}y/^<׆3&{Tdnj)Soqjѵc,,|~iҤy HH!0XH| d\Wk1&     � F_hؼ;HL л%nװ J5ul*e*6?yz9s+ F@ݺE@@ޱVu/X-X"/*0� � �  _I+HJ@#-[*UHgϢnm+w=: � x� }> � @l P2YH *U \(Lz jH VJ _]5~1*<hx-@R$@$ b* |W7ǏW ;fAO:�o dbXѤIcM-Uz/h? � ؏q@ƌ@fۦS1i_QH!~!}'6l%KpyTX52ח92)SHzC!H~%HH Nm 4 ؾ0k}:'   p7 A0'yh:j%tئ d?p!;wEh7vQu~X̷YbzYb~U:>yŐ(@PgK/)RLW7n\Yf"   �WM$@ 8qbw(Y66m, DQ:K@ ov67� $5Ǘ5� � � Ϙ-� �)SW[ATVߌ?F~ĉ@zɐtͶ5j"q.0Ǜg$@~F {xN<)t� !9s!C'�]0p -<Ke@7Yt0Т*g$@$]<Zig\ߒ,f:AT!raاOlr^F!Ȁ � PߘC9jE G    K\&  gΚ oJ)<K-˙|y M`.Ȥ E s78ȜYO )kJ־%-lHHHHH@" ;I`}}5Q" Az 6" Ajh&  Ub�L$@$nɒ+V�eUZsn(V ;=XĽ"E>J@aTH4^~& P!HM'THaXKE=|=E =*96/GIH ?^;vfAfqEe}ܟe\0/k:uAj�#&   P>mp P4q    <:D$@$,y-[M ^w-|D`xq`dOu<y=7={YZOn^8r}2^ZA$@$@$@$@$@$`OI&Ş=+8q ,$P*aB@j0� C }> � @lz/3al`Y p.\h�[KgK2?EݺAA̞=cU4Ph8U5 @%!C$T o�MI`rZI15h`t W./{[/_KXL$@ MşStEß dVD$|?&NUV!_|޽;N>]V4׭W>� � [WD$@$@$@$@>GB>wh0 o)7g0mPpbv!,_{ R(P�"tĉc ܴj> ^m};ޢC     p- Ie=ʗ\@צcno8vH._R)4HHbD ŁL$@$)f{-[FyecG@bܹ% idg @L$@$Sqa3[lKޘ2d9 Gg,9;] >L$`[%;D$@$˖A큮]]Sk Cŷ Ǝ+KD9ƹsB$d$pH|@7X4`]۶KCJIHHH 7 � @L };p&PxqLja"l Y69kV}7={B8ڴv 9 ZF$@$@$@$@$@$`wŋ߮,(U*9bw}ƾ [|\J$\Rk$@$@~O@ n$@6#1GƌD!u)pܸ袪 xq+pjujִ~ p]H 0 d('T5H|m@5 %hPvf5uxI@HH\C`@IuM}%ėN;wơCbȝ;eI[?(�vHY.kUR%)?4G$@$@$@$7(7!uxeaCˡmoX6IyiS^=jUKtY3oZm߻[gES[hؽ:C�ŊHHHHHH3I>[3t8vgV%bU?? sTT|\I$@$@x ]H$@n'&NoA܎ [zg,2ei4G ~AL$@$S9sNL W iW`͟@ٲ^5@4 w� � D}?XQYI1 E{8|0ӧ*>?6SH@:/h˂='   cEKIlJ qbHd$˙Y.4f nViӺVZ;m[k@jM(e=0-2$@$@$@$@$@$@$СC* WE2Uqqw6u)!H$`o/[Nmo;i � � DF ddH4VJTΞuw[TH[7 ( ҩ~͛{O{xy`@B$i4qG$[̓W^J X'r$~~&~HH PLԬ(=f?M ,ӧ9"c0dΏiӦnV'OL1$@$@n m*UWƏwC#HHHH\H@ܿHH\A嗁4BFg_l?-Z� 6wm\Y�h Hފr;v� .. X/ � � � � � � <N`РeVɓ'-NH�L$@$MWXJM+6 � � Ď Azci Z yPs[a^$l?ΝkH-YbIl lb;$@"#G8qaxE6C$@1#p UƟPIT4(Р IȜ)ȔYyȐR44Ytν{=>}p^wZ~\|1Р0sf3=}:бcU"u)"n m 𝏒D@YSA2dǛ.]ࢋ.B&M0jԨhy)lؐUTD@D@Dwށ {6E)se#" " " " Q&`reJ" " "P60ipu@>'�O> 0RP*o-+�cd>nPZcm@ݺ1'-(E尗H�' lD^.kW`}[rxJظq,~;MƬŒɓG?n p2,l}:(@,^RB,JS" " "P4v5xV4+W�S�ݺ-[_1tf"ظ1|) @&}J:~8p)�:uKV " $PV-l5?LaZ*:(|'1t(0lP2u߾�m;J"L(�Rp9K9@NV';nFGyO= )8WB)|4Ȇ~]FlN!# AHM%JB8c|0@*2 /`t{I}{nDZT٢ ?8_{-Px.;w#'*o<,й3Pb@VO=U&!nsR r&feO?}0D(\wߝb튀@X&ȼ|",DY@X�J" "( ADP&�;*ЫWAr5"9"nx:SD@Z&ɴxbq$GD Q#ٌ;L%K&J UΗdlȉs8'B:M-t 4ZB.]gnx,*a*SX>aĈ@iA9&F.SD@D@ @cG`,n]:S$1]0qPN RzN(7W^ hp0du(_~ hÆ\ȑI"Ƭ E@D@D@D@D@D@b@'€bŮ1/_R*U�μ@Ͷm~ܲ%Xsɂ+@^ boO˕Y*HD@D@N$uPD`g |�44st<z09JK/ڵ4fϖdNt<78VoKV@zV %KGJ'O<ԩ08e >Lۧ BBCD@D@""lgA0.I"%"1c~,MqbʕQ*!q SDD@D vhMabWJH2/B\D@ AD J"8_ڬY/rqh= x%駁(VY[DJ9l`c)d|)ĉ0 NJJ+4j@6 ni9?1 rsHe??t_?:," E@``=S+Q`R" "  N0z" $0p GU/9# mh;�n-'L�:x WU|>hs@jGgHu" 1"F(4D)tMHsʖgi-KBd % > :.]-%о}{̜9/"Fۄuڼ{,Ew%gL> N" "P4J~;u߾ESrd~h\(�bŀ&O.4 UB\ҧO1ԫ8y_#xyvO?)ZA/�=wP2г',:p �?{-]3)(f]'" " " " " "� jcqm&`xقVT+hX`'+dN$(%%ի bYU9D@`|9K. 6eL{'0n0x0p} /^ر4{6ЫWnh[UU L犀DL`zU+>ҹ>89|MӧzrJ@r;Щ@ :ЭPdR"PPl2gyٜثpEj`cO<t邉'xN|P @zv05*PAID@D@D@D@I@rK񤯲E@Ҋ�86`uɇ3m۲nLĨ<4lL ^DaR%[ۺσ�p2{oXD0`J`„@ ¡J" " " " " " "J^{m9 nvb f6�_$);ZЎԯ@ d$" $f P|,KTY" " "} &!sU" #P6�Dp.o JP֭+W9e&�0-wPܙqA̫T> oxٸBE@ "o93+:cpq '�ժPF$39s]D@�ugT0DC@`=ފMͼM6 }6&\UVSfN)p°OoB6$^T#1O# cI%Č)ĊٿAO? 9?E4ɾPd&:!n \r py� 9JyX xyӀʕO> w:`d:NX1t$3^OǣDp{0H h`;]s@XEID@bI`jBXD@D@D (.!sU" %P@ڷFR7#ZG�6)v-mX�6YR]7~3Px`҅w lڨ|d"PfM,Y$$8س<iRPQs0ЇƍZ@jr<QjZ#"  [)@Bf/iӰlѢ:,o ͛ƍѡC[9xv"5lYXD"" "OSĎa>dz6*[D@D@D@D ΍WE@D ^:u~hh'a+`xvr3/V,_vcKstp-}Tʞ�']|U0 0 pZEС@Vf@8/^x xx`?6lv&A@~Ok5kcWJ r, SD(πTCuk(&AaY2^ P|5;|0H'mCI�k^C@ZdJ" "_B; W�81<9BB� p.+�]hw@"#pEu/m|ר_>_|ĺEA֭4s2e�7UOh˹`{sZsE@D@D@D@D de!" k/`(੧G7~i#eYp"~V[<_4e_zΣcM�ÆDe- zh௿�/0I%H{+b+_x!;T,H_T1= " "+P!V(,UDoc̢4  J!gw�̚Cݳ~}?*U9]>Q D@� 7: *)@! sOޗ?)p9/�)tO'%Hsd:mQD( wbҧZ(o<d`o6Hf��@�IDAT/' Ǎg馘lY A&mQD@D ^D![~=RD@D@D@D@҈ f" IJ�5 D|󁫯o&F8QrQ?_o>� ?5'}6p$E8)i;(m |9pA\]  ̛;J!ӎRv\-�)X@I χoNJWA)^-[f>=իcQ# !ȢcE@O`஻4/_~n1ec �J[L֠El/MG"p5�<pbKH\5kt[dIVR5H / \}U9o`B8ٟ"(~�D@D@ N`HR%CJ" JD ia9Kn=|,L A." ":wN֭; <9q몚 ATkD@@ݺW_]\ye H* {n {G-Ҧ PcbTURT0ܰ!9A/�f9T &P{tTw\ ٮ] 1 b" " " " " " " ycϞ9O'G WN9'05A*5Z%N`zR H2w>TD q 7QB_S<`iؽ;~}›̕}70}z"PtU�|(@^Wnv5yE@D GG)1t@�jÆ>LD@bEs8kbUXmVji7sI^z)ƎBOV" " AsL8hx䨷j)" " " "LKID@D eͭ  (#w lo}i …!Wd'y_bvE9" 'Ʒ|{w.�U+w@|N:�Jŷ*]D@D@D@D@D@D@�U#k_vOc�ڽ-_5K˗u*OD@D@K@BD@+W@hcݺO|7dCʩ(@f@"s))!D;$3]6s_oܘR-E Z~h8Z)HOSӳjur馛Y緫M7o^46l+" " sOA / {v KP׋@ 4o ZE!)7p` -@v~ :$B 03z ٽ*ϧM "3S%&Nnh\8 N}Q4s8UfR{E@D@D@D@D@D@D zh:4w D#Ï6wԨA(;.Z6$"5k fDNà F~`ˁ:uv=(x}{ ٿΟHƌ Sl^=`�஻"iWĆ�'j_w0lbElT)" M9A.Y$ڋą�j+Op*CS#s�zmSD@D >,|,KUY"Pp=z)7o0x͛Ѿ}{߹|cV HR|z;#a6IH`L'?FOx:^,W.޵ O; ndI_X:w(Iqb6m'm-[^IJv*KD@D@D@D@D@D@R�r|۶M-N`` -[Y3Z*hQXذ!*_>%<.]w]itKQn" "U�] P6jՂ(rk);]rY4nreW&=x@TSNCI%�$" yU/^i\D@2X h,R;)M_`N@&)L5ND@-Z"/L@4j,B6sŁ!*͌dϓO>DMe= AOHID@D@"!p|ڋ; 1#t䏀Kg@`$oiWo_Y3vmp-0믿tz)eIqիW(L[M˖-7><)J(ᖒ6[OS:h*UX>+ӱQQ{ 9�}iࢋ +ر;ˁ ;[7[@j_4(X(@ |L9,A{i38x≂1B6!韌eƍnkF޴i[ocq >;ɅΙY1F"%>B5  G1S' Imw1:r t&RT7:|h-+u)S;o{J. 6SHNk-UID@D@� 9Pd#@I�^~AȄc@ "b9;~ wx;_{{}dqx[?զm\VAK,ܖiji55hK1/J?D6Mq[1ق#7Y mSo!R2H7W^ \}5~PkQD ^J %HEw|+~~;+e2z|I{K15*W&v4m NRj*~&ș?'" " y٥u>!@t3''f͚e>W_a·6oyOD~McO '~ngY[ gj߾:|h˧]빦>뾷{}>;{}o1H5m\ʘb_x$" "?@@˖gd# !Իj@=馜 Ûfvm0ԩ0Orߦ|) `oy/P4l3XLƽˉ8r 6K/aƊSN$;]6CDrɒ%?K.ʕ+]S<a6lhQ d,t8)^|0k w'щ ?$̓$�>@C9 Z:@jM`6D,``,?zt @na>-ʖnXnM_ׯ kNsd$~2=N^4zp;+o$bs.~~O(@bpGN~@ i;6p~Jtt,[s̺f.e+Ď=n]$5IU^D pL`kLqn.udv1hIfSNcDljokm~s8m Yodwd\u?ܞvvpm\ȉ_Ӟ|6A5=35]1c0'ҖB{FBߧM',{m@T >LjLD P>J"H_ιu/_f/|7$}35&Po[f,[ϱ~Op|Y_sge;_lR� ՃOQ" "@v1)N@hǦ-6go~MHaGOcǎcEiv}}jߢ_{>h gꪕvn8.> ~"zD~wG<k֙OH&g>_m/}f,>48lo{ $7//" " " " Y H2+틀@ ,Z| 9kn+dc~j>lX_8yd5iҤI.4S֭ :QRJ9g哓Nf9. tLJ.#Gtu׷-Mhp9gh̘{nd|h>R!OdLw" յkE@ ?t6d[d$#CVӶг9rM_y VZs>>"̺tLD>3׌ IKڷ&uP'E-VZ<E>sr䤓jVgL:eVXh?VrewM"dd m$9d%a9vom9.qrCixF; zۆyp] 3i\:uvw@++ݏ@$qٞgkЖo sNjxr#k$[oӠ3Mۅ_h VKDJ~u PMID@%;;+PJlA( D/I0R(wv?Ybcg=Cz[Z>yA`i6imU+E@DL�v;JPN~neʕ9Ҿ.q׋r.kr\µ_>[`=PЎxċCz\|9~g':9w8k"oì{7hM ǕJ" "  `ݙӞ䗀 KL狀@Bgi�L* ɀH>j@@&~gΜ>-ӧOw(xQGCAqh-P ˜K1c})\I_'SN嬝`䯵wvXX[#'i\]h8`qfboщȐ/Ə1 B<0}Ss60'nj'" " " " " " Htt #1tm&<qrk:@|α;Hu P&~Ffgͣ-OfM܋Br2߫ŋ; 0xV HzpM:jR@N\mp(~ڼND@D@u%h7E$'}4<p"hu ,H?/G[!6ۅ .^/\& fr[%?Ġ^ 'v0xqH)(ۜH<ߔ)}~&N ~{}qv 6'+gCx@(̞L ;HG"ˇ^ γ<?W9OD:! зo7B8<hS]w˲eܚ~YӶ[Vzugs ED3WL >ibۿ+f̘|ai*J3k5Gjժ5KID@ҍ@^6SlIFWD@D@D@D d"&M%" Q"8^`bW_ 950dk}q^ÝўFԎ;ZA&9GzE ]tq $i5O? :rogu:t肓O.i*1) Ɉh-Z�-[kӾLD = ?RPx'p1W( 9bҥn3w _!єTs :D2EV29Gw[8=mgGBĉ"V>z{5~L!|)vI{w\~sD KMN廬@zdzgRr"@9r{p2h6'CDŽdžR|^zn wPQc0xi'r ? 38\   ',g݂i:|f͚^M>6oy&p`|wP5Pd :*5Ǽ/ !k) BU / 戥`ԤB~sM{B? }e]=vRioi*p_Zj)-x~a>}nO4ɉ~>ըQ#, Vy" DY3`t{@W]@"d" ED@r Ppr=0*_￿Fm 5b⢋.SдirK4uQn2d3"GxѣGs{[ !ԯ_ mի_v<9JpǩSG{濮$" " " " " " "!F3>:DrΐtB4:1q#]s8UO8:Cuҥ#N'@GH;ϨY5*3t 2PD '@LI/W`�%Hf|JID@D@� <OID 5 p\1… ݃%K<lْgשS[vp9SXOER:q)L\80Əm޼9#rʁ6 .uڵݲ[@j#y prw7 nC5(:j,ߤ_N{.-T9]t`!$oTs73=+ w]T~ Ppo_`g#Ǯ c>g˵5}�AI C> ƥ>'撶miz;o<|gXM u.OCΊ~uJD@D Y X<E{w Ǫ䋀;¥E@D 1,^-{a`ĜλԌqqqщQǢ_L{n?~=^ve&h zEfh 2 ?~u i~֭0u x(@ΎtC$:DrMgH:E]6J сN-,i!fG3:DiRIR�6pdFrm.#ӱ3--FgtԤ&5BU%HtsD'" " y</{$"o9 Eh^;9c1[l~B({GPE`=mq0?,ha1cy79_ɥN9/{?M'P`ѥ 0mp ^aUOD .(4 !ȸ/B_.4 70 �Mn$" "P@|6;貄'& Ҷ?w܌~ȗAivc=iXX<GI�OKNcwv &8=a$m7h cߡDXE@� <T,a�W^ 'R=U& !ľ?d"0o|8蠃OW^}3;m.@K|eo 6 ={t[o}bFq=V0!HN _~8 ! yt@J믿#$#sc$?9;Cp f͚BҥK$5J�4l-9rJ'Ndɒ GMN2F&#ѶO/ AƗJ"dx*'(Jק㧟~ʴpb('2Q΋w<8 [D/(ۨE KfͲ-;?ٔNiconȑn /_M6oOE׃;G t'q HP|~K2AoN.R98H H@e;93֠qc E ,Od@k;?[3إ#87إoj&@;d h} ٗ6B{J&My8chޏe%}D @�siFO" " " " @@BpTG'@SNGuƎ FxR n\82a q};@n 嗁.^�'ݪU~5am,*Ъp~块t!vZrnc$)4DQ:G./ +J" '{StdߜW_uǶ:>)JG<-fd $1$ !VQ" " EJ( A)be.&j6k,g۾};J,lڵkW7&p>+Vwy@D g{5j䖬gtҌ >(͸q2&*U]�|ʥiӦk/U's3 H)@&\)1 EJO/}/Hԩ WOB͛=͛m~wnMMn9>}8 gGd<Ү$"�P.K!9zΜ9Ώwimr>`^Ծ@<'|ڶGMT@d1WD 0!C0tP7?zcӗf͚xqb޽|g,j9]q~"|oǶO:G/8w.l;`>&P \} �Yʎk%" " " " " " Lg̘!IE9$$'dzO:#SE 06'ri׮]!&6?c<CNtԤ&6PVI{UWD@D@bGcWJLBrsi`9s Im{�~߾}3D)O|%Fn })(ƠLիWGf2ͨZj|f?4k+"2pv?/ǏJPSzӿpͩ&DD@bMbY WXCmbSNu Eq CVZK/u |�J" #@Tcn9ˈ#<#ܔv\X,-" 1!`1ip9 '�? U@(f(3F'~zO@:<yQq`…_&" G)+lF0<qb i&aoQGtĐ�}7h2x%8Xf L6-cY|yЛwk A*'N�oQZ4=<޹iBaB \Iŋ',:z,<}7Y+C(H%W0t#槥#۝JH[so1Mu֡|NОp™0%E ]. _gϞ&3-'r9#q衇j"x>3CkXC".Lً@ Y@pGSŋR;*IˉxW _'q@zO9@:`d:l LG >~WnNi*V|h;ܲ~%bT'HK �mԲeKP+F@\ qp-0-VH$, A&QD@ҕ�ynbSOʣK{vڶm\Nٚ/76 s=F2˶֭aѻgw2Mx,Y/҉ Pwm7͚5s7nim�ի1sL̘1ítMq= B;l-[6Lud!й3P@,%$Jd;n_غ5t~DrRyI{{Ί+0~xgh#i(a#9(\OG=SB(/@ؼyqLyTRN9q9裱ؤߨg E * |g�e&L6mz]9#g3E ] w'n�>=jă{ XL!7?-uPw;v,ƍ7nDF]ԯ__~}aD p~6m …~sAҥm]v8\ $j*">� 8 `J$n." " " "Pdv+@ lڴ }ȑ#qwkՋ|S|xN{nŇ~^L4:']wYf]u3UVe8C!r…P'2hѢCФt"P8*Tʕ+7߸ex衇0\&>(Ȣ$x#9S爀@b;m$ TP0>sYfbŊn;(LOȒ%K&STW"$@;h?3&~.HԲeK84*zX0"] Pt@Ze! AF]MҁMB$wR-'33N@PO>ѣcٲen!l{W<2E@D4hs9J?g//kAjбcGxh߾Rd" fO8ZID@D@D@D@ H2E@D ֯_Ν;tڶmڤ^ќ|Nsf#pEA4Jro#wihQt%hӧOwΐtf^~3umu. vQE@bC`I'uVL:9lR/g5;uիǦr*%) Pr=ꪴd"@!HwR(� 3|7h nڴ)veKD@ҕ@ʕfyqaI&a>|nA1;B- map_[nN9.X>JD ԪU T*< P9d&rfgdmܒTD@D ̝ 4luLڭ3#Fp"QmEaV[D {x֭[xҥK駟g¹|\9)'A@ 4jqzi�?yfӅ" " " " )H9wt_@>lڴɽ@?>Ǝ"Ir>ܹEm똏+S- 8!L|_ D@D@D@D@D@bLwک8OIDphF<y2y|ri3 yA�]-" Q&@;ĉ&Ek'4oa5kFDe.�4([@H%Wc=M7ަ[&b[w%KƖu2nߏHQ*=o#i?g9r$|M'1':8HI<*E@�ƌ0-fO=T ` ̛x KYgE~XP3/*UW^y%t4W/G1p>߰(Wxmؘ%TL=LE/C坽vc9ŋbiJD `QFwk֬ C�q%UE  XW_ <0,Pp jIUP۸`W" "@>}0g@fR${ŋn5>lOcРX1sQt^R'qQ>yʔ"Ea]}?0tPZ }9"\-Tj�wtļϼgϞى@F1ۗL `g+)`�eBD@D@iUD@ ǏGϞ=͇`7~8#1c ,X�> �C"y" &{wN"7(p֨Q7thU@gl۰@]D@Rgi>oE@E6۷GKu@saJ'_{Eݢȗ.]~!.]{I2ܕ$3>gg|fg}LEID@Az(fu.ڵYy$; A&TE@GF%}{4 P??{uWl֭0'?`D׃(_ 4m  P iҤ`" " " " " " ">tp�Mf&Ċ+D3<ʕKզ]" )JnݺꪫW_a…GH\veN%EfEHB{:MD@D@ j C`˖-x睏F׮]QB|;w.nv0'%v //_DigΜzᤓNr8U-V_aڪ@dp_=c<ĩSUÏj[D@D ?--*8p o?۸c>,ڵk]vTsg|vgݳSh�|-Т,}4rU" " " " L@֫d{@X`z>>mڴI$S4N5oaÆjZ8jG`"w 'd pYRUD@D@D@D@D@D@"'0rH4i{ơ>#E<')" Kf͚0{lj*x.7_ҏ�9 ޫ" "v-hտb&(m۶ᩧw;q4o޼pj(;zѣGc޼y` Dj 'O.S'K>0dqW(r=碣" K@#}*QD@RAklLU>@kO?h |ݯ_?;Ft&Pti,>}13GID@ K. q̹=fLas" " " " L@B|Tw'p58AŤ-40AB 1)3 ŵ^8<IS5j yD@D@D@D@D@D@D Q#pqzw8 } P ~ik ,ΑiӦX|y!-YZ(SFM>CpǢȔ(#Q|}\uUhРApnݺ5x P�RJh֬իW'MTX.ȣ B}ѹsg'&TD/T=RID@R�1I2࠿" L07C=mj"(ڵs"oޱ\ /[nΗ"eGK:Ohg9fH$) ;`�,Z(N5Ƚ:ut=}.E,l,q?F௿`σĭj&";dk +D@坐t@坐DQLWпNDJ/n|5ТElR)" "8$jRkGiܸqOL<i 9U kXmp?qG$;:ّh۶{Y矻gAJ" "PX~%pI0?/Cas" " " " J`d-" N`Μ9xpw {f25kĠ/Bc%~eUC2Mc6mڸÿ,UTK^vIz񘐽uV̟? f͚/z !x7*E0 )ヒ13gf:3|=|L("K/a޼yE)0Mᇆ NJA B CǏw7nܘPRHBVeD@D (TFB tSTضmD*={.$?12c~W|79rdҋ\&Mro|_?Z9f( h?| ʸeWc+VW\&DN+Vtf jgEn}Drs'. qcE P)ˑVw z5E] <e8r�.GYte(gH^uthmѴ61 ~k0e0pJ"xk1?~jŊkܱ3 z5|dԨQ.xADM|gA|^QD@ FdI嗁8l`奫D@D@D@D@@y&/K\D@E!t钯 sr5n=\ęJז)S / AmH? qbqjȐ!HdH.r'yC1[4O Zj2X4,=XU2y'kto1?bZ>}iӦYT}QEq>RA˖σK.CbSʼn@(^< 斩EH;u�Mf&Cq#)r 6A:0!BGqʂV?k֬zDHx !2Y_l.bh"G bĈΆѫW/< ]xUn `&`ذx@劀$ ˃ wwdKe8qʋ˙ %byuxߟ}Y|zl퉪IDo=yr Zf%Bd͚ /=yz-LNT 0kXqGo;X;\3q>,3&%(,7eoU/l^D@D@D@D H2*"R/xٰn6GN@b֬YJ׋@R`Ν;:_56lQߌ:ֶx!ǚgAڳļ鰗H˹0~)7'H㼳-q8AxAeƎuAY{w={Cc:CD@ҏ׸d{83P( Qmʔ)Ic8ўtL377j{gF!Hnuy1o_Uע Er8xf1sqdꫯƬd)re`@}HJ" iNvXpaSr/Vn_A']t;|h׮ݎ&ɖѻQZJ^ID@ґ�ժcˣnYM4)_#Xoykܱ7hˎ;QF;*[ g}?lRh8q#pa�J" " " " A@J`qJ#__~A6mfsx1qDMC83{Z{.+V@fpע\rիW_|l;tP)S}>c e'x"~i̛7ti"P/x &W6{ lbz:(gs 9QNtD _�$" " " " " " N{q~G-[6;w\%?|~!FGy6z뮻PjUA9; rq.@d��@�IDAT<x0lق /l޼(lڴ&28Dvɗ^X&h3aZj'Ɛs>}\dm//saԩ6SIݘ?ցB]vHiӦwvݻ[nmepQGmF>~w3B]tqO^vg$ߟ m۶Xr~QD/=$o:UK~;,,W|_:Yf"G]nu'_|~)8TO5+SOuΦ7Nz'.k} 1</q̘1x78묳2kܥ}GO}V}v7e뮻d*U :uK.qLڂo" " I A+c%Hk<x>U }w;H|1n7f#ix8>^z% q;)G<Lߓ֭[3rۆ]&mCB~Mpδ0hF0m cOnm9py9) mQEr]87aye"g*CǑqRg}M-W^ ~ЅN$1 Ay/rR_cǎu/?[h,-#Y67" " yX\Ӽ9sp:5ߟxDߒE㘵<;lk„ _rѢE<?3ߗ0vپDӟsݣ=䤓NB!;KYY/Խ{N:1PP." &P_<L!ڥ(?#`w(N`ʔ)!2}'ӵk׆;찐9!>';܎<Hw,mXԙ Sг>2E?43իٳgl@gy`c&DL dyB&C*UT9slB;DBᄏ;g$M"pK.f,C ]}ծ#" " " " "l><5ڢV@4 ! zmL2P&Moteh^ ܱ L0dns9^er)pdЬY&hħ^z.]Y˶0!sh1QSO=211/MˋZj2a0w9%L"ϼOn&?6هh/ݮ 3!@b"e . S;ɍ!pl2!ɨ_|2>c#/;X$3C&*շoߐEpX^#r B$o &7;_$uyYmgg\~?2 &JLՕìu<x>-x:͛7i[o =%J^xŋC,}MXe:~inذ7|SnOnty0 +ncmsvYy[&w ڸqc Cze TGƫ1EB?$dhc9JG$*U!4pH瘘7+"Ű !wGh}F'oݱHsyk,B믿>믿f[6<6"+DC¶ 駟B6ѵ&eiFcFՆH80ڔ؄Fr]87aE1~^ &cݗW Ƒ/:sOȡ=nD +~g3V"AJW9|_FHD_+\ *Y7aw[/&m%!{T|t@(TV(4tHW^X&SvlEsbȲD^6omA|C&L`Ώns}=؃Ge͞$5C+V `fD)C{ldNoܽͮ&>D@D ՟|1�%&`K="ID@'@Q�:ٟPt"'zD}'D N4JO?3qF_(6Yn]9x>'xoذKblѢ;qmpbq/�>{: \Eb(T$" " " " ":l8"aԹjI p?'NbjѮ^%uY},l{('}4p˒%K2.a /$"as˸6vׯ_!|hO^ 1 ݝ:uOy֍Ɏ O^ ARu p /xy7sf̘ᲢC&ФO9r[e~F#OH򦝍߻XF$u>}OzkF[3ħ )S*UBʕI0`@裏Nz‘0[lE' d<:tȰ?7yY&5w#|M1'O1C"yx8 Li?uWc%J7޿8iǐvnߏHMDAENL)Da ŠQߧQFS$p!H Q2S$}sڎĮk#!a_<<m"QdF3ՆH8DҦ&9yٮ2fڼ|'vzEBl'Ft;tfɸr7ؿ&xS+뻣8V'E 2Y /g~4qLq#2q�߁ǯ~nBwOc0D@D@ IY@BfGLtY5XH|x^^>|oy1;HIe!}<Lq6e *YߞHى`gcg,&Cr?%> lʯZ@^>֬l}." " " "vpJ" " 1&`̮D4Ւ}Ykf&]c۶me]2o{#lgaD:u`LQT)?J. JW_}&ttqQF\aʕntg\bFp 2Esm Ry@B(_</=!W]%<o(i0aLK/9,lb fΜ۷Wؔz-P#jԨOV͚5̜uV?1_.2h{!|}ެ Mo?sIݘm@&)?s̴yI'9n& d.c 򲃙b3|"H[Sy|]YGRUVZi޼9l,r{ӦM)hܸ푛Eh8,|^lTW,� `“9/ߠo߾ewʹtRYZ5w)1ko0vgg]L2>oF``�?$[k{eQ"PDPMzC 6$L^{쓮Yp~ /F˖-qM@͚5s&9=d:u*,�~mp I֟u$>$&Ď}p@F0{6 >v[ ;fȫ pM9M$*1y$2ux";gXA+=3DC`7V)>j׮_TR|* 1+3?~Wwݚ{ &ƍ?,pAxOߜ2W%Bz\$cV[?oǑ^[bzHIe#綶m6#{r~DQ;}$D~]t4Oۑ1dxk==z�s+EQ AƏJHcիWw_xqIӅEBg~ 8Rd <Y^p)͛7t>}zN΃vtB9]ĉJ k֬V!;vD@D@D@D@D@D@D  iS?8z葊Mtm.A6 'xօ^g :e;MxƍE… )�I? Di'/gmR*b#ePtv佴I̙peaS S=w΄;vć~XlEnv+V~W*?p /|;}d;;_vfP<vXgo䤮sVZ_~,"M7m} luW}#'Ŋwx!G5u뻟{ӗ72)@P\(9tP'_ ?bƾ~:?ķ(w0m{V\t>/ߌ�'ڐ*S]+_"]߿?.gKߣsή=Yu?fo..?>$lŜ|~Ÿ|3ֆH9DҦ&oNp< $4~$3cڴix2 4w�$q!`q,T\VFXpa A[un}?"[_mwЊgB& GX?{DGK!Hw| eqTA5" " V*V ?H p駟 )8-Ͽ%>/fnޏ%c]qGnD/x„ .,7|C2ed/ve\d:wPd>|(07|{AڴpQ.Dىĕ.q-]@Cz 0eʔ7Sޛ6m2=霱n:琓"Yh?d̘1NO>ee=i޾}EQNtҝ"Ee'" " " " " "  C{u⅜`N3XDѫW/:F@Ǭ#VR%sNO묉eSvFlCO Im5$nSN$\ywСCwyN"<yMdpa~gE#c~8'H휼|]=6l1 QwI@3 >U~:ƒJKnE5𫯾М_')*͛7cĈ(ny,?.h?r>ز~W:Hap@.(i]Of~IߖH@H~c~sڶmkH°a2U}Lp'܇̘1[a!EjDz["I99 pnA8$:&ۚbgqz(j(kqOp-'(KR"3~󀓚ҥtiX( D@P!( vlX�bo(EAPHG)b *|$fewgvvJ29f&wegյz|b Y ^t]k\q[- efNUxց+W{P/]/nLfϖd(h ddgE]ƍ{8x`dxbi1,W_31g]óu~˷1/;B{C=Nn;W^yJθ)S !K]~evw?=Y;MRX(_`γ#bٚ7 AƛCsL D7wK&EoV5 afY9Y^]f's>CP6iӮ]vP$=G O\pg::묈A" " " " " " "5UTĉ1|pyIql(HHBŋ[p#(Bi;nL~0x[>~VZ5+{h"gwؿkڶ`Ҏ;[oI/[~GaUmV]?Ʃ8پ}Kڹzjq }J,>(kCixfg0cvƺFsg n7kNرz}aiLciS[l2[s>],]ڤI6% n?3J;kcIG @Rܣ_~DcV??[K ZFC- t#*q x inBL2{޽{L3^%u농728F;)[;1cSUڽan=+5` IŊX&H vwsx g6!v42ܓ;aI?LjӪU+_LAh¸IGpІ# z i˼ ]/zYaF^N$,KҥKQX1r)鶻񍮗s?*?�h4u;3*&_Jk ۭYJ #dHO;-q Dv>o\oN:鎵uOA.߄vn¦MK,|?5Zsyw8̝I."" &Ğf�yVab!bݪUƃL\y`?ɧoz{ae6lN8lÆ ֚Yzic|8s`N# M0`�.\heU0aA0KN8Nbf,| gYل(\IXwʤ@�OըQW˨QЩS'K!u>p+3<Ls&G,tʹI.,_b۶mCE' 7ܐzʚ>¤Ȥ VBL,[nV &Ѡ@} d۷%׼ys3x XwS33FYLJ'{i'i3m[Q<b~;K7~Ocǎ /`KLd)~u 3xSᄈ9Umٲo.`g8'Y&M >saquSbŊ8plh?xQ\Yyޱ\2oY8k߭mz?3׭['t4KMYQ @qʕ/�9 N;'EΒ5s;P~x/g5G}4?x+X𷇅g (oH8VC# $9 +KjZOhgU�'=(׷|ӦMC-rJ+5\vpNze6"G%`E yŋ[ՅsmnV+] sΘ0Gg (2үCqisହspP&eȘ1C,$e /cU?1?1U}Wr;SQvm˗W_*0p &BC %Iժ4LUVڵk;wyz9}^N8ygbr�/z9:<KjE>"" ~&@a]o7G(7k,z[ d}82^0`c6皑 D(7ɂIx;w.vލ'|7ofs!w<;P̱uIGg)e,(Z\̕c ;M*" "OfZy. 0l]mĄҹs EED@D 4P aÀzz 0#PP?0"kϚ5k0ڍC8q>3If4 fiB yɬ9sfXr+LL V]YSRJѣGL@eqLF&-Ǻ7n0ЀJ9 ޮ&X߲~�%" " " " ""0ng̕"0{ @JJJal հ N zֽ m?K0myY{.F!`UM?ܖnƈ 9昀#ĈCwnb[B_gLe.4rYW^0yomֲpK8}th;Yr-i>rp DCL˧K/Y0w8qb uQs9'`@*U14hP矷|?l2 HC9g7'do|UiL�_1n#i<Gsj/\it1ͬ Yߴˆ4ibIG'{bHyiH,=\sM/@hMk=IbdV/R?73=Y}gd=իW4ҧOM5k<+ߐp~ H�R#p 4_׬#oSxh{0?Oefw䓁nɺ/Lt]g1! yopc1;dtx_Y>y뭷/_`z믷66ʯc!a 3FL \q#J0EP> >۹+cj/b"gm,֓Urroz2+|W;qBY$_>>,LfemΜ9:gxvwv7u3:o]a0ڵK.25i4o4dGx=sg{XrH)㵜Jʋˌ'>>#}+a=LrtYۥ@ѭS_ !{k;wufŭ1*8--弶5 n~ܬbowcvc|$Nn6m 4p.?ݲ-Ӈ[ڵI7M0k)㽝s/qfW_0ɮYόwTD@D L8Ll~ dI"-Q" " " " %㨔.]jƍJuDD@qf}0Ѳe˨8`a& ]U78K\fr2q{z =Fj3 /}6nheg2&I#b]6$x(׮D@D@D@D@D@M4SuhKԾxt3d�3Q}VXɌeʔH+Wbǎ0"03/?0oj`9$}̄*Cˇc&g{LVXnXL%6l3i&XF84ZrM%K1X}Ց`O` y(#dhP~Pm7xVu#`/ FVvu#3˪&ڶ-ڟ'pim=;x-# e˖Yu\"}zO=oZD{-]h0_b~%Ѩ1u~5ȻD ǁ믏/k/#8џfn?̽`IN�^󛄙ÈC\rD_=zƘh'ֱ'_!'1$F&yuX2pl/Ef֡ 8Pdgcvsߑ1Hgu#Zi~ǤIЫW/w}1n峏>:vOO^^ е+LL$sP%1d}D+0 1ŭz]/gL/kX][f-]/G93|VN &yUk]/G88co~QD@F`(;ոpUD`ʔ)V> JAQ=Մ nbg u5<a[\gesb.RbTBwd_g|Og|g-f,N6{~zozz3$kjE@D gL:Og^JE@D@D@D@A@BY!"cyaѢE:U ߼ysL&3 kBo,~CYD@D@D@D@@@0 (6|pfl}L.9&y33YL1}z#t>ƚA&uȪNK0! k$d/Nj/nw2>wx饗,>}Xw%;͚#Fx�A<w.pi1;KCu%|Gޜdhܩ #| L2E@L9l0뾛1}4od]⭎}mbH"!FbCR_ͿIǏȑ#$=z0,[J5N1$,N_n$`41c0MNe"$ '[G륮^Ѿr#=ѵ.}m^NC'd b d>Ma$ �c^1?l%bݻkf3 ׍^1Sn}Grq3ǎ ?ҏ4`�\{)傩 s9ѣ3MvT@3 [E@DuFFY SNEJJlAFY+DƪxsS{" " " " " " " jղц W_}Fի8.C۶mh˯uP`FvPB~هm<x,'GʇŌˬ{鶝z'ӛXc8{<(nծ]3cڴiܹgE yO0o|d&mzdl<ϜOKdaET>PD2Ĉ$+"GyfYٶlܘBZ%F̀۷Gɒ%qUWK/3"޳$!r8K}M}3b?+Vu]@*U*C6}h=8 _tYtl|.0&0 RSS}L"z9k6$U^ƨ侎hk-ʺ]/gFI૯`AzL[D@D@rN`^#'@q6&|8cF,?:t` BO*9#F/ؘ3DS蟧�$c ԩS3D6s9db`bn-"mT@L sߐ9ƍ v"|r4mgy5@A% Xf3}5\Uz7iJ$'<y�^@. |wV$]t% Yr\֮Ny?0>֭[_G9G}9&0k,9_=̜D*snf4i$%Ç[Lchܸ1.t˗Oijeʕ{7_k΍.=H=cWK̥=j^EA?򦖉yڋ5Nw$ڵ wr|tzxw]ԩ=&&fCީU8k%҉'Z=;vDj5kv͛yӧG:U"! L\QERI�/QU I@!%d]/'M ]/'>}CbBETD@D@@ࡇV3P%Νk%æ`V.f<nc^<H~w0zf(2a64y)^҃e@ -[+)ɉ>*TA#RD@D@D@D $uPD@"#0o<K<SO /YE?F8>l2l0/Up!Mw$`^!0>CPXmŊ8餓pLtQdISHO`$RX1IgPc!]f f̘)SX.;w.BKȥRJI:ZVn*ݜsS!`pKcHjaȻV-;1ex~3NL{ gdڇ 0Bl(bT1h۶bŊ]%1$ �X:u*(FI^`ĂI9:ꨤf} f`|nH6$;DɿFo^zHZew 5&t]fpx20dлw$5ӸpaO>VLw}׊%ϟ7&f2l&T'SiҘ лv ^ve=3TE@#grJJeBpiD@D@D@D@@@Bn " `p/&j׮-6Q"@G_{ÇG߾}Tp+MwȮd"/`ҤIV_mA:uЬY3KxODגipf^jfϞ3gZƍjkS"Euu yΝ6$"`h&qs y7h�icOҎ/m#Q2c~;6w Sd(oYg}6Zh3<|PD@J~ŋc֬Y>}ؾ};n ζk76yڮ* M  ŨQ56)&l5?i:Nhr4iF.^\ Ԩ:U]w&Jw?a>S|ǘ<y2_GE!KIIIijSD g/nA{Dӊ3@ 0:r૯1c+[jHD@D@D@D #8FĈ@z,bǎMvϣ[n1j?._^z)+C6UD@D@D@D@D@D@D@rObzÇI.2|wm6/_M4|Xljʤ{AH`X`ϟo&oe^%cYw%@dz#w}޿ U0(h-+m]�稙y,*"1Z9s"><id/opa-AH>nV矨P8 k$PBI@͛-Ƽy$\3m Ҽys#7ʚ`^TёQ!裀q]2ࢋR*, P XHBYBUVźuRr7_NbM@˱&)a=${AD@09@~Nˬ"s̃?JquQV#}wgu% I8o++b1Y fOG>:TD@D 2fD{츻eˀa%ag%HyD]5U�'0�ÇG֭ /g*9#w^ 4C8rV,<y�:wldx�]Ho Zr%DI?GÆ -quIu 6O8x VZ%K`Xp_Vm 2V<Ls1Qm_=b=Elެ}+D `}{X_͞O?#-� *!x~J5k5V^m&7ШQ#k"r)(RHh@Rظq$rI,~7uf 2QNӦME~ wyN50>wPrYճ'a&'Wԛ~aF(rČcVzsCfܪ-i`DmEBU5۷o~+1~ 1`=� /_nLWct2F-[ZI>hw/kD@D ^ CjBD@D@D@D G$#\YD@K௻:]<;G{1r܆wHȟ >$]vYbn `kr4(YdIK'|ԬYw\aPD@#uY"+V�?rr(3FLp )JGs(v�*_ŚU@|%L4`\h՚zt_~ݦ >Kex~3NgÈ\$[ C2BAQ 0ֽ (ZvmTVM7:uDcvm/8tٲe[lA|PF K> &O@?5CjP[o]Ou7xDUK'0zh+_*čZ @z9aްARWGzU(" %p-0cBEܹ3 6}Lm6,Xcl9I .왾P:w,]lh+qw^.]ڊ1dr&&hѢ^00 Z5*ժ(d@Nx~'1tP+K|ѫW/urӦM}gMҥ ʕ+{K]D@D@D@D@D B!8&q&+Nig5'Ro޼ٲ]@ᷓN: 'xbBV�'wO\g %CqYUD sS&iq,R" 29+pa_w:x#ؚϏpƉK�^}5#OVߠ E,8߯^y8~ q^: *U."[nw5&t+'{7hJf q6qU01g0c 㯊aC(<jBLH ZE{ At3AI@X=ipƍ|#@vnվ4ڂ*$vZKIg#cdPN"(&f c$ƃ-]Csxbf5kpa+|I2xC ;_~Ə>;}@| H2՚DLn=ɮX {FϞ=q1D\g |}Y̞=mڴXщ"" " " " "_߱Wϓ�3hS\΄kW++V4]U-.*UL2B8t~7ACXn[k-k6Y(JA :' |k z`Dsʚߐtcf߫ˆa3.Bt!#o/*EGwxO?F xp~ ʕ+j{5C1*UBjj>y} 'H"6D@!eF)ʵ8EZ~ G~ NbJ^ \~d\ZfQ= FOK<�PD%~1\]xy*^vpt[7^D@M$6K B2 I?~+qR }eASˮ#i&Gyn%8ə$"D@D k?Ѭ�n VFH~L1VE@ 0b=v_n B1~믿^xt^|Ÿqg$٨;" " " " " ȓAΑcD@J`޽VWlq6闅 |\W\Rd pQGK\E`Ǯz��@�IDATq\(Ⱥ~zkJX(HQVP+a{RUEDh[Mvp7n2My1c0IҒW;~}U_^l͏Gt=˗{-[>~)ݚ>7UτR<(^xھz!~%0*k7oNcЇgpe7g9I?DR/eUNv<0_(P_}WoKCwl|TdxqW Gz#%3=A@˞I큡Cj#p�E MCAxj*+T={X{2щr`P7^z�c~o$ӌkΑf>z晜)x]@Zϟ<O੧|g,?Ϊ" " ʗ/!ClX"?%|Ȁ]Z' ]ʹ}[5kW ݺu3>Ci@`c:u%cۗ.`̙ؽh"#H̓';8k27E!sl@28p%3\(,?,G<n߾=*U)x9瀁#Ϥ cS;x`d |=`Ѳ;.@.K6lْ t͚?l )#$ IljղܹӚ n:pd9'(NN9D!d}/wW 0EȸЏ +tʱk2_ծ];+Y8BT~`47,&";m�w ms53a(6^Xrb'CFG?zEED@D (_V\E.rF1n&]p?;bx*[,&ɸ0aⳂu?sI216mc*}2;<s53=s׉I+"G>Pk`Dq�j"" " " " ^Kx5+" % 77\/^7|* de9qyyHIIms =~ҥ4i`[]t%жm[uQ O�} YE8 6pN_`>+茓cB'S4Κ۸0Ye a~k];Z+-F yͤ+N%{@K 9: JH^E~U~dE LԨUE@B="=3τl̘\rI(Zh1:8>gMNJ+0eJSNDKr{8>g]D 0E f:dg!-2"xd/4x/§UL:C$ʕ+[ TD 4B^@0p>"sV7J~sz9ZjFtjS-&Dڏ5]/ǚ&0y2[okhdPXZ4T"@;_2Lb(gq|OI[knsg<c>x*"C=}Na$NO;yݺu9~tڪ@0 `&M`Qˆ>Y"" " " ~" !H?*"2tPK(O?~i.\g\8 s#Ŋs- :)l9{lk9s%@'/E{G \)"" " " " " " " 9!@QGN�U$rUR28yvZgIO:=I(K.*U*%K  T`;wα\xQ؃˶m14BSL5_O:&U9IRSOMTC>!` ACɐ#`y>S! ݛÃd @?A~ 3q[ԯ_?Sw81(=߱۾HN> lyd\m85_~Tşx9 ^>8Y<r&-wQV-k"3_; &ps?�`瀻~w00a 5Bf6ռڍ3]/˖ţ]@hME @! . "t2d k:$nܸquRLE??e֬YVB>L͛3n̩Ys=﨤:Z1YC'ސy>y8ۂ2QP}34: HHMF a|@i}?^(M![D@D oڴP/tk85:uXKڵ<>˗cҥXlNrs WRuhԨQ' %" " " " " " "p9P堉, rVJ ۱cG2€8gۋ-j-kgL "Le}k.˿E;eG)ȅW€J :\WT 3iF ̃5p)h,(""p$l~?"!#h$Mw$.^$P 8nn⋁G�Lnȓ' ;tXN ^_6뢿"A?i߇~-s)RD~g`kTנ"gЧ>~$c\׬Y3M`Hy~r_EEA 70O"P~ б#0v,0q~豻XZ52J$S zS%c#$۹iӀ&" "-2 }(:@mNl'5כ7oN'D؎蟝YfeIZЊMItuiS1*~1=D'0xꝸCߴ[-ki0 ClРI\_a6Č@̙@nLED@D@D@D ~$?jID@NYtzi-&Fdb8h0K0j(08tRJ*V:hIN6\: O[MkN`)eV8�>[.*K�Iw-0騈�@pm s s'5k҄QAfgήo =%Nfv>)))z2g%=_SYq^;kNna3[KmJ 5}Yaqq^;knD..dٚAF^upFcD Y{208'@k'68,K~jΘ :1ucg K0ٙD 7~X4vq# L sΑi@! GC;{ }pPTZ5N^~ ƆvG$k&$Su>B遼8ps7}662[gq8~ g{pY8ߌ`?_; gpbtFfk4m8}ʯANK8z黠իW^;cD?k"^"pȑzr%ܹ{䰕BTD \n^.TDLj+rA]/Y=�ӧÈ 1٠hĂ� xIEbEk' 6ifWLh^~y?/}v4"+-?>Nl#d2lO>YdO=ܫd\3v9>׎'?Dnsggç;qd܏8=}=E5Ȫr]\9LB:G.Zbiy8#v< x!W/` ੧`8{h-" " " "K%]-" .!ϛRơ?82:ޗ/_8# 5Ι3od>ӹ)t&SPI Iڵ|]fMTX17X )SZ"5'óljN `:5@B&p;0!#3Q"s~hG0Г  ^3ȑKs൓Y3x5cHw ( Kr`�1eK[b.f�EgJ:.n%0npy0nPv{ pN6sk,sNIL a^ J'h$fqB%m/y8~ GYs{!&p&W:>w#3c 5`Fo;ma8 }k91F1aÀoSxW&~xM AƋyp;dHu=Ĉ@,n=qaʔFc+74!^]1E^6@?ޑ m\ъS=V`:;Q1ǜl^!/;N\&oO>}f0p%<WmӊQBI3D>z.bo[n(鼧Ϟ~b3M$)^e=ROBg" " ~%<8\Kn`a0~%~@H2~Ւ$�u�;@'NW=ݤYaۭ Bҙ y'PN{8Ni^*U 8Pb6\Q_pd:ckfΆdɦ)xa~ &sh%H9Yyr2~gaoeCqB&'% IqȻIQH DK gn[[־:* i0}eDp JuY:u{x,vC�²eR4`FF_GFp|\6_o802idɢopbCƦ *W]<0|8xē F'u ̮>r$v?]|?(^vֺ^@PO?&Pl r*"(&w/@VE@:YCunDj[Cм~?+-n.e:+wA2[ӆIwLANk7Y~zLJ5\Ӈυ$8x-54.D9>j[D@JKjU}{7#RSj eGBD@2%`փf̰o31t63pDcs`K]3j\b\S =t_lh&yQ"p{Prpcd@f/\´Mz!"~oD�'sr'LlFCGK ߈%]-%P(п?p}m1֪oԚk\q}ZK *V5kķa& p �6l�(Zߪh压r.CE@bL`_vbܐ]g\؝wq`g>ڿA+mĈFtdCvI4ׯ"wu]bT3HeLg&(a"޽aD-aDb}@Ԙ@\ 0g࣏qm\I>n =>0{6mK< [s%mQ,�A WwLƉ@P$+Oo$I=c"KE;{zfY^+m�cƸFY&" " "Ыn^km b,jWTV k׮ >Wkvg7tE'e@B LhSAED@D 6lV"U-=�&X"_� 4Y3YwvN1u{'�*Uz-sݲLD@D ʗ( ܺ72jTmP" " " "H" #0x0o*Â_/\t0bov0mٲOs1@.v0hp AP@W%cD(<hpu~@. :8zt8:g" " "ؾ>Ay"zyW_uS/T AZ@vp w-\0 E:TD@D (yLZU@0%EE vpP^=``<gbbfjf,M7;:D^n( %Æ|I[Ns>LvD@B�Lv-vLR4P]" " " "  u@xe{ ۗ\TD@D@D@D@D@D@D@D@D@bNbE[7;̦M%;oUn�ƏmIj@N܏׭ E@"#0f P&p晑D@�amWrK# ;ZED@D@FG~[x8|gWj!P8׬YZ\E`FgOSL&Ou2FD Il |-<$]R7D@D$^Ws$QL6Ѵ)CٿL�2x0vb\<ɔ?ĭVgW"ʕI@|ua/vlUxui/$@mAHƍ\p}{rUDdȫ]:9޽cԈffs|0cе-y0 ػwap (Ae$~z$$Pݚ&ēzr? �UD@D@DO:ʞ4k�'ѫ@ pr-�b]]˚� 7 {z'}"q&c@j-8v,`p9q6D͉g$MZUY;'?}qoZ �EFh^=c yoÆ</n;u`"&Yzy_|,_4on Vd'N>z}d$@.̙ҥ@&0m! !KDD@7ece !" " " " " " " " "+c'nm>C{Pɒ  6V@V txe%TD@"'Ay:R2מ48jTO^D@D@W'h B&oD`�EGGLDm3(>|?!!p@#ߜȫY?'"Jy)8$@LH$g7m�w}70oPJ釻foNͣuKظ5ѣ_ƌ?\c#+E@D@bCSENOM;UD@D@D@F@6@X "m[& c" " " " " " " " "R hb�NLde�O> 4l{,pK/׻#2wl!HII]apCI Q۬="- J[vkKnx)[>& p11{M!PpMO;w:[5jժYMY&M~Ȗ @ZmW\]k 8BAE@D oM:weE:\D@D $nސj/ճ%fQ믁?xȗ&4"Xo |0dH=1؉  &[N=u#E@D@D|y`Luk[*" " " " #`BTD@D@NT @֩c;:w/" " " " " " " " "9JmM?� r p @j*Ыg^@ pP@X7E@B_~'B쪏E@B(\ށ*"Mwlj4kU]" " " :Jv[p vTCQ<(꞊$9Ygi�Xߧċ'-kՎRB=s&[|[iS`"QhK6k3-5n <=L=K?g=V }-d$" "&}]`�?^DF@BqQ" "dAv�;\c 5<yLa (EO.X^)0(A̐oq$` AG3"m):tw" 9%`kݻ@/t;[UEUx�}\>j}W^"ЛnxرK{Th͚5իK.88(+c'\gd >к5P绢 8siSI%ƍ9q"ce721E_lzs#6>Ҷmi츿OVj'6O+b:PD@<I ڂc�\�lɮhH8 A&|dDN`Fr5/.)" " " " " " " " "  P�Т0h0ou+0~<pU+dI;'=2G""0&ޛ0԰$…ٓTRg\B&>% #ϷEtG>k�8ć@%jP7X g$�z&OiѾp ho#.^ 4j 0w.po#5>о=P~[^{9m.ѫ׭5q~Ưtb@nZvĂ�f.4bюd& !d]MD ܢGX2;ʕKs" " " " " " " " " IJD ;tH`j`z`T)`0;/l1') u+9hF!%%%I#<" VkdC`l lIީ?" " "�L̘z_!9%@=�O= 9e/m*"C?Gj/�,Y\xa U" "O?E]䒀 s P[NTR*0>P0qx/Gmq\,/で~.U�zk)" "d7 ,Rk1  A愖:64^bH x{Ev_}؁' L�OtZ]H{Ym(P a6a;>.v.Y<(^z"" " hhp~"30y}8 A_]ELjFJS0tc�޻@ PHeK;A_mQ" "(Ƕ>tb+2(]:ūÁs4WkS1c�o~*%KII'ɟO$W/偙3>Ko;ŁUD@D@D@D@#7ݴ03;,_74"" " " " " " " " " Q#'P=9rd￁/.u2ig�ZO A`EW`3Nhؕ&(,"E$ / hL&Dg&EjU(Ǝ,X^%I1H&FԪKL*" "L"sW7#D@D$QMs'G@i+޵XL01F][o!/\,  '7+m)" "Mq-^ݯ7"E@D@D@D $OjKD@@'�fi9ԨQd7UD@D@D@D@D@D@D@D@D@DRR-m!ȭ[޳E}8l;xI`"c*"{[R;w-(""].Ov$N?ݞ *" " "'LJrEvb4+43SSS&֬YTO| ?ۣBCXx;dR3;5ć 9ZٽhFLo.zs`z%S8۴)z~_.N*G={-M/)" "=y+qޯ<4бzoe@ H2՞�3}70h?;MtMûa!>v"y?l / ԭ - p+�CHrg}^@lӇ" 'w/p�N>9F; ArbĊ�C^z XaU;WD@D@JGI|V e Zk`<嗽^D )SWv|"7 V:u=XW.D@I ĉ�x*"m9s6D_{sgor2og P . \|۶hQ[aC%Ig \uٶ@{+2\D@D@D@bN@B1GD@D :S2%e,o5\U$*U{O`;׽{+'|3GIiu!W5Q妤,"sO>i?cu@hܵ+~CrC<� Snjұ" " "=\z[x'РЧ3e&ѐ4"/9D4mψ[| &f͚ԪCD@D 5ip啱mGI <If̀͛k}%J|$&>G[7 T=L8K.jz 8t{$~3Dgd#" " " ! !pT-" "SSNcȑdbbڮ*ȓdi&י:o`4C`\S'tiӁfjoewgZ@Hq" ذ2(_> t@H H;D]w�=z�TU#" "=d!gL##@Ѣ@߾3cV^]B37KU;S֭1l03-ZpAD@ 0~</AD@D  a 1mG{�E >L`ı+.oP㕝L�c>�X̎yk@8`n]ys~ $މZ\pв%LP3|uᦛnr2HD@D@D@D@D@D@D@D@D@JZ=|=wN9*࢒%mҥn &Ͱ))))ѪVA"e�wED " vEtȟx`|stv8D�!`Pr(42 JMMի'B<#<nFH&V|@W_sԆDDŊEt&H2�}ph0HgYݻwOӗ6e}MTˤ3|%`P`LvOxGଳj԰=J'.">N2zAIMuJD@D@D@"& !Ȉ@=?�ڴ,4n #F@֭Cx4UD@D@D@D@D@D@D@D@D@D@""P4й=ڵSOMzQ[ lY+W_~=ft ؓ+Y(PŖ4H._}e > @^(RDB!Z3#P}-#m" " "x}TK�j=gbmI֫WСCE+JM6u9F}Ԗ,Yb9tF׮]FEU#" '`~3׮E@D@Bd(B|VMNS@V�5N^zIg,`;aoRu,0W@g7Ws'E �&ᡀPE@@|�{]d|Dғn! H2Bp:LD@bMmHft8(TCM)&{I"" " " " " " " " " "5U={nش FR%fMOOZӪ(A�2=oJ g[Ĝ�(\ѾļA5 >&̻vw֡p-qo^ @S޽ 3C '9d ]MPRSSK 2A&Y0h,_Xk 6 .0" 1f{K P=Wť&,HjLUv.س";RxԣG\ƃNL^0^/9۹2`L:g<~L' LեE@D@K&~ l,'lLmGvē'J=8D^H@L5ON=6 `]|-p@g� e@ĸـ qk^D xY5 Aa*"W/l ]upp\Vc" " "Pk^x!f$&P8Hgh AY&FOwkmۀZ߭;wZ"ŊÄ k?p) A^z)?K Y" "$at֮Phܸq8h>ڵk5y+ZFcИd@%sU�FWje'ag^d̴UD@Fs�6,[^. AFj\`f>X_dŊv zŤm,d(T2>t(p}@ӦvByi`򸘥FrI`>V`\"%KG*W#"4UD >x=`L஻ڴ([f[^` nY3;qw.YISWvժϣoN<k[-w }oذ&MB%w" "2 Te樴VjH7yއ8eC}k2 ͟4iL /̘ sϵ;ҟ{1dmkjF*2QE@D P~J?Oީ/" " " "3e"" "&={_~ig Sx 8p�=zp6i-" " " " " " " " " "�e�]؁?lgq`A偫"P'W,KIIq2I}&Op3 Ayt۶Fc^z)މ@06&Lg ު"]=ԫt ݺ^[jj*֬Yw ?}> GV_s$>}`8q"Tr"" .#wi0#" >" !H v]e2^W9s{a֯ڝrwl Qzuuk;,'c]U Xax^>g[ID@Eh´i@N@v_[ HRg`f9=sڵ+J*H(jՀoغPk&PU   5WG F,y/_j%" =fS,bXu'P6@p�{3fġA5!" " . j<.0H&$%lIuQ_d໤Yn|2p=vBkn(ԓYy|5 oI~b P6 \n& !ߜndZ\zʕѪU$u]P߯H`$;CD*cLm0QJB)!Ih*)eڤHTTRт$-DQJJE!K {QY>3vr{99}>sϜY~w̝y}7:U#o?h8t/-D@D@K/%UD@D@D@D ("*"h ɓ'[֭[ǠΉ@ى'wi }sO>Z%x�>]KEuxB[PE+A>9j)_ED 9G!V~eKM`p[i 1 UD Q*V^{ *q"pO,Y$NT"@':� ,Z .~onV?VZPkD@D @ƌa.TiFz@c*"@NfC6S>:t(.2KhHiV8v !+fp(P̐ T"رc2 ̜Wɚ׮֊�60lЬ~}މ@< (tT$ȑ�3PKs7SOYPp}Ԯ];J[j*7lsKaC cǚ@%L81HR_D@D@D@D@D@D@D@D@2AYݻwF_஻D/W^ۼVU2^{M> |5rT⋞ $!?` Q(^pfc:<y@"'.h� @PrӦ䵧D ']v^yYg˖BE@r(磜}]G9M R㏼R^|x]۷8n2ܔ?v6o֭s4c"/Ug%ywҢUTqm= wy(W_VC b֬Y5,%Jp=wq4j}Wy$Z+"i7g„ PfMW` r3ދ ҆E rT@֭[3QLL[?~kܹs1.IߝO>$ڵkm⣏>W4//cZ{ &xn<H ~Q/ABrd[[P\s jy)^W_}8hO@,F)%YLH�B��@�IDAT[j^WN;4r-={v QE@2�N~gWD@D@D S H2S-"~?RҒ*,bܸq֭[uy2e {= V4g:zZ " " " " " " " ", ~g }uEɒ%-x,YTD �:�Cl�x$h݁C<1._wy3ynA+vXPE)\SLED y(c@AV(*EXE.AR]ED 7 <U%z>CD ҄ߊ"bSN>F廌R.@LAoۺSM_6V^;FةwXv<!JzX*�t)`4 ];Kt>7n w{[̙3fP#ݤI]r'({$""$"*|!`|`(Rr!TDJ*\dO1#Gěo>7s~2D>16__2-<X|)c >M4՟sǎ"l .ȳ;zam�_ZI>p ZF~ےU'f󄪅" "P>ܻ_bP" " " I# !ȤVC" "_Zyx^%>e)֭[gۀ~wYjpf[/41*zM@8p%-nq loikժou߿?6n.{0Tz-~gW� szDtJ-DŊ˓ybBo�懏ncQą<qJ�&NhXȺE | z�ﺋ~$1-;IJlF 裏g'{x*@kW]~~,J P̽͛wdU|Lkj 3Y_SYfGD \q^`LVF]wUPLW@5|yŘ;Z]}ծhg}oC巍}) " )B@B)rM bJ˪5Zt{e>$_ EaV2IUa?D>]aWGu3K/`,ZmP裏bׄ/b,JyӘ@rOcܱ6Kƹ5vXK4WڍKfl2'&fbp y;f ; '� :X˓{=f-[]vg&= FD@<|M'@Æ^_HozW0Af@z|-P<x+GuN:aY;%Uy!g=B֠E@D@D@D@D@D@D@D@Dp`7pe_Ǻu\8;@Μ9ӲtS"N%vNW g'{e!N/l }/^,,'ٷâ H`bˁڶV$/ j@Պ@>Ph$~:/O5 =ZGP6"Jo*~8*V订8DSM^ti^F\ZO C姍%J\rYYi w?�.�SRo7k2eF "@:v)�wÄK/ %6-UN:LLAݦXS� *:mu2ދl!7HFv!zvKCn2a)EL{}W#C-E[n|-|Lp9Жꫯ,G8m'aM)z2 ?QsŞ{.4j%W7._'uc)I&ߣ'|hmh<cwIz^93 ҏ^<D@2�zxm^̦ы+3$^YE⭷rg05knvZX~ ]KOkWmv袋pg[81CjO|ͼK}y;=S7oe4رò-oeRĭw/{~ȼV+Wfeڵs*.\ile_~RXޏ=VZ&KR{q6#UD@D@D@D@D@D@D@D@2�FLB1:yYcg~1c_sg>}iӢ eYvVԬY35 kժm@,,ͣfG~pー`NA�L,}߾/h۽QVf֫-ejk!{G E⏼=x"  =W!*Ѯ"G|$};l|�ډcJH O?<ԥ%`q߮檫4sV\Bw}{ywM]ۮm,D&MeJh=?j# Tـ}n݀g hGS[nXB@! k sOHn3ݦ$aEݎz|cnkFΝ]oRԯ_={ԩS]MQW^{=w7benGD p,<bN':Ƚz.]͘OY/b\r<9W(rѢE˲ťDgׅk>8?akfCnF݋ RD@MB!\^gb2HrcLGO?/GԌӲل>y_-ښ# &&w:m47Ε>G;vt&Y_,>܎Iqd_zu.Hi#ҡC\hnlo1,(^x rǠU+ؽZxs7ϭp6bŌS3fpfn޿׍퓦W; \ / i,j,Lx<ֲ>x+L) g>`:D@D Qx@jWxI~v V"`/zVڵsN*" "  _8j9NjjUXnji;իWw]_ +stS3e̸.Zwʱ3e5dH駟noΣ\Ts,{өS'gNKǻ͡ׯ;%u(c2sʪ,NΦMX]wݕM t㓳~et 93M2k͈@,mԨX6" " A k6/ct9t:ee͚5ͩQF7|ڹ, k 1S͛;֭s;d];9f 7l͎%G:M41Vn˪3f4ٖċ…ӎӢ*>q/WKj^tcI@pwތVdߎ8k+F{8?m]Lrwo0ujryZkz~qcSJs1ɿ_-q!7R2<HC`6ǩZq.(w{/&㘸c"s,kWM6Ω~/K_] rWВBM388ܓBXWk"땺S3g:NP;NM*#ݻc?wW|C;du/:^sʗ/i%n{l}$j@p?& nu֬"nGz_UfD@R@˖}8^⊬뮻: p͟?ߩ[%at7&*v&xo=c{u9裏Ƽz{]gL.t߬4#" iD.ϔFPb&r޽s=H D 6'Zeʔq̸Pܣ|fYp cbM, M;%Kt,Ɋ/(Q"Hi̪0d橧rLٸqc҂>\{M}{ϭpcŌĔ|'Q0\˘d`run21N7Dʈoa\ ri,j,Ll&Ӓ8pc9F" "lZ`쾪w" " " "_d$:Z'" ᅫ0:w,6W]C/-kk 6i9 4^ߙNhwZv}eht7J3ҲeݜMu=s2:|'t.Y볖Ѹ*8~x>YôD,{?jʹ˳s2d-ӌB%$ (m#" ! %ڠެ^Šgy]&?石<ykCRC7ڨhS_<ei4[}ݎ3 Vhpvz͋@< P\>Mٱ)Or8=z8j8-f+Ծ&Kz9餓.˾z4/#^ 7`g^v{$L)}$N2(C/0=9! E-/q!7 4Gpz4/!`^fty"Dϴ#Y^d \b0AS|'JW|sC5O_+ŨTR%Ӷ;.QK46F OX|cw=eW2Ϣx볺F7 #nG{_UfD@R�5a"_8x_Z5kԨQ#kp/`D .R69^4g-&3qRL ĞvU@Ljۖ}LM/cucG/GqgvaNjUh4E>ʜ9s[ͬ{n\-�gƔ2V6իW["RNǎ*\1HB #=g0>ߵSa➀櫄[ўXX|1#1eqyi37ah￝+ݏgϞ:ys |W_ż[ 10^suܹYǀ{/@D@NNj%q^UD@D@D@D ]n*" " I cЩ0w.'ant̘1q)7&h| GΝv4eּ?cY^a~+Y~>fVcqT\&.g˖-zano/sNwʕexӧOų9s衇$aJz<6FҥKcΜ922"GD@D@D@D@D@D@D@D |Plܸ&58K"ڮW0OoԠAXd ͛KC96h2st9fnƲvZY}QD0ٓ{h>Coz `=u<8D]7>= ol4m۶ɾz4/ u_^ 2d|}_H�V~{"#P75MuH Dof'`?'Xi^E ޽{z+|]֩S B۶m k/󨣎裏ԩSapremf&6 BS@.U@@2@EK6KB-[!z5v<;8ζGZ޽Frw;Vp]W^xWp饗җCoưapNh˲*Ռ@Ju\{wW_ +ۚ>Њ+9pއg~lÿ5mԍ@cd#dJf;�'ž7}Ĉ/7v}z!s=I&}ˉd[\#B>s_{ȘFva*,3\?Æ f{5kfŪF{N^3Ι+V`ڴis+w EJ@6'~jb?b/+9Ɯ2bFc>}p6k9g05[pЍεsj_|^[g?(;:Ӡr(& Kf(ўV`*" ""Lr3gzPB)rMT"" "  |c f;γXw9o&y;_,^s(3xDE_D9 _ӨΉB,h=0t ܧYE)/+*I#,E yXY[XpUh@ؾ'ݑ~FHHv崃l'O6/f7HXle~_GO~Go۰,~`L:͋@ 6*9Ǜؖ㣏I<gVE2.p^}۾&o~ːڸe>E ~ c5%~+O=. Aف pLsV(_&d`HF�R@}#P*7a/aA;zUWkm,˫ӗvlÿNpiy`A^v@fEӏTlɥPTK�&A2wf ~&ژHyٶ,X#Gk%" EmSL3s^z%WT"n,RZ'"\n(fS:fQh@ ]ק}F^z^D@ҁ�0!6ae"g2c,Y/Ga>PF~eҥg^9LnRM֯߇WV\gK|c9#*O>s>e /o{t^ bHܺ'i|s+/f^ìӿ'$+kFŌih]ߩS'W~]y pd YMxث4<ڼ.\ FwuN.7; m)" EGa{潃3mc7AVH-@ x aG5D p0D/w7<ܕJ':9<#!BJ~k43N;rDO8Cj={qǹ(RɬY?;0Wܑ3tBSN9sE=,8Rˬt'sfRb|N9w'0RW|a)Ν�J_|EV9xOh<MfEV^LrvߨeFvrH;qF%ݛ RW|=߾駟ZE,o3m7Ν}]i"+`YٷO{χ/>-~` x}#PBA?H? QKO| o>ñhiD F'8|^6n`„ݻ 7r<o߾7,ĚdQi8xQ`jm[/DZ4J*,Y"!ȀgW^y`#{}dOgOA;ӶM/lS"Į} }Wcܸq>z =Ng$hˢ٠vq֭[bŊeE ϶.^_FzD@D 4_T0Vޞ ! v 3wd(KNQGwaȟFCǡhw2gg  2�m{| _O>) W{N_4!VKA&] -on<ڣ nhv٪<3)cB+3I8 I1^^)DJ3�7hL^2EӦMx)bR6]ED@R�\  X~'LRiG`f5'" " Td)'3{G*ou_t$b9SOߑ)kv7gVeY,oc (�I-) Ic,&Ppy[W_}C X;@rʕlU4zYp%\e˖e-ӌ@j^7n Hi:6O>$k=ghC҅e v@)&1aů'6KiڵQRZyEC F+@X +xXv|. XjDY̹zT|v^MDvn,(~ۑ։@|dLPtN%2?KB9im|, KT$�,xW%=+$JGI晡2{se. 쳏%/RVz m=N(,�sLSi^ %(X*%@Q]C_y%py[0H2Զͤ͛7wG_%ԶMAE}2ʟxE}`blժU~FJ$h"իu" &`zHN-{Pa%//g2ڈ{U$�T2�ߧ395M55kxީSA;p⫯r#7lEy~kgq `3#Fdmg0VZ뗗ݝ>|aX&1 YHs39 c i6mZn8|e"2"Ճ;o?b>\Bј2&x9Ez ;Jx&Lu�O<Ho4Aoe<8\.] _&M@V୷A|'矩:[D@D@D XJvIED@D#曎뮎C9cgРAY;]veNٲe3L$2'9Lye\pA~ftyq`Vdɒ3<yg RwA1#fϪ'tfӦMeq8nj? ԝ=z/v[d +Vp[Fw~g?>wlD|zX 0d|ԨXv" " EMGQ]Ȅϣ>1G23EڭL9{t̷Oǭv)S8`s&stb rTonw̱yS@/y]ǹFǩQn鎝ώsÎgهswvgڷz뭬Ao8{ȾJC"7{q=pS^ w]uV%92>PpCr8j+|~g P}|F=qd~|�*/ޝ",9k#<] V، H|?umD OI6<ڮ9dOwd7b 嗎ӨgWiq.a7uinѢ{!Cw;hGym_{ホ%VZԪU~pEݎ2(Z3gzt˼%UKVV.ܮnݺY;>]vWf- ^ocƌn}xaW # ]2砏Ơ~̼=WRr3i%2gsN 6~֮8^0`{nc&|Ƽu3:ʕs|zW_yƲaV0N}7A0[wEs gǎ܊?G3^LMiܸӶm[DŽ5A0sQG9=B.ٺqx{?yɎjG00%Xw}li m&ĚmF" "*fv|)Uz~,l+~EBcD@Rٱ[2鸁 ,;v@΂ *ڼyc\#XEwN/^jwh gKsh`ɓ';-Сk|*U8j3twE$e4Ei"S0[ou Kv?pcͱLN=Yl\~&0`YvCּD%`"JI@pB -r邏Nʲ_Yp 7vXp,k[wm\ЙBMӲN 󓠄ob=\aÆ q>,Hߴ�MC:%8f_j8:^ ܵ3}.>4wײo,H%B&cfl>_:gd}nK#Y[g#Msc'7R#O5"{]< 흴жI1,+}*@2Ԍ7\Mʀ|sHmh>5 P S'O`C2{ݵkW׾6Vd x)D nUVu͚5wW_u|M79q6?pc^|ͺ2l0k?ӦMbf[4O"n}Y@~{͞P׆pD&LpSdwd*UV}^o10bI ק AQ} |9ύm/Ǒ1Y џoHy{|()Q{@1* ;w+k4mN?%"[DzNc)."LiTu~1w|1cy/f<R<Ǐcl\d{⤑Ģ1e0e=|^_j{1ݕ+W619s)H {5I2TD@D@D@D X.:ŧo3jT|S-" "N; 8l׀]wm$f4C:u`Œ0G̛7<WfĆ9Y /3#0GЬ̱7{ 0%X6Ioq VrKy@;Uva7 �7-{mag-%K}/זf Rrmgg׾fF\;9fۮlrJX6휫]҆& lgzS:kbEw p6?,Ⱦ6 &~;7{g0T^3x}i8T*d6cDŔdnT /�:d'Ӿf'IoMs3{3_̜Ν7< <cx'w ҚdXxa\<T۶iy޽=� M_i<Hasi{=([Ծbێ"  #b:<ohkҤ L(k>E@D@Kફ`1}E|kVmA#0u*а!0cPn޽{8`yߔ.]ƛˋ֭@*^ A|a,cjCcWc䶖'3N6*> U,Zm ]>.'=vt4_h2X[,`ӟl0yf] s.Q#1\io+UKzTD@R@ǎK/:`u" !Ȍ:@2`z꩞oxX[,u�}/m)" " " " " "EED@D r %@(ƬY!\Z<Qȳ49{n}9V)BR�{tT ҥ^#UO ^ OLI<Tm!Ϗ3gz+,a�pu`=kO�7tD"o liKK2׽E5;hժ+63T:/ưy'HwXNHcر1իnXED@R<Kv[ E7o\du_D \y%w)=u>*vğz V#mܦMPo*#32pf*#@Q>} G~zrPG) qе+к5PxE@D 5}|"UW*" " "`Ɂ,K"p\v-^{507x#^]JzfRH_jS<=pY` nΰ oټ=nC'5#}#7ndYN]^?A|D]G^OV MYpzLק5t&{N9``#Fx<n-}}#GHG:RՓpq �΂\PL4j(Uq9|cB%�Ә)^{2kժU8,Ybnje<d0=]w&oz1{ltիWf=\nUTAڵs@oO br&Ju +mNk+d*&@Q"sժU7n%0(-Gmڴ {=ժ9hvY-[,6ln3yEUeq}:N-+�c!(t.x%i.G@tPp1^D_TuFUԮ�߇0騙wrCO j( {Us΁9y%W-@9ҝwfl}b1XRD@D@D@D@D@D@D@2@r- V4%pwcʔ)y&C<e]`_d ,o'N6 {+t~W? A柙(8R?݆=E x^ډ'}_@ !2toDulk|'m(wm :tOh3gaH=+3멄JB!P0;y2p-9@؆ j|ny_o` {�E LO ݺږ-[܅Mү_?tMUQD@EzϚ/d)AA-ZD-VK;E:F{ア^{.5{ZO1Fq}ˮ;mڴhm}V["{5kMq:Pn,G%>ބ]߳umڙ3mE~E')" %p5@@v@рi4@ b+M,>ŏ͌$>?\o3`Ya7DD@D@D@D@D@2�&Nŗv*" " ' ;/J{$Ѳ%͝;םX.yH{XիVZ8ظ6 yR%3΂9&꫁Ï Xl*" a ^ 4l00O.Q) Ur倩SO/`%-_2> ֬8ϏT;۷zy0wHLQ@@L8�%'x&oիHp8w!y�BR"*A^q;$w}m @f1$QU/" iJ*UNAjX" ".Ę1i0 !O7*xI7M0_~:bpOasl%@1cݧfގ?%KJ2'`ذK>|ha]4߷sЪչv%(^@X 4oQG%-," " " % ~" "�t/sI":5D@D@D@D@D@D@D@D@D@D@2>zk5f9/,X� >l\Cų6ƤIeQTEԭ{*V|:u?7q$8QX5E [ nJtVw/lM_(]ذ!vBR�6 ԨAQT(" "  c gM/g_o"LL¤z:�Lb*ZK,7Kvm#صdj'릡=~4+{”>Q;?z4~=еkMN+VSq)7bȐ8 M02˪. U?Eժe1rdK_ z|v:.@૯FO*ĵ?SMM ʖm .xf͹@ п`0e`@tKl$ @ x#,;7թ#Lzر#>+|rL0ݺ]Vo۫`J&& gE~ /v)Or T5! 5m ]9@VL|a i&|6W+,P*ChiISoyI;7(""" " Da#q%Cͩs5i>n4iYn#,xVj>w u`Z26 =h(MB8}qC׀E@D OAB)uY>kFﰻ0f'XRI&\x<̙L5ƍbyV$ڕ(]p| W3W;%?/3~sO&_iBcܱy%MfIX@(WγI[N{dYg԰A@By@"@^3�ÇQcKۉ@8͑l~\9~gL䓏& 90'ؓ%-8N8٧/4?X8 رc /^) 5kk1 vJi:$ԥ'39 APUE҉{O=O �5j�/�8N:RcHww ,FT :3�>X8d.=N|(dɒ7A-lW ?+p'.BCܹ&U+" "7ScUF`J/%c)ԝcKD`:Ş!!R%.N=h̟%jǘ1\C-9]3TQGU4[UwLr z7Yp@&'?*T[YD@D`(;bw&Q♜`^" " " "( !C .h۶h7(QOƕW^bƌظOY_ o@b,0)n<*W>k:uMKvm@2q6[򷣶 \$UCԥ'><UKdK{ׯ֊@h95�ySu<@f8X�0#�| f��@�IDATTD( Ԭ |9P<P'ZQ)궫TUVar(|8hM&v� KUh][8D@D@N"^%@a!&jѢ5h?& 2 ogкu;K|w:;;q,X|zb8&tCJ ,Yws<[`s֚ٚ[Wydy&�|s)]�5|6 {i3dBrt%0v,pU=xΘ:NKD@D@D@D@D@D@D@D@D@D@ ]kDiCnp=M,-z78�8/[Gܱc+82)47s[V-$vL,_՞{+}`k/G/yM7~w" " "@l05r�&8|/9ĀEݣkNcȢEiz¢Ä%`v\}`p�ŜL%U PǰaWkExUq<1c0aq1u_ģjձ@a̻-aR4n}6фūY2 W+q#fͪ`ܸXn"-[c2G[Bژ4i]3N4а07. *.6 84`j$ YӁ/il@ٲeѬٙxٛbښ3)�Gg 0Io_X&{X# 7XbWd0:up8ZFH7o*֥'AUm6ƺu%Z�s<,+QGÆLkP" " )KI-wl604"|)C?읛W_ ІisH`Gv- `aUH�~QT*E@D@NBLp~~KZE!Hh3%cLUPn}<\d8∽Zb&J8K,1QY2ì4+~Zu/x8qٹ> `ZD@D@r_5 `l&3h$ EZ툀y>80-A@(U .~i`"Xtg<~ʕ0 ҥ^[ݠ@^+'1ġRU-" AB @J2pUe еw?ؼ9й'0sf NKgOODCہ6-oɮ#</NFsiʕ5�5k?L��;.m@|w}uMC= RS�K8s=ᦛǎG-)l K6Me|}eQ:`ÆЭx,Q,D>Iv c1y?TFl+/ ԫ)n%x@T Ч][ED@D@D@ HI �$F�hdS.]<{9�8p࣏`b !TL_LTdPs$TD Ԇ@ٲs10{oSNN P ['�(Я"A!в%0k@:gGU3,b6m(@FqqVH,M$." "?d/&py01B󞝷m*p{؂{&YwKhy'*VjI2:}F}*Qx&ش#<(Q2GLƻfM1m=ҥ…C[}4p@AF"ĉ@6�LΫ" " " iC@Bis(5x`sDdӦ^cy+7!- PLfN_9ϳΊ^m)" yeV-gO/[u)@r[{8(tIwz6oΫ&-$dhl@V ʨ|!H@2?$x j#=<= Z5ছ$ȃ}#E-$p *"$Kԯ4n <hzؾTŋ'$>R�=%e*J%ŏ/" f>M" "  AǙ@I{[ol3Lm*'@Ē%-K[Ӓ]]qߘjnX1 ӧ/xAC / q R {7g޻N&BVzuࠃ$ E@2�ż_zɳtؑc(E@D@D@A@؃q �;<uj=_R[93`͍v7N]dfM'qP'9zt1p p?5 >gi<=P]"LV@:Jb H2|U{nƠd-[ �#F�+=lܘT4x}#U� 콷'3b""No PITZ- $;v,P&v~|KED@D 9k>䴧VD@D@CPoˢǾ#<r }$ǩxq(ƙ^ |=Y,\T_(SO];O&0NTWC|"춛kfݻ6R=aH&C>|wo㏁NDoT/^{ 4h Έ$ AYmK=Gyl9(l̎"" " " " " " " " "Px^ 9-RaV#mu" "Pp۶'/ <'I!:u偎!C.xSD`4/H=rԻ v5OhAK@#K6 A& *=�a cy?�TrO>ʔ~8}U3@ϞG3gz U΍aǎ냾jժlٲw5sOE c<� $&<6Ւ@|0A>ħ.Rt<_[haPaȩS=qۅZuKβ$Ϩ_.mO&!g`o[1 [VV*wN>6`/9g0`*;8(U 8D_~pjo\�L7 !@ Xx� K {=|TD@D@D@D@D@D@D@D@D@Dm)ĬtUDضm[mqzGV)L_T3Z`h`5+)Bn&�1YZ)4iHD422VGE v�R{#� dѧmoD h^T$jPb pi@s �+}xB�}yj..^8]-T֬L^?� ~�gF<2BD@D eUD@D@Rdz7mۖ:.eR@{l7K�7`vU;P6kd ݁7 *9I@oxDžɎ O.8P'skر8KR+" FNGxX6>WD@D@D xv ^#H>~?<81Sbv^ƓJ-@8�Ꮞ%[" "Px[nv+)VXvs\x?gٲTӗ [V@QxYssϢQfi 3hU=QD Xʔ/gOc~8cƍzlow"j. }TI(vA]w70h|ժ,nR[ahѢTr@Ӧ@z87իÄ51cO>nP;ą�EM <`\S%" " I$_^cL"5g;WuCzQ<0 \x"@s^{ͳn`2z^$D/c�mϷ~p-C<77X,ѽS" "|9_>~CT%` *Dg4 Cď�09AuD@D '=ŋ\;7msPsЯԩ 4lPpY3_?/8ZԊ" @kDy[BmSe6٬Y 4zD"~ d�iOȾ ͉�}h;lL|puioH$&xO LH?7UZj An% ;7CB?�}�G?z [EЭ4/" "l|Dі&MOOvjOD@D$YXٟB ;ݺywc꫁~�1e pQ@ǎ^bZUh5| Z5vڵ=NXXA*|\سQhxUsa@�oA֮MFOՆ�o]?MED@D@D@A@a:E@R� n m.�6Z#" " " " " " " " "� 3ga)D*s@l۶٭Xbmx''{j � `_~)pSQ ExE஻ Uv. A2AEE@B"vR�!r2GJR}|b ȾX]2�m PLƛN=3Kr^z˶m(6rgKd)L`1#Ӱ\q�;yٰe40@�W]PDED@Dh P0端E." "P,`N"*EGn@|eC OƎ z-ﵗ>*|'9D䠃5<T.]>*27{I,!Me}c"&$9-v?~HE_Џ'" u2x!*" " " "OzOKD % 0C ">1 _{-ҖZ'" " " " " " " " "+%y 6=oضm[q�łv&:~:ip�D}Ygz~U�Z xPB%KHJSjD\ez`n(@&;ё_?t?kmf}#3F-"@ڶK2Tă�m[#F�Mz͛ *Ph}�wWGU3M2%y &^y%{p>_ΛP $[jFD@D -ZIb,*" " G@Bwɥh)�/Ā%{9ߍ2 ɓw>Lt5�]�|/xp71ƍzeT]mH|w^$�}{Sh˿|7ц4k0lv՞{G?JÁ*V;i|hO?]@1&9ٖi&Nܟ}Q3'' s_^th-xZ"G?i(!t$bZ'" " "8VCm۷֎i+``֘w|M7( 3'!}`TG`U4Xf`}@T4ղ7襟BGB2:E"yz≞($!LC:`7oW9[ǫnS0] *LZW d}%] (Jv~~doy`p[o3gPCݷ+ɾG_c``A%~*&|=)p6md gn8`�pQyo" " EG2S E," "Pp'z"+>g2W >' ,\<40tgH$#JPܗ_z(.8{6l>X=jռCߊj'z5d{GX(G{wJ0$!<濧cJ#R&3[}'9ONq,h/30~cg4SҟN?&w߼'ߛJXR�}G"]R@P iIED@2�,Xi|?1ySR(f<G:.צD =+"H۷oq/$E: 6nMl ~(޻:v@Q3jL$՝(ر#pMU� C&Ah, BE ?zOW\zy�TD@ " &@E^[*"tzO(Wa m۶y^`w^mY5SaK,f(p~)1^"i =нD ]^)dD!!'秵kqyKqK!޽=1H3 v( hկM~y G8}0rޛ݋|OO,_(WΛ(,H6 Uټcqb.l'nJɉqН:^8/ŽB#!p[7w-57-]ӧ7loǏW_?{E?ǝip,z(Pq}L<Xp9ϡPD~'{zNr~=2?9ocEZN5+=K,�'<?}9m? CYz '?!ߝspɞ$EUD@D@D@D0vq}۷T" "\cd>LCD@z&" " " " " "�_Ng?`>sZcO'L�>;}VD@RϳyqGOr$O t ?с9o36Rn 4sM{?)&F'7Hg|nw/!$֫dj7?{g7U E1NV0P1{;Yl={ޙ3`r{$籅^ߦ|)p G`ՒF?^x^#PJ05i̞ 19=ZϤ~Xn=Ts`rW9kjn#8FEN{y#+HBnXg;,Ȇ?Ok Q2ϼwA6Յ�T/2ng5' Zә3 4ؾTR(9vȮXN>w O܈!3FN'y}uɅ&CHjxFG#17DK:RlBf!e? }u2rNOY徧˵zCG}}mK7ml) _lۆ={z}>ωm[%!d{F)#S7'>v'/!7C!g5[Y&~M^FswHl!B)עmE!}tSѣkn2*GpGH"SA#4&sTB&ݻ{7&.jGpGpGpGpGlȵ&KE cD#V-W mଂ""(~ĈdX.]D^;ׯ~]$䩧&^"!20Dw)r"X=!rvǎE3r"`ۄ yOG &Yx1$B";촓;,@Buu;1@U p"}&FFUT+dD1|QD<R]3EB -.P7UdI;׏;#O?B3lPyj8#C�R <8 z'ڧά&)[xaO:wdT#O}$[#Ǧ"=#iDEDI5v0LBA%-mn*Ѥm[jēK'#,%QA,[|= Čց!TYXt,"/.p�%|K?iTD1uIi;$vX3x9>3<?uJ$st?3QF9Nʋ�sLF %ǔ/L!GBh‚ &#eZdxgy(}4Xw/O^#8#NY[817NG@Ygz퍙8#8#8#8#8EA_$! Y&0pR#?@kHPe*ꕌT}٤I1VXa*1$Jx~Xx""qs=7$kV{~ux(Xۃ#^wǎA D=69Fy!XqKܪoTz9�άYG䨣Dv5o"�'ȭ0D<ȾOYuU% }, !# 6 <)t]Qt|p!pAI TxɎ#  0P3Or|f�u{8U:pBR^#kB/nnNBC=fĂSBQt_}55"wc|THb%qzL5IW-S͌lsLGTB65&i6(g.}}D#~43`1W[y GJ}ARS"y $o !i8\Jc-A�?x=EƍK:B4ϯqGp2"C9#dGVOPW*gG%Dٶ}  9J5ٶ9f8JQꡧZ=--7A ':^,SJ,pGpGpGpGpb#u%̑޽ȃ.&?r:͵UMeqFzpG�wUT-(v2b(?aBҰRnH*CշڜҙO&}G$,*D6siջ7~-mMeeq֞Xu(ΔΠF6y#<['8GN*s#_ϣL,2Lstr!#P:H9'Ijt}"\6c4V"n+J+s.-.gXtg{w N)Ebl8-άw p*I'%8<ȆV^#F:o<TRv jҤ!40& RQ CZoۺ}IwL9* 2}fR<Fᄏ4[Jl4*ʐ[m _KXCdDQY9 rB )V!ҭ[RGp#0bȝw<P|g`pG ѝ2:�WFٶS2;&N{&c|dhsB I'Ϧ#ʇ2"g\M7xȾnRFIb|hs|s绢1E"l/JXEd.![bϞۖ"{"#G|YR<5U?. $] }ml%N=c6z@՝Ⱦh˵.s"{Ȏ�\rwZkDZ^!Wn)D.K/RCNbPz3v#HMl4[i/#8#P.'lE2C42M9=rMmdMlg9Dj۩ZrFYј?ѹ&Eʔl;?# F-"x8#8#8#=S}Ճ#8@q \݈?^T6 ď?s0_1nרZ]\1%=jHΣfiΝeJg8@#!\!ZBx@yc@OCҳ=/gYm FE[oM*6=Z=PxT{A:Im|,2E9[S50֘leWևE#$Q)f2ٍxsqǵQg"_.4[=k2-]& 9fc4|@W$gZ՟Z{_$q7NP A /R uKEƘmFU<b8Ј!s12shۤ=s;!D*~LGe6$i7fLj'{u!?"GOQVmmۇV2|dWRzҦ-A~4zX#βɔ2[w;PkHAӪ?:UǢ?7il2a,:)|p# Ro 8#d0R4 ll"%'@DLo4/śCbP_6n yb9H6tȌIMV�sEE@Eɰa"9⸕["p+f#{ӒuUup뗷, }t/L} }%X:~8묳g}g}'vv'D歷QUB2=9b17 "mE[3mi{6}_+CuR8ЋC/оCvx|a4uY<`4RHdC֥8{9r I^tQRќQYgQy|2||2*GpG8dN(1MoۤmKcq E& m)1Q>۶C`m;߄\M@k{F;Cg>}&\y!M6RL"ψ6-5 G2mW�%f�nim[0AGpGpG7tDvS=#PVS;t|oSuA&%_dM2ɨ7"B.e)W_=_AyِF`Q5BJ#D Y 2 IXDݗ.IT-n=b9qBn#Xtp6d}7zt5Yj$);E߱Mʠ\{"]ͻ+eJhrR9QPu" (A"5PLYӲ{ovzʚuIqo :QRg;ǷQܦ$d@w\;l)"AC)P2P\> ҿA8<R)|ݪ2>$mw$1曋~kmV{u];63 }#) *!p lFh)L1h Ɓ"2#cgۤhnYq I .`y Xhc ʙTOG0W8`X(5|L, -EVameփ\Q!S55]]a))ب;mDFƓa}ptoRdBQɏlb1m4Q=m5ySz:eoUO}.m{Z׷uL9u<A;2a܃ Cx8Ń#8@@Rrqk"Ѓ#8@ G1El*d_|EpC_]0L'sʙ1abzm)Qc>&}sGx4�s9Yjz�eN�sl4"qr4|1)P|T/wߝS)Q9ȆlYrmVTXz䘎M#"Ǯjvpe s)*N{Gveꋔo}LKgoSN4P/!щC/yxh�^ȾxijA.lG.5;s!j '+_W/Z73= K\Ͼ3Ef3yCL}Qwl}R@&.GDa),C֪!m";2]CJU€">M6oRfUBǧ3]UW6ƨ-3>fO0[_>G#8@!D t`0`ԔSFl[DК>iҘ43grlJ<ڶS<<'&J٢1l<>ؗ9bM SbX_ϡpGpGXp:TdРzip!�) / z ~I(@;wgQ5dme4m?>d]U3RHb^dVp%j^'Goʷ/?-rՕ<#)Ie=]~fAz喤W'<'w/imTQ::J(f!)iz,e-|zY YP<|e4DAFD i&t`; Ϲ)Z|`DIe?>(7 {|ȰaI_H T01@'jE6c3`Vƾ{!Is q28 "XveþZjs#PFd̘al n`aEtN3tMe]3M`z7|a .A„Le"8 ddvgt3&L.[d U#8SPEE9f~rGmtY6tPm%gCe7n\O$W[`Ni8sCJd~Nȳ`>os|�[H!$B|gy;�袋 C�#EuD^[dME_^T6?mȕ~G_$Zsd1gG'/\R! G1hCɻ,ٶ~ȶhO}1U]fQݩ.Y&^ĐCd,̟XEgEk YC5Z?$Eg~yD#r[= ߄߃`hzrM/Blkk!+Đ| ?F<LEt()'){4B4(>:fz0CJK-7SGp'lXDa A)*1˦da rB()-DmDQJ"Q4"2,#6MORc ,} /s)o!Pbb GpGpGpJ�NYJ=oGUpDK/_|1( eYFt.HI!G<{Q SH#~y`jJһwoYy[OȌ,FOý艢,6MKQ3EGWiN|(ʱfg5(IxPCac<fCDĐ9!b㦀!,!vQix<d_`<| i0S"/\k>jn_]nSy$)ü>QBVK~#%m6E躼Z(cM/I1N쐱 Ѷрr6xC sZ `,ϯsIPRW+<Zj|1&罏L;S4g~ڜ7]t]OG>ӟ&m e=8�2'tMضM?ĉ2^xƐ;FSdZM=vzE`DEױEqJo#8�Dp3]w[g!G˜{AVlctQ0c~ | @O+t A8s1tLΎ|mP✏5N:t t"wN?ȉ2EtC̑Y?~ Ap%rdw�A}{W/t8!_}U| aL.1]>@SNsDn ?[wREu鐅u7"hE=yp(Dƛ"<LE@_gw4B~ ީ~ٽ{2݌ιRQhO[[/i! Gp'bX>BLWX`SLʔR4ܑk=8@S.)ZV4ꙋzH%\"(}#8#8#2?N~#?/></nAt+W^HveBI=zqX5\S[oYOof8uuVh78~cS#r㍢=~ oU="J(k"*B(YVQ g-Cu"�"(!H]{s tU"˪&#|Х5PdpQ\>$b>^L)>nv[g<ȝw< Jl"BnC RgyFFƞ70vأG0u?6poqܫAZ0OCꪫ#Pnv%i@|ҦMKʅ�F8l0 D3'xT'"(^Fu4m{ ڃ#P!C4�vfMu!02FLә;YIn8EA'EXCE6ܰ(Yz&#8UUT\* jYG~B457�sr\t :G-Bb�$Ds,D|p,LC< [g$vkQ?;E% :B~HD ys/R#DO^DsI5zOQ$)"dj笯H';RH(\vYrAeD$!~DFn޾A.:`.ds #z]Y_DtVG!rMSīJoS/t蓪Zc$)S/lALLs��@�IDAT\9cƆjO;>0Ӫ^1Gpp"K G^eL)4="8< L\ 0$"p2Ť6AO =O!ߨDĕFVx2..72GpGpjD@ENY78eA�%Abذa#;!@gjA@Z<ӁEw.TkL"j6Hwߤ* ObuOSe5(T>DqXO(.O4)e\[n!gƴ sZVXa㾧4r\{cKq-G-߽?FI:WKQm 6H@`7u~'#F3pWso=d pg @ iReɔr[sDܳJ"bG2Z)zԜC@gHHpՙns;ۮ]K�r &Lc_`!ПI8*mZ:@!�Oڃ�"H#8')痮NCb8]t &i )1zMף�EH$ MĖô bG}ʆwСbq 鋯J_AhHEȒ<.<}!�9A#:;%rjRH!^t,?`s[nX)k@eC#F EC:dT7%$|?2b_<^7:g%"tW&=Vd!nO||w8#�NA,Z4 ~!U>]Q$GdL  S#P0 !-5-Y۶yHJDkYg.1F9#8#8riA=#PLQOnvy衇(d mzAٯ(S 1ƒxdyɠAo (SUG(g<PץSoΪ !u"d<(*#^'dhtg7eb7nZcBH\_}MVZ)DH۷oTBt:J)ڏ6$Yf)+U_?U+a`]%I!uTÄ9 /iy5g 2={ZKXc@�9VqL>|xp#>+m" "r睢"<V3G7" }4GtM:":3[9V]^#PvQTFĖfkSa颋.R!=.{@ਣD?_T.jmV:#(\r,Wq`/s=Q 0,L իW ?t;!D/�B"s.sUW]5Hj ム~#r1"=ddQfIrB:|b@�s<ѣG'qV | J'#8!<K�}a!FdKC"Ex0<4BJ_~Ӭ~HDwIZdo'iPQ>>Z\Gp�'l\&GZrکY&r6#^_TwuZ R/2FPN*DB"h3,#8#8#Pj%gT8@]#W_ Q.,RM6D:u۫q(zq*nP<x㎁ upmʊߐ: ׶ۊ~Df<3]{[^c)S>TEWj<8A�'^"ӫ4ϫz ʯɻUpUQgE!u<U*+=뒨|D͚@@9l'EO~_E]7ՖDiSNkSs$<v[Cc! +6TKu.ȏa@ց3 "ng[ltCr/P^uݒƨT '~OYǎR1$̣"Sm1vJE/P0'Om .]g8K/,RXaF8D@#tFsE޻GpJ*VUFݳ#FSO=%/"#b=Tխ|!\s%}SVYHUT̕c+NxsW*dp_#q;YvYEJ.K"O<oX?$o <~Nk)V7ZPT%l~gkCV\qT_4i_^k8`X =9"4#ΝEy*MC-cPx%>>eƻbGp 'Y E~H\Hb IFBpJ!0yȐwW4e. (V"Xb`J\#8#8@m q#2P[nE.weJ>[WٖAZ 䦛n~)q2$x;/J#6mvUj?Vkf=2|p9r@T B>O'5xڮ|sυ3HZj\le+*]&=ڻ|@D9D^xAT^G1J�˕GMFKQ.ƊE""'FMxW>kʔ) P 6l1>ntj(X &wu<cp{N;)ٵ]{p!p"W]$n߾l6tAN#[uei [〺k׮8}htÆ~t5�Rx4B )6:L֭[Cc:DG( ۵k'"ɀ կwG&OIRJ ;C=$?\(0p@s@~O?MABAQHE_oc<o/@?u"2Q$_}5V./йggYnu@3܋+xлwkk3tsp bmݚ~P9] ЪXS9;{̡.IB�&>�BVtp4BP񫒪6mi۶Idd"["F+;JJfWE}|O 8#PQWO(/@3y<1AY<ZFdT8@1@I˼F=ZE?N:<I+μ[x^#8#8#P$ZС")Cp*@_K.D=\0al喲{*W_zwEʤ*rGp6mw?P=*bMP`B{}Go@(CzGL4)( (bFEW[VGZVqrQ5ڑH!|RD?%:KF!oư6".A<6I쾻ȩ& 3^g'\p\<cM6.|1x5p^{AJ C8E@yYEUwE>e5b!$07q5BlHp΄EmsF|Z�Dc_a7dNXfe)d^L}@z2}@8tw$IŠ_8#PItXHN;MP25h*{Ai&ZZky-:-Xe*5X^|ǥZ!فVY`;#8]Oe 6 "=8EF�sp^ljg1Hp \M(eS0QEo}}.?|pgr+)Kv�G#šuLĭjJnEO37ߏ2q2v*{zM8O Ff;#TNYl0xE ŤG6m/J2>{9#P-`pϾCBA"^ziA O"Q-8#8#B sGarJPkd}u5p#G%}ʺ+}@ͽ@#кVj]7Ei|ȑr-N/'(z1t4T?#WtoPvm:^$iQ>oeDI1h8,]v)#5P?5p-B�"ѣED\԰PQԨK)'_4- D.Pd뭛o̘1A~!yg5VA;Hǎs]j/@ٶmd{^ԫ^xgVuZ~C^zI^} kdj1^ :.[;rʇ�> c`x@۳gϰ&ΗxI@-"& cE;[uvGȇ5|g8\<^q̇fxyN@ y衇CSF"cq{-v8ͺ]=r}1yGs]wd?pJzvT'sw^0:ؿu<8eD�'ջ#嬫?^ F=8njO"CQ Ш<aGp !DŚGZѢXyE@Dݺu 3r/p*x}yU'=`ePkI;`%pGpGpʂf/pʀ�ް �o?9蠃c2E <ȠD6p@9e,b #4LVXmͽ媫 (c\[`;ʮ(_Cf;k!h8$ou<V j| ylmFoeIGI`L?<trby~s3W>\<+D g>Nq++ya:YVvȤI+s9G~Cu]ޠjAEYDt$rRڨ'|dOSO=%>|j|>;8�ڃ#8A�,6ʾpҟ K>}_~AY =8#�6)3DGpzD@dDdž"mڔw.,jge;V[=wnPzx0WRH!!r=sxTY'On)̱~ALOz*A#4~΍Z6лwmU`gZ~/U7p@ #D{ 2W:C�8Uz뭁4uVw}Hx%U.'V{/9>>>8#P)Rȗ\ޟQ@`ʔ)3L!$ѣGЮ]³tG@2n8yׂ7 &.]Zj6XlwGpGvܐp!0qDkn =8 ԩSx#}G06>)B-ZU9^=G 'M7@ fgQ ȣx E9;`D5xC ɣΚjy"F%c5׳WI.=|_]jۥNsň(Q?\dpyW+ a yE~ ƭ') vBYMHq oy8lcQ[]{ҕS9O2|p";髃W_=d~@! w O+#ȑ#7!3k;qv:#P6;OE^~Y֫lzA#8eF`]EDžJWTqL;Vҭܿi۶m " B+#ۃuܦ=ܰfB!i]x`z߿&АÜyC%7ȹ暫nC=<MđuȐ!2xSKi--k:4>MowG^zMޚ}W)LH?^W\q&r [c?pEO? }+jQTk Ľ޸ωpGpG!qG<S,(V9By/uiWP2;ケ1޿]Ԩ{L7:'rڃUOek嬳d[lG/ø.<j {;5v{Qr˚r]T۸": ZFQ4(=FਣD"jS7L?:zdfl6˛80f;e9PBn2|,Hљ!r1<hG +^[LdECd&w{.wZk-~#H<8#P  e#Fȏ?VB -Tjy#P|SԡrGpE`D6HTVV6bv%N +X/AL=c=6sSzKAu' 7ܠ�[ 'ZC-"s7N~{9kۂW'"KZDoRH'tP1굱 *)^iAGp*AVQ^ aqz^j6l-+rG(njܞ|&M93x]o_=8#8#8@pCW9@  ^o߾7xC $Sb{[$x#'kM n/|BM$AaY{ws=wԫX*z|G{QR n(ұח#Ͻ).H1dS4?> �O/_l'v5;15kt%ۘL81D,@9v9q~׮]e饗EYĝP:.TDmYՙ D4&0P;tS(Ww܀7rK}Djp(O?K,EFlRؒxpDEmDɪsrïvG }':yAi+@uS3Yr'7HpFս{4AȊ3$tz6`eWݝ  tD믿!fm# *Wh?\AgwGO:@ڢJ|OK g_Qje|ZQpGpp"Ȃ+a$㕖~R@뮻n [}eg.}EGp"?.uȿ+nf}UJx掀#8#8@!uvC9@ paE <C#V[mw}}7hjeuȳSMX^z)>(w!㹾hP8{# &%vۭ *V^YwosmTt@>(w\uȇV}ZQ-wQ)TUAfEP8s p.UL7$r*_:@/$ _,mڴ #?~|'|qޓ*a!N4VAU߾}eUWulB@ՠUمȕW6TCcѱcnx5eV:@.̘8xG�ՃE]$~@()P@{ 7_/^hiBbX_G*o?rh߭*zGpwQD)23E_~e9CYA>+K"0vؠ'}='x4LUQo]Ӂ6ȿ7dW(`Y<ywy[f믿G-~pD_\r%_uYrg/<8᫆ס\T\x9#8A KkqZ]ջÂ}?uW 70,\g8#P A1uذar? <X U}r#8#8ՂW˝z8@\PF:[o N!^>w A)2! <8@hjyhuTXUU=H Hg*W ~R_^]SG|D:2X5j.Hy [0Q#3.qx-ei^[dE_\:5k)rʜsbA'M7T#w 3̐ γx`W^ U?#i۶mpF9#o^~#P4HvEwE굕M5i$+ /:N]tѦ'?GpjՓÍ7ިN Og%DmI?3OC@¼ΫdKK/-ݺu gϞNd�yTYo=nv U‹uG(ͼ(icqd. ƬBh~a} $=zXqn{СCu(9Ccɺ+Va/($N?u-ߡ)gk'AB-@1[Jb]wݵEǧ9u@5Ofo#8 @G ga/ڵ|rgz ?kw}ꍮ<d\#G?\wp+e^}%eN8!q x_WxD�',ƌu"2ϭG%d_-ɧ /^0VoUx([ЩSh'r#8#8#8#AছnO>Y=n(; deǏkF6l>CȉOxjX0�.82d0ljח7X2E8Һu۪k>`F)eoߊ4(R|/1^s5&>Yյ�Iϩ'M}駃b5 [ ~m᛺r?^UߋtجKdGh#vIGH!""r͢zc"W2Hd;NbԉA_Yv.2bĈ@[Fa@Ԫ<ך z_Tw;t#]).L8v!|֞A N y#_i+?|83,+˔h:ٹ!#gj(8oIxdy,qB{Y tgyЙmihtE!<ؖ"X;atae,V@ˌK.eVgt \VI]Bgya6\xnǻw6p)My饗d�믇1!Cm\L!gu`;ɱcfB6v1RD.Vzҏ|ǭN6^\s3*X✗N7_1_`ع 0 VL*miySG6,^g0EUlN :9rȪ!^ GpʀEQ[ 9n&{ά$5+;@.NϡuhoH ˵6^ݛo)s*rwgB4s01SJzR_dɜ:S,G_Ĺϼ=D%�x7z& Apk&MaKnGyI_rƀp0&dlbOiSZKDp]Je|Z6zގ#8E ˋwPY(R$Y(XC (1i/D!/#H1vqK>L ?S {7ކ 'N<cbE`yE˴/zi/1ަZAIW^d_SߪgF~ri_\vi''H#8#8#8@U#8@ܡ2Bg /11f*f<qZjV+"y74~#?MZxmi/],%]]w;SdYC̒vyK(rd�YE߾}=?3ZK 1D-mV}ъ<78ԂVU^ŷYRf3WAafpjQB>QB 4,@8]vӜSQX 'X>H ձDYf_9`nn=p !G3tCV[Mȏy"zꩧxx z8 MPEG1c?A5X*Ȇd3NM.O4h8Bq[lǶq=dQG1\b%dVjr )BY۷/XЙا%Rr.f°M?Njv[oc m,BF U) FF\XuY&baL]I]~sm׫0[{yǻwK.u<3L3)yyA@_{{~,8Z԰)ef cl)؅cSL c*ӏ/:x-zmccs^g;=(^_1q6Kw$<0 'Z{+6C =_%wYtm JvG(|Vyp"Hd!G6 )"crJf\֢�`#ݭ[0@ Q=0p t-3cHG!ĉ+=zJzR_dvA\1/(˳O/' } x'n(Wl^;d'xbXyɭ*\rIX+׽mN9E#CcBƆ+[%4&{)kqֲK]SGp:A@ J$#y%f}$t=UzAVf:I1 % .CYݤVX!췝g~T'= zЅoەȴ/u6@9QIB˄zqW^ֿ ' *ﴚ?*$cMBgqFo50o#8#8#PD0/:zV#& +J:%*!qeswy;f~m۶mU"WRҵO曛U?pBm9 %I, pP%={%MO(R+J\_y{J ߿g;YT?Q sViYm jP#*UM֮8&Ç7ʀ M|2^CEQC7˫ZQ:ꨄ$Я("ڠWj:6A2fUp&0{''Я!()bbW K-TBcv']Oc[% KL?Ƕeھh'7Z'PGt,!dا9+V$@ %orkkRZZ:S[nT^?2䐩}q7.ƽ^q#Pqs%J <8<7̭oWsCRP߳tJ`Woef[77.(/yy-;IO|+s̑8}Qlcl).Hc/B [L?hw<Zuӯҏe+y)|xs ;dDPa-R^Klj0a",Prp[qe;Z*ypGhn=k .{wcǎ uXXF-ҺT֢a3BuY8%E%~lbܬdut"=+l@yXt_yy-E8(|B$~T<32KEKZkF1)_NS3*-[o"BuP"S(ᛳN;Uӆ/YςJQ#2VdXSYVNlזjǧj8#P92VeA@'ݢq.D n\ 웭j #8Bt1ͯVц Bm7HjUW_Yj *0޺^+SbV2`�=zPTy=xfUby9#8#8#8@xeذaM6%.-{qeshޑ~StM'ĸJݻw.{s"nݶ:5fA.QG@%+'_1=>VW/R(l ^C[vJWᅲ6,8a}GfoQd2:v{9s|eILG?~}r'ᔼQD\yBJnyw>}aV4RyQbpQͲ]^8O>Iznǔ0u]\h/#zmgW DVey 6N昄.,/~믿Ngdnw-.ʛ[l!F ȦҺ:E]-r"/\?M_D sNt3\5--=*͍?#Ix}ȷw$ʖ&?s1/%%8%ޓ &clL] :xNi?;찃0Hu,O/mʷc(2`>k--q%oanδsωrHr5Qe#8@P3QY~yQgL[onݺ<�U@ͨKkMw�w% Run,{؍w}CгS:]:Tfqƒ+Jz`]K}Q:ؒ%XBIz*c&P2$6!Cz|rN}NPBekYVbtgR7VJZ{nԩSkKqcDƊ;:4pZ&Y.u?ȔǧGpjֵ]ڭ ' r'=|k!i5A&M$<}݁^0egyDE'(&(cP#/13EP"P/ܡ^xAn&8Wi5I%ϣ>:ԃ=( ~w},[ɫK󫞵}W%buCF BAꫯ;wC1u 7 XBD=(p@BG<2�� &LD"J[YgUg`tWy'^x[rUWLB!9~bl^4R J Adp-{.xLlgIh#hLtYgFqF) YY/DasqxSaUʗ׀/`γ`N\E]$7".l 7۳zJȜW_{0,nUc ]M+P9k׮]ԫ8#8#8#8 RVȯ馛z㝦L2Ldn_|qP4hP y**K&<M'gO8jfX<Sm3gq+őejOSKƌD~Yh~##b͐ﲆ;XxúߝwqL9%k/\˼@ނ-SOM)I.Ƿm?kA]w]89k~\[m '?ƺ 2|*2tA3[=lXSa] 2a~\ZѼ fcԒj UX'uJ]A<8A@1Jt"{#P0~cadrlJ&O$Μ><!W995Gg.p!=ˠv0RE(:6վh>Ãċ-XQA& ]oq3> 䓐&GȤDZuOc~|=tYH?J]&}FH>FY?>< C#j+"Tb\ ل8GKo-2!/Yz&s|0`A9*tU1_ ȏ+uȣHTΐT3l̀Tk N:`j{ <LC{ɂp!m,WyηOG~G꙯]tVV1fyJ}s&_m9Wm-Rlx^ #Ǥ=F#2k 64ʶfd[c~rHCl1h9b$uEܺEIߎ=V18ₕVZ)<9SGzKqJ�Y%kȏ? s38#@;ů:P)ѹ\5GpʍNeR= ^!@qusۍ)pyTz^O!rak@9wBu!cP*mx  Kp{QR)L}19}Lm˶/__,DEqZ{!=S\ . 09)C_g_.[MlΚ jN_M,֜9_} 鋏BQw@$L81?bob..2GNA=ȞpІΐJƊ&CǧӢ/43gJ!8kޥ)<RGpʎy- H=F@' \$Gk@&T1/q# WeȄ*}*KpB%-LP`aS>*XP*8u*}}2SEe1"O' P/ r$T"\䃩|l3\ZMN_y~φJ\ڵkBc&TNK.d8O2LTa+ąf-ѣG.h'{%bRULbwpJ(dB,x^}BJ3JuQ}&WjM4]H&zm<l`>V{T4dMԗbBB' %L(a8G* y{.tbP/m*8 m>sRZm,"z'vpuMgԄ*]%TPNpHX0S'h&TY)~M2 �>aϱ*ЗXco* g{Fh)y~^)zvGB vfNЏW,(ڃ nJލ^W#8#8#PtJre8#r԰&- LٖDMC,* Y瘼F nkgո2> \$# J}YV%OS%˄%1MgiT>/3\Ry٥:)r#Doϯ��@�IDAT9DwU|[;QoP>?چ1pB :]_Y"B[B uJrzj Yȵv@|k#j`|YwT↰Fyrzu&Ð5 Y!_U2 'fYnQE~_sֵ,8q:*4sicjJF@չh+^F�| y{N$ i|p`%NmDE]|s8|Gg.0]džXǎønM~,kW-J:Sb`,1s=7-(aбAIOJ*Nsƺ=fDS2ѱc =`a!_v^4ꗮƵq :nNt9WƉɓ'{)=:A7P"yK,DQI,9B2ya ~! j8hU]bC5SX-9*Jc*YFBpo@YP#,(N[Lnbj'ͷOn!,:JvζIlն88gyC^8msxG2YMxѱKx*sP?ll}0Xzӏysԩ:v1 3^St摩n|xk e#&Z*)95-/qljqƥ<J%(M�bJU〄+$T_R<_GpjD@E0a~C-:ly&\Iw⌫[ GY^8)T.WwzssN>Bu"dݢɞF~W-;: X(XKYF3Ÿr}\\ iQVܾG91.„:M#UuJ)}+JYN3|/Κ qŚ3O}ykO|cЛ_2싮Q` k[J@ѨҒgH]C*4ɳqOJ)O?Z6T*c|Zy#8E@U}2,\QA Bt"ċI 2@ F$hĈٳgBi;$LϮE٘Y'ؠU"YƸ, N(<u?zZt%Zy?K|H/Ұ/J$ hȴ2=[uU[" ŢBy6àoTfԅv4?hʘ@.p)$?^MnѼm3Ys=7u=(ZPOD<6v{.v}s �y RzkAـ9$<E+W/}<i_<_xVPⵀQ&?894\8"J0U[s7yvBp=1^?GpGpG4ƉJ 8EA�# K0NazNMȑqd8?AFdD\}&%롔!Q\g0a48jlW!Aqf+ő -bppJHľN%)]IsFajFh~·;]bP0lذk~qq8k#7. 1f=kr`B|c,`H>+7pz %-Zײs⦹ Yۊښ=7q(y~9KUN|G9)6=\>/=`| +S* ŒQ7+OW/T)\a 쿌(dE/6{gI Z!(Dl'rA?p!ޛt2PFg2Zve1toTq}i2kH!!O"X|攗vdizq)Aqpf>o˄CkhuTaKSk+D ӞQ{gp<Bpo@YP#,k ^/,N'_ȷWW~o%NgZ�t]b-OƭCӆj;w%6Qy`;2=wĆq!+ GTَS7d| Ny>黛g{ Ea|kؤnqKo{sƉqƥ%S^ i@/xPGe9cpGf%CŁxl*uOqubzg3gE>B*;OM[ؤ;�1fPgPɀz ')U@/}<Zr!rsю鋅ʴ(+N_#*Ļh7M#R.#FXָ(7 O9BM'ւxGbob..+9)j}ʺ5'bؑ1dOl>>=6s:>se9H1>DLGp#ZE M'_Eˮn3E=et|vk.SC1(J'J('v{-*%Hɘ1cDDxu{o+.z*mlHiӦMj.=#I\>WEpO9ѭ[7 U D6Sig9SMcu[b Q[oϟ e6H[n9 \ve!KUFՑ<R[k0ށ>5 *T'un U j%\2l{&PtbY:%H=Bv .,Vr 'z 7%%oQT)<kVBMU>]J+Ndĉyϊ!|,U*_yRJB,Pųɳogk\%եܩ*[?/{^#8#8#8#G@@i_[nEKT,u:1qȝ! 3z~mIs2ɄٯJƝF:밫YPul+4đq^r4#PJn.]V*eΛwkl bw%IyN>}HEh55-i_oEsRL`$ڈ_3aMkq*fz4 kʚ\ZvNzfnMTЬJvI&s=sJ�KG&opzhm6E]|s880.qbK~m_Kn5j0,<gvqjL9'.o*:*J,҆e lնn{}be21].t.Ӄ]:u i~M7:PUcKD EI"̎>AfmS^zd|,`>8`LŘ/fʷV|UGDTŶf=rZH,mCOw0!.so@Y`ʖ<ɂhkpNKB7: 8:qgv^u|ʧ l=ۖ.+: ;^q`y*/d?#+SbK+8'^Wȶd% hr}jtd;KIONٵ9Ա]0P`(Eu{1.cZ16 Wu&(\pvqKo{ǥLپ9t;:#4 2 Zb&W:d#W/]ǎB6|(>Wڜ\r\c`\M*6(WcW愄VX!#ǪhARtзرcIQ-<}azXyy/Z?lL+_=xV%xƏ/Jյ)}R7Pbz?Nɚ 6/f&k>m-O&d^67pE<3DJeon6E=X)jfө<o̜)}l?H1>DLGp#d+R9p�Z<07<駟~A c!&nL0}!!:1?ՂҺh?(Nbs,^4nnaE( 2^cۋ,H,!S۶m<ТX^NXicǎ)w #%=*0I@r-٨z|N2%Fgy¤}ʯVK+pDb3BΝ; ʫqgeJQ!ta#aq) V;M=7};ٱ<홳V[ʑ>ڻ]vM Q8#8#8#8-G�S>iy.D!`vv>l2L9i6YoN$;2-YȇLFľ25\O9 <RN-U=_G\#^-u㣏>G^{W_zM7w/׷9kwmN9[e$*Xk#ve!׺Sh.b'xz!rvviQ֟ �/-p?kك#8B`9*2 q q)t$هX ~ $K z;I櫧Zvwfv__ot<]+tT۾sp|3w'5t㎑ ʆ*]r%[{l {FxSoleKJA SC6n[JGuT,-Aa:)1;c"=3:0nyӹ+)�aǷP4,ߋ%n_'.Pk lj8|kYw@5jBoe\r ~I}[ilʒUjW%]lmh[>i;[֡,TVZYok8C-LSSeN$/H0H M؋o�,q0v87$ì gn81c܌}C CS^I:VligR Kj+iXML:@KlzR~#zQ.6.X\}l+}Ge(ݝ[T=ɹ9M*Vw ١,<Lֶ/s=ZׇM!]m_}QV_ z A FUǹ+ v/z'꛹4K_杈̪/޻oy<}32vg_tT?ǧ}Gz;>%JsWwUǧ}6k&`&P_5u|hp;~&Y;B�Ί[lE(ޮ}lH2|;1 ](IL+Vd2@-W_ Lj^JeeGx)Lz*Us_O:R;nct$ `[ouT淍78D׾9~4xiȐ!B၈( Djͯv*nRũ%wygȰZ:JowtՊ[o֨󹇈ra5Hc&`&`&`&`&`&`&K?*{H'ۅx *?F+ r))/):w}eVƙJdV\lu C曯T0V$@0.uyrbc�'cn$9;_wEwJJ_͍S58@lXN}ݵ`Qs*7�aHÇK/m>Ҭ{Y/3S*e>O`i| �c瞦Q.Hoj ՔS (tj_c ;9ễ@)| }X<8ꎭѩ:l|y晧lUchP#H'pB+ʷDY&0_n>y?c~MuT%wߍu-z jR-) S'9C3ײ|)FqjÕվ[NĵԖ^ZJ(ݕg=JJ- nktRn-/Lul5H<3k`<wf%b)^QNu|HcSG}tjp' `KǍ6(sqpW�Jgyfua<8R.8$$^OOwljƥ|ռG7zONN?ѥ<00f!@֫J+ "}/dq<l{ۓTsSv%T�;Raix )9oZj.zTaUV߶j*b5rۍD_A}=}^@:}US9rDM֧ץR_ȻuI/?9#o&˘#φz4>gFrĞEOG}i5s}y6b|ڗs&`&`#PSGaԎ V|FQn6Sb\ũmQNAC '͋ƣ>8pHq!DeA8'9 }GAǔPd*KIi#(=PO)ۗ~+\u]Qqy-Wwq^xW'1"QM)mu_XX DDN:[V̫/zb)P@-Æ g}&X^"J{nTŸM>hbM:餱x 70*rBqa8~UdM?|$;;>\QMek~/̛ TR*ݿ^8T+nLQsGn @ix]2G$/ c -Pզ+<22q(6$ %[Ȉ[ouӨWNdr%2V7R5wTANd&Y$GTfrBvmm9#`Jݝ+f [jdʧ's#J,E`Iʻ{ȜgSn^k{\�ciYcD5f>/[olO>ӗ*xvم}D ; q N.L% `P{F7}5jʩr:sՌ#q0.!Ӄ~P4}]tEAϚkvdM;wyU*Ctїzn~H:MyOoK/褓NNRiF1^C-%K |Aahu׍ -8D'q}6ᨒYw+l;IFb%#߇;(:Ig-97}5Keg)*l%p}P)Ppw@5Fr M~gj_yʳJUIǺINTݓQn;u0i5Fc5\zgjVǃ'a]vY-bb 0裚OQJ]o*Ʒɣ;@GiAWT*U7usHϏs9'ڰ$#TO-PwvB uPtw˶;JRxi;jޣ  &Ai ;N&`&`H U zxޫ=N\w96rߋ=/e3\;>c*ɹSlR9Aӝ>�ݾJ?|mZ&Q|r}پ˛/V#jG!)GoDߠWj*7'ݾXXo֧פXXDo]}X1#!gȥǧ}j*ۨizw00%&j'[tњe'f-"�- r-}A!k0ܵ/m[vu@8v5t '<V[-j.8ߋ?qL;CsAQ,I悡qWl%ИOP2”?DL0}뭷^= hC}A17s#x~ cj+caPh.8:anG#[Xp;mzH$Y0e{0)j J}L}Ay+0/ Jq_{3(v>3*Da\0Όeژw*jܞjr_}.DG sA …\t/A6:r˵NRqOA*G oQGO{P EsA�%/kveS޿+Dcx\m /pdG߮7F78dsuLLLLLO σ\\v20&\y_׺o(7A?^{tM Nb0CpX %/8\|E TL8|;`{'c> FE9L9r . Ͼ?>\^5u1搿: ԗ@mL �*>k NK.dי_|qܷ;vK/R[]Үu5s~ռ+;*F5s#!Yl+X&?1~eY& q_w''8wG\p2dH)JT={u喫xJ  !}nE\p]Ϣ{9rT[h}[^~9x zvnW- '.Yf%v2ےyU# R雞f5JЈ9%tؐ':>ᐽ&&zuմ/կkނ#{1R~aC~Փ + &zd<L(*)=6qN:n*mGQ? Y_|Q/m|OcȮ<~悱^$>Q7>A(G=t"z/0܏kTMyڎ.%uM:r!hN*.18gˑ)8uV?tkH^|1䮹\Fm%{VIA/%MٗUpw@5`pVQ2XNT-1|5*8N2TJ̣T#ϪV~VigX%]¡-V5'C䅕Wӆ>zoX'z!|.8n:q$y",&t1JۅǥD_Ǯ'  'G}tU3DoR*SU:ݭ[<+U12qC4=øRbmfX{ ɕVZ)U++GG:lu.rE ,E 4z_+iM4Q>P;@.W^f* WE>R\݁JrjmRk;XcKp;{TֺN�&r.ed3E7C=¾<=z3f O7#Nu<}g@_bs9A~FFVH>f>/z1~q)U1W㧡/TN5 H1i`%w';q3ƎNǧRi5s 7z|ZX70h}AXttU:!' gq>G.(LR21ߊNJLN8ᄹ}7Ge=a=`ϲˏdD[p"sni3DUaHbJswT8fžCwSy8$ L(P|~駟>H(yv Q0sg}vt7^.Dsu]#K\rITN>{g@ۗa5:"G<xp"eP_~:`\"[v GR$)V 麠RpC$x|@Q =c zjt q!jtTlt_lަ( 9[>y晣ꫯ]kVdq=�(b kd!*K,RAU>0AyrPEY.+?ekN| jbwR1>H8hVRͲm(5#EpUm:&`&`&`&`&'AEp&`U@L+qЋi;a> )xO%&-Jc9fy!À!8,F&LNԅ|v}h}wa[SOE%EVJ59FDd+U#׫8p]N&`%EBcN魷ފNbي%pRo0? "=V(|rs~9վ+*]rs#ƻ%kP25LE3O+V|gQ kɧpajذaJ1(`kQV[m{5#H70wmM{Ԧn_~Bxu#h` 0>c,CzjetAFP譞S%b:sdtl3;8}:+'φg/ڗ[fi@S;Uwã ;ʪN0(q![1=lh&8D4SG2j 3d}|S!'>}o!QO%Ǩ~GC6T:* R</t![DY#9)y&:{\t0+XE)^#䙁͜x}rfAϻ6\�jgB-dkQJT-^�)ռʵ/[JQ8<`*ϪGIv+ \lޣ-Vq;Z lklWĉ3$Vuqʟ9/c4T$ǥT.dr jBUJT)u+<һ7c睌 .p0 T*zj{qbRl><96@iV=Zi=0 Y60ht4r0IrލLt&J}/rL W֧vB.\�e&VD3>E|<$w,dz}wQX эJK0O>Unh=#-:F?~2l'&WiK9Ywމf.W[2Nxs *t?pSWr b!UYcݐ1"cF%OA td3j'j|ڨ00b�&%wީIvI|#<R_|"$jGqH ^(O?TJћ(W#)L"+()*DGd&tҮr vi'H Jx^I5cA V,'(=)((bF :}$ 3 x #ݣAA0 v(M\l їv))((((DWgCPrSvu_WUnP ((Prm^%8WTrLOvtp-hWp0RVpoሂrN':CkU10000">9uҠAm,7L Ϳ G`bbZ5;Lz I,![dIyM=\mE! FJ ι G:\)+#G* D.(8en>Lf/" Ø5}Y|_0T,jίAH A Ż=y` .@ʕ1uF&!b|k6^gNZofQgա}q%cB0қLwM\%?QQB@নh%]oiD%yT*cjJU+;8GTpu7&ݯ9j_?^n喨 62&KBO r6 2D!H\# ̣^y! A**VLϭIU@]IŮAYt0mwY`t2~o:\yQT޽_ԡ Os!vnr_צwC Pׯw6վ*ɂmKKR}VUG<X; UӮr= I7m޹C5R[a $Ygyxw`eg}vOT5^ j#Du^KE|a&nm{ wdPaG1ss#V1׋g,tT^'”{"j9A6-|՞LLڕ�æזF@TVbs#8b$ڔP\}/Rrk-PԂj\;56!FI؞Y!2tč6H|q6<V5�Sn]fYb%Vx'ܾoSJ]veB6Ѩn2O_=zr[XoZէ78\_杈<[JTG~-Ij{R~GY NYV}VQ}r|Z\vuWgGg5Y&`&`J  LTl6hs9'N!&(x\ukphX{wU<dqSe(b�V)e;uM8Y9^%(NMg]xQY'cn6չ:OUW]-X,Rd&`&`&`&`&P O&`MG�Ŭ_<(i ׹B,,ekeaPŸRu~hw0^8 QOfkI#(;@؀wJv}2>죁F'U_-ub&=׋@+<b.* ~}?:='Q :l8馛QqJ4C+?C)c YGf=3!)i N0��)a�G<MU3pBt:|ph ` e]D-hAnU1hzë.r,8DxW/ cXtM/"ZlbpI'\806$>k駷a$00n&`&Xa S˞p7kM7c~!ЈoFKΰzcڊl!n;M;F'dop�~<@tA"4kD4=rVqGkv_>qN@ŀow@#W(#igG=Fw?/<yI>=ӞlD?iDYa|60hm5u?T ?W$`L3b%\??D_묳\sM߿N4D1x�W $K8kԵl?oe;uMY;26DycdUQ4h sIZMס5\nDZr%pQ(]u2?LLLLLLZsV[mX;Oc5V+6&ungy`1@q' +׿Z @/A=:cv; vhI#(lk ;FGLD*ׅ/SF߱!s=cEseg&JwLGq2>'0 oy5\0$-3F xR* aGL00KbN )_|~i=q7bĈ(C><Sb`5uV&~M9VIn!O+3֝qV[�l;@ڥ9۬k뮋E3clOplyydMVu~>L:=`w%N&`&`& QBDAvPV_}u=|5FG\cT@#YQFIm%Y6o?]pc=L6 PK!+"PiVֻVϿ\#(syW_1h8{c5X#8w)lTZFQFt;=LcCd}<>9FF%I}Ƨkm00&0Z.Z5!څ &RбqZ !C'jDYyEFF[ rp㎳p]*s=:3tw?¦UVYE첋Xbro_.xq:p(d~g&`&`&`&`&PhG LLD@\PW\qb檠kSsÆ `f}gN&`!JB4N:)rTCцn'su\J)}4j qȄR'.p9x:?쳱Oj[̀&LgV6 /8n yZy߈KSRv |60 .yql28t?#Q>1Gզq7:.Z`DPct PZҝumbM' ۫|󍮺򼨇7px}ѽeYګn @ hx}nOngRm&:\)w@{g{|S4RLLZJDhW駟�8𨣎Һ[chwTd>zj&4K㏵{뢋.A;01R=ףA:A__-24n3*q<|p֮AwiNcz+, ǧG}thhv>>mܕvI&`&` PSGAG/LKf18Gu'^y0Ixn a"7)E%",f\rI߿ij%@t!$<M[�y8l7U}=B?$qjLЎd&`&`&`&` #`CvA&`5& /h#b :cuGGguVEBNj~^r;! [(NGyN;'n!O<#>ZnxKT85@+>IUR(adGL7j;3gyf fܛ|n{@'fNzs=WnmƼ8Sr2BO7tO>Q5?kcx ]}qAzyZkpuv20f :T7x{zfgw9Ǝ\"` v%H<Oߴ hgL<ng 5Zzi"R{_'_60/  KoV_Y0Wzgk|6`yn6| 118桇>n7E s؊n'DdwyS K/NX;â{=)6vi'90{pIN3J ">TS5u)/KTbO䢻P00^#HяiMz]7gP<F�pwGgbL#(p 袋jQc8 4_~=>ё/|Aݹ+(,'/ "~VΥ @6n 9J첋.b}.O<wQ?N:餸>sKLuxCzjt m&:W0`@\�AO?8N޻i K=VoV~׃eI[mTB%V?ZzG�C ./>h:WQרOW1 ?kF/s9':PhCf>_:!ãs5G -rQWEYi~sZ��@�IDAT&@ } 6,2YaZ8#q"xq_Dǐb^xN&`%xB \^ -Ϲ |w"Fzkv ۴wY[o&lLp:G`Tgmzu[n1VYeYg.5DLnD1x\ zjV2k~+tN8`;g%d><F},Dji \$W*>>>LLi$B3pց6M;"(Ib@CcGp h~oWUG1rcML^pODžgO>f_z'/x4Lt4z] k&`&`&`&`y6`&Z1BG#[1дlG};,*apC6[GpMxqĈ!H%X0-Bovf:@ �gu({mԚZᆴFh}-yX!X ƀ̹5њ͵n>8I3~{V~QC`xG�|`: 3IJo|3CƠ8EB߲}d&P8F0P7wTk/8T{_:-q^ߤNQ\X0Ϣ=wiNWZiLaqƩ1$ϳBǐ/c&`'qp`ͣ<| @gQ0b=l\{ (=`}h[ t7kupI#zWFgW|;a$Z8]jM1!HV/=݃MFqEž'7MK,DkQs+b_|GٮvSm y /Ppљ4LSǧ bjJǧ5LLF ¦VggML𣰄S䘌I~(d<̣B4ߺY70 ;D=}ٸꫯbnx79]xmwi&`&`&`&lFMA9H4j @ s8ꨣt)hg!G}e�~'xN>hHEmY x@r/rxvl[e"A4=7tz΀\sM:Ӳs/0/qq_h}on*+z[[<K/2 cGgSKפ^~hzI'E뮻n Aro#qv-Ġ<cp o&`$pq j� <G{ѽa`|_裏ᅬ:8@珅LF-wSLA; `_cjQYfu`̔u 9lذh "{a&P@+W 찊]&`&`&3v> O8낍y"˔SNzԋ1u~I\`!ChqզnM�]҇~??./b :⬳.t;Z�yCw6\simTx4nsύ:uKD?Di 'lVJ9v*W]upĊo%/vHUl6t[g&`O wEAOA1s PVbgɉÅRc q9sFŦЄw206&JX,8M۬r<Gio 7LLLLؐkk&Po#<2:!!d<ѢQtjNoftygg欰keF]NjD;r (n5ꫯ ;pdB[7|s\ֳEкFkfߗ qt}Y-]=A\J[l\<s-ݒ!xC�g%;C7xSQפ&W3TX>caĺ{�=)�}Ƅ|0F .IV>L`Fǂ $qW_}50{n`Z2(<]SO=W^y%2mل3Y[,:d#6 8Ҷ]F';[ Σ[oUߝHm60C0_wٝsky!BW\_Sȵ^;.Ɏ?,y@IonoIqƆH>C=.,:zvZZK:p83VdN; /5,OO Zd)+b|'gi櫴kԖQpk.$y'lqkvFy|Hx:}|] j䓥c (G-{#DdLFu%hq%mqNLZ",@!ޜ5,i1C(m&g8%  )0000hG6oǫ6 @�vUhwA}L w[#*L?c=Nvx50,N/Lz/ (@x饗 +YZh$.&PO'-0炳RW[m5M0BogA6pJW^``@KmsRxHw&P<r҆nnǡc8&/B\s.b 6, "g ~;3jĵnr*5A7X6yezytO*-Ux ':WZ)X؆}x\ Ԉ�rU@_x=] 㸚, ,@ײp 7$ԨLH; s,y' .Ls]LL@0 cF9Qi団L׽ǵK-T ҇SHtMתj+8bj'z8l7jߛ̝Y,0kW}5vN&P+Çm!k |C?d=@NK_utI?馛r^އ,-%wMQǻމw_g@~Hg5hެ=>mkӎ5d&`E P0ΐRAɥ`uzk0!dZ4F:(2ׯk cfAM6Y:k0o;C~;.(d7ȷ$"FJmqrKT^ad&`&`&`&`&zF : vz56� Y{GǒK.*Fz:瞋p k;sTs1kU1!N/2߇R{/:%;b-fgs18 Ő%V#VZI vU,g*}IC;wtٕl}5v g}/\^xz!M1{ǐ|?=QQע$>H ä-Rz4/y0h:Y^aoU+GȂY}ٮ5$t;$tZ0F'qꩧnoߦh �l8x嗻%$  y晧k6L  0"?-407\K,U<k2[|ash�ίYfWUt>mN{@8d4pO0HRG7RK?$]wݥ.ڳ.̐59@i~xw _>x%23sV]GnLCɼYϞ'�xs=/' wvZꪱp0=>=O{9 4@A`ȡQƸ#@u5 Plb )%)$k>\ Nvym&%է~'dJ F8}L ;(bਖG?j\em00004d]r:�B1?cvHV\qE7kicԻO<D}UWŨC6l&׻|o&;/*6pDCE]4:C1BG gO}?F&dh!EYDb4hyHwЄM~ԋ)r([iWmŷ4cO8^3x#}'#<oƸN u]WL0AW501sQd#qy?믅>ˋjƹ$y/0ᆓ @m ``ȳց( li+Xkmyj{M o;0 jﺚ 4N8BMajT/θ80^x x td'>zGc'@" Adp:B`([~SHk`'pYH꘶QP3|}� (0}l;VGǬCޑ$o}^gw"}~H>S ǾCޑNzV>Rw @;#Hu?"F0x8gKڲpކ#7p 2TS%m5+;pUr&зxN|1n5 1<+nbtςYN&`&`&`&`&`G t FvLs ch GkF"j`D2dHy#` &hx} 4Nj"G`qGdjQ!KyW;8$S`g맞z*QbEy{1,(Cw7+"7W~ޏze)oc <X8Đ N\`Âc,O>aÆ CC &z{i:u;K0h?:vqlؐB;{|W9,8{7%ax{wzYHE`; '>|]&l2 Wo"d k 0 [a&`&3O睎<R}Wg Q!�'t?\!XcWUuu&N `!0$zw8�h50Fo'ExW!mB uE3XҝU>|xW?/ro c$!K$/}Ƚ)Yqp?G-]}ӈ7e1s齈?<P3<QhqOkDzsկo&`&P@]A"*M`TSZ0":#Oh0Z#-Fv! @0p дIb :EM+`WL3MTB*-6{H MLLLLN GM�CFg 8.D ˥^:FM _pȦqv=D(b+5qv:*Mο@kx4 (0ς8@a"V9;6?Qi/RTd%/Xi%f1AVrVp<>o5"wB7cQ=?:jN�1 n #c^aDdT袋Fc*N#(|87|w,L|rzLVFI߻r} @sRi-+|7W:6<{x(kagv,U.tҝ̮z]v3oEv�[dW]裏uU_<?vH6Dw}9DFUt700'뤗_q˷~_!GDw�*掱enY,Wa^�?/$ǃplg GW1GdH$}qA#ڸkԛFO+Sꫯb>ϡ/HdN#)މ8/0o/4sC|`8=8/2ID1o;C#Dލ4z|X}Qǧ}Ae %8g[}4ݮ0*Cq#9ā\)rNj>dR1$I,D#*eA`dIz BW|RYǏ_o.gSN9evr>bv60000h 7K1h(q;cCd(i a(pԉEI!TG"_~`L xkHTsyt+"QJ&1CYfE~6s툸ku& 8DvyעAGr6<Nr"k2Sy/t'S~ޏ79ײJwz71=&,0A<?~9# )5˜^=8̟ ^ޒcw Ґ 1;6ICH\hDA^$ma)+*<1h- ѹUWV;8x7 qGx58&5S Ylt /K۵&gc?1b*p�Ȣk~9/'0-0||Fos&`&`N Lt{> {L [aW:\fuָ�ߤN#~�2:`yE`Hd_p౔k}q}$;n\]R5Ear~6daN5kw yNCLB4zWI7œ@mkrq>qJ ^~*x&}De+~6Di,Ø!k'SIy|Z30Duqyeye`Qj:h63�y]R )\'v0MMY.&h qɺp;C+gzVPF )1qȺv#}Z8Й#u-<}I)BZ]ac&`&`&`&`&P-C+ g&`E�T5N�P" d2'P6j?d(̡x#Srd[DI 2YPr2h?/ ѯYPVN1&@9%e24Dg8(w"V>1# iᝇGg.$pPgfgZu7Wg~T8 ]>8^z;iNnk;`L裏FO=T<z)L! k~AgqqRZ^z.C%8HpmEB -T{/; 3{䷿ @ \UGgzAn(g@'d`F^΂�}jo@/F ,KiNǰ$J/S9i .1d&` pҺ*8;nAYՈR] @'8 3ڿ+@>ɂVrtuJq\urw Vu�D.�M$RP d8NDv\aY/Jyl_v8%ϳ}1AwL�I}5~Ȃ.%~s4E_tD9A+or N֒68(bO=ŤO{yOtH/KWNLtq92ɤ/"0h_=>mu.6>MDO=\ @k# Qc�Z@!VPXI)l[#a:K?9dZoqǍ Ǥ,Da)3]CC"wȺ6бܒ=5JV_́)-KNIY98EY/O|LLLLLL ;l : 4 &_xᅮ)B4JHK/M5T1Tr~O ȾJfQjE5 uoe dIzC~AL3x̻g3Qb͂rWrPȚx�#p<Ptf|5sk0~`OLi~2g('EaXble}gqƑ֞Jw^mK-%-t)׹UOQYKCwiG褫+tTvAc[26d,,%FYiLNc<wi͘tZS3&LsP0kT+` /.HҢBnYg'^@;@;< u*y$B5,{!"A'jv6 IWpoE\CvʾO]NS5T҉/Nrg:s9KQ txg5K/UxuNR00TV^Y:%}.Wrv9IK;2׍~Byn{4m+&tmKv5YYq@O߲ $~A7SmG{)f!9hB$+ OYs*l_תϒNZ,-4w`23桒C?RLkiNCG-R67Jkw ོEbrXH&nIg;N/[{5V1A*0a>ȚHE)023w"kxw#Ȥ:ǧ寽ǧW00%8Daܳu^&zL"YgN6IԚ|9,$5Aʇ+ Qbfuv)܇ !/X86mgi?ƒ$@(M{P`)o > m.l3ɐlzʗ#زN?LQzK>:UKT? @v6W 1K}'8TLkQlB6M%F<Ydv5UbtXă!Ǥ, %~AIǕ2K\mS @ 03=-(g7sǘ!km+sX7an%-)Zy7>JKJ5apa^*wZ6@|iIEޱU ɐ^Yc{8f;b64ciWK#H/ $~xәky 8*,m >ld,r:-I Y cŬ^ cgx1b6Q&㼬Cˬso 6*uH^06Z+u @:TZm5[Үf nKFI`r]w[5zYY~ O2կ& :dz;#@g;:B..'AK3rr eD4II9m0Lr}大'orqs<uf.^N&`&<SeN;J"LL 8j VZk<uB6GgNɹ:ZZ#GXې[A7�#P->@o˴ovエo/*|kH͢t5KV? 9cMP$dN&ܿ¾Oi\ i8^/¾Yl_lKۅkd-^ڗ&:~e0r{!S! W>npiS_&:^\}uUIo/ އi_":NVϕz'R/䛩e߃i_ȕS_DZ,ю+މё+W'-N2N-io,o&`&`##HpCEF. Ԏ�|"$KBᴝCShCb,>Y>v+ Yg[ڗULpuvV*)h.Im'/L�߲dlGZn @mؐ6 T" E(ܦ5S$kLHd?0U% 2Y2$Cކb. <iI\NRar; @)/"ZCylԒhӼsZKJӜT*nKi(&潗Q?͕ڢٍ67K/~%YGFw^rN(Nq@*k,\Acemd6ƬnRKJkƆɹdr!K 5$$N!qtӼSkZ^&`Y-7b;@ dnwjv}tvUi͎ s #;FL>NN<DPΓ?25<6kRVo~K}49O\\?:Y9SșXp]S'00A|pxQҁ ԗ�=&=o}Kz%}+= {2['o+. M6a俏>baSZrɼGXGSl' wJ6g]wK'ۜ~] UeS=eg;&TʢqjA,GJ[ Jwz d=9އY=Blng"jbwf]md2SLk"C":tk'hV6>M5~i} @#SN=T AUwV@xoV\Q:HGjnk {g @ \uU^QgFL:Njxdh0^fMziE\"}6vMza ݂NN?:&`";yG^(4\Җ[J[l!4SJu&`%p2H*ros&P[g%BҥJ3X @m㍥?_4&`&`''|忿'@ 7v瘛BpQ8@+ @7ݤ4/'q[*&`&`&`&`&ΑȰ_|!=TkrMjNCagZK\_0000000000000h]o5l:BLLL?~Pg_^?ڹ\0R^ZZ}u頃J&x_~wҵN{Hwe' .Lڏ�q.L n 4/'B\ddN&PHW&o *My H_#$yk뚙w2"ԌӤ> N } 4@AfIabNQ%YD":-HܓWt6n 4� 70] T"#ȏ>ґLLzN`ESO{Oh睥6,oDO=g ԖQGI=$pCmun&܋ .ׅ:T:hi1{100_~ey{LZ`_~ 4�ASGӟQh-c-_K/O<Zwm;�^[zᅼȹLnuk6Tr\K}3l}GJ540000h'us9h2? bF�&'PVSLLLLLLLLLLLLL:oJ39uK[,kUoLL5 5UWI| |;y馓v]zlkmD`ᅥ 7>XکenK+vs!=JLL |Zy[.x4dXSLL'iJNh]8$UVw7o"w:H>+~{zv9&P ᅲ^b|A$Aۤw&| ԇ@AR5;; @m ҀKW_HH'00000000000000%3m\ "9z#RLL^&Xa{]v 53D֫|k&PG䍶qA࣏(}tMҔS֣$i&`&Ip1ҋ/Jw-4hDm50h6MR嗥hڹ>B`qn_Zyegf B�"w;@3-mU^oK+tN;Y u00000#H!uq ԊoJo#%dDadt(;00000000000006[&P/0CȰ^e8_00D�=K3$t_Wſ Ԓ�Y7\:Pes ,x}]50DϤ__Zg&`&`&.ztyGU)ե_Z<X0 //}Vk>?~1[rvn~1Xfm;)EoG3 @pn&`&`&`&`&`G ^Z` ";rA�!%C6L:\ J׵'ף5LLLLLLLLLLLLLڛJmtZ�8Yq200f K']s47b 픮;Lzu :ne'頃UWYFz iN.LL \}Կtm 7o mpV۫mnM;nFW^xvy;')@nC1 4'g#lqPw'f9IޒOm7ii{W600000z׶#z_D> /dm6i3֙ @+k%yLY Wv @կ;Dw7ߔXCn:i=T:n 4�N:SKLÇK//xtҕWJMԙ,j00zIIس=:۹ @=-4<ҺJ_|Qg;o<%piǡpU[ 7H~[jݶIn=LliVzJo|҃J{)0Ckϵ60000L׻L13.@{i}YfFDsj[c&`&`&`&`&`&`&`&`&`&`&`&`&`D 4+g^~Ykz 4$ w; YD{nF}fe&P{,js4\wyG'?, @ HK/w r9v0s>LLQrҷJn**Ǘ  s|vۣ{C%dN&+?O4+K<"~diFe @ 䢋JSMW֨} ?<Pyf ʪ!PbEd&`&`&`&`&`&`&`&`&`&`&`&`&`&pT4z`sH}$}e200_`C>7;2H @mL?N1H}W< @]v6 8�#LLzN�H+qD%#9 @zj_ V&@馼Vz$ȍ7;i:[8\讻JM'#p؟+zqiDK200000fM6[s7V'W PJ= 7=[ @ 38_\l+YLLs ,t{IK8C 76hs &P/ziϹ3|/]-8,׿600矗V_]Zk#H?�d{Fg 5E>[:xK6. L8ty(Nјv2z'iMnK,QK-tE/ =T>�@uTNn @#Hqτ3ϴ@zK`k晥?i 4盀 4JR] t@~XcI/ܽ| 4 1;}2%nРSw[pLRm7}9 yW ,>x=&-00ߗi> JBd&`&`L෿ۖwy'X׽&H喼 goQ{g KoZ7$ <x;p?x>!HsU 48k;Ѯ 4モN8Avuj׃&j: kdOyA+] @}smIo-xrw B}v&[NjVm$7Җ[JmwFI f%:o00v%w& "}Ҳ˶k.00N$@0VS5;Dnsu&X:Tb i7߬<e!\pMc6{VK/ݝ} 'ܾ/Pj+驧9._>j&`&`&`&`&`B! GMxc+a='i~:q}A0;]p2Bd&`&`&`&`&`&`&`&`&`&`&`&`&`&pA 4;^|k @L;'yFtS -$x{G@d||iRp{J%7Pua~[o30N%0by3l4zC:m&`&CriC.U ViIV|ʕkz|q)wkMM'XXtQkJ;(i ԅ@æPGgjMOΒf]gi5D ԹwMLLLLLLLLLLLLL*wޱ#ʤ|D3{n& ԇ�F8y-;Ɏ<Rai啥Γ>e;Whǖvi',-4U~j ALL$w�y1;KwR=8UfV��@�IDATLLL <Xl2iUO>iF #n&PVYzژw~''jw$xu2xi頃9x>G=r dSLLLLLL4"?.)&P4ҮJ#=7zѵ5ꫯQnǬ"'b&`&`&`&`&`&`&`&`&`&`&`&`&`&^yE09b'hv8|=uuLLL7F-o}9HW]Yi'i7^ޔsM= ?iO{ҭO?]Wk/UV9^?dХ>_c1Fq>&`&`mL�G8O:pi7ސp>mp7LL2[|s^VZ҈ip M9M$P!)&!!*E\ҿA*" Q*D¯2OI4 IR$٫s]=3|us{uzS%i@Zvl\־KԿnҭޚϤ/*UF X|>, � � �x< i"7$ vTԩ԰_<1`6L&N2T;@�@�@�@�@�@�@�sq :Uy<V%xG �.H3{)i:E LkY Hu7Hr ZCIA3=[YSZX1Cjr Szr݄j  �_//-]}bA!-@�d8Pw%ƲnM6 ;x᯽&?KtLlKg?jĈsUh͝+^-+թI%܍� � �$[zw+乼;+gB ol2e;֕lb`ɾҥOƻ  � � � � � � @|dv QuU} />@�rGV7O~+u&͟/իq'snjE ,@Evښ۷E H'Ar6uAիWߞ  �q+bt sIߛ?tq-� @T*U&M͓ڶ%dTP{4uT Yu[߹رv~w_E#W>yP=x]*Pn__[z߉gz� � �@LMH/]N_v 'H[M\>L6LXѷ'3<ÇO@�@�@�@�@�@�@� XʕZ%!k/-\I@�8(WN.X`fs.\5JYS:8ѬZ'@ǎ=O?*ʸ{aCٯ4nTԧO-^XCUB4@ ,K#Dۿ]*Q"K �ěܟ8Qz]U+7/9D6];,駟+^,J/,mc=SNt=(V-yn�Ӥ phW[t-7: � � � ܸꫥ3$FA QyG.Լd4r΋{&L]/{e˖u� � � � � � � J/*URm&1.`c4@�<VMz!iJi\^=Bֺuy(N@> )"e>7DŽ"QC`| tor{K� W:uSOVz5髯# �%p>rkS-[ڋmx2e${l.Y0ȟFnA2'F=čwܑܛ4$ǥNqLcݺQnkO5sL]xIcCG@�@�@�hy FC^|1ͧW2X {\.--\(n٢Et%KWjn#� � � � � � �%` +WN>ћZ@} @N,@~@ĝAuT;ƍ9= #]&s-!`AnMnAԸGR͚L۶mSTzu~qzD�C_*_^J#9s VBS4@�<1ޓfϖZ;Jg o IjW/Ok=^xAz iSi֭ݻwӶpXFz n]{XIa}Wi aCO>v(,x≱Z� � �ā@/箺 u&!41M¹A?@a- RZv0sE]71pw`  � � � � � � @BXp TJBtN$@jҲeIY� @ F~I>\*ZTI:uki89@И(f[_,\XB:4aϾ8Q>}xb :r ( �I-`}GHO=%,XZҿO( � =gK'KI͚I7gxN.7}X듫6s.]瞓F7w߶.;̼H8w~?d%'M, =\ɾ/o3s~@�@�@ yZxu҆ ~` -�Q wtr)Y|%@O矺 k̘1n`㿑vf � � � � � � @\ |o~q dآ  �dM`・K.z/~I-[JeSJ۶e>B q^ԣG<FCԪ_>Hk]|z^zE �$/Hd9pƜ^zI;ᇥr咒N#� 5NliB_Ej*J@{5c:쳥_MNҥ=6駥W_V67#}*oQ�)I!`9å{*VƏI 5ٙiwPsAm۶8qbKa= @�@�@ C}F7FA -6,ƍҔ)~BWo^|�F%ە � � � � � � � H� I#` ,]/ �dOdIS'itoݥO> m-H|:X(P@zAS_`&];+ycٹ(+Tu|'!�$@H'KmHe4/Ε.L*V,  �y&`AM>yvjN.7lcQ0bԪՎG, +WTnvlVB C;LnrX{elhݻot颛oٍ?p»@�@�@�, K Hkl~7kVʎ乀-rb~&M_[o2~ *d;#� � � � � � �ĹK+y'h~ *%YRWA&ݥ � ` &oMZPKޓN9E:(SwƍSO'{B3׬ڵqDKȫO>.':t *Y܏� .FϿ=\o,H Q� @ _W_`#iR//͘!t9>(d4]wIO<]rɎS[pzH\&+[ #~> 𷀠t(Wf lrcZhA^#hh � � @-'Ku9#u/_:d,>Pj(kzSOiذaq@�@�@�@�@�@�@�XLZ5IPc .!�@JҽJ˗KIZIzuJ+Vs#9=9ǰ˗A5xxԴiڍ]^z^zZjiV@�ظQz%^=�1|lRѹs}I@�bZ裥y > KY#}7 Ny50Ee7/Y ~E|r.]%#k娋.+:3]5uTn:@�@�@ KZw->3UYj+;!|#]yd l’ `L`2i$uq#!ݺuo .@6u}RS@�@�@�@�@�8Xn]a84@�3'BLQ㗂� �#P裒͗3G__0@'$=wsXu̙TJXj Yg&MTb18>lRڗ] /nAvӮe۶mn.mu="o@ 1n&Nbʔ^*]Zzm>֖̐ '15@�?֕ߐQ  u| ;bun_ ZҢ޽}P/C.\wbZCY/咍Yƍ%v>Xv-%3L\޻ȵ2Tu6�çzꮻS\N� � �"P0_ImHr>{D~s#RrTr(aäK@FYO~8ݷW+Ƀ=W\իW~S@�@�@�@�@�x\V~ui׫H@�HD?@ Ĺ l\7E�@ l>iIO?-bkb#<SzY3ۖ[狌Y\$̡n_|[ۣzo߮O?%_,Mɺ[λu9) "qu2E~P;E.Xpq /6N4wXtᅒ׏Z]pv"� k8ˤ.{.qJr.Pftrr^5չ}4&x}҃JKW\ղ׏qnMRe/zzy=-zm"]{T4dқoJ\ByKV#GԬYTD ͛7OE$K2=#� � @ mG'L}O6y#`)-EJK˗K^*7){mUvKm|K4hР00-kbu4 @�@�@�@�\`ԩիWef<6s3@�@�dV=_IAZKIU �.`9GzE?[r;=T:<?ⷧaÆڶm[؉+*5j\ W_w ds |ԴԣAcdIG3ΐV (5hqٳg8V_Jsq/ 7 ^G)~\kWo9s|@%;4@�&[>[o7iOG)`kM 6j$g6+`]cun_ Z�H i;}t;hBٗgF$b=o_}Uj\*]Zj?Fk?-n[ox >={>r嗫TRY,Lo.R5 � �Ę@6CE6hR~ѯHOWіt2 R!㬵[ q77e˖.KK $j9҇S@�@�@�@�@�8Xzڵkܺxl^H� @ |Tޓ`];I `L-a{ � @ -٢M+{%?ʔ.o۸1ۖ3}ݚ>}0_q8gv)xi"i̘l1"` ?[8Q:g^JU^]~xgŽ @ ݺ56'$X%,0$@�b_5}sK^~}췙揀˽7I:yD^i@$0Z'?XݻwO)1wÒ;\,?~r/imo}{?weOyZ@HݩS0�Up=2׎aL?h@�@�A ?q/3`]wIn\ǥ,cI;KŊe~>@#F?Mx:_mڴ f4k,my.ku;Uj_{5R>";s'7RV-H˺oX.wSO/җswsZɻh̙.⬰]WEj*\m}x`6ce͚5z`*_g[NO>/^e6  � � � � mc<+VP ܂1h_�C�@�=Gr. }�-94�@��njb>ٵzI}n.Ӳ͛7n&-[6l-}GW]uʕ+z(67d{:ꨣCI?9_^{FߨQ#?z:j֬駟nM3fbaÆ*mͫ=ztJҙ7|SF҆ 66mTw^XWF wH\j/O}W'O,4wdv-i= H`(2}W5F�b[tϟ9[0+֐H[O<1O@�@ cmU%Χvm2>{SJi4x7NcFs24Zg4Zݛe˖0cNo-x=l3H\sR_C߱5'"̝b/7&ny ۆ9 㱥Je}X VC1oVCu><M� � �䂀˲߃D x|o HP G o 8 x ش)}gE/RjժM t_{+p.]Ŋ pn ?̙3'CU A4eJ ի?xv *Wڸ)h׮]X .@c`7ݾ}.2p mn2bJ֞ҥKW&*|=ܓg+ %KLo \@ Νԯ_?<Lه � � �Ě(F �'`ڝxkc?p8FxlzlG�~1+J�p_;g ^ﳮܦM\xaO=y|$U @KgABA>Ap%A0vllޜ<ij:+XdI8%l~͛ ma:`ێ=%Nظq~'9SN lNQJ \֨Q##I\2mwqߑlΦKtA!nJJ ֯_|7 6 x?~\l=C7ٿ|JZC=4|i+<Ӓc {?eJxcvn裃;`k/-B�@� a 7ŋ9WOk<ٍ7F֙zȑAh-xjyO>;5tv1?VY~l1F  p[YR_]c%XXxǝg Owϼ9 @�@�ȎerApAA1 <Ʌ l=7fs_uF;v3<3e 'L}}8m۶h"7�S(p1Rs} n 6pO|ݬ}7PBʱv)lp1uI&Eـ2jӤI-Z\F͛o( � � �ĪK X8 HCt/e8;dȐ8(i@ ,,S#dQ Y<rI>H+aOp ?EK@ $ٗ]-orW W^riӦ +UQvp܍H HKJ)Ped6g1ܱlٲa5kcn!_mA`@?+ɥ,Okݼ惂~-cA޽ۙ/Rgi..g?믛6rJ콷0Qv}aV{|H@�3Fu56y| � c\е ץK#ONw<tӦݛZܾ:+cn魵֘`Fk|wүw~z`##אŖϏw�]˟뵏T+V,'_lYd0f+o 7@�@�@�=(>xDUڲEzɘhsM*T\iJ}^ƍ@E:rʺKR+P@ IZ ݶw߅G!$RnCn3q#fz q͛7_m۶u}[YfX[+9En•܄Fu9nvevVFM^p-2gƍ;vƌҾ뮻.l BT � � � � �{ |qvLs<M k|7w؝8@�Q_~=6ȡ '\iV � KK_/͘~A?GY3COں5Mq%Fpgh}W_}KF6+1<F)ؼJ/i2g12-RKrʅ?VaNskذa)ۼJK/ۆMLgy6gt{ct{4~xviԾJƽK/%Y㬻n:j֔{,K~(]}uHާO}7*^rq on9yFjH: .Қ5RҊҒ%}Iի[91 �䡀&Q߾T4H:li<l�{8uhd-UNizkӚۗޘ`zk2&h :ZcZ|1`t9ow- 7t =5cӺ]C?+F]d]/oc'JW\]gc}`9)}z"~:S*׽jժw owyF@�@�@ >2]7+Scr< OnKnޞ$%+@vO? '2]KZ[A+69ʊːt\p"?˗/'G~>s]nb,V}p_[o؄ILX_r3ʔ)e0̋e g$J  � � � � MȘhNy:lg<6"o@�o>-//`~7#G7"� @|xfEҷJMAT~qhǎ;D/(%:uh2óRϫќȹӚSyᇻ7vA2g'M&붠C 7p0ivG:iFW^yVZ7 Co޼9x]k <kb/Xro-X Uw}={*ёn @ m_n#nݤ{N$63gJ]6yBΈ� � Ю4oo`S  X)SKn˖Mkn_nع֘;YY nm̯b-ci#5| 5h L53umw dY/rc6voI.P.d,M7%c2>uk?Q~}U\9yz]o=]u@�@�Q`,uھTbe(dG$7/OG2lKJe=Í?&M>!l`+$?{op+ʕ+wݴߵjI'ѣG?zK[Hp1+o-{'|vnDsK2m4ߕ-.eӦM駟vʟ � � � � @"㱑Z;&㱌FF�@ \.AW6I@ ܐ@�Sr|R> `YFEKW]%d M,Y2 wi;U8ޞ̩Js2g [>Lm۷oe˖X_X1ծ]{ǿGk~{jժs*w{~.G kqZ_}Uz xmQ-9 !=Mͭ_ڶc&\ -rJ^Y@�]}gAnd~Ms<ndi|颋$[me׵~j 9Y ʍ�>t!r |pUȕum([�{^u8٘w-.v-L>%rw;vde˖ cX=VI~7W@�@�@ b*K0tGPڜ6cmPq z~M4ZP=k,YæMԹsSO=5ؒ:MPfp{7x)Q;3gmҢKt]wu36-eΨXn-J*W^yř۷kܸqXw_5-XRo#@�@�@�@�@ 6,0xl@�%sÈLv-^gr �Ė@rmI_hz>(֭kwѢE8ͯo*mUjƜ]';'x"LvݢE ]s5anw+mef T6mdɒO3gΔcNezp?L?;^ |*7ٿwL\R?߻u&� |g>&vD� ۩9s=kD,bvõ4O>)s޲Q@�@�4ǯɵ n)N:#Ksg6&'�sJ-[`ZIkn_ f:2晓ݢuK.N8Qk8}t~_~{Z`|ȳXiƣ}sI-t[U_GǧkС[PW.0�d<7@�@�@  ZoYk/be'lcpJį ݖ6iDg},mqK=i$% q -ۅl5kmeNJ~.FqsWwnڵS~}׭[6U,�d I&.ڤC+VeH],A_w#6iъi.-M=1m^zիWط38C*Tpn� � � � �DI 2kY#wa<Á �Ĥ/`LF!U *GdVc?@�q#, )Z.{iA:v?)A!m~-}ꩧ$իW?`Vl^%ȶ/ht\|o/ʬYlN͙6r{lyW۶m;]UڱO?tORd eK͜ʝvæZNu DE?K/,aZbw+P{VwPga FgͥˏFƍ~U<YUZuOa � [n$ 9p`RtlJK{֙ˍ1AkfFs:+k,n5 2}3;57oGg~fo.|BrytaRÆ>}nxOd.rwX ]K4z0~®x0 � � �9pb<D/}sMA,}{ZT AA7ߨ~-\rn$M ܤĔ&A}8`СG>?p0cƌ 0 <܄p_; L6-p 1(RHx_J^x!圩otMS6mwXUV mvML :ꨰ>71p,*81>z뭁a ǹ  6m? � � �ĢF,6!�%po6kW\q㱌ǦpaQbT:5(Z4#xU5{+G@�%re<x|Wqݘ\LnJdeԬY36_%=F|Woh?]vi6wcǎ)smyh΢Djs- _|q?GN~JZ].Qw `l2lYn%\2Xh"lcFsdԾ*O?C!|<k#cC8X1JwYC/.\8QwshP`ݺ x )pk; MmH|es' � G[A &MX׽G ~[R7L2۷̙3wZWZܲ:cNo-x~< {mK|(g[z,wAAٻ>ͽ ±;%ky@�@�H_&.T,UHKCThL> +)}\6fRiРA\VksϹf@rAw; fu һ{*X"̒53},[-422qdVnVzڵ[]˟2|+jnF�@�@�@  xg@�4v~Zk_~EK.e<4/lD _"u ,Y"ը!}tqĚ�ٻ"nڂ>ZN{ǫF@�rKoѣQ.Pbn/_7%ҖKN6#ŻݗنYu͓믿TDNy/*Zhs1sھL;)n.t5CqGIw%y4|TL:裏=sy3:g(F�nyfϖN?|"*$ծ-}t9)ȭI}@�@�%;JI}JW];;W:|?Nkg</^:kxeC[7^ŋu 'v5Na~f4WN*ؘ[jդ֭6m|_sjڴ\pOL3V߼@�@�H- 6tGI5kn2M`D{E^`H^9{jҤzBA�@�@�@�`!\\&�2n �$\ZPYt,… ƻ}.-X9�zq 3wl<#mF� 5k1cK{-7lH.c^sĻK'}Tt&b+w 2ȲeTV-wӝwޙc@`wM$ 3}4c\]ũֱJ ܻ@�@ 6owOʗr`66ظ4rb-OVԾt#do?߸?8{wђ+U?Z�XN:vXR5h@wߔ>q@�@�@ b6M,[Wo?iʔy/0y�i1\ TF޶cҥ:Ӵe0m޶ v[~Ci! � � @ ?.9F�8lժU$xlRsr ~19;F 7n/ܶD>3}vxb@ ?,I=6坮' ,WTtR"Ѫ>nk*Uby: QԦԯ_0O1sBn1zj1m9)P͛7w|*T؆�,Y~p|iVR%~}[Q@�@�X5;J,|0Nc\ ge:B-+թ#:9Mu#%Cim6sR׮?3.ZjvM}ӛisAxZ%}y`O.F߾}];~0V|+w@�@�!32l}gH& !;ͭDH=zYk.aty9# � � � � dx1A ]@�B`bf̈́ @ 8Q@�@�^q[~K<IknH:#]k/V~pCŋK#Y|ࡔ XzӬRɒ9.rYßH- @ lpo- _$^=k|K| z� �-PhԫtM>}M|@˖-rJu]u4…h '{r" ܒ v]|{r<D?X!U޴n-ժ?$'O|@�@�@�(<颋/,YJc-g�SJg'%E##mZ � � � h&`"X^Bڍ�I&0jϒZ$E$�=Pw,r, zET "pqcs@�l"M8SO?͛W˪l٦jڴn,uTlȮ*?1%e J^O֮ڵER߾O;8+ k~.ΪU3ϔ,.[6; �ĻAK;n&~ Lu/zno t~ ,( *,8"GKmJ7(3{~#): xI٫@�@�@�Ȏ@<Wse[O6ܸ\6hiitɂA2"mE�@�@�@�@�@�@�O{TF' 's><qH@�@ g Vf 5y�mڴJ-V׸ |ƪX x`+0| R0SVhQgO饗+!0gi|@F @�4m>D8PR# ϖ,86!dlB�@�8D㏥Uz+@k#}2��@�IDATаaCw)[n{yGۣsj]`XNη,[k[>i&rcҪU2Ԁ� � � @TIVGi̺$dԼT_R ڊ� � � � � � �  &J{%)1C/@�@ ֭_IH_F]{?v9Ds9Ə_ 1'`:/YϫB~,-P �D_`w{AKj֔˯mji4}P޾}-~[@�oD]J_|!z_ܸ8P~@5g]pri^}5PNRuk|tMsgio^^x@:xɾ<XnZ-}Rݺy΃� � �  "Yťnݸd |x/m@>=7zG@�@�@�@�@�@�@�E࣏|@%3N<1HG@�@Ŋkw]`un+WFSާf͎RѢu=4hB/ã*$w\P�iٲlc<ʂkr҈Ґ!rAV}mۤ%K矗:vUJ5Fʖ{L0&_Ԡޱ?Z� �DKCW^fΔ֬;N]ڴ)Zgx(ׯ{<TkAFM n?<t4kNκll}*Uưzv=tiRC@�@�@�W .Aԧ \I.Dѣ%[P@�@�@�@�@�@�@�;λvk6 F S:u); � @%Ko/xU[fZx$+vTN={'!~ڴ{>g-FZ,]zi~s#�/v4nԭd8@QC6iJرO?I_}%FTT0.Va5 � g)-Z$-=TOZ#/\[w7/Sst!u4t藺:AFy$eK+T NG}J}iI`^� � � - m[3od(Z?YJ*?k<m2eB"p@�@�@�@�@�@�@� ,\H Rc,ԭ+}iS,6 � @")RPj VKtYw \F.�A:y[<["t>(P@z7}Twq3:t.LQ7O: .@�~]2EzE Rr>R R߾~ˆ ~_ Ynձ@�@?….]H#]yOb0y2D$p˞X~*\$ad2v_yǯAX]ի>}O:Jzq^~ִ�̮,#� � �@4ˬƃKIB;[9F1CzEϤK.a$Zԃ� � � � � � � ? xb"uH۶I씂� �@f55yrOGnnj rJJg`MOj֬qzM%{ٽ{><OdO<ے/- @ 4{ԯtRRɒ>0ѳu,7,M&YG[b:wW r*@�@ Aʔ k[s?'HF܅5kڵk_l{馛Lc{urwX<x)ґGJ?,dA5Qzy̗[@�@�@�bA AڇoSZ.hCZ6(r->I}anY}ڷg$-/!� � � � � � �ğ%,P@"d];ZGHpoe@�@ jW_ ~Ok׮W.#\ 27;JŋgЈ+` yN ٽ[-Yk Yq*A@�,~JjRҙgJ<"Ԧ eiAiү{@�@�/p>KjI_.^8"+@>?giwJL7Z U,w3j;ZO�&N~IzE…vJ*B�@�@�@  ZPƍ}A[4|x.*X`zG|{{ ʁ � � � # ~BL*`@� l }Ξ31;ok/[ ȹ�snH $@Ϟȑҗ_&Dl=>ƌu<>b >@�dؼyzj �-m*l)jTYgIn9%,̙[/-] Y\ ZvU[oI=zBV=!�q+`Il5ԁD-vmcA@( � �'`F[;> !_8s ̛7OԆ +iR&R>vA �ݵ�lj[AM8"� � � q@Ǐ5{O:X'Nٗ}{-utu-Υ � � � �%B @%|ysZkGA�-hR'` 1LOykջ~ޞGC@�U`֬4cF0HRv=cQN,)?Kx~Zk|cչ&siV.+RzN΀�Ģǂ?mfLVʗ/ � @ XA~]Z;k--?6.vI?q ]񼖻UߵԦTnw%܆,X>}Zƍ}@#$֑֭ƌsH\xlԈDA;k � � @ dž[&ߖnH4m `lʕҭ2mD�@�@�@�@�K`}…3oAv � @~|Tv~s"7@�3,{5ңJ)]}TTԷWZڐ)@W\!]y ;v̨l.=x>A 3>H-[$ 8ld`:u>HE )"u$M(<!d< �$FG_oED522.ҥհ?b]vٜ`nYϿפc3 #ݜ=[7CȈ/>h9H*vO<n -̫J͛r@�@�@�] .A>a_xk_I6j (�;}&xE�@�@�@�@�{K/,uFFZf  � k}' cО Xӂnfѭ@�@�h+'];~>ȑmz#U"qd3 PG&MjԐ-$b!No͚I ݣ;χ1i頃ޗ @< X?^;㎓WUKZi,騣w<jt=RH&h; � {%Y+{1cn"!Y"?2)Sukϧiս}i/] ~˂GX0H fhcY}`B!K>kFf:HeKxj~@�@�@�Op5ٷlYwoɲ~m'k_ݛ7K>3(D,/= � � � � �"`[Oڸ1٢֭ڜ[@�@ ,-԰UޯWA^tQ~!� @"V}EKo%=t~QĶ?%of9?P,j߾}6X/y[e-ѣwߕڷ/x�īp .m-k6W-s"� �$;K/׈,u(Ze II<޽I[:[Ij;#yDSG+$S*"ܳr87ɓgC ˒Z  � � � P p%^;j-6I $@Gn_-[$L4Tl+%&Q@�@�@�@�X61Q@�bS&*mݚvL6L>"�9bN9]=Zvzԩ_4sfգy|ꕡ] �DO/!-؞W/$B蝋x !==5kJeW|WK6hΏpLiAJ۶{^J@ kEF>Y0S � �gիͥ?Svíx�pA #=+XP|"YH"|d (?<59~9(Ŋ%͚1NE@�@�@ :],$St]ҽ&D!CE;rH@�@�@�@�h?ԁ�䮀_?sX2l' /*u"<#-+ <}מz+ R.>qMJ#Ѯ(A�@ c_~?ۢc, Ju@½{*`--9-O췟./ma=/wG{ƎӞzJq}B�bQ}eˤ>Xი-*U=ZH#&@�@�Xo)#-XAZ@H ܱXjYo]}O})H,YFӥJW >;͞WblOǂ?=l΅yOz� � � } Hx~ҝwJ~B)y4>\~iZ?v=?G�@�@�@�`!b]Oz�)`<-кu;&w^Կ �I]$-J(YR�]\}zR>%jM#Ѯ(A�@ ,},iג%i<< g]3{bvbBZR^g,#Rg+VƍVM}@�ش)퀏|_컻Jj|em9F%@�@�%`AA*TnUA{hzR[Df= goʔlI Hs($uTr~K}O^\ZTj*{mϙ6jこ&I6۰آs@�@�@�H@6Sd!,ۋ P/`&%\)]yT|@�@�@�@ XȟW#�Y~?_:[�DW6IB?N8!z}>g撔(ubhxUh �#>-N;W*XP: I*Zxg߶�R:%KZmvC$'H{lA�r[}G/ϪU-ZT\|`}u@�@ _JIÆIŋKW]%]{tQv \}⋙>ot*=h J'>8k^FIQʬl>ZGgݲE`[K]dV#� � � nRlK =p'{`_؏-9A jp>@�@�@�@�@ ڵ=2@�{cZ/`srlҼy?#@�@�xREviLi:iPC9/F:u=QqL{IŊI1u@_zK|K$GZłCX!rKZ +ǤSOJի'Y9s,0˘1~ ɦM}5{/V%dt � �dGbVViH裥FN7ow:uc@ENS҆ o<`Ɵ"֕{.@oI I6ti+4y x`dz@�@�@�\DA 򡇤ŋW<?Rg>CNŊn΀� � � � � @ZґGp W\on!� �&0t/ڈ6r"pi>8DNX@�@ J _}5Kj/<l-[`C~~Q`:Y!3}9[x-zI_~)b|yi`; 5^K_xAysZ5j4mYDz,)ڵH H/,}r_ B�@�@ w,x\JzMiv޷BSbW8]Ν%@ܵ[JO?{r魷#߾1';=l'w;d(o-]~زٻҴiҵVp � � �'P p%g->Hk='^싋I6YyqB}IQ܏� � � �ď@~IVfZ�$Q[XKZd ( @n ~17u$/=Xb3Qz}ί{I'TL닥x|ՠ- �ć-Z0A8Q>]E'$5i,Ȩ "uEŊetDgcK66m$ oe<?;KC㭧R6Zٴ~6n-w_R%d@Z@*Uo� w`NT?Ҥ.]ޤKD TPDgW@?vEQtT*{ctƻ̆lM$}Lِ9sHH֭"_JҁHs1hsA 8P2^/[6W ͖\>"ni )bH4ӯHZfs [}ds! / Ԯ-ҡ+iNN$@$@$@$@$@$@$Q߽[N0|yRPD/4k&}&#EO ]3 :c!       h#@Gh @4PnUdz:% ``e$Μ ڶyF}ٳڵKy{NjB$@$@GYٳ]!Mٷ8ys&MDϽYbD{Ԯ]Ɖ-~dl|~}3|Ŋ"+WFϝs]={\}Zyuk׵w?Ib�lĽn"rGڴ"ŋ_ 2F31 � � � ,^,R˷K:99#",g`& $l(}$3!ūW]G�H$"ժj!<q-e2c45]۷)TF$@$@$@$@$@$@$TQ�DOi4H"xqenc|W�~s Q#1D$@$@$@$@$@$@$@Dt59 X $Okֈ/Œ9G pp_OI`\FD)X02k}`xժ"u뺜Ӣ3ZQ� � @@©SE~ y-@qq""i NO=eA44pA˜Y#<kƍm/xKw˖"r#$%G^~<vE-*RZ+#c? � � � � gН}ȏ?׫'ҵL'N|.#7m'Et=7p%?q|`|a$VL"x;HHHHHHHC *ADN"zzwU9qاDUDSO(ŋuG.]R/(1΍O^2K<yt͝;˗Oe(&/2~ sȵd+�l� Q � � � � � � � D;:GHRJ,9| {'<W("Qj*lSݸZh񄲿W7x [~ZM;b 28 $ߋy]9+6w+Ib!p|$!],09N � � DWWPH,)^\reӌۤqc~p9{:۠>M=wA {}c42|x9r$[ҥ[`SֱvTR/[7.]:Zp؉ݗ3fL2W?kH&+c?)r"[qv\/ @@]DowmۮcӮ sr-У=cѢ wgF$@$@$@$*[̰a"'۶uD _XBG�vMaOG&M*-tҹ^}G}"4v}miA>ؗgk.d>}5vIǎUK:.HFhlNFiHVW*HtaHHHHHHH 6ɓU ˎ;dҥJL6n([lm ;Ed˖M1GZc*XGm#GRk < R*"jeتV/_^;~T.$B4L"k׺ j �$D,$@$@$@$@$@$@$@$+ ;V}X1I$ BԩSrRagĺ'3g;ܚmn)=Ȣ]hĎ-Q^S_uBL bMObNlsNil[ 4K:GeɒE׬YƯmx'XBB$~k@$@H}lODUUuӦZᄫ1� � @@ŋEN8Q~YUlB( eKk+lDP?`F&muc {2lv=N]i?ER ; {q þFc@fs%g.SP}QYqҠ& .SuVvaٳ'XϩE"$ @d8zTDq|u_�.Q:>tȘ/GI$@$@$@$@N�9Fr`+r{cGQDV~"]nlA$¦dfi>Bo0m*Uz4b&bbD]1ط=0/"Fv]Y?y95wV)uHܵFi {*BӘX0A\v$)U|ҥkIHHHHHHC jAwm'TKVU `Ĺ[\r*FI˛<y$+c :ǕEpuV]d&W\)0hATbEiذDԩGs9<#06-זU "͚]5       t䏕+y@dX38l*jnl!C-lў !sm ѠAѦ*۴2KJfm`k^ʈPݗF�'h$RO-HPeu8ʕ+>,$@!ߋVH (YN6ȝ/sɟ_O;ӦZᄫ1� � @lMQ SEr^;8 Տ9Çˑ#G먰U [5w/@f sc6Kl36hmn6 wVT FٷOQ.vxڴ|*0Um T7>ldN{؁a-zvSsέ'ՏrB$*މ i^邯…]MGڇHHHHHa֭1Bd]AMPHbGKABy>ѮI4D}ғ\W=n >%N]JrbCB<5HuvmdFhFhΙXML`kZ\*B7Y@#P' 'P       *$ "gϖcʴiӴh){|ҨQWTVM9V iT8nR*]bw֬Yyf`1kN^-yl-;@0B`,$@$@$@$@$@$@$@$Ws&@&h&D{!]<k_7δ8"<ѣ==كu`,,$�a&v=kq.53qΛ7vҬ`oI"fo$ A[ԫQ#fs}sR"pCRh)?Jr$@$@$uw4Vȸq'A@ݻw^>5KYh/E# .hBh,#�1 uO0:Np`RP!]M7ݤ� \lk׵`&縎ó3E^Tf*XK$@$@$@$@$y\ѕ}VgD>hW "4g">Q4D,MX4iX۵X=aA|y5eOU*.U[[S 74iI7e: CgQ"tԱ:HHHHHH"@TDšC->"b&MJ*:ۈŞ={t@ɓ'c7n,=m֧D^}5FHb!       #@G0 �66]D Z =XJ™3&xp5њ<8dgw_ G^@ϟ_;cji@BGcs$R~+䓮�tO)Н]df[+IHH  ,ҫ(;UrmSP ޥ@ڃfɒED @Sa 4 cDe☤qwѰ]*M%_+ɦ 'B)RDע*]%xz@,$mݪD=أY_DAGTݵ/՟Om8     w*ƢN8f+J"mڈn-?~Fp>îO?1<ChHa4Kڄ{ݢK.連(fmv"ֱʕ+(}g4f I^uܳHB$@$@$@$@$@$@$@Dv1ʺ6p@Yd+WNxСzGH!GB]){衍Kr32ȋ/zϭ$@$@$@$@$@$@$@$D}h%F$sN٥<+?ڳc#Pe!FC<a?l sSB�߸# Xjb 0D@Xv`%޹P lhqm{1ڮ(C'#"۷[b#1BE=+EORR? � � o 0i*|"EE "i]ӥ;'Y\ҥImy.\XfͪcuO։vhwxaX߮fa7B8)Y|tzX;E㮊ueJUPS}dܹrd$@$@$@$@$@'H17xPRAU+ E,eN Dn_b=oZ8t}"Fh_>Dz@8 tZEY4K}nˢE � � � � � � @@*1tPywȑ#r?.~{_;8V~1?@u&z|@cbl\̙=Ǒ� � � � � � � @t#t\G΂RBRgqͲegGSϞ=G6bC;ˌ AMFb)8%W: -!* lp6/k%¥JOq\@Hb/ vOu}.3E7utd׉$  H'pyYn pU9GTZv|Qi^{L gVr뭅T0R;f`H1~܇;vu۶my0T} ޑ)S&VPAʖ-W1znO %apGKzq-Pqpu@G}T1St]s<$@$@$@$@$@$T˗L誫VJ!Ҭ+0d.mnݪ ]"ʕ+[$FG$0D,6s9 DݵEBb&jXB      F!{۷�ٽ{wyWtfh0v`={JŊU!3L gl؛#((1k '       vt+5+ϯ 6rӦM:#ĕiYŒH,!L.ݵF$ Nw 6eXUt, \dIL|u86pR9Lrq9>12ۮkcGh #y"  Hcdٲe\RVHHTEӧW[F8S >{Z+ NZpVXQ*U$UV5gΜ{xu@H0צط*W[@h>b%˵F$@$@$@$@$@$� ʈٙsA՝֓Ç6DS-lB$qeعsgIhb*fUYa{e!      H% .\(='*@DS/߫.TDeT f?� � � � � � � @#]s8 f`Wu͚5^xAyAu-%_pL2W\3$:2qÁdG�V8#=MV-[V*T_)!N7^͈G� \#/"mۊ 0Al׶s}k}"p#\/ � � DCEŋeҥ>V*W/_^Pat\X?x+V={hVVMj֬)j!t+wȕ+";/& x5&s@GE/nrwz׎ � � � � � �tKCu9=|)?JJ6=m='"�$,$@'�-"lQ)͛&D^QT*"bLfkIHHHHHOс p;H~J*W_e18E8y_T֘RN>3}3s͑� � � � � � � БC 8V\hH 7jV&%VrtEV_!],$@#�w-E]Vm&pFVn{Uꊿ_:rWs'x3D$O<#}X#F<ɓ"3p#' � � D.'Nȼy?6˗/5jԐիk{@29Q^g7G6xd?U:APJ^z~={v G,cx4AstxD=];k$@$@$@$@$@$.] DMD~nP/C4DL&XHC�Y4IZE}_xQҥK'ChjŊd      p<;wB{O}Ym@sPق;u$p9r4h C`$@$@$@$@$@$@$@$11%$vU[h !.\X4 AC^.YH"�mlذA <X>}Zʨk֬)(P r&ǑF,^Kǁ@XԪ%7a鞝�S�é* ڤ"l`. � � uǙ3g j M`[J^G۳ " 8}aw,X 6`${&!3d7+WD!K3sfQo]?ȍ7^;k$@$@$@$@$@$${ϬHdΝ,YV6lٲ 礋DZ@2&�Hb _!<"X"+Y'4O!     GDƅMjѣ_f :uJw.&L/Rz3IHHHHHHH 8lA�Yx/ `pիWd͙3g d$@$`Yl߾].]*K,uZh]HWԯ__/K*pHN# r$:*d&2l䍡=�7k';#2GM$@$@$k.2esΕ+*rZjդQF֮]['6 6 Dg ͙3GW؁ӤI# 6-[ ;p(ʞ= ApҾnx䈨$lƘ58&VMGHHHHH"�HQ7o'boU{aDLH1W%8z@_kHb"C2Iy       8.$2hB5eҤIlb~o!޽{9U       �ģH T֮]+3f̐3gj |Rn]S^f/Pf?${ղ`?^ݻW (&Mȝw)7<yDL9|'E'\"]. )&BF_^D-;mE&HHHn*cǎqʕ+`ҬY3]aʊhi,$@)"pJE+={L>]WTo^:t %KLQ'"WR~?9 )=#c~J%;H޼�*[3f4gqI$@$@$@$@$@M`ǎ2k,MDBcǎI =MDz*<4� �lTHf "75kzEh@6uԶJ$@$@$@$@$@$@%@@yOxԨQ>}6Z<x<ҷo_]lz � � � � � � � �S'@ \Y?=��@�IDATxQ 8qL<Y8 ʕFZ~}ɖ-[a$@O�bm8;eܹrHyVREZj%[+F?0({1(X( D%Q2*'}/r5퇲E;HHHY�ZaÆ ˤL2rJ6mYhH ,_\jY&L ׯUJ׮]9s&{'N "Ǯ@͏΢r ѣ"ƂF9!h_%*0sF$@$@$@$@$@H&M)SȖ-[tdž H:B$@I%p9:ETľȜ9u]rwAٳgOj<HHHHHHpL ݻwK5B 2uTI&ׁsAt0Q:wL,$@$@$@$@$@$@$@$@#?o=K.ɯg!D;S7oOyB$@)$j*6m-B @DSNRRc�/\I eT,s)\XS~; O? C"Pf_$@$@$  ./B˟?)A[lYg $n:1b9R'CP֧zJj׮7 D>LDtՔop| #8#+;}XDZW^;mZW<yDLk4uz6B$@$@$@$@$@L�g͚%GɩUDRf͚ZXXù� ӧwӵ>R^=tb$4 Ґ, � � � � � @pD HܪW͛7Od(7W^yE>S8J*{&       #.VX!"˴{vB$@"pLyN8Q!I .K(!<tUrnn( 3H\"?|P>(XDi}\!4 gB$@$@&`YիuңG; `!pΞ=[mPکߪ:\9|Ȝ9`/{"{އΉ=깚 ;J%#+#LӦfi=f.'p � � � � � �2DkZωHPۃ� @,_\Ə۶m|=ҲeKI&Mzd$@$@$@$@$@$@@ z-%K J,]ec$@$@$@$@$@$@$@Jz8H! Ȯgɚ5kך6m*Sip$@QDĉ2j(6l~ԦMyZjQ4KN%{14 D/RQ})^<z3}pŢ[D6m NjGH  ɓ'@r{y)P@ĞI"~ A! *$zwsϞe#;D;zu]GkH…#YΜ"r*982'     H.MuRXҥu]ɥHM�I.#FM# SO=%y`Hb!      ${ 6HJt HXG`֭RbEݻ%E$@$@$@$@$@$@$@Cs-9g}A'|Rg͑#ѐ� 4EZ,ԩ#oԭ[7pp (b`ݻ-ANf4i(\88}U>HHH <l"?,\P{9y%[l {%H6SNɀO>ʕH_Ș1yQo6{vyv4[<HHHHHEҥK_ˇ~(RҶV61P @02L4Iv:p-= � � � � � � C ?}-"O?t0K,)/v>ydϗ$        =SJrв}vy饗( IgΜ~A:v(!m?̒8}W_}%-ZďLޞ{jAt˖-wM^#~ ;<#t/_^*{쑪UJӦMm۶k訰'  7s&!&Ӌ̞HHH"u8AUp Բ,1cB_ϑP?G؏9"|.`N)5h).G%ֽ%~'gϊ {R"6̛'Ϣ;/H"%JHJ<HHHHHH Ǝg >@m8m"-ZT]1礴g|ؚ^}UX<x0);P8mxP 1>3+8NZڴi#sΕEɡCT2, Y,$@$@$@$@$@$@$@XAڵK&L c$Qcbh!T{gUfӫwclHHHHHHHHH F :uJv*wK6n(>I&Fnځ#'ӧOŋeby;waÆɦMi,X!+N6MΟ?>|X,X@`NN_~~f\t-3d *TiA$@$._%g Ԝb2 $AB,$@$@$@$.]~X^{5eܸq?/v@ Zݻwk- m=1sM_'9w^Xf\Rk nKN(�MVnR<ɓTK*^ǎrHHHHHH_:!t]VXir{!(e,]X(Tfb]O19s='܂?:ۡ +UΚ5K!3 � � � � � � x!C�9r̙S�& ;f7 蠳fͪ ?C@ec$@$@$@$@$@$@$@$@$@K�΢jՒ-[ufݴi.<vظ ( >δniuEg7y[zmڈ}5jԐGy$hSR<C` ߯5k <p|1cLݻw;@� � 8%"Ή4h1q$$$M̜)*Fű� � � *@;u$5.Q?۵kvIr nli+1拉ͽt;iz,xa(1ncӭ[+Y%Ȫ~{{Y|HfDqf*V' � � � � �  yAժUЇ԰g8ٖ3@=z9oQu릞oy߁0%` iKxV}BˤIt"s$5GE9rH۶mpΪVҳgOiҤ 4(D=      H$VEǴiӤe˖ d;w"#2@l+b 9pÉrx$@$@$@$@$@$@$@$@$@N'VXQG .!GmGNۓ 6Di[\D&DNkq5KNJA+W86GwBu �d~ᇓ0kJ$@$~]DƖ%cq3 &p]"G,[XA$@$@$@&oomٰ]9mFߔdNi>ߓ=$k֬}F!O=%2e"(ٿ(_{uvȱc7MHHHHHM^zҾ}{-w1ߛn)?,9':pudK.cO2cN8!lٲItt]xJq 17\_|Q٭?/_~)s � � � � � @ [FdwXt<#E4~W`駟_|!k׮CJBȑ#gʕ+%K,,wAo0a7Ng(^jJ6m ￯BW`D+͛7Kq3g1|pI>TPAeDn6Կ߿_zꥷqdYNc֭S%        q<-ZT9ӦM4V ,?̜9S) }6\LЗwp,ð#7|#"܃>$F{%K)"~l۶M6lюpB矵 c@`PT۸ w}'3f~mɛ7yaȔn3`u̘1=zܹS'z嗃… Zh Iî=rI-=w O<Y3xw$_|IQ/G3UwY`<?zxѱc`,X@{  V^ 4S壏>i׮q ڌ%J$+Q 2DwHHR@� 4HA<@r" ҽDd9=   GزeۏKbvS3V_goaA3cA2*j7lOf͚i O[c& gaÆS>$o>=QFi|~\r%p6?{ֽeӕۄv޵xcbvUu*U]K/$.]֭q@?;eԩSeĈO?{?a�7CJ*/\C'4H:u$=*UJ[DIu}MW`H/Ru?:i � � � � � 6<s=ҢE 7n ?z2hw3?4ІuAkT/^=zhM/;' #Ɓfpog1+VKMfL\MXF sL.䍱7{7[YJlLm&m 4eʔ[nlrqZ#oBB$@$@$@$@$@$@ (GX Yj zXJȡDJtb)GGY9eZXf)_[jРާA19rXJd)- )12UP QTHKF,et֭[g)#:zٳ-吩QK9ZRK9JcsO-, � � � � � � � D$e"Ǝȡs$vL>#x>ӖJڣTX1TFq9SLچyzEZ9J`f+WNۄ,RoSBٳu،=ّqMЏr�z',R(yU@6nkl?6%Vlʖ-k@ f?k͚56}ajzTr%P~1|VF,8k%صpmDYqY vmZk֟[lq`<zJtW_} i)^}Z ڰa~'V|>cg%"?+Jly睖'A`xaF9�P//# h%~nY3Z֐!:ؙ{OuNy.&  xWoّv_vSPqeF*q%Kkʔ)ֹs笷zK2⭟t+V4{]XzuݧJ,*ȁm|e+gΜmӰrXrhM6?s?K_vtӭj ƌ矺k_cLί`Z*n_mA^ׯo 0R , RA!qhJb'w|T" lw� � � � � � @�ǏG̠U/ó믿L% ylR1&k8P%mݻWeXв͚5Kk їA1*!_:?m7fb@}NJ sM.c_le1'Om\"n2zH;K$@$@$@$@$@$\rJmlڼys@>R^K/۴icu-EϯRYa$6̛7ςs)ժUB$boQ4pLɒ%GcC0KBt Cdѕ1$}I$@$@$@$@$@$@$@@@_'.XD7T|yM ^ L[n#3gt;p E&P|^VG ڇs-[3%f#wqǟNJ-N͈!8f˖|h7!\먈2&H^"'_裏w�Hbeʜ9s 7Qx 8MRL H$2eĉm{^L�SL $X8~4 ЪPB>G\ǩSڛOz\tfe˖$͛Gߋs998OC?'7CL>f~[ɓ'XYK$@$@%d'vЎ 8 =zTa�ػaՏ ,{6mZB{ [efN dYn۴%l@g?7ul&]wݥcРAz?cLo=:tHO ܹs~�& ݻ~7ۜ}|� � � � � � D]&DȧMɠI9W\ق;59$nҤ֚FGvӓ0Ps7OMʛnV,_3ݻN>tPשHHHHHHG 2EUQ#=ERJ%x (JRWA"D .2H_-p&*}RRlTF2du։:#J4#?(GAA[((gMQNzתUޞ9K          e=nU"Co/AQΥ>2e`!K馛Xb(STfn5ju8UVRJQPm 8c>{[f[0*YQ|ʕٳgk;},Y{}V*To:eڵ6F^Ș1cD%\STk}aGnʢn_ ZE@*~?+{oax*~^2aQhQR`ASc^5ҦM+> ˇ~(۶mRHHHzfv>n!FI:fڶk$@$@$@$@ $f7Q4ξlð-:uJ6l)l˗M6ews|>V֭+JƤmE,*S`Wܾ/]{CÎu}vݻJ%tE +W_akV ~n~B%hUϞ=5XHHHHHHH ?cz'|RTk$k zHTr`Q0S?SG現 }웱L06<ov!K4n8mk1F      t.If={vݫBލpFe#owz]eKꪲ=*aOǎäf![8R?> ؍2ʀ^z9sf;~b`))]Ҷx> � � � � � � � � @ls~}2pD-ɓz/lG{i@/_>TR2qۑӥKymif͚]w7N ҆4i\ VOc~֋/7?9PδרQC4>29~}N:#G; |pQ0&رc:?Ybc=f 2D'1b<ɺ}E`h"q � � @Pƍݷ3 ;#~&   @狻2t#HZOv=z8 ;>hlcl)y>:UVI˖-͐\L?IhQ s.k泧eR50}_$j޼ 19m4A;=+ozƝM6I֬YoذA/zj.7}|� � � � � � D'NDΠ0RgzzwӣG =`;ѣn595\lNplZl$6nTHT쯾_{I{9.dΆ19~N0lLۦHYN<YB$@$@$@$@$@$@PB:�ƍ3fm_׵}99tΆ  h 3fHo7B iW3gά cFRX8B8UdIoq � � � � � � � � � x%tM4^z˗딝W\Ύc1b ׽>5kj'N:|]tf9v;O?=!{r"ymymipJmݻW </@ɛ7}sֳdɢrέj/1!; D/^v:ӧe@]vXـ{飏>7x#>Vy� � &pꔨ  k y3� � � #<i/۰.X O''aGΝuBvo4f|% ]%84P.k:Ǧm2cDG?_/=Nʍ7(ժUw{ݺ#lpw/;vpϸ ,$@$@$@$@$@$@C�z9$<xꩧ"g))C>x4iڰa6v'F[?uFoKvdB9Wer ϛ]~ cl5/s`ؘ͛'mۚ.#j/ԩSo߾5nHHHHHH 4J!4wK%$s2n8YbE|wpe݂ 0�tQV^-*U]?8 k@:Gzٳg&l2uI".|W3y8 � � � � � � � � � $$?Ν;ՈO켞F(-ZHS޶adF@: %^(pꄝvlؤQ`Umܾ~O-7馛|Hw(GP2dߟ`g>~D'QӘvڂ[xGqy42^~ikLV$o۶M7o.st=±� � �~"'VÆA͒@PS*@Q61NHHH b+D(DRG6\B=3g&:FO? NN8y#́_~Fk.c&$.{y]'kp^HСCҦMѣ$/(?x c+{Xp^Z .#<*3a$@$@$@$@$@${2A?G; I0^zI5k&YfSN~q:$Na0=iit~?6|u9طӗ/lxB;cl5/s=C0lLH d$O5k �'| 7      0ݔ)S+Ady}:WFׯ/o~RX1/R<e˖Yi@Zg\d=q>v: &/_3ϲf4ӦM8BcWʕ%j� � � � � � � � � ()D2U*GFdϞ=&7;<i "2c#^n⅕H(r)?v&P+cƌ pQԩSG/aFۑw:2Q,Y"'Np56g Oa8n/ؖi>I3g9sdOpl} %1~r$ƍW_Yױ?vXM>}:p@Ax}l IU\  F= -O /_>ҥ\|Y~a9K$BIܓi OĠ`wߥ5N$@$ߧz.9sF 9/,UEOM llHHHB୷ޒ  eӦMI95{Y3/0l}#Y [nÇŋܹsGiݳ/-ubBp>[�}\p'wީASJp,lhHl_6ws}$Zo!UTci;33u8ƞ@Yd ;:B$@$@$@$@$@$yJ.B֪Ua'3vRdb;_;z>>}H&Mz={ꀚؚL1&AGfbzn  =7Ķu|ٽbK.93}k^<>ic½{`0`lRh|I#     `sNK P,e4Hu}YiӦKKeK,~o)NIR"KGyR#k1BTKeɵGW`Awޱ>3Ye}+a=ik:|nŋ8RNdE,ea%%\        bS$H N<i=CV̙O?ԂՉŗ6]eaU,R ,%Ӂٛ?Tb!l/#Cz[l,h/4[l,]]we=s~=ّ'Ol͛WZlUhQ+C VmܦoUBFszY*uT#K9p.)\Ӽ<m믿y /nժUʙ35h oCN>,lΝR٨(YKY/PTfkX N-%k *pձcG}N �Rk8ZʉRNr*?+p/* [;w x}k/xwܲh">?0wo߾m.$8p@s7|>ى ۗ8B ҥ-5; ~&o � � @ صkWVAxvnK6W\%tMUTѺb|99dT�K%0TosQA<ڟшr·ʗ/o7<xUZ5mnvRon ^6cuö 2쥙2eҺr'?}i͐a~TFs^dGV۶mY{ .ӿ +R9$h; <7B$@$@$@$@$@$Tb`{ra 2D?;qF*~dz2|aH Ћy*k*xz<<C716e#}/&xbde؛=&meЧ $q"oK52HHHHHH tn@W7lK6o,+W I3gL%J$ĕLҧO"I\̮%2 s2(oCi?趂,J`#Jt۝dP-Qj'� � � � � � � @cEeύq$~SN^._,*@t~?:_v^d$A7 .x;!`#VGQFٷo(ubOvdG͘1m sl>O M9 )z{O9] UczlذAoQCE9 གྷ]C8R֮]+*g%jYȱ72_~‡~(WÇ7G:{dFxpU0F-N,Q( &wH"3g4n(fͥ0e9tH&4}6HHHy(_7o.*ϟy048_۰Jȣ횰\ד~;8?.ٳg w.޽{zf+ۅԓ 4PeM=cDv;={V;͟]o۶Ms ؛]n駟J>y'=$O$@$@$@$@$@$@cW^wCs6=8)z_K˛=&):?mZM:C3@մm/^c؟yyƤhm2e!vهxo̘1C۲zt?1$@$@$@$@$@$@&@pTd<3ΦmݺU*V(}NC#       #H0$�gBy[T6k'9Ab1 Uqί7k5k泩^xAy`1_}uTo~ 8w\d_~?v` 1qDe?_oʚ5k>m\ԩul+{1V4II#0l`"ʏ@%Lڹ<ڙ}b�C<`h D/?Am� � 3 lٲEqYp<s/$ϙ ߨvTml|)O>ڵk *U*r&� � � � � � M�k5UTڶ)D'm# t=pWߑfËk�&MI/^,]t,TK$@$@$@$@$@$@$ 7[oU^{5][h!%K "8[?#Z'L         4iҨ8{2zhho߾Һuk-^jڴc3q;vLcٷo_Af˖ͯd= |V c_+OwU&?V2dmw=-@絣w^xQ.| @0yg=j(۴i#ͻncHHbY3dyr d"Rԩ2y$@$@$@'@q3g)ңGA 8ahu%v0߯A}7iVZ9v � � � � � @ KN~i�?\MDhV뮻$mڴ)([ė/=pWߑfËkzj>|NVkcƌ >}$@$@$@$@$@$@KKpYZW,PMW^O?Tg-R@       f7 2vH<K΍A`Ŋ2x`B{Gڵk'5 wAnݺiՕ+WvTF!eq_U{9ٸq hbǎߧ8. ׯ"֨QC~gɟ?2[siO8Q~'"w(QB~a]ssD"ߋ 8�TqaTpo I!~ߧ`NWy-#GD= &0#5 � � �ld&Lw}WF yw AB$[={ #*TW_}U^: q$@$@$@$@$@$zV!ChmիWu�<'y睂$,#@_سX|?^ۛmۦ�kL$@$@$@$@$@$ ޽[ԩSU4hn?JΝ<� � � � � � � @#_cyQFɔ)S$uZԼysi֬͛7l>yd!4|pႠK\\#דAٳ)SdS 6m-B Iʕ+;oc c/ Fa#vH"%RZ؆Lꥹ[EJ3GaC/:h] HHBD`…_hG]$Lԩߖ-[6D#`7$@֭[y9R8?>SRvmCHHHHHH F 4Ď=Z'VKD-VX ߴ {:O=ӧOJz69sn0HHHHHH j 8&$/]T4h M4юt~ <X۷� � � � � � � � \#@Gk,F pE={L4I&Oʕ+'wq`B-[p }� D;v`BswܹsСCRJiժnZ*Va3pBr%8pO?_T3.$e}2~I=G G$\%HHCرcZ<l0Yl)SF;iF۞+[%0/_.?ʺ~zZtU'% � � � � � ' 9o<KD-[HUZ? x:HH+sɂ :ETľȜ94mTx6{^N      H*G/^,-Zdօp\\\ROx _zs$IHHHHHHH )ȟZ<O`ڵ2c ]!D6 *H:unݺzYp=� 8?#Wb޽{8Niܸɓ"�/Fu(I TA2dPʾM&_9RD#".I$@$@A'uV;v7NV\) 85k֠@8}̚5KO}RJҾ}{С,Y2p~$@$@$@$@$@$@A"$x9sN6  mbڵ>멘 0HW͒@jѢEZpBYbܠ^"׬YS%@l÷vN:r'ɑ� � � � � � 8Aغutf b:çIhNݻ_~3D=       ,t䏬˗/_%�/LU^]*UHΜ9c gK1D,پ}ΚdA]| v"E^z֯__J*Cd8PPf?$OTɑCd�Q#c}@~I"V Ve$@$@$v%SLuܹrV4jHWȘ1cN&̙ҥK%M4ҰaCiٲ� � � � � � @ @uh2g,#"%J?"p.Gj}"˦߿_2e$jՒo]WD       G>,;wƶ{O}٘7-^X:u$.\#GJ Bu       8t䏸K0Wj%lnܸQnJ*Iʕ$RX©G(ذa JV\3gc pZ΢ %j"tv$HZ+ {XnC>tѓ򭓂Ez'}'7ɡsHHH v?^*��@�IDAT 9s^ZRNu֕:uh[VA�b!'xdz`??*@|iҤp}(> � � � � � ={?Ϯ&Qm,Ys+x-[ aK �MjYFkSnq޽*U*[Trڶer7@ݳ      H2L;H~tJ/<?ĉkf'OO$@$@$@$@$@$@$@%@Ge$lgΜe˖ *ė6m+Whe2e [oUWHH |q͂`ׯkjAmK+V #*pg!PPg$l*2n+G%�J,)t#|: � � DǏ�wHp | ]PW+]Hl+Wh>C==͒%KtE ȴiTL͑#Gy\!      ' ZDhMErߠ^-ZT6:ҥKk}S֬Y0|H_B"T[Nŋ.]:-R+b bLȐHHHHHHEс )<xKg}ǤO>R@;j.]oV?cԩSΗ#       @PZ,;V}@ʶHI�, DE^C^ 27߬EX*UJJ,t cF�v-[lљ8ʝ;wD_p`ٲe|RB]!`@p8pE>9cHCᘔVOi\dBrfzHHu"ŋ R {׮]z !X *eLMw@1`UV�{c_"EHjդf͚b=}3$     J!g`M&ܹszA!hO,^.F%NL�ZEآn_M۷H _X1bj4i<vO$@$@$@$@$@$@ DD HLò;81cp IEe(QdȔS)Iӭ[ʭ4RJ$2f QRRJpRf[c;<^ey{{g=9 &hĈVe@H �9~x=ڻw GyD H@�@�@�@�WD(_ZC/UktilƗ޲lٲȿ#FIHZСCںukl&-meWmիWwgF#ʤ9"^ ?#L Vg7>=Sv '_Svnf⤇� @ ĸ!W^uֹ󬓲Գ�yժU;o9r?% ZԞĝ=0֮][W\q;.\8hD@�@�@�Hnx/@6hOܵk [t6^E[w͵} 8p;�{EuDަAX-UZ"oV@�@�@�@547n$q߾}Сk;$d6"믿*-zȭ Bq@�@�@�@ @N*M&u ,\:n߾mti/�v 9rͣ5,Q, ʕs]tlƘK@: XߜW6H|,mñ+VmlTmT۠P-Z48V5~/;F~8 Sr;2.>޹@G&\)C�@�w4f`ٲes뤭:1lupVW ;w$Ϲvn۶}VbI칉E{bK97-kժ5jpr!� � � G Oɓ6A')S&}mgLC*khmu-xU:RN  � � �(r 7Fo:u^yZJ5kTϞ=eh޼yz`d5p@@ʛH>@�@�@�@ (= !S޽{Nқ[#CcZ0H YT),Yҝmųc_%٣ݻwF?XDMOzAP-l\bX4 8Oʉ>He89Hcu2ݻm*.<$'U(q  �d~hӦMK z*UߩǻX^5.,p@3*\7SׁޞsxVOlGm*P@lzDUV>8s� � � 6˞=тBZD]֭}˄@ 3Ҧ[E͢?Z7YZޠ^{Π8yg� � � @l Hw믿ָq4k,߿_u7߬f͚.ub *>#7�… ToK&TӻE^@�@�@�@ TF xqZ�{'Nʹu-T;׳mE9o.DDə3g /`Is})::mLiKMu, `js5_Hb$۔짜3MO<!~{DZ't{gy?^>}%A�@�@{P3fDifUh߾/ }�6(7˗|:?`/!$`A!칄׉[zx>ٛü?N*URŊeCY"� � � @ljm}o>�lohYv'Z[DnKB?~\kOɓ%vvymUzu6! � � � @YiӦinumҤ7@dڵ3u4ӧO~7Zr�F͝;Zr-nJ' � � � @ Б?,$,`#|ilcuov\@}ve|k38 /Td˸uepߟ@eoѮ7k-6Fvx v!pԖ޺FH?C s>DN_Ȝ4I%s\oڶH\A�@ qr?:͡dzuE eK9ml۷,X� `u._Z'mozj[s (pغ`Pouöu7ߔV\98?}홁?^GzN�҂?0!� � � @ XD7'm>ю[d9rpۜY3n v'Zc ^cǎ>6k-ް6u$dqvohkvc+k@�@�@�/V {Zd|񫯾r+e˦jժf͚\.bwF/V`Z),أ5ıS7o7nܨk׺{s̩K/T7VӦMՠARj � � � @rȟ\)C�w(։ꖽkTgml 񬁞E7Y]5-�d2%4NNMy|y mfiE:Zflk -f{lyԩxl^cYkH`mKӵנ:`3"vlD U^L'!v/͝+9T'J /oX@�2Z iŊfN}/X~�ʥ>ViA,(^`�/j `v|ꉽ�m"o"o_]m:g֖;&ߵbؖ{¶ֽz~oiuq'sܹq)x pP]5ڤe/t۷[zo� ; @�@�@�O3JonOܶ^E[ e|WIO^'>7֖íYR6ڿ)AYŸqmz8oO UvFі2!� � � @u ȸ[nuFJFWv:ql?4)̰QP¿"*̿*1Uy9mT2eʸ%T4ĹLu%\hq^#� � � �(@G  65 u$y~5m &p3y /m樨(l  ԶY=zb58Z}uQc|'w|k5Tok�kZL x~/= 35}6rC2BPM5Nix{䝓Gqd8!� 3.#9U}A-'?�. ^}zj{NNݫ/{m{˄֭&cC{Y=ϛ܂>&ԁݱp{A1m^�M[Z{oimT4u׋/Jo)\G6LX?U@�@�@�@�^F1VO$֦ XDmb׉O} O{JmSڋE`Idu_^L/(6op>kh۽(/cB�@�@�@�@VsNw.y yli }ՖVRin#mi#VPm_ZlC�@�@�@�<:g5)!@h XŸI[KV7{K q0>cB!ƒKܷ~4x&@v7nMo2ݿ?u1c@ <+B %۷KIKML %>n5o.'4kV`P ɰ@�KƤ˳VNnq)ȟ#:[]={K[εmVl^su/'3U `^2'{@�AKl>-@q;vHmJÇK\^w&A�@�@�@�2^q(zC^['66Nֽ6-$+Eu/P/zzmyuNVwW{)qL � � � QY쳥 e˺٭!� � � � � p: RNԩS!;@�"@`BɉkRD$С4l`@o"� �*w/a]TIj+5҉3יPBV>Wiʔ07~}-svS`B�@�@�@�Z'͛ם:d@�@�@�@�M � � � � � � � @@,^ʙ3 ɓ(!Юt4~DB"� @ >-}Ò+YR4�G~6o^|QjB ghX Q =VԫT<G�@�@�@�@�@�@�@�`Af00G�@�@�@�@�@�@�@�t \9#7@ѢR&ҴiU.J� �'M$u&o}R;W:p@Ci0JHWKSJ[H;KFIeHw!sگ@�@�@�@�@�@�@�@�2_@oN � � � � � � � @O?Z `&H 5 H! � OKVItURR߾RtI6H[J*t'OX2P ([V=ZڱCzqoCjVZ<2H@�@�@�@�@�@�@�@�-@ dSq  � � � � � � �^]�L KNIsfl:\@�Ho)S=}-�oJkK3gJ11GI#Uީs=ȗO6LڼY>]/&MNH|"� � � � � � � �^@ � � � � � � �d…R˖ I! I7 M@�BBiiH~}hQW/i{ᅲoƎڵ b0fϤUUnʗF s� � � � � � � �� C# � � � � � � � R͛VRz&#@j:w>P:t(W<@�@ c~]>8T)+1cjդiӤi253&\[W2EڲECz)Li駟+� � � � � � � � ^L/I� � � � � � � �A/0wT԰ag "62{v � @ |4jtR"R׮NiZߤ7ߔ:t႒O>))žভ[KKF, G�@�@�@�@�@�@�@�N@A!@�@�@�@�@�@�@�(y-J"@\ /7N � @ >,͚%'.-ծ-T4yog҃e|HiPi&%p| � � � � � � � �/@ ]؊� � � � � � � �a&pRaV0@t"-Y"% � ? =ԸTԱa4h7oK:I |q)� duz m+-_k֔ʕF7zxD�@�@�@�@�@�@�@�2P@˥@�@�@�@�@�@�@�@ x,dZ<"E)M)% � )͝ XdzJ"_h/wAf援'MnnUz9 (c| � � � � � � � �!@ x)% � � � � � � �/`a5x �t<yvɓ3=iD�@�0ظQzYiSpao5k>}+{wޑuS@JFvF-jԐZ,I%9 @�@�@�@�@�@�@�@ L!#� � � � � � � @ 8!-Z$izy'@_H[K( �d_I| ~TTR"ҸqVI<"]uVҙV X!C$ :gtԬt%[oIǎh6 � � � � � � � 4q 7,"� � � � � � � @/ZNu8R/дT4yr � Y?,ԼTʕRnҊRt4eԳwFdPZO KKk/ʖi߾K+!� � � � � � � �ɝ� � � � � � � �a/0{TT|"QQRN 7!� GJIÆI+KUHRҫJvIWK#GJKٲAa&P4amԿKI?f8 � � � � � � � @�@|F�@�@�@�@�@�@�@�8sF3Gj."H\{wiiݺďc/ �D֭+H7$*$h!-[&r|4mtmRBI@ɒ;vH?/X!լ)xᇒ̈́� � � � � � � � zAގ3@�@�@�@�@�@�@�@ FڹSj>2Ksz w R<@�HP1飏bE9_v[i(k/ܹ}?@:uJjr8LI � � � � � � � �a(@ 0|S) � � � � � � �=[*_^]6@ pݻK'KO.� �+}4vԶTԴxԺt#͚%'.y#5H@,R˖@+;ʖFMu8 @�@�@�@�@�@�@�@'@ H@�@�@�@�@�@�@�kߗڵ "R8BJW/i._�8E�@�d 8!}t}R͚Rr=N=ZWiz駥ƍٓ}iD� UK?y i>} @�@�@�@�@�@�@�@ oYD�@�@�@�@�@�@�@� l$# SYd@Rz҄ s}� �7i8曥…&Myfͤ%K9s$ Wl`H ŋK>*m.WҥJMJ HgΤoz\ @�@�@�@�@�@�@�'AӻIY@�@�@�@�@�@�@�@ߗ6<g3/@ {KgK< �ZIϤ~";cǤQ-[gnAʑ#Iq"@\RҢERVBVRرy � � � � � � � �A�$@�@�@�@�@�@�@�@ s,\6Rl @:uNOO� �!g4~dpk3F >n]P!8L.@ dnQC_P ʔoi )!� � � � � � � �.@ ` � � � � � � �J`.髯vRu:'!@ ,(n-Mpi@�Hn _�+J }TڴIgͥ\Ҝ$@�0QC7Nھ]:Tz |ywoiݺ0)$@�@�@�@�@�@�@�@� @ 4q* � � � � � � �YR޼RfGr@$ X�O?mdʎ� @ 'mޢB~PWKI11ҢEҝwJ+_@Ѣ҈cHkH]&5i"͟/9\%7 � � � � � � � @f 2I@�@�@�@�@�@�@�2U`LU+)gLM@ ͛KM1!� @NJz+ť~uQܝҖ-+~_2mާR\R6?!_[6r� � � � � � � �F@Q@�@�@�@�@�}iر馛4zɗedܹ*_өʄ� �*DgI:dj$�)w~[:s&'r( �Y &F<YjԨZv:Giذn|饗8bB @ǏTÆ 5`�wyԩT{9Ul:iSi뮓W*SFzARuL?)XMqjҤ3032 � � � � � � �� !s � � � � � ufOȑ# [nկ*[2!� @ ̞-!lLOii � 2J[Zz1^=X1[;߯WMڸq{18"udB+WԲe˒<(ckŊ*X?~^N[NVM@O *H=zHk֤r\.&N>^֭3!� � � � � � � @ 2xr� � � � � � |zGܽUVՐ!C82 8p``3B �DRR<Xx@ Ԭ)խ+fe"� "JӦ>,)թ#T4}V7.S՝7հaC+W.Җ.]ZJJ8@ r>}nTL˩@KSo9oHKW\!5j$͙#'a:%XP믿^Nr&e˦Y?fHrNE�@�@�@�@�@�@�@ x$� � � � � �)[n-ֱ1Xek �a+`o,Ma[D @X #͜):VŢ0 �D`:i(kEݥ-[$gپ~ƍnYʟl8ԋ+2enӞ={t7= *%rPAxbm۶-ir/,OȑCy|%g<(tH' _r>љ3gb g p>>cs  � � � � � � �@T0e � � � � � �+WԤIqFyչsg_~Qƍٳgk׮]<x9h-{ァݻwGٳ9<ݫ/\.B<yRvo^/֯_GyDO?N>ٳ駟͝;{1UTIC qرʂA=~ǎNgqZjͫriѱyܷo^xc:k>ko �$_`\)K馛G"@v[xi僔@�EÇ%K mɩ/JS$yԴKdA."]p111gL8QrRZsϩENy 2Y>px =㱹Xz||['۲eK;V?ԫC{+hDy:{~X0@:TNf/g't۷َĞM$Vг+B6lpӬ]nVym 6=ܣe˖34a7P|>1cF@ZI=Hى � � � � � � � @d͐rQ@�@�@�@�@�@ cƌQFd- cbԥKuɽN?֭[Wzr,zI9w;d3Z ^т2v xUWvmݺ$ou 4p[G y]wСC6_]v<yzȑNԽ{we͚U .T~[oyuVիW iKv?&`V@�@ A'&a}.o YA�@ KSuI DEG9f 9~U VܛH 62eN8J,]T\sϭϲQlx'! yW_m`!S_ 7ԉ8j(+AGڵkz_m@{|yt g%w$'n3. $coR&ڶm~٥n6i末&l"z{߳K.D_~lؠR|>7oL\|X^{fhРAD۷Μ9ĞM$$ � � � � � � � @ 2I  � � � � �N7c=܎֩'Ե^ӧVUV-ѶyS5 kz+֭s;I&駟d}]7l*lt"Zӎ }{,Yv\| yq:vsYv(w7ިr=e8p:&;V@�@ qÇŋ}Ao? L}X`+&@�8W?9s$ (94zDh9XAL$*UA$Vel}%LV6sΏ~??[$_^[lY+XV\O<N>?5r޼d&[䌟m6nVNZi,9e2/_~Iل (/_>5[oĞM$Uг xjn2s{&RN~ߙ,;- &Z;Ob&zv@�@�@�@�@�@�@�@ } � � � � � r_~9= 4o}=zrM2TfMe{a6ܹ]N4INRݎY:?VTIr)Ul׮{;Ʈ?~uU[nէ~cy:i;vL'OtUz3m_Μ9m;uz[gbl)SY̙3c7x`7K/b � @Ɖsw7@ Hx&X%HH@�TyFpa%g+} rɩ,8ZzM. >\]v;wm7ɕ+."wD ltƽsRƉjM &/^ {vgOiO|;J+K/`SVٳg'D|%,M$|l‚;f˖ ʞ/8 tզM]x!)z6g'f@�@�@�@�@�@�@�U2]/@�@�@�@�@�@� DGouNXrаaCwuӦM&wPK(wEr~ 7țtzo޼Yw{u;YFx wO^z:p8lKe,oJ(c:S+^~]͟L � iRӦRI <|8L �D_IKCHIO<!+&/1Brb9d zҡC.jZt[?e%Vw1$- ޿l8PظQjBz!ɉ{oO^MgwV|&z.a?Hnv{lR˖-s?,XxeAǏfu̘1S^[&l"9N&@�@�@�@�@�@�@�@  ,  � � � � � 9/]xlONKɣÇ!֭2/Wݺu5c w>zfΜٳԩSߪ[nn~zv_H�{=o;@�@\CŋN+ >}f K@�* /H7(*$i#Y=/&O.Z4%},Twl˼y_Od@  8c.嗥;N*V:wVL<Mγ<RoTـWYlT=cի6lؠѣG+gΜSNLDZ$0;@�@�@�@�@�@�@�@ QA&N@�@�@�@�@�lO?$Mw^GcǎOڵCz!ӤwND@vE<J,m?tLl2-=ܣbŊw՛oӧOk٪T۱~Zvmuluܾ}{6V@�@ ~+՝g&ARV8 ̓e@�!T+iB;/TyD*P@z5inij9AzwҤI*|!7n-`zǏǓQBA x̜,(&Nl}g'9c57]uU<'O< mHz͛\rzgڷoIw}IM=Hg'I~@�@�@�@�@�@�@�_ ş "� � � � � �&p 783h֬Y -R"Et۬3M ,Ώ;vpyK{sNw0`˧3gYfN4duM={}ܥ!@^xnΝ;x,Y?|{ǩSjϞ=Vƙ4h9r8A�t:RF �ekTBխ[=@�@ a'=/:c؃�-ֲeҦMOr� @r} lS'Ҫ"zTxr1M<Y]v=˂߿߭SK,crUH:t(~m@T}%JHVԻKw k}6qwzK6lHDr|ؠVFjذ~n}Rl"9N^ � � � � � � � >YgR\@�@�@�@�ȒE6M1xDN@�N0N:x9s8;4݉TZ5͂"eGȑ#yf]pz衇T~}/vۨQ4tP}嗺[k.Zʕݻww;8qB+Wv;TL[ի �iZ%K+-uƴ`Υg+3<,Ηm<>}f<ʝ;wYA� {1\`w_q㤞=-w'P|J>:?@XO?$ϯ"q��@�IDATL(q  @Js0q27v c -ZH$W\zi͚5IꫯѣGu)ƍ-[6o^-zα@ ʔq:ӎ΃x&ힵׯD{QvԣGmݺӧO<W`SX`^NݻdÆIK; I=`v4|pmֹF =g ̙Sy6aLm@) Ξ=I&<Y7٠Tw};ؖ=e' peUz6гƍ{f� � � � � � � � @ @ � � � �#r�D _׻+X8I_enJ&K_~q,VX]ÇAΖvUH$/c>yN:~M~|?Σ*UR|. @r3@ ~[Ne):ZN`-,>3K:}qb;J;9W`@ -N5.~\T:rDYS-[ %'pWZRs-u2aÆOHGAcR\*LxCzE9F *'xMس�/TP5Z9=k8|XǤ<H볓~@�@�@�@�@�@�@�8_ MlA�@�@�@�@�@�+Ppa5j(LXGD&xߎ,N/oKVY*9A -wEI,yUڵS1F�@ Mn ~P0W`/u& �a%pgg?ZD:G_/=/c2Sd &6A=lذ49E�R)`qW.iLg}{BV@/> /kiv$DZWf!� � � � � � � @Y^@�@�@�@�@�@�@�@ bb%K.];'PԪ;@� ;7ސڷ1LܠK͛~oٳP iv/ս{̠$ @ (,أ+i g} V$-:$ � � � � � � �  U%h � � � � � Yd ڼ:c%Jݻ G�@ (f̐rڴ )HRҦMR*� � F'/,/#5n,RR iL$HN4iΜ9'ڲeK\'HhF9]]l25j(DfJw>ЧNΛ7o>ۥ CՋ/% � � � � � � �d� 3ޘ@�@�@�@�@�@ *U9GLӴiIs �$.{M7I\qE�ZI&=l䛜"�h/%ҡCRʾO?-'(U4ݻwW+^x\ \*UEuw'WFQ!'p%#GjzϩT<n Zjj׮~ 8&F[Wj\qӜEȄ� � � � � � � �"L\"� � � � @,YpbN0 F�HRNO-MƁ F~/" sEҌrQJPyoC3JO=%'�;w/ ҰS+ }׭r攮Nj�#"Vl 7u֥b`A!g8 vRZg͝uᅝ4eKNip󌨨ԥY � � � � � � � '[a� � � � � � � �ț'N~@ q}#G]I8"� hiDKhQaCid~}i|_`ȡC%@Dc@�DW^xرC˖-S ;+:*^|z*T|R:x0tL@�@�@�@�@�@�@�@  {@@�@�@�@�@�@�@�@  }{)gT^@ h,8-HY$c �! pr4bTT4`#=qe˾s@" @ d͚U5ryUwŋUvm'h(-XP^^Z |ʔ R F�@�@�@�@�@�@�@�0 d @�@�@�@�@�@�@�pغU+Kp.%eC  VVlJ� 2wߕzՓ~[SG=ripjՔ]@�"G [ljڴƍ={h޼yQbY2Np{c}jVZ<rl() � � � � � � �]@i7  � � � � � � � �S"En@$�"РT4fL$G" �!*p7ң>ZnvOiz_}'mH\% �Ȟ=Zj'*::Zft ߧ,YJ:A t~9I'UF�@�@�@�@�@�@�@� dQd@�@�@�@�@�@�@�<Y)*B�2Dz=*A�H[*QB[WzufMi )&FZT^F � ̙SڵsNyOEkʔɺ|ʑ'p JŊ#w? � � � � � � � p�  � � � � � � �KݺBn#E{w9UJU8@ Μ֮xBjP*ZTCڶM>\[iN7|B@ ɣN:i̙ڿ?Z'&M~zbN@j=;H(<"� � � � � � � @& 2I @�@�@�@�@�@�@�Gwe}A\U o^[W_N\/@�8tH1CW*]Zr饗*U)Sܒ/x@U+#r5@�H@>' q'JGSL^o1\/uO;*UOK&z� � � � � � � �-ţt � � � � � lvI?|nr|*%=@�@�_],YA�H_ym#Ĕ\ᅲ,.V*ۥ-.7`<Ε9Wa6k ?o6m@ (P@5bL'dN]tkȑ"5@�@�@�@�@�@�@�A{AN@�@�@�@�@�%EݻY- g_:%s׬!� �W[7o Kwʕ} 6C�HܹS*VLFi Y3PHS @[o f 8ii6#PX)W{N_z_c+R$0y#U@�@�@�@�@�@�@�@)#� � � � � @dX^(g* lw{R"� Rɓ5ZRz&#@(  aC(#�}?tRRwIIVI{H'J]; \uT/cBҎʳ籆@0 \q4iutҳJec0唼 � � � � � � � @F 2> � � � � �'еtyPtl � > D@RK/Eb)3 GHIKK5jHFI%JHK{J+WJ#FHuJ6 @Rm}v .PpNihi2c˖Ғ%{� � � � � � � �!@ P � � � � � "Z|\:)*κ ٰ@�HXX!d?2,(wH#{dPj@ 6m^jL*\XjVkW//hwݥ"EBd) C6�Ä@# "m(͙#=(o%;*%! � � � � � � � RAT@�@�@�@�@�@ ]z,c|ɓt֍υm � TT *euZ<Y@&@�oiBiPR%jUGcݻomjyp @(T.UpNmÄ@ X֭Kk.ʖi߾P+E�@�@�@�@�@�@�@�@�@�@�@�@�@ Cv,c|%HUķm � )͙# ȟ_">_~^zIjR*TȷsK|AN}v/ 9& <AlcB jז&Lm}Z@~~ґ@�@�@�@�@�@�@�ID�@�@�@�@�@�LXQr)KsB�@�fIwtvk yCJ[JsF^)1 Vy_1ib鮻U/o)O_~֮\jPʖ-iq& o!f%#;矗Vj֔nQC̙p))@�@�@�@�@�@�@�@ 2;F�@�@�@�@�@ (zyZqԹsPdL � @ ԲTPe @ T"j%=\&Kb @H 4`ԦhQʊm4fԺwc];i2)&F1CG*U*eh@ 5eJW]u C6m}L@҆ Hys_Pq㤣GíĔ@�@�@�@�@�@�@�ӵ22 M)@�@�@�@�@�@ 8:uN> YTm!� �&ktԳ' 4|Қ5h �$%`\"c8~{ե |Axo^zIQ#į^@ z:w![mL<2>H[+;@1Bڻ7KO@�@�@�@�@�@�@�?  � � � � � %|7D�@� L,/juvk MH^ H H\߰`$_'}r,\(:u;vH.o/.,p``S11KHeʜ{.@�@t(9s6e[mLD@Z ?h4fTԧw)S egs4 � � � � � � �V[ej/y � � � � � @z:{n,Rg_� �x#u$ma�.0|4ukWKP~@| ب>xOϥ˥S@ReJj"zJںUڰA=Zz)G`  HE% -ouƄ@ /.=}KW_{A&d3r?lG�@�@�@�@�@�@�@�Ț1 � � � � � @nY'͚I %<B�@�{="̔/'},G �$0mTrt%Ϟ]M:il_ ?͓ʗ?< �&` [>!+Կ~h/@jVcJ.? � � � � � � 5&AbĂ]<E9 g;~N{E VDA ( H^?p]fwgݙ'O6oɛ$ɻ�RC�!p%T@�� �@�� �@��$P1l| >7@��J_&FԽ{6� P٥Idݺ<s@) zV3[l޴ɬR%3ͦO&9t @ pmeu�ʔ1;H3<K[7+0m7o4ל^~lժmK"~8� �@�� �@�� �@�� �@ 5DIMЄ @�� �@�� �#.[ri f@�D`˖-vZ'V;U�Z=6l`ׯ6wS ظqs7;l֭[vv֓gm`e*Ζ+W΂-_|X*Lc]\AUZ^vv2ի{W0@v}1;ʑ\41;lo/y&#@{<Ғ%ڈ3¥Q8^N/sk,X5p\׸>vl{;׸ �4Vd@s >= -[6;#d5⹺yX9sWR%pM!o>I3z6ȅ ݂f 9 P]=/CB"7 JCsCߡ>%ˍ=}E~nl=7|)ӷF~$<sl{Gm_Gpx1H&}t]S6kz8tXU^7Hf* Kmμy;w/omٲeձsžccwUvmSw1w󶉛xu  �@�� �@�� �@�� �@ A�� �@�� �@��.]4M bʕ+MvժU۹ZE-, LcaѪDի0b`sNJ8M/&*[42JՂX/"+ ؅aqsyXL%U!k֬i5j0ǵjՊ.&X[n]x8^\� �@ >?6?3* P 켳駛I •n>hzacMb7m&jܮƮ 7ql* cp.W8A,'?k\ Y+c0:R> BbcbB% s OPyyX7v!7 1ޜ"vpyUkTwe|M2j/?pvB (1jb}ՇZ!P<W ӏ=GvFݗxDZ׾/{%*@~#/"\E8c Z X~1bzbMd'ĺ8]%и[̮嗷:u2srцn1<\~285ɓ'ԩSmʔ)N>/^ ^mMƍ~,-ZǪ߱m~3:u߫ޥcE$IdRقolwvy۶m[vJj0� �@�� �@�� �@�� �T(% � �@�� �@�%IA-T7 � hE6-l V~7oMr87¶X3Z(DqX<*UF ]RK܈uK#/M Mj 򑘦D!m LV1@ |T۬Yf_}7 gs/oӦ0{-Nh\+}\ F ?e4KF4A08\++q(ȍgHD0C Bj^A.7^ X0'!7m/ eΩ9YfR*[h-M[Y77!/4saY:uȉ3$ڈOlC}pv <>@G G s\υ$ԏJp1ݍCM*꒝w'}E8`U±G +Q9{eñ62R?k[b#0bـO>>lPsg^Q};v3&jWE͚5v۝^bӼy;wMsK E^PVk;wZ Tb �@�� �@�� �@�� �@� d2( �@�� �@�@к4 ӮXHJ-_l l…mj1g"X! \- V0e nkKRV c=ñ>7oޜ#SZ۰aQF.VN21@x_L!PnK4)Dh37'g6jTS?g >5FV|!]d~niӦ/,'ڈ!ذIC8n~ԘlY a 8 )wƌNh-Y"ͮnvr'Hj_Y'VNdmX6m9*:V~Is概 S8+9 J+49=K;%h0ƊѾXW=+SMtknYuM'hn7Xw{a�(^~A5qbҟ)f{:)ޱD#g*)ÇF_{軆8�o;tUB'}07x)ᄏqvۡH"QB�� �@�� �@�� �@�@@2 ,@�� �@�� �lO3  ={͝;̙Λ7 F$蠅듐raaRb D|ҢEy "\ JhTwW&MiӦ͛J0?A <6H@:燴?g^R1~Amֵkb~$)}I/v +!.h1#b%%܅@&XvXVن 9EP%ߍ4'aÆٮTjР熹0 QË@P|40Xܿ A<M}䪏 :lƕ'M}DT7T=kBM$꿗TP!Q=9#=>3s]~\6?t5aÆ6֫W/o>`SgЪ-?#/r9a/~Z߾}N:I!�@�� �@�� �@�� �@ Y| � �@�� �@ awƌΚ5d%(zhW{JO ۴-? 9 R@@kUWJ4բ`$ТEmժɶnڋ(-x_,-%M>3!L1<8sBK�}I/x;w673{~$Ʃ$|IQa\ K+sIH`WDcB1Å@b4Ϡ]A�,lhxƍр%D8<Zpk֬}$Dԟ3m꣹XzۯH�XmG}T2b J{ŊѼI Xwv~wѷ KbKSA"!V}XmDهn/ "|vQGY6mYJUC ֭ݻ۩jvIx@�� �@�� �@�� �@�ȏ�B �@�� �@�@`! @ӧԩSmʔ)Jq̙Z2ժU-[z+͛{f͚Yʕ-DXl0駟LVbrU̙c[lj!ck׮mֻ7b\ �X)ʽ{Yٖ;S\htz#~̍v߽4Q? f*�%A+KK7oF_שKQFZ t!E҂sJ5.a0Dk>NwYK X\`E]"֯_o?W8}Mȣ%8$WKnWטMb&AY@@U/ "AL8E~@i3{b~7o{lY>vʟȑOO<nݺy>}tK?x / Y߿]tE d� �@�� �@�� �@�� K�!? �@�� �@�@F(Sl }3"$H!H$&Nh?ɕ Dʕ+gvlӦN1UVzZ ӄM"d%:m4o.\SYjU/١C }V^4ɀ@ Xtv< "0pك AqM<C>{2ljN~̨>$[>UAK1 p ⏈Dqq�$ qX BJ, :broܢkj7$NWhYicgi.XVZBqrտH1 4`"*K跼h" }Ap\2_wm'˭^zPIn6\\%K~߱C;Mg7Qd;Nvok}s_|ыeN4ɺtb7ts1 � �@�� �@�� �@�� �\S@�� �@�� � ւ"EI. P(Z(1qyw[li{k׮_XbBŃgd;-R(ɓM%*Woep~}}׻i=DL*-ZZ HM￿ @{ #]sٜ9f;ک)g͚e3fB\AKzs5md%%z  �0be%0 $6G+!=$0 :ujtӒy;^#Uʕm_ǚ5kfFFI% Pd+WN*+aXs`@4jom۶.rIfح>lCrbβ +:R5ju]o*7|EG �@�� �@�� �@�� �@  J �@�� �@��T˗/ʾko?Ht{oԩBp  Pt]0aXȪ%uVоK."+TPx)&b<vfݺ9]o.x&@{_:sf^jG|]M2[ qIKV";iذ\WتW…� 2 .[zF9D${zȲ(Yl X|MHxeD<%&WSowʏ, P U,c͎$6]VZ^L-[f-|}{ 7)xcq }S;쭷޲<m|ri-  �@�� �@�� �@�� �nA'� �@�� �@ k ?krOmȑjQpСp{]v,D+u5kظqlر&11cܹs k׮]V +VX| #&@�q%L $%x_E=Rj=~ O81*5{l/.-<JKi(N;}`\� &$+d*U5(6]v ;!5Eߑࣄ$)c lQD@9ɓ'{ ټys6fGSUK/dW^y 8.C499@P.r]Rwx*9h � �@�� �@�� �@�@F@2#DC�� �@�� �D>2ƍ>bUV5 uݺuf;wfTf',E$_z_Dd*W!{eGy__4$b I YÆf7lNt�,1;/S^ԬiS3WbW\w.J{%za. 4kڷoJ|y � #j*/S˗/9Q[D$Mh&L7lEkר3g߼u&X[~ �Xx5a„;c ۲eC.]RJ)JI $8dKo7_&HĞ{9kF&Mm� �@�� �@�� �@�� �G�!W� �@�� � }!(d2޳C ׯ_;0;Cc 6d H`ٲe'|b#Fӧ{a;Ύ?xFP&K>bz+^yl�3+l n~ 8L Aoi6{Y^CT?4;vk=zIkɒ%VlYd;u-BgZI7 ,r؅ ZqHPBMam&#ʌcզ@dGAh I<MBkU%@ vZ=ZrgD զiò=zx[z"N:$R /XϞ=3>O鞁Eٹ뿇s=?)ݓL �@�� �@�� �@�� �@ L2P� �@�� �@�Hi!z'1+Vz dխ[zmG}jԨc4 V~'߷> �N9;C\ri^x_r%WA#*W6{(Y%˿$c7ϬeK7;)qFꫯ~k$U~}B.]+W!�;w3 ʕXDvիgtМFiܲegyY K(SBݺu(V#!�, /2j%,D_{3m]7 ӿ/jۡN:YPZ՟vۅ^h=P՟ M*!�@�� �@�� �@�� �' ӳ\H �@�� �@�;!6I< 2/vje˖M@ uV^!%{ pb=g }W�) 5kf6xى'i"IVFϨJzb%�tlsTmcΜ96l0~gڵkI&ֳgO;{ֺuAp� M@~}6wԨQfkܸyvn;SN4ml2{B=zȪk9.@ W_'o^&Lss쨣իWs_N;.Ds)Sqzn>D{,N@�� �@�� �@�� �@ Y� �@�� �@ um!H2({9{l&38 S XAH'x7矷#Gz+Ž8tJ&i/fIA#pfo=ѬB*%�=:l=ͽc͆1c p%:#1 rIW^֪U4*@ { l޼ƌc#Fbcǎu|[|' '`j8�ׯCګꅆ+Ui$p&[~ � J/sn6le㎳ʕ+2B-޽{yH.KKLO< �@�� �@�� �@�� �% ӲXH �@�� �@�Ȇ;ʀ!n֬Yc>s=;e]fgyլY3ݒJz �4 0m4{g-Zmf|$d $Gh͉g[OI/)'nu\ۙL+V^zo0n8kذ2?>`Xvy �/%KذalȐ!^l֭^hvG[o3~x/@%HU}L߾})ުDl@ظq~7w1 SN%w_`1A@ww;\~(R@�� �@�� �@�� �@�)#P6e!0 �@�� �@�� �@D"O{!ASN@�yhӦ_8gӧuYֵkWz� F2sq0�F̾Od4e;QFv7zі>ϟo<qsX1 �2$xb{ꩧl~͛?[re·޳=z~gs`-{,LI�2v>sTbj[ƪU[Rf˖-^m۶~CJnOc]}6y=p� �@�� �@�� �@���BYUd� �@�� �@�@z駟bn/n?~ʖez:JE`͚5/Z~vyy+K,Z x=$%n <~N}7"I |of͚epxvUWƍw0d� �t#tcGN@ tlv!fwޙ6m|ɶ^{Տ>~\гgO+SLf\d >܏cv}BTޚSԩxR1N}yh4;R3Jc 7Et 3T^8 c?y~NiӦv뭷㏽pm3go't%]8yĿ#mJ$5<q%0y\N%$&D!զmUVmkjhL1i${hcm<xu]1W9Ҏ:(ۺuk|;po>v@(< @�� �@�� �@�� �@�@��@�IDATPJ� �@�� �@�@b6-RjҤM2:,)2K"Zh*SذWZe6l>VXd%nHeO?aÆڵkz6?O7oO<xkSN.n+{TGޣG[`A!�@ 5֭34c �$ >23&A4wۢE\>qu*UR7'aΝk9c FSISN &D$]+81/csZl:V9<O^ڑP Y̍ ڵITGѺufKnf~ohO<noQ)_tzv1ءjs̱_ּyHq)x_ Q +KxKRT'ǷXjsqjM.qwa_~eF;xvmhf}/:ӽs* |^T>p� �@�� �@�� �@��2�B]|$� �@�� �@�@zx뭷O>^HW^ZjgBIUЂ;̶lْ%FygmڴIzz lzD 3/<ߛoD$zGۥ^lIo!{q%8!�d͜vZ&4B�F 1sgsb'YfoSk^�D]#P\RDž1?sr<ZaƉpQLt `;v,H](Ds# .Wܮ:k֬Gp6DSre˼?|۴iSeGb*1I&?O[nOD;F`Gڔx}Ik/+#Jp)Nos-V9fW_2&|WX$ҜfZKkp^Y@�� �@�� �@�� �@�^Afoْ3@�� �@�� �@�%B`ʔ)vW\qEH3_o~E"gbG._|ӓhs̱?91 +W\|'aÆvFIR^Kjժ{g6oޜN#-� P<cvfa� �o4i x.a/޽.6qD;餓J8ED e˖5šxx'_*=;2^.l~"R֢օT'pջDQ-_ %jԨE +׶g@]we}v'=i;CO?Zj x Mw-eNQQBrSQջ‡Onڷj6Z 7ߴ#<4hz~IVv ^K8M~]t� �@�� �@�� �@��2@ɭZL^� �@�� �@�� ?=P Y7nh}^D[}֯_o?}[|5jX†jo=o{aƍ۝w;B70=ӢE 'rtU^y[Bv?0aL<@/8zh²kƌQ:y6do`>!j[dOUZ4|7SOٴil>}X^K pvc9q>}}vgp$<qws=;cGÎf0Ce?[6m;zVŋ:`sT�_{5_kS'*~͗:#5kִ>q1n |[liO?]x!� aޙi*Nr!�"pq޳͍̜Xښ[zs f+VL۴&y6m]ynk7k̿klt+Ĕ4.7qEY޽}%d$qO?d:uc2e$o(xKq={ i._6b_N7t#D @s0/{/?9}Y>|8p`Qꃢȯn$$R4$h"?sq*Ww}^Hs@ w##DEwks{ϟoׯ\W=y`_𓟫 {wyϥ丙a'ݺutp )ˁ:%8z(e:`D Ku$Wmի}MתT$默Re{K/4i~yRa8̞=n/86w8}1� �@�� �@�� �@�� "@�� �@�� �d!sieaҜ[hqSO?4Sr~qqUVEtU>K.'h8qbdԨQ&MDjժ Fy8!LjnN">RNۋE֑;,D}u뭷s' 5_s(_{#'xb-8Ѿ[q'~qO "[lϺi'y"nQZ'r}B8"Sɓ'G"v8!Ɉ+<͇EcOuH2cG$'?x/MhC'qB˗G3ό,\0E=:tMϩ8aH۶m}]Vt ',Yx#iժ7wܷ cF:wVi"1AU}3He) p {El\ 2K�}#O5W iӶ%3=9#:uڵk9q;tMcs98E2h쨱  D~/﹀?9Ѿی!6[.jժ`a"Gk_'"NtЧm@qgD: 6,ScW}ш><3'qB>>y88Ɉg PPT8ԅo1ҳgO_ן|ɈϏ|~쯴jm0 $B2u7,ϛ|H^rύlڴ)Rn]v ߫+/OA.N4ח_~_Wۑ-3sO)˒~˚dCBHIjcdOsԧ:d +k?t)m#8x6Z;/h<лĒ{BUz<xT;Q*;� �@�� �@�� �@��[ބ� �@�� �@�@pk.ɾb%G@࣏>$z+k׮&S6lE;<^–|'>oǓ駟I"GjԨN#]tQ^zхS0H,VA t-AߕW^w}:&Kx!<s+_L/^o>"! p<#Z"f̚5ks!AS%)!XSP>v$x;-vPPV(DC%`2$A`[uB! _,?/.C޷~.|Kl}~?o P!@{O%6iϻӶX?$j(Al1xf,{cA~n"AF!XIr7t3n8?^z%?9HXOs"kxb0\AqA7N bǗJcxBHlO奍5i4W A)"i B8#m PPL.HQu=v#<s~}RYks m2߅lFsQz裏>LAys#֥KXL$\ &q(]ݔ% <|f̘噲!`m_l//א>Wmu*O?cǦ"xY~ߥ{0xP&_h~BrKl֬Y.L6 @�� �@�� �@�� �@�DX� �@�� �@�� �$;Yhխ[7)a&;7oO>z̉믿nN,њ4iߣGV6i$g}J*~6mڵkgNœXUT܂x{ǬSNY޽mOxo۷zc=^ pBVvm2dժU&L8@s"DmEW^1'hnA}ԋ+WN; .YxwA0W.0 vn"iېP.'wXd\Bkݺ/l299L,pcs8N&'-'M6kv… ͉SH  �>@ ]ٹzkIc;׉E)2k\ݼys mfj4Ne4 cN9{[~>f?3 /D_o^nzʟ̇rH4*Oc0>HA":6Ba,y晤C5NFiN:o"l8w1z[>cS])h^H]p~^NF6.7G2N�һN4n؟'{|:QOӜQӦM2yI4XȃDH\bM]Ħٳg0ZW_6T<s^I<C:Keѿ_GfzM ߅4HI}:pN}+{7lQߗ b1zh{mUפWYrKz@�� �@�� �@�� �@�%N�!/�@�� �@�� �@ {h|f_+-3ZP䱦|&+K-V yu>1cbrŞZ~0s=g#0-⎘x*T"xQ榛n+ɓc5!qLW #7p/vzQH!ºEMɝ^zLyklԩ>9mb侧sQܢbة>s=^[RXiŖT@i"തm[V)(I6Ȼ.Tz4;oc8F܋@>#v盃-Z+V+opGСC}^7s z Yc)SBBbQи.M81^:]˝ js G2̙3}p ;HP&Mp\rscyi#U򫛉ԅӧ[5 \v$^z]p~sK.ľ~wcD?c_H Qs&Fbe6n`s̏[">ksN2.fѿl-,26xw-ӿ&bп%ٞ|_Q۬ VHhXߗԯjdΖS~5%dŎ&N裸fUrm=S·dOx� �@�� �@�� �@�� Prdɧ@�� �@�� �@�@B+-Vmi-lLjժyA_~$kvuWڠAo޼/~L>3ɸYjUرc nݺu^rq.^ovwW\7YId#$>6pn2tr/b+k?iϝ֭[{-5mh{{9hK.!Ӵ � P&܉!JQ* P.} Ѧ%Cc -[X.] Ul~ "RMbwkӦM~^z7ni/T?o|ZtHG*d Ɍ5*GE$R ţ߅r~)"vi^XPyO<!7ZP^q׶m[}"~zӧo&HHtn,Џ>/%I?%e0o_PLb%w],sjFN{mxWMyJDgJ(_ڹs6J=zkKE @�� �@�� �@�� �@�i@�!4(�@�� �@�� �@ qv[޽miFYݺum9fiKNdF#~UR%z?<Nho…֯_?8q?e˖yI=&A`$)#aL$ﶵlvi'{7rr*3<|q7۷oシ f͚wo4 E&,dC v43<Hf$>*!÷z.2R<cH 62{oذp ^E4Uw)Ki>c^GuSk  �dv޽Kμb@ uY!=?>vUW?fQ~}/|i\o<~g֤I?&IDqXLAb5СuĈ9b8~Rp2~Su&5u;wśэ<0%X"H]s*7pC:-џ$5!?f:5~Eª=bRPד?m!z7( 2U>6m-y?~nO_2~/+)}DbFVMjEmt*q6xǂhJqxܸq~C4m_a}ر5n8� �@�� �@�� �@�� � $dI� �@�� �@�� q`{6dȐK-t9c^{Nw}y~Dz![~;goծ]_ yB'#q?-~q:uLsOUuժW0ym~;tP aiLl<!y{oc\JOgϞv뭷|Q1?OM7E>%ʏUK4@ b2sQ԰LgޕPhlKW(/}H$F*ޡ܃+Z|h1pٲe~_2M7#+_ݷ5F@�p]2V-1� ,uC;oUcQm_|}7{؃>ړŠ8{{nݺH'||@E+IgvugF62!qsSϟd>l/|9j(?ߠqk[n{>$%ǭ0]xqzka|\y=N7c+/^瞳6mژSiT/zeg%%W^=Q+ع|~n\H}(n&R$ 7|ӎ8Ӧ\rgAs2#Fb9製jlXE~C 5YF’Æ s}+򫺣PmT"1'|2Ç{f2ROto56jNH1c+CBRPE)}jMVۜj3`�/6ꫯ&5Dޟ{Dx{( %:(J><+IN4~A�� �@�� �@�� �@�@1p)1� �@�� �@�:d ʺl!d'x"Rrșgqbi~'뮻"UVH*U"v[d֭4ꑝw9{GDv}SY?;vq"\pO>f5jDN<ĈU/2ϝwG܂SO=袋"nwĉEj֬u#nQO{D#ZĉVF8׺ulܸ1"N_w}D4DM9yg}"k5k֬+-\sgD75 ?^~)|䗏 ;6DwѼtA\KI~8hت7:#:t4iq>ʯ:}g99xϫy䑑SO=52cƌ< Sq'YR ,!~B/fIY$0vS~vØעN{i_D%@ۡ*$$ۜk"N Ə5z8 <o4"G9cX!hlm-"nÄHݺu#nh{H "*T~qE5kwqGh$kLy+Wg\iWXO*wG4n؇#_}$޵#G5N=t>5GxTsJ\"$M-XTs4N(ҿH#|,,'+QTO5gOt 8RPT: G0'дiӈG|Kl]:#N,y 7Fvˋ@%܈qB~~ǚ o"?Q]߼ys$m|.ߧT?9<{K F`VdMAJ4ü #<, E_/|v%:S\֪U۫6XmqqN]6ц:W~FMBZB nx>Q[iPmӉWwӦMyّN<.D MoGY@�� �@�� �@�� �@�(~e�� �@�� �@�@V(Sl }*[dI`̙̉[De_~9ȋ[ns1'gnvirlԩzjsDS'aN Ӝ{D+-kgfS9lҪWS{[d9stWK Z:urē|v qir(VR%;묳L|݂>SNӜ=>5⮺fz6Hb:B=jNÜ9 sBv 7]S̀O3%D}k1H)U?4tְazglj�ZN:$?8CS:FQ*h͉=H�vȥ9As148qo݆>I SR5vѱ^14~Vy/s;8sQÏU'ҙt/]&MjhK$Cu 'viNtN,[̏ㅟh^kܹ]}5~o2lѢE>~&+W7xÞ}Ys_3͉l\``ܦ 6p@{W R9Tuu& }wo4Q*7LNl8 sK(7{*Jxz&EKA9ws /iVwC�� �@�� �@�� �@�@@2 C�� �@�� �M�p%E`Сv7ٳK/ 7n\R)J裏.W_#1<CK.B?>|B) t_Qҝ {{٩jrs�E3H&vMfW]0 yϋ E@ۙgf0ٰay'lԨQ^OBb=zreFFX!G}4ei75jا~dLWHP<D ܛ<+IS2˝<ϖfK>*+VxA|h^xxy=V͛gzgLe}SN9?pM'0п A&d{\%`<b {뭷9㿑ID$kׯ_I&%%qgj}w  �@�� �@�� �@�� �d7ٝ=r@�� �@�� �@�B@ <=X{w_޽{oGqDƉU עf͚vueI_ޣ NMz1cشiW_-2t_Q|r{f̘a~M8ڶm[ y�Ҍo[Mx-͒Fr �RH0sn|d.RJYhA_~a/'YwyҥK}ϟҴj>M6QJ|'f'^b&d"yP^K&DҔ(lk# L<>C{mȑNt5OxAŝv){ZK;﴿>y^3JWۆ2V-=ǖ K<B%{-PJ,+WAI]^z%;cB b_|iر6`�/}!8 >볾uQ~lO/0b� �@�� �@�� �@�� �!P&LL� �@�� �@�H! 2814 CƏo`klΝ !Sط~k˗bgyIZj$qڵ E19;^zɉP �p b$г9q21R*hKm'qb\cֿٽ&XZz9s&/Ҷlb;v;>`ѣG vI(/׼@~"4i $Jusϵ_~6ol쳏OAل@H?O?>c[`ծ]ۋ8qY01̮YƋ\:޽{w;#C}7m6ITK&%=n8O|9j(Zo# DtUx֭vgĐ!Co#@`ŞD%&-af  �@�� �@�� �@�� �d? ! �@�� �@�(z(N3 ^�>'x:*U9#H}]/-j>/ӧ_t* RMT&|'f[̉U$�}2if_X~̟ov fN4|ZʋЌ1»ӦMeZhW.]& Z*j$kjժ{q XbE+Wlvc„ _W_}e:+Vq(b*lƍ^Ry2e5ۭ[7/ YBTD_`/"*1/%L`ӦM^Q ڵkg~{챦6QC& YjSJ#<7ʄtgS'Md{߉I&ٔ=@�� �@�� �@�� �@�@28܂� �@�� �@�\a!߾RH`ٲe[oyaO> UzN$(M6 y@VH1c ;';8;o|YW2x_̌r"G w9J?W&锢P?+li֯}S _|EjFmIN:^Re쳏[r"%@�N`^p^o1k~Fࡄ%YJ qѓ믿6|Yfy_vjpǤ):c�Jylر@B:iS#}ի5lذdvmv뭷ڀjժ`<._j<0� �@�� �@�� �@�� Pz YzʚB�� �@�� �RE ,GT;2֭ j#FpbA?Etr|ֽ{w0d1@X~}^�@B�_~Ko#:7vEWjb)j2FI_͜�BX0gl$㡇̮llscόRB _vWPl>glz {m۷VcJ*%6 �d"mN3i$lĉ^QǚۨP^P;weQ5ϳ% 9j(?'f„ ~NHć6k,p@$[-YmfEYŊ}%_}tx| fguլYӞ~iٳg<o\K]vk;,+ ` � �@�� �@�� �@�@@2 B�� �@�� �$F v!bO Hw3g9r_xWN;"biq(~ѢX-=z76mdڵE{erUV'!�qp )&;f'Md &(( 6l(di3>?~mƌ٩JUV^m۶&+q=*W\P_@ ,]ԦNil^q>WիWm]SN1+7EFcǎA}:vh,MٽڋC@VXEJX_/k%Y… /w}g?ngLR_m;{Mm� �@�� �@�� �@�� �I�!Y� �@�� �d=؅YY2RJ@/믿ӧ{[bm-CxV2?_/ >jŋ>c]v=zXݭnݺ)KC`G#xE#лf#Fy@QZy&w35n\z8 NSB]&Mvʔ)~-[XٲeS "cmӦM\ryu@�)#vZ5kQyD ?JVjժ^VAxP͛720)' Կ,[ݨQ#_6AxX}wuW(CHϟ�}C BAX$}[j߾="vUWْ%Kꫯ+j׮=suV<xx6w\+n*UsJ� �@�� �@�� �@��҉�BT� �@�� �@ ir/OZ-˗7|ccƌt}/>ر_ȧ|Z' *m~HҁU/Z?oIԥm۶~g]t3~WPr!/&B ?H`N^~٬_KH(�}AJcFsbfc&QHL|D"ecւTkѢws# -W!� HDI]={vqXmcDj%$y 6i1Q_?iJ}bE<Utw-[ZFȳDH!P/HqSspT ԫW/*ܮ];/6E 6,{{5./`X~tOzڤon>e뮻|߿vm~6$!� �@�� �@�� �@�� Pb,1D @�� �@�� J2.†�җŋM&L'z;}tӢ+Rh!E:@d57S ) 6>vy|lMH@Cvɋ>VR%!H3@ 8̉3UB hS8cW?|f&`+KR;jӸCB=2cHS kwm7kԨ7D'Ҁի.;wnΙ3k㗍Rurm�# 8+a@IV1A`ҥѹ~F}͚5k|&+UP'~Fbo@�E@U?G3u! ;U_}SNfe<RGO9 k׮iIJ~i{ꩧ|>n)JR@�� �@�� �@�� �@�%M�!Ȓ.� �@�� �@�H 2e 27%(  PBw'O)SLV%)S~"A-oٲet1;'饕͇֭hWQ۵ku%�)q2\1"/fQa'1ǜ`@'f,+$g'^شl=;Lx\B=gnx nJ٤pFwuWo7n=e]իW򊈐 Rj.\腐$%߽U鐠Wm$v(R{hѢaK֖-[<DêWr?  P<4oAj;\r �JAœR%KcRwT\?g}ֆ H9袋L/@�� �@�� �@�� �@�@nA&9 �@�� �@�@Vpk̊$(>f̘mӂ[TV-P c\ ʖ-[| '&8Z\ƊHPEu/,RZۺuko%xc-x@}4L#Fq9msB"Pޗ.|^N.ܸܻs剢и[pA.A^HK?AR:֭[$�G@K,1 -^8D-[#:uy ە@_ڵs<  K@a e h[750V}1@|k׮}D #|{QH$ZZC5>7xAO>N:$/Yi*85>L+={?߳XbI$8!�@�� �@�� �@�� �@ C !E2!�@�� �@�� G �ظqIPOBfz:V#EZa%))+ ! R)hEAE ֗.] B & RڬY3kѢEԪR8(x_,ŅO֋)F*"yȫ~8(/\۽D!1E`ժU~|XIn r q/իW/y"5VmnI'5#f/'QXoYo+XSjըkd sbbTRCHTkVo r+W̑FwsY%+ձ r $CW^b] w+5k֌~ H$o'rBdذa}nA{ի}֫W/;*\?>#oG /}G}b@�� �@�� �@�� �@�@"L~ �@�� �@��2@^ 3.#$Z,<o<;w_0,`X QÂX_ r,ϽX8vpZX(e+aG)rBYՑ`uMu?*ZB I&~AN0@x_̟w!,KsO P OUi_m-��@�IDATxm֤IfmڔF:g48Ku0}wQǿ^E) A('({9 (;PS좂L+X�4Az/Iidn>z 3;;y޻|'sh)/_>#ͳ-RJe˖~Lz~PF T7[f9Z ع UY~^U[FW 5u!yJ,Aa -LٲU`JϠh3 p#{!6 ۆ]ة5Z<+}gY4m4}GZPڷo;CظqL̞=;cꫯ{ޅ]GMh( � � � � � � @1/ A�@�@�@�@v8 ȭ]hi]a p [<؅v1 8"aw(B'lM+V *p`Û -X\B݅njŲ6,0!Ųvlڵf@�bx 9 <4b`l\y/}Mciٽ?,ǿukeK7b%;}eٹ;PP!v, qv~<=ԼX<4>>>\ X@_lܵk!S6رßwN$\-Y9:{l<$"w ;%tj^;؉d `?Vu'6}=ҥK]3@ľ'߾}/w}mjhŶ5)rw5uS{1 e|ϟ4?HηZE=~)~~~-ZH .?-[7aÆ~eNt'M6E֢ � � � � � � �#@dW@�@�@�@�"B"nG�r Lwqڅ.\0ַٓ_׍vQ][lY_{>xB`7*UJ6څFa=0JύF Ǵ mF855U6ZPc=Bl hݼS6h 5X܅v REV^l�/9G,޵ҿ]<O^ "9?~[:略m#'-\(3sM{mj]`Ddo|m;wS;mys~;|iyWy?xlY^b9ԍ]V?n %\<ZC2hϹy7e֏swm.j9]hą�'eiL)9YJJ~M^Գgu۩.]yuέA~}b}WwL4x޾O>oՅCM{>}d-ΰݼž l<jYV[_w}ڼf5P}' 8x\vnj}GdZ5p.my=n D0 P~;3gh6߼lϙz~H˅}}gϗ ᵿ^ZV3ֵcC*-w2رcGf^ � � � � � � � @ #&B�@�@�@�.䏜@ va]&l$%|C.s T⹜ 7P9li E6]ABZ.uc\C3x"D#䅠1-gI'bt.' ' h0M(Vv.B!6BԅI<zm丩[Uq>8P(8dȅi{ nuݼZƀ�)dI g͒V&ٹRbԧ1Bj%0 f.ͻM"x]]}o?v;ą}`E.3MCp}w/Wvn[]y ]f@ Zrh7K�G`gYK֩SG 4&MQF~y~ � � � � � � �F1%A�@�@�@�@�@ JjժcA4FŽ.$"xja]l<2$3_~YWGwov/vqk.ܳ.uͻ o1 �JM  ȑRW_I;w \`v~y~vom|z-xWѣ䌚\pvFd5-w5c@ YfII?.]*/LKcԪ#|T?l-W;:jSwͻipo/l}O}o s|g3 mn -[rB>wg:oE6oUVG\d@�@�@�@�@�@�@�@ j@�@�@�@�@�"\Q^F? 0 ܻf � P[ pT @N?]Mni0]!e96/_P[j^6P(Tv�aX<h,#ickRbb X:f]xbI )SFkGH@�@�@�@�@�@�@� c啤 � � � � � � �D R\4xp4f �x餓3=#6E�@�طOSɂ_~*UN=UzIOnݘ6B�@�@�@�@�@�@�@�@�0Dv� � � � � � � � /{n �ϥ!�)Эtw F�@ +VB-qLi.U+/O{L� � � � � � � � �'@d콦@�@�@�@�@�@�@�"i|iܸ"kF�.R{B~�v� �+*}d6.\(U rcR>R|� � � � � � � � �*@d04 @�@�@�@�@�@�@�h�֭-Ю4`tҙgJqqc) �ĆRrr`>]ڱCj\JLƌN:I*U*6J/@�@�@�@�@�@�@�@�@h,w� � � � � � � @ l.M$=Pu!�9RjJ0A"@@�@ Ҥ/KI'8G:X1}A�@�@�@�@�@�@�@�@� _� � � � � � � @.]xatn �A͚I^*oyIJ=, �DڵԩǏ>m4Gwʔn`@�@�@�@�@�@�@�@� 䅢 � � � � � � �DҠAR*Rڇ�}I&HO?-t탭@�@hZJN?Ν+.-!�H d@�@�@�@�@�@�@�@�@� C P � � � � � � �ĸ9?HcxGkznx@rBbA@�x륩S~(m"}t qSe#4@�@�@�@�@�@�@�@�bP .D@�@�@�@�@�@�@�@ƍZt)s8@SJI{@�@ Gto:tjՒRڸQ^i"i@g#(+ � � � � � � � � @ ؞1 � � � � � � � ;(ݥ P8B6ᇥ믗W/ t@�"شIC)))0 >}{zʗ/Frx@�@�@�@�@�@�@�@�@ �A@x� � � � � � � �yx5)-M2$o۱6 7,}hF�@ :NJN?Ξ-,)u*~(j} � � � � � � � � P|,>5=E�@�@�@�@�@�@�@@ƍV-ݳS@ ʗWVB!6& @�bJ`iڴ@ԩRݺR>mIzI+T  � � � � � � � �ĸ�A1=@�@�@�@�@�@�@� Rᅲƌ)ȣo@ R=:ˑ>Z� @ ̝~LJZ*QBY)1Qj:{H@�@�@�@�@�@�@�@�@8 Y_}� � � � � � � @>ƍZv2ϗڴ\@�"L`6i@crvTԻtMR^R*h� � � � � � � � ��A f � � � � � � �w;_F(ңJÇKSW� s5o^[}tԱtuRb'(qgK@�@�@�@�@�@�@�@�@ RWv!� � � � � � � *  y @ X0#H',͘!Y@b �ĈO.%%٘5knz:gJvt1Y� � � � � � � � �d#@d68<� � � � � � � �Y ' @PKB<�AG)1Qvo% d@�@�?.Ꮯ.I[V8G/ TM܀9@�@�@�@�@�@�@�@�@>E@�@�@�@�@�@�@�?Ϯ*;fw @ <4wQx� @v_:騣VQZ瞓zTin/-`w � � � � � � � � @ -D�@�@�@�@�@�@�@ yFjB-F@�B8X颋{RR @�"XXz ӥjդΒf|?~~ƍOhSnoԬY"o; @�@�@�@�@�@�@�@�@�B (1@�@�@�@�@�@�@�@ zv^{MߣRӦҿ-|s@�,={Y$)9YZLRE:4B{jͻwW\7xC#Gw!� � � � � � � � �P be@�@�@�@�@�@�@�#0q"]|q~¶ @l ԫ'­K/*W@�,B-B - m[i )1QY*YPeކg}֬Ym^zK@�@�@�@�@�@�@�@�@�b&WKw@�@�@�@�@�@�@�@ IHG9 cw)8 c; �R`>i4[fͤ&MʕzJ^҃J]LR#۷ox}w@wF�@�@�@�@�@�@�@�@�PARa � � � � � � �;W3GꪐO(UH4fre �Q*bR߾OO>XڸQzM˥:u/yĈ~ꬳ_| f � � � � � � � � �L "� � � � � � � @>yFj\:|M@�:驧&L5@�HI>\JJ I*H={J?.#կn۶MC ԩSħt}92 � � � � � � � � �$@A<@�@�@�@�@�@�hذaz-ѣ 1]x׿Uƍi1! �]kIw{`;@  nEj.L(,uyauIԸqc=#!}/Įʖ-r -nҥ!9tc=x 2,ի@ΝRG 3M*U*w=\%GN͚5K]tݎ¼~@�@�@�@�@�@�@�@�R .gx@�@�@�@�@�`ۆ͛7?vY:U VX!2 �  'JI_  @  u,/(+W_b˖-Yܹse^'LޠAZJO>>S5jH*Ut/5ϖٳ'e=\ -Mipuk~}%[jW…oꅨrֱ7|;f͚,u- � � � � � � � � P܎09 � � � � �U`ƌ~w5kL]w&Mccg7t/ `@�@ yF:ZX }@� VG`I/[b:aǏ϶%KԒ%Kٮ;^ *To&Mm[PȽ{bŊ2A ֮$飏ۥMDɾwJ{-`SOgjsW_}_{7u 7hJHHø~ @�@�@�@�@�@�@�@�V lyx@�@�@�@�@�"M`Ŋ<xʌمݑ: B�ȫܹҜ9?-Y(;KJ.#?^] >?LUT;8r)nWjU]q~�^+$,ׁG ˔zF @6nFu]ug6lаay!SO=i9C@�@�@�@�@�@�@�@�@ G{qD� � � � � �)w ?~ݻ=\ ˖-'wkM:U'NڵkujȐ!=oBYnWʕ&O<_`^?qO駟-[Fޕ]w܁^ڋUZ^}UY \j}Y͞=[*TPÆ 裏f.3fw\UXQ_|o3 �qRfRE��DQR˖]4"9Y3gԔ)Sv[~N|~h{i=z^y}GS^n_N`޽{5vX/|kٳǍ73mY@8WϒiӤ-[F< &y< ,w?[ӧOWjjM6~}-\vujsڵ… mV\r_KIIuUCլYzžK~Pe ϗj@�@�@�@�@�@�@�@�@\Ů@�@�@�@�@�@�| <^TwXF wy4h_ NtpE!ͭު2eAhn` yPs9xر`<eA~x'-#ofm۶_fH_~^{<rHX5A\p uWx_UΝ�L~ݺuӧAd  �(k %骫  ;UzyҎ1!@! dw -Z_UZUv.m?8ob5Xd^xbY`wEvNaС~}ǶZ@V_eW@x&/T][j{;˼{ȻkdN: ὡf͚\gշTʪ6wq髯pTtR?ӣGmڴ}|ɮvh2 � � � � � � � � � 2 @�@�@�@�@�!q u饗u?:餓4yd[qGxEn ?F=s^yY0r)_d^ҭ,|3gw[B(?3%Jd\d'3fʕe,aA6~~؄[gС~ s[) �E"0qo}G9( |j4B9! .>c#<R/#unjN:n`vNeiz>xPÇk/,j Vغu_HII ȳƍPv"MSDDze}{wJӦɻq<>ce^`%ڜP|6> 懡VT_]m.WV9UKwu8 }l%__??gf9]m.a3 � � � � � � � � @ $A�@�@�@�@�@�=oVڻwoF([޽ٷz-Ƙy8c۰zj:a߿_/ƍk۶m:ucb?_>Sk v>/+--|psKIРAY;^s5꯿]okʔ)kY;^ΘA�@ƍ>[Vʡ@�8{w#ٳ=gu|X[gvy|Nnϻ�mfn`!p8I&vڲs}7t?ƒ%KH)y^IC^LލQ䅋JIw!oOK}:/{zwy'ܚ5k^eg˲UmK,釼qlZ^TLo/QʕOρjsf@�@�@�@�@�@�@�@�@ +!ð#v� � � � � �ަ̓/]v/^؟BAl?p~?o-ZKnqǶ 3h?Nl޼Y?i�Š?jժgyFM6U\b\~}\2e, �'0odLW_]xH @ pT^ +FΝ5|m߾_7xy^6lmݺ5כ_^lnCEtsLN`iDՍ%n-i4c4lԲev{:FfCYXjv:X\s?9սܱ3ׯD͚5˯%%%^x?^2#x>\njb@�@�@�@�@�@�@�@�ȯ�Ad{@�@�@�@�@�~֭?YAs <heAr;믿f^t?^'pww^M2E ~Dn.6@N:i5x`={WϜ9otΜ9{?Y@� C.VfRq4�Ħwڠ3ױGz@8:w>ƥ^O>Y&MғO>T-.==ݿYCn7ZիWkŊmU㠕xP%?҉'JG) "tjGҪUҸq Hk7dU[5D-Z8$,2Y]ΆԽ,n2C1B]t.\G}TKVmJN9 =aI@�@�@�@�@�@�@�@�@ �A!PX� � � � � �E'駟toܥK wz9=h۶w_4/5|p0۩]pnwծ][gu>C"lɡCFzWsa7n *h^(+WEL@�(4]}gIW^Yh@ @ '!rKv!6ΝPdIkU Yf??_38d;'炇RJB1ʖ-|vom\D2{sDW t}DiFOթ֭ ߪcǎAvsKK'u޽{aÆ=zÔ^BW_nr͹s:>#� � � � � � � � �qG�@�@�@�@�@�RSO[oe4cԩ^nvY:uiRR,$.^jMիenzUWbŊ망vnذZB �Yres=_]dn;O/۷o q4i֭[/w!'x,D!]X}֭>hp 2@� Tڒe/_rI#�F;}ْ~1 @Y;--yz7Y8s4o<9'9{gwy/7o/=1kf,s3VU<SM#l+?;TժUݪL[HK_/}fҀjNE euڜ:w*U~o,np Xm+ڜݬf!vS{ܪU+uU־?PY}vxX� � � � � � � � �CUu>vƦ � � � �DwxC80RZD;@�^ mٲE^{}] 4H)))]1?ydh߅-PD[ޠAȑ#tR/_^w}t+"c٨Qt7ꫯ. аaC u!jڴAy klٲ\�.:1cj׮_~]4oW^yv ֯{c[M2'Pٲe3 _o@ǎRk>^p]&͜)/,N*S&=b_D߬J*~bs_wΝxp vbb˜[n2a:uرcծ];yԺuk篌_/Xݡf͚x7ˎgT[nQ޽3ֳvPn]|^xCn31-c4}ݿDɁ5o>}Oގ\[)w ZVjsy'>~&:, ڜƲ{.]:W9PW݆ &5?Źnb'?/VW̪6U~@�@�@�@�@�@�@�@�@�p nQ� � � � Eu!DtF �Q( 6mڤ AȐy+VȂ2?c;ƲeFl7PFw=qFLڝk͚5jΝ;^VŊ @ CImJ,)}lUQ?|9/|^^t A 6\}r<w> H zܽ{,ZjmѢE%�Z1/ ޻%/ R&V7Xj^4f5o[-jZGq! uu8ڵyعvSx@�@�@�@�@�@�@�@�pn) � � � � � )н{,c r'JxW7i$hIf+UtիW?dYRJOe׆ *x[^ �E(3Rf@K@ FjזF.LY3F;Jȇ@nΝ{?ndɒ:cñ+%^f ?&'˻Y@Qӥ^LsY*o۶M]tN=Sl_nkavߺWc*ڒ\~k2@�@�@�@�@�@�@�@�@ �ATX� � � � � �E"0y"9n4L2۷o446"�ĀҫJ[ t. �(0l4ntai6&!PUXx߯_|o0[r3g㧟J))RvDC NdӼ~Iג%KtM7F*lO5mڔD+D@�@�@�@�@�@�@�@�> 5 � � � � �ĬAboXZv@�ȕĉ޽juVB�ȣ@ٲҨQ믗ڴX( \~Zre=|Tti�޽%̱ {xeiΝnj#OG � � � � � � � � @>"� � � � � @x:w?³?� �7N:lz퇭@�iXacY3Ν;{ǽ@ [n=L2't5Kڷ/{yRbԩT[;v  � � � � � � � � �+@dzs4@�@�@�@�@�@�@�"Z`|oQ"4z%1c$/NSH]D@*U"}4,]%RR^ҿ%#ծ] � � � � � � � � �C :K@�@�@�@�@�@�@�r%0~ԴԣGVg%@�|t(]ptmҙgJKcgl� oIIIǙ3ݻ㎓>;xR<6GGV@�@�@�@�@�@�@�@�@�ȿ�]-@�@�@�@�@�@�@�سG0A.D@�"^ࡇfͤѣ;@@ RR>3q"bEgO'EUh, � � � � � � � � @#/$@�@�@�@�@�@�@�@ o!%]rI~ �[W>\zoڹݒ@�B Z%%'g̐vZc]RBm2@�@�@�@�@�@�@�@�@� O ³H � � � � � � �DR~ґGFt3i s&=t] /\ P_`Tt)# 6,&s@�@�@�@�@�@�@�@�@�,@d�@�@�@�@�@�@�@�X03mZ!�.PL 믗ڷ>@h~=,}}t1ѣNJ.6rt@�@�@�@�@�@�@�@�@� 2;C�@�@�@�@�@�@�@/5j$zj10D�"L` 驧n FXh PK_}%%%ye=@  � � � � � � � � �D�AJN@�@�@�@�@�@�@� H`>嗥C% @ G1cN^]:Wg@ C:58muԸԧ4jT  @�@�@�@�@�@�@�@�@�F U � � � � �D5RRZڟ8p@JH2_ߵG �)ҥ+ @?>Y|_"/X hX{@f*t Q Ɨ9OmNO&,}TԽt�c.Y@�@�@�@�@�@�@�@�@� 2b_� � � � � @l ԭ+j?sSS^ҷy� �#0~tR� {|S5J92۱&&P+ X_!5S/LBpFi@iҦMQGB-Srb@�@�@�]>[��@�IDAT@�@�@�@�@�@�'@`� � � � � �&pҷJg}%A~g@�@ <KH|"{A�ȟ@}Iw%]~t[#{ol % 2mwxv*y(h]2 � � � � � � � � �Q) � � � � � Hd݅8/ݻKje � @x}VWO;<c/ �@�䭷_HdS ݽA- 2ض͛_.(PAA۶L6mf̐%2GLV@�@�@�@�@�@�@�@�@� c楤# � � � � �DGJ={J%Kff `@�@�HM^zI2ɂ@�"C >^z w>6  BH@+̦@p/}ZK#GJ'(ը\R6L?_ZJz_?Bm;G�@�@�@�@�@�@�@�@�@ "#"_� � � � � @ "Q}vX� �x}iÆ@dʞ@�!piYgI7,cҳ(y)D U[J'K^*թ#k'RҤIҦMҬYKic"� � � � � � � � � P {3 � � � � � �/Я |%Dr僗@�/0~dAc @ GK-[Jc!G@  ^ %SW H )Dދ͛'%'KIIW_IH;K7mMa � � � � � � � � �@\ � � � � � @XQWt۪tiȐbIB@�(T+iӤ+,r0@�<4j$ *aC6dUHW 3ҽ Jn.Vz$ z| >&L|N}t]"4@�@�@�@�@�@�@�@�@� 2^� � � � � @qB)-)#qx� �xyz@0s@�%`j*µO@ \2x3(륲�_.O?)rJwǁ ֮̑^|Q:\j@�@�@�@�@�@�@�@�@�(Nũ@�@�@�@�@�"KO|yi׮@⽿\sTld � kA^rk? @l 9#HCH\#k[7@@P{_ +R 87Hrd70nvfΔ$ʕ�O>ڴZ5@�@�@�@�@�@�@�@�@�@ @\,E�@�@�@�@�@� ^tiiР?Ҥ .(r@�iҪUw �DR. 7HDGi%y(y%Ty (0cݽ{o-[5kx:=R^~҄ } � � � � � � � � �Y < � � � � �SrRS{RE:p}!� @(gu9&Գ,C�Dc9s^&/`+T R 3R6O6x))]-}tRFR҈RҺu.u(?M � � � � � � � � �a � � � � � Pt=zHժI6I i  � Pp6H'Y$ @X5HÇKK+GOi)yM^B!)_<` sS@ B~oԶ4xԧԩT1� � � � � � � � � �+@�@�@�@�@� T/ `RRRdYt^2AcJJjZ>֔)UDCƸ8/dD$$$d9*UJKN � p/,+' x;`3@�"1B4I>'>w^>jnj5OKK;F8===><߱cG>ڵk뭷:6`ڀ�l>xjeʔnaye~*5mKᏵje^ � � � � � � � � � PXA4A�@�@�@�@�@�,TqΝڱcoOmޖڵ3ٳGnܽ{wƼ[fG;NOҽ{, @H ˖-౜|UB<o*VJ*eLm  �DsI.@�VFV cZ]Nm۶:MhF |:M|A { .`.?j�ߦnZ@ʕMm~[y]H+<t풗ɀ� � � � � � � � � � 鋀& � � � � �o lܼy6mOm-[h֭h nަ8dPD ? , xC 7QFFء =tA. 184TRJHH9shmj|^~YBb,Ǵ422[? ̡x~PF5mY ^ R aS7Z8qcj^Y2 � P_~)-Z$JA}"�KI7 ͚UGE)`7nk6un` 6.M]UmZ \ xj5̏<Umj :@ tvsAfzꌰL3u;f!>hիWl1Ѝ7J/ Β}vb!e=@�@�@�@�@�@�@�@�@� C P � � � � �J`?7l5OmC Z@ZxQG ZxwS[f -ÕWZKAf @ <x-38sڵ^"?u  8#ڲZjf͚ha� @n{NjFj.7k @$ iرRNĉyEb+iSvhn\n#lFA`vs  S_/eVCpanjؼoZ c$W ]Ӱ�s kmdɒi{}mF{luڵk5u4dHi/2~9^>}WzWe@�@�@�@�@�@�@�@�@�($a@�@�@�@�@�ȍ]пj*66o </_޿x߅խ[Wm۶,,1x,[l.@ ΰ w85X@͛-f͛7O6oa B<XȇCXCԍ^zj#�O`N7,~} @ t ]v4ltb;dzP+Vx!}s9v\7`G 5m4`aV7ֳA9F竗V <lZ ivmޅ?/NENqx7nHW\\iڿ?0ukW҂ұǺ%L@�@�@�@�@�@�@�@�@�@(,J}� � � � � 1g o>ў۱cGF{-t!8xM6ӧjժ`hA &yGZe,b an07Ο?ߟ0 7ر,~h 6ǣ:J6n;S@�4IJM.0I@�r'0j4e4rCۆ/``˗/e˖u%ظrJdjժ͛7WϞ=3-2ax @ynzk.VֻI}6˫amFwzFh˖ލ&Jx7(nXQ V+'/@Qг � � � � � � � � �&P»X@#� � � � PD^֕xC8a@ "n* i<~v[ȣ ɳm>XF Y,`$0S 6PbA%6lBr`FqQtuA }1_A8]^pfS| ձ;V:TGc K.cI/>h\dh|6; 4z1 PvC;w (ͻɲe˽KMNaV۲scI&� � � � � � � � � ��A@�@�@�@�H ./":@ iҥ/ 6qƍ~,nݺxwQG PN,Y2-�سgOF(D,_qn~>5kD-Z?39 IIm) W#3[6Mի01 >#uVgЮjZv-Z f<-(iӦhyVG|;?JHHԮ.B ر?緛؍R,h6G}'nٲ?yVtǪ|!B@�@�@�@�@�@�@�@�@�Ȼ�Ay7c @�@�@�@�( &"Pva͛7O ,~'?1%%ſh~~`6s1 GyJ*spE`۶m/!ԅTR` hݺ?V^=ZI;�/wۥ7ސe2 Pl/6/au4V_|!u0(b~#i=~w?~nQKҴ;7oO- π@qػwoU+jSw,՝mV4hPx# � � � � � � � � �a 2@�@�@�@ bBH D@jj~G};wh ;wTɒ%դIY�6XM-\r|ڀ@ _p-XłY׭[N:jӦ?kN۷Q^+ *ІTt5Q9!}dڊXz\z4}6|H/vٍ#,믿֜9s2-bwqO /׆DߦVD~~Ǝ;c͚5@�@�@�@�@�@�@�@�@�B 9 � � � @ ҅ƑK/C,..߷oVS۶m3,L2xZ�ڸq !~?,"%%EժU!N8u8(t~_,trX+/-_.[/.>=jK/ݻ!tC?{'EqaEr$'"Q O1rz3fN % 9'JAwlݝݝLOwuշ{'N5k,^h<<y0z QQQA9/ ;loZPdLLʖ-zAjܸ,t5ҥ � � � � � � � � � @�A@�@�@�@�$H"$]@\e˖i̙={ m|ɂ֭5j Eq 8s p x]p W]uׯ!6m*~⒆}#{1/!H@ǎѣ?$ vE B}!2iK|gK+ZTksմi\/UR%:gsuT$1MXǏw|jy={�ѰaC5kL-Z=؅� � � � � � � � � @F 2@�@�@�PH"^&֬Y)Sˆ~М9st`_+TLLA�8q X`]`,tҲ@Ȗ-[B EK?^L?{Μ{J%JH_|!ul�C*n"8{VUK ݲe&LI&i֬Y:u{`5nϟ?to6Z@شi ڶm/ڵSV'O ,D@�@�@�@�@�@�@�@�@�2�Ao@�@�@�@ "~^iӦi.�rΝ.y $-t�֯_],(vƌڿ xiӦ:v쨚5kP �/&n!K/IwK9sFFI}R2޾x2}Ұam5]rFq(QlYٸB4i|wi=T`͚>} vɓ'tNԹsg.\8m@�@�@�@�@�@�@�@�@�&@dF@�@�@� E rf ?~܅59҅?fɒŅ5mV-ZP#tRCܹsZbwiwGtn+OA  4 Kʕ ݖ hR,Ftz#M,2֕;wx]B /7_Uzt7]vZ� 9sFsuscƌ=<iӦ֭tf0#� � � � � � � � � '@/@�@�@�@�"G R9WDM>]_|Ǝ<ys.QFʚ5kv~!@8p@bŊpKʕKpHH%>ŋ:u uۋD�#wztUwKT) 8O>̙3Uvm'8K.uACÇu뭷o߾BQ � � � � � � � � �E *t~"� � � � �o&RN={v}wG͚5#2 #P@Cƍ޽{/B jժ ={l @blnUHdbN|�D@+H#];t^}U)SFpB="2t-C j֬ ;vh:rׯ   � � � � � � � � �"@d\I� � � � �=*] zJ{ѧ~&M(*it, !7o^SӧOׯZjO>TKEGGg:�'p4ltv@�H_jդ^;vTʖ-j^uf  `s-Zȑ#}v[իWB�@�@�@�@�@�@�@�@�@ "nD\F:� � � � �ɓ'e ʕŋ5fX4trʕlq ܹSTvܵs86._\>b/k۾}4h WoGMlΝ;SGu`{r#G?W׮]Qd b2׿\x?*UhҤIDځ�q9! @s>P=[<8&=Z+VСCcʕѣgϞ.駟c6eq|!5Jѣin6]z n5n I)CbdsT۶mS.]-[BnG�@�@�@�@�@�@�@�@�@ =LO}΍� � � � �… ekÆ 8L>]͚5 ÞDvݫsSLLLPuֹ`O//mЌ3\ǎK~.y~_6nn%ZڐhuIqp}4/gΜ۷~DžXHݯ@ |Ԫ͡ �dPZ$ߟߤƕ,߻wo=䓲�:(SLڰ[ ?6lHv={V۷ow6C?K>u ?7U<k#]|sJA t޼ySO�ŋɏ>(XS � � � � � � � � �i.@dsB@�@�@�@�@ | &MGZtZhרQCwqe̙mFt]w\*T{ca/y[x 7ܐ*7QQQzU|Tiuruy\K/$;W6mO2%jt9rG՚5kdA%^kA3@ -M*_VF1D�O_'t+vR:ueO$e իVn뿅WX1d,l-|k۸0Bqq͍$]z$_H:tP={eL@�@�@�@�@�@�@�@�@�M pb@�@�@�@�H'_~Y<ƍ' ˚5k:*`Vueɒ]HpǶmԭ[̘1CΝ\!ݻ:\x\LL>c+VLm۶؂? 80v[((U{uՅ.^8I@� "#o@ xC4HJ?/W^q!'c:kc`;g0>k Pk_|s#o7o|uIgĉu}ŷ@�@�@�@�@�@�@�@�@�YMa � � � � �%0aK.PnHf|;vO>ѢE;wn.]|K˗k*^ʔ)oF[nUvO 7oƌ[}nru<x}|zw5vXQɒ%+hѢn@o>Wϊ+|MyԫW/n::q^{5͝;uZdʔɭS?'OvwV=ԳgOmڴI_vڥ}:_5vnf?~x9RoiӦϪJ* h/-k@sbϵtR5G7x/<e6lؠ;1v$ؾ}?J*`… pI?ͮrN]W_}Uv+ODzzjȑCoW]k?ԼyI^ϗ/o%dY|Ͳ.,[@�KۥS<Ԏ� >T|c\{X@ڵ|yuc=rS+EmrBcw)y3g-[znulUF w/+7ڴiGy;Ek'ϊ]ڜx_|<{L6l7 tc\o?tO?_~Euԑ3X+pvwܡ.]СCpB5hMbE77Rvz@ڗ`\:J*W6lMҩ@�@�@�@�@�@�@�@�@� 7mB@�@�@�@�@�48{q!Fҽ{wZ7i$G}�{o�/y̙}駟va{)6jHer #,[:u> 6аe˖z;#%b]w !|ꩧg9s9rĵyٲeo]݊pA KŽE}QDadpZ 8/\:tP v Tl߾,, E /ח9|jҤj֬ ETx/5B ]aniD{ŋ'IGUz?�+>` {oݟvOXF}i%kmƍd!VlvٽO?^db.ռN>- b)vOY(d%K5k8{I@�*j*7 J7. HCi֬;w΍X#XEvU`�SC 66~wmj_n]loHx<Ɩ^H@I{@C|]~j˅y=lÊm=^I>a__1g{<`j`6ַ {@Ν;Cl,ns^Ilo.ʜNl}X2kX4g1) � � � � � � � � ��Arh' � � � � N,aÆPNM۶mٳ]ЪU+$h- kd}� Ï>}ʔ)^{ebbbb,cǎV|IVhA 0k,=<cjڴ^N 3ϸuK7TUbE}ݮ^څZ-4<)*U[ӶYE<y\؅m H--`ӂ7,|$Y6m+{! ,];Gƍ]PI=b V.Rw|WzW1gΜ$7>ӧkݺuvZЇ'xYZ 4pt@u]i+^9sW z\۷}no޽{/($g͚ڽEA�"Y _ߘH%}C�HoxIg ߓzt8q C9 2Eڸ+Gؿ mۺRC7B+VmjcA{Sڜm6&bXK~޼y99sf7g`1"3frQZ5-BJ-Rɒ%ecS$?o'NmA6γUW]{͑L<}nm1',\Ps!`j[2\T|s#$'&:kHRc1 k � � � � � � � � � .QPډ� � � � � >^\bҧI<X)w}aÆ֒+W. -ϊtEhvŋUF `Vv/b_0SNy\9rDcƌѨQTV-WʕSܹuIw| UD uq/~zۃ\?9k+;w<4qm޵'/YƎ|]պukwѣGg_T)yl%9ѨQ#w|] дHY+_ug׺w*T ~ %[˗rًv=sf]?¥HjW;|( �d�瞓O|Ҥ8B¥TZ56=tl=ysx�mf:u#A#c/^ܭ9rpahX?-'u NsL`}7^6-Pl-�+eʔqO E}>u M 2kXREj.u"� � � � � � � � ��A%K � � � � @X}Q}ɒ%a#kg}&AtWjܸq+p<xPٲek׮ڴiC̙_~q/}Yk˗/ƍeYC|\H~鿿0?K`B K\mk1t.dҮG0[,-Êwmk{yݠAwu duuY@iB~axiǏפIԵk׀R=zc-\Cn0?/3G@� ||NH=z**@�@K.{Oki=taݺuN c[o|=yk׺zs^sm\썍7lؠywxŔKxY]viʕj׮פdωVϋ@ϡm.\ƍi?㢝`i~]@梼k}{}H((sUVm� � � � � � � � � @.Wv"� � � � �$`A|/^NMJ111W 2֭>^zL8 Wb_oպuk#$P ^b)bt /ӧOK.թS'7v׶ iP/*TȝjΜ9睲D}"E۞Zo,ÊB-lbΝڶmyeX Zʕ+> 6L͛7Wϫ;7bA#7o>o7 İJ*=ߘ_||0I@� |Դt)@�"XCo %SBoc9Ң@#xsd;yY߅e˖-nJݻq~Gn JKrOټO.]4yd7cs>ęZ%@G M 3F #>{뭷ԲeK/^<NA � � � � � � � � �] ȠR! � � � � y ?'|2;g= .Z~ ;vlm9s/4r]{ze_1ǎss%XGR?,Wrέ#Gj屇[wܡ۷nKEɒ%U@8qB0/rpa@m7coƌmƷK׭[7k֬_d{_~/M6.ZjTq+gΜjѢEhj}U޽ԕbŊcǎ.XuϞ=ǮZʅZF8 SKԣGph2mD�,p4q|C$P@�`!/|^?u;n_~YSdX{ cTZ8mڴZjcbo~1o<=7gcݻw~ؘѿ$}_{a6bs(6vFB m;gq$6܈=}H:giu3}]OzwQu � � � � � � � � � fA5'B�@�@�@�@�WtҚ0a>cw}:sLHwfB� f ;zfA Ȗ-gyF~ml�E4n8wWCbfIm s=.I&z[oQF*[j׮\ݾw},҂;-pÊ`u ٵkm޽ǵmǎsomovyŋ,dgŶ[؂u~gZvn?~{mA_|*V(W0͛7͛e!^<y ,(3!b}N<O>]o b>a,4.ضz}QwO)RIJ !k{+X<-T_lݺU7o^pj{i \ߟ?-$C�(eH='_RoYM6={֤Ѽim=y;=`͍7ꫯ҂ tq.?O<5jZlWnoNYȿ˦؃lld%bbzs^{lيK~w[}mo럫 7|z)-[LO֘1c|>y yy{_{vk@onĝ rԪU+h_rR? J2dO � � � � � � � � �@fߗJ_HP7 � � � �!ecR8;D 2J*nIo>sթSGŊ Z8ߠA4tP`!n ó @K.D}`|^`ѢEeA`|N+W/ϟ?߅FGG5j_ԴiӜ9ƍ6YȤ8Z+k֬й5k ,l. sX0z&V֗Ç_Ց#GaÆYF~dv={y -b+VД)S|a#Ϲ ,\r޽ iZ�䫯B-D zHI}.dc}1b 4i~`޽{cAʕK=<… zB{km5f_~Z`KҵΗ/oFPcvs *ϾfϞ݅UZhf( ڴܹsrsi[ bsToOSqJauҼ=R0:tpkPCy=H^=ܣӧŋ?`@vS6.o<=UVnocd{XjU7voݺlLjcG/[ТêT?|ƩI-]v͛' Py' 4 vۜČ34{lu]ά|XyHW\K:YfaÆ񽍳! 0cqٵZX@ZU\_l:-D;ٸ*?ӧ\��@�IDATHl.@q΍$MoP߰(uJ5J_eq=( � � � � � � � � �@&a\5"� � � � ;IA� <yRO? -ٳy(Q"'IAm0h111d q/[k(,̙3nNۖ3gN=,[N>;wlٲ:~ :Sz] $Cg _`5,bݮ`h],s.|RXL2u>׭[8-#`@g ,))a-sk?\h{B1?5&ߋ$i| |Q//@ot'FO\syUV-H :`*٘||[i:5.K\J{kIЈ նno (;o|s#)ꉯ}/Xȫ/kk=Pe|*C qs`<u!� � � � � � � � � VA4A�@�@�@�HS~?i9J`QzR~TB7R/Ǝ`X0cƌ և֞Aa,`ɸaۂHyv ?lN8B5477… $ ȝ;w5[FŌv#4p|aȒWz@R}T?ԧ|GK!olw ^WT)Og]#[-#5@11c/kǎzW|dH}� � � � � � � � � @(d F@�@�@�@�@�X,XnҥzWe -Zw߭+[l!٩voھmʌ*9sL~j퉫sצpH캖(Qc7=6|H@_#<Y7nܨYf]{&C?X{<  &r$#�#0dԵ+!sE  v4nҀ^ 4h׿WժUec;2Y:'%I2~r2R_Hh#G1޽[>{C<y:@�@�@�@�@�@�@�@�@� L'% H@�@�@�@� `e@[p"@l٢>H}Ξ=.]QFJQ:x.lbpnM  9'q _+::Z5j?^z%~0{)0aw[ʿ}.I?~ |4iT}Bк*W\UT H]'_8|9a!LHt]…RZi{9~׈bŊwѣJ. l 2i3g oTP!7Ot!sh � � � � � � � � @ "U � � � ��_kB2ӧegatSǎծ];5k0ɓ'eɟ?[^;s9d %NR̙%KWBGڵK :u ,wjժPKiJb\)ڙCIӧKk&'#1}1{MGFy1a%ҍ6l{˭ԩJ, xb=ZÇo=8e˖!󐙴Ul � � � � � � � � �.@d_a� � � �dPȟA/<9#Ghĉ;v&Mh٢E p \rȵ!@hXhy?hʔ)Z|ʔ)e-\ւaB",{1,/@ &F*^\0gC"=7BBn|Rxzj}71b6nܨڵkKiF5kT&p{ǏtsǏݻդIuEr.첰#@�@�@�@�@�@�@�@�@�@ ! 3@�@�@�@�a{hx >}Z3fɓ]:_DѢEu׫QF.͂! t!@,\Pg֬Y4w\={V 4PVd/UTI>B i4/MߟUߏҦMWfi-}~󯏅  Y( BYbƍ &hٲe*TZl2ѬY3.]:I@ �_[мystMj߾)@M� � � � � � � � � @dב^ � � � �\ /�-!(c駟4sLm۶M^z:խ[-uqB4 R(yfh ,paXzu5m4vɕ+W -ߋq5CWij7E -}w.ى QC9Bݮ]%MBۧe˪I&.@B+V&Bb|'OԒ%K4g{áCt5רE.3gN@�@�@�@�@�@�@�@�@�ȐAfN@�@�@�@�a lݺ}1|޼y0ep˗W͚5}A5b!q <�z@ ;wN[lqA˖-sK?P<yd�[~}ޒ7o[&ߋvEhOR,paWJ@}ƹ)jSJZI&H]ylqʕ+݃%f͚% 1e]` kԮ][  f"V~&7nܨE.6piUPA7vXxuc � � � � � � � � �$E Ȥh/ � � � @ET4x=ŋkɒ%nM6K*kVUTqk{m_*ϖ-[zjjaVr:~>gVZn@ʕ++***C@aSX .u.@Ȱj<E }ax*/Zn ZFʕ+}BmЭ[yZ`[=`tժU=\–%KZha#kˊ+ds\r׫WO4h^K/ � � � � � � � � � EA^D@�@�@�@�Hp 矲/\2vYvN:,Y+W_kƅC^uUʟ?ŕ%`+;w/,\[v,PVzRR%Z%A%ߋ%Ki%С|I'9)nij]qt]oĽO8l=|,[̭W٘ Nok|BB¡k4 խ[޼>B O>9rq5TfMϔQ@�@�@�@�@�@�@�@�@�@ q 7b@�@�@�@�0axh29ؗ׬Ymi`+eHo!!111ڱc6oM6GڸqN8饗 MU[Rxs!ߋq3j/>D3*o}`Nu/K}JKHժſ_}rZjUbvr]P{*Tps6P\9eϞ=ܺK{HKۘ{胅='O:J*BSZJ�B"f'@�@�@�@�@�@�@�@�@� 2N6"� � � ��_+HHٳguV 6}o. 'O-[-Kօ A)zsNm۶-3agf˖-cK.q˗wabzז.ߋ[g |ԯL赏!Jzm;'5j$>--X EEſo$|k.` {Ȅ-^ݻ]|�g"{#xk{(G bv_xQk? � � � � � � � � � @p '!� � � ��_ A3Q3gθ; ž�oxX޾}b[={v,Yx*Vl]hQ~BAò ,oB-[~%YX̙3L2P-\rn@$ b$^ՌӧM"E3N)}r2q _5kե7ߔz(}#ӣG>X,8K9K пbc*'(Q-sT&valmQloo~ooXAR@�@�@�@�@�@�@�@�@�@ m3gA�@�@�@�@�!Y|nYǎs;v쐷X^l ĆB%3.\T$v TB\@F ! u8x vR q{ƾG[?[]TT,xTRS:w^[  ) �!Uٳo J@�TIzq駥o/0|ܖ[xc5ra'OVJ؃%lYv&Ogѱ˗BzJX-;KRJ)Zbbs�6߳g[qhNPRo_bEjʍmoA6?`s@�@�@�@�@�@�@�@�@�H @�@�@�@�@�ȕ+4 /mV^K111U3gPH dAq-痷ؗ)+pYYC\Ĺ.x =4zWiӦ.BD,X ɒ9(|Z�\,0rSEm\[@�JÇK?,û9rȂl\YX=\{ك&쵍 ! =T›;_{s7o^#C쵅:y�>z_쾰 yn;Z@A�@�@�@�@�@�@�@�@�@�qh% � � � � @ XXW^閄f~ /_miӦ@@ .,YfU|\0mɓ' |ܹsk- ZhEL.< '`'Np=zT#G\_>Z?wEٳg5X zWN:.Â>,{mv) �S¸:vz� RRi{p>[̙]H_%.:u=H �Lxmms 7n %**{B Ɠޜk+P"7~9Ǐ�1ś17^:><yUWaÆ^A]g  � � � � � � � � �D�As-  � � � � @ ؗ@ga^`-D0` aAa`ӧO'xJ 0H _l?\lٲ)[d&, Ιb}opL go֙3g[fq-'O-^裷,@? (Ynx!{[[@mP@�D`vi|驧ٛ}@�@R҃J͚7 N_{_~n Ƹi` [/[lќ9s<AժUޛG 6!޹m,oc] {xsmk 9q | xk{^b*o>6n/^`N/[[�S@�@�@�@�@�@�@�@�@�@ q==G�@�@�@�@�Q RD @8v옎=/ 9u\aQz ^B<;WՆo $Z[C|),`,, /mX؅,{mmHʱ �I1Bä-z$#� 2ޒZ?RVGLƷEuM6l/aÆ|2dnv迟˽A6o ^�/,?< J'+^ h[O|~N?`^{sR{[l.6jxko ~KA�@�@�@�@�@�@�@�@�@�R"@dJ8@�@�@�@�@�|%6rԥtPo*C�@ :u/8ݚ@�2@һJw!u(pCn_>6�򪫮W_} l= m@P+= � � � � � � � � � Zq=Slԋ� � � � � � � �IؼYZD$ �EG[^R%@`ݺu֭*U˗kȐ!Zf_d Nǡ � � � � � � � � � �A 2ȠT� � � � � � � @ 5 vԇ� @J2I1\kתk׮\VZCv 5!� � � � � � � � � �)@djR7 � � � � � � �A Ν,YPU � Lc>Jf%,5knӵ^իWkذa.�Ҷ�,RB�@�@�@�@�@�@�@�@�@�U t � � � � � � �$,qrt ǧ �@ӦғOJIkצ39~gu@[N}ЫVr2eʔq= � � � � � � � � � Aţ � � � � � � �/RR&Wz� Ttɓpk=r-Z6lؠ#GWm@դ � � � � � � � � � A^l@�@�@�@�@�@�@�BF ;u2g&@� .%4tc׿fp w;w ڬM6iԨQZbF�d@�@�@�@�@�@�@�@�@�HG S#� � � � � � � ֭ҥ?%!� eH, (_Xaڟ?ha|իWז-[4zh-[m#�2Ү6A�@�@�@�@�@�@�@�@�@�$ @�@�@�@�@�@�@�Q ֺRYm B�"wԧdŔ Xcǎ]�5vX�iL'G � � � � � � � � � �"@d\)ډ� � � � � � � Vj^ʚ5u#�oK_.~tL4:tR߿UfMo?~m!<� � � � � � � � � � A20#� � � � � � � _&.n%9Gs  �i##4|z9,/M7ݤZjiϞ=8qm/ڎ� � � � � � � � � � 4  � � � � � � �QR<Rir:N� @*V>@z-]MDh"mVu޽{}Ns � � � � � � � � � �q ' @�@�@�@�@�@�@�H_ lNʞ=}@�D;$[zv 䈌… u7nݺ:p&M$o[ � � � � � � � � � �q  @�@�@�@�@�@�@�HG}9sΝӱ@�$ TԵă#lu֪W<ɓ'a]; � � � � � � � � � � 2h� � � � � � � @j L e&jgn@�++4bt;\j7oV_=S.} � � � � � � � � � �/@ds@�@�@�@�@�@�@�$0vԼdZ@�Ire^L sU-ԠA?~\ӦMӜ9sܶ � � � � � � � � � �(@d$^U� � � � � � � (Աcv#�dp>}]=]"cپjذN:ӧ=w � � � � � � � � � �) 2%z� � � � � � � @L/HJ WLu �AR Iѩf͚f͚qƊ֏?(o[5 � � � � � � � � � ��Aa|h: � � � � � � @ +կ/.y}G �G wnii"#3g_&Mܹs޶%=A�@�@�@�@�@�@�@�@�@�Hm S[@�@�@�@�@�@�@�P &F8Q! @�REz=WSC4mƌ.B O?� � � � � � � � � � yA@�@�@�@�@�@�@�O`,ckgF�@ #u*!̚Ӧӧqj֬fͪٳgۖ6-, � � � � � � � � � �(@d$^U� � � � � � � I*Iˇei4 �q $(@Ș8w ?6l͛+G3gm!X� � � � � � � � � � vA% � � � � � � �*0qԾ}~!�dTܹ#ŋg mSAjѢrʥs-u � � � � � � � � � �$@d8]-ڊ� � � � � � � K6ImFl @REz=פɓCbʔ)_ZjÇk^ki � � � � � � � � � @ W#� � � � � � �DĉeI]ݡ �\$ЧԽԳsEˆI&^zjݺeom N� � � � � � � � � � !N"� � � � � � �Ai#E} �)8P*XPv)::^uՍ7kOA-Zp_(eRX;#� � � � � � � � � � �_I؇O@�@�@�@�@�@ ۧA]vz7BǏW2e4uԐjA�=s,F@�@\ȑOK^SڶmcǎzoYYd 5`�3Iǰs)5"� � � � � � � � � @ zԌ� � � � � �(p9W4c }w.#O䪷l٢m۶@�2忟j^|� @dT,ԿeL2aժUK7t+%KjժդI_ \_8ru%Y`fΜ8 8ǑZ@�@�@�@�@�@�@�@�@�@ mL[oΆ� � � � � �A>}^xWS tW# {7S# @D XVR-:� @{Kzwپ=RqTfMuA%KԲem+Q/FPBʚ5$ӫ'r@H1! � � � � � � � � � @: N@�@�@�@�@�'m6uM111dΜ9uCI@ Ξ&Mڵ @�RYbŤ.]3gwsiرQ:uҥK�HVz-[VJr-;v<z \R � � � � � � � � ��Agϙ@�@�@�@�@�@  Tuwj{mڴI5޽{]]wݥŋ~n/&O޽{UV<xy ۴i~ZrDGGkĉ.$$uֲtmK'Yl~mE,ewۇޯ_^>>cc"?;ž}3کk׮?@ |h~m=B�@ !K.VZZ3,�r.o4._mVE%KԆ k.eϞ5dY]60`Zl)ٳ'> �F@�@�@�@�@�@�@�@�@�BT 04 @�@�@�@�@�(I&Y>S.\X~,Jܹշo_vں;t嗻;GU9h"˭,w=ﯺuĉnߛnEZǷ4)ShjР۞3gNըQCs*i!ʕsvΛ7O;vA_~Y,ݻ+**J&MR>}gyi˖-TT)=S.X+ݙ �#FKKW_1]# �,P4h|c5i̘;oG 5j,[nѕW^+VmUV=o_7*TP:u4b-Zԅ̙3n>Af?;?܍+zS.�)@�@�@�@�@�@�@�@�@� 2C�@�@�@�@�@ C<=z;b믿ƍkȑ/THURř-[VM6u<J*i8p^}UYܹsb-Yfڰa_J$7oެŋC.B(gϞʔ){1ڂ@2}tr%[ng@H#K,nsVT~]Nӽ[{8ЋT J"UE_V(WłrE lAEAz^w'7 Iv ;;sw&a(Zyc @0AJ � ^^z77K>lhaQQQ@ mtټncǎu[l_|~ ү_?6Ǵ/-<ynlY |$@@�@�@�@�@�@�@�@�@�F Ȱ9Ut@�@�@�@�@�+dhܪÇaÆqzUW~iT^]3ʆ zȑ:~ڵkuł˗/={}/a~Γ':uիWDŽ}X_X#G*{Xz?%[lK.U `^zi֭3fl߾}4~YB(T@�رC=[篻@�@l^}:ʛc'NhܸqQnFUZUO_>]x-Z:~]r9rUT71yH<ʥD% � � � � � � � � ��A!  � � � � �%9nܸ{|r['{̙3@-[g{i[d\R}umgʔ)vU7ZyzjԨvܩ/-5k֔=&V#FPѢE5tPUXg߿L͛geϞ=jَ� ' .<A@�My>XH' -�>roA�i۪UAIl;vKgϞ=?Xb&4gLl_?Gkϑ?|`� � � � � � � � � �$@d8-� � � � � @L:5(K()R$ə3+ _V^)ԩzO>qÇ5~xeɒŅ;["O9 ǏWÆ 5|u{.dgg<x� n^^t3$� Y T .y+/X�1cTzuuEj… ݶUodzx5n8EEEɟcZrҰa΢6 �x>뉺@�@�@�@�@�@�@�@�@�5 C@�@�@�@�@�"\`qfϞ_r%ns9r$~I+=@ӦM#<t/, oFOŊu]/ Ow,pT…5j(/d,?W]ycwM֭ @�#`AZ0@�U}{;,9ѣGZjڵ,n>ukSZ`.]:e!ѣ1y<@_u� � � � � � � � � @ zִ� � � � � �I\q믿駟9a,XP?Vxqoe!/֯_k{a_CsղeK 2Dwu:wnm۶!byUҥձcGCZ3f^>8vXmٲmkK/U֬Ytq5kLO=[&MTlYիW �G˞UW11@�!V^�dխ[@9R+WFqƩdɒjԨQ:{۷?۳gO>k׮uw�{EQ � � � � � � � � �'GO^ � � � �&RTTڹ �#5cǚ3g,P^Њ+dsw}97KeaO{wܩ5k(C :qzY}�ټysX]7|# ~|wUzuivԩS3gNթS'@,Yi&]_Bk?`_vrڽ{.b :TGʕ+5b]{z\6m5k~WM8Q[emS@ x/ϒ^$/Wg_G"@O܆Oݯ(Ԯ 5j:uիzamGT@wׂ۵kVZũhѢ/%99\lH �x>+Z@�@�@�@�@�@�@�@�@�} ~7! � � � �g&`!*^& <#@ -xcg;vh…*U,h1~F x,] 1ǧ}omZ/+WέO{@ݫ9r fܾ} ,oSZ-@M6n(k?߿E/_>N5Vų` l)y@ �ck:�G|{os#GguA]t?K+xA;H͛7;Μ93&?-P| z@�@�@�@�@�@�@�@�@�$9= � � � � � @(P5k`,<1DA/B <yr@rB w֬YC\TVSa @8rD:Uz3&F� XP�ia]vՄ dVl=HI5ji ?2e8QH|ąH'@�@�@�@�@�@�@�@�@�H S�*@�@�b8A��@�IDAT@�@�@�@:tpvFQӰa"`  ӥC/2J@�b X�|{N֭Snc\rws]doo/͞-}.g ?`Cͫ~Aqy^x> � � � � � � � � � `a@�@�@�@�@�@�Z@^Һ� @ +LTk@�HscǎiTz.L˗/w g$#-~{pyf]|jذap* | hT� � � � � � � � � �!.9G@�@�@�@�@�@ *Uq7.@�~I^ �D@{zqF|zG@2(^\=ZjRz {uX;+V̛2M( ?@4 � � � � � � � � �@Tm@�@�@�@�@�@�@�pY/p� =aÆbŊ^x=jժVX%7G7zJzA@�@�@�@�@�@�@�@�@�@�O k@�@�@�@�@�@�@�0<Y.,L@@�HB  ^n@ڶҥK'qt?Ԣ%ܙ~|� � � � � � � � � � @ g!� � � � � � �+~W NWb0 � z-UPAڴi+WmJ:g6rtԽsT� � � � � � � � � � @&4� � � � � � � y:zƍ� 9|ӧڶm m[ɒ%:cᅲ jT� � � � � � � � � � @ j4� � � � � � � ;vH G�ҋ@.�Rvj* .Ha^r&MJf@�@�@�@�@�@�@�@�@�@�Ȝb5S1 � � � � � � �:ƍl  �a%pa 6LΝ;գG=#*^xO^Fi<hTk@�@�@�@�@�@�@�@�@�@�8g\ � � � � � � � @&OjԐO� @H :tHʕ+~C믿ܶ QFr:uF�@�@�@�@�@�@�@�@�@�@ 2~! � � � � �'ݻ3?N0!٥n �,0eԤI8#�D@2DgK?-yJ,5j$/=|vPg � � � � � � � � � LW � � � � � YH7 y9"֭n"2@�Y`~i<y@ <�o>y۷)2 jIo!qt5ׄLH<H@�@�@�@�@�@�@�@�@�@ ] dLףcp � � � � � r']w9_Wչsu!� pӧKR&g]"� *�9h -[VO<vիWmcvԭeZ+P@!� � � � � � � � � �))@dJR7 � � � � �$(Х ?gBn}= @�2E*_^*^<Mo@�"GzUL=S]�m+\pHCT%=]sx>  � � � � � � � � � QAFf � � � � �@VR܉%KC)[@�M 4 ^_@�Hؿej[fPBaA#'ҥE'.@�@�@�@�@�@�@�@�@�T #3n@�@�@�@�@�PoQuB1K>a �)p4sԴix^#�O  }Y~.�Ҷ,X0]4|4xGa0"3h@�@�@�@�@�@�@�@�@�2@�@�@�@�@�@�4G |L( h'lC�@ <fϖ4 k@�Xlz$;o> *Sy@6! %wtҥa<:"d3T@�@�@�@�@�@�@�@�@� � � � � � @* 4m**$m,Yn͊ ;@�6M*\XP!A@�BX`ժU^pm߾ AC+W>{믿_~Y^`}ӧ?S I3gJ۟\w^8&3B@�@�@�@�@�@�@�@�@�8UBy [@�@�@�@�@�@ 2du,1v9vL9^#� Fհa �5k\])S& 0 NG-�gU2e/3ϤH3?XڲE3oBP!xR � � � � � � � � ��A)NL � � � � � >ZcRT~-F�@ f 2"#@�BS`Æ .r۶mv˘1c|rٳDžBZ�At}�H ̟?h(HQG!CT)դ�R@�@�@�@�@�@�@�@�@�@ D2h � � � � �D@:Gl,R0p� Q6I^F4a3X@�Tؼy7n-[�H̙3;Ђ ܦ_{V|]"bݪԿ _u\"ba8HI � � � � � � � � � pNhF�@�@�@�@�@�Q%/ĕcǤNαBG�@ f̐2zu^A�k[M4ƍ@ڠy)S[n^='6]CQxV � � � � � � � � ��A)%K � � � � � , ~>JU&0vB�@ l,Z5)w2E�q۷YfZv)!~3{üy"rmạGwv*@X&:� � � � � � � � � �A 2HT� � � � � �g'PTcw?:8 @�P  B @ ,ܱyZjU!6cǎiȑnp_J`Ai8^H3<"u � � � � � � � � � @dO@�@�@�@�@�HyG:x`Ê:tHołFl[tt?:ĉdx74eݚ7o2f̨ 2,>SLʜ9sm˒%f-[6eϞ-9rym;<̙3fmuQ@�W̑;,!@$ dڳg/ض6IhNbK/j<bs ?ؼty*_|ʓ'<A-lٲӆ@x F_|P#%o߮M6iΝn0S|!s+^u̙}t{c6ϕ+ϯ?߭uA/dɒ2C3 � � � � � � � � � @P # � � � � � G` ~PmKpG[,%b~/k m/(1E7^9aaXN^ 4IjLbs>e ?%:v� /ʤ -@�{[j˖-nm6ˎ;\0_/8XƄm?U\c~xdH{m-\2~7+6/9B_,ĮPB1K…UH+V̅'V.r-Z!o}5j|I+W.#f{oI:IsJŋGSt3j*-^XK,ъ+~~vbs< V%u[^cmYjm|]޽1!K*ʕ+jժn-  � � � � � � � � � jA? � � � � �x|}8A);wtX+X\-Z4NСwyn{gUlm4DVAO,%rK ˴s|rش \1o `1._[ȋ-v̔� ~f͒wtw 0 5kָ b7nXȻ_,ѿO]p^)~ib?Zp\Z6 ,6mҟ^J? nZWK(4 [,|y-X e~У?~+2e_>Iåu_~̙X(5sL̛7?v5h!e˖UӦMcK( s d=]9|~vBecNkѣ]hUb?,^zjР[F=-/"� � � � � � � � � @*d@*C � � � �o5n [Naa(z˖-.�ȑ#q@B ńk 9ȓ' aSo&`A7b~ g;;^ZЋ i,{퇿eMШ~1NF:JϞҒ%| }pO]@ʕ+/Vիy{AvOkᆶX؂-8.GnݺU7ovAmE 5/kvf\|yըQCWڵ.(y4hPdӦMĉ_4w\7+R5U^_*U/7R%ލŋ]�WZktt{ҨQ#]q+]C@�@�@�@�@�@�@�@�@�"C 8ό@�@�@�8"3`BF`۶m.łPlYv֯_-�҂9sfa~🅢b(~8e:0 ?m/ꇃZ_,ǮRJdɒn]L-[6fə3;kH�@bx\WR  }޽Z%ҥKemWP+WNeS[J.7ePVs͚5ni!isO?p@Uz.(8)q>PM?^ᆸE;~o5i$Y`[h⥗^G+WAҼyd6_= ԪU+eϞ=/Ə� � � � � � � � � �),@d S= � � � @d 'EEM�[`ƍZb[,t^aBO,BKB1cZ\,|X۷/… +@ ו*UR<yb~+!5ܹCOMF�q}#wD>gfh9r`*U^4fۉ'\aٲe.K,qAeV˧5kN:][y9i^Ҙ1OisBU^*8ԩSUW]-[�H L5k~G}w1crʥmzϖd|9Gz< @�@�@�@�@�@�@�@�@� 2=@�@�@�@�HR�*0 Xj ΰ� [.]* ,ł,Ŗ˫lٲ*S[F& sNY-vb^n:RX8=ժUSe"U zSu  ݒl]F6Mc �^ vgӧOw3gʂ.]֪Uw"=(0` ȅ z->/^cǎ/X 4PÆ u饗FWѣ�-48hĉ2d+ئMo^[vϥp<~'Z '|~M-ܢ={g?8&� � � � � � � � � �)@dhz� � � � p=# #aw Ę? ɰ`C) TRR*WupDਗd_R?ԂL-t׮]n jl,Y(&g/qd{ONy!R?=@ x2e~={xwTEuSUn]v<yj eÓ-RJ^0bc5o\]vJ(C J߼l}yyZb/hҤz R]6lЈ#4|p_^_~xx� � � � � � � � � ��AgQ � � � �!.A!~zi*KbYf/ΝիW>Y(^͚5uEz.jժʕ+WMh",\P ,p~5kVw_%X(-)S`wHSӔ?b>i̓K "bނ}A3][]r%*W\) ӧOoɓ'ǹvJ|עE ȑ#"{?2jF^8t)DHT~K/իW/]x!ѿPĉ'4akw C) � � � � � � � � � Y yp� � � � g!VԩS]Z,]TK*u뺥v.�XbiYZG ?˗k. S̙{*gΜ`H K]xPӰ4 pxԐ@&tJz_@�GO?>L_l٢%Je˖�? +Zh�SkiӦkBE͛lٲ._뮻N NWrțرcz73ϸs~bPL= թSG٬Y3@�@�@�@�@�@�@�@�@�@�O H.@�@�@�@�t) A1( `~gܹsAjԨ6lzvkH@@+VЬY4}t,XV,Ƃ,"_|+ xʛWze;Bt H5qD=څ8puڶm6mڨZjq~d l۶M&LЗ_~) kxܩS'o^ HΤPKwwVʕ}?ydSwzǘq>};W_U"EP3U � � � � � � � � � @)gq"� � � �&^"42\%`w߹e͚5*X6m,Fʘ1cc'8͘1C&MB";un[2_BX>9k˗K+K.y) FE4|p}ڵktA7paitEbGՏ?q^s5| SLa˲}TTW޷,СC۷|M]uUzWTR=7롇Ҟ={7]_ � � � � � � � � � bA ; � � � �HoAQҏm\g}~Ʌ<6iD-[tK K?Ç5eM8Q?,XB:Hte)k֬!> /FYO1%'̙mO =}^{5M:U]tw.]H",H KL|ݗ3-ZTwyzᾤ! tMzޗKHO<!=9W&,[Ƕl٢p”= T~oovٳgOF@�@�@�@�@�@�@�@�@�^ Ȱ? �@�@�@�@ !и؆@$ RƏ#G_U…u׺+>J7ovA0?*[l?tMj֬ n җ~1r}j|�+REA�#G4|p 8P[nUǎu]w~ m6lo߮nM<J,};xy~[{{V4jժiܸq ªoFݺuSr_'#� � � � � � � � � S @�@�@�@�@�@M}"EKUVդIqF :Tmڴ!u9 +VL=zpa2dܹS[VҥOL @h ,\(/)Do@ <?,H޽֭[{8ˢEkvzw4e/_^smV.^US'iÆرcu5ר]vK4Lsgf͒}%\~wnh @�@�@�@�@�@�@�@�@�I p:[@�@�@�@�h}ᇪYZhCi.<^ӥ^ 2DD |;<xϴeW_@ۻ=G�N/hTS@ ԩSUV-=.\{͚50` *W#3gV.]4|}GUB+p)o-.,EEIG~?s޻wo5kt:졅yyn.ɐ@�@�@�@�@�@�@�@�@�@ A*@�@�@�@�@�#`Æ }nuʘR_ _|뮻4{l͘1CٲeSƍuk!ZD�RP¢/'2t'pa}j֭֬+W'TܹXPd ؼ?s=~Z5 O% w~9sԹsgS F@ ,'yo6md) � � � � � � � � � @|l|#� � � � �ի멧C=k׺… IhRNFUVbŊj޼ڷou֥\Ԍ�eRt4AHNSկ___}~Gb֧Ȕ)-YDwkر ͷ+KÇKKGfۧ:I&zCaҫ@ [Q (o{|`TI � � � � � � � � � Lg' � � � � �&gu]_:vޫlٲP&M$UTIYK5kԖ-[ 4diF/BPN߯?]'O&ҬN;?*T4P2.Y/^Ç0X&) @ ,\(e,U# gVFTX1-X@-ZH&#407oڵkkYuѢEW.]/E>}=$;>ԊyݻW#GTƌٸqիMq^j}I޽c.LK.߹)W[:uTű � � � � � � � � � zBA�@�@�@�@�@ m,Y sBO*V69V׬Y{O;w<nףGjʕi&?~*J䨭[~7| &W-%C O,ȑ#o߾ ~n՝ʼn'n:wmY8jjȃst_kܸq^Jo+GiZ@�TXdd֬0!@X ,~Ylʔ)S?5400J?n5_?#Ν;+z$/UKyF/曲B FҸC/9fB壏>K/&M /\ؗ1B}ϵ:G�@�@�@�@�@�@�@�@�@�t$WP@�@�@�@�@�pXp7jHӦMS8@oUfTΖ-n6 ֩SGݺusUiO?z*%hŋ߮*U$OZ| v"-ƜRmvAsլYԶm[RmQ/ YZJ@ w׻{ 4Ԝ>Oz ;z뭱9uTTy=4iRȏ'ucJ[BJ,):<Ewyg_x1h 3Fk׮Y4c e)�"� � � � � � � � � @X N#� � � � �-k.]uUke'Yf vP_fKH1T௓ӌ$tYǏOA'%=δp&L+WN'O֪UԳgp2}D�NX\\l@�b~i<xPR{~aH6=oZCҺ}sm]vu_̪SbNA~ey =zRNsx]wVd(ĉܻaː!̱TRnɕ+W>|ѠA"F fԅ� � � � � � � � � �a.rr4a> � � � � @ <#ʛ7z-SѣzW4eYVvI S֭[]? {gUHM6MvAQQQ?Ꮏt%hΜ9?~,hꫯСCl2r-. #Nc_wv[ɣ&k:o)K,*]bA&Mׯڰ~Z8_-dcϵi&y睪Wg}Yf1˅}&g};~Ν裏dvM.]:f1sL]zׯ_nƌ9r;dɒ|w1Ns~31w;m۶U sizwzjYX=|x Y?]tE{UxqW믿W_u嫯\^E遝3[oթSG?Y!D^Xǎ ꦛnW\"= @'NRT)}"S`Ϟ=nWKS4~m1m.;wnYp͏bs�ɹ=];({^Zn޽{Ht /`s'ټn{ƍ1c\nnX`Aw/Yj7m>kqƲ>͑,H҂G1MVqejܸq R3miSysj{uϴ?|N6mWivĄ 4|pĮ }iDb?IoOWqUyI6] ॗ^R%)ؗس  � � � � � � � � � d_F�@�@�@�@�@ 5ݫ?ЅY�E럅_.<O>եKSzei޼y .[ouXc]/‚,~i,p.B/,k׮:p<~ww\?,#gΜ.̣}zg}I&;w>Yĉ -B,łB,$rYh?ZG ^,U,X^ӂ<ڵk$tm'TYZw4-т#֯_La裏�R. #m֬.b`aaa!~>}b!7i/1 s`1.h\Xȥq~wz'e=zṶ7|ӝ[˖-]]K SZpL \O(kR  uґ#RŊvt {VL؜ea5}-[\�#\3H=<'kf)|nfgvo{_|z>9cb x?حr.@B˘]S>@6WY@\ޯ\҅@Z'{I;vp7'6p*(VJTn5묫9Oe˖Ϲ*8ݵkלz3ͫ@B?ə&VobHv6~/vƌ{aRؗ1ؗkX�%@�@�@�@�@�@�@�@�@�0 @�@�@�@�@�RU`ѢE:| HՆ٘Yx/ܹs`= ~8q"N-Æ sDRH`>۩jժqpZjl-J]H|޵3uԘ}8iSLѬYt+k֬IhΜ9z饗/_>UREv[,_uYdqT m]t;-TĶYԨQu:~xqMRm'ta„ # 駟ܹK+3gԴi\Hٳ6m <n&r-.8\6m* o L+v^,"SLzJGMrJ ;̑#<y9η]tcRjڽ{Byzw\~\�Xɓ?C:jלacuycחBKtHR`x}R@�{(ʔ)sʽ_;i~gϞ{㏻uRsgq+o2 ݶ{xX7n\ss`6/ .PcJp=z&MvK ,`~֭n}![ 7467 byT^QQұcim۶y].I]Fr_`Zx\ZXG&3mb^wuAbw^}UϮͳ-$6s۷Tԋ� � � � � � � � � �a&9Kw@�@�@�@�@�H1o ȳP X^tt ٺf͚1oWB-d$S,Jɒ%uy~6Gn\�XH㙖zK%J;B.XP듅X,hBWX;MӶm[թS) 2~XG噴&?|Qe,fkAV,lǂ׮]n\ 6t?*駟o}n] kzq-zN3f٣-Zf㷰G ܰbرceaJٯI&yH3% ]Ky9skX9Y?( �~={\W+5! d(/lN%6g.@޿?wt Oj{^?%N݉hժ3)7vs7 {@ҥ;W^1$5EJ߇[}{vnlja|=\-o޼əߜ0Ω9Tb~o(R{\* Cs?{BHc̞?>~)ԬY3͛7n//P@�@�@�@�@�@�@�@�@�@�XLiaG�@�@�@�@�#PZ5auV,k(h+ 78)SD�9sDwJ ܱcʖ-g?l_ۇ ֋/M*W\.d͚UwVz\J֭cm;9f˖<;vm_r[x+˗/w;@5k뮓E:t}vŋʕêqРAw8&l2ɓGgώY,Y"3۷oB6=ᇉD  #RRKfΨn f{K ^{Ng?т>QRs&~8홺}.͂7mڤM61$5EJ߇[W_-osߺ�x }|w]o b^&g~s<,X ιT å^FNFc5SP!ټBZ]s&3&t| e˖Ж-[7ov}k� � � � � � � � � �rL*��@�IDAT�A\ � � � � �*`at]vտo>|8UN1 wńXѣGi~\ڷoBϤ~-Hȑ#j:tЄ ?{.%BO>q~,\%ȄI1粶 +SNSM%"Eutt Q裏dsLl8$?["{H病lذARcz3gN4daիo s=!:�$Wr+VL�)-`A\H ul̘1!կ؝G+vO<xPws&.]#Fhذan_Z}$ԯԸGB3Ϩ[n Ac'g~XRjM8Q_}J5zg=t!E:5jEN\7 \ǖ Wb圶ϝ;W˗W9ΩF�@�@�@�@�@�@�@�@�@�#@d9@�@�@�@� سgNX*/^ (]vi1ݲB ٸqc̶^"6NX'Nh}W'_N:r@ |O~ +V'?0vSOǎ]+Hܒ[T 4pM<9Ngv/e7 VZ4ivܩ,Tț.}b'`RkJB}u$2m4=# |o 랂�A_5 ͛Wwu p5 +˕+>c͛7/YWuֹsϛvb?jw7Bc{lb&=}j܇_uU*]^~eٮ];o߾t_}!Ao:mJ7 YG~ 7k7۠֫~n?sm6fv+ٳ  � � � � � � � � � KF�@�@�@�@�H5AGr=jm'ГO>vt뭷\|*[lqfÆ nnԨrέQFiĈz뭷3ϸ},aڵ.\6V,d/۷ow/m &@?`tkۯ?S>f?G/裏jܹ}g ̴B-p@y'_~nYf/p#9m[6mrUm۶ͭon/<(\َNi-5\B-XB(b t޶Y o>>eժUS|_v.\؅ryYr>͘1^r!.fka>쪴kdҥYbVbҎ;ԣGw=?^-[Ԑ!C\PΝ*hڴ:tht~ �5kJ;;!@*x'/ZK~6pݻ=dms[[h}֬Y3=SI&n^T^$�ɹ{>\}[nZJSUr3!V[[`oFQQQna|ʶۼ0~[numd̘ۼBW7nw%7K>C ><zJvFҸq'Cgio~εy睠I2Ķ'w~ +$k؜8v:u4hР9k~'x̙?}5 � � � � � � � � �DM@�@�@�@�ҝqݰN`ŁJ*Cb|^(F^x,ȑ#G`/p xa VX#l:ܾ?  x/!PP@^^b OqX}} o/lm˛7o sug˖-k}B iӦ%.::녺c @.]^0I i L<9`㷾ZJ(1E]XfMȑ#{m{*/P2z)Ȓ%K+ ̙3'PLs%I$Z׮�W\YE\rI~ڵ صfݼg7xmBR^hB*Vk/8Ɲ+<! ^DJ*O2e jʽ)^@F`ݮ /@]7j ǝs/ǝ+a65k y/L]'^peAҥv=R;vl}.PHIGŔкW@+�!"M5Hguc…/;еk׀ݫVI x!1s/Dgiə$tؽp{ ij^P)ǟn,^p)/ijԨK,6lXnݺnbv^mv\p/>͛ʕ _]w忍Yn~S*=+ NޔޛɜSVr~;(Ů$k6;+VwرI̞n~{zc+ӧOwwg[lO}Cڞ3)/(6fc_ FB�@�@�@�@�@�@�@�@�@� @�@�@�@�ҕ@ ҸqRTTA ] ٳGw3;N<[4ءk :npٷo./ŭwu 6 "/E^e={ ?|0Ayncǎ.?c:;vη.V| Tc,Γ(/F^@)GxZdzB8씌 vyA!{A1nR|S޽兑?o~k %&M76oMTeKD w W_ڵk Ŗ: A+ʕ+U|yyiqL 9k'NfΝnnfs%c_n Hwms,N^{8~?l&) c=&K})BJ5&񆼹wIbsѣGy_>&S \j/p=FBΥvK'|qƱ?5 � � � � � � � � �D�A~0|@�@�@�@ ^,J&LP>}d>e˖-=9hc{g矟> u_NOJ} -ȱuIVC $wL;_^=Z.3ᅈ�!r"Y7>@C:tH^P:A Lw?;� n׮vޭ_-ZΆH}w$͕ٲenVM2E:v"WTpѵ 9s$/c0ŋ}a@Z\X=[!Nw`vu߀i@]B PA"RRB~`A Ez]�)y&IHH [纆3y={vg6הּJar'n @� @� @� @� @�"нN @� @�mQ6`zU0=ܳg=ݗ,J޽?vklZri6+O|wܑc=6sN^{ 6,zg $<Z&܆AOj = 4(v[|_̎;#8"~:}w<+3&os!dE͝[l9Ԟo~5ƤWP߾}sgWV{w _==^}ѭEu @� @� @� @� @C tW:d&@� @� 1][Av аGYgU#<M747k׮ [[oUO;s=|sAeS?(~qvKJW61h0O~v+!n ͤC~)!o&U<9CS uQ3u?dRkOi3t^*o:j3&keȐ!=o妛nʼ;c :� @� @� @� @�ZS^V"@� @� @@޽{vq{ケkһwl喙>o9X!0bĈo[lQ_&lR I{&{20JM%PB Zl^`ᅓNFlRZk*4裏)~ W_P%@p/Ynve?^6Cd"({jo3LN:m,J~q?;>h2O<aÆ D  @� @� @� @� @`bAkX'@� @� @�Xc5?)/rJC=uY }sgԨQ W4/W+{Gc\zU�O~۬>M@Av+ltQ`РU?tǩ}[J ;rgdUmqҦx饗rgmݲkW_'pB{hCS Lnm_W.yڦcT~۷oT}FC� @� @� @� @� ȩN� @� @� %P~wUW]4ӟ 4j 70G}t7jW ,PX/_<?LW^y%zj/kW4ՙ@ AU`(Pˣ݃$>؈}|Mz^{Up ꪫf1S| h}> ~6l,~=3>lJ�d'o~uQ]FH 2$%4߮_ok#Gf}>|3ibC'@� @� @� @� @�GKa5H9� @� @C t钜}vl )F:\rI.<ә{>묳N\fe} [@yr-k[o͇~K_R5R~48Zm-'du; M ,hɡv>XK,!oԾ߬[WZ=uAG(% /<#|_ήZ=t֭# j><d9'4St{I'6(bMMy睗8 ,m]P  @� @� @� @� @�9#z%@� @�hX> {iFx*Z S_z7jV_}j.!u%,D {rmo/cǎK//| Yof@ _l ʹdGI_ t"-H->euuiѹ+sYgM[mղ馛fM6RK-ij !ꫯVpE/^{ljj!CTAU(o;Zeu]w=%Co3N}g}~㎫RM @� @� @� @� @�9P#@� @�X}:R-(A7pCnj~PB YVX!-\ߚh@C 3&so-쮻wܑ;3ÇO>}J+eʚk5X#>{CGq%~qZBR.KYgg;�8sf?￟\/ ßf 6Ⱥ뮛y睷oxrM7U_[%NϞ= 7<mYg:)HJ0)$ֶ5|9餓ra;ߩB }H'9g?Y.¬9裫G-9� @� @� @� @�hvA` @� @�N* ا^X"NpwmozꩪgeK/Z*2,@Ϛ 8/B| s |R^fik?<[n3�h-IN?=kdI6{A@-L}7ի jƍW]z)}zk>,UPY . /܊Uh# [曫P&|,Uji_һw8?N~kVkޭ}#<#F)w{%\@=}W[WYeRKWҁFT @� @� @� @� @A6Q @� @@iFhxq=T)@z R2`*8`�,|͗DJϓO>G}4<H,?p|ͪ~Z>-!+B٣GFXM:rJj{q h ?jwk4Zu[Z:_kZqU0ΛUW] .f+rf}-F #P? ,3p ]lŲZkeuzW{<gS`>"+Xӟ.'tRx≬ڪs?s=N;-R_~)& @� @� @� @� @ QA @� @�4`,"СƎ[!<U F ҫ;XzAU",R-2/B:žy駫>>mY?I:.S%\Z.RYz3<t́@ _lDML"ᄅj%74f/he7thrA RP;1jԨ*oέZ?U5[_\xӵkvV-!ꫯ<w} AxfYfJ+TjYs5=#4><qgYkMz ^y93_W@ȍ6ڨz݊7d{矟s=77pC.dwOݏ� @� @� @� @� R [JR; @� @� % ا.bt: cUs +eSOw߭ۥ3L>V .`&{n*^ȳ>[%ر3TKM%Ա`E]trFLL"~q/Z@`mѣk4A@ ȑxryw]wU2P}sռWeY9{YP˳£>: ~*W^9lU%sW%X"ݺu, j_#ddM3h_z}y9쳫�/aC Ŕ`83 Žꪫr饗[nBR7]޺2ٞiݘ @� @� @� @� @�J@/ @� @�N) اS^V"!^}*Bߞ0ݻo&;o\B$\_:0ï_~KFY/_| ~,A<e~&TeZ'}p-~qFd묓,tr≟<G 6v(<@*LGK`_B0i}.9S [U|=<o>>߯:ׯ_عKVK~8-2Y`Z-W$oɁH-Hy>=s%k͈#y \s5k!SBa;|ԨQUmݖaÆUsyN/ 6ؠιi(ž4D� @� @� @� @�LE@T`l&@� @�%k쳓P=Owީ!K?_Px훹;s5W9眙c9&g}Ccn~X{@7x#z|j.Ae./'%YBAKFQ=z4:t(rubkYHדC*@ 첩&K-to]>ղP|3vتrZk{z} ,幥ٟYJ+R×zH||&Y>g _8Yd b-V׏l|OB6kz?tM+s5T!并<ˮ*YykWGXb4҇^xᇫK ,ѣGW_Y}S-K�d O5 @� @� @� @� @�R@d[j� @� @h%.X, %L>CK`=pȑk׮UlV4嬳Zm+!ϳ2K03OX{^zMgiƍQFM2{)+e.v/KʔÇ\~ZNɼؔ0z@g=,e.7bk"@/ygc6G|[}Gc n kyO~gCW]ҟ}<ղ׃ Ka /42nݺM/%<|\cJ\yN)ݻMKy(sP4,W+N<YAe fg?YnswlJ8#6,`K {s뭷Vwߝ{,e{y&0`@J dY\˳rywΤ|x.ᴏ<H;"Z>WV)A[ @� @� @� @� @@٩/ @� @�W@O^{#'Ь~pP!KB=|deYRaVE3f4 KdϞ=` Y=zTR/gF \jѣGW%t%^ LeL%HbN9z (,/z c9e�pר#UX~|~s-H@s |%gsF[Kh[ R˶r?M Y"\QH1ɗ噣5\3&6qc=5sA / ١__[K*-s\>b͒[nI.<Yi7~y'CU?>I0䁧9<GKnO~_~Q~Q~1Jd ,/^?�j"@� @� @� @� @�4@F+H= @� @� @'(!%`F JB=rȑ)s S,s ne=lqe=2qM2yGkBRA\Ae=@,끕z+R&fy Ҷ�|,WV 34g;�pN6U? {ORK!yXW]5wniE`>Ôg'_/*٤TsW?KLmY/!YD`ZQIoEɹ&UG{/y2ɦ^{-/$`Q P޻Yޗ?ߗ CYk Tu% @� @� @� @� @в(& @� @�Kg'[oݹe4R/f*Ѹh,u=:z5=,Xr] +tѨ@egy#d;fY-<7>4hkgfݒJN;uQ @� @� @� @� @@]k}Œ� @� @� @�o99:�{d5/n>Ժe2|xn?Z'=z$gx`~� @� @� @� @� @W%@� @� @� @�A9a4@s lyr1{2N<r|X<4˨J &Ns '$ݺ5ȍ� @� @� @� @� \]kFK� @� @� @�ZV74:k˶5Z^`-Onb p@B{mz#{w^rɖ[&� @� @� @� @� @-A @� @� @� @ f2nXDS j?w5͠f|Hޱ&=z4Ͱ 6<O^� � @� @� @� @� Av lx @� @� @� к [WZZ`풿-3[^[6th/'_R['M7%/fSW  @� @� @� @� @�ZV@dzj� @� @� @�L୷fkA.,6'W\сĥ|rɱ617⋏ydU[ni, @� @� @� @� @ 촗 @� @� @� @-FLiA@K7_ɟi-x#яCEm˞E}On|z%۾� @� @� @� @� @`Aθ @� @� @� @J371\xa&.@rH#z {}k]mI<i) � @� @� @� @� )Avh @� @� @� ^#F$}W%@lYҫW׿~ߟ|r_$}G$ݺ%Mr1G2ztץ @� @� @� @� @�O. 9� @� @� @�L92y / zLv99P+CWݐhv}M??9dMwiv'@� @� @� @� @�t<A� @� @� @�H`ĈO*H)L{$ݗxtv8dذ.]ڱ]h 6K6dkB� @� @� @� @� 0MA$r� @� @� @�ȑ cXtdOlUp@'F�V^9d̘dU;xu @� @� @� @� @�FWGm @� @� @� %rL 0}I=7y)촩!<2y䗿lrA Hn1YjO;JT @� @� @� @� @AN& @� @� @� 0#F$}Lю#@6$80*{n|�'WjI%\K~6^ @� @� @� @� @�4 F"!@� @� @� @�%IϞd ]$C&'6|Vz4@㿗g?I%xu� @� @� @� @� @` H_  @� @� @� @`ƌIuJ@ s2n\?k:L;<5l$q{\ryu_#@� @� @� @� @�h/A%_ @� @� @�G  VOd䨣?lZر^{RǐM1:$ܒZ2xptoGZ @� @� @� @� @�\h  @� @� @� @ƌIwoF5G@ |;[o%g٦l*<ݳN( 8On54(Yk䢋>h @� @� @� @� @�Z@d[� @� @� @�:@ ֭S `4l%?/tovrb]5\#2KCէI`9/O>b#:Rj%@� @� @� @� @�tnA @� @� @� V<68䥗:=47.y+3dȐ)c#/УGr)GYa|G @� @� @� @� @� q* @� @� @�4InM2X$Љ3{C?m=Hr ɞ{ޟ_~Qd_+u<}M.,dgxcP1 @� @� @� @� @3 LWX @� @� @� @ƌIwonuH@+k kr%n}ȜdW\q8�nKFJVY%?ב @� @� @� @� @�-+ e=F� @� @� @�M&P &Y#9?MF쬣lq'\ub-oyTա Jn9YmdCG @� @� @� @� @�+OQ:S8 @� @� @�4@nرPh ~7%[5mL$lm2x\2d>@߾$^O2zh) @� @� @� @� @�Z>Ӊ @� @� @�6x饗r%_W _WSyܸqYӻw)4oOaG7}?|T4@ <yw>>}(=H昣Ft /$W_*l02_}՜?u]7p4i>sI[Ԧuxӟ&-Sɹ&sU?’� @� @� @� @� @5f&@� @� @�r-U˛o9&ǎ?sONguV?W0 >l?\wuYx3묳檫PX@ to}+Y`C;xy/g,`rWd%^La*!75\S1ݗ W@S lerMI;+}wS24 @� @� @� @� @A9  @� @� @�O*0x~<[nykgxg 7ܰkEСCsanl͖QFM @@s lm!P̱&'<`sF$s̑x J!CXN X\3f̘j/kǶO\Ҟ5뻹]6dРd53ln'@� @� @� @� @�d[T @� @� @TJX㬳:GeY&뭷7Lamgnb"@� X:#'yh#OJ<2;y饗rO5k&ƍ0F?4%e@;9gRaO}a;K @� @� @� @� @@L_L6 a @� @� @�+Cn2,YhrQGM:w^Ǝ[~*_WsϭB.(sN9昜y晹+3|Cɲ.[mb'm<$ԦQFN-ܒ{jcڜ/  @ A6E6Ħ8dRLڪiZe%qOz|oӥKZ0FmmݶYB 8j}]w ,gveo[^||_7 _}wq{ҷoN)i)z7yJ+塇Y~;砃|Pm[kgذa9%3Ψ*'.)'Ly /L_~嬸U_m!P><o&wߝ{1w޶] @� @� @� @� @�\5Z @� @� @k׮KnNjK.d.>)0{YSƕdToUalA5X#O=TҎ7x#j\}Ygʍ78Sl#@�N. _`kjEVX75EOJ#9M?<-XN?3<n6TlfY|ū]v%n$5/zKc /S_}ճ V/R/Mx(~+_#կV _~yYf|π��@�IDATrL s=׏?xY_wuWKqS[Jeyvr-0UW] /@y> J-5A[/ @� @� @� @� @@sll @� @� @C\UHc)v 7TC=[ J^=93+NrqV[v'6^{7#F#ix `5\ y뭷Ri>i5a?t2Aj|3&/&e%Ode'x"w3L3X?sΩK(b߾}ӥK*xx*>vJ0|=}Zg k}ݫgL?_򗬳:z'^P~Y3DJ;+ry䑼+նXQJԞKyLy{j>3S/J(~yyGSKk-ص/{=' @� @� @� @� @  @� @� @@(/e8p`Ʋ{T*_?2n-zJ[l={ȶgڶOW})+;0߿ 0ᴵ^;{ 4@7P @S Բs'?ܔ->O?9M_xᅵgԨQ2dȄ6hjϟANiZZ׵K i ryU%q=̠A2,T}coo^S+pnݺU:G?Oզָ馛_~C2sIy~ΟZ[Yj|'i@[ /.J~dR@ݶC @� @� @� @� @�( 3^Uc"@� @� @�LW^*>2w]]tH ><Zh*孷ޚfJ%H0S?{YuU-  @IJM2X$Ф_jj&lp <x_'9/kS f\aow֪'ǞZ䄓j+L%Ƚ~!;>˾^zUKӂ .78Æ ιK?:mJM=<裙uY'W|:Zj<?Y@^OBL唚 @� @� @� @� @�fP@ :� @� @�h9V[-{ova*qvW_=IK/{?I}%eرU7W2=\-b矿j368$ ;Ʌ4 8{Zi/{d=s](ˉt=0>}T;o4rȼ>XB%O9q9ò;桇QG={fWI^3&S{)59SOMk"&Iy~ɥK:%@� @� @� @� @�tAR @� @�g/ɩZ5^xᅓ [n9묳2Ȱa&?//9DL<4LY~M]wĻrwwO  ;58 H=4Z.S\~y&ZcX[+eZc5e ,G^O Yf%sN {g¶lFYhr1T[lEv}<0%(rZS tN}|$ 7tSMi @ q喤BG(6^G @� @� @� @� @�N% S]N!@� @� @�[{^zj5\zkU˷~ _ZEn喹{' |].j߈#rg%Ȯ: /PM%7ɨQ<Ly?>X+ |L]7JM(0thb^{5gp~oRPO%Q69'2\s堃7|UPb ?Cg՗sY%}}$Yg'?^{ 80Ju~LO>d?]vͷX^/RYk2묳fj}J%S{)m7w^ O>5Wva{i)ЧOroWI-'5ޞe� @� @� @� @� AvK` @� @� yƌ5X#{wvy|6l{V 3OX`UxK Ijr}U}k_˝w9 V o\uU�Ȟ={fذaѣDŽcJn>vM7e 7L O%0G~鬾o/~1?s$@�&(eaM н{j'\r'8䩧RIW\qEuv_z,Po\wu˳A e/>`-|r!U_|q~_kK. p/%�z9K?i._暪r\ |7^ow^׃,H?璩=9眵S.j|?Yh(ڗn1yd[niC� @� @� @� @�hx.jSW@ @� @�P NphxO Gy竐][36d_J z9rd2#S;3e]6H%@m/sR}4fq P̑G&ߟZPi jw~G^fec믿x  ?rp , s1GMkûロ< J߾}uGk G]KiMcǎM9wOTa%t^4o\y: @� @� @� @� @�Ct @� @� @@4LU?,HWcJJKLݺuK/Mi�:,|>A%\Kr}ӛNC/a%ȒYJ`:oAS=h*;fOe7Owݫi*rZ;%F4Ϟ\|q'xc?C� @� @� @� @�h2P$@� @� @�W_7/ @@ <sּ h@Z&xN?=*鮻SOM8")/'3'5D9W_Jxe @� @� @� @� @�I@d;� @� @�@ZzDk̷rKي+*O\>:0[ @S 뗼v 0}.9{Kyd T ZMAș[^}>LV &w'sΙ  Vr @� @� @� @� @� $нjQ  @� @� Ф-X5>F1I=zL34ɶ|ѧOlN[ #yP hqO.,7oN?q&1_nJnm͓iO͋I]tI7xE?6,9d]ǯtRja \ @� @� @� @� @� ?ot] @� @� @� 9Նz^ @� P~^һw(X@.ɟ,l&e5929d]Vp 2 !J(G$묓c*9$K-!h @� @� @� @� @@tmV5J� @� @� @�DM2`$@`KN=5կ.dWS/Ó @S lqr=s$'O� @� @� @� @�D@$^ @� @� @� @�O&P$rhF6Kv=7^hFIQG%?q2<�X`dذ;Id睓#h  @� @� @� @� @�S9% @� @� @� @t 9xc:OpRc|&~d̘N9$ -t@:@G$gr*$=ԉlh @� @� @� @� @�9H!@� @� @� @�S}Kקv4@ɹ&wݕ'0)kK=6cJ@s |w'6> Ӛ  @� @� @� @� @�E@ @� @� @� 0ݺ% B4K,rJ'W^i53&:4)ao_t@H`kM;mdÛP  @� @� @� @� @�' җ @� @� @�A99N'iJ7{N3''>{t T{䗿L.<dooR &@� @� @� @� @�V@d^z'@� @� @� @�?yŖjM;tt&[l^GGdIF%C&.:> 0% 6H7Ydd5Jƍґ @� @� @� @� @�:@M @� @� @�xr!L+Z($oval�4@GVj?LzL9'YyN<sCү_rI[ #{5V!@u>˒#LK*ӟyi~N� @� @� @� @�hoA}O� @� @�L/k׮3Θz̘1'B�YArK#W6Z`oKCu_-=/li''}ҷoU:@.A%묓l}rt @� @� @� @� @ LוuE� @� @�4@ZÎ;ݻ=Nm. SB @ ^##@6 կHs}q7~y%W[o9h&{L 2$ѣۧ @� @� @� @� @�Z[@dk k� @� @�o?#'0poN�VbRFkBF@ _vC~ͻoKH[mݫ0A>k%[r)'k<'m @� @� @� @� @�H @� @� @ ,YtE:ݻgv~; @@ Ȓq꫍Vzh>0 ddFp'oA_Z2xpR3 @ [r{%/ymy @� @� @� @� @�٘EU @� @� @ 8i~6 А?^hE@; \pAɶN9HKo-;vʇ7~�'ɭ&%|VD5oO߹"@� @� @� @� @�4 FB#@� @� @�T=)M,L[l)�4|/KdC^EhLk}m>q3?S?kD-9ç~=^=cI.,6,Ynl @� @� @� @� @�W@d^ @� @� @�N- gWL.]&gݳ;O  ̒:ks^hO3LN<qܞ|ggnӧOr79!@2$deuM~>\Ӵ @� @� @� @� @@cl  @� @� Д;Sv+ƌmݶ)= �:@-8O>ٱǠzZ_`-<:4%{>N>m'ߞ{&@@=wrE'G{  @� @� @� @� ee{TO @� @� @if;vK(k6+ @ <TGV2ѳ]wg%Rqӭ[ ɝw&K,1> {qG{'gh� @� @� @� @� к [W @� @� @;YguR N%D�: 'O> W2"pw[oMƌ/W.W\w]2n�-%{Үn7[W @� @� @� @� @�ZNUrmj� @� @� 0;cԒdr  @�$0p ȎtJzH. ?pڻNWI{E�39˒OY&ꪶY @� @� @� @� @�9Z @� @� @�f@_jvOC s19� 'o ~5�%зor&$#G6n>Բӭ[raݸU�f*!ߟFR75Fn @� @� @� @� @@Gّ  @� @� @@'ׯ_6xj$7: �U`#f0n>&]<D6C!?M;}]waYd[G @`gJ}OOVZ)?ߑ @� @� @� @� @�26u#@� @� ]߭nힴO�(9rdF1aY<jԨ{SL>?0Ge}l;vlƌ3Ź+MmKv5]j'˾ݺuܽ{c<f)={0OwիWrlӧO5<̙x.x;5~~V$睗lEGX@>wM}߇{r>ܟ܇?sCڇEM|]o+{Ozje{&ߞ|}{rO]^/k5w}{n=w}w},^_OcRKR�DgvJn9O,S$-8� @� @� @� @� [ = @� @� @�#P]z o)N-es )2p[':,z`K}Y/LX_J@f8|[ߚjPdA7z@e}YșxY,!<o愐C2iY1Ckfuw\lۊlVm/L+vt ڏZ@Z^U _rW=b>|r^=Aĉ{z,w_-q\-D_u^X^4C'ٻ0)9$ H `VL *(u]19gQ5!JRE$' D2C3_g3L:Tuusykv}ƯSȭZ=:+o]<2li.VOmfe֥5YjN)SFVSsM2!{jI&I/ =7KkX � � � � � � � � �D@s@�@�@�@�RrR)Z@ ,8fcǎಭ߹s ,c)MZIh`JJha)~8aH,XB]"i ڴK-ևzk L>YP]߲e˺�^\9/_޵e[WBXF�7b t$կ/  Fl٢m۶u$V[-nskV[a0AR !YX6گã9JXdm?4שpN L>YP]CYm+zjJ*5DuIkJ* � � � � � � � � � {coH@�@�@�@�@�0M6in/[o I:a#~YHڵբE`🅓~-4&H 4s C{dda7\cCW\‰,@ԂnOj5XcsrʪRJk 2bB�^FEx:jÆ mܸt%-ZՓA g$cH;boOtw?jik~اl^"ܜ9s\8C@fujTjU7eř@ 5fϖx@in @�@�@�@�@�@�@�@�@�U<lpr@�@�@�@�AЧJ=zd9$Ĝc, dYL貅8p -ĂAB >na3J.BNdP m۶G�R ۷/,Ȃk,Ȃkl\V-Y( @W9w#ΝsVYjuinnyh݂ )Lhu5~`BA& [}mz:t?;<AWf$Fۼ@Y@�2Ezi0/pv@�@�@�@�@�@�@�@�@�o 3z@�@�@�@ fKȔulܸQkVr2k֬qs IHHBb,#yR ,X0 D%Y>`<x0%K!-N:$թS5|0! ԋp#s /u,/HL^@]d^!~ʕ+]}nV[ѣG],<&0=Ynmn5yss8;9"kk{z 5)_|.x^0uUzt'8#d亀 }4lI*wz� � � � � � � � � �ġ�Aqx2 � � � Uf$ v\b `kh:v@ 6 EIzp^!;vZxMhP-^Y p lׯl,̦"g1~czFh]/N<Y:H}A ,d-[l~sNבyۂ<ѭk _m6Cnu^ڶMe˖u 6 6 Dە&7R~*ԥK"� � � � � � � � � @ W#� � � �(@O,D &d.]жrJ>|؍4,8o.T^@DN 8pa6`cAdt)Y iԨB}Y$@A#RҀ188@[Mx`[h6x_ޠA,8¤NLFR-jighYH[l&M$i[怀7t҈-H='+' � � � � � � � � � '@$ � � � @L Ařc\ … ea2~9 (\,aÆYL]XFK_bB�],[̅܂llSN9EM6 f͚RJ9GN@Jԋ).N?]jJz:"A ,y7oϟV[`t]޸qct׋)D},%KfGq'[h͛Vo3!@,IÇKgc' � � � � � � � � � �AJ � � � @T U",bΜ9;wk.o>*T=6iąڵk+o޼!@ XC.^իW@תUe˖vi1!ԋ9OZJ5`-`AD7sL/YÇUBY\hǂ F=,-o̼}v(PiFڶmF);L M.'s~'l� � � � � � � � � �dX  � � � @4 W>Ƴm4}t͘1Å̚5K{UٲeբE 5o<,T&9ݻwk…YT^݅״kN,ajŬx/(=qcZ\ xǟ~5wsYܪU+nڵ5jD@q&n:͞=5 lvO?tqر-0 6LnyϦV߇-@�@�@�@�@�@�@�@�@�@�5A�@�@�@�x}"8 M<Y?NKp.‚eVn8a X \xX}W,X h3<5 )Zs2-@i:v C`8 qIeʄ wiҤIN߷oN9uA۷wAc_L @@˗/?ڴi믿x.sQΝ^IrI`Zo_y˒O r3@�@�@�@�@�@�@�@�@�bV Ș @�@�@�o}3ؿ ~oe͂'ʗ/:˜~jٲ ( g0槟~Ҍ3\}wyҥ.!*b/aDwz1/OwVjN~8 F,q„ ;vyin{-tB 12Z�m\?=WZUݺuB/矯bŊ3G�!C kԐ{O)yE@�@�@�@�@�@�@�@�@�@<A@vG�@�@�@�L}"Ыشi+,\"_|:s\L'/I&.-d4}t4wi֬YT."]r%ܹ .]1$@C3BRJbp=DhV\޽[cƌg}B ,B,W O`8qNp؄н{wWS,Y6f fԯP{G @�@�@�@�@�@�@�@�@�8q Oܐ# � � � �D�>xQRL l߾݅|'U^=]|֭8 Y  ]d!6cǎ7|cǎK/UW];O ȮSs^CBT)飏"t/=* LѣGtҺ+ȳ>1w8|L/Rvڥ.L}qt޼y3pD N QC>\: A�@�@�@�@�@�@�@�@�@� 29! � � � @Nʜ#^,h͂e"ׯ^zpƍ+ F�\ɓ'pQF)._~)& P/&uV $)-[Gx,c 6LovjZH[fE�g} 5b-[V P߾}U\ې%X`y y_yD*T(A: � � � � � � � � ��@�@�@�@�P TkTZ5͘1C/ /)(P@uE֦M[oik׮4iR$v>!@ l)wo EܻUF /|tms9@FUDw}ww=w}wcB jՒVzuפVY]#� � � � � � � � � @f̬!� � � � �q"_~Y߯uֹu-- 0 +З_~+Wy+զMM<9zKw@ V,1iX!m^UN-]Tcǎ¨fo߾*VXnw#@ w}w7|c~`=Lij@<7KI+KK+y? @�@�@�@�@�@�@�@�@�Ȑ�Abc@�@�@�@�@ ƏFiذaz뭷`QHt=aÆ@ ;c4kL7os_ޅq^tEzꩧqyiРAjѢ{8EӮĉݽu'^GӔ{u̘1]o4k͚5Okղ_/0G�CQrҜ9qtfI4aY~gGKnq+'֟۶m]gŰ>F==,|A]xz'jժ,>ÉSN;ƾk{cALĻモ2iPy~1U? � � � � � � � � �dD Ȍh- � � � � 'M7ݤ={;ս{wɓ',mZ|y=!!A}-\PGsnݺUӦMndعTw^-]?qO?ǎڵkݽeX}62rZ͚5k".&{%K?+VTRjڴ>Ô6e e-[Jsf8BέN{5sLy%CFj@z7Ν;5yd o߾v8痰O 3,w^\UD ԡCYfM]c9cA]d%.KKH  enU~„� � � � � � � � � �+@dDl� � � � �ėΝ;kƌ.;T|O>j֬YPB۷:v-kI;#9= G o<d}:O 6GFU Y\bE}2dӿH@� 2/j.ȑ#k4bM>]3:èsvH2'֟ ddp3|>dD!FY 7ov:p@ծ][ ׭O}$w}w}71!ժI_}%>R҄ @�@�@�@�@�@�@�@�@�@ = }@�@�@�@�@ ,+TBB vSNL>#Y1gaR<F޼)nl<ɓ'+${'_fEfzoVr~>v2r-;@.ԬY3{ٳ&M{Nz֟#"�@VҥҾ}p p=McAun8_~9y.;ofϜ~ ke^n,g(!q[!*,Y҅@Z`Ap}-Xx}s}71!@J*k'u*p9: � � � � � � � � � @_|>"� � � � �DK/ jɒ%*^x4i,_ԩSea]ꫯVŊluV{8q,?*U{G6lP<ykz\X`!qsg}l. <m{_oKr.gРAڵk[e<v駟v! PZ>W#G~Њ+ԦMwt⟯o߾^x 8>qÙu߹s>ׇ޽{^Ӳe\]իW룏>̙3աC 8]x3f|Q޽zֺu;_~q̞y\R:uGƍu-N ”)SܱWZ-ZhIf<x3O~znvUZ>#ږ-[ԲeK_RRf?sw=h%jo��@�IDAT\??6"{ծ͇~( tCj͛' 1ծ]]On]t>fqKc}V}]]wuΤ^zil[ @ڷWO$gPg|_Tg}Vcǎ փ{6O^;X _jW^y6_}K|IU\Y!:rGաCԿWxӫCMRqlm۶>͟?_%JP>}=Ffӫ ӧO_|[of]|INNdt^?n6mr5P瘴pjp_ǮqذaϞ/^jp{ gJ̳QZ'z٦M&Vƍ/2C_9؞N9$*`eҀ҄ қoJ]"@�@�@�@�@�@�@�@�@�RțG�@�@�@�@�?7xCvq,{nh1xw뮻ҵ^{\9Y] pA"7xƂ;b+4h-(q̘1n ߱0zJd)sǻ5k,]ϯE\J=7I={ԱcG͝;WFu~n H OÇ  I`it饗زVZMi6|,[ouA {F3� \~ z+[>묳ԪU+ca~P]yjܸqׯ ,ӂmG;;s~6f_6ka!.h~G\ݗ2m4e>�Q 8ݻS۶m]d} SCJSJgϞ.4u͚5n7 5WX0H"tl|СC# X2G# P< HRү.]r-j,j_lSÆ ]`-c)޳`^Z[͹yfu-X;gf^MhǴj&MN_sSۆ3 .'-)3?痴c} 4KQKy?O̳QjYq]uJ*~XM~^D?&@ =%x`B�@�@�@�@�@�@�@�@�@�A)X@�@�@�@�@�[`.huQa!t/֋/%Jp [d;d,C qa&MkXMS^$Vʗ/\w)ȂXl*S )|OOm 4uTr`Ο}Y͙3G/J.pdI 4,Pjg(6YpXXg `Ir4^wv0ǻw΂.m9sOB"gϞ+W뮻΅Z֪U˅y晲N ´ctp駻e槞z[CV4ٱc 8 /{*YdzhFҡCׯ]v>|aGwv1,xтL-ѿ8vZ(f|\7&$$uj5\Cw Nd5Yˌ39sfA4Yhj4�)}&ze5@#)xe8Yn?cpLgsV[eS8`Bj5ms=z^wz!7?ҫ pC{^ў,ѣpόɭV}]i>3Qzg88/?t6.  p< ֭[ݐ,T=t_dQL p#~b5J|}A�@�@�@�@�@�@�@�@�@�xH q@�@�@�@�@ M/^\7nL>_XpСC]@^ѢE]0#G�JoYfM4q!{qA7X9jԨbŊ--ϦB:zB&OB݆筷Rj\\d6Y,{no}<s'-[ֽ]n]hiSڵ]4zh7vڹ?]vu!B G Yn{1}yGpe vK:u ne #FJ*.d߰cǎuʕ+Һ>tѾ}dN֏p'-ZW^,"ֽZPN[Z�iϞ=e;6N SiӦM- ]&wz9*TІ "Ci$-ܟpCns5euN[X_S^)Zc�_| [k9 aZB.\p8Y&zK.Q˖-]l6Y kS803&[N %XVj3 j+W;G8l˪w#ϐÇ݂=/ED- W>涀7*Xذ? ys'{@�@�@�@�@�@�@�@�@�@ 7LrSs#� � � � �$`ݻww^ Z8hNO7ŶDǚ/_S'Y�9sP$o‚%w! 5 nUXQ=<L}5i�ή38-X….lի/48O|#_սSN$[qc5P1mg}LiJ~-_\%Kٳmҥ2{7CW^0իWK/f8pmO^ =k׮ldҤIѣGD!@ ~=m9n~@vn'+ΟcZhe'.B<]8`pco!ǯ ͛j-{/!vpk‚ jN;MuuS&!/?SUyz:{$aSocsj֬oEڲ}'we]i]?D=^~~V~#@D\W � � � � � � � � ��A9i@�@�@�@�@�hx'\ƍ ;naw \>+t!/w <tPzǻ0>}]BwCKl]rV'cB nO?jժו*Urck׮,XkFwX_>ezL6-MTLY i cyhѢ|ZjUU>r{=d}8qb'r*m�hϏN]pe�Q(pRR?BpTt9.iF7x{Nw7k2dƌk68pBj5Z6͚5Csoٲ%tUí GBSfcl^^7ΓN7};7Y q/Fц ƍ'Yi/ھi&Ox4DzA#sۗ@�@�@�@�@�@�@�@�@�@ h@�@�@�@�@�/Bo>;v섎;WZUʕӟ>(x: ?@#F g\tY?,ꫯvsիlٲ@C?B ;<z߾}i,L}7yV?5mֽ?&l駟. I{TbE}6lG[ LrTKoI-,yXHI 8z.ӧOwvIqխު͛7W^Zp;?;w&DM2E5kTӦMCWGMԥKGdĆk'Fdl\E޼y]®3ZV3s^ F_u릒%KN=[HƩ[/#Gj޼y]ݻ֮]\хpkgyVd5M~NvȢҫ?ӫ}~I<':<%Ȫ[nqõPJkԨ! ɾ,x߾>w/P@b7,\`Cz? D�@�@�@�@�@�@�@�@�@�א � � � � �Y*`azSNua.r,=~VGq۷nFcZI'[n]X~[-& oԣG0qF3ƅYM?k֬qˡz۷owlA-o olYޢEǭ`.cx@sUBB },0e,wu㲃;I:<ilںukh[lq u˿Vz /ta>iA4d˗w֍1…ڲcS,l;v,@_tnpiO,<pƌ/l\v< ytAwXG-[_eʔ -tn (>̅Z8\K/^w[�믿^['5nXKv¹WpԔ&M{cY=jH<};J*eL @v ؏!/˗ =ӭ;묳\=rB̦SҪwؑ'mMO^`z5*wq b4G}q;vtvZ"z7衇4j( 8Н_~*֟iϯyzg88/m6@}ҫ3l문,<݂@*>_5qD+ܦ,d.$nbB� 4h Tz iyTA@�@�@�@�@�@�@�@�@�@  @�@�@�@�117,@ x!u/X1PH?صkW?ܓyAz*Phрkz{,p1w/17o^^6mW:/t# ]5C n:pg +^ {{ӦM xan]R^X;vBܶ7k'|r`a ȑ#n_/ڀZa?c1VV-O^ySO ^:pBN;]/  x!αsn9zA0%K�RΌ.4"^(dફr]}/mo}krmváCbYf / gn 6l͗/_w[l3r*Th޼;]s/\]+/X5 t ԪU+`SFk&8S<wݷ^HeX/uq}x>frbo>P\[o/\r% s#to&N{nӦ&!/9p׻g Hj=SXլY̙3] h}/1jѢEupk;׃ V/[mj5goq\VMh|WJ* (9sj׮x wpO)Q”)S{Wݮi՟(97ozNJJu]jCfRzȊǞSNyo$ͽ}۾컈 N`ÆX3z1gc#!� � � � � � � � � @d nyi&@�@�@�@�bJ OO=bjX \B:jҥ뮻t- ȕuR/tDk֬'/8$M|oڵ r9 7t}%ݻ#/xQe˖Mu7Lg!~_{ޱcP?wş�PٽhÆ B ݸmnؽ+^v-{Btj֭:o={ tQ+#hck CR…e}EU|궳gϖ~im޼Y^P<S=I+./S^0,<Fhjgǁʔ>H3zA#K`ĉ;关 nu]~GV/3_Ӫ]R3zF/N֭+/p=}z5Çeͯ^pfS&^W&Sy2;p< Umٲ=fvٵ>пowzx@]tɮq\^{lwHI/ $� � � � � � � � � � Ae` � � � @| ןgqUW]СC,jݺuKw?uW]vlkiB''O6f45 7|3"/~͝;W}}, ^>iK9_, Xh{ァzʅY0Y5HK411dhcX`+ ~P_7p ᅌ\sE <+}Rz,@�@�@�@�@�@�@�@�@�M9,F� � � � � ^h ]RJݻz쩆 f)cxJ[֭&6 ӽEɮqqpر] 6JdGє)SGiԨQP!+V�d@򾟲< (nɅ}zW5h ]~.sU|PĆ Vz#>7Mu{4_Gw޴iS4ko@ g^7y?-_̚3}, � � � � � � � � � yޔ  � � � �@<ҧJ=zy9$g1B8ck 4Pu%UVʛ7o<q0VF`l2Y h^3(j,f̘1. 9屢 S@aU x:uVjSq81cy9R {: G %MSqAѯ_?k.]X�9(RZRǎ9N� � � � � � � � � �&@dr`@�@�@�@� '79w< l޼YFѣ?t:յkWVJxdaĤX 3S Ӹq4uT(QB\p B Tw8O P/FŋҮ'$HeH"yZLd\}'hĉ*V.B~纚=; @ "v-HowEW]u Uw&,ի$o3o_gk%A�@�@�@�@�@�@�@�@�@�-E�@�@�@�}Rؽ{waԶqF5h@:ug:z18r�!p1-Z>N2Evܩf͚/X۷W|3cFмl-+}qwŤ޽{_/Ԅ d5{6mR ec3(C/G %K?p饗ꢋ.RB�(1B.{TK/I\ � � � � � � � � � �A)@�@�@�@ +HcI_շ~I&駟~rn5k駟X[…ci،2)}v͚5K3g5c ٳGәgΝ;*T3ԋ !s-[$ Gָq\>w\(P@ڵYg38CZHDZأ=>|Zl;Oݺu#L=:/-F % ( "XzMy � � � � � � � � � @ mW"� � � �%@OXLl@ -YDSNu&MNs͛7WӦMUh#'D�%͟?ߵ9s�իW`. }.cǎ\ru3Ņ�b\\yjy{"{t(N/gV/X@V7nYp{֭ǩF r9➳gϞ-՞xŎ9ZT=C� xw||yb0K e0� � � � � � � � � �$@d.sZ@�@�@�@� '{}9:Y)}v͜95 ;w6oެy~C!-"O:$^Vc!@ 8p@K.u4/… ]cgfaڵS- +ptET?=/w^Y`i|֬Yڱc .BZj0Gx{l@V ߿_-rj6?xʕ+;tŋg9DW_yDP|S:(]B�@�@�@�@�@�@�@�@�@�< � � � � @O,\E6mr i!ѣ*RN95l04hzpxvcΝ;l2ז/_;vLŊz.@-3!ԋ9-|=%/gOck#+WBΞ=[ssO>di?N,X0FPX[=dllVW-[VOn@֭[7BGC@ '֯SsW/饗*Ur̜@�@�@�@�@�@�@�@�@�2+@df@�@�@�@ CȔe t`9 5k  m't-$ضm voiǎnc vFfPM6U:u~H3!ԋp CJw%;S^u"0Xf v/^,9V6 o\rLA 7ov QmsӤIWO[תU++N1@ FZ?nUbp @�@�@�@�@�@�@�@�@� 2."C@�@�@�@�8^`MX@ :t(a3VX[l bŊ@Hծ]GZxd5TD, @@[nպuvZYիjժ`۷o㱀'Y0ׯžsEcE3nV եcnbmt'l2:֭mnj ӭ(LBjF15~VW[=muʕ+]@u[k"Ej  ycʄ @ ؏\ |9ˏoK[gy9 � � � � � � � � �dL Ȍy5 � � � @%n"{qYa(] PjժyMܖVLl1G =* G%׻�H W *VZ.N:-[PSM#uԋQwbíZImJoSb0*`aVgXoVuIW\Y`HA6Oެ>!p:UjAmmCyfv6Y|fsx 8XTiT曥'& � � � � � � � � �Q @d\$� � � � q}2nģ;d- ςmܸQ*TX8M*Uܲ+U+&iJ %`۷o֭[4 ۦMܲ;v,ؕ%JO-Ԛ;Zͭ-Z4= Ě�b]#HÇ˫?:l_[nmS,XUVu6V[+_܏kl0uК=3%$$[d`7 1eB�rC{M<3H} ͍pN@�@�@�@�@�@�@�@�@� 2Te@�@�@�@� 'f.%A W >,>B$XЇrʹ 2eʨlٲϟ8OܹmJYc&ٶᎦe$ aB g͒ڴ,N=5Ct @H?fFOyuE~]mE*Uޫʸzj"E3!g8oB.ƶ@QwVZfN}C7 CA vzHzmm[7cp @�@�@�@�@�@�@�@�@�( 2.]E�@�@�@�_`F`޽.r˖-n!#7[ga64|*Q +UJ.Ӕ:YmR+^+&%fj߾}{`Ϟ=)K)]^5 }<tq "k~i*U-Z;+@xMXsVxavr X>-v.?y˖:x׺Y .- ֶZܟ۲߬>z<yjq g,9r$Xg3Tf5_Sիky^]څ>Z|*Zh0 44,Ԗ[mL @,̟/  K1@�@�@�@�@�@�@�@�@�O f@�@�@�@ }@bUG? �ܹs[`ڂO,lB-&`.B!fa'֊)lvPB_f66z .LYxJ :fc1mx]j^Kbٟ[bJ-!! :ۿ |G:KjC>-dȚ>-` Gz1{\9jIKH?>l�'&z)饗*UT\XnsNeѭO)X~8Zܯ䶟?]ۯCu)V[VmM^onVK.[mF~/5VcZ۞sAv&zѷ:TҚ05eԲuBMsVk[5ۗ W %>\Ay}V;q9^M7 � � � � � � � � �!@dnsN@�@�@�@�l 'ۉ9䲀XXB6?4R mdZ,l\;WMc;~P[C1-_jB~GndB�^O=Z]ڼYP!FXyO:TzayCI&/<s}C mV ksɭNZ:6kx@:-{5:_c[M\:e?8_[}m0SGpҊR.]wI]r@ ~c3v7ސ5_F� � � � � � � � � @N @�@�@�@ GfN�q"`A7~8#GIG=wl-T26}t9rx_5 p7o^7_aB[: @۞ [z1$ނʕbS_ [o ʖGI?G+'Buj_TwL ?OH(=˷7zкm55;NnNg?v+ҷJ HwޙeN2!�yF?3\*U @�@�@�@�@�@�@�@�@�n [#� � � ��>I@�L X�dϞ=]HdŽ @3Ŧ&еT l;F nS~iP37ߔ5|/.L1B^}Y}-y!?KY}K7KH/,}d!'J}@ >,<wp,(XzYw` � � � � � � � � �@ޜ?%gD�@�@�@�@�@�@�@�K/ƏR4,Tɓ#ro_#/Ү7Kg%]t萭qPu뤻}W][GZ zAO@�n/2gQǎ|Gf7E�@�@�@�@�@�@�@�@�@>@�@�@�@�@�@�@�@ Bڿ_7.N)A 51LW/i2kg",)JdB,@qZG#|yi i魷sͥsϕƎ @l )#4{tԪt_ � � � � � � � � �!@dnsN@�@�@�@�@�@�@�TIQ92)�@yGjDZZ'פRN9vO>F ϱfDjI?/=/=bv(THFi"i@ ƍCU:�@Ґ!j@ ͕I@�@�@�@�@�@�@�@�@�bV Ș @�@�@�@�@�@�@ zZ:x0{JLk.]oϗڷ̾֫;nKCNm9yR,&3~|b(d۶ҀRSOI9i<yCs/wO\>ti֬ C�@�@�@�@�@�@�@�@�@ 6ʨ@�@�@�@�@�@�@�@BuƍE"L`(Y3i:i4g…#atg@P!g8B6yiziРPtIU>}栗5֬ɂp@ JʔxC;W*XPܾ}-[t@t@�@�@�@�@�@�@�@�@� 2B.@�@�@�@�@�@�@�?ʕ3ΐF3b2+pԿԣtUTJ̙Ұa /H%JDjՒ^~YzyiҤw8=ZUziiZǤ/֕F??#  K~+կ/tplQ!� � � � � � � � � Af0G�@�@�@�@�@�@�@  k46-pI['~[R"щH*uhmF{wwoiǎh}`λV_iE kWig @ Vz-SzAiSiX-B�@�@�@�@�@�@�@�@�@ >[� � � � � � � @o4aBq-ImHeJKW\#FHI/2DʓG/zǐ^痮VZ@;61sm?K�Ğ@ѢcIKJKݺI\"{썕!� � � � � � � � � ]Af,E�@�@�@�@�@�@�@ *U#ؘMC#GznM2EY3!|P:iK2H_}%Z#ܞ[Й3fHժIW^)5j$ &%${C�bGvmϤモ#1{cg@�@�@�@�@�@�@�@�@� 2d9. � � � � � � �a !#:l@l.u" *}sR|?wޑ6l<rY#H4gN'm+}ttҀRݺ+HsA�bKsN,5h8  � � � � � � � � �Y)@dVjr,@�@�@�@�@�@�@�2!p啉a_}XHjZZJ>]#ҳJ7(լczA3=13 :6LZR]zvm'!+A�ȟ_i ⋥>}ٳc@�@�@�@�@�@�@�@�@�5A�@�@�@�@�@�@�@ T:w? ʡbQ6]oT1 լY&Y?DZ^doD˼޽@ W.ztMs%|m[&. @ //4g/Զԯuk#� � � � � � � � � Af*D�@�@�@�@�@�@�@ 4~}{Fd{bK㏥zOG_Qr5矗zN:)U4r4n5pGSHkJR?!mQ ͥS>&Lח^|Q:|86(@�@�@�@�@�@�@�@�@�8Q OT@�@�@�@�@�@�@�/ , xkJcb ibjXt#7ldIi@iP#:uo֭3 �q/pҲe?|PjX3&Y�@�@�@�@�@�@�@�@�@�@@Ar � � cNm*?2B%!JLᯢ4Ҡ6 I%%*EQARdy(uױ|ٟZk|Z>u@�@�@�@��….]Q"2Tl_^o.5��@�IDATڹsz6j|uQ#y̽NvB.-ӂVΚd CZF4H<YQC.T5@�JH'@ȦMK.ڵ-ʪp@�@�@�@�@�@�@�@�@�"O Ȼ'@�@�@�@�@�@�@ FzCrbfǨ%=_P&MԸqw{f% UKbPdw H}HWKCHӧKkڵ1EAc@ T}Wk?>n#ah> � � � � � � � � @L F#� � � � � � �D9H*IFEb#p3H#FHݻk͜eYN퓺vJdѥ &MCz΢ Ge/ >̴u"T@Ҝ9ȑ'H5kcxN� � � � � � � � � @ 7!� � � � � � �Ď@n_R=ZvO{y]q9eeK\״dT4y4{Էoʼy^$ |Uit?c#@ %]u^xҀRݺ61� � � � � � � � � WH( � � � � � � � )a4sfԈz 9>+ @Z�#F/Vҥ9_ v:Um9AliIcHÇK<΃bh7 [ZB:TS?[!�1-P#{aVRgK4 G�@�@�@�@�@�@�@�@� c&D@�@�@�@�@�@�@�[WQ )WG^ZfR^2zbivmۈj+x /H< Z u!h/,M,U.'mݚ#H#@�4*VǿsJܬt5oy(; � � � � � � � � � AFm � � � � � � �9YBoƏvɭm*~AvQ#FB Сѕ9d[xqqҠ 6w^~ch|nVoihjUi .}җ_JjIH,4@�@�@�@�@�@�@�@�@  o*MB�@�@�@�@�@�@�ny'AH,`ԭԳSGqQʓ' 9dm!9iCJ=zH]&͙broV|P:TVMzbĨ@ҥ}Ԯ폍bf#� � � � � � � � �8 s-A � � � � � � �.PQmۤΝͥ^;ޖO 6kI! zrHcrIo)m+u$-^|'Ê_[j֔ MB" J< \)~#fώa� � � � � � � � � c1 � � � � � � �$n,I-*ptґ#{Iy&1bZhڵk'\"M+:uR#6}7NjHj^hxqi�ij ^Β?3s< '$ .d[JA�@�@�@�@�@�@�@�@�@ Zo � � � � � �9Y`ӦM5eU^]>l͵�vکPB޾ʗ_~YVJfKU rE'2A�|5h ԬYZ =[+L޹s&M!C$ܐW64m4M<Y+WT\2pz!:x`-СCUnu ~}TlY޸q>#ojٲx̹:o<YuTJ+i^ ]̙rim;dijG.b;XڰaR>d '=?eY_k7\k֬љg=zOp}9�"GS>O>W__&}0+>g#G � � � � � � � � �9@�@�@�@�@�r5gM8Q;vHG\ŋ`rz˘1c4zhoʕ+kÆ <xf͚jժx>}Ni@�wݻT�l;'NKZ Ν[ݻwO1klgcƷzKk׮͔HʻCZ0)@1vɍMҥU͛7,@YeK%oiFUV￟Ƞ>EK"m+-]lyf<U0믿4jdSrIvY_-u?}U9Ri) /W 5�@�@�@�@�@�@�@�@�@� 2n6ME�@�@�@�@�@ Z5k+ɓtA2K048n8KT% ~zW_dɒ.TT r.'@T X=K}&߄#Fk׮*VX;c:թSGYeK;v֭[?}l G`Tv ӦMgϞ2ڵz!p v>.()-\Sdmj.]|r߿?~zThQu!v5VfE;tg/W2etsP`iQ!H ` µ=2_R\\]y� � � � � � � � � @D J!� � � � � @by&^k k,^xRZٰaC{)m֗*U ʬ@T/F@�pk]z%Q.p}Ҷmқo&ߐ~Iӵ^\;w g}VX\./%LU\ٛ,/R 63wfL7t,X9N6l0FmKXp֢J*j)|N:` 5kJ|#ׇS6p0eajs.\t�[Ό_"EGV:vO;MlE�@�@�@�@�@�@�@�@�@ t@�@�@�@�@�@�cذahܹ@ E8p`'F to_38CSL;CݻwBTƏ^o,ħB ^xM#:cS{9o}iȐ!3go\Hzw}@�Ȉ 7H-[J/Y#pzUiqRºp/ B yӉ'̙3/&Mh֭^Pcնl٢^zɻFbtW(bR\ѣ +z !wٲejР.2o>~?o=^R%vbuz_+_|ڶ[`ePe0}t5Jxk*Q\+s #[7`Iqt=2MϳSI?PӦMuzGkR<{w ]ˏgEҏ?}ʕK mٳu!9__ڵ^uv i߹Q+ș纽|{?ڵ?O}V_?gV!� � � � � � � � �D�A}= � � � � �9J+tN|M& I)nݺ.0#17| nIcƌI<{ bA5͛7W޼yHZjo߮s9Ge˖‹,h+B>--� @Z m #,TvC4j%R6~1_ƍg/;-;- ۷Ǝϕv[b…/hw.x|Az7tUW<FzZ8u]:uxa\{Y-Z$ iLXa<OPFzȫ駟W_ycW]w3CB(- }ܸq޹̯m۶*_7ݴi:um S3ի,*}ʂ;wء{vWina/Y%w^쮩L4=VzL=|I-]Tcf^ }FčwfXF}^t,v\}d I i]o?X$׻ 0]2=Ç!5 ,͘!/z>4`@rsmA�@�@�@�@�@�@�@�@�FK@�@�@�@�r7n\k B�r Foz'BlW\mw<qK,s!<q'N,4k8s\荷o_, 6ֵk`UܮBu֭[?Yf ‰_D�Ƚ7,y!C ۶-E ˗/΍ے̅ƹ8捫֮]gc8fw􌷶nWD8{/^YW:w׻we mv-p-Дzk̙3N>d/8Xq㸸~n޸qc\ѢE~.T<.wqJܪU<#֭[{1bIz/_ &=޺ l?zs@H=w-=.5-ȑ--S;SzǸ<yĭ_>.ѳy׎ٲi&K.?wFvR ѣ׿+~Cׅ ?Ŋ2eJ|X@�ϑ#*U+R$.GG@�@�@�@�@�@�@�@�@�Gl  � � � � � s_jUmذA.\FcǎMR/աC$ (d]"Eu7fy7`ui-{O.8H+Wϖ]ÅU꧟~RӦM㷱� @8ZzAipqF΁@ #=tmRz cA>s5fkNUT_Ck7h׮]j۶m * Ə*Yd:Tի.*_|rǧ?$\P\W3fȑ#9uVk Qԅ^҅{mr4hۧ͛o;j֬YrkꫯbŊUV~.[6˴ O?\{-ع\x\مkzs2D'Oӗ.]'wtfi2iHpO4cL&G=K.d3b.({tlmڴIg[o.(!} 7HIK<ʩ:}RW;73B[.]ķK={JݺI/('cR^R<9@�@�@�@�@�@�@�@�@ rGv � � � � �ĂX`rʹ_M5k:ѢEڽ{omymC�styf/Lǎ -yՙgZbE&@�˅宽\XXNI4Yn,0»?c]{.6~gjժ%d%& o\jͮgqiMyRH*S2gԊ ׷ʅ]{-Y[(UT,ҊJqgV6ڶm M oX fZfeB'ڶ p}ڵ>L ɚӦegOڶ|r/^<B0s=^2=[i/b,9a\dϠ~*A0 1f/4uҤIzꩧֻKpIA�poz|.LWj@.0:h- � � � � � � � � @d 䍬P@�@�@�@�@�e͛k…;5f]}ժP=x {O-Zm-# s/p2YPlܸхI%9餓U@�-H/tSs2&ҠACI2kϟߛO: ܹso)R$]x}j׮]9BB K\)q7%y}oLVNPlF.�@wڥez_} u+c~p``={4m4/,/8&ȑ#UV-\RsB0}' eMwޑܭHe|̙U\-!k׮Nn'X܋䞭{t,կ/u")ԭ[rI.0O\AYhhP"Kx)V\ܷ.? ?hs x2DN~`7EgP � � � � � � � � �";@�@�@�@�@� ['x yyGoh8%O<^HdrМ3gnN_|۩S$X@,2k֬͛B oO �AjU颋^ 8$SR' .],DKÇ+Ԗ-[S5jgyCycH{]zu-ZT7`o{Ϟ=p~M6lHuھ}{ Vg^|ʕ+W$I6Y zQF?/҅h> .9O>d/,-02(f`ƴi_^۶mKB٭|w<g*V?yj~xٰ5/ɩ2MXK.|'xU(;7|{ڼyfϞ//KҾY;eyMٽ\_i1;vGDzݷo-:t^Z{( ncF֭qO?Ŷ G�@�@�@�@�@�@�@�@�Z ֛!� � � � � @*6m4l{uVok.Yرcp.]h…gݽ{l6|믿[oN:ݻwd-V~$۞y/_XYn-[x@JJr +@�Yۏ?댜 G?rAxr)k6Za^tzv,-�ю_j,TqΜ9ڻw $ {ۼ6mG}g{iժΝ~!x'N+(Z<x ^x{?.{RɅ`kwJdؿzcNj߾֬Y];8ԩSULͶnƴn{'uRiƩq;Sms 'VaÆB Xha.,)wM9k6^*,fjGJtN0A.h}W\= L{ά\z饡ò쪤C)S,p&1S?#<`XW{۵k' 駟-=�zȽk4_SOl̏�C�@�@�@�@�@�@�@�@�@ _O 59! � � � �.+Э[_ �A஻SJ,)Zԭ[ e$ ,P޼yu-\0˗O]vՁ͛7א!C/ /LQFd,h!CǏI' ~;dz\` رc~݂P*Vmz_uU^Ox(`Ƌ|sZLMhidCIf!r)_n￯? m,,l!w\Jz[-R=@<yxm66:[5%9r;#_|EVJZeOs Q;wƈ2WV-5kLUDD{'?ƠrH|rtFiiӦ3fj׮޹sWɓ'{XlcX'[9|gK/y-Γ3m\ C۷ Κ. %ӚA/7K H]U2=zcjA~gWR{ //8S82SO=7jygGMQ-tʕwS-鍂�$wG t?zҿ%d  � � � � � � � � �"@drR@�@�@�@� '�G�2&A߿ }jP ҂.]:cL,uI4{&)h^"@$ 0^Cx Oiz@f;Y#D\Yn?@)Z`@ @ N\;޲ >Y ͛eaNZxeARvޭkתxпc =t72t^ٲePZm۶駟~,<b7nmkuYpyԬY kݖˮ.].0^jFr~^f52MϳS _zm_Ys\\ՙrE]R˖R~}KzCEU Z`95Ӳe#�) <( &+}ȏNl@�@�@�@�@�@�@�@�@�@ T P @�@�@�@�r�>9V ҂T2AG@qMΉ�-x1K]R%[GI}_"U/m ,Uǎ={z)|toٴIUKV'=قᅲz֬G-4Q^o>[Bm5G�WB^.WzQk<y� � � � � � � � � /@�@�@�@�@�@ RƏ)UYbw޷zKUV͔k'-\:ud� @ nA6Lz 3,`Yޯ*i'~7UfM͚5+׉ʔ)mۦZ%Kf[zT)JTwʍ]t U&3ΐ>dw ~xaӦ|l8}&MTFLrHSА!顇%֬Tx]>[N- 1ŊI=&#  zJ9bIE@�@�@�@�@�@�@�@�@�X W+Q\� � � � @rIɅ+$ �&p]w^Z[u*U�Y&x1˨P& T4tԻw&]"N>:t/4H #Y(#GR)jJgNfУ?5gη7/_>˚?§\(9z饗tmeƍ]('z):|,nV_$=5@ Vkݡys駥֭#@�@�@�@�@�@�@�@�@ C@�@�@�@�Q`c0@ Əݻ+3~Ν;`�-x1Ni}^7H?,ΝSZE;QK;/g}:[o ORKŋf}Er-[;MZv<^K5ja-ͺ8p@S~_XfMў=+Kd:N]ډYW!�D?H'͘!u(=tiP1� � � � � � � � � u*H2*� � � � � �(Y *9:=E�d{V&MZR.GI}}yի>瞛Rӵp] FTNZ8Rk֬y睯ᄏS5kVU۶~1r|Ο?.<_+\Jt�-K'ި6mʹfjQ:r$. @X~aqԭ) � � � � � � � � �dH q3 � � � � � � �!2t%3DF}El #+&]zilxZݯ=z9Iv}xNDZZ}P[օ@^3S*Uc.%vQYn.6m0=ӓTvS͝zny˹kt>;:�DJsH@6h %  � � � � � � � � � @d$� � � � � � � 1\�\1!A`({w@0,Oq4yʝ.]zh1(&W\N ZB o՗_!+s՚5;cѢEt}ka:xp&LXλSF?*W.R袋'c:4bI.zKFUK6XR � � � � � � � � �"@䱨q  � � � � � � � pR6OG@eB XѢERϞ16WfaæzX>Y'@G] z{Ú5mU^UgWKejڴ],ZU}VɒhʔAʗ7YO=goX@�Oܫ-^|Q.WFzAiG�@�@�@�@�@�@�@�@�T #P/@�@�@�@�@�@�@�!pr[҂ؙ];HժI-[1z3ΐ.l_y<xpjdN+U*3qCA)jР '-.JW/W^_~}6it׸y.zz*U?^.42lD @ '|#ҰaXB � � � � � � � � �&@d� � � � � � � @:vN=Uz ĮA`Dk0SxU޽С㎻tᅝc(PRAGJ^-^ ެZJBњoskΜuUt gɂkCnI]pC�_P!{q[n|R^]2D:p G @�@�@�@�@�@�@�@�@�#@dx9  � � � � � � �&pҚ5V.Nڸ ի.K5.Pk5iC*QsMiI92YeK\0{Zv:uj .Лo~1<~3<Io}.Y+ nݤҥ-G  @v /. /\O][9RJn|] � � � � � � � � �#@dsU@�@�@�@�@�@�@�&УT4p`Nɉx9^=[WڼY8Q:dYX%H+V,pԢzƫp*(Q" &쪿Qvޭ޽?T{IYyJg-=wҖ-رRݺ[oImH%KJYhU΋�d@ٲK+WJK]'5l菫h<wΌ� � � � � � � � �D@.?G]~ � � � �ȕK7N-Çr� @& 믪S:%GQ<yBVg%X @ á9"MWV*TQh1BKʗOn 'F(*%U&燵+-Qz;4cHDvvӧҐ!yGRGm]7(U 4sizP!鬳s' -P Fu@ ,aH_,� � � � � � � � � �1';ZL@�@�@�@�@�@ [*Vk߾}u.([@�& ZSh(_ޯy!ji"%~) 7H˿\ڸ]{l-_DիwՄ ;?gJ*о}^M$YKo!U*u$//,0kF֭֬ WJ .n-(!h!'M(mڔ q Ԭ)+-\(.]ztԩybG�@�@�@�@�@�@�@�@�* vQY@�@�@�@�@�rW_<yژ\r{F@�8*P~8a|G]X:~r?Gh0Y0d=V…7l}aM:LώJ֯9~ڷ4wnz>`H =5ʿ'WyTtUСA�+Рp~lu~gC�@�@�@�@�@�@�@�@�L\qDfը � � � �.4n`c? G"�d-[/KRIΝ[[_|VV!�/x 9Cd /ը!u, uV'iSIKkG_?(='rfi�MhlIقv~[z-i2?tmj$ړjg4g7wҮ]ZXKԑ9r /}nagZF@�@�@�@�@�@�@�@�@�ȝJ!� � � � � �)PlYkoѳg̬F�@ G ( 4|dae!p≒N6 *"2EohTc髯{s9RV~0d/ T wt4oԥݓZmv_Np/@X1GMoj_~YjX`țn4Zn]5,$@�Rh=|Tc � � � � � � � � @ s%JN@�@�@�@�HQ W.i8[wa @6 ۺ꫕ț7nݪ%Jds-<TƋ9.ؿ_QCY<#Plnئz NY%OHSJMHIݻKv(Y#0w>VϜԩ\) pO?y.ZvZPdÆd˧"ؑ�dK?,} gu= � � � � � � � � @9@�@�@�@ @�tٳGeʔс%ur>yy�Sb859W$ zTB$֐:E=.]h!%ƚ{3҄ ~߿Vֳ.|˥>>:|@sϕZJejҲedA~.,k::U.,Ym6 3M!-t{\əU � � � � � � � � @;"� � � �1%@OLn�Q,еkW/СCǍ'FA�2KbfrHؿ_Q<8RjE=YCB /iykJ/$d'eb.^_~)͘!}0huJg%h!5k&թ#wA(- w i_-U,լy4Z5S*Ub"/GHl/d,$6tk; " -ڞ;38t^'ϟtP!pav %,`ᇥ nݤG?O@�@�@�@�@�@�@�@�@  2`� � � � Q @4i:w\m\(K% �$x1`9mD ԯzTBDUD@^ҨQ~@U£WC,`vI#FHCJ+WJmH}J^EfsvlVK AK6YPCyσݯUPH T)?2pH*Vʕg0dA6Oi/&n{ylρɖmsk 5q@}w Aa<q`doZsP 2X0S'7,)pщ@Zn{DG= 0gB�@�@�@�@�@�@�@�@�N ȬJ � � � �Y(@Obs)@8߯ҥKPJ޼ySoqC@�/m/>f.Ђ׿A\9Rf[/> SbLʔZ:V2G!ii?_ZHڱÿ^ѢRR~`G},@.ҋYP޾}}><XmX]0?rD8ApmʗO0`p fiuCig%֮m!E}!WBlkŞs m,Y��@�IDAT}t[>۶``S kgǞ"E)ts̃gE>ɖgҖ<㙴bVA_ y> P'3s&.fyϚONJ8gr|8~~ d~ dzw^F�@�@�@�@�@�@�@�@�: Κ+!� � � �d�>Yͥ@�իF$O>D;v<γr8 �}ؚsKZRT)紋d/Kw?Y`Y_x6Ho!dmHnH.]=?LJG?ˏNWKa۶ llYDtB8lLd,ZX&gBɂ009[N$-AH-i%9)#Ri6Y 1ey k3 W0,2tl]bul)k[oB0sfAk-s&|4?C`>>&۹R*>kwZYr,mdz{6woU'7m*{~Ӭ-$"T?6~II]\-r�?[7%!Swc+ � � � � � � � �  AF] � � � �a_Z7N_z �D3Ծ}{%]Ɩ-[ג>( @& 0^D\NQ8Ut9~[DUD uYҥRBQ*HN飏8 ?2Kt/#@,ւ5[ڮ] 'BBRjZP["H~Tdۃr9 Ю\ϖ-XgM dЂv,.uh|8NWC{)HUjդ5�/V \ς!C N įmo l̮<Cbs , ,1]:캳=,2x߲e >7_ =3y~߳gSG Qg/կ � � � � � � � � @ wz!� � � ��> @ vi�'td}jȐ!Yz}.�)x16{w/֍U}gK[g9 <sr|Xܘ1ȑ?Z_.]yԠAyIKgX| dD PHlld�izl- B5=dkӺuKZեZe `vmxqBd<A3lσ=Ҳa6(;y_BM-24rMw>ʲeDZ@`�X l?.-Y"u*=0G@�@�@�@�@�@�@�@�@� 2r5A�@�@�@�qRna<)B�H}w鯿rad\ڈCm5e=jذ Myo'^.R6 .?)RRK* �`,vz rjD`ߏЀ Ĺ4 lqm]0.KkۥGq^\N߾<~l?~Vțl,6J4z4v^ ?m%*=_Bm#r>C{|WJqo- &釶.|a},(rժӊҲeʕ~آ]re?|Uח5ZD':Ԭh%/=sПW$`" LJ y42\VZZZFڵ˿JA@֨!7v9v?t~hlj{BN  g{y,[xƧAKm4w!� � � � � � � � @8 &B�@�@�@�}"VPB?i۶mھ}v?%~gϞG .K Yxqp *UTږ˖-N:IeʔQ@ /r҅J~+5oH<xP6۲enBb;] ݻL66 lny;nrIfړc ˂m:(Qlf,D|;r 3ϔwFJg"SB< =\x{GZà/w?rc}юB Ƞ/+V,A?>Yd$ߡ~XtiY.`!HtflK!- Bgd}S?ozGGwo驧>s/ [NWE}/?ӰE&]v iA8dorc# C"?֮-ټN?\<5>`K~㱜xNB.^,u"=b9F`G1>=v;D�@�@�@�@�@�@�@�@� >K΄� � � � AD͠* Qn:_ޛ~W-x[�' )    y+P ~>O<o^zKͰСC : QI<YJΖ-"4"huZ,ʗ/+_ίOv)+WV*UTɥX( s/{IK/кx?=3G#7n_6ئMLtecł, g.RæB_x,t klBl,GԲe1Z0~@ l6>Kfy& zA\:S0m6C8V_[ҸqҤIrMY:唣װG#CZdjG% ~о>{Ɗ-V?O%{KBu`]/mnxnAY} ~JB \B}=J!-@.ٛzgg^ $O:p@$3q^0=Ku/iEnp?vfC ̓ ^?HڮZ^ y'&a {$+>̭yŽթn]. (Ce骫C,+{c.hgBF4?&&zx� � � � � � � � �%@dD*� � � � .}%y@ ,Ăb_~}/" 9AatId6YPN ӱ_ `H `[Ȅb4,ի{5jvd.ƋumxF.Oc𜓳$/`A:8`k׮¸-& _ O& TX0j \ m9X`mݺ՛,ϖq႐0YpdP,ƸdB jժqfK9>٦>C!?@.DPjT2S7/5\f <"|eωUV%'motABN}Ѿ}6YМbY``nߥl໠Ƞdh_$(2C.X -\ϗ,o,|IDK/I c͕Kj@z5鬳R<,6sa}-[ >9eX=^|<!Z k,?aA?0/Z?e<ɖmB9*G-]*?[W[OZ GE/}r=oYzqh.J0>]j>0L9ݽv1>M]`|$vA�@�@�@�@�@�@�@�@� a2@�@�@�@�qnݢ86 NXx~ɛ[޽{ZZxa0YFʕH"v:֯_B8Yƛ,^[ S h{SFdaMLƋy_U \rgW0 [lmN_RTR@nGY9`M iÆ bAȘq-VZ-WgY_H&H'}ו %vYMP ?K޲AA +VM\H9v >/W UC[u84Q!ϗlH}~;&/BX)>~\p~-9 j}Y`KD\_`̴bs2TX/,~Y\ÖgA5}&Xћ7YPk9b}BZݏuJIg'<@BnQ}/>Dz&#*UNqXS>i6lA�@�@�@�@�@�@�@�@�A` @�@�@�@  쓃n&MA�Yʕ+5w\.�b.\[TP!>|-s Ѱ_/_<z(`aB i!38czaӞ={+[EƍդIqTlLF� 0^L4 ѣ/i˼XxeSĽtR߿߻%c0[РMM`ݗmec7 [0 ½-{Φ5k*wTLwԿ}I¯\Ə_-G{Q@| LhsA_DA?3N^ EE R@Z oذ/Z.E.`H uey}B!^.3y-XO>)%gkOgEDodahyh@)/`?jmDE3&CO.\8A5|[h\BryʗOn !7^LnsIy0>MN%z1>{EM@�@�@�@�@�@�@�@�L 3Ss#� � � �dqRnV.�Ι3G_/�r׮]^pa4mS]2~RZ9Fc6Y8xZ j޼ZlMvɓ9 �iW_-7ΐ\PMPl٢]MK ,`6& zx;G \cYyx-Yp$%@׮ҤII Fwr[-H2 & XsZmnY%*v[ &>eAgV,p׾ 7k,?j# B!ǖ>00V;\ѰaRjsyy}-B-03O+ƿQ)ѥ~-�-NG ,X`T5*l4cti_>sˤ^\vq4 I^4G^� � � � � � � � @ p@�@�@�@ S$@ 6g͚/›,l S\`YgM8/G`o}[onugm۶ԤIVS(`%7jfurAvҠA-d%tW_yĽzj6;ӽ>-�҂ )!`ct :Y` bqz}g G%q҈\pw^C/ر v9 h^[�%6,hтT^-ZPV0BoC ~6mYY~͛5{?La?s9/ZRrZ@E{&ŝ;wzLX?EƉ'Q‰.]ұvɛi}颋~vγ/&d|F"� � � � � � � �Ę�A1vi. � � � +ʝDeGiڴi^U^=ƛZ4Goy`S_~edaСCuQN84 qƋ7㈜%p=&Z֥ zO�3g>+f͚Ňp[_ҥS?[cN ,B -Ц 6@޳s9}ٻx2VBdVHQ!"4h4O[ fPD324R"2Ȝy{>Nk=9g}Z{S})ͩ?6kfs2r۾=[Bm]`?320|RXbE$`_pɶvZ-kjJA(͍myѢyy|jnO ud>8lݺ;/ *Jo76oy8/nB/v"Ӝ O ^g@�@�@�@�@�@�@�@�I tڛl  � � � @D`@ N1l05jVR%׶m[Ӎ$Y BfΜi~4i nG}u>lo3D =/~er/zYfݻ G%ԅ! ,_M4qW.@~7ӼM:\W :SSO*U\k3+U\xYٲ7!g%Jm+V̷%K~q?ڦM+\y k@X˅d;WSsu<7mڴXx\f/<8T ]a=Cͅ{(a3:$R+-rjkРuVE;<X@w} ۞:uC_v5n8JU` eD:t˖pY`eʬvow>hVG0? ϛ�Ӽy6 � � � � � � � � 2� � � � 3}bFK GYf٫jC yYz3A"|"EX#k@wy}][j<%{t*VXX(Nb"|1&Tb>kv5f? b϶֭Ç�l.L;}�wfͬx(9s|>;m:8 ԩxbTuqcD4ԥҍ9Ҿ+p p>V"-ƯڏߦL2ѕURiZgJ4;*W^i6̴?+'X;\\k/!Q s $/FBի駟ω-[t.1MKժfK!sթ6o}>8[nL~Be~?60Oi?@�@�@�@�@�@�@�@� 2+!� � � ��>) �RZ@a/o 8ЇOԬY;<% lٲƏo~cǎ֫W/kժUb:E�߁t@m3;䐌`wzI/~k>lh֮];w)X*UR~ـشiM0=b?|(k kRkr+VzKRf㏷J G.m̘1~7 C{>-]iˬF͛r cb .; C4 go6=}tVuza5sob\ {xj&1?6EObĺ � � � � � � � �S xj � � � @5 !@x {饗lֵkW袋쨣Z lȑ /` UW]CL5[]/\`Xs!Xf|b.\x%+ͳ�H)QA{v+W.N I?s4h 2֭[ݦMPps=/˖-ýuf-[{ilD ])T dU d޽]`KPL~z{7S|7?0~@̝;z-{~MC*eʔInOM(Pq)@�@�@�@�@�@�@�@�%@dx � � � @ {!^rW +_|zm([t?=/kcKN!MbHA.]j6uD$omO8}Q3fխ[z +WX8 (4^>zk .R-{ӦM+ؓO>ig϶O<яSN9J(gYC o˖-3Bj,J_S/Y?Lc/b;C$@`ƌ/PH5ckjժ%7$]݉Hii@�@�@�@�@�@�@�@� W8q@�@�@�@�@�X X.r2}t<x?2B c)OݡBg|v6p@۾}{ �d+ٷߚj%͋ƍ-[+~A@&n#( cǎ> rܹvꩧZ߾}F>mƍټ;9^R:>m.m@&~ 蜡9Ct.9EctI2|Kf͚6vXxb{ꩧLHKuUi:S0?MDHivk � � � � � � � �$�Aɺg � � � � @ A`?)>ӦM3<G$mX TXnV|W_mGyM:5m C�(86ܹlk9sp v)Yf٨Q+覨 T^`o^{-n}kC %6h[(%:ܢp}ktѹ'իk?L1c {~׃{2v>!]?X1c^zX1i28?m � � � � � � � �$J D. � � � � @J ,Zڵkg\sx mRr{tz +Wn={iѢy睶m۶P@l.w c]w5mpW_}rT@hyE]dzVZP$SHs9:sQ!CXwޱA�8S\"Yve}ƦcZ?nc\ǺyR&˞Hi,@�@�@�@�@�@�@�@��AP @�@�@�@�@�4i5iV^m3gδ}Z%b؈V >|Mׯ/?k#@�T} ]lƌ>kذa{ zRd([u]O?Y2eǀeAB>U@Ͻs!uNJdYvwyv[޽}Xg.611`V:54Y&R!DX& � � � � � � � �-@dAR � � � � @Z 9ڶmkg}fuIv._ܞy;S]XKkq?쥗^:nO>nv;{IN:uiӦ>.\Zx  @aJ3%l^[oQG}tIq阂<@7n\\ڋn$8q|ָqc<,JAvX>}|z2nB^~e֭]x>d['^z6f{J78/Rۺuk6նO[[nm۷uSY֟c_~={a6mߛc=օ�'Q p0|0+z'A69ID[-lvwXɒ%cޕDt<"Ƣ~s-æL/l@ǺXИHDa~4]5k[n͛υ0wre~ @�@�@�@�@�@�@�@�(@di @�@�@�@�@ 5@=}瞳%J$tCV\i&LѣGcޗ W_}/믘 [~'1c)"%?k]F駟ZJ|  �Y hӯ->j-{7;4/_>nϛ7χ >e6g{om۶Ż 1k'{) 5h {g?YX 'nΝ;[^LcB:bڵk\ jSmK}zcqÆ ֪U+;蠃~UC=mFCuM>uܾ@9H" P?tg߬e˖VjUw衇ƭDt<"ƢC-!Sl XИ؈ga~4[Vm}6dU}>5!ɉf2@�@�@�@�@�@�@�@�RY T{@�@�@�@�@ A}IHKVX^=˲z)&ˎ<HkcRwVz1E]?|7VoP{Vxqv@ N:ɬcG+0۲%1ۅ^h ۷o;qUW xޅYdIMst* {|TroO>ontzwt lҤ|ɦ=f͚ƅ̮긵ԦVY-jg/R${SE.YN9[cdۡby-qҸGYvk>`MWbx4i#c1]?Hj*} 9M.|C#(O8ˮqG+V̞|MvmDOs7A�@�@�@�@�@�@�@�@ J}E�@�@�@�@�( \T@ƣ>T cg [6+8s楰!CؤIW^I@�$pW.\U;f;}JLP9rF$94nf{gJ 8p>־}H'.瞋,烆 ڠAg?M3Ʒ6v"'H6'O-ھDGxP*1YʕW^Q:WwiСVTX7e6Jc?rco?}Xx뭷Pw t4?P-ba@b-LXs秱ԏ� � � � � � � � @" ߷6L � � � � �))7ߘP/;o޼ٞx Om֭vI'Ynݬr;x;lK,;χ'i뮻-Z �ٳg=(_R%{}=Ç[ٲeSNޯ{FڡA?پ}I C2mƍ_}v! w__]_kf7p}zeԨQFow hҤ} җeo٩j}B6Gi-]y7Z _?ޖ-[__xێ8[|=6c =zM, 7avesԍ� h7lvfk~}x#įL-͚5 u\j{ $5мZjXժUmܹ~9ί]vΝ;뮻lӦMv饗FuhץKL=x:~( jSvy4/{ܥ*-7K|0T5}W\39q W^viEV_sty~%G3s: /D^zi'pB$hGkkΧD\m5g,PНLD5ѣX6lf,>5gyGr0=k۝X5B:{SԾ^|ESOBt̩h}'~5]*Sk寿!k'Nُ3;ɰf,ڴj֬i:tO<1"eu)㎘m?;;Ƭ,*j,3p̩ʜbNx]9'j[2s:'>}cQkԯ_ߏƍsʮEٽW,;.J Ĭyz K]k$*\}P4EE�@�@�@�@�@�@�@�@ %) � � � �Y v!@\IDV3[zup.0(XfMt(HWsxtA~=%.e˖}1߯n \`N`E~K /׹Ksro,XmŊAF֭[~mmU[<C q}:C38#ӧ A \eשRJB|l=ދ.(cf.$%n Zj1pxAz 6 ؁ \p 2 ԪU+p_>�H|wNfi `t%ƍ;A. n6՚  ~�guVpQG.H:n嗹2=pDAǎ#˞}٠DK/ЦJu)ι-\/sa~^G.|/+9FN?~;Dۯ}9 7+:=.<pV/8v4uA}~;5s!݁ 4<yڵo.;p`~c9&p.8"~iNԩSǿozv }pAlRMU2U[(.X=޽{6}?t]肩/]SZɅeЊ]#rOns9Ҿ5 xE wᵟU±kLգkŰ@ǻ ׌._'>s.L0hӦMcEW.t3{b΋e馛~e՝Xg9Կ~DmFnbnΉZG+ur>ѰB wS{.JؽViIJ0?9ilǷQ@hgy6D<4E � � � � � � � �C}� � � � @ ~-B m۶ iف:(UT~H 4g}|쯰*P~YtFH%Aʕ#AZ>gN uUƠú i6GޥPG_ÏZp!ׯ_Ȳ=zea} :-[ i [ACa�J H{w}R}}~Dr HT@R|1)HfwZs p9q)˗/H&3# T_9 â9Ѣ47ay .{_\h^HKd] b(4Nۥp_)O;{,_Yfeo/ Cùoߦ kswx_-SP5Ӿ}<SY[r!Dj+\Xխ6]@0RXO~RPaXFh^s4ss}nPzO>2eJz0d+>,]v1J,u#kz *UF$c~t۬Ū՛y,3ՕX9(7Gs,9Q69U97UNc<)ȱq<9-Z.JؽUc%VO??>?'XM? DXO}� � � � � � � � @� � � � @ q|mߞv!@֮]k.'έo̥Z֭mwܹs_iذa,\^]ҥ￿)S?>evd֢E s#‡vx-7Or6�iC 1h̑*97�a_^BߨQz]HOd ]Q=uZΝͅjF/DnoVZz5-R#F#ݻOٲemƍ;/^OdQ@�N}{N3 -[[`^sA+L|)Wh͗gRY/]H6m6n.?9r?7pom}MsѣG rVPs@] KVE:T@n6sv֤Iss]@waLجY3xʕ^s5jrWA" cje../o2#xEê;Pە߱xG[ƍ[x /A$Z_egc1/5߼';vׁ.>wy_w.ߴm:yuX8UcnƢιDsa; >}CIx{Z v ޼֕y,Ĝ>Ci,7#9qs\49 KL"<'jaAE#СC-'X|bq(p,2?Mir?>c.fΜi5k4IJBz~Q@�@�@�@�@�@�@�@� 7EM � � � � /KahUjժyU, __+Ŋ;;kC(HdWKѢEoa /R0mSP2h)(s)^_d~=|/OZ*\ٳ}0ԩS-O6gvX7 zG3}tUw(O6oIA�@ ''0Dm.:5wuͽ4v8Ԑ|4`P"{_z饑hޠy,p&L`|Ϳvujþ}%\#0|;Tpp!}G~g͚exiIuԱQFPOvO0uk5͠`��@�IDATS8U4[d2Ru %R \xK:Scgc1/;K5+Wގ=XS}tȘ#7cK.v駟~)4N*X=XT;Pwvc1p<"c1^0s\N8J09YUvکX2?i,朸Ӭ~.U,Ӹm !� � � � � � � � g Ns � � � �(S,̆4N+ 6Z=�E_0Vy-sx3roC ~y_mep>.\]/WR%zq=U}}&2y( {TLza[t鿖zAxL@�rPNr߾fc.L-wu7[li#Fصna˟ `{g}Y;+~wgV]PsgNɰa|x%\2i8fwΎ;8=3a(m۬y>s=z׭[ׇUjTѼ|֠AkM6Y6mbָVj+U]Ŋ}(ƢQg^9k֬\#2?Y]\cs6vX?nd^Džf,nݺ^~eqƍN:U=mTn,6s:'꘻[3{nF袋"dAEmڵ3R"hloJ S̟ewN~!V>7sOþd? 3k[h@�@�@�@�@�@�@�@�x w� � � � @<7!%@� R/׎^_ٛoi;E"rz(A%S=۷oYp#jժv'|z;[Ӷ)\Co4iL:J.y}/Eۢ/N7j(*~z1\/pY.!˕0�R9*jղe[oeӧOwn ,,׃GyN>dVZ@�&J̮*rkd?ƾC)IGZj֬<G/uQuN;Jح[7?c?j;إK}Ogy~a~뮻*Wl\^s#G쳏uI|>Qy*ڎۇ*[}j+ [nUp\`K,qAeX4>ù}Vc1kŰvwv쬮XoGsO_b8œb>}LcHYGV'N+WD7ZQ:Wˢk"Ec=fbZwvc1>HDZs>Zbi^~矛~6[cQ_|ݤ$_zӸklhhIJ0?e~R9?=yd?;t谳Ub<^Әo � � � � � � � �  O � � � �PUbQԎ�q{}ءB=.\N_l]tROӦMF{= kYvtOF]0xb{w|Kpzj?tQA{:,_?9mȯЂz6nkUf͚e7|~B]T�hۺu"5.]>ܤ2RYlWArl瞳.9{: T3f)駟+j.q1xG+b~jv@�@T)͆ 3{nZnϯ 7JD /󏰯 TJppG)),cǎuaO9~mWsGa*w~JhmZ*Reba ær3j(SȣLU߄ lܸq6d?ThYϴ*-[GK=C՟x ShUt,hD+V}QR*q߱ػwo]@VG^s4ss?axux-شil6br5!Jj4h*V3.!;]9/ܤk@tΊeP 3Dc1}-3l,=wyD<⮎CلtbNDգP̙3}>x}8^W)v^z%Yo)C!:1sJ, =oXd~jr< Wȵ>S8G:>ynAxO ԇ� � � � � � � � @R!� � � � @ pC4nv!@6myA&ME}Q?xw=pA!(]tl߾=4iRPvmL2<|';,ׯ D 5j~xp.l$F_wa7 I}>˃C=?wAW_Aŋrmݶqvm.D1{UwM6>reV\0*֭`ʔ)֩YfТE` 6<3Ajz.$p'/"pa~ږ ONj B𯻰.0%p|r`Æ #vhp1:4IH*s wz ֭m\sp'xbNbX]h@<ղB믿r= \05ipa,|©]:{t-ph?%Kukha{cdY-}ف 7'{r<{.)hذSٻUT 4t7|a\uB"']H_~ 4|VؓN:)|RyE3͝U4\\x6v< \༟7k6o<p!.?p!MYv?kŜl<GA:56dRN^Ȣ/rᅁưޯkӧ.-r"_s>|כO>k~-WcQg@NfJ߾}ߺ޽{W_erꜤ:G0Of]2%8r?Cx͝ŜA<"cqWωX霨T1}ypĉZŷ+cq;ݎϞ=۷44&46U2?MTsh5܏kq5.1?׶ � � � � � � � �M 1� � � � @Z E]kVdZm� pvG[ʕ}\h`zuVs B}8.X\/ 40 9m ;~-_k.p\HP4BdX޽2_d.1W?I7!\Hu[̙cV\ O?\@K1oHІ5)zKHe7mtmݺ >\8`lA.\ Nk^b5?s;]/ jQPɩ9e-jΨ. ]pk<ټy̅v +7%-ZdvU/^l{챇o?cLs;\ p5sWnreBͅ %*ӓ+W렬JA]stUY-+dUw^B0y[s]4g+Ui (Q"ۿFҥKs.^4yݡnۦMx5]`4 nc1sv :v}ts l tpAꫯ M8~xܹ'4\`q9U4'^g~UX{W=J4] � � � � � � � �$�Aɹ_ � � � . `'fZbep h׮m޼ن  G`K:YG_qYƥD62`�+ /gy&_Om#Y "<G w.W.͚6{֒%K|a 2\;{F x0aBdb<ڈn_aX ul߾=s/t|(44:.zT^pl6x`;餓—z?vXڵy~,VV-rc'h#zƱ8n8?w_5j)2E[ }'[on-xނl/Ffe] 3O+4Tǭ~bg%;v֏.W }g]uU7!o0?z8FsbO@�@�@�@�@�@�@�@�Her*+w@�@�@�@�Qìzu LGHR>|֣Gk֬=EIǷ[*Tn)F?׉ +VM,Z(M%~Q\~>>}$?4� .^{ͬgOstfEng-5SQʕchԬg5K^G}ضm)lGa5EÆ WԦLb}ui!'V]*3f؁ T9kԨիkGRxxM_Ƣtꫯ5\?(QD4G볇G}Ԏ9wޱ~ڎ:꨸!Uxƍ~QO7)ر,͝;ׅumfͲAe~c/iYN?<Pp3?Ϳe<x-PΉ6?<F�@�@�@�@�@�@�@�@ v \I  � � � �L@yW&}`9 ?u]g|C&oc�"(K.U /حj (xͥuva=^`̆5]$;Zf>hv<`۷]qVl4N+I#駟ڳ>k)Mm۶͛7O~JG�Ey'KgS}g:tؕ)*cqݺuSOk8&S믷_ݺvjwuխ[7E&_M6p>NjŊݻww=L2:i?{v0Խ;i4ivEB;D&4;@�@�@�@�@�@�@�@�(� �*@�@�@�@�S`֭~ܗ` RW@!D׺䣷~:w쿘^~ݠB7nѥbŊOS~kԨQvۼy|KK(D�Aԥ pf<q2Rnj/㫯zm{G\ڧмGs:{CQ#졇3g;J*IyK.{BaM7dgqFV&%Zv*_e'x‡yvɸ K0s9nkԨQ2v>X@Ē%KnIeGD74<Zh[4)wKB:nT&d( � � � � � � � � P� @�@�@�@�Rc\PHRvN!@  f\B!4h`ݺuo&ŷ,_T)Sc-շX &MXN|Hٳo&2w.G�XfeůŊK/̙cr]D)< J+Vc=fuԱs=ך6mjfͲgy&iC u)R}T_gnݺ~[M#.cQKtNQ1:蜣sOM4FmϷC9ڵkg#Gm۶%kW YG@ձcXDzi:Ɠ5Ri 2]Ή:?MÆn#� � � � � � � � `_ p@�@�@�@�@ ]'-2s߇ �1;v=C6qD;c2tg3q*?쥗^{Ζ-[f=zojժBeСTs2 @.ǎ;lȐČ͛7SO=eSL!A:vc,B-?^{5{ڳgOի>^_d0/;묳ϷmZѢEU'oB :V૯j_~qvWX.]R:~mݻxAŚȷO?d?\yּy|י72?M>mW } � � � � � � � �[ x � � � @\\Fըaf}ĵiC�B*0ydF[oYrMR6 (0zh{YʕMA^zUZ .^ ȴl`.ܹũ,:u6x`۰ar)vgif˗,B ~۷oO?Ԇ fNPЕB/B;3xL [\uȑ/۸q\UP7)R$S59 Y}]?njcᄏu.b;s EXt+6k,kҤIXRd'y7W?:m4_]pVJzi+rC 4-w� � � � � � � � VAdc@�@�@�@�P�͙cVDVk (x˗믿CP{Ν;F|Ԙ ?~I1b]N:$ԡC+VXn;@,.u&2k\٫&~7nC uvꩧZz$=(֭?ޭ۲e#s]t/-ZdC SL)lٲil\̟?߇kJ V�‚K*<AOk4h]x5noΉGy$10 (pN?P̙3m}N:YnݬYf~S-a~F;37OS|}@�@�@�@�@�@�@�@�4 2Mw,� � � � fٵG @MPj ]@Q1cŋWWh'EVXa ;vYZli խJ*)%t 2y =K=Q:v4c.\+ydAryuժUv:ѵjՊ0])\iޯG>s۶m}v駻1jԨۙ 7o9ҏ>̊-5i҄0,r5qXbŊv'�DQ_|://VR%;8) ȏG}ǢOS:/3tQV BOh@�@�@�@�@�@�@�@�\ $VA�@�@�@�H}n2{y9s+-@�2eJ$xw^hӦ'*_O=Z0=߸q}WoƊ+fu%~  8\s[f?`VB]mٲ}ی3|[-l=,樣l޼?~>tNW}ڵkg'tsLx0\yv>n8[xQfj*(_D;gD@ԗ_~ǡ ȪC=N<DS (̞=4uNO5kڱω2ӏXPȭ΅&MsZҥMyi,XOD0?P$ � � � � � � � � G MS � � � �XƬ~}sa f~2 -0|?>xA #RxEţ4Xj~}@_m6mZjEZnB`sR Ȥ-t*V0kS^x!7d>JWOusf͚nrtɿ;_զNj vW蜂5\+[:(.IF4&Lo [l,YҚ6mGǢpk(E48tmMɝ 4uN~RJ~6o45. ͝i�VuNԱZRLs(Cuo:%wOsZ0?ǂG � � � � � � � ��A7 � � � @7;lqڶy Sm۶}ĉ/J.O�ծ]]ĴCT^` ՘9s+QxB5x~<}@B8k@ { U#^s}AF~H{hBhpkFaf77CVP!Q] lٲf͚e3fs8t<hn^hQx\uQֲeKSN{T_8xԼ~0]+>. ̯~=>V^C5uw}g ,W?2qH@a 26mZd,N<.\Y5i$rNԘ:쓱 D·:6ΝZZ5;#XԱQDd܌Ӕm14ӘR) � � � � � � � �I!@dR:� � � � /2s]v_^5xJ; @@)�eʔ)^(H' ]Pl+V{C@~wP(Hh֭z%UT) r/@dXtb.H͝Zw> Ps0)L5k*HspV^=mN 7;ذa)tp~ޭAݴLa;Ŋ:ȇ*T }wZ'/ƠƢ95uB E/C-c?U˗/PcPc1 ,_8B@).QoLu8xY f=uV?4WtEI&04}9bӦM}�dժUlKһ;O{j똟>f @�@�@�@�@�@�@�@�,@df#� � � �}QlĈT6P@_Ot*TBݺuM!(pIIClڵkmܹ?Gn JP ^S\r$S! iV]Fd)@d,,D`\)v@A3>+ {v{ 6n`nj׮BjZZsE&6{gVlۯo<N!sڧްaMK,D)}6mAME>UXb8c+%;U;ŋo83gj*iJLoԨըQÏTtʵ?4{MEm.C�}+W]D >91<jjj,.]:yvowRsƢn7o}z΁Xxԏh9%&>ɩGOsu@�@�@�@�@�@�@�@� �Ak � � � �N`m| A�R[`>( "={0PCC￿AQ!{~VLԆ( BE ݇a ˕pB䧀Gׯ ,{ GT�pC؆5)V-P/W`n2BڴI@~Hؙ϶(1˕bŊa0tg}J*,J2לmɒ%>`Ns7nׯT$0LdN鄑ERB4±`0�TJXtqaXjUI{({-]ԏq^OijLnݺWRxq5i85±έvg;53͍zFơ’b Z[c1<^?tX\*NpN ϋ91,C5:'*87*Ui;:O㿯ߜ@�@�@�@�@�@�@�@�H a/  � � � �yxo63Ƭ]<7 �)!/'s5��q(#,˗A a�B*Wo{;ܴ~*m۶UrJ믿"7-[̇(Dŋ�. PhKj֬w=#d!AY8,i̾άlق7j\D.B0Mwۦy¯4S{VbEP tRHu*^;"tӼV)J Kɒ%}f€1㘷Z~Æ ;CIAiߴiSGaX}8uaX j$=ñp ~XkE 61{C--%5gV?g?h;∌G<C:j EC8ul)L-,Sp<^a8{/bQhj8p\sp FCt. U5ω Ǣơn2^9{9 � � � � � � � ��AH- � � � �)(p9A~j֨Q n�]F�vA@A P؂n AM`D(\`ݺujIa8B![2e"+GA zn^V/7 qx>֗ׯ_o s oXA %YfͿv #7K(d}(d�)nfC)Ć�/rͺu3{邯?j%NÞt4ќ(sFs2q¹³4}x~^TȜ,h;fϣZx\-|ytJyv(+ 5w Ct sǂ|gɒ%(6ZGc1 VĂH0Zsz]J|=pE_'t7np܅c1|{mt?XSħpcQQ2'N̘'n7k5b}:~52E}>y,tgUt,zXx\ECe˖8>fg ~㬊\އyQD= "ωv<i@�@�@�@�@�@�@�@�@`WUAޏ� � � � .ڶ5;/?e7#�1PxB›ǺWP B2%D&lRՂ ]C Q|}�EMf~/f+$! }\a Q @ p>>oivyfovi3[Q BXY]gpս&3eD R(k۶U[nd]γ.[)Вt?S{4vyga<0ԍ~<( |n,n޼9r )1qyƎ%s 5TٲeXx o,vJc57Wge?f!7٬VԒu4?Pbx>ԽΙ9'ܞ]V55s351{}ny 6?<&H@�@�@�@�@�@�@�@�Hm S{{@�@�@�@�]pev1f.&N4Zu+ �x-3Ll#   L#ع皍of+ 0̅Bu <`vmf=gֳg!!k/%f X.R � � � � � � � � � �(@�@�@�@�dc>< ;{L@�@�@�C.lh3RPp޶mf}-jַo<F ~[͞}SN k!C̆ 3[젃.4� � � � � � � � � � ? gMK � � � �I*Pfo֪UF0&ig � � B˛fFO]}u uMw0+5MC[Gn쩧t SHV)S̆͸-X`Vمf?6l_ � � � � � � � � � @ -D�@�@�@�ȅMd֦MF@Gը7  � � @͛uWF`qǙzhb!0H-jv5N 73إ lӦ8oYf睗ظq � � � � � � � � � �S ¹j@�@�@�@�,lDN2klhMXE � � �yf?4ov=OogB"pUf۷]{mFW g3SJ@:F{̌c4v]wvN̺t1k$7 D�@�@�@�@�@�@�@�@�@�RN Ȕet@�@�@�@ UMdvfZ b־},[n@�@�@ 1{ ƍ.W \sٶmf qsw! 6jG1ӱJA 0#Hth@�@�@�@�@�@�@�@�@�@ ; 5@�@�@�@�B)P٘1f={u`Cf7P()h@�@�@U3{uN3;찌J3 ҬhQ޽jؘLǤ>'1JA Q?OW_5kl3E�@�@�@�@�@�@�@�@�@�ȋ�Ayb]@�@�@�@�B#P/5h`ַٷߚ `Vt!`C@�@�@�80: ڴ)&0Mt-mY>a gB:/sDv ?fcvfuᏅ`@�@�@�@�@�@�@�@�@�@ LG@�@�@�@�b.pak֬fuļY@�@�@�V@3ful6eY͚il. rKFd^fE]r.Vȇ /n3%?ΜiVYg=Gg]W_h@�@�@�@�@�@�@�@�@�@&OA�@�@�@�@�N>l4?l5@�@�@�^zN?lݺ,pfwaֳ/f =:tԱHA fMծmf͛}!Kd#� � � � � � � � � �(Fh@�@�@�@�TP@_]{Ynf|`Sfe˦@�@�@ Kfomn-]wmfv%fEu-kܭ + zl)S3~3ŪmE�@�@�@�@�@�@�@�@�@�H@5M � � � �@ɒf<VfZ[Ao@�@�@�F6S׬o_ /4{5v]=nh:(…fO<a֢~64;?4Es( *HDI* éwk É$(YH Iɒþ^evqvwfWO3==Ugڶ%2ԇ� � � � � � � � � �D�At6h  � � � @Tt,-\(sԬCҡCQt� � �D@Ӧ~.ZD5D /H>(|@vm=*ZK~@6o^]Ͼ UFn.Lʖ-L@�@�@�@�@�@�@�@�@�@�C@�@�@�@�"ULiXi�?~IHm1B�@�@�"SছmۤU*^\32I"C_?1O{vъ2D?DR,Ybc",qɮo:u~}̑#ÚƁ@�@�@�@�@�@�@�@�@�@�2X >@�@�@�@ CjN.Y3wo_@�@�HO}% ˲P"Ep<>NJ._>).Nj?LkF\޽{d6VEJ}?N*#]yyR\� � � � � � � � � � A2@�@�@�@�mJqW>iHz~;@�@�@ /$YxWK&I v5K.ϟ{g*]uU8]V {ァvaQHҀk嗇53ԡ4tԾ;w +b7@�@�@�@�@�@�@�@�@�@�L#iN5E�@�@�@�HknV6meԏ� � �Ć@,rkRjH;W_SZiԨ;5Ƕ];v ٵ= Pz۝waعSz}˥%giݺ'Ҷm~n*A�@�@�@�@�@�@�@�@�@�bN Ș;t@�@�@�@ #}W1CڱCSG^0� � � pzl٤aäjդK/V:<K&u.}%Nvz ]cfoFؽ[#��@�IDATC z�G(kֺGb>򮩼yx2@�@�@�@�@�@�@�@�@�@� 2 � � � �KK~xC<X:) @�@�M<yJZ~)6I#%?k1cS/ľ]+vصcwSZ7xcwJ`^i S'D O ~x⟚;V˗@�@�@�@�@�@�@�@�@�@ y==G�@�@�@�Hcpp -Vo_fMiذ4>0#� � �Q.PR~Q![ 7HW_-kĮfټy{==#ʞ={ .QܥkW?C nF:3z'/+..#� � � � � � � � � �d" 3ɦ � � � �#PK4h !5l(M1 � � @4\jre? rɒhh5m( |gO骫k'q#[WkŮv^r_+V%JؿnG mWM7>UǎGiĈ3G�@�@�@�@�@�@�@�@�@�8{ ގg"� � � � *JAsBm֭KU5� � �djդVE2MYX{IݻK;K|sk® FZkf۶mzC)gΜ1:wg?RsҖ-g.?wƍj֬͛)SK.V@�@�@�@�@�@�@�@�@�@�R @d @�@�@�@�p ԭԩґ#RRҬY< u!� � �!/4vT9~l^@V¼tRNҤIisj>우kîV*P?7>\Kn,Ԯi&?D.EOX`5j;ٳg~'=@�@�@�@�@�@�@�@�@�@�R!@d*@�@�@�@�p 4o.M.'%]rte̙< u!� � �/74fd-Z!]+zVR.RǎҔ)iu$Zk® rz7*wyKGK7?^uqK"M,uXRWj֬jԨΆ+&@�@�@�@�@�@�@�@�@�@�H�A)bG@�@�@�@�F 0AڷOjDjJ@�@�@�_ O?ڷ_dH^ .οFReڴs\aFP+W\ݻwu 9"+rTԩzs҆ wKJo{n'u7V <x@�@�@�@�@�@�@�@�@�@�$vA�@�@�@�@ =.T[id){v"Փ Kp @�@�@ r>X>馛_ҺA+:t"={Z ܵk^u~r͛Mxi$p*?ZpeғOJK3fHT̙pq={Ok;;@�@�@�@�@�@�@�@�@�@�0D@�@�@�@�@ -[>wTtҹʅHHԅ�Ć~[W^y^~_|J*i„ .� @4 d"'R>GLg&}d?`p3g%Ƨio#عsnޮBkM$%CZ_ReԩzTFΰmjݺ t O~@eD;ҥWYPz1知Y�r ~p\pBDe�� � � � � � � � � �Y 0R � � � �WO>\ZBr{Gʗ}Tڸ1\G@ z,�ʎ;4yd3FVbڵkn:ٚ� �63tUҁ᭟bG�  iZ]v;v@ݻW^(P 9 ?>}/㾘rq-ZH ,άź>e\Զ4g'nW2rر7ng3e^/@�@�@�@�@�@�@�@�@�@�t 29 � � � �8?֯OCreGi @lL8QO?יիO>1 ;3"G@�v]%7,ЌRGLg. *h!]~=z9sm}ҿ;vL_P6mxmM7ݤ . H+Wjٲeʚ5s_[�ӧK\Ԫ]D7OzaJԝׯ]g*մiU{3LC\F�@�@�@�@�@�@�@�@�@�2@ s�!@�@�@�@�@ѢOH?,vԤtҁ: �-`zJhZJ *Djh �1!иwRzҴi1-:9rHÇs. A19skߗعs۷O׿\=*\pÏ=&OxK_yFBT@1a?׿JS|㏒;uR94ivx^UE˸+/#@�@�@�@�@�@�@�@�@�@d � � � � bpba'K{K>(rt]ҹf@8$ &Yf?vU|y]~ѣWիժU+m۶MFҦM{{ )ƍyf~ynᆐG=ϞuVխ[W= ,Gʞ{W^믿ŋ駟K/Ǐ+{zG4uT2LΝ[=VHx֭Vi}4h,O׎ 6w|bŊz믿W_Ղ ?~tMA@�@�Sl4{Ԧ˅?LEjN1aFt<6j$9 <x\.YDwVϞ=N@ϻmr?w1aURE?J,4G)W\S{ >|CW.B|Ķ[iڴxMq67ɖ->C/r̘1<cK *?s6lv嵱SN.ӥbry;D?>t\$7R 5S~ j۶}Qn;˔[' � � � � � � � � � @nwF�@�@�@�@�H? o_WO @oZhzy%Jе^ݻ{O ~Šf q ZE['B-ꫯ6lxv ꪫ{p? vlҤB-<cV@ZvZK,'x-$_ru)k֬;v 2] ڵku{s�L ٲeO@�@�0 g{\("34r䆓R�SvI4:Ƨv\9sk8(;vP 񷅺[26kL3fvܹ>}-W6,D1X(F u[>~ҤIq|IooBn}~6oxUVy!v-[jow^ wy!_||8v9XBK.;]"蟹s0J$ K?wBi2gRׯyZpP Q � � � � � � � � � ��AiK � � � �Iӣ$o(.gLIi,OA�"Y`׮y{!_bA(S5l0}*Yԩur^(m JZxb[z` eKmeh.bd] bA,k֬ќ9sd0PN>{<K, ,SN?'NXɣ^zyOxݰ@H#[l.L7NtwzۭV}� � h"ؤߟG2˅|KmJ4^iO9simhyᇽ9/Zh]vyW4,>q/2`� < qG0ǰ}N7 Zٳg,Y3F-3qcŽ}k^`=hhAŋׇ~{O?v B.~i }udm}egrrO?I='~[oB4arٜTR c~@ @�@�@�@�@�@�@�@�@�@�4 2 P@�@�@�@�p5{ Oj֔ }2uH^`ٲi[uA5j/rgR,%q]bKu1u W fGv[LoݥKU (Hzݵ6*Cѣ^Xeb̙V B �K v뮻pO?{^F#F$w^,l( � 2zqR<\rAR6ra'Ke|S;gvڹL!Ct^?/|Bͫ+Wz!Oja]p.<6~O>cX|.rW;lbhAkAwI  v9eas~M]ts SԾJwZ.cSW_-͝+Z%/]xkЙ^y饗zvza0L]@�@�@�@�@�@�@�@�@�@� VN*C�@�@�@�@ rʖ|RZFkbE ?nI8Q:~<rKK@�@CKӦM?Sf%-[6礪XYb8ץ˲e\*'8$.hw%\;v? 䊵y^oOg{'7|}P@�@ 06kԶd< >gȝ[=ZUKjZZDmh%#0>]]3z|jΙ;;v.m۶yavmna=lаaCo`nw4ǰ}BsO7˗wO5eoW_yoz!ޝdѣnfϲK ?p@D1|=Tk]\JgK. M|I~zK^g:ݞ2է' � � � � � � � � � �$8/)=]@�@�@�@�~SO?6m~r[JcI.�D~{R[Z+%K<i:Nɓ'v$~l%ԭ[Wý1bgʤ$رcjԨ~GkM.BH}V̙sJK߯[  � pzAդB-|'`ð1c6mN̑/a0>}aBo(}[pa/qƍzu뭷L2~I3fa1[x�&ea=nF-]T/r̩/n8z9x`Y&LnݺeþzY?vmB*3uSj 'ờwAuK hٜ{ � � � � � � � � � ��Ag @�@�@�@�F>}ٳ`믗>XYSrf.`@r@ CMvΝoܸ::t~gsz?ӥ<Ӯ- Z=#*]:w{۷?-pP%\( ?QFjժʗ/ 'c[q@�R'r5o}s>H;敾J:uk԰aCO#k|jΑ+;gv+9rP0زe7yFܹy[bJK8dD #׿兿wUwyׄ} g*w}=z… >M:Us+MSG:<魷5}a+~(eI;d]wua͸TR /lP7 � � � � � � � � � @RY6@�@�@�@�}5^~Y4IWϿ_Բ4`cG;C,mj͚56n8+VL=L2+b-E\ v{mwܡkĈj׮ $y˅Q^۞_[[*�Y`A/BV,V֬'={x8ZXСnҤ,/>ӢE =^ߚ5kʕ+~޾� �g'pvҭʍ}T]<+\&Ǝ{IZIAO#k|OsdٙK/bneݺuZ|}Q/,Ѷ<#>> k8p.]0Hn16PZ@ݯU6m gϞּJy=>EBLoz1lK]$U&\)Syu~Z?"\+/z\-*�+/Cո� � � � � � � � � � qNr,@�@�@�@�,#| PI>?rZiqR%)gj;A�?~f~ e+WjС7o y{`/B ,0gyƅp?+{c;޸^oX�dKrk?j̘1^￯ڵk{.io'Oխ[$ٳkӦMҥ4h=f!W_};N?vܹk׮]\n=Oj*YLǎu{n޼WBS믿W\~ɎMA� u Z _Ԅ�/'-5j$-8@R%N G;ub|S7|:mZ.$1e矻4rjɥI>^@m`#G UV'N!/GZtо}oY(W^';P{G,~ѢE^=y=纤Z;�qF劅LA:n6m Ng&L_~EYGZ1E=M#rs,EɾK׎x%7B;/ֺ/}Yٹf2d~"C�@�@�@�@�@�@�@�@�@�~>>،� � � � �XBO? 9f.İ?/X0usaLݽ@|Zx\bAXcŊ{JE4zj/K} _RZŞ={;w-إXbg}Q/|YIw&lA@c! W/+S#DmR>҈Kgʃ墡 -]zy4úftE ti'aZ.B-}ٲeڻwԩavظG6oطo+W./$dž ҰaҐ!B)$u*tf˖Z{!_s59sy׺Ca~Ԏ� � � � � � � � � � R S*~ � � � �db;Q NjN9 #AawF��A  5eckt %m+YhA&S"vYC Y>C\ba^tRU^=Od_}dᏳfu?i#kDX~{?oKѣG뢋.@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�T XKS[,S'tTU 'Av d ě$(@ AVmۥ?YSW^ >ӻֺ'|R~[My[@)"Me||ԩ 6pfAIRgU5Nzl˖3fHKC =zH^3w\uQ[\G7neFX 39^@�@�@�@�@�@�@�@�@�@ Fvh � � � �D!M7IGK۶I+-K\"'S @$ -Z5H>G @�X(ZTi(?fMiX1};@ʕu=h̙Lʞ]2Eڿtp _oZ(7ߤ.ڱb wy@w<o;=&U/c}$u![n5kLC@`7@�@�@�@�@�@�@�@�@�@�tJ"� � � � @ 8Xpʗ_J& u"u$5h eib!%0lԽ( dudОt;wA| o/TjcN,Hn޼yzՁZNʕ(-6nZ&M,~Ϥ!C:W.+=+>@�@�@�@�@�@�@�@�@�@�F?NWjE�@�@�@�@ >(m\v4xt%RR7KÇK{d::� � �Q"PҔ)ҺuRZғOJ~O\%Kĉu-{y;1j%KHޚ#Odw{OjN*]Z>Hmu׮@۝@�@�@�@�@�@�@�@�@�@�H,%ޕ� � � � �S`ih;)fͤ+s Ѩ Q`0{wjg6#YHCJݺEgi5ѣKO=ԥKDG};S 4u?~0؍[zaeDV;56I-[JٳK'K%JD{"vIFICqqWH=z � � � � � � � � � �d& 3٦ � � � �DرҘ1ҸqΝAZ�sG@Ci�A@ e�ؼYW4ȟ?IMS׮]]dVōTΜzaJE"[ g)RɒЪmÞ=_}.Qʟ?zF@�@�@�@�@�@�@�@�@�@� � � � � �#Ptu'H۶ISi!K_ҥ/Z� � �+P_ڵ`H du~p?fPE[4֞=Ժuk1HaV~'y{߷t,(!~_ӻX0d^@/C�@�@�@�@�@�@�@�@�@�@ AS@�@�@�@�@ UٲI͛KI?(m$TIjI*Hw!!*^vF�@�@�0 e<嗥>Vo:Q] +VL&LP>yn~ b @cǤIR"ּ}!CoY:|Xz-?th"4@�@�@�@�@�@�@�@�@�@�L.%ޕLn@@�@�@�@�@ ^7_YԶ4i"I jaä%Ex@,СRngYOC�L/gj+K]'e'93͵1x`rmU0M^ܻ2 @:orAҔ)Rٲa4Tq4f�W~9!u*) " � � � � � � � � � �Q.@d@� � � � @fعS<YYRʝ[jD0JDA� 2-F 3HM'>@:|?]i-I[ cǮ#\yfͪERRKSJJҦ9vd~xf~UWisdjE�@�@�@�@�@�@�@�@�@�@� 2-T@�@�@�@�\`ݺ'J*/leKɖVZҼ�B`.8} ~I#rmF�!@d8B.~X=9Q=;/tSӦMQoj[TH6<ڱCjF@VzcC/Gꫥ%b@�@�@�@�@�@�@�@�@�@�#@d9@�@�@�@�.,rdvPH[רt ťnГ3 @L{#@M}T9SjNz)q?=SobzkɒW]H_:csV =|ٓ6'C-1L/ ͣbG}Ґ!K{JMHx5RR!� � � � � � � � � � @, g> � � � � IǎI ~pB~E-'Y_gOip{HKã y6j<R#73m@ȦMSSFo=oӊP!wt&Hh]l!eH GK^?w.^۶!+X-,q(-5:Xl,!� � � � � � � � � � 9̜^#� � � � ,hn\i9,VL  lL")..SY2L`:v<敶or<~<��Ags@l&M!MZ!mB][\�YMm'=tzf$l٤/,!7oC Tm3ή �| lM*_L58 � � � � � � � � � �D�A|h; � � � �Q̟/YbasKY;Y'!CY5{v륁zm  RNyoRzRW{GUg%K@x6ܴIʗ/zT̉}Z�fZosIM}1ugGz'+U@�@�@�@�@�@�@�@�@�@�8@?̣ � � � � @ X�K/)xHEHo!h!,(5j7beKY#2JVuRł".G؆� �DN˥ϗ>@:|8:D'@3~;F#7cPf`n3l!Ǐ>}6mᅲx@ZZ;WW"2bX#� � � � � � � � � � 9Ļ9J/@�@�@�@�@� ['͘qbYH*Uƍ&MV-)+?rXD D`T*EJ۶Jʆm ,YCnS �Gg鮻…S[G_HW]#?s6nr֟},Դ\9b63Sď};56o_{w=7Ko@�@�@�@�@�@�@�@�@�@�@ Aތg � � � � @&ػW5D0ْm˟_j@j_6,Ѓ�gp%O ɞ]Gz3 yr<-/ҫJHGJ*wTrD}%0r4l?&TzKӟҫUswMI r0kפmHK}-v{ kfM)Q#u7 � � � � � � � � � �Ķ�A}~ � � � �cҢE~ȃ=O~Gժ'!- $ >(tɏYتR@� 2dV}ܸQY[jF,Jt-u"ٜLBi).L{Fg 0ݰ>ԡÙM=|t(-]ꟛ~hO?֪X � � � � � � � � � � MAF٢ � � � � ;vH�CZݮ]R\RݺR~90>4.͓;pKן{ @ (!@f̐UKfppzJi�~OHY'ҵ&O4=2xԫ ɵ;kVX1Ǥ;rNnn!={J~yᇓn?gߣԽTNa+ � � � � � � � � � � *@d@�@�@�@�@�0 K+Vi…ґ#RB~0dh8d2a<8U!E+Kb%{v?l��Ai%K NE7ߔ>XH ǟK8~C%nosb5jHKn۵jI˗~iVJxBV)gN[$kaO=%Y58OkK ʂ'WT-񢋂X#� � � � � � � � � � �) 2eN� � � � �E@,<bpH `zN,%KT@D <bFV,fM6"�i%@dZR/޽~[o6g[Z)o޴8"uK~࣏$n =Z!1c+<A�dr~7'oL95Zf;iiJbE[7?3@�@�@�@�@�@�@�@�@�@�[ >@�@�@�@�b@`i\?? ]wlA@dR1i@O?Iի;OZ4An"�i$@dR-қoJÇz\#tԢy#8@>D^֬~`\?=;UF6Ϡo+zIH+6YڶM BCۘ-{!Y?) � � � � � � � � � � @8 "u � � � � �aرC7Ұ`H[֬RRtEI+T@: ԩ#-Z$9dJ 3iĔҧJ|*U!oQR%S9~\6LzI(>^6Mj,:jmH/ժI>+u)FbyGǷJժʕ&v@�@�@�@�@�@�@�@�@�@�8{ ގg"� � � � �*sKV `H[jԐҵ,>Cyn6{ȑ# ۡ=zT\*[$֧aŘ۶|yn˷DWl,ŝ5kVoIvl,Op;:Gʞ=ZʕK9s<e( }AF9 ~ A֭~7A|%< ommˁ`l~b}XӧӐ!5qc!w=衋ZBcķ:qZ1sq~.Zʕۥ=@ܘ9)ܹs+Xllm%=;-+V)ݟ@�@�@�@�@�@�@�@�@�@�@�%A�@�@�@�@�"T`^<iɂ!mYD.O.TC:|? $[~ڙLҬOXo>mvۂdBe˜ XK80'T 9]0c6c n/>xfϾW-[>uJHdh=? IB,C /-hǎbH ``<y(o޼u`Ħċ O YRD~ݗ_aK;ʅIW\!7fFBKlL{eϞ=yRmx qq]*Pa7>\RnƁI3n c'u:NvRA 2X!Wמ=\Ͻ?;'ۘqCU��@�IDAT8tq\ (sI]+u$Z)֤8uzJzSc  � � � � � � � � � � G#z<@�@�@�@�@eKPH "w ivjUeQ ~m;wzk 9b!2X\�ķ-X0p1 $<bA2Ac 3صzɂm`еB6-3f?A�Pp;аķt}XMi7-*T(a [,V:T @ 6v쐆 R~(dvr}o~۷k뼍m[08=b6 zp<t:qznpMWѢɵ(2'n`lBuXn'i<%$W<6.\ oo LXZ5iŊv@�@�@�@�@�@�@�@�@�@�@<;7� � � � �D…~(d^R\BYڵpH[Xil!% A1xرSAxLޗxm1ٲe;l\cᐉDCD ے � Bq)-m.^ $*e3CocQ X< شI>;Ե ٺiPl޼Y۶m֭[:q~hs  7] ,0tBv ,PKis5k .2ޅG],Xgsˑd͚݅ƪF*YJ(ҥK{Bs@�@�@�@�@�@�@�@�@�@�@ ES@�@�@�@�@�p 8 -^|""- GTCںfM?82m99_5` al}vYH|~(A1-0/ ms>Q0-Ǯ ' ? P>|R,!%ñ@^GGDȝ 2NA�taP9s>ץ.]NK/rJ:tHlܸ1ᶅ>.Z3,:tac`|qARHNm,l`Gm9-=\!CeʖrykmA@�@�@�@�@�@�@�@�@�@�@ �AE� � � � � BX@H `H[/]*YgUD֮C֪%U ~ bl$В#GSaB߶ٳVm}qP ȱ GZPS)(k8׶͂ql0PcA6B�HXF:T9RPH9oNYJ?$25m1?uiKup{Æ ^^PFeʔIr` Λ7o4dnݪdi&ok �˫B X+U2S@�@�@�@�@�@�@�@�@�@�2L  � � � � @t X^DZR:rDʚUZD0d͚D֨qr@ݻP eƍ A={p, _04gۺ` cd7 ,TPF8e_ ] )Wr̙h1/@d̟b:�0/GƍPH <>-qZJk׮us5 s<3nhAbM 6ǵ`ܶ@ϟ_+Wv?P[9wʂ"]Y#� � � � � � � � � � @ C' � � � � �!`!t 9!y\tA1.R]/~~wބf.\ `Z-ZTGA�88, 2Mjm!9:EZ-c9bs;@$]eP[t9A�J`i8-XP}&q~ڵ &�*TWM<>mm|6G),po~laիW.EiժUy睗)R$[@�@�@�@�@�@�@�@�@�@�@ AS@�@�@�@�@�L 7ǕZjUba`=fɒ]J5SM]hL15k ʗ/|e1�g+m6Y OZ~gf U*U :s,c-t@b p2={xb[edVl^yj̯ %|Z`;Fƹ|޶X[~w%JB!k׮?[vҦQԊ� � � � � � � � � � �a 2T� � � � �ĎKX˽a><xXZVre/={' q<kf͚Z <z"EzQIK*U-[ J Ǚ @l޼YKX,Xuɂjժ-gfٲe#<_~%adb!;vP7X.Bխ[7a)]4z � � � � � � � � � � aAF 9 � � � � @z :tHK.…  6xM0ǪU&YZXdn.C�R$`!nrJo` vӦM^VZ?_um-DAwdv K;wf͚ٳg{˖-[�d-\p9HH\fb,XثGYЫ-6q4h QF⋕?X6}@�@�@�@�@�@�@�@�@�@�@ jSG@�@�@�@�@� ޽[?-b:vXB(Lڵ0[רQ 4  +e} hѢ܍7z]̗/eYuUzTV-}2V D$WĒ<N>[M}Yy睧{Yq\bN#pAa̙-67of͚yKRNS!� � � � � � � � � � @ (!� � � � �"pQ4{l}ZrPpaYE]-\pW9rDHi vB!-$BsmYd>ff ԰aC5nX*UJFrİ 6J*B� سgL[VXB K.>4i}f͛7Z!@ }?0c ͜9^--[T" @�@�@�@�@�@�@�@�@�@� 2O!@�@�@�@�@�|xSNӽ+_|_cz^E�PB - rܹ3gxb;vLKVӦMլY3YXNڵ)Q!@dT&�!_zYc-ԪU+oSC!^D� k…<yw i;v � � � � � � � � � � @x '!� � � � �&`a 5a/СC*_7o&MxKZn@ @ ^(~3fxm+^Znv/W2eb"GdT>@0!Cxʕ+Pw+԰aCJϞ=[cǎոq?Zj޽z!� � � � � � � � � � �\ ?nH  � � � � @ X7|QFiڲeJ,6mxKVTrtkB�=yiҤI8qO.{g>ନ?^E&D BUHD1D;D # 6DAQHAݽ w-yfg̙s3LkF]w[*} A� ?~^}UZJ-[TΝթS'.]�mܿAL<Ys\}w*QDK � � � � � � � � � � 9̜^!� � � � @&8y 0a}ݻW7VԾ}{.Ҭ@�҅_hƌ>}6mڤU{UZtά @H ,ѣ5eխ[ׅ߽EdU }]XetkРAjԨQV% � � � � � � � � � ��AMlj � � � � @ رCƍK/BĚ5knݺ2eʤũ@ f .ԤI4qDmܸQ-ZЀ?Yru(eA̋@ f͚zH~z꥿oSN]@�X>7xCM4uǠf@�@�@�@�@�@�@�@�@�@�@ kdݤ � � � � @տ;v飵kjܹ;C M+O?Mst4gw}WoߞmXd 袋k߿_&LP׮]UX1WsN١C=䓩ڦPyZ{s+s<xp' N/X@CU裏jÆ iI/֨Qdgv}UJSOIN@�)rJ;SNj޼6oެ^x!]@ͱ2{?UjUٜz<W{=ލ{] dqoݺuwS2w � � � � � � � � � �$/@dF� � � � �jԨW_U\\ \r!`6kh;z ?~-['NĢKaB.P޽{u}Gڳg;w.mƌ:p@;"D* j˔zƍgrʔ)δt~g8%Ng>SӦMUP!=s駟BY)i<6[ljժx sկ_?_Z5M8l6k#�ɓ'S 6TݸVӰ]lefk`hd*}ݱc͛'{7J&~:ƧsNrmk]ffmg= � � � � � � � � � �$.@d6A�@�@�@�@�LoQ:u;_wݻwWΜ9Ӭ wٿXUu=yqj-Z39Юs7ǫL2[t-om'baӟⅢD*K̾/%hܸ 2DhZեKիWOC QŊ5fYgĩdɒ9r ٳkVĄ� y<믿^O?fΜcsI>c{C,9rl=%#FdMtx4h޽{Z1f{2N6:cB�@�@�@�@�@�@�@�@�@�@�AFv@�@�@�@�H3ɓ'UVjݺ~GuMٲeKƅ?Ԩ6:2@3k%,6ٳy^B;JIx?cUoztZϪo_"+\ ݥK3J"EkZn.mڴ)u"�D!pquQ7n… ռy(:d}jkgϞ]6G;ũGB=7z<ޞ XK5fܛ6:γ>&@�@�@�@�@�@�@�@�@�@�8U E � � � � �w}=aÆeS:Vқo) ж={>Д)S4fM:UӧOWr裏u 0.]1b9M6o/_ޕw5b,t|6YxܨQΝ;]{*TH} ]J?>cM8Q۶mS^t7+YHж~9# LXfVӦMӤI4zhM0A3gT2e\_֭*-O}ѢE`ӂ ]v7nV^}㥗^rvںuWREbw}lU~mז|(QB>lT) f͚zI{",>|ص:$= w! Gݻydk?zK~ 2dH(`vɒ%`E{^*V;t>Ʌg_~E 4eaGyL?k~N:nU[}U^8C./jٶm[o^ ,P<y2d_h4 @dO;TRJg ּ|9'6;_{΍ouم5ۻMTf͔_|Ƴ6lE]_54&s?l|hnͅY@;v֭[5`�5jȝؘ,7%VGr69sh͚5jܸ{g-z޼yʕ+*TvctƗ_~YO=+}i+W5\U&jT&/nq63!� � � � � � � � � � @@ʄ� � � � � p7ou,]= =?):t! .@Pq~\~+CABey:u ?r+^!t<?%tLϞ=]͛]ٵ?3te~@WJoرHjʝ㇋fO>qoڴ+ ΝJf͚l-ZO<?y5jp͞=۳He~7o^w\J<?Cv<[WX}=?.]g6)jk.W_}1c6Ey1sq.7mY{>6znwa}mܸѕE#ڵ}.roٲev-{^+W }.^=~뭷aDRX1w7ٺ P⇸x-[tx=?=ڹ"7dz+>di!GKnG@ w?(]4v˱}4X7!nloT6ްƏaXiȑƇ׿C=?Lݳ1ι馛<{?2*Of%t4W_}WZ5ѣ=~{.w^aÆn,1~=c[6Xmw ./AOI'կHhրd#3{? h1 � � � � � � � � � �d)Ą� � � � � p6~w^1}qT~Aڅz,$J,BBm[Z zVvEy|zk׮u C߂W_}AZE^y啞O]wׯ_P]î]tPY4+) lӦw W?i3tp`ۖʂJ~0B&c9Enkժ߿5$,ɵ<-<j:5y^r%{ H+   h6x&&- 4...tY\?,dBy6W `) 8 V6l۷o. 0s-l! !ؔ0rɒ%nxX]ƍsDzVcYpOv<<T6|F]UeJ]!2u1r1i!r5hw>s$7>qX,v>c7 ,ь,pЂ-=, Bà h"wymlcy6"LьɂcZF3NdvƃUV 6]hƛdaVA&w;1cƸ ޫz[vm^%\ca?;<q4bܛv=컄 @�@�@�@�@�@�@�@�@�@� GL � � � � �L9|2?</ /"?N9wq>srjܸ/^,?N~;oԩ:|ph;ԗ_~)?N7tSP޽{ѣ={r*߷o{=-ZT+tCBrvVe VC˄e pׯ:fذazWB} 8Õh݃,*hgvu+z-ABo^~PDA{>N~@&M*BmI%7?wޑH??TY-~A 4=e˖莳7gΜ2bŊ+ʞe?T2TWpo֭իWW.]4~xWrB+~ sE:pؽ g5V5΂˸cHM9r,E�@0Ny0vJn}bX7z4c)?,Ӎ][nԩonkƍ0|;sγUcx$x:WƩ~ȩ&L ;[0nj`w=_\ƳeʔqtɽOAn;>i$;*=7_ ωɵqorBG�@�@�@�@�@�@�@�@�@�@ y%=A�@�@�@�@� &Ppa5o\/B ֍nn[a2'Nѣ/kXM>]zns͚5.�BC,8B?)8n4hPPK )a]xIШHe`YBggϞ(&˔_4}idl c@21`J{ٲe < f"SHx͵5iDf͒=id *WV{~V^-ZpapJeϚb_ل_Ԭl Ge_~EӦMȑ#3j2D!gH{~OO>]=z=߅HcXjG) K㏮,Icܹs^5rm۶|Z,tr VѺ,YR#Fpwu,\=۷]M chFzւz[v^{M^{EЦ~NMlƽg}wHߔ#� � � � � � � � � � ?e�}F�@�@�@�@�΢~'zb+ϥ-n]@3s=׭ϝ;7Tf+e˖uۥJWnAG՟g̟?[]`APZڵ-lN"A;"<yRժU bL^ql:u)U倫eA߾}պuk;zS|fyfū?<AgrJwvbϏ}n+ J8mذ!TVfMWAO[lqj /ΰlٹsgY�}2�AgK Yx;5dȐ>֌ؗzl8,V3K;MKw}Wmڴ-B-D1Ҕp|͘,R=))ĉҥ>cXާO]Vh"9r$壹NSPxqؘO? 7p~Nƽ۷o},@�@�@�@�@�@�@�@�@�@�AfO@�@�@�@�@ 4nXoz!|ڿYonXxնm[.\8Ԥ&M/2Tf+ .t͚5W~Wu]aS*UT`AM4IK, c!{ƍCeiba"N + HeٳfËx=gz:u*Ə31g 6,E[McyLhd;OsU\ٯ_3s/_Hd}�  5tPǘj>k p[Pda˗%\^!WXMjǎ1cɓ!Q}-͛7v"@fw \1O+Xja&1<|<'7~ Kխ[Ϝ93^ϨQشk׮e0 CŻinD:eyWNm>/W+? 7:مi_el27wݻw+qrx#w\vw"" � � � � � � � � � � H@�@�@�@�@, tYb!~^x&N 8M;{aaSxJ\\+۵k[?J,nm?(vK 8pG vp`p%JH+_.e$vmW,lo.te˖1bF-ZRJjԨQPu˭[c,-| w7moi7ove6ʔ)/W^yE?c2wcڴinW^{5]pׯ_;&hݓd|rYÎ;gϞ9r&Zϫo!Dgo&?fgA<I;x>ß) |ݹ]ti]s͞E ygtaW}^VZOŊsQ*rsi֬YM E iχM [oU ɓecǎ߮=z;'vژ|,҂{^|P駟v(P]?#{8d5hΟ?=/>H ,dp.x/ּy}R:O8>8,c{ eΛo? (xR}-DrnmˍI ;wݘ�]9M1X{-q B/^GsyMb6N* ?,xwNϺ,1jժEF4_{ fq2oysA�@�@�@�@�@�@�@�@�@�@ 'A&@�@�@�@�@�t o>{ nݺ[o;v,,&^ʕ==?<C?QFyse[/qv\V<?d/Ek.Wlv^n\}w! y"ɓ߸qch/tUzVNa$^>?xϵf .ʕ+CD<?CS<?0t.<}QAWO3Ay~PgtٳbvAjlO瀤ܭuy~k�H"nC/3&?,&]R~:�F^P=c>&LׯCL;[bWBW+W./KLTx{]wz~fDu6k<Y{5ks ?5Tf{,X>~w9x~Б|gx…n}vЛPf``f=[ƌ\:-M{ϯ.lQ2r/h;dT}O1|~X8+t|;7? 1qX0N8}nc{61K/e~gcRA=~X燴qS9m۸ơ{<TR'mܶh"bŊxG#GwCzOnL!e\Y6#s/[{ϱm{??~ܽ{wL7O:v {3#;Zj$ַH~p{?1/mֽرS޾߾̑ @�@�@�@�@�@�@�@�@�@�f4 � � � � @:2_&?P7tt´i"%J$z]v~"?l0۱~]VUTFix%,Сf̘m۶螗 +hsNar=%q7n|(?`y>KhʕCbI�#0`qJ3?-!PҾ4|JbY(ԝQf7gRzww�,?XJy(3+ݻb2Ed@=wkܹ8px إD6 ~A)KmݺՍlcAOl,'?;x-1YFr㸽{C�$ܶ6ݻ2spbr Kne<=31H͸;P?N'|R5kLmx@�@�@�@�@�@�@�@�@�@��AYa@�@�@�@�(2n8i&5kLݺu_2edndv}۶mmu=R z!M:5K[𜅢$7Ū59g?IKiRsjBgNE|ҤI8q,r,s(T*M&LnE:r$~J@�5k|A}wիN:iلL}XX*ፋu_֟3Z_3wzgoI&>|.@�@�@�@�@�@�@�@�@�@�ҵ@t:� � � � �da Ca&UÆ ոqcY`U~}e˖- KžEѐ!C/N:`׮]-[D g .H9sǓ<vƪ5YDH} vNG˗/ :tȅWΘ1CӧOVZU}q_իWե4o;4O4@ f 4zh7[zBK(+fb=NKOcw2}MXzh},_UoƏe˖?T1g5j(==@�@�@�@�@�@�@�@�@�@� ! R� � � � � #G>ԩShdUT)Ors֭UR%2'ԯ_?.ıA.HN?]wݥUVvQFE M.OU/^B{?s}Wڂz]wu.gvϗl#� XКwv˖-չsguIK>JLTQst$m6o'O>۷ %6(� � � � � � � � � � p#� � � � �Yd,d̙~7.x|Լys7׮][ٳg- ٳ'^o+HNò9|*Zh&Q߿_ ,мy4w\s=W_~*iFeʔ69^+/ٸ:D�Xb&NI&i͚5jذڶmƍ+GWƑg,X GyѢE^nuMj� � � � � � � � � � � = � � � � @TrasW_}oVTըQ#YP--<bŊQA @V8z,k….Bq~Y@Nҥu饗Ejժ,x7[lY,Cn]cGG2Dsi$ V^ӧ믿v| oݺ_naA� XlfϞf7YfxkԨj9@�@�@�@�@�@�@�@�@�@� 2 v#� � � � �UZt PH /駟d!ŊSuE^z`ܹsgn@B{-YiayuߛۤIC _*TH3F4"�g,w^}9s-$hѢjڴ7o~O �2<ڿXyܿ8M+t.\8su � � � � � � � � � � Lg7 � � � � �)kn3 ;[jN89sڵk+/UZKvQ7 s}+Wt˗/w͛7f,XP6l}/$S*V|$?(- �&}v}W/~e˖M5kTF|N:.5},\P ,pDA-tey睗5P% � � � � � � � � � �D tr#h � � � � p9Q˖-sAh?VXM6&ʕKUTB\F UVD*Ul5"�I ?~\q~ڵkf^Zzc[nu[]cZ\NݺuUR%ؙa>Pj^7h �$)`6|}n Ž~.]:؉�_`۶m]C0oܸ4iK.D [P)Z� � � � � � � � � � @& 2\� � � � �Yx֭Ç]Qjli|B֘@� 6׻G r x.f͚P[ \ JQo?1c͛gh ZxlAqy]l��@�IDATYvmY(A|ٲeS9ԋ�)ennGl?{nf^BڠA3ai � � � � � � � � � ��AK � � � � @f~zO? \u el6eϞ]ʕsDasU`HD@ F;wƍOƂwRR\cx8WVMŊ  ݻ]%} �{ur˗/&?~d5j`H{sRIƹnmW=\]xᅲ:u .JZ@�@�@�@�@�@�@�@�@�@��AԤ.@�@�@�@�@�fms\\\(-4* g@Ȳe˞2[d2ed3ٲeC2cǴ}vmٲ%yӦM:|},Y2&[bE2[R%|e"!~zFHͫP7 ,nʕn5kָ ~ThQUR%w9c?>u:ޑߛu# {q ȕ+ ; իP֚5kfXSQ; � � � � � � � � � �-@dj S? � � � � @< 7y͡ `=<,҂/J*ҥK΋r "EĻ v'NpAvf {y۶m.yk<{. ``X )<O<ii,S Rt H5}?Pȵkʂ!-Ζ6߿?tm.nܹsg"pQmݺ5k.sPw ,+WUmYjUYȑ#t,+ � � � � � � � � � � y< � � � � �F l3.{x}8 !mDs [yeAL p\6g B'O*ʙ3,& p -lsbc%>HjNs+E*_@�,(`c xK 0h!^@,Iӛ-<<<X AK *`iA @�@�@�@�@�@�@�@�@�@��AYc@�@�@�@�@ ;v̅Xrt2ax/ ,!-bŊmhѢH"u+ϛ7o#Og߯={2g-L~-=z4;a2^ 5XHO/M"ZZE[@�#pn7ovY^lc)5C߃Izë`x`na{g σWKZyl!ʕssrj @�@�@�@�@�@�@�@�@�@�H(@dB@�@�@�@�@�2|XG�̖w^8qܹs! .B m[eoۺXSp�G @ }̶֭mg3nNDcH& ? Q LDxjZ.@zŌrڋ�d-X0d° Bm>Yuw[Aл4X9rWz:`Ll! =>ϳ}698OznhqL � � � � � � � � � � yr� � � � � e<s!#2 Bp a#ሹrR\(d`=o޼ʗ/_h-/lr k%\Z`NV,Dرc:zh4F<òСC9|<ogʂerG &\`iYQ!`K/I7ޘ3 9ln -/R_md`,m,fcHX<Xfm͑`Llsxz~e&6}  [#)R� � � � � � � � � � �-@dj S? � � � � �apbA&A-ĖAx`xPJ€AXLCZPdΜ9sȡ`smHpֶ`= -8&`ݖ%'BVlf v Ayxcpw~UyY ~,�(|ݶ=׃ Xl,t({Ä�/GRv֭Rҧ_g"�d ރe0nORlۘ=D ic=v9w'1x0֎`lmz 8:͑fW;@L6V9c`lr/-=~1!� � � � � � � � � � �] ~h � � � � �!`!,bsx�b^%2E+^nA3 ޹֬F͛˕5)|' c !;Afec=̞WÇвeRnȑRժ@�t&0hgrt4� lXh{>NliAAY`qvu#N8NmfG 2Cc,GA` @�@�@�@�@�@�@�@�@�@�ȊAfŻN@�@�@�@�@�Hg&I]XPd:kXͱ6[x@ZNW~8T|'sJIO>fB � � � � � � � � � � � � @DK)D�@�@�@�@�@�J [?B,W^|Q9SVM.iǎ Hek+RBT� � � � � � � � � � � � �D!@dH� � � � � �$'#tMҿ%M(U, &ٓG�6M*VLԼ u#� � � � � � � � � � � � � G!� � � � � �Q -ҺuH?/U$=t@TUpXv9c\1!� � � � � � � � � � � � �!@iq  � � � � � @҆ K+KcHG$w6@ V۷KsJ;ǪFA�@�@�@�@�@�@�@�@�@�@�@�@�L 3l@�@�@�@�@�@ I…#o U^zI:~<Sى�1x]@mTF � � � � � � � � � � � � @ "U � � � � � � (!=nԾt҅Jo-y^rgNWwyOC�@�@�@�@�@�@�@�@�@�@�@�@�b+@dl= @�@�@�@�@�HRLUK.zՓMK4v"i4oԣi) � � � � � � � � � � � � @* JT� � � � � �$%P4~|TtC~yRgR"`sϕ:%gq, � � � � � � � � � � � � A/#� � � � � �I \x4ypTtK|iD�(&Lzr`A�@�@�@�@�@�@�@�@�@�@�@�@�H 42 � � � � � @R J}$}tԬԱtiRg3GZVĎ@�@�@�@�@�@�@�@�@�@�@�@�8;Aw� � � � � �Dh0H ܶM"[7i͚S�ԸT^"P� � � � � � � � � � � � �% <E�@�@�@�@�@�hFZPz]ir ~b]ҭ� � � � � � � � � � � � �? =E � � � � � @H|U/եC� 'ԭ[l"� � � � � � � � � � � � �@ tph � � � � � @vxj4f4yTt}I>sI}J dc@�@�@�@�@�@�@�@�@�@�@�@�HA{D @�@�@�@�@�@�'+tmҺu҃J/$U,=?H `ӦIqqw� � � � � � � � � � � � �O }U � � � � � @yJw-_/ $=GK'z;cHIUfI@�@�@�@�@�@�@�@�@�@�@�@�ȀAfF@�@�@�@�@�@�(THzio_i?ƍ'`4gY@�@�@�@�@�@�@�@�@�@�@�@�2�ANN@�@�@�@�@�@ ťQuN57ސNL$ȄO<!5l(]~y&]B�@�@�@�@�@�@�@�@�@�@�@�@�L#@dt@�@�@�@�@�yI>+Y#]vtMRݺ{eu֮L  � � � � � � � � � � � � w#� � � � � �*T^yEZBUKYjHS@&x1r?L%� � � � � � � � � � � � �T Lzc � � � � � P;RRWK-[Jsb@&L_ʑ#s � � � � � � � � � � � � @ 2Sz� � � � � �__i<)_Zڵ# 2ށl A{L*[V � � � � � � � � � � � � �YJ ,u, � � � � �defͤٳ3]/nAZ2+.'t}RΜ7@�@�@�@�@�@�@�@�@�@�@�@��AY.G@�@�@�@�@�@ L+o{OZJSG&iÆXE )+'AL3@�@�@�@�@�@�@�@�@�@�@�@�@ �@�@�@�@�@�;wԸqԡC=3ӦMSŊ駟vZiRixi<F m X͛7kرYxR{C=+Rmڴ]ȑ#\k:tڷoG}$eY;b+W * @�@�@�@�@�@�@�@�@�@�@�@�@ Ld.� � � � � �<U{n͞=[3fЁb3u`v!\)=gWJi`i׮3Y8uǎ~<,8q"-طo5kQFiٲeOtꫯɓ'CԴiS*T7}N?7o. daz @�@�@�@�@�@�@�@�@�@�@�@�HM SS@�@�@�@�@�@ U>s1]F ~r3 ߿V)/ڵңJ.U$Yڻ7/ 4h@{vuȑ#&uW#^z_uVM:UrҜ9s\}vu7dUXQcƌ]yx}ҤIcIhʄ� � � � � � � � � � � � �d/QNN@�@�@�@�@�pqqqѣN8IпPgra i{z<ҝwJI+?P\Y?CҶ-sM SGs<ϓ7Ny=s^{ڴi_|[;PM?US…]7|K,PVk9Ê8@�@�@�@�@�@�@�@�@�@�@�@�Hci|=.� � � � � �$)0|Zjʗ/vYnZ;vԩSuV 0 ^}&Nm۶W^l_ԠA <XEezꩧ3~Ј#ɓʕ+ 9s/t˗O=To]npaև7|SnڴI/;,XP*TГO>jΝ;1UP!'6:( ViP}#rH g30 s]z]qz锏?͛yڔ-[B힅OW]uOҥK?-ԩ~jժ}իW/>6R.0ijj � � � � � � � � � � � � ~@�@�@�@�@�@�@W˖-հaCXdIuM]tqX_بQ#ۅ,[A7o^h!6LÇw!عsgؤIY۱cGi>ؼysWnywweV@dթS'[nV\\\SٳgG}[nEJh߆ ԴiSykj۶mcBJbңJK~+U.t7u{駟jʕ+]՚ܳ`۷O-ZŋT9sL LrAƙlHʕ]?0s_7nA0dplRjc2G,Hٹ� � � � � � � � � � � � �@�@�@�@�@�ֹ^zo߾dԨQ?&M^{M7t֭UTIZrk׮uZjiƌ.h~.4r޼yjܸ{=c` &7Ԗ-[4g ywA ~ܿBmʖ-n͞=o6}粐G*(khu\}ծ̖͚5 :Owe^ 6lnqgcԘ1=H>(?Rzq顇:I2gK/ԝx__~K΋Yx'h"^ZEus~4tPc3:uF:>Ҋo{&O{oP۵c)c=e<#?Ҕ � � � � � � � � � � � � @Ȟ>A+@�@�@�@�@�@ + [~>|X\rI<6mڸ)S+pSڵ]ۺM7ovK ;q℮:]|n`*Uwǔ)S-;ugϮ… {.D mdG]X孷G<yBr,-n}ɓC0`k_C׋WY34ҏ?J]$u"5l(}Qy뭷\fB'o݇o]ͳϫlٲ^z ɞhL,<|9焮<.G \mx*cǎmk/ lG~=� � � � � � � � � � � � �Mg\@�@�@�@�@�0;6?s>]zns͚5./^A9 A ի]…:y #GSD/25JM67|_vNz\)' _y*9n8sϩW^ 7|p 4(*Myj!C$jNj\zeˤb w@bh6]-6ςhڵ+T2Z\rG0afΜy)xd \~ B)m ËYO=HŋKߟ9@�@�@�@�@�@�@�@�@�@�@�@�HGa4@�@�@�@�@�ܹsulٲnTRʃxIlϟ_{B&6l ʤ QFzw|aM<Y"h?,,2ĉKtRõO>5k}6-X*<_~PP Li|)o^U+ꫥ$6;wnS҅]{+OY8z;fѢE:r)XA4ǏWN]dᏏ= ,ZhP5ktK l6kժ^z ̑|Sz))_ȡ � � � � � � � � � � � � @: 2� � � � � @V/,o`f\y�X_6ׯﶆ*B{k{。V, u!CtҺk'v%u,pVɒ%@7/ɓ@*U`4i,Y[7n Ǖ&M>j)'?4SziŊS[[NWh!0O6lXeԳP\9/^\Rx`ݹ]iӦdg B<3fL2~|.t? ,_ qd1#DŽ� � � � � � � � � � � � �dh 3 � � � � �d.+Bׯה)SB@%Jh,߳= =z L7ov[oUB\XUW]coW=sN6D,�H"PvpH{}!o۷o͛7Wܹ5p@Y`˖-5b׷-ZRJ~֭%?[Sӧ˿Rݺҍ7J7| E\| }>|:v쨞={jȑ2hׯ Y}?kZdrwu-Zlk׮Uky<F7dB.xuVזQ~{ (?֢xi駟$[2!� ۻx/zZ$E%[2ٲ1F_a;o2~$[lmKEY*ZJJH߹ns2m<uzޟO^ @� @� @� @� @� @�e] gEQa @� @� @@ c<!͛o'N8!/^cǎGy$5k-2]KzFsBRW\oyYp_vy#F; /:}Yb !4hP,Y$veK# H[@j}_4۳ *g_esSNv-rrrӜ/_]K}n喨VZA&-G^hy "&Mݻw7x#[NV]w5W_B3/[[o:tgϹgϞѮ]ΆE&MbԩO 9yi&ҥKJ.Q`ڴ#.(RM @� @� @� @� @� @� Ae1$ @� @�ش /"Ə=6n?Bå *5]Hc|Y;O͟?? e\r?<֭[yuoҼ.])O?4`,rv6luƽF^hgّy[m1w,^z\ھ S 1cFJ ]LիW_^iy[pÆ W)bwމRp}&@� @� @� @� @� @� @( rc|*D� @� @�ʙO rr;"."/2. #j*7ZH3W"ݷ5'@� @� @� @� @� @� @F*Pa#i @� @� @�lbUDw^ćF\qEG4nD|&X`9s"~^@n0 @� @� @� @� @� @�lT 7a2 @� @� @| s/_oRh׮]|kȉ/ωy~8t<޽{gY?^D\w]Ij, @� @� @� @� @� @�@ @� @� @�5 4i>knWW^=z왝nq1`?~ԪU+;=:4>G爃f-[,ϲ&c=s5kԨ!@� @� @� @� @� @� @@;Jf( @� @� @�V-#'o-V)^]pa 80 =zt4k,;pVL=x`h8{) Xfώh<K;\]+  @� @� @� @� @� @� PvAgg @� @� @`<ZoB>dɒ_ /{qG^u*;G1vlD͚epL� @� @� @� @� @� @�TX}  @� @� @�@˖-o߾1s̸[cbذqb?s篢}^*i(uW3D{ȍq @� @� @� @� @� @�$ `%@� @� @�(@͚5㬳Ί1cěo>>Zuۼp?1jTj]6>8 #.(Ɯ͒� @� @� @� @� @� @�# r}!@� @� @�(V֭[ǝwf͊[n9ݼ#vn#:Ǝ-)(^˖EtW_]� @� @� @� @� @� @�  I� @� @� nmY}oǨQ⤓U+ 6Z8#:v|#>`ji G|7y @� @� @� @� @� @�B@dQ(A� @� @� Pmڴ+fϞ{oMxo}(z+k#=(* @� @� @� @� @� @� @`c=!@� @� @�X@Zs{Ŵiƫ+F(v߽q}^P |yĩFtqL� @� @� @� @� @� @�("(J @� @� @�V93+WsD|}m#zk>Xܹ_xbϏ䒈:uVڵE#Ǝxjcy&A� @� @� @� @� @� @@ ,~c# @� @� @�?HEvE̚Qne]׿䆏 wq ;tmD͚kV|sWW*S0( @� @� @� @� @� @�JE` TcP @� @� @`ɉ=RRXߪpɛ8@j\G\q;q-_)q^+r= u#@� @� @� @� @� @� @ ;M� @� @�(cFh7nCߚ[K`_|q W]ѳAknq ̞ѲeD6?a @� @� @� @� @� @�(Ob� @� @�83b]V?J"zX}w@ ƈ?9Wf" X|]hWT˖EtRD+\!@� @� @� @� @� @� @l ,[l  @� @� @&#S㪎K#u[@1yr~4ڢEO_=O5*bРZ֯^ @� @� @� @� @� @�( 4 @� @� PFRc |\ձMk6L`"'bܸM#~6m"~vx?)A� @� @� @� @� @� @�* >y&@� @� @�,ZE<J"N?}k>(jf"y$b舺u#:v8䐈_/K)xGs  @� @� @� @� @� @�ʳ � @� @�@ 𓿭X,Kyb/7)g#^}5b8ꨈw)7ž/8昈֭#n؇3� @� @� @� @� @� @�6zʍ~&H� @� @�lB'C^R(F4h+HÇG 1{vD Lω>/vҥ>шʕˣ5 @� @� @� @� @� @� @`eA+{D� @� @�6DtPD ?z@ tE~D={FL\~yQGE6DFēOFԭ[^� @� @� @� @� @� @�+ U|' @� @� @@ItDt#PZ1vl=DJĮF{nĬY+(>tGwDaT @� @� @� @� @� @� @ _@dW @� @� @T~ 7)Ho-Je%{y'F;q_~CR+"6C"LR°a?gOWo @� @� @� @� @� @�X@Ίc-$@� @� @�1D ݺ`XOE"_">S"V.B!:bԨ[^y4~|~EtѿyYu @� @� @� @� @� @� @`A @� @� @Z͛ӧOO>$;?/#]Og.,Y/EʕUF*UW^7lSNvnkݺuBFE<.-��5IDAT 377w-s@,Xq-weV >bĈZ^Q~Zti̘1#sӦMܹs}Z o{-ߥixUZ5jժifmֳ}Ҟ:%]=;mk W5 ]&@� @� @� @� @� @� @@9Y @� @� @�Xz7yxc„ kz?eʔXpaAޘr˂ t-U^ 1ѭX߿w~ȕ"Sx7|Rd 3gNhѢR8ݮ[v6k,v}vm xCy&⨣V_-A6m꫑vro+8S˳iV^B~Ka+VW_}U $]g%<X"ZjN;eykk R!Fȑ7uY6 @� @� @� @� @� @�( 3b @� @� P(67jԨs̘1Yc bvΦyw5 fg5 5o^.1wOsԩ)?ϊկ_?ڶm[p>Qf 5 <=[1Oަ0֭#^|1Ors ?1bDҥK#777g)t1;sҾfm"''g U7V L{m1mڴ8qbN)|SHfټ]=Wv Xo @� @� @� @� @� @�l 7jI @� @� @`C%2Kǰabʔ)Bwm,حM6Scj6db훂 ǎoFv0˙3gFtvEcǎZ*VXsQ|xO\50ȃx晈*UVgٞ2dH<sBM+W{W]m߾}^di*wo؈#cGEWSNٙ֐~K @� @� @� @� @� @�( 7  @� @� @@YbРA#믿˗/BRX⡇լY[}+^x1cFԮ];88UuZ@ ,[ѬYF^hĒ%k+vy+hW_?̾K.VZa)@177w7s΍_~9ʦ[F.]⤓NC9$ HoZ @� @� @� @� @� @�(VAʫ8 @� @�xϟ |0^}ը^zyqf)mS?&N=\0SeľSO=5:v*T G|gW(&L9ʕxiHd_ODŐ!CF)1V[mCM?zx衇ߎze>3E-� @� @� @� @� @� @�zw @� @� @&)0f̘۷o 80/_?ѩS$׼.9sf<cY0k7:+~_[o.%)KFL)(2/0RP̙+bŊ{^8䓣K.QVrAN ߿L<98sE^h; &@� @� @� @� @� @� @< ,OOZ  @� @� @\ <qWȑ#yYik..Z _~q}ł SN;kV)'5\w}ԨGgf:ǩnMKbŊxO>SOe]vYTjrea @� @� @� @� @� @�/Ay[- @� @�Cǟ3fLqq_% Eŀ/K|q'hҤIQnf͚]w]&Z~,D{[n 3fM7ݔխ[783rʅ-= @� @� @� @� @� @�6z  M� @� @�X/ѣGg]tƍ<BhF7q߿fǹ_~e!*iZ-[rKX|guȵ|n[㣏>]ƅ^{W+k6 @� @� @� @� @� @�ʞ Ȳ̘� @� @�Q`qG۶mc1bĈxGe˖k*Vݺucf~>`4m4wr\ }'.,pҤIY�dʕ˕Æ.~Yc:(<̘7oކ֟� @� @� @� @� @� @� ȍQ @� @�pآE8p`QFe^Y$PB8>N8!w]v/P9XbE\Ѿ}r-cܸq?9rss˩H,{vg}6 C ~^y啢)  @� @� @� @� @� @�JY@d)?� @� @� @�ݻwtAѬY?~|3rrr:?SNvm/ѣc1cA`qǸ馛bذa.رcu,w%6 @� @� @� @� @� @� PL VY @� @� PR˖-s9'.¸k⩧zzoGӦMk9s#GÇ\ x�[lE<cqW_|qXFS� @� @� @� @� @� @�/+w6 @� @�(ٽ{xΝ;8Y =;/ O<q-yǰaâqez=ei=PviqgG޽͕� @� @� @� @� @� @� yC� @� @�9s9'xxg`2Md+V>}D5SOZjEN6YƏ-ZGuTÇG ~|bH!UT?>իW\qE1< @� @� @� @� @� @�^ gEQeU$@� @� @�[G\pOft=&_2}3fL.I2#pgd#G|K7R3<~x) @� @� @� @� @� @�( ›A� @� @�J]ދVZ_)?rrrd/8 -[F+I]EJ_ v%G}tO`QB"u=bС1a„SNU� @� @� @� @� @� @�- '@� @� @� pƒ%K^+`bj?~z; ^<蠃w]TZu.]]vYfcرѧOh֬Y ~4iRh"n86/>4iiw}?|C {`/ׯچꫯ}{G޽7 @� @� @� @� @� @�(1A%Fm  @� @� P4Æ ;,Fmڴ)e7|۷SF5bΜ9jRK/RPvJ=�ɕ.K.$+77**QwqG\p1eʔhРAiNe{Y@ɓW /?W=?8ׯ'@� @� @� @� @� @� @@T(Q B� @� @�ߞ k-Z3gΌ'x"*WÇgyf%1p6mZϮԦ>\|_ƣ>ZT%)E٭[7! k.ci͘1C Tz5k֌{gf  @� @� @� @� @� @�6As0  @� @� N .!CDשhŊ/F ͍+1:uʖ>nܸ>&O9995j(;S\qՋ;ƠA%(0}xSN)QP7tS4n8 L  ˂V]v`e�E  @� @� @� @� @� @� P  UI @� @� P\oF,^8=" T;+"lKO?{lvg3f>_}Ց][~-qqőG_~y̜9`k[h ozic `LG z9|wqI';쐽~MW^)jk*U߿GM]vY;'|rquŲe ƛ7o^/ g}W^`E]}u}4iR.}=܂c=]ߩFگܹsCuQY:[cĈGڗx`yLg?1c_~ @� @� @� @� @� @� @*%@� @� @� /0yUVl=,k &9 Vwg<U>}z|Y�]wOiӦYPezgi|plVq-󳠻}f_cu|n8뜜qG}UT92FեcFÆ n9:uimJN`ʔ)jժE:w][cVZĉ#*>}dc~>7|w_p 6dߵƮ]K4hv[V#կ~wFYvX|ǑK/8#/u^wz@4֫f~ouSi_̴A� @� @� @� @� @� @�]>A#@� @� @�O믿.@wy'߿'M]0`@tAdRxc Ka)<2ѥ#=t駟K/4Əw}wY{'ٳgsLV96R^qǭF^z) L8sk~czn+_ڵ|i?|Y!Sb +͍~ea}]_FEʕ#mҤI:WT)veBT֭ҵO+T+VO`jtEec}~ ?ezgSN:+=ƌu 0 @� @� @� @� @� @� @@YT&i @� @� @).Ǒ-[{lA N;AnmvK.Y\֭;,`.ЭX"z表_~`_5j|Dj*n~¼^uU{u]n)΂"_|X|yvX*=7GHoѢEŲґ999x 'd)HSNYjjSXk?Svo߾Ѳe,裏+xdz[~ LwZjqwduoxbYQjE� @� @� @� @� @� @@IT(AA� @� @�@FbΜ94iRl1zs„ 1eʔKR(\:*Vi)`.^~J*E۶m'O^n~u}My?|<裑YQnرcfgz裏�jkX 6SDvql*{z㦛n<0j֬M6-|N<8ӳs1Yd Q߇W^yeOAi{ɝ|?Ǘ}I @� @� @� @� @� @�Ae)# @� @�_֭[NJ+_/rի#Bziԩ1Θ1#MR dի k_A֮]{Jb_:/l4-[Gpfah_Z{WbI!e]bٲeq 'Đ!C⥗^=zD*U =Kw>`=8lذ8#tQoٳg\fm{as{;d{y;iH� @� @� @� @� @� @�RY&@� @� @�nE#Z^Y+" B.k^ѣZjW}<Ll}4hPIzO<Dt9rrr~|H/^8|8#"'{[o=XM_W4j(cl١CÅ O+U-#Ʀ˳^zg}'xb;6ÇZfw.hv=O^pm}ޤ߫{pᇯOyNjZ׀� @� @� @� @� @� @�! r=t!@� @� @�)pg<s-iuYfe;v}9'|r>Zi]曳hѢϴibĉqgt4j>L2%9͍*N;LkHӽתU__uVwQzz_8p`|ѣG!PBtwF ,㥗^ dSpٳk7|>[oesI!ƍ}OǙg1o޼9sf':`n-k[D۶mcwB.?Aӟ"8 7nOgmC=4دj|֬YqM7M4Y[BO!i~z@� @� @� @� @� @� @�Y+Jkp @� @� @�bw_YZ+Lj#R>HprJdɒe]K/JSOe+Vc=6[mU6P5h eLO=Ը+\i.)\nԩlB, CReӦMVZ!mݢCe_O?v)no[d =ztذaè\rԫW/&O@}8)ıssEW^QF yYc{GqDjկ_,K.wO?t?BXSHw}#7~Oį~[Zj޴x≬}fͲ%;u _sxQRx׵v @� @� @� @� @� @�(uAL� @� @�^=zdg)(fAp)p2mlٲ0aB|7{f!vZϟFnYeQkusH{1ScH{GFdQA)/K|g;G ~o#Aw $^z~XhQfAUTu`2eJzBS {ߏ?8R+H!7ߌ-[0 @� @� @� @� @� @� @A9 @� @� @d;x#m%3h 2gΜ8:_ݺu[klCI'^Krlc@ RlӦMn8|Haz8O>ZXoqܸqѮ]o]w][Q @� @� @� @� @� @� U� @� @�__TP!R(]:uyĒ+:`֭qkmWR ^~,W^5N L81 <#߆ ?tԩSt9| )Ul}7駟FcwaÆEJm  @� @� @� @� @� @� @8A @� @� @>8VZY [o]B#)c.]D78 }x^z8#[nqwFŊkrC /0RdjOn!sΘ1#~Enn&UC� @� @� @� @� @� @& rS{C� @� @�N`ѡCXxq<SѼyrgP ׯ_+N=?㯻@ qڵkzD5ֽ\hQGڵ ;6 b-#o  @� @� @� @� @� @�([t͖� @� @�@F_v!ڶm{O\L .={gW^ye}B zc+۩SxbȑѮ]<yr)g)ls}&MÅ@n @� @� @� @� @� @�6UAꓵ. @� @�(W[ne<qf]vYf+^l kѢE<yUWW۷ѣGGգUVqwĊ+JyV͋=z)guV :4 ܴVi5 @� @� @� @� @� @�7A[/ @� @�l*Un!^|xwb]wo1/^ɮ4'I'|p1nܸ8#Jc*6lj\pqy~`jez )P{~o3<7|s9 @� @� @� @� @� @�ʺ Ȳ͟� @� @�DCǹW]uU4o<~X|OZXyhڴi92}x'cm)Lm7Aʕ+5\oVTP!ZnYfm-%kqęgݺu &[-~v# @� @� @� @� @� @� P KP @� @� @U]w]ֶm8cv{7.]ZR$ƙ3gN\veG>}+'F׮]7YD W^y%w1.n)�CGժUcԨQq뭷fmn"@� @� @� @� @� @� @@Yw& @� @� |A\{1`_~yqgD ֳmĈqw?]tEѫWQƦx+`>θ/nݺo~g}6T`ɒ%1hР,d5hȫ:>MiB� @� @� @� @� @� @�A @� @�شN}_NwGFϞ=SNi/~V7k֬,g?>Zlg}vzQzu -Zo=}hݺuڵkԮ]{ӤI+>8c�YJ� @� @� @� @� @� @< ,O  @� @� @ ,^8 wyg >< 9<ꨣ㎋?\Θ1#xG_5jd)�M6;bE/+dO>d,_<;8sαfYŏ>( Z}衇wމm6 M{mfk: @� @� @� @� @� @�(>Ag2 @� @�(}YGy$^}ըRJq衇fg˖-B eb-2Ʌ ƿx^qe!|G}tp ѩSZ꺔҆z ̟??x8p`L+ =3rrr֫СC#~lѵk֭[xodo. @� @� @� @� @� @�l 7cv @� @� @DR(!C B̙o>ڴiSp֩SD!}odQbѱdɒh޼yt!:v|pn0X/?<si 6,ΝՋ/Ҿk׮]QZ_fϞ#G#FDo-w= XM!tPT\$e, @� @� @� @� @� @�lt 7GbB @� @� @`XbE/gn)mڴivi,ܭYfnEzu]c7/ɧΚ5+&LPp1nܸ/RJ{F۶mpC=4ׯ_*s5( 1c_BSb NLags}ƍbŊ+Wl.\&M{/;^;vlM6Y LAm]Ea @� @� @� @� @� @�EAe3 @� @�(%J!yHo<yr|ٌjժ 6,8S�ܖ[nuԉ-"{MWUTk:Sݒ%Kbc޼y_~s΍O>1cF8),uѪUVZ) |GY dsӧOL QFgzAlͲ=~>Kg_}U>??Hc柟yT'}ּy{」]vQv_ @� @� @� @� @� @�( CD @� @� P˖-V7eʔ,(.?1͜93 KA݆Y]ݺu#LڴiHAx7|&L?8sӦM+iL!)qѢELg~Ao}~]vw9*U(@� @� @� @� @� @� @�& =q%@� @� @�$0Hbٹdɒ5EV\9TR׬Y3 SN HkH{,Bs…-x}֪U` y\ @� @� @� @� @� @�XA룦 @� @� @� @� @� @� @� @� @� @`=*G] @� @� @� @� @� @� @� @� @� @�C@zB� @� @� @� @� @� @� @� @� @�XA룦 @� @� @� @� @� @� @� @� @� @`=?[����IENDB`����������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/images/http-strict-none.png���������������������������������������������0000644�0001751�0000177�00017711520�14607525267�022642� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����"���EtX���sRGB���@�IDATx{?GG*0bؒf1+(2rmfic:L`;R} ChbS"Ww~]*WT>]|4j @� @� @� @� @� @� @� @� @� @� @� @� @�$+i_ @� @� @� @� @� @� @� @� @� @� @� @� @�(j@� @� @� @� @� @� @� @� @� @� @� @� @� RjT~ @� @� @� @� @� @� @� @� @� @� @� @� @�4F@� @� @� @� @� @� @� @� @� @� @� @� @�(LI&KEEEf̘3gI&i޼y[{Ӿ}i& 4�GVj E @� @� @� @� @� @� @� @� @� @� @� @� @@3<'x[<O8 *![믿~rtر}+_;Pp-: cV @� @� @� @� @� @� @� @� @� @� @� @� @�V]_|1wqG<2eJ5k:AXlM6p2 }iժU7o^֬={v***ߴio\׿0"k„ yZkk׮֭[wtiՅuZUk"@� @� @� @� @� @� @� @� @� @� @� @� @�uGW^_o=O=TZnw=[~ӨQZ;peee^xᅌ;6cƌѣSnmӧO8{jjU> @� @� @� @� @� @� @� @� @� @� @� @� P͛?ϹKi۶m<;ݺuKƍWح{,Çϰa#]v͠Aҷo߬+,67rB @� @� @� @� @� @� @� @� @� @� @� @� ExСCsgg„ ַW^+4D9z\ve1bD[o?1#XV1ZvU @� @� @� @� @� @� @� @� @� @� @� @�X|eV߾}3dȐlu׿r+H6mry_~ubmB� @� @� @� @� @� @� @� @� @� @� @� @�Ԧ[o?<ݻw&lg}67tS*C^z#vXcL86yUjճ @� @� @� @� @� @� @� @� @� @� @� @� @o|0Fʝwޙ:+_?W\qEƍSfvȕW^Yవ' P,D� @� @� @� @� @� @� @� @� @� @� @� @�@eee={f=ӫW^K.yG}/w\彭@ܕuLC� @� @� @� @� @� @� @� @� @� @� @� @�,"0k֬ 0 #F%\>z%}[o;3[r%DL @� @� @� @� @� @� @� @� @� @� @� @� @Ⱦ ޽;rKϞ=ӬY=:_󎖯 Wp @� @� @� @� @� @� @� @� @� @� @� @� sO>yʀ|+\uxt-kVƌ-Z:sث� @� @� @� @� @� @� @� @� @� @� @� @�'tR;U{2y;Ej 4jݎ� @� @� @� @� @� @� @� @� @� @� @� @�On-}ߞ>}K|S?y_ӦM ؚ7o^5j͛VZM6i׮]6ll򗿜[s% PkEIۇ� @� @� @� @� @� @� @� @� @� @� @� @�,믿._3Wҋ.(rJolexVÆ 09s[Eֻロwy'&Mʫ?h߾}vit={W:tj"|H @� @� @� @� @� @� @� @� @� @� @� @� @�UK#< &Yf6{G<#iР~72~<yԩSӱcva9c.Z@ol @� @� @� @� @� @� @� @� @� @� @� @� TO=TvqtM۷R]P~s!,ΝcfС3k֬ 4(C L;a.g5 @� @� @� @� @� @� @� @� @� @� @� @� @ n9<_wԩ8h5JsgҤI9s*~B^x~7[җ)SF~r 7ܐZ+'O.ߗuE]:Zu 9 @� @� @� @� @� @� @� @� @� @� @� @�VӦM+ WVV^C 4(?xƏ?kVzj^xp9蠃rYgU7n\ڶmwK;䡇rڜ9sfKs\+P.g#@� @� @� @� @� @� @� @� @� @� @� @� @�N`ԨQ;wn~.(y67o^cgEn|s7/:-ZUW]/8g}v?r 6 ۷OOGY=5VSS[=>kݚ}WrF @� @� @� @� @� @� @� @� @� @� @� @�Xm||k_rW_} *Bj <8GNeeem,WF ʠ§_93Og6Fm8 ڵe][i۶mNMuZC@𕜑� @� @� @� @� @� @� @� @� @� @� @� @�V~8Kwׯ_zO<1w}w^|뮙<yrF>:>hwq֭[gO>Ӝ9srww)~G9餓ruwsgVϩٳkcmݶ *®6p4iҤ4[3unH>}3^xak7߬Nu_28ߪjJ_] @� @� @� @� @� @� @� @� @� @� @� @� @ U[mUcܸq9csEeĈ8qb&L^;|WΝ3`ly衇ʠ;�"</k<~eW*5lذ2k6[o]uQիWޣp1cFzZ]XaÆ9ʠM74;SqWyWyne5f̘L>=\sM<p}M˖-.p=g\}ں mR^jգ @� @� @� @� @� @� @� @� @� @� @� @� j ̚5+~ڴiSFYf9묳Rծ]l^mYv}μyvۥiӦٳgΝ"̩h7xcuV>O/R90묳N4hPեKYwu˥֒ .k˱"\v.(82P!k۶mƎ[]7dȐE Ocq>mE/˗rN @� @� @� @� @� @� @� @� @� @� @� @�X>kfuw;3v!wqGO<q=l*³vq<#KˡKҾ}jذaתP kVkaO.QB ʳ>|ysvL6-3gά[҇4%] Ԫ/_9  @� @� @� @� @� @� @� @� @� @� @� @� @`hѢEJ5eʔZk߾}|'J# `VӦM3ut9W^yezPmRhQFYp?|VZ}ޥj??H>Xh|}Ɇn.lE_jXfq5iƋ[ Ԫ_ι  @� @� @� @� @� @� @� @� @� @� @� @� @`(Zn~V6gΜ\s5[{ ` 6 :crWC ~˂k}VҌO<,oӦL[{キ-lEPVaQ أP-I� @� @� @� @� @� @� @� @� @� @� @� @�U_r-xy7ӷoߌ?>:uʘ1cpW3gά{fܹe}9}rfqz"īO<mf֫K\wɂZgε^`w>=j@ZĴ @� @� @� @� @� @� @� @� @� @� @� @�_C}e_\]tEe_֭ӥK]-[Lc=iܸq7dȐ 6,gqF׿5F*~K/TO^uUW0apڵSObj QF` ~//k{W_}|]ݷ48Y Ԫ/_9  @� @� @� @� @� @� @� @� @� @� @� @� @`c=2qW[..'wkP 6̶n>?x<^93Ӯ]馛O?~eCI rg6l3s>}z򗿤Y\6mZ.tԩM<yq~r}kaw9ʳ5~zbG9ˢZֵ^s=k`ܠ?ir @� @� @� @� @� @� @� @� @� @� @� @� @�]`޼ylҷoߜwyr3fYf4iR6m6m,n端M6$EVfϞ]\s}Μ9{Ow)iݺ-Xv5hР뮻Bsx\q[Sf*~ӡCj|9rdN;|>|xzm6u`,弉  @� @� @� @� @� @� @� @� @� @� @� @� @�%(>\}ՙ6mڒM"Lh۷DV_Yx*4iaZ{ƍ$aZEmUaZE8p[o׿uyv-7|sf͚"/Z$h+ bN޽өS<S7h( Pkbۊ� @� @� @� @� @� @� @� @� @� @� @� @�,2sYUnO?3<3`+R޿ZUTT]|AFf6ʡZ~;6Ç믿T+XAU G1h+xc @� @� @� @� @� @� @� @� @� @� @� @� @�83dȐ<Sj_L:5lMڵkI&NƍSS֢{gx<se@YΝ#&lhyv۶m?_W;zU-͹j-Z @� @� @� @� @� @� @� @� @� @� @� @� fϞ]v%s͸qҴis٦k2ye:;=z_jvu|VX̙3sw,^+cR#+cSVmZ� @� @� @� @� @� @� @� @� @� @� @� @�Ԓ /w1~x.ZZ,sSNǗbiذa4Y7:th:*3^ց38 @� @� @� @� @� @� @� @� @� @� @� @� P\wusgPvvm9Ss9/΃>~;^{mg4iR#BUQQQκ' P}'"@� @� @� @� @� @� @� @� @� @� @� @� @�{.~7Mu0bĈq9餓rgT_u0`@F)S;-[5 kZ3f̨n Ԫ @� @� @� @� @� @� @� @� @� @� @� @� @@ . ~zN=̛7oUtA9c~l޼yo\}cSNFmTΙ3gN***;@hPY֑� @� @� @� @� @� @� @� @� @� @� @� @�I[ò{cڴiSSY+¯N;\zկ~/=y晌92:t(ùy!W@Fm# @� @� @� @� @� @� @� @� @� @� @� @� yz衙9sf2\rW(_=W]uUrd.phC @� @� @� @� @� @� @� @� @� @� @� @� @`t'x"Ko#țo뭬|O?=;cZh'|R +yUm% @� @� @� @� @� @� @� @� @� @� @� @� @2q9S2eʔG?'uYgVZSfϞ]BƏ$s~;. 6\[̧p @� @� @� @� @� @� @� @� @� @� @� @� tzʄ ri&l_ynT=}\|r-C? 0͛ye,J+3mTV:y2"@� @� @� @� @� @� @� @� @� @� @� @� @�X`ԩ~ /0EpU>}rqǥ[nipU=+r 7d9ꨣ2xpyT/i2NH%UD@*!]� @� @� @� @� @� @� @� @� @� @� @� @�[ߌɳώ,nYfjΜ9_#Gfy[gwVZgd?>NFk$zjҮcVmZu; @� @� @� @� @� @� @� @� @� @� @� @�X ^~9ג^- Ms)vit1oy6lVw={,cǎ͸qTe<2̫د֩Sɼy6n4h|'mUS@֪]݊� @� @� @� @� @� @� @� @� @� @� @� @�VS?LvMUHVCɚk~/Ы>i޼yzli߾}kժU5kV5kVf̘L6-oF&M_8qbWg]w-uVYO*jj$3'7<8nZ @� @� @� @� @� @� @� @� @� @� @� @�(§/ydM?0}L0!<LUc!Y+ó3gIUUU^{"k-Lǎ_˖-?ϒtTM̛Wsu5{vңG2dH.5魿sr @� @� @� @� @� @� @� @� @� @� @� @� &gsOo.4T_O<pɎ/%k]K. Pkې� @� @� @� @� @� @� @� @� @� @� @� @�Ծw'{7?\2vyjީqd NڷFoU @� @� @� @� @� @� @� @� @� @� @� @� @�RΝ}I~v[ҷog/´_0 7FoU @� @� @� @� @� @� @� @� @� @� @� @� @j.0}zIӦɃ&͛Oy󒭷NpʏPil<h{ZZq @� @� @� @� @� @� @� @� @� @� @� @� z |;[o%#F05JTvEVIEEUK@֪=݆� @� @� @� @� @� @� @� @� @� @� @� @�V#"djے77dAd~'7ߜ\sM;AjvK� @� @� @� @� @� @� @� @� @� @� @� @�]w%?Ir.5J:+LZL|0bd?1o_jSXTVzt^G%@� @� @� @� @� @� @� @� @� @� @� @� @� /$;rǜ9InW'[o.$9䢋O\x[U @� @� @� @� @� @� @� @� @� @� @� @� @j&I.ɚk&<4k̝4jTMN.9k?NL� @� @� @� @� @� @� @� @� @� @� @� @�VOdw_5ô/0b3)SJڶMګ껀@� @� @� @� @� @� @� @� @� @� @� @� @�V_2{ 7\m{nA%c$;LAeUggv\ @� @� @� @� @� @� @� @� @� @� @� @� 57{7ʅ&']=;{gqM6Dz$ P},G%@� @� @� @� @� @� @� @� @� @� @� @� @�Sm5_j<i'B 6-mdᇓVj(U/֋S:$ @� @� @� @� @� @� @� @� @� @� @� @�XMШ=_ܹfȐ/ 5_E+äWdƌ}Zu9! @� @� @� @� @� @� @� @� @� @� @� @�G$'ߜ֭׫ c5X۷O+y䨣_gn Ԫ @� @� @� @� @� @� @� @� @� @� @� @� @`5? jwH7nk,n \|+ P~'#@� @� @� @� @� @� @� @� @� @� @� @� @�X`Ԩ쳓O*2!_5>{\pAӟ&Çv% *n}!@� @� @� @� @� @� @� @� @� @� @� @� @�y#cIfϾ)nivJ3N8!ydd͓N>c:#Рՙ8 @� @� @� @� @� @� @� @� @� @� @� @�X{/iduѣ+V2Kv9s=O}4inZ Wv'@� @� @� @� @� @� @� @� @� @� @� @� @� TV&~rE Cyү_%~@СIfIɬY1pU'>C @� @� @� @� @� @� @� @� @� @� @� @� @�?M0Ont1mh*5*yӖbҕ& Pkۘ� @� @� @� @� @� @� @� @� @� @� @� @�|,0bD_%]t̙3'CM?.l\uUxOSTVm  @� @� @� @� @� @� @� @� @� @� @� @� @�* .]O.#+{w^zlfQӒ.Ky$q1m Z6 @� @� @� @� @� @� @� @� @� @� @� @� @�:5imdIj8∼y?g ̙tL<hҢgNQ=mI� @� @� @� @� @� @� @� @� @� @� @� @�T ̛|a2laZ9rdXՠ7Nn-6-9ϵQ@rĵ4 @� @� @� @� @� @� @� @� @� @� @� @�4!CKn=?;Rjr!wzZfOn%5*e^( Pk9Z� @� @� @� @� @� @� @� @� @� @� @� @�,)��@�IDATN`ذs> xe᪛o9{gڶm"ocƌtaZm馹{VAؽ[dTy%>:! PN| @� @� @� @� @� @� @� @� @� @� @� @� @�Ig|'9)Sr]w_~ W^y%^{m&NXW^~)֥%;zh2cF]:4l @� @� @� @� @� @� @� @� @� @� @� @� @rJIɽ&M,ݕW^O>9oVZhUƎ73zԵ8^{-oq9CUY:uJ8"ºr*h� @� @� @� @� @� @� @� @� @� @� @� @�X1%%3g&Æ}2L8M7ݔ}aZjs.tF-^W^bVaɥ&]yg]r @� @� @� @� @� @� @� @� @� @� @� @� @�#'c$<m3fȯ~=:;c~\U|'}yӽ{L<9#G̤IrǧsՋc\sMl/vU[oU _B9^u]wui֬Y~wK.]3d^U X&MrgT}LƎ[i޼y~_d- '7x#|psoLuVa:thNZW^]۹ OfuɑG=zTϭ͇CMN&LHڴխ, e9 @� @� @� @� @� @� @� @� @� @� @� @� @ zkryɥ&_s}N[k7Mn|_C=TZE+B PU-7<̕W^YUO~/í<׿.***r}e]wO\}e8V7jԨ.eWU|zyʾb"LhrH~p幋"ЫƍWEeĈ8qbUUUUU{ӵklF<xp|ٳ<HUXr≵E@ֲC� @� @� @� @� @� @� @� @� @� @� @� @�B`T\%y''G?3<"Nsfԩ9ꨣҪUl6,{ڵkB_~yUacEWў|ɜs9ˀc9&EVhU]w]Y;mڴ<y饗rw-xrA_>3[saYkfs=zlCGÆ ӨQ f9묳2k֬rX<o10dȐkoIYn-Z_ނK)x) @� @� @� @� @� @� @� @� @� @� @� @� @�K!$;'ɉ[z駟o۲h]wZk^x ۚ?}+_رcrnܹsӻwӧg-{Wo߾o p k+"cǎn3fc7xc~_YE�bp5֨?awΥ^v!\pAot)G-[_E}q|E�W_<ZpBu]XsIj- @� @� @� @� @� @� @� @� @� @� @� @� UP۷JMא4y2Tݻ;5*ҥK<Yguj-xbnъ'Ey,Y*ZF/^ TjZEֹ瞛]fܸq5jT9x?1wU?{Wke?Ori-8e<eܓtRr+dK t @� @� @� @� @� @� @� @� @� @� @� @� @�OG?Jz(1"YojժUUVL6-=zX(j 6('k׮zjUW=E֢_^;c:waÆ3foO&MrWK.)C>1q9sk-ܒ^TX|G}tɇ~z/$_s* 6WZ- @� @� @� @� @� @� @� @� @� @� @� @� @` n99š2ۚ6m/}K&lPc=͛SN5s̅j>류[3<3?p~T$~-A4hP C=4gqF_Suޟʉ'7|3};3&EkC'^g޼y0`@^{гgra)!^k~@O1F� @� @� @� @� @� @� @� @� @� @� @� @�AwQ^Uq@D@ *V$ دlML$jb&+ƕī7DƮDv Az0;Qa<{9s{9ÿq" .8oG٠!CdUǴib„ q%dS:t(3ӏ3gfώ-[ƿ߿|qyqώ}Qv\պuH_)+Z?7|Ғ%K{ka_]oӦM+vi/ I/<o߾[GϞ=g~xq~W+]9%io{[ @� @� @� @� @� @� @� @� @� @� @� @� @�X b"vx晈 #ԩSw}瞋-28x'K¸N., *,,¥~l뮋o=V^{ws=qUWwQvSqg6_" jPč7oyЫݻi}@Ç[lQ6nR8WVW_}u 4(z8蠃9sį?<=lO8묳kM]') #z+bz5) PkM  @� @� @� @� @� @� @� @� @� @� @� @� @[E1yrĨQm~d/B{o~D=y&HaSӦM[7HXK6ªfMϬyɒ%YUÆ ./(Ik>E<bŊhҤIըQu>tҘ4iRIYhٲe:u_Ϟl1bDuj$ Pw@� @� @� @� @� @� @� @� @� @� @� @� @�*I "n%W"vm&=s_qƭFU@ɫ}瞈NҥL@50 @� @� @� @� @� @� @� @� @� @� @� @� @� }w)D{1}Ѿ}tMc=u뮻.bj?#&Nhڴږ O� @� @� @� @� @� @� @� @� @� @� @� @�*A`̘ώ^0I⠃U 2">4k+sVs}@NqI @� @� @� @� @� @� @� @� @� @� @� @� @�_-0~^{El]С |XwjoEm֞}֝ Ԫoξ  @� @� @� @� @� @� @� @� @� @� @� @� @` ZqӧGѦFߒ Tҥnq]WI+r @� @� @� @� @� @� @� @� @� @� @� @� @ \tQěoF<07[⊈n<P˶S\jٞm� @� @� @� @� @� @� @� @� @� @� @� @�lt;88čU"v%b" 0e@2 ' @� @� @� @� @� @� @� @� @� @� @� @� @`F7'?{ƨ) ?>bkg aj[G @� @� @� @� @� @� @� @� @� @� @� @�1EgN;E [cf#U zuD{q]U)3Z> @� @� @� @� @� @� @� @� @� @� @� @� qAgGfĦ烆j33"> kZ]Jݼ\jl� @� @� @� @� @� @� @� @� @� @� @� @�jDc´jڻ ѥKUWU*{nZ� @� @� @� @� @� @� @� @� @� @� @� @�Xx #n!;"vyc\ D\zi]wELV7kU o @� @� @� @� @� @� @� @� @� @� @� @� Pc}7Gco#;/K";=)DGRVu[� @� @� @� @� @� @� @� @� @� @� @� @�jFLD΍8؈￸'аjg8U"'@� @� @� @� @� @� @� @� @� @� @� @� @�5] t1{vEF_7?? "*k#9_ ԪJ]s @� @� @� @� @� @� @� @� @� @� @� @� @@x>}o777"??_wgEڻ?5� @� @� @� @� @� @� @� @� @� @� @� @�瞈 ;^`Aĉ'Fv{~OϏxhgUUuNqIK� @� @� @� @� @� @� @� @� @� @� @� @�jUmF,^6hq_k{EO#~T\uVV @� @� @� @� @� @� @� @� @� @� @� @� @�5[g:L+(bʈ}/ٵ] yfSOE|iկU_VU_޴:  @� @� @� @� @� @� @� @� @� @� @� @� @+;"/+oG99qY_=Ν!pq% P<P?ꭎ*sKZu,d  @� @� @� @� @� @� @� @� @� @� @� @� P>,M+׽ѫ׺ǸZ:5W_UQqɟF� @� @� @� @� @� @� @� @� @� @� @� @�G~ƍ#Lje}S#^}5bҤPY Ԫ,I @� @� @� @� @� @� @� @� @� @� @� @� @@뮈5|rr(#> ?HZ59$b-"5:s @� @� @� @� @� @� @� @� @� @� @� @� @v ,\1lXDQOYmF<POGt\;h c#}ת+ԪoY @� @� @� @� @� @� @� @� @� @� @� @� N´R8RNN9DLqq"rG;SGJ4 @� @� @� @� @� @� @� @� @� @� @� @� >Xtid˗G1ʕ+zjժ`^z~zNIUsssy^z////5j7.w&M/9͢cǥ_{:>yɾ[F-yZ^ uQ`#ZxɈϯV_M9% @� @� @� @� @� @� @� @� @� @� @� @�TXp˜?~vO"t-?Xxq,Z(;KR׵BSWcy4$4tXUʵֵbŊ,+KGq%[_[ҋJzBR&l[.7thӦMlfٱ|7mFÆ OW8(6ΕV ԪVn @� @� @� @� @� @� @� @� @� @� @� @� @R̙3c֬Y1gΜ;wn1ϛ7/ JYkbU *=oժU8ղe§Ro֬YƍW_oDI]fXtiY/ [dIPбt\lٗVKF)\+???ڷo-آcǎ[f[_z؅Z!p=g`ADɟVAZ @� @� @� @� @� @� @� @� @� @� @� @�j@QQQ̘1#NӦM+SVk=EvJCRӚm۶fEӦMkBbϟgAf)\6RVΝԻt5*򒿝0쫶DVm{cK� @� @� @� @� @� @� @� @� @� @� @� @@HYSL> &N~aL<9>,@?L6l2@N:e=4Ҟ999ΰ&·f͚cӧOz GKAi+Vȶmu5f֭[lvG'q5o}eZ ? @� @� @� @� @� @� @� @� @� @� @� @�uF cM0!{?~|1gfi& Svm`T;t)xI1o޼,8-=PsfwޥKqcvz#f͚ ^ŏoY7Z'P[#@� @� @� @� @� @� @� @� @� @� @� @� @ ,^8ƌcǎz+)D+gRHRm]7l ((('fZ~–)l0ukw}s=#??1|0bE"ZF|Y@֗M\!@� @� @� @� @� @� @� @� @� @� @� @� @@ pqūz=: =*..7<vme]GYOZM4=Z*~()mƌV[m{W3gؼyTΙѡC3DrH,PU^  @� @� @� @� @� @� @� @� @� @� @� @�^x^^z) ZbEi&zz 7Tc̘1Y5jT6k֬˂}fAoձƶF quEVY[� @� @� @� @� @� @� @� @� @� @� @� @�:*PXXj<31lذ,hѽ{,wYVnꨀj̙3`�7r;vlerHѼyZb"Vxj[N-$PNN @� @� @� @� @� @� @� @� @� @� @� @� P]s΍ǓO>>l,[,vi8㠃ʂڴiS]۱JH+#FÇgp 4Ⱦ磎:*<ڵkU&"#bVY#PzB� @� @� @� @� @� @� @� @� @� @� @� @@9sf<k[azho߾TXhQOGs̉w9?\}4c# "7(_V<B� @� @� @� @� @� @� @� @� @� @� @� @@((Iy衇;^z):t ~yyyCZ8F<H?ѣGvi1hРh׮]4)[7ވٳ^STxZb @� @� @� @� @� @� @� @� @� @� @� @�u]`ܸqq}M6?> ݻwGy睸{{9sG?яgի#Zᆈ3ΨVmMU;  @� @� @� @� @� @� @� @� @� @� @� @� P }=#L~{̞=;nӧ0: veӦMgzhq]wŪUp7unI"Tn~XVv$P6%{$@� @� @� @� @� @� @� @� @� @� @� @� @{{챱;cq'FF|} 999ѿxcԩqQGOӒpnqwիkki#f<P" Pg@� @� @� @� @� @� @� @� @� @� @� @� @@c9&SL[o5vazxСC\uU1}83`T7rȊLWrKZ}i**9 @� @� @� @� @� @� @� @� @� @� @� @�jիCѢE0aBoo߾Vej@˖-.>(w8΋˗ׄUjUVV<I� @� @� @� @� @� @� @� @� @� @� @� @@-Xpazq5}=XtҥZy'5yj]7-V\\/B\r%Yܹs}`%^tEfUv7x#{}'~ƪU6x VϟrKy?yתڴi7tS92 zI&U25f>Z*nI @� @� @� @� @� @� @� @� @� @� @� @�jٳcO>$~0`Fbʔ)1mڴHnY]wݕU*mիW;SFNN͝=SqGd!ZC=zĕW^)kCۆ|+~blٲ ]Ƨ c[o7ژoEDAAo]εsJ毱vz5 @� @� @� @� @� @� @� @� @� @� @� @�uX`ҥƦnC ͛ojSTN6<3gΌ-r2ݻw5*V\ ><^|Ÿ+;D>}{##F;ZhQvm}O6[I5/.,k}רq)�3ό~:|͍WE%%sFkW+9sni*#@� @� @� @� @� @� @� @� @� @� @� @� @@ylٲx7zV JChiӦh}Yq͋>KPVZxC ^{`zG)d{݊{ U^Ӧ_L|y.S'';ף( @� @� @� @� @� @� @� @� @� @� @� @�*KwߍO&lRYVx &=ܓ%uYhѢxꩧG뮻.{x'cǎ?!ڷo}Q򗿌UVENNNHt 'D/+W9zh^{-V[m]?׹4e]# hժU\}g{7n\l2N;59Z/袘5kV/ +0m_=1vxCѥKcԩqGfugLSLw=,X_~=P 1q{ウzZh'O8 RUr={v{ѳg2$wcɒ%ٖoZ/?yvm+ :[nl88S1韵tmƌYoF|ΝsU :4Ϝ9sO.7o#Pw1㎫իv)Z]8I @� @� @� @� @� @� @� @� @� @� @� @�lt{7uwk^R6mZo1 uzGYԲe˲6lzj5f̘Hs;d[4L릛n~Ş{v[pqkrԬYHAU)w]6$V>.Ҙ;wnvaq=WN\>lYo['x"{._?ȮpѴ$(IW?lqGI'͛jKRXiKRwwyg,vyeSV J-h%N:EeԺ;G޽⨣BR̙3{ǏjꪫnȂNb~zٸݮ , .}~F&M"o t k׮qGd&짲 P*nI @� @� @� @� @� @� @� @� @� @� @� @�j;{w57ª9_?pY֋/X643tAYךH#F_ٸɓ'gAJ'|rqѹsl/RU ZgϾKYRQFِ.(8sb}�گ>ffرcm۶R kݻw^{,[o¨.\QyY S Z*kY0X jذanxW1ڵ=zd[ouV_V5SVjjKaVRtM:W#Gfkj)$.N;n|{K9}S5wY@/?I @� @� @� @� @� @� @� @� @� @� @� @�@ƍT Jmv(Xre>8rK§Rw{,VXQtC=4R8#<~z8S0{t }dMbܸqڵkfk4iҤlo{Ҽylv N8!RT 4iR,^88.Rދ4ߒ%K?0oCwRNUךn{ڼyc^H]),͘1#ʸJoSW麥!_3g,//-V_ � @� @� @� @� @� @� @� @� @� @� @� @�z)xZW{ 磎:*RߟKos9l\ J4LF>}Ӊ'^ʎ)HkY`՚7J]ve1jԨ;6 J*3Lku>fmK-gJǦ`pt-????~-Z(RVL:>SSj]^s{ۣ}YZn_{Xyyyr7.5I@� @� @� @� @� @� @� @� @� @� @� @� @�z!0pw7.?>,nx'bРAeumȑ#ˮ-2ݮ]r(,,;.RhUik֬Yvo^*;?Uygӧ਴^~츮NCƈ#NFkhYVMu\b;N[%Kd5ZkK<yr <8N>ڲebZU lz @� @� @�7��@�IDAT @� @� @� @� @� @� @� @� @�j;gqFwyBj6|?_qaEV&իWv/]K'F~|&>8餓"6ֵkhѢE<C1vزgV^zjL>7eCRSj:ioj?|t)veѣG6|ذa[jU#daZrHi&lٲl҇rrrӕ+Wfʬt:N2%.Ϗ{'n{yӻJoϞ=cԹMV{jwg @� @� @� @� @� @� @� @� @� @� @� @�lu]͛71[iԚTsͶxⲭM6-;_paٵt”?9SG)$+dp6th۶m,Xz]vY�4?aԨQO~_/.ko߾[gHOQ)Hi?Ә={v<eaXiЈ#bҥ,@,G1iҤ뮻^>,򗿔ܗ^zi3& Gwy':t?dȐ,h믯Zg͚͝J[!}ߟ|I飱o%zg̘Q~̜93Vz~lR?~|{Qlb&Р?k؞l� @� @� @� @� @� @� @� @� @� @� @� @�U"R-w}wyѲe*Y&+(5uXhQ;6nXjU{ĕW^Æ ˦JPGuT4k֬l-" JnG}t0*>xO?tHB|,|jԨQѭ[,W^ƥ={Ы7x#l?vX\}Ѱaõ]vg}6{x饗3vm]vѫW, o[V㭷)4*e”Zƍnu7fhi/:u]w5;xw㭷ފ_|1gɂN?fmqſo~=MƋ/8ϟ'NX|y\pYYz)ثsΑK=??RPX Kcoe=̾Ҹݤo /̂~E Jkbӟ4'n)$N]2a{ U^I[OQn#t9%NU @� @� @� @� @� @� @� @� @� @� @� @�|… 㤓NʂRӀቚ{{Ѷmۯ`5K+}Ӎ›R0ַ !>}zlVYg%Ck`u,`+ns{)*Pn:͛P9pɒ%ѪUKkNAS)`*[FeZp%}ൢ5kV+yJ_AeG^b+Q+$4,_Xa$PlL� @� @� @� @� @� @� @� @� @� @� @� @@ HD)+C=4ҥK qZ :þqc}5no^+jF\O>_W=:_M6݈;ڥjU7z� @� @� @� @� @� @� @� @� @� @� @� @�W 777.8cG?Qqggڷo_{ Ɲn:.o\q1i… qfZ9kνo չsxO>c+֬%9%6  @� @� @� @� @� @� @� @� @� @� @� @� PeCK.$&LrJ\xYV-hr .6m'xb\}Ց_n5[`׿5ndM/R]}hG7Շ+FZgi& @� @� @� @� @� @� @� @� @� @� @� @�!C⪫_~9<8cFՁjn +Vl)I1lذ['nݺ/8p`*q*Y?"*I @� @� @� @� @� @� @� @� @� @� @� @�/R=:tgqFt!=9rd 4i)@k^2y睸⋣sqGdC{/N=zUq\Z߼  @� @� @� @� @� @� @� @� @� @� @� @�X/x衇;̂Rր}^wyxGc„ ѣG8bРAѮ]P淪a矏[MUU^  @� @� @� @� @� @� @� @� @� @� @� @�̙3|0^{hݺu??w۷Ԟ#P#-ZÇ!CO?s̉w9?5rkS*./Pv$@� @� @� @� @� @� @� @� @� @� @� @� @ ̝;7O>d<쳱lٲi⠃<0mڴBJ;~W#FѣA|GQG]vU˞jUYV<I� @� @� @� @� @� @� @� @� @� @� @� @�L0 !zgbذa1f̘Xzut= "ݻw+uF@9sf+K/cǎ=C?7o^]S7#PoFV<I� @� @� @� @� @� @� @� @� @� @� @� @�u //BR4zXbEi& ٳg{Fǎ9*[`6jԨ,Hk֬YK~Eoye/_/U,Pv$@� @� @� @� @� @� @� @� @� @� @� @� @z ƸqW_BRѤI8 .mݢGYQ:ѤI k Z*>x;dߌ3[mU^gؼy*Ԫ'  @� @� @� @� @� @� @� @� @� @� @� @� Paŋǘ1cRy4h z޽{nof^ӃuK Κ8qbgٵ▛ݺu]w5{瞑_ jP5*2jUΓ @� @� @� @� @� @� @� @� @� @� @� @�T5a„x`ɓX6mm6frCYRndM8͛SL>O4) ͚;wnեK,|mvʂJ͚5h Ԫ[Uq;O @� @� @� @� @� @� @� @� @� @� @� @� @ZVZSN> &N)4mڴ Ɩ[n;wV[m;v̮|7jٷE^O>Yf̙3c:1cFN{M+V&IYu5 QKjo}lv7n[-*,Pv$@� @� @� @� @� @� @� @� @� @� @� @� @F(**ӧg[)k))e˖3///ڵk۷/S֚m۶fEӦM˞uB旤*?;wnrʲ S ViYNBR8Z.]ިQNj@Z$ @� @� @� @� @� @� @� @� @� @� @� @�jEb֬YY3gNfӼy�zr55i$ڴiS7dhݺuK[j-[-Zd<qK{ i?˗NJ+S�YAAA,]4|ɒ%xr=&ҾfpYi( 0b-ߥ!Z)L*jUΓ @� @� @� @� @� @� @� @� @� @� @� @�SEEEp,\+S/ JO?4RR)l*IƵ6NNNNYViV:୆ F "777;~yZ+Կ<[jUt\=7k, [;H,tM6l<SV JuiG@Vu^$ @� @� @� @� @� @� @� @� @� @� @� @�%bgEAAA,]4cc Zreft!CU+JJ)x+ˋFEƍˎ4+fPtLyѢE,D+ 0�Uf'@� @� @� @� @� @� @� @� @� @� @� @� @@( j׮_GEr˕Ѱ?j@n-߿ @� @� @� @� @� @� @� @� @� @� @� @� @@-nCV-O**9 @� @� @� @� @� @� @� @� @� @� @� @�7/+e: P j—f @� @� @� @� @� @� @� @� @� @� @� @�K7q:եBm`c  @� @� @� @� @� @� @� @� @� @� @� @� @@e L1bDēOV"@ ֶ / @� @� @� @� @� @� @� @� @� @� @� @�[n)NM*!@`jm' @� @� @� @� @� @� @� @� @� @� @� @� @V㎈ΊȕS P{P{ߝ @� @� @� @� @� @� @� @� @� @� @� @� @V <PDAA_˰y*A@V% � @� @� @� @� @� @� @� @� @� @� @� @�6\#9&} -Uj @� @� @� @� @� @� @� @� @� @� @� @� @6N+D ^vkT@nU/`ޝyUþ"J(7DPs75MԶO[Ufi"j(09>g`Xay;s=E� @� @� @� @� @� @� @� @� @� @� @� @�ڈN"kFZ3 @� @� @� @� @� @� @� @� @� @� @� @�֢q%%kq!M:# PkyB� @� @� @� @� @� @� @� @� @� @� @� @�!pm DpBد] |Z72� @� @� @� @� @� @� @� @� @� @� @� @�Q`c`jThZ5Y< @� @� @� @� @� @� @� @� @� @� @� @�j3DѿZ zj^_ @� @� @� @� @� @� @� @� @� @� @� @� @@ka^*4 PjO�� @� @� @� @� @� @� @� @� @� @� @� @�֌wѿy Psj՜we @� @� @� @� @� @� @� @� @� @� @� @�SDii7YaZՔ @� @� @� @� @� @� @� @� @� @� @� @� mY% Pjo @� @� @� @� @� @� @� @� @� @� @� @�X##FDL6(5<!@f ԪYj  @� @� @� @� @� @� @� @� @� @� @� @� P#6W[4W@5; @� @� @� @� @� @� @� @� @� @� @� @�jԩa͍mz�,) PkI- @� @� @� @� @� @� @� @� @� @� @� @� PE4j49خ]jT/֗7i @� @� @� @� @� @� @� @� @� @� @� @�X-K"Zg^ @� @� @� @� @� @� @� @� @� @� @� @� @`6,⭷"z|/4hZZ6iG@U&4 @� @� @� @� @� @� @� @� @� @� @� @�,M`=L]vK#FĀsK6:r-cXJ SXe<  @� @� @� @� @� @� @� @� @� @� @� @� @@&E<@ĭF<{Ѷm*F-TVV%%%c„ q7ӗ[z뭘8qbB Y)@� @� @� @� @� @� @� @� @� @� @� @� @�"60#"&Oڵ[rb-<H\tE~E׮]J?A:Sו%Y- PF>'@� @� @� @� @� @� @� @� @� @� @� @� @)7qIXĉo߾pJ*--t\o~]Yuukl� @� @� @� @� @� @� @� @� @� @� @� @�9x|糥{F/xcΜ9;h׮]?>k:uj{1y8ӢGŽǰabgѦMb/SLw1:hѢEOa]7tS4l0?+={K/-z9#F#G{5j;vO?=95nܸ[#jr)5s=q]wŌ3=si⪫1cDf͢_~qU!P; @� @� @� @� @� @� @� @� @� @� @� @�<H*COY_}<Cqƹv[lvODӦMsVB?VUqu{w=:nN:}o~nuQGW\Rpף>{bРA9+ :4vu•³R裏r['irƓO>~x^wN^)Pz: j˹ފ^zo~y؁Sߙ@mU߾ @� @� @� @� @� @� @� @� @� @� @� @� @`5GӧOyŤIb o1f̘'xbj*va|C=3ڴiSiu);Y/q2f̘Ko|ɑ·RUjKn)9sf;6|x"Ma^=X/))#9yGrXVƍo߾qe :uDiii4l0.袘?~Ns=zꩱ.?p3Z-PV  @� @� @� @� @� @� @� @� @� @� @� @� @.bM#>'O+oqo߾w=4izKjUUڵkK.9j֬Yq-… #(ѱc裏r[vyaWmYq7#G=#Νnָ+r@V *x /Tvy8p`t=8C[n8dȐhٲeJzR�Wz^ RfZ; @� @� @� @� @� @� @� @� @� @� @� @�Y`޼#(l_~9WիWiu֍={ƣ>Z4k,/-PTW_͛ǨQ*TOUU9P+j@.,zO=T :4ߓ¼*UXӧO ><Ra_z . <x> @� @� @� @� @� @� @� @� @� @� @� @�Xi1#?bb1q;kninӦM}E+73g`[o-޴;=z/;wn]�6hРk#n-|ab;6lXs1y}g}v)>䓘2e6Z/ @� @� @� @� @� @� @� @� @� @� @� @�VѮ:ujԯ_?79ڨQQFѭ[(i͛7Ҙ]{S9󢬬8'>xJ JAZ_sΉma?p:蠃u{;3ߏ>} /4bĈhժU4m4=ztqEovM@mU[߼} @� @� @� @� @� @� @� @� @� @� @� @� @Ǝx챈lJeѩS.W'NqO~:)\>`yw*ŤIr[:;߉f͚w_ ,O:ӣo߾qWqӦM7|3Zh[lEJ)d+4:~fΜ*a-\0ܾDϞ=c֭[H{.(v}СC#,PV%� @� @� @� @� @� @� @� @� @� @� @� @�VI<*:vgӼ{ѹs:thL0!zgyf} /;//9vax⨣XrJ빿_~oķxWrۉ'Ϗ~8R ?8"r <86tӸ㤓NGsLrcƍ?񏣴47ޱ'\\sM 0 Ӟ>\/++vG5믿>q?8~ӟƏ~ҥK\|ŕvA j� @� @� @� @� @� @� @� @� @� @� @� @�GO<*ñ<k|+_*.\ðf͚ó4iRiEbĉ[ J˹Hq<Ǐjy9T9sf4j(իWlb6*^/2whذaL<9ׯ_}gΡ`˓ǚ5k@i"Z><wkM� @� @� @� @� @� @� @� @� @� @� @� @�GIʼn'.0.mҥ˒RNСRՑze Yf_͗_0tc J|؟MFnkuI@ @� @� @� @� @� @� @� @� @� @� @� @� @`U8舍6Zr{/ڶmdW@O� @� @� @� @� @� @� @� @� @� @� @� @�VI"FiO͋~EIIc)ڒxZ"hJ� @� @� @� @� @� @� @� @� @� @� @� @�Ak#.bݖA?y-ڵkW& Pq%@� @� @� @� @� @� @� @� @� @� @� @� @@5 |QwD\ziՓ6i$9昪; @uH @� @� @� @� @� @� @� @� @� @� @� @� @�ַVv @ B� @� @� @� @� @� @� @� @� @� @� @� @�VZ`o|#E  @� @� @� @� @� @� @� @� @� @� @� @� @<xر|.P @� @� @� @� @� @� @� @� @� @� @� @�XqkW"V#  P@T @� @� @� @� @� @� @� @� @� @� @� @� @2> #_0X!Z+d @� @� @� @� @� @� @� @� @� @� @� @�T<8aÈo|b:VN@ʹ� @� @� @� @� @� @� @� @� @� @� @� @�B`ʔ+>햕E\w]ķѸjXYZ++> @� @� @� @� @� @� @� @� @� @� @� @�S#<3bM> zꩈ#bk- Fꮑx @� @� @� @� @� @� @� @� @� @� @� @�HY>[wq-EtѾ}ܒE  YdI @� @� @� @� @� @� @� @� @� @� @� @� r>E^GnqcƬ# j@,� @� @� @� @� @� @� @� @� @� @� @� @�_bVieeE̝1xpD1sfa3@/e4 @� @� @� @� @� @� @� @� @� @� @� @�jut`gVD浊f Fe3SO1 @� @� @� @� @� @� @� @� @� @� @� @�HY"JKsΉ8C� ]� @� @� @� @� @� @� @� @� @� @� @� @� P{RV ͪc/F�VF @� @�Ge ��@�IDAT @� @� @� @� @� @� @� @� @� @� @ ̞]떧Kč7.=p; @`I:K6i!@� @� @� @� @� @� @� @� @� @� @� @� @� ̚QVVY#imu}Eԯ_VF@ʨ� @� @� @� @� @� @� @� @� @� @� @� @�D j-\fKK#60hv5@Us/ @� @� @� @� @� @� @� @� @� @� @� @�s3#-luo6,LkMkT@0 @� @� @� @� @� @� @� @� @� @� @� @�,3>_oIIGtyC@Vu(� @� @� @� @� @� @� @� @� @� @� @� @�G}nkϯ P]K< @� @� @� @� @� @� @� @� @� @� @� @�XflS^ѷzA["@`()+/J,� @� @� @� @� @� @� @� @� @� @� @� @�5@`1gΜOGzܹc޼y_ڑ?X`A>/^/\/\0ұhѢ*ϩ/ET<mT/))\Hy^uƍQN%u-S7իϋ 4Wyt4lذұx[ƍѨQ|XӦEn1|xDk{55~5}Y- @� @� @� @� @� @� @� @� @� @� @� @�_@ F͚5+>裘9sf>6{||U Z)jy%Q`àR6mlA_^0U!*[gsxzG JG~㍟qǕҘBW^:U KS=c@Զ"%e:4iϋכ7o͚5tX/l2߻"5�()G(K @� @� @� @� @� @� @� @� @� @� @� @� @`H+3f̈?1}9+^1)8+ t*)ܪT8 AL MܨQbS΅ЬYʳCO[)h+͙3'*+SpZ!PPOsWU֭-Z|VZs 70tU5_`ڴ֭#{ounuNf. @� @� @� @� @� @� @� @� @� @� @� @�,O`…9kʔ)1uJ|cZy2M JGbSN8JFPtԩSTBJ͛CR`|VWRR 4Gz]͛CRV `+C t0aB=6s%T^h<Z-M6sv>Y<=6; @� @� @� @� @� @� @� @� @� @� @� @�#0wxwc{/S[NY-*>4cm9\( 7ܰFTƥ#+k[O?5}b�\!.}z:%mƱ&D۶m+M74.e(,,b޽u+q.k"@� @� @� @� @� @� @� @� @� @� @� @� ̛7/&M'N~;)<+)<PJJJr V! (uڴiS *hnu&PRV KNJ ĴBV:7ߌ'|2}iS\ͤp6۬xn߾}c-vEZB h%@� @� @� @� @� @� @� @� @� @� @� @� @zRO JA>oV1eʔ(D4h l9',~mVO"Rf7y\?6Y(ӥP[FbTOA\)KY=9igÇGz*Pk}}E� @� @� @� @� @� @� @� @� @� @� @� @`1砬7x#^JǤIb…f͚wR O i߾}h]SRR. X[鷛ByBR^ KDŽ bܹyyϿm&?<r)+/ Pkj;  @� @� @� @� @� @� @� @� @� @� @� @�gώcƸqW^G?ծ]z+:tAZn:/"@`/lP‘4h:uΝ;Ƕn[<uS/ PkFK!Pki2  @� @� @� @� @� @� @� @� @� @� @� @�-W_}5x饗_DŽ "4iҤq Gǎs:=#@` ̘1#RV ޫxЭGiiil6]�5Z+j;  @� @� @� @� @� @� @� @� @� @� @� @�1 رccԨQ;FcƌO>$4hòRM.]GdуXҿ;ǏA})pתU޽{ܣG~)|b^G ԪN� @� @� @� @� @� @� @� @� @� @� @� @`:uj<OǿG˖-[n9&٤sQnudA.0wUK^x!mѳg|ѫWh޼NRܟ@"dn @� @� @� @� @� @� @� @� @� @� @� @� Pn#Gc=ƍv) 6l%%%տ�3 @`.\/R<3HAcǎ^u5c|;RZjv$@� @� @� @� @� @� @� @� @� @� @� @� |I >< _-Z.[>RVÆ Wn$@9sf<#l͟??ľ_7nݺkslZ+)PkI� @� @� @� @� @� @� @� @� @� @� @� @ L:5x:thZhQWO)--BsL�"0wx'GǨQrAvXpѬY*)PJjBL @� @� @� @� @� @� @� @� @� @� @� @�X9Yf=v[x#|k_}76mr�5\>|0 >ñ`oqx`ԯ_Pʿ2Z+oN @� @� @� @� @� @� @� @� @� @� @� @�K5jT\{qGf裏>}nuY}: Pϟ)T;/ixѿرc!+oN @� @� @� @� @� @� @� @� @� @� @� @�bȐ!;cZyJ <yr\s5{Ӫ$� ԯ_?9䐸[bʔ)_*~ԩS|㏣Zj/ @� @� @� @� @� @� @� @� @� @� @� @�֌#<;c/gM0!SZZf¿{Tn~ 4(:8묳mު&={v|ѧOhժUqѣ .ݻ_G Ν;ǩXYw}7~Y:յFK{xM6߫?^|zy1Z  @� @� @� @� @� @� @� @� @� @� @� @�%qtP|_ufmNodѢE9f̘1kO=pu3gƼy⡇3f^yH)(nxWU)WqLUmkIk<1gΜվ^ҥK{b7sN̟?u<ΜkQ@Zh @� @� @� @� @� @� @� @� @� @� @� @�-K/E7ވ>~_lP#6UZZzSgǘNqgv';ww=N:Jm]Vj[#<]tQ* pQz7:zum-[n%os)SV#ͽDkxG� @� @� @� @� @� @� @� @� @� @� @� @`u7.sk_"iu<lٲe4o޼]֭cc`Uϫ--L81 .,ةRkV{NνT5{=\4j(<}ikd @� @� @� @� @� @� @� @� @� @� @� @�H!J}]w5 %%%Y̙_[o/BRHwM6:(xWOo}[yO\rI<3¸<ޢEsܹsꫯ~:vaڵyG-ZoD I{ǔ)Sbw:+ҳVg:uj <8 [mUg?6msZO<yrr! *vi/})ᄌ뮻׿u|=\pdu!r-6|875cƌx{*6,~_&lK*++'|2n׿"պu:t!C#% eڴiy cƌf͚E~Z i.9C=4; 7ܐn_2}#Fk;S\ve[-=o޼6rȨSNӣGվ}hby+̵"Fn㎋[WY7ML0!}u5+Vw]\D j*իWH;S2%PgY @� @� @� @� @� @� @� @� @� @� @� @�XR^z)I0ӿHU)*"9*cBF'pB<"Y�t^{U (wCys@C=^xa{9Hh'xbIm6=4R)GuT\qѳgTDԸ{'tI'SxS I%06,іBӺSҾÝRT 1e]⭷Tk6z?sU n:cc~給/RTz)<,/<>cɁh)*}CHX)l+}霂 ii))~ǁCzꩼʖ֚wZ()*aoO.ޗӷµR۟.vn#8"o9;~(^|nJEmGh,ҘmӞSPXS կ~]u&M}0|Z5 @� @� @� @� @� @� @� @� @� @� @� @xCf'W6x2;'7|sNVO?t@J!C)�}9&]m?ԭ[vgбҴǮÍf̘'xb̟?xo`3SR*cƌD֖HIi\ W*7\ RHw>hiӦ;C~bsҥmi\ Ly؁P`¹Re]V+?~|yo~3;o),^R9srW kjݺu9 'o~=)�o߾1iҤ8rX JSLdSO=5矟)+foaÆqE'c=),?ϑs̉ÇG 4W^oSN9+s RX۽[sL+7#wLasfZE{饗𻣏>:Zl>RBVw'v}l /[ouM� @� @� @� @� @� @� @� @� @� @� @� @RRPR 7o^4h`ިQfդI\OaDL:5ӟv-v?p`t 7D󘲲;m۶9Ԩpc I9lyg^z吡ۯ0<oXpaqDձc裏mX()0+!f͚X/To+XҸ5hРV:{o̝;U3[xu 'D]wܹ0$O /]h"ϑ K_REYImC P)4-{M!Z=ݻ`C9z²RYr|w/o=ϓ6v͜93o.Y(ӦM^{={ѣGs֗BH9#=ȗB"JkNF)4-z+]Wӷ&lRSl>] @� @� @� @� @� @� @� @� @� @� @� @�T!pПU_MUn3ΈE<yr<}-M[)x*#U,u͡Eb /)(L-^^}H[F*Jx:=V,jxO3cƌŻV:} AK{ngiV6U^| 5Y5ÿ&LvXP9s9q^Ru]lM :֭[W\{G*yp<#R@[*ƍ-2RXiY+̵]w5ߚT}'+3RI._TϮ/bm=zTZKXKX @� @� @� @� @� @� @� @� @� @� @� @�5I` 6wqyU I{XյwqѲejtG~:ժU\4iRL8ң6t|ݦMb'{Wy睱xHYƍsV Z[7³j[|a)) ,oq4mU^Sygx'|SLO?4wqG6,9<~…; }o$}>hc=6^~JiҤI<1{s=SO7dȐ*M͚5wu)e{qGi?㬳ΊN:)_\~B!vͧ&WVM|kL� @� @� @� @� @� @� @� @� @� @� @� ?+r%\ÑR '^\|q'‹u떯GYlOQFEF4ndMG?Q ><5R''>x+Ьy]U[s?r/ֳj={T:veU{ ]]UuKǎiӦq]wѣCRXmqg}^x!3#FӧG S0`@n:nHJ{7F K?7|3<uرc劬/ͱ*%}[ou˵Hϙ3gN?wO<D\ve.L*};߉qwG^V5w K!@� @� @� @� @� @� @� @� @� @� @� @�Y?bСqUWP_5j3gMET>|N&N)hri0<0ڷo_׿u~s}iqO~hժU|==/i~9騣>f͚/~z7J\ɓiӦڦNZl{wrpN&Mmsv>C~j˃˵t7FΝv!\O]OJR-6h8묳rӲu m"%R)QѰ?Hkc…ѻw袋"ѡCѣG)+mvѲevwB0ٮ͛7wqG$s=7cȐ!/@SO=5o [ 6,|)-Y_oPz衘0aB\s59`ny6o#i04O0 >~xs׾uqִ%I|&$n#@� @� @� @� @� @� @� @� @� @� @� @� PRT "wy9h]5IZgyf_;9?g:uĀo~9|E9褓N?88C+?Fm馱^{4\<@\x1f̘[n|ߍSN9%:U^8믏z*>(_m1x<wߍ֓{.BRPW 4hPi[ocR�֢E"{アwR_ԩm]tDaaÆy)4*"iӦZӌ3~S۱:v۸s՜9sk׮c>'%qy+If?OsV :KsS:7<H!fi\ JN]vY^һL%%%o~C;|_l)Ϗ]v%xl<:WU¦ڶm&MFz))׽{<<`eov}H?7ngώ[Lȳ߿Inz[nexZnHg?Yώt4h`-ǧ֭#򰸪hZ@V.Z  @� @� @� @� @�?{weU )*暻ffi{jidRKJ2ҲE5M T0I \f<ߑA֑u}wM� @� @� @� @� @� @� @`Ǝ[࢝v)Ǫ >},XT‰JZcccW_JQkZ 7n\5φnZ3vk)!PǏO *!dY Y+Z%7H '+\m^|<UW jK@CfWn.sd={̚k8744J`ZMiԩYeU귙&<\uU1cF,cO=T><#UUxA57\~/z|as@"UJ@Y-% mOӹ/r /%pj~wjΗ @� @� @� @� @� @� @� @� @� @� @� @�+P_.\yUG?<[B;-pEo\htm-O[j=0`@&M}ݷųݔ'|r~-uv/ŬY�ۯ;z5bĈ\wu *w>T]sњ9Ӫ Xzk?+_JknWߔp[n%?ϫ^;zjN:jy5v_ @� @� @� @� @� @� @� @� @� @� @� @� lA.\xᅹ3r*|?=I^c4]&PB.ӧB߷_|g}KVs.޽{g 4\)Z%4n֭[Oʡ02vmJU}?̐!Co;vl@SN~ߤ Ї>nk׮`մ@Z6 @� @� @� @� @� @� @� @� @� @� @� @�T/B~_omݖ=z}{_g^6lN&PN:*Pm6'??-;z뭙4iRtV?Odwlw 1cF/[nɽޛݻgM6qշovW *I>`^>GN {ߟ:(p@Zϼ<9Sr{j-L; @� @� @� @� @� @� @� @� @� @� @� @�m ꫯtM'f֫v}y;3rY +-,Aڇ@ w>}z> Z*JzJ.]Ԕ~8%lԨQU` ,!#Fٳ/v)T PZoK @� @� @� @� @� @� @� @� @� @� @� @�KEGn//VZ;SwgmJ+T3Ju=Θ1ccʔ)<xpJ`^{}2dH[\z~Z% @� @� @� @� @� @� @� @� @� @� @� @�.0{<=zt-O=Tu6۬ fmV[]z$@`qJx<'x"]tó;fvC.@o@� @� @� @� @� @� @� @� @� @� @� @� @24iRJV9*<ڵk6h*\k-o^lAhL3 ^!?xWz*H駟־zmvUoUVYӻo槲xj-^ @� @� @� @� @� @� @� @� @� @� @� @�ڕ>￿:J?7.MMM۷o6t>|xСCӣGv ~M{,cǎm>V3gάxSj*Dk뭷k~+ z;_ @� @� @� @� @� @� @� @� @� @� @� @�hW% Gµ_Wu? ޽{6p 6,|;~=dȐ[`ƌy''h>}bUpV dMc7BJP>j-gaoj-L; @� @� @� @� @� @� @� @� @� @� @� @�@`yG3v<cUN )Nj/Xi` Wr]5hРtڵhX-0k֬<y駫㩧ĉЬ0x`W^=׺߉@ֹjΗ @� @� @� @� @� @� @� @� @� @� @� @�:/'x"ƍky' &Zc Yguz5%< О*0fgI[=\eݻ p pyСUhV߾}r;dmZmZoK @� @� @� @� @� @� @� @� @� @� @� @�Z )A=Ǐo)%w^yf5hР*`kY{z)}5̘1#%%0kzx֤Iòt5\9nȐ!awViN@VjΗ @� @� @� @� @� @� @� @� @� @� @� @�Vx_ *?%`S*@6mZU Ym2`kVTʱkT^z5@{x7 /TNj/|]wL:ŒV^y*ՏRw *r[mz;_ @� @� @� @� @� @� @� @� @� @� @� @� SL*4uyVBJٳgo߾[%kWB=߿rݳgc!8ӧO+Ro\_K/4s=<|;wڵk{-qs 8\UJ+4;@oVK @� @� @� @� @� @� @� @� @� @� @� @�,@ *ACCCD%`~g0h4vӦM}iZeU+Wr�yY9z1y<\3fo^{-|ݫS8ן3gwAwQs6lXkQ)Z-Z `o @� @� @� @� @� @� @� @� @� @� @� @�XݻwcI/H0W^ylI&'hV1M>}ӖJHJ+|_{3ˀS^z5?/={\QB<c4K.. mjjj>fϞ׍)ǬYRŽUǼk5WH P+ZsYZ٣6oZ V[{C} [uU~]?wmaxG@+jg @� @� @�y!��@�IDAT @� @� @� @� @� @� @� @� @�/RZkU۩Cõʹ~믷p*aNs:`rj׌s|&N>;|d-jRCJhT/!T˾ MŅ.ae ;xLV%jy}kLJ瞷fH~-CY%8_~QQ4گ@7*#@� @� @� @� @� @� @� @� @� @� @� @� @`9t-%;cM- +d}nX!fϞ]kpYfU[s ۚ~555e]9ʸ(~]?pӟ6wKK.(} *&~VwU󻮇h ֶڒrȌ#ӟ&n|G@{՞vC- @� @� @� @� @� @� @� @� @� @� @� @�tH/$_%kK)Uz|;> e{s}\w%VrI˰S &?o� @� @� @� @� @� @� @� @� @� @� @� @�Z+Pv%7.K~% jonݒ;~-{IN?=9Ó)SO-f%@`Z:F!@� @� @� @� @� @� @� @� @� @� @� @� @`d뭓3KN= @ƎS5|+lUr]rO@GQvJ @� @� @� @� @� @� @� @� @� @� @� @�u!$G1'ivSb{䡇M6Iv-d[g:@S$@� @� @� @� @� @� @� @� @� @� @� @� @]srUorI%*jEVrMWw^rAɔ)Kġ3Y@r� @� @� @� @� @� @� @� @� @� @� @� @� q>f9w_ry+LZem]$gv[rv%=4 ^jםQ @� @� @� @� @� @� @� @� @� @� @� @�F19JƌIvS^ lZu]wMx Ygd#o h� @� @� @� @� @� @� @� @� @� @� @� @�.0yr2bD$?q'z-v5P O?sL&gm2 ІplC @� @� @� @� @� @� @� @� @� @� @� @� @C }wr!IZ˘1[w(3j=ד-HN9%?#~Z0!@tm'u(� @� @� @� @� @� @� @� @� @� @� @� @�J?Nv-l{;WVZKillWmRG>v[r];'&4%@m z>'@� @� @� @� @� @� @� @� @� @� @� @� @s JN<qW\k,m*k-AZSvJzhε h?^� @� @� @� @� @� @� @� @� @� @� @� @�,0eJ|INR32~;H68m["@`E[ @� @� @� @� @� @� @� @� @� @� @� @�xdJFN:NwSJkls^?K7WU[#!нcJ @� @� @� @� @� @� @� @� @� @� @� @�QA%Æ%ޚ vsԪ_ڲ=#1$|r[hlG@(C� @� @� @� @� @� @� @� @� @� @� @� @@(J'p@rIޝv-Vjjjx%גUVIN9%ySZ!nڭ@v5 #@� @� @� @� @� @� @� @� @� @� @� @� @Jդ-(ظo3j}so F@ֲq6  @� @� @� @� @� @� @� @� @� @� @� @�H!9'?INkG-Rj́.aj%Tɹ. 0 -jpC� @� @� @� @� @� @� @� @� @� @� @� @@gx;H~d:>ZopHzN>7߹"@`Z6f!@� @� @� @� @� @� @� @� @� @� @� @� @�On=nvPr*AVKOOOO<sNV Xv @� @� @� @� @� @� @� @� @� @� @� @�X'&#F$//b޺ g5'TӒWO;}<!@mjQ  @� @� @� @� @� @� @� @� @� @� @� @�hG?>'LO;wJ5}.<99dd=S@ץ; @� @� @� @� @� @� @� @� @� @� @� @� оd];UZuL<0y䑷�/ Pk� @� @� @� @� @� @� @� @� @� @� @� @�v"ɞ{&nzkvP@oBZ5$[l|ɤI KG@q4  @� @� @� @� @� @� @� @� @� @� @� @�L{7f曓}Y˹Z ߀^oLwO=45k%@ z{~&@� @� @� @� @� @� @� @� @� @� @� @� @ wo~\%u\H;~jw_rP:&Z @� @� @� @� @� @� @� @� @� @� @� @�o yg>ɞ{&7ܐ;Wo t6纵Z'OW\?_\ۮf-$䪫pokٳgWk:묳w3-ѣsGg]w{-Ӽ#<2'pB6-{)wUY @� @� @� @� @� @� @� @� @� @� @� @�+@N~ˤGa@ԥKKrM7e_9Uz*ǏO9/v!I-*cFKc%)&L|$SLaGY%$O̺뮛'ZBȑ#s7gĈ 9蠃 /+?;.>`.…O-t]s  @� @� @� @� @� @� @� @� @� @� @� @� СjY>gd]_B֢65Z/|z7La*PSNYj]|q&G$3f,ahnMG?Ç\/+䳟lFUw@<0|\pAoᢋ.6l}7~zu-Ի9X"ZKĥ3 @� @� @� @� @� @� @� @� @� @� @� @�Q_Jd뭓OzlUyLjǏQGU+?hPoz!Z|ߣG<Dr9-^-]K]_?w߽zu_]?չk?ȠA~5PJ˛ $ݗ @� @� @� @� @� @� @� @� @� @� @� @�hoO>WFo~*lu]wkرcS7n\sL4)7xc&N-8c9&{lr<fmrgihhHG?QonJx\zijjJZչ瞛QFeո}E]CN=CЯ#Gj|Ugy&?sw_~2dH58y|9+T%oz=sjMwqGbzGfUӧRM-2gqFbom^x!]tigqo|ng-ޔ*[=/~e޻E;j?ojݻGjfK?"nS@� @� @� @� @� @� @� @� @� @� @� @� @�#Pwʈ%ZwEe@p=VV%#aVQ�zo; ;0Oӵ0U`U *KvWR%va*D?Xm}ί~r-U@.R=/Y%STLR=+0JcƌɁgŌ?^B>*�w]>я+l~Wvi*H{.o>%'VnN<1yӷNRķRәgY_(^ʻz>ϧ[mf;sTA\ӟ06w/^%8lQG{u֩yE.0&LP Tn|%TM#"ؖTL @� @� @� @� @� @� @� @� @� @� @� @�څk%RJ*:L@ UaXsLN8ᄪK.$wuW'?G>lջ 6 y{'x:n j U/N }ZwuzhV 9rd}ٌ5*%\D*@&;HuY۪%T?)a]+R:ꨬj8jKVc};\]ʘeMrJ[;ZpV-9kv_%瞛|R?\YQK~+<Hr9T~pbڇ38#oj׿4444O=Дo<{[Uj\e=M<:y[٤Z]kZ-}  @� @� @� @� @� @� @� @� @� @� @� @�hf%p'c$:T 3j^L>=;cgѹ@j5o|ͫ0\9v5פ1tPu_y3tL2z6x|Vlv} r:#ewj-/Kץ^ndDUW^zgy&^xa~WJh 7ܐUW] *K]Vݻ[go;9K-fyU%i[a_4hPsVno߾yǫ1w1s=CVm͵.=z7h~A={|˫ &Tƿ/SߣWJ(ؼmVìuYgW ,R@"t @� @� @� @� @� @� @� @� @� @� @� @� @= Բr]w%F%n؞8ѵVGGTEۮZ>cs? Z<{98%TG}4%{盷K8ּSO©JV ԺKN;k~_WZz׻ZS;F +p+ Ӻr1Ǥ??tOsU?w_ˮ? +!]sbS>%NUS[V6G^S6km9t.gp@.17Rp^{<?eMZ.c%` @� @� @� @� @� @� @� @� @� @� @� @� |. կ.z[KGwWRs%'tRu]Ygu6?+ rJ+eԩUoܢSO= 6ؠųyofl=U>e[2dȐ*$!ԧ}cccvq<93v|AU}ߔ7x נޱɕ-H¸O={V7Hg͚=ӦMK߾}`)[e-6̙3wygkz[ڂ4i"}oN9ruG#>Y6(%�'?e'O 7Seb~ @� @� @� @� @� @� @� @� @� @� @� @�ȑ| - :ϜݺW^Zѣ[,{wy\Қ1cF~j.2{cƌ9|SO= *O{nUµJ֣>| <%묳ʀ2#я~x:thk6<@8q &4?bذ֐|ɳϾuy嗫zPU ϽO>-ܲc}\BJ}-5q<3 =^zjG%DkM7J`V *dx`Ns_硇Jmva\XZK/ @� @� @� @� @� @� @� @� @� @� @� @�MNJ>9VH'xNYe5{'_߼Ys5sgWJHTi7|sJ7*<+aMVJK8+뮻.#F_N;-GuToV}KTiտ 2$~xեlVڵeԩSwsaH=�j.ٳg>O]Pmvl߾껠>dr}lI'X9mݶ~UXX;~;6gjNBT?ꪫr]w7׿*ka뮹s}-(sؕW^Yr*T}J8Z1WRݗoev駟%RKs{3roIԗ� @� @� @� @� @� @� @� @� @� @� @� @�HS Iv1|ĝxӓ>}>_?_92s<Ck&T Y *[o\xԷoߔw9G]|93׿5rH&NXU~WVG}t5k֬ 6,sNB5/} tMS*;mY?gРA/*s�Oj/!U%L\UJUT=+ߔ>}4S-t**|_E]T_qJhyW_zֺ:d=9昜!aŻZn~VVZi%\XY=?h%~/oJ6܀^%| @� @� @� @� @� @� @� @� @� @� @� @�,C7Hv)S YwjRl+ V+}WYl[V_BJS 꺄f%�kܸqUԆn*I`ԩUU={ Ys5tQnhhHccc}ٔWkVm :4+򂆛]wM-*52o1+!ds^Uj׿W_}5[neNV7gҤIЦZj<?P}[*Ae<؃vZyZoK @� @� @� @� @� @� @� @� @� @� @� @�&7ߜw_`dZT-�lcVU2;q뒃jyܾj~S_ @� @� @� @� @� @� @� @� @� @� @� @� @m.,ϒnv-#^kvii[uUoyK=wRf9v8CҥKN> []fֈ @� @� @� @� @� @� @� @� @� @� @� @�x{wݕ{ry|=]/KO+-2>bi<X&/L֎vjhhHn:ɓoOcݼ@xD� @� @� @� @� @� @� @� @� @� @� @� @xdmҥ򭧳ޫWrGw.uxb^?\sղ/U@VS_ @� @� @� @� @� @� @� @� @� @� @� @� @mN:)-jaZm#<gbؖ3xcɬYo]~VZZ @� @� @� @� @� @� @� @� @� @� @� @�m"%7ݔ\sMjm2AO@) zy3jԝK#:Z @� @� @� @� @� @� @� @� @� @� @� @�(#Yg%\nqfZm__Qms饿i J tk$ @� @� @� @� @� @� @� @� @� @� @� @�:G$l\pA\@,YVlޙijJvmyJ3 3Li- @� @� @� @� @� @� @� @� @� @� @� @�:@ њ0!92)AOZ j;#K/nh9L3 Li- @� @� @� @� @� @� @� @� @� @� @� @�:w'FrwEtjݦ tPկF&Йjuݴ @� @� @� @� @� @� @� @� @� @� @� @�P`'::pv>餄ygctA@VgEk @� @� @� @� @� @� @� @� @� @� @� @� Ё.0?>;":@ 'S&/<W^I&NLy&ydܸ9;};CoYm%'3W$]f @� @� @� @� @� @� @� @� @� @� @� @�,J6ַO_8s~#Ox-W QG%G'ޚ\qEFz:ɓoOأ#`}Mmf @� @� @� @� @� @� @� @� @� @� @� @�VtUN;mEh{j *Lki̙sF80uפ[=߼wE`E"ᄉ @� @� @� @� @� @� @� @� @� @� @� @�XW_sOҥr,dz=J&O^{H9fY<GI~+)Si͞2L4}@kE",  @� @� @� @� @� @� @� @� @� @� @� @�h_S&)$lӾjt՜pBRBfJ;lAo=_K2ioi)Q@֊L� @� @� @� @� @� @� @� @� @� @� @� @`9 \p/}i9MI ZP6,t|q6wE>}} ZQv:  @� @� @� @� @� @� @� @� @� @� @� @�O.,Vk'E elzH9fhe~zrIE$ j0|XğKZb  @� @� @� @� @� @� @� @� @� @� @� @��睗 xb(xIIno]جYᇿ'7#@x Z܊  @� @� @� @� @� @� @� @� @� @� @� @�,7{M6:-V:*ijz낇O6=i@ -+P-ZU9ժ @� @� @� @� @� @� @� @� @� @� @� @�KsIv)Їey+DQk-J1Ǭ_/dU[z׋Up&+ @� @� @� @� @� @� @� @� @� @� @� @� @`ɭ&\L3BN8!ijzCCCrao޻Zz뮛wI - ԚW, PkE}k'@� @� @� @� @� @� @� @� @� @� @� @� dĈd]ᤦA%zjMa޼wt.:@x Zq  @� @� @� @� @� @� @� @� @� @� @� @�,3;LFN>e6"J!$ݻ9=v!Z*pr%-݊- Pk'@� @� @� @� @� @� @� @� @� @� @� @� Ld]w_&әd1?>ihszb|8n %Pm 4 @� @� @� @� @� @� @� @� @� @� @� @�$]rm7-ؘ>=\^ZִGV]uz}L'{ꫯgW^z,W$%G'SOO /iӦez-akƌѣGj?ʞee}Q̮R:  @� @� @� @� @� @� @� @� @� @� @� @�x<pR(aYw}w~ jjj_ܲ/묳N7߼:v 6eGw 2eJ;\hu<<3{eo}٧OYWG٣:%pK[''$ߞ򭥣.Pz  @� @� @� @� @� @� @� @� @� @� @� @�t _L;IN>ށJmll̨Qr-T/ Ys56۬ <xp T%,w7njZ@L6:^mĉ'<LV\=X5n sڣ'p@ʸڛŬŘ1cr]wUAZgj6ڨ *dݺmT38;3kVJPVٓ^zgϞ5kV?{wۆK#T,-Bh"NٲDd;4Kf,K)¨RRFTh'ut:^s?}-}O~~={v:uj6y8qb|g$tM4)+ lիW/whܸqԨQ\@3 ʻ @� @� @� @� @� @� @� @� @� @� @� @�D;#n1r"*TXIgs-xڵkt=R.]ѠAjr=_n:Ι3'RXW~~g}㎋-[FJr3U³^|իW ><_%[{v D.ۻoAO'vmI&q1!Uf'7bjRj- ]d��@�IDAT @� @� @� @� @� @� @� @� @� @� @� @�%;q;׬%{#<y֔¬6mo}̞=;^,H꥗^3gfus9qh-kcODΝi#;,Rٺ뮻6֜?~ꫯFϞ=cYYSN=cVw;#  @� @� @� @� @� @� @� @� @� @� @� @�XoGツT`ԩqw}묳N|qgǮұa֬YfA_ς,\ /5z뭸뮻GQrhѢEtIQN,cJ_]t¿F_\tE?9ʔ)JsbZ+Y+z @� @� @� @� @� @� @� @� @� @� @� @�*Ñ#L+~i?7xcTZ5}H!UǏᄏЄi:˗/rJ1pl͢I&Yp|֫W[ntAw?E :+aZ ~k&F}-"N8a 󱁢/ P蟡 @� @� @� @� @� @� @� @� @� @� @� @�(tfEѲe+Իwm{\}1f̘KB z{wAE2e"}?bƌ7x8*UD ׯ_4m4J.z@ 6_|1>hԨQqQVٳ'P ET ,!@� @� @� @� @� @� @� @� @� @� @� @� @`u^{-⧟"'thuf)c8C:uĨQ})=3~xgڵkǀ~y/¨W^̟??}޽{Ef+*zCcv#8"5k&MZ01Zk @� @� @� @� @� @� @� @� @� @� @� @�JsEԯ% /;3fLG.]g*UeB3O?8jԨ 4;ԶBy}'~8)L빜k9)x]v%uV) Ph  @� @� @� @� @� @� @� @� @� @� @� @�Zx/%† i-\0>hѢE3/Em+-_~yi&,X{7<u]cȑq駯5 7΂Ϛ7osEży Cij(!JA& @� @� @� @� @� @� @� @� @� @� @� @�x~8؂Zӷo8VZѯ_^zovPTK瞋{,N8B4hժU\xq 7DݣRJEZBرct9x8C/ޛB# PB @� @� @� @� @� @� @� @� @� @� @� @�^"֍RxgMbذaqGGƍGQb5ZiӦkE嬳Z,Z|޼yѢEڵkvW^ye�N<xbĈ{9cƌJa( P�-E� @� @� @� @� @� @� @� @� @� @� @� @$Tv{0aBva^{E.]\r?iAsEΝkY/X J_ӤIZOaYf͚ѯ_ꫯ3gQLjӃ- @� @� @� @� @� @� @� @� @� @� @� @�kC`ĈQj>9l26px饗buͰb'Ww}qM7ouxWaÆk¸;}cƩ .,e*&i @� @� @� @� @� @� @� @� @� @� @� @� [oE+?j w v[ 0 vlA.v UwgGfSNӧU?/7|s/c ~Rzx_[nKO� @� @� @� @� @� @� @� @� @� @� @� @ {QB t_vy yb޼yѡCw}sNj*8]-nָcȑE|ZE䠔I� @� @� @� @� @� @� @� @� @� @� @� @(洨UӢPZ1imfѮ]ZGaX|6ʂ3fLtWFRo/5B\pAԬY3ڴiSB, P @� @� @� @� @� @� @� @� @� @� @� @�%3"'UV… wqoh *8∸W+icE ZoDEnγ>;j qŃ>rKlfQ_L2ѱcӧOE};/ (� @� @� @� @� @� @� @� @� @� @� @� @@Q:4U66mZla‘R@رcTRn w}bŊYЧ~׏ &i'|2*T-Z8lٲqgSO=sY[RJѲe5VqZ^zѠA{Ӷ쥐*$  @� @� @� @� @� @� @� @� @� @� @� @�E] jmQ\x d;eʔ3<3vyH&N'pBԪU+ڷoUV;fΜz]t͛G2؎9bѻw5GNsyW˭ѵ\pA+W_Z-M� @� @� @� @� @� @� @� @� @� @� @� @8 |aD:đG]v-Э.]:'[no:k0{/ ~n.RWs{V[E5wY0`@L:5:5NqCzU\h_kI _K, @� @� @� @� @� @� @� @� @� @� @� @�kW`Јڵ#7o}ow͙3'gaFM4;&Oٳ;?>8∸+믿^|E>}e˖Q~8󲀤RJ-z2eJ\}YW-W_]yn3/}]w;w}+2p?~VK/vZ$ϫ*f̘ 7o^#6m_~e\r%qań :to=^{~:Vv+7`5Iٿ՘aCSfmjZy\㩧c9&>m֬Y|GK͐v饗FÆ _Ξ'tRy{zk=4?~|\wuy5ҹ._r^oQ^jm El^C� @� @� @� @� @� @� @� @� @� @� @� @�%rbĈ 8#<3q,5ju֍.]D 6:CЧ_=Op@l3RO<1g}RRjO>dm6~8蠃PQF믿x1c!zRT ԩSu=,9`ƍW\yn*UʾUi|2ǒ}x㦛n#GF6m"2}qgfΩǴiӲ d>)iwr'N'|JSO]漃 *U,Y*_Y*\G´~ S,5>}'ʖ-=\+ҽjժŻ<#y]tEYو~)l-ݫQFwqq9眓ݸqOZ8oQ;BڊVZe}:u|SbZ)\ @� @� @� @� @� @� @� @� @� @� @� @� W "΍~[/?G׮] Ժ?}fW)$hÇǂ �|ر6d<cYh駟kyqGd}.I;c^JvgP[r-W_͚5˂]ߴɓ˗_ۢ/p_Nm zСC#+(m֑RS YJc;w*N!Xw^ 2$chذaxYhR`EeL6jYvտ;iҤ| 4K}GE>}^vgdYv[v?Kzw}Xgu;F "KAbK6n?)+-R [ PKAt)kQ[{Z).9jS@V~j� @� @� @� @� @� @� @� @� @� @� @� @@ tZjm޼y~Y8VժUc…CeX믿bw}7 JAݺu˂iN 4 *ħ~=?f̘A-$[0Z zc6Z|ovEҥ\rO?-ܿ)W^ӧg/qnJi[mՒWzMɏSOEWӦMO?fLF=s))UR%cn r-ol'̚5+%k͙3']w|zљ.y`~GgfBRǏu-Q-GJnx駳+{gϞu[AH"@� @� @� @� @� @� @� @� @� @� @� @� PBRVb_�9tMk׮Ѿ}/#=%[ٲe#}&MamK>ΞիW/'|#FȞW^}~)|iQ�S5\]tRVK 0/ږ‹Re]78 Zi\t=zt/w JL2KYɓ' Rֲ/@,:<Na)jj>vm3.)P+RV&MGJrI!]-Zx رcl2}_YQ3g̷`yUrN  @� @� @� @� @� @� @� @� @� @� @� @�1Uӧ?~qV JW^1w(WγfyҘ &d[)hQjJ*Ŝ9sw}75jRO^9mРAKO_~HQ^xF <QF' iwꫯ]wu\iӦł Rfܲ}~-s ժU[ְKa_9NLT˝b뭷,y~=Hnwal{.7o)�uYHܪ5g}bذaѮ]ҥKz?1*WM>P~cFr/9 @� @� @� @� @� @� @� @� @� @� @� @�(q9:Kj%F0o6 ZN:HAJkno|5kf^̛7/ /J7n` g?pqnt)d]_u?~ӧǹ瞛Wϓ.RhQ JFvm,l2l}y]uUp}_~ﹽHg\v2dH$5;ދ&[oMGdoH_?]tv),3fd?N-/8bܹst){K/7n\6G~c>sH @� @� @� @� @� @� @� @� @� @� @� @�_>Pkς~l뮻.{gDV.B֭ժUQT{cY/s&N\W\qElqgaBN6>'x" $yYh矟5l0l dO?>~Қ{CE JmĈѻw*T4_ JD>Xb<Ѹq㬞6mĉ'wuW6} *K/.gyssi_4^&/s5.s̉wM²{y#- ̺瞋gӻؽ{w}LAY<H_:d}z鷐ZnbĉG D[{^{ecVD駟Fr䧀@4 @� @� @� @� @� @� @� @� @� @� @� @�*0mZ/ҥK ']vm6nXwuG/ +)* ;6 袋uUWe}R믿~.]dcHkzYV 2JF7pC\r%nō7޸tOf!Uk׎#<2;Hk~t2es'mM7^{- -{7sύ={f+W-Z[oM,:u]YYҷoh֬‬ ;o6jB&O5ZYV>ttի=ӧO+W.[&Õ*U|0jժ><_,8n̙ѺuxW9?tSN?~:׿5N;h׮];KSx\~b'mFos"gR sZGH� @� @� @� @� @� @� @� @� @� @� @� @�-HX矿4c}!CD:u͋/2faCKJA#G~!j֬*TX믿:{fAL[lg.R8g})D)qN3gNL4)zՙ&^x,j̘1jM38E|QT^zwu:K?3ߏ>hk:i&{L/j駟")mܹ>)<+[H˗/kz78wQ(W 4K|Wy߶|;]Z,;\2%"W bYZ/ @� @� @� @� @� @� @� @� @� @� @� @�Xw݈hSIJUTSN9%n(-zv7焲&WάYbmO<1|>  |h۶m|'YV!)P!P+he$ @� @� @� @� @� @� @� @� @� @� @� @�%P`̈9s"6dٛo޼yt-.\%nrꫯ{7Ǝ[v^{Yg||q뭷}C Y٧MW_\u־} iC*u *| @� @� @� @� @� @� @� @� @� @� @� @�k[`_*XQָqtQTb9V9眨RJkn|At):t)誠駟Oj*f͚eϟvZ <8g?  6 \ڊ@Mb>@ @� @� @� @� @� @� @� @� @� @� @� @�XÆEԮ1jTN;-_|1͛En w}Wy}F[^a̙3N:QjݻwV3fL^qG׮]w}Ը[/ҧ8n!nx7Aik)S""" z²zw6G� @� @� @� @� @� @� @� @� @� @� @� @_XQPӦMxEm8 .h׮]Qnݢժw…qgD z' <L+_Z֭[zqW7߼{hVyLQOF ر0tpEEf% @� @� @� @� @� @� @� @� @� @� @� @� Pe QQEo1RV&MbE) .ݻ3<+WΟI0KFSNqme]~8N;+s-B! PP" @� @� @� @� @� @� @� @� @� @� @� @�]y~\Uyٜg}6W7.1Z_~yt1|8uO=x'Gy1gΜJ-g}v\}qM7T.@Zm) @� @� @� @� @� @� @� @� @� @� @� @�Q`_v AB ѳgj~ѿ<R4yYN>뮻f͚O:x饗  MmY{l\{q= 7P[ *o @� @� @� @� @� @� @� @� @� @� @� @�C`QVr1[ɜcM67|3 jԨQ.v)ꠃBz-[,t{<#cРA?D:us΅5Y[o{G;oM.gnK Z @� @� @� @� @� @� @� @� @� @� @� @�VU`޼_F-#_R| /e]m۶c=6Md"{sEZoDƍ ^vq,TEq'cǎ-Ga\:,f͚1tcjsȵ@\SH� @� @� @� @� @� @� @� @� @� @� @� @i͟@2en7|3 ui⡇ 4_|GuT4k,?lOkoyTP!ׯ_ C]Ѯ]:u?SzQzx嗣[nYۖ[nY$- Ph  @� @� @� @� @� @� @� @� @� @� @� @�uٳz)Ŧ8 Fzji&իj_ j߾}[oŃ>˗/2{;6r¦_}wYOgSW\qEL0cY~wqo7tS\pg '(Zl @� @� @� @� @� @� @� @� @� @� @� @�W@֚9ۊ+ƝwC -24iku=ϟf]YǏ^ziTZ5}ѸcСŠJ7/r¦"' ,#w+'x"U'xb۱p¢裏΋*Ul)H믏 6ؠCS@V<W"@� @� @� @� @� @� @� @� @� @� @� @� P`Rgؒ%jw=^~4hPTT)6mVp 1nܸn1wܬ:* ܹsƌڵrʭs[uF\{mDÆE4l *kGO>$l)h_n)~cǎn-j֬jՊW_}5 Ӛ0aBq;UYrJxlm @� @� @� @� @� @� @� @� @� @� @� @�֞9B()+F u2eJqGs9Q�~7x#^|ѣG|wqA9sL J\9WD<@DFWۯ?z*tǏ:;0'kM7]$c̙ѿ,8+g926d8e˖Q~|^tK $c-"5m算/ Pk6 @� @� @� @� @� @� @� @� @� @� @� @� |nA"')tsƛo/Bt=&Ooy4h Ԯ];'llVky'|)<jѯ_:th,\0o,+zmܭ[ąF,XDtҪW,�z} IW^Yَ;UTRJ"|YhVZs1|l֤Iމr-c[@VEjH @� @� @� @� @� @� @� @� @� @� @� @�rr2}Rފ8�$kC`F߾}w}7M[;rg 6[/ʗ/e˖ٳgǬYO_7|ƍO?4RxWBhذa7xՖڴ;3#n-bg7ӧO­R�Y <xXtr~8Bt&뮻n:?M:SƤIĉ?3fdWX1ԩw>>鼵wsZy3� @� @� @� @� @� @� @� @� @� @� @� @�y"'�(g#;IaHXq ><ƌd?.њsµM6$ cJL[mUԨQ# y睳²֑ wѡCD<Q~^g5z°9, JRY J!ZS\\ҙ,:E\[neTZ5ҙN³r k@P#  @� @� @� @� @� @� @� @� @� @� @� @� Q6'e #r2B$PrHC9UvKy݈֭#"k".$r 6,ҧ~Aw̖B _Jl&#@� @� @� @� @� @� @� @� @� @� @� @� @D  *'_46gѠAD*qU4TI` d3j @� @� @� @� @� @� @� @� @� @� @� @�X=M7zF)Ν#.(t.]"7_S+�j @� @� @� @� @� @� @� @� @� @� @� @�X=6zFgErH'G{lĨQ´|S@V~j� @� @� @� @� @� @� @� @� @� @� @� @@ UBn{Μ"v=b# 7,*�e_ @� @� @� @� @� @� @� @� @� @� @� @� @@T<8 #OEn1n\č7FkQVJO>隆(f7; @� @� @� @� @� @� @� @� @� @� @� @�%A`m#$ iZE4lv#FD\z0xVj"<Z˓q� @� @� @� @� @� @� @� @� @� @� @� @�\ @3#O GskE<lD}(Zy� @� @� @� @� @� @� @� @� @� @� @� @@X`嗅<ECѣ#<0U#F8bQ["PBjM @� @� @� @� @� @� @� @� @� @� @� @�kR`m~]֚T6w믏U+bƌ"7C@Q([W; @� @� @� @� @� @� @� @� @� @� @� @�C|7U8ΣVĥNij-D~D2uEd *Ym @� @� @� @� @� @� @� @� @� @� @� @�֘@jcƬM\LS-b)1|fR%X ?ZL� @� @� @� @� @� @� @� @� @� @� @� @ZQ#bȵE…<qee˾}'Lml%{vO� @� @� @� @� @� @� @� @� @� @� @� @@~ @#k6t.5lѺuDF̙7ĝw{GIR@V<V"@� @� @� @� @� @� @� @� @� @� @� @� P1aB?V,>gG\}uDfExqG_|6j',% Pk)_ @� @� @� @� @� @� @� @� @� @� @�Sj��@�IDAT @�ȫ@923W^=b"';"ӢTR裏t'Pj9 @� @� @� @� @� @� @� @� @� @� @� @�'PZĺF*8ҤI'ѸqDZC矟={.]&lR\k,C2E� @� @� @� @� @� @� @� @� @� @� @� @�U(S&bj2\ paCE\~yG |sOS Vu%Ctئ] @� @� @� @� @� @� @� @� @� @� @� @� P1lXAd.ǑѶmęgFk?͛7 DVO@.jI @� @� @� @� @� @� @� @� @� @� @� @�r'Pn䮯^%S`֬ ɊS'b#n=B_=Zn}<SQ_e\(e� @� @� @� @� @� @� @� @� @� @� @� @�HZSD6 @^mFLq9YKWݩSڵk꫱[.7o+(1 @� @� @� @� @� @� @� @� @� @� @� @� @N_>�D曈%#+bȈ6m~5bĈ8/ƍ)�f @� @� @� @� @� @� @� @� @� @� @� @� @*VqZ^$`AGԨ1hPDϞݺET{Yfn%jժ:t}w(el� @� @� @� @� @� @� @� @� @� @� @� @�[7b_ւL`ذ֭# 袈뮋(_~E^p1a„:th-+ZgR(� @� @� @� @� @� @� @� @� @� @� @� @�%>`mnݵ-^eu+zg⡇N:Ŷn`}ւ@nI @� @� @� @� @� @� @� @� @� @� @� @�Y`}"NK{[@;FNn-8묳m۶q%J@V:n%@� @� @� @� @� @� @� @� @� @� @� @� ֍(_>ZV(_}qqG?EqJsFͣZjqwf_|q+\ODժUw Z%� @� @� @� @� @� @� @� @� @� @� @� @@ N{ *0ЂQFİa6ѹsDJ+}1bĈڵk٠cc=G$k̘1_F Ԍ @� @� @� @� @� @� @� @� @� @� @� @�J@S5!E\ziG|q!~={+ڶmO?⁧zjԪUkrqdZ[.,%@Uf @� @� @� @� @� @� @� @� @� @� @� @�g'zT3gFkG E^#g5m4{챘?R˔)em),@([vdC @� @� @� @� @� @� @� @� @� @� @� @�u}HHoѬZ/G$KkO?E<@DVJ-ٳg} YfE͚5M6q'GŊc1yx)gu^{xG޽{Gs*UZ<KI&{]vYl/2x≜u뮨W^|DZ`(W\o>ƔIСClvY|M,N<5jTt9RYg^x!}>8CSL;'tlh"va-�_Jz� @� @� @� @� @� @� @� @� @� @� @� @�#j?3em q1MFx`KEqƊôO{w++K.;DmfJ!ZrJV>:c…YV)5\?p;.n,0+w ĵ^<Hu=ׯpuƌ3{i '?9;}O^)kQ{Sh؋/G#Fdnj$m'NM4Y4_~+ @� @� @� @� @� @� @� @� @� @� @� @�Q /f>Nh??⮻"v?;̫A MQVPPDA%`KD%jYc1YwQc4 XB�A (*RQi3sΜ<7!Z{>`;lx+W^yeL0!h׮]d«-[׏C9$wlVZš;ju]ceYmԨQYcCe{·RUKF {ӧO>R:uȑ#jժť^_yw^Ԯ];N;Kڊ i͍5kƵ^˗/ϚӜL?Ok׮~S$@`Uʊ @� @� @� @� @� @� @� @� @� @� @� @�(3#ƈO?h̦֬5Vx( 81◿ꪈ56n4hP4i$veln§͛mϖBu~%m۶B-Z?p}ݻv-ˬiӦ󨣎®7o^SO;FݻwKfm<Hx�Xc?蠃;?n~۷ǧ~: K_JMK\i"@[ZZ( @� @� @� @� @� @� @� @� @� @� @� @� PݺEQhPqYe8…GQ6{iKΝ;7 W^60ly晱6D׮]cȑGݺujj^7q;i)Svmoƪ]V+tV^.,P+j@믿>t?gƤ00&}#o+,JKa_3fz\s5q%ozV_* @� @� @� @� @� @� @� @� @� @� @� @�( Z"9$b6sl 'h&"/bذMJlРA�3g7tS8p`l2;ʎ;=ӟ *\T]v,,JJZk^~Ukw!:vO8K.z*W^t;BFʕ+/z,5kOkXdI̙3gz@ p~ @� @� @� @� @� @� @� @� @� @� @� @�[P#" (,܂z2"⨣"&O8O6D RUW]]w]t%x㍨Uڋ-[Iݿַ?^{-ʍ .ȂN9/M4^zK/us1?i̞=;NvW^y% SN<[oSPP3f) @- @� @� @� @� @� @� @� @� @� @� @� @�GF̛1~[ě!re 7DwD q}mƤ7nJ ݻW\%wM.JJ[ 4Mf}׿fA[c>䓬^fΜեu֍z*,yqEi7|so^]ӧOϞkIAZՋ-ZdX=l+͟z… Uð}V߰aܹs>ѸqGqF:[nݢUVѱcl?|+o @� @� @� @� @� @� @� @� @� @� @� @� EB/SF8"~ˈߎ[$Gr!bŊ={v\zqǯ~߿EI^o7.N<,΋SfgyfL6-9眘4iRVwg㥗^ ^xaP?5k?qW^O>(훀Oڵ_~qGnnnVݳghӦM{ݲߞ?<qWfqm '1mu]YW Jꫯ׿u\veѶmo~�*\ @� @� @� @� @� @� @� @� @� @� @� @�Nଳ"> bȲLˈΈ}/;"v߽oǸ袋^Ȃ-Zgm )((?8ZhQָAяZj뮻f Yy…QV^zIc/yWKF͚5>mf/^nQn5J rRePW h6xZ$ҁ� @� @� @� @� @� @� @� @� @� @� @� @�<8#͙̉4(#2⦛"N?}sg\ &DNK.뮻nݝJQJ?H @� @� @� @� @� @� @� @� @� @� @� @�lX##W_"<s({#.(#=7#4(uҌK,>}ҥKcĉYyˬTg[I&vO rp.S @� @� @� @� @� @� @� @� @� @� @� @� @`-:u";,jRV0 mۈ3#F-׿hqI'E^^> , r @� @� @� @� @� @� @� @� @� @� @� @� @| qGWD̟QFceըQ?I\qeիWS:%0o^DÇGQVwS7h @� @� @� @� @� @� @� @� @� @� @� @�T| b∡C+Y "#uh<b„U޿/  @� @� @� @� @� @� @� @� @� @� @� @�lԡCsmŪ<Ѻuğ/U 0*̧Q @� @� @� @� @� @� @� @� @� @� @� @�[wϯ(6-#"8#"&O8S{"@jE- @� @� @� @� @� @� @� @� @� @� @� @�e,ЧOĜ9#FUx#?#ڵ;7"#^*THZ4 @� @� @� @� @� @� @� @� @� @� @� @�'G T^w/ⷿo"ƍ8S{"@jmH @� @� @� @� @� @� @� @� @� @� @� @�HO#h*8G=zD[ĉ_W1�J# P|J!@� @� @� @� @� @� @� @� @� @� @� @� PN>9b޼a?v֭#^z)'">Ex#@@EU= @� @� @� @� @� @� @� @� @� @� @� @�ѡCsٳ#n!b="~ z)S";,?8唈I"N:i+,l l%e @� @� @� @� @� @� @� @� @� @� @� @� x7!Z|99˖ZS Fw;;*@ � @� @� @� @� @� @� @� @� @� @� @� @@x睈ˈ-;7W֚qЈ /쳈"@@eU3 @� @� @� @� @� @� @� @� @� @� @� @�(G<qMQzĊl.?M`˿}ʥy".4⡇"?>bȐw"N@Uȩ tF @� @� @� @� @� @� @� @� @� @� @� @�; #&Lf05wSXt隵}cdp[G >+LkbZL*t @� @� @� @� @� @� @� @� @� @� @� @�P#6pcΊ8숕+>ĉ=zD'ELO *@e� @� @� @� @� @� @� @� @� @� @� @� @@9ors׿KV[Ϗ8؈ɓ#nӤ3DoƎ:uD� P*|eg$@� @� @� @� @� @� @� @� @� @� @� @� P+⠃"ֽre 'D̝MVAAD3fDomFzkoĘ1:F-*@� @� @� @� @� @� @� @� @� @� @� @� @@9^="5[wVe Ժ҈^HZW~~ıFyd~ELGH)&$@ O`L� @� @� @� @� @� @� @� @� @� @� @� @h0⥗"j\;@jjW[f݇ֈµ&Lꈧ&`lveTEZU;3 @� @� @� @� @� @� @� @� @� @� @� @�P`"~z ,[v]E7.sֿj"'bѢB�$ P*}mg%@� @� @� @� @� @� @� @� @� @� @� @� PN?<WLe Ԛ;7" V?ߪogD* @ Ԫ  @� @� @� @� @� @� @� @� @� @� @� @�|\G_vd+"z??"?_Ore1nܿ�UA@VUH� @� @� @� @� @� @� @� @� @� @� @� @ tS*CG²w}"O>  Pu"@� @� @� @� @� @� @� @� @� @� @� @� @cW_Œ%K"խ<['…u+@3wDnnnɝWT{*5kFZv%U˩mۢdzEN:¸?alQ֪UġFtݦMDjkQC�& P}q%@� @� @� @� @� @� @� @� @� @� @� @� P ˜?~̚5+Ν+yЬ/Jޗ'IcvUtUQXx :4WV0Vq8֪Y+VXoVq Wz.]4 Z5+]ߕuo;܍7&MG5ͦ,*W-Snݾ :蠈 ַzTmZU;= @� @� @� @� @� @� @� @� @� @� @� @�(((>(꣘1cF|'1s駟f!Zs̉NU|DÆ KR9KifAT)j+ JAZ)8kk̘ΝXjV ZxqIت`M>=m2o=v*SPv4kqnEoeE.Ѳe˨[w~"cG51ZZQrca> @� @� @� @� @� @� @� @� @� @� @� @� A+VĴibԩ3f!Z˗/HAY)y%wӦMcvSێ;5* ຕC}Ia[)h7 ?+ 8 &Kadw *K- jZw߽c="ݵk׮\EEÇGQe]&U&&!@� @� @� @� @� @� @� @� @� @� @� @� P>R0ɓwߍ &ĤI> V\mr/ smݢe˖ݢEy#//|좠 f͚}Q=}PԖ¹UɿuѦMh۶mk.gA[wUG@V鿵@I� @� @� @� @� @� @� @� @� @� @� @� @;XhQ[oFL+V,4+2{=z}K,Sfgۥ0{/˖-Hgt!{pѨQo'Q"@*Uz;#  @� @� @� @� @� @� @� @� @� @� @� @�l5˜4iR5*ƌ'NhРAԾ}HwvM6QF? ʕ+ &;͚5+[(lu9>컧5߭@ * @� @� @� @� @� @� @� @� @� @� @� @�@ zw{1"^}ϣvqFNcǎٳe˖[l&._gώ_=Ǝ=Sڂ N:ѥK޽{3]啯 * PYV$@� @� @� @� @� @� @� @� @� @� @� @� Ps̉_|1^x,HkѰaѣGt->ze*@ ^{bԨQYڰaO?uf>:9hժU=@JjH @� @� @� @� @� @� @� @� @� @� @� @�-0iҤ<xp<31nܸYft=:ٳgQZ^UG`ԩ^~2dH|ѺuիW;:u7Uu~Nj\V$@� @� @� @� @� @� @� @� @� @� @� @� P*iӦţ>ɓ'G㏏q衇fZ kѣ[߾}N:1+# PzJog$ @� @� @� @� @� @� @� @� @� @� @� @�Xxq 4(,EѧO>7z l?xvѦM8s_~;l P$ P?Z3� @� @� @� @� @� @� @� @� @� @� @� @Nv[<QZ,@묳Ί>xcu %&Lӟ?<N>⋣cǎ[rYsJysJ?H @� @� @� @� @� @� @� @� @� @� @� @�'[o '{W92nƘ5kV}´և~ m6nObSNѽ{Ub1 @� @� @� @� @� @� @� @� @� @� @� @� P~;8ꫯbȐ!µ;H]vd*e#'xb :4Ə͛7Y?Y,؀@ �i&@� @� @� @� @� @� @� @� @� @� @� @� 1)<K.}',XZKѳgύr!~ţ>'N̂98ScΜ9b6A@Uy @� @� @� @� @� @� @� @� @� @� @� @�l%#FdAZ'|2 tVZ2^`=AŨQbʔ)ѦM,hW2#@� @� @� @� @� @� @� @� @� @� @� @� @`3 ={>:&Nzڌ %PR0믿]vYuYqNJ+&�J! PR|F @� @� @� @� @� @� @� @� @� @� @� @�qyu];3j׮ŷQXXx{[|u-0{O+b]]ʬnCE߾}Ae6&9sf;HAiorssꫯW^y%{8c"}R@VYj� @� @� @� @� @� @� @� @� @� @� @� @g?<'|V;w zwc[1cF=:_|]~…lٲxb[t4ܹscԨQ%7yvV.]Ę1cbڴiq '+q�, Pk+[� @� @� @� @� @� @� @� @� @� @� @� @ {qw?;wު͍SƤI"'gǏt).䒭rMƹ[*u!뗭7JfJĵ)|}[hȍ7.z;'@ lU"<G!@� @� @� @� @� @� @� @� @� @� @� @�zϏ__:u�ԯ_?ndh^^V]{kWRV؃^}1lذ(,,!_V"|oVs8K`|n @� @� @� @� @� @� @� @� @� @� @� @�lu֍K/tǖŀ:#<O>dƸq⩧:u1cʔ)qgg-;`;vlVNa\q}zڗ.]cёw}ߢiӦY_PP5zѽ{3D̙:t+"Zeq=1yy裏}L_O<JѩSswJoFիG-jժw3iyu9Dͳ}q%c;v?cq7F:餓aÆ1hР̶e˖cG}w\\y-dKZqgNw @`sjm @� @� @� @� @� @� @� @� @� @� @� @�UJg>}D5͛]vY<裱r(,,'faW?PoV$պuHaN)Ȫk׮Y_*, z7C=4va~ .N;-x5ަMO /0 J}9rdWL4).,x+VZkNI)/u8Sl{x:ujt%]l��@�IDAT-Z>`֞ʇvX4i$ '={v{Yۦj+\bΖBRW3p]w55jcƌƹɾAYW Ka{Μ93;WЖ\?K.$-)!"JY� @� @� @� @� @� @� @� @� @� @� @� @� L2% K@-ҜB?E ]*{x衇4z,0 ^}լ-777nƬ\8^ Gydo>k+c„ Bڵkh=`8cY?)ЫgϞYVZ3Hk1`lo|p%ϱ> rя~EqG'߯:KT^=Ӟ{U??1nܸ̥~9~v9֭d0ռy,lƌ% 2$=s馛uf߰f͚q]weZ[ҲdS(аŋg}Vц @`uZ{x#@� @� @� @� @� @� @� @� @� @� @� @� PjԨkժ0m6+t͝;7{?rH~K/s=qd4hP4i$ *t-wԩYVqرcK.q-D޽?YNkn_wS_yXtitA =裳G2y"c…qG'|R2;f͚eA[ŕ:uʊժU+cR_+W[o5'%:*{/^)x| ӧOͶFNGlaZ[ @� @� @� @� @� @� @� @� @� @� @� @�K`wy*77w{Oqwg}ovwqYhѢY=$///:wyKM)++.L2%nx7JI&Ŵi//Vg#]k3x7n!wuԉ֭[gO:Z*KPjxYט??ׯy'Gy$8X)^b]w͊ ,-iY^i'צMf1XM`� @� @� @� @� @� @� @� @� @� @� @� @�5z?x,[lͦ ~gO)뮻3<3R`V4hgΜji֬Y;ԟ}qaŠA[o-Oڵkga[) j?\jwaڸU}_|1sm)|<nܸ2 Ԫ[n\xᅙENZguV>WHcc=ߘ|09昒ƌч�> @� @� @� @� @� @� @� @� @� @� @� @�!ӟ4-Z7x:ZU JNf͊7ql:No>{1bDI}*QVT>hNqeSuvӿ(,,,^{-ʒ:w [SC׮]cYG 6W%{i޼yV_Ǫ\+Wdύ´RWU?5jW_ٺuUYNKk׮|KXs|gbԨQ-7b)]"ȇvL @� @� @� @� @� @� @� @� @� @� @� @�~o_W1rȲtgYpa6bƌs/,??K ^xa�YhSq}ztMYmK.͚\'O*4hz)LkN<x??֭O=TyqwE]vZu?}Ys޼yc?<OgO/F>W\qElvYc==\fo駟w}7:s9YXq)0jȐ!Yyc4m4 {' KFgyfX">U CŋgUO<D̙3'K 9+KU,m?~_DJ;qXM@j^ @� @� @� @� @� @� @� @� @� @� @� @�lX 0wyqqŘ1c6<z�N:)ylO?=}ٸ &k5\ 4( xZu {gqdܭ[lΏ>(t\rI^S@t`Ըqh޼y;fP5^z)RT Jc׿͚5oϧ~|7.BN9я~guV5v1bDΗRW J^rKĵ^n]veqǬY٢E^{5jKs{ѦMTHZjՊ}V_dɒok׮wgqF\l3}={ '@@@¢M� @� @� @� @� @� @� @� @� @� @� @� @�(((}xOިqS jРA=ǤIbѢEƶnnK(|Aή68z:|1a„e]UVkZpaUܰ{_|y̜93Uk.g] 6\kfAh>jmoFB~ٳcwYc˖\s5G?]vYZ:u@(+ ><G*ϱI�y[g @� @� @� @� @� @� @� @� @� @� @� @�2#Dz=nR1} }ZuѶmUJUNT) j??gYz. Zݚ/5* YjMckԶ6d1W =ni+`kҥqO<QҶBۺWw}[ծk㬳Rz-y wl @� @� @� @� @� @� @� @� @� @� @� @�ꪫ~ŋ/rKիl&ij{ѺuyZj-ݸ9{\lYi&.\׏vŁ֖?O?]<T=:.裏N;<lՊR!s$ @� @� @� @� @� @� @� @� @� @� @� @�[K૯k&n8CbqAmSR,L=bȑѹsx駣I&2ɓ'G ۷o\Ѹq}/~{~'O>.vqb+$P͋ÇG*ֿ ?  @� @� @� @� @� @� @� @� @� @� @� @�T&)S/xg#+2zY, ֶvuXti{ի~noz=Y 7]v * P_.C$@� @� @� @� @� @� @� @� @� @� @� @� @`M+~x7 ?<cɒ%kv^]fHZʕ+㩧ʂڷo3gΌ^x!F%L $PEjU @� @� @� @� @� @� @� @� @� @� @� @�[VC1x2eJt-.hҤIwyYPі]6,0a„cwSO=5};6FGqĆ'Ѓ�e(P*LE� @� @� @� @� @� @� @� @� @� @� @� @:/^ {'F-Z>}d?xvѦM8s_~;f$P͋h8b=76p @� @� @� @� @� @� @� @� @� @� @� @�*0mڴxGc1yh޼yݣ(f͚:)g}ַo8SX8N@V(Z3� @� @� @� @� @� @� @� @� @� @� @� @f L81~xgbܸqYV㨣={ƾժUuLPuR`СC_!Cė_~[^zE޽SN~SU[Y@VjH @� @� @� @� @� @� @� @� @� @� @� @�e*0gΜx^1hԨQt|Ѿ}^zk+PXX^5*^}6lX|Qn7?ҽ뮻VC9 $ PKV$@� @� @� @� @� @� @� @� @� @� @� @� RP;3k1" KϣvqFNcǎٳe˖[l&._gώ_=Ǝ=nj ,:uD.]={fy!Pj# * @� @� @� @� @� @� @� @� @� @� @� @�@ ؚ4iR5*RR'NѠA}ݮ]hӦMԨQcBe+rʘ:ujL0!ƏoV̚5+[hvΝ;gw׮][0, PkJ*P @� @� @� @� @� @� @� @� @� @� @� @� P-Z)d7,yN2%VX)\iw}'Zn]rQ^uJ%KdYM<9SPZ*/[,rrrb]w:t>QFXT\ZvJog$ @� @� @� @� @� @� @� @� @� @� @� @�r'|,wߍ &ĤI{rʢj6m>vmhٲeݼy+w窨*((YfG}Tro1mڴNmQZhѢE|֦Mh۶mk. D]vE=}rJjH @� @� @� @� @� @� @� @� @� @� @� @�F`qsży5=~a|'ҕM4U|7m4vi>ѨQo(㍦ Ĝ9s5{O?LgΜX"[=7775kZv}{DgG2@@VjH @� @� @� @� @� @� @� @� @� @� @� @�B#0!G?#ZvYG}3f( JA[)*Eਕ+W J[)Tkv DW׬[nԪU+ Jի̷ dɒ믳ŋ/( #_#Yvy.yQGVUzlZ3� @� @� @� @� @� @� @� @� @� @� @� @@1"⪫"^{-w뮋{m0 ={v̝;7W JaS Z|zLRk^-d8h+777R{zNA`)N_g+ZIlize`kƍN;;cVUB@V?I� @� @� @� @� @� @� @� @� @wqN?b$6lCR6)h*ښEVkm Čw~seOI^^׹99s @� @� @@/9ےo|#yd fm-ZJԌ%j\g}aÆUVl)c c?:P h[JHW9'wE/ܳpt2 %7  @� @� @� @� @� @� @� @� @� @� @� @�sY`S.KV[-9dfOVZ)ydug_|lE2dHҧOҡì><ߕ0sn9sʹ"@� @� @� @� @� @� @� @� @� @� @� @� @ ~z'}M3LՍoYv[nIN;3W/ 0JM @� @� @� @� @� @� @� @� @� @� @� @� NUVI:+9WKZ6dѣ.WUz[jg䮻Nkpl@hMV_;$@� @� @� @� @� @� @� @� @� @� @� @�h}&nwII'%7}UԊ$E4}G3$@@CՐVX @� @� @� @� @� @� @� @� @� @� @� @�LC`'päe-}'?!Yti4lBj!g_w @fO^� @� @� @� @� @� @� @� @� @� @� @� @�(!R矟rr=5$GҥxՍ{Vg]zɐ!z%@� jM� @� @� @� @� @� @� @� @� @� @� @� @@xdK<2yd0؀JX9fWV۶-$|W2fK�O@3 @� @� @� @� @� @� @� @� @� @� @� @�Y4(c5YdOOwmgwVZbZޛrJ'34xZ ~ � @� @� @� @� @� @� @� @� @� @� @� @9 \uUWw_Qb9 j9W6$袤G['fOW7P= @� @� @� @� @� @� @� @� @� @� @� @�holm3z1}r!5OVmjtL>8gg  @`1 @� @� @� @� @� @� @� @� @� @� @� @�9!PB;/YcNvt萜sΙsG*odݓ @j4Ke @� @� @� @� @� @� @� @� @� @� @� @�MU瓮]O~_{Ypgz^s:PMgdذd=~ @�V@W7 @� @� @� @� @� @� @� @� @� @� @� @�-P<3YoE䩧N#8$[ou-D`\V9-$ߟg I̢@Yl9 @� @� @� @� @� @� @� @� @� @� @� @�3!п>cCzH>:)Q/>L<5vpF%$]$~6K 98' @� @� @� @� @� @� @� @� @� @� @� @�1cC^;><79رaZ ȩN8!+rÞ\ݸ@6m ? y9~o$@@STWּ @� @� @� @� @� @� @� @� @� @� @� @�l}rG'}$0=Xb%rYjqZ[Ohw^ҥKҽ{s^B�&/ P/  @� @� @� @� @� @� @� @� @� @� @� @�4J^;yᇓOOڴrdv[zꕋ/8ڵIjj5ɣ9RP֭g/wOk�MZ@V^^#@� @� @� @� @� @� @� @� @� @� @� @�#F$|7<TF>G=3l̈́M"PZx,hrC%'0G_ehsgI @� @� @� @� @� @� @� @� @� @� @� @�Jdݒ_N*gÜvi:th9WP:@C*ZK %u �f@@ `J� @� @� @� @� @� @� @� @� @� @� @� @`zzJ7Yq䩧V|{.w^.,bt# $yq߾'%k5P @t z @� @� @� @� @� @� @� @� @� @� @� @� 0G''Sn#L9Lk̘19Cz堃U)F5@2sM6 =48 @`FHN[} @� @� @� @� @� @� @� @� @� @� @� @� OwO~8d>.,}I߾}Ӳe˩W^j|sɮ&wߝjU?\ 0 N* @� @� @� @� @� @� @� @� @� @� @� @�%Pz%<ȴô>owqя~^{Z{>@ jfp"ɭ S-�fP@ N� @� @� @� @� @� @� @� @� @� @� @� @`b[nI6<Yuդk5&?c2N @֭Ze<%sI~ K  hj5ڥ3p @� @� @� @� @� @� @� @� @� @� @� @� УG.~%wݕt4Q=sTZn 5Pq89gk@xF� @� @� @� @� @� @� @� @� @� @� @� @` #F${Ʌ&]j55<C~7ݻwCcɪZ_.ƌ:p14@2N6$M>p{+ώ{slfw}O̎�&,к  @� @� @� @� @� @� @� @� @� @� @� @�CvJ|2_׿΀r=TF-Z曹ꪫ2hРlԬs=mۦ\lruhZ%XOv5@ [giY~[C ɸ6sMՕW^?;wλロ~8^{mwc^)D`wi&ЦI� @� @� @� @� @� @� @� @� @� @� @� 4{/b䥗}´^{q9Sm&G`w߬ U-W_UFHڴipT hᅓ^GM=vGsdUWMNC=Tw޽{K�+ Pkz#@� @� @� @� @� @� @� @� @� @� @� @�hlI2lX#`aVZ)GuTN<<3fL}'#YXpӡCYm:rdҶWmu/O??e˖%s>l`:wO>~j Z7{� @� @� @� @� @� @� @� @� @� @� @� @�C駓KVX!dᅧh袋c?Zk4t}w9S_K/=zw+̽ޛ_>/b?6<LX`~Fw] rt~.”`[//bUgZ~?͈#6,sL|M֭? ;sצgϞUn <cno~~zJ9.]TرcY(CnfVzsmw=79dRzu?e]wu袋V '8,t\.ou]7~aZh1A *N妬׾ j.e7n 05ZS� @� @� @� @� @� @� @� @� @� @� @� @@Mo}+Y/Iw, ʖ[nEY F:thvm_wtڵ *T/roo~z묱UU EzwSBQv'?;쐓N:6oUZuuUu~|Gy뭷�U;,9CV[U[6e짞zj5O>${lJ%i̘1UG}4x`^y*4̫u :䓫@K/-ܒkdϵpm;b&;<dj{c){emϊyq.wJ{K.馛V_}믿>e/uYׯ_m~qk\px%x%c/ RuwLIE2S� @� @� @� @� @� @� @� @� @� @� @� @@3xM-x*]c\ofe*w޽,UTZl}-?pU,>|x\N:mZ&l%X *e%롇o~yꩧҥK*(OUW]Uoe<L袋h yWӱcR%mQ%Ynݺ ٳgUgL޽1wqU_גJ`SΝo}\z9蠃YSu_ ^lZZVDmk±Jڸb?`;9'[<@J+矯_6.X?Q EϪOm:L:J8oWJ9KڒK.9Q+$Ҕ[lѴUn2?_+G� @� @� @� @� @� @� @� @� @� @� @� @q }wR˯&if3fLn*j\O<n-%D_BJU9Zh1^{5X#W%[o5%Ī`cU�V˖-y晧>ĨypUugc}V *AKӟrꫯNnôJvmUӺ[v}8:딪UƴN;UO q*!]C /ZWsVzmkh+S p e±ƅi%\O+_zo*ܬj=#V%?Gk6}Ԧч 6?˞xsYg妛n߇qO� Ԛ2 @� @� @� @� @� @� @� @� @� @� @� @�f/p]B%\vYҪմI*cǎU,ug-+VojzlH \zWG'|r-4hDܹsvaq߿522+ Ժ⋫)t]ysUWewvmWi?yӡC<SbʄZ+dݒK-Kz +aie9p ָ:Fmq{_-T%k\[ك>*V<jO@SU  Z6 @� @� @� @� @� @� @� @� @� @� @� @�0T"cy睔^z^?ϜqU-X}_ q1V5xIj6 \I* 9~>}OC= /0g}vڵk_rMFUnm9crf]vBZk*mo[n)ZmL˹ߦE.됬zjcԶmZȑ#kryo ֲ.[?Z.k?Ԏ~8lMu=i xf[ߪʃ̶{vA4I](i� @� @� @� @� @� @� @� @� @� @� @� @@3ߒݓ|tUxJ(:SI0O>9?Oꪫ'L럗0BT©Xa2o2Rse}o=h%1{8p`viP'US��@�IDATü{5]Vs*\ I'1cw#㎫ZTzVzmK[ meWUǒK.}ksup\P|PoyoZճo:e}RifS=zs ZmrWeO ;] @`j @� @� @� @� @� @� @� @� @� @� @� @@[d睓+LZDG *aYvZ^x`z+ 'Z2-J%ZjW\_| /*KѸ|#< ڢtꩧVX_׳re 6rZ&UJPS *z6lt!իCVJۋ.*ԩS6h\{-ܒ.\rI;9&{f FHڴ MW_k|%xj~Wp@*_z[^xa^՝xo~YtEӻw}?)=X s9 >*{O߾}z\c=eYJWSL@?/c: @� @� @� @� @� @� @� @� @� @� @� @�@-o(F&\j5,H/gwߞ+'|r`Uz몲r}QGeȐ!+SWW 70^{m<\uUezB=%_ hj=ܳ YKiZiЬ4{eM7B'ڤ}wZ>¿6x*H;qfm~]VmK?߯%E.[w{V.65Kgi~\So~~UUb[ֹe/\jR<'}ٔ@֪Q%xky\ *SG{\veR_~9++'Ja-.>r3 PkT%@� @� @� @� @� @� @� @� @� @� @� @�hlefG%[<?j` r)O>ZkoN?*`SN<V~gV ,0</^xG>,;v/3<TYm۶qmƌ^{ *b=RcCfжgd]/Oj9WQ֢`-2x6XG^zi{/feߕ5}k!?YGu@5[@iI� @� @� @� @� @� @� @� @� @� @� @� ^}5S JԂfmR'pB.*h%δ@׮';Ǎ塇6jt7`5 ^ @� @� @� @� @� @� @� @� @� @� @� @�h23lmmz /s9'=z0ٷMFHڶ}d뭓wN{oN 0j5u0  @� @� @� @� @� @� @� @� @� @� @� @�9,7,@r]�ƌC=4#G-Z8'c˒5G jf;i@O<lE-훝KR�h= @� @� @� @� @� @� @� @� @� @� @� @�hrÇ'ݺ%|<hҩӬOqС9#s{k=</HڵnLկҪUqnzr fx<^zM_@V_c3$@� @� @� @� @� @� @� @� @� @� @� @�O.c޽,\v1, 4@2=ze˖/{M*TkzV=@fN� @� @� @� @� @� @� @� @� @� @� @�huWjEj5KF?UOB~suYc&~L�% PkT"@� @� @� @� @� @� @� @� @� @� @� @�h UrIϞf5594@vZ-TUN=l}];8K,<٬ h^z- @� @� @� @� @� @� @� @� @� @� @� @ |sroSehoʁZe~S2rdqh6tt-T밴m$$ 0EZS� @� @� @� @� @� @� @� @� @� @� @� @OrG4Y5y4@grgõ @@hلfj @� @� @� @� @� @� @� @� @� @� @� @�In6$ ]>iNG99gA�F,к  @� @� @� @� @� @� @� @� @� @� @� @�LU`ȐN\2ᆤUV|A6@2?,Ⱦ9Eҵk馍` �3! Pk&4!@� @� @� @� @� @� @� @� @� @� @� @�h8c$-ZL:dݓO:J@s *+tYW?ydߺ1%rZ<'@� @� @� @� @� @� @� @� @� @� @� @� А8 IGxq$*hR[J`W' .|{8ƻFN�IjMj� @� @� @� @� @� @� @� @� @� @� @� @|Yr}t2j؁Og'Cᆍd29]¤ڵMRI^/'6ƌ'}�C@VX'$@� @� @� @� @� @� @� @� @� @� @� @�w&#G}&_zR:(OL#EZjE[ek+L~/O}o/] @1 jLe @� @� @� @� @� @� @� @� @� @� @� @�xc? uuɓO&~əgNPMh΁Ze ӒJd;HZJ,i j5%7a @� @� @� @� @� @� @� @� @� @� @� @@6,d/3jT2bDҧOr_j:=P~66XG?Ip5~'ʛ M]@VS_a#@� @� @� @� @� @� @� @� @� @� @� @�4QU³&>1cOuK ,0|ѷoߘg1kco"Y{g>5Ǐ>JܝO4Zg� @� @� @� @� @� @� @� @� @� @� @� @`<nHZN%}j~{ҥK;5t٨>|癧QOc_v99qen\s%  8/qL(  @� @� @� @� @� @� @� @� @� @� @� @�aɝw&GOy%XCH^z<i\Ços zdn55*34: j5U1& @� @� @� @� @� @� @� @� @� @� @� @� 0#&_Eݻ''{9zJ@ *k_nkWcu<%@@CVx @� @� @� @� @� @� @� @� @� @� @� @�)pIVVk:Yx/In9YdI(ik׸0?ᇓVJZN%y|7zfߢT~΀� @� @� @� @� @� @� @� @� @� @� @� @ K#5Z…'yդ[/jZÇ'79lvM{.#i6)!rG'k2xO @ jkcd @� @� @� @� @� @� @� @� @� @� @� @�(AA#F|Ud˓| |y2<Mo^326mOKrl-&졮.  @! jȫcl @� @� @� @� @� @� @� @� @� @� @� @�xcRƒJV<∱B[o=IUMP`}&8r%ݗpCҩSҺ޻#@@CՐW @� @� @� @� @� @� @� @� @� @� @� @�&ۓdGM;/w ie3OLLm]^K8`l6W#{';jB� 0Q&\W @� @� @� @� @� @� @� @� @� @� @� @�4#GfРA',e~i >lJGQFMr]ZhVğ֭[O9~Y۶mk!YV|W_ψdMȶɓO.X Z(:uB }YK'0|xҾ}ӛ׬ΨcK}M?/3&>bĈ;ys''و,r]>w|7٦M|?׾,YfeswxV=M[ŘѴhv @� @� @� @� @� @� @� @� @� @� @� @�-W!:׿Rw}73pꔠSr١CɆ\|UO-(<+q%tk\ָ˾ Bƅxok\gȐ!U{ Z`"d?Xb,Rg )ss4(7ݻyNt/|7kKy_OvЫE]t@]?4kuNU&ߜS^xᬲ*Ymղ.sVOkLbu޺Ȅ @� @� @� @� @� @� @� @� @� @� @� @�L`Сyҿ_ϛoz+ov^/2<J;7`꺄Nuԩ>XL矿mù8pb0qϠA�Vξ(TΑ#GQ]vsVH9W\q,i߾}}]s_l6vGgy&=XS}߃r,Kjqcvr-eY&;w,Z k^fG0*I%_L^RBQ6xlF_͞�,Т}LC @� @� @� @� @� @� @� @� @� @� @� @�8p`ׯ_/WaQF )AY% 甐S>^zق .9K\G}Tqc峄0?r*pUW*V[-kFV_};[i}ZNSn}!||駟BJ +T\wu2O>)Z a_|Ǟ}*ݵm6]v7lv<fwחrE`JV\-.fbkN=jNm @� @� @� @� @� @� @� @� @� @� @� @@(O%0穧O?]?CJS v*OΕW^ j߾}cC'+TkQ֣K6lX5R:T?%K.UxYC[cwRLfl?xnr-U\ǎV[em6l؃~<-%DpEɎ;]wݵoVf NmsX@̃ Ԛy;-  @� @� @� @� @� @� @� @� @� @� @� @�_A#Tg y'2tдn:jT\sͬYjdo^ȳ>gy:_ZӘ,p sM7Fmo_uKjrӟX<(AnW\qEn馼Ya.[ 쳦.UO=\ZxU` y睳f7n2l"MK@̯@Ӓ� @� @� @� @� @� @� @� @� @� @� @� 0S6x^z cZy啫� 6 ,!Z3LC9+P[@{,NVq-V[m7< ,\{7ZTrMlbΨQҫW\|Ź2d=]wݦ9Uӳg\{yS,=BO9' Pkjͼ @� @� @� @� @� @� @� @� @� @� @� @�9rd~u]sϥe˖ҥKrlfڵk^xO!0`j{|0/B~ziѢEPeR K; +k!a7Mv!|pWKGy馛Ү]~9өS/+"0j<@Ӓ� @� @� @� @� @� @� @� @� @� @� @� 0EO>$_ӫW*HkȐ!YuUvUoX`=hz~x{;dOnҽ{l6i۶mӛW<uIG] ҺK_:w⠃1Ν;ϥ5~~??#FȑG)X,_@_ZZ3o% @� @� @� @� @� @� @� @� @� @� @� @`/"~{ny=ztr*0;Nkn?n3}Iǎ}/[ղe 4ٯrI'MB#*馛$}Q;{YtE P?\|93rȜz꩕g֭�Y Ԛ5vZ @� @� @� @� @� @� @� @� @� @� @� @�*~:_~y`m6w1 . %xwӳgϔGy$K-T-4jY~پ9UXzcj~뭷r!:Z;1CN\5\3]vYt0gF@/əӒ� @� @� @� @� @� @� @� @� @� @� @�hF_]V-%SOͿyU0fAfpK.d<;Z<*mVw{3cӭ>lX2-w~^{mZk 0 =P%@1:t9眓رc6xy晩@l5ۉ� @� @� @� @� @� @� @� @� @� @� @�hJÇ~o*O>yꩧ@EY)M\r-SN9 *l-Zou]77tSjZ#Ga+p@7|.찦V[-~TA%nMfH j h @� @� @� @� @� @� @� @� @� @� @� @W\W^9'xbsϼ曹+ΙAxKum_~>{ォ`0_|;o'|v!\sMn֜{i׮]D#m?N޽f6ˀ, @ռl  @� @� @� @� @� @� @� @� @� @� @� @�xDzO 4*AZ=z/>iB`Jۥ^W^y%lAuV4;k- ;U´n ?ݻ7h|C/ߗ>}UV|[o5I1f" P,i @� @� @� @� @� @� @� @� @� @� @� @�3._cͦnh/WAZ -Ќw@`ee]z*~iZk\p3fW{ǎj9 zCenMpK.dxn6hР&8KS"j554 @� @� @� @� @� @� @� @� @� @� @� @`6[dMrצW^ҹs&]qT>p ֭[:5Æpc :O䮻J+ȴp;uTÈ#뮻iMl4ZM`M� @� @� @� @� @� @� @� @� @� @� @waZT߀HUQT QAAlDأbנĂ/c%-FEQ tx3d7 ؅-a晙3 @l}رc4l0Ph@ԨQ#N=:th|駱Ƿ~[-W&*S3<rK/jZF֬YxG^/hJrԪ(  @� @� @� @� @� @� @� @� @� @� @� @�$n{ :묤uC`b2dH4n8ve0a5T jU@9siGqDz衕@ qm.(?T�TʹԪ*O< @� @� @� @� @� @� @� @� @� @� @� @�8qbpѵkxbV[6˪ USQm٠4BM6{.Xc8蠃bܹ+^E\YǏkfS.V:R:ݻw5?i)W"@`U ZU%@� @� @� @� @� @� @� @� @� @� @� @�*gu´j֬8/b\ze`}ceҞF*@Æ #F !QY׿o~hѢ`)裬wY~{ Yԩg}v{SKUe@WuO� @� @� @� @� @� @� @� @� @� @� @�R?~[~t,;;vlѣ.xc…q\E6`,|ꫯ)STYo?- G}Y|qGZy(]ߞϦO Z֪'@jf  @� @� @� @� @� @� @� @� @� @� @� @�%p]wV[m{JW_}b}ݻǹ瞛?Ν;w}?x1lذڐ!CwѥK㩧*y駟>8R(Njo}O?=RR*oO>uJ:H\qqnƬĉ㢋._WqGs=={{=vX̝;gwb֬Yquš .oJQs )yz9{ٳJ~SN-hXpJ:8䓳+Ǖ͌E孼>_=֭;V-?uvZS=y;#Hu1c~2Y/oOI,i (j~%כ5km۶*@1 @� @� @� @� @� @� @� @� @� @� @� @�ZW_}5{U2tdz>P) >:ZloF.ѯ_իW5bĈ/sL<\ƍ}뮻fmF;.LK&*Ey饗պu3gNGnݲ~e!])'�Tx8Sn!}'F ޹K1EѵkXkvM=zo= i{ "kѢE}7ϳ:+Rk92ӣ>nfYs,rkz?;}I'Cɔՠ4=:Ua|Hkg9Y]ZەRՒ;}O#mvӧg뱨w>}{J3?i �ZXeM6ɲs?#P|* @� @� @� @� @� @� @� @� @� @� @� @r p_zرYHS~N qq4k,jx6¤ҹƂ b-ڵkG ?~TRU.]ntҵbkD5:uS?[K!V)'O9眓ճglW]uUE]'LOpYO {:b7Ϯ/?w^|GqwgsOZsOL2% KA_E= T{in)�,OE\qϱ~z KtU+3fT@SFƍ˅>լY3nݺq饗fw\3gΌgA|Z�R)Oߘ}{J%S,{QJv.7i$-We(s!,!j� @� @� @� @� @� @� @� @� @� @� @� P)&ҲeHaY)ꫯ/<z衟 #`tonbmqgRzetPӡCKYVR䷗RO l>}z<cYxP J%{j*s֬Y\RW׮]4j(T #<뮻n_sѠAOd?֥=^Q|Ugҝ\{SXPyzZLjWسJ#Q~lo>nHAuڵ[ߊ`ID Kkz-Q1?,K(v/:u,s=(ӬV  @� @� @� @� @� @� @� @� @� @� @� @�K  2d:/Yg;bM7'xg(jSv2eJt1YsQ,E^^Ϯng8F}ówߍ>,ҵ,4bĈ<"ǑVZSN߳+j_TQFEÆ ;rl{BJ귬ϧw9U2rP{V)\/(A~qƘ1c}'R(T^{k]v%FznݺY]:QzY*ci(}(rN嗋-W#* PfʌRC @� @� @� @� @� @� @� @� @� @� @� @@e޽{ 4(ƎR1~ߏ=zĴic^ziq0`@s ',Vq)? ˥>U~aÆO?&L(8?tЂ9hҤI𬯿gϨyY͚5[KU'5=dI<}K-?||Wq衇G\(*Bo1iҤOKwYo7o^}GzӳN߮¥Na=\MIߖȷ,p{Ro{K(lwyϞ=;~HK!@bԪ( @� @� @� @� @� @� @� @� @� @� @� @�U,p!&l{^#IaLsN]w ,<G~M /W_}utgf̘.\K^ I5+ZZj 7Z=nAsiG}t7.3M^~|PďԮ]ꫯ]Çz\_bO>QyȐ!qyEIϱQb3s̉qAE6mJݐ^ *;ukf໲.vZ?>wW^~!j3 s=iӦ={Q.jKuoiΗ{QJOiygc̙(gZ y @� @� @� @� @� @� @� @� @� @� @� @rE߾}#~+uЏ<H:wilzegy&Rp_j]tEYh矟:th<ĉ_|I0կ_1bDbKk/\yY@W.]K/׹shcǎqGFcѫWx VlKB~n5kVvرcO> . 4i[XUN5X#}kwSO=z_򗬩*s)-$XRV.íB>S\,) [nɚLY)k-ƍg\ߓ'O?Oƅ^N6{,>(_ڷsYZ^4_nHAc-Z(!@`%Z Ⱥ @� @� @� @� @� @� @� @� @� @� @h_��@�IDAT� @�*;7xc~‘VVI!238#=~vX}6mb~;~_gaN}f͚ŝwޙmlYhU 9#_³MTrJ|DZ_*rSO]W{!<)D+1#tteŹm۶/<?<CѨQ,xC)SĖ[nYdE]HA])0l̘1;d]{Gd`b^T狛k 4(K!gw}w4o<kGy q߿ʳU?F4h*z^>Sل [o]%ܝRXZZGiݍ7.Ԭ(fI!})*PKBZK0`IߋWRseP85rg8FB� @� @� @� @� @� @� @� @� @� @� @�XW_}u\x?9>rP 7o^0o&6x,p鞱clPpmܹg6zI&e4mtח䏹>,Zj,F_|lIŶnN̚5+ԩNV#Gӧgac VbRϳPR8Y*yNj.&7~8W]u".rl{it)<뮋?[e1^֭~mԮ];~_٥iӦEÆ ]w%YY4[ UJszsv+58Vq\~]v]Tɖj1 @� @� @� @� @� @� @� @� @� @� @� @�!pFϞ=o=4iR5&Vh}]ナ,sύ#8bl@k&b[Ja@/ruqUγ11co~=zt?vZVMWvr9HqW^Y!ؠ̙;c-vS%QQ oV{У\Bj-?h寪& @� @� @� @� @� @� @� @� @� @� @� @ s1Ѷm,h-o9 bJ3nԨQ%NC%޳,7̛7/ƍU9sfѺubW^׋YܘV[o /0R8o-[\f+|3"4Xv,SNqac=ZRFYQ^gA Z3vK[ @� @� @� @� @� @� @� @� @� @� @� @@EHO\rIp .u]۷íJO_~y<Xcbu׭c(8p`{1v3ό5kV8Y'O3(nʴCƞ{]vQN2m_c% s9'nx衇{%Wr81rmGt鲜Tj/Y5}M� @� @� @� @� @� @� @� @� @� @� @�@zk{/V[mvm׿u{[~-lqɓ\RAsα~eQϮ6aZ hƌ JP7lvB^mbbJQV@ EѣGz Zi:"L  @� @� @� @� @� @� @� @� @� @� @� @ lsK/&MǞ{<L,X,ߔk׮7^l[ƪAٳg}{」Yf=뮻n5.\;WY~x7˞e:V_O?v!^x}az @`j-7 @� @� @� @� @� @� @� @� @� @� @� @@uڵk+Y8dnݺ&lW]uU|7ՑĜA`ȑ>Zh'tRl1bĈ0`@pXf̈HZ Vٷn: :t.]\3gάN!rKk.Rc]w6<jy @� @� @� @� @� @� @� @� @� @� @� @�!;c=y~q7G˖-c{7LR۸馛b6mO<j}ѷolͪ3OLhkQy7n?xvm׿5{;o;v^z9C 7ܰ:& Ph5L� @� @� @� @� @� @� @� @� @� @� @�T 6 ꫯ�&Mĩ͚5? BS(q9>쳸sѢEˢ]vǨQwѴihU ZOO#FDCɂ ~9Z:cvo_~yԪUk9ZS�U! PkU� @� @� @� @� @� @� @� @� @� @� @�ryyy_*y䑘0aB}Q^8쳣yv%\%͛7߄J'0sxW^Ǧnm&SO;BJbkڴEs]c1]߿ <8f̘}#wx7W,>8ꨣb6z+~xb-\I# e% P$C� @� @� @� @� @� @� @� @� @� @� @�ꫯ=zĤI:ܹsYu]Ç[Uՙ5kV+qeŮM44hР֭[v-h�?V[m3>}QU%P+K.Y?sy睳@?\`O[lE 6,5krksyg5JA @� @� @� @� @� @� @� @� @� @� @� @�ѣ_^z)n5h nqc;f0U`n cƌ}|2dH;Y[Ѽyjg~Ɉ\TD:+Zŭ׿c=kÎ98ꨣ}w+idy<ѷoc=SN9%^SN /0e]27|%L7'0qbkGo|D./OYZˀV @� @� @� @� @� @� @� @� @� @� @� @@Y ,\0FoFY�S I%0u!ڵkWlٲ, ,X >xwߍÇgiyyyѦM, mwv)6hM$Q㎋3zx?> ׯ_|ѪU޽{m6!7˴miK*:#OM7gÆ B>իW\r%Q~NM @� @� @� @� @� @� @� @� @� @� @� @@ 1tH0N�cf4j( jj۶moݺulfD͚5|,;wnQF'|q92fΜPG 9n  +co'˸J\<#YԸqy{f{쑅LUijӦM?/B=:\s8C]F +s/L s=+C@+ Z~;5  @� @� @� @� @� @� @� @� @� @� @� @�+E l}Gl#FɓOԩsljժ`x#m-[¶6lRYY;>ДB_fZ)D+mcƌyeS[wuc7h-2ۄg'gr,\0|͘?~>nѩSlkӦM Kwogsj׮]ޱ^{EΝVZHĉ'>l+2e,Z+Pkq @� @� @� @� @� @� @� @� @� @� @� @�Z`֬~"&ƞ{~l|ըłNZ0F)ju֬YJ[ ,)S-,mcƌVkVA0Y )tMc6˶S0Jtp%=ᇕh<ӧ/ZH¨~X}c-ZXeA[i-92FQOA)nV: ib=˪u]YV:t(Cg~FRJMF @� @� @� @� @� @� @� @� @� @� @� @mE\}D:>b >5v؂o[ )ZUV4n86mM4)ѠA_~-vڑmt>5o޼?~ٳgg@)(^}tnڴi?ɓ-8RV~QF6"zEͳ-lCܔ)E.4*bȐ90RHСC㣏>«RՄ l2 KA{)L/ZOk9KҖڟ3gN̝;7ۧgkpb.Q諯qet<+J}m6 vmnݺ'}}8_}ո㢋.Zeb5GV Zj- @� @� @� @� @� @� @� @� @� @� @� @�rnBq)zE.gŻNU)h'm&M**Lª`3g… cy:®JH͚5^z^)'?�ZkYWir_8ȅ3E XVGȑ#rU8*_utVr#TLI\i-VܕikݺuPUU7ǴwѥKxj Z*Pk$@� @� @� @� @� @� @� @� @� @� @� @�FwQnęgFqFjʭej8Ӥ�3fls悿 )3-N>˶Zj8ԯ_ <A9Rm?<rUĀՖ\'>k֬,X+o9sl&Ո'h~Zuڴi,H+PݻwϾQ?bv 6J" PkTS @� @� @� @� @� @� @� @� @� @� @� @�*_D\sM=DfG` 2FYU Yr ZjY@LѬHu뮻n-G Jew.]W;tN.$|侹g]d@*1 @� @� @� @� @� @� @� @� @� @� @� @�Tr?8ꨈ_2"n1"kU´*9WRi"67 'ФIx'.s=78∘5kVN6W @� @� @� @� @� @� @� @� @� @� @� @ q[n1ztDϞuTU& PkWَkԨ\pA 80ۺtǏ51]@VEBG� @� @� @� @� @� @� @� @� @� @� @�TI#+b"&È#˫S6)+$ PkT.F`wz+&O:u#GsK@. @� @� @� @� @� @� @� @� @� @� @� @`)WĎ;Fkܹ?1thAEԨ N LѨ #_2 jѢE1dȐH) PH @� @� @� @� @� @� @� @� @� @� @� @�e#`A#Dk_E4m/eӇVTu#64U)4q4hPt9c\a.P!@` Zi:"@� @� @� @� @� @� @� @� @� @� @� @�ܹEnѣǢ{E<tĎ;V7 %?1~DF߆J#P^xGCnݺœO>Yj!@ jA @� @� @� @� @� @� @� @� @� @� @� @�($0sfD߾^1~|QGE_nZ&Z`ڴE6lX*n$yyyq=D JZ µA (@R1� @� @� @� @� @� @� @� @� @� @� @� P@ ֈn>="zX뺃�N]tQq@Y ԬY3nQFt=xg}ʲ m @%@$@� @� @� @� @� @� @� @� @� @� @� @�,IBn%bˆN8숵^֖ORX]* .HaZv[̞=;9xcw^]@U-I @� @� @� @� @� @� @� @� @� @� @� @�e!]EԯѻwG4jTk�|Z+[ j7Lݺu_=ڴi?BfI @� @� @� @� @� @� @� @� @� @� @� @�P"N<1UG#ƎGV2k@ԩ\hذ+M ///zb-b} &uD: ԪNO\  @� @� @� @� @� @� @� @� @� @� @� @�È="Z<8[#><⬳"_U&@5Ry ԭ[7|ɨSNtA1{NO||&M� @� @� @� @� @� @� @� @� @� @� @�,[oEt}q|q k/KK%@`yLhxyjC4iO=T92zYv k�L@� @� @� @� @� @� @� @� @� @� @� @� P/F{;DLqyyETr�2:5Q2oVYu}}]* P@m\!@� @� @� @� @� @� @� @� @� @� @� @�…O>{QFD z͈X2U*0eJDƫt:'P ~\gqF| bVOm @� @� @� @� @� @� @� @� @� @� @� @̟C[mqA͚EVĠAVE&i*@J/رc7ٳgWᙚ' PkY� @� @� @� @� @� @� @� @� @� @� @�sDomqQ> '":u6$P`ԈFM }ƍ /ŽT&Zi+ @� @� @� @� @� @� @� @� @� @� @� Pf?q oq1jTDm[fh�22%q2hHP` 7!a˚"P=jUn @� @� @� @� @� @� @� @� @� @� @� @ `+`>}"w⋈;hժڲ8 -0ujDFzWM;u]OyUS&P6Q+ @� @� @� @� @� @� @� @� @� @� @� @@ .X?G|rرKD|G ƍ9WX;#>Ӹ+ @eU1 @� @� @� @� @� @� @� @� @� @� @� @�-Wg- JAZW\_,w* jDl]-@VsΉ/<&MU @`@-o @� @� @� @� @� @� @� @� @� @� @� P%F8u~<sqcD~DÆUr&EJ ,X1}zDFUrz&UEqW^\r%UdFA` Zz$@� @� @� @� @� @� @� @� @� @� @� @�Q"?<b#^{ǨQ/q3"vRk�r6-"j5iR.k@?1ˤMn7_ @� @� @� @� @� @� @� @� @� @� @� PE #Fx衈ky137w~*:k"P&O^4GZUYWs16ęgY٧bV@U®S @� @� @� @� @� @� @� @� @� @� @� @>k׈v2%gϛmۣMK.Z+8묳w]̜93oΥ}s=;s I ]JxWsΉ֭[Wq-\0vm\p[.M)sJ܇$[lIUR VԵOƆn=QF-i/&AZ ԪVd  @� @� @� @� @� @� @� @� @� @� @� @@Hy7=ѱc{Gԩ1xpoDLVxpl1qĘ:ujtMoI'zuͮ-Z:(&Mk9rd(n4f̘{bԨQjV ,?0{HJ wVzfƍޭP(O<Do>wÇ/.*Ta~1vH*:uc9& h駟ʪYc6I @� @� @� @� @� @� @� @� @� @� @� P5͋#ڶ#_?bذ#tY4͛z뭗.M0!ڵk]|5\3=q'FÆ #O%Zt󳁤zj)ŧ~լ)d)D+t*jFV"+w 'D֭#GIrڵ+,+\/b\z㪨kzY0ֲ8ӟ9B@-;  @� @� @� @� @� @� @� @� @� @� @� @�U$0{vG6}Ft6h\F Jǩ߸ĹJc.* _ _^G,Aƍ@嬮Z1)P+-rʺ*9W Zjw}6mWUƎ=z(˟gE]-[b5kk/.PO @� @� @� @� @� @� @� @� @� @� @� @�+w?GCıFw^D.3ȒZhj^1o޼"-B~E]w~f͚rK[1sj3Έ[/k<i]}o_A}]}oW^ye2qĸԎ9g}x⮻n!n\@Gƈ#{ڵk{ߎ1gΜ;sN <8SV{_ĀrOy%?L[n{g??xM0!MWF ;X$\^YAI#=^{-[qY^w+o>&M5jȿ{(?]w5L~rJtر@[ܺHa]w_ԭ[7f/N:ewjJYՋ+"Zjzj?ݻg_|InS։'X0ni߉=KW^+hE * @� @� @� @� @� @� @� @� @� @� @� @` LqMeԳg䂌"]mfYmݖ<S%WZ_W�B >K\sf!ۮkZY0ҴiӲpo=~ij3jԨ8".[m6 J5)'Z_ƞ{{/ouG z{Ǎ}BRU ` 0ڵk\z饑ޓӧǹ瞛.\of=G d@/8 J!a#Ĝ~}xw6׬jG 5{-';һgg&dޛ^x!CSܻ(8⡇.]{•ׯ_ ]{tGQT %%Uy.OVdM5RG)p)n.ҳNk֭[gAwxY?).R@ZY] J?< JϟoD[ŽRpꗂS_+/P#Gt_s� @� @� @� @� @� @� @� @� @� @� @� P\\VH3":+ie':( Z9ӣk,Z={vL2%k|Qfe,:;1^tW3 l'ߤM74>裨]voǂ IAY 7x#vq:f*xrHizarlf[\ ]zW;YO ʺ+{ɂҽ)ދo&^{,D+|ѨQtKt)s΍ZjeB Ilz6;/kCY믟g}bqwI'"]~MwRZ~UOJ_u.|gVܻBKakj3gΌP3fd } o}YߩVYĉ{#xn 6Kas]vY\r%S,i5VҺ<xp[/>4iR~z͛7ςԒq*)`/3H])+yg Bϝr)YWZKމ귴rg~ZRKu.]ttʴ5 @� @� @� @� @� @� @� @� @� @� @� @�C ^ѯ_L"qɑ ZrURHʶnpgo~|.+?i ~S­ZlYOΝAY�U fmk5j([o]m۶/fAWc=ᤀTRXZ PJi)xnݺY Oʉ'{-JuR}{nѭ[0TN:iWP~,}YhڵˮƔvK qJc:uj) Ԩq\w- ^Jp|һ#n 2$sNL^z[fag\ *=JH?S~")*OU //7˺vK.RV*{w[h]qꫯ.쒭t}6򲠼%m:_-䷝>-ܒ執'@~n  @� @� @� @� @� @� @� @� @� @� @� >$⪫"|0"@ :kiӦF-v.(+W`)`,ĪpϵjՊN:K/G.1Pkɺ… @t|G^RK J%.믿~~Og}%r5j(,Pnˎ [g>x`^V_}5jT4l0d5"0oԽB%;i0aBU5bĈ/j7�TJzV}Z[?Ɯ9[k.6%}obb7/#M%_uQԺMmKaLkiKZW_}uoO<W8/[vǍݺD.8#cZK 8 @� @� @� @� @� @� @� @� @� @� @� @�+Qw"=4b-"!Ezꊇi92ƎJJ+PF Щ_u k޼yYfKSps~aÆ>OY.,q"󤀟;3 +tuE:uCKZyЭ~8Ҽ޽{vSiӲ�kE|Ki\UYs.2shРAUһ5'BJ *3&:;.*5uȺfmcǎ1`l5kV<裑)/JQkw"U.,L.*   @� @� @� @� @� @� @� @� @� @� @� @�+M"t)8(ȅE.lv6m:u\`AOIKk|%,jFݺ|WkxQ^h׮]v>i͟??RMiKVǻ[P-=ߣs/ڸq u>l_}uGϞ={]PN;-Ə~x|ٜ^y קO,+C ;/&O΋&M6ɓ'ǚk|7'nmVY^xt޳@IQ o㫯*vKϻ*7ɦSo~ٳi~EE JAZ8cu׍<0~%ۤI*yW|G% @͛� @� @w>ǟ9v萕JV'��@�IDATEFHB*)i1"%{+$!Nqُv>s]q:@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�$9S[WFqɗy+6m~NO@ƍ=_={HZrWbG^Yn}" )RG3zh~cܹS6lO< OhѢ.pBh}=�#+>[Ϛ5yU^= <cMҥKkuZm۶}laW+T:u'Ou]Ow=^`<3ެ|sέ)S:vX=С^{N *ճ>8vO_]Kk!hͭ.]`Zh~˖-裏tR8qB#Fp]1# ˗/=VƸ|Xq KVkʌ3d!yvOxk۱k\l"ukYV޼y] Y-+V^p|D^v<ks&9=[#;ujժB( $"� � � � � � � � � � � � � � � � � � � � � � � @ BQCjLʕKZPZ@j4q<Һhkp͚5.hŮ &m}6lڷoޑ͛˂(/3gQ}7ڱcj׮}QFAw#Kf<7ovwYdJׯw,(,Dˎ|x㏫rzꛘ5o<wg]5)SF㕞={9sڶmիWc;vtKaaa.0ow}y^<4g7> ?~+^7,H5+KjȐ! p^Zf't\ܲЦٳg+88XO8kX-[QB]]k)˖-KHUvMٲUcTVA_jv=ֵ{Ŵi\ ~j׮-$G{\hUL bŊ֭wۿzg3g%ӳ]?,>|f&mQ@b va � � � � � � � � � � � � � � � � � � � � � � � � 8{VeWiPi&ɗ' *a* \۴w^,X0>rn W_ŋWo%saXrf<<xϟ;c\Vٲee!J-vPPPeg}B~,'OtLwV֬Y/ǻbCnB,w( 8 Z/i/l-ܹӝ`>(QBYd"߷-;qΥPJ5jTz)Y[򥮋G*{̋k9e^ʜ[ͪUmS-xϭ^ӯR] � � � � � � � � � � � � � � � � � � � � � � �_~_z?<˗kŊI(-K bV.t)qgȫNրwŽ J8I8ȁZItkjÆ Ryu%͍Ij%|dN\� � � � � � � � � � � � � � � � � � � � � � � �H#ȑK]JI%K&w}+R'OKM7䗺?{_iSʕUbŴ3K/TBCC5n8(PjL^~]v\^Kop5k\rE<t`_dSO;T/:W a^ϸ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ Io!-=+%+*:/ 6=f͚Zl٥tk# W6?QFx\NcRҮ]Yo]SLI[*U*bR:qFUP!۷Oe˖ճ> %PRҔRAr KSCKdNh�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Ҕ҈oKٲI}H?,]vY388Xaaa ZUzU,멜b.c}'| *k= ?݃B޽{kСѣ맚-1uw#� � � � � � � � � � � � � � � � � � � � � � � @R l&T4iΝ3$VR$CRI&!w!qÇOhT!@VMt@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�XVnBil% Wʙ3E ,P+((폓?yj5jߟ�1Q @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@@'ukJi*M=�@�8xP LvhxG;wnK<m"Jq!� � � � � � � � � � � � � � � � � � � � � � � !!RR͚ҟJ_~)ԩ)S@ } :$13#={v=Sz}[ @: P+O�� � � � � � � � � � � � � � � � � � � � � � � '0}tRҙ3ҬYRVR Y@�8xP Lh ֭ ,C&uӴ@ P+:� � � � � � � � � � � � � � � � � � � � � � � @ J}&U.h!/-^,͛'|s@�c Yj7nvޝ6(H�Z 2@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�R3KR"}Tvj}G�$pFXXk׮*PzA  n6CE�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ѣe֕6l&MUHYIAA)O h7nT#@VUt@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� =* "*%  j%m*T|Jbx9)G){%K 31oQ1))00=>ylmR,R&{crݺu@ 6+R�Zm@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�"pS *u*!Tx\j.кɓmOKE<vt- o+ӦC6ǗGղ0̙ YYݺR\)y$oׯ/pp˛@: P+t� � � � � � � � � � � � � � � � � � � � � � � vJ~[ߥ_ Lg)CjU\9d=2Jߡ{:~g]{ʞ=F84$@V @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�-[$_ʖL9s4h7/>$J]9{V"':}'P+AJRŊ1-ԢEkrȡ~Xcƌw1g#J7! � � � � � � � � � � � � � � � � � � � � � � � oRRp"uԻ lw%YhVt%gNY~xz@Y<yҳBs,$MB(x衇tI7οS@@Tp" � � � � � � � � � � � � � � � � � � � � � � @ز%]LVZ5i㏥ nĽ&D qʔjԐ2d,Y;.#XV8$wFg!y:%Wvwx79RgΜIۃetD P+_@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�HN_~jז7^̝+tTүJw%e@R t,e"%òb:tH^j P+yTɒR͚Qw=L?cڳg>Ӵ;HF@QYB�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�D1Beh!w/n.,L:|VFCN,XkR[= K(5hpq `J `Qe"u(eΜ=Km(QBwq^{=PF@$"@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�>\z-[pK/IgΜ~4qTԪT9s @ Փ2FHʰPN.<Z9; 8@Vrv${'E,n!>'@>}/($$$1NR@?Rd � � � � � � � � � � � � � � � � � � � � � � �i^W~.ҸqWH#U"^-}tu7Rw_CBy.j]lG 81 HvIkk 7ܠQF3t+@V @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ % & uO}Tza&7J'J+G}.GHmHCyjL齦)`ZAA6 tJ,RR )ЧOM6M۶mKf#@Vt@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ " ¤'7ސyG*[68@jțWjLʔIByRKgXV6'Ъ9gHwo|J\֭[/} c@: P+d� � � � � � � � � � � � � � � � � � � � � � � ^~Yzɘї*0zt+Is$ByR]K9r@ѿܹ-+_^Zx| =Əcǎ%^CԌ@ � � � � � � � � � � � � � � � � � � � � � � � .u_<y2S|a;eȐA4ݖїFeeΜYʞ=[ld$GyEco94TZN>]j<9 S[gϞ`&9LY6W'iںk˒%Kڵukk)iWc+T(1Ç_3TӧO|@_wkkiƌum>sȡ.LW\RڰR}> Ok„ ٳg@ & ?4b:@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�,\6<6 ݰȑ#GQĽP, 豐 ɓ'rϛ7BD 3}0]s|yܯL" ;tPfk6f6vĉ ³,Lң.>uoo{%r7Bp-o3gN~m {i[@yQRURI˧ڸqnomgm}G_,noڷm4 زfkXb*^J(}7TRzoFX:sZzV x ,XP KMQ̜zCg@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�\ 44T| ۰mڻw6ﳅhB,` �* )Ydx0D 6+s.h#SLiPsbΞ='OP /Q;va`vڵk/ faZ^VBd[…(b[ѢE5fL7^-_P1k̎( Ν^|-GүzݳgO~֯rlG.&#LykFek[noTZϙIa\ӧׯn{k  {nE "\rol)֯al{McW,w[+Vʕ+kZn Zl=_~AW ^46 5ak,(K 5dBf{lfwDHۺJ*bŊY r'EzRڵtRժU9@Z0@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ XN_Ӷm۴}vYNyb,8 ,BgB7,\'=Ǐ,,g/ ":uyφSepXrsRJ|쾐\*Q"/Dn0nlMZ�Ylwo^*[^ e{[v;[pbbc7q{ad(hD,<Vx 6 ,UJ.힟v?(&R^Z=ij{ϝ;WK,Ѳe\ٳJ*.B͎'W 6B/ 1X)W:հaC\}M^uUZ>Ô=AS{'K!!Rz~cjJ  � � � � � � � � � � � � � � � � � � � � � � @ ٸq6mmٲEs97 ˲%JBasbfAZC񟀅,__ӧ*C?}0[t۷t>ӮA 8S|yUPm988K٢)Fm~nu ֭ [^mxaNn))S4Rc͞,̂ 笷˖-ֲ:Oq#FH._\O/gYh͚5Kgv Y,>3# [|ytRoY5ią1%F?y=o,ДrJ!P+v\� � � � � � � � � � � � � � � � � � � � � � �$Zz֮]uiÆ ?X(S2efA. N>hfa<۶msh^+v1wq<yTbEUTI+WVժUUZ5(P %E:uʭ~Mk֬w B ,( ^6[*Uʅfe̘1END-pYcfֲ9r]϶mR[&hB~Vxzf!ZӧO3fȞ)իWwAS5R:udZis̙%K(,,L 4PպuteX/~849~[ JW"� � � � � � � � � � � � � � � � � � � � � � �*`Ʋ—&rJY_-Z c%//*OZݻw�& a,Lî#vUWꫯߊ/p[?VZY0.eΜم)ٚ ߮ Ν;>=jƍ.H-·YoaHl[5\`^Μ9FGtH4xooq!ZW۶muBK9z[}9sΜ9z衖-[0]cO$P+w@q% � � � � � � � � � � � � � � � � � � � � � � WGK, ߖ-[#G Z۪Vꂴ+̂,XB,ɶ[p"EVZ]׬YSn)bK.ek ^۪Uʕ+�Yaѿ$8~ [f~ٚᅰ1cF]y啲{u׹O[Bh?Pcǎuk\su6m((('[3{iΜ9pݻ>h"խ[6;2J}!P+v\� � � � � � � � � � � � � � � � � � � � � � �\ѣGTΝ;2eʄX&d˖!`sjʕ.l۳g Ӳt7AJ8q,dno!Z,k ,�B($D ,,L۷o׊+O?cǔ7o^]Sի¶dɒfR5W_-5j$ _zf tQ=zUW]b%۶mӻᆱvUTpTB5mToF1>,~?JW"� � � � � � � � � � � � � � � � � � � � � � � H1cfϞŽ,4,Rl+\pdb Zp ڴigϮuqj޼c"ŒfΜ~AK.ӧU 6p2 7 ߴxbn=ʕ+[7t5kJ*%f7/=%iI?W^yŅ#eΜY{#<|%qORos'OtZh!]tѳ>f #Fhʚ5kqij%p;D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�bYf髯ӵo>.]ZM6ԯ__ K`׮].jΜ9~-[V-ZP6m\@Tƌ\m;M:<xЭY kРիG]iRD umwLj O* @?^1m?||I=.$-8qGv}'.L4hqeɒ%qNO,YR&MR۶mu�ZqQv( � � � � � � � � � � � � � � � � � � � � � � `sι &hڴi:~ԩ# 8[tW$n.DaԚ+Wjƌ믵j*uSN]?KuY}g;w맅gYX&MT\w: Z_]w,Yₙswu$r|`iرCwϟ/ (L#:q℆ ÇH .k77ܹ߬s/LJ8Z J@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@M6ߖi<xP 6tA&z/ė BA ܹӅsL4I˗/wAR{ |)RH }‡Ə2gά-[m۶jܸ #_@wз~ɓ'kʙ3ڵkrZRNGڵRҚ5ҕWFsR*=<qDK%K￟悞Rmپ}z衐=8p2dȐXH߯{*_| G@p;D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�S_׼yTJui*T!R֭[vޭnM>nT;&5vXڳg5kΝ;[nQS<Q _.(?… }AU]YVJ,sJN)ƿO׷o_=KYƿ"o_~yof)ug`G9fwg| P+j%܎+@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@  ;wN} ۷;C=5kc,f֬Y=z;ժUK RSp7ol&LEW^.H`jtK< ٳѣ{1u</KNI2\ʈSƵ|YjfڵKKGXtZj/ܽ (G߶m[Y`\K(~;2&RD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ҧ+wjݺvµJ!:cƌjڴO 6RJn_Zpa;\pٍ7jڲeBR<&Le˖Ր!Ck.9RSNUҥz8|p޽RBi#L.i7oaZ4, B9 СC5ۡChHf< � � � � � � � � � � � � � � � � � � � � � �׫A{\X0I…S ) PBڼyʗ/cǎk7)8qB rw[n?Ee˖0 Y @]tڵkjڴinM Mv/P+;tU/֜9stuFH@RdfǏ׭ުSN%q]͕+W.})?t?@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Ҵ@XXF5j 6hذaʟ?7C :%K˗kƍRNO?WO>D'NtAZ7xcH.׶m[YF/ [ Kξ[VZȪ=z>SM2 }^hѢ9s ӧOf`-ZB @V >"� � � � � � � � � � � � � � � � � � � � � � �N8駟ָq4m4*U*i|G VSppp }5k\rIQj-[LJbd Mmcȑ_7nSZnaԩ`"scO<UHJKrTngΜY<֯_"mm~;!@-[<x5j4}͂ ԴiӋsU.]tM7wʕ+PB;v{w$owOVi  P+l@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Rct7kժUZ|:uGDZ bՎ;hƍ~X~k'C ~o# 3eʤAP~[;w( %k}vw&MҘ1c+W.7c}۷oΝ;e.O|GZzΝ;][{:#;uWQb>^j]EYd۶m[o]j >-jYW\/:r￿}O-[tSL_֭3f]Âl?#y٬Y3e˖-Y~s0] o?G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�,Хu:t.\+Fw*RM7aASժUK=h#ݺuSpp r}Æ 5o<|ҧOTqI 0I͞=[mڴzq޽]VϞ=ZE P׮]]L+I!^|;wD^~o Uh|s†,-RѢIݪڳP; &2d2g쿊HM Fg7o/ ʗ/ɓ'/8_ T,uȑCM6QH j@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@b }*R´/OZPPb3ʶ*իWzK|Mucڴi1b>3]InT (Q"Iv,-w>ܹS:t'zTٟĺW_[.ɺxt|$k {P {婼B hfuUWj֬}iĉlٲjѢ~bhyȑ<  � � � � � � � � � � � � � � � � � � � � � � �Dؿ,PkС*W\_ٳg5sL0j(=Zk֬ѻᆱ/\믿_~EsVΝմiΝ%-r ^{J,) tzϋˇ'Oj̘1Zt_UZU?-. Ȗ-^s!"{K_~ɓ'1)SFz4ikv]-^_~Zl,`zGTti}Wn"O5.믿ma_y故 6̝۵kWw^zkm?^ b~UPc3N qsb.�,7tw$v͡G}T=z` $ 4aYX<hs昭_~Y ֶm4`�8yj߾ԩSٳgl~'ŋwqGõ:~<y؞!QVc=?O?ƍϻ0 ̰WZyQT)M4I;vpsq~6/ϟM6[gr֭[ՠA2ݻwW^gߥ5lEO w U۶m?8?Ix#֖˞ӧOOkeV4W{'j*wuhX��@�IDATLϖq=}Yӧm޼}?vmmٻ؞%Qڵk.]ڵgIj,͛7wߍ9R }N}j{F@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ >seɒ$rSVoY'Nt:t,$㧟~ҙ3gt7[nE rV tPF ?X� 806ê_ ( :z:t蠱cǺ {(88XeQu)\d -`9su9PW^qi/_,7tfa?m! ɘ1 ʂ֯_ʦLB?n6d!Cԑ={ x6lʕ+� I/&6neY} Yʑ#m% ߱9b>6̝;ׅwnO^-~sk뭷5is+]<Ys=. B,|ˊ' ޲(/,,lw܊\,情X(^ݺu)3$r=Q} + g+…u+ڳ૾}e]B,xlڵˍ|뮻ܽ^v,|v\HX_Y�Z?zµ~> H֭[$#̴Yf~ٜL{ݜ =[޳ 4Wl]ENbDӻ:sܹsԩ&_|X{O&FS{ϯ^Z_}b4uZ JtnHd [_"@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ر i:uw(YDd4z!ba4m۶uaYdeҥ.XH".p‚,4ʕ+α6mڸ@!Ccq{;vpf޼y.|Zf/^  9x:! |nıh"0`@\y4rHk.}OoȂȬX@ɇ~B,_~5\z,TNJYo,dgʕ u?b4gO/BN<) as *[,P ^]ٳg]h,`!O<xg5ydYZr Yz]wBi*Ts sY8زeTfMwֻfժUXٚJz`ek&LsF,p+w%c| O [@@,Њ=l[YȔUVͅسb6-Bcl Y5fƞuV,Ez3ϸckTl[=`SO=B\o؞'diȞ5۷O^||+ֈ5k7,YМ?K\=!!!Qlq ƌ˳%w28K=m~Y/m ,誴gm[;ݞ_jFeAe~׊.aɷ{MS!9r* � � � � � � � � � � � � � � � � � � � � � � .,&000ZhQׇVZp \ |i#8aVΝ;h,@,ЩXbaZvN޼ymb!}, ֭9s ٤Ie˖Mq :]qZرcuUWб-[z^q{.UT ? @Zj`yΝ‚7̽u?~݇!IUX)ٽ͕+W-ڱ 3XÛ[QD*ϟ?W$}!\R%_F,ƻBl@م<_}w}XjYhjy{ӧ]�x%.[*b[*TpL} 峠9]={=?=x{^^{ڧO=.m,X˞<[@X\'^Iqڳ))ֳmn3LI#J\=;5;ĉGgWow0;kҤIZbEg_}ݻFoQ͛7ƍ]P]m% ֵ=*R%կ_?rv )@V<8@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ҾBYpKr Ȳ)Slڴ}~շoއݾ$ ]ȓ:]9sf]wud/+}Biq.>mݦƍ ~UHtW|ɓ'p;1r�OT2O+`Wuֹkʔ)?^\O}hh oZBSxqM<9!&5Q Xȑ#5n83:e[/uqgw|޼y.B,t+y=C{]{^u>,XPvc> )*@[WoD=z_tgф tw<8>O">´l~&EٳG Ǥh)qޙ6K,F2WgDLtl {.^?}$ۿkjԨϟމ7lؠ]޳.?}A Mj*VҥK�2(p~X!U!� � � � � � � � � � � � � � � � � � � � � � �]iӦZd,*9r.Ou!8:{Ee]& {ڵk GxmbB E<ϱs߾}n|ǏwD֟Yf]v~CLY=* 7\o~(�Ws �?FQK ѡCԤID-ܢ= $z[ـ.wԩSձc& (>/Z(}n-ZМ͓mۺ=-ܯ_U_|yO|>wڷo3g0Ν;+k֬Qv[wWoFsέ^z7 Ժ{#$ʊg}9soL[ϩ;PBݙ1WlI$͛7ak6 ɲb!'N yzWꫯɭ[O>*QD9UP&K]f7cƌdiF�Z@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H3-ZPٲeSO1Yrʥɓ'kժU =ܣSN7;+Vn[,zaEVwoݱ8-޽{uwhծ/Çc>b~\ /^X p[�',UVum̞=- Y}siٲ,,)KJdk>Kkn\HYfʓ'Ox]wZsCF3h۶m뮻\qY[v^\Yp9+leZTREq_~ Ӻ曕?~/X^XcZϏ<OOyS]^?{$f[^ݖeY-9^fM͙3OgKBrJi֪U+WՎ;;<r[lq!E}eU>bŊD۸qcI0 !GIU � � � � � � � � � � � � � � � � � � � � � � 6,$歷G}O?4u׶xł:,Bkիkȑ[J.B<wNԩ>3}7.ū#>{ۂdF'OKwܩ 6'e]i#!k1c\Sc W^yε:t}?C:x_}=;wnM2E`1vX=С^{5wX{ァ_֭W-\$>.]tQh"$e#6_.]'NhĈڷo7ڴiHk 7X蛕s֐o/잶k}ٳw7oBlYWfΜ{s{eTvb{ڊkołOnkd/iԩk.η@@/ |gI&-ӧW_~0Oa1c CL5:pܹΜ9#KT%yU}fT K矩;P˜ڴi;>[ޟw%Z0ُ?Dw{e̘c|L2ɞ7R@& N � � � � � � � � � � � � � � � � � � � � � � @b )SF9rpa,UVUpppb5uQ.Ba쳅&Y_jԨν]`ٳgYf6ldɢnAk׮uJ_|֯_-[jS 幨h,Yҵk -zꩧ[=C.pB,ԦAʙ3g45wRiaV|~'͚5KRX^}U(QFbdOs)gdc:G厭XkAU/LׯN XPٲeݽ;w ٲ>S~4gwڳ� {I&N .�8 noV,,([l1ÇwAnjhnf裏ෆ Fsf~7svء#GhժU.LٳnmX֬ i+Eq[oq 2D7ovkyha\5m46g|.jŮΉ'ya!Iz3$r}ymw޼yZp>WorTP!rgbƍsc|wܰmq]vuUe>mVk֬q{} p{em[N{Y]珱F^;vtaM`` `g@ugm6~=OvjoAe6%K@6/,)Ztmդh-qڨP{oؽwJlsTd XRX&I}kk֩YY^x=0>!틽oMŞx1=$OFߤ򽛤R 4ڰq� � � � � � � � � � � � � � � � � � � � � � �$/* IIlšr}Q٣L2 ٰp0N]X0?X.эɓ.kfͪ JuVca>v<xϟ?8}G޼y~wԀO:s낃>ckΏǽ* W�[n%uڒL71C  O+]t;ڊogAs6-x.b@{Y[^4tPYnYNT%|Qɓ'-B, /bkLV^;<Xob~޵kNhd*UJ.XW_{EqI5@ R]TPE"bĎ +("bAŎ 4$Jh{Rv7zMϜݳcZ!+#lfĈ.r;)lɥI&>Z%/iZdӦMeR,F/_-Mvx^L^Ծ}D6*MVsb@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� kytmM6zs=#?,k׮YvСׯ_e;92:-+sNѼ__. >}N>mKOcǎZH;yn??R&L+#mYp? 6mZhpnHE73ydg!Cjy^,3a,۱c5k}ݐiE59r~楟eR,�O?dYu7g}Y `? pj>-R0j=.绲' � � � � � � � � � � � � � � � � � � � � � � Y{Urr6xoOJJr㬦wh?BS 4HE eR HHHߞedCqӅLC*3[nѣ5f}zTboٳzwsӧ>խ[ >s]6$mݵk7n, ],W N33|A{Yy4j(YPlll&2&ի$%K+vڹϣx OWFezjs2i$;]h 2g 5s 1#P+</@\evf@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ,*@,[oqF=&&F˗QG l:11Q0|p]wݥ}H\[O? P Akl@@'TRztyև?,$誫-ܢڵkS.fM7ݤE 7{URo}o^_|Zn3fjժ!튄OY6m.=Կy߭!;3e]r%@[o5b-g /t#GfOW:usυ,g&w4{;o4@h@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(p%%%�,?+8+tjjjHˋ+&?[@֡- H"!Όs=C7njԨoمeXP8͛7ũtXU.Hkرڷo 4H%JZ̙3erԯ_? <XZ zGzw)Krg#~ھ3lG߾o}?~uY`.<"y1Zk0a6l5)whzW.1BSNŋa.r~ʹ{"� � � � � � � � � � � � � � � � � � � � � � @&iii�!X郲y ڳgO˔)e%$$3 $y+BTF|O_v7ި*"C,Dh̘1ԲeKWّo!$n: y^b.BtMjѢEV;UGG-z->;{y1+ 3{5|5.]h\r(,SrKV@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�B%e8bZ)))!>JLLT, J/^<:c6RO觟~'K.D{v zS/%`a;򊻯.\:hРA.&..PErkSO=goէOuM%JvPQ7x=}jԨ^zVz/K^OS gϞ>k*T_|Q͛7ϗ擬\R׷~'|R^zislٲE˗״iv78 HV/ Z9cO@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�"V`߾}ڴi lzǎ!Й Dz Պ2o<M4ISNtI={T=Trho>`e˖^ܹs]]vejذaUߵkz-M2E+>lYVr3kSu֛o?؅_;wqvRرa Zv.rYСC5|p‘9D={4a[NKj֬Y&Q=}'Oט1c8r~eʹ{"� � � � � � � � � � � � � � � � � � � � � � 6w4kVబ7j޽!OHHQG?(i/]t̄ 55kMMnݪ֭[BzvN:I111;1@> 髯{¤~UZUzR޽ui{4%%͘1C|̧sYgs<xor{uΜ9хY8=c!PjՒ^^T$6uܿqq?C=>>^/֭ު#FxD^φol6@_rnǞ � � � � � � � � � � � � � � � � � � � � � �䙀/Y?aDzu[l K\\C±2 Cl\hѐc0{e3g;C+Vksg4h{'Hd `.?~d5M69ㆶm*666 עT}G.lVZ>S۷o:+\EvϞ=5{l}.o۶mjҤ ϲF ij@$ܯ^缮 ՚<yZhaÆ{|ԂF>- q̘1"zg}VvEDb U#P+v� � � � � � � � � � � � � � � � � � � � � � @z 7n2+84KReYʕ#!0̦.\? jdA(ժU)v㎋00c.ٱc ꫯ_НM6:vN:sΪUV ~,˗/6mOv-[6C7믿v~۷ ?ўH׮jԐy%y_O{5c rxw ."-�q.dl,X%޲>%%ʹ7Z9cO@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�B*s ñ6xoQ-L^b6~e?: ԢD@ZZ =eZsQJJJ,N:I[G脠UG$`ѯ~A}͛Y{Q*UtꩧBFlh֬{Go>YPAeWv 6T˖-ռysx:㕐pgc&`Y׏?e Zr9/h] |Ѿ̝+m+eo}5JӧOw+TzB=+?z)-]T.7buСdL -SƏ+"Yj圔@۱' � � � � � � � � � � � � � � � � � � � � � @XxQp�MñlyjjjHˋ-e eY6)R$ Xo^_- S$ F*] 豐 E:ԴiS-[ߝq!! ]B~'/ڵk bUVjӦNVu)*?Ӆ}7,LJݺuskϪ?X0}wP g=`ϲKVUYG5شiR߾>ˤnj[f z=aaQ}y炶<@nm6;zW5sL׿P&M9oY`„ 9?{H@ʹ{"� � � � � � � � � � � � � � � � � � � � � �W8pdBi[?O'$$ -sN߻䇻ըQC7 sG˖vu8^>ݻW+VВ%K Z>ӬXYX '͛@žD';Xr ֚?~ �mٲeڷozQFjذ7h@6TZ6;=ǫWҥKEdêUdfhI'J*E@ scH>*]ǍYK/w}WwVuK.s$ۗ_^~^u͚5ZX_/}BJ*m .\X(_&P+j܎=@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�A2 J*ƪB `cX%J3F l,y~WYP?,^X~Vɒ%U~}7XxOݺuCZTLm_aƍeK|rn,8w4ic=V6ԬY00EUwU FP%l]\[-ƞWԩY׮]]s΢bY؏fs<5y @bath!jٶP-4d4g4w. w̙35m4ڶmԩlhbۼy+}GnX`+׻woK,@=cljܚ@۱' � � � � � � � � � � � � � � � � � � � � � a XȤЬ>\/i8ec,L 2]֮]+ Zd&_dZ6T^]ժU mr9wa  F_iݺuac֬YUV�?i!I~-xcqJ@M, B,L͞[?YNXP^5\=UVuϮmR ձ盒3bϱfL|gg2{? -О k$/Uz朶9^؇~N9b{ZR֭ղeK5kLž-o ǵΝ;3taZڌu]ǻ>}QO@[s;D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� ݻ JNN޽{C,b�XL2!3�'`<+WtN;?ܹ3pИ%&&pJ*i{mZga6+W΍ 7lݺՅmڴI)))yfئ3f [\K.*�5k,ۆ>U r?͂^ .~�=jϬ?Ϭ=?Di}۲e{~,4c ³={a} 2{-y ;\Mm[r~ºJ5o<7شX[ƍ}u̲ϱE~sAZʖ--Z 0 k I921co믿={:, `@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(:a/J?<o/.EqܑQ@VFˋ-|@ ,hf.XeC,#--Z[FY،?(Q"0/�gIv + l` ۱cex۶m�ԃe BbD<-[SFoߨ# !0CH]skn~[?<ʞq{vӇ\Zٵ@<ٵi ~nqbܳkT=\==iϨn}m ?>{XXsY� <P,E/L"tS.«.\2,^8$|TR.|g=63;՞I }i6狍/XpG½4i"_%/nI&i{4bĈpZׅ@_bmsnǞ � � � � � � � � � � � � � � � � � � � � � @X XHҰq$YGpK/e} @d X ta!=a6ئm?ڼys ˱ϡBvlc!6m7dBP lA@a92?HȖ[m(WmY8P>\*zMix3ۃukvCvfϦ=6T۷o grg6xlA;ϯ/ec/YOpp=6jZ sϰ?o(%e2ypW$צVZK.!Ͱgڂ,pk֬qWB,Yq�-p9?`ܲg28FnzYBL 硅.X oOEݟP � � � � � � � � � � � � � � � � � � � � � �y$`A4X[؅Yłg,H‚~9c' 9r N:.KK_-]}t}Fڌ C/ H͛K:HÃ[X,[&5h }ԢEXTJ fR׮]հaC-Z(I U4{Ծ}$ռWU � � � � � � � � � � � � � � � � � � � � � @HIIQRR J~޶۶m[TѢEe2!X|`YrNLLT\Ad"R>K.u?/_nU6@UWIa_}*@ Ԭy H3:}`+WX\vY�9w{.h9G%E~s>@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�J={(999Xba0C7n얥_n !3�ݵkWDj.TCi`iDixmph#y+СÁ0[nN<Qp-J Z%,)yu>{n^ZI KE `@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�oߞp 6(%%EwWll*T+4h %Jg@ cm۶~HD[ҲeG^jN_zAr/5B nI[_?:u"VjrS >>>pK`" C@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ W,jӦM. +)))eAX;v9wC±,�E JLLtZ!a@"5Pox&GI& "5l(}4xGxi䓥=9s%PVU:JQ ֲ@;FiKiV4 I[@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�($wa`j:99Y{ )[lHVjtǻeuQGL)S&df@� F 55՝(ZY/@M=Zv€ƍN?ȏ(JI3f <L) +u#p -+[wɒ%XEAjD@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�o[6l e7oR"E(111$�q:cc ʲbŊ@�ضmhjY#,�h(i�3ΐyDQ#2D ,iTKyAmSKfVIg@p@- lٲݝ( "� � � � � � � � � � � � � � � � � � � � � ƍ](Vv±l]v,Y2$^�ޠA@8ecʗ/c0� _3 7(5j$ &|�H+ NG 5u^lSKUNAւs#}qqq*^zk -J(@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�rO`ΝJJJ de5maZ- n��@�IDAT *W\HVڵռys>bŊwg� @#y#ҨQsIcJ]0�Yp4tEҼyRÆYXN^TnV#K ?CTFE�ZwMi � � � � � � � � � � � � � � � � � � � � � l޼9X6l\hѢ.˂, ˆ;.0ܦmȾc@�#X*U{/. &/ "u&u.=T^Vj!O<!-Zt)!! +I 90/䞀,YRvޭbŊ9y �C"� � � � � � � � � � � � � � � � � � � � � _{Qrr JJJ0(Bu6NKK ^ҥ]eX7vYñlrʅ  �)`ZfMi4㏥뮓=V;cD{iG.`t.h!'͜)/ȏr_,Z?6GD } ڿ֮]uvjz � � � � � � � � � � � � � � � � � � � � �K`홆cXeCJJ{1/_ޅaYb5h@m۶=(4*Q;c@�^,~ƍG<Y3FիNr.P4cԾ4tg'GcϼV-ʗn !;Qf 'P+".D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�DkӦM :Դc: .ŋaY8`5o<ñ*T"Ei@�Jj+ZT2D"[ .:uQ4\hJzO&ҕW)8 X!թsawPBHue 'jP@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�HKK;p, ڻwoHʖ-BpUYfnYp,/SL � P cͫT&OF<X:8K^ߊ1O7kڷO)RzY΍@ ǻDY7p P+ܯC�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�3 J`WMۼysH])"{)eX5ҩebŊ@�8<Kk'}҈K/I?,]|cH/p=B?_7O_?Rǎuv΋@t .]Zw[=(�Z~ � � � � � � � � � � � � � � � � � � � � @ۧ7caek׮c,Y2$^8]{Ӿc*TPLLL1A�@�HMMC+]{ԧtRғOJI_uh? X}$ӤsϕZJH8x;޽R:{^Ά@aw+!P\o'Z i � � � � � � � � � � � � � � � � � � � � vY VRR[o, ]%xoCѵjRCBp,ۋ) � ۶m#P+%&Һji`y}i {6dTRV҅J#őQwƚ5RZT^V#Bj}*UDmCiX5 � � � � � � � � � � � � � � � � � � � � �-yf0,Hn֭! toXX͚5;hYzۇ� �%BDW55gKSJGKJ^('P[iI@:p N`ٲ&Pgn OMMu;Ytit7E�ɋH#@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ػwaX>+}PVZZZH%W6ݰaC̦ӯKHH HAd@�B(`Z֏,`]^ &NƏZ:x{ PX,nʔJ-VoRRJ_j@4 0;%&&o&Ҧ( P+.(A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�r"},C6mڤNeAW*TPŊXW֭ldɒ@�@�+`A9C[Ji`M+7;~A0 !=4dTtV 2 䍀(�Z~ � � � � � � � � � � � � � � � � � � � � pt" lKbB±N:Cc%&&H"`@�ڴ4{+СȑҠAn?["7(-]*]zT@hmik2PhRDV4\oZi! � � � � � � � � � � � � � � � � � � � �D@ZZ={L2!aXUTQfܲ+eˆ  � .~(D'ѷt´nYz)ixS#;VZB];W[7oC/ڷ]@||,Dʽ#s$F@q � � � � � � � � � � � � � � � � � � � � !,bÆ Z~6mڔePVJJJȱ) *`5lPr2 Dzeŋ93 � @ +i+nA:4颋U1 h~^W<]Js -6XրQWj@$ X־}ThQjĦPB"@V!4@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�F^JqF%%%`, jzΝ!)QDH8QGzeeʗ/ؐc0� � pJ9Fz=7n\V_ҍ7 1 Hwޑڶ=W#dHoU߲+5D R-Q+qqq.LkEjwt ח!� � � � � � � � � � � � � � � � � � � � a ڵ+@ЬdYVp)W ȪXרQC'x�ɓ'kժU4|p? � � Xp!u]wI<#?R·sE zVf͒ڵ.H>]^q/[|ZկND@>ӎ;ԊK P+j/- C�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�زe,�+8+[)11хauQnܴielچEfw}ƌmwQÆ ڎ � �ضm[>{&3%i]v4dȁ=jlO!Io%u$/�YҪK"E:u¥FwJKKs={D_#iQT U � � � � � � � � � � � � � � � � � � � � {Urr!ñY~hݻCPEC,~'=zx m޼YŋWLL;駟;OK~7N6mŋܹ>?zj}'.TSOU^2 0`>UV?D`/詧 eʔQʕu1YX1[]=\=C:C1� �D@pǾvmbcc]dɒfҼysK<xA^t3<S֬Y裏V=TzuRRRTjU׶^x_c yuy}YƍonUЭp(ֿݫo:hСP-W='~P"[];i 5;|g^[.yѢE{Lζ~uQjѹQ,9ޗA&unc '̝;W 4SݺusfsυlfPj֬.]Q̖-[t)_5\E<Zz6 � � � � � � � � � � � � � � � � � � � � cǎCcX6{/r˻0,?$^۪UB,0{_e˖){=l{ Pԩ۵^zK]ºuԤI+jԨJ*^gqF}:խ[7ꫯjVcz]¨QڦnpEk׮.^|嗻/BC qu[4|6W_p,L � @ [8BX?Ns# jٲ&MYɂlbc I=묳\8%\ZjҌ3t ',i….?8 7]\9Yk׮];UlYϚŹu!8fYȪ~`-4ydtߟ~Z{ w,(;Fg+R]?oO?5b!+WvpH8՝d,г=:y!.>2.oŊsp*>f#-u @ X3wywj[vY C {v^᯿G}T;wtCfΜݻw%B3jE � � � � � � � � � � � � � � � � � � � �� ,x Ne@Ŋ aYDO[ Vtbb)~իZj8*UrY&Lp/8p-ً-¬,3TfܺO?]M6'�iӦuem33~x'԰aA֭[а_=7[{#W_#Fh8q uYo@�$m۶ZwQ6m\Gg},/gK*e ֗رce7p[faezjZ~ ;=c:u긾p*Udae\s[o}kVO<9Y/VZ?Xͺ*/�C:T^ԥˁpk?c`1 hذ:uj0b-='+ .X©,?toZ\8]d ʍ0-kw8/0ZI]>3Yjwھ}{Yiiiռys}.f妛nr<e]~^z>-^Ld ԊG@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�3{mrrrñ, kϞ=!)SC*W^~k˂e˖ ?g֭B)^x L_gck;^v B7*WͺbA�ِ+:K*⋲J9[�k& "�?,$f͚3� �DC>ZpÂ( D=37;h|^Ε/bQ oA@e˖>X({~c˙2E?J^<</+Wtaea � BV^#} >vڑ/Ne{~ {=_#[( eg ^ow8}'n? >_G IСx {@- F5kn6cE(i@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�RSSaYSpUbb*V°,cQvlœ"XpA5rTe{O<o]wvǰ/pI}YЯ_?]x.x+8@ }2ZVBo^ow$<,C�@�[*] i /d?pׯ/ n$l{ Ժܮo�&Lח*=ȁ3Νd-ZB_tyE^O?] Xn " >hX5,,X N:$zJHHp!3<ƍ/[vt_g?w-YF^ۻwoemx饗dZ~}z7ڵk{n6;vϟB.2%|bm({{‚_ǝ;wj_;8W:Ń>~g)^+ XP|ziԨQjdvYuFz͵pBw =St7kٲÂx&M$;{B/6mձ{:묳*0gqVyϧ@L @ }Y 9E);, $^ʡe˖6{Bw�Zaq � � � � � � � � � � � � � � � � � � � �'`/yߴi JJJ e˴烧ED!Xe/,҇cKj-T+KÆ {oJ?bΧz͛C/W_}۷kh0f-_<ã5'|R:t`^rn/NܹsdM6nڵk9sNHWf@�GoYP ]dłlԩ-@BzímE  +y^iSWPt7@[n OW_}P 4ȅ YPF]XҥKy, kԩ:K?ZrGLo?z`z;eݪU+Wkqa$dO<~駲�! Lbe!Zvx@ ,аazs{υ~Xh3ϔ[nn]+"p &C~{Zg-/LKAf--[�6 b9s왷@] 38{ƚ0+p9 }d!meϐ=c.͞7 s͘1nAs;r~euxeZVk"xbǻmwٳt遶fҝ? c{>SSSH*oV;<7?ٳg< PDZ i� � � � � � � � � � � � � � � � � � � � @4޽±{ izBBBHV5 3 DzeKٟ@1 K_, J*kf 'N[7[9MۋSRR*..νt?&&ƽr/^IVժU]xsΜ9@Ç@�TE^ZM4qm�z(d]BsƂh,ƂU-tu֬Yook-Z-֊I3g3:3 W{C?{#*6d]r%.@vz5w\M6M?,s3 j{.T-€ϟ߅ լYӅY￯^x`Yg}& 5~pZ>Z~-P˶??؅*U$/_c cB6>& bm۶` bMI^&JOLmVXlc-$³,Du*S<[ӿw7~{3u[VgiѢ{~oUTɅhvYeo4i-ZB:L<}R,>:f,/ݼ:h@ n}'?Ν;?Z{媝/x@3W"'ԊKH@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Q^a%%%qVӶ}p`De/շ�,{i±l^|Ls.:�?{ ]O?#Kă?K/4hAƍW_a`/-oԨQYOڋ-7@�@ >U\VFme}~@(M0ٳgSN9EV? X0(۷?c/ }V-K^@Pe^} j6mB6ҥ>s_XgVKӦM~6me͚5n/={yc͛ݲjժycABVʖ-~驧ru\ 'zᇽ�". uŋQԪUY{~ 4�rʹ"[faV?'|LD ?ˤ~=}{yAriN* :/g/,YN:$*V{PGׯ*=څdY# :t ޽ +^'pacǎչBlE%dae[ܱB+?%N ,pG*TЈ#dիWTۂ.Oh*J |F_i � � � � � � � � � � � � � � � � � � � �G$`/7߸qc +p,[{s*U0c9F~XV,{^r`fEEݺuݹ,jذap*Uڶm^Ue 6݋?`{{1sNˇ,� �D-tBU,|A\|~?qCrݺu7o 9FaR:|y}O>),5o~ /]ԭ ~(ŋCvw bFVomX}]qgsĵm@- ղ@0[or|l:?륍Y8דi%\"}2dȐ2^>H޽!y<9.*!!!dݯ[{!@u 䲒}t{f͚֭fΜ){&.j}\J>}\`?=zs.H>ճh9^ fvt!@n 3je' 5\Pao| y׌#� � � � � � � � � � � � � � � � � � � �;h:xi/gS˗/e/oٲ Je/з@-J 4h,T^_gv5|pܹS{ٸl\e/.fR׮]5ydw}ދ3xS{A3fpsv_) � @4X?xjEZ;KH,մz \kh‡d/W+WXfYjlo/ 0z㏃oG^sAwUvmBoo[0Q6mO?馛nҔ)StTZ5UZm߆c3۷ow!L ڐ**{ҩJgu`p )֬Y+W {='H# {]9R}ƍGy}ֶh¯vc{,tK.w.d+gq"rUe1Vp\=A>l߾}./GN/� � � � � � � � � � � � � � � � � � � � @d hɒ%3gz-phСݺu^ʽ8tjr/>[C=3gjٲe^(=uT}_~z)99ٽ^o/8qF{o_r%eR|;aZ{Kz.gO>Y28-x?mݫV6m^@~%+gyog�{O>?wL4I $z /rF @�H *YdZ~(</h鬶j_]zg#vg 鑎9FzqmZw߹Yo[vNp6,$~/vm: YV߾}u=z`- ߘ pJ*饗^rQ~x7T~}iӦ _V ,c"|,B֭w?Hu-V{1{>v[Se}d1c诿RϞ=u5׸*r- O>],˂Y%nVg`=䆀}DCfWӁg#mW_};vSNUa:⢨-4@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ IIIڰaC`tN)SF+VQG{ضIHH9;tx.tBbkV.\/r/-+K. ,^ {G`ł/Bo^޻wo5Jcǎu]^oW܊3ϸ7 zTN? � @4X}7^fˬtqv,+q!XZ6mzЖq[lQٲeƂz-|f„ _,u.{t SOI ="O[G}~جY[omXZ57~wuw\2We͚5n_}պ5}tuY Xie^cAZC qd…mǏ ]_[|_Z0#TJk۵k' Z] syްZX˖-mSJxh},yQ#@U57n]g!6+WԢEo˻-WhQi&hzFv=n&Md>^g 9r)>ˬؽ^^=6{7k dyB^\9wC=o*w x/9G�ySAU~_ f}JNKqt6V!� � � � � � � � � � � � � � � � �ޝT10쒲QQHRV+-Tk/BH*7%BTʒ,"T2݌|~g3fwg8{;3y#� � �  V>@,{ݟo I}VقCR?|‰h^QF)!!f͚zGԣGWxߊO<Ye9W ߊ/X V׊ٳ'ڎ֭[]7xí{%h"~{3~sԩA9sbvN:IuuVd"f@�@\zZv,_ugd{W_}Em۶Z&-}꥗^rA6Bj\$Y}O>qet]w .)fӢEr ù 5z}Qw͛7e;ڽޫo1yy4x/'^n +M&]{mLI[Gk׮JLLt>կ_ߝ-pŋF^@.Bkwf �={ [[f=B+a˛]%~Yx$}Z_'`aCӼ\r3rHYpsY0߫W/w L�1볝א!Cdvl;=alaÆDf`X˹ ;2T˾W6^ݻwwak~0[oF߉vmze~#I:q\6hAoeZ7n ٵ7 в9 ς~Y]~ڵk'rM6btt[/˂�%`?-Ƣ,3/wY]~ZЯ6mڸ? locc@Ͳ;+Vf8} jA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�BX&[-[$`e6ou0ñ,L/2-hyZ+3̭ñ_@�@�lwyJJJҼy\`i66 UWXΣI&!ٿ`u˯x,HK^HU UrfީM[Nݿ իWN8=Fw­![W3koNo7ʎVw¶j׮2/@FZv,[L;wtǁ!ٵe׈dukѳмo>/^܅YaZ>^>dW`z7eS &-~~./( UFV@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�( NJsO ,`eUt͙G -Z={jze0 @�@ 48 U^] M+%4zJ/R XҳJ^~F=7Z<G dUp*wz/.̝WH)OjСVl싖j\!� � � � � � � � � � � � � � � � � � � �;w{;lْ|k;vHqꑑ.+0 A􂲢R'D}נASO=UK,Q d竮J_~y � jvqeĄZ Zj;װaô|Re!: 59&/{ǪY${IhPkU/uzRQRAҢҷJ5k^ߥi ,YR6i&u5{Y!CBS&[+#� � � � � � � � � � � � � � � � � � � �y'pAŹPc: ):xW<0O:#±r)""">x@aسg~iZJ]vYa?]@�(UJuҥ@Gulٲz5~x=cՎ`˖UUTe<(5{vqL}@-[^{q^ K' k /' LLL̵cc%qkA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H_`߾}cfڶm,ToteE-Jk>5 Ԣ!� � �EBx r-<4f=ڼo5kv,aä. ;N X!h1H۷׽>g}eNɲK~[^8bV } /QzoU4cԺu7 s � � � � � � � � � � � � � � � � � � � Q+0+p]R-**JV >0�QF|lld D � � @X UJ s.l'ktM5j(=)WQQwS ֪]9NuJ ޫO/Az+.nF& K|tt.#6^}iA99H@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� @RRW8NVX4uVeS@XQ!Xwlyʔ)b{ � � �/`%$$>QzXb;ԳgO1 %_мyA;տit1,/-ZS͛ј1ݵm[&Muqf):ZS'ϞsF 6mVvʿpd(@VX @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@���@�IDAT@�@�@� ={ Dz ,?4+0(+>>^J>"E|PBr ։'3<3yk6_xA�@�@�]-̘Vx>r-:t ^}zۼe%t啅|9REZ8#F~xڷߡɓߑʅk@- *JbJ^w> \r>"uF?wjk"� � � � � � � � � � � � � � � � � � � �y&`m悰 Dz{*NuǦ+ բ!� � � Tzu}w.84zE/-uV/Lk~|}ڶI#GF~`!7۷˻µ.RƧo>Rv(+'7˗/)Sx~!*Vf̐Z΃CULN@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�"( j8V\\8bbb òJ.b{ � � �,+V^zZx6lX:Oo-yf 8P/UQ>;^=VTmN6颋iڴ:Ě;w,&ZJҽJwng"N9-YD'|ru$LVlrnǖ � � � � � � � � � � � � � � � � � � � ?;w,(k)"##ð DzuS' � � �[TfʹfժUp,g,qF==zH: PPvz*W.~*Uu?UOڴ9ݱȢԩSվ}{Ņe_Z9,M@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� A֭[WџҚOHHHAQD#±N<DeΗ+WN)@�@�@�v垖,Y2p1\jժ5e p1Mxni ~r5ixB! rƏ? Ӛ!C'BRڵ y#yCޘ?O7i2@ 6mڤbŊ!j] � � � � � � � � � � � � � � � � � � � ?feaZ7 *[l05kiӦ.4cMeQ@�@�@ 'wK/RJ%O˗/wG_ZUyu=GW]tiձ7"yY4 T7 հa+͞=Żg_|!/N:,ukeKi\yaR2Y @,PJ*A W"y-W@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ۷oWFXZ`p֮]R?**`Ya+Zh}@�@�@�XرCEс^is9G3gXhzxX |[;xR]/!Y@:キSݺuVD"}jt,xϗ7wn>RdTԵ- i zҚ5k4mڴ\>4XQ1p܈5@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�5$Ź[ـVT)|ٲef@�@�@�޽&L 96~x]}kX`ᆇ~.V;I[ϘS+lS]ƎPݻW(Nq&jմO%:ZJL<ډ'J&j,E�hӦի_~w$@V\@4YX� � � � � � � � � � � � � � � � � � � @ٓp:tP)r)@,{B /^<y{f@�@�@�(,&MRnRݜbbbyf+V,K<3cgi7ԣGb0Ct uIjopymy=HuGo(TK JE:K@ 8Ut~KjeJ 8H@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�],ʂi˖-ij6+_M6M^:|򊌌  � � �@d,%^zM8.eĉCߗ\6yc-(9$5jݺ7հaYw_W_^xGA:#jXycG~  {nmڴIuɅK/@VM# � � � � � � � � � � � � � � � � � � @ ߿߅^ef))))(0r^ۆnYrt)  � � �dMoժYuftM<v.Hz){ѣ#֭yYZ(#RLz iB}Tc/j*%#5k2ݥ#J+W:餓 qRO@rF � � � � � � � � � � � � � � � � � � @ڵKñ0,[8oϷoߞ&22RPBr VzaY)@�@�@�=K/T~7Yg:us(YR^ԣԷԦtURժxx_m'@ ZNzUxNޮ瞓^gy(ժ%-Xpdϊ*V|X�@-N$@V.[@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� <xP[nuYAX۷/AJ("Hed/_^)@�@�@�/Xwuq>} tg'rC)){륺u<y'UբԥԺGRJҴiRҵʭw=ޑW?YKLLѣ% !@ XV5{ѹ{ @ $A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H)a8, Ӳb~2eʤU`=Rfe# � � �Bv.,{͚5)ΧlٲKS,  xlj^4Hz1i?^{MGycSiRr[s%~O?]zek$oTIEH=zHKEC4}Z#_.]xᑯ/|rթS';f@H˥e � � � � � � � � � � � � � � � � � � �9ؾ}{�0y?(kΝ)UԫZB?6l0ycc: @�@�@�[+аaô~a7tϖ@ҿ-]wԯt%HCJjkAF3gJŊ:s䥀eXPu"{P:xpV ^eXUs%JH#F.arS`…^ vi̾+z7@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@@¯�,0+111Ź,Y2E�aխ[-Ke˔)  � � � @N4hРՒ# Ԣ!5ޓJAOc:<Գ99 e% Y l#öj|%4U;Y RŊKG�HHHвe!/A P+@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�{{f9Bm*YUUB@N8A-ZH~͗ 4@�@�@�@ ZlRJi׮]9#!p4KKoH_/}?{n?˙C /FƍKeoӧN~bA`~+%yԣGmYDڤI>G h `m@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ V&.>>dmٲ%͠, |mϞ=)"+0 c=XW:Nx� � � �/M8Q{O_~yn?&OvwyVe]wG.g )0{Ԧdnckl}=!A*^1KO>p4YW^~UHpsnbEi u<?|>HC�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�M�XqqqJJJJѥҥK˂RJjذ{Ĥ؞' � � � @Aܹyn4)PԨ4iRaZvN:`}!mҕWf-LrRǎRllWʔ#=aZyX`N=T´ �Z � � � � � � � � � � � � � � � � �{޽{o>~LHHPbb8p@/ҚOСCWddd"E_8olNs*^J(ԏTR*YY?]\@y2{SQñ,nݺjժ+ fXO B � � � @> X 8M{qc6.8Xqذ?8.fhqK1. ~r6 ۼM6z:cx?&lC`FG3..y]xeJq{6i&mݺUۼD%y}[쾊5Ĩ\rnHqի{!s5[o~[;VZR+O(Wivmذ{^6cǎ/Zhֿ}w)25YbEsT]Yk"@v,PiӦ݌WC� � � � � � � � � � � � � � � � � �&`IMqqq?o;wt@?oV, e,ʂB~1=ъYSi   &_2s>ZVҦҥKGyٲee M= BG7{C[lI~͟OgqCz޾� � � �䗀oXMRM6&}aa вq̚\ec6hx8sL5i+X?!^M귱k ǀ˔)<l8E~h 1:w*}dYEO^^ [Fk]-[Kjߵ~z`ٲ{!vחAE׺eϯY+-X˦5k^zjРׯ/ :?e!pkM*k9kqŊk&lvyף=w-v-.[3}ůe~J*{-) r.`+ϐ^7xcwĖ9Q:cԺuvo='� � � � � � � � � � � � � � � � � PPc"x6o&+|g~PhYXVꂡV΂ ({x~PъϭM0cVԱ 4+*w^WHа`1+J重|s"~U6YK V\4Gd] tWw=7oߛl:@ � � � 6ni&mVl|88Fl㞩ZH6.lx=c-\P7.mlƑƅmL 0=,fb~X=zM6{q1URE6Y`-,m[y?~2j]|{Rf#X`Ν&WZw%@ZjN:QFr\UZGqJ ;fײ]&k׮u^v['{a~Zh&-̑yG7N޽µ운kryʕ+5o<7.HcYBzZjף}wτ>^=I9e(> nذ[{5͛k>4ȚEMQFYۈ&@V) ʹ["� � � � � � � � � � � � � � � � � K=YqT+<geXV0uX uڣijb.rܡ0bVЊZhO~R}.+dhZ6Yԓ@aBbʲW/\lXcmݨ]0� � � �什6onx)-D˦P'qC?t NJƇ+YP;`c6lczl<mL@@zoZhO~ޣno$/cHRx!kòlл=sDТx"K6k,}W%uY]Yf͚nݺ^Q@Q]3Yt ײ~[=RJ:묳Ծ}{7ծ];8xP޵&4a׻ƿT8M6ͅ}*nذ,:Pivh?-[Z]wC坣( /衇r V@{s;D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ VЂV^5khݺun"eY++jJUVu~y{ ۔';~)-8ͮq)Yj֬<ժUKVDЦN8A1112@~ wNe Ͳ@f׻yJ8ct 2� � � �(`!"hrJZMk׮?ߎ97..XdBSm<CmO,loeʔZ=xn:餓d[<݊[?(}ᐭ?#Y^H'jN&Oٳgk߾}.,,En(o}1 ך>}<lwpK/TڵsAMIvܩ>TclNPBB[P'~s9.Эq!▝Ͽ-΂ZB;w[EP tͅ~g<C;CV@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� XQ+VxM~y Ŋs1 $Y!G+J!okׯO`@͛7'Yq:uBOŋO^+w,cY[n]+W.XUD s@�@�@�@�'`)˗/O1-[hklƇk׮Ɗ�%{wt8gecv& XG^z ʰ=GEEk^z~ɏ1119;8[% XȖlyR93AKDʂj2ecǎ^x - +-11 kJ~'/_kuՅkq*y~5i$}:p СZle䓽Bkqԩ/4|sXk]y2YJC ,d;Ѐ™!Ν@s;D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ C 3ZhWPq~-]Mddɒ:餓dF6oRmV2CChv튫ZaUViʕ.7lB)⮹ xEO=6jZxW{2,EGG,hފ?GFFy@�@�@�@PX-X@?l,D, ֭&'- 㱱; .X+VgըQC 6)SO=U7vr|Š>3K2eS^[V&Ʋpki޼y\z^zzƑg;w\5J&LPRR q+t%mw}rnM7$KC ,tOٳv!qjm P+vl� � � � � � � � � � � � � � � � � Vth_-HƂׯbZ*޽{]ֲed٣ZVӮY+ڤI5k=*U*́/~ɂ2 _,{[ҥew1113� � � �[O?i…ھ}"""\Hd6YV8'jOvM/n071%J$~j޼4h@[}_xڸq /ݻ:w4Ev=Zlcǎ{t9'Hǎ#Fv˺w£| 6h̘1nZnڶm;}fg2 pxu-E}3qrNV@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ L,xfΜ95w\W5>>^Eu&-|Ȋ5lM*U S)N $&&jZx~gWw.H"Sg38]둑vV@*VX!/{#2 ˲fall*TB,�+yp tb@�@�@�L`Ϟ=.<kܼ[fY@}ƍdg&y%,ͦQ6w^w6mT-[tYgeUB8۶mӰa4|p׷oYUVk(u?c6k,nZ?=Pf}f-gkƅX-c4e9R}oC+ <0c:^-7xVZ3g)@V7rnǖ � � � � � � � � � � � � � � � � �a"f}7ؔ[z+֠AY:N;4Wxai \x?ϛ7OVLdɒ3`19UD\c5J?}w\?h`<,k˖-1y+j;'@, ñʗ/O@@@�@�@�@�, Xַ~ZӧOwcec::dDߨQ "�-ݴtRs kӦ Cqr3:.۷OvFŊS߾}էO)Sv[zʅ=!C0)=1cƸ0xS{W}xb 8P&MRݺu3ϨSN PhN:$uMO>d=P?1rs;D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(7oִi\qSʂbbb\AVZe˖0jR �@ҪU\aٳg˦˗+**ʅ[o^6mw5V\C"IIIB|IH=LLLL^HfٴuVSXiXP � � � @p~g}<y Ӳ� p! ;.eo̙3G3gtmx^xnj޼)"=N7>sz뭲{E w߭%Kga,l޼y.Œ!-oܹsu7;{|衇TbŜ>Ӄ>肵:t_|Q'pB"P֮]k m۶m?zj#P+vl� � � � � � � � � � � � � � � � � PH,h.ǂy~'Wֹƍ4BHg Wulٲ93ϺeŋYX+=zhmce5[?-ZT. B AYX󶎝 @�@�@�@ ,,o|?P?xoHP|GE vޭYfiʔ)n_^zsRD|e}vGƍS.]4x`ըQ#;d#~رc]PꫯcǎG hذaȑ#UNp&ɵso]xl 8Pwq"""rx_qqq{KT"P+H6 ,VE�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(<VoΜ98q}]mذAz -[ph s7�ɓ'kԩڳg+:ܵkW]vejF{Ьwyi-Y}&Rl'xBO<+uVU.)0 +s9c(((' � � � @ Xj?^&MR||:,uم׭[7L駟O>_Hk\VTTT(t3K}駟tWŒFMSrYxkO< <N v+n: >\_}Α2Kv´>Sv\^llle%BYSN{~(w@j܎-@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� Uo"}ӪU+c>5j(gD(5}tW>rV\pnW؊-..NFСCe֬qZͶe ñ,L+ptU\9b{GfZ4@�@�@�@�!`cƌq6mȂmƉh u]vp'j*U:KaMnڅϻ7᭷R޽ռyswL2yw;W_}.]B횬Yfpwg֭gA9B-o>Y0ٳPkZ9ʹ["� � � � � � � � � � � � � � � � �? /3giӦktUWRJ,&G1c+N{)**J7x:t Eku2=H bΧe۶4@�@�@�@�4dYX^Xqx]m. رC&LΙ3UO:uRDDD.9~饗tmo߾<x)Q ,^]ʕԩSeysꫯ+p#󍋋W\E`38#$E'Ȯ_~ .@[ZnA P+j܎-@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�B\`߾}늣n߾ݻN99C |ݫc͛st۷ה)Sr-!� � � �ueog'Y"OK, /7|S5jпo]uU!\ꫯW^8p|&`/ڵS5k,)S&l`}]йg}6l;TO4!!Aݺu_ӧiӦU@iװW@qs;D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Q$WVZ.LˊmܸQ#F L+D3%J_8q7n0"##cTT"""2۪@�@�@�@�HC`…jӦ:uƞVZơJEYSN/tnM5Ҕ)S|nڴi#=\Yzd۶m+u\9NtΜ9޽CV9ŊӤIԪU+]tEڰaCn u?\;v@ o ]B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ȹ̙3]1ƧzB\zN,Y2;eK+`-[L;wjhBV8::R7R@�@�@�@`޽۷N?tUVM+Wԋ/5k�y,P|y=Zv:t蠋/X6y<_ꫯvǷ@-ZhX'|ٳg' Nb/,<k׮j߾GbP'NT ԭ[ xˮ뇦+jC.@V֭X@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ կ_?Wx DY7߬EK?c2eJСC`߅yRFN:i)_<g~uvwO=n?|A]tEz]Q#׫WOf̘8mڴISNu}iӦ*Rp-{ܺuk0Ͼ@�@�@�@� %KƘƍ' kfcu{wcllx̘1+ԿBP1Рt$˖-g7ۨQ#7wu9cgW^̴ji|7ng}VO=~嗣_(4vXEDDrWòoJ҄ ?jĈaiILI&S˖- k'@ � � � � � � � � � � � � � � � � @;|4h+'vZ[._,\lժUŋupǶ"' ϴ{R<xPׯ믿~-ۅ-3Tҥ5rH\Y۰aCPjJ .tAd۷'?x}';TvmuOC�@�@�@�@`ڴin|YfZhQ ؝uq9s渱m۶vi֡PSf͚nI;vԫsΆokZJCjZ|yg}4i.]1#V҂>}aÆzۍYs=ry}9D&<u=3Y ' @ j@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�BC`ǎ.LkB~zHt;tZ{+VL7x><?vZbڵ `[ˬp>v_n]z뭹r(+ֳgOիWO-k׮jԨ ?ݵk[+NeE<G=z8ۅuɽfEm= � � � @x |n̨o߾nD bu`l2)e7o~A0~4cK>rs߁|gk&2~j2d,lsY&\V�?ӵ<6Oz0FDD{+~`:dea ԭ[<S0_ͼ * C{v@A G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�)k2/R}QFhѢz|<OC utWnUvhvN0A۶mS^ Ya+*wZ7P@�@�@�@�.'De8q0?ciwXP 6}v.]?b?{|n}޽{ս{w :4M ]x.*.Rj$d-]tw 8q l _|ͼ|89J*l@( t %� � �LL��@�IDAT � � � � � � � � � � � � � � P`>c}Z`ʔ)R^|+gZVO?T?P|+OVk֬}ݧ$Yپ}QY޽{ .о} /hΜ9BznvUR%Mo[ =3nݿi…*],Ȏkњ7oJ*5kjbzq, >Snי;v/ 9Z;mo6_:Կl][n;:1BfݵkWW~[ose˖0`{_|zjmV7ov۴in3hpv?`fq\Wޏnݺ3f8kתI&ڲeKX9'ְak|G}Fx-?X1/R7|~ F�@�@�@�1'xM2$dzfc}+~wƵ{=׎;+VG ZDl,wȑn}<2V?_tK,(sqynw}yuEW\qƝq:묳cIsϹʍmu-+cv\ IǦm/Vz㴧~ќkZ>4k,x5iW^y[?ڱ4ۧOxt~dfϞ[-y.<G,Yčg&{!Ghv?&{Xi&zeߏSN `ݻwsH~]Z[vʾwͥwNZ>_V>KvOB+-LӾƏTG;^5c=rIw !P ;H@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�0 Νr)!`!LOBsֹ_|х*Ya?_3gt^{5ep `'+O?}z *+ j޼&OGyąV1-oՎhE1BfaLgy,¯OZ5f̘#тk>S\r֭6~}zݾnV2fU 0AԢE .V+gE3o6We'РSNڰa -3^z)y�-+Dh`5Y?+ jAaVov֭[iӦ `Ŋu|MgincdAliׯwW\9fw{nE C=AV3@�@�@�??l-X٘CtR~`, ɲH VY`n͟?uڴiۮm۶.L^CX[1O?UrܘјgZXVf4ad+w}/[f8zrZ۷ׯ*1ۇY[8#PZj`gFG{i]vn_vieccc]e1v_M2E7ntvvm*U 2>ݓ/]_~޽Aۯ]? eeX{VؚS R7 9w.-whFһٹdϬ|Yh5 ϕLF?(2>duY P1__dU@J � � � � � � � � � � � � � � � � @ X vWgI- dKݲbV΂u޴ %+0gG٣mp e˖z/ JLLLޟXVf֬Ynhw-+ٻwoW Z{衇cVھ詵:}ټ\.]=q칵ΡUV;v[wǎ�ؚ5k\ׅ VP=\XYue򏅔Y=kiӦs-;w;?"¨N=TplgU?m.l{Y9..ݵ.H%Jнޫwyf#_ys? @�@�@�@��7@Pi{x vi]jРAZY>.dnH 2O81yӧWƍ 7ca 6:l0wիW2LeÇg[o3g,\ֳ:jDb6},L(q`kzqjժ4?Ntԩ;ekV߶ ؽ?~/<L7^[!JrWr\9̮+ jݺ;`N-+{!G{AŽ/7n8EEEee<[ޫ;w*!!!ώ]n]ݯK{+Qy 3gf{vz.Dˮq.{w}g9'`/VR;/x)p% � � � � � � � � � � � � � � � � �^=F(BLϳ;oIk[/|LoOnx ;NzSV v}K3ީЙ-VTZ߬3\A@>}QFy.8ȊZQ _0a+WF 7.XdɒZr k ,zu׹-+X ~*[أ5+6Zvm)RDSœތÂ,?~;V8oY=+eVԚ{~^vecV۷oO^ٌUjU/_ޭn-+$kmVКms)8_{n6l?Cu .k׮]<۶mZX}L~!{nꮫU @�@�@�@�r.{ljm tATaZRFda'66YfM=Z7|&+c7p[7o,hҤI.+o&;ct?o /3ƍqf6jtم͝;WeƩ[8m5p6޷o_s=z5x`|fs-=㿾?v"7ZV+ǥ^4ku_x/$Q^}f<-΂[ee; Mܯ~oe=__g+pyFi3+{aǎjӦMݗ)S&s n37TnݒA[*|)g� � � � � � � � � � � � � � � � ТŸ,(yv糺-yfpYyFW;pJK \'̶5jf ('}L.b;+޽{K]BZhZ+ ւ,jɒ%jҤحgO_~˳;c/Y9rwzY=dj+V(&&F}IU{*HQ`%ƖXb cI%7Dǂ "RDw9Yיٙݙ}sm]pw}l'ձC9xɮQ'OݺEjkźuq uvV4̙3{*ܦ?oSNu&qU}M@�@�@�@j ߦM{7sҪ0j(;338æLbtۜɳDzErG?<V`.^ئM_3첋)z>7։z]~5g-?, XKy߷z=۷oHvv믿ed~-UGq}o Ҹ >L#4YMTTyYf3:ge}{EN o{WxL)13l޽{8<D_2kǂ@! +^$ P]Ԫ.$� � � � � � � � � � � � � � � �p$[KRPTX-\O^vSc˻=,թڕ*ʄ튬s:i ׳m8a[ۣXt츃~\P;dDqvi2O?.['kLV\Ӝ9s/4MMC?Mhq6qDkٲoܸ'Lx\҅,ŏQ&<xw}v 'ؖ[ni{キ%P/{ϫ^tiʞ={?]n֗lw&ס =_t]?7ް}٧tL.޽{d-;w;&,+pq (Kz@�@�@�@�H@T_M7dկaÆUt%=k]@J=wU%g՜tI_o7)ݜ3ҝPʆ G3Їz~}ȑK/%9m5<N� *|_Z?x ;5j)b{{u׹7<<G[A]_} رc>Yz|9J酥iZt^HGޏ {yVEZYfBdyh jL&ywlذa~kTϢ+Twa=ZꜬԪha� � � � � � � � � � � � � � � �Tƍp)wtuy˺/]ҍfh䃢Tj+(tǯWo~Sֶd*p!؁hs7Zh?SNK.M`͛k}]{/5jm/]|?~SO=ިcݻwMڃ>IK5yp𸾭onRM']c=4&D5{Xp?fpcv?Yߛoi7p۶YliLi͚5iM rzmEMt[رcVW]6&vg8tWMԺ[hy#^k@�@�@�@�B.Üs9YeX 9sK/b{YZτ{k/7$gn`a_K,)zzv/}~j kqϞ>h+\&{N{Mvl +_jm֫W/)e1cƸ<&OҨv}wOکZmW~R+O%\ճgOw嗇*OVvuWkҤ=vg|^]{4`_em޶nߗ /|z3,yl@y/^>;g,T'+z, � � � � � � � � � � � � � � � @S gQSxx_?Y;ާ�|-H.(JaN _< hᘲ9rjJA΂�/pwI?զMK5kV|׮N&_>Gm喥c۷ooGy)jȑjh"ΡCڍ74~8ӧOw!\Zr,XjOɾ.8O[n[ib+o.vM첋?;v4MxeȐ!}i;E <8{h9sN;4ꪫL9b;mԩnrEcuǪUlʕ6{hV/Zer~ZjG) Ǟ3g;e�^xM~ӟmWU۶m]&+_wL?ލ( o߾fo67qڴiۣ>&ut-g]? ze,K@�@�@�@�*A@ELkv.J8k٧w='~p@"8:w\=g>'?K;Z&<KOf͚;찃 mO= >ܺtRzr)g?]/K[zuF@}ׅ^>'ӟ;?^z9m? gZ| 'حj'tKTxv_,9gm׿O>ɨҧ;̽.}ߺg[mU=Q#ςWϴ*ryM*u QG>5jp|tVYGygu YGBlLoql„ TgT)8$PX~g?+qB.A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Pž֮Tz86l5o>~~=U_~K%S ^5sEOLm_k|v>-vxL+d(tMܧI5߃>Xa;7tP5o`?.Ij"Mֲ^{C=yz4ޤI|WiO&qÆ 3+DIY?8 7i5klvW3<c_1v[S@;l 6 4 7`5*=_Ƨ~5a&z޽MNKyڴ뮻MޅՉ0vڹ#ʭkV݃,2Yf̘\Uvm7iYgewSi9\cǺ>Mz7{wkP蓂4^j_~iҤ]p.LK} m/v&|դ:\h]AX B Ae}'[-زU'?qoelwyo/}/Uƹ9 � � � @ ⋦C=d3w xG\{=<sܳ8=3=^~Y!v,Q M933<=OTpӉ'S0=ԳP=u9o Adzܯ_?kذ{۵kW CP<U 2=cspgs=w:qgAϙv޼y?xVyvk)LBίJWyT2qD{T﫡C`~ؽ=zpϼu$g!>G*p*qsO>z>q~}sǻY +w[SN.,|Su~o})[YTT#O_dB 0Fsџ%|cs,!R?`RPr _y,, � � � � � � � � � � � � � � �Th1aگ벶P~~=p[v4U΋_?DVГZ}zomO �T&d~cƌ>ۅW)\ؗ X۶mFI Gٲe{ euY| v޽5k,hzΝkݺus}h֭[n\A*~gnFS8VR墐+}޳]@.M&lQ^wg}7ф\ь\9.D[ouGnvin{=1g#"� � � �)^-1dȐBAQZJ 4ggCcZf:»6rJ|M6~fuY@?R=ǽ:n3}ݛݏV<O\hܤ 3g=1BӴiӼ* qota'O߾/1/tꩧ`Akwe>L>K{ߣ-)k[YtݱZ:u\PI5m4i\X>{fALb^{cB<' P+Z۱' � � � � � � � � � � � � � � @5P¤|}a;ݯu?N=S4XNSjIAMUa>h~@�&ꫯga-/N9KaN]v=cim޼iTFJpesϵe+څӧO .|I;3//7G@�@�@�@�TV?n&;*0T]hJ͟?ڷo_0\{UիW[>}wW/翋/v{t!~}ׯ_?g}S}W{뮻ӟTR;+O<D <*w |j)k.QaE bAFecǎ5T�Z.usߕ=@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�^`zMRxTXR1emT/leko RH¦|krSuھ}_X^V �TCڔ)S]r%nѣG`&MT۬lzJ{F^&Z,&1-kb^|'L`^{=裦Ie}ٳg1s � � � �"g7pxvg[=O;ϺtR WYQ\.\n|ܹU{]}!w޶t-o߾Iôtb|w߹Giuɞ|I1bD�tisu n*J^O:{l;mw /*/RݪU+{lRN\A'hfrw "U9uїɎ:([`=쳄iӓ+F@w})d(P+JMDVǻ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�JJJ6Y)ʇS%kgMT~\Nkۆ Q^D8; KÆ+d*og=u3t!� @[o믿ޖ,Yb9va:.$ ~[\af\p @�@�@�@�&0vXSpB ׿y;>*[$/Km Ai7p e\#4СCmܸq6h {Gm-쪫ov|`cƌ{:wl]tg?ڵkywةjW]u ګP>c /gHL5ey衇ѣk)8q]zO.`(7)裏^z^~e0`@63JΜ9ּyJ;/'No- 5{?1}khj;G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�JXV'.]6m϶DsQeh"X:,>*ܞI~xje| D�@�R h{Mꫯώ=X7A]ǎS Q+a{=V/JDgquҥbNQ@�@�@�@�|M={ډ'hr/D Q.ˊ+I&)o߿n|ҥv]weǏwAc :蠃֗@nf5j}٦pBJ橦NZ^xڵkWM4mus1vmYSfKx+W,]WYfVN2]Yp~6e{gl8*U@}޽'?nRɲ P+;p4Zm@�@�@�@�@�@�@�@�@�@�@�@�@�@�17&h5|ۇ\|Uk?Fd[7>ըaVC*_\xv4=  � Pm>S׿ew}͝;v}w;\ܹson Xn#Ɋ,X`￿fȪ~8? � � � P|;teٶ^{QGe?Om۶5LE|˗/zxDӴiS/~azի|u'p {`wvi6h A-5=vX;#ϋtRov„ vG}O?ӧ/#Rࡇr3fXnRcC k@Vv� � � � � � � � � � � � � � �yV,J!WaU+u 2YlP(ʯ'k>_P,_oKծS'c  � @y4!䎚tjΜ9֯_?;vY@ gMJ?{aÆdצM͎ � � � �C@ϊ_uS˃>h/!CBUz왏p >WQ֓O>i/Չr!رk#Fz=O4?p[f~s"%Ko~mv5\:*#/"|yׯ_oW_}]z饶>B쪨^yᄏ |jMEVv� � � � � � � � � � � � � � @ذ!XbEVdc|U||lR͵Ӹ@+T[oAX[0@�0unGM4ib{챇<mwj׮]n{@.\hnӧ[V\PA-[V90 � � � �PƸqG5̞=۶f ŷnݺ<`_V`E |<|.xF~;0sH_)E!Ogy 9#뮳Ν;e8hpxw^Kn:{wlرvww_3fmvUvg ʅժU˯.+СCKHVv� � � � � � � � � � � � � � @(JAVɊB|ȕ~C6^]6hRJ=jh}탰z8ou_ F � �_o^xMZZ5ovuW}mȐ!nMd"1c[믻�zQmV̥#� � � �5W߷g}֞ySOk{ 1г:\ Z ,^Əo+ (4`�;lAYڵO?mF2}Vs9'TE(r tgШSN9ŮkժUY;+qҤI/YZשS'޸n-b ; /-̵볭 .|p ?[ns}\;8{a醱@ P+w;D�@�@�@�@�@�@�@�@�@�@�@�@�@�@ +V2[<paۇ^/׬I)\NVpU͇]pj67NzP"� �83gk&7n}gn>}"weiD 6q>pP&w8qnED&s=]V#%$ � � � � PV\B^z%~ge ڵ)d]w5=+qAι ,(4뭷reڴiwa"{5!ivuٵ^~ugZ-j!׮ {M!\;p5yyL|軁](a\=zΆ ;ﴋ/p w[ԩSꫯxzi;/ nvyflVVc$-vm~/}zΗ�Z9} Z۱' � � � � � � � � � � � � � @5paV RY,kUOZu͚6MZЫS~@�@�Ehǻ %,S5]Tw!ӰU"vZ>}{=<y}_;JSDmX<ؽ(ə@�@�@�@�$-.hk„ pBW)H1wEωK ,}g*'Nj[ӣ6p`#A -[UW%,Z 8mȑ.Hj8Ϊ'x۸q\BVSwYo y~:u.һw2IvwyٱkկӁe[(lر6f{ꩧgZ^x~3B̞~ڢ7;,r! vi/쾗P5m.@٬c@�@�@�@�@�@�@�@�@�@�@�@�@�@� V`)*Ӣ+~jU+zy) Y~ATg@�@� ]`cg}?D2e+wޮ];~ݤxO[rB5 Z>裏J˴i$lׯQ:s^lwt!q�XaqL[ � � � @X![ ך4i +ZdՊlҽ{w۷{V Rxñ P%%%6sL\BԞ>}pF\vw4f}UeamX(ݺuE\qS? ?asεÇM9WW^Wmfwu-X<@;s]pT^Imƌ.<74}ޢ{~w/ ڵknF9O9;UV9:8g;]/mذavYgY__Q`}mfh|,TٳmmnW5pAF�@�@�@�@�@�@�@�@�@�@�@�@�@�WE`K|Qoeio}:N4Dҥn]f~Xjx`VV9N@�@� Ԛ:un<M4ѣGW4ݺusEa[&t٢}+0nO?44&s]{)MEjFիW/S2@�@�@�@�7=<y{Ng 4ҳ 6X:uL*={,-zN=kSW Rk׺;w`7h}`%B޳_Ea3*'Fw؊)-m]3}RSO`ZlizqȀ<{衇\QQBN҈zdoSXv}5lvygmlȐ!n۶mܯ}-;j2k,{Gvf ;]>da5nlvyfgaQ�a&{35jGm9j.JVv� � � � � � � � � � � � � �h͵â+av0hKf͛'T⃱6j<, � � @A |WnRKMh`#_ [n T5j.]\фjքu R6{l/MZX(/Qj@Mۚ@�@�@�@�*G`ժU.h裏\mӢgݺuݻ6lVsR9Paei+=g̙3]+`C^z޽{Js}*ܹl)dk43}LKх R/]_=]QQ-#FpN:U-?ƎklҤIֺukO~bGy8qM0 D 8 䊂닏O<އ=\}s=msEm8/3ϸF?r ,eYkƌg- ҟ͹}([?o;w0Tr&P+w;D�@�@�@�@�@�@�@�@�@�@�@�@�@�V`ÆDf* *AY^:k>M 9XR/~b"� � @$w G`" Se̛76nj׮m:t0MȸV[Z![*;v,۷o_m'ʫ+V믿ެV2gWReѤI5M06M'ׄٝ{C�@�@�@�@*W 3f0k PZ`A5n=zMEϊr͊!W`қ& їEπY/ b* QѣuԩVjeK`-('}/MҶE^?,[jժK3~؅:r]Ϟ=]ѐ!C\蒞+$а_~^{5S>{>| g}Lnžu|mʔ).DKN;d;S R iY%=O /`|ƽۅl.Я\C^u;+ظq{Q w_;C{2f]}?O^& }CbIWxjٵ ΋ � � � � � � � � � � � � � @\ihQ( Kxͱ_-D��@�IDATݏ˖ xB6쐬 � � �Q`ڵh@%վ%u֕U[mڴ1kkm+/-jBZaRmY&{"l…&Մj_ELĸRZ � � � � @X| w%L=sCkqX4UVE*k=_}IKρ(EEπUF_hz K󵂴e`---Q.\<e֫צ3kԨtӵZ;օ(I )HO>QXo׽PXE/[EZcǎn"ik@{Խ)@kԩ^d{)ֿ0` R4/@4}6~^ދtv٦ȿ'L`ӧO7ދ rbaW\avf[me?Y1, *_Ph5\c+\<7w3,C|D˽!� � � � � � � � � � � � � @ h~h:l+ ˯ZPSZTEAYV�@�@�@ h9M9o<'6`'M}E!\ͣd8hN4kliӦ֤IF_2}dOQmMķzjӄ^b%+˖-3QroTZ8UElj/ 4( 3Ӥ3kBh. 5: � � � �S΍R_8Y^샞3蹮 n-/pֳa|8l¾VW.z6f<XτW\B|9? `0߳2=faCd^S}/.Ɖr'3- o2&sa[ ![ ڊrƊ*FL4.O?GQlݘNSVQjB9M:u{YS3gNi(fF .{[λۻХALd0&Ф`)-ݶ;)Kӽfz3fp!i J{w]>ҢµܣB{Q>,߻sJE}!{R^+>֢s{Q?UD9_vefwe5k[Fm?"| E#P+w;D�@�@�@�@�@�@�@�@�@�@�@�@�@�Joфɋ_PvV EX R)*~=Uea\ � � �[$R*`KDvڇEQjRp-lŋhRȰmUXakMP6JMPYqnxИ_ad>ךR%ulG�@�@�@�@� 虨a= C3bGjYK LZzvXlyX77\֭s}uzkݻn}Ka͚5s!;p1Wa3aYp:n#('$mdݻ)\KJ䂶T}Itc x6m}g6+JQŸ-}?OzoYzcL?h׮]i`R.]\R>}wަXϮ>Q[uWRϯgUo/y*T|+gʦ{ kE^8C.zu Y(sP^/}?{kw;vX6۸^'uB\>s͞}'?1Z= Jb3]6jԨb{j{"� � � � � � � � � � � � � @5X X4!El*CZaZU^ Xe6Ϳ‚� � � @Q (JE }>?@ϯk20+lO>5)&S 'TM}u5?O4ڪ}Ѥh  � � � � Pv`-=Njg VχυT +\?ͤ3a= υσ`_pƍ]j<aDͯ/Ϥqҍo6_q~}.k_}kj|ol˖mznߠ:krh* Z&z޿6*kkĺ]uVzW[}ޠRJ\m}U+)K($Jrehʕk)ˆJ\v.)_Rf]J赪CWvVIQ7c(.qߧ:,fL;j'6Tk=^dݼ+.Z%J[s5}^$z 7FV׏™Gjm[QіQM'k۶Qc’~w+MZ> 0U3w~+ˇqCP3-9Ǣ<.8}b;8{w(N Kr@ܽ ݎ=@�@�@�@�@�@�@�@�@�@�@�@�@�@HJ7|]b9I6`/Y[Xc@�@�@�@�@�@�\?κi"w?l'lsW%t}8_v:mϴ㔵=y'ܞm۟i|}qکKÏum׾_ڞ1RS/<1a_vpZRmS-ڮەq#Tm_~x֒n ۹ltdI͏Q%>֯:٘d}' v?m/lxL%:czX|Ge(hIeE!/EeVQ2T%Slx<:o$B.(pDŴ4�u\ Xb=}Z}J:_QU,jGQZ߷[Zk|Eкo{с]H Da$QVYVT̕() KJJ&kDNQڦ*zkg־}{Κ.(v["LKK/5կ?#5݆]`6`�{#@YjOVv� � � � � � � � � � � � � �U(b²>@KY$ !@,,6› � � � � @94t8tv]Bq6hZ/~||Xj׏u?}2۾N|}8vc>Nv<>+8oxϏM Džm?e2&q]};:>~LWR߫W%{R:~TqZgZgOn ZgA�AYsm_sR]GxݩƄxjq:}2if26՘ᘰvY|v/V_DzΙLDžN- ~_¶ |;~~LXv|Insǟl!So1cSO-sO/<'?~ӍѶ\1-_nr &1]_oQxEaN{E.-ѭE—|v"jZ}*ulUNj|o_DQ^_}K-[fZeŋe"3 Ez"c}t-6-4iS91C] ͬ[oM5O;·ãYl8Ǩ"r'P+w;D�@�@�@�@�@�@�@�@�@�@�@�@�@�< [kyT²!Z \Z0kެCD R[ŷ[NLXO@�@�@�(+>P$٘tےʳox|uMZsL?N|M]126]CuɎil/cמ~kMwd}ׯcxdu|Yj@|j}|d}~ڞ8/^';Ƅ�jLo=^.}u|֙OԹŏߞjۓT~\oOV\m DŽLk\?lpo:׷mK֗x_Xdʴ/ql\.}eS^[xL|_Th ӵmK)IK� � @uG}g7}՗23'1Ӧfl(nk֣Gl[UT?49Ң $2R&M]sxmW_}s|cU�Z{"� � � � � � � � � � � � � @ R&;7QkRT/Xɑ7yse-aY RQo+,AMB�@�@�(L0C!#>hD/lKJJJCv~u}ml1R9>3=oc$ۖk_x=#~%~k׾ש^~~Tu Oo^&Ňu?A|^Qm fzLjL.ɱL7>6#T}>Sqv~[6ב׻?3uߎkǭuYjnk_b70ԭ[TիJ7[WvA`ZƍKkT~{86U;~TRϕju9_xN_|[X@�@�@�@�@rVLk͚eʌf*%CqLZ}Ci3ʹVRy.wƌ1;;?g*^}N;YΝ'(ʝ�Zݎ=@�@�@�@�@�@�@�@�@�@�@�@�@�@ X<1ى,f͙hZT8\ml-F_@�@�h2_]epL|c|}~Sm}:/U;>lLJuN66Y_ż>HÇh=v}ߏz6cSXǦ~d}?R?x|l|>?>^kg_8|+Lj_W;@OQ (@j͚5eե߷+bhS]G.B:4l06퓏ZrY\? � � � � �.p'$µf~[ެ^=޽- ټ io1=6;0nJ|ok),{N:$:uj�Z|jnǞ � � � � � � � � � � � � �T{kXf(4j+0kM MmU�-ei�@�@�P0NIIIi}att\VFCRKCY븩$ ]X* l-k\~mSfɦ:uaۏי_1q7~p=l;g|\d}-vm_1av�T@<U"UK,qYuc^@xv+J� � � � � @2}?WZ|`6y٤I5l`]w5sOΝbx#߹Fc)+:+S`ٲe֫W/;蠃[nSs  P+wXrcO@�@�@�@�@�@�@�@�@�@�@�@�@�^ ־;"Q˼yM̟ƍͶ:Ut괩hE'@�@|B|QPv.>ڇ嫎?zY}lfN7.MO1- G ɤd;>1u l{Eup{ DŽר%ݸp?ߎ/k=7VLa@�P`.<ʇJUF`?`2 $ v{˖-~\> � � � � � P0.¶6fCf[lQ0̅d(bovffQ`Y۶̰!p]we|iӦFsuIr ݎ=@�@�@�@�@�@�@�@�@�@�@�@�@�( 2337/ MY%}.f*;'jſ-D�(B }Гml';Fy|`Rcږi|\uP[gspl؎_C-?WzxTO[yqj � �XP)_WFղelʕ9Fݺu-p|KU-L � � � � � @ ZzU32[Ƭ_?3;`!C,G]GίK/tR"(_21"h)0m4qm̘16r j$2b  � � � � � � � � � � � � �+Ь3>$Q͛uj֭ۦzmmf5iRǕ!�G@J8ޗp=l po:X=:Xm j{H6>>/',ll4QA %>>'ذdt}Ƃ� � PmV2ErxU>cdh<zרQ@�@�@�@�@�@z;bf<p۶`#0>ܬ^q.,1;t7;,6kР:1ValoGy|,bNVZ۱' � � � � � � � � � � � � �*5llGzD+ߣGtnfU@\`ҺuJC| bʤ±}x'=ݺfߧ_dC:l+()Ϗ -k=o/Ɏu@�@�+R@ŋZ/6p*ogXGZ*K � � � � � @ ď?ncfǛicvfovZ'{15lx[<;c6pv.6�Z}m%P+@�@�@�@�@�@�@�@�@�@�@�@�@�k? Q>l436l0k({4EZAZ-[VsJ_<k_L JWQS}TzN͏=UKzJ۾/U'>a}ԯcǷuv=Wjժhj� � @A>JueVT[VG,PH-[= \ � � � � �_fQ6M/ivfԠ˝1쨣>;h5k.[zexvm5ޣ+JVv� � � � � � � � � � � � � @ld3:5?آMͶ>Q1;QƢ}j�U @'MptEPɶaۇYucU'kɶ2{Y]NaQSa6m?:~=]n˴q\, � � P�xTeZ-YJJJڵko`UYU> ҵ � � � � � �T}7YL٪Uf?Yg_}:fgmv-fUWթS{I%p]weGm۶_j{"� � � � � � � � � � � � � ³&LHAZs&vۙ뷩kֹ3YY3eM⓮+\%k'7uRpS]QxSߖֶp{|]}겶kdyyp@�@�*U@WR]߹*jVR@-ZD1]@�@�@�@�@�@�P=xavf{أlHw7ڴsr2e6f̘u^xj'@V/)Z۱' � � � � � � � � � � � � �)4Ifo(Ǜ}E4f;`?~5i'(ըQCfa龎5Ʒ}zXY+ OoNֶvߗVTm_uZ%S#� � @5sF}ٲe.T8[fJueVT[V eA�@�@�@�@�@�@& <嗛g^f\c6p`M){;̬N2ӧ0*<0lҤk|/|7Z4|#w;D�@�@�@�@�@�@�@�@�@�@�@�@�@T`Z3fE5^ҬkWF64Ȭ&.ݍ"n:[!^~Vox >M(MK8zا4޺uL=L\%gl_=#� � P` ϩrU<*wdWjժUiU12޼y(P<JgA�@�@�@�@�@�@�1LEs<kͶ٦`._N;MuW0oR�~>#2e aZ!Pkc@@�@�@�@�@�@�@�@�@�@�@�@�@�&0mٳϚ=ٸqfQg6t{ b5MU@W˗/OZVXUNjQ ^~}FFҸqҶS ԓ??51ڵkgt} B�@�@�' ++JҹrYr Ia_N]V  � � � � � � ㏛w٬Yf]dvfe7*Z`ZSN1>1cN?+K`Zv.2~WY<U fۛJߘT%) *ڗ G�@�@�@�@�@�@�@�@�@�@�@�@�l^3{1'4s]F0>l0֭+8_U (jɒ%t[lZMܮiQ5id+ߧ_Tm`4/�@�@�&*ߓrY€x;UM6u\? � � � � � � �"^w嗛mٽW(WuH \/N]z)&.amlƍoZ:u4j)cS2@�@�@�@�@�@�@�@�@�@�@�@�@�/fwmCf  bvfd֫W)z�M&pBW;eѢExbSZEAZ+VHzYfּysW[oښ]}E!YaY JJM' � �/XRjWf|5!SK-@*=ȏ qY@�@�@�@�@�@�@�'}l~fv fbvf眓sp \tٖ[i6o?aQSU'&Ol&M"L^\/9e-"1.@�@�@�@�@�@�@�@�@�@�@�@�@�,]j&GqǙf;[֭_joKQ2/_%iVZY˖-KkUZhokBwKz6;&+ � � Py;*N_+jÆ Yx`@*+@+�תU+g@�@�@�@�@�@�@�^k�CM|i⻏zO=evQflvf|U^O?g~sT{/Xfb6thݼ Zy` � � � � � � � � � � � � �.+_bv͉h|fj֣GY~MF?g/\5k͞=}W6w\qFwÍ7j{k׮]iiӦm֭֕[U(HI&@�@�@�+& 5J>*)OXg`UIoZN� � � � � � � TWM yN ʣ@a|Т:TEpʜ˖.]j&Ltv*.rݎ=@�@�@�@�@�@�@�@�@�@�@�@�@�f7`vef?tYR%%%G{g|k'6sL[vS/;wCNV[ٖ[ni[l+;v:XӦM9% � �+> LUVsZVl0* R<T߬Y3]vx@�@�@�@�@�@�@�f`Qsϙ]onnk3x㏛կ_T_c/+K.yqkCMqr ݎ=@�@�@�@�@�@�@�@�@�@�@�@�@�_uه]tokQ`S5"Yf<`?[b ֭7mmֺv³jժUDwǥ"� �@`ä|zp+ܾ|rӵdԭ[ׅf8* SNx@�@�@�@�@�@�@�dE>O^}լgJ�NRwl=~ج^CP�&Lvͮ=zt\PYj.MVv� � � � � � � � � � � � � P >l:v(ɬGjpSEx /qY?Omذa6h k޼y � � P^Ґ|RAW Zn]ַXC6lXnVM65]  � � � � � � � @ >ll749#0Ə71l߬v:-{Ⱥvj=ժU<c" P+@@�@�@�@�@�@�@�@�ޙ}7l+D$-ٷ,y, BeIBD!k*=H Y"$KJT_6y~羟3}=g5f9sKD@D@D@D@D@D@D@D@D@9a/ ?qxYg)QrH8in)!i@Mqy瞋V 3sR5p`5L3_E@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D`LxV^eM73I1IneZX'<M"U_~_{+K@ԗ=JqL_ aBaWY)23zoqƧ¡N99U(E@D@D@:G !;Ju}֥HXJ9z_^tڜ٬4UD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@M oBXvv53tJ+UV Cl7 /0|[ ^zi Ҝ ȡT]*@w{C8W#p2׵wuG◅{)nԏgY\s׼&64' ;c?_l9昰 +pM7᠃*<o=7ZhK>~w8O<n q'_3ό]tѰkN8!|È˧nƖ_~ꪫG'~·>p5ׄgy&BvOo,=jI&>yMo x;ꫯ> AYW]uUկ~?7a6 r}s3 g' =}܏=#,#D|ᡇq ,sp'z7=\׿?»r˅~o^#8"<CY@|_p+C?Xe7cB;,a-[g?وUTO_G$-oޛy.Ф|ߘE2]#NO~ңm/})b |72Y#<up}7 ՟'ưRKM :g1o-=hzmWO6xc۶MHWl馑Ud?]|hi\rI/9Ƶ:a~> ۔M{/j^7?я'';t2zx9rgSwyg8sË/^z>8װa?묳s9",O?iE]N fȝO9yq'3?F\ ~,>Dyi;'#P=s6󨴼3U5M$߯}keqI>f}7R]<笳 ; @;N/%X"e{r;wqG4i첋,Vկ '󂶺0;by,JY=|9OYhRWEv]=裓)Eef~</۔:a:=߶ƗAmh-c}ݗܛ1{Gvm.>φ{.MoVQy2~?[GiXl4ǘxi3K+_(QGϰg#4~ݑumfXsDtt7y˚v);c8sG矇UMs<>M^R6Nunz_nԧO14-ϱZѷyV[ǝ9U~ٴpo鳉{ O'ݢok_8'k>E]?{ۺj'm?yDmiݏ=ѥ'1�0@xhZW9hvQ7F<Dz<6;l!yú[jH'm&Lptެ]y4w/l]N:.T/A|IJyFĽ|>wM\Yރ5mꄦ6_E8mt2sNxh㏟l̫{V=_,84呟Qw'qC{A.|S R~˸Sη>W2.߭2xOV#m5sݷMǧ6`[UN-?C+|_sw+g3<si4M:V|۴t_&ϖևxҭ|Y7Ϳ3<8ߌsVAn'n<Ϸ0,HHGq=s*W[ݘ{&g<om-oR7<UoWaAg3)+۴:y^^O.mS^Q+iYɷ#c͑q9cd-x2e阙^פ}8_X:PosMznw]u)1~/x=a*`$/ͺ/8˲6b}i6ZI9&% aVg/^BwShI*4EㄹS,3+2h1sXЋ{gdfL3;8v@fƑ33s1 "9Ǔf<r<S'31 ߔ̡Hf293sJ}̀dǜDdf"k334щm33;?|e;CSOef8I2Rwfxb~{w/ڔ91A ef%:Ңͥ6C;Q.>PA\f*2s[i2r!fm7Ôa&eDY"& A̜?df�&3gTslF3b_3G9'q3L/9UF))9f\-'>؜j*m|�d/_B̠b[s뭷^f9n?o}fNI238sFFfTzri!}"!9w3뒸kFv衇F ^oJ23ČdViC.3Svf0"A[,tύ7<0#(ųt,}~Х͛1lmD]o2b?eFϘQwckȟESܺ?3t3*9mߌ/>D4Xz_o<g/BfcZ;s RYTלkIߌv>6t9zz7o}[9ljgW1{[ 3=#?ڦݦKN|ӿ̮7Ρv}Of9;uaNb6U9kտ9Ȯ(7ceg~`IbNO3u"c ^1 mKf'3lqdzyzez[e _H'_!d7Ѝw`O sNf+R��@�IDAT"r؍5h1>sLsNj.[or#ܐ:8 O;r6[|۪GV[5zgeFƌ_  9Oq,q#}Qw~+@sc^_z ';@$<(m99I'3}cnд/p/v~oìtLl:=ϫ?m3ηAўiM樦ތ9<iNq@91[|ѽޕW^X&\# o9XyW1sӹ"mP]}s܋G^]t 7?k3i|#v2/Ηו&:cGS%c΄>NC68xk7m!m R6&ږk;ȏ;et׾WBgm�9EAkOq_b?b~:.ws0h[<j\}/c^GzhSW949O42<1SH|lQ(m۠tl 6孫öQ]T7DG~e}˳a{hkFC]7յMC|L;# ow6<;+yc|-gk-,tӔGw'$sѼXӅZ&m-wMx}Z'8Җ_>;k;>jE<s!K/4;XG-xQޢ OGӶt_#ǰy-xfﮘ <H|N9<HONǶ CSmk-WW66hSy`>^ӺIeս *ҟ.kEڶ ׺m eb4Y}RL|/{B1嫚a׺ɏie:XVx]6:~Mm,[wp8˲u, GYk7^ۙ]^g<VΏ:Cgƍ̉]tIf8]]KnD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D`!&9d^.3NʉRJ\W_}4Z Mbaë_O쉇8bX(`efqpRpD7ŐV>P7p!5$6 %uu0iQ6 ΥviYgxμ@{v1]7P/CUHo;s\'kk1Dpy Po^ԁF9+yh+h'8H>fx?NaÃ;NNN3vuxK.  rx8aybG7O0nlGqDzjQNwF;Vps5H2o馽c5t W.:KC~dNF._p{eA;[.2N<T;п@'NpS4Ƒ[>`Xe7wjimy6M C a:JQ53Zр:N0uppL1K =Coګ Bvj䥗^::clrVO?}-mzsVO:8bZwuC lFY%/Dg\I$@6GHYq(Vnfcf69 ʇ3qAd?v<v^7"}ُZԀXGZ pQxG¢kpJ4i]9&z1M}䃾2ڳ x8x\oRWmv]yMϴh[fU:|s_4KWMGspøk;F2]̽;-VX!G{ȧE&bCM<<T1a;d0PS˵]tGg6ysDdy6<kzu^ܥ{n i` CfqiȷTwύv<Mɳ-nmU5wǝqKilM/oe :.m?sߥ=7y.7?!m]|U{tX>^2o3fC3<E۲K26{^ݔGzoRm9ێ4aWoU:'.aIܰ=4msmQT&<wmߏgw{m<Myr4ywⲴѾXӖO:nҖ{?OajUȏG]Ƒ69PmW̹I/m_oO٥ʹ_ο2n>gyRepC['蠅c5ёm°m=:>N7)@_vD:Ejo[7u.wU7kK(钿z<*]7]7KY=4}&>Hsk]̶}v4}t.cUg mƫ.2)mRoq6߲^Kf_RLܿ78)ZW,J(ep)-9βl)2J}k X0mC?+4C`BC8lοF ICՋoNzcinj{3=DrE馛.qޱ׾a9 氣w,1' C'tR0cO@}3N~wc=3C(qߌ협R&esiG<_b7 oӓ$ ;e3[P9D:ceoIw݀,f #|~sK8&kk%1xY<;M?=8O9> .lُL$QͰksle�4љpYgs:>Ϧ)όr7d-9؊Ü}xu^?זmm f2|3_b,9 wuWz:ӝ /ғ]Bml+/xXc5R'Gv!0&T\յAG.,%㠸ob(f$Q˸Ͽ~7ĭL|o{o:*< nzOW38G||nӴÌD3ө f.p3N=`F9eϘӊO}*1Ȁ9df,-3_~^-yV/0ߠ^L=B [,w}h[/l1m3 ̑V, '(#@9ɃN:al Ua{b9ye0"G?Q07Ŵݜ 3jb-7g^1_3pv=O{k9 f.wy>qesaNU3`7sdIf0aE:i7|7bl&}mu#y-16FжӐu皖'At͙MDüԜR>m;ށ3.Y/zBP^<o59MY(ÜiKc^mgu+lE9\&aY Fx?ExG~0Ϋuo]>>bf>0z#L܃qbg,=}+_Qgܗ39S<ޖPs|[zm;zN6:9{<m˞^˾܌w�m#Fz_xi7]!xvg3Ln]U9LϸCmNg]-gz繏͘ݵ?0Ͻ^,Ho9֥Cvt݆1rZtEj4 e:m:6R$wz GzoRm9|w21u2)ܳ6|_?ts)*WQ,Wvֵ+O^zݑn\ٳHyHurg:w34':_lj6s;/kE|ά^TNt.1<VD~<*cQ6Pk8Wďi(s+/[ՆGGg%ih.nZz~ڔg6Vy=]:.OV{sγ}g4]}o9mtdSyɰsҶ.v$߲6׉E2rjt2<F͟vFmߥMx-xhկms</m^Wx<$-<\hjeש[�O׷|coxg M+wY|ye-ꔦt"==Og͖;w\/gV[X{@y/r˗_Tg9Vm,kXƚ֦)t#0r~4t f:~z0g.!6"c"0馛_?:I /L裏qp}aiί=[[|s/_|1\q`}'T'}aaҤI>(qu p5FR#oϓ3<tJ`-oydy#~;?r 7#9:{gk-ϯ;9 ʛ<C?p|Ɠ (v68"\~UeH~񚭷޺*5yM/A|f0d!Ӎ7VYedEg8|~+qᏀSօ\0iKϵe6:!ML#8![Rַ |m:r/}K6ָa%1Оq"1!m[~,֝O~ӟF$78t* 8y`\կ~`0'P?w/A Np㿓O>9:ocq p`3uY'ozӛw]?iwʝ1*E\ r׊+D#8kO ƣpT<}qFХ*"n1 k\>o9~>2�?+c*駟8@nȈ 1 Y\!'Fޤ^{E'8bcu{@ VVphk q`/Fh6@=ث({Eq;fV\#+2Ι0t]mչXEOz~Vϧz*:(ҏ{wzv~B¸6#vX##;/ܱWjlueVsè+d/.b&.ܟ1n5 E_*:7H^M. auWrǙR>88*tAb38#s0KCQsܻe{C|iUW:EMoi)뱢~FZ]yd쮛p޷ xh7]!^"6~mѹ~SA0/WQ(*/:צty6UߺMSLEm=qftUVvfrLc\Ptr6ؘZ_Usi)ޤrDƪ2T++_z<_6m0/yFSuQՅ~5sM{]hn~<u^wUO?>Ϥ>ϧwU:W(;w'~l[Tc ^MِFgJ"EcEsI?WV}yfEX[~~jS^Qzg. D9Yc7 $<)AR/ E#mysM~;3ߖE:<nEr*e,_恞&N#moy?ϧݶMp 'uΓnFe_~96y_Tǩ|Sc1s}T1:go|q>ch:^yU[ŷUq9WS3zK#?g{[#͚hkXӴZk5g5uìf2o?y9k_8fԇ>5/YF!ᓟd<~9sO?If�Ӳuia+e[_ͺ`ksZ;ߤΗ0<b=;s3ȧjOS\[wޙD@:Ct#am';?A4| I6h }p# kFtZeY4p:y衇p1Dnl?8x87_4oV[-i?ODC1}I'E{otO?>q[nV΀<-yS|0aBtL?S" a-狜bX0묳F&G? :PmA,ɏn0(8fk`|99iF`A<Y(+C^jue+ENDZ  ,op֯L;pPSț1Sj09ZaXeTr(pb (]hTƢ*]6Fgy] C *#!DpDQEr8rBG_ע p)1āS 0b M `p>3+¶nǑg8zqlI;CL ǔD rG??s1mUa\29>#i{:o!'c6-k1C* Xq|vpf%$ι^{= N\o《:#} g0ZtE{N[!?ƕ} j/mK6MXP';eyz}1K~Utэ|?qGT鑦Is]W=;2}+_Ė9b-볩LUm,#Q . Ɓs/?O«^#=֕d۶}/d/c8JQeC8#. MJB֦s\c/hq}Jp's)Ԋs ;{I<pnxΡfy怃>ۓεpsމ_ѴP~uk[꒹y(msmXo7]!M(cCer<&}ϳ 7'|22g$ j sM9?ARe2SWME9tSeey<f{W'{:lӴͣkú2]4tjLu&_]G}|j>k(KQ`^{0~tSWSyHRwa) C9{(ݖXϗM_~ufT&S/=nWU=ױ9ׇʟʓoÐg.qCa"0g. +m \mU.=ה L۲xaqmҷRf.osÚz^鶉l* fY=W7)Wz /M~StOݤ.Tߪs]4ϧݶM]ms:^H?ȲͿkMM uVŪs\&ytjY&:<[*x?SYɣn[ K\uU.g B"Y֙u`<\+ukzZ\GNYK:^:pҬ 'kxq~OqhYk9_N2˄pÇp92WZ;_Wg\vpνA9ތc^z@jy؇?Fjo~Έ4#` qD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D`'Y6Yv#jm*3V^07[h2,"Zkasos@o@7^cF{Cx>^z[n[8?#9̩RfB߳9#3c#x}>׿f93'q ef53/GSNԎ}#ə y�$3,Q6sL5"w97#uf.f�"GKЦh_QyܲmN}sϛ[L~_v{5Cb1q<1,8gyfz8ό 7]Wv1}$s9C`N?zyokf)71jW`5\33g?.ˆ-ǽ^?fp-)t`'E˂9ʨ˲@IVEd#_m> d{l}2G#MR]ۊ9se0E(YO<s0ef�;3U1_xQ'*3PYgA̜e%;#{ԜAe@03'_fAb=x̜DD!8g_?e\"=};ߙ#l%i1 zamc$mSTF$?< 1ӭf7Ѩ[/׌AIz�su zu9Jo]fA,9!0gc W_=3]tWYg[&;\G1is^v/gF"~bW|I^X`';j>@J0+,߲Uu5^?Ug,3=ooEfc|}^<.2G}=mM 95N1zFwsP6s Sеﵙ¡j.2a6%tz]m[;7a[7.Ş t 33.&2yZl+R1gzt s=3R=wx6<{5Y;EU+u_Mٯ⊘yx-1<ᾬ*vu&8,nr5am8M&}gn ?I;t^`@33,B F^/=V~";<g=2p ݘeir?X4SW]t*6C{ֵOa3u3zn!&J'saU:6{^݄G?uXő0n3V-'~jCQ_d:wĻd 4isksOm*O]f>GYtr#>'my<Yo娚;iSS|P+#mtfUV/SU}6[Eq6~Ƨ.S*|k>`{!:hOW]uU>Vi<i3]W=uܦoy`[Ǔ8M>'nQ]1;]7A:kʰM=!񦺿kՍ/KN$.uS삲 6kҲ~Uڟme;]oR֪+,=4}&>H/]:|h>bv @N2Vu}@y+tkU_2{?Y\e2Ӱ*J#8p78<99X;Fhƹl 9ϊҵd.bd<51?fosՋEL2<[? YL?Ih*3R[;ߤήtyɞՃ3Z;?:c&Z "X2f$4ɏh۔D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D`'p)!3Ol3w<0iҤ`έ5E0#, sDyM}<Ow\rOsb`T%\̨~. rgTq3q{s͋/qA<f{9& īnj1R' $+x71g,>DqpOF@:H9KۜdA63^Z=\w܈˩/s=7aGsdXI8C=^x^>d#^f{[om1>u`ms.c@f|23P}3ᩧ fwM2}zjbe9ȟ }`ƕ{NV>Lys:k0'l3zuG)ݦwi+x0t#<_w�aW_̐^w!9裏zh0 3un>3̘_0FaVf$+0NX;3nD̡U؜D=iVoy0C$aŌ3lck"q 370s̹Y`1'V͛Ǹ"O?=h]3n9 f"?O̗m]<y_s=7.K\N=`AӜ!EyP0C_'O]N< >%l' !Ag Bg(7?3T9<(Y41iPeRmdvi&?оi{2]̢un$Os<sDMcVh݄'Ce _6cXi|v49:spspur-"mue~8B]*Mn~e &sky`,O}kFFya34im̆ ƄA懌5|ߏIS&ӏhf\%<Ex<NײS`<y?0^~Xm7]!]9-Akڰhw/l\Eqy#!ꢨ_||&ûAԿf< <w\|~ݠI<̡&[/|؜? CW緮 {^]ţzVW*_z]1ukyf{.<i4뷍R֦ad?=Ȕ{VG~MB&iTiRcib0%5ʕ&ߧw)&H6 Ƨ.olwJ̭3`N;d۰^I:h3hpm>Ƽ߶٤kS.F5ՉmMh}?6.W6m_ʞۖAl]nL]w)KU^]~:4}S%εyP7^ B6:N~mj?m)\` %WY3!)dş_|qzp]]+֌q.[:-2e Y g}v>`>5'}; <Ggm7Z85Y'7}ܖ[R6Y}!vM:q$kTQ貵3sʚK2*O`P " " " " " " " " " " " " " " " " " " " " " " " " " " "0 z9`FpL4`<C^{mK/O7q>8 )|l_Cpgay W\ Qpng`(SFm *2NrWLU NN:):OIༀ z׻▴agON`1=G|?L3:Ǹ9~0MG_:Mm|)h8b8lpŵm }E2!W}„ .2F;Pk|7ƕi"]R<Amr[뫼L^40S0 !@1R76뢃(Ѓv< \- F~imc+82xFc ljE]tD<֐ct:] :(gAE` Ɵ {WJ\8}{_>y8X0XLfWXaՅa,of&Ɏ>9"ퟱzp 'Ĺo:f6I8mK-T8cя~ǻ믿>,.㧏]vQf)2_@73N'>V1b0Ԋ4Зq\x= ~{8y0A8XveC::EL<|*.k[WUMu/skg7G>+#qG+MoY|sr3 qsEѦ4i2=^O0y/͋!:' Qs߀AnCI] <aMC ل9-uysN\qɳmAU]He:Nq]u_R^B{aϫx އQyUʗ^tLRM<k(KsPQI{AѦA.ӺԳ4t]ߝ4|^׮ pʯ\rjzh:~ǧAȟ/O<'?q ?c.3ˢt^I:]Lk4HYǫ]7u6. `QU{n#m62kS||U6~&FhlI>7Mx풿_n˞ۦq$2o˱&UilwUeg Ui B6:J4~.pu3.9J+;U!]M&k=u88qb[eUGK/kYں̬{)qm٦WueilIwI `8b-zk}=W]FZocΐlGN׮폑j66۬&N4%0}ӈ'" " " " " " " " " " " " " " " " " " " " " " " " " " 5ׄ#L^>! Rc�ix3_[pC7(xpB[PocR>7!aPɝ,2D[\8Rw{<:`£>P/?h2apA61Z=q .`PWa2v M\s[~p%K`j ˦D bp*F?Ltp 7ܐ?ӟ4?љ?X`q_(Y%6ʳ>=yOLcEş'S8袋97xoIH{4-"`n֋%HG68~Cm ѰřS0HQKgNlAtM! 3<gx ZS]:3G,HoȈ! qˏnǰ~D;!;3:pi㴉>.׾ep ؁c #|5.,\x:`P _B8ꨣ¹)p�ʿЙcyYg7EDF 5Fi/0op0ʮvYzi0ޥ7tUGX #܁-^z[Ϙ$&m(p^CÆ|ene^,D ;c?heaeNSǨ^{28r8]/0G }H! ꪮlo[WuuƺN&sk|S-*ku鍵"p߳;{�7VD&hfK&q=JmCټxeg 8rme,?VMyHQ5i7EץrDyÚuU}{cWM=W^e x`ϠD[AUU+A|]|:Swzu/1uJW6uYCz~9JQu`]hQ^@ooSMW.xwRWc TϹ:UiK<0߭yԍ#k]_}ϙ~?jꫯ{׈<Inme}P< Ϯmfk?f^3zwߝO&4"TAͺzjZ|r㤿4.Mtby &-K;4n~Ӭ8e۶m(~'Ey+,]6rlێU]A&cj{tBAe-)MDMM碋p=摵|i(Z<~8lheY[Z3@ЇX'ʽ봫 X_ʜSm\~k X'^w?l٤>.ԧ+kYo=̵KDJEkUgO<D\? +ԕI@F/1K/;o<7S|G|`4,u{]t8Pּ|ᬥ.Xe _Wc S2}M]w5`.g(N_p(+b<eRw@S'V_}^qc'c8 G??62tK\ Uiw}1)M 5x13Ǫ9m,|ߎ f}P,^qaᮻ9*"ɗ/=/K_.@H壏p 1/}K#l8r#it/Gs& pc8>`8c0N1O77\shcK,D [0� ?0 wC?C~=aXa聾Dއ~xם8ۃ?8좭7NSi_Ԭf>e=`䎾=M;pmXs$ώ.RV{g/B>b }L8ZlŢ#D 9ի_(e+vYM:jĉٯ%NUZ_@Ȑ]k̚}ꩧ܍bI;f?/KUH&;Ml9>sEwI9+:VFvu@A %2gzmcfem2]/#}5̧.$/o]fqσ;`\e&?Ͼs9"l7l#8OeYzG=ށN_^;(u8o]h~?+.+0rm)SًNYͭ;Z}i]ֲ:M}~_=vq=t['S}?w~- s;_?:Uwm3!/+P6qTñ0NxvF7V͋-yqij w6x!xi7]!0(Mݤֵ<L]tXz}x~۾\ɟq<8fm x__.N㴹.0N��@�IDAT_?ww2OϷO]uiE uM7){LUiwsiiY{i=Zm<ȔƯo-iV_N|[VN?[| 8/[۪{m<UrCw c?GuuM~]YYf[ný-8ڎ۪.+lmwҨ3KVŝޭ:3§jiӭHOiO_'q9w݈hQAOGцg63=drͼxNH+bq(g_#ӕm֍.+۴,~rqw?K,/?[Ӊm]L^/[vm񑣪 um"m:szn[{DM[/CiEgvr2fvq{S4XC Ȕoi9tJSyUoS9 I5ڶHBl:AwԳj 8󾓶[?=qpUbak yqiZAʻs"fi-`:עz(ly^ЇZ??0 =蟀jP)qW_̀q8H b 8u{Q)w$A>CO?= ?p[~O1Fqꪫ *kWo{ۂĩ g:!v)(~AJ+^ׇ-2IvI'?H2]tQ4o|#| [mU85?8SKŨ'EdM d)Ng8Xq >x9F=$w衇7=C/>h<|pwI;ho�K9]`Im򗿌gZwc]-ᔉ~8*(;#o1/˕fOq|ɞ3)skFtE '995Ζ08iҤpc ޟqϻ;pVpq4⋇_?-7a#38cl; :δ$ &&Lq>>Gyf� Xw Ĺ! 8 F28 r{=B8B_<0N_>$ҟfgy&R_:G|8"1Mq"d!ip>Zh9 P"}X曶9#7 ?XMrӦzFК cXkTOVz'kv^y뉶<F+m}7 R=^@A`<ҧMH8q}6+GY;'4>uK?bAO9t.Џ,u<l?$ǂth+;:nL)Mzx cIqNu<p:3 0tq֏ͣ꯶zYfҧ.Nvca:y;w~ڮ]p=#hu:8cʽ^/NӶØeG?Z^AՕ ?.[W^( qht J|`v 8B%0Oea<?8+oRWqߦ}9'bnsڲ6Lk|f~C8|&&K"rOni;xVsǏuy̋1 <8Cn<2^MySvLlֵ<yٚ谶!G.}y c<J&r< }|ܮei\ktjڮ:Il;6"z+.cwj/v.u؄d۴|:e}DUxEc+{yok =Y}<\[u֥.ӵ]u2~ٴyV,MC4]v%~XLy7ó+椡m{pS)s>j: sɩݪyq-?OLyw|j*W<^ݖ:/jow 3ڲٵP]W=Cmmy4 m浼bw޹wss9'&Y:<m"Wz"> o[axh2vzĮu; /sm9ڶ -]wm۾[٦󭗨 4 y~Mcc1m_3Nֽiʖx]ƪ.ڌW]djSӥަkΨUc_krW]uU\yO`-㭷Rkr>]&k`!7/NϺ4C gyi%,!mN[G[ZEuF ^_XZoc9眍Sv5XET0 T=`%~"o̠wfN23-R٧>>Uf.6c}<>Og3/} 8fF23|3".i™9ۇڙ9阡M3-1-?f33.?֜dd%ʈ\'3s̜E[o즛n]kNp29uxvz_rf332Y$,y7",!OOV=3Cx8d%3I\slL(9qHw6?9q̜MĺeaN򇳃:(Cn6cՙ97̐vf2s^ֻΌ7z9͑Rf 23pKwPH96\cܲm&;coi헕f83ŹDl ȋp饗f-3T=f83GP9JfzaKf;oFܴLw']_ҡ~h30B>g>툾eƙ}73Gb>i/oy[2s>8̜6G{y9e#m8'R}V9؊L\**T՟_g5\3Ĝef%3cG1B5)3ru׍ `뮻flˣrȐzc &LPEf.m4e- mˏ>7gO=^;3CiES&,sK/-XvWQc{N]fhq`uԳ9r̸[>e5zӣQOG3i(ӴWih|[ }mvi{e <[3e3'Q3p[o,Mʙe<g̜.dfFfzDX8]UT׾6ȟXq.58z)J.rl&=@sWj1W `eG0͇:-j[E7?j\zrPe6VK~bL/۸s'/9 Ӆ[s̃ft)K;$^S} vƼ]v?W8<_̹֕hQsZA }8YW[5ྊry0Lέ?muQ1xAGsآߙk}mݼJPoIzu2{e~byG̫Ru T?bL` ^!,<3}9MuGg<9Þ>lse^̱ܵZ# s!W3[?ێv+i7i?,nCmU:#vq:M# =DzM}k|,G9/4AW< M8mZWUvd^ey*ʼ 059K:ILÞW72ۦ5m G4S_amg<~- U}j1~ѦNvMtrZ_MywyVW>lS#vメ9s]{Agö).:Nr7vz5[m;0>y6ޥϵϽe[m rgO-ϚxXH{s>g>6}0m6^T3]Kmi9دv^kswIHf/GdVGrq[yރt{vN<묳z),FZf߯jiz߶M|ɣ٤۱2cEy1m]̦zxr<c U.4<~ml㍯sjs2gU̵n*]k;y36q̍<lҤI#}_ٗqfe5$B{e@=N:)"d5YzOnH)ޟ֜4UӴ/f>g#%[;3nU/3$ _˜5Mni㏏~Sg$Vv:;{}{ɬ"Y[37ݖ~ɔL/ahPön<`V; @{Sj\s^̘]0NE<y3qsj̩Q0'*ce;&C`~3X6"ͩE0* Sĭ`s~5{=I8#޹c0=Pl4Gc>ޟ\z<}Mރ96Yt܏s~ 9f s87�/awq6fEs6٠ /$#c`*2CQ~/z`NnZd6CUd7IK:k" ´K`q꯶zrd CsZo H3K05հB:;)3ֽ�G`JeO!tSmmMyXOyƺ;|61VN~.Ad]bjC1oҘRǚPW׷Ytۤ6MkKϼ۲A/ƻz>Z|x?561'ޅ5 zNs><_Sky-@|/D.\<$8F'zJ ?Δja)ō9VjcU~uL^N]ڱVo4Za&N-lþ`z,f:~8Ɠ9W62.;/Fnlӿy䑸fH~׉{~N꫇p!rLUkkQBխo[gW]uU0aB8C?}oU "P)9*E" " " " " " " " " " " " " " " " " " " " " " " " " " SC?-+ϒK.6ppaE!8S.n喰RK )n;J|\<iz8! N V\Vl}\`A4{\sM9< ;9E",nW oq=EdP㋀ju_+E@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D`[ZNHa |wvm~G*uz4_|w`ʡ^8"O9jU}," " " " " " " " " " " " " " " " " " " "АSO0 v[+mJ8Y$SN aݦ4+{,L0!,RaĉKxI+tq(DZo3Gn[}UW 7pCy vX>7>`xf/CCTzYgU.8]mi9K,~_[lp+yƪ {ox;{gk~p7g}-'a9C4)dE[UTWOS׿BXtjqcUG.bC# 38#|C º;@1曯Dr4Bx~. $g'0,M'Bl=æ,c9y'/7<<Cᦛn3\im" ZSUu0" " " " " " " " " " " " " " " " " " " " " " " " " " ){"G'_eU&?#J`M6 ~x8CC6lTWf" " " " " " " " " " " " " " " " " " " " " 7a'6vb1GnoM|-ޅǎpcL<N^{mXhƘG^OESD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@u=37?nrp%LCn5W* =S6 OO|y**^{:+\xx콃@)CR4:!" " " " " " " " " " " " " " " " " " " " " " " " " "0 <do|x/Ŵ%qxm +_2˼TkH%IeÄ {oNǚ^6M;'>zMSeWaE`,CP AD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D`(Pk(X>>w1 CSZ>b]]nׇv:q 9$ÙkO?fM!)LPkڮ^D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@jr5~gZyV\qHr !!TPisJI~iȢc ַ¶n;~95HD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D` !գ 6 vm_ ~Ùg9@K_\s-/T1G`]L3]>5cN襗^ ;c8Yg%gZ]OrP+D?E@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@oKq]x;7>.L0!<L^D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@# aMF{<]^hhNB`ykӛs9'\r%a-VQ"0f31SDD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D`wmzիqpw]O /hD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D`'⋓B>$!<`W\1=6ȣ>V]up7k&L0aj+#㒀jj" " " " " " " " " " " " " " " " " " " " " " " " " " U>C8v5!,d[u΍U+r;g%W_=Vŕ\" " " " " " " " " " " " " " " " " " " " "0. ly³ON aCX~&@}^r9y&CXnlTnְˆo{p"0LYOKV("p9!qDSZcBi^>~!,ho<. lA8#NU&%X#0!<do|cG&0!vX{5֤<ꪗjv]K/𖷄ٻ(ʵwBR""M@P@AzŎ "HH xޛ&Ez ܏لMIv7;5fv|/p5jR^=>}d̘1pKs"ٳ\)ֽo' rR@�@�@�@�@�@�@�@�@�@�@�@�@�,Paôu´Ҥ)]'p~(Z̝;W,Yb >.˗N:m1!� � � � � � � � � � @0-[Cz)WnbvL <]DzKsokN,ҿ/_65{,^0tK P+\J:� � � � � � � � � � � � �$nܹE{N$YDj%SxGe2uTٴi*Uʺ}% @�@�@�@�@�@�@�@�@�@�(cGؓ9"N\.ҡ޽a%"ˋ)#7 O{7l?תU~˗ ?PW'p# � � � � � � � � � � � � H~[$IԫH0Q7ˮ]d̘1n:y衇]v&l+QU@�@�@�@�@�@�@�@�@�@�b%ZZw:ݻ_K.-K".n"PȹsbIFȾxʕ+ҧOiРT:ú4ix E  PI@�@�@�@�@�@�@�@�@�@�@�@�@�.PH"ɒ]wI$]ݻeڴiJJaÆ2|~$=@�@�@�@�@�@�@�@�@�@�@tX5"HƑ2Et ǭ@"G\soNu|RT)9s<gɖ-[|mG Q(.3D�@�@�@�@�@�@�@�@�@�@�@�@�@̶jcX{,ڵ͛7˯*ɓ'VZI%dذarʕJC@�@�@�@�@�@�@�@�@�@�T`F”&)_޳PHOėq&oO^k֬ T.]Hfd޽ұc@n2mC�\0� � � � � � � � � � � � � JiBDjʖI*ZN7ŋݻQFKr-?lڴ)!w!� � � � � � � � � � -CdϞw RN\ ɞ=&Z4H$(}[cիE֭+2e[ѣ%s;ZH(@�@�@�@�@�@�@�@�@�@�@�@�@�  rn#$O.ҠAuxJ,)}<yR,֭ʕ+YI_|9`S@�@�@�@�@�@�@�@�@�@�9"r/sω,X &MMx]vD&}"0քʌ3N:R^=s,]T,Y"e˖ F �Zbc@�@�@�@�@�@�@�@�@�@�@�@�@� `$$IZk\Ԫ82f(/ڵKV^-ꫯJ\SNf'F�@�@�@�@�@�@�@�@�@�H;vDADƌqюxk/? RP{{{O/O?dʔI֬Y#+WFniD)䰦(b@�@�@�@�@�@�@�@�@�@�@�@�@�U"m"9s]_\|YM&&L]';v4sr�B�@�@�@�@�@�@�@�@�@�@ QhhGܹOwED^sDAPܺu˺w$44T޽l_ua&M*ɒ%3sʔ)%X/X SD~X7EĤ:[lEO?$;ܹsKnݤgϞ&X+ J#sDg+M^=X#@Vt@�@�@�@�@�@�@�@�@�@�@�@�@ ^ T*y?z9~<^5Ɓ޽{~SѣGt&XCRP8hD�@�@�@�@�@�@�@�@�@�@?ډ̚%b8I$")R̛'ҰΟϢY'O'N)+J?9+}r|5 )Oɓ[X)%M46mZ3KN2d3e$:gΜYdO*? _(v۲uV?dڵ|r9̙Sڴi#O=Ԯ];!bq)NԊ&P+v� � � � � � � � � � � � � 4k&$3"'xi^2e̘1 R~%m۶Rpi+ A�@�@�@�@�@�@�@�@�@�@E:$4XaK"K+#'cܹsGv){}޽{rr-dgϞ]r-y9rЫӋXɒ% J)g?iݻw*7o4Eøtz ҰK./ʍ7ÙePP͚5`+վ5kVeoire̘N~mxi<UVFIƍlٲ�k�.@V/Z1cO@�@�@�@�@�@�@�@�@�@�@�@�@�x PȮ]"FLN@/[k͙3Gt�yŊ'6mH%bf*U*vJ@�@�@�@�@�@�@�@�@�@�b#pX5b*U+VH޼9b`Nbó6n(6m]رC4 J-jK,iŋ\J\qtۺ.\ϛY?9YլPfNg ?iWtDtN"3L// rܿy(.\12@*U?_\7Ԋ9,Z1cO@�@�@�@�@�@�@�@�@�@�@�@�@�X@Xk:ڵkf?R ?ߺuKt:^cX{=q\:VҦn \o`A.&Mj&Oܹ)S4H:uN:ufp.:h8C >}zL-Z̜9SfϞmVZzuςՉ#FKBoBXEp%իwLy\?wgu{@۳w]3nt�]�}?� � � � � � � � � �_@k5uvKG4k] i=7🵶:rZ̙3[)"4`L1cFSc߯ʕ+7ސ 6ĺ?N˺urͦU~aTT\,5LKGN>|X9bdrlMɟuu5'9]jݬl2s/ٵN,Y`ܹsՉv!b>j܎=@�@�@�@�@�@�@�@�@�@�@�@�@�,}Y,t0K}f & tPu r>Fڡ7"mwYvuu 긆ء;ᗺvك]>KV#0 =Iۤ;:`8Գf-[63X[!!!2g;w:tHr)͛77sFU+ڴic¹tW_}%{v(WTtY]g}G{!ZD4; Ȗ~]>{#Z1}]g}]vl 4(L?ݤ >}]ٳP.wb � � � � � � � � �x_@O8!'O XrJ# ?Oj+uɒ%s5K(pKk]ZG[h`/<qi_ks%zs<yYkhu@n_~2n84 +O'5ܾ} Һa :zk2ef͚RF R(Q" z}njm6y߾}5:=/_>s5*C\d�euCMiޓz_:o40̙3r1ƥ}5`\rVh[y Q@_UbnǞ � � � � � � � � � � � � @YgتA9]' ßt0 2d0!P:\g[9ޞSHo5Ӂ:^]?`Ad:X.5u@9rRkN TwK|sN5|ٸq,^^=i֬ 5PI t ZjĉPBqm??Y\'8׿RCG!}^@` t>v@^ IC(G*ϛ7Փ @�@�@�@�@�@�@�@�@�Кˁ|A9|9rG:SZǧ5}Z#5ծK / i^Z5uZQ]:ړ%(PԿj lbŤxfYpadoٳgϞr%�_}+6AkwYvhֆ LݷU^hiVժUE\uիW˚5krϞ=ٲe3AVj`z ,h´tteՠg=ӧsݻMXnݺRN @V̯"Z1cO@�@�@�@�@�@�@�@�@�@�@�@�@ ܻwT{Pc̠T]�ڛ7o:A޺ ޤAM:Vs4GC|';:0]g 6;{3LA~K ':3s�du^k 5Yx,ZH~W? ФI3ׯ_m۶M*T:X_>}ys?CGݠlIs}5Ig;uG+A\;^jIC}}u_ž}jh% � � � � � � � � �(Puv2?@t\:EkPjdbzsY`$&]4xLC4L'URJC=$T|yl?Z;ٻwo3g.vUV2k,ehرC߿/EZjYJ.X_3Ν;Ek+Ud4J*8ݦMi־բE iٲԫW#�Z1b3;s;D�@�@�@�@�@�@�@�@�@�@�@�@�Zݻ8:Yg{``^'(Kb-K _ʝ;h�KbiTא4:AIn2GAzu�?u]sʔ)=<+ " ںuyt}4izytO9?qD -طo߿?̬LNiӦ5Ak:(]\g}7h?[@;@h h(QB/=X"� � � � � � � � �W[ٸq @)C RLO:k=Y")z+W:ս{:C4Lٵ1UT&\r&I4p+6ƍ}G͘1|'-ZKڵ!Z9rqM0AM&$u͛77Te 5 d`L��@�IDATnZv*ueLC|@۱' � � � � � � � � � � � � wܑ={:XZ:T' Ҁ J:XPB'OX :cav`C{G=tislLɒ%͏`uҥKP7 xYYd Ґ-a;*<GҤI%I$_K/A:_رC{nuMs̙3$;4M 6sl7KLAcz賯}ٲe͏XpE%[ � � � � � � � � �"VY~YT5L\r&8+@q S57o6f۷o۷oKZjRF ԩSG页ݺu3AYz}#ҤIc4@Kg='իߛy֭gmۚnŗ:z̚5K&M$[l1ct"/ė3_p P+׈@۱' � � � � � � � � � � � � wsֈ: j:pXO޽kBw4TR&D e̘m C~Զo>টuzPP:c/_^hW&u8q KɦM̬}?hPNz:k .轥sN-  ga;y@�@�@�@�@�@�@�@�@�Sdҥf^r<yRRL)UV5իWssИ lf^vhRdɤJ*ҰaCiܸvI&u޽{_{'ZOuM2rHy#, {{ذaթS' - K֮2aΝ;K~XwԊ#P+v� � � � � � � � � � � � �Tʕ+qFٰas:Ν[*T ˗7!9K6Y)Ri88>?xڵKt`ߺu>|؄hP^lٲٻV#O'$Iϥ}W֯_o~4@\bdih)S&OOvx$>;v0͛Ҿ( e=:.!� � � � � � � � �  QҚ˂ L]T׬Yӄ0իWkRgرcfYb,[lO^}QiѢ˗Ok>dz܎;p&OmY<|3FF_^zI̙y~m͛7eĉ2dٿmV,Ek;8剒mrZ@�@�@�@�@�@�@�@�@�@�@�@�@Ǐ7~׮]+!!!&Dϟ_*WlrWTI4$'k֬~o'D pM6?C8`BtrڵVZfYdIO`/wߕ(,AAAAfk^jLhsiVdMX"W?k߾}0H}ܹsG#u58IR6N� � � � � � � � � p^m2c 5k9sF)"͚5ԪJ*t/"͓~YW5I$wz$5'Nh۸Hã48O?i/ݺuɓeC̙#?Sz- 0c@%@VobnǞ � � � � � � � � � � � � @Y-[&+V0zu 5jH͚52{:;#/_ Y~[|ur #<"5 uSz&MҥKAS6ݾ}[t@|ҤIhUZU7nlhN@4ݸqhXyEɝ;y{9G<2#� � � � � � � � �$6]vĉerIXi̥JJlׯ_;veuVs SJ2ܸqCVQCIpMikb³4,ߖ^{j{]ݓǛP1bk.y#@VhAV@�@�@�@�@�@�@�@�@�@�@�@�PEŋeӦMvkժ%חzꙐɓ$@<A:p}ժUҥKRdIiڴ<yH,Y<M̛[o޶m�x I4pLjժIB7&{}>̬*UHͥe˖R|ډ� � � � � � � � � c J駟dȑƲXbҩS'رg&n߾- .)S4i3<#m۶5N{ 6yiРAi_/|<c2j(ɛ7o3ty7d̘1Ҿ}{%K@k&Idjs;D�@�@�@�@�@�@�@�@�@�@�@�@�Ѐ 5k̝;WN>-e˖5[7n,k6ZQ HlذA.]* K>4kLZnmRJ :$ӧO3g͛%w&TH6l(ҥKSk֬1A ,KѢE]v *T`o@�@�@�@�@�@�@�@�@  \xф >\C֭jt.\ &MѣG޽{M-կ_?gΜ1ӻw;w6._\u&I&5jK]X@_<bnǞ � � � � � � � � � � � � @?۠AiժhB (~|�"笑 .y晀-ЬZ:uFIpppfzy7vZ)\ >VZUuh<={ ۺu |g͏Bȑ#6f_@�@�@�@�@�@�@�@�@�x p%eС2eJy嗥W^-[xz(C-[&C ŋK:u>0uFvlٲEZl)SsJɒ%]s4Ξ=kjtʔ)ҼyhͦxO@[s;D�@�@�@�@�@�@�@�@�@�@�@�@�\|Y&M$G;wJݺuCҦMp<v̟?_MfΝ[wnf&}/1¼'RHa:v(ժUOݠM`Ϟ=2uT8q:uJڶm+}1?jFp"@�@�@�@�@�@�@�@�@�ܽ{WF)ɓ˿/ѣJ/$ W@ $f͒f͚ɗ_~PU֭MJ5d!C{1ԳPy饗dܸqv[u0!ob.NV@�@�@�@�@�@�@�@�@�@�@�@�0GCرc%cƌ&K.RP!@'O1cȁ駟~Ixjڵ2x`A{/nZ4T ,]TF%͓ʕ+;#Z � � � � � � � � �-i&}Jԩ4. lذR^𶸜o.Z_ܠAK _7ߔ!CȜ9sy8D B"(`@�@�@�@�@�@�@�@�@�@�@�@�@�Ǐ={JbDՎ?^>,$L˭+@l$ڵ˄S]tI~aNcǎ{oٲE4i"חL2ʕ+MaZ>� V 88<Kf2azժU;JJLV8C�@�@�@�@�@�@�@�@�O>իKe޽&0~{UVիWѣe틣ֈ?^Zh!+ViӦyWA_|tok :u � � � � � � � � � � � � @nݒi߿_,Y"!!!Ү];I4i� p6l(͓[JdL?/.\NkW^rʒ%Kٽ{㏦q8@<(T :T:$u֕͛8vX<G�@�@�@�@�@�@�@�@�kפe˖2x`;v̞=[͛K.cɞ=]`ۡ'Ԡ`9sH"NڐN:bSݾ}{}vb2}D /!@�@�@�@�@�@�@�@�@�@�@�@�@� _^J.-SL~IV\) 4g8+W<k׮5K(!?|r)UlذA֬Ycŋo#8@ gΜ7ߘΝ; &$E@�@�@�@�@�@�@�@�@ \xQׯ/wր#&)+W.YxGx w idѢE2i$ɜ9?Ε,Y2ĉ'a�Zf@�@�@�@�@�@�@�@�@�@�@�@�Jի'Z۷K˖-Cyi֬Y̙32~xi۶[qoT,Y"E=59s <8z;`ի˺u3ȋ/(">g}&M6ݻ@5kF#x|UV\ɒ%ދ@xj`ݯ*_~yy?^ � � � � � � � � @u<cr 2e$ޞ;wNF%͛775n tqҤIHE?sѣGBCCwޑ]Jڵqʀ>իWᅲ:HnzmdY<}t@{8!P�@�@�@�@�@�@�@�@�@�@�@�@�@o߾2p@1c|ג*U*&ߗ;v֭[E?{:v2k,xOe„ r ֱ}cGl<w\yᇥ]vqHW:_5kֈ';w.G܃ dɒO!x}@g5}{n߾}^ohlߣlP^̳pBy'ݻ<<B�@�@�@�@�@�@�@�@�@޽M ﯿ*rQ0XBQ6е:@^j}e۶mO~mpgN>]N:%'z֭[СC7ߔ /_|Q2d ~m>�Z��@�@�@�@�@�@�@�@�@�@�@�@�OdرtRiժUT$IȁDjU"S=zHɒ%E?GgZ| X>nc{چAɓ' ĩrbBw&1B & ,-Z|CXW6l( E+|t"˗IcE*V(W6Ͽa2!� � � � � � � � �c2i$ɗ/_`5˭)Qǣӝܭ`ָ۷I& E:Ğ={Fq,0a9Ο?,w0`hG}d6m*|k7)S֖O8QkX7=8,RA@�@�@�@�@�@�@�@�@�@�@�@�@�p7oVW۸3cƌ>}8k@| ؎N0ѣGcǎ> =t=} e2uTȑ#ү_?2dԯ_g΁y?ObŊD5]?A>E=QcUѢEsAwz@�@�@�@�@�@�@�@�@�G`ҦMiԨQ4ʇ-~]ퟻu>l!C9LAAA2|pYv,[g;~ZJ|I#޽{2fɕ+4k=z#Gtu?yl۶[8 胎sH@�@�@�@�@�@�@�@�@�@�@�@�@ 7oޔ ɓe̙7m$?MVq5j۷Ou&;w6]<xlذ|0?f{{X0~we޽/_>y䩧2߹~3CRn]yΜ9_%+Vz֭3ڵmʧ~*[n5~Wf͚r7o̘1Ck4i,]Tr-\rf\RƎ+~XΟ?/:�uΞ=x / -Z?S4h gϞ5}:u[TbvM_[,`͚5Φy{99t|WzozO9:t1L.t\_IЇ *K/d'}1}RX1s=?n2? =>_/yܵW\f2KpҲeKiҤI|gfݻK޼y?6Gp'Jʔ)M40MC^}U3p8D1z7|Sٳ *d?B=;)Gg_],YX 4HraZ<Gw|`qN� � � � � � � � � N@ke~nŊퟱ <~;l).P|1j/"ӦMӧO3<vWj l"ӧO75 4;r4o\~mSWIb[Q}7n n{}l7cr5Z5 }ۼyܽ{Wj׮퓮DTϮ{pܸq7ȷ~+;w4GT7Umid&}_~:aѢEJi5/_^^w֜ SolB�@�@�@�@�@�@�@�@�@�@�@�@�L@Q 0 IT4IÁtf޽{ `, �ׯڵdPn4phܹҷo_w}'ՓJ*OK)UL2;LKìt?o° V qw4,rfI{�Y _:y*裏M14<K' Ұ[lhZ!!!RN)S p֭[ch!V>ϟ۾;vÆ Mȑ#Mh}/jhP,YLV=:ԨQSߟ9sƄ?!!r ۶mIԩS{''x?RjUYxhGSLҥK>;&_\ׯ7M ;QVZI%g)w;`F>}Di7! ak֬=jb֬Y[NQ֥$aQ?>[<#Cw~=j/.իE֘@�@�@�@�@�@�@�@�@�^@CRL !w=mMֈjЏM;OT4_7.].urWnݪUL4hk3UTw5Q>6Z;fٱcGSn361p'W}5:tH˗마]-Zmڴ_xf=-:Nrz`3s {XqE5u8 "w&@�@�@�@�@�@�@�@�@�@�@�@�@�7V(専|@ӶPӐPǵk̺#Fu_k֬16m\g94i<5Pa8V@ 18`;v(Yc֬Y;uK$j2QQF9E 53~;7f .wv^:퇞W^; . MsOޑ:uj:k gӦMff8V_sț7#iҤG:ic9.\;V0{}0"7ks]t>XAUfkPutv붷o6m~^}~Wm>@0cơXb tXaT/2}}N>+ϴ^JOq+V0}ʝ;͛Ǐ[ϐC xg̺aÆ9Y?2`Ͼ'g=8֏X8#GNWxrm=}nj={Lo � � � � � � � � �/_8w9rԡ 4f͚9?{aڵ=޽{f+XʬsvWnʕ+;jrܿo߾}6R붵)QZ/Q#]toRӦMS}I={z3tPs?ZWf3Im#FGZ={>irw7n|خк޽{0@g:^LHj@�@�@�@�@�@�@�@�@�@�@�@�@�dʔɬD|RHR2˗OҤIc>?CfyY綵kזˋ:%V@(P@Ǝ+V( [nI՝k^Z,ڵ 6$3f̐ƍ;+Jb8_~])"/_v*Tpޓ֭[eԩ 4p~ne˖5+u-[JŊ9|e 071K+TzdɒI߾}7+hGKМmW^ٳgKƌ#88\w+hy~~ٛB0/.\ac},_12}tA g;ԩc;VܹS:?gkphB\weϘ>VxcOG�ث +4}ϰk>ߞʔ)#˗/7ؓkn:ޣ9ri?x_@�@�@�@�@�@�@�@�V\r͏iMJ*THX?CSh͞ꤟu:qY ήZCŋKeĉSk=bR˨&ZmնĦ~ӓxsG^դuZɓzvYx'hf]f=֚{{Ǎ=h=ihhY'O _oc?xW1{L� � � � � � � � � � � � �$Y͋I$v⋢Nnj#Nm۶IͶ4K{}� i*ܾ}خU}`7=ٳGof}i_.]$w6(\ps`r{@~<yr}*ULXӦMloẏzl=_Ϟ=M^3=ydܹDt6߾vc˖-zw 1LKAo[z… u8'{'iTUVʹݾz)wiժ yfGwGW'oz=(@t0.uIk{4qQK}{ qPN� � � � � � � � �$ Қ1 Z<Ι35J+&s΍u]\:}v}fQik;bSz|ްaI._lfoÓzvwςzOkK#ߓi@N׮]{`sYΔ)y2+;&e\r# � � � � � � � � � � � � ^^qƙС׿;ud™tѣK.bΖ-ڵkt0#G0u& 4ӧ˰a|:ujsO'k��;wsDz3gP=zб%Kuzl=Bx5@]mJku?\71oܸ! OW^b}z饗dn]}./Jwʼn'ѣaݻwᅲiӦK,vڅiw{(ߵϮ}賧hD3gw}'DŽ� � � � � � � � � UTܹs? &޽{RzuٶmtjoscVkʹ'Ok]MŋeOTvXƍzv[֖Ʀŋ7a^ sP9w.]:zoq)ѹ|8@� #X� � � � � � � � � � � � � C@ajԨaZ._ :e5GSjիW۫[f0$I"SL9so!+Wt~_Bw\n:yGr4,+iŊf͚=xҥavc>�SO_nvov[}uwl$HB/3gu"EHڴieƌefg}V;\>5~LR}u6m3<#.\yuɓ'^wH*{m?In߾ݜժU2}^}ǹ1t}z<X_ W`AyqJ΁� � � � � � � � � kɓ'=wxRwaׯdϞ]&O,ƍ35sz[щ;Rlو6h}Tzjݝ(6u 4iHΝ}u ɛ7(QB,Xs5ݷim}Lr2eZ5Z߾}{{ז .y?.k'@ A@�@�@�@�@�@�@�@�@�@�@�@�@ @3g0&MٳgW\1CSG52 ݻhߚ6mjOiTFСC2k,{/5kVy뭷̺ϛOôNjmVt@N={t?,7#GJ>}cǎ2d'hG?^;裏̮:}y晏5a<ս{wp4оvZӏĉ7nW_}%^9ކ dܹ;wnEDƾkݱ~s.]$44^~QuPriPzduԑB I*U*ʿ/Ђn޼)O?_^:i/'/uk;W5]cn2 ݻWILğnڡAs K3uL;Xu{ݓwܹs.'o>Ch;~?niyE{ni/'N0籗\[Oߣ>gN,[@�@�@�@�@�@�@�@�@�"xW%_|ҵkWSٶ.65ӧOwhNjivݞ={[oɵk3fh ZCO2걣vw~Ok]+w:5oLrz)S8kqq.Oj#h'_�,~ssZ/:yl~{| ` `B�@�@�@�@�@�@�@�@�@�@�@�@�B rԮ]ۑ?~־ qXU+a 9sT^1gd:|MGHH 12d~>(+aD= nqXaDTR9�'GV@ e1>*T0ǶD;صk@f`xͶ֭sXzmnc 6~QOSvՎc:exV]9ʕ+Z#o޼+,a9o}9J,iK$ I3WXa u\t1|G9ڏG}Աi&G}9K;v{^W.'s s}<.ʿ~mGbŜygV8Yz}9*U(Z Mf͚?f?}k hsXV;ZnxVHyV^wD'|IfgH5^glٲ :\gPcڴi+a/={Ó3+=N:eٵM=ysya/\?9 � � � � � � � � @4cjzak7MMe̘ԆK{Mj-'իM ZM^reuÆ 3 _pNkTxZkr5jpdɒwy$6e>gK3V΃֭[2e2u>:Ej}{)C >DTϮ5:>@p)g^ Gv\spYfy.Z߯mݿ{{ҥKMՉ h Y~-a#Hc@�@�@�@�@�@�@�@�@�@�@�@�@� w}W "֠hd Eb kXA3nyٹsXQbsƓ: 71nGxuU{i.֠^n͛7+FN>-V@6�qmɞ=עZg+ˬV.VxXab8F_#:/۷ĉ?D׮]+lJ)"@uzi 5\}iٲ5ϧ&VXͻwk{t` -DK+<O1hl[nIʔ)Eɓ@@3Ο?o̙3.6︸~:D}^ۨޣB#_~b(ckr@@�@�@�@�@�@�@�@�@�X XaSK۶me̘10ViMk]ɓ'E]cqJ nƍRJݻ|b3IѢE}.wZ˦t=>[JҢE _L>]&MCGz~ݻWHΗuw.OkKuZնz=Y`ABڜsbUYR^=2@Ds( � � � � � � � � � � � �xK`͚5ҧO믿LxO=mhL{ jڴiҡC( @).<:6m_uPNCɌ3r6裏dΜ9uEeŊ̜9S/7o4wڵv-X#4/֭[i{g=>^nsHHo>ϤgϞ1mp~@�@�@�@�@�@�@�@�@ _^Zj%ŋ7AFy7qU5bĈ]4ZuE QF+":u,Y2w]ɺWJٲe|2w\#5 >\onʆ&.b~m' � � � � � � � � � � � � puԑ-[ѣeРA2x`ݻKtؠ 2Jjr>.\0_<y2b۷oKRʕ+1cF3h:"YfRdɈxTRE?sO;qℼk9L6?\nV~}Og1 -[V~YP5 hDzeˤ[n$r.|� � � � � � � � � `5jԐ 6SO=ejd5cǎJ͉:Gzaw-vi[.^( 64T;wիf3gΘ/gI߾}&w0i$yG?w}m ?\ƎK.:EAk19 � � � � � � � � � � � � hn޼)F!CA]v5kK.h ⺣3af'OwJŊW^.]ub}~X^=YfTVMfϞ-r s܄0??n3kjۄieɒq&kܸq'O3^CҧOm'}g͚eݴi{τƧ~V@�@�@�@�@�@�@�@�@�6laa_k޽{%UTNàgfk~ԭ[W6o,'|R+7$3wɿo)X|<]|_1cƘx0`ŊK=oMdq-pXh+׭_'P+~]/Z� � � � � � � � � � � � �*AN3gΔ#F*UkkNeN8ͺtRΤLRtN(0O&MIv̝;W~Y|h` /`ԩSGH_?^.vi߾<sRV- J`ǎ2a8q ӰDAB T;i  � � � � � � � � @^쥗^֭ 0@&oݺ%:N3ft3 >GUO&H믿w}W'I&<p΁ʇ~0l��@�IDAT(w|ϊ h]۶me˖2yd ف  C8k7bnǞ � � � � � � � � � � � � [{رceԩn4h`t fΜ9J+peYh ӥ{nEu;tPDHQ-`4vEŎ-17j4Q#j쨱#"" Bɹ{ w:9;3޳s;CNwq+л9s?@Gydվ} M%PzF~<@ ><~,k׮K ,92 @� @� @� @�*Tgy饗F%֭[ѪUUuzDf͊Tx5رc:/<7n\zyW_={믿܄};lP2Lc9&nZri3+O@V-jΞ @� @� @� @� @� @�Xyb?rOmvѥKw}#TRe!I`ĈsœO>? of͚?O=bСFA#:u5jԨTKH/|xꩧ?05kGqD6P$g= @� @� @� @�*@+{衇" {gACT0N+WǏ;#n6mZwqqf+<+X>ht=:tߣI&+xӧOSO=5 Rӟz}+ PFVI� @� @� @� @� @� @�Hu<8 yg?^;sksѢE> T &ĠA⥗^> 6 RxV J6zxᇳ7x#j׮{G>r-XҮyo?zC=4ڵkW! @� @� @� @� r^|Ÿ#`7n8=ڵk\h?c<qwguM6=z)W{qG__}}(m/v_N:)w!}RM@Y *@ٓ� @� @� @� @� @� @�%b8p`|ѤIԩSѱch۶mTV#$PXX#F!CdrJ:u.˥[n]]&m<yr6CGA &垤Mw=G$-2 ʤ}NJ$cǎW_}5gAZ_nmb}8 6x> @� @� @� @� ?>sOveCrH4o|5ŅfΜ=\<cŬYbN8![VZu]*u%dAr/`-rKt_|E\|YarK:K'V@C *=  @� @� @� @� @� @� R͛^Yk褠:vmufV9@i L81zxo}]N;e!Z) jvիvs*Sٰa^AeDɱaÆY^~93(3f̈wy'7ߌw-j׮;ct9 K_i @� @� @� @�*@<xp<裏W_UM7=<r,D)թV sʮ_~e 0 ~xg#Oqgkkv5n%9}8x㎋޽{GӦMWY*N\sMp ѨQkCJ' PTVI� @� @� @� @� @� @�R9rd@#bܹYN۶m]v_nQfRkX@^5* }JO).ahٲes:v[oA R�_z(W_!C믿cƌɬS6l۷tH}:th#⧟~&MdZipw9 WWñ  @� @� @� @� LqUqѸUkOzw=kln޼R {:cƌn^4zT;{ātP7=ߥ w}ť^r<{l}ѢEJeu,թ|ѷoH՗\rI<晊e|U *@ٓ� @� @� @� @� @� @�LB%)d1{,h7*r,(=$k6:QHߵ4|ᇑ>=LY))Fz*7L9_of;o_|,ji& 2kݺuCVAP~ᇢgXk :DovW.j+ @� @� @� @�T�TvUwz]q Y9rd<+)iF:u]w5vih۶mTVtlW_}z <8^y啬6vܹY{iNiuYfΜwuW/ѣGG.]O=3TZX[q-<Bqѳg,Do� ' PLVI� @� @� @� @� @� @�23gN|'YI>䣏>cO?dZ͛7f͚E Jfmk.;yHX}Yu ip*3m֑Br-*G4 &ǰaòezcz>MM4ɮY KrM75jhʪH5jԨK~ƍ "Hݧ4HZ ZWʹ @� @� @� @� qwѴioq챑{\EN< !CԩSz:DvlNuK(fw}n;o,:VZe!h[t9_id9;y믿>^}oit5wMs?/H[mUuYѭ[UVeT2Z%JngO @� @� @� @� @� @�KYfea(4ЭQ&O\ƍ&l)@'-SʆnX47lذh[/*ib„ ,Ns IAYiNAl'Nuׯ_Cy5֨ Y/RXR~a1|MHA|龐Ҝ mQLW^}5<M/"t3fLH˴. ufAki-[f,@ZN  @� @� @� @�ʻ\?G^%D.<(r+TCj(S֛oov~ܹQN,M6-"Ku/?ȑ#Ç￟ͩn1M뮻npBviqC-wެ6<}ot/cǎQjen{œO>O=T GuTs1vەk Z<J!@� @� @� @� @� @� @@%paJ)`iƌE=MI)Xg&MNa\inԨQZQPPP^ ]ׯhN9iNY9iS͚5RxRYfكm-+)Sн4z,d)'RWRV{C$"?DZ^n4 kƗ_~t>HSok7PK>3 @� @� @� @� @�_‚".4/<3Fע VL[&/Mu֍-[fuuoyܦTWi/u5=qE 4KOfq뭷mfsvb63?xDSΝc]w]v%fV8KZXX}Q1p5R8؁/r/8*Ej-B+j-7  @� @� @� @� @� @� PRN )%Ȕ_m҃)=X]wXgu7lpAQV!,_`YUz<yE5k֬g~dF)(na6KHaZ^3Hs?,_n ;toH}^z٥ӳ{@_~7=`R/emo>,g / @� @� @� @�/^8܈\UѻwV],gĈ'Csf I5x&xnשvw֋5Xc5ΔHSb<-טש49T#ڼy9mѢEYf~3Rc+D J/}۷omڴ)[nkf)bΜ93RۊؽY|jGǎ�}':t}QBk*@_0Z%' @� @� @� @� @� @�VK9sD I.9/^҃)[ h'Vz,@~2a4שS'j׮atܪUfs*UX K͛4K[&bҜ?3fd9e IiӲ�SfXy҃|pY>q1aquǘ1c#9'",qAHOHt( ;yBݺu{B{̋',^_{Bu^Os_/nw|EԆt/LtHndm"@� @� @� @� @�I/":+ڈ-(?=H&Lcfs ʇK嗩ѩ9_AYdfzeNժUTTڕ˅_Tø96|weo,ޟԦK4o&ټ馛fuE�^@v)W_Cưa>jYSR-jv麥e&MZTS;O6Jߟ4r!t_~=X[mUծ]ycm dZ%Ur;{ @� @� @� @� @� @� @r^Sxη~[4/Jt)|�K҃)(K 6OSLgᆈ^?gGt,lC`=!=8*O-|H +y/v[3 bL bŗi�t_1 @� @� @� @� @�(j`o%#ѧO~U̞4qĘKSɇ Æ/Sd>*EΛ7ou:%R=cU~ 2- Th̘1YV>*zW_ɓ#dtJo{ӨQ,+u4h"ZlÕ#PQjJ *=  @� @� @� @� @� @� @ )T+)H'=_s̉~)CҖ鳂Zj\<"Os͚5u Z�ZОSN3",@H Ai`=)UW\1(ڴv{ i]jժ & @� @� @� @� @`~_+w\ ޒ̟z|VZ|mtLs̿KK]W^yeVӘRbZYeD`IӧOςR�\^ktMT;۰aXgu~K:V+Z%JngO @� @� @� @� @� @� P:o߈[nۈ#8}5**v2 @� @� @� @�X #n)ⷿh<#ڵ[QV'|r|gϯ6'@�P^r*%՞ @� @� @� @� @� @� @@yh(#><" vۈΝ#{,b޼#@� @� @� @� @�L_~~zE~[o *+.(((ɮ!@�V@V4F� @� @� @� @� @� @�V@͚7?P"֍#Z_#O_yr$ @� @� @� @� @�0 MO?xՈ޽#W_ܖ-K jU"vdYN>'@�%/[ź^ZK� @� @� @� @� @� @�~{F<TGOo1n> @� @� @� @� @�X@ ]qWa6f j  @ *H  @� @� @� @� @� @� @@hѧOĄ Cf"?<bȐR9 @� @� @� @� @�f|^qQjP ݝK)REH):$le @� @� @� @� @� @� @<4lqc":vqLj;<R @� @� @� @� @�*Ѫm'kE|rEAm@{m�J. Pv$@� @� @� @� @� @� @�JZx͈W_`]#6,OJ]!@� @� @� @� @�(E"_1y)q}R<jxhZEeV @� @� @� @� @� @� @`Ev9#>4"l~zĨQ+z4 @� @� @� @� @�NEx`:9:wn:u5js9 XUV @� @� @� @� @� @� @� (&sĄ C hr�/\; @� @� @� @� @�*p'qiĉO駟V[]T;^&@@e𗭲^Y"@� @� @� @� @� @� @�+Qn݈Ί5*G".b="ڵ"f^'s( @� @� @� @� @� )p{Gzkk5>B7PVyHG�+, Pk@� @� @� @� @� @� @�V_*'Ә[GtRFE&6zN� @� @� @� @�XN?=/瞈㎛O>9W:Z͛'Pt�J ؊� @� @� @� @� @� @� nq}}q`O>|ŏg @� @� @� @� @�)p9CMZ>SL*fjk V @� @� @� @� @� @� @@1׏#Əᆈ#:b# (,, @� @� @� @� @�J#n)#~][STj  @@ *  @� @� @� @� @� @� @ԮѣGGE<^Ė[Fv[ď?V @� @� @� @� @@Έo2t2dHviJQ j�zZ  @� @� @� @� @� @� @@H_G|A;G}vĆF\rIĉ:G� @� @� @� @�X-+O]ӧOl喱nwW+]0T;a�T_2wr @� @� @� @� @� @� PZ3ό/bM"vxw#@� @� @� @� @�TV7ވ-3";�o{+*y *Y%@�UM� @� @� @� @� @� @�Vu׍kqG:DtF7 @� @� @� @� @�T�#>8b=#~u]Qj\V.mTJ  @j @� @� @� @� @� @� @�QFcxh^h C"7ƈiVG}&@� @� @� @� @�T 9s"~z"x Jԋ۷ot=֭[1:T[)P_<M'@�%  @� @� @� @� @� @� @` {OD~\zE|J? @� @� @� @� @�L /È_=駟Ʃޕ@ *(((c;((+Ze% @� @� @� @� @� @� @@&мy7GL0?T78Ј! @� @� @� @� @�}#ZZE}v-jE?f @*UĎtX$@�2L� @� @� @� @� @� @� 4hqcDw]v~=b @� @� @� @� @�R`Ҥ㏏8؈]=q駟={.5"PXX(PTd�R@VY;7 @� @� @� @� @� @� @jG&ݺEli5D|"XA� @� @� @� @� PQvč7.$}[/:o`J7o@ P 8? @� @� @� @� @� @� Dvx衈ѣ#8"⪫"6 gψO>Yn> @� @� @� @� @�XI<EԫAg͚_#U֔@RauP(cZe|� @� @� @� @� @� @�XG\w]Ą C{.U.]"^|qۂ� @� @� @� @� @`fΌ8(n"k?CI' -Z P8= @� @� @� @� @� @� kq|Smۈ5keK @� @� @� @� @� \w]W_|p4idd @~\$@�e) P,� @� @� @� @� @� @�(@1hP;D@="68+"D-&Mv[򗿌Ҩhz'bM6|6ePثWhժUjkX. @� @� @� @� @B z̫ȅe- 9xٳ7ȭ-5v{ĶRٳc]v^{ӦM+:8GtM7EnoY~sѻwCo1̙S)  V�˦ @� @� @� @� @� @� @@h>{"ƍ8Ĉ3F'寽&2eJOnj3رcs"-M a>;Fe5,C|&@� @� @� @� @@e&ŚkF};ҧOhݺuti*B] Wl{Ez]Ѧd<k֬<xp1"kܹs?8SN/{z 8/&O1nߎx .袸ꫣK.1slY @�R#@� @� @� @� @� @� @�ʵ@&CkĐ!mD<3L/b;kO˖-N+7m+ސ:+ ѣG^_r1D۶m˝kX. @� @� @� @� @BLq-gQ<eʔxgϞ l©s駟Ʈjժ1jԨ,Jߑիw]VxWFcˮOzse4m4g+'}6iߏ?8hРAt!~g۷od+C�J P"v!@� @� @� @� @� @� @�V4h'G|aĀi|b?Ÿq裏.$"& P^6ڨ6ڵkS^kXf_'&@� @� @� @� @@s#ƴ.u]Qzڵ]|/GaaaZcTE /RV͚5QFfwqG4i$W;+O^zrM7ͶN:EL=裱kD͋6a)d+M (@c @� @� @� @� @� @� @@((ws ׺ᆈsύ[Ѵ믿w_|`qGd'=zt_c='NSO=uF<_| 0ѭ[>O\ Z17Ҿ馛bѻwk# 袋bРA+dǭK +Yfqie=òЯԇ?R I'm?~x7c5׌786N4)nxnݺq1CBTi̙q7G?ci&8XcIp+ai>6l7.|I0mº瞨UVv4Dt"]˕u y.kO(*5: @� @� @� @�(@T0W˛Z` 2$[lժUL:5)L0k&N 6 ˪[Z ےj%v裏sk.=جrٺ]v%z+U߲~:|#tf'\E*UD JΩsɱ^{eHZgy&7o^/<.ԩS:M2#5j>jTW7k]Ԏq-  @@Id' @� @� @� @� @� @� @�*@㎈3q9w#~󛈷^y=۷ot9 )تQFqG$PR�Sݳ| >RRR Qe~Jnu!dAY)l)>mt _:=\;gSxV :֥04vA:x) *<  O<1G1vi 4 Ɨ_~m\N_L:%~ipԏd~<xp6Үa{CHc|Qov _zu]w]fҺ<V5LP ?#G,H2\"l/ @� @� @� @� @Dtj?)s=~5vi_WѲel;.<XjݲjؖT+[GKAWi78L?,L+5bvŸR iSN:*ۯ0kjK IZ_2| JoҤ"H5)/ȮOOO<D SիWςҾÆ m'f>EyA�J Phv!@� @� @� @� @� @� @�*:D\zi"r9Gܘ O%ѣ0]F�" p5DNqѦM$ i]~JJ ><nָꪫ@┦{/[wfJ)*70¼Ҷi01c[o LMa^ z^4([^|,hN:qGg/0"kcTV-[>Dǎ6IL}ѣG>!M& 2vۅ5뮻" ҵڰaå^o=|, +]彆zs=ԩS?̮SO=kΑBѪV;$#}Vaꇉ� @� @� @� @�J.JZ_cY(^gy&cL;DݺuZTSTcYV ےj%?8䓳"ӹ;t 8QxNu]7E,nYcOӜ4iRvڵk/҄djXSh~ ;K.$)kw֧G:_GlͲv䷱$@�%RC� @� @� @� @� @� @�5jDt1th/GVaE4oq , 3gΌwq}w)ؔXxjݺu6@Z^i„ ~|p6C!\5k,ҠiZA'm*W^uQ1vxWmR[Ӕ5kV̝;7 (>YfZMmQ6BSN}?<HQN=Ԭ})*|39עzM4k.qm5ֈQFea[鳶m7ɮc>gEa +UVlټajXN<9fx'а={fmװ  @� @� @� @�(@.)mCY]g0`@ڳUcuKL!YUVB-O>2d{<0ׯdZ%إѣ# N׼y99suM6]䳵r'xb2ȇ^{m4n8\m캷k.LՉKXYVց� @� @� @� @� @� @� Pv-"͟~q]qq晑 Z^}RUi]v~'Wǒ˜U614�EFcMYϝXxJXwqG6w)ibȐ!gH AR #;¹nHaZ}]F�=܅w-;Oٳ5\{k;K/nݺ˺iױ<\Ԧ#8"W;?O~f @� @� @� @�,wߍ_r|[BRhӭ)*S-\c׾}l5jT߲jؖT+O=T&Ӭ/u]qyE߾} lwK[s5sdStUEt6l뭷^Ѻ}Ѳe:thV7BZj[ne~/alG�K`'2k @� @� @� @� @� @� @�*GtSC}4yCxewu6zu6moܸY"PN:uj6Cرc^4@��@�IDATvm?p6Ϝ93y䑨^zH[K;c 6,>=sL4ڗzkCW_-<RjL0!ƍ@w+5LJgA|Hzr p @� @� @� @� @ 6m-1Tcw'O[tS ]s5qWF㣏>뮻.j֬:tHYⴤϭ\IKA 3gN-Zn̘1EҋͤIbZ`iҤI{ѧOڧ@z+Xؖ�,S@2l@� @� @� @� @� @� @�N Dw^<1qbĮF.jb,;d_yֿ;f|ӬYnYoڵkmr%d= /̿]2 <ȸ袋" n_*{,k_)W^ѨQ_~1o޼xǢYfkFcСEI(>uEӦdܴXvHס"_Է={Ɨ_~GqDY ip SM @� @� @� @� P2gwEQFVo>6mZtIEZ|]Z~HT;:}s x/K|WqG=&(5-nʔ)E9:|gϞ]K =蠃bذaY`T+V?ESN]dݒVs9Y_뭷ޒ6�H@VD� @� @� @� @� @� @�Tvj"7p@Đ!68昈M7ܸ Lp@^1f̘xG>{67:\pAnϖ<L$Ҡ Ǐ̈́ u'u֍Gy${[N>:lI&eԆM)H~`)L)M!TYð w9@gyf6�FΝwYvͥmC.%U頃zfytMYXjq?Ya.˴.Ҳ\4H7ߜkV0* J 0 @� @� @� @� @`R6[oEwM5iJ 4^/\cV:ׯ_yG-nyV+ S^ T.Dz⨣\k%Tc<uŏ*^ϙ3gӤpu*vnjSXn-qѺ1.o߾L @`e ,T> @� @� @� @� @� @� @�*;Frb q5nq#GZյk8c7|3^y,)m[F6mwމC9$^{˲<SqUWŠA2ops= 2 /}j]wM4yx嗳p ٛbԩS'w~TZ5d=-"N<b[F'zꕭ{dz%қ4PDǎ3C8<%=cƌ+΋֭[Ofm">v)=,(/4D)줓NQFeK^O3#Fd;idIװiӦOmvXVY0 RS6o=@2\ü% @� @� @� @�aunWVy-.m Z?0Rײj⋥!s@eJ:6,G5X#*Rܡ~7MV۹r:U=%ڷo?|<ӱ6ľs΍{7\\S}co;f̘ӟ),ykz)d8%XY?J+`C� @� @� @� @� @� @�XOX_:?dk"rRobFŦnIaܸq/qpEvѹd4B!-Wd:ujԮ];W^ɓcu)ziP';*U|z(J5k,֭qňrAYYgu°MD#^3gFdĉQF^x SL @� @� @� @� Pr[no\}9ccСjҞ61Zhk~n uqƌQ~eyj~n-2ԫW/Ə=R`Æ nPlf>ǤIcǎѨQyM�K6s̈#:w^FV/V@bY$@� @� @� @� @� @� @�,[ /O=qtz눳ώo"j\(? ji  @� @� @� @�X51n\ċ/.zo&6`O^tkV@ VZ_s;!,]@}i}3 @� @� @� @� @� @� @� ̘1#^z饘5kfvZ#s"{H6(70ܷ~ŚkYVw^ @� @� @� @�(E##ڷ_ Θ={vԨQ#Wgk[n[l*U>}z-ZmۮR'#@�#PP*Ow� @� @� @� @� @� @� x衇{W3i& Vn[>bĤrF}a#s.L @� @� @� @� P7∳Zo͋7<Ǝ- pWƥ^|ӠAK%:K PY&Mh+O80sҫUZY @� @� @� @� @� @� @�J.0z,X{hvhٲ{'b="9'" *9F+Ed @� @� @� @�XiӦEԫSkWځ4io3,s80L@}z^UJ=  @� @� @� @� @� @� @�͚5+"R֠Abmg<ƌio%Ly8tZErKČ=-  @� @� @� @� @�e+0f!MD`޼yQؑ r4�S_儲 @� @� @� @� @� @� @`y SNѯ_/o[4l8'>Ȩ[wZ8!]1a6 @� @� @� @� @�nҤ+WP%u4(E @� @� @� @� @� @� @r Ԯ];>xgcqe^ٳ;0h}!6d\nުzE� @� @� @� @�I"W_U ̛7O/T:Z @� @� @� @� @� @� P4i~|;D׮GZ~4|r~bGn]y6 @� @� @� @� @�U jNe]@y]�@ @� @� @� @� @� @� @*h߾}p '}]'W?5~{8찮ѴqubU4'$@� @� @� @� @�VCɓjU˞ *Z�,U@Ry|H� @� @� @� @� @� @�(=jժE.]W_79ڵ{O\pFFnŘ1G&@� @� @� @� @�ckpH)PJ#i+,[_eق� @� @� @� @� @� @� P 6SN9%#Gs=670?f:D۶7œON.v8 @� @� @� @� ̚QcZi;,I@֒d'@� @� @� @� @� @� @�@-|36bݶ/\?48(>1gN5i  @� @� @� @� @�J'jԨtݪ*,,*UĎTꋬsX  r W~2 @� @� @� @� @� @� @B ?=zO|h3G׮P])m6OlO?En`S'bܸ5: @� @� @� @� @@E=:⣏"L#ӧGh1iSFgQ{[y^vۣ[nzF� *6j1p`Dejet^%@� @� @� @� @� @� @�X:d޽fرso߈k?PEgѪ p5ߴK?1Ӫ:  MPTcAD1ĚhN45;Qc!**6T. &EQ�yaʽkeUY~QXfu´, @� @� @� @�TFq"<2FVtKFL\rDXYX|o# @@_*1 � @� @� @� @� @� @�[mW^1e7Z<ѵkwSێܑ= @� @� @� @�ia+bɒoJAZ~18WfL PjUo @� @� @� @� @� @� @@h ??>⡇"-7b#n=@E>֍85 @� @� @� @� @�M!PcERŠA5k[}w6@ Ԫ>�T!eBP @� @� @� @� @� @� @�)q<[ݻG}vD_1}ztYרO>9"--]?ꨈe#@� @� @� @� @�UMS#j^-85wg @ @j  @� @� @� @� @� @� @�L;߉#~믏!S"~{5wnD㎋XtO X=W  @� @� @� @� @@elNUk#95sbԨ!vb| @�_T @� @� @� @� @� @� @ lEĥFLquGGsD><o#N>9bٲ 42J #"/oՊ48UB� @� @� @� @�Mn͛^`Y'jmo PSm @� @� @� @� @� @� @� %PnG^ēOF}/bm#6bM+\Έ?bTVcU+#H� @� @� @� @�%#j,y=ͣ;לU,Z{ Jˮb5 @� @� @� @� @� @� @�T,:4b؈>}"~ˈm#~ɓCELq J|[kd1D| J^sF� @� @� @� @�9D,[Vrdi]߾%9X@1!@�R@ַ: @� @� @� @� @� @� @ l]B#S㎋䒈5oDi^;⫯zU9jpu=*#4 @� @� @� @� fرu#ܳ5gK UȊE!@�(6T{� @� @� @� @� @� @� @ 4oq~qo)Dt7ӧS5O:QV'G5G @� @� @� @� @ rQ7#LL*@aaa9ZN@VܼE� @� @� @� @� @� @�2iы"v%"?JZ}ѳ7\r^]PqszM� @� @� @� @�J#pu|f :X|y֜@T@P @� @� @� @� @� @� @ |Y=D5m^z.j*F"8~oMN;U11 @� @� @� @�(@Gw)Lkٲ}K[K@VyIk�[  @� @� @� @� @� @� @@oXWR֗_Fݻ덲_XX-ŋGAAA,Yh;NחXcΦǩKNWttmG5V, WԬY3ZjE*kJ8ԩu,[  @� @� @� @� @�o/p89q՛Gf1s1eʒl^s9riկ_?6mfѰao5@ T2Z. @� @� @� @� @� @� @,#VdDXb-GoG]HܹscΜ9E%ϛ7/ŏ篨lN³>0ꬨvz}V xH lze EE4hPt"5ŏӵƍ6,[dtZ @� @� @� @� PNǏɓ'ǤI}:Ne֬YW_ŋ3ơSW<sǜ5i$7o[nek.+۷lMt1jԨu{aU\V^^ު7]!@�X@V%xN� @� @� @� @� @� @�( kaG|y_D̜"Zjz8/\%\H 1,\X#߿ v \ H!Z)<p]K!R+C傤VZJ\)Dծ];׬YsE8X~4qZ#- r馼8㌏\-["lli)諠 Zy K sՅ}gY!d5m*l5mڴ4k,;NTZh-Tm @� @� @� @� P͛G_=ƌƍc_ ^zѶmۢݻG˖-朥gƵ[1nln^n~^+Ӽ/2?RbD)Sd]Fi>\Rnڵkl뮻F=mgrZ֛̃ PIVL__#T& @� @� @� @� @� @� @ -H˚6mZVRxӌ32sEV:S87[f+JSghԨӊ+h"HՊ4z~)ڪ04i;p6۬8re+@Z"-x7Ifu%-F$|֬YEo=bgaf[6mDڧl @� @� @� @� P1&NO?tꫯf!ZiY֭[,*VJ-W,\Qܰin￟|傾RWCڶzٳg+nmX \ў}o @ |y1bDk_;['P}!@� @� @� @� @� @� @�V &M)SD*'O.ڧWenaZ?[zb-h/vsJ8-Z(uͽj_,YkE4RVڧ\Z6w#l֬Yնmh׮]}8w!F� @� @� @� @�e/0,@'z*>Hsz葕H۷o_oӼQFW^y%̙[netAY9yd|>sVށ9@XZ& @� @� @� @� @� @� @\RԩS?ʄ O?ĉ#f-_<S͚5\Qnߺuȕ6mDƍu <iiӦeO%rami~s)+9RVǎ}Ν#W"-wi#@� @� @� @� @�H{챸{bСxy睳<0{,TkjO-[, >|x/G;~/\?q|^x!T^JjΛ @� @� @� @� @� @� @�"0s?~||Et'ĢE6k׮u)ۧ%e /(GB%3f̈rIp7ڥKHem-o喑Wf @� @� @� @�=\p Ce!Z_}ѿhժUG/ Y؏~8#<>,ܻ_|1kj0PTZRJoM @� @� @� @� @� @� @|_ɾ;1v3fL/W^lֱ6dCsΑBڶm5jV{@yL6- JZ}QF*i5l0v횕v!w-ڵkW] @� @� @� @�69so믿>ƍݻw38#:hѢ&ߦpo9mڴ3<3+鸺mSL؍92c6|%@@UO$Pv$@� @� @� @� @� @� @�@aaa$4zxJ J[Z" m%J [6<D2 ̘1#l�L KSfi֬YN|'+[o%??2W  @� @� @� @� W_}W_}uV-['xbG?]veg]F`„ qM7-gώO?=LUI&EW^={Va'*@*Z& @� @� @� @� @� @� @`}YꫯF z7bΜ9Qva`nݺElEU -{;nOat ,z;)\+-{DΝ+q @� @� @� @� PIΝW^ye/~&MT-Zj%iӦũ\rInݺ;S-N81:vFw߽[K@ֺ|_֚m!@� @� @� @� @� @� @�S0ƌ#F_|1 Қ4iRԪU+ J]v%vq,Tkz�U/_ǏRHkzղe,Xk޽{g36 @� @� @� @�TDn-)Ϗ>;6lXZ)TPPwqG_\{n6R OSN1zl\) lDZUz;o @� @� @� @� @� @� @�T࣏>'|2?|̚5+b{#3 Ъ[n52l#txW_#Gfv&LI}ʧSZ!@� @� @� @� @>8e˖kx X`A\~?1:w){ZMx?:xljN @ *Uz;o @� @� @� @� @� @� @�D`3?O<D|'ѦM8b}'[p& -geZ>l<otPqq!fmVǠs @� @� @� @�T=+:СCr-U6"|4G?Q1".<xpUYܸ.]ěo;sի"(ZwUz;o @� @� @� @� @� @� @�UX`#ĽO>d,]4owlvUxFL<9C-/Z(zGuT}Ѽy3X#!@� @� @� @� @ ,_< W_}u+"j׮]Y:TXX_◿ez衑4hPe9~HsY~i̸ �UE@V鿤@y� @� @� @� @� @� @�biъaÆŐ!C0uƑG8 ׯ_Fl8@AAAK<ӧO ;Om @� @� @� @�(+ŋDZO>d~q1ǔUYOW^y%m۶<ZloVƍ]vw}7vqNJY#@@5U^z� @� @� @� @� @� @� P5M_|qt!~Dڵ3fĭGq0񩍢 ԪU+ocҤI /[o?ϢM61p?~|5W2| @� @� @� @�B`ɒ%Y?>0@-Ez5{ӧO̚5TW Nը!v}="@�o#lFϻ @� @� @� @� @� @� @@3fLr)ѱc6lX\ve1}2dH7+t�5 EZ(/K|gq-daZ]vBRؖ� @� @� @� @�8cȑ1|ٳgi^y)lqGŋˠM[˳ڴA PT @� @� @� @� @� @� @@0aB?w9[!5* jذa PjՊ~O<ƍmA|peݜ @� @� @� @�_g뮻VVi& cƌ畣k@E�Z@V|:O� @� @� @� @� @� @�l%K.v! z뭷{=zlH5Uŋo߿lqK/Te[^:uj\wuqaeh7M^Ѿ}8bٲeeQ&7ߌ.(veK7Y?R]toGNb=:+̙Iq @� @� @� @�*G}w^y^x`t9矏C9$rPO<1{8^*}v-_O>dջ)*mI�6@Fb @� @� @� @� @� @� @" p={Ɛ!CGx ֪H}ܔ}I +'fΜ٤�_|1 *~UU)Sc=C ~~8 -*r뭷ƸquyecH!ww[fZG~;vqx7%  @� @� @� @�sNl1xJٳcOJz/B+\=c^?>8p`,[|ʰ\VbGʐUU P|] @� @� @� @� @� @� @�6K/ݻwv)|86n_1r>q7h~o~S&uUJRiVfݾkGѨQ,飏>žʬMP>SFe9i o뮻ʲzu @� @� @� @� Pyx/*4O~<yrRVsŤIO>~eaW9%^(+"ܻ j4Uf 4Z%@�' Pk٪� @� @� @� @� @� @��oFzӟ4nhذaUB J*m۶sZm' '-nm몬׬YLhѢOZIvܹLԕTco,`SO|pSsi� @� @� @� @� (p7G.]y{KC YfQGU<@ 4(wzv⢋.ʎ{ϖIwwG^u[|yuZ 7I@$d\'@� @� @� @� @� @� @�*… ㏏~~ 96[nN?9[Hg?Y|qW[o5O>995jTM41tи;VZ%]ҥKcOFZ\s+,, Ą ⮻͛GzvذaY{_#-VqM7Ez>SRhYc|DZ̙3w|gqYgᄎrmɫ믿~8޸ꪫG<SѦMl!dF $8XdIP4d~7)P,2cƌu]΋ƍn~ٲeYO;kjOSwzN-ZĕW^¶xW"e&遵}vKtn 'kBӎ9l+"W{Z+N:)N٧p� Q!@� @� @� @� @`<c +ˎmך#9kq!04cͺyg;4K.^z)~x(y 4(~L\SO=5͛{,ˡ2Z倬 $6 F  @� @� @� @� @� @� @�HR))RUgSN9%Rhvm;ӧǑGtP򗿌~qdA[7|sƓwgg ]@t~gfE)`j}5jdG?|~տ,i֬YYմi"=蕂6iҤHϤ8^{,<x,*jpug!Z)}Y?)pju^tE=RԻz>k[mUƾrKw 4( ;vlt%R0WvƖ>hЕJa[qeQ^F3_~y4m4ۋ/BRZV K;w֩S'{//Zlqp qgm^k~7p÷c zW3>MW^S߾}@6'ROߞSș� @� @� @� @�I`<4_kclk_澭n>~i)yk߲4,W.t��@�IDAT@4O{Y뼳mۮ0-[ 4M6[rmΜ9uQ+ {w;3o+z˫Z%(ooz[ @� @� @� @� @� @� @{,*UĭO>YV[ @3fLL0! @:sB ))m^xaO!L)L+,}{˂8HaF=#7n))#E"RKVUZ} ݻwvR_S;1@@TO6|ipBҵRXW Z])$-h--䑂{,ll?!½Ңݺuڵkg8Gw.x⪫FeO=zȾEzﭷފd"'8}gײJ6RpWr{{L};w:J`;cNZ@dw/M!Oizk6n-[SO:tP&cڵk Q~oeKf;Hb#@� @� @� @� @@N`ҤIaNrllk 2$?4hPv晥diݾoKsbe]mܐpfes qڷo5k֌w[v?jz6 P4"c!@� @� @� @� @� @� @�G/X%Чi&R [nm6 WzI&YRz @u9RϢEg•o)[ҽ{(,,¾&O^ziֿEbkAY)+>r-En#]w5^},|+=}7fYU/R,]4wܑ/ҷ3gNѵ=߿ѣ_{O2% JVǿhݺu$ܶ>D2dw疪\;_]6M| Kb#@� @� @� @� @@N K[ Xe*>1cYwV?)ثW=C矏x N9;+ZNFw}w=z-O'瞢K>Q6giNc:u2|kjngDk @lj @� @� @� @� @� @� @� $6dABKt%A͚5}E] *^`رi v*muMJ?>n,LkچjoСC5{rڵ#Yڡ>hvoĉ±RpY-???RIc6۠<׵+ K̙3z<LT Zc\`u}X~F @� @� @� @�r9\iZVZܬ5]裏.{g9]3ό֭[e]V;3<8ZhiҜ#<2.۷oF/Y$ }F0=}6bS&@�*P\[ @� @� @� @� @� @� @N>1bDo~Y%*-X f̘Qt}ԨQEǛ`ٲeѫWxN:} r*mh[ˋŽ8C3Έo1nSV((((.\i-xb$+o|ʗ6QF;)m5m4 �2eJۖ[nn/8.m%*F'_|EqqI'UQ* @� @� @� @�j\cƌYף|cjٲe֏_|DgYrRn;,*&M޸㮻*z;<㎋GE7رct鲱بiQUN�@@&@$ @� @� @� @� @� @� P>{Vȅ<O߾Ν;GÆ {-?H!>i1:kg-ŋKI :sUVق7|sj;k>}[W[nƱϟ??F6myW_vQS;=Dz'92~_NKOM2jO[> {/їѣGGzܻvYs)jfҥqnᎢ  if#@� @� @� @� @@N ѣG ><we5ϫxz왝nY{TǯzL2Dׯ_Vק~Nvĥ]*((EeySCۗeVWn^@r#@r  @� @� @� @� @� @� inl/btb-~ &=8p`B~UW]OlVg>׏'x" O?tkVTφ%Kg}Vڌ3Vt_WL>={,f^{e)*mCƲg),n.N?Z. /hQFC=\rI\zN;/RnY:5j78#ua~ѳ?xAڨYfȺ^҅d׿ƢEg&N_Ѵi_Yq=Ȭθ[o[\veY>hmu}Hs3g @>:ƍjժUC @� @� @� @�lZ:*o法>47kM\<0|xÆ -Zd5_B{ټɓ'ì{챱N;es@ˠU2dHpH%PkOTZUC @� @� @� @� @� @� zOF&Mb]w{nn<H┚N:cH!Z))-6b;c\zYOSH?hܸqԿ={vtmGrgfKqqE m:S⭷JnfRn梶-[{gW/~~ڵk믿iLՑBziթS'F . 6|ѱc,l̘1ӟ4.Hzq5d~V}ͳg㬳ʂҳ[ne ムH{]=3Ej+sz3ȾUR@X JV)d--tÒAZ8cMo]spy yŏx2ۖ-[F֭#e]w]\tEYMwuWm<Kdz>(~C6 @� @� @� @�,p'gҜ5kMt=׷{778`l 'F>9_bM7UW]UuwDs=4DZ4-͋Ls+ ˫Co ZP;. @� @� @� @� @� @� @�@Z8 Q]q٢E~)(t95jJ b„ [G͚5cv7x#-ZDFl.])jԩѩSQF3'N:răNU6M6-,X-ޑ YyKFz=o߾(抃'q'J�E'ӬYHao۾M[7.Ν5h`uMڷixٴil2/\0?ĕW^-Br}$@� @� @� @� @.HsƎ[.<;5k֬x9t[mʷŋ;Nq}Uڱ 6,=W;L  PE><U#"z"*a*'h @� @� @� @� @� @� @�Cwߍ:+ƌ/bѤIѹ2E.PkҤIѯ_ux.,6Ϯ\֌3V6[Yet}c\#-r-_h]wuѧOsN� @� @� @� @�U.\ݺu:5jX~2+KH۵kWi?Emva1o޼hРA @ */$@� @� @� @� @� @� @�T>Hŋ/?p\xqUWgg}vtԩ X.])H+mk׎ݻFpnBzz?ݜ5kVԩS7YVYe݄T1x?_7xc\{Qf͸SN|3'@� @� @� @� @`iw{WqWJx+ꫯξOeJ?S*? ]&@�2[o+W� @� @� @� @� @� @� PҟY:4?s=rHsGF:u*ǥ^x` 2$Zn]LU9XlY~qwF u]cq'W!G9 ,_<i? {4hPQVr쉦 @� @� @� @�JwuW 0 :*X|~.RxyH]-ZTcTU?h*bĈ޽(7θjmW @� @� @� @� @� @� @�Lދo1H;G}tVS)Bu,Y ,(ިQYfkUd%RnHF`}R/h}W_1gqF>Sg @� @� @� @� N뮻.qTu>pg:_RA{az衇_~֪Uk^4ltZ'Uz;o @� @� @� @� @� @� @�UP`裏F yDz?<;8I&UpԆD ,\0yuZHdƌqqƍW}#$@� @� @� @� @RәgS馛aÆއe˲0?qVP|0MD~~~uM� + PFVI� @� @� @� @� @� @�TqsСC#<s8蠃 =zX ;O?t<S1bĈl0x`|{J˖-+�� @� @� @� @�J#/{ѬY;bv4}8qbtIk 7?+PV?>Ha5jX3. @Uz{Z& @� @� @� @� @� @� P ^'x"|xA>w=ԩST @H[/fV{/bm}f%iկ_tZO @� @� @� @�6SNSN9%Rֹ^xa6�@.]]w]۱cǸ;[nz5s}1ר @`j7* Z @� @� @� @� @� @� @f̘<LОT,Lkv={fGV[2O ӧOQFūZT͛۷޽{gO> n @� @� @� @�X)o[׿ ƕW^'xj՛u80>8⢋.vVE{';X|yU1 @ *'Uz;o @� @� @� @� @� @� @�RK/#G_~9xXhQl2veu]JN"//]]`ԩٿ*7|3&O5k֌v)cѱcǵW. @� @� @� @�6iӲP!CD .#<R~4ww]<qUW]]v-em㵻; K.KT3ZJoM @� @� @� @� @� @� @,Yov=:^l?f̘lႆ Ǝ;ݺu+*iVZ>7TٳgǸqދwy'}ݬ|B1lMxLZ@&TנA@c @� @� @� @�TA4K/|0WxGUpe;>|x#Fľ_|qpePSN9%|UT<Z&JoM @� @� @� @� @� @� @ ,Z(RVZ�#WR`P J[fbvm]tJNVZԖ TTe˖ŤI>?0,Dkر1}۹йv)d%7jԨK @� @� @� @� Pj4w]Ѳe8S3Έ4VR`̙qmō7}Q'.oJ>X8cU|G�) PMVI� @� @� @� @� @� @�("RPڏ7. ʅ լY3:v[ou8FΝ}Z(#!CeTR .O>$&LPK>XdIZӦMcm ;D׮]}#// {* @� @� @� @�T|)SdAQ7tSL6- :c_~YVy{'}ѨW^tI$wqZص2$~Gg#@�' PDVI� @� @� @� @� @� @�ب_u?>  FBfΜYv %СCҮ]h۶mVZnE; m/_-L<9&NX}6i$R\l6ѥK,HEߦ+%@� @� @� @� @@Xti<#qwСCcɒ%ѻw8ꨣCN:Uq㩧x ɤO>qqE _~ǫg}v̟?ڍ݀  Pj+ *7  @� @� @� @� @� @� @�L`ܹY֧~@>Ϛ5o5jԈ-آ(\+lJ6m{oyj*j׮]%|_n0ɴi>8E87gn;v,ڧhKf͊u@� @� @� @� @�&}Ѹ{'yes<H%m}3gNK1|ٜ4c9&͛7,z1pHIm Pj*7  @� @� @� @� @� @� @�V`ѢEYɓ} B:ujQ8R JJI/.1&Md k5RiѢEHRHRӦM#=_fu8ꫯ/־ȕSxV*3fȞKHAk)|-m۶vemi߰a+ @� @� @� @�  bȑSOeeѱ|СC#z{t-N!acǎQFGֵk۷otAYXX U[Uo9 c4.TfZzJoM @� @� @� @� @� @� @@HJ)L)T8ۧ`F-///5jT"`qƑfmsTR�SnS_~ԪUxxҥ`H̛7/+s-ڧTRXJ.@+[ݷJh)-ֲe,8-g�ϕ\5w0h @� @� @� @�TٳggTj>O +-"~ұch׮]V5kч_ɓ2iҤxcܸqYV³<ݻgA`) W^޹*7w^y6xJMjΛ @� @� @� @� @� @� @�j%rM)\+wrSZ#]KXӖkp\W^ԭ[7+u):Nj׮pn_fH)$*-[qdeɒ%-Z/_$%_r+?#BVާM'$ @� @� @� @�T]^5v>Yf :k۶mlٲ|4,QKV#ϟ_4070Ҽܖf,ܫk׮+;w4϶7pC׿n#@�' PČy� @� @� @� @� @� @� PҢ͛7Ji͛WTΝ@F`tpUR ٳ)ĪSU.j�5fƴ\8])*-()�aÆѢE( $ 4( ˅ \<z9+= @� @� @� @�XE}!R^RVO2% JL)?±|47/WܼT<Zjmqi\f"qB[nڵ7.'^`Ⱦ= @ ԪE @� @� @� @� @� @� @�UQ ///5j6?<Zj#FX^ջt{N8ZD7ŊI*Lu� @� @� @� @�*@cmJ%.CP:&@�)Prv[  @� @� @� @� @� @� @�T^"x# ".8b#Fc7J @� @� @� @� @`U˗ ZG4 @� @� @� @� @� @� @�-P7ZѤID 4(b=n#@� @� @� @� @�V+ P5jUh @� @� @� @� @� @� @�@Kgᆈna7D @� @� @� @� @H j; @�UE@VUA� @� @� @� @� @� @� P-1n\D^n 'D̜Y-o @� @� @� @�?{Uu wT D1Ɗh%1x4jwAcoR)(( k{ 0C`rֽ7!<xUX(r� P V _! @� @� @� @� @� @� @�T֭#'"^y%S[o6B @� @� @� @� P.\(PO�j* PX"@� @� @� @� @� @� @�}FѿıFkħ֌% @� @� @� @� ,U_1 @Ԫ/  @� @� @� @� @� @� @�@W\kSFleGUq @� @� @� @�j[7f 5cFI� @� @� @� @� @� @� @ l];D\ziąFsOč7F @� @� @� @� PLcƌl)((ǼybĈFzW @ ) @� @� @� @� @� @� @�FsgGx` 'DqSDhB� @� @� @� @�j@ ꝊKi]v]diW\q" @�UI*uV_  @� @� @� @� @� @� @�X>M6xoΈΝ#{lu @� @� @� @� P9: �7lL~<' @�* P"@� @� @� @� @� @� @� :*#v)?8䐈ɓW݂� @� @� @� @�Gڵ:Ķns$@�]@VeCG� @� @� @� @� @� @� @`%Z뮈'x͈N"n)b•  @� @� @� @� @�.p!DQQQIa[G}t @�UE@VUySI� @� @� @� @� @� @� @`%3"7iFĉ'FKM]N� @� @� @� @�VM6$r2¶82;@�@� @� @� @� @� @� @� @*h("x#b̈]#LjyV݂� @� @� @� @�X-GydԮ]{{D=b6Z @ ԪjoL  @� @� @� @� @� @� @�mx͈.=V݂� @� @� @� @�X|p-q8ꨣo[g @� @� @� @� @� @� @�@v툁#> Mw8ԈYV݂� @� @� @� @�Xe믿~# g  @@uUޢ1 @� @� @� @� @� @� @�X 6x晈n<8s爇^� @� @� @� @�XUVѢEU,7$@�kB[OL @� @� @� @� @� @� @�*@GGK~Ex`ĉ{:B� @� @� @� @�jA ,(6H (m�TuZU ? @� @� @� @� @� @� @�U(ТEG<Lİa:E\}…!nE� @� @� @� @�@6mbčԯ_?~_}\@�*@f� @� @� @� @� @� @� @m#"?>S"5!&@� @� @� @� @�Bڵ P!@�F@VyB� @� @� @� @� @� @� @` 4lq%o1{vV[E\xaܹ9F� @� @� @� @�,XTTGy], PEjW~& @� @� @� @� @� @� @�kH[7ވʈϏ<8#va uc  @� @� @� @� @@%?~1wl7o^%ou:/cu%[pa[ly̘1#x(((Xd),,ZjeKڵԩu֍vz"-hZ-y @� @� @� @� @� @� @�@n^8_2⤓"v)"fͪt� @� @� @� @�j@ 5kV̜93lR>fϞsi;଴:mp>ׯ-iAѰal)5j(7nҤIHK\aӦMu:W#@� *M> @� @� @� @� @� @� @�JpÈ'&G"/t;  @� @� @� @� @jHAWSNiӦcƌ7d봝RV *0¡aR[^"\dTDUnH\|ծ];jժU]PP%qE.]1,X [䗢,+{-=o޼HܹsXCAa%,VZYYbi)\+-kVҼy^;Zh묳N䷓F�W@V}FF� @� @� @� @� @� @� @` ~x{Dyf/~ jn=ҍ  @� @� @� @� @0'/'O%?-ޚ5k)dXfmNMiIaN鼒ݤI,j{V1>C*S}Ia\)l̙B_};vl EKaiFE˖-UV,),-mڴ)^ @j ԪZKo  @� @� @� @� @� @� @�Tu։ֈ~"N8!s爋/84AG馎 @� @� @� @� @@%(***ƍǏϖ;=a„4iR̝;DžѢE,,)(0M7ݴ8L)K:R8b5Q~HKzgi),-keԩzʔ)ji{̘1kE ]KA\%[Æ cu׍vE_? JdTW @� @� @� @� @� @� @�F?DvZ]wExt� @� @� @� @�VX`Y8رc#|/2 J礖BRR ;JV[m{wm6 AjӦMN!ZVUT ի}XR ĉuN!m)-;3oWnXob 6FmT@.[\6 jvb @� @� @� @� @� @� @� P4C8n" 8܈| @� @� @� @�T dYq|'_ye#MaH)CѩSc=ZG 3*=忯s1nܸ,-6tX>A@2}ÛlIt16tu  @` ,̵U{Kw#@� @� @� @� @� @� @� PLZ&AӧO|%mnꪈ."q ;\ ;K @� @� @� @� P@QQQ5r=zt5*[G?f5o< JaC)hh7‡R�Q *(((O[}Y;6RX\ZRܘ1cϺޤI|ͳΝ;g.]d|ȕ#W<}j  @� @� @� @� @� @� @�@R2#x"c#.$"7wF� @� @�jd��@�IDAT @� @�L`cĈgY)8VZFeA)<( ԱcXgu*Ht0aB6fO:-)k…ѸqHZ[net5u[ou4jhwjΕ @� @� @� @� @� @� @�D@}GvZDAAUWEx} @� @� @� @� @@3gΌz+xxw ?<}V[ea@)(-:uz}CGf͚#G>xybԩQXX)nmɖ={Fݣ~RjΕ @� @� @� @� @� @� @�D@3fD q?y5D] @� @� @� @� @`5 3&^zxW_ѣGǂ bM6=zDnݲe뭷-Z޸='0~6lX >< {7c„ QN,W^N;eK6mjRjΕ @� @� @� @� @� @� @�D@VŽȡC#?>bҤ?)S" +D� @� @� @� @�.0vx^Ȃ&N͛7޽{om]lkWw #PiR[ooF꫑B̙α뮻fK֭+t�jm#%8 @� @� @� @� @� @� @@U"LjK.=#ܲbi @� @� @� @�.gώ>xg#j]v%~;[lET!j'0o޼6lX1t, oWn{>;Fڵ @uU*Pv$@� @� @� @� @� @� @�&̋㎋x睈#;/~5O%@� @� @� @� @@U6mZ< /Daaa^{Ů:uJW?~sSO=j4n8s/} .vTZoJ @� @� @� @� @� @� @�j" Pkͽ "&s"]7"7˚' @� @� @� @� @ ̞=;ᄌ矏֭[Ǿ-}zU֮+)0sxgG}4ΝOq{GڵW .'@`U *fa/u% @� @� @� @� @� @� @�VN0_<zjĨQ:EK1D̘ru5 @� @� @� @�o{l1hР\UxcܸqqW.Ll P@ӦMo=x衇QFѿh߾} 80ƌSv @Ԫ:JO  @� @� @� @� @� @� @�T[\ < @� @� @� @� T ;c;\}ս1~ˣgϞQPP{8H@SNnq-ɓ+wy'6lw}_7*j@ � @� @� @� @� @� @� @@8ѣ#7CaEUzI� @� @� @� @�U!D׮]㎋]w5WCew}{DZV#܃�j"P~8C^#GFvb=+TQ5I@VMzJ� @� @� @� @� @� @� T?_9W]uRy+$мyGbر[lq m/~go^#Ćn<L @� @� @� @�.F'q1D~ /0ڴiƆp,o߾k&M[n%88묳H*CL>gK+{wWix≬'\]f͚zkvaqGG?MWtlk>,u~i*ʛO @� @� @� @� @� @� @�.&#:thyחz (N;E qE{UDyvmGU~ 6lJ1!@� @� @� @� P ,�'|'AѸq5> Ĉ#r\#mWt/#=1cƌ~|+YU s1dȐx_KiyJpBKumcƌW^ye 80>8}aYZwu.#G̙3SNC-2  P)jUנ @� @� @� @� @� @� @�Ae˖Ѷm2Ү]/B-P^ąF QNĶF}vĜ9e矏 ._ ڪwe8ӲGN8% @� @� @� @� PR8a_|q<#qG-*͸jժ|=: +>bO?xP]w5ϟ_iBN>j8L4uꩧ.%+}.ݻ^{rJ駟^lc%\~x Zt/@g4 @� @� @� @� @� @� @�H`u׍[ua˼Ё9#krMHҷ]7HyI*\%MBS_O @� @� @� @�… Cz+^}c=*87oM6]c}]{>sbȐ!]ejSsVVZeVd][M6ѷo.{u]W2mwq3j0&T2}!@T~ݳ� @� @� @� @� @� @� @@ 6E j߾}uȓ((8餈}8Ԉ,b.XgEN4?~z̙3'vm۶1f̘e]믿z(&LIѣGczk6Fmuui<yrt=:h֬Yv<M~rG^~ѳgbQN8_^z)AqEo'|rL81:,?+#ir|{{o&R_O3eʔ+cѤI{gRk @� @� @� @�5Z <sof5;#==Y})wމ?7n{w\GGφqgJ?RW_ߟnܥYe', /=?Ava;m/*;a9(&*O/p1dӟߩF;TgzeuRrHJkNU]gSO=ܓ/{'eի=KiРA#dua_;g}6{;z-ccY_f̘Gyd\uU?<x7bvj R`kRmZqc|5jTmnY[ڿ難(7W\qE֧TWwM7-F4]:uj~gQXXFv]xHL!pN+;wm!kT*Zu  @� @� @� @� @� @� @HAAK l"MY\U2"7GթS&\ӚOOO~hٲe6̙3`뮻.{dM�4J JodO]tɂd)t+MNZw YF`Ij ZuQ1nܸ|cܹIq:pu-}2dH oRVji’4K J#FĹ瞛Op4YIFb}4A{}Y6 8ui4 ɯ~{ @� @� @� @� PRE]cǎ =yYP ZpaV_:j+? |R=Ygo}u뭷faZizjw}7RSh,`qY V Jmi5U 4X6^ZMԾ]{8<,k6~D KR\sMzYW 0J`esXuV>kYX JAXq 6(^1%n! J5czR}ٓO>ՑuСT;SX {Wt.ղt0Hjҷq'gIAicǎ#G'|{YfߞO5u^zi>.l|O Ⱦt_~ӦMx[o-4~Zi&iZ9ql$?RV{wGV%y)AW!; @� @� @� @� @� @� @�,4KIeJ@,xZIEx`D~{k_ 4(>Hl喑&vo>:ZkڵkvzRV֭g4)=ܓM+Ç_wqGvc=6RG}KICRWP$M,&I6n8 J7+((Z&ߞ,,aÆw%xQXXjՊ\w=ӘN8lbD @� @� @� @�.BRO e˖#w^Ν;g5JiGJAHb/g禚|Q ʷ!C[oukYuVs_GJ]q3aZ˪Z&K={F&MT~3&N?\ [.,WZuf5cKZuV[lEV½RV AKugztWf!Z)j~_o)ŇRSO=]vR{7믿>~l_~=gΜ:thQNH] KgjRZɶ<]w}.KZ.ipe2Z>L}_uݕn;oN [tp:D@ Ԫ0j"@� @� @� @� @� @� @�SNͺ&Ъ@Ӧ\pq"rs&a?͎#MB2xH!miB|iQF'dPV[mUK.ƬY;̍q~Kvm/78;']Զm=# j߾}i>,^z~![B~(**&r9zo7zOnG½N9唬>`;餓0&@� @� @� @� PRM jѢECfRKG q#@=ӑR馛O̶W*�;RS*ٖemUU^=PV+s<Kj֬Y:TgVX(u/k_yW2@֮]X{S[ JO eKm 7IF͜93n\*,LV{ʿ/Juxy_b3Rxm޼yٮ4]wݬ{pW}#@f Ԫݨ  @� @� @� @� @� @� @�T+v6,bРsύ? Ӥ0)j 6$ =Sr?.^iҤ}QoG~=zt|1pӤ;47xcv/K6Ζ4M0~r!qQGoI`̙S<;r/(/~> @� @� @� @�5Fcǎ15jTsiuJi`rJ>j&L^>٘Wߏt-,a<5UK\TʎjJZ+DʟR׉受t[]uV%kJ/m_X~doʽ^<-(7J~j*7vyhܸqliwmEG7.q _SwߕT3UKPIvGuԉ:T_ @� @� @� @� @� @� @�TQu#??b #z\T?4)Fc_,ҁve[n]y&#)>90741Lfg-kݻw/[~ᇸI2d3^{mCĎ[{4gy&:蠬鴷zٜ{!'O^b @� @� @� @�j[oiK8h޼yu 7Āڪ4:c]vEV*jӺdW˖-C/rSzd"'~>VuV%u Gi�`tMV:|SO /}7uSRڊ~OKUR^ ;v" )S[l#/<Rp\l}  @� @� @� @� @� @� @� P6<#&#t\S1Mܑ&I^Zov4h ;\esύ ꫯƠA/m#f C=4>hӦMOgA]{.ώr)1iҤlr?Ӌ941Iƍ{aÆ'MqGƗ_~Y @� @� @� @�*pwwyg%H=GuTL81?ı[<孳_PVku׍3<3?T\25UfeDM>={VJaO)x+={fҁ>;^oqYUJk7dȐP߾}:e{+x mbN[~y~:/{ャv.MKu)2#7j@> @� @� @� @� @� @� @�($?>bmc#N4UW]W'o,tm۶YxHA[ƍ:?~|/ I&q]w]|q_7eʔl&( f͚lbsRVj3g̎ JIK0[lEj*+8O>qdciCѣG @� @� @� @�zo19昸[*-C&M9F*>8餓Z+_eYM_y)Lg,X 8,(pyjyp?ʪj޼yvEJaP7|sR=~,(@SO=-Z:+UZ=W ZUuV˪9K(^m15*?xGfumo}',ccəWoeΜ91{:ttƌ6m瞬sN1wxcĈXtMic{;RTW\qEV?*cKg]vD�L` f( @� @� @� @� @� @� @�FmD{oG ѩSwT�Sxùѻw8ӳS~GP#Ν;G׮]w&wIXw\|'ħ~M@2:GM Og<sل3)[o&xGWUv/tP  6#<2jv?uc=6Z3ȶӘ mI6R`/ˬ)ln& I!Zi4Ʌ^gyft%?,ro? @� @� @� @�d:*8Ӳڡpz<0OGqDVu'fx,0W_;/7x%:v[p KmYuV))r;Zj۷»z葅i:%\ƎDK>,,iȑYս"C=4}~oK/kV,kUY./T76e-Ku^ի5麞={fAZ :u/uIj*֕R3fLV{jHaf|Af;F߾}O>94iW^yeqmZ>p+Q?= ;, ]jR8ڊݻ3<?xt-s(**&ޑoEUN0!c߳>;sE<3 Pn? }  @� @� @� @� @� @� @�T4C(+&%C2Rf͊8眈ku׈뮋hRN\Ż$@ jԨ"OHt|d?OƲQ^1shР"L:5Zh+s~Gpnݺ^&I`oq6rI @� @� @� @�jG})jʔ)?9 NӧO¥RSimYuV]SھZTcUXXk"]6mZG9UgUVcg}'ٳYfB*YNko~ѿelڹ*[7o^vEE Ka-[lV y.�2rA}Ta Z-nJ� @� @� @� @� @� @� PjU}}㎋\UD~zD+_w @� @� @� @� @k6;xs‚ ZgմkSC=a!C,<_^{Gy晫<-5y\ L.fVY<!ovl6rI9w?Mc[E*U~Jes% @� @� @� @� @� @� @�UPWwߍ䒈Ϗ?#n1bm`t� @� @� @� @�j#PXXrJ? 9ꨣ]v4iRmZ۷olK}l z6k,>e>vP6mڴ_}UZk.~:>|xm6:uL&֯96iҤ馛.K|sLԭ[wEn\q{ @� @� @� @� @� @� @�֠ѣs݃4?; |q 'D_]Ѩ?|nR裏cǎ5`H� @� @� @� @|f͊[n% <yrr!ѯ_ӧO瑩"g!LwuWEsu XU{(F~ڥKc뭷NT͝;7|ɸ;G]o~+ԩSIzj) $:4rnLZVy\G� @� @� @� @� @� @� PmƏ뭷^\pUXXp@M…t&bM#6bVN#gٴhbnVM+ܸqj::"@� @� @� @� ,X>lzC:Z;RMF`U |7ܪ~RV jРAeV%矏|0,X>:n 郇 lZ6* ZeO� @� @� @� @� @� @� Pc4СCO>5f q.=gy Ev=z&XG� @� @� @� @� ̘1#x׿/B:<k~M6] P& ~x''۷o51X F]ajΕ @� @� @� @� @� @� @�D@V5yh?q}qG]2$vu׸s(MhW @� @� @� @� PM=X<3Ĝ9swY.={u� C$P0ˑ}>|xl2{,@o= VA j& P/TV\I� @� @� @� @� @� @� PMjU ´~O">bMVgyfp {EV @� @� @� @� @r̝;7g;=\ 6,իo}ҫWhڴr)T_j+Yoy{# +[EJ*?@۹� @� @� @� @� @� @� @Ԫ&/r5 7#;.#??bڵA?c6Ef_49� @� @� @� @�6mZ :4^z,h֥Knг[jV(j%R"̙޽[7x#>Ө[nrwNѨQ#dTQZqoJ @� @� @� @� @� @� @�j" P4K/ˆ#n1r,FMrq~.sY I� @� @� @� @�U$0sx_|Rӣ~YVnb뭷Ζ] YEnS߱f7|,D+GEvEϞ=W^ْG�! PQV\I� @� @� @� @� @� @� PMjU'1thĩFO/C/oMFӽ{Y @� @� @� @�X|I;/3f̈СCtҥxܹst14h{@ cȑ/&LԦMHlM}UszMr Z.ROU* @� @� @� @� @� @� @�5I@VMz+?n8㌈F"&b}}υ Ʈ&M&1̲͜A� @� @� @� @@ |1bĈx)xk޼yYloylf&Ħn뭷^V|=@ }Y|駑N|1z,HkĉY/Rm`Nb-][n]A*@ Zs% @� @� @� @� @� @� @@5UM^d##;#ew1nܸl~UW]U( @� @� @� @�_  4jԨlGeB3gn\^hb7:/i߆nM6-\IMf଴;8D+͟??I- .:wӷ.X^jΕ @� @� @� @� @� @� @�D@V5yk`O=qI~_Eݑs \)P܅{':B� @� @� @� @�* 0y㏳pK 'ʷ͛믿ȲzE]vѶmhРAtk\`֬YW_/_~e,|s r뮻nBҲ&Dǎ Zk ^>jΕ @� @� @� @� @� @� @�D@V5ykhiϏʈwMQvg;x饗bĈk}# @� @� @� @�3gµHK /o7.R… GZ)̨M6YQ~uѲeHaF)H#`Hm_u=M81&Muڞ0aB?>RVծ];!olA%p CXK@VزjΕ @� @� @� @� @� @� @�D@V5ykxqqFEwEԩdf̘]v^zŽ޻  @� @� @� @� @̛7/ ;ꫯzaHiofZjv-buYbI[ii֬Y.r?*@QQQS]ZRPV~:ujvLZiISV0K۶m}Y`[Z6C^͚�! P+  @� @� @� @� @� @� @� @ /6oq}7ѻw,v[n#  ~ @� @� @� @� @ԩS'6`lYpᇘ<yrqR>L)NJ~iqҷ~RR j޼yM6͖?m׍7&MDZ/4l0ׯ~ZdaVs̉ٳgw}2k̜֬93v KKK J/RUzW)$+=zdj)Tm%}WT]Vu @� @� @� @� @� @� @�V^`ʔ)ل C>} ݡ q?qI_ Ve9o{/6pEE� @� @� @� @�7o^L>= iJAM/)):`2´RV / 4[d;[nvZvڑ%;=+pvZbG_/EEEl'̝;w?),.ҒJǖ8ekVr_C^{HKF�&+OէGsUk֬ @� @� @� @� @� @� @�TZ%T.qGD.7+79JWG74ȶnML6 @� @� @� @� &Rhw}/&J,U2xv W ʇZ *K Z{ynyna[-εx`W JK>+·|�|(V2D,֍5³RV~Icj@ԕ @� @� @� @� @� @� @� 4#?ZqW]ѦMdy睱v%\g}n @� @� @� @�T@>(UV̩F3  @@U(*O @� @� @� @� @� @� @�TE-"n=g" )#.jc @� @� @� @� @R~1^u @� @� @� @� @� @� @�nEqѧOćFqѻwׯ_Ug@zJ� @� @� @� @�.ׯz Z! @� @� @� @� @� @� @�h0K"z+b숭¸㫯Aa"@� @� @�}YQ.K/"EMl "vDP4K41Xb^51Fc&FQĀkĮ`D*JY=;E)˲~as @� @�Xu @J Ԫҷ  @� @� @� @� @� @� @�m1fLD&N>K2g @� @� @� @�X Dԭ2X!  @� @� @� @� @� @� @� P\qiElEa��@�IDAT3gD� @� @� @� @�&a @@U-nE @� @� @� @� @� @� @� PUڶ92=>(~U]y @� @� @� @� @Z?_Z5gZ� @� @� @� @� @� @� @�I#"&Lh{yC<t8%1u* @� @� @� @� ? "k{ @: ԪNwZ @� @� @� @� @� @� @�MFCqjDW]ti^ @� @� @� @� @@% ̟QN%u P`5 l>C� @� @� @� @� @� @� @` 80MV:NIII4l0N;hԨQ5kwߝ+=h:#Ǝ8(SN房5u0! @� @� @� @� @@,Uƴ @jU. @� @� @� @� @� @� @�@&M&/.slwR^ .8Nn3Έ6̏`, @� @� @� @�@ Ԫ[fd. @jT^Wz"@� @� @� @� @� @� @� P5ʉG\@`m 3]^?U @� @� @� @� PGԩS33' P @� @� @� @� @� @� @�ULO>ѢEUCY5. .j2S"^{-Cw"f^� @� @� @� @� E`u e6A�*W@Vz� @� @� @� @� @� @� @ QGjZlc=f͚-֗@6#FDzk:Eyq  @� @� @� @� @`] ̟Qκx @`Z7F!@� @� @� @� @� @� @�(0AŢE;%Kd[= 807"8Јx) @� @� @� @� @ZX@Z9WZ @� @� @� @� @� @� @�K`/wڵkǀ{A"ФIĵF<h;G\qED.N!@� @� @� @� @�j(tiDI@jxk-�O@G� @� @� @� @� @� @� @`:thԬYs)LA@ {+D|riE1vg;~DяEV|3 @� @� @� @� Px |9:u onfD�*C@Ve(� @� @� @� @� @� @� @J 4(JJJ{z=xeyA֍8_(*~a"RxWo~GrWxM� @� @� @� @�,Ԫ]gin @*n% @� @� @� @� @� @� @@СCcU4l0weyAtS\qݻGُqE_ Y{ @� @� @� @� P ~9:u yF�*. PvZ @� @� @� @� @� @� @�T>:ԪU+k׮+ UF_)b=";.bƌC#'s / @� @� @� @� @p,rn @5Ӛ� @� @� @� @� @� @� @ �%KdXhQ < |)кu=DqGѮ]K/EO(= @� @� @� @� @Zk̉�@57 @� @� @� @� @� @� @@hٲe. 6d۷o^!D<`K.{~#=4rr˞� @� @� @� @� K`/SNal @@e ԬC� @� @� @� @� @� @� @`] %`X6$8j~ynݺœO>;S ><Fݖ=WV]vV~"mՋuMb<Ͽ$" ѵMYfŌ3b٥7_~ѬYB� @� @� @� @� Q uɬ5 @`ag$@� @� @� @� @� @� @�y 9s:wmϲ/_D KVFVV[nRM@ 6j J5j76hm&M"զMFF!P;9r-sWqzEtʯ]|ߎwyN<9>콟B*ZZmYk.m۶Ͷ]tVZUk @� @� @� @� P@ڵ z&G�*, Pt @� @� @� @� @� @� @�6lf5cƌ6mZ|GvY`'|𜴝9sfp¯gAR)L*(J9i?>ʇSm SNVk~!":mS5jXfc38#~ŋ#ݖϟK-ZiM rPQv6 K.)d諁b߯5kokm&ꦛnm~-\Za ̞`Ȑ^ԩ|mRx֘1co+ꫯOzZn]xջwh޼y4k֬ߴޏ7&}m~6޽{#zk-� @� @� @� @�U] 5W P-rZ̢ @� @� @� @� @� @� @�*,BrL4uJi?iQTTٔ y?mӦM#kzRXV!ړ| ٹ$Yf-SS�W>T(Z),mSWPުUhٲeV~oyV۴iV?G8g\[D.-e]jc/ѨׯH<zx'r>_j˂aV:tȍp;vlꕂ_)+=)Xo߾~7 ZG2  @� @� @� @�*M խk}0rnuD�,͛GVrռ;Z[ @� @� @� @� @� @� @`y-w}7&M2ދ__I8@noD-exN~~_ ,ɥ$@tG}T?,-|Ig)Xm۶Ѯ]ھ}r-nݺKm@ʾ{饈'\ Vc}*ܵHL6^˜ܹs{7FmY8U ӧO"O K_)+'s�y30`@l8us"@� @� @� @� @r_7/~v� D@Vo@iI� @� @� @� @� @� @�(xodu„ [oe5f_N 0|Rڦ7<mY.p'T Kcʔ)5vZriJ[*)DcǎѩSb-<Ux/R#DmcV,\xnu]E ߿X:Tϟ??Gp#F]tCƐ!C"* @� @� @� @�(T׹#By @@?*n% @� @� @� @� @� @� @`R@رc:nܸloܹs96j(fHH)g-̶iy) v.m)_'N)m1cƌl˞]FnݲSR5>$?cԋE'1?hҤI\JfOǍ7~{|ѯ_8cv[I+ @� @� @� @� ~n-bŋF%@� *< @� @� @� @� @� @� @�,{?/Ri7k,t)(m;vՖ-[L* |K]JZ)^|Avە> s+**J:yKo[ 'G(**yR9,XsO\veBz?5jT�+$@� @� @� @� @Jxcĉ'F|EI @`U[/PvZ @� @� @� @� @� @� @�ֺygƘ1cbY6lnmV{~Xs2� ̚5+^}xW^ɶ)hk…Ѹq,hwv)vehڴql 6SO;.5jgR8å?+wc=,  @� @� @� @�F~zĜ9, @JԪmUq;-  @� @� @� @� @� @� @�.0{=ztVz,$ڵkY0QϞ=A> T@ J![=\VS(믿 ѩSӧOno}+6lZ_XdIuFqqquY?jժ_"Fo\ve[o8�VJ� @� @� @� @@ \uUgG� W@V@iI� @� @� @� @� @� @�XcEE 5jT</FQQQlYP޽cwo|k<@ {g駟'x"۟?~Ҷ~0j9z+g?B5jT-ZJI'&Lq)D5*k} @� @� @� @� @`.4:u�ֱ@ Ԫ @� @� @� @� @� @� @� ̜93>|x<C駟Fc=#m*DQX`A3&}x۷o?8hݺu\YaNꫯN;-:w]w]S3-Y /0?7v[lٲ&i6 @� @� @� @�T{uUSj*~jUNK @� @� @� @� @� @� @@f͚wqG{,ׯo~YV-ݗ Tg9s#<w_1"OzC9$ $\7$N:餸k⬳Ί_ב˔7n\,Ν;7\\M� @� @� @� @� 71~|В�־@ Ԫ @� @� @� @� @� @� @� ,^8 cȑFAQVw.t3fLu]Yɓo߾1t8â^z:Q֟Ÿ8x㦛n/B?p @� @� @� @� ώw"Ǝ]�** Pr*n% @� @� @� @� @� @� @`ӦM*ژ5kVxqGǷYr8Hy,[ouGF^k׮ѴihҤI\6+>k"=Ն%KO~+G~ko0= @� @� @� @� @<3rx$ P*~wE$@� @� @� @� @� @� @�,#0qĸ ǰabѸqe� N%\wuW\~Y-[ZbM7͛gu6-[FVuѶm۬n˒8wߍ'|2:tPԨQ#.,$񨣎ʞokУ @� @� @� @�X…k:W @�* P9&@� @� @� @� @� @� @� F>s=7ӧO{ア^{L@uSN 4(?pQFea[ XH>}zL6-^ȶ3g,hҤI0ձcfmsѣGh׮]^Ww8xꩧiśxLJ~vX⋱[tM� @� @� @� @. PkC�_hiTeZ! @� @� @� @� @� @� @/^ӟώ]~,PG#xcذaq}ũ/4hLyŻロI&ń boƔ)Sk7hٳgYmݢqS^w7Ɛ!C”իWl&裏V@*{CL� @� @� @� @@58Ĉ"-�@#7=:ojuZP @� @� @� @� @� @� @@xbY ϥ^GqDY,#tO<Fr^zeWŋ/~ѢE8Um>#Fx f͚ަGozkl˜9sbر>U\\;C|ߍ>8t.M7ݴkVu~*ppѢEY_ ׿U_<$z+<J_`znRu]GuTC @� @� @� @�$c>=x @@! ԪݩQZ @� @� @� @� @� @� @�6Lz*zM4^{MV5 Rϛo^Ξ=;:,iȑ3t5׬q볃sƂ "'o}=# *kwqmk:7>}I')kG-ܒS]}ٶ[nqeE jygb_=\zUK/\Ýn!}ݸKְ{.=xʢR{l׿2N  @� @� @� @� paDZ @@U}ﭕ @� @� @� @� @� @� @�kAscM7] 貐jԨ'|rtСRu{cmºR�RU.-[;v,eԫW/ʸ+#믿BjѢEvaqԩS#Yh[lsN|}j*ŊʪίO_C 4 ,Y$j׮Z83cʔ) @� @� @� @� E"ѳ>  @@a*` @� @� @� @� @� @� @@xwqEEQQQ)V@qqqtodԬY3ۦ� VJ뻓<p qWlj'O<Dp޻wꪫߏ:+.ڵk<Yڵ7| ƉckFj{i w;w^kL7zk}, @� @� @� @� a @Z6̵[5l_~~XU @� @� @� @� @� @� @�HOm&~߭Q?ո$FK/}ƍ^{mn:N6-z?ϣqƥ/\0.x'cѫWb-"Gа)Sdc>Y0T/ΚKqG j۶mvmo83҅O?t|L!Kk{7:(skV޻+l۷?gݙ<yrtMCE.]׿u4o޼ѨQ8c}}y?]ufG))gy&dkLLs+7k\N?:ujƏi/M6$⊬{/nlݻw?Y`)RQ%w\}/RTe~98co߾qG TJU_Q9f͚N;:uʞ=),}.sje|TU{{n,]Tb* @� @� @� @� :VG˵ PjTI3 @� @� @� @� @� @� @`] L818FԔBRT ;P{.:,dN>8~7/2>,vmxG뮋zRS Z2xdȑY8T/{,{}E9g}vԫW/ 6lXtIuO=TYHփ>x1a„|{:*xx7b6Uo$ RX믿][ *zG+2vqǘ;wn;;s0_GeaS$R,ʠA?AҖ^΂~,|(t~qaY0׊tRS =K%ǥc)lٱtRXZSZO:vg }뭷�ʜcӦM#tҽMÊJ2][㯾jghuU=c+<J=z g͚ڟ. @� @� @� @� @@N@ǀ�@aFuW> @� @� @� @� @� @� @ =:6lַ f-7|s&l&M)Lk- . ne]P4"ƌӟYfѩS,);{OD͚5VO;۷o\r%~Ν_̂y晨[n/? [dIt-j׮P-^8[Kj<u{l'kӟ4 zW Uo̮/..ڧ fs[RH?pµ^us'xbʯ~a"0SNOmvZ 2$90znX0`@llrV[m̕[΂s,SI!bZ܍1"IAn:n,@'.#8bCk.Vv~ WDzif5ZU=c+z>gg,HT׮]WW-oB� @� @� @� @�H_}U{(/2pc& @� @� @� @� @� @� @�5kV l2F6<ҩΛ7/r˘3gNvkVZEJiܸq~ywRxL JQSL;/n 4wy:;,iܸqY?z왅|]}Y_*rK|g~e?֒Bʳ|MJ]vY?vʻ&Į]^N,,=駟ƿx㍳tQ=.͟?? ZXw}wv>ͳlw}+˻k2nٱʻC OKh)*txm͛gicǎ^\e+|*:>cgQsy?3_UH%� @� @� @� @�-h@6@ºfC� @� @� @� @� @� @�@۶m>ȂRSԔJqqqƏmQ<u̞=;R՚uuŠA"t0+2 Ү۷oO]v6^ze!WwbĈ_{lI&N>jځѣn{?JHT.Y?8&LuYqiVwovv}~'?_~Ud8]V69ke1cܹscƌkQFyneז[ѳk̯l\>0� @� @� @� @�- PEG�&_Hڬ̇� @� @� @� @� @� @� P`OB ԯ_? IAS_-N_|1JJJJ_WdgűN;+GqD6G<J{7[mUy睱_cǎ˴M[}O/RxMy֛ymZx =ЯRpY*ii<sٶ?yL6e7tO>4TZh/dܲT{,&MtP/sʔ)1x!W郬Fi�hK3&J'O YX'@� @� @� @� @`-Z $@�UPd @� @� @� @� @� @� @�BhԨQ?_W+ F*o4 K.-O?gqFlfYg}?| w't~Ѽyo[,YdWe=zti&u]tQ`f̛7/瞮Io4|I!I~jGGecY~̙*};߉-26lwqGK%:*&O˯+Mofl'z?myZYfvtܹ61ݛZs8;ڵk01cTrnٳgv7xJsM;q/UVg,?5y}6u!4iR3' @� @� @� @�@ Ԫ]/  @Jj) @� @� @� @� @� @� @@Y_ѱcw ;iҤE �׿{w\}08EEEq 'd2$R(=/KX>Uү_l.d?)x*M~GjG>)cy睑Sygy{챱رcੳ:+s=7VW +n4m4K.!H)kʔ)Y?Ϗk6vu,0+O۷os9q%d۵kzM0!ۖgm=t쮻ΧFlI^/~w~U%=/q}šf͊> k-o~u__t ={yIΝ;ǽ[)di~:H!J9.Vְa)�-ݯ*}쳝氼kWd]@3fTyۤϰ`� @� @� @� @�HZjb @�*( P 4S&@� @� @� @� @� @� @�֏@:uVnE>e}&!<w\o5kl2z~믏VZe7?&N~x}YHUE֒Bz'tR :4~aLWy#.sy5Æ -Z_tMѶml Z4h |q_ςRp?cg)/Uwi5gyf6={fWm]ΔSHY*)D+ROڵkwy٘)|iܸqٵ+)_RX),9�*GƍWxS<c9&uF>DZo KJ iJg<cYV K:uj<{ٹC9$^xl}Bol׏dQ�-=>zѺu>mZ5\ 6̞Bj޼y+Wuʞ}x~=M4ɂϖۗwBR^*>}1f̘6/us* @� @� @� @� ZkCU PHE/e/-  @� @� @� @� @� @� @>8p`<sY0T *Ē4 ۗ>~őBx,)\pe/[~ )))8B8eCիWufAF:tX/<RI}^IMiղΟ??֭)vڱ&|y_'dZ 6ߎ-25j+}=cƌ,tM6Ѯ]^Փk2nپRo=3) -_^S<Hz5{9Jdzne}#G_~mMgO<D=: o5kVl6{?ͅ-)`O_O=T'FU*+;5y>O Lx`}N @� @� @� @�TcW S#N;/ P r_{}G?rE۷,h.:P @� @� @� @� @� @� @�j!SᄌKbȐ!q7_'SS ZYl͖{7M}=?Fţ>Tc+]JZ"|Yfղ馛~P땭7iҲe30Ud5l0v|6k,G[50|JaZǏޓ)-=)(aZu ˗sƛohK/ /.Æ |;ѹs|mW 4<0N:x+5myؚ.iuӧgcU?AJ9׿5 YLϞB� @� @� @� @�%paoz/X_+?'3 @� @� @� @� @� @� @�@ 9cYhM 93ΈVZ7'f8Ccǎ˻XzJW3cƌT�]>ׯRֹ>^175Ш}{YQ%]v;eʔmߎ?0;.]dAhGqDѽ{(...teVx:<qWD׮]OkvjܸqX@;* ^U ʘ> @� @� @� @�%%]BlE//ݰ � @� @� @� @� @� @� =P 6,^y8#nݺy먇s9' IWM6_&Ï5*~ěo)hqEEפ[m ><R[oUz<;)$+pu!zԩSk.jԨQ˽M6[^}X۟{ow%ĩZީn5>ݻw6zUjv) @� @� @� @�VOq?!W  @` b~iDѷ&PA'@�j��@�IDAT @� @� @� @� @� @� J/8RV_ł:( *~e2s̉KYf4lذuEvϟ-oqٗ ŋ#} /OlIIIU̘1# [u=}^cMrCS~ey{Zm>=C{W̝;7~iaZ @� @� @� @�EA+:t oP(@rB-粚9 @� @� @� @� @� @� @@RHNƍk&~8C=#+k6}֭**Cgo=n喘={v|?1ڵkGj 2eJeﳕlM6RWˬ>N?,)͜93~ӟVbn?>xGim5 @� @� @� @�X%%j I�֑@\YGc� @� @� @� @� @� @� |q]w7>`4i$8vԫWo3`Xxq<1|=z6mnNkl=#Yr;?i g6m=[^4%@� @� @� @� @@#n%bq%{?h<rkwݏ_GU @� @� @� @� @� @� @�UJ_Ŧpߑ|jժj>{V[mUc*[>BR֨QbٱN;ArHmvl5zwYzk̵VisҮ]k׮Ux5~%%%qE9x`p Q~u?# @� @� @� @� A ,]QFĝwF|I`2*~jUNK @� @� @� @� @� @� @@̙#G?qӳ=#v}۷ol_CUA =c®ch`J.hn[ѯ_l*u))+BvyJ*t6q8瞋_W_" s_s|Wc7|3.8䓣h}N @� @� @� @�l`EԮql`\T1Za*n% @� @� @� @� @� @� @R.]/b<#O<yi&ve,wѣGYfZ =oF~:)VZDŽ Mc֭#&c/k~UίW,Y^zi 6,ڷo^xa.uZb%7:z7pClVֿ @� @� @� @� P^WKA#"+o+ @UquZӒ� @� @� @� @� @� @� V.\?|<Y}ꩧb̙QnvmPv!~\6B]'K/=\< 1w܏y4v)՝w9;+)\\V6J1|V[Gԫ5-I3ό뮻\u*=)t/FeZC5jT[ @� @� @� @�+ZS4n1jT>4M�r*Ԫ @� @� @� @� @� @� @�u"‰&L>lVnjj,X ҥKգGڵk͛7_'s39skƍ˞˗_~9~Q\\:uo~;f[nՕKTՐ;GEiѱ㗵lV˖;چu}L~O<D;N;8*tɓ.k6[JrIׯK3 @� @� @� @�̙͚E<pķUc*~jUNK @� @� @� @� @� @� @zXhQK/e5@reM7͂:҅R&.mrC5jXo6p\\Uڦ?[TÆ g.mvY޽{ԫWo.zˆzV ߚ=ˡ5zV j:uTO=T\|1|b-㏏!CdUj!9ْ5jT;ZhrJx≱Ffo.'@� @� @� @� @>=rox챈v[;c�*G@VjUNK @� @� @� @� @� @� @@ L:5 ;vlYQΚ5+k\zPc-:d]vj Щ_~Ʉ֍\2ɓwߍwy'Rvi8qb̛7/H Jm:uj.][n3TTTn&[QM{a[cɒȅEmlV -/ёrS.0aB\uUq-'|{y䑱~ea}aKr1cgΏsZзo8bQVLk @� @� @� @� @ |ADVO=ѻw5Z @ ԪMUq;-  @� @� @� @� @� @� @�UF`1~x뭷’IO?-]G-rCmM6/S[l7f͚۩)<(=~Mcʔ)_)D+KץR^9jеMu뭷֭[Gg]X ra[6vx/RV>d+msYtQX5_hQ?n!FN;k/ RJٳ#F})D+ 2$>왯wʬ  @� @� @� @�{/rs3&b7[#@;ZӒ� @� @� @� @� @� @� P-f̘Ni}/ )tiv̙QFl馑µ[)+_7on&ѬY3[r¯f͚|I5mڴjM!Y%%%hԨQihZ OK]vYPڦപTJqE>\6vK##ڷ_6dkm|{m7o^<1|0&M.k'vۨ_~gy&|x'bܸqR(XcΝ;|M� @� @� @� @�+4)b-#^x!gϕ]oZ*n% @� @� @� @� @� @� @`HA:SN͂.T6x+@ƍgZ)`iӦx֍78f6Zf۰ahРAu>sƜ9sΞ=; JY&ߴMh)D+NZeKṙfmV~Zjt_⋈  J[X-\\õێ Ys+s+d!U?x>}z-sҽ{vԩ4-}pH!)<kĉ1vxWmzOv-)+) @� @� @� @�jjio徣UfoذjU~ Ԫ @� @� @� @� @� @� @�eRǹM5>)l(T>$*,XL/M\ςRVj:߯[nԩS'k.ݦ,~ �ʿNK.ŋgAUeeSPzE";\Wk Jd)@+mSj V~jՊ+FS8ѦnZV^�d[#1~a[)d+ˡ=Sۙ _V n2E4iRRMV)*ORIym۶͛gV)*}߷T=/0M| KTRP\ΝGYWڦV @� @� @� @� Px#rߑ7.K'@@U+PvZ @� @� ٻx^{of21 9aO@DRjV?Z?NW#HU 2؊" P0e0$$;=I@I|V{>9 @� @� @� @� JhN ZbEG]*u@R6ZjUGU�Ү_m\o. )Zz%�u*@%تչ.A`pRRRJ P3/PɀתlzT>ǵUr9`ޞ0!mv,X ͫ.{@|NWWS*r=jԨL@K r @� @� @� @� @ '%X|A�W@֖>['  @� @� @� @� @� @� @�%0gJP)IZ>?Ӱ[nIxֳg)Sr^]G>}2qj H @� @� @� @�tc*_r @�^+z1 @� @� @� @� @� @� @�@SS2~|pB Wm͚ʍ7&s$/X;r![Ӧ%%͍9#@� @� @� @� @�!vmm--c?vA�6' Pks* @� @� @� @� @� @� @� @ M=V:On]2o^-lmLn!Ysdʔư5uj2dHѴ  @� @� @� @� @ VGHO{uK�B̽ ,]  @� @� @� @� @� @� @� ɤIrI+X<lKMV31hv^ISSx @� @� @� @� @ ZZڬ�l-Z[K8 @� @� @� @� @� @� @�ÓӗOyưOdZAS7 *[垃� @� @� @� @�@�@mkt @� @� @� @� @� @� @�t@KK2eJ͍Kxd֬ZV[[o֮MJJִi3q,g @� @� @� @� jm{c3 @@ w` @� @� @� @� @� @� @�خqDtx͚dư{IdٲZk[zԩɀG&@� @� @� @� @�%PjnZ#�t?ZX @� @� @� @� @� @� @�Doߤdr)KX$ikYjW'%ZʏW ۪l9q,g @� @� @� @� Z--9  @@OՓޖ @� @� @� @� @� @� @� @v=)#zu2gNR*[?Yr3Z jmm'ONo @� @� @� @�l* PkSW @ }Ԏ @� @� @� @� @� @� @� KݷV6'UJ=p;??Y.iiIƏo ٚ6-)[#Fl<s @� @� @� @�;W(߻r @�* PY"@� @� @� @� @� @� @� @@ 7.dժdΜư3+H{wkZ%`UI}sF� @� @� @� @�.^assoߩ @, PkG~N� @� @� @� @� @� @� @�.0 ykje{5kֆ'?I.L֯OT_'6lwuќ @� @� @� @� @w[Wۇ@>�6/ Pk. @� @� @� @� @� @� @� @@rqB2{G?J.,)ʱnI=\s]J� @� @� @� @�=USw` @ 7҃� @� @� @� @� @� @� @�X`РkR֯O.LfͪmJ{ֳod a[Ӧmhy4m @� @� @� @�tOzVss\U @�! Pkk(� @� @� @� @� @� @� @�D);V%<\-\s~| ɪU#F$㓖 @� @� @� @� @ۓ})z۵7 @� @� @� @� @� @� @�'R+֭Kϯmmo)yZɓka[z=thѴ  @� @� @� @� ZZ<f @�]) P+M� @� @� @� @� @� @� @�]90VN<q+![f%7ܐ<P⋵FՂZ[c2� @� @� @� @�[[j55mQG�@>� @� @� @� @� @� @� @�P`dZ鼌Gö~ŋk=LLi ٚ6-:5<h @� @� @� @�xu'ͯ  @@Oޘ @� @� @� @� @� @� @� @vhiI&M7qe˒Yja[mmw̝YSIkk-llzSSx @� @� @� @� u66qN�O@V{vD� @� @� @� @� @� @� @�Q`睓Ӯ]<p-hu}7<TN;%SnتmkuM� @� @� @� @�Yj55N�;@-# @� @� @� @� @� @� @�lw>G *ecҤU67/)A\oƎښRFx4 @� @� @� @�vwi ?O� @� @� @� @� @� @� @�]`ݒR^Ʃ׬IzhCV[[rW'˗R ڪl)SsF� @� @� @� @@X>ij{  R^Ju @� @� @� @� @� @� @� M޻V6zl2kVd޼dݺ97.6Uz{ȍGsN� @� @� @� @@OՓޖ @ R9 @� @� @� @� @� @� @� @�(0bDRQG5Nɜ9BJ֝w&_jbEalɓ~sF� @� @� @� @@(Zo]VD�@i, @� @� @� @� @� @� @� OۯV6' a[}Id„k6ֻh  @� @� @� @�*}ݼ @`>f!@� @� @� @� @� @� @� @�]`ԨcizdΜZV=pۓ/})yZ]v4doM83 @� @� @� @�@mkt{  @� @� @� @� @� @� @� L߿V6GYö~\/?ӧK&m*![IKc ̜937xcn喴dnr5}#W\?2 @� @� @� @�=[@V~VO�L@+sҋ� @� @� @� @� @� @� @�{rq}dZV=p[K/M^xw7kCJ=qb8-X_eÏ<H<[66zj޼y?~J @� @� @� @�:Q @{ 4U({/ @� @� @� @� @� @� @� @�*P~`ֶULûκߺnq ;woOwرc;֩A� @� @� @� ۿ%'Kax�@oɌGoz }zf� @� @� @� @� @� @� @�ؾMMɸqrs?pz7'|jU{$Ӧm۪ǏOۑϟw9ZZZλˉ0&� @� @� @�-xiZ/m @� @� @� @� @� @� @�  Ja֭K*Pikz֍7&O>Yٿ2eJ-lU˸XUIKs]weʕ8Gܹss1dŹ`=r+̭ޚ'GI+Q+eѢE9<Æ -a]W_}u Pij;,<@U^V߾}O|"3gwQ}fL4)sNx≼mo~U^^9�w,_Ʒ-9-Y$\rI :+'xV"@� @� @� @�(MM @@ջ߯ @� @� @� @� @� @� @� @�n'ܜLP+o|cy1dmUrCյõ:וAO?t^gwXLuoɓZwW :3aU=~Y~}/WCnj???OOOyX]w]?__d…id2>j]B:tM~U&8袋_:';X)ZgN;픓O>9oZmN:so|0~w @� @� @� @� @@ջ߯ @� @� @� @� @� @� @� @�%0lXrayI%w)mm*M`dɒZρS7 jmM%ĩhݫ}#<uUWd_e_]JY +rGT/92wyg}}3Ln^kua?5\}s1TΝKV:th>OWøʅjV Ԛ9sfN;jn5hРj;\ ƪ?e洴d :XBʞW{ͧ>)Z  @� @� @� @�Z`z6O�;@E& @� @� @� @� @� @� @�L\+'ܸNfj ַN֬)APɞ{&%Xkڴ1cjG~g+tbGUf?#+!`;eΜ9@J8~r_z+idzj>&M3<S6zj} 'Tî,X;,;#GuTVZUs泟l5  /<tP.䒼o΁X] ><%ee}%W @� @� @� @� @@߱ @� @� @� @� @� @� @� @�^-.k_[+7vm2wn-h_&I *G%qԩ>ŋWC 0M>}ra'?IfϞ!CTTV˳(a]*:th]%-%l@5Pj@/b?3%kر=x=3fH :SrWþ,XPxrF� @� @� @� @�Pvm @� @� @� @� @� @� @� @`(R%(KkA[mmN\̛'MMɸqgMkGx-?yS}̟?2gecƌc + Ԫ?_AeŊ`֍ U6;a„7i|9C~jժ?_jVR>яnJ+2'xb>[oۿ[/~gMٿ� @� @� @� @�ͽvH� @� @� @� @� @� @� @�hm8y{~6dΜTB&}K%).9ؤd\ L]?S*aS$/8+9ׯ_<j;{'ޯi*'O~2ׯg?Y=܎k|H :3O|"Fk`Y4N:Ї>'|2o_3g <8wrvnݺyY`A5  @� @� @� @� @w  @� @� @� @� @� @� @� @�W!Pɷ>$w^-K%*1#?SWJHT$%&%ozS\qER2-z˿KJ`jpU=Up^5tjA~mgʱp†<k~_%lȐ!r/9眓w?_dɒjW)AZ*)bƍb%deƟXbE^0\zK;1bD>򑏤?sTvGf„ 9C� @� @� @� @�M+Gߦ @� @� @� @� @� @� @� @�Uɜ9ɬY`5>[s56VUBn馼=ɘ1cr1T<~5jp_W;vln\r%@fݺu>}z|3UW]qn#<???^]L ƺ+;?^ jiiހUB$ՃU@n-F{eUJ8СC/7ߜ;OST8∬Y&k*{)bg}v/dck @� @� @� @�vd2r; @g,Y̘}tXswY@&� @� @� @� @� @� @� @�u%j㐭r`ARɤJ%*'BLiϰaV~Dټgܸ<J+UCn5wjXʄ%+V[۷㱥Kfv8ƪJ؀^* b{C=I!Cp @� @� @� @�v8Z;+az@-y}QO @� @� @� @� @� @� @� @�I)kdưoo\/?_Ikk-lV7gڴ jU}g%@kɿK:t&6I](aZ]0^<xp<2 @� @� @� @� j7l @� @� @� @� @� @� @� @@8093<peu}%jҤm=l,Z<PoԮlT2dHz_n?xA\rIFc� @� @� @� @� @{  @� @� @� @� @� @� @� @�^,jժ,f-^Z-[׿zVsJGӿpUiZ& @� @� @� @� @ ju!  @� @� @� @� @� @� @� @�[SOM)cڵZ΁[Z|ɒ%Yʣ̭ܼs֮'Q_FeDF {! Okk2lXQ @� @� @� @� @�T@V� @� @� @� @� @� @� @� AO>ղKVX�M}'Ytq.\V)sU#ҧψ >>v]MK5d%j @� @� @� @� @m}N� @� @� @� @� @� @� @�fCM)SLs]6K,p=3w<T{pC*kC ʸi*A[S&Ct @� @� @� @� @�*ZKg @� @� @� @� @� @� @� @@ӧOFU-e'},_%fm.d3c4m+ij @� @� @� @� @�^N@G� @� @� @� @� @� @� @�O?V:o=y ![%to;YsРdMöJV @� @� @� @� @�@q� @� @� @� @� @� @� @� @C%2VSO%f5m}�kd5mZc֘1c9#@� @� @� @� @�vLZ;{k @� @� @� @� @� @*C"��@�IDAT� @� @Vu#jk$snjkK'דej=mm5uj2`@Ѵ  @� @� @� @� @�, P7]{#@� @� @� @� @� @� @� @�t@߾ɴir) Y$)[̚UG9;vR83 @� @� @� @� @  @� @� @� @� @� @� @� @�=N`ݓR<qW'sl*a[?Yr3Z U&ONo @� @� @� @� 3jd @� @� @� @� @� @� @� @�B_d}ke ?dֶ!lu뒖dưUFx4 @� @� @� @� @@w՝ކ @� @� @� @� @� @� @� @�ȑI)}cU9söfL"yZߝwkzV'MJm @� @� @� @� jms3 @� @� @� @� @� @� @� @�lE׼V6ڒ$Y0Y>SCZ[kh  @� @� @� @� @�m% Pk[� @� @� @� @� @� @� @� @ƌIJ9ƥB2{vc֏~\vYRjMiV *A\ @� @� @� @� @` jֳ4 @� @� @� @� @� @� @� @@4(9Z듅 Yja[mmWc}&''n y4m @� @� @� @� @ zR @� @� @� @� @� @� @� @�zdZyspa[?A/$ViV ?>iii @� @� @� @� A@ - @� @� @� @� @� @� @� @�/)0xpr!ҹӺuɂI[[n)yZɓ75thѴ  @� @� @� @� @) Pk|vM� @� @� @� @� @� @� @� k]1dmpCCɋ/U jmmǎM @� @� @� @� #޲= @� @� @� @� @� @� @� @�tСy#¶ڒ$_,^\9p`2eJcִiԩG&@� @� @� @� @�=_@Vv@� @� @� @� @� @� @� @� ZZIjMoj\eUws5kj}3immz\ojj @� @� @� @� z[F @� @� @� @� @� @� @� @�F`睓Λ^6y ![%lo~3yZϝvJNmCJ] y4m @� @� @� @� нjua5 @� @� @� @� @� @� @� @�6+ЧK!%KYö67/)A\MM^{ՂMKa[=zƣ9'@� @� @� @� @�_@77# @� @� @� @� @� @� @� @�*nI){]k$=!l-꫓k} lu*)SsF� @� @� @� @�@m%k\ @� @� @� @� @� @� @� @�],зo޵R/NJV)fꫮJK֭Kqij[Gx4I`y /tԫVʕ+Sz)eM%ɭ\kooڵk7[_>+űi\@TK>}6뗾|;WT;N;AU.: @� @� @� @�::{3 @� @� @� @� @� @� @� @�2#R:q /̙!dmygկ&+ViV ۚ<90Y%)˗'=fs�e˖駟gybg}ZVT^h]{UB~QJ(U `չ]*+iVRW.}7X@�2;K3dȐj:thC{X?|je]RJW @� @� @� @�zZ @� @� @� @� @� @� @� @�z@%)W+o'ư;H,H%(!e„k6ֻh[ᇓCI=7GvzcwH%jѢEy'%Kx┺^.]zU²6U:@ {t*vPRwn8UBJo߾]Ikp+WV /Z:;=̩$Ɋuyf㣄]+n%`o\FTc9j7wSq @� @� @� @� s @� @� @� @� @� @� @� @� @ T*aCa[%xkjV6 *['δ3מ-ozU}>~K Zpa{MJWO?0H~nUu k*TJ=ȩwy,M [d͚5Հe˖UU=جRJY=^>khnn5jԨ3f^{Ut<A� @� @� @)peɅ&۷i(%K#3QKX� @� @� @� @� @� @� @� @�=Z`dke<h2kV-ll\ʤI¶JVkkRJ2f W8⋓3H^([O L*AY?p͛W-ς W^1СC3z ӧ,պ.Y#з+fңEUCJpZi?yC;_xᅎaVƎQƍW &TK4mz4 @� @� @� @�ll*_+s @� @� @� @� @� @� @� @� @` <|2{v-hUr#n`![%l# k}{}-Yvõ-T~Ye}}.9 Fkݺuՠ9ss)H%<kMI%t!?>%i=3;X1z+sVC.\QW j+msXUµLQ&OS| @� @� @�|.K.0Y ,IFHfH>vO4 @� @� @� @� @� @� @� @�@ Z V z%puo'{]oraVRJ`֯̓>ʂfU/V>|xe=J 7*!Z%̨'p ж?UJ ssZW9޻2Z>yk^S jj$9 @� @� @�zkHTjmA֖y� @� @� @� @� @� @� @� @�(쳵zV *RV~T$]JЦ-[{キZjV *Y%kĉD4PTvm\!Wo.|.\X]Y w}Zx`>p4hP @� @� @�lN@T\#@@E֖y� @� @� @� @� @� @� @� @�.xT^"JV{{wk̛wG򗿬Uc=RJP oAZ|I X"oTK +ew!ӫ 릻, @� @� @�;@])=_@֖CZ[nI @� @� @� @� @� @� @� @�Xg?K^W[WIժK뮟QG-ɡ>Tv4Gy$w_5\{/~,]4A??(c @� @� @�\@V @+6Xf&7\ @� @� @� @� @� @� @� @� @@whkK%$+ƕ\X걨JpVsN8adN9eߌWرƏRַv@;?$͜93\rI֮];w\}>|x3 @� @� @� @�T@֖y� @� @� @� @� @� @� @� @�.5ܼՔu^rH7I'^ :6}ɕ.ic![~zu+WdƌrWTO^;)ozӛrVz-� @� @� @� @vWyVB� @� @� @� @� @� @� @� @XjU{l^{~~V hp >iiiy#J 80뫥+?O0ַrg9Ssi娣7r @� @� @� @�44 W @� @� @� @� @� @� @� @� @ [.v[|{߫)O>9K7]e .̍7ޘ1cF38#z׻r衇~�;$@� @� @� .,dm8  @`,Y'*C040;Q @� @� @� @� @� @� @� @�zc=O;vl^UW]%_rg o{^{}C[+?8]tQ|>K.$˗/-۵ @� @� @� @�, Pk+� @� @� @� @� @� @� @� @�'_2~zƏ[n%ԧhѢ|ilɌDV>|xwG?Q.\w]1csɼy\"@� @� @� @�z{  @� @� @� @� @� @� @� @�J{͉';,͹;s=@ګj3zQryeΜ90ٳggԩ933޾}#@� @� @� @�x^!n @� @� @� @� @� @� @� @�l{ŋ笳3rȔo~m?ؖMMMyߘǹ뮻dɒDV\-66 @� @� @� @@^% @� @� @� @� @� @� @� @�og}#</W]uU&Le[3~z} ׯ̙3syȓO>Е曫LpASn%dK_RN>|sۢ1^*}c<yryWrH?ZgϝwU1/ @� @� @� @@7 ^% @� @� @� @� @� @� @� @�ؑ779묳AG3f̨kuɼy2z{WC=:կRѕ{+?syam]$R{駟ߞ[n%?Kuߢ֭˂ au%iٚs1''9csoE� @� @� @� Ѓje @� @� @� @� @� @� @� @�z@ z{ߛk&wyg>vWW@۝y{ޓ#<rݕ,~Tzn-\pA֜s9zW@KKKmڴi)r/_|qoh>vY @� @� @� @vME� @� @� @� @� @� @� @� @@??{^n|7رct}ٮw~f+w#ݷuUsssJn[;p myC� @� @� @� ﷥f O� @� @� @� @� @� @� @� @@;wn.\uUg}rצL}Y|yn\K?7tSsϔ`#Gι瞛kצ)gqFN?.yߟO<1Vʥ^++W=zf-ʘ~uСCsW.Y/C YgUcō[-\0_swg7n\>Ͻ/}#hѢjp? 62Wsꩧ?AE.jvi袋RZ|#9}GU}@%^H1A:(R"O[Y,C Uz54#HBO(I(R'̓@ I7u}kUuCULuQ7Y=2?{\~ysCUkYW_e]G}4[ouN<j߁.G||}UoV<tAK/իWw<xpJ6d;kԸ/vuw;;6qE'@� @� @� @�XX@!@� @� @� @� @� @� @� @� @%iUWf_ %%w^{?Uu]v){oƏ. *V[m*p(=U:SoU[o5zj~WL뭷^|3[۶mөSp}7~zզ$}_M S*)D^xgoi{uUGq\Y?V _0:+[lE"Vڔвw1[JxT *fW]uUMVemf+2tЪZVʽVfwQ}[%kذayQ/5?矟=أ L+ac%ܪl}ȑ#p{np_4RVW}� 0 -XjVJXXV۷o6t*G !nm׿V5;3MS |NȸqZQ] @� @� @� @�_@7# @� @� @� @� @� @� @� @�s 0dȐ*�}y晍fQsމ' q*Ew_CWA\3})APe+U¸6`lֹ3vva4iRCd;To߾}O~rGVSgqFuSNscV-AbeUw޹NoOSBK(׿ սQFcocǎUu]|uf6xFn*x*6u<E C+A_e+wuW>j˽G}4=PO[?n={̆nXS:{[ X+yW9>p^¶<Yy啫ok_ZFVw}7?яw߽-aU]t&ݺu\kHE @� @� @� @�wRiwC @� @� @� @� @� @� @� @�4o:|f%l%d~+aO'|w=*xO>}OVaO[neuWdJ+TM.gUR޽|U=ܓv57n\�T"ꫧu㏳b5۔JS 1bDN;<GK/gjh?~>?ԝtu9:/u)n%䪄PeΝ;x Yr%q իWw^[eU*FVͿjU_ciR6rxW[]v٥ xkG8ov M7\B꿗N @� @� @� @�4@&^� @� @� @� @� @� @� @� @�hniJӫЦMϔo~ Zsgs<ȪѣS>U™b}6lX Uq *XC&lRjW.~_d I x ӿ`5hРxs /.]';?%n۷رcg7ήnv:4.8yg5oK^|Xf޶f|C+bujܤ}x^Xe}ٔ`: @� @� @� @@h/aZμ͔� @� @� @� @� @� @� @� @�&8#+TAMM\|luQ0aB?nPӽ{*tiȑy +T={lt/ΤIVQ;uT>eQF5\ԩS[g?0rH5}{%X[Y?W_]v%*f묳<5^6je|;7T=YgΝ;gRG� @� @� @� 0jGL] @� @� @� @� @� @� @� @� 0zN=s1yfҲ;o>_]w5]t*/6xk4'x";vlx^pv/˼߿JUيK,*O=T}L6-|p^{s{R?#rT^sU<O>L>὇z(?ϲkT瞆gO>itݶm>h?eʔ̵lgyf|?~|uy|1g7RJ}֧<2bɬ`ʆnX;cbWVVzkw^P+u� @� @� @� @` ZF @� @� @� @� @� @� @� @� @s~gvm'|sZ5?xP~7skV{wZoޑGg])\=+?I'ݻWyX/~w1?sQGUH%㎫_W)}oYuU7.f5+"s}ݫ׷z/ѳܹsN)!I%@m~xԩSn 0 wuW5Q?_W~Jׅ^s=7~z榛nJ:SrWO?c?QqqN5 y'N &dĈ ݔr߯n/_[RY, FY?(Ak%dkXz饫 ; D{_|1\rIy䑪)sqs=k,u @� @� @� @�,$6u�W i, @� @� @� @� @� @� @� @� @@Vo~3%਄D-Rsըx1hР 8 FzW3v<SUӔ)S+{i;m喫JW^z]y6lXJT *I&pxUXV ZZs5G塇*NUJpzvuלyi׮~馛O1 2|UmNbѯ_zygr7g̘1袋V!YlA^]w*|Ţe;±Mc=6?puY'lIn?1~{5n鳬YY6|7.olQ~UpU 8+֫zVJxֳ>[CJ)P%__r%s 7駟JPV{ェb]WJH[l=أ +T-ﰌ׫Wt!;s]1I *+R6hZlf Os9O @� @� @�'ޛpBs^hY&$gSJ˚muۗ @� @� @� @� @� @� @� @�% ?aT?뭷ޗ&/!LK/,k:uj*ܩL-l7'7KV *aO%pn%ĩx㍬jiݺ<u[K/Tq~>5y*j5H6mR¼J0\BZBJMݻwҦSPҶ\wر&9nźey1.bCBV]uYαk׮U]=fna߼{r1Tyg뭷^%� @� @� @@4(80uYHh1cO3Nms=yZsM @� @� @� @� @� @� @� @�躿u '{zUâ駟믿 ԥKPT5|^Vq,ڮ:ۮ~ӟm 2$rJ'?~כ:lf5 @� @� @�+ Pkz�_F@ּ뵝WI� @� @� @� @� @� @� @� @�+УG/I 9餓Zke}ɀҧO;X mw:3o)tʔ)y׫'N:|ak׮9gfm66̙3g}v\ Yy @� @� @� @�iVud"=C#@� @� @� @� @� @� @� @� @ <o~뮻.mQ8ҥK?_`Ȑ!9r 7Tva\r%Yn>%Oj^୷_ . C 'UW]kW  @� @� @�Z4(80=V*R|1II߾Y Ԛ{ @� @� @� @� @� @� @� @�Ԕo?OU ϻロo|ww=-XMժy4iR&LШΝ;M6}ck_;kV<*L[n? @� @� @�1Z5 !@<j= @� @� @� @� @� @� @� @� @VXa 80znt1zhYfᄍK{5y r۷O [yL#FȠN;G9:s=.̚E� @� @� @� |ZMۚO*%@� @� @� @� @� @� @� @� @ ?8v[x7n\6|ާOcXpw~СCg>쓯}k~  @� @� @�ZA-lK�f(0fLңG2xpҷo3@,P M� @� @� @� @� @� @� @� @2eJzr-曫`Ν;gmM~0M;m۶?@ 8qb}Ѻ?4y䑔߽^nU&lVZ@S&@� @� @� `j-X_ @`~ ԚwMZnM @� @� @� @� @� @� @� @�jT]wUw}w^{t)oyjj/={(@ yǪXOWZ뮻n~j/auݺukbU@� @� @� @`/ H Ԛ5v$@� @� @� @� @� @� @� @� @1"<@<SW^Ufm޽{g7LTWg'|2O<D;СC6dl6վ[g饗� @� @� @� Ԛ-ZΛ @� @� @� @� @� @� @� @�4SWA>h{ 2$%Pl.lfz뭗u]7;vA9 |UСCSgyǎ֭[gΦn-"}~ڷoߜv @� @� @�@EbM�" PkM @� @� @� @� @� @� @� @�4O_<}yꩧ駟mݖs9'|I4jUZ묳N^ʾKwHf|ͼ 륺�yk2r䈪%X ` ~whҩSB @� @� @� @�Z@u[˚ @� @� @� @� @� @� @� @� @`LaÆeСyW{W֭[UW]5e_a09M+s.0yyW/_l_z饌?g-u~.]emG;f}6[Z @� @� @� Ф%&G7i'@�e��@�IDAT93&#<8w^ФAmÙ @� @� @� @� @� @� @� @�h$жm|+_L6-Jhk]vYiprիWu]\qܵsرc3r*4kĈ }|eرc`w1sL\sͬZ)X+;窫:;I][~'o^5� @� @� @� @@ ^5i'@� @� @� @� @� @� @� @� @"$0u*n_^X&M0.]ԅ_˦gϞ)[n 8i;5jT~j?7o8a„IVUjV7ҪU;eذ. *Zk=='@� @� @� @) JLFnэI�s#0fLңG2xpҷܼ@-� @� @� @� @� @� @� @� @�iӪ U“>-{j߾}^z,2Z*K.dݻwO׮]ӦMF?'Oرc溺U}݆5#%p~kݺu%k喫fW+%Dچ I.lFV]W649䐤ԍF/ @� @� @�s+ PknŴ'@@ Ԛw{ZnM @� @� @� @� @� @� @� @�,0I&eԨQUV9=!i搦> ӧOL=K,DuV%`;wnػtRv/xީS;v[خ]όS7ĉW{9?~|O0裏fܸq {.{ *{.}z+Y%Ȭ>gGٳgJV9 W'|prlfKqM� @� @� @ jKh ZmUo @� @� @� @� @� @� @� @� @h߾}zUs2ԩSޫ5shT *!QSLp%8lu!m՟׳:/yLKw*zK`V'Op^f4IKX 9p�5XQ0Y}HY9�VZ}fq]Lgɵ&K>RK%qD:b:$@� @� @� @�h)� @� @� @� @� @� @� @� @�(UK/t\ W{ *ĉ©JHUu}է%ت]@O˽p5^³oSwꂫBJ0U^նm*kc99ȫ>ЫKb-h/A`^N�Uҏm@G:h>bDr$m_  @� @� @� @�Qם @� @� @� @� @� @� @� @� @ 뗬~;zc e;cF֡&G @� @� @�ZA-]  Pc$=z$'}~TaZ*F- @� @� @� @� @� @� @� @� @@ kE;\ye2rdr'뮛CrԩW @� @� @� @�@V*%@� @� @� @� @� @� @� @� @�M.2~RrI~%uVM^ @� @� @� @�@fhJ&@� @� @� @� @� @� @� @� @�M-к/{r{'I^1$/� @� @� @� @9 jNV @� @� @� @� @� @� @� @� Pwȑɯ~{ɞ{&=T+� @� @� @� @jܒ(� @� @� @� @� @� @� @� @�4OΝK K65*zdmnHOoR5 @� @� @� @@� @� @� @� @� @� @� @� @�Z@뺿n'ݗt>z =6Eq, @� @� @� @Ԛ$M @� @� @� @� @� @� @� @� @�yv+h䠃uMdʔy[ @� @� @� @�@EoM͈� @� @� @� @� @� @� @� @�Ԝz%[V[%Gvr%ԩ5W @� @� @� @�@ n8 @� @� @� @� @� @� @� @� В\3dذ_ÓO2>%˘; @� @� @� @e jo @� @� @� @� @� @� @� @� @IV]5޽M6InI1( @� @� @� @@ j0< @� @� @� @� @� @� @� @�hkoɳ&[ɓOds'@� @� @� @�<Z-o͘� @� @� @� @� @� @� @� @�Ԝz%_2aBf$^s*� @� @� @� @`Z�$@� @� @� @� @� @� @� @� @�M`mN*ydu_jFּ- @� @� @� @� P9  @� @� @� @� @� @� @� @� @@ gNL>{F嗷0%@� @� @� @� Z-hM� @� @� @� @� @� @� @� @�4'NHOv!d9B @� @� @� @�s" PkN!@� @� @� @� @� @� @� @� @�Lg GI>0hS$ @� @� @� @�gZTw @� @� @� @� @� @� @� @� @'y䬳?!Y;Xz%@� @� @� @�X @� @� @� @� @� @� @� @� @�/!ЦMrq'lSrر_S @� @� @� @�4@&_ @� @� @� @� @� @� @� @� @�s+Wo9Yo  @� @� @� @�jE@V: @� @� @� @� @� @� @� @� @�gO{Kƍn@� @� @� @� x O� @� @� @� @� @� @� @� @�|9%L.$䦛6Jm @� @� @� @�+ Pkz� @� @� @� @� @� @� @� @�X@V2thI~''S,tK� @� @� @� 0_jWN @� @� @� @� @� @� @� @� @�M)УGr ɹ&݌`#"c @� @� @� @�̉@9Q҆� @� @� @� @� @� @� @� @�hV?A'oxc*_ @� @� @� @�' P-  @� @� @� @� @� @� @� @� @e 92w^o3X 7n\.?vXL>}9XoZVL6kI� @� @� @� .D� @� @� @� @� @� @� @� @�ѣoΖ[n9 2eJk; 3jԨ|ygrit8w:n]mM>:2$ߓ%~&@� @� @� @�Xlz'@� @� @� @� @� @� @� @� @�M+лw*TѦM^/u]9Su]x:7Kx yd͒g~E� @� @� @� `j-W @� @� @� @� @� @� @� @� @@ n=WiSN͟,r}=#;ន(AZC$+lMr-M_  @� @� @� @�fA� @� @� @� @� @� @� @� @�jE`ҤI?SL.G %>#K'z|;ix^N&N7yӮ]�UVձ3fL9<ܹs9䐪spcw;쐙úV\qtڵ.jms?sP,LrɑG&{쑺-9؅2A @� @� @� @�@ @� @� @� @� @� @� @� @� @` Lazl馹gwM7ݔ;*sO~wy9?1ws5+ڌ7.m][n\}yW^yU[N>뮹 } zGg;2֧ly뭷O?wtukd5K:%]Bњ&# @� @� @� @�Z@? @� @� @� @� @� @� @� @�jDGOͰaCsSNiҧOδiRB <0vXUgGy$W]uU.z 2$/BuV~xU??>ˑGY:3կ~5rJuϮo>c *cǎiSo>S7N:)Y}C7L}ڨM @� @� @� @�&кM|  @� @� @� @� @� @� @� @� @^2t׿^iW_N֭SB>l.RxfVZkЮs`7.]w]lf~G+%X7M&L0}嗯-_&O\*jWNn-LƏZUF� @� @� @�X.ʓ37 @� @� @� @� @� @� @� @�hsmM$ݺukTp۶mSձkͼm6a2zW߮iKȀYh׮ݬn7J+U}Qwu=.gQ[_Zr=IfqSvUj @� @� @� @�@E}͏� @� @� @� @� @� @� @� @�B`Fխޚɓ'g0'M6Yfe<9f +T={̤I!CO>I՟tԩ:}o5'LPavmkəg/7jR0f̘l]޽v]w%K-U� @� @� @� ^&d> @� @� @� @� @� @� @� @� ZPL!~.첆 L:5p@xly9y'뭶*+b\rɔUM2:6mZV_},ꪫSO7Iyv_ϻロ#Fv/!_{gy晼 }=U׷{Nj_`gj}`F� @� @� @� ZMX!@� @� @� @� @� @� @� @� @�֭_:u޺?mڴ^z\yO>zow̝wޙk&{wu{^n 6,ݻwϙgO<1+r.,R9c5ps=Ν;gҥKgy~YgͲϻOfm~tA>|xz衺֟5*+I߾IϞޒ]kPe @� @� @�AR:ѣ[̔M�V`̘GdN oc� @� @� @� @� @� @� @� @�|F`6qO?=]tQ:v옓N:)?^uU9sv&Mg}6w_U?ͻロs9'm](3dN_*F)[ZN;w޹sa{ aY׿U֜"XUWM]ڌ?j3BXƊT @� @� @� @`h5n[d: @� @� @� @� @� @� @� @� u^Ͽ2eJ^{Ji׮,gRZYb+a[#GLy>a„*4SNZ~Gyꫧs΍śoYi00[><vdnJd @� @� @�S`РddY  ВƌIzHNmI3sm @� @� @� @� @� @� @� @�m۶ǥZ}_j߾}V[m_|-xgl^n.wjT`5[nǭ?<_RV*� @� @� @� Z7O� @� @� @� @� @� @� @� @�X`{'\\~yrI l @� @� @� @�Z@/�� @� @� @� @� @� @� @� @�jB`AijPM22eJڴi3Bi CIV_=!@� @� @� @� Z-hM� @� @� @� @� @� @� @� @�**ʲˎj_֭[ {lzV[5yI @� @� @� @�,R4 @� @� @� @� @� @� @� @�4One5ke <t>O$+2m @� @� @� @�!za b  @� @� @� @� @� @� @� @� @@sh*Ҥ{dsO>i3R? @� @� @� @vjZ� @� @� @� @� @� @� @� @�q.]O>jX @� @� @� @�@fXJ%@� @� @� @� @� @� @� @� @�^`sM9'喦G @� @� @� @�EA@֢@� @� @� @� @� @� @� @� @�,TH:(9#@� @� @� @�,e5) @� @� @� @� @� @� @� @� @`A t:#TkA @� @� @� @. PkQ_a#@� @� @� @� @� @� @� @� @�@%$wܑ/ d @� @� @� @�Z@&J� @� @� @� @� @� @� @� @�o~59ddԨݻ @� @� @� @�-Gm˙ @� @� @� @� @� @� @� @� @@-\zir=+駓o|k|Z#9+j: @� @� @� @�@N$@� @� @� @� @� @� @� @� @"#Э[rIIV#3MKOON9sWjQ`œOv%9ZSM @� @� @� @�ZD6 @� @� @� @� @� @� @� @� v99)YSz/li .#2sg|_/ @� @� @� @�Z@L� @� @� @� @� @� @� @� @�&h.wru_9{>8ϯTE� @� @� @�eZ:j#@� @� @� @� @� @� @� @� @"*pɟ?iӒo{BX#яSOMƎ D� @� @� @�]Z6*#@� @� @� @� @� @� @� @� @"+2zz2N~IϞ~.Z/ӓT @� @� @� @jޚ� @� @� @� @� @� @� @� @�@ :]YOf}].еkO?$cz#@� @� @� @�Ԏ@Y  @� @� @� @� @� @� @� @� @E L)}w4()94I� @� @� @�hzZM* @� @� @� @� @� @� @� @� @@tdUOMdݒ]wE9 t'3>9UV @� @� @� @@ j:{# @� @� @� @� @� @� @� @� @ rHҮc6-9w@s8d M�ػpro@PePRpDMs*C;H1RdJMOcũT gDs(8"*8 ("2Z:=u-l~ @� @� @�Ԭ@ @� @� @� @� @� @� @� @�|H`B*/l'GWm.8Yr @� @� @� @@M Ԫ)i @� @� @� @� @� @� @� @� @'6<j.7orHRj4cMNMFj� @� @� @� rj\_ @� @� @� @� @� @� @� @� @ 4k8 &G9&P"m QJ%@� @� @� @�Ԓ@Z, @� @� @� @� @� @� @� @�| pɒ%I۶S!а IFL^}a @� @� @� @@u 4 G� @� @� @� @� @� @� @� @� C`IE[oٳgocq}޼y}O|~hѢr_pa-Yrwj?LfʽyUꪫV[joժUyqꫧ]v!]m˽ئMtQT|?kM?Η@ @� @� @� @@ Ԫ5z  @� @� @� @� @� @� @� @� @@3f_:篾jf͚3gk9sdş( jݺu`UpU\ԩG�c}tK׮óЭ�ЮceWUy>wܪ "[Umi߾}ձCرcC屸ִiӏO3eq׾\}@e3� @� @� @�h8 @� @� @� @� @� @� @� @� Q`y<ӦM /_|1GB\s2@j+CfpЬc@UhѢդ"+MT)fϞ7|*d87BĊ0'fԨQeXU*eVΝK.x㍫sf#4R3FN� @� @� @�h~q @� @� @� @� @� @� @� @� P,YRcM<9&MO?S{U/6mڔOmQ铃:(E(Twԩ Zm@E+mkժUcǎ˼Ɯ9s`^z>}zy,Ǝ[A]ViƛmYw-={L=ҡCe^+Kn)n:#@� @� @� @�|Z_Dϳ @� @� @� @� @� @� @� @�Xg3a„z˕UMEnVvZiZ+;kb/±>m+B^}<e3<Sx\~ywNJw[W^J٧Z Tde=oUf$@� @� @� @�@&A� @� @� @� @� @� @� @� @@7o^}<yg-j۶mr'NϞ= cM4zW;GZ(¶O"lҤI8qby 6,;n֬Yvliһwגּ*LJ%0`@2dHIV 7 @� @� @� @�C@Vu(� @� @� @� @� @� @� @� @�+ /ѣf„ YhQ"8k)BfteVHma[;w.ګŋgԩ;vl~M7eΜ9iٲewu7űQ5NO'w߆ӗN @� @� @� @�%dIV]� @� @� @� @� @� @� @� @�.oVܓ;S܋pf͚we;w1m'qA ![SL#<R3\rmc=ʽjժU16ӫWRd{nc^ @� @� @�_DࢋNKf"x�jB`֬}{~jbņFӊN @� @� @� @� @� @� @� @� P&N[n%zkz衲.rH"DuupՈ@ӦMӳgr?ꨣ5_smsI˖-ne/tFN/R㞇yH� @� @� @�hMTl = @� @� @� @� @� @� @� @� @<1bD<Y>dc=k֕RQ^yȑ#3jԨfmPC=4ݺu](KI7gB� @� @� @`.(9deHY{MS7 @� @� @� @� @� @� @� @�uJ_\yygҳg|9שZS.\?7tSnƼ#+S_cYI-H<v:[ @� ӝQ��@�IDAT@� @�ꠀ@:RD�Z 2\n c !@� @� @� @� @� @� @� @� @�O(ڵko|8qb|ɜq´>ͥh޼y .ȴi2f̘93_z_+U{MV2&'@� @� @� @�KZ)� @� @� @� @� @� @� @� @�3gN9l&9#Ӿ}yy_*[nemgF"ФI. K/kܹsˀ*Æ ˂ Fhi_}*B&O� @� @� @� PjRZ @� @� @� @� @� @� @� @�k"H3Fms=7w /䪫JSԆ@-r!dȑy駳fm.,~meO-SnD� @� @� @�h@ @� @� @� @� @� @� @� @�|EP]O?=׿rꩧC?jP6mZ:'?[lo@Z]  @� @� @� @�W@V}:'@� @� @� @� @� @� @� @� @`&Lv)'xbN8L:5w\Zj OB^{viygC^zr@<,X�� @� @� @� @>� @� @� @� @� @� @� @� @�8ۧsΙ<yrN:$AZqZ?Ygcf֬Yr-sM7Տ`dѢW`sZ"@� @� @� @�|Z_�ϣ @� @� @� @� @� @� @� @�4L d9Sren0Uj2f̘?ȡ_hTu* @� @� @� @�j_@V @� @� @� @� @� @� @� @� P0~2z <U饌7.zjf~>:'PYf/Yĝwy9KC/HVC#@� @� @� @�VT@֊y� @� @� @� @� @� @� @� @�)PhM0 vmEov&Ogɒ%Vsm]kMkp[r笳]xtyV[-i:y}x @� @� @� @@հ߯ @� @� @� @� @� @� @� @�XÇ7ߜ].Ǔ;o߾]E,^8{-ZTuԧkn<=P}v  @� @� @� @�U@Vr� @� @� @� @� @� @� @� @�*OΏ͛j?Os=dɒ%ZG}[۷я~Tu-[&O� @� @� @�vZNjB @� @� @� @� @� @� @� @�7ޘ7x#'xb#믿\׿uV/iӦ39眓g}r?f)?7sWM㏧:묳2~ 2$_ת1>|'?ϲpr-9蠃ʺ;?=s9ckwuWܟu2{\y9/Ck|+GW{9C~i3f̨zyxs1ygrUWeСEeĈ4hPƎ[5gqR;կ_rݿ_>﫨s„ uFQC{UM @� @� @� @�Y24� @� @� @� @� @� @� @� @� X{.vx_җNH=r!??}/ː"ꨣ*w Ep~Ϟ{Y>eրrgvԩSl67n\u'x`n<S<xpZj"\ꫯ.z믗ZE0UΝug/r&l^tmݖ/8_~;'O[lwy'Æ KV^Us93gΜ 80^ziU[[yG]tQ^zYfy "jڴi/ ;3[M4)o2XvqǴo>w}wOMXuդGF� @� @� @� !:wJ� @� @� @� @� @� @� @� @�F+P mᆵϞ=?v&Mһwk_sO+ɏ~2l*b;SR׿\=Ce guV/^1cƔ@6mڤ*>_uUׯ_y*j}GO<1lAUmUnwygVT-V]}k_+tI1bDbUC=j"'(j28m={v�V-+"wʹ> / >}zgoȑ#PW_}5b+µ b-Z*[hQPC!g/raRj^Qw @� @� @� @�hO� @� @� @� @� @� @� @� @�(kKuN:iٲeJUS6wx㍹ۗ!C馛u֙?~ZjUN_.ye̙3?t᭲"iӦqUVd…_>fڴi)z[ݻW=VWWXdɒo:v}L: *^Zkf9wUu֭<իWTPQlE(Y"Υ^Z^c]筷J3`fͬe @� @� @� @@}U_ޔ:  @� @� @� @� @� @� @� @�XEԃ>EuEU5kLSO?]zy}ܸqygR+B>m[z=m۶͟2ꪫʷj_EpXe-4o<;cҡṙAa-Z!m}gό3R?6 @� @� @� @�% PK� @� @� @� @� @� @� @� @@8kNյ2Ym}O,3o޼꫟Y>Yc۴i!CaZSjuQ k׮]ӧgڴic/?w#׫È#>裏.úw^]SW<_|q[on: @� @� @� @�,@2� @� @� @� @� @� @� @� @�+G'tR|}*zj /V'niZn뮻.ƍX /T]"LkѢEUW]5?OZkeeNh"{.=zGzҪU9,Y9#>47Q}w<WӀɓ'w]N9]TӴ!@� @� @� @�  @� @� @� @� @� @� @� @�4T7)FyӦM\uUK.$gqFY-ܒiӦe֬Y{͘16sO[څ"Ԫׯ_~_淿m훍78}+R>ᠯb{7cONRE]~e&Mzg[o 4<xpqiϪ_/+z*?d嵢)SONvkK}6_,kye [eHZV5bĈam#o.W何V?;C/})C MA� @� @� @� @`U/WqO @� @� @� @� @� @� @� @� @S (~|k_Ke(rUV);˰ŋ?)~󟗡M/B&N|+Y}sOϜ9s2u̝;72/9ESt;( >aQGuTy;={vy晴o>lMzozdMR9>f̘jvm?Qkk&Æ K˖-?q.hE… Kb¡Ǝ~޽{_\{yS\abű+BnO.^xa{L<9]t_?cab]1v޼y?~|:wv-w}w�=5*=z5{,eW|{2LoOV1cI`T$[M� @� @� @ <hr}ɉ'6V5H�z/P#9TMFmI/,-F� @� @� @� @� @� @� @� @�:.P'aC:uu]W#TEVծ]XʰYo]dmiӦ -kiӦYks=7&LHvEXq^p￟b/Ŋx 7n\>ଳ:eغ뮻1le*>vG @� @� @�KӒ32e3f%'ޛWgʪ4U*� @� @� @� @� @� @� @� @�5(УG<7:_|q?aV͛؟Y ?7r\֭ӻw}M˲!a6\TWߊвo+R_yf*B*Rjp+>V}_"P췿mN9vaj$Ty @� @� @� @�!b-8ltI� @� @� @� @� @� @� @� @@#رc瞜uY4hP . ݺu*kfN:ϭs1=KX6gΜm6[mU>^G]=jjx {lMViuQ5u @� @� @� @�,@eb2� @� @� @� @� @� @� @� @�(ЬYz9Crg-̷lPgIV]uvau-Zӵk2?^k]<q-ȑ#S @� @� @� @�5u  @� @� @� @� @� @� @� @� @ 3wuW<CdMrGgʔ)u:_O&M2zۥp|xz3w+rJ� @� @� @� P  @� @� @� @� @� @� @� @�48 Ǐ5\ &Gs=sM7e…\}իi&T ;6lXnY`A2 nvH� @� @� @� @N ԪEQ @� @� @� @� @� @� @� @�U&MC#<?ڵ׿l9utu5@%Kd9ӱc :4}O<#Go߾ k- @� @� @� @�4DZ � @� @� @� @� @� @� @� @�u]sf9rmwѣGN;L0FHXxqƌS~:w~e9/K/MϞ=n  @� @� @� @�꽀@z 5@� @� @� @� @� @� @� @� @@m o>?OOfܸqsWd뭷&l5jTϟ_ۥZ ̙3'7pC>t1}]wݕ}{ygnZn]O;T6 @� @� @� @@chO� @� @� @� @� @� @� @� @�ݻwsرcs7[o矟V[-[M6@<Ceg_җ8tPv@ @� @� @� @�Do @� @� @� @� @� @� @� @�Vnb?32cƌ92wyg>2]ve]뮻o߾nꪫjL[Ν[h3&^i͛7/]t{c=6{wڶm[P @� @� @� @�t$@� @� @� @� @� @� @� @� @ t)w}ɒ%0aBフ=:osI'eUV[ow1})øze#ϟ'fرy#dYxq6h|_/]v � @� @� @� @@5-j@4 @� @� @� @� @� @� @� @�GI&epV5tgy&=P!Kӟ`l2z*oV^{YZx饗"@Ǐ_g-\0z6`~iR @� @� @� @�4FZ� @� @� @� @� @� @� @� @�:'еkGYVi=;vlƍ &k[oUo߾}w=z6,žgUVs5}hOgʔ)ehVq*s'?vmnݺiӦ Fo @� @� @� @�Y@2SH� @� @� @� @� @� @� @� @�hѢEvrӦM˓O>Y6M4 ںoT [+M N.7eMZmQyܹs}O1m͛ӧ_ /_ys=3fdɒ%;v,wWg[ne:t I� @� @� @� @ j/] @� @� @� @� @� @� @� @�_.]Tfuɾ[DES:k~_%M.i{$<L㎼KYhQ9I&i߾}U?U뭷^y}u׭:k.͚5Z!e̙33k֬bW/W믿^zF!eEXրҵklfuUc @� @� @� @� H @� @� @� @� @� @� @� @�)'L~kZVj%nn=b`+´f̘+}"8jԩ=zt&5{GmڴIնmr<<YmժVZU׋-[Lp"rbх _E+Wͫ}ݪzyܹ)y7cq^c9swީ8)Zkb!c[ou:uΝ;W:t(~a @� @� @� @�0  @� @� @� @� @� @� @� @� Pc$gzkңG?%&uVP>⃫ ,ȬY^ <+2eJz22ĪZdg-5mڴ *>֥Ku]嘟i߾}:űp @� @� @� @� P;jݪ @� @� @� @� @� @� @� @�X." H]vIn9Ij[h_ܗ:3naZOeVq,{/-.\Xu^y֤"Ԫ؛7o^u^yz˖-?UhꪟQx7wyg!\6 @� @� @� @�ꆀ@TA� @� @� @� @� @� @� @� @�Ox䪫&2�1c>jbժUr2[nokr碋.ZX7 @� @� @� @�YZ5m5 @� @� @� @� @� @� @� @�,o'c% L}ꫯΡN:g?RFL� @� @� @� @@M ԪImk @� @� @� @� @� @� @� @� @sfL~䢋 ~79d >AYࠃ(C )CH� @� @� @� @r\J� @� @� @� @� @� @� @� @�xsaÒ6m(9ؤ]eӧcɆnw}4� @� @� @� @�! Pke� @� @� @� @� @� @� @� @�(0vl$#F")9dUe83C̓>=z\$@� @� @� @� @ 4b{� @� @� @� @� @� @� @� @�VD஻J.y+S_֊x3M4ӳg~5k֊L @� @� @� @�A@V5 � @� @� @� @� @� @� @� @�"xqru'{,Zɸq'͚-,To9EցW"@� @� @� @� @`j-#a @� @� @� @� @� @� @� @�XQ"˒n>xGJkEg\u :[3eʔ <5 @� @� @� @�!|9J� @� @� @� @� @� @� @� @�!0{vr%$Am%mZ#ݻwψ#{W^9kd] @� @� @� @� @- @� @� @� @� @� @� @� @�T~\vYҴi2dH$W Z;/?PۯZ7 @� @� @� @�Ktw @� @� @� @� @� @� @� @� \S$眓\ye:ɩ&rMcp- :4ǏG~8ݺuj,M� @� @� @� @4m<� @� @� @� @� @� @� @� @�+G{A%={&<\|qɉ' Z9+wK.$=zȁzk.fv @� @� @� @�JZ @� @� @� @� @� @� @� @�XAnK7˔)wI|'ib'X ꪹ2wqYdIפ� @� @� @� @� ]@VC#@� @� @� @� @� @� @� @� @Z.L2+o{f-6J.][u1#FȨQrYgV%@� @� @� @� hUy%@� @� @� @� @� @� @� @� @̛ɦ&'o>3nGqskV[m/2g;s=7/rw D� @� @� @� @j8R' @� @� @� @� @� @� @� @�^K~Tg%'x`3{E%5jTڶmV6e]:th>|̌3BIj @� @� @� @� j5ת) @� @� @� @� @� @� @� @�iIERtI.09_^yС]u\//C?,\W< @� @� @� @�S@V|o&@� @� @� @� @� @� @� @� @`% LydҵkrAZe r穧ʨQ*¶*Ҷl ^M6g?YW @� @� @� @�jC@Vm[� @� @� @� @� @� @� @� @�:'p}ɾ&[oZÆ%> zx⊠#oO=\ Zy[ne.œs9;VBf&@� @� @� @� Hj5m @� @� @� @� @� @� @� @�vJv-y[?ԪJOcrn gF`׿A^k4}k� @� @� @� @@MԪ ek @� @� @� @� @� @� @� @� P,H.<39䐤cL/wOz'fү_Op\veiѢEp- @� @� @� @�' P,D� @� @� @� @� @� @� @� @@3'9d㍓?edҤv<̜wy+ Wk*#G̅^h( @� @� @� @�- Pke � @� @� @� @� @� @� @� @�Zx䓓 7L8#80y˓ݗ^%\SN9%]tQ3TRvꩧOO<� @� @� @� @�jU @� @� @� @� @� @� @� @� @n LsLFɰag 9$5_}9rYgeȐ!=F'Pm64hP.\0 @� @� @� @�Uݢ#@� @� @� @� @� @� @� @� @{,9찤{ .H䓓m?[n J:*xFc͚53y2tc}$@� @� @� @� @`9j-' @� @� @� @� @� @� @� @�]QwOI>Iz*9昤ee!R=ߗdɒ?_ h|0_W?~g u� @� @� @� @�9@n @� @� @� @� @� @� @� @� P- 8kmN5K3yÒWV<p@zKa\i\uh[xq&NX7:thvi 4( ,T@� @� @� @� @ ,zM� @� @� @� @� @� @� @� @@x⋓7O<2-XɨQ/_E8UwE";1cƤw7I nV6uL<"(̟]xÇϳ>38s@� @� @� @� @ Owq� @� @� @� @� @� @� @� @�:*ɯ~tGJz*IvŊ>c#Tru 7ܐ-Z[۶mkmMlI~_O<h4N� @� @� @� @4"{� @� @� @� @� @� @� @� @�5%0}z&S* o̟??^xaz衼իW?tԩ|?A.| 7̙gYΜ93Æ ˨QR'"ͫC3k֬\p?~|ڴiAe})/\0~{.P.mv4iR9w9ꨣ$ ,(aa?ʽ[>Ӽy\qYdIn\uU1bDUWvueep@EXEtM)W_}"tlr5\c5| yWcɘ1cҤIj @� @� @� @�@ӪN  @� @� @� @� @� @� @W��@�IDAT� @�ETETEPTri%/`z7;dȑ/~ꫳ[(nC*¨>?ƍ+ì?;ND@D,(( % {E4vhM4jĨ55VlX.J=}.}3g|<'tRɓ'G׮]y3f̈}ƝwޙIZx`fuae!XÇw9^=iٲe <80aBիW̝;7:w_}U 4(KZiKzYhذabرa]СC0{db龭x*WrK?Ɏ3Q @� @� @� @�TgfJ� @� @� @� @� @� @� @� @@Y(Ȼ*h. B"n5 *>;bMl&~|q]we!Vݺu; JAV)j…ѦMTR`¦n-xC=?|lYW~ĵ{ƕW^ݺK<={&M#G^ʎ)<SNǬYQAX |{;fr?HaNUT5ke]-n5*4SN9%R@X Jmh߾}uYqF W @� @� @� @� JO @� @� @� @� @� @� @� @�JX ??}܈ÈNVm /k4i$ZhQ`=v1q,g5jdZ9I!I]A#]}ذa- JaX֭[~mu6m=~!dW_ J!Y)+d)$+m)ꠂTzd^t%̙k<Ypgucɒ%q衇8eʔ4[ @ǐ!Cp# @� @� @� @�(UL� @� @� @� @� @� @� @� @�2"xqăFDӟFrDA:ofB JUT)ԩ~mwyѦM}u[ժ?ʖ5~СC^)<+m)<k٭yi &ĸqT]wsNtMϭx>`x>8)H+z;66tx뭷V|u o1?ϣw%& @� @� @� @�(_?O5'!@� @� @� @� @� @� @� @� @|u6nGGAi7h R�ִibʔ)"vZ|u.] $PsI NJȑ#?RX̙3m*|РA¹nָꪫⷿmwqGW_5jԈN:l1/// z衇Yf3đGN5.X 'O;u,fvĐ!Cbp @� @� @� @�ʥ@r&E� @� @� @� @� @� @� @� @t ̞1thD??<bĈ{h׮xj^zt!_ΎsN;&MDZ 0%KD Zӭuֱ&#<ncK.B>¶Ѳepz衑vF ZvgČ3bad9KYhXn_|qܕ^??wXiMǎrK nȲ./FY  @� @� @� @�! P8A� @� @� @� @� @� @� @� @ LQT"qCDܩkh|XN)(e]_:?W_ӧO /04h״i,p;;3>裘:ujv/wLӦM1v̂z]vYգGhժUt9;;l&Mʎ\r?HWm۶ѽ{tMcv,Xs])n6lc=1ׯ]n})09N?8ꨣ2 nq饗Ƽym\O>ϙ;d̂� @� @� @� PL 0 @� @� @� @� @� @� @� @�\`Ԩ((* RO<cƌ7ѫWp/ς~a5~&LO>9'5xg!Zo/<9h׮]KfX/B6NVN:fmc)uieu)lKZGqD=:k;΂R`a՘zY8WÆ cÞ{H{`h֬YNJF`СQj,̭d`T @� @� @� @�GR~V~c& @� @� @� @� @� @� @� @�&矏ꪈgh>" ReUdTgyf.U*3gNB:$|}YV֭nݺ!ݨQyyyYHWz Vvp¨Yf|gQz=~ĉаUR-H!j > va~ˊ@yv7I� @� @� n1#fȅx=V`ƍ#^|1gva˜;%@� @� @� @� @� @� @� @� @z ,];GOĢEgĨQGaô 'Pu^\{ѵk"ôҤSպig7dС:iޝjժ&aZ J[ӦM JRֶn)KVpۉ'mڴ.hýԛ @� @� @� @�Aef% @� @� @� @� @� @� @� @� P >{":bĈCƈw8žѿnbvGydRڮ]qKqeʕ+oFtҥO  @� @� @� @�@@5$ @� @� @� @� @� @� @� @�$0~M7E\w]ļyDlSx뭷⠃ Ƙ1cbRq% Gi+.HAo6 @� @� @� @�~, P&Z @� @� @� @� @� @� @� @�X>ڈ[nACD4ipN:ł J-'W\qEt=>I� @� @� @� @T 4M @� @� @� @� @� @� @� @�I`؈SNh*#.(bԈ*aZ4M(VnݺE>}K/-q F� @� @� @� @*/+i @� @� @� @� @� @� @� @�JX7#;,b"^y%"&O8M7-@9o~Z > @� @� @� @�@4 @� @� @� @� @� @� @� @�r'FѥK?1fLĩFԨQkBJL`=}~{  @� @� @� @�UZeuM� @� @� @� @� @� @� @� @"x }4f͈矏x͈7˳E]#F_~<O @� @� @� @�d @� @� @� @� @� @� @� @� P~6#6#ڶ5*_{;o3#w{W\qC� @� @� @� @L*ˤH @� @� @� @� @� @� @� @�%+0wnGlq1aBăFo_6:&pcmK� @� @� @� @`VJ @� @� @� @� @� @� @� @�/gC֟1xpDjᆈ.7CC`mz$@� @� @� @� P*jeQ @� @� @� @� @� @� @� @�xch:bذ &Q} 8묳/K̘1 @� @� @� @�|  @� @� @� @� @� @� @� @�T _/b]"F㎈# SA*,p1D㦛nȕx= @� @� @� @�! Pt* @� @� @� @� @� @� @� @�@~~GtѳgĂ{QZDFq'myyy+饙� @� @� @� @@UqL  @� @� @� @� @� @� @� @�*EwNѸqīFJDTT@L@)8b̙1lذRVr @� @� @� @�lxZ  @� @� @� @� @� @� @� @�W_E\}u6D ѥKćF<DĞ{ NZl27|Z<+ @� @� @� @�) P|Y @� @� @� @� @� @� @� @�)S|"3gF\tQD_1`@ĤIwk>l8SO=5^xᅘ<y{7 @� @� @� @�(J(� @� @� @� @� @� @� @� @@N"n&D wq9~q5[mg%@` 7b7n!N� @� @� @� @`#   @� @� @� @� @� @� @� @�ӟ"3';GCijFSD\|qDE?�%Pj8c{Uj @� @� @� @�l@Z۫ @� @� @� @� @� @� @� @�q+#,:ELUsF@8 īZ6 V% @� @� @� @�U$@� @� @� @� @� @� @� @� _睷ӟ}CknEgx"TYWvE򗿔UJ� @� @� @� @j3 @� @� @� @� @� @� @� @�F\rɏT)bȐh:⭷"{.'?q_-M#<yyyes&@� @� @� @�  @� @� @� @� @� @� @� @�C"~ۢGZ4bΜoxv+Vʮ@c+I� @� @� @� @zZ< @� @� @� @� @� @� @� @�(3όUTJĝw]m6ڵkÆ +P9 @� @� @� @�x%@� @� @� @� @� @� @� @� >G\}D:_նdIĈ#G{eC9$x≲< @� @� @� @�Xg  @� @� @� @� @� @� @� @�D ///l_xqE%)Q==;OǥKLVTi{*Ube{ժUZjQzy͚5{i q=ՑJ⊈ar-'>8~ѣc]v)OS3 @� @� @� @�Z" @� @� @� @� @� @� @� @�O ]-X`:s~i ., ʝ@UFcZvڑ;.{^NdMsmu֍zŦnk׍N<c,0B 2ǖ ^E̝Ѱr\ Pvm|_@r@� @� @� @� vKo @� @� @� @� @� @� @� @@HXs Vܿ⋘7o^|q5XhJ¢ ʅGmf˅JˆNBUZH{ ZJArTګVsXrTr{-=z=///;qqAJUnO+B:.$ 3gN2 S0Yz+?/[eԭ;? ,kQ4n͚U-Gֵb\7̂�'}ÇyW&hF @� @� @� @�V! Pk8n @� @� @� @� @� @� @� @�6@ Ú1cF|q̙1k֬l={rش­RUׯ 4MF۶mԶ馛fL^N,jqKu.l4֖)}WrG-czfA{s R̙b̘/Kˎ)laÆ[c7_ڶrhҤIvL)F@HZzj|wL @� @� @� @�(*J' @� @� @� @� @� @� @� Q-ZSNӧDzi RܖrIN:(0t]JNtkԨioԨQaA{Uxړ5o޼;wr{ YKkI&eak)m…ˍRVfͲ}*<Om-ZXvAիW x{7� @� @� @� @佗� @� @� @� @� @� @� @�(W)h~i}ʔ)9W\9 JaFM6]w58hҤI|ҞBUVLfg%O~1cƌ3y|g'ī7C֮]; JZioٲej*f>66@n/ 0B� @� @� @� PJjP @� @� @� @� @� @� @� P0aB?~}ҤIYQ.0nݺYJ DԩSz衅aE͛7BVkJ ׯioӦ*'N)-رcc1}Xti6FZ`m6nlϝtJV.7 X;+^y啵{Ho @� @� @� @�e\, | @� @� @� @� @� @� @� @fϞ~a3&?8mڴe+W*Zn;StA6d!ZZ QF$Pଢ଼w޹ȑ/^lM<9>q,P瞋[n%R\j׮o}ٞbvqEj$Z.]\)Q`jt @� @� @� @�('B @� @� @� @� @� @� @� )0(g3gkРA zUF'!jժey/jKߓqرc#Υޛo-Y$W黓ڵk۷;[lQpXFsα`{G6 @� @� @� @�A@VEXes$@� @� @� @� @� @� @� @�"gЬ7|3~,D>EE:uӯ_h۶mvݤIrD cGﳀJui[O>ծkv![ K8r,  @� @� @� @� P"9 @� @� @� @� @� @� @� @� (0s1bDY; . FNb??:tnmT\*2QFo>ۗ/ѣGǨQ'+2,Y-[̂vteժ~5ʲ~+@cw̾3kfK� @� @� @� PN� @� @� @� @� @� @� @�ʑ?|+1~Yfnѭ[2dHt9zr4kS!Pvׯ{Wowߍz+x㍸kώ:uD ٳg>wWVNͱk.>2]$@� @� @� @� | @� @� @� @� @� @� @� @�2)K/O=T<sGE ѣG 4(sرcT^LO*@ڵzwgfS>}zk~KcM6µOZ<XR֍7XL� @� @� @� @" ԪHm @� @� @� @� @� @� @� @ ̛7/xxdz޽{xѻwСCT\R*@f#$1gΜ,<g:~_Ď;x`~Wl0/;CL6-UV @� @� @� @� I8 @� @� @� @� @� @� @� @�R믿G}4zxQFqA?zڵkʺE@| J{ƍO=Tw5D :#cBF!Zn1yi6~A* @� @� @� @� PJ @� @� @� @� @� @� @� @ 1"nՋgqe{*UZA=E@~#guV̝;7|xSNѮ]8㏏@fm2' Ԫ'@� @� @� @�Tf&J� @� @� @� @� @� @� @�zŋ=;v}7򲰜S5\]tUWQ6@Æ �g}6Mw\tMV[駟ƍpxbSNx;F� @� @� @� @"Ԫl @� @� @� @� @� @� @� @ o=~袋b1}xwQ_PʗPy6[ng}v|#>h۶ms16(`]4i>9 @� @� @� @�eJ-S˥X @� @� @� @� @� @� @� P^|СC\~qɓsύ V1tu]7M&QTK/կM6XkL믿/  4X92/NCz<{XdIٟ+i6eI@VYZ- @� @� @� @�@< @� @� @� @� @� @� @� N .38#7.N9唨^:U 篺Z]Rј1cbԨQ{O>$;vUkE-{ ,>Ɨ_~,=\t5֭7xc?>uӦM[Jꁝv)+)m۶kK7ng.q H� @� @� @� @4 *& @� @� @� @� @� @� @� PR8H 1bD[1tШUV9ƛ޿ˊK>K,Yz'trvG뷲UTʞM6Bڴi3f̈gku[o]w]^ڶw=^l{[oE ԫW/ϟ_= @� @� @� @�ʛ@C� @� @� @� @� @� @� @�JybFūm۶-LGuZ`l]tQ .+mZVJ[yնs,P-_#}O=ni{r>W)/>dȐKKi RZ+q� @� @� @� @ *jJ @� @� @� @� @� @� @� @4 |Qf6lXl&{,}38#պ`'e]ݺu#<2F|^{8sgϞѯ_^xߎNuWĨQbѻw IQzf͊<N:9rd6jˋq衇F :sb_qUWeϧuצĵNg}ঙ3gfc5y*jk^k]*x72}7N<,)/>CvXL:5ӧO>3fu[~~}Vcǎ>:kK땶iӲ駟y睗{<O,^.wo3<3F4 '\ @� @� @� @�@b4 @� @� @� @� @� @� @� :?Ymk^]v_nᆬRGe :4OO~7n\TZ5}s=cYW_}5 xj׮]<ѪU,*Oc+o1=owߍN80jMVVo bIA]iܹswqѢEXUmx`•BRXcvH]:(;/)`,gH),mEk+rk^9n) Qm;ƍgW^?95 ^z)[+lM-)p瞋z({,Oj{G"}FӶ̅eǧ~=ѤIb-V:*^z饥LիŋI @� @� @� @�*2$ @� @� @� @� @� @� @�()m۶ѩSQJ{rQJYf\vehѢu]]tox@BRQR�ҥKcwQK,²vi~ 47x#;#FdMFK6L իWUՖ:?Y T:OaL&M>snݺQRl=#u)[o͂敂ˊ뚮WqMbĉqg1l2L^Yw]tQr!+/,,-okUJ sKabn[mU4jԨieyYۓYfeԪUkGs׹,e鳝 v)+O92jժ Y @� @� @� @�0*R( @� @� @� @� @� @� @�gώ-r R`֜9sb]w֭[83 SNvޡC¶K.$;5jTvL#G;ƛo)|+mSN͎͛Gn #Z]iVW[״iӬ{ ~Jb)-ӶXYC h߾})0kW_jY-绪Znxc…kˎoӦMK_`A|mu\wԯ_?{,??/^]7klx,J!w_|Ei,OM2G� @� @� @� @@U!$  @� @� @� @� @� @� @� @@a?BlJGEEW1`8O>>8Rw}Wtmmٲe8_f-իWt޹sۣo߾|>ݬRjaM]6djMj˅gUӲcUOIPTT-EXӊu0aBh/7Nݳq~t,Gֱ!WOqEY%+spXyދz[lA%U`?u @� @� @� @�(J � @� @� @� @� @� @� @�#>:͛{oU^^^u]CEfg#<r5Kvm{G SN9%nhӦ*_kR!S[۲cOlQնV\o=:bĈHw1ϤIcӳӶmJᅬ뮻.N<XK @� @� @� @� Pj5 @� @� @� @� @� @� @� PRЕW^gyf|38#f̘ ѣGG⥗^/b5 ٽ~eǫ*,Y曬=???;U՛ JBm}jKy5VV뵲~k۾{d=[oe{rqQjl dKkJj<xp6^1rh޼ytev1hР3_ @� @� @� @�TXZvM� @� @� @� @� @� @� @�l:+9իW\��@�IDAT5p Y6,RHR۶m~=Of),6m'B.xG .O<vgǔ)SUwv^dU6m4OG u-=0{I&e܏4^ l;;>(wk>,3k֬¾EM:5;iӦemcQ*-{j>)Pm}c5jw^֖Vϝ;7?u=S⩧#<2͛69kl=Ӄ5YYXmV|,<3q7G:ud gqG>$ /$@� @� @� @� @�BZN @� @� @� @� @� @� @� @� %?9~_D޽+Uuad}q뭷F'm 5jċ/ժU˦r[l=b뭷Ç+ YkC׿faUkjzwie]ߎ?<RҪj{c /dOa)<+?*U?0vqܭUӚf5vꩧ㳱Rф 53fLv'EͫeZz-o}y~ǝp qQGE R{嗣A??seI[i55}ѱ6Z$\uocǎѣGre9}8蠃 ܎8sO4:}O5bK_]v#Gfkl @� @� @� @� Pz*SJ @� @� @� @� @� @� @� @�$I' ]s5YVi… f͚gEգQF˕ƒz,ozEÆ ./^ke׵jQiX]K.BZlY >͙3'g6[٢UTۚz�)>-ZDVV[)yYY\>wG\hQ̜93{wJ뿲;.?n0!,p7_f*P{*s] ED� @� @� @|XQ?�JGbDϞ^M^ @� @� @� @� @� @� @� @�+лw3fL\qBw^xau)L+mM6]e+Wmf}UimUVɖSڮsN 80뷲zS+:Om|un /Ϻ,j^E.j9IrCy\q)d:6uqM]m]ô)t.y/FtueҥKi+S= @� @� @� @� k?,q @� @� @� @� @� @� @� @�JHVZB|8㌸ꪫ_~Ѷm8c@%Tn6ܹsӣq%z\ڱ;u>%!W6mVs[zs Y[p*QX뽫]˛G[n%n;:h-Gѝ� @� @� @� @�6@mC @� @� @� @� @� @� @� @�+HGzktM`8p`uQѽ{T K,O>9xˋ;/87dy޳gώGy$9rdxws.R;/Yf(gPff: @� @� @�%%Pχ~~XRo0.@gƍ#^|1gbSbL,  @� @� @� @� @� @� @� @�"аaø sύÇwolqG!ݺuʕ+o)UR%lϽf͚SR&`Jقs93gΌ'|2{xUVY?\RӼf8 @� @� @� @�(iZ%-l| @� @� @� @� @� @� @� @`V/" >h\Q~}'B6Ԗm+;֫*]ti;+~x7EYޯҥp� @� @� @� @�J@R8J#@� @� @� @� @� @� @� @�~lOyea:O=T~1mb}^zEnbM6AG@9;vl /Ŀ;wn}Oa{ӟSN`@� @� @� @� @�I@ @� @� @� @� @� @� @� P4hG}t/Y$xxgk&{f{&MK" ,^8}xײW^3fDfͲӧOlǜ  @� @� @� @� Pj%6A @� @� @� @� @� @� @� P~T)8+]vY|7Bx>bĈ .-[:uΝ;g[ni13\ ߍ7.FoVv|w[oݻw/<z;C) @� @� @� @� @8j1 @� @� @� @� @� @� @� @�R!PN=hѢx7[n%?TRn::t۷/<6o޼TCʓw}~a5*{W_}ks2dHcfͅ� @� @� @� @�P@BF� @� @� @� @� @� @� @�=իG׮]=W9sw}7y睸{K/W^mvM6YO  ro6ƍcƌ>8iҤXtiԭ[7 رcr)뮻fߵ*U|Pw @� @� @� @� @Ԫ0Km @� @� @� @� @� @� @� @@hԨQ~ٞꫯ"aÆE J[:ubv(ܷnhݺulѰa0ʽŋO> &d?cԩS`jժEk.?y睳UV!DL� @� @� @� @�, Pk<H� @� @� @� @� @� @� @�uF׮]}9@1cdAߟ e]ׯkm6[G [l5k\vHJ̙3ɓ#)@+'NSL%KdslͲ>{hӦMY\ ղ @� @� @� @� @�6Z @� @� @� @� @� @� @� @�JQFѣGl_v)L+ ?>&L 맞z* o 7n87o-Z(<nVѬYhڴi *rR1wgýDJPSIMM@P0mpji9ܜ毮TJsX80(^yk}k?8_7ꫯ'L_~95W^y%3g,hԨQYq_/~eVe#@� @� @� @� @�K@ @� @� @� @� @� @� @� `6mZ BM< *}(P"ܨf[c5kک;vX:h׸q ^Lnĉ>iҤ篿z^{r={|"ȭv |a"k׮YӼy @� @� @� @� @�S@穫o @� @� @� @� @� @� @� @A Z)m#?k֬2W_M^aH&LȨQS.~զ.ir|K*}8_}˽]vBQE;3iӦ孷JEGExVMV֬Yl묳Nuw߽ m+]w2H= @� @� @� @� @�" P: @� @� @� @� @� @� @� @�#мylI={v&Mnk{ɓۤQ7ҵIy'.!LsPj`"d8iӦ۶m;j{VҺuE^˖-S5̛7/~Pw}c"(f9 *-5i5_ mСCy,j΋`5 @� @� @� @�kڊ� @� @� @� @� @� @� @�hO? Ԭwɘ1z%^2`@򵯭Y1R3M:5EVMPǚ0XuՄ<ӧg̙w7.p"Xh"u\eUREM4I7mڴ<\bF}^"̙S!c |Aj"lz֬YGb *|ṾĪ 1[ϊ೚*\m @� @� @� @� @ Ԫ+l~ @� @� @� @� @� @� @� @@x"Dz=:9?80nT>y*ETM'EԌ3./"yUK-@UtUVXǚ *B>*0Wlp0Ex^ }Pbo۶m:vHHXMXMXq9/Zn=/6 @� @� @� @� @`l @� @� @� @� @� @� @� @sx!ZO=NÒCwaET6m}y? @� @� @� @� @ 8  @� @� @� @� @� @� @� @�/.z≤cd .Hv)isX @� @� @� @� @�Z* P. @� @� @� @� @� @� @� @�%0n܂#!/Mv9iҤ~l @� @� @� @� @�K# Pki%@� @� @� @� @� @� @� @�,/'Wi=hI߾g'*Dk)(5%@� @� @� @� @�김@zG� @� @� @� @� @� @� @�XW_]Ivɾ&[Է=1 @� @� @� @� P'|IJN,"  @� @� @� @� @� @� @� @�,ɐ!ɠAC%m$}$'{*z @� @� @� @� @�V@* @� @� @� @� @� @� @� @�IM7Uh=@ҪUһw%={&͛I)� @� @� @� @� j$x @� @� @� @� @� @� @� @�uO`ʔ曫C/i"gdȐd=ެTL� @� @� @� @�XV� @� @� @� @� @� @� @�orKuȑI^{%7P}\uZ\ @� @� @� @� @�uD@VY(e @� @� @� @� @� @� @� @�+N୷[oѺi3dsVV\-F"@� @� @� @� @�4Z a͑� @� @� @� @� @� @� @�Xo'V5bDҸqҫWrUIIKB @� @� @� @� @�( P3y� @� @� @� @� @� @� @�ӧ'^u]IUU'}$m9 @� @� @� @� @.Ԫ F @� @� @� @� @� @� @� @` ̘qGuܹn%}Ivm( @� @� @� @� @�|JZJ3 @� @� @� @� @� @� @� @ ^2thuVqd] /LMڷsS9 @� @� @� @� @>Ԫh @� @� @� @� @� @� @� @fL K~sf֬e~5+n @� @� @� @� @�$Z+ ް @� @� @� @� @� @� @� @5+dРfgƌ+\#3웵Zc� @� @� @� @� @`j- @� @� @� @� @� @� @� @�(0{v2bDMV2}zMIǎ}3yS2dhz+44 @� @� @� @� @/ @� @� @� @� @� @� @� @�&ɡbrȑ+AZۦ<߅iնS @� @� @� @� @#j}[ @� @� @� @� @� @� @� @@3'1"9d=L}69d䡇M6+}lΝ;GͦnZ&" @� @� @� @� @� 47 @� @� @� @� @� @� @� @�D`{AoNx#f?O Hv]PE]A.,͚5[ @� @� @� @� @@UGq @� @� @� @� @� @� @� @ ̛uM7%''_jr!ZnJVu笳I'hW @� @� @� @� @�^@V_" @� @� @� @� @� @� @� @�/PU<`u֐!ĉ'?quov Py <8G7t� @� @� @� @� @V Ԫˣ8 @� @� @� @� @� @� @� P:D^K6,97乿K{Sjz?O  @� @� @� @�Q3fΜɕ73P6X@%iA� @� @� @� @� @� @� @�,GGY5aB+~*s!Znzӷo߬z_Ν;"@� @� @� @� P{O6JE�OZs]͊� @� @� @� @� @� @� @�*4(?>:D[+ꫯ^kӲe˥@k @� @� @� @� @�Z' P- @� @� @� @� @� @� @� @@x!Z/larɀWs'>;'xbylԨw  @� @� @� @� @�Z' P- @� @� @� @� @� @� @� @@x!Zc&믟_6K?/~{t-3pr!Kr|ѣGV]u :t9+ @� @� @� @� @@0ݬ  @� @� @� @� @� @� @� @rx!Z=t Dkm~"QFƍW\iӦeԩN;-}y婧JfR7nx9; @� @� @� @� @@հl  @� @� @� @� @� @� @� @r( ދ@ΝO.<~T>0E8n햿/iҤIu{G͆n:^o; quG� @� @� @� @�4HZ rM� @� @� @� @� @� @� @�,@%?j~֓O&k]u%Ɏ;~+9餓r=*7|su֙:uj Ӫ]v5 @� @� @� @� @�( PkN� @� @� @� @� @� @� @�K/-zdK??7ƍ?gΜ /0?pl9cөS"Ls)Ͽʀ?яseȑ<yr#FZguV:v8)ST:?O<DV[m|իW|Μ9;s\~:[ouF]r-s!Nٳ{;VŽ?{;M6UW]U~ :4]w] &Mgڴie{NϞ=gŏ[o'Mڪm۶;!@� @� @� @� @�4TXjC%2o @� @� @� @� @� @� @� аƍK~{dN^{-d].Lkԩ)B_)³lfy衇J>}K_Ry+w\.JhW#eVUUU.vaeǿlҥKĉ{+(ZOfկ_2뮻Jn_ڵk>^(ôvL7߬tsQG,[24[nɘ1cuO=2̫h_%7mݶ + @� @� @� @� @� Y Y  @� @� @� @� @� @� @� @�L{nv$uI%s*II& OO?!V;CL6-zhfϞ] ڨUIlCyU.p 9rd:v8?hrǗWGyd.<Su]w޹</^z饌5* GQ޿c6ɓ{Eѣ:䪫V[mU>qW_M*H-ZiVΫxO5]s5)~ᇧ+B{6 @� @� @� @� @@C̟� @� @� @� @� @� @� @�&矟JSҵkrɗ L\vYIӦFTUUo1묳N[oNiժUƎ;#nm@ըQk~-۾NtUrKn2:ˀ֭[g̙[:u*o|UkܸqU`!Y5[Μ9sRd[zջwm۶I7o>8ٮFo_jn28c)\{;wn;Ǘ5 @� @� @� @� @�2~d? @� @� @� @� @� @� @�[EP֐!ɠAɃ&Y͚-L< Z8i%9rdeԳZ~%Q[lEXWUlzj;~YVg-u%{g?^?__80?Os% {7W^yeŴO%lAZEט1cҦM<c� @� @� @� @� @"PIO @� @� @� @� @� @� @� @@YUo~3ܹ:<![nIgW_wyiz+d8O>a׿5J5jH%]lٲl2jԨ5}2iҤ_QGUs]z9srg~Fi޼yf_[zΜ9e 7Pq#Fewy Zſo&@� @� @� @� @�48Z nM� @� @� @� @� @� @� @�o$l[ҩS%;&'S$]JPѬԵ[qܹ9cS`5m4 *C0YNi6([mp͛7 z^zk׮9s�}#,Wn-i;c2qpy'9w}:u|epWM_r'\: @� @� @� @� @�@&N� @� @� @� @� @� @� @�M۔/OzLY'OWOd~-V̋", .29{W?wJS%2sWdљ0aBX\+Xv?.vyvie0N; 6 ݻw/N)*K/TѸqqeEUqfewL6mr.ܼ<wcM`Wvڷomݶ]ve߫ZnG9蠃C}A� @� @� @� @�hhڊ/ @� @� @� @� @� @� @�+iӒ+L3Y{?#i*暤ȏ<8?irN/f˃>:W'| Po}yg`cǖ> ~g}w衇_/)Ϙ1#~z~ӟ+_J8̛7 ĺ{wvE`a 70w?:#VmE'||'? "0_%hw饗\kF20N1aÆeܹsM׎ @� @� @� @� @�+Ш5ٛ8 @� @� @� @� @� @� @�3J8U2hP2bD*TIϞI%*{'V;'Ce}͚k_m*_ j~7w} h*KQ]W͙3 j۶mͭ=Μ93-Zkf͚-OK<b*VwG8. <y5q kKtJz::e @� @� @�h.ʐ!g<pE�K+0eJZɽ&;To7M͞� @� @� @� @� @� @� @� JNTn:D;J.SLI>EJ5\?<{gڏ Ҫ)p@{غul喟->vӦM+K*:*´SN~Z_>{ @� @� @� @� @�- PA/ @� @� @� @� @� @� @� @@m1#C KIv-䒤oߤ]\}umUSN9%?͛I&9Ck+oׯ p @� @� @� @� @�# PJ @� @� @� @� @� @� @� @@?::D8Ξ|o_nƌ;6[� @� @� @� @� @` Z#@� @� @� @� @� @� @� @�93>:D;z睓sM/YsSW|N @� @� @� @� @�|@O� @� @� @� @� @� @� @�|Nf%wUuɌN;%%4n  @� @� @� @� @�BZpQD� @� @� @� @� @� @� @�S#Cn-yd_:Dku͊� @� @� @� @� @j-Is @� @� @� @� @� @� @� s$w]u-o'mvZҿҹ2tU @� @� @� @� @�D@V=YH @� @� @� @� @� @� @� @�#0wn2rdu7'S&_Zr)!ZW{jU  @� @� @� @� @� P6 @� @� @� @� @� @� @� @ !ZWuMo$[oxb2`@u~&@� @� @� @� @� @s� @� @� @� @� @� @� @�y,њ4)rC6ڨ  @� @� @� @}˭��@�IDAT� @�# Pk8� @� @� @� @� @� @� @�@UUC!ZC$tTh}K 4  @� @� @� @� @�,GZSW @� @� @� @� @� @� @� P?<8ydM#L8 d9o"@� @� @� @� @� j(i @� @� @� @� @� @� @� @@x!Z/lqra!ZmV禣` @� @� @� @� @�V@V] @� @� @� @� @� @� @� @?C JƍKM HbeTdL @� @� @� @� @�_@V_c3$@� @� @� @� @� @� @� @�%<Ă_L6 9_] @� @� @� @� @� P @� @� @� @� @� @� @� PzjA']&'$ݻ� @� @� @� @� @@UwN @� @� @� @� @� @� @� G/zduC*nLs @� @� @� @� @�@F# @� @� @� @� @� @� @�c,zSd.K>iԨ6V& @� @� @� @� @� K@VZo%@� @� @� @� @� @� @� @@x!ZW~%]cҸq`0I @� @� @� @� @�uF@VY* @� @� @� @� @� @� @� @' BϤC.yg!Zd @� @� @� @� @�- Pke  @� @� @� @� @� @� @� @3  \5jTI~9$fҤgڋ @� @� @� @� @�@Z+P @� @� @� @� @� @� @�  DᇓWOM<3#i_vd= @� @� @� @� @�X> G� @� @� @� @� @� @� @�K/kɐ!ɠAiorɷ  @� @� @� @� @�j@ڳ*!@� @� @� @� @� @� @� @�&MZIIɉ'&={&͚-) @� @� @� @� @�uZ@V^> @� @� @� @� @� @� @� @~ LtS2hPr}I˖>Tcy5_!@� @� @� @� @� @Z@ @� @� @� @� @� @� @�,;3 &7[oS̞={}޼yYeUҬYEmۦ}W_=kv:u&M,C+9s`曫C:4kォ3Yu3 @� @� @� @� @� >ǑW^F&@� @� @� @� @� @� @� @8qby晌=:=\Ə_~~EiժUUb5Y5!ZE8{w>`~֬Y2mڴ2;w>;wzWmQ6tlfx7^ '|zjҨQrY4s-աYk*!cIuIղKK @� @� @� @� @�꾀@f@� @� @� @� @� @� @� @rx=?p}<ә:uj9B0 6 [l.]C)B�e٪2}r̢சA /[M6l~vەZç7{M*K *n:D/I*Ya+d}֭? @� @� @� @� @� Pjշ5 @� @� @� @� @� @� @�J_ψ#Ȅ Ҹq28kmF/7ltq,5j6mڔ믟f3fLFgy :[oyzӣGٳ jR$W-mԨOdʔ+l?ZtJ6Xn:D뮻UWTjwE� @� @� @� @� @@0ݬ  @� @� @� @� @� @� @�4h{,Νwޙ'|2͚5;#<2o}wjqSQonʽf!GI vUW3L۶mp}'}-kK/M9& s{Ye}7Óyo}+)wTj#{� @� @� @� @� @�* Py @� @� @� @� @� @� @� SO=ntc^|lݻw>.iٲ"EF1cdĈepXVzʷrZZiΜJW>H"dذ#TW; @� @� @� @� @� @F@V# @� @� @� @� @� @� @�N`֬YeŕTGy$]vM3`t޽w l{챙6mZn 4(|pV]u[?я/yW?t'T2>v{嗓OKXcz@� @� @� @� @� @�E/r� @� @� @� @� @� @� @�@`ʔ)/~u]7~x5rȌ7.oDخ]r!6lX^{r)>|x6tߩ7Ӛ3s ; @� @� @� @� @�|@O� @� @� @� @� @� @� @�:%o?y6`\~O~ &o7:5ϳ5\3?2vu]iѢEklvu%e*ϒ3O *k  @� @� @� @� @� j}:' @� @� @� @� @� @� @�3g̙gYi]y93nܸ|رc-|֨Q6lX}t!zʎ;#<K:O5qb#+w^F'@� @� @� @� @� @ 4{%� @� @� @� @� @� @� @� qXIr:餓rgUW]٧޽{㎌5*vQzX}*[VkٳA+l @� @� @� @� @�t>V @� @� @� @� @� @� @�2?_?w}s=k׮ʺWNuysUW[c~74sf>oނ:Խy� @� @� @� @� @�+ Pk� @� @� @� @� @� @� @� /!Z'N^q=z4J痿*GqD<[e?3'tǽ> @� @� @� @� @�I2e @� @� @� @� @� @� @�`?ݻwOV \s|9ri堃ٳ?uM� @� @� @� @� @@CPW޼  @� @� @� @� @� @� @�AÇgϞ}Skuҥ΢|;̰aһw̚5MB @� @� @� @� @�jZzyG� @� @� @� @� @� @� @@@կ_tAӟ͛<r\kFQF;w  @� @� @� @� @�4Z e͓� @� @� @� @� @� @� @@7n\훽;ӸUze,V[mC '2J0& @� @� @� @� @�Tš @� @� @� @� @� @� @�"0wxҥKaZ+yan\ve9s3lذ\  @� @� @� @� @�/J @� @� @� @� @� @� @�z*p%ghbw-8+QA|;9{בֿI� @ w}9&*kjU]!@� @� @� @�ꎀ@V*%@� @� @� @� @� @� @� f̘38#?O馛֊;5kViӦ-/_s=7SN_\sˑ� @�I`׏7.W^yeƌ9ٺ7o^z<)m @� @� @� @�b @� @� @� @� @� @� @� L>='p sIu)~x6d%5]ŗ#s]w?cZ9ꨣra @�X[lGY4icgMƾjE@� @� @� @�O457c @� @� @� @� @� @� @�uFO~kԺ6mk:餓r=j["XW^<# @�,'w}^UvڥM645 @� @� @� @�u@`BLZ @� @� @� @� @� @� @�~3go[܋=ꫯQFӟ1c3ܹsk /̜9srw/y睗 . O?t.첬 &}<iݺuv)$s)~P_.nԼsQGe})?>W_}uZh7<{dҤIg.~7xlF_wy.  @�X@wO?7N:~ Eɓ'31"na:tqSL矟'x"Z>ի|ql=ztf-!N8!g.){˿᫮ :th 2$5_7|siӦ5;={_㭷ޚb/jʱڶm; @� @� @� @j8km @� @� @� @� @� @� @�?>B]x\k7,`^nչs /ˡ_~m^5jԨe w=zd뮻rZ}IEEסUW]7\q);ٻ(/^z HS/pmҮ .  QAADEAzEj(ҒwKB<Ξ9sgv'aV;wt7e˺޽{5zXKhKU[C�@�@ RZ;wnOFҗ_~z) ~&MbŊ.w- ezӧZh~] ԩ ׊;hY ^Խ{w5n~4jH߮cǎeA]͢EԥK̙30`,XYF=zЧ~˗� � � � � � � �B (U̒I"� � � � � � � � � � � � � � @?ݘ-*KtTTh,XPr l8q6l[͛]JrV&uukV֬Y&Mwcz{lB"""TR%?CnoV6N~\ GB�@�@ uݻPƏ>[ք t{̙K~3f>c͝;WyK޽w]CuO-Ӷm[=#³jԨk>[cY`}" MV2dp\6/+lL]xXΝeq,dضQ@�@�@�@�@�@�@�@ 93F�@�@�@�@�@�@�@�@�@�@�@�@�@�@�x ϟߵlٲ @np*Vݺus7<yr,P+jK.u75j(;?F ٟ;K@�@�:zt'/7t2gά 6->W\D+V<* gO?uAX]{*QdɢSN'b~籐, ,}Ν;Ы;Sٳg7QRN8p@UVՌ3\pVϞ=]>HܪU-h � � � � � � � @N}V@�@�@�@�@�@�@�@�@�@�@�@�@�@�Q wh{MģF??<n$n?n8j*U>h]ǼQ~HH95kSͣcmxgɓ'z @�@�R@dYED 7]t]X~}�$>m_+;`�-[˗kƍ9 B E>_} ǻ}}]]vرnݪK͚5_Z[Nٲe ƹfw>}#@�@�@�@�@�@�@�@ % .sC�@�@�@�@�@�@�@�@�@�@�@�@�@�@  .]Z_,=<<\uOaaaСΝhFSNu7ܹƎeg%frM+Tp9@�@�T/&_Ν;m۶h p~3e]tiɓ'o>8ݺus\cƌ/}Zz^{5O^5jԈs{ܹs.?kٺ{>6FNdZ1˖-[bn1 � � � � � � �RIf � � � � � � � � � � � � � �$G 2nݺ9sU~tv{222RxaJ[yĉM>nocݸ޶km:q[x/UbR\ׯצMThQwCiw9- � �I_ H2r wٲeʘ1T_%J(K,Od!b-kMq.5k"E7p[j]}n]S{ugVX4|:t(0~c.\~% � � � � � � �"Rf � � � � � � � � � � � � � �$7O}<C?ܹ {ta޽[3fpAWky o\ SLq7o6ת^zn?~w#y 7nV^-W5uT׵]d>cclرc)S&= UHH[ڍ6m:詧r7�N8 4A�@�@ Y W_oԩSn۶mڵk3sb\civ>?c.aÆ8p\~M7XbYk> =# *TP-[6{ョ?C`9mUvmG9\Yfէ~*~6j(C=7ߌ- � � � � � � � JDz%̕i"� � � � � � � � � � � � � � @28v섊m{7T1AGo7oѢV\B i3f ;eUuY*UJvy ڵkw/AիW6nn\o7Ʒ0-{\\9F&M<y'k/ :t5jaÆuڷo[.[p?mڴjժ(wܮ'DٿJ(\ڴiƳw8,łɣy-@�@ 5 ;zd()K GFz饦{FԸqc=þ sѣG5~x\V-YxСC5a„ӧ+W\}ҥwaV1D�l!_>H->ziӦ:u 7xC_~nfgYXpݺuݮ֏})R,( � � � � � �ڶ}GS~]G @Oy'+}԰a_RZI06@�@�@�@�@�@�@�@�@�@�@�@�@�@�R@dK67mNҥkI˗OpjO< aDDΝ;pUxM<p5Dnpo5SLa3f-el2/X@k֬ bGz'B,b[]l·BCC/={vn,@�@�d/@V?qNrH>W;vL7p2g|~s]f͚/m\bO8|>u2ds}~wMޗ?Nfߑ*?K@�@�@�@�@�@ R$@� @֕tW+{"� � � � � � � � � � � � � � �nYQ^+voR|l5b?kɒK,\p?*!+/:[l7o&VJ,kn0,.]:/d,~]<\rҤI8qfΜ0-;?gΜ^*͂<g֎;tRݬ?o޼qoϟ_哅sY[  � �Z mڴXEw>gɒEUTh{2H|´OgnW q}?k#� � � � � � � @_H̹3+@�@�@�@�@�@�@�@�@�@�@�@�@�@�H`#G|Y5<˂,cFD _hVfң-/IүJ˗KGK%U}z5e%^wvʖ-{N2S@Yx:w^zEWeFv~sjJ.zpuk�͛pBtEFFزP@�@�HhG7O>InSL2V\3&� � � � � � � � PF@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(%Y@V,{ ,xq_PVRNRcI7J"-[&}/@ҦwtZ5g*U|5G`5mT]tرcTV5oVSzK;[nEJnZEjʕ/:gϺЭ={_wX_j[߿,_2ggV@. � � _;Q۶ķyk7x`?͛ #� � � � � � � Jg#� � � � � � � � � � � � � � p{u뤵kmۤHyVR",˒jη^T/˺KHx2D2dYU/<{եn2f}P 4дitw>}5ΝԩO> ?ϒY ^t rbCjCb./^IN>^d͝;w L@�@�DR{}hD;$B�@�@�@�@�@�@�@��ZI1@@�@�@�@�@�@�@�@�@�@�@�@�@�@�ٳҦMZze%[6lY_&߲\9D )$!_xĉҥ|ZK5jHm+ eͽ`ot]wNzpL ߫W/ܵф _ld\jժU/:b z@'NI.シg�R@�@�@�@�@�@�@�@�@�@�H lj8@�@�@�@�@�@�@�@�@�@�@�@�@�@ : ZFZWm}9)MpaLvmC!ZgžŊIjIO=[V&e{?ՂzI]-[5=]n?#?^zT"gΜZbŋرco޽[7nԂ G c^sVd[Vm˕+@�@�@�@�@�@�@�@�@�@��Z1t@�@�@�@�@�@�@�@�@�@�@�@�@�@�b x=Z|hgYp֖-RD,,)//n[+'.-e菽l%-Z  NefsT/�7 z'uw` >|)rUZ:ԸqԷo_uI͓Q\ k֬Zl)={ja[v-nϟ-_BBBK+peǧ � � � � � � � � � � TJgq!� � � � � � � � � � � � � � p'|YVIco 2e|Y:eaZe~-׭Ҥ{H~m{b3jԨQ^0XkuUdg}V{=G2 *{G]`.zcy+@[e˖?w\gΜ t%KYV2=Λ7� � � � � � � � � � @b X@�@�@�@�@�@�@�@�@�@�@�@�@�@�+8}ZZ|h?@kV)2R^p )BqY^FDH+VH? HKUԪT/@ob[K{W]ȑ#էOu]2eJ!cX֠A_^zZdW"'5kV/4q/һH8poE ڹs,|~s˃H.܊ea\'.  � � � � � � � � � @B P� � � � � � � � � � � � � � @}V+W,<˶K!!RRŊRN/~yY!Z˗K?(=*!/LI[&yJcK ^׀\kޅk=ܹ͛T~MeKs_vښ5k6mzMF M4ʝ;+WSN-ЖmY6}tٳGgϞ q5l˂ *$[klYA�@�@�@�@�@�@�@�@�@�@Rj]J@�@�@�@�@�@�@�@�@�@�@�@�@�@�H`% ͲboiY%M+,)U k βu J7wwܹ҂RX+Ԡ4xoYҕt%0w˛аaü@z7\P /VZ[njܸv<pƏѣGkӦMe̙jѢEJ&sU"Կ֭ܲ[kuĉ@Yf da)~@�@�@�@�@�@�@�@�@�@�<'!� � � � � � � � � � � � � � NVeZʓG�nznA*_^ʘb͛9s$ њ7O2tRFҐ!RÆ4igri;wn :TԔ)S;I&*RmV5kL.Iq9rDӧO?uEԩSsCʕKcI RhhիWs:۹svᖶ/vۏ;?s̊o]wu � � � � � � � � � �\Ref � � � � � � � � � � � � � �(o_[';'e ʲf|Y7oQ_xپ - ʔIj@z)曥*U$/'Քӫ}\R zTX1y?ᅌ5<Vy/ b֬Yoy/P&вeiQH09rjŊ3,,,3|kٲe9  *\,\+j-%g� � � � � � � � � �R˙f � � � � � � � � � � � � � � "!_>4g||U^N*WRi:~U^X.^,UڵnUWO [}PK1:d-]TSNuASogYBn֍7ި5k*k֬*{A^?,Xo߮ٳy=ZZrmb=&=TtҰaBՔl2Ȗ-ʗ/j\S8~vqAݶm~Gɓݯz5d+jVh  � � � .&��@�IDAT� � � � � � @ P+F� � � � � � � � � � � � � � DNV/WYxHez-Tr羺?vL^P4s޽R޼RӦR\RBe_/ mjW^QXX\OڵU;*Tpv(gΜqYVU  Ç+}^:t.^1^͓Oʔzdј$@EX\9W:C\E ûP] wܩgϺӤIP/4)▶B( � � � � � � � � � �N¿zvc � � � � � � � � � � � � � �\3 _=ft5P%yDR׮u/_ .JzY11Csi|)<\UKSjBZUb(W(/_>>e<'Oo-۶xb-YD},NJ/_^ŊsA<  ,s{ij]wBBBp$"##u{A1w- rݺuڸq:wAY%J^Uot`3-}#ߗ :v,\U{?Z\rDZ^/u0jֶmᅲ矁}3g؊_/XYA�@�@�@�@�@�@�@�@�@�HX֓@�@�@�@�@�@�@�@�@�@�@�@�@�@�CZ6H^r攪U7,U+WJӦIӧd6{76/o QFyi^jWZn8ZJWڵk]o^\=z4V,B~,\-*j RΞ=3gӧ]?ua4mڴ*P@ m۶.ԫVLeDZ ^}q^<5jd-($?4^ҠYe)SNBڴi͛¸i޻*RHha[jѢE-[X&@�@�@�@�@�@�@�@�@�@�% � � � � � � � � � � � � � �$[#G$ Z|ݲ7}YToFf' H-[JCJK_3 _=sco\A/X믿Y�e̘1ZȖneϞ=e\Vj%FɕK9RC૯J,GA dȐAKv5EzIe[V;<p@`9rµmsٛ� � � � � � � � � � �Z@�@�@�@�@�@�@�@�@�@�@�@�@�@ 9 ?~axSyy(^(TCejR޼~5e/H˂ZZnQ cL#裏Խ{w 4ȅj]\e˦ *\ɮIv奯fk}T_(4iҸ`; UV>ymۦ[}ҥ:u~y%s.pz|ЖǎIA�@�@�@�@�@�@�@�@�@�R�Z3g@�@�@�@�@�@�@�@�@�@�@�@�@�@ >--_.-Y"-[IR<Ь{--H+_3 ɓI$hi#m+լtƙG_cǎӧ ҧ{EkLVih>^xAz)[L) dʔIʕs5ٝ9sF۷o tkꫯk.;w>}z*THŋw[UX1n˼I! 2I @�@�@�@�@�@�@�@�@�H�D9@�@�@�@�@�@�@�@�@�@�@�@�@�@ DF,<?K.=+]/4UY^I+ISlbZ&Hu$Oj׮:uaÆ M+!4x;H.Y..%K[puVm6m޼Y9shǎ3bm\rv!� � � � � � � � � �B@dq$ � � � � � � � � � � � � � fó.ҧT֕xB][^@Iҵfϖ_1CJޖ-^nE"J ZJwq6mw}7L=kRR>R@- *_>Na#z .jlñ;wj˖--Үe_~ ㊰_8^ɒ% *V[ZȖkv{#S@�@�@�@�@�@�@�@�@�@�$*@V=1 @�@�@�@�@�@�@�@�@�@�@�@�@�H-gH*-Z?,m.I#. 2DUK\Y I2^{O?7Q6mYS{/. ҪT&O셚jvD i4^|Gu.%`ש"E[۳gz7G ۲Э_~E~٣H_ŋj![u[ZW:K~ � � � � � � � � � �HdF@�@�@�@�@�@�@�@�@�@�@�@�@�Hvϲ- :}Z :u$ 59e|i~z͘!)u =TLGJ]VNNR Rt5-&L&M |wՁ8�$^ҝi֭[yfW-lg͚%[ sYpWB.oΝ;ن� � � � � � � � � �$�Z FIG � � � � � � � � � � � � � �1Μ~MZ|֎١ou-Kwx|ZV-Bo_nMPR:Nҝw)[Ν;WٳgOJKc :uڶ kR˖vZ %>}z/رM-`ޚ7oo߮sιݲd"V!^UhQY@�@�@�@�@�@�@�@�@�;j=E�@�@�@�@�@�@�@�@�@�@�@�@�@�&p/<%˖ 0rԑvgժ%yɺ/!Yxj+7X!!K5c;T)YO- >22R;vիpʗ/_㵞_|Qzo_ 7ސV֣ p1/i5kּYxx Պe?>:tK,TP- ׬Y^7@�@�@�@�@�@�@�@�@�@�j1 � � � � � � � � � � � � � @ng"WʖՓ:wh..|mۤ_Ə,',0Glz-/L4viӦo%ᥨ.,M$=R̤!C5U&@bŊڤI |QmܸQ6m 믿֮]ɝ;w \_rq  � � � � � � � � �VRg � � � � � � � � � � � � � e K+V~ɷ2"U.h!/H+g<40߄ RK=$>}D+Ϳz f8n8 : @ƍ_֩#-\(}Է{K2\ÁqhHPٳ{ӧOk˖-- mdΜمm*UJ%Ktտ?~I&f<F�@�@�@�@�@�@�@�@�@�*@V =L @�@�@�@�@�@�@�@�@�@�@�@�@�gJ"͟&!խ+/<J__Y3e'4zT4jRpO}.:w l쟰}ucǎ 9]R2pWjRz i0iҶS@ e O^e˖u5L###sha[6lЬYܶǏ]2fٲ-Ж- x閄mŔ1 � � � � � � � � �[@}= � � � � � � � � � � � � � `OKKZH:qB 4nIXQ^E6v_ҫJ 9RIJ;VӦMӜ9s3g$;80 fiӦ JIf^l҈қoJu$a2HD *T5{ƍ]빭^(;v̵ŋG ٲ-7a[@�@�@�@�@�@�@�@�@�$/X  � � � � � � � � � � � � � @ X`f͝{V'={Y _4l(.M&]M"#9"/=d@Q˚5kO駟V&M>5˅7Pk|>ϗON}TzIn]{}a} [D�|M۷O- ڲsj̘1 s-l˂J{bb\r葇 � � � � � � � � � TJ*gq � � � � � � � � � � � � � �WY-@W/Μ٭Qx /@tbŮ@p6I=zHsH:ICHy^8ӧO{A@RJ4hЅ r"##Ú={2dpcZU{|ueJ{ d}"�~/fo ,/ Z~}~n_$9r\e[JA\ � � � � � � � � � p Ժ@�@�@�@�@�@�@�@�@�@�@�@�@�H p_htTԤtM?hʙ3MY˗Oa%cxLz-gjH?$xcC}ꩧe-_\_vJg{9͚5KS�1ZI&4xxwCC@ 'OY[n`X;![6lp~nݪsιwZ(QB � � � � � � � � �$�� � � � � � � � � � � � � �\ Ze i|Q)4TjeAZŋKÇW>}twh„ ʖ-5sR8ΝH JH<#/$+͜9S#Fĉ=KdN!Ch̘1$A2h!!Rޒh=ԥ/`7 5 piҤQ…][sYm޼9~zYW_}]vYX1-[VeʔV-� � � � � � � � � � #p?O  � � � � � � � � � � � � � 9s|o뮓5^|Q�ĉ?5۷'Sᚗ|, cRr#ٳG=Ow}o̳*fuQ=zPΝ %Գ/`ˮaZI*(@ .@@V6µ֮]uֹ:w\5JǏwsw) � � � � � � � � � oEK@�@�@�@�@�@�@�@�@�@�@�@�@�@ x?_=z!T/[*U ~z}ڷo|6JE[^zI_^4r)'+{^{oJ6mڨRJz7̸ X�_j޾@WHT̙3{TS mr޼yڱc3Ct@B,p\rDx� � � � � � � � � �Z @�@�@�@�@�@�@�@�@�@�@�@�@�@�$,!/<B-Ξ$5o./<H&)cƋObСʔ)_U )sNɓߖzd_y/l.\,Yo'Z%@׮]~͚5KrLruvK&HI<"M{uM @| ( M4ɓ-ؖ~1b/6.Xµh}�@�@�@�@�@�@�@�@�@�&@Vj;@�@�@�@�@�@�@�@�@�@�@�@�@�}򂁤i:$y sg_L޼Fտ 6۷ ҧOS`ӧ6my󤯾YgK.ՀK/Fم6$0K\4i~:U%w&-'yGzuiD C�-)S&UZը;g[j͚5j!'NÇ]9rD m-ZTAAAQc@�@�@�@�@�@�@�@�@�)@V<L @�@�@�@�@�@�@�@�@�@�@�@�@�@xx/@B/BB aIT{?SN.ǹsR۶<sZ7cǎ9ƍwۉV"`A$? kJR_x2.D{wOY3ys߶rň8& pUxqWohݻ7ܚ奫޽۵e˪|g niA[(y� � � � � � � � � J'#� � � � � � � � � � � � � @r7ٳÇb|!1/ 5i"y W\-[֭[+M4.PzWWJٱkW_֜9ӲC8ϔa礭V~} 80OCdIϤy^n}m̜9M@�$**iՁj*ڱc"##!C5d-h+mڴQb@�@�@�@�@�@�@�@�@�d!@V8M @�@�@�@�@�@�@�@�@�@�@�@�@�yK/JZ\ 4{ULӿ/5lP&MfHymii N;G8qfΜ.'--hQPP>'!˛ixyQi�G$4P�Mlٲy[ǏG ٲЭcj۶mrʩbŊZȖ.\pШ#� � � � � � � � �$9)a@ � � � � � � � � � � � � � RNhyyLڷO*RD6&MLnOVϞ=5n8=3<x0AC1>}|f߲i&C?7ohSLч~}AY"x'CXKICJI+t]IqČ H8,YVZFs͚5?uĈڵkk5kVõK  � � � � � � � � �\3=F�@�@�@�@�@�@�@�@�@�@�@�@�@�(w4c4}4wtǤ;*U:޾}Zn 6xǞ;(zԡTw^(QB/rwUzn\x~Տ)!CGZ7xOڣgt @ dΜY5jp5jGѪU![e8̙S7p9R`i[@�@�@�@�@�@�@�@�@�J̃q,@�@�@�@�@�@�@�@�@�@�@�@�@�@ % ['/tIF)~'Q$ ZHzaZVp8I~' 4(} >\ժUөSthaZo|AΝ;_>sG}Bo'b[W^ !}6륗 ի+$$DW޽UlK-fxmEٳPzY~n 9 )"M,*<)U.u_^7zho@b׼rʹk50tk.?F<D� ȑCS׮]c޼y?ϩ{w>+V̺ }LkV֬YUT)}z駟j@�@�@�@�@�@�@�@�@�@1"� � � � � � � � � � � � � �)Y` iT_]Fʝ[vg[o2f8 Z\nX曚5k 6 ł ?{O2elܶ+WjĈ[ԬY3͛7vׯ{lAE1w9/Ξ=D7I+1YBgǰ쯡C2eb;j۾[%q3Ϸ֭[5a:t(-[h۶mej(/{uK,q5d9^ `bhZ}JS˽zI2\<A6ļƝ9sƽ'K\qVx8 (9s*5ﯿrXk? KYGmX"�#`6i$fmڴIѮ[]T_|Ee+Tʕ+ 7ܠ>:e@�@�@�@�@�@�@�@�@�x O(!� � � � � � � � � � � � � �z>Dk`AѣzY Ǻӎ;4}tkرӧOvaaae 1^ҥ7o;u_Dki 7vnf[bſ{G~luRs?s )[6'Qٴo^ 4С>͛7Ͽ)I,qjJ N㹚Xj=,@\iH'!KaƵוoy D{_>쳪VN~=2dEy1lڴiW.ߟ%  mR\_sl? VeAV?S9ru[H@?lDJce  � � � � � � � � � P+P4C�@�@�@�@�@�@�@�@�@�@�@�@�@�')-Y eTԺԦT+sɔ)ɣB ᆱҥKk͚59r J6kkar1ȑC>h}bŊi3gvСt׻( >KeM|:1Fx;zhA.0~6&!L˂z!UZ5$B~ h%!PÏykѢ 90a5y)={t5/fZPrY?@�kS͚5]m[5yd~}Β%*U~WR-+V 2Du@�@�@�@�@�@�@�@�@�j(XA�@�@�@�@�@�@�@�@�@�@�@�@�@�$ Z|֎RɒR۶5NQ ,xAO{ァ9sիΝ;@`- ?0`4hz؂~g 8е3f (O}%sv> [u;#[=z|<D}ӧO`ߨ+ЩSh>_-yaeB[/O:B/^Bjn46uT}ʕ+8ӧk޽{k={/B#8gu߾}Vz)eϞ=o~ %EDD(88X}[ 9K<xJ(!s۳gXv&N( ҥko?MO>DGqc;մiS<~MYfUԬYIqW_Պ+|$lO _>yYysylҍ7{H^N$SkXt5Vd2g}lǏ7|Bh%6@ 1)"Y_N8~o[_~}vp@F+W]-(Ӫ]-$� � � � � � � � � �Z@�@�@�@�@�@�@�@�@�@�@�@�@�@�O`2idii.lY}{_wRnX,4tҪ\z/-ZHÇc=^{ͅ/EcƌoUB@V2etСX1:w<Zn]Ծ==O?7n8 2 傾,a%j_5vX +_}^~e/_^�eO8eٟ7-}s—<᭚EF;wngiA7Z;ȂsϺދª&MbŊ^Z Э3g&f`feahecǎᥴ^`(f{^kջwo. /4o<YЗiYPvڹI&iذaZr瞷v Z~ 1{;ez.En͛wAeNЊ9Z /8J2Z{ tg1yyWd^,F/[nqynͅ?54#GϞVZFf6�$ U ׺u\]罃&Eusի+j` � � � � � � � � �)[ ){@�@�@�@�@�@�@ػ8aزg.]DDY~ԯJRRI &K%RI(ʾ}|?3Yfx{>3e@�@�@�@�@�@�B,Hk)_>yˤVtiJeAO.%K$IYhͿZ( ]iذ :{G4zh(eʔ.|ԨQ.tkǎʖ-[exU,\`ƎiYe]l6N ֢E Yس>wyկxecTD^lASe˖iӦ¥&MÇk̙~ p7 -@bŊnv̙]ב#G\@; ʑ#[n>}F:xa>sTzue͚U7nԁzSvi&7/񩧞{Y`y𫯾^nZ:uB֯_ϟj5i}Gn  {Y05 Q X`vYBL=~#y畼&,LwITPЭ<iB,dϦSk%^,HƮ16xy;w2eʤoVUV|1@�ضm[-Mkve[6= &`ɾ}~^ֳ,~"� � � � � �D}`]?&RA�bL`~yS޿?cl7qp@A!� � � � � � � � � � � � � �Ql*eHy_/=6IeDQ,ߴ+q\ݣ`ALQitҩ]v_^ikܸq ^z%.`ѢE>|dQnZV(8ô&O´ϯxsrhiYx[CΜ9#zӧOkժUHֹ4 uq vw;9q ,;zeAZԩg^ 0yJ*.8p `3 ovy+_;%KՠAy睮oƅlY57o޼J ۟R9`aZtdĉ]gBzw픆 }Wwkː!;cǎԩSC 6{l%JH+Wi'%Û-[̅Z֧~޽{feexBxD�@�@�@�@�@�@�@�@�_ @�@�@�@�@�@�@�@�@�@�@�@�@�@�k xɯ B,,hixYB>}<xPӧu9;͘1C;vХ!L7Svum/\r7M6d#G@ n{5uԈ7:-ɂ%K]m"/Az+Wp J&MB UX1\R֭STpɬYXڵk:uj-]*kͲXZ8Tǎ]jYրTBYȚ6uiXX>C3g,|aÆ{\׶m܊v̻ty#|gS]vU"E|BJ aä'w^HUJ< 'ϭpeሷ:eA3WnJl�@LTn]7he}uy eSҥd4@�@�@�@�@�@�@�@�@�W7#� � � � � � � � � � � � � �8qBg_uHYJ/ %M"y9=1BVM^X5Յw֤If5iD.\P~ܣ^YnJ>[jGbŊ.͛'zĉ]Av\ TwkgOV3<J*]s^ L^=|C$5 P2 ?,mjE=I<;悵.o7o|+^*UAMO$JH|>Yֿ5{X�ٗ_~) 駟ԬY3Wmdɒ+8y{aAZiӦil>]{i*P!]+omv , @=L!�Yf-$~kV״iܽ}r͗/Zh~[^� � � � � � � � � >'E � � � � � � � � � � � � � ^f̐ڴ`$wRdKIcJ (q 2De˖uG? x饗d,O?+zȑ @k_Uԩ=W z޽kuiـ\C=柰43ǫ8{Μ9sEnt/B/9[7H \'N8"8kΜ9.X,K,zwtRr-ҺV}\ճgHc_`zfYV]`װaC/g W޿vOzq{dcŊnLsB2eJB|~,wXYfys‚hĖbi w w "ǮקNRZ"/ 2dB]Ӯ]\p7 K:tHT}K,Ish@4@�@�@�@�@�@�@�@�@� P˷ � � � � � � � � � � � � � M!)gNvmyCݻo|0,X&MݫAiɒ% {'bM4:thK1BiӦunN}u/}Ν;|{yWC\"- ךM8Aŋk4R;w (9rѣًǏCJ ղ+kk֬ӼĴ(ɓOy Q~w\@ً/_zak\=zpSYfu.h˶}Hbǎn=ZͩR_p/'P˖-]h~M?,!M4] --k&P4 낗cZtT\9)RD2erljժݻ{L2k>XؚYXKG!vI wH%JH?˅x4i,Hi �.-[65jH $=x֭[QFrZl{# B C@.!� � � � � � � � �ĭ�Zq@�@�@�@�@�@�@�@�@�@� h��@�IDAT@�@�@�@& $ ,uT#X蒴hR7y,o+­N:B:wسgZh! fUty Ј._daJl=)eʔʜ9{=/, t ^2s !4rH73F5}tmig5̙3N{~y{7eQ/^Գ>e˺@^Mƌ/_=w#lk׮]ʐ! ^z0۰p*^ 5{\8V~zׯ9nvq^{d6f N:B>SYÔ)SԶm[ܹsլY-7<yriF=kԨB ]v᫹G Vڵ{neݻwwtȐ!6,X@hټ'NO>֭wZ8zar^fEq)zscR|R:Ra3]W~y|;/k@�ȟ??W $ԯ_?w;~xiyq}#o� � � � � � � � � p+A? nGE�@�@�@�@�@�@�@�@�@�@�@�@�@�bHiyDҏ?JɒIM Vbh1CԪU+͞=uvuKeBY;{Uɓ' 2Җ-QozY0M?³RHi# ںu 6 i7nޏA.oYȃ%J(b9%iҤ.4,qW}??.,o޼J*U~޽{U@uŅu=Kf͒ Q^@]7uBj֬ s@�{- ,YH]+T1Y - 7 gҴV-, jX @�@�@�@�@�@ |p&N죋1L @/e$͙i<@xr& � � � � � � � � � � � � �,}>D RRRaZ:˗I&pႾk)S_u׫'HE]Nfʹ`XB!DWKڷokFU- xW襗g__yxW[y �*`vh[vh7ovù;Tr)_|:L@Dj � � � � � �\@x` WjJp% � � � � � � � � � � � � � sH++&-+͛'YҴiR˖5j(UXQyղeӊҪUa5i$30pV|%iq`H~vRǎҋ/JEH}wX� _*U|I/u6mڤݻwz^ݷXh%KYh\-"� � � � � � � � �#;P  � � � � � � � � � � � � �w ꄅ$K&= |9{~i1 h̙ʘ1c` .FQn]/`mNm zWVΝuEլY+1Wk׮UD^Pɒ%</- ٳ^ϼpj0n N<N87;g @<Ȝ94i&ItѢE?^~e?~\)ST TJUV .ĉ3-� � � � � � � � �ܜ�Z7V � � � � � � � � � � � � � 6h}{/>HjTBmڴ:=Ղ y9P^MԁZx0j(.?Ț5k cpܹs]0ڌ3{kG >|{ϛy!*sx)O]\J6zu^ʀk I 5^l?t+V_~Ѽy烅l%MlUZU6m @�@�@�@�@�@�@�@�@JP]99 � � � � � � � � � � � � � @ 8!M}߼eyDjVʛ7fM'0aԢtD_ H&OS1 C?ҫwzסձs8 @|Xj,8q$I/|U¸*T@V|}\縇>}h߾}׹wPѢKԉ� � � � � � >8}t"0G�M`~)S&ij[ $@�@�@�@�@�@�@�@�@�@�@�@�@�@�w?d:t#~n'L+={ ;uT-ZH?O8)RsggF}gJ~PJ!!ճ(!�S… SN/k.[|x_9s5jx!_~Z`Ο?O6 � � � � � � � � Ż�@�@�@�@�@�@�@�@�@�@�@�@�@�b\qi鮻ҥ}; {&2A� C ءK 6 ZyZϧ+mP/,*V<ŋ|p� pWv4vXwZz~m/1J*)]tjР I � � � � � � � � ? OGZ@�@�@�@�@�@�@�@�@�@�@�@�@�3KYΝ"E_~;u ~6 Y Ժ6-¢<y/_޽{G_-34kJ(XK[K;v@ z ,'x GW^QbżߥM63fظ'z 7@�@�@�@�@�@�@�@�@B9 � � � � � � � � � � � � �RRR2҂RҮ]R>BE}2jF;j,CWܹR> zNaQ< @4 {.]hԩ:tFPA7nT۶m%KNݽY:{l4WAw � � � � � � � � @ @�@�@�@�@�@�@�@�@�@�@�@�@�XDj^ޗKwX1i|鯿BBf N%()J3fhҥz\HVI}HIgRhh �D@ppF\Y{֯^IT|y/qj֬t|-[D׮@�@�@�@�@�@�@�@�3⌞#� � � � � � � � � � � � � ǏvdIlYiBץ]BB*U128sFJ?j0׽EZTtiH7IH='m 5h =T/񆀁"�ܤ@4iԸqc >\6mҺukڵrέ… {3iΜ9nM@�@�@�@�@�@�@�@�@�8 P+1 � � � � � � � � � � � � �+_ғOJٲvD _+Ҧ߱Q XՄc Hї.]Yf^𥲨XȘQ^ RtR*RӦa׭X+!�@O~yiڴiY&Mի+C j޼ƍ`)@�@�@�@�@�@�@�@�@p)E�@�@�@�@�@�@�@�@�@�@�@�@�@�[8wNޗKÆIIOG[ꚍ!slڷOںUڼY3F:rD:> n{VA;t;v -*RnR3H={JSl� cI&Uݺu4dYFSNՔ)S#j+W QFʝ;r@�@�@�@�@�@�@�@�@�0x' � � � � � � � � � � � � � 5oF>(,AZknBbDSOIuoaoWkɓKe^m R`׮]ꫯe__SGwoO~v }TA� ʦn^ZÇ?S^ԥK/^k5iD%JQ" � � � � � � � �e@�@�@�@�@�@�@�@�@�@�@�@�@�_ 44,4Q#)wn㏥-[oj&L5Y3ڴR,H+0_VNMtGGÆ StԼy>ర Vžy3D� !!!J+?^Џ? *hȑɗ/y-^8c � � � � � � � � @d"{ @�@�@�@�@�@�@�@�@�@�@�@�@�x-p;RR:7NڶMOʞ=^0xHL% Y=Dq%pK@Kk%%I$`{wߕKʓ'Z֠fOMq �~ 8qb:>|vܩ竑<a+WNrRnݴd? %"� � � � � � � � @ G1!� � � � � � � � � � � � � p˗KmJٲI{wXܹCI`@ <NΟjՊz9KFӾ}\VT^ <Y1#,زX1gCg T�  J*魷͛]V5i$-[VyՋ/+W @�@�@�@�@�@�@�@�N@; @�@�@�@�@�@�@�@�@�@�@�@�@ =*;v[*UJK#% *)r}&-5kX[p>T՗17Fu*gΜqW{Fj֔,r0ix)_>i`9?"�@ҥohӦMZx7ncǪxn0`mc8@�@�@�@�@�@�@�@�2@�@�@�@�@�@�@�@�@�@�@�@�@�oT4rc//%l)e ͜)\)u(L} Хdp :u.�3fCq] Gx о~HݻKEJSP(@ʔ)zK[nܹsUR% 82jԨQFP" � � � � � � � ��ZvĨ@�@�@�@�@�@�@�@�@�@�@�@�@�+'҅ /]zQ)Gw´6lFޗ_}"w%U Y̥-4T]9<1c(}W/C @TKkHw)Tb_@�|\ ((HUT|ݻw{;~tyA9sfG5o<!� � � � � � � � ? \T:"� � � � � � � � � � � � � ڵaaZ;vY#}\ΝƏ*UJ- l7ߔrߺ<C{Nx1rfh%`Z-ZPD|0A>ϗJ:tP2 _=\Æ 5qD U*0`9_LD�@�@�@�@�@�@�@�@Ci � � � � � � � � � � � � �\K±ʗΟ[3JIfj%e,͞-X!o/%KvYx#kA3ϋb[`ҥZ%�n:wh \H3i4y&oHg @ 'В%KrJկ_ l~S9rPfͼ=_>i � � � � � � � � Muhl� � � � � � � � � � � � � @\ ̛'}t´%/FٲI 6mZV-fDu&%LwDRzѿz5 &(O<*S̭u p@PB뤮]5 U� @ -ZT Ү]4j(ݻW5jPB{z@�@�@�@�@�@�@�@�@� P:X @�@�@�@�@�@�@�@�@�@�@�@�@�_vmi…+ Sھ]z )g+a$ж$I؈Νj X&NM`>*<ԫnTԼTdLY �%Ļ!oٲy ѣgϮΝ;k5^� � � � � � � � �1#@V̸+ � � � � � � � � � � � � �1"Ktwqlt՗3@HJ1lTAAR6B2i&5k̿B@lgIK o(WNjFڹO@ �~/Ppa :٩~iԩʟ?\hߏ � � � � � � � � @ s� � � � � � � � � � � � � @ .j%] ^k 2@x)´BBid?)S(Sti #@씛7O+i|@woI?"�@ԩOkݺu8q٣˫Fzl� � � � � � � � �1#3+ � � � � � � � � � � � � @|8w?cǎE<8qBON:ӧO_xY]m:.^ ^ϯ6ώG„ K)yŸ+qW%KIɓ+EWL)S}MRrzoH=z\ڒGaäW^Woǚ}v7m۶Mw֡Cta&Mwm۶^ٳq]G`sD"v>K q=ϐ!rᦜ9s0$I2O߫~>]#!MJ HKK}$ԺuXa !�ݨQ#7-X@ P:uTLKB@�@�@�@�@�@�@�@�\@8?� � � � � � � � � � � � �T<xP`cN6GMfB,+f!UN]LeS2ezca6VGx=F<<,CCC#p]-t>-˂xΜ9eA`6ΣGF 44ɓ,,|+M4J6md>ӧOɓ+iҤ <٣W ЊO"5o~^#vZZ*bZz6nεȞ={D߮xAwTX+³:eqs;fݾۧ;vh3gVUP!.\MEqתxR`޽Zt^~+2bM2^zQyԶ4dRʱV;B�@@+VɓrJ/豿@Kvkժ � � � � � � � �s#� � � � � � � � � � � � @P) ٽ{ßk[fA26YL],*]t.-ɂ㎈@( @TR]hAZG|je![Ǐ??"q˖-вyǡfaZg7}JR<Ev[Be˖D9s&W|ic^ߞsyY͛7kѢE]XɓWw}*PΩ9r)YdW'o[nvkݴi&Y/pNrELwu햋f̘F~X=%#xmF_Kfܹͤo@w+/Rz{GժUe4@�@�@�@�@�@�@�@�jΨ@�@�@�@�@�@�@�@�@�@�@�@�@ @>[FLcǎi׮]:{l-nS̙ݔKR([ ʘ1cc]Vʔ)# $MT6፶'兜z!dGuArf?g{-Y :)-y^V6eϞMow!@hF ߊ͜9S?~gwk}]ڵk2eʸ 0-_PP>5tW BO-^Mo J$*UڵkTR+:'3f͚,P�#]rk4uԭTԹ:}N*A�|… 뫯 w-Zxaﰁ/@�@�@�@�@�@�@�@�@R.9 � � � � � � � � � � � � ϟ͛qF7mڴI6-[#H& Mʑ#PHjՊVʚ5dɢ 2렗,}eayWA^uiܔ'O… .gڹsgdjzɒ%ڶmNZZt+ۇM<_| {M0Mfi]ydnemxa:u"m9s渠AG:{YfY%J~|xbZvi 'խ+ &#}ԯRtȩ @J,ӧ{]]~罐ľV. � � � � � � � � @ z-[@�@�@�@�@�@�@�@�@�@�@�@�@�8|VZ妵kjݺunsι^SJ~daHt)gΜ@-Q 8p@[nuZdAmmԩSnS 9` . *EQu|tA=ZǏעE6mZYTƍUzFٟ\RӦMĉtRYx]FԺukUV-%۷owgώ �^tZ}w   XPȑ#ճgOeʔI|K}FqٱCvkkaѢ. � � � � � <P$ŋ|$�4gTj7:GHVtj � � � � � � � � � � � � pO+VW={\OI&w+|p 2X ]viYۆ ty6 *^xdk5|p"8qb5mT͚5BYj)QD9}/P;M6 .nJ-[ѣG GYW׮ԩ}Io%^4>0v@� އҘ1cԾ}{ 8PSrlj}@'f � � � � � @ p!@� u@cK@�@�@�@�@�@�@�@�@�@�@�@�@N8˗  S.\ β`bŊhѢ*Trʥ ~X8w Zzl8,p˂$Iwu'{_[-p,mĉ߿O)SF:tP͕2eMlٲe9r>sw޴mV/g~=f]tٳgoVHU p-3$4֚5RNR^Rtڂe �Č?,yѺcfG>+Z>z`,.@�@�@�@�@�@�x&@V<; Z@?|7)["� � � � � � � � � � � � �\K²~7-\M ʘ1J*=/^\S„  DE]Zٳg])Yp}:v *Y*T˻9r\9Tŋ?~^}U/pex}'C3`zʂz衜9sJ1Es>C 3jL>XzeiذP- nh �Ě@ڵb uYռ^^K/D�yv� � � � � � � � @ z-vǞ@�@�@�@�@�@�@�@�@�@�@�@�@�?ZrΝyi߾}J2J.rʩlٲnʞ={`"0*.bÆ Zx,\?Й3g+W.URMիWW<y.ۚ.`;B{jA,X,nz7c=ٳ ɂ(;ӤIzK:t-X|YkI wnKS @ Xp_Z`= ԡFkСӧ3KˇSѢָ  � � � � � @ <PMG/cN@�ؿ_ʔI3GZ5z/$/e � � � � � � � � � � � � @t ٳGFrA2YdQ%+Az饗l29rDgv!)M4aZ}ϗ?~w <X .ѣG5|uQRnݔ7o^#n_W|͎ۣ>j7ۗ/_\}ӺwFĉծ];^Z *;-7oެǏxq\ G�HZ딼Zj@][^btN �\@͵dm߾݅_7fM@�@�@�@�@�@�@�@�y|Q  � � � � � � � � � � � �}/mΚ5}Y9sF BٵkƏzJ%KT„ }|jA $IJ*{2e< SNںuZn3f͚zwiӦ8'O?hѢ1c&LYfXb[g$(Q"2n:U^] 6T۶m?Rq+dz?B}"ssK_}%Xy}bn� wq l}0UXNy:F�@�@�@�@�@�@�@�@� P?U#� � � � � � � � � � � � @, X(HϞ=U@y睚8qj׮yiO< bU H J.{N?:ɓ'H"z7o^7Ԗ-[c~8PGuuAO6m#3gάѣGйSǵkG_՛#GH¯X>ʕŋO?^ʟ_>۞@�UԩS~=ܣZji%#� � � � � � � � @�@�@�@�@�@�@�@�@�@�@�@�@<dɒ*Qf̘:hÆ ${S~,,Y2{.LkZlիO>DyQ5\ɓ'xU/Ez4b7NiӦAiw|;wߌd^CC� Z֭}V^Tـ2C�1o2cƌQ&M˗/ )@�@�@�@�@�@�@�@�nT@c}@�@�@�@�@�@�@�@�@�@�@�@�hm*{.PQFPE[nʛ7o@!kj׷o_YF/vw]vu稝E9 jܸO~I۷UfͪYfN:[;W]fZ�e||*A�H\;,X˛ՃJw--]{O@�" $H@jժkΝW � � � � � � � ��Z~u(@�@�@�@�@�@�@�@�@�@�@�@�bJ`.t:t萾[mܸQz"$wu_>tPt?~=Zz &pEjJ .̙3Ujۄ1$$I}j޼,B}mݺUs2Q [6ihya-+=h ]!� p 3fyF<Ν;w� � � � � � � � � @?%jD�@�@�@�@�@�@�@�@�@�@�@�@�{W5jP\\(iթSGAAA1_:F�H8Zh_~EN<bŊm۶ڽ{w̖zSjʔ)*UTe} 裏Tvm5lv.f͚5#Ĺ}FKLJ=( #:K�@��H,&Nkתo߾<R� � � � � � � � @` Ǘ!� � � � � � � � � � � � @gΜQUD KNk֬ш#T�~#P\9M4I .֭[9<tP|P +߿ J*b񲦄 jرJ6}Q58ps@-=D@4k&/Vze;ƌ+g' �Po;CxH@�@�@�@�@�@�@�@�{2�@�@�@�@�@�@�@�@�@�@�@�@�Q׫toO?iܸqʓ'ύvH`Ν6lׯrsU׮]U`,m̙3]0^>}TN:t.\;{UرczU|yw}uԩ+믿*UҥKXVgJJ}f̘jw1޽{]3gG I }ȻFJ^% @�ْ%K"� � � � � � � � @ t� � � � � � � � � � � � �&0|RhQ-_\ժUhCtgh;v~!::l˖-5j֮]/k-[ԟ'OziӦ q /n: 4z M6m«ͫ~MZ믿iӧOiYۤIT@۷oㅽ~a+xbtt}9r@Lȑԩʕ �*޽{kt� � � � � � � � @;@�@�@�@�@�@�@�@�@�@�@�@�|@?PccRHUV RfM]p!Z6sLEwr35ZxM۶mGQ%nza,Y4k,*THk֞={ðmCH˗/玾K~z7NY#FD ܹnhB2dPvG.lƌ1-yQ}ڴio6F�(^\wɻJ JLǏX @ {ʕ+ *3 � � � � � � � �܌�Z76 � � � � � � � � � � � � wOV][owK/fϞ)dfkߺuZlm\ul & "}8Ljĉkĉ QvXٗ ܹS .RJ%n$H2#N+��@�IDATg9rP BCCo>:yd=.bf4=)Д-[V_u4}X]'O}@_I (>PYi �D<SFK_t� � � � � � � � �'@VY'@�@�@�@�@�@�@�@�@�@�@�@�C>HwְaⰊzի^5kLݺus+;vLcǎUÆ qF[*UrX"Rg ,s=Uа)SD,?rI&} 2Dsڶm={DwO&M-Zz|IM>mj3,k?z>|X#GTVTL6[vy׍7h֭v5~uɒ%nj4;ƒix Kۅ w߹ 4/<*Gٳz7eb-k֬k޽Vٿ^z%w}:·?߽Wlׯ_vcxbZ~{͙3* VjbX;}Q޶넅/Yzcw}5Ǯv^XD JlڴCvrǵXOׯi]7׬YݻG̷`-ۿ]ow)Lh"=EZj_~no?%IlDg6lzHz dIi7C�o w@�@�@�@�@�@�@�@�U[@�@�@�@�@�@�@�@�@�@�@�@�@�?~ @J6ϕkaN4m4caU/ * Yrʗ/n&Nֵys֯*UO>#uEPj*(P&Y X^ZEщ'\А.]o8 nZnRH–l?uq_vZ=cJ,Ƴi&EׯW tq=Z<>s޶mtA󐗪ЩS'Y�piF9s"GejdX\9Y荹*TH< ر+Fm!!!‡NꂬDlr 5{?u]5_?i5jPѢE]ؕYGYۼyj׮ի,?v ˑ#=UzuպukZl{_-\&M/Kڵ[~+V̍׮1CCRܶJҤIo6@ٵʮG ˗]vW{& +X leW;3fԠAdO˖-5|pwXaT ˞={T^1?44T>\r�KWڵ,,B?l]^t>/\ ߳,WڹsȒrh uK Ws?wfhfkc,CÌ)0b,ome60aFQY"Q$Ѣ~;n<{,yӹZ)W6 peЀC @jIGte5GD� @� @� @� @@YZeL @� @� @� @� @� @�(n)ɓ'g2իWφMs)D+8@+23ҥK#լY3RhҒ%K"ŤB9ls“RWf^ȶG ZjTV- ܹ袋pt~ dMPp^ϟ??{, +)$* &ޤƝ_x}R{͛7Yۏ5n4K ڵ늛 SU>>`mVpZV=zt\{g u]@tW,v[3|']|I>NS),fCf{/%RIc)l[o#Gf˵]2#k] R(oV)*hP—v?H!\3J߻ロ]2w9d+v={vpBM{R.}nݺeH|] &Ka[lE~w,ӵZxqv-ֳ.Pk=F l]^# 4)rgJb @;B� @� @� @� @@Z~j @� @� @� @� @� @�XM74fΜ Й[mUr_*f̘AoW wJǦiRISU wIAH)|+SfN:b)D*}7|SpVRg};S<Y()i)*_R)/KM7Ǐ_il-ZO_)kwΖ6Vl/mM˵s׵; ^|ѪU/yXJa˖-o= [nA+)(+$ˎ;Xs.u"㫯#<3dz'G۶m~YO>e˖ѤI?lmJ[ouR)5,C?g??2429ڵkX8SC=}W}޻v?oOis޻C B>_sHtIt/>?wMˋ/8Movl61eʔXpJ7׿ºg1#簤J KVZ%zer]ND@#|3"(Ѯ\~B�,SI( @� @� @� @�rH  @� @� @� @� @� @� N?}3 J!e?Oǭnm<ckb֭`ٳggլY3.wqGpk<?3EY;&McoҬYꪫbœV J}C ϪmE1]6wl…Ν5ZrBT1q71rȬK0aBoMm.'hѢcm״2}H�e)?,{رcA3fLe+~)0Vgޯ=z^? c -ʲK.q7g5~xG/KFK3uKb1X!@@H('pĈNHLCSO @� @� @� @� @@ *1Z  @� @� @� @� @� @� PN=Ԙ2eJr-eiXdɒmߎ>:̙}Ç:BZRV*=P`ri~{XUhCcq]w< 6,8∕ZZ1*#CfsJsK`RVl(t]\SlI;=tl~_ay~z�tc…&ָ[n^q͋O?[ۋ8iQ*?l?iq4W޽{|;\2R֪%xkiܸq>(R݊%LҼy7{RIsسgϨW^΋^zeٶ'5S PQr9q啑 `9rՈ}=ؼ @� @� @� @� @�[@VfO� @� @� @� @� @� @i&0`@1;Ȥ15k,ᄌ;G}1Ae\KH!G{^ϝ;7[.[6w)|IW ڵk<1k֬TƒRyᇳ0ѤIl[_QƖocm1ByR/eC /[SIף]vgk:60ڵkǦn_|Eg?iӦl[J۶m~ƛoYph/~,`*+k6rMW_TS\>d;-NѢESSIT./Rs9] ˷ /tȑ#N:WY /R@V|Yk ,&MZ}SKtqt?vw#@@Y=mHؙIկ"f,k#5 @� @� @� @� @� !z%@� @� @� @� @� @� @\ *guV>̌}Ȑ!YHUP>$;J{dz):mˇA 80z8s)SV*+FM<9gˢHaY7xcvh ѣGlѨQl[ IL)OSA<i~pxGbԨQ I|JCHm#R8ε^5Xc|bwM6$ 5KK/ͺx'#o6]?ӑtn馨VZmvzw\}ّw).SL/>l[ZN;- ٳg\tEߞ{.ħ~]ϏyLﹴ=ԠA5]RqUWE .K<} JD+џx,S->:mO4n!RU*>w^4nxf; /}Ƌ/}f+>{uޑ=%_ ^qn-VZXk�eQ N_{-rϙG\ieqjD� @� @� @� @� m@� @� @� @� @� @� @@Kk:*8,<R{Ж3<3<ȕbRxU ҪUV<sQF . 7o)\%{7zxgwͅ >eǦpuI'ń m?ϢZ),+LB]RIN6'|rw J!a) 'Йg!0)8*}Ĉٹĕ/:u.]믿~x߷LWcǎnݺY_<S1hРhڴilg^{$nݺwÇBR:u]YYIad򗿌g}ɮc?f̘l۱ӧOBtgar;wH?ώO~H!@Omĉ5NmzY0ѣgwa4wJG K.,x,Q<ӳX馛fjI><}}yutSW*?|qA|)*`׿},]v:ŋ=ܓv8P_^; yi}իW^yeFi6x2 @: 5;6r{Ή=6eױ! @� @� @� @� @�9*?YVFe@ @� @� @� @� @� @�(a#G澈Yhu]rH SK kIPӦMm& ݫWHN) i޼yѰaH4EE)*fz]NUݠ ,ڵk5k֌6[դI}sY)hi|&O[^eVz6tƘW]ƍe|pYڟJږƔ淾A6EqL0V[}k GR)$,m6 4+Yk?jk뵷PG$;# KF)))'{n{;~rV жyi%CS�\ ={v|7Y^>@117<;6d{ ᥠ²Vn,oƌemhC@ȅFw_O#rEpD�$5ks-k{.kWEsaצ @� @� @�*G=tq,]ϫW}%D_(F7z:$@� @� @� @� @� @� @@y7ވk69,0K.}g.`TڵkWh<SXIO+?U^=R-JI'pZ=묳"ҢEB_]֪S.46md/xG ;4۞1bZMW74WT܎~ѵk m[z W}JhC R]tQPk&[,!M%4ri?x~+D +>Ck߭O?ժU} y[ȋXڨQ">R!d+v~c{gY鞵1  PZވ?]q܈/OϬI\  @� @� @� @� @�_h Ui @� @� @� @� @� @�@ڵϏc=6 ?яcǎ~2}č?z6mZ4k֬Dznذa{km;f9蠃CkB:uָ$wǒ4ؘm?quŗ_~ 838Hbʆ ?vm8unxey}ᇳe] ȥ3 *ȅFsNDgg OX� @� @� @� @� PjUh @� @� @� @� @� @�l[lp駟վ}fa[:uڠ%K#GN?N>}Osk<VZqG񘲰[njY-űu\/ryYS ;S㤓NUTu8n7~:O>d4h`Z(!CcSN9H!eW PG0Ȉ믏o\xn~QJu @� @� @� @� @� a;� @� @� @� @� @� @�G }ԩS㪫ܳN;W_}uL<yMZjc̙_ij>{h@Y5jT7m^{|I5q0`0X;v#Fć~{G,4]W\GuTX@ڑ ?>r m^Zy @� @� @� @� @�@; @� @� @� @� @� @�ePvcܸqѫWb뭷nݺ~x뭷J|5kB2,^8}ٱF.]駟~ewO>d|Q?N:Ht|G7F @;, =!@� 4oqo�Έ|'?4m8� @� @� @� @� @` Kg' @� @� @� @� @� @�ʡ@ K`7s<;Sh";2dH̘1ΐ Id;3<hڴi3^|8bĉ1r0`@legЕh$-[B9CcYfU"?׹sxbqꩧnA�D >cõ:v8 4  @� @� @� @� @@UA.i @� @� @� @� @� @� P]v.,F~aKϏO?4?,gvO?='|Rr,Ľޛfm6ѦM8sJ*qg_~9ۖ+/Pv[sa$3<۷o9,YR@#?~|tA(~ĨQb=@34GY>bР[newD,]Zzc3 @� @� @� @� @j @� @� @� @� @� @�,[ǩO=T̚5+FrH,bh׮]7 ycѢEEn߁*yw\{qGF-m۶q)G}'xb92f̘C >}DӦM+A41cQGvZt=VIdR@s1q6lX:רQR.  PqjԈ8㌈ "\qݺE ^qlf @� @� @� @� @�"P 8  @� @� @� @� @� @� PVj֬={j W^_|1^~o~yԮ];v횅N/o}E`ܹoǛo̥ѣGŋe˖nYg{WAj*+<6l7pC.8p`G?w1?8ãjժcC&;uwqG4i$8餓FJ|Q @r"ܳI{G2##ݶĺ0 @� @� @� @� @j. @� @� @� @� @� @�@ Z1`+1nܸ,dkȑw)x(t1vaڹsr-J*ӽsl%KĉQFEN0!.]7o VZmd t)~xwK/޽{G۶mO}FӦM7`QO˖-#Fmݖ5o<rup QVr4C%@@!'# 0 rqᅑ{)3 @� @� @� @� @@yU @� @� @� @� @� @� Pnڷos1RoVDo㏳ՋoOa[o׮]ԭ[:x={v?>cǎ1cd5-\0 ~kӦMt%:lٵkfmdx7_~y 8098cc׻ rɓ;#R{wygDVf 2K @@w=G~0{袈_*of(ը  @� @� @� @� @�r',ẁ  @� @� @� @� @� @�UVN:e裏.ҬY[>GŲe˲-ZĶnm۶dRM͚5+h pӧ|?0[N81 њ9sfLjղX z;㬳޿)~E1@ ? !CBIn8 7n|pq0*SxTl=CY}עI&ӟ4~a*  P~r;YVz<" 馈kO @� @� @� @� @�ʫ@z匛� @� @� @� @� @� @� )Vfu Λ7/&LƍjZOuذa1mڴHHԩS'jhݺuL[nej*Zl ش .g>IlSN)SɓeڶpLz&C=4ڷoմF\Knݺqf5|zz^{k>.T/{.ƿ;vl(>O\rI>KFJH =.õ>;⠃"7k#߾:, @� @� @� @� @@& @� @� @� @� @� @� @@9H4]tobҤI$? ܚ>}z,ZgZoylYfjӦMeZ γRvΝ3gΌ3ft?䓬Sւ ^vڧ:z왅�6mdk)TK!P6`pCfaS^zi?7o{#vuy督-[, 9|WW^ov59\�˾{ *7 &⡇"^x!rfEc/=/oA� @� @� @� @� PUK%ئJ� @� @� @� @� @� @@HWm]VW7åKfK}QBRR>tiرz hZdJMl&YfmM4M7ݴ׍5*76lՋ*UԖ+ W_ŗ_~g._|E>k֬ϿUu7oJլY3 @Kin>dZT[l:*JS kxYM#Gs=Qx);ڷo;vsR%5;nj^LNN:~;Kc$@�k^瞈Ϗ .8?  @� @� @� @� @@1 *&H @� @� @� @� @� @� @ TZ56|΅3Ƥ3fD mJTW u7n\-?0tު%Y~hРAPLSN+׭[7ԩk2Uk5"QZ+n[q=lٲl)4,9z~E… UX`A̟??+sT,<+h͙3'[OǤ1ZW|Y ܹs:b5k, ITSB 讻Sh+oV\#HTRߖ[nYPSP\ˊ5W}"H>>ϫ~g2/-SOcԩ5+?MFN޽{GNY_yX @@HY}D'W^FrKUWEvXś @� @� @� @� @�JC@Vi� @� @� @� @� @� @�eP ۤTZR T ={vBU)T*He ɇN�LJaU Z>Mr8Kf),RO>8,-SX 4K!bp2RM@@eHYRIR͗d5a„8qbp5eʔl?,+` ->)4+wqf[:=rC|({QK"~ˈ[]ѭ[ @� @� @� @� @�ʓ@t� @� @� @� @� @� @�eLJ*Y T jmt)\+kp‚ڿܶ/,]`Yz IRVZիG͚5Wj^O!@djԨ;vja=7k֬,/ >Z3^W J5} P\b/q;ѧOeEhQC� @� @� @� @� @UE&@� @� @� @� @� @� @�RHaUXF:4#z.TrװaìVr '@�,OĐ!ѾYgEԩ; @� @� @� @� @@9Zo @� @� @� @� @� @� PI c$6M @�r#лwG\pAUWEl]}E,[Vn` @� @� @� @� @�RU� @� @� @� @� @� @� @`m= \#'@� P:kGw^ĸq_D{/xJ� @� @� @� @�(o3^ @� @� @� @� @� @�T2ŋ#>;w=*M� @ lywDFDݺ{qQ'0 @� @� @� @� @` ڨ:#@� @� @� @� @� @� @�u뙎'@� Pz;1|xģFzD\ץ7&= @� @� @� @� @�ʲ@|u� @� @� @� @� @� @�\`Μ/8Ԉ6m*9 @�K8w#.<vۈ;X\NǠ  @� @� @� @� @�%& Ph5L� @� @� @� @� @� @�*BRڒ  @�@g1aBO~_Et1bDI @� @� @� @� @�& P]!@� @� @� @� @� @� @�L`ʔ#.0Q#( @�ʿFpC;DhDrHnf@� @� @� @� @�PZ*| @� @� @� @� @� @�(Ϗh*_i^ @�JMcLj:4b„?bR  @� @� @� @� @�. P/ @� @� @� @� @� @� @#GFW\Qƪ{&@� P1/#_"ڵ馈ŋ+̂� @� @� @� @� .E˱ @� @� @� @� @� @� Q c(� @@ TqG{lD]D<t I @� @� @� @� @�RU*:%@� @� @� @� @� @� @�{,"#l'@� P6ꪈދ1#?w+\͈� @� @� @� @� :ZS� @� @� @� @� @� @�JE`∳ώ;GRN  @�@۶{sE̜E|ٚ5vl_c%@� @� @� @� @�eZe @� @� @� @� @� @�*FL1hP% @�XEgψ^Gh.#.\{y}F  @� @� @� @� @�ʺ@~� @� @� @� @� @� @�D/#.(׿hӦL4  @�Aj[!=6b^ѩS#|?1thҥ1z"@� @� @� @� @�Z*# @� @� @� @� @� @�*A�5E @� P^ĥFѣGG|{odIiETlYĂ?aC%@� @� @� @� @�Ze" @� @� @� @� @� @�*)G\xaDF]  @�^`-#/#.y爞=m`T"7믗o� @� @� @� @� Pjd @� @� @� @� @� @�ѪUD~|G� @zx饈oxeVnt![ @� @� @� @� @@yU1 @� @� @� @� @� @� @ qW\QF @�(fc JAZ#FDtR1w9 @� @� @� @� @@ *!X @� @� @� @� @� @� @@ c/"@� @ #@ddI]wE\v1 @� @� @� @� @@^h @� @� @� @� @� @� PQ{,"ߊ:C"@� P2)(eٲ#Zϋrc @� @� @� @� @�#Pt+ @� @� @�nQ��@�IDAT @� @� @�Tvŋ#>;w=* @�(F<HDzQ#Z۷oĈk? @� @� @� @� @�^Z� @� @� @� @� @� @�*-DL1thv0{ @�*3fDv;DVȑ/٪Rey…ky҈(W"ڼybΜ9:Ν,X/ s7dŹԯS]dcV +.W\_u_z]f͂ZVڵkG:uzݺu~Q^^ڠA^WI  @� @� @� @� PJX @� @� @� @� @� @� @#N=5MUzM� @6g5ª>\WbԨ1n\\m\(VX,rˈn>fٳgG J箮 <JRSnib­WR0֪aX *,+2ua^)+Яaaejsu%/ͻQFYmܸq^e&Mb6 V\6]5jI @� @� @� @� @�Bjc3 @� @� @� @� @� @�G82 @� B>N>=RM?ӬT?3ʡP)*]i6W9.>T$ j 6 T7d,D*ePPR_%�Z,,裏re2>,;wUլYh޼yE[d5· @� @� @� @� @ Bw @� @� @� @� @� @�lT)S"~Q\yehhv3 @�eJ`…1uԘ4iRV'ONaMi{ZΝ;`ժUdzc]wšRpS6,RVewU=* J2p3gf!gLhj-ZT\VhժUVrlٺuH7մkYД @� @� @� @� Pjg @� @� @� @� @� @�(||#fߴM  @�9sbܸq1qĘ0aBLN>=.]VfHaJ[mU.,RRmt˖-˂6mZuȑϟ_TlMm6ڵk-z @� @� @� @� @�r, P_<C'@� @� @� @� @� @� @@y}/|<?mReqy @�(T #Y;vlk MJjժѲe,)"~ѦMhݺuVSS:FUTMfK.NxƌYV >Ȃ^~2eJ,^w&Mvm:DNb_/� @� @� @� @�ZJ' @� @� @� @� @� @�*]TwމXhQ) @�T6sƨQߎz+[OAZg(RQǎp?[o>ڶmjժl\͚5Tweo´&Mƍj pK<LC֭ku9v;cV7nl @� @� @� @� @�eA@VY @� @� @� @� @� @� @�J c/q5o߈  @�,0o޼x7cȑY}btҨ_~.qQGeE:u͛)[^zk.xJ/b̘1{ѣsO<yv\֭cwj ޽{4jh6 @� @� @� @� @�! P4I� @� @� @� @� @� @�J&>;wvZm*ٛt  @�@`ʔ)'^z饬 ڬY֭['?ɖ]v6mD*U 4n8c8iӦooFq7y睗;tPpN:7V @� @� @� @� @G� @� @� @� @� @� @�J(p-'G 1?m[hQ%0e @�$?|<s1iҤ]vt=ǹeiB`ZlxϜ93^y啬|0̙3e;c� @� @� @� @�@. @� @� @� @� @� @�d_~qѦM5/&D� @` ,X F<LVhРA|ߍN:)ky督f͚u\:#PZM6^ze5aҥ; //bwSNBwo"-6lXZC/ @� @� @� @�T`Z @� @� @� @� @� @�ʂAK#\>՗i@pu� Pf͚?xV |MqG>KQ+X@ժUk׮Y=bٲe1jԨ׿>}D]gϞ89hժ՚� @� @� @� @�Q@VF� @� @� @� @� @� @�.0eJW\Ѩa-ZA� @_u<#1dȐH!Z׏^zŝw_NЖCTf*UD.]ڿ?~ ><zyWD w?O#MVf.s'@� @� @� @� @� ;� @� @� @� @� @� @�*pZECjԨXx6Z#@� P /R[駟-xO{޽{ *gMT^:uAcԩ'vu4hPl2??K.HfN� @� @� @� @�- PkH� @� @� @� @� @� @�k92⊈^z&= @�*p¸{{^{̙3ӧ_ytykQtkRJq5Ĕ)S zeZnm <8ꫵ7 @� @� @� @�  @� @� @� @� @� @� @D c}-Z @�@ Һ[]vqg|A<YOZ֡5 !UV}'瞘6mZ/jK/9slH%@� @� @� @� @�J" P\h$@� @� @� @� @� @� @x챈^oZFlŋ @�ExGCYPOcqee=E8!@&Mb@.ayq 7mڴ?dɒY @� @� @� @� Pj+h @� @� @� @� @� @�(c)'#zۃ^zQַml!@�X_qqe=gqFԫWo'KFH?QFW\.1z> @� @� @� @� @@U>Q @� @� @� @� @� @� @rK~@El}cѡCqw/[,~Aq; @ :4:wK.yu֭$7uHÆ N;ogΜzk+b7^V/fVZ򗿌1cD׮]#jvmk? @� @� @� @� PjUKn @� @� @� @� @� @�(9/SOhf/SRJ,^xfk2|4iR}1v2LFz+ y(2 @@ӟ?pպu 21cD^~Ln:ߏo9&Lo,s5kV1"z꩘;wnBĎ89rdY4j(g93<3=hV @� @� @� @� PjUi* @� @� @� @� @� @�(mA"&1pGRz"j;,Y5ڧOqA)MAaǏ1cDժ|..  @� *I'wqG\pY8kjLk ij>]tц6׵L~iEvVioXq.m]ׯ؆g͚5w]Y uQ3č7/  @� @� @� @�?@� @� @� @� @� @� @�"0eJ^Ѩњ\@??F˖-+h4W(7 š @\ L>=;,c)s(^yqGo;!햵V7c ;SN2w{Ʌ1W_}L` @� @� @� @� @^z&@� @� @� @� @� @� @�$pyZEY@Eł o1ҥK׿-Zd/+?>~ :1cFu]1lذfmw]4o޼`̙3s!_㭷ފM6$1tи;믏n!Fݻw{/;k׮ѷo8c…ٶ {.;'sSO}=P|0fϞۯ`>h駟Fnݲ6lX  @2 4({6<sԩS;Ȃׯ[:oC ƽ[<&M^z9S_dω?|7.vu7|Hϒy6=/>_o:yLZƖ:NP) v3u]K\x?8䓳Ela'Nb;j�mOQ"4EHBXR,5FdW2v Ňe$>elєHRYRwݮ-t<yuWgw!Cd];v:ĕW^=kviѢE.;)/{^x!n VZ)jce%%,%fR\׮]4vaqAE @� @� @� @� @�Z~ @� @� @� @� @� @� ~;#/ BewW!ь3Ѐ6( 9sft9뗅|YG}ݺuuYgghܸqf GSU*|Ii&>h׮]Ѷm,@{YրӦM˂RV JW) #ܧk=9{w\r%Y0¬YwޑKA]- 6,?d UVڦ\օ^j6z0裏FXf� `ҳ:+?LK.Ѻu8p`<sqQGeZ)+wߍ 6 {L~agɓ'ǭޚM#3~5jT|DZnEzLAUM ={v�5gΜ,L6Ʀp-E=.y ̜f,x6S8R :cb7_aLSX~vH:@Vv'wbZq]wڦ0FժU[W}]\رc1ƶ{fam fMd mޗRVzYf a @� @� @� @� @(: @� @� @� @� @� @�zE#CgP|,8jȑY(o)@ӧgYϏ]v%[o(SL�]?>믿Wޠ9=z> R }{W~faoVt)N8lp~*͛gA_~e/p v=D K(XRBٲe�ʕ+g\i^{YH½ޛ㏏>� |gM"2PLJ KmJz_7j( J!IoFB,))7MNNTrHxGgZj+_?z&]ƖYSPRX&MϞ3LSK7,av(+=KAUy)jeeץ%wޑRpzIAqrJ2y @� @� @� @� @� @� @� @� @� @� @� @xĵ./ʕwy'j׮)D WZlUV?8|n�JӦMw7n8f̘)*< JAXtI[ƺ)!:udVRL!Yi)$+W9 ,HWb5J*寧:5kO=Tu'gm .C=4nv|cB�XR�U*U⫯*V5FO<1Rߟ?<J =ǦܚR`:묓QgJu-d~i~?M*)p(WRTj?o޼ܮe.z&͝g^垣SXOu+j,ܹǙ۷< 70һF*=٦2tl<֒iH*i=VKw5J4͍� @� @� @� @�S@rBiF� @� @� @� @� @� @�?˗>}"8"b]~~|i{RXU },>׮|y1cvXJ:7EE /0~><ƎKO%w4e6vK/f)<뮻ʚvmYB sqń 8 G}ժU_ѣ}مM�X+gx'SҝwlI~[Ǔ)evAYӧgZjW_{gZ08ki]~n]Zz&͵+-9zi/mǹwϚœվ.k.o~I?S[lQҧb @� @� @� @� jD] @� @� @� @� @� @� @`m/bĈ+X1+faV'O;?eM7Ͷ6x|~_RJ[o>s΍/g 8p;#ӟsL|q5DJyO[l{A^X z"矏;fmgΜ)XpO M�X+z<Lf .]w5ܹsLwƐ!Cc OM%p>:u KgUQz&][r(j+ҮmSIז_z_W\~Ǐ[o5s� @� @� @� @�$Z~ @� @� @� @� @� @� f̈҈SN_źPBl&Ib'۱:;OOOA�[rXwuÇ?fX&M߷8 ի_�C=4z5?#n-|G#F/7|??? 5t8sr @�Z`ʞtƍ+)W^QVG'xKo=XզMQFvޜ9s{.,8X3i[.$j޼y+0ˆe.gט^L(ڶm[T:uIsY FӧO:;Uʦh: @� @� @� @� j4 @� @� @� @� @� @� @@WD^p@F Jc7tS|Y''N?0=` }uɂRPw|A|ٱ2mL<9ۗ+VN;- J! \rIղe˼N;eml9~lYe 'vm{GTV-:ꨂͳ3gf\`W 曳})(a]v^zz>h~ѯ_ٳgt9m @`mVZ_,|,85 ƴ/64{l_ z/s'Sy⩧;/}ݘ?~<7Qy9iӦegt~o6붨-9:ʳ>)(7.o)tInSYzOOSv_J;RXY!{np1,Ɩ[|ɿ IV䷲SL}7#B~UN&@� @� @� @� @�R! PTF @� @� @� @� @� @� @4)".("/jKcM7'|2&LcguVQ/8?>;u}`NQFe㏳{l;6~ѣ}ݺu>, J/ݻw4n8c/fv)p޽{4h vGvժU~1bĈl_.]wɂR`a1;p5ks= 旂&s+ @�\\rYi۶mEYҚ&I!Ui,zjwqqgFzn-XΝM6ڥgtGgMRl JT)T5CݐB\S"=#ҧOx7#=gT%-Z( ]3ivz6.jli,99_~9:v#m7j(4i= w! Me~Tвd3^mQԮ];)w-FfͲqg_kk R+<^pfcMA`i5;)V|9J?+*k;pqc 7믲k� @� @� @� @�J@ ۈ  @� @� @� @� @� @� @`M }?|QŠdvVZ_HOaXf>_0*s~ QFnr/S[n,0];}=W,Xt-χ߿\rL:5*VX?7nܸc)|?ח%-ܒ~a8@@)߿r)Ѽyp=Κ s)S�+ovuW[mU<k[Μ93RR5y&]v^ژĉ^zK[i:git?6`l+,%%KLZ{eץeI6e_z'JA_<@p9,HjՊ^z)k{|5+uޑqhPB� @� @� P:u%yҼGep+y~%J$+"P~EkK� @� @� @� @� @� @�#~i%Tʕ+༯Q Zl]waxlyvvcy´R)L+:ud%> @�e t5 fݻw4m4u~޴WNRSYs\ *Ux.ܾx' z_LZ7Px,vߑ|ׯmpŶm.it?:l{i?1oeLK+]vxWNl(|B+ıPkloqu;2`]� @� @� @� @�ָ% @� @� @� @� @� @� @@q+E~҇~<y/樂yGaVgiz @�tM^SN9%.,ԪsqYge![+=cڴiYSLYm٦7YgwD?qWm޼2۬븺Y {„ q7w[ne?=l @� @� @� @� @�j-a� @� @� @� @� @� @�xɈW^x㍢Z-X֭cԨQn @�1dȐWꫯ뮻Ɖ'!T3WAřg]`ѭ[ꪫVZ+iRRرcqbf,t_8l. $8q/X ~{LfAZeʔY#@� @� @� @� @� Z @� @� @� @� @� @�,M ѧOGDZ-/xjE� @`{g:vظ[⬳Ί={fZ]tVZE {w 6lW^}m%O}]=[hQ1`cܹYy);Ot� @� @� @� @�,A`%\. @� @� @� @� @� @�(YEL1hP @�[mU\wuqUWSO=?}zhn:T@*W*K}]~.K[~'G}4N-[/</Xo? @� @� @� @�XNZ  @� @� @� @� @� @�f3".4S#_%̝� @ TX1?N>=xGcǎQLhժUk.ڴi 6,1>BO?^x!?|̞=;ZhzN:E:u8 � @� @� @� @�J@}� @� @� @� @� @� @�E+"~1 V\� @J^zt-s̉{.~"ԼM74w{c= @IW__~9 3fLlߗn!ڷo5k,4~ @� @� @� @�(f 1 @� @� @� @� @� @�7I"W^G @�(UV;,i#G ~z̜93ԩ-[v-vuh֬YTXDנ ,… cԨQod5i;6*W=ҥK~N;Er喷[ @� @� @� @� @ Za2' @� @� @� @� @� @� @`8܈u#z\m @�[qƑj^" ><^z:th\q_DJbv͛ǎ;oc}t:J-Zq;ߎٳgGٲefr7tSj*;Pz5̌� @� @� @� @�Y @� @� @� @� @� @� @ }W=?#*T(F3 @�+Q\rYhV ʕǰa⭷]ws΍ʕ+GFI&Ѵiljժ;Ւ@1cF92F_ƬY*ot 4Acy_Y\2eż � @� @� @� @�J@{o͌� @� @� @� @� @� @�ZW-":t]� @@HCT.\|A ><x駟iӦek֬mT6lo^zQl٬? )SĘ1c⣏>ѣGg[:ujv[/ a±R \J>mYs=_}{Qvh׮]xѦMXwu; @� @� @� @�XV> @� @� @� @� @� @� P |2W"xNΔ @�@rP~3ShѨQ#⡇o6kBr,\+t2mUXql(,&Oƍg˴guΜ9))*mvf˴[D2e w78vEeq<Lz]wEc=µڷo[mRr� @� @� @� @�@Җ� @� @� @� @� @� @�k}DqD.%6M @�@N:j6m;>(cƌcƿ;bY۲eFڵ#ku֍\p F1cFB>Ә4iRL81 KZ^\rԯ_? f{N fuM7]8)YfY 믿fZ^ziyYp!|p4o|»VuH� @� @� @� @�%Z@V}O� @� @� @� @� @� @�U#Я_Ą J� @ lF{~1~g 5( >< T3gN9)@)ڕ· ֍78jժ_+V5+RT)\--?쳟)SWT) S|ͣA>[lմBR՚*)裏j㫯O<D?.l|)X+lj*ʗi5u\� @� @� @� @�%Q:+w͘  @� @� @� @� @� @� f̈҈SO_^H @�RnDo6&OkԩS^l/hTYV͚5#~[QFlQzŖժUB c'~!fΜӧOt_ .曘6mZVSxVn=hc-lٲHh) -czݺu6, a? 7^Oƭ7:v[ * @� @� @� @�iZk> @� @� @� @� @� @�WDc @�D _/u))6}µr5;L#FȂRԬY_Ŋ#k뮻nTZ5׫T+WuY'J*E'L멦rE J5^xY؏y/$.\0[\+Lbϯ_">[̙Ξ=;[SxV*-S%Q., 1UViΥ%\|I<#ǝwޙY|YV6mk @� @� @� @� @WxN%@� @� @� @� @� @� @@i4)"2z6;!@� Pzʔ)ԨQX >}zpL5 Up¤rSSN_;wn~(U.*] \XXZ_?ԩ뭷bbt<hU6P��@�IDAT{QJ,]~qgguĉYV j߾}ױcܹsl2Q @� @� @� @� @@w@� @� @� @� @� @� @�QnDϞ @� PJʕ+µ4HZ͋j Zڲ౴X˖-+VJ*e˴NYiիzꤼ? ~{g8#pf͚A2 @� @� @� @� Z6 @� @� @� @� @� @�ּoGG#~8B5?# @� @ «H8lq9d>ȂR5\m]wqѥK]vq1 @� @� @� @� @j(r @� @� @� @� @� @� PLzh"Cb:@"@� @�R#ШQƍC{]vYlfѮ]x衇b޼yf&B� @� @� @� @�l#- @� @� @� @� @� @� P|2W"O  @� @ nѯ_b:wlIz1bĈb6b!@� @� @� @� @�U! PkU� @� @� @� @� @� @�%H`>}"8"b]J � @�J@ʕSNƧ~{n<sѴiӼ]G̞=Td @� @� @� @� @'Z?YX#@� @� @� @� @� @� @Z)Я_Ą W\VNߤ  @� @ Ԯ];/O3&^|jO:uĉ'#F(6$ @� @� @� @�5~s  @� @� @� @� @� @� Pf̈҈SO_O  @� @T q}ԩSo߾/GӦMc=|0~R9o"@� @� @� @� @& PkmK� @� @� @� @� @� @�W\\P`U @� P jԨgqF=:^xᅨYft%ի\rI|gpԆD� @� @� @� @�+ Pky#@� @� @� @� @� @� @@)4)".(zR69!@� @�R-кuxcqqŭ[lE>bĈR=w#@� @� @� @� @@iUZy @� @� @� @� @� @� @ƍ8̈oY"֍s @� @@I|/O?4nxiӦѦM8p`,ZL8  @� @� @� @� Z� @� @� @� @� @� @�(qE\{m"2B.`~ @� P*Uݻw#GƠAL2Ѯ]hܸqs=`N`~ @� @� @� @�(J-4 @� @� @� @� @� @�--,4k>}"2c"ZСs%@� @�%M`>F;Sy[7}]I @� @� @� @� @`j%@� @� @� @� @� @� @`m~x,\cĔ)GGL1tڪb @� P~cرqAL-"ʘ9sfi @� @� @� @� @ *q̀  @� @� @� @� @� @� bÇG \Yk1n\% @�(]Ջo9&Lݻw+" ֺb֬YkfC� @� @� @� @�, P<C'@� @� @� @� @� @� @Ϗ/… F v @� @� PV,Lkĉq)__~\uU1gΜ0Es @� @� @� @� @@Uo @� @� @� @� @� @� @h?Ǣۤ:EtXt;G  @� @@i^z7>ѣG\veYֵ^+ S4 @� @� @� @�HZ%4 @� @� @� @� @� @�O`Ȉ2enۻw}ETPt;G  @� @@iQFw]tQ7{'/zԥ \ @� @� @� @� PLja @� @� @� @� @� @�X)PkiAY)h#en� @�5kƕW^qp>6m<Lq1 @� @� @� @� @`j%@� @� @� @� @� @� @`mx~X|eϲ1[ @� @`mSN~12/z뭷{Jb @� @� @� @�XV+ @� @� @� @� @� @� @` o~/Z5˕Z5bȐ~o� @�6l=X 6,͛;cp _""@� @� @� @� @�U( Pk� @� @� @� @� @� @�kR`ΜSAjE?{~k @� @vu:ths=[o^{m̟?!@� @� @� @� @�_- PW� @� @� @� @� @� @�S`Ԩƕ´o?F� @�,]L2ѵk裏O /04iC YI @� @� @� @� @/؜D� @� @� @� @� @� @�/0rX6$k"7")6B @� PV}ѣGGÆ uY_|Q܆j< @� @� @� @�(K � @� @� @� @� @� @�\`ѢE1mڴ#}`;մ_̙3fʶb?[VP!˗_lYJVb;U4mQ>|xcM6իs=#@� @�O^zOfNm&.Q6%Z+ @� @� @� @� jb:' @� @� @� @� @� @� @ bʔ)1~~'jڞ0aBr%`ժU+6hX[/ ʅa`aY)D+K]r[sY,+w}Ipûb?G?cn(QRSNԯ_? 4_r-17B� @�,&pǾ}O?=wyg4lpv6 @� @� @� @� @`j- @� @� @� @� @� @�_}U9gu̙J W^Jոq8蠃nݺgYiYf(SjS|衈Nvλ^Xpa9T?4iR~�ؿY`W` J(\SB� @�DTZ5ҥKt=vaKwQ\9D @� @� @� @� VLs @� @� @� @� @� @�Jybod?OL0!x5b&MDΝ:ԩZò.tS!M6$?]|m駟Ƙ1cQFE]wg6ĮKL[>- @�X#H ꫯ/8y]:3+ @� @� @� @� JK @� @� @� @� @� @�Jw}ZY}wc³vy8c�f͚EڵKBD~YhѢ,P,Tz衘3gNTZ5 jժUR?  @�XһrHt=7o]vYuY.{m/J� @� @� @� @@%e @� @� @� @� @� @�$O>$z8p`V[m{w|Y[oV)SL~V,\0FÆ nָ b׏}7ڵk۷Zj= @�Xm6^+g}6瞨[ ) @� @� @� @�Nk͚� @� @� @� @� @� @�Q`̘1ѷohڴi4h .Xo⦛nI&ߢk׮!L_HrI&ѣG0`@L2%>KbΜ9ѳgϨ]vl2nϊQ @� PJʖ-w^BޗC=TJfg @� @� @� @�XuV  @� @� @� @� @� @�(ӦMvqhذaz뭱{믿~8?l͊hKv83b˂֭[{7Ν['j @� @`9xw##8" LM @� @� @� @� v Z;Y @� @� @� @� @� @�(Æ ]F:uϏ&MĐ!Cbԩq-ľ*T(kj뮻nvaѿ/Gjժee鞜vi. @�X-UT½xE1nܸrm!@� @� @� @� @@IU @� @� @� @� @� @� TEc=[1cmyu]ѪU([VTUtRJq衇Fx)S .AEF⠃W_}u]Y @� @xr!fqw12 @� @� @� @� @@~{a$ @� @� @� @� @� @� դIرcԭ[7oft=T+zvp wGSO=gώ=3gxVE� @�@ bذaqGaz 1  @� @� @� @�֤@5 @� @� @� @� @� @�jgAZM6QF?ۯ[NL2Ѿ}x_G˖-7n]X @� @` TT)n{_~qķ~G @� @� @� @�(>Ͻ0 @� @� @� @� @� @�V@`̙ѳg,8jժ1|߿l6+ЋAEcѸqcax@� @�V@׮]^1c.-WEtH� @� @� @� @�&Pp  @� @� @� @� @� @� }p裏yŃ>~8R ;7|sODݣlٲQJVV-6`^zlᆱ뗂 @�͚57|39,T롇6mڬL� @� @� @� @�L@ @� @� @� @� @� @�%J뮋>;;ׯ_ԨQD`(W\~qAE M;SRJ`,@ٕ+WM6$ԩ[lEVjvm*pm @�(N^Ѯ]gϞiB� @� @� @� @�& PkQ @� @� @� @� @� @�F•HZ)hI) 4_~9z7xc\q'nj3bW_}yV?Ә8qb<1vռyycw1RhB� @�@ QFq)Ĕ)S.+.3 @� @� @� @�6Zڅ @� @� @� @� @� @�-?SO=m۶]9 /_> jN~!z5j(r)|m„ 1r>|x;qUWE>}Zj!bu-/  @� @8cM7H ۄB.|!@� @� @� @� @X*  @� @� @� @� @� @�(Jࢋ./yhݺuQM+rJTP!N:Gyd,[l4h )4+6zxѱ+WN:řg7.O  @� @8f͚qGĴibQRqi @� @� @� @� @(G`� @� @� @� @� @� @�(B`РAqeb5| Yfѷo"fr}WqGkYz}?>ƌ£,SL4j(8<xpL:5.:th4i$?8qbtMqG/Fnݲ m/o6cl'OO?}5̥Rm6;7+o^V)W+&@� @�:,zȐ!Ѷmۘ5kO @� @� @� @� @ *7 @� @� @� @� @� @�t.RR׮]l&:{=zt{hѢ6o&^|xgbΜ9kB)X-bį-mQz?F;~7⥗^.7[ ^V_u(w7fc|cvʯoqv,VZߗsf ?"V Up  @� @`q/gp@ @� @� @� @� @ *w @� @� @� @� @� @�`;#M\sME˖-{}l 6={ +W.n,^X))SL|1bĈ8㏏/8{M7:u,:i,~¬TG:JΤI}1xիW$:w=\֮uٱQTN\EVZQ`[ @� d&MdƍmۮUK� @� @� @� @�. Pa#@� @� @� @� @� @� PRPQnݢVZv˗_#cKRkcy督UVVfPB\~=<@ԯ_?6l%^fY:߿G:J*;]gqꩧ+"^y啨QFs=BR)%(|e!E� @�KfmbȐ!1f̘h׮P%E� @� @� @� @@Uz @� @� @� @� @� @�(U|I=::u5tҥKy裏f׹+/Oe+=И8qb;8<yrvcQGm۶O>9{źz7N=3z/bs ;.{sW_}\pAo>Vj+-_=zcǎ/im/\0ycw}7wjL>g}v^qO?Uѱc8p`+ݻw{oyԭ[w׸;uqeeǯ%KAUH_mM o;'.l_ tMQho6 !Kv)͞=;mto۴iylN:%iӦea_Ò� @�V\QFYV$~ܹ+މ3 @� @� @� @� Pjd @� @� @� @� @� @�F?v YUEѼyxcȑe9X}~a/ItAOaLzmذa?!nx㣏>> {':tsL<YX 8JX?8묳rʑX2Jnfmw^|YxW J/KRHU p [nVZ~?|Ml׮]~UG˖-q1x,@)3&{U;G ?~*L>}bԩ1k֬H*\RW2JXiu]OKÆ HcwuWfk>^zf2]?`@nݺey+.?^v5wտlzꩧ�+{饗L2ѵk,Tkѯ_Ԭ|U' 5!@EzE\QAPQTK&UQX]ņ]YDԵ`w׮k[{ ;ɞސw>9sw½MAI� � � 3vi͚53HA�@�@�@�@�@�@�@�@�J�Zr= � � � � � � � � � � � � qJNN ڶmiz :#3-_\'pgUdaZ4.7+TN{S㏺+4l0뮻ܱfaFgVzzz(tkՉ'#FlI& >ouYx|]ptꩧʂ}Y?_m `?\*Tߟ1Drڵk6lؐѹҬY3UXQvf^\r:餓|,X |4RorJըQ#4ݏP5W_sLsguyw% jܸʗ//oٲ,͕MfV '!I&;wukY[ժUu]w MB@�@�@ 3Li?㹟E<;"@LxQ@�@�@�@�@�@�@�@�m � � � � � � � � � � � � S2֎( *R~}<L?c){~VǎpBq |P۷oW߾}Cӧl" e c}ֶbaX۶mӓO>ի>-™,k~PWjmPnWZj7;tԺukwLԯ_?uQz7k}hjرß:11Pa{'|qnM^zifJ6c =sBVv>#ug{衇dken=tT\YuV/hY_m&Lo) ~^d5ju6 � � �_szGdO4lPӦM̀�"PBrp� � � � � � � �Ĩ�Z1zc8-@�@�@�@�@�@�@�@�@�@�@�@�'D 8?}Lӱqϓw˾*_>Kڕ&}s6PYIHH5h K{Կr)z$ ?i*Y y/ɓu5RJY NR{͛թS'?N3<o+݇;PefV7oe~z\f^|E+ch~Sme#Gct%OwSN1cS.h-8.oYzm�Wne< � � @t ݾ;4h>GU Բj) � � � � � � � �:`A @�@�@�@�@�@�@�@�@�@�@�@ ,>:<)|=ڸ~[7=η ¨,)*i%ihxmٮ]keǎvv}mƬc-@jʕ1U<,iٲe:SujժU8p^z%>x7++Vu][lQj2EZILL~,wܩm۶nݺYy睧ŋkĈ~TN8 Ne??~*V,-ZCjҥ=sPO3gT52m?Qvv'fW^Q-T^,"u؜{nw}wp1 Zj\M`@�@�@�\ >\?FC=$�*}}Z@�@�@�@�@�@�@�@� P+n '� � � � � � � � � � � �_ ==#8BlrC\Tvv)cƅ>:Z TpkW,/@ws]vWmnH}qq& S�[f ma٘bY8TRλ)|dDV[H-ݠA,}n̳>/=z,m 0r]yV5w\ 4HzI'_~ ۨ??3]veuv zZ͚5{G5vXuǮi7n\@Cs&;+b%']vM͋8o^^xau߿;0}YnڴA{lݻZj% &dc{^3H¸^{5?uoξ6rZx YW_ u{eב=}ݲFz-=۷oC�@�@�(@nA_|?|;jڴiT Py}FOA�@�@�@�@�@�@�@�8 @ Z � � � � � � � � � � � @DHTHT`ۅZnD raP9-*'aRnHsݱo0j۶m¯,*}.(ҵyi^p+j¯j֬&M@qukG t}:uR֭uw wq~վ}{/nf̘gî-Ɋ-Y+?ߴ o9ҥ|OիWװatM7?0@|}gm~ꪫ4k,p kp\]vZ:(aV֯_YD6i$x≚2eoJO=Lwaռ;3 ?X߯z*P̙3޽ZfdsΝ7 8п .ԕW^ Bsl/p۬~5}t˾6믿֡\(7S֭{Oy779ҿ믿uj;? 1 ֲb]BBi � � �ҥK<Lg;v0&F�7o.) @�@�@�@�@�@�@�(j[ � � � � � � � � � � � P,*eT*`TAm3'˫r||( r!Pm^jwp;Fvmra(yصkru,aW9 sN?&ҩXx JNNV0+ r`/´lX*(4a?^'|ZjUgmǰ`#FAgтk׮mAƍC,Y"kðfΜ?.|O>QJJluw*{{zj <XPec:(Y?ɓ'/; ɲ6:u,iٲe6m/PhӭުzVT�3+T{Q0+ԗ'/_|Y}z ?6==#ܫV5555~vc[=xB,j޼y~݃rE{!f3{U3?`1 sٱ^ " Z2zhqcl?g.ZËݗHW^ӧ}Y5Я1cO?eޛkxٸqa}0fmlؼ@�@�@�%XX1V~/sȏ@OA�@�@�@�@�@�@�@�yCK&0& � � � � � � � � � � � ?,"<ʅPƸv^cgݎgmkp^fB`ǶL`lG6_ ibAV.*R [TW@+vuxUvkW , gϞ~0kZjĴY{hDzp+Ze<v޽P G0+ڪ[n$?5k&:+baKX(su{wAO? ;sh"?jܹ~I *w\ b+Wc= 5 Yfh-. DÂ83sX_UKj_ _w^~}ԯK7$xb?B)) � �E# /SOâ暢9h >OS^z%p 1|?5>QI1{tݒ@�@�@�@�@�@� {by_A @1 x_+x"%J9s � � � � � � � � � � �@Vv;Ǽd r}*U2Kٸ+V|H*ٯ XH%RUx[\M$r¬\Uv#nsX`RU$x?Azի %+v̼3fhŊn_#k׮Svvm6:<#s467,p,:fnvl ӲP:^z͛7gOxك4h?\x OSN9E>1x(RAZ:aZƹ:ZțN� � � ;'|nFM0A=zPǎc8(`6DD' � � � � � � � PfuY2.@�@�@�@�@�@�@�@�@�N ��@�IDAT@�@?VeUTnsͿ{]B(^Gn.n\nmHHU/{e/&^SQJJBV.j[֭͛g sAX(%`R/uqiʕjٲelΦO>jݺuVrl񀀅`YP_]DiY`_Yx^ 𨣎駟{IҥK/F99={5kC�@�@�ȣرc}]?P:Sjm".y!Ep@� � � � � � � ��$N@�@�@�@�@�@�@�@�@�@�(*"^Džosv rP\bAP`hժemm\vۂuvr]@q XL~B\Q,^#�dE$аaC0`:uꤻK,0d %1bY{MI;j۶me?#Ծ}{?TmI}g9@�@�@�bA >>^w:t뮻N/@ ! ]WA(F�@�@�@�@�@�@�@�ʘ�Zes � � � � � � � � � � P 傢]U/nP>kׁcyRyu¢\mARR%ۿrZ UO`uV?hm n-[ wX«ƒRRRԸqYm(Ef͚ZfƍA驧… e#_s/{ٴidE^W}pYgݹj}ݹ`@�@�@�bAQF;tyO>:c8 ФIF.@�@�@�@�@�@�@�(je#� � � � � � � � � � P<( `).ڮvzqm*˕T) :R;1Q^=cm}cM`Un&ȹ¸:R ]m߾=b {aP!XUV-feuݺuբEL}ժU `% (yΟ?_z.jJg#giE`:o<͙3Gڵӿ/o^} /hժUڰam˾F~n@�@�@�(BrJ>LbO~}|yy}IݺqF � � � � � � � @qU@�@�@�@�@�@�@�@�@�@�(`Y-"+}߾#ZH rS@H}UD /8k:XnAXV^%`-.ʅ`ï"E۾sΈ($%%!X5jP&MBW!YU^(b^z?ִitWh…5kWt^>{GSN>ZS b}Æ [OիW__{ONMMVBIQ@�@�@�ʪ Ժuk]ZxqYeixaÌ@>QN@�@�@�@�@�@�@�(BC!� � � � � � � � � �  J}=|[p?kg=ڶ`Yxy TY£}ʕգonymKpUn"(= >X iYHKR{! rWEnWn-T�9�y.}g# 2l6F>[_~E#F 7ܠ5kf{*mڴ-Zj^}U=je+F@�@�@�.PF ͟?_]t Ν;K(^D:'� � � � � � � ��Zʤ � � � � � � � � � �%U{(|\Ȕê\mn璛 0傥\]j*Fɂc,Dpe?˂"8WoU UV`Upk+NH7M4I3g矯 /СCe)#7;7Æ ՠA\d||>h;vzio6mڔ@�@�@�$pjٲe~;Cxi\KhRRs9\ � � � � � � � oO|2 � � � � � � � � � @AY,TEHl"[߮]Wrw5 )@jNN>&EU@ӵ}Wm氹‹${/dUZLX㶹^Y޶@- .롇ٳpB͚5K'O֙g!CSNtwypXB{V^k̘19rj֬Y`ge l>&B�@�@�@$ ~:#tmi%R8wJ@۶ғOK@�@�@�@�@�@�@�@�< '6vB�@�@�@�@�@�@�@�@�@�J rT.pʭmYsS rS.*Jy?d>^876|BA�JlٲE7os ֶm"ay/Ue jԨ,Dž^E6NCխު3gֲet駫nݺ:5p@?t)!!!iؖOV#<~ ݥN;M?8  � � �LUVk5m4?l<%%`P];3ڵ @�@�@�@�@�@�@�QbpZ � � � � � � � � � PR`=g^ lk߾{[ހ rS٭WvaUoP!H@yduV?BlzjC rV M6`vrr2AXe D 5tPꫯ_,YⅮT>}Էo_|s~G=իWkΝڵf͚Y@�@�@�N`ܸq;5g͝;̑@e㏥O@�@�@�@�@�@�@�(j#� � � � � � � � � @PC"Y`+W"mLpZYT0*v 6.'+W>0O95eC(}A^\`ig9/ т,ʅ\vÆ 3m n^zhen:@�&ЬY3M8_ XBO??|5SN:餓t '[nJJJ*iX,qF+Zv֬Y=cgJO7߬~~rn@�@�@�lL0AW]u4h� Ĉ@zRJGj-4@�@�@�@�@�@�@�@xA1�� � � � � � � � � �Y\UUmscc\{D,BCթu\p}ܶHv\L"@�H]͛CXm=o7HaX.nݺjٲe(d:a0`B�<{;vlڴI/V^GyDfR9/I}ҥ:wmڴ)Ko[p2 uңG͝;W={~f~h � � � @L9R ,Д)St]w9q !pQ;� � � � � � � � `ju� � � � � � � � � �Q˅MY· rmWۘ;3 ύ:--)ePBFP rRIIRZ泱v\  @Htm ]- kǎ1, z~ &M#ï\`_7t"�-?^֭[{hv ܲ?G}?Cٳ|ԩ>l{jܸnf=CO:KqqqPKB�@�@�@ X34tP?`) ;K+Vƹp � � � � � � � @q Uw#� � � � � � � � � ԌP+duB6&¬xHQ)<(լy` >7ƎKA�(n₯޴iSh=Z� Dzz֭JɰbAVt IJvzԺuPVp`u˗/6+ �%EaÆ4h9۷O|~mYL={m]ZhMfY4h -oɲ|]!uM#GT.]ԦMŇPvkĉ2e9?|ݷo_� � � �,?ղP;Sφ#@9s}'S@�@�@�@�@�@�@�(jU#� � � � � � � � �PY( ru/v]mۂ۳[@ rSb­uxUp[xy#@�$}P�bŅaenY{r܄? +pe픔?nqXM� ,$SNDpO>D_JOUY߃֭SYmK:u+ p .J~`c+Wίm T`m;v!Xm۶PO7/su]CU۶mu{^2rOZؤIt 73Pgu)p!� � � @aX85\ѣG?g(~ >;H={p � � � � � � � @q U@�@�@�@�@�@�@�@�@peUnqU.*Rp[j{t?*nezRTvv_\) �@ZZa!9 rXM;Xh\Yؕ[lQF~ rۂeA$@�BAwYgU|~g�+ o|ےsTQChZF[0 �/{HvԫW/}!~~VnBrrp z'{iɾ?OA�@�@�@�B2dh"B8S"@.u%@�@�@�@�@�@�@�@ U o*� � � � � � � � �ĺ='܅Xq"ƹ`}=BrR傪.=o<4΍wup?gumcX@�bQB<\զMBm [;nZ[n%&KV#bh"S@V@,  �%]ªlIٷojﭶ~MMM S[5rDz�rk,H+!~=ꨣrJa4i$C={ݵkל0@�@�@� P>ÿ+pB?^III8;S!@^w^zI~ � � � � � � � @ PtG@�@�@�@�@�@�@�@�(0%^eumU#m Ҳ?ݸ̡V+6T~q.ʍ ?"� Pv{IW±>?TTJII `YaÆHY. oa"� bլY_y-Rfկ_c=V/^yM<Yݺuiӧcs@�@�@�(FҜ9st}y#Ker](/^GKIDž@�@�@�@�@�@�@�@ Ufo=� � � � � � � � �%Y`׮`+xe\Up{>mzϞe,PRҁ0+v p5nyZ.*l@�ʊZmٲE,7=޼˕+' jڴiĠ,WXs � Pݻw/իWnPNԿM6MGqD C�@�@�@l ԪUK_W�We[c9%@�@�@�@�@�@�@�@*"h� � � � � � � � �eO 5@ȕ ֮uu{xNZZ.BlC `]reB( � p@`޽\8V0m޼94mۦy86999K VݺuժU,XUT4+ � @ K\ر9M:Um۶|@�@�@�(uCU/磏>RKqA4ͥ k *iE�@�@�@�@�@�@�@� P`= @�@�@�@�@�@�@�@�JWXH\fqWnu/W#RdY^eKm5ki/Rو� �ٓ)®6nܘcv7a\r૔m r}Vzjz( � P#[x ?L矯)SE&@�@�@�bBNPӦMl2͟??&Ή@ xwZF4Kp � � � � � � � P*wkG�@�@�@�@�@�@�@�@ 'mv`@+[\w-B 2®,-.9@ rnW'$D;" � W}7 .*<kÆ Y{׮]Y[K ]e7@�@� 0@gu~aM6Mmڴѐ!C4yd^@�@�@�(X8]tEZxΝrx M 384i`iZ � � � � � � � @i/J]@�@�@�@�@�@�@�@�q Ъ[3\ Ųv8 ڳ'/z|v5ƍ%B]mN  �@ZZ-ڸq+[?X{}V*xpUfbYm HİXE�@�(,{y睧j>}~ >\'NTÆ ̋� � � @0SW>}ʤ@, -YZ%3X:3@�@�@�@�@�@�@�(:Κ#!� � � � � � � � P,+ _\V~n^.FR+& _VՓZȺ`},U0t"� @1޽;S(V0 ˅cٺiYV$$$z�,զM,aYndY;)))8m@�@� .@sf̘e˖iĈ0a9N@�@�@�!ФIs1zꩧ*,ޯ6uq3Uo5� � � � � � � � @�@�@�@�@�@�@�@�(beAX rmnx4, rmYK\UpouJA' �ĐV|zӦMx /~ȕ aÆСB-Wf"...|:@�@�J@9//õ.]Yf鮻ҨQ4n8ժU_=� � � @OK,Qzz:)r@}H"Ie# � � � � � � � P**B�@�@�@�@�@�@�@�(g^m,˥Cl°\k,0,#CV,ĪZЫ`]N~m/� �%L6lؐ.$±RSS3]mMECW.QF bm\ 2  � �!/r >\~̙;CW_}Z{Ѓv@�@�@�,`Z'OoΝ;GD/@߾҄ ҺuR׮EvX� � � � � � � �Č�Z1s+8@�@�@�@�@�@�@�@�&{d!X˯\_Y;X[{۶qqR*+2\mW dy( � PrXpڶ͂%n+W.K(V͚5բE,.4j7EA�@�@(*U1cK/բEtM75\'[<@�@�@�r%СC5iD ʕ(VG%Pp@�@�@�@�@�@�@�b]@XC � � � � � � � @ XamؐQ[;nX/ض@(d,e{%kZUJHu@�(;v}_m-+®,ZjyZk r1U  � �%L ))IƍӨQ`͟?_5vX]qJ( � � � c38C+WԌ3r@G). � � � � � � � @, wsB�@�@�@�@�@�@�@�(tifi\j[ۗt*Tr*b5mzm.4ڶ/@�JCW.7nbñٓ #>>ޡz(Bli֬_P,W[8-ժU4+ � �dM<Ѻ馛~=ex„ 1b*UTF@�@�@�-УG-YD[nUժU= @,Pu\� � � � � � � �4J|@�@�@�@�@�@�@�@�BeX&{l,mljjhwe^Y(VZXֶ`,eغ[T90-@�(};v`0[lQ}s(III~V- vڅ.jXjQ@�@�@ )^Y4f͙3ԲI&i*_|'c$ � � �eP[nJKKo޽{A.AjRzQbp6 � � � � � � � Pj2@�@�@�@�@�@�@�@�ȱ g_2_=P[L(ծy9ꨌu _, ~@�([nñ{ .˵]mmݻ3Q$$$B[ڶm/+V4+ � � Pϟ뮻N3gW_sneS@�@�@�@ yzW C"pҲe77nr8( � � � � � � ��ZFρ@�@�@�@�@�@�@�@�'eU3~hbAYe Xq`iNSS'bZ@�([l񃯂WvK0˅gsXB Bjy͚5SΝZbaXvYիWW}cBA�@�@�!P^=-ZHƍu饗jٚ:u;<Ǘ$@�@�@�(J?^ZQc!@6^(xfԫW6ل� � � � � � � �2J r@�@�@�@�@�@�@�@�ضM˨ > JgX{mhiH^E!HnЬrKqR� @ lypAXvXn±*U%}°XNNN.br@�@�FK.Մ 0k֬Y6m @pn*@�@�@ uGyDWBBB @hR:X{ *_ \= � � � � � � �eO {#� � � � � � � �yHMV꫌믥oXӦi+W, vkÆwtUuI=ԠTm<;!� @ ٳ'K8dYmKŊUfP@_m6Ӻ Dzږ@�@�@�v>]2e#<RӧOW߾}#C' � � �eMcǎڹsA_%P@ VڶMJN.@�@�@�@�@�@�@�@�" PH9 � � � � � � � Pr| }I_HV[hRbԴ=V*uQ7i"5nOkС[^x-~%3E�@ k bvz=+PTF ?iW͚5S.]2dmJ*h"� � �/кuk=Ú4i&O389eƌիW@�@�@�(AmڴQ\\wCUZ F}T6t_+W� � � � � � � �85 � � � � � � � P2}Wz}X~MPAj\/#9GjB^T^t{j̘qZ`h"/K � @ jiaX@h6l,ə±,�g r A@�@�?\+Vлއu){`-) � � �E&MZgyfY$9WO_ Ԋ !� � � � � � � @ UhL� � � � � � � �Ėu_^zIz5魷[=GQ:xˤ3´rw4h }Z|.Mh@�ȑ={BX.+Xc7oޜixլY3eAXZRnp,[wXXb9XA�@�@�JGg}u?XNP^`.]K@�@�@�ȕ@۶m駟j#@ !|ᇒOA�@�@�@�@�@�@�@�J�Zs � � � � � � � PvVyDZZJM=V]sgyz衇4{rG-{y@�(#{K rAXַ1|±, 5jB( � � �]vՋ/kjgǪo߾>}:v � � �eFM6e悹PJ@Ϟ.Oipœ" � � � � � � � O  � � � � � � � @, XpM7I7,/sNF։'Jw;wUW][W^ywUB;�3!� P{oׯ,-. +n}[lt S6m*]]zL� � � 7=zW_s=kYX4m4k.o � � �%Hy_ZΘSE I#F ͓J5s � � � � � � � P*G�@�@�@�@�@�@�@�R(`Zg%] {Fa<D㣏>ҠA/詧R~J&� @^ ,Lm7nTzzz.!!A5k\1i6Bt4@�@�@�b8Se}y 7C:4elٲXΉ"� � � PӦMgUX(1@ ]$M$-_.]ziv` � � � � � � � P*7SG�@�@�@�@�@�@�@�" \}fKRΑFoҥ;G{N5̀� @ \8#fݻ7UV-eAX[V35j(>>> � � �ľ@կ_?=裚:uڶm![zh_�g� � � @.,P/&Mro#@a Ԭ) (-YBVa3/ � � � � � � �Ď�Zs/8@�@�@�@�@�@�@�@  d<4 'Lk˖-KwkJHHy3 �!k.Y(V r6mڤa˗/ڵkXuvɵ-+خPBh_ � � �W ..N{9-_\ӦMS˖-5|pM8Q 6,ϕ!� � �9C9Ŀ@2wXjc_z@�@�@�@�@�@�@�@� w;D�@�@�@�@�@�@�@�bJ7뮓Ε ߩz駵rJ}gdo;<ܹSVI'ao;JwyN9<. �%M`ǎ_,WP,Wm۶eD?˂liѢ?P_0$+%%Et  � � m·tG<U >34o<u5:s/_?_sf̘e˖iȑ0a̜Y(iiiq@8vXOs}mmڴOpBmy9mݦ:ihѶ"@�`V�8h{w[@�@�@�@�@�@�@�J�Zru � � � � � � � PF쑆xP,<Pȷ~?vƍ[oUǏW=Z�IqoF} �\ gp,j ̲@`INNb܎<к ruRRRpW � � @ucD^ӧ~JVTo(W.b?fҥ9s+5j}rD�Jj{O?޶k.gVܶcݺuz祝~m{)\ �! *zUs1c?Z*9͙"� � � � � � � � P+7ZE�@�@�@�@�@�@�@�bT`T Y`i {Wk׮U߾}j*͘1Cƍ nHꫯYgƍo"F�(p}\P Ŋm۶LǯReYձcкs!Y+Wδ/+ � � @YRRRG ׏>&lȱ=`/װaôh"͛7OK,5\1ޓV�V=.ӹ瞫7|S]t%gܖcؾ/F:كm} � @IHJJ s<(+I&-X ~{Yj@�@�@�@�@�@�@�ʚ�Zes � � � � � � � PR&M;]pK2uV?ö;Lۋk0 PV6nܘ)$δnYgCL+Vնm[SB\md � � �L 9j:DթSG5: '`ӟ4rHA 4|رcuWy Κ@ ŅޓZj^%ׁZٽM6_G~O I`#C � PR*Uݻw<(SҸq>',S"� � � � � � � @ Ph.@�@�@�@�@�@�@�JR҈ph"[NvRtW~ꫯԣGoZb~'ozZJO>&M;L7xCw4ϖ_UGujժ-=hǎ{뭷I裏kz.@;ûf͚iԨQ~HЯ>L˗/g �{'裏j9O{… (99YC ѩo? @YHMM_-d]P޽{CL�ZjB^-^z~[^zh? � � �'PjS5l04믿)Sh޽o!14 MJ*gu7r-\3R  P{Nhذal}~hze~,p?СCu<@mvH:d\ٽ_wn��@�IDATy<LYA�@�J�Z%fqeR5sf$@�@�@�@�@�@�@�@ Uo0� � � � � � � �[/Z%g֍7OTڵ{֭[`;C<7o#Guԩ1c"h,0`ڷotu]~ʕ+Czz昩O?z7tEW֭e,ֶkk bرkڵz0-;瞫A!Zz:g}ᇚ8qbb8\r0Էo_}'~7|^zOm=  PJ,Dc]ׯ_eWX1S(6[@[, ˖u\9йQ#� � �!J;o 駟 /vڅ32THHoѣ3'Ln>|,셂�%{ҥ^sוW^>j]OC33WV_'|Rh%8o1i@�@� @VIKcYHLZgNرRjeYkG�@�@�@�@�@�@�@�(S-J]@�@�@�@�@�@�@�@̚%h!w^K7n>#}jܸ?{QϞ=5tP[}Z5jкu* Ժ;յkWk~>ٳeU5Rn0=>/G~W_}% pRjUM28?`g}uk͚5~XV .@)))~0c{ib L:5teb#FGwqk 6 vC,d-,k͙#999eXm۶Lkm{MwYJA�@�@�(U6>+k:ٱSs7o&Mj(Zjo?9s\ /?,3 @ ߓ=P[_@-µ}>O%%%oרQꫯj cĢaÆj{jvoq#m@�(j;y%+͓,<w  � � � � � � � P*UA�@�@�@�@�@�@�@�$m^yzz~a?,Ņi٨?K?P+55y<x/^*U&<#B!Wۼ?ڿ:;vYfڲeW~}#vZt^yu]w7ytMe-xg>l::z'z ѢIbBpDCDDޢwѻ 2a3u]+kWyX;I$ö+W;Cejjڴʔ)#W_}i¿l,gcbA�bSŋ7eYH޽{]hY7eY0kX-W\ؾ7$˶~ � � �Q#fMcOb]0} {͎o ؟ǎ+ >6l:w#FhСjժUֈ  ]vu!Uzu%K0W\mr!n*x@�@ ><Q|/sDҤyFzM{wyl右` � � � � � � � @j» � � � � � � � |DI[?Tk2hRi{u5T̙#kVh\m և~xݑܵsmM6]~w,ʖ 7l@#GJ*Zxwy]�̛7Oռysկ_߅}ڵ4p@C�b@ 44TvXހuQ{wH)RpYV ̑# YֈێcA�@�@�W4Lf3:B!C}zW\V-{r@ƍ3gNM0jwjxqz{nu G�@�@�|]zK?_] 2>@�@�@�@�@�@�@�@ jET@�@�@�@�@�@�@�@�쫦MtX:gܹSy ;Ylׯ2g˕+OuIUpN۱cw{7UPA_x,9si |Yݭ;nҤIjРz쩟~I-[ݙ˖-Ξ=ƲdxbXm_-$^߿>VDdAXpZj{ólkA, � � � wA,6L 6gf ,,+$$D5zhq{D( � �  {ԥy@�@�@�@�@�@�@� , � � � � � � � ~EjO8ʔ)r9M>ݽjݺ|M!zݿ]z5EO>aoӵkWզMׅXkmڴI5gyFenSʔ)kŊa Uǎk׮A�GժU4c M0AغSN.D)RPB]:tQFi޼yŋ'Ըqw?eZiA(wzGu)BK`� � � i g/Eڥ,jժUܹsk"  Ժt>8;b="6B�@�@�O;}ZT\@�@�@�@�@�@�@�i!C�@�@�@�@�@�@�@�w멚0Tof͚3fZl;vE:~,ʕ+E{5kzݻwmkA/ٳ'lۥK1B_~ׯ~Zu~WwaK,۷owۛcc{eȐbea3v p1aXW\رc5|pO^*UrM3gά^3NڍjժP m ;t~/u޽n{χA*k֬ʙ3rȡu뺭gkҤIa@�@�@�@nݺX~bʔ)ӧkɒ%8p ޶aÆ, @\jӦM5qDժUMĉaSݹs?vX{ݹUTq"{mG�@�@�|E S&yFF(L+#c � � � � � � � uv� � � � � � � �Ě9RRTB57ߨSN*T Jݻ_w'+VLJ](֌3Թsgmٲ}cO?uY6lp=5sL=#5k[ɣI&kۻwow]oLKձcGl\XآE*$$G]ی7NfͩO>9r^֯_tҹ9ZF 2d<4tP.@ Nk�-7<ҥKaM$IX8dYmaY0. � � �>"pEW#Ͻ>24 MO_4`�UVM5rZʕĕ8zJ 6T݀-X^E.`ޜ:u>7LwJ7 =ڴi>WyOudzE�@�@�|AW/hF1@�@�@�@�@�@�@�@<D%8@�@�@�@�@�@�@�@ <X +W|SNK.2e}Q;ViҤPܹS{d۶m.*n{ɓJ,%Jv#G1cư׷9&M})qwimݺUAAA;f|�"pQeAYu}p cʕKz_{g!{, � � �@ڴ<-5k0n8>+`ZҥKCD>;^�,0~:t@�@jժ jraeΜYS͚5y*$_10!Cjm.K7 � � � � � �&Ъ8}P|^} +<"+<Ü@  � � � � � � � �%peTƝuֲЪQ>`'YV|NoZ Mt-?O:?>hhaZdϞmOʔ)UL>=e ų]v}{^={6l{ܹ]PVʕe[²¸A�@�@�'fe~AtҮ;PB~??&� � � � u=z&!uJ � � � � � � � @l@�@�@�@�@�@�@�믝\/2zhN 6̅j}?)}ڰaCY DÇ]PΝ;Bl>~0, ˲B�Yeٲe� � � � _NتҤIBU\wfԴiS}<xy ;vt![y Sd G{…o?3(QBE)0v@�@�sԩ>}g?G�@�@�@�@�@�@�@�x-@V< � � � � � � � Rnzq1=o.^^xc޴i *U+Wh߾}?]@7(˻ݵkΝ;6$IȂɣRJI&.$e%K,xv@�@�@�@wTV3A8Xǚ5kI @-[?O?TCuu͐ 0@ٳg0V'ׯɓ'=*_4tgA�@�@�bQkWikZ~ � � � � � � � = u� � � � � � � �Ĵ<=T]ҧOo&x˗{neYg1%M4ʛ7 ̪WZxf6K,߻n"l@�@�@�@e̓'#Kc> $PԶm[M4IÆ sۧ~Z}ULՃCCCq@�@�;ĉW^ڷzJ)0`@�@�@�@�@�@�@�@  � � � � � � � g;vH ٠.+WdX;< n+;ƻXSf Ʋ|a- bA�@�@�@�^@uY;vԄ 4bM8Q?ztE�: � � � O n-̙>9D� � � � � � � �Q@;q� � � � � � � � [GHK֘ },oxmwޭ˗/ >cƌp,[+V}/EaDz� � � � I$q!Z!!!;vF~[={Tݕ2e wG�@�@�@�QkZ5kJ3fH � � � � � � � %jE #A�@�@�@�@�@�@�@�bNaɓyÂ�8gφfylݷϽKT/_>6om-,MRl@�@�@�@�H<z]7=Z}3<dɒd) � � � = ԲԣT(=]@�@�@�@�@�@�@�@� P+ɹ! � � � � � � � poGuo <xdm۶MZXw *wʟ?UG}[`!CcA�@�@�@�[SsϹP!C7Pչsg%N8nM � � � �+0jT4f̵`pM@�@�@�@�@�@�@�@G/a!� � � � � � � �/yBqn)#? j.$k֭7l-8aJ6 Re[ ˲m\0a°cA�@�@�@�ӧ׈#Խ{wٳ 8p{1Y(;  � � � @țWRRLqw @�@�@�@�@�@�@��%}@�@�@�@�@�@�@�+4<dzA ڵklV β}n߾]/^tPl\@VٲeղeKoYZCd@�@�@�@�$%K[իnݺiȑ2dڴi |� � � � /$M$  M৓` � � � � � � � /h/v&� � � � � � � �*p굑{vX@z~ݻem޼YzͲf9sTtSNn^ϟ_ɓ'1$@�@�@�@�:;C޽{kСرF_~Y=?N1#� � � �A E i(yjA<$Ux@�@�@�@�@�@�@�|` � � � � � � � @DBC [쑊$ {FǏkӦMaYgϞuw$ȑC tY!!!nB<^_F�@�@�@�I?CK4h~a+WNÇW n: � � � �.оOKKJ?whs[V*Qg@�@�@�@�@�@�@�@ ׾Q� � � � � � � �qJkaY{kQ~KH/KɒI'OƩ3b]ʕ+ھ}6nVog:t(l|2dPBTlYn[g%O<8v@�@�@�@� *)]Y{54IjCvEg}+WjjذWj֬yS @�@�@�@ƍʔyZ N'}y.&p@�@�@�@�@�@�@�@ b&� � � � � � � �,Ю4gεzus%"/piahmݺU/^tL$ Ȳf5jP…]pmӧOr � � � p A'5qe<O~M PZTn]UR5 � � �  +&_RK_~))sQRht)N!#� � � � � � � @Rj � � � � � � �~Ժ|9Y\OSѣGeYׯw[۷uݺz;;;fUZUO>۷yU„ p>F�@�@�@�NT)y%O-@ϿkTJw\f͚y`-{5l0.]s� � � � o $}t}Ҿ}<+um# � � � � � � �/l@�@�@�@�@�@�@�@ԑʕV\ /Jժ";uֹ³tN0rRѢE춶_X1eȐ!>1g@�@�@�Q ._~ƻDVVZZp~ 8Pe˖U˖-5tP<q< � � � @ J'JG^ i=ݧ<j@�@�@�@�@�@�@�@:`@�@�@�@�@�@�@�Ek۬٭GR*OgΜqaYk׮w]f8lYyuAY=/^hH"0/@�@�@�CmJzBVh֟ w#аaC:m4 4H%JУ>+_|wsIA�@�@�@� ?,X%i̛5 � � � � � � � jŮ?wG�@�@�@�@�@�@�@�(ФTysM- Re8�tsٲe,,kn;vիn^rr};tɓ8 � � � ?Tb<u=%Z$}^!UjѢjȐ!*)Fw6@9r䈪p@�@�@�@�h#)$3iyout) � � � � � � � @ @�@�@�@�@�@�@�@@4xԮ?k}A_N8UVuʕ.<kݺu:wRUdI5ng(QB&M2F�@�@�@�n+cJ+Wn<ҥk7+M Aj߾'> 6m~ihN& � � � @4o.}4}o'÷?O@�@�@�@�@�@�@�@� P+ � � � � � � � p-[J}HwKW}˗j~$gZb,<?M!00PEQR#i̙ӟX@�@�@�@�{hJɐAz;DBBBԡCM8Q۾ իҦM � � � �w)&7K{_Hh?/)h<); � � � � � � � [jŖ<E�@�@�@�@�@�@�@�"!04hԥˍZEV$ 94Vz~Po߮݅gyC9cv-8Yf*SJ.ŋ+I$2^n� � � �@֬R͚/HކI>*%HK#e,Ajv=:u1chԨQ7n ղp)S� � � �@ϞRRpttCtI9x� � � � � � � �Ħ�ZϽ@�@�@�@�@�@�@�@�Ht /<I2Iy=|A|reZǏwC�]\9=Sn[lY˗@�@�@�@�ڠjykrۮ[b^ yӧu7xk=Z/{/iҤ1?(� � � � @jڵRVꌡ7et䈔1 @�@�@�@�@�@�@� qS� � � � � � � � yĉ~ G͚g w}aÆ*֭[O>Qʔ)K3fjÇWpp0aZQep-@�@�@�?,Y=л%U}H: ۷׀T@;do, � � � �>!)4{Կ=,۟?!� � � � � � � �)p?apo@�@�@�@�@�@�@�@�HR];֨8x,YѣGm۶. +K,jڴ~mx:<쳚>} ڻw 4H5R֬Yf \@�@�@�gif.%L(%J$=X<`>/!C5J۶mC=^xA G}+W  � � � ×_~sfmy�sD�@�@�@�@�@�@�@� P%ƈ� � � � � � � �O yrwoy˗jՠA <JzRժU:ujU\Y}ݻ)Sh:|{ 2DM4!<+� � � �TCyKv)yYj̘1ڲej׮N:DuU?D�@�@�@�@ڵRR„j3gƇ3G@�@�@�@�@�@�@�@$cD�@�@�@�@�@�@�@�[[>zҢE<Mt/ŋakhh%JĉҥK$I}Ql޼Y ,/_U۶ms.sAZm۶u2eʸ/@�@�@�@�n/pœu9WpBX[˳c<[m-L+qʜ6n ,J xކ}ښ4iRwτO@ܹO><xڴiRJyjոq]@�@�@�@�\ W.ibgOy7JGH3[]ٳݷ.m|rؾ=jvi[vLdܚ<y=Ȃ� � � � � � � �W@3s@�@�@�@�@�@�@�Ak2ә‚vޭ]v۷O?iDgUB5pL2);wF)R%N \zUܹ֭s5|-\PtLʖ-MzVf'  � � � pSjpV;yd3gtiֻkk,kvH{Up(lyz)RPʔ)e[ᄑN*RN}Ú&MWkL6Z(X&O^zIT&MTJ+z@B�@�@�@�b :v> :Vo^O8˚ٱW73g?s(V.g\ހ-WZ}j2dpC3v  � � � � � � ��Z1j@�@�@�@�@�@�@�{Ւ%KrJ_^6lpaZ&ӧ *^ׯ/{ 2{B {-55QDnk %.^(m5�F0öZvYFl\1XcbŊPB)S#|n 7nٳBa5\v5kRJIa � � � ,j_r[=֣Gް:ٵ +pH ?B,TʚZ齡S7yKҤI]Ŷ^$Ig<ǭ6kVB)rU9sil{EV[gm/\V/ 78,p1̂o^l|3f Z1sʒ%ھ]%K믿ֲeԿծ][u]}2Μ!� � � �Q#pe߿_{qs~a[Z/V /*((ӧ?\Isu\Mzwk5<c޼^@@YZVֳg[߼:a`ëSZYfUl¶+W.O5[m, � � � � � � � [jh@�@�@�@�@�@�@�@ X]s!Ze -qDB\`C=Ep® 87ƼFvؼ!_vZM<Y'Np~˖-낗VZ f)f [{F'ժUS=\Vw{gD � � � @eMconkcھ5]~fVDz`'oS޼yҥK޼ƫ4h`# dMjc{0- 6Vk]wjhva]tN5͞=Zc[ϑ#klkMn/"R*TO?_~kUREM6հaTtH]@�@�@�@�$`6onݺխVO۹sOgeYee54{`oOV gbz:^L,˞mhCV^3g:χqLRV'~͟? ( 01@�@�@�@�@�@�@�YWS1;_� � � � � � � �Ę]\k:{l@VXgyRY k{7´zs$H kNk>}[ְc.lҥZhƍtXVzT~}ըQC% ;&n]j&L~BBB\Yʕ Њ;!� � � ]9sF۷o5f7ݽ{k꽬ղ aڵk@&k$9snp{@@@omܹy-ޱZnYC[j]׭[' &žo^vy}[~|$Il}Xׂ \ssV4tP.\؇G@�@�@�@�{8{6l֍7M6i۶m:wո5bŊQFʓ' ϙ3 Т`ȥOޭ [YqϞ=n<5e˖>s5KV{.X)wzZl@�@�@�@�@�@�@�@ bjẺ@�@�@�@�@�@�@�@� Xs?ܭK,Q)dAudɒ/dq;vtC<q͛Y_Ft顇R˖-UNµ<|{}w'Onfgkժuסm<t.� � � �Xnٲ5f[nu5`%6mZ(֚VV[5՚O^Z5r…BլӧOw[ a"((H pi%JvXhРl6m/^\:t]XD�@�@�@�L?Ԋ+ܺf]V۷oWhhkZ@Ǭ>bAPVӲ:ո=3feʔ NrgVڵ^=z1wN4id,{&t.0TRJ<yM@�@�@�@�@�@�@��Z,V� � � � � � � �+pYM:U?-^J5kL %N8›ynX/­kۦMuկ|F_}[73fYÇWF\S_3A�@�@�@�)pi_^֭ [7l z,XɚZXk>jum$I~ ڤͼ[9ot!wTѢEϚ(QBe`]`hB'O֐!Cٲeqw@�@�@�@ ג%KtR믿\ 4o޼.m۶6eu)�X8$UT /pVp4Z'|3gθ47VPA+VTJd![qXz% � � � � � � @<ó`L@�@�@�@�@�@�@�r7j裏dZ'P:uht޹sLw}W[nUժU]V֭iq?fm_~֬Y̙3iӦtz,Y* � � � �Q'w^YUViʕnkGϗ&MraFT,XPɓ'Ap%n8q6oV ٲ7[g˲"EtҮIm>O+2{y5l0=zT< 2D@V_(444 %@�@�bRVZ.zر1y(p5S͚51yqiСa1youk SZ`.\V{^. =˗/Bʖ-NiҤϾŗ/_e˖ɓ']mWN@�@�@�@�@�@ Zy>oC7� !+Wy~EW"t O@-~@�@�@�@�@�@�@�@�H ^ZÇwM�ԥK=ʔ)S$?sĉ5m4eɒ5? Q$I]Қ|.H~ɣGyD\$HpW4@�@�@�@,~Ӓ%Kp c˧RJݰϟ_ &r6Q(pEeu7 swcktk͏g[B .\kĈ:wzVG�C|K` � ] upxZшKڵK3gٳp)*UjժjժXϊj>Ԟܸq-Zk[vڪ[ J8q`j � � � � � jE(C�OGA��@�IDAT@%P8@�@�@�@�@�@�@�5`�}*]맇~PH޽[Fһᆱ륗^SO=DE*qSN�?X ,PΜ9նm[l5҈۳gv � � � ,v޼yZpki2kZ@:t}\rna~+"˗uҥ.djeʔqkԨ5k*cƌ$ܣ3g4zh?q>}gUʜ�)@Vtrm@�@ zԊ^߻:Zwv\rC[㏲h)\]~j5Q HbA "6|Wk3g J2 jܸ5kYFR� � � � � �X@x3u;+#P8@�@�@�@�@�@�@�'\UD >\M4'iZSZ ;v˧1cƨ^zs3?ŋ]ԩS]5l߾9o@@̂a"� � � @\8[?f͚{رÅT\YժUSJJP\ƙ٣~ͭ*g[/_V]dm>J*.g(pqeZf=`�uY'+s:D�Zѡ5@�@� {Fʞ[3gv- @c5>LӧOב#GTdIYу>֩Ek.O.ͶOպukʕ+0?@�@�@�@�@� S@�X P� � � � � � � �}oVEɓ] ӊ=K,z׵vZ~С!j|ZΟ?I&\rΝ;5qD߿_&LOV|` � � �ĢիWtRPs}7To>uUnٳg_v d ӊ/[Ǩ@Μ9#^sZk+[c+V2d k=rHmذ!F_n6mZ+ھ}ڴi={PBzʕ<@�@�@�@ -[~Zٲesm۶iڱcV^#F`u´?_2w _|~.]څɓG5jp<y2+1u@�@�@�@�@�@�@�(@V|֙3 � � � � � � �Qz)5o\>l٢nݺ)a„w<".P`A͘1CӧOל9sTdI-X #;Oʕ5}}Ϙ5m׮&M3c � � � O&cY9rPJ\as_Q{Vʕ(Q"cE 'OڵkkСZpW_TR0a+悞ˣm™3g֛o[~ҥ/SY@�@�@�@�>}Zƍs5+B,DkϞ=?y͛7"Yڬ6?~x۷O,a…/\=߇ � � � � � � � j÷@�@�@�@�@�@�@�@ Fݫjժ>sMP'M͚4ikתB رc$#G\ܹs?ְad?o䜙 � � �+\3ٳJcbwޭUVW_U͚5e <Y@)STƍ5fm߾]ׯWHH͛˫`4hW㈈ ̙S'NƍsvTlY}w!� � � @<z9rhݺun:e!Zٲe*Lٗ&L螣|wuW۶m{jժ6m1@�@�@�@�@�@�@�( P+I  � � � � � � �5:\.\?C-ZӥK=XȔ5&yjٳg5dϟ_?>mڴI]vUdnw*!� � � �Q"p.lsYÇw8g͚nݺiX@-޽{kҥڹsz)}7*Pk;uT]|o@PP>^`6m*UhΜ9!� � � �askyz7dZ-VXq K|a`W*Rڶm%K?2@�@�@�@�@�@�@�L@(B � � � � � � � 6l<|iѢEnsW5zh 8ls)Tk:qDGQ<s/@�@�@�@ Z-,5k۷k Q \ Ν[zr!v+VPեKW9rN:U iӴl2NZuQݺudɒ(A�@�@�@�8{ -|ԩ,_;vp:RJZxLq"� � � � � � � !D@�@�@�@�@�@�@�@ 8p@ 6tG?kkݺLq/c۳g4i>s K6mps�@�@�@�*C{ʟ?Ν &h׮]:tU:  ҥKk̘1ڷo막'_3K/_^3gtϟWʕռys^:jnU@�@�@�@o~g(Q…Y-fժUjѢp7@Ȟ=F͛7+((HիWWntԩ=@�@�@�@�@�@�@�N@-0 � � � � � � �D+WԶm[%NX~'Oշzw!zK׬Y wʌ3dqϝ;5k֨O>+Fĝ@�@�@�@ \|Yo _hwjժ DRHZ{ァ… kʔ)>=n߯ 굻wV2eԮ];mٲߦx@�@�@�@ .]R^ԠA5mT6mR Ҋ#@ܹ5yd͞=[?ʕ+˗ � � � � � � � P+H� � � � � � � �q[Zs/RҥۓN<~rjҤk`P7/ք'P:uԽ{hiϺfvSN<|=j(hB{vA`yq2(@�@�@�{SjUY}bZdի&3ڳgyW_1bDիj=TlXÇ5akX| &t7lؠ_ qEsb:FԩSb +VL;wv![Qw� � � �"`Ͽ5lP}fΜѣG+eʔ2պuk_oDDVZZj{z6mZDN@�@�@�@�@�@�@�|V@-j � � � � � � �Ą#G4x` UdɘG5 ŋ]CכZCM+ "Ư5j;v,1D/ӧO> r @�@�@�@V(W ,׫m۶&mG:tHf̘+WD},$+qFuֈ-;vLsu.gΜ{E'N, <[v/)S?\|uVmٲ3~w5k,ee^Y@�@�@�@ nX8Uݺuo>-],�… tXndꎱ:P?yL[ZhV2e(1D@�@�@�@�@�@�@� P+|E�@�@�@�@�@�@�@�x"0zh%KLz'34BZe}Zr5ay<߿_/z!5lPiӦk'oH~!CN5fY_]l|oklҠA_&B�@�@�@�8('(88XK.ҿdf;vt0\fϞ!CD $? D:pz駣~ݼyʾ_Zh&`{1m޼Yo>3ϟ_վfx@�@�@�7{us̑Zaɞ=BBBTHXnhhԩ+W8#[Í9W#Gt_5*/͵@�@�@�@�@�@�@�1b!� � � � � � � X_;wV)|mx2TR_~&ʕKUTqE{?Μ9e˺bŊ:x&O~TtEְcԩQu(ի](;FŹ � � � p绐~[/m䣘ؼۨΝ;ծ]jj^w;_ݎ? رcթS'5mT;v['Jȅm۶Mք /_>ꫮ/Q4 � � �~.`n͝;WӦMS֬Yn6VŞ4?{{w^zpG}TΝC^!� � � � � � � �1D@�@�@�@�@�@�@�+Vо}Բeh_-[-h\rݻҤI˗/{ァzKcƌڵkf}&MRJ7TÆ ]Cϻfkt`?sʞ=3g;γq7smܸQlĻlٲ>}VPA_}53W;׿i=z)G�@�@�@�",pc5 Ś~:~ϯf͚ɓ'ߺx }]}kf믿1yf>rHLMs/F0M6'P"Mq:](Ƥ믿z ̠+Px:t٭[7M2E{ue/3f̘]YTxq 4H3g;޽2.]kvoN-(QB[n/kzwwa=Z+WTTcATkh"Y_Ԓ%K4}t7#YVkDlasV.v}׮]]xs_گٳ؜XG Ydg詧ۯas$I1WE�@�@�@�(* zTL/={P–nlཌ^V -ngx8)SF'NpZo߾ʑ#ƍ瞁,w'|7ʕ [nvpVmZ?ff5E_v;Oŋs ,pςZݲm۶:uT5\{2{.5((H'Ntј?C�@�@�@�@�@�@�@^Ժ=E�@�@�@�@�@�@�@�& րBc0W^ц O&8ɓ'ZۣGʚeX֐H"[5U2e1Xvڹ+kPZ5T6.[5~<!ԩSտ͛W5k ;5mڴn߮y/_>FbFXbkBS[_f � � �q_O4ŋ/ J"4i׻@-YOkpfU\}{Vg۷o׺udUTqH٬]B>4o!Re˖uAeu4(]oǎQjldsz7>ZFdmm~;vTܹ][kj5F(\{Bرc~<N>̋-sMdW^ԩSw۫N:;9sZ~ R|y5lP… ] {mZ wVfcXα, L:]y'5j(15f3c? ִ~]X7a„t钫n Axf|ݯ=z衇r?W /ַ6VgժU]#h18�2dnZ/^u8g@�@�@�|WjK -N59s =hwDE}y.hjӦMz'd!p޳V5c WwՃΝܩ8~xu='i·~[mڴqb~gyVS=Yxq9sF&Mr?;e<Ş۴}|:~WÍH!C= Ԋ"S.� � � � � � � s bV @�@�@�@�@�@�@�- FmhY\5_feZkז5>Ӱ*k<á-ʚ1XS`[5 ,0O>q5p(Y|Ǐ&/^uEdkڳgϰq+WǮ83kqС}@GUuߐ{!z. (]R@@E) (" MD 5>ݼ2I&ɔY23C\\ɓ}BM|DW=yĞƸm۶DBC�@�@�@�R?41"-HM[Z H %Mؕ6-E͚5$"XZ$Ijـ�BOZ,*QDRhQBGҦ5Ʀ-]tcS3fM Ddzu,-|w^SG kQ]0O/K,P^q͚5kB? |9rHƌ٧4EIc^={V&Oܹ7oR`Hj'mӤz?Vj|`|KMX{a=DؕI]_Mz\ҦRW˖-3ڷoo5h@VZe ~WzX'Nl uiQ㳎ִc_DǏwkQ^z9/6Ѹ � � � @TϜ9sT/ $߬XJ5.#zƱcǎ9Gʕ+C1ҥK`HDOB_s61ի˒%KD5;tPi޼eҥ&ߙM6yI}kN8јիWO*T`X}%L_cfG<QF ٿ<~8FgH@�@�@�@�@�@�@�/0r% � � � � � � � <dɒ".\h ?hBʕ+g6M4?~s3[lU4ha=O_VkٳDYf5IWVMRH!'N0Itu}~kly5jI~In1clٲҷo_uhb MnۤI$%Ke(cݫFؼƍ>}z|76ǡo@�@�@�@ ͛7ъiHL4y5҂{Ƴ*U*dU(IjH kMO>ĿΟ?r+ʙ3M-txdze3g&QզE"NZdKcڒ$I"ݺu3hM i2Xg=z0|ѢEx՟%Ҙ& ݊+f⡺Okp￲|r駟Bb={4Ք)SuIƼja,.\ؼ-nMtZ<L2sNSK~gGiz:-n4ή=j~uZzuNpbMd:uj'^SG�@�@�g8wf=@}>0^MkLkaEҥMkׯu.Z**-x+L<Pc[ e˖W[bzu3}W>gpp̝;W8ZrӶn*N wΰ̸SNm܎h � � � � � � �LZ1j@�@�@�@�@�@�@�pbMEb;v$ ܳgXۑ#Gɓ2p@3a^?ۯI5u:S*Vh>?~ܼZ׺&*xVj;tPȥ&MMڬY33%Ug7ztVR {4#$@�@�@�S@iGkmڴMzyWEps6q۷o2g,Ǐ7ݵRux-q =Sd*Vz }EmjδYIo#:/~{޼yK/ٳ`rJsBӖ.]:jEM~4!>|xHlu&ǒ&MaWӘ@8qbY/ &տGw?M kbM6ʕ+ˆ gB dȐN4u� � �N(<}{>ۧG|3WظcDg{=Sjr}Yfk.tw,[jauh=h_CpC>yyw޽{ofdX˰grbsq � � � � � � �#@A-W@�@�@�@�@�@�@�,PP!9}I`Mwa14&]ps?gn˒%KTjժr7qƙƚ4_'a{|3y!D  � � � Zj%ݻwۭO{tc?,^X4vn:ѹiS-\ř<y"[ks΢Ebi2ј=zdw^H1m+F:uj3]uTo={eݧ+V<ݝ;w'^kbޫWw.]juMΝkS6;A8W[-[fRZjIݺue׮];1FG;T � �@:u̳usؾ{7Cc^$E2c 8ރn,)S&3-[;{?35_-̜Ċ끨X>ӑ?\Rj׮m @�@�@�@�@�@�@�V83  � � � � � � �8@ժUM2ҿ+UGC߶m 4(䳭o4MlϞ=,YM5kno'O=zHldĈcXŽ} � � � �.PbEi޼;v)d/޽{˕+WM6kV7n7oF8Ć 1-EkI>޽glvV-&q9ryjЉ]6-"?+ k]f-McZ$ W[8} 0@2g,}|Wf-Uxq7|#_Hwz Eo/)S%KCNյtIΝ;/бذǬcǎ56Ԧ-m\kN?p؇~( 2Ѩ @r~w-f>|pdr%Lv7#� � Oe˖_~YFO3n.&G|_c״G[-Zuٳt%S#Y<Qc/{fRW\Y_"g$5Vw-YhQȸ֡CxbH!1ܐ>W/ȻG#2  � � � � � � �ItY � � � � � � �8@٥RJ_}8UTO?Izd֬YҫW/i߾L4Ɍ$:uʼZDĉ&ԩSgѣGeȐ!.]:/_4͛MYM矛ĭUTy;vH&MB uVCר^{5;F � � � ̞=[R֭%00!CMfIU5驷MZ|ւF ,///ڵN_x9C}ɣGdr!SKOs9WX2'Ö869~'fbiVmhBTj6M`IR[je^tZ\1~嗦JBAӦ÷zKri֯}ҴiSLvԨQ<k|Uw^pĉ{g֨Q$AuVVM+˗7^|ټ/7n}VX |-]Tlkqʕ}|s_;ak!M^)Yng� � � `oɓ'˚5kd޼yڦlѽ>iαeP{7u,=j%3}o˒%ԭ[mkdD=֩S<clٲ~׮]+3f45N[bE[<?#356?~Ѣn(k.??ر4k,Z%0 � � � � � � �D(1i(@�@�@�@�@�@�@�@�H4|gЕ&WK<ԬY$8xIb.ϟ/Ŋ3i[Mde˔)#?G4sLW^yERH!s6|7?EjrY}dZ+~m].ӧO7\pIJ޽C?6I5A 9;0`hq/[w7'!� � � � hHN0ĖϦE5quŋe+W.3Eɉ'L-9M~q--/_>ٻwh\mӦMRjUS$j211M05krIɜ9.]:RJ(ajի_i,Mث;sT^]ʕ+g{N /8 1¬U6l͛7D: &V2d0cSK'*ToV%Jd9ZL }Tk]Z QFũtzRLi欅tn3E&A&Fڷo_OJJ>ch2[6lPƎkH-C9r䈱U7Mؘ&k4n~z$3f0}+R)e3F,xQV8WPBҽ{wL\8Ξ!�___@�@�-4ɓǙbl<-̞=-l]fa ԘX;w&L/Zg/_nbRBZ,3&MgӟZ*-xE4nqd+볓3sx%1Fe>~<ѣGأ}nu}SKdLu߿W(k.?9W_}[5 � � � � �%>WQ>ugY W>"O][>+5%xH)8g@�@�@�@�@�@�@�@8&:ț7I�a&Q&1m:gM;A&Ф2e >7]M(_5ss&\IۦM{vm�٨QD@�@�@�@�kfΚ58<x@фZ,+tkҤIzeSHjݻ 91l8ޣG… &ިI5Մi[M ;wwΝM"፭qEMڛx1BSj4{G~I?SKk){@gM_M3gΔA$_}{_aܨ M:gr>}d|z\ hGM~!<3F�@�\@Q+Vvf Mha0-]F g^|Rneܸq(ZfKsW|SӢP4j;vHl$s"'?raɕ+Fؑ1E|%J̨/>s?hLe˖ryO!� � � � � n=].YmeE jO_y<7\y.v; � � � � � � � Z J k"som kBژ&;!&i Fz| ڵiӾ\OOOڵ ϱAM۹sgS8b1-{~@�@�@�@� XɁǎ+ZF. iQ^iiD/jU1ERN̡9CTcbi1kM)RUTFn%BVEYW-L^q?XVXaރ 6Biz‹b2e L2*U**t& VcW۾} 0@=j:t0n 4v7x1cƘzop`8.EB :d  � �ƹȻ> sN0abmE6̘1cdS3ǵ`)(|JF%h Y<1C qVO'ϟߚ3/>s?hVTG-p5kV;NW � � � � � � �ĭ@_>qNFC�@�@�@�@�@�@�@�"VȻ+E*UDx3H& <8ҩ+W.s'Oģo6IzrlB�@�@�@�Q@ :&߿x{{K.]dРA%4?f/h11GOx7//K,Y{\`׮]EV^-ݺuUVIc>:=Ė@$Io߾N<$:u 2Dz-V~p-7n0@�@�OO>RLi׮2m4_@8r<q֬Y&Qpa9ylڴ9Wbϑ}rذa2sLٳO@�@�@�@�@�@�@�pf j9c � � � � � � � `7#G4m$d49BVj9AAA&nie͚թd@�@�@�@�ȟ?)̳uVѸ&6mٲ)RfxPڵٳA {ҹsgbb65&Jq?~l~j7J۶mÑ3s3 HB|||W^2n81bL4I.o$J(jr6N&p} j9=c � �@ʕMeСҨQ#iҤ)nKuxbCeR\<5>Gb=9sѣ%mڴZ֪U! � � � � � � �!0>eL@�@�@�@�@�@�@�@&L(}TTIj׮m:e>>ŋeŊRbEwY:D�@�@�@�*PJDs8qbW-ZT&L .]XtIV'O,ׯ_[nɟ)mڴRA;&Æ <y"rŊݧqi///_ X ]tg$-Z0)b}PPPr'C� � +JJN*{-[D l+,/^дiS߽s;^΃3gΔB ~:tbZ` � � � � � � PPo*KB�@�@�@�@�@�@�@� $ID/_.7ɅΝ*ȹVZoڵk}vg\� � � � `*T` 9sFx ={̙^KqFIMVBoI&пs'N+Y .Ȕ)S@q=%ƋG^z$BjժU3J,)+WY14'ӤI{3 � � ҥK.֭˗/N B(@SYKOOϨ_И#$w&عsg9u|� � � � � � � + PP˕&kA�@�@�@�@�@�@�@� hb^*ݻw:۷c/D.zj)UܺuKv!5jԈ"@�@�@�@�Y [l&uq믿L1-E^ID@ zw^=z+WN+ӦM3|}}eϞ=ҳgO Deʓ'̟?_>l hB*U$ׯw5T@}Mh@�@�@�G]lذAm&ҥ-[J|dԨQ8#͕ (+V͛Ɣ-Z$C gϚ~i � � � � � � ��\&@�@�@�@�@�@�@�@ 䣏>kךŊKƨO.Xʕ+ҩS'iڴ4iDv%  � � � �H@_ժU3fȥK~}&.S`Aݻ,_b1bw|,\Pt"ZN iR~}<u|gRxqw`Q%KݻM!M]NB7 ܹs{w � �˲xb9stUk)Pjt'Oo={YJ֭%a„j*9~_RJScL@�@�@�@�@�@�@�LZqF@ � � � � � � � lՓCZZjÇm;@0a*T$Xr̛7ORLsfb � � � xxxq2eI{@ȑ#Ҷm[ɐ!/_^  +V7nA JϟEI=hѢ&y#N:d([]V/ +J-vK:o6\gE@�@�\Q {2|pY~)RD>#ɑ#)5~x9z+.59Mnݺx>zA1b\pA-[&52hL@�@�@�@�@�@�@�XV1 � � � D5��@�IDAT� � � �@e&[TRҹsgdj!/$6lK4Asfb+"� � � �Cdɒ2x`Z hզ-[DgΜYK.2k,\? <x@m&&M6mHܹ%W\Mѹ7+V>}H|nL9jԨ![n5?wO>-%JN:!jiӦuƩ3g@�@�pC H͚5eΜ9rgs+Pymʕr]7b8|~կ__2d -['Nƃ4.{Ǧ?@�@�@�@�@�@�@�]'@�@�@�@�@�@�@�@�GD{~A>^{$/(S#Lp=7o?^^*o 2$u3A@�@�@�@ RH! 64.;vD۷o7;wHҤIE qilٲRti)Zl,I}!ٷo4g eɒE*Wl fkr$I$NR7F1b.\X~m6ld͚ѧ0oB$� � �N)(QYdݲf͞=[B�n/S8tPP5nذA6n(7ok׮IƌE j͝;W4h`>٤@�@�@�@�@�@�@�� � � � � � � �%0aBi׮iF~'OM;#m۶)S:֤`6vΜ9h"|V i <Xr�c  � � � � JJ֭k6F;vLc6M,_C *$%J0-昭crx?~$lgΜ`X"k1Çsmi/o̟?_F- ,w}W $ҥ{D ^j9s #� � �1g+Vh#G͛7寿իeV"EJ*<'y{{s_| 3ߵkl۶Mv!wܑdɒI``)Ȧ]')n3{@�@�@�@�@�@�@�H @�@�@�@�@�@�@�p-[ȬYdҥ8qbܲUVRNI(;FM>EǾ{ٻwxyyI=SN.s2j(vZD�@�@�@�I@l8qB8 4ÇXQ$IL-i… W}OwZ\b gi,k;r˓'OLBc-VX1)YJ*Eؿ5 Ȍ3>3I()RD7.A 4Q/,Ν9s� � `W5kߗMf~㺳ׯyG5jԈ:'ٕӮi᤭[>G}vٷoHɥtfӘn(͵.^hM<}Yd<yLUk3iŲh"]ɚ5)ޡC)[k@�@�@�@�@�5֭?o1Jokt�I+O_ϯWԩtCA-7,@�@�@�@�@�@�@�bW@c|?Ν;%mڴҬY3iѢ+&M؝@<,_5#ӧ͛KǎEj#aYօ� � � �OoѢFǎ3۩Sf(- Gs-r"٬=o B-gΜŲ{U&MT ,hi"EhQ7=FCgĉͦaÆI%qδ +W4FH7%"� PPn)'9=hF<tڵL[\~! 0VѢEM̪PB,Ydh,kk|[z_͛f9r0ʔ)#ʕ *~M_Mq'NeNDkeϞ=؏� � � � � � �#@A+ jEߎ+@�@�@�@�@�@�@�@�pΝ;'K,1ݻ%AR|y[ԩSǼw]Ozd̘Q6m!RvmI(QF5t7Y  � � �ĵ@``)tIS zHgϞ5fuNc˒%)3gN䤡lٲK/Dٸ4˺t.\ ϛ?2zʔ)%o޼e[„ C  p dƌgȑ#cǎ&1+589s?۷o;bX � rIwO2#-uQ5En 2Oaia-+-r-SpM'O"CǩEcRJeiQ4݊/.%K4NFshٱc|7xbsyδK.ҢE Ѣ4@�@�@�@�@�@ �Bkpl jEPP+v\� � � � � � � �D*I]ؔM`xzz$ *T+Jrp’8qHXeΝk.]vM$I"+WzꙂaeʔ1 >k1. kC1@�@�@�@ʕ+&ILubJZ\zgY6mZɚ5ٴV̙۴(| $M4n Eo51[DZHcsWk{}eYiuZ KYU k2<yM' wПGr|l)X >\/_n;Ԙ � Բ)O8L&-u1SI 9:.]XX9$-[68yE,Ų4G-1k;wAkYig9k i3-ve65#믿5k֘ڡCڵ*U*_@�@�@�@�@�p2 j9 c Ԋ\� � � � � � � � &rmݺӧOTZJ7M|K"E̦41%K,bt\kM ۩Sȑ#!&զj؇~h^˖-+=-@�@�@�@�V A!ű*U:4vҥBLkKZ4i覅ӧOokiOjAЯZt+um6E&OW}(ZJw>ݾ}[t8n{-ӢZ[Ci JEZEѬzh &О3g 8P믿.3fԭ[ ؃@ 5q@�@�@�"J,igi ̙3lZiݦ"QVX-SLlոgMuCb_oܸaiA2ݮ^*jC'5k&˗/+'OM%L0ikf6>_:o<6m)SFy[)S1  � � � � � � �q)Iڌ� � � � � � � �n/7o^ѭm۶B;vLBիW_|!!^W4hr Mk{MtK(ydڷ& ^;wBjۛ7o.\0ꀚ$CkxyyIR}RhQ6 nC&@�@�@�@�Y iҤ OuilLjT-d{iU-: &$IZ\K7M\:tn[1<}x)̥1=}5{EjX5{k_W k ^?kڴ@w^ȦE4Q5jЅAe3f4ˬWMK׈Dُ@ ŋe#3VD > W `-mGD�@�@�K@](QlǦP˗yn'O۷>'1Mc:WoZL+U㚞&i5DOܭwb5>jVcaE9KX,d֬Y3-[6ް}8gA̶yf/_~o!=zhka> � � � � � � �DUZQ|@�@�@�@�@�@�@�@Z�Xbf ۭ&=;wμ^tgϞϚ JdBNX yC'դVA.MQP!@"gΜ[\DIh  � � � �$Et+P@17-emULi)*@ ^TV"X=_ W.feX^Xk/g6[a 'Mj\Mj%W-xe &Mcri J_~El"C _~Y5k&~if(UF W\kB�@�@�B@cr9r0-X;w}sV^_ Oi\3tA,0VǏJp檐8(Cܲ⛺OcVӧOrLk 3^ݧuVZ5mɲ`={̜9~#Z21`W]?B�@�@�@�@�@�@�p?o%@�@�@�@�@�@�@�D cƌ[ҥdL@�@�@�@�SV.WWfMSgڴi=G�Zl޼Y~W%KJeԨQ/_>9Ss`тZ9st@�@�@%PnYfL.Oc"׮Pn7@tf۰a̘1C:w, =z-K,n‚@�@�@�@�@�@�@�\O -!� � � � � � � � � � � � � �-ШQ#ٷo,ZHv)^^^һwor{ðXW@@�bU@�@�@�]W^%Kӧ7ߔiӦI\cǎ~wa � � � � � � �N.@A-'L@�@�@�@�@�@�@�@�@�@�@�@�@�O AҦMӧ˪U$2d}vx {FC�@�@�@�ȑ#3FΟ?/f___)SԮ][~W  ; � � � � � � � @AX@K@�@�@�@�@�@�@�@�@�@�@�@�@�@Q<==ߖ'Nѣeܹ7o^2MZP+iҤ-[6X K@�@�@�@9w7|S<(֭DIƍXb2| t0K@�@�@�@�@�@�@� PP � � � � � � � � � � � � � \yr)ywO?ˌ3H?.--֖ A1@�@�@�@ @ݺueڵ+˗ݻϔ)S(Ɗ � � � � � � �)@A-Ǽ/ @�@�@�@�@�@�@�@�@�@�@�@�@�ԩSѣMa6m/^^^pB 1=MnX-D�@�@�@q/. ,'OJe'O3fܽ{q'@�@�@�@�@�@�@�^Zn��@�@�@�@�@�@�@�@�@�@�@�@�@�Q SL2yd9~ԨQCt"J9X;& COt� � � �ȕ+L2EΞ=+o7N+~)L � � � � � � �vI@�@�@�@�@�@�@�@�@�@�@�@�@�pM<o<9t)ԬY3RlڴyLB@ jyyy9\ � � �-EΜ9#}LJC�@�@�@�@�@�@�@ (7@�@�@�@�@�@�@�@�@�@�@�@�@�@�G(ROk.I,ԨQC6l(w1th… ;L � � �+6mZ5j3'&M/ +G�@�@�@�@�@�@�p j9̭`" � � � � � � � � � � � � � @ /_^?RlYi۶8q"' Vرcfn^^^;G&� � � �W*u)y뭷G ,(_}<y&@�@�@�@�@�@�@�MZF � � � � � � � � � � � � � Ԯ][v%K.___)Zt].^踓ff&pQI&dɒ% � � � 5رcɓҸqcٳ/^\V^8@�@�@�@�@�@�@�; PPNt� � � � � � � � � � � � � �@˖-СC2gYv,XP>Cy+.5ES@ jyyyEj.C�@�@�@�Ȗ-̜9SLQM[?p@|N@�@�@�@�@�@�@�PZnxY2 � � � � � � � � � � � � � y7駟%_|2fw^T\EWDz@�@�@�p ҥKe˖-&SlYz{�J@�@�@�@�@�@�@�xV&� � � � � � � � � � � � � �8@$Ir)ׯ|碉O.αf+~~~RhXN@�@�@�@ nT";vN֯_/ 'h � � � � � � [ PP-o;F�@�@�@�@�@�@�@�@�@�@�@�@�@�/*U*9rK6mde,EctJ[n˗)Ϥ@�@�@�@ |mʑ#Go߾#%K?#ً� � � � � � � (eD@�@�@�@�@�@�@�@�@�@�@�@�@�@�Q SL2yd9vT^]:u$K_~9v͇6k/Vp@�@�@�\U y2zhB IݺuCrUW]2B�@�@�@�@�@�@�G j#>C#� � � � � � � � � � � � � � ;wn?:tH'M4jժ֭[]ay!-&Mɑ#G$gr@�@�@�U o޼b YjlٲE)"s̑`g]F�@�@�@�@�@�@�p@ j9MaJ � � � � � � � � � � � � � 3 -ZT/_.۷oOOOZ4mr0gZbl;@�@�@�@4'o[W.Ǐw51y@�@�@�@�@�@�@� f� � � � � � � � � � � � � �@JdÆ fx*UJ:v(OvgVş'@�@�@�pY)RȄ dr=AAA.f� � � � � � � 7ԊgFA�@�@�@�@�@�@�@�@�@�@�@�@�@�NAw^dǎ%\v,\yr@�@�@�X@ڵK|||Vre9zhp@�@�@�@�@�@�@�H( @�@�@�@�@�@�@�@�@�@�@�@�@�@�/ Ai۶9rD Ytϟ_F!wލ~\ϟ;wH%b>L@�@�@�VڷoI2edq; FC�@�@�@�@�@�@�p j̭d! � � � � � � � � � � � � � hr=zɓ'eС2uTSXkҤICǝ83{9^XA@�@�@�pmoooٶm 8P+ 6˗/Y � � � � � � (ewR:D�@�@�@�@�@�@�@�@�@�@�@�@�@�H y2d7|*T,X@"*p!ə3MAgȴ@�@�@�@ Qd˖-r )Q/q5< � � � � � � ��\&@�@�@�@�@�@�@�@�@�@�@�@�@�@ҧO/ƍ'OJz[n&ʕ+m)n=_-Uxq6` � � � @JҸqciڴ 8P=O � � � � � � �#@ApP؅� � � � � � � � � � � � � � 7ٳgs-^^^Ҽys\l޼9n&(1V@�@�@�H2,X@ϟ/3gΔjժٳg]v, @�@�@�@�@�@�@>Բ# � � � � � � � � � � � � � �@p²tRٹs$MTW.M4__ʥ)c9v/^<6o@�@�@�pbΝ;ݻ޽{RlY?x5L@�@�@�@�@�@�@ (� � � � � � � � � � � � �IJ@pplܸQ "%K+WD8[V-iܸqw`ԩҷo_6-BC�+PBY~]V.]$K;ʙ3geӟw[6E(]k|-Zl۶ZpHB]f>Gw55yQy=~<zH+8@�@�@�_.g6ŵ'Lܱj*ɓ'[.>c)RQW4h@ƍa � � � � � � �'@Aسg@�@�@�@�@�@�@�@�@�@�@�@�@ Nɓ'E ʓ'O"7((H:$}ok[hhAmr˔)SdӦM/_>I:f_@@r @e޽gۥp¦&؎Ͷc2g,&MP7nܐ[ʑ#GZhh>GwX؉Gv<|Cl9s@�@�@�xN 88ylذA~wsӧOٳgE_iH<hyc k� � � � � � � @h j= � � � � � � � � � � � � I$]Jj">9q)0/V@S?-[Hڴi΃@�[$H ڵ3?? QFgKQ>'{-[6ѣ)>shi?莡i k";D! � � �Q?eȑ2-ݫWv'޽{_~wY~ԨQC\Kf} � � � � � � �QvB� � � � � � � � � � � � � 6 ERNmӹIŋZjY}M.tMh @DLRm8pL8֚6ms(ɛ7̙S7o.YdٳgGɓK̙M?]1^";<#ۧ-iG�@�@�@9gJɓ'!9+Wy&5k֔;vݻwB N@�@�@�@�@�@�@%(E � � � � � � � � � � � � ,[Lڵk' 6޽{o?~,C ={mРA漀�Yth"$Ye2eYjId[re3fL9~$H ܱB?~O$CӧԩSG|MB{@ Z)RÇҤ ///YhGϰi9rz뭷ϯ۷o.\(-[ԩS^z+Wg#XDcիW՚`> ȅ L/_x7c/]GJ"E":~@�@�@�7bIjժɵkdŊwݻw?vZҥԯ__46uz\>>>rsJDS|^{5v֭e߾}2i$Ycgyiիٯm#Νk>裏Z2|2l0iҤzh (Pđ/UV5k<{@�@�@�@�@�@�@�RZnyY4 � � � � � � � � � � � �8jyeڴi|r9vOOOI<_l$pՄZ|fƍҭ[7;v9$M,Ih}pΙ3gJ5lٲW_I̙m۶ji =2fh^?~\T";v2eDXd0*c.\X*T`.yw$1c)T?w̟?҄iӦ>>;wMZK !jEM.~_tL'g&ɇ Q-hFC�@�@�@ @d)S߭KN$W\!]hLߗIʮ]DOWiqɓ'õHbŊ` w˗/E5q~B\ON4m6i޼)⭟?ѢVС$LyCriy%gΜ2tPѸ }Nn&]tn:߬Ygb0nN@�@�@�@�@�@�@�z� � � � � � � � � � � � �$p]9xIajG= -5h ټyI4[vmI8dʔIk,ֺH _M8|,Z۷ڱccΜ9rH_M7xC|Mɝ;)UzuYd,X >8U@|7~ɖ-4h@jժe OG+۷7#חٳg5bW[n57mrްaBއ}})LiSN5~_tL츞ck;w)6h � � �[0`,YDMGY>y{{Çe֬Yg;wom0[S KYi,رcӋ~sM%H@ `kl矦XWM`ر!󪅵OOOYc+W9G5u5h!DB||.*� � � � a>6 $KBP"4DJĀJQiA&UE"U"" MI%$ONBHIf&Ϻe{Yz@�@�@� \9C�@�@�@�@�@�@�@�@�@�@�@�@�RQ@Tn߾-/^UҥK͂={|AAAfٟYd 2:)S&^Ed.]Zڴi#fZs0,^VZ֐- .u7 5ůoݺ%5j0?W߭[7ٷolܸ1.ooo_lcJw܉>؝Ѐ0-*իW7YlK*e릨@�@�@AY*׮uKe>2뾖ӧOי3g9˖-[}YJ(!W^5<;u֬Y}r1b뜫 ߗӧkf/qS-*Y2gskdѢE`uOü,EWN}gҧO裏� � � � � � � J_ϛ"� � � � � � � � � � � �  d˖M:u$Ǐ-ZTipLܲvZ믿}k_r%;r9/1KݺuÇ<> `Uz͛͢hȕ.Zv6m* '&X[:_)76SzNȑCrʕҪ@�@�/l(9>XZ:G}MСCX۷o8 =ڎ;`i4iy1bԮ][BCCeɒ%f\hhÊyԩ?~3_azsN?=j9%oɓeС&X @�@�@�@�@�@�@�'HJg � � � � � � � � � � � � 袱ӦMsJBdʕ/>ӧݻwu֒0BZtAĖ<yK7n|:@Z2_,]TJ,)uXXXŷv*7k'Dܐm$IѣI@�@�@�\Z%v~QZq2fhkVrرx_Z57۷M0 ɚ0aXBKZdhӱcGYfhl۶͛7%$$؋Ws2{l/_~^A@�@�@�@�@�@�@� Py-#C�@�@�@�@�@�@�@�@�@�@�@�@�'8{K۶meϞ=RJY~/ 6>H4} &[N-*+V|sLCb5k6lyXon:@VRꫯʑ#G>00(QB>s:v5P޽{*ц5/^ܚUR � � Q<j~uΝ$ZDwsK4H]v{IE믿u5i$z;=͛Wf͚%SL/]xC̙;wFף烂ɓy@6md̙f3 � � � � � � �N'@=R� � � � � � � � � � � � �* Ď? /gΜU*Tٳc/^4W^HFdŊ Z􂰰0s][׬Y#ׯ_7tאO{i9w\ҴiS@/ Zpa9Gܹwމ> \҅uq2eʘc.P_ *$͛7o\Z筥8q^tr(Iq۸pႹ_c?@�@�@bؾ'@b2$j~`˗e̘1r)soN>mY^_{5ɒ%,X@~ioG(cǎ5>;ie˖M+&m۶55\ͧΛ7O,:'N:f.ޒp_ 4Ȍ7Z~y>3fs;@�@�@�@�@�@�@�!ڧ13J@�@�@�@�@�@�@�@�@�@�@�@�@aKiժtE4K]ݻgޯ[ΌW^K*Uɓ'EI֭eϞ=K/$_n޼)+W�޽L0A^~Zѣ?CyePøt:HNblذAraW@ U4Pv:tHի'UZ5Yre믛{uիW{4$P#Gc5n[`µkך{)S?{s  Ha-܎� � �pqqy%G3?X|yT|$W\2`�3W&��@�IDATe˖ɰa%HItnT_EciӦ۷w3yu \rҵkX_}[d 7oӧi\!Z}ƍo-~~~2x`s_/AilG!FJ\� � � � � � � .Qa{O@�@�@�@�@�@�@�@�Hc],C8|@�@�@�@�] {Rpaٻw={V<==%wV,>;|p %Kk@oѢEx)@�k h{'<Sfa{8m}^^^2iҤv @�H'O< }?~C… 7o^;X4\C.^CMd%"Qr )VX"uW4t׼&E9,,L#6}9WM֙3gLͥ^~p(QBd;I7nWf̘!:tHz܁� � � � � 1N2,�8@?_+W$߯8m6(wL � � � � � � � � � � � � �Va,XЪƬ,k֬5J\~jk8Pا@Jdfw} mV b¶^GBCCΝ;R@@�@�@t>H(85x(Yd՛MLޫ9sfR_R&лwo9wtY#<L*n@�@�@�@�@�@�@� Pn C�@�@�@�@�@�@�@�@�@�@�@�@�b <yRڴiZ,Y"/^B WK/I- @* ԯ__y=z,[L͛'%JK RLѢEeԨQnTBV @�@�D h*.0aR܍bŊȑ#S\Oz`s/lڴI*W3 � � � � � � N?B� � � � � � � � � � � � �8@%O<V.@k.SoHHl۶Mn߾mvW]^b믥N:)G~I/߷׮YΞ=k.X`@�@�H/{Jz/tl<yJFS?؃v+s8SL5jH-… vW:� � � � � � � |ʝ � � � � � � � � � � � � �%#~~~2~x6Yq4�7*UȊ+dƍ! 2dtY_ss V{xxH9DŽ"� �   (_ɚ=<Z@f~G֭[իţ @�@�@�@�@�@�@�GpuO@�@�@�@�@�@�@�@�@�@�@�@�@� xyyhܬ 5"�#Pn]ٴi,_\ʕ+'/^nݺI2edŎ3իQ ga T� � �WWW,"�Qr%KȎ;䭷@�@�@�@�@�@�@rp@�@�@�@�@�@�@�@�@�@�@�@�@�@�R.иqcٳg̛7O|||رcҲeK͛7!,,@-~~t@�@rGFo@ *V(3f̐oFfΜ - � � � � � � @j ZҴ� � � � � � � � � � � � � � P...ҦMdҤI/_>믿$ @5k&vX׮]#PZԃ� � #\]]%<<WqH|޻wo޽I@�@�@�@�@�@�pN2*@�@�@�@�@�@�@�@�@�@�@�@�@�@�+ I.]ĉ2vXɖ-/R\9ڵX%Ǩے!C,D�@�@ rgH@v#F2eHvݻk@�@�@�@�@�@�@�RM@T!@�@�@�@�@�@�@�@�@�@�@�@�@�@�G^zə3gd&TjԩRhQ0`ܸqÑj% @�@�HnF�USΝ+:Lƅ� � � � � � �+f � � � � � � � � � � � � � �)Ȕ)|G&Xw)C  ʄ ~{ ) � � `{P-[8@ɒ%eƍs@�@�@�@�@�@�@ Z@h v@�@�@�@�@�@�@�@�@�@�@�@�@�@�H@9d̘1r ر\~]z!E%K$"D�@�@�"ZZݻ+8� $7.]۷A�@�@�@�@�@�@�p`w;]G�@�@�@�@�@�@�@�@�@�@�@�@�R`Ϟ=rXc 5-+Vuto@�RW@2m4裏O>&L矗 *!*6n@�@�@@,Zw///PEvݝE>g Sf }-ĉ\|g֮@�@�@�@�@�@�@�RI@T@�@�@�@�@�@�@�@�@�@�@�@�@ 7n={>p-˖-u|ݺuj  vŋŋĻw.6l5jH dɢ睡 1 � �8@ L?ܹG@s6qt@&@…eԨQfN}RjU7B � � � � � � �6py 4� � � � � � � � � � � � � $_|Q\]͛Wի@˗˟)+V5kH%$00PBCCm%,ocdG�@�@Zn߾GxA>痨I|tSH]J͚5孷Jh@�@�@�@�@�@�@o@�@�@�@�@�@�@�@�@�@�@�@�@�.'OiРAZ$...3 �i*/{쑕+WJbdΜ9?jwyǡ2f(7nHS[G�@�@ x{{޺u+ q:@#K"k?2.@*:_˦Md޼yVJ@�@�@�@�@�@�@�RW@5@�@�@�@�@�@�@�@�@�@�@�@�@ QPwo>K8� `'5cǎٳ%{2rHɕ+|i'L|72e$7oL \� � �пk!6لhCVD\XCcG# &Pzuԩ 4'0i@�@�@�@�@�@�@jmP � � � � � � � � � � � � @yqww]ŋjժ=<'@�O@eܸqQ[o%ŋ_gQ֬Yի \)@�@�@̙MUׯ_VԃeiD-* GСC2vX[6C � � � � � � �6 PT� � � � � � � � � � � � �T K,ҼyxC4hSN)m@�@Uzeu~ʕ+ҲeK)]l۶- z&s%@�@�$sDZ]AZR"+R@{-G0[6E � � � � � � �V PʠT� � � � � � � � � � � � �XKॗ^?Pk߾9� 88dz+rQQԮ][N<iɝ; 00  � �V SL&p];PGfDY^A #_V� � � � � � � `H � � � � � � � � � � � � -4i"hrRR%)UTüG�p@UǧN*.\M֭[GZl)wܱ͛+$$.G@�@�p6ٳKhh 8HV{@kHM9rH^d̘1M � � � � � � @ J"� � � � � � � � � � � � �Ȑ!iF<<<qZcǎA�p]yٲerQ~Iʖ-+ͳ.\v7:� � 3 ̙S._CcLN"СhYcZ@G"""d„ iZE�@�@�@�@�@�@�H�ZI&@�@�@�@�@�@�@�@�@�@�@�@�@ ޽{ K۶m߳� \>>>uV9vԭ[Wڷo/yfeʔIN:e7}# � �8@<y<D dAFl!V٣>]tJtn� � � � � � � `j3 � � � � � � � � � � � � |Iɕ+pZVCU *E: >)"l۶M<==v@wI @�@�@K?dDBxxw "m:SΜ9#/v11@�@�@�@�@�@�@r@�@�@�@�@�@�@�@�@�@�@�@�@䥗^w]6t�@�/cɺudѢEc)[{JlpeR6*@�@�@ @|$$$$a#`WQSrOD}l)؅4kL @�@�@�@�@�@�@�HX@}8� � � � � � � � � � � � �@``ܿ?j1ZyҼ?t�@ yٷo >\[@'Jxxxw&ҥK&4� �  .,ONCg$ ?Hd/;Pjx7eÆ t1^� � � � � � �8#w#� � � � � � � � � � � � �$&׮]0ݼySnݺey {,缽%{ %yxx^1cF}=5kVeɒvٓ'}A�-?{-AAA2x`ge̘1ҨQji@�@�l/@퍝s7nWݿ}vݻw%v޽:_ik˞4Kʕw|KtwwUyzzMZ5C fyL2P@\zJ)"3gΔC={@�@�@�@�@�@�@�;à+ � � � � � � � � � � � � `?lppp!r]xѼ^tI._,U^jMhk|!W@B+ft[KVl-U/K=¶-[6ɑ#ri^s%y1[ܹk%_|fۇq@�qIϞ=ߖ~Z6m*G2eئ8ǏOE�@�@�k h!ܔPWfQ\b6w}kXX>vڵXz%@KUt>RC4JCXŜ ,KV|s mQ^FyL M&׹Θ^o ;w5$s^Ǣs3g6:w9ٳИ}2'J0W" ٳgː!CLțt"� � � � � � �L@t. � � � � � � � � � � � �?^4�ɓr9}tܹs&HKYtVKL邫˗^xU[agʔICR?# 2uWRcmi.s1O8!YYmpUõ ( 6S5L7 �X_TRdYfG*V(=zgQ޽@-?ZjD�@�@ @@X2F.\`CBB̾ί1,e4@*n`+ }Q:Gp3,J#uӹ̸szmQvReի֐0 ֊%D,k|cj,dwYp- R<y2G+3(-СC1blܸQq,C�@�@�@�@�@�@�ұ�Z3t@�@�@�@�@�@�@�@�@�@�@�@�U@ta#Gz- ҅V-EC' *W<SfT l8.BECSRZ<==E7]|7E@X[Z.>Zs%dɒѯ诛R^@�!РAٹsL2E  3gΔ?XufP jѢE2z- � � XW9 \Yfbo: DDDyӧOygFsD4IC,3YτihnLoWKyIKZJbLumݙ[`3˗ҥKhByfo:[ 49/RdΜ9}I=VR%;w.ZNK � � � � � � @J27 � � � � � � � � � � � � 袥{ʾ}f;vBZ40KC4^0NnEbc~hnjP- /lf!gk׮ɓ'ג!CUlYѭB f!2eʘjs �Ѕ_}Ui׮ 2D'&LqIÆ wU&۶mbT� � � unK({,gԩSrIAZߏΕYBJT%XIÕ,h鳤ؗ[t>Klѹi N-888z_4Xm˖-U[檵n M`-W/^\t v >c ꫯl5#� � � � � � �H@q3 � � � � � � � � � � � �.BcٵkܹSv-GHTti)_ 0&XlRC@3[ѻ.\ÇˡC~nEDDy~UV5n9s挮@�^~[5j$==>xGԮ][  @�@�-P\9(0A CҀ#GDo^uR秴xyyIbL7j` YB I̙l)1cF!X ,ii0[M.\h[ϓYT)=dɒU.\rhҤ|'~Y !� � � � � � �P@-R5 � � � � � � � � � � � �$OƍuVٲe矲m6VhQ\JJB fqQ `8@<yD:u۷w^ٳg P9r?\WD QTVŪ7 �k^vy٧O{ZDuyLA�@�@� <ٳm׀|e3ϴo>3N<yR"##E (`hp˗\< +\]]gL?g:_u떜8qB?.ǎ3!o]{;עa[VlYiО rssjй\r9[@�@�@�@�@�@�@�{@@�@�@�@�@�@�@�@�@�@�@�@�H~zYnlڴɄ(KBLxo!իW{Lr̙ε{^^^RJٳgefӀ!CȥKDׅh֭+O<y͘1c[G�ҵO>);vI&ɀdƌ2bСCP 2? J3� � 0'gʔ)Zt&t.QviosJZ4HÇ4HURJc :~-!Yqo9>tPmʔ)&K_bEUU Ѐg}VVX!ov쓼C�@�@�@�@�@�@� 1 @�@�@�@�@�@�@�@�@�@�@�@�җݻweƍfիWݻ .Y~}߿H"E }@3"]Dv&e2l05kJF¨ĦR@�,&ݺuvɠAs_MXerm4LVZvZ Jn5܇� � �@ۈ'D8 /�۷o/_^4aÆRB-Z4š+YE *d }M=Zu:ZRF #GXu7Փ} @�@�@�@�@�@�@ԲAo@�@�@�@�@�@�@�@�@�@�@�@�pZ .Ȳedɒ%!Zا.nGBٳgw30 )SFtԩܹs~zdʔ)2p@ɕ+4nXZha2glP# q^^zŴt"Cܹs'kO>L6-Yr � �$^Xb?~.^i&ٶm\~]tGÂ֭+o *[ \O,W"2eի-(Ο?/w]vM>] `.)YH:urʥڵk>dUTI> � � � � � � e. � � � � � � � � � � � � `;wm>snTP!g:J Hv̦>|X/_nUysyf4&M"�i.VEI߾}e'HʤtP $G__ߤʵ � � D ټysr5@kÆ vZYfh???Q;` Z ț7oԨQ˗/p-[#$44Tr)~ߠAPlfjԊ� � � � � � �؍�nA�@�@�@�@�@�@�@�@�@�@�@�@9޽+ .f͚IYt\tɄwtErmϣ(][V^-/^S/_|/E###y @˖-ҫW/߿T^=ɋbYd+VجT� � �xMTDDS̶mLo@@ʕKZnm/"W\ݻw7|cʕ+GS} r! 6?P~g3_zA>|dʔIF)+VKPP̙3ۺ_iQըQC4\� � � � � � � `j3G � � � � � � � � � � � �8SLxV…%00Pd"ӧOMJ rltfj>vy0a;wN5j$%KѣG˗�Hy=p@ٿ+VLԩc501Cz)}b@�@�Hcʎ;_y]=W_5>5k֔$˗/7Z|O _;:@)\\\L2gΜ):4h\~]w.y 3f;v)mD*U@�@�@�@�@�@�@ԲAW@�@�@�@�@�@�@�@�@�@�@�@�pD]tR/n{=9{Y� ڠ `O3g YzYV?apz2S  >>>h"х7l`՞4iDFF>ƍ˚5kΝ; @�@�@ ~~~&|jժUɯ$ 01ɓG^x 6YgΜݻwȑ#MwH%J0AZ . v7qDիرcܹsT\99tP=~ �@�@�@�@�@�@�p0]@�@�@�@�@�@�@�@�@�@�@�@�E@Eo+Wl]t<xP+9s洗n(Z|'r 0a[Nt=zHHHHrpFg}V+{6!uԑ={$8&Mȭ[~K:N"� � @4V<yR  E͛KXXhOꫯJiHpww˨QLo^֟EK,p([ܼySN: � � � � � � 3 O!� � � � � � � � � � � � `]7???|lܸQ֬YctqqAT<<<$((Hv-?\kְa޽{�- �v$!Cؽ.={vyw5 M… Ke… � �XQe˖uV9wkMU:oآE )^ZJh,X mڴ3ڦajE� TPAlµ6o,>>>ұcG)V1YQVZZ<hV@�@�@�@�@�@�@ 9j%G{@�@�@�@�@�@�@�@�@�@�@�@�H˖-]h_%K tU矗]vɸqdرRjUٱcq!�˗˜9sd֬Y&LSjJ.]* � �XIQF&jѢEVլ]V֭+ 69sy-[k&Yf~Ԉ�*/&LgϚ@N)"~k& ?zh � � � � � � zW � � � � � � � � � � � � åwޢACAAAw^iҤIwy\]]k׮r!TԮ][K0#C�hݺ߿JN$444-[ .8o@�@�@^^^fn̙֭ ?ҴiSݡzrq6mT\ S؛@ƌ_}Ɍ3dٲeRD ?~Cn(P@BBB썕 � � � � � � �^@t��@�@�@�@�@�@�@�@�@�@�@�@�nܸ!͛7YfիeMi|K۶m%G 8q4kLFjںHYrOJ,)Q%gtR1u>>ٳg˷~+7x#QO~> `mY7m$۶m *Ȓ%K)S 3gN1v@�@�@6/l޼Y9bX9geΜY4Xkܸq?$*sN0`TZUlΏs?"-Z;V>S[:t(v'@�@�@�@�@�@�@�RO@Գ%@�@�@�@�@�@�@�@�@�@�@�@�NݻҲeK9pO8Ν;/ȕ+WRϡvZEȜDDDɓ'erqRUzǎ'N:Jرo2c ( jժe~W_]իn@�@�@ @Æ `2uGfW<s&\~2o<)\ptƉ[ML}R4Iw6_RGG|ǒ2rm|i=v7С XaiݿkZqUx� � � � � � ��Zi  � � � � � � � � � � � �v+Я_?HD/^ncp׮]lٲqO}2eG6m#-*wssĔA^L믿:ueҤI2qDA�R[S,[nݻwKJdҮ];t钬Z*D{ � �+ѐɓ'ݻwl^gϞ5s7N8svSOIxxU JR]?t9=%e~4qw,V?dd˖MfΜ)Ç֭[ˬYҸG77o^9|'9� � � � � � � fj= #� � � � � � � � � � � � `6mˌ3Ǿ;޹?'6pv=]ͮ[RÞAѢER\[n]6lWΝ;g7# @ZTZUo./YD_PvmӢ;� � @x?ٸ۶m+ߗ5kHҬ/k׮ĉp=߱+oOѣL4I:u$dʔIn޼ioݢ? � � � � � � @H,ݓ� � � � � � � � � � � � c 2D7n,>lw?,!/ >\ve[oI@@YwŊ2e7n|嗲w^<y.\8>uꔩ?̙3KbdԨQqm'Z2A"mܹ&xC/G_r͘d";vq@I/[n~I+:ŋˢE̦ KU]ޫ-֭4o<|bw֭[gy1Д/KG cQYfjf17Fթ믿cg}*m `FYAW^lٲk � �/P`Aiݺ]<_^cOh~oΝ2o<QC3wqi֬b Jhʕ+l2Yp[x9ɡCJHQ^___yg 1bK.fSm5LMgpaQN2hp-zyyIJ<|wry={Vw.zVaKDUҥKXnjcWZe݀l-[̙3o"E̼Y_% ,0sM4'ʡCW^5la3gΘ99s:ls-Ǐ7<u^hƍsrquu.;wM � � � � � � ,D@�@�@�@�@�@�@�@�@�@�@�@�@n]&W]2-eU^,lYZtT n5IPiP.�Vϗ_Umf'^z,/H׮]eԩU颳$+W4jȦM ۷YVEC��@�IDATj׮-.l,hHSӦMo YuU {'͂ nhhYWm0uk?qjV˖-ºD"½۷7 RZG|M͞=[ڴi#~YWIxk<<<D?#1@л.(n6m4 � � `c{Ov-˗/qKVA?_dOi�ipӠAdm>y7M5ǦaFO? qw! OJټyGM> fڿERLaM:_EF%ӧO7!YԣGsn͚5f~>2z\\Yh۪$4?߸;YꩡZ:afXu~e„ R~}y΋kij[ls2l03_kPΧ'enZ?:?w\3 }zLtZ<{>|Zo߶ @�@�@�@�@�@�@��Z ^@�@�@�@�@�@�@�@�@�@�@�@�@ Zѣr=\r)_|&5ȩJ*͚5,n5J -'N,̪uh@.Ϊ̙3oHΝnݺ&,6[xqRB0o,կ_?y'_7uZ>Ca]t1:.]V ӧO˳>kT/=b (Z+VOOOԥ&IYҥKfQf͚`/]T5kV'/庘:]6fIxc֓Y>Ivi g]]?/Fi]o � �8iкen)sM[XӠ1cƘn;LhҖ-[\ۣ}yM=l6|}H×6lؐ$3fE777 {f͚%Kr֭[n::ҥKsiiРhZd߾}fKTR%sx˗ϼ/ ͏7}RV-=g={ /Y ;ϘqhS߾}CfŊ3mԫWτ\iz9r~v{Сf^vƍ*U* ܹsG{\lY5SH۷UW3d@]=:� � � � � � �W@�@�@�@�@�@�@�@�@�@�@�@�@ ,h غJkrǤa [uMΟ?/s1邭ׯ_ MիWGC/Ev,ZH,X`޽(QB2ggl=e)eʔ1oMٲe1](X[óU&[n5^zԩS1=kEʹ$vхJ7n=^( � dϞ]t`9w܃p@�@�*\Ҫ:re 2edsl. jӦhX޽{5ǦeZ,saKbu}Q/^UҥKN:ҳgXZ] ɚ9si뫯'eg1!]ҤĬrگN|{4RtTˮ],xb3?k TϚ݅ W˳נ(KkdkG=Ok^@輪2N@�@�@�@�@�@�@arGEG@�@�@�@�@�@�@�@�@�@�@�@�H=___ݻw^lIC%ط邭SNĉTRds.T%Ga%TtaN-ta?`�پ}v)G1缼~>'-3rɓ'Kƍ~s~b,hqĬ3Č7myNoX~زF�Qy˖-sg@�@�J {f)5:pnݺh.m$4Pe0[K[r(۶m+:uǏK-DÛnݺ99yȑ#^zs1CG͙ƭR^cΏl#~w,=_X13F}V,:Ggnݺf2'j959> [c6j?N:%Gի*G�@�@�@�@�@�@�Hj@�@�@�@�@�@�@�@�@�@�@�@�H@,YaÆ2}ׇKZLX``Iǎe͚5f!]ŋիW8߁3۶m{͛7%$$I90|n׮]eҤI,޽k.۴iC/8ڰYfIV7t?ooo#@�@�6l˚;wn 7ސބħZl(8p9]T)[Bm<w}6m+T\R^|ŘDA_6mdŊfR.5�,)%1UI/׏ŭ_"""D5K<yLu7nU>-u7㏥DO'B�@�@�@�@�@�@�Hj@�@�@�@�@�@�@�@�@�@�@�@�x| YW<fP..EKU9vOkBLb+fg̘!ׯ_?~Ў.9sfeΝїꘂɓDFF=#FEu۶mkݸqü&^Ke*U2V2oO8bU9j~/`ӧB@Y7o.W۷o;ː � �v+gȭ[R/ԯ_?ŜKHB{ ݺn:)Z[Bm<׳gO3פy{*U74`JC,s .4s59skt01si;wBv"cunڵpӦM;c5k4nذ!V۷o7b<xXXN>o<5H:O.}L:U\]Y,-m#� �  |699Őy"$)%FRrCG"JE0{wﶳ{}o|>{@�@�@�@�<E.{+E?@�@�@�@�@�@�@�@�@�@�@�@�ȤN>|X#_UVɒ%Kd޼y2sLyK=L@TC2y_ִiS)X 6ϟ/3f0 ]<nDGG}Y:Mcf[=ǚy2x`)W㏢N2E40{ӧ&$K8r٧K???=zU'6m<ҲeKT4lМ{1tfu8ucĉ۷ˇ~hcРA&Pl˖-裏ʁDCĶm&/^s/=ϑk`MMY\}\Mtrj}J*i5]v5?3\L< � �,0k,3^SOe[7u MǢ"""ɶq/۸q?-'N0:~16 \8~cZq<+4 Kkժ%E1J.m²-ZdBq+WG}$&M]vɕ+W?CL--|hHqX|'OLrߺ5vi-dQbڻw$:_UiHSdc۷u2_^+fJu_jf]ֲcǎ!ClB5VW}f ֲl_O?e^{Mj^/_ � � � � � � � |9s@�@�@�@�@�@�@�@�@�@�@�@�@ {._,:ksNk=...{yyI`` B uL2ҠA3k۶mE'* 0E5l0ԩfAF:qE}K:yѣ&̚wfrX}ĶYf&LKäƎ+}5O4J'y_lذAt[ ѐ--vZtڗ_~لhhA\ڮN,i{w1/?fNk&R]p}<曲~Ytq&DMú4,->]w%>ӉduZ}]Mo)=GJrYjf%K3q[kI  @0:|"G@�@�@%:L:^6`�VKMOϤnBst%v,=hp|ݺu%44Ԍ͟?_^sJZcl3Ϯ'k _i%j{L}ѢEvj$&&1Ck 6d:cpZt\R|A3N9gn:1b9R͛gxѣ3~&I/.5k֔:uȷ~k 5)=EױN-+V0ϫ>93<cKm|tԨQ=נAg ,0R:Ni&3FjwR}Tc7o6Z >o1QZ榡hNWZuTQS=xyeSOW2yR߷VJטt&oe � � � � � � �P)ssH � � � � � � � �dj&ɛ) � � � իWAWre]nm%WtU ;cwNn=((>)kr]pLc3g6mCٲTk׮Ju%Jä$$$餻 UrdE w3[Ο?o&٭RyM3ێuѪjQ7p>5?.\؄(Qk9Q׿eB4L'4  @:]D' � �xԮ][^yp q֭[pVۭc@U]E4iԩҽ{w;w-[6n}۹sh~f={?~\Vz+خÎ8^p~~~RX1:u/$$~LǕu*~h`S {fsz;r׭[7cǎ8eznO={HER\93if}]پ~/X|?ތ/YĄmlJMB�@�@�@�@�.>}^U;d9A�2+`+""Vuc � � � � � � � � � � � �-jze[YVUzħ+ ҥ^T)3s�u~```r}z5k֘I0۷oofr,7Vɗ/%jƌXM%T?l:nJx)J~ 5 O=QCMw%ftӻۜWtiɅizsp%&&FF)W6C5*{í@� gX  � �d7onC<>aٳ<RZ5L>qD)Yd&:TZRY%+)u)O.d˹mXcDefj+}z/wʕmz%{E5+|q.xZi}2m49z 1bDY,@�@�@�@�@�@�@�<K {̳"� � � � � � � � � � � �2W_$ Ǔ Ǻpd Uu;88X*Ty6G^xi׮<ˋ/(]vG[z7 ~p¢Un喴N5lo2i$ Zׯ럛D�\)ЦM-[x\i@[ � �d@ƍeܸq@;wre[4H?6SL+v ٪[n#>}ڜ?YY<a< _/s.qְk׮9_zݶE=Ď/ҥKe޼y&HkԨQ裏R[p  � � � � � � @ P+<2 � � � � � � � � � � � qqq,+++^wdtVZAX m+\ݯUC(Iu&?L<Yz!-[3gJf͒[/wy:ե>@|I_'0P  @/.UVm۶1:F�@�@"##壏>!Cm۶5;g3&װaC<x7Gvcر摢dРA3Ϙ@>gZ{x;j@/;w4~=z 0 ;:kLnرC/^,i >\w2@�@�@�@�@�@�@�nT@z@�@�@�@�@�@�@�@�@�@�@�@ \taY!X r<~dtI+ZlUL$ǜultCɤIEҦM:ԥKluOFKyY@7s5q:ANA|@� 4iD7 � � a׿e^|E{T tP.oL>]ƌcw.֭(Pu믿NrQ"El>>>_V6%g~'ywM=xt|ѯc}( � � � � � � �J@-WI � � � � � � � � � � � ׮].K0.S OEJJ=\ ҭd?ʬYn*UȰadҥGmtB ȢEE Zv+WmHG@�O@ɓ'Kbb"Bw@�@�hܸ 8qhTzrʗ//3gΔHٸq,_\*:ܾ}{޽ *UTQerf݀3QfxٲeYK dҷo_Ɏ w @�@�@�@�@�@�@�r�Ze!@�@�@�@�@�@�@�@�@�@�@�@ 7 h3|udy|}}Mؕn m Ji;_>Jyh7,+VgyFϟ/gϖI&Ip>ҥ_.]j&qX<#2x` vn@ W$gϞ}Is3 � �xi}grw˷~+9uooo!ZolذhaäN:ҡCرhBr&pAO?ԌJfg^RJyE�@�@�@�@�@�@�bsK@�@�@�@�@�@�@�@�@�@�@� 0, rΝn9z\碓%p|弟HeپQ b{eڴifYdqR`A;4ϟFodX@]VVZ%ׯ///m۶5n @�M `ݽ{7Zijq � �бd Cʊ+\{hOtbo);wu֙q^xA|||QFҺukiժ4mԌ3-4z_z)QtIϟo-t � � � � � � �d�ZYK � � � � � � � � � � � ++�KϏ^ *$J/_,"Eطp" :iiիWʕ+MuAu&;w2eʸcЯ\ ~OLN Hd-ݻp\< &?׭J@�@�ȍ:AZ:פI=z=w7l'|Rt]r6nhuf͚e\vmZ5t�i 4n۶m_3g$$$ĄM0A"""VZ*mN@�@�@�@�@�@�@�B@�@�@�@�@�@�@�@�@�@�@�@ [W:渼pBא +JVU%ZjI9w&000ٶى@n(^ >T Zv|2fѯ5kJǎD-[ Ycǎ_|!6l(9|-ZTtb8:(((s @&ԩc2y9!� � h3dҠAi޼ 똺kբ�eٺu,_\Ο?oի'rԯ__֭+իW__߬ #'O^v-~ :xuժUYfAu@5Ԏ� � � � � � � .@�@�@�@�@�@�@�@�@�@�@�@�#p$WWֺtxfWc\)SLhm;.,ku/Z 2ʕ+fכࣗ^z4޶jJ6mj&,W\oyN`߾}f2eHyͲ~3arƍeҹsg3w@�w@W_}՝D_@�@�s?|7rwʎ;D=hՒ {5ϱ}v38|???3㌵kזZj)/8L ~i;v̴:7p@iԨ4lP>'"� � � � � � � j:D�@�@�@�@�@�@�@�@�@�@�@ NjcULLLXb]v: Bp++Z*UcYNiu+;Q6""Tș3g/M6 p5tCľt-ڠA Ѿs?eΝ[l aD ;6mH-@9I� 7,GsΙ'{;@�@�@ K6A=z0:3а, 2n_~E;ٽ{hPTT蘒 Q%ժU�s }o>Ѻ~ Ç߁U^|M7΄hKѢE � � � � � � � *@�@�@�@�@�@�@�@�@�@�@�[W^5XV.dMne-uJk1yNt}R@ hHV^LէphhҶmd+'-_ԭ[WtB:uHZD 83={~0 rIxUT1NEƔ*UJ*Wl&Cԉ K紖@�@�_f 0`{fnjXa111L?sЭ/R~wD{бU;YbŊ5444QXq;K.pCo&q-2 ߄ik� � � � � � � @nWg@�@�@�@�@�@�@�@�@�@�@�@4 J.*}_x:KL`+ ,*Unu\'stIu@�44$)""T?Sve;Yb̜9L|'7tԬYL(:.eo>{ݻw$6!!O&L 3U״$&&ʏ?(QQQ3F瘆tԶmKO@  L@V|yd@�@�իWSJddѕSlTvuI?hhVk]ǚtRǧK LVrĹ)SƄ9:^:q9rD$â!Zz*5$k׮f:YlY4 � � � � � � �ZrK˃!� � � � � � � � � � �xիWXtcNnge]|6a"t2VUhh qoեAA�rZtҢ[n\pA4iϞ=f/;#Ǜ-*:QpʕR'j% +֪:1쯿j<(z\K֧ͤOUԮ]Ҡ>֩SGyDg֭[[95l5i҄ǔ@ُ�d|^' � � @ nZ^{5:t38p`w*{P@[ηr1FnB-}U *d-RJIɒ%EZqJ~byRC4˪Ǐ7ǎ3l̦U[cl:6]~}gf ZX1 @�@�@�@�@�@�@�n�K@�@�@�@�@�@�@�@�@�@�@�pHHHsΥZP8\Q'c +]/S I+`&PĹ]@� ( 64yt[ m:p@իd.]ٖ-[|_եN|:ŋNKuI bѣGE#GR?4L'm۶YCΪVj&NR"""L5k>}Z6l`Idd6mWq! @U&jě@�@�J!C( �N:e<m y0Z+ Mq0+4IŬݻwSNIbb  1I:ިIR[Ud.\qI`֬hؕn/&&FΜ9c㺎3kd;�{x17iČ5t[5B � � � � � � �r c � � � � � � � � � � �N@CVt< ҉tZu!#Z@,` r>!$^^^VS,@�!֨QN@Cn pgٸq :|K5P˚VC:ɭuLu:|rt]zU.^(Nkll?wsN'UXV>HV~}˛,9E_>}(SL"G6ضolR'0 �d@Ŋ姟~ʚi@�@�2%0sL?w޲yfW^ky{{p$ HJ\v̈́0i('̺c(ٳnjtN蘣5K Ox5&7cԚcϙֶg6wjR>8K:[P_+馛*Zu|Tϧ � � � � � � �  � � � � � � � � � � � za`VUZz9(Do,Ʌ^A#6)u@�r@%DkFR|2رcfSN%Vg޽{RuV&ZZA['٪?Cc3.>>>ͪ?u6AAAksO'P zǏ7,[仞PU&ZGaonZtWn]ر jѢX>"� P\9Y~'t>"� � .\hv*_}TT)O=V>i |p-{.sֺL1Câ4 qĴ9^wa:NKk1ֺ3&$$ɭ>c@Vp1k]ó4L+=Ec::Xw(>kLTE^z9@�@�@�@�@�@�@� zSZD�@�@�@�@�@�@�@�@�@�@�pNZXYĂzsщt"<+KXu ? �-@Z}rV'՟aZ +ky%긽y-ҸGfY8VId:5mJ˔Ct]kBLeʌ3d„ sϙz_~e RMOlӦM&`룏>9sgkٲ СhVj>)@o :z|?]� � 8իM6Ҿ}{ٲeKIrGO�( cV.u[CTeW8PL֬i/wm $ָ.,\0*UulN;.u 󲖎^\Y:a;k@�@�@�@�@�@�@�yr5 � � � � � � � � � � @ CΜ9s]@Kn^i~e-uR)RľOי@/׾x0@mtW5=E+W[lAU$ ^zL<x`ꫯdʕgpuE7։wn6y%><RxqKk0 @ }ʕ+r )Yd/L@�@�rY~jʄRh,/7: ҚrHz"j<\ʹ � � � � � � � r% !� � � � � � � � � � �W& 111ɆaYϞ=PRJ++,q$޹'C�s&9|XdynM{߿4iD̙#GHGO˖-+ 2UBy5\K#$..NWn&ր6mڈN<MA�HY@jBRv � �9%a:ѲeKҥlذz1r辳gȚ59n� � � � � � � �m� � � � � � � � � � �Wï@.Z碡VؕbzrN:fgKG($ �yY`MR,p&R(STqƙɖ,Y"ŊIGo$<< &0-[^y1bQFf_:@ g3̃"� � ikjuM> ǠP*e.A�@�@�@�@�@�@�@�\$@ i@�@�@�@�@�@�@�@�@�@�. .`, r Jk;66.ϟPEJժUM2_>Iu@�@ 'N|ȢEȍN)SHDDO֭+˖-mۺQ/]i߾<h0̆ d .SJ…UZ5w@� Jpt@�@ 4TK|tbB+(2tH"?{'C�@�@�@�@�@�@�@�/{D/@�@�@�@�@�@�@�@�@�@�@ $f;w :}t,+Kz,&&&W^QP$X!!! VnkPm- (p][@�@�x-@;̞e]7o.wM;ԄL=2m4+ŋ}3N'N#GJ  j׮{YV�~<y;w!� � M-Y?ܹ[N ,M.x mDvɥc!� � � � � � � 1/E�@�@�@�@�@�@�@�@�@�@�w`g& J- Ґ$c �,V\پ|k) � 9B…"+9NwUVwǎk&\^b Jܺ?,,L>Cr5o[oR^z- $˟?n@�$d � � j2c<PB ggUy1G t3\� � � � � � � �L@-Q � � � � � � � � � �xc_&KCP,kq]4P,4\䖅 ///ǦXG�@�\*iȁ"C6lhBk7\,X {]ɗ/h`iӦɹsDԟ~^ZfϞ-ҪU+{7 3`̩ YE5=@�@�+PF dP6mȺu$444'9RD SsH � � � � � � � jyF@�@�@�@�@�@�@�@�@�@�@ 5/& IJBtSD4~[XX~kz � ,`˙ƍElIԪUKo.ƍ;6T͛grf *$=z0U/=|DEE:k,?~}ҥKg.�~pA  � �x@XXlٲE:udB5(rʞ�4EUD>Pdݥx@�@�@�@�@�@�@�@�l P+[ � � � � � � � � � �dD@4 r^j֙3g$"E؃4JkJڶ… 'i @�@Oy}W_uEkFmP!C֭[eʕ�\ v/A D}&&&ʮ][Æ({ ��@�IDAT ˗/K͚5Z[#"�9+ZǎNpw@�@�ȰNMCtbB֯_/up;\>gϊ%2xHD � � � � � � � �j@�@�@�@�@�@�@�@�@�@�@�lth�s(Vjgm3ic)P@, êQuaYV8ooofXG�@�rLEDͱ.dۍoviذO5j$sΕ#Fd=F۠AS'N(͛7^z%ɗ/4mu-'=&}E�<.Z <> � �)PD ٴiSZliӻvCeV@�@�@�@�@�@�@�@�K@-z=  � � � � � � � � � �!kr Jnڧ�E4JZxq^}wlu@�@.[H`u=S.Wl922RFe-Z$JIY @:udu ό믿.SL"EHDD=`J*)7@  ,(Νs@�@�Ȍ~ݺu2|p޽-9;vlf墉mxN}Wlpk@�@�@�@�@�@�@�@ Aa � � � � � � � � � �yI@'Btr$DbŊʕ+KF̺Ou_C( � @^غUd^KO-#ӧO7OpY|l2oAӆ=c6F2u„ ryT=\]v&nɥ ŋ.o@�@�@ dRfM?~xD_Hq8M;ݿ@�@�@�@�@�@�@��Zy5@�@�@�@�@�@�@�@�@�@�rNo`EGG5?$!XYAX1PBXGC�@�\'`Hz" MOjum۶2yd2e pѵ3~EIbb}լY3 ) @N ˗/d7 � �H@ô¤_~?{'˗wQ4U"ǏlܘUw]@�@�@�@�@�@�@�@Ժ1?F�@�@�@�@�@�@�@�@�@�@ !XVVZKIñ 5j$ DzRkPPP= #� �yY௿6ܹyYA$$$D>yWE'^hwR\ sO+Z2uƌrY%<hwlծ]ȥ @ty"s-q � �@eǎһwo[|=YttFظ̙sDͫ/ez%s@�@�@�@�@�@�@�@� P+_z� � � � � � � � � � %&&FMHVJK cZ/\DDŽXWŋ*UHƍMqY`$m� � s˖x橽瞜;yȑҲeK۷ˢEgϞEK"Eo7U~ :sL7n*UJڷooµ4ddɒt<G@-y) � �^l߾]F!ݺuG}T"##/Mp^6Nj NOmK[ � � � � � � � @& � � � � � � � � � � pe{0RH?s,ePB&K4+44Tjժdc8Vpp-YE�@�<J`5uԑ;wʘ1cW^fs犿?F.T<&$$ȷ~k2d\rEj׮mjݺ(P=)@ox' � � ;t᭷ޒVZѣeoPCॗDcmZ||ݣS@�@�@�@�@�@�@�HF@dP؅� � � � � � � � � � bccS r:w\|% Ґ, ˲e%i @�@�+cߋ̟{1O./u>}嗲rJYffTaÆN4I.\ 7ol U5kf^;JE �7*'΁7&#� �  <X4{fa2a[t2!ɓ$/GyPGF�@�@�@�@�@�@�@�O P˓^-� � � � � � � � � � n r 'O^퀀�|WVV}gd)RD � �-/JjiYO>ҨQ#ׯr-/-v@``tTmرcgW^yEx vڙ- >Xk;Ak � � � kTb»Ν+SL{2?_7nkdp]og%""ӺO@�@�@�@�@�@�@�@ ^p@�@�@�@�@�@�@�@�@�Tϛ@,+qi;h]|9ɣ% *UԩSǾDu I) � �BWYY8BzCh2׶AM7oSʃ>hB4=Y{5Ug:DEE?,/^Uõڶm=/ wA $&&gA@�@�@ yooo0avm2b[|S>k, N"fҥb6l^]Bjժ%Q@�@�@�@�@�@�@�@UjJv@�@�@�@�@�@�@�@�@�@�2$p%�, ò%i_4 *[ԫWϾ]xq{@z6@�@�.wE׏Ϯ[z}'O=kN/b i֬G?vvڢuرrꫯ[oxyyIÆ [M4___O}\� � � �. 6GyDVZ%'O6![~~~.M%'pȸqb 9p`h0P@�@�@�@�@�@�@�@�w P˝_� � � � � � � � � �x@||>}ecMt&� ҥNڮX>u� �  x{HٲnKZDD2p@iݺL6Mqu6H'nӦzvٸq Zl̘1C4XС5j#:<&Gӣ9 � �>~ɭ*f͒I&ɼyd̙uDF^?u7e@�@�@�@�@�@�@�@Ejf@�@�@�@�@�@�@�@�@�@�(p{@։'],=aZ v|IbaXոq$ۺ I) � �6ٱ$$$$=^?~XvcɆ DJ.i {wަ4ZQQQ2uT3f)Sվ}{09rk'>υ� � �.\XfϞ-=<r}O?mgT2shzE>HdoD@�@�@�@�@�@�@�@rW!� � � � � � � � � �.HLLed2uT˱,XPBCCXժU͛m{yy9^: � �yN`ʕc_E~aiݺu֕%KHn\<HJ*u/;wl 8P4HN:-[J@@N3 W^???O*}D�@�@�,([,^X&L O= 0s+ Ȣ;fG{wȍR\9ZjAI@�@�@�@�@�@�@�@cؗ#� � � � � � � � � � $$$ӧM(ɓ[[-jB@&MC}ߺ% � �!pȲe"F^Llp8zɮ]䡇M]F-s̑rrJG7nlɓi&s=g^-Z5&9^1@\rE|}}f@�@�ZFe2}t={3Fq2d1B*Vwنb9^7nw2}C�@�@�@�@�@�@�@�j)XA�@�@�@�@�@�@�@�@�@�G1$֣%>>|I%!Yu7'ٶ+&:9@�@�\/{"/nwVppoZ %K�Ç͛eʕ$<q[nj=jµ^'~Fm׮=`|R@-??T  � �-*UȂ 駟7|Sϟ/s5P ^zI@@@Bݾ oD.]$۶mZR@�@�@�@�@�@�@�@ V @�@�@�@�@�@�@�@�@�@ &&F~gͤ/4\'ܹԫWOJ.m&P, С^6l tE{1YtlܸQ~'9u:1]dݺu[o3<#ƍ{Gڷoo"L$ � �Y'`XzIL17 o z2tmVGIŊO?[%~~___iР JLm-Z꺫̙#&MJ/˽ޛ) )SF(˗/cǎݻg\5jTP=CʹsRnO>o;7-[&2wI^fZǜ;qF@- � � @'CɪU@2`�)YCXv\|9ozUdP6mo &ٺuqk۶mFGI  � � � � � � � @�@�@�@�@�@�@�@�@�/^Ǐ'[uR'NcIaV:)N�jukӉKY"� � +b8%rz痮^'&&9sƄ~Ұat]]'oraeN*U،~d .iPa͚5K… %222}k֬͛7'9FnݺuM?~y˖-ek&QF&tZ7n,yܶm|rM7 / w_pr~o^vMtLΖm+Gj_)~==}Rtv @�@�@ ^z![n6)X [SNRh<}VyoܸьG-[NkG:� � � � � � � �9*9[$G9 � � � � � � � � �56AXY ϲcccp, ZZ$bŊwk@�@�@�!`]JDڷ[xN 6PӧKXX1B}\3Lj\|l|}}eΜ96&^zb |nz˔)cN-]tK#Vqܷk.q:e/ڵ3u&I64`kɒ%_֦M{~s?.}o&Ӕޛsg1oZǭDpY,@�@�@�TJ(!cǎ5ȑ#>J|| ܹCm+ʫe~36n"bˡ Ԋo;0,6 � � � � � � ��Z9 p@�@�@�@�@�@�@�@�@�V˗/ñ4˹ZY'O4pYɼ ,]֬YL:JJrϺ% � �AymM+%r ISү_?:t\tGǎ~0Z-[M<C}Q`)PdʕKrNج!O wWɖ믿ڏ: 뮻LVfp-O<5ʼ^:t0[׸S={Py72{z#vS;M7Xϟ@k% � � neѣM>L>YxL6|h޼nZZha¶ݾ'("5jϓ;wNv)<?;t`@�@�@�@�@�@�@�F@-y) � � � � � � � � �܈NkcukIr"E4m)+$K$ױ� � �$`]<3s~ضm,[L~ӹsg{@m۶||0-֯_/+W4w/{oz'NHMT…ڵk.ZH^|EyeϞ=fg}VW&N(_|l޼ٴ`T"#F0;M>EC�?C.\(۷o P<s>FGG˼yd&j*n:;wL4LtR/`"ٱhx79}]x.馛Dȑ#[sV۶4x 7ZhC۾9?/:.ٳvZӯ5k֘O?m[$iK)}/Я[MKڔa1<AA�@�@�nD@{esٸqzL�#kڴhmܸ˺뵶eD9(oq1#];� � � � � � � x{@�@�@�@�@�@�@�@�@�~ٴiXL# ۴i#aaaRP!3Nݺuksl駟ʩS̤X={HYjlݺU~Wt{5kd:{EV~t � �Z`[o[@-9sƄ `+ ۷ǜ"VVÆ K2a7΄ixQ*SL1aYnuwe$G޽ & yfgi?l v4LK󫯾lt{̙ra s 2d,^~~3+W΄]?~\t7e>i_u5abm[n#V4GFُ=lD7kLNj8zכQ{?4Z!!!ұcGun98?x |Nj݅ dɒ%:=i]˴;vnju\ϡ ` eID�@�@�W TZUȑ#f\Hի'}&mNwt\KN>nH[ǎL 2v3a:xd֌G# � � � � � � �J @�@�@�@�@�@�@�@�@�@ #/^?3z6uL'ٵN̮<$WKjժ�-kZNMA�@�@�[Yϝ=j˜4fРA3<#۶m[oN:XJDmVZ~. 7;N4k,3QVi :YN$}ЀC=$v2ZKKs chXP--6l0> 0!<ܵkWsL`-mSNf.5*ڦ>Ӱa.oӦMe2x`4-osmFa_r,rԲeK)V}>}ݴRrV`rm=?$**T {GBvLVYkGŊo!F24iϲl28qZ:Ʊyf{ߛ^z96d={iOy^ܹsf\/C�� � �Y*GC[oLH… Ei $]6h@t|SmO>kqpһwo&xd֎G � � � � � � �ܨ�3Eܨ #� � � � � � � � � @k׮[Xٳtv\CVRLTndYK,)>>>XA�@�@�M6)#ҹ?=;tK&Mi[l;Ir}eHΥv&LK뺖#Gh8:I~믿9JKϞ=M;:AB w- ,0}iժřcD9LC4*VͲ|fa �Hyw̱X"E/ݩi@ߜ?tcر9\RVkԷo$%/ lihDFaիWki[vL=|pѣlٲEZhaRc5kB6˗:'erH{AJmW mC�@�p~v EǽZ%::Zv);v0^?.:6fµ4^C4>˭d6f[[H>0c:a?xd֎GڡYA�@ػ0)a#y�9 D00QpPtV]E5aX (I@d $(z_�:vuuu9wζ� � � � � � E uQ|<@�@�@�@�@�@�@�@�@�Y8ַo߮'N`8{qeEugEEE  � � G nU^՟#C,<*Y&fW ɚ,/p�prB-tYQ#FaÆꫯ'@ZjB[믿¹^y/o?CNiwn<u륗^R^R|>]psx <3gWtzk/ewY>7;۫Dϋ]1/IlIm/ϟ?@�@�RQދIŮ\ԡy:Okk5 ۰ad1{5k5h@ms -qtMR֧bڵny9\`>җ@�@�@�@�@�@�@�C@P � � � � � � � � �ǵuVmٲ%d٭X( Cܹs  � � &H;vH}:#G sAnH"sosʥ={Ȃ*Wov6lPٲeOvڵkBƍ;)St.$رc뮻N)BVXAw+D|rݻ +VtaC q�% ֊>Ǐ:udɒ}xȑ#G 8:m!3fpZhv޼yدB 2>+N߯_?=zT@T9n⃤9uR"o=%f@�@� 5~8j=yyF;N:9� fp*Zhko?9S91 ۴OɛOR`Aɓ'RzGYA�@�@�@�@�@�@�@�|  � � � � � � � � � RҺu_O<]A.�+{0y֭+駟Beʔu]azZK.նmtamܸQwE׭u 7e˖T E�@�@�5JJT?dEw.K,YmԨ <'l뱱_v>{n B=zNYkYu]uUg=wW…o^Ӊ'|.?DZ{M6Jlܵ]~5O]t9ewBR޿_ ۼy{_Ss% f[nE~_/juQqH,`vڥ': � @ z̡_&Iӝ:ٳ}Y yÇ0_۷WBTjUmׯOΙ#yY^H3Oc4/G|db{@�@�@�@�@�@�@�@ YS+{"� � � � � � � � � @ <xP[l 4+|;wmŞbbb\V%TN]s5ukŋwс簂� � � pn/oXӦ >uݻw+ o0ALdv-ؖbŊɓ'k5 u-<c裏ԦMrJq͛ݱcBvwbAZw} ,Bq  Ȏz!m+lK0,+<tP-Z7n, `g+2ܼysw<yZXzlt[,lŊի/h#4{lKIm <JX TREN|pBs>͵_}k׮xd)]xW{_uA 0ž7m}?q}P{o?~+D =(C�@�Hu7[,YR}@?P+ /([ gX`8 ?t萛kѢZlVZL2qԿԮM%ƺj|dG&"@�@�@�@�@�@�@� P+Y@�@�@�@�@�@�@�@�@�@ c{U~'YtYtnXq… dɒ.I&, ˲VD � � �z~mx+oԵ^#GB,4+njժf͚Zt z]@=駟, {ϻ)S[n>}kKoK/T_fΜӷo_s=K\ԻwoYqqqZxW⋲'Zm_vZ 4ȍ{/>=C.ʞcc̈\N'xBC qfoNܟ &rʮۓ?m Xlkfa ϕlYYf5j[o `sk˗O,ٶnBѺukc%]`/ #}v{"Ei� � uzHx:sr(T:t ~xbwn}A/_^m۶[Ж%#~K"on+g~;2͑|d � � � � � � � Nz� � � � � � � � �)Vp/g 8qB[nuX6m:ւlێ;/SLqXfv[X1W _@�@�@�rWyT᧞±֭u֩\r.oQRTlSwƍ|kH;]Cڹ|={(gΜ\[ܹSV\رc.T¡I߾}. Ȋ_r%:l<`53f CO/7)mYXZ3fzѢEe!VnXd9sй>FcG�@�Y¶: noŋk޼y.�O`Pȑ#? xϴb eϞ]͛75\\]USB߻O>Z~fϞ|dG&Hz | � � � � �!p/jܸߝoOq @�4Epai,yHᡳ � � � � � � � � �.`E-+fŭи˗/e;woEK(lٲs� � � D'K^f{f~7@`P{B Jn-@B 7z<y?%aZ$z>DGG+66d+B˗/׭ު+Rֿ/,Vr3Զ3vbC X^~\9{O[r>իp- زٹs8' {lF� �C\vwݳk3[7pf.@ZhõuV}4i[.]J*gԃԑ/71|󑧼XA�@�@�@�@�@�@�@�3:  � � � � � � � � �] oYq7,Mn!Z/V,ˊ[%K͚gA�@�@�MQ8|3oZ67o3dK{ﹰ;S}>裋 ( ёt|!C3g ؚ:u}Y@װa@Ͷ eܳf?oי!� @ <xP9r<yҍk)r�^z㚅p[�sWjԽ{wuM]v3xiٲ?٦֭[~ҪUcP � � � � � � � <_cF� � � � � � � � � pG͛]He㏁ue=z4p ±ZlK.VhQeʔ)?+ � � �#Oo'=]L}lk͚5bŊwHGgyF+WTŊ/zq%W{9eP64{lxS ;5jpP?N{ *RHڟ3 � �\C"PclONٳ]v˚;wƍѣG롇RJ`o~!uߟX8-M6Mއ)i>245 � � � � � � �i+@Vrt@�@�@�@�@�@�@�@�@� 8| Ȳ²mݺ;[s IJ,k 4ۢpt @�@�@ =^]ʟ_9>HA:|?Ǝ?\-Z7|^į⊠X֭[B,mժUn>ɓNɓG111:v{YV…]؜x Oy K,VXR @�@ <9sQ.+u!dz2Fޯ͚5s5~x?t5JmV۷wsV6pR^=#OG9~G="� � � � � � � jE[��@�@�@�@�@�@�@�@�@ M\q 6Zm۶/%K/^\eʔQժU+naYdɒʖ-[!1"@�@�@�8qBz5馛];&}J*KlugϞ0a zG{)666tBOFvڲ/{uZ~~7ڵkۥH"~f̘խ[WmڴQ||6l|mH lٲE%J>Y@�@ =ÇK. oɔ)SȏDw7n{aZҘ1ܢ? % ߲,5 x0<b+23@�@�@�@�@�@�@�p P+\^IƁ� � � � � � � � �D矵~zfY?XV@̪X+:lAYʖ- f"P@�@�@�T6M^A[_T;$ 2kF+VЍ7?8p`oԨkn8hk:~.]ދfjW_.]z:A+`Z 41@�@�iݎ!o޼!qI7Bt]ҭJz,߯;wj̙>} XVeUVU9"ڐ#� � � � � � � @ P$^3z� � � � � � � � �D={\`ֺuY~FZÇEqXդI/U� � � @j %5m*UZG8(`A3f̐&5KR{7TP`.} aDz֡C(lm-\Э/^Xֆ ʗ/nMݻwWѢEg`@%JS  � iے'O jkF𦢼߼H#FK5[,rs-һᆱ+sn7YreUTIKvۊ+ йS��@�IDATm� � � � � � � �/@Vƿ�@�@�@�@�@�@�@�@�H+^eT-0Ͳ,kv_ Νۅd+WNڵZ,kr  � � �!/҄ k8GF XC*..N={TZ[oe˖5ٳgWllkc}ך<yKYF5p@ըQC5k֌pg޽{e jeK@�@� "&vB ]Lw#o!wg?}u׹?m,pkw=p(/H"*XkwzyUttS̙S6Ga-[l^WfZ,Y\p͟Ͷy|;3G~� � � � � � � �$ P+ � � � � � � � � �*pQmذAk׮ gYXݷv˔).R/_^UVUݺfٶ… j8 � � �+J^w#PhܸVX~uֺ{4111,4ٳ5ͫ=e=ӮPuF֮]-%i&w*+΂� � wv0pY,ҭJ]J:-̪Zj}ɮѶnݪm۶_~Ν;o-۾zj~X;xĉ[V/)̾o *~d*]ʔ)J*J*n :OB�@�@�@�@�@�@�@� P+d_::� � � � � � � � �C,(+q<Ǐwro, UVP ˲e˖UΜ9c@@�@�@�s<)-%qy8˧qW^ѠA4sL;o @n/磌r:n-\ȑ#u}` lYjC`Æ 4Cs � �.`:@U@ ?D�6L^}3l;'~tر@ںѣ:r :t,|޽ڳg,oǎھ}q֬YڼyNoב^^=5o\u֕@�@�@�@�@�@�@�W@}m � � � � � � � � jVƊg4+bcplU/W*V.], βVdIeɒ%ā@�@�@�((-Q= p뭷I&ѣbcc5j(u-Fp^zzmXjU `뮻ҁ<^|| jٲ͋i"`111, � �+`Z$5+%iUg.t/Kޥ}-kٳgO:׊+l2/\y{イ@F])YG80 � � � � � � �d�^vN� � � � � � � � �ɓ'eXk֬9:~)_+۽{wwkZUD eʔ)G@�@�@��XS&AFSs/WŋkРAy^s=9sF#zޗ[GѼy[/{Um^~ l5袢~\t04zٲeC@�` *TPX o!XcǤ~䅸K}JS3gvM'u!p~Afٳ5b <X_~,XnP2e� � � � � � � �+@Vv@�@�@�@�@�@�@�@� ={(!!fEg<莙%KWdRJ0Z଒%K װ � � � w˻ڵ v.^|1GR*#G?q!DR{࢔Holٲe˖ >\f̘ƌ~X\rZhتRJzwo;V]v,xjժZrJ*# � @ر#l,4`ؼ,/ O=%^-J^YC~dByc5n89RÆ qnsw  � � � � � � �+@Vv@�@�@�@�@�@�@�@�HVɓUYUַmx^…Ureկ__zrU\9EEEc@�@�@�H8p@:qB3i$ɻVzRV#Et?gϞn)~A#P@u5ڵk]ִi4tP 8P%JkjNYHBB .@offՑ#G^V̼|UV hBۊ+Q؄� � NsZ'lr ;W:U^�\o6lzH^0Ш pvǮ7[n / &ZKշo_Y8  � � � � � � ��Zz[@�@�@�@�@�@�@�@�@cǎ},0˚'$$U ƲUTQ>}ܭhY˗/) � � �)/]mݾ]2E:~\I6ɫ]{"[dɒ5k~ay.^%O*^xr Dky_tǽ/ŋz-ټ"ǻִiSȑ#CIOFS\i~zHWl.@�@ xnݪJ*O.'jɓ'/(<3G^�tHc #HkYؽ5khȑ4h{1w} :?RF�@�@�@�@�@�@�@ CP~N� � � � � � � � �LZo5 ͲvZ=z$O<., í[Vr"<\,e� � � y2n9S>]^PԿK11^F@,YCUV~[8tbDÆ ӪU;w>A!`+µCj߾}.8nڴiOO0&M}oaI,)`svС$,f � �?-ZO.'v-c l3f W^[ yCR~lg>Y( /{WÇ71B<:ut � � � � � � � nTHI7jN� � � � � � � � �[W-~7|eY- RjԼysWpjժVxs=@�@�@�@ $_ PJ~_Lf͚iŊղeK=0"r-:x.5*2u DGGCYl Nl=S{*BJ,r.`aY6lٲd݁@�@�2D+!Nj,ǻX֬9(~kISJo!/}w~;_|QC }ݧΝ;m۶9r*Vx~co@�@�@�@�@�@�@�HWҕ!� � � � � � � � � lڴIVʕ+ZW֑#GN e]8q^+BZp? � � �Y:'MgOnp(P>cW_VѢEխ[7=zԍnѮUW]£*PD /qɓnµټU\kYV "x<y"+b]n]^8WO4r 6bƂ� � <޽{&P+Mx<$K^q9.#=/_ȹ,{ر.jԨI8Q@�@�@�@�@�@�@�S@\ � � � � � � � � VtʂVX ںݻw;hU^=NeAZVX@�@�@�2NlZ3Kr Ll*`z6m=z(66֭7:nU%SLݻob`P {VZYܡC4ϫ>uTM>݅YR [קuPֹ5k&|^5A%8 � �d?N\X@*5**@Tp-0w-tH҇:q护u,.}z67l29R<&MzK+V< @�@�@�@�@�@�@�HSҔ#� � � � � � � � @ l޼Y˗/wYemWɓBVFjӦ-[M4+Ƌ� � � @ X.X,Pkdyg<%Kk׮ON,|wcA rȡVZfعs ֚z'Ol2URP2}6}ر3<,tGUܹx  � �+i&ׁ%KflGR,[$ZJ0ɇiߥ[# !5kV}j׮nF|SOiqx� � � � � � � �$@V*Ar@�@�@�@�@�@�@�@�,'N(!!A˖-_B_usYVVZ]ve, � � � Ku}-q3 ݻW .tx-e}YGB Glµw};TT@qsXBON_2{TK.}@�@�@`ƍV7qRI!y3J`^֓c'[SGjժZ` Yf\r 8  � � � � � � �\�ZǓ@�@�@�@�@�@�@�@�@ {U;-]h+ߪj{xu^/rnEAY@�@�@�@ 83P+S&ipB{l>,@gϞPônS-TDěYG ,*W,kVB,pz7@9xך4iٳE **\oډ'[YJ<  � @ X!\w6Â@,Z$ehDzbI(/Gy_M6lЅݗ+W.)@�@�@�@�@�@�@�@ll:<� � � � � � � � �'`Ōd-^._\T&bv TvmuZ1 DF�@�@�@ ޲hK,M7IC[E O>fΜy0-;ڡCt7}m>HB7vԞ={Ə#F(gΜjڴi `f͚n6RBm6矻ng|z.]Bm@� *SLX7wj+;Wrtc1cK.s;k#~ֹsgխ[W99gA�@�@�@�@�@�@�@�$J � � � � � � � � )[nբEpBwk!ZVՊ/_^S׮]UNW3O<B8@�@�@�xāZ^΋5^y%Y��;vsaZQ^䣉&vcǎ/?(wرk6M6µY?.\X[l/^<rB`/t?~\O?t."� �+`ZժU +Kt"  "e˛qK护Ff?J.y[nQݼm@�@�@�@�@�@�@�  P+^� � � � � � � � �#`E;-[ 諯rmŊS 4deZOq@�@�@�J ?daZ*HSA--[@'jܸqJHHP,Y\։'NIiFUT91 JR߾}][ ÇUj@V-\A15k�x5m4(E'@�@�ذaꪤ ѭyծ]Bt;lg?Bl.Y?H xr̩cǪrʺe![  � � � � � � ��ZN @�@�@�@�@�@�@�@�@ vy湶tRWT5W\.4W]V%ҫ[@�@�@�BD`~1BԩR<!q2erP#5Kj/.`똽Bz%KxnAҩ Sڵ]{tA͙3'ϻW\تWeX#eg;2 � :GqAʕ N#P+N>+WJq5O>JLss <*]nfo^}URǞ � � � � � � ��M0r@�@�@�@�@�@�@�@�V<u͚5[e˖UÆ eZ5q0b@�@�@�8Uݼy6mnl٢_U~wl}evQYlٲ)**zΜ9U@ϟ_WKB;YTT)mI{q/`yݫ)Sx?l޽ЬXB pZse:„,PȚݷv{_X.6Ϳ0̙3vx=K,I?[ٳg|e39rsέh~{%xavy͎ÂjӦk5}t+hذaB-[t[oO? =;w׭[&j3ں}o$j_m]f[B ŋ@�@ vmnZ tsE TCvOUٜxğ+s'zƟ דo9"ݷ=nZso ͋>6/bs!lğ*f@^dݻww{!Y9: � � � � � � �j"� � � � � � � � @ [N3gԬY4{lYl+DSV-mV<4iK/4F@�@�@�@O WBB)sʥ%J(&&uX *+<8_?va VlZ2T>ج={:e?+VTժUUZ@ bA_;vp4f!5mP{Yg ?bAVkٺrЩéYH@VvP,(tLN J\L: . v0/f㇀Y8}c_Db~H}-'m…]׼gϞƴi\<xnv-[օk+..?GdQ;zVsϥA>o=[kݒoO=:u }zfs`}-Z[唿իW, � �i+`%܂gxi/JA~w` vͥ$rsIj)?¨ϙU6`n@,>lm&ϓ$oE|'4UcT޵^v8̿^:}ves!vfmܨ5fvecf9?JSLvEƍ#@�@�@�@�@�@�@�  Px" � � � � � � � �?ӧkƌ.HkͮHgzԻwo5kL7aA�@�@�@�`ŋk…Z`-Z hXY_/ (YkV06U5zmZ6aBV^BZ^~e͊ZU4h Ьx3KX SYۺukm6W/mŞP,eU |à*U =qH)ŏkY;'2?>Vd/mHXql+$mGK/bŊr6p@d_- j:u[5rsa0t7 6]Aw+_\9 ١CQR[S;iӦvRnt`g_}]4hϳ>%jUj-> @�Tk׺kU  ŮpRȌBloa~駟\ͣؼk'^râ, )k~ضZ Yx0/f7.NQ7-PF,DA|?bb 7jd?bŋwlXmŽYhҤ?h۶:vs='k � � � � � � �@&'@�@�@�@�@�@�@�@�0xCa> ͙9sNꂴqqq5lؐB%pR@�@�@�RGѣ][ɒ%Kt U~}F.(uΚGyoօYRZ5i4o\V =㏮mܸ1b:oa4V/H5Y`ʞ={๬gVh JܹYhO懡޽{ɜ9{Mbvka>eʔ  ttC[$`:>>޵.eot+nA|3fps6..u[]yʕ+upطUϱ}6n8Ԯ] � >ks2+ A[K X�udQv7bvk(~ص4Yϣح8٭ͣ f:Y8?ρ!ftfp%ld˖9 3P#uYl'Hqp{E � � � � ^ƍ{0D�BX`yf͒Ht@ @ � � � � � � � �#@A-;M4IΝ++blJpi֭լY3EGG9" � � �O|)Sh߾}*[)Lݻ5o<>}tZXH˵^Ν;Pgok֬ {>[g+(lnX%Kp7s[س0}'Yqi+$m7?`¹';/(X+<mYBW ZJeTVײyjt=zXRJJz^Ypׇ~ŋ]fs붞3g:f0l,(^+ou]ZRTTT0v>!� �A-Ю];hdaS\25WZzko|ͱbFme@ҥKf6RX1.?͟e6bה\bZ*Urvmk!vk!p|rŹGĘ 'A"@�@�@�@�@� Px aj]8=Zn3@�@�@�@�@�@�@�@�.M`Y3gԧ~,XJ׬'q@�@�@�H cǎiĉzw\ XT׮]նm[+W.-NTܶm �ĊC]wrT X7|od/^ܽ,ɚ6'EXV R9L+*m!ll_XZj^+2m!m,%`{˖- lYH[͚5Sܹ<}X1bd,m̘1zpB˗KY`c˖-7o)4wVgiܸqZd (N:W^jѢEh^#� � `}<gOSڼ@5]$/`Z+Vp)g׼vm%K7gb!J~?bs)~҆ ?,B}caZϘ]/תU˅J[Z--m>1Fxg@�@�@�@�ud j]LօL@�@�@�@�@�@�@�@�Ժ޽{5yd?ܳgj׮몫R)V|< @�@�@�`زeFѣGk֭.@£,"&&&غnٷo «4faZ{րd<,)8|+|>[Ќ-(c >[ *(G)?{"p~K\Tֿ@q+,nA[VX:666P\BXBG/[dAi5 lթS'0m-7nzܹs/);nd]V Gbaw}}]-]U?Hea � 9,4%,k=]�\vzjJxb+W,؂,hKɞ=;,\smG7ovX́ԭ[WsB}k+R=zkÉo�@�@�@�@�@� P+$_6:�*@օj]D�@�@�@�@�@�@�@�@@xXք jʔ):q+}5ꫯV%h� � � �.`!#< >}_~*W\w=}vuck׮us&CU-ҽ/~B+my%Kܭ;vL9staE5ktEŊ aѿ08tdڦMܨ *$ ` K[i޳ضmOز`5+-;1 X^xA7|' ޏ7N>,83r+S"z۲eꫯPaC wG�@�ڮ-VZK*;S?Bv q ]`͛k…X@ͣuiڵݺiΝbO#Xw׭vjfxl3[1'nذ i ɓ'}^>|xڡ?tB5d � � � � @$ :cF�P P_9.܎g"� � � � � � � � @9V>o'*SLj۶v:(o޼8#� � � @ Xԇ~XǏwF{w. a9L6M=f͚f͚iذajժٟƏZؘ_ >[Ç+_|г|+*saI`׮]_Xn-xˊK[FdN۱Xh}[={YSrKv·Z=ﻐիWu b,||I/.Xmb3@�@�?>cuES\ŽUʖ-ѣGؒh}n~昖/_7m+pF 4pswł@Z صYJ? ud-\ٳuwRo飑#G;Hcr P+9# � � � � uH/.\@  � � � � � � � �{ XJ ڻwJC;vTttt2b3 � � �֭[ecƌQݺuukqۡ<껅H=.V~iUV-nݹsfΜ(w߹0ZjV`Z ҭOK, �'O5inٲ R"<.^ ?ϑ#G͗[`brNZh�ċru]ZjnwJ*wa=zؿQqmٲE rVH! !� @X ؿhƍa9Nܹsx ʮ9,?ה)S\XZ@[kڴ * ,6mڤ9s@j q>n޼PWT)ciС8q,'@Vf@�@�@�@�@@"Pw :j]kEօL@�@�@�@�@�@�@�@�Jؿ}]WdɊԫWO7tz(P ў"� � � @8 X^+laZ\rFB?i9/BԚ5k4x`W5{٥T=w?+<uT-]TQQQjذaسΝ;U~AVT LϚ5/Xť)*É~<xЅ;vΔ)+_vw}|MYs=5j8pnG:χ~Xyu? � �,ЧO.) ޽{]hwmkF 駟T\9iF[V\\.e `CӧO״i\ʕ+cǎԩ `[hnz=s � � � � �A)@VP,t HR@$YR@1 � � � � � � � �I PPA|ו9sfտUV-i4"� � � @XS Զ<@QK/92e`C�O>D~vܩ@&M(gΜi !}uֹ~i+ߠAW\sΪTR2LF0emGc!O6מ+W.=֭y'[`۶m.rر�#G*::Od@�@ ,Ⱥ~.x4 +WVZ6ԃj-~̙zGi׮]jڴ:tZ*U%dL(`%KhҤI0a/_%Kʂ{ڵkʑ#G\ݖ-[tRIYGgʜ @�@�@�@�@  ׃ �g Pl:g,Q@�@�@�@�@�@�@�@�@ i+8ԣG/_P-+34[@�@�@�+ ѺeB,X{04zfͪjժU X�H(-Ǐɓջwo.\X_~W >ܽ(#OV(5l>[oՇ~f̘ƍkѪ\+(Oh7NxiӔ)SF[RlmlݻeߙRI/E՘1c4qDh "� �իDtXzu:o޼ z~0<iƍ?e˺׻9[ W>]׫WO>-[& ;5{lթSG5kt!6ы][ѣGիW/Y  � � � � � � �\�Zdz@�@�@�@�@�@�@�@�8oF;wVllݫӧ tMʑ#Gy0`@�@�@�"Q7T6mԲeK-^1Dsҥ_p- :thzwϷvZw}*YtW_5a_ŋ?,lEz'?믿V4j()SFm۶u[VЙ%.\K/T5jP\\z^=S.>ӢEߺyw{M;B 3g>;W\ኳG CF�@�_k.sS,YԨQ#͙3'^3gk W׿U6mrձe -gA ʕ+n.W_Clα_~Zre2ĸ9SGоpr@�@�@�@�@�@�@�A k8 1 � � � � � � � � @ lݺ?;v+ʺdծ];O@�@�@�@ ^z%q+ "Џ?VZȑ#n3fг>I&nݺ6l:XtC@ZdW_}% ?۷.Wt݊,X0LFHiÇM6M͛7Y++o&D'0&A�@�HHHp9PشiS+IO?T<9P>}t}O}_YhC= &_Tllڷox@ 4H.YHh4}^4i! � � � � � � �@pc@�@�@�@�@�@�@�@�@�8q℞yU\Y?LVڑsd@�@�@�VwqaZDVƾL?It?ꪫE6`�´9@Z 4lP/~gWLRҥ5dܹ3OS(`7p,X "$L+pi[eѣ:u꤅ Y8$ � |W%\"  uڲe۠]4jHݺus;iѢEP!Yfusv=msrr NF,wyڵk^ziϞ=Ή� � � � � � � @X/#@�@�@�@�@�@�@�@�@ m֭[M?s � � � @ XQ>}hE@s=zy+WVqZ~^uW9C;phvmhرc5m4+WNO>=:?|P~&Nڵkg|"3gvWձcGmݺ5E> �DjU\9Z~��@�IDAT}=iҤ]t79*Uh͚5zTl٠/B G-[Cz?#G{WmN;ܜ@�@�@�@�@�@�@�p P+\^IƁ� � � � � � � � @* L0Auq[tM|� � � �"`@{衖-[joSyt5G*S+OxN� dʔIg/+^fMw?gHZ ̙3G>yW4?-űS.%K[ʗ/򗿤� �@BB,) Om׮ ~.g? (/UTu jɓ7Pݺu|ezv>&&FFgyj΅� � � � � � � @6/%A�@�@�@�@�@�@�@�@ ^z%uU>czGH � � � j믿"VT+|ܶm[8q/^Wڷo6lpugĈ*V ZLq6nܨ8jRwDE (AlҥQJI/ҥ3'&! I6|>唙3;O6uT3g}GvW. <P={ӪVz�ͳ^zǏw[Ν/0Y$UQVl͚5ְaCo&UuR~/\`ݻww+bv1ׯ]wuּys7n)3bQB$~ᇈ^lٲm'Nm2 �  *SLW/kӦ-XOlQ౞̸dH)W vmXҥf͚OJ[hawu{?qD\VeY@�@�@�@�@�@�@�H � � � � � � � � Q`ԨQn0J VywD � � � o[@)P &9rn۹s 0_|цnt5ߡS2d0(KXQ6[b5n 駟Z/ A@%+_juو#,m+6n۶ͅ>|ثNV"ϟ֭[m̘1o>{ /x%<K,pFkؖ-[lذa~=adǏ 6،3I~m޼j͚5˾k{;Wo{gF[ Dy|?T`G[wX@�D3gΘRJV&M,gΜǟ|$I֧O=)W.gyvlJOt}ʔ)e˖.YfWY:t+WΞyw,� � � � � � � �@�@�@�@�@�@�@�@�@Xp=CP-´< � � �l?؅H<)"w݅iEz޽֮];R=SVX1�'NpG\_5lJ\xv4ض4M>0ŋM0.\"y[lFӣG+Yeeϝc,{PA<r4hUV4x#<wWZ-'ϭ_~~& { %&L`׷7cq.xoȑUƎkm۶כ_Y-F>.L!@�@ 6m=SJV O7߸O>&u}a}vޞS<ě+Yu۷5k$ڎk/ 4W6@�@�@�@�@�@�@�| Pw+D�@�@�@�@�@�@�@�@ 4L.]C֩Sn+C�@�@�@� `%KWJ!KjC9M8q_֭[g´-Zd+Vܟ/^p~* 6QQҥmі*UUݮBp\)l߾#'+M4WڤF">5j(Px畮]QϫWn&Mc/+صk/P8?ٲesn S)\].һ-Zƌ? B3gs,cƌl̏-[jժe[� �JVRyѶId+W D}b|xIg裏]wݕLϳ{l0ޞEJl B$쎢l]zٳgox� � � � � � � � KC�@�@�@�@�@�@�@�@�#0c ۸q͙3'4"� � � @gϞ%K#<rW]Ծ}Zj֧Oˑ#ۤUhB2*WlC &MXVs)>uֹP[oNm֬Y. ߶w}VZe~]}>7e˖-ϻH}7}J"}^B^0UT?4lО|I[vyv#nCv?M0ԩSmv+^l7nl)`.e„ m6k޼׼v(Mϛ76lBT05kVۥKPoڴ94xΝ{j|sNwo@SK.|饗 ڴi9uwn-Zpt輊i{niɒ%nswC\Ǐl4XBBBlذacO][޼y#-eر6{lۿ⋖/_c&x EV?@;>m<h:/ K]t(myr-.$駟vaO s ̟?1[c\{ӧ9svd Jl1tNۻwD .h`Ϟ=>OBúR@�@�`гo"E,SLؼhۤ5j?O$}8q лi1=ӟ}/љҟry}\&2[Vիdw~l>պu^  � � � � � � � ^|� � � � � � � � �,\5hGBy@�@�@�U`֭.$#™{97SU?4`ESNࡲe˚½Zo%+|C#F0\)CR)/I&}gƍs 9t)_9PK#w} @D"ڮJ"~%D)_۬Nlʔ)v7ZR ަnݺ ,Y5kָ0={ڲe,W\.Jm [:;FۛV^펳믿ގ?f-h Z :Fk֬s;vh 4o־;ojvmA.oP 81cƸզ֭[6DwPWt1^{.@KASj`WT9%2eʸ *1b\r;w}WX}^enfX2|}n]PLmUVLI D&Upe *\p4k'G]vuai:| AJZ&}5׸SB&{~GvAQﹺ(0P_y1Q;v̅>V!ByxuoO> 9LKmS^{M@�@ iҥI>E>{Ngl/ۧJ'B1=+ܞKg|b2?%|WJ,{M_~k_Q>0  � � � � � � �\^ a @�@�@�@�@�@�@�@�H ȹdɒ)@�@�@�|8z[2gΜ>b˗/W^y>Sơ(HH'|6)HE}7oUUΝ]xB~�5yd裏?7oTh RheРA.m۶Ѯ~->\"3g6wv#nG!k c"uԖ&MR3`�¦rՠ Rp/�жH".]:A5q`.}vE?Η?[ڴi mڵk[lL- {ni?*Ur1M41؍\9F/OLʕ+ z3'jК& dOjBs~p-('>E tuQ�/-S[]| 8;ݛ,޹p:r֘[J{#}UVرc5HZ9rkxvroվuիWYOLE!*H1~ϛ@�@ 9.]{:t_N\Dߏ/;ygĔ|1Ley! VwEA�@�@�@�@�@�@�@� ",� � � � � � � � �)A@^fȐ!%46"� � � 3ftK>}5|_>s@[5jI:P *X۠2Thӧp[ouoNZr!Lڿ˜|) .t=Cqq/,4442Νs *sΜ9ͨɝ;yAAQK<hUV3gGyU ZQTծ];w *(FG mq0ÇƍmΝny .\8<EA[*q FRh}Y޽[wn;?^=ZVY Yx+~1\֏=汙zgZW![uuQTt~ŧTR%|+kkBB5GN BZZum甄,™roz: (`vyE篮Nu:hv+VX ^ݻׅnJO* � 6mJZ $ӧ5*NAotam0)ޏLПI$\w{W8M7dI䗘me_ � � � � � � �C?6@�@�@�@�@�@�@�@�@�@�@�@�@ Y x[l{ׯ_oٳg~-|Zvi0'| J&MUVS{a7]oݺus" }?p<Sꫯ('b{!L;v(w6nA6g;ydԯwi:um۶mf QBPbZT9yux㍖5kV+[<s i1cXmȑn3fDMԁ5طYfMI&1u{V/ntӠ*^StYڴiݢ m'N\Ru] r厁KL@P$_$fߵ[ZE4Vx1^uծ]۽ǽۮ7W�#ە+WzG+$S-ZDo7sw] � Oo߾%G;+TG;]P;k֬my8DSS"%ֻGڢECk~zիW{1G�@�@�@�@�@�@�@�Ԋ@�@�@�@�@�@�@�@�@�@�@�@�HXD`SdΜَ;f Z4'O# |E<>o2fh7n?<|Rʄ lܸqV\9>jٮ]*TpsvKDPcǎ)S$p:6?Ǝ~޳g϶;#ULn*JrAdڵsv}B\p:[buڟ땨+O2ŅiQF9(64>ۍn So5!!ZtiB:p9Pׁ޽ۆ bO<AEqիּ0FWi1[?ӶoFQȀN&Ol y* Y7~3  � l޳}RbQ /ϓK.'nݗ/QW?%Hҟ,޽k#Gkݺub2~6myH@�@�@�@�@�@�@�. PR>A�@�@�@�@�@�@�@�@�@�@�@�@�h֬)ku|g,444| .}ˋڵkEZ~soHҥK]EUVnS۶ms)={?k֬H_p.L)~zߩ~5kV?m(hȑoB<#w^;ok޼yv8w\RR%:u jԨΝۭsHf իׅ͛=.^hӧOw[Ҡ �^<xLSQT";hn{,vGz?9s&z QQX꧶}/LI&-|&V4> 0]c+ QxۭL2JUV &{utVx[d;Zlyɦo?iѣG￷͛sl @�jYXbQDΝMa}I+LZ=z0/,Q+ag{hKS)}))ђ%ʇ'|]f,YeQw4:u*׼G�@�@�@�@�@�@�@�jE% � � � � � � � � � � � �Dҥmذ_\xef_|r-?l:t!C8pͣ. jذXI^QUHHH�1-s4)hԨQ{n5kٳ];b͛7W_}e(DZ;vO>$w4l0TB˙3g m:q{}ً/h QPʄ l̙֯_?[l={֦Mf+W ERWo^-q>qU Qƌc:vg}=SnY̘1b;۞[2fm|7z˽׹ҵkW;˝rsNӧ?uڽ>o\)ΛzMV| :uj{W]oO ENƍ]ܗ_~~B݂@w/_mM{ow5*[Ξ~i˕+,[ o:ur!YQwmw-#~|;0Cnm!� �I-g3fL$ӤIgp,ꏨV{s޾.<Osm))kbK/^l[zg&؎|w'M,� � � � � � � @ P+@�@�@�@�@�@�@�@�@�@�@�@� T\Ќ_vy_ꪫsA5sqjcZBL. Q7o QXGL{UP]weT R?ˑ#o~'§ZO?uky^ukڴiBTdIdQ7ڣGԭ[7S0Car6mڸP;v{)Rp x1bs=F—t)MaoCuA* #GXݲW!/ .{},_Z4裏'vڹ5Wx]z+W̤&M:+Ρ)SD{xun{wc3-_ڰtRk۶ Ӷ:wl y+I+,Koڦ%>W�^ժUM@۸q[M6~ڵ3eϞ=.1] ڪPmT[o]G)h+իWw ,pI]{̅F~mrl xުW}۶m믿z]wV}oJ*D k'OCl:.ul @�Hb)R$kW0շ~* RW%z&KraՉg|b3?/~]F}v7|UyRkѢK꺰@�@�@�@�@�@�@�Y Un � � � � � � � �m@Ou_UXц ,� � � �)G@A5 Qϳ>׆ޤ/^<N:UDAVrC_s5-ߝ={g NL:Յ)HA'f߭cǎvihP(ƌmݖ>}H@լY<)e޽.|,@cǎY6(<FZvr}Ժ<x.Ν;|Ν3M3gviz)SebzbZ<6S-vl߾݊-zI8t^mk~qSk%H+6:kڪ0btl*˗+z ZmQ܇~.]یE`Ȑ!. Q(cYުkt*P/K, .<s ɊzM׻Go6|[f Yۆ �  {GBӦM %]5OPlYx؁;z'~~~҈yfߕ99bzrUo KN=_~/ 5XlQV Ϥd � � � � �)Юp2e`7HL7�$fy͝kV^R 3m:5G�@�@�@�@�@�@�@�@�@�@�@�@�(YkOu]g 6n\uUag3f ӧZ -O.K;%dֆ ݻ'zZjU[l);믿^z%wDH R)X`o10+Q>qӱ` <z6mZK~kҤeWݻW d)´el٢ cN|x5J U}QҰalVL[p Pza3gt/vkq@, 'Ľ5M4VbX^oryEɤILAVQ@�@�`سg/_>6)wqZZy]A mРۙ0a{˳{|q=_<)D<n׾?^NBX�kۋ-ի'nM<v-N0 � � � � � � �)ELJѠ � � � � � � � � � � � � >jK,q VZ%5kfe˖2erָqcPۉiXΝmVn]SnVSKRCڵ+A9r/QF-`cr0h{υiɓ;vfz ?~ lٲ o).9$sESN܅C3@49@�[?{ Zԩ-_͛ի^0z)^zD)j$@OW3a^)HKs?g{,R8}9[͒%r-W_w>@�@�@�@�@�@�@�H!BJ i+D�@�@�@�@�@�@�@�@Çw߿N ֯_*VSM}?@�@�@�HgϞu/ZڵGŃ۶m3}(kܹvUWL+7ol}V@޽s=/_DY'u9;lyMCS@I0rH6m ٳuD kך˔)Ξ={T.dĉ~CСCSXi. �43<c P#pkVZ9*\l[qYխwޮ?.mڴV%S]ɓ'>7|v!~+#F}ҥK"|H&A�@�@�@�@��v۔)?A�pR@ Asf%讂n㩃E4@�@�@�@�@�@�@�@�@�@�@�@�D }n@on&<yr쇍.@뮻ri?c [D {mΝ֭[7sW[fl„ vĉoRh"믿ܠC !Lˏl*V\ibŊY&M,44fϞm "L+~rO?d[nn_W_}ڷoo=aZsB@�8|Νyۗ_~iovoe?[jլSNVH߿=/П9{,XО{9뮻l۶mo\_itkԨ?~KA�@�@�@�@�@�@�@�KԺԄO@�@�@�@�@�@�@�@�@�@�@�@�@  2_|a<kzigϞai>qj 4]͛74s ݷo_۸q͙3Yuչug١C3ftc !G t]Xd=3VL\}ڼ{n4ii tJ` /_ k̟>}z`W8j6mڸy{׃u4@�^ɓv9˕+W O2h {'mܹI*`{OW)SB֭8`?%h(0^J*YժU]xvi/\wՒ%K<R@�@�@�@�@�@�@�@R.5@�@�@�@�@�@�@�@�@�@�@�@�E M4onG5jo|u[n[nzmta+Yd&ճcھ}l„ 9sf{G-_|VN{WlҥvD;B <xeu;{mӦM믿?nW]uUrmbwBl.R}>"-_}UXѝ3?M]@�@ I;={$G駟VZwa Iꢀ'x֬Yc .t>V@kР >vؑd$իW_u\s k֬[,X`weȐ!AmѢE � � � � � � � @ P+YlT@�@�@�@�@�@�@�@�@�@�@�@�СXBBB\KnI_ S瞳۞={ 9UTɲnsal7�U^>#70n<y܀ZBCCe;48r}֧OVׅ͛-zmΝ.g%Jsl+2fh#G3fcҥmĈv…DIpnƍ[ha7|\֭܍u � @'NwYf)/# B-[4/,Is#sbb^EZJ쩧2Ş9s&~"Ǐۗ_~>=)|j[Xȝʔ)sE /?u@�@�@�@�@�@�@�8W#*� � � � � � � � � � � � �F@j^ 4A{'Ol~9?s>sa9[޽-]th4hMU?` pls:u 7`4F%K�k A7ov*kPم(DOaZ5_ݝ W=֣GK/lqj߾}kٰaLϞ=۝Sw� �-[TD}3g4޴nf͚P}2iӦƍŋ.]!D-SL.覛noj֬P$ɓ'1/^Lk׮.NaqXjժeUQ) � � � � � � � @а[^!� � � � � � � � @\ne\~VbE7d@VJ!� � � @ ?~U;}{13g΀{T6fgܹ *P@T1zj7o͟?.\h۷o4iҘ@իWw,h? ;]lҥӒ%K\\ƌ]`ٳyl.9YkM>ݪTB+۶mkSN:ܹW?CSPO?m> P @�H =g׭[vm)!.+VpVv}'@/{u ,;wرl)Ha:$$$ЛBP@g- 'ry+W]kذ5hr$zW6%iLA� � � � �  )Sŋ|c @b 8`77 H='}MM � � � � � � � � � � � � ٲeAYϞ=mС6d{7cǎXժUY-[>uҥ=SVpာobTB v@ Rof'Ncǎ@ [re7)pF![ U̙3n:`zn@ҥK�gy l^Z5~| ʗ/oSNunjwy(QW;udy r5/44~'_|$]v%1~� �A$p9ךtQ)c/yw}7avǭϟ^7isR` lڴi+^.^{U`y5\]\X6c˖-sx R>K6 VO<Ⴔ̖Ҋҋ+f+W$P+@�@�@�@�@�@�@j]@�@�@�@�@�@�@�@�@�@�@�@�@ .|wn@ԏ?}7ipnݺY6m,$$$. eO<i_}=̙c z5%Lnv7 a70/_no۷ϭDP.n-[ZjӤIyCO q~z[vYM… .$K^kM6us ȑO5`3*ɓ'`#F/l>j:wl 4 -߾}M0Tnڴ4@ "K>} @�MTjC@FlܸqoٳK/th gisÇm믿魷 KQBļr=)S ĪS} WvPtW]լYk)K,ؔD-wDA�@�@�@�@�@�@�@�M=x� � � � � � � � � � � � �~P@L=4o<9r8wa[yiǏۗ_~iSLYfٹsL3O:ZhAS~TRA5sܿwժUn|Mft(PDVT)7kM\ZNɋ4 6o&VpBӥK) >~]w`7 UQjM8FeM41Yl[u_II2jR(@ܹy{kJKz � @ ?޵@-mۺVReȐ^3&ڵ+\|_}U D&^lyHH )@`ݮ W? l{=P ۭj 뫮*į:pGA�@�@�@�@�@�@�@�jE � � � � � � � � � � � �$@zLɓ'믿I&kipՆ N:1cAl… .￷9sآE�7t;.PAe(M#CA5د& OTRNm EI[E… W_&~̙3wik`hM۶mss]Tt(Y+W΅ih)eΜ4;vuom޼eɒnFبkJ=zΝk޽Ut)^ \H+uA�@�гŋn\ؽ{wg7`@nVP!ԬYN>m֭3/\wϘ1K={-#Gr/S<SLE ;v{x} ^N:Q/XM+V fܸqq[@�@�@�@�@�@�@�Hj&"� � � � � � � � � � � � ( h׮J?ٳmڴi6x`UV-Tvm7WQr)%Kŋ_~1hPFك>h76B 7ন{߿ZI^h˖-sJ^S~ς -pyS|\y!%*tyo>oi޽gZphhokZhz}5׸)}I*v?:F{&k͚5˅M 4z믿>ZF ˞={aÆ{ 0kUVv-Xݺu&_J"� @ KUܹsPdUx+kuE[SĢvoݺ6n7oTf̘%! TSrqN�<x}?DA 8)X ߻&MK*~TR/!��@�IDATˋ (]}Q'NYC� � � � � � � @ d?(A�@�@�@�@�@�@�@�@�@�@�@�@ (\e˖nRo-Zd}[.0C6*Urʹ|VlYTm�֭k׆OVrmP4^|EMux֤~o ,5^�?^+IJG,rrZ!!!.D͛+KF9sZ{G� or7kMvD:t4ihMmΞ=P+ FE5֤-"&(\KkҠ͝;=6vetVB{΁2eʘIQTWM5kք[w+N:ݻwowoUp!@�@ i3 Zq]v4iҸmȐ!om-KStE^X&=L6ͅ]G? fw^kś$C :|2DB䯀&o?>G}P?REuA˙rWyn  � � � � � � �#@G � � � � � � � � � � � �kݤ )8G.]V^mK,?؎;)S_� _5yE ޤAc5i Y Mz}I7Уy %)iҀ*;UInݬZjVV-7د[B;*Wc{5`7X^{NNI/[-cK[tEǕ)[lXA7\5i٨Sƌ1ZSԩ}+xG]}ν̙3αӧO5,tG<MzzD- >GB4 q*ULΧA5`y{&(jŶ|r\_{5w2wzT27Ϝ9zWum޽Us`UI:UNQUZ]Ǽv0G�@�<3J:wn<zhp\kyXC"P/QP7y( ҳҥkPکS"D\ݽV?Owxs#汽VB'߫#O{?z} /Q߈?4y,I{Nag} *U Q7i9P^ qOV�@�@�@�@�@�@�@ p ߂ � � � � � � � � � � � � @կ_M>v_v)C[ -RX|(DjY(XD)RĽ.U+V]X? (FkR/E k0d/`F"{QD 1O)pYse4r邏`ހ  ,'BŢSs MA�t?kӦ5t-ڴim޼W,{4Ң]筮jM � £ � �$TIwႜǏcŔO&F,s~,Wy=|{6Q?,u,D\[l 7Q_I�+<DG}_ \N:g#)HLU D֤KQ~;U+\� � � � � � � � @�@�@�@�@�@�@�@�@�@�@�@�@ ( DSlEAC^HUXٳgç[4i܀T Fl)$9/_@њt+`+q<Zŋ_G믋mدA5܉mvyٛkh MA�9[\97T+iz bA50}{%Q]$ � @ ?ƍ?`vթSǾK=-YϞf˖٠Agvu Ң@/d+bЖOoD>UT"#O@,okY  V@�@�@�@�@�@�@�u@�@�@�@�@�@�@�@�@�@�@�@�@ Hr[A\@78sWbn3ڴis[aU #G7C{h � wR)W.puْ%KyVVVf+p ¦Mf}Mj֨ᅴU0WUlܔ0{`] O<jŝ5@�@�@�@�@�@�@�\ u!� � � � � � � � � � � � � � � � � dʔ ۷? -Z,X`UVo}?m9x7sYf˛]kfg'\VJҲ.;wn믿{3? � � � � � � �~ P˯l @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�\|Z}gn_~yȑ#Il^~٬D ɓ}lJMq4xȑÎ=5Y@�@�@�@�@�@�@� P+x[Z� � � � � � � � � � � � � � � � �Dȟ?ݻ7gr4iؠAlΜ9h"kmW … fcƘ*e+fzmdfalR;bO@�@�@�@�@�@�@�N@T @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�BEڶmۂeѤnVXa5kִƍ[ǎmQ$ŗ_UOxV˖io%KT]"`Yf'NX � � � � � � �I+@Vw@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ۲eK/%($$&Ol3gδ[rwޱgϦ?1SVٲfWY|)"pY̙3۩S. � � � � � � � JI6mE�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�-Pxq۶m[6HƷh",HjukeʔO>.^XUHXa֬Yzf2-Yb6eY҉^v@ d ;IN> � � � � � � �$@B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H:aFN;vX"E")dYf^{za w}0͛͞{ljBmҤV>۷oMxȎ=j'OtRJ嚝.]:˖-eϞrm  )mZG c6,!C;sL  � � � � � � �)Pb$4@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�R@ \WZEV"W_}5co=SaTYN5j$bmlW{n[Ϸ,cVmڝ Iԩ]`V,YLSƌwιsv1;q3[R\rV|y^խ[rA@ٳ+&ڀ� � � � � � � u� � � � � � � � � � � � � � � � �$9sZBlִidR੦BFa/ RСCdɒ־}{k֬ J&M7a[~ƍ]֩S~,]bV5v X&0c|9j](XhϞ=.k˖-vZ[fM8 VTիWZha7|$6mZ*|� � � � � � � @J P+%@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�R@ʕm)\rY>}omر.8JTwQUV*UP*;44X)J͛mӦM.4KYGq̔) *]tXU�mժ;w5߿u*+]hѢn#m?ۼy짟~w}BBBm۶v]w9H+d @'RE@�@�@�@�@�@�@�O@ijfO � � � � � � � � � � � � � � � � @ ԬYƍԨQ4曶vZ3g^z%;x[XbVD +R@ܦ`YZ LT :w?nGuX}޽{m׮]sN7={m_/^N:ֹsg+U)Dpvp"ּy<e̘8zmI{TפI4rH+_=cv=($j]p!9T:"� � � � � � � hj%5;B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�^VZ /_F(WizGG Z|X¶nj;vEP,fR2^͛o2eXÆ hѢnRV-UTlNy^ f.ݟ&Mƌޖ:%' {СC]>]^,[lVv@|RDjGu@�@�@�@�@�@�@�Y@`ui � � � � � � � � � � � � � � � � Ef͚ŋ#[@BLSf.ȑ#v ;{6mڰt.P*G>}Kֽ z 2e2{ꩿmʔVam& J4(\=^}U1b 2͟{9{EUx@@< P @�@�@�@�@�@�@�E p@ � � � � � � � � � � � � � � � � @ ͛ʖ-ks VbŊҥK[ŊB VL+^ɓ'aZka43Ƭ[Vb۷o3f@U{Uxv=X޽|6gΜ@.uB]x @�@�@�@�@�@�@� @V ^"� � � � � � � � � � � � � � � � �)A~j6i֣5ט}ـf۶=ٻj&MrSɒ%}b-;wn{7lÆ VJkԨuՎ=tb 7|� � � � � � � @ P+e@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�R.]jǏO 4}& 2+QltͶn5,sfʞy{뭷aÆ H"6e7˗Yf%6PH*ܿ1C�@�@�@�@�@�@��Zq7c @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ Y 4h.^hsIʖ57l͛},SvZرuzZm۶5k֘B6mj?;jT@�@�@�@�@�@�@�@ �ZQ@x� � � � � � � � � � � � � � � � �@HHժU˾`o* 0wJUbj٧[g֥Yt._Y˖-bŊaa[ai[ɼΝ>sז[&MɼUT@�@�@�@�@�@�@�>7E � � � � � � � � � � � � � � � � e%+}]ŋfSծmvMf'O}يfۛI}.\;N>TK>}|ϟoׯիڵkqk: � � � � � � � |joJ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� 4oveee'e|`V*dhټyf͚J}zBf̘a~di5lٲeVpaS-X 'wT1ɽa@�@�@�@�@�@�@�x O8VC�@�@�@�@�@�@�@�@�@���_zQD.*vw?b `Ghb +{#D-F.*olrwai.f3gy] @� @� @� @& ѹs[k4FyfdQFlyGW9rd\zq5lP\.R[lo}qgrfRcfΜYcj @� @� @� @`q Z\ҞC� @� @� @� @� @� @� @� @�j&^{ ԪfW#;,cLj>bq"LjWwO?tyqꩧF߾}}C oѤI߿H?^{m 4URRRӆm @� @� @� @` Z:'@� @� @� @� @� @� @� @� @@{wމ{*x{#v!bu"L>8er~a;ƹ[6_ԯ_? C C=4FQknL@V5@ � @� @� @�@j1 @� @� @� @� @� @� @� @� @�.Fꫯ_}lƋp'F\sMĕWFvG/;QR`}~wRK-7xcԫWo:;hԨQ?~!>Z0+S'd| @� @� @� S)=� @� @� @� @� @� @�b?<ƌw}wlVq 'Tu]1p>|xf\B� @�RࠃC%\ 6\|'Y_{W^9~T¬z뭸+b,Yj]w-.U篽q]Wտ1DOw}7ᄌ馛z3C@Sֱ$0I @� @� @�s܌M� @� @� @� @� @� @�X$%i?~|<cԿE4 |ܸq @� @ /<ka3<+O0a],̺ߎ.,^}hӦM*?!/kѢEo>&NÆ ףs@ :5f.]"~8WKõ~L\rKUVu~=?dȐ<X㎋.~[ & ԪI @� @� @� @h9 @� @� @� @� @� @� @@xGbرqgꫯ _]f<hРӧOmhC� @�L n>|x{DZ&K,#F .b7,l~|'g!SYTJ{ED\sM_DK}EcDIɏ=vZZG0 D֫W/?s5E @� @� @� Py� @� @� @� @� @� @� @7n\ӧS~v"L}"C� @@u5l)h~]5i$xѡCy5ӦEygix+GOGwNUk~76ڨzb.N8:thU-PRxU=( @� @� @� @�P`O8H&@� @� @� @� @� @� @�~:gy&n+Bb}o[o}YqGQGUnF?8[/~ilqI'EVbZtW_/W_}5:문袋bƌѰa2dH<1vؼۦMƹ+go0`@ܽ;Js#g?Y>?F-cǎq ?K/4^zhٲe?7(k� @�@wޱƈ#ΫtFcƌѣGW_};w^zŎ;8[G}4n|*Sx[l-e&Mʂo_}<CѾ}8cuם5XZzW\i=w}mդ7#4@+[vEfodMe &.?C[ϗc+4hP;.իF*fΜRT_ @� @� @� PՆI @� @� @� @� @� @� h [nelyU۶mo߾>LT�78:<0^<ݤI<*Q–^.s=nݺ/<Omwm<lk=[o5x< k6SxV <xpL81/K-󩧞w=n:~ܸq!?<{ymnt=K/eObw.צ֑� @�5YAtaSLT~|ªnx7^c5\3hݺur´.KxB~x3KJcIk=zDZ-6~dM"<]t'|rAZm6k#6<b#""ˮȖ Uz>NԩSh=_GL#z?w++o� @� @� @� @JjU N @� @� @� @� @� @� @@>< _~q!Dǎ /ѣGg/6]vXwuw)j^XꫯUW]\pA̜9/R^vG JaVlMBTv7a^;s={ۦ0JJJ^O<Hbf͚2;IZ r4yyC~_G @� @6 Hu7qZ]w]H\~<8Ί~a)d+R矟FsZ]z饱馛}c JC=4:tAO>9_92Yg|֯_}UxvƌGl,E,={EsNDQY"W z>%߻;I; '/~ sRl @� @� @� @@yZ=\ @� @� @� @� @� @� @�O 6v)?3fL(?Pkl=}nӧG>}b6p+ĉ6۷Ϗ{OjW^Xb%bw}7ƎIcM[ 2eJL6-:#KƍɊ+8<dyg8믿o=n˧0u� @�5X w:tgX㮻>rm}޽{ޫU\͛[o <[ [vzpo??OU(_,c,N9%b"6qDw^GE)9nՌ;zM6RlP02JO kg?QFUN @� @� @� @Bn @� @� @� @� @� @� @z LC̜99T *z_1p7hРA~^p7x#z磰[oʼn')<~u/)�+m#Fȏ^xaǝwޙ]v-a/i\sM,r?!V]uԤ0O?l|/b>TפI @� @v{+#<2ۄR^;Rw}W]wҤIZ\^t1Tꫯ‘ ki=ڭ[+-D\rIĆFtqMEp瞋80b饫~i]bz*AK~m:mes=9sbqY @� @� @� @� ,P_,n @� @� @� @� @� @� @�j@?CVn:tȯ]vrzwEf򗬧`ۻ[h 6 6x[ᅬn-6l}ذaQݚL>=6txcӿxGfϥW&O~iR @�i[G -M6-FF6|c.C[.+W )jƌy׺uHY~a7me5O>⊈EeyE^cEDqkYK,L^[X'=#r˼z~d ivX>CSPE� @� @� @� 0F= @� @� @� @� @� @� @4g9vr}=zB֔)Sʵzvi̙3˚?Sq']$f }Ɛ!C]vѻwx"u.s=Rpm۶o1wqGѢE=ztetA9!@� @@m8S0>:>wxW'D㦛n[.N8x䱔@m7,mFcJsZ6mڴ>#LvȂ"N=5b"+0֚[mQRRUO{?ݺu$._'i&<zǭSw ӧO� @� @� @� @`-Pk  @� @� @� @� @� @� @�:$8nxwb̘1e#NڷoDzo1]|yYxGD˖-nv!0`@1tм津 VZEǎ6)d+mzSI&uaXrKBTQxQfmEӧǖ[nguV>7<:uoqޗ_ @� P~h/7>+򲥖Z*RpS.]b%/"/8qbu7{gei]V+%Pe۷~^{mqaˎ)$j„ )ͪhKk|̩jܸq;RPX֭Z/oG\|qDʚN!Z'sgEpCĮF\g,im[Xϧދ;3?9rdU~T#@� @� @� @� P_TtI� @� @� @� @� @� @�mѣGG ׯ_|yճ>cǎ-{ Zk뮻n7~9=\pAbQGץRk.ox{ ԯf͚AĨ_~^6Ěk~xqӸ+ҋO><G_=g}^~g 'kvs9vA� @�&pꩧwjfΜc|Šiti#ڶm/|?>$NǕ Hkҕ7n?x4lذPSscԩuZRrZå<8 3fDw#vXeֻSdbaZٲ84YM۴Ok'|2GKt[7h qw1'W @� @� @� @@(̺1U$@� @� @� @� P%?}Yw{j^qG� @� @@ug+[ώ3J/_+FNfƍ;Fzf[AovDΝW4iR4mڴKֿdަMMgN6mZP4o&zXy啣e˖� @�M [oXuU,,I|GѨQZw͏ˮ{o|1yhժU<?V&^`͛Wִ# ll瑭{#v-O-rvwկ`1Eꫯb-)S*_*rg1t1 { @� @�T@ſ[!T@{&mF<xdʺUӿS'M� @� @� @� @� @� @�^:AteN!Ts ڪ}qy ZeU|%iҸK61h"|/ @�ivg{/rt5JSo߾"Hk\[c^xوx衈grŢG㏏rK'ikrH 2dc+<+\r,t;#~>h4kli@� @� @� @� 0gZsvQJ� @� @� @� @� @� @�Ĕ=z4JK~Jj @� @ Lz"Лo}.tX n]v͛aYYT<XiGL mq;ѺӶ?~|+6l[ou>^/rqZ_3&R� @� @� @� @`j-; @� @� @� @� @� @� @@9sR>ub 3u]7^~兹= @�1sNdT3O>EO|'NS_~ѪUV[E~iZ֬c}~;x~jhz~V;v8cbذai6C� @� @� @�]ji6 @� @� @� @� @� @� @JxϪ; @� @@ |_<0~WLr5i$c?,9⥗"{ /DfČ7ѣGiElEzEԯc_?C={qM7Ş{+br)uT´  @� @� @� @� / PkI� @� @� @� @� @� @� @� @�Z/pfT=;@%\GVj?駥ݶkWeFElqD?n&P^zi 80V^yg}*m� @� @� @� @`vZ(!@� @� @� @� @� @� @� @� @� t=zwމΝ;/V)S"{n曥+��@�IDAToD}V:-"\3b#v٥صkD۶uF 9x뭷ѱc֭ @� @� @� @�5P @� @� @� @� @� @� @� @� @ \uU: a„w- JYo]gD3fDDokkQ U>0XK.$ݻwσ @� @� @� @�꜀@:0 @� @� @� @� @� @� @� @�LK.qqW_C ֭[/PG7Wի+\o}*ڛ7_jL'_~5*6lu]㩧-[$cP @� @� @� @@MU>-c%@� @� @� @� @� @� @� @� @O$pu]gyf\vee<9">Ӟ³ o)m^RѶmJ+;ѩӬcLjFʺvB h"dM;3J� @� @� @� @RZҨ @� @� @� @� @� @� @� @� @@93#>(M{q??(z|„YFMF¬[W,SXV:odV{gj Ø1cbHwy @� @� @� @G ф: @� @� @� @�go 2eJ]&0w @� @� @� @�&0}ziPG|ID:Ьt,T7uɵjѮ!ѪGđG>gՏ嗏|OAZK/=3" ]{� @� @� @� @Z(&@� @� @� @� 0?Z|T @� @� @� @�L`̈#>t֞u:}1cƬhf=zDo_~!ytOIʰp c~j?#gQ^z)9Xm`96TH� @� @� @�  @� @� @� @� @� @� @+Dt^eEM));g9#@� @�E'0eJG�{ Je�nYciYfe"[n־zYBV Zmu׍Ǚg{WtqAnז@:th꫱{?[&M� @� @� @�@#@� @� @� @� @� @� @�u@ {zm{Oe6j @� @`4 +_/_B]:4s4)]5\S V׮.;ަMD F^T9~{ 0 E5 [n%6`8蠃⮻~Fi3 @� @� @� @. ԪK @� @� @� @� @� @� @�J>8WUܼq^K @� @ Cė_b`t]³&O.ըQ2˔;wu]*[,Oyմi1bDl1jԨ۷O9&P#f?̣G-2s_/1n$@� @� @� @�,.ZKs @� @� @� @� @� @� @@5oΪ| اODfQC� @�*0iRi V ?~y. Y϶$u6m"^4C]KRpV+>.D>j[oGyd 0 z/|MXݻwK.$ݺu~  @� @� @� @�U@Vud� @� @� @� @� @� @�,FVXgs6-_9)%@� @@u93b@ J BxV*Kk- /Ti0V J{ ZwYY}Žԍ/8{8蠃zՍ%!_"~8_vJ� @� @� @�=jgi& @� @� @� @� @� @� @G 1d/O.D;L� @� Uq/dW3fD ZrYX)*:*KX±U\YfqM7Ŧn)\뤓NlA%  @� @� @� Pj/ @� @� @� @� @� @� @�@߾'Xul0"ե� @�>=bĈp*;R۩SgB[)*wڥaX:u *)?%U+yvZlvyHP>Aoj@-[nݻ??gqF훤 @� @� @� @�P@iN� @� @� @� @� @� @�j@z}O?1cƬYkg @�niJ X)<]W`'Zl䒳yvkUbpV;iu+9֏ /͚5nC4N ]|1xr- Ҁ @� @� @� @�Q@b( @� @� @� @� @� @� P:4PxmFlEqs @�̙|3+:/g5o^Vu¯ ׭ZEԯ?^zu]뮻ns1q5ԖE*~^}ׯ_+:F� @� @� @�o @� @� @� @� @� @� @`N{1` #RVIɬ2g @�,i"&M*SU:/>B B}vƌ {K]p¾22++@±<a#07_>իWlFh9#F:5jT0} @� @� @� @. kju7w @� @� @� @� @� @� PA`"v!#O:5b*4rI� @@9{B܎±U8N\۲t° !Xc+4{yآEYwN,R]w5><xpԳgE< K/t\{;Fׯ_m9 @� @� @� @�X@� @� @� @� @� @� @�n9v{fG� PwRU X畅eUU^D˖aX@1^p>cӦu32)_2^xkGtСfNĨ ,F>G}tlѱct"@� @� @� @�TZs0  @� @� @� @� @� @� Pmzh(bʔͰ � @@̜7X)vU8x]*./.>}Ψ)*ŁXzegTvl<dPJ6 d_뮻.u{G;67n\lnD׿u<q!#<?DV' @� @� @� @@Uc>*%@� @� @� @� @� @� @�U#0cƌ,xꫯbĉ1y:uj}֋'\> x$hذa(KX"K hժU7iҤj @�Z)`U **`R֜BV *`W\|Y *nS|S_6~@;M6$<9r@3?O馛ưabu`֦H� @� @� @�% Pk3 @� @� @� @� @� @� Pzx㣏>m?~|´fVBP&[vvfuve%4n8Zr%�e}+r,QRRRY7  @�iW0t,>OaW&sV^DV1n~8Bt,as!XsdVH'Xmov-VXa8s~x8 ''tRѩS0lc$@� @� @� @�T@*a  @� @� @� @� @� @�X|q3pvڕ[:ѦMH孲tž5k 6,G4QLSۧL&M'] &'|y=O?Mjڴi`UW]5XcXoK.YA  @�S8|5c!P7￯o�BV¬ X±~5+j@ >|xva:=3H3Έ;3yG/"g @� @� @� @�O@VL� @� @� @� @� @� @� |g׿5<D+iu!V_}Xs5cvCVYeܹs^UBrHя 9sf[o_>]vY|%60Z+_|ѣG~_Bm @�%(6"ZU<B B}pSysZ~+B洧U+7q* 0WC=4_s1Ѷms=^%.ǯ֭[1"8∺Nb @� @� @� @@UG>h$@� @� @� @� @� @� @�!?cǎ̓x())) :餓bS B5۵koyN6-^z饲; &d-"k{b޽{U @�*~{^«)j^m."jU5iR>*[5o^ZBN */*{R6T'SO=5>8M6[V j'Ʊ'|r+[nj7F"@� @� @� @�T@ @� @� @� @� @� @�X�3f3<sOƍFm}={fmK.Z36h ti%M->|x~2Kab]w]v%ڶm[3&i @@ L>+*Zk/[`)KeS}M *^YfV}ЫvBYsZK/4>ݻw&mT.pgǭ [nj @� @� @� @�D@V- M� @� @� @� @� @� @�jiGQF]w_~et9 c뭷&MԜ UHKJJbu:*ފ/qƑG?Cl&>/_# P?+jY)u!ܪpW}{n[ÆVt,>OW+QX_ܶyzs{:@?_}C=lnSO 4k, ;s?:a @� @� @� @@U'>f$@� @� @� @� @� @� @� +F7pC|ѵk8餓W^kT!V1*1p|6KxGbqg 'lM|^{ jTk9^ BYX*nS(Kmf̘6- 2"BUضmDźX)PF�WqqwG޽#j=WX`v}GZ4M @� @� @� @�j@Z @� @� @� @� @� @�Tӧǘ1c+cFN?Zk14YbF K,㮻n)=4hP~L/^ijЬ �?W AVǹ.wʲNʂ VV"ڷM!ܪvNש^svE�uKI&zO><ݺu[fK`~ꫯ^xauY p @� @� @� @�% Pf}^FK� @� @� @� @� @� @�5D`ʔ)?1.7n\;AxzQxIII Ef,o߾駟W_W]uU :4{8Scu֩ޓ0:Q3gF|Bh Vt^J,s[)Z5mܦBU:V,x5׏@%T@,;+vaGUг.>vg~z?l}4# @� @� @� @@@- @� @� @� @� @� @� Pӳt_|~x{ѹs*|* ,yI'G /0vkwyꪫV5"AW}W>jA+ Jgmk+BUeǥX~Y*Z[U<OY� FmO1f̘HA6f4hP\s51x;go� @� @� @� P jՂ @� @� @� @� @� @� @z<1pGydr)rUՑQ4RLo۷ou]_2tsL}Ѳe:"aSFB܎u~`X?z"6b*^6mʷIe 7lX=썂�<?ǡK ><9䐚2|$e]=C @� @� @� @�S@, @� @� @� @� @� @�_}UuG>} Ν;ʹ֔ID޽cvk&N=Æ j<�B`ʔY!W!V鼰O<+Ъ}jS|]|^y B, *j|VKDR9pU>qyE  @HAAiMݱc<XCx*+vqK/Rj� @� @� @� PjբT @� @� @� @� @� @� @` <q{c]vYJҋ?s=#lW^,.hҤI @￟hUJe~;bU/WY̙]!*Z aUc[fB܎եg @�I΋VZ):7n\1"Rؖ�Y]tQyx3 @� @� @� @6 ŵ4 @� @� @� @� @� @�XCO<1k>|xjj>_u|p<ѲeXb%q<KI_Nm۶mڵW\1_~h e$PMlU8j^s_VpUq0U:/۴)]Y␬Syl @�B 5{~a=:_cLQ`W#<2N?۷ohѢ:Ә @� @� @� @� % PkD� @� @� @� @� @� @�uY`̙1hР_|q <.sԨn/vmov+ob„ 1nܸ/>ˏ3rS?KYab5]FmkFԫWF,$­R0)bHUU^@ٲ,hҤ4*P΋éyW.𪸾{ۤF3*m @�C`vpnavm׎ə*83믏K.$ҹ� @� @� @� P[jՖO< @� @� @� @� @� @� @` 0 Fcƌۃ=JV\qxbwz(ҥl}0?8|77ވG}4.:ujDl6/z_eUfG PlC aVLy`Ts^fYVs/X_N<?  @�?J`n}=zİaQ}@mhӦMp qE1K/tmy @� @� @� @�u\@V> @� @� @� @� @� @�,~wyg. vFEq=;>l,rW/KСCw޽\Y+O>dDyqq:tP?I=y;vl_:j1?̙SDЪ^*\s*&=bt??[FU0ʎ-[Fm;+v+ZԦd~F  @@MH|0N;8C駟.,7n\Ӧb\`y<XC @� @� @� @O P'xG @� @� @� @� @� @� @�)c駟W\qE o믏}7Zn]#]A7Rxnh֬YpY`|&enիQ?Đ!#<niwy +Ā?mz_~yxe|p\pee&L={SO=1hРb]b/8|:thk,Ie}UygM*믿#G~rHvm|+WxNbubcXWʮ+W6=G|QoG`DqOF~ĭFdDg/"\"=7е Y@[c"?{6)m.VN"ڵhh`P}M~o'd=c 6Y?xgY۱ au <?/&dݞ1}Sʑ}_B^{E6 Y@A,#n9;"?'"#xȾ_~xyst`WskPzd? {2#"nF6sΉ8唈c:E[lkRb}zƿTf20ߥ⟧u}7+~O @�T@#3&F{ェ 0~ꩧƕW^QE� @� @� @� P Ԃ9 @� @� @� @� @� @�X}.shYP&Ml})ȶ`Z[n% 8>6xcUWE԰adD)�ahMwä.,,(,$,$3<cǎ-Y*ӟH_Dl/'g%.&O<ǺKƆnWy_]vYqQyGET|^Q9mڴ|<SNOu}p5ħ~tP˹Ea^KmL),1Kx,GjgjL41{{/\ُQE“YPS,8Nfϝ}Oƶf Q# iЬ;20 ][2L#|JǴ|,,G^ʳaYx&8{x,8ٳ-d< z2>#kZxͩѹsdmKc|1nx {Y2YjOfZg^=b'!\s5x=l sΖs})bcXW|_e QN� `{c=]!B[N&P<ȸKkL� @� @� @�n @� @� @� @� @� @� W^ye|)]z ~"}qaP="|R:= qySӦMM6f=`YpQiS*K[ʓjԨ4䩴$YfqGg!Eo~8ktMYhRСCmn[j9X¹^xᅸ ao*}j> Ȋg"߈3:D#xG2⩧6CY8ܳ_,ӎ7>cAW|! kMЫ~(P~Z9ŸfeYpUi. jܸXJBY˖uw"ܲ}N+D#ZEb>z?n,DžN:q֠w6yrr:}lyI'u'h_ZeeZ]],N}m*D,T~}"׏r߱;敛oyUڲM:Xឹbs+c[ϩe @� 'ꪫƳ>C osOx|U, סp6s SO=uk>E'@� @� @� @�ꘀ@:. @� @� @� @� @� @�,̙3 #8"[4f{Yw4h zBn,4)KMʶފ92bĈ?HӦ)S^$KlJ!]nmѷo,<ԩS;e7 Y�TIcaK\m?{&55`{E@PRWQOEA@lbWDD@Qpԋ"((JNfv�$Lٙ%5TARٻWd*wՀRIٱ|hLG3FX?gȃsٺuX3{!_𠖚\qEX۷wG\EgEYiLvg PUO]|Kr$w"+q  Sռy-P+tPRzSOEn]B9T+J԰WWO:C^䓒zr~o"Ny%ˢsܸVki 8@VZ y >ׁl#rNj?'{_bJG_bKl]~=w? � �)#`ߵF!:u믿^!o6mڤҙGgyFϥp@�@�@�@�@�@�@�@�puL@�@�@�@�@�@�@�@�@�@�@�@�@�'0w\Yf#޺X0p@YvU!C#GHeԨQìҚ[o1";vԈVNp7n|?~T 6,nokI矗 H뮓 .[XR_|_x_36*X}?*TȻعOlqц%JHΝ55AfAƎ3G$GC{$ޚ['Kr|sirLJ7*~}yimKKe5VQʗϞ*R.gx=t5ESO \ȏ?UZ_+W/T={k`˖AiQng!**/x]Mﻯ<dy u|#|kFd֬*5fi׮LNK…45Y#W sNC[ov7kz%_|QErz{mϊm׮5H> 9sS %7_Bo?GӦMݻo&Ǐ]{}<:vςĶKl]pmغ>|Ro۶M>c}|?I&}{۳f0܃HVlQ6|/oE nغv'zp@�@kw…bkҳgO/(d9LA{F t3 � � � � � � � �UVz}8n@�@�@�@�@�@�@�@�@�@�@�@�@�49s*UJ֭*i!ҥK˖-[4ԪUˋXܪ\r^P믿믿 {ծ] X kÆ 'Ժꫥm۶˔)S4-.b 9宻N:},u 7xq)<^;~`Ey_=.s-h̛7sLl+WNM ܱ^ir۹mz"r~lo&+Ԉճz%ORN(\uk)Q\sM>'w@Ua/n y.ҿ.gz9F;hgwŊZ2{V=KgZ14?PTx=V]K˗+U}=ZK۪ފ2e,Y1RBҥƴ޽[^yQy駥hѢ֭[3yd:u˗O.j?3nŪF:m Em ZgA5kj�G5Gr;qز~"]zw;}$?8M1"Zhhڴڵ >#5a{vAO!bgx='X(q ?y@�@�{裏[oI&ɘ1c3h: w!۔@�@�@�@�@�@�@�H3q#� � � � � � � � � � � � �,ȒZC٥F^=FxiƋ͜wysNYll޼9nXjƌҡC6m֬Yܮ([޽{{_Qzweڵ7xq- fY,aÆ^ e˖E-fE,pc"uR|M?pL=&^LKɑC$ֱc"U|];g_wxXy<OuUEQQ#=ϐ'}-z:2qg^hիWYdž*UxwC3h m\ʖؐzQFyc1e6mZϟ;Ç{1-ۧۍ]<wҹsg(cv?pS3v} jE,u/ 0˵^+{f{Q&VB }$w 'lވ\n'ֹI=߾}X-ZП JjA{… Beܸq.#ǦY-}߂oBw>}1� � pv}߿\r%^"b(ydROsg}V}?JGc � � � � � � � @ J=[� � � � � � � � � � � � � A,�7oS~6e˖W +Vb2Yf :T}ovO?ԋ,X[vVd͚UcScpd,gurׯ/SL wY6}IݾS|N?ŋҵȘ1H5%E#f ǵŷٵ*gΜt^p,=|-[6}x^l.wyGwwc-ZTzy YL E*\rJlmݖ&QYdi޽Q',9^ꝷW\s5:#=\TBJ_z]ny_h˗ϋ۲d=%sJj3=bZ3 *$˨urʏ?譯]7Ϩ]z_"� �zoz߁g͚5eȐ!.Ë#H]{?c+ES; � � � � � � � Rޔ="� � � � � � � � � � � � �d0 ,\𔟕lxRJ Yd^{Mu&cǎ?Gb@<@aN'7tw!o��@�IDATY~gҥ?}Gc˖-qXricKb^0kјhGDر^{n~t:uYJj)[c,K}CŊnv/$d/bԠV{9. {x;H["Em %QFv+.'3<sg%KC=$_} WpɜaüEN$z7or}E/.۷o!r_@�@�4σ<SzF)۷OG!8uŢ#FٳsySl � � � � � � � p?NT!� � � � � � � � � � � � �duK/!C#G sGs9 ]Yޓ뮻Nʖ-+eʔ~w{eqRJ[\pWˠAh].7o$WZ[Чd2xpV9p@nt:+DV/ef-jݭu5У5xCxK,_?,g }Y˂[{lHUodR~m)T|&~~IM]lw>} 5k -_<l5ƍ-OqI=VǎwIm~[_ Ypl͝;W,OWey{ڵ^Zf̘!E'x zĉe1Yl{џl}@�@�b_ V-eC  ٺ袋Ȗ]Ȩwq7NƏ/W^yeF=M @�@�@�@�@�@�@�2�A rj � � � � � � � � � � � � �/s֭k@Yꫯ .8&.4S0ǎX9zh2}b*s='Gw}Wڶm+7x|g2l0ɟ?|^Aރ\{rw'Բh_/#FCʕ+ZjIH"qۧ̄ Kzrm~ *l$2rd{'4unpL~avڙQ].ea}ԩ@xѮ_.|ʟkǫo sʚ5c_ÇC0{Ç>5fwTI$[6?hk]C/u~=54żٳ1ɛ7wӑ#{H۶w[+_W,Yd~᷶q/wybZdQ_~Y G">N"  /oUv{ ;}m{_Cc *x}M٥KhwO?׳C-F@�@�)Pre/;uT;^zr 7?NgQ#]N:^@nVt#"� � � � � � � @l Ԋ燣C�@�@�@�@�@�@�@�@�@�@�@�@�8kP!e?FmYv;2(5HŤVTjڷo/}S:yevS=˗S` M%Oh~(<.]Z:wmּys @?{2`�/5~xi֬4n6xLʕ0}^:v(+V[Ϟ=>(f~GSO=ui9`sTZ5nNƬnƛ(/O>z4٧|hwʖ-+ӧO[0`DYsuC'ŋz3g̝;Wo5QyQox;vs裏-.}x C!/nYk„)]{AcQoj4ٸlYyG j޲IqF9tHun{zL.\zQʺMxKGȗZˏrQ#\h"7o]qi@ߟמ{kg]/}[r'7=5k}%KYuuƂ6|ҦM3g̛7[fAի駟vI[Dk̙E-ewZx. rg� � ; [T^@}FMg kCw ‚� � � � � � � �+Z`@�@�@�@�@�@�@�@�@�@�@�@�@�'kW( dټS7oa,j9D)Z44+&RFvpE{\{X1cl2ѣ|h\ZJͫe^T{o+Bƌ!^ɶ/ÇKFIǂOȲҥK wջC=$7n^?dɒENdС{T#KW?o[}b6q-tkt[7Ml'N.lnxbaq;%&Jn|ySUeѢ)䪫 j%k ~믿jijJ,9XPkղ{n SXW^{NZh!CsUNńn!~^7탃>^ʢPY.N n%r&]0I:u/;juN5=eJ~ QcuS>@CRRk}Za[YPk7_<4T7,e˞zj[^+<ta nmd>؞75Pzo ;`">k O߃xa/ʑ#[>W;ؗm7o^+yjzmxq9ݦs xXh_%6$K~ Kh~`7|{vw{O`ն׻Z&M֯_!c܎ � �K w-`mU>YE/~{뭷j8W˹ d� խ[{[@�@�@�@�@�@�@�HOY;$OOñ"� � � � � � � � vQO>Ļpl>r?Z֭^z2jԨ9{D�@�@�@�@@,X.e͛(Vp[nG~$[P˂X6Z*PMABT_ 6_4 \"?/F{Xfa *x{zAqmjQ, 8Y|fڵ^(.09Xb[ժU DNoĥ\ц}ϲc_ְϭz!o_E3Wii3nuQ0eye>W_y'G id3ό۟l9sJÖ>L`s 'u_{v2 yOKުue}<yTnE蛃ZD^ x[Pk\`+Z{! yeџ޶dvU6jj˪i+gl:?:f^.mm ip{lypt\/nΝaۑgk}� � @b۴Fȑ#sln;kj}OXX@J X GS9+fdM,\ΐ8� � � � � ]<7_H O�,)2}ȹ#e}gx!� � � � � � � � � � � � �E\\ʂX.`$kvL燰,xe]~zhvf*$f OB\,KEf̲]^ʔ Œ5 [4@Үvѣ|G :,Xbf62cرc5bݺuV^=|e]L<2�XlQ{Nv:U5OydͺBE4TT۸RCԩ>.xԩGecz+jl` 믋Ӛ#ॾiۅI·NVժU5? k󘉽.JplY%oH~LPx 袋Nr'З#ʲТzCy:M</T[oߓdР}J~n6Wyȥ#0ͩsm ;DnXjs^V-rOb}({Z^"@�@�2}Q;dذay駥ү_?)\p&43@eH^2)rN � � � � � � � A_e0 � � � � � � � � � � � � �db#GDnX bE[fq`+ ]Y˅lZV cmcYΏc@VtP,+6kca Dڴ eҥEIQIOmk=:UZAr'<I guVRd ..]Yg9soe U֩TQ>pXA/ƍ;${5{ƵИJ[h]p5VTJV m|?ݼR sE*CT,RJhI4ȼ#38Cl̈:?ö9"T+FI֭ Q6&4\s5q۩ҵ}RvCgme˖%{oyym.^]Jh<lheKB!Pl+2e$wYm}mj#1<Cl� �ņ|I{Ny/շo_/UX@: ܥ^*Atq � � � � � � �dvZ#� � � � � � � � � � � � @سGC,79P-XIdD-qq,_Xfe.e ;&-#D (6;˲`E\<KJ*Bfdre>˒j]14RW\CG{bq;Jl444IéJ[ؐEoم+{cleU4/U:/319x0XG,մH~0^T׿P(vUE*y i!vugin]9={f(ڵke„ 2`6(YriY�F+y7բ.;z4_}r}g}'=M\+r1h˒.mRsg � @(eGyD.3f1Z8pFõ΀@: uv~:uꤣ#P@�@�@�@�@�@�@�@ 3 >� � � � � � � � � � � � �1/`aůMpV0ii[).U?ߠAenűRcrq,yei3FDydѦň*V#Y)՟e*S&ebYr ܹL<ًjЂ҇~Ǩ{8קOywŽСȘ@Y8[YYUNꅨJ9d:M^Պ,LE,:U䯿DֻW>+V %č%JfɟnUO6mrco޹=P)]zvtOܼ.\ی)gLx']hժ^7jk1lNlb?[v/ ƂZd.7#\nYpz2Y]0c= � 2~=w!o<2n8 Vf@ iF*W, 6,1� � � � � � � �U� � � � � � � � � � � � �ѣ"[!, F"7oya*$b+7V o/ZgLKd!`$ͻ]c)R$˪[WcG?eecr"9smٳ֙g]<C В[~wߕ;OVЦ9EvU8l᭳:+n آEܢ#GD,,U2/e<Zq-Uczy[/޽}-_K-%K_8Q?EUgЍ3 L߷J*\-NIv?j{0 |d+%n[  � @J {^z/պukiذۺ+)Ȣz3f<þ0 � � � � � � � �1.@P+Ɵ @�@�@�@�@�@�@�@�@�@�@�@�b_`P ElmYq ,(X6�NӦ"%K/u:qmX֪Uh ".+Xяc5jdzmZ'uԑI&IϞ=SNru3<ϧ>Y 1%駟ʭުc2ei߾w|3sL/? zE-9lx2lHV"zx,2b?d/)rΝes]Ũ-ǥKi"/$s'V"5kO˖u҃д=ja"C[vR.M-eS q](0âZJn˶sFλD[ow%l@�'Uė^z72|p䮻}J>}TR9 !УG:tK.$C'� � � � � � � �[@o  � � � � � � � � � � � � �A B M7n 9x0xo…l@Vfd,+2֮q,D:Z;JHgt̲IgjEo?ClҸqc'jՒx@!,N/]|<+b<ZGi׮7>䓲Mq<~W2ydY+xVKV1ڰgO(e-r,=4)W.<7q- emSdԆ.PlKX_ǡ[a@�3KZFe.:ۻvl_nyۗ=^RŻ"#\VbAvnb`nMcaR&G�@ 3 w_ &cƌQF?._~r-HB:1$PQ+ܭ{ Azb8@�@�@�@�@�@�@�HPV4@�@�@�@�@�@�@�@�@�@�@�@�@�"ph$Ǐ(DƱݼԸ󷨁,eE6KeXn(Y,b?ebZ ;;W7uVhE,ч?@ hR4 eE/2iժ4o\ hh,t}ȑ#erK92:S̝.>|swiNvI ۲F/RS2el߾==jԫukxpˢ[6ΙǷe.R%4޽U mi.n|E,gQ<"ڼE@�`Lck.-вh-m{>v}steS,x;z1 � Ӫc={ /}l0曥[n2r+;Ϩ  � � � � � � � @, d9C, dž� � � � � � � � @, tU>9zh,fuzaz2jԨdmF � � � ?l,bF::b3- dcY-@^\釲4ڴ)t&BYʉ6.-bVirp°F}E6mų,u9HD*kL˸q4VJn6ի*T(3qsp?ƟNzHiJP)0oRNS~˅S߶cŶ,nUocaŋEQMm~.4 [@ FvJۏE\, [$x;ڼ[4{Ďu �d,ٳgѣ/E,ݧOUV:Q& ߶ʖ-+q\@<ݝD=`{xeS\cgcB�@�@�@�@�HJkW$覤6e= )dFits=i:{8\@�@�@�@�@�@�@�@�@�@�@�@�2"6lH8emb0f3\bP, 6-^\$[)uk` gtyYƅZXh9wX_t͋ hYi۶m^E2`�/ըQ#ɑ#Gʕ+]D{#FСCSn䦛nƍ'{_l;>^zI,X>5 U21鵲Q_ ZlbY.e|#"[w)mu$ү|GPHz…)~LMCq- lY6.8o&b[e6FJm6~O}#�: qsɫ*cǎ&ЦM/u%NݙMb-.,� � � � � � � �LV{B9@�@�@�@�@�@�@�@�@�@�@�@�bMWfH e%4Hֱc3ȝ;IJ(V"g̖XH~y΢Ɗ-|cv"7 `tOmZd!\`֬Y4Gk% ?C^@3HSeذa2dy뭷_qI͚5{b-g8~{.'M$7͢?]v.XޤIa&Whsgxh˅~/ rCU\uҲW,:ym۟ #!6֪%_@ ,fecj G.yw;`}_pZ,x_wXW  Jh{A_|-*doFի-r&StO_..}g@�@�@�@�@�@�@�@�bT^O � � � � � � � � � � � � @ ld_/qc趛U· BYmM|pgq+]0+kVeH]c3ÃY+!?u jѬo-eP>|7]v-sΕ7xC^xWF/N:IÆ P m&SLZ'NHNiڴ<sJ *,=n{_#lC{w-7]_n](X=OEcs"uDz:S3�yNF�81k1X?{` lV}~޻ۼ}\n۾,[.[E@�2@V}׷q^`W_'|RwҥKF1s NY^vermԩS /<G#� � � � � � � � J؆5 � � � � � � � � � � � �d:Ca,l#oɮRd Q\+8-R$t8}/b+WS7kL $βJغu|wqkԨQ gӛV6S4}bM&};V ?3cǎrH˖-L2(ca:$͓Z&O,gc-Z.rhu94p_OE%B[6?}Ю_β"NjcjK37fx,@�2ElL`qq-ZGs‘ϑ ƹ, qE^n]im@�XCZ ^K/T[6π@j /%Oj2E�@�@�@�@�@�@�@� "@�@�@�@�@�@�@�@�@�@�@�@�رC.9FE6*G,es mm,QB4rv {c>?re(bY6 a,um 93,S}q㯿=vzp֝waZx6XL4Iz-9%Uzoqf͚I͚5%U2m6(̙#TRҾ}{[CRޜbV'kcܼlYdkٲ~~GM. -(c"͛D70E�@ `AL}%]+ Mߍ,ڥ jE ,Mp}y$ @oҲq~)ѣG"G}vy1~@&Ȁ� � � � � � � �Ģ�X|V8&@�@�@�@�@�@�@�@�@�@�@�@�!pG,>Ͳr]h]4^ ˂OPO趋dY@+wnw3Ն˲؋Eltf솢EXE;OBmY<nK)%RKf֒%KTÆ ]ERԞt64h@l|xtIri?k*~rgƍjJwkn^?X@[`AܸzjY?@9r7sd8ŋؤIs:xPdժPd{m5/e-7 8C"#R[@�Џp9NX}l8/[ Mwq?_ 1Zh-6 .y3O9!S#�Ah?S#套^QF ӧCXUܹ 0@Νj-U3 � � � � � � � �1(@P+ @�@�@�@�@�@�@�@�@�@�@�@ s Xi&u8M|0eD&M`'ҾPmܦ1ɒ%nrBd,Ͳs5*UDv ޏ,)/^Zfj%jJp$iz\`.pAm:!O͟?ߋOӠnP, Vzun۴p˖-7#Rt:}8=oK. "aʢoFvq tM؛CșSu�[˖,Z$Oؖ~}^ٲ^xmiN6Y1f2@�్.CЖ o˄:[c"v˂ӣG]֬1Ȗm}JjYpg�ttY"@zȩ_u捋͘1c䡇[֯_?;Y+ԩS j%wG�@�@�@�@�@�@�@� z@�@�@�@�@�@�@�@�@�@�@�@�0h, dY6o1- FqBqZBPq''&-YʏXxW.nW*T ֭C*UیQ/К1c<lNMӫW//ug$ N]p&fXvvqmxvǎTvhZ;p@yYDRHT .MmFgȑ#n|w<ٳ!,D;w5#nܶmڲe`ѬZ}p카 Hu,o{Ew�lܸ(>Vp嶞@�"(Sjػ׏rYxˍ.m[n߇z72ٱGFa.7i<v@ԭ[WF-O=k}[+𾻟A3@?!·@�@�@�@�@�@�@�@�'@P+= � � � � � � � � � � � @ Ž7oY6r`VP,eir͛'NN{=^(+2e׬67؅-ecǎ~8bYvbZ b8Ei駟Z3gMEIk޼y^@QF<e'jѢEҶm[TL4ɋP%Xm!G[n(q!YEViu۷ϋfŲ=/ ܼ j,UbE/UJKteM͍Hm\D;=.XXdl ՉDS4/ח{dnFWE9Y �$,`amL@}߶.eSݎ\f-e">F0en M}`@�NV ҷo_o>}5J:o%}K,y3 "m7!{ � � � � � � � k_Ś8ǃ� � � � � � � � � � � � B.e1x-ȡ].]Dz Vڡy"Ǖ]\{?qѬe.|na, dը!ҡC(eA ;/s̉ h޽{Be˖2tP/uE3U/UN/e>١hѢbczkW gyF}Q{l@ [Xy7G Z_nZDJ ɉ,Y"2e_"vz lǀ� �)+ Y6,\'t{JƦW`Ǜ/hxrYx+8n>D@  nZl\1cȑ#J/Ogǡmꫯ_WZ?<� � � � � � � �$)@P+I"6@�@�@�@�@�@�@�@�@�@�@�@�Ȉhh]$ rv&MB, e\ډ%=ݶ-<|y"G[0"&/һwvŊ~T+GcصkFkf7|E~9xT'UV2boZ 6x7oϗ3<S&N(y=e8{ǟ4iASL)`N>菡O_;Dvl̖MKYB}?Z jZX˅  � pjQ'5=*_wW0e9- m~a;쳅}vqѦ9Ƕݟ}Y@zE'xB "w[B6mdұcGGz}~긋hMq2uTZi � � � � � � � q :..6F�@�@�@�@�@�@�@�@�@�@�@�H۷8eEN7m9v?YEJX][m[dі[X,\#se],|y?e,w--oc[`˖-wyoL3|5kzZBVJbD,XD }}^_ wyG,eܹseVw F r9l. d菦ײcX�zzw^^m׬ ɓe.i?ES Cg@�H?N-"ma. N#.\bccrYhˎ;s@ o={F" >\:w,u֕;Sw.9s挽bF}[op  � � � � � � � @PVPy@�@�@�@�@�@�@�@�@�@�@�@� Do bq,,O ;X˂X6vZh-+SF$;感{{^,&""S|c"Tn,JbA%^kirE8ӽp֠Ai)0XdtA5j$&L\1paÆilЯ >|XO];� ,` ?5oW_|ȭ;ϏmEeP׫v*UǶj]|FT6 �G.^u2geO V薛yZnþKlZHl=&l\pwnI~`':}ڵCʊ+~!e@�@�@�@�@�@�@�@�bHCO� � � � � � � � � � � �dfBq`,+8x Y,cծ-Ҷm趋eN^A FfC(TT.ҥV͟Z̞7+`u,.BLv-4ZyǥERĮΐ_f/g1"_nȡSr L3:[>̚%2m_G![t$RUoؼ9r9sDyGdsMV~uS[Nl++ @�Ȕr"ѣ";w- l\n>8m {x kV-8,]qo)= >\xo;(Rhǀ?7ٳ j@�@�@�@�@�@�@�@� sO � � � � � � � � � � � �d<={D,f?]֟27ߡ8D2"cӦy8-E&RNeˢG칳 l`!3j$<U {X@"Ps&_uUҪU+i֬^]ΐl-Z9`2ydP|l\).mÇ{rHKy'N>Ɔd\D;#(7LO?-2hE.=7gi9W`,/{">/X`+rXQ$[6;� �$%`Q Yh<2e-<mj˖/_#Dƶ _fݲ}^c@ ?>?l0ygZ6ʬ5h@cѳ{+�|��@�IDAT � � � � � � �b3 � � � � � � � � � � � � p{X.ڼ], y1,˪[7~,T)3C O?a! ˒N\4];?U*P 友=zz9.5c [Kw{hV>}Ŵrqu~<(]v۷OfϞ+b /uرWVa@�kbsqHxH?";$,78 mYl9sD~[dV9EV j g0]π� �,e;Jh8nʕgwg7o(U?[Sަ7+2@1}Q:T(#FF fu]rmG(OIGӦMǀ� � � � � � � �Ě�AX{F8@�@�@�@�@�@�@�@�@�@�@�@ "H-6pvܡ8V "m cvL )X̅67֯/[6{^,q"W(U\X8tq3gʎ;S-Z 4h)YlbeʔIݞ~F=YӦMo1yH@bzMro|q >X\k?۾{DI`G,Ygcf,™~+ꫢHf�7%KF � @ ߓщ|Eg  Nrj+X~n Gv F턦w.܎%B Ƀ>(wq<~Q֐!C䦛no>d4kLF-{4@�@�@�@�@�@�@�@�_1a � � � � � � � � � � � �i-p@(-eѬ͛CG+Wx,cYg*^<=s+Ȳe".['rAg Y(N/vժ"9s1ا9sl.[ti/cyzI,Yb3<[oiXgno12ٳGƎ+1-;<{-|b0ҟ@"rDƏpH^"ډt.r%"YСIۦMl '. Qؠb׊SG � @ XF gJhj쳓[o1>[$&[nަF"\AAJZCnMo@Z폆 N֠>,?{9a@�@�@�@�@�@�@�]Zpd � � � � � � � � � � � XLiFիE,e- *W.AY6mZ-M;-_^M-xfϟ]ٞ;dYsP4Z5M#bI`Ν2s̸֏?(Zwiժ9қְC L:U^>|t)x"_\69rDL"GYFۄe L '-' 7-r~\cG9جdI7}X֏EX0#b˖?kԪ>RE$;b9[ � yT)<l}" mm "\6 nEڲ;w. s=煵qK}^\v'_*g͚EP+=}1 � � � � � � �Z{z~z99@�@�@�@�@�@�@�@�@�@�@�Ȩap,7 F,o+Vǖ-E*U Ų,Đ WY6oϭ6l"=тg6^IcO`^{ƌqY,dC7Mb i+n:k+o=m<z6ݵkOҸq6a9@"W_aUз /Uq6πPM?ZXd E`1 xZh+r@ � xZktR9sDm5uv[.jh,5Xf *Z}_ [oU8 oC  d,hڴ̞=;�@�@�@�@�@�@�@�HKZic!� � � � � � � � � � � �pڵ"@V*_ׂY&Ҿ}(e,EtC^b1E\m\B]$tP4m[?Y#1cY`Q|q.Yb@JڕNEͮ*)Z˧8ziӦɲeZ-ϡDNJP+Q%V"pŊ7E^]DDnoYD! Y?vڋlcolԷ 5Jd^[}ӰڲVοr �dXܹC䜤iv?e-ٲMmk[gHPlT)ަF|#h;Vxyw矗+"ad3>e9e@�@�@�@�@�@�@�epl � � � � � � � � � � � !,>jUhpB "G3 HVx-TI@ ɔ.Oj6?,bY KX�"Yj\sM(Rax.Ӟfmѣ`@k!5.Z9y駥yRp4;&(izH~G;w?5$.mCv-d͚՛n8Wf4iw}nSH%5EOZ $r"7TSkEycltbyX[ojB- mY֦ < � -IJ,qܲVpȗ_G jYb[ͻL! d˖Mk,W^y}ҵkWdC83dyf)^x=ON @�@�@�@�@�@�@�җ�A|q � � � � � � � � � � �  Y,XOhXpݶ`].;,]G",zC\~$.zܾ-Yvqb8o&[X@kݺu;wn9ꫯs=W6m*yMjw?Ez'dȑr駟Ha(]wlݺuK*UdϞ=eoEd! PK};<1kȨQ"mڈ  ҩSl~Ncϲ6~8x- lhɓE3 ea- lG80 � �DpOj8plܰ!|_-[}.Khr6򧊤\_X17ntMz%u#4{ml0GuԲaVγ/  � � � � � � � @ Ԋ'C@�@�@�@�@�@�@�@�@�@�@�@�#p_%Z&ȚտlJ~PcG?n4sH׮#zK;zTĞ_ EX4aC E칵 $Wȑ#`֌3ŋ5kQ[e˖ҤIə3grwvPr{᳾}#I#/b~ߙ &-њ2E4'ҥHݺ"w)ҽ49~|M)8g+E~mT-F-- lkAM@�@�,_?&Ⱦ}~Xˢ[n\^č߲MDOqCBE]`˦ʅFmQ\&,fڶm,=z>H^{5)Yd,&ǒKŋJKv� � � E (IET aV0gŬ)zfϜzfE & * _ 0տ@�@�@�@�*Nӊ*Β@�@�@�@�@�@�@�@�@�@�@�@gIӦ:DɃ;u.'JOЯ_W4Hon ̙#}a,gNN!1rshU 8liرZf͚-ZhM6;,v*={Tzr}uh_1#FjȑGI/?\ >)J:&N.D:3SN>Xr8B>o n[t & rȖɓWd:tu![kۖӢ<B�@�]I]d(mn^P-yo}շf&P=8p+~| -'5 W^yvm7޽$|)(^[nZ'V@�@�@�@�@�@�@�[@~h= � � � � � � � � � � �,5mZ!} ;um,ߝ񯷞NE+%IC=|EzWٸs`gm4lXapV˖0Ν^{ @.-$SRWO }]|ź+BKib.u̙qN"֒S:<KOTH.p@ u1S-&I/ }y2RKI]$A[rȖR@�@�*VX+ [rݿ.ӓoS~KpsVօ>Vtx5nܸ{0 4H{.tְrHU.@-VIA�@�@�@�@�@�@�@�rE \GA�@�@�@�@�@�@�@�@�@�@�@�j@ȧ)50o ]00k]w-|嗯9.aMrl ~.dŲ AYСfOԆ;1f̘�7|S^ۅ~i;vU}!pqDžЖnŘZgbM6vp(+I'$tI%$a%?|>ɐgl9dkD`O2B6D  � @ 4hb9 `4cF-CyE<gRCFIS=w!dˁ_h֬m:#B z?R^{[5^͒/(+� � � � � � � @  P � � � � � � � � � � �I_O><L ~:0+--Wyj>vO?o-{$;ܭWOj^YrhQGI]$Y͛zz=ztAc']�#<2ޮJx'W/b^vB@,k6L\sMui.(|$a[=zu.ic4`k„$h롇OZe$d+%/U!d0#� �T@:R˖ɰz/aZ_~Ngɭ/$xuv oA hni}ݧ-ܲ|33U ̙3GSNUǎs4 @�@�@�@�@�@�@�j�ZfM@�@�@�@�@�@�@�@�@�@�@� wIXVyWC\_0 OimjD?ЁgOϜo<}_ըQ B[ݺu:38#l}+Z%3| >\6t%Z'PZY(&ࠀNE;Nr�1HRao +'Jロ >+]}oRI0kx2>3� �T@zRVPҿV6Ol" oR^~e|4h.Bp E'Q^ t-wj+Gc@�@�@�@�@�@�@�4n  � � � � � � � � � � � P43$+gIigXI={J;c.[fi//H!(xG'aYkUWP#% L2 <AZW ԫW/ <X^zi81dXm'%P+o_:@޽W^nUs{Gn (2*$wCi$o`-Gd,@�@�rAeK,ܚ?ǒ?Ӽ暅Cojpzk3M4 Awc:;[n@ӦMU{!( � � � � � � � @/M@�@�@�@�@�@�@�@�@�@�@�@ ̚Ur`óMָ~U o/RM3sRhM&-XL$u(u"crj;u^# l&M*UHpng/_uyi=PāZ/|޶#@QV:Hi-åONɣLO5-3c4nB`@2<@>k9C܌!ss@�@ WKQ۶6|V}uGɭV' ۚ7O3ǎMRݻkȐ!1hѐۺuAy&ڇ/ D�@�@�@�@�@�@�@Uk^jV@�@�@�@�@�@�@�@�@�@�@�p_|!M \'˪SGZy,%tp;/Ұ[wB+ݬ �-r?C0;ZGC5k;>cVѰah"zH|~<hmM߲e˒'` 䝀|PN#1ڴɻU4p`23G?^zdxIKpxV__`wt^n@�@�rSBzc<&@'O^xA:i,n])iau~ Uޖ[yM,رc;w8}cVM\ךNꍛ� � � � � � � ��Z9"@�@�@�@�@�@�@�@�@�@�@�rQ矋dYSO>?tұLM&Y(t㍥})|ܶԸq.mZ ?al:Lt"OI͛emԵt 7W%Y:"oQ+h!bWgyf Z'z\Կ%%5\Svygu9x̙yyx*Q`}:v- x92 yE֊}h!]s:9{FH:La G˦n"� �.X#gf'Jtǥ.~MZz丯gOiuK~/)?;3f~{_O>}dp?k9J� � � � � � � �E@J � � � � � � � � � � �d 8i$4 ó3f$3ԩ#,wJc4e~zC㬊yXcLfY\V^Y- cpHC.вe2>;!";iۺӧE̙W_} @_ׯ!m_ wzQ`1Rf͚j~(A!G2j~u%LӋ-RIذR8 '2 c�-߶i- � @j%yfҸqIo;91c@z|-,z) 2D #<-2_WֵCϴπnݺnYa@�@�@�@�@�@�@�-r5 � � � � � � � � � � �T@ȋQ5eJaho4ڵK܁СZ~qf~رv1{,\GfN&ON³ޓMV[M5 8/|o^}- Lz z-z0vǰ7p C'/2v u]qM7{͛7RcԨQ!dq Vˡr(^`饥'?\^ZÊg+N xp~l9dV8fIBkЧO2%;@�@ ꇞ}uK=,lMix_~I6D�\OqGƒ><0vu|ZZVv߃ nݺ: � � � � � � � us@�@�@�@�@�@�@�@�@�@�@�W`,w:.P: i͒7Z*s`⋓Z nI!pF$4)Zǥ+>Zn;K$Lг{k7/EF `G;Or'={JMJk![gH:lu*BG']~@7.9L+_7Yy~:uj[DD Kov^=zPv|O=]wݰ]_^!_n6իWO,|;Ӝ9sblY<,SѰcv2s̸{WJe]8@ĔC=T8a%T6e;|ez\pAACqLK/TrKL\W^f|mYdl96^~km矯O>$U:LPBӦu3FsNqU/nl{NsL̮u? u=3|0Jiud+eK8\캲-Iʳ>P7(k~U^zIÇWΝbq^q}AUw$or qw+싓ce_?vI8rUS{N+v^]e � "t%ђwVןJ瞛СKӧ/o!E;C 7\}aСCv( � � � � � �5VgN.\0ys<.hj۶mn%\BA�uk�� � � � � � � � � � � �wI&sO齳6Hj2\=hݥnH:W_sͤƏ~Y$@+쳥}IBVYl_|E͞=;tBZkbp˴i aAE%zIK/gtI&o$~pqBЋBЋԬ٢:6tS9cDHj.l:-[d}Y i;Cb J+;u0 ;?L8Q]w-z{E?10o߾1SHz'v>3x}_eVжO>YݻwWo^{m }vؙ!SY;d/xw b^Wq͝;7FT#<R+W]uU}1&|d֟ٞgէOᣏ> ɐ"J:'d./kT|]GYm*疴N9̮67Qz{{UWŎ N=~Xv{:#6z@W\;n/YOeו%oIڶ(s kiذާeZ8Hu~Rg'Lq89|N9/~*NCv$qC2lkT)=PF>Q  �hA~H~Yǟ7/ \]}upܚ+C[:tjv#� � � � � @H /kMkΥI8YpAo) �i( � � � � � � � � � � � Pc/)S!dV_jP!@QZ}�~I_eVF 6l"IyU"̏I!d''!jn;Z]k-L:([7kW1+ypaavb nݺ̅9!*?P/mvxN!IۚCp>|M _n ?|=1tkرb;jԨQ=OY̙3CHᆚzEhQ b^뮻_WUM"y?\udsGڣG[o~m]pjРAYϲ)m|港ZYgr)nr{x](dY4eQ]G}47|s =Y6{ڽ[4OKI~ui&NO?Oim)m\AYw25eeOǥՕmIqw]]yP~:HjX!d2eKvT 3<zŀUC\*nC֭\jyH_ҫ&eIa+완&;|Cy“si]3RvTngIyz� �@$\uHsϕ?=;A.Yg +8|g}r/&� � � � � � Ps{x# ;ߟs+x1hw,u'9x� PjU8)"� � � � � � � � � � � P@iN1ڷO: D:,>ޫkNSC#δZlY "OBBAZ?,f啓>}0h9<| m[veÞWO?]m]d>Μ x ,; &g97K-T #կ_xI&ojJ<H ?_c}+qєj?\LP-I@! ۲C\sh`kM6Q-8_>m4uPT6LԩGz%qI?#>w^f|2OYӔ6>s;pșP>izu;io3ǥy|Y{$u^q{t5㏏!G(~O[vUϒQV/mZ_iuyyYߢֵ8wsHcV7sSEN;-g=-ŲrbjFґ| .8+dӯk+ӹra,LE@�(|\!dS+| IwߝkmtQ WgUMugjܹ:]v٥rQ`߮( � � � � � �5G&: V*Ws[)  �A@-6@�@�@�@�@�@�@�@�@�@�@�*X૯eYqd:vXCaw > s80`WZwάz!0{䠬'3VX! Skó7_U,Co ,+tWu[n%vmR{=Z/r YveC'cZzR &.z|NqquCr!a*mYƍSvK>zaZrңF1Ha?dȐΟ]_|E:`_hUW]u Kk[渍BmݦÇk}-h!r]w3t:K~:H%{dƟg{ꩧ\k;]&tse(sV<~ޯ׼yggmdiɞ?s\iKq[l3<;G<yr&"](kOgד>ƕw֑W~xK/?l.HK/t.sZ?Qz}źҶd(#{ytQRYBx# *n?pJk!u=tTWxôlr;/>oV~@J+T0C z?$;z8[O޶]zO'tR|9=/c;9{}vaÛ8pm j+Wˣ>*߄[szY>mH Y;'[cH*͚(18\a&\B@�@�E:d:i睥N$rT.)`sB^ϥіW@�@�@�@�@�@ o|w߭_Z7lxs/5lذ":|~OEƗt\Iy%hSN9%;s]4is=7\;!k<b~y|C�?<F8oiFdǿJip� ٴ@�@�@�@�@�@�@�@�@�@�@�+ JoLI BҴiahvw~K0Jg};nB)@*  rx֧*tp_aX8̏-˿2s{ŕ뮻Bgŋ";6S;6-U+W5u/hE@?kWT߾}cxsd`*ۅ/uG~ߎ?^!p: $�:u-3dkȑv)N_x]x:cXC|1xÆ CfǸ_L+m2}Z2\3K4n3836觟~*<\>rjeO</m|8ds%s/aZ4ZuJ3mrHUW]10`@veO֙|G[wǙϥ%3ޖVGi3oZff}CԩSCp!_W2ϵ=Cád-T-ږ2ue+E0–߿v4+5yv 7sb=#Vz02z r;p'|OԠAtƭު8 kw<�-O〫/<v};yX56z 'Sw¾꫱S=i֕j9oދ{88wYh]B_bho8p̕l,V -cQ۰;xn~Q@�@�)mñyc<r-|CHqtvu|ql � � � � � �_c=6s: 2D>?O sv_}><))kwst}~3<e` Α;蠃&C><.ouUϞ=Os|U9D /s[OvZeg- @~ F�@�@�@�@�@�@�@�@�@�@�モBYi`B뱸Oy!dC0ArߏW] YEp;wtMZ{,,pi.+ }o[j@!p* ,gmвp}L=曱{${LKqz饗b‘G~[XAlK*bq Ea=z:(K.t1t'z!9bm-RÍ7/uK  8x}q*ooA:{O"t_j8P8snMBQUۤÁ7s-}vdjekffG=|v}<餓4Kq3dב1H~m>Ng!vô\w!qE3uę2;ǝU:U: 9wpꩧ;AH;?Hɬ<Η}YOtݳ~\ZˮǏZfZ/"o7 R Z׮]c@?Ғ]WqkZiӦ|0-w+5k<>>?Y2=D},tgʜ's;5dم3ЯE褢`i@7/qrHó<=CrM7i6Ϯ84<;p8@-wQC=x6T^ziܸq{eH{awyg}?~Մ}v�WF6CVZ@ч;ppTj|T_}%rзJؿ%Cp-߆Lp^=k ;+BlPYi5KE�@�GC$8:sXa/;diPR}l⭷:䎀  � � � � � @ k9{nE]^{M<|>~ݻuVùt.iVprؓO>ѣs|NiYȕv8묳4z<Cs_xx^;tk{_^ O?ulV9ߦ33@ omi8 � � � � � � � � � � � ʏY7J><̜, .wF?|XށYV[M hHT#wO)^یò<8exi$)\֒N:ΝPkg9kV7pC ZLPjFx92Zps ܪ.?p?2%\��@�IDAT{v(/u�F\np[~oCa9r>bgp?8Xǁ-Ta,V8PiӦ1Pe;/ )n|Yy:]H/>x!|r cex}Yz惼bʀy)[vP8: JÆ ˚r;܉u]/\{oOt5I YfG!U_-q^`BokwӢo'up{8=S3fX*6E:+쓒ЧF/wOpБl@-3:SZ؝c8I~?Su_ _\t<6?=G܁4'7{Fi?na<~ٳJo; q~m{*-s̉m駟ҧr6|udpCCCg*[!0I_^NfY5 2zR@�@�<pf/S۶+c1Jn$>vض`E+^A|MWL � � � � � �.`o\:-\dZ9P+-ŝ|N|<ȕt_f4tP|ͱ-v =_r%i~9+-D_spg?9Sp5,yi"��WxkF@�@�@�@�@�@�@�@�@�@�@�Q sf9<ˡY9 aGk)mB@rS'N0E\l܁Zt84Cыe,oK!/Dk-uS{~x)WCհa4eʔ^xpJ~ |=ztA!B6z_z[nTgE<n"xwV[aGNအ@ 5<i0ҿo{r/ 7|c.NshL-!T4$DSܱrfxN1)w}1 #8B_}Zl1'zL: '& ڵkTVf'\s{hѢ`}|0vN0&J@˖-ugǐ;.WNS-K/4agqܙ[oU~z0bVЏ?XYLå#!'o0*sx`޽ /\eja]r93qD|P̟'R6hР_+ׁ~K+ᄏ^|EwCwˤiYi˸-Hߣ]C=]u\8N{&H(*|zc[/ � �y. u߯'.%{|\O￿nKw}>h  � � � � � @. BIϣK[O e2?RsewMaχ9Ѿࢋ.R>}ꫯӥ6vm1�{コk^{_Yƕ @^ /F�@�@�@�@�@�@�@�@�@�@�(N .J|u̱͛ Ifu 5jT\<gJZV 0+ 'qj ٞw?\(/r5k{:uM7/uQMZOCBQ _l`H5 X97:]uؑ4y9>390 4"]t1h%.<1$k׏F8C9$.kOreWSabO^ ۷/v\YO"C DŽNA9r ZZuw(`U_~e!▿6!R|OcYna qօ^9Vn&F84;jI;pHg$bq;ꩧboqx/ãLLZ5K/m*l'JF,cy!U'UV[mxoVJRYqLםZ*+.Xpܹ1+؝qǞa:sK/ꫯC/z*nւ)Wo!\li]wǺ~M3!O>Qv ;νuި|q69,>yq8uפ `![!#<[oX/ @�@�"еk=lH~cNRұc;q'\-bpG P+R@�@�@�@�@�apV(>,hgqyǷ$ȭ9Ͷ~{zy{lAs9}uqw_Z [&!�@I;% � � � � � � � � � � �*bQȬ+RHl:!vw}1 K J;}̙CB9ѸR׮iF>jң6d&!@oiv[H` ).K[qS{ AJ7�CԴΥ^Z҄tbnsZAp83ڶm:(9f/F?/xWz!mf uSnr5q-(gy<xp bqhw^gxP)z7(n۲.=m{(38'{|i<=hlW|1~Yeq>W:}XfЪUx~}/ˡEٳg6qky_E-k.G}t|ʡC**gK7w�|n̙3G ,(uuJ^ϟ;p{ޡ-1. r{ -lh#>oI&mS #[:c;:\w)͆o:謬,l7߄};9Ձ[e#8B_u |7$za~zW^a�o?[ @%M7ª5LK6,m@�@� &JBR3WA%O/_|J^՗G`忒q=� � � � � � uԏ ,>h4Hs_*9s& 9%^[p-kA�'hjٲ .y>*<R(@� P+^� � � � � � � � � � � }+Kp#_'վBR{$s;SOx=B� ~I^{n-$)zMg;tK$o-zR7_c(Ig01B.g2:$m9ӧ2C FiǭSN͜, LǏ/r';wb~O? G΋i,L5O;s ֺuؙp<@`V ɋޖ9YR(/FWH={ԽCov�0.}8Й4iRYI/|Aŏ )|DυNLc3Kܙ]4\U;;Zвw=:erH 7P1l $+C;R^ _ʜq1LRié9[$tjm)vZޯ+g/k֬Yl}ݧ\vZ^};:j„ ^Y5\1<0mğRի(/F:Li)AU޷O?N}^Owdqm\[/|o_t؛6 IMg}v ]vZ㴥O֭[WrH䐤ݺu~}]^_7w/nvː2C?%Ja% 8AC'Lx+6"} 3s0@�@i&e}UW_}UJ*qJc<w~7QuN � � � � � � 4`p^T=9+N:syꩧ9^oss[<Ϗs\ipeU6m9~![.,y°cwsa? �y)DGei4 � � � � � � � � � � @ ̛'}qҡ;mQ;uRtBK5 ̨*_j>U Y$S !A\|mN:tGV$AYx 6L?8 /J8 (2*]&qp˨Q/AÇNv isH0a;C~-v$RKy,ƍ'_8d&8x幐!5‡/Tw'|4}\Νi;吙YwO(-o!3޷8rxx8t1En煃E{zʷ~xiq}wu >'%!ms\)nnWO]8@-զi{:ǎ^!!biq^$ .H'Y"3v0yOWDTaI:"$^yN.mvu(ĉo܉|v)mUOTtGI(p{,'S>:묳qu8m+裏>cw_s=q{s{Gcn~9#z<%Oz Wq뫯Z$4?^nusc[V7D(wѢEve=qpnj.:c5+vzud}sDZqEcLoG iIhvV(E u ? x � �O |Un.(;vѣ[ZO±w{}li^ pˡZ^ � � � � � �<9r>W1<8_s\vݻkvyxޙgǍ92FSO9xuQ%#*hСes}ې曫K.pXFkcؗ򹉾 \KiO2%uu%g' @^ 2F^G�@�@�@�@�@�@�@�@j|>;o%VRﯵZ+vYyKf@�@�*wAYYS*\ܤ:!nf98+ pp_|1vY)q!HhB .K³+PbuXwtV[骫ZZ2*zH5H( kרk}^zi!V4i$ !puŠwD!F`?P`j۶m|5OewG{G _rY u Çj3'.AqXEMUeP/СCAfՙ;Zcn玧7l33FR 袋t)İnݺ-*wyrפIb ]Q0=qbʳfϓ/_{Mxc)' [*5{FӦM Gu./jq__Sk@@,e6MC_~}|!%;Sqe.M. ك9S!0\[" 9 $o{?RXXU@�@`B&p |f_jw o]ym1L-)'9c!i'גڳdw9b94RW9KD�@�@�@�@�Xrv6o0"oN81\Zڵ[hק~6m,5Kzϻ 4(hWy}#>)N>=s˒g]@�1C 2ˬȚk~]k* � � � � � � � � � � �U!S X%F?ЩzaV6+IpV6)s(J <6wh+ڸqRgϒ֭bq%q]Fl;au}W#/VJA~Y/ux_oVSrF;%-n'ܣzx G?S{W[y5j$Rq܊ % Pl_qa2{ߡ3)O)2;vXJ!a riy;pPkLVyӸɝ뀹){VZq0diyug{͞'_H*BTz!h*u5e饗V=Jˮ_~´\ô\V]ux[h->zks_l '}4aBi2l>ygnIq;ի</@�@_}P+!1wРAæ,Nui+:[J@�@�@�@�@�@ ZhBZJNiqUqA[Y%=G.+nu)<%=ϰ< @ ppt@�@�@�@�@�@�@�@�@�@�@ ~]$0ˡY'g߻q!C BƄB<p皾m.WO: ?+38AZjԡԡ&VY\dJ;BgcȒ.⮻g(pgG.z'yff :Cm6m_iOư\|[̠Ek@cpK! dmM7R%.L #\cmÇ~^jώ_ux`vTU> _?p@-1͟=-~_4I/3*3gt|}_^uw W\b?{}OUGmiH"( ;]QG%[uUWy~Tݺ ~Mxh]mՊ>#@�@ |Q�-[O?6H첋zp|uUpVXwl  � � � � � @n ,X0֞YWK\r%噔i@�rT@}ah � � � � � � � � � � PsH|P,SH9rߊmJ]*t/}t͚UwY~E hB[neEVYl]gKᆱY,'Jhs:K[OV ;Vc jעꫂQFiҤI`ׯp׷o_ʵ &cmg̘]w5"PՋ#Gg!cI03 6i$i-~ 9k![zJ 8ϟ;l_ Z'nݒW+*㏓WkBDAVb@�@�2N *y'o:K{nW:`n⋫`,"[`#P+ � � � � � @ bpkA�@bԪXOjC�@�@�@�@�@�@�@�@�@�@�NiXo'ONrq԰BIXHեԩԸqޭ. ^ j1*}oM~;u;G6,=€=m>WA#coiIlƴiK/hM )Ûgxl:b"+*S`aO*sQVwfVCP1xt{4bĈ0|9 P sN: 07m*fRR^RΓ � @qSz'46h#m6Pc[jK/TÆ ;% __|Q#׍B�@�@�@�@�@�j@׮[Y95eX@�R҅Mx@�@�@�@�@�@�@�@�@�@�04) m7Ν,_tp ITJ}yax<L,uk i=[iiSeMcA_5j(}P5lw=.9.4,;ΞxtAyiV4F9gSyᆻuU͂Y  t(yH?n?0\kNK6޸hk !� @miƌ丩>C4fޚ<yZlY,:axyJRjgU2hY@�@�@�@�@�@�@�Z֛!� � � � � � � � � � �.IhVH'^~y[$,k$@YZIuTzX@ X@:5 J|wɶpuו:*u +`V E?}"Z3BϷӧܹzCz&G�JXve58X~y5s(DV%n(T@ 8蠺:=tW#|d yir5XCrb€N=U �8Z|d][7/WF#� �\:wNn{uשk׮:t=5y/I'Tc-.|{ � � � � � � � @5U ,@�@�@�@�@�@�@�@�@�@�o&NLB&M* ᇤ-v% WSGmOg'T^QóN?= Cj֬[oh=ɇlI,Z7S\TTGaôf&mA;MnРA5"@ 4j$ .b9F&U@k)yY{sI?/]p4|ԼԿaC) � @M0AZ}$X<մiS]{oo4pViӴo>ot1BC Q֭+mYT\T`F;{O@�@�@�@�@�@�@�bbp� � � � � � � � � � �,feh}]R'J$GxW|3}i\aCi,o]jҤx,/_/zWhn:\Y}?9@kCSNmbK!/\wuWޭ;a�Cen$'Щå wMµuiҬYI+c&![!� �䵀y?E)mvipt&O\'tns1zGeUv ?/A ̊� � � � � � � �,�ZKnH  � � � � � � � � � � @̞g94k„|Tr^4!Z 9,*L 3<+ 7N3Gj(鄳W/i,o T%0++h;VS6mbp֕W^o\sެ YO־:K;v+ 墱TRKIxCgRs@ 8vu?L!d5p.l![F@�@�"#mi!nGQy*k ꪫV[m՞f�R,LМF@u|�MA�@�@�@�@�@�@�@�A@j@g � � � � � � � � � � P~Mz=Yç&.< 4( rp82>;<Zh33<k|KxVe Y{= @k\H3ߩSua֭[פf]@ C`Ȑ!1b=\ycr.ZBrM ꮻK:\kAlz 6HSNQ^{- z{l/bu3 � P] }]crذa:tAQF^Iα[jm~[u֭ک8j9L琜@�@�@�@�@�@�@�@:Ԫu� � � � � � � � � � �BaE,MP88@kaCs$C[m+թS+X*c7ߔJ gW/³aQy,_g5J'O:Z{cp)W}jV㵤 (B29眣=Swz(WjU+? G /7KꢁZwVrht-4%gKsJc$[?/|z6, tSiek)� �9)0i/Һ.^N:$]bRqs]zV!_Xj憃a*ך@�@�@�@�@�@�@�@dJa  � � � � � � � � � � Pn. JBJ촰n]C$hݒR}.1.g!Zf%AnݻK'9<˷ AESN-qHMv7ҠAtjM6r-WyXgK`w_Ç3g]vy^�!pQI3(t.t=ҌK/IjD+OY&kwꐣ+ky*ɿ8bdxcQ[s!� �!4kjq[eU.ӡwO5Ν;Yg̛4iRN}q*@�@�@�@�@�@�@�&.&x� � � � � � � � � � �)0w4qb!Z}J+%DIGUr'*Ko7LYw`_ԥ;'묓jUV["`{EOƍwc=/飦M֔f=@ԩ+Rm^ :H~{ [9T~CM) %Y;(͙{p PLv{4.@rC-# ݪI  �o(|]=Xx9rTԌgq{5\O<b˯ZXB�@�@�@�@�@�@�@�F@qf) � � � � � � � � � � g!GESg9<K+Hݺ%Yoܮy47~Qz뭢YFǎIh)$뮛ly4jvƍ+=z i,L 9c!QFB�$mF-w'K._s@;PyL[@Ə_nE4M[b"-jX|*|Kfͥ-HB:tH/ � PY&mީS'm喺r"Pˡs.BzjSJU)T� � � � � � � �(@"19 � � � � � � � � � �<~J)x5qR:;;vX{Hݻ'Ct^[~]) KzIg:"rU0v؂�1ch֬Y1Lo߾:ScVϞ=U^\] څ�9,Nx }Ѻ4d=䓱~|'T ʩ ӧKm&͜YgΜi!кt&l .͙#mk m^; @�&M>{ɗ8l0㎚:ub\;_.,ܚ ƕ7o^]I @�@�;85PRf)CJ*4HҤ(H4x TT*d.SB%"y_;s?s^{S� � � � � o D�@�@�@�@�@�@�@�@�@�@�H `˗EaxW`aDeD6�gU"w\Z@=Y>˖eO>uqs{\8\`5kV\ٳeJ*僳 +Wva.M�P_|EnZڷj*۷jQ1~)Jd^gϞPH- ' !]tQ{$h:<vI#YѤIk޽RAֹ]Hyƺ � �)0gNpQ^ʷҪU+tذa SXCBԻwoǝ`(P 5@GJNNE,C�@�@�@�@�@�@�@�",@VA@�@�@�@�@�@�@�@�@�@�2-ҢE³,o[YSN 6`blٌvZ9֮@=o)gNF n][ >d{9M6iƌqZsVդIuhUX1r&@ҥK|0- K9dRg@7)R$l"s@\ (P- @ ~5jLټY \Oyyda B�@�<o+'W%n6w"ҥK >\>m-Oow4X=ބ =++vJQ=@�@�@�@�@�@�@�H�Z) � � � � � � � � � � !~MZ0,8/_ ]`Ut*Uy3DiD&ضMYsH+WJenƣs ӲP- $O௿YӧOԩSۧJ*=zy2eW1k#�(0foiݻZ,oĈzgyinذp?@�# wAPV�@ # /nL֮&OSCHIvOi[҆� �U6<*zk׮4h;O͛'뵩SO>z!~gaV`lF�@�@�@�@�@�@�@�)@V|k@�@�@�@�@�@�@�@�@�@�Rh҃,<UdaD:Iիm'i %JY]ԑȭHwŊի}ִi|ɒ%RU想ŋ]f?@ {1}.<3ߟ`wܩѣGs > @"EfDvpNtHn߳l٢xi:i,PTp?iY \k$nElϗ B _@�@|,G#qꩧnݺz72DY޽SOiذaɝ$Q"* C#*C�@�@�@�@�@�@�@� P+ F�@�@�@�@�@�@�@�@�@�@�زE �-/^,%Uf]rI0�ӧl5s l$͝g`~3g<l;zC2{ ,_�Y9rЙgVZkv_tǎ+@ "_|w0pCCZ7nM"P+|g#@R Ǝ ‚ rY8FJ$z 1J0A8Qzui>V `BCx �Ā…RÆݙڇ :"[1VX1uՇjCY8#@#  � � � � � � ��Zig͖@�@�@�@�@�@�@�@�@�@�@q 4~ B4nMY3P8;54Y6`ҥAhgٴdI0uٲAhV߾7 $_`�/״i5k(O<[:uƍA+o޼�@�RQiӦ|anV}'~`}vqHe_~,0O>ٴsÆ . 4g;m!@J,z0ɍXɖE,@�cfԿdS[+=\.SYMEA�@�%nԪV~_yCk 2D|ڴisJHe � � � � � � � /i-@�@�@�@�@�@�@�@�@�@�+VH_fPʔ ڷU\&cU` 4k֬`>gN0pytEZJkS8Q-w^-taӵ~zϟ_ 6TϞ=}V:u|KT,G�L!PB}7nnf\R jȑCztu@"Ek8D:]3 *Ӻ5kC @ .4_~ µ&Lzk5o.wTh@U � !N>[ʒ%+V;8_#F0ZrZn'x@Ⱦ|MQ � � � � � � � pDH � � � � � � � � � � }<<<lPSO B 5j0oJym>_~)ҥ-wc3^=iР`^"?Ԑivڥsh͜9S7ovUFԷo_Uuٲe˴N8D\~AO=={hq;f_z%;GN 1 ÜJ.$UXTc ^@t ttdv]81zuPOV `Bח *} � 1}t ?ҥ;vT.]~z7Ev9-X@5k֌D@-0@�@�@�@�@�@�@�@�MO}�nv_.��@�IDAT � � � � � � � � � @`<4~eonr*WB.@xqγQ+m\ρYjזZlţv7i8,'e˖/pܗlڴi~={vءҥKG}8 c ;TNtwhĈ>,p%^vZM0A^@gĎ]dm;/{=6i4eJKvOi[*ER@�HX`"iÆOx-K\ gN5JݻwOYezuSwBcyVj_vQGA�@�@�@�@�@�@�@�I@tg � � � � � � � � � �Dg@}۷Ksgyt5RZR*rEXX % ;Ay͚A\,;@rVXk >E֭SbŒr?3fhwI]RBչsg??䓓]7/@�UTRz뭷ԣGxz õ^~e '`V/5kje@  .4 k,O/%)#5olټHtj,E�@�cs}}#5q./!%Pnw߭`뙮,Yd}f@�@�@�@�@�@�@�@ Z� � � � � � � � � � @ ³ ~+)+U.թ#ugqJ9ü!{J6}\Ozuϭh~{0/[63K۷O7omۦ;vGq<t:]f<f˖MYݨ6?t<Gʓ' ¹ ?~?XL\}Yu]>ݗ.KvZi|"O?gz~~,P@�L.|7z饗1wӦM~z-Z0/ln}tr 2<Lo;^/]]v=ߧʕyŀG.'[�+`ǦU.؂X8_+jܸ4`ʕkSvǤ.q&;܎j?y( YN &wWĉAᒻ,YgI-Zȅ}*F=6@�RC5;Nڃ:;tK.ğ ?tYs[n%v>lo!dW@�@�@�@�@�@�@�ZW}h8 � � � � � � � � � �At87w7ːQRÆDQZRJ;0_db]JA�Y'BmAxpl-[?(?,6l}d[Gb¹tXU?+\fpmP-Юs 9Z$-  Wpq!�aK('۟\,Y.]h>jP֯ {^pEӦMu\@ߴ HK?EQ~4rHw>W7M֗Z_u%le5}硏/XC-'~_{ah֯-'N^wZ s/ 1%Ksc}ZO˖-ӊ+/kEvl].R-Yo ϲAxܰ-:Î61&,v +SNr?6tdAA� XF.?ҤIҫJRAl.R �DV~sq={hmMw|@ϧݾ}{jE P!PA�@�@�@�@�@�@�@�c Px � � � � � � � � � �-`c, Z@n`kjזw槟NxVtz30@%Br㭻GϖTAbo#GaH֬Y-B֮]{X poA ax iQzj\Д fi' e36Pd-{lovl(Y@`@XHHRTڍDnO8x>0|ҲX#<J߇(p0FSwB,gKKոqcPS@�(`}ƪUd}ի}js_OBi◂ ¤ ~\r6Y0M=>ΥZ`VeZY84h˂ Lx.Nwװߴ2>Ӝo(c]-;Ҋ/^xSɥkԬY3/_އ]G&,+4@c ۲c;-9m?? ێ\ҷy=sS Lu`.ƍ o索UkLA�@�tG%;GO݆9w۶mog@-nݺ@3L]LP{[2."� � � � � � � 04 @�@�@�@�@�@�@�@�@�@�XpckZ6ˇVf]sM0\YJ1c}˧ԩrK3fHeY`gzk0/[6Bj,+Ho-D& [YSTn],Y҇UX`E8+V,&fCJ,$%u P ' T mValSPpI'O>هt>u ;waYu[xX-~ڵ.W_e;[PO?U w ו+Wd9]a�T&M|j}Mv\B)c!�XýBc[ag8@2 mb.gZO d}e8UX@;wԔ)S4vXj: ƪY?ի ޮ]ڶR%'sa;<E4{l <okРZl/}-#@W}޽§2G9H-Z![ � @:L,wA=7޾}{.xs>H-&vW^y@Ĺ]# ԲK( � � � � � � � @z ^l@�@�@�@�@�@�@�@�@�@�T <e AHծ-j T+BYxhٴbEY=,K %=Dq? dl2as vbae!M6v2eOs{\H.L .SO=VYX* g,;诿X, &B lP;,۶mS~O<Rm׺uk]{3m5 @ X?( V&;~Z'K-J;Y� (PvZ ъXi}egZ|.\BN;4?YY٥d.`%Ό5J&L֭[},w,Xk36]p'NԀ\Oo=KԱcGq@ ._Y\LV5~d[}J"wnt` `=/E�@ c Xiq+qZ<a`u릇~X} Ӱ(lH{ZQd@�@�@�@�@�@�@�bH@z3@�@�@�@�@�@�@�@�@�@�'y4~g?hV0Y|Fqt1³,@kjkvUrc4 ٳ{| JX pX\9Qn]?|dr劎D&j}XHMrPp 駟,4`͚5%ٳgZU\rbUNJ?eʔ)kwl Lh,gΜ*^T8:,G�U`ݺuZ`-\-8BYroAfh!MѺ<$އ#VZi}ffy7fr6+kԨի֟Ru/R}]ռys?|˖-}ngv4}t}G;oשS]Svu}mE [`r_=͚kY />Kn!\[  �rSOB TiAXoF ԩ^}j۶m-gQR e˖ԗ � � � � � � � q,Z@�@�@�@�@�@�@�@�L"Ю];=Z=nڴlg}6@�@ Vv- ³ /w."*fq} U +b_@ִiҟJ'5h 5iL|2m0EK?}-믿!Z;w dx)sʕ+˦J*eIT %}:ekCd0\ !f Y%Ι3LJ+qm%ѺbTZ5?j޼yyi{?҂l>tز. ز~xS  45rH <_[1s>׎Xw?\Ç{d-XO>PB,2@XV0A?>v-㧢E3Lsi �Q-0id}˕vװi+vŮ3J|i̘1IQَ7H"8q;H܇hks=j8S\�4'g � � � � �p?/~_@eT� I%JH_|?<{� � � � � � � � � � @wn͞grtT@uK=$7Xt1H M"7yPtr3gJ3h̙1c;v -ܡ~馛|Ѓ}ʕ+F?-Vr,0˂?l_l.\?OF҆ 8Gʒ%,h!hc>h$E<@�2:w1uT?}hǹR.{t;)Vd2[.+SljѢE-l@pf͚!CȖp窝NZ6m5k`Ӹ� .`Cինm[>ҋcd͚U{}Y 6LO?6mh:3b\C }lNB]>7NjNC]$]x5i"� U|څiK9S4bĈ ɝp @… G[n߻wvlҭ l@�@�@�@�@�@�@�Ȳ@�@�@�@�@�@�@�@�@ڵkѣG'8՘~aT"X� �i/vW_~3TTn0Ьgv̦;+,D%59G.J. 5;).e̦iӦ'gVZ7 q R]v@ n>}wүô+EPںu/m޼9n9=Ǿ@ ر/pa }ߺxb߯Z(eFT^=߿-[6HjjZ]Yi!m\"lƍռysTRFj6mA {{ݻwW޽U\lcƌу>('ux@%Kl/&id~*YsZ{U"<6� @ Ԫ%;\n6z饗oe/6 ;g|zڊOh[=5J <s8p֮]c  @�@�@�@�@�@~_}! K@�L.7IEMdrd~d � � � � � � � � � � BݻM9si-N:)/׬)ʕ r@e ³lZJʛWj@ @vm4hLΝ;5uT}g>cҥ|tLXץ˗/͊v."ԫW/;5k,fA4 ,p~r#ZX[n^Lh}ڏ�1(K裏4vX͘1C{q5ԲeK <X 6t.ѓ@2r??&O9vI; ?Zg\rMf  0n۶ڴi7|SFCn 9()w0lk[%5 /.H{YĢ� @l 'u%:hܬY<Uַ IĨQJ_=3?^� � � � � � � �+rd�@�@�@�@�@�@�@�@�@�@�V<eZ_-m.,(թ#]q\NUxb<Cj�-'˗oYvc@3{2uٸq3f&L}Pѥ^އiY`(VZn'kæM|}^} 4HEQVteEʓ'Oz5"�4rH?8~ .uyhѢ(!*~l޽A|dpvڹ�9^ Tz\>۷*Uy DC9L kܹ֬J=#{k+> @ Ulr_C4qbn_?p- :|Pk 5#� moZ}O;4og@-SյkWo3 N{"Z1&  � � � � � � �Ā�Z1&  � � � � � � � � � �Gϗf:0-Tj0daC:Ʒe,u\N5ihQP� \Gfyf4bMrX`!De AA (PgY+V?p8={vաC`3e7v!c\,X )-@Z gv~>3:vX{ܸrʥm۪K.jܸs#SHE,ܦOhmɘھW6mԭ[7U^]ڊd'2`/\k}.A}_@V[ T@ L o4e׿Pk}ȑ#C []>X+C4*{nb-� � � � � � � ��Bzɳ]@�@�@�@�@�@�@�@�@�@�Yg#,fXʛ7&v$93@}m ʕΓ|PjTʟ?$a7ı_~YG_|>T´lv (`5={ӦM|Xȑ#uW(_|ԩ:R#) @Ne3f* : F ,0Zlz-s9Pwz)ZMSbE;w̙3ugʮ~ع,ާO,^X$ /6@eӽĉkI}JJ=˅K͛KEA�@ 3 Xק[Np iٲe5$ޖ@x.yje䴝u@�@�@�@�@�@�@�@ vή' � � � � � � � � � �mѣJ^f݀lAPᒅl]wI GJoZlϖ *V^}5\]Nքi6w`2dN?tvZ+o) "L+RPIo �c?C=.mZjjذF{w3>DiADիWWfʹyfYիOofh~B|Y۷דO>O<Q7|_ǴzPR7oaZ)`Ϟ=y=cꫯ6H ;֬ϗz~Q.O*V,#7Dzԇ� @X(ͦEk[r;3~H`ɓcǎeQbj%& � � � � � � � j2@�@�@�@�@�@�@�@�@�@�JzZ*XPjDne)[6;ӥM U|T.΄f!p:q.G>(٠īV (.u MoaBeʔQ~\ޥ.L7 |3tbXpº馛4g7X7RWQCU8f k a}:Sս{wwD˖-ӧ~Y : m{ʕ6lΝ?]tъ+mwhodZ6m'D;O�ڿtF djՒf֭̐ 5*TBkԐN8AzﲴeK ck �V`x'M_=?PU-[Զm4eʔʼnҭs{@@�@�@�@�@�@�@�@ N � � � � � � � � � �T`iL엎?^.DM7Oj(Սի >;Jy=i!}d,~TTt k|mѣrSNIVE6vڥ>~W 4He˖DHKU.BQOq#F@!cA N.G>҂q),@ X \{lZK=twR>b-N]k.H 6ԨQ+W4oC,osZ#G}˻ʾ!.YW^)Zp|V}tRѢKO?-SL2;� ƍ;Oʖ-}1ڵk[kmɁv?~լYXʣ Z9rHKX@�@�@�@�@�@�@��Z'B@�@�@�@�@�@�@�@�@�@�h�! Ų`% z` 6mfϖz*hxwic(`c6Z͛K}&m M,}tRV+)STJW˖-7ܹ߬s. ȌEQeA8]tq}7ŋgF ɝl_s5j֬:,-_\? =pbT|1k,=~ܝSH={tWD>LAΓsC }Q2_ ^Y K0 w'r) �D2Ϙ!]xa7dɒjҤyoLX�-aRv{ĵfRX@�@�@�@�@�@�@�RC95T@�@�@�@�@�@�@�@�@�@ C +-\(=ԩtIRRv5kJÆ /j@ʕ+C A Q5k^:v?^UKCJWK}YV޼VWعsz) ?ЍPiAZ7tgϞm�@ !|i][څ<UY�X`ܹ^9s^~eIL&ЦM-YDW]uZnnMDA 1\bE|wQROB;wb7nܘzfH5һJI_|!]rI6rTt+HEA�@ L,EZ㏵Œ2H\ n_bEiQ4# ʙ3g4"� � � � � � � @ so);� � � � � � � � � � ҸqK60jBf?n<dM(z*TpYO<YNjUݥ?CZ .]0k.eq;vM~ZOe-߿_&L߮+Nϲ%=[l)iԩS~UT)%dZѣ5|p=Cj۶mۖL@ m}5iDM6u U^p T]W<x عU}?$u.bKmժ|բzyܹ}dwBo뢋.͛zh| ?G|T).Ic{ׇ%I]逸^nnEwrZXi ivGYRW_݃ �+gRjAB`>l}V~0Rz$rN{nJ 4P޼y5iҤ4Zlm@z?@�@�@�@�@�@�@�U k6v#� � � � � � � � � �  oYP"҅ H &gc/Z$m  hLPy ,[&=\@yO> ,L΍ KQCʒ%0c“,#qB4l�FJ ۷OVk+Vrd? w}nm7v ?ZkkN|vi޼y}֭[k @ 3FW^y _,P(ʖ-[tR�hJJqq+WtAb.^o]}M˾#~5-U9ܹsw@Q]?,XP}Dg̘\YGQݺuiӦHTWG!~}^_ .iK|}NkuTԵ4j?ѿ @Xzhՙ3gj͚5*Q|CWIa=v$)hѢj޼y睤&̙ӇY/%yaV\BF�@�@�@�@�@�@�@�"(@V1 @�@�@�@�@�@�@�@�@�@ ϗ~Zr:Bk,@΍ѯ?,tץo,hˍLA *\~lP=ON=UWl<DE%K-ZHyDnfF[Xt'O8Q6 $%e˦뮻N*U=ds=W{Mr6@nݒVҥW~U"ܱk6oErՂ:wDSǎ}=%٨QQ^z@brhuioNɓ5`4֡)[ 2ֽ{Cod[aϞ=ݵe9裏j͚5K7p,MK\pe><5Sdf.;g[H[8#o/+&s4x\jFi5@�Ȍ[ʕ=/1rhJҥeו .Ԝ9sY+?ד>~xBqR(7n, $O=dɢٳ'� � � � � � � �DP!"IU � � � � � � � � � �ؼY.F_:<P!vm$w[nMMKǤK.J|[¥fͤ"EK/P3~{rKn}JIJKک.Y]"M,kɪ6^h;qz:RJ飏>'|aÆKX]vuA=a Ⱦm $_U_iXRj;t萬c|ȑz뭷GJ! \۰a&:]ӥ?:^o[9餓EAӦMw .) )V,uti:@=2JyD: BqҎD� }&tF&<uX췌2eʸߔ.C^b דغ=+|A( 6ԯUV{[;wfڊ� � � � � � � �'4|#@�@�@�@�@�@�@�@�@�@�47wIk֔ ?_z`'/ 6mHʝ;-u&qUdwW$7^͓_>ٳGT'f=.Q+V,nyz<D /PW\qߌM6.@-_\ i,Z蠦~N5iD-[F m;>%y΍2m!)ZR5F$g[ЩS'O={fYd JH~aﯕkVv|m? lвw^;ֿu֮r1k{}ntm۶={e%9uiJ*ӧt ,If{ `=:czJ ?ر?n(D;d[ٳg2|\p~  鴾=zhfN[=o?vrʑ3sL[;&+[G럏TR.rٶڵkZO>ۖY8X#FK/NoOnjZh7x#3I{qFsPN>lٲſȝd[l ͝;7iGx6805S] Lw.z T>8.u,lj+Vx9{l}KGkT;X(?v>")w\.I&3Ljx#Î 6<2ݟvq;U; [ؖ;usswp+%sa �)S^.q.]zX}0k9r׶vn2|5? ꦛnRf _ؼ`\<?iYg %vR\D�@�@�@�@�@�@�@�RA@T@J@�@�@�@�@�@�@�@�@�@� /} rKIeHW_-͙#5m*7rK.ptr'm@F[`]B|³l^ pB*^<#Il/!{,#k֬tu׹p5PX:5o\? YBFA_z6PCXĉe`Zof3iM:U[nի+%ۦ@qr,$lsRe_|AK(A%|H~Dvi=m{e y[6j(|(àAtm&Lۛ�CK-df_~e?iΆ dgH*W>0hr5;7x6mZz5"@:Xj}RŊacڵ}wvw-'+]t%ZUYjW) W5kW-\ m\dߞcSO=ױ* [o~XSΝ};-TTm-&9%[]YYɓGj}2ۗO>ٚge^zǬ=-myX s$対ʻ<9,^sזPQ /_>Nd-llS#OJ@y.MwժUIYu2V=}Ot|@_ ﯝ[xax2e,dծh:$łeZ{[GR7ݻw&5�'nѸ epr \T5\`\HI?{� 7i֞ *hȐ!5UV*T_~QuǎqaYv/[n==j{ݛ�>sFw %o޼V-m9sFKsi' � � � � � � �ĨO6) � � � � � � � � � �]C]=&7T`6~�r(Knu7rK%KM -`  gqn?=D&gY.H} <Np\jGAsqUdʕ+}PmE> [pSz4, ,˂X�Ⱦ}6�\ݻ7n`L g` +s &>aG~ Bl* KP/}Iz؀6Xg˖-}8ǝwީ :,B,l[ )r&N<D+Ve?k>t˖[f'>B?,ł_,\ h\l^W�s&P!d8 Yf KWQF%[oC`lMٱc-Ç/ٲeB 0.iL cXТnٲǂl=\+GW?^ s+fj۴b&a@m0:ĝ'7܂$?B(K_7N_,;dz©* ;bY�R;?eUϥ}(?OX,+ۧO ɟڹ]4n؟7۹heӦMZx?~~YRYl gm>i7R5{( @(n{w_vxpȝʅ˅vJ~*h9 �&ಪgܽ,w9]/x[V|yСC*v-l.\Xgu<w3f-L_XxF)v߂)I@\r%� � � � � � � �@T*@�@�@�@�@�@�@�@�@�@�)\ԯ܀RrAYny74q4n\9  #ಙ4x\A"׶hQ gq!7`tUR"Iʖ-lnt.qߎ#9¿-VZ3gɓ'\Re6 lo'&X {v~ɍ}'ضlqXgoXt$$gu%oӦMܟ6PoY- zq/�L-,wUR|�HRFdXHjk] @f(]U ̚5l~B0-Ǝ냳z{7}e]ׇZPaV��@�IDATX9Z{z ǶA-LӶhʏ^o^K\g[XKq}[ # |=V~Dv>a}y9s=Da%GjC<sbI ljv@�z]pk-8|ڦ ĵ-[`{m_Pm  vOv)Ҽyҵʅ-5kҺul@ >DrP.�Z֭mۦwy稻f-pޣ/R�r "%\x9rdJk {8+#P+\v @�@�@�@�@�@�@�(8'v"� � � � � � � � � �- Vd%,U =ܠKFI*"e˖6c+ jxRR#H%KJ*܀RR:b#Գݻw'e_^y)) ɰ?ãn\r>l̙S~0ˣVْy`+ynhlʟ~I [K,Ε i+fp%xM:aCKteݺu=ٳg[ `j!aHXSn]8ֹXLe;@R@ Xp Pn>*%+յkWXB n'K.}w9Z{Zn-ж�\BÍ7_hb۶裏~ڰa?w �JR}ebDzոqc?L4zIiCSq]9RzRbŊH6?ljv `%|.lg ı֎  ;._<la@ 1g'ZSramʅJJ./ONG�և|ԲePxqiFC 9*LK Z9aڵɓ~pQ-P)ژ(8ZQFL@�@�@�@�@�@�@�b\@=@�@�@�@�@�@�@�@�@�@ 5ld M.E*UJ*i Q#A% ٲ k*VLQ7#j RVRѢ5М9RҬYrKo%u(1vG٪ Bi,929/{Uz7ߨCڴit)Sq[68}|4ڥZhu]C.q D޼ys=۶msAr.I. e׮]~3g&aHfϟ7Ȃ"U dJ ͍m!T '<y-];Wp' 4ֿN>=S`gw tWP-X/谿mk _رc9;t%Ra=d Nmvaӎ;{)G>wndr+mPqs);фJj!mi}^jǞݱ8NVf͡x%k}hv\ ގk'|r$.$X_/w&0-}Q}lY&-7w5Ȱ �I�F5 ԲٵW_}u�s;?z݂SX7$gȮ,YYI"PO � � � � � � �d2»@@�@�@�@�@�@�@�@�@�@�(ؿ_;,2Cz~9X6~q4SR۶ sn<~Y#U.+'u 3HW߃ D_nGg~z쩻 rF9Nb!~J(Ұa|X|p}裏+/ߺuﷃz */_>5;-ܫK[esI(ժUkM8-JNIѴp ;,^ełMm}E@- Qo˴i<g޼yʓ'X5'߹'|R JA�#`}S͚5իWt8?ĵ!r{Q2pMQ?^h?vO:d/ҟmnc[q;! U@zm;| \=–KK.xwhaa]tQ G\9O@ռys)RĿ΋AZ6ptzY.`P¢,@7Iم8Nԭ[o:W{AIi1ca͚5&TQ^4i$+WS @Rއid)TO;Z 1&^#k �dO>J mҤN?t N(޽[Q֊S;9rdd*La-w&P+v_$wIk"� � � � � � � � T� � � � � � � � � �Ă̝+ZU^ n5o/?_ʟ?}@p {S (쳥wߕ6 ^ƌܸ.@׳$XbjӦmۖn},JհaÃ3vXB؀*Uҵ^뗅!wF. h?Yrn~?q,|0`x ٠'txHl[\s1c駟4|p͞=ۿsҟXs?Y+5Ϸ`7BW\"7j͚52a+}v>3XB=\B~] ~Y-|P=gm^).\ё?+ Q→u~FӸ lQeOY�v~z%+c /ז?_Yْ֭]6Z-f*WB nmz|?d`|С =-|,+7xc؇l%N ,f0[B>f=$a6  P;e0dwBo}\2.b׮]~[|駲JӺg]vر pI 4uv H8rn9\ϲ0X]cY^ܮh^L<ٟ#ˉ<o߾_@ 19~^]ƺN<QUK.hSĂ@�bU࣏䂪v`ĈڼyONe_|ţޣ߰aCWCGa2@бKfDG,P xh% � � � � � � �,@V, � � � � � � � � � ;iӤZ :KzQpElqPAAړVE \{L. H*^\jioc-_.=t&+W=@<y|@5o<n(�`{-k׮ݻY) Z` ҲA ȑïҷo_2mz7T|y7^/v4i$ loA[6� Poc!Zd^wܡ*UJʶ,bĉ~_q?@mj-#wGiO*,妛n6zUu鑣F[Ѷk`7nBҞ;ۥYՔ)SnE]ZlK.=-@e۶3 >}n4m{Ò} _VsW ϟQ@ s X`A07<#i7o^޲e,<qРA< D-僲ڷo}qق<.%b}Sc_xڂ:N ~E~œO~^}Uߦ#C5]C:uzhE&*Mܹθpf͚W _,vKp?>oCs <jԩ=&XYD338CժUs׽e9afR:hڴ#`5  X#Z@ pr,ljĎv>mA{\"]XH]kLs7,#Э[7 À]|7իósrۦ-[6)U$k^zq�@ɒv*}>i-w(l u#�d$3wVTۇR)*;Vln?K&X"&D*wj,gs8࡟ZήS̚9>h]e_?UuqeѣGga>lɹСC�mC[oa] ai@BXG@�@�@�@�@�@�@�[VcŽl � � � � � � � �'"ÇGzsV5v1N @5Kizu";*;!Gs5Foo⮻ߗZGrB5mZc8pmݖ[U3ϟ8ܺv횅>wQJxn6B97vwЅ ru- Xe|'jذa]~ZnRZgi4o|y;Тceܮ1&N!\a[�mu5GEN &9aZeyV7T?;# Y9Ctu׭TXbyl>:S0p!b-=\yclqy{>u|^:͜93_\:5z<u,}^򾏩>wyqת,ke@!_ktMujek O_? skyO8orfo5庐ٌ32"a//3?@`Ǝ|=?@V9`"84]\B@�pwhlQﯺwnj>XTj_y|?K/ͮT KN_xh/図D@�@�@�@�@�?/_Xy1@�:U"e= � � � � � � � � � �e L.=tn|RQXM"^ яҴKϣi}�Bh#EA{imuٮ kNONΊhuEUJȁֽ{_5Z[Wx>N[N;uaej=7lcOo߾Eô~hĈ%ϕu{--tSN%]ZNq\-F:u^"ߕmkY+pꩧ?s9f|@ <@!7|sV6nܸDpE%oƪKۖ+://k_2U6OY6Z݆^2ゲqu1CZ1rqSN9E]v y0Yޏ{P= `e+-Z?^6mڬ説N?ty,_b@�_RpNP+Ӓõ7ؠ<<@�@\^.u<oYvmW-VG-*O<YyyUK!,N/Ue@�@�@�@�@�@�@�@V_1�� � � � � � � � � �g)B`R פ abO*Զm ],]wR֨Q)h.GX_u]{yf8X^_k}v<//S|QEtTy~BM6~r-\kr\sZJϧ:FfϞK/T_~/GPa$@F ̚5K֛4iRԏ'-g~vL+obҶUqwwqJM$` 1]x4.u]:蠃*V?t-hȑqNv0 P:H'z )`H_Q"� PsJ=$K߀m&B7E]c=v/\g|]gϞ+g?1b~ :u/G}a^u^sK׬Yz � � � � � � �jf"� � � � � � � � � @ L(<Zo!ժ%m.ү~Z(~ %,y&u7W׿4Y]/V,*R81gy?byL)uNZ;M*sN�ҠA>]_h|饗eG?ҩc9ܗ]~Px5f˽hVYVӦMW_u;\9<#1 !@̘1{!Yʃ9sJy5P6mԮ];o> Fu]~NTw@LnDguZTbҶUqAɏԍ|PrƏ4B/y|OnPD`u9֡Z~Zu<:\!�Uk>A]WKMR\ת[z!�%裒/,oH걫[lV /0[o>w@-_{rL޽JoKM{_WMe{@�@�@�@�@�@�@�@`Z1'^� � � � � � � � � �T;88+) +BFR8%�-fI< ( (M.mu]<}o&6pOoBz),S'}4h7.-;Z_z]uU:#WrI'TpsȕW^|Q7%VkkVzZj/8 +`0eTWq�uqiޗ_^8m۶$(k7V߾}yx7,/\? . ;t駫k׮%*0W\1cƨY;c<_ܣNqjpz~tc\Y; }7PϞMջw@ABTzww8C &i##h:uEL  P N;~饒f`-إE�nڨY:tb �%0jԫWŲft 'Ƚ:<P3=@kW٪n:.5y*[BZ0Zi � � � � � � ��Zٲe � � � � � � � � � Pdó<?>rK>}v~)268hG}TZ@qG\$v3.s>?aYKNLYMH;K](E<@+2@ׯ&1_3-ܢ!CsO{Y j֬ي*CB\n7߬^x!B 7 4(A<GC�" I&-5 +̚1cF*w젬g={꠬-Z,7(d˹Qvm}:5t갾K?OuL`B Vo& {wN]7)L:X+}YDGԋycߋЭQ|NFc<t6۬6ܰ=⿱[Dg}{hrx xLdXwy4ލ�TH眓g93k}b_'šDf.@`[qd[_1bDUUI͛7ק~ZUPPuV jYY@�@�@�@�@�@�@�(>Q}l � � � � � � � � �<|ߵZ:Zk"`6UxT!Z/~nP/(VqƼJ&O,?അ 90aY+mm?*:wj xY'u7?AbrKq9s. 6, ohԨ<{&ֱ_|ŏ}Q/P`u!  4fi&+x\*.r|GdHӟ>8֡wjX5 8o?~B]vg];o)൉;e4lLY[k;s"HZKS6ӫ6P˖.}Q`NjMӳЭ6mUKݺ5PϞM#`6ڨUs*c<Tm-#q;pHG(|Wׅ^HJ+-[Jy$]S5_J1fXY:׳:o�1҇s!nfƍtwqU EteՠAj � � � � � � ��Z } � � � � � � � � � P05aX6"c.ԯ* qmSwO Z<-'^Ь/L W/cEAO!i�-֨6mw^#F_ +R>UVfY'01~F1@qЍD�ު) ]`K ̚3gNɲ\s,XǠ(fk׮~}ԩSw]uUEΎ]v7 G: G"~ax V-m֊\{(kLƌ[4nCž>q<H/ЭZS԰%C6ݴe@oZa#^wa, q[alAկ`7|Sv[\k �'ϗ_NZ1ZRӦW\˒hOC�|R 9W?яP>TQ |#^� � � � � � � �/@V@�@�@�@�@�@�@�@�@�@LehsL n;E!2΃(ٳOZ+M(.z®[o-BeX,9(w:4ϻ9[#s䶃"$B2 忍7QGieuwꤓNW_}7\}ͺC@X(mXϙ3g'ԃ>qƩyׯ*9�.0o<}'Y CJ?0 rCӲe˒pݻg!SyX:묓=vuJ\u20N;-/ 6, ˳J~c=ԢE2~W^yEwZwT[ickG^/mgΜ;% zY%[So4K/Э6ENM#tkNn}u֩YV^-Եk#,m<^><2d;,nR޽+{U jys~;]|q]akq�$_Srkx)yd.x}ö"�U+0jlaqPbc􁥊ZHo|߭+@�@�@�@�@�@�@�@b놊]sG�@�@�@�@�@�@�@�@�@�j@YZˊ,U�!]w)GIK; {n ѢuhUPAwfEF&[O~4u+,裏>YˆL|%Dhb8l]vE;f5jԨ >IYS>3=sY?1cdNvk}ԩSSnVJǁtH֒?A խ[WڵuC v<0}T6`YC#+B>[iרoO](z+=''>hNSN_WwV4͎Y_̙5v\oB>hN[rƢjZ_G֌ݚ֭Qǎ=je!\k,m<^kg}'F8ʖo<BoԹs\Tˡxzkv,xءZ~z9Xsl�TG2"61=ϖN>Yjtm[={V-`@�]^~Yޞf͚E�YoUj9h Z>@�@�@�@�@�@�@�@�  P= � � � � � � � � �\ rV5׈-G`ISVhEKGH}J_( .l;_Y_~~[Q`_7.Mܚ6UX~i�-f7n&Mb^xZ&hB*n!k޼yz/^г>axd߯7X}yaD0FrZ*Ax\LX~bt`^ՓCvۭvX۶mǗ؍3GѣO1t]wfwCt饗fmYZcC,DC`y˟xSOl4i}1]=7yIFyoF"ꁿ{f0{̌Ŝ,tkujEVk k~RY/ *m~;;|p?O<,lk-X BBx ?ЯkxLC�@QG#=4rtU隟_~{@�U5J`,Ǫ:k:S5g5lذJV|}|o+@�@�@�@�@�@�@�@Ԫxc� � � � � � � � � �5D㏥[ЬcQS( UClJ(h^]r~Β+ \p[o曋nGv.޵()jz5^ޮ];qYO<YO?yorFwr H7h9K={v5vXô\4a [n<@Qzs +0|}%òJwL޼v(VǎޫWejJj2;7H8.Z)cbmآVz'OꫯT|:ް[6mڬj"&hy饗G߮?'=&s�jMmޯ^-/}Eטּ=7O׈01}ŋש3/#n~Vx<e\}Yz$\ kߙgzO>6k,tM2dHv4hgϞźl P knt=[]&0AKr˚k*0C@F x9P\w}9IUlZ+W_x+ɼ@�@�@�@�@�@�@��ZCa@�@�@�@�@�@�@�@�@�@0LY wߕKEݏ:JuW d-+[ r Sĉ"BҕWJ;B*{j>LxwVNCQ`<CwXiUm6+&n$p�ҋ/!=s4w,ao,kɏQr>7.+@}b\FLƍ 6f x[m6pCB~zT SbdtHV~ۡߺ*|>R[w߽vXkR$+{h9x5%#dGN[Z^|L͏s /V:8o/l;| v(ڦnMZkU!LN7cc嫑[&IհE?Ek׊o^S Ǫn akĉB.]ne̙3?c?3̾BL5q#EKZbְ1/B kGo}uFIV]4UEg16,O.0m1~8C}\,.r-۳q'uuJ4 @`| Ys/Y^{jb@�)|裊p|_iqy~ m>gZ"� � � � � � � @ U,@�@�@�@�@�@�@�@�@�D3?(DE"~VRHRsH>p6\JzTTu(@ґGJH}.̞B"+@nG~>4,T-ѪV﷈͟?? Nz=>̼/ O;wgdZ#[n= 6_~>+$#e#'d[� YsP&luj*eUXy/$,+*=urܼtpHv.۵knׄw+So N!+kذa|=FH;vltFY`;]w,_?=[s7qwy;4An.cfEl,PC^kRWr8{fy+5i$x̲_ԂH`&ǟЄ ƘgFyXc1~`A㒙ծmw|ZŁ["(1"Ӽv[NJrgu7 .9眣=3_$xVKOE0|py @?Dak҇^$�'?4it])`5kuW nXa@|.F1FEWGJ瞫s*NsM_-[k'G#PkN<� � � � � � � �/Pka_ K@�@�@�@�@�@�@�@�@8\pEۂ]v%+dz5 @y L.=�-ѸV)<kR!Fk9S;"BnYr4r" "u?xdHdY<-z(Xس*Rƍ,9,aK_t!9!1]t)YguJd7o^gFGԷ'LeϜ0]kݺuIX]z葅8L!l4M\&Oϝ]kN:-{o%ת;sYG%KYx7E{+oݖ\7|0rcossQamu5o{_M֒w+'N<1!Z2eJ0r Q Ls GVO)BNڑWD$qYwo#~_ڤz񹵌Jֲ~o;I ʃuoFzEO;S:juosCwH, oHm92RGC�gz4bٵYhi^|}c :JqΓNg 'ȑ#տJ߈:( :th/8mڴn~8 !/u/ukuf+*(uǿP?9@�@�@�@� 5ہG� A`Tſ_\ӧָ#D|  � � � � � � � � �T\R;6xtSE(颋MxEY<Xs]wI.=H En.,Im۶|J1fZQ< sX{�-{`HVu\su,KA3pD9b%oq@AGmЉҽe˖jҤICd ,z80+4i\@SwxKޚ5ku9Ba8[njܸqRy099eTSN_sgER[,h-q쐶J:E!Z+kT4\CJ/v:2nr Aq~ٱaN>zcj6m㪧>%)gC >~S3?^:Dcvd^1�>㥏lTrho,}"t(]3p8İa%ﶯ컯>֖2gq&q^VqߙE[_z5wn ͝!-)U|ƍ7]d~يb[k C~Y;w}8Kv[\(?cwͳߘ[JV«"Z?~:gG\dan,@>F~I}'g曥FKYV x#) %G|bUjXі-_g/jN<� � � � � � � �/@V@�@�@�@�@�@�@�@�@�.쳊`x/~!#5o^M7B80;;PVזEQ<\"G³id7DTY[l!�] ^@-[ӧgZq`E䩋AP_Y9py$;aP{Ht�T` ctw{j0ze9pl֬Yu~80t6mnTj6C#.s:묓4jԨԻ@ ̉%CJw\D׋t=#hBPN8\ȁYdmSMzHo+F>V9݁[\sM<+N<D|o@u1K77ΧcTacNO}/ceiy(=hpwFu𘏛o_(Oq3K+rֽJ&| u;(>lO% x55|(?ao t=_W&t.tI|1V"+m[4W5_Xw7|*^wuܶlA{d6vz?Vv}at믿y8Hix yh �W8Ws_O1B2D1V"*Rkr 1 4(B/ɮT _ mynCC�@�@�@�@G,y��@�IDAT�@�@�@�RQ,@�@�@�@�@�@�@�@�@�*Uo^XsbRnIZUj0 RwRb vo?Rx@ddYs0.Y[80MvvU/* ,^Ng[FsNF} 0)HM2E"p/i~^$ :ue=0X9}͛WB.Ǘ&M,cEɃ-o bAy/'V{qߎﻷb SUijc?(8Zo\EQ :喊}fݔUZw}W_~?O8 g蠙5pyԿ#W},qjYE׊O}]Z}J7va`yd~̏޶5/2{tV[mU(6b9k(ֵ֍TaoM=H=µ|ߧs=LI*r1e5|,-ޏc%[3fL…jnq 4=",7lMw ~udJoyߙm];C^{M{==#]yĿq=8|yE^s@C EH4R= @a )aJ_,Zw|לZIC�jȑ b"5swݡڕD"Ӗ-l'E�@�@�@�@�@�@�@� PY � � � � � � � � �T@ih̘EZO=(j(+t챒kuN EƎ]ҀH{(]`Tū:/.,RwA#FޯgAԈhr Ao5so" ӡKbA*RV d8.kwo !Pr08P$cC4Ћ.]8{²0:Za DFNZŏ.Tt0:u*m[}>6K/Ո#C;821ġ+d`-KxҺ>8Xnt,sRCccYa[K>`в\~~E V}(enP謌TտֿJ}Ȑ{})" HwvRѪ~oqZ=A}ٱ5:nmРa{g[͚mN&[G^A{"V1]SÕ}i~u*#.}}EU;l{p,Yx7JlPZOաCl¸� P/'qw O(E�SZGY-+B̮VV:ʊ^n"P}" � � � � � � �5WjQs?{@�@�@�@�@�@�@�@�@�pϣػ ﲋ5ϳ‹WF!P!MǏOt.^zҎ;*[WbrQ_\=)PfRh[Q7@8ЪiӦY/bC("98 /P90Xr`Jwb W 2N,Y<^>vMY^m`*m]5wԨHwrO?㴭5tP 4(Bk*0sMHq_+nq{mʼ^ۿ:84ɷ:Jr0kW:ΒC <LSְa%sp)xu{+Or&>갩8;qp99ԵSK87B"l-&EVG 9<YAyydRe![+]EkSm&>މ� @)ON=u)\3NHJݻz#7@�"y�bmNoW_#pBP mj-ۇg@�@�@�@�@�@�@�@Ԫ<k� � � � � � � � � � <@SAw~S VY"P\ Ç?\>rt)ڭt5\_yFzd:i ԫW*z)sGUÏUB�Fax,ҷx�]kIr`֮7l0)"̒g4{ԸV>6uԔ6w\@5nܸ:OODZ>,vm߯ &L+ux-H$pF 7H(kJUWI+sO?l%:\u*xaV^#R}<u/-<p+t1z;w!;uX#xK|wtS>KӷN}\>O-P-ܗxwyw+/=Gn#� P>6yd_}%=` sΑk]fn @U!u meU,r@ #ŸjӦMH-S@e$ � � � � � � �T�Z͢@�@�@�@�@�@�@�@�@�@`&ONZ<"O(g�7\�+&u`w ѺNO=zHGB\ȝlYRxOK/ ȫ'^:"g@�(OO#Acɠ<4HtpmFzhvk׮E5*b^H_W_M!?lA! rQڵWҪL>]uU$Go]={5( &rHϷؿ:Xڷ:J2$T:Tr[O:fC)\ϗڷ7kb]kü+[N\ܹsŗ1>z7u?_},q~U߾fvoTh3g*o;`+?Ϙ{/Xԗ fܰp-GO>..7hhvP{Z^:fe� P|}[Z7K☺(\kQ,鍊n; qӼyTVZ}"FC�@�@�@�@�@�@�@�P@*g � � � � � � � � � |ua<@7Rިcv=}w_a?h r>zN<Q<XhWM|;8'W^Q3W.OEF­!� sƏ/eSlϙ3'[DݺuթS="AjGZ2%f=�_La͚I>r0Ѷۦk]#H|?o`:1>1POSvBxŸ BXۥ"tt <~B|D…ر)\{Uݻv9kyۻw/ĭdWF`y[IC3|LK/i ev@>.wY׊Jw`9ݡKvyHvpח_y=Vqhy/}}Џyߓ+=8Ddɧ__cK.֪Bϋ@�J xn_},\[W^8 H4{M@Z %>tru`j]r%:ߥ>?jٲ^ Z nLC�@�@�@�@�@�@�@�P o � � � � � � � � � P}ZzEZ.ҦJ{-]zi*"ݰaYgB,=t]wIӧK[n)uV rl~B怿1cRogK}Hmڔ~E�@`yEe,fYqI(Cխ[7dt1 Z޲xϗ^}uQC\={Jm'sL pC;Ol$]'Æ ³.Bjܸqv[ wlތ?F֙|ۡpC8(%Esÿ޽S/SO[5gH=z$k9ס%F3y<^Vs &nyЭGַg8%:Zµo߾d<s8.׬޶mYK[|ϕ~l޼Kwmxo{w?Χo{`<(Swׯw=]ZkIuROCZӦR&i N~ҸqµL}Ji ?�$P@K9ͰƁZW\qz-mU&M-myTzWIX8Iq3 @�@�@�@�@�@�@�JRe#� � � � � � � � � @V֡YyQgRݥwOA?&h N?ٳS ,u*s-8&= {t)He` @�G`A/L8qY3g䂥�?c�-O%|Tk\>4MD,Yn³6)Df*-}<իU=P9XDzG>XQ5grtA 'HɡR"G1 s}~Zni:޼>AhK=ֽ@-la[=zhM0!"*瓇k|\ W3>rS!<\tn//+to!cYhsk=~lia\vλC_>^_TyH?YMC:ȴ?7k {qX'#F:{~պuk)b'd-[}FC�@�@�@�@�@�@�@�Xo4U,@�@�@�@�@�@�@�@�@�@{o_Hڥ�Kӎ6@�pOE]hwAT,CQ {٤I}�M\[EVF -jհ/�HFp{キX?~|X5$<ohԩSY%b6z Z%g}u#4%=^]#dСY֫ͻx~^3jާ\+C*֊EΠvQ:4E` 2$ì֌ .._vҨQ;pmRv۬^z"@H^ݻw֗|n…8Hmy+h<yr[ڶm[2X&x^;P׀Z}ս1kk ~o1öY6m\̾V⩟g[Z P~ɩt]õN<1]G<X80Ǫz}Y>\SgI5AvɆ##)sϭMvZk&N-SV!� � � � � � � �U-@VU,@�@�@�@�@�@�@�@�@� G)@5u{"]\ �.{U嗩oqUFsѣ=HcǦb.zy)HkWy@HO�>@�U$ t=nmmgp* 2l<Vqnt)D+R9UR/,_Wm^U|7oM+֥-Z{m[N8Ah#RTnsY3L}ƌ-_k9,i RX)ς)Kǖ J묳Nwy% _fA9h+ Y `=eΝ;G {@qWuVug駋7]u0}CSؒ~>c�)K},׃ӟJ?q:4Hr_w\3�?wuM7E '1~d?0ƣ18-W믿2@�@�@�@�@�@�@�@�*6#� � � � � � � � � P.)<ZI ͧ*@`'�uk]g۶>b}zH9RryEw_7vMZsbz @`Epw}WNf… {uh"vHicX@|sgܟ{Nz-KrHvI]Σ20xjr8_uUM$?g.KΟ/~b{oڢSiਣ UӚ=4u_9%-[J'Er+5lXӄpPFq`r_9Xc<tS<+? 9LˡZNO~׮])$l%_c MWd6Uzҫw~Ǟݎ,7<A�z>n=`C_|tRõz5a @pߞ{֬=]wݥO<B 'N?*t!E2s$7AC�@�@�@�@�@�@�@�X@*�X< � � � � � � � � � uBz饗Rx8P}wiRV1l/ۀ@U ̙³0-u饩ȧ93><Gu6Hg) @Qŵ�},gZGfՎ;vp_~%}Xƚ)-uċ/sgIZӦ0ϭJK.IAZZk,~L?,҅Ύj'|r+՜tGMRs�xoE: !? 7(5`-<1?Wty(ς<PW/]CnCC<<vZ'YN_;V}ʔ)y8\c|ۢX@(H).҇ 'JZ"k-말Q:u/ P^ =&9kϗ6@<8]{bZ*A� ̚~ <i#G@ 1mf^~忐W � � � � � � � �,@V3{@�@�@�@�@�@�@�@�@�Q 4fL*\42nIֳ͛MTG6,M͓vE ֭+5b(w rf]ye*߶mu@<G5lLuHVO'No}־}Qn-Of㣏g=y!Yv~Ki6K5S|8)4fnw|W裏oMr@[dԸ`wN;-:J2DV(8ԧNUVRg( K[oB$?}o<@9 4[yGD={vmyD?䓒SuyV{ﰭ5DvԷݶs#6 /H*}yz�]WqW.ޛ4){<�CI3uj<Z)oРs9h {`A:]y?^"Uqk*l4㯿F^O+ϐmA�@�@�@�@�@�@�@X*O@�@�@�@�@�@�@�@�@�@\Y> :YQ< ܹW#PRw}С)D+e!ZrΖ-k nܹ O'ǻ6W߾ק_AH^�?nܸ;<+P-1x̓铅Y 6,f 3B>@rAM7MYg:U5/uq ވHPu?dG;$ժUp7l5w)j̤1-H$pB _߰r\VK睾3rtUy祰tkE],rgVhԨQ37/2<7ߌHM4){y:uԥKl瀭or᪩dž%-}op-~ؕlm&KM/ 9+_NZ6mxitݞLǕ <~#5g~Eq'Œ"[n0cko"@�@�@�@�@�@�@�(8 #c@�@�@�@�@�@�@�@�@�iӤGz( $ ׹J.(F[9R .54l4j\dȅ9bG7K&͜)5i(][G?f;zA�(L9sDwK²Jg͚5+ۨƍg N8#KФIpֺZ xNYC<=[cmOA4[oΣFJ}cwH~0`@|dZI m;SiI}QҐ!!k|luپZUG8|+~bY{H ,~!PYkV\%9;yȖLJZ%;) UޣGl#z x1{Y֢#ڎS+='n#�b >Sק1S߷/ck "H+#5kڢE.1 L@-_;r({k*n-Z@�@�@�@�@�@�@�@*wRf� � � � � � � � � @a ̛Z²*vX0F X ;D뮻 q~'xԦMu]]>K!Zk*`Fy9ts̓QY´#b * ĉKBƍ"xk…[]w,�aH{я~TЮ]UZ.oB`y|(<ZguS9I]<&!txykV\swT$$s=پ`X|r;HS|۶*[�AI' y R~2O麏|Sõ|yDg6-~05j޽{g}5,.O5~xh:tõʽ}KΎL]S~tG瞮oHmn~@`q/~Cr)PM_c( 4]>Ϫm`</B͟??[>_uQI/mc@�@�@�@�@�@�@�@*ϋE�@�@�@�@�@�@�@�@�@\_)z /ݥ==Wm7 +83C;o!Z#GJ3g /N6YW婧?9(m@:琕޽ϋ¥#�0@�W_}iy뭷𬯿:[֭[gN7`^%EV϶Vl)Dӏ>J ^uT8EmWm+"}1�<餓$gI-n5 umqShiIYl2Drm/,O>Iw){l 5#}3U-вeKv bѱcH&t[&M`-k%O7d.]dK͎PS'ɽt7(7W_֘1wKmw jdlm_ L8,3S4)]v!HI+ B]7^xj!5p3ГO>oBhss:< +$;w\VH!� � � � � � � @E ԭ0@�@�@�@�@�@�@�@�@�>'/ za7v]4(GQgFBv[ ;<O=TQ�oѻoV7-z[ �U*駟.gM81 B[v>YT8DYfU,8XxhY='͚*B:OLa<.p5ǥ^ҥ^ۣ}ǎu%?6lXիV-=C<Z^ón%{p"GU+W�+о".3Q$kEOAܹ�6Uuz뭗~-1uT9t8.~th.ğk9`k7z'7Ѫ3yw?EZyM7I矟>-t-d\$-XR];SRI6^>\:h)=7JzG 8m{-a؎͊h_k9� � � � � � � �T@*^>G�@�@�@�@�@�@�@�@�@� pa'\H ߞ{"kWJ0kDqӊoxB:Tr?ࢼъ\�2O&um?`E]x6o<1[y#�Tq0a|,x rṭ5nX=zN;픅~ݵ+Dy+ r~w~4uJĢ.\/ zǵGQTԦR_!O;M0@:(i VA;;Har̠A)`kWfμ!ЪU+΋̙3o{裏m5i$ dMޫW7mtp cD>Lze)=~:=ۭ[6H{k{"�CK}4iHEXt>v=Z\5W^Q3{yTqG˝׬񠍶B{k V赼@�@�@�@�@�@�@�H*Ry#� � � � � � � � � PqJgy\Sx #V%CFrQpujϦɓ6>[:iu VfW\!R?c䓥v햾' "A�X- hY Z_9Q#Z,~%!Z~@U SBy'eE΅vA: Z|_䀒K?p* ̚%st})/זNw R~kJϝy$kQ(ۙ@! 80˅,_![zI6lXIlΝ馛ƵͲ;җtR5bnÑ<e)`kh %ԫBӐlu횿) 5o.w\ϨQåSON<1%ڶ]11ys駯{xT/Gw^Uk?Meכ{Y[o>8v´;w|CC�@�@�@�@�@�@�@�Z@X> � � � � � � � � @p BL(@˅?<c/IAZ Y>j\r\Suby%ۤ?\R,R,E/]sԬthKywϞ=[_|N9uq/Y@� 8w- ʃމ"ԬU O~p )\]^PW_]<@c N:;(mZk'03_2dH?ա[oUvF[a#% ZzR|WMM]c iSVcZ!P,M6qY/M}^{cjС袋m\^;[h-zWJUmڤqڤ矗3l*7qg|̪;8P([]JY"{(Z)IRI%Tڴjd)BIj5K%~әwܙwy{Yٞe|bT(l&v{޽ua۞ }n 8HA4ңGigjw" aԩ5ׄY)54C`i@M7`4Z)yrAƚ1VID@D@D@D@D@D@D@D@D@D@D@D@D@D@D@rZ9|{$@ 1 'xA#%o''b…f̀;ZkGE` ݻ\/o^୷n𶲸֮ٛN: `v�@a(?p�xqǼr22/"IO<quD@D@%@q֪U|5kF|p'ڵYYU zĢE^�q?wD /-xJ  6NؿEزe ~i9"ݻwob'|S8* $-[z};&jNԬ y(`ª8lozLQر0vnN!%ȕNԶmۤkJ7͜9O={,Ygy&('ʺb'ĺ^_' Osr-_EA@b(R͛>({`#O M!)[=,'i� K)ڭU+j!"(㴮=?ym�6xਝ5{3dc_)"jEI+d v!" " " " " " " " " " " " " " " " " " Fd<$^<e�՚5 .X3f3gr|`�uJx[ 0aA/)b`\`޵ $fhAV8CYX@tٲeIիWGqI!OrEZŴF^:V ߭@س'Km+z6}d<y4 zLoXҥKN\wu0$P)�f_QC[z&M=1�[J#g18Q,>.)xaJOvZcc@34jM~iA×VYh7{&uMӼysԝ2e3F tY4`Wu+[7oY3z5ɔD@@B@N6.d~s~7&H־}ƍ8"S$vWLD@b)޻N,_NC`4gtR+W%JFv Z qu" " " " " " " " " " " " " " "$ԊӤB zӧ'?3U`y '+z,f=&9|;?(K-Qx1u'zeXdRcּk= \uvimuC3�6lYpb�rʨU:w4PjՐ?~$vܹ�ZX.['T)&BKk>cxol/r={p0=qQ,<<6೅b#LA4r- y8db-N ,e.f 2JJ֎;0Kͳz\{%ǟh۶Ճb\'`M0kyF/_~gy\ZT#T E@M]4yeY'4 uh8H௿3Խ׆~@@l0<jʞmGÕW^߂L|cxmV"&\4V1.(" " " " " " " " " " " " " " "YWY@v8p�݋?M- cjs:x`'mNg2s#dN,[ CSN-ZRI @<i<a X)Ӷm^�Ms`LOiPp9?N~'Yyucz+0xp4u`<$p@*�@Æ\Jc^z%<=Z." V;._I?YBpH S2͛=zsSO N@2|* _aE}H믿F: H<y)J|hCR M@&0i/P^@Rt ԯp.&Nf.SH%�իGwMb@tM,+k͚5˽K7#]%+½c<EVdC3$oG 4npn] <bW�#Z^HO&JI嗽o*\s9ql,cs?r,;kwdؔU_i… 'asLD -}[\xaZk&r-9V>}zԄZ˖-sy&-Z)@NP+π/" " " " " " " " " " " " " " " " " A~( v܉ݻwc׮]9سgS}}K Fq�`܊qBK-p̂ |˽( Ⲵ1QGŋtXϣ-$cQK*CM7GÂ+dN24j0(^@^^`<<A@wls� Bi>B 3 ^]BR_Jq`DBA`AR_7wu(k"Y]눀@\`?9,~|&ۯY&8 \uU]ͺY}>_T_<O<܉tIʸo>+&Q}v/Xl*EoD5[ef(3nF[5'<AXk?PM3+@`_x۶mSOaڵ:u*&L޹˗_ʵjժhxx:˛(_ԓ˲~#my&h{7qAID qp<ц<m81s)��@�IDATe {_?ҥeTXvl X6'eHVDǂ9v_isڟ"|<n?9<틽I X&8<g]dɒn%G8w,<6yf8hEv0df^uŊJ30&iE"0 uu" " " " " " " " " " " " " " " " " MAvXt~ [nݴm67?sR1 N �[~0-~2VrPZ5910 :O <ˉA(b@2U޽{]5Zn*?�Y$v?pc n2Uҥ]P2=dSٲeqqǹp)7Oo296 #`[℀X- J#bHyLz5p)uH=_ u3eE7nP`̡" 1B]Y'LR�]gVI'ТHkh&�5N=5vbox-+?{9'bgϞ[QE,;&yOYϸCIcG{w`pOjp�0XƼ|;xMaaQKnݼ YT e+1M̰iʕ&~<R׉.i#(sX}؛g<'�{/)xٞ\UXUb`#aۚWsӸ:%|L)X?O 8q 6ql_q,*;?)ǯX?OˉcDzǯSec͛70qH˦+8QV¬iJr)DZwesL+)SΝa+{VB~Vs֬Yvڙ'6,јxE@D@D@D@D@D@D@D@D@D@D@D@D@D@D@@l5Yr`cӦMnڸqd@,?ߌXoʟ??%N+VD]P, ,A0}2%`ČmΝI"3fęky'g@?*THN8p+)=^ ˠ "ZajF]ֱx-[Y`g5o@I? _�-շg#�{{-.fwaO E]ID@�ߛQ¬˗' خ`PbQgQ"`=bE[&kzYlOҷ/м9] Xs9):T}pY) x'k || 7>/}|!J2oPzc&F$2z{ӳz2 7."Xk֗G{X$Pzu'СC]?رck낒Xd+eC:D#~ɵfZw&d#P9D@I`ܸeZ ֝&Mچ.]c׮Ux[s,,(mdz9]dƲ)Jt8QDmڵ+/05*KyCsqlNdzlO5'E+V�/˥̹x≮o|ƌjQ`i+EN眒4 r h" " " " " " " " " " " " " " " " " 1MG085kvZ>8hAիg;:LDIRE<[�r "Oϙ3X$˲e˂)31jTK Fb`uiNkM-"3D~i{ڴҚ) iA!>-zT騣% (Cri_ |UWE}Y\D!{QIqVĶjժNիW/YV-WT }O?&-6W14n͓~:L\ vK郄Z’/ <X/Tjգc| )ԩHcGe{0-'`lM >oAP5hpM@\Kx/ F}͚5ss=iӦY?(]ҥK+rJ]I'mM_d+̙4z4Ly'עdAtAbºu윃CX fklO䓋$f5DZ˕+~sE){]*8I'ǵ)G۴i.\hINK򛽜r-_UTI'd{"E"٭։"ɓa:mlsUVڵ;#'|2Sǵdw,X0S$dvu" " " " " " " " " " " " " " "׳-%" " " " " " " " " " " " " " " " " Y@`ǎXr%UYlƍ&W(bʕ+ .pAxQQTbŊn u$ @BYٲmï<yA|`yLb]K coE2I/1)DYrpbŊUCQZ571(G</@ְw'`hosZ1"�]ti2qQ6eY^xa8K8q*B P07޻~7|&s�hթҷ;W)<}t<cvvֶ `ʔ)[nl6fDK:w.?Ԙ:<ʳƌv#<VL4ƺԌb}wZ}ڴ. hzttx"�TW7mذ_ŰaÜpkq-i䎫F_fă|g'xɆD@�ǪיIk0xf&q6;mo/_Ʋ+%ɓ|Dz)ʗ;)\EMIcS8&*<x7oN61+Vmے6uQjd\PB:]ju~"sko 9;n,6e=Goj;}̴@P+k*W%` w%ٕH".hG]uU;%ZUT1(:c ;  ZKl2O&iaAvaӦص@,YE lZܕ1AQ&[(`Bx衄Ga�3NK A)b7)b;w㛜H4A=NPo= l`=ß6m>s,\0z*'/f \lYR[9ٳ=C{5$ߍV}|5@y֧exC=PE)Rl`{kرx'\=m۶v |n W @Δdn PԤ }tt n>>kpa[7o~?RO`kl P:$FbŊLtzfΜQFW^ҳgO5I%WG]xtjOe�] !۵ăgj$:8+;wķ~ŋ'AQ~wL^slqʳ(TTf\Rw^YƍuǺxMFݻ&ŋwXש NGuTjYj^̋ga7HβV1cn S#'YZzu" " " " " " " " " " " " " " "[u>T(`g-ZZrɋv�f͚`h~rPBKfnJy˗ Gݪח矆O?gy&ׯ˧Fo]9A7Zj1b6nҥK;V"ߌH<}{%C .=#3600X1n hD.,͠'TDskR;yZwyG>&UQ3ZL^3<c]rL<2˔?zQr�Yc�]}xr#=9I+wmqa~ 7[oR<ZdVРuqI o޼hݺv؁_~ٽz)>7p+zJ)�}:z}f(gɒu4"(86oƍeoڴڵkĵ5$eSt$!PH'Ǣ +ebƹ\*Д?^zn3@ѢESf!Xw+{}i!Vl#X[3#Ԣ8nԩ#$@ρ4CN_D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D jlق? dy1 A(κ;]S,z`|oe$(\y='(m.X޴i0l0PS"7h�7vA(ɟ? ]wB>HO JuU0vX'&4iR\_/*@`pիW'gQ~zN.eYlO01$/К3D{~ͷͽY} P+!ɟbX 6FO:2;+e7@睗}ԞBgG�~7&IFK7MЍɵ^xT R$e}i-q4h?;ڽQ }W_mR%YbE4Z8\obޚ&[ڐ6Zٯrs_|񅓽MʕA1_u뺱l= #p:sGPsٔ=غu+(nF%eS:muDaT5?٫W/-[?_)}:$Vim,"?"VD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D l޼| fϞm縠Gy$N;4'0`�<LTR% =@&PdɾK'c A)jѢ}nKsMIۀ aANy?q=UVnMD !lذ(Ġ=(բ]dx_u' H(OakXhU{̉f5>|+e/~0qD'ϺлwouQ! RD ڵ+r-> <pGmFs<kkWOO4b'h.zJ;%Kqa OEVۧrx /_>\pnZj^0܃>W\qnԨQ#Ee k[[v={3=yRsO?85n fpGL�Zl_cٔho&]=ɇzŮ~N62r¿i˖-ꫯ_io۽{X36k,i,}JMq8hDB>(uɶ\}EqHzrg;AID@D@D@D@D@D@D@D@D@D@D@D@D@D@D@rZ9} 8p>Xz آ133qN8qZQb@ѢE5O@̛7ςj9L…uhӦM tgY@ cÇ3uFL2;ܳ/+GD_u¬%fKgatpK'¬va{jՐ?܄A"ZsZg @+e (�YHu+K.$"3ܹ3{ |'XB)t�4itt(R #ܹk~'rࢋc*dˇ[C=h^~ePfp뭷e˖U'+= EwNz (UEҥˡP*v+1L`۶mDZ)x;7o[M6yPD 2<8QD c?37=dwpγzvbV'O5J(]]P-M*jQ m[СCjCD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@rZ9_H�2o*fΜA\�#Pi@ŊrFuV0 ?ׯ ǠR;wX;7\:h{faahQ/Jpnr[o" L௿$Z6mrX>h'˪k=zVZw1F.U!@"ʕcH%`o M{ NqFzRɒ%]lu3N`\9;yhˬ%@y֘1@׮@>@͚ȑ@Y_>X>D{ 7x[Ѯ&ӗx&PH\wu3f'DV\[[nqc3*n|FPKW{bFdZ2RUD a Xo쯿ڄ9ТE 7nGa*U<o6N?t7|&g 8DZwWXq*THHj?r5(|HPJ'?oҏM[dERD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D s~wt7p cW_}[F3m-@9ݽ{w71(w}ӧcڴi6l\bf N;8j1qT8 oYFٲ Yw5;P" 1O`˖-.�+Y82-J4Aj\믿uq) k̟@0-EO>((΢0$VZ)!QQ ~iڭ[73JAa׮]Td�Z5͛I`&Mօ b�S ߀^MIX&J҈@cFfJ~g(ٺ;L~nhYwb+SN-i6w`!wo NNxE@.VU k׮+Wjժ&'x7F|bS�zn6ڏٳgG}7t6lƱ/ w2eSح[>:àm۶}݇ȱ/_(ӪFСCcD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@bZpTG`ܹ9r$&OB sxТE qI#dfqi&L4 'NE45k5\c{γ;n_n" 5駀y/o6u] uPb}`8E-˗w,Ӽ۝82-JD  7嗞<?6*q'Jy (ߙ < ^|E'$իnTT)µ1X) ,^ OhY/!:3Ɠg#<Vt\MxqX7mɵ^x8dޛ2vd)uڳl y>i( `[oqWElYع={LրMʵ.(W.ʮ҈@fP17ʉ?w5LyW^=3Yk[Hvڹ)`…6lhӦ{Md'ĩAq(U5GZ"wj3}RfKL-" " " " " " " " " " " " " " "+JAT$ <Ơcg{,J)<5 ZL+1/ u& TP[`֮].]駟\w&O6bFaǠA ^\~4?x7tS4U^" 9LAS׭[wyϻv튪U⨣Bѿ|8餓pbΜ9T3f@]vjI'SV/6$pY0P4^ƎʕQYA3uJߛe^1m݆f>|xeZ,aɒ%3::U.&p @ÆҲX$СL wб#LxXo';sW޻\[5^~֟@ PCaÆ {0~xxN~+J GX1P`矁$Z|vRK\eK¡"b zoqBx> %E'[mcچNYfY1KQbEK)RnI&եy5 NͰb :I)}+@N_0E@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D A 3ǰa, 뮻\�}Kb@Ν;CAag wҊI맟~©m+FreN;eQ(`psdIlgȑNSP,ه2zc1_=4iDyUTqu^{ t%`ĉXz.\w͛Y_ZAb�Z?8Ю'j�x)}7W Ponj'4]Hj矹Xr ͛g➎Nb>w\<X~= %JDX̋C'@Y{\) P8f 0mG@͚qx Zdsg{S7- |�&(vrĮ9rjЭ[7'I8 :`G]w]Dk\kd6T�4nc(Ux vZ\y&Ҭ>̵8F1i2@\\sα7=p@׾l /q*gpEp ílEqP& DD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@Z[�b {M�(Һ,E!U2y ,Xd >h4lЂ\vqO3cߙ%E NdiQq-@2ynxٳg3S" YN :%y^x8QX14j :H:ucaNfL2ŵ m\SD$`/(4J<&yXض 0Z5wP.3ݦMbΝ7 T.T M-a×iN|X8<Yߣ{w|C"#<%w[z 6m<aʕLHǞHV2xmWsm/ 5V9;u^Hĺ @ :ɖUS x+Ŧ)9Nm}㏱*ݻw{J" YGիW^sLj}DEc}1^{!ޜ[jeC&6+u}`UÔ6gMkd Ӭ\E@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@R!tR';0dJD ԬYoZ0�Y50tP*#jF@P|y2=Vu23s|AJ" 1E`/1j(xNBY'Ź;wƘ1c\y 'rYv-~7̛7ςf{-Z4K @A߫]. ԭ O::`MilL\=PzN2Y@ XK.`p׮]QlY|nd6 "\D }ġ'>)1O%N?=a9W1Kiu`\}ȹk=ka}@^Һ٬2~5WJ`nݺo|ɔ{?~u#XI%IU0hP:F$qm#%,={6fΜf͚^AU"؇qo+W_}L5%UD&yB…cDURJ3~qWRD$J?;m!" " " " " " " " " " " " " " "}jErH~.EZ#NY=+o I'ɴe'Th׮LY>Sb=8Ҟ={,8hٲ%Zn~gf=SR{M7mڔ<u W;Ц;c>ӽm47<|l= pu�gE^z&1Hi RJ])qM`֭.(#<K/ԉ8:(W_> Κ5k0yds=ȅ5`>P1r$~I<ʝw�?-V0~& Z`OaB][gECHky sɂ;w '[n-Z�O:guV%ZL,Kc߉ {„ ػw[hҤDF}CϜl<t+obfg F/;[#]vH5-juB=Iz';M^TZ? G:H-J=g͚67nlϸ0wܸsǓO>z qg;4SIwq\7<ָq@B^^GoPаaì}y+T玄&(4cxj5m4MN X_[RwieHcΒx?X=ߟrlMi8߯[m۶8p`ڽVTv9s`\,Ԭ ~X>WP+kw" " " " " " " " " " " " " " " a Hd�P*2h k;v,@˙[ۧ�ƍ1zhі2\)7oތ3f8Sfqxx\V ˨-Krǿ hNĒ%K\'$c(?8Q Ό:ZhѢ.@ŋAwuÝ{߾};(Be"inx `rr@yKv?2Iچ r\V9\BcŊ.H*R�ZLwqhӦo֥K] `K&ٻ5rP|HDk'I)_8OAahk0}7nh6(:p� ><'i-OZ1}a-i >^{k1®1Ȳ1,Ym] J)DjժNH_e_p0>�6osz؊>͛;a넚ojgcI�⣏<" {~ruŧz*CEm�J0=xu`6OFmݱhXѓg^!d(@<nҥr7]}%Z1oW'`}>=( <x0ԩd<NQ6wpJwqž,ٯ "L\v@Ə`O01}OI 54j(w=nS敨Y}J De㎥.7x]h5kdpmdIEfbJ*r{ ?il (zn . I֝{\:G0jI";?ӭ[zDǖ3)o^@m$" " " " " " " " " " " " " " "U Tf" " " " " " " " " " " " " " " " " ) P,2n8̝;ݺuKX@|p5נZjh&9עRijРHWޕW^SO=5:Zc|AWF0d-RG邈R,Ӊ{ x.ᇰEO/w ٰa&Nk C׮@ri~Y{󙟴7Z}`m"9Kb?/ԯ_߉j֬ f?gϞmشi cС - Q{MV%v0Ыpt-0(2w<>cR1X2Z|Q*<v:_O>'15|6K@$_NV@lWsהK..'Oco73FNryJ!fۆXLC8<{_ds1&޻Rp4KBp>)Ŋ{{~sѢ{w`4q0z4L[6#eMAJDrbX=�[ mO?'N4 L4 ={t-ο+0o< 3IbD0fxX໑Mn}j &5l2FhgPmp_y`fN <bسr+8CZM�b;6);,)K„ ]: ƃu#8wgT#Yn'6C-_vr*ڴR~8Z* FZn{)@,/ȭ$ʭgV%" " " " " " " " " " " " " " " " 1@7pA|@Ab�E;'e |IiESͼ+1P,X .njҥvmpԨQ`@Ν;㯿JuߺS3ug4dxiYP쪨P?+>#*4~5p iSNua\KT]ve 뙟ޣ8һ,'uV'ͤȄSN9,&M0d_|~-(bs9j"̗kAJ]la`@`1=�0nl6?Ӥd'_<eb{c>4ۚ5kL2}2w|1 O<N|>J*~wC \_pa)S&M0[>eJr\^{0)79s&֯_z6嚗v˜1i9LHf91ԩ+)8n[ĂlzRM bxT9Snb裏vm![{m޼58x 5jd[% ]Ԟ[\zضm<laM<L,Yoa/i'z'HbC8w.`N 'Ӳ [ŏ?&_RLuGui\!S{hѢiI c]"9h3WV_ nǻήTkg1k,'{s(aM0Wմ0o(?D>3h"(^\|J" " " " " " " " " " " " " " " "h" " " " " " " " " " " " " " " " " �^z4h +Gi&' Zh VbE<سg [o't]w݅:u$Aه3#Bx ~Jd`' ʖ-O$_~g `uW& ҳ9- /X ŏ}QwHzزej*.$j?s XGQ޽{qK.IN?v؁W_}\2Zc=6is/~w~ηRz7 oUV)1$ @k0@{p[w_Ӻ#9 NH4R3y߾}*e k׮u>N駟зo_'3qھ}˓uŋDsEz 4e˜H~`>mSP!J*&NuI{7j/w7K;v{'e/"! W0R uu+?91@X ^P\Ƶh+-`:X嫵g3TJkya>l#߂>2ιSg`c֯vYAYŋq''}<7vOZI_0w9*ᅫ, )a]Vi*o|xOgu36aNnB6$A٧Jyfa<yk۶ٳ̿39iNX?46DTt"8RM1µC=/ի+V² E (bx`<Pٌ3\?$ #`~1<Sf0LI|7f~JN)sr>(f}"3gFw}7.]^O)#. J9Y< +>=/cNԮ!>g8%'VdcB'"޽{{ϰO{&p}aXHy{og_N:Tg0aBƲ7nNM3OItFRZuan=9Pjպuk\|vڱ RLRh׮]9F /R9l^ƱdNbB}X+Y|7 BBGw9-Y_6 c%  epڬyn!j�N `PQ35m4p,`ccqMΌr h [έ7o޼HGXa, [n;mg^xaH۷wDi |灳>cӵ/,\D_,0˧p‘%iP,WK.O>$;PdI7$UgLNֱ}-~_(3��@�IDATw,sz|9v,`AIܹ3Pv�dɒ�ϩO?)=o[n3ynSO=l#hw>cb5*޽{O=֚-OL<xc1`BJ7#<H9:2}~&r{'=z}?I fL0{0!C$c"@%& X0 0h-O]@*Xox$CY?e}+pٳ;\4KD |͜~{ P~ `u7Lk$9ix\KgC.oaÆ?xW?aT\dWz]IrJWz~z AW@^=o!&Hf{ELֻwSMZ@7)M~ gʕcX?yW˗5j䮳;.PV�c{cE"8 e@O@X=֯^ pP�IGZmj$IyC=/Ǐ8c5띉|NxܸLc_9S>.׏1}+۱W^yeXLkoJJ*nn9Gܼ'߼Kd]K.    t ~;`te+VNy HO&pK:m҂±-[pHDzM:0k^V*|V1 p+Zc١gt,c|Ǎ/o m+ӓ"?c导J&tߦ)Աrym$|_q:HuL0{n@NX,ӆ }0k֬зo�C)cX%sJ.;ޒ }#6` qT`UD@�íp|`ΜC7lJ" " " " " " " " " " " " " " " " " % VhrVU^= 9eСI{o׮]w_X&ͻ6}]w~7%U_wG閟(`Ν;z1ji._SZxNoC˒^VZ8s 6teOHMEy˾gv~2 `O\s+'. 3"#畞OYcPgl[w„ .+'ߺy=+gpJ>SbYN~$; -_f3)?СCg28o]؍7&m`<7#Fp� Sȉg 2O~9rYYs<sw;wnɻ>ig(mcTtcNKNנA�5^zV8k>,`2怉vyqSv?<;Җa 0p4׉6o\I<0`m=\ t|RpjGRͯ둔"TZhVIz뭤U(xÇP/tI+K;3\mڴqB$e(?l8 39<_{ͫ|pB 5Us} #6e-V y fm߾ٻ~ldZo6V^/\A$nG8rI'.1;ż83|[R6k7t%駟L)3˖sȚ & t-&ѧ~qS)m5j}ik{Oies Y\OѪEފd_O9XZy̬;,8p i,e~>PiYȬ`BpjfT|nvc ՗܆{3 V)8""[VbFE,c-鍥Z<w%R41󞟣^$t(l*Q,D@D@D@D@D@D@D@D@D@D@Zَ\; P+yD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D !X'd  ǏO:v ׭[7ie'[a~�x饗|oOSP!$ͳl01,qҼp_~wL:'OrS߾}QJm־x|&9眓;nSvmX௤y|IHoWI?;v/_<i~_,YҪjr,p%LJ6m  xe˖enckPN<C,}f@Zק`ǭ3s'x.}5m[tCg®]'{&{ u z[ fX@fXwݻF& >M R=|x^z)~GXL7n{lH^{[,Xiw#0m44n7p"}3qXu O<L #M:c׭[v&+\//G9qHE k`0ukcf̀W_7_6oVk@׮@R߯rOHsl^uU7w 3<~G�BD"`=eL>j5OA`Lbo+^*=>+{;uꄼy1?�Mc=G@͚S~o޼yP~f\3YebRh =z�~=uJk.#0e??}C=/{|5vO19-;.^kODҏq.w_+Wgĉ]СCar>ZksxbWVo<Hc<vZaIVwy]=?֯"WxY`'r2e2Ziu:)f_;>Sl=-V$uheŏ C!,\*eA0qDgz 5o'={)+( [lm+Wƍa\.RF{:DV�P3Q& CID@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D 9@L$h͚5c| E@ٲe1b|xw–bŊ.03ϟ.`ԨQhӦM zj]w݅M~ce ,*& NdހaKoeJ^C~nee^OM44h|X8s֬Y4iRg9"$RI'%! OnCWHٳ֋tY3~7|33;&ʬ'cQ~203'tcg>}Q4jȉ"XĠFb.6U&` .P޿?2,H c1�$fa%h=(c0qvml'bիc*d+6([ %K2{˓i=4vݚ&?>[ܚ(PlkRJ)f_N3˱S3}R29 `uPXx{l2% 2.d{`}fUOڵs@>B]|)sxh0O{&TpAQ 6x%*Ξ3gWx\"WiaDɱߗ3g>I?Frooaf=餓\XLY&8DQ*jժ,Y `}ɆLI )2OE.}־>c-~ .P+þ Dv=)Dz˔))hѢVZMgV}Es,;~!ql"x\#e/B&MWN]1aq.]>c-r4R&o(~T>J̿mJ" " " " " " " " " " " " " " " " qO@B?:�M .`Ç2wÆ xb\veسgJ`8T!(buָk\H;… 2۷۷oO9;t?Tgf$:S>5ԺT0(͛aÆd1(5ӱ낡udXy>(ΠP裏NVX@TcƌW_}Xt$]3t;]CW_=ígnk(LsLs 2QTV:A&8ɓ'#tHes ̆<h= :-1СC]`c-]z믿гgO .n۶mn|^x!N<9D␀y ı�Eý2(0PVѻ7qxȾHܔض~7Mv(ݻ=-[!ގv h̀JO%$߆> lś ?rW `[gL|N>=gbY߽cHKp*U@T{ILpA~[,ff,糕x�=z�E ?.#6x[VH#e۵&BsRSܡj=ڢx{Zw86buL f@y�rIZ{&~Dv0p d0ߌHzܵEq#LRX(TDe٭[7^={Ϫ6f[ˎ_z+V-863d1ӼyܧO1<֦MbBxc;ۿ(<cK e9zٝZʟf!؋@#E O>aÆa1QD3 2e`ܸqx嗝,YO>-k׮dL#@35iF3Uh |(bN$թSǭFqSpb-敞? #'ʫ(4a"'ɾNJ 2խ[g%BBkЭO>1c;5)ؠ% 38[߾}+Ðko rhp= @HQF;@]d?%'!C${Oϟ?(+˦~&`) .�~ L`Znpb$,Y3~),<9CбcGN-[,Xd(àu;I0rW)Xtx#.SVߵj1#Z*ʱ{9ƥ䛢ąv!^g_U.JIttbb(Y*L.Yn`%:SNh}[ *N>Ժ:t�/;ϓX!=(ƣR`Ɯֆ�L3� 9 lYqpA~["~ ֭[sή]}4CJF?FZ唊<3XrCtƍ]*Vbl)y3u<sĈNgEPvX)zBêL&b'$?z2ʳ[ SzRdγJ+"#( l^olٲ%FcXvDZo[oscX6eLmڴqA.C\p^+gRK|1?/(`1hР'OOZ$+-`_GÆ M4o_ׯ_VTɟO^ʱM-)$XS*%CeWl)O,!"!RJ )["TVQwt:e朙9朙su}Hc3 � � � � � � � � /E$0ӓ|u!'~yYرcï^`̋>:scZ^{{&k^Hn/Nޖ-[7ݻwjѢʚ5kn7l0bsb 6yPPj9rL"/}w⟛O< yHĈ#4w\zH˭/wgW^yE^~mxEYhQx,~O׽BRI|'aZԡCps'ٟ+g~ys=r%>||C9%~sZgldooٿB<A[i{6]ݺuSJBXo>z)뮻ZdI/}<HCv}a>^1KHƷ=<Û1u Ä^Hݷ55 yGC`gK"~yW#!@<w8Y1(2쬈D:묨xUHTFs/9$O|ye:7Nt⅞!͏s6u|S7|RKBﳬͯ)xX_ʭyxҥK{sϥ_ƲK}vM0! aq4?nk)_Chn{t]iY]sKɲE";M9]_gF}_5�}ӦM63;uM]#RJcl=i;FՇzhKqQXx4h'xBkOy}0X?A7@Bj ߙϴ}vPv GqWa 1ڵkCP YlyL_1z1Yf%8-/sǎ&r,;7M3un ~)ف{b~Z|{61ś?V+c??/ζwy'۬ZJzkXnܼ{yh"Y)|~ZV*.77<~nJC�@�@�@�@�@�@�@��4@�@�@�@�@�@�@�@�(ŬX^N,)v'SV)֫WXŊcPgϏYa؞{tQG.袘:XYXlYQXcV+fž/fܸqw1fEcV'6mڴ{PB즛nvmgbVP,kٲe̊_n?XqyŬ0g޷5a򺬙3g,,̣L21 nx1+R[bEnXy~^|ՊׯnŬn̊[Ś7omEbV/f{c%cV+YIJ?o.]6x̂¬\+bp@jժ۷o̷WoY0a.ۊo9,%)/p\̊f̘م{Ï1ϹUY _TL󝽛իna{z뭷wnjA 1+wc|qd?z1 h.? o,O?aY1+{+\m~B4bnxnsO+ 7;b|cL?? &Ĭ(lt W;=Xqcv>sXKb_~-Wi_|k9h眾f!1 q/^k~=fb!C6~I?R5> 6 ϥ~v`iVpԏ}[ku.,l~Yhqli,]_&{XM.ž.ugn~:5ܮ v9-T;\i~7ZwpocrJ^kl~l50,b#1Yಔ0b!a ķ)c&?.p'G;OΊ q^.?1"VNtnJ;Qw,XXƲ}c0 |ͶM Ib 6 d8Nmy]VƲsi켌e[@Y|u{~>M^5,:t)faiܹۺ/b 6UW]"6 xu?;S-;%9I6B.uC|f ]߹Ͽ[oP>D+ǝ"� � � � �Nl|p`j@�p|C%c � � � � � � � �@Oȓ *ԩ5=^z"I߯K/T2[m]RL}�'Y11Yq4YKYwqz饗dE1eU~?a͚5򛅄|$V JVMVJ*U*-C[mUX/+jժk^YXX0.\P% q? ۆd}*)?v駟~ 6f]H{+V++>V._y]>yu|76I#|7T,;KI] *d!~Љ} `ߝŊw}}_fE>4O;+~Xz|?l!9Ns_d!:ujÌ,$S:([PiwLJo!4yd_v$~xtkZ=H73gNNarea>¿M2E ?/ NsIf*/pƯ=do4 u$':v~Avm*絩],UV ?h7Nv'Z!CmK,E^qCV=6mdũMux7u:|n=~M'>k>dj&.ݿ/_^|- WudxXhKεj*$Os| =4zlO:dkWU7o^kРWWl$׀-H~^sw^#o4<D^Dz}}f�]$ov,{s~3e,ǔ8;ΰI\XlfϞ5j Y_uxi<̂]RbgT /Prʔ)OTco??Ű`Ju-c: >>C޽7X/gAks ,Y$ZZhQ0UƷk[.Z _,@�@�@�@�@6 d @l8%d/-OVf  � � � � � � � @ ?pjѷo_+&Ce˖Lx1i;\38cs/K^h }ּĉs{IҞKE+wK{5誫*P2>^wm+/?Y~?_Fb5lPcƌI'Ix I0ӧo5|yA]v%f!Z~Sj:nj(<DӐ܅GΊhYMaZ ZjT/ q`'[[FteYSt7,q!Ջ} 'p W6=n){ᯛgJR>ңJ:Ȃפm-Ik\K[>(M$۷BBdaPG }<l <Xuѝwi KC' <dCu7-[<|.5k,ָ$e3TM0 s[˧~Z_~y2xBl63HfHzKkqY[Z_zg> P+X ~)N '/G�@�@�@�@�H Rm @S/JJ49v@�@�@�@�@�@�@�@�@ ׯ)SXaCa+Ҋwv[lQ}g!ժUKJ*W,_5k(vj}uq*Td>f7 3gSO=?^s-`=yzϷjoh}Ouۧ0-`Uh׮]+/HXC8z덟B 67{l}ᇚ:ujUЬvڭy <&F� ,\O֛oJ1Բd9!DjJ@y@lKZ`f׺tvb-EO yTwq͛c9Fo7o^HEm,~\W@Tps/<<pxi;ұcG]wuܾnݺ8zA2eᕼ$<<kHӤ%D|:ޯ{IS6A8 e3ΈnvcCRҵJ.)rH◛9^Z/r84%uӾ[RWsBp<di~|8j dDَ<Hm6\΃_5#=t-+tRJ稩О{pm5}ay>[m۶jmiޭZ ?9^Ifi^=o ׄ<Cr/M9i|$ xxW_!^8 Kg � � � � � � � �E%P(VT c9 � � � � � � � �dVqgѺu~ZZ7/x}ɺ\2,kݭy睧,s9G?x(<{N: Aʋ{z:[D.w @>ߖ7 kԴ?+Oo1-w]v/ xK?XV ae~רQpkذaBmoc�f'N&L Ο/++vXeQuAJҥKCf^݃=(zx϶!y!$xaw,hkB=&/m(T07?cD][mU"f<RLԧ,�PA4H[,Q '/%z/g?] x@9ShkyVŊ9OG|K.! <Iy` B]W_>oW^ymׅ߰=K/}|þKd!:]FғOJCȂդ+}sefaM>v49>_͞x 5h@\pڵk'?,XvQbŋ}ya7պ .%TRQ-d.O? Lv;VVp^s22~ɒ%Vz-h"W7?/rr� � � � � �^h2c �Ix㓸 5ZJ � � � � � � � �E'@VW^m\]wݥV=cg;Nʕ+8+Vl-hd_~? {%dd2o"d:KVZ!i!+^ )<ď+o?yhX{/R4(:/B>y?Z)U* ,Zl$ *^$.ppbذaV&v{ye uT=sEϡCe_mۆkO?t'fx(Xg Ν=*z( 0UpK$Yfve5kBiUr]yNa~g!\0a B Ӣ0T?-!{X2ovbMK~k~?Ole6*JX,nk鿽,{Ka~<s U59\mFwyv| O@b`V�I@�@�@�@�@�]@b � gL ߿� � � � � � � � �V{;w|My3<S;S(tkiڵIR*UFVY@z衡1ct?pô||'Mf%V>ߖ}wXjV<)SBA[/d[V-:cntuo>H~0^F,N&ukY\Ǝ7U^sk5Έ>VbƌZ{~1٭JVƽŻBR=QZ<M:1$]d5+g[@�a[.3,˗/Ñۆ^:P~3Yj x%\?B{3P˖-5ӓ ϟoAsE4W2Yr_v}I6"%/T]~|Ybˉ'HV$ŋiӦTݺuù᧟~ĥ33cS x[\|ŪQ8z'7߄$JlYt.gVNj|Ljh � � � � � � � �!@Vf � � � � � � � �!ЬY3=C>cTZPz_2b]Y !:;TӦM5}t͞=;jyHq4>š23I8>"$)!_~F޽{QFTR}\?묳/[8R-X jB{ˋ@h {Kog=T4th䯹5V@ o5h S1B_|E(!-Ž=o懀 xM#p dAQhR^t<Ə ʋV_yd]z2t eIۢԢX+(0.,yb,#vqGv^Ztz+V{m=Pv 2W`뭥n$V҇ʮUI_.ԣ4kVfzI'0*TN:iڣu:u>֤I@`#K:Auz}B 0q:ULM,Per._S֭꯿ ]dI'P(� � � � � � � �$W@2w@�@�@�@�@�@�@�@�(ر^}@:wlٷa~ڵk &A 3/^B󲳥xYiӦM(@pB D/*w#OҥJʥD]onPDӋ`״Jg}vr!z-[W^yE}G3фuB UmCP8Hz{ܹwmT] u\p@ZnƏ3gCvl[J|R:8i 挀 m+͙#$;ޖ]nbr˔Δ{y a-* @VY|LvUo4K?>ٯqP?G^r{`ǰaOksKc[j/^{)xYIh0~l~RSOIk$V9Kn\Zj3< uk֮y̵c9\R˖-õɓO>Y>`dLy!&V2pp}e[K=AW\q|\pUk#y"h<PkʕZ-KA�@�@�@�@�@�@�@�CR,=J/@�@�@�@�@�@�@�@�H=O?]<󌼸r7/U^=w})*W#/fŖ ª5o\|p(욲+A(7|ɓ'7 TX1�ytl|]ωHϷ/Ԙ1R \S@fϞWƍtALȣˤ ۧJKMD.;/ʔ). "a=n N~RKbE!`ٲC(tRQ,e  'u<dHMnBh_,S_ɲԫl_&SÃ.ovi uM"w XB\sMmî_~k=k֬ \xz3/ʂbsύRx&͒/gZJ a Dz'F?1~0[fB_RRtDq'v8iҤ0u]uQGGTҥ;K>*o**}եK];׷/<V0&P2,oъNK맟~ʒ ࿞@�@�@�@�@�H.ņl|!:MW@�*`1@yj@�@�@�@�@�@�@�@�6 Pk"eѢE8q|P믿VrԠA+$/xV 9( L)/?\.߇C9D[7ٷLk|3e} CW)Yt Xiس<@kU,o<? -/IC�/iʔ'@˲ `,޷B s=<x֬Ys9G]tcB̕Iȿmz@0˗K}DE;t !p8anD+<TԵtyR5R\Xuu+PٲePӦMSϞ=6ջwoW*Uq SO_ؒtF<i %6L!xtR˖&g<bgKn=zN9^s,.̘1cXᆱ_~%z[#Kۮ{ȿGXԩShwTsXˮ]vgFS *]x䅏*:]ܹBX:.]:֮xV@qT|=KG�@�@�@�@�(�ZcJ@*8ZcJ@�@�@�@�@�@�@�@�BA/ҽmճ KHEɓCѦO>DYm#;兛ʔ)kJ3M`U-z3g !Z^|> -^C;05m4l[lElv}|o@:~O>Y:՚5KV:EaVZ xHo~E =,óx{(jIǥ՛IgK@,&LB&MÕ3 jFVWZDp,\c=f UtG2<WT4rdeqRzG۶Acƌ Kxŋh[K:8̝w\;|��@�IDAT{o=zȜ3] f'?=Wv6ZnM<曍*aO?Zԉ:u_�˾p=~+[ʟ,/2_Wl!*Z>>=h}Uƍ8e3;V>=\XQt¢Ef-@{? *>{_2@�@�@�@�@� &@Vܘ ( NV@�@�@�@�@�@�@�@�R|?CQ?0u- PB VnnkEY`ʕa3g7/p°Z;C QF^z:r;i̸~ŨkIGQ@ &+°�-ϕt6/�-Jʧׅ(@=a,v!}E;kt饗cǎ*_|F+=K/I@3GjOjCi _QG~A;c,kRh5kgO]*H={JSRg ϟ.]ȃH<k!9G)̫]y1bUfw5i #`ÕV_!9' yq2e^(L6E-[fYX~zWZ5կ_qlˮ\rndOvQ0>={e{nRBXtAa[oyZ'.ғOJIxQ-ZǏ<m")Q"Pnޗt@�@�@�@�@� U07B�C@-L� � � � � � � � �>C-իWˋ?͘1#=/Yb/ m{n쳏j׮ Cym6>ؤڵkCq/B^u޼y½b*W\իݻk AZ& ЃߊF ?!]pԾ=aZEEeR<L΋;V<}L~-vs=7hyHg@ 5V|3 H9MK.6M  +n:=0`@W5i? ' BvL@aFێ:2}bȑiɮ[I۠-޷p⌚]Tvj؇+ZXxV"bN4I{-O4 "PjU 6B ^/<\CMA4$۶YЯCHw-YVz?<M0A>`/Ѷ>pwC|a|ۯ:TV /i6bZ{G>W?l0DZAe^<~koFUJVbj=N'njܒ`zW.8qJ.*UWWX. � � � � � � � @J*D�@�@�@�@�@�@�@�@�*ya5'}G~1b<� o{*{A2/{lpQ @,^ n_}U(>{获m&qp͛k_jP-Zb|'ֳ$έ/ȋJwU}9˖- E\hM>]k֬f͚Y!CV] i %?ZӦɂ^2ڴ}veSD x#<;C_~?x@-$Z', H^ї.жm٧e EC 'Y( B@K[KzR29MJYkoKikj׮]ոqc]ve۷/a"d`pǎӨQ4d͟?_'tN$\U=Ke=DuDZ:H+W^y%?w-s<䯍][XXv|{֬Yci>~֛_p5kp-#x;l>%z7|#k?o{キXgƱ}<{v[~ش{bMg!N6|Mr!"-@�@�@�@�@�@�@�(>Ϟ%#� � � � � � � � @ TVM~kѢ?C2/./"zBUV8R^wuW.<Yŋop[hQ(<g7/ܺN;t^aÆ!t̓kMږ.9unk;7~Zkyd |wz5iҤE[y`h~?4H˲ʚ0AzugXZRVT9*}Qѓ xA-ԱcGK]vbHetXxG@1 * #Gz�d2.e@*v_x4~l,zzԣ,�KaĬ_`zt>o4#F#(@ٲe- ~ٳgSNn3gFZzU9H/{95o\o}|STò|oVX|�=4dz}vVe>e+ [Aԭ_uv|LgÎ~G⠵-B5jcu?ŷ%jo<wgL@VZisa � � � � � � � j@@�@�@�@�@�@�@�@�@ uʗ///.巜V)oY_j…iӦiܸq!iڵ'U;ƕ[UIL~gy1Knp[dXO?i,մ-["s^xoᄏr >UN=JZE4.\*Sj<@K+WN|p(zmӶd[zd Z7;"Kw-qDT;VUA`#ߏy!HzXj\ο7z1 "O>)FeRCt<@iSYtRҠA^C@RGG7ҀR~"W/Qswy:cԭ[7VZׅUB/9Hk{W4jԨp<ǔ֭J˂A$x@v# _\taIi!c 6 ^fMv^ L>_+Ui4n>[g_,Q= Dzc{>v{ˮ^W5S71n .EǺ3sˏj0n9^� � � � � � � ��ZC@�@�@�@�@�@�@�@�HavI~;CrXW}�xך:uj(űY@fP'UrXޟ,VV)sŊCP/7J^^,~[r_~%BcWXB<oFV^;"ckVf h%W(?ߕ*ղmr=o>zc—'{i?o&N-Z"3T-t衇OL7>x; nҼyovqQVt>:h̘1p-ܢs9'g~/0ztiR2.Af xxȑڽT4d,x7כK@͚R"deQVvkׅ[V54~y%hرJ3\͛7/܌D x]uU:묳{p} ^]X 0mweI>Zm=I6]-W.` -P6_ᶩ5믿w}>'{׬[>ϲeˆql|Ǹ>A]DZ}L;X/DZǮ_֏_gˎakxVN oe{`gy]aӊG੧aK+>lԫWO>r4@�@�@�@�@�@�@�@�H&g@�@�@�@�@�@�@�@�J@ҥ55ji tRy?A8TfV0B\^ t߹.Uu[WrU!hk-_ŷY?//ˍg9Xޟl~󰫬^t\`0/ײbb{g(? }u!x:p*+B*YZH܊|=<?~;zËN.}5֏5X૯[~m(ZڤIuըQxx)S n'(iiQ50"q}ہ{̂N4I̞-͙# FH.QBVӦR>QAdA`+J]Fɓpo=zHU֥KuQe˖:a~M@A<f`_x]mk7|zQ 2OA -t~FS^oZ}+eo:i:7^>!y q^^dYǴ}p8+WnȕGc>ߊ{_8uƴA|:}Nck\իm?aXq->뮻}H1l}{ 89nz=-kժy0U2֘D�@�@�@�@�@�@�@�J % @�@�@�@�@�@�@�@�@ Uj֬Y.^:$pxa2~0IjWQX!ʋe/&^,e92d BhҲE>O(=aBT,iXIr]|+o|rhi@iH^IP"V;8qDo \:s=@4H=>^=Y 88" 8p g޻F-f5ʎcjy䑚`ׇ@ <Ttaiq[<<%-0yX Q*8�Yx4th mGSd<j.7n\co/ FR<2c x㍺KOh@ÆN{msTǎ҅JS`%Yvap++v|=d+8Xv||+p~c֛ǽezch,óc==O=% K]UMl֬G@�@�@�@�@�@�@�@�2G@y/Y@�@�@�@�@�@�@�@�@ dx0UժUsW_?C2$$Vkb^x [fx&0kt9RѾ�X|޲y!ղeK5nXfIC�'gE˾ӭFAZ{zGv";Z Ҿ}{=ob,xmvRRI=3E mFHW㏏/kZEC ;,]tsI'iÜԩTR^:, =B={yQn,f X xJ-P4uUxmW몫"�LR0d6G#E G-]tQZ93(e'>w1 K-KÇnҬ `v.'(g#zJKBw � � � � � � � @J'h>@�@�@�@�@�@�@�@�@ ޣ֮~LNU2@`Iaâky ʀUgRHB#:FW $_iĉkԨQyꩧjʔ)Vx?^?&MdʯW-*4!U^.L:�i�?fZz}iٲ(X2�DVr}}F.nn!i}9r$aZѻL&jHgϲd+ ֕ƍK5%PtWiLY3+]w<Xk܂;ƌc-9իW/+lnL@$P~};_{߂oZ jϤ矗<2<Iza.@ A>^A-7p.J[Ζ롧/Nn@�@�@�@�@�@�@�@�B .L� � � � � � � � � fI#+D.y[n@ZN>]ҥhR*gHkHO=%-Y~NVE1cmպuP)-YD, :yʫ@ %b8ۤ6mq꥗dwQeWjX*S&%N'(rٳg֞{QFꫯַ~zE@|RYSj0sf~@۶Ҝ91ecGiD`,WSE!fzitK;LG}:w+VFL .]Z]tu]v _ULClS{'N>8]c[[2XbEdᥗ_e6+vE=}1/(2 *hѢEE<� � � � � � � � |H � � � � � � � � @Iw_[֬+'R0sR\,Bo-=TZɶHX]jvS]"޿U*W_i<xN9+hi 2#^˾]wI;$ "+)+/ $w)u:@L*Y~}M:>'C¾+PʕO,D xܶk93?W~cJ&]_,>REX$}+CbX?Zx =s?~ԩc۫m4 ! f~#kɅ#"Pp?믣q ˉ豂ϙ)@89\^xT:d\*[Xw믿R @�@�@�@�@�@�@�@ j囌 @�@�@�@�@�@�@�@�@�x饨=HeʤzsE`lez_Cz^4EE ZR.,43f7߬f͚ ~$9sP-oɒ%!ds^I�)#oҸqR>H5jH^hwr4sxcRNҮL&[SjذZn?,EK`mԝ;wchaI Ť,"Pm_6m$cXXT)騣/:KXۃky'+w'Z\FNЙge˖o&l~nj׮-ZXхZreW+E#.ѵ`YTVtGE@& yڼ4`@&9 ޜSq<_eڵ\qL@�@�@�@�@�@�@�@ )j%"� � � � � � � � �'_EI&+zGdK"md8o#>ӦI>;}]z!?< kWKiР̚5kZu׫qY$�iʔ@eidEɓ_$^}URi$!B}ݧKgqFoc xIi}3sX+\`m#c uea PxϔVCb Jj<N2tm/&M:uh̘1yW! #F~v T)&a_?_d,lcE =<k9Iϵ=ZVMjժs`d lVvz7i7Yb � � � � � � � �(]90@�@�@�@�@�@�@�@�@�4HZH80-K'H[+%,^ޒ %y0 V(V[裏u)h֬Y޽>#-^X<ڵkg= RF Q?s+U*z4t,(*PmImH˧L)!d]wuQ./OQF)G:@֭mRZE ڶ̉%IG-'s( K$krsm9͞=[mm=Sui駟~ļ Mtɾ愠\ti@ٲ#M&TtQҟWX.'pƥ_q<P˯)S0uŖZjxZ� � � � � � � ��ZFς@�@�@�@�@�@�@�@�@�0n*,/$J�q㢛hxJ%PO>YPAB+w~'߿:"rWXۊ<xpК2eJK*τ�*|4ftyR͚eI%뷌<!q]@ ̟?>G}<X`…e.&%Nc4J)+MwSp,wR߾ҫFۙ驧5kr_Rʕ5l0k:ujAz'rg،;l{coFm?!P[K/,͚%5n,)tүsX<i wGo 1`\>! I<PwߕLC�@�@�@�@�@�@�@�H=d @�@�@�@�@�@�@�@�@� \uk-�Ix1aCR%㏥cM҂-sUcB^0X,_^zi 5dhhk_ҥK-g:wjժ%l 'vd7uҡFYYt矣�޽}-LSN9E쳏LwYժU3}Y,ЧԬOvA<t{`V m+͙#i#Ա4%/Xsixr&]{#%q={N3<S'pB}*E w:˾@VZ6zV^D<@ԭ~dn)Jw_tE >xQeI6@+~..9~ Xݴ[EѪ]VXn0 � � � � � � � FjmD � � � � � � � � @f |IH*dֺ65K:HݻK&I5jBCI#Qd%]hC޵$>UnҤ^xz!\kѢEzuG|E9�?_z6Gח`|t RRrO pر&̂FmgϞv~ *J xauhM^;(~㲀_wM x.B%7nSq &Pt䑲sqɃb=W>\׿`T[omhĉ!N:v}.(N; 1B~kРNZ92)oB*SsO[7ɯ@ gnOz*y4쒖JKgzexUDwy'SV@�@�@�@�@�@�@�@�J�S~V@�@�@�@�@�@�@�@�J@Q/DC� |ԲeT駥; \#̭^+c)\.^K. EZ믿s9G3gδuUlܸJyeo3D^(vm G{a[nDI@C� X1\>q%y!۷~>ᒥ<yD^1)#Y]p{-iJ㎓xBY]V| m+ +ڴ?^Q3!w(t_eRZQZhO>D:uR.]B(~Ky < }ٚ5kWBgj͚5y"L;u הZY>5ߒ)ϼU`ΒF]kA"0c4oԮ]^^kC f˖-&MUo�D�@�@�@�@�@�@�@� @VP% � � � � � � � � *O=%}tݩ#@tAҲepdkݤ3ϔ9I]k}_`K5XK3ܹs(<w\OyeM+p;jU}{Y|C9߯tuw V+V0[{gϞ! `zռyZ:@<G5kkypKGo/y: (#GΣ ue%<iW\9ӣ;]7, 6{o9VXѮWWz衍_#C`7Ky{4h yzlHnݢ'FJ[K* 7HICFErFv=%0 xf͚UXLG�@�@�@�@�@�@�@�RD@y# � � � � � � � � h j鬳Hܙ%[{uul>u~Q:xaCS_֓_UCaX;NSNuU"4(~?/nyqi%]Tz}iSl3=@ .\h!Ƀn6uI_Fa(I+P:Z^y(%Kfn@۶ei#;J˗oyN6~ 7}El~[v|P ӤI͘1CݻwW=l[mw6|!wRy%9Ϝ9Sv[o:Oߤ!"~,\/QGI DT\S䍢*PԫlL@ZX“(Z%q̺eʔ Q%0嗅'3@�@�@�@�@�@�@�@�(^\KNv#� � � � � � � � �N .Z*ܜ^ 3eR~ҳJl{W`jgʕ+d'OBBvyg]x}5~x.]wgzN/w`n{H{-]sd48,NVLS<rTJ:}E k=$C%δ5kj̘1v|O~m}% >vBs@Iv[iHi(n]7ٳ)Sk9~C c]iӤ><Pbi]Γh3-R~{=_oሖHCj;-Z諯*ܘ ~kRgHNh9Z&o542Q+?ĵcwc%7lIh � � � � � � � �-@Vz@�@�@�@�@�@�@�@�Q_ .}D�| ,X֊p-ӫJ"]}TT>gHn>li<i8i풴8~-ȮW5k9s;ŋ5j(ycI=4(y]ƍvΚ% Δ-{NSZ4A`UEo޼֭[ó>4h`&}>q*U .[VٲQA%G @۶.MQTWngh$JQ#ᇥモnQzmNtIVEKjd/c>}-[j)/ԩS/h#<I K6<O L^=Z(-cY#\%Ϝ)vZZW )Pԣ4`? &:' AOyih)~v!� � � � � � � �I@<1"@�@�@�@�@�@�@�@�@ n]p!@&M>xAc~k's@ ^+=4fމsɝW_} c뮡q&M4m4}G:*V\h`餓 8)+:u^TV0SO:0Kh i/0aZ~?v_N0aZ5~xʹ:tPrr(œSK6 ,niN(#n^Z(y(ϲBXĉ{HݺIvyȮJ[lnݨ?0 ~뮻NZ~1] ԯ_?j{ҥN9 ^ĢSO=Uwy^} Re+Gg*f=k46{em< ]4th *IO=%kQ~NE2eʄ@-[ƍ5eʔT&}B�@�@�@�@�@�@�@�ȇ! @�@�@�@�@�@�@�@�@ ^V3 4(kFe7pnu5i[f$X%/T:dԺug^g7c + /믿^}<b~yGfMV-YН@tMҼyeA7*U�tx뭷VZeK1Tdi<>{5թS'!`ryY^ɏ doҸqRŊٟw*ж4gdYEs7/no2: _~@ -[JO>)}twwݺ0Ri({kJiӦdfQRʗ/;CoFض<d˃lw?ަ1YȐDBeJQd.i6RJo HR2fgIP̤_Ϻ{9{ϰϽ|k6gF3 [N<E Z.2Kmʔ(o_B)6lHX1`; ףUF# P( SQyDܹ0߇|H; j͎ jŸ́QAD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D n /9q[\D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D0(Rx1H:i{ /p4i$u N{t {*A in5k?QFa֭:OzT٘P…@^0ƶZ =8p�?xQRY$[QӧO[t:d̛7{ /w_|mڴh!ɸln:F| jQD/D"cT,e+qE썮Rk7##(dPP, E0cFe,]gΜA5[o`3Q4zj\oTZha澏:tˈyp!t596/ /L=߱#_6 o,\6:'I›o< @#GfZePXh[!j#G;gY)ű89D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@◀TrHA`zO޽KqY'D@$p м9@ttޣ ,Z5 2Eذ _|~5۷o 4iqȾ ;v4^yzͨT/H'ɓa}/:\c}{NK}g's4�LtoѪU+hBZNȞ=}8>،gߞsi/",Yƣ֫-[&=_"  P0;wlvc}'zձD�ŦMq`HO��-O<Q O?ЈW^y:_vmd T3 SDk̘1Fe$1*nY "1"SP%@|۶}�S<0Bp)/<3"J�5P PuXT:v+?9y-^2eP¼ .tkqU.  " " " " " " " " " " " " " " " " " "Q\~yٌR'CM"Ek6? 1o<:u 7pCD'{aD0*U;Nի*W˗gXb#n u=",cǀ;9r(:޼([xIyP(vN`P;pPRW\@0ڵ<OtOᇞ={*T(I�`D"ڋ@z XƷԗxD j(֭ syʆ[iK㪫2"[ӨLe8:t%\b|Γ?/f@ DZYu^�7׭N tk>rիWOZ E@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D N x8-" " " " " " " " " " " " " " " " " "` ̙L�x;l Lԭ - ,YԬp3PR%.]:S"Db37d|-py('rJ\y啦޽{kЦM \cUMO`BjUO84Pfϊ�E5n=`t`. #ЩS'bZN9r;C "V %KcH 7,u_#0 B8# #\+Ή@٤67h(Fi*cժy(SFP뿸Zoa+@[_wqs"+y^*^=a›R>?j$Y��@�IDAT*T~1t\<uTu " " " " " " " " " " " " " " " "$M@R> x#дi%"CRgXsQP?D Ξn 3q0?u^u֡[np@p(PK5� ;eˀCg0r$p@0BvJC�T>Adqc &_"~ BΝ0Q Θ}ػwoX$" ,Y�qفKqD@Hp?F߾@V$;;p\jнY@t p 6'fE*OX>d1sh-CX`^y啀bYڢ`o!RK7@5XSOS!õNYK)uRPk@ " " " " " " " " " " " " " " " " qIx'0v,x1@!POgOM+'.]jEw^/>G~!Ab9dTzmĀ^«jf*ecnjv;q|mN7:#w<#F}jOalٲ!}Μ9Nsʅܹsc_�gކ ND׮{)S`N ^ #X\{-@f@)Υ#H�qN?~<9om'(-;-XAF_66×8p wx{h^ mo oQ4p>8ǡbT}وK[.аp nŸpf(@f"p�+V�3goΝ 4=aIWOh7%7|srEUCF~`0`"ڵ ,*kW`d1=q|c۷;?pwϙCs\TQ/l-Ze˖-#un-S_[zEff]F tj4aMc%/̻=R\  M8Q󁠛[.2FEU:@~"p|ɵ'\uUF<;(N1@VJ," " " " " " " " " " " " " " " " " Iб/'Ԭ~B~:w 䓄̞=:-ޘD |裄n$N~[o!aҥK">}xtj<xtͽ:tt x;ǎ):sDnRƗZ á#H@sp霟S tK᜼y"ȗ/_}PP!`Nƹ7sc(etu3 BZ&,R+Mo# #$<~gf|Oh#%Hn[AaoǨ8:Ul%lw"}޶C.6xYwnt(wl/gm#(Ez&'!l|y+V]G=H>plwlKCeŴzo{kycJ}i5'}ҦxG̋{ }@1޶9X ]A�E*V<~G9%Ke1عy}[A3Y8oJK}3{#F2~}7c.,e۽F 0z�6-A\.eȝeqVZeޯ`mۆ[]srfcQӷr̕>)ōw(Vʕ+gJ*Q+P|LqBaۍc"|_رm3Ծؿ?aiv_�yYSp<V6SP3v>NvZx8�g3/k>'+>{?LX峮_>Zt*wf.-Ǡ\rs pB+P^D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D ~HP+~J%> ش uRD[L4j;3PZ5\xᅾ#DруB@6Q0ei}bjP$bx߰w^ٳǞ~_$wL <8bSDFx( D8M g981{�9a#G/oٲŊcăȊE1- :ފ/%Kڍ#(u]їNEǦAr2b|F%6mc'=m#w y CFp+c&><vlcw,Cx6V8ǎSpI88:wxE'N)pEv{M&SH/Gq |,: $='i*TFPұ 6}cgz ? .={Xg,A[och/x׬Yh'8ȗw#9ϱ+@$ sQZQ#Yߌ;p{ g,|ܖ65t)g7-o`PF F<:Y0p "4u�~ \Gfo(80w\Xban_nnɊ]]|ŶVz88rFB^؀<Eׯ뮻Έ\\kT9i׮h+'bܸqfM{ fI=z_~I*MC?@F 3عsyvo'fsk~3-n⊚yHv[h>"0F&L.-�5%yY']J@I֭kǷ.-%" " " " " " " " " " " " " " " " ,zR" " " " " " " " " " " " " " " " " ~tcǎMtV'Z\3EyU.0:0go@p~h2!I@*^jd "tǀwމA<˞={7߄Ĵ7$E,zΝv۱cS 9sL":9-{5P"+=+�^S\,sG E;?1 pPexlЩ;dܸҤ+ Pű}pŮ]weq޶9}:N>èz^v-V^m'Pp'G8>8v6 M}<vlGFA g 6.86{>t6wB%69؁c gc y96q7mz1}||=bWiӀ>Jn`GAmƍ)tlVj t||zVZe#ҥK? Vծ] XQĊcX58eY-[f6'Et)լY3nT"\d5*kӧO9rmȶ9Ծzr3O]ؾf-(49ό= j>It í͛M0: ) ;`A'x+,1F]u?;T͉@fBÆ Gհk5&Ă" AaR$0 .+#" "o|N A�ptID@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@R# Az &V6mCtnJ_2%Kĉʕ&Lq^t2NQtLz7+"!+W&VQ'G( _PPbZsOc0:un݊͛SAFoX8" S bLޛU8O6>"GtlHsDxx tB^xq3(Q7̙EBľ.!ݦ1&@qlc#?$6t>8Lɞ=s.#QecTG0џ8|pb˗h.bTXn\rƗ_!CزeK8{?ﱄ±% %@.68#@#FU kqAQBD<y򸷲*YXhqH8Kp=j/~%A.6W^^}5N̟?G6&VfQFVHc|Q~G3giE8xTKHmiӦJ\Q&' B>qu|3'| >-| R Bf2ݔBh qR`֭͛ &ayǂ Pn:O@ZD"M8p.*" A-_T;'0xukWiqT :hh�F(H͏;f͚77(@ #U >7Q.@g7h "o>lذ7nLOA6T(E˗-bE(|BsW)jQ(r(煂jœf:kĕ4&1}f=bsg'5Lt>iqǏ[@m'~1a\rY@zSN>P$ϔb݊ϟc[qY9۷[0^̚5 C ѣG9r":+W]ve?~p@X±#"7n(ı$澶 Dw_:<^~hٳgO|..Rk⋀^*mz-㯿E{;QR%pGgaj}^0ba0sf1bطWZ;w7ߌ84o(&5n8+ž;uRJ<T)]e<,+V4ضo7]t3͚dNF(릛_};F?S�B +[ǍْCE{ԊRIE@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D a#={&9" ~ DgكW3f̰G%NG�{ /`}|xGлwo<!QOU5k`ʕvvZ߿@<yh {:C G%Uʈ #SNy8yW#8\[2B[q 4 !o2>2 㯿.0L9Y@KND�(CWc#x)vCQ=چf͚=E h#(CA͋/nhݻ׈8͛7_dol1&P,Zj6 kԨa2$htQ 6bժU6BH ڷooN8y2m,FA%|cǎY@;A >sLLX=Y^hbK@6ߠ;i#~ıܹssNp<K1-Wi'h# +Z;LXL70f 60~<Mdٲexw_Zq\ 6ZHb{glC#GF&MM6HUuQf@$f52=Z%8m?| jAQ_#+J," " " " " " " " " " " " " " " " " ɓo>,k@ <4ЭЧPDpiRP]vEV,ǁn5 ȗ/L gd}x'dNҙ=/^KZ! 6񢿐;wn\jժhٲ%FHܹv<H\n٦X! 6'w+ofDZLHSt;|(B@dk#h3Od͚ՊdQi(H@,:>VpD$ɜ={m!Nw}{gΜA\1jk#lJd+ ư|n˗/vb% E"%^{-xı21 :Y۷qĺD[AÇ[QGլYӊpA[A !Fd*{rK.rt`'8߸ +3|c@ 2Ͱ Ì�p)s.ٳka̙ѱcG+Tv.V<b?ҫW/[C}]+$LQ_|ъ{վ}|j>nJ/ԡp着psuNfjj+ugU*8#GReD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@@ WlXD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@A4vX(P:Jq[ HG*5Z?G`xh|D > ]g v SNE&MQ1E ,M`ȕ*#Lx+E~(ѬY33:7 =Ï? `8}4 ,hE*ԨQ T2H⭅3ny<hVZeZ(�qF;W*Qԩ냢-t~/A= ǎâEoS ɓYt:cpeآ۲eˬE3W *b]>EC#8Xh[p`B孍Pc'hD-(q,oY.g,A|#mtW dƞ=@R0S|@a7Ä иqc+4~ 7X孷);qgU^jߔQ7eB?@t{dѣ3;wvo$%{aӒLy]gM.#JTvk.p(Z(f͚ ~b|`E)D}}QD@D@D@D@D@D@D@D@D@D }T " "is={|sXKP+cj#" " " " " " " " " " " " " " " "eԊ2peg < T�=7#@Y|0l-1}9r$vjl#ǓP񫯀~ c ):[.J,i;/.j믿b̙1cuPm6ȑEjժe~+@8j<Rcɒ%V "qwF\ݨQ#ps^!% hQ6bŊ)(mm(Uzuħ3.'pYP6OAQ*U@o%10eX"ZB(A;!ꬻ PZ`XX14h *&o.:1dر@^#08qd�>0{F_⊝V<iӦ>e擜OQjڴiJ 0Aٳ'Y!e}S6ZoʚFY)f|(vE�Gg;dRa>\ܙ'OFV9B<y+F;Rti.D,~$M/H)f K HP˥ b%S /EE"MglJtnJ_@N)�Ѷhz=t邭[Z":gq L�4k楧E(Q)]NOسf2i ;lڴ:_>6lh(zA!ȈonfϞ n|(\Ig͛77}vL/ j*kh#(B! fFpVѢE3:�Oۗ;69gΜB(-[LKkϞ=ӧ1c#:\zȒ%Keg\EիWcΜ9v=߁RJ%#nFϟ?BHfoH3<:ߠ|m˖mDC_hӦ#4Sp4be' [Esvͫo߾{5KE?ĿT˚W{% cDD偑#×R\#ŋ3#,7$O$J)tSO[Sg" " " " " " " " " " # A-J$" HPKP+uF!" " " " " " " " " " " " " " " " ~ HP/]S``�E(%+qNAEvyĉ'PlYw}xtnP ʽ <C(,^+Wv?أ1uTP�N:hڴ)4iڵk#{+ $ o0ӦMCSM6h۶}?2( ł(D7`VTvbc Fs(p'NX>(S`Aj Q/[@;l2˗5JKTBdB#h#Ν :٧O\tEUt7x/ 4%KLu#Gbv s*jߴ7wRZnkPj@(73U@0y+3S O]oʕKܲe[%=G}eժUvZ?w馛7o^3}(Q:%A(" " " " " " " " " " & A-W7 '" IHP+ ~HP+$\," " " " " " " " " " " " " " " " I HP+)<#glJ|~Aѣ@�MԪ/Xu}צ-%A>0~]Py%O㯾:O:ѣX/ZhalTkP#1.ܕ+Wb„ ?~</_RJnߎ5ki,9sX1vXfpAq7qHm" P"c;C~6'o8Ic 6XA֕[-[dz1cvBݺuر#-aiaR"48yYK_~%y<Q$oq]w҅^ }NV^ƍsE[;%x"p[f~)ΕWG![of 9r\*IfHqY m'+5M6`&)A5bǞ9l+wVڸ. jzִߪ;E@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@IOkWiEM3g]L5?k׎�*i\0Z~�iބ+VC==zFL船Xbxx,]4&O}aԨQ#iֺ#sȒ%z嗱tRl߾O?4~G\y啸ˍ`?8p nرtYlY4imu޽f2 z*&P(KoO1bPZŋbk׮}so։i (űqFm4h@bZqЖ*blΝZ AsN,X�3i}cm ~={66 Coȴ2|?Dƍ1uT|J}-`ѢEسga<4A^NrMXoj| 5B. u>`<qu˯#`_pӊ] ? D<" 7oÇS\ {F%$> 7{$CD0Ѩ`4*0gpBAw9s/!-̞ t�{/лwѩS'\s5_l<y1TblQ#1ųyȐ!F)g:)"E]d(/]vVPTRvދx͙m~֭Q\9|7V(l׮]}݇B +" > P�}/(]߾}A+dTƍb[>ovI <3`Xn@G˗/7be]8"~Ρpƻk v`ڴim!(lo—m7L 7ʔ|k!͛7@B p5ߨP�aÆؽ{wMC j4@ oj>@m>`t~oꢻ"K``*bdQ%+W.PT)2:km).k dumT0D NL:0^qt :̝ \zi̜9SiӏQ) l p"_O<ߏ#G"kh::ӧॗ^tߢm۶ȑ#@hʗ/^za˖-;vup^zulK. -(ƞ<y2jժ&M .yUV(hѢQ,MW.]_5j@ΝQR% >gϞu%�s=c}k5k*#:ӿ駟wQ:t((C1ߩ  EEʰaAo7o?ʕ+gEŊ)bc癴 jҎuu|�m oݔZ |9P$РAR %PP!ZJBbŰgD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@@lxQAE@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@Dfq "2>1r_ua޽J?JO?-Z�u}#'N%_cȐ!v#hG}d/E_zPDhG@"@VZaʔ)Xz5 (`i]k[nu %K~׿kƖmѶ) "�% ;wZQnݺjժ8qkjࡇBXx1.̙5TAD #ȟ??(λi&1¾b;O<*kfP!2)77(M^\z饙"[… cҤIصkE6}įXoh>~@j>p5ѫr 1@ǎV-wǢX_ꫯ/0:'" " " " " " " " " " " " " " " .&~QD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D!8*Urh/"o`tm0s&.M~sԬYSE 4*Vq #,2|N>m6]fyѳgOx$~P"�+C* kQ�J*ݻ4J1 GŃ>hE(/f}!P"t/b۶mVt}[{qV{3fԩSѠAI@f$x[b 6 |[L>=84߈)~erf [֭/7x FC/k~)Ə}fM^;o hL#A4\-t7."EԺꪫ$Gm� HPKρʕP bZg8J:oذ!e˖jgFn@ 7cUVn*V/ ۦMaۀIH駟F֬Y;vVBZ=gϞ$uoQ|QX]v?6+uڼy3x [ݽFBZ͠/�S ܹ3j;-_;w.ϟC1J)NFڧJ_ŠApM7T'apl 7zŢL+9syF7"NyX~=9իcĉOt>(^uPP뮋ZtX)K8lkcs-ptR<#ֶq@7cǎhٲ%8@hy:lKNL2%ɜ㡇µh0`?QZ5p�Dߎz O8roĴ?>3x6SDn띲d�9O7l >#Z.~)tE()Zux c�*�jSUV(LA-~` " " " " " " " " " " " " " " " "㣝TJLL7a5jdbx,'YR.N^fɒ^߶muwcqXf ri (>[٬_ m-O>m41_&3dQ |( 4l0?0bGcǎDGMW|0iRgQɣ ݯZW֍B|V3bA> d֭qעSN[m D#m;-;/*?ۇywBC(Reas̙^7|!^P;r~@>}жm[{VW}nhѢ\jql5+Čc i^x99r8g8[a+֙'OE#)7<7Xgشi&ӧ' VEYq cb9s_yF0/EGΝ;*JXΩ}cx}Ȑ!(VHiuC{7q>:73K(~=`�PHg?Η-%.,[zX [ڭ[b>^y͜(\ZGA-K˗/_ZR." " " " " " " " " " " " " " " "FPD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D+sݻ"и1p�PtxO'ZtO={f|= ZB4[l短p9 \dy0�}?/|2zgΜڵC6mZ'|F2}\+̕Y q]vEʕpv>ԩ{7Ɖf8q_}ƏoSN1c *O:7c^#f̘ay^y <ӊ4ӿ+qwۈ2xWS/?18{ǭ3oK/?jOZW_%xA1-0>s?<S裏"^4/nFk'ϟ/1O=H%B}oi#Xs%ᘂ &gS.,Y׿eD*rbigToPD Fa1ڍXX78ǠxX3vz>ʔ)cРA7^P\'R!Zk>VL{5H]8ܸGv"7\gٳg]wL=ƈ||yLE{](>vr[L`!&n-Pa$PH߿gJ"Ңj3E4 jEtxmV-ӑn BGf]QhѢZ_x#5'zEN˗/0:3F F%ALӛbرcUGΓ'M (�(-SpL+PR׃bС曑?~̙n .QAPu&!CXAmۂ| {bxg#M>84$ :~)"8w;\(:i(68➶B><"HsȞ=# X"=M8p2pңʕ+K/R Q6m.]j;^HP O,UZߛpL+֕im˕+gE+ [FkAowq[rD;h"ڵ+"VJM|GHSLۇ| 6Z o8~= !R%}�ӽ|=SUd8f0f P7x*^WPߊ+%k" " " " " " " " " " " " " " " " ."Q" *_";G-Zu�g8 YN<iEB(rM7+c=%K޲wP?ObA/x| Nˣwޠ_'߿N͋{͛7/L2߯_?Xv-*_ƩQ|bO箽ZtͲ#FcZa0n8|8t-c֭ѬY3A/7:4S1E0͊%K`؀ʕӖuk(2hO?}ի皦عsu޽xbPlٲxwVヒ#GZ!�1Ю9af54(j@$ڈ'ZAE0akx /^I&} J^utZuVԬY;dT#γol3x駟ЫW/+SHP;={ֶ;fvmQ>N_a٘?Ŭl:yŌBw毐|~;*U;CG|^.R 8?wvwLLH_O_|-3fm6;y Oc6M6vvD{DQmcP{ob޼yȑ#L<T;_p 7]ܽ{7ׯ o߾b(kC>O>݊VչʞGofu]In}ϰqF#F{{vJ]z!#lԞ [l+bۃsn [cΝ"ǏoE8pKg#K#Eʾ+;Niٲ%l.] s 6"Լ5ůbŊ)lRz-��@�IDAT%i#RKf#W]95n /{A=O<֬Ycns16´b3l7YƚohP\U[K>}رwXGkAM4H*9ؗv<W\vJѣf6=yjt֚ZѰaC+?5suoRݻwGVpn_S _Yn?SV@N:hР]d?&AHtF|0?v]ߺu(1CjBm >rmGvmpΜ96ܹs_G (Q|kO&yO ֝E'w'N~g>oNAƂ�0/&o('OEє@Z " " " " " " " " " " " " " " " " "FA8N8<#*T&/̓z<{<AɓOFObϦMaky.rq1$cy (`q615=3gδyoV1U=Fh6"y#(1< qj :^7om<Qm[Lc# c2ocyo1N=w}LjkxgΜь3bOB<Fc'<7$^|E`?cqg{8:ٳwx<yxLb&`lzmѣG}GY# `Wn ]w8E2N3= FcZw\rN:yCR;yi >c1`l<F,^7b#c3Icao#8h'5l^YLj.xЗv%1?~<mh…m^NgiS#Nf F2JLA0 jժ|V^b^5c{-a?z)S+}QDOk|#$cGnNϽky8M҈x.[Γ/_>׃}oK $ؼzhgÆ f.U޾F!$ٳgLj 4Set۞sź!?o>~ц>ڠ.1+&-Zx~hаa<F4cR}\pBuuKmO`(=FFe,3.Mh^wxḈd˾`D$&F0`lm۟mn}$F3?~lDcp f,WWk#bg-#9o#ټys0ID-qa<oh2v}]vvN#9`u*98mcn! f/]`B,`roJd\ΙYٳgʈa:e5|@/a} cURΛʕFHp>99ںPZy}m \r{:<<o\>viٵ6ߺOD2L1k$RQ$0m48pg|V9vgqxC.[Bt 0cDᢛrK$ (t " " " " " " " " " "G}! @&&7?@Z HP+t_jrxD 3-xu"vjCA?l1c=G1 0\})grEms}%^`M N߿QcZdݿK<or޽{)HҡC(ڵkJ_"E#͝;o+Vywؑx?<N< m 1I`ݦOmߍt&tM7ݻwbZjx}({(ؕe˖tV}?wy=m{ :`_jyQ6N@Q-%TAuֵ,' _Z+t·~kci +(B}d[ikbb!y*%n 3�7܁B.5kt &\~}QLb|tO|(n<ݨXbbR{o#r$$r-Ox.A^R 6d>)2%{;g{ɓ'=}NIqܼys;VdT ҰMi#'X-_⫮i:wnԢ]>_~e*SM!`9SKc# #s `lD0ys,y׽|,A!pX"tՕ}x>@>zQpsr>@Q:DHo:p5pHh`F.]Թ}$$O;[tΤ0܂ z>(裏Z}bx_lyřsGRP+:h>�H!e1�ڴi9rHH.8�??zƏO}݆U5 f](=<E/+wc9<\ϓ'OmKm-E;<k@J2VZeÍ7,isO7 jtey6"" " " " " " " " " "^roۨd" " wV=D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@\FtqYT"^`4`Dzdn% ͛FF,fdi"O<0[XvmbƁoq/q:�n_5+v{衇PBt0b >@d͚q#F${0>S{nȑhݺ5hKb#xƑ<j֬iGqrve4"-Bh~:n1{;%#B A ϔ)SʕqX #r�cƌI$APFs˰rJo#ڇ+- Ay�Ljc#xx8L<60Z^m 7ܐVĈR衦靅qvtҶ t`+NeD8!y:_x?s5cC P؈+"YTP p,|?; ` cPT).N0,0w:S2pfD>?orc_;9n8k?'}֕u10"Nڻ@ :vۮ{%B_9qK!(p%RǺ8<i#D06GFșÈh=ŋcÆ Ć@j}N,kV{3|}zdz>k'<>}:1(@0}J|f`D\cq6OeѝZ-=kQ^<s^_K]I+xIZ2 '~`Q@p~ň%:3̙?MaԨR] .~ _|ԩn # o|5j6Ç>M,fo~7HL<|̾0'bN /e1FΜ9zꘗUp_J@"?2WU[p5ӧF8$ATՅUD |?`eDZtFƍ'f={vԩS޴iS`^:u}饗tRX7oxDxwc-[b֬Yɓ'[ g}'6*E$((t;wƶmp- 'NO<|Ӊ9ؽ{@Z2-~ 1]ϐ ߿}y+<r鼁3|XڠaÆxֱ%\b?Bٲe9t萍E<U -ZܥG?_w{~z|IE06`wɏ)^ȐgȻ_q-pLoE%q-{TZՊSL|&)`p'v/N-Zo64h`Cs_>ϧu ߉?Ê z`JH˾!kyHՕbRx׭3|:wtSxeY>lDD<g8X2Kc#xOJ$Oh-cډH7w_oDf,v/8\|,\0<3g΄Ýdw`V\֍"7jsTc˖-}SLfeY58bmɹ+UNݻ]tA^kaVHզ:@\MUtl>ѩs=qN~{̟x뭷P^=8p~7f ֝3_('L4:t.ōWre%Us" �|o̜Tkp' j]T*LL`T#dbz' D͚EGifGgq]Xө9Kρ$|ɒ%/QBt\G:wW_0 p}nTXS}?N'u7� J~"tH('O{!+TI3*i. [.VZ:{=`ƌ~KHtF-cZQ]N1x La޼yv? *O޼ye}^cEǏ+oߞ6~+u;w.ك[o5I93?ӈtڈp;O@}t)gNQNi[hc(1c#-[fRS`.;AASpG ?;B/Ժ1jԨmǎ=)+pS9aO %Fx%Fc'1_g#6eT]+UdL*@1> xH9wrh>o�}<!fPB+{1p?p;O'\Ǒ|>vK!H}='N/8sI&ڵkH/@*\J̚|clmZ+W}/'Ys3k^3ΕW^ZjpҨO}Wȑ# ~qD}h-\xB9ԍ7r,7 ǥX[իWCuTF( bdZʴM@~0"7@ɒn-%%0hk BdsP&k֤rҥȝ;7jԨaӉё`i_p#}P^QlY֙w۶m[w:F|ĨQQz0iF@bzi̟?=S�h >|йs4SN?:X;Ͼw} bQyR[n(Zu4:(ў|7):'fΜi'-=`8vYX8C8N6-IhYPBj|y:adx9_0y}Ŋ*Ba#_3g-ǻJK]tӡjҥQv`oZ<E( CE,_\޽pI+YPLTV ƍbZM4v"6:rz |)~HRx-weaa<QNplÇScv[hxo8ԩce#xkIS])(罵i޺m6W9>|8褿r 7ͭ[tGP.%=7A:K8]߱%bi#X@uu_&O-tFYhQk֬@N{%.}'x$FjdP\pӲ|/� g8ܻ<S q$r^AH9Cؙ<Z0/F}Y;εqZee85we#r p*\0<蜊>e"El;Tk \aLًݡ`n6@[㧟~Ł@kl5>bS�:N jU^U[Bs|(uR=D@D@D@D@D@D@D@D@D@D@D@D@D@D #H!#Hu8&`3bJq\ ]Aǣ&j GdԨQA37矷kyQl cΝ1~:{:O4lP\9ԪUݿoٲPMW]jU5_|[JovG0&K -0 ش͋ M6 jo{] @񷧞mADb u䟦t:Ôj/@SqDׯ$`Hʕq}sË/ "!&ŋc 1x .2] ڿ R(7oƧ~ k).2P+)RDso8~`eNuZ(Hn~~+ԺZ87 <<!kȑë=,V}(C=7@}S>=z{wVc ?>/O<)x{k7Aɋv`,#@PR{oɓA'|իgq$LJ&NhǔCtJ<dpLH`s^j*oCoҤAEQV bPkElb[]+ ;R"D@ޥy?̽ܙۦ$3|>1s'o&gR<sO~v;Sx\~}-JZW=0}7Ua b`-KXyq[Es[ܡmdK$bh#l{~OvmD: ;oN<DNkkE]`^,ٹsg>zc[ %\o=7;k.?(uwܡw=cmc7ڹf2ƻW^|QgZPs*o*TT_$\D%yI4-N[螁-u=`ٱa6}w|ꩧ&Jm^V*SuߦkL:ϟc;E[Vڵpasc$m^N}ndvCܽz{Z# ݯ5V6 Yk%K6@ Gzo[RPm@�@�@�@�@�@�@ X. � � � � � � � �RuqǗ y\|*T_Hk8UF |E$RF$rpR#<2ҠAH"]vYu~qu^2$B"cס1c+s+@oY.`".[nq y_ν".gy&₯?2:(i:".!:鎸#.+c>}"}Qg]Hu>ײeˈ țϋ|2#n*|>^C5K$~ځK.$Rz2k.qAx.k\2ǮS@]j޼yąD\y3fLu*;.( 2y;VZ[n~kk gg}YtPu6D/noP0o.*rGxw):펬X"Q1W7W9idN;ED\BgϞ޶]HJuqzcǎpٍ?>oy:ewNn)̄ <^ \}i+ N}wAIinaJ;ؾv^ "ՋUYgm㸎#zkŅ%&:)naW^qzs!|F\(Kukq 6D [hq/j~#\`ggrv^:l!Ps=#.*bq֦]x`qfX=ն_Ý8v}V"vim `0Ո 时އK۶yӦM%dvn %Lq޼y`8KDms`o[;bǦ]wع}\P\&j#~bo+Y9HFa=(u%//ΰn:R~ #;-:R}_7n ./Uɷ^7zc!£ h۶w_˅n[ ï2q¤=q%~cMwҮCcO:餈 ,+WD[A/{vI~.p3Bϵ끑#Gz잴=믿>^yťuOEsMVӅPi~6˟^z=;?瞱<g7{祉c v|mD?ab7\v!`컚sx vno>A{6ҔR{;{nU@�@�@�@�@�J'/ ,B�HS[8=Ovak^O>30 � � � � � � � � @)N95JR|:Xqj߾\'*XflU+祓OΡSU}8@AzubZJ;{9p 6mV^- T]A\\gY3nݱJ.ࡈmv! y3\x֬Y#`{^pUZU;|?q\r_r!ԟt{#3ϔFNfF/;ү(ɟ6l ;}Re-wڱ:s69r!|r}^rySj"]�v+y$EY?,ֆYlO.4ǟUiQ~xܹsBl} [;:eY)ym߃x[ekq :}. ],gR]w\mƮ V~g]r2:o 傜B: c*t9RɬPA\gY6i ;V㕽8Ǎ-cǹ f֖֭[כZ\mʖvus-N.s T_~ ĕ B Ffscȅ7w!@:&j#lKl ]pe;YmEk#l9Ja-L&Wk傥}4(pz :T] <X?\ Y2uoqQz[7Jo蓙ް6~m%*s*ezÅJ>|eo2c$˔v ^j*o*u _w:_|OVq=?=[*vdHvn +tgWh̘1^[ 5fQ"e=vݲsxe(}'l#}8FlK4uTjԨ׿.LXxjW^ʐz=!/e>/`|A~D@�@�@�@�@�({/=_( @x<^rm7DV6E� � � � � � � � 12FjY,X(}g/ P׮raOr[M}j…jРAz7B+RҐ!ҿj~בBecHaa>CJ2!֦4l`]m'-|(in&+ d@|AeR53ftÂB.ro^wu.`N`㏻3]jҤ?;@-0UCоOA?^>mkEs=wz衇ԴiӒ"ZfeѣGR_֕`Y5?$z]]uU^H#<;$O\o0A7Lt zWN+2QqC7/_ *sW_}ջojTtCJ-z xAl ~o;Âz'y Lqlx[҂R*i Ȉ7莳nWO]&Wg=OVm˷z&̘1#a � � � � �@@`( aJ*|@�@�@�@�@�@�@�@�@ Y6HO<!]z)aZ2e=qIkHƥ?L˔ƹ [̇~ }j۶mMZfπ%=dX/PAU~]k/}zt 7n _WuY\XƦK.=o޼jծ]۫sQܹsQ$mG=#Up~*gѬ`}nXu:~-?]v٥E;젇~ <xZj; h֬YoCmDe~оOA?^>Nm{rJB,8/,!àAto9|={fhcۉTs;E1ÂHD/N3sLY@jU \oHA>q aa5 Fvd� ܵkWu֭"gϖY@r߾}bu)*;Â[z;ww`;*PNYQN L+ٮA[˲D{Ϳ H<rP`́w 9+2 � � � � � � O^| � � � � � � � �[SNѨQub& tAx Er=trhIguUxC# a}ԩS3ln:KySYNZ{#=`*붎m-wQ޽ vZ;Tu .P&M^-[x>#FuթS'֟ "Jz뭷c#:OW%ۛo}7:]:J,o.ӏ?( ;Su,|/)f%BvoiwmZpg *bm?CSǎ6ŽLtr.}ڃ#`a{O=N̟?;+ %(|a;?X'NT6mr`,j!*UWSOv\ē}R'F=Yf ;{O;w{O:duMO<Dmܸ;+|Ç_XXŋ~zꕮͲ'0l0>qQp`F^~e}k  � � � � �D=^pEBR`�䰀{Kq{:Z@# � � � � � � � �jL*r!ϗuM|]w\(t)7%]㎓ d\ܵHetIe֡urkaX~ys=1c:( 4HsLZbŊ|\UV dYd]ڸ`__~ ?^wu }+]kءN: X/|IM4I]vՐ!Cԯ_?/2_u} KXV:%ҩͶ)`!%i5Ju%\\o}Qlva;w xO{G6K,ݗ-[i5m4b<7QH<.끙3vg!uV: z&wdep }=zh޼yw>7euIӦM|%P�H$P+؅lkun-Y� � � � � @X ˞ DVSI@�@�@�@�@�@�@�@�@ )_~)}tIY+A .KBOy'aZaRc2H&=aZJ9䐴Q>Zuy~￯ZjyA97ֹ瞫w}W7o.fĎiI-TV4zh <XӾ}`[z^{MswYf:#:mO`mBlAVY,pBN>d5j ٳ�SzZ'pB(´ivrFwjt^ǾڵСC~Si/Fp.u*4O?ZhႼ~o{9͙3 Cpo u0^oT^]oZlݻ>ݘ[\R/|!)Ko2 MT0 z`;ۯtSep:T´ʦO7l+EBi˕+mq =ǯTR`CA@�@�@�@�@�@�@�jM@�@�@�@�@�@�@�@�@�2,^{I=zd l4 I5`?Ʌbil2'wtIO^(MΠ-`&C3h…^u}QG:8p^x֏r#j)SoTΝN-x:ꫯwyZ;c[XXh_y^ Z̙3S}V@,pGU߾}U~}wM'/4kȑZ`>)lVWI&ymAs=Sٯ\/[l)QF�'~z//B9?]uU^ 1cB z#D 7,{YeNz7xW{dhaek[=[T(J$[oI={J+'s/25}zt&j-^8nvw&P+3=7 +V̽Sc@�@�@�@�@�@�@ < x � � � � � � � � Vu-qGvד! ,_.y\'2E /{tizO}Zz>To*Y<Lo\tW^yEgu6nul#~ҥ t| X8{KYiFӰaü\rA-~U|ytAK6;Ԑ!CԪU+}v:uz[|0 [N.zԩSUn]}zguGzabܲ[;^;q]wɂ,?eEH$"kډ'j.j|bvJ7rRdFժU5bkλ~֦M@1;Wi,pGg-.ۿkAv}-w0zR,aذAzmryoe'U[K헹2 }J*iѢE 7ڶm[ 1gA-yj� � � � � � �$(X$"E�@�@�@�@�@�@�@�@�xrF[[$4[g9<2gCAzH ߥڵF[H}uN%}ԨQe@\ kURew>xZd1@zuO5j[nիzΝ;:Of@ ̙?^61`a8v=ǝ(ؘ0.h탵|򉶸}k#ڵ6l_ꄀVO?k/i&u18yYYFX eԼy6‚,0[ϥ8Lr[²,@k„ ^;aS;5kYȞl\o1B\5h /47-GÛo .GcAZ'tRdp.aڿ% rJ#gA S_ ̆=:?㱌sΑ{rSҲ XȬ<8.r—/^={=$g 6lZd\J[[:szwr@�@�@�@�@ { |!ՠ @NyW,<>'J4JV� � � � � � � � j^On]s|驧^ֆ@ ~X.DC)%Llp먣Z#GM&NuJ]VcƌI~M|}/hk٪Tb9b[0]FQJ hʔ)Ͻ`( %Z`C9}Xf&NVulmxFXVʕ_ ` v-4BDԶm[|^a{;ckY}V\uz탵]t 3r͛g}^oc#mA^d'zc`ݺutk߮޽{o[W]O]};v< ^[][TQ{}{ɵ{sMU8!\ [9F~\8vxvn$GV**`ʏq-R|{V^MmZ1i~IV l3Ԋ+kß � � � � �W@J� PH&PV,� � � � � � � � vjmG%pk$ߵ dQB(0ztIҳJ90>}瞓*V̩g[uX=ƭP Ø-XdԩڸqaZ\"a\gȂ*Tm/_|7^蓅_㏲Ν4ihuMݻwDŽ?ѕ腅XVXٛuo턵65j(YT oeYaP'O N~,$T=am~w.aŬY^%{>3 _~%ꫯ |^ȞZa]70Nҹ pQ}`aeAze!>9=^wͅ[˖[x ?K_}-vu@-[W׭.7^!gR;6-I3'[>\OrrZ;LZ#<9sEq˵jen9{򩧞-[hԨQ-[G�@�@�@�@�@j�E@� U@V$ ���@�IDAT � � � � � � �"P/AY??weY E 3gJ+  =PK s[#GoZj饗^R~ҹ@okÆ ^ Lq?Zʛ7oVjԾ}{k.ojwi@׉…[`ڵwЂq[ΝUA ϥvE͛7w\H$d ײ�L|ժU^�l'vm7/+բh!N'lks6mڤUj 6~LN_tFX;amK6l k׮XhQ9Nعʕ+U\9/,%u7bvyTp*Y[Z7J+sǏСCx]C :TR/Vzu]wiܸq9u]= {ٿR6ߢ]k/ԝJZuUR6rq}]vY|]p=P.!k\"q=Fa6ъ7^rB 9$piy!G˖-Sz#8"r6@q2go[>Uzu1"a � � � � �@@`( aJ*D�@�@�@�@�@�@�@�@@-4nY_J>@֯8 JGR*/2a׷=VzY´UOԵkW͚5uK7w|z̵{mSΆ5jsx{w &hժ֭RX`ۜ9s?kƌ駟da86:b^y9͚5LjwFL:5u֭^pѮN~- ߲ga& %pB{fnmm,6XFX;޶m[³M| ٲ`- #~8{.vV4ob͚5ym˗/*hmF>.ƚ5k 5z#;0z#};iɺ;4j(߿<L/0}H|gF z=tWw-Hk_!CgYhݝWI.݋e!ZJժ[dwπ끢Xt\D~ModZ x%gKMwl-_|wBH 55\'Z,MVmGuwO'lA: � � � � �% PX,�dX@(D�@�@�@�@�@�@�@�@�(R7JgQ59!`Ĺ<}aZc[ʱc㎓pW.!w-2UiӦzy3Uljժܹ7zem#/ @m ͱ0[h:-Fu(,pɾ/g7Zgd['6ԪU [p={za8~Pj1O8N+ڵkkxwXb-[zmH yWv{mlRDXpG{S Ͳr)P^=/\&lƞGX`ѣe\6/_^͛7~M\rxN}Ҭnڴ;Ǵ�N}6^[`:vX{am1S`0}W?~sO?_{wpKek7^rn=~ 58{$%۵kO<QzrmvݎB\m^ѭZfٽk.ݱ[Rկ_ p=P?a_g )taZU ײeˊ,ݛ`  WR@�@�@�@�@�@�@� s0=2Q@�@�@�@�@�@�@�@�B#p)hKF BSB zM}z [Λ\u5>#gYgI"rQ ,3Ry)´ kxԩdlgÆ y(p`Iv[.:Եp ˰if;Z(Cp6=h[ږ:Nozv0 F0%?ivSÆ [YJJ;a?mM ۘZVX`DFTbŤ$__,^xv¾ʕ+6nz~pM6¦vG/VX3fxmMcۈyi˖-^طo#l [[\UVC.\PXreY0.aD5[YJ7p]F1chܹor!ѣw? 2îQ&M?лd1v?㨣i޽{9*7 _p}f}dC-زi]i^hՠAai@&H -NR|wY+wRÆIg]ϱdv{コ;d2 ^x{M0!b953!;իWN=ӕCjѢE.JNnw}wN֟J#� � � � �S B8O@�\pxrse+b Y � � � � � � � � P"'Gz}wI]$]qaZq9Xطޒ?^:T's! UΏ} TREm۶־`͙3'/$:Զɓ'{l[͛>j ֡mW-|N:, <[ljdŎֹZu||[0 1p4 ] 8 U 䖀7|v_zfϞ ~`mX'޶f͚^^ډpk#lVu) Xlǽ XO.mM=?ȶhǿf ڶNX@A7)-o`6mڔ>m?}w6¾~}f͚!|s k#;,SܭC|;=}FĶa֦۾s QҥNrIıv^1wH.Fw,)}׮]e<}r7Ȇ.]ݻ{m{-=S]k|n6[�_~]L6 sݍ}z*o߲3m~,_p֔)O?]I9//<kР}U;\dz~\ޮ,c = *cY>;z}ʲ>V;w-sQF6@ ֻjA<ϱ@u@�@�@�@�@�@�@�jo@�@�@�@�@�@�@�@�@ _Jt)G C/u(zk f(oH'(  =aZ K"ҫWn.иqcٸ֭[ ͱp- g/"/:,VZ^~Vڵͷ3lz_W^:21;eڵk?C6Zg+Wz!t^b٣uh b9feDPd!ᄏzNbӂ/l4?"`7{7[}`a\b÷::Gkb.Ķo;As6 ]m#5}vv 凖Y;aaE6z]RJ*i]wxݸqw1o޼B Þ/6|Ybż o6Z{U<ڈ v.6v!m_?Ķ9MsF؏=4;v?h^NF7JgބwJ/СCA_O?Մ ЪCzav Rl׮{o[첋ljלYtݳG 6="͚5-y :u{_vN_ [n_keY.7A/8Swةu@\$4k&߰h;mr rEWdS=ߩxj 䮀|@�@�@�@�@�@�@ XeEi@�@�@�@�@�@�@�@�@�2 XzO?-~u]ձ)׿JsJ|<;BycH'$qR`n^f͚D]V煰t" vN.]u;2O?AX(Dlٲ%ul,0:\7D+?{ԂwSzۮ?}OmhaWSp.jN,: p :~M 1Q'EmBc=\IZmm/~hԜ9sB,,ڈB&-6qf6S{/Q 2ر_TYklVw DcB ^XMl࿎m# I-[zcQ!m#b_!R?s^蜝GX0uY.m?|-(8ۆةm? N k76o k+\>h2qn~OmaS <{Dg^ w}5Ⱦ5J,`r7KZ7&?[k^.ozb=/vͷ.qg} - +Vdٿ%J, ϲg!H ͺmYkCI}Xx1q5\ā 'J7,wԦM@ cpҋ/Xũn+'۽xj0m4#b�9 @Vd� � � � � � �;P6 � � � � � � � � �a?^iРրr#X`XåwN,sȔ+H"uÄiej?nB.\HV,J_[Z*U-,l1,8ư̾j?7E={~]Jau H`$ ΰNjcC3u~�M} (8ɀ@ qҼyso,mV_u]QwkyU.m?DmB[:c`{okSbFX<*` 6ﺵ yM-d%bG;C=fu.hQ ͜y xڅwED츍&|]il{Q6\HFlaE% ޘ2$wRKzܮz#5xQG+sA~?bS;<;6т8!=ߢ]޳,0)SSrU}{ɲgu]e;ؠAoT9([oz >ɥ9fI' +]|q.<Xu}yz裃U.J>j=BV [B v˵hPB�@�@�@�@�@�@�\ P+>uG�@�@�@�@�@�@�@�@� <ԩSo "bKaqTt)G/$vt9҃UJƤ´#ҦM&}ݬ0|ֱ+%1HO={FE S7Z]v>̙#MdZdrVFByVz>)Y?+E� v-no LA Ӻuko Aq)b ru,?<k(|SRra6mK)H@+B)`N;I<*dMGN<Q.:kDEJ(P^԰niƌE-|r|S=@�@�@�@�@�@��Zu@�@�@�@�@�@�@�@�&a4zta+9ExRCoyB FIK/߄i?/^nРAŘsNz*G6~zH@� ,X(+de \ݣ-B@�'e_Z,Z]vg}vtڱԼyǖ@ |vx衒[ce"YPӥɓoςPR T^ڵk\Μ9X�[ڋjժew% � � � � � � BB(2 � � � � � � � �S7UN g)5xBzei8nDK2<\4碋Lj|Kz3ׯ!䬀u~{ĉ엀#G\xhqm@  H'u rLKR%iҤhwU"�iSgM"}~}nVcNGS'mcC "yd"&H͚eAB\#&Mq%(z@u. z׊\@ {ֻ[@[Ij� � � � � � �T@8� � � � � � � � �9RKj4|e$;W_/DN˜OJ+]vt睙+[/`Zʕs|$W9Gs?7 5.ҥJ7$qF. J+D WK{"@,eYӧu/daYvompvR*.G�lC餓-7:1=FRA( eȔ@ժUM7Pk֬YD"sL"@֬Ym@� � � � � � � P+ #� � � � � � � � �IXJx +eUD ͥoH(1>(]rtuY *Cٶ<hd(iIG% P_FۇΒ @n,X uu :ݥqR~֌�dْf}utj-ZF~Y;J[˅dduC�t tqIÇKʐY?fΔ l9z/1sƍEUVZvϟM< @ Zo@�@�@�@�@�@�@�%@VA�@�@�@�@�@�@�@�@�,x%::, Yg~[8Q_T9kAŃ'pK*]sMG \Rkp#U = 6_~9FCzm Hj5nV Ժ^]l%B�&eBˣY ͺmYMm|H$p4h{СgO%K߼#6m}M6R0*UlӦMEnaKc#PH.@ +@5jde � � � � � � f¼(; � � � � � � � �F>}:uBSd @I]&]tԭ[�if{NX)*:*\Br^]Cn,(UC� ,[jTzE"WLX#`7ju]u'ґG5G�|륩Sg}n]o=Yv ժ) zWfMiDRMP< `|⋋<Ke@9rW|y'PK^ճg송v P�Z& � � � � � � @ � � � � � � � � �,`\Kꖋ\�tmX{d뮓OᇥrI)/[Z5O9.K^+T6ltLvț @ mWKkJmlTaCiݤI]L@ ʕLM,eZh}Ν΋go/U`B�R(0gtE[oEۥ;jp:=?h<q_)J*iE·ZjeY�S@ܯ @�@�@�@�@�@�C@؏@�@�@�@�@�@�@�@�,+RE9&hPפ^vGA X<CH/=?tS<ׯ'P+a^Xq 7&)Hg)}GR&\;B�/`AtYoƒ _{M%�_Ο,0뫯h͚׎;F<RS'iݥ_oj�0nMjB?^# { {L6L:>}# F {(*T:]Rg1 Ԛ9sf1dF?ëV5z @�@�@�@�@�@��Z}@�@�@�@�@�@�@�@� 0jtR͚a(-eDhU.8C.Huڱ[ ^ZGzqީn W`ƍTRp H&׿J֩_GIӶa6�*ɂyGs@!@ ,\`FY^Q�i@矗6m&N& RٳgZG7٬Y40ӣw-<j@� gVZRzir堕47˳uy~}rrӅZ/Cb~Zn? rF`ղիL( � � � � � � ²(' � � � � � � � �R`r'e)4 xnt=MR&'R^ks9G9RKYXq6 JnVkA9' .k NQ@ < uW#JX9 Pι6,rQ@�-zBg߿Y�ݏ1#gԞYvEV?y[xV)>A� XH 7H~}tMq22~\Jkp9(zαg /( $ (gFF"}QJ' % n aҽY� � � � � � � P " � � � � � � � � @i,|yoҮ!,?:֫Qhy5nԽrturhGfC6p˖-`2ҥю.9 A@ /-H @F.׏v֝Q*6m$ 4@ڱT,Ӧm ϲଯ#hҶm4<cZ @ z4Hk#vڡ`$}ʆCVӤ瞋sO (}غukZJK,q|M) ԪYfNՙ"� � � � � � �a P+,{r"� � � � � � � � @(FzP< ]XrMR&`Z'FWoqmIcJo!|p6ϊS,`ە+W.[aAh0ŰaA.%eC�t |Y4DkI _`Q�T[7飏//'YHƍwm Ϛ<Y:UZ^REj>5pԱRj/kD�!`Ϛ^xA׿m]߾K \[kрK27lR@VZy3g$P+ 8jŁm@�@�@�@�@�@�@ �j`'P@�@�@�@�@�@�@�@�N5kޓ|0;GrOWwߍ/{ƙjB&,oCBˮ]3[>^vn5<J#թZPnH?K $h/ *`Zu-|&н{4a;B�#`W-,B*:0- ղ }O:hVvRJ)�R)z=H&r4|8AZ4O#DG%ecժUU-Zrʲ@8Xa!g_R@�@�@�@�@�@�>oR#@�@�@�@�@�@�@�@�BXǃQ  ~4d4pd2 N_vM ֲN_֕40 XVX1\K^(],�9 tԧ1u~k  @P.5 Ji(d@nҢEgCQYegm,լ)u() ,Ԧ bA܏ &㏒[x=c:,˥]v)ztzn=I7Ŀψ/sۉU|yΚ5kVn�QK'@V>@�@�@�@�@�@�@�%@VvA�@�@�@�@�@�@�@�@�lx5 V%W/ibɦ S2Zr}`'yR^gmYւ;8a}8h0wx ,`}+m$Yfi.�C�@-o@b6HkU&M}) #@\ Y&,״iuGóԉgvtUv,F4f{EónA:D s†cK% 2-[jΜ9D]@jU@�@�@�@�@�@�@�+@Vp %C�@�@�@�@�@�@�@�@� XoD;$ q5(:KԴ)(W~͛%tRzeNp*T@VpwOJ[oI2dV@,W:|7nSTENϙMEH@JR.GIg ;yYeZH"I{q kg+YY$>]z1ipiwoWʗOQf\!,Lukg \XvWj\\̡Ejӊ6UVc?2ɶJ}@�@�@�@�@�@�@ ;ʎH-@�@�@�@�@�@�@�@�@ `bsQJ!pҎ;JK)>G(^sMH$<K瞋s+`Z[l39eICHݻL($ ץwߕ=B�2(x԰a @ +@�Dv?":~~TԩtaҕWnհagh޼~޼De -+VDϩ~Z4Ii' .+!K0YnoH5jdI%F,džZj{=-[Ԅ < "@\RZ0 � � � � � � @ .@ � � � � � � � � *i>!w~Yzq顇UsׁgFg_~1^lI* yԥtՄڄjmɐ3/5o.|sT"@W9R3B�2(vfԠA @ +unE>ژT R ̛ ϲ�>&O,fhx ,u,j%+M7B>ta2\Kb@�X`&7gƌ}F;–K`p^ C>宀Pvb#X֯"'U4 "@(I{Rv@�@�@�@�@�@�@ ljmQ^@�@�@�@�@�@�@�@�uu챡(*D G; 4(bD  uZ ҲN<Qh/ɻav*Za[e/OKcJ'JU}}-0|R]vtmti G�6N/ ,]a}$뗬uO>g}dZUJ:H'uVtbƏC{qqb@�P`f^^~YZ">ltRZYXi'`-DK:0/H jѢ֯_EQF0"@ C;"� � � � � � @ . � � � � � � � � t9siӤ;%|$_*TH,sHJ Ͼ։K^*5o쭲L TT@Ly/B/8ǎc4r[:?ܻTꪩA@ vcC)E�%PԾ4iZ2e=]`1oAz,}eԶGóKr͊5X�Duqǹ{) EgGKKJ;K^+rprD´lg}ސ#UX|*VvءZl-;cƂdU\'iY3 � � � � � �d�ZYK � � � � � � � �dZ୷5=2]@Fw_˶>@I֭ihx֙N;IW^)u\h%]#]:۴iSЋI `9׬)zkV*@ 3gJ}J v眻.rC`h= ʍM-H@pto!@z,eXiܸh ]կ/x`4HۢZvϤ4Vw#OWժUOf|ڵ;H/,2rԡt]w \)P١jY cal"t2ڠ7o7okܹҥKL@tbZ-@�@�@�@�@�@�@ pjnP @�@�@�@�@�@�@�@�oK"UP\8Qp8!xׯך5kqQF{u.mӍ7:n޼Y[\RujcYgbc ’*FJ*V٫ujGjŋ{:lr#n'WV 傷3(QR*UDVR$W__Ε tZ`Oi/G$G�,`Zr2K(L[7GDۚ–=҅FC\Nk%;w=y5~x}Gt<VG9Qs D'6lG5OX؁=A6.a bM{?i5޴z60v!|uQ#.`Ҙ1һJ+]-@HViKA{h$? Nю{jcGu|; Yn}8㽰c?cu; a jذa*d)4i9ss,�5;$P+#� � � � � � @ !� � � � � � � � @\P7N׿2q6@OW/ÒRVul2ʕ+bŊ|zjZʛk},<:)j"SljX~GtN{mXڴ83;;Գ6mSt7ƻ4y_0Kf͚Zjy[GGu:<?֭[Wӎ;u1^D@5m"3#HX5^B"=V.Szuiqp1A@�t.wD=l"@:m\pLo=L?x㍺{չslfݫK\ҵM˽m(DўOXg=gsxӂ(9B<Y9cC}gE 3 McG{`!b{\Em#[\Գgk岓W{Dvhdg[OWjԨc옶c~ҥޱnǾԎ};c}{mǼv%X6?,X/rp<UPʫ_ ?F{i5XЖkG{hyԎs{hǷ?vhudj5*EѲeK) i;J 7A�@�@�@�@�@�@�J,@V� � � � � � � � � _`$>}/.oKf|… hSkۍ9uTgc89cӦMy֙J8ko^['taJ: Z:-j:N:m013O?:>1ײNmlذakdqh N~l!W_- t=.[C�` X_Lr<]v%X4 @!R]72@�$h!d-/pҔ)�wկ_?]r% l6wVO홅c#`3س e$5kmHs g}?BvlF?4̞GmZ0\ΝHf>Sp<ݱg,g,^1穧?YOz/0@-wߍ>gkͥnA:P=b#`ǰ=޷iq_ً=c4iD{G1oǹMv۱_]v9؛.Xvxqncݎq{mwg͚/̞ ʞ5ڱnǷϱ=sF;Kv Iv;΅@�@�@�@�@�@�@�'@V %B�@�@�@�@�@�@�@�@� +!EyW:ܥ謳_Un)m!Yq!MyZ6m';zY'ka\2_E:Gu~g Yw~Y?1cF^u;X'ѝu$hY'Nk{Pj(:0eN?}Tzi5}  G[{OI6#orKAuST@n@#v#GJÇKcƤ.LkK,8pwO߮ ~mXa*~ٻ0޻&&E)""kEyEQ(EEHoREt͙}]6m7ٽI<!޹3[̄sv$c'&q&ѹ'a_r% t~Iu��@�IDATHGh+M8&-9#gb4&:ۆ k%9&Ô?8Xh#7MjԫȌtAOyG:`I,IHu"< ҮHI׉߲e=8IΜ9HDZwrI {'ADd ]& $`z GyD=םDztQߺud\O>|Mo˙3g8uySVS4FFP+nv9E�@�@�@�@�@�@�(G � � � � � � � � n ֪H'`Dg%-iQMi&l֭[mP: L(h@E'6kذMTxq{ V@hkIoz�tcǎdi0͹i; RիtwN; +V[VQRbOY21AcxU3FDEhZ�]6AJڇ�,дH~"f$9v[@ 5p>":D瞓9sȼysk>|lܸ4ђWweЛw%M~ɕVjUiӦM Y0ݖe˖,RxR͹׹ҹSڹ s˗c)z_R%{ lbH'J)o)":]L8?_XohB~XHLmn|zr'Os}6^w$yIT^=ԩ9)I(';wnR獃)uQmgΜd^Z7uYߕ+Wi:ׯMEǨu] ďmgs6@�@�@�@�@�@�@}$r>E � � � � � � � � G,Y"Dih6F୷%9<&rԀtz[n]c}IA52E"sz) (N�J+h S |}K.AO`pK'']*Ul; ~Ip* sҟ;E;$O]"N@ |_=饗Dz5P%)&<B� +&q{G@ 4֡C"VԬī!g#'0}t8pK֭ QsX4&ߓtbfm_*:6Iׯo5t|YPbK  /gtkϞ=I֜dkxm„ 6 3:ץs]tWwm&ɺ:E>&5q&Yr1!)5_"׬Y#k׮M)Lq1;ҹڞz ЛQʕ+vg9rq*zMN.\h;s]]:_l:ю&'Ԣ_rQɛ7o<D^/:3g(l=MF�@�@�@�@�@�@�b_Z! � � � � � � � �Y ZH ,pȻ<5EmܸQ~WYz J4(m4 ޮ3YtNfi# hP% p۽{ f4`ޖ-[&_~߿߮4[UF6e<#VJGQ?gNy)}uHܹ"7,p=E#uPX46"@ �TCdjE>̛'G"TXHsk׮r=DbԙJ+LfU&;~3֭['TKKɒ%mғի5\c*430+1ZLDaÆV;wʦM\oz<yM$*fTV-VV-;LҘSD4H4$:Od5L5Ol.b>8y򤝣\n2\z$˓'Obrn>yJ= **t+=ϋ/no)LK|&c9pM6{lپ}u@5<cMN:RTPjB2-RI¥:gKA�8p�ű! � � � � � �D� xt@�@�@�@�@�@�@�@�pb-v+1 D35G`K.'0YlLci&wm\do(@z XD {Ki;}eNBMuYN_ zWvm[ |Wpsꊅ'H {>< @|r"W^)YVPxp&bDž;&!C34nP91cJ\ 'ҼdW?&&,#FF5(k֬ŋ˒%K|ʕ+vIɋ:vh,VjI^TX \&[3dU4Ɏ&YzuMُL?ou5&;\rԫWό;p-I#f«ruY3c(ZgE_~e˖k&<ʕ+Mf~v)S&{M3Z T vW$iΑΗM{m6\Q339ޠA)]t:bM86 hK-Z<)(X`t6V#� � � � � � �q @B8t@�@�@�@�@�@�@�@�G@jl>b+DBE*!I$SN@t M>'0@O 5m&Ϊ^h@JQ%6lhom`\KMkk.&ӀNׯ_~LPKmM&%KoGO?-2~@Q �iػWL`1E>\DD$/7o6ߡ܅@}ǎ%$& -B P k?ć̜)2kVܹse?mسg̛7/X@.]*̇Ĝ9sJ͚5mMvkԨ!;@ 4LyMo۷Oܼ&ڴi9MJ? h&Ss4^>Sp0_?uwΜ9W/,TQ'|&%R qsǢzs{Ŋv}y\\%c&M\&yX([Mbϡ"EXMEA� V|gz� � � � � � �+@Bw@�@�@�@�@�@�@�@�\$`D"O=FBزELP< a0/~рtg϶˖-A銚\rtDZe˖ ֩wȑ^U RЮ&+b;?n3VVs͚5ҥK3! ԧ(s})9w.z}tꔐѝU IN85p iB={F)ԍ�E`߾jHN*A�?P /!  1siO&cנA6nDf#Ԛ(uV m2ف4P,YlFﲚjժ5+!xhKfK.mghʨQUd۶5M,Sܲ'.9lҬӺHrȪUbΗd/D;v3fLf˖^wuo߾vR(Y@lޜv=zԞ:Ϩ9_{5yGl JVMqEjirM6FB'zIA�@�@�@�@�@�@�p�t~U � � � � � � � � eHe%/&0j gk~-?tIh P^ԄYM4A4h ʕKF%\*PX1 {sI-Z$ͳ#Gǥ|Һuk{wŋwVqZE!5l01A脴" #@L=+ңGuEϘ)u숉_I Rz@�W ϶)fA3f׋I6*HI+[3{nk>}Dd^m)SԩSE˗O7n,~h"K<y❊ǰ@Q3Qضm[{$Z6nhȏ?.ٳ7'Mr&g#9+W%9tI@I4S ͞ N8agM<Y~Yn=u;͛s?gΜ _X o޼)@rs}<3;wniѢ@;{rk׮Zj9 dɒk׮cNMUpl<F�@�@�@�@�@�@�@Zq" � � � � � � � �D^`L1yڈn*[ YᅲI&ɂ Lн,ҨQ#ڵ[q\]G S@lutӧO˲edƌ6�]w%G:t ۷瘞wn+ٳgM҄Z0qD>HJZ�~1"\w7o/P˷ {H}AKu^!Vg{C\tmrd-akr#FxpÆ weܹ&a6$:{֭[KݺuF<w4nfw^; 5 6K%<W_-6 sJoM8QƍgDÆ < ҦMi`2f{yhY +WN;h2QM&?w}rJΝK.Ȕ)kVZؗ4Rjܹ35D_fblٲQr� � � � � � �ć@^"D�@�@�@�@�@�@�@�@�dSĉ7Rn5l ʱc7|#۷o/XJ߿4o\H~wjO cə3gl)S^x)TtIZIdbN;4)%yFLa~R'K"+W"c˖-v JA�. 4/mno)C�XhTLX }@ >31co�|2LDiR-J֯_/cƌ/B~7$:t'xBZh!9sLX(V\]ݸqL4޺vjQuQw.K3ܑYȑ#6nϟ_ڵk'#GsG. V@i=y<Y|L0&|TRtu4ʶmСCRFTJ} @|hB-@�@�@�@�@�@�@,Z� � � � � � � � �D"˖4j=mx hO+Ui{b ۷ WZZj%+Wo޼YV^-mۖdZicfm d͚U(EݻE7�4;d֬Y6("&BBCGz&<XLo@u&I(s5n~.,^Ν;,�d&*\X$S nG�ЄZV ݥDĉ"Nxc2m4lZ^u3~75jrwM H*Ul2-yM6[oeLջƹTRJr˔)S?>@馛O޽DF561A=Cvᅲ{d`$ʨv. hҬ~Z~ٺu<2g[T^~Fф4n(mFZj,YRvH~A_  � � � � � � +HB@�@�@�@�@�@�@�@�@ . "GSi+ L\҃Hѱc޳=5֒%KgI|O.</_>y".PhQモ}ɰal6mڈ|oH  V (QG*5kv[6&#@LlbV1nT l 4V"nh m@�xhDL" 㡷kVo7v iu&&ի(QB $-[Md-0`%Fa b_ o޼6A՗_~ij\zfܸrC8qnjժJ>lg޽[F!W\qd͚5`Ě@2elbƍk 4 ?kF+VHr$-I/�!@B@�@�@�@�@�@�WZѻh9 � � � � � � � �D`D*VtIh!,_.cUWREw)DL=rW˖-[d̙6g'O2^ O<ңG?~9|˧~* 6 iڵH'xiPIJM8modWQi4з O:vykϋ*T~D�2PZϦCbD*W3';O2cD&O5 ?{ӄÇoqP۬Y/:uر1cȶmdȐ!Rz8d@ܹo4vΰsO9{& w+oylٲҿwI.]$[l$!͏c\޴i;־֪UKڷo/K,^XիmkNMw4 ~pI)\K @�@�@�@�@�@�@�8*鎧 � � � � � � � � >ѣ?9o_Ԅ@: hK }{{$(͓?{gmkd MzʪUlp&[`֭K&9,Ϝ9.c#013"MnjC�w ҮIZB͛7Pݻ!� 0x�"߭MMH?I ҩS*IagyF.\(_}˗/%x*%e˖I֭M6R\9YfrUWUHɌHҥK;^ѣGKmSN M>Æ DZ:_q( 9}С_\r,XP5j$\sozMu%i%ܹ3M2_௿$-D�@�@�@�@�@�@�9 � � � � � � � �I`ÆgxT# ~' r%)SԄ7/T\Y40֔)SlB]2xFD-Z &ފ+ɒx9rHDۛ%K[? "?Hdz矏&\(pXlDƏd8FnٲOm-F�2FZVgMer@p&Ժ"_[N*7xCjժc&ӧ4h@J*eƩ| UT^5O Dٳoo;#ժU6yO<!޽%{쩭@ z>'NUʠA|c* z]vZN>jMςD� vp@�@�@�@�@�@�#jΦ � � � � � � � � ~G+Nu֥y?}5MF&B~Eݡ)ؽ[db dժU6(OdΜ9re_KƝ&`?ԩS'J5}'7oe,A%ibӧGd[Zi֬Ymݚċ]&&  rb-FWi-^@/_/m?)Z]RBVRH\,�a V1 hDqKZ@ 4V۸&o馛{r]wq97oVC|*k7oԬYS~vޢlٲb]@u~K]wkb3! /#!2glu_^:vhFN<.:t m"-_qB$\ wFp8#a%G)=zIƎAi}2f}Ht=EIL~ϥA3Н#G]m:kJ…c@�@�@�@�@�@�bjEΣ � � � � � � � � &6d\Cdj.wP-[G}$@MEmݺ5C#V2iP"[ףqIFvڲzjܹsp+T׃W`s6Jڵkeذaa #> 4oѣG^؇7_~Env+W_Hdb%VDx#Zo8  #WLE D*U qN`jyR֬� Vx0y!hQ1_%@ }4%Kb`2|p~_˗>Ψ駟^]vciMQpvOj;vIfrL̕.*} ?˗&Y~41;##KΜ9eРA`8qiF4 {M裏,F"F c۶m7zjRps#zy\ P9sFt"o<#ҭ[7g ީS'$o޼7+V6/NիW y%JMrJA�ЄZEB@�@�@�@�@�@�[Zѽh= � � � � � � � �dк&8OT%駟d[VZ<`j-Ma2EeKܹW6zh_? K"ZfJ(J[-j3g&Wo<Acɹ!k֬65I޷^jK2}DZ/ C"矟fk qz޿x( V?#-[o?w}//"@HA\F�&υ̝e^@� XVXԩ… mB\rJH4!Ϛ5kwVg}&v{ٲe +߅x1&S3 d~A8}Iޗpw{:Km❣Gӷ)onݺ6) +m^fϞ>ko wq\tEύ` ys1PSW駟8P\j׮{)c .Fm΃H4m4,UkB-vR@ 4&3{Wl;@�@�@�@�@�@�@ }Hl @�@�@�@�@�@�@�@�bL` 1 DիrB[ 7pN>vm\tĕ. ŋ-"}݁W`T <2c x<Z{%_eR8-ږpSDݽ L2:iI&?kݙ2ei@JhR+Sy$zLK@ mz7YLeN}]7o%KJ}Vs[?S}^@e>,RHw @ h<xjENq%j$N"+ۚ3ҲeKx1b~O{SQʕ+gϞ[o&;Wn%9H휊ϩv3F8 wyCgnݺeNv1_Zɴۚi:7ڹ MDq@̙Þd1s#m.mOM_Ϟ=+h:$V δ↢#FK/Tt"Oko[f͚ޢE޽{R {O3ˀ{-C�@�@�@�@�@�@�D� � � � � � � � � z1v"yԕo&IE'N~[,X Ǐ5k}goܸF@<~ܹS#\rIbȑ#eԩRbE4h/^<u]Oo{ 裏JO>9skҰaCYe"<jl&?.?̚5ˮ+W.8pTTIٵk\wu6ڵk> LW_m;u$pE˾}L7d/_>+O l {H0qt3 -ؾ} h"ɛ7+WN^~eeDj_|![l;c=�m޼y2n8qФaW]uC'[g=&L KI?(|3$mȐ!^zyP1=W׭[' 4i_tu?|]_>euI&2}tP]zk\ 58wٶm5J~GV<RX1E>>uꔽ̙3^Ϻ5 ^+hѣG.=mygFB2Yk4.6mW^y^cZiݺHLݷh3}?D(NB-`ᨗ:"'`N1yMWL�m@=3g X."ik&K|_JD^`m_5l a3#fLHJd&Ժ„ZלtMRjU<y{ة;М93&C믿nQ|Qzdvkזn5&4_5yU֬YسyҤIv믿Nk5m+3u ^&u.JT|x|ګjǧMf.o~Xd;΅o^{=;nfS_\pKMk1SOyF49M&3tР+4Mt1{skᘇJ/:?@羳޾TF$Nt PB9:yz^7nR>u\P $Iԩ#ę eK` 8ϝ:}<SBuY?m_$cF볾gtфkz\h>< 6!M:I™PKb[`%Vlcz� � � � � � �1 `~JA�@�@�@�@�@�@�@�@�T !(kk.sQ.o͟L�wxLjxcyZjYr$} ǻw <خczf̘紘Gys{Zli6 @} cyoO?)S]碋.d\u co[IX zX$�rHEׯ_eυ  M0cxL @I,1<gܹnkL\+0rǓ3sv}o_0^5< [7A=&؞}lyL9v}Gu is|G⤽LɾnyL*[O&a$\v`wΘ@_ֶk1AA=+W�~͓?~ i_u>/v�2u^@9s^A\%쵱B osС�#GxL0EOv|$ ii}GZDžn$r&+tIݷZo>cQUҾq᪒z",t >fP=bx<+Ǽէwn%/`A@棪_acl0A\<TPxcƋk9#SfM;6<}Lj3 4's 7ر7qsǣG/^>6 Qlgt|Z_^zK/1 E<:dst,Vo}Xlѱ{m[|LNnѣy<yxti7_&]$gGǓq*!q_r?0"T7nuT;:6={vI8c|%s?ܖ3:w涢szL%/tN\Cn*<ᜫ ~>O|<'NOxg;ww/΍`ukg9}; qPB髳/º;s۶m~:{<v>=\u|Iꢪqqx=EMߍ;I t@�@�@�@�@ _v@ ~Nf:O @�@�@�@�@�@�@�@�@�TXRZ"&菘$<tRc=&V#GI%M4G<(={GLD &&ᔘIZ1|p1AQF˗_5j;MLA>6A첇dOLp,1D5ɁduNk$&^1z;JL22dHk݆ gmI#&}Y>[L!^}LtV>h@${v Ydjb_0^ݺu=MNuo )&p}$I$&׎;dʔ)b@LIΞ=+/>ҹsgxN\TYf9cD <'zN깣DubUI'&@h?T"Ϸuk]_|ٟ^RW]&S1ck̚5kQF4A* `РApBy7$͒/X$1a%ytry%>k#<"Z߲eKx^>b^Ub~$*'!2bO~`3I`.1DW}C畴o_~ߍMԀ@O؆׉o- �F  c�.%k9Cɯ*l1b}2dL;fzvHu&wu>-Oׯ__֮]+&}ȑ#zj;odlwXz=ֺtWTv,\&;v,q|뼠cԹ5<x0ɸkk4_-y`493zsAD+ۤgyFxkW_6;e;q\, iӦv%y3V .@:8 ǹ \e`eG}';vDXy[tn3݈u;}; PWmzo>s>{/<s\;_p5U8a@u~7 � � � � � � �W {F@�@�@�@�@�@�@�@�@�w hB-SG?_l⩋.&d 0D6Ӌf͚I<yd6ٖD۹$]Nnk`E 駟�C]tA 5`T]F)(`Hii =z͛8qnFݝ<yRΜ9c9A9reD8ԩSGƏo{{カƍc&O>}ٞw]<NMeɨ.hJi=ztb|ӢLRiP ҥIt] Ɂ4IԲ}v{8weԄuz[|3;tPLyСCûmuN2u ^g=MhB-z]$Z͛gޓRJ٠ p}k&8{R{iٸqu@ Bg^bW?|D/i0ق }|s|_JqE DRM  &#%W;ŌS9#M%yy_ct(9g,sΒ9sf]DNɒ%MFqtH.iDN:uqFƿu֝ڵk'vQ'h0-+2eF]I jK},2_K-i}smWWJ]s5O:2guJ/`ۨ/Z_kN>m7_nkk9Frk?-s_ږ깢 ԨQq,>.c!f_碯 D_ifĆ3hdɒ&ljqǰ:Q w#V(� � � � � � �q-@Bt@�@�@�@�@�@�@�@�" r^ل<Gi@* D]f* 6O[.`@Z4 nc/֬Y#6lGy.l[ &/xHo "74 uWzd˖-rW˕W^)ǏoOl߲el5MEX={$f .Vz1ǝۊ;~Ijwhʕ+7P;+VhDٳg .1bk.έ@+:gK~=(fKҼysфtށt=纾>}_ 4z}mI&`4Qjui^K5k&<Ӥ7| >ֶ}&ҥKE*:-B'\C}/+ &vID*?.>98N|_`K}9"G=+ORA @Љ%--ď&*Y2pS3ڱcӎmk μ>f>sFκd|%kr̙3</gϞɳFMaÆ3dHŦPeOiRMp_Ϩ'[n_rykI|Ej*t[%mLhy uVR3L_}~͙չk$e~-1DP9e:윒^$3>z~V^mqsgy8v`Bӻu{)vuFvɋLfpGwS7oTV-WOn_Nk`/Z<y'uXO` ( � � � � � � �HŽe � � � � � � � � RJ F40HҀ[nMRJٿ/|Armh͉zPn]A_8qBƎ+ٲeɉ ukB _kԩru׉Oŋ?lN ?_1I^zIWK} ԳQFœ7p=/nVqgj&Ӣ <dpwqM<a:Rsƻ.b1yd' xzZmϟ߾"ZLKI4_|ҧO{ >&$P^u>AW)' "&ן}ěy8QB?KX ?p^P34g͐ͳQ!pn{��@�IDAT" XsF:ٽ{wd -ZKuH+I˜&\:9d8pr-IS^~eɑ#ԯ_߶?ƿ:*UHrQ vlݻɚs<:b \nY:_aWJOj\|M6y?m hb7<%/o$)s?\sNs5p<ϝ.{6$}DM>m>h9ߚ|O>oݛ)M5hÆ otTM_S@ v:IBݿ @�@�@�@�@�@�bCZ � � � � � � � �o'z74&]}a֬Y.`/+W.ɓI Sw~lCgyc=^#j"- K%ꫯ)S&Ҁdʽ+wMrJۧM} 7o^ꫯdٲehP@ m۶x1˗T$\Fn*@o߾&K1>'[͜9s-[VjԨaj�3'1бc<49_M5A$ol26m�/4z5C{郞]vK|MUѣz꼐uiÇbꦾNq-m0'|H&dsz<s[o%6VbvAbI+&oxlZ]Ԇ@d .YFdN  $Aϙw wB{ ܮf@:s'_~X"qHkJ>Fv믔9+Rʕ+'ҥnGS T;O˼ulR糆 t>4Rf̘aСdfnHis* fB\ZCܷMьL<9ҚL2IR4 7lZlyN4^^|E?9gtBk֬iM\9$/#_Js9 yl'{6$5}+:oڹsgyBΝvy*Dyd̹.Q: Ѵ$d;MM<=6{I@�@�@�@�@�@�@� VCz� � � � � � � � � } D"U:u`K.4UZn*k׮5I(IJ,i ?LIiٮ{;v蝽뮻lcW\!s=r 7kfslڴMUDc�N"!' ֟9sҟ9ai~V]paiذTV&7$3e]& }k֬TPsD&FԪpt}'8Me̘16 դI$MԤMI&zӤwL p]{ꩧ믿 tEw}糖`u,XЮ >CZ0,Ə/I/Nqɯ*u_[aToƍ5> [8q9Ԅ`5N#F6h`^WNM7$VOjQg4i\wutΝSϗ/Zz˭*pgϞɛ56*䍤a Rz{%LL_XLW;=F F_w 5x{ߗtQ# Vd\С.jŒ%wඦ?HM5έؤ֔|xՉθ.=gKtNHt |OӦM%ңG],II>oo;y$C4Y>裏,~/ZcZt\~E@N*/gA_)qms*z2_S~ٲe :Td<}ZRs۸5jع_t~DZM:1 &3`Kr:/Ҷm[ P܄i\ΙD>;S "жt>XbyGeÆ vy8+ع`?΍@Iq;ν}Xv6D N*}^H\_dn(ͳsٲe KǫTj*q8U/ {Oۘ;=% � � � � � � �  R@�@�@�@�@�@�@�@�@ &9KZ$>:j[3mzcRۗUT>iyLOڵ== .R0Ⱦ~I gOٲe=&9G x֯_ۓ<gyL! eMb, ֖]ϾfyZ޽{6e zLMp)_ XXẹwŶ]vsL �n=OLD ]53HBg77xL`= 9rHy =?L2*I?ϕW^i5=,^eʔǰ )RH~„ ŋ{L.O6m<K,/_ޓ+W.?2d}YZ< .Dz-ZxLz LB*?9s�QR<ovdT_zJח`Wڶܹs{LOfm^LPCIh7mmzV1A<[mӧOөS''v@=4ocYp\Kk^O&X駟-o/=OL ĈlGߧ3gΌHTv(auϛo.j@� |.kIiٲK|_QFW[=['!�!#PX ]0G|yoBR3Қ{ϳ37'sRݻwc:Vre;vZSF{?֭[=]v}5jdǀMȑӷo_wC"l[ױ~ұ}ݗK4kc$|K.u<#<bt~D-PG`<G+tyT_0 d|qWC믿/թSӤI;?Ӭ$˄cJ+Lޗ`$syݏ:.Mn)ܜ=u^PL@G@iZpU:ǂ{s΋X"If[ v,_sC`u =ug϶EߥuzD}a߶,Sz$䝑u2_qGӔXr f͚ [A�@�@�@�@�@ fz/DbD�\3?^uWh#IR@�@�@�@�@�@�@�@�@ ݺuZLTULR^ jK[3lȓO8=zhH&Nh_0ϙ yb%YA|PLB,1 7ٸq@Wb^@xn҈ $&AJ&1d7{p ə3\={;zlذA*U$W9<@o)ZJnc7ߔΝ;^I$={xG&�b6 / &0vk&Y޳-:o=?Y9gUPpMj;dRs} dU^z8崟&qY-7^$bŊ 4jNbj_d۶mbm~Y(җ_~YL%O*c$gIV"ҿ}}ijImPiy]1[ĜGi@c4m*Ү矋yL;M�Ul}q|_Rd4jE |Ws>,|uR 0"3fhʚ,�X^JeDj71/c裏w挴ƈo!a趽爴ǎ3s fR!@ f;c)5$oю맴Xğ 4ޱcG4iqj5-R9r|y�W:_Qhu>{朝pCꋟ͇I${2!1h ywޢ-&I^[:t?뮻N^$skAWw Ai&q^ >4<z-~}:O9`|9d̞[/"Q7n,NMoI'&e늦 ͸i>f\+gӧO֭[G"� � � � �Ă^0 bb7m35i~W#b-il5ܽ @�@�@�@�@�@�@�@�u%&kݺu^K|Zh2_ETP~DZ(%p dZZJ, y5$&^cԪx^h j4?! pdnZ zt뺚;S֬YEo NN(OiwΤt&ow}m2p@D[_&2s Sz+NO^VHc%7qٲe_s%>aZhG nW_ٿRg]odPNZ&oni+툼ɏiu"V#`bJ Ml%m޼Y7on;%/p&S/U卤y :arܹ$ԊMJ>>}:f?䓲|r;^Z5+4Fw:'|:L2-mB0sF^/RYb<c6Xp+`+t9M,⫸e<@w}ᜯH~:5_cUC߯\rzj#/H GgU)*2hbM6~9)졖{׎1Kt_ 0gz±,QWB9>K:7)iSq;N Xk(N\FܯYFk<'DmYtY?[K6ED;O�bJWƘ$A�@�@�@�@�@�@�b@ h1Q� � � � � � � � �S`z1έ^zk.Dϓ'Ϲ D& )R\귭qٳ<Ҷm[drK.PoD9LT-Z$wA."ȕ+#bZ7nhwH6}IR`AQ$߿iO;g3gΔW^yE~{>ZJTg ^E4@OJA�8r$!~<9rD0y۶mdJ2r[}Ƕ" v_I9sNZ@!r[Μ cM/˵^+WkիWc&16lu]&ֹ馛l-mzWx'ImSZ/ZƥcibݺuvWDr*}Ϲ1v6̟~⋲g{>f,*Q:G`1b<3ꫯ&a:RjKz=ۏh^0s~^KԩSBMs|)$-ZHs])U 4bS`߾}RH)6 � � � � � � vLS^ 5 � � � � � � � � ݺuZ4(x 4~hJ EnAL`;p.\8uNsT牻Jd֬mO"h$*`mKʖ-Xɓ塇k׊&eȐ!@!6(0`�(QVwһw0n!iU.LfϞ- 6qI%.ei@QFY 6Hm@IM Z&R_{40tŊ"]{EK@ <zriKLv!eʔ fѸ^Kq 4!}I$CE/1t <0rbƲČen&S9wK)0p@yꩧ| s='3f̐mJ>}lp={|g}&g̗u/zkby 0ÇyDM&dx,&1]61ù=K]nJ[oɴiׯ_?nb2W\Y>裈lo& "R[+e6Pg{f\#hM ) � � � � �DL/hF�Gi4~DieI@�@�@�@�@�@�@�@�@�0df1z(Th n0̤jdɒ4ϧ~*Æ AIfͤGrJ"E»�i'Y`Iix)YF籙2e2 fɱc$O<f^?~x=zL2EJ*%wu ZhѨ ر"&o<@A q/ssii/K.lR)`r �*дȡC"VԬMa `fgo)[h2{J 4o\~G<zrK…oMQztkP,Y_7g9strCyjܸq2j({>V5d禛n\r_9Ν[}QKk}rmIǎ%[l=8Cbشi|{n+V{&< G Ħ)&"6-B�@�@�@�@�@�@�[ݡ7 � � � � � � � � @o9}ZRo- nTbkMO [/_.K.z$[jJ|MٲeKd6V H o(P@7otY4&ڷo|rW�Q}bŊɴidƍ6ҹHQl�A\'"_~)s[+ Tȑf!]F�Ԩ!?Ȝ9.i@ r1y[䯿ݯi2~k.yꩧdƌR\P5ր_MxScj {7<ԹG1cHný+ʕ3wwygĒiyFnk2}t*MwqL:UΜ9JDsGJ3P`&kܸL%;v<sN9rd$uF۶m1B&ͰNA�ػw/ br)@�@�@�@�@�@�5j? � � � � � � � � q?HDR@ NZލU+f{;l: \/K Zj˔)Sޫ(!5PO?- 4 裏J"E믿 5bi޼dʔ)[X7OdB1X@�G࣏ygG�H.pP3&P$нH*`,D I/w hҍ[-Z$֭ݻQXw}2yd9q;;@pƍ7ߴm;<իd6\>Sٳg{Ұa AfdԨQ-H7aŊI41!_ #^e˖s='׷ ^}Uiڴ,]TVZej.\8];0zhڵdϞ=b%VhW۷~pEch � � � � � � O>_@�@�@�@�@�@�@�@�@�405yI(D-"#RR5[i:b eҤI6^֬Ym -Z5j$rJ%bHӢfΜ)3f0AѣGEiH X,Ybt%o!&ȥFr+ԍ�-0m]w<D}zo!�$$Є@ Lz><[@09?ʕ+SO=eoׯ۰a$[lҤI˥uRn]RetػwEo7o%JHǎm:=r̙n vC[n/&LoVz)NsW\qiƌ7 v43ݻw˅^(;wC#SLFK,!CD $Ԋ(/#y.v�@�@�@�@�@�@�@�˿"� � � � � � � � �hB:%@6%4bŌk&&áC~IƎ+j׮mV^j2hкre\2.@O-yٛ>>~/_|nljʼg7- ! 2n"#VZnDMq +LhFh@�8ЄZl.RLc}\ 硞Z}惟UL:U{=; xtYf\ׯ/yrR!qF;0{lڵkm,M>wwK۶mf͚ vBVn'Na?|2`�{k4F$aHI`֭2g;gܹ֭sK-_~Ү];TRJfsGھHMuw`Vw*-Mz" bC0 X"%`ǐh}, k|0j$"!*EJ}lfòs9߹aNrߟ9eK]K.CoEjpd� � � � � � � ʹEu@�@�@�@�@�@�@�@�@�'`Zu@@\;U,UWt ۷7[n첂|VgсTzuX]NԡCo jp0"uZ`ϟٳg{5kVZy!t7tW5555V8 ,ؼÄ�!n_H;J/,W81E/@�h ho +F� y/.wLկ^Z@ ԫ'-ZLT/2o^Z ~~YÇŶiFv://-[TblHOJbt͚7o7W_i̙ڲeӥK 0 ٱkdɒ aAY{f:wmԩO5n8/P&-`nzA JA'b"{noq֬Y1c7_ ɳk+9#{l N_5p@{r4gZ6m߾]jES}#{Ci۶m!@�@�@�@�@�@�@ /uf^X@�@�@�@�@�@�@�@�pj1?H'WREfkeZZ dEl~75rH>|UVvt)ul+˕+2r!`N .oƻM <+hgU$.Y 7FӦ�ص+3L׻J%J4 UBFs@ )ʔ s P+)O>jMȦѨBhРlkmڴI_~>b!Cㅐ8EԶm[oЭB+n1sjڵOvw}k׮x\ǥꪫfa]4o~gtY؎صW6m4!?DD  믿B̙?8{Z1;Sݻw>%Bpخ+Vd}oy Ԫ]v4ž@ [nz1>2C�@�@�@�@�@�@�ȫ�Zyc}@�@�@�@�@�@�@�@�Hz rj5jft).]tfջw ͛7+_޽{UH/lȂ7of͚yK{L1_ePvءKz,@%Kh:t萊/}~w f Yx}iFiРh#@,.TڲEr5eZL �@ҥ~>�D[ջ׿ȍ˽wA+,ԨQC\r7[G,Ξ=[Dd%Ǐ.U4pa\[WU+W.4>\zj-^yѢE66nX 7 ԩ:v(!ySjZZwϚ5KP4%+/q UVYK{\nC!P6FnߏoVk֬TZ5oo߾9rgqa^{5}͊cO?!;GC�@�@�@�@�@�@�#Gm@�@�@�@�@�@�@�@�@ ֯zNj:R Oil+6٭[7o{b+WX!+fEhԩSsyA[^ VI&.XN>d5lPV /%%K E UntD+Wf~^`fmT7Yp}&[h/+j!Zg1!q2ֱL ~nJs^ �@-$  z iNb4 n{yIIԝ.Z,(kֳ{v?믿+,dĉ=zZڵj׮Mfvo*l.S ܭw?7Vl2E۷۝FB3۶m[o&-/Rɒ%եKoܿ.\mX=yfoezc>6cz5+m,ƥKモ-׮]+:`c0Ǜnɻ۷oϰf_~m1"&M۷xb'jY  � � � � � � @ u � � � � � � � � @M50 [ V VҊN|饗fYq1+hAFlŶxZuzZ\ʄ?k855UV H4Zf7[:UdQdx]ϫMBŊ'<)S �#p}oH| =p^@�d P+6}E .g^.[^3fd!մp(*RDZ@<yUñ.䒬XY?[λᆱ-[dW XN KgLVUR=MnlƷle!nXD%.{իn6/BVTnlRtꩧzsq-cɒ%lG6^�aM+WƎkK,]t.yvŮٮo Ѳ,T˦ .>3բE6Nw޽{uWƤv.1Ą� %`_o7TP3 � � � � � � @" '@�@�@�@�@�@�@�@�)ڽ[T)j`DM x_t? Y_lЖV }gZn]VmXbEծ][uf{l-mǶS٣7fVҞ_˭[fu .gck׮W 6l{=eA !^yEVM'!C'Hj^F^| y(Ν`v @ T.W@_6 !2e?gjEd'cOlvoOl>YPl[6Fa)g$΂wRSSf']V#f(Vٝ 1Ʋ,͟[Кq7q-ƍ˂׊-2n6㈖yvl׿]?߾}Y[WmivG)q#g׮]͑6mvcNۮq ҲT2NƍS߾}ci7@ ,P˾[&@�@�@�@�@�@�@�` א>?@�@�@�@�@�@�@�@�&cGfN:)` 9@_sus6g/dg@^q3X,[qYfy!K۷o?³dɒ^j.&r<VЮJ*\ɥUPG(;]m۶eemy{рgYVZes YBƓ At5rvf#'ҠAҟ$]=( �ߥݯlL @wOTh I+вhQvoޛqoڴ ֲq ?|Ŗoʔ)8Fd8/mf{fQ=p X7lce-m<lj4;wv^,$, P *]t*`c ٳmܸQW [Zfxܹ>===%Jy [g>ric'?t x-/k?hvl׹]lydqE- דּի':/UTە,[L&Onh >dB� @�@�@�@�@�@�@ 7#Z� � � � � � � � � P+@'IՄ& Z137yEѬ͑MV$͞/]4ZNEXV l|\\9-[6k.SؖVD ˔5=Pv)>V8f+DgK ڳg7G>ٛ3Ν;V~OYA >kҤ (լYӛ͖ dSœu%K')`tҟ}W @Ԋ4A�X֛oJ.CŋeKE�hN0>uΝb7lؠg5E6͞= |'onA]%؄kEQDl+l\=`xDlc6Mcm,"GXX&dAG~GAgXhٹ.7Iܿtcm횷k'�'[ZJ׽}#'>ڶkتX}I׽y2sov]׺خoƆO9ݴiSqYgvNqgq㼰1 d>L Xj%7 � � � � � � j%w � � � � � � � � P^7rLJ@.+W^=oӽpm۶yK?ɖh(+gK+eK+fr ~bŊy[F+ژ}ŒV(hѢYszn6:as[8[xw Yq>`1Cli'5g/ h+́ rxuj6k�P /̼_|1 @ܯax[I@ u ͓l$ t$ݿ7fp$hŖ-[1 ? ,lLԒ%Ke,l(l'l\TR>>?Od5Id_ڸDMsm\?I?խ[ 2;w{9onvX )`cw6&fsOkwkBl|ҿ[8ҥKBq]+޳_n㑑9]|ݎ|nܿ#܌AF^둡b8ְaCZv=- ;0+{t-x|(|&\@ � � � � � � �Dw<D�@�@�@�@�@�@�@�@�N$jQLDR4 rUzZ\‰I {•~lk\5e[F~8+8le/HP*]d<{??|>7K5j2+ˊE{Y=+TkeʔQٲeٞ[=&2wߕz(:g }WW\ Hzvr@� (`Z.C  W&MFVN IJ Ȑ̑9') t c ٲq9r"{ȍ<59..4k?2k?s{9O(W7>at|AY /GyDnXB(5j5$#y?/zy=׸ܵ \η'1J[ٯukݮsmk=_l/w]wuھ uctL X?ٍ&@�@�@�@�@�@�@� SD@�@�@�@�@�@�@�@�@ Hey.v@ʕ 4~TKdEdiQH�{ �(K$}eLB06#�pU|E@�nݤӥC@�x Ԯ-<{6Z<;Rcsetb:JओNң>{_=zөz@1ɪUFSf~5t/46*axgէOƼM]v+T5{� � � � � � � P(E e/@�@�@�@�@�@�@�@�H+PoWIr;wJ1飏KczX�?^KRM|M@ /_/͙#M$W\4/[. ~Y*Wxk ?P+>G )piҗ_Fc@@jذ|M͘1CTΝ_Zk׮"֭ cl"Xh>s|q1!P+. XVգ~� � � � � � � PpJܐ= � � � � � � � � @ ')D #`E- X \tԨ䓱<*B� l.M" -Y ?Jo%ԶmZD@�w9D]'iٲDA |g)}tpN@ Խӧ̙3լY3 >\w9!:u"EBXSgyF7VϞ=cz\`j,H]viQFt � � � � � � � ,@V\� � � � � � � � �/pTx="m+^B8RKn^{M&{I))R߾lB�c +2NuE8A�@jN�'. ;JKKӦ%`!8{~\/K-^X#GرcդI.48u뤺u,g _w7~?`B�شiCo��@�IDAT@�@�@�@�@�@�Hp=@�@�@�@�@�@�@�@�(\ *Vpzx,9Fv&3Ђ>@ o-`Z&M+(*!]{@� ddHU\g+@ ŋK;KӧG(r#ЦTgYu@ J(Cj岀oY۷׿dfI.vt(W_}Uu]w{z!n 1!@0 � � � � � � @$'n"� � � � � � � � @X+eB lj%N{ 7HO?-'N "m\VD@ 9͓Bj޽rś Ԋ;C� t&MY#Po3ΐN+$@*U4f}W;<G}]u!pu뤺uOo'i;VW]u*V[֞={v|�/`ZEQ @�@�@�@�@�@�@*tRv� � � � � � � � �,@V"Z}~޻[o6l&LzKi'0id/0NՙK/^n@ ~d fB�(нlys[GH.^2m ȭ@_֬Y6mo׶mr C kJ(Dɓ's[n)Ľ}We˖%P+ll@6n( 6-VXI@�@�@�@�@�@�@�2Ⓚ� � � � � � � � �A@<`j Hԯ/'t]^:KP!M o.@Q#3|,@� Z~2 H X<@R iv>q ;O׳>zKM4SO=|M}֭Rݺi3-??_Zsr.aСCsQ-%`Z5k Wi- � � � � � � j%ɧ � � � � � � � � w[Vx޷c b)l\=i믥ov쐬(٢Eř%ΝlJf[n2s IxvYK2T|* @U8'PԺ4mZ@ w JMJ'gf#R6On�-Pԥdp u7jذakHM4)a}B [ٽԄ&˃… 5eyy*:oݻs��1 P+@�@�@�@�@�@�(�Zcc@�@�@�@�@�@�@�@�H6 JII^߰ <ԡԾԮt)wI>YdU+-U;VϖZƎ kh7'0ujf0O>7z@ ddH^LiI@ xj"8Z[7V#pYқoJ]JKhd1!�(G%KV ջwo-^8`=B#jխ&( =ڍ'P^|\rJj؊5�Za9S@�@�@�@�@�@� PO � � � � � � � � %"rw&M2ör6k!Pp!C7ސv(\`Ҥ,%{@ #M Nf@j@�$ @w͓ Cki#'wI⋒|Uf?ӥb#аaCw/h>3m޼Ym۶-ܢ[Ʀ͒%Ucp0xk:t)-[kQ[D@6mR͚5 G�@�@�@�@�@�@��Z10 � � � � � � � � V)--1B/WS'^X1k"PW_-HR{f ?zϖl�xYᇥ^=7GX @r ޝONn z�@YD@B :$]Tt'HgGv9# p|3<Sgָq\;jҤƌtKcB kJuȅ'#4Pz)Ue׿.t'ʕvۿAT=]`ƍQFA@�@�@�@�@�@�@�r'@VX @�@�@�@�@�@�@�@� .*^ح:{}A KW]%=D!hOr/jlԻwaMĉҭJ#Gf~} 8" {f۽ &@ IuJӦ HI,.-->l1!�(Z~߸Vt)0?DŽ@֭Y6]$k.=sT2 7b7a}Ϟ=Kv�شij֬fp|@�@�@�@�@�@�@�\ K(VC�@�@�@�@�@�@�@�@�L@->a0@:x0)"u,5h@4 /+ͣo8KV [ /9s$KjE�WJNs^GVx-M]m�*#x {kԨQZh4i^zo߾sD @kJjMرc~hl?\d*Sג}E4 "m68p@ - � � � � � � cb @�@�@�@�@�@�@�@�@ j%S[5˹E_^sM*hR:,EcB�8 Ly-(Fph8ʕEIg!=1W @�( Xd̮@wf̐.]#ȥOH;KŊrVC� AQFz5]n"nZk׮B;@ vIux)XjȐ!Xb`YT)-j $qFo5kh?l� � � � � � � ;bg͑@�@�@�@�@�@�@�@�@ JD] yfdH'] 7K&IV( #gZ9:GE� l&]pT=@�@2e g_j)-\ͣoIxqPJ)%%5$τ�DCsՂ 4zh+jڴ O4g֮RScv*^xA?@H"P-uZh  P+tl� � � � � � �M@s`@�@�@�@�@�@�@�@��Za<k#oE={V=u!K/*W^~9GX ,^,m,"&'WSC\v �'wTt#@ڴ*TM _i1 P\`B�b. e˖闿nFuE_}UȋܺU[7/[n ߿_? CUZ;)4| lذA]"rKCfB�@�@�@�@�@�@��Z8M4@�@�@�@�@�@�@�@�"Pjv plO:t8W{A %JH\#dI&#4= #s…RZi-A�Q{g>#> wJV-N$NqrDŽ�D[rz5|-[lU^{6nC%n]fڜD^Ў;4lذ@@@@,Pf͚.$| � � � � � � !@�@�@�@�@�@�@�@�@ Uf}'UWIVTן,Ȩ_?K'pҚ5Gů d {w)%%Y7/Բe0H@�d@2e,`Mv/rkt-o [M6:uz-oٴiS=:p@;FNԪ[7Fr)w^=C4hrbZ1`DUBF-P @�@�@�@�@�@�@ <%2hZ� � � � � � � � �Kڲ%^-Mm.D*[6o`m!j8ꬳq㢱w�9SxkZ駥Ez>>C�8ZuVG+ @,Pk9M$K]Hv/ޟ22G,@� \~t]wm}Gk�GBU V3fvޭ{'#P+!g 6VZyގ @�@�@�@�@�@�@�'@V92 � � � � � � � �PJFo][:tH)=]ꪤdo%W b$ijUfq ۥ<ʼ� 34T!�Y*^\6@ac(i^f8HJJw @,fĈZdu/ʕ+ g6G[Nv&c=ú;TZ6@@3 � � � � � � �q P+ � � � � � � � � @,P˂l Sik \}!U(~k \zi嗃*ڂ@b ̜L.Oz@Xf ѺF{jډ�$RɒWz�(SFjߞ@IzիK| u{/�_&L_ZlZl_ ohy֭ }7@>z!RQ}Cl6#P+6X e� � � � � � �@{C�@�@�@�@�@�@�@�@�[ %E:$,Gw]%n+LwެeZZl?>*m<xЛ#:tH9:| Ț/SժS4pKqcV*}Џ5/^\\D=/骍\T[)˸ ck S Xqz |{%{3C~W# i<3.6G( p,+.>[;Xk: @ܯ*W.^G @wo pb/{nl9 /l߿X'O֭ʺo{5{ߣv>qs/om{c=/~)_7|&H.;O_z)^{5=Z^zirA@]+)4"k֬5J+Vv8~cB� lܸQ5k G � � � � � � Dj%ɦ � � � � � � � � P8U?,} Xa۷kǎڹsvڕдb{ieW0fb9VaV~UbŎ }_ի/Pݺ{!["÷책r=/ph/--̶d}e˺B岖g ׬VJ\I=.G>L:ഋ K'j'.@WOz-vZ�$P*[� `ZO<!w/D8͛ym۶e-m<1[ڸض'~~ Ujժ].(kwXX~{߿?SVz{[W0/{D5Dg{vݖ6W\,TejXCu LjذaԳgO3F͚5 fiUB ['n]S'{TN <k%Kz?oſ%� "`wj*n@�@�@�@�@�@�@ j!� � � � � � � � @\@m~$K-[O?X(3hPCl&+=ŸlBc? ¢l.]QKۗV_Z@V4?<c4v}>4b9-2[Yaf}N>mY3c+vn'`:櫯I`; X]}%SEFZ� H �M.G1C;<Ts?6lؐ5ot91g)*U_nԨå,tG./c_)=]6{VTgdddݗö쾺e1ZtiVИXxWdc6bs͚5يdz/#@|z}5h r-j۶. >ݫfU|JruZgz+}z7{>Y`jnUڇ@ 6� � � � � � �aNՍ)^@�@�@�@�@�@�@�@�@  H+WaV-t.}a_^6ms�-+}@,Hlذ22Ɋgva(씽3sz5:xaVT3v![V32-RyŊGbCõjԨU�//k׮FܖDž#p =\q'{A�\hWHZjxb#`5ki+*sGlQ@�.`. ˵Q&=jؽ.qcժU޼zꬥn!ZOlϵbMkO=`{\jUo<XW{YgB/(daZv}˖-YdRf?>xb}^ٞ={g)~Ves79u%<@ \"9s3. yh~[UݺAn%m+lnӹ瞫/w,YRJʄ� P+#� � � � � � @ D|ו#� � � � � � � � @ %nw0]KKKӺufP-gYqL-,+2/!n+Ȍ\ZL 4$eg6[μLVBK\YP+9uT/mGJ*`-+Փu]7[F+H숆$ؓC $ bB�,X_^ȍwK'J|"5o-X@ ^ 9. ?ݥ-[!/o�K.e˖iŊ޼rJ<xk׷{~0gԬ&{\rxu#a[hQl6mz~ڵDZq3 C[R7ٽ~;5&.eYfjxvΰI"`⭷ު+BÆ _={j̘1nM[7S <o4oPYB-| @�@�@�@�@�@�@ <j\R@�@�@�@�@�@�@�@�jZƄo?mejժTbV Œ@#[*TM}W͹9={`-+ㇺ{}^qdB,X ~4[�ӑVOW :Rg%˕Tj_�xI'7ސ<3w۰ @׼%w|�G|S.HrCLJlL`…ZhQ[h+Yt'{l;6h ݴi~osj˖-vfUVjݺ h똴@lU7Ps7jȐ!jӦÇL27#)jLE${N{zX]Ju& x5~Y � � � � � � j%Y � � � � � � � � P  ڻWr5TFv>|XWw}'+|rY-u ղɊկ__ 4Pt饗zY6[` 1!/efm=V[v7Y )SxEbwm^HY8\ƍyqHhN^++%D  ,]*/7L W\w%% pH@�< XVg/6@�`t&L$͛'u6ъ1� H3g,X|~glRg}ҬY3\Ayk׮GwZnbŋ_SRSN9EڵSǎeҥ/ @(ΝcsoI߯_퐭&`Z%KJUf{ +p뭷bŊה0uDL j{Nx@�@�@�@�@�@�@ J“N@�@�@�@�@�@�@�@�@`~Ћ${mCyAYV%Kdh߿߃R6mvi^PFիW/`k `!Y5kN:"+?xr+VVtĉ=6+V̻.,\E^Q֭[殨*Sޙ_S_{M1";K˹$P+N6f̐~ki iذ䶠 @JSi+ H$U&MF ^Z_~f_fϞhmV~4p@q6m@ضERJ$#}.-pѢEel0av[{駞zu{mv 'nMW\q/X}SO= ol֮ԑ2O>QٲeCPZZZLc@h 6VZG+ � � � � � � � P+Ч!� � � � � � � � @ֵ bs M`͟?[Z\2j'|Zj_;b\ʕ+Za";v}矵l2/`˖v]YѣujҤlvԾ}{ohWJNV(, ԺA�,_.+w\l: �ApA;@ OݺIӧ˅_i3VF O/o>pׯWŽ.]覛nlһ29X8fOZ~;w7W?~,|Ʀv=z謳R,p,ȃ@55x`Çv/@JVXN`J|͛7kȐ!o={%K$P+tg#pZ^@�@�@�@�@�@�@�@ L � � � � � � � � �ypQ__H_^ ׺3g͞=[f^D:u+ּysY1!&Ȼ@s JOOZqoVb/~ "չsgu[VZ5 H3g&W`aNMI` Ft lْbװr@� p\A o"�]z@6FX '駟꧟~RJ%q^pݫ#&b%PH5iě ۽3f??aÆB ^V^t{ĪD8쳽k<_]cǎ9眓ݣ1XVJMA9\\,L~>ao`X:Z~=B� � � � � � �$�Zx3 � � � � � � � �XM zMӧ{%KF.uÊ`r-СUJ Ŋ|饗fuu^yiܹ0aFCK"]d[jJVT4,SRjY#=34<W`>OaiDL#�*`KHo%ŽeˤMO waΜ9?PT\9/{TZnEƳ쾺gl!6-_\SNՔ)S4boOvQ߾}ugʶcB� w=`[u+ѣUzo̻D['#\7w/|m wc@P:6lPZx' � � � � � � �/;h! � � � � � � � �PS2_ش\5iʕOيZJ*NW\]SOI'N מ~u޽?f̘~zѣWsmtu5fRJJP[IUmn |mMB|\A"�jzL @:vJM#P+t'/ 3gꭷ҄ ?e˖ SOy#-L 4nX6x.p>CӤI{cTbE]|3L{c-P~E j޼F]cEus8^֮RSCpk^ z킶Lfȃ@ZZmۦڵka+VE�@�@�@�@�@�@�@ 46 � � � � � � � � �a@+ݻ}yYFt'Ojw-Z[zwaZ8OL2֭n;^[ {¥RU\YO>ZnZj7~mر#z@OҔ)lB WK.}Mmh8飏 K͚4@ Cra ^) ;Y>=#F W_};/6+ <#ѣ $L+'FH~:A �롇ҺutEy_8l@2W/u]!CxT~m2t>@قnM-~o{,m=Q,P'Z@ 6lZg+Ä� � � � � � � .uh- � � � � � � � �D22 ۾}׿_~^-˜~,Y Ae˖"L 8 4W_^zI˗/ך5kh޽<xVs9GO? (=wy:4iv 6I ,0zV @DRJʉ}@ ݻKӦm*|?_5ooC1cn/`+DOF馛'hƍ^ʵkNz^{5E -[ ̙3g;P4l0o,*]Qpޔ۸ yϔoJ((n7@ kSڵC� � � � � � �$�Zz7 � � � � � � � �HaCB BxD^xGQGmۦ'nS -Pn]]׈~I}:uꤱc*U*- ڱcG;2p-i߾7 0W :@ &L+:/=tl"B�ȃQby؀U@�� XejM ϫI&߿jժӧkź{U~@F *UhȐ!P9&잹ؽ|P;wG8&8S'cƌѸqԲeK}ᇡh;徴2%s饗^JpbL%G)5k&O) � � � � � � j%ȉ � � � � � � � � [WkCm'PkѢE<xW�;PƍkgQ^TD"q4@ѢEUV~ᇵd-\Pg} �y:_JӦM[]-_+}AܚH8M6[t*[C,� O SR6C�,p钻-C_ Z6~kk׮i' A (-ZO<u.A,pо}Lځ@liРA-]t mܸ1P1@%U^3g 7e]V/t&Q!@UzuY@ � � � � � � @  � � � � � � � �  vs۠O>DsڹX{|I`ptB%вeK9R>S*U k߾u rMoˣr,[য়J3L)lԯԻ\xc#�+uV K @*VZ L9^ o aذa.^Z "6KL2ucGqƩI&zPZ@jAo<yf͚% k'###@)pySG*R$^-Xf.bwyzGqx<csP([ڵk  � � � � � � @LԊ)7C�@�@�@�@�@�@�@�@�D]?_ڽ;N;M_~:vUVׅ^7#"@~zW?j~' ܲ⇱~KbҞ=<*B qm*WN3%`au\ 5n,TSq@�BR b,ЭZ1&}:3b 1!@l2}M7kClْ6I$ۥ/ZH_nfCK,I"uRݺ9ka`O>^GG87ɋ/ڍ�N@-> � � � � � � @xP{h9 � � � � � � � �T3H_~XhYAs=Wk֬ѣ>:uĮ)G }':t Th,{iKfӟYN}g7o]^>믿+B*U^}&Lz(}ڵK#GTϞ=em׍'t~kʕ2dn6~\rt19A ܗUݤT`^˥"E>J9 @ZjE]#@w͓+Cݏ=stnCիWOw>_|gy@9C@O `cNٰƖAudɒx':tٳJG8>cuLk׮F�PH7_e]aÆ?ՠAo +F|r~'Ne8]+Aٓdy߿$/_|$I+VL\z^#$�Z vB � � � � � �$�ZIu, � � � � � � � �@ZrI^_m۶ -[L>*Vx x'^}UZ+d\N޴d-X SN~mK.՞s*kYdAWl5ydر#_?ᅤYޜ9s?}7?ֽޫ^z>OA@iXԹsg=SQo^jR#cB�Bp_r*Gv/jhW~Aɾo1!�$_F\}{}UyO1( ~Yc ҽܵpײݺusT<vZHҽE^%(}E%]n6i$W{ ȾNc7@8}t]p^ԩSK6A yڷo~&JF,X/ %5k4sLھ}qrJYȥ-s;x-\PUVuX?ZrTvmܹS>}qZZ/k[-ܭ~Y+QXM~zt~ Dj%ɦ � � � � � � pj%)C � � � � � � � � K {E_ 0@<,N:&ʅ@JJn5o\8/g뮻Mrz Rr)Gw'5bĈ##VIg֋yx`J(x[Y(-[ȊXh^gyELaިPƎg릛nzq_Rr\]18u"@.'P'P qpYR&qn G�(t?P(m!N^=n]s{:dn=ʂ9o[=^K,Q$yfܹ,ؠbŊyd zk*K.GMЅIv~ݱr3x` )t v@ ;ӻVTl,[oݻCK{]wͷ~ecj,lk'ϨRJ{꫺{60-ZSs!O=.Q~-XƸ;uꔧs ˙[@c � � � � � � tKOC�@�@�@�@�@�@�@�@�@ y4k\5ӊ >\'O_Bb)clDN&kղj~[gNE9 tr^W3pe˖Gg:³H¡��@�IDATTR^[~Իwooo6bϞ=5c /X Fs0-  pLM@ KG瞓Əvz � $j)@+ ݺIӦ0uT,=JX.O:$Y(|2O6PrexYS zNT[)/X%z>wi;j(/ȮJOO| ػxf 4jNi24Hi@<UJ2ɽfR̊!7"eHҜ4?:9asg?ig=Գ7ziĉ>j̘1jҤ{LL܇rsra$\zRZru/´cG%珹Kfߝ*Gof[X[: ºQ`ڰaj֬Yw}B�@�@�@�@�@�@� @B  � � � � � � � � C ڶM5K:oh…}1c=6bK.ȑ#]*W֭!C-|WzW}++_~I'0![O?՛oǀԣGjܸqzG[owQڵu=z~Hj*ܹsO>iaF֔)S~:õzjC?C>&M뮻Rjմh"kŞ7~(.LtEz4tPq[ռyH9sg}^zIԩ>> ut '?.HV.vkxX1/?R/}6l2X6{O{%uſkԨpݶ׎;v(;F]vKmCr/QY &`Z֊{ /p_Ȫ @ 1q}[0@Hn$W^wK.}uV?Gfu[\͍]yiŦ-YP}id5G,XƨQӷ~#8B ,]hB^xnFm߾?ټc?0azm?mQO>tsY6j+We˖~[˗v!439ҥKس߸qcD֭nԩuQGc0ydFf6~Gf{>#wÆ c{*ifU{G2?lӂ"~m=Z?|s99^Gz\e ϝ`x^9'xBv|y?g[$֭*x:[;(-݌<y?~tvhv.B.-T_~L"i 4a9x-lm;g=.m9?8~ȍw^Ϟ= d (Zf;F^ZW@�@�@�@�@�@�@ {7I � � � � � � � � @pP.8JGr!>)6[^V\o߾hn.^umbV@fW Z1ciڴu:}&+i͊ZJ ܲ!׊:Z Mm0'+b dEE- V#"Z/@;NTrU-/cbd͊z[51+fYfgE2?x_ ZvɜFqXYQγ:oʊk{EgW+;{숇d9;.fB1+kl Y(Կo8p^WlŋUdIMf!;nAQX3$W هj@ap5}+Q)@lM].xۭ; @A Ul)`Z6Uڵk}@ڜ͓ZN&M\q)95ma6޲er~\ÇYmN>Pf4sL-SM|^O>Lԩ֬Y@O 0r6gjÇy~!-˞Q eN?t=jݺ瓭Y` eg鼴ͻ2D=M{饗d֢9leu~#v[|FV:uddղ3xlNkM4ɿU-㚝]Vcs'|x߮V<Lm=Y`ט1c| '|C=TZ}>w3XMeaZΣu]Zd_%ʌgu?sY[Z˗/r3 {v  Asv.~FVa?_a Pa@�@�@�@�@�@� @¾ � � � � � � � � kWӅf+~MՊMs dk׮>n[xСC/_ʂ>3>ezKYV0w]v(YASO=sM7VxZn_ ^z~V(-#ٖk৓N:I'x R#17 @(+hvm %²R1[Ίai/OnTf\bE\ Z1\ۆ++j,̚ /{ǿ>O?z0VvmUR%!+f[۸qϟ/ wn}+ {K0dh^c)Řmj"z,zORC`ǎ=YDj/{@,\ '=P,@ �$'|sY4@ T2R<x VV d۷o֯_oÙw_Y83ZXSxjҖiŸlؚ9ٳgmҚmUV0?ceJea?Zl c~E·o]_Ν+H}{ '~ڎg"iWvKoٲESLWp6oܸqcfGs9ͷc9m{Oپeղ3f~#G߇|=ga{^Er\~v;m{�vgϞ>ϮWXFvᛱ#vB:|'Z;:gexݎ\vKc|X$;.|}/{4\*Z 6Vݻw;LJF}lWFC�@�@�@�@�@�@�H>7dF� � � � � � � � � DŘϓOFDQaE-- 3&m e˖-^k֬YgCkSYdO֖ZeoK>!_8ӂmۖXv7o7xaB]v4hri֭~ea{iuliOa֫fX2l M- Ŭl4[o}nݺƍׁ gRs(f͚' ºex>̊Cac\@!\ qA`JWC/ VA�HJ1h߮me^}UըQt-\0](L9`(# Nu|esvm!YVBf;wAM^&˗/,RJݶ6zj~nnmue,~׮]>ök VybkO ;{9j^-XŎ?ef ;@"}^_x_A9]d~viM޲9r{/qt\Hlܱuh ЧzJ}k8@.?j+ ʲ-o{>ʌdv?2#ޏ-[&ժoBL=G7_Çk>,.ޯ^;8VPa ' Ԫ^gS� � � � � � � Po@�@�@�@�@�@�@�@�H,v<:u\}/NnviҤI-Yagy"Bg5s[2ׯWɒ%eGyFB \jA-(b~_z뭚3g|W駟dYRV-|[ ,cYz u}Ù#2nݺh63fEq[؄?u0Xn#Z?P:| Gx->c]g �q/%;fS1bc � �D*`So3f_B-* y֭[susZ6Glrt 'hʔ)~W1B g /PN9uM[lZwsvw 4(Mj 1`yUGrjմ3Ҟ憽#9>|FVoJx_ -St Ӿ}{oժUafm%} Ȣ}HC� wq7ozC|7Axbz|H>wh#i?+#+"3XVݺUJ}MߣB7-㬳Ί$~Y O=#F�@�@�@�@�@�@�H_@�@�@�@�@�@�@�@�HYH ӥ,N;n-)z髯|~2Bmڴ_;ӧ&O(@5 !+hڷo_=̶,,S&¢7oʕ+X3۷oX6bz/ufeݽ{?.߯>}tԪU߯VZS厽^UB3gjر<xplZ˗K_~M@�F__\9)n � � 4ei.{+V\%K~l.9N1kaYWN[ ,А!CTT)j*|{޹szW~M4Igy_ƸqFYV?g|()5kVBjegfs' vb"=>"ݧHLoVw}Sv&?-Z?Es_3H׵sK}HC� -[V<>-^؇7*s.ұÆ}n"miOds#*nOڵƍ~=G-T^v.>q{$Ȇ@- $}|Ǎ#� � � � � � ��Z � � � � � � � � S7 {qaCj-+Th¬xbUjU5jdz뭷۔)StYf(<R \믿MfkРʕ+ ~Wi][$+U5o/[ڊtAmƖciOfN< n֭}V.͙3m׮]Q]xqߏǵf'{1qK/T&LHWo,pVhN_]||.թ#v7@�Hp_sp; IC�@�@ ):J*QB ϸ`-Zltiۼͧټg-sݺuSݺu5tPYPMϞ=<aРA~<Պ+7|iԩZvm|΍|q iyyKOѣ-[䥋}V 7n:UR%38ͭ[[^g=e4~3?nǣaÆoVq.3o[/./N26N};w/'pbǎkc(VFիnKYf`n~e쯠,W-Z{ߣ{S6mdZm۶)Ul| oi@�@�@�@�@�@�@�.P4[d � � � � � � � � A\ r%fa;wuw(uꫯ]dEdHi&k ھY-ܢ_]7t_?m+~jmCXrْ%Kck֬9ǶuUWbsnv_cǎ:uG.rE]ĦJ7x~' ϴyf=C~rOr)ǖ.]2>v]fMB,ʊf_'YQ{N|.E}^;wŋeQ6qDUR;c[ܴ.]C<L[>[:+fƕ X&92{}kc>իؘ=Bh.IpذaqLVܴ }IO?-#&(( � �$@2jَ؜xǴuVo6*VyE o5jy-X@dpm QF:̹e6/g-B,ߤIYh~s=׏/?7nw99[w1 ej~[*T}>|Isyu+|ѸmP?|ر#]橏;j^ڎW^y _/}v曚7o^T瑳;z$3z}g 7vNx={/܇Gzqs >ok{,sTY&Mرcv(vmȐ!6m?۴iS=1>wW^o-LkDs~봱emgeri6OE{.JxNs׮-Y֏?3 kۭ~@w ׶Tmjg O²O � � � � � � Ri � � � � � � � � Gr'vb#䂛kPI6]CNݠ]Ȑ+r!6!W *vC . "!H+Bݺu ]{!W86{l7P:uBLʕ+Fwy'TZP%B|/իW/Ttwm ͚5+ ~N:\n\XT@rAX~H \XbE`[lriCׯniϹڵk~ e JQG2/8c Lh۶m͛8+.c6�r嗳O  PE+:sӧO "!WofѢE!jdgРA3fזˇ\Q؈䊨5kPVBG}?F ?gqFȅX=z][ޅE][ 5ja޽{\1߇m}gvq{sx,r C<H<6n'Zla(dISH}g)S=JpobF/r {,q@�b+;_Bnp jѢmذao�_v?mn.׹Un9B �C9rd6.4'[_A{Up߮]XX1Zmڴsy6悙B={ݻws~ic֭<yrt^`PZB.L)9hlN9KkĖ9bۗ{I}O6۳;qwf Σt r2ͬߜwZfMx?P9S4 ٹ̼#=7׀b}6ٹrώs=Qs\s~8ɝjY}?v.$Џgw=forw=fGnF?H>+}sv^nb-sm; v!B?.53~{4vG =\p!;>gÐ w;mN@2eB.< � � � � � "N/ 2� �J<>+?ޠ!� � � � � � � � @:,b?rvbҹsg5h@O=Tb ,F3fԻlTZl|r"az+%0W{‹rE.ectYr-zpBte k+Κn[xǎ⊚uO{̅j6mO?_ovTlY,\!UZ5}EkE;&\4s4arE>h #~\N}r_rAlY.'~W@-¿~?X/ O<!R]޾]K}l0V.PKsLz;^+9^z#{t*]y4dHndY@�$t407ߔ8CZVn/~w?傊<g%իW9J*e|*mWR%m;6g_E4/B�e%KLOС yC׶lniݺu=zڶm>y7ʅ='q#ufs9TN6άd~ yidwcrvnɅ]o?mM.=rAQgs7/27}G{.7bم ƍ/Jwڹ&M1hݲe.R2 ꫯԲe˴)I9_K(.newqhX~*V>@.l::  � � � � � $N/ rhP @ SLY"zxDK � � � � � � � �zR$ ԩJj b3Zj^ɓKÇW}=WP³ 5 ʮY!Ƭ1(Q*zeH޽{p :srʕS-r\'j֬Hx[iev,>̞cvL2UeX{ flZW7bBɘ2nς0l7f2^[! Y|Gds>h{ >b;NZ6@�TX@t)҃ � �"оI3gJݺbŊiӦp/<*S9lm|q`Y´f\΍4qd_n]}駲>Zw c8Ƙ\Br]f>7ͭ|Fy^A="Bz28+t\s;軠mۦx@s {/Ӱ'G tQ_,'x"q,7}/ge9ݎ\N}elN\>Z?H~gvi>Xs„ ,x�%`ֲSrE�@�@�@�@�@�@�RO *##� � � � � � � � rV"0;KKg-=|Re>3M4Iw/rx'VȊN%R[fc6,+zM7Vr\&Z 19p 0`Hלݢ)ˍE,l?^Vh駟رcըQ#(9眄\m7(!/� .p\r]SaG@�@�TZUnGz饏]mݺUvJ~Z!ue% >|;oq uUWL2:̜楣1GF15u>3w'�i:xm @&e˖!Zz.b:j(u=#hժU2eJ+rI sڹ_7iVݖ.J !Ҫ]Ə;wv=jZzoΙ3GOXZ6@ijEǓ^@�@�@�@�@�@�@� P & � � � � � � � � *@VL>rA4ܹR/t"̟?_??|Y�mE̟8qZ?P]t~eޔr<tu[l)$b⏗\r/e۷/^a-TP ;1`3F򊖺v={|:lykWҌRNyu@�[`&՚wE\v{)A�@�@ lN/Nr-9. tѝgyƇ=C+t嗻P jt4 x^#}$v\/7d;o޼ٿwkn_%# `͛,<ri-ϳ޽;OG#]4_-^8.]9 r2- ڳdƍ}P2Q[u}w1bm2A!D*U$#f � � � � � � �(}@�@�@�@�@�@�@�@�RT (n^jPz9ᇣm5iDO<񄬠x /cQjԣGr):cUd\̙3u[BtbŊl}Ko/?ڵkA@D}֯/5j$>RN"�عSOrugrbM� � @AX֘1KfMI0QJ6?HK;S>} g 0@m۶ qaF qSOmŋW_zʗ/w_6�9 TXх={ɓ'_T6mr^9+WQGM駟l_>]vn6UZG}:=\}5~%yɳBP "Ϻ5k� � � � � � � Ex @�@�@�@�@�@�@�@�,@耺z`uktM/Vpք rJ}.`N=TPI't}Q}6_ژ,'Y9jnJ&YGK.ըQgDժU}J˵U>}߫k]J|#dl �$peԩһJL#g � �N}{;Btɒ%u饗j…;v~ww/C=Ts,Ye^:p\׬Y'x{̇ &[EV(834o<5h@;vwܡ]v[[n\TOF\c Tkum֋ĉua%5k^@}xDUV"!� � � � � � � @V@<� � � � � � � � @`RecI)B,s+VT޽5~x]ǬWyr!Y=\=Z`Tٔ%H&_~} 5lPp/Yti_tuWσd7WP_-X,#f �*g+HGd\ � �DGࠃ NEU=4i$-ZHgy~i4|2d/^;@`ʕzꩧԥKU^]vZnsjΜ9ӧJ*AO,�"PF :t>uf|ݻwaz~mnVcl-f;4h p >0ξ7om[t4ٗT@-8 � � � � � � @ ǎ#� � � � � � � � U ԢLtHU?_za9^,@NJ# > Bwyh5iDUT}֯_Ͳ>I`͚1c駟Zj\sԻꪫ4o<BB=:,UP!Nf:uJ+~ @ ^|Qȧ־ � �+оR?{hq>@-LawAjڴO>D@C \_|ϑi?ڵkw_vX*G oJ~ߺuZhQFElҪU+U\Y'Nx^`ROj׮FgyF/rfc�$j@�@�@�@�@�@�@�Wx#� � � � � � � � @Ԋ#+%u~ՓȼK\hbnvf3`G/͛7â5A� lڴI|K_Њ.X@v!Z]e[oU:tayV40e劾IԻwa3@ ^'nQxm � � PnH<P`)`m۶aÆiΜ9z±c9F;wqf͚=&aT ?X}&IիW~.`}*^ uf}QCլYy~Z*TvEU.]7pCd[HkHu,KDWr 67n [0W~7 f@�@�@�@�@�@�@ T8# � � � � � � � �X!"pM㏗\Ʉ ʸeNqFk>|,YWU;0VVR2v}ȇΝ;e>-,o_//ժUAw~>yYc#g@ qWN;Mr_3qH@�@�aH?(QK?ɻ ;gdv;e'M>@{ZUXQ݋ˆ,#PҥwyyoF3gԴi'~n6uU5*N @%Kz_~eulZnԯ_?_*[l6KTN˖Yv휖h _^ رc6f vҊ+J>"� � � � � � @ PP^v@�@�@�@�@�@�@�@�-ݻwGK(pu{´͓\TR5+,xKK֭[sꫯm۶Xb_4iC9cm:_*Ut5d""??^o_V.b~jѢjԨIo}4rb'5D�ȿN++=@�@�H)w JY.B,X)S?oQ%J!%[VV|֡70@`/P(EiΜ9/4k,{˖-sSfo:uR˖-y-%qڟkυ[oUrK cM<Y=zH-(mUN;LN޽{ׯ.ǃ o$@֪U+yH@�@�@�@�@�@�@� Pk/@�@�@�@�@�@�@�@�@ 5Ԋqw5jEꡇcŊ ڵk.\o_;M0AÆ ֭[�T" jР4l0vժUl @.Ɋ{On7Kpxq뤓NRӦM*UFu5y}?&P+1B�OW0r夷ޒnM12"@�@�b-tQҌraf ʲn.YD~fΜٳgkԨQAiּysuK7͚5S 3 ɚ?oܹsa?ޤIyӧڷo:iCA$~5|p 4H}F:$=UVM~&NHV>ҥ{c?-�gAq>͎9R_7)|rڵksl @�@�@�@�@�@�@ jE@�@�@�@�@�@�@�@�HVNߍ7J\"_RFAXX1Y؏]8㌴޽[V@׏?C,DȊi;w˖)SFuUz/VFmHdP(+Wjg_UKfŶhYAO<{BJXUcZ%KJIe4@�S}]ߣˉ!� � :HώHr-9oVs̑e̘1Ҏ]9 ˮm.^BKmuJ?,Xveg5mԇy#8B-Z@�H s1:sgȳ>O>yջuW^yey w˖w'z,}g^p;R߾}#_%@�B&}ԬY� � � � � � ��Zu[@�@�@�@�@�@�@�@� P+K|=j鮻n+je{=Y8]wnVH†a/ԸqY8pZj=n om;DK`o,_\v�-޾}{&+Usi=a?i8XiĈC �_i iT¿! � � o/}j-s]x>ĂfvNϟ?cYÖ-[b6߸qc5jHW n�;@K~.zh" Zz%JcߤIbvׇh @~5kٳg+)kFJ,ֵjs=ZpnJ{pS}VVbգ>nɇMZiÆ #Zrn%%YIg7a!� � � � � � �$�-ǎ#� � � � � � � � U+BH1\nE"76G+thE*m6-[L+koOMCl-zVUVRHJJ*MIMǻk.] ^ŊxeŊiכ6mJʕ+YQN:ouٲeӭÝX}alA �/p /Ho-qD{� � @~ڵ %Ozoo@E!Yu'h<)Kcǎ/;vez:uTn]3f��@�IDATڵkKZuJFlܸџDZ:eKRYdرԊhvL-8²N=TtAb URIL25j;8 0@3f̐}ԫW3mV˗OV>^+}VTg/BM:Uznfw+ Hu2" @�@�@�@�@�@�@ J@�@�@�@�@�@�@�@�j޽;j\ {+O^TRxP̪YM =ux�ݞ7o,tB6lذW7#%]bE٥B iྭc+I+X ?]~/֭z͚5><+ږX\5 e;C}5j - o%GJΡ+GVbF�$sI.=t 7>F� � @AL5m*AVAͽ,h+ҥKl.˜,X+L]*J™lEy]؜n0[jU?\WRş )wwܡͫ^ڟs.+Ws4{_֏O jʇ<%K- @?|N<yjٲsh;wĉuUW~LIxuWmϜ9& P* G!4@�@�@�@�@�@�@� P+G�@�@�@�@�@�@�@�@ jsΨGG +&stgIm&`Eԩ/9}v_1(hJeڵi &+ie֬ g\[ Sp)[lvt.n}. <me֭iVt;iݶ"6mJ5kiǎڸqc-Y30 (قAeDŽ|c@Gs߾7~F� [>=ױ#� � \K.@ s'Xի/Y `kYSeܹiO6,+/wsv}_ۼ:BPڼsްa?7bus'vΗXVxNf 8CÇYYe'K>p(иqcw.3]y:St 7{Un|}=-kڝz0`x u"{/#T= M@ ~oC7 @�@�@�@�@�@�@ J@�@�@�@�@�@�@�@�je,H'H_&O$%KT͚5%7۵V4ҊE$dpA\2]0BY?v -4+j[6nXx]o} eXQ.6.9`XvvpcrBfAZ sV|.A(]-ZO|2B͛>vK+̊ZQӠЩGK-v ƥ> �9 |͞0۳Β;Y@�@�TA9RnR�=[*W,va]Z_V^- Sصs?SZs�nNp-{<|eu?8W>OosYݷ9y x BvS ̳[xͷ[Acv6OC� }t?>hZkذa\'|.]ݎ>MUڵcwQ|>2%vD�r)`|g@�@�@�@�@�@�@� P+ CB�@�@�@�@�@�@�@�@ "}T!r@қoJ={^'~Z4XW4ܼy/\[N{ܮ3޶Bv  YUze5 ̲UVb=v~}ٵ+~;0bmGVǥ;Eժ^+ڙՒ<mJ+WGo@ N8Bz<> � �<ˈ1@j\uma6ߴiײk«]gosBln.\rL n<}xx[eAC�\wjѢN?tx'#slZkyݳ"uW^6}Q Mo+e7 [@� ,_<OvX@�@�@�@�@�@�@ j֗@�@�@�@�@�@�@�@�H+ghh^knb-zN<e,qGtRVҙgJ-[Jo'#qG-`ZVlL:C�H4iU 'O � �d"pR:jeC%`U+V]t:rN �4o\sх^k6lX$L@e=i0a·oG5,@VXXz<Kr #� � � � � � �d*P4Gy@�@�@�@�@�@�@�@�RN@֭n->c+$@W_IK;Jc&1h TaZ4@�رC:4{IEC�@ .�bj]dHZիkŊI;~�kܸqꫵj*K[l),XT*UJR%.+4@޽{뤓Nұo08j�:D ?ɑ@|B: � � � � � � �j%A` � � � � � � � �$�Z9 5jHCHCJggldФߗ9gO ]~X6vO?Zwt� }JfI&H;@�F`Un,E5wԄA�-Сd!wGgC� _AG�'PH 6̝|=NP#jD"\ڵ%HPॗ^!?XǏݯTRkX4Ԋ&}!;@x@�@�@�@�@�@�@ jR@�@�@�@�@�@�@�@�H"w,S'Oi˖m-!ŊI<"=tYgI[&1h m+}kWz@�dѣ^?<Fx@�@�( ڰAۂ>[E�U+Wf� �]k׮={mۦVZiڴiqC2n0JƱ{̋-z>[ ,'a00@,s_<+VT2ed @�@�@�@�@�@�@ +q@�@�@�@�@�@�@�@�RL@gV&ek$}I;K%1 n-w@�Q`(;'uK=` � �@f~Iӧ*d-Pzu8d$ �SAԮ];(e+tTv[n߮Mjt >\o4ݻ)RCa jթS'¥Y @�@�@�@�@�@�@ J@�@�@�@�@�@�@�@�jڵ+[LMY펧_iԶ`ȭ1H3fH*u Y!6Z zT嗩k#�*ҀҭJ\ 7 � �ypԶ-Zyc-b+`Z;vڵkc!zG�ȵ@r4n8 <X}u] t'ם .q}]5iDC]wݥs<vjQMh U$8X@�@�@�@�@�@�A@�@�@�@�@�@�@�@�Hŋ}W)?~7HrCfΔ¿ $1< (!5kFVYHRWWTg)w$N0l@�@� XO/AyK\rx�@);SGֈ#t'kӦM?ҥr& 8|"ݺuS=tQG_/Zay!@r,u_<j%DZb � � � � � � @Nj$ � � � � � � � �@b*c=ttaRϞҺu0�6@ Ԫ%M&կ/u$}u Cϗ@˖j @�$"'(WhT92p@�@�H  Բv!@TVfŊ3(F� 瞫)Shر/_2-Қ5R:~WZ9Lv{ԩ3fj֬~A%@U(0"@:|D " � � � � � � @ ! � � � � � � � �q P+.{mD פ[Nvk@�l*T&N5;NlB+`ZsJPEv H93 ݥʕq$=MC�@�@� XH>=oFGo $P+6�DSu֚5ko.7Dkٲ=ï];w#*ߴiN5lPoF؎>O' P+6@,/b)L � � � � � � @Ԋ5[B�@�@�@�@�@�@�@�@ ,PkΝ =:5wԷ/08_(Sf{#Ν?ݶ91,P? s| @ w[HMJ&_դUϞ{Iy!� � @l^ ʝK#{"EjժjŞ- �QW>S5nX;vZu$}裏A2dnw>s.B-JɟgMVիuV&1Z� � � � � � ��]Sl@�@�@�@�@�@�@�@�(^vڕ8J4o.+#WD)vE KKKIݺIESHf$5/L!3P@�l^}UZT]zٿiΜ=aZۅ[ � �GCiƌ  իkʕ>@�b P|yM8Q'tѣG`+ե*%U\hmۦ\ 6իW/-^Xzʖ-MGԊ2@ Kǵ:EOB�@�@�@�@�@�@� Z!� � � � � � � � �Rb*�tRŊ-=;SΝ~GHu+{7tM+R*#r4wt9% Pv.XZD5ada4@�@�j=ar h ժUӊ+d4 @ %K꥗^R5thպꪫ"YP.lTTHܽLwjzhڵׯԪUV`b ZT4H|eZm!� � � � � � �$@v�@�@�@�@�@�@�@�@�"@VT݉_/ h!g?nF~Or,XcO܌RuѤ4~j+{�fo"?ґGJO<!|縇� � �h~O̙Rn답@ zիWWP>z @!Cjժk|l3[ hn Y֥^oч}ܵkߵE]d(TK.UʕULB_  � � � � � � Fy@�@�@�@�@�@�@�@� s r  +$|t`XG-[~~[ ^`}eN6mJ< J }c@�TxID{ =Zڸ1sC�@�@� 5j$M~X+`Z+Wn� 7 S9r;ڸm76rMTv"(c7oﯺujĈ+믿jذaiE;=޽o�/`ZuI2B@�@�@�@�@�@�@�G !� � � � � � � � @(^vU3Yvp@H\xԧϞ[ @K=bWR%֭sΑƏscY/ ,]:[g{ �/;2mԦRZ{/# � � 73.k!@lU+VĦszE�_e˪W^ڼy|I7��R-[&5mZvv7nq7g=Mt u$e:P-ZP;@a PY @�@�@�@�@�@�RUH#~#� � � � � � � � AK dx$peҋ/J=$YAӝ;BVN@ouiM,]{ߏsp X~}? HW^nzO…GHe � � @ly֬msK#@WUVq.Z�g7xC=P(T@#f.j׎vc hРAnjWʕe;ӊ| = _@?F@�@�@�@�@�@�ȍ�ZbY@�@�@�@�@�@�@�@� �Zyp]&m+mذw_I_fT$@KÇK<(bhH*QBrh �I*cre]R Қ5/dz � � @Җ-җ_FK"@l,PkZzul7D �1ѣƍ^z)eB췥֩sޘnG6mڨI&z5p@z7չsg)R$c/^p` w'eA@�@�@�@�@�@�@ U1{� � � � � � � � @DsΈe <4cdcw @ \3+:n&cfZjʾ @* |՞sbERNþ"� � [8'(EA@# &Q(x`DxbYPAENE$'%HP2HTAr|)^egwvwfw¯>ffzS3S줓̦LqB(]xƍĖ �Q+ЦM5j 62˺uG;XBut6tPkժ-[>V?VXa?0-wZ3b?PKߧ @t >`\~=4:@�@�@�@�@�@�@ ]j@�@�@�@�@�@�@�@�_ d0ٴif{ Por0V;bo>k̼9(q*pfKi  ʓNj´l*o7cX� � @f65:5?KL2*%J= @ (TkĈ[߾}AlUbƪz;dKٓnWqh7o.4( #*gNgJNGcV@8@V̞A� � � � � � �/767a  � � � � � � � � )˛ޟ &!ޜLv杓mԷY]@Çe֭[koO=_ x Q*sy7 Cڶ5[͊y!� � @x5#P+Ԇ@-j72 @ \uU;3<c>l5/lY,_>%VeX+:|͘1~akԨ+W^;߶M6٘1ck T;4}�/V/<^+IOJ @�@�@�@�@�@�@�l P+O @�@�@�@�@�@�@�@�@ :rM`0}t4+a[f;(q O>f|A�2ĕ5䓣Zğ'\GdV`-^9m< d|GΑm:fSeVjdK � � @Ӧf7 {-@ ;xAA�/.] /`}?0:YάB3zo4tr6dС*Uʚ4iby֭[ѣLXbdڐ"P+G T5kx99Ň� � � � � � � t@�@�@�@�@�@�@�@�2-Kl:d&JTԨaf/t4HF0۶LZɳr2Fŋ .R z0N-ʕfҨ (peN-^vI'evC�ra&4+Ygͮ.&[r� � @ qk ^=@ EҥKƍS| �-p]wڵknr{nlw(Y@d#GN,)v6i$]P!k޼=֪U+;ӳM(ܹ)-ND*X � � � � � � �ć�ڈH/@�@�@�@�@�@�@�@�ȴ&9<)ӵRAfr4YZ 2o'O>1>:tȼ y3{ԿAw={$ݻ״۷-N?Gw/Zwkhj&Ji9%,ȑ#%lw޼y)<_u3-w`^PY[<c7ff嗱Z~']r%ZU@㵝^c7pMc2oZͿVc U!6οssi+V…{vVDA/irS( � � y9}YfS|s@ mMOVNl�ĪmժU֮];5kUZ5Vr\݅ [39si1c}5&Mxםo-[zݳ[Y Zw^Q| (PbŊ9z� � � � � � �$�Z z6 � � � � � � � �0DVrzp-.~q4\KZ/nUl?Ӷon;v8n믿Bk׮Ǻ - X(*0ҭ5ِBץRЖ| ^m`&Pl)_N8ᄤZWHKŭXbyNPN@s4Nt:eݱ9Rd4?gV8:tdF @x4ٶm M?hO?ӭ_c<ZJAVp+4 tuS)j<8 Rz_x7o97:?تhѢn[9Mc+-%KmCA�@�@�53жe+/_q@�lеۡCZӦM+p!PAfuj׎LGt|ܹ??nwJvgC=dͼmȴZ]@o D*U  � � � � � � �! 2"� � � � � � � � H_k!MD^b)XaͶuVM[)WOoyAWمI~ .|L+lٲI!z-J~�-wE xвwޤ[=hCM)L֯_o - 3z%/}SЃµ(D, кN:)iQ%[76R3^{F´@-  Olذ 6nhZ6mt̢z/$/cDQ*T8&Po)EuE~Vno:i̕|[ab5kB4FeZK.]4!nʕ3-ڎ� � @" xYW1:d"KwC@['O �gG ZދqR/ĻZ,X盖իWuMWn:uF -] .jz}fJ  � � � � � � @9@�@�@�@�@�@�@�@�L 8p͛9qLhirP%?\Iz{bzYzb*ͱ&/i".J PV(Ka zPXZ࢟ =֭p¤4O3?`TR.Bɗ˻0p'{)?77GA'lr% @֛ Tvjr6׭j*HKEc ?IS~Гni<(Y*lK)ZfK.uf hkU+U~*U\Й= � �ě9i6eUW['� +Wڴic-[]t1w5k?1ˢElWYNoEԫWϺu} $H I]F VQ@�@�@�@�@�@�@�G@9@�@�@�@�@�@�@�@�L ɓ a& T}?TAZݛT&~RxPlYkРARH.\8i_Ğt(*=Ea\ P0DE?wPS!fr ,1ck!4+-Jbf/`ֹ-5nh_͑ �믿_~˗eŊ^XJhw!WBi5_OԩȤ[D |&wZc-rJi3̮04-֭scǺ[pUz'jժ\5k "� � kpj6:@X;w7>系< Hhժs=֫W/kѢUR%X]^uŻ\z\k,Xp̢ϼUJ*euֵ͛[=Lkժe 8.V i"-LG@-ޔDA�@�@�@�@�@�@�\@�@�@�@�@�@�@�@�2%j8p S[n0*Z*)X!0,K+XAkr;/)\A Z4T\♌I@a\ż'-yJhM6@BDٳ]8Į]*TU@DEEI6\{ٛoun6gyԻ7ǬCb^#@dvҥn5զ`C:YśT b<~hCWZիY XӸƍݻݾ NSW͚5NKZ _ � @ 4mj6eJ5 Kv=WȈ>o �ķLoV?~|v*RO0a͝{t?"]KUP³ZnnPPLR9<� � � � � � � Kj٢ � � � � � � � �DP w_'J@۷B|r_?ӝ?XAA Z5jn+VhRp-F uy&,&f3gG}d[lI])LDBԨQ-+Mf^ ?eĨmhi6DL@Gs޼yO?e…/B|;W^sCM5dZMo z࿗XJa9s'M۠A"y}<F�@�@ 5;@gy5(S]$P+=$@|쭷޲&Mذa믏ܹ̙cfͲ#x<yk"ׯ﮽?V^=w >W\1?j%yױ';;{@�@�@�@�@�@�@� P+~%=A�@�@�@�@�@�@�@�@ SyqkBD(۶m3(hYh Zdr4E PPxPӦMnH UP(ĺ'hZ4iYJE# _]HnL<V^m6UTɅviVV-]`9/졇:u2+Q"% ŊϊN޽{twjOWȑ^`$Vu!5K2"+W=cؿ-[̽{h"\ĥ 7k5l:,;ݸJx� � @ (PShp p@`1O�@ nt;ڵkg ʾ\ҦL3fkuE6}vBp>@, g6'ڵkHA�@�@�@�@�@�@�\@�@�@�@�@�@�@�@�2%SGh8*I ͳs[Mfgi{�~veY /YGKժU-W\q$AWH&hSe߾}.dK_Ix ۵k ڪ\۷~.,B݊7nҦP4'Qb6/^l�,aסӧۂ Xɒ%3ϴZE @  R;vL:_eOz7 /`zK1rg~Tw@�@�@Jf+@Vt^t� 0>}a~ l„ 6qD[~˗]袋ָqcPaxY6Qt@ #Y&fgYF΁@�@�@�@�@�@�@�, P+K9 � � � � � � � �/OˁZGe˖ٳm֬YnQž={,.8^zֶmۤJ^ @4A^ڛ$m)NaGz4TѢE]YgeZ5jd4Ko6oNR{I[n1N/A>^+7aDvD ~77q?y&Tp=\ӧ{}(yY ,pwvz3m47Y}g pѶl.!r� � @6=z/Ptiۨ@�(Ys=/ڽfuoÏ7δXµ7P%f5o]0k 6IĞ;o8 ;J<yz� � � � � � �DV@R; � � � � � � � �1#jiBX)t^O2ŦNjӧO7M ɜzW^r+]Ĭ@9J*niݺuR?BΝks̱'K/dZ_K@:s%MJ p٠Af^vs ĉ_'Omk_}{=)X{KBlѢy.@5NL7P@?zE(T?7{ֿ^GZgj*VZt@�@ %:a9#}4G�t@ԄxO={3<cÆ nݺeI'.]j_|[`3ΰN:E]dM4yٖujNs36@ ZQh Kr$P@�@�@�@�@�@�@ ԊsJ@�@�@�@�@�@�@�@�Ȑ? &ֲw^6m}wn={ĩVZn;ZƍMY93ZO#JP|,e|NAo~'1c {WwJ(,B&jˊ@9̞{;ּdx<gl˖G v³>Swk.zpUWk|৅g@ʕMK.]ܑy3~ Rƍg>~V^=W_mur8@�@�xPf խ_Ć6m �a8k{/bZG3gڨQ>_tVZСCK.q)/*TH^l@ <x@;-֬Y㾏t@�@�@�@�@�@�@�ibx@�@�@�@�@�@�@�@�'D[mر.H￷C0-ZXiӦVHAPd4l-=zpݼyM<>|p /Zn&p+[lxyfmژw\"+vt,8@�0 ۷ύ>/$_6%KhT@ Tf馛ra5k3>c{G\u]g;wjժ^i1 � @(UݧL!P+jN IXҥKۂ tHdN:F׃phMy|}駶~zw-Q]m۶ƍ[\2|={̶m3X1U#Q#@-TQ(� (PRJǭg � � � � � � @l z@�@�@�@�@�@�@�@�@|\UWgΜ9X5ܤvGiM>ݞz)7yaZffGRTR֮];4h͟?5d+Z=V||��@�IDATykԨ=䓶lٲ~lTOY Yp �aXhإKPŭ[ڨQk׮iEJI gΜnr~.]~uꩧZflСG3R@�@�H7ܴ&MjsW6G�0 )S6nZ@ Zhay &d g۷UR=\W->]|EӦM3F[w*dT@ 8p}f  T`ǎ@D<� � � � � � �Ĭ�Z1{h8 � � � � � � � �DL* &pj9sLѣX–,Yb/iN8v@ J,i;vz֮]kͳ/>SYիWh6l[?40[TŊ 9rƌ&Ss٦MlĈvUWY3T7;!իW.m…6w\kذs=.Ts@�HD/զLIĞgK@:J C v˖-ϛ3U]{5D裏Zݺu3Tw@mzbG'Oi0-E ֬Yz]<t@�@�@�@�@�@�]@x?@�@�@�@�@�@�@�@�#Pk߾}6tPkܸ~6m4{mƍw]weUV l� I1{l[juņn*U֭[_|`e> 3obDP>-j/z@<(HKO;4ܹժU-Zd&Mn *ݤd@mРA.DK7ν\@i6#� �Č|{Li(q(Pti믿lϞ=q;� @ limC/vY1CϦMzASlʕ6`�w]>i01_>%\1! ܹsgÑ9$*j;C@�@�@�@�@�@�@� P+'A�@�@�@�@�@�@�@�@ YC=d_jL0uf%Jp?G@w}?zֵkW;S_{ffMº~̛wc ھ=MsH�ӽ{wk߾ip>]D y3xnIt.]I?dY � � Sge'y 1l@ )Siƍq7:� |Vٴi=VjUk۶;ookP9rUM_μe2V*@ -z7EZ}\X1+\pԶ!� � � � � � �dL@ � � � � � � � �q'ZϪTbƍ!C Ě+Ɲ)B�U⋶~z]'n5UFJf+W';H&;x)\r֕ۉ'lK"@.B4i=ھ+饇>@�@�` 5h@V0#Uje4A�S@X%K ڸSZΝ-yر-_&L`_(P 辑xԊDԉ@V (̎@VxO`ڵVR � � � � � � �1!@VL&� � � � � � � � @I`}VF o>3fW_m9s5#G޽{[jLC);waÆI/vIiMk~JdΝk$l=X`={Г`M}#>֭[7g5MW^=8qby)fڙ=Lwel83O@@y֯_]kqC4&D?&{8&WMKmvwq|=,R � cƌI OgTY3((]kͦMl[k7n mٲi&6)=/]wr` @wk쁻#QF/믛>8p9x&VB6"fjΝ;̵RS`͚5.T2uR � � � � � � @t0MtZ� � � � � � � � @ ȑԷon^{i'xfϞm\pA-pa#ZJٱc۷Ǝk%uzBKYu@`Ӭ06Pْ%Kl޼y!iRλۅ?BO% e::w\7H}5Mzҧُ?61\gw+8>9ҍڷoTkժJ=. w}~7SU ~܆_@>/t$) �|Ku5}{\V^jxvjdkwj-\h] @6 ׅ͛7M)TeС.LСCS곡~}?}yJl2h 4i|VHzxnϞ=Vv �)|ǦSE{9եKZM>f͚e7xϟ?Zvպud19PxGEA�� � � � � � � j9G � � � � � � � �dX@3PK5oMԻh"馛Bkp'1r[oj֬ij)W\~>)s]vzՄ` \K>?{G wo{E:mذwn7g(9ȗ/fΜi}]qI<8üIsL x/gjeJȼW_}e:ur{jOP#l#5Jo ի h_/} 4pn޼ٍ^0}-ak@ z${~]wt~{V!@ 4mj^yA 1@)SB [n}6Vymɒ%]_WK/d{K.ZZ5X)SXbl޽Vv �G:@}Yreꫯv{gɪ̒^΢U% D\jE\ 92 � � � � � � @4 hmC�@�@�@�@�@�@�@�@�3Pk׮].|wߙn)- 3iߛ2RZJX׃>h&L#Gջ;w|\V9N %6 B 5j԰+,mMO(mƌt4\XZMlxyڒE O\ЎX~]{;31"K=ի-ʘ1eJ.mƍk@�i*UJK<�$ *ev$d6mC@WE ^mXNkٲe/^nVPI@ Jn6۶m,Xik.Pu VJ(i269븇@, (P+qU,#p}.X=@�@�@�@�@�@�H] wO, � � � � � � � �$@8>;x}V@fOO>?N>dK.;vؘ1cs? 6̾[+W֭ԯiӦg}ffͲB wam۶u6j(u6d[ttMv'ѣGMذaC-Z4ǚ8q曶rJuVˑ#Gv7owyM/ߦOzoP|vQ7l`ݻww}G\h#FتU.?"4ݻP=l`:={tmP_~^z% 0MxJ+ڷooڵz s:ԫW/;s_mo/… 9 8~tNׯo=zpff> eFpxX_~v)C=5 k׮uXrϺ͝;BW6 8 6>MiOƬ-[:,7ҸTEAC1&\mԨ{Ǎ>_=nִiS{!Km|x\M x/ղVZ穔fOGh\6ś_H}ӹׄM1s㰒%K)*S'cklb {L]s5.&nFcN:~) � v= =]|= v?Bz_c>l_%y7?}5&Mu܍zo_h*@>pjrv{-[S](\u.RWn@ 5#P+N3]r]޸q1L;pC}VϴXEZ,Fs|nl0rH^9k$zJ8plƌqHE/aE㈎;R � )7p[1ǎ>O]V4[wuB@BA�{$V!� � � � � � �ș @�@�@�@�@�@�@�@�G \Z fzMkh.ӧO7M $b)jŮɚ`P)T뢋.rs6M,@#QL:՚7onkv[UVmO$hڵ4)7hgvuڤ$KAKP)kK*8L+@T9+Zll`+jԨ+lLS&VdԚ<l7׭&||Gvmj<` MX)?t:*k~.4ε'Nm:3]T4}*Zmxꫯv?|M\e ~?J3Ϥu97t$yͼy( wvwuWD.3ڥ뮻r&8BcU^2Hmz5P]OS/iﺐ,MTG~wn3[No'gg¹`)zF}Qٹs5nصSaU UHX`@-:=\0akJ5P&XX*jv/j\u\c^ʖ(Qkwy!V-h`�d;R^`Aԅ|禰J]Pxn۾}[~8bLW^y 6_R{W&MkhVZ%:E�P֬Y\kL]L2j/\`6qDMfqz&k$OEvg[o>kMc   !{Çۉ'h r瞨Ro@-(PPZqq*D Y,8.B�@�@�@�@�@�@�N@;t@�@�@�@�@�@�@�@� m߾}.T(Ѣ㙡Cp\rYMMw{饗Dz 54پ&?|թSd:䂍N?I/nK0`gʔ)P7o $8YY!`Z걶mBlЦM7}gE _w (] $S S�B.znݺ Bz=n7M([CկЭpZ)JX:W`şi ό&*}uW PX٤I+Ȥ~>pQjµVX~AI]K.qoذ! ܼkVr7j?jE١a.|rh) <yii(RE:2Hmz9Hm|xI[ibG#W6U-Z Sq^LSi]((H-YčuLˆZ2sL7N;1LzCwP%K&Kk /0UtITB-tNZ`AR߹� `^TZOZd5Fׄ1׵+T! ܹsҵ,yݦ6Ps2U[A�.z̻D@@^ۯ,}1,/ .pctI.[~ }Z{֥K9JʕXD g,@�W^.X<_޺wnNJ>ϗϼ뫱bډ@ ?[J}KE�go_r@�@�@�@�@�@�@ 9#\?#� � � � � � � � @ +P+&ߺu5h$y J;p 'aFXEgϞmxP+|Keڵ@bŊ l޼=? Rԙg r)}5|p矟tXQAQ9ҥ^zI]k_.X_:8#_hI:-[U6oܝOu͚5\x+2O 9s R/͑| 15P�̩1wai<PiTW7Ƨ:?񏫐,5xWL,m1@'-~ _mZOVkf`Uhʴim( ^˗/oժUKڼhѢIC<n;x 15:@�B{ v$31 Eԩ\2){޽TܺUt- ZK|g6jԨP]ס/y}<F�Qޱ)SoXPPM;is 7ԩS/… 'ڽ\5S?zh7^P[˥^~駁�$a=~=bBu 8ot,�%Yq,6"t�)@-}<? @�@�@�@�@�@�Ȭ�fdV@�@�@�@�@�@�@�@�#pj)XJ7.u:vh7xZʮ D~{Iݕ+WvENnߨQ#{7UV'sʕ67Xti9s$-K,_~'=N~ŋN>mtG? DU~ ֆ`t?7eB74t*v.[,hn'6EhV7ߘ~P|fP`;@ N=T,5}o)S Fbjf�ye||\TT)8p{."0SHk̐>Z 4;fӦMS[l 17l l e BL+fo <S_%5W8k) � ߿'u_z@({A2Pƨ<֤IXGy)3l_߿usPzN!H ɽL di+i{N޼ &x׳ &*]>R35kzn@�D<W^}ڊ+lذanZ[gVbv#p�ZǛhPVZ>@�@�@�@�@�@�@ }jϋ@�@�@�@�@�@�@�@�k`۷/},Y|C LW <h1ʗ/Bڷo5Ç]69r [$ R,O,XM +W&_sSt`P[Q((#\x y3^j3Rtc z2h ӧOKn\P@�hҡC{饗СCAjGƍmֹsg7ڵ}w6$p\U=5(iH_)�,=%P 4;BeU;gzCY1x…{_7j)7ʨQxWa_@�re5F w8E޽{MDl~=:^ڧ2{vڽ{mڴ@�P͔)?z@ -Z5ou^w5}&t5׸χ8ItIn)xJl�(|r>r}[~lժUt֮5P-/1P@ :ԊB@�@�@�@�@�@�@�p .IA�@�@�@�@�@�@�@�@ wQB4={QeD;mƍֱcG[`կ_߾{߃o„ 6mڸۧ~F]v#GphbMfȇ[֟xQ)(,;&V@BP&Nh*U:ugVIoΜ9V@y2ॲ}Z|>GI ;m۶v`tAl`Ff@ 1x [b=cQa)J*Œz-7=zt WdxO Jk||駟0.N<D'GNj:qV`iTof7~YV~ٲeM! ;w4xo׎;frxš{ezqu"36l={]w兇z@�$嫹]Hu/T5FYwZ߾}MW\q}7@֭[҂O{(`PB'ܹsk 7`�#дٖ-f˖%N)$PjUל?{Nօ^h=NөS ^#IN~v4sNx�ĭo꽚 ?ޞy .7^άbŸA8@?D�ZQ|rh � � � � � � €H � � � � � � � �ċ@-I3ҿN8e˖6#DzMFkZjYbŎ91ccn[nŭ'׿e#GtYf80iZjp nݺ Fe_|k֣Gܹ nKvnJL2c :f̘aw{<j*[4֭]=:ͪp[\9~/^lZW_@M0M>Mv6`蘚 _N 90M2mBnR&Mܹw - ,͛W?1vjet4ϟ?7n> {Horopӻ'#�#P|y>| 0^y啨G}:퇢6Ռ%qEZ=Uq@Z?bĈ1B~Gۿ}gO?%ӒRgФx75Ӕ u|ioZ]xGIRv[ۥKS[5.Mqʭj_~od<^ڦ66&ULڵ|Sch*?@w� pWޙ^TZj]uP EZʕ]X-՟3}k`c*RϷhy7^ѨQ#NA�8 ̼KN:ɍI^~mmݺյR_q Rh}jH|`?W(K"dɒ) @< 3l}_N 5G}K(޽7WqVu St'JOc@@8I4@�@�@�@�@�@�Ȅ#&+ � � � � � � � �ľ@|‚M?yd7ByUǑ#G\HW_m dq+HIa[h^N'N<yfJ.ӾÆ *U7|Od<sL7AiY+8*RD W&j?~hK!SrUp&% X o]_n?Cw۰aCwUv';]s56v.`J (KK,q,;t&$b-N;N?t[vڹ )�^zv98O]ad aXj) {uA>æ3ϸ *Su]wNmR`AԥT|IӤe˖5eu&LvBT^}դ/W}Q~6g}(L;vt13ysy?f^f @ ֭[P޽{uD/nF{ܸ#ȩ+Riq@Z%4I7K/t Иov]]`Α8+&ToZoj,q&nРjl@Lk믿F4i۶q]8Tj2[A/wlBwu`cA}1 DK;wuY.lWcpFK?i SN^u_k^_o,W\ Bj\Cc 5v裏?O]=cn_A�ХpohS&N)$ŋ[zgX*zϫkwX]F t,X }Ԯ3}*} k=®u=s:ŤI\E�I`vwˆ7Vlx=}nVb~ `Uܹ@�({}RJQ:� � � � � � � f"@�@�@�@�@�@�@�@�@ 4ȑ#qۻ `M~i } շw^SxԆ %K<.̅ib@MQhQSUth"cFqf{}ir | oN8K!MJʶ[)h"1EcWvlznΜ9n1<SqFVZ' SpB/%HG?K(S:~[$ugfz�^j;/,]Sc:*w @T5Hh""HJ,_hwݕS{BV5AzW O:Ȫ^ZS4^ڱc)R$7'I>Jt2N u|Ok'H+y5TBJUnEoWK~\o1>&*:t_eA!p FD/"aZv680D@SZҿ̾5_ן545`m eor).3X]G�.y-]wD@z\_lZme^#Io~…nUwwG�^@ gϞmիWo݅ ~D/7慇5l(O>~Yk F6͊}}fmQBNy+Q@�@�@�@�@�H4dq�,i6ӱܓo{?$GD�@�@�@�@�@�@�@�@�hȗ/ D:wlm۶uGW]upǮc "qTR+ ]PBI'.Ν;i hBVZHIo?L+ G;HigdQ+>蜮X"W&LpPv u?nGNu.\8iPvsw5*Z xSZf#/6oYgy� (дiS7Y^A֣G{K&TXdV#*qά阁4 mJ}3fH4c:v۪PxY-[V7iJ*%m<LKOdd O4'|g?_{カ}vSޏQ@�Hz@׽kkL`)4V'~( *d܍ ͚ `^I'% �]F J.B4?3v MIz.Q7 @׍@ ϐ}]5jZ`vl 7oݺb>o8pg_E� ] @�@�@�@�@�@�@�Z ZU@�@�@�@�@�@�@�@�E@nݺ5bքO<^|E[n-*Tر3Zmܮׯ7?p*uۯhѢַo`O'?3GN'WAj@=ڴic5kLup?Pv?~V.Zx 6l+Vm̟<m8,O4( ',u!@ |xOc?M0ڳgO{l.i+ѼP&Y5 ֧h3d_u]߳gO0߷ovic76Se?~͚5`ea<!�q$0oD/qs(]Q@¶( c۔)fW]}D@2eL-vrխ[7͛7osY >ԨQ#B@  .tG~ᇶK:矷N:_&jQI|f%K&�GҧxXf.Yxx@�@�@�@�@�@�@�H&@V2"� � � � � � � �   4{~죏>W_}=>sDSڵ%JPСC.aΜ9[oze]vpv{=룭=RM7dO?1gڇ .uHSomvE{g[&fPQޡ\ֽF T�ġoyĈ裏 /`_c)x(;J(p+Z&c8>#o.+S?s Tɛ7)0xVZ52dH^zi4h S 7`|UX1><� p>⅁G ,]ԪW !@\ (vmS ԊMV@Z/6]_v곱:D\'� @fVZkIV\]k5kf󮇚ݡ8Z<y@�(*U-I � � � � � � �@�@�@�@�@�@�@�@�b_@k*:&uע xj ;Ӛ7onW\q]~VjլjRqre/[rwM>+V<_g3>sN:֥K/\rYK/5lyl:ukڳ>kjղf͚L*T(ɸ"˨@ dڑ;wd;~'MdvN8!YqGuo :ru-JYO�DRdɓĉf-ZDHԍ�Ė@ӦfSVi-"Pti۴i)*e޽%K@ y Q|}6c +Q/ˠ@pеCۧDZ�Zq|r � � � � � � 0#� � � � � � � � @L (0*+qjԨaO<[4QW_u׬Y.b( &g3=sJYHd۶m6~x7n[֯_o 6vڹիG )M.jM&D�HE@*8UˢElȐ!ֻwoٳ]veֱcGkժU_Wr쩢EfK˲e죏>r~zI/�r9( � ^&!xnS )Sj)!!.\#Z�Xz}6rH>})RĮJ߿BL,]kVBgY@ 8p5:O<xZ@(PZj S� � � � � � �$�JsO@�@�@�@�@�@�@�@�8N _|^@34-O>-_ܾ+;vv!;3EnDȊ�!yf<y}n駟^h> W)[lwre3oR1@l?4�b^VZ6h 8p}֩S'$ UUV6mdɒ1W:@>lfͲ1cƸE!Z ܹ=IM= � �(PKϜivy<[%"|4G�G`ɒ%z̙cŊmZ߾}K.y&F&znYڙ]2 (Pe˖@�@�@�@�@�@�@ ԊI_@�@�@�@�@�@�@�@�Ȥ@m߾}%zv]wEa_ӦM-=i"y04i-7v̙3 6&ZpM>-3t_~ ,hs]{.HO{r 3[gkwfka@�_@W]u[vµ4iϞ=ov $)p@" fomܸqv۶mVn]k߾ >ԩH@�@ *U2XlTC&T6nHV,}Ȝ_$?sl2+U]q\ ]kVBvdT@(=14 Oȑ#{ᩤ@�@�@�@�@�@�@� P+nO-C�@�@�@�@�@�@�@�@  1PhU~l-jݻm̙SGۭp֠ASgW^=*y՚v!n-^Νks̱~ϟB4wn͚5se؋/[@�$PP!С[4iɓmرgO<xyY-ܸOcE $zjĉ]=рUV^f@A�@�@ 652% ȡ@ .]nڴjժ  @:vnjc_~mٲN9+ݢ)s̙4P`mێ>,@V,=7ov5"P+4C�@�@�@ػ%r��@�IDATBBaCd!DE@ڊ".{WjhZu@Ȕ)K6=6xp2ν}<3sF�@�@�@ Ԋw�G�@�@�@�@�@�@�@�@ D@! Rre8pTlm6c ?z=8m:tΝ;[N\gpPA>(9}ۼy\pŋСCVZ5�ۺwnɍ6l0[JĞ@�c自;`_|^y{RJOOu}iڴ;cPXGɓݰ~zKNNvQFA=bEWF� �Ą@>f<`vy1d@ jժܸqc C%@� ,[̅g)@KRώ;s]vAoBoڣUm(bLE8�Z%bM`؍7.:p`@�@�@�@�@�@�@�,}c� � � � � � � � @$&&ھ}"y+g[v_>|ؖ,YbsqkNkԨµa `PBC+=uDϗ?(DKCff󨠬;BNN>dk֬Yz||ZQsRiD@.s*n:8qk{LYnݬk׮k͛kTD4JFݻ]7ʷ~k ,0ߞ={ڭj}u_Q@�@�v4?>QY@֭V4!�ػw}WG}dK.իmܸqvgZڵk9EqXQjE颲1&@x/I1vi. � � � � � �Ě�Zvi/ � � � � � � � �$'':P,ei1bDNӶnu9 ~ѢE{tDNТE\ckҤUT)g_L YYYb [| ؟ȑ#9Ymڴ޽{u]g:tpAuJgNZÆEuSi h ݠ* v֬Y6}tSP;c?nڤG]}VN@E\ǽ8*;;ۥKש>肴HJA�@�@ ޟTVyj<QP֦Mq (~O? &gÝ;w /nviV"ݪHYchVX@ Cb\@Zۈo� � � � � � �Q/SL@�@�@�@�@�@�@�@�_@Z QDZnڹs-^ؖ,Y:_lM4^{528kР R?4u~F,ڃB͘\۷3 pF!YrJۼysN49 }-[BZnm屸@Xm?F�(:JUg~QHܹsmΜ9.HFov]͚55M6 Z VǸp׻ѥK#g>|]HFiWAZ;� � @ x֫@ѣ#Wmܸ1A@�Ȱ?>Sn:ӳA?oCu!شkךo$(1 Pzb}}@�@�@�@�@�@�@ ԊK@�@�@�@�@�@�@�@�(wި*ZjֳgO7]g˖-S| ‡OۗIM[ jذK!\~ *l%%PM6AiZ^f 9d*U\3M6=zM5kfUVYڵ3_3� Lʕ+{rCh u=\hQΠ?0sj?HU*�IF{:BEsz׮]j*<7˗/wT]Bt/նm[7Vt *@�@�X쥗bմPS@�Xo|}gn7oUXې!C[n.>VLN1 bݨ Prl@ (P뤓N*q@�@�@�@�@�@�@�r P\98 � � � � � � � �;yW(L†+.HwhP@‹,Yb_~ ݊w[D ]vCjjj~e^ر6o|̠³6nMo۶-;~XNont5rmË77{e-@� a*{n[l-] +VpJ=ÇUV? SUVRRR"ٶu֜�R?|TΝ;s*QoֲeK7=>@�@�hPCyE{kioH3g N  PS_|aM6jӮ];;3GX*UJDبщm�Z;'_@~� � � � � � � jEu � � � � � � � �I 4PHSiڵk" :RG~QX̙lbʵJ*YZf͚nOWiͫZU\9׾xQ lسgڵ:l߾ݽX;5±懳czVz[ZΗy;{F�([];t↼G5PC ,p!v0Q[i�P9¯ RS  Lw~[i~Hڙg+I&:X@�@ ǐ`6q٥FqCiгDA�E@f̘a_~&Ol{5=;otc}Q+@[?j@q%eo( � � � � � � �-@Vt_Z� � � � � � � � @*WVVQJK WR%Ö.]S8W`S~B .XKZJ*9CJJJiĕXaN z;n$͓ݰo߾:mӐu833әcݻ]x4hB򖸸8wN 4m#bZG%/ +Vf͚^bÆ .\K'u|Nb{<'-=Ahp Ӻ?h_jQ@YtߔJV;wtUcRgQ 3kݺuN:_)T*z!� �Ğ &P+<-.o 6CA�"M6}t0a}W�-=Գ7WJYc֨Qԗ"�Z(e/`322*{z� � � � � � ��ZeN@�@�@�@�@�@�@�@�:WQPG~:(@A~*Pȃ??<J *UrZ+@C?O<4h? B ԁ?z?5V 4hxQPzu&ʺufݺrT@bմiS7Qh:Vh¡qhPx=aR~`atoh_S(^kнq?k =?c>,1ǻq0015n:v+|"KKK3 Z� � �%/Ч矗~#,@-g �A̴S_iӦK_߿=6`�kٲeЛB ?-o{j XD�Zzv ^ڵ1===J@�@�@�@�@�@�@�X P+@�@�@�@�@�@�@�@�B0"tbŊVV-7DI-wZA *tz²-56-?ࡠ.^ /J _Ycyhq# �O@&wCq+?545N~U`+ *XgitoUXV2M]~?UAY)))5@�@�'@-/ 5/6xFD@ݺu]6mDV4`ڄ@lٲ&Md|M8fΜizجY3۷]q.HK)!vvxiJ@:4&ԊIS@�@�@�@�@�@�@�u #� � � � � � � � K^E!I$OUZ\A 0ʵ|3۰!ED�@nUKwPe_$w˾@�@�@ Jz6/|lCQ4 hlܸ:wR=K�-h)@kx雷z jذa,pd@ƍc4:ԊK"Z@Z+WZjEt;< � � � � � � :k � � � � � � � � 3~޽{c48Qaq{a{@�%0wEN@�@�#PY˖gBM]Zj'o>9sM<مhiyfԽ{w \ifիW^QYchV*g�ZFρ(T@Z酮B@�@�@�@�@�@�@� P+:#@�@�@�@�@�@�@�@�@D@d' #5jm# �1!Eg۷|rL4F"� � @11/PK^ziӦbmF @Q֮]³LbfϞmuBݻr)VRuH{XF;(jMAPT @�� AU@�@�@�@�@�@�@�R P= � � � � � � � �&LV4�*PZ� @ ̝{NJt @�@�L@Zoq4 (fƍB�Hػw͜9ӦN3[tn&7n֬Y6zU f#\G ?j5m4EC�@�@�@�@�@�@�2@�@�@�@�@�@�@�@�NT@d{5T={bմ@ 1kĬjhn%mC�@�@�߰Yz<ѽ=#P^=b(P ;;ۖ,YbӦM͛g2.cƌqYݻw֬1kO@;(:տh @�@�@�@�@�@�@�(T@ByX� � � � � � � � @ (P++++N@�b TBV1 @ s皝|r@+G@�@�@ 0[ծm6q"Z9)T$tҨo' D�X~͘1æOMܹӒK.֯_?뮻\VӦMK)&֮5!&J#cL@;47bxIS_*� � � � � � � P|oǖ � � � � � � � �D@JJ ZQyfiCh{/ �e/@#@�@�"OwoI#NDu7|U P۷o3g�-?Dkݺug$=zc=³:wl eP+^5j-m*@Vyd ۷oZA>I @�@�@�@�@�@�(AJ]!� � � � � � � �  +Whh m@�D )ɼN{P@�RسlrO.Cq�@�@�>}̞x" Bzƍ#TJS`6{lo]˖-sl%u~_nݺYժUK:;m3YdžkuY?c h P+Z$&իW椧GSh  � � � � � � @j�l@�@�@�@�@�@�@�@�bU@ZYYY|ڍ�Y 1"o �R`<lΝY=*� � �lf7k*`:Dy&+Wtcki%dr-Qb�g\Y3gtZ]|9bu1f]ven u@ oo}w)2e=ԩf*y9n.\+4t+(# Pjyƪ � � � � � � @ #� � � � � � � � P:)))Y:;g @ $$< I �1)0gYjfMdi4 � �QkWd *"#p\,{衇\`֚5klÆ nZ6k,gqZDx@ ܹ3'<k֬YJuEqWBLDHTylժC|YJfcǚ=QEfZNA RԊ3GY@Z @�@�@�@�@�@�@ ԊSL@�@�@�@�@�@�@�@�(@ʕMQ@�kL³b-@� ̝kֹsI @�@�@  l$F"fϞm_~eMJ>,t"@0222\Ykb vr?5̆Pw:#G8cu s"M@H;c7ŽP,iڈ� � � � � � � Pw � � � � � � � �HII={ @�a@�h3Ǭghh m@�@�@�/qbK{=n [0PPᛂu\K7nB.r7VVÆ #T9z1Lv֨av-e>#@V+j;jι � � � � � � }� � � � � � � � �*Wl6m5 � T@V:,A�$DΟovTk� � �-p3ۼ٬v G lڵEYvvvKLLnݺ廌 Pﷅ ܹs]p³4ܹe˖֥KXiiie_Q@N>̻Ϸ7ӻ6KNw13("tQPV~b4@�@�@�@�@�@�@@- � � � � � � � � K@ZYYY@`8:2-x9K@�K[sH1D�@�@� vy!f&~jD.Ϯ|=%$$仜 P4IgY+�СC^PuNRƝ:uҭ{G*z=(Q|$ѣ[<"O@;g8  � � � � � � �N@- � � � � � � � � K@x � �Ą9f痂� � �-Pѿ#&N$P+l4VD\ry睶iӦc!?hРc3JV@Y/y Z~;Pz\`ְaL!x jժUPd+(gf0;p wE\ͪV=WD�Zzw ߿222ԊL@�@�@�@�@�@�@�|DA�@�@�@�@�@�@�@�@�~\eff8)@�@� ?`_Ęh.D�@�@�LZ(yf}n8|p(aM( Pb … �`mڴN:٭j;wvYu)#,{;ʎc3H P+RVիW[vv6Zzi � � � � � � �Z0 @�@�@�@�@�@�@�@�XPVVVV,v@H^=WMX@�@ ,X`֡C F@�@�@ }޽f,C Z{-333WTnݺ O@/}w zAw۶mB;k!}z&/ƌ1UeA RԊ3GU@Z*Dڅ� � � � � � � G@< D�@�@�@�@�@�@�@�@ RRR/Mh? P#f2@�"C@Z#GFF]% � �K@ZMf6`@FmT/~aO=:t5)..N;4}ӆRgfٲe6\Y+V#ޏ<+W[ǎvN:YڵK^H^ݬeKKs;s.@VAm JһҢi@�@�@�@�@�@�@� a6 � � � � � � � �*òb(~K) �D}f^^ *� � �$nָ٤Ij)1 p-ؓO>Ҋ+ڠAr^3@ dgg?a xbۿUPZh.r7VVf,>>>h?a hghjBWկ欈@DJƐ� � � � � � � 3j̩ � � � � � � � �'bC: �.@-F  �-+lѧ#� � P}MXUD@}/D!@o)AÀ4֬Y².\~xVffD :t!Cw۶mkIII @f/|tÇ' Y }f*NUz@@�@�@�@�@�@�@z9 � � � � � � � �Ķ@*U={z걍A@�0QZa@  @,0Tɬe@W!� � @Gz\Q@ u]k$&&Z#5T ]6Wp!Bv6Wze^{ 5@X;r,.lM6B  JII t$@N:)L[@�@�@�@�@�@�@� P+� � � � � � � � � [@B�'@-:>@�.@V*TQ?@�@�+ЧΝfujR1"Z]vvgڇ~"=T dgg۪U\P֢EXYYuuY +ݴ>5kXys5v02>8C:dg6A j75Y@�@�@�@�@�@�@ Z_]L@�@�@�@�@�@�@�@�JH 4Pvn@�P#Q}i  j>&J#@�@�@:v4ZlDJƀ6mdׯm۶X;[J^_r%i?$%%ya'5\ؐ4]V-kذ�%M a+VfY/LW X۶mMYFrYVgR28rݻײr3 .Cs <ߠe6躓|Ul#ϸiPBCEUt<uJLLtCdck} %Z~(5k,== � � � � � � @ #� � � � � � � � P:j+{E�#P+zO/-C�bF@Z^@�@�@fz =ػaC^@&˗/ .KիݠxxUZ5&Tzu4�Sz{n7m5(xڵk;7vZnmڵsE@ '"ߒ%KLYz=woM+HKs .e}*PΝ;k;ٳ4(T.pHR` ByYyǪjZ`ii]B÷.C]Ok~0NQ=-;8tjjZ5A9 7 ޗ|P@6o7'tRW � � � � � � ��r̨9 � � � � � � � �!@Vd'j� P+8炚 �OV4mV � � /ЧK/#E5uT2e͚5/^BCRN۴icZ'9!W 6Jj,-Ǐ38r�lٲ֮]+kŊ6lv rԽ{w;S^ּy1*pZj zSewyni|CA rzFFݺuömrbޢ}}φ;)IjԨa7>&*999'4III.<+*kFzke5zURdo߾-Mkr*/LC 2SxW~E~·5ktcMҬvnд('a8YrZ@]@V  � � � � � � @;皖"� � � � � � � � �Za1 #@-I`@ -2SjEɣ � �L@Z=d^x:Xe mͳ?>S6m PxP׮]mv{?PaÆݚ+?4((Б AW_&z>dy dS%Kk e4\{9Y "$4/_ޅ nڴ6nܘkPxi))(<)oؒB;uLXjZ!ZUUhKc´TW}ohPXi;w愠)tM5kܹs]p^gff檒B:uXݺu^z wˢBq ғK"N@amԨQ՝ #� � � � � � �_@۱% � � � � � � � �Q):qPT6F!�% @-O7  �+`YbY*� � �賲I )e ۻk| eQՠAlرֳgOر)%E/ k6uT/{1cƸ@-k]x6`@o lݺe),+tXl VbЬSN9F0! APHj/SAHkXn Xî]rUWW AÐZl‘wB=(+= kQ[kΦaniSEz5hA߫^ ƍeZR:wjyH@r]MA�@�@�@�@�@�@�MkZ� � � � � � � � @)))gϞgE@ ;#�/@֭�;B @�@�@|*W6lDK/-ߺptJS@! zeff0o"=p%))znͅL2ŵ߷^xulӟ.Hosigxb۶mbe\aBE: Ҵ*U!vm+V+W~ș^ji_]H^ԭ[7X@#P ڨl۾} s[~}X෌ Ӻ* ߬_5iĚ6mz̠�% {=J�] P R @�@�@�@�@�@�@ ԊMk@�@�@�@�@�@�@�@�K@+!�vYB �DڷSs@�@�@>f}:QJJ@/6mdv=.xH,\sڼdZjeGQFYգ"m;r hQhV!-W`u)xfi>h>1Q{ҥKMaokXl뗴4<CinGjWe@ 軴f͚nСC?p]}w+`K Ӡ Kh5kZh5w>@RZpG� @ U � � � � � � �!@VysL@�@�@�@�@�@�@�@�.@VOC�@ <HVNW -[ǛZը Hj]sM F@�@�@ f;wU #0c {'wuxH_wu.%cb<z!7̙3^|E{﷑#Gwm͛7 h \6g)th߾}J rQЙ>ޗΙ[liQm@.={xѢE.DK 7d=۱cG;B*k@ *UzOWYX~-_ lܸq{nYjj w}vg}^d wG�+-SJ,Elt_зo߲9GA�@�@�@�@�@�@��r#0 � � � � � � � � s. _@ZD @�23_M  � � P"{a6eС%Kv@ ̜9~_|`ݻw7x.BSGO>j;=?ٮ մiWf*l B SQ\s9''4KkժXXr)|onw٪U,;;۽۶mB@ JJJ*-`FUK,1+j`:\Y}թS'ҥ隭i鎡5СCk/@|M  � � � � � � @l ["� � � � � � � � �Za1 δ@�@ 2>6N5ڴSk@�@�@:f-[MHV5 W@/wy;vꩧ3 w]/55Fm_{̅\{#X͚5c֦oݺ5,hڵmBZz_1cx߳-РAv|M@A>ӧO3fYlΝVbEйsgC.DI&WnD@MÀr5C . ΝktQH# ѣ+h� <H֏L!Pn7Un#� � � � � � �&@Vs`@�@�@�@�@�@�@�@�+@Vp 5C� x}iB@�PV f͚!� � �as4P+UY@ (<GF|`guV =l5j9^}U߶'x9۷osCPZ%&&FB3îB�/_n˖-sceÎ;~f(E!d~hދ ͊e,ٳgۤI0͉6yd۸qwɺuf]vuڷou2p-, e6g9stm^n RV޽ǻW^156ݛP@|ҙm'tRV#� � � � � � ��r9  � � � � � � � �HMMݻwߧיV�*B@�(41T  � � Pzˌ0Hŋۈ#Lx._NL)(?]tET!QxVZ֠A7[VuֱcG7OPHUrrr9r֮]+4R]ծ&ރEA%W]uhgUE@ >|ؾ[/ܠ�,k޼z!;Sg5!!Ďˎ@dkarvi&6mM2 ƍLw:MN:9DB?L"A`ծW � � � � � � �Ė�7 � � � � � � � �%@5kք.+!�.N ԊwG�"W`:qSs@�@�@f{͚eֳg0HN:ټy\DrOLF /عkW_}߿ߞz)޽)cvrTa7̞=~m۲e=]O?mzU0z?\2Wh²jJ*U\…8 s^4R`GZ>��@�IDATO?uQ߮zׯ_L$Q)N@nݺ봊¤̙c&Lp 7`;v0')K*FGsN¦U\nZZZ!� � � � � � ��Z � � � � � � � �Z.pB @� yJ � |i.k!� � � nmVĉjkz'#<b~=':t-^خJ92#R>裍nv饗e]fڵ {yWܹsX"gP`fmԡ4\|9-Z0P%K?O{wlָ̙qcK/٠AVZLڀ�(H[nn;ȑ#^P,OܠP̔;.!C|v*DիM@�@�@�@�@�@�@� P+9-F�@�@�@�@�@�@�@�@{  �fj.@�djy}XS@�@�@�l$3~ 3f)FNW]uU`MZ y+0X<Vrг_*T?`+-o~c;ӆ v.>l?44+tz۶mnxkРۯBN?iZjDu7ߴ7x,Xt?|{WcǎDڀ�uغݿ'裏޳kow+pOH/ }W@ � � � � � � @y /7Sc#� � � � � � � � PudGV@OB� (P+99pբB �W`f;Z:� � �Y@ZEތ (3ƍg?\DY\\ QtM~_yʕ+׿uN֑#GL_v4|I;v)C:Znmv!~h:6*ִiSk֬_4iba#L} /ا~j]tQFíqQv�5g?t]쭷޲/]ӯjQF;@�:x Z8TݿtI@ � � � � � � �Ġ�Z1xi2 � � � � � � � �P7v:j,G�6P @�"O֙@;w@�@�H+2pb=SoU^fM뮳͛[߾}]m#_{Z@?4kýd7ڀ\XUv0@ ݻ?~;LwW3<cm۶9 �X : / *U`O<a.G(-uϑm ep�k/@�@�@�@�@�@�@�^ >[H@�@�@�@�@�@�@�@�@ ڽ{wc@ ԊųN@�PfEG{h � �KkףsLzQ-Zd7t xK)gguY6b;w]}֢E _ꂴ<Xh lb~7> g>mܸ ~|")LK!G(ԀE@)g5mj=n:{ * $"1III6rH0a͙3ǪTbz{�H)( Pk֬GG�@�@�@�@�@�@�(ʅ"� � � � � � � � lU粲]Qj�@ P�:>;M6t޳&M'|R׹Y˖fqq` � � �%/`֣٤I%op ־}{Mm;{l{衇K._{";ڼy 9'<]~+ۺu3xW w0{Ǝk7x 2{[n/ҦMfj?.rng`C+V۷o>}ɓs"~t.{m_ . gmO+]yvwx+X+m_©n8v̻,t;M:t~m{sα^E]2ɯh;+~g}OXFF14C!/gy=9}g5]m8eԱcG{-\Юy)ئݳn=W^Sco >jԨ6oY8팴uJڮ;\2_/;<wg:atM_|թS]nf۽{w9ԦhL%AP(##?<ѽ~կzXG{Oz`ƌ~R! -;_>\+a_ ga7޽{N*l5!� � � � � � �D�ZQzbi � � � � � � � �'"6lNl��Z%>@ hukْ%KUMujժbwƔSeժU9"� � @Lx26qbL4FF‰k{B O-Zds)A۶msAT<ަ'\AW~TzrWR%/I>S2e)lDeԩW_i?ƍ?Wiޖ-[@Iϼy\�Blw]deey)J RG֭[*mww"FnZϼB}ٟr)v뭷~kVٛoi S0InLiyˉ㥗^rA2+VtB rݧ-g?L-tV׿e/\xYmw\ "unWm(8`~ :S�s.>_E9_@A*WvL>>M{z*eǎӂ<&?]ioڴ}*\M_ޢ][RR={DuuF_o] p ?PK e%=ׯ_By]"M;Pu@ͥK�صksuu]>By/[D麨{a  � � � � � � @ {#� � � � � � � � p\K  @uT @ >\ێ5:wvr-.P\"BH#P+RD�@�@ 21S͑Yj}~ذaֽ{4o߾vWk}ԁO~;^QpѣˬN [z׭iӦ6|p4~xmVZ5W(d+h^aZZk׮~zհaCkРAn:*w? QSi:tۼe Q8A uu]r6nܘsB ݗ?*u6.l~ˋ/x}ڴicgq=.I?>lßH;~mKKK3)/32uYvmϜ9ߍ]?ggB@{ݜH@şMQ<- Yk߼+pv(SO=v<|r H]+P ;pK]uxXMW'{jbwu/iӦŅSQW&M{b}Wh~Q?l:B^@1cƸ -@-إq � � � � � � � \of � � � � � � � �@ժUݱwUnu @dg׉OԖz"� ZF1߉:(T%u#T@�@�"HӎOAQ+i&/k \+VXuRp՗_~izRσtz-Y}Gc[b_h~|@-5k1y7q]7~ r.+z)�,tB T-yy<.0 )L%(H@)G&t=:]C˻R~f̘az ry]s=glڵ.I>'|.J;mBBKa,hYv.=Z Z넮pwV0\`[nuA6۷/nئ ?E9l~בݞ5RX[7?p t-C1J6!3 RKP o?O dU<u"0 RBY?]\uﻸ{ /@i)oܹ_ *~._O*/?DǺSlbbb!� � � � � � �D@0 � � � � � � � �Ĝ@jjkݻc4(�ZEc}(O}lNj{N:M7d 4•Mvx㍦e}'֬Y3{G]GfrmA9r)vwNt\떔3XϞ=m]{ &_v:l޼=6l`?\ŋ7tv;: VG˪kC qۼyw9syGeCub?^tUXk9E�@�@�VͬC,̱8V@Q F83]xs&Ol RGznqEo[A4/]СC.W^g}օ /\Ϟ=Q(IaT?}v=D]{ѣ gR)8EAM* R8.BBo=9r]~塋Klβz,X}wx_!Ea.7W6mU^=d'Psu9.,WH`ԁrΙ ]mk׮m)))|]7˴Yfٯk_W%nyyy:z<+LLXXzT[w *S8BвeKP-[@/=߿٤ޣ*y*HM~廎GiiY}Oh\~~;]X{" v̙(--DvU\w׮]{ﰧ~x O'z_6}t 7`s[,naL!%K,qA~N+YxQ@!]:^߮?kW_os *ާ~ yzwիVu^*k{8lذi-}u5eAo:1b-]]7TGcu{=ku &?ǻٺW -~k}Mo?Tߡv4hPGWq?3ڦruOmCδ~[7gA�@�@�@�@�@�@�i -A�@�@�@�@�@�@�@�@�ZZ%%~@ EA�"A +k,?tҪcLupNQ:UBc:);M5cYuK:BTcǎuY /o߾ӵ?Ϯ_SGm{vZ*<K!\wΝn0-/ԉ^쪷^+Keʔ)=8U.\-Vzr7n3<TX,^_g6#� � Pޟ}.Pl8V@K?vTEaYݺus":¬ԹFԑ:W=ԩ?mƌnyQp,) W{ޣ+:<B}^zOkf_{>wnڭzUWpr;�vtuvh\E+@w,O믿ކ^ت9l.LbEa*+ڳg7΅o۶ͭ+zҦM˽w]yU\ٝSO%t+HL,f-Z0'_;޲UTΝkW^yժU>sUN=S!SpBa~hyβDZVVV+v\; yQmB6kR!O=qhXJ=sg=s£ϿC*zƭgQ>\p[_ψo&즐$h@Ϻ-pa‹r,{>/̗EVA&ڵkþJ߽-7^ps(XMԹ~W(ܺ׵=fw.qr݄i( _Z\0*T(jBytψ*}뾵{իWmׯ֭&r5kf/}]PnANtRଂwUt>'h"wCJaG 7s3VC�@�@�@�@�@�@�D @�@�@�@�@�@�@�@�JR ))uVk׮-B�R@ZqqQ4�Q&{rȎ;}Չ;L%רQ:uZF :I ex饗쭷rY@lΜ93Ruꦀ,u9hy;E= lŊu 7|BɫJhgW3#F΢J!1]GUgMETɲ:T*>.5Ykm � � P}͚eP(W͛7[zJڵ˵_=PShy7nBlD!. /)NѾ~i?)jԩ.JqxСuF'`1بRSS]uhQɾ(h&^IL~ cҹ*Ҹqc[=?Тa gjذaFz~?3WM(LEUcƌqO~ .8p{o(^eȐ!.4,m򫛶 j]ѣwAp:y6*Cj{fرvABl>o۶g>࣪6 %jBW" JpE*kAZ7TtU EA)CB $}{g'!Nxܹ;܉籖-[5ټy7t .S(_/}G75dg=z]|r޲j_}ӧO7e.ɼ^Q<^|3'KNuz)WECoo|%טBUP}+m.<OIt\:<඙6mG^۽+99م|)<eРA@đ#GZҌBݽ - o +5 ځ*u=7pm٩RtRbSt.KI\ۃ?gu y'i>R j#}/ Py4i35!b-;ņ ܶ7~.�V}o;իꫯ6]{x7[X ^o!P+b� � � � � � �D@Ldu � � � � � � � � @Q ԨQönZTc? @D ѧ!1?կ_ wgϞVjUӠ/2ҡCmۺnܹ+Vp)4h�@QFjs=ז-[rn] 4gc/<p+ i&ر}.K&L?о+ҵO Sۚ5G@�@�(mjy*6kVi#P}h`yGѴEuTtQXСC]h{ oF%%%e8}ۨyWQ`Wqrʹ]APQB+'x?t\̻gƍsB ʪmO?m: H[x ѹ}ײu/%(wSXKLQX٥^ju$%q6bĈ,BQEmVYݻww}8s\`o\I ȠdYT臎(JEuG̙3]u~AI~ϭ4{y9ֿow]v~v w_(]9]vk_y?#չg~o(ROa THBg_?gCd =>scgqN-Y{:kA߿/w}w`qn})RG b_1G�@�@�@�@�@�@�"K]Y@�@�@�@�@�@�@�@�2 h`6? S<D�@�C{w?�vj\e 6 A ¶h"79s̯-Y /g5(Sy饗tԨQn`ݔ裏\�sg_W[| 2 pk.70;;wkh+ � � �.y6mZ z֭[:dNG MRٲe#<b)\<8dĭ'r S*ƤRBCvv„R9V>~۔)SjղO?o0cq}* ERH.XRxu׹{wqqqnyAyhk.n/ܾ{ᇳ\'?w}m„ .PLTžTE] 4iRIPnN;mܸ}.]PVW6y>2K9F|4^ڐr;M>&+,555;~E1-k{NmBXD.]!s Y,UZ7¨5jdcƌT^>oK9^ven5? \/}W z\ ?v~g}@�@�@�@�@�@�@� P+!=@�@�@�@�@�@�@�@�@XjԨAVȲS@�@tbbڪU8oEÆ lݺuEJ*m6g))d5{ݻ�˗W^yŞyCrڕ9|Ww1kvYgڧ2{C6߹s_呾@H?@�@�T Si۶ ޱcG_K* 9p :>s.2P*'(꿊x*gqFVKtBv~ }nه~Ṃ<%z.X7ް;υv)*?#p!oLu'y֬Ykto!YWe9uQ.TkS :餓wo6߻|m0qٚ5kܽ3<^|Ew2;. d6nNG_x9{K/^z,s_^+p8{u(][kP+EQy0 m{izr_ZJ / fr$jkƥY[j?jfq6m<<~xNr~.0~qFf}u֭ceF]@h � � � � � � jEyW � � � � � � � �Z@B@�@ 6lړy09sXʕ �l{W5f~>}|pWAZsr-V~}2dmѢE6pדM}/>M:4a;wn`?pU5\2,ZfդI~"� � @i x9*6cy}qaM_|E3(C%xx?AJ|7nv|´k)  {B \'BAE5Uy_3/X8oayxb 5j!k*JE>Yڦס=XSFa FP /}gL R?n:ura7 qzwp s z'\Cvo۶͟rww~~ꩧ\' `k֚7oٵOasp3׿Cf ަ(篿zw^N9۴iSQH}2e[4h 7Fc7'ֹ' R{jB]K2_9\׍` ZkP~ 3oo9FmCڞ}Y=5kp e omUV fRPƎǪ=y,zW^y&n={%$$rG^]vXab* @u;mvAy +!� � � � � � ��Za}h< � � � � � � � �'@Vٲg@�@4N=ngyW w…v뭷Щ }駦- aVr4˭ZjI'd/]uU6l0@*7ntS қUQj`4S 6dwZ@5S}Yͺv`k=߫W/]4xpӦMK.nh֭f[h1D�@�@�P-믥 "RȄBwq[oe=v?q` #k֬qnذM#m߾m6~x[~w}.8zn;cvmO?&L`7R/oz?(mm}yW]غܒ6y^~W{L>{9wL+ ?܅enau䗝;w?w쫯_6ϴl:,wOvGu �3.0J!CXfުTb aO<1#3j֬yH0U uV ([t+uqw9Oxؠ\Ԃ r٢t^ Ea* #Çe~;r- 裏 _W)˭ Fr:_lo=m4馛lɒ%.~0{1YtgY-^ꚐoZ?k/+7+'<7jGvb~iꫯ= բ{ާ{ɦZJH6FE@Æ m`؜>Q~sտkO<.H*XK ^E]}x衇EO ]r%} @U;<Sj~ѕ+Wڵkg3E�@�@�@�@�@�@� Gqu � � � � � � � � @*[#� �&мy{7p#Fpj0^ Һukk߾vg/2?]tSn�̓&Mr}n5rid 6qD j*SNu\ /#GZٲe rݪU+Kc?Gn=`7|LOwj7 0vkU v7Z۶m`~el-g~"� � P8ަL/3@ \{g.v辆j>{]8„uڔ)SquBU* r`*ov>[(|C֭[7w_F_pn}ڠA\SO(pkС.D+pgӦM6)`J}=QES74ݷjӦ ٳgO^K `BԆ;M |a+~l|ТE SAΝݽoƅMe&^^{5[7];k{ѢE.SNtM+kk(ꏜs+: gɩ>--Fs*i_N)tU^K ȋoIQ<: PVŊM˻Ut[oX&M}ή ̙3]`sncfW8YN<K_|#<⦺oG}TRxv)<LYρ_v!ݣ19]ubڳg\P`~PQ0t]V�B]�* ]jUa-/zmv׺ezx cTMbbZHM6GnCg&zۥ1}w̿fVGaÆQGe'|<ugn߅黡>Uw8}ҵIA\wNǎ?;ms_y)/66;oy> � � � � � � @xXV,\@�@�@�@�@�@�@�@�r^`H klܹ(@ g쳥>5)%Cx G+ǻ/{ǭX-2ޞ|op^n3aA4Yp+Vƍ@ ~>yyҥK͚5vm6\r`Tk׮&޽4gPBi`k ټys7tDɃ �O% �Cz}?5_OǪ @.x eEFtI+"=h`Zja/wVϙ3Ǻtn:j(</` 3ݼy)Eut_JEmiԨ돂t/ǟj!"�_!8_wg;=1 ܯ�.* ?P�ƒr*9M洯>ס>h%@)a…w Kmĉ.l"}9SАy9Yg{*�D {k] \GO==.{TR�~/)5!oe7<U_o|}%ުUv; RxB(�G�z?֩S'Zm"Fms{aW(-!!_T੮[U'Ua) NJJr!^ٞm@�@�@�@�@�t~_?@ S ~|SD�@�@�@�@�@�@�@�@�H`M[n.7@�@ *4Pt[%UfS4X-H)Sظ j}kנ* 4pӬA5q4o<c_0h~ w@�@�JCG_,#sL2 ֩S'?aw_' (8 \{}9FQy:zսe~{0>jz%yخ@ŋB-f̘a}^ ̯֫W/-?lKS s[n>1Ir ͗T2dHBsj[IiEF%Emo߾s ^^{ ʭ}4?m5\>oF;s|w[r_WmYf6G!:y,Vp΀ݷ=\Dϛ(0(^9v5(}9?ȼ?e<88ӂ^c?nfPbX`{G0ݷ_~˜~*&x +SGĆ@ vWB" 1[at mܸqvg9 � � � � � � @p�."� � � � � � � �  ڶm[4w@�@ ƏQ}*hTmECQV3Ӣ>"� � @1 (P;͒Ȼnȃ@Vg.̅(%ʠA#̱Y+Wdµ}0|'W_Y͚5]74UHҘ1cl6b{lϞ=.tEa[~ִilŊ`(x%==RSS]ְa~!lB2>[Z¶wӎ9<x"|wΝ;o͙3|Ыv @S +{L7|]xsQV?n>[nu;wuX!ړUKV T۽{wV,5J^Eu<?u\%1y|쥗^ӧ۩jvر$_dOUd(7Ǐe~Z@-}ǣ � � � � � � �D�Z{9 � � � � � � � �9 h[O"� �رwرޒnE/Ö/7kҤTA@�@�@ 0/B0(Ltv}pB袋J*6dȐ8M5u]V//QFYqԖ>#o D7n 6ex@eV*Vh *g߾}[o?ofͲuZ,%%Ů>֧~ՂBO/4”ѣGjI7|;2>)H!\s?{s9>l/�t08`VЙʥ^ګ.|9묳z_'sGt R0JvנPC^[KEk>y0aUZ.wMnԨQNs~P( ~ͶmfC-Õ1^{5$yI%86 � � � � � � @ U @�@�@�@�@�@�@�@�Q#==ʔ)6 � �j׮-Ho1+s<NeN;-:N@�@�@"/@;9œvTƌ2ʏ{m3fĚ5kfxn=r-6o<k-555f>ڵ+ˮ(lg̙1JT��@�IDAT¸VXe'NO>9j*[d-]MoUZ˖-]躂׏8|ZcHSN9իW^tMֹsg\ڵ+n+'t?xJY(נRdCzP?>S۳g 'յOtaY}P)Wa<[yiiibiƍƍ) � � � � � � @xqh% � � � � � � � �%.@- ԡUV � � P< jڴx^@�@�@�z0˜9JV`g\r6jԨ OPL8l۶;<,11|A+_۷ϝ|_ZZ\_[?}6m4۲e5o܆ fn:xs7Wsׯ?/^&Lp[ Q] RV-<<  -i-Z}WN۷tI.0G%Q%($,Bz %pjv觟~ɓ':}tZ |嗭_~VrpRmC=GA�Xr;@A�@�@�@�@�@�@�^s@�@�@�@�@�@�@�@�rP֭[ Q'@�@� v$P+|-E�@�@ ?CDVMX VZ٥^j x7\HRXv& /ȑ#m+|?L+.,%%ŭП;⡐”uj}HX"- =IIIcbb\0ؑGij~W^ޘE z\]f S_n֮];ի={ E�lf9w\:u ܼyohԭ[ !Ͷ< (fAVhԨQ1#� � � � � � ��Z|vh � � � � � � � �(PfMw-[0@E)� � @Q ,[vpoM^ � � 7 11ìmZk;vaÆ(bŊ%q?ڵk]}MOO6Szu\`UN:mR$+,wE_~{n[d R… ϶6vX/4K J /9 6oʗ/a<@ 4h`ÇwUA3sqr {mΝ׵T=X<*mCׯ3g똮ezرǞ{9;&8oi%.@-o � � � � � � @H R � � � � � � � � :Z*Z� � �Xܬ4jT- � � P0x-ͦM#P`lU <R?lwkOڠAov뭷ȡ ?Ol׮].Xj߾}9:(@{*Umۺ SVp2e%%%9rlnZjeժU˼;#Re˖]޿s￷{֭[B0ڷoo;wN:6mRgD5kl޼y?իWQGeݽܫMׯD/VS@tVXasp� � � � � � � 2FȜ � � � � � � � � @h ԪU5h͡0Z� � �XLc`2d @�@� )У@B(nÆ oN>d;c1#q x뭷\0r/.s!;{ݻ׾+0amΝ;ÊI$}nc>s{ꩧln݄Sf!}ns11µhwr6k,7}m֭.#:¶JƍB74ؾ}o`?/ئM,&& mi]tnɽHM(} Pt9* � � � � � � Jj٠- � � � � � � � �ʩXmٲ%ZES@�@�@0Vy2S@�@�@�RP;g^xN5#@ӦM]ӏ?hw} 8ЅNp viY r>ZLMM7|{1[b]x6i$g"C3~裏lܸql2@ ]ve<,WRX\\|iӦK/d DQW!![ ۊB0T8@{;w͛7^x}N[ժUUV5-hт 3d-vZ[h lw!ZIIIa[ {cǎ.N;J %P+k"P ٳgIc � � � � � � ��Z!|rh � � � � � � � �-PV-ۼysi7#� � @ xchZFE3v� � �@{wY׮ P:u'ٳmԨQv[ll >.rkҤI &t[p(9tMּy<5L2vqǹC… ?{?y|^_g%z ![*H[lqY۶m36mژ~ J S=R`܂ _uS} }轡`-[# {Yf.+3fP֬YcK. %Kŋ,UU<H+}Wuwj+ǐLycMV@t � � � � � � �D�#� � � � � � � � @͚5"O"� � @XZevaT� � �*pfuMFVV.]޳իWۋ/誂ufC3<4h}ϮS-qƹ0?>袋L1( [nqU!"}]av*�EaЏk׺-?HcomݺխףöZnmvX�뱫\vyɛ m„ ~k6W_\UPػw~�EȬX–/_ZuT*V,׫W/yZaÆհiʖ-6D={lÆ jEI/ � � � � � � @* !� � � � � � � �  jEY � �$iES+ � �@n![G^@asq6yd{w_oݽN;"۷f̘=qD_nݺ.Lw/>+ώ$"KM/K)Eg~ַ~kcƌ;wdƍ]Ȗվ}{SY 2@ʕCfnGjj矶lٲ@U_T mµ9" E-n7o6 *SuժUli]8]!qM6uU瘘n*$~2>IA�@�@�@�@�@�@�n{@�@�@�@�@�@�@�@�rU'Ǖx@�@�BӼdâ4@�@�"XGQ"t-ʗ/o ru駟G}dO=zVvm۷˺vjڵ `kܹ?ؔ)S\ݾ}5og?;/Ə]MKKsCA[z>w^YZz*`˯  jժU6lKmݺu\Urh^aFgvm۶eV͚5^z.$П[:u 6m7f6l0uֹ,UQ\r5VU}?83\h>7G)]pJp(u[@(~u@�@�@�@�@�@�@ /@�@�@�@�@�@�@�@�V@Gmٲ%y@�@�G35 6R@�@�L !0[#*z*Ud~?g4i}6rHKMMUZΝcmZ6m\B ,~~9s͛7()HKZqMnȐ!+eѢEϟ?M}Y[j['666CȖ m# $PF 5p5kڵk3 aHG ,IJlٲP8{$x y=^va#tc US7oqJJ%'';24^jzk d֭[6-SPVݺu9B^ @ (Prs@�@�@�@�@�@�@�BI@P:@�@�@�@�@�@�@�@� OH� � �/@-:_@�@�(=N$l4J,pPQG7liii.~3f~u7n삵4MHHDW6lBZ SB((dӦM.(Iԫ&%%w2PK֭]5\c{hѢ8g/_d)$+l)`m֬Y+dU0Wu .;KTͭ(|kÆ -?XIS~wU?IAM\ѱjժeZ:MUTq" QcŊSͥXaN*̟j~Νk׮ClRչR cg׽{f-)(w3C4)h<KYrB0пSo"  � � � � � � �j@�@�@�@�@�@�@�@�@�l4X} � � @ (+7&Ƭn =@�@�@�2\7 G 'k.̭K ؒ%Kl_mP-zw;TP!PmGBDJBYf͚ـ\V6mrP[VZvǻK۟i رcmٲeU(iVa@ Vk{BN[N~¹"?RT^s zW-|r\UTVU] _VU!bΩ߿?0?VX_uwcUw^v*K׵02^e Sh`yhi*7 U/ �Z%o@�@�@�@�@�@�@�P P+T B�@�@�@�@�@�@�@�@ 4ۣ � � @ ]kVy_ � �@fLJ?Pxias_x R̢P_= b-Z (0E[O!G4..6lhRȯu7ojV@?͛7թSs=^z-*GA ~\qƅBli{nWu]м~c?J*z4e9n9veԥe /Mx0|rխk.JW*<Ҕ�BA6z_JA� P9" � � � � � � ozfh � � � � � � � �! PfM|@�@�o,nk A@�@�@ 2w7~FFPKz\˞z6kg6 PիW={}p@Ȗ¶>cKNNv4m:udG}tQ <PHUժU]rXxyfcٔ) ԊNх P+lO �jP6@�@�@�@�@�@�@ Ԋ�� � � � � � � � �d/kAʕύ@�@�B_`ZC@�@�C[73/¦M3;3D�A@+T?@WZB~'S}-))=ߨQ@հa @d Ԫe6qٱǚofcFv]h YٲeCPVbbbn!� � � � � � �Gnź � � � � � � � �D@\\[JJGY. � �%fY&'z� � �+Pya+fOVEZ�]@Y'|r`M6p-?d7ް{Fߧ;u!h 7v iGi |;7FZO8p@p9Y3p׮]jEY3 � � � � � � @*["� � � � � � � � jE٦ � �.vqEz/ � �@fӦSi+ @Q Ԯ]N:$WnݺΝ4.]XΝ 2E�00F4klР0KXrEbbb. � � � � � � �V@ = � � � � � � � �,TRRR"t @�@�PVWz� � �!УٿekYfZ� P5j԰޽{iǎ6o<={͙3ƍg{µ-uQ@ <F0Waf0k:<AW@111Z@ (PL2= � � � � � � �E)@VQj/@�@�@�@�@�@�@�@�"L 66(999zFw@�@�.}kV^t"� � @h (PK^9Ӽn+C�(=UZ][uV]^y뮻M4Ν;4_zuS /`hig7L"JVlوA o+V F@�@�@�@�@�@�@�b P= � � � � � � � �,PR%Rg#� � `qAo:  � � 2f fOVȜ�@5NpoM\֜9sSOٚ5kL2֪U+ڵkmʕc ߎ)$P{}مM`8ZH["Y --bbb" Xb%&@�@�@�@�@�@�@�Oe� � � � � � � � �9 YJJJ$ � �GVh'Z� � @4 tn6mZ4>#�@ڵV֬Yl̙Z*USN-m%(呂�!!P=DhD8pʖ-=@RRZuJh  � � � � � � Pj*?G�@�@�@�@�@�@�@�@   � � "P+["@�@�@�R`@f  [3;fʔRjE� ة:f[ `kOT{ > kΝZjcAG7}O|13ގ֯_111tڌ@X \Һu} � � � � � � �E'@VY'@�@�@�@�@�@�@�@�"R@<t @�@ 4}Ŋf5jDY. � �ΝffjboYfvgkuMa �a,mۺ:|pד;v؜9s![>z.P]v.s͛qi:'w;aO͚6 >P"Zuhmd(PsΉ @�@�@�@�@�@�@�B UhBv� � � � � � � � @d Zrrrdw!� �  ԊN=@�@� {1Cͼ|Z0-/넰84 UZ^\{zj1cM>M_~eۻww-pnݺYΝRJfL@^|Ѽ@;O7=iVr1]"_t&jr@dkݺuPh � � � � � � �!+99@�@�@�@�@�@�@�@�^ ..RRR_g@�@�@  SD@�@�:u;Ngiʙ5l?b� @ 4.Dgy=.Pk۶m6m49r Zy'gϞVzuڵ]6~x[jU7#" +,+u4J,Ѐh'%&&F[/ � � � � � � @6ޟS@�@�@�@�@�@�@�@�@� <� � �!/q � � �-pfcǚ͝k֭QVFY?R@�JCbŊֽ{wW/[̦ONj<8pA(lG.tuVL3 P�M^Sz6Mȃ�Zy@bX`ʕnj1,C�@�@�@�@�@�@�X@0>y4@�@�@�@�@�@�@�@�%P$9 � �(\/+� � �D^}լC웲oZ  @4~T;<פ;vجYlڴiwM7dlu*T*ݠ'avUf]j6Ma$@V,1 Rxi||| � � � � � � �N p5 � � � � � � � �D@7~JJJw!� � JKA�@�@�BBMn3+[64ls<� @( TZcwyM<6ols̱h=֭[7Y4im۶-CI4klP]B4* HR@Z VF @�@�@�@�@�@�@�<x � � � � � � � � @ BJA�@�@�HN6S@�@�@�vƍ9۹Qi* A�@@eN:ٵ^k[/^lGf͚ٸqkG}]GYJJJFD@fkzWGCcI U3j%&&B� � � � � � � @@\`@�@�@�@�@�@�@�@�@  ޥ߈+b � �/@V#Z� � @ Thfzslխ{r � -[4Ջ/ue6m4lʔ)O[zzo޻F޽{oqqquڏ@ (seX!C{]pA!`j"@*yv� � � � � � �@�@�@�@�@�@�@�@�@ {`W@�@�i}oVnH!� � @t x 6|Yr]B( �D@]/A3ΰ'|͛g6m &X>}\֙giuq[\snHw&p)f#F]y٢E]@[&E%rJKHH(ݱ@�@�@�@�@�@�@�O#$@�@�@�@�@�@�@�@�SJNN.ðo@�@�(&m7+[@�@�@>jVY2IFg@�hU 2Ğx 駟LGַo_>} :m۶vW-~ˏW} x!֭͆ 3۷/(�ZcK *@Ănv � � � � � � �(@VT� � � � � � � � @Q h2( U @�@�HI9xؒ;&GB�@�@�*PϛoM7 �,PӻP<{13gx7&Nh 3ggmuԱN:ȑ#?;vD3}"zl";b PXy9l޼ٶoN!2,@�@�@�@�@�@�@�[\tw#� � � � � � � � @ne˖5jr[@�@�@ n=&k=@�@�I2//ʔ1KHf(@�J]@4U5fwo>S{G2t_Wvꖕzi� вSO]~{AeT UΆ@RRkEbbb& � � � � � � �@L4v � � � � � � � � @ Yrrr6!� � @jeK � � BcƘ+goYÆ!0� @ (`kȐ!Oۂ lڵꫯZ-W^={ZZl.lkܹ=i_`pSO5͛=[ ,@Vʕ+AH.~l� � � � � � �g@�@�@�@�@�@�@�@�@ gXr&Y@�@�BV@=54 @�@�`v;ww6={j{zX2TYV=׶m_30.C~-SeW˖-kr^RW*Tp4TUX+W*U?@�BQ^zvy繪-]Ծ+WGe#Gڵk[߾}NrAڄ@^|Ѭ}{+0{|mdп=o UV-r@�@�@�@�@�@�@� P+,ND�@�@�@�@�@�@�@�@t,%%t@�@�@@ X@�@�p m6۲e[qVuc7 2i)4+EU  r[W߷ZZLZv(<svi{?ϼ@a4|jլzY֚5k_FA�@87on_~/_ؤI+t۶mۺ`~B&-^{ͼײf]TGcߑ,g@RR%&&Zh � � � � � � @) U'#� � � � � � � �  JNNF@�@�$@52-! � �6nh6lM6WxyfSU,h@x=;)Ijժe n>8rʁШ*UXJ^bB2Ue|T{>{n$-ܹͫiy>8̟Xrf3SWVE~·~uSk׮muqU " � W}С7xM:&OqwmWI^*EA \N<z6k8\ZN;CI@P:%ogLG@�@�@�@�@�@�@ jϋ@�@�@�@�@�@�@�@�J Ը|;F�@�@  3H@�@�"I@Kk֬kmݺu³T aK 6ۻ~ ?պW**M1߮]q5o,_*l8Bm4Ud?s @mǎPn)`+>>֭k;֯_=.?C'y� P t߿:իZ>)tAp-lCA x̆7 3+| (Xߵ) P2 R'@�@�@�@�@�@�@�`5G�@�@�@�@�@�@�@�@�,4(Vrrrϱ@�@�B[@>?@�@ rz_54UU04UURpQB0-[p$$e b``Xb XSZVUlӧOwS۷/prʹיBQ¦ڨQ#KLLt5!!h=  @ p@1uXzz{6`�8puQ|7ޗKecǚuf6fWlSiX 賎wɡY){(Ⱦ)@�@�@�@�@�@�@� WcK@�@�@�@�@�@�@�@�F ..RRRt@�@�HرìjH}A�@�@tRSS?e˖|+Lrʦ"USt)ȯ RTT)m}�l޼م)-*~po6lp(_ٲe~֤Ikڴ!U\111@�"D@]tqo7~駟ѣ;p kjԨ!.p1f#G&{DKR@X.p>g  � � � � � � �jk0� � � � � � � � �Y ԩSǒ---b! � �+@ 2@�@�BI`׮]… TK,qu֮])|7J�ъ %-PLum۶~޽j*d SP3lʕuT֬Y3kѢlM8;#]H\ @�PX֙gf͛µk=={'q:wm6qf_~ik4lBKX@qɖ0:ZkݽE � � � � � � �Y % @�@�@�@�@�@�@�@�@ X >>8`)))AB) � � >۷U> � �v _u݅h)@(-- ,kN=Tk޼ RPUdi,PBtVE5kҥK]UNj/ͪU悵ժU+iӦ5BA�,}woI?{6bS袂ս{w+WM"U@mX3{y 6PaC\ЊPP@�@�@�@�@�@�@�/΂5G�@�@�@�@�@�@�@�@�,ab! � �+cYݺ>Z� � @q ,[͛gsuۊ+L+K@[={@<2:҅� X� ( RTXWׂbG*XY,AEIҔ=8 IHL>u3<sLf<wӦ*W\qwh%Jnݺn޽A}MKKӲe/G {ebŊ`֭[Еmۺud ~.۷OfrZ|AUVM~^zrQ=^:=;J7[8Cj(zNO'@Vi9,ԼdɒJNN3b@�@�@�@�@�@�@�<ʓ � � � � � � � � `lRQ  � �Djy@�@�B|;͝;=~ڶmJ*²ڴi#Ge˖6la[ ))I#K;wԒ%KxbY?ڼy,#PNt1ǸG ". !O@�\h߯_53\kȐ!۷>l4JGOǏ}Ww�4|jϞO´,T� � � � � � � @�Z#� � � � � � � � @իWw[Y@�@�K@^@�@ Z`f͚Z|֭[e˪uرvکEn{kH(@Ŋ]XfT-\PwĉҥKB;8]v੬#�D(^s5n?\;C믿^W\q V`- :裣tt;ʔ}V>^ץA"-Ԋ@E`ժW^ q"� � � � � � �@@`q( � � � � �8��@�IDAT � � �*PdIYƍ㕀q#� � %Uݧ � �d ߿_ӧ~ ۤIuUrtVZYA�HNN-z5g͞=-=6mN:-'xj֬y+ �)PZ5 2-w, zGu7#Թ瞫~`%Dc.\^tw+RU ##C gOׯ @�@�@�@�@�@�@ fԊK@@�@�@�@�@�@�@�@�(^pÆ #� � @iUlЫB@�@�B">@3f̙3cս{woRխ[7vBr%hUka߾}Zp 9R[nU֭]qY^R7"Ԋ�F\r:3b5Wo^5hkYn˭x}Wzcy=@>֬Y={hC�@�@�@�@�@�@�'4XƊ� � � � � � � � �HLL$P|� � @%P+l4� � P(e˖{QǎUNvmR}YmܸQ?{1wyiJ\ ʲu]iӦi͚;wVluՐ!C;h׮];z� /%JӃ>+Vh޼y4hO׭[W?·(F:G^|Q9$@_<]mNիW~m#� � � � � � �D�Zza � � � � � � � �&PfM"@�@�!gZ`@�@�0 SVԼysӷo_㏲ _xSz0@ b[7t R- ׳2|p5x`}ڿ(F[ �$СCj!-e] }O<х^yꫯtbƪ@R^K{(WQxo) #? G޴iի8 @�@�@�@�@�@�@ Ԋ`@�@�@�@�@�@�@�@�(jmܸp& � �E@( � @>2224m4~_z-]|Zj;7l*A�8T{i֯_ɓ't0`7֮]' }-[j.duҥ5j>Suͽ_s5={6Z+mO<!Y#{oЪHHHQ1$"K>� � � � � � � @v@�@�@�@�@�@�@�@�r@ 6丏 � � jEg � @ ڵK<4iaÆ裏O?yi.!^m7_TR._vZw+5jȅn-X q$ @ 4kLz/^Eϑ3fб n?㠃h@} r|)$p/zjWiz_95"� � � � � � �D�ZQ � � � � � � � � �HLL$P+4Դ� � @lǽ{2eV%!� � Pht=.gѸq㔒zH͛7/t�+WN^x -\P+VT.]ԧO؇ @l lRwq-[ zKm۶U-t=hŊ5hF4+]w]ЪHHH1"O`͚5*_jԨyG � � � � � � �a P+엀 � � � � � � � � 5k֭[eR@�@�@ : ԊE/@�@�XժU+=zǴd >\e˖aGxI}(p6m*{sN8pUNi#Yfc `r-j׮ )lUvwWF2w\|ݻwąXK/~M:誫Ҏ; EރN:$wo$<B� iF&Lp?ku݅6nXwqƠK+`_#Ҕ)ҧF8ygǖZXznR@�@�@�@�@�@�@�A@P؄� � � � � � � � � ؄6i̦M@�@�H _J)@�@�8ػwZuYKtR 0 #gx_l"_~Y+Wپ}٣_[nu#ize˖rzjf ;-h]?./{]RJ._u%k׮~hX׭[W?͛oօYX<QA^4E{) @~,�|I6l1c(99Yg}4Eg"/tSڷ@�P Y@P � � � � � � EjEŢ � � � � � � � �Slذ!ݠm@�@�(K ơ � �?իW/{.fر*]t xGf͚[,پ/Xmڴ룅S_fO>Dv[oN8AÆ {CRSS5j(u%3׭[BzkڂJ}QeayXZjٳgk֭M,>e}uYրYHÕ/4+PT)9tҤI_|QVvmМ9s[ŨK˗ 2,@ ԊC@�@�@�@�@�@�@�FE  � � � � � � � �D@bb&Zp# � �>o.zW 0'>t � �E[9m޼ٴh"(RI XpMak,"{i[~ºn&}g:p@fVҠA <r?\6kNGuիo]z饙+WJ,~I+v}zty?/9 I5RjU}EA�!PB 2D3gΔ} @{G)))h:LIkJ7FY. U~(G�@�@�@�@�@�@�(.Kz@�@�@�@�@�@�@�@�1jժt"P+.,A�@�i7/>@�@� <Ú?M5j6W\p8 ]q]۷ok>[7m:ԿYot׫{ݻ{`A6ְpB5J't^}c ;K.q曵m۶ Җ ]xnL?i&%$$dU\+{'gϞ.i)3V.p w6aÆiܹZ`Ǝ‘c=߿?vޭx15֭[r&SO=yݺujה)S{{nl}i.AFO?]k׮u3f[j h޻ロe{= _?#{ϡϜ^_K7n<L~wz/k؂m]3={/ׯlc׮]<y;.{#y7[ d}w:SdG 4p&==8~\\~ѠjyN(}o-ȹHs2 � � � � � � @L_bc22@�@�@�@�@�@�@�@�B#(0� � �!G@^@� @`뮻.'G={ uz5uT-[L`[nq,~*UXxӊ+qfrO-[̙3ըQ#c[]W^y&L'xBC X bY8TAGq�_;wv4i¼q>cլYS?sH,Lo?.p ,쨣rCuX :uE]F·,l*_w˖-[t1wY8믿. o't}Ȃ w_z%w':v7|S?;m̘1Rf_:K"d!^@dap\ec褤,gժU=pH/z n]Wv>+^vuս۽oq@/*r-tcc,Gڼy{رC#GtMv?"j#FOA�ri&MrAZw,t˂*.]il1 ro y �*`ٟ@@t @�@�@�@�@�@��""@�@�@�@�@�@�@�@�E&ܰaCt~"� � >%�@�@� \Riii:Bjᚲ@^mICsrdM{u=ҥ[]$ 6%M8 ÷ǔ)SX}Ѳ*+ժUӷ~+ko~;믿v… ]0wqB,Bl[~۲ :3ջwoFu׫rFygoO?0,RJ.voݺkӂl9眣zm1^� ֮տv"3 p+ Dzl/lp {ƂN;v Vn , j۶m&ѽ{wŠ~wwYpRq,,u,Bǧᇼ?sz}=ץcڻ˝Z7n{.s{,Dx饗*11Qڷo{u�&PlY 8P} ~}{Ng{ \xTGA o 5k\j15#� � � � � � �.P"@@�@�@�@�@�@�@�@�@ t6rеJK � 6&+!bp& @ 89?? o &`Y6mRv4m4tWdVRBf+³,�fΜ9-+ AC6Q>`RA^uYزj*5iD۶msm槭;OtvEy6m2mٲKn}w-#<RcF~ro*))IϬNp_l߬YZo߾]{dWyY0Xjժzs ,i:u7^VݮիӺdVnK{mN:USL|߱{ߩXbfLndY`d۷6 ӧT?DnXz{c`]#�y 4hXBj?.v׺ Ӽg_t 'x9z@QsX9?wnݺ`܏=/!P+-#B�@�@�@�@�@�@�%P":X@�@�@�@�@�@�@�@�5kWN � [@-\� $Ԇ� � ?  !2p@]r%Zr>l~ڵkWݶ -ںu;L2nSNzugy,we˖rʚ7o^tR-_\_}mfokɒ%ƍg9&NJr}OnOrCn+캅YP*{Ν]KgB8-X`~^$=~7ڵk$uP}9p ]?: |][n%}g}+W;{&ի>swΌ3\蝅gKܧzJ#GsyW1ى�q/`kz&O5\-4BI-ls޽qK��)su, w|^ w@- kTRq7E � � � � � � �Q*@V^8� � � � � � � � @8,Pkƍh6@�@ Zwcx @�@ u`(Xt1bl"뮻N>lH.s.oԩ>Hϳ"ce8w-X׈#sɂvaھ},<&{YbEM>?̚5+c¹# sW 6 ^Z5Yڵkjժ,=cVZY͛Y➷h"H|rw .(W>%$X(]B;`;VΝ٭_Z~A۳o, hxg5qDy2{ {TlYu1iY^, HJJҸqdO+jnMiiiG'͙#/<-GA(?PpgsVQ5Pw) � � � � � � �&@Vn2lG�@�@�@�@�@�@�@�@�,PkÆ mg � P$ ZEQ\@�@�` U \s:t>}hӦMpWhݺu8p~GmV_|lْk?3wb컭a?tfov47|1cu3gf9kYv_@{o?WժU\)2eʸ/>o</_>sExb^VmۖY$hԨQO|AfllB.]diO,G믿 *DZ џ^8X wޡϜ^_jI&.8ւ 2BV^- Йzps9_,pP%`7G�wޓK^|z{ܠA4{l\}{ oy4C(WO"gk &bjg � � � � � � @*g � � � � � � � � jg �@zzt5#� � P@/Ӆ�ESzڵ/^\ڊT o +~:w-ZjժY6m{naY/5kÇmqi;vwwu]!0iժU\veTLSO=UO?~awYɫCf͚u 7hoV|Az*7f60ۊ׮]k.,^Ћ/%KȶY1c,ByO?Ν;S Y~.YV0iݻ]v g/pFUVmfZO49<S;ӧO[G`oذ!psAImaegTv:}GԐ*{[UW]^=z(G$t|Ϝ^_ףג_um 'FSN&{v{:,Ϟʕ+{%^rI}v^l(x{=gq =XuQ[6 <GIﳖ} W@-F }֍@-OVh3ZC�@�@�@�@�@�@�MmW"� � � � � � � � F`&ܵkW{A � k{qC*W\ � �DQi@ X uY.\Bʑe4B=\e:?.%vmYVٲe m!=jrٹ6l?P_}F骚3g ot-mo L l+u ':-?֨QK/:uBӖ5͜9Ӎw{l߾{~O>Nw͟?_^z~W7/؅xY ҥK6 JKKӀ\0Bؚ7o>Z[ӯ_?&7�6m, 2dw-<V\⮽Z|?~ i>w]l݂,P/wcmVp*۞S9\PN &(11QIII, !fi!dV|ˮݟ)f \Ӎ3-ȭm۶:31v/+Y_hnz/=1 BG*TH>id}YP\~^e ~=zZl;CދC6l7n /0s<0ރt^yW1AV@�bL9w?;6m#Fςs Z ݣBxygWU!jOBkgnj^E@�@�@�@�@�@�@ <+F_@�@�@�@�@�@�@�@�"J&<y,.:VL>t&Ǭ_~1B,У?x[�gvw%"l: 4i}Nm(ydR<^a8@ RSHf hw Ə@,�ʂy' ߿ N ^ iݲ T_LըQ#KEdaFdMUTd/f!Yqg?oj ]ll\TӾ@lڴM&~gB{VZ }SN\[N`QܓDc X;v/UV=ڵBWw^_>b'B_v, ,n/bToEW~Ϝ^_˗0v{e?*zxKBB{1=sn]}J^/rU^^&rEOB#�x n%Y0}עN;ԤI?0dJ,. cOh@�@�@�@�@�x =G�EY+]r& � � � � � � � �ě@ZܐmrD3^@�O`Ϟ=r� � @WJwOh8䓽EnR򫮺JǏѣulٲahrrr}& ʭXQ`QRdK~Yq<Լ.eQ(i?G`;oT*W,[K~`<u>sK,&?|ny<l/0(SNݜiիW/]aݶxb=zuiiEnaL+MTXQm۶mexPـ�@~6%1zz]SO=>}hرܹsjpW/ FCm"Z gb))džћ-}@$~ -#� � � � � � �d߿~@�@�@�@�@�@�@�@�@ .Z֭3h@�(;w+TP< P+ � �jy N]s59ryu]3f."]zj޼y[,zu7ov8UZ`2pұcC֟x]rڟ1XHM^W)_|^ wj֬Y=Cj~(:N<Y=W~ڵkƶmox˖-#K$7cg_ 2e>uE'xnFr)iZED 駥.&j%7E2=0R ֬YFV^!� � � � � � �D�Zq � � � � � � � �Q!`wT\YjE墓 �D;\_mrI  � �8p׃%G vfpӧ'X矯*+dÇ׼y܅1b_ SlY?HOq|.¶Ϝ9SCĉEڷo/[B]nqs߾}ohԩaÆiҤI[nq71Y 0bi;5nܸHA�8(Y>=-e„ :SաCu9_@#UK^tҨQ@L ˼k.YsV<}gk8@�@�@�@�@�@�@�` LMB�@�@�@�@�@�@�@�@ j׮H" �Jl2uT� � @22|=`>p_ ڏ ӧ[RRR\+nA;vt>lj*Gqx?H|ѣfϞkUV'+`djӦMӌ3g[oO>9~mϽ@Bc32@ N92g{.Tr\pZvGxBz%_Vu T RtKeؽ{]#֮]ĸ +(@�@�@�@�@�@�@� ms� � � � � � � � �.PV-[.ڇA@�@ o߮ʕ+GP  � @< WSN:.HkѢEZtSu֪_7|S7oY7-)p!P+dy6d!'W~0ϛ7Os,Lzܸ^xmܸхviq �q,йsgY~RvtE裏v?g%2C A ==JV1]vUԚ5kTnC@�@�@�@�@�@�@ Ԋ;#� � � � � � � � P@ڵkU@3G�@�l2t � � @$E ]$\Gun&͟?_)))?~mBtզM]uU2e6lJ  �|P}Q5ԩS'׵kW}.DW_u{˗MF� kj߾}fm#X+2n1ck]@*.CkZիwh@�@�@�@�@�@�@�kKO\_~� � � � � � � � @*g � @j^@�@� J m�9 $''k<yl٢ٳgҥK]@ZԴiS 2DO>{'ϹF"@$ _^ӦM^Oe˛Uq^Iz駕^v? &[n*UT$ � Pdf͚eku}mٲNZ亩h JI'8P8Hػw^ҥ#1ٷ;wbŊ19EVN*lC�@�@�@�@�@�@�..s@�@�@�@�@�@�@�@�S&' ) � @ $ � �C #W ZФ+P{av-7x Z`k͚5Kwy֭[e˪uر,]vjѢQD 55U .2o<&Z m8ʫnW ȓ{Q#ҸԠTLAZX@�C&Mqƹs1B%O:D rhy/>8#Ȑea۶mRJ WugyE�@�@�@�@�@�@�BM@�@�@�@�@�@�@�@�"EvnBH@�@�ΦMF@ � @LZ1q9D X r׺Ѯ^Zsw}_uԥJQG6mڸ-[裏VÆ R  ܹSK,ŋh"i&(QBGq:un~۶mri.iJiŊ̙[U:ulYmcRuhLk �Sy2e<{M7gϞ:S\RB+ЪtiZyZ ޽{]s=Zx Ȑ-׫W/ȴ� � � � � � � ujE% � � � � � � � �Wl"?S*Togh@�bB&֭[LA � �D�Z A| ԯ__/bγ`-\-O?VZ ײ-bCA�Ҵl2/qҥ.Dk͚5UbEڲ ;{Mk%薜Z@k>Ξ-5-;^- \l;Im �(`3dO>De{0_ѣ党^!3M9B *SLZ@x Z~x� � � � � � � �Z9@�@�@�@�@�@�@�@�rHJJrlDP� �UZ #� � VAJ@ y :{ٹs 駟ܣ}Zz222T{`#8BM4q7yr lb@^ 6[|rn!Z;vpT k֬F-[aÆJHHDժR%{^W,l5ҺuQ/d{9g ۲k vFYC�@={Ԝ9sohرu]\Zzɒ^}�'r(Q"`ZٽtQf<jYud$ � � � � � � �"@VR) � � � � � � � �+Pvm7ũjufd �J&^޾}ԩ&i@�@�<Zwy:hX:wڵKl2nYhNgZF 5‚ W[Wy,+DM"VZ+Wf.͎RlY&g޽<:ꨈ{ ´9m`V;ps[ewS![x/yق� @?|W<&L^xAwuP'ڹ*i($ KL24ٳG+Wk׮u?E|@�@�@�@�@�@�@ /=! � � � � � � � �AYJx^*C�@�I@�@�"A`>_/ԊA@զMdoBw/|gEbk?Dd}p-(:999s?o!E-pw9eI-DBX+%KTRR;Fc=CZZ-` ^Ⲱ-[V4Iڴw 2-d x� br^رc5l0?^^zy=СC{_ $psҸq5vFjoٲ5\Zt ĭP@�@�@�@�@�@�@�( P+ /]F�@�@�@�@�@�@�@�@ kԨuօ� �1"`[!P+F.(@�@�b@@ bTRa[m۴zj$ѶnaF̝;=n߾=KVڵkµ6tbbAM|ďݻ`MڸqAcmlu[3qw;vY-;wV~T~}ffcer  60h5s`2)#w,a[_4@� gƧzJ]v s1uw+^Y ʼ,3 .=P3yq %{!( ʾYx(w%Ջ2F@�@�@�@�@�@�@�" Os � � � � � � � �ģ@RRq@�,7M~afC�@�@pj΍@@RZj<vܩTwH_53,Kɒ%]8Bu+B,˖u{^reUXQ%J0$fk[nun۶l٢͛7g>,=p5k+{lf0=ł,L럅@Oڶ-OܻWZR}[.ok>q;?@�(@v4k,^Xۚ8q V8FI< M*ٍ@ >)S&z]ݰa}vZB3F@�@�@�@�@�@�@ j*@�@�@�@�@�@�@�@�7& � �EXx7o^j8@�@�   t :#r-|&޸q[J_OIIѢE2,)##㠪-|ڶp-RR%ͶWP!s¯˗/Bm\r*[l棭B`Szz,_i׮]=Zȕ-vl \$93 DuM6iVF�-[5Jx,s{I%{O쥸f/h¶[[n)W`- /meW9 @NYoС:s4n8]zzsϩI&9¶B 4l(%=,Z$Bhd��@�IDAT P+<ƾ:eC0Tƈ� � � � � � � PD � � � � � � � �ģ@RRq@�,O?c rT� � @ZwGL[Ҹq|wuVe[N( Zzuf(mHYT~Kҥ]V/a{_Kyo؄9-e-6 en罙ў[XgY)OX`ZjW,`eHF=6QgϬ[-5UW_q s/ k>ZFA�@ }x5x`ժU+~k "U'^^V5*Z]@#F jYX}bZ} � � � � � � � !/=�b7 � � � � � � � �,Pvm-\lA�@� `T/^XÇ/Y� � @   u6 w*U|X,j׮][eSXؖAU\t}=mynپº,ojU\9h³ZH�Vo,N&̗-=zd ۲-;o{2S8)-MBl-/ˍ� ]v{Wƍӛo_|Q[c W/g3z鮻W/5!Nfߏ(@6Ҽ//u Sh@�@�@�@�@�@�@ ԊE_@�@�@�@�@�@�@�@�$7Etn � @ ZJ;wT˖-tt@�@ WJb2&(TUP-<@ ZFr=^Vޯ\QGe J(d8 @ ,0[oU5tPuIwyF-G)}G^n]*Yuq&"`jj[N5k }ahƺR^0N � � � � � � �&鉶+F@�@�@�@�@�@�@�@�� ڸq3 G  �DO?:ޢE�F�@�I Բɰ-̂� �D}>_߷|[ia[l4}Zqcµ/q2$]N�Dy5k&Lqy?W^BXmdpɂ-?P+VGɸI,ZթS'5 앺u놩4� � � � � � � MjEբ � � � � � � � �D@rr222~#B �1%h"5h@+Wq1@�@�@ҥ{ @�O²<ҷdΝmYȖ-~*=dT*5k[,l˿ޤ |B�D@I/5´z!CM6zt%Ds <8 XV)@I j{r<k*K�x@�@�@�@�@�@�(NCqR7 � � � � � � � �1*F$1z �oձcP4E � �[`>B#Ł � +Jw[?mY#8 /XAА}![_\9{m<G�dvi3f+~zJ*TnGl߼l2]scTRv!/}_/dZ0eZjRҥjHe � � � � � � �)@Vl^WF� � � � � � � � @ $''Ҋ*G�@�8_[nA22@�@�HO'P+*/F�@�B ԩ#o餓_/HeҥK>*;~eجtѾ-7O>@ Bʖ-Gy{?ɅjuQoZj=n  _Ҕ)%Dn?@-#cv{7m7Zk޺u@�@�@�@�@�@�@�bZ@ @�@�@�@�@�@�@�@�(WUiZ@�@ ,Y-[N2@@�@� P+E�@�80m[BFr/`5k֭#_#- /-Zb@ |}… usz'\Vz}-ϻ޽IԊG ߿_%K̾(ww2vZիWE@�@�@�@�@�@�@ ԊX@�@�@�@�@�@�@�@�@RRB"M!� @, |תX7)7+/@�@�ػW*]::DW@�@�(QBjطXH`YNZeaʕ}[ԩX  �`/BcǎհaVRLGk0`4xiTF~8"O@_ OZ۷=4-"� � � � � � �D�)*/F�@�@�@�@�@�@�@�@ JMM G �DW_}]dɒQ:� � UL쎏!� �%PdI'emafib_lV;`eKɖV&ɪ3@x,<1{^z "*?g;SK/@d rJ+WNj }ahi@�@�@�@�@�@�@ ԊƫF@�@�@�@�@�@�@�@��$E@O �DjČ@�@�"M =@H&@�?,3ݻ?*//orzu[7 '_l2edۭX?\liB:0~D�AԼysW:u{{ <*T8Czmbg ddd(!!!K\b4hvnݺt   � � � � � � @1 UT� � � � � � � � @, $''{y3Q@�@� ,YDW'\39@�@�2eZ@�@� "7 /dnT瞛u[$>}K`|A[EYgK*QBjպdK6RFka@ڵӼy\wyG=z(h5qw|Ґ!Җ-p8p ."rYV#eJҀ Ԋ@�@�@�@�@�@�@� $HA�@�@�@�@�@�@�@�@ ,P+555ކx@�@ ӦMSbb:wڨ@�@� XV@�@� sVz+Tzξ5'%IrȐ~㏾^mT/dµmvu� ph'|N+?'zg̐.0!zT gZ-Z}ahqڵU€O � � � � � � @ n#� � � � � � � � n ڸqۧRH� @4 {:3UDh6}E *6m.\ݻw1i@�B-`ZeʄUC�@�hTjVw܏_'-1Ѻ*#|˹=?kdA[hA[;vMs];R糆� p@rok /1--ͭ|$[Lre[7ZQ+ բN`ʕ^n'SN>0@�@�@�@�@�@�@�x`x? � � � � � � � � .222I+d-� �&`~FoCg � �Q"gOlPD ?D�@�<.A*H]eA/|ly ɛµڷ=v N Od裏*99Y^{vڥn \:KV)=]*]:،@ k@]tB5jFؒF^o &ѕ@�@�@�@�@�@�@�X P+.cC�@�@�@�@�@�@�@�@,PJJJ7ZHM �ĔӽKSOq1@�@� P+v%#A�@ .Q~tI= R&_Gi`7ސS^x(Y-;u>5@ ^ƌ;L׿w^vmJ-P#җ_J={y(;H ȈȾbV\7n;hLU@�@�@�@�@�@�@ wra � � � � � � � �!o6<b � Uw& *d3@�@�"D@t@�HN?^5KYw{<X*Y2v-Pt)ſu_-SH&|kז:uk1Hի+Re˖ȑ#;~ϑ6j$5k&}Z$(U{}GXb;˗/wckڴi̎1p`jj� � � � � � � 1 � � � � � � � � p@ioVD  � @N[l￯g}6lC�@�@ "Ԋ@'@�@ .jehР[y~(Jn|X ٲpys_Ə YEjV*S& @ \ve#Fr3fL#ƙ3 Y!F{}۷/=-P]*UbբE+D�@�@�@�@�@�@��Zq@�@�@�@�@�@�@�@�RN:jg �N7ސrׯpp � �!@864� �Z5JZk;u+ #`![=z6I}'͙{vilYCkWr�>~{ 7RT 6DEA\"** RiJQzDZy0I&ɔs]9)ssKU,}jϞ=뮻T|y/t"+ @X .\X%GV^%.(-D�@�@�@�@�@�@��ZP@�@�@�@�@�@�@�@�T &&F7o3l@�Ȩuex=@�@�1;؂( � @( )#o2ziT1_ {]}(6rd(ݺUb h\2}4zԮ-u[:KjHʓ'r, Dw -ܢe˺>--1_>o+{=BͰpjD~S#b, "..NUV dWA�@�@�@�@�@�@�@ @�@�@�@�@�@�@�@�Ȭ@lll  � p*UV&efSY@�@ w]ZG�@�S \wt9"]}ߟyevs8iino$;?[H#5i"U(/pFzyi.{J  @|IO^{-Z´ƒ%V3t�t;+GANޞ7h '̵uȻJVF�@�@�@�@�@�@�R@<mt@�@�@�@�@�@�@�@�!P+4N@�@ Ə/ <sCt@�@ Ԋ@�ݥBߴߟy;%JH]J=&M&`RbSRR򾀭1c+r�dU`رj۶zm۶e9~0((^E#νZԆ pV/5 ʦM( Ԋ@�@�@�@�@�@�@� DLB�@�@�@�@�@�@�@�@ lh6E�@� ;vL:˟0g@�@�rX@9@�Ȱ@Ѣ@%[n!Up@'j%u4ect裾-{mD&Loρ  ?VuA5{wD@ɒ%gϞt.~Rqbcc` @�@�@�@�@�@�@ X@�@�@�@�@�@�@�@�PDŽ*Qx2 �k!7|sFc_@�@�rE@\aQ@�Ƞ@ѣ媫2x0@<Rf 6m*Wp=o@A�BV\rϼC9ٱ|͞Y(SvIV_Uzek;R@ҥUXP@�@�@�@�@�@�@�aG� � � � � � � � �!*zɛTR!K� �-0f]r%]vnw@�@�8�Z$b@�@ۧ{JHHOj;v_䈔?*Qb|7)M̟|ɛ7o P…UHS-Zԫ[/.\tM^3SߗzJXQMUkWd@� 4nX覛n矯 /0U^Ƙ4}PUcZV͚5UPn:Wڳ+ZjM � � � � � � �+@V;z� � � � � � � � @ '/4i � zK.լY4}=B�@�@ RAa �Q*?S۶mS||vܙbٵkn={�- :Up,*)N fUxt÷[_w0^TXb.\t:q)[y " eA$TI۽2u[le[R^tY l � зo_M6M7p~g?[}hZjvȜ@*U܁[l!P+seZ5 xp0666܇A@�@�@�@�@�@�@�rX@9@�@�@�@�@�@�@�@�"I&˳"iX@�(0f5nXw^k*@�@�O@쳥f@�BE,$kƍ9͛e׭[jڱc9<8ʞUZUM6M *Q Jj,,UP!ɓ'E0gT2zh#!!!E]0޽{^믤0='1 Լ,X˖ʕ+ l]jT|}⃼)rlS/zJnN .]Ν}�qtks#!r˖ғO@Gju0%{VX]fo#!TPz]A�@�@�@�@�@�@�,G@�@�@�@�@�@�@�@�BX&۴iS!� @n |"� � a r2( � eaYk֬ѺuvZj!ZɃJ*,H&MRJ.eUhѐi>8]ɛ7W0f\.BYhʕ+w߹$ Z5kTZ];/I;GKO^[kM&p6\,\B!#@ җ_~Y_|{͵ríZgY.wP_K,f<2!`ZJ~{&C ۵k � � � � � � �&@V0 � � � � � � � �!KVdJF� @ƍu]@�@�8x@첥^@�-`aM iw^hL,XPիWwL 4P׮]UZ& q�JpJ(![,TeϞ=.Bl}{]~;ӧOw,=+v֭4lPtҧj*'u[vR&}ӒOmgi �*Э[7K 9R!:*o\*hZ'1i)'`5ʾFB游8Wu � � � � � � ��Z!~ � � � � � � � �.` w@�@ @BBƌ0!qr#� �ґ#�(C�@ vޭ_~E˖-s~ŊVxAwe]:u%{B-T J *UJ4m4վ=zT6lB,05jw]yrjҤN;4WhѢi+˖Obc2\'?ғOJe/3ϔbc#M @(=1BO<D(t)`9+|t9< "izpLWXnҸqS ;ݻWZp2 � � � � � � j08!� � � � � � � � idɒHA�@�, [nrg&G�@�@ UpεIK � R >>^עEܲxb[TdI70v4lPիWW<yRVħȟ?j׮햮]mYFVrjN0sL7N .DA:3ҲeKjJ%JHQO$~QCFbۺUp-[^3F Y jFjx>(˜@ 'T{W<n6UP!'G2# Pn]}.PjժE59X\3%q � � � � � � @ #� � � � � � � � cƍZ@�@ "l2ۑ#Go߾TRDA � �DJ"1^F� @n ;vLK,ٳ5w\e!IVjx@t 7ynuL¶ׯݻ'V^k˖g}V۷ow![5Bڨ}ر eK:8BT,/η~IGy6o#y<^叹ӥb"a!@ yz5|p5* 7"{H8YHG-Fϗ/;&%'a"� � � � � � � @V6R% � � � � � � � �$PjU޽[&Sc6h:@�&L w_Z@�@�8x-B)@� $N3fмyo>)SFڵ_֭[{>TB1Ci^*ArW&5a`u*W :stiӦʓ'OqD [㋋;`¶>L3`_Ȗ[ 5-11#yE�N:t Ud(+cYb^.Lega+po^ȦI jugM6p;Z8@�@�@�@�@�@�@�#@Vp@�@�@�@�@�@�@�@�Vƍհaèu` � 8 SOwުQ, � �?P˛畂� �AXvNJ+{Թsg=Z۷wϘ"=(HTIի˖/`nK.ٳ5sL 6Lwq rҥ."]pXb&[ bcϽtxhuɂx9dIZ^7,<T)vE�nf=7n{챨[W:|XdeQ7|wHj$?~\C81.4) � � � � � � �dP@ ; � � � � � � � � P+@�v>@I݂#� �@BE_1 �" hɚ2e4lٲ:4j(ZVP.R hٲ[,]|OoF׿tK[mݺzh Lm 2k/ ېΕ|SڷTԨ<A~}߫_l ((bmZ DRgć` *n-t ф^׭[x!^ iD3L@�@�@�@�@�@�@ TD�@�@�@�@�@�@�@�@ lĢEjӦM4lƊ� �;vLÆ S޽UNT` � �-e&Rph!�  .M8Q6qi\ݻM6^i:xO O<jڴ[:tHf^{M>HW_}[֭tޣau[�^6lH&\)/DGҎ sի']!^k֔k@d 8P5iҤ TIHkJYD]ϵLJ,Jƍ^wVhOݣ_ � � � � � � �!,@V� � � � � � � � @TVM7n O@�&_k֬_|M-P- � �+૿Hm@�۷kz7_ղeKvmٳ%PSB k׮n3f,Y(zGtgꦛnҕW^ŋ(m/L5jnRֹ{o^-c)>޷_/pV-fMbu{QAA�0%誫 d=(@\H#GT@pzb%B-{z@�@�@�@�@�@�@�H@(: @�@�@�@�@�@�@�@�Z*ZمK �ѣGOSݺuät@�@�>.r=@�@ 5zh}Ǫ\'t׫~)w"мysSOɾ}]w};t 7hW^6x(SFjַX޽f,pƿ,^,_/;o3.z_)[�"ЫW/z믿TdPVSyY2Jz7{?۴iV}ήXBM4 n: @�@�@�@�@�@�@ :Ԋ(@�@�@�@�@�@�@�@�VjժT� @ ?ޛt,=D�@�@ ߆"E؁ �DiOhٺ '[nʛ7o0hp [F?P/4h=zGq[ٱ(!ʷVΝҺup- ڰo}>hQ_Z¶-Ԧx䜀}o[k͹C% ܺ5:BȀ]Ӕ/_]�v@N:gdrQm߾]1 F� � � � � � � j(7!� � � � � � � � 5B�@�S >|M|7vڧܟ@�@�U|B @�uwA{믿 Ngh(T9shjٲ 9rԩ"= n+'⑦Z}F_m۫w:>t[ö콅nY0+PLuY:ujTjsp= رf̘;3'6rJ 0 *kܲe?NVԜq� � � � � � �W@zR � � � � � � � �Q)`Zmf2  �Do[ꡇ3h@�@�I 0@�*sNu]zuUWi„ YfVx"N}ϵh" 2D7v!t>,x|"E}KZ ֲGe&ij露8~enU[gxE #f䐈طJy"b( "u;C }2n[Np׈/ꈳ -@�@�@�@�@�@�@� A0vG�@�@�@�@�@�@�@�@�{ݻWJ.}A�@�Ԇ B6) � �7 w@�'_o߾A̝;W[^Ԅ@ hBӦMg}Aiʔ).3Έʔli,~K._.M :|w|޼'J5jX֠-EA�{!vqQb!}v `Zwƌ袋¡!Ǖ+W>6j(<y(&&&XUR � � � � � � @ xGA�@�@�@�@�@�@�@�@�&`ZV6lؐ8@�\رc^}U]r%˽IټMZӛoI!?.T< � �Y P+Ԁ� O<.R7O?DVM^ϸq}Çp)KLLt$.r(T?+VUVС>| ͥݥ$OniLi)!AڼY7O8QNeK~w+$/wDy+WڷVzawY|u̠9,pgPp˹\RҡC%w{BdL 66]};0_|EKvƏ'ڽ{:v9s渍Ŋۓv^`/XO?֮]-oYWZm.}cbZ*TPd @�@�@�@�@�@�@ jS@�@�@�@�@�@�@�@�R3l@ lRX+vҌ3d߿?Fh_>K{@ӈ#4h UYB) � ��Za~> @Pnv9RnZ JT̞=ݧ<vX~h ۾�+?P[xqϪO>.$-Gqh,(y ڶz[3F2EZD2?gtoln-+M II0}x ׇ偸}Y*A D,zV^=̞nss{pY</rܹX4_ZxʕnGzAtyj׮J(^z}o�S h f]mciذazDܶ^"} � � � � � � � 21 � � � � � � � � B&?*[6lؐb=@�oV=j 4`MdlZrKo7khBBミA�@�@ +jeEc@�"A^u}7袋"aHa9-Z�&|͒ 'o޼<x֭9O݁ߖ#"Gi, %fͤK/[zyҲeR\4sRnKmHv|jyGZP:x0 W㏰k:IV$'7 l°R,P)&&F׿ %OΓ?HdǝXnݪ^zyW͚5/h߾}n9u׎mh Ԋ.T>lG�@�@�@�@�@�@�@DN3 � � � � � � � �dJzjeJ@�rS暤ɹ/6㳟R٣ߺ;U\P@�@�@ Kje@�\`ҥz]V|4}  ƈRhv4Z^wu\Pڮ]o} #/HD:lo_ipi$_|a[WµnMRE{i�U+xqqckݏVcx+PN *Rw: Nj/XդI{YgZjѣ*UW_}w3f(11m+Z*V;q?Pw7ߜLi![eZYשdT,t��@�IDATP+Ph2` � � � � � � �ȟC9@�@�@�@�@�@�@�@�[>6n !� ӄ 믿 .B]y啮g9m߾]SL͛u뭷ԩS5qDmٲE{Mzql۶M-Zp*UJGojzl2=czguq(P@fΜYfjx3=䓲Ix3fZ={t_6_3?A}74|obQ qǎzd(QB_ ´u]:@�@� B4 @�\x衇Թsg/Kn'裏>cTڵC\p/^,&fYwn:]r%2dJ6ɾol6mgqlh .m&ݺusZJ7xI�H>aF:m1Bgv^<Ɠ_ݺuOڡC}w:v옻yW>D+։j6lp ӧOw! < <8hߣ>?pKUD@|[wO ~Y}y瞓n RIm^O?]*Xy@( -[žeWG9]-P/+`홰=ogۙ)UjUw|_/Y5jJ.0-Nү_?SO=%qnCKNKVV|y?qmswy:>vH]Yx{.o6m/\]tqNNcP~GQ/) � � � � � � �dF of@�@�@�@�@�@�@�@�@D ( �+N:e˖.&ʺꪫԫW/E hnZ}qkoaXUpa7AQDYbpYX[D֛&}{_D6d$³,;О={:´X?̙=z>p &7Λ7+tMz뭷]VڵsAb6Vo͋.(>I;gM||Q@�@�r^EFh � $_sܹرc5ydYՊ+\8 -‰Mj?tPvmI}]M0VkF/ ڿ `zy}@ڻw:,-ZK|5m4|FK~jʅ-[̵gdvς6yٷo<Le) 以΂qS=Sӯv,T@ze=_{[/� `-$9yo,(@ n9Mş?DV45\]vgљY ߿%$$pV}^zl+vdAV:V?MRJժTlרeʔ7ƍo5ĉոqc,v.~|V\] \~bV-P+..Na; � � � � � � � * +@�@�@�@�@�@�@�@�@ jeT@�W ݻxFnݳ>[}l"]TYfjRΝ&ڲM4M"kl争Ib-Yĭ{dY6 &u z,\k͚5n"^Ifلw}{o˷ެUԛ&+ ȟ?[}}IX6[nŭ1Xyfb9r8$Y@�@� x@8t@ lGpnƏ/ %X�g>|o5j&·) N7o^ӦM\/{vUK}mz blߎ6~i?~\??Oh[vm…z\p@Æ կ_@p>iu?͛'_޶YЖݻ  ײGN'7:uR0aZc޽]>jaff!n2*PԽ=䅜 AyAmR.{v!=qұcm�Z7F[tSޞu[YT_۶mUD ܞmg+i=޾}nɋ{Ŋoz~ ]aſX}϶B }cǎ{tR! ܵŘh2D�@�@�@�@�@�@�~+:@�@�@�@�@�@�@�@�>jժID1W|F�@b!%$$ ]w /t?DZ)Vx6m&²ފMke„ te&@OZNٳG&*Yj]VfrZ_XסCտ)TP{{cd6ؿ/7޽{5ydM4)z6aa۶mz饗4d+V, @�@� P+<D�l ig>8 ?YfI,,W^~ݲe\=<e^Z7nLOoϷu'Λ@+XoM6Xe'u+_:,WtM9sso(woD}{h@^ȇ=RК57j$ԮӷJA W ,2s\ju  _AsmV?16k+m^ILLLȑ#]StY{ =16> u%_&l)|Y$yf7#@�@�@�@�@�@�@�rN@%@�@�@�@�@�@�@�@�"Z&`'C�c`t}ߒN|7d>'Zj 駟_V\]{v>ly곉g&l]vO?u駟Bc[\^}UիWg'oŮp©ت#FTR.  � �&@VQƃ� R= zHwWnкut饗 /mvn^+Vg}Vg} oذa@VG,kΝUV]_FL:M;vHkgj,' CٴO`ljjXjUk|aZ6H+VH=&:h{Ν矗}6: @@]v{/v0+{οo۽{Wo6lη-[W@/+eʔq/{W Ԫ[)?HV$UƂ� � � � � � �@rmZC�@�@�@�@�@�@�@�@�߬_>FP@�Wg?C!'lTRN?hѢIlڵkO\u-ZuݒI&@.$W^&nt 3<SK.&Ǽw}'럕 fܶm+2n7n|A)R$G+ � �!@Vx'z� |ҥK*/ѣz5qDoF={L[voBY^4uTw,X031 Ç-СCJqe~hR')Y[cY-=KVvؾ@vg"Шtҗ_J 2xB^ԾKRr_*A�- 'o)CntM] `ʚ5k7�&MXsϩN:밾}I{Ĕ)Sٳgm'{@l+(Tʕ+a � � � � � � �!@Vn& � � � � � � � �(PJ7!Zxr yw5kVOs{!+2:QmCUbb{o̙3GC Ix&ꪫt~^z]PWn;\6w߭+כo&�ɼlRŋ룏>ŋ 6$ț#FInƾ � ��Zas( @6 6Lה \uV]yefΜXz:'0]lٲnwUd?$uł$?ic:oK~$XIh};.rY'0d8_{7' N&Lolծ-#]|4y~N: �)п۷O|AP�,Pȑ#zw\}v]gk[f M^,Xjժ3LZ=o<ܹsCg֘1cR~ae~C?n:լY3}"mj?P@�@�@�@�@�@�@�Ȭ�Z8@�@�@�@�@�@�@�@�H!`$j` @ R.]f76Vu}U16CWKY֨QqFj6m_mҰ%JhҤI:5n8 0@\sy;ܫ!bAZJR5lYM6ѪaX~\_l3]zC.rnN:sc;묳TV-n훑lҫ^{M< *C@�@� P+lNE�O?]O?,L݂sdcǎu[T۶mդI.]:Kd[Pm۶ ,%K'Ng}|P-Ç_%?J/U@Z8߯ׯ,Xh2eM>ݽRڮ];w[oW^yEO>kogLo7xCvϱO>t->Y=75迧Mщ{iȑ.' ( YkyBM nyzayt+@�PbŊkݵLF^S㊍Uݳgnuz7+R;̭+ }eϯ|{f_X1ή՞۵K/… kСZv }sa<,,TŮ.Pl療� � � � � � � @fR_@�@�@�@�@�@�@�@�@�OA � @n DZջwop .j5kʔ)׸qc5kL .W\rʹIlM;|p͜9ӅH: z~_&[ݶ~[UTW_3f!IpmKѢE$^{6{jԨn_w}[駟jȐ!Mվ}{vmnwyzYmd^s6m'x"E݁~0 *Է@g?@�@�A@p8K@ ;,,DΦҬ&ӷ{p_~e<Cޘݛ뮻ٵkW>o paQ/;I?l f[{ Ĵk֬ -wg l٢s9G]tqJ( d(>=y< ([_v/u; ۧf͚jѢg!Ɵ'O@R쓕shi'%{):C7.jf\6=א}_y_ڵ=% @ Z]+uU4{l|ۮ'~yy6,kQeV ҳ>nݺ]:urav iנ^x浝OUtM6Mmڴq]zkA^~ )WgUVMk\oF�܈ B�@�@�@�@�@�@�v<&f{+4� � � � � � � � @ X`ǏG36}*..M#:w#~lE 7 %nǝ;wjٲe^jժus!-?I;& j{3KftؿKEQZ j˗/97G 篵Zۧ]uqU_zm/s/BO;Z+J/o=^+wxLW^mjG�  a  �d^Bٟ|I裏&gLHHP…D Lq짟~R֭d#F֭[UnTٽ74_N_׬'ڴiiF HII~޽{2eʸWS>~vVG0aZc5_ެ7t" ~ .M$߭tYҐ! e3,\wֿgC5@ST*'a[/v3sxRV=.[l鿵kg ʪVZ;5,׮?+U@]͛viݺu>0wc !=zt#� � � � � W篡?z� �?EF� � � � � � � � �%`A$sIk3@�ry!Bi\mY(&lI>@´l_M(l%>/^\͛7we#G*8@�@�8vL;TXw"� <Zj}?'_sAVް׀iYqicRm'~ګM2%MI묾3fYOYb.J,|䢋.=ܣmO/%JH7!?(Pg};靗9$5o>3 4Hvv:3r74@Wᅲ?K.! &u:9@ &y?:@'oԮeuRW 7{ ˵kִ$ wSlll.#� � � � � � �@*= � � � � � � � � 6aÆ/E�dC裏"yY[ҥ.r۶mzW5b*T(Kr0 � �,wɲ+B @�l֭/_KڵUW]全 S͚5عsdggհat(RHۃTROYV ,an9,ZHC ѬYtwGjn @Β- J?,ԩ3R۶Ak@�B\QF+dA_~ JGɓ1-(CigͲ  OmHLL֭[.D,#A�@�@�@�@�@�@�r[@>� � � � � � � � @ T^]Ԏ;d 44� fW^anfʹtҀ5jJ,?;!� � j뙣 �)P\90` _zSԩSuwjMo syF+V vSjѢ[^q&+={f9,3;wqPvÜ̙߭3GÇח_~=zhŊS;hR׸}-J7 !{q ! �R=k0acK.UR4Gx>|@H< @�@�@�@�@�@�A9M!� � � � � � � � @ ԨQÍp>R� : ȒAaZv/&K.\p(v� � @Zŋg**@�@ ڶm~A_|V^ƍsd;wܹs{nm޼Y?|i`H;ugcǎ*P.\I&_23%/kQ/ =-^=_~z衇&Ν;6 Mu$O/L�,PB i:E]JLLL$1!� � � � � � ��Z9M3 � � � � � � � �D@Օ7o^[.@�x1cƨ`[#~ @�@�}|Ŋa� �i tU4o<.]Z]vj֬C~K밠wk3$"Ο?_t!ںukZJ|7oc4@n %!C$ ڲ@�xǵk.=:́v+e˖Mshذcǎ ԪRJ4bƈ� � � � � � � Mje,"� � � � � � � �  pg1#�D5vXvm*^x � � pw Z'Ѱ@�ڴi>@6m]P ԪU+=3ZfIǰpXd WڶmEiȑڲe^|Ez (PS+-ZH/ %&FcF�Crʺ{5|pǧ:hV2eR-+5Pwdɒr' � � � � � � @6 T� � � � � � � � @4 ԨQCׯfƎ� @D:x a � �J@S @�*V{G+WO?N:p:uYf.h޼y:~8t萦Mjժ38C'OV>}zj͝;WSCxt hP3G~y!+yI۶\� ;@Q/UGMa Բ뤂 =ZVٳG*yfD)f � � � � � � �$@V6R- � � � � � � � �*PfM[.Zϸ@�GjԨQnBGĘ � �jp*)#� @˖-siƍ/X|ڵk *W^z7v+`-(e˖i֭ʖ- .@?+VVݺus4@ /=򈼟~H-Zއn @f+ÇW_ҥKOfΝ*WImj,Y2mZQ5f� � � � � � � |( � � � � � � � � @,PO? ^Ԅ� �9.0qD鮻i@�@�طO*THʗ/z@ �D@<yԶm[$W_iԩ~޽{UZ5uY:uRհaCqrJѣ.aٚ9sf͚x֥K7jUX1D;Di-X -"fx @zk4hpٵk (M2 ?_QeUR% 6CF�@�@�@�@�@�@��ZԤ.@�@�@�@�@�@�@�@�j[ @�c#GW^z#� � !b2t;#� @�jҀb!F 3f;>/ղL2j׮ jݺZj傍]H`ƍkϾ͛*W:v쨇zH{6mJ[@@KK.=I+VH?/￯c+ @X رcզMۺ:O( .YdK4ټy>h*cD�@�@�@�@�@�@�F@�@�@�@�@�@�@�@�F Բw&Fƌ� @8 |W_{0; � � P+d� @,<ԱcǴd͞=[sջᆱG}[F hB~7o[GA =ǏkʾlYho߮yQF.kuAZ 4 @+=P! zqyAuRR|;� !v>p@{޽ʗ/FFtaٵi"E"l6-[J*^ � � � � � � �!j@�@�@�@�@�@�@�@�ȜjYYnZN@�/{N8zNo@�@�Țj/:8@�2&/_>l-v{+… xb/|6,YRM4qKS/‘,z"e>>z֬YUViŊZ|-[+W*!!gկ_߅Y}jJ%J3�MgOLˤK/>X^H"�%0l0M4Isvv:&:t PB0\7Dm۶@9 @�@�@�@�@�@�>ϖ@�@�@�@�@�@�@�@�J0o޼nbC� �#?oԩSç@�@� '+ʨ@�2-P|yu-Jvޭ_~-dm~[obIԭ[WuIzqϮu>aߓ^-D9r r.dui׊->D@.?.u.}E"~vD; NL\s?|ڵKe˖jÇGS֎;5FA�@�@�@�@�@�@�@ +jeEc@�@�@�@�@�@�@�@�@$ J*.P뤍@�@�5jx .~9@�@�Cώ@�*PLYX-۵rJ믲իWkZv:vgWիWW͚5bU斪Uʖbj&gͱ{ƍi&jׯ_3[Nqqq:v돝# JW.R5l0i)]t@ mHӧK;KW_-}/_H@�ѣzkjy&#s'[lq R@�@�@�@�@�@�@�Ȋ�ZYX@�@�@�@�@�@�@�@�HU&$ ) � >6ĉ5v4=E�@�@ UD+*@�v+ʖN:h.i͚5.ɞ[Y@nM\,ȑ#Iǔ*UJ6{RJnZ\9-Z48ޜ,w^7&_m&`߿l޼YHH".֭]�ޝ\;cό댄(KD"!VJ6tK7$E*mJQBʖ 3D}7>;ƙ9g^[7~w}(66֝y�A+и4sԮt][oI p8 @ ѣGs g+aaa AVA8ˌ@�@�@�@�@�@�ƙV@�@�@�@�@�@�@�@�(P6MJHA�@�x[o5x:MO@�@�'sO @�M&Y[|u&M6p- w߽VraP;v8-x*Q ֲp-[ʗ/RƓҙz)],4ʎŋ{Bd#E<9Dr!Y8Veڻwˮ]]RydUTQuW:שb%HSJ;KUJO?dH @@1c[nq{\AZN*0 y>-["� � � � � � ��ZJ � � � � � � � �hZjiٲeڀ#� LIII7n7o0"� � /F= � 6}TT[M~gsN}�)fS7o?۷O<eU l *Z >mx Y(=\R_}>b[H7@\rbUX1 O\*3e;T}{y~/!}tP�@no>s!6, [,>gQ@�@�@�@�@�@�@�ȩ�Z9x@�@�@�@�@�@�@�@�8C &&F6l8c=+@�@ 0&O, +@�@�@)<< @�¢lj9~z;xn2l9|iAV@+_vlZ!Y)ׯ^V%KUZO ޲ ._[E_29e!Zល$�S;%K=zY;u!� ԠAM8QW_}u~u#-Z[lR@�@�@�@�@�@�@�ȩ�Z9x@�@�@�@�@�@�@�@�8CVZnR۷+""@�@�5jnFUZ5:Fo@�@�COޅ<y@�@/^U|yB\~԰4fB�@ ԥlTtt."�+~[;vTtmn,VZRRRqmݺUQQQgg � � � � � � �Y� � � � � � � � �d$vhW#� @> ,X@K.U~'4� � @ 8 oh@�@�(H5ΝimkF=z+V`]ɒ%ݖÇG&P+)#B�@�@�@�@�@�@�K@]@�@�@�@�@�@�@�@�BXz*\6l£dh �Qte˖1 F� � @6$P+t� � �d[ :Z;V7NlWÁ �&ϪEcǎ�]wH [lQS@�@�@�@�@�@�@�ȡ�Z9p@�@�@�@�@�@�@�@�8SH"P37@�F`ƍ6m0}# � �䗀j)_. � � PpW^ #G�BIɓN:á4 RP!(Q@{۶mRJ6� � � � � � � @Fje$v@�@�@�@�@�@�@�@�Ȗ@LL Zْ @�NW^QTTvw � �($K � � @xU)1Q<� !"�Dr NAG- #se˖Eݻwk� � � � � � � @Nʩ #� � � � � � � � O|@�Əx@E ~@�@�C?[-S&?ZM@�@�@�O抆 ,Xk<@�BEN:.TkѢE.TbŊP0TR@�@�@�@�@�@�@�rY@\z@�@�@�@�@�@�@�@� �Z3n@�`?'O{ .O@�@�rM?ϵ&@�@�@ ;4`G6#�@foUte\P"-HZ[nu@QQQY@�@�@�@�@�@�@�R   � � � � � � � �  ڸq OԂ� �8~^y陙\rz@�@�Zz2A;:� � �@g_fΔ 0�@�-Zj*]veSl ͧ-PXb1S@�@�@�@�@�@�@�ȩ@V � � � � � � � � / :v6oެ5jڅu � O=E�@�@ nU ,@lY3߫f͒Vsw[WZF�@�@� WH:IR۶mmFi…ܹ5kɓ'M6!;興oBv)H*T(Z"� � � � � � � =Q � � � � � � � � @ll#>>@ ،� @^ 9R7tjժM � �.P'T<٥SN_/P � � @ <Բ4w<A+- �@LL-Z={ꪫR~3ϨDy׉<j)::brq֭#YA�@�@�@�@�@�@�uP C�@�@�@�@�@�@�@�@�Tɒ%eZ@�9sԀS@�@�<?ô\y0-R߾y1C�@�@�Pi  @( kԩ=zƍ&Mh!7ԪUj˖-!7._"P˗ @�@�@�@�@�@�@�+@Vv8`=��@�IDAT@�@�@�@�@�@�@�@�(Tjժtc# �#tWiӦy0!� � @;J^)SF` � � @n $͙#-][-P/ @~ /_\*UE]_۷on} ڳgVgV*Uj � � � � � � @ d'"� � � � � � � � L.W@�BZ&#/4p'C�@�@ #fͤ ޫhQ{%އ- � � �'ЮԨ4vlA �/P^=}7z4m4ծ][?t\{PF WƍsXSuVEEE~G! � � � � � � @PN"� � � � � � � �  �>ƍBIA�@�@� *$]{TocǤ{ � � �y#p7  @|Yw]wiڵz4j(e޳gOtڿ~z?U$$$J*Iz� � � � � � � 4jͩ � � � � � � � �@LLワ@�ǦLA � �YI:q ڴ9sk@�@�@�N[6yr޵IK �'PT)=裊S^dZիWW>}|X6[.S"""nݺl9rD{UTTTpt^"� � � � � � ��Z  � � � � � � � �+%&& 9 �!"0rH{M7"#b � �L];P3밐?s=k@�@�@�VB7vi @ *V´6mڤaÆi޼yjڴ.KڲeKv0 ׮][ׯ@+j߹ � � � � � � @ g~!� � � � � � � � 111:uC`4 @� i  � �(WNjPʕkgKԅ� � � ]^モ'$5p @ )SFի5|5nXO>WVZo;sf͚cN; ԊiU� � � � � � � � � � � � � � � �&ꎋ˵6@�2xUR%#@�@�$puRp"}IHA�@�@�6m/�@ .2ڶmNڵkk[ߨ׭߹sguG 6?cK"P+t%#A�@�@�@�@�@�@�E@@9@�@�@�@�@�@�@�@�WʕcH �]믫*^xpt^"� � G;JǏ'k!� � �䯀 g7<: (;.]_ ot-hɒ%! ӧ~m[._n}ٲeٓ-PB {Dn@�@�@�@�@�@�@ UN8E�@�@�@�@�@�@�@�@ bcc �W`ԨQn޽{c� � �4\YtRttx� � � ]'-X ܙݠq@��(BUVz?h׮]OԡCXBwuԩ:K\sh̙ھ}{yf^7m6UR%=@�@�@�@�@�@�@� P+O.CC�@�@�@�@�@�@�@�@  @@� 5zhOK. @�@�tt<qoKwW6"� � �WK8M"�@rԱcG1B .|ѢE<x*V{O:uRddjժ]^6.Б#GreժUS \W4�&$$8� ]@�@�@�@�@�@�@�? � � � � � � � � �'`ZӧOϽ@�xWuIi@�@� g]'լ)]yeA` � � @ K\"͝+xG �)Pxql-ٳG/? ھ}+MUVjݺ.RY@?\%KT}S � � � � � � �)@Vp7z� � � � � � � � @(>>>hKG@�Ç_}ݧˇʰ � @ 9rDv]e=S>uIII:v[R??~N8|mAN?^TaaT$r˧a*TPRpa\)hѢ&M֕(Q-6yo%K-JJ^  � � oO~6"� Y *]vn j5k^xao^:uRfch~Y9$@- . � � � � � � � /%I= � � � � � � � � Sv:t萶mۦH@�/o@�@� g۷O߿G-ξ+�- ϲ @*opǔAWN7$20+,쨪TYjվpA^RsY`W:˻lmLހ2e(<<lٲ*W|=dXyQ@�@�@�P@'lCid@ bcceK]Wvܩy/Є SOy?nAݺu_p͛kĈ{R/Ԋ@ � � � � � � � /%I= � � � � � � � � S&GO!V"� #G zʕ+jD�@�  zڽ{o;vh׮] cS>so޽{]Tj� AO&Z{L hY/^=s Ͳy<Z-s ز{t ײG[,LB|-8fAd<.:}skUXQ*UYgucDDKɒ%}U:@�@�@ Zz>̒_] �!*`ߣxn!O>}&McǪN:{իW/\F e.]T[h۞ F@�@�@�@�@�@�@� P+C�@�@�@�@�@�@�@�@ UbŊi袋~< �@�`?~ <0`@0t>"� �YBmٲE[nuMj}m6eY'N8ҥK'/yCj׮- eKrʹ:~~ +JѢEe$%%i߾}n񆞥~@4[VZfAjϽpyõT3 G}\P � �䍀㪚4.$P+oi@+p˖kŊz7SOiȐ!ӧnTe˷~rZWbbD  � � � � � � � P_ԃ� � � � � � � � �>TfMJ@�Msf*R � ǎ͛qeӦM.@bJ)aY87$qI�%{\J(Py%+ԩSd.\-Yڲeܣ>zhrj2RF }hg� � �[iS駟]+!� yFiرwƍӋ/({8p *UZjo`^OV0E� � � � � � ��ZwN � � � � � � � �!'PvmB2 @�@0avءGy$PH@�@�2�׻S,<bAG'Ot5)RYQՠAUZ-tdm"S ] RPB.ʂիrw֖-[\pіٳg׾} WZ{bĨx@�@�ȬyI|ٽ@� oz饗~W?~x]qg4|饗8qB >c{ﲭDFF7 � � � � � � @� '.!� � � � � � � � j6qʕ+CmX@�8v옆^z B�@�HHLLԚ5kj*oZv{wY`eY�Qݺuվ}{RTfMYVtttHMÓ-[6lfւ6nx2|M8Q{udž~9թS=Z׹4uـ� � �&`Z_O<0A�@ J,{o߾ꪫt=--uXBM6G *T*Wca� � � � � � � �#@V z� � � � � � � � @ XG}c` �MRuV 4(PD?@�@�/_U? _zjmذA'OtX݉ ]r%ugeZAlٲ.p+- Zn �9[,Yw}W{qC:ׯwKddd0G@�@�e Բr%ZJ' @TREӦM￯޽{kU^uA.t/ @J*=v @�@�@�@�@�@�@ DT!r" � � � � � � � �,Pvm%KrW �A+p1 6Lz/P@�@�^Z|.]e˖iŊ.LՊ+z!gXm ˗Wfܒz۶msW,|,xn֬YJHHpFDD`&M .p[\BRWk@�@�a hy>3Hۇ@ @ t}եK8c ]x{+Rsрv|;nEFF^k@�@�@�@�@�@�@�r$@V8@�@�@�@�@�@�@�@�2#SN)>>^{nfa@�Ȣĉ]壏>#@�@ ;ǏwY}{]}% ܹx wy.8H;Wv9&l][Zn}`wڥ+Wԗ_~QF)))Ie˖ulR-Z=2yi|@�@�@ $<@6 @Ԯ][-7߬vڹxm۶Gx!1ZB42@�@�@�@�@�@�@ XwJ � � � � � � � �'`ZV ˈ@�@رc6lz5j@ � zr~ײ~PbbT͛nsz�|T.rx?VҥKxb}zecbbt饗.sK:u� � �!"Pqc a �@xx>Cx㍺_誫r)+Cb۷o'>$$@�@�@�@�@�@�@�K@:@�@�@�@�@�@�@�@� Bl"ׇ �-0qDmݺU>h~w@�@�p^sqZ֩SԨQ#]r%ӧ.bU^=d@EwB9rD˖-ӂ bvء(79q۶m݄0D� � �Ԩ!}i:; @��(VNΝ;sӬYB&Pk۶mjѢE @�@�@�@�@�@�@�P P+T$@�@�@�@�@�@�@�@�@ j׮�%C�@ 4l07| E� � m 9sf̘ٳgjҤڴiUVp @%\ 0u_ܹsW_ڹs;<uI^{7,,,Bo@�@�@ C53܍@� <yZl.]}#GDr Ԋi5� � � � � � � ij @�@�@�@�@�@�@�@�-X_>^@� [o=cր#� �9غuL_ .Tddj?^m۶U rR="@> ԫWOGN5k,}g1b*U/ڵZn-µD, � �YQCڻW:p@*S&; � PlY}j֬bbbdA֭goeߩS@�@�@�@�@�@�@�@?+.@�@�@�@�@�@�@�@�@ -ڵk@�ȦѣG5l0u]^z6k0@�@ $&&wѕW^jժi̘1jժ-Z?C&Lp!;i F RӦM]7|۷P- رտ/ @�@�!?cG �g˚2e5cƌCd ZA*� � � � � � � pj)C � � � � � � � �jmذAN 2*@�Av&χi@�:kW*U#I&Zt֬YÇ /P@ *V={꣏>JZr5j-[wձcB!� � yW m@�+pkqAO>=m@VПJ� � � � � � ��ZwJ � � � � � � � �)`ZGdT �䱀>3ݻuC�@�K`ܹׯwѦMϫq5z�~W=4{lmذAڵӀTV-9Rk{T� � �9PwY=� @~7N?vڕ][j@�@�@�@�@�@�@�R   � � � � � � � � ;b� �9ۧA2j@�@�BT`͚5ԪU+EDDhOu*,Za!mjժ驧ƍ][o%^sر:qD@@�@�@r|_Ԅ� @^ ԨQC}ѩS4iҤj6Wپ}׾{ � � � � � � � Oח?5 @�@�@�@�@�@�@�@�RR>l@�@� :tH>^ @6ϟ^z8:UV-͞=;fj$ <X5R2evZ?^u qB7oެ^{M:u3=˗sڤIxd<xPonfUPյc>c|dpȐ!СnF5JǎJoѢEճgO/#ռys-Y$WڣR@�C P?[W\; m"@*$// �Ê)W^yYeZ<IŋNS@�@�@�@�@�@�@� P+(ND�@�@�@�@�@�@�@�@ 4bcc~ @�@ FÇG^4M\-6lĉf婢xƍe@ ].M4I_}yըQ#n'du9sN8^Xի?^~=zT}Q}ܹ~ ͨxJu)Ι7ӠA\pյ^#Gpm SݽP6mԪU+y: � 9ɓZr@@ٲ#!@�Xڵk~Mv 1Xʕ+m8 � � � � � � @ 熞!� � � � � � � � rk&P+*B�k 9r|AuYy<!@ |2dH({F%'sZ{ot~ @/袋dAX_ =^MGe…3|KիW]wݥz%[:'pWk]zumKfM_U/ʗ/f͚驧qe<ٯTRz'{x Oڥ@�)>'P?=ڵk][R@�_ŊIǎ:@�C`ᮣO<DptG/-P+""V!� � � � � � � 3i8@�@�@�@�@�@�@�@� @V@�4^|EOcV#�ظqnBEdUFQ  .sҥKX}``cfSH^{LsթS.y#O| ӦMsOԩElbi۶kz' @�4|d)Jsim-[6jZ JJ 0@�*p+**J'OZq@�@�@�@�@�@�@ |6D�@�@�@�@�@�@�@�@�`@'c3 �!{nM*KA�"p3F}eզMw}l٢>}yMض &hيO?v-۶mSӦMݵ\rnuV%\v-م-ZT ]HTdI :T9o߾ںun&믿wߕj}}`>@{u}Pm߱cFQeʔQϞ=վ}cy�/`->*TP(kv]U&M 6SNzGuvtSxx͘1Cֆ]'ZjzgTJ,u}kmf۲g}V ,]k֬i֬YGwn͵mf;tFzݰaÔs*o[K.ԩSyС^uYFwqG3ӕ jر.Pgow</X˯/3͜Og]eϋlҠA*UJ6mҮ]TR3veZ]tk4i$D �({_>v-}O3e\o^~e=}޿ j*Dƍu JVԿ͛7c׿\̙3)S$u*}w; Z:v,h@� }W9bc0~d#>w1 � � � � � � @ 4� � � � � � � � �^ڂ@leB@*<"� yL&o=@ W*W&޿ z\MvgA46hÅUt+԰aC7]Mpmeodq^`Yȇ,ZMms<!!cg[{eZܹsef[]ovi{.cʕzvڱp- )] -P+>>^m۶Հd#vd߽zJ'  8}t}.'PGֵz!-[L*TpSv]�A;f.(խ[7_~ڵkuE.Ć뱅:t"Z]cRһg-뛅6FEEk];v躑ہZv<y.23g֭:< G+Ԑreܸ }v+mPLٰ�?=w~23.YXX~}en{ovڹ ^&fYbŊ.\XիWw>1P<-,4Ă?( �#=7i;\r%J>g ̴PL m ֶPU ?c=C qv,Ou N{*o>_Ȍ �<C%M;2  � � � � � � �wԇ� � � � � � � � �% & � @lѣGkРA �^_?U;<d'Ntawq o9SLL 񈌌<B5&MJmn?[~mW]w%Hl= / 3fkqY` زb b9er{9Gk#,,La46wgյ:m{Mga3Vxy�-`aIcI\ҺVnZ/낵,|s4[Vbb͛Bm9`K.opB^GDD믿v3GF̶e.]T/ X;3~(f i~ dhBeʔq=a}QGSlVo[Zp-9gyF'OԷ~_QbǍ7N^{yNY|bmX>(}==666y} >ꪫ\Y >!�={ޙ}6uR)OF}]= ײ/vs[o]͚5s6 Ѳ@loVi)KZѶOF)9#1Zs:  P`ʕ+'tY6P޾{ � � � � � � � o0WH} � � � � � � � � @Zjr@�H[`ذa.o߾i|8JO&� ,[\�K/UҥvZ7w\*5J^ݰaCYMz;wb7nt�>VW_aU&[ʖ-nݺ)>>>y#G}mBG Nm/IG˖-sN5iD \?CM:5}q0/o{)9 [i]=&[C²vꮳTdILh^ );voڴk>V,[,0jfKfikܸqZ }qzޯ,Ɋ=bd)>^sΜ<Яɓ'g^zώ7N~>6eȑ#]HCmA^wv^ɾ �4>ǻ>?3 j_݀=ZH_[Hpo!YV,(sβ0oI?ܷzBGsi x  @2d~L '=oĻv"P+N}E�@�@�@�@�@�@�HD'"� � � � � � � � Eug#�䵀Ӽ<xpr@B^WUH\ ))19P[[E-~ͻ:9%y'v Xf Zdիn: 0 3IS޽{U?s=.ȅiL>]5jH}iof~ڰa:o^ͮ-_϶(Qzx�)`MǎK QuJnMj%""BDteɂSg|cVe~}- vIUcbbN}<mc.Hޕ _}.1ύw}N̂+޺znǔ)㹷?lnݺ^eʔq??n6m\/HՆ@�tN: 9{礼og,C7o駟X Ϛ0azHkGg5X� � @^ \}y…ylڽ{}_MA�@�@�@�@�@�@�@j[@�@�@�@�@�@�@�@�@ ]ڵk@t؈� O>U;m@ #܃@B{{XXam޼YЗTZսL^ɵw<)URWiӦj޼L#Ghԩ@޷zKX*=aɸ'M$ٳuM7ŋiڶmix�)`7X?:UB ԩSMPڵkW͚5K_}zbŊwxn '%%.]Gf/y=_|!=;*T vvcCiر{oN eƌI|@&}C�(� YuL;d>KgVr²,-D{СѣVZ5/f͚y}?[}6J@�@�@r:s`<hMl߾Uf � � � � � � � o-J} � � � � � � � � �Z@�3֬Y2d 9cV �Z�UF_6%Kdɒjܸjg5Ďb!66AX#<}MmAZ_5h Y|.Co>%$$oO?4|Y0Ixx>-_<'O u<A��8Q *kݻyTF wy6m j۶*V9tPw ~&&&oM"Xkq~{;qi!l֥ǔ&}Ҽog�/+K-?wCUTIK=nMV&M{@ Dܨ3w}~۷W͚5/P믿^{kb2*G{rDF@�@�]x{nﺽZ@�@�@�@�@�@�@�Z � � � � � � � � @ 4� z[o 0 P+?.]sYGvUÍ7_գ>B]?SYЖMtmeӦM=ڋ͛7ux=L2:uڵk^{ͅr-z饗~;vptXVre;vؿ'e3ƭ-ZAxҺukPhcK͛c_xK}.ςu*_|rW+<xн0m۶駟--[֭4ic=e˖)))I~V\mHvͷk.?2s} C+5p@ϝw) >x|G/ewV1޻{Az뭷j*Z?s>eog^@]tEwuN7tP3={?yՖuf?m 2g]ve.P˂( �@TT s2o{|N^>۽ [𶽶Zrݺu;13szF@�@�@ ,P~pԭtbڽ}Jݏ � � � � � � �dGQ8@�@�@�@�@�@�@�@�Ȃj٤GQ� @X|,D&O&S0EuvZ gh ڵӵaYhC=J㏻a{:tRp .ڵk={jݺu@իWuwq qҧOY(ׄ TjU}'ի馛hۭQT)C P^q_.nqر߿{ncɸX /q}7x]? YΓO>~X 6SO=ѢEПƍk…5Uގ>|X5MjT m۪cǎ:ڷo_4jԨk{wPeAV6 Vf6T&BM>bĈLe\oݺUmڴq?5kt}[/zqΝ;'p7jYe? iޣJ׮]]9/}:΍w<Zcz e~ֽ>'OvX틽̙3[ʕiӦ^d]۟~ɝZso^{ |WK��@�IDAT@� .&}xfL}IY ܹs]3.@llw;uҥgy{+vjSw}kr<A�@�@ @ww;+WhΝ;UB띹k@�@�@�@�@�@�@�Ⱦ@!?=9@�@�@�@�@�@�@�@�-`M2E6Y%s+VpZZMRث \~<Ҙ1]�?wV<9+i[V{t5׸ B ]eˤ .֯gq*z{n^~yk'N0𬔓VƍeA'Y f!6IvV0߯%KhѢ6Yg:'GQ%e+Vqb`[Lc@RR %9rgQ5}T],Y͛g}V :}^Yl~Orz}vΉĸ`*{ .^cy+VLJuY97ɕIF~h*'&µG;)ߗO/,X,<.""5 7�7 1 l֬F@�)P^g1~&Rdٜ~N7,4\rv#ho#� wc={ <_ny>JI[؁U)pTTj;(NξӧOP Ӯ&Mrw I@�@�@�@�@�BH d�ߏd"ڋ@�@�@�@�@�@�@�@�@�? VlVA�@ k͚5K_|E 婀'?ȕҥY P… XIvXKvK`o Ӳ-LJtt{Gxx u Z7tPu]T:utmGqkVYwm_{h.}M묾s9{+sbVR:D$Qyխ[vv_5y+6ޙ1soA};2lH촛8k۱c\Mbg <X{  �*{s2WN?Sn72e}[3r`; � �]x&Pkg7 � � � � � � � _-D�@�@�@�@�@�@�@�@�!`EFF@1`� @6}Q]ynf8tO ď?l/ނ\ BOnݺ>}/^,ܻ]vnRҎ;&* k.ו?#WdW^m,Y2h!  ʰf͚eOnѹɌF?~<.k_f6oެ7xCǏr<TTLn �}<?ņ >P@�@�d-[.7N � � � � � � 3(!� � � � � � � � @kֺu2ޑ=@�(|.\~ 0l X' @jS58q&N ~U׬Ys9'͛?ڵk5j(uu=oܸq>MΚ5K݊9s;s=gM6-R/n)PsF?2sn_'. +<iӦwW_}% 59rvEf&vE�@ 6my4:TO<D."� �d-Zhذaڳg*T4A@�@�@�@�@�@�@ h SG@�@�@�@�@�@�@�@�^ Z~}#� 'O?/ 9d?CrZYgUt͓Zc@uј1c\XԩS[o饗^gzwV(\~Zhi-/_׼Mvwᇚ={ʖ-[o]4hS? �~hx6oUR � �䃀j:uJڷo=Zu%d F�@�@�@�@�@�@�@ je@�@�@�@�@�@�@�@�@6IMAA�@�3hժU<yY@6JƁ� @ Mv-[nՔ)SkĈtڤm۶U r]Dx;'MF|r͚5K} T,Do̙^}ߑUW@$\ɚq-wsRi]RKMsQ,Ɯ.{ne]:>s.Oƍj @� @�nv! P4Z|A>+ @� @� @� @&jՄ:  @� @� @� @�ج@III[vhҤf&hHWc'KC֠`&@�E.гg8sux8cٲe1bĈ8}'ڶm[#} C`裏fc=C?,<o=0> FI� @�( tg-zZt� @� @� @�E- P/ @� @� @� @�(Njժ5kV߿8 @n3gN|;ߩUP,ܹ޸  @ qꩧfK ;M>CǍ7iaÆ{-{Wgq4.bŊ<yr<SOf:蠸^zU{*$@� @� P)P몫j ƚ5kk׮5ڎ  @� @� @� @ j  @� @� @� @�ԙ@iii3jU0ҥKɱ>l vq?GtR} P͚5}'[R~<w˗/=zĨQbzĈѭ[:& 4 v/s='N &ċ/iN;o\s5z (  @� @�^ j=-++R}*;C!vO @� @� @� @Ԫ @� @� @� @�@׮]}tPu_  @@x㍱bŊKj~6\ ":wn7r P]mڴC9$[R)^gy&}կ~_~y_>zÇ5lذmbwMsii5mڴ:ujL2%^jUvSTz{cƌݻ7 $@� @�w~rfͲ5  @� @� @� k+J� @� @� @� @@ I?f̘Q}�|7pC\xѥK"@. )Ğ(n4i Ig fɒ%Ys='O?g[͛7gZk^B! ̛7/O-JKYpܹs3nݺtP\p{DبQf @� @�HE1lذ0aBp ;ttڵ`c @� @� @� P= @� @� @� @�()) @�ꫣM6o|:UL` @�jC]v~eKUVe!A/BYPx뭷bݺuѤI0`@µK ۷o4mꟀ-[`…_=Ғ ڷoKvaYV ޽{q^  @� @�TA`=phD۶m#) @� @� @� @&kPU' @� @� @� @�[HBq @�] )W|YV}վ@n>3ZϮE P!мyP˗gAB/rk2~;c١)LO>N;e[iݿׯ_իW,r ԕ@ْܾ~y7+7x#RV*7>#G]w5z]W. @� @�:=ztqzh֬YgcHZ]t[ @� @� @� @�jU-*!@� @� @� @� @`kJJJbƌ[{  @@;vlp׻P ]z @Vbٲ;ꫯƸqwߍuevq,(U"B#P^^g;Th-Zmfo /N=,.NK-*A� @� @G)PkʕgavZ]' @� @� @�'Ʌ4  @� @� @� @�&>Ø;wn.AC]?%@�H`}q=DfͪR$nDYiM @wik>իWG 19sf2k֬lߴiӲu ?\:w>3_w-6:,Wׯ_s{}bIn] oK봤I|%쒂mrHַolgN!@� @� @` :t &ljmeu4 @� @� @�l@s8 @� @� @� @�#PZZUTVV&PzHB�E(pE{sL^A Zp�TM Nٲ3-[gώ9sdH)))5)}v i۶mt%[vZ:ucǎFmP5/jժXxq,\0 J!Yiɿ^`A%]4m~mCz*/)H+5m@� @� }#GfZguVA{ޱB� @� @� @�jJ@VMɪ� @� @� @� @� ;Zl3f̈}gz�GG}4|xGLF_/pIV\ @�,кuy睳esM[. [JZͫ[ʇ.M堦5k|ƍGv}YVZ%m~~M6VZUlQ~iѢE]NW+Vʕ+u^|yRҥK#,YdEeTJ0뮻n&hu  @� @�u+0z_Lq7s @� @� @� @ >?g @� @� @� @� iDYY64 Pׯ /0;8w z^)P+c (  P)+*%-U[AOi_> jY(T~X$W4o<RVZYfvӦMI&Ry;/ݏԒ2ί׮]iIAbUV}bҒJIʇd;쐅U-СCEYǎ+BB� @� @@ @k6=t/J J @� @� @� PSjJV @� @� @� @�lQT@�Q{I&Ŕ)SRVϞ!]!@�@ zJK߾}{<+VZlY,_<Ҿ07\XU>�kcAY)06mF^S7B\u尮e˖YXZ|;_ @� @�@ J.x1|ZwUt� @� @� @�K@VFC� @� @� @� @JJJ',>,^4^'pB 6l{s> ̚ѧf& @NAS;w~^]W'k� @� @�+z&L(@uEyy@  @� @� @� PB @� @� @� @� @QVVVG�r)GW]uUA[oEW}; @@] YѤI]@ @� @�P`Yֆ{Ղ "juҥ; @� @� @� PojKk` @� @� @� @� _ jgKV  @ ,Y$8쳣_lA`LZ[ 6 ֮hڴ#> @� @�%&NXP}JIZA� @� @� @�5$ P`UK� @� @� @� @JJJʶ|# @@=cժUq饗փB _ۑ o+ @֬hҤ2 @� @�>.0jԨxww[uzY;w~h� @� @� @�귀@}}� @� @� @� @@A /6m 2T@o/8L.UM٬ܹ+WFr) @�X6r6 @� @�#GFFbĉu\`Af.]6}w @� @� @� @v N@ @� @� @� @� )L1cƌmę @HogAZ{nX7]`̏F Pد @�5)4M� @� @�СC 80&Lu'Ϗ-[F֭k% @� @� @� @@Chڐo @� @� @� @�Խ@III}G�Ԡg?Yɥ!qhM @�XFVq^9&@� @� PF'N,A@Ν;Tt� @� @� @�@7$#"@� @� @� @� @JKKjW&.( 't6$";$ b[C�4k? !m8#6R @� @�A`ԨQ`ҥK1# @� @� @�@" @� @� @� @� PR}WFb @`O<D1nܸhܸ@ @kbU @�@ jҤ P @�z+Vm8ի#V(/pV-[n+ @�K j엕EB(UB @� @� @� Pz~ � @� @� @� @@ >ΝK.-&??:8ö|'V^ym=y @�!f@q�~ѹSOEgKO?^# @� ͚5' E ~P @� @� @� @@ ԪA\U @� @� @� @� e3fl`G @�"0aB\Esݭ.P>\Gc @�jV`ڈMk  @�CVK6^cE� @@ l2ArѥKB~ @� @� @� @@=UO/a @� @� @� @�(DƍX @JWK.$N<1bDq??\Vuy�kD4iRgd @@(->|IAGѢ. @�!0jԨ8qbtv~AtΝ ?:B� @� @� @�S@VFE� @� @� @� @hZfqcƌEg%@�UO~gώ*;@ G Xժ� P֮H  @N>ya),a$H� @@UFSLFfեK. @� @� @� @@}U @� @� @� @�((+++&زE⪫s=7A^y%u>}b @�@Iz6(!@�nݦ׹sān} @� P\Fe˖K/T///� @� @� @�Ԡ@U5 @� @� @� @�U())U5*G @@\s5YO/"n74x}C�T5Tu @@ >ӬY 'nS&@� Pkn:&LPm5K,N:}-  @� @� @� @@ ʩ2 @� @� @� @�ETֶ9� R`֬Yq-e];v,>THZCq! @`{֮ht{kq> @N>ym^q^ @�SI&{ĉ|�Y:w\} @� @� @�5: @� @� @� @�E!fϞ+W,$؜%\{:ksy@ ԪQ^ @�D`U @�E#p72K@dS4Q @�(0jԨ ԩS{0 @� @� @� mUmY @� @� @� @�VXn]Z @@AL<9~_5\͛7/>DX8w" ixc7b @]Fͱ @@] =tPf"N9{} @�jB jM6-VXQWXZU&s  @� @� @�l@ms @� @� @� @�'R)++JD�@΋=39:h]>x饏|" @�y @�+pIWGw?^"@� @@չ/SNA-X ksu @� @� @� @@U @� @� @� @�(xmF=bƌW$@�xG:~"ڴ߿V @hjq -0hPn- @�@iiit)&NX*//MF]?� @� @� @�Ԥ@U7 @� @� @� @�U())*@ PHks3_xqG^{UH]ӗ(0ujС52 @`+jmC  @�h:##7G˩Tt� @�j9rdj-X 桩� @� @� @�|B@'H @� @� @� @� @.JKKj6  @ZxkTB`{RֈSs  @� C@VøFI�'FY/Q @�I`ԨQuU^^;wvA @� @� @� @@ 44@� @� @� @� @�*@WH @�Xti\qqgFL!PG<|'e/M�(Zq�ʕ+?t0-[˗/+Vd봝jժ/鼴zXnݺlo|M͉K/"7n-M4:KKf͢EѼy%nٲej**/[6mD۶mu:_!@� @Rֵ^K, Ю҂ SN$@� @� @� @�5# Pf\J� @� @� @� @V [ok֬MW P]w] o/:셦 |$PV #'B� %m2% @@`U^^|A̟??.\ueѢEx /smCRUPW�ͭ}27YHC6:wC*ozK%=l۷ocǎDi_w%v:tFm @� wu{%l$PN5J� @� @� @�'`֙w � @� @� @� @@a faZov 00;W @cgώo1D V!PSFn刡C''@�ڵQV_+=$@�*}ݘ3gN̝;7͛^:m�K JO^z+RT۶m֭[GV*UARO={ݺ^۵ VXt%|axXz=cƌ BȖ,YׯߠOM6Ν;gZ)`{1t`ݣG9SB� @! ;z'N@:,P! � @� @� @�' PD� @� @� @� @fJJJwjm[ PX^zi69SXӛ+0eJĠA8 @L@ P)魷ފYf;3vZRV JW.۷mJN[vK.YSu |JWg�VT^{UG-֑BRXZ}ZhQ,X ϟ)&MTvlٲ.),-}ɖw1[7Ғ @�Y`ȑYV]1| @� @� @� PjZX @� @� @� @�TI MJةSHZgt @@] L:5~_w-Zˮh@#FTA� Z(�ogώ3fdZ)D+-))_RR Xʇ,=:z-))-t)/V{&MDz*5R Z>-^y_zꬾգG߿Œ*))LBF @�Q?y9@;Y&@� @� @� @�# P\k#%@� @� @� @� PiR4B�A[V /CwL1vla @�S@v:�T@ J!IjL>=[7|3I[d{'pB/ O۷otڵzBh۶mٲ[.͛3g̖֫VNoժU5hР<xpi]vj~ @�%~?/>N~UP!@� @� @� @@U/ @� @� @� @�(.RZu� Vc'|x \1ztM @�( P> @@}X|yK/ӦM˖J˖-�v1p,$zYim7n}.gc̘1!n͚5+{8#w^ފFE d2dHn2lذe]Yf @�u)0rȬI&aV]U$@� @� @� @@`/ @� @� @� @�(<4! @�Jk֬??>{+c@ L4Çm?N�(|V @�+tҘ<yrLݰxbԩY_[vu8C#SQ~")C nTZ< LxSV v{嗳q⦛nիWGͳ#ST5*v}hѢxA� @6v~Ϊ@XxرcmY[ @� @� @� @Sz � @� @� @� @@! oׯ7ab!^ }"@�L?i6" J j[DV-!@�@>PI @�HuOO=T?>}up{Y QGÆ BvyHaG hKT4hPfZ*^yxBXhQ5t3fLޱ^{ea]s  @�Ԇ@ {Mŵ]RVOVmk� @� @� @� S@VüFM� @� @� @� @ JJJb1gΜݻwAQ @a I8#($ "F.  @j;(\†{xG Dv"M~Gf#GzSQ6"мy,-tI)4`ƌ1iҤ3w+W^z~p@1pj @�H?stMWak*//ώUE0 @� @� @� @v .>' @� @� @� @� P`4)@UTXuرUzT@ <9S: @�@q �Iwމ?#<i2|W_O 2$7n\M-@a4j(JKKK_R֩UVŔ)S'<.쿉|C;,[wܹ0 @�F 1{Z f:u7B� @� @� @�+ Pp @� @� @� @�hp={֭[GYYY~ nL�-0s̸[k Dj{ňe"ܳ!ޘ  @�&Ԓm~"@�-~xϖs7R8Ё\sM|QRRR&7ogwy{yz(N;XbE3&_%88p&j� @@>OE }8qbjuرu$ @� @� @�Fx @� @� @� @� PiČ3n @�⋣O>qYgmoU'PGt1dHWB @@X5iRoh` @`RQF<=ǽ_Wim@z9lذ7ƍxn4hPݐꫣ>S @@ o>~9iҤni-ZJ+ @� @� @� @j0  @� @� @� @�:RZ[Gh &o~YfТ&lSOEoo  @�-vGՠ?O�9y<xp�4>o|#fΜSL*waL>0"мy8Co^|8c{;sOXdIUs  @� Rĉ7W/RVVDMC� @� @� @�2@� @� @� @� @@A *+3 oƾGy$)ګ S @�j)Kc PO?t{챱;w'xbTFCַo 4 v-oǴi^}'.ٳgy1}a @�"0rȘ4iRUJ/^۷#@� @� @� @�% PkL� @� @� @� @@u @V} @`loqp"3'⭷"޻&[Q7 @ 4c3" 9qŘ1cbC=Z\veѯ_͝=S`Сq 7ĬY⮻2dH| _P  @�HAO��@�IDAT`ԨQ`x7j-:Z{"@� @� @� @�- Pa_'@� @� @� @� Ppplҏ @@Xre\xq'Ƨ>7~.H!{YK @@[QOji~:>OGG&_OaM7~>&дi8ꨣGSF۶m#8"^% @� ><I&cg o-^8ڷo_í� @� @� @�|$ P'� @� @� @� @�())3cƌ @@s΍}{ B`C#7nQtW'  @�#vG]i_58ScaÆśoW>}jA UCs7x饗bnť^VڪzL� 0ZjC 'ڀ-Z:t4D� @� @� @� [?i  @� @� @� @�I`}q ]wUZI'Tq.^:mI/di~x&8ܖdɒ;㎋/q}emK]5}N߾}iӦQVVVM�lV>~qyŎ;cI.x""uT!@�J|V&[y  @@ <c3y[{E4)SرccĈqWUߋrQGŀӟt<C<Ax =ztL>( @�+0rȘ4iR5*P֨5D� @� @� @�9Z> @� @� @� @�A`1gΜ֭[tMq=3&1̗˗Dze/&k׮]?_={xw*ƚ5k#[n%?8ck_Z\qU9֏IaZ3fz$@�ߕ[ /n J`∩S#> @�B`ݺ)P(.N @6y~6N9Hϥ )K.W^y%wdjT~V==XpauGǸq"vmwFVC9$^|e]ŏ>h$@� 1jԨxb]&g ,=n߾} z @� @� @� @- @� @� @� @�$ЫW,*M~Gy$oWݻws6VΝ_ 6,.߿& LX[S.Hm_uU{??g5Uڱ%%%jM[C 14AW_}uifcG |2bڈ+ @Tj}O_wuW|+_~7]vZ;?!fΜtP 4(O/q([?ݪm=sN|sWs #@�(f#Gƒ%KW_a,Z(:tP+mi� @� @� @� @� @� @� @� P ݺu>}GݻwnmZӄs|.is68/~Fyyyqoo> z矯ؿOٳg~~Z6j4L;/ zj0"v%"uT!@�JV9� ]`ԩ?N8л[5mڴJ9z^y啬{^"<粱繅0+2 ;#>(. @@ :47o&MԪf @� @� @� @氏 @� @� @� @�jHX;c4k,N;[o;ƌ3{/~ǜ9s39+ӟi%{rNj/Ǐ^7j(N9Xxq4|oMvgsv;t5kD~2 &wӧOv-:Hv)--Xj�$/ߑ<!P)P3)Ğ @֭M~_�lvX³5ԱO=T6fy1G^{mTRkՃ>?oG1mڴmժUٳ'|2.\F~Eܗ:+oٳ#=o{W_b۵kϊveu*)鮻-[7tS?S,[,~L.޽{g&i|tlUˊ+>=3|s9'RU*ߦ7l2[ovkR76{oUZ=: B}캦63lذ`o~u'g?=<c㎋tw;sL,_sش̛7/c ?s 7?!{^}/zR~v:=O~R] @�:HaZt :餓j7w۷o_h� @� @� @�$Z> @� @� @� @�A|WM_*um۶.l4\߾} p+Izݻw^ ҄in6\ JqH>c'֭[Y}_qee92C4`6KIII֯4 `Vjim @@H t9<a.tisE|S#@�@Vr 7)'ȞʠRXV A7Ku׾㳟lu)dIY󳐪'F6mi8Ks7P>ܹsgw^?AȔ*MO)T) K[)D*oFzvv>Ki)�qꩧƬY╶Ν?pzgxT8l\>h*gY8U㏏[o5 J6縥@ Bƒ3 d;ė/j7x#^z?XdI5~zh~_" Ja/Hk~8R8@z9yo"%:d}M;6ߍW^y%}Ŕ)Sg\sMBz/=W;µ6<7]E{>{)|-V @�K?/FYhQ6 @� @� @�O}| @� @� @� @�T@ ʗ4a^nv`w=iҾ&XI0w^& lt~.yًߗ={v|_N;-ghٲe7n?|je;j_>xVwj\L@n~X&3)  @ RVB�@zӤIs= j\iԨQ >|}s9>ёBR@S__68nk^\}YҥK*M;\yW¥*o}[s~Y�X iJ%='LPwuW:\gw<@zRS*N<c1bĈ\-l iӦeaPC.\_#ymc J�TQ#/_o߾ѬYHzOWk͞kt18RId/|0ۗ#<7xcv@N4);.:ujkӒ駟]t7K#ι袋:SWnoynfƖBRЙB� @ иK=P۾}lE @� @� @� @Mi� @� @� @� @�׾MOn0 ^*%M$`lbǯ^:{ٻwlKi¼??~ĠA*NСCnݺ}uҤo-4q^mdM Rk�@/4nU!PkEY=? @@a @\ވB�@^ޤ�ƹ=%0j䟟UF 2, *MXܗ+V|=hٲeʕSO+" J!_;Cw?fK4oܽ«e}6m믿m}.ƗR=1%￟yg1c|i׮]gzo ӧOt);̙31]/~avmҳTZj)+\2ZhQs+NA� @K)_w߽zlٲH+ @� @� @� @6F# @� @� @� @� RՎ;iʥ'KU.i|i3^N6-;[IaY/4\="MrJ~"unݺu6`TO!@�%}/֬YjV!=?qSs  @� [ e j؟'@@}6lX.RV*M/9s… `xײ*Ǝ&Mʖ)SDYYYR=,d?q Ǎw\{Ezo'b s=~揩|;[nq~btugս+֛rU4իWg/_}h߾}uI'՟矟?MTy'*Ǐ RȘB� @ !Lg7qb].aN @� @� @� P  @� @� @� @@ N?~ ,NU'`e]sx㍊sٳC ?wܸ{#gy?⽁f}4z7oƢE򛵺N ԪUr @A [q7gaZ;wn_+fn8^ @� Q j=O @`ҳ}7m:>4yXfv -MR&OXbguVi&~=ܓLuqԩS wy'fΜߝ{wxv8cq)DcK.$<H3<3o\vZm^kxHZ/owmuUnj<`ժUO<160VM� @(1" nڵkWͨ� @� @� @�TԪA� @� @� @� @zRV /~V\YFDr*4I_>}b̘1S;ޕ&83"?EϞ=#>RV &KeСKf鏿oqeU Z- _~&UF;fCo� P l~߾US )*EUԘZRkҤI-ly]))G -=j۶m{ケ\KzO~;kΝ;GzgN=M7RHó IkժU /Sɯ7WfC9$S78w1H~_gogK}ț\zSOE[Ւ>U;3+P/ @@ 9rwjbEU$@� @� @� @� ژ} @� @� @� @�Aw/|!dzjӟM`q7np/~1~ӟƜ9sc_~_zki&__}\pA5*|o֬YqgWԟ&kܸq\{ns=+;Ӳ_|1?vج'pB|;ߩ867jզ а?7pC4k֬ac}<p{DtX4]Q @@ 22r [:D�[`ذaqwdρ~_ow}Q?H?몫ʪ~b̙v J7?{-S@gw'o۸K.Ĺg})cs1Q^^=E :s|3o;}7vi9ݦ^o~Y]ݻw@%ƕBVXO_|qt)Wl^{-{uT۷ώo~*N<9VZy/B<YV &7n\Ǽy@ʡk)kٲeK JI+_Jٺ"],Ί?>n옹sfu?s)+}T \~dٵkZhQ @�$w@U/ @� @� @�lJ?ٔ @� @� @� @�A_j꫱p}瞋>:7id]կކ_z\}.;n6q_4\*ܬ{RWoĈqaŚ5kcRV*)롇ѣGG ꫳ yܹsvLm1`x뭷1v#@�#~8蠃0Ɇ3r#-v״8b @�V`ݺݒi�T'|_K/Οn: |Ztig5\;C3RPq>hoo,O~cǎͶl<UJ]3f̈/}KqWl>`r:th3<3=[ J)D++:};Bvm+CviYe\�}۷opO9]B3R$JJy] ΦTwzߎ:*M~9d]_ ;#7Y[n%_2K[cƌɞ똮=,--<^HgK1e[*~+qGfTOlΥЧ?)ݻw|ߏ? . &L_VV;`]wusjJ)<-g5C� PLF´RVMZ5%^ @� @� @�ؔ@/ԛ @� @� @� @� yc=6~emȎ9sfo&[jƯ7/鳥&9sSNѪUM&Ku}>l6ޛo&Q2? `|> Ǒ6rno)2M:eʔl-u/82"jx`G [ >ux챈|w @n5">[=r?tIѣGF^l)Mľf͚yUZެYOX{}\fݲuEe^JR\FbٲeYXSv :JaL%%%YxܯW^3D ֲv,\*yѦMm[xq-ZdbӳdShZ U/?m鳔ҵ0`@3mylz(D7M <xKx@|.sR e l(BS/lN߃;v]w]|k_{'2  @� @� @�u/5~{h~dۯm?ՙ?{wUuqI@}_}OwAQ@ZתZ)[VZ.jmB@Q@;Ȓ=;,Y&swf=L&w � � � � � � � � PxgoۄiYc6A߱MZ&b}@�O&m0aJ´}dRQ=L� �ˡpe~� @H,7ߢ]OСWjU^jժy-_}ҤIz뭷:Jrr>S nCkڴi}Iv0J*ҥa9]dZTϞ= iYYguȘ1c4l0YCQKIQԶۙwŽʂj׮](F Vu *MH疸?jܸqzew)� � <[n8&߂| ~+u4� � � � � � � 1JWh@�@�@�@�@�@�@�@�%W_}5{ǫYfA{DYYY߿P@�bCжmdR$7\تX1zM_@�@�prY@�"R`iFz5y3:p@zzƺꪫ4vX5i$"9 f: w/^ݿ{>;qhvZnEiQZ5?}~t_0q+W_} }h}Zp^z#3ϛ7O{^ykq3g � � =\O~} � � � � � � �e&@V0 � � � � � � � @p^xQ={N#G [h7a@�Z`ժUNՋ2͕>X..h@�@�PXV||(1@�8T`ip, :r@3/T*Tjז_v\=V^M-]~+55 8\xwBnݺjq]wݥzW۶mu5bmߨQ#YX]jСCfq71ԧ믿^[n|+B˗LJzH+W>ҮQ}7m4=ctg뫯: @�@ ݻwԩSeG .́vUT)M� � � � � � � @*#� � � � � � � � PXo߾gmCJl"ŋ]D�@`„ [F %նmҙgFT, � O B�DYd^fge Y�V,TvǫW/nm{:,͜9ӛtNSJJ,hĈj֬vzQ`Ne]-[xZ8^Y[Yݳgv\\\q͛{N/,~,TM6Q3F� � \ ֹsW^?VZ5  � � � � � � �G(=ґ@�@�@�@�@�@�@�@�8@-[0 �?_~ٛx{5x} m?8: �  [DH @0vuc.7PR%? 弫aCK}v±ڵBɍN8AV׭[<Ӻ;ԳgO :TVӦMءjZj!9HQJ*$?W_}UlGuL� �V 55U5k֔-Z5@�@�@�@�@�@�@�w� � � � � � � � �E@'x[  �E=zzM \@3 @�@ ,P+>>GA@�J*oq~˘*j,IIXUԡC d# `^u~ܸq^K/~Xr x{w'<c˶)ӧwŋծ];/@kذajٲel0j@�@�2HKK7|S&ڵK+W.i@�@�@�@�@�@�@� u8C�@�@�@�@�@�@�@�@�HMMնm۴i&ժU+,D'@�"[W^ь34k֬I{l;br @� pVD�B*cG~XgdRk�dYfٺ Ԋb[}dZoW?f͚:StꩧzEH(w?G}iٳG={W_AUVn@�@�(@zzz뭢n^viE � � � � � � � P� � � � � � � � �e'1++@ce@ flnM#GM&EA {OJH:zN@�@�r³o @'2jedXGv/H])TUIJ0֭N*|eYHˊR\\cFðkhV'M+W>￯kհaCǫ'xڷo*cڍdž@NN̙/ /{5jHv~ioi!t@�@�!`>/RJ@iZj h4� � � � � � � :!� � � � � � � � @H6mk޽{H@�"_ֆ t=D`AL ԯh19|� �\8+ "�طOڸ1? ߤ!֮-YZH[`iV-ƍ+~Kog}O?T'N͛UjU^zyK(DgUfff믿W_}ٳg+;;;/Tnʔ)]?j*J@�@�"X>ٹXVʕ$m!� � � � � � � pTà � � � � � � � � J ӲPPvc#�Dڵkun&9!1ػWCi8E�@�P@2ĥi9{OݴIr`jYn5k fYm/z@ΝYi 2= ]vѣeC .̙35c ޵8̽Zj0A絳W[l ##p"܂ 8 0۶}.ukUgf͚%F�@�@ M4q*##@s4@�@�@�@�@�@�@�2 P Pi@�@�@�@�@�@�@�@�'ŋAZB�I'z3fLLAGҀ?F� ��ZLg-[CY[_/ۗ?}!Ye5%EА, ˪Q#?"W %%''{7j͛Zj^uM2ŽN)))I۷jvdn[8Q\\\"4|ҪY5٥K 2ĽYf{IԢԫԳo٩T"5@G@�@�hHOO=;wz.!� � � � � � � p$$H2܏� � � � � � � � �a!F?E_ @d ̝;W<y%&&F u $R1O� � 0FIC avB֬Z@V,uRNN,(N_@aYP˚ݿ wO?ٳg{533SsѶmT\9mVݺuwܡ4/J*ݻ5o<}�\::{bZl֭[UV^]Q}{aQ(VW\g-Z{w,iӦ^xYgcǪsB =֭W_Ioyrre_p`ޒU rs@�@�&`Z/RgZ턗� � � � � � � @ 4A�@�@�@�@�@�@�@�@� &S � PRQFװaJ!r <8ݠ � @T UO'A =mӦAYur|xV!YmdY?(vmePbH`߾}Z`,4e,lC^xСC-tV MkYp,Ȗ,YٶIII6wV5ke/dJL 8pղe˼tҼŋes h= f!Cx6jժUVt晾j;{jL/_&M}[^@�@�L&ѭ. HA�@�@�@�@�@�@�(�ZEbC@�@�@�@�@�@�@�@�MrJo»Ptc"�Doӧ#鮻yh4`@L30x@�@ j@ v U K{|:)77*B4-۵/|=faYp1w^}^p?@n"^P;vBF-v0]Ղ/_,?$iƌz\K_FI&jܸWyÆ eKP_Bָ7;W[wjժ5[Ͻ5_`LoZ-[go﫿ޓ4>\_^I'I}mTFz� �DjY}oT $ � � � � � � �Y?q/2"� � � � � � � � @(,PkxҥjժU(1@�"T ;;[cǎգGF@zmvmW/4@�@�)@V 5i +s\@#oݚ߲e׬) eAYnWk,gYXٳ,L+''GIIIҥwkFiiij^hCV\9xN;x%hŊ^%zFF´k!99 ^[ZS:uܵڲ`/k8۾Payf/mƍׯu.ʿnah֥P~^hYm֬'K +_X87Hӧ1r_5?ˑlu*=@�@� CPsbK\rN � � � � � � �D@ � � � � � � � �Mdee4u�D#<kjʔ)1 Fo% d1` � Pfj- #۷9`֎Lr} %,޻dв c X0ѷ~̼�{[XgWGVnԦMoSJuGndڥ֭q?v_Z?i˖-,:5jժU_V*Uhު[@Ybbb^TRtl_;ܛvgu۶myfiՂd,̬ZYzzz^ؙwoz - i7K Ͳ,+<J_| ؚ<Y.d$ :d_?-@�@�!`bV ( � � � � � � �E@(  � � � � � � � �L&( ,P� @QlnұcǪqEݍ;7ϳJB�@�"^@ �A]&OjUmXfW.&/(y!)l´"$(\4g/8?z!Q]KWsgh„ ^xV˖->ܩ 0-Zx#޲kU0`PFYH… nærssmX}}3]=fZV+VEYXU]qs){V-̫(K s)ME](;;[k./d͂J|DRjIyb0f�2-֪U вPc&j }[$s?>T~k۾N*}Y00@�@ O-k>+X`  � � � � � � � P+X@�@�@�@�@�@�@�@�J,JVMnڵ5nܸ`Q#0m}G͐ � 6jSAGXe :8<k۶n5,S' |uؼy5{E\0V :eZZ7oGe[`eOVKZ,ʮM .(ny], ڽ{Y ڻwupfY_-`�WÅrCliǚ4i YYj_+Wj*UUA#FH))]-hW>?`|[SHcȅII*/nm{S@�@�@;C6m*gŊ}F � � � � � � � ,%q@�@�@�@�@�@�@�@�@j@�Xr^%%%Ťi1?Y<@�G@y. e!`?6H2ò,@/|=@ eJ' gZ.xhׯB233³.]mн(uÇ{K[oܸ⁲X֬YS}$~_K=Ғd5<O~>I3gJ'u./\;A lp?H,?ҎWزQɊ ��@�IDAT@�@�@-+^`ni5* #� � � � � � �D@ � � � � � � � �U{⦆!�D믿GK.AsMk> � �e!`a;V@A�ؽ;?$,z?5|X6bK,} ]S߇5B!ʽgϞ](@ҬY3/4+TZZ^^PtcC/% Bwu^}U=Z/RzԱ4k4tt K_]٨vڡ|7l]u{3O*U*@�@ 긤M$@�@�@�@�@�@�@�b[?#� � � � � � � � } �x7?z*nb|fK+`yI%G�@�8R|>ƍñys~+Tח7do٨oi[`Vbb>!.˖-Sfff�{׵Zhfx޲[nUVt~E #C:3g�Ϥ$=c.s}w/B][C馛%˥.2\&ثN(%M.}dz{B,\Bڷ1@�@�� {Zhvȅ@p � � � � � � @*"!� � � � � � � � @,PkǎfRm3Q@�8@NNƎZͦMA ^]WY3B@�@�0ؿ@0}jV ڵdVIWK�XU-bxb/8`f[jfvm޲k׮VZ~E}AZ' TQ6>l :T_~"OoԹ/Xk<$E Y[?~ZЙlM,zԴ/=: =5@�@ݽ@|Ϟ=^3*U Ds� � � � � � � @*!� � � � � � � � @(RRRgee'c#�a.0uT7j]~yӟ¼tcؼdt}ؐ@�@�J,@VCrs5kñevV⤺u% jr9eU۞$̏?g͞=[5gm߾]˗W۶mЬgU\9H_ htiRoH G0~Gw߭{キX=ZMP.wo}!Nj"`_Ww,ߵFRŊR~-brlA�@�@zz 3_u֩%޽;11+ � � � � � � � Px^l� � � � � � � � �!hڴ7ɤj!D�wk7njԨݥS] .8l� � PBJn1'wjաaYbk%/կ ˲@ݥgmI*_"Y ץ-X Ͳ,sΝ;]R Vj4]tE^xVΝURH2}?R�wߕ"u xYG/\[>ˆ4Yxӹ}'ԫ=}~gI.xԱtye/xGA�@�( j%##CXj)j+W]BN)@�@�@�@�@�@�@j@�@�@�@�@�@�@�@�@ ˗W&Mdɒ#"�Dnd/Pg"t Իonȃ � �%🸸ΎD[ Ʋp, _e,wV.k Ų`,rpu{ܶ m999ЬLowiϞ=^HVNЬ. СmP{<Tzu_PQժnI\{z'4j(䒗YRR3K.N>YzIiĈb6e&`ZhoK?/ˁ}[">Vf]a@�@�2QZh@HM .#_E�@�@�@�@�@�@�({KBs@�@�@�@�@�@�@�@�@jjM �DܹsOmx'ʕ+<lwI -@�@� 8 MZC 6o>|H?8k*4CzcYKvpsؽ{,,ky´,Trҥz뮻 j׮ mGNt~T᷋{˹Uӟԯ_?0`@obo%/)͟/saņ,*TU]jµ,`ǥji`3%r y@�@ iii^VijV@�@�@�@�@�@�@�+_fW@�@�@�@�@�@�@�@�@ $)))ZdIHA@�[`޽wF&Z3FR%wʣ>vMT{] @�@ @ J X`%۶kW~,B6:t:pXVƒkP5;w Z`rss]zBrպuk,(1/}t8_| %}Pŋd^O?t%$${hcrRWK J\(]b @(y7$CHIIpCϖ*U R8  � @h߂;ٳ@ #� � � � � � �E@0s@�@�@�@�@�@�@�@�(@jj>6 �Q&?_EN̟/w҄ M-7AԨQ0N@�@ 4νBst~l/UpaC~NjL:vU   ۶mӜ9s,D맟~~Xӥusris'N[h5XaX8`jdaZ>mP6m?QǏ/.LjR:|wޑ,đ9j] zc פZO&C�@�@5khjذa vDJ؏@�@�@�@�@�@�@�J&&̍@�@�@�@�@�@�@�@�@ )))ZbrssݤlS9 ;v=ze&lSNF.@VX-8 � @q\vwU@]eC^^% zj DhشiS^pٳeYYYY3իW <xLKKS3K P{p ?\ZT&.%췿&O#Gj޽wM-. e!_eZ/Tvm颋K/NgH � @ X`t9##C{nGaQbώ � � � � � � �DYeJ> � � � � � � � � tT/LB,\� ԩS9e0 Ҳj&dz9HO?-լ{@�@�J/`]TDA,~E#5k%Y|ͥ>}|e5n,UPMG`ݺu^xfYxeJFЬ.&jQ(@n/<¡>Dj׮$D>cƌ7~zgJqzoL⋥}]2TMs,\릛|uR|G֭.ۭwqH@�@� TVMwZ"@�@�@�@�@�@�@�"R@|4 � � � � � � � �'Zd Z3b@ Қ<yn671Y@ -eNV> @�B*`Yj)o&YDZ0<kӦը Ʋp㏗aY[7[@+W h^۱K_2--CvlU(;\~G҇ʽƊWdoSR%:r-رc,4jt MP&9ּ!=CĉgHW^){.!|84 �ĸ}&ΰRUX-+ � � � � � � � Pf� � � � � � � � �!ST" Ԣ � pz;v,D@yG0 � F-e ϲ@-WO@ ??<_ժ-Y"@q<hٳ ׻8hB697gYVMҨK:פwߕN8;FÆ s!Ii׿Uє+'R־`~xBJH(u4BiM7_he^qtվsvC#� �1'NR;;;۝s^*DvF�@�@�@�@�@�@�(�Z&c@�@�@�@�@�@�@�@�@s7mVVVq@�D&O~gCa+@lra >-"� �.?Zؾ=?0kɒCYV/�:+?<GX~%1@ p)- hmqv.xe>յkW%''1nUzi7SO=Qnܧ>S~2FjdfK&^@hCڈe- ˗KO= ך2E8P=~Bpp@�i ԲP+VI&%QŊK/;!� � � � � � � PRJ*~ � � � � � � � � tT-m) �1-0j(SÆ i6qiRz?VF� �BePcC`i2RVoi͛{Q :Lߺvfro^`K4\peV̙.|j׮uy)--M;wVʕK`Z@w)M*/Dngq믿l3^[j"-F84m*}tқoJ>*vԡ4zt饒pQ@�@�F-:##āZjC � � � � � � �G P(8<� � � � � � � � �%fI( �++/ԬYbnj_"3e � @,P+@YA;\V<|`fY#slF _HVjt)}K JJ6(\͟?_yZsծ]\J Uf]|^VNTR2 M"P2&M|Rr/Ә.wsꫯ / EǎW_I+)Իw0pY:Wݯ�/뤉Q$[Z5 :J@�@�(RZnj%jw  � � � � � � � P+ @�@�@�@�@�@�@�@�J%`Z?K;#�D={4n89R;z1ʕBcl � �@&;֭YYYU ˲eRNU_X(ժ$~(͛g]ILLeu}[ZV DKc2WtY\r AH5h }\R.UNK t"=t=?ArYm^7Ka?:� �DmEFFFl9I+;"� � � � � � �L@ � � � � � � � �@֭[]v)fɥ �Ĕ>M6{q3+</mRG-|?@�@�/pvijb/ kC[ڲaC)5W{eoׯ_c%F`oٳg{^{U*Ug.իn/<]v (h# <tX'pwM6z4rȀW.rtžn !h,Vz-9FR0,]A�@�"X --M&M*P@�@�@�@�@�@�@�U5A�@�@�@�@�@�@�@�@�4o;ҥKeoR@�bG`՚2e&L iL +'U.M&7)YL "� �!@NCґ(?]AYYYw|�.'/0o_Wʿm9G k_~EsUfff^ւ o>UVM]v)1cxYZr$J*CI~Mc-ZK/uAc%\<{:w0z/Ts135F|P?Y1B` � PfڴiT+,PbŊمm@�@�@�@�@�@�@�(�Z&@�@�@�@�@�@�@�@�@JJw%K,t�UNr-a#@\h\ٴM � �*Q[7KeClfdV\eK_HFY.Cu_֭[5g/8?kUu9;SSS]8a\h;KÆI^+M'M6z5bĈ2M7I͚IÇK+WJ/,U\&0^].M;.O9L:I7@�@�r.6##DZ999jEN@�@�@�@�@�@�@�H P+ҟA� � � � � � � � @ TZ՛sҥ14j� 0k,+J*@ <t Q;<� ��Z{J֭Ͳu_[X Q4ȷn]排wLF�ظq5{bKs^zJKKСC,[oڴivK\ qCܙ0>| K/դI\poryI|" ('7őh3,'뮓~)=]V r@�@ 2mzZC )vݫvя� � � � � � � @: @�@�@�@�@�@�@�@�J/%K!Z@�noY}QI&wA2ؿvޭ]vU={-vM-^վ}j:=\>k͚Nnu7Ez/MB\\9%$$B ^0wKLLtAI^u  � @awΓ Vu [8dxtqn[ڵkЬ̼˗{mܸ5b/D[njذa~!P&f zsc!~jӦ^|E{GY=W:LW/VhN]J_~)Ҹq@C%zI_@�@�쌌u־) � � � � � � �S@`js,@�@�@�@�@�@�@�@�(@͵tRC �!`rdϔ[zu˖-ڶmWo~7uǎڹseYE)4eTVaU/m.Bm :RpႶY͛P L??˖U0eK_qhA[UreUZUUT)TdVVe5d#(,A�@�Hp1ec,XiYV]WܩןS߬V˖݉9Hx=G X"/4ku5kxxY\sIԩSpw96t rbnN .RM<[" P޽wޑz,v!,kΒ.L5ӭr>O']F�@� kڴi%}omߍS@�@�@�@�@�@�@��TSc!� � � � � � � � @lϏ?� @ r3?^W\qt,iÆ Zn֯_M6iƍ,-P³Z M\,'(Tz`(m (y,X³li³BY̑֕5z0+֞={{n/X VY~凄YlլYSkVZ -n`Vmbv " � �&Z6+C,(xܹpy!Yg-w\ 3˻Њ}sY;_ g _`ɒ%^`g͜9Ӆ5}p ѣG{Yݺu>e�O?I.wQzu]QnS];:sW6sEIK/, P+5>D~i}w)j䍅#� �@-Nx8kQ*"� � � � � � �L@Q � � � � � � � �CyZti01@�B,p}i<yr{ X0֪Uf͚Cڵk, ںukdy[S&MxaidU^=/›,*ZK׮%)eΝϠ?̖o[.r) m۶ӞwV d~qJNN./7@�@�@+òYYra>9;ry:^ [gӱ ba*,8+33[q)B[nQ^xZuu8-|�GXΔ"M&wȡm۶.*@-;zR[5HIt啇{S >^.U:4ipS'' .2*@�@ ;wV啑Q@{z?� � � � � � � :#� � � � � � � � @X Y -V\ �X|x}^O@# رCf&+WU ѲtBHmڴQ~ԩ^vm۬\[bmذVZ蚅͟?[nܸQ- &{oԨ,\_5k&mڴiTX"� @p,P+OQ;?fòliB}Nʲ@-zKBBo@%n@… , вjY>o^ݺu-tY8_>}l@ _r{R*1G3F'|u= m~$]u5K;E@ZDi(i`_#]nj2@�@ pj׮}E\% � � � � � � � P+� � � � � � � � �Ah޼wKSNA;.B�qPn)ل;4;﯋/-[ $%%‹h›ۂaG 6f &PB걊&׭[Yh?͖_xAnC,BVSSSjOp<:#� _B}:kYG?|hp֒%r9޺/(B_?8_L\VXk.߉@6N[ '`:j׮]:(ͥ > ϲϼF܊}Rbކ@ |oz]Ð>P^=1J9~yQ>^~RV{{nAZZz1¶(!.]'M.g � @IRFFFw@-� � � � � � � @0 6B�@�@�@�@�@�@�@�@�R 4kk&%PԜ4�3W~m%$$eýS6lЂ ~hDV*WY0Q>}te~ZZj0_s3÷w~pI|r/dt w?p+11QǹT Zj۶me599s' �Įj9g]Ѝ/0,YS<us1V08.`?OZv3;wB*oپ}"OZe\!P+_E۶Ig!--_[oՈ#R5o<h \#կ/ &]+{iρ@` mK' }4n  � @ X믿.5..Ƚ@噦`l� � � � � � � # � � � � � � � � @Tn]oR` �O&ouꩧs ށ#H[n&Eh͟?_7nFdY[VK7!C>  6[}7;m܃oZJh"oiӦMn 5jvycǎڡC%@�bWsB\;gӒuBԮ ̲=-4F 6oŊK%k.}^xٳ?]WRE]vU޽u7zYl%-e?5-�عS:ln_T@ СC5~xC=yI4p5ew䅔t ?{I.}RƑ>2� �V --M\°}ڪU"7NV@�@�@�@�@�@�@ j@�@�@�@�@�@�@�@�@ 8͛7'P+8>sz5X›|;33Ss&p3[0P5x`iF6wc7kQf{k'\hӒ%KpBYՙ3gꩧN7v||ZhΝ;{DrݺusA.邂� �Q/r9rчiY"/(,w:ul}aY'nYիx2!!?4;kemiC3IuoY>n83qM>XVCK aA|ǧORRw@|k0{ +A3%ηf̐8C:$_aJ%~ipk}ғOJ\á � @*T['Pk(j@�@�@�@�@�@�@�)7X � � � � � � � �  $ �a&`OO0|¡bl۶MfW_}oF6lPrԺukuE7t:vi5j(;G.;3,hw}=fٵ +M6=zgϞļYA�@�8\VN/4`X?Kv{2p:u JN+z1  lݺ ̲,>gX88PwuoYUСRFra>W\;S.䒠wОSj yJ!- ,ԩRRRȻF@�@� ص>; hذaEO@EV@�@�@�@�@�@�@ @jf@�@�@�@�@�@�@�@�@ xG @ (suwxtUVi^/4|yYcp[ON 'D|٤V=ܼqXܹse!vV{1;֛$O>:餓ZfͼXA�@�f_/\_p/0˂/ͪW/?(o_N_ЬU#k%mBB}N 7n heeey>_tE^piY8o Z.t{OuA1K<O'5! Բ!7j$K.T]K.,=2^^jk⥗~C-� �A%X}JA�@�@�@�@�@�@�@ jSc!� � � � � � � � @@5ke˖-A�߯ZjGʰ[l'|?^Hŋ={ /T޽eAZUca2ti+PZ5uiVeÆ ꫯ4c >q)pwꩧNl^  �?4B-l_/( βS� g?P}(Ă5k, βɥmb oM4B. jٵ  yu҇&*7y{0?X;K!p5׸3`m6M5䮹JCJK&yfa(ߋҥ]wO(C@�@�J!_~Y RKqTvE�@�@�@�@�@�@�@jߌ=@�@�@�@�@�@�@�@�@ ͛7͛cFB\px@ PcƌQjj@5v̛7Oy}ת\sSNQ.]*5:TN 8Ы摝 駲j[V,˶0`|� �e/wdI~P?4˖CeYXV~YGKmH?^}#XP6M֮] ӮOtM]wLKKSڵÞ6lS~қoѝwv|s%P п:ujYZ`[oIW]3%s76BƍO>GV_ؚ"z> @�Aq0Zb[jM@�@�@�@�@�@�@�*@V@9i @�@�@�@�@�@�@�@�!(Xt:vCr @�2@7|Sʗ?o _yꫲ[;wYgOz˄+O>^;k.}g{#<oQ:u҅^,� �%͕;-g Ͳ5mY-[²\ΥWݶZe??Rk>999l@VV?<˖7nT\\{8 ͺեlXի%<UB<vJB^9G1t]T6LeW|P<*Ty't!m p K~p)Ұar^톰[@�}]')jk(!0E�@�@�@�@�@�@�Y@�@�@�@�@�@�@�@�@ 5kuxٲejESGo@�CGL>ly晇<wXB>{97R/t[nѠAԸqH}F�$%%ya>fe…z7:kWUfͣC �ĮU4Z?thh֒%޽> D,{#fM`@ 6.uZޝK=+.zS=B$[=ҵ\oŵs%KD((EJsLuΜfy}i~=gΜ;{;w*V(_۫M6#Ľ8:0 S[ d몫zNXtEW_}V[o4G?g_}Uu-{*x> ^rj̙ c)NĉK{- "]z- � P^<תU+;V>w/LxKN C2 � � � � � � �%(@V b)@�@�@�@�@�@�@�@�(UjM6!%G� ._<y|tTG?bz9r:t#P]W!@p.(\mݦs9Gz ;v,7( �3f$BYRI,Y_AY!Rn5RtiTRE{i} P$t{<Yɛó.\J*iY>wV֭0ܲ~xhjW*K\p-.ך;47Xz4h_O0U5 ;'XZ C2tDR]w)-&< Ԭ)=tQ7/O + �w; AVaX@�@�@�@�@�@�@*)I� � � � � � � � �*иqcM6T@�JV`޼y2dN=Tmv%Rښ x?#kG}nhѢzn@ j9ϺwyGwyvuw%7@�%0_Ym/  YfDXVf9<NbX+ZZobZnV\r;35i˖-ӤIbp >;@kĉZx֪Uկ_xǞ_ZXx!ӤVs\uI9r$ZҔ>}o1aaVkK&͙#=NshT䓥ΝڶMګbp � ��@�IDATP:tBEʕ+ cܽO8`@�@�@�@�@�@�@`] _� � � � � � � � �pw}WuY @ 3 *_z饙ѡ"駟E]Bh @.첋|uM7e˖;@�\˥oMe9,˷dp֌~ lI9$r-cg 8_u&H>,>Fuj߾N8x@k@-T^SpX੧㏗.P!t󖇓箴s{_kŒBnҫJ$xs %m} 9sc}uE| p7^Iz� �Ep֢E*i*T(b,� � � � � � � @ MuQ!@�@�@�@�@�@�@�@�(MjM64wɾ@�JPPmnӕW^5kӿoCr m xJ}~{p8ȑ#k6İO}n2dچ*zsm[o߬YՙN… #Ģ˵j*Fkvӹ瞫ck;%Rzt5sΝ;k's)]=@�Z_ޓx LѣԼBhK"a!+R_~)_N<^X( ҉'J{YaZR뭷Lez+Wܹsc0ロ<y=JD o3=q6mk;sɓ'ֽޫO?TϏ"L+VzgZa6zaÆb^ل-G:HS#cog?{R):( :4~X"|P9{nݺq'ȸ#zM+ }~%㺘of͚[B:_ﲥ ĿI&q]U&=tMKݻ+wk� �d@˖-UJ.E h+WK8Zj~5O~< .;|7}ᇺյkW]uU_-X c?>}cO?](>Y@�@�@�@�@�@�@ }jϖ-#� � � � � � � � @5jDV}4 n:+oҽ>CWB9M>V\Ӄ>S`'#8Ʌ'LST+yޮ?eʔBu!_歾 [/]4esCQ۫t"vm;u{XAa7p>s|]M@�pMԯNa_M]R:N;%)FP8;LH!ҿӥO.3B*Vw<%.;o<9̹ٳg|n0 Qt7К^BNCK/cq7 x|qpwPm;|pmv!pٲeg6OFRܸYA4mT[n?cƌ !Kojw^z7lrݔYL?\# gZ z)d[?i=\?1_C›bi>6mZ<қs鉠O>)}'@�@NP-%Cݹ0nik:~~ŋǀչs8Ftǿy9zNҗ/_={[n!퇅AN:Iߓ@�@�@�@�@�@�@ ʲ"� � � � � � � � @Bqƚ9s@C�.ݸোhgS1lp:#t'Tݺu Ġv s;Urw1Ǩu֫,׃_]]v*O6ox#[伞930qgȻƢlI sxgZsoSޟ4@�!,>{L2D[pF�nZ-[J\ LP_!|T!EroDC++Won>G˭կ_?a^3g|su\֨Q#\uU5k>7 ^u/JHr,ѹXov1j;?6&$P~(~f gR!rԽgt ۫_{?/KhѢE Ilu xYk׮1ϟ��T!T[e)flKStH'}<xp 8p`FN9HK *:HO=U<� �d@4nܸB@ڵ㲾nrPՄ0Xﯱ~깫ziƌr ԤI./JsX}W]v:t)ǫ_e,� � � � � � � Zw@�@�@�@�@�@�@�@�BZ.w߭VX@/_3<S={^{Uڻ/倞gy&{Cv oEm믿60a]ӦM !}bŊm6/I&5s?9?'~Yyol ~_]}:th {i �S 7 P^!3B)$B=Vzis頃{Q(~*͛'wHX7 *]ZUTcpniB*[~ ʐñF=6zj"쳏n&-X j=q,oeHcʲeTN \R?|N\Lmܹ!H&ZaFSzD0Rah嗜Y=#G Sso"u+oܠ}Q6KjepLnc\W|-mr)k&g8\t¹p]G�@�CRmw+Wѣի{Ur;wzir( 'ի0{/~כD>>{Co.&ۀdQr� � � � � � � _O�@�@�@�@�@�@�@�@�(PZn.Ѵig@�;7襗^ʌg։'`*Ī_BX믿>arA-B&Mhذa(pnt+Ywߕ'9e!4P[nE=^|E5h N̕g\tqjժcP}"|~ڶm+^뭷^zRE]]0AH._B{@'R)l88YxAi /zJ7xc(^{: 2D;C:WZcƌѣ>?<ָqB}tbhSL dQG\Ag}O_'xBW\ ?ϸ =` 1"͊=! Bl9묳b_O?4cJ !�)rR˜4yrgMӶjԐ57WMq8uQ.Yy'ʷ.]T.~sZAK7 A8@áMnpQfO:142- iuE긹|͵;ǎ3Y)@P 7 *RJ^ERs!? bAv-_<w}umvI[^%]2B^]3rgbjsHz'y<i;E63wy睧B!e]뮻.3V ?XYx뭷BXH m 7ԕW^Z'|ro޽շo8c0F9Y{{u|~ă5i+O@�@ :t}o.߻RF>>O<wf͚~Gs: ۪UUNA|Fw_7{K/4F�0Lz?>]Aq-|-[!]<@�@�@�@�@�@�@�Xy� � � � � � � � � P :ujժ1P  :_]gqF(gIs\q3y䑱@+uS?k储~ \.bvi\j]wEV=C%/">wE_XȖCN8"8sαE]3f�dTݻwW>}bM74WW:Uą]|Ae.[.0daۿo:c\X֡Ys־]\�N%j{ ~o#awYH{ꫯu_~aS<b>f7x#\̯ zWkc۴i'{o,6-u]/Jc@ Bp~p*S"(SQ9Z2Wit r4UU߇ҶٯxJ*0^ͫ|^1?s|?_8X׏=8Sꫯ0KV齶+C9sԺu뜝:n8qbp!i7~f#dKB0"h⟃N:ϯرc|w8Ųe<mw`\lc78Iq*94<[K/I](QJ/\:-h.qF)&D}dpyW^1(kwŋ㲹E{!\7o^8Lz<>:t*5f #2벅xmk0Te7 � P؎ xX‰'%K׻uw}|}zI594[r]wŐWW/v_MyLȑ<yr>@�@�@�@�@�@�@� � � � � � � � � @17nJQblU@�JQ9.lj~ \rvŤ~m9ɭK@&7'蔅Zh>() @]l{?�wVc= T]bEN\ũ\8؅\jԨQq~aq{졁~:K./\]sU6'J 9ٲe5y[n%p.³*s8C>U믿Ev]xPRnC|I>UV~XW]uxw %uJkР6d9&ϟI&o EChۆù9V/ƶO6j֬CC�(?jw2PC1zs`WysC +T{/5}Btm Ҟ{*+?vk{뭷[(`ҥ9ym\>癟.kZ>goҤI94w|&/O|a٬Y{޽s=ػ;19眓<?9Ld{EJ9ֹxzy o߾ɇ:餓b�N clvh.uu -!СCխ[7%3C΄۠gt:[q=/2+z|տӓc&L<瀬pSL<^8ax._a]mQY},31ko1~} ?6PUXa � @ TT)s;|皩c 7$x-sկRw?LJ@s=sY|gjذa\"n?I󶦇 SO=5~.Ŀ+TSc@�@�@�@�@�@�@` $=@�@�@�@�@�@�@�@�@�,ШQ#}wE^@�J_ō\{Uj?u AyjbT.b+O<CPI 98tXHjp zݻ]v1ǯlɂSI6t曱Ⱦ j ,г>+dwaW7wmֱXUо||BĞNy%֭[lցY. cK}'s K6mڴY̯_s`N3Ϩ9.B_gdᲔzr-p5Z6{~_pÇW^vY~oGC� ˥/T8R(�bE"*4$=ӯ+@ …_v:pA˾ ǏVPk!C}u5h-?&R{,rqhʫ<dkOYX5jKcAv:v<>pAϘ]paQoQ_|q g׿#Lv.=c6NN~}8`E1X^Gv-)zNuKE=9^~nƬ ;F;wW_v]׽b � xcC5zLi b NPl&K 1+u2ׯスuomv9Sϋ-z[n9v 'v>?f+ @�@�@�@�@�@�@ cʘ � � � � � � � � @Q\KW!�dg qs1i﫳Bmk;nV촮 l."�&:c߮~ۭ*>?wxl_8@/RIO-Jsv7h?묳*cHn-ҕ\gm_?g\[?r7n(W_% &,p|mS:[t?%/\|> vW~r!) y>vS- ?4@�Rp}('8+5eyYqdpV!2JKHUy5ҥK;CV}ݔ Ç]8RJsgջwdqVp9t~ZLspP۶m˱^<D2c�i !MkwTê]v -P[ $l69E%9~vGko喚<yr z*8P_B>@(/w^ﵨt)>>9%\x8kرyv>19#{@kV;w{ssWWsNCg8s~j/'>6χtm#� �pC=Xy߃w9>!}te|.sڒ[xN8A7|ss49;'I=zjժ6,*y?Nmij0� � � � � � �d@ =A�@�@�@�@�@�@�@�@�&}Vbi@�RxkF"-KJb?|Z_K6\(SN8qeoFs1[M 0 Jm֬Yɍ6(~M3g\c~n3p6zܞΈy muAٕ!ïKIuͽ;l~qzVaÆiwaZ> /Pݺuw}> /X" 1DF@�" a {B@Uru}P_4Nlh#9\gCQ KiwMgL{gO_O}'v!/s7` ׿r'L+{7rhJU| tᇯ6dϛBfϖ_i-־g}4r<7vGʅ<ቂ<䰧gy3h!C[o.@袒XQ 3KzZovYk<n׮][3%KOPNdycSf7f]Rc)Kdxs'ˤSNxcw@�@� 8h'f nܸqk<.mל {ڼyCR3f詧!\<@ GN�շYfPy/[rs=\5~ti � � � � � � �%@VFt@�@�@�@�@�@�@�@�" ?"� }ٱx.R*{ln~dv&¹yKf%An{,Qw SnŠRwoƢSZҵ^+Jv[Izc1brds>x߽ û9--_<Q+dK:y9O6/ԍl;cڨQVرcvi%\'zM:u]~9sVIp0|p=裱[I-6$$4w9ES r6e%KmI/-X hȘWKImHlP59lplwYw{]wOT5/N?�o=N/DO8ᄸ|pYv*O@-H:$$;:\@ <u8rV&%w$]tH[sC\p܄ 7! 4E F,ui҃J *v(ck㋎<:O]4ir#bh7 UP|~c%5Fg%$+Eͦ@�@�5XA-,+uaOOrÉsQ] 3bĈy?TÆ c`| ;A^򘗛S{lq<,M?,_$[oK|GC�@�@�@�@�@�@�(23 � � � � � � � � PpAߟ(, @) z!T`z(:RvĎv"K7|\+ “, byWoSʁV3gСCb#r!*Ius>N'?o޼L6-N/9\ݡJᄏ.29Dhא<[ʅ ױywyꫯb1c~ 7/>nr{?}9Ǘۼ?y)9ǚ5k?gK}'z|gy&g.R8;gd9wrm}֚5kVܤzKeV>ժU{-r9rd|^˴柇 /0kϛJ-^҆ PsɧV8WQ86¯93aYl#0gV(**_7wtqRǎRժeߋ#,UB*'!"5ѣCHm5P֭gQYc /uS'M . ޺; n_7%9SkF�Ȑ�IC BMvz4aե+كpo|/�Oı-[g̶vRFKG%-_^2GPq{8cr\2y%%9߻~;Էo_tM myiըQC7qȖ_ª*ϟk̺c9ʰK}aIw@�@ xcM>;栬կ__t瞜s՗O}+g{c?v_9~w.K`- r)9sO暜y%;. o ?8Ȑ!Rsc@�@�@�@�@�@�@ 3όn @�@�@�@�@�@�@�@�@.+X@ &+uiYkՒ֕>TXhk9BK.`"毾n iib:3 )M^w\ 64r葋]GyDzTSL߸UլY3y_n.4 :u-}bq*:tWV})u]C 6(` Fswq_{?ڎ9=cqɓ'uxԢE pq㢡 Io@pd0曪TR"%2 5ׯ_|8?֨QT+n0 C.(".<ci6>}sؙ6F_u r[oz_g2PAd۷/n_7 %jC ul>@NC�E`B5H~>CB]X<WJ /4ʅhOK ?^}QB[vmmV]tE]X P!Wv~/&XxQAq |ooӦMN8[2d~ځ20O_H}gsƝz^zI Cd1l[!st[At?Mӽ:K '<qN;-zL㬾9㱛o_#Ң܇+zQ^j޼yG3cssXF<ޛߘuAcn:c~x"dj0):@�@�wN;y幈8�͝;7ýyerc3<0.C>oԩS-:'cewL2 |v_coq� � � � � � � 1Z � � � � � � � � e.v pЂ2\p΁+R˖?Yv#^ޟyv'x^yX�7;Gjݿ>ƢNKbq*%QA cӧr CycǎC\kь3B86,-[o 7Ox[,ȵ[Zj޾�V5y٦nZmԊ~MB"]֭O?+L(E? i!(uWP6l Y=.SNfmQx>9shС1ρt_},V&^u(v,͚%mIIo!�%Nb`C&NLL;*Fİw&^<(M빂dlkDaͅ8M\ظI&,˔SG$|׮!u]@ 9!;{ l4MuY'NXy G!LrS00Y2GR8]ncݳ_c8cE tTT)ggcL24f`I'WGK]*I=GVis=W%5WVo)d^!#| O@%I}uꩧXFU+PNz3g EOoXȬ:x� � � � � @6 g@| #/� � � � � � � � �[p8h �%bJw~R IO E O}f>4b=Ӻ袋t76kիWo5FM-˷4s9G}K٫+ֲm9[H r\4f9q_ՃrܭsQ[aňk׮<^8ڵ{17O]V0AmZJ:#] nw 2yַfʹ #�'2AC_Y[ȓ-]Ь}֭ӥ/qNt:cҥYe𵒃 r諛edV s@a\(:8uSeL8t0D`Q1. }(_Fc5D%Kh뭷V^ԯ_pNJ#L~ΔN(m}$[ oLrVAm#q„iywaƬKj8Hs{5pKåRSO6 � Pr:tŋgjŊcVaZsW76lذ0(pHRW[nC@�@�@�@�@�@�@�2P?.!� � � � � � � � @@VX(-cǎ딂uкwOj=4hPz:"=z#<kVW\q>谿AjѢEzvZ̭PئըQC\pAwQj]vUf݆n~2I K0׵~Ur/,LJrZWMmyy- >P!tkYZ(件�+0~",+5q4iB�BviYwVI\z@ TRE �!qH`ym>7Of%aqhzW*VX!}79MݵCn!)^pp,{ 6@7p:9-i-!"%L":5m4:RywqYK뉷J'RQkJkf-D;^3\Բ,i["`K騣sXtn"� @5XZ8Nヹn$ fzLw4@�@�@�@�@�@�@� P+3^z� � � � � � � � �p_̵Y @ y5f̘X05(hl(\y҉'*-h=Q1#F[oӯ_?qjmr≮^{M{l �-imvB{^M. ]܅ǎ{:{)"a]i]7(괋?*>裚6m E9#�)0{BP_㥯CSGrq=8#1ݼTRf B [*d_UvX|GsB- . њ9sfjbhiI|.[T4JX`ƌZreDQI'#CaJz!tam:|]vэ7޸ŘpBUZkU&O t iC;@-R͚I!7]{-L6[5.dX;찃&:-9;K/(u0+ya�]E�@�r)a`Yrk ܹs =>6aCb裏ΆG@�@�@�@�@�@�@\U.^f@�@�@�@�@�@�@�@�+РA= G�d%Ktꨣ*ܘB7b^j}vnKܼBe8 [nAV={T=[*Y*yPc99}K 6 9} |zgsOpB߾}UvR?~6߼w@�GDx)Ux R۶upO>YGH:94+5@Ac*TжnC;x6|0ըQ<q(P~,%id.Dq=#0i$h"gzh r1llD!4]gP6ץ-9|'pꩧHieG`=֕αq$ � Pv:tǼ:B_x @�@�@�@�@�@�@� P � � � � � � � �EaÆi6E�( 7ܠYfꫯ.%6H_,]ziF!Cě?䓺u駫u9[;wyDPSiEG.5/^zW4b}WataWӦMO.m:;G� Hg9@kD֌R,V[% J;H˅i @:V\)Sd7xּyuA}jӦVM@tʎ'|v)瀺w(ys19u-FI]H*Rfw_ 6@n/ٓNʺC � P<u0[b*Vo/_|f � � � � � � � Ntm#� � � � � � � � @ph̙3l2UT{��KC.ޒ-\ j5KWŧ|k/^|Ew VsO^{ J ,oƌk֭4iRkgϺ3 ³ZI:ĽójȔ(k.gg9@k„ Zh*W-[?<; .x@`] .pB0t7$8:pV^=I=Se"P& cDҁJ&0ΛsyNGw̙ZjOd@~ԩҩJ%y$@�ʃaqUVk2Zk0@�@�@�@�@�@�@*dv� � � � � � � � �pʕ+ƍoGl@@iխ[7  iZtVǎRϞ VRȱZ'ŧ| :^]w +ԩvyx:]ZuWv� ̚5K=zt}rw3p6试2hʁZᔙ�_~ƎMǧ|szIg"Pn|駟q?XK,!Y;C ߿wCh �rLȦ嗧o?ly|?~Z5]w!D͛7/疍\zSΝw?UbE=0`@ lV \r7Rfo.h-+N#� @ hBna\*?p0= @�@�@�@�@�@�@� P4 � � � � � � � �ܾIj8/D� -GѓO>zRXpEL[o?嗥5KaVZիWy~!|[F]vYXOm]o:t\̊�p^1F��@�IDAT1 &͟mSN믯mYsN]vz:Q[]Hr %ʦ@ O QCPC?6o'۷W(xX+ŋaY}QN֤Ib(jՐ`wQ RԼyxV;ee@�" rtҍ7iUǫJ*ljw^ jVFZ8K/Iv`{}pժUS׮]5l0fgG6M3qÉYo � @=h֭p.VkZljsy� � � � � � � @zJ/[G�@�@�@�@�@�@�@�@�4 lfh �F?c̡n:Q^[RWҳJlSJt ԧOxnۘ1c䀭YfbŊ1d>.*o[lE)]!6|1lE7ăkԨQ~N9u)-dc p_(9 Y5 9?Vez ?q2AUn-!� .ĉcdɓ|rU^]ڵӞ{>;N;B `@}W:`y鮻Jy{.Οj֬}GO=T 10=qI(=Gǃ?p͘1#\G )ZpP騣kWB�@�2 yjdɒܞb � � � � � � �iX/PӶ6� � � � � � � � �Gp"BVz|* P<)|gl4 u5zԳg"GnJcEG5~[rms!ZrϭޚVZjٲe5kL͛7Ե:ܗC+VCʋ|4iR-Z()ljݺ C\0nM6)ZS&I2q8#A/+8!Z!PK*H]:TQ_u"@p𰯅E/BJծ];pK*o L |tǠR.ϲ-sk{֠A`UV-Ev{La)0=r?CFmN;bn x1iCd!q� � PCW`   � � � � � � �($� � � � � � � � �d@Æ sEH= }?|jӦM@CN>9pUWIT7ܹs'?~i,:{LժU]HkڴfxtMs,GHz>}*7Kx^ZhN:OTVb R: ũr\ F~6fR8P ,K9<ˁdwU` /,f%ܯ^z1W^7n  @ |ԥ㎒C<D+cǎW<鱙_|Q}mWBRK}yHl1l0OYϽoN?]Yr @�$-^X vaUREK,Ye@�@�@�@�@�@�@�H�jna� � � � � � � � �ihР~ᇴ �)p5h:tOfPI'[ȑehV͚5뮻[bfɓ/C˖-:lk-V[m=ݤI5j(8@84a̙4mڴx{ېԩSsB\qnw7o.ߪWGS]Lt@ .&LX5@˟n!3\ye"<٩բ!�%-sdhV2@}nEm.֎:xiϣ!�d_'d5}V x:t k׮[O=T A;x;$N wܚ}BVnxk9"%/}i � @h"nqƭ|1# � � � � � � �e^@2s � � � � � � � �}j[e@9B@ ns+Цna+;#G;J\"]|~ ۺuʷݜVXÇFסGJ?̙6lõEmM6 aCuX{ ӧO_T9N|&׾} [{GyO&~\z k̘nw)ԳWǎ 5RNiϣ!�%-sdh zqN8<xYflvѯ}qHˉl?&| oٲe [z,Xjժ\?cրP-*}Wjuy>tNiOW/!!� @ Hu1Pc]8D%K2 � � � � � � �[ wt}@�@�@�@�@�@�@�@�t'8� P.]1K[oH*]xC%Zf!+C\vڴi #Oགྷ^߷Ų\X^zlʹ{OoJN;|B yeL`ٲe={~5n3fO?佗[reo?W8Ӎ5.L+<p˲=Ec+@+dR%˜EO;-qߴi;~ֽԩScd}�T_84k18YI[/=@�JX |k・p#Kxl.#նmp.>h={I'c_T߾}Xl̾ jU�1ߤslԫW/ 6@XOwW: C=r` � 7n=w .\c>3@�@�@�@�@�@�@�H�Ze � � � � � � � � P*\/_\!�_w /raj"HP]rsQJ3pժUS˖--/1XˡH>s5*ɟ;w*pV͚5UN9\Zj)5jJPڃE!e3gz>믿7o*}t`�6h"{:y9]u*kbG~n@ 2 ci i-N6Awk�]B�?W_ɁY. 򹣯nu{lpޗ/7G� -~ h}^S*,:vQxhSO@-CFqh_v_<} !Kjʔ)g*ݺI+ (+e5@�Vj{Xba%K<f@�@�@�@�@�@�@�rLi(@�@�@�@�@�@�@�@�HV?5j}q@�]ꠃ*3$n+0]w4dCIlSfD$;份=k>5t)kĉ9!M ,*U\t[woo^_ovp c8W*U⽋es .]o.b-^X[ 7['�佋 H:6%||[*EV&#~kLVzt*^?Prxֻ&B¯8rkԹ԰/=@�#A&C5a„x{kN|p+n֭[jժe#A�(@v+tKo-mYVc2 lٲyꩧx4{8z;4) O 0|kM~F6Ӱa3p|A曥#K.@�@ 3<?3j*Sn@&@�@�@�@�@�@�@�JI@Rf7 � � � � � � � � >Ǎj-#�9>>X4=gfX1>ѵtR6 7$C,pPC/}+lsPiyΜ9 vZޡO03~W_OR:Cֈ$堩´[/T77x:p t)o'n#1/_<{:C\ط}Ki18,5X%d`SZe_'h PNMg9<˷p*~g(Mf]tQ>d؄_e9CZrxϕ[lCCN @pPAI}'0P=O81q <={ꤓNK/$O6`@"Tc[n<xaU�c@={ � Zh<>@�@�@�@�@�@�@�'@V{9b@�@�@�@�@�@�@�@�ʜoM>�d tQHlp>ӺWbiJˤSN^xA>iJll(TթS'ryzY~+?KW]%w ê .\˷dPUjxUrAy^9�+5,M}r rd(W>5kPd!`.`'7pC�-<Mo2?㫯:Eȴ+& "rCpͪZ?(m+{"�sgal9*�.O>$'8˅s>tXVwq{i|� @e9Dw[RӦ2]{=իWO[ne[vmz'MQ<21f0T;8zrxiҕ |K&vY8"@�]SnZcǎU'}o!� � � � � � � Pj6B�@�@�@�@�@�@�@�@�f!~H( _CC.f)׆?]Bx}ԫW=,;,yԤI",Z9jժ<@|Bj̕0JYPs^G'BB`#խ+94k`iBm4df'NJx֤IoC:SBpռyaAw@�2L dP9'2t}p.d zSO=U ,Pj V/[UHw}uM4l0-tmRǎO$>? " !� �iXqVكs_h*x� � � � � � � @J0G�@�@�@�@�@�@�@�@�RhРZ"N@< |Ynf]]vpń YgI׺VFrCQ:st /Kg-]yelFu _}%mMt. *!Mro_|!vȫ;KotUy�K`…zfB,Gɓ'kEH=.jڶm[{ڵkm6rV(־X @ <c#7ʧ{!-O.S't^|E۷땅w^ 1Tw5|p]s5e8B s4dH"\m}BE@�@ zaŊ6xcy� � � � � � � @i 'u;@�@�@�@�@�@�@�@�@ m'P+mlHs9!e 4ܑQEN ZL<>rGNg%o):;G թSFw!P..Ǝy'/Hm$u(Ν5 �i;wƏCƍK\RuԉY]vե^jh �)()"1^Y5m4N>ڵkk}ѓO>Y/'ƝwMzƌt)(tVȴգJg}@�zj-^X}ZjjժZhQ� � � � � � � ]jeEo@�@�@�@�@�@�@�@�@ jM0!g� o{91B_~[7i$Ӥ=V&Ff.L?t j[@Z�-బѣ9LˡZo.98Km*Sv%ٳg>(믿X^=m޽cpVvԸqt  @ wtSOIA+.0:\ U\Y:t(Ҿ;0 4HWՋnYXxW^vmUG P,<->Z:41XA!X @�"k 6иqV ZXb*VQ@�@�@�@�@�@�@�Vޭ.c@�@�@�@�@�@�@�@�JjYw:�d #qgWu%ӻթ#=BqzBȑ=$Ҿrߗ<ٻ p7b�J-! `b Y آ+ (!(|Y9�'&63gfk9{++}t18E͛% )U_ p.MhQyY+ժ%(q]@ N`͚5qYVB/_/Tͺ|g(P A�@ )|RzwƍrK e"VTZc4rHkK~+թBo}Igu*ݺ/j3a � i]Zs`)S&?;vd�nSƏ� � � � � � �D�Z7 � � � � � � � �&`WZuc� 8C "'NQK&ҥJɅO/(%Li7=ԫTR|)<(6@,] @a 3boӼyh^-e U>>\#GL"@ _qYeZƵŋ jժN@l2@ f:XҠAu8=jխ[aÆ1bDjͅJG 7WK_}%]p<: ,'P+Jv)@�@ 욣] 5B"� � � � � � �$�ZɩͶ@�@�@�@�@�@�@�@�@  ,={hÆ ʙ3gm@�Xؼyx =C:scm':TjBz\9_?ORV8DgΔ BR: x @(V찇NQ`.i <B~AڶMK.ڷ³. :Yвe|qZ -RR.ӊvчgYM@�!CN^7FRZ`3gM7ݤ{Gv=:{G4ns4qԠt_KYD̘C*rt'[@�@�k84iҸL~c;vH3 � � � � � � �Gu?"� � � � � � � � @d X+WQ#@ <~dݻwǰNSGUjZz}i@D_$bذ pa*V3VC BcDشI:U,[fϖoRҳ˅DƜ%Cd5}XxO?M'u*[N(,8y@(vӦԫWu <?b+_fӚF\8۽/twV":aT԰IٲE*W»_{@8 �$@յsN-\P*TP̙-D� � � � � � � @r \l@�@�@�@�@�@�@�@�T@ :t[t�Ċŋꫯ_Vceڧ=Ow+-H#W\JMYJni *m+=1cL".CK'jt@T G5iRp;~0r n3)H" XhͲPxֶm۔6mZw|դI[U?쳓h4t� @ #viu}[d L2EeʔQܹOk"\bTC5bĈ2@;/81j@3FʑhyQ u F* �D]̐!fϞXږ-[jL@�@�@�@�@�@�@  @�@�@�@�@�@�@�@�@ YfU̙jժ@�N&ЩS'-[օCsUy>E͗^xA[z]$+|J;RΝUW{=E� ,]*БuY XpY gM,-[&n#U&]ySR͚RΜ\@Lۧ ⲡsڝlkY7|x+FKC�@ Vj\n#q9)&ڵk&7X֭i&EzԹUd[,_ܬԱRa?\� �Q*}qb1z.@(L @�@�@�@�@�@�s|1<@�@�@�@�@�@�@�@�H@rʄ5@�+0f5JƍS4iO[ ]:G KK_O*PدGu E @ ,Y|$n@d <(͛'YpV(DkZ% vbE-={?BVLvg{RJ|h]w|Jg'4@�@`qc馛`BL!Q,dtڴijժ{kџ~옊&,jխ+.+wcصTF@w |@Vd1F� @ Mi-C ~ٲeKN!� � � � � � ��ZaK � � � � � � � �@PB:@_cǎHncrRh-PgrdR۶R2R׮RNVx괻[|ԧԹ3_b2غUoT @ Y\v͚gYԩv̞]UKz @Հt7:46�(sN͝;7.<ϟ/ Ȝ9*W5kc>D\rG~f � kRMbkYMk.ZRϠeɒEW]uFAV<błs] ԪS'ʗ/ ?H.S 4o./w>"yg � {J:es!P+:.@�@�@�@�@�@�@�"C@O@�@�@�@�@�@�@�@� `ZWN� p"jҥ9rVSK}Qo!\h)tE+vtYҔ)RQ49@ ,Y tG \vMow7^ =&`"Z`޽<yϚ={]h8BJ*XtóJ?VD� @,Ku%H¬ Lrƅ ROGߢE |.,oΝc…zPモעM.5h?t"hQipc2 @�"Sv!NzyQ#� � � � � � �-@VD>� � � � � � � � �,P y@�N_`ӦMѣ:t蠒%K~G(ZIi~RŊG/u.=Ԭ4x\񭨜*B \/p^X #$۶ISZVD|,e-arIOD͛}`֏?og fjȐ+W.uus"+[D;A�@T˥O?ҧ?X?V,Pvډ2kV݅O>DmڴI> պ2B֮ vҺzEˌcw͛K#FHO?@�RVB 0fϞMV � � � � � � �Ĭ�Z18 � � � � � � � �'?~^:&ƌ@�dٳ+VݺuKƭ֦ x@j^\9[rِQۖ/Z~I8P瞨*C E, ҥKaqX`Fȋʔp …xSt�Q*~zeE_CZm|dYsv!!W?UH(`Z �]DZWYgz"6<)SK }ٲPÇu Qw ϋ.\^ngI J<17(;%͛'~ "� @ s_4Dmݦlٲi˖-Q4C� � � � � � � jb| � � � � � � � � `.dڵ`AN:cE@�@`ѢE0`^ue͚$YS9S6L.LHR.RId~(%}\|2!CKJJЄj[oxĉ/SX1zQvm)oި2A�DPhV(@믿[(VVZ[oԑJB� �ZFj@ʞ]k)KP8~uVx|W:g7of͚ɎBmET'ҕW>jiH{לCqy.WrIcy{#� =vծZ#P+z+3A�@�@�@�@�@�@�"E@HS@�@�@�@�@�@�@�@�N*`Z\8 բIX8JSNPΣつHJ"4xpu}RIu~ǥ瞓Cz5쳓klXD.,$6ά#K`Jɂ&M n]w*K}Z9rDּ-$³hJt,+zDžgΝ;@�qfeA.%cI&0ѝq OʕKm\uUʜ9>#k.͓7>:LgczJ<3؂ Vz؛?3F�@�R> ZbEx Q � � � � � � �Ą�Z1$ � � � � � � � �! Zz5Z˙%$_-[ƏԩS'bt.],TԳtmAHB uVZf͒|Sj:FX^ j<z"W?, ѲߤtՃB^*ժ%esd ̲в~zrK�+DžgYaW �֭WH۶I'Ky^?*,PR;KĖ],mԨFA?,-j1 a!sgy,R,lݻ%� �$]{ݾ}/^\riΜ9=� � � � � � � jg � � � � � � � �D@VUF dWNԴiSթS'ɶC'ș3QzI{g 7k&p>ac[nr䐦O*V Q1_TTϕф hYV RR˖eI\"}vυ"@ <xPK\*f͞=OڼyҤIek=ݺu!Z+Wv|$%a  �"stʕAV±2sy&ҤIuLw!3[s~ui*RH"TeˉǿoRϞR'^gWa LkA'#C�@�O.^ 6l23@�@�@�@�@�@�@�Hv#b@ � � � � � � � � i *g͚UW>x  вe4jԨY*$ ,u,!h!+'u.YVa8h7$znI2Dʜ9<ʨFC[8;8+Β.Hj:в3L$pBeZXx}nVTɅ@�bW`^I1}ɒkOM`޼yڴi Lvɉ4ٳ?#<ȽGfwٿp]=VszJ }@�VӫB ]%P+Z4B�@�@�@�@�@�@�S@/ @�@�@�@�@�@�@�@�NS@Zji!�'qFS;vT%b gl8ÆI?.YHU˖R^OU7K'K"=@2<P)u@Q89veƖws%}IuH5jH" bX`߾}?fϞ5w\ڵK2dPŊ}h֭og{� �#Լ4}wy%vJtL0A9sE{FҥSӦM]qͺi XekApVppp?ʌ4bƊ� �&PZ5mK/۵gFNf> � � � � � � @ ;a!� � � � � � � � ϟ_; @ A=zpAյkJ)#`Ō]X僵hjR.|XչԩEC�XT*V,(gQ.pjkvZ)sffMm @zoAS0="ZG=e˖sb͋ βY{u{gRJ8{;ȵ �wH~+}\eʌFjYaTR%$Zl7|SK\xҥdةq7j,Zvn[lg^{-gɘM @�H9D?A6 6@)7 � � � � � � � 3j̮f � � � � � � � �Ć�Z%$ 4p@ 4HYdIN%Iʖ {Nz~ǎ}$1;<8RWO6Lʑ㘫 $/RaCl"&-0-n]wV-ԩ(ZnZ ޽[;vΝ;e=fˮ]~te~t ϥNZ4i|iB_dȐAgu2f}͔)n[9 ?zrǑCoG_^W^y=s |Cs̉ 5|W?\j׮ۻp*dm@�@ |_髯#;4izdõռyjz'l;qݺ-fJ_|]k "=?gm6X‡$lڴI7nT'<q8th㟻YXYnwؖs9̙S O> X;}HŊ@�H>jժi֭ھ}(Zgϖ@�@�@�@�@�@�@�X[w�G�@�@�@�@�@�@�@�@ ˧)SD٬ 4:uRŊժU�&Jo!%bpSACI %٦:vyz={ʅc=H Ԫ^=6&B?� 5k�-G \& ĉF$,Ȋ-[h͇->v"|d!W'kVB,XAVV=u c=ns82dxa\5"oÿpɚiY!w ײK֬YٲeSXw+n"қ]iF3g!cj{³fϞȥ~5*U/ף>óJ.MYi? @ <[ҧJ Dt`̝;ןԵ4$jv~q7�_璅cҰa~/-\P ,Я˗57 )cB쾝W.tfj?+~v~Vpa)Rڹyŋs}w̘AV? �)%p>;n>i � � � � � � �$�Zɀ&@�@�@�@�@�@�@�@�@ ϯիW' G7|'R2B `Ao_[7ץW_^xAЬԱtI3?6~]9Rڤ" ,]*hqjaZ+WIjIKV r Zv ,[o׭[6lCEY1P݆ ( 9sf( VlV>R9v鞻vvߊ[x݆BB!cCl,̖cW(\+W\ʝ;_w?o޼o[6\7}oC :VZl^%5jRjdEi � Y=zHKCJ]Ycg#0ޝPq tP-܅WEϟY+VLmECeJ+}]3Ȳh„qiʕSѢEUreneAWseg,`1dŊq](qk2es /P˂b#q馛bUSt��@�IDATy#� @J 1.^w%j` � � � � � � @l =["� � � � � � � � 3eɭг!�-~uI͚5ӥ^z <qvyD1BzEF KnAJ>q5ftA׬YRɒ/ l*#.}fp5nܿ!ZPR͚ZĘ.]$(JNvb2dЇB [S()t{9:u}W%fxC ޲- 4 ſ -Y$.B7 ;`->ag]j IY0`;>lnvj?`Y,]l_oY-[vNC�@�`޽!Cd=0a.$.wӎCN v[wv;6m?I;ªP߾M}"yfrt"b=V _~̙3Gpd;Ҿի/܇lER{YHگX@�H<jժiΜ9 � � � � � � � @rl@�@�@�@�@�@�@�@�MVݻNbp696�$k?C_u"H7"`Y,'J/,~ԡt}IEh_'B,N/^�+ti_R/EAxh}\m⋃ uNȕJ<C~w8d/_+VsPoz Q:l;_͛7d˖-nSXBmRvҬhhUV̂ fh-T˶ShQ[xq(QBvkn]Hw~}{fYVޚZn-+jIC�@�8PY_I^;Μ4i gslI8y>P멧JEVv.W_/رce!ݨOپJ*)ho_h[(q5?f̘)S7PϞ=9t]wAkQ&M-,4=\i2D�@�^j@�@�@�@�@�@�@�H.K � � � � � � � � @ϟog1QD-YPDի:vGa]&ٲr4h4dWA*v65>^|QjMj|+a)"}\A <BΕRWnQTf":tȇdY-/v³,Ztd!Y|decv[P!eʔ)fCuɒ%rvCB!lW\ ۏ?omkeR.%t:UP[[,tXa[o;`ן(L+4~0۔+WC"� @ R>RQ:IlvyfܔmѢ3g .HM6vC>#5ʟ֮]_oРTG4wQPbEOE|pؘ1cԶm[$la7M69QsL`˔^zIr,h � @ X֦MTBGC�@�@�@�@�@�@�@ 9'P � � � � � � � � pY8.={*}ڵktMW`A'',Xqc)o^U+ꑺ?ַ`.WTuwU@�@E-'UM,<˖3}΃,eKaE,h~? h…~_eɭe͚ՇY[ 2*R,0h@ƌ{Gjf2-[日ݖ~I~,ךYVrb7ވ :p6qce aZ �Q)APz.RnQ9E&ǏW<yty%˖U揁? _4p@켵Hۿ5iDsN)[ly衇m6,]vnAmڴES@]k47� �!Pre5l � � � � � � �!@Vr( @�@�@�@�@�@�@�@�H6s9Ŭ^:ٶɆ@�H+iK,Y"e،3,d禛4護ߖyFYS9 r!"R̙r!">=/ *Y2hWeַˤIrE ,05w\㏚3gњ?/@*U*DWԇթS4Sޏ%\rԦ7o, }[hQ2tPe+jj\͚5d< �D'l)w\00@- tJҽ-Do߾cXhvL'଩SPn.UV>, 7G~y <X^zʗ/m۪u;)<e\.)f � Mg}ʸ={h֭45� � � � � � � jah � � � � � � � � pzӚ5kNż bN:bŊdO%@xqwogOiwknU.AEj8ʔ) =<N"+c�-]Vʙ3_j@tZ w^O>}f̘! Zd<( _\jժ僳*T~gS̙C "gϮ //lELM& 5={Zbv5Y`W4it~V@�*Mo^y%dRP#'O샭s-ZГO>I.] Df}~[ ,pgkܸq>̎i y=&0`�kN}}ʘ1/r2dVA3T@�:Uj̙jEݞeB � � � � � � @ !� � � � � � � � i up Z`o4aN:.2tUm;HM}&O>YRF.eVO>ݟ .J:H_.U"<=mذASL g[Vܹu [G *RH$O#p\ e]+[Ns̉7o6nWbtR*U*K� �Q e9\fL)o߾]K+WN*U|ՁZFRΝxbN0dŎUqM ={ZO?ck.tGw#oK� @TTVM_|v) 㪨L@�@�@�@�@�@�bdG3M@�@�@�@�@�@�@�@�bI@X"`~ap GOY'6d&(9Լ4dg7,e0@ v,Fb( 8p@Bc!ZӦI?jז:+AEJ[lĉ5n8,X@iӦY5k;5jPѢEނ "p2<yaÆ~ k![e*]+łz  � .G۹СH,N ǑgBiٲIzW.],"?jjԨF)oO,XPE]{{k>x{NW2l@�Zm@�@�@�@�@�@�@�HJR@�@�@�@�@�@�@�@�@ E"f @8 0@˖-ӨQqx)L~Y:` ܥ\``˗K~(}gKW^lY�Wa2@ x:$o?&rPڼY*\X4r玌$(Ν q48ƥ\tE>(W^"q,9vۈ ٺ֥bm߾}駟4~xM0߾} VW_� �!x\f'rC1nF9e!)Zh{̅Rǫ)1A|@tawqwqi#`@T6mԮ];Y3B VJzA�@�NGrq/믿Ԋ � � � � � � @R N@�@�@�@�@�@�@�@�H)|i͚5)y�ƍիW/uA%J15bŤӥPHGBL+}mۤ; _jזyF7/|H5P,w쐾JpTLY۩k\giB |Sjْ0jإ#dE{=_B6'㛺u0|3H6Bkmڴ]RV[]z饲;݁ѣwȘD�@ F,zF2fQdwbZE_Ç'[iӦzձcGw}uaZI¤Ik_VZdAԊ=8@�^YTR~K- � � � � � � �I,:{@�@�@�@�@�@�@�@�@ Jvr6�a,`aZiӦU׮]x -%^jL.8Aʙɟ_jF¥aä%_*U GCe@ ,P+wn)sd 9Cҏ?a.I|κ(5n,|FZaRٲ'.f;w~a*TgBe˴`OW\qZ1`)!` VXwޚ1c+awLyw ; �R0lLt dԩڳgOjfKD矻jRu/BM>]ǏxKKZOgjժyb+yYE/ � S "*t@�@�@�@�@�@�@�R^@�@�@�@�@�@�@�@�@�Y o޼.cۗ= Y-ҀԧOe͚5h\`~ua%A[oIR5[6馛ߖ [ ] Xϗn9QCz k$@ f,PD~XL|:[n\MAY` dIzYRa1Ď;4h U\YUTE{C|;8^ŊKq2�bU Kk;_0տk]jI=3Xa �Ru KϞ=\F8MJ.un oч!}W)43߬F_r%ʔ)f͚ڵky`s=W?u]1cڔZѮoݚR[g � @ PjU<x@- � � � � � � �"@V0@�@�@�@�@�@�@�@�HN|СCsrnm!�&KJ*_pIaM+>T*t@K6H,U.}԰#\qXkWihi3&F�-g%N"=xYNA| >He!Z+zk-Z9= 詧RFh„ .>̙3r&H+߲eK9R;ܮ];>LUV0_ �$-5]c[MVRSu)6> Gq^t,ĩL28<m;]馛5'v_¬Y%!� �))`ZŋSrl@�@�@�@�@�@�@ FԊ4@�@�@�@�@�@�@�@�% Բƪ@�3f -~)uj}sڿ&]t\ e$z˖MjD0@.\AZBzMl kRJ++ggW>˚5r B fq.]ʕ% .vZ=*Q `^oի)r�a+`w:t/.Lu*Toba @4 !]}H8K.[\ٳU~ڵoS$5Xb5j2gIÏ&v]B7n%K-P>!20@� ԲM1" � � � � � � 3TG]D@�@�@�@�@�@�@�@�y.d \UN:BՋA|<iӤ/df_nb>noU2$ZN˥Y;+$+=Y*1GA_DC;Ô޽AQΝ…m;޽`B )|5kLRfgQҥ5o<}7>Pn 3v cDuї_~s|Vm۶@�@L쑻g̥cϴG^&L*77mO?=ٻۅ"p#5."PwyGJM7ݤ}ðClC[ � �&p9(GZŗfΆ@�@�@�@�@�@�@�X P+>sG�@�@�@�@�@�@�@�@ J2gάTR?+ Ut}ݸOtgӦMU/n:K͜9Sݺu5\:+4>n@ 6 .Q߾}cYS J^(M(ՒܹƍޣҤIcIٳKÇ[WuI?.}ra 2L6@DӵP:ڙ X8K_/j@ �e@iFi XeC /F0`?2e.UbUСC3fRJ2pVjٲZnJ?d+_,`;дB RrHl@�pyFil&l٨* #qƩRJʙ3an옰O>qqڑ߽Ol.]ꫯ|pL?sgS޼ySn ae;_h1waxݻտw5k&{?&Vː!FŋKnYJTV:C�@�8seק� � � � � � � @R � � � � � � � � �)&`ϖ.]iӦ~P<y/=~ׯ_Sj…~JΝ;o>رcu+K,z|xM͚5bŊ#=ωI7  ]J=Զm[*U*.rF;>\. 2M5>[][Q6Lxו+*u3ЈHT-Zʅ7\MѲ K- ء<`Tԥ& @~RÆRƌm/"]nliD'v1JE\뇝ׇ[6ѤIKܹoӦ?N2k,y睺+�!� @ <(^$/}up}$:#N `F?j m„ G=nߛM4?[o Q/L.kLk׮M+RnGu2oQzRn ae ۾ꪫ:ujw%y]x.4ޥF{'|R1ߋG~,Q}q{4ZzԞ=62ƃ� �&Pzu?=֦|@�@�@�@�@�@�@�Y@dgs � � � � � � � � <ٳg_ @"s 9*QZ1@+lg^c^wd[f/Z]R%_XbGm@ 6z'OƄ rNA(O\ sɓٲ m\T̺i@+-[!C0 ±`.ˑj}{WK&a$>JE֩Ю\)Դ39j3ej@p=#Q߾}e3["-Q<=έ@~Ϟ=ϴ^ZAv{d@}WZe?7yU>6mZ_K}3bk �սa#Gʅ׆ǸE ^ڇ$+P+[|m;nhԮ}Zډ{+$k] <[#FH+Rnvҥ ,$go殿|~}+?lGYxkvԩ*Wa'km.]Ѝ@�@�[ܹsSrl@�@�@�@�@�@�@ Ԋ@�@�@�@�@�@�@�@�EyB±/… qƲ tK׮]5~xY!<y۴i瞸f [S)} ; VW_ՓO>lFDiݻ.IHÆIOsd(U&q\U髯eˤ;rfΔ]µ=W:,HN;}W8QOq!uڱ{d$Bн{g >G.^x!rig(0}~o�j|y{o;NЋҙ&Ml!V`!.M4k&w-u4&ruɮ쀔� �g$бd2\a~Fb*U{#[Ϛ5fZ; N j軷}Yb_&Mdaކ¼dɒ>dڵk} p!@Ok޼gP;.]&97oBBI[YװSr/m@�0/CL2@�@�@�@�@�@�@�Tt.IA � � � � � � � � @ -ZԇZY2e Yatҹ;K/_~ʞ="֒9\lSO=:DFXbG QDO<D\Ar 粂y~5jP֭*Yf̘7xC-R ԴiS5h?? @ΝUti{`ĸƍҵƌ.4A,,șn"WW :UZ\1kQ@e[X`͝[J*X ޯ2pǺu_k7KJ!{v_!dI,xo<,8)w*}~iέ2g,;w۷⧟~p+Ç?pSu+>M6|ݛ+駟?\_~?ǴP|p}?}%Jwk϶Dxby\Yջ.!K;|uw:c]j~xB{<S+_%=f͚yGnl̙7ծ];]r%mv{iر{a+䇽.AϮXO9۾<~a\OWRkV\RֆbEV.]ąnz߶]<f͚q+玽oׯ_N:n-av}a6Tm=nS}>k۶=ɒ%K -#� ?.wL"w"a)?*KP~9\dȑZd_ӊ+W^yGI'O-[ꪫvСC\wI6S=G1ƍunhoޏsڴi>Xʾ +R+;7|S_~şk:ބ ,([7;߫VZ\=wws);_s5;g/[,L-۹۵pim 1@�U;FnܹJ@�@�@�@�@�@�@�I@df3 � � � � � � � � {y|jmt,h YAn+lQFPͶP16+ +? nX9r^x/nWOBprBjrY?V/(9 b[` `�Z XWH;wJ.] ˖parg0N[HeЂeVĵ 䊽mǿCW_@ BbﳫQeL~eI={AZ.s 6e-*-⃋vk|�jY�UNd\–,,Ɋ\ TTyz-liҤ,X ;u۵pB�coPۮY0VL|m x6 j?/bk۶mPYj}!)ohYHM~> :<xor|AtseaeJ6x`5l@-s袋v=aXfYfM >su� kf裏>mذs5{V=eٓ'Oq}'cYF7tu}_uM+3gNM>݅I\w^l!\zj_>A&J:t??d*A�@ za\6; y1k|kA߿YlnHo:lHv_^=\x߽L{3;fb[lI19G;:],PY~ܹ?mѢ?~6lytcЫW/+le/X[>}X-?VZdeFC�@�R\{ � � � � � � �I):);o@�@�@�@�@�@�@�@�@ ,*.fϬ/^\7|_X1_|РAgBdɢTRB5 :VB[uB?V8"ViӦxw(\hkʕ+C;TZ1cF=#!@l <x&= XŮupmBJȻyvrARrXW^ T >v \ ,b ez$WOVm1h *W|l=$;ˠ_WVז@12rCr%yj=r -&J[:={֬!ٹ5;n.sk;<oveaOVBثc`pB7n?؇pٹI w|jcٳ,ڱaw?Z8UH_a!_d͊[֬8nYK㚝;[S(,?xNdj}_Wf˕1=glƍee߿1>CVlB�XY=Q ++W̙,B-L-;W_}勽[?P(u<vX_>f ]c+?fu@C�@�Sx5e;O@bXk}gu7;Q?ϰ�&;FZg1}vX -µ{n{b:7s~p뭷u>d†-X>oCshyiY4 ѥZ5/Ϛ5˟{[3~z!Cu%?mt ew=:@�@ J,͛7'^� � � � � � � 1O � � � � � � � � V܊ϛ7hӦ/6ePZɊu'eϞ]7nԡC[}? , Zv.]IH_Æ uƽkі-[di />+h+0m4 %d*,n~B\_VBpA&늹z*P@Cb@pPm@-3hvE%WY >T &z4eޭxu3e{йVl܎_/o!M-5/BaGe˖ =$ ={qOGYU^u]wTTh֍mBle!OV|q[)`|\01 鲐'k'NLC/?~C@ڵkXMs=}hZ?lٲ&֊[xgC|:`l ۷/To`]8zđ3 �D˭Q۶rCEmXl,YW_Bsš,~>dɎ4hp-[5<g}ϸLQvgy /!|4~+}H.K XtԩUz'辅~wq'3<nݺϽZhaÆ.H](uw{>؂{Xiطc D�@�0?)_fўa( � � � � � � @t � � � � � � � � �D@(PkΜ9ǜYVVZq$ȷ U߶m[kNg+GEW^OH_?_=(iE v,lς,%)bR믥f J#FXFL2ؤ-+uAo֊pY׌G+wXԼyJ㨥X1)gm]?ur2p}iY=eqtURQ9Tjմn:*SLXz-Yu;0-+~뭷p%JovɈӧZ!ʕ+UNҤIs5~y> 7jȽ ?<΅{qƩcǎPVsdGGjz?{w/sqm߷{J")%IӢTJI(ZE_H{*k+IQ(d";| ^;3uw99sΙq?g9vaÆލ-[[̵.`ַt…?v]믿ԥK>I>?fs> J*Lm5L @�@ R>@.LTG;RzM?Q`jܸrpZp!om>xY�S\\l~8f̘\3<SF t*Alf; -}RWOfrˊ+>t0]e`\sihal̰rJ-Z5 ѠAU֍۷{A؁-X8 � @4 TR Em @�@�@�@�@�@�@�P#sL@�@�@�@�@�@�@�@�@ V^di+Um۶=Mm@hjo,5+=*_߯oY>zwjeEۭ}G \믿WD�,(SOy-@˚+m+ } aZ,ϖ.HYS2D"~+Y#WUz,;!ByFjNxqNZ5b=siBip֠o�6 Պ@-W– =ò4,LejTiViX (ǰb5j?C?_ ,pÝoQ|M^dw9#X?.Q7Ο~4iڷo6kV&Ldc %̍Kfw4=zDW,Z6;94+sN/,.qī]Ҿ۽cXjtMm܊s9GV>g,d,g+#X| !� @_}%D)y4`@۳ӦMSͽSXC{?r-8q�l{m^ba;v꫉w mkX`&[WҥK{P6' v;9JR)oj,K7lNjdɒjFa;} Nriy[ yyGf@�@�j>|ҥIJ@�@�@�@�@�@�@�!@V09 � � � � � � � �@ul%J$Ѭ�~뭷{؇LMm+h os Z@%b9;xVgСCw{Fr n{wM>]}=z, @GQlll<^xArY~7 .#CV~}kqv-3G�}˥ɓ^+~Q8пm5_ \^]|\gȽt)o;DC=/{Njɲ GV,dM}2~iZ�9 ;N*8~|2e\a5:;Л7mw7z!Dj֬)Ba?co^٢E xov,k,1 -%ӤkJCçF zꩲ"wv'/[R B}F[{~R1|Aヤǥ_ɓG=5sWzp4{~ؘ,P-ܚ<z]hpA�@ ,D؂tCît(K {;v ԲpWn;Jo=o.L ]8^S5.޾ fsf͚iܸqAZ0(;U>tmƌ ̧,D;T³6mꅲծ][իWwfsk^xa`UP/ UTI஠!� �Q"`w&jE0@�@�@�@�@�@�@�0pnMC�@�@�@�@�@�@�@�@�O 7o^%./keѬ؟Uå,^8.Go[!u+nׯ_ﭷ'MW_}+h+@ 70^ex��@�IDAT˲>Y_/5Ǻ曽.NJu]; @ݻp]we3b/dg$+ U W_$nY~ԣTjKRvmWtL>h\hV['YWf5+o?/ӨQ֭Ҕ)~\7,u€o~N @vְa]& `f`6mRb;wnAY.ޏYߟYjk Tkqqqej05 Ȳ`*U(Dx}vo1c?BO9Ks.W^aSے3M 4,Æ ӓO>Ίloz5b5jțgV[o6-[z, /Te67O[oP}l[s܊[ȭzwJ*Po w5:My< !C燅S8q`DC�@�^jʶl3O߉{71PW-lͶϕ+ n,WYRs�+;ge}"_V\u=s]ll-9&LŋW^ު>.9TC=:G6 d95}٣@%K<݇An{ջ+{h � � Tt_@/Y$@�@�@�@�@�@�@� P$@�@�@�@�@�@�@�@�W [q+Jv-[ٳgku*ow\ȄKrjVf͚d6 %\mgh]Z7kVp²l[tz+Жܱ (ɓ'^z^ЗsV` @ |w{ݱ"%`4dYk6e ˲:W\/hi.e8ˊqbUڵn^|Qr/5ڷ/sEl (!9OY-j[wiSix?mL{lޗ˽gN>:zرz?Z@p *i!U\pnZwWjԨmgC |ҥYn fre˖< }[ykVh܂liíY(rjC,Eb|UWɊ֯q/v2ֶV܂, ={,M> A\Wyꫯ{L:n~O>sl,駟vg%9VKsͶ1tUxfms6 j)lnޱcGJPx "f{Vs[kso;clX�ٛo) 7n\&. ʗ/}jyg B{.=VX=h � R6R&߯߉{m֬Ya{7|Tm-NfDlj!^tQR؜N,ef3THN'6g92MyՂ tz /Лe,iv{ߍZ}jrɾk vR[P @�@ ys=W˗/O~#E�@�@�@�@�@�@�@$?;r+ � � � � � � � �YZ_ o޼9K;xTbV:5 w[괄TYq5 :3RsdIͱÇ",t5󼐏^A1Ȍ xoVu˿ o\ Q/t5!vFKH"W_\,�) k:u-.gƅ$zH.PN0!2>_f͒{-]t\ \n|… u 7ZCՕW^iyX�ԺutYg% Un]/(gƍC@-6״fǴ̶~Yq Sŋw;wLP\< Yz<.'֧d&r)fWX1&k8-\+-AZZP)_YV޽0Zp\xX?-`PZsϹ߷pwL=7/Ͻtwh6ݽ-3saA@�2I`RM9^<N@<{/l5_uoN./ɂ]/^J*ſ+Ӯۜ\r{} 'xR';G9AۜB6v|ˤ&kժU޶p{p,H;ܚjei­wsg3g_oz-:VZU/T2a-`<.;J@�@�@�@�@�RQo Q J`�Q%I� � � � � � � � �D@%\�DNPujGTӲX6.dmѣGkܹgi7,#j>AC h,$˖.]]>@r9-.\D__Bq*T~\SO͘s,7gg~ۺi(U+HA ! ֪R  @g|h Ʋ9>;Y^+}?杶Y w6mRPNN;n6q>'P$'ԧ~zMvܩShX(/l1xj*_0X|%Ӳ' [4+4B3=FgE_~/@eHG8  �&RR <0{�3fAܞZ˖-k'7snZ0\>{p j׮}O?)P陣QM=-HC8:sQ^Bu� �D@7ݶmD  � � � � � � @x£@�@�@�@�@�@�@�@�H);vh9r anذan!@0>}tM7f͚<4 cWL ) -qwZ //b?kl4{4s2W#e[_/D w4yeQ./{X+k -G4+ݻwouU? Vkڵkphqqq^7֭[qrfRSNJ~+@_bdϑ/_d'#]۷o_(ۊWTRTѢEUZ5%~|Ov<!D2'6my?y^pW>] @�͚ɅH_}%(� #0M+Wd8z4hb^[Vzһqu Dڳgy #Fnݺj>0o²ǡaE#a 7jŊ^x줶g � /`Z~7կ__ɿ � � � � � � �Q@ br(@�@�@�@�@�@�@�@�/ ڲeשnݺWܛ.Lƍ Q9߶mݣO!++)M$W6'RKv+r-N7Jf[vKz-ZHIy$ljϬlE;g}]< CKUzlJW\Z߾} /oV=[܋J2e2Mc„ ^_V8¿(WɓG۷!Cr, <%\8>cB}]/n PsέҥK ʙ:5|u29`|ǎeAZ)e@8 �#`_]4o.YFĉ]!V6/ja꜠|Gյ^{-R^}u_r ˽>\:uJ^~6l( }R`@÷0-{g6 � k}u k@�@�@�@�@�@�@�#38( � � � � � � � � @ Xٳgȑ#9z�C`K/ygԻwoz8Diڪ.@`H JI\/6ۥi. iYV%\Y&cܰAArC,BҬ/J.U.+@N;4=szǽÆ B +z~{QMձ_.-67CB[Μl.rƌڳg (8m]Z-`.cN?tu]WDF�@ 3vZ[}Txfs#p}믿駟>X`OxfQ0t?\^XjN:Յ7CǍgdM4 jܸq&S"� �+={vuYZbE#� � � � � � �@C�@�@�@�@�@�@�@�@�NB :o޼$ @x WŊWMH\MO/xl 1 {Rv~ҟJ/,#  U$//}4~:=|Xڲ%!VvY= UCO?-BV?B5< 4|O:󼐭R.iӦ6TV 7K�K 5EI8,X0CaZ[/7xCW\qu'O+WzAieӇ �DR6֭Ҕ)˚!vSܓ3W\ĐΝ;{!IqEʕ+oBwԩ3giO[˗/W ,� � v Ӿ#{ � � � � � � � R& � � � � � � � � V $�  ,ЛogyFaZFdaZժ#KK7,-v4u_^r\@Ծ{Ҏ;prsŃ۳}?,$eQ#͞-_/!m+(hY[FzvZU^]=ʕ+*Ux'N>{@ ${GyDsJW^.3V~Z>袋-["� (ms)7naZeFh[$ X矯 Z|X6ם3gׯ&M_~ᅢ~P`^}2o<?B�@�H�Zb;@�@�@�@�@�@�@�5A�@�@�@�@�@�@�@�@�@CyZa:�$#pN:ԩS2[qW4-i#-]*M*U b 9rH JH?,#=_R׮{-_{Zr[#Pˬ~[,;ޕWJ_.[?N\ e{X/ݓKr2d֬Y?K/TŊSƍ裏ߓS 9ȺV~u۸7u`ռys͘1C6moK\ fܹ.#G�@$,'kJ.H{dwB(0%h"gݡ-K5jTN#.\X^z% < 4iRa g  |w{ѬYtg߄ � �i P+`l� � � � � � � &5M\l� � � � � � � � �$`ZֶlIݦ qƍ_^xAٲe;~VD]R~V*36F@R.~d7o|SruRRσ۱#@Xz~]XtRɒmI֯N[T)k;3QsOcǪf͚裏ԬY3)RDS=hՙiz@ lvl =Cb~6lNw_{5mܸ {ꩧ\fC4L �CuɅUJ&ȅ ,ZHe8;w ?.\( $hժ :R+V}mdw 0@r A@�@  o߾p*C�@�@�@�@�@�@�@g� � � � � � � � �JDvV,rʩڇ@�pԳgOo+hn?iYԩO#E@Ѣ~q+2{~{K/t/s玔Q[ǎM9~YO_\nj Lmzf͚3gz<( WS֭ڵkVZ:32˜LBϟ݋ܹs, Km\bFTtL''F�@ u Ə 3H<y7ԱnZŊswQ^"be˖՗_~-}@ŊձcG/ 8[N 믿=-<k׮ʞ={ � �I +W[zjk@�@�@�@�@�@�@�t N8vC�@�@�@�@�@�@�@�@�(^W͊H@�H6lVZ سG)ԩ@t5~ԵJ7(~e@yOlp\б-W΅ IW^) ,5n, N =a/宸 o8p 3glO>>լYS5jPժUŊ$I.g:=.] z/_3y睧;Cx'oʽ �S{Q>`<6B &MRӦM P?#+W.o^^j\.umڴرcտoz 箻R&M-[\&!`;xatg|qX� � @2eJي-@�@�@�@�@�@�@�.݌=@�@�@�@�@�@�@�@�@ Bg.+NV<`tرcq*+WYH˖IӧKiE('PeZk]M\p\Q\KeffZI^S&OCƍl;sz?HN,`@<y ݻwk駟3gjڻwW†,X|zvSN KBF ,K,ъ+t%(Zh=wUOjRڵ0�@�@ # &Ժu`'pAt ܹ7[hTmovQ:tG}!CYfPnV2#sxG^{M?x:T]vUܹmU@�@�` -ZTEC�@�@�@�@�@�@�@ j[!� � � � � � � � @X X-[U  Z'|RV<N.la-]s\ȇ7RJ6�@ .-/sJ#GJ=&u.W`X.$'; ۾]ru__H~*/$*$=Ԯt9AN@,XP 6@>+W_ŋeDSNuA}zA[<쳽Ŋ/_^gurz+Gq@P97?{o^`fmD,8˞{pepv @�C`�i@> R={7'jѢEJ5gQFi@F`>}xl… 9kCI&v%JDN˻vr}?}6^6ϿڽZ=4@�@�83f͚9gA�@�@�@�@�@�@�Rje"� � � � � � � � ,PkYo"^ K<x)a� :$u$͘!M"լy6A� ԭ+jXi=[xwH7x,pG{6lZ qҠA~iE9R $媫:z: 4Zz/_Y-c݋?x𠷭YarʩL2G[gK =.W0hݺu^qQ+0j*ٲ~dnjҵ^=_q,-gN$g �,0tԷ+R.S@BI& NxOݲ0;j_jժ>$e}v պuk5oܛ?؜7ҥKSdɓ'ņ]D � }BC�@�@�@�@�@�@�@ TE9 � � � � � � � �@llªOtH@^ݻwOlaa?K&HE�.a$?tM~r+\CR=HժQO+.kQ|"}w[QқoJ^b'ƮZ -[[Zl`!?K+iקOk ܲ-4lw{]/U,YuS0G=.pƍGM6yׯ_=g?,{NjdU h@P@�@ xC.Fr7?=Rʣuv r߹Q4h>][l._hܸq<xz-^iӦ袋T~}Q Ν;nsŋkΜ95kenC7iD/ڵk7G@�@�((]/_E#b( � � � � � � �"@V<@�@�@�@�@�@�@�@�B"+V̙3]X/3'3TΙu#Gn>PԨQf"}5l4p;~ֈRRR6Rl5n �- Z@rooնt\4fLd"ٳgg-7>nG/ 6xZe?S?}ɓGŋW%,V .KbTpaYhpݲh۶mG ²ve˖㖽{&HBYZ*Um{Yq@�x}[~=bH " lݺU?~VTIF@NԡCo/" E2e{;vU^=8_\rXQڵKK, jܹ7o7?�:u[n^؛Tg@�@�ϼN � � � � � � �Q)@|X � � � � � � � �.!�"`/~\\rIt~A=zm? B~h |5S8Q<XRbEo yqDk_#,H˲a]Rzyr|,kI@ L> I%vmڴ ڸqcp͛7{-[v4iΝeME9�-*R~[ ,(+X]|¼G/sqܹuÇ~oٷowiV{-$ b_^y+4oyg*TN9dɒGC̖� �YO`8{<덟G_6m4o]w>AL6O,[x ˗/ל9sž+}}(m!klacgy@ga6_<{f8XV^-zkvs=WkVNT~}UZ5e@�@ ,Pkݺu Ώ� � � � � � � jEʐ@�@�@�@�@�@�@�@�@;k @ 5J?={xiì.K"j ukYֲ>k~\�MZmfC>DTԮtUK62v¡uHY O<*S?xZ۶m.Ov~~@?TO  s'uGYK%9]Z0>Ν%W\ЭٳL|=V{>nE<bAZv_J [h?h,_Z/H,h � @r.HK]J/ܖ܇@ Lt`T$>l`}jʔ)3"!Qi6p*[nᆣ0%Kh^՚5k4|/ͧlnd͡lnd|6 8n߾ݛ]e˖U-Tre/묳: � @x X; @�@�@�@�@�@�@�` ,I� � � � � � � � �a)` ˇN!@ЧOW|Wd#^|Q!GBL*U#!C$ Bz Vq8 WsiVZ5[5Ϯ]r1oý VSNh\>xCzUݭO;ݶ$}lu.z`9^DV`%u ᲂ0Bgi_Yvbmɟ?@-vۊ@�@�P |tWBy.@(&Onݺrl i:%5*Kj;fղe6>lZvj +pis0|-8jA\=m 6 @�@ zN;4o06l P+zVF� � � � � � �9 � � � � � � � � ^p+nEh @8 -U}&vԯt]Q54@ *%=\4l5t3ګtꩡ˯ф GI_|!Y(VzRϞRvR ?˾qA2ߞ-@ :~Yi\=OH <@͑i � �'Kͥߖgq9 -xb/H)K(׹sg=^Ғ(T*UE�@�@ %Kzk7m{$|X� � � � � � � ~kv@�@�@�@�@�@�@�@�"@ P,<...zK@ + Xg\K/R^hQ#0cԱԭd4"E޽UcΒWZ>x}ܹS=ZD }{"rҚ5˽-LzGV#@$!}T#d C.L+G@�@�HpCjI~})gHEIThQR]{RǍcH � �d@w9qgF�@�@�@�@�@�@�JQ9*� � � � � � � � �+]#P#<".ҿ4,X m+]v+iؑM@ GZR4H#|yGi˖uc6魷/N9Eɂ^xAڰA>)]:}Ƿ,P+OϞ GHo-{d#FH3gJիGF% � 6l\XQSfg1YVӦMB8%KYf5jT41!� � iٳgW%iӦL'F�@�@�@�@�@�@�NqeT � � � � � � � � @llwm@�0XhF(aKVU֭Γ?Ւ!@ X]w 3F:,_?鯿RR˖ӬW%զm[)--4^_~.Hfkeˤne132@�@ ֮ôN?]K½FΝ;kڱcG!� � `پ !� � � � � � � D,? @�@�@�@�@�@�@�@�O &&T\\\u!� SիWW.]0z%RRҧJyDY@~^Z}J/k=B�+>tԸtT;Җ-Ҹq~Mb ;[GHu@ )!ծ-4wZTh~!� �YC7k&,(Me4 ̚5K{@v){dl � �d߼m۶ey9! � � � � � � @t 1:@�@�@�@�@�@�@�@�9sT"EDVV&0~W`?~e˖-|;JR-`W]%%M"*]H ~G4Hz 饗,꣏/Luk u0-kr�#0jt~֫J"1zH@�@�Hؾ]jB:|Xr)66RGBH(0i$UPAʕKxG*/s=Zݺu1@�@�2O@̳ � � � � � � @4 ͏.cC�@�@�@�@�@�@�@�@�O<@ \ <.r5i$\I(`XQ5K:4 v.U7,e. !5k&}_P=O6B�XXNi OK116� �D[̙RRQ:P%,Pe˖Yb:uRazYb @�@�P +VLWi8> � � � � � � @pKC�@�@�@�@�@�@�@�@�[ 66Vqqq=HF�)[oiKOxg#txF>@^Y�#o~yIK"mjh!z^Vfև˖-r<)$-{ԳTd׿^>0X� �d}KkHSHed|8#شi,XVZauK/T Ҙ1cª_t@�@�H@m۶E; � � � � � � @  ]B�@�@�@�@�@�@�@�@� \O�سgݻbŊ9(GTwߕ{Lze"N�XT_QC:i`N?<kFiH?ƏZZVZUzit@ +>m:T3G[7r0p@�@ JWidB"B&9sI&'uH9O<j׮F)] � �@LLo � � � � � � �%@Vd=^@�@�@�@�@�@�@�@�!`;ұ' �4h,T1K`EiRn҃ʅEp�YJ`B? ς*UC66lZ+0iS駟Wz-n>p;n!�-_W:vC8/W>� �\or:u0w u`|;]Ν5w\X":@�@�"bŊE'CA�@�@�@�@�@�@�E? G~ � � � � � � � � @bccm۶#�iX~{9=C*QDZwg0wꫥ+~::Gw@ Iŋʕjդ_, kti:W9r$ѕvK&u4oM�ػWG^]ںU=[ ŏn@�@� 8П^w?ɏv&LBS';�#nZZʀ)J,ѣGO  � �,K'UG: � � � � � � @ =@�@�@�@�@�@�@�@�@� XV\\\@� Ot~' Kݻ eߖe n)pKH?.U/բ4kv4ttERt/bYʗOWONiǎ"@>XTI6L.XUGA#"� �^`Ji8>ڵleߗ>Dj(cK"I`ڼys ۷oOV$=Y+ � @X s_Zj@�@�@�@�@�@�@�@:7X8 � � � � � � � � @1ԜR!믿ꭷSO=yb6 W#G믗+<+}}_dUK'U*W6fC_aU*M.ҹJ|}WYsK+bԦtK˖Iw-1 @�@ s^xA :$/wk~V˖?Ύ@(&N%JVZ<MXs.x},XS � �D@"Eܹ3M_@�@�@�@�@�@�@�\@0 � � � � � � � �@llmv @zڵkˊv"[GB}$qFd#MVӿTT+R~ڵҋ/J/D+)nCs,@禛fͤ+2K�G,ho:?%C{^� � :`HᅬmoZ61f jѢeLrlʖ-ѣG'y?+@�@�@ KKݛ@�@�@�@�@�@�@�J@�@�@�@�@�@�@�@�@ ,PoWs׮]?F�-0i$Y{.K*/Q?y% Mp˥5%ٴЬi }Ey;Zr��@�IDATR Ea^}'m*U& (Opx #GA ￿K+KCHO?-sqL@�@� lKsȸwݻwoUV½!韅uAcƌё#GBr� � @Vj۷/ q"� � � � � � �d@9pS � � � � � � � � �Ixk~@ >={m۶jܸqF@`馛;n5'd!+RgObSRZҹJCJ J|#_/mƆh%5z{LSǿԶiYgZeE�P tRǎm'ZLCʙ3g � �i8p@<X:t(,Tk"qc۰H<-[F0N:uի%@�@�@ %P+݄� � � � � � � �ZI @�@�@�@�@�@�@�@�K 66жmۢk`"J୷ŋ5p7M(}t啒 >n!@>7.\)=TTsX~+HMd~V%=/RbK{KV=@i~ LY~ re{.yA\_+zj0±@�@�%{RJ_Xm+u$0qDU^]Jai,5jPJ4f̘4 � � P _| p @�@�@�@�@�@�@:9?F�@�@�@�@�@�@�@�@�jE@o"D޽{կ_?u]+V!f19"uQ;Vʙ3K A"tC^kˣFJ.F(wtKuJSH6H*5m*ȑq^ ɂlUK3'}=+^\ں5}O`xJi ?Tiӡ:sԢE#!� �UkO޼K&PrVպu|{ݱcG}:dV@�@�@ ]j@�@�@�@�@�@�@�R P+ F�@�@�@�@�@�@�@�@�(R X!"dDs=ݻw!o'~e Ӳ ]`?BYPҳJuHKe Ԛ<YڸQ>\j,2Bc \f&(-\(.-5l(=`]yb+B!zԮt%RҒ%ҭV6a!� � oĝ ܹ=?Ml]roUV= 6Mq@�@�@<y={vݻ7k0j@�@�@�@�@�@�@�V� � � � � � � � �$`̋+m۶S dM6iРA.,A(Q":9u#rԠA!? U.}t3>VՓ:ԪUK8QڰAz5y :6cʔC l@yݟҵXR2~B!pSR~֤ImZ@ȑ#7xc(N1@�@� 0pJ Ҳ% Ngԃ!R`@ ò٩s9}S[cƌr.@�@�N o޼ڷo_ԍ!� � � � � � �d�Zgϙ@�@�@�@�@�@�@�@�@ b]@\\\S!�>EGDt$k'{on#հe?wrgU&L6n^]j/l~^ѱ[ RCRwmNl@0&O_ ~Ej?a+覛nRByZ� � $ iӎ͹rõnYiPnqR4iܹse2S;v;O@�@�|iQ3� � � � � � � jec@@�@�@�@�@�@�@�@�@ +۷g8 pL`ɒ%1b|IY!Z XOR"oD^1-`uӺvnJ*(ehViX?DkHUJ)#}4pdA=^(Xx-kڄ븅�kT[<#WKc+� � VəSʖMٟ{ ..V]3DB tp&MB@�@�)={vJt@�@�@�@�@�@�@�p囆� � � � � � � � �D@ѢEcǎ(#D�xUť.p a/:z͓^*T(e v)M޽{.vRvۊ <xлL|fEKGQR!} ȑ#UZr-<y(o޼J|i,/bm>dt[ZjVZ(ug޹Sn6G?KfMi[G[[ Nz" _ <Xz SڴI/Zls=7 X� �Dͅm>m9Ёu6o?wt͗mIj.mN49s2<ڮ6}Ϟ=ڥ+4Xo^k˖ڵ+\Զ/ ho}Z2.A3f.xp@�@�R+`u@�@�@�@�@�@�@��Z8 � � � � � � � � ŊútK`7n&N( ͡E)ҠAȑRjH׶�L[_-;]b]{n%^ ={fŽ,ʖ@ėV;~n+z+(&8[!^viK-h (PR,KeH"]{)[>kJmdk =[Rm4or5g#Rԩ҈rh GmZVWQ~SO夺I`ҥ8{? � 679-6N<̭mΜ<¨m.fbg90`XJ<'Gs[)ͥϝϩwz7G4sb$?RT<:tRsh[-ZԛG\4A`„ :묳TBpNC۷hm4@�@�H}_NV@�@�@�@�@�@�@ y^@�@�@�@�@�@�@�@�+^aÆ( @�pBA={T˖-%KغU}{kgMVz˖-ڴi6oެ8mu/mvNЖN\: UdI/*pۂP-V:p=piEq-<.ſSMxnaV`{E ۷hA@at O_H݊Y渢Y14{,[111*^bcc˘X͞}?Brei4TDf)4:u.H?^Erup `شѣ.R /WM6'ڄ � @lfsh[lN<6Q/fġ6gۙg`.mQys2&?.mNm!ӑlT>_ͥhW'5nKǟGmaٲe ҶmRkXX`m/K }q)x\fL_`ĉjժUw4{}ܣG}Wꪫ2@�@�cGH � � � � � � @DX9� � � � � � � � �%`E*-,�d1c4o<q:nݤg>߰{/RH(XQ"{C+b/<"*(( (*"Hiҕɛ]d7LfΜ$3-עPyWiw[ mGO6l m{D4`Z6m* e,�^[x M9VL)߹sg ̮ n-[ Gk>O^Vp|0}tMsss/Qs gڵZGM]؟l#H <( &=O?vMv;N9R=,t� �$b;[_h{nA~< \ 6 sHWe%!!!vtN<E;O֗5kh…񤟽pYkYVŊM*TPJTreٲR}N%xicƌ!P+ /@�@�O@X @�@�@�@�@�@�@ |·bI@�@�@�@�@�@�@�@�c HǻC@ ߯+Tƍc4-9 њ0A6M^SrKevիjժvZ/$ixm`gtr_ͳBMa/&|R8kmߜhڴi7x&7{￷ ߲uWnbaUR%0U^]TZV4}ԱԶG~39x2"0stҥCҽJ W#d W_}ux+ �d+#^2M\OۣߗG Ѳ*T(ЏV-\`'SG#<ow6Y?6-B<ml;|r͚5Yh_lrX?µkx bևvXd|_u!"_| ׅ(o!� � @@�@�@�@�@�@�@ je @�@�@�@�@�@�@�@�@ l�m۶CSi#Ĺ <HIl#;<ѦM38tV\)ٟO+mox٦^Ofgmf@@޼y`Iw_n]`,mrcYjժ&~mv˅jvԭRRӦGpx�i?8Pz]s:u¯4ςTIA�@�)`AGw~-<+8x¤tͽn~Th ^eHkSjeϞ=Z~}m}j/=|}]Z~sckij_|Zj1({[4qD3� � � <@�@�@�@�@�@�@�=E�@�@�@�@�@�@�@�@�(YvڥÇ+wqn�%}v=߿6ZOkMk |-=`|{l޼Y/vҥK>p۹-,wު^lҥK7 @ 6�e[ȖXM|n,XPuuq'4hbŊ>nU }ԲR&+HJyqYЬҐ!RGI\vM<ٝ_? ( � v,YG[ŠZE]/mU©)D[.mSre.d֟v?w\~[_GcÆ :.+m0?~/5`it&~۷رc d{6� � eV( � � � � � � �DJ2)IA�@�@�@�@�@�@�@�@�(Ql;vµ( @4x @AsO4( 4m4k?7-mѢEݣ loٲmBի@! v\It)dƳme˖G{駟~Vʕ݀6(xFt 'Հ^6|SCEjTڷO^jf @ᅲnƒ>yǁ 1kذaر?0f@� ~M ߵw^D{X>@_‹MA ˧Zj)T{l![OO:Uk֬q7o^wOɂ횷+Ν;T̋QQ7o9-f 1ݻwH"(Z� � @:tHy0Y|T4@�@�@�@�@�@�:n>*� � � � � � � � �CmFVF YXz^|E=*^xFl ]+yd!zb6e.X@?g9 w;R yDInSmomp| iJ?mP&M褓NRfc2eK/l<]qt /HEJӧKmMox}4b,yB'V <yƏJX@�*pA~/m;vp}jժݳ:X_ڦ%JD]T@,|Xyɒ%/mi o;vqY?`TS/G[VVDI^ /oք t%$ � � @" m`g  � � � � � � � P+Rԃ� � � � � � � � �1-}n'C�2d*Un)~w"ۤ奇 {ܹ={~m@z ʕ+Fi1&`:u긩K.9rm%Ro 䖱OZhSO= nJy٣A@CJmHӦI+ĖkIK IԳgK/ɎǖJ  � +Ws… w^)RąȜx≺+]_Z:-(\ b' l裏uVɓDžlhK[``S^>l>T>ҥK{5fRm@�@�OV0@�@�@�@�@�@�@�2,@V �@�@�@�@�@�@�@�@�Adɒ۶mF3 :Q=z4ggƓոqG ȚXnf̘ᦙ3g~sZx<.ЧqƊPbd\U;@fg[MÇ6~/un*UT`~Rt=kvJ^Fw얰=b[˦7 Γx@^Fۼ{n1 .3^#5 � @Z{k}iG۴qF/@ڽe˖.Yf.`7wi#@ލ3}tW]zϟ?vXm߾]ŋWV\'|2Nj>ٳg[nɼzz }ծ]^ϑ#� �djϟ?s7@�@�@�@�@�@�@��Ze@�@�@�@�@�@�@�@�@-8 �]Q="]5EY`^yJѝ}v7T<N:U_}L?SŊө* ES]3mM,4K/38CgyrMK*m*͙#-`[ĮKIo!,/(Oj0r9r;'rR �*tRׇiܽjժ>!CcFLUm֭h֬Y׻>$ :]?M4qoP[R;fgb{|7j„ KS_%@�@�@I|@�@�@�@�@�@�@�@ bjE@�@�@�@�@�@�@�@�@ THbCmĩ#YF#G>�q*m$=\h"M8 :K)\ Z;t蠦M*wo[@�4 -[V]vuo>/j-+euE5jpIw\3@hzSw|xc뭷{72j#v_ve*UT+F@�X7|֟^r > /۫jժy�!+W.իWMW_}kԖ-[4}t0;讻RrԹsg׏>묳7yd5o\KWϳ|@Vh@�@�( 8pϟ?J[Z@�@�@�@�@�@�@�(@VNg@�@�@�@�@�@�@�@�r@ŵcǎ6DCڰ|rU^]ڵ&3KO=u4rlرc�6w&MԩS' Zl<yёV'`iM<_7Iܠz7n={nݺQkWHO<!( 8#=pǨmioSnEz!X7ŋ5zWN � {_/=a:tȅ~?k@ zeʔQd[Yݘߺ={3t?_9|82Zz+oѮ]z9{� �  D/_ ª � � � � � � �$ȝ%@�@�@�@�@�@�@�@�@�+@Vl3Jv킑 l7KeJݖ:Bf=#SZh~AwqV^ W֭ <PPBܹ K/XǏqf͚饗^֭[#wez_u# *D o7,Xe[P= ɤ � @;R\9]}JHHȑ#eӯ_?9ojB *Ukƅ>Su|.xY%z7 ֮]>;5/<xP'Ń{.#� � 6}JK#� � � � � � �,@V>� � � � � � � � �H@la+Ā5Kd^K.- iXPғOJe9r ݩS'ըQ ڿ_:unUR%E�l%P~} 4Hӟnݺ�,.ܹs#\"5h (!BD2bZ;jyu҇J#͜)5jf\ҝom@�Avҋ/z3Ν;5j(mڴI,l) xiv >| /TdIׇZ|Amܸ1{#Di&MRJSNgfֱcG=B�@�@ r~V"W)5!� � � � � � �xrW��@�@�@�@�@�@�@�@�r�Z9fO rYfflmDX஻ͥ^2VC0jذWW/թSG-Ҝ9sdae˖XZVZ2d,YK֭ժU+o>DZ4R-OSҵJ_,7&]yelgAy@�H-[t1_~Y7t ty)o޼鯜5@ rʥm7Ԇ Ohɪ^-_</ovgy2{q=z{7w}a@�@�?/\p47C � � � � � � �9L@ � � � � � � � �drϾ#Y;vS~?VNmQ1C2EހԸq\֠A@kn: 6Xͬ�QO{ァիW{A@uiv,olyGõ2\! ;wJK͚IK? +(z뭷\G<yA� @6-p:xZxn6| 'lh.! (޽{kٚ>}o5h@_6mڔw="fܙ3gsΉH}9 R>x>쳜/ � �iCh J #� � � � � � �"@V*@� � � � � � � � �G@Y'dСCus=Yڷ?:cuX DۧO]wuTHT:_~),ԩ~V`7'~حj lׯ_?ܪY.6ڻBJ,Z,ܮj\_$W(_|IZJ-[TǎeǓm۶eh3/t4`?g*VF &FՓ_zuy!wδbxeJ'>SըQÝ'k;@� \�'|ǻ@^2l\iOA }P}PlӱzKܾ^Fzwf޼y۷t[OkѢ1g^ߠ^}HU-6m8@V:?ҥKm۶7n\:k`5@�@�rZKϛD�@�@�@�@�@�@�2K@̒f; � � � � � � � � jeG@ׯ /ADbrNXGI^۠TX1-]TwyϟX+ի5b\2M۠ߋ/… A\YV%Kj Lt^K;wԾ}4i$m߾=M$6mr_|Q&P4U-(g¯~v?;̝;7[:ltWÊĜ\[:|y`k3׫W/-[6цi=O$(/, B쑂� @f ߿S~,3fdۗg 56kk&'7?xKee֭]P͚5]�ZMԖoڴ,(u/eSn| jJ&MTBkY4碋.={Oi) � �,`}Q+ -9@�@�@�@�@�@�@�,@Vvt7@�@�@�@�@�@�@�@�H$`'6'Ȉ>2e[nH5E=$uԪU`[;@HHHе^˞n gYJy48b;">@J޳wyGݻwwgOO?)@ $3gK.Qv_uw%5k&/@^XWaEbB`.yx7^7x4gRR߼^Et뭷&xzZ*@n![z@� ݻ <_&LмytmF^EZ }P}P^#YWǎuСD+ћH$^FRyaAwkAyMeyG}ƍjӦ,\X`:sU,~fIA�@�@�or6E�@�@�@�@�@�@�@ j݌5@�@�@�@�@�@�@�@�@ N/;vii6Ă~[? M i=[^h4xpVE-@裏\Ok`ȝ;lJkɓ'1NXתUt饗&<Լc6ȌcB},dFݱڂ>S{*P@5}x =.p`j}?\rd5pc^*b%X`y^~Yר_|QvX%_Iy¯#3Uc[ �8+B˗/׬YtǣЗ4hM#G ,cӏ+pB 2D:tgcŊeke˖uQM9*tRwԩ$PZjqeVE�@�@ { XVѢEw[C�@�@�@�@�@�@�Ȉ;#. � � � � � � � � jCطaÆ)'0tԢԦMھe]z\Oμ׬Y7|SsU"EdB\,X1^:IJTF ʕ+եK}?l각vؾ}&NB^x}ǚ0aT\6lZ͛e@6V޽VGZ7߸^bN<D+W4%]nڴ zyG_~jժ傐ʗ/?S۷oFׯwO4鍊nRzd!O|}Y2elƍm4K5j,$jժ/?{ԹsgkZd4 uֹcѮ $<tʔ)x)9^G邮l{9ـfҫWcV믿w߹1oЌ;C?.r/xG\/5m*yhTn $MA ﰤ})H\#=E +D{ԩS5i$wynPz;7o<Тviƍ:餓t]wVB[x1v\8|ͫ{GӧO׌3: #<ڵkozx{B:aAvl>l~J@<A�@ !-,6[ɝm0pk)#տw<kl+vmݸJ>}ܽk ¤kpqfx ?g_[]O}cߥÇ~]uݻ&~;^<ɓ'뭷?aÆkE/W_ݣ"3iקZP!;VM4qTMҶ-1.ȅ߿߅g6F�@�@ رC � � � � � � � Iܑ@�@�@�@�@�@�@�@�@�XXn'mC�K'!6wn fl~Jɷ' H~ޱ .n-Ebbe]澛qv {mS?zd1x`�V,lu:\S͚5u?p˲wpYgDžJsS¯Zlœl 6�%n,K. \\9_աCYPّ#G\ mBɊ\y^Qcـev6H^Y~؜"]^ymV͚5soPm~s߉'x m9۾^uUn}s�7+ f,يwY yV2n87zK?OwSG}䍱F$/À@L x/ J^0mx֬ ںuN97}ŊUtiw<2Ա>i@r ov~ l;.~]ȴjʅpyB` ´1u& 3,`A]~k[۾ڹ݂`%_ �$3ϸP X0ZJ}H *kl+3~ZC]s]6{VOJSv_v½Z,Ovajł6,DXPr @ /G/gwgWwVCSi4,ݮ-P6]}w@;LxdL~cvrK3Vk#� � =)JA�@�@�@�@�@�@�@ IMB�@�@�@�@�@�@�@�@�ﰁ<( @ZlPV 0[NXˬP:%Ҿsq?Kʙd̜930Hgl}g]Kl@^͞=[ 믿.^>|uI lF[0{ }-iƌn~ 0@ڵ 7iMV>ζoԥK{.$l*V#EYI坅mӞ7DX(%g˽ :Sݲ,B,|*;t嗻m`lF6m\Ո#ܠ6%Kȑ#㏻Ƿ~v,ĂK*UTL, ܹS/_'bQeǞ/;. }KWg6E z^ޝ,gפ瞓͓wl©ٮ,B-�_~۷C׃N<pByώev,@+qі` ;[�I;Z_,,PBKCOk! zB7H<oG@�s8)ԗ>xW]CXK[hѢEus#_0Ђ힉]Yٿ6{81m}Ů6m<Kc3-\md-'Ov>C믿dߕ>}zr6/׮szٻws99""oi,`΂) � � p�Zǚ0@�@�@�@�@�@�@ 3^5 � � � � � � � � �!@V||NX` .x'i7 +9 fČѣQ}GL"ڐjժ& i&=: ?D?l f+wzB,4ֵO:$cOV֬Y폂 قJq׮]n�q^'즛nIkv!!6试Զegso>=[1F4i$PfY[l߂Kv$6cb6`z$,C?#7˷Zj ۾[.*UrUZ@6Elذûw*㦞- (&m7M9@`ң=H>6 M��@�IDATG1cƨbŊ.,q_ ״cRvK??(+- ?Z0䎋y%hŊ0Ki v.>x x6% l٢O<хY0D_b)t" � ɝ] Z_:Rp!V .)?Ì>_ڽ^gΣhjז޲R-DˊK/BΝŋjd ݳg:u[ξ '\K @�@� Xqɒ%ӷ2k!� � � � � � � @et22@�@�@�@�@�@�@�@�U|܊ NA�8| BЄ[eȑGCϮ*}hѢ ٿ*Ȅl`~[*TkuA^StZ"۷oW|d͛7כo m&{=d͛7M ,вedYRr%x[[h۟<ymcϫW#Ō$`OwƽHG}2oOaAaVw׮]3̨`ڵeǞHp?W:|y;:H7(yYs�(\5-8B4l0jzw| |X%Y?ڣ1znWR:.Zp7x=:T-^b ny>q*hʕޱ|Y [zI6K@�,`K ꫯbZ!aJN_KO_:=}p!B;b/ܵUrٿ?ɾta𶒻6 ^ƞ'O~F^t͘z+WV+TP`uGuc,;�ՋffJ&M?^N"[ LR@�@�@ j(Q"<^ � � � � � � � Q2* � � � � � � � � 7Eum) @F 6㏇\Q 13^~YRxO>ϧLXСC~K]xd޽5unV,C/q4ZQ~M?1U%lܸfg}]cb^CKX 30?\"Yʖ-oU]|Dˋ>@;v>Ν;G#TI/HW\y+bTf/I  zJ?_j*Du,oB/9*yB-#iYbEYǼ>餓\mڻwƍypW^yE~1+8xyח_~"uO@�rܹw"CrÔښ}\C}䮭=ߵH WZ9w e3K_s7wDYbE:GeA7|ϟ9ɓ=g}XH㣵 E�@�@ n,PTRq~� � � � � � � jB@�@�@�@�@�@�@�@�@ Ŋs\D *E+\(n͜i*P7M*S^uYg}p`ʕ{ァz2})noQjԨQ#7s]|n r$‰qkV"Ed!GT +zjV7vO2%r6 Օ{߾}fx3ɓiӦ9{nw2E3f$h޼yih~$^X(݊}{YѦM4;\xndz>1cs?oPC / ,_.u"u&~0))!!4_|jڴkX͚5;m/ ,Oq=x/";k,}&,HW^{d! N _߾}aw>M>]t @�#`a] nsb$w>ܺukM_KGv*fiz+~F CkÌn'x}cǎl$}髯moΜ9ړEhѢN7c2dH (k`-SNYېl .@lK � �(jeܑ@�@�@�@�@�@�@� D&W � � � � � � � � @L ϟ_y :Th Ĥ/7L}rY@LoF !/ 蔑? 屰X,R1j*QSNݻwyheG}T6@?`}ݧ?t؂sxj*Söկ_?7x۶mBZn- .i޼"m@ ꮻҲe4rH͞=[63</_=�&fh/֮]*Ur?sbj[O3 2}q-įO>d}/8 -m>@}'OǙSX>PaГ:˽k] ]=m6 yf+i?O? ~{;餓\'wޑx#*R xOz!㥕+%/ *THX̽4hPM\ewZTru?ںzH0n81W_?o<sxE{߂/ի0-dˊ՟45 K/ֱ.-8xsk8i" � ᆱZj{T;(Q"QcRꯥ֗T*kptp-T?ο6 8^}~[[\|J8H[װa\՛=e˖zW^#<boiĉn7Oڗoݻ{v}ku[ZVK;vtvo(I&\F1lԆ� � @ -G�@�@�@�@�@�@�bY@Xth � � � � � � � �D\}ܵkWB~vxt뭷J*osyJ2tUپ}  .LA;{ӷ~kgp4դIM7e+"68r믻>Q 7SO=-kKu 7 +ye)-¢,<!/i; '~ζ߯)S੧~=ˆ,L@!CŬ5ҥKr{vnxb7&6lƍ Hm)0 ҲRg,4ł,/w prƌ,e3g ٚ5kVǂl@p4j-~ Ν}.,v?]5\㪛>},p~[֭y(.rn_ζk*[?+ѣG݌Y\/y4M-QwN쳣AZ��iBB,XVq.\pۇPpvsFyՎvWreM0An ҕW^*!!աC5h@`\]l}m s o2 ۲k�;v �$`}2;tU'| k·mLR_z̙_.]:kprv<}P}6 Տ vł&5٤t_&֧J/!6kpc{Į,pgޅO<+VtaW\rן;ڡk9?=Խص9έnvmph/k}`잆R$Z)8ݽGbjC�@�@ k-( � � � � � � �DR DBB�@�@�@�@�@�@�@�@ ' iӦq5ktr�q Ʒk'/hEz(o_|хXLrWVkK*ޓ,/GޠÑkŊ+ܹdٺ\ ee9|<(U 4o<7 JOjÆ SNelobuڼ ב^l-;e*\ ?XD>UVzPtǶm0ŋgʀc6/jժɮ],jժnptO;.YęVP!ڛJs۶mӣ>*SX ԡ7i@ +"rռ0;n-( ,I^(XI.nWvl D ֲD;PSznǂ-4sNw~_ܲeʔ)V5{uvCtX b!H Yfsr-Yzv> }^Cb_ڮg,TR& G={.)]Fh3jX? ,'{qbub<yWO?绠1?<5f5)YD^6kGA 36ow[ + sm_7ߡ̪w9*/T2ı]+}-� � � � � �#W$o|yd  @#鷋Ŝ`M@�@�@�@�@�@�@�@�@ , <( @Jj;4(po_o@۔j㽬x]SȆiپXɓ5n8ʀt 7H"Y6شaX heSb3l&;pYu2TʝwީK.-e^M6Me߮TR`0GyDqPObڴi<LUo޳@%}غukƓagҥնmP:/6%ݞ%aZnzƍs_v2~jժUr{F8:�9s%2 l, xc{pc <ֱcرce60BB&)ד[ǟoZeC=: +P{+tHk@�)еkWu<_p.r`H s>m%_ۑ}^Cm�/}p}z&k.&Jz]>X|)69oڵayoO<PmHv VoРAlܹsc\޽5zT29s矰υXYatM/-[\b@�@�B>Ŋ3@�@�@�@�@�@�@�H IMB�@�@�@�@�@�@�@�@� P+?"@L<裲ESmj>b,6nQ#ݻQ}K:t~a]y啺馛԰am85Y[.kJu='2ZsUS'}ϵr<N"=gj3W^ч~(3&K'H͛K^*MhAKϩ_~)r~tw zOaÆYfdB-@3BD3a @ .B맧~څ-WXY^uU^kl_Uc=?PwPUEoU}ڬn�1O󱾳,X.L/HdU'MըQ#SH֭];3֚G{@�@�t-[m ưA@�@�@�@�@�@�@�l%@V8@�@�@�@�@�@�@�@�HMXbڹsgj>`UVW_?B *AVDYGIyJ]Fw A{ɓ'_TF\X_^zlٲmD*[nvԔ)StW�PMTW=R\&<餓dS,CO>7ok޵^+T޾K%!ڔU <|z4j(łfΜSN9%UEey/@vlF<Xz≨lJ51Ҹq҅ Z5~wxܹJϞ=wG%K㎋V@ ; X?Ґ!C;h{>|WY_Z>JH4/ұ֞}Ȫ>mVm7g#Ghƌ]wʗ/n59r9 Բ'%zv/K."P+zԌ� � _~Vҥ@�@�@�@�@�@�@ Ԋ"� � � � � � � � @$-]vEJB�l&pa6\$oWJ xsgHiX.`ڴK1b^xdնm[]p֭T9 Jv͑J(5/2_>R@)q,{!Ui.0/[u饗TR1g+5 sMA1(p#H* >;&Y؝ OA�@�{,lӷ~µ,PKe}鳽p#bkԌl]㈬gvA}7mAE6 Y8k$%e ^xqL){]t6mڤrʥC�@�@ [X-_|*VXv@�@�@�@�@�@�@ vԊς � � � � � � � � @&�k׮̈́- G_ j͛7]ȝ[:|8EY(v73iI6clC qӏ?cz#Ϻ›4ijٲ?結&|H1` 2،={hڴi4i*4Y˖-SƍճgO[nկZ?_z?d +0uԷ׮Awh9 �Ć駟./}WСCj?:"i+ǑT$~__֭/=eY3O<?_ŋߝ˂ %%gu 0aݍQ; � �1.`ZeʔV<@�@�@�@�@�@�@�xGڌ� � � � � � � � �VhѢڹsg?v 2&0x`ҫW+@-olgJ |Ɯ{n7YfiСZh&N(l^.\X[VաC5mT EA�ؿ̙^i͞=۵߿t5j>js;NI^(yY塖b^NƻwHcH'/DNw=' �   L֭/1yv]Z5ׇMjMA�A֧OK/^XʕSΝ[oBo(ݱ1?iLZvO3Ч~JVX@�@ { l޼@ѲW � � � � � � @  @�@�@�@�@�@�@�@�@�wڕd[ ''͕+WحNH P+lLZg[mH%JdLFdӽޫm۶LW_}UTbtꩧUVn:SH8L[C 6#;7|gߴ*T(͈zy]`AI'$-/|Ͳ88xPz顇eZ D@�{| 6l.]*GdZ۷ow[~Gvi:=nP@ 9?Cf ,Y" ̳W_,\>-alb|vB->ڵnvݻ}Ϟ' � �M“_Q@�@�@�@�@�@�@��Z:@�@�@�@�@�@�@�@�mbudA܀:uJS3JW>|XKio*C(Yw&hڵ9sf̘ct ׫WOe'/X` ;pBYhMsʕ+K:eYwy{,UT; j^z)tGhvO-;}2!#V=!� �i[luػ?~~amܸڵ7of͚N:ʝ;w ի5@?z޼y.xⲠ^js6mܽ- ʣDV)޽[iV=\p .Ȭs9k[@�@�6oެ2e) � � � � � � � P+2Ԃ� � � � � � � � �q"PH7`4f"@& L2EӦMsFiݤj8ֵX>ZsH[@6Z[NUT%\&ۂvƦٳg-*YȖ ޴iSըQ#UT): V#Gb /n  ˗=V|$tꩧAsJ 8PjBj.~ ح6l;0jdcTv& � ebmaև+{ 7n8З>tǫhѢf6@ iŮ/O?KonYZxK/=6h~z'M֬Y3֛mWretI8qg&P+| � @l٢&My=V@�@�@�@�@�@�@�@ 5R}@�@�@�@�@�@�@�@�VjeA b r_n)"i,%K/MUJxq]/:MYF׏?,~e,YR6 M{\rU@8t ݠ6G6m/%zk`͚5S2erU~4kԫTb<OFÇKCعE?^-;1� �IF]z`hO[(/1B\zu׏nذam}%Jd'4 X?pOo.Dkٲe~N[x-@i+d\:u!M]vo_~9M0 � �I`9Uɾ � � � � � � �$@V,}@�@�@�@�@�@�@�@�.`Zs?:8@ >#Pd+XOPbC`TChK[QK T}v-ZH?{_h˖-n… ^z[ԩʕ Yȑ#Znl`K&l]Y\lSO=U_5j/TP<~ -/[L]&}mcD菉} /y4x#F>� �voUW]cժUm}i /e{/1B :/maϦ b ׇO[[_;o޼~SecjJ ^=Yߘւ.]衇O?s � �8w e˖E@�@�@�@�@�@�@� 0LI@�@�@�@�@�@�@�@�bY޽[%J6C^}mڴi+kUV=5De[vSp37o,v l!C~/_Em5kVZўרQCժUsSҥ9Y&`xoܸQ6H |o}moV\*X? 6MŊ˲} -*#l)=9_3cvYe@�@�^lڵk`>֗^d/mӤI~rN/mu}iPkڵ߇GSVʔ)֗n߾ g@j βP-J 1ʂ۴i̦-k楐WXQ&L P+~ � @v/e֭O򒼋� � � � � � � @Jk � � � � � � � � @ MG FrAC|IkkL^^#Zm\VVlYٔt0] !8٦?=Θ1C#GԶmk[UVuWRE+WhmsX'UnݺD m%x�{Bj׮;wҗ'J<#'m+k:!vq[ENh  � sv [t%Ѧ-[,З? +ڻwo`y'[sp_RJ*j2 K@DaÆ@`bիΝ;>-4))矫Cʟ?|@?{8q8� � @oY  � � � � � � � P+Ңԇ� � � � � � � � �1- q uUW]u{{j.+~A ZM CԮ]d.۴zjhaF5}t7Ps@y@UBUX=s <۠6@9% u˖-ڴi1 _іbj6ȷM6}Vܣ=V{^@q3Ao_i4K 3al"sH7,-Z$~tHA�@�!`M4qSҷ9=~_׬Y?=  scbŒnTۂћ7ov-:i_zΝ /~^2yK[ڂܸ' 6O߯SjСfmGvz˅q� � @Nb� � � � � � � @Ԋ(!� � � � � � � � @L Z68%roB]  c(1 `Z &-ZT'pۍkYR׌3܀۷oOT \D .] e%K*x=/^\(%̴vdto۶MycuV&0cǎDmK*m G{O`b761ջRT{ -k'ԠA F�@�b@;ϱSN ٢@uӳg)X[es}g7oe!ؔ4G}>Ky>o޼5~ժU˅N!lhAYeJ9svޭN:弝=>3?~}gkbU4@�@� P+s  � � � � � � S9g@�@�@�@�@�@�@�@�ȡ~ 2HA�+g=裺Tj A޸Ȕ,8tHƟSOeqCrA7n߿?0 M.FY s)Ҵk.9rzmi@p¿nSs{]PS]8 tk!]6fo>7dǸ7d@6mAX6x~XIgnAYeʔQڵAiڦrʹlٲJHHHR/I5z矗n=ZO[M_o){cR^ �?Φۖe}_CYC(JPvJ+-*E%iS/ZD*i,!k)[BXs3kfrs}}۽.3=F�[Y=WZͮ_%{?B &6g::Z:...hkîS^GH+ٮ]Gu-mastkhװ{nv=mVd#'8eH]?{V@zǏWڵUZ/wdV4n8BL � � P˟Q!� � � � � � �"@VI� � � � � � � � �A]7x yGl7C'9ARlÃ&`EgtpS pڶm[^S-X-fqF-^maR(vJS'\f8emp \r1bک=loA'ϞB8{m22G"Y(pt[J*n0Ⱥ=|h6k{͚IO< c RgR҂wKa � @t X`=,8p- y{[lњ5kBz4#Ůj9ٮԮ2Ԯm]Gw-m۵Yef&fҁ|Y)rkik@Ծ}`7K{ԩޫA  � �"`Zݱ]S@�@�@�@�@�@�@��Z=@�@�@�@�@�@�@�@�-\it-"<p@Se˖v_NZV~gYX:E 9'` m,Y}dw޽{p-oap{oAT=> kG}ЪAVض= }[)<l^ngoqq9"ち^)'za #k[[>kB&ҤIR.49?Z l*+gK {ǧ!� �YkB wGv] {l5={޳{mi]G٤YU:D_SBR^;ޞZ:ttuw=mîm; X(ҥKku13. XO6Mm۶y3Q@�@�,P˾ۧ � � � � � � �  BJ � � � � � � � � k8|}x|{5z4E#7O:49hCJªw=R+~*3tQjU؆�wRÆR^Ґ!x '@'=`E{ݵ/ @�@�|.`ATEuJkfj2ܽ%jѢEd < G[re>IC7@(<L @�@ m-[6{@�@�@�@�@�@�@�)p@�@�@�@�@�@�@�@�<… y#[祗^<ŋNJS4 sfͲ�Ɣ̙ҵJnaZ15u&@u[+h ? uԽti@�@�B$ܶsK!f"ǫuʟ?*rҡC9 � � KoJ*KSf � � � � � � �a P+t� � � � � � � � � PQ ?=-Pk5GCYصKZT:,!1'`?+]$o/zM #/n1)iӦ4I#ؾ]S:4)W.^f� � @;%! 2eso˹E񅀝UViŊ@�@�@ UpP � � � � � � jig � � � � � � � �Ķ@\\vظqx =C``| eVY@:|@qKIuHFIԱtk,PP 7Ms1BUKCiPiLS3@�@�a/PD#sӧqugXb?~H@�@�j">4� � � � � � �Į� x{f� � � � � � � � @ X֞={bvLXxgUhQqA%ȟ@fモJT3;vH:$�+(3SgD >^>\7N6,$]q~Q:K//nIʕ8@�@� Xg^ -ujժiWbOXͫ .@vn( � �Ċ΅|ɒ%ce@�@�@�@�@�@�@ j@�@�@�@�@�@�@�@�@  9+r޽;@ lk׮Ր!CԷo_,X0BAm2)ie ǔIa36I&H%J,!hBzW/iuC;wJ'5nd<7*@�@�ز:] 5Ə;_ 9og_ � � * *]@�@�@�@�@�@�@ Ԋ�@�@�@�@�@�@�@�@�= bA;8z)-[Vݻw:ZA'tդIVi\)!AZ5&TRKZÓBw`H0}@�@ juUdL Nվ}OYh׮߯)SdD�@�@ ԊP@�@�@�@�@�@�@� P+OCF�@�@�@�@�@�@�@�@� ik@ b~W;zu '}e"ìΝҊd*f<4bGҩ,G d͟/rȺ.ZVIrB\b�@�@�(@%d2L ?^jѢEz٬ +Wιx&L&8@�@�C?)^xČ"� � � � � � �D�Zu- � � � � � � � �APBڳgOZ '4Unp-PJbb3 …ґ#jW=rz{}_?i }7#E 4\)=lٱ>\cܧ԰}4{[Rɒ? � �D�ZtkN $$$uʗ/_N ~h׮&NN v!� � [nu'Rd8@�@�@�@�@�@�|��@�IDAT�Z><) @�@�@�@�@�@�@�@�B+GVhiXB#Fpu)o޼!WIi8 HJI+"cNo[nzn-τJ"xtPR&go9Ҝ9aRwRҰa+HK͚E� � � l"w4lDطoN: Sm_~ѪU|:B� � @p@ŋAZA�@�@�@�@�@�@�@ @@�"� � � � � � � � @ *THw2CГO>O>Y\sM4 Lj@۰j5nnvƠe%H]$ �L?ܽjRrB-%{dLU6UWI/-_.!� @�@�"R¥%#r X^&td^y抏ĉ30G � � A۶msG[X5CE�@�@�@�@�@�@�/mV&Z)@�@�@�@�@�@�@�@�@ ,PkϞ=0�,]T|x '"td+-js2B@Fhӛ6I:$ .aD@ݺIOί^%%&J&=L yvҷTd͜)TtBw � �䀀j(%" RJ2f|ԪU+M0!&ό@�@�bJ`|-Sf � � � � � � @f`&;3{h1O � � � � � � � � �U ..@-ƅ@:u+b6U`6  YLj8=~؟ /'+()#gDrB,^9zNIw |-ҠA /H/5o~^!� � jEf~?~"S|-Ю];M:UF @�@�(ضm]|ϟ?Jgȴ@�@�@�@�@�@�@�rZ@>� � � � � � � � �a(Tv~'d}GNNNheN ,^,:$5i~͟sҊRBT?ɨFٳSNz*e9$&&DnVY]s"{u� � Kv }TD,͚"q U$Z7˩m۶ծ]4k֬"� � r *Zh@�@�@�@�@�@�@� @�@�@�@�@�@�@�@�@!@,HA˲qZ=NEv]bŤՃ4 F^}&-լ`D/H\ \4哦OOkotm}~z?F1B*WxG@�@�غU%KFܘHp97B<`4G!VN:$}W!셦@�@�YN*]P@�@�@�@�@�@�@��Z]@�@�@�@�@�@�@�@�@\\u!ߎ!@-ZO?T+W7#>A V;q 6HS+0jҠAR˖; @D 8kDkljU)o޴p4mZeԩRf8n]嗥g.9'c؋� � @4 lْ4%y XNu.<GYդI*!� � m۶H@�@�@�@�@�@�@� P+*O+B�@�@�@�@�@�@�@�@� ~gϞ"T_~jԨ.̠@n QX71(0gt-}Iݻ �SFKNڵff̐N}4l]J"in ,&]xԹԬlY]({@�@�Xش)ie̙/ؽ{O:25|!ЦM-X@[@_A � � <;w*>>>x  � � � � � � �j@�@�@�@�@�@�@�@�_ KMlfs .Ԙ1cԿ݂C,T%Դix7 Y^s /klX(ZT;VzPܩ w%)cGR]b#zaҀRݺ/H'K| U @�@� lܘtQtf>/0ٹܿڷol ϥ)SDɌ � �G u@�@�@�@�@�@�@�/Nh@�@�@�@�@�@�@�@�@姳Xi5iD:u NlZ!/XA6~RPIfAjf"N`Nsg\`{"nR ɇ&M=zB45}ۢWH&<(:6x4at)R~ҢERV0k� � @6mJ<"x=+0~x5nXe˖Iȋ:M6W_}c3g � �"@Vi� � � � � � ��Z9gO � � � � � � � � C p{&P+N�"" j̘1z'BC*$ٓ~_`<BbM.]$[p/…?fF@, n-Ԡd!Z^9rD]<-}uR7+}IK*-]*=/Wg@�@�6nʔ�)ԡCx\p8$S@�@�B2%@�@�@�@�@�@�@gj0@�@�@�@�@�@�@�@�@N 5= NI&ԩS8u0]mLw8gԬYL~8)S*1M@JRN}4z=饗$[`m.Rʁ{y� � �j-<~I;ZH=[֚5kr5CE�@�@ cjẻZ � � � � � � �Y P+v� � � � � � � � �*@V8@: .'Y_~ .BgV˳fI͛,0r[o癹E 'HKÇK:W.i_c~[r4yia � �H6 $$$TRjڴijc38C4iG@�@�Ț�ZYs(@�@�@�@�@�@�@� xUj"� � � � � � � � �!@VtGf@JI&ܹsa{;]wbEBg10~RxK_sgD@׮RÆr~OKn!S;ڼym>oߞz޽:pQ;\/_>'^ۣPB*V1ҥK|n`<:uI<yݥ5@�@�ظQ:cX/ծ];:wSDͫ-[Z=z3`@�@�صk .^!� � � � � � � - � � � � � � � � jEYc-pB3FcǎMR:AzA0 ̜),('D-Lҍ/Ss}1$�iٳG+W 'W띅v8V78Gޔ|- SzXeyuIölsY(΀K *S*T+5jf͚UWt%&/vڷO <|8.xC@�@�X@ecuoSV zuȹ9mߟ/� � q.оϣ � � � � � � � *B%K � � � � � � � � [ cۻwo@ O>D;wAAIVA܌RӦrVSQ#(]z'}hfjL_~E ,prIZn~eAYUTI'J*qNjZut]YV"EdW(H-:n[Um,@/{^l g Zx≪[;>=lgʺZ9AaՐiO8 g^rB_M.[@�@�@@@�&Mr۶mr3#HUVٳ{O3T@�@� P+}"� � � � � � �d_@ � � � � � � � �D-oZjE؉c"xb3Fy*{÷)>^ڼ9|zOSJ7 5n#͝+9;![oٚ6mf8c7vn矯5k5j(ad(Q}T$4ʮ]rJIZh}YP.]Zv9{|Noe'm+WNj\j,)}N � � @NK '|7lE VkfmDիr΍ɓ'@H?@�@8p<B yxF�@�@�@�@�@�@�@ j@�@�@�@�@�@�@�@�@  ,HV$(ƈq  sǩ݅ KN.% VIkHZ3K/I#FHIjbH `N8T'pEUM]}jԨ>_GR)#e?h5k^y=ÊS&W/ZT΂IZM&.S&y7/@�@�@ T| T 1"`Ǐ]w#3irndO2E=PN!� �ĔKv Z1uڙ, � � � � � � vNN � � � � � � � � [߾}~ c@�, =z>cʕ+x#yVGf͎_/0yԧsR?f@$ݻW&Mرc 7J*j۶ziU\91uR=\ѫW/˗iȐ*PM:b*Wޠ.k.H-ZP<y!� � ' T,yÆ Сÿyuw+11Q90h@�@�R R � � � � � � � P+T� � � � � � � � �@- @ <SW.DΝ9>_ .N8!&ӓ\Fj˥޽c#3gs*wڥM >wY 4IZԯ=ÇO _cʕ+뮻N7pN9Nq!� � K?LS/ǠUpR5j#iZn~9{lwyk@�@�!ٿ � � � � � � � *ܡjv@�@�@�@�@�@�@�@�@�? 8O>ruB\J&Mڵ qG4 ˓ʗ~;LJ�Z7*O:$';=Zv5[}0;wnuYzdgnݺO>QդI>@�@�֯R+_j{ن@l XVcsQ6O<QիWה)SlfL@�@ Vݩϟ?V 7 � � � � � � @ 2] � � � � � � � � 9aDdF駟V͚5uWd氐-ZTھ=d?Nn:t$nMZZ3)..g?oQUT+/X/? s(# pZӧSO<+-� � �i G bN`͚7osr[jɓ'Gt � @ ?�L@�@�@�@�@�@��Za@�@�@�@�@�@�@�@�@w^ @,bԨQ۷r?,VL:xPڽ;CSRƏW8,"xCz}9Υ5"b  .LrϟkڵG<8\rEzn:=UZ5q"Xˏg1!� �A?a$L8Qy\1l n I۵kWۢ@�@�rZ@>� � � � � � �Ć?V kf� � � � � � � � �>@-o @{9xҥKjjYٶ-F`cдM9S>}{Q  7n-fY0g}%Ko}.Wxݻ '%pyI'![˖-ӪUb -]T+WԚ5kas6>|85@�@�|.dbE!F/ lctJ-[1cF(m@�@�"{?:A�@�@�@�@�@�@�M9mf� � � � � � � � �.`z۷/?'Ya4h ɓ7/Z4i(۷�pN7~Lh7֯.<)4oߜ #GBFJr劎 |'pwn2`�=fٹ)R{ʕ+ TTJ0ڵkUV3<@�@� Xօf>5fCiĉzGy17e˪N:6mڷosg � �%@VtOf� � � � � � �U@-ƅ� � � � � � � � �!(P>B#@P^x_}PncŊ%m[v[>T*UJj"ld´ .'(&g뮻NsQ޽裏>S/`ZzR׮]խ[73F:tc= %޽{0uVjݺu;wyfw:ԴiSb wy @�@�l >,3Tr6pDou1Jf4<v@-  � �.`iY( � � � � � � �J@P. � � � � � � � �Z ڹs@hM6iС8p!PswGK^(i3x@Gi<ɉ @6&LkF*UՠAl($C~8qnf]{`oA[˖-ӂ wiرɟ:,]~+Tt4G@�@�r\`A9.9>/TZ5ծ]ahٲz-I ʦ � � B)ytYCƍ� � � � � � �D@H$cD�@�@�@�@�@�@�@�@�-`Zn@ /)nݺ5gI۷gxJ__HW]~=FGI&'0OS'2k;K/uB姓XڶmEzj޼ x:3uww?ߖu[*T%\ӧgM*!� � k&^rN]5=%=\:tH3f̈1#@�@� P+N7E�@�@�@�@�@�@�rL@c@�@�@�@�@�@�@�@�I 'ȤS3ytx-*mbQe֭cm?eˤ[nK/3D  нޫ^xAÆ }S&L뮻N_|>t,˻maB5k֬,! � �G?\ guֹ:t0[ʔ)ujڴiYl@�@�jr.sf2F� � � � � � �D�JGyeV � � � � � � � � pk߾}ǩn믿yG~1(V@cPaȤ<y B`nˤz_Ő-ꫯ_~z�ʈL >mȐ!nkYVvJBpٳgo ':K7tvܙ9@�@�XiHHHPղeˈ7͸yGVƹ� � S ԲCA�@�@�@�@�@�@�@ jR@�@�@�@�@�@�@�@�@ Pbbo@_Nj}*\;|hQiv * 3kbԵkL)%pҦM }9jo@ &M߯?nxR&z ﹮ꫵrʠy"}ƍFiٲeAi;܍L>]w� � kʕ] ժU+W@ hǎ9Af� � jif � � � � � � @ 㧀 � � � � � � � � @Nϟ_ˉ2)[o^{#[D i˖ *zԤI,6v҇J#Gpvuf*[oUW]/Td݅ s|Lk 2D'|uM+Џ?ŋsŋݶ,K9rYzgMn}URkGsk.=<￯8'\qy͞= 6l^~eޮ4I༰PִoO:uҕW^8:u{Iu߅^w琲_{V~{Ro2nZDz@�s_o_cǎ93�z j:tH3g Kt� �Y{vors{)1;wԻᆱ.]覛nѣeRϟ}!yYicȴyț7o�@�@�@�@�@�@�@�2#@Vf� � � � � � � � �Q#P@%&&F|*` ޽J,i )ھ]#9?Z ̛'%'Dj&gBD@Řߴ: SZt~,/|(ӈ#`;A\r6mj֬) |`ټy[yZJay̙|Nkԩ?>lQO+u<={쳟 �뮻dP/_ƍVSko15koרQRms޽S>sꫯs=2pCsߦ5z2ҮWg@�@&xGP:3z1ҥK^z^g@�ذa;ڽq{x7=f'~%)[W^y{_~^s~03<S4hV\:Kk׮pTD V,[U?C�@�@�@�@�@�@�Ș�Lg̉Z � � � � � � � � e׾}lVL`K'WZ>IÇ'xnrJ`6骫-˩Q/#`# 'xBEZhoWc`j׮[oUO?l^NaŊ-*bҫZ;*UR2edVS1c .@rn!{X1^[)soNzc/N:)o޼m3<ycǎeߧ"Ci暴#`7o@�@�XFZ5`_~-UDH|ԨG7~cA�@�T .[:֭ޟfB[>~~z|qM<Y Pƍվ}{y'6{ 0 ꡇrBOtCvnO@v $I3 � � � � � � � .;@�@�@�@�@�@�@�@�@ Z (hB *lk׮Ɂ ~Xɒj9"trBb2m-HKNVr/sTwXdBt7rF^H/AYؕ=}AaҥkȑЫʕ+'csʥ۪Uv? Jy-YJǫ^[I?ouyU} ڛJk6+5j鵙>[Lƍg?isZKY'uF < � 6mGǘ@BB:tN-G,Pkڽ{wO � 1W_S#hԩ:b_lSҺ{! :T˗Wǎ֭zȐ!ێnݪݻ'W-R5{l-Z(y;/�ZPM@�@�@�@�@�@�@�@x� � � � � � � � �Ă@o߾X*sD bFUViܸq1{Ri̘Kk9'`iv>'OL AK/K[xb]f͚Ay+te?vճgO5o\k֬14h@/ڷo{'[C꫚9smۦO?]UVU<yԣG% |r=xK*7x#?\ƍO>NXcRZcjoذvؑ|}7B^|EB_~Zn\'X/,QF۶mfҥxقgJ5R lG`ׯ{1"ձc,ˊkyV׭Re?[{ojʕs )ma?;Æ ssh~~KZXym\4k3~Fs`ic; � gR-j,1p]bQ >rF<( 8sf� �*y׮]CXO?{i 8}}-um_Zn͛͛7sΝܿaWw?Է~{vO?uqU_~r;^z1=_+hƌnڵ}OPLw?A +}HV@�@�@�@�@�@�@�2"￰Hm � � � � � � � � �Q"`'&&Fl)` P]z饪YfDL@^ڴ n3  p"{nΌ^F :3B25 4:%K}<Žƴl2M2E-Zpp# mnƴk.7iԩnҐ!C / ?ܶs_..ijժ.^kر[-ٽ{w7^Pfʹw4?qD70-kz*·`;/`-\0ͺx6m4uIŊ;[J*̵iӦmOcdf<eV`] {N鍊nr߯\R>-Z۷Ny :oK63Ϯ-ٳ'Qsi(`Czc [@�@^KA ,,B:묘v[iO>=V<@�Hŋ'W]u}Ł\tEg_xI˻)cV|s'}_`-dBʖ-ڲ}Vsc3}1j(K{ڔL X@�@�@�@�@�@�@�P u� � � � � � � � �QNe|آɓ�k`l;t*sHNJ8k+H}F>E-4bŊ!Qݺuj>7zZjÇe˖WZ͛7'ꋧzJsΕ)Y=,>x%o޼:䓵eo*URJ%g}Vd'#F[oMs}`+[ 0) xJ-)lyX0Yf͜9ӝG`Z^ӧN:$b^1soy"nʝ)Ν[?~ۯYWRSpa](Q­8~8 kXR}חΙ-vl+#? J[^MY>Ll7e^#� �$or>Y>FXjmVvK s9@8@ )k&y~1ct嗻AW? M;ziݓ믿: Lmڴ.Є {v7p;c8M~iɒ%oTP!i 駟d6 o*q � � � � � � �_6dTz � � � � � � � � UeeQ5/&@<n8駟1S@-+)r=6L 89*:LiD@Ү]ȑrf 18JB {[@nBeu,+E￯CK.q,<i͚5Qo6˧{ }ܺf\#,^ Kmv[PUnTtvu=z݅A- /ԨQWv?zhuEfҐ!C< ;lT7nn9ߞ={Լysq]ԩ# $? _|Qޢiv@�@ ,P#iČ ޽ VرcE XoOC�@MQF};3*}aAV+a޽{jժ|X1K&vʑ#GًؾC:߷rô~V^Ms!� � � � � � � p�@�@�@�@�@�@�@�@�S@<*:~}WnB$ r(XPKGF*'$i-a1B,hݺu9:$YQ0m67*-_\Ew}Xt~wJk?z뭲)m;v8#յkWkioڵ*¿4-)E;m<ʕK7P+1r{u=hРArwO9'OV>}teeo&K6m,6+~gkĉzg0}jժσիWV@�@j00 |nRza݅Aۧy慡7@�@�` vm2efFTk.;wxyocjԽ{w%Kזx֭5k[-^޼yU@- � � � � � � � oa` � � � � � � � � JBKdO`jذڶm|eK;~ԡCM,r?$;[ �SF z̙ł @\P!7˂˯;6z-7Po<^7̝;W5 vn{eP`''9?cѣ4hoV`I>}~uGV69rDmڴO?.jg|JHHpz衇rJ͘1 ڢJ� �R`jzu_A!6/ҹzʔ)>(;UXѽ>0@�Ȩݧ-\d4Pf͚ʝ;VۅPr_ݰa>cYxֻᆱ'&UNu`[֭s}d;HY놺k@�@�@�@�@�@�@�@oj0@�@�@�@�@�@�@�@�x @,ӧOQE,L%mAEP,YK>ag8방KӤ~@ǎeo۷/H-L޼y ۷oOqA3/_^k.}w]$&&&^x۱cɂ:$ol8fg2k,=t{GQ%TvtgwUdOB,駟j֭*X`CmٲV>o󫯾]V-|^Kg%eU;wyƌ~-,4iu=F鶑>3g,eg}{9˲W) � @4 8}O4#@,T׮)'ТE b35��@�IDATc@�0- ղ+kaZIzӳ>.b-ZHŋJoܭ[7qO'Ou];wtv+&Lp̟?_+Wg *dɒF9x[;x� � � � � � � �L@-� � � � � � � � � P+<@f,,RJ \0*T2eʎCI/nV8/g!6iH9aDڵ٣{/$<3YwyGրܾƍ5k诿r߯^1_ݶ)i�- i?7K6mM]qرcemG2dzk (/Wn8p@7tm iB'x~/F)_|Ǵ{n7;f+gyg @3 ~7~:9)[04e\j,]p?Lm۶m[Lo|(*@�|<%P+VN8LU,Ȁ@Ty~9#   �Dmݦ͛7;Xh~Pwo߾ʝ;{ +j֬m]>}Ow:UW]CꫯAܶ>r-j8M4QjՒ � � � � � � � GxV � � � � � � � �\@غuԽޫyfx?PqFycCi9 Ec ݑUr>!@p,oO<q�\P!=ڵklH zge/_^~maGhTznG%[(2B.BZJW_}lΝ;s.‘d۶mոqch=D8qlQ˯ڭw}W+V_|SvfZ tL=د-[z˵ v޽{u嗻`^ziC@-[sŊ:x`u.jP-U>ls=z7t}_W^R.MLLth+fx 7FÇ/m!JfƗ^;C�@�Aգa6 58u,%Ν;ej@�SO= zwtW5q駟TNc&}+بQ#kν?b7h~ճgO-ZT{qe]׶\sl<:u]wݥ^xA:tHtw:w#$ � � � � � � � W\m¯ @�@�@�@�@�@�@�@�"F@9U 4; <Sn"viS?nk#9(j$džAAXNBlrj,"i+`aS(գG93[l!F X*^|׻l<J'?-6YL7*J*inTʕ݅+ZYW<L] ز-;+{aJҕZPw<k,7 U] llr>"K,є)S4}T[7gkMnuEJJl#ҠAwOkܹŸٸ-Jʟog[@ԊWҫac+_z@�|׉'FlY '_fTzYfΜIZDƍ� sI{6m0%J$oK"g+Wjg }~m#eN kƍHKܹCК5kTJv@�@�@�@�@�@�@��Z~;#@�@�@�@�@�@�@�@�"@VX BOn6.\8C 6*ۥgXaKNƎJ^{-zA� X{.I%ہӚ\y%%oZd Žd|ǫE ZhtI^ =9rĭo> 4 -ЁYthΟ?]|kf޼y7n|IoS-;H͘1CrJZpF2R'S<Ne A󐑒O G:*vgdJFwv؏� �Djz$i2~زek4;e^EeZ={  �d\ +TNҩi)0:5jH � � � � � � � )b � � � � � � � �  BJd]`ȑED#}ȲeEGX!=TKHHtK(&%[AT ѫ"ERT@Qi$$^s\`kv'>u3<>g} 2?J qtjl)s=G n&G]vlu!={v=쳗Wf͸ʑ#G|>9W;vLe˖#G]s5Xݧ~Z},Y׮YUtW$8Pkܹz?m۶۷o,5ѣG> doǎ5n8.]Z 6R&N );|/v%%>m!� �ذAnB=zB_`ҤI0eCX_j{wMx@�RA`Zn]_N\;Cv흂� � � � � � � ��ZxT � � � � � � � �]@-�s=ꪫ_ n7kW ,0:wʕx"0H'0o\pRժۇ@ yp�թS'۷OO>d6ҧO֭['^ziРA}-x®xDB}aI%JЀ[9yy <XeYv~ttN:S,$/iӦVZ_ԠA v]wup\w^q L?CْҥrZxqJ7K{ � @,/eR[ǫ^zʖ-[0p^>n!I%� @lڴIK.r=d̘1@�@�@�@�@�@�@�@  G@�@�@�@�@�@�@�@�@ j%ގ=Hn_Ո#/_>>d4c4w=6,];|gx%eϞ]]vʕ+շo_eȐ!!l<]t9=(S_ աC9s&ݻwM65k~YhتU6mZ8q✦;vܹS?l2 &ѣj޼&OFf @�@�XVj8Z]RW•?T^,|̙jѠ �+PB-_ܕ<B�@�@�@�@�@�@�@�H1+ !� � � � � � � � �  ?~<a;5$ᆱoQ\sMםZe`+]qEJ\m*=Rjwz{@nҞ=?K.�(y5ʗoÇj޼6l*VhOm( Ӳ[c*ԩ0`bb}C<?LVK/, !]l,Xٳgkղ7ԝwީ|vBBA�@�@ @,{6T� B[nܬY3?D.`P- j߾}w!� � � � � � � � � �)&@VQ � � � � � � � �@ڴi}!P+ } G+W~CbvurAԱ\꫗ڒ]`DiH骫XF3FKiB)[6i+Խ{; jԨ~Z=zP B!HFi&iFsq=~-mtlpts) }+r̩ʕ+UVkՠA+L� � @]kj%& Txq.]:OY~k� � � � � � � � � � pF@3C�@�@�@�@�@�@�@�@�0 :qD"x|6i$:R2 Lv#ii,)c0tsnS'];鮻Bp �X^5[,ZpM.Q#)]:|^sT}>t{9 6LonEDDBk裏jРA.8%JR-R-[7KGkYLuj׮e˪PBn@�@�PH@?F ԴiӤV!"`Z{־}d@�@�@�@�@�@�@�@�@�@�)  � � � � � � � � @8 X@@p<9Pv4>LO<D{兘X%nU wj֌{@gb=}G%.`-}H5jH%JH#ժ%M,m.}t뭱aZh7c 7ܠm۪jժ v vi 8PJugoZ})1r_rI-r[:%GǹO}3;fK!mVQ@�@�R ԺڝzAA:@"l٢˗HPܭnݺk4f 1&@�@�@�@�@�@�@�@�@�@ Qj%@�@�@�@�@�@�@�@�@ ҦMP c@ (L2{ i[2$ґ[XQ3mXCbٳG%(_rAJM7I I"U$Jը22 _|<x-[bŊoW 4d>)*o>gmY7ֺun|ҥKիW/_șu ;ܽny-:uvV:u ڴ>PJN( � �jY a)0aeΜY 6 3 rέҥK@ mX� � � � � � � � � �+p60@�@�@�@�@�@�@�@�B_ **J'N2BP{SΝ}ZDw骫Ժ^.Җ-_H#6I?.=tA:@� H?$srw%4jc4hkر.ijԨz3SO=˗Jw-ӧ}q{I/hÆ 裏t W*^xA .tv&M(}--�XU9S:p@ᇥBrܭfͤ7ސock � ��Zr FX֍7xw_tFNnݺjQC � � � � � � � � � j>m#� � � � � � � � @ ѩG \ƌ]v0b@h \}u۰6N j"LV׫Tq^W_Iw)7v\r:t6oެ..pܸqpʕ+O>ھ}{4qi�/+ h}"")&m[ ^ \zZǎ7߸8q)o޼:͐Aモ, )_WOʑCj {xu@�@��Z~'�8zLMhVj Xּyej�E�@�@�@�@�@�@�@�@�@� P+ B�@�@�@�@�@�@�@�@�@'NTs�g ZlB 64uq\B.Dz /-X,'# |>2v?,uX/@1ukiJil9ѲW8C֭ӴiTzuK*Xԩ^{M˖-_S.Yp̙zTB.]Z rgwjZfvL"4jTԪ4cFf5nXsuԢE|mUCB*U}TCxJ}2L]]jUǥѣB⪍u � �W`n/֝FS;SjҤI؍_Z쵱tKoȳ � � � � � � � � � @&a"� � � � � � � � QQQj].`3:D,j{PC>95 /ȅx-{z@` l,Tt]^@ݸq֭RRٲ)vءJ˗`VriMW_}:wÇk˖-)߹Tnqնm[YYz\x(tM2e;n[wۧC,{wiF93i62/0UTQѢEPt} ¶4f͒ڴ|dICiixWφ � �$Z`*o2e];"&LPʕU@@Yw!(`@�@�@�@�@�@�@�@�@�@�) @�@�@�@�@�@�@�@�@ \ҦMp>F b9XCSv<\!%HXZ8<|n#�'˅TIKyJ:I/X�_2f̨nͷroyԩS5tP_ ;xڵeaO+V K\d-Zٳgkڴi.j2gάu[nj޼/prサswyFz1&̾\-I^kw-V}/[Ҍȑґ#raaraa^,5EF&}j@�@�@ Vf ]-#`ZLA|5㏟4@�@�@�@�@�@�@�@�@�@�`Z; @�@�@�@�@�@�@�@�b 'N}-]\hH/ZK&,P1i)WCsҏ?ʅHW^(GZ[FK  iX}Բ]I7gY9|/dvaLW_.t)ReʔQժUUB*Uʷ/^\ӧ1R֮][֬YKjڰabbb'OU^]]tQÆ }-7V-Ɏ֭Ho%յTXbkN~YH7-$ZLK/I{zA.CLe95jH2$=@�@�@ V,@ \R6mRӦMm7=hРxnf � � � � � � � � � @h Ǘ!� � � � � � � � %lB|.SA`Rڶm~Gxj}R:qlEl[S.('qu(sտtԦdUFLt 7O[N--H5ե(n۶\DDj(QB T%yK͛7rȡlٲɶMrI_׾}K9v˖--[g)&/;?Pjժ9Ǡ7ߔ^|QnlFouKL j[yƎ^M{ GB,` ʞ@�@� L!.3!,0aΝ[,m@u܏^aN( � � � � � � � � � @8 G#� � � � � � � �  Cʐ!C5-*5yt5)x4g;KݻKgtn$Jmu}kَ'./vے ZP.H.;*䊅`,Yҷ}ݧǷ{nըQCu=hÆ @ nm۩J/T+-ct[?~wkmu߿_~c<y|!^UL5mTJRҥUX1Y)]\cرR>^@TYV˖r.)+=G PŇm$Ml}^*UµbCK>* � @pXhwFWz@r ?^7vR^r"PfMcٺ;"� � � � � � � � � �"@V)� � � � � � � � �.囀?+BS& ݺu f_2C[J pY ڲ%ǒ,[&vԬk}IwoiRi")22zF_<7N.I@ΐAxguAMw  `Gj]n"Bz.j/ ,ȑ#ϲp̙3_u@ k]̕ץϟ߷z]bպTS*RD}{n.iƌ3![~(Y)k5h8( � �]/+WK~Κ5K?px &H k֬.ܺ^BV@�@�@�@�@�@�@�@�@�BR@< @�@�@�@�@�@�@�@�#6mZEGGgSA�dׯn/^<j * 6o>wcJϥ4i uUr4/KLvRsz jդ#;QFi ӲcMT=/=|UW5I5uڭԟWDe˚5^V.R^Mv& *wvYe׹֭47A\ &;&(p&\BQ@�@�P3X)[ֻI|Ck.%PN_֥9@�@�@�@�@�@�@�@�@�@  2cD�@�@�@�@�@�@�@�@�8,Pĉq>JH^kta. " JBҖ-a0гraab_-O֓ :SNJn݂t9 ][ڳG8QZ@j*|ômۦ|P=Zhq`Cz3,OԪ%-]zR:vz$G%[6[W_Mno^{wB)OeKwr8t @�@e׋CT@� Lp ^{rk `Z-op0 � � � � � � � � ��ZO � � � � � � � � QQQLJJ.6mЋp ԲP %ӤY0 #&\ ,^,}&ի'9}͞-5nv 8&&F:tpIyoFO/,8MNVA|kI7K4b>ea\,(~}ᅲW^x {ufM)gN曥W^ Q7@�@�X!)uo r}]\#X=RۏƋ@�@�@�@�@�@�@�@�@�c3t@�@�@�@�@�@�@�@�] %<y2?~8v>JcaP /`F` Ȗ-Fcw/�gk 2:"zt]Rj^ԤI^�Ѝ7&ݶK:u>3eʔc[6/YlL5 nJЎAU>q2J5gTt^HU h]/C+WʅɅIhPʑ -{W0>"� �G) %sjjAXJ*傧s?@�@�@�@�@�@�@�@�@�c"0CG�@�@�@�@�@�@�@�@� DEEuqA ƎcǎVgWd!۶I11o~{Nnݤ PI|}8<X ;,�}i<щX~u)|?j֬:[ Gs8NJ;iᎡZҥ;uhT[J5jH"KlYɾsHaZnp텮y}cs qc@�@�O`rB4/ &hѢ*W\x &J ""Bk&P+Qz� � � � � � � � � �$@V(MƂ� � � � � � � � � $P+Abl@ ͛+ *TH:~\ڱ#;.[HgM+M*M(zA7IӇI8rDzUdIix˖IߞJCpɥ+(QB=zRj&h٥zcpcmR?_4I:vL:oH}{カf}4bdO?Iw!0<4rM~#� �$`{54jƊF~&``CZ@> @�@�@�@�@�@�@�@�@�)@V< @�@�@�@�@�@�@�@�BOCo`�4m4u9z.쵱eJFQC>ۤ+[oMЖ?v풺vyD[ן-Q7/RRoH<#Y}O3g_M^aCH;JQQg?<5^.47y ZnYgi BlU1cSan-}t{R…RvUWyw.M|"mxx@�@ <[]Rc@85J ~@�@�@�@�@�@�@�@�@�@ Laz6 � � � � � � � �Hu2f# T"Et=Q)P ]ټ9GI*H-[J z!Krf^{:!n˗K Jnԣ)SIo[\r>ݻ'tbaW;vH~bZ{Jfk Eť "bs攚7zΕ~A?${>TTձ{s� � [`\@( p?vcbbĉLY.%PfMEDD߽/@�@�@�@�@�@�@�@�@�S3l@�@�@�@�@�@�@�@�⅀?O?ԅftR4,M+Yƍ~cէNISH:HW]%u&ժ%-Y"'UƩ:UƏF dI.(*pR*ѣҜ9˄T|ڭo1ė?~;-PRѢ<*%,)gZ{ -}ݶT4|oRɜY&嗥_~}lkR2ҕWJ[K}J˖MrZ@�+`+}D 1/rvرc_ߦu7*}􉩒}T G*.p̱S@�@�@�@�@�@�@�@�@�@ Lkv0= @�@�@�@�@�@�@�@�$P+n",~ݫ/Y J @- њ1CE*\X&;~i6i`b`; 7>K>*i#rK|`BK`lYi/T+Q#ьs _-ȝ}{L͚wVIY֪U{r> `1 H=zH? Y0#J\->} B#օ[@�@ /&zB@lo6lZj9s_!C[?Rk Ԯ][s 10@�@�@�@�@�@�@�@�@�@rj]N@�@�@�@�@�@�@�@�@ d,P+:::dHm!CoVS+~ѢҦMt-7yD8IK&I:I+WJK?.7ld Kw e uӺԸzJdCsXըQxz(o3g@-۸џOݥJI~kթ#u(Y'~TTT^ȚyբERϞ=^ؘ4i==[:q"x/=E�@�E@`9R3Ydq3Nɓ믿_dɒ*.wsiSL)(KA܏<K  � � � � � � � � ��Z!}x � � � � � � � �\JlRC $m\0$R´XVyX3H K]'M.=^Tl0e^Kn H}$+}M* Lx`B^ wBZe.! {oСoy]rtX/hTxB;VڵKZBzM5RݺRҍ7J/,M&;vN5<@�@�HKK*%pG6G fͪpVѾ56m;C~[$yݸ,PZjU\O@�@�@�@�@�@�@�@�@�y) � � � � � � � � @x DEEQ'|r H& >oTӰ1czѣ$ ײP Ip kӂԪWx śARE`曥}TJ6azR޼y5 9Sj>^'iic<~| ٝ IŊ^TaoD=$}Қ5{IKI z[9ѳ4etHJv@�@�XX.@HN *`Z.V%^q.x(Z"HqUt3fԼyVB�@�@�@�@�@�@�@�@�@�G@9V@�@�@�@�@�@�@�@�Y 22@d6:blbжm*]thQ/paɓKJIw-~"PRٲ?ZO={]̟/ Mlz=eRFe=k[Y^2dHC'|R]*ӣHgDiLgСh-8۰`-{OX!U n-U&{Yɒҿ%kւQ- X1i0- (}�F�@�RJ` Ydߛ,lkY(/(UZUs΍l� � � � � � � � � ��ZvD � � � � � � � �[="@̙k{!jY *}'U(z"xoҗ_z#"RWR׮k$D}ҝwJ;zR͚j->}k;ɝ[,M}GҶkD:q LZMw2_HrPԼTO?HsZiizi~rҘ1-H9sJux߫v_m@�@�sʕg4<^"1եKzè%P]7o^e'@�@�@�@�@�@�@�@�@�@  #H@�@�@�@�@�@�@�@�@ 6ɓ'?;"@~ʗ/UƽA-P@J6uڷ,PtiiJd0g ٥=/) 3fxϝ+M,%eCJ?.F"RY\Φ֭K7˓ M?>UM9n4uM-  AZԶHg.kwe[.0A2  � jgɒ%Zudo<+@Z|r9rb@�@�@�@�@�@�@�@�@�YB20@�@�@�@�@�@�@�@��Zy.pq9R?s2TiŜ/,oR*Q"e@k-0e4bŔWz@bN^~Y:R%iR~bc?iњ7ozq_c* -7k&M($zu_~jԐ[Z6=C#i*i;̱ys+$s;7ۿ?ճ! � v^�i p Yj̘1J>}ϳ tIZh6a= � � � � � � � � � je` � � � � � � � � p9-P@ Ənv%[\QѢ҆ )7o6K/,LnV=ڰ (wԤһJ٘+W(4d={tAP$cYرR)ؖ6ox:v h@5 \B*WNzA4!۶y?m.i(n]-ϣU'>(��@�IDAT 7%Ƌ� �$d7'B zUL)CI) y񅛧T� � � � � � � � � ��Zr$ � � � � � � � �@4iJqu uÇWB}_4 &~t=ĉrm&J*A7/Bpp '`IժIVIӧ{r$]/К5k|Z mi˖ Ԫ\Y*XPrY$l)-[& _عK&05wn;%5?Fח&O׶] CE�@ l,PˮQ]uU @,YyTT mΝ;$DFj%m@�@�@�@�@�@�@�@�@�@ d C@@�@�@�@�@�@�@�@�@ j%TA0a(>ťu1vt}SOI,Z)\ }ԫRb< ^`Pk% YPrsSAԩSz饗|KNPdTݒmM JHcGP5ׂeﳏ>#W.;$ \Tڽ[ SlU*=$[` �[x(PȚ5!ߞr!C^#PfM͟??1 � � � � � � � � � j � � � � � � � � Ǿ\(_*&&ƅ�O&mȔ)R6CIov9yF ,�\ޓw:tt^ʝ-~_vz葠j)ƌZNnɺqf^ڎZmV!ԭڮ~4JI}/l)?Ғ%gח&O>7`V:p  �  HիB4@ dʔIVȑ#u8wOA 5\ZgϞ$® � � � � � � � � � @ |nj#� � � � � � � � @2 LTFƍ+GO,Py闲nԪ\~iJCD`ti0wCdP 'p{ҧJ.EFBo iRJ%9s-[R7P$ ")A)rTdefmP lgҥ^YO?I-ZxJSk � [ZZV_-P/%ݞsi 6 ћYi@�@�@�@�@�@�@�@�@�@ Qݑ@�@�@�@�@�@�@�@�@�` P+؏ $]vi>|x u+R *_>yst풵1tS[<)=t-k&tFH]`viSiV k]$?uT٤}MpGKKK+&xd2oH?^)٪ 9=͜)u%o]y%L!`[vg={_~[S&yfiHUJ]']%os� �ҩSRH@tt9-vѣرcoϾ .Ǐ?}Y}'E[ʽpcbb.D q-$~۶m]w|vߖitҝo-ӧw͔)l.(-;wn)Rwm[o 2:@�@�@�@�@�@�@�@�@�@,. � � � � � � � ��ZuƎym(jw*~iݺJ&h}O#ЯoPի8 L;W*Z4TFXf͚ ꘛwt /n~u7!_J-nliH{wT).]0OG\wxg,8wo ײŎR@�@�X@ʓG*\8[@@K׾}t<x%vCв `* +*6ߎ:J*iΝue8;f`fb]![Y\n̙e/ٲeS={m]Μ9#Gz'%̼yc@�@�@�@�@�@�@�@�@��Z~ĥj@�@�@�@�@�@�@�@�lл5j5k3zޖ(ZIÆI&0)`pgԳԵpܣxe!IP_`Æ z;>e|iUۻ=:t_?5znzR^K/IJ}xpT,ԩ?K.V.& kYV:hP+ �/pTkyk.vײwsN<yp-xʚ5o]w[%fBDeti{{.9 A)bɒ%\r[Эp#Gbo><fddnݺ!f`f!gv~rvW\᮷s7o^u~]<N^ z뭷RjC�@�@�@�@�@�@�@�@�@�\@�?@t@�@�@�@�@�@�@�@�'`5qZfBS`ǎ6mƌL,Pk$Vr˖I=&=ԸYOp8,L)^IV!'J[KI#GM.W T˖-cå…JkPT\8DV^P^ԡԽGFr.؜,/lffVmµ,dkp嗽 ղp-[jB=/ � | xߒFjJNhm߾ݷ]og/Ztvȑtؒ/s'IΜ9}=oϾ& ϲC$GMַ?n<x~~۷tZebt}4 7 زW^yzɟ?^uU3'@- uWp � � � � � � � � �  P � � � � � � � �@4i ۣS2gHw˵xq_z&lV D p)+&+Ԗ<@p%k-J`M=d=s9~+5k8#!~){bAf.=^%9))$PԶX7KeoZڵzAUſ6J#D3 �]ZFV-t#?Ým-ijuVss>ѝdP’byʕ+Q,%Kb!W )111ڻw,h-v5 c?%w*~.mQ]"-8}g}'P}ڵy+@�@�@�@�@�@�@�@�@�F6"� � � � � � � � j/c'0%4o\2dH\!WV'NHi&mtЕ|5A'Эt5RAu:tңJ+ED\ +QO?ǝCO`qsk7@^,h\9?6DXPl?X׽z5aÙ}矗X_j@p-[T\5@�H…u&hG6Y`wBqF{ӦMN<bXEuYRlQ]-ɷ" SL28t/X˂zJ}ҤI�gj"EThKb|5v47Ȕ)ʗ/ jݺu!� � � � � � � � � �#@V8R  � � � � � � � ��ZAxr $3fиqoҡR$ JN|ƌ~ArsRwI/3!ɠ'0_.}'?pڵW\ౌ/e$xg?P;d}#POȗ˜x@y{ ,š('楗-:y}XZ2 z-駥9 lYX瞂� �\R`\5`KnƓسgVZDmڵþӦMB J rj_/mCA 2ŋ-kۂ߶o߮-[h}q xbѣG}K:/Yl)Q/½, .K͚5}Z<FƆ� � � � � � � � � �-@G�@�@�@�@�@�@�@�@� P+75kVD~j"諵@-+P@eˤnݤ_n"p1hr^�Ŷc= ғOJo)=L088ťo9rdM7I'jwdNMxZBJ-B;w}T^]z!WЦxUF~sU[Hz&`O :/`Q# %*G�@� @- O?˵b b,Hkݾ 2fx:@[o Y-e װԩsb;vB֭[wz>}ɖ-/\lٲ.HqIXP,PkĈ�23 � � � � � � � � � �.@VaƇ� � � � � � � � � P4<@F-ZЌ�J͈wSf̙5kwKnL_Vjap#i/8&XCO 6Lw]Co|:~.kUŊEry\5ڴr{s4p ʕ%7>Lziihwo}KS).!U-?.:%-Y"M->+tgµ,`X* "� @� XCP8NV^ŋkѢEj/Hk׮] sέZjNKB .;A fϟ?oW߾}=e!tZr~'m۶ͷm9 TTUcҥ@^Qvm:tgc � � � � � � � � � �.@VaƇ� � � � � � � � � P4<@nݪٳg瞋QRrz&N$S^#`A1zIO<AEUvaZ/ pTk :4QssV1iDםnYJF{/X˯Qe, nMz;t \/A =[uN,µ,H=,T ز`Y  �-iZkqv7o溄1]t;g: 2iѢi͛7jX� ۺ_}T˖->sTڴi}5jϩZYʕ+=ZYd}n!� � � � � � � � � @ T� � � � � � � � �$fq .WJ`ʖ-n %JV&q>9b4d\T`s^yErPVޓ|Rj(xNz.'5V=p@̙SZˮ?^rQ+_nd.ի'Y۴Ii"9rH~(u(=T'e|Xj!<tk: zLn @�𣀝عB~l$�>N.\3fh5kk3*GywXiH@vwnݺ%{ƍxb8 ]nPϷ}{JϋC:w(ݢ � � � � � � � � � -#� � � � � � � � @ X/0j(lRҥK|%a |U~cIݖ}:<~ %G..< u $u*-5o~ʔyC?)pheZ]Q?Hݗ]SdfͤW_N&OFi$^ժIg˽瞓i>@j"^Q�OgOi3[~T™ % U � @h XVr55GsPɓ'@)g=RBk۲eu>H`b|˝wy֭Ӝ9s|!xƍ/,n^ΐ!}RN-fߦFӴ� � � � � � � � � �@o@�@�@�@�@�@�@�@�@�� bbb7tؼyqx*tiiNuem[=PV. RBR.U`[z)Iȇ C ~ۤ۷owD `?7t ڻWnbXw,.7ɂ\n/P˝vRP cF$&{6M7IӦI.%ը!u.M$: � pjܗ,;Cr'3uȑ#]Xy}?zjug:0 i+A@%Ԯ];O/5~x]wu[oU9sT&MԷo_mܸ1U_vmZJHi@�@�@�@�@�@�@�@�@�HI ) � � � � � � � � @ Ǟ'M`ʖ-͈O@R&k\vS/$-[&7>}aX{XhEڴmSo.]^Όcǎ7nwf%"0p@zѢEUO?I3Kn~-}\E:>L< *WNzmG)+~:iSOI&$aA[nz7IԠ=/;^z� @ 9…i&w?~3?׮]tR{.0vΝ;\=F ddɢ[nE 傹jԨQ*Vn׳gO-_<mZ7yX4� � � � � � � � � ��Z%O � � � � � � � � :@ WGQddd!Em$rzustB,8lo3H5jH[@ L&}䲳|A+g஻}׌1Of-[hҤI^[ZEE,MRi*R([UU~[YB(!TJ${"h_?qܹs>̜{yY}{qlG~=zF.8"0jǸ!C->+F"yg$wYٳ_~:zRNRjR׮wu/mZd͡b@�H˖rS �Çֲ{Zx;oyZz*Z%}X,)`[{vyHsՏ?}Ij޼5jnMvo(.O>)P7 � � � � � � � � � e4@�@�@�@�@�@�@�@�(! Jh,Xp~m޼Y_~eH1r6l3Y#qtQҠAyOXBޓq]Ho;N*USOeɐ o͚5ݶp#b/u<k3~1/%PtҬYRR6KkU3%@ݺKO>|RZ˅YD6,|oP� PjMWOݐ>H\ם<NFwsfoY-Z(ۖG�>+BSNբE4p@s=] pWڶm[p *Z*E�@�@�@�@�@�@�@�@�@�$ P+6A�@�@�@�@�@�@�@�@�noa, 4xW]ǸUNR|(1 4j$}}ޓ^xn\pL1P$Jg¡<#.QG-! R\/\Kԡ$\:y@}\rqWҊաTq*3܇Y҈uX^Ba"Р4`@d{/Y"}tmRٲ-H͚]^H<"͝[,b! � jm+ҭw&z饗tAkԣUre}\  ]Rg̘»gI&:f6lx@7niq)jnj � � � � � � � � � BZ� � � � � � � � �)`Z%P@@ճgOu҅@ށZU='YPPE3;ejA y,|騣"wcH*޶;jOOŘxƏ sΉ M$ժ%qtUیֵ4vl-%P_HtI-Q_B,|vhirE+k+WWO}ŋ߄5D�@ ,P]dlYm5j7nK.u!k֭[<C@�\o?{Zh=C>Xkںuk.sl?Cs)،L� � � � � � � � � ��Z)h. � � � � � � � �$V@z&cm|.25j(gGݻ'Uk̂ 4c |>P?3hT,!*} T-[1g}뮻Λ~?~ƸHd].Ε<3& (ԣG aMt ߲E:4qcYش)yRժy_#F񳔬ǐ,ӗO=,l_KL(y6UbgynV/HἙ*L;N"[ T9 HZx&,8}dAKO<!au߶Ŋ2Ŀ{3dSo-/yGCyiTs_~<ᄏנAkIHI x'"G�G6?s>Xv�jժKIi ^Ssʍ7ڹz ЉjC*Scaty~wܡ;]#:r栃?}&a8 � � � � � � � � � jfd%@�@�@�@�@�@�@�@�@  g@tPu3hΜ9I۶mӬY_^JyF_zuu:ɥ|G'k׮/Ӹ7״iI/LtIzTÇ`sEEWD,D&0e'ؿJ)|2Q 7Zn&`7}J} AeְiKC;vlCNӗ7|Żl,P+ks)._yD>s\8{s,ckWii� j~u.s?C8 4iX۫\9kHШ幬^M pҩJZ6:[r^OB>3y0(:wkOv\>䐢[F"j~g}ny}@M"ꦎJlH"^rA{o w}G6l*vݮǍ>ZO?tƽ+M jRIsl!%{.ZoBT}|jŲ@�@�@�@�@�@�@�@�@�RZ@|4@�@�@�@�@�@�@�@� #`ZvW2o X8Ց.a֭~AѬY]ho>cT)z:-]wUx ȜFaڸ \͘1#eN6/kYtN9j瞺o RYWAk6j̰ٟyFVɞ+W㋬n927J*wT^XeV2MV=:X{0u i^N:)vz ZIxNСCpzGNp\'( iJ.D9 _c$eM,-KN]X]-);>ꨣk<CT(u"?ҧ2JcH;JKݻ˅g[Jr'k)�jh!ٱ8Yː!C4h Y=jԨMMvY@7ޘuzݕJ]%ۺuk}ىj硇rשTJ=.,'5n8Hⱷu({|ӧ OU~C=@@�@�@�@�@�@�@�@�@�RE uzHQډ� � � � � � � � �)%@VJm{K<yr4 JRZ5UZ5c.\ñN>]\OY4h >:uG͘>|u;j׮ GԹn5}t͜93cx~/YW~:²v]o#g'n6;RxHNDA U, ;?୶ΪǍ;N;cMJg\iU/1I8Ǵ~Asa(&L/mDϛCzsdŜ^p5l)}t4 {K֒[;@k޼yZ|nKtqrҬYrAҋ/FIeYfv3-?y]OW;�jkW4u'ֻ\<x≉:X`N;4w^X|̣7d7n试˖-mu7l0uH /{nӦ=SAl۶;^2= � � � � � � � � � 2j̦ � � � � � � � � h.UR_ Xǒs~޽KN~2ًe˖Gy~4~!C; /;Vzuz裏˰a馛޽{6{UL2EQذa^{5?]tG֭LJMcƌQ~dmVZi|QZXΝ3cZ\і.9\rrʕ䶝2&;vJ&My:7xÇ\x8pp 3?~X b[wyر '~,n] ۿި%0u"(ԩrr.og` ~zRP܎!d+MyEa ~z:h3<S;찃 Tsjί-ZyN%dyTyocy Uˈ;H֦MKw*|\l XC|PW]u=?q _zj$喹�3顇5#[ZE^Î&q/ܮ'^ 's 9 :\jii= �E+`.\Z|󍿗j­`%c?އxλN>dBZ{1~yڵhw ݐڥ#8"k팙ryabkv܊vߏ ;Nf|Ǻ+ta[~5F4ԗ]v;W<ߣ̙-m#k{oc/u<gqmۦI&y+cCr-{J^~ό3zz\ 矯~I#FpE^{G}ݍ/2?[J,k9gZ@o r?jJdT5K/QF۞ � � � � � � � � � �i+� � � � � � � � �q <CAZ✛JZuԮ]c8 0`E׹g:| NԫW/pOU')R0ydކ�(?0.*8c9F? 6 yu$tOOvouh"pàN:lq}$4p_.+8묳el'q`5j~n.+uwa`ܯ3)mڴ \癙:cpf 7Ko&eʔ xm'9h4.�۸@QF5cew^{釹``ݺu~e@4: \(XGmf_rEAкuG O? +ؿKz.v-yo=T ˋ{,~%pAгgl_\.0÷ǐQ/5iy::M s.}9ڟ_e(ƹ`]v 6o'uvd7k݉xomkg['1[r 8 >={l:.:&L#Ǯ+\ocŷ6?;.v% ~z(E'znsϮ\puжm[ޅcg4,όo<8c6^ �)ۑc= .|*)ݨc tѿT:(wrAAժUc]g]w6=OFe rTqիWsv嘽0j˱{6mr[;񾿟)2>ݫy}ê]po{ ^u?aÆ ˘.#G1 fΜpgg5k-Ӭ%mMNdo޼yЫW/=l4ۉ]/?c~K|-'Os9'p~q7w%̘RgEY )SREX犜8 (_7QThIY֣XBH}"f"� � � � �"toP68�)-0{2Æ`ݐ( � � � � � � � � �D+#P+9E~` ,X1:8lO1{jYPVXH),a·uf 0+`~׻ugChXa<YYz[re80 .f͚KœcK+_}\t…cZ2S[;6ے֬A[u-0ve!ck$mNӭsVk_ g. گp6֙3#>X]gAp啑ZM탒ڿٖ%5}Xk@JYMF.ŎoiJvn}i=L% ɭe3fYeXr; ۹cK\矹oXQ.>.4)6=VP_:)%/6Gྺ\ Dbb;/p L.vs r<3$X`HA'PhL� `r>aʒ~7tS,�KUөS' ?~|Fg}vYNxH;q}ؽ;|O~z_ ~ߌ{;ٶ[o5cR G}1^g rF~rFY^gSmڴm5r Ԋ~7|k3:N0~aÆ32-z$Xjxd {6]L,u}Bx=<fOQ>axAuKڵkAgc '\.<4} d#soZ0(ly@�@�@�@�@�M@d"]@mS+@�@�@�@�@�@�@�@�(JҊv駑rVW^F;tJ*iܹo3`/5kqZj֬YF%׉ 8P 6 Vƍ|JܳgOp%?={rSgͨqUÞywqr/eL:7xm/\GuA7Tv4x`?TT.Bʌ6,}m=\]tɶ(6qlRNA5upm;eȽVp1TVYfiȑ6lX8{K]/\grf:ˠA2bvE&ۿ%dz-Kj{,J,4o_i1;ysҎv ꩧr1L2E/iԹORٲr#ռyss=Oƴjʟ<#v~1AC_HKf_g?o__0Azq I ^OQu.\p?tEXA].ky?_:To3ΐԑRKwޑb&Y Ɋ+5jQ \!1 �'Ngtaŷt]R^m^ ː!C˯Zvv.oÇ{.)Oco\8TF}vl2?vA}饗}ئ-Z.+6n_dx��@�IDAT^׈ue[P.37\ 'w}w>oۡ%8ꨣ;G,˗/'̛77 hbJ>_5m4~Sb-%xcǟ4}Ѷm[ڶm[!�?k&p_oo@�@�@�@�@�@�@�@ʔܢY2 � � � � � � � � � lٲL[!Vsu [~njQthZpޡC?ʅxYgV,<ˊgE|cS<^-:|?X4z{킖_~>Z6l͙3Z/+ZU߿꫾Cg,c� >}LcN6CfuF}k8[o:]b).Q%NW5|Zq@-+&IO<!jZ[pLa%y*;4Og2#͗ͦ}X;"AZ&YMgcd-M1B|pFjY~K Yh06axz~g% 鲋Whs|.[%!k HЩtEҺuח9>2w9;?S|}qM.T|ᒻH9qD$p˂jԐڷn!(z2k%q#�UΫ,6=PVu8wv]rJ?Iڵuwcǎ~f6<۵]vg}od[L=`l<Cܽ'ԭ[lu]Wsi<8kΏ@–,bq zmb%XkJ[H4ʕolo)sⱏd}#/j*Wy>5W.%r@aP _5!`CyJU2 @�@�@�@�@�@�@�@e 8=#� � � � � � � � � PeVwբE`Lm:ud /hF;>˨#|~zo\/ c=;Sr:,2u=ye˖o#//:U<<F `eY%eMwŇmZWj4qĬ{(B^s*XXPe?{6l7BWmR,uacƌɘ/|aTXLJ:DVwYxw߅ݞ9ܐe_ŹT@|O!;N#8 89jԨ&axv|4O?=beZg_rH}%Ql+W3tXQcTٷHk$g^6>h31p@7,H^?#yAJB<oK矗 ,<[Zn˵З_]Ch]O** @ uԁZ\rf̘ѣG'w^sk?Z֭[}@KZq߾}ݽ$w3-M69sN;4ږgˍ.:ٽ!uE/#ױSonˬb'(^^zɞZJ0Jo)ˏ>{HymM4ב0TZdܡM1 A 9}orlX[aZ@�@�@�@�@�@�@�@� PdY: � � � � � � � � @ eʔW͚~a9>sUti͛G[֙uk% vxWW_efALpŒa@ׯ>:<W\q,p+2x`RY 77v[\/Bu]烻ºī*|[$ѬuڵkΏpi^mue=3~l'ӊu],�m=? �;4m4=hyɫ.ҊujvZm1a Q.8ݟujn_߿ 9u֕+\X(<y^KZԽ{w=STok͚5wX1[Gj)W.v'P^veZO?6o\&$d^ ±LM2Wd?3oľ;LƍU[eZ[ժUܹs](SUTI_` @r߯r߅ϛ'4(-#!,ØN:Iza_Pbz=,L� PRj-ƅpQM]mݦ~O?-7y^skɓ(Nv߳K.QΝE |we;1b|I5f0(iS֝wo+6+ }iN-[Ͻzjlm޻@Z-# 6hŊ~ }r/.-#6$ⷔp9هz.yS,X={f}t'M!CV܄);#.7}-ǔ(K:n ;')@�@�@�@�@�@�@�@ n<,n:fD�@�@�@�@�@�@�@�@�(N;-z%lܸ/:t5רz~خ;<-hc??.|7-.")aocuA 4!]|zFRʸ;<_\<P۷uo$f-aa`uCɬS갎n 5jzG4h viV4fWP!z)SЬ&mtsN9g,:Y}믿lN0A`V,,vAB6k,?M,u}>m0tPv 馛|=3~rcLT)wߙ6D _JF4?`w辷ľ/BҴ_|a-doPB!;d~e?*\E94-83{K3HxT%WqHRsmKt@:ytΝs)'^ҹF\vfΔ /-y"L矗IU,g j+vGP@�WΥݩLҗ+>ܥ=d,ynoZ 3<Fi>x݄iZ}>_H:ыȑ#g^VڵkwyGgU q'Dj?a'vXɾ4zvPO >{eOw)쾴Z~;e5Yx嗻oLe}JK,M> GbV R"k9O,DF':Co[Ga}֦MVj?EyCYVh E7g� P+6ME�@�@�@�@�@�@�@�pAA�@�@�@�@�@�@�@�@�8\MPV8f`}7o\r%{uQو#^zi: \U0hժU0wpdB͛7gp}zj:>O<2k|]>pW[: N<DFkW6mשh±˷[n1cޏ?8pL6|\ⅭW~su駙:uju;NH3si]nuϘǖ߬Y3W^y7ڵkzmر1ePbhѢ+}#N>9|0j^ wٷBrY*U nJ*ܡ3i 7/zh_oٲ%SNp 7$4q͚5 \ͅ^g \]A6Eb_.$P ~ce ;iDk4kgww\w6/P^ԩ/\E(M2˽o-_>pAApA0fL\d.ד *Vpƌ=vϓ }g`B@�LvˎaV^@TT)8묳Tc^SwcT{СC6ϵoC6ݻ=C|6+4h.|ɘL>{5wН}}xwӦM~zf z뭌.]_|E{c-u>ɹ5:?ӜuaRھ{.4:hٲeбc/wz :|AnMqfqªos񿅸4]\8WpI'˖-uxmiy?ox>66zv Â?l]0`PfM?ݾ'>dGb ;c:_7>6{A U$Eu]+˻7e=07n S D'NLS3[w+B3֮|~y'6M ڶmFr(P0@�@�@�@�@�pk]bg �={{aæ`.&5o( � � � � � � � � :?.ٙ~% Nƍ\!:4[MlUFlvZp&5lPUTolmٮɌsM[Nsʌaظq\ȅ\\犙 ?7o\'r]9WtUWimy-u3<S7|s^eg;2:3x_RV.#FrW:%r:xBmb[{,.)( (0btR^9ɯJE͟?ȏq4/)gyշo_ֵ;\"M*}Yj\婧&뮓^zItyFugZy`(E%~GҤI_ߤ:wk];BjA7~C`@� qˎS ݯ+\]9?A:iȐ!<xp>}ѣ\,Y9tmzjUZ5Yg( gjzi:GfU~}ƹlqV sѳ:ڂrw۱>݋7э[Dy4E:?KE{wد_?oo}4*w.z Y [->7X=XJt00-U^]?\8Gj*߽k>\1܈KX˩(+#"xHy9D:p鮻qsJgyұǦvMǵcv6mBHqX' -P F � � � � �$Xuo7 S @~O\.ןMc@�@�@�@�@�@�@�@�@�O`wZ.]+hd9\7oXf]vٲec Ӳ-Lʮs:{sU$ì3ݻg-tu^́ZY;gAcӲb:-l[{4DV:օ7Sw߅ݶ1s$-]taZ2ϏWw߭߅J@vSΜe zɎӧr;ݛezKgM\:ϮyXtrKzRr P)qQտb4y4q\d{:`P-;YxIrED�@ 6 g Ӳ5w}1vFCkˋ/XTjb["*öX krmA`sэXzX֭[^q_~_v٠ALus'?G,%~-ܢ1c9d;r%{FWX^9iH_{fL(hb}т˗/[F2` &d/̋bˎ,{Yxݴi,{ܽku-$Xށ?@D&y].Ï%2g+j�/HB4WJXh*@�@�@�@�@�@�@�@db m#KG�@�@�@�@�@�@�@�@�(+WNO?-׫r<VB<((p?K/SOc5l"|bC\_: y#3ԩ#ը 쨤~.aĈ:%7X竔byI7Ǥ%ק3ذA:dI鮻vkݺ?iWVb6&Zzƍ'X;N:)皬c..Cd<=9z '$%u-O֬Y?DO,x|vypsyωt啑}"oYV?o;{4Is{6]0e%jo.A زKҥKG%|,hk׮ @�"v\J|O<ь9_zݻ >_o&v^a,^Xk.ٱꫯη-[;MQNн{LAQ9-P)wz)5c +ID9sϪJ*Kd K2aSL6-`ާ@.7aEC߶lI6ђ>6'B�@�@�@�@�@�@�@�J@^@�@�@�@�@�@�@�@�@� ˍ9*Ӯ[nEC Iz3F˗1SGsכi:Q=dA矗O>\*S94:Hwy=\Q?cyU(H7K+d U:;VKo+-::I駟^xx$K{7m6ߙva`rԼy5$8]uU9OPk׮UJ 8W1Nw,PB}]v֯_{%pt=>['ՃȅJpMWnCOpi]w\*)cKՓ <luVB/5kwty[7uVBZJh-B) �XJyRk/˸ >};>رcg}A9,iK 0`n2r9袋.R߾}sp*TB]jv qGl wA]۽obYJ~Yg{uaGI%KW^ы/?v/'Ա~A 3j=S>(iA *E"@dMJo@Vjm3Z� � � � � � � �'@VmS@�@�@�@�@�@�@�@�HKƍNJuK֕zԭ[;جQsWJD`j d*Ow}Զm[}wP˥. @ -=.9{P5j:ի?q>S|\gRӦO8R^RLQ/i:3]R!RȀf{o#CJo!=ル]Rcu PX˅PI} ײ_! g=;LZK-k֬-@q`P@�^B{O:^z%=np ڧ'>K$ɮK JUBnrظq=Y?w\3]#ӧ3<{M{G1jmv'׾}8j`T\ %JԊe Xݧ�Zh) � � � � � � �@]5 @�@�@�@�@�@�@�@�@�?5ydxVQF:ֱ=9Z]uH}]YgIp^!L J#h%wHіׯu 'd3 *U=)g՚5ϧ뢋.ғO>IVRnmTn\"m҃Jt`3h,`zdoSHrN+}t$eh-WzP#޽{v5k$X@�BB5cF.hwf̘3gi„ jٲOﯗ_~Y{5Zj~Ul) O*&\vz-]x.`y_x֥-y%=L֪A[MVd~Dʬ\ ,@ /8Iغua  � � � � � � � @ %Fς@�@�@�@�@�@�@�@�@�H^7|wգGmd²,l%nҸjhQQ @ 4ot啀 /A~\ҰaFZqi&wq ,ī9sF QAκN4Y[?{Ǔpd, O"K/8]Z YPttK lnv1WҲe /Hvbϝ:IիKݺ}Uի7x#US @X{s=ueiZdn6[N\pj׮BŚ/믿+V;@ X_s5>A[w\]rW;pouM7I&%Ѯ];J|+}. 2[[QHvO1<J}۶mo_M` � � � � � � � @ P� � � � � � � � � � ]`ԨQҥV}$C׿ͥsyRʬYgE wK' O1G 9S3嗥M"wѣG}ܧ}ܹԳge͝߅nG\9#Z&5m*=|lo!m)VYS[z1i{vL? cDd/f]jȑ%x� P�K% / Z,uQ~+, 9N;M5ATABw,,�+O?4x`w^|U=zhʔ):}֟w}W^x4hT+cZj$1aVM,PHv /Z Ԋ5 � � � � � � � Pe,@�@�@�@�@�@�@�@�@�Y`͚50a~dnfҶmid2ernfnu+u4 -V}C׀5On/?R&VZ'mٲEonᆄqXg'.Z!iECL/ZWz-G5rnR6q]wSZre�{naϜ)M(M$]rn\P\ȲԹ\\@H4SNqm;W+WaųT� PPߏXtX9gz`uqjKЙ:u\s5>tRJ>e˖~tП>k"85|}Wj/ŝeU\{) DnӦ쳛 VX9s@Th3m,@EnZf; *_>0!iS26&`Zer?� � � � � � � � PIe � � � � � � � � �nX'Q|L1,WH}u7j=cK>)$ gHK^tͣA9Lq)}JҫW|rISy}}رj%*4ld!lIMJ< ڶC.ȥQHB똽y@O>lҶme XhVB ;<߿,Z@� -0~Զ\LJ ʻDW^y_yO?Ռ3뵃;ln6k?ڵk+@I ZJ}tozj+W9wZj8 eC3,owA~5*Iv] jeF&P+W%'ms7,@� � � � � � � � Prj=KF�@�@�@�@�@�@�@�@�@ )FN:Iܨ-t>_3-PM`lw1cJۚ"pUҒ%unx뭷\OSկ_?!H5>,P;qXD XЬYH]J]$q\@BdI~~iMHpY 1fi5}?}TB$D% :`NӚU裏ȑ# J ) � 0&^uUذaCB{lݺU?/R_}k5۲e5k`- orիH@wjΜ9?hjAZ/SNjҤҐ[h?c.lٲjݺMs9']V" CVf%Gٸ1yG˲ y;Z]� � � � � � � ��ZũͲ@�@�@�@�@�@�@�@�@�Hr 6w=ܓ-MX!rtr%í#u>R"Wdc4 L$YpK{QRssO?=a;WXQ}UTu.w4ԠAR5$@r?]xa$tͥ+wܞ`2Ь4pV:V_#ĉ뮓U e€-;-Lݻ:,pY;sab^@�"pP7�"<ͫN>G\| jd_y^g}{.{2eʤWZtR͛7O?-nb>g#<҇h5nݿ*7ڵkiK~R֛@[y۶kTDA vQr?SRH`;6ME�@�@�@�@�@�@�@� P+-7++� � � � � � � � � @|ǏwzmPϞ=㫠uMRWdžƍrFbY`2it^_-֬ z gJZG qI? *jq{~OuhqKo GJՔ3ϔlq@jZ:4n8M<׷+biu~nٳ غw.Z.@6uʕѣu:!�;͚Kbjժ#8?W%{>HhK8sL Z~ԎӞ{ \2p0 -@2 lݺUK,i…Z`1ߥ\ {l讔w7mp:%Z֮vZKu뭷j\vR,})JD`Ӧs%R@e)vba@�@�@�@�@�@�@�@� PY2 � � � � � � � � �I'`mu[ϓnMA?,=CR*-:f"P+6ᇥʕ3Hue SO˥u$O)#[o[jF] .*~vƎ%P+6N 4�-!Cֹss\R48@EI%}?[g-m,5iO9o^{9r$ZyA1(! : -!;˂r] ЯMI  t ǏE`L2Sزp- m#|]n],쒅)$PB,,k~~^hѲ/;tłm_@K-ZZڂ,8`7P6mg}ڴiիW14W/j@-GA JMv.m@�@�@�@�@�@�@�@� PY2 � � � � � � � � �I%eY_TJ *שdZvA{ooNu.KW PΓc= ${cI"ΔL-- qcIhǏv~x~KN=zH T)ׅzU2SS͚EBW ,m_jy5q~d'JÆI6_;Ghò޽{SOղe|8dG�(ի?,ԈX:tbE^pŒٰӧ^1v[T2KEwCŒveU?s/� r?|rsKfz]6I͚53\"kWfm!Yc=P 2Ûvi'5nXSN%P+6*tNuHt@-6-K}E!`IJ y2)h* � � � � � � �@(-דB�@�@�@�@�@�@�@�@�@�|&O+Wb>NYGK::}&MY )4xpi`U`i�#dm'.`\Ϙ1C\rI]: 0={rE(мWKg%\+=TZ.H2 %-4iR$\'nV:u'`k#+ѽ{wR_{5 4(2@�J\-̣Ko CIY~}m2 ZdI#kgnD Nl-X+|ԨQÿ^a>Wu*U槔]vx[=Ak{b ^Æoݺ5Swqnj5 ckԨ;Vn]c]w%,+\ߴoj%fjLk@͑jc«pKwMѲvl@�@�@�@�@�@�@�@�7JΞ%#� � � � � � � � � TGV-{&U1\#l)tR[ڴ9O#nߺF-`A06HÇzֿ{~;wշj-v=aU&eEjIZIcJj%&JF, &\ '5k&=Աcʬ E uHyXsDµ&N^"0\:w>V#],Z T�J`ܸ}0DIq å%#qƌp- sə}F8ӪU/r,Lr.Tvi'l![6,G%iM+V� .M|Nҏ7m$s73X~֭[u,<+-D.M0 ϵE=j׮->@'y@2r߫^% %`å;TSRH@X4@�@�@�@�@�@�@�V@ݴ � � � � � � � � � X'o.gbJ}d OF&?G:Q aS/ (e? !Jj ?^mڴQjŋ H@-#l P(.]o ?\Hx0 PO?sΑ6or.wשtua۠ �PJX÷B]LYӟ+WP6, g({XhLR,* *W~n&چŶ~G2. u-g�.&Ҫ9|-<9^~ [e $L6l胲,,+�-{mKI]v}jƌԩS-U>9:}p_<E I/`LLJ yR@�@�@�@�@�@�@�@�JN(9{� � � � � � � � � @L>]K.U^MАCΝ#eA~+n_̕ÇK>[2, M:ZҲ6u$tu-T 6)+]2$xزeR6F;KcD /Lz= RlEh.E$ 5]Yu4=eqz8Q/"% V:7.Q- @6ᅲ. 96d�0~tRYzw`{qF*{l-aʔݹQ>#* )r ̲m!\A]0+ ˗/}ffY_0 ΪXbFCA W:u*Z!J=Zl0P}RHz rsEεRhT@�@�@�@�@�@�@�HKPZnVV @�@�@�@�@�@�@�@�@� w}ulR<IGIӦŏ^R7bjoңzf_#/vFfŋuQG%te]>NV5o.ZIRQJ&#~f!AE("t1e#e$0'nARE:Hl6@�4nTz$[=b-3fH^*]{;\lL@ o^Q,RvKG˔!P+zKD_ԊVu =u. fO  � � � � � � � @ ? � � � � � � � � � @i@N83h]m 4[Nj8ioJODBN=Ԭ2+~+uH{ Ə5k60,d%4ݥcKÚ-`~*'yfzuq!ZkGzJZ@3'rbǤC¡#A1BZ4֏"� R.ۧBkiciX\:Hחv ֿkNӧO׶mJ*$P+vY7مw)PvmrV,_\r9d( � � � � � � � @Z,,@�@�@�@�@�@�@�@�@�9s~g+%_~=i4 M *bjְugK;쐚@O ϗ bL+-k4i$q.*eߥZJԣ-^^��@�IDATkZtoK&H$}I񶁥!+ ,lhX! ]p4~n]IKwޑ֭K嵥 @ XH[m'`,2^xAn`<!о}{ZJfJb-2 m>~D6o<w U )lc~(pʲeˆxF�@�@�@�@�@�@�@�(XwRSy7M"EEIQe{U^pW׊ۮ] UD7=\.r۔|>Ô$|$΃� � � � � � � � � @ȫW&M䯢Zڂ:vN=5+mZoDapiŊ*M{pSrpvޭ']vݺuRŊ6Zh tWp-5ZQ/)PԬtᰗ !Zg!#u"+'n-=`8s_`@ z9zmP3psHK=]K-S&Mҿ<ؽZs@B>^WT)iiǎcR>^!� � � � � � � �q P+4� � � � � � � � � @nݺ@AV`2n4eԷodhZ7J˗G>jI_:t9&qLO[`Z;Cj05nKDۺukT֯*UJf׭xqm[iĈ?R%@6m871@ɒ=T8n7p0r ҹJ+WJ6k�E`0E |,2NB\z%QصKKAtꩧ>X0Z`-JBgD K{eK{I|=` qIxF�@�@�@�@�@�@�@�"@V\i@�@�@�@�@�@�@�@�@�`,^Xgv)9xӥfr4{3Y9sKJGKW]Z&JJIWb^f._#pa}O[NX1v.]1c;u YXL<w͂  J-`u]ղ y% 픮Rw0ט#�?T-RX@RkK.tԇ@bp釓'ON\ 4҉  t{+73w:HVC�@�@�@�@�@�@�@� P+1k� � � � � � � � � @CUٲeպu,a>3!Hwݵ*SFY@:&&U$uh=*WһJ?/,keZm۶n$+[YgI[Ht,,H9/@]:iǎ$[IV8 ԭ+# &5o.wteR^pttaG�,0qq#0h>nzgff&#ܥ.[,25W@ )p~G0G .!� � � � � � � �T@r � � � � � � � � �@\RBl<hx`39ʩU2̷wA J5b]`OI-&%~L6-jZ6@yRe\d#GN'PҠAK"cdi\@Z5I $w,C%+_^j^z1o%[)$ZH1$:f/pҺus"E}X*pd'@-JX  ?5 Z7vAᤒ@�@�@�@�@�@�@��Zqq@�@�@�@�@�@�@�@�@�'~zoPs9'~HI<Xw@ț>Vl_ A_ZPz >G´lVZ姚,@ҥ\Fޚ5믇7OUf"pҬYRɒ'K X~v YK/IUHO?-5n,U,!ticj _eF A?~xP{I@q؝XbZ`}Sx@{ѣ@E8O@�@�@�@�@�@�@�@�b&@V̨i@�@�@�@�@�@�@�@�@�` p Vձf=h"  ;#_75OoFU+x}G'`@}J> [„ :#TfͨRRQ:ڠvN?^VM*B lX y4qԧOx߻DȪ h Ri�ijipȲ.tdڵn6m 9@ ? Zc `~HmƬYB -Z P+[(o+X@rjuJ;LVзT~V"E@�@�@�@�@�@�@�HRtòZ � � � � � � � � �d'']v.#Œ1d oL?$ {%kJ#GJ_% :]t݉gzjj*1?mR#PkVɝ&+Jl6 +eʄh *$=ҸqI'I3fU=Sȋ nn*}d׉_~)4}zbESޝXV"5m>| C:l;OyF� Ԛ;w {%5 㱿G@->.]tiܹ{I/3 � � � � � � � ( U@�@�@�@�@�@�@�@�@�ȹ;4j(u- 𜯼")"]vYt=V*VL3':Skp J;/8}'+һJO=%/ɲ]bԩS}{Xddz=,(sޒ~-<_f(jemȔq4{tiߡЁmYMw{@ѢR۶#H|#['ԠA2.˗|<4o^;C @,hhGT"vֽtқoJPy )Sp fK ڳ'z>&Mh ؽ2]vy ZE�@�@�@�@�@�@�@�|| @�@�@�@�@�@�@�@�@�H!ѣGkK8Sh68kUWI 'P+o[(p . (Zr& xK-<sLms):,# P(T*|R:( [tә@TB;\_k^+ԫux�, _~-x"kեK/,hw͚@�HqjtkHFDVN<8ک XԩI&%޽}o D P+R~VQKR � � � � � � � �M@0 � � � � � � � � �6l4ijժů JkJ}D'@Vt_ ;{t% =@w$g"YN*0vQY%?PB XA_Ks PFL@ҝwJ&6ƍ 曒㭬^-~{5"@9F?,믥믗,.\z\@ s`@� "(!qb8Pzy-"|-Zhĉ(=̱݋x$Hܙ+ɪ%�Z9@"&qNO@�@�@�@�@�@�@�@� P+6'+� � � � � � � � � @nݺe?3ssϕjԈ.Z BpQ2 W-[A,W]qkgh<buꩧF*qJr?$$ .ʬJe6}-Ӟ۷\s;{¶MZoTixiiH];/N奶mGf̐ܥ;GI]Hŋǵ4~sJv?曥=H'`Z|v6N%_={{"EõZ =HviYC�@�@�@�@�@�@�@�r'@V@�@�@�@�@�@�@�@�@�6m~Wr%-s0s>g@u5kYR|=w@vN#H۷K>b+;eʔjJ."i#eΥK'N%@ٲҠASOI{ڇ9dHA�,)u,=d VITR&R᠐W_. N ڵ҄ RebtyR'F%@- aI^?>)V(+QH2 1 P+fnh_I}j囒 @�@�@�@�@�@�@�@�| />F�@�@�@�@�@�@�@�@�@ >s1_~u>=~%Nӣ߰jY3'̟%0fdQ\$*VL/_+W$PMR4`TdӗP(yx@<fΔ,@? m#@vժyGZ:|]xH7$yTt СP@�h "-f;ԍ@NìsZ!w@UVդI}USf,O>Ȋ(mAfb([Vڴ)@+Y ZE킈� � � � � � � � 7FO � � � � � � � � �GuU|@bi 90iشG+@Mb.!QT 1d:u Qu4iA{~N?^ ޞXHQ?5xMBx~篼"}eH ; [n>LڰA;VߤiӤϗ*TN;MW.$!Zen@`Gô}Sx@|y$haZvFA�ZhAVL 3ݛ?aV"-U*\ٖ-@rƍQl#&c[9!"JE � � � � � � � @y@c@�@�@�@�@�@�@�@�@�U`…?>Z9؀J`a{`r Ҝ9j#}4ttEIQ;dP-IӧO%KFm WkWԚlŝ;K}H ޽?pOy@~A۵_vei#=4cvm8~}魷-奮] "&I`zix{D5}Mfѣ% Or@ȡ@Kw8yd2pyf ݗ"Pk6τW([Vڴ)}wa *V � � � � � � � �q P+@�@�@�@�@�@�@�@�@�U\95o<&d[&!�g*jJ:m. nMj8|l8-7ߨI&Q] ?Pk6ʟxB][*Th_KWK{;73Z-d6@ *T_[Ғ%O?I>~cB:R͚ҕWJ| Y0N^sի'}e^fHd"E.]y-{,[&]xa^ƍ7&ZFK۸q~$fJ =) xr�G$�Z$ *^xt"� � � � � � � �I*@VnXV @�@�@�@�@�@�@�@�@�FN:`M泿fϖf͒.,$5a%Վ]kJIUĮMZB Q=,@SyoV'|rTWԷQEJI_JMx "78Rة~f={W_Fgi"-pKv<7id+זzI+˝'Hw%IXbԾԧ}{NbH;Y*Y2ֆuHd =|Z5ɂ$) ; y1iҤ-܁k} ~Z"P\x%/[+C@�@�@�@�@�@�@�@ W$_SV@�@�@�@�@�@�@�@�@�5qD}).TԲeFr ڵ+<y$륮 `.-#tmruk<M`Kbܲe4iUAjTz۷jU|l߼iiR'SO jY\ 8{ݻ3#@tlN NlYVf傶>~ux%ӳ) 7nԽ{rkO0{[t'CV _ծm6l3!Te=۴)=_�Z � � � � � � � @|? � � � � � � � � � @*|gjv1V7hA!Hܒ*`:R"0 \ H`pŒu PJ ܪ 7*V p)Q,6hkFe;AXl4XSN9Tsߩ~].ܹ{޽{ 9"GhѢ޳mrʩbŊP\8/^<IY( Ԭ)tS~4l4h4z׬񏐞~nݚ}l>a^7dN:l!.�_gYagߩwȾcu%T%/k@ zhZĿ=;ᇥ[oV8#h^VMڳG;6|-cf6p-k\+wm&n[(ضma@{1.sVCwڎQg#X?\ʧcǻD+o w.H]_^}U}cSׁ5G -Z$y:e�Z,x|_X=L �Z8t @�@�@�@�@�@�@�RJ@ܬ, � � � � � � � � @* 1B6xbٲeS!u�޽53؀5gtE GR۶?P^@).2P+Mq$]3faÆn{#RQn$կ\Rgvs?jɒ%Zxs  *P`}eUB{ m~~kYJuQޣv<tGv 7/o07Vۧ6Qx7mڔ]o[nvvmc\;ux{y>maU>`9~7xNd ŵo,&baA3K֡.ek{݉ٳPHd(;/}--_P-+4t{R#8nݺaB{ݝd|رBX]t;vdxqv\Bl^?!d{ ݲ2-Îsv<O{*U?m9Jj }v`+`O7 y'! wB}Պ+t'*:NVܝzD>-p`^[>�@�@�@�@�@�@�@�@ Q@�@�@�@�@�@�@�@�@�@ lP>LsOjwvwUyg( LѮ]FEI)_ 87V;VSFb.{ƅĤ4m6}ך8q&MYfyָ 2}KYg]y:ü`Siә*^<] Xf?0@p `͛e˖:a0('V^vZ~1cYU,*c(RFtQK݀|3U.X4Uc´%Bf,p֭[3}XȘ=1{6gslzFcۡµa3+WN{ZU}n!:*`'w%*5j\@\ԁ .9?GnY.Hׯ_YZVѾ673q( g lQB18+a g c[01 Ұc o1Ύiv|^`^}4v;'Knwx]H=! f͚yv /E% A&lZfjsЫlb:` ص6׻F@�@�@�@�@�@�@�RC@ά% � � � � � � � � @ L2l!(Y 1]Y) H=V?Ç<XF(`nrЧ\ǁ$,�B.袘˟p 1i*j̞=[Æ Fg̘Bv#9 o~|ZaPRJѰafs:sL w?(O<ld_:tP׮]uꩧ`,˗BL?,(e16_,a0{>餓TbŴ0'?b?7csD㫅j3da>˖-~ŶlYYP=,]fMY خةSѸqaZ~?oM<X`꣎flq/;K.َVxhk sM{[ZndE;FڳSTHPK:g@;B,ڎkdǹӧ{3oL㙝S~i32i}5fXƞ=Mދ\`c1]"*`Gv=iAjE6-t1o? Kz  !P\5XBt7;IVJo~V@�@�@�@�@�@�@�$@V6]A�@�@�@�@�@�@�@�@�@ ZPvm6^ʹ熟p rhrǣ)۟ڴ Tԃ@yFڹS-܉#/x/5I5P˂ESY(tŅ,&HdɒjڴeA6q4d/`C:w:3s^,@+>޳ ̲p&+e0>b&MxAKc7B׵`�c\PBf/(},$oȑ޴=~€,}G" Ρ K 5+g-e-^=+6 ~'p´c'-/JR5�{B쵅dQ'`K~@3ʮXL!~;/Ԏ}eKfcL;cek>.;O0@:<pطMHK'ʅ%'@-4f̘HTEq ;؁�6n1@eˆ7|! � � � � � � ��Z) �� � � � � � � � � ugªk]ֆ ؐ8?_k ‹Ժub8 X_H<NtJ l('z+|ɼ#Xp!`i1(.aĠ4b z뭷@ KƍrXEnݼ3.-o1bF ղ ^zyXRM(X|,XXp>8aÆڵcAI5kS!v\p,{4O3YS P!ۧl _x6o-ix Ñ?[a4�QƎ y5{qPڵ[xVZc.[ W0%²rn9-˪Owov,5{.w-juپ`-uQѢEϣ(＀b#TAl{eك$ȵjٽ`Jb ,(;1{^rjhXf Ѩ:#)}v2Lp$M @�@�@�@�@�@�@�ȋ� //j,� � � � � � � � � @ /&PcUto8cvxn`q@*AA .?.Yf7ǥyj{1e6iҤ\9s 맏> 5%fZV2 ?O-Z 'xBgqgLuYrfϞsj޼yԖ-[>z^8{m `D k, XH+8S>Ob^w|K95kVP7wqiA4h/unF /a(} ZSU^UR؅tYԻ^x&QRKpqȎEڵ;`׭[fc޽{5L!/DЎg֨Q#tIlɮ ovj3T@?,]|\@tՙ‡  Բ`)SSNE)N2=?gvժ]"u  ʉSٶm� � � � � � � � WZ( � � � � � � � � � ~l4!RR.Y) bD^O[5"_75"J?/=Ttvs3=~5`5f+_rt'7T=\ȇm8KZ[>LO=:t{޽{ m,Bg-oB̙ 6xZؑ5kL]v֭녘1j޼Y*w+V=2 ڸq@cFkɒ%.(RJy Fc!4(hnܶUV [7_+W~Kgi5*Zt p)ۯ?xN՝%]R%Nۯ]vy߻tqѿ;ýY&Mf;>bg?0@rYrb*}tyra|ҋ/ƴiC ex'tw[`n˶ Xލ^=c^ X!p ,PDh � � � � � � � �Y@8o�G�@�@�@�@�@�@�@�@�@ #GTS"P"?,u,+Z"elJ �ÆI]+@^ᇥ2enHUa . "7֬ T[@OMfpwhj׮Ǝ6mʄ](Ɍ=fϞ{ {'կ_W]lk1m4}wQ-Xyn$ G v_-P\9/&c͛eADcpp([l´,h,$kז7(-`!FӧOׄ 4qDBۊ c;.v^׫WOl Q? Gn:/r֬Y^+" =ĥ>>ټyslRZr$ZSzR̋@dZZ"|/4e#VԂ@Zhjg(OZ~jZ.v߂; K� � � � � � � �W_ZG�@�@�@�@�@�@�@�@�@ ۷oտo };X z`C&1z7Rn_z\˗Kny=Txrkn7ETn'DjK*ETm8s{9//Йg%Sc jۼ1 5;'Mrsb,$fҤIZFW.F6 ꪫ\HI^11(4uҥKewa… oI'^\uꩧu^Mƍ Ky޽^(ј1cd.EgǎYCiӦ^3)[[:t=q v<~|MܹSGyj <I~}WH.</5<xiHpenȝjYZ%%@[rA`&M;(n觟3^@F�@�@�@�@�@�@�@�'@Vi@�@�@�@�@�@�@�@�@� 7SNQo+6L*XP%kaZ7KK2l0Hz BH<Tt啑:,`){iQGE/o֔)St饗jڵ.@]~n\7z.�]*¨QqkU~}K:7?_4zha\bjʕռysz:\Hĉ*Zh*G vl]ѣ*YDKUdIYg=E %)ֻ$?\#FPnڴIGmۺs+@@TZU]ve Ӛ1c(?vX]veg9묳%,p`?n%|@\&nYW1ZP/eAiǔ Pmfx,7~Ŋ APAe{F ^ � � � � � � � @Ԋ=-#� � � � � � � � � u OhԨUJZ quȹgI;|~D RVI&=dR[!;.f+ZfxZH:唘5_C?>/a:Λ:~ ޽ YN"E2_ >&LXH"cVr(iFس Q@`.IaÆÂp1Ղh{9/ή!qg}^5.+W`wGi�G]juA>}C Wi{0I&3wqn߃|ЅWѹ瞫o:]KUx.gO& pr%:LصKK@ZC$P+1߻gOb=KFF reޔ` C@�@�@�@�@�@�@�@ uIUeM@�@�@�@�@�@�@�@�@�H= ԲA)Y !#u<r衒 n+n4cԩS~kbyr/cRŊ~YH< Բ0bŊŬ;`?&~{QzJÆ #L+M'g/JЗ^zIC |䬳*;wջwo/<cǎ9s;]Yf_k!L++]^z_ג%KpBu]Z:/Bw~QQs ͛7ǿ S֭݅[F^x F:thYڵk~iK*w߭{rx7kwwNѻJ-ZHGػWCr_Uo+P 6 ,P)@ ( jm(g`Hǜ�Z � � � � � � � @0 v � � � � � � � � �D\ ^x1ZȎ'm.͌1=w?ǸQ˷_H Ʌ**@ WkHtAs03'jիW/}?iѢ6xF@{M7ŶIZ7":m4qf͚A~ LZUTwmٲE?,l„ ^OFT-`bԪUK}4[￯2ex4*U\Mk 1K.QժUݹ_+XB/<L).eƹ@W<qr)й7S`|"Vk:K[. ,-^.)`Z'OV(JM_k2߀je§py^S+@Vp =C�@�@�@�@�@�@�@� P+7k� � � � � � � � � B6yմiZܯȑ_a~h.AV4uWɍKR5#KIW^T>KF Ԫ[nWe觟b׬ ^ٱcG/iҤIj۶mOl߱* iݺVZ`{NwǕ+Wz0k׮u_gm8:tŋ[^d {QLc5 u'N -De˖ vZX(_'E:s#{By˖-K5L7aC J=zD>jA ;A~W^6nn#@,PkÆ {J P+mvQ/d>O@ __`׮]�%J� � � � � � � � 'O � � � � � � � � �D[:tu#R�.] `gOܺ@ù1cw\ȧ˖vX|V !r%PAi\Ɏy.={KթS'MT+VѣUdIuY^b^7|WgyF^zVX./#P؍]< 8 ׺'#B?~-8tIe@vyɶr&pG롇[_{5M6MAM*��@�IDATs.r-_<g$\nuR "t?!%~Ʌɝ7$D$I'p'TRrJ \cޝxv-Pߤ͛#w;+R)ec܃W � � � � � � � Zjfm@�@�@�@�@�@�@�@�@�RDlPĎ;m5QZX.D"oGs) ڹSZ0Pw$֭̑ڷdԅ@@eXdo@ %S_o{!C CbPB/jʕ Io[X;u]RJ\F p@irj֬YM6K]E%vI' 뽀e˖駟Q6<,PȥSC_FԮ][wyg`GrYpL+8LLB Bv rUoW*ȵ@լY3r-,;@C?8Oeg_|vߋ� � � � � � � � _O � � � � � � � � �DE`ڵk<̨ԟ,~d1$W֕;7p]CYޟN<1(/(vTx@ hԵCD=; ym,k?#oְab ԿժU ԝM2Eso/1 4@ZlÇo <lOw}vؑX$֭[uKNmӦK׿ef OM0A}>cS g\פ:uε=:d_.A"ElXLE8qb�Z/l܇O%PTn]Eo ςW � � � � � � � @� � � � � � � � � @>sp ZjjO*-PC`{A[+TJ s|ԶTAfbx9Ɏ^ኩ. .TʕULDSn5p]L'0c p :묳}SK.ٳnf/5|e˖ζ^0?ӧ{s^sFRF[o 8*~_p"in?C>8 uQ<vܙ鼱ЮAG=,qƚ5kVOv͛O>Y_}N^zɅBThJLcǘǵ1;ך/۷o_w1۷KJW\隩|R<Xz}z V,Y+WƶaZ˷eO.b=Cw<דPѢKESv fu,4@I^ˣ$@Ŋ:+x #XðatGz#XmL"P+&4� � � � � � � �H@11 � � � � � � � � �%_x&Vc;)Smi ʍW<ݵK0Aj>TغU_JLO]Feq*mrVM CoawZn:JC /m`a<˗/w .]!믿V&MT¥իW Z 矲7|`@SBsDbΟ? ceNc=9sȮnA]ڵkUVj޼,\{)oԨLfZp|{[-8k8ѻwoٳ'݊HI۶ɭSDpY$NOM,gcPYf*T&MVi*e"v?e=ɓ'kĈyޯ'O lc.߷9?`Ww}ZTUR7 5jYxb-]Th@Db@�@�@�@�@�@�@�YY[uC�@�@�@�@�@�@�@�@�HI~SOIԩjm0[jŁ=OMN.xu.;@qO5IC2\d.&*W^щ.mW}vNs_Ç (.5kT/Gд./~X3I ,+Ruԑd/J ӻzqg05lPׯתU4tPK9rdzt`ŋўyS3ISN'%~g<*, B݇^>[\9UQY \)!u&v[1b,PdI/@G9{Tzuvajٲի8~=Zܫ][E {z]r%uwjvmХY8;$usT_;t穞h/tM7yZ\sMx~VR"^7"� � � � � � � �N!;/F�@�@�@�@�@�@�@�@�@ 6 ؼy5;V:heGXLΝ"K`A,cO=%]uTBlڤ,ZowSn ^k0]tQ+OZ}w2֫W/YJ>Jeݺu.l]veׯ (66 s$e^tJ~E:+7muސK3-|Xb^Y7TѱcG}~WS޽cY:v'z<hd'8>g[ĺ'u z-n>K E]qED2{.WIo$ @�Zh!!r?P먣R5ѨQdɒ\&' lHj}7n/A'QlYz~7yN0 rGs]2}Vf [lQ%mI � � � � � � � �1(6h@�@�@�@�@�@�@�@�@�b(矫M6*RH [M,Pm`,N8!}MYVVR`@ij[b*mAlxj5l()M,իYs纰:3"[_YX=~WtIULٳGvkKyY_^}U[Wo\sA~թS'tMڱcﯯZ۷ow'O>.dѥ,rz?zӘ1cK.gA9h Hںuk*TXGYw,SNUZUO>d>j΢G}M6գյkWuA M{ʥ;=z-̶wm\JO?SN9E=J*M9s>c}Ν@D.bolu䦭{ŋu'jy ̯VZ޵ڵkުUtu,(s Ut# *}Yln߉$WʕϒӧOϗ @}O?ՀdO zQK7jHOY{իW /o,ˎ/9)|A~gjVQ`m <u+DoJVfo9߃2|+ǜo٤I<Z$`qPwCA j7,YƧ;;U @,PBoZPmt?Y([dxK=#FAص-{dlF 9H 1ϑ?ݿ0-c :j.}f4p v]kz!UR&y%/7nyy^gڵ̾z잍ݧj_#Gc 4(-'kf! Բی/[xݳ< Nϙ_K_۶mv?W^kj><'xBvci*/^\>_nwڳgOo^þꪫ/_{sv#P~iGi3͛+'1 @�@�@�@�@�@�@�@ {( � � � � � � � � G7sRJy\-yeʴ 9_ ܽ{w -P¡Y)vB Ag J^|1TP^PwTZkp2!?B&M?s6%Di*X` ސ @\p m۶-\m܀{7ph `꽮SN -װaojРAm۶9sxABC.'mdU6Gk\UhѢ{ZhQLfҷo.`!7jhX4eʔPC.L*Bڵ , 7xcȅynЅ^jժdɒ_~ś T:c~4{ꩧz˸5w}s|Ȧr!`Z݃Ϲi˶$6 ׿>(Q"Wo͚5!7`W:4nܸ}f-*T>rz}{B{p*=AmՎn@j>7vdۅ^~ɓC~W 7NΝ;~L81C.T9dɒ,ef̘9͞=;m!`jDuެ(|+Rpo cBߢPȝS;︤Qk@ vb%.|%5x,_%jҚv!=#^ o۽??tiy:무6}=iݖߞS|N߹ #}/쾅Ҿ}{{\Q!jz\(W 8곶~gLlr^z˰{+V8=$X=3B! ժ/믿׹۽}Ty3fuhG`K[nk5ڽiӦ5r} Xv'Ί J@mu[zgn{iٲe[ߟrʥM{6c ^}LGA� p<?S@�@�@�@�@�a74m �7oo)yf|+Kq� � � � � � � � � �I"0uTd'JwKmDHZtҼyz!wRVѨ:8P`po?p$`[I*וmV=:]p )vʿsGyD7o+R.K ,>s Ny% oFw\c"o wܡs7ސ$ԫBhӦMr d֭[ .BzjW\ v*7iLnS,yt/V%7jN|]\\x�6<j֬ꫯ_.7P{1oƏ/SڵeVVlw3{ێn�\oZNni[?Gn@muE.Lv\@oN<Yu 'xq˅O>sAV<ם+~*VK7\؞K-.]gyy_ (g-ٺq 6HNt뭷z);X%npb.@;L|7a͉'-Z}v|ra馛rxLwarAm5kVLKF{5m40:1͔}[<>fr7 x~]j CH'Ct#Nt-RIzI#`!jRnCfxE wzdrʅ]g}:swy\\~τ dI/2v>'˅?}ckر= K^\p꫽jkOv1_.<l˧y/ *UTIo:}Rzxnݾ~gwtzS:vKǏ>Hv9Gݧv܍}mzv@V;s}r!^S}ފkgg?}xV{b%?_,;g  � � � � � � � @ � � � � � � � � �DJ`̘1:##Ug23nRժ_;7 ~?S6\  {,l,B}";>PRO,gU$łfݫs=<9:va޳ :lJ6=@fo?իW~PJ, z9e˼e߿:4}t/\ț{FÆ nᆴzJF>l`Z h5,^˗oXQ-_YJdGN眴{yt)�)Y]oBEzڴ)SdljN_ʔ)mmP!.?N;\wuޱޱcWGVK/�^ɶ=-/?,@~s|<xv~4CNާu,N#]\bd \awԤ\B)F� X/ZA2Yiժynb~3r)޽ ON:G.޹sggݾq',TsrΖaÆi޽?{@dg/>p]* 7#' Xݎ޵+СCIӗ;zoLS/>{meŊsNcz衺 e',ˎ'ZgfGk֬ٽT vJNG1CV i@�@�@�@�@�@�@�ȁ@_`FfA�@�@�@�@�@�@�@�@�@� XV8pdA܉6o j+NM*8w̝Soi6,;ߞkB*`KƓ�y75n,$}En<\Bƍ{Ϙ˩ , �:cƌǏnEnjlӗ>A?mpM?BԴiSO?=d_`eDiYdɒ#QDSyQ 0nݺݾ}A{yK\\x jJ~*~925o -}nǗcr:T7͛7T&e_W Ow_ڱd֬YޱĦJV{oFod ]۶m>3op=z $;̜9[O<1] L,nڴiON;qHN8>;?qVܫիW{he\Aty 7.D{˝?ȝt < ԲH7z ؽ 4r5hر޵ =K͑ g ܿ#{8s"QAP FĈY1+s:339xg&" Xrֿ^v 3g~4saϽmj^xְaü~<^�Qn Sw^C*<qB* J,P_9[ZRUɎV$ü->]q<?\rjϞ=d >ܛ,tB*{NM6ՓO>vy~JVԺ<Ze} � � � � � � � @*K"� � � � � � � � � (+Vx UfY^n{q9�v(͘!Y)?>ѪLx{wL1zFb3gɚe頃eD6p~[ +�oV׫W ;w~|!XM4|iNb6u޲vy֭2߷p# TVV-/8B6lPU$mM6+~e>_l}6-[A`m8pF b}gr._?`͖WҀ6xmς yV5S\m *: /YBvmdU1=%+np@)wr|*ǨW"[@b=#s0^{{QN-M kCǼ;zK= AZ;̤I\֍~^d6rSOmZ<aZSm=/O5 +p.vT4dRywmS*Uԭ[+TJA`V=ztu4iYw& r0uVJXB캩]<yN>d:]; DZedq@�@�@�@�@�@�@�@ j%U!� � � � � � � � � N/ ӧO:-L©s 4{6ZYi+HCT pjѢE sҗ_J˷Ƿԩlۏ?(lw{o;vZa̷KCS&jժ從祸y2_}UeL" Jt0O 6vw߭+LVZE]Nm?XdIϼ?p;^A.i~Wη8_/_ lxJq~@ $VXѫbH�%mZ9B1mzs_,6 oo_fzPl8s /P *a_A?|}j֬YL~7qc+[;x�&Mjnqq8>Jq|̿%{dajp=x'n_RrɯKo_+No;, q)>ezՋj-[5k֔jYPl߱4k\Ps횄]$!VZ>om꫽%TRx=vh~5.Mo=ӻ-?z O">aAZ'x:ŀ4rH:Êioyׂ7n?޵w}Wx[y/'#� � � � � � � �I(uj@�@�@�@�@�@�@�@�@�H ob5l0q$7^+moNilkRy?r{ȶt<\`tq騝:"0g5o<?ڌK\sʻQG Jw@o_~^u'ngΜꢞnm GyP%O`0{ʱ}z]p7,LBY^vI 6o[ JJT c|`&?ahuͷ-,Wugv֯lnA&MKCmfAbVI}Jq] ye. llm�kFӧO׋/gzС`y.nq~~ؓ=Yw{ъKYKj޼yevb>3g}dVSO=UիW%S~'[e(yKImK.d{aiFݻwVW`jҤ,-bPժUu-N&kݷׂRz)Ν;YnGJP4 ~,c^ɿW㣿D㏲38CNYOA v*R餓/NY@wj9QUeuX0E]XxqtdA;;7o yorrE$smUkv-ԮkT޻eav$-P`r?Ի\C*?4l.v\?Kwz =î5wy'fĈovJa}ӿ8}XUN/N憽m[ o{ml>b}y UV%{ M � � � � � � � @f lDA�@�@�@�@�@�@�@�@�R #n0R.b`{ ^:E:u(t]v%rWgicqE">l> 6Hcǂ XԮ_7k <ia%sՅبx~;6moժUO?Ag#nPЈ 0^k׮]xup LPB8w"ႭrewBj#m۶oŭ7w1Yvm䬳Ίl2".'2dȐ agqNab_ s7.œ" Z5%fQ掳#G}}衇Fƌr7Ыn=zD\]ą(E <m7lEC==eˈ [ay߶nPڈ9?r3f̈ɓ'>`q׮]#nȲeJjzq~ׯc.--ZHn"WM".,ҡC kۅ^q_1+LÇ/]PWmڰaCąy"n`M]VmbL֭[{nVɶE.Hj"ofTh/(Q^=34|.œŽmuG-Ώc|`iד..b.H+qD6eSƝvcrʪ,ӧ=Hd,4D >~69RN/j]a]хG+;q"e3)Vq+{B^}@wȮ阥=#FFvao]~{^zޭ]kFk^{qs؂]CWA <c5T*6ۆ]Ê {ׅF\c{۾PF Z﹇~[} Xyscצ& ocˮ@0cߩ:_9CkGyם:uTTEZoG@�@�@�@�@�2D4Gtn �.0mBR<wG  � � � � � � � �B nMn@R,"`{ ^ݺEN2ʲ9`Urkȑׯ_>l)t-ι9FPAzt W$ Vث<@|P&i\nĭ5K`ժUU}@4 .N$ծ&P-^X&L6a+?paCr ݖunQZr\h�e]e˻p͚5K.K+V,t<y)ȅy}\rYVgϖ$V?xM.PIUVW[]S*8}r`A+VpoY O$r~۾kk.,ȕY.n.P{?mշ_no 2o]fΜ)~ί+h=ФIdRJnɎӧO׎;s(X.{Y[2@Dp^zեKvqNGz -7`n.t.%9>IJ/HG7`@rrre =]WRW35e9H4qܹU!.hI.G?vid?͛+nСgPו]7^}ͻXuY~t,;(2իW{iJj@I9lD^C*=Žs윜fv]Zdk zanI] \tmqsg*NYTR /c}އ]/YG-CxEꫯ.,@eKO@�@�@�@�@� ѿ r;i CrZ Cb2+ � � � � � � � � �T?g}`4k|ii=ўX[.|[iTH](KgIV6n}kjXLPQGI'tkt <4WZVk,X,C-qJ'tR|6`.vRbAQ;̀I.w68짟~*|K.qǺuw̝'Uw,LˊWlW7L)xDyiCc[a0-{m*X ?�TLmgysؠ;s1sG_M5k6r6g}(QuJf~zWxdﭔ4 +С *yS%6,їz(?Q[USsl/ro#FO>8 X`~8]MB+Xe <sie֥?$`]Zѣ fC4q&iĈyσ5C9$!\h`wJs ]bŘ´l|gK5ÂX}Wns6h=hRqK2->P5΂mQmvWĊ6_QQʕ+ :@�@�@�@�@�@�@�@ 1j%Ƒ � � � � � � � � � VO>Dz?LkC^+ݺg'YD`,i4fdtE:Kty1.֕@;o׍7;IQ uu]WbmRt2} 4#<v%z/n6va^5\\ BYx׌? xFMB ھF~ᇫ} _XٴifϞvZ/O<>/O/rU?۬,O5Js: PKa25j'iB.2/짮}p|,z과xca}LsM&LnN^3fN]z6Kw/`=z:w({jD[ ObJR>}tq?jݮ O>YvR@'BԨrj׮Ln)pqAb%P+ @�@�@�@�@�@�@�(�Zc1@�@�@�@�@�@�@�@�@�$`{AjR 7Ҏ;Js<.ni iZ(0id;'Vxh`Q۶pd%i_4qM@q裏Ή[yTJil֪-7~{=[_Hý ^/8]qm`&MUhYg|_ɬs.q oO \SxWljSB-Z-j_|Qm]y~{Up3I픶?17"3�ï4uTp 2eJN`[ܗW_}UzxdǤtq| gyQ;ni'A=>D<obo[xZhէu}ɝOTA13rR1@ 9o5v컲)eڴi]n?/]p^ }W-0dtMEϐW76n,͜Y ʾ }O'xuu7ɓS҆kƍ00*A�@�@�@�@�@�@�@�,@VY= � � � � � � � � �̙8 U~FRrҏ?gZpVfZE[2M =ZL)… F X9ys礻J\lU ۷}(R"`ABի@cUz+i֬hqmiذan[nz)hQFYyy @z%䗪Uw ^x!_kժq_K.B*V tYȑ#ÇN::&5,"F;x^�=|?*U.r|L s+ɦ̙3s˽: iٲeݓQ뒞~Zf);`aeزE: ^{-2_ձ(DS@ьh֧{t1hRaZV^G5J;m$ T. )mm{EA�@�@�@�@�@�@�@�H@7 � � � � � � � � � @Y>3/�GeYMV,kHa Բ̈-ZYBI :}4fVǤ]v  mhx,X@/ \JB<1BZ l= ؀½z _BVj׮K/T?^Ǹ_~e-[,%ͮ[Nj=Tv#ݦv]TBMvZYx woҤ=Xwߤz v[ JSm8p&N"6j ڲ+GA 8>BTsrr}Gm۶ջᆱ믿^C=1aZ=Tts"2nҿ%5hU@Ϟ=U]3fL�ZCv nÆ,hn@-@olkҥK.׫W/ۺN@�@�@�@�@�@�@�@�@ B@�@�@�@�@�@�@�@�@�]%z-RE7�u\%@SJ:A4%,'WB2kt .LJxR;\7_+}':կ_?/ d-g={aeAe=R!,T_W 6zdo?}ݚ.7[E`zGta:�~soz",,fl_pB��@�IDAT]wݥ7ok}Gڸqc:HU8�/�Ђ�t &~)|3]>NL}I{Iw)=ԭ[ZA :=zdu&X~$Pxw'PxZ\6 [֪U0H@�m � � � � � � � �8 @�@�@�@�@�@�@�@�@� n$.c+;'T`Z?UR@wfI;baA Fav3b\2^„h,-[J' UZ̽nMW\q<H͛7/9eZW\ /PG}腔Y UJ*UԿK^ψ#ԵkW=ݍܤIp z'/k ̝;W/:,nZڵ󂙚5k^{M\:ᆱSN9EjJk[h C8s_hΜ9kC= F;ꨣ,"CA ֯_\uU^@tI@۷ȑ#z[28叺 RK3xCӵ M~yLʪ"H{MV R,BV {` r,Pk˖-i9XUK^Y0X{�G�@�@�@�@�@�@�@� -B{@�@�@�@�@�@�@�@�@�C,LbcгA¦}&P+@m4);@)%`?܊ڴeB7¦\yg%7pF>R a( |.~mzgTrb *UR>}_Ռ34dm޼Yc߯6(dG&/GO<N=T/@E K.D=ӎ P5-t~e/t: c):iF;찃ꫯ(Y>nj;;7[: wN<,D^PBSO.@U[ eXF}$m+YR5,Yut؛haCƹuﷴuP@ok\m8c!,[L+VT͚5(Z� � � � � � � �d@,;]G�@�@�@�@�@�@�@�@�@ 68 Խ{%@Ν]K2!b4Դiaͱ T@\+0r4}4|xK2& X Fc�v[7i}CH^{x:裏뗼JCfk?0гjԨQH{S|-l`܇|n+]⛅puv'{k׮^0 JA `sv,5a}7@WϞ=5x`~c=A3!԰aCvidj|g+un.uǂz#wm7v?݅;7NGoպuk/0sn3N\0%,pyr!rR*% N;ܸqYjJR6mL#ʕ#Pˑ.L?/tRY@3@�@�@�@�@�@�@�@ _0@�@�@�@�@�@�@�@�@�@TeP2 y,H ԲjE%i.H˧Ԟ= $!sHXFlҤI pk8":fIZR ~Y`F|^pl4(+D-d_W=4j(1wm68﮻M]tٳgkW_iذa^P `v%w{ܠAv!Pʕ+5uT7h;oZj*Q;u>l^idJv TPnYؚgM7$@jժq»-|Ў܉)k Bosrr4i$/,H>˻/OZ\B]U-䴷{ߦ)4 <"JZ34Pƌ~Cٿyy1j߶T#Z%k~իK5kJj~,FR^f5@�@�@�@�@�@�@�@� BlB�@�@�@�@�@�@�@�@�@ _|.D6ַekm'ծ o#SZr!4~>Pz͠SR6nS~l]\{';'\x^W\N8A*UJvH$#FhСOnyZ Lِ-[&c駟da!do,Y5s;wձcGK)v4ྶ4:k,q³:wN;M{tC P- ,TBmb/>hAO=֭[lپ 46lm Oxk޼w<;P@ eI |.OQ} @S`X+cIŹ0#@(|pѡl{65ھֹL\J1k=Ki@--EK �$5h  � � � � � � � ^� � � � � � � � � @HOk} iR3kO]ɨ�1uhMH6 ѩR !?/Rؐ!Am^RS~.mO?‘^ 4HuI'ORӒb/7#GQB/0BlܹsKd!E&3l0ZʛK8m׮]ivP6md!\600 ,ZH3g&{\^bAH;S:t3< Ѳ =˺wywl3 6mڤS1,/^^^|'H[KE<'''xZH w.+V«wA/"/(k׮ny7<D^:ge`eэ79/ @ ۽onʗ/a˜jŰ9ƍaFfI_,ș"5iBVe˖nݺAkA�@�@�@�@�@�@�@�V@t@�@�@�@�@�@�@�@�@ FRjԭ[w%wcAOzUIKNj<7Ʒ 7;8\^ n=Wn08fSAI+t\Uj7{_]/^?wq߿ x;yANz$f: 4o\6va+~mٝR5W_. RjU/@BdZlVZ廵- d-[pB͞=Z(M+Wl 'ܹ 8 :,@eMy˼y- `$- Lb-\nZa _&qF͙3;\|" [}[.^8R5K<Xf N,}*z=b9{-pi S@ضj=&:]}`ҥp  � � � � � � � @0+`lZ� � � � � � � � � @գG Ĕ.@Qj>  !}v` )P$Src1` #SokH7p7;V|۽?\xg/<)-ŋkϽ - hذt7_~G֢E o۷oe7M D1cb!5yd/X?rYA4i$>jAI͚5SӦM~ƍٞE4|v[,t?ȝf=kԨ:dCYЎ;:DL86Ҏ_6dIyʲerWwy! ,ȝf͚qvl􏏄nrE؎o1͎g8id=| 4 kdh=O(`b7w˽wSNIzY[v \{rRݺwz@ 뮪]w@ J}Ai{H�UںKKjo-@�@�@�@�@�@�@�@�bG@�@�@�@�@�@�@�@�@�@ _~N>䐶>Ͷ@]vImɨ5+DZ2c[0 Zy1W|O?-#r̝NaN:lI'IW\!|TJݫW/裏=^xmܸ tۥYP mSzիW~'zYNf,ԩSN:]Hّٳ'AiJ[+0 @b#s& ڥX0|~-DƂ,\˿ l>`Q#`X+V kjO؂Lrrr[{bm? JСno K^d@]b6,oydv;ՍtGyty(gAFE;6dFXZU sL;~d3c}>vߎ~H>cx5 I,; %BÆI<"U䯆5tK/}'N-(ROu1chE kE)^~|CVR@5zK]L � � � � � � � @@�@�@�@�@�@�@�@�@�l3fh}il駟$bZ6F:ufIk˅W 4<.O HW@H*`a5k U=HKCJ7ܐV-oYk֬e!襷vc3hB;v;BXXR뿂!,<>J[,),bPEl6mfΜ) Ue<?ܹ޲J*wћj>a_Xh6M4)7Ɏ-Xb#d![\mwbFnNDOUVMa)vZoZF6YPʕ+,֞3WZ|6fa~X {gYȏMc!Z:!gaكhgc6VxhaN@hZ_|#mN>|֎vnΩNv|p;g <ŽsdǾUVm3͎e'?(>w쵂w?̎ivp4?̎oeS>' 29w>A2W%Β.X:TL] $.g RhKw <m\ Բ7Jpں-,P]H r=@ � � � � � � � @ �� � � � � � � � � �a5jѳg06?m@sMy m[e%_J8n+УVXYQg̖Ux7^N%{bx7ɓ'{Obʔ)z4o޼|:ҰaC/cIa*UҦMd?(vk\xb/¯nS-˦SN9E;w,B(/`i**d&iY O_`o-$ʎs e!SR0D%ove,cw&٦}z7XM}6svO c良lWR~{{kgczyv& c+X%9:ed;fqɎv Y.dAS@eǖQpc{?:{?Cmw;.pӷb&7D[}q.oݷ(pY'9`â9FuW&Z�@[nEsupv'=$՝VMgf w(+vmȾ'es@-}7~]?@�@�@�@�@�@�@�@�`jh � � � � � � � � �q XV.]8?0[ƙyqcb_ yGB|B|7{N:,O &J{,�‚VJzE>~-h¦;,_c-gZ`ڱhѢ &, C i<Xa7vTZ|u�la?yz.^f,\˟l_[v0+�v :u:vf@y|TW0Go-<+d @ر>Km*Mce[vLy|qпc`qXq̲cp={?ټvGv,;t}5n\=ѣh=w#»̽ʝgJg> y\'r\m #@zsOe̘1:j/T"ē,P멧|+@ևNJ}Wr r_pԬYZ7 ;b @�@�@�@�@�@�@�@�� AS@�@�@�@�@�@�@�@�@�U<Xg~9w vJ@Ν 4ߗ,�s2g'Q6cڵ}YiZZm֛bV@ʕ+6&|:蠃W_10m*J,2e・# VrYa,Csr'w`2EVنǐ8,swZ]Ȯ-Y-qR.mg@[,XwDz]l 8p2@�@�@�@�@�@�@�@�|= � � � � � � � � �^`ʕ2ez"ժ%5m֔ jݰk@VʺG OK}JmG_>BX,⋥. ah2Y`ժU:j֬Yu@�(da}H&!mCJzs>^h�r":@ jQ)`E)Y}yĉ%ZYjQ/`ZV֭@�@�@�@�@�@�@�@�O@-v@�@�@�@�@�@�@�@�@�B&0amٲE={ Y\ iԝZ JjD}D$ۧF>9y=,&Z+nyIټ%;)zjU\Y*UN�z�$IBw$�vǤ+W`iRC:DcPK@ 5yd)JREZ٘ w#t*T)(oƕ\ vjբ9hemS.]^zYk@@�@�@�@�@�@�@�@� -B{@�@�@�@�@�@�@�@�@�(A`ܸqjժ5kVœl*YU 7OZ&Sz~,Z$m Wim^zI-+WT͚5݌Ro4qt뭥^ "@Hl00BN@ K j}Mt<˻j t?n ㎓4{.Y�2\,fpv>ׯgj tLE TP{@P&҂Ei|*J6u!� � � � � � � � s!� � � � � � � � � cǪgϞiO2cԶm[{,,žs&J`蚶.Qkd=H?/tdS(JhjժUˡx~]SzP4F"@VF �Cz:H"TPf=ɑzHJIKSJ|mj@ |͚5S֭5f̘5> Zl|jž>֮}L@Ŋ Ԋ:7m*;&W$d/_^u)iV^G�@�@�@�@�@�@�@�H�Z)@�@�@�@�@�@�@�@�@�!qIJǏ'P+FL ʴ@vЋ@wU w!0a4m4hP":2Y`ժ^zxS~;D@ & ԪIGLV̄�V}W"TYj%ʹ4/$sIM'лwoYUBV<{wi&iҤxbd ZlPDVpvE~^VpZEK@�@�@�@�@�@�@�@� P+?G�@�@�@�@�@�@�@�@�?KW^!kyzҺuR۶?ڀ-[Jӧ'c$%4'#K:Dm V5k֨FvU0@Z8#D'@J�e@ AyC&NLЊYM`fϖ|Y4$'Kp|UqDž4&`ZǏז-[*.\~߼( i#5l(M̕|7i"-X9G ''G5JOԊ� � � � � � � � P�Z$ � � � � � � � � �;vUΝ;k:kXc1+aR ,ZT PV D"v?}5iРm_ ^ZիW/t(W,it @ !@,Tkpi"T+P'VY32V5˖I#tYm:�@+Wjʔ)\%K֯O3s=z-KVѴ4~x jh |@�@�@�@�@�@�@�@�MAC@�@�@�@�@�@�@�@�@�(Y`ܸq֭*UT̡3G$, ZۚKH맯~jOJ}HÆI˗Gaܻiui-O:)Z֤4rd J&5!@J8!@ T".Z]̴џd XFXxCP!Y5^N:v3fLt)caxjŷ9-L['@V~[z(=-RFS9"� � � � � � � �*@V,<� � � � � � � � � @0r3 `,PM�6M"PeX@2e6I~*s԰tQҽJyYkfTA_D6oN+F�4  @ ~]F 7&Cz:!C>zKj8uRW|PjoݺukW[ԣoRNN[=m#P+nD7l<R/ ;  � � � � � � � @` ̦! � � � � � � � � �/zjM6Mݻw/~F^Av!aܱ@s3KZTkh$"U$m"YK|#}t'&YVժUզD4}=ipy$”u D.Sf 66!�-` PQ2ݹyGPI`ۤ ljifB�<^ziرhL,xǮ5SbkV&Loz*ُ$l AshԻт[MEԨQ5@�@�@�@�@�@�@�@�oC � � � � � � � � �S`ҤI.le3Zql337PBy,0ZRɵYI*'5n,]~qc&F`)jJx9@?=XQ@ VZ5jdV   ^ &q!'43K.D{)0kt)i"g@P޽{k;̛7y2=UF]>=v c3~]H~h[ ''@toG�@�@�@�@�@�@�@� U� � � � � � � � � �U믿va+ժU61p@6m׬27h1̫bq X!թB̎@ ~x5h UTuk׮\57{O>\:.g`O)`Z5kk@ �78B�4&,`!h6uW̋0c XxJ͛KO>tJ%{B ;vlgT]) 쵗4~|3goKV~t>Zh6l&P7 � � � � � � � @ @�@�@�@�@�@�@�@�@� XV݃ڼ˂8.@ZF$Rۭ^-ըz1H}XQ_X(Qs3o_㏥1c/Ў-P@,t'21K'KG-߁k" *DK^{t!Ҿ2O!P̙;H5$Bwm7w]FjhSԊo|8M t>2wiʯfikKGX~ظqNA�@�@�@�@�@�@�@��Z4@�@�@�@�@�@�@�@�@�&*(﫳fEn̹jck̯´X+Rr_z뽅T![bQ%[7O_Y�Z&Sg9G8PztS_xA;{jښN>g) @iz 3cǎ-,?Pk$<Wi]^~);U\k B7iS\| 999 jī � � � � � � � @J8!� � � � � � � � � P ŋk̙jaZ;PtHL�Zq1{eI| ժU̐~?h3t }o!m?_ߤkx'@V -B� =&]ztOgE{jt ҹJҾ |t%M7IGj}ZKzS`6cjѦ[&!&]oW Z[Z[-ujذa@ � � � � � � � �U O!� � � � � � � � � 4'zM޽{КXVzRځmb֦ Ze,6u\ŲZ )o!Sѯ ~?h64o.%tzKzK? " lٲf͚-G�2P[n;O:4;]niiȐ ]HEqI/zkҫ޽{kƍ(Z5 2*I{!r̝xʕ+{+w'q? _3ŋDڕFeR  � � � � � � � zB � � � � � � � � � @6؀[f 86j9-e}V`:ZIm#P\o?<<B )P:lo-]stYgII\ '7<RC S`^ U WKvYYÆi- /I'I_j6-U &VZYf;vlm)( )2̝x?P˿ޝ·ƦMLjqNN-9� � � � � � � �X@o<� � � � � � � � � =~t=N@Ogϖx[,PC_ D" P\b*&~Կt3"P-P:m"RҊ[O6I&yf~�XW LKA�eIO?-o= ^KE*ۢ]&ih q[K!� Ջ@`vmjK:UZ2ĝȐ[;CTnU&,h"5j(!b% � � � � � � � � P+q @�@�@�@�@�@�@�@�@� XV׮]L\K-[fbϢ}j:z;kV/`-VԊ:oE}B^~Ym,M6l[Rlvq}c{Cp�Aj֬f@�<g-cҹJ7y)`7ߔ+@ZwG߿\>VWƍfY˪Uvxݺ,x۳e4aBV*$P%p>^rrrJ=;5"� � � � � � � �% U"3 � � � � � � � � � ^e˖~S.]ېnZZq4*T7XY$0u~a ЪREV� F7zsV\9%2oիnWtҘ1wz@  -' `ϖv^{eR߾Rj J.stYk-B� X֢E/3l@C<ZhF>\<jəֱ6m*]+-_wR,`Z 6LqT� � � � � � � � P@JZb� � � � � � � � � �oԊ]rGϏRᚳbEysRʳSWE߰!oHŻf?PR'YւҖ-E >;|E+ jR-N} @?\9RZUud^xA;J<Kep.b=H"@jw) ;vlj+B,hrhN3d.‹) P+?jYߵ)FrjE�@�@�@�@�@�@�@�(R?/@�@�@�@�@�@�@�@�@�j5nX͚5 FBЊ9sZehb6j/E-Jr[ ڍ.Ok֬qLڵk 6o, _rn)F6B Ss`ս{1裭Wt)mH*UxVVmիFS6-{OLLl RKc>\ @ 1+SQ{#@V<Z̋�_`}R"xRÆoW6`Jɂd;O)zL"p'ǽ?7]> �Iݺu :Xi|R2SVɮ1;O  y(5999j߾}j*@�@�@�@�@�@�@�@�Ԋ@�@�@�@�@�@�@�@�@�Hju%=V ԲҲe6SmZ5+S{~l$|%J,xc޴ԥ,[,dϭXB+hyoeAW% 'AV¬,H?0+oY0d¸/^FFC6m$ )eY^RXV͚5UV-ծ]ۛޯ[ի''{ܠAo2 J06n5l,ImJ6vNm^.x|*r|*. }6[}NQ@�!R? l[}$h7$P2$̽x!7\l:@ z6]&%UJk)kە]g.k~4ֲnF$?sN,P!))V:@�@�@�@�@�@�@�@dJ6b@�@�@�@�@�@�@�@�@�*`ZGydZgϖ Ñ7[k f=aB|0wʗ.벑(q X݀jZpadEiɒ%^K,6b@:uxQmڴeRQp^eQ. T# ,*-ƂlI+x뇌 7oM/0c3õlFn$@OiӦn[ F,i\vdӨQҗ_J|"M"E"rxƎCJ={J?[-ǧ]b}SR=gLò{{ZGˌ)o&I=&=`֥WޗW_-K@ z ,{/_.&KIz aBco8ҹ Z[Lդ Z[ER~߾( � � � � � � � �@�@�@�@�@�@�@�@�@�+`)?n喼Os9s/aƐܲd}FexeZ".RΝMGhd!Oy^aMv֍naNw߂t!y_bEUӛ[׬Yl!f]RM,̦ӧ{gv µ,`;nޭݷ;H6]Bl?bQGE'@��@�IDATCرрO?&N*U6nS-[0%;VqSb&OqX}Q@�'ЬY\ãZ/W[ KzI/.\J&]wtKJnDǏwA.iVUӦ .vxYF^zudy X J=5"� � � � � � � �% % : � � � � � �}IUm轊HU:(EA+jaKT% ch=(@ibDQ;ҥy.Sv|>rν;s< � � �I6mvΝ;'q+үiƍobG YVryC8 dk)/3g7oϟo ]֭[s-BֲeK.@tv%TR:<H Zi6B~łіQ--^ ǏAE7ṋJ*jڴiYfѢE ^3jneJը:tQ۶4uje͛DktՖ-`x{*1?!)UbB*@�*rtҩJ*tIݤkǥᅲLp;x ! 0-)}ᅜʚ5knM!@ ԭ[7Υ}eK#]L{/]>3@=t_~b_R@�@�@�@�@�@�@�@�RK@:l  � � � � � � � � �N"*u$uɚ@-%&k"s˺-UJھ=Vk]*̙35k֬ܛ= - RtiFc!HtyI&f5j$ Od@jdpu- ^[߻}]T]Zj6m仵m~)kPhcgƍm\B_9 gRXLJC�"G"'=75Y&~СҾ[,p5ҷJ' HXV׮]}G� GǏOPk4Jd͛C-P5|z侚$Apq>z~K7' Xlo  � � � � � � � @J dMC � � � � � � � � � Pjo^eʔ)z!!`Sݺ19&4nK:e 6EQ6l+v駟4m4[j#xR\95o&r!ndZG e@ 7:vX(&&;w̙CfϞ-;pڵ˅וRf܀:w[d;vd|SOq'P+9�Zzi~}rnu+W_"t-ٷq.=+rwڥXP5.hذaJ.?FeKR8cB.8 TRE+WSY}ƲTJQ;;" � � � � � � � @HB0@�@�@�@�@�@�@�@�@� XM'>0ըQԫ ժI5kJT>ZK,ѷ~o6o<7Xd@UVDw>{laZe'Ɖy5eo+CVPa֭>\k >S=#y6a6mԥKuU=zP3~�L Ԣ*y?Hlܸ_{ħvjE�Hwj]~>vku`DoEf>Ȃ>Pp  <tbwg_b͚5UV<C� ЧO_^?N߬�E+Zi۶Ҹqj큓 ܏sIPkьj\'Ju{D�@�@�@�@�@�@�@� 1@�@�@�@�@�@�@�@�@�$ XP"pk2ƍ "aɒ jֆ 4i$M0&O,TRjѢ:s`6g< &PBunJ͞=[v^۔)S裏j~1{M~ݻl_ ٲ2sS ~7ǚ @J \zTtҢEҫJy-9ttёǒ%ktrw L_nZYx�qV'H@͛#] 8@1-֗wEjji6|y.ɬ%Q@�@�@�@�@�@�@�@�RN@;$l � � � � � � � � �9V dR"XT6υ aOScS%PJG?vózkV=zp.wUS@e˖UmРA5XB}[*waݨݺuAo}U͚5sK;wCJ6R H,mZjE( �|tqҀK{F;Mv}'yCh>9GP/ʕ˿k׮ծ]; !�q(S{q /C TF)%8@ץ;s-AEZ,jժiÆ Z7SW<'˳T9˖-#P+Uہ� � � � � � � �ϻ @�@�@�@�@�@�@�@�@�T:u;"pF[/]@3uoV/۽΍9j(}g5k,UXQ￿=Xs=իԩE(Pn]y܌D0qD;V#G< K.:=.lT,OxTئTȖ)k j-i  A ! (#}Ժu`vedG6S#TÇYp,,k֬.-(s@w7U=F(`ZKF0*`Z6I}'K01Um]e@Z|%:&M$)@�@�@�@�@�@�@�@�R@(X@�@�@�@�@�@�@�@�@�D X^{ $Ɍhg"R%9؝;ac||%Jjז~8-N>]>7@8-[ PG5`�U|o nbO>o i! ײw+Wο,ncǎ ԢJwۛ*?Ebk LA�L6m?!'Tkɂ( l*sԿtŅ/TGWxITի  a*^뮻j*U[H͛#Yeh67į&P(xNVZ˙@X^<@^z%%@�@�@�@�@�@�@�@�V@hX@�@�@�@�@�@�@�@�@� L6MoZ˜f,PQٟp{2cdHJ[%U+ZSLo7|S?ZnnpmwaqnL D%`!.Gqيk׮uA?wܡK/TݻwנAt)EQ՟wܙ@-Di6L"9fjE2 @z ԭ+%~tҋ/][>koU?_.<qe|&t7k~O|m@ U1as1 h& \Yڴ9LT~K�رc+t-}qFf)7XQ JQ\l<-"� � � � � � � �(b@�@�@�@�@�@�@�@�@�@ ӧOW퓸…ubEztjnnBնm[_̙35k,=:ꨣӊ-;e@͚5u'gђ%K7?-[gϞz<E Gm&t"9>jE2 @ X;H\ zt=OC[έYXN} mUi>#ZtiU^=E�b$`~mڴѸqbT#GR%i:y<Pw %PZ5eZDnD<ھ}VZ'9@�@�@�@�@�@�@�@�R@(X@�@�@�@�@�@�@�@�@�D ̘1@b`/Z$5n\tZ%nPSv># 8P(گsjĉ6l-Qot]wɂ, 0@Ç(y晚0aB*>׮]*SL۱L#D$S$;b$WZ5EY@ G䂡o=WrcSstEA@CHӦӅ|Z-B( @'9)DBL7m*d7'hΜVc#ڰaC j˜*,iٲٟtؓ˗CY@�@�@�@�@�@�@�@ +;$l � � � � � � � � �سF6SvR5r4^T)@ĽV,~[۶mSO=ò ^|ԩS}VӦM_9k"@:u{Wӈ#eO={ԻW,q#Ũ`ΝqԢ*Ɓa(S$Z@  A_.w=-t䑱 Nw5绛g'폽 /HO<!=ԶmZj_%@� X7|#J͛v&~R _g^ǾԨQoucti/wOA�@�@�@�@�@�@�@�H9RA � � � � � � � � �HӧO ۷#JEƍ\)֕,HHM1VvnwqfjJuhZxFn @J rIGq~mտuYҥ>Äo R\t|)ᇓ(@Ovo߮*U[ �&pرْ/dF;'Jߟs#G; ,ZK.V:v|jEFR C ԲSưVFreiӦh`5iƮW)Z8(e�Z-hٲez%IA�@�@�@�@�@�@�@�B >6 `Q@�@�@�@�@�@�@�@�@�S*Q4iL)qd5jT"9.]Kv~5M0azaÆ骫ܹsuuשFW’ 4 o .\c9Fr:(D� *SL bNJ$T p;l[ZjE� .V&y@K 0e4x4`tafvV w'<wݑXEڵ#_%@�tAժU}DI@J]_PJ.з/Z%W5k֮]Z?K.V� � � � � � � � rj!a@�@�@�@�@�@�@�@�@�f̘vکTRpD! l*e'o_m@;+neK޺uA_~>|+T ®O5tPjJ<ez}@S [o{)|N>m;fϞC/t'x"![sN.?JaRfoF7xv̒)~Gl2=.L$]{EVk.)> H =_[gT*}>-%`nj :'3k Mk%K.db1B͚52&Giv RtyUV#xV5* YWBi S\JK\Orei.B- Ԛ>]Z:tWB˖-+M˗缿wOQ<,P~x6D � � � � � � � �-V� � � � � � � � � � Lw#ڠ܅mgM Je[V93W/gj]VK/QFGQ3$mietz5o޼єEGiѬ5˾{֭N9M<9eaÆzw37:\?wDZL4#8IE$b6矫O>V{1wp䧛& i'LP*eԩ2e@܍ ayW/4i.׮Ƹ-Z4;6rYXk>k˙3gFq')lL XK7 ]rtˌ͘RT?!+ORΟ??AIEHoMr .HZ{6pK4Pht-wi_vb)лwob e]*WQLBf2)oSSv Xei<eT/o|v@�@�@�@�@�@�@�@�bU 4VA�@�@�@�@�@�@�@�@�@ 6 7Z+qe ֮Z;z5jHUʅfݦGqB6(0? & |衇#W^:sUp_@L˗/;Syzꩧjĉ?)`h<J.?E+VlAK.6l5k~X޲R?Hz쩫*\u>\pٲ�hE z7:t<HVV4dq;vl@-[N|g}RM+y~='Pt9Z.օP _r;{74pN M޽,P뢋.JFr>QR.="Xi5-+ @ _I} #TjeӦ{-F۷>uf,]sϿX- � � � � � � � �D)PQe,� � � � � � � � � �vءywD'`!GGN&,mc}1Z⎤ܹE7؍a}[n 2')M�G$y 7hԨQ ,Lr+΀vwߔ۾#GO?a,X k)^G(6?1 . ի0ϝgZVOٲeU۠Mԩ rZjM!zfa|z)$.;PSNJ.1'Dhƌ6,3#\ti;}4M&Mh}V}tr%^.pW8!#@{V)9a„hWeTSˍ@o_buv c2\'~mG/VÆ #� � � � � � � �S iVY @�@�@�@�@�@�@�@�@�0- jݺu+g JeBҦMҺuRٷB oy} j\x-нA~iM4IUVUӦMuk1b|M=z饗g{a|ܹs7Nr?_v>?}]=Hw}ի[O$V\)gʔ)V>luQQ_F֭~W?k$ېwl`ÇE;<[l g˾k9snv?z:u#o~W_}U7ntjN;-2<c3hBN8}GzW7mF?餓tz_+ی?-_\ݻw׵^dsk硇ңntQC>Xs=WswڵK'|="sߦML97ԢE4Pc'$V,)oС{K.yg%q"p;h5+vaY ,|9f~}[oŒ"H7 /sjck zj$UL Xhhv7/ĶK]u]{b =s>dӮN>C]®ziӦ:v*ְkm۶i}v f׻vMft/y->s]umq#<eu�>}f ղnڽ$S~r!,Yₑ.y}[B,_TŊ}W^}>(W ѣGk̘1ޮKظ;ԲeK]z.|}~DlhZyAC ;XiArrHO<Q _zľŗeM'PvmM{=p3?+Th QJ.Яrߙ]w>jL~Ϧ_x_E #� � � � � � � �[ @A�@�@�@�@�@�@�@�@�b v{wg pM5jtxY4qa``͚5i >;-'~L 0mZr#[Z@ g&yj~z 7`VZ R }Ӽy tAy*U./7v؀ <[.첀 (? \X_]v~H6�'x"_>`_ q-7xq\W`ӦMnSrH7%wmzG۷o^~Z \(GpRe0`@|~ ]..#PzSO=p .7ׁ=piA[[n ?`q}4C7_S.h+s7{^6݅d8#.,"HA}'xb$'m׬ţq:JT5S';Y?g}S)t$wrJ<wn']X^.WϞ=;~qLp믿>` , uY7;ZZ/?va҅=?|\qe] 2!%OV\P}k {5=R5M󳽖\^\~Gl_]u}Y.a}]viu1k7W\A\`X0XB]xK kNjUaٲeߓ..`O>_o/vB2p~ع>\?۞u\eUneB Jx}wi_i+.מ_D ٮ3kJJ=Ȯ9(%Z=uQC wMl*GME Ѽ^9 PP+(s@�@�@�@�@�/7p$]ZD�^`ڴ~zW5J? � � � � � � � � � @ UNShcS-7NmV֯Sҥh\;}[$N?+%Gy\ؕw ѣBAO>DnnAB4p@ܹS| 7Æ N. Kn�o3OCʅh颋.y=U݀>¼t1ǨRJkB"݌BK.Kn=ܜ[n=hԨMI=+4]o׿U6l(l=-_\^z\?x.D۷Ϸms׮]M2e^ҁ( -槹:n\v.$?\C `˝iҼeJT7S'߇vN[σKxOozˡΧ6m?IwX.\/\c#ɷRO\X*# h,ZĚLNgqӏ?{_9ݎڵk`۶m*/>_ҿo9R._燻- 0.髱s+v~iƌ 9vh . v=tVee%_h{LN>ũ(} VΝ}. ٿ?+UGg!ժe TQ}C}맟~\X¬g|ozg {l/_pnlo%T }tkwl_ZnݼK^?ޜ "@ }IűC S/6Zy 4kf][EBqϱ*{71tɒ%.J/sLL� � � � � � � � @hW`y@�@�@�@�@�@�@�@�@�?VZŷ } k/#ɍEI@˖9[QM4 mT_||^˭J*qp`x mŞ[pXL8Qee~/@v'Bl�[N ap%A÷lWזߺut!6gX 8M guE[gOQ/wmA#)fl yK5>nTo J;r-�m4h[<1r+Ԏ;#e,ַ7J옔4Pwp/lmO[l5oپ}ڰaüy"jh6({>}dAYv>*X*TPp"+X 9ꨣwy'8 XE͚Q5,+ `)OҥKpu_7um׶E]_Y`Y\]ov,ծ!7[^6Xyn4bze*# =p\ 4~\zI-vף\α컂sPQ}C$``,‹f!ѧ~ ^l}  f~7DwY% nE:+l`Qp*옆�s/"26R 37o#VƎUm@:urHͪeJi( � � � � � � � �)@Vj @�@�@�@�@�@�@�@�@ l֭[g@vݍ-\xZ dؾ}N;3gٞ PW_9#Slg}VӓO>{/V5m]/Wޥ_O?rL �̚5/~7kwm $^Tִib-ZȷYo<O"<"P2zU2ӽmO>_s5`S^`6`<S>tӟ d _x߮]JlH)5R?HO4<o >T+fZO~Cڥ$L$u.N߾}`?} ,] ݼ1/[zqֵbk&ܵm5WԸqcrK=GS z|;?}hR?z9͛7O,$n#GrWDLF պ.N.WrI++V!!fpCB rx^9:"y./X]m>wY>|%o7 ^ !Ҿ*TE|t9ZE,9se >BFU5k)pG :uh'L;f{ ڴ)6<7׮CǍW X(>S #-Z?@�@�@�@�@�@�@�@� P+5 [� � � � � � � � � 6;Zѿ�.YǍ7Aw-eK=ۼ袋d[�T*;wwug>[#G,r3md Goxvk׮uK2r~ofj6QB/_&l۶OH" Wt;U GޤI"] ssK./7jYxC^{M ,㲫 T^蟊+{=')j ŋ:tNJxOv~[V$SC9DypM9L a:[;vlRÆ }'t@R~UJ6Pa=kX;,8¹BsuYPTpC.}(Dٱc_ϟ~N9FIB4,t˨>4aQWSjժWoXBF/{>>m˖-zU\9IОmeQ}C, ٳ5my#lW}߾}dٲeEɏ5 k rx6ٯrdn/VA%m7q 4hРĿ$ni @�@�@�@�@�@�@�>u � � � � � � � � �K7oZj&2^7/ecG3D+ԽG3l(7rI'C֬YIbAHCUݺu}3<*|wܢQFys:S7{?e˖Z||deZIܹ_>˷ nuESYXRFv©-IfoH1 n|۴nݺmnW׮]Hyqtun$y vTvm+|-6$rvߨb*.I*^κOROho΋-T*]/ԨQßÝOuYꫯ^z_gEu</e<=^zƌwqM<??MI *UZ+;RqTG]ŹM6<eO8YPkF\ve>=ZWݿ\kD#`O>) %=tҊPe˻{?Tߐ;o n`%y{߂NsIM\X}7O>$}a7b<d>R3ƤXhi01kr*A�B3  äx T"mVsJI@:uo%[@~d}.@�@�@�@�@�@�@�@ uJcÖ!� � � � � � � � �dŋ}v5k, dp`R͚%']&P+G]l+u~WVMv;~`x H0X̷ƈ#s x}yØn&[~n1i${~JiV-§[oՇO͛7}رcu֋/yF mOp~( ) *?m47ݕ?_~N9Yڒ%Kd [fFt?+>c(TʕW]u f/yK>}kW^Swq_> //'Х^C|Aʕ+9sVP>l>P PSCfu7ֱCI!''O:ua4O=}e~/؈)R?] {AgΜCOW_]Gع^K +s U3܃P2y󱕥K쯑qN< Qk J ԯׇ<>Юw'9']- 6Uҥ5]X=СիO?S :jБ\孛$Js>Iݻ<NT֎YQa}%\wz&M7D /X}e YW-WT`aܑ|.[? $O.[ݺLq výFn_fDkkkF8P},>%FOS Z1/.(Ub ںUݤ}VkԨQR@�@�@�@�@�@�@�@�( � � � � � � � � Pl7m SY1Gz;^*i_~pp>$k@}dvo%!ۑ-[`֭[7q16lpNE/9g.*?9pQG\Ν;zp\UVng}ʕ ~o6*U u]Çևu%0qĀk>1PmpA^7�_ rAX~Hrv:\Q#ϻwp`6#w^8?Pm n0 ^m7n8+~: ;.$*>Ǧ[npFv\Y s !C䶿e˖j ~_Ϻ'Oˍ7.uٱsFpܠ5`[7_X!Rp kl:  [4)Vpi{Ƴ|ɁAŤ ''Os}` <1yƪDOمa).;u/g+2O?sÅ>;'ش޽{瞻"muAZ?n.1-swI;2. ҷ낇.,wd@͚._Ю[jp'^5]3{װ6^s~kH;-Zx饗.4y>93vx 'm]D%0X��@�IDATKQ#Lիp炀,- 7 Ý6I@&MSNP}C}p{_pAɹ3~{=y}n}/p~v!Tߕn-0cFy]T2ŝsmHרʬ�c;|'e~ڶ n=ƕfyu G#$p3cƌI`ԏ?K ` uCo#Ԏ@ v|p5@�@�@�@�@�p9m6 E�Z`ڴoezˬv(ΗQ@�@�@�@�@�@�@�@�@=rYcmVI�/G k<Xwԩ|4]^ 5 (>M"9}yҢE'$d-H-Ɏ}W:Dizj&ow;.|8Ouj˶ دŋ -7wn{>CA }゙^{>ؾ}$Ӟ"1?e˖VZvJ*붺uFUW8?̅yڵk{ַ.dd5bbΜ9rrbѣjB Mnذjժ}T;ش_~o^='/7{ \O?Tvގw9u8+VԫJHa&O.dB˗/}|t[:Sq!r!z7,u9y=P# UGy.R?\@\(i<ZvюeJ.h_?͢ .W;:uVm7k܉E<A'JIp@<{gl}|sILB}.oxm䓥gݥ/Dsv$Wz}y`_j;"Jwj?Y={|gWr}olօ?q*=2Ԇ@ g%*ϾO}u=$o2f͒ZδK ھ^-ۜgaOkذa2dH<n2VCˎ!� � � � �o hT@ KO_}+V*oo5B�@�@�@�@�@�@�@�@�@�x̝;W͚5:$ےnu.\(7}muw}$h͍h`kW ^:*=nD?^\rF۩eZ-gIE;@ݶvX.zWOUuie] ł<%owܡw--DQFn: ´lUY_DkfǦm۶ypmS 6R{7?xIkjzuA}mA-$-V)d5[)>=';Z`b*dOB8cDH:Cw-j݂,\ZAL{.yu헝k;vr 3Kz(ض-06baZV^\89K}}^u k ,Wz f̐|oV<xT%}\A %B;/g7aZ} h!V {yug5ms*(s[W^0aBzDn}ri)'T*Y&Z?P]aڵ}X}[K*T.MmN-ݶm5j(7mF�@�@�@�@�@�@�@�F 5( � � � � � � � � �7o5k܍H-P`4ݥ6^]f$=UY6YS2%wosn}ݧ!C/x�blbTZ/xb 0 `Æ \r1Ǩ]v![dh&lK[`͛7A(q,[nU~zިN:q,Sݻ({_<Cz'9ڂl_Yx~V+{$MKIBBn-P+0z=íYfEy5o^PH۲;,Y. ֯9n4h!cvGA ?k׺n+ռysYu߮~tǮimxʞ>('r{ΏŔ5khݺuB`r ,b(`-u]1"REڴ)%Y&R$r֘1ҹF˕D~.8䨂{/,Ub|ɒ%.\=tͥ6@�@�@�@�@�@�@�@ kCώ#� � � � � � � � �ܹsաCTܴ& q'-[FV^]J}YkKy睧?Q_xuwOE]GPd|;w<yW\>N9S{[Y߮_nq˫QFꫯԪU+>UTλ6g}cĈ֭7<UT&ql蟢{)?E˥S o@M nͿJ~$+CkHgşצK=*`[nB1dԩ#}tWK#GJ>+Xʕ+Lg)&p7CgxEd̙3զM,w}$ֵJw)zhEj}ٲ<l9gz心_ԲedoNִ.Wqcnv[_~9ae}Cjq*&VSbiQ@�@�@�@�@�@�@�@�RW@=6l � � � � � � � � @ ̛7OsLyvy Ԓ//%kG.G-iC\p,c>*tt}ՙg,p"QL2z衇-fŊOSN:඼_ZOcBƌrݨ*UļDU8uT+z\\'t ݻw6vl)(}<蟊S=BժUu[3ڵVkg$@>_@ , % =pչK 0jݺntPl^\~ZKgE#,C=VwƧYS@�T޽ʕ+ &b__nB dӲe˒4Z?.-RٲeeA  � � � � � � � @ NMc@�@�@�@�@�@�@�@�@�. XFik֬Yvx vJ4AeiZeXҊii}HӦoJ :}~zԼysuj֬Y QYH{\`[xZ"J:iM<Y7xڷo﬑#GϯR7k%;Lˎ["N5p{o=h9kpGyJ]kW)<F�tW{?\6Lھ{pKߥh<_[.[U6!ugaZի\KFA�AB ڵ&N 2X)1|\>ƌqTW@}eS #.\ })DA�@�@�@�@�@�@�@�HY#e � � � � � � � � � mK,Ν;$SyЃZ Ym・+3dg`7z|Ҥmlc½4sL}:C3Ϩm۶jӦ ڼysbmk׮[o;O 6{/IM}饗VZ)#ݍ^lلoSi0ұ u{Vj1!T <!P+(oHO=zur%Vӧ{GIt'nLNz睜PK (\'LPLEJkAeݻ$P0ܟ P(h"o@�@�@�@�@�@�@�@�HMm@�@�@�@�@�@�@�@�@� ,\зݨQmC6lZuH6]6{mP;˿B;,6mwMvۍmwc0>}h|iZ`~Mƍȑ#ʕ+G7t=ؔ<qǎI ʫcb# S(M6B ļd :MV>Bo_ӥ].5[wީ{}~AgUFÆ>\^yD2w?3@(^z'֭[UBcz 0SCTY@/_Bwm)9 HKO 1)L � � � � � � � @lԊ# � � � � � � � � � PbL2( ̟/5m:4Z?.ħn^{֭[QF>/[nE+Vju#ۭgϞ.X%Qr;NpIwcǎ)S@.]uP۷TSrT)Y!P+-`cv) !m^̺bi駥})zꕺ3]w.ڥt[<]sۮR:O %`Z۶m/)qREڸ1deuҪU^{e%Av~߹sV\׋yM\CgްAV-qfSK .TiW@�@�@�@�@�@�@�@ -<ll4 � � � � � � � � @& M6xjQX@j$u2qiT>X.Jڱ ǿ̭Ql/.]1c|Ç ]jѢֲp=zk׮^zah `6X~I&?ʗ/nݺi[}\͚5Uo%.W\+AO1@Ȗ)#P+RET)Tb!> {c:KI׿>OGWMNi5lXKKtY7xcttF _/xԽes @HVZࡽ4qDBJnjٵ %}J9񫯢~dv>@wBn>Z X[TjC�@�@�@�@�@�@�@� J@�@�@�@�@�@�@�@�@�2X`ѢEjܸqavz_Rsݺ鲵a\ԫW<SZ6„&Low-[~,Cѝ;wo͛7Ŵ@vԺٮ:uM2E}/^+~ڝz@ *Z,$, S:%1?ܸq]jP1 T~G ҕWJ' ,=\tfw8C7O3vy?C}]w!|,hm&F|C3D�)\Y#wb̢Vj d3@x &;]ƻ?oV6ii7o֊+ԴiӴf6@�@�@�@�@�@�@�Vȳ � � � � � � � � �)'pB5j(+68vBY_[Z2 ЮT4jTb djt衇[pޒ%K\׷fC> |ng w}վ}|-ZL2*G [nYӧOWی3dƍ"iq_~βڵk'|[&P SA�SG7Kp@X#qj%ΚHg;NBϤ:譱Y֖oR_z˅r \4_̹^s( @ X}LI@*ҦMi+[9 (^5]٢EPnu#-]f&`jc3@�@�@�@�@�@�@�@ #� � � � � � � � � ַoTڤ˥Mbs㺑jŕ>XKiذ"Iʌ nr߰a~M:UӦMO? ̗32_rԼysnڇٽl+_|n]<@hsh͞=`vR)na9 ~;uWSNС*VXܦvm۶e)m_O=@- @* Xx2[sgi@`,5CW^F8 g>s֭>]{Ȕs馛y]e͎ @^z[nq,>bIfBrei}e3EԑWǥq6lHVҥu *u3R*B�@�@�@�@�@�@�@�&@Vh@�@�@�@�@�@�@�@�@�.\FEKe@'PK@-$ PG Ijժ>k׮Ռ34k֬ȑ#SO)Qڍgõl&M#xݺus LhYv!Z˖-ũ]Zj۴im۪ K[]ǞvO!@m!V{"@�H^{I& $]r䲥1ޠ~8'P먣vOG۷Bw ]K>s^GCd @Q={TR4qDwqE- s7n$P+Fq_SkNsXILwEŴL~}u*-VZjz@�@�@�@�@�@�@�@�b$@V @�@�@�@�@�@�@�@�@�t#-_@b q|!PKZ%5h/`lo$-qDۋG 5kT޽`+VМ9s/{ EƍC,'X ݲA{!w#իW/WT) i$%Yݖ.]{xbo6Fb!kΝ;P-[{{P B&%?}?*V2eʤM �Y*p RWH+y[oI7$i3tP<xL9pLj_|>Og^_ @6mhҤIj0*WY~ &*[WjN3@Jd7Q oKƳ)TLjA�@�@�@�@�@�@�@�,@V@�@�@�@�@�@�@�@�@�H,f׮]>t&YfQժävɾGj%7n,u(}qjFn,@*-\PYp;/YIRZ5޾޼{qVvmm@l Ǜ7o֚5kzj·߂W\d7{n-hf7^#v5vo:u]زe)SfZ9U.)@R)l\}/K*]v\د\0t]ݜh=s޽~]wuE/̜3o\v4@@Ϟ=}V<@<d/t4zt|M4W_}{E? F<Ԋ*u"� � � � � � � � P+>Ԋ� � � � � � � � � @TK.[( %: j,u2u鼁Z_J#FH>[*J6`jQee˖i>)oPnd &:m۶m*U䃵,\n5jPe\v|lϫE *W,n+VKޣTcYʹ_^׮]feagZg\dի珹rWΝ;e7ΫK?W.;ֳZqy/]>0vRVA_|!rԺuћ[oΉ2ދDAEgC zbgbNg;ED^*QD.EK&܅-nLy^d2L&֭[2QsIK-[̰ Snݺns{de(pysH{ R8&j-^8UNsr ?,رc|*V@�@�@�@�@�@�@�@� SN*C�@�@�@�@�@�@�@�@�@pjͶ̔4)ejrUʅҨ1 ?x>海,ʂI0UzjYfoTeR7nt\n jdv*UsVTT)wKɒ%UD P|u^لw.ܖرM=e۶mhY`MA%##Í0 _[M#Uz:eac sQb/'{Mkޓ,L-{ݶ={*[yӂc$`jj&hܪbIgK+]tQҡt>݃ƍӐ!C_zs_ 0mtҍ7Jˆ ]zqgϞVZŧj*TAݔ8 )+OS#T+ ڲe;O5j-] G<,P˂) � � � � � � � � P"� � � � � � � � �jY:P@CnT]&\@d#ٿtAjiviܸqf!D6m{Ibzժ#]s͸aVp+ $ eY-Ƃ ?n8} ѱ%XNk ϲό֧�Zگx Ouhk{?|^{gOz[oJ=,Tw̾k(_H}.= כ:U>\6LzEǤcݿ T9r: =C.|˥oQRR|뤓ݥ{M!2(@ f;vq~jL5%K8@jT�Vb) x -Z$@k~ϒ]*c_d4iR@�@�@�@�@�@�@�@ !j%F@�@�@�@�@�@�@�@�@�_`ٲeSN+h HCizu32Bl6ZϭpUu{QS\N8!Ue]#`pV,T?E:YxCH7c=*`Z' !`DžŊbC6A�@ |tqGK Ӳcptrˡu w5lsڵӝwީ;C'x"!9yR}Fy\4fϓ@� PT)uIugǡ /iSx K815SgX;.澔/\ /Ok Բt\S6]vƍ2j@�@�@�@�@�@�@�@�@@ � � � � � � � � � PR7#VX a[%EdbawMV6tgk$iݺ7LsQ |駡 zc l޼k\r n,#RfR~~%}Kw ԪPB30~ XHJ>$C� L :PHh[4^]#駟6moϹ .}˂ M̞Q]CPFGC@�t JLkJq7KHٲM@Ϟ7H۶ű4tҪ]9jɒSD x5UDH6G�@�@�@�@�@�@�@�$@Vi@�@�@�@�@�@�@�@�@�O'lޫ={.DVv>.E'0zҳJn~W زeDz6K.'j UWI62 =C XVna:6_K+#+ed?f̐nU>}{ئ{1b;=< t=cq ; @Buӧ}R(ڋh7mJ&kzI[BՇthAG0HXTti$kNXۏ@�@�@�@�@�@�@�@� _'}  � � � � � � � � @:,[Lulv,JTe͵F�Z{*T*!V@ 9uҵJ眓<_6ou\r~HOKeHC$#4@j�þع@-_:@R:#^+8L+ܥR[n~Ej.T'KhRnv2{f\X`|鬳sϕ.( @viY%K7ƷtIAiҤt5j Ʒn5kfmFA�@�@�@�@�@�@�@��ZO@�@�@�@�@�@�@�@�@ VXڵk(c?LB*W}AZ5i>0@iǎ%F|dgOSmt'Jضo|R:T)Y`ӦMPHj('.L+KÆ҇J?(i#or!M7ݤ֭[ݻo l" $YSOt@-TJ}>Mjwnݔ8 %MFҼz 8#JNu )R{ ؁>@�@�@�@�@�@�@�@ jb7I@�@�@�@�@�@�@�@�@�TXrj֬Ì,Pyr*fMeK@Һu҄ k  mB2e1cM(X5$`4V^I^_=,+KT`ƍwEzI R< #@{O:ɾZ_#͘!|4lԾG%5rH/<GMh"^]$-^,:vHUbŊC!P+;؂nJ,Pkdɾ;R#`GtD)@VNXܛ?6m@�@�@�@�@�@�@�@ j%�&@�@�@�@�@�@�@�@�@�O`۶mZ~=Z!ؼyr_`.Z@dF7Lf/h{_K/~Izm^#$`4.샴 xupi`~x@N@YRSqK$]ץΒFJMJnU9� :6V͝;76 QKB/嗥^\@]v%PvlVZxv] ڼY25]An:YUqb?, P+Ԉ� � � � � � � �K@xR/ � � � � � � � � � \[f͚nja j,|kkH[oI{$xqiĈЄmڄr@p ξwO?Tk#{*_|l*$}d8H=_N;Mgqߴ=v4i%=>|wNAzV}u8; R+ ? Ԛ={*wMlME ɂ&N#^e%333^M^b6lླe+ b+Km � � � � � � � @_�YjF�@�@�@�@�@�@�@�@�@ *^?@},Pki۶}~~]2%Q-N^>s=H�Z?RϞR.lL`„ .LdMMdDʕB I@$,qΓnAzQX86#tg3{}ҙ=v=6+VH',utZ@�t֭,9q}T kJz"P+̍\Jmq~KVNerz޼y*6mZԪ@�@�@�@�@�@�@�@ Aj%f@�@�@�@�@�@�@�@�@�K UVVay.+WMO־4ee͚5&^cGI76-!) , $r˹@,͐KIkY5c=^n..UV_oLSRTreիWOm۶ղe|;:~7Ke˦߸1*gO(D뤇?q#u�:|iN:묉zԾ-E/ktipŗ^Z=d @ xkV DV|.ܴ)mP{Hwo/EXjv;r.^ϟo@�@�@�@�@�@�@�@�@D'@�@�@�@�@�@�@�@�@�RY222ISyۼy6u@-쿁 JظQ_nViĈd(uTRWD xPh~Oa~iVvׯ_iUREum5! *W.)M(X`N GɎF& DX]Ŋa.HR:_#*p_KIsj �!�)*p!}[d)pio+][h~7]jY`<B XVUtBmF � � � � � � � � P+洈� � � � � � � � � @+Vf͚9q`Wy9>k']&}Ǒ$͚%͜ޥvlsΑ z1: \rz Q*j WK_ 0ǻ=!\@ XHjDO<1ҙg&<�o!M}&-Y"o:[:}!?RN �R@Xj^W ҦM? n-ծ-Mzf͚(XKC[4 l6  � � � � � � � @pW@�@�@�@�@�@�@�@�@ E*ľy7J() Zع.dw693%w-f߰abۦ5!n:UT)USg@l2e HfZ v3Kw9߱WXQ'tR صK�0^)SBUG-M&_+H.+ qڶ_LX!%Bmj.$xY[0ƍzS8qߥ܏S@Eg/ n � � � � � � � �G@+z� � � � � � � � � VRjRttּyIB0k.WN*UJZ6O^+& HVҰaK=z$uC >ׯWʕS9^`v'C%( \h/B.]:Y@2GWM>m"~uWe)'ܹKw%l)g/ҝ;gӶ#)=T�$MV1w|ԩIC7l6(3> I ɂ) :_úeHUHKp] Բ6  � � � � � � � @pܟS@�@�@�@�@�@�@�@�@�@ k֬!P;&!vQr &N>YGi7͘!stE)NI ͜IIK1c,+r :`ӎ;r-jp|$n]3jh#{wIPVQlU+VG3GΓ:Hԡ4mCد OS�U[h)Sĵt܂-$^B!ҭ :sG-J;޺uK]#6 l#P+,VA�@�@�@�@�@�@�@�|$@v]A�@�@�@�@�@�@�@�@�HOիWU]o)؄syE  kזƎMPi̪URR.ң1COI ެZjJA,0|4xT~ر;q?%JGjٲ>p X[@F駥}?;VZMzҿ-C8µ=6ʝ^Gv|=~dcf @9_y{wmJ5kJ&]č 4_:ybXk j}?.^ lk֬Y+@�@�@�@�@�@�@�@� 0jB�@�@�@�@�@�@�@�@�@ wrwoҊjeDV^2]^Aj[}NSB pXo?駡kS  r?|v{_~oȣ$A ++hIh&@P+K/SzTBU勍ڵ}W3ɂ;w;OrS 0itK}ġD�!@V)_>TjQ/PԳ4qbJW͹ss:jᠶMF"� � � � � � � �$[7}  � � � � � � � � �$S mӢEۦjg/z4cSĂfFz-fTIw={hڵZjSMۥKZATNЎ;rJ*0`@eAU䞢ʕQGI#FH*6Ƚ��@�IDAT~{�:a{VzeBZnIZ. X@%KOnY@ | \F TZq㾏p?^v AyjZZUbE"?" @�@�@�@�@�@�@�@�$ $xE�@�@�@�@�@�@�@�@�@ ,@VX"k Բϛ4|tZ@-=1cӧTKO<!)uJ#c,֯_]vOYߗ6 ϐ-ЧO.]z2224tP*Uj2n CŊG{erh"idSZ3Ӥ_x@fͤn s(  @b:w%Jhʔ)i0Zq0^ٰ!Zڱ)%joZ.ZDd޼yjڴi � � � � � � � @RJ*?#� � � � � � � � �Ν;eaժUKwoZB0MV&P?;kW^OR'6Jݖ~bE*QF*b <H(@_u@2etQG%X\xi*Rz~B�RR˖ԩRGR2(Z;W3Tysg$wRUGix)>Rj@ Jrʩ]vjE4"+z,;M;qb뢆,P˂(X֊,Vsh" @�@�@�@�@�@�@�@ j%@�@�@�@�@�@�@�@�@�]`͚5Z=,Py6#P+od<r晡&f&}n"q6,5Ȩ0pV͚5I#U^J.(PSF`X,T#TfRfl $,P~A m.\ԗ\"}\ }*0T"=\dW^)n-2/Qzq祶ms>=@� r!jʼnBP7ƩOX1gOi„bA Z{AmQE:PݬOFAVi@�@�@�@�@�@�@�(�h~l� � � � � � � � � @ZUV-R=1ZqI]HmH/S-[B1ZG5C6%TXr75jW.O?-)# ˃,B �}ݻe]tX@j(]Gϸ@fԽ4j4vCRszg?4ktҹJ:IoS3CkNq1@ H5m4aV Amwo 8mѢ~xT: u{@vsʞ_@�@�@�@�@�@�@�@�` Vw- � � � � � � � � �%vZo@UTIy4uqn$忝wY&/U Ri||jРVN_Z ++Kʕ.Qoؾ]zrt'vҦMy[nU^ɷcu۶lΝme{M<֥7`{)QRd322T,.r-[{,^4ŋdO ? 1%+~C-]|3,jwSM|9ݸ4rtv_'ܓ֭ >XzAD@�%`Z\, ٦Mdu#%u e_}7nLvPe?N.toȎ4h1ĺ:vuQ9ʖ-[ǀ% � � � � � � � Bjd( � � � � � � � � �X~ip{QVIMF~:Uzu:ܿc>Єٿ=wlW_}w]5k" ,_\jWD@m>frt6Xvrk֬.%B]lB.e ŊX`TuoSB·oիW �/ زrou?PpȗeGRlLUBUX1׋}`c~Zj=fc}tj,5ǨmM7I<"]xcrQAI|lY$.}tҟwԭ[|J.Svy\'@ I۷Wҥ5eW^wn Se(U.M@VH|΃WTIՇXOq[ҥDe3d 6H@�@�@�@�@�@�@�@�#g_S@�@�@�@�@�@�@�@�@�$V WvdZ5jH7K[He˦|QGI#FUؽ7K=dU9*&E`ɒ%^(MPK?.0|4xT~X-[L+VpiYZhv{K-lܸ1׎O6-kԨ~aQ$U|y/P*uYw`hAS/Ŋ˵.>}HոqVc{ `-lqk -tŬYrٶ1.jl ڎGԩ xQ!/~Z0 /0stRfKҙg&O~A.҇J&I"zԿ4lԡ{d>L3:mQ; @}0} ϱCJL+hb!`Qz j]{˹ =@-uFdQ=1z;@�@�@�@�@�@�@�@�-@V�#� � � � � � � � �j٤%JHkh2 浧!`ZV\^4 \pAh~,`˼Kg-]}O+-Ԃ@* ,]TumLJZ|ϧp?H Zx,vb!Zvٶm[ڱP.=cǎ^o�'TRś5h:ucܱSxq/(BbYvر7`+nfk֬,B,f^ًY]իbuwnQ+`=._NM&@ #=t:j$UϞ_H/vd'$qԾ}tu?Խ{*1 �R Np.g[6c)ޥ޽C.[4%ji.RH Բ@�@�@�@�@�@�@�@ xjoc@�@�@�@�@�@�@�@�@�@ʕ+Ј?6Q %wpZ$krl1YZmRK[K<ʕ+jmoh, K"y)I=,.33ӻ,X@ .,DkѢEڸq^fddxw�nݺ6%P|'`KK4eӦMnRe^xZ8Dͮc'O-k׮]{ആ zZըQ#5q 279KӧKqb"po:|n]V6d\?^:87 kyg.׍Rl;\¸O;MA�,p_-,.۝{/Sre+9u۲eK;6u3|I>ZIħi@�@�@�@�@�@�@�@j@�@�@�@�@�@�@�@�@�(�Z9R|ۦFԹs,UJ2DzY[%o;mdgRҡM,Px^zuA@6c&%f͒_z㍔ohFeΝ;7³m>o껃+ :�N: A 8 a*VoFG'P})i֬wɯU{Yo7i4~xpVl5o<ǥE[X}Ga %]uU(tϥC-z zqku |dZڥ8Փ{.u@� tq7o֯>R( ;bEΝS+`Ą jZϟO�_6Xy:R`<xp!f3@�@�@�@�@�@�@�@�d O � � � � � � � � �i/@VO-[B۔-鲅Ԯ-.#8/X?7 M'7,}4i\}Xbe!'RYٌx@_j</9swmxr f}v?UT,d`Ie Hxi0J(Ὗ{z׮]s=W-.6o<G驧Ҧ% +WN6t֭K6mIm\i[h/}{ g.($zH 4(25lԾt)wf=\NLG%@G2ehԩjxT mJ@;+u Qع ;_`ˣ6Ы֩#-[!$w,� � � � � � � � <1 � � � � � � � � @ _^+WN([JKK6a%o&M['y~Wz1 GK>(\DεW\Zj\=RL`ڵpRl '$jU ,ڳ&5}t͘1C?HdZАMj!DZj]W^h 51(Rq!YUg!g,.F·q{Nd:tPΝթS'ձ)9F364z�q$ r'J=zĵ9*wv줓BZƅG`mS%Xx9s>e Z%K|w:sSkpIMŊ҆ ID6߻w(ԝr|^ eX=EɝBB-@B  � � � � � � � | � � � � � � � � @ [N*UJ_B|۶PV!6MM6 H!f6GJSHn'nnU/9gWX5k�KH!%KxW^ &R2Ґ!=ʲ233g2uT/D˂芻T2pcǎ:3ծ];ui6!MMA h^z/5sL/Lŋj׮k<×t3AA�8 (]zi(Dꫥ{\ %uɡp- ֺn}{iPD6 L]&|t1@�b&p˾Sb+Prel뤶,P˝r磤l*Xr.uqAaZ7KMA 8C3gWZ1D*@�@�@�@�@�@�@�@ Ob � � � � � � � � � lذA 6w1@RY<Ï6ѢMHcҀR҃ޗnPT@* ,<۷KO>) */,ȶng}嗲_,wLXJxlbN;M:ul .s%{׬Y Υs *wv¤SݽХS܄ ^F� ?-WR׮o#`-w(NnEX*U)szD@�ҥF]vDy(*Vό$1T6вeK/P+˖^@jժyhe}@�@�@�@�@�@�@�@� }@@�@�@�@�@�@�@�@�@�X`ƍPB D?t (]:m B)ڤ t\ܤ?{}$)##7j4+VPr… ]RyU^=EF0r: +]fZ'OvO? ڱc5k�}.Y`Z_jժիw ?i&M6M| JeysᇫO>:#eݧj{{B}9'5CC7vcAɗ_xO X)H', >sٌWVã.Rg!#-/^@�,{K~D~^t?3R `S+,MBRVZi֬Y)<VNhK=1:9 v auc}@�@�@�@�@�@�@�@/_@�@�@�@�@�@�@�@�@�HKv鶅Ii Ϝn#xO:IjB`7QR駟ߖ\DeʕUV� ƍPC>ÇKKR<djw UJ^}UYܹs5j(]>0l2n´0c&`Y=zu]T8>3gȑ#u衇zaԳ>EŬ}?T'm&}zCH=BLZ"]uaZ~aZ/z\?Ʌס~y4qb(F !�Hm۶U2ewC bX!UE%Ү]Qmfer.^FVN� � � � � � � �U@-� � � � � � � � � Lw*THj;ved?ڬhxK=гK#FH/$i^jմY) ԤI!Cf4i5^OvSO3f tXiӦ𾟞F 3³~W-]TO>*UWRFԡCq.p%/u&ի}|&fM(8ŋO>\&5ӷ4yAZua7]y$;`m@� ,YR;v$P+ƻ~^ܸ1ƕR]{KօI#ވ �$ �ߴiS {bZrkajn:R � � � � � � � @J5 !� � � � � � � � � F7Z䷄@txX1sg *X- zԾtmW2zc2^+sԯ_=� Y!X%' @ff&Zߍ`pgOK|WK+]~[:(㏺5w\͙3G׿4`�U\9΀@:utYg^В%KSN9E~{ꢦM/a89sd!,X(cI͛b})BlT# C6ը!pBkIw'k^I# "]xaC@�"8إ N:5 X@  \$ж҄ qj Mmժ'LSNhٲ [jѢE@�@�@�@�@�@�@�@ jsk@�@�@�@�@�@�@�@�@� P+igdD]:nԔ)8`BOzMoxeiP-BVV7bZ ^5�Zyt},CaUVXo.l g'xZ͚5 8�(ЩS'~x[-^XW^y>uiڵMʾL$ZEV}+=79t _"7}(8k;0zh(ptE _\2͡p'LFh@(?ϑ$}>ݶBiBN)xz>,mrvdɒe'P)@ݺҥ`D#0}A"� � � � � � � �&k@�@�@�@�@�@�@�@�@�4Il٢ 6%bkDWOuf̐6mJk_o_G (_w5. #"kBYԬY3 X � lݺU˖-S&M{#Hկ_$kw^gq8�=Z]v,Y?PC QժU;8z@ ԯ_ <y͛?ާzyA[ ,kI:}Q:ƏڷhuT(HdR%wJcGiX%;t',*墋~ƍʔId˴�   ~JL*V UaCLBX_Hvbc6U ##CM]꯿鸰N q=J?(h޼y+aK@�@�@�@�@�@�@�@� T~G�@�@�@�@�@�@�@�@�Hg$ Z= lR%&]>$~S@0c7HFsNh7ߔʕ+Wz+֪U+ X � X "iܸq�{O XJz骫):Lc9F]vN:a㏺kD, DB L˚9sZh:K(\VƌF}{-`CZe瞓4dZF Y8 7±K*bln^.ջ5)0VA�|(ЦMXFӦMa٥p)ZG)_/}]-rfJšjLuJKjӴȞ?Jҥր#� � � � � � � �AHzB@�@�@�@�@�@�@�@�@�A@e@Vt JI_}N.nQJ/[z]iܸ$ܑXB%JPj"݄jYJ <Ґ!7ŋSOU]F͙3GcǎzeD wɀ'|oM$^6QU.5ndg!`毼"u  ϲ k2cps­-.,tQ#+}mɓk<l �TdɒݮX1'}R{vm087f[֯f{uH˖8/`Z< � � � � � � � �W@;z� � � � � � � � � p m2gSrJ=3:c÷~[q̪/YuT'{on-N aäzsQ+Ն'N_Wn:={ԧO7MQ,z\rzMW#'ʗdK k׮ ٨Y&Z>Zѹs5?% 4HM6aYTGNc]_|ڶm{/qI6 5 ضMzyP]ҏ?JNgr/jBwޑ78C>=v>˗K ҺKM �8蠃d(T)Tφ Z 'лgۖrqfϞ-;woYf8}jᄄRggKg_yʔ)t5233? E985d7.ױDZaݺRVsg[@  � � � � � � � @tjE � � � � � � � � �L`˖-^]ʕYPj/_@'][z3obM6&f[f".m {w髯r{e~VM>\z Գe s/.(WX5kFauo+/X@#GԬY"6Q+޽[3t7ݦ `LσW^ M~z3͛73t7{!Z(1c]_OkSO=s熫(ڵk0N:ɛXy̙^n* {Hzlꫯd̟/}t9#|u IjPP�{ҁ| {r /He>hY`JeJFk>F�Hr4vbP]ǮNj^#B ;^.-Zj% o,,_jɒ%U~ /~믿ք ~ f^XO>̙G~-JD;A裏a;hVppYJdk!� � � � � � � �~(t~}C�@�@�@�@�@�@�@�@�@ 8Iڬ,PDWV͞~]wymKmVh Ժ0)CyåUBXžMm?/bAM&XW\Q6O.{p\ܱc5ǭJ74_~qaywU=ڴi>l~W7׏l}eWw b)3-d?6.j]ٷ^ܻ%p2wm\ LH,l^wu4ij6tP79 Ŏ;4KB4@@~Qɂ, -Xzy n&UdI3~ vN.|4vwwMҷJKUD=[ �O wbxƍP.x=`K ܰ!x}O- NQ%w,[:`u-wb^z^P}7悵mlʲe˼+ &wڸqc/ޯ=ywxms=tq.裏rkeeuپ7X@�@�@�@�@�@�@��;!� � � � � � � � �@8P\r=nٲoz;׺pBq{CulC kihWǰt,)#}U + <󌔕%rKܚHZ;wJ"+QXVZ gnkRJG& eߟ~ ې!Cd/0&G ϴ¶۱qaʾ]QZ)iD*Tn?|ک[n0aƍ{7Xڵ#}0spzE{wy-{Ju|t?i+ٱa5i"~\e(mӦȺe zHzYCȶa-@� oޝдi�´*V֯@gSvc/%F5jPս}7.9{]}S5qMnW_՚5k\K_l,L+ARd{9|}/w駟޻,jE%٢ۚ@�@�@�@�@�@�@�@�"a~ @�@�@�@�@�@�@�@�@�@ ŮN7u-\fU?oïZ/7MvSO7o<HXBop%h?Ԙ1ctRuY:s<ne:蠃t 7rҁl^<qO뮻Å&馛4qD/h*.[5kL^z).eB,@_j'm[xI�5j{hB>O&Ns=3`EK|p3l?ٯ=_ cɓ5><@u`{/f׾+ [B%{\p:t}F?XM6lpukK.矽*:u^oy۷oq_J} ^{_w3CEƏ^{Mk] O1{Xuy L]gLJzEJ~ z㤑1/(–,̎,XN8A7xbHދXnڵbMޯXޓy3WL/_߬I8ER%?C9ؖGZr|j޼~]:˧.I&cݓN:I߼cVkJnthvKp5j]v;" ѴJl 6l1oc mvn˗s;m6oO4Iŋ33a6dwc_;{.7.UWy+wa/ M=k,Y]{K^ϑp~K=3ɨ[l *nk jf̙r´6n>D\P C w(s%;vYviPrMdN]&w.uX� LҥKm۶^閸H)jmPjv,g7"6+`w܊k}, wUTQ^ ɭ[lًϰ[oiƌ/'=Γwvvc͟?_YYY:ꨣeloL xO8wAyۆ _WܐlYx Xم� � � � � � � � \߁( � � � � � � � � � ͛7y'YLm1쩧R^\0E/&?ӼIm|6|8@&?sIc0k6iM~fr²,B�,([n^ۯ_?/<&8 > A� U, e)0-+&0`Fݿ{�ply>Rff;0o2HISulexԽqir!kovϽȑRǎnj<I 5qwzY Ó_ 0O>0={xڄR*׾MW_ys[^sewZjjtz&?V{y¡Y�gúޛqJ“i&9M*wܑcqX8XXK^Pe!KhAYblڻ[xقLG0 AW D{飏> ڴi,1'gZ~} =zxqٖg~3ϧ܎-,t֊f~ %z^?- 'lRHMklܸXx )Sxyp]Ҍg[ L뮻ΛLT_zae1XXիk Ʋ]+wg>^]e1;N뿕#ރ>ǾdO?tzмZ ӪT)apYz7O{_ wN,0-_tNˌwrrrAˎQ,ĝfe<P  @ o&ӦMK%gH]'¯`jZcG 8/P;Yx.u֭^H<9" ]ϭXȻuxv};WuKzmbv~馛dUUbao߾۹F;j]Dz?{u:um;h  � � � � � � � @@�@�@�@�@�@�@�@�@� XMONo_XM`f9^c={keᐇ&MxA6ϬU m3l<ӧOrZ@/Xز_~ zl{ۄM^pZ8LBO>&/W O:1 ڬ%Kz9~{W:-碋.vm{ױ.oM/ܙc1w|,sR͚ 'O \DmB+Vx%beO :Yv^`D+V^{ً^3 )ukB"lF+׹ma"6yيhY@rt;&MId ݰ %JxbR{SzL8L2Z0G@sp.PS.3GlK봰 ?,u^۶mMm!_ڳψ\Ȗ-[4a/5##Cn˖-CL-TɊMkybڤєgZA}cV,bT3gU-5cS^fXpN/{-;>A 2 ر}VV[n[n<n UKO ̲6Nq311,( .ڵ\fv|oϥc=VoW=|romq+UV, ܞ#>ǎ#QŲ\ ?KTi':W/´\Ƣ; r[&`J ȅ[}~˝_zKMk{v( �)(`B-(wܝsM]RxuWv-s wP WOySv&fÏ[wsmn7 xծ$cWywOx/wǾ#IZ?} KQ ;ئMc@�@�@�@�@�@�@�@� w � � � � � � � � ?s(i Iz6)Q(]{ѣuVo5؄Vl"^L69m&K/i׮]8p79Mo7si֭֩g3Rba Vcו*U駟̽ W+6m\N/(c.]ڮ &x.b/W^P7xCƍۿK.MnVAM0Us[yg鞽 gڱc,e=zC3g^رcxoi{MEo!Ye!YbE{M,OTʕëڷ,u а.[?s#֪UO!jtr5C}IQ$l,"HbBQ̊9+z*Έ39{9 b�EPA� HD~?W��@�IDATv۰ঙٝ]]N CCyg8\*W8,>s:jРA~ヒd \ y~^דӶd_ҷFw)Z_LK?%KS]s5P2ɜP'!K[up%ٯ;3)ޖ$!f|V|^Q3恙mT z]ҵοyv]{=B$sƒ5ix afT#yڵs`BB 7`ZHVok@�j͜93,NZQje{ ],hN^4P<'ek<Ix2y4h Zd;ߤ\qp/$Y;`%<_r}A+u7O>Kgs:2)jRSj� � � � � � � � @ _1s  � � � � � � � � Py)n0[5!P/adբţ;% Jٳgt~Aj֬- yHr0ȑ#N/Iɺbm.wuWtC[n<s=M) X|=h0Jwܡ6mDy]t5*j_spBR<.m oϏtwgqCKhZ asRtIɪ8 H~Iw?YUI}]z뭷/x{=r}(v[=(#8"Tv d!.6P-Oرc�J~~Y{7]: geJ;*lAYۦ! ʁIRiuw\X~<]qVVJW%mYnK?%˥Sol[I$VE_K~Ie9:_͛-[\nTx<yVZ]\d䶤Xe'ĭr t9U6ց@ L5i"zBtMҏ?J/$9XL}X{{KovV/|ty  /ó �-E|vG|\ʪ'$HYaToEKy$ծޕ<N]wVtFI~N֙㰬jذaÿ\hǒ}~G)]O2EE߳җU@�@�@�@�@�@�@�@�l P+[څ� � � � � � � � �`mje"pU͸_SgڵkGÆ [n͛G5k4-Y͜0 aq}7l%v]m|h_SOɃ;$<:K,[lѣGs7\1bğ6xqBO "p$J:n1H_-? kL8q*w^-"p;Sһua!I_}QVŋ�G}T׫/ZKEME,裏䁅)!p4hԿT~~)ŀc1c$OemiP52 ntׯ^~`giuZy[tVm+Z_y\)#ze:EJy/2=vm;NSCr3<43%9(ʲ/Zge0$x2^3kN>Yr| k  H<Y">;~Yg%o=8`+dDZw}G @! <k6"P>>}9=, ;)pp%JDŽRk%۷?j)ڱcǥN'\O<uxm ʊ-ԓ\c|g֛ܙ={vrw[\Rs!Pt'^E�@�@�@�@�@�@�@�rA@\xh# � � � � � � � �dD9+mL=W^:2j5 Q5t<F=jd)`׭[h .`mu9,Βxxip:skkWsP^Ң:3ԴiS=C @ֺukѠmFZZ.}w< =ŃR@5@%ɃBqcSVZ5kҺ{|wwP?[R^W﮻__7xcl>D0BxyB$N<00drP4dȐh Ȥ6nӧ[9ΎVъ\<M&쩼+_BQͦR1Ti|뭷p;w~: iԨQhy-w\XZ]VV{WܧUm?퟊f͚CсrYumݢIҖ+A۷o4H^O?\PIV$g˭F۶mی7⋥0v8oXU&euTҿ%]Vad�>ZjܸʚŊh}Ç[!>mіK!1CzAS@�r_{jU۸jҜ9TTH`~C*T Gr@ùSO]*o/r9} A[,}r=jw[G~I<_~SD!уǿSqŁZS p�?FA�@�@�@�@�@�@�@�mr � � � � � � � � Pj5wgQpRݺu˜p^:ʹV9lw`I`gk>uY'}1,-8%I&fmZ𩧞;o]'pB6:H7tS4o6WkD:qIt\CE˜?F=,XH%r{n֪]N>(0W^Km6!<6lhO&qG<x?T:K/I']2H*L:5Е|b@7lO}Y80*رc~K{Uwk=?رzW_]x`ԾV{[o5!.oyTG 6%yIpZn';@RŽ{vm C%CmCΝ=ODAW\qEtmˣ!??h!ᙐ\/=F+}R)w}̙3Kk[I⎍Oջ[Fn_oNd ?>uPl*/f_8;sՃ֫BC+,$_aB{X<hglƌQ]g=R{=mvQ�_IBWf[QUW){Ufԅ@ xS)H:)tKG)}vIa;$}}8rU~ն!PYp\pmOaYᲗ?\iذ8(߁-)-{ �'@QF^ó哅+&l)y yJh׮T<\s=uwFIL߆KW?DڊpږoZ\pB\sMΓwTHJv/.(jK/trE4kpS (}k߾})s � � � � � � � @,? Cv"� � � � � � � � � @V% REJρZ-ZVr!:#_C]ӡCu% A4{ƍɼvWkȐ!Qj|J4믿 vڡ8T裏B{E*QYg4w@^sL9A3Έ{ ?ppV[mD}<-48Dv�X;3@۝teE2�E~. Ԫ'?;[ CSO6: IHs[qGz_|<PaR=Yi~΍?>z0*a$z #s{RA{0 6 6%qU~/՘1c<XUvo߾Q=Ki&Imj5 #c:4!IGK R^= x㍣Ϛv 4_~Q׮]c-AqN,B*Lq oh[}?,#x]z[IRDJk4Jk}so~ⱱc[J?Wv2co}<Kyai\\Ž//OO>$ޗ.=vn!a>Mw}u9lGs].e:(,yg-á`IC9>|s2?#0p cQpY!P->U>�]0]䠬׮Zw(lM6QNUKSY)&ҿpMZYՆ\/Ukp2 [ H  @ 8LSLgW$2)Y" fIcg'yj֬Y6\5j,Wwfo飓N:I]wv}h+26k][/D[JN/^,x\;k=zPW\qEoQF<+I~2 XvE) � � � � � � � �/RlaX  � � � � � � � �#L:5Yxhpdjn/E ]xRf˹<Ƚ[^z饜k{u6xaV^DAn <x~0nV<>qDK+L%<jW_E; 'A焑 6QˉHd2A<�$]!ohݺuPÍF~;y\!G^1dM=[|sAx:u*i^xa�*/?G# J3% @WmyW-<eyŲJ?vn/*m* ^=gc쵆qW6*&VvXÃ6DSna5c#GFHrv{;򱜃ܖ^]>mŶ6{l\z~aÆѭaEvz>Vs'us[>p,X :??RmGE;>#wu'FqQ�\e]Z= Y|Qr lpnDэ.)  [Wtrϱ(䣀sB!T!1]rnE5J!@!@!DT:@z#50P\!{~,Yy!3)q+:)6XyjM?#ચ5kPu*Ypat=c+k2_o<߉K*?AY?\(1yۀvs"@ %+ߔ@�@�@�@�@�HU/#�'0nOС|K8rWˌ � � � � � � � � @ xtNDAk0~dz|.4#LrP t` (4<aZvKimXuUխ[hPr\iS77ߔ^;iȚc0- 65B(5jPN%)w*nY?=cy´l]:ۦFs=!.3*g*8М3<3': D#Uu)1cג6ڊ\,o+X-+>^=6v@n~R.%퟊[V[m?|EMJ1Y&ݒNj-;}t\{(=pTFR/XJ`.Lt`'$y$aZLfBƏ飏🐭hsNޝ0̼ԚmfalӔ9\hr?+:8}Z)W �U(s)|Ԫ3NBv!;ڔ˭h߾|}櫯R۶mSJIשʪ*#L)Z64iҤ1;yr ?I @�@�@�@�@�@�@�@  � � � � � � � � @ P+MjX!JV,X44%$Z_}xL*nРvi}@!X2DΑ{uEyI:4_7oRn1X`)@Y6?)L]tQW`@uk.y{L#F´ڴi}Gzjӣ|m{vڕzz_t[j6t2 dɒh槞z* >ց|o* ʔme*/ p0kܸqIAUX8#^ 7TJYgIcJ~q6R–N;MxcYA@ ޡJ+7ߏ()y ۤAW:im*R;"�dR[88rbΰTVb jU\SQM38Pk„ uʨ;ѣ_sݧLYiP:vXY"� � � � � � � ��Zn@�@�@�@�@�@�@�@�@0Ȧd@'+/VHw<nzkAU~RZfҥFӦ-};9-q;GB`Gtᇥk_ ceOzw|G!6KY*'hqH? pV6rNw%ofzW4j(]wun`#<Rr4iv]_a&!$^{Mn?5mڴUi!-S6:uDPr[nK7xωCkb--mot}E̙3uGV˖-3W`{|RjpWy@ZsǏbmC_+I~寀eӥpjo @ FfG+T(Rxq  j9R1Wg[+&YyKoTJVYeh" {sSOxY^aVy?=|ҭiժ& � � � � � � � �y @Vt@�@�@�@�@�@�@�@�U~(TFURU&8PSRp4rq/XKF ]yCH.m U>9&(*1Æ :l1bV#i&[D;v)4+ȣpH^8p`GBgw1 G@ 8^r 4X1H Y~'kT߇4'xB?xr갳 .@tV]uj1;W:Xi}}&<XP0!rHW_ӗ_͟w֡>d9vGmJ |3G i]rtҖ[fb qK|"b3sΉCչsfM � 8Pʐ8o<կ_?{@9gZKQWj5*W@宾}H(7n\TC`j'}Ǖm*r?/+9횂� � � � � � � � j[H@�@�@�@�@�@�@�@�@ ]ڵkG. Vr:Z}Dʷ�e\#__[ziSH!% ڪY'kA {=mf o8BfW :;Soڴ=hrC=B qԺuJ\kU ig("x G}[#Ge˖Qw Rc&=;0@YKH!. eɯ[\KFHn֓nLA�&LBwI-ܛl"ݕ^>&)pBO鮂@�* ט1cBb+о\Ya.>/d/ v5;ڔ˭p@ ӦMSƍs;jExjuرy@�@�@�@�@�@�@�@ j\i0 � � � � � � � � PII֢E v`Jx5OrR̞-}ԩS/*ҳJ'(+]wtW%u9G5ʳ @i/%M jFFA=|a`azg4p@vi!dCNy睵}}x5h[,0y^{hyD'>;Aﳥ<t=ZkeKhGu xI⠬[$}^y\|.RV nK}Z.(v/!qxպ*K*hPXS:T7CsBȫԢEju27 @Z1;ė@=VD ( LVe#Ժ뮻O5\2:rPxjݻy@�@�@�@�@�@�@�@ ʹ#� � � � � � � � @e $Z Bjq9 q#v́Ĵhu A$YgI}& $ժVue.t 'H+y`j TL`v?W=*VKW7JI͛W{S5ΫW^@c꥗^/rum6g뭷V&M_4\oOC !@ծ=+ m#Kڶ]/RұJ{uͣA7o'eyc:LkɒxI`V˖R6 '"& d^_-)9;O^85H{!ZGu+WW Y/ Px]ÏF*WbW_=lΜJ*,r ΝBBi`ᇰ-͚ISh;:1� � � � � � � � 5t@�@�@�@�@�@�@�@�HC)#jW {54ëg/ v𪨾xCjZZw(yFǡZO>)5mZ?{}VnԆ@ 1B7߼P $wh;Uމ:g_UÇAQb-[Ft]tx)V͋7zzwCH_j+8&OQƭ\S'se+p?\jH\~Gh{qfI_}8(!<|DAT,۲-%4NA�p`!<\?-5K/.Hz_Z9騣Ζ@ JF =;:Xu_!@->LӧO RjYvO?̄{ � � � � � � � @  G�@�@�@�@�@�@�@�@� #&WZI!dVWe+"Pʨ ~E.c3 _0&HO?-mYta1.]~BBI- ;ZGĤ7Jno{sY!%w&9`ߏB~m]|Ś6mZ9$lvxvN!@ ]`̙3f>#}7zQ09眣:EJM_~)}cҕWJKH![kt wZ}"d讏E |3ͨ@؄k3 3U;́7lOǶjlaQ@ {F . {!x~v8K>}]v}wi P9o KIF5*as`dzmp[JިƍI&!{\t=Џ 88:\&j[S@-_,@�@�@�@�@�@�@�@�X:G � � � � � � � � P.$PkѢE嚟O _H&P>SoU.zM_n0bt6HJ_1o?bu4,/0l0s'yS.39i I*M1;;m i ?f͚CK֭kuQڴiE ϟ/e;V<~ o}"J0ڲzV7+WÌ6(|VѣMO>)8Zݺ)7ZHÂ/TiM+^5dN倚d RN6XH:pmx<l)ժQ3dVy+o3ʩ];!W_-=T KGOS9@�X[8q9 C)@Vp\l57X4ݯ۷ojM>]k@]&OԊ-Dx_^)_aIQn@�@�@�@�@�@�@�@� Pl� � � � � � � � � $Z5d=nc:#P+5IUGF]vIuIu pp4|tmRl\i$!{o˳,d;kKW^�sϬoj4UHil}GPzH_}U8- @m۶T~#,QrQ_4"4_t믗~UIAZk%-WRB6$V![?,]võw_.vR&M:(y=TdL zMԆ0x cX7ixɡZ0ՄL7rvX!PZo? u#@xV_~O8WC:8i]s_鋰$ 9hQFUf̙S X4#o/fF.Jk}ƍ\LW's+9P( � � � � � � � �#@V@�@�@�@�@�@�@�@�RH,X^|Ճp[!P+K"Uy-C6Tzqs&OFVY2'-0fٳg33GV L.yL\ J 4* g}2|7N~itgӗ_~$\A!6p[lM녴qQȴ8q&L 9 Γ?͚7o^ԄUڅtCB2رc\u~Vh`ؽE![~0@꫒׮]s8ՁK5j/e_Zs8ؤx6, _~ lhrxVzn#@6 \t4t ԲmKW]%=tR>ҺJ#uT|?Y@4A J.͞,1jrk~L1rVO<ͽ/ hi$>veyj[  � � � � � � � @7o%A�@�@�@�@�@�@�@�@�T</& P+ߢ*o\>~2+ cev%v>H: iͥn;|=p +FP +0l09a(vn]#sz!ť{T/BVTtz'P$xyp2Ҽy(\EH rֺ!A}J+,'dM O4I}[wN/iSs.~6m]|V[M!02{q@V[78dA&&pq8Km&~M;V':L+l>ͫ>:Gsộ|GޖK y/:x?>߭J]&{ۚ|yT@.]yJԚ3'Y23z)\/ : sƌQwp:Cȝ'FiӦE:9ᛂ� � � � � � � � 7y+ � � � � � � � �*j͟??E<X>(-ZHjժb_YR_9W dh`⋥N^~YnQз&mM /0tPmքOXK.\( $TkcXyJ5CځÉ<X~'?&LnցG~>(iܹK1kuYgZkYf:}7͋Utɟ#O~͡ZIiذP6>QV˖-&M$m:V8AM#GJ| Ooc^rxg;1B!Y[:ɡgt:茂�=k6k+}VNiu@H  @v믿|33WkAV0dԛoUѷ}Kp}!s'_T @]x� � � � � � � ��Z~@�@�@�@�@�@�@�@�H[ _ҮF@qf-%_yEz@;$rԥtqڊ5tK<F�phϐ!CtgWFuQ >*M& P +gX)4o<xW\5kV/ MJhp ,j&ɡImpL[J7/8%cCٳ5sL͘1#ޟ/O?ݾΐ9`m-\| ):%T ۩[x:?->tRӦ 7ā%=zH6\l3SR9 aä>wLjcN$G@4_b7ܻ̟jזoW8lˇO  ."ɓ|΄]RglBGfK/M-ͶZC}m 'pqVdR8PRv";@�@�@�@�@�@�@�@ o,yV@�@�@�@�@�@�@�@�HUVZa@"P+U啥~frK,C49&k)=ă[2G %#/9\䓥kQ0k/{w χ#PU,{UJpȋKpЕΝ;so9\˃O:u0&5&씓s>|9{JBΕL~=_?68)M׫W/|'Υ[81_N4o޼}MsJ&G]̒p$C˅5 IOh"(>M>Uc!Ghy IO"6cG(<қo_Kq _lUl)!�88:uʷL>ժte%H&s[PxQ@�? t5zrq<ϔ)@9sʜA}.@ (_K˵kYr:P+\j,NA�@�@�@�@�@�@�@�+3 � � � � � � � � /nTa xp=WeѢEQʫ5k:3dodMhH 4lҀh_d Yx@-/cnG u݅oz@նmr-$\k̙˅>9�OMM$$q.\Xi:ת/|nǞjԨV\Ir;�+zxbd D!Z_>9HhX86m,PehT@8G!Oj@ȊӶS*"퀭wߕyGsBޜzXRRq;cs$@kZ$B/@ "=RXC0]v'?P|sv`S̝>R@ IHæ JO;]ƗSFuy-2^LVG_+t߁ZI8 /@�@�@�@�@�@�@�@ 7#� � � � � � � � @<6Zwt 4ÞW%@VoJ^"S{=@:=T+y-Ν/ 4)ki^G� <8|zE!5eGPM6<U8纞͛믚?~L䰪$ʷE\'ayJAYS`C< #J}hWr߷*nrP=Ku%wO?IiU3<χ8Q{Lxil}r8|(^7CimJ+:�U"ҙgJ]&S2gV ǓO>J:x|n!9)�dHA(ZNIK`·Z2,qس Ԫ[oX%y8\LZrȲ'� � � � � � � � jH'@�@�@�@�@�@�@�@�@ ]ҕ1@) @s{q/}>^E@KG)w o8Ȑi K/4CkL |yX3\ u#3V#j{ KO1ðnR>NM\DZ/9}C_ zH!PNjtBRY[kZ/$:q@gKm'5lX 'KDQJp'_{i{RQU_:8xo.]5%-ϙ֢,Tom?t��@�IDAT=Wz:tФI4w\ꤲ-j-~̜;w <B�@�@�@�@�@�@�@�yst�@�@�@�@�@�@�@�@�ϟ_X*V߫bMUŋG+#P+usj!u颋/6ڨyx~X:TiE@~X<�1bf͚vک"հl5 (n-g55"�y(<`=B\UFiXc骫CZ|{YZb i5`g]X{7mu/U>?i}Ӫ|}jD�D6_ QWO:`7zJ 92Q-HӦ]s �&5$;VogֿLǁZ ^(ktzRtfD}q%O}'D/~?NN @@�@�@�@�@�@�@�@�|CP@�@�@�@�@�@�@�@�@�_Ν[�9sjy|*ɠjʧnUI_*ӷN:YJ}J*x#qҦƃ=iIK<#+hS2h:uLL.t)S) �91'vܱuTCҖ[M>+g?)tqlRϞHaTcvh!v[N΍7|[X `ϖF~:$D%uV$8:XA!KF^(ޒQ ]B… qy80,p`SO`:umԢVN$P+~|-"9P˿lAA�@�@�@�@�@�@�@�f޼t@�@�@�@�@�@�@�@�X}5gΜte*@5kVd~@?ӦI;,裄{YgJ??qc%\20|cGI;^:@be]*V KWKuJGY-g @ ~K<#gwm[@ V|2uK+4o^f9~t5qHW]%k'=|f|OA�Rǥn3VPu:L^=H'8ouc Ljѣ=ɽr O&}ѿf6VVF 'cǎͻҡM㹧LIeׁZ&@�@�@�@�@�@�@�@ ʻ!� � � � � � � � @*jU}c֢E"PR\{3ץ G%p1_Kj|x`-P?3 PYU6Uͱp4hԿT~5!�9'޽㐪wώ.h!rt]K?~m b{~Ux=7 u&mtRR˾^i=ڵ+&G�p~ CҫJXeC%_5Nn*u$]}O*iyG�rUaZ3fLvZMVk>%P\TĸqJ'_t+'P+~ O<C�@�@�@�@�@�@�@�BYȝ � � � � � � � � 0P1Pkɒ%;ZZf={�k5!Pk{Lz%u뒗ni0;A8C{oo_i]%Kex I[য়33~Eft_X#תԶԮԸq.)xݣ;TYg}T6-@5,� ?lYk-_xr}s0CKuJ[n)c<93*>|7ވCnj{MҶJ5jU#�U#cwUZ w-'~<t}ҕWJ+tauz ׈#@~ tUGίNUQo|e'@-1׾\iQJs3ΐ? S3R}NUh"}g:sr4@�@�@�@�@�@�@�@|57s!� � � � � � � � �)@gW).@-i䓥矗:JVsS,:xv*FϞ[n\uH@zI;/@kN} o7xs~![\-jLj$q_5ÿOfx`kϹl)mU<mM<xC^o #_RrJ0s4*9k>}Je4ƁOǖ4ht�o#8hA=-=d:q=c2 @ qD|T[HnYzxy@r䠎9V]Y @xSe)) 2gNʋ@ I8@۷o:C/I w)S EˡZ$@�@�@�@�@�@�@�@ ʻ!� � � � � � � � @*ԚbU˼dɒȲFb+-@0Fq=RVvI۫K 1<򩧦׊ OSGK.fΌ<Hd5<?uR.M&}4iwq <kAW-[Jm&ԢqPa8 ٳ 6u %J 4^|Evi.{GKwߝ{m @j|8yrz ҲǕK&u4wn|, =NJ? xꫥ\3^ @6 \{m|:dc M΍/|-A>7}kuVK(?3fQFչ n8ע))z?;ۘ СWiSޏ3&WKZ � � � � � � � ��Z#@�@�@�@�@�@�@�@�HA@qVj?UU/^8fM)_`"=[O WTݙ?~U@+^Rvwjz=x1S KCH#GƟۛo.vbոqȖ|Sy?4o^@AL7l׻&Vr'ex~yexM z*N =S0z2"V#Fhj'[HJpۘfi@�zғOivi%O>[@80dy7Xx \%/ v/de??aJvZ'_Z=$pCrA)Ŵ(]Z.˽z*}f^Ϛy"z|}@6mǍWЁZ͚)Ɛc,@vNjQ@�@�@�@�@�@�@�@�OQ8=G � � � � � � � � �Z)`U5jHhɧ䏄%%$l'rh}W:Tz %LvIzQi}9%ZM*~tmJ9ĠNeU=GvNg/M }m<4c4qbg9!Tp=O*%Yk%N<9~dms~lY<]sҠAqyI'(ujfZy^-[TN22PiyEg*J*B� B`(ڶV]w[.i$Ƀ_yB8@>q.Β]  ~pԷt"PFI]OÇZ:!h_36^\x(:bop@-?f^9eK#}i~]ˍԮ][[رcsj|Q*ϡjեKj1ME�@�@�@�@�@�@�@�HE@T@�@�@�@�@�@�@�@�N@xKGTn4\tPjkYyȧ<Эwޑ>$oN;-X݃!R(?WCēջ8!Novyk|ԵoO-wk=UpK7(\zt채;ZO>-.0p`Ҟ{V{Sh� ӧKO=%s{ K<|.ߋO)dhF_9^ROǒõ<shQȺ eJA�Z`8ɡަSrC`$O7,R5`tI~Z.<  u;wa9 M~&P"V4nܸT:PkԜF;�>Х � � � � � � � �@| � � � � � � � �T@Æ CPϕT#dBF P?w.59JJH<&OW:`iuA3zңJ? /yg<:aZ)}D9<bAϖ?O^z:4.HrAI',u*QbU!0qİBձJp0K"BL%Q qqGiSO6 syyЙuᅬi:,73g }&Rq;wťy�dNǿcJO?-jC͙UK_Lx?Rfq=\L#HQ@NV,럄{ϓ9ѬۇcpZ@-i̙4iߠ � � � � � � � ��Z+@�@�@�@�@�@�@�@�(@F9{cJ x|3 Z9G'd/]wIlhpOҀҰa 7H£ڂi⸻~tIaS@dyGCn){[m%]rɲ.˛Ox:DߠAmi,"%pRݺґGVW X/ ]/;IB9<~WJSVeW+5>riN><P];5֯8L+ ?|ǒ\SuWⰮjgn@ޖ8ءڕ9NW:*9ϺB飏 u׍Ã}7;N@駟V+c[S%UG59[oH:h7?~K^ᨳfI.2f̘]t)T� � � � � � � �yC:� � � � � � � � �"иq3f2/U@P59JJ̑.XjB:digyU󤭷ԩ&<�~|<7;?.=6Pzk&LvтpV>}TVʯ3"AI CRrBA� MǑFIxr`Ky[zȑqhC$-5vtq袏|P޽nod;b[rͤ+>IM ?^:8pg/:[Jl ~_7 +Ԛ~X?JJk줴3W@̙qe<OV@W_}'=J3wqyj5jH͛7/T� � � � � � � �@R� � � � � � � � �q!P+?ģBV=jGUo68$$?^RzUVUp<n{`N0ݟ{Ϭ4` AJ=zHo}-^M2EÇW߾} '#Ҵi3';@@�J!Qgf9<QsɃ WKgy7DZwQǔ:v?馛sY'oD:p'}g~ jZ:ti8gά#@xw_i-N6m]7.o?顇.]N+ډ�/P>LZgWJY]>w[sM7S^h~|])2IZԊ]|JA�@�@�@�@�@�@�@�[oJy1@�@�@�@�@�@�@�@� W+6Ȕ�Zz:́ZT~CóBxչ$hQ<o+?Jeyjڵ:p@%? #uծ*^8( t N)h@֒kqHÚ>$}6ؠ<عĶJì>r*TE:{Hw)/^~Y+{U>ֈ�)kq?kM? aänEpCiͥ}NSCo-J@4Ъaƹհ<Y*$e˖լYfN'oj=zt%P+ :A�@�@�@�@�@�@�@�rF`i) E�@�@�@�@�@�@�@�@�2 RaÆ1cFjN?,Y-@7Jj&CKݻK|h~RFK/Is^+uTVjԯ/=tiKW\Q=`+SOEaZի܊-cOE  O'J7ݤI5jԷIFy#:vT#'v< o-?.Mb  {/{@>w_.\;r_ >-6m x[o^yEAin pp=.B�ܹ3ZijVM8yP+! pVX>'!@|x7 � � � � � � � P%+ � � � � � � � � @a4 i7je{]f *恞\j8نrGzڵ>@ѣJVJXN$o3+~ޛsϕBml�\Y\|w`NioQ)6(HQ+*V׵c*kAe?]b/kqQA (R5a$3I+&999y- я̚58Fj̓'+6(O` @~9`絵֒M{ٳ7L29\q.ʿ{L^,I~ 饗!"q$Nzرҧ&{Jvpŋ%R=P몫!}un_Gi'ۤ3xikH8y㍒}ͨ%yt_@�<P˃Rh W>@-i(@-W�R Ԛ2e~ѣzs!� � � � � � � �!� � � � � � � � �-@V\$̦QV=Oe%de5_mN<iR^@] ̙#=D[HK\ R]UWco.D6Ka| <d 6 K+zjAtN"�iMNgԺu2LɃ/<L˳W]5%£Jn Xg*p'ɰ;µ<娣^~v5�)Yq)/ FHh}fL[7,}]L>`2GHC� t]m`fI0X~Cs7/9^zImJ#G`!%>jy"9<P+Pbnݺۦ= � � � � � � � �)TH! � � � � � � � �@38{V(Q/?5wԿ,/EgḾ@.(qB~\}uQΝs&Q,J}eY_.~jԨQ.2@ફN#u:V�\iu;OkvV\1,z&H++Ȝ = z|vp_>L:,iܸd�x+HRs_ 7Ʋy9K^W̜)sԴ4hP2s][o~U]yFc*!�~=M-'|GxΜ,fbҼ GVM=Pkv=YMSz_bgڀJ~QJC�@�@�@�@�@�@�@�(Zvײa � � � � � � � � @V4cƌL'g<x ,7jeW=P|hPK'(yGrY vsys夣>T:?^Qa qtK[PK^}U 5TZA|t'K~AC� I%nP>JT੧&V i[ꢯ.P)/F=vd9ZX{ֱ&4eJ3ohim֒M寇J`@i4ƵʻӸt'C39Fz <o]z %??^v1?v& G=ܔ@.]L&L~"E ɞd3@�@�@�@�@�@�@�@� K#� � � � � � � � �"@V_o `9s<t]-Hmx,,<8/{ÃvzKziUXZ}< cug\<&Mh]w-{aCOz� ̟/w^2rV_%[--{H[n|$~׳ӕ_:Ig% a_ݻKzI]&Y>( PAw-uX&չ}ՁJ> xW;.?z&p^9(-6(.R nW@-z|0ߴiSo^3gi�F=jG�@�@�@�@�@�@�@��;TwC�@�@�@�@�@�@�@�@�@Zmys/9YTlZYh xZ. 8@}춁/xb/o~Vo mh"<~GK,~UtD<PvVa?_%^1^}u+Cڞ[}}ǂ{i14h`0 n+5jTv GKO>[z]Y{nN>bv^]'sԸq!"@) <t)?$C]Hm6M:TKmsN;^Mb颋$f /8Cn;d7d%JME~;95lZŷwEsJ~1fj68QpgON'}0SӍ+Xc4:=ˏ+ߕ+xcbz;GS1Gcˏ-iZ]*Zy{5הI#G&k?]5\<gs]7څ# @�@�@�@�@�@�@�@*!� � � � � � � � @&QVT|0yn<P˲jEZEQu1V4Z_/}teu&]`)~*zѴs.uO矗EEnPm& zY/$>*Li¶m/+Gxǭz/ ¼nml1~kj4i͟[*rܯZm̓h+{_zYZW_`U3f./9T`il餓t ԩ҉'J<#z4|ԺuU3yH^+odw+R] }77{dɑG&9>iͫC�| ~II .ʚ͛'%w\6} EkSy(<2i>-V4cSBԱE_Աty}cg�0e >&跊}1h1W1F7!裏�ZY`dR@ϏI kXs-YrBY|ڣGB2D�@�@�@�@�@�@�@�@)q5{l � � � � � � � � @ZlBG{5k,=a,e/lV3ꢋAvڕ]9sfͲow}̽=<ˋΟ?b勲zV?w!CE\=0**GaR^6֠APж•Ic׏aWzq a*GyQ`/\h77y䥊 ~+߼nT}yKݷJh^,z!iMO2.o^lMݭ5H+aumh1̌�Ԫ]KI:uFJJ t!C?de!ZҩSޙfH쓼ynw6馛ΝZ֦MNW@|L/'~fxYR? Z4ƲsxГ-V4EZ>S囏aآ?ŶqE'Vt+b yЖ+/FѸb}EOT`ˬ)xꫯxb)F7ۥj `? Zlмa´@-ne?Ma9N@싩VUȟ5B/Hj?}L7n\V]h � � � � � � � �-@Vq_@�@�@�@�@�@�@�@�2@o3f2IX`nԺ^vu^{B ;P˒}8\lQ,<|髯ҷ~ϳ~"^5yQ%pjj@SUVY%]O%ܼh;, Y˾ZgϢѽ6/B~Y`Z}!\Ep3UOnڊ'@. 7H"M yc: B4sgHq[L @ ^|Q:5ty)$*bеuG$Ygɾ?Hgb(@]',ng-t1kSNC�x s4ztfC.4Dd~|SZgӟTh\Ǜ|25$(p)cdɣ-zX1آ81N*c-Z(lyV4X6a„0}}k8bb|ud-<o޽{Ȗl5{oFl]W_M~*MM42 j5׬uyܛ_ZV=@�@�@�@�@�@�@�@�Ze@�@�@�@�@�@�@�@�@ S@-/Dg唫Nf#٨W^s1 xan[J [Ւi~z矗i飛hyR<ɋFLѽ)y[ZˋCYu|޼yX)Ͳ^ُS_=+j^֏vڅp-o߾ZkP,[tn=`'#>(yqQF!zF++6ڨ K'@,6gޒk٥ߖ Ix`*y8?fy/\&zd5[s#@n{L>< ۻwnH'>>jJ$8Bo˿X<{-f{M皫KԩSkٳ,8)W{/jذa.| ׯlQ{V4zcEرc.\XxCSnc~F/n?~<ZYZI^"P:#w~(@-~'`a3..b<F�@�@�@�@�@�@�@�J@@�@�@�@�@�@�@�@�QYfг|(+m:VPm!e/9d X*A{O?4<(!Z x1dk޼y(PE6d^e!Gmj'mڴi49 4nXkv=_뫯*yqjtya\/۱cen묳N�K}E7`7(;~mYF {FFM,ңF) PWg-zJ}شo_Hg!!m[*ˮ /.Ae7ΞM O+,DκĊ@?;L:h#*ȁb꘢?^e!ĽgXbtqmW֭KɶܕW~b4c?|B3gNb4ib$k-3ةS0/|hu"Zjen)FKo ڴi &h]w-砷Q&Y9XX,¯%?# 8@zL7@�@�@�@�@�@�@�@�j"@VM@�@�@�@�@�@�@�@�BUA@1jy{,.oZsJ^+ "Ym͂l^l> &[zVQo|I)6e˖eG_xܡCB5&ZXik-ZH^ wi䷉'Z8{* ZonvY=eip騣$+pB܊\x衇tey`jܳH7B�x]>7i0.h<?r/XVL[zaiM_-Y$J.õiyH7&Cd8կ_i P},sgkvݬ<="S7,Tl.!Eآi-4jY ޽{5q矇E_Go]?ccEE^[njeɺj?d9U<,,0])ȕ9دIJ5n,Oל~-ڣGRl3 � � � � � � � Prj.g@�@�@�@�@�@�@�@�@"vڅ0^ XMYPK,r-3Pl餓  ~`6~04i$-<L0*�;B^ Ë{%6 P~}u1*… C!\۔)Sȑ#_{:´<TK.BZ*B?<0SO^|"k#FcUj|t-7XXVO_df@ZsH#]Ҹqj-gzqS3f~=ԠA!/|"^]7w<E:Dij fF�,<n iتϑY,I\}?ò> X>c[n?0!Tȉؼ"Xy[B<P+Oߵ{ǂE W/'[lժU(g3<( t* +Ηh6_2�D{o] }-J+Pk w � � � � � � � @ U-D�@�@�@�@�@�@�@�@� ڶm*)$+\׻0v>WuzQ#'+*k\N/h*dIwɒ%!,k̘1Vy{PvŰni4x`ᶪWW!P #:oy4yP ڋDO0A<.";VZ)ٳH{q6lX~QyOi^*a&p-h}8<nɒa cKWON~VɃ3i Ltzy.Dڊ6ߡhu#zK/}Io,my2Xk$!@\},DzY}YK-|~)'FcV$@A>!A (c,@ vm{ouv}V~me˖a,W^ec묳 LyV'UO}fIVu~ՙ()@?\~4@�@�@�@�@�@�@�@� P1[� � � � � � � � �xS >R"hb5|j= 'T9>ӛono؂ ԤIzh֭6mõ(Gq!$˃RG}_{GkV![}fmn^X:!n++]pAPzny-RhXH:U5>i @N?^(>\Z}<u&ƫ;W:<k-2_}50QhH:mԨd "{4pmX.[2n}kپL<T|lxu6m,ԣ?s c埝4��@�IDATXV]mmYN~aK/-p B!\E_mYs1jgǪcx '=TT(s\(~m׮]t;g,@-ѣGX � � � � � � � @?@�@�@�@�@�@�@�@�H ,=u6V@UL (c|j]Rǎ.o+XWmƌjdȽoA"묳իWb@Æ crHٶ~;vyX*h-[omV}~eՃNLt@˓7lb/0b4{ԯ_Px5 Pt=K]첂VN2>tС@})7ah ^?ϜVpC2ҳH:H:dXZzǚ(o?9uűMlE͛7x#-@ϟ?_[&l=@ZlY0,%ЬY0.:6䁮&LИ1cs=.,e>Av4s'AVP1l~fٖ,=?bVҬYYu'V}@�@�@�@�@�@�@�@�LT@�@�@�@�@�@�@�@�@ڶmZs7^#Pˋ|u՟|^x⋶ޗC`Ϛk{ 7`-43m 놏?XF;Cgu<kҎ;n=zr-WuWYH馛k}u/JV.y],"4j{e97#�5㎓Mwi)[%', DJjVX@tNvsRV5t;ˮrJ@Ixfi5i"y')=oVآhMx@0b-Ծ}x�-࡮>ۀ,XcdžqE[j鱳,%lo ;>;h5֨r>acEL@̜6wȿ5nw<UV!pvwgkw-ZH'‚cH|ӳg.!� � � � � � � �Ԇ�Z2@�@�@�@�@�@�@�@�@Y_/49sPt6;]T4J}_ՙ{wۭ:sW=ϢEOO>z)}g!_~ꫵvQjF@<0svGϞ=[Fȑ#umOW˖-@cyQǦMJ_=cC{%PV3X#/F`&ɣM5nt-v38a PB? vZ28h]dYpS#5gyK<̕LZ>De%裥}V}a]J'ih & |SZya~:|y^z1aÆ&FC�X x`4`mҤIzRu|lq%XlsOGՋvfgtrjsŴlԚ34qc{[z%ǻ]c$8ȷ4@�@�@�@�@�@�@�@� P43[� � � � � � � � �Um6LW_UU>^�%oT@>=0fɒYy,E/կ_esV(Y=!HWK fmt)X]떟@�7o}7ܼ_ux?3:#5|vN_*ӭk/颋!A)mF ¾o,i𰎾}6k6:@ xX逸J&QU !c'(tUqɂr-{I]M׋~)W<L+N:I:i`iduC@?[,=-w^1k=Cal_kκøjm / xw[KԬY3>alO(p-z <P~jO?IMV8 OT_?;cڹw[n;vl{Y;!,W$￯6mڨe˖%l$ � � � � � � � D � � � � � � � � �HڵrVwpP 1Z(Ae/k^jtOGBuGa"ywj١(A 5KA k |0ϟ~iuAC Ů=|˟P\7K/bi,#/o[%~b/0y&Cm}`]lΜ93} P~*t!ĉܚ_&}Sb <?>waZKbJ쮽ݑ%ot뭲:whK5ה 8!KG ;e_[o}K[mx }ev[!L5[ oH{YgW_}5Yxq!vq4?�uUm~+-fy7&}Ϥi q譟'<Xq� +8^@=zư � � � � � � � � !� � � � � � � � @ 4lP[BUcV"(}N[,<Ԩ_O?kF;w;젹sq]wiuJh P뮻B�s='/r}A}:s5cƌxVfIoY0s5ˋw۷s3K] \uԩ-<P˛7i @.<%|]GVY%k)ew+t>Hz{ec5߶W\ѾSoBI-U+颋?]/K/u( &L() 6Jl)6 tb^,8O>D'tR 3P/cƌ !3ۅƦnw n0d%c=Vl@{).6C@̜8鯴4rd{>uMs i{עErg~q[qԳgϸu � � � � � � � �Ԣ�Zˢ@�@�@�@�@�@�@�@�@Zk- tcS/',Fl՞m,w/6*~!7z?I^ȝ�)oַ~kAgU4`�M:0o,~ggjq?j,u-wwHK~*ڶmAV] և@q FKÆIcJo^\G:,i2,:Kl9]Igh4y|e7J]Zz㍂:@ Y,]zxSW$;1DOuw/e]F@ E .M4ѡ>N;Ny饗_~KWk?y8qbS*3U{ j+饗 w]UO(͓pBM4|X/ � � � � � � � 'j@�@�@�@�@�@�@�@�@ ~kM#5hDXx0^V-嗗ߪ5{3f6o<+?L~^=zPO֪QE P -0~ojԨQ~X13gf: y2 idPGW6kLja#O?II[l!l :VY#yhFk{�O=xɒ%Z˩c/4K>*ypm4rdw!åJiiNэ L<Y`ZeW=B_k@vCӧOE][oU;vu]_xWbPNuv\ӏ?Vgnɷ@~/*KKb(Pk֬>(ٳ7C�@�@�@�@�@�@�@�XJ5 � � � � � � � � @) Z>Y)v۽Xb Yn啄VϽ0mi|'յkW=Vn3')=א!C:X(e~gu]:j9*z_ $_믟&^իW(Ν?_;ve]|Z1h} 珷zK~:w<'ҌY̔2i\'xB~85/L &MĩkeuRKOkgiSBʾH++d/a^]:W_-]y+랥<ZJ7ި=C]vYmuZˍR6&|HŲfRZe3OR0K/% /Tz"ۤEeذaѣ6mO>D떘D6׿+_8R1|tǙ>h}]DX{PV?M6Dn֑uE&MǪ n *]:gV WgwR -_>4O^oA썸&mh� � � � � � � �L@� � � � � � � � �_ٚ1P+0\J ԲY *<xr);C1Aous}vAK<~ eEVg/UnTs@\`M'N(/O?dEYgwY~ĥ2s9kʎ͟_Քͱj4K8>}Za(~:c+N`ĈdѓNZvjY֒g(E/z?'~VV]V̾%*ydߛ/:Ȋ>C=pr ,,Zt/駟<ߘ^+vɮ7ސV_]}wwoe[GtzϸUkiORYN<[j}iiIγ'fb!0sL=:\xv1H=G}5h,=E]i|zمV[m*ٔ-y7N1Y;*G^i(�*6Xu[n!L0VXJf?h � � � � � � � �#)}͖"� � � � � � � � @!^/b Ԋpa.,I J[Wn`_O>}]+b|_~g:qQGij߬eE90KLA6m*_|Ó=h5W"[kL /0ٳg믿c=&U5jT(~gK5c W^֠Ar ˂˨?2=3Zx'B:csԚ/knN:|a,B~)m<P뫯ZJS /!PB"u"# Kj޼�2^wH*=,($Ùs8 rɒ%/1\? zTm&=,Zvm̷>Yxn]$J=f'\w-=ij%[oWzx%RN=Щl}+êhl1k+z.^ME:=7nZYdF/[Ad^O<9׋-UVfYfnCz^ZOsWQ7ٳgQo#� � � � � � � � �Z˚  � � � � � � � �k|ڴi%*.@[.1>-Բ=U9M:Uh-Փ߲m^t|L uYz嗕H$!A_ *TDps/.7ZX^axK҃ڴiݢEׅU$eY>Xh^`XjٵHݨdC޳c� Z)TW/+~gyTS)R~GYاGN;B;wtI7&L fI:r-s}\|vr-Lu|0h#ɾw֪ux&ʤI#HW9̙o6O�lCW*A4W<ղϦ*|+znٞL@y2y<||+3<zW,.wyyKuVs}ybLup*@ P f̙*+ex֬Y:#� � � � � � � �E#_4Ɔ � � � � � � � � � xW/X駟j#KxQ!/]((.^j֬{SOiرjݺuGVQTǎEzwyg͵O<Dx+E5_x6l6pò^{`أ>~[M4q=3>f=v-M<YGq/Y{L~1czO?]JUaz E7"n̙ .@Z>|x؎#-U[Xvm'Ƿ믿E]/ֲd#F3Kyc=tgJA _|MyQX'tRwڏ?xC|ɰ]tQ? ?Y62[l%Fgu-誫ҵ^kA}&ԏԶ%_vxpU\[FG:Tf)4/Z>kM6٤lhޫ^; e~,y>}}oiE;y!ʋz[iuI1sZ="> x̲J~մiS 8,@l5xp嗇;P0k] ǜ]WZjS^Y CG=Wv$yPmY3vM" ϲ3~ י۷ p@x-ݵRx_5*Z)uvP]zյ_|p:te]V }T<=EW:5l%wieayX V '~~l%z585>cu_ xL[Ed~JkM7 cd>FTt٬|ja ?G~JwQآMo Iu>|ٹCtl]w5'觝vv}wm5e}lkۀJ[CWCT@Jybv,͑qlvjy?~ڶmͬ?-shel � � � � � � � @i ?!� � � � � � � � @5,p"ѢEjlq• cJO &wY< $shD/,f;Db*žVMٳg'lbOXxV%mbNx}7n:uj^KԫW/q'.\8B" +P|<ĕ޽{ 'V]u0oJsIl6 _M7ݔΝ;'~嗬eA> IX�T }`Gۗ:cEYNXKX!-d,jö/ۄQ?)Nӭj +؟cKl~%>oaa?fxV8 &,+aWo d?}[,4 bc9&<gZ9 Q tas-5hSN9%Q~Urkq`kĈfdbڴӊ=[UDzOS{^JX(EG~5-,a!TC=}Wz#-[L̛7/aAZa[X8˦/ Jp +~aUj>%j.R`ҤDbKV Lj:'I+{%$a K$/.-w}I$fάrjcގ;p x뭷@ V\~M:]tI{5oVY+V:7J[ousȨ}'N~=pA }Hw_"qa}v+׏ϫc&?8#>}'2e}OY.1r/Lۂ3y뮻nbѢEa|oW\7* t]ܐh>ea`' K|5tcX3ƨhl7oHV91+MI_7ǫ2YFhL._}v>vU|Z F+\O ^W[jUg}5:7#}'!@|@�@�@�@�@tɥl9 PH& UWֳIC�@�@�@�@�@�@�@�@�] :O># H ưc+jl+4X-,6L+_<~bRbc�,۞�#y߽]}lc ѽޫQF›d4|.ɂ뮻_;C]ꮻ Y|bL_|qXޖ[n)+v/ xw2]pI'$+zw]+N;4YLQihĈȲ"~0>}BdŒe> 70nf[V6<<vXYP}/kq裏tmQGqD8f:,^a3<SV.lW^I]\}RXpXS%YZx\&Xd}<x,&y|c{" njk/ӰaC*ݧ~-UW}onlE}mlzW 'jVXG},O:Qv>^oLYȅ,-[|+w5n~c߂k,PW]%u$guk.תΉ; *G>[dg{4t ź߮7ސ]ɮdK-ZTyB>O?SOu:пX|p\uz굒k-a{~t_յRe׹(JӧO[�-$\E}'N;ˮ ^}sKG)aOj>NjWA,]xax,^?qn{M&Wϗ<ɂz뭧7Z.Ǜ t]1cȂ.ꪫuGnŊtrZgur6jll3t'DZE -nء37Zvʲ1c кŵg0XkL=x7گD4@�@�@�@�@�@�@�@�WZ"� � � � � � � � � UO>_@-7!_-<L;̚mzY'xBt '6n8<N 3gP7óz nzxo_|E*o۷W̙3kǃ<6xpB,eΜ9a ove< pvѣG*wEGx=C`Wj^W6mBqh[ou؟6/BQ}I k!p5 /sP)+ЄG}4}c ˙W} aE~`;6mZYۂO.KMݎ9昲.5r-o[Gt.8p`8x@ErO?=llРAx32a^,cQw!| m۶ /g[DOzS^AX<V>`kjd_z`QܚL}z .<HT\u?fsT:7WJZ⁽]㎓/IjZ)$Y_"+Ykl[6|#*:fy]0esY~vH۷&+Km|]w|)Wj)L[⢶馛αt5#ZvE}(\&&Z^M3k:iӍMe:E 0 pV4V]M4) -ҥU;veȒǦe.Rf>GqLټw߯u;.@�@�@�@�@�@�@�@�e*_Ag@�@�@�@�@�@�@�@�@�b P+{؃j!%L b򜩟Nկ_?zOW8�~ԿyWڳ:?cηo&曵뮻V:|5;O<9n'NԔ)Sti]guM0!L۱cǥ².5A-ya٨C>ڦhߤV^\ߋG�r} ~ܗ_f<6q]w^C=h?ՠu2oV[m5 H1ujD9o޼i&^dr&:x馛õ?n^߃ *ko:lذs{%|դy{lMüu$ִi;ٜyTʋ}j`o_id`Z)ͪgLX>,B<#Z+BW/KXDt-o+O]KDWuONyp}[պukx1/m_m]+<#{%ϑ{ʮI#lUuq8fOuǽK/B-[4-AW<3-{.jٲ.R+$:cA*w%Sx0ejέ}k8\PsDg9Ts8:<tԩSCg/<tg v-Fqg9ߴԪ(S'*f{y e`zVi֌@f � � � � � � � �^@�@�@�@�@�@�@�@�@ ^\x֬Y3gNW}j@Z 2P CC m&߈k[dI#Զm[=\iwyћyQGp2)z[ ҼبQ#͝;ӦMK3ײO/Z(<9ze_3 ܦ{>ѱת@_~ӧ/?fjj ?6. y1g:?Ӵ)S!n^,8}ɱW{!U ~%qD[-8w)?KИ1c2g_ s1*c'm+]lwɃ2jڵ:'J(L`7Z:UEcanhzٍ7VZ)L87B^{ڷ6l37N_;¢F6-?o5ogVǬk>>{9}O_:^~J^)4N::{oV+LC9GׯljV _q48f-\}+:W\E}H7^:0CX齖y=O?GSO_'VΝC*X}u+W-бԡC<~,׭[/s7s7�6*濉o\z*mc@�@�@�@�@�@�@�@� Pj#@�@�@�@�@�@�@�@�@�Xoz;Z6WM~2Pk>|;0{졽K~mN8!|={jԨQVT1}Uŗ_~9vwo}͛Do޼p경gj6p0 /<^�؃ټ[z_ͤH?iix5/bٿ+K-wߵp^_ARC,#G*p ޮe[_RNqlXED/>ݲeK 6,m='j֬]t lԕFKMޫAZ_tgM6s=BvmUV8 97iD>{イy:C矗=;Cg֩L˒%tRf+@-<q?}d X]'H; ;H&>;ۧ}Lw!i`ӤW_,$ͯC [lw*k%$�h~p[n%|zl?uk�Wd.E`'?Ǹ}}{;[!*:0ut" E+Bj;óS⴩ޛ-_=#!Lkwbkc{r5OOJ ߬q+[,\td|S.1xA`nAs~xek! 1d~i eū* c "}饊^tm&)7OneO]{6EwEl � � � � � � � @jUË � � � � � � � � Pj:tЊ'ڦ~{4nľt,'ŋkek-+* ֨|]wu:vDZPS׿6‹G^XnUҞxE*<\TsC=o~[?xYXj8ü cQӦMCN;n!+2LU#8"~L;So</ Oʰ}aYfQs_|Ex=?j8y`/h뭷ZHÄP't�+"9r~y/y\6_kCȑ/I4tPy@ˢbow/ }u<SaGdťS[?ӓh~,lv!D{($dx{-noVA-}Y54B2Pˏi(V؋Wz,g^M{*"<d˛/^\k-5 +̓#6s 﫭Zk}OKF]r%!m۶XԵN-N./z&D?u7Y/A:ݻK>*wdjݺ[kV xMyy5Hal4jBv&5jnը:[E(R\+eQX[nKƵo{14d Zv8/Wdeq} VcR+$Μ LRb%Kq9ic}N[ljW3};:,;V-G}^U4ޗxS&mE>6TG/bxҍaEG'ѵEt.ϥ[,?zl$3>1dq&cmqE?vl- /o߾a 뭷^<yrA.;&͙Ske]Oz-wyV6mJ.PY>繂9<P˯[jU0} � � � � � � � �9KC�@�@�@�@�@�@�@�@�j X8IE՜*`2aÆŵ{%ۯJ$ *Q}DdqDFU7ubs,\ЎA &,)dɒg),*ak{wb]w51z貵[au3Ub 7Ll IXL MO&`YŠ'vqĘ1ckVbVJ 2$a4a8-&<g9 *[VU^ z,l'a_l~i7n\龌_>;{$hmb=,MX2YV⨣JwsV5aR 9 SO=5o%qw5LX;n߾}V$6ѬYOUN`EõMϞ=rJbuIXQ 'E><sg=oV lٳgg.(aa lKqx7[RVH:su]7 q[bhV9>_E7ĭ=a??T={'zUӊLޫ~헰NZC.]^Imo~>ouw~Z^ꢳzlſMK/%?qD׮]rx'0!y3'as$f OLZ|p"v,5aõ_ow;,q&,x8aeTZɂ5_4n8׳s\sM?ݵ_[-[jr+~N.k|VJw.I$O$51cF6Һ>9DbSw̱o>SRTwLƯ}|©W_3<3M>} 3]@0a݉:(ѴiGxW҃RVE7tR]cT4Xs월aeSٌfڙ}7TE%u1rg)[@_ǟ4h~{j‚k~VcB><g }K>v]$J&e緧ٯ`x O}B@�@�@�@�@�JO7+Job@&LUW>/k� � � � � � � � �k:d�՘Y*Cŵ%ٯw^[c9T?ҋ/Jo_d:g 'Hg<%+V. olZj/Y@7oc=odA3ܴ4ŋkVX6m藙O?q"|l!:Ὰba3 VwQ9BdEXf5}tYXxBdAe8pdWhڸ#CH��@�IDAT"ǚ8q~'YQ`W뉖ciV --zd- KVVcǎ_, T]sM'Y,@NU^F+}WΝ+?s?OSU7֔)SԩS'Yty cke4=W>\&y?iΜ9a&?{dx9裥 믗lHF㏥NnA:4i ҰN},l\+k%_ggW_}%^Aʷ\^+_v1mXp.Av}Y[Ii\(Ѯq#`aG]z饲`jYXP|OoXke߽1� .[p^WD]}bXMhl4&-.}ms*e1_{:tZh}-o ~qUI66,N?_kW7/$}KO>dY~ta|}E>ik}uu 6{tŬ ;UI � � � � �Ժ7N @� L8K]jimjRZ l+ � � � � � � � � @nf2)ԡ̟_+dU<ЬiM7^|U{ !϶ǻ(*,;iy[c5}1/E5I YaLYAUCL^ãrR; ʶ?G2* r |^l8?6>4_/X~ս{J%/cU:QR2=*Zxhqx =^xzguaY24Iso,P+T>ثʤǵG~dr~kҤ<ٻ0) /99)Ȋ"QA.f1,bVDE0⪘V &TT$A%)HUmNd:TU?鮮]3]hAg#Gx}̑ƌ|3o;UlRwO'oGHSw~@D=%gaK/|KJ? w^5gN 5 _Y@ek][R3v{9H?OjoGr߅ Y'|>o\n0ecOv޶^zjԨ;n*ssm5~f}nߟcevqWjc/-UT\:0Nw2;2;61coj9}*mv31?ͮz>Z}7zjr-3%Fj~7n6�JVݯ�-ݻKLJI.߾zgdY f߽ Tv0`@Eg@�@�@�@�@�@�@�@�r/ r=D�@�@�@�@�@�@�@�@�B/мys͛7ϛ\9cpL;cT'+P&vPu&W I < ^7ye޽U|m(Ik,kK,upO^K+Wn_־}׉ A'>e<.=>fvS;c]ЂKZȦsݤj&|WPqgk֬Y{&l~رcǺ-ETB,@";T=ԦMܾR(CR˹SY#TZ<6VO:p')TTiԯ4|r JDmgÆ gk׬GuT6kS%KJ7k w+/{% KD2e~Dl:Rی˥SO<RH":&Mmw?i$oYf:]ߥ M Ji*^um'r9cS "ݱcGfx3U^a6l"c2WT/\%K Z=-{U  U~= @nO2S[jmܸQիbw+$jƌgm&ao@�@�@�@�@�@�@�@ jP � � � � � � � �TlsE)O^lBYnso2[cq1WK~+zhYre 4Hr{9=n\իlTt)a}ɓ]p^y睗bbŊNŚY%h>޹_<,O>ߥTReϪAA$[Rݻ_l /Л0jժ7ސN8A*Vgve-0g5n82<3f\SOexAȑ#ރ&[j^`Vx 9տ\tNB]-]*NC l`nvO?=֭[kԩA-/uUְ=!C,;ͮ,{%Ѳ s?L"kE+DZt=xCuYT f*^*h>AyjOk;^skGǏ/ 5<x79O_r߼RJei^BR2Қ5iukWK~*tR亗ٿ?UVJGY-L� � � � � � � � jq � � � � � � � � @&MT66sLqJSeK*Pm[rkT[Wzj*,f/`[&LkYk,\$77$lz[b-^x.)fJ|{Ooz-XBw7_&MS0? O;U*׋С,< .<B!>Ѹ %饗(BQvʊ1B2Tev픕_:f x߆yZK]H=z"Kn1.#kF|MJ67ˍH_}%p@B Xc=Ҵ|P 6t!'{cU@0~T<c'Ьj*G}e-ZM?XO?T o:a׾p qlN7@I;/֩SG3\B}.bhjYw0O@�@�@�@�@�@�@�@�}## � � � � � � � � PX1կ_ B#8yspꡒ X֭ɫ^:wg}Ve;{*U$ yGdB&YHSƅ@dg; aZ{~͛NΏ=X-X@wwmbiYGl݃>p)"~npv ͪ.H*U*:Ow@ Sn__f&U&L+S>h^^(\ \h´;!mc0ZCܥ\?xlMH\g#=Z4HzIܼuQ$իƏŋ \j衇5kۅ$'Erl{lR~{uᇫJ*ڦU{O6KenݭΝ;7/i.Z9ݺɽG?艝d*0PArjSL!<1RG � � � � � � � �y P+f@�@�@�@�@�@�@�@�@ 'Z a%P+G(j)͞-Ci蒺^~e\Ro6l|P7VݺuէO=ZhQv̖@ +Vd]~j޼7M7ݤҥK{azo"rŭw*R"q$wܡС&!p9g~BP,%"@ܻj^:T6Lz]z6;S'?L7…C G %#ٹ穧ߖΗ l_9 B.\Hk(9s޽K.;/%RT�5܅_|Kz;֭\ʕ+{װ7p,$zÆ %!@fOtO?]UVQnw7CuG`*hѢ&?Sft<A@ !۽4k~;[tFW͑i(9uT"sD � � � � � � � /Mƫ@�@�@�@�@�@�@�@�@ Zҿ2\ݳ�͛U3&NXOF9D__.Jj./ݺ6G->lBȱcz˕W^5k֨N:ܹ;07}'yPBk!@BlRsꫯҗ_~-sLgwGzjӦIӧKO<=v{=M8Q~m"CM:-f)*s2u~ցuۘ{9]wH}'5h.!&`/yZg!u݉_n^z}hO d~8ݡ)�.͖۷o?c qI6~ѦMo\16XvUn@ &%n~ ˗RtxolFmƍش@Bғ QKgSXjw;P|jZV=λ?۶m8o!� � � � � � � �I@0-jE�@�@�@�@�@�@�@�@� s6mڤ%K&m(kRGLz X֭yI?.wn'K5j$[.2ڵK\Z-wy-[杛ڹtC\WtaÆ*h3w@ ! .&4i4yd/\r^yDѥKoMrfLR{y^=4ٍM8~-Gy6MnIJSJ>nP<S͹sCOjh_.7tmu]X@g0]C 6>N ӟ�G:vܿB.B= ͙2e{v$}%?LxSpzM%(RmAwtэ7z!=_|73hͪVw*U$4@Z X̙3]xw-N> w9 (ZҲ(_^Z$ux6vMa#fZX8o<5i$/ z+F+P~ZjB � � � � � � � � P+~@�@�@�@�@�@�@�@�"*жm[/&븿3F&Uݲ ܟ4< rs%w%7qt۵d9ɖ+'z_'|қtjݺl\[&kѢʔ)g͚3fplUVpߕ}>ٳ9Yf*P@JzsKEՐ"S *>bĈ1j2D.N.d2j=? [ Ի*AI>gIO=%$@zuip_??CΒj- ǮoF=y�GRZ)B"&PT)uQb]PiӦy|^xz뭲P5jxc6ئM\c56BC� \R-ؒ-m۶lٲn`o򗿨jժxiW^y%rkC{wQkkU;KV Қ5r=wZ$A@�@�@�@�@�@�@�@ u ٳg@�@�@�@�@�@�@�@�@� P+MQ U^D iQtqrU ʬxl9^;v;}/֮]ԭ[כ�y沉6m-˗l<@ltIs~fϞ3gz,Λ7O;]RMgtPwi頃B[_@H˖I"RƮ]IO?tG[Ɯ9Ҙ1қoFtXz] ܢEX=\[ A�D |}y&wVct>=\tIڵk_ˊs{n݂SD_H"^\~^ׯ_'~m 4 *>TXbl\Bm9, ٘-fҏ?-.]cR7ݥw'}ذ7fnXB֭(,@ x~x4z^: \Һjr)QlZ+-~-P˾!� � � � � � � ��Z}= � � � � � � � �d!P@o; %-[$oQUN Z[c&l"젴… UVһw=e-X@ӦM>#<kժUSƍebQڭM4WRhD@`K_O?ɂ Zhv-L~-p.Ժukﱂy9Ke(/kKh=ztʦ)CȽmK#+&}:TY]Ӽ!@\=V.�>\8PK.`#wr+GӧOw\yH.X+.w)gW T!j2eʸ.e۶m^H-y֯wPBn,qŌuԑW5kS/ڸ&-[Wc9~V@fh KX_侳ƍ#P+ǰE^Vnzemժj]uU~/ � � � � � � � @ q@�@�@�@�@�@�@�@�IM6"P+'=ٴIn=Sw!#m%Vn]r|t…f͚X-~=}fկW71b۲ qm)a@�lŋk…9-?{mY*UYG&My^pj\)Sa<n߾]v9w$R ȑҠA@: XFX YgIO<!+NyT8st%};/Pt~݀ecye`CmСjٲ 6,w/b v5bDˡ�(NTdKƶyfoLq̙ޘ+~z%~[[´j׮glF^ WrT כֿ+bqqEE ԲV`Aw۷o={iӦb͚5SU~%7|9_l⩰uZ]S[]'n i2jP˗{뵵/i � � � � � � � �i-@VZ~:� � � � � � � � � X?/ (P@v\Jwq#ZI.,`~RѮΟ&LEۧM٠Ao9F:o<oP,4|wބ[,͂,`&ǵ CmU֞61n2ebs~ $dɒ в.]W,~-�²{p 6TȂl"~?\Bq([J˒PR> G�� L.7h gvԫGr;PB ܥ쳌]yԱV[ uSN_ )Soʖ DI@J(! 8,`ٲe^MlLn̙_vYkec6q<1jժ17AC WkL16h㊱AtҲ&Kҥ gl+VXlUnS$`N¾Ǡe-`;vH}Oz<nݤ w ;UjJ/rnݚZ2~Œk}֌> � � � � � � � @8 qJ@�@�@�@�@�@�@�@�HMҳaoRFvQmpZjժqtu=RmٷYY-\M>:i$^Qlb\{}IWzu[J*Z2قw),_ܻo.[8M]n \vN&_ mɘ-4.]saZtw"i.]~SN"wŶ$mEI- p ~Rΐdϟ/Ye|tɮ!@NnR}&{u[dNsgy3fD.D8'=oȏ>*%hlϖN:i۷ Gwl_6hG[Sf6htQ.m~Obo[E R"Excඣ:Oآт/РA//f Z; sRnmGqk-[Ν;5{LZ+B+3 Բ@ � � � � � � � @z ǟ#� � � � � � � � @6(cM<Yje\.\ )#__ttUm͚#{0ؤrH߱cdɒ=H[&Ng-[쵍n+TT�7cerɂ A%U,6eK[f[bwﱷd;V~}va{Mltl{BN~AzaD)˛lfKNBiF\D�|z>!3ciR 9q&%NnIB+`!.7X/v҃Juw-\:W\>y&./H^'q!n6S^=oɪ6m+o{3Ou!dcM.]zϸblL- )xb쾍5آ=iұm\qK8m+n̎}llZj:蠃qE a-6hDaÆ3gN6,vHt);a7~<Zehܸ}t@f#>߽{ }@ OC�@�@�@�@�@�@�@�H{fH_�@�@�@�@�@�@�@�@�@ +bŊUV4i:묬V$ y-aCvn-2vmJ<|{GM]A۳[ժU[rm{µ/_Qmԙ3gz&U7).q/pcK_T)-%J/-v?a]zeflݺջݼyl ]6 $k} n׺?ح{!skW6!qlb]vޤƱ +W'D&2]$7w?< ؤ< M}|- !˅2A�x X9M,Y@ޤBgK/zF  \]믗;N:x顇\]=풷w+z=-P6uK4A P6^רQ#oɮ0`%_lY>=aMԴcǎ?m`òn96hccvآ%fc)ml1N۷ok\WsƱČcvcv8B7o׸/֎-4h{/:Ɔ-P v]쫮F niӦai[fdN<49jt@�@�@�@�@�@�@�@ ;9@�@�@�@�@�@�@�@�H{{Zi��pTMʉ�m"nA.@*@8!)&&mVcZ6 nIX3=&ls,XW@T,D* tq kYP-Eӭ=VP!oIbc6qMk.Jb۲sNo_-V-6mtkU}{lu&�w`zjܸ^ &[ ЊMtk/^zIbZu]y*` /M*Y` )>y2f2b4lgh5r#e!<:8`trC�[W%ӯԢԿtrp{WpKӧ.b:x,l ˢ>< xaS<g-٘aNc6[\d^0[,h>:l<µ2Ox?cc68h7lXg\1ŭ[fn-,bʕqŌeY- 6l(1p Y@?Dkˇ3eGe˖ir(Ce9sm۶9`@�@�@�@�@�@�@�@��>"� � � � � � � � @~:t+^BLlBZJ}\lYj+W4ȟ~Ĉ֒.{1-ɖ6066n޼ٛ&k2 u>[q Weln-*ϱIl3*h&ŵD7wz˖ml[ -{.ѣPAqСz'IUh E:D#@*:,kǥK.IEۧˉƍ8{ _-DG#N<q|A}Ǻ\KB1c`jQE eʔԩoCjl¨q}om\q߱Č?gq1E{<e+Wӧ>'Q{cqL1v8cv(РA/@S^w-ξW]*ݠ},PˮmCy$`Z6.͂VwoO}ڦMpw@�@�@�@�@�@�@�@�"@V\ � � � � � � � �DU6nܨYf&]N&̗ RW{)9IfT|jr3ϔB:^O&-WdwȅiIoM.0G n|!ժr"Qĵ^Miph^0o\D�< d+K|#n K)F .SY\/t![kg}VG}F+܀-cJ"5\)-#@bA*T9u V<}e!`ZϟOV6Qɦ{iT&R͚~P+Z9 jJ .ԺuTlٜ_5r<mʔ)*U60GjG�@�@�@�@�@�@�@�%P0^b; � � � � � � � � @Zh%JhҤIQ^T~}ʦXoSO'IiXğQ#´'z=>V-U=ȡ[t,?Oq~zH?>d}u 5y2aZ=^S&;wʭ!.y17GnR~uQKukҥ\ĪusgO3 u @nUziڴOdU(wU}.Э4n\{-Pڌ3% !zSV֭&ſK@�@�@�@�@�@�@��oPu � � � � � � � � @  4mcZ6H@P xYVJIy>֮$;ϸ\, r$JԡCvfRGq=zP7 +#+\3%S$B_ΝC#s7O:-| ~ԤR:x @oϛ͚Iq|袋B0utRjO'Ԏ�Q@6mRK ԫWOKv?WBN:f+u.}eKu|?[n]-[VӧOߏW%Q2eos§O � � � � � � � �M*D�@�@�@�@�@�@�@�@�H tQ'NTz_wŊRѢoyݢ;E3jmI'IM:GC OA.5 u-sΕ#`a;ŋK}f*E�|Sn\Bɓs~}X8}`r@  IIgK]㎓ &¢nq3G=Z"2LjHW7ސfLW 矣ҝBiժlP,´i9 hт@ݻ5m4?i � � � � � � � �85@�@�@�@�@�@�@�@�@�rԩ7yƍsX-P~} PT`A08PZH2$PEl[;?LNܿ5H~p2`|-[kԨQl$\B\" HҵJ'~Դiv]؛oχL#GJEDct,P 'KHnx}?UW]+܀-iÇK<#=uFvˎ@�\ ͥꬄ@`ׯ_~%VB%OZϘsVV ᵐm6$S& � � � � � � � @J0G�@�@�@�@�@�@�@�@� XΝ;MK@ٲҺu)-HnjY-&~4{v(%G_FZquV@ egsOJ܎-H|[#׷(wh(i _(!KH]JCA0O=%/}o/ozx@1¿6y=_ΩS+sʖ}s!遅u_~tR!)2@  l<WsӪt6b#P+cZjU+t(wݡ@3fn启e!z7J6f6e,XPvh � � � � � � � ��Z � � � � � � � � �9ԬYSuW_}Ú<h-)P䮿^jRGڵ+\ZM2>ldO?I/yTZP W]Ǐ/GyD%K Wi^!K#: B,`?k'\)}$ c}rK\HY-kѢz¥*`*u,}wBw@�| 5uF \6˗`:W:ʏ}eAkg+Z gZ>/TYΎNuЍ j@�@�@�@�@�@�@�@ j%Bm"� � � � � � � � @:uDV�*Z8*!hZ I='}L,K޽3]JMJPm6]veѣN8P%݊w9hrjӭ-utRnҤI%'!u*M&}t䑉#G� ԩ#eoЭNO�i={"M5E�89 ~9d@/q* e4OX#ϝ~N$t Բ6}$1u=ka қ2eڴiw"� � � � � � � � g � � � � � � � � �@'jMK�Z)-PkBײt-OJ3G:Tν'&0b'OKG˿wܡ%KGBR t>8eg '㤻~X5J*]:NO̟/ ]+-k o;.Yr $+#PJ˻@vO.YK*}ۼH�}%{Ԯ][ / Fp+c׏I@ŊR۶W"zS%լYd򈷰jMum� � � � � � � � W@�@�@�@�@�@�@�@�ȅjvϚ5+kJJl8۠yoMΓvVmT#w.?^jD>\*P�+ttWH:0UwiРAUN0Z15פ=�R-n^?Pv#eEtaRҗ_J맬v�!(U~K73),?lٻ{"-붽m +`7,)-\: ,LBJHr9B^jѢ'Э4n\jJӧOOĦ0jٿY>i&P� � � � � � � � Z={G�@�@�@�@�@�@�@�@�!`*UJ&LG@jY?߿ <zBljZp,ɯzK*^<8Q  \zd sOfX^mۦ޽{sκpix!-�x%C&;,cp՟j?XUnRaO*UR]G� l)7)=3RAr'+~0!HƤ9G:Cm@�F yA:ȋ@z,:t+нҥ$.Ze.*tm}Z;t� � � � � � � �$T@q@�@�@�@�@�@�@�@�@aөS'}gQR(Qvm(KT.,)͛s6)aZ>7&p_K#UͲ!"oK>4]wM;|p(P z\))]yT "JLW/% " *ov-q~ޔ.׳6 } srcS~��@�IDATwM~(edf͒ZN>Y__z 9�IH%KT9" x.W8Pbժ,VP ~dCݍ}x>ﰁ5k)SRJYfb@�@�@�@�@�@�@�@� & #� � � � � � � � @vJVj_/ڕB} l ~ D9*gO?ߟO+@R,G b۶MyIa_L 8Pի<dCť>}\%!@Feˤn`W^ \N5-O=%yt%ҋ/e嬊�d+Pd!~(լپL;ÿaԣdV^g@�` uҠAN,X*i_:"y Q7.][,Pk۶m3gNܶ }N6m@�@�@�@�@�@�@�@�R$P0Ee � � � � � � � � @,Pk5v޼y=*/On]TzD?+и4wn~[p@˖)H7&n?l9{I/nA:Y з?~A`KR<H]veq"HT?.]tTT2̾@`K.MBuiqÒ @�D}4}tWH.͜o9|>j!cc0vҚ5;=C�h -*/=d4$Pn]-\NűrB�8nMH{wrs86m"EhڴiY=5Pˎ@�@�@�@�@�@�@�@�(@VF #� � � � � � � � �tA%Kԧ~Z<H Բ$4 M&-_.%ZZي~DԽF+J4nRQYb!Z6lЈ#\ $;Q$;U \^tCe-Xeiy௹FV'rZD�W;&Onڵn]`ӌ֙1?O}ug}&w;O;o+i#MyJ3xpF'`Z[lGA-\g=q'b`XSԥG6q_(C]gonΝ5!� � � � � � � � A@ E�@�@�@�@�@�@�@�@�(q:u>,x.j%7@y$7V`[ZқoJ~(LZ,gO/&q < ̚%]ѱc_ 2xK/yaZUVd  !K5kRC J#Ů[&7þ}{.4eM@ 6ĉ~HmJ&[9SHtz}ϟ2lA[Id| @ǣMs{ 5,`ZX-S U2}# `!*%$ [&P+szj C�@�@�@�@�@�@�@�+@Vt-=C�@�@�@�@�@�@�@�@�է~-&d_&7kN:4m*m*K{{a+H< ]q4vϥ_lHAضM:l&0 ȕٳg tWS8?^:U=q(zyVzI?j Lzs%ty#�(TҁJ]H\U(«W[v?s%f!2֫tY @\_d4"PV-toje}& -*uLVnjM>=7zr夵kՅ … Yf*j@�@�@�@�@�@�@�@�.@V‰ � � � � � � � �DIk׮Zxϟn/jP%P Բ6k XӰaA4+}RM7II/dV_6lؠO>Y-Z DpI-;C�<XJ0_+yx9:M㏗>XC? @ uJcAv2mc}&G2=c-hvmɂ`}V]f\ @,Lk,0@,f͚jes'"OuWZh"79Y&k >cZMŊ byԄ� � � � � � � � BRϮ@�@�@�@�@�@�@�@�@ |;vTRDnkZlbǰMt4a23g^(qte9U.]*%qta5g<R׊+khѢ [M9~x5$t7l!{ҡJիK'~?Z}'}t^�$NCۥ&ߵK.Tow[PAZqľk3 >`z(|Sq u) ,H_zNV@x/O@g؅6mx[(r夵ki.h � � � � � � � �+@־"� � � � � � � � �d#P&صkW;6x* Z= 4k&%PloU?WæzmBϖʖ ~TeyI={J眃G< B GUwUV<66R `x[ǧ`rpZptҸqR*9XZ:Hi\Ϥg~D�R,`!Z{KvU+P߈j+YoAZ6ea/(Y#�(SF*G^u*ϯ�Z OmVlc3jԨ+›e!g(� � � � � � � � wn+@�@�@�@�@�@�@�@�@ :(?^;wLstR佶l)c+sm=&<ܟ<X0A.HGI`iY&ҥ'r>Pu}#OTʕȑҕW9`.mԷt~RѢI/#;\\}Jwϥ-B%:�/vȺsvMyt≒GD[' 7pa=]jv[�W\!ٹGA jeN5{(<ka6@VGB,)-lZVҒ%KԺu(� � � � � � � � j'/C�@�@�@�@�@�@�@�@�@իWk鋐žW(hg͒vP( "|H`[ |t-wK-0pgҨQRٲ[?c qի zqI/ */..P8XBrz5뮋d7ީK] /5J. gŋ|-5 ܚ>Cn=[ 3N3|BE�r'`ACƍ{ k!J:uh,!&P+Ї'nuugxCUi}{8T,̎ @�@�@�@�@�@�@�@�} �?#� � � � � � � � �d/мysլYScǎUǎ_g.oq' ['Apu箻ҥ~ Jo!\͛ϖ:w6HQ  |tҠARã?tqǩm۶6lX_ȚضMzq颋RW!?({W}]ߤn|G tC 4@ ժI�'MvGΝy,cv\mgvKoY|VZ7hnw3p%ϻ\zaWhl)RȞX%XLi)Sfm~Yt\reUp/fٸ훷6 V+ |ݰtvZvyi{ wW?EOf}ƧG[vmO뙝. -g+i͝U?@-^zˤ6@�@�@�@�@�@�@�@� "xv� � � � � � � � �8#@#!&[ SrZ O_X\qcIngZqRsT`_$Y`J3?꫓nӦM:ܹFEFӥQ+5=E ~(~vYn]oP[X:@� XpVǎҿ5ee0 tyW.JrUb}];j25kh…{npo,[, n7[Z>ȷ!X?֮ A[ ۊnn!cPo+P \ |B_H}WEQN=KMh!�QXQR?TRKڢEԬYu/T->7onqcV->w2S^X6me͝;7狰jM6͍7G � � � � � � � �/3A!@�@�@�@�@�@�@�@�@ ':J}qm&si}M[ Qկ/9tMLj>%͞-TR8ǍȞޟ405Or+{t~ȑ}e%}vz꩚?&L63-C=.�xI?gOgB PTKps{aZF`\WNP2@B5ZlnZ|/kYIݺYg /Ls?³,*ʗ/RYUwBlҷ*ƌ}/S,Y2҄ZV,`˂, ۏTƷ،34f-Y b 95jnݺj 6m-M4qcU Jc k[}Vd} ,E52TZE/v.V0 }oϚ7o}>e ʯW2^?]Tv9b � � � � � � � �! P+@�@�@�@�@�@�@�@�@ es).=zH}AiTMf(Ъd9٩䫯)R;H/Z6a7'dٯͳ^c?8 .w/\8x٤p XԩMMC� %Y`#HwɄ9յdy0vs14@ []jMB?}p;wV"E\:,-ZBS5[6UN/Dn-(+Hp�omiu؝=;w Y,8lΜ9^ҥKu) zamڴQ۶mծ];Y @jR߾ҠAEɝ^1*UJ/NWl1P} EX.@ڼY*Q"G׊+}`1gqF>ܗb]ne]Z)@�@�@�@�@�@�@�@ 5jƝ"� � � � � � � � @To:#P+DzbEzSvx֭Q_fZַJ*u$E4^_?i6i4F%4e+Ry>/0dԥt =@ 7Jg@$aMjki] 7aZ=W`0a&NI&yaZ۷owP˖-eaQ'k mڴU`Aw~]BTV-od7uyZgϖ->O{[j5Rs!xcǎ.tѥ.@� / &(~2"I c֟H X }WGGkq]XVT[r~֮ ~͛6}9NC�@�@�@�@�@�@�@�@ 2A!@�@�@�@�@�@�@�@�@ 7{L&HK@J֛hѤX6m84;V SK.+]*oOeҙgqJW_JQ 7ܠ'x…)ґG2[9s1c$;@ u&wx4~t衩%{6î]% 2K>R?#0}0O>2w1S µk΅wrWm-@JlٲϾWw}ɓ'{dv=3%..\Xt{n. sýy@� ԩ#s4pty!Hڵkő)_^*P@Z*x825kʅje}X[n{,B'Cӽ-Z\@�@�@�@�@�@�@�@�%9 @�@�@�@�@�@�@�@�@`,PnӔ)SԶm$+VH5jxI$,Pk.ͽ"E'w.HS&Ճ?.X}vعS:,"7ިx@?N=|{CRGt L&\.-M(կ\^,L~Ǎ#L+@ lrc]￯>@ ,pua骫ڷoŋ8 l_~,쭷ҠA?\s <#d "7#JQl,Pk]$`Ax'>`)-k7vXr*V!~* Z@dÆ UDkS: � � � � � � � @" &rl@�@�@�@�@�@�@�@�Ajժދr7׷ʕ,P@L&/SF..H4n-'Ƃ ܩF\{w4^\xTG LctpM7in2:쳣4뙛ԛ5 C}? L50%K# Əbװ&E�-n:/GO:$}:s_h^vvoi۫[z쩧zJs&bTYf^;>4@ v}pҽ2.l{{ZjiѢEAYZr-P>2,ڴi=3%j_(gj_၀ޝ>}Zj( @�@�@�@�@�@�@�@ A8 Ԁ� � � � � � � � �(Pk̘1?E9~FVX`bv9Т8 RIw)|?9c9sIbAj4,ҠAKmvu9A1bz0C3{%�}\qe=*HFGHJ((Ѣ4͌R2 ePNGuuǹ>ǽ7y=q;.5i"x\xt9<ʪ/^=)sf´g#G4qD/<ڹcǎiСڴi~G ʘ1cX):YpaN}m޼Yg_?X+WvwZn] @ lsd(矯 6bBOyHfO|u}c93ǚ,XP p'/Nn!}nC,]T*T~A@�@�@�@�@�@�@�@� P+i@�@�@�@�@�@�@�@�"@qDdDsmi'\,&R?cɽ&AŞ|R:x0\?tj\Ԅ@j^-n-=F Qǽ w}W-[G(εo/e%f@Ϟrﱾ1c|AP!Խo} eP@�M"Eyڷo^{5mٲŅUm&@ TV-=ZvϟnA#\^O>ѣGC"N\9_n߾74!w ٣{FȈ;ܹ hf_v4}z1zV}dɒPJ!gNT:`߿߻)_|"@�@�@�@�@�@�@�@�pEA�@�@�@�@�@�@�@�@�H@ )S&o~Immے[Gj-]*ܕ-*M, (\-+}u8 %rcgO[BJn.H6,V9Җnv/Hk„ a5�:{F?uxM�(pԪ򭷤޽XyV2i\dU@"0d9oVM6u$飏>RNK:u m\r\PUTѠAa}ʑ#n6+V'=,@?.E,�Tx,&ONiM@ .UiӦW5#ajeZ/>fa]&=PBhw!� � � � � � � ��ZiO � � � � � � � � 6qnfqƅPªI[Ul,llV BciD RʕRRFRr&aYgQA I6"dɒJ|ݻwaÆ.8k}WjҤIDnE*R$2ǨET!'N ;{>}g r^VBwz�)0sLժU{9Ӯ]VO<;+ܟ P#w ׯW˖-sK.%J\Bdi}lT`A^VuuZC^ׇ.6;Q@�x>Egg#j%oZ۷' k#GO7FΘ= Zb:C9{C+vŮ]( � � � � � � � �'1,G�@�@�@�@�@�@�@�@�HM7ݤ|PS[H@iU(VLҢER8XC*\Xc_VRM-kqjǤ=*U"`@ !ܜ.J*Z4jfIⷻ^̙ *Z[Tv3fHKHov}eM-L-!LIr!۾`YL%"@�lR~XSNh͛jժfU H߿6h K:zڴiMz!v{\fmu'~ҤI\&;vb^wCV|yUZ{ӧU�AS.wQv) `ǯ̙3{Ǵ3lsڕW^) v8,PΙgUT)-{jgh]˔)t҅vG � � � � � � � @ 4� � � � � � � � � `o^_~nHRȏ!~i˖& MW܄ҝw4laCIߤQ޽ޒutfMÎǥ֭%' `T@*|#3H\ DA ,&?s .QGlʕs` X!ٹcl?ȽΝRҮ]iw^d @߿]+?.ٷF9tg�4W^ڵ,Xɓ5rHwwif_jV\a. /ˮ֭$u]ŋ'P@ ,Ng)S"y-,`j#mJGgKW\!M.[}ؘ}x ʑCڻ7e˖݇@�@�@�@�@�@�@�@�H:V!� � � � � � � � �$B EpؚM!Pys jHTIZ0Fud(fҀrigdВј1RLكmHM-&<m;,V5w\´ Mn~H+=p &`5kJ/ivnk[oMY}�$Whwc4g\eX{֝;w] TX1w\vĈ${ݽ^XѣGգG(QBUTݽYngr"YgOiTH%c G… kƍTsҎ @@RHu%}޹jEbəSڳ'G|rB)w � � � � � � � @HO@�@�@�@�@�@�@�@�@�p馛_$89i1?eK(jtD(ȖMզԷor Ynfwo Ik$Eays)W._[tIٛm?'xBzڶmW2LJ tG!#0qԠT4mdiS/` JiaZdKA�B`K0ڪU_~wܑݠP?Xƍ,dmIi&h^re>3m۶~.Ls!ns܍8 D]WT5fa!PHw.( #9"y*Djm UJ<^z"5P+G} �`  � � � � � � � � @�@�@�@�@�@�@�@�@�D 4kLה)SD@RRFWw"uW|Rr%K=$/X˾_:156GJ[M,=hh^ @ǎYhIΜmvܩƍ^ȑ#5tPeȐ!MY!۷KGK;KyVF U|t'Hg= ~~5j$4c/0<zN/@ ,]vѣY} K$-1@Y[P@,Y\�N5-\0UgΜiԨQ^`}]ru;Xn]fG/Kë6,L@ciݏDە*MM(+V%Kĉ=ϧ .._\rB @�@�@�@�@�@�@�@ $Ӑx � � � � � � � �MVzu?>܇ϟ7ԡCa]:DK/2f 8pS+ zi_OɒR&rrŅp]~BNh?W;7TZ-U*56~нJ*IgϞm&K#|>ݧ@>ҽJO>)*v)}G.�R7_WS@�` ؄ZBkw}텙@"E4k,լYSS<Y�駟\Dz|^[+y~կ_wF�Z?y6,NzV/2:Gk׮Mh\gajHǎf-[B*T(4;H@�@�@�@�@�@�@�@�BF@y* � � � � � � � �M7ݤI&ѣ>.wwYଳe p7=Եf4nda�^+.-uk `b_VaУ^Az YݙM^xqPժU;NlKWRla?@H ?.=ԻdvO= N<(pϾ <�@5~xYVzҢ iKO$GgIpV.ZHvDQNߦ,O@,Y4vX5sk3ҥK玏7hҥSW=C^a;weΝ+5wܓY(w߭v/e˖OW=17{Vgڵ5m4oU:KwΝ\gchԨ -[ĬLF;8$8vci.~ճi:'`ZI {W_}k̘1'%M~N4v\ܺuu޽z뭷t:?}xc@ܹ}5n蚩/\fΔt *(C ^@k{IΜ,˗/WrBot @�@�@�@�@�@�@�@  � � � � � � � � @ D;vpS QG 3xqz*UԊ ̘!7ٱTR"rUK}& [~DRRNkH7ZuݻwEz)S(uCi6cǨ:F (_o&ޠ4э:$x$r.rFpB<=z⊐}b -v) صk]hxvIZH5НJWR`TDwy;6s.ȳ>s/±l<܉w}&qi?$xO=z9RM6Uƌ;ꫯVŮ.`%̻{݄ \Pv 2Du!;( ,v }ML :R曥/ K^6 rtIei&/Ʊy ~aYp~ȑo5kjÆ jMǣf͚yǞG}Tr>DsΑ  ;>6,P˞sA9] k֬K"2P˽=yed@- : � � � � � � � � p&$z@�@�@�@�@�@�@�@�@ %JХ^M], JIj%0w\YZHnh gs=7gX:|kWi6ݟ}Vn"J魷|)]H5 , :wy&&S%:ե$ ,7I/1%aƍ=ܔ ͓ *VLa�$S{CzԺuk/6դnjR6mg.{�l+WNv}]өݳ:K|3_ofkԨ&N= wY# N- Jh[_=}ͫQFhѢ'I,l;ҥ[pz웄oN&ބgi)`r\FwO̽mSHs x}ؼy5{UY<Ubz?�+ٽ{w+V IJ@Q JJի>}RJc><yTumsϕo?lA?,\vedrp*GZ} � � � � � � � :qR+ � � � � � � � �D@ͽ C?vRjG;ZREڳG{Z8kVeKi i}{i$Z5!~ ^Ϭ~瞓.0xI~_O?rJѷcԻwoթSG]ߒ%KT^胈۱=n(`mrҥ̙RݺHUytپ2 �i%;B/3fLvWXBgϞaG ;dL(%Ko߾J{Ox ;wtA]x'fߧs1/^On7Yͫ?d[1KBuƷL2^0} &:zڏew²>TzD?Y`1coFYkv Q\-юmڵ;YOΜ90޻yrE1߂ *:7m۶#>S%P+`aQ}",P`~�W@ He6lpQٲeR � � � � � � � �D@C�@�@�@�@�@�@�@�@�+ТE _5kVp<s: ΐ(p饒͟M H&-\(49"U[VnҷMk�xtR͚RjHaäޒ}W*U**׭[ڵk{ϔ/_%IrPh psѪV-BNrSR(`.DӦI_~)]~y +dw@ ռys/ "U%ܹsuKH4n8o[ aX�E>}KQ<y6l!Cx6m?vԩP[j1rHUVՃ>}҅yoW5t=W_ƱR(]ٱc^y/`?t>np{z!Wk\I&߿N8qJ'Nt2VFԳgO޽[k.nIV/kYk-[d 2's3g׏@cɂL~m/;D,YdAi\pe^s{4hB-]%6 ;Lŷ}B~?$,1%~&fA -,?G7ߔ{K˞6R޼y!C/͔)w@,;>[_G̯_š+˗d0̧~-v;.v]oK>X+W.w ZŶo߾wfI,@$E.L>{.`Z;i#Jlĺ, !^? N � � � � � � � �!/ A@�@�@�@�@�@�@�@�@ JT+>Άy '0oaZ*H b#QPh  Դξ֭&)7��@�IDAT:pn~j7otW/5!H3.]&T>5Gf]oY/uI6M ߱c(:UP>l�I- #-L뢋3)r9Ԫ|ܐ @9е^-^qR H˗/ڳ we+WԌ3^z7['XD+V̫,x&ڲ^x/i^/߹W^oQ_}~W[oU s^{ Ҳ� jٲ;6J{q/_O>^zIڵ,`rx/0a/Hk֬Yڿd[ɞ=7NAS<5_NVVfwsYf^ s9 JbK.QjNn3i$/,d'U4k P]bs}|,?ssQ٬W2b֛fB d\r\~:4`*;skTZ[>Q (dawuJ(#Fxv^`QvNҽ{w/5zK?9”)Sb /tKJɓ@xEʶe5)# 8,PO?؊Ӹ6w@~~!YVA!sܹU% � � � � � � � �D�Z24@�@�@�@�@�@�@�@�H;Å̌MvKI=R6jvsHIh(7'xZnF[7iZ[$&l;]Hz97IA $~]jBn2vgϐbtj˖-ޤ6QޫQʕ ё ]x!AtH'1…&bCOYX~P:#�sCs)w2RLSZI+VxrYz4f={&E_n|n),jaA^{ Pڲ .؂2e$wɒ%]`Ϲ 'N7:Y8뮻NPQT)}޲.r<x>oټy4w\/lk/V`.ݲm۶2U.:,|˂Xi1ܮX�GKwB֭-?zzFSfk"O<iԲힺts7,g 1k 1%v1Ƿ|@ ]boW h¥o_c}]=zxc{;~F ><+cbX pR д187vNfl{(yΑ,sذa;v?|o[z_ŨdVƍաCw =묳du۱jɒ%1w;j("7pXS7"A{^"A2bݥB5PlٲP@�@�@�@�@�@�@�@�RS }jVN � � � � � � � � @4 vmڹsX c&P+ۆjth!T{C֣JsH7KnOJHna/СU+ &|L(ZRzV[`~iSHzx7ޥXxMj?,ؾ].@Ynߨe`T`,骫.M )}4qT~ +dw@  [+LawH!זPXPŻ+ >|~7'aǎӚ5keիWر69r䐅q{p$ - XBXV~Y�=lTPKY-$-f>DRYlonQbAh{,,_|qnbSFԼys=qnԅ2tP/QPH.]aÆq6?+/]_{mZ۠AS"f< >*f'`!Y{lwwߞ29o?{/Y,DъKX^wd˖}u%x\ry[bS&MNnָqc<KB!P+ X;eEذ6܍+.UV~#P+Ԟ� � � � � � 2go@�'&Ή@�@�@�@�@�@�@�@�@�D D5k|}06/݆ Iߏ=CZ5ioZ2o^eK|Z?(ul^n2mdIL_qOi:7}ƽKH;#Ղ5r]_Be mlBnAK.U:uB-H#FȅHis� 1>Rn vO>^A�R*?~/ SR3d#|k׮nUVY.\Yb5 $o l![UV)gΜZ`ɇտzj/<#f]1,a1JzJ(*%u۾k׮£⪧`)j{޼yzu饗W^k7Tq-̙35pdQfɓտ=zT={TѢE](}.]$nvB [\z=P#};¨,^;eͽ{g  il׮XT뱰0OX{s*9[XRm 0#@- +j|_~@3R � � � � � �R֬` � jE@�@�@�@�@�@�@�@�@ M4I%SREzmJ4JHY'Jpl.Uf̐\NnYZUtR۶Ҙ1ŋ=BRwo_`l)q|*WO]믿9rı%Maipɂ g񦆀6k;C)sh%|!i(飏&MoB[ SL^= n;[nE_1C[vS܁ӾzȽwMmڴIqg(# ֊]YjxKb<Xmo.|jժ.<n.v7| +_?n%n!$+VB-[̚NKӾkԷo_55{S7HOSFw.3gڻ;e*e˖Mdml@xw950̄ v\j>ݱcn&\>xrB#c7z?|o`czo)q%KƮB;nz?8qbw}ڲNdWOr͚5+ǙUT;/ijFPC-P?pn{3|0  � � � � � �A  @=C�@�@�@�@�@�@�@�@�B&ƍMAZTS]pʕ J˧쳥^ڵK2EV_}*%JB97߂rikFt;?4tT}M o6nXu?}.? Ԏ[w <W^iu")7waSyD6Lz}_X٩k  -[z7oޜʘ1F̠Gzˎ?[ׄ?~ՠAΝt{m߾]mwiJLpƙ`aNVzyJsc=K?XUpx[ԥEVK/紀3*}q}k̈́<ʕ+ Ц^7%ksκ K90aפ+?_|QBA 哻?$w# 矲ЖǴo~Ǯ9Xg2|^�c[xyk ҍ7ި%KȂeҥޱ>cbVƌIz?fd'xcZepY%^JӧG׸;a+-J.a](j/] � � � � � �MBst @�� s@�@�@�@�@�@�@�@�@ @73u]Mrs9NlʿV@&islZ>+͞훼&YR/jU}E6XۆH ŋ֭&?/-zmN6͛>&tv]l"E4 "QK>;80C.BzE4 #� XVս{ 5j(G7|SUkںuڵkOkrʖ-[N[wZ+1덯9sz~\'Mܛ߂,hٲezĥ&Z8VXPرcW_y![ )beP/ew-j߾4Υ0_s51bxq^hmɈYY/+ ~Z t*3ԂҧB:lw穧-P+q,=b}x{QvY+,y"bA,6 Ow ('n41X8qb)nP].zdpu뭷jԨQX@̔)Sl!+vPnݺÂA/Hy嗟ܮM6ޱilIZNۿ[Zؑ('P+Ԯ||…m-P˝vT矽@A>C � � � � � �KŊ�: � P+Hl� � � � � � � � �$GKo\O;> H2u&h^PEB}jAtoڶ| &]r7RѢmIn>ItP莋E޴d|CDθ1�&I9˗릛n Da3fȅH]DAQyBx7׫ddo%~{!@DdΜYFB栲fͪ.qpr/Ph!C eVf͚ [ ز>Z؃ m~8?:avmacǎzev7nkۂ,lx~ZUzuYHrwE]¾g~]wi6qW{֬YkŊj֬;1ɓ'{[ذeX([baAƖ[@ѫq0,TL2P7ͽ,oTww d36^ hذWv=iϷ{=z4MdhrfUg*ҥ3mǏ{~!wsgS@'2{4`4US|' kUVyg:>~Ҙ-<bŊjҤ:tqo߾ԩrsZG,ӊkz;TeY]vwm?Y@ԩSv~zA^ӧOWܹ:jY7Fiv2n~-ZQc|P|ܮʖ-Q @�@�@�@�@�@�pQŋeh@�H6[;i@�@�@�@�@�@�@�@ B٬{&r b ğ]#<ݻZˏ(VLrIiQ[p#SiLNo/WHnc͝+7Ad#7/D˂oy$rc5jB⮅$]U߾`'MzaǷ~MBsN s x6;ܼڻׂۂ MBo;o }7#]XH>}^].%; E +:^w"g{5ۇXnXxKv͒%w uV/‚pW s- v*Q5uZ]xѓ!IL[xu7b,VN>�kh2ƥwUw>m.UBb>o7m{i?ۤ6+W. uѶm[/BR*p V .J}$|`,X @*;'&t*` x:ߒRX6mo}d㱾(P mZp5ڒu(`Jޝ(kap\vr0:>̭Z:' lS@�@�@�@�@�߻*$M"5h*@ Voe~LūIΘ@�@�@�@�@�@�@�@�@ 6)mMJVݒyI6$e&0B g%KEӲ|W_{Gz[6˶t{k زp-SJI{ wlr&mHСCz'4x`5jHFrM@<6_J&ij@ A;iZ77mӦ n$/Lk´Ʀ "=6nܨ jĉ.%Rɑ#ɚ3fLޟnٲŻ~8YQ<<#W_utaLJ:ٺM$P,H뢋.JQMQxՑv=ga3fԩS0_~EїGڵk5p@YٙJbSbE}Zt*Tp]o!%ŋ-L 3 >Z.D}Eߟ@h} -,J pvQ}c}0-^…KyAg( ܾ=XٳK_.MNV\Orʕ3xArk[fϹl b w!i:� � � � � � @ ˺UCt @�� $8 � � � � � � � � �.ЪU+2sU(@? hTakg @ _|RK*S&9q]}lYѠARnRn<լ غJt2G khhiҤF#QlKkٲ ii&ɘ, tbC \n7_HG4"}QA�(`Mcƌѽj :TY"p{g]Kp9xWc{7z!RdiW\0ɐؚ7ouiZ~zwynI,f;vX 2D . 7஡'w9r.Ƣ[n]/LVZV> 6g?ւ d` |+_|0-RMG}ٯ;VZ3Ti0F X|7v+Ziq-ȒEʖMڶ-,.#(qX։'d\uUql~}MҥKN  � � � � � �a,`Ks Au@�!@V"@�@�@�@�@�@�@�@�HMfV\9j%1lS؀UQ/`ZÆE=C�ԮdYU gKkز? ;Wnhi`qM,7}9פZFks@q(x1O}qt5e'v3TؾLgKG`n6 ]Ԩ^ u^~Y(`  ֨Q5n)uQ|^}UΝ;Ɩť7h"Mh׮]^g̘ݏ(VZ0A.T2e„ @ ;¦nݪ 2x#7={$JÚ5k>c7N{Uf4bfo\ -2m4#%eGK@DVi/*UVߟ@2޸~>=zfϞh5-yHvώ3}~VDt7… {ˑbCX Z!@�@�@�@�@�@�0sQ0G�@ j%M@�@�@�@�@�@�@�@�@�S^/FD)J~}Rbh@-76nXG\͛'7u&G˖6vl͙#c!X1n]ߣ^=SO?,~ԺԵk7{zj;R/րC&D 7:Kl6 p:iiLKkR X}QiC @htu.W\qN)SƅIBBwi ݻ8xhٴit_]xᅲ WZGzO'[pv$r-] #NLf̘}bŊ^[ug'n DKuɺv Aȗ/uĉ. .Tzu)kVit\ wR@- Ο?3 @�@�@�@�@�@�N@ v}e@�%>X  � � � � � � � � wu n9cF+Av쐛5՚0Z&~!ݷPnݤ*U rS/}da| NZN^ %Əm^ZZ l&]/Ă$vbHD2|?Rra:[S.0@>ea.Z:fB�^FZlժU+ժU&Hg, 4WϞ=UxqM0cX~?~2L+Ν;]M2OquKϑ#T}*C ^~ɅT>´b }k˅>Jv?@0ͫvM9Mh J2gVjEɐ4H : _$=)l� � � � � � �q |;387`! �$@V= @�@�@�@�@�@�@�@�BS&okڴx`ya))=T4o^YD ʟ_z 6OSnmխ̙iӤͥ -$\&tFk"ĉx*cq XM7c S%p)/½.e&/SLr0d |d!u;&vC ,x&߻W3G(DH!ôCR#T�@6b:ؽ-^Xg-dz?qh>XեG}~ȑ#?zhݰW^yE]tZ/<~F)BIƻ܍ @?BZe|@j ˗ݗr7( gМU Z1ϻz-P΃[5khjXBK;G:� � � � � � @ 7tRL;� @ )5"� � � � � � � � � ӷ~UVJV aBaa;Ə?>L5Jnrlկ//7dK_,7K'}dLpQnykͷSŊ]�<Ms s pbQ.BknE*R$uQ v/3C_Vb0EBf.]& �i)P\9M2M?CvB4I&ɂ('ѥr>ʝ;vAo' ~1ubk۷oז-[7hСjժ7}t"!@P7.w5( N O<jJp4xJG}f-]M V*;^pa Ս g~!� � � � � � 2Yի6mRV{#� .j3E?@�@�@�@�@�@�@�@�@ 4h.iP&#܄J*@ Z@:z4CڱCIjVrxE yMM&Гڵ󽎚4,t鮻CbHt21c?QYlȾ}N:^֒%KtUWENn{ \rJj+|aZvaZP <4H.`0 Pϙ3{ʕK͚5S%Ϻk\wK k ꫯ7R w�3zc̔)ScA R� �]D>Kg;wkU/˛W.l,bE Oj8_paw_<yAmj8͛7{a#z� � � � � � @ trc �$E@h- � � � � � � � � Lӻ0vz] +ds77o֯s ,P& [ OfJSOg?7 }桦IR /H]F`WwĻƍwJQ@2jז*WNf@ xqx ܓo睏<" wz 7+AIPb@ ԠA=Zw!Eumr]¡?nݺyX0߸vҧ~^0YVtN3B  Z-ZHv3`@j@*`ZN5dkDW;tٻjWREϏgmx-@-ʕ+N*U*;C@�@�@�@�@�@�c˥>wAu@�(@V@�@�@�@�@�@�@�@�HM`jՎ;6U_ŊIűE+P+[`4I}AO?_Y=[O'% ĨWOB ʥSe wM.A-R%E՜9sڽ)@`*/% R @;w2i)g΄gm{N.TD:Tzǖ @$ l"Ԫ\ԤIXqngϮ{Ww_I1cǎyj>J(fY}ݧ5kָ 曽Ζ-nڴi~=]kYɔ)·( @j d =4f LS˘zO PT?+6 ىK}o9]NhV* bZV5-]>88쳽pm#� � � � � � IJIMH? � P+Vl� � � � � � � � �H`5bĈΧ Xڵ.'b K'UFVL`|$rv˽QԵploCHעoR$_,-;C5k/vp?/F`^ 1Cj@.B3?m{&}J?. &uؽÇoz ͕-Hi pA´[ׄ ťn5J\INT]Vs7Ot~=0a8 z]�*Pe!ZrPz)/^<I+滺3gΝ;5qDi^+$!0~F n/4hP±<y$)4S[:__ڷO7/R֭[۷EmWy%NW\%K*}z7 Le � � � � � �Q%`Rޒ,@�hD38@�@�@�@�@�@�@�@�@ $^}wZ|yH':aZkDHCj T.}}j@ݱyFںU:4\9i`iFɯ}ש#4vtxd;FuԴ/d8)SpA{͘ɸK믕fR Bcthsg1SX#_|!5n vP,< eW r4�J/;-ի'ٱ/I}![ݻK]v 9s >Sm۶ ٪Ҹ,|VZ0 Zj6%ׯwAg]v*U {%խ[XBV{~QgjĈ%Ncil@ 2g%(t Q5N ;1v#r@޼# +qC.Hi [[6]Y}@K.$E> � � � � � �i+`>E#� lT5ⴇ� � � � � � � � �Q-P~}]f K)(QBڵԨ!^-7It1Ff/ '7t(,byҼyRѢmIKMMV?pԺ/&H\{nX7a!CH*cJ;=,{ҠqD L,`Y3y{I3Ià=zH>뛠 tH;/.|$h!II&M$ͶXߵrJ=Э^z ʕ+:unYqmlt)2ӦM±nfw+3=護k矟ְa]]Y)/<I %qcWMA�R[}{1kذn]ر#)N?PN+dz/_>^QI" `  � � � � � �$Oo_^ ��~=G�@�@�@�@�@�@�@�@�0H.x=S.h71m#|ᅾY#UR]3!$pBlbiJ XhMZtN8\4noR>}-}!c"O<!M(M"]|qdLYf׿g͙3/9`Ɍ8|X>ޟ-[cKI`h|P.w^MOͱv* "\+5ۢn@ U54yBzNk%בdM)\ʿ;wO͝;W#\#Gtg\rKUlYot&O>}0B-Iac˖-Ӓ%Kx,XV#+TLF,Y2-^yE.L[VCBjtH=/K<"w Il@=\o{ ԲJy߾e|W_-S_ɂ N]?d8?zָAV>� � � � � � R۶R;z� @rJ!� � � � � � � � �{IRGY;vZ/pR r17sK%KJ/uO o &d[yGSP'{ ֯ psS 0f/7u`5ap :4}t.\8zGW"Amk#a4 o=}_h2,2ronV ƍ�$aZӦI.K\#u$v#墋.=Zn5}!-] Zx~[ 9^wf7izIwA|y#G`!;vLe!YXv-[g%SLfkN+Vvmt-ZI/z[4^Y<#4ldfǿ[ns] ?#�-`  QH ,ܹ35:-`>%Փ ȕfϖ5nأ@av?i; Ӳ0f ^ � � � � � � @z&}_@�@ Ԋg1 � � � � � � � � @X s9뮻ɘ:YӥKVκiݤr׆ZO Ԩ ~ERlݥ] "idKR'H}'\vc,Y.`B=6mN_KƎVZA-[H.cK#})FYBXn|AZ? ?.8"Rfa6��+p4k!Z 9]wxrJǕ]VZ{{Hg�%*W=/`ʂ,pj޽MeF-`;̟?w#O<-{d~sQӮ]`0 ؼy77!C*THE&o J{(QB3&OxmٲeJW/\̆yټޜ9`{yD~Am @j |ٽ9 ղ$EV7=\oTjS,m:F@Rٲj~:-$õXxL˲j*m#� � � � � �04q Qo@�R&v@�@�@�@�@�@�@�@�@ ik:uk69^(^=',PŒ ikRSOplfMi<D={ F фvpMR&R@_&bر C@3fHKHoxig!CNb X~I˖? ?v%@ \^&O=, !)K/IjIgVCܹrAΝg飏,lR7�{W,ʂ~z-[h'ë1]dϞ{X}9sf/)S?xe#G޿9eA_IUG̰rjذe`Pfjs̩QFiӦݽy.<c/_{mW^SOVT|Zu,@�BNejyNj; ѡsݻ#`4B޼ҶmO~}_V<u{lZҥٻ,B6KJiC*RE)B!"GxR"DeI Jɾߜ}e3s>5f9su3眙}gϞ'ڢtj۷GoYjYr|3; � � � � � � ?KHw%j%%, �W@n{F� � � � � � � � �q_|LVC$!jm=WVMkNˌ'H#/ɓ%16w(\k6m:u >/Rτu 2e7ސ+%9>~BczHjQ?Q@Β}X`f˖[OЖly'Mz? E�O?&NS z@.KqYw~Z.hJze餓R˱+q)-[µ֮]l>$¯l]AYpXֹֻ®uxVwB\_[UQ)سhyK2��@�IDAT;wnfUVtr I\=z%=[sɍYn ֲ .c�R>wM*X6nܘc .ZFMB`'4ON=ԄԲ\5|UP � � � � � �d@yRɒo2PfE�@ Z|mR� � � � � � � � �"Ю];5iD .Tr۾짫ke蔏N;MX4sDVd7dkVzvdK|4fԪoKU$=]ƍmۤSyF,Ϟ="믿F͛c")~U@crx L '{4|20hp*jH[/ri X;L YnYQ{Kg-Yr"~nUZX2 x'.]:Ë7ߴP.^PD }gzպukM6ͅBܹ̽;.v2BE4,pG,P! �NkWSJHlذ! N%ZpҚ5I0eڵc)S,/0`gN*W �@�@�@�@�@�@�X 知`,̺@�@@�@�@�@�@�@�@�@�H@#W TRةvJ˒@ bxp XսI>ԘwoiJgcYaӦK KV CJe V8 ׏'tR\r'./aZ1[rt;#F %i-#wޑJI)s֯.T7O.XD"L+s< 'h^_"=Z:</|B >\zas;Lk^o_olZnDZvfֲgn0={'|ǫVZZbſvsmBIXwvM!�~8L~}O/#P`ARٜzu*w29P.w.t2yrVw&g ,Pkǎ``_!� � � � � � @~S[RJz3!� j%ep � � � � � � � � g+z}W_zN˴@DC M+?sfpg,>TxXS@N$+VN˘SOIo!,%qFspU7nO?T&LP u(;A,׼+ !ti 3Fk Hoo^Mժ[6KB�2+izߦ0ZԭtQR>^C,x*<'=rٲY9ºdٳgk.P}_)#=rGҩz&FC�"`4k_zD?IK ڸqc2 )bc@U"8I&% jժB, *jmlrZ@�@�@�@�@�@ ƍ:wy y� @Ei,@�@�@�@�@�@�@�@�@ wy,X륗^J̒@RΜR׵JmxL@͚^ak Fm[8E@ [7ߔ^xAjHڶ- ",GA+ Ơ'HÆ _.` QU`P rhnr|!2 uuKK[Iщ%K .n{9b` NF *\X.V.HFi4G_)p<B <S.ɳE[= 1PFV%r3gZ.mKNYKnvvmsG0P O{M^;~(X`( '9GQYY[NuŋKgLoʕK_}U$e!5P+HVBb@�@�@�@�@�@�E`tiSۤJ^O@�/@VY � � � � � � � � @~Wݴe˖z{T㎴P)@QGI3g +Ґ!RX" 4k&M*͘sl~8Ԯtゥ͕\-LAo5ydWU"!e;X<>'d xaZJEf,HȑM7I' w_V![?b;Ʋcٳ*U9p߂"e!ƍSVt7ki.ΙZpY\.;n.[V_\C|܉�QM矣"8@r#or)nw ZVڷ/Ż0ϗl!`?p>hUZns?P+L2 H@�@�@�@�@�@�yo.Tz诏5 � Hj%֢ � � � � � � � � \5Jロՠ*T P+V։c*V$P+p&;j֌Y҂%H> ,^,5j$ُ OM;vk?)SN3:zN `BKsʽ{qFREkB?N?>)ɠ@g۷{ም:yQŋK[KkH]wK!ea,DӽcR;6[r}Z"-@wmO=zHp/Z$5m*8dIK﹝0 A;wOGp, '`6l"ۇ}uRIȕ 3'PߛZjI>F[?~(LBh � � � � � � ?K]}WӾߗLY �.-@�@�@�@�@�@�@�@�@ KVƍտX.iQOI;<A " <drxt&}rԠuk^+i6V|()[�!k.]'NgMϘ$0`WB&hU{֕.M:+JyZ&H D~, y$ 䵀…{Avvv ?.ٯ}曥n,<2LP JtuIo/p'h~۷/]O͓OyF7顇ޒ+t/~Z3!�8(/^~="d! ɍ7@8vdR jsW20FkG<;9n/X@*Ty  � � � � � �.`aZuxc)Od1C�@ xQx � � � � � � � � k.]ou\*Z*Wϗs3+݁nTi?x9W/H$Pk_R#`fyd%?͞={t7�iOtg'a\R*;e\!Q%V/[b/%;EFWknEz= @�H X@֘1ҝwz`ܳT4x0'Yl8~ibC$q;T j`.n; =ܓP-{=]&, ΕU"]qd4@ ͚Ib}#slfpje,�[`"XЍ]F ܹSs9_\*_|U@�@�@�@�@�@�b'`U0-͠}o3ح5!� H@�@�@�@�@�@�@�@�HVs=}뗬C*UB-^U8|i6iH}^c'“3m64j@J飏bҘ1Yի'jזR=pZs90[I` 6.i+GwO><KRP+iO.=ܾtqwddzfIVIG{A%Jڴlo<v"1P˶O&M\{9r:tMvR^¸q93 VVMz}i / � >\Z.cFȗ/6oޜ<A@n}YRɩ{ʹ~Eqnj1Ao/\Н;i�kF�@�@�@�@�@�} i,_ aZ~R @ja+@�@�@�@�@�@�@�@�@ tY&LG&,P먣~ăyH,P!/(P`]Pa矗Mo1`^!CdG71c3Hۃ>_ݍy.wp (K.B~ D(E"{eˤ.9B*U*}H5Z<d7NC�"d4lԸdlQV(wի/} V9SZ {mi(~VC<~AkW]u;>~S= s rh֠4uW]tiҫJveb<H=H9sJ/tXK Kv9'םLթ#M9.9vHsQsK\v-ZQf � � � � � �*0~TtĉR:� @lכh � � � � � � � � �~+TJI>X% J [`qXyr6ɂTnUY3o h^_"ݶ  ֯&"}YW#FpE]sQ0M}X`inRҼyr0r,´ӦI'N&`ۼ4vԪU.#@6oƍڵ*Tʖ:vz~UCet`NᇽrnM2ܑk iӦ>|z'~3wU;Zda7K]@srȺ}Ӧ\(didUnksb+ L[謅 X?vOj,i6A[\… C+.g4@�@�@�@�@�@� }wqc@�$@֑@�@�@�@�@�@�@�@�@Ν5zh-[,kMUU,s򌇑DO ʸor>,#HV[$+fA&w)PQ :4; l޼y,`YnV.^P9F yZ)q%Xc9?\fϖcvօ�,`$}'#թ#.,5l(M.]wb2~(ml%xw I^]4HzyixXh-6 gf5P˔ 8P]t;3eW_-|DR1uY^< @� wwWO8ƥY6R4$P+E@Oϛ켯@Kjʕ&&Э,D9r @�@�@�@�@�@� w|PjBQzu@�H�Zb6@�@�@�@�@�@�@�@�@ 7t/ ̈m*IV,Pߤ?ҜXXI]:T!` ǣ[/H^J̙3u>WYr@ VJ}%w{8 N?}ԥ'̑. c4I*T(F1l.}w; gx sΑ}V*Y;6-dB-d RT;?<)o^VR7Q9P˶Y]\qwfk7lTgAlVߊ|uU{E ˗/͛7ge1IXvfz`*xVvv@Zj:\̚53kW|:lZKjŧ@�@�@�@�@�@�l*]3+xs we @([~"� � � � � � � � @ rȡΝ;kĈZre AV"dŁi%j){v)ЩTԮ]:lQ"f.gQ]oҕWJ+z.ɮQFK5`�l :-i%# ʽ鬳QtEe@ v쐦LvVZS.dV`>m"͚IA;e׮-=)q2Ǿ}^Opxm2p@tiv<%E)=w,XᇽNx@Z"B+a1 X;oҘ1%`jmٲ%BKL\3R[W<9RKK,X}U1a,hzl *W\|VZ@�@�@�@�@�@�}g}OSJ&H-Zct@� P+6]E�@�@�@�@�@�@�@�@�`y睲MV13ΐm\&i 'Ŋӎ,`?;V.Gr44n,]}tҮ]>Ta Jܷ?)w(G]~4h%KjԨQn|G'黲z8ttG9HDi ' ʛ7G>?t5M7I|"{H@ ~"=>Tdmƍ֭ wlm5|tƍRnUƖ :}1.&O<k]!VҷQ [D )[VjF- 2e&M~2hXt@Tf_.u+ ԨQ#argj,6 � � � � � @>X:ɾ7R:AT` �d]_Ugݐ% � � � � � � � � �RB:t_|QAK@^1~Hc35kwWHK+8td9ج`d?(:dqu%mڴI$psp Zv#/ y=)Wx$yֻgsէd.&e$dVNyOQTr@X֠AҕWnYJj ck/X+:t*TH|~G=#YK{KK-[za[Z A�� Xpܹĉ4C@\VR%P+EO@-`S`Z߸v{Vi<h"+W.f � � � � � �U~g߅me Lv#� j% � � � � � � � � [V5xdbTeEh+ZQMZ֜9ҶmI7hҀ], @RNR҆ ZӱI*sQNn4m4;VŊZX, XV~mpQrם=$˜PFR&ҨQRΜ;|Z˥^:wKZϜ)u.w7Oj+zu]lѲ&;{dVB z6e+VBgg}"4H-͂ [t꩒-/]YgIIMC s=t]DR?$;GC`N*W&O>x*?|m޼kv^s׮wz˖-Zrʖ-F@�@�@�@�@�@�(%H}J='dw!� @Rk#@�@�@�@�@�@�@�@�@�"#?~k.TԊ4/PW9`Π Xo+$7A87nSڴ\ fO,pZ2\PDžzLG~j0WK2> XQp AuғOp@r -]wtȑr5xBY5Rxu"@</ -@ˎ_}U:4B-WmfͤMs .}_}՘v;5\͛kݺuQ]w^@ޯJCJSxw--[UpH" 4I3'Pb*˒]#P+ev/ݻS[@÷i`>}wsg컹dɒJ Ԋ=kD�@�@�@�@�@�Jg)X!b۶__X3 �$@V2mMƂ� � � � � � � � �I%о}{رC/bR+ڃ9  KK'$͘ z*vZ~I8+)R 7Ŀ?\W;*vuR@Z2X d�-{LPQG%(c;ߗ,D /b~ֆ�غUcYR%T)-Wc![_/*~&Z?T:tϼmrzu1< wt{UKLA`-% 2 )_^ɂh @Z]&U*=tZsq Ν;t'Z)w7}gjpՓ,w͚>lx5gɉarΜҮ](_xqh%eʔX � � � � � �q{԰twI|o>#�$�ZI9  � � � � � � � �$@"EԶm[_[մt X֒%隝.P&Z=ٳJO<AԌ4@h~UW7Kw%u$#7lBg~XBڷAWKij_hXȃ>t& 5k^Pέzb`C K xaN0ivrUb0\1J;uN#˥ .~+k -E;LNۚ8qaF2CZ/(nɂOZ2ze ;K#-]caȕ+;W~JپhQoU) Ԯ-(M\F~;>}zJwzGK;wƾu '(o޼_9kD�@�@�@�@�@�@ fIUJ[oH*@� @V�62CD�@�@�@�@�@�@�@�@�رc(LkUyKnMp Ԛ93 2eVRɾȟ_vD/hs% /9iѢE=ԨQn F4(.no1r8vU#% jFӻDi5YMҵJ}HCJ3g`@{?o\*V+`y^^zI![uJ.πeË2텛Ey[|8P+ ƹCw׺0k׮Z{O*[VzAiݺv!@4m*(Aql._vBv˾ŻSի7sϕ&O[۟e˖iŊHnZ1> @�@�@�@�@�@�$عSza RyoN2,@�,@V7�G�@�@�@�@�@�@�@�@�(Z+FӶmҚ/.,}$YV,8Acl/<o_Th!Ю\Q?iܸoJ\F %+�.>o\ 8 uᇒߤ!leZ$J˚O?IժI2etY[F�No9G:Dejr`o% |-B~Zl8#xE^eجۏk!P[eow:͂Z.z^~ sIixu"_H#FHv@Frέ۷ga>C檌gc4WO4gU5}􄂰}o;u#P+@�@�@�@�@�@ 3gJ;g4qTD,{@��%- � � � � � � � �$@N /hذapgKs~1칒+4cT|?Z=+ݨQr!PTRÆXCtiMV|>,}{ڵzZj[#{ nݺUዅر#T7|m~]v?]~{ڳg߷oRXr)]JV.k u+uك\Hîд]VNW.\ ~mɣy.v.�>}C{gOcݣFIw%yWtx@ :=aw0- c.w;9&BtүJ{!EU|{tôTJ*|PO[nEŊKeNv`S ഢ"{c5i㝫nX:$@˖^xL==~ P+aaZEVFAn]*e$HsǸ3I/ jҤI˜ba ԺcZև� � � � � � @Tl7?}v8L#�  P � � � � � � � � s?^ZO?튽 !y޽>ǽ#tVLs@n}wc>>\5+&c%pպaT`ŹW[g2-zݺu馛t嗫K.>]1 Z~}bjòƍu٥L~ٴi_YdYДR%VuZȑc` J-4+4 ܲ`;r:Զ5!~xW8ˮ!`5|.9/V4|i ] 3}uBdF8Wzԙ`A#p0 apR~r{] #a\ĉҒ%rᅭSm\i�SS% Wz jlRԇzpoqln?ӶԷ~Z9 !@p)PȞT.w"<vn͂i) wzu155kz&IwlG_XV"5;GkWl{l5,]Te˖Y � � � � � �Q,},5,@� /& � � � � � � � � �CjȐ!С:YA)|9;ϗ>w݊K\vv6WKXi7 ;tY\X n&#+_b WUh߫^{P(o }ZjV\[k֬qEcWzڵ,X <YN:Y(TvۂU~_[kXxV J_bV`-+XXضmBbvK8̬÷~ -Ûٶl.\XEU"EiRk\` !S#7ߔn1oy?(ݎԲYD_B К0A+/5jԐ ~_XC,ۥ3ݽwvku"[vCWn~f}n7>u}sg/#]yeLJ@yܺO;I|)`,;UΕ|S-`_x4y2E~&\pjعm;͎S8ծ/Y@2e� � � � � � @,ZdiigNŚY �IKXk@�@�@�@�@�@�@�@�@p¢}u=(_|>mfZwK? w^C-P4`\p\(޽xlusK>H@A$%ժ?.s!bgDc?u믿BY~Cso!L/,YRUV2}{- 'ssCw4 fNn[\ƍYmp�. .{Ԭ['_4O ]oFKQ z-ŸU?Tf#믃U;@<~ �Ik;�t5eaɽGƳ;-#$ ,UJ=[n5yZwĪ޽{>nȥ/. .u %5h'xi}1cͽ1\maw\޼VN.&":6MAg@-{M.GҥKC6KN#:� � � � � � @JvyUC*VL^vYJs2 @�-@VY> � � � � � � � � !.!CBENv&bʗ痾@‘j+}UܰuԽԺt)5fiJsgiNcBٮn!N[:袋w QM|r-[lwa Ѳ۷ʵp8RŊC-IǹJEuE¼/nX]lfrf\jUbj_,t~jWIx⮪k/\Er''}Z"ѯ{yFzu´-/^Q@tm>!߽)O/ᇥGOwboVZ>XQzI)W.v7 v' :'C.W^.`>i {+UƎfΔ4xR&>Ҷ^Q^~Yƍq)] Z˺S.>'uz`?(UlK,:?<cƌ Բc#;B{s4@�@�@�@�@�@�Q࣏߹2[7w6qKg@�dȑ,a � � � � � � � � @ X}ݧ~M6.0%FR#͞-sO0' -+hw͛%+NKl+ѾB‡~mV[V$qFBrC(HˊٳGK.ŋ_-Zm׭['o޼"*תU+T1vTX1Y`Q*ɍ ̙Sˑ='W l _nV j߱cEYH[2eܾDŞsr?UnȅK͚ŭ bo,;�HJ+xnYv=t~}i@/L+wno?)? {;^*P@6MBw8   qG+x }\~`A[cR"1 C� T ]}Կ?Zq 9rvsQ5kV3pW:K*\X<@\pO~$_vVNy,P>ױsLC�@�@�@�@�@�@ ~E{t'xO.H# �$�BIʨ@�@�@�@�@�@�@�@�@ I:u^ <MaFdXժIE�Ԭj`)qz駥iR $PtҔ) Z@jPWO0 {\f^o"1UV]?łv2ȗ/_(Ȃ,,nS)dhZz +dvWe4uy؝}.B/_. ٲ"K, ]yдpV<yT|Х�nJ..,u? %z $ tcH^7RI:P@ ^-MhM(X\z˽<0{O#1exOcvwc+m{h͛7װa|V H/,=k҃JK\#@r tKZ3!pD stZ9;eKC EآNXS%kwD9gZKaΜdv4UcZ@�@�@�@�@�@�""fԣ[3oR �C@-lz� � � � � � � � �KPB P۶muǦqA -E-P[7i^ >8 fwǎI0sHKKeJo-a >\Gք t'&ݐ׻?~I-5 :ե+WN_!t (9,x~Rv8kVP?-\0tm?a[ŋwDC*U.~{of̑nI/p! n*,MgC`niL/@RcN/L:&JpǮ֢dۺz%*QOw^˽ӎ(pp# ![oU/ΝUZ|j5k&y'Իtr>C�, XVg>je3 @ݶCEKQhQs)DBuJ]z%\ހ֭['?{e Z~V?@�@�@�@�@�@�ҳJ}HrIKw߸-F�@jy7@�@�@�@�@�@�@�@�@ :/hvCW^)$| G[vmLH[‡6n~Q:㌴M{W w Hw<3l4 ]'m{i߾ K/4o�췚Rk{4k�j@v:UXQ*Ura�%\s'g�i sܞvS!qK,Y_~%TxՊΘ1C/-2K<Stgv(焮ZcZ֬+>dHuxdAcz @|-&NBL6mi/\zaK2w,ם4a,>4n&u]h jkmtZQ0>]LիWWҥC~ 3sRVңJ͛{ .0< ;KMHK*$S$J[] Ӟ{)Pw9{d7:g/_>M>@Te4@�@�@�@�@�@�*`7~ gSw7k � P+۟#� � � � � �5��@�IDAT � � @ p7j|"].YR:D }}D_}eZ.Pr`&V \8WˑQӦҲeߚ JۺunP0N=n\e u֬Y_UV)Xꩧ w}RJ(Hx 7F:@,o\rUW] mY? >|z<'| *FZFPV<y? ؏\5-3.YV~\@\:, 1 3/@kxr.L$뫳%ع[oB PC}K 6lX$Ve|꣏>R޽38=ꤓiE. t SX-DUB˖,@ς'i%@VZ:RܼhUP-_^'M"P+;GkZwuWxoq|}�h4@�@�@�@�@�@�(0v/KbS� �al\#� � � � � � � � �$@۶meZ, i Ju@+*ffFV$r9kW(jedZISJE&�/JO?ڵkKFr.Ov?B}mݺu( PB_~hqjCZ\魷RNt嗋0<#C,̤ ްaC=#zxb_޽nNd˖M/ (t`[֮]{= wߕ 8F矒e=\HVL\+}S^ vY`W_ɅzkȽKmDn_?]5Rpbov,A;@< WK.^Mgڹ~*Wܮ4 Lv[:t^{ L1 Xݻ#Y\8Pkժ#@ݺɑ_n"/ .p%'ƇXr/(۶m'ț#� � � � � �$ĉ$ݼy/!!�$ @�@�@�@�@�@�@�@�Ȫ@|裏Bcǎ&J IN&#pv0jWtv kN=U.CzUiXGHUlzGJ(dɒYiײn:M2E&Mҧ~E{jԨMʊDZxO3dfG�,XPk]˱¤fC^;w.I^zKC[y ?$PVs;/PC`]\n\M{"Y�!b�3awm96'$]vdA%]"i,&KwY:#`?*4hvPBs׉'&Zc]0>hk_~\_ B^\zuos#AF@ o(]޴x;a9rО={c "\$`ǥ-ZH[H4Gg%={=.S2jz)C`>Lt @�@�@�@�@�@ x.]ׯ/}t9Q\!F�@� dY  � � � � � � � � @LZlpT L vo68 `!>0-o-[&)=3g24c\Z< Y۫Xp Dh۫aÆyԻwot/~Eu1[h~ .Sݺu ֣3ABW>}/І 4uT]{oԨQ#.\؅ \. Zti`o^Bvvjų^jLF 2* @ ۽ΝB`{+-uYȖ;tSôjb0i�(ϝ+{\ѿW^X1W>,X;/phR  :B\˔)#;FLfmHP<_U\xt#@X O}3n5}]ZrɝGR{.>Ю]r .q`5jΘ1Dފo|!D>[ � � � � � �Ap?{Ke4@�M@Db@�@�@�@�@�@�@�@�G ۽{wk_pIAZ5 NLB0W-TzH%YMnK2,U(Wx=.IwY`@Ν;u 7|z}1t ʖ-3<Scƌq?8ƳvZ}Gԩ>leW}G* תU>oW 4hРP8roѥ\4bи{رK_XQzBC� WȅJ]&%V0^>Tn يjӽ{ ̘eK:unݤGWÅ4O̟??yP2;!P+ψ.'{J23^ȸ ӥʅ\I2 .`A>!Q)%`2C5͈'JF8f{;v+}y;ցZ)<~IC�@�@�@�@�@�@ SHk{Ӵ X].(a � ~F� � � � � � � � �GYfT~tk͛WZU1{b~p /˖I#Gz-t',-_}t7K={ƯZsb5GGn~ӓO>rʩz.4ku=7kΜ9zꩧ܏.rm#b"(�_y<xp5uIu9矗%S6M2Dnܒ-`!>"5n,]u4o$`/.T-[J%Kz{^ljח+2}%F}]C+^pW_yx,P+C1rkjeSNRK|Kfu|.Y.[ƍI6P@,ysoHQ}YH!' <9;:ZLXWgQ%J賂a#� � � � � �K}V~(}xϼpx"� @dԊ#KA�@�@�@�@�@�@�@�@�"-[6[f͚>}5k# !QK^rEͼ£mg֭r)lVau4~Y]Z=CkAiС X Ǝ?^W\qJ.qƩ}?5emۖ†(8 TXQ=-ZH\sM(lXbpٳgǩg[]wyPHK[㏥O~$G҈Ri?{@ eݻӥjԐ ,뒝$ ٺN/d+%g3y%ZtV5w-}tY_bΟ??9sJv!/Z֬YG&CՓΕ;Nݟ,Ί@ 1\V.Bs:KK[@}m1jժ9shӦM& jŪ wL@�@�@�@�@�@�=#y԰T^)h � $%I6$@�@�@�@�@�@�@�@�@� \uU袋ԭ["1r HB_[1w!=_\DR_^+#Rld׭[<�/O{OAjZhd=a#GTʕu7¼͛Jڵs!.偆�([}Q믚4iR#.P_XP_I/#M-#ý=/ԑ~Qج L;ltu˟хJ wi?T\`GT+l#{}JϤ\2ˇB1 Hܙy@…];O=Ժ`ԤdwժI3g&I,p^3$ ZMUҞ{][(+:G,P>n >nX o*QE � � � � � @2l& "U 5o.vq$]( @�K?I.lF� � � � � � � � �DKo߾6m>h"a{4{vPۥ9sbwofޏFbjVc ˢ$(>߽{Yf.\a,H롇R˖-e^FC�%[ZR-Tnp? B_zo{o!U$M(Y˛oJ �pn&7)#u(!=\HdոT`zyL Dg[l vְW\T>lw'*=vdN# dn.qBlΕ  nUZ"g$}%$Vhl}ݴ=;./w4i_{~p cL1VZJ,@�@�@�@�@�@�,`{q䓥z$-Qǵ� �)@Vbn7z� � � � � � � � �"pKkԭ[7Y퀀.-8v`HM )"͘=#.]$W+V0u޾&/TONz.e֬Y=z-q םwީ:,q!u1d$e+;%ض(W¡)}9.GYg=zLi+Vx_6oެ7\"Nd є)SԨQv}O?EYӧ-[&;[nd]<2Ӻtҽ4..TvI知k77@ +4mQ\".,Y 5ߏ{9ڵB\QB]KIY@kZ@O<YRE0AC嗳4\| BmbcyYΝY_?wt8#k#yN >\طo֟?$ g~s4n#GڵsΑyƏOƻ~^?Z~:;]oWۛMȎ܎:*@  � � � � � �?_j z~?~a~(@�@M@@�@�@�@�@�@�@�@�@�<SofdDKŠ>iDډ?53)`� EeZ Xcea&.?(T4>>]n ?ׯ<̘<Ǝ )Ӭ~N+W-`˗/w!#tRK;w rmkڝޔ 4-] L7nԎ;d#ׯt),W\qE( wܡ�ի˖fAaϸ*?CgngKR#}4d={v];< \D-l�肣O>[zYxqi?lթ#Y`Op|Wi`ԩbӺ?mۤ jդ*E zڶ&VݎAƍ$9sf.gNJ“-ծ#ݶo.O bkXԹ'b gs4n#W3ޓ;үx d|\<u/[ozrhVZo}IXpx۪UBK,U|@�@�@�@�@�@�|ԠdOFGw[a"� I� � � � � � � � �$@J\HN =裲"j@kӸ@j5k&gֺuСRr;&`jz^~Y5J 6Yfvd/do(ƌ*7]O˖-ݏ*%\tE;KJntM<Yݻw?d)M;d_Xb鼱{nW-tw},$͏A*T_|nI_|&LΑvMB嶋d%3fȅ-Jl}'Y`, ع)S]N^O;^3 Ѳ[nN8cV8<H"Zq*=.hӿ{.dwߕ\VZC6ʕ+|w~l:gOَvwޝP�d͒,Y/-H"TBJ$%ZJ;*-ʒىR*ITRQ51q\,s<͙ܳy噹g%3R3z2;@nݺevQ='>%x�, T۷ڴ=~"/ o9*Ю0T  @@p2lT$svY� <@իW; %K;' H@$  H@$  H@$c={_9h ص 8IG>& H@@aZ$  H@$  H@$  H@$  H@$  DI`ظq#Fs p_Vpk+y9 [62$=?8Ѱ0G֭û..{طoF*2@wvbD''"+JNH K,ђJJA;v숃&-1ԕTR|uGA`۷w-W\zO|] 2dL>+ b bQe;:-sÂR8b-j DO_`J/ 4&O,}l|4dzuѫk$j+V JJuJT Xn&| &ҥn[+V8 &){vlSvtҡ\\Ҳ֯_ЁZD2 ,}sX(~>/p9(k[Sp~"qUhZ,"4Z}gje~2L;zϮEƚ#T<3UG$  H@$  H@$  HV{/Y ]X;hvN+I@$VuʫK@$  H@$  H@$  H@$  H@駟6m}a!gox҅H/}SLWJ<gOS28- 8)ݗamo}]3&"38VC,!|ZV[2ზ.p饗]vNīb;{u@?C'nݺN%0i߿?Y2&.6JرcѶm[ A\g}͚57ߌkz}F^-[D0uԤfd]s팽믿ճܞNI?]vCX~7|L4l߾1e%~?CG|WUӦMqM7aܸqǬbѢE8p�/o1w_~kyd뮻ι+ U`�֓O>iӦE>|p/K(Lf (3gD͚5Ѽy{wo߾`_ӇM MVÇ7�>a]@*Hd*0}ղePO˗ ʓ'@E\k@*ԁהZ9ǞR;sy_nn'ۋW^IZ#>c\y` ٟ�MzB]>0C7w^<Sꫝ}qN~q`I>vΝAa.Gꪫs58Æ sns1b۝~mrкҬ7`2aգG<U6"II8k%K`m'X!~/>ݷ \۬I]'<$pT?dgҦJ JF Pjj8+аaC|["ی)djsʥ$  H@$  H@$  H@xW�gةY/`h9A-F3I@$Y}j$  H@$  H@$  H@$  H@$ `eQPQ]KCW_Z[Zzp=34\Zgn9qɗn8(=x8E*^C3|\T%K|6q5ʩ-m?1sEg/ }R f̘ WX<>rH'XP rwe'΍v2B/B*U nb ԪU+g0{&)RiW$0Š2cNp 8zZЩS'0T.]a\ 9Klٲa`B]^x'0R|mӌW `ɒ2dyl+ U?]ri3={{U( ӧ rù 1c }RV ^IX {+~}X,`  $e4a[iBKokaAGC=7 bXVmJR}<- <Ԩq]Xop4rb &w/odF{_a#L01$熣~Xf`͛/IVSs9E}eKjlpg>4Cz`Ϟ=+'[*Ck}T^Hܷcr*TT}b iƩ7o?j O ʗ?s9 e%od3<bf~fP6o)}>oQ@J#F8hJ}`(;* xZק:@�6lpL+ .@|-@-_Q$  H@$  H@$  H@@z>  ;vs'0nM윒%  H@H$j%V[%  H@$  H@$  H@$  H@$ `p*PGh@cZEXEKMrU`cEAQjD�:{+WI7lrՉo-Z T8@c |= ,x?>°12pɡ<Jʕw9AJ_YA__êN[pu>м�%ρY^'(3i޼yg7Bnݜz2s.YצM৖-[ ;34Gu@$-Xx+Wi'Cʒ:u8Π *پ@VPS믿€nBK6: CƌFTR@ J oq]%&X"rW&p,۷oǏ?9N!ڵرcÆ ;F4X38lVj&Nf}Hq O$7o,g'ql5N ,H p0xY>}�:/d+kwr駣cI|?x2Ⱥ nX8,!W`aZ HJMn60AM,ouk/>t֭{.牷3'w۪{˖-sQ_ +1n?ٿL_hZ?wBRWrʾ/Wr^> xOWfYaYsvއ)weqV {㭇}}*P9>&}̝ 3lwڎΎ;|fߖ-HJk@pz+}={oh&Zh] (P+  fLFTf_Μy8[ GV$  H@$  H@$  H@@j<%`syF59s3u$  H@,&fW%  H@$  H@$  H@$  H@$ x˗ǀ⽩AI` I b/ط'Mp޽}U-U&B 82V~6[�ʖ$IKF#g:ʕ+dҥK;p3;L8RpV+dzpk |.QÀ'ϝa?^aHcL &X0Խ{wTP~[۷m6\tE^UP-10\9s,օm ,)#}޶^zS`1|v7)[v ~X$+}Rl_VKŝE242`;wtBฒA9nC.Ƨ6X,.^[v,K c6xG<H OMJ0F;a�?x![ KUqa}ԟG,n}a!FqBAWXq k׮m/s?�Z-D(5۹s77n0}Jr+Rg3$W^ye~8+ۡC' ;}1[oL KVqF5:^=zp.]xybVG,%zQX0GIۿ~[%�?꯺}&}#Gcԭq{@wH �7U\Kh^ޯ.GvZ5kրU$  H@$  H@$  H@$(e 0|8p9t?`ί$  H @bպ- H@$  H@$  H@$  H@$  H eˆ'x‚Nwռr`!cfL .pZN@ְAc%,^ >6j:]�;q!?0"X.̟?>Cʧ3pXbx饗�ɓ'[[lݺ𖗵j«q)_xAL5B Do֙/^+W1P)akZ687O/d2T.XZ =BYh̒<ܡ~޶qn$hLup 2c Q[p0˗=.?/5Nu\,?t~'GFZ"#OM ]̙l ̘l Lr4d+2x{/[0rpE/%3hѢNTJw gv|ۮϤTܷbEOL ^egՏ}1_ _ž]}^l}۟_Vu<+8<}}'N sfL}ܹ3;¯[}Lm,uPddղC?Z,Kͷ%CJM5|O~`�3{MUHi#^Gn`lL7B�kyu*G6l@-/H wYz5J,h$  H@$  H@$  H@1 S͝ pP8p}@zڹӭy@CTE H@|!P%$  H@$  H@$  H@$  H@$  H lDƍ/GTq8ЗbFSH/ۿ_}oU m LGbi>}}.8r-صky ,`ɒ%ر#oߎo?q�zp? p+~,ws㖱{n[S 8/Rz}+:leva~ZϏYL% ҠApz~mAmlXe<0,/ªH~ }a!QV)l�6�~:,P}kr:?>ѐ9#P8\L_ t>�R{7ȍiJ IJ뮻ȋ_~9C w;-j1 (�`1diG^+#`eժU:v Kecx0{8ݻ&Lp?N / :w8p�Gƻ+Ov!#9YfăsW9 f͂/ʕa C̽TLԮ ԭ q#fȑ#n)pLE4i ,\܉1OF _b% ]֎A H@$  H@$  H@$ f?󁀋.vޓ_~" H@2,dNz$  H@$  H@$  H@$  H@$  Hi+K7n\ۋ@_˰nU$e|@\ 4:wvڦLʗOs~s>iH6Nsg'|U. ߯_?Yz-kN L$H̝;KFժU-, 0}3"?87B%(2|ŋ�N:᯿J/+ժUs1c1q M.+ طo_R5R/dW̙s'{$s7/g;fA~s.Gqa Xz,믿_PHp?bرW06R%;Ҙ)qh-H2qbb&Vs0πݓ~'o-K% x}*O%U+-K'=ku`9 V^S1,VlߝzNSoʕy{a2-X�sO0pu{uoݺXOs 4ѣ8x=~Mه*łYhyH%֝wBeG[xd) .Y-ׯ}}\^`HZk3~g�e�3ghذ< cѾ-ú;vݻQXh7Y뗀$  H@$  H@$  H@k&�<ՄKyͥ vuN9%•$  H@+,q5F$  H@$  H@$  H@$  H@QAY3:01 䔃GY^Բ<LpQ dV`xAՒߥ={D۶mႺk38`X Cx8;T^c:{lgI@u裏:zGw;s>M<Wm66 +6mr.Áu{*5zN \rU-릛nr>s}6pJN)d)lYh}Wv.yc͚5}eŝS, aUl_J93:d6fTXrK,EӦMg})SNȒ͛<+f͚93v k׮lڲ ڰa3땼x')k1bDr֬YX|9^}Ք26`�)YFrv^z Ț55̺ ME@ƑY"H0ȲIѪP�M~s :H*IzaB[0~){t8묳bŊT+Fظq N1!L ?Z}kgX~: J_K>_[o)7z/"nvtÆ niz6H ۘiOhs9)h =s}`s_>UNHv)﫟~,Bsw OhaxRCZWGZB&Ц;@6SIpjeϞ=o~"쳤?搀'Ф `6UTT -~+ +@$  H@$  H@$  H@عUvz6 عNo0÷v-Y$ DPV"mmU$  H@$  H@$  H@$  H@HH{ c>|xB?і̀Ձ3u ,&�PjT�@PXk=Nì]zw}ЮI=ρ֭;;wF>}zzAS{3_ /npf4h-_~ٙ|M-[ӦMÏ?9s3/A^ru%9w!Z bxÖbs]wJ*<x`AzgXS|m;# #`'|r8ȑ#q;wpH龮]W&X?sC_T\ժU@EꪫpstC8?3gN 5A myN@m9o<'V^…  $0mS.,4j \/_s͛7w~7'TovAP𬿭CR_˕n%K;tׯҥ(]t0< ;lwEZC@ѬI}�а3pwo)|[, *}e(_\ '|$צ}þ`0nV޼anvu%벂׬ ,[kgZRÝ`䵩njۗ%s f}C&nrJ^wjOp? k t}>6יR8~67a KطdѣQD |GH_ܹsSNo YhbKc ,AMsseͰ-Cq#.૯r>ԩ,ON\vWmeۗėgw<@CU7-Gǩ~;1-3P%g X\3Yȉ,gT#ôع3ό6l[ -H@$  H@$  H@$ 4͝Y`}f : ʑ#ۨK@$?>9`T# H@$  H@$  H@$  H@$  #,9>ÊT$gLh \uGAnݖSOJ5{_ڳ63,/R="/и1, '8[� \Xg ŪU9:�+ EX2 CDTޒ38W[ԪU˩aڵ s1p;g2y_\ۡFe_B 8SNxؙyS"EBDnA)S&9ZlO> bPPPU#lڴB+9SʕKuP=RJ!"l /]|%H>(Ge SO=儚Er^ {_B`)ڵ yVeYP{BeZ0` Ī�m{L a` 0��@�IDAT RĜf`6@lد͛Y6|jF ^ J e('_URK/uϘmNsq;vpfW,)O:Oe0+hHvKd1{Iٸqxa!as U/7)Ű@3`0ؾjo_ H Bqow�T�V9~x'\WYe|곊:X8t㏁.m5#Z0[J2eFɒ)޷^\{`Ek1{'oUM$  H@$  H@@cٳ,_C ᪴( H@@\  ,bc}ŝw6붆q:(ԢZ$  H@$  H@$  H@$  H@$  }xW8I"-!C܁-CE p|evb-P!H % +0c{S~ "=6obзot"9ÇN &`F:luDyF*I⠑̝AYi 0Aϖ-ox^$t]<ءCg.zU^=gpœf zG$=Z̙3'2uI򠪔Vt,X0S jN NWthVFmѢE+la6ȑ#pԫWU|Eo֔)A?loٲW%$aL К9$2<gOiSXS'I!@, SuX˼cB% �8p_#j-[ |I3qP'-$+&TR Jm'|P>Hy/m}e_% RkԀK�|0~!$IfϺ`L.YO$ьGE�ih#f+VxW7n-[`ɒ%8|ilbZ֮]*L+Z$  H@$  H@$  H@�W9m5y2pZrXU" H@$&$  H@$  H@$  H@$  H@$  Ĵ�{Fڵ+nvs91ݞTn]wPO?#3KsAN7P+ܼk8ND`"m[}{wYF<=gxے&Md'쯫 mڴo'xFNн{wT\Wc60SO={oK?ӝ'T3\~Xb(mU)6p(Q{Jlg0u Ek3{K?~<>7n\P!t]o_r-!g|{6ZvO8N]p1{� G. %{AZd[ş^g}7[IOer�v~=FdH- N*ei_m" G"pP1c(H#I-7Oc.=j�;_t9skpB_!_._'0HE1&Ы0|8@ǎ1VyU7vr@) vY^ZkiOI7P˻UVufϞZŊK/ H@$  H@$  H@bZa/w'S3@v@1<U^$ PV o<U]$  H@$  H@$  H@$  H@@FnF<o);}3Ը7riS`TjՆ Sc5z4@aZIȑ!^0\v�Q�?*һwo4Q"X;w ~O/#F92,ǵ^(Qjžˌ3pM79`)7e >k3|TjԨN~,-܂o֩^.]Fk) ѪS=2z[oc?tQϟڵkgtQavZ "pvuIocSE"l�-i 7uôC9|ᇃl!޷o_P}&`d },vwg_wxΝq6@sx)Sm6\pϤG2-c*s+ -[W_/'-[nXdIP]駟PRP-Nˑ@J,;Æ)P+b>Z;wnʟU)Rĭ׆ gv2{ Ikܸ1̙~Enn?,;a +. H@$  H@$  H@&O;^q([6lՂ%  H@@6,$  H@$  H@$  H@$  H@$  $@-gA 0ydn:b/S$ҝGp1ÿ6,=ԬpZu@f�0Ȟut&Cb1R8ei6frdըQ#J'dɒo 2%t5 cc?WNV'ɣ˗cĉ4iY ;Nr툂 m 9 �̞ K3. ?f9A0vT${M-3M(T c/%J`  3=+ tu?8`z3gJUVϼy={ $;o&D\Z>U@b;BoT=^l͛?8[juS${u_|ԫmTR0iS%M…݇"`_ 1Y}V|wEYh�<xlq@ bk8©eK@$  H@$  H@$ {oV�ʗn_*_( H@2#%3Os%  H@$  H@$  H@$  H@$  H ׯo[u@~,$Rhu>KP�5;h΂M�_}S: @QV۷|XS�< ?о}{T^=&9J*--`ʕXp!?| :BJγ?>81ZSDV+Mx]Zr=ɝb :3mJ7nx]hz0-n >x}xq_gR κww0$lieQ3GTX %$_w%�n(´"yL ,8_wb+L+O37<#{ӮVZՂt;b͛˖/\+> nAq'pijP: J(aD|�"`#~2PK`v'~)^Vf[k$  H@$  H@$  H  zasWK/uKoc ӊvR $  H@8^@ZǛ H@$  H@$  H@$  H@$  H@q-ObذaqδW$pG5�l0ZwPX �Uc?zȘ�oX>(\8cϏ׹_u'G&֬YXd ̝;7vu.r<Spm1.ZFH ~?'a;Õ m۶`x֝wމUV9A9[~xiws�t¶9Ш?0sRdcHw- /�W^ *4l`L�l~-ckY `8}5sg7κ;'`ˮ].RjԨ z$lr?i1ȤV-Z;w*_澀$p@I{nŷ2} H #M*P+ЫRJ(VfϞxwT{ qjEu3k$  H@$  H@$  H Uzh/M�WۿT$  H@/t /6*! H@$  H@$  H@$  H@$  H rJ½ދ{ ֊ܚV-䐅 [б#;wེ.8BSeӞ?Q=p�u73ΈfWZ  qF=#0Py<x0fY2̎;@ @, lT,  _|'N矏ɓ'c͘6mziec \{mLTJ> |1P.AgwO8|㞠;$%u|!3T�}7p믰M7d1"kJw_a̖gJ MZo~ժUKF6sqV'3B/(;HN?xDh (P˓Z7撀'7]^tE3go _\N1pv@t}0LLE$  H@$  H@$  H ˖>|wk�#FA�("K5$  H (u[bL$  H@$  H@$  H@$  H@KV_P!g jYa_K͙u[~_�? tjr>wf6n~N[N7>(P�W]urJ^ڹ^|y{K?~ܻ2:w#G믿ƞ={DOmۆ>BBQ\9Q۶mٳgv7n:Axc,Ys(S'7Po_g` \qP  Xf@XhոeP_ }>'dGXhXJ ۷Âq֭.,76J6* غu+]Nt/6tǺukӦMXt}C.81͕hٲA !qv ȑ9sLFg ^?;e{FHtǾ߿?#ѹU߅*7n;8@p k$  H@$  H@$  H }o*U x59@@`V�" H@bM ?}5 W$  H@$  H@$  H@$  H@@|΀\s w:*J͚@^E XVs…@˖_y8<FE5aIͱSСC2d:-[6+K,:8P!髯C= 25kV}sW ً VEZథݬZ ˖-xb|ߝe.]jBKauds<@>}Nw/001sz|`-RVߺ/0};1܍Ŋ͚(_p_-KlY|j%Hb ڵ+ڝ.gzJEE^;zn~馴�ޓl =@ to qGC$Pӷlق $P3Tj\eى'=?Yn)ZlG믿FzR%yZV*k׮u@p k$  H@$  H@$  HxyIHY; hxUn]g{$  H@UjS%  H@$  H@$  H@$  H@$  dRꫯFƍѫW/' o&Ras'R֌ pų΂7Pkv'h4" 2K/W^Ƿ}ĉXb`fgSO�fq^}-Z1VRř*V Ku%Zҥ(pA'8?3Vdɂ *\K{ҥdp³N;B &n<;+;mPMO`>`|`47D˲3'P>g@jnH :8x7D; Jq~Wϟ#+-`n8![<ns)Ws2SEHY`AS']YP5l;tolݺU؜ Z OЬ8"д)$gXTR={/8"5k^֭s@k$  H@$  H@$  H{)N}l ;_;;<9I@$ PV|nWJ$  H@$  H@$  H@$  H@@PÇ̟_;w94SV+�/O-S[B-pP/5t{mw 2IT<0piO?6mڀ!P*) p`HN[N.]?X/-[fac#gɓg}6<LgpI^z׋pV āaAʕ+cꍕ%JrʨS}ߊU:!tse б#0g0f piGmsbPؾԽ;г'P_jz$9Z њ7ؽwqóVרZM471, X5 v+1jX@_ J.Lz4ja>3C@~l g%\j;N'WJUb (pOO l58 bdbF,0qc֬Yޚ[k"G /. H@$  H@$  H@@ 04kz`;IP5[$ Hj+ H@$  H@$  H@$  H@$  H 8pm݆{W]uN9唄2i҄2 x56C 8 : =5"33ءmۣGGdZI |;(3x f7ꫯ,’)T2$?~4halVX ?;sTG+ *Wʗ/\zٲeA9{B�֭[U?H ʕ+wYg%RJΔ/_!+=\ZYͯ|! xIছT �ftO>X6`1ZF氰PQ˒� AO?_o0|9stm :aǖ)S&m`_C Ԭ6 ~A@(<ۢo@P{[nS'@MC,Y{�g(\ @-tD6aܹr$c uE[_~H@$  H@$  H@$  D_>r/�f7z *V,$B$  H@@(P+f6** H@$  H@$  H@$  H@$  H <mwyl TN>r`j%f?2P1/_ 8EI+W*8{X c{.¦ Dի U$ܢ ۨ6lxL<1o\27&) *e)! *Y$J(tN;4C�_ ᅬ֬YN >A)0 i#3B %_zMPCg �{6تKnb0hb :_y֊G.<eN-Z *HDѩFκNn"JN=UZMfsM~nP!] ~f`$� Z I#VxL�ӇU2TH*V_ fw>+c?͚5jc={xa2]. H@$  H@$  H@WY C_B.zt+/__-$  H@ (P+=!=. H@$  H@$  H@$  H@$  H  ,Gy}A9⬳Ίۼma>nIV `�[֛oZWHIAc0vAR2Zv-})=B,@<)cyaF =ڻwoSHEEbstxĉ^uoeɒ%鹺mЍ[~q/KwС$y:m *S ի\:xy2;*i 0? �={,O /��6ov ^z w"!`_u6͝fraah�C|=9�}t%FvfSeTbF39s^s+&Nd \wy8/z H ]+VF�^y%5C 0Px1܂V <Cg Ԋ,}\Z , )MT#SѾlfAhjqHj.*$  H@$  H@$  H@ lLh})`v~Ц p@ݺ}Ԝ$  H 4 " H@$  H@$  H@$  H@$  H u愇0TO>d]&5y;FCksgH \ *`ce;A I4ajPF):6�E*U)nڴ b(Ri7ouc0HRP! <͹(P�m^rr(Cv-eҏz`,6qPN:$0Pj `cZʕK^&h˗/Qcg؟cK7exvlۏUI>0w+<yFO<Ym@fVn  w`*8FBmTICiĖʠKeK;vۧ�CzzDcDjq<X"4m ,X�4ngM,eZ.?P-K@$  H@$  H@$ ˖S_5_ dVgB+TG H@$y.ysQ$  H@$  H@$  H@$  H@Zqۏ2L%Hɛ|j%&?f^p,償'~9 7eZhh4駰8iXqa=_Bl1Sj\~)0t _Zm K,I iڱc8A,m-\+%N뼝;w\r99s: ʑ#DZ[g8ݛ4ٳUݝsNpwݻ ,hy<Nh 9ŀ *$6'hq�W}k�>X{i/jք Bah+iē9mڸ<A>waxM7@/k *`8fLmI@FbŊLz�*U}h>k:$:/ mQS`躂#SICyH e1P^�?x:ZǛ}<vÆ (SLJ@$  H@$  H@$  )T;= (b$  H7 ͦPE$  H@$  H@$  H@$  H@$  DWࢋ.W_>}K.A٣[.]v-AE) 0P�/X/ g W@JG,pOJi>yXr%nfqġ�J,L6Nh~˖-ظq Ǝgk3Bȓw'O^Ժu ڵk$Ő`I'dL3'8^f#a2ʻuob:0*}`p.y=6C(iF1h,O<DžqҥK;d b`/{ZT�>o̘۞k01c_-kFW=U-'xЬeѢ^Dظ 4 2?nSV e_A##[vH o�<" ,`!옎NFR zKbJpv( RVp^xM3G9D`;w.ڶm5j *̑U$  H@$  H@$  H@|{?-a(]^gU$  H@PVVS$  H@$  H@$  H@$  H@@ <ST+5U+X;8s޽k'0(nc-X ~�~ ) ^_{5;Y| : � h?\={.}aAPgȈaU{,qIo3j޽x sBfٮ¶ry]C/^z!` \BɉZx]!Xz<ݓ}? h?U_#`8 `;@׮ VX `'q�z޽́}iZ"𳛟ֵphGK/gſWBٚM69㾎J X0^z Zre`Pছbmj%c<<L,k=ZntY&Ujq6�!2 Ф `^�&^Ϗ5j`֬YQԲCa--[Za%%  H@$  H@$  H@oNV 5^}hBSS$  H@jȆR5%  H@$  H@$  H@$  H@$  DB<nᆄpSݓ}PV$^ia*_#Pk `V}T/Эe Ц PJkic&LO?PC,v-po'5pY'UɓǙNl z)oT,2u/^3Ŋ }y~Q5/+h͝ ~g0<vqEjZ#p p>}A;uF�xFEͲe̙?kA.]�~eVVkB%Po8|Be[Ω2U1/}�x<T&2Db^7:\8pz+N;pB˕$  H@$  H@$  H@-Ow3@@ǎe\�dj2$  H tUy H@$  H@$  H@$  H@$  H@=c|~^f6[jv]8DҥPoureV;?Ѯ];UN5�Oj|@MvaZoV(,Y < 3?aZaY H*0H`rA, ´"HUlL0;݁Ϲj/nP˖ J2!VXyqFaZ!M1PkӦh 5 * ȝ6 `j7\a3H@ y'`ޯ[/})P+c۲hQHfƞ%`S:\q6mjDž~>uʢTu[&:lMjXK$  H@$  H@$  H   S܊ T�VGu-H@$oAj$  H@$  H@$  H@$  H@$  dN OC޽;jժȳ[r??q~;=nL <q !O<j@xwp%G^WIhE[o~.`@H@�z 9Zxla<;5k܀?�8ݻݺ/ԨԩN4]&C7߸|0?FY376DV;W`>` 7 AtQO2rjǠy~vtҖG^xwo`8W[T5@Fnˈ�WXuᤓNB…S]+_W}!`Q2UE%ׯoaV'cƌ曣R'c͛vjQټZ$  H@$  H@$  H@aص 7`tϥaC`�ysJ0\$  H@8N ,.! H@$  H@$  H@$  H@$  H@1"о}{9z‚ b'\M!{*Pk#`5o\}u5S``P�j84{S5*5G <�X1n1f6``F`V`^`wY؇<�g:@X8'Sv;as wT6owrrڴɝo_?yv-[`xѳ'P;ͥK F`jdx"e PڿN5}дRK?rMj ?y@xC?cS`H 9s>;dù4f z1Qq-`BOEuSq+h;jٔvѩHxy~‹'2LAv<ifxL=ZxP ?sU$  H@$  H@$  H@@ 7f f+`~74Y<7aZKک$  H "C$  H@$  H@$  H@$  H@bO`Y ?5Qt�iY�MV3(@-o9 ٙ;nU$ L t ݫ&N ںufq*@�C^z 6%,L4Nf1,_U鯿ܓPW5{vDTi:Na[\Jpv b*S cb Pxˉyb76KoڟaUϻ x_y:Xn>,q(;~aO??`>zgwC8/{|iah ۋ.ˉ}n?>"p 5;o,hӝ~,i ]l \9\kr%2 ya'ՉVJ/0U~z Qr2yO_p{ŁU㳽j2"б#p= ć�=mc=EP Xvrp^L\=K.XaC Y WټyBL4V$  H@$  H@$  H@1$t�-nq/U hͽ9*$  H@PVj  H@$  H@$  H@$  H@$  Hmͮ]ڀ+D޼y}YPVE @୷܁Cl-+>8(38Њ?{,>LՊ0k@G 2e) j޼$Y'Q}N:pa�z3-Z0}9�Xvu@r@nhÕ?h53qŐ&/xr 62֮uR.H.y;u[օq�XFqy[۶۷ B:0@ u\nB->e,te'y�W|0܌r˝۝\~zó]`AwyW`pnC~e#F�뻯Jk@bXt7}(41|[eEߧ@4RD;>=Lr!~r P{{ xiApK~,&fQ։m&xlDzR" 83g r6mK,w WٴimDŽ$  H@$  H@$  H@�g%WG/x 7@H@$  O~" H@$  H@$  H@$  H@$  H@HYQKegYrϐ!CR)e @o*P+6kțR@Fǁ ۶ -/Z92$vFK/jaxe`@BnJfsՐ'N|V)pT1DUsAf�(/)$�c~=/eAY^ :xлI'S b,'Fq౬3 8�1-MyTޥN:/91ʻuob{9wIz|ޥ{ q[}1em`P#T$O 1\bCw%�`>KDm@*VtC7+Wt-x(Vm* *{J�34aZ3Q#J U݁'&LpSQČ5k,U2$emTl%$Ф *�CNN3bh|7o?XT$  H@$  H@$  H@Vq'jw}Z O" H@$o;RE$  H@ޝPqYʒٳ%l-6HMMRM/EiD!E{IQd-,o^9,{{33sΜ93/ � � � � � � @V鮻rEoQnK#GkJ݅{[ :ߖN;M(dMcE֭u1c8+̤I{n}}*Qi#[Oى޼/BIդ\0VS|d&ق:V~aN@P+ ]i+\ڻW-7U$+@jc-�Ć ЩNGE_O?M:Ax|^=i�}{慆@Yx֔)7޽�-9_kW{6%?fƐHzjk$\}^pI틐V`'/m@ ,)k' NV+jժDl>GEVrD-ZHI?3˙LLes;Z8]M7ݔgPۿmEjׯw]aL ׄ/ � � � � �ĝ?cFvA\q1vhӦrK3C � @ c@�@�@�@�@�@�@�@�@�2)гgO5J\;3ޢ&` /,WVLj66pBd>}W'el)`-ҥ% uz%5lPw\3bJ JUԉYꉝ3Gz)?Lˬ:K7˛7C-X -\(m2ea׿xq{/)r0B' c~'&5X0-˕ NUdl�lOҷ& eEgJ/5j鋤J<ŋP:��@�IDATK/Z ;ۉl!@d,pӂX;.YDΝ}4yzjE:rԠAh>U4C7l[壏8 Բ/(լ�3,"BYg N \KZl5 !QNFVs_4;\V19 6Z_OF� � � � � �IkZ3f!Z"ٱvLbǎR&Ky$=k � �)@VlnL5 � � � � � � � � 19rhذa(T[]vңJni `AkٲI_~)kw~c\=y}T \:/LN)((ݻw;t]wE1IA XfΔnY<8$hk.ɂ1l҅v űB /H*kVCvŊ~N pfǾK֭鯿$; w" x=`A?˂B䊎ñr !wn?mB5Iúu~xҥҒ%u , 9kԐN;M:_"9@P},0Y3iɂ,4�Y#`W=zeK Udkcu- ~`ƍIs9v>mDjUU$?ٳǭC'P+_T>\nVU[W6i�BS8h~}G&mٲE6mRɒ%`nE[?h@F7ƍӥ^2K|=ώv~Rَ6ۇl,PX۩MC�@�@�@�@�@�,|4kV`oSvL|RӦR1aG�@�[!� � � � � � � � � ph-Z�tk޼y> &M967 ʗ2"'K*%;s$u_؂e\ >/%\Kٳ] f}i} 1+?bԿTd'M2'cX`aVI];׫~S{m'HӦa9/ �tTt-]VuQ^`[6f'X<IaXV4͊B,reƒ]̨.ϋV P(@B> Ъ_ph}x}[7)gN`n#!`nmܙt˱uDn\ ^Y$Dym?z~/[٬2;T~XkZl /uZl?4y&{7,௼m[Ff|퀦!� � � � � � X`̙IZSG\pԨ1 � ]$ $@�@�@�@�@�@�@�@�@ V}QS|tYFj˜YЌTztW&'Mo/-]/Q}|*Te& tIeI XYA륫l)fS#e^$ټ_3$ 7? ´ -[$nlYDh8³BAXo Deh`<:eKgO 6S> cOH9]v s>\:蔏6ԭs^jjZ[f'ߔE&֌3ȖM@m]%\v4pZejN܇@l \zg~lM=SXrwlhՃ?HxlF`A#2gy۟5U<@r_}wi&,X0@�@�@�@�@�@ O Ϛ5~_?g󏣏o @�@ �Z)E� � � � � � � � � @2eԯ_? <X;wv]8nݺI]'aPc6_ Κjw_-\(-Z$w^;i1/`a6:I.͘!/󳔥30i$i&KGV:xi\V'zus知ݥ;6B9uCrFZCsN gqxcWB)S-;Y6 ۲Sw3]Km` O>M[zMC-!vWiӃ{tS2JW<~e=.da/(ըq`_�F&ímr Bi'b uQ.ȕ$׌zEHfof<OreijN#Fhڵ*\p_ng׈ ,"� � � � � ۷K_~)}gI6+qܹh9 9sƷs� � pxw2 @�@�@�@�@�@�@�@�@� ~^RY^e2$`'['-_gI.G+ի8+Z{-dY5%sn:edؼY.S´2+ltY`!~?(=dpaZ3gJ_fY% طޒ2ô2|I1=&,s7yt晒]Zԩҍ7O;{.t?_nP4iF-0-߉]@ٷ@-{,P+4s}8@lRҼy:Y:~]IO]YnK]^$PoSnZ%KLt ѢD 4o.Mf_i6Vrȡ?0"0/)#C�@�@�@�@�@ &֮f~}?8qc驧[[a;W)ӊɗF�@�xt� � � � � � � � � ]Ԑ!Csヒ˝[Ryd2(P O -^:],o8a(ԩ.#[7j(JJR*GI@h'Xɓ^x|H ?TtdKٶg4fTj:ֈbU];)W̎#@,_/+u*/w-W,dU+2/ 7HNdͶ;ȗN;Mzig%+OC KZ2eRObH"5m3~飏y+`d(Gv E92ãDI'Imft ,^}.dU@C ?d(W iKEm&1n޼Y  @�@�@�@�@�bR_JJPAX%Cizuv~oItuv," @�@�&6 � � � � � � � � !:wuO>|\<[7i"ix!H- ׃u'R6 _pjuVg$lڴi:3\KtǸv,pΊtZ?H[cLӧ֮-}4`dg~^~@Q 0n!@| Xr۔Ibl'w.}v![-![]j-BaZ6^j͛'Y! Y!`!(%[!K?\iw\?@l~"[[^m+v([߾c@, S,N=Ӽw'A[Ep 42-`-L|V.)>Z۷K?>\Z\Z׮] � � � � � @ 13fHvӹJ !ZH| _[8rNKU #� �Y @C�@�@�@�@�@�@�@�@�@ \aÆ"X5vش?1Ys18LrjՒ:F0}d1D;2jtRN4e=-݇E=LzYdgƏ &V`u `-[̙g5kYM9cH]JC�XTzi}{㤆 W_jԐ|SZ.)dNķs@l XSnayWKB.\nZ.O,PH"X neHիK.?pE̶'?_BI4bY坨\9驧by.wlje@-+dg42#PTdm|-[nZ' W֦M(h4@�@�@�@�@�H;&؎?~*s7\n̑6ofΔOjF'y0 � @jNJ � � � � � � � � @ Ԯ][]t7߬۷ _}_}ÆMf. Ԛ4?وxb)Yسtݒ#0|x̓^D[?)K&$NFoR2g, gԭwbҼy)ٞy>C`JiܸeV<>nQ{'dIRGgn|<"#K/DbId^rp lْc $NkU2hd@B:[[B#H?l+HEƤV`ڵ(f+u*¾}!i-i2MtPfM4Ny"P+"̌@�@�@�@�@�EgϖzHj^:x+RjP3?^EՓrkf@�@ T � � � � � � � � �xi& 2$Ogt$y 14LjD\3_/-_YV۶c{/L))>}9YCZ l4uh}Y0O'O"ըɭ*Y(FfۧJU:h˵J2+G�p IgVlo$y&Mcڵ̑:t>ؙ8:c@ ,2G$]s͡yɑCn֟IVo եliIJ_Hi_x7,Y!Pߤ!iE7f ~gj팏@#P+Ȍ@�@�@�@�@�8c.SUK*P:TEnQ鯿?\bD8`V@�@�N \n @�@�@�@�@�@�@�@�@�uzH+VfK_.=d' XX@8?][s,MvP\zc4e1-dƍ/R+R҄ ;'aZ%-c|1`ԦԪdaZD1BjTRE?_ z zyZ]Z`¡ښ5~qy 7vOHJIGKN ʙP?f]eΝJ Ry-X@8:vN<1i atiW7oN"KG Z :ul-v-Z\rbmTkZE P+</fA4_e˖'NBV؉ � � � � �1-vrJ' {t)RwII"-]*^-/|tR1=L< � @ px`L. � � � � � � � � M}UI8n={J*M3ɬ[ʗt<at@?D&O1*`mg-m+=-[HN>h 4iSdL54=`t9ңJFIcH噇`;qT#@ klB>f~_!:-HժIŊI\#Yn˫VI/$YV">[ &daY9Y,HL}DN#At_.5_I \KF'y={"XK'`b鵳@e*{vgdu;hZy9`6-},Lk֬YaضEPSNfz!@�@�@�@�@�@ vƜ9ҰaRNryKcJEJ#}d|4tt%R-OD�@�@ w @�@�@�@�@�@�@�@�@� yz\ 9* 6j(cEN9EjT1Bj&'ɋ@͚ Yƍ%+TNo Vz^+Fs7o<mذ}܇۷K=zH"z&̽td6I3gJud϶h]v- SZȑ~޽Ii&ELle=bE]py5?[ff{- `ۆiB*T(#@ \q4`ԠANK}�عs+S4Z& S�V ʲI>p?Vw˵Q>3$5bIzu'߆biuZ˗Olm@8ͥa?'ʕ+kKpp-[Õw먣 ,7 � � � � �d@G;Æ~88/{lFS@�@��"ͨ@�@�@�@�@�@�@�@�@�x8պukW_gä.-JYd2 P g> f̐q"|trE? $+FL ^`@s1ZjcKJ/ ؾS:tʔ>Pr5<kw!%tyuKGQ(Uҕ;?رûvڵ2u/۝m۷?^dgs.l|Bsk]+W.ΝBCyQ^"2ֶ>\7W0-NW_ Cr)Y2 ߐL |KZmޜG;wܢ-%x-hܶ],|@V :5kkZnSNkܸ\! z;:}ۥ G}sc Te%Y=A1 R5@a@iVi,?`$ Ohahj [ݓBmO#_B/m†жBvBm}ɷl=vB E2N+lm-67!+$fNŋ<$Tϟ?_\pA"rXr7 mBvj>(\)kc*&Y2i_anU$,@) � � � �đVawʟ v-ܮn[B~>ꨣ3(P@Ǻ"Exa+B_~*)@o;fAݚ4nY][*W.ED�@�@ r42 � � � � � � � � �Q.0tPURE=(ڌM^vRbȑҐ!gş@͚rիGs2q_|6/z=d]n/4(\gnJ>5l0nN61O,u$*%)tRHǍ.L:\饗NNF&L+8`{B6mrN߼yw~[lQNgY_iiV8ފ[`EboB2T>t_b '/`PP`Wv@/Cϴ4G+L`ϟ` ,#e=tU6YP=e ;6r{ˉΝ} @ X.,c Ÿܲc?+.H;vִi5w -˒_GjoC&!.?ᅲf,YD\ jaX67}sʼn~eclaNda\VB͊.]mez>Uʕ+{+@-+DC =χ =a6g.eۤ3ج @rn?ie -ҥjnPpUK(<.S^Oy۶+>l24O?߾[m9f8-d+`ߑ) v m=jElyf X Kw]?cL}/ZNxdjj}h@{߼ʌ_ϳ@G}ԅt!cK@-fgNCC�@�@�@�@�Q1Y|wBgٰvZ[cPBNqߌaY[w(p~Ne8PH]O~Kh|vL'RpaҮ/^_;&.mO~K*BZv;tc!Ufu_r F+"� �E |gڥe<@�@�@�@�@�@�@�@�@ .*V޽{k袋q1cfj)=4h\dj Ԩ߆'Pkt5',qϸl)Wוw5]\Z>Sp a]gVkW<X Q ~_|Q*5 7',!(W(=~[nNP;Nη_B!BZZC'K; xá~+oS$ βlV>"BK}b1^8A02j*/#yOO^<PB^ɋ…rarA$rAӲ6~`r-trpavHKʍu m[t˷c/e1i ЬYfBK-ua~[_R{Sݺu+ *Y}iO/{YdW+Vi]6n~[E˗ߨQ#/ٺ[Zb 2܊y z{>Tˮ1BmKXP}B!P`+WަzztI)hh]xbo{"M6]Z,˾Km{Km0жAmҊ%'m+|U(\srgǻ6-IkR{N8P],X+h X[ !P-@-aÆ޾ɓ'ꫯ9NJM@�@�@�@�@� ݁;O?]ovhJu 'Ȏ_U]=7ovLq(+t<]q0v ʕ+߸m>XbŊy[vn).ɆJ*y-ȃCp\V`?<BB{dUIkK:ժZ � � /� � � � � � � � �Dwީ1c讻СCq3=Mݻ!JѫW8ڤn,Pmgh4ys)}uklɝ/I wVn`iQ)`.Lxڠ^^un_ _e Rwsg^ _Kln6 V=yP+,xBv(N]K+xoCNKN*`EmGbVDߊB2P@ڼy󼰴POެЂ]зh].H+..ݛ4ݻޓn%@Xe-:-itOFob: [REl==z{{yN?tuE\嗪Uz{3.w+G%[Jlyh"ww}' l~׽CVYf:sԺukoS>?o8SVc~7o]U`!YkLa%JP͚58Bmžeg͊Y A6{}l`Æ ۡm =P(�͂7/RqҖO}r B KZk!Cw7~p?䓳jfLi&Т4lX`|GjҤ"vYAV'IC�@�@�@�@�A¥+o%6oGyʹO,`]vq+eřmߊm|r/$.-0B;VٚWB︝N;M61<s>T/~hg}ܱ~x{V-suIx8 � �1,#IG�@�@�@�@�@�@�@�@�"+ySw<Ub(`&՜z+L5j',=vI}& t Ʊ;RrO*a{عj'rҢOKnfΔ׏i)zUꫥBO[Γ+.zѡtC'Xbv [{jv?Ԯ];=dCm=[VL{ ,L [+oB2, ;al{k {!=s1{MesA[ލr4gL,\IE[*( ~W$o۹s~i ŋ{XPZ zИ1co/0,.zgxx,&ZQN."oK5k&MN:jܸ:t蠋/ 銆yu+D] ]lۗą/ۮ >h,5CaJzZl?dɶ3BKT+v_<T^6[oC(8-}`ۛ %= KV2etI'yeē JF"P+Ǭxj2'` nQBC 0 Ժ6i|ɭМt;wDp-,k6Z:F�@�@�@�@�0 lu?ϝ;Wg-UBj^zyZek_ngQ[kǩZւ 1 {뭷dX-;ɨoذa3go ڴϪTͲ-Def@�@ I,� � � � � � � � � I]bȑ#u 7xEd3]T>g{ʉd"*PKҝ'W'W7=f /f̐ʗI[+WD嘙ϩS Kv rEcfңzB?@EôlƯF \x'뚇$믿z} $aY.̂sg>[ RX1W4OCe X@GB!-v5XEֹFnw vjݺ=ڸQ.&ʂf \q.(WH] ;<+ a!,(x,5ϊ9N͊X0HpJnôiӼ�VAߖ/_>ᇄ,-$K V_|EM>] zoW Wm߂dbYhs 6`M ֚8qݎs=׭wQVd\Yլ�Tz<jZy_ְۢP`Y-ll"aVĊ,߆C5 eʕ+ Хm~gzեrr,,plٲ:ʻG}taqi?ڷ wI=UTio hB'j֔ ['P+YV>}\h /+Z@C�@�@�@�@�]`Νs,@k;~[0n Ѫvh'o{ݎ=X~zl2l}z嗽-iӦޱ?v&z?<˂s?{M(Yy$� �  � � � � � � � � �dP 6LM4￯:+=E*V\+ JVJ2 <X 8٬Y;+0 X!/>HлTZxGIvҦI.[瞓 <թ; 顇?�Tf-X@?BVފۇZQW}؂:٥ps0 .|lh#˭Z}/_ KԸq]޶m=+o]VtGrΖ-G^[ԿDL` +bé?I7\-߿|={^y!,ߒymڵz'5bYY۶m8}ٲ xiܹ7{7|Z nk׮H7 ѱTZtlٲN }/_fٺ+W[ȶ/01֦¾,l͆:u:MD/ 7Z;o6}'Mˑy/U6b^}⩈۪}-TH'"kW]=Z>5w<eʔj3l� � � � �D1qD6 ѲmlftuyfXHZ *xcmǎ^̙31W^%IUT;sQ dύw%g}q rmR9CkK\#ը!U,wT<0o � �'@Vp� � � � � � � � � 7n /PS˖-3gθszU+ S%дoj62 JըQz]kNДՋ3P7?3sb's5jdňo-g(&sN}4;օ[ oK?\ ͛~A?WނvMP!;9܊[P1ԼyFnj0A@ߧp = ѷEo l ۮY(H(\ˊWREUVUSP[3 |8y#\j⋮@L~]6xN";{³lϡC.}zoQH5+U>`<˖-7|o]Ť6ݷP] #u){]m x`F:(o]S]vy .Th1cD{m 5܎5kzα\ -pwKGRY)zjFZr2fϊ7/kHҭE#mJZnɓ'{  g"-$:E�@�@�@�@�c"Ǝq>S\Լys 2DmڴI'W-3ceir'BM4I~a;<]r%xvscz^s{xv K*Tro9_w@৅@�@�H7JWD�@�@�@�@�@�@�@�@�"(`'X'x+QGdTQUGd$JO6 fB]> GzW+[/ 0E3 ߻3oڵgxN7l ߔ>sBg%w|mۤ@A,fǎ^h�[L2^й.oC!G}W<ׯBO~h9 [: y|3#ao}C={Lwq]~ dH#F 壏>#G;Tݕ#gB}-s_xhmܸ۶AuUWy+W7Y,S#H@Μ97 ~k׮O\rFm6|6l?xTl\:uTn]-[G Ժ~imhĚ/RٲeiX3 j4[7N?=ncVZynDn%xtI&@�@�@�@�@�&LѣGkʛ7;f~da6-sVKw C]Ղ o73<O<Q;w(_|`gAW"rds]vY,Yeϓ7oc@] kԐl@�@� P � � � � � � � � @JM7ݤ{ǝrYX A>[lOi:NNjv4jT^}Ur, XaՂ \3EdtOZ@%-={K.O#իY0 cwϝ1m?V~ܹޥ�Y-#鮪kϞ=*UJЇ ., 33٭Ȇ V3jK˓'YWWH.m9o`R$}N>}sNu]ݻ`ُՀ]2ˍn{zՠA*-Z4HݫyO>ٳgyjaYtK팪UR+ 6%\ [?=O?髯Ҝ9sO wmm zaHGyF+&S/@V6`h,,y{LQ\&}!"4mZ!f͚ɂ*F;"f<ùXܺu! ?@ A � � � � ˖-SO=~{6mhر:묳8>%^SN9E6vmݹ4_C=ƍy';"͎ 7ki7?;7_$;6vWfu_7B�@�@� 9?� � � � � � � � � pk^gy ݻ/HG#bw>`,f֬`^\^s\Gp}S <tݒ- -yZjRl"?rƸ_ ʉ効Wp^9>*V,St1u\k#xқVۊvr_VO?u"˧vW{РAQJ.sd!{VBAX/7R<-+}v^!F.M֊[DXLK-، d,ߒaruݺu^PԸqԭ[7=^hi*M,XS 7_/,ŝ EIx�XN>l;Êsٺkha}7ǒ"er6tś' k 5j$ ^͛{m]evFڰ%/�ø( gr8i*nIrbiN i&M@- \ z۶m@�@�@�@�@ v<ǫD馛W"]wWPSs.M6M#G_O<{-X<yy,&O !ۢE;d.ʖ-r}$gƍ*e牕+~[ � � N:4sJ � �H��@�IDAT � � � � � � �ȗ/ /\^{WH4 7+x4x\A0ZNrsidNpr?g -++(SլY9]?P^c-FD$Xȕ|jN\x]u^xa֡o?C/@m>C ݗ/_ X@VŊSNޓvӷBxg"}B6m-Z3>iK>[Y |_C[Xa+zc( *U+K/nД)S4ѥ)SON#7"R@6mT.x՟%KI&zոq_O%@ vr̩5kzCϞ= _f=c 0` )m mVmڴQp$CHɋ%eEh H% @.]y\ȫ!9~¯Bt gjٱ 4@�@�@�@�@ wܡ{Ouo58lovl+c/nv{イ=z(W\rmh gݲ󸒷;%wϲ,6ҥ~QGI*U"]te L @�@�@ GD0  � � � � � � � � �)`턥믿>.g 6,.gJ@ժ/Ix9Rx� 1c{[$DqgH.Xre˹չۄi"vNҠ{6i'fz˥}7 q-Nkժ% $1nAvZosϹWz4z9rx˽zk˗{x W~a3[tic&OEna [f\ $_!֩SGfLVW\q; 9ZLB6իWkĈ{p. ,XkZxb}tYڦG!_ǻ\2Oýebu'z1C ѢEloY9-:lѥԮ];:&(NhQ,8#f#,ow.�h Z~@'h +Pkܥy:t� � � � �cWO%$͝;W:t L+%V.Y{18J PŊ5~}IpR=vYn-]r\�3ԥ4adygMUÆi � � je @�@�@�@�@�@�@�@�@�xa.mO>m^+(,Z T$<�W8:VI+WJe/z:;Nn:BĻ|GRҠA3HGIn&]p[z̪<)=tqGz{ݰa^xvg;*THݻwwEBwz;?¿9J&:3HP%JxyGֲe˼nɻn03}7vg[uvw{ŋnV;.x@jzHٳժU+ya,yWqI&^xTr;&MzۥC_R˖-z܋� X_W_}Յ9nD-/|^(U[fM`LkGdnI.M3x\8>sW.WD1IG}mp Si=5m7ln׹uV| @�@�@�@�R Y[oϼ S>!p۩}k13^xڴiΫZ{^N:INFCiȑG/pe4kNu!� � @#/� � � � � � � � �Ī@ڵueo[KڷOzx3'=rI*e9-pNL&}ױރFӔ%̛7} a'@̵z啒}9^VLI|gOرrW; u\ju|q׮]0a9Yq :u֮]tqIŊKO<\\rݻ}/^ .6(-F_8&L ]wskeL&R<y�}RbEhHsG+ `A=hѢnuc-_\Ç rYX F[֭O sըQTxq}\5#Xnq8P<Ӕ;w>]}%z @7OOcQm۶ǂpjm۶͛\| @�@�@�@�B֭;kuu~#l߾}\ƹa!͝;WWVŊT&ý߯IJ8=G!� � @  S� � � � � � � � �č.MczGfB3Rԧ4tߡ{LDU~[VR"/tRr#?~_~IV =i.[q]5wDX<4~\R׉'Z%Θ1C+VаaԤI/4/<�$`Eҭxѣf*Xeƍi9-,?H(X\q+SO=nݺ%}V۹`E2,Pˊ|=믿g5nX۷o{yk=4N+za?fϞn_|޾? s8[>/)B3gʖ`\=ZۿJ8ov-$!6m믿v&9&4`/ ֓@�@�@�@�@ Io~_c%OIkk_~n7Tr˷oAΜv{w/#� � @, Kӊ� � � � � � � � �Ĩ@btmɂVZsqɾi." *U zݱĿ,ϤsΑ;Oz9)[8_~E˗)IpIWR~*M_9^XtR۶-[A޽%W:TǎULx+zj1B~zħ"@t pںkk|zWн뮻.;YE{A baf˱kF7xzmq3=¥\p#Pˇ۷oPBrZPo֭[+{vN[!%s`3cTRP;vm.H.DZ$l4wt>28׭\$ @,# 8;k֬r'Ol.,k~ wV|f:B�@�@�@�@�NFf͚KT[sjڴs'h*j֬v[E=$u"ժ%͛dA[[K;E�@�@�}r@�@�@�@�@�@�@�@�@ … 15iX+H5G[ jjϝ-YTx'<3KڸZ׮8\, F�ZNV.fΔ ӈݻK/N>Y.4|?H<`@ƑZVоSNQ+;1~ƌ⋽⢩=@ :(2x͛'뾇lٲ%oڴ)jpXEK 3Ѹ|ۻw U^ݭqe4f^M;YX}fjDZ:F\ z-WIwis=:XYG >>ۋ]CrSO=+jaMB7KtFn^ Vjt|Z6qM-UZɵϯ jҤIu-P `h:K۶m͛Bi*.@�@�@�@�@ }ڵkΝ;k„ }4Bg}f͚9s:iݺzg[R<?A~9  � � Ӎ� � � � � � � � �Ę@ܹKf3fO ?H#F<">,PeF~{w=Ww2٬7dW>}߾}.t:@ͪ~AjRW/#GVM MM`ѢE*_ڸq8 Ha}n >\]vr))l_;.]kرJ[N5kFuٳ21Z7Bc^<2<sbE7 B=6<H={4dʊrw_Zjʇr;~iI<@~l98uTYX.Yv*{O-eнgM]u?PӧO (TPAj: Y, C7,€]F:x,^x}v^<^E䙚|> s1^0O@mGjر iҤ7no�}7ey|fސRp.]_~wmE]�`}KiֺQFy<HdՉ'tvyVOQfMY-XP!@ҴiAi[Zxqs֭[d}:W>@�@�@�@�@~С.7Tz4:6=*W\ԝPzu4}'.L˥ihŋKZ[,wL7;D�@�@�Ęg@�@�@�@�@�@�@�@�@� \F#l4d98W/*#(UJ*P@p+�Y[ٳsf䟭e˖_?$+ TpM]P2aBm7?u+_O>\ӧ~UVH".8%%Lrƌ}v/'tY~}SO=% jРXtzݻ]a6lWۊCwygzc]+Ln~Vٲuy+o}TrY;|Hիռys/,ߖ )??e͙=v9r/^|=`'O֭[{ ,HcO>jE p“O>-[$wT\?ӽ|P={1C#9,"q|KY<##˷XYZhpnݼXy?c:mqM7'Hu;]v^ =ܓYnMfzWvѲT,3 ʙ3nO>ڵk{+¶bEp6$?X IStR-_<*B-Pi  .`.]i]le_|E @-]Z<y^:A�@�@�@�@�P.Rgy& _ݗA]szV?#;)[l:ZZ53;܎9\Yȑp � � jE+!� � � � � � � � �q&{^83BՐr'\Y??3oZjsLU2e'Y \h+8m#,"{=_$޳q&XWk%K<�Onp ^P}<nL>]=ϞZ[f,>sWҥ@,   ׬YSVPKmSLIOWa0-;ձտao"l.5m*]{m[dc_?)_'W=^zn\4o<y晡q%˽ [>}xAN{lzoPuCa]zjzǦ\oL X nAdhnV+-_l=yӦMdoXe.[,gmԩ^ƍ7HLѣաC/|ǎ ?ϯ-[:eV(#12A >Ƕ5j}7n[duo85J*U[s5i" gm *xAt}wt-0@tG--R ԯs6-cJ*ɾ,H1@-4@�@�@�@�@ ?+9sf|jz~K לڱݺuSŊㄓi~9u;xΝ}#� � @n(d2@�@�@�@�@�@�@�@�@�'Pzu[oU۶mKߓх I7 =\(X&/,@N;M^89s=~>c۷os3rB'JU@0!][NSfrJҤI g@.Z̛7)%J 5XWN?O:$9<cǎƍuW-L>摖fx>+:kS$UkO?ʲe~Ԍg~]reĄ\>cXCBofnazwޑ}7ТS  b*S[Φ oqiu-%f}-[6Km13SF Yf!f&s==\-\Z.˷ 3GFo\&˷ǫnݺ[&Xn_x/_^Gyaĉv\۶m+kf,P2v-/^}ݘ;V ]1|>2VxgQ 2@s~LVj y(YↅLʕ@0~^][=Ty*|oA|wfֺufRm?jqVE�@�@�@�@�]|Au=L~ޚ}~Emoz{g8{ժU믇s4� � �Q"%d � � � � � � � � �$b#?θo|rIK0ʕ 26Ӯsg}=]2[VI;wo߮w&pS6)UZH=RY"Y^*YJ$«"DFd)JEiQ&{~iifyf晙?39=9wխ[W_} :9~0w}nݺ9w}ϟ5kָ8yTZ)/x衇0k,n袋кukiiSqy#X^裏Ƽy]|Ÿ]iӦn)04:7|cƌqp0رcgƏ[jCM0\~g4h{Ӷ Ŵ*V fN[J(N+h8^\~ǢqmK8#=N>dwGW^ybp7vXN|``bA~->S'SD}~ӦM~ZxآE|2]^L/_⩧‚ puɅug2wJabӦvyh v)~5#v^ky5TO!R{ lX<sxnLm5u磏>¢Ep1Ǹ6|W9~x?(pB\r%ҥO2ִנY')AǺ+^_ֳ/ ǭtcwr;�f }`*#rϬe=JXݐ!C]{t瞰}ַʕz>֭[9 7j P^ViN{Ѹ馛_8wޮy:\xo\s5+Z-s\PO'lCy-JtTq܏TSYw:뷩S⬳Ί71b=>tP'Bqpnqwc%@rsu"s4s9UVd;N<Dq.x(wXx1Ν뮛L+C14LѮcY/p.[ouchc=f' ز|$=4ٶ w'ԆFjl`/}qq2e0p@ggϞ.ݳ>;wvm*9ѣ$SE6~ xslFg򞟀пG6{VȹƝqNxĈ&dUxtC"rޓr" " " " " " " " " "P},Y O,a#wK zUгXDz}N ~t}h;~zߕ8ꨣS '˦;#~o1D@D@D@D@D@r D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@$`ƼJ*%ZDx0aEʗ5k"MGd6|hV<#,x&"Zng"=)͞=O<3ZUPmӓ}va.܇~s}&2hD3ΙWZ5L8;餓rX<gF1 ۶_M&?f3=/x]vL￝sOό{&5o3?wmye'=3ʻe˖tlZy5kz~%). CU899{{a^&x=n-LL]&>+f46B?7Cܠ&?I:s¸f 7?FwԨQ{̨o{I*U=n]TI՜zMx-i'CO ARX!R>g4>N8D\8 ezf}=;΅1!.~xKf:Gk/cM {fh;=ϟo|UGaH"ճؔKO0! W^=>w#g]z `˄~]N;oH}3|鵱aÆov_`?>82DI;Z{˕:iڵLaqGz#ǺJf3QY׍3Vׇz~SK{hO<k6R].YGVvot}�7sO�7>ݣ>*U9rtRĿ_qǣC?&$c j׮X3fpeF 6CRYHcfV㋂OY$~_+p>8fbQǼp|9_[AQks{lժU˻<ǖ3 ֙t&xn0n8?5gon(}4k3.ߌ�z+V 6~ xs}z8C{<:t΋'@f{Wu|yfla[Wʜ ۔%E@wʊӤL@F໨|g6.{'|$gYўŒX{)ܾX)%_3zhov&Nho ;?%?r" " " " " [>8%Qy4 r" " " " " " " " " " " " " " " " " D)xޟ^x9l zUxDt?"[2{{ۙFŤʼz X?b 4^I#[nu)@ԢP(@Cng}؀(fhӧOw~4H;惂Y?E#ܸq;c\8_P+{o'AO̙3n_D(Nct9MgX jgV?)JB3/rE8?xO?;W4tpxG9g ,v`c4b 'ֿ3Egؗ N&ts|fly)ugSS1 e>1߾ɓŠUGKvBi_xbu/G?:2hiSlwxzq.-?mi;TP}?y_p<)òֻ><?O_o$wQG4ۈ믿:thF̋/]t ro~#QP&Ș*rb :Eoo Vx_LQ'"b)iHi?E§</"k߾\׼N9{7Lo-W$Ղ3E3_D?i}'Ǭ̙4>G^d NF%k{ Qdo(`͟' Q|ũ}ꫯw9`,֭̃*(V/_<>ȥwL~$`kM3@<c7>:3 ]w'(t4#\f:F̀dA&@q?>-e~IAϲ zKcyx½n_AĒ'Yvλ$/U睁HS;g6lHQ VD@D@D@D@K@Z,a/)ʉ@ !zA~3_~eOee}=,_>%{&zf-*U/ŒG;֌ b<0tA5kr GbΜ9&.ިW^G 3 3W_}Ǐ}t+ժUՄ Tpfͭ;t]5ܣG,Y>l ~ٶmL{pgD~X;>̃ N_} ^z9/?<p(@MTH[hغx}Z. wp0Q-:(3LTj>o|O .޳D߭SO=ߛn 7x#;@>1>#8^x& ֺ{gϞ}ܰ[͛RdƮ5 x/pޒoF7]]D}b!կ_߭cTn{2eʸm ޹D ծ][f[K{KZfۮQf@&cx6!N?D~ iӦua}xVD;l{-Z±ׯ_u P ;6>o'uv(TďT~ѯ M@,M6amPqi \`g$>t#8L۫W $mLf-Q%@A߈܁ѓ_/_E=jS<9|G~p.Hܦ[b[ӆuff&2vnMs~ԨQ0iw?s|^q衇yέr_tc"ccҤI0rL^$ֽcL>gxtD9ֻ 9P"3L>$:0l#BۃBʗ NPAbF{oI= 0t_Aq3=~s',꧙睁ȵ!" " " " "  %)@ ,_{,bACh7AjԿ7/"P4Ŵb)E#4>z`X: ae̙Xx;Fct~ v)S0oG<JaԌ=\\|Xt)ڷo?\ F>q=T˘G m�l ;^&)NSԤ>uńO?Q<X)x;/c44K1:`A<XVc\MY4 ; ٯ7ybZ+"Lt:d8KR_{ЩSRѦ" }T>صRfn`:h p NHCh~ci߱T$YO;.Ǣm/8#G1N:_*XGt>9QY^ۛ7ov-X�rH>p]vetcv9>,qf6 jهMSl1Z(oՏf"]Oo]E},;XrGj#\GӦMݦߞ#]G~Xb<ڵ{B~(^{*n5j࣏>U:?͇ۉ/6`{4XD SLpi&cUV2sqpشmcG~Ȃ3LaP|I51pqǁBЯ$z*yȑnsoo ze'NGQ E@Z§1'�bZ7كO&AgĜKV1zV0bH/Y$-%~H,ϲ= +LCq{^n_SOUVi&yg ~�7Kr" " " " " M@Z}~U:xC_|^z)OKxyBIS? =M A-Gp"\o/;(.uV'8b 3i9F?` ulٲwerA7)O8ÛD׮]L0x`'*Ѱaèl۶ p.`y}. H#r4R!%PN=&.'BТZ~`r̘1c1ݻcܸqp1{74ʕ+#8"{;v3HKɓ'լYӵPH)ņ܄ a_Lʚv jL &O02)+~=V>N5)y)ޓ &%#0\o݄L-C])R=SiH}s9o6>\tEHݟ~Wh^p㌴&r>˕+ RN_G^}Uק+Lޒo N?Ym kryuץt,-W7oKxXidv:7^:ۤ=wh(Lj>JhDs|T(<*G1XYCӧZQ\߫W/7G sCv" {-/b,q&kҥ3x=;o{/¶ 4@F\(Ch3EFڱty{8Fso;wvsGǯLv1R?I(g#xJNRBE AbڴDh)WLY߹DF5ۋҥKG" " " " " " " " " "P?|v*,+ڳd{^n_hWO?~1g4wqa\^D@D@D@D@D@d)" " " " " " " " " " " " " " " " " "h;}h1D؛v!t;Ȃv {jNJ,ԯWo{c9]#_5o`[3f@2e?ܣqX]jP|y'3s@0^7-[iu88.xM7TMc {& 3ە飏>rF~넻nYڻ[4Ъ,_0#! ER6l@Ŋq?^[G(\5jԨ]yEs4%6ӡW=o/:t  <tuqk-}sm furY0cyƁͦ\P?_?`jGaG>T?~ P�/KjEk"CW^yʼnil{ۿy|YxݟpÔE(hCY vQL6 vӵiƭcat:ZX'E;uBY'ϝ;7_AyHFO?~6׬kxNj_"~K.bobW]"[}p?LZ~k֬ n]2KusPI&\%QjԩIZ!qʱAtQPpw4hHVdb;'K<kmIʚדNʛ;0(ҵ_dW\q';<}cNm۶dp g}0f<n>Tۓ9~}]vRJZtAy;+I"mxI0Gao&\_P˪9JP+exC:CIcyYX3}p¥NAխ[~/9+쿫AƵj*ʳ@V(VE@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@rwߍkׂFsə 0?2\ On,1÷c=LD>s'Ty䑀!Mme[`C~N +Gya.R?+Vp.Uz*N<Dq.=iG5r~@D8e]qhڴ)v}wA"at e 6?c*Tpqn?~<N=T<cٳ.U(ETEa?"k)GץK`h׮x w?[o(Q]O>$~';rʹ}#FpBu7"/ ka_Q<|Aw_.R'ߺL}y 0`@ntFC0A =Y>VW]t5D}`OiԢᅬ,4ؼq$Ol:eQpkԻ v^rpQ,/S|W{ϣqo߱[~5XbDO2rh;!ho gQ|d>lWmpu+9듵߿a}SO9 -Z伇q}b94@aQ Pہ- ? >֭srItdK-s?|6~.] :tT~5m{\OgKZ(L_`űd/&?_µɌ<~hl);&|׉OȩrOW9QP'��@�IDATB'Qm>8NZ3Aqp4};?/|L'olk84iR@:y)�' =HsXcm]~_39}/Lts>krE?'_cAxt|LW9c3!_qD!1!')#м9ln8egeĬGϟq|[4lN:б֮gmL>}Wrv{?$w1zga.{3>NAт/.'|ޣ@Gv.mٲC AÆ cz&΂sn R*@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@&`^J"  y睞 �xfxo: ϫ[g{L$ūZKtM{4ѿ Yxf\S~}W]W/1cxq[Hތ^Ҕw1x}g"<g23p.~3..5jx&XCfM]ӌw=gW_6ό^<2_7f̘u3 cǎ.mڴ>@i>sy`83}ش4} s:D+fBfl]/'OdZj au]8A>蠃<7q| %w'{=P xf39=kGmO:[j>4w1Q=woXE}rY~=ϐȥUv=xVǥ/Qyvc[dށP#\Oy`[{x&JӲ&s=^=sqpM7?t̰gBv_ҌĔ! <�gb}nѻ<M<hjz x&R5a"}D&nI(j׮(׼ys<(t}0وJ=5˾uunOAӌz&D~f=Orja޽rH5k|~[y7PwLLDP6X&u} /әKK~7>XiH$XTl7Mh#L¹l uYޚ5kH\k˔)]tE^q~\O9邏N*[s yDܑG1Df}&q.sO?/h4EQώ;8v͞=; 9sf<άY;zC]vslʕ+L:߾~Ԇr˜>#꫽#FϨU:48B/@{PBZn^?W?~w,ۜdd!zw]ZR ŗ/{YIeZr֛|_un"n`݉=L=-[@>E@rޗӪB@ =?gzߠ$3#/)Y,|`~spsW;)7|~wt=q< Ep$OD@D@D@D@D ̛e|P{vb�ȉ$@`0`�̈gDD C۶m:u'�.48&gyU֗OOof+XK.,ҿ́C~:5\f aDoD8,K(ĭ]f{gȑ�/^ 34 3VpLD{#Gl޼&i?Į 3 P&x[ǒ6h'+梉礓# +2Օ+W„m`lhҤ mf <f ̞}U`=a(DŊa#_V\9x*`(ࢋ -k/h,;4tiWl YJV SPtĐ`’`m^{Cz6m8dVXpec[lٸrXhe\=t6\qu/].g_D;0zhato?dq̝;1-l^ oc76oaw¥:Ɉ~&Fw->xp7S%L&R׭[9s+… ]J*zk:ތH„/m|gbӧ G^~y?")E;K㋿Cussxșl.v\~GѮ1n[6=;t y �8|+l"%8p }QN4B)iwpeK1@8UGJۇQ<y\[o7�z�3f4�o>J$1'"" O@Kf)RE@D@D@D@D@D@D k,Z{{/W,+gas9CNA<y{R.?XgR34HM� 'ptbÏc"~ 0/>0A-{ĬsdRZr&$ Yyڔ &@ԬYL�`rf}eBEw܁q99TL_Z nmc7x/|8ꨣԿV60;`ʔ",Eի~'GCmx0{ .[ze KQ"aw_qyL.(=Iguۦd:t y2M&LE>d?TCEŌi@F{|SO=TDƊŋ?\qfvTP!)mGEu=p/3oϔƂ9'=uԘG)=)6l@:up'瞋-~ P^g_q8@A2=[V8֢fE3E/"aϻg/LiȐ!6e\ipgoasiH&$'dv酻gWKU)7 �M?\J#Gt}U'j6Dq#/*#D@//Y|ϽJ." " " " " "  w.v#FDH&iq;fSi$ :1lٲ_;sV<" " " " "JzSH$z7t&M؋6;^|1O[tE)2,\[+Wf  ub!2z)g,21M*<1ŋa$!U?oEC;rw g.�]bZq+d�ӀV1ի/wA^@߾}M.}+!]v% ҭ=UZg:(L2Q&{ aÆyIbFh֡QK,ӧsBeˆso֑|Ӡx%\g}4*FTs'b-UXq|:QF?0hРBHsEu+&Ǵ+|i"nڵ`<+WN$xNiҤ +g0`LYJ*SV/" /g|,KΟ?lj,7o7ߌ:_5^6B_ +˅'@cqL=w\wc/?!qժĥXD -#-۶m#YF`)u۶mҔV" " " " " " " " "Pr)x;|6f/_>cA;fSI$N ;wvS;VsxD@D@D@D@D Kd/bM,9Yʦ@>|8h|q͚59Hdy睘eKQyF`<`ذ_`ڴiْ}3낂M n';QI 0E&0p@vm=pbZ<�Og\Ȣ'`ENRVhfϞ:ub}'pw5QcZs\幐L3 ?̚^3f� zf"/_F�9\xᅠAt֭pFD"Y޽qEev:u*}QS| (UW]ƍg@s# 8f &8bt7EȊ+fE!UeiR&~ l(dۼ+"Doy'1eʔ׫W/P8f__Z8 ׇ8Sr餝]i|>s<x饗PR%\wu^Nട;{cu50vt3c/aԭ[|M#;b_EG?W_M_JjDɠ1D);ଳ`0*>gY%Kʷ@N9u:U_5ڷoe_tfL8#񝂿}#4x` CuE|*$D`_P>x)Vq=*@R@DR0*؁@v@3gN;la6͈-Ptl) &{̮l�[>ڊ^!C�.?ݟMybZK�M)\qԢڵkcΜ98Vؼh Oπ=]LfmCo&N^ z:~ogdSR :vfv҈gƍ%뮻yV0枫g<)Yf}:u%\ֱ\bs\ߒn~q'`|27o>~?3"QׯɄ `l�LaqaOSygb&c4H]q7,/X hр ޺ukӭK(QdMY|I믶_>5G3):ׯn$Ĩ(b%piiɉ@9*uџz %ed]wqFe˖ŕw{`qs+,ˉ_z_{\D@D@D@D@D@D@RM`ڵڵ+{=r-NPtҩN6+/NL>=zȇ%=9fJxPPn]gKY:hՊKU.Cj�*"'P&x&@ժѳ3w.L'M _V�L;,5(֢!&Yi%J&& ¤;u`sbZ.8P`„ x嗝@� xR(Pl+B HFid);IL'ox1ɔX\ۚc=N;-'~+uK@[rxBַo_pue9C ZqBѐݻ~. FLQT)iE95w 6̉j=sx衇p3@q'HhrH㋤`HkK!/m^s˼y`_Ν;m_ЅeS8&P1&N4zSܡD D 8'ݤ 09s΋ٳgw&E޺ذ&BGrS~g '" " " " " " " " " ) {㭷O?mV߀_| BǎSZvEY){.s:Sʭ@2 HfdKD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@Avڸ݇0[i){ڵ><3jVr@yZ͙yd#L͛?$1͜vuW?3s29WcCLpF�~0M޻HܪU0Et‰瞸K/u(pM7}M\}xWnݺQ@XnĔ9԰6 󞦘YgbZUZ#G}焇6mڔ;'-%Yl6mɓ'wyW>SxC{u<W\[niӦ k/t#lor" )%|F /+Wvw ل̙3qgi]#YkKlg*U(O(#Aa[h~ȹ 6tmĉc.wҥZPk۶mi+~E@D@D@D@D@D@D@D@D@+>N8gy&4i>3M㞾}zQäI$[HP+.\," " " " " " " " " " " " " " " " " ". 5k0lذt%tz}|iKS @Ŋ0c<q^ jEkpG0䧡/kŒ&0KNJv슯 kU ԜW.5 8V?sm |W袋`g|kժݻg… (r4KcÇGΝq㠃B޽qF'{yҥ-J.]NWT(n_?_~%իge ?ޫgE+9V)F#]}ꩧPB݁jժ> _H`+>-P@j׮턲)?(rǺBwTg6l.ذ!Ss}x?vٗq*?_ jYU3?N;턶mM>ё!ScwNUWD@D@D@D@D@D@D@D@D@g9fͲosB˖-Ѹqc?-[믿޽w3.wNPʹ@R -Td" " " " " " " " " " " " " " " " " " "k=hiC9E̝{VHa\m^`A-Gd[7f4gX6(_Pwć�S,WL?ԌO}A&YL`Of%0 4p7ߌ ӧOԩS뮻+(RӰaCs1hԨ:(̬(.4`h"|>MibV6mn'p֭ r ~B["iT坑&"2g'34h!ʴsIqWwqw},Rp'9i r0~>mqzӦM/{ wq|QlUHa}cڴinYd;8�͛7wclͯZᓘƢ=nZZnTOZt|Rb޶~E lka+VTq~ڵk{XsP$LP@@]v٥Pq(C{=?qK/yOƓY-�߽x0bස|_G(SLAD@D@D@D@DxOoD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D 3 r-x'd{隣n][\w]%`$ b2[IP+=rrAV@LX]zU*EC|iqAfJ3τ}y-X�<h޲EWJMrFP+bRpǻO>�O_|&Mi(~}zpGv8;@ (\GQ.frٳewO^;cѻwo] PC~ "&ߢ_~-ǏUW]TȎׯw<~l&QP•r!9B1- 걏CO>~YaJ%Mx/|al%<(!@y3ロ[bhYf^a7]J@ժ9 j%<[Gv6\Nw߼0VI(~z @tx&lO۲eKP\s]t)+Wo3s&zJ[D@D@D@D@D@D@D@D@D }4h`^ҥK1|ph۶-vN;M理tĝ… 1f ĉ'^z ;vtY *Y${níފp@v$L7o^ol^wN=5'jժHG/ܹAݟ@�Ekho} bl4`M_ۑ@^�E(]zړzֽAZ@nO+Z 4m[4skt.\r+ yv/| ~tݼy 00cUZ~ {aYۭ;w $Qlc)ReX>E1WbEԩSljf]y啠A lK@[ry*6PVksA6mpo?}:Eeʔ)\YBZ!C.5dReZK (Ņst?/W^ آF/GIQ%@19_T֥E7ʕ+ƍDuq< j`^{<袋Ҟ#`w_VH=>W?J}iiLtĉ1 jYSONb1T8C0h u]xW3sEٲeѾ}{t ZrS�+0aB9sc .ޝ5kF" " " " " "`$@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D ׯ)3G~w3 \uLA&q d ywu}j{H;HE<xm`=h{ɖ֎hH`(XL@xM"@P,ΆqK\Æ cQ~gvb[sMuayGFWX >?ʗ\!믿w}ŦP.\k׺b@/8)QnݜD-ϚNRK *r}ך+WNm2,vCų>AznDM;n͚5Ŏu q~퇎;tR'KPc<>& )2GQPk3�O!@q,}Q]9.pU}׍Zloىr\\=0 sYs/ÇE'9ޔ+|.[q7,3U jQttryN?t۶m+PwJ\\qr" " " " " " " " " "P~y@_vMguxyhӦ[=ТnHO@?ƤI[oaѢE^TС O<<;.'\4V +  *U wut y䑉GA!)E>'t=2A')Y1= l `aE&aig|9ж-P^xvrň{-Am6-�fQMitR^TDY$K#6�[ }S$KN,',41i4zӀ8Ŷ1T~||8蠃L@Ai~7,[ ?["l~zOKccEm͈Y`&THr81bN 6 >(8-vjc\t6m¸q0zhg,CqeK"B& jeƕs%xl:½s\F5d<w[Qp]Z57`\{WfN96�ų(/>9.p4h .�Gq*1�B6sH[^x'|UW-M%MqaժǴWIDݳߗV0WL:'|r/(jǾjqL5K/" " " " " " " " "<|own{o&n{ꅪq)Z5kޅL^7Ԍ3G>~ jծ]۷Gvpk^^"* P矏Ao߾xR\Z_ۇXsJKH sfw4iq(˥og h(!Eh}Ŋtg"֤:9=rEC``4/&T)Er%PF޶~(YP48L>݉qUT) E#r n09r"PX]W m\nVv)q@2ʕsbӐU�\Pkg4ˣ-1? @>}ꫯbԨQ8QB'2D:-l^6^ymN4fz7gq&NVZmS￱>+ILqn Ŕ| E|y  }6kQS.Qk[\ .]ꄴ|A]85lI&nmc Cਣ` ']۶mw8G"W(!_Q9Oys`|Qc. (`ɾ`AZ6gcN#8L%Pre-yzm= Gq 裏F -Z+{&4<?+'" " " " "  AdPT" " " " " " " " " " " " " " " " " " )%@Lsڶm>}S9֞{RxˀSaFREҥaHfvLr*tp;Ӟ=x)`g5[xY?"ST2M7ff(?lԨr?]lV~4qA%4 ?" k Qp</$9 sͅS_(Lm Q4XK ֬Yo5ڬ\N&\h wTФ/F|[Mr"J@[(Ooq)SBLq駟9hnV)<&R֭%JdfAZڄ>SO<<�=\TXHrCz%4<ZbBT^Ǐ't(F>/+/岛�"cnslq/N9B,X =]y5_NPrm7<yr"lZʄ"lʌ/jBa˝~:^{5 2$bMG׉4_>NK9% " " " " " " " " "5J*儞(t]wa'`읕Zغ}?T^݉k]Zjw>Zj(Yd֔7Y{ ,1w\P@k̙p|#tbdݺusLH:6mN0[1eʔǟq/EO> x1+ә*F2ׄs}s Gp{ Bg77n\v"IMG&\0�|=#"@di߾vƞMT.h7XdžMFi윆ι<_~O!`Fށm 8p薿{~.~'6mڄ7bÆ n uaڵnm.Ghmؑ/묡 *|!6P@~x-ʉ@2 ~K&܈K[nt"}q _&Z'7F P (uLwB;{l)ijGuOSN9zB֭3BL$t|WkvKlݺBoŻDWP"ȕ/_ ^19_8`T.5x~86`_?Fn믿  ys|)zw 86r\rOrs L.9qX6E/vnŭX^F0mZ&LyEkFKaFLSO&V& j 4ȍEjԨ6as0̰< j%"H'>#Q9o3c).ng8aÆ87Kq;̽r}$ą)9~6:Y?c`^p+[+79su]ʳ@V4eYD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@+{Mof+_Pbop 0#@0C�Zf֌= /ˁ;F@$ S*hh8i,8:YU5<L<5"rTRdIPTKAkш/id}…&3`Hq- Vp6 4$-4 hk..EA.lCbfd/͛7 oS< s;-aygxCB|-ZN2;;2(GyOݺuԩScԨQXdJ:uPzujJ0�*ӥ T4ҙ.׋-ܹsb5kR)q '@m;bL.rŃ� _p/_s{ٲe9sf@5Xז/K-L{)?GO%Jdbq@Vkp\mXp6Bϭ?>؀g'Ʊ/!4.O=8 0FS^.0rH'4~mR,mY]e>xZ{IP+\:g]Xl#GCWuyhْ8�k;g K͛7ϭ_{5> igs>kOkϢ�wI/_ sn:>  kkڮlNS" " " " " V,GD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D #4i}hժUk`oƍ x#V2a}[g= X8`ׁmDAr�?q?? Iqu3xJ 3=b 9зof'80�&R�_v&Vs(>(jwE؟+q sHE ?w.*UT5 p8?0=Ǭsٶm[`O#,Gfo,�xnh?Gܦ`2__XrMr"P 7o>Pɍ8իC> E??* #%Z?;�l5=$]~3uź4kD{^z`P6ZŴIguj jԨSBxpSS o_T*5a_=<9VuCg p/mq_o cq +n  qL8F. /=5 aY仨sʶFqP:aY>nΒL+YME<A.D3>O6m0qĨZG.kUcH2)S+gM7#6\B1"tR|g9*sPb|Y9|v͵?{>\z|,EѬM:,>gsLOND@D@D@D@D@2ij<D$@z/s=7L>@4Lξ4fs@ǵ}(ŏ¹ �KvH#Dq$D(r@݇+Z/ L kwrfe!6of&yE8kP/A4>_rex΅ƯiX5!ooilFKX>hApb[c4.u�(6FC4f@,-"P8P B뷭[wg[} hlءSVkF�5*`{F(vZ'EDܦ _k.#B[`SxB\\s9:8l矓˶r+'>~Dc1/5s= -WiW)̚u>jԘdT1CcFc 4J4^Hpa#OV<gqСNo&*ScZw *XT$Ъ0lOGFfH2ծ];t3 }2{NZߤH{7T+&MLSPpiРAx8W~lڴ  kSO6Q΅ir/|\_Js눙ʂ,l'PNtÙg>~4;hԗƮh;5o\~9ЫpɰB}68 `rt9_\6V/�=/x| {hZj&H0? C֬kOh2�2< IY#5a"JaU\)8|`Р~+z^*pȑѴi"1(ה'@A}'N""{Jg6SO'3eU QG3f�ݺg}ٲeq-J/3V~c jJM CE ؼ#0nлwabʭ[vzqy;Ν.YzhzL#ɉ@=>'pY\%EqÇǀ0f̘D+ 9SDD@D@D@EW3��@�IDATD@D@D@D@D@D@D@D@D@D@D@D@D@D@D;tR92+˼N4f`4O%+ Lp�u+`jQhF|'4HzaO?/18+u̙3U^sM}q}M{AliCW^ͯ|@ HUW%;f'" G۸1d jU\9s2@1"yk_L<t?nGZ TD J:t�^x!eOl)nO81l)z`D@D@D@D@D@D@D@D@D@D S |м9p%T.ʗd#gMybNCE=0p@+2e,sm7੧c e/;ųPf^mB`OqcR%onb )?ŕ@F0}bW|U|%$6W'Ȑ::'WiӢQH3{]q@v(S +ʭ@f(h1r܈@nh0os\(ͽދ>�F>u2@R^{ʨӒ/�>KN]v4i;JN;jɉ@u=lSGD@D@D@D@D@D VԊd}bڵx3*_d&-[DÀ=a%VD+n"썡Z/:_;,O 7>`zr"�V^7bP}ڏΝ6m,ٞnP!Ks� >?pfS=45^T"H@ŊJ‰Xf *W," " E@s,[sAYochܸqxeu}aū*mhRxG~cOe|ʇ_D@D@D@D@D@D@D@D@D@2ž=3fϐ)" " " " " "  VLD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@Dh ~&6slR3X扢ęg2e�B_2l/<?6.h W䉒"fD-qysS1)r󡇀%,Ə3@ >i�h,(j20$J DW8?(W.P_d_Ȕ)SЩS'\pӧOᥧѪUIe/p>%zRk֬ .oSچ޻RwTAA؎*XbEQ)lX�Q@XPAދo 30}Lʳ+3ޫdfNIV!P+ 7@�@�@�@�@ nh5lܹHs E�@�@�bZ@~x � � � � � � � � n2rȨhz-ZTz5qjt6~;nA ԪY3N\MV屢.7~IzUtdwg# )RDח-e'OGw,(Bwz4ϛ(*hc kֵ  Q f޺m!�عsݫ2ed0E�@N?wҫm۶_W9bl5r?[#d4(p KfEbﲯO]vqZKSzxeG,� � � � �dsrÆICH3gJudsh@�@�@ j@�@�@�@�@�@�@�@�@�)pK ի([(6ZJzl<-[JwῬZ-#lA H\J6a?DIit髯3L/H@-=3ΐn5C1B:|]M螅y\X~}f 2矗J:v YT�D@ҶmQu:� `sVJH]@�xl>=ܣZ;wָq+W;q+Ԋ$.:duJoM -PkѢEZl'-<fbZ>/M � � � � }_?s$;RϞRNVYO֋ � � @4 ^4?z@�@�@�@�@�@�@�@�@@}աC4tШصkvء˧<#-+u*@Uc8$iݺ!P+ڴIzYV-+E!Z3gJlA #`mܸ1#Eݾ#}d5|(8{>m")Y F4-#kI/,u.Y@਀-u\C�2"*SLFc_@� 4l(͟/ق~O?թ^xAG֨Q'Oh@@(xb.wO',>ʿM6uY%'$XV 7C~@� � � � �"0wԨ4ls_H+r�w!� � �D�ZQy@�@�@�@�@�@�@�@�@�[4O>.Yt6zjAPBc% ><݇c6̞=ڵR͚G5[L|�-˘{1uk?]wy.%N" ~ƍ#'&]wE߸^{M?=vN[3=E�%@Vij.]:6Ȩ@�(@-(l4e5o\m۶U ڵkZPXyӥߖ EkԉQ뮓o&O>-ޯʕK\r ZD` � � � �ġC6{ϗzrC � � �đ�Zq`3T@�@�@�@�@�@�@�@�@ VNΝ[ !YcyK@9LᇥWZ0k ʼn.:^=ۻ-ؿեd6˅[֯^U+[F1,PpaI&6޽Ґ!K%KF_7 vԳwVt^GsI;J>JA�H*Pm[mB�+qFHIɓ' @lHi Wխ^ZO?j׮w3g￯ *DⷋvIw%]stRJRґ#)H\ ]t=܎gF-7Ȟ#.L~3OTFz3gNw۝ � � � � �ayЦMyF1CV-L  � � @ 4� � � � � � � � �  "nU{W#Fpa"ʐa ⁥Jp< qtuQCB"6m:W ԲO[X9RRhyDZB>R߆B6m8공N{ BekWh ct/?tK;z_}%Իw!�)P?x8;@ \{iK1 �dͭyf-[LÆ Sf\S% 4H[vJ .,͙#~&j|z~[NRIs PX۔)ˋ+ЦMȑC}s͚㱶 7-!� � � � &կ?_]wIv� � �  3D�@�@�@�@�@�@�@�@�b^oW3x5kT|L1W.i8i2Ue_lh۷ǯlY`lL\H/v"U,ժ%=\ܢEƊ){ ڹs+=&bE^[r馛޾dFK+ ? L{ ^B�bExqi۶X @�p XVKx �d@ƱuAM>GޣSO=UժUcnJ*0a֭[#Fxe@s9iC:idU+S~;5Ŋ ?-__Dv@Y � � � �,ydsԣ'dzcG�@�@�S@|5 � � � � � � � � s 9r6ۧ"^:ӁZ6$&^xA>\$J"P?/]*UdI-}ԯԦdSGu7H6~[~vt<*t:Kn[+H<A}Ǐ<2rԧOd/UJҍ7JGdhG y c{N~"�H%JȅJP=Ȩ�Zc@ 4VpkWhw{ձcGp 4ydnZ_~6nܨzKڵS޼y= 9)g*+,(իT :tƌIe8^gN~F_V,P' NK � � � �ġ;O~E+g=!CF�@�@�P*ocC@�@�@�@�@�@�@�@�@�ѣ _j*V]wԹ?bݺ,UapJz%e!Me~i飏?l1…5YX։'C}~QھƇ6r玦Xԩ>c۷/fcR 13(h{O<_>ᅲ@0{־}0j@ 6,Pʶm|E�2"@VFgK]ɜ9k#5[TlYg_KɎ?C>'Opt6 Я%ߐQ&R\V-е4o4wnk.27_MS,U2RbKnwr � � � � �AG;GqEvo4Լy:@�@�@� P+.:� � � � � � � � � @Bt=͛S5[r*Uű,X+EET)5@KՃRuP+| I\>ZT ֕Jzei&Y31,<kN3+zIKԇʂ$СCڵK~ijjKzMGG)=7z>4h !  z)>vF@ ŋ$P+b�,褌OA�V %G?9]T0 Zv+r'J|T>:FI'%߆qjVB!`n5jHoڣN{=Sݢj:t( � � � �ļU繱~!C y3@@�@�@�TJ;@�@�@�@�@�@�@�@�@�MK*P]_b*W.,Y B(Pd n*9"-_.dLÇ>DCm>7 rk}{ߤnݤߗϗv-,4BneRrʹzWiѭaZKsWv3H[KgĭJ]H__ s4C{ �,P>?�dT`Æ *]tFc@�<*}}*a3gTƍoVsU޽BH:W.r&yERoK<q=(~.L"P' � � � �DĉRz1M'pׯb� � � �YH-lY@�@�@�@�@�@�@�@�@�.B {ȑ#yFn߾]v F5а4`ԯ_-Ș,P o,VLڶMZFڿ_^=]VSsS'Y5kJKQCy]$;֭^_nLBoZ@ \Jܴi\8Kb]_4]=ry}Qtu\"_C $,DW׮RI 1I?�dD`߾}ڱcʔ)@ D+͚ʃ\6.y*Y~}GjҤI[h&h{7 t,w_еm5s'{^;Y%:t(ڸ/ � � � �DÒ++MSV#G1]B�@�@��Z=@�@�@�@�@�@�@�@�@� C5hР/_^J}HmH\#Org6 b%NT8 }RRrRR۶K/C.TzU ݺ^/˅?h[G@L u?2pTԱc">tTԢE ꘡'M(wb2"0ytԳgFb_@ >,9֭9~F�ذaw0Z7H@ MC`3~mwa5i:u87DQ#PtRIܸdZ)PtҘ1l5۪Q,ڸqFX;۽(VrC�@�@�@�@ & ]$!s.Ժu3B�@�@�ȸ�Z7@�@�@�@�@�@�@�@�@�(XQFi˖-@Vʕ֧97/} (Ҳe-BXl+_eZ%KJ0sIy9K+VH|"=dϑ "E>5 ->|<XN=w삦Q9(r KwIGK[XY1[֞=8]W`0lڐ �%`j% p�ZNJp^ `/TH93{Zo5k몫Jmw#;He.0�jD t*}iSDu+:{'} P+4� � � � @L |dȳfI6keڿZlW@�@�@� P+� � � � � � � � � �)н{w˗OCZV2e\KT b0ߗ?駃X1UMpai.=TJݹS.HjBXQ6hxv=H\ /8X@GqTsH7Fecxxt517dTo,q߾dwc#I~;3fn �"`mۖ܅�$#@V2(lB�Q wniSiƌlD*M?쳺ճgOM2qI.  (!ӭ籕_+J)~e�R…qPsNƍfbZ[{4� � � � �%`ﹶϹu4gTM6ݮr5@�@�@� P+~� � � � � � � � �Į@a`t[Ĉھ}{D tٲeZjHb(8Pz!i̐4AYj{d+}!Z=zHJI}$$M_аFī@EHw%矏:{^ܻHJ6 -tR޼ܙ06__~gO>\:de˨>F�Eߺ5[Qb[LH"*P@#�%p5l0GC #G؂g4AnW+tAJȰ@R>4&@usy5y䰍:h@�@�@�@�bC[^G>X*V,>sn:Fn!� � �ĵ�Zq3x@�@�@�@�@�@�@�@�@ z pȑ1ХKZj!SvRǎ҆ !k3!@-ilaY+nCW஻r35{2;VڵUΎ#'uLeX jJ.4+6oƍz[;)< !ťm2t;#�nNpJ. @ X/Z9zwtKJ -' @ ҵ= B(d@׮ҼyܹՃiߤzr /ԤI1FMC � � � �ČRĉ҃?+Wsi:- � � @\ 3x@�@�@�@�@�@�@�@�@�(V #ꩡCN6UPlj]n)H!,.5l(u }w P;U( m$-_J#G#~E%˄F)O~H@ 3<StuЍ2|ԩQ'ѹTT 4|#l)5o.M&)/$B7g @Jn�q*`Ze<N}�*ШdaSJkg/g͚7i';D2$o>ٳ'w^ٶ{_m˱:Ç'\>NT]m;qvkyۖå.9sLnrʕb<my܉.͛m˟?wɗ/_] Dė@ӦRҘ1Ұa5cGkZK^g~~B]ڢ � � � � �g\?H'QS݉4oҤI;@�@�@ .X&#.v� � � � � � � � �ďi s+j ۷o|ٲeVZH`2~tҽJ><~[PkJ+~_I7$>@HA� ^(;tEl#`548c`[iaŋ \6bn[U+鬳ɓu#t,nf%zban@�(WA}�Za'A@ M0)S޽=;l޼Y:tE]A-*?*sNջl߾]vٱcqm]v%ضݻw{ZeAW)Te:'pķ!Y=_%*WnJ=ā[\ؕ{f`vImLp"Ep]-bŊ)%\]̋]ô%,^%rNinݺڶm^+g� � � � �%`ﯾ:,S>b{Sv-9|)= � � �q'@V= @�@�@�@�@�@�@�@�/RJ{<xoXn]C޼-+5n,u&i  r#E�*UR>(h Y8ɜ9駧/ @*=#z'\H[Y05lH/0~7DxyoKcz'6ktԦMLS`xiFy�!�$u5~M �@:uk_vB�K=zȝ'ʾi )έZhI6jAI -[\Fi&?.fs-m۶dgB=u *_=qHT 8*e[d2p=G\{)4rTi-`k߾}^}q?@],p̂Ȏ $2 J{ \dɒ'pqK.@UŶ t,='7[vNRÆ 5iҤjYQ@�@�@�@�@�Ƿt}#!w~*>J?x;q � � @\ d\z0h@�@�@�@�@�@�@�@�@�ӧFB^QϞ=eK. G5tO?I"խdiȓGry%@|PK.�. Š�EKz!uv+0ZjDKʩ2˗K}&Y"/֘_H*p4ptĻWH+ƻG�2.`Z[f8@�͛7G�"P,g KO>k[/8({zZHӚ5kvZ[λ_>VX βEB %/B\2Y@SKŽ\*8;*q}s]cq'bb.}v=;e… aivcoa \lٲ*Wq G}yy /ƌ@- vO9m׮F%g5!� � � � ;IݻKL]w=~A۶mS֭ޙ=@�@�@�J@z, � � � � � � � � eʔqR֭[%,YN WP_~̙#($۽cs^ɭY~K҈] @:vG;3ؒ}!{H^xAnqT}T+tҽJ3z5s7jE3-0k?uLW @\ b1qM@ a @�3gG̙3裏SF" 'Ľ9xV^+V$\VZhvXRbaXI:=xO<D_cy=nvH"{Xڱ˂~q'eo z ;餓TBKJTreb9GI7J;YKm�qW͓N?-P롇ٳոqw %~~ D�@�@�@�@�(صKjo .K@M͗תU+} � � @75E�@�@�@�@�@�@�@�@�[o߾z_ҥK1oUZU9r[ҙgJ]'M$i(=}/ /L/?~ @hr'|RW]u �WmݭթW^/),`ջd,LfvyunO~Y%6=7h@�` (AV,x8t萶lB0U ^dƉ�Q-pһ]vե^o=C`d-]9rEn7gF`TbE7_uʗ/],Ȯ[PH,`w-.uI|Wokzmk֬]>s\R۷oO8pªRURzur|t#[oI-�qW~U5OwZ @-{.uԞk � � � � pcyK753Mji& � � @ 8z* � � � � � � � � 8޵^gyF;wk[V5uK>(=Tػ@N Q;p@_\zU´x W^y i_H+_~)-[&zk,>{Ҏ<i=-ZH"u2D=?VV :ztq �(^\r8rB-"@ lܸQ>LV=rEm[i�ߤN ߨ飝;wW^ _!hi޽Zh.\˻,^&\, ʪZj׮-h!3+WB,L+W\!U"T Unݤw$e[ ZbwYN믿֘1cm6o9szZjf͚u)x!pK\#ZI)˼@'x"AeZ7@�@�@�@�WK HfɝI?͖-[4g=?=@�@�@�E@xy' � � � � � � � � >e'N_V jڴiX 4vK/I]J.upkA>=Z7|t;@ {ה)S܇zݧz#tr dFP+FI.MZII]|y`C:U '~FK'_6G@�(Q֭je#@D N}=F�s5.I@n2_&pтZti1wci?|r9r ĪV,ԤIwjԨݮNXh(Zw:- ԲآƍVGO.VD]o=[j('}1bf*yCU="� � � � @ |Զ=&I%Kfl�_|rȡ . c7 � � @\nx$ � � � � � � � � Hڵk~:[lQ*]HITtՓl\?{n7OF@ 4w?W[-[Wm]̏?,n _3ߗh遭aܿԪt_|Qr{RbT:n&[Jy<dX @jYHK@^:tj=D{nvmر7vܩ_U?~wkuAYhK:unɻnk֬ݗ8(^6l]gsv9 �{.] ֪Rt'4h٢R:˿@^2U<TX1Mr+;A/_>IU � � � �Ds_wߕhMs9Ǜ� � � j#@�@�@�@�@�@�@�@�@�gӧEI Ս. .5]*T PAr ɅIsHeʤ#.pd@-j'}Ckݍ  BiዣFR^|3ư J DdLY3wI1B*U*cw t:,=D�"Xm"t "J-Q3 �GF2D.<J.P\ηo߮aÆ yȝ$~A?wYx|>ʕ+' i׮N; mI8N;kLT?߼ܹs_j:p7ky\}:t*  =ljƱAի?oy%\'<P˞O@�@�@�@�oѣGy_rʜnݺe`B�@�@�yA1D�@�@�@�@�@�@�@�@�H,` z{]^z⮄}HwIB1C. ݈l[RTIZHzyBY*TK@ TVMwu~a]V$ǎڷXؾ}=Gbft 3gwuz9q('3#{ %]u@ ]7ncYvB�TQ#MABg5tlݰ{n͚5K3g.?ݫe˪Ut8}F0l+PT)< j…%1͞=[ӦMe۫Vf͚.5k ˈx@0A1*NΙ#5m|5Jh[DBBfzk^gxD�@�@�@�@�8^~3?]k֬QV2_ G"� � �Ĵ@ΘC�@�@�@�@�@�@�@�@�@ _~d & ʝ;*W3X5q`t-<3-`ZV,P롇,dBſ YbŊo߾ޱ˥モ>ۻBJ;w'%q{S'ukiɒ`L-r Jmڜkfwwhj .P@ڶ-A@ 6l $4�dVCVfOq~N;4u==e o#I&*۴iO?T~F+Wjݺu4iU[I!´O%('OիWO7t^x/XkǎwkWjI'2Q1KÏ;~M.0a]|ʑ#LAؚ/_>P@�@�@�@�@ .tDZ4|x´ oڴi*Y6l @�@�@ m6b@�@�@�@�@�@�@�@�@�ׯedUJ/T+, ш9/iAju]A-P`A!;vf̘3T{IJÆ2t ;DWm%[u[W^FnqVn]ǥ^75d-pky_^Gɾ2 uk ! @X,PL2aiF@�2/бbN$|X}W9rrDĦM4f]uUn8_}'pm^xs=kF+VL܃�aȟ?=\s=0a6nܨ?C=ۧ>}|^<YfE< 'Z6lkh<0+eB17޼ysM815K$~$@�@�@�@�v& ,wnH+@-[|V{J  � � �%3]@�@�@�@�@�@�@�@�@�So߾.-_<XdjԨv2@V҈K￟#73U4lԠt噩c@ \Ҷ.9n WǶGRvrp lL}tn9kDWeZcq---tI:|,ԁ� y2oǑģ�Z3fFzB's��@�IDATa(/[\q:s߀qݺu5kϗ+R^ui5{l t<mڴQ…C*E� ԩSGݻw㽀Y]7|+WλNdI7oi5Ι#-*ժrڹJSNu[.y+<Qρ *@�@�@�@�@ CuGԹs;3yu޽s֭3Y!� � �ă�Z(3F@�@�@�@�@�@�@�@�@�:tkС ի,DS^R.ҏ?f:*HE`vP!quKeGB�5j8lOW->+]ye4O r s7"`q#-Z$YWK/͛$L='U@-+k֬@ sŋK۶eXB�ظqʔ)g @ v?P|˖vւ Ob[pر UB9RM6լYG-;Va) 9rP < Բ3-(.R_>}כl<r~<SrO}ڱcf̘>Y@{� � � � �/'M,} RfΜ}UVAJ@�@�@�bS@|\ � � � � � � � � @]rÝwީ^{M[nMcݽdըQ#kg[�+Bպ%]s   +VԀ4h ͟??]Ei<Fƍ/ʙwܛZ[r1}P^nVkWiCm1c=%9 j]6Q# GG)8dľ Tt(#D�b@S'B`x#x9t~auY'|rP*^x_ʖ-O?B驧Rƍ]K*.A @v ,YR]tф µ~7իWOg}?f[7oQr_rީRJ:34qw $P+� � � � @ #k'}ӦMSݺuU8LA�@�@�@ 1E  � � � � � � � � �)p- ^ݻ~zU^=dmdb <x]Lm[yOYcpO ;tI~"@ C5ҍn5F[6/ϗ g@nH^BଳZcJ|#ժ%+m֨3.+7^@p)0k֬ Fԁ�ĭ@Ҷmq;|�8r6m$@  Nzu]wgժU^VVk3g[ ̵ĥԌu4V  >w._\Z=ܣ*UhРA|;!rRan8Yض29h5iҤw6k@Lq � � � �Q$st?K_}Ɍ ZnC@�@�@ Ԋ!#� � � � � � � � �dnM#FC²l2jժ`T=+ FԑXB,P�#ӥv+00`@:~nJJ1SNQr:uSn!V7%s@#i4r\Tޕ/_^k׮=k �pلE) @Z7oadٲeڕ@�"D=:8 $d,ri-ҤI.]ڛteJ) B zǵb 믿p6 glnrxi׮p~IJM D\z~嗴w@N`W@�@�@�@�2)}Բ_j p_.\@|،� � � pTw- � � � � � � � � @ K[lѸqB2KzVZ5$ҊO?l1n Vc{8&7MVZz'Oh޼ya}E6i&Kj۶ʳXۤI~?,>@9R[z,K2D?,nÞ8QZ8%n夓Nrn5>}N:0t�.Pxpx= CCDƍ>)S&FV~F#=> qciԨyԩ&LUv=CW)ŋW_U͚53UO|9ݧz*cZ~}/咆z-]s5*a齮D!{޽.ݻwWn2ZMP&qt x~i5jHs j;UvҡC臨W7k\X\achVNO @^;yBA�@�@�@�@�ضNOxaZ!N6M6جY4+s>O\p.4ǐ9MO[z@�@�R R7 Ԋʧ,F�@�@�@�@�@�@�@�@�-[a˂ECM.UlY,X0U>[BC}WzW.}/n8Q-`SuY.TlqP[V:fӧOwj<H,[L+V}2adBvIϾ#n]z晣Z@G>[d;iʗ/5k$ݘ[,uK3f-Z#÷KfO@ \ƽ-Tif8ذaYa?zI�?CNLycM;պuk/+C&MsCꫯرcURV!Λ=|p[?CsM8c߿_SLqgq@gI{\-[<W<s  \H(9s_h[sذaaZɒRai.z眓f۵k@{Jc � � � �D{.PZe E@͛+VC7<]EzIl޼9;m � � =Q8>_GV<g) � � � � � � � � @}hԩAo Xjՠ [^yE0@zP_Ο׸-$`@~|hgK J,/R>WOڵգG, lP ԺBQ}|-ň%֤4a,^\zq[YM8P\YziӦ7Gi5r ׮];Rْ5vҥKOYA @D X֭7]rέ$@A�L 3SlE\7{AX={po,XZQս= hР:w5+Wt7֬Y3tMI[nEuI؞9c[Bf`%TΕ{\) &MRq7Ajsի%~. 2D|w~W^aÍ7J~+-^ֈe͚%P&-Pk޼y$Ggٓ� � � � �Q#ಙdw{Bݩ;Ͻ7۽9;ryH}Y&->g8/dw+$+)ݟ1lC�@�@�Gu~!� � � � � � � � � uU˖-5tРuRJ e]J=&"}i([m6+W]WNjժmy@Μ93OSބ-y&Y4ڬ*UJP[^.pC*А XNO-*{`-[E ׫.:A5k#-ɽfٮiY)\$m?^OoŞĒjvI9r䈥a1&ϰQ1. ~5ܝ*T/8]vZ~c+ *&X1=ݳʱ;K>}|>_BmK+ N)l4hV$)SF6?X03Cu)o;N>j)=: z]2բE -ZTڻwo0.@�@�@�@�F Ѳr!+g֭[S JCzc)T\ܽaCU>+&DS?ك؈� � �/Y>Dɿ.>B�@�@�@�@�@�@�@�@�@ N]zZ` 1 BɿbeF[ya@5H_~)uV r;/g9}' 9o[|sΚV0,VX*J㨿:vLc'w?cOemӦnW,Y"[0qƍ0a֮]ݻ{L:U֭[믿G%Mb 7hСCc_s+Z؈#G-yɓGkoLkZ߿WB{x^}^藍aܸqzUVWO?pª\6mڤ.gܹ*Rt$+[%0%Э+5d4j'#5n򮹗k@9餓e۷O9{WO?tS_JY5J^Fp?wIwrKT%,>Lozv-H,v5裏4޽xl۶-J޺uk+Y^#|A�(Q?$@_U^OC7`=PJ63P)Ρa`nM0@nMn,R|A3ƛhؒףDJ$2{ϛWR7iڶm/!em/7M=3|>ydygO> (e˦ '2Җ͛<yV)9c[ܬ<Yֱ۞|I* җ^等Y~_r%z饗h"x֥͋^?>,?7 iQ[ի=d,wީU}f͒oŞʕT;m..r7NYr;O 4W5֊Vsnĉl:lZDVD@�@�@�@�po´of̐{vcs*=jr"CW{<L-\k3P׮]8pִiS^>f~ܹs97s$~> TJcH<RcWufvN&)v@�@�>y\ܛ( � � � � � � � � IxO�$ծ]B<-{Zg*;xk+Up{د9co\(:7n=:-tT}:u IqNzn[_޼y}-saW8"ށׯE_mýӧl۷~ms\O>wm/s ~DŽFk@+s/z'^{^֞ ]C!Cx]W~u^6?K޽炴|vσ>Of|.˻r(Q"ᾥK\0;-,;]W>Yry>8g>ߙg6SwP{=D{J0<}?x?\pokKJ{I5袋z\υ&ŏM5/kfթS ^ի,dɒ͛7܂ /z} kVW@ >Ox= ߀1b0q% |.3`HKMlGB=ci <N'mK{{| \24|W_}ٹCJkE yI_ nɻn\XXBc͚5}nC߂ |Ep nF_… \8υ!y]0WB齒Dzڱc:ӝksa`\˅'+~ӦMc |9x3g?x۵mch??]nݺs2Rl6fөEY;)=.i +u]m?p /)SBJx*9(wz%=6b>.܇�1.%cfx � � �q#eWϽ[,ysCj'w=iG3;2exE 6n{_g l_meWR:#H}/lJ{Z'{@�@�@  n0`gۀ) � � � � � � � � Y2{<!@d X8I}6m JǶoqJe n@BZĭ)+X0̀#D}n@<Pb+=Κrm[}e&.(`ѣ͓'On?f7mڴ>| /x_~W_\,k Z/w}(n>ܫgwgVZ5Ф/Џ={&l'ϼ,$V\z饁+w7'ܞlr%lʕkaZ86ʾ.Wy炝W>.)g͚57|["oE* V$~Ͳ]!Xx^\k%=Yld ZK^ݺup ڸ~i+Y^#|A�m֪ 0&D *n,l4q@cB`ժ}wHPb -z2  Yɛ7 ׶&WhҤ,Zț7M;ɕ/_>/:`԰aC_57}_WOҥK{[ ;Jz'Ӗ͛ڸl,ba\-ԁZ[_䶥I\GV$S7C lߵkפmycԩq@-;.PjYIi.l(xc2gΜ]j׮5m]}uX K#%gmK<y|ƍQdIW @ ~}9 � � @l5hsV>ҥۜ|Μ9}Ǐ<=1iԎKSzC=-"fmذرw'l5P7nJVz#?pU%> � � Y@Ͼf9?@�@�@�@�@�@�@�@�@�p]tQBrJ+qhdhQuki˖EtYt]=z�IZj~w!g;x:_?4>Ś&L}N[ԻG%Lrnԭ[WCvnecʅm}XŅzr3>.~{~V_Q SNZlfΜc}m ͑[WCr ~z[6]^<](r0ƍ;xܹS>Äu lTj*$K8$7&MK,  U r4wn$0zR)^-`-{O.ѬY3sVH/ج^z%c[zdyrryP5:fɛJn܂޺۽>5++ s%Ju[Qzڿc ĀJ-$�GvntrHPs-+ŊI}H>0.0ڝ:d>6}9QmEzU@DR (* D"(vAzU,V(DEb\t{3o%Mݔ|B̙sYfg&1+zhXBF<۴;_{cnC=8 l+7ퟦMַHK$˅Ԩvڲ{ӘIpއ3 ٗE}'m}>[xyxcGoƫꔨg`\8kJ:DTt\9sfø`0k � � � �$n=rkokc݅PvNcǎu iו_~yy׺>v]3x&Mݻ]%kEr)X޵@�@�_`ⷹ5Yo@'{O@�@�@�@�@�@�@�@�@�ȳ@ٲepPoΝy/ĹZ`xXҩJ[&m*-kHA�;԰aC?.3<UW \> x1xgAJ M3=,^wo_X{X-Rf_̵^uU:}[XNbXV&Lyj۶ e\Mh7Z0fT'NԾM jI2ڷd}XXPnru&O vWC# @|6GcJ崽,)6aA\ߎ=mڴ_ۓ܎YNV"Mgy9-]T=zp|e,?RS|y [ I9JOSg^] ʻ#5[{$PRpz5|Kn(-2k,N;-3dMv˼8v֯_{y}vFuqB`2gy+'Ԙgղ,d|"$ڵkĕYg Ce^2 e&8{\{3lyy<sN;?a姟~ w;-gN{<|~)5GĶ/={v[!"P+ @�@�@�@�HN9EZ\zmOkcݗkZj徟侠J!͜^8w܀]+ovg=i裏*x} ?kz)nX� � �I,@$ � � � � � � � � �KzjM2%ϕ[Vy7u*Kܹ?H}H~Kw�wr_5+ (P%K^M]}q۷i5V' dի{>,/ն+'QtB`e0i&/',x/xѾ<m4m6M>]%JB"R}(v{Z{>lep½ڰť>\r,i|]4۱n 쳏t_}]nrb/K_ˤJ>$B ǧJ_{kjժB`6xge˖e(q+Y֩]M`_s݇>s~RRd13g7M$4>J+C( @ѢOc({k$/.I^+=l5x[ }K頃zH)ur[;\[ 6&;<%̙3WE͏1UkS0S7bJ&b 5njYg~oB2t3bG"ozk'"_{5-X@-9�O{y�vϻcöcUݽ9;BV$@�@�@�@�غUrCp魷$w*@Jp,߮nӦM}R4/ו[XV]c;Ԙ1ctYgo=ܣRJe˖YڞIZ8}<G�@�@�zv#P+~i1 � � � � � � � � @> ԩSM[ƍ^p_I >X5Kz=i iϞDiY;\~5J62]#hر !QZ{'iӦҥI2{v@T-Z=k׮w4W[hmoڗ&4<̾XlAZ}5\>ѣx /SN VނFM?yd=ބ6aԩSdɒu,.LԹs,[M6Y}i\jZzQdI<'ykO+[eʔ^OcA\|^_<L}^}]/�'?Y �I/P.Yo0P@Z Xݗ=\9Q<jn=dba.H|ѣWh`ܵk+yBg]vy 0&RNk[.ǶR֭ykƌ^I'*Uxg9JkV7|GъYlfYBB-˩ߛ։v磭7eeƍ{dcf`8 wbn^`t 'w.#;=աCUgΜ{%ٶN;R@�@�@�@�@ yvN;M37&M 6}}ɕ *dٱ]^C:HyFh}ݧ+WW^6lJv]|n%y์G @�@�HJg E � � � � � � � � �e]&bXx6a V&ܒ 4RX u,bZeZHMB9X"ϝVͯbӦzWTtiY͛3궉rO<Do[6X̙jQFyjժrIA{;|roYޞo޲矯k:5~xob]zwo*UbE.c%ebhѬoڴ['s֔)Sp{!89GMjm.馛nvT+e⺭nP &@rg~~[jXJ8_?ɩ fZ^K/IÇg^c;Qle˖ mӵ.Ѭr u̲ǫ- >QYvLz衇y~جY3/0?YRZZt^X}x?SΥMd@`={^|C-a0JIw!=\|+~Zv:uJbz-o Ip֮TRFv:…⭷!'e|~^wuZxl�Ǘ_~19,q% ;oh%ܾcC ;.h;9ra1+VʲEpyp7837 _{'4qD}7xNeý7uqIj_۶mɓ'{N7fo^{ چ?g_B+̌@>}2=úݹHw22˼ytqyZ׿ /:xZ;>\S1;Ҟ={W_[ML<el� � � � �!Nj�iC-f6hٳs^u."x"xoe>a]\nޮks=vnꫯs?9/Υe/ٯ}w^+H駟ÂZe � � \w݅S@�@�@�@�@�@�@�@�QM^z[$8p`ثW S+ŋ#G&j ]ݻgm)о} p쵛80иq t ܹ3O޲͌5㬕_~%& tI7ѫ~ )S&pgu7i:۷oz衮>֭xꩧ 4>o=&eͲ_`A})[׶?nԀ%Jx5l0g3K/4&XgϞ@&MnЌe>Sׯ_߫Mrp~ᇀ7\rIs΁#F+f& /0{۹`q`桬[+B*aӤظ10!hс?&}܁ c*7w]Hs-v<rxq^~rFuޱsͲ̎)9cˊয়~zMXl/e)y9fYE.t0`0إK}1+Kx�)+p1x0,fi?K{;NP3E oY;~J$.pQTڵkrT]Oe˖c W… !GUf̮]zeƍ۸5\㍯ژa㏽1F{n:֬YqÍOyk׮]�kC5 /_>0xޏ@:u:lՅ䒁nݺyˬ.ȍM2>nHlnW\q7VjY$M$}fp'OVZydu{6+\HX4~ʖ-Ε~lܮ .;_`ug Dc8Q@1gΜH7/\@3RTԳ@ygxvݡ )]wU_[?3gO>[E瑂�+s@�@�@�Ew9;Gn߮l.ʵ!e?ZpאF3k ;zI&.,p˖- ;_bl~ѢEa! GʲO>^ٗmv� � �#!  � � � � � � � � &<7,7w [ $ĉujrT//miر1m=4ptM 7$zk }( *]}쟽"Сt!Ca.Emڴe]y]qUŋ}r_ RڵkW_fM�5{侸+%7Y^[`F&HwnmڴI.K.|+%7U<n7yܗb o?ꠃT6"^>y4xzTběb |ҤIKGGZ5;k[HuHW^)]w]B,zP<ItW~͛7M\-ed=fY'mۦҥK&y1+ O@ e8C5[o'~L:6ӦM`&u uH~QrjڴG_cyXPnQ~!Ueţ[nEs\\7RGĄr!I޹<?=Pc6NB3y qx1`=qXޘ7(cc.)rWR% ٗEdT]dƷl r޽³'V/"_jqE{N^{ܤz\oaHY@z-bIdZիWK}Æ cԼyR "@ pdy4@�@�@ FW)No?a!f?Mzf<]Z1Ý !Hv ] bKy;wDA�@�@�z֬S4qe|V;!� � � � � � � � � s3^uUD_GIj֬ӶɰM抓3MD(7)i2ڸatԢE=!@ 4o=B&=%:4Q8M:Uݺusa6uLxX%XVN&7 mmbXKIjuDeZ-J6+Wgw}U0-< ɓnM;WzYiH<Ki�S&4N}gn??֪UK6RJ*V ztJ;eS1+RK'74S'ޤʕ+]kU´ͧQ ߟQ.'JCȝXFI?[!N,uРA5j6l=꫽qMDUj㐡";ZBݏ3M2f SyS ޓ{O3'ٹ.6(K%۹xP㻡k6ٽ#1&̭dgnpuZ|*c 5v'ȃ;wzAZn~zp lb&r^k&[;`=4šqjc6@�@�@�@�[%ao /L˄w[ŧ:uR[?y{=\5miY"9H᮫gk � � 8]yǂG � � � � � � � � �d)S E?~暘&]v7mF)6mFl޸sMNإ?7<+`3H:sAwYg%Kh5paM;w<>˹͚5˺2,礓Nx7̑  (/@+B_zI<Y߾/u.7Ioi8i@ Ԯ][7k~iMm9P@�PJ:Q=>P2ҧH,Pf͚:gWe#4?#Q*un]>]&{iâEdZ{? `,n+ अ5qi4'|.BuU6QG;geŊ$wƍ)TIenRwڕkr-  wM:|p]|*[l5j.'PGK<"׮_{rSj=f3bBԊU@�@�@�@�(1=tϜox߫裏d7/yeԩ|~u!_c! � �$�׳/B]JVx3^E�@�@�@�@�@�@�@�@�Hc 7KK.1O>QI޽[7nT*U.WJif� ZHKիKuꠁ�$裏UV:3DQwm[?[rfk׿{ z<j9.y}Rn9 x{dm}4I*7z(x1 5ΕNzSV-o/< l^5J^]Treip-ɑ�ix!VjL$S7驧TEJo}{¿-]tpݢ{Ϸ+~ `NXt?&n[o-_9s4boyMNըQ#1zGnRJ*9˂l{$MOa~3aAJ3fг>~[jvw{Db9D;liH&��@�IDAT@cX$[$:gK͚Iwq^~e]qy~'B6F�@�@�@�@ _ܨFqCw|ugTnZk׮Ƒ#X=-W3fFv}!2`�o>uY@�@� OYۇ@f� � � � � � � � � өz(֯_Mv]jմfivsP6@s,5C ʖ-uuֺ%7.ps\ ԥKoFٍW_6q.7 ]ioҔ)ԩ)MPlõJ,܀c%;65o].k_ �.`O6mBv^ ["@J \2_DRΥ@j.HԾ}ZtNyI&I/}TpBo ۰aC=뮻4}tM8Q4hN;ͅo)R :?xn*U9O Gp{֭ӫn�^ܹsUBv<hfO \,S'XLZfIݺxڵ IVX @�@�@�@�1C:T:y_|Eb4$Zޝ~ǝ^jU"� � @N\ϚL%@�@�@�@�@�@�@�@�@�IK/u&/imb1+".@MnBtuSrR[I&0axQwv}&2M  *6MR:u# .^[JH[&W^z ij7E�REr6ntq [J?jլY3R! @ XN#}4nߞE#,ƕ)Sƍk o%\>@m۶Uڵuzׯ/v.] в@vNrɕ()V?@/^o]{:j(N^u&|V{ |؜_$=6G?֬Y˗/͛76F�@�@�@�@� ̛'']pt@�@�@�(h Z!� � � � � � � � �$@ǎըQ#?>v'PBT%/t晒k/-U~#@߾}e &>t3FYN;M:(b^~Q:䘫`Cp?Z˖I7,tRjJ6d,!l@կ%di +K{H6xG,@Vtl�$@Ӧ~p… d,ē.R?MСCUzujJW_}̙d Bӣ>38 k^x ԲwWѢ5UMRٲҔ)IVh,eVcΝ;xkyخؾ}vؑz@�@�@�@�'駒]{x񫗚@�@�@�(LJ07 � � � � � � � � @Z )RDÆ ӳ. UfJCgAsYDIA�4{լY3;!F֯b{i X]ML p*m֕.}I7K+7ѴtIKx$eMxE @:T2B$�Z&@ ^+|4d^͛7b9M6Mk׮;CSN9E|uJì\$˗Ǹ'6C�x l۶M ,=ܣ={FjҤƌRJyW_|׶mۤ ec6ə&W^N>Y*Q"m,W:v쨙3g+zoܸ1O1 � � � �Gয়@O(@Q@�@�@�H Θo#@�@�@�@�@�@�@�@�@�O pǎz"M0P&Jb_3ϔM7/ 5OcGdɒzewy#7w;LzVf< X1M窨�e7ի+K\#YV˖rJ{ǥbŤ l@ ~Ͽ @f-[x5&@ ezJUթS'Z%nf͟?_\"ٳյkW/g\?o?u]zyCVJ RI`ΝnsMt^x^] tGG#qkҤI:묳TVTbЀ'H?ڼY.P#U<w\mݺ5ϏM6\"� � � � @|4KNӦIt @�@�@� P+eJ:� � � � � � � � � _UTQ>}裏F *f8,]tۤҊEO>)-71\Իbnz�/`Z )SF .^Z6X9J@@zmܐȣVIkHj/h!ի']vdon/wK=i/_g �/@?  NN@�80;vhJ>>:餓t-pwqF-ZHG|,K.ڵk{[ԩSj׮]IZ@ u'CnPoС^xVrXc 1 fVg~g=2d5j`osN8Aw_57޵͙#ٸ)Ļf> 40yż abu  � � � �ʒ;")"͚%`  � � �)%P<zCg@�@�@�@�@�@�@�@�@�' \GO\RRoߞaZBlz^~YrsE@-7Oǎ9қ]v $]{4at5mJ1|z5Z1бIJ'IR-/W^fΔ *T?GuOPZwCUmrKsX �"P  dwL UF$k9E�EJTj (wJ*Y2Z g%JxcGy.bLK,ѧ~ŋq뮻\N׷jܸ95m{l6lV8`$};}.h+/$Zh =PuQFG snV4-ŊI}J'KW"ؘ$T6mx[ ׊TjW6ml� � � � �qpRԻb`Tz* @�@�@�L@{Ch � � � � � � � � @b XM<6~lt/S~VϞK/I;ʪUҲer?'Oz� \wuէOorؚ5kZ>HCH=$!Y%oONyEmʿ#-]*~`]R۶k)/e8Sʗ@ BIG!@Z "3`, 'p';Z|ywq-ؓ;vx!A_|K/(hĉn|d٣b.~^koTn]R@`KU?x}hFM4n X;m7>0@;$L6xckiOw{Ed~bŊ7nrKVG�@�@�@�@�x9H}$yxJ � � �$�W&{B@�@�@�@�@�@�@�@�@�T .ȑ#u}RJa[i"3ylrG ju/_\oaP@�@w|gԲeKyzӥ8E2WH?,M ]rI6)Y/u!/zv ؼY;ןXyk'C+ j^*Q"{^Xz}P@� _ \@`/ Բ ܋ @ 숿<IK'( *%Kܱ[ʂnw矞ԦMUmuׁn}=7rxa[j2c K~nWfq;x߀xd?Í5/_7VӦMUvj~RםqK[=zph:cޙ7 �@�@�@�@�$pҴiҬY*6F�@�@�@ J跇!� � � � � � � � �$5j(/. ۴۷&5qVҫ4ct)'RRʩ?z� X w�l۶jki87ǫ C:T*]: x9*7>Hƨ6ce M|ywogҫ*T:uõVժ5u8ys?l. @ 񬑺@ UVZ5kJw @իWk۶m^NқoJg%}a6Lʔ)-Zx]ɟ~IBYٳh b[eDuˆ,(}& <Z+Vu2B6nܘQmr9sA}J&ȝu"BQ* d;/eP?bjG�@�@�@�@�=H/=Աcp) � � ��Z+@�@�@�@�@�@�@�@�@�|( &ٚlr6 W>DSq<?9jM"M ɱjnm Pz{1YHckw83sm5m#=t Q|NѮ]* "`\>wviR?X�ݻz?sw#*nj̉hVB�w  RFm? G�\xX+<qFi Y@Xڅ۹snٲe˗{˾+2*UhsAefP72˥@ BL؟酷ٽݶoߞQD /-vI'ynu-~(#N[wߕ?`^l,[iH:=ܠ3t;CP6mÖl� � � � � oFO7Z@�@�@� P+y+Z� � � � � � � � � �C>ci&Z\MJ}V.L&[k.n!xY`ĥ 2D͚5!۪#1cΒU :/F!`TtQlĪ$@zҥ͛9sW^n՟ӤO;܉G|r*  @T$mؐ  P`"@�߽N֪U˻/_^-CꦛWftz޲eVX!3?2n? QZfv[MR\9UZջUsT%fUr+V(ۮH"jaAر -|ݺuk׮͸e`Ț,-g5xw#GaI/XZo-F֓ճgOu]믽TfDZ7F#� � � � @| }t1Vf � � �$@$k/E�@�@�@�@�@�@�@�@�@PZn͛{ZjV<".5l/k~`Or?&@ ޫŋpӴ%ʵJO>)x .E.`ZZIn^] )%`j[xv}Wz%I6?93Ұagx� Pn~^]M` [Hs6f!�D)`AO\vٲe3t=7NB?Xs猗x6lлlϞ=^ҪUd.Neje3JѢEU {jcvo7 }{ﭭeʔxlKn[RsNms'*֭[eg[.e>M6yZcP|gfhM�>e>PSE]z(q XW˖Rcj9X̙3c Բ � � � � @ Գԥ.? � � � 6j[MG@�@�@�@�@�@�@�@�@�%0tP];v7]zyPɏe'7ٜ4xv~pC~ t8*<+B�d(SNnAyQKW7AvAzCET@ gۃJKSHBڷ=W[$71tE !�@JMCA� XGGGA�Hy qB?@8PZX[7<`Y,l)b!O,&e0+VxPwFT h%KkٽJ(q|lcŊnxuN7k,d,8x{n͂Ă-,n;vfuFR_(f7 @fϫWT -|_ 2J+]{4wԵkwЌ;u]/wl6lvl� � � � � Y#rtAsInh� � � @ER@�@�@�@�@�@�@�@�@�@ nVQF^p&.$Dl8JxnC.պ'e!7K'zKi$iӦC3f q6agKK0XvGG2 "nds~7' .DnrecTVtn �)"P)�qp5kƵN*C�HL6fض\8?n>هtm=٭nζmۖemݺUnF>TpU0*TU0�+TPV00-'Tؖ-@ˏ/QNO*sX=)˖v',?gm?b8�MiʔԚ3G.dO:Xz6z҄ 믿F}|0~-% � � � �*s?wK&׍X@�@�@� P+L� � � � � � � � � P0UTQ޽euFPܷI5,PUDmB�Dh׮ƍ/XGyvc3-m֓~XW/W2O (/vzt-CII(l?M@D{Gh!`]^5A@ _֬Yjժ܇hԺ4h4}\QUY);Wt,@ qtMrB u'K+թSر*U~gL׈#ڹj}Qm � � � � @ ;i"ߖ5@�@�@�H� � � � � � � � � @A :T꫐%P+$K z\/={%Kn(C� u9höysi(îʋ|T~_wm[L߾ҌDueMm[`E@ ڰ!F@PVZf͚v� P0k׮1PZP 7L 9 L(L>}͛7(V[ !t)YwiӦEk Բp_  � � � �䏀]+nc/$5n?V@�@�@�]@Dh � � � � � � � � @B tAt&L}jd 𢋤gO_G$Si+$#< W^6&ĭUK6,jjhJ@,]*͜)]~;O?{OEZU:T󚽶{w�M@<^!F{L`ʕ^J7 �$n:UR%l+aFv4qbUy|(QBC.'_wC,PԶ1W mEHgꢮOׇ~+VD-ZQq2 � � � �Q <tڔ@�@�@�H)):� � � � � � � � � @ q3[ 2}Q^}*Yd=-[Mvͅ VbŲƓ*T' ۸زI|T]ټy26"@ .]ZӧOW˖-5x`7cγ8*%=tq҃J^hIXVNVZ@~ <~RYdAvmNY9s$ 9֮Ժ˿Y=\,>_/m?޼NݺUھ]ڱW֎0}*Vo5jHv+_>5h;$@J~K츴ノ*ځ�-j* j;@�$PZN]i2%yi>@vӣ1ڵs _Bn(<('|;7_ASN#njmA  � � � �UѴoE0 US � � �I'@Vҽe4@�@�@�@�@�@�@�@�@ Q ѣGW_uYl)+3_'J6}GW/i4? /5Snݺ2el;SW_}u �oF:t /G^0モ3a#F-=As*6y@@w>{N3FլԤԸWO0R]ƭ֬V,s"=nk - ^̦Lh-aZȖ2e[Æz}?<G�B ybajb)rJʕ+�H3 .|MnԿRǎiEwBओӥ.K&XۈҜ9RϞY^*'? ͟/͞] Rn;!?yvޭM6y\!+g! � � � �D%WR߾Yg}O)MY@�@�@�Uǔ/B�@�@�@�@�@�@�@�@�@ nuщ'z*@-D* ְޒt:w -'K}t!Bچ� p뮻ҕW^? ʩ_/͛Oparԗ^Νa'>zaPyۊ'ꢋܼZؿEI$[n,l˂jԐWUoE[\,* ߲͂YpՖ-_V㶛²}لzKɒ3vT*͂kT/Uڔ[ve.o6A+i#_BrruW mZ@ (`Z5k >@ ,Pr0i5>̝+mF@l,[7i4JUq][:(B #P mة8pw>8ֻ 6KA�@�@�@�@�< ص6.y@�@�@�HR此# � � � � � � � � �!0x` 4H' NeZZ}ןDhl? o H}#F Eׯw%(; BX4jE!F�rg�t^,nMlWirij~i?˂vʼeΏ-dLi}&loWc,+x*. MlY'H~(5o.uZB2H?`nB001>j!�_ݻwQ>},.w\jxЋ8tworAnZ>9fcTd{N駥ast;_NמuB%Y  � � � �,}ԫ?V8cFUh6D�@�@�@�*�dv� � � � � � � � � ={tMȑ#3:Djݺux!H|OxܹRzד[ؗYj$D .?ڵk'=K[)[lȮ<?/u*h!(j,&`uy6@Ia-l*5jHvʶm}§$%Jgmb[;$ڲd,nIMjn¥d'OnkaJ/qp5 �Z{HU7z]diQ 9uԿԥI'EQ"GOsf͒cel@>X֕WJo'a!|UijiȐ/¢EjРA4i bŊՊ@�@�@�@�M󤯿^\Z5y@�@�@�(>] � � � � � � � � �_t۷z,WVM_Mf¢I~}i|\9p/T]ll,wK/S)@2eK/iŊn3v$WK!V ]'頃bؐMHbFC@7ΟHY½wUU׬)U,faZ9Z:wi?l^Cr v|\\O7ސL-KC-j*}H '`yo607g]nX.djUP!f[M٫ԭQW,`/ZU!*Pt*$ [w e띏={vD'P+"&VB�@�@�@�@ W;{οI\Wgعs;Ͻ>m˖-ڳgOeΦMRP.!� � �9  � � � � � � � � � 9眣J-Xxnje ;Rƒ ~|`¿( @깙_|E7tyaJG?®ʋN G!,H4'ж<عs/O7o]w!9S4pt=H@A�rڶ5C-ppkemA|/Hm z�9 \R5jy^A =lfGXPp[pk@*Zj X1g-{x"Jv#@̙iA s4>ޥߍ?>-ZryF+!� � � � _3fH_/+uzO*DvۨQv,aÆ>=D�@�@�2   � � � � � � � � �"pQGzR 2իkժU0/*HgK;J',J^jUT||6@Nw߭뮻NoXJ2qԲaV%H;%Y̑l?mK;pQKҥR~-HuJ*WRtF"@ MJ}$$۫WPXО` @ XVMK '0`THx ݣTLxDشiפ v$b??*cEl@e冬@ XAGSO-EK.ĝ-5R՝_n]$ � � � �i+`m-ZH>`i $74GIc.Zf"߿D � � *G  � � � � � � � � �U?;vdTei  *%ui$BYܟ,B@ FnV}0IY%KJ/,S"=P+Gmԁ@r]vm>ϗOYY:=H*_ .lQ c;.`j۱9\)QB-�,gY@T~[n ík$jqq˗s-';'jtZ+uS,|P hDj?߭ٲEz) % :Lҽ{wz"jVjռI"Z@�@�@�@�HSɓ%;GyEСr7CrqjNn<.Mav>Zų,\rԩS<G�@�@�RZ .Iik:� � � � � � � � � ,6lЬY2ziNoy\lx!C1cSo^jYRn @x{L 4P=yWvߕuҥer\5m_0@@U+m x d }mAs|DTIF_^+5o b(VL>\1GJN:,G ,LBj2 o6=Xg[ yNu^A Q6niYV<ʹF3gJ' g<jr^u^AܩJ駥mq[t{(!'\sݸjժZs[ � � � �!5ۧ9FWgiTp]vR%M_,Y2ux@�@�HER]O � � � � � � � � �.PNuA&Mط-#P+#nֺfݻ㾋+$P+b*VD�J^zɛBCVMz+9ݼ^Q#MvZ D2V,Ӓ(:]K~ju*vdH  ea JrؤO�I쳥9|{1~.';'MTB6䓥?V8BZ SYl΂“Sg/Y6:nN$b:tlbGy$YR@�@�@�@�@ …ҥfwYD+ۥJyG-먣R"EBBܹS @�@�@�TT2}C�@�@�@�@�@�@�@�@�@ ,_׆ Xgg &0#M,Dg[ƍRʅo�#`WO9so qSjז;N/eS|ի#@DuM>OI.zS7'mFK^Z%vMd6w1HeK@ =Z5kLK"8 iϞ+94`@X@ yJ0bfa˖~Xk)NETm[|y"AH\~F̙.#'kʕE]䂿ƹOWs`k#xk@�@�@�@�$xٽٵK+=Lvfޜl<}_*E�@�@�Y@D~wh � � � � � � � � @R [Euڻ][ָԎ&JN&`cu~[#ի 6;{D >h=f[/%yC{.i(YRP!mLGpJŋPѣCrKΝ+rr?bŤSO; NU%U&=v߫XV ̊e+2_=9piSR2q)4-C׮ҫ}I:IM>Qp7Pk„ aZ  � � � �-{4iR~5'iɞS8C"ص! r"� � �),r-]C�@�@�@�@�@�@�@�@�@ *dn.grAy?S>MMiIv&@2ex/@�2d.2 <XK, r^,`e�^=,/"rօP&6L3&府*]Zi|知ͥ3ҒN#2-ZH[} ߵ˟;e:JG@ jUVK*b"S e 'LV%-Pƿ%͚%͛'~GCKCyGڳ'9K+O.GO>_+^u+NwycǎV֮]뼀� � � � @: wz'2v늬6z'ӥ?O@�@�@�PjRa � � � � � � � � �1 ruZlׯMjKVQnְrJJmJeyX}Vl<T @{ l=z? ub[]O>)ԾtiMRE߱J"C`/PڱwoZI.`a}&.M~䝢W b᠇(trJ/P [Ӥų.ws_x@2 XVʕɝ;K_|!cn|GOpd6fAA N> 1gN[wRV%CꪫfM8;x?IQfTIH~Ҩ4<h *MHR$2&D Q2to_{ν{g}>}ֻ{ߵ^5L2? ž" " " " " " " " "^{>@<ci;} 6jժYf E9HkJۯ̋Ě@.]@QGơʕ+u2/ ?Z�N: ?>̉q-_aq(E@(d3~m)Rgq矰z �m5Fך8 ]A#7[��@�IDAT�۟c:cc{eE,&(o�ik ePY4"@QegexkKD = PPB yZ!P$p�EP&иKkH>,9<Y|1]w'J>f84h�P6Y$$w}aly,] pͱ7UR]tx2iP+Y֭[C.H_;w{ |iOzѣx ݿ\дG=" " " " " " " " " " " " " " " " " " "CԫW/)ԪU ?C SPT(V s~8+rlL&(@ҥ1qDP=..o(կеk9qI"6m/E!&MwBH7f̀3"J爀$\y%|SHoJgO 2XtFbbJeʔ3#kٳہ }-g&($ꤓSS0sR(@(G9}u={4nºuk4XG)'wmqOrرI@EOx⠨V ۳g;<% Aʸ@\`:-[ cҥK㕔 C`A'aÀ@5%MA]r.Sz-書{#eȑ_œ!wWD'IJ[ 8ǾvmSآEs.IJ_ <СI -iM�o?NokKD = lܸ*TH+"ax<l锄&y<`4n | `*ni{"=QA@.֭91or7C%S8#1`�g`{C(yZD@D@D@D@D@D@D@D@D@x+�~8jK mCݺuOoHJ[VZFNDZyE=t:c/ -\XZeE@rNs&522 C0!.ᇁ5M0$=m>Cx-9$4\3TF˒@~\ Y'i3&E MP3sm84ɸ)"SL-_|: Nbg@AZҝYcrK6>6`<`nSwީ>|)hvΝ…)e!% ԯ ud﮻:u^b_^r7c͚55jI-[۲eǴCD@D@D@D@D@D@D@D@ҕƍԩ PH40w.c�)@VN9+V̝2`N1HyQ " " " " " " " " " " " " " " " " " " "k{Ƙ1cK/QbX'" pit~Gh\)iSħD9b߿?U-ZDF!QN~Z\< pt@ja Z$y>믿ܲ<s￱k׮?!:f\:mgs,XЭ q#1bVlް1ePKr衇]hQpD}.V!9R@KU^=ɕY+MWsX{e?{n{={u@^{1a-YMw[cM\k,joaymsz!p)d/}o^=Ͳݫ rt6.^}5T W)@`Օ^\Wz%d`:2df\oF[^Eg+zӫu`m֍WKo՝uAM6J6Rl`R_ <_Pׁ̧DLBKf͛G|N<%p)w.eˀ7߄H>5jXQ?{۷ov� g:sj`!ۮ֭[¹=\Ozc:z\,YڶKwk WZՍ �-kK%ÆW\myv؇uVlٲ۷o4[}{k 3gķ~ ]{}فk>ޘpk>eʔqc΁@VY$" " " " " " " " " " " " " " " " " "(uIPҥK%eKn�nO4n;*W~5v)& Gy+W4͹ר^zє+w;huEW(reIG'R84.D '{N8˶mܚۜ?X{ǎYs{)`y={9!?x{>tz’%+hs=Ɠ]tZxq(Q"cwR-vX6Jx%%`ڋ\2nmڠD 㰌²<xX.Gg& HPTel'x98 %b޺dɥVh: Ķמs\{u�ׁ۬ Xp4̛'ŲuBzu@lu(DFg%/^}י?ՙC=,?փ^՛u&{%u'.[vTB֗'֓&-~^4y,T}L֕^ɺW!_ebŊqk � ;`;"\8߮xn HVZW_Ĵ$Х 0z4�V7-Yp99#2d^}U[ӧO&ԕb " " " " " " " " "ob ,3u{_~k֬10]Gd7n}w^G~H)S2~CP`SXKj0a­v³AJgk;ޯ] Q[6o{9bz}^8oo]J'ϸ/~5=.on/0SXk=lismQ&/J_D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D % 4ls &M&-\:tHɼ&Kj;;,M#=bc=̉M\ED@rJаm۶6+'^M|6O> v� 9&;X1؄ijKņ�'4 6`ӦM:&sş踜f͚bQ !<'sͅ#hp"N Ȇ!5{0P[vժUdtEbڛOBg6s>M4:/EYQ'@ : ay΅<:) \ssd9  BOܦ x@WZ{e'rݺg"oS u'fr>X\uDp șB!w=-e˖uuDuUt$\ jݏ.,9boP_`x|cz3ȫ7=a^YwXF֗&z޾puo˗g3yn(ktkq{%o~O`U!y `@uo L \y%? <Xyey8x&-"9!v3NIg懤lݻ7^T</S;73 " " " " " " " " &+ ,lk|9?6Y裏vKǎ3D8}g/8_ \O_gB^Z}mp.zyhٲ[<ܚcH?~'^ڍ{嚂l8Sle_1Ή㝼1OOgg41r|۷QYnSs�x ns̙3]^9 yYU^ݭkժ:ƛjKkV*f4'@RO*Iƍ4Ǒ٧P8g>\w]MڵG1@n Ё5'жjFs2a⮻Cし_;ĥ!ΝabA8ﯧS߀9yoRNふVrduo=`'I-Zp'{tIl.iE#NB~ { -'ә'Oo Yst@Q2:S:dyBOLN: (#!n :`2\X{tBC&,(\Xn{=lĚD@K0hO;-s~n<Ϛݻw<5.K.Kc|K-\CzǓ^{P$JcYf`]Xgz&^]5WpfI!x^mkk=O4, I'LIf#~/i Olw1D:v +9~cvX]e&w1/{ &<ouw \x!.h,dONumBq_3E BԺFm[{: 27 ?dD |`Ě�ǂ~6m >s,Z{q}:쳝X1֘WN)R$&I:#pqe:4Ll 6>%7eٲeɓ'Gu^/w 'Ov 8)ė�)qH\x_{'XWZ5C4}N8Yޒ(h1-pnعhq^~J [f}ժUCڵ=7k#sĊbER@޽{Cۜ"PFO>,P_Lg8 .LwsHxtĂ�欱- ѣGX@ec^4-;8NsO=68?m㟎R�}sOQ g'D%:|.RNtNRިQ#t9�cp:r]nl:GJ=4,P,̘1É p25? kyKA1:ʭ|( 4m <=Ğ�P康x"sNfPBeG-9֞]4u /^M1N/ Gб nGDƋ[k;DD~|dY} ykZŜ̖-[oPu&ű�)̅U4aΝԗ`gR_}7='qY_{kqWwNm yGμ /uW�#G=o3LTeW0{+GYgRN</G&N_kUmÇ?@P " " " " " " " " " })n\ ǕR,SN4hT6<Ov{wsŜ9s0m4\wu>iVϞ=ѱcG']u(ĶpBǚo},/}n~jӦ .B'UV-[`L+8, [nud(0_|^/7lЍnjT5kuw_D@D@D@D@D d3J/ʱO>;3*@(CGӧOǟ :WH|�wl_ |(֧&2( ]$q!@O<ip)ꫯvNci.ŵ{cHK6&&v`cbzmoss%;'&NHtӛPD P�'5'YsMggR@O 8޲j*' p?j׮햣>:c+Ë/\qF:PsK +WFf\Px 蒂�)vZa۶mI/^ܽ{QQBGL3 S)BA]w_"AGf)P&'~7yi7W_z"G\N�֙/zNJ֗6Q�L! >Fؖ/n/6{9%Sb6i Et Y)N}�i%#Ϭi^=I୷".Τg֭_:gn”)S0o޼dȂlHE#" " " " " "tرn={{ӭ[7t i_*ݻ_>6Z{8r똚5k[sɒ%طoDƍŝ4h`mA 'd Qln`'cТE n:>(F%iP<@kg"Z&AD+ID@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D iAD**Fࡇwߍ۷c̙8%i~B\sM.E"Ԋ ֤t̘1 10\wuq"&ON.:6?4L$u6_&œÜ?G}._KI˖-PTw:ڦמX+$A^uJ :sȅnsB1:g1-{s@!Tz]38CV  +V#𛗁\( \W7jժ9A IFbN-:t6 (@ƺuumD :wv^"#իW:uW_bE^(o +Md}J!XH*Τ 'U\ b֝\Xg۟b\ hgTSO=xu[N@th, R Eau=9 1"?V@-CaG=;2ҫ< jÈ#裏" " C@%^+" " " " " "/<&n<6x2J*=zv"ZpbGS7n[̙J*w饗Xi#lv9y V>}: lܸ F&MЪU+lw<�fQXkܹN@gwM@{h^Y*%." " " "g9` j圝Aй$(Q~;.| al&9<[@ѱ1K/ExV&WtfW^A~n-~g\/^O|';am.M2bE#3xNv?>-ZS9Ib i1|?IA:~y \(oPhAnNCs>v!?Ur|�𭩫-|ɒ%Nqy;gNˢ(x" jQx8?\K,!zaÆnPB* Pe]A?0̢L.^ztէ-TPOϫ/YRTXbKMYOp'^5(o.i˨3 o5\>Zg={sj˴<!0r_dbD Q X?.u�ȮJзW^{c ^u{MZxɜu" " " " " " ۶mO<gyƍԩ}駻$^x/26oތnݺCv&M?SLqbL{Kf͐"l0PP/t E8΂}<tݻd͟P$Jd$'%" " " " " " " " " " " " " " " " ! ADH,)"DUVn'AG3Q%�o EgBPHJ[ 2Çرcqy@3a_˼yt8A-O\}{RU4pW]SKmޏ̙h^B: ԨQ7v)&N) Lw;',D8%رM?鐡e˖ncd~? P,N;-lY#RdϞ=EYY)"'$yJ`z"˖-˨+֯_\|y^D; 1݈M "[@1cr޽{WgRX“tmJRu&zTRQSE 4^Qz&}E}Cu[lSL T)R$` G&-S >@.Q$%'Ei4Ǐ-�'0ɐ<&I'Oʕ8q%'8<ػG]п?0m&5v߉V>}0l0ȶk׮ alّ" 9$9D@D@D@D@D@D a}Q9Q˝ǝ*'[@>r�Q{l}mC/J#{3~xPpd- nl޼9 *9UH{ԩOpdUZ=zg ( X" " " " "$'Aӕ" " " " " " " " " " " " " " " " "�9C " t--[K$|$`�a#3fsg`:RȮY"oԊ7+/>�:u7&ƴ_`k,0 `hsKg<ns<lܒHg̘ah3k:?݄tNJHDFPdɔȳ2!+Wf͝;\onrEhӦOQŋGmœӫ`a&KdH 1Ek'H~>Ͼa*2: (B,9xEV(@J. .t ECv,ߗ(B'?bB iG _yGbb I`ծMOڵ˽۱XgRTD!NDQJ֓^5+dGtd{ /g'fr0ͽ_}oV>6U&M,�32n`e>]͙-;gf~2q=8kMBM6Ŋ+\;R2KDN@%#g3E@D@D@D@D@D ?衇r 5\+R9x0(,uuL<Z(5k,1%%۶mرc1j(7n0u놞={K.(]tb.bJϟ'b„ om~AyA\p jrNW DDWΥcʕ+GtN?5>}`"/YC1ӳ9|6a+u\sB}w'|^vɯLXLb\b50hg~D`(6O:u[M7TRN8-/Dc#p"?Rp+ e)R(P9aǎѺuk)R$L?Wr/waH";w,SC.sߦlY*Y"RG سgs2>o<|7[_F ^NgG\(d Y&.RtMٝ210 6hѢN8˫3)WV-a:MD Jk֬qNҼ:[nu=նm[Wg}C2;駟v=bPo``ଳ$|Oi-Z8Ɯǡ+E Wai&j5 };zXny=z}<#0c yWD@$'AD@D@D@D@D@D Yc_7}ۃ#"I #&8K.>`RMM>B Oy<}p'"l M`ʕx1f|w[/ӿ)S&(" " " " IE@Z9]9;])" " " " " " " " " " " " " " " " 3 "1:[]`x [RĥKa`7ޘ-Ӟy&su jJcW'OƤIPR`>3)S3e~{w3sgq0-0̹+޵k>7~!輀ZʕCq \=ؔs؜L'm۶9g?Hcz*u b$b {QH"={6X駟:){kԨsjL $Vr|%*;^vPq͔T`c 1J=_oS&^xq<c袋d0SLQHSJ`}- 4@!;QR'^̺ҫ7/_۴i;o N񦲬_z >a0l~1?⋁%R6mɣ  I`vT)}ጼN9v wVjnl8qsj;a32܈% Aht@D@D@D@D@D@DpܕW^QFsC=a'vkBe /̼xGl2k}]/oK/ʖ;v8A:D@D@D@D@D HP+w@/Օ" " " " " " " " " " " " " " " " " " " xIhE%`!U 0x1M|`sD@D ! *Tȉ;tIҥzI4C髼E a΂;5xiW裁[olnliٸz]8묳PLKME.… a;DzRuR@T3>|8Νk"~[d~ 5QH-{ѤhСChѢ5�}K(dLyW@",)HD Щ1AR%W(,1K@"E_obƍI:<x0T bȐ!5k|TI&;wK ʹgN\B5h<&qF5kƘ1cPƍ%wUdթS^x!^xW_ޤڵk_F&MPbEw;֐϶T lN-[_Lo&_R8ʚCB@ɒ~!,#7olc\BIY&" " " " " " " "WϟN~!~mi>;wvc9d޽qH-vQrða3qׂc)5}tbŊ.1Ŕr8Gڵksoݸ*ѝÉ_ " " " " " )I@Z)y[)D#@hɞ,~80i0`�p90&MЂ9@~81n8t ]vuۦOM~3g@-{od8+sFA$>qϞ=x@rye-ZD y 7`<I@+LO|t.CNXŋq$�wuVZi/nh:M H~?m:�(Q P`oqGX/^<s D@B[. 'nJQ/t*UrǧڡĵBL}eVduӧٳ'~G 4+VpdׯD'#CD !-[}[=N$N~ر_|1x{c۶m asNAoA4GhtL&g41`36ʺMX ֮>'UA)ۜƎڦ֯_YUD@D@D@D@D@D@D@D@"$@֭[N:N[n^rJëѣG1]tA"Qz5g/}+ (\1w\p ȷlD梉K犀$> j%=" " " " " " " " " " " " " " " " " " )@j֬霴RB!y*<_e0Y|pRԥZ5ɟ,HOu:=u *%C8 #`u*0c_ہ*U�nQɱxǏ's+WbN6aP_wΧ%wWv[n9szj\r%N 't+9?NXB1j(tGq}<6m`֬Y&9sQtV&A )GA- F r<x0,Yۤt}Vd7l)1ST| Q`A'yf|AWڵ#Lg$<֋ E=Z;}5|Nܷ'I 'پ}$:򓆂Zl@�$3 sgP A?\쯿&=BB8hয়B9/H3=tXJ7|SZ"Ow޸+Glٲil>~ڵæMۤ9aÆnXjnV*U*m@N x≘<y'? 4pvܙ(u@H!9 F_戀?wڴiiTɬ`t`<eKC猂[PD'Pnjv'NLt3Gq֭矇 Vq_\˴3VVtKQT L_~؜opO9+$#<7pϟoxuN$`N7۷os9_N%gJN*oD&Md/_-Z; " MG'xb4jZѣMTvOjCP E)d&}=cS:uޟ(F aE|~y xҔ~I&9YTZwqk#I/NÜo U�o%]YUtʬ1_|NͿp]}8! vP؝%K ʢ@(/t8V@χ(ZEQ;vĶmIڵ=۷GӦMb ~(^%1"&PcD|Mԯ_߉l(zE#" " " " "$@z۷믿^Oܚj'U_T+ҥ~)ueED E ,XXGyxW2~W PryΜU2@D2۵k&WP /rC=4e򩌈@d#Gbڵ;}(4?<JPd"7O1]~<ChܸqsCD й&Olᆱѹsg\^:+Yn){apiݼy&=#SOرc]]z0YD@Ғ�g^pB+>p(\|E᧟~Jh.P&" <<L$ mog yCaJbLcԊڷobD65ߟn[+;wt˿+" " " " " " " "�L:_~J$ TZݓ?g}k4lmּysL0}Vb<@I+^zaٲen,'x ]Q(" " " " "2$2RHtjBr_$/ *ӧZ(r]Ϸ֭ՠ$ sN/B1"ki|aa~-`/<k`ʔׯM;X&)ijj*Kn;"{E@(R.Rk]ۨ]vvoM`&Ü2Ay.Nt,riu]0w}𨣎“O>ov PP pjB5@q7x՛טARHD@2Ukkߟ-[8?ظqcsv,Yݻ'9 cCل?>j69sT!5a"D +lF`c6n=䓱vZ'\ qHSӧ9'.՚8q"f̘{'c_\K]lY|ڵk۠ӛ@ɒ%ۗ_~wy' 1TH(" " " " IN@|"ХKlݺKr.k38aa 3s)c�{ߧ-Htt;anD&!;`d}#ݩSB�q(x)M7&ˆ$ vqoz3y<S\rX&f) 66FcիJ;PݺuS!,X�44iĉ1,><R4oŸ@SZn]`VwQ")޽=o5B%?8!5)/ W>3NؘPeH}ӦMxg]=PĜu_OyѾ;Ѥ/EB(@1wh N/Ԃs�vÄ Vn&#cs[gz6Qd㪫r޾^ӉˏٳgJԩSǽ]N]v@}{`(ط1p04FX;0|8o'k3a XYիWwm {dX<VOP/3/m ?.]~}ڳ�H7 BѢEsϥ[ֳ/M/RǰgGnL7 uhܸ1 f'q$?\|s̱q])S8Qp&D-T۷/~~%#]/" " " " H@Zxוgo2 ��@�IDAT|#pWB "-f-Z�˖dy3GIEe@D P^ã>} Сq_\0;w菘7F <T/r'5k&W&Rk֬+իWG}*C}x3N+,#KÃYf/x .L J݋f͚95-g*{ժUhm*os@g*Gy$̜9~?D U6mguP_™Dj$38#Gt"{{#"(P�\p{O8餓ЦMn@ذaʗ/g%ZB?(өSD33mPjԙ$LfK@gSoV7y~JN )BBK~=jQh:1x-`׮,|$L:~EVuB?sB ";i{W [|=> sxH2eO*ض(uh&CD@D@D@D@D@D@D@D .͛7xÍ(^x\HHy ֦haƌc;)x�-[tcEN&-5h�C I|En:'W_}58˯u*k6`2}]qV銀䂀rO@8ፓƍ:?A m ؜Pi^Ks~tsęF,Ȃ�s( ? J0N᫯�ӥ '&`|3,1ӧޘ3g*(AK.uֵgCʕ3. Fy]ә}G{! &Ŗ@[{ѻ袋2K+VĤI\9{<q ժŊS2i%K@ Ex @ӦMя)C!:uoDyUQdizR)nͽ#}sA'@\NPhQ1'NtTPH >PBJ%L25\zܹN'r9t~==D"7u&EynժU"gv9b)NPm? `SOso;|>�ӧSgǗ5M*m[EF,Υ(.XD8򉀧0e^=`ذ|2& |U*ZX~}Z(D@D@D@D@D@D@D@D@A5kO?='ul ݋|+WĄ ܘXŎ;0jԨsrE}X"f͖/_ (!~> r /xjFs<{ٳl@jaFB@^hѢ/_~A^tbOJӠg7ghˏ?>=(" &p'[l1do%6 y0< P9;>)9J[n1r(]_t� :P"2d=Q~OtK"[$B8|z!stݜO8󫁣}!rE Se0oŨ^2[Gjd2$x$: U}z^0H8sJ*SO͸ eO>_|^uy hL@: jQH~2L �hLf&Tj_$fQC?2GK&M@POd#<t^Wv'LqN=;͈$OpatCIki`I1bg6 QWGR7D@OؐBr4o`8C;OC.xO^'" " " " " " " ";5oOrynqzkԨ/Fhkʔ)&μ(RSqG$4BK$>گqӧr He@$$"" " " " " " " " " " " " " " " " " " $p饗co2Zŕ<W^FosOaJ^D@rHhSPQZ5n'NaL{i#F�۶k8q=qmEt^xuQ gqy繉ĤI۷ow{jʕ+qwnf_h߾|͛D>s|W\q谓"9 . P6> Ѥ;G_+yfD%8yI t _|17ro۶-x }Eo L &<c&2:@ڵk{6%R:m曱n:g/lݺ=/gy&~<ܹy}w|?|pkN?g:,_u;ðaPfM 4(nZ5`!nѧu,X?eyQfv=8sϹ͛Î;9[=oGN\1vXD^ܧO>M]tT*Cޛ@nήl^ʖHvtD4|p>BaXac )(CCv>#W0^ְaC, &w *$w&r`1cTHP|niCYhѢE] -֛^{5׶A=eAxZ/coN5]kf]m+T;'"wYgڌ=\̟?9Be:`] >0|&6 }7حDtP! ,[s� 4PJړSșa͚5hl13fmq�nBܬBzDj{f7,r+Cx\V7ni~;#-ݺuӉgx']5kd2ŝ= ydV:\D> &xlX{coo~n<..ˈ2_#vy?al68z̙XhQ%" " " " " F>\D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@rH'+W.W2t%`|69wI'+y>_>_R>_b>)ee0A o ɬ!?Lg>sc=as83+Z2%1sibM>Tƙn3 L;[j_"E8WF 9k.fO?3g =W^3_}˗/-Ywǻk*W_o߾VߖrטET\<hi>>WN_UZWD 2kNg9/PLťa^zJ5RsyiӦۄ|&31ߜ6m.]=[&65@Sbe_ |&315#t&/l[LQgy17w }/gΏoG&$~e>ds3G>TK|h6.Qu?[?쳄l7!s]oݮ|-Y+X3H2'%>sVcycb`e˖L̕&bd"ʐಝˠU9e]E͞=ۥl/{qF91=uxveԩSK2e=zQF.'KV|7=Gpʹyxmš~%M2&:|?wt |Gǻi,93"#\?P=O]s=ĺe%.6oyn_|xin Z3Ϛ|5&tÑo]ϟEDvڶ!d7Ĉ#.Ͷ%l7nvmpڹsoѮ瘃F_V l5t3<3>sگ2"FhZB=&* H5/jwT<C>ߌWȪ-7\r dljd|7yx#o|Tpp //l3jԨC1~g֘G9gN^YVm̪><d/Ocy'6qc |Ȍ?[L6TFc,GrbŊÇGrظ?Ħ(DI*䔀D䔜l (.1zAQ\O](YV#O{9_…}Š`Rӥ1'裉KNvD _~lٲN|}嗾x T ,E,@&NԦpСCoq4 : � SHjǎzĻl,X u _fHa¼$)EԢs]/TPnf)<W֭[f@/%\좣U/PP6PB \pGq5/)1F>'kg&!1hȑ#p7|9]ƾX;'O}(Ę1c|ro޽19eUGR~LEVZϘGRGRЩ ^V׮]3K~if`l/{-HHHml3{3:q'3NI㏻T&84l;wn K0wM@wy'̬LoJ(P<d  7:W{(Eǽ=zp☄"gĴ}>k2x4l :Y?cNt2"Tʮn{17Ķmۜ{52qUWedxG}ʒ}Y/q΁Y*Uvi&N?vk!@lNa$'I~e7脣rM#i ׯ7g.ސ(R}4bXd%+VlҍbAyZ.]v*L03ϋskVcj%ח8^7>x]ؾ}Ӡ7ff͚>5eXj; /t'TF$c,\nW\XtDO@Z3(` " " " " " " " " " " " " " " " " " " " yLD o߾<NY2eO?=xq`JY~%J�D 7.R@l7;8ؤD l �\{-УysšPjXmF&M`aM8p`Ŋsۍ7gf… ݚMM6ٳ3ϸ&ևz[WZ^|{۷qFϨQ{9 `aNr]oO:餌dy] `bVѨQׯl?3!p@2l>\ˈ/6o0<Ȍڶm?�/=ݺu3㽶 0Q}0UO+L=\+�l*J =$,wO^NlϪl1!+TR, ТE X~zbfY=f_3%ʆ}ܛLGews[GjW`&L$Gq["><tL|2QxwM8((Ȫd^٬qB@.P2'O8Q& ;/l�LkySkmk$J>Hی}7d!E, 0qwwy0/\RxԭGکL,& LKgl{؞7ahF[9ttmŋ't)ЯЫ0n\K:t�~+G-7_+T/qD]o$袋`Bcڵk믿vsn&w-3+DG =3fLcõGpqx8m#성qхCmKvL�΍i/{>ہx#74B/og" " " " " "L@3Dr<HVI1j0P㥗8q%'F}{`ᅤCbCyNHKz)G)^~6,0~bdİh̻�S"[z @׮]ɺ�V?C9Ą{ /SN9ea ,H˗/Ν;7cX܏?믿>i-gU GuTk8!=x{U!@<y&XN)Ai{˖-]+V}0'gS<ȁY]2}t 9CDFx}d1 40Qt/#9)ۃˏch׮<N:'(YNmٲ5jdWnzL#TΤBj_(Msݗ='9Rb]{BGpbŊշ e|X`N3!'ubwGC՛pI:%S2YްnC5< ?{F!k=o;„`\{-@1:R-[֞]Q$ey`bV_~#ϻ>?;{=]nw[½/xaCh\`k1+kam@z*dM\r=%tTD@D@D@D@D@D@D@D -hqJnrCF3%dr4i~''Ea@bO>q8N58 wmgrSb7R(X$sm^P,g(\[}n+TF}p;x<Ah~ y?}Y0;uLD@D@D@D@D hNY " " " " " " " " " " " " " " " " " "<H6G\|1l#{wš)R%>p)Ae+_5=d 4 'Qx"~8!-C6q. /￟Yw^"{o&Tɓ's :+O:<׮]g)u`tPJ#UhQl߾<VZ+gΜ<n}z{x,tHI+~LaPB5w}8묳&az6h͚5]z-1QCNc߾}8sݻg}((۽r}޼yaf U*{xNKNAY:@26m2Gi=| \sM[)Ӳ#@AC=9T;>x`cԙ W?h{(JzlB9X0ɵꫯ6_/P}{`HX0gpyĂab+]ήTL鯿1j3,dŦMy><-즿;8K/駟'nv7_ #ѹ33y)a2e$wV 4h�֭Vnr͋1-êhcƌѣ!;,?`2~m(Of@+_C0aB*HpmQ%ɡ4B 2x<ADcY\u'*J#" " " " "$(WJ, jI7 l<xjOJ\J<3k,K>�}maڴiX`lMT D@∦'\֯_]w t_ˀƽz·~ƍcÚgSOuk: `عs[|>@!)4q7FLÆ ݹSLt 'S(,?'ܓ%m7 ??GydL)PDc_xfܹs@w<\öm2b=0(7px}(ā�n,(I8ʜ㝘Q~ȯW~l?i'̘1#[>{t(?ӥlTzEer w֫K@틡CI&j슀Fk\JW>}{pSrRg{(~)\=FLX?Aa^|yWo:c;ӥB&S Z˖A`ig0֭g[or-QQ4m["(ջwotM7B=0i$,_ݺu L2v:,^8Ǝ۽YVk֬viG۷]D�vwmQ"D@D@D@D@D@D@D@D iƄ`ĉ1M,rʋ1->~L76ꫯv hV9s8A*:>BNbuͶr3>9W>P< yX=c/s^n5t#" " " " " $ 7Bf:JZir';.`Æ4ɴ0t^}9&xIdH h۶Nj߾9jlҼMX(X/HW]^E)TSFۯ-B,)KdY$%d%K~HEdBV$|5n;<f9{3|l=vQ8mL-O0VZaÆ*g~Q/g*O?իs9?]7n/NkOXр^z)+":iҥ;s1y睧=CǏWN\> DauYgbF_ 2>-,+vزeNJ2D>'SO=+ V${;C[^kAY/x%Zb3\pR+ lCNW?[39Xѭ:qD?oOh=.�d؅ 6LVę!T~[^a`2-In9?,Hچ{/u]Yfiz]9q{=\,hC&Lz?[p}ڴۭI^kCNMu{NíŹYgfwqMcvq@o1HvB~YJ#GOmӦ͛t 3lm :^뱰 ouZ v{( kgÏ?:m]zɒ% Nہk9 ri8#+Ðf̐lˇwAޒMj }dsiq_RqAd~3޾Oo}Cn'6M϶˖-}W={d![6m[!zҙ~/o<۷n>ߛn{5k@v a [\n_g, ']BZ* EB�@�@�@�.Ptiuݟ??r77X.S~;U:tfvޘ7O/[W"Gϵ Mir޾:uo5%iz^9O&[;#>3GS׬Y5X5r:+'Xւĸ3zhM4ɝ_�h!� � F � � � � � � � �QTX1m =z􈸋 3!cÆHFHOYd4|3)_>9Hoq4'-FqG֭>}zZ,S>wc=[p H~"[8܌s ώ ]ҥSqƑ-[FUqEa#묩+ʕ+Gve>2s~)UT+~@mꫯwEecmądMkGw>8ݿF\7|y} SXHΝ5kqG~5%.wqYmqWH߾}#fs\hQļsE#.@*+�ȦMaBb"|V#. BJ\Q>₧v]﷥6m#uԉBWO;I&3fD\,;, zB+@G\X[D9y=n7y&{# oKW$|6=W;Ҽysl}hNܬ?l>Dk{Nܮ[l%J+lqe".1#SN5:$qփ~݌\stX|6ZxQNWs;˜FͶŅgI\r;O{ݴigc}և|W;3y+|߅rD\Xh̓$^E1=&"n:;YLk#Cbl Ry{?l;~E(gyܵk׈+W-9c#¶R[v|rm?:(H/R{wgv ־+i{滽meKnׯ}qуGblgK]p: ;gz?lƍѓ~؎٩?s&`01cn7ED 8_2?~@�@�v|饗.}i{hoNsn^/> Ț 39Hf$m֟B^;a=9Nk*UDzuv_'vm;6}krqX4b=f9ɞRٹzva޼y6mq~ml}NvU=]c6v?Ǫs@�@ R]'Q/b3u/  � � � � � � � � WU7|\A< @ zz Kg:E,رRϞһJgbI$|tYHJ]&(D ))/.ֹ瞫ɓ'e]˕}nI4H4I1Ç{kw\;ծ]`5?C\Yn) *D=+zW€ `75?ӏwwZxm~K*췘+P+w14m]_.Ft:υN]+kP.]* s-t; 8 ve)w\Q-X@֭ v M$m>]s=}.-TcfÆ , ' M]taCg3p}y]wɅȅINYorEij'Ýx3qr߲"<O"ֺ=c;!1ޘIvOI~ѣGX7\`_ [ʅ%wC u.W_| ;*<L{'C9%̓JwdPj֬YB19qDDI.˱<SnsBo-r-]nݤvbvjiƍwt~˸m6@>%o^v{޷~z}~? vޤx<N.>LzqpMm³W۾ c`qΗ̘E�@�@�rpD5g9vgXѾXcvCQ{>6|PW^yfϞ &b .rTw \x;}jgcjW" cٗQsGsijO#� � 3?,waP[Cw杼,G�@�@�@�@�@�@�@�@�@ 6m%KhڵksdtҙgJ_|!whF,6 D#4bH=&rtr)IP/kz_=a_#Hen- B] by,g[Y t9/KhaZ6(,j{.Jkz :裷7ǯ*;_mQ; ģӈU-&`Ej2gxXz̦=ebjtF;g똜E )isVa. s֬Y_})&XˊcHW^wTn]qk~=#z-w݂n$,01r^ }񺍵nX8XMnL2;3?cݞIt#xI-H1|(}& #`VZcI,|ƶ3;߽{w:`�-`@a 3ݗټ?d{H޾%#5dx̊vmzճ>[(l֧~:aZňs뗂G$Z+mֻyK `s.S ?_C7+rZcbmXڑ Vx֎!3$^eSi\魷ʏxw`s{W~&{@�@�@�@�RDi;<B<}ڲ}ߓIO'vbʕJ>̟f *Le˖<yz?yر &dAshNߡOıX4b=.=>b8xX<kZ#Gz'|0XH<� � @ MD�@�@�@�@�@�@�@�@�HO<PV.X;Cs!Y &war<x(޽nݤ!C~A ܵ [/"u ubdx MG% oUqi߿KbW\qEDW\|y U-[V^{޼y&/HZ%]*U*,XWu^z97qF z҂l{W?γ+\.Y%ݼ8�Wd%}'>`~ԩ/o{+,ÎjgvXP}M,}61">[l5=,,š^܎'܏S+d!t*oMV+V$wt.sNC+hu饗ꮻUVar Z\^E�x7"i֞XџKs =ɺfWcƌ#.h>j(H{lB[-Ep-駓N,|B]f+ٗnݪ~iUR%v mO(׮ /}Wn?z:/m-<J � � � @a X0ѣuQGw Iqn뼙x5~ٲe:lh׮xM695c ẉ\{ꩧw$(pjSXXoK.D<FfP)/2_@�@�ر@W# @�@�@�@�@�@�@�@�%W7|V\iC�v(PbE 0<yA<Գ4qj3 P3՝oVkաV߾Ҟ{jy M|s+l.7H͚Ig!=P,￯o]ڶm'Z_:s̡Y>}$Zľ#_~.\=;3B>̝;W?FJ-L22W_ .gLJ<W٧zzꥦM Bq|69œ]ҡƶ~wޑgB0'|veXF[nua%ojOui6}/f}OCd$+0uTg;N{ ]`Q&Y;0;B2W知W^ |S.dMr&յk0 K<-vE/\>-% _jO,2f˗aZ"\ߌY-W cM|0$�K&@+@�@�@�dx'e_k&Y0:h]wմidAL5x\yzGtiV*U 9I;_'G3f]q#G`΁!� � 7;GR%wC42]je'r#� � � � � � � �Eqad"d@NTjUhL\x˓"3gJ헉,s Y#WtZza_~-'H6mƍRnxP%~O?6otQŋ/жj+.طphC9KWd(p }xKj߾/޽{B 0 .\fR,0J ?^O={=թSG'p;ҢE )R$Չ#yM^}JVE7!qgaÆxZݕԕܕSL,qhOB-\t+õܹ/_ЋPAn~sJWY&LЪU|YglPի}@KD7Je_%+bIaVRѢI85 J> 2r7/cץsx1O픀�op"w#/F�@�@�*`^tE|pRtܙPO/sO[Xb')L:U{e![{>|ӧO׵^>H^znn0S@�@�@ Nj2 O;D�@�@�@�@�@�@�@�@�@7o3fl_FUԣiS4&d~V_/}…RVR&;3 < S:T|OY`p~ڵyfgOs}˓UA;j׮9r6lWgY֯__ 0aLs\!Y\_0w\vm. XOO<0<+�'z-L,JR^\;_, i*>>TKI-G q|6yKE"͚5K!⃔J*zW?{!L+>D6gŊ~[aڵӓO>+WӻwoUPEv<8"ong0nϞtIK.Ztnv`A) ��@�IDATc=v}2e D .g~I6M:xp8umZ5rV2f K(mKn7ۧBV?Z;nݺxO!� � � �\{Nu1hժU)iѣզMխ[W`,aZ&ܾ}{Yؗ5kjРA">/ Y;϶SNn;Yܜ9sTiB"� � jg � � � � � � � � �/s2J׸qr{%W (QB:tit XnU.A:8iiƤi. I1 裏gdnݚbK>\o'e]vQ׮]}7?d+(_ޥtAC .+̀�"/;<׿ׅ;w)_}F$y[m w%F~%o.ܱ/ҢE ]s5zUPYR@f ,tV\+W:@-{T}ᇫhQ. ͬo| -}7r/`Iݺu[RB'D:uۣ쬳҈#lٲOW"@ XF ɺ袋ԠA0ۿ>LϞ8qQlBmkyz뭷>1[?ܳ͟/]~4o^e"w f+L+5o-̎1 H;&jj}oȭ9̜6Z � � � @(`:Lw'۵17k>m֮]>}OW~4yd%۱1[ŋzK,W_Cze0 36mx4oܟCeϘ1C/ի3 � � EŮ\MD�@�@�@�@�@�@�@�HN+D7gLV*HfuV."d<wݖ/zxy+]|( }VϞQGI>5;-ftMzTvV%6EEV$WY7ޘ hʔ)p/Xxb\VH"@$}]g>t1.]vI6~}SRg%ȜGO_7E?cؤIm֏mڴI2G%E 9wجYngY`vQGy{\�ZU>6}E.L֨QoZi}+V,>3d* '+`WZư~lڴiүp .hZW\qE<x&rV^~[ڲEn{/r9U+.ZߟZ!`u)=hh{~;wwI6�K!� � �s,(iԨQ:餓tw0g#I^{'#f 93#G}ݧ }:st'jvKӼ/SOuui/uV/ � �p R%)x �@�@�@�@�@�@�@�@�|P "xZl ŵS2Seȸ瞓 VL:u~E7.T\! eh=RgYhir̟?_]v/bޣG_TVU}J K. :wNߝijhA[+W|aiݺ7o2edy-!y裏|w+>o<uz5kQ,{* ICH睗J&a}6mN* UJ nx<wu$D7̙3'9sY9_n.ab_$\[ʊ/YiX(-'>R:uo$\ @Z|w>t23?SxWlYtgl%JHe?x_ 0eNC^ KҚ5r% ֲHq [40\^q4ydb?? ŚkZEpS4vR%w#� � �*i}EP-+$,);?ιϹs=0™{b{L//]SOUǎUdisMoF?Fs^z:sէO/_>iIC@�@�ؑ�Z;jm߆g@�@�@�@�@�@�@�@�ء�"vH @ W_}&M/yI Ұar2r5t!Ypk"w\0Vv%P.ꪫdN^z:Y&dҽ{K'].Wh=!(~嗲+&o]\H`a6Zq&MU` 3J 5{BV~E?,p [0<aFe^yE:<M7%XXV1c-Z$NjڴizQF[/TD@SHzիW3g} yf{x,Ԋmʕ~h`r? #>37o?̆ = a4 >?7;_oP K_'oa׮]ۅLN T6o짷p-]>jªw K>Z~kIѢpƲuҸqr,Ν;zz'Rɴ(ym � � @ [C HulٲE:un6n{s=j޼y&D^vƎQFws'-s1֭lc*%s7c5k;_\J*gϞի\@�@�RQ@jjݎw"� � � � � � � � D%@�xLt~'> )utI[o(a@ \xa:ݵ�WWZ]]*W46J.U}}Gu7k[10@]t]r}{'o0cf-\Y/&o孠u\Xdқ4)yy|0֯_]vE 4)V=.kɅ˅F$D.Up3gXo(QBt}-h˞c@ Vt @¾`w j֬md EsX~ޓ^ϴmY}fr?s@ lذA_}sK8m+ )믿TT)euai}讻K{ۊZ>bhW�-j j;|y 'H;s-FbIyÀ@\\U}6YUj\&Dv УG_t̘1;x%O#@ pd@�@�(x5kСC?|Ov)_~Y<:C5p@qS<c޼ ~ 1;`w!QG:Цxi, oҤIddU^]]vՉ'菵-Z,@�@�RZ@|jݎw"� � � � � � � � @,Yșgi2ؼYM#iI\ZK#@?kHU;K0{o;R_+W֭ުN;MrA˘R6MMb9-mj?|rbZ/(7 Ka]:OҥS{i}Z D"w9 F o?藵lٲ׿]Xp}yߤVk+l݆XxXP|~nqjZXF Dcr?~u ȥ ޷9+dC2ed96Z` 6oX)pǺ4bĈxNiA`ҥϴ~33TJ[i}gڵnšLشi,YN ZllDXYi Ӳ~f3ݥSrgy}<ZOj B;N:`-aFPza@ _K^* .]xaVX|-HN_{]� P+R@�@�@ ڵkCf|;%e}zݾZj9]uU>X(L|ɓ'7 ߻\C9$kl޼J(i4)4< ;ܺukwIgwX,9e#� � C@(|@\B2@�@�@�@�@�@�@�@�b P " !@^>h,1~ErEhXp9 y&I| \ `S' Z ĂoW.8p/oŖovavߐDOuaAoH*%Qܔ]<w\b!,6Z[޾VL KhA [OX؁}m CQB~4H7Xp( - aHs|"E2Qe 9 G1 J%6/^\իWs ݲ~}H~w~[+NdZ6Xȇ}@Ag}aQhClRz X_DumYv?d-`%h}egϴߟJz-w(L \}4oFoW}}-4ˆ *>378�gڶB˔aKu>9%oE(;V.-٣ԫԮ]݂ջd@ }|mOxc.uifgִi8ކ�"IN@�@�@ y/M8kN-WvngGHvmܸq~UjUםw?+y?͂m{0+Wdɒj֬Zjǃ:ȟ\ É17;7ȟ1c-[΃9̝lo{) � �!@V?Gn;@�@�@�@�@�@�@�@�" @~a]s5Zj+^e:)a\`\I@ԢEj.F u;H0r! r>K,u qŬrvc2U;  &}<xڶm.]ȹiӤorBK [я?U|{= `P+$ocx X` zx Àb]0Эt;fnhm6ՓOn{{Xb_[Qߟ-TBUÈ,(~*U20N,W˻5kcWXvڬXQ PXa@0lyꫯ.f08lp;,`'{ium7goB_f3O'#`_}3m�~)kB[gaiYV0;?_p}]؜&, G>+=4g߳Իԧķ,qϏ9/ . пM<Yf*3K(HΗ,Hm� � �#;v-llٲ8KN|Ja>`Mw2k^֭N:$'O/ԇ~5VLwvS5iD7ֿ/5lؐЦHW/9[ Ҳs#9;e˖zպuk|ƹyM � �)*@V?8n;@�@�@�@�@�@�@�@� P�M[PĤItQGmL(u\Sx/KBI,X+%sh~tRldIE]w/Fl*x`R^-|ҝwI&Jhh %E6-ZT*U,aQy A�+Wu뮻0g/Vݾvkx.qƬ*U*+~c[@JXn{; / B^{/wUU,F° ?@Lnomk$(Z.}[`ߓn!6m° j[;ǀ@2 {\ u2 Íl=Uņ}exkDL+Ɛ_1woY(E+fYinai֧v9Clۆ=|)S|aدQOϥ#p-Oߡt9 'ȅ'FcbZcS_ }ItM7nΝ[ P@�@�@�ǏԼ.J8�.նm[Sv4w3gΔ1SU:v胴:v C~w>3}swc޼ydBg͚ܹTn]?֩S-VXg!_}He-ZH .sx؂ll֬"@�@�jdՃj劉!� � � � � � � � []x&дiSم~na@\yj#<.eX=w-òvMj&j^hd`rxӥ 0_ܣGY B|v[JbRpb,hJax] =X *bVF}pFxk!6+WέsJ![ڵk}qK ZJV=z}` @, բoػ} ߟ{ӎ mnhwoa녿o}z:>\>ںlٲz`6o;dc~ "gƄ}ѣ~X u~-vc_];węZ c ɰߴ[{, RsC b}d_ZߴmW/^<zR/� N2m]aߙ{aibt_gڶ}O&`Gu/~hmB B]1*=kr̤ϖ?_rqn]=\ŸNۜԵJÆ~XJiI v@Ղ0 Η  � � �$@6m|w}WŽuhvްЭ]w5$kbڸ-DT ˛L-i„+s;k9Xʎڹ!6֨Q;ch祦G7g׷~5i-7-6jȟs_? � � %@VN!Pkx � � � � � � � �(͂{  *YXDb?An. (\xҥbJ_|!YSӗӲPv¶\g 0aySOՍ7ިu&̙҅Ig% &լMɆYq+ oD3YQy9BVH> \=\X,tXT)?ZpL ل](a?ZMxnׯ_uv޷Q,Dnu310& = oݷ"6)]1? CiȐ·#[ N|ayYapغhχm=oK~TZ&mXet_`}@8Z޷u|8Z?}? {mXȥ aKmb90 VɊ͚5Kx`&,2'['Z- o}kono=m}^_ai3þ2uwWf*Ʒ&a_GFai6}ɰ[{m xeQ_ZEmK!saZ9L4K:#]qI'Ž].ڷ8C&NJz X3WKvNKeN{4tP-]4M[@ /4ނ� � � o;&gg̘G 9AvPMw2W $ F }OkFǎٱU;o†ڟp\xѲ~61 VZFkC ̞-puI9YpԒ%K},ew8X薝j[v6<)6o8zxܾ5l޼9_;&mcx?<Gw�Ȗα k-wBo:uVZ  � � ;rUjR1@�@�@�@�@�@�@�@�r)@\B2ȕ@X7Pǎs^9w)<,)K?_6-z}%]om% ײ[w&CXq^Li} _ڵk'}GkwKW\!5nMFYABq+r`cevQV oby+!,ol m} k6_1gBe,(.>mZ;}~Ϗ ǬъhE P)?ߠ?RIaPVu|ta0 #VE, [ۺ?\[Qopom=a᭭mu~x?a?mly/a`ѣ 6+ѷ7!Zf€�wrD +Ā@"ݎp)ό7>3Ve[gZ3gڶE~3Zn/3-eV;a A3eH.zK=zn&6-4~\XR˖5Hݻ˭{-Z+-~;r5rշtrۓ9 Zmݦ~g@8_ � � vW_}C̿w^w>pv<.<oю݅"v1<.hM) CŊ»w_իWO 4P} Qk_I7(ԼtR;\ [�ժU| UxSqt;&kovΕcv;<}߾qlfǬöʕ+,;%-8€� � � P+lݎw"� � � � � � � � � Wu명7ʥlWڴ&l޽ŋ瞓+JB k+iY6~6 $`-O +,k;պ.uע2]޳gO_xѺ[zҀTNZj/z3Ґ!R&GHXӥ ! ժUl�(BBuC/Ec]uT]d/~Y1{n/2E[v)KըQ#ߋl0(nVDǞ d> ,t^Eك?ku͝}ȅvm[xS G۰JX%zo}Bt` ~o6=Hʕ+߹b@ TZՏu3Jp[)oaGƺ^ЖOɰӎnۭ;nRV?mtoþnm[gHO.] ~'k|1TNj&]~`ˑ'|w;W"ؾ_m.s4bԨ_3'`w.0g@�@�@�@�Lv I6f7 A# o~x|2<.i\;lsOJTBeWK`"馛ml/J]歍e;6Z@ڎ;~~,+ >8|̎Ţo-[Z!v}ߎm~0k{-_5 � � j5@�@�@�@�@�@�@�@�@�H 裏]#98aRE㓡)`w>H {,]+W8-jJ.|F[cȐFva.4x%U 4k~odm>APoH/uל}t9Ҿ&Si�&7K>{X"&4ЊAHS`@�(+c^{h޵ vCG]37 E`딭b@ ;[lY?R#GJg)=T[5mj!`^x~i1[@Rڍy-Il~xp\Rs^93gJw mLzig_#<KjEd@�@�@�@�@ )J*1C/tip xY餓$U(c5;ם |;AxG�@�@�RZhJ#� � � � � � � � � f={ƍK/ْ8YʕP Џ )#u$t4y/ܹZTtQĉʕۦý { '݂مڝ;K&I_-Ni0f͠@OpIp�i/`Z6T/$qÆ &Z�X6V+ێ (0^-fɌRH`ɒ%j۶ƍBM@ÆҘ1r!#z.w5h2%8Ӽxqc´R/Y6oޜ M � � � � F? ]xdS'\paZiɢ � � �I%@VR}4@�@�@�@�@�@�@�@�@ 8nǎ5bĈL`sP+(׷tiAaW�S-Pԝ1m=' d׬zKJi];.o?.nu2/ނz υRFt 'O?MeUKvi2i„a6ݺIFB M@JtY,RX Z>#@VNrx!Ciӂ xLi+:H[l=X0|4i"M$"':}t.:M,-?ɓ36_Kȳq֭XZ� � � � �)/rtRĉ҃J_~)-S@�@�@�@]΀� � � � � � � � � �$p"adɒdjmI2ťFZ.LFTLCТN7N:i*[ʖՓ f _ڰ!If`O?]s]X2hB;wԩSc"/+Jxrc(o1 �  \j%AkHjU\9ѳa M:ЙgJW_-YCf Kս{w}ᇪ[nfd8 PK%˛} l졇nY9s֭{KEO?H2E)kwt?-@�@�@�@�H55�jI>+ "-Z$wd0 � � �@Y@�@�@�@�@�@�@�@�@�UVգ> R$TSٳ<c@҉'Jw!҂҈rKr!Ҁ!"I}H< M&_4i`E?\uzu֤\V u ^V JI\#ը!5m*]{mݴ))F!@ ^-/n o4Y<_`dɺ  P.]+ygϚ&g}͛kԨQ=z|I3  ]wϛ'le?K%w=H-[J|}PULPHec0  � � � � @~Mff\oFdD͕"� � ��Zϼ@�@�@�@�@�@�@�@�@�!PxqwyzꩧdB<]vm??b  wWԫW5}dΙ#~?\ZH:} d^iwFk}3:u{ァ\z>zzdA[:+'-/Z%z0AAk/裥!C3-[uIhKzO*Z"!b ݒi3MY2 7Hw%-]ky66oެЗX>sz鷠, hZ93(jimzے;v~ ,Y"{tҾJ&5j$/[ϦgrE"kegΒ"� � � � P7Jws~+ŋ}˥KD  � � @a UX@�@�@�@�@�@�@�@�@�=\*?9&.wHo)}԰4v繇�(V,(ا![sJ_d|tj֔N8A嗥e?6mhKZ`;0v=u-Zref),)u, *-\(}d-8luT|B710IZ$˔IEdHY Ӳ0jGH)6 `(K/U N ka|vx.�^s=zXQFa4y"K.~x|mb-LL޺u/_U+G]kˋSOIGEӲ, � � � � �شIz`AHKH7 G|T@�@�@�[hr7!� � � � � � � � � UVUng&�Kg+>g>룓ON:I<O7",d8C>E1cSN6n[K]ޕ*T<R*iԨov˖̈*phذaZt,rK"g}>;^w9`sI?$& "YO!oI͚I,3Gx @ Xe=  NVr~2 lr֮]J*wL r-PDg`O SR`Ky93]O;VkK.DER!%?P]%K[ ^-پIzi@\Nzy+6m}vOL\Fv%.e" � � � � �i(cIuHKzIKeA3 � � �d@YT@�@�@�@�@�@�@�@�@�Kվ}{M>]m۶MBc`Go_A{޽ Y(R$.`pGϤٳۗ_ 2o*YaQ[m!1@ʕ׃4`�9k5mTv.2{*f)j)0ԫ'hY6,_."(b'҈K|<P G $d0 @r  B +-y €�'ХK�vk,}?<xʔ)awvȷ[%U=,_@ Ҝ9KvK:` BcGBn +TH$_1 � � � � �;)`ݩۺsϕ;[Zu''@�@�@�F@(Y@�@�@�@�@�@�@�@�@�t8CԦM~8qb-S�:IsJ](>\z `�f,@ ]kGo{b/-+>iqkU Ž7q 1J*;Ϗoxu]իWW~\Xa_UT)sN$'x C޶l͓,\ˊhƍnݠ�AmHZ(O)#|EJ_7G@@j%@ 3VX4ն?2a)3Maä .ȴOvp7x֬Y+B^{J. ͒!P{%=ԭ[բE,w /K˖7Hݷ�v ϪS'/,j\nݹ4 � � � � �1cIKg)pTF_@�@�@�2Y`@�@�@�@�@�@�@�@�@�T߿;8 Rqi* @2CI}ȅ<4`;91^�qm7u` 'n[a0`{N ؤdI~Xu xd;ƯZ>|:u]viLBٚ4 pv[J_}|̑l%K^^=$ ޲q=ép�"`ő+]@ Jϔ%B ʕ+Õ+W4!@ 6N9OȬ6oެ~oÅ,UJ̏"Եk/7G$׸<@?n&#ۍKI&]+$(^ֲr3{ ~  R{ � � � � �E yN^}US'/S= � � �(@V:~, � � � � � � � � @tE5EG6ł@'HCJJFIw-Sma @"vApߨ# Î^yE`zZ?ZqK cȿ@Vzƌ~Xr+@sz *F8E, s[C6l,ƅ ۱cŋJ[t+ZvPd5U+{5ZeHNsU[`Ŋ*]v4f(tۯ:rdP26L< Y3<S^{o[Z@ ~G۷m8X/lm߼SY@*ۗjTOnpM}abAXv? ɲ1 D&WmK1epH*I>Rjhe@ r`@nx � � � �+ uohɒlկ,8 � � v #� � � � � � � � � VpkE ZJ@.<Iq5BuIRHMq  L]i3]l[#}=G��@�IDATﶀ0h.: ;/PT)/[3g7߬k׮۷<Ht4vHVuRi"髯o>T۠X޾kիhccaqV�I&`AyV$S [vHo ~l  @2xtR~A�IR4F(`qs=W\r q1  P`g l^>ŋ xJ˗K?$؛êl_m*GZD0]՗pi}۵l7[݆Ӷ[W8o;۷%vWE/@V3G@�@�@�@�RE`i'ڳ4uje@�@�@�@ ;-@�@�@�@�@�@�@�@�@�YSN]z'-E[1BB5 nEHs,D�, *cҖ-AܹR8t]4Bu6vAmS^Ntl{~s^z3P}K/KGi[ VX ZZ+Dk[6S% mok{l}Un6VsH@Ŋf@�@Um 'b UT)~dJ oΒy$د[H.{zg>jٲz!~t(Xki޶O0ᅲ,. nE0,UZޞ΃Mھy˕lیM.;h`# � � � � - 7HvZU{6]hAV@�@�@�.@= � � � � � � � � �I'PxqtM:uWH6Ҡ}$)/-]qtU{2j\ס 䓷{P$t޼ hnm`AGV,WF.ۦý .]ZgyJ#\jQtyݻ, U[͐HmEg9$B[kYvr3V^fAZ Ѳ۰mx[q<غZ矃byoA� Xv d@�@ʤҥ@ѢСR۶ҋ/Jݻ"m׭[)ShzW}V͚5ճgO&CCeJ{M>Ԅۂf͒fvoPA__WOEUk~ń< ,Pk]wM%c@�@�@�@�@ 3gAZ&IK ]VN!� � �dܙ@�@�@�@�@�@�@�@�@�]W^2dz;6ٛKRHI\΋N:I~;G .\O*Q""J5 _/͟/YVx;|xrdG-L˂v%zwQFffdJ!^ZHES{/IC"$-RY)%%|Wspp}>s>}_u_}뭷jر!\e];,q>ڪm)S&cyZMdLa58`Aoѥ߶\-ZCuo=˧q/[V {RR?^P۴ijEE /搹A�Xd+իWϊQ1B֭OB)_§燾RtR&K(rJ^Zk֬ }m$]lc-j;< YD RQ\6}Djn?XH$}駚0aLֺulWSo*sLHͼ _>Lz]Kٱzc/}4qb_?AvzmgHC�`u @�@�@�@�$[_?7ͥ#_Sj֭[/� � � SujN-5A�@�@�@�@�@�@�@�@�@ vy_~5kdK&\wԳ,F(`Odڣ*P їC�e?i9u:!HCs?ˊ1G jEIO ܪ[WC o!C袋.\:؉եKP:?[miٽ{F}KcV3kyw-򧟤x+Vl>V{鬈xZqȖ_[Mܗ{GJR%ϥJfN/=6L2,;ˉ@~Xh-ZO̲"4HnȺǒO3g>c ㏚;w~kncf0zX,<ó|D_}!Ƶ6~J<h%Uݧ_K8|<˟=Cyyi!Dk֬Y ]+`;gp+C K~UjFٰj4fL=DGd~OB[*Rdǧ@`S7ۖx@�@�@�@�<.`?qRR׮ҧ~#<Uz%\X<@�@�@� P+$ � � � � � � � � �,Э[P@z:7rlϯVT#-tt9mI}J=z_/X+A6hj-[q甐iӤaä;]BU<d{z)cMbŊN݋S[zW3 &۠C9D{%ZUF=?-z|/x詯[pq}͚aZ[1(h/{\K/uŷzz=r/Y+ЪE=l�%%j%k -RŊcԌvPre;8CV[2ĉC<y&M´<4˃麖դIuQ[5=#iyVv?-a^fK-X%`=+χM/˃5/?=˗þ֯_6WY:|}?7NUvmnZ={ AZ 6TѢED�x(7$zIӻF}X{d!K<9  z Z � � � �/~nYzyidHKO>vo۷נA K� � � CjOF�@�@�@�@�@�@�@�@�@ g꜇zFvęZZz)t-ҙgkti`a@ 4my̙l%jA[qؖny�W~l)YN=н8;C7UVsEYxYsu9t/2ѲMw$oo{ײzu:?ret/~%au~i5ķ !Vxx.=,~,eB[%ȃq//=䍆�#@V %A2ZSBE�J'k^xa#�c-fܸq0aB )>�p 7q!8P.myPwlp_>X-6{Xmc 8{ \_VЭRJt*S*Uن;H2j0#W{KG-~b{[䓷mB2D5lVtSz!#d6>F�w!� � � � @7O7S?g=R_t:udLjW/lljsJ`I@�@�@�'i � � � � � � � � � ,m۶U׮]u%hʔ)d;kK>++*|tiM7EEb- &r1 =ШQSO#ki(h/N6, a=g$J>ʋõzؙ޽|ÇGQ~Bh?ܻjz1iZ yϪ׊/_E.ywCjka<.`i^öٌ·2?mxW|{KO̫}ytyK}a jm@ ~uZbdu|##stR֛.LM8Q^z`sZF>1 oyؕay^z.�!p}~ߔ\)}u~:uP.MjG>@�8a � � � �y OvTglQnƍS � � � & @�@�@�@�@�@�@�@�@�l8p6l|P^ziO h i� oBSv#N @SfԽixq![qP Y=fUUʕS){ImҤI1bDO?9f͚]vj߾ZjeD˓5ʲ>gqֶ\niX~8NJ;ߗ //[Kzuoee,PtaQ 2vrC?,g'|R:7^@ ,Z(LW!@ }tܻڵk7 -Im^zݲ29ae1~_rbS/KfNz&=@ Q8n$% 3 � � � � KJw);I*YR\3oذAguM0A*Ui@�@�@��@�@�@�@�@�@�@�@�@�$U\]=DQ${|v=X'n[GV⋥.<t�lnxofgYP85ٚ1CvRuTT?a=H?‭z~$skbUbe˖b|}Yv-_uAY1ڃբE y( m8j[#{W- ̄v|_|K΍+d Dw/KJKty]u嗲`,)SK]/- XbZ0<(0pz>Y~;L6m .@Gu7nEB�2pO}J_}5j}'+?9gj<$߶c!� � � � @XB^i@ó\ /MYCwUÆ {@�@�@�؊�Z[a@�@�@�@�@�@�@�@�@�Qns=뮻,݈@ T" jҀ)H]&5h3@ .,5j 7A[wZԜ9xNyЖkš[~瞒$S+S=}G3Fƍ 7x ֭[VZ*y ţK}3~_۩yҋ@̛r}>/ xVeo[+'-wM'gRvQK#G]rn#@n =E``+ 4HHI&+b#S}tiUjՄgf  +~U]zYihr)Ϛ%=Xw( &u"[Ik <miIAJC�@�@�@�@�<#Z>t]W_-]rނ>SC � � �)d @�@�@�@�@�@�@�@�@�M>pwZx):Լyܜp7K^>-x;(XC|â#@ 쾻mM'9? ͜5y4dY*$ծyЖmU k֬)g}v9$Z&LЈ#tw[!QZlf͚iSӦMUDD_<,>YEfZeR-]*y=[�=||3?^TRŊ~v] Y uVM)!@qa/\CC�)pB m� #/^|E}zΝ{#o0/3� 3KGLx`4#}$sge^ҙg /D <PBȒK@�@�@�@�[WKKjUuR[^QFW>}8C4ܲ"� � �lM@ 8 � � � � � � � � � *УG=X_~9,0A_|1[p wޑ7 j@"Se!.D�\ v6<fƌ(l!1~RRԉǗ%KF$ի駟f W~O- 0@- ֭gyoܸY: 2-|}[qђ%)}躽M*M& ɓ,C# aCT {*U{~ʥ U,O^*]~ԺT^V āZiw|<O+z& r]^}Ua[N8=jժ喨ܹJMC�~7|3 `- ϙ!{0騣wwD,0yV?@�@�@�@�@ iWtmѱzIW_-ϣ[m};8曷:< � � � 5*glM@�@�@�@�@�@�@�@�@�H` ʸxN"NR׮Q4IzA+kN;- ת_?h Heʊ\G=|yPܹҬYm4gvm4t mծ--z%u!xn~Wy�I}k޼y {[YC5$A~?-o ,_]o9/iÇW޽cm? óa\*E=3#`4oɓ%{{x|SRQYS^z BPx\"@ dE91EEʔ)<0ڪT]uUvl=`χ!}߷ヘϜ8q]ɶBq褓Nu[y^ȑ#UHuEXrN@ ,[,l7+3f+f/Go߾j߾ 4}yˤwgɻ4bM>='c`;W;0?R4v!@ Rn>}Vh`-ͨE$_Pf@-m� � � � �'ns 8E3;SNvb5 -;~pȝwީ֭[mNJ zp&ަM]xe]{Nr@�@�.͏ͮ)1^@�@�@�@�@�@�@�@�@�rږѿO{ի`l@&ғOJw%=4xCҡJV<C�vXk{wI ~J ۊCFB<˟_TZ~wz ѪLzUmk[EoFSLԩS3rʩnݺkBc kY"O $E=`ҥ aj~7?l={Ѭ(A3[jk/[[opgS>-nQ-eYFy;Q@W4V"@N _VdLYDPT߁f}f?3}G{ժUWklcǎ[m_C馛BpvCfZK >裵d. 7{-I&޲h o~s!0jKd[,X,%{Ζcs3<2ʋ~B wy眙0SA�=;[F6- T]Rz]fA@l@e � � � �dgI>Lo_jOtbKymcT%>&LдiBVfH{HH=?쇜VZ_z%!pӛo^ӴI;Nn#� � �)@Vv2n@�@�@�@�@�@�@�@�@�r@+А!Ct9h!$!&$ȴ@ٲҕWJ_.ٹuza=E: ,%ӣc@@ <X?-z(l˃Ϙ!yպG{-8`+-*\8% y`V۶mCO=I3gΔcKUT)@]F [V׻/XR&ѣGPK /0C&¼K.$2T;ZKJI#Y[ׇƟyI J=Lc2+#-Ce!)s rN*B޶j}sSB`G-Z͛N~w?ܾ8UK+W,Nzma<ؗ^zO>Iiׯ_?[7ÇiӦa.hc@DXrm˿0غuԡC=!ڃ|teIBٛڵ|½N?t=! y!sͲ#EVLLtژ-g]dQwnD� P+g � � � �;"a+it䓥ߏmޖzȓ7N;ÜjժaÆ{ f0->#3glX?--bpGҥլY3|ٳly_s� � ��g4A�@�@�@�@�@�@�@�@�@ D)/롇R^kR`>w6*x]=\c"Evh2<i5q`mY>zK??:uؖlv>M;֜'J{ݩ?3{M?ʂzhժUap_7EJ۫VRJ5׳YV=־lkD$L+_ ӎ ̄@iӤoNz b{ &MLmw٢`Tۥ%ӎ *mK0~V`…aB uhEX}M{o{୯׆ e˖}Ji>)SX%kny?wΞ9!<ԊUL4~}wCֈ#f͚6cQO݁;ח,NW]#C b_Km9/FC�';]뮓#?*!'?�ˍ� � � � T3&M?^z5^[-Z ? aZ>~>˴xcE|Ŋ8N믫xS _So Zi � � Cj4A�@�@�@�@�@�@�@�@�@ ;w_]}պkC'4et7+`uտԯ{O;o{'@�\s�}Dڰ-ݚ>]z(lkd9V8Ӑ8pö<<#7Za۠Aӛ3gN^_~_zqrl|P݃kkW>3 4=uQ'pBxmV-қo~,)U{+X|r):SS=<M6 vZs=xaРAz,[ﯻRe]:qBqQK[B /0Lx_ /bbZO</w amw}y\xO'OV%lt-sV#!fyhVf5p72W duRR˖Q\VX!Z; QSrH?sV`XYR^J*aꬳ ={^aIo=D{ 6 ߲$Sj„ i+/b llv-Y$}qyuE/,rN{,C҆Xz|Om-}AO{vm,KvlG:4Y{{Wƍukô xgρnm|駟ȑ#UfMz!t/`KImg){"5 [<pہ+Bcǎ ~g-wCm׬^\$?7<y䑛vfzۚabA�StlO?3>} ? do'o@�@�@�@�@ 1F>TFo~ �~,)gf=~9>#>'|ox ؏|zBv=,\rK@�@�@ RPϩ)2@�@�@�@�@�@�@�@�@�.[N>P6[&HbܹuNN4ԫ'ҼyY<QF�@e-dO">+ 6L[k/Yzᇥݽ,,HTɋXG^eACҥ`6V!!z^|ʔ)ZlY(aK^Ð~%[|zJv-^!pB j֬>h]r%{B!n?1@'M<x>`ysr-X�8@kbΟs2n~"ey,۵kP�_O/! {xp]zZ|yS|IݺuK/n{!xczHs9zꩧO?UV!H G06 獽"V![_y=+j<d6M@`;Rj}v68̙3եKڳgp?{h]6o< Do{0YGy$kmEh<>_'Kw|E=gڴij߾Ю0y`oSq/N8O~aZb\s/G} oyq8 9gZJQnz&M@mkImyާVA|=-̷'aZ9P<ͷ1?BuN >ߎ}of̘1DZmM�+#ɳ=L=vQrĝo O zʀ[ƌ� � � � @cڶ,J%KF֖ô{~迵/_>`{fONjdNJ >\F믿qq.!8ˏV@p<saD�@�@�rJ`NM � � � � � � � � � @ M/b,p-"!L^WB8Qzj8Da2ɴ\+ Yb$]zOe-JV:=gxڵeaE)=N;s.a<^{F os-e1DbfIc^WVppҶ^zM.T"?;/uf0,< >,=c_gq7nQF(|77=F6/ܽɓuwЪUZC<=qB^z믿Ǐy1cƄ=PѣCbѣʔ)N::8?p_nz>N/EzV>}6)( \!rT/A@T$^+ò, ܡ dHW pJGtQ3)yZ55qu^_zGu`|x_K-?~WE<Cq|] -^8\ 7`T_Oϩ=ؚ#[LIC +<w=CW\n6L.+z\<b mgI=]ci[8=gΜǾ!YmyoGomJwmaq-m}o8XzogOî}L!Z>[Vi<4o雄3?sYmM!@b xĽ}J9˒@ ,\0!G�@�@�@�@ !RW۩t0egnֶ{Il~i9m*>^$g~+rS"?*Տ98w趖濩{@|p<Qf0su@�@�Q;:� � � � � � � � � �#P^=y޽{cǎ&2'dN~evsϗvnHG!*1 vY֭B⠭8l??Q6ۊ[LmiӦi3ג<C<p/x b^�^O"f+nڵղeM=_Z~|֨QP~p /h퉖5/F~Ҽ=<Znxк%KZ㏇y9蠃zo*{au/U=(-uVZx|Z曭XUkEx $9/OyvZ wn jwޑ7d.]ޤr5/{5;9+jyQdj)Oo|9Ŏ|7yIoם.] 6lk{\r=*s=[nxx86OqyvZΝAFC |;>K/}v?r:D+pò'D2d<˷w֦M/^\f ZvqF}'~jؖbF=!Y~zg]Vx>#7~@i|GQ�6N]qm0 @ a|5mϑ;NY&0Ȍ @. $>\$d � � � �d7HIo%;H;Ԯ]G3-lݺn`8V33o!gΜeٲe; '~;ZD ᘒ:u߯3x*w#� � �9"P0GD@�@�@�@�@�@�@�@�@�@ .pө)S08B <Sn5td! ψ6ZV>YL@ mhӾ3>a[q-/a oTI a[~LǛ.nYk~"3gN?m𭸸`-_k׮_NOoq[Aa ~R}궵e2oqŒ3º_~z4\Xi=xw0`ZjO?Ԋ5|"iSOpG}4i=C:S/_߾}u嗧}*sIs%z1=M :˥eϡ_x>%D -ZL{U[yu}om]/{hɻqN||A]!u ~6>`Wu8J|\el#RJ~;u#L+׷W`ԩ!׃,X vm?y~ydoEiX-mjrmkIzCmUSNNX.,}C0 `ibcǎ �v!i{?3ۚ@ ֯틉-H]'/C |fI|v=@�@�@�@�{Ui}c8mm%q}[NЏM-IEͷW^q Rn]M4);2W^zm۶ !� � �'7ƌ� � � � � � � � � �9(Oo^߳g*B {;O" FFsC`.ƍ# @ E`eOnY:s? ,ӂdT!5k&+v("N'{-[OyΖ192jժ5~h>CO+CK(&Mq/,>ydE|Ǜ̖yX&gpA'+VbT^{-t?ذa`4"Os3{y?o'Fb^ȕu* ~5^Nu&+'qgO-SG ~}uR}A3 x*/>@R<9>_^3<T+u)6ln(j^Ƀtoc{WK;]x*T(<7\"i@9hܸ<i{'L/zrZ<\ j+-v<N4/f|-N[ ` mڵsW^ վAgvt[s !"vlO-N.Yf!aZYdhK6輴|,  � � � �,?q/M*_+7s17D{q"ۮd홁 /\=P8#.YnA�@�@�T :s2KG@�@�@�@�@�@�@�@�@�@ `Ջ/ >i1<a4ô<hCdZ^ۄkA�,(UJ%w\7FE65kҭJ,9z]ˤjԐ?\鮻_,JVD~o]&M<0`ԡC`[ŋe.]X1kχ?Ydf;T0  j_~eպup,+[6B۟|}_WڼAxGuTc1c:uqxpUP!zpzjղ"λu^ {_~%ϛ}PLYSj@*iX#-��@�IDAT@`+ZZ˖MR-| 1(=ƃk.ymn}_O<e=4n>R}]\KYBztܾzg]{w|,L҄k,O>M.ت4 {챇m^&3fL߿>Hri�ߦ_<d.JﻻmdǏC=*-+:vT|G2l}k>E?Ndn\e˷#ۚ> dWv(iopu/c 7#K� � � � \*NWϏ锞}6 :Xqۿ, q*Uc=su=>#X"ӽvoZ;w"� � �9(sNI!� � � � � � � � � @ k.yNI!~3L*}}tb /V_׊Fa0k|15@ vE][ /; 0ChgQA]˛ rxQ@.-+'tuG]?x9JzրBhm_r8NӰaB@ɒ%{M6 Np)ǀh{vm7]}/8]KC^}ܹoR]S%Jc</\=zhaŋKi62B>wԖaXC йs08 ݻw(0%y}_6mڄvәg:%Kѣ#~[jV?,Ӳ?aC Wv߽֬YVZ}A/2uI/B:*T*[x׮]cp!,^a^V_/{VCeȑa}Cd <8:Wy;zHN< wiРA!/ A]SmǍ�8>'|n馍  lذA#F ,}u4jTͳt!l KrmHgax@?k|ʔ)fݷz)V]f-k^0/S 6 ˾=|I'K'? -[6}mGAf5S ˗G<v{V;vɄB?LY@d~w@�@�@�@�dXP^;T~ΡwYԿgG/9s{ftǒ3ҎG ~iUt^NJx @�@�H 0# � � � � � � � �(C9S(=gm׫SN!�믿@ K!O<\˳ExCYWy1Da Շ',& #;q^~Jy j$/[Fe||hDvZb)c'Ox90˻ᄏg~{5_,hݻ?dAD7iҙ!୷R-Xe :TS<|͡ϻ&[9;tO?q1l#UNPh6/ -? {1|7oc{!"> {ϳ/= =}wir Zr &X04v)g6{a*B5@sXM5?^5yHCI?Z_aic,Uy&njҡBxjj޼ou-v[+mٲyy۹ꫯ|}yfZ_oM_?ی3ti/wy(K/uƃp&n^;Kti߾}?y_Of}({o›=Hym-Qo{H>yѲxo{ 3<7mvR…3-Rm=Cvmk^@ͷ}-n|嗇g m;8o'{=Ѷ[@ -¬};wxNCC�2- @ pdYB@�@�@�w;eBd}ʎ ʞ/?_L;N5'~c_{pW73gCoLPtT6?>eZfq � �R Qv:m,E�@�@�@�@�@�@�@�@ �"ҊpQw;sU/GіyJ;3kyy'k'u*u"G, s�%K![~ۻqV_V=L?L[_}fΜNn/o)a͚5 ^d }@:߷~j8R齠b M/>{Y^m]\bE?yZui޼yP3믿BؖE(Qbk$| µ<O<'ãT܎P 0d,0`tu%ٳg2dLTڪ`yhy… oBsj>EC =xCBa�BCiHYHvδiBƍ Wlٴmn'nm+WM|*RHg.dUmͭ#@25Cev oNC�YGk<O%5c@�@�@�[`r{eI^Ǝkmv!Z{=sۏ'@x|9>#6o~9aq[Vݟ� � �"@v<@�@�@�@�@�@�@�@�Q H?\mڴB馛nJf>?؋Ez5JZJj4 -NC�=MܹNo(?*̠Qjդ]vɽH;e/d>i$}嗚8qRUt-[EP .vNɃ@  XހG݃RWRkq,N8X4R <t-tE4hРTp]Ã<<'^LaȌ￯Z0uꩧ}uSjnݤY)Sj֙YHryIgd.:v'1 klhz('k@ 8^2笙 � � @CNuwGW^)]rTxL>=,kNC !!S@!� � � @Jfv<@�@�@�@�@�@�@�@�@�p|P5j?>iE ʗ>;QcIK+K]D$;Lu׬Ƈ� %<`* reZ?:Um8-9}x-]4ky[oU *dMժU[nmk3LC�կЯB2"-^T曥r ȫaCC}wyuY.… Uvm͟??GzmtQGW_Uz,=H'w4@ ;V}V?^ZU:!�;*0o<]V{玎#� � � � KzteKJ ϢEԩS';F{9´r � � �#@V:(܅� � � � � � � � � @^ٳN38Cj ! yq9Y&EhQso }ےx.ȂOp#4ؖ3, @v/. zz<MЭO>~%*0xmŗ+VHo Yw_ٲe-1ctkݺuVp-[jub1\:7֔)Sy򊀇 YBL/nu9ҿʶ{p%{ gS啗0[H` |lR{j9K={v?k vZBT ovNk>h�z(m޼g.TΜ$To'gC lUB#GJ/ JGm/{tN'0�Y$?1U4@�@�@�@�n5kn]W/el(,ͫk׮v O-h  ͖lw\nnsϖQ@�@�@ 8, 1 � � � � � � � � �.0p@M> 'RJ>9&_-"~bWF+E'۶JʱcB �ޛ5 ^@x|iΜ-n9F"͝+yaoEDZ^{߮PVvmy?S믰[~D-5@ӭ�S0?% Y/1.]:3dS޶rK/$ kڷ|}J<,D>@-=̞*V,Cle> '%K,bC]=wBּy<,^zǏיgi@^V @ V{9uն9ՁvWϞyjda<`�&>8:T)n- $u.d<2/Z 渃̓1$ � � � �1>+;6TZ@:|dǃn2Xܘo^Ѷ(ݿg6 K,'xb^9=I� � �\@|#� � � � � � � � �/ W_U-ԭ[7; wZZ 6SOuK2<,D:Dݯ烺9q LQikJmy(`q<ɇ%qVzG]--8z̙3u4th-\>VCMI& ; |&PԵk}mµ<`⋥U Ԏ6m |&@UUW oI8>'ppm}UݺuqA O vK~BVΝ5n8U\9O-Ɨkֽޯѣo]w5i 6 xք CkI&w2}IҞ{n(y slzժU|!� � � � @֯^~Y_zuԧTJG֬YSi+P@.\?ܝ� � ��Z0y@�@�@�@�@�@�@�@�@�rZL2>|Zli'ݝ_|W9"0,^~-KFI#GJO>Zt衲baI_BC�H2b>x_V;W(höO*[^ۖ|ܸC,5}4yduAb6#7QFpOC ? ޽ի>WѽJEJE~I~He+ws\`ѢE ;¸h\5kN<D͘1CVϞ=s}rknV}}k]5f"@ )"oDC4=W=d"@ l~WK#� � � � s6HÆI7(T:蜄5rn � � � @V2J# � � � � � � � � �Y,P^= :T;wVժU5`,C o +'pB}IONdK\9 p-ڲ @  Y^ nA[ez[Z^k{*BO3Vpa jz 4iҤп[+0B!-ZŊU~yuÝw9 I"E~=үFZտtRjQGaKI *@-!@@]vEeʔ; Œ{ÇNS:u_V6. yh„a_c~6a@ c|SziRYp,P:xB2 wn@�@�@�@�@`o_iʔ<_է1� � � �R@| � � � � � � � � �H۷דO>O?]UT_ le{ڵ_HGK~(wd&]; chV:`ɃRh �yKrTf[8pjöiӢ0o}<l˻$Crz*![M6 =Pϗkyfji_dɒ0XKUV(tEkwԒ\K9sΉuG=`멧%m< .^@^`YUxh JWF } B ?Ƚ$zpׯnv}zm[6vh\i .8XGSLC�\`<3Y#j%]t{BiQtPNO!� � � � TFI}Dǥu&=I, � � �9.@V3A@�@�@�@�@�@�@�@�@�GSO|t饗j=б83ǜ ֭޷j4aB/xB򠆺u`-n5ti �y\`k[ZqV|i5ICHܹQegy˃㰭ԁ[UJ m˻nK.Ռ34sL͚5+QVGՊ+ l{D<\%yQRJ%HJʊ-Rp-t((õ{ uhj>D -ZDV2XrN>dz,zrLL^z 4]vYs=Ⱦ1%d3w>yR.RY>YF�K3gi?z@�@�@�@�@`3%?`8cGiDY@�@�@�HG`:q � � � � � � � � �#kVs-SN z۴iEE ڵO?-?1OK+ '9D: ߆OBC�gcAڶaoQKCF=kdY)_V&(2e˪UV][xfϞh _SN[oe6Y+SL-իWxۯ/EI&`:O.yȑK:u"^CRlq$;=ZI1lE*VxX`t-C ,yZw_ÇlcǫWԨQtN{Gۖ;1-B˥No/{!@5kY"`zB$ � � � �dg>X:,1@�@�@�@  ^l@�@�@�@�@�@�@�@�@�xpQGijذaFr?저,tu0|I[?/Y#t)qcɃVh �WCS*WI҈#laWV~@~e){PlU]zȖߎ/+T-_l2]4gO1cƄKRJ!`UeIqciDs@ x}`\M>ᇣ5xV/e-^(V@<bXp!F<|V ,>,'R~cƼl!:MtYoZXi97q�9*`PBLho ڴn! "&G_&�;(0ݒwyg y � � � �h_?ipU+ihCA�@�@�@� Pk{x � � � � � � � � �yL ]KQڵ ZkcK ŋGa mjiĨG'Tdtbln-5o.k"�  X_I͚lzQ/nYm,֯SHJV꠭8pJ/\Xu })E }M/=[IkT~4h i$@BR۶QiiԨ(`Ǣҥ(ݲhdoW!@. ,Z(l0yK`ԩ!L%{!wFϞTZ%=ѣƍ>xske!e= 6(�fV?^ZJE:pɷ#9$ Mܥ`@�<Pz*;i � � � �cUolD1B) � � �d�f"@�@�@�@�@�@�@�@�@�@ /-ZT;[ej@C�smD'&}H{lj]/C�rL` ;7ܯJsٛ_tUޗVRFQO}|}ϛo͙P}(чLV{lKPƍC_nҿf͚̙3룏>/{`mm_zMDӦMe2ep@춛tQ6M}G5jzTl>3GKgGK\9ץ1c˥+">*p@,� xV 6;Htɓ']va}*L tR9 Ւz:O2%ꫥΝ3=:D�\]è:/{-^&�Y.Z|4 @�@�@�@�|*tRkIO1Xaߙ�a? |v}U[:@x'!� � �+@V6 � � � � � � � � E?QdD$Hr*bLx)z;̊)*(1�APA1 Jy~{wXfe>ޞlwtu= ޳:OfPj\ D�T(8KõlLY9p-͚53yq꼸� jeeKb}zonARgVfG ^2e<-y2miaC+˖ jL RP?ըQ:)Y(.h"իj9lp ֺukkѢ.]:jD 7ӠP;0`KorqvG.C@ PFbf O_xs6HRjUR%IkO … UVɒ% *>Yfwi똑@䈀:ʜ:5U~/SƬm[n 5jz#` @ (P]vyt� � � � @ }bWzܷ}gՐ%'Žr …uHT.n@xЁ677@�@�@�d(q%*J@�@�@�@�@�@�@�@�HD=:wS@�|$fUq0ePB>Z;V'}٧l͞tܩk*p-3gVh3`@�.Я:]P(OFeŊ *c. kEn^DBcu.G"fժ[cpipY[V\j%ʨ~ϟҊ5r=T+\KC6m\hK t>0[\DzE a֭3;03(W[7 {@ 6o}ٻ?3$P�n}´J(N*|W1۶l׮ z+qM((�- S]U+|ADle#<b_~y`(`,`o8� � � kh>hsA2\Ž2%5~56M+\\Ŧd@�@�X@ׁT7sm)RL`T@�@�@�@�@�@�@�@�@� @*U\X۶mSN9䐂'I'pAC!J1;7mfJ5mt٬:uy2F�H<.2{UPmO ҥ@G:*~ժ-oäIS_yZGQupN:)*Tg7o͜9C  Ԯ]ۺtb;wvZw"$6[ W A 0T)}g٬V8US}&;l̘ \#t#LG�DXvbe]5MA []ۄi{AIfnLrW@_,Yb6m':o к*sf-[/uci @^ t?ZtHA�@�@�@�@ _<ج|yG54oVX~_s/7.r _̠p!@Eiƛ2@�@�@ &Tm  � � � � � � � � �$@5?:'lz S?*� ~ٹ?25d룏̞|\Yrf'k![Gy@ w:v4eaC.l֧Omu@(RC?l㯾 B~l nU\: j4;ĝ{f<>} z&MO;4;ɥq-e5왖7^vY0(0ςϺBnl3烵2|,yS[\cO?=G�.@VC/Z`͚5ֵkWw\?̸J즛ƍ3+Rd0pbf f @l͘asfߵikN90WH܏WOJSS@�@�@�@�2)s?lc·=W(t2Wp 7@kt'Yg<� � �dV+2+@�@�@�@�@�@�@�@�@�(@]SL1]չsg^|$"^rqm-2??&N .ݽ;mQV&C:f@ ԩz^fO?!xzH;5y)c֠A0Z +YV<=~E"-۾v}w.sZwBg7u*kkILC \_)`tp- ?,4nlj.$.%ks[C3~}%7lhVZǘ�/@VG0%*2TlYh(`Y1f+ >G�PPݬY-hqNufmۚ3@ ,t&u܉ÃQ5լ � � � P P{q qכ.] 9Xy^ӮNJS"l@8q@�@�HO@d� � � � � � � � � �^@ZSNZ:uZ+VD@f-[C:[s^l}ل A֮]f 7i(5Aa[ ;)^<|5c@� P )Hh Z57O+WO? RV7eˎsZ[~͝[%Kn5 QG5l#:(@N XK!Jԡo}هj\9oK[(l-mFbf瞛Uc pk\b!gE�)yy v;?~g9sUT)gݴsϙ{'P+ SG@}.Zh!Z+V`w\u fxs@�-6щB  � � � �H`V 2Sn٬l|JB \?4k 540E�@�@�!eQmf%@�@�@�@�@�@�@�@�@�80#<2%Tcǎr6S^� )PTih6۶lɒ^u;og-uP- :s @ {Xz=HĬw)ܖr(:*)j0[W9r6{϶lYe۴-_vjVS }ni|ajq+ʕ3=_~ µ5d\&S >}nm@-qFXG*vZ~s+o~7hӦMQ:)3Im )ٳSVډ']vB[ elj@�(^5 � � � �$³{6o6zʗOu%ҝ\Q%p7@�@�@ Um@�@�@�@�@�@�@�@�@�z:u)PK|\b�@f͛Cw}UjȖƎ5۸1kp9|ְnשcVH8 �YPc.) 7T%5kBiN6 9qD=6~x:MvA[eV4?SŒ_T~NiC-MW(FGZ5K. Qh r_7T)RQW@a{*T0;]/j�fj)Htzʞ~izݚ5kMoo6Y׮f?os̙TDe5ulsA+ w RUsaA o6l~њ4ioבC�@�@�@�HnAW]^z)hcvWA(5k 3p1@;  � � \ʰOA�@�@�@�@�@�@�@�@� <eV^k@�d駟K."ɓ'QGA@ V03ŋ͖, |cNK4;ؽC  @|_~t>hQ6{p زe=zM0uQwJзo_,\phjU6+x7; tz 4 J!)`룏>?ki$%O7k6 WSq O .=nw.쩫?/�qެ˧307/=-c9FA l ZLa-Zl ͛)SPXo@ >p)'|Y*Ws b LȷJ!� � �D <١]vY47u^aps>V {睴J\5nРARg´!I! � �I)n]<eYI yViw$@�@�@�@�@�@�@�@�@�_ {n줓NI&YÆ D�|-Pe6/;dePUێA[TCf΁1 @(`z΢5m.^Gg@RL~75jKv)K.>})`)U5P.aȖS_{A C4]b@z~k4 0l6gN#v0[׬s dC қ#E}6[<۳JQȪZEXQH0.A]soi¥̫*W! P~W??X:-Wc . A`…7R´ݠ � � � �CTj/hp7z6.Z~ Qe˖r'z@8/ � � � "P(Jԅj � � � � � � � � t{DžADҭF�.yfYY6%J/=  ֬;dkKͶn V#u$lcm-aX=@`?ygUن f `׮aÆ+°~O<Ѯ ٳ֛q�EaȖX6nL]@AVtVN+_>B -f3f)\룏,0۳Ǭq \S'vʔMq:X.sn='7۽۬X1_5syHbuТIT= lsmڴq6;m֬Y|ܛ|rr})H=H]|zSq "g}Y8,Zd:mĬY3̓1ǘ*_֞@�KG.};6*Nm@ [h/-@�@�@ ^}5ROۅ ]͵צ.h8^5t@" r t 6\h HouA�@�@ ֙Ul6eY~y~Zg@�@�@�@�@�@�@�@�T"T#@ 3Uu}}̘1v)$*Qc8|ٗ_}Ex23>($$ *W.x @~X¬V}Ɖ~{#> /[o;,袋\W[Fr TVz[ ڴ)u%K[ի׸bE:!ON µ㱢EN;v44L̖2{_4-~Ubk]&M,!@2 Tt;{uիW2�u͗W^y=|jkΗ+5|73uׯِ!\co7 W/³]C_u ߀(GA�H jժٍ7hv[bTZ @ ^2WY � � @omvy9%*\i6mZ5w9;'ovq#X+\ZpBy⾮}0 6 � �d^@̛p3Q@�@�@�@�@�@�@�@�@�@� (Qisxy/_͌W!�N@of nR"}쳩A[fVYz{k 23n �I.Zf⋓|eK.~X~?~~Ykݺ]s5֣Gŏ9&қ- S_}Af~Bg�C1;`Ycf>hVى'Z:li=^mvf}=Gɺ}ݳ>^�ኑ��@�IDAT!k.vҕ+WN Q +bC!iGB6o6=;oRȪ>.gf Y_~isY2AxS>@J:@ w{[j \o; d) � � � �G`dsmKFkWO>1;4O?5kt?3aX;95_L<~7X< � �@+y] � � � � � � � � @ <[vmF�E@of{mРA6`l/3A�'?`tٲeW8<Ds>|$Vؖ:m �-c۴iXtG[lIv8iw6+h}[v"VH +ZEvITti+U>C8\rv衇ZX| S"M).y駟~b_~:#yy=g Xq=^.:ŊUfVFp4rUjnO}F€-u7#g;)`yssۤ?CT=63 {'xKR.5?cAPxѷ={Rps N(/'ĺN;%w ic~C ۺ_<G?-[ڏhP6&N髹iӬm۶Y B [5kgzl3ұ¯]Q :cu̙t ImX";cxkヴ 1AڱOFv2NYL_&(F矃,gZ}g s75ntT*4 ~u@�$>|o�IQUQوɬ@�@�@�\y]C+WOІ |[ưmcخQWAa4=ڗ輏t(nk85$S[Q;25\iN_[oudm۶զKgöa{MzJ{[綠M{^Wu76aUݴCxn7pYF|~M;ִq8~tGA�@�@�t}VfSosyto � � � � � � � �Lqd(�=oڞx AgXmVTKOȖ¶ŪA�{8(s&Q-]Ԯ]пKx͚5= ]@CqkZt_G_Yƍ;.hA[._ 麯):H[t¡*wT2>| ~PG]’:P<s6d}gu]:H9\?+L}$|V}r_!w:W`I'Z RGFyrDž=T~"h{%sW-FׯO J2TbudMV#6_蠋v82̳0d+XpZx[xgh74XE/3Pư$+T`*UCŊXM'1& E\Hc=v꾨RCuղeKϚz>}Q W^2Sh0~T{}W 0mU]ǹ+Y1ZFckxA^:.@A`G_c :Ry3;&X7M=v_cK͚Ax (DK˙N<Tj�$^ϙIRc�-@{e~ � � @ (0/Lr u*,:v~js8aFu*:'6&![#a\(K¢_GF׷c=6e]o >/+ ڵ3w\sP{5?b?ΰVjϥa8oݓq3QQT؞7<oBUEWt7 X}JرcK.ZaVtVy_O}z u>8V8sšoFE>juEu[¶dۛm^KA�@�@ w@J@�@�@�@�@�@�@�@�" � 3u˺tb#G, �y'k`(wf\F/TQc-nթc-@A�|(п[RdbŊ>@+"z]̭ )u4۹uѷpכgk: h4Vg Qxyiaх5]Gkժ嶙G:РT ) u r[޽}N[W¶q#:H]S؊J{\TdAGMbn{a c :ۏ\9-:sS&g u*1zvL۴0BDY ~ ;8@uNaHnE 0DCϤdqnk? oT1i4ԘvPgNɓ]HNWI y)p7K/d .yY^:wax;x":LJ~3aaT8ci; ӱ)Bz:RSGt:N'`p0ZE;ux kw8 qũ³c{&/}hVFfnO Ϳ+ɚ!@̐@�@�@�\yٜ9sl6w\wɝDrjժڪi9QsF Ҡsl\m{)K c͛7-[ :oq֭ͅ# UQ6a$jR656GjPtC jX}[SS! y˼.?R(Ku\m Ґ6, 1 ky- (vIΩc75*r@�@ ;DVx% � � � � � � � �j@�5kuY>Datd@ ܵ7AV8öyJ"bRö\F#/$qA5|`r {aGb|' ;V@u -PwL8ԙ:;WG߻B)HEE˰nݺ~Pg 4;·wE'|F:?g]wwG>.{"$mV¥֭i N$_)\p6n{bvyf<c$5(1= I㎰w cPXH(`'7܅l6VG8waaYlK~EcwEpuBA ^}U|d^/|&Mnݺ.JBu~/8:hYEi_P0  )?RX$%>uc�0L+5S<4; nS o={ŷ,v}ɒ`CMwlvgիgxB@�rF@mֽ{YsE� P+"*� � �T`Νk4}<y͟?Y:oբEaÆ7DeP(�jsA{s?䓭}qM\>-j4p=<!U۟\AXs:?j]tUmvK^5q+SZ@\z5]qaږEʩݟi9|X  � �"6xaswVQ} � � � � � � � � *@ P-HUzꩶ{nS.p �,a[aȖƺ0; k4}uz[]^ If@r  g}2,]R;)IO[:Qg[ouLvRN0^ ]ݸqc?4iĿz[C~wqgM7d:toQ tQJ).,%\K[a[A]Gc3~W bֳ羯Pp^r ,KcuNU%\4V*TGaF8VpSQ* ?SFO?m$%?}*<#u]K,?UI'd#GLf~Z%.-H}ᒃ4{:kSQ:01k:h侀X~H OUt\* _:8LԠmT5ul񳹠,h7NV)?\spLqO, HD0xUZ';DK3KA�@�@�$u&LѣG~Q#<8եKk׮Iv-/1c}~<(T .s9'<ڐ)LDa{?n)[g NvĩνꜝpXunOH J K}Q5רOE! FR{/gy os'TSƦq8\ڏia)U<jޮUo'6  � �!@V֕ ʺD�@�@�@�@�@�@�@�@  {^{N;_ @ ljuBiS* ]WЖkpiݓ( %x.^w0w\7o)I{5:VF2e,^=zoy:EʕN8Zh:8Zn;LȞ\o=6}tTօ^h)--nv,u|eAVe(&df\bn{k=<z umG"E|Ga`a؅:P!P/QB55khZQ:Ѿ? 8%C4lʲ($Yowp$1̏{ɓ'ct}J/O?3]CL* aW/hߠ dT0#((# [UXZ8>;P0Yf.,xc^~3s"AlNCg)<+am߮�7JG|R?ˉ:1O@�[}=�Wg@�@�@ wvqو#o1j`;ϺuNMn) 91c{炳vYNܵ(}zs~$+ rMŊkOdܟsf:jQ2)"Ѡ69 R{7mڔ2C]xE5jF~P#z 9$ g60z;w(LKW9TP q иdɒ9TSf� � PNVx% � � � � � � � �j@�EW]u6h [xOA�:]\{n\ sTԉntVx; ܪP!x@Es̱)SApi;|`j޼l 5%iBk{ zo9.x'tul!?uc٨Q\vRJaru\)~pH J;TB*WfǗ]f6lXj5i__HąE\uxS()*- "iPVqCA 6>wܱw-hشiS * 3�C0 y!0qD;}}gqF^T!ܲe0sL5kX^c\QW+@)4MJoK, CucI}f \tY̞y&8>nl_s8Ăqx߃yq=,9܁/9 �&MXv/8+͚">jC@�@�@ [~r j?kHӺwn L0^}uPv66P6%0e_q۶m}ftTΫ(\HCaΫEe�@ ٳǷQ{Aqm Ԗ;6\B_fXwKz � �(@Vn+@�@�@�@�@�@�@�@� P� ~nVKlȐ!vAe<ȿ:d[RǺWa7v}A@}f5jU 0JXlM4SN5u@<[j:> V %? lܸw?c 6m _ ڵu:t`KNgQnfA~RXV} 6lHx"fφA[ժi2)#CFqpYŊql"E߹m75nxێWr[6ݸ-Z4|)cE@E.\h ,p[t:8}Ж:  0*_e1 # P^{- w6}tڎrɪJnmABuj<o<f5mܹW-7 Ȯ`+w 2Y ͻ\9_o)}PY 08K,v8(DK  �"֥Bj_;ߕK(jطG�@�@�7|g]zvZdRvu_c ԩ 8зLʕJ<ٷ~k/e±" AaBucQ,�9m[A5|Wi&܉WSoذ~ۚNA�@�@ =ғto3@�@�@�@�@�@�@�@�HW"ҥ@ ĉ /3ƪTyLD�HؾlԀ0l+:pkʛPc?;>$}ر~Ѕ PG QҸvI>T46k,<yRxqܹ}vgo;[ڰar-35)K>_R~yz\ /N/pK{tU0cvus&|eN?valֵ~[޼yskѢv� y)FOΝ9s昂+f͚5ڵN:ʖ-UeT@D}z|V" ߇-]*WpUwCm}?h[NxԶm[Ӻuk:R)dR`KW~O~/N>d~ LZoxUԱyuzߛG=vw;űaYXY^@�8PݹL2:;^�I,@{$~: � �$E{ﵷz_[zaE@$>|A2e?Wx]w�=_|-X eLA RXB4³� ]֝]/6m2=dŊS@�@� �ZY ʺD�@�@�@�@�@�@�@�@  y/:,۹s)TK Q@�.kWAV: KR:N ݪ^= Pq^ub=rH{7L!vge˖VpἨL`u"?&M;~P={$0a֘:u^ZtXFgcmiZȵ~{;}&LV熃 4>_O;PcGgvf.ꀋ>|EaFs1sbzƌ%KPB>K.VZѡUn`jղ6`b" ,^g2.첄.9wߵqc Ki ݎ;Z T$(MǴ:}Ȗi|fhذa+#�[鏿{+m)8KTN Qì~ <KYp͍ �@~oiӦ+$�%止 � � ܉g֬Y3fAm(PxW<SGPSrb6sL3gϟP-[5jd7C&MA+LH_\Q[[Q֮]OML7j � �,@V ʺD�@�@�@�@�@�@�@�@@-> @6n :Q\@�زLA[¶~)ټ9uN: с[rP.+VK/dÆ wР;_T]a>_`>Glcǎ-n#xۥ^EIJur|M6/J.S*cGjVt}:ߺ5UdqtV%Jf\)va{?hQ3kkgv~|J+@Kv S'5kA:u2 ]f$ML}Ph!.[n~͡$\$軗*ҏyӧOW+v `;X5k ˕ӱ;cG)بC~{i@. }ر[:_b 4 Ae˂a^O;a^ˊY ϊʔ*!� 5\W^iDH(2 � � D W`i|6h ⋓h jq 7_mz+?F|Ք)SO>M͛[-csɡvdof~͛7 5U[_kVZsD�@�H4u;^� � � � � � � � �Z|@�Pgwq+'|Ҋ/~�s �"AV}D_m})TȬr XKɈiUu KAxɓA, ݻwN]֟uYu|>n8{}骫VT)gCsWܣ>j/pIJ]w]VbZ"M=R÷t[ǻw֪| xK^ aeXle-X`v 5߆ u*c.,?y-h)N Pũz} ȗ?{c,Ν;o{.Z]ϙ߭lٲ>PR %0bKL85k,rMulsNSx•TX\}R`;3fSƦM0ĺu=utqtZFu)~8g �y+̥Dwg϶-[meX:�ZyP@�@�HB_\ß>}�[nNU޵k=޷VZ6|p5E=|A7Xyhm۶֦M?|6 X@mf̘a3g!x/ҥu5jTXu@�@  @J@�@�@�@�@�@�@�@�3�d[oe}5uSkԨ se �9!5U`0p+ pPHXUBjVЭ*Uʔ _8 (XsԨQ>XSkƺu[ gHgRՐ!ClӦM֯_?S%<#ˆ |ilb]v 08d\ ^)T+:d+m+,K \OEau_dsA:o^ )<@a~+4H]dʃ@@!Hshж3a_)D |VN? >L'02 hUn]9sᒽ ;[tT0GA ~\ \K۾,_B",Pڅd� @<|A[v-mE"hj%;B}@�@�@ Lb={G*s [bo1o<VP رcm6}tӱcGԩi|[!5Ҧ @ ԩS?;K^okf " /V*� �+@V4}@@�@�@�@�@�@�@�@�mxȌW_};a_Z9_䗙\@�ؾ=5\+ Xu1@$ZR`0`K![b'|+-n3hK/1lA}X@!@:c:+g66IXآ�ulnv*}B>WV4z;餙tM7 k׮v[]&is)c4i >~mX]y~se)5knV\I|最[|USu. -*_~~Pd6xЖ-;ȅv;[U*^<8WpmڢLdׯ#@�h׮ժUˇ'l%�%s!� � @>6lo'p?O;\|Owmwq 4NrqY_w}gF_.\h׷3<Ӻufmڴ:DA�|'Bjk6qD{hѢvYgY=?-g@�@ 7@J@�@�@�@�@�@�@�@�\h}gk׮E@�ׯ)dC,*zo �[yY Wִ7nnUdVY8 E1iVsruٌ3|?;ÓT4 D\oaw}Ov]wٍ7hŊKʕUP[P?֨Q\*3>#:gl ,➼j^:N._r/p#Z]`;}%=%\bz}щ^uꗋcǎA[n%JYTAشiyWZQ6ol==.8r-ֻwo+Ydn,e k-GyFᾏ:9v>uzh6~"0; w~ʵw!�dF@a:vS�^� � � O?K*)Yœ[zB.rk'H:/ӭiӦsխ[7!L@ vHZm/bKq9`� � cjeh_+@�@�@�@�@�@�@�@�@�@�(S=wzmԩS}ӕBA�ȗE]v)œrbL9pټys֯7KrniWA[*R_]0oن f: Tɺ.o'|)X+O@=zO 2NH/[Æ oA4'ׇ((ϟq>XUVTbgOj[} KUmx9v22(_wa2׷>}BlWy`u_vʖ-KVxb-lUjE ҥKSO=ezraB j|c|�߲o#f.w? @ ƏB)+ � � � �$0bn\Z*%:X9א8;{{'^p{9W^Ua%Kgm۶ٸqu͚5-[vh{oQ@HXM@�@�,P(J^V@�@�@�@�@�@�@�@�<xT]R@�O`ֳܹgO۱cg̙ @شlݺ`z|ګ(kEla[1 ϛ]qY͚f.<LUVo˖-_tEz=OF 7V^m\sM8wL0͚5:vC:)%R`u34)X0b`ֶZjd+|�+0m4M?+dF+�ڗ^zɖ/_^pX\XuQ6p}1c|vAں A`vے%K'P/� @<sKgW@@s� � �d,v�mڴ(!0l0fȑ:_E5juշY<ӭpyY-� .O?СCmȐ!Э;Xh9C�@�е+Mb<2#@Vfx. � � � � � � � �i " w@�l__~;wmwq f/B�HD~l`ذaﱦiC'b pZrfU:WֳHsa5k2/[ؿK=zըQ#2xꩧL_{GaBKM?ik%.*Ӱ<!]ƚOAZ+޽/9sؽ\{WXPA17;d7xc5Qio}wVT[A{m ]v-#´]y S@�H`-[ߐ*ړO>i]vYה!@n ^27Y � �$֭[kSN8q">$xM7?/=ƍ_|?|y?>$m?+V{1S(@�@ q{Ctx% � � � � � � � � �!bcƌ!Xzu.Y#�TYݎ]Tj֧@4{974:5!hN3h|c.|lC�s5kȬtiU>\gf]|}Yf:7`b cSO5Bk1w񼙻-͝kfBȩA{w# :g+L}֪U+S'pB &M k:nQ w &sd֪U˽ N} bgq=CITzuM)T+?.9>ӧA.s֮];֏u_{̾6؇hm_c۱c-YRhg?W^={PNq#(.':ߺ-X2uQ~;yZ,g;`R@Tz<p޼y>[Ń gV2Ui;'zTPS'\pNj5osNJXv 7\ ם]\3<c0^{N9۷M2%)´;Y{/K/Ku|]afg+8Qm޼9F�@ {3LQ!@�@�@�@ VaÆ Et=6muٓ<'ə1h V?WɗGZuֵ˗6smĈ A\j<ʯ˶X9i9>ͻDmW_}e_~]tE?@�@�@\ٔY@�@�@�@�@�@�@�@�@�K믷֭[7n)5@�(WL-_n7æM)]CW?˱(U*S(4֠-8zZx[ω@%̛X4r}҃<{>`IQF%E(:^V>ݻ],_r͞=匊?VX3#e1u|ltZMpr _UX7xK. ՁGpPڴic Q Qt[[/袀 qIO<)R$ᤸ u:Ȯv\(xß)uxBO>rj? їܱ;؉ĪGiBV m:!^Yco\2:g6u6EÇ @JXf}kY<6R QscZ޽tM9mFYZ"SD?+ǺW wesw"k[ޢER²m 3gF@�Q7 Mw:!� � � @ (;D^Glze?cky΁<þ… Mmr޽n{G+"dx*x]ɉRju u絹n:zzN<c.ivm@1iof\s,@�@� WU9^� � � � � � � � � �&p '؂ |য়~)dk۶m|� @v (HaWGe֬} ;]ohs!Lf}dng.dLZhr*]z\hـf=z]U`.P/&M2:3 0keTڑG-V̬tij7kҬkWs𒅂eK0 N<\8_ߊ92)´>m۶~f-Z7nFuUW>It9Cvuڵ^,c!ִfKOС}繴YL5}t`np%J}�= H0-[L7/ܖ/_3Lk6n8]e˖ xrrpFS }_cM~<իW\{[Z7fjzX>裏CܱX310=3l%>vW5(K`ڵF'=ϋݱcTVY%+@|:mJ0-Qc~6|mF|7UCJOMک~J"Չu<>@?P@�H@-O+� � � � aÆڍ۞ns_ϸ}VFks2z}<ZJtQ(~_Sٳg'\?'=oxωu.3;{ ȋXRx_Gs:jZ5|[B%1cF^U"� � je;)3D�@�@�@�@�@�@�@�@�@�P'  ZhQN,y"�  *Wάf eXf}\ 3/k.'[u\>�eNW_͝k 8K} xv4_1bѣq]KJRhlmfyGd*cQZ6xxb!ִlNt(pe<D'`;۹@Pe]?=PXls]xp &Q]ccҥ~5RLV-VXa]t^aųBFrᣛxH´f͚XZڥ})m$QWEp\PDu%jUR%b 6l뮻.nx2rzE��@�IDAT5;<s"xrl.A\T0,ڗ<~ի?Sxb_W � H ھ}^AՉT?� � � �$oiwohu<|+<'fvz޽}={2L=vxy 4ks9y2\j<:[V&:#'Mg;YN9[jUN-"� � gV!� � � � � � � � � @A%}^z:~ ( � @ɒfVx~zX13j| 7߅k{\_]Ϙ9s v`GcgEp ֺukxDvSO=n:~_::,;SG}d8#A5ڵe˖W\qm޼y?GyćN<`'=ޢ 䟮ug϶W_}/F֭[7ٳgy9_cK.?'V^ .4uuU?`gq }`عk \-1_~I'`Su%ȝy$fr?3fB7}]^{5)C+Trb;??&@.2X͛ۄ v7۩܎Di(iӦ~M&m۶ykn7_&ov_MQ`з.S~z\t/vgqkƇo0qD Up5%֯_׬RF/*U9PL G^׿L/cC}qFg x ;ϑJk?[oٻk ΑeoS~V1ٽW b}7L̤n~Nc[.];o9F-[$_=xܥ <"� G#Fqw  � � � @js_3~<֬YcM6[o՟,kO_̨]9x'?ܷxw}g R;n)yNfq/MMmK8t_7ߘڰm"%jQ>Sεk|kH<dߖK/Mi-̫-[ַ:_K/3'}٪df6ލ޷N:e ϧjFW֭[=l}muӭ`dG[u\lU롍766m2i;\p}ڹ9skniMΟ7nokƪV{279'J\UvGC6lXڇ� � @ ) � � � � � � � � EיoRJY|5/C�8ױzuq"EE̎"� @V\;.)LS'0 HdH㎋O3ܹ낧\}-/DJ?uq1׫W/₯"Ŋ4j?ҤI{>Z0H##\ ҹsꢲ|r?OrG\悴".�?;\8JąiGyd]XqK$.䏸 k?vo<&qawzumsO_'[Vꪫ"rHDEykڔ)S"?C=4ҸqH~"uPܼF\ @ąbtYcvh}ևgu]iѢE8sv".pGOm[-m۶Mw 籿$:KlJvn5u#-ӅMD\G~?5.:uYxqDwM}GW\CqYdfщַo_wqdɒ%Lsĵ_~]K>Vӵ/qߗWt ZD)r1`gS rJ@>m]Gu9s=qE\Q9͘cB}7LM9ra3킜Y飏>?:L }ց  �䥀::jlHPK&C@�@�@ O\0?7srwyg}СC}GuزeKi>2k?xEu9FsPr[tPm^x M5s]^۾}{%y{sV\b{/R)UVͷ 8R[°͍7=/͛}х iIk<97s!]vg;tԦ93%bi=9O\ ]u~}Q{>rQ.<:Vi];ػxKE%K d/~*J_B)Zڔ/D eHElɾνr޳;̙}Μ9wtLZ^TPqMƋPCXDG}t � �!=v];cstC�@�@�@�@�@�@�@�@�@�bN{  `Cm4/yAb@�hر%;^kزٳϚfC5kf?ƍ{03ի'[ɼy Bl̘1оyy -S%3/ y lG,jʕ2<3%Ir6/v6lyһk9s昗ļNGLlo4h`^P{G3oC齗pk^$ v%q믿b)؊+L2d2ژ͘ZR0/G/4/py֝֯_qa<1cnvqڵ3/ (0/yIᢶ,s Uj͔S{ "l 'x,Y2i\N0o<ļM6HZgԎJѣG8(xR<x{o!Vn]9^z8rާvtsq/ȍysq۷sEjԖ<Nm/Ȉ͜9ʔ)t^ZjIđ)]r%!�?nY  ^΃^b/ ]xݹ &4>/}I>\tĨ0#LiQ 69mkS;j\NmVR6 ZJou>8MSN9oh:@�E,Xڷo-E � � � @T :/P%r)-ǵ^!~qiQ{ôK~Kxcjϧ{%K2?zȪUf^b4]B&͙ALmŤ;?& #ajnSŋڏgtO?{'ݬYu֮n(??L}>{ϟ0i }W.wնV,yvb܋Mu)FM)SXݧ1ck%s/^>|-]ԍ󇩵ֳa:tpߴAV[s=I҂x}hOڵkv=� � �ae@�@�@�@�@�@�@�@�@�@ b PBK!#� ^&yO[Ϟf&y95l4>}̼GtJܔAXa&G+W͡)J~d-)՟iguM8#N 5jDWr=X7*8)}2))޽{v۶m^?PPXL^K* nOq~TLI:udr^yskJ¦;:w%{?*U`m<ѱ+ֺpO>dSB'_oS~h8QlZsp &kҤ鸼ˠtn5Ν;Qn\qT)Q8p-|nO^ Nӭ[7z uV\_Hlْ#"]/֟hZ06Jʫdwqٶmrra[v"_Sٜ:aZSྔ]5@`@�*p !� � � �d,&/رc]9;[$EiJk|" 6s;6iM4i͛Oo>׆4;Io^%ڴiSzDg)ۯ*TȕNJjKD[ z}M:=#FpmyU^P,%jI!'}woF-\phzҺiBjUD 7MJGm՝58qO4.~qd]~}OU=ԶI(ǯPCơq@�@�X VoAʏ� � � � � � � � � �. /`ӧOKZ5,+ D�@� o=oұ /4S{UN?~jE8a|<J8ԣG[noޔjϞ=ɖGl|fTPخfܾ(8P?4R&6 .+Uf/=;;mϞ^V=%y^rtODXyg;"Q?n8ce˖Ç۩j~ p?P|U%}EߠA6 ? Xd]{?if˖-'|%P;կy~b$%:27Rꪫrt >qF[jU' yxM_?7ᅬ%t lƋ̙3Hv}D� @.  dܵk\\+B�@�@�@�b[ovڰW￷Eg$rKWZCm?T뮳N8z!ׯF]qc=fLʺ2;/⒔-2E]d .tmB>ڧIj>}ꫯof_}klug~k_NzPSPwoku}%}nIg~"ʛgn|/6YjɲTެ7 2s;mJBFCYV3f5jȎ?H"� � 6j!� � � � � � � � � @Zha|]|ֱcG+m۶m.G�@ &nfSN6uT37c O}A{wޱ۴i/OVڔwߵ{.gy|@ _2?_T)7g}l1*2e$7e8ࡂJ݃ׯ)gf9P5kXnk{qSDS vi)z!@\ݻw7%68\p>*ᄂ_sx ժUs$)SmذWmS}ڋ/hz2xj$O?_PP%K.wZA@%`IJdJ\h],]S�xM\jUwLyW͛7[,j„ .Iw}g/ @ wn:z I@�@�@�@�((VU\ϟs1= Զ +]nT %o׽JW"+ujk[oBMe4MuQVV&Z&M\01Nh5jkvW~g Tm!x;,Y<ڽ޽{GLjKm? 돋an}hQyL⎱?p42!� � ije@�@�@�@�@�@�@�@�@�@ {Ĉٳ]̏>(L@�.̪Tvwؑj?PTקO۴iuپk;3mΜ9u֤U˗([5JVYfڵk0 4pϝ;7r.]7n8pIY-3qiKf Z3YZ`-[f{!)($(H%%kԨL]"Eس>kO<K +N pǮ<+waKv{F*ApxpYQ S (_7sCB>eL2۷o_䩍K0ŋ7>U@NiN:$4-xowxtNnf{"D2  J9!k@f98>tPpXT5E)ϳrWiU߬,7dvUNu})urW}:w'!�  ѣG۵^Kh @�@�@�bJ@mƍ2=&k#`ׯ_֗ [~}^vԭ[εe,U05kf `ʬ_J$vZڵo)iT=lƍ-~^p}k~:uPIiS;TS[nݺ`ajOm\Z 4J{Pz:4jޥKE9:� � @P+WY  � � � � � � � � �/[bl."4?b>@�J@+ Zw%Q!5jC2(?l7ov eoQ 8NA(Q=@_F +VJDoKұcG_<&'N&۵kKt[Ϟ=YC+WжMŊUV.X㓖D$%K;i\F/~W7?u2\2qnF̙3voP~@|nu[lqiƮZm̬B 6vXS"6hҤ)ņu]cR$^Z[v/Y /r۶mcrwMJ',<slrQu\S;eTԎO=Kf޽{"t\jKdzv9jAɓqDOmyA?n<:L6͆ f{7ܳg 0t}AMIGZ#QSCu }޽{h%6D5E꩝gҦvm" 7o^{gq /)! @v5 �nݚ?G@�@�@�6S[O>$Eիk6jq駟vۓlCx `Z󇵂5k֘ړf fVY|y;w)qSk{W7mVv~6DÔ{~\`'|rǡg {t^7!r-uwy6h YTzSm>n[,-#{<Nzu3x_}ݻw[pYYRw޾Bǝ6q OfC\Dmڶmkwyw}NV� � @x?:@�@�@�@�@�@�@�@�@ ^@R87!�䖀cओN x "^Z-A�@ aZƌ>hKȟ?{=0bnxQdTa+% x \^|'>a$! L(ZhK. \s5/(@`?0pge<v[KqGuT weJ8-Kf֭򫬵j ԯ_ߕ{>=0r u,p}߾}^R`zK.B wFD`/?[C/CJ*^gϞls=疓ZRd<]K8'x;իoEH;V`@^kUK1guLJH #%^y@ݺuM6u> $%p鸩Do!Uc %n)xɕC(q;du7l0i8V79GYSXRR;j^/H;ojr1 耗-l:XG% ۷ϝT/NoIu\`GR}:^P?ڿ;W^8p@Ds_},AKΓY׃D:~޼yj.)R'Oܫ)qaZeH$k)cf O`Ivꪀ<hѢr@�hoi>C�dz:|� � �.{sk} d?Imcq̙[zRkx~PDԶPԮSOum1y:T;-/vLk>=[jj%:ӄ ^'箻raնJNm[Fyb[n̦ Lӆ>Klե=p'5{!ߞo7v^rp*3IbiދM'%KWT/nܸEm&Ojϝݴt=qtJ7k,%_sEJwF$:}i#v֓&MdQX7 � @:z|ѻKg">JU z? @�@�@�@�@�@�@�@�@ ރ,6x`ganfA�M;wZ~lذa%pC/QCnu!� P^rqC=dsyJuXPMxrl^0l;Kb 0/gXu6nh"0,/{ܼDɖ%+Vļ> ʐrǼ v7c=f^1󂣻<i-4/[ӭlٲiM+kdͼ�R! {߰ J9}<HX^#o57t%7y> sH6l`^>g̜O"t>:0(C{y r\f ^ >^Kۼyy[t)?{C6vX2dq)+I]x #[w<yAr~:x|Kk^+ oB\S<Dr6쵔~�^5ZnM^03%++o@�Լ@6ydw/=ea =�KFvt � �  Y 8ްB ׬Y}KcfdaaǏ;ԩSK@%do7k?l:tv^ɲ?֭[ݽpgd7NorVH샧ʟڸދMcu[Ӻ{+W[G>|ymСQ.6@�Fzll΋FoGo( � � � � � � � � � >=xK/(F.I5^Β@�H<[n%"kl6rH+SLC?l?P@%̨;ݵ+W\Fgs%R�M0!dxa֬Yn\Z`T87!q*z-̫QFo X_szux^p B=X^\.s\zmիWwI}GrS?j2Ô QDq<+癌ʖeu͗/qG.3G̜٤Lޖ8P ڞi%>sEE|_ h2h gh"SNE"#o$y�k)3f؞={LrDI,O>^jr(\Sy6f/ƴ_UM4}jS!pWl֬}GSn@#�D\W^q ۴iP�@�@�@�@ VDIMnvkذj*lU9Ѷ%i<'ڏpWBye"LKuQ2mۺF]wKY]tB %Jgi-,AViuo1{*OvPpa;3U+'K?q~AROy9LwZejWZON_bk1fӽyYsz,@�@� dЈ#� � � � � � � � � �hҤ}W6x`_ZA@�@ :urI,*w}'GQR d!Fݺu3&lٲͺaÆTmkN?t 9 \ﴦɉ?|6em`tYP%RZ5xΝMǀO<1k eP}.=%(^x?+1,dzrr< OLf裏ځGq.q'q"q5y8&Mdg}p \lD馛VZ{*U*Sˉđ:7\X^~p=SN)JuwJ2wFsq) @ ڵFeJDt' � � � 6A]YfY:u¶hXP4?ˬofJ$_F {g2;{X?c]>}gXLwaݻww j֬%"yO3;.w/6V=3\/+… K.ٳg[F26#� � y^ � � � � � � � �DH_t Y@ -[fzr  $=J� @(ac=fC IJլYYyСCֳgO{7.-&XU2]\%RUVk2%`zs4Ď;:~i] 6<LP2mM6kn.P@3iDtQ}OȅDoD>g)"q^\ Cz.3JumD D{u=&L'6J Xlu]k²eFCѢ zMV%}m{`J<L� @4 <:_~|2!e Bq@�@�@ *o:tE'|b 4r&B֭[gZr啀&؇~h#FiӦYW^y]~VRDD1^l.rEtUO?~mw(^uͮz;#Z6V� � y͛{6μĨf睗yj%֧ � � � � � � � � @D Y� qÇK/dtH~D\�@�xPtPw@suZhUVoߞl>{ꃻbŊ [>3VH{'O%Cu@s=g[N>N@Ə׼yq.e]fEFK8n</Z{J1rHSr0%馛\D8i<.S+T` ,FcSV^mUV ZÆ #T#WkcǺkµkW\ }GNKkXΝ;]rl駟k׮vZŊٛ@�Z]zֶm[}r:@ #Kf$ � � ?j3йsg$i.A6+fJlv'fJdrm}eˬVZ]t~*m3 T+g#l&Lɓ'[޼y/v?|>ΪLu@�@� V7uެʜ � � � � � � � � � @ !#^jիWV@" �W@~mJԪU+S 2Rx[KMp(I7Tzuzm't6h S=zp")W`ADO@Ieڴic;v_5Ŕ&^Rs7|w}.]mqME<%q<q^wg]s5VLꪫD6{l"If]yy񇫞tS`x[ڢ[nrJNI֭˦ķtHkX]wuV\98p jqJI2ϼB�N>֭[g~{tR!� � � �1*R:ud}5)y@ `>5m4h`s̱hO%kׯ}嗮Mc.]\rAmPvjcǎ 6<"k[X«؁Lm;ԎaÆM歷z曦6EJjkA� � @" ~@�@�@�@�@�@�@�@�p6x`@=c �:uKyf{ᇭO>/_ � Jhz-�_}VV8-U]l.ּyvڦίJ+P@u7lJdhϟ?]b@>cwСC.Ab .O<1AL6>C<yٳZhaW\qK<Wpᰭşv_eE R \{?+D+omذaB:u=pnr]믿6%3<s5}:wL\@ ;7vxXE(1  � � \@nFP5֭|ޅMয়~rIfϞm>GbAzEm Ϝ9O;Syvy9Hu"@{%Kg}ffrɴ4N:.iH(ɳB7eJ@�@ Vu^U3離;.VJ$VtlJ� � � � � � � �  G@� G'xjԨa/) �m_#G+]~VbŜY)Kkۧ~j)ÇK/n:Pg= 2N;4>|5l0j@Qwm|iBgqKѲeK};cB Tn6c 2e}.qFVK.1%+^x\ՙ䜀8MC ժUsǤG}4e>cǺ@ `u][+W.GHO`*a5ko%Rrʕ+7;!�  .t͛Lr Q(Sѹ]( � �Duk9s渡*U* #%T&A{'}݋e|r>}}KȳcӽT%jԨիW%9cbdQLS`ڵ.ږ͟?߾K}ի[ӦMM+[hA; @�H&@BdzCBLq11 � � � � � � � �܃w @ Zna׮]mСVlx&A�@ ,Ybcƌ{6mWr /<̨*+.:uM8&Md{\:udES$իW[޽]r^z&$I≙2b]Be˖Y|~֬Y3YA[;E@Jt>PN?t_Ǐ>hȴפ ?seزe,Y%i׮]ZEx]^qu_Ygem۶5%0T0 Fu(\ (N6]n߾%�W.̽ZR@�DKmÆ .it";PwȜ�%3 � � @J%z߿ݻ L.\8dQ6vX{l֭6p@; q =Ç믿yق lѢE{\j=JvZvm+RHlW#JtfNm& [tFB϶ Z&M\%JDa-( � @N P+$ʺs"� � � � � � � � ]<4@�X`ַo_۶m{RI5j �D^@ϙ3%Rۉ'h\pK^ѲeKoH@.+MZ\sFr e~oֶ}sΙ_sDB̜9f͚esε+WZ<y3p"4hm)xK޼y8Yx}n ' TbEwQ8%su P /]*iP"*%ѹ8߿}O&OBI TKu]@TtdG`ڵ.ؠ]gϞmz�͛76mE]d'|rvV �D*t @$ U@�@�@�viCuL­jz>Xbi'lԨQqƍvW<N8d%={Q]J*YZ\-R_jUI:gI?+V$vוOߩ:uXݺu];5kʒ43!� �%@BoOjeݎ9@�@�@�@�@�@�@�@� � @{!CO<h?Dt � ;z?SڢEL wsk|DDСC7߸`J< JY n޶m[X$"'l+ݾ}^}Uk׮$ nd-XǗ.]jwvI j׮IuY^I (yeնl2ZCn:aÆ֨Q#kҤ Ǣ#"Snݺ]!.zFm?cUQӧG]n:wuVDt%k.<P_~%k5h]( �&peJ뷰!� P+T)C�@�@�2ضm=쳮W+zd<wbNvZ1bKvf={I' !ZʵT 9xZJ;ӓz*IBeVZW:ujdYJPh)mk_6 � @HuIjeݎ9@�@�@�@�@�@�@�@� � znI&=VB �DN@fϞmfr+\N;Vz깇 |5oڴɔp?w x4ܹs дiSk֬ p ]_ fƍ.m޽ѷU"d[/ ֲo>˟?阮``ZjVreYV '$ rLIWQʕ+m޽/_>}٦nݺ.8GpVT8.+S빿r]t={ ��@�IDAT~u wS pUD Jv%U~%~�u>|J*иqcS_~}+X`PC@�yQHǏo:tHh *� V͘@�@�H`ǎ6zh6l}wu]g^z,Y2]vG}d#Gӧ[rL>.kjMg8Oɶ\KCݪX˖-K{3WMO?kW9 5~-1֨QcOlC� �Ē� Hu;D�@�@�@�@�@�@�@�@Z @ |'v뭷گjwq ."T@� lٲ.\D]DAAk׮킧k J9;r*5+щ@Wps˗/w v6l&T p~9�چyMmQ3%y衇lС.#\`8& P %<|w&SDh9PNZ/Q@ l+Y)AQYWXM6֠APBHF@@~ZluQP'^袋Gewe˖K,/~dK3p ;J)o1GWT׻*ɚ/~t �$e]fk֬qIyIS_Ȧ�  � � @s̱Çۇ~hJxԬY3K.ҥKg0w|sN4i{6eϷ^z{jA3t9uo/jͺv'ї/_޵ʙRTغuks}6_nۿ+VNoXjUZCcC�@�@ $ʺ nǜ � � � � � � � �P}�Hp{]~G{_M#�D^СCrJSt%R0u%fQ- Zj՗*U*IA\AM\Im`AIN׫W9?X"oϞ=]0A]w2/ć|wx#~Rd ТPBR ömN rd~vZS uw{M̙ܵ3u3*F-\B#%nT:rSओNr \-c7;cmԨQvWqM3W5%V\bKkKQR2*U$K=% _sr;vߗ kC(PN;~mmK:@�]@BJ09~xСCsPȂ� , � � @Ԟ?6yd\KmZjs=78ͧ{~6}t[pk޼u%av0ϢJN߯S->|حUNN8ԗ-[Fm}E@t_XƍpÆ W+RkCNog6ŋ'e� � @P+$ʺs"� � � � � � � � @B-@�'<`Ç7|駭iӦ � @ !QW u?XP5ԃJJBX.`#(X8A׭[g |N3pA5YwqiOZ@ΓO>鮻kժewʻ�, Ңc:lٲ%IIN<dZ\rTL7,Zh<ݻw&Jj`' 9_'HINz]re7J6?k,1c)q(Jƍl)#{Rc\8߽֭[p.e%OV^%VnvIػwY&u lJ¬sכ~�>]NR<K35L]p"� \cǎ(_~%ǓB VPL� � �Q@ɵԾaڴi.iL]ߠA7=X6{?s[x.ZvM6FX٢S tOGAOX޼ydɒ.k/UT{~g.(iἈz%R;.S:>-?kwerW~6>u\~~@�{je}P+v̉� � � � � � � � � @� (1waSN5#:t l" � @T (іr@ O*!D]փz�[ '`J¢54E:f0 jJt5T:WVs?9)?Iݭ+IW_D(wM25'ajٶm[(y<1]h, QDXbVpaPe^x`'kOvܙl<9~?I#:)`Kʡd-Z-[ɓ'YYy@v LǐO>ڶmE1/IuTOA&d>+^w!8I%Iu:@q=tP3ƍ]@4w~"ds?)C@�A@6lh&L/898RZG0@�@�mݫR TzA uf͚VZ5W^N?t7>OGVZej+Vp4*!o*3] z3&( /6=~;.Rk+R_hQּK%7qvu_Xu ؾ}{R{2ڔi?PNmtO]kCֽxX`y� � @T P+뛅ZYcN@�@�@�@�@�@�@�@�H>� ɓ]b-%mT'f$ �Dy|?`m(@JC=ȯƒ'=?zH_cMzCs4 ~?tPR굂ٳǔ\Oz`]SOz ]ADC%;+9A ^S@O?mwըQƌC0p'زPri{%8?踨f.o޼IW, D[Jc(qW0uq RGa8 8jsaP E} '9MA#e '}4$PM?ٳ]�%Ci޼yRSO=5{2%zjZ}VNL%c]rദa|,YbO?%]۷uQ7 %tL\>T`7?{QCAZP Ȩ׹\G(^@S_[RZ_p@A󿟀}'$Y@�Ⱦ@&MΝHXj%즧 � � gtRwYɵV\WtImN:餤^m7U~Fq)P@R:uHzV;}Pmk֯_ojgNePr/%R,#_oŴ- tR/_]ʡW>=J}6]knPmtS_ ~S;`P0֫^ w ~~{1ky>c>NF~;:Xap37{kM#:@�@�IZYߚ$ʺs"� � � � � � � � @B-@�40ڰal!5Z馛܃si � zp\WE?2h>S� ͣ@xN!?\׃~p voa&Mx^~n!R@ oza˖-Gynv͔H ,~B) (e)د|DJS�? \ 3yI>(LI?'C7<|r`KIx\SZl-Z\OʞϷs=D@8zm 7gΜp,e+>7n=5kw^k]KIT _/ôT0M�p.{i_'`h |�hu@� �/똎;ŋ^z_�ֈ�q#@BٔT@�@�@`Æ UKR+?ѕ^dS[D='%:SO=N9ue3%>jl_lR~/'P>p;%*vL ~21ݘ^C?Xa"Eܽ{:.!� � ?$@B1' � � � � � � � �$b@�P@APq{gTRەW^@pf&@�@�Pta|=z^ ::4 ~=c 裏?)I|\!w?qp>l7tP{+W_}Q2p {AYÆ mVbp!#uP%RJwڴi`デ t{qNI1 ,ls<OLhvfݻ *9B vMb-rۮjժIɵ7oED(d&L`\r;H@8ڵk?cƌ ~k֬qיoժUz! #?V_/s˖-tm_/h@�:&I@�bO@kQխ[t]C�dGZc^@�@�@ VQ++~{Q~3QD9jXxq+QK}5D䬀lK0z5㮲&M֛La=׺߫^SZ>W9t@�@�Hי1sgj@�@�@�@�@�@�@�@�@�@ -j<~ѣ=SZJh*� �ʏ?I֯_oKLٜ3<Ӻtb{}v'gs̎@ bW]uKt뮻.{ fnrA@o…C ,cӱ.mB钯߼d^%2{$&Q)Lƍ]$%Jjg̙3]W<9EoڴiH9Q ?F$b(uY\dB.kÆ .yȑ#r.DN\HXXb!aߍ˗y>&D�@�6l:qڴiU1j� � � � m%RϽlSP+oVjƍf_^6E0 � �  JoW*� � � � � � � � � �Q&P\91b}WiƽR@�@ M֭[ے%KlVn]3gN)Pvm[tKd{ 7؅^hJTB@~Ǝ5Z+LXqȐ!ۖ-[\&Mؔ)S\¿ŋ9mϞ=E5(ytґZ=S%JPB.竵yf;J*>|posM՚oݺZD.@�@ [nN9 G�@�@�@�@�C`LEk � � @NP+'TY& � � � � � � � � � @5죏>Yfٶm쬳β?1@�@�\-\К6mjZ^x! HiV@cܹsmʕVfMw흰 T<餓NeF^ڙ,ͮZm;ڷoo>X6mdoU^|Mk޼)p阥m{СŸ8 VoTO/+SL۫T*UC~˗/_VN >hSG:@�HLA HL�j� � � � �D5˟? G@�@�@�( Vl� � � � � � � � � �%ЬY3[xl2V]aÆĂ �  qƙz^RMs9ǖ/_nm۶.zmwQ,K >5ݼdP\z-KmtbY~'{t.V wI{9+QjJUT>bYؼy*t>]#>.8֮]k7|)YkwJUDXG�@�, |W9+V,Ka6@�@�@�@�@�p >l6{Y˖\*B�@�@�OZM � � � � � � � � �Ĉ@<y/w_y2eURN?c@�U@2 8?qDiӦ$Mԝ! ]hQ=zK`;X:u/’R$BZ*q6߬[7jSN={ڛoi7noz!˛7=VfM+[]q6b%3gPB-%VC \~B%KkqhU\~a]17&VlJ*� @QrnC�@�@�@�@�Ͷn5k":C)@�@�@�h Vnʅ� � � � � � � � � � #/_>moa*UAΝ;Ɓ"� @l kΔE-uֵfE(u\ tɾk+_5jȞx S@a:bI_u4hU>|IKhֵ+IqWn7|KNe[d nVbŊ.�[oe6mꪘ/ZQQb8~BRJxMr^{ͪVjwuu%.TR;.V%\Rx"� @$Fg/[<y"Y֍� � � � � $0cn׬4 � � �GPF � � � � � � � � � �(Pr-.k~gq|I۽{wd Z@�@�~V~}k޼K!$'hӧO7%J8piӆ4CZ$y浳>;LK bZ4co÷D\S}6uT۶m͙3Ǻwn?N8QK5a7M"ZCjÆ:l߾%KPeVBqƹg^uֶzj{駽@eL J(]>G�@�?Mu߹v1Vz� � � � �ķ̙f-Zw?I@�@�@� P+̏� � � � � � � � � �Ycu'kmРA.ٳ'kcq � @x)bJq$ݺu%<,% yJP3|V?0,E K.jժY…s~eYXG&O'WT+ i΢M6u7oKcWvlֱcG+YիWK6m Ԍ>l[lD>%ٵks1.Vb8ZNNRuԱ.]}+)1# }+S?@�P2B 1 � � � � �8pkjE@�@�jȆ � � � � � � � � � xŋ!Ck]uU.9EJg{&5F�@�PҢ>#7j%/SPҙe˖Y֭]B}T46+;3OR)S:u2S (w۶mmС_͛mܸq֠A8qi }-_i:tʔ)_`ݦ?JDؤIwWB[|VJ!ұZ ( �N`֬YkO?mEA@�@�@�@�@ /6۵ˬe(*EA�@�@�TZQa( � � � � � � � � � *Uʞx +{*Wl/۷ϟ! � 5\pK7o^[M<9jFAP07xFm#F0%~A jkUVԖ/XӦf|b6}嗓Twɡ\z}mذFg0j(HF t^K;|pNe(dh?:%ˋu1DŽkq1%j׮5NL Eل f͚1[|۶m$*!� ]s5־}{wÜ@�@�@�@�@ f0;dDU(  � � $ԊB@�@�@�@�@�@�@�@�@�@�#ʔ)cO=K hwuUR^~eۿ30@�@Ŋmvۅ^h @ j \uU.֩Sy(زeKTv((ME8\)Sf4Ѽߪ(WuՔLv;%:쳭dɒ޶h/Z*|+gI?K|L@zwNZW+];6m4E#kРAzlq֭[I[!� \@wiÆ K@�@�@�@�@�B@mZP@�@�@ H"� � � � � � � � � �ʖ-k<Y:t`~U\ٞyۻwoy� �DPPBK/dC vٶm"X"V@r%]p%`իٳ'DC _}[{$Ra76/ٜ9f^jo_|_kJ_m8p `ժU˛ k. WZ'O<.YŽ z 믷իmܸqd;SNP>l۷o'VBmu*� ӧOw<L2LA@�@�@�@�@�ؽl"-x @�@�:jE&@ � � � � � � � � � @hʕsIXR/Jy~SN'|vB @�nΝk|}.}.U O<s6~xAw߅4/!JUtiSbX6'g]r Ia)yS͚5n'֭[]B>}ƍw J44m޼9em%,_|qY?*&>]wezM2^y[bu12 ֺcSR-k@�@ /ٳ]veֹs,C�@�@�@�@�bT`<Ib#� � @HtV� � � � � � � � � �S|O?dݺu[ G1PC�@�A@IKq6f̘h(e@ I/czѣ>믭VZZ}OKd֡޽Z3Y@z `ӧO۷̙3K..f׮]L2nmҤI!?p¸HSxve?UX] 2~*XFY ԑP+#)>G�@ ۳gK_j� � � � �ĩ,N?ݬ\8 B�@�@�,@B08@�@�@�@�@�@�@�@�@�@ R t=tP[np OZ<T#U6֋� �HTR^rOnݻ[޽m 5JL;w\]R={QS@ p_}ծ];f5-^l־=IyC,XК7o,Xaĉ֪U+5kڻ,J5p@1c$,iYݦJ":)dZJ~7 VR%O%Xvz뭦c]r$J;@�M`„ 6b{o � � � � @\ xMme˸A�@�@�rTZ9@�@�@�@�@�@�@�@�@�@�8]�*1@~lƍ_ ֈ� � ˗%}lر֤I_%8ꨣ\?>kР}-kOHʕ+c:6gTkR.2/I]BnΘt"E /zʖ/_nJ�oۙgiƍs+f-ZpXpi M@KmbB DyeBÇ ~yֵkWH… xP+95F�H<_ծkcǎ@@�@�@�@�@�ضl2j梘 � � %$Ԋ A1@�@�@�@�@�@�@�@�@�@�p wqv}k{cio2>v$IHFV*D_!3EBT"˨hhɊl${YVG6y?2>88\}9uuO1brʥ^xA{t@�@�( VٳgUH͜93J331-'ggdɒXb;vlLA`׮]:wt_|P4gՁa<M~_E`9C _>3m߾݅a~ʞ=VtiKZ׆ 2'^&P+0@„ ukΌ3ܹBUbEرC~ҧO݋>X&RNr@�K.qʒ% 7` � � � � �?l?{S@�@�@�")@V$ @�@�@�@�@�@�@�@�@�U)SSN?݀js<͛W 6t/ڍ� �/`$+V$tU6,oș3-Z-ZA_~e]p[G;\`۶mYp᫡Z7J5kJgCw}5k»٣[_~J4{=l3A.pBp( :tHAAAM 8qb Zdʕ+rέM6믿}P"'`ZiӦ̅� �>'гgO]VƍS}4@�@�@�@�$s"En "� � �w&@֝4 � � � � � � � � � 3I$ / }̘1ھ}-իk>� �%`>\Æ UjU8p:Io|Z) ^#GT2e{n ;w˒%RJ D+ l_PH,K/i„ :|7Qǎu ͛{LbfdcSYΟ?Uz]eae˖UD|rM4I -H@�[`ĺO>|0y@�@�@�@�@+̑*W@�@�@gMEC@�@�@�@�@�@�@�@�@�@�H 6luԿJ*TR2e\=+@�@ -[tٳGE!3 v;ך5k\PΜ93vVZV,JWCnjԐNҟx}y5c ;vLK,Q֭ٳw6m\ѣG.88ؙ0<:,Y2;w.+φg}V ־}O?ydɒѹҥKP} �CԴiSիWO/B t>"� � � � �>-eTOw#� � �.@VB@�@�@�@�@�@�@�@�@�@{W*-[̙3nݺz矻-i)-A�@�@(T ,*SV{@><yhŊz'TV-uM/_T_@->(͛'m.yNKu/mU t޽~gիըQ#:~vaw|c} e_cƌ}.TV-:i.%P+ 7=F�c/ߓ'O/{J@�@�@�@�@�;WJH*[DO@�@�@� P+6Y � � � � � � � � � JҔ)So|zה#G;:r䈗!� ? NZ&LЇ~^zТǟH_|\*Bh?`a[*Z;w>NnAV}GէO\RGɓfR͚56mZYf=\罵;QnW>#cƌQ^O E:sLxxs޽{+w7n>#mٲE 6Tx񼦝l%P˗ mG�@Vvi͚5)M4@�@�@�@�@�3G\G?S@�@�@� @V@�@�@�@�@�@�@�@�@�wx@_|vޭ֭[kРA.XM6@�H>.\M6H"Zb jJK,qEaA N8*o޼V7V/<aIҟJ=&yM @v;8p@#FרQTR%e!\}u!\.]YClhw LR�/jС.H˂I;u䎥^z%%L;a}Uǎ#PGF�@ 4oGY{Ci � � � � �^(0wT6&!� � �^.@o � � � � � � � � � �ą@LV5k,7{ztҸhD�@��(U֭[ \r<xp�*eoxᇵvZ=CP؛K|G`۶me0 ~P]/;ƍ?CvҐ!C1cFUdIOޅpٱ͛}J$H@ЍOm5hlT\CO>u rƎ|$۫I&wnݔ"E k?4s6$}@�@#rJY�i.]SOa� � � � � #;wJwKUHi& � � EjyƠ) � � � � � � � � � $O\o߮qi޽*SJ(Ndڃ� �~&`3fPϞ=onݺ:v옟@ڴi5}tꫯiӦ:{/w{$LPs&p҂Ҿ}ңJjż/-Zѣ~.<~`ʜ9 /]H7.OA :RN;qDtV{u͞=[ŊO?WWNa & O � St߇V\ٝTi, � � � � sJ)RHJ8G�@�@�nCoE@�@�@�@�@�@�@�@�@�@�@H z)-_\K,QΜ93(W\ׯ �IJ@x[oiΜ9Zb)Kb05ڽ{w͜9S?g�RڱcG ޽[ٲeJ>i|3VT<3PzN?*?~=yd=zTVRvd1rx5f8p :3:r Y-[.](]iҤq{K֚5kTjU=cʚ5֯_o}nGx2ZԊF*A�@ NΝ;'|Rɒ%s6` � � � � @<zk%,� � ��Z��@�@�@�@�@�@�@�@�@�@ҥ5~xܹS 6T>}={viF۶mZe̍� �DAB ڰa (rʩrJj`VbVZj$Ix:uj̮V,8Њ'Ʌj9r5T˓DA \PXbܹf͚,Xf͚ij޼dڶm)SO>|XAAA1‚߷lSvu}gظqcw,tY-\P? ,Qx>N>/*]tT# � @l \|YM6u5ӧO]wM`} � � � � �w `Λw;E@�@�@� P+`7=G�@�@�@�@�@�@�@�@�@�LwgW?˧5k[ܙ/K#� @2d "kݺu?. -vxb5h@uQ׮]e S@jѽJ<$YVѣQc@H8ʗ/^ziѢE.`tU,]TS]ЏpwСCʘ1cloו-[6׷YmұiӺ*4Ύ_}Uu4qD΂p)+O$P+vY �)о}{͘1Å͛7:.@�@�@�@�@�XؼY\"ձ @�@�@MJ@�@�@�@�@�@�@�@�@�@�H2ڶm۷kn jժsӧOnX �@xԡCuV*TH~AH$ /R9rw:@K\  {j<yuP>qHBիWWf9~x,YRӦMsBTB.ŋ1Y{��@�IDAT_  uJɓ'wdw}wt9~&JH?vXEgΜQ޽;wnM0AC f`,JƝ"� ]֠A4|pI z@�@�@�@�@�X3G\"EbyŬ@�@�dC @�@�@�@�@�@�@�@�@�@ Ǐڵkk޼yڴiʗ/N:)[lz״cǎn"G�@�?0u֩tҪRzK.Y// h…ر?UVrwh{, _ʙ3g,VeݷDhTI $k#-=tҩnݺ.g˖-ڻw+_-`FzvZ]|9Z;z!perRXƮ7g|Ν;W֭0aƣX P+VY �*0ekN}QFn*C�@�@�@�@�=s%l( � � �!m � � � � � � � � � @> ={{6mͫ\?\~<� �DR஻҄ o߾.Xk߾}\y Ҳ@|򹠖/"W|ZPN:9rt?F`Z] QVYiӦ0ݻw0(M4.P>3dȠziСںu'.((롂jՒR XhѣGccĉ*P^{55lP;w[oɓYA/^<S1 �^%l25iZX)@�@�@�@�@7.],zVl?F�@�@�A@-o @�@�@�@�@�@�@�@�@�SiӪCnPɓ'… Q 8p?=[ � mڴъ+~*TH?cl7![̜9S;v /-[a-`>Vrw}u*Vȝ;~ر:x6nܨ=zŋڵ GgyF| Jk{'N(cƌQYy֭[8Sӧ@ETR_+B>#<xc J:$Hཌྷe � pӐ!Cnx � � � � �%0 <YGٳoZ@�@�@AS@�@�@�@�@�@�@�@�@�@�?j׮_~E7oVժUճgOe˖ͅ ]_N@�@ ,Hk͚5.f͚.0(x[SNՄ TL(xC?hC n%9r<?_tITIDi8ix`z5m4Y@+�O {t}qСCpInW l+_RJ厹G\rnSY.]) � [nuAZXjbv � � � � @X˖<5SN@�@�@�ԊH@�@�@�@�@�@�@�@�@�@�U@Ow^n0~XJȑ#uh]!� @` LR#F_O?T<vX֫x ^Z.\Ϟ=۫Kb_y,$Ydr/^c֬WC\*V4AK,]ǏkܹjԨ oڴ2gάzHڵ?'O`1c�Ȑ!=]չ֭[pݻw맟~r.EuPQ ;v@gF@�bD`׮]Zɣ)S(I$1*E�@�@�@�@�=+u{JY � � g ?t@�@�@�@�@�@�@�@�@�@Gl6mڸ ,p![?x hB/r# �x4sL͘1CsVCmO*I*U\hG~&4o\KV&Md[{vQ˶jJիWW޽եKŋ/FK!pAʒjVWC͓e }޸jӦMs[U3nYW_հac<.`WTO: jΜ9.hkРA?+ʞs;wέ((((+d "!`Z/Ĝb_v,>}zVkqx?aVd,2GUZ"3+ � W{u 2erH¯Gg@�@�@�@�@�@8^ZDʛH_gÇ5i$X:t֬>vd � � \ӛ#� � � � � � � � � �!PB7NڶmѣGBjԨ)S(88?:J/@�%ۧ._رcaڴi֯_/2f5͞#G<x {:uj/nZHpDd~-[xZpgÆ u\u!pɓ'wǽT^TN<ycA8tZl̙% Jj֞=KOY@eH?5|pm۶-dWڵKwRbFk֬c+{/w*\&LUz O:t;F\9r 5iO^z۷g%LUcjEZ;;w͛7˂5矻i)ST֬Yu }駞gNA�@ |B%%KYf)M4&@w@�@�@�@�@�0~BESg̘3gx٫:@c@�@�@MD@�@�@�@�@�@�@�@�@�@�Gmi!`ݺu3gN7uP@�@ b%J7ވp hǎڲeKȷ^ RUZ5.$^S޽xbu]<#aII\߿~g-ZH rq$V Ν+WXbJ` ؠڙ2e lzo<4g;F@ >=gf͚}Mcoj $oԯ__} ${$I*StiKNjr!\6lp߃= Q{nĉ?~w|ߴiSY RN<[O D&P+ه9crdݻm۶J6slҤ:w(v>qi, _߿_+Vŋ5{l> � � � � �kܹEsFkͫ6mDXv+ c% � � 7jͦ# � � � � � � � � � $LPuO?}g`sx M>]/_@�b@)z:uzm rvKoٲ,JժUqF.\X*Ur!.]TlYYƅ(*UJcǎE%,P+cƌ, @"P-OVT P'޲$G7Oq, }ݲ5ɣ={h֭ׯ +z14hB,@TcǎEzѥK,xHWŒ^%@-kpdmިC,-2!<ef � v.P }-X@Yf ~I@�@�@�@�@ P̑T>nЮEl{Fȁ � � =edZ@�@�@�@�@�@�@�@�@�@�@\ԧO;2e ٳUVz(W �/R+WTʔ)3gN}l'udĉB)7n̟1cF &'Ojڴi?~ #Gjnpݻ롇rB]M}7e5j$W 4w?̐!NO>D:t/nZ K,pرb {(*Aq=#<=y-LTŊҼyE__ 2D;wmw-�Uۧ^z[CZ`}7uwuy!r϶yѢEթS'I=m1…-پw*Y6o%қo`_p[&Ydݻrέ6mh. B,6KI&}]|ZjÇkРAZ~RJf͚}xȲF]y7gdӧO;xFY S%t&恶DH -6bm9b8zjY2<7jY}B;g,_-Ȝ39_dvy@�?ۧ$C2efF@�@�@�@�@�H :%ޥ_e׮' ZڰE~?Ǝ jڴyv!v-RpplٯJ}>cw R^5/_Vt\5\t � �D ?y@�@�@�@�@�@�@�@�@�@�կ_ 0m65jhjr?Q@�$~Z׏?-[믿6`=~]pނXhmX֣>۷@ *]v:B{O?U  oРAh4 Yj (\ƌ+e%D$`Ǽ6`& nqy?>pϺ#d%zg#~*zVca$%Jp؞={{o(P@K,qAdxzg]Xkuֹ}`hӶsի, @rʩGnn-feʔqe!\{F9qℛfX0.]TO>LeA]!eٲen6ydٹo架Y7gQ5=۰l` KċOEQ5sLojݺfvke;.;zM]{}پ$rv`1B j+}ۛ-L}7C1}1 �(`ھByҠ ŭH@�@�@�@�@�,.]< )gΜ[ Բѵ)STx"YoIjʕj֬ iQx"ټO<񄻾nݺYf`)k)dKq� � � P+Ṙ� � � � � � � � � � 5yQg}wp}6w.]Ci0 A�@ .y~uh"{Zj.*UY8zXp{2pATT)Wg}P_9sF mNbM6s=mk.-Bl�:u*6V:PqZ|, -,TnhA'>H@WC,\B<;.;w͛7ߨ`.[Ǐwiꡇrɕ+*VxˀÆ رc]P nA\V֯_>}hȑ^ Ŵ4?b7ɓ'믿?p76 c�V,B:YXWդIP߶ L lW^:O/;Z֭+P,`,lcǎiիWpR;:ӧO\ P $-@W}u{v,>tPmذA5k @)uk}_9=>$:ms_  �,e}h̙a;y � � � � �ܹ\g$y.ps=-֮- Z$ծez:,"=sM*Okf:$~vڊkv5\w/w:� � @ Ĭ�@�@�@�@�@�@�@�@�@�@ 'Nv?G @>f`@�M`ƍ `_|Q6hM\V\GyD6y:un~ZI$eZ)ܴ… _{.$@B@"[L!]!U^ݝ4iRȤ8<X3fЬYd]ti"p>( M)Q*Un'`/_V4is1ܣt_~'J (yڀ3ƍS,Y#Gk+WNܱc& *Td{O8q…7yc~Xb *;wn7-5kVf&MTٳgwRN- ۵k.\ 9o,H%88؅Vn=oY(Ӵi\/8ydM8Z^z%> Yߵʹi;^dɒjժn@$;;zlYHX YW=4|ZtØo,^ j~Bw}Z}fz\8nqy}> � l2-[}Վ( � � � � �)0g<cow Ԋ굴]dŏu8yoeϞ=6*"=䓮fꋮki>uꔻ΅k?@�@�3Hl � � � � � � � � � �x=ܣwyG~7�}f m۶պu뼵 @�( ;vL/^_̙3?W<y4u['Oyoy2 r~<H/e[ Ȃ6۷L\6lP޼y]0/*,0wС5j3guX !VRJkߪm\ٳ ºɽbA4-n%LP%Ktu^ mWlZm۶h,4/ߖ-[�:;vt; Ҵ_~L Qcga^ׇoaÆj޼;],ܹsݻw>;('pa-e{,0uӦM Lʟ?,X͂mG}T}X%0,^kV,V-TF >ٳ  eH5Z z<g>vs@�oWVRj<@�@�@�@�@�?{.|/_Bz-mD"]E6uMsuV\k{ � � �Z1 � � � � � � � � �  `5kt:uꤟYEU"E4x`=zԇzDS@�[TR.I&.4$Ν{= U7nd/_삻"XH`ŋoX$[lqLn,l̙5p@LuָlF @of͚%Jp`jv뮫Zٳ_ dWEX <gT>,AlB M<o`67]v<v~[xqM05qD%J L駟*$t떅oFcǎΝׯ/kUV]7ջgϞo΄Ο?{QKD~;jܸ Y۹sud4d[>}zeߋl޼93 v> P5{[`1/ſBĉ z<g>vs@�o/UN5mT&MRdɼ @�@�@�@�@͓{F{/_BB쵴x-ҥK5\k{ � � y"oŜ � � � � � � � � � �>&`[ Rh"[o)k֬nQ=  �*о}{0zh}W.jʔ)7t&njСϟ}0~)\ys-+W\) op^=.] ӽK/u,(n76@*UvZJZN) Ԋm&<PRΜWC8qb.\5&} nχ ^cAIQ)!uKsΑ,HQF7K,.,؂t"*/8 kׂ d&)S>1?믿B&qÇCI¢Q{?/;Fܿ~WgϞ*X;6.?:m;f{gY Qy ʳN>]¸ Բo bycd<@�_xwԪU+9߰avډ� � � � � p{ss]:[֡Cu65lzȵ|-Ү]5͹sZ$@�@��ZQbf@�@�@�@�@�@�@�@�@�@�_([ ?s�6xN]vՎ;|k@ ƍ72e8#G'N `^^=mذ=g<y-cڴi3ghz\8xs,bmZ i4iҵ~'eȐA:u6͛Zdkoի+NxٳgwjX`H�= J}*~ߘztWC<"Q* pYcUVvޭt.]) k2sLYX-cl{qu.oĉzgM6jҤ _ +ȂxXȖ߂/-`zȐ!ntɂ0 (:_}U@]B\rʕ+ nGN df̘1r D\+h:zVZ%;Ʊ@^{M6pm[ Vo;8Z{ϝ;Bl0.{q5kTRfg ;vL"E g]wݥ<gר獑&k �~$`Ѽ @-;{wt@�@�@�@�@ <sʕoon#s-mh"Et-"uMsĉŵH( � � %@�@�@�@�@�@�@�@�@�@�d7o,DYf1b,8H &  � 68zҥնm[k׮4h z饗\,8[xXpB]hSO=7~i7 װ$IB %JtmB<>C7mҥV,0+?^ѴiSF YrM6d6M0 `]v`ョ4(lpCjȑnpf ʸ9 T!ZRNaOB'TF`7£N?S< mz쩷zUd!E=Z`cjZ`o.h˖-n{N.\kl_~-oQl?En �0$O\>:v ɕ=˗O-[ gF}SΝ+WuumpM;'0^- WPMCz7T΃H làH/3-V ס^۷owkYdqjv9eʔk!81ў;!KEWP˗z>z7ݹ}.ċ@YҧO/GY?}mе!!͎@ۗ^x-sC- �*`ѣeEA�@�@�@�@� %7k*Uno\u=vPdZ$o]7>}k<tF7[/kƍk޼yn諯Gq-RX4ʸr& � � @<^`F�@�@�@�@�@�@�@�@�0l9LСCad@�|xn�b(.]LDB@�CB&LW{{u!PV-͘1Å={ViҤq?=͛7+GA|@ 6dgK})`) @رcǪbŊ�ըQ\1ӧ5%˴3Gȯeage!;ܽ{r{ܹӅ~<7'OTdt}#G!C};H4' m<'w"-LH=a[Eu[Gj4-ZHs_hEB۪xF*[H)V-|駮v(ŶY@߫2e?8p P(uݺusD [#}7&#Fq̈� @, lݺUw-\p,!�'g͚@�@�@�@w^zI:vLn&UV ZZ_5\tG � �/p14T7:{?:+.@�@�@�@�@�@�@�@�@�@�|Q ~Vƌ݀?gϮ;jӦM5ڌ� ~aAw_C<"CcH1#3{X<0-Te! 2/@y_D 6|A^TZUwᰱn36`Eo24s?<@D~lGy0-oۨ U}UNRԩoӲV,`J֬Y\.ub:t9ζZ|N ^ۧYF=?~J,yiӺ: pZx.^x+}hB'x…eɒjYiYB('?(]t}^~.L<gh{'dY@�bJ`֬Y*UtժUi4"� � � � �^,0gTaZd6kݑk� � �DT � � � � � � � � � � H޲eK-Zpu֚8q (Z ri; � �Vἁ4mZ? :t}B 0a >y뭷TN8q [J"#`)6%<A.T`ZG:,*(((Y9 [ " rï}*W تQ}]V/_͛W%J 9W^y}Gk.Ղ/Ǐ_?"U@۷/^3 n"�+0x`լYӅΟ?Zi $ � � � � ̝+5w@b* � � j,c@�@�@�@�@�@�@�@�@�@�@ܹokΝ)=z([l@1cٳx!� 'W\Qxb],L2RobvWj&MH 6Lfzۭ67xCʕ+]z҂66+t&L u%O.OTAl֭3gΌ}_>Зoo~+S@;5kV5m ޽ۅ0@iҤqZ<jKСCu֛ǹrR&Mb… dlqg}˪VjJHQ31oԲNM6Fkyh]v6c �'p9hBڵӻᆱ#G*I$Z� � � � � pvYľ}RʡWe_pa֗=   � � &7?G�@�@�@�@�@�@�@�@�@�XB ߐ!C4m478^f͔4iRխ[ &]Jŏ?2U2 �w$?~NZ_~gΜarD8qEKUR%7x#<Ν;͘E'e˖:OBPƍeˏ?X-[F;@ Q,@d?Hk_ ՚=['x…*Gs= UDM_nۿ֭[_7oެ9shܹڵN<,YȾ3=̙jx qվ}{w?eʔa}urݝ#GpgI@"E(Gc}hȘ1cJ@�Ν;]x_SVZQ@�@�@�@�@�Hsyz^x;SOI: @�@�@n!a � � � � � � � � � �a $ްaC;vF{L64mT A�@$Iկ_kb;0_~E| 7rp',{2elOBP=\ŋk4yw\7ļ@pp0Z1, $'UyHŊ@:x^w `!-ZjE-`w,$pڴipYlY@)A9nUV]vZt~iGٳguPjY%lKN~|1?=F�Y)Syxv͚5ʕ+W̮@�@�@�@�@�^`|yy 9r � � �DM ~fgn@�@�@�@�@�@�@�@�@�@�0mjŊڶmyM<YEу>{Ov [@�C_ƍ&M(QB,@\ $>},dɒx5z#/`3 &yIJSJ<r5Tkʝ;:t^zP/`Z=B >k׮.;w5j͛7@̙3롇rQ:yd ׿۹[4rHiY)RPĉE-1!$P+ :K'@�%SNS4hBO ӊ%|V� � � � �xR*^H� � ��Z>h6 � � � � � � � � � w .<cΝZd*T>H{J.!CСChZ� �&`맾} ?֮]ɓx9;e4HDPdlYǤ[�NZob\I<oJ*wu!c!ZUVռyTvmKNJr!\sѿ{s5~֭,Zk…*Vm7mڴ:vm-B+`Jg#  �D}<Vq>| &; � � � � � ~A+c� � � jE(!� � � � � � � � � �h :T6̙3;wnuEYfU5b:u*�@�@Ǐvigĉ� ײ)ĕ@Μ9h"5kL 6T۶mu…j@ 88@i}$|yZ5iٲk ?P~VXݫ�x?�yM*j֬' "TpaM0mu]*e7}NSr,޽{~Szj.l!jOA�@�;:uz!߿߅w+@�@�@�@�@�B̑Z`)"� � �D�Z%I= � � � � � � � � � �$0aBըQC#G =zh%ުU+eʔI 4ɓu! �",^Xz2eh۶m%kܸq.^v^g-#(+yx{Jj-YruWŊ+˱(Wv!P+͚!C>_?W4 0O.jժjÆ .<(Zم �֖-['Ԏ;Ծ}{zN&N8qհ ?> � ={V/;F]֭[炵nFD�@�@�@�@�Gsʕxw @�@�[֟#� � � � � � � � � �@d԰aCM:UРAdj?Sʘ15k3gŋ"B7@�o SNZv, p0`�,ٽwfwYhQM2h ώ@WBƏVW-, [~+h'M@-;D^vߗ1B{֭[կ_?%MT=zpWfj7 ޲@*_(jia*TY0'|GW Ԋ.Iߪ@-^@;,<9GSHᝍU � � � � �q&`?,P� � � jE)5"� � � � � � � � � � @ڴiժU+͛7 ;Akժ̙3̙7­'@�@ϯe˖魷қok۶m^ny]G:uoE;I$:((4nTT`T@ڵ;X 6B@(o޼z饗4a+}_>}Z:t߯9ry{zɓ']{˧͛7k5kJʹDw!tywCi �^(p}*U[ƍSOyaKi � � � � 7X!9#U  � � ۔!� � � � � � � � � �@,Ykiҥڵk:wkתjժʖ- zŲ( �  &Tnݴj*;wN V߾}>/4iR 6LFr_|jVPco|VգGo -I Բ!7ѷҧOkg)SzRJJ:fΜ{Nٳgpiƅp=z4._/mi&լY3 Dm)R52Q"ώ@�%-H̙%#_s"� � � � ���@�IDATd!h= � � @;ά@�@�@�@�@�@�@�@�@�@�r̩N:i͚5ھ}^~e^\9Ϗ-s]v.xp)@�(T }ٳdɒڰaWFO?իWԩS*RM^Ǔ1c''Fs4.O?ƍ§,P,T=ߪQƵ6C ʟ?*V'|R[5jHAAAnסCuk^hѢ.ڰcꫲ՘,t̙\u{j&!�xm*X;˗7k C�@�@�@�@�GT@�@�@bjkӢ? � � � � � � � � � �Ē@<yԽ{wo7nƏ>HٳgSO= TR/^, � Xx [N=*^:w'Y( <Zrڶmڵk~)QDQ\ iҤ:WD w,`Y7GK<#ժ%M\Ŋ}+ , ,Pœ('P3*l9q;3լYP%Jz*WGyDle׮]ر&N肿Ǝ+VI,Ξ==^"@l� tڢE XB]tQn.'D�@�@�@�@�^zY[}[h � � c @�@�@�@�@�@�@�@�@�@�xջwomݺU7nT?tʑ# =Xl\/] �@޼yh"`Et;'OJ#G_|2eȂ@(/`A.jž{XkL@TO>a: *KNL&}? 4H6mҁ~/5j*UiGU߾}]KӧO뭷R|믿j̙_liYٟDyjf �1,pe 0@ ZJo6aZ1N � � � � ? x.ԅ R+� � �x�Z޵=h  � � � � � � � � � � ,X0pK"O"� S۶myfeϞ݅kNgϞҊhڴV^-I&A\w�BFח:u*{^;vԙ3gn)!@V0q89SLjԨ ?\!C1cFUdIO^kZx͵oV>e5jo{'l.J@ P"�܆Yx.]? Ӳ`-  � � � � �Q;Wz)k֨,ż � � �Q P+*Z̋� � � � � � � � � �  \a5o\? B9^y͛7O.]V@�Y gΜ5kK >\k#.PyjŊjذիBΟ?- UZ�s ]?痘gO<X3;8dʾfWٲ~v. TH%KȒ%Q5d'd߷/ٲd,uY^ܹ3syf2m|URHu e̘њ4ib#G}ٺu<gйsg:uj[gS,ZմiSe{W-N8Q6vv(/3^ן#�Sm۶cJ*Lcǎ}&  � � � � �w*0kY2w*G�@�@�Dq@�@�@�@�@�@�@�@�@�@�Sܹs[.]lƍfk޼͛7J.miҤqAg~� �ƍM2=?~86D@x6f>|)R6o&L5ĉ|nB6W~;{}䓞 PQOg'NhGe˖Y6mLE[̙3[mb,nܸrJׯ_)~I5J@f> �$lٲِ!Co߾pBHm � � � � �#_>@-Y"@�@�U@`] @�@�@�@�@�@�@�@�@�@ dri;wիW^{VXa*TTRYÆ ~s΅ G�@_~ǎk&M9r[/ ng}GƎ{1-%MUرc_jpB 21UKx1թqx�>LVX0© (`ڵ3۷Ϛ6mj{ZXluB{￷^Lj.] T3Ԋ,I�  ;vʕ+[խtҶi&^$  � � � � �3W,):@�@�@�%A�@�@�@�@�@�@�@�@�@�@ @yk߾-_y`l֭VJיBƌc'O Rm@�SVZ~zoժUF.!8[KY s̶pBtFAv)r@-I$Ј>^4(U'pnsd.P#PXV޼yw) :~M:*V趙oK<,X|M>}>}:J._lED)_Lo8_TJ �  gΜ.]۷OϦÆ c<D�@�@�@�@�Q`l|sn6[G@�@�@� P5A�@�@�@�@�@�@�@�@�@�@3f6m؂ ?nݺّ#G~"E O<L@�' ÇUVY٭_~ Q)'NOt!=\2*2`_!@lB&O.a ^{Ծ.[AJ@ "P+}3-[֪UfŊM6oms{VBѣov!7n.\سl˗w!G%J{ϟoϟME/^XbtL,Y25B�@ FmYf?:wli� � � � � @DvUf.}<� � � #wrL @�@�@�@�@�@�@�@�@�@�A mڴ֪U+7=z~8q+ /X]'(ZA\@�8p-[ YΝ;m~"qO\֮]ol#G hM$+ΨիgEuT=I<U;yeJ>PС,aBg5n5kdVL4BV`.H_Z<y\HnUhTzu7h{ٳmW!CػB^V2e,o޼3f[MSVlW_}Յ!^x;v7W� @ Sm/^l5?RN䭦y � � � � �ȝ,Q" sn<lm`֫@�@�@�� � � � � � � � � � �!.Nw6lӧO?µ}kӦYZUTqG8G�E@K.0gy^~e ;Ƿ>֭k͛7|ٛoi:t{'xJK^@3gδ]}ӧ{BIKN'I$1o�O$MH@%}'<glj̘l x?j"ԾAwqD&MD(JNQjPٺu RV=]v.dɒ.\K![ٲe+0ƍ[`Ν6yd';VpႫ 5(MM6Y cA�@ c۷w +UV@�@�@�@�@ <q f6dfRMdv4%Nd � � @ x~AA�@�@�@�@�@�@�@�@�@�@�PիW#FM E`L2٫jy;@<W vF�ȓ'-Z>,wn͢&͛gk׮u ٢D@ԩm31%nKf sY^xx&x>"EmdlV@kժկ_߶lb?|C1Ɓl֩S'=omٳgw!H Rh]3k9s J׈ߝ *?s.{zsT[y'N,Yدjcǎs �@�@�@�@�@�H]oyN۠AfU%MjX ej � � �f%%J � � � � � � � � � � qıeڗ_~i-YAMa K_c۩SB҈F#�Q%JtH"@@aF_޲f 6CAhB +V~w{'\ro ~Y4iK֕ˬuk3OuZE?ّ#7>#-sĉMطoqχUh ٳ[~y1,W\.|vQ[x'%-hٲe̘Ѽ!\~ @]}N>mǿh<xFj鸁� @;wzy2gl_|u6nh5k &@�@�@�@�@�?H6x/\[`3g( � � @ԊD�@�@�@�@�@�@�@�@�@�@ dsB?k֭[C{nShbŊ6`�S@�^)DfE T@mҤIw/bYd:Χ U QǠAo߾Vxq۶m[T>(:ujt~k5h`7kB|<!9_h(Ph+'}ۄ l-[(oQXpo@cǎٳw/>'Oۉܹs{7?`'NgΜ!Pzࡇ2ܬTdI˞=Fq@�FҥK6l0{Gwޱ&M]=0 � � � � �%*Y7紬icV@�@�@� B�@�@�@�@�@�@�@�@�@�@�Ȝ9ǟmlܹ~߿B=.]:+XuVZ4@DRJN* [nXOXTV֯_:nժ 4Zzu&:… /_>ѵ?/ꢠcSSGmti6|ѣiy2]Q'BjVpV\cǎ; S)_k)U}pB: zꩧ\j*U,YdVH.1k,;{g=s̒$I/͠>\)\9rE9C�@ P?qD&ڴiS+_mٲźwnI& fPO@�@�@�@�@��~7]fh8� � �MT@�@�@�@�@�@�@�@�@�@�F E֨Q#שÇmɖ?~0 2X˖-mԩv97A�M~N*Yd9s@„ O>qFjc= tikN Z-^ؚ5kf7:u@[ ?#L]#74qYBf7'lߑtH׽A-d7SK`ΝPR2dϞ6l`ŏ߿*z]m>۳gOb~A=z͛ƍg Rзz-Z. wD\rpJ{%x @�P5ըQòef֭Zt@�@�@�@�@ Hurȑfl G�@�@�F"� � � � � � � � � � 5xr6`�?m.LA +Vɓ[mСN) �T%HĎ6lx<s X߾}mȐ!. bĉAE nܸ駟ڴil޼y'O_.:L2پ} ~ v_R6'N zCa)gΜqY eظq^}wkFh8kZjP͞ݻwd[b,Yd^zn @ҥ-f +i&炣@ &Mu.顇r! U7@�@�@�@�@�8G)Ykάp@�@�@� ș.SA�@�@�@�@�@�@�@�@�@�@�#޳+V8 вeKK&-Z>C!bs|@ų5j..\u^͛7M6YR\ٶm24?*ʖ-kW|Yɒ%C uQ.%1QR1s tm1O}.pad!O<ra={.]TrvSӻ] ޽XB߿͛RLikv!\[l3hH((Pylj � :VVZjUVل L@�@�@�@�@�C@Z) z!3O$( � � �> PˇL@�@�@�@�@�@�@�@�@�@�'؋/h?Cqu /` @@z Qp:PW'ӛðalΜ9{nԩ9sQORHaի/^ܶnyD3e䚳cǎ`jVȴqҥ֭ ;LK/}(/p!} Uh*UH".tm۶С`, <xMֲdb-ZǛދ <뭷ԩSoأ>j2dFmϞ=Hm{oҤ%N8M@�C@-#F\r] Zr}wi" � � � � @@ (Pr٨Qfs3G�@�@�L"Si!� � � � � � � � � � @^Z 4uּ|rk޼Z=<yr{駭O>F@H BDL24i+35l}A ,%J:#ڵ}g={v4iRX>PofϟwA|eI$1 =1Y<L۪' 6(KJ (DTa ޵k *M4Q_(풧t]3W˗^u2e=zϟo͚5;wev-[#G\3 @r>fzWwE�@/ַo_{]Q֬YゴuR � � � � �'pbooV@Yb@�@�@ Ԋjq� � � � � � � � � � �C{urd۷o&Lh=Cvڹί10UX_?s'NGk׮bǎmmڴM6Yb\eJl۶mw0FE YfŋVV2C [GqװQy<Y޴x6ហCgo: Oɓ'ܹsjEòTxBD&PQx+d4ʞ={\3ӦM{꘢xֱcG}_e3f̰իԩ޻ h۶ :u-ɓQ/P`ASp¬P4  �( e̘x \mٲFc � � � � @ \0-%]ֹszr@�@�@ *ԊJm� � � � � � � � � � �H*5jƍBf͚e*Tɓ'[R,EVF <xy;D"uHbʔ)u4iҤ#GЄ]vΊ;udgΜ>7n\޽͞=VXar岟0ef6lwOv n} /}`Gs\-~w#p!rRF`֭VbEQ*TTᢡRv킕ҥKwGM?=S֭[7[t9r&NhO>M6ƚ4iR¥9s; #GBʖ-/^hzσ "� p z饗,}[ӦMmΝ֧Ou � � � � �B ^<3 */"� � �R@-_2m@�@�@�@�@�@�@�@�@�@�+8qXҥO?7ڶm?g/l<͛ڷoo]pNj@�@(ZM֠A@2uC%JتUk׮g{Ə5J(ի~O?uvIgϞ֯_ (4OfaֶY .}y2}{#paט?x-;w9sz>wܹs]DC("C T$NتTb{5k=Mۨoƅ*`KaN} R%D=OA�@_OS;WQ)SjR@�@�@�@�@�n*,ٿOu`?MG @�@�@�H8֓mLA�@�@�@�@�@�@�@�@�{=;x`D^k@�@�B@eϙ3ǦL:bܺurʙԁp(v}Av=zN8Ǐ_ɓ?x6λ@jX|mڴj֬ H`cv|%J?UT"E 3f4Y}쭷޲#FXɒ%]hB\)Fm-[tm?O<A;oɓ]$L'+Ny7֣yf Rx�砇{/7x1wA.yfq !j }/^[U@@ǫ*UrvwQD@ ClC4nح'MS;wٳm֬YV[:Ppf2e\p"Zh7o~t%;fGqj8uꔻӧݱ$~ *B˓{ﵰgq-ɓۈ.3^� Ν;gcǎ^zʕ+^{ͪVE@� z X4@�@�@� 9Tu;\W^}{=qoy\s>5 :_:zt&!� � @<)2y~ mkl#8}Z!i6 � � � � � � � @AD82@�@ 2l₵ԑܹsM?xU 4/^F4@�p ;vۯ .RGA?Կďub {qk *Pq-= ҭ: G)=I:A3gz %#/ Xx+b kѢ.`%țM@`֠A{{}>#d*D3f_}eֵf,{3g{on� 6m۶m>'[}N >70KZ_|x:7K]]Թ 4<5kV˞=%Æ ^xU^}6Znm'NڵkІiӆA;B+k}6j R�[T+[:oQ}wdȑVH4ZӺT{q:nSn5hP ]yXWw tfΜ錴m7 juH:Ӷ ijޮt.]kO>@�$k.߿ <mj֬imڴ � D\/D � � � �:ߩsZV<hiذƋ+{^뽯[իϹYMZ:KU$I₵tUA2dp}]CA�@�@� P+˘@J@�@�@�@�@�@�@�@�"x � �)٦Mf^.]JVL N@ůYʰvZ~,oяy~u:WpU)LZիW[ܹ3<]7WW]wo:к2K,+W.7h~?Ō3\eIv믭}#.]X(?eXt$ {VlY>Tg"ZYL8ÅC0ۓmbCO<+\K;~ S:ѶVG}u ҭMrx"#D!+ wѾp/Gh9rp.\S®~m~ yRgNP8P^\tFʿZ7hڲeh#v]!ހ盾ɘ1nL2VFam{ڵk8E;j=d56h>|IIZPOiVH7QZc--EyC零ÿQxޢecZm雎yҭAXD �-mߌ3؏?l֬.S^v�KFT!� � � t>X]u}ƍݰiӦ+buw ҹf*5Ww@xǽYZ-ۍcހ-{yo_U^s:s6(k֬W̙3¾( � � jE|9q;^� � � � � � � � �Z@�@��P ҠΜUu[B7,YuZ ͡ Z,]-Zd/]URVΜ9]': tuAƯ[z^A[ٳgwAE5 ZRK@<矻ݻwo+QDp5֯= >|+W/gN1(8s믮y�k?|x:ihMKdt“-xEA7{]Et_,ꤨXb.HF؇[oCWZI$ ̝;E8_ YHjRNF! 4Z`\FbbLOހ%Kx~^ҤI\ɗ/5sTxFEy2(dJ@Ӡdu(ԁ`L2mtܨA7xCN<ƍ Mǐ dԭsz�  1{m˖-n;ުU+V4p[F@�n'@x@�@�@�n%W\i:'Aצn޼Ξ=^@,]/sDY ҭq˗/ہ\ru>ZAb:~؝[͛7ix PN@�@�i" ԊD�@�@�@�@�@�@�@�@@- � @� fu, Rg|'p mȝ;ň#�[G@ /5k]!/k֬qEqʕ˅h\N>}%\KC|ݪs)R`ŋu~z48 W_u5j u_ /رcSNֱcG3VgjӦ)8~<΄ lԩ6|:yꩧ\M…Pyr+=u)Й˗p_~͛gzL7 ֪Z P8>33:B7|c*U/…%!ԤI\u[:Pɟ?)`ܹs܅ YM! Sܹ]2xO1 MmݺC)(�a z,qԋ; p nÆ .L %vAZyq,X{N{ �~%>=Alĉ�z깰S&R@�BC@Xδ@�@�@�^2K,qחرM:UT|ܡ7D+Yd1뀜ƩSk)`k;QI:*TtȶRi@�@�BI@/m"n+@�@�@�@�@�@�@�@� P� � iӦa̙vs~[��!ν}On˖-3uEZC6TG zQ̙c)SgݺTUJ` L2ŅXl߾ZnmAH_~k.XC*ɓ'zGV%Gi76u7nȚ,Ӊݻw۸qܠ TXmDA-~ >£Xb#kծ]ۅkŎ;+sTyѣ=k8z-;~m|v|W{Q3ƅn.?Gc oеߩVQ?lV>carc.\(<K%M4n:M!5J Q)L)HM ZeŊs:˜9s͜)!�DX`޽6tP<xS}|# @� P+`G�@�@�@vҥ/ӧ-iҤۂ  pm,cǎtu=۷ĉs.]]_sŻ)3* � �D�ZW&P+v@�@�@�@�@�@�@�@�x � �A&ΕW\Bt`SLYZÏMlӜp ~0aM4Be̘B)TL2. "p%UzT!dիWZjY 1%FG}VoŌ}k֬ANdEǻNUyl͛-K,.p·'_@O֯_?w<$IRլYhl_[ ,+Fk*ᤏ? fϣM5P΋/h˗/W_}E6l*E:jf胹h3QDv̙[N]LGA;vt]u֙;o<SpW„ Q}UgmiӦ܏Bm۶Ϲ7YtYɒ%ݠc|0 kŬ@�P?`Æ So4hHA�]Bwr@�@�@�8xdUuٲe1br:A\Ǐ+T`<eʔ)Se � � jE\@J@�@�@�@�@�@�@�@�=� �msνacSj)\K+l::t;օh*TȪUfUVYmaOiӦ:Ug ~VN:+PG}z鶋4y& G{u1p@׉ #)SvY۶m߬Ǐ_ ٳg;Fx?O.∵@ 4{>|*VO>d& R(_:u G5O:e;w޽{#zʕ˅v(`ĉ}͛8B<pB+^xk`-퓎5y:lq �)Qi}ۼynQ!.K,q!h^N)`M˻ߴ,ĉ=d @ ,ZȆn~8q4n}g!Ai a"L @�@�@�u}ە*Uʝ<hQV`ΓϘ1}ǟ'O>5Q8 � �u !P뎸@�@�@�@�@�@�@�@�k Z!� �.N>f͚xrPLױdٲe-}@h1gWv?oР2e {׹ȑ#]V̘1/lS0lboM4ògƘ< \tڷoo ޽i=Fv9 Z/ի}/ aK6yd믿pM.]/ g'On]t-[h گx饗L}=WBӦMkon:+�s߬@vZˑ#G�8*~.U;) ;׾)O=LE \gϺP-}7eO([Ƶjղ~Ǐ  @4 ڵ}_ -}ד3gNd`XQ@�Z%@�@�@�BGɓ.DK%zRUZʕ+g{o`yKu}Μ9z3۷kիg@�@�N@[/"n+@�@�@�@�@�@�@�@�@�@�@�kդI3f<xVXa R2d,Yο{;~5D޲xڴi:U_x_=NMܸqr6zhO>Ė/_n'|~'W9D#<fϞm{ܹs[11< PB {gĉAoOA@iB=N z?q'NSPܼylܹv=%JO!pƸx)x-ESh:Rg[J7Zfͮij>l��@�IDAT3})a ̜9RJ?//t ;v AOj?Aeo(m…֡C+\0aZ7+^k֬;wZ׮]Vvm:g@j@� Qt̩WXЩusӺ#c � � � � �.rJkڴI]ɓ' fժU#L:^lYӧZ ]s]ttYm֬Y~Vk� � �(@֍&<� � � � � � � � � � �V@7˗ڵkgӧOG{#Sɓ[ѢEcǎǨm W_u>|M۳g <@<r+$IkѢ^̙cpy?0(B.2Ν;۩ST#իYdEk?sݺùi۔)S,k֬.ģm۶.wޱĉL Ԝ6m-ZΝ;g r Ϯ`hڠ>̲enԺbIb@-z?$LjժoƎ~Gֻdɒ6j(hc Jp (<UV`}Y=l1cF �\+pq믭|.,뭷޲ 2O}2S@�@�@�@�@�B[@:(4w@ۿ3*Wlq m�i}̘1M 0-#Fkўz)ˑ# :ԝ{PM@�@�1Bl\@�@�@�@�@�@�@�@�@�@�:.Su͖/_n =zΝuNS\9޽ҥK SE�;{}Cل gϞ.B&M!?(Q|a͚5裏Z*U\G ꄁ8xAyf$~o.\PӀ(\-[ĉcE+VD#RI j5cƌD:_UTɅ>mܸ:ud{o$!'ϱBI5gn / raׄ)RzS|V)HMiP7+w7{>m;@v+ hUV>}\Hk˖-ݶk׮cs O?Yݺu]W G\@{/͟?߶ms1=)�ο[VJʭ3$H`#G[u|;vPf � � � � �iz\rSLíZZha')S͙3֭[gŊ3Ϝ9:� � �(@V0.Uڄ� � � � � � � � � � �.<yrU 0uc/L ,^)?"G`̙#Gѣ غu1ܸq#gL'Zf8_ ZV Whժ<y'cPB1ԙ:_hݺ`cҤI!S Ytٯ_ :ujPZ(Xlٲ.\$(�R`f͚[ʐ!C�<#F kذ;.R^e<t[j^T&LhΛnU\ʍӧOwd�? 0iXOߟmDAjj+X{7-OҥK@�P փUVuz8'ڳ>k ֢ � � � � �  k6αmذ;+^8@A(={vꫯLo]#k֬nasi � ��Z6 � � � � � � � � � �@ƌiӦ6j(ۿY:w:~-[l`_: R[_̙3ֲeK<7mdڵm_sjp@|ln}riϿz�K~g~z˝;gY *w}.f͚ Hw]+T`3m(Q+,u %K[zUX1j+sK8 6Fi4) ˑ#G\MO`ʔ).vȐ!.aΜ9NSԺ҄ LZ)SH+fUTqkڏ?heʔ VP; Yhۇx S) @0 =zԴ`Z4iӧ;ƍ) � � � � �xrÆ 4iҸۇn>wnX u駟֭[t.\lٲ.h+M@�@�@ @ E5@�@�@�@�@�@�@�@�@�@�@ Ӻuk<yUVw^kѢ=9sfk֬ ٷo_p"Y`ǎqĉ&UT<&>[-ג%Kg^$mٷ~kK,qO<a+Wv44 &qıCJԵkנQٳgM3ׯթS+�(EQ7sdme{'СCraK(\}PXݺu]ȃo7n1b Ja?),(˱c\y"EzWa ˞={7G?"3w\۳g{/)^  ;w?N{P_P¦<h:iڴK#� � � � �:ue˖ϟo_״>%W_ҥK9 80 h1 � ��Z~8  � � � � � � � � � �@XLE+b֬Y_ٳ]'6lFYڴiݏ[liǏ7uNA�S`AK ZʪV M$KƎk{:X&MŋAҺjFBܶmڴi|YzlAk}&{ٗ_~i;v6m˗}6:,ɛ7 Ky:֭b䧘^ȝ; :s P=TtFۿKlȐ!xv…?͈''O|֌3\ؑ$2;P8ŋM}ڵk|BF._ɓ2ed:u)Sڈ#\֤I~$Ih)F�@�@�@�@�g}߬k+UdժU5kX -tuѢEK/YݺuMP@�@�@�Wѡ<@�@�@�@�@�@�@�@�@�@�@�[RJY.]l.`KdWRuYNI:WMd*@( ,Xz)+Q͝;ҥK AVZN(_t) ,Wۖ=ږ-[fYf5up`m2B-ZبQO>ָq ^M8_fΜi/u|(#@鯄׬Y3>jm۶ͅ5k;[uue~ [gС;}^(S{uV|@m c1bf|AS7|5j N*' ÇFy!w,:gp}A� � � � � -U}ܿK -_Ó%+V,{w_~9sXɒ%ѣ@k@�@�@/@%@�@�@�@�@�@�@�@�@�@�@� {ョ3>Ȗ.]~:yd"�jժY),֦MslܓgG`ƍ3O?mcǎ{'xGKn(SM6ͦLnF@׮]ԑ{˜9넁W,F>k?7ν L0 ߿$I{9q(|i�}6D$duEѣʕ<h .tq%L ԺO hҤɍO#z4hwB1GgmRr:XÆ k׮$�A&P/},Y2 (tʕk.SO=eq @�@�@�@�@�_ \pWBt p3ŋے%KرcVT)~p3(G�@�@� 3Z&� � � � � � � � � � �F QDVreٳ@S?ޞx 5kUZl˗^{54i?b͢`(piQȑFibŊ\;kul۱cGg߿hw!0`[|'XϺhѢZm رc[m˖-֩S'̔)ܜ8q/oP #S@Ix? ){]7ߘ:-˖-sf*Ur;v>uǷ9;|.o̙VJ;sLD'7˖-eϞEVx?(} o|2Ѻ߶"EQFyRKm۶֭[_J.m ?7o^?t5]_N'TVZe r۷+VX…##Fp-uzhE{7vgN:erVgrI&+fur[֬Y^ʜ<y҆juuz„ a-,ꫯo杄Oo T=.sΙ_u<%K{M:v۷ٳǭ~1@�@�@�@�@�jϟo:?[@Lo_N#NۧO뼂dȐdf[Q@�@�@� P+ � � � � � � � � � � #dɒYjլwᅴ:nW'%J_~="E CrU۷Ǝkqĉj LazD_wz=zԭ~'o5{.:m'#(]v+؁"yL.:ǏBڴi#ս{pW5ŋۢE,eʔ֫WVϪ ,XKz:P(i>QΊ/nM'"sZ7GxW.]jZogiGx5ktZ.]*~QGv &,3g==u1cا~jŋ ,/ T�J P R;c 4_yCf#s_]UH"}Š?hEFƍS>V=;j^\;w_m6mU w9U._tUWO_~3ϸ]²?eʔGuԱ!C�IS@�Xn;M-[f̘B%ǏoM44iDU � � � � @ ]s;wk?;۽{;_LjqL:;l2ҥÄ@�@�@�Ժ^ � � � � � � � � � � @ ΪUg}} J<ɓҨc΃x~( ٳu8۵kWPVۈ}M_%KkٲM ؾL20 o 1sQ}+ĉ|ճf~>PSNLZ-Zpr۳gp΁3tYڴiMa [d רuח[1cF&`ڵk_?-Gn9;x@.HP/_EaF{uGF;x?]@(g\DSHVɒ%M!{#Gtرcۀn O\ٮ];"Eh`ɶyf_2G1BYp͛mCY_#=PM >UӦMs/f_`Oy˚5kc vScVx~o iժB-=$I6Ek:ׯrV55j5j̙}Bz׮]kPR_i"� � � � �m[_~ʕ+8;hFG+֕E\nnl۶mG�@�@��Z@�@�@�@�@�@�@�@�@�@�@� +`kĉ.,GשSRJ:<WG? rwM6f(p""E! tnpv!4/_2d0vِ!CL?H4TZZ 402gl}sWc52eӻLmls} AK2{~_Yfͮ<(Q"h"߯<~"sZם<;wn3gm߾ʖ-kǎո>+V̾H1>}ڴܼy=cObgZ-Z)[f̘­2d zGJ*<B"u>=Pe\+\yD67P׿ꩧ wRd/<NQQ@> 83"kY(rZo{wy^eH|' 燐<حuG}91y:믻\ԩ]P:dcǎuCGS@�@�@�@�@�ݝ9s{=_Loc:Oc~ӨTDxͨw1|G{w=-&� � �G@(1 � � � � � � � � � � D تRӖ/_nG)SpիW=aK7nBBAA_;'NTIAs=DŽ <ԩ4y .qUfA}۶mB ۶m)[&Mlٲen^xb{饗\l*n?>˗#F\3?xWh;5L7n}VxqUi]Rn]LBHz႐j֬:ֶ/ggo*(D?#: *ϯ&}_%W\<#GwҤI.pK-Zs6o޼+ ϴ3Yt .z']G3g>lٲܹsm޽.Pȑ#>OTLTm#^}ln3DrkԨ=nzq[OhK.n]8m4ѻwo:Jڷoފjqnu{u�ۿmܸ|k^:%#e̘ٳq":XzquqvR~_~m?s/ՁZ=\j$ɴn:u)T+L1ʦMi?[ns':ƻzNquc2eʸTRUHuYxS)Mĉܲe! t\F*pX?*<@ O!)RX%L^ǦMW#K � � � � �Թ$IZVСC֡C\~`SִjtLD?;Vmu`ZFիW?]Y\9w}׹̙3իչn#գx5Z@�@�@jZ#� � � � � � � � � � �~.(Q"nݺ 0W;vp 0Q_~ik֬˗/y˨^0 6BX|U+f p?^v#k&ҰaCS2Cǻ_F 矄 ϛFW 4 2Wc=:N2v6mژB ٹڢ[eɒuc;vtO<ʖ-k7oرc;jˢA޾ӎ^ԩSdXF Cg}B\vQ;w}6J]�Ձxa}V5:! CݻwiK&I*WI&N:#njcٳgwiiaÆu:] iGyRJ ̇z_5ڷM6i}㋢mY͚5s.\حn?mN2d ={)Nc H;uگͦ{)] Kw$@�+̙usxxlɓnU=zϭ[uj2;wnS'ZV.SxQU49>S{H7t<zlFg=~+])JA]\U),Uc:ƻ~cY#۷&~( 5*lVXe^ OYfq#[ &X| :c}u2@�@�@�@�@�5:ou'-ZO]碠(gEjc'NM6#DONՀ۵]ڭ4w\5B[tյ:s9Tĉ^"� � � PWL@�@�@�@�@�@�@�@�@�@�Pul{=3g)`k޼y߾}{Sɓ'w*;8)J$HVA@Aw (A<ә9㩨 ̢DD$*$HRA:.S_mtWW?]]>'N7fSL" ޠAV[ؤs؏lȐ!R G;$~[J ~>?˯$J)�O>I#UTUgur$Ћ}Ud'Hudod7Au'ڕW^鿕;Ⱥ4$z*n?p[՗W]uU4#˖-+V !.Es˝4s6 Eٿ/?Nt٥~]tgY6?i֭[XS2-I(rٟD?E,E6mkFR* G<SpHm7xł:w٪U+/WVdsruم^k|9qI&F^Cd%I�%u_"|r/ F /_etEVPtK.) L´ ˕+I+Tl*7c掻f|sx6o8^hGy p}W$>3Qx:*vgjJrㅶ&7oOݤI+5-L2ICfmX  hjㆶ~Ju衇3<c7v… dȵkNt5(� �@�� �@�� P(z?B=gO<cǎ,kӽڭ�=_ItTҺ_qvQG깼^z==릴b ӳzݻw~//6=KԨQ#_܂ RX@�� �R[f!�@�� �@�� �@�� �@��  ? )� �@�iDB ~^1b\ҦN/+eLDZj.km.Iՠ*H  ~2^o۶m\( TP^y[~}*|޵kW>|xCPW}4)ܟmUl,8@d~?SL睆\nsJ2ey.ٙ0aB*2�WT/6Ifz?V@-?4R$[f3+:_fbps=f͚D*SA*n=zv ~*ҾD\<%RAIvyj_~钖͞�#J'靂73hР<<O?5 znj|@FJ$ga]t6mGT ʽvR{Yfֳg(:؛g:8^ٓOvcSC~%OCJ ̗;Ŷ3{o;lժU.S 9TR)vr�M@dK^jy.?nj^C'~@�(.֨RJq-B�� �@�� =gj׮]k/ 6,ٙ:˟\r˗/g^{5ԩ}qm}w{[ZwdŊ}],@H-Z~~W:t>蠃>OV,1@�� �@ G!�@�� �@�� �@�� �@��GAL{/' �@��OL2²⋶d;ww}_Ҁ;쳏]p#A$QC R*.b_p7oӹsg/Gq ˖-!g0lР˺V^>JPAPpS~7X>}n0\s)FiHQIX݂V5C-#6w Աxد T̙3}իWQRt7nKt,-q4uײE2{7.SڵMP_UVɓ'gٳg_|Oy}l2Bu>o߾0Mr<n|AEbͥZjtIG%MC%A0)Ր!C<Гő$Rt2eoo1[[ۢ(e]\JE)+&򸙻n}Vx2 q_6Dڙj ]wrIj_}H7rY]F׹YL$@toԩvR} 1>CSpʗ^zt u["*] k @�|Ǧ~" �@�� �@�A@I>SRXgg>SvFYN8N;4u֭[W:ӂV2yYfd51C{9H?_} 'i1 @�� �@ bG� �@�� �@�� �@�� �@�@TXFa}u_(Bq @�� �%дiS۷=ELb-;v,R&M{$=cPty6~-8$J&LQnݺ9>O?ueY. �?]w5|ʕ+mƌ&qt[nqў46l.\X(hF~<~!䷪iu<U .Jᄏß;ׯw~!䯼J-{?fbDB6Q4Fr*eR72wiޟ$ "TK$ʝmIHGǷ܂d o?ߖmRF S?IB!mtN+Vpp̔u\$E;C@jwI*QId$ՊMuuej:_~QFe*U>+xC Y/5(/wS~/mLIn6JV`~~5w}篽+Y\@ M[oCjժ{m )A|m̘1Tq%ѣ@�(V9SN)Xw@�� �@�@F3mڴ#G['|:ҥK~'xž{9/qA^I, { {ya>}RjU)#΂ �@�� P *۟� �@�� �@�� �@�� �@�H�:u,NO?4%S �@��2jw}>^j;}E&Q+p~h]sj G}4`JA~+x JD/?+ еRn*uчz g{*(z2СCB ֵkd.3 ~- 7`/˟$/3hM WUZ*i:, a%w|lĉ>Ȏ<HSp{7|]�穧5kd;n8ꪫOՈѣG{`~]uQ֨Q#JԹsgfm_= +sdK By $ -1Fǀ%$4]i\0n)$ 5kL*[7[nm>zג&H˷"TIbܩ4F*D395husؖk~'[Ǭd^iAX8yˡlOa$TT[E%Kd:}tٟƠ̆7<L^s5_%}\Զ,>+I_( �RB@jǪO&MKV[ҵ_Mjou}*n:@�@&Ӏm۶.̄:SG@�� �@��6PW^],H7nl{yw.uSO5=W~gE={zEϔ>)N Y?=á4jԨd rz!?{ C@�� �@ j%.eC�� �@�� �@�� �@�� �5j԰gy&L/j^ d�aE!�@�� @*UK.6p@{wl2X\rSNVZ5o.3mrĿ0|r4i2d=_{7\أ>W_/[,[G2:%"$R@_4B>|xvԪU.϶4w$a.\蟅Q=`^f31߫ڵkZYf?LI$ӧZH"(2 (￙xet'lcʔ)fyW^zvG#<{N3 Gp}ȑ"\PKtLR?Jj󸂎+,f\H(~I'U3+XK/'uy*L2v嗛d *TZJ*y ;JOsgxbذaV`.뮻|QkOlsGR LpΜ9_H-Nsќ֭sj+];ÂT2 붅7|.:nsR[ULK\|vlbƌֻwYZ%9cwIIR0I:{챔JX" JaV<k pm'\ۅa^uOĭ:86NvgtW9UQ$@ s :w\S@jժ~kMm4#u qɷL-[̖ f.j@�Hs=צMH[%C�� �@�� H+ʓgj˗/o[[:Mϋ.֮];4=[vmW*{a=0>i^.(N Z֒%K|gVXa~թS]ճ;t_~;Ӗ.]'돞1r/d-r!�@�� �$=F� �@�� �@�� �@�� �@��L`ԩY}͊gEC?_|1N(� �@�%@4+ `բE([V|VӦM`Y k̙YQ뒳ҬI"YDV<24M7te˖͊VYQڵkgyY.O̊pʌD3Y;̟Ң$Y[ywyH:E}yQPHjճgϬ(X@V$ɞwK#ǏjҤUرcs|I0H$A.ES9 |9Ȋ^Ru} +%}9E$3 (Gs=զM_#IHV$Q(Q#FE~#0QxÆ ޏ~tP=ܓ=K#k=ȊY/ �^NP$+ ,M xcr$ϼb$zFF&_] :묂T)KZ䫯Z�J?o%nd6KQ0HDc=6+uf/Xw{f]p~>y]F"a[v{qY:vf=6zE"ҬիWouGyd|p.]oK(PRA$'_YzI>~EͲ"PV8 >H$I12)  @}жm۬?+\eER<b @}>4M8^в#9]T/]_%Ly!ϴD^~~ҹs_|zsիWV$!̾Ξ E#jW^IY  j2tЬ /0+ ɳx:Mux$*Q}�G� �P=tOfҤI �@�� �@�H3z~Ny睤lKϪg o.gqFV$螡{<u|tK~뭷f?#6⤬gv/_g帧{zHwF3zfk)6aB@�� �@`5w RX[iˆ@�� �@�� �@�� �@�� �$5klذaZ բ`ݻw&a @�� �A z>#^(E#[vE%w}cǎ}/+Z@kjԨ[Q[ #1EA}Pa$kY^Q@`o-mX< |+V،3,m.DrHLd/6m(լY3LHgzjRA%1c;Hc4ĢvI'YKJdtR<i R?`:խ[7߲Re$Ӳ/آż?/u(z!;-h$dҴ?Ey -- ?SbF0(͞=^ o= W,wMO?7|cQP#oh>?n~ OrQn$Hj!% G7| 8׃Hše[(())/;n7ϐ t\dm֡C|~J0*UJr7wxU>K5^$kH[%1G([v) 7`;GH/:N2"5?Zٲee˖ ,%PǕ * P@�@P[>[${A:ǒ �@�� �^��@�IDAT@�\ ƏcMy*UdWa6ۘ#,_ZKH^I,N7]?1sz^wٲeVNQ,Yb:uFf U�C�� �@^fcǚp@)QGUH`L@�� �@�� �@�� �@�� �x \^u 8j(rڰaC;C~: ǻ@�� �d>sVl}wb{--JQf ̙3ǥj:th.hz{W\"{/iR/KڼtEYϞ=4Y$IK${HkРA+C d9kء{y.?I`ذa.V8C|IX)T%/k޼u$ g m48 E1m4o_vevϯ@B۷I_VQ 1D2S?qLnkQO 뮻j{gO$ҥ)@[Ґ$:^'xN8ᄌXdO]~~+zWx馛ꫯvW^o1$}:'iVȫV-Z8+ȳ/�$@��K駟~vِ!C\%P �@�� �@�&簏:(8qߞ:vyy2{Zd>\XNɚ~̮ŌW^=Y\@�� �Xߴgǜ� �@�� �@�� �@�� �@�ƍm„ 6rH\KAmlܱcGkԨQ`F@�� � .4ɵ$QVZul)jŊKR]v _TP!-L:$,/i M˛4~I` Z6ml E~̘1֣G.P+Ҋ2sJ ,Z{GLBN;9kڴiJ4|MRbqMtH&M#<҅kÇ~tW^ux]cqA3k֬#FUT,I-ꪌ7fg0=$/o֬t*SLIUt<cv;l<LrH_x.JDXF?߯{gtnB$3ΰ;*UrUH.??.]gsa@O>.u'\"HWfΜ,*gkԦRVgz>@�fL>EZZzvYgV[m� �@�� �L#aի?; '֫P(w*h|.86>c=kVFtu� �@�@@&C?;� �@�� �@�� �@�� �@�@^ƍgǏ<m4rH�ڷoo{キU\9a˥ @�� �4ׯɓ'g $Zd+Wz9 /#wkҤ 6իWjYj%۷ 2į_k/ػwTaРA.PG}ԃ*'eAZj >믭[nvaiD3<ӃET I_$^b%n9clΜ96x`;ꨣ _HPaժUmԨQ[\ʕ+f͚[.'(AoK/4Qdt%:ClmߪUSvm؝n^|t=s[nqVϼ꣺mIO_좋.2 Jz9LᇗUNK5^q|VV=v%oo=lٲ82!P* V,I:4TֵHu+aYZBU*V�ů:s,� �@�� dovWgq$/6c/ NZ=KkO� �@��#P+>n V� �@�� �@�� �@�� �@�I#vZ8qb@WXa[o5oڵkgm۶5,c=xi%i[!�@��Jo&mzVjaCYmlo%e&?a/vR:KO2_k-9tlB9II^z%ڵ t\nD. M?pwmcǎ-Zyg9bܹ@ , =zȮ7##a;srR'oDdmN?-MZjsw}F1d  U^F1"%wСvq;rH;KEwmKfԩ)P-[T�5ƅ^#K1Rj/5kץ?.b6m]ve |O �"_l֬Yی3Z?(2LvqGA;hIմiSE&O� �Hpy뭷HsvM7Jc.@�� �@��2#ʕ+<hfRYג|4?nSNgvgΜiwuIF� �@��F�Vjώ9!�@�� �@�� �@�� �@�� RϷ?><y}駶fn\KxJVZ) � �@�@Xn?#V%a*Sqm߾}dK\jLYR_Om[_�gϞ27-y(k&LE m{ʻkZJn2w Ps\{g]տѰab~z;s]$mf�R9q?~ve,K9Slܸq6{l0+ēN:ɮ&+߽ ֻwo;g5{ ʣíZj)\zj*Q3>WP#<{1MV1^{yZLږa;\~X+m7WZWL믿Fe~ָq㴮3@/tiYh)W&YuŊ]تU+￑<K1ԬY3SVzB��J4[{A]ҏQr� �@�� �4#rJ 쩧#8ۥumWG9'xy䑴|>.`X  �@��@�Vjώ9!�@�� �@�� �@�� �@�� P/0S\Kyڴib ׎;JAZli͚5 *kY8 �@��ґ \% :_zuߡCl>Y:uѣm~}tW3\ 't}+10gyr-VJ>󡮃̙c @ͺm)Xsʕ}_!z{vYߒ%K[nvgn[ou~С~IŸt; $/T%oSO=5K,\˖->}ẇܑz5j? 9oJB-H~G*PӿoTl"͛OS$(҉'‹Ee]'?wyǏ5uYO\¿}7Mr1dC)k}U{{")ֵkWc!A�'ߔ73g<k,Y 6ܼI&'g³ @�($4ʥc� �@�� �|~?Voˮ*kڴi~] tRۼhoݎ>f �@��҇�BB1' �@�� �@�� �@�� �@��ҒELŧOjƍj]wuYh³>+_|Z� �@�@qP0X4iRh뫯_W`{VrG5Yf>֯_owy|.AXo߾\ìR`f9饗cǎv={jI~y - %oq.يmN[, 6h {w]F$E5k=yWo|sO\twm{jJ2dI6y|E>vI[oMӹ":_w vytr-++$Ѻ˼:e?Ί9ク{Υ{s Kڨ6O?t)[ͯ 5rHP_~ֻwo]gRG@6:<t鉖u5i:wd{e֦E#˥ + P_ܹsm9rgI%)1}ݳsflm)2� �?l̘1Om>m "4X" �@�� �@�г?k^QG2N:7e Yf]wBٷ+ҟy ܘT� �@ Ԋ!ԊsB�� �@�� �@�� �@�� �@ cHW3f@ ,e˖�AW H\jՌYO* @�� �d!z{aĉ.RO>V^m*T2A%)=HrM7?b;8 ORqƹ7ް֭[_oGqDH2$VhK)I~$$[AռysxN?!0g{m.XJH;tP6~0;@0$駟n֭sUwR`~'o/_>*]uU.&oL .BvmO L@mlƖ$[oڈ#\/XŊ !6?B-tBJov]TT)+\ ӽz`?~vI'Ce,IŰE6lz~ֿ8|Fto}ԩU"P$lVmըQB *˗/7]ꘪah$<;ФIS?Ihjۤ ˁ� �$Fg}ҥKK.?+X֕u� �@�� �@ 믿nv0`˪U؅QZ虄_~]GzE==cʱ @�� �`߸gǜ� �@�� �@�� �@�� �@�x @YfY_~I¥;X+Hv5mve+SL3` �@�� /0O4mƍ.i߾Vvx|E'd]:{m'R HF7tPI~٥^jߓZ>- O( J4v%N֮]I U˖-='l5R_g /XF2l^"~ԩQN_}MmJMJJf ROU:H"_ *M?nF9rNk۶m%,C cZő$=LǨ<!XҸLu<yr$?P]ܞz){~ZG} jժy" |&!DZ:HӣG;SY5+$rlś&l௒) K@ϖf3V\%1n梬 PreSq@�@i&T7onW;f4; �@�� �@�qX{Lϧ&Y$F'؄ Lϲh͚5gmrH k¢ �@�� Pz Ԋ#ԊsB�� �@�� �@�� �@�� �@ ._uvP9sl-[[AY4i4_fՕXh �@��",|Eg`+$Pjܸ $גhM6VR%?# O?"' (XA%8<7K_yns9[r%oiӦm-_glEVc=rlV̷>=s.W<c_~vdQ;tg{lŵSL+]yVj⪎/WgarW7ߴݻprʹ쮻{ק>3}?=?<^{5{߷8?g|}Bµ z%֫W/u`>s{;#R:Ǻx饗l̘1oova.+SL)S2V[5y5j 3c okiۭ[7jų{/usJˢ~x<H,oo|;^bvriVgiHζT@�@( ~h/_oXrL{ٳh"UUa9� �@�� �p? z)CFIuQG\km-2glرcW_ÇŋX=+-Z:u2ge) �@��J�ZoDZcN@�� �@�� �@�� �@�� �J?} ʥNB .ے\KY‐6lhq �@�� PZH#Ɋ'|M}]%D[-[e˖4ž'O'x_vvѣ߬Yb_I/-<c֩S';S<c*Uv5-Zd}Yі}R $يm6ۤPXfK{1,oo߾ֻwoaZ.}vwz?MRJN@|Ak\~u׹P8FϩSZZrl)sO={%D~{衇L[$3;#!Βv$(]tQ·2rT,UIm>}xlIZ>)?xwyE+-$o%n\޷P?[齣M>qylݺu.�:M9 Ίْ)εZТ"!,#/QO7SjPsgQ跡ce5mԳ,3{S{@�@n?;~3b=Gݟ8c<n:,@�� �@��J@Ǽ .k[: ӽ<͛'tye ,>#5ԇ[L<eL@�� �d@?YZcN@�� �@�� �@�� �@�� �@ BU / Cϟ?V\S+Ha[첋˷5j5j*!�@�� P|7ق-B+F۸I- $jJ4Z~_ W {Itm#ʇrqR ^WV 6ؾkG}wq;4JOC矛a)XNJj׮kBRE@ZO?PSO=$:JMKKEJ UVfРAv{P:5YL o[l]͚5X}衇h$UEb-\$5oc51._|Eg|_}6Kj:smƌdLm,Syod,$!&Nt޾{R&I`̙6zh;v?UU\مֺFi߾mvq?gb,$]|ҤIG5#իgxg]7h u .Mr يvz׬R%sJ"_zts3@ԗ=v[9o9^Ib,]Irg?c� �d2$V0ds.tW% �@�� �@�@qXlY[fW^χ|Ð`uLƍggŽk׮vG$A�� �@�O�V�V� �@�� �@�� �@�� �@�(#i_p)RժU[zqCAP F� �@�@I#wf�Ғ (=7njժyoYmcRrDA%Ppɓ'JH~C.IIN 2_Ճ+蹲KHVN9t$[nfX!j߯\O6-hk^!%[ |+)4C _^}U<x_$r8wֱcǤ^?x裏xRDy<kud{\soTuS`/$MgOX`⋞%Q{o(N;픀_%[omII:(>i%,餓N2$KvzGL/]'<.I2)?q$LQ;@ ġͳ$%mĈ.ҽ+%{onڇ֔)S&ϲ0>:6Ι3ǯk( %$-ZoB tJ%V $[nIUZ3=O4tۜ;%a.FԱ?'_nb@X򿒰'� �lSϲd@SǤ.իW/XaL@�� �@��RD@C'=SKtL/޶>>~ST_kO2يrMI>=wɶf_a�� �@�%�B7(B1' �@�� �@�� �@�� �@�� (Z_ø+{H +ؒHAnJ !�@��JVpi0B={hk֬- *f(m X{Ko1 ڵVZyy睋I]̌+M 34<VZCB$jZt/',ܹsMA#*ULhKHVMLtȐ!.1EO=TE}L:\xYgewuUP!-~sy`K.ķw0g⾖Pm6|p%:ꫯ1Loֆ  &{b/>o$aI/rڵG0ƏoQF.֔HC�>IL-[nv?ZIqgSO=[nTʒ = {$Lh&#]DtƍJjIkO##H6SӦM]Լysoݦ$J$me\:,_|aːD\!IML Sm"㔮5, h׉rJ$ےm-6 dK-<ߗ25k} 06n;eI%aVj\? �@�+_E+'6ͺ%y(8jT �@�� �@�@нSFϔLg3/_gTVn]_{wجY3Fv5Y3eM>a>/sF۷~bŊ%B�� �@� %P+~gǜ� �@�� �@�� �@�� �@�@$ۊj\/\2& J$R0Tw �@��2F [*8}שSǃP7[Z'˵xCPnт~UZ˖-] I\rW& %j_ZhQXDK^oѢo)+<i$QXіOSA%يmիWo3E1}QgM6Hٳ�#Q+K/Y~\ /MBmfO?_K4$a;cǎ㷖)ё'SuˤeHۨQ|[qF'$Q9V$fmf{(`((`Oǎ]uae ,Qo9QE(G=z!'e5%ӒdUtlL-^~G޽>`ͮ㜲=)M"Ԑ%tYmwe]+}IL:霠0O?Q;ߔw}w?ϥR.! at(԰aNɖd[ѩ'^#!$K&$ ʥ9dnV@�(˗/7uMJj/N*UKX( �@�� �@�H_$n2nyY ˩ 1c?g+j׮-}> 2e$jRFVV-],XCjs{ .z-[1(<OڦM}i �@�� yjſjώ9!�@�� �@�� �@�� �@�� �4!|k)aP ^NR/Jׯk\B4Y3@�� �-P{xj9V`j+wli(ɖ^6' fW]evfcv睫k=׵ /^ q\K/K:;K+!^OtRPxIV^/+lV]uMA+% ^BVZegɳ <:[wmzVI{A$c?)-q=7=z :^~(Z;蠃\uLtn\myKb'I%N<"I' Ľ@ۓO>>lkݺu +q6e8q{"z%1i" (q&M,QռyLkuS}RC$cӱ!tYjGbuDK%-W{$8JY#I@۬vaF熺uB4RfXbp;?~3k 2Fن qy5ExZmuP4T3?܋LG׀:^Oΐ% Xۚ$̺yS6[�W\YhLZ7]3j=uI  dVJQqhu. ГZkEq|qH' ^}u|Q }&1o!Ĩɧ �@�]7HĽJQ,ɹԩ� �@�� �={ 믷$$ʻS$ )ݛ3j9݇=YhUr݃Ms*Agq/u=U=ggBWMʕB�� �@�G�V V� �@�� �@�� �@�� �@� lN\Jr$VkB6 V5aBM`� �@�iL@$ 3b%[z\I/_^QD6QtfHN*]}/ǬOϧ ,V¬cEVz>wR תRKr^0+07nj\Y˖"dKM |^Nl h}`uc|%Vm͜9*H-IhK2DH_Go\KCڵ}֭["UU@.>0`}z/M.yœO>io|H:n:0au]k0<<.)T1A<,իWwC彭 *Se $EQzBuFP@YmGiѢ!sdz{6?UQW\q"O))HNtaNA%!"%ܹs]5x`Xֽ{w?v%b'Ku'T_ӂJC:W[!]NׄʹU u{\~=bs/*?Vƃ8KmȺT]H# _YnV,[(^o'n$tX5A;qjg) IbeqA>Ұǰ� �P{\~}u>-[G'$@�� �@�� PRСf]g~̮ʢ{.oE΄wylXb3k0~k=V=?{sy%=ǩgoKCc38zO1zH� �@�@'P+mP+~v @�� �@�� �@�� �@�� � zyFAiCpء^Yx!*+8AaHJ@�� �B@c[n Z{キ 4TCfZ b֤IO%RPu-~l ׋A~^PY؃\+VX)WsUV͔K H,m԰a=?ˬtx^ѣGo?]СwmB  *?Xdee٘1clРA믻<CO<: ?'b{tj֬i't 8$r<_~ިv B0T`   C{!NxK2. S$R0YRI_=z$bڮ}{ήzj%` I)I{,)@ ^8Æ sָq<Y(2~7z]cjǫBbW30Cm%ڊ kD 0 ZQ IE =k@S7e "rtm`ph+։v,/[t.JuHemPA\|uVR0 0v\גY �@�}1qD})]v׹sgA� �@�� �@�%nD5ט͙cv)ƣ/)KGz&<{Waq Fz.SeշӺuk~&^k׽X9WtituU"-=7B� �@��  $ ?DUxf@�� �@�� �@�� �@�� �BzFj%R* *)0}ݺu[AU^=S;/8Ye@�� �4!|r75 +I"+Vmi;IS[ b2rk(Xyj ]N6-[%ּy<HEXW`Ky(:#)رc=O0 ڼysϒk֨Q#/撂ʟp .i{ᇭW^SD`ҥq :%vͺvDIAt=˜(-I5H@ H:^pE.P:ʾ ?>t޽eR@ |~hȑ~ (yK;wKbb> ଑$93mƌ?[mMn"qY˖9%[Qܿd22?݋=[ (+v\pPI]0+v"S @�(>G0? , Y:Xǎ]զM'ߦb� �@�� �fW]efg6pY[%]8�T� �@�HZE?;� �@�� �@�� �@�� �@�� -^إ[ fT+ƍ^ ܒlKꅜ*{F �@�� LWΖkɖ+`q͚5"ْ$W~-=YɤOHET\K-Q_e##\f\+ڪUV*@II'!?k,ڶgvኂɇ+Z2)K~Ac=f{4 h;ooI&A*8oӦM>KrVZ޻W(OTC+VF硵k]-9:6OTYWI02E):jժHtvGZʕ^sw db!;XϞ=]xVd5)~:6EZƍ X~"r_o_2sB Y䙋t6, hel \9~M-GȴKj~!NJ$еR ea5 � �K@}_'|}_ N}ȓ|� �@�� �d$c7>#̮l=2rU2wQs@�� �;Zo!ZcN@�� �@�� �@�� �@�� �@�& p˖-` (d[a\Sr<pllJ\Z0 C@�� �$<~iі-GњmEa+ȬJ['.,h^jv}H8cѺ,%@_|˵bE[K,z3°I&{N,/MfWo־;|A�Db$9NVF lEؗF\jURd/bi&v\"I$Q2e }sO?JӲeKk޼męvw>rH 1DU ͛g;:(tHj긢O1Cǝ fו%Zr ]Uױi]w}m۶=ڜ]M^WM/|ɶ><HHE@nfꫭW^.\6Yy<x?޽ 0tvǁג9!xVFǿH.ݴ)ْl+YAe$S=R K,Ħ5/ �@�u\zI5sL([K۵k4 �@�� �@�@)#0i&fjv 3B߆ �@��ҕ�B B1' �@�� �@�� �@�� �@�� �Xv}|vsCTUvA\YI� �@�(*GC1cmܸE [vіDnI6u)- zoQM"NJbYӦM!ڒ@b&O$oYY-_PaO ΗKV4|roIdϕW^mV%駟" R�Ya無/b"ye3]װB ^a*^Κ5F H<$C"Kr lwڵkHwLmĈVNIB ċ¹B97n 탒Ii}NŠtI˖K.>jjJ~b8,4f̘(`ԡ]I~{$vI]L$rH֯_?pwڹ[|%ǰa\%e>} ^5b'݂d+rbzn%F֜W$aJW0KY C' ۆ(pE� �RK@}[P_G5gWg-\-aW$ � �@�� �fQw]}믛uIu%B-Y@�� �ZoZcN@�� �@�� �@�� �@�� �@�N`Ŋ.ޒt+6+P]_Ag6$r իYB�� �@@Y! ҅ӧۚ5kLA5kr- F*;E~^I4{ Sd# Q$yA�?4GDdKC]cJ>I$R!K$q C|ye 4/_ZA%VaCM _Ӈa>S9/IɆfϞm)KBW_]+ico'1/m, HJO4ɖky��@�IDAT>M65*IʦUᄏV.A)9zh{w](Y#Kv'yg<|. 1Xn]x2iRSy'gm֥K:iF$9u"ي|fnmVM$"4+0KXQY%s_b �@�DH~ϭ>SR^V^QTuVbE?� �@�� �@�=dv5f/~ 7uV *y۔5� �@�@@@?;� �@�� �@�� �@�� �@�� "+^ - Ct+K믿f,+rmmnN:Vl� �@�@, 0\tOA 5ƌWX$DIu-Xқ/GTӕj׮- -VfL.%Vk껐,6KCPg뭷vIUnV^+pKl{VZ¡˗Pؼl2^_գZjVjURʕ+hRJ9K b0TBt,Y$PYu 9/M4;Ը==C|< y.0(?0ǮK]F+,Ʊ6 Yk)@w .㻤l-EK&>ckEkJq12e >^x5m<~U^=eU}G@RxkacI'do=v'fvM {ٹR4|\=l0i7tMد_?۷ߣ(xIL %M$38HdIb7QY|1[mU>jַzn5ě q0+=6 � �$ڵkMeӧO~k/IPGhP]7ʇ� �@�� �@�H@N͢G�m@=,z'fuFeFL@�� �G�V|4B1' �@�� �@�� �@�� �@�� �G@c[駟]|kժA-%ʝ% )@ � �@�"i,4?2$= 0R_(PE!CڷgA�! Q7YfH-[VںukfL TI70r7r>~{<iT&)HbN-(+ITHi:hX)Cks2r> 凡i<V|cyƎo^)nKJj<֬^ej (`a_Ѳ̫pI\F ji\Bج@ JViODAv={K/$Jv\`AZw_{5 :+ӥ ZLM^ХA2 su=н~  .] Ɉ-H%3ꓑ0+6K%LVAINFr%㏆Q{a$1::Y$ƵHiECڔ˿H♉3 �@�H@_~˲f̘C+P?KƍM}ʒh)-C� �@�� �@�27>uיe-ϛS G!�@�� jſ}jώ9!�@�� �@�� �@�� �@�� �ZK֒%KLY¸ &`6!)֭[7[ݶnfc@�� PJR ښ9sIdV\%ɖ IMQ.졇N;*W4�b H"Hnʕ+}]v-7ܠA"�@@"- b\a\'|҆2c=֥X{ ˚_5~zL߅r vA=U, q_R%\sݜ0.i;3fw}׾"U<:u<Mm۶{?ޚ5k\dOou, *,YWKL%i<ׯ_߇ b󀆚&YIgyى'hW]uIԚtWظq>(">շ~ۃ}hF&*v-;eP&馛w}HT {Q֧O?f,%K.o"9Vdi<ocZ t~995;X \sM)GHeQ"Eޜ/)[� �@ ԦQ[F%pm5kF2ϖ~(?%b P �@�� �@�r٠Afk]}駛-[:H *ۙ� �@�@qV:fcǚp@q sP+s5� �@�� �@�� �@�� �@�� y9$[ + +ol] 0v\׉ $N T� �M@2H - OnV2YBKPQF[ dνzYd͎;.*2# PL"NJ+n7y.y)"H�{A $\Aq׭[ӄ C + dZu)d x과r*Us VC $m;j(sw9;MIx$/p… M0\bEoI&뮻znڴh4#I}ڏo{4ۉNguohAWڵk}?TyAQDƍg+OrT"|Оz)߇.b;3*i8~< <E}ݻwQD Pp 'AVfaf=sIfIV8^zffN5,sɖ`lKAUwdM4� �@4fraVP}9ޙy9K.UBiD% !,n\r C5kQ YE!"%)QH m?33=>י<<VRKf|?Uhj !oIp� �@�� �9uF4>Ø?k-y~>9Bc=@�� �@ 32#>Bl@�� �@�� �@�� �@�� �@�H@ɵ`+ O` [ FK� �@�(/_<(KdSEJl)+~f+a<cEg�L`Æ 8*ښ?(�F%[ JQfȱC /|vꩧz ('|r^>)I9Tj<5-^޸q~T =Yɢ\KrjR谄eֽ'|boh͞=/kݻwnݺYNT+ TQp/YAuK%r 9Mb5n8ko /0WE"gqL:,1cOչI(-^լY֩SիYH+A[1q}g'L`<}vxZ~`ɗBD/JJJF ?|gŽ%:0ԕ*ÒfDTR>Jê#LaJ+Wlj'UA})LGϱ@�� Sj&IBָe*T[ hѢh$@�� �@�� �#gv]ޛ0*C*V̽}-!*J @�� �E�V?/Z9gǚ� �@�� �@�� �@�� �@�� P@nݚ" x寿*pJ\Lo@B�� �"A@Ҋ/2hKׯ6֬]mq"qn$JTJ4*kEE[UKs h|饗ѣMxs<oqفdZ^Hͺ7 7eGKI5$M!SlYߕO:-e °*UnЌKh"[`AJpm]%RT]vֱcG9/" Ht-=c|3˻}3tk|d˖-L%}.~>l//uޛ7ob6}7_Syڵ~ ޤzpժU>TIq# 6L)5\70}F'ON:l]tJ?qرܫW/4h#W%v%-\LBb ˊ 4_IuzD" WRbEI:zrU}ܹ;KRtWul9cSϚ� �OjӪ= Q… }ְdZorʾYf^%qvWf �@�� �@�@p&v̽dvfU.Ćj� �@�@$P+BcM@�� �@�� �@�� �@�� �@�(on?6T ZB�(ȭVeq)oaF\>*� �  &GQmqNRۉ ~jժY֭}nӦ)h*U'F!�]#*Qі[p)kVR4^b])kC�^&3`�_w5N=T#~m4i}^.%DM ֫WJ.EM0IؤRb'& %RV4ߥR| dX)]?sO>f͚{.NpԵkWܹeU%|~v~߿{.TU,O<g+WڑG闓+:?sŊ|Tyٲe!2ȵ+ԩ-aX_|a3f;^w'&,1\bbi%%%@$$j~KR A,& Ke4뚭z$&pujW_6kktNٖspHs� �?(+ȳB?$Rʐ%8@�� �@�� m3{ vuWڎС=Ͽc({BU? � �@�E�B~rΎ5!�@�� �@�� �@�� �@�� �@PK!ׯOE@h+T4 1@��ƍfٓOnp[Z\l,+ϛ7Ϗot+Hиqc/摌G-Vh (\$?~*і&MxYށ.⺲yH g 3+쩧ri{|X4kh)O>6oGG%ɨ֮](^V$/aׯ+T]-χWZeg6$=R۶m}l[n#Focƌ񲫬ܹs[n^L裏M.,&Է(u58*G\`+Z~{I$A>)Y!ަAqJ֭r>TJB'MuN#2&;tի 431;mVJA%DZJd!'$$pC&d5}ܽRjɖ$k'R� �"B@;|Ϻװ%KڜJ|FҬMR9H<& �@�� �@�(ZqfÇos랝̷Sg[ A"/� �@�%�BrΎ5!�@�� �@�� �@�� �@�� �@زeKd+ȶ~PTjU/ J+SLtu!�@��2!fgeb[vO_o֋`K-ܱc $P7o"ؒdKvڙ !�&%W}ְ"JV(TR}E̙3mȐ!>\`Æ #@r.|Gzww?KH%V[bh駟,6Khm۶CRl bLAҤy WIҷSzoIfDYzu5Mfv$&&{̎SY˖-Yf6i$0Ex7[S.ikΝM`A$֊+< 3e՗*rʕ+Z:G}%VS)ɚc %f񈾟A*& ,Y箤g|젃*4ǟxviDZIIIְaC/;wc6($$ҵPDK K 6>I$¬P."1…%[ h1WOl9Dzge@�@Q#i&[xfi8H$I4M4,B=J� �@�� �@pK/p>-![U>=ڶm[x BBAp� �@�(jCEsv @�� �@�� �@�� �@�� �@�.z_lVr͚5kG F`ѬE׬Yʕ+ca@�� P\8v  잧 /VnNIdAu^Ub!�<&믿ȵ$ڒdKr 7ʗ/(mڴ-,2 HM@{յm֭vWСC(# $zI;zyZڵw=& |䅺hʕ)9HTj^nI8"!SD}SIM\O?_vI'ٹkvX]I&ܹs:ehw>QvJN;铲s&!NE%I#!UC)k*տ)9WHרQ^g#>*UYZJx*d!UkwRǧ/3[h{gI F:Ey~ [z3dɒF?,%͊fuQVZ,KuVguD(@8ϒ{椉f#t"E[* � Pl G;An Imgɳ9{ò� �@�� �@�o f^su]kl̘{;ݻw/^G .ԩSsx$� �@�(njEsv @�� �@�� �@�� �@�� �@�3 HnݺTA`c†P]­2 K� �@�Ewm}}K qZy9/'DTa $P0y 4 $TKr-Ih~swɵ$Ce@l�ذau]v}y%\b]tU2gw2e{?-[x)wҥI$3*H;/. >-J[CٴiSk֬!7gҥ/zĨ+^t,e?FmR+ȑ# /$ J>:eymo„ ^%SqK8C>gRʪKJ +>L[} 83(+!! 溰-\ӵj̘1'))s!YQDK1AR }z|;^h4K@R'<i$[䜟i$[ $/ �@(hX70,!AQlxPE!�@�� �@�@|uzٳN8͒;9+9zV p� �@�#rVٱ& �@�� �@�� �@�� �@�� �@P JT 0]h*_|JVg +862(A!�@�(h>kvA5ܺ@�=Ԯ];QB!ȶTj)XD -[Y{+r3 (T$y r ڒ�FgW" ͛[ٲe 9p0/5jkIrg_:¶̙cӦM3gڦM~ֵkW/\֭/lǞ# gPo/^R+$':{'JU?+I˓O>iϺF}_:륗^5l01bzv׆)om={ 4Je|~vۛoi)`ؾ}kIJ;K*Eeg\R%/Xh=㏛wɮ:ѣYȒD@!!zEJH+qDgiXҬ *ѲD=6󒭹swʶ\k{>SնA7)Lg@�@I"zjABHHpߣR,ID&A�� �@�� �~,Қ20&Nh}?C!g5ZΑ-@�� �@�i J$SjeA�� �@�� �@�� �@�� �@��qrh+aMSplI2-ҭ RoXH� �@ ^5~СfwiN`^`ѥK{g쬳fk{ `O?SZVT �C@2 -?o޼ʔ)c͚5< ڒ\B@} cǎ5I$bرN;4ZjٳCh~XuZΝYIY# WpB_j믿]ɕ6m,YYځ}㎳oڵk /nɮT<Mrl2KHHB0}3f0݋J6wEZV%&&zVRR~a]%"zAE cʕ+ =4Kᐃ<QFp +bU?矛E%[ͪT1KkI%іk:c;I� %ɹ{[teEɐ4+<va1J@�� �@�� �bL@2:ÛoydH#OXt;<{衇195ZÑ@�� �@�i J$SjeA�� �@�� �@�� �@�� �@��J8X+ea`ryVnWF]5jp2 g A�� �8f4*쩧̎9&yA Znm͛7^{-?_ R׮]NFQ[heQD!G�O௿"Iٟ| %*Rvۭ K, }{'W^zi'|E^�_~}'6g裏iǎ>uN\#V+_|sJnko9/jLoKN4 FFmC aÆlbȑc?WZdjƍ PBG9 {e~]wuVzu:uUT?V=,y,Ķm֩Sǚ4i&7n&NZq3YުUdK-4 �A`^%QdY+L} J٪_QQְY*x|ڜ �@�� �@�_}ev f/lv"=vK?p+i\#P+=*L� �@��r�BSDsv @�� �@�� �@�� �@�� �@�@&6nhaYqEK(Ѥ@鉷$ۊ-[6 !�@�(In5Yfj<K._`իWo"2$CkW. ԯ_?hK0,$v%^TJ�+Wҕd^B,Y֭[K^%yaf?{쨠imذ˲T^5$ժRk˛tN;vڵk!+~uLU<oNlv7ۄ =cThkk}H~H%ksu�gea#e}H+))6lh{o׮]Mg͚ŵ}xxtO,yYY*VYM6hHKu0 M@}S X|5>:Yf%[ε龻}�u/䵍59<Kɡ6(!�@�� �@��Jo5FZ0NYީ_utx-5xca: �@�� j BcM@�� �@�� �@�� �@�� �@��rj+qT׮]fiyߌ& r-IplW\&� �@PP2':09 R̙3M'| R-c˗/lk…nf ^%V\gDEsZA%idĥJ€6mXTUN3)Ԇ뭷YA|$8CM£olw7^б(%KLBPת|-{%N$$1cFJシSN֣G/uu74fc۝)cԨQqUWs=gvwq^v;ceN?t=$6-2IƎk 't@>}lڴi&Qu$͛M9[%R,ѬnJ`pi{M=SW`-^Z%ٖ{f6:ȜTvgc �@شim~_5l$s+*ҰY*ce� �@�� �@�@<+V$˳+olps%$?{wW!e�Bqb)@�� �@ jeYXV A @�� �@�� �@�� �@�� �@�@$� J[*|+ ғpI2[QVptrE @�(M@f*)X曩-]4hK-Wr>3Zh%ڒ, _$/RV(KkhI&^UG!kݗXC!?].XKr_PpZJrxlՁʒN> 9zٲe{%mOR՗-[:?%_Fg{gn4hzsΝL2~{C=^^@$!:v7|v; C zEZIII}0p@߿խ[7 u ~1xt͔(Km Ұj.]c YKQezq"6wZ\2 ݭHɖɑ �@(a~TVBRQmʄiVtX}-J@�� �@�� �g[o5{s˘pٹ{o,햶mfz͚5W]) ԊG� �@�@srΎ5!�@�� �@�� �@�� �@�� �@�(SR %JÒvm߾=+ȶ[rT^:SQd� 5A^z˒-v+_`]£KH"іX(yȒH.`A[*U.S �|%J_?Px^"ubgyA@R,ŋM%E &6)0uYwSP|y+bӸU\b$AC)i$IңW2g{|7ov)X߾}#ߙ)SxQ֦MT}'ֳgO;mذaO?m_|.껋 }gI裏z r =z{9r]} /x1\Q<g9o {ehgT^f ݧJ$Sy{lEHlnwOk~լmdA%;Ϭ7):ǑB�(_YRTLB E @�� �@�� wYժf]g6pcγD:uk.I�Bt0� �@�rVٱ& �@�� �@�� �@�� �@�� �@�%,_>Emi8qM JA9B{橬Xb% �@pw34)NG}dv= BLuwx9Il@H@AnIBB� ֭[ */lݺu^ҸqcJ4,q ŅWr?#E%DZfI~{]-RJG.P &̰aÆ֯_?׿e*U2|K26}t)!ZJF/nKrN@CJH+))]被֭wC/~v=K̈B1*uQ,CQL ,94 8g+lst0S Rm[� PT .?-_gI4gmܸ1$r4~&#JA� �@�� �@�@>ذA{L6B3K:gܺ^uٳg23}T@�� �@` 9CZ9gǚ� �@�� �@�� �@�� �@�� �@ SjVV_~7/n\f͚[5~II� �Q۶ fv]f'`. 0Q.{mN 15C*h[*CQ $,]ңYI@$[Qі0VM6D[V(ϋ=C�ƎkO>I*ӧO/k6 4pB;2mp$r#A ,ZKW^6h ѣGӧ[m^ }6rʕ$Ί-M(ɄD$@ L6o^jɖwuB�ZtNі#% �bI@ ˊ-?{۷{SXOڵk,� �@�� �@�� <w.3R*U2?GyĆ oׯ_+Dj� �@�@.@srΎ5!�@�� �@�� �@�� �@�� �@�@رc[.C[tRÛ6mJs<Uܯ(nWz*U*Ͷ�@�O.yQ x^{ (�JIIIk٤I믿x8Wt` n_ؓ<?lDJժUK%ؒlKbFq_Q?`X~}$[IPlY?{$RoHsW9眳sf!]?x;Mqyw}gjk}'6qD~vgeMf897᎘ J@ &?E:ura>H Hu3J.ABSBqL@D߶PGÖ-[P +깎;Zҥ}8W>;9/Y$EZ_Y?G,gÇ.  \x6wnh̵ ]lU'PXgwG{?I(Sꋖ,+Aq=CI׷ Rͺ/ࢄ� �@�� �@�(n5{1[n1szСfW]e~ΑwQO<D.uŮ, wePk3<."OǝJL� �@��J4Z9ݫp$@�� �@�� �@�� �@�� �@�� �D`wymuX+*ڊ °e4MivRd[c=fDA2 @�9&f^j.wr`̪9sx<` 4Hocƌʔ`@RWY B Ҟ={:իW{ьڊ+rʕ&Mȶ$ْliӦ>`{1*UGsذD/?Om曦 J_X+*jܸ:Pٳm֬Y:vj)y`f9s&J%)({g1‹ oFTKV{lamek, D@2}߶nɮ>G.|o׮] é$珺رc&O쿛g}M6-K=XS}?YY] }WbyR,ɑOSkvgI~RJ /ʔ1vK睗KͳŋSK\Mwbb<dm[5pN(YfkXx +}GWZ%Yc8H4Z.5k*wqU*{`QB�� �@�� �)}{\f^kVvOC4~v'^xk߾}7KweDU<^dzO� �@�� �'{ {� �@�� �@�� �@�� �@�� �@�(=ȶ2*5/:_hJO[5\FM^.]:)!�@p0ͮ9FL3J$.k?M>ݭVԵkW2eO(X״aS$[mio7!!!hK- �%?zBTEbW*UxVT%B `oW]u%%%W\az) ʡHĨ[n&$j_UT$*;cر_~>P7o5jd~HKL?ThDAsk[y@Z/hIi&!CbI&])[lD/R԰aC8p֭_lܸ%iT+cE=YѼrJjqZ--B E8H@ w8&}5}RAIsgEy+<Kac\n IM@AP߻DdYVdqݟHKAiܳZ� �@�� �@�Ņ;fK{k6lXg{ G}M8fΜi;wÇmTTޕ_LW%)[>>(]y|D@�� �@Dp 0:\ۭDy X� �@�� �@�� �@�� �@�� �/+V4e-NR`+VƿK\߼ys(hZzҭilD i`1@1%;f睗,r+;Ȭ7l})yIaLY%o(m۶l|`=hڵk{`M6YHE�r@zLY$7o^hK1cx醮<!-NI+HD��@�IDAT9iiZ9Fōj[)?Ǧ\D~n֔Yj IOxe%液?�v8餓RF3{1h\B=rEDKA~wիM<zqVkˈ%&0RWnr=$͚8A5|?tL_|?kݺu*Z [�םT̵kvޤl* ZlܽPl;O[Xcqp~L@OI%Ē0+* 7$tg￿i<Z� �@�� �@�%&˳,0;L74w9sթSɹ^ׅ[gWޕhg'Ng� �@��r�Bg!�@�� �@�� �@�� �@�� �@�@ `h! ZvNX\+R%M*TH%؊nI;M Ҧ@$@�(x[Xv}ffNe^X x]K.vܞ" 6qDS�!C9iSO=e8sWcxĈ^h=.A.ZUW]eժU-[fO?I{^;v2eʸsƒlڴi~Q}"\pO?)믿@ `/M0֭[>Ͻsϵ={[TĪy>G˗H$ꫯW^񟉖`'*8X4@C>-ꚷd-A$]tUR@ R%[z(] Ds{\=\wW=rb"ԪUTZh_usDfذaJ}sC9d 7?-[4ɀu@ gt{®]ډ'h۷o!g<Y+--djgH.{%꛺u]!2%C_wu_C\I"� 5k8K,>̋nRߦ;̷{5{r# �B@.du+E1dK=\\Y۶9Hܵ<%Z*^;/l!>ƌt[oWbԿخ];}}yɭ[v.r:u_G"E6U/L43K)mASbS}:caV(<KڡB`T?,먣JgiYߤĀD!�@�� �@�� ʪ]`wv̞W={7ο6'z^u/ ."05C?v}g8^Mϗs]~Ǥ*W쟅923gOY(<^Rxo>!�@�� �@  =l � �@�� �@�� �@�� �@�� �@ _YAղ8P~-h+*ҰǢa. ~M QVt8* dX`5kY{)3pA}Rɳ$[R[?s$5$%QPUd>DN`%&&fAl#~ITixժU~? fIE~mʔ) i)z>$Z>|~$oW^>Z9@ݻw+Ҏ=X1JR(NJ$hS"P*0>!Vfw/8 jҤϺ$ZAw3H mIN(=Iا:H_g=3`J{]$ҹ*^hbE(% Ń>릛n2 -- ׻<ri;?T̘1?p-B�vo~f'AP裏TL<z/!AhLeTaMS_og*@ڛjwD� $ro>ټy~ɲ-x4c0'7wmJn7' k2>3]#<boo#k煳ɨ1><76ڵk};P- .W^֫S"gJ8}@ \ 6W\ᷧ !gF}FF@ˑ>=OU$6y+0m4ըQ?=nѬ $@�� �@�� �@ sT/Қ6\_[PK}~.og=~}V/k^ٲem۶mֱcǔwe._x;#Mªw}C3#0`@}؃ YgeG}owP+~vyGf;<>6@�� �@@U�� �@�� �@�� �@�� �@�� �@�E~YNsĒi)�qlE\ V]niv%X<Vtz".G' �Lͮ*9_5jW_m7Ecu%$D%]sSې&?d'3gvm^ZՠAɰC}IS$Py}�[[ VjKJA$Jr{YUݠ`Ѥ}Qr0 Ǩm@Iǫ`VEC=4ET_s - M/&ٖ5Yu簵-[ɨhK[to륤lEE[# RuRBBIr8zM|tIR6)a~Z쩧u$Z\dN:)evX65_/"ˬSN~\$?CQB`(Խk^zkX$P{X1jGHc%YQvc=U [Fb9sY{#I$P f �$וe:$p.FklI۴ɬLSKڴ1'Tkl^1c|Kd?k#Ǩ?޷TKg_}|^@Oђ"MIܫj՜M}+(jH1f4lv?."Vϔ(](K}/;wôz~锕� �@�� �@��rD="- {{]|Sz7Ugtwٳm„ _pܹ/YpxZ-ZI&wQN==TאYqF}7n̕we-[߷;XJ*{Ϭ]u3zKa: �@�� �ZÑ@�� �@�� �@�� �@�� �@�� �Rg')\neT*8-Jƥ$w#Wu,QVr!Ht{ C�(V6cw16,9psHMIּyL?ޗlQ?58$]oKmS˖-M+7nfxa �ɋ^$}QR0Q%x_3%'9#-u|wud)0oci;ʕS*upщyS�ώ?x/1+&(Q:N1$~q bʶMAg6i$RrƍMAfIеNAIrD]ϔ%uzMӔjԨa^GE[͚5sA]TBl{3ftXCֵ\mmѴM]RF{m<C0?+zgMmzV3]/UU.,Sm\rL4IHȌU% Cf]'Ol=z5j_e\s{bŊ,m"+uNW agZ7H+Iʵ^kڵ>6 �j>ݱoRK&N4\fNv,r^hsv1jGqUT/^C6^;/^>x '^[om)rNXI3?O/3cY ۥJ&IVzY\fM~ݫ15iXB6% �@�� �@�� �#XNGg}݊V?o4~A}7Rֻ/PJpVaYfn+w%~nɞ{9ޱRq �@�� �@p}s( �@�� �@�� �@�� �@�� �@�� ! *rqhVQAYr+qiN׏AcKxA p7-:@YXv$fӧu^DTFI D3rr!>`)S\oLA?A뭂 t/�&|P;pf͚ej)nŮO;4:uI%Y+"\.,,N ՛ ,\B2Km-\V n6VTdr̆�dFYCҽZA>h[l-ZpK$Tq9j.5HZ4͛G'ۈ#heO?uZ(+f&Q C (ؽW䄀OuT\nU"$kذIvk(I"I$ ir)^!VVN:9.j)?#pL'd)jϩ@ yV0 Ps3wsm{M|Wȵ$RΣ01=P|cfBh(eևAv`*SX}ꩧPKe g1~Ќͼ\;Hj;sʮ],=$A�� �@�� �@�G@Ç=Yfn֫WG}J9lA3P3_#O4ɏg7ڇGWꘟ|I/WzB83g2y$3SZvm^lmB�� �@�@ 4V� �@�� �@�� �@�� �@�� �@�@FcOW#;I׭[+V%HtƍJ? ҭ:v@ \W2;0'tҵLȗ-[fǏKWnڵk3 ׊++XIwezWK/EXQo �%-={/y^r>49K¢'e=>Z! ViӦO<#CJA2 Bf)~ .)rH.~7*zÙ׬Y$ȵ<@?{aY)u 0`~v}DJYgfͼ<QRh# D<tw۾Gפ&+ۚ?ĉ}%1 t!�=mf'|]wuֲe˜o5_J5vX/a׽ɓH7\%g5示%[lYs(Q͛"ϒ@K,6K))˅^"ϊ[FY1 @p.e'T6;ĝg*yl,? 7$WZm&#;cT2 Pe PҮ <Z}3Hx7{o#Gr%32^ջJ4teE5,jHeʔ:uȱ$ܔ+6>% �@�� �@�� P,_nvM_P˽.8k/3ÒgR]#ߕ3:.R{gsuiR?� �@�� �@@Ul>JN� �@�� �@�� �@�� �@�� �@8P5jQĨ`KE'ұH+d\y:|X(nv悊& 8GٲeM9ss=g7x1д *f'ʞ_|K&Ld?QFymGnO~޽{{ɖ{챙m\;4{vGV\tlW]u (" c'';ǮjZU]v>ǮE{P&&&ڷ~k[n+ETs2ʗ/I!�LHLӪU+훲SQ?]u*VT%IUnJcƌ. {qsFiȐ!&Q[oesLʢ ޠA0&L={Ǘ_~i^{H- (T7R}(e'A�KDgh޼y/w֊Mt(w(($!X^s%Kd_٣.Ѳ&g_$R}?Mgs4 �Ey\ݔÑ[S%+3dVll=V1J~gcD!j;/lD2]ٳ_{\D;Lm+{챰1Jqw\fH)wTp<Q$RDx>-Fx9@�� �@�� �yUB|s`L6e:7*[I'O=TܹM2;0?=/we{|Əߓջ'N#Gr?@�� �@�(62N9MN� �@�� �@�� �@�� �@�� �@�ş+rvSqE%[\x^h_`0$ӪVZ*!WToX+SLts C�E. .?f;9YHNDAd<H/LQ R_l}^k*> h~OW�J+VH)mcۙ9s__~ҥK}G"-KBD $.y饗Lۏ 꺩|r_ꏂ>sO}۶mVV-[onW`~Hh߾}6;u\ge}IAT?(GTQFV\&�2!PEQ 7mA%AՓO>i\5u8<*=M>Ed?_'=lL'Ӑ LKu%zw\WRJ~5O$MT:AAdu]Xfے宻2It礓NϝrP>Unwp{bM$;vޫW/<y6P{B~ 4$jTBEDY~I,ɲJuS*վ3Q3@' iQG%p69dDɲ-+Uh},:eKejc)Ur/1jy1J>h?ڗѤzE}jͨqI;upgqFtq?glܸq>F=wJ?h 7Zzۃ +Ru; !AK}0@� �@�� �@�œڵfwܑW^3nr|;8֭{]oѺtk֬EО{weôЗj<+}ak /`Æ :g?R?_?� �@�� P"~%9I@�� �@�� �@�� �@�� �@�� �@ H&�A-tKӢa\Ӵ~lL ȵet8HBU\9vsC�L͉@̜ 5�vc_X[]4]ɥ$g}lҤI.`}^c;Cl^5f &Nh|ܥ SO=#)]JO<z4BU\s XIUCE{%K,uYoxQg z{i2[ڨQB aӔ/^˶,Y5WI]}_ RdCp]/&Tmi8,VTE_fz-_͘1KT)]z6rHxgKAj,=\_{5_7Iu '0ZorGIy]b ~gG2l[ڞ.s}5~gM1 7l%-첤A@F'%%6%7gmM>K%W@9I@KIկkvb>Kdܮ];^i1@Lk-ɶ$ݒ|KK%jVRҭ%?U,ELv0'cT@x}x2O k4KM9)p"Cиq|]~Ő/_%/gSc>F:/^?hvQ+%7㕚EةRJ(KkQqV&5 � �@�� �@�(\{M˛]{`3 v{y7ٵkWꫯl„ ֬Y3weo&1bEuN 2nC#ܹsu�򮬞=_#wt:ۿoޅ }… ;z/wnl� �@�(~ŬV-S\ E!�@�� �@�� �@�� �@�� �@�� �'`QVfa?3.]ڢ ӢeC4f %bNdV9gi  D zm6l֭[GWTPe˖YDU0UIL|Tf'Z&UfS ݬ$ɗʻ z-[66nᆭK`ӦM hzjbId[AF; }_#JTl߾*VhZJ%Jݫwd[mޠAe{<+y =K. ^UǓ7!h;{e =zdIҘWt$ݻVI.ɦHxngڄ$@�(\3ljSK=sܬIdVlIU_u9']ËST{U}IժU [fqWA<g(hQAVp>'R\Q9VdEiXeI� �@�� �@��7Nsܘ]ydRf+[cק/2sZ6m[.g+W8BPb@�� �@ 'jZ:rΎ5!�@�� �@�� �@�� �@�� �@�� �&e˖te\Qoy Ğ(f&JOĥuVm O@Q%~o`?n6`٨Q悒:u2BfϞDhבBN@,YbQVW a%ɴ,*ْhK5M rx(p|D[nH-ߒQYjT֯_P;Ns̱g}fmem +HLL"$/A>Y $zꩧ+)"}GZVY!F}L@UwNL RYN yI&dX]ִ|HKKüZjyYfX� �@�� �@�@v 6z٭+#[L?M�Bc͞ �@�� P '^:竲& �@�� �@�� �@�� �@�� �@�� �%P\9SD&c$!etXB.Ke5Oy~%$\T+pKCNOE�`gif/lv≹w補O?5I $"ARo'PD[A{$RJ>e[�Iƍ[Ŋ;B&P|yk׮ae+~^矛[,[/RfVm5k֌*�@ 'pews^^_h Ǝkt&Ol=zpb&M .n'Ӓcƌ)YBm۶EIN/knѢ2e �1F̔ٹ~J-zqsjE[x9=?+* R۷lPBx=ۑ K$:tADY<;I� �@�� �@�� G}Sf7l`]s^{c6;x`2e}ȴb0 @�� �@�%n=S!�@�� �@�� �@�� �@�� �@�� �䜀2VT)dNo-[\ eT+Aʄ<&cwf;V^T6m؟{-[R`&M3㔲C@RIT"F'Dխ[7EmI${.+8$y׋9rr(HC3g>K@mD/JJJX}Ua:3Vt钮�0K/_nӧOiӦr…~e˖^uGAKև� �b@~bp*yv 7(_~Tbi8:.I֭[SI\t ȊN׳U �@�� �@�� �$sG}6馛{E\R\[/"]͛7fʖ-k `A@�� �@V-SYbN<NV.@d� �@�� �@�� �@�� �@�� �@��K@ ܊o鉸4M bS2evIUBM28f66K/5�591o<,1c9*WB-THlK"QF*ٖ$[AUK"AX`M2 VZ1ߤDS4?,SZ5̣iӦ֨Q#/c) SO'Z>}L׌=3&!>mpI d=zw=?%KRVXa_}wXչ|Iz Ilqp^�v lܸqߧםY͚uJߙ`76k\+gְ,wcһv|yvƍ/(g aX?ׯ_'$ɪYf$KR Ɗr^)}@�� �@�� �@hoW^1s!߇*!!co: R\zܽ{wuGÇgIpB� �@�� Z?V|6́� �@�� �@�� �@�� �@�� �@�� Ph lڴ)EpGe]2oߞr!K++UfL(l3g5kӦx'g@@L:VK)+I&VƍM-ax}1!$ D뱢$K/v%S !R=E.8N�$HLLN8XSq? HKr)mֿ[nq?Bu~곘;wM>3fؚ5k=i#C=Ԑ� PͶl27իSVT'>ۼ9KmkdZ .fotY۶+-[Qmh;z4HuTjJXHsd� �@�� �@�@<=4;n2k4=7:uuܹG@�� �yr"9;ք� �@�� �@�� �@�� �@�� �@�� Pd lܸ1]![Rx/KlRD[QWFUVv-v"6]x3$we.xy!:@UX"l+$RTT)T+*يn A*ϨhKٿK[x\N?8�/jll)+x9 ($ݻzEJQ/ZKƎ˽zAY=lw/! 4% 5kI%G}d:Ohu= �@�E`)hKm޷ST'J;\?wCx34Iv\ҥ?dX,G~EI&%ƊeE{I_|�G @�� �@�� �ΕEZ3g7WtH0Z| �@�� �"P+djkB�� �@�� �@�� �@�� �@�� �@�($} WƷlْKnIhXʔ)fL.ufO>ivq]]Il~Ozқ*wDĂQFRDcQcQcDcC,hbYgtC:H M.{Wx 3;;;ew;swVn5ir\ ʂ l̙6k,7ִ6l A[[&%,Bo>B-^ o:&?~ JOOf͚و#lС֠A-GY@A!_U|~c-Zc= !� ڧX|)`s.AR۲eU[fU>z֡`uVd]]vE6\r>ð4Ok֬y. � � � � �L cN29ҬW3�Z|@�@�@J^@x& � � � � � � � � � � @*4C4A[M۲eKWVZP4~_z-35fiկ_Evȍݻ]!D[{\A ռys1FSWH8h+##?g9#t}I`J>h^$oFZw}=ƎCliii6`� ޿*³|… w.]\xR$ @�TM5u̦!<?9T!j ³ YӦm֥K]ݻ~pUBs@�@�@�@�@ frosLu'Ȳ#@VyR@�@�Z@ Jގg"� � � � � � � � � � � 8iaϞ=Y^JC ;|p/6b3,0J˖ P*@h"j*SZZEe˖iqU\7GHvas΍ ښ={HAd[ ڵNRo/@k lh#@ǻ t9|p6l5hРxV[YoذݫWP1.DO>(ş6 ()ظqc`pHXiBX|ySխ[ n\fM6}zf߫پ}1ͬ{6m,8< @�@�@�@�@�fj}#G F 9�gvc� � ��ZSD�@�@�@�@�@�@�@�@�@�@�([n5n% mwU$܇p`8Ѵ+W.rgh96Kf:Z PtR[dIdP𖿭e5}W*((÷4O)`@iP1w9sf͚˗/wGydTVMA4(\DmڴiӬGb,=@FP%m6vXjp40`�Y~z]³yWV#Y BAۓ<3D�ȥ JY*|Jt[c{,]} VpHcڵ /wm7۽۬F l)lcG# � � � � PK;^x,43uYfas!@V.x � �$%@VRlIj%o3@�@�@�@�@�@�@�@�@�@�@�ʰ={"a\>dK OV%Ԙj-pņptz1KMwffvUfcVr#@�wƒ![>lKA\ RT5k|Ȗ-!P6mb Rؖ*ڵ+ml;w ҥ(&lE-M0!(TƏݾ#lС֠AB qTP4(HK>1H8co߾nܺu!�®zbŎ׭[oÆ Y;H@|(UN+_|lY_"ؽsCf6۾=68 +!8Us|� � � � �tUF43Ƃsffvf4r%@Vx � �$!@Vh � � � � � � � � � � �K`۶m.+m߾}Y֡B .Çq|Pqp!AC'gY43@�Pի] o㏑ /TV*MC (SZA[7nt]v R0 P(Ýwi_~y 9 (i6vXw<5x`KKKEҨ#`oqY Ϛ4i)ZjvG,hwJl@�(` NJ7O+c},۩%? gϏ r ڷ?- W � � � � @ (=}fbvf%4$@Vx0 � �A@<`<@n"� � � � � � � � � � � PRTLv˖-ԥ燋mTRPpV@R_c@ %&|K֬YN<]V-}(-+VApŋ}֏<ȨN:h -pwĉHŊmѢEV~}kڴiP4Ĉ֫Wp+O;w &ؓO>i�@:4heL+WF³5c ۳g5jh)|Qc @P͛#YP,?;V_dDW0j׮MXf04ܱ0ΦO7x:rZ<ս{tGFC�@�@�@�@�J@5m<`6jYf7dfVrV*_"k./{Ё~aEkbTAQF<n � � � P+RYGVV � � � � � � � � � � � Pfg\͟]wOv?.ofPܭ[Fhp9rpŻ]j"F� U`ǎ.pliN&��@�IDATd׮]wVn[‹@@EcfϞ5w\۾} Qi߾}TȖUTܞ@Yx73LHPNIAX! ] ##Fmcǎu,ـF8iҤH ph �_@ j.~ڏ56lpa5kF|0VX@~a™Z>l+w-̴n,(z`~,@�@�@�@�/eͮ4V-f eKK.x-߷ouŝWO#� � �9 P Jl= � � � � � � � � � � �j1c̮,ð_4k.ݻwϹ Jҵ%t,+PbE;-^Vy[zuZe@�(˖-l-?բE լY3 ~,X (e֬YnZ}FA5vkiPƭ[w8%=V(;qaƉŠhn0?Ν;m.H+==>܆ f 4 f [΅g�iӦZjY޽#Z={4C@�Jx僰8^H[Fmt L>�ˇ`ƕ+WZ7RS h~ւZ>lM¦涰V � � � � Pt ǂf\9HJ߷Ae\]q}GC�@�@� P+Iij%o3@�@�@�@�@�@�@�@�@�@�@�HI jHj*:bĉf]wUʕL@/bZNl;蠃r J4O4@ ;x[K,q\ n)"MF5lEC$賭pȖTĿFSrGDmvjJ¦YwO{IqYg~8 BƎ|liii6`�~'0e9s-Z;t³dr$dd1d JڴiSp,qlx͛]pzb`,?,;CHB!Kеә͘q lʹ[ /ٺw?ձYFC�@�@�@�@� M`n69҂~r+0_j.deD@t蜈Χ$j:rJu|4@�@�@ Y#P+y9� � � � � � � � � � � @ ̚evfSZP$7 ~ِ!C= 'd}LI~OQCpx<߭* qATHXC8xOǎU8v^ʕ,Y PVvi˗/7k?O8wP qƑ&M)eS2s6wܨٳg0׶m[;#4hP27F $0a„lòO Ch1?~ JOOwÇaÆ1XwSI&ɓxjp@uVw<ҳgHV޽L0@(qH�xX ӊ YfP0v$ +* [\^c B:C:|usYQ![]j"`c@�@�@�@�@5.5;bX^ \$=Skk_|Ex6 � � @3Y ? � � � � � � � � � � �X2 r)l .0{kM7=9=a � r÷6ol<?a\~ek O 4i PT }ժUQa[[ P+W\P$MZMc !JsE٬ t̙n+j֫WlڵkI4J v ۴/P<.n.Dkرn|f `7 T$[(@ .t +TQ/g:u]ȎI@ٓ%+^0Vxbñïb>+v\R@͛uյZ4B�@�@�@�@�2.*ƙzYp Ԇ ɜ.!P_}/ru#F{?3@�@�@� [#P+ s@�@�@�@�@�@�@�@�@�@�@�(͂ꮽم}}xbG,2P"7 * \c/k* ؊77/jժ[4@ ֯_%pky*[͚5]؊7j*Tbظqc$\m *޽۪Tb;wBCta[]j]tqŶ¼09{oݗ<y+%<6~x~TjС֠A͖]Ѡ�iӦ6o߳gO,h)̍� ^[:X~:m6)cqʕcmJ6}z0cF8/~je֭[fVu떨Mde@�@�@�@�@y[f6;<;0kӦ_ŗiA綮[zuB @�@�ȣ�Zy =@ � � � � � � � � � � �T74(zW7_ǂ 3lln Cbek [zhd:ݴPRxg+`+ѰrJ۵k[:6lhA[)7uTYf-mizӦMAAr֢E g@*7Kb,##Åh;<lߧ;%K^\hձc2mUV?#l7,o>ۼy Rpk8+m۶E-\G:R|8Vv+Vn P.yja[Mdǿ � � � � Pv>-8Gjvfweֹs~xn{mݑQ]x"@�@�@� P+Y93 � � � � � � � � � � �"L5#-KʕͮtVk>x+X}(W1pb*U\ ?&<_ !@ (e͚5 ĵ~ȊTT·Uy<>>\Kc g[>`ˏ8Cca+,?V@jղ;wFҾwa7tSd^Y]Vzz5k̆nÆ  5NSh֔)Sxz2c},?I$6ʴ-[̇bŎ煃Ppt,[ǰZȂc::ulu9ݺuP\AB�@�@�@�@�T O?58lHJ5cʒٳݵFm.tJKvg3� � �$%@VRlIj%o3@�@�@�@�@�@�@�@�@�@�@�H >lϞsA,<^ { (t+pWnA VC< ֊ p=f͚V|oD� YbE$tKc|ShL8`+6QFVbEp~_T&5w\J^ yk׮nA[(L:&Nh 7MI,k-##Åh;K`le*d֭6m4CV^_8HxBڶmGQf+?by]vE(CuXڟ cߧ`@pHEl͟trf>`KςZ � � � �7Xp<3+՚1#z3;{lv> WM6pȋT\ٝ54@�@�@ j%/HVv<@�@�@�@�@�@�@�@�@�@�@�bxI.P_POXM~嗨pzHRmo{\aQ/B [[?޽=YE?p"Ӹq Ű_(h~P}֬YQA[֭sSVZ` 6ω+kowQ-3:~xn֬1†j/Mylʔ)nP԰aجW$@먣rᲥ݄C�!}M6°r:WU8O'8_4(A_| dKEv̱ 8٬J 4*dK5� � � � �E/wf}\u[&L0 Nȑfd}s(jov۞={kg}E � �Rc Jގg"� � � � � � � � � � � PAm˛5jd5jdPDlݺ5aڼys$x ڷo_mV0WlVۉBc+VwD ֚5k|ʕ+|ݯ`5WJ-W�Iyȇի#![3gt ,p5.]X׮]ݠ#UV+Բ*}ڵ}=sd)GcǺ}[ZZZPm@@QXxԩn?Tݻw R (n*$7c[j\0V8+Q 'P7V @PTtWZӧg: CC;Y3r? � � � �G`"޽6m?f\b:u2.L!PVZEVwޱSO=5r @�@�@ ?j%GVv<@�@�@�@�@�@�@�@�@�@�@�bؽ쨣2 hvMD/7{}=-[Ds2'*U$ )ˇri(m Zjxc;i~ lHnUTQ=,m63gN$hk֬Y6{lo>wm۶ BL g@NgqM8*Wl6l0vƦPǻ tk֬1†K6ر#q К<y-]ʕ+/z RH1 Z pk(ئ)]e7@Xs4@7-mY![ݺթS8kdG X8g � � � �?ZpnlkT~ Ȱzg1k23T2Rm;XzaӃe]~zX"( � � @<#ZL@�@�@�@�@�@�@�@�@�@�@�M,"T(TE t_fA;㎳3 @@/9맟~rwwmTl)C5kF47St=() S֊+o)k͚5o^>sa[ noWV$?ʾpH̙3ݴ>sjw[-o)xW ./^x?;e{]uU=Ǝliii6`x$8 )M)SԩSX{:ACϞ=#Y> ȫkt\M6) +R:..+} A7BP4sPݴ9ݦ`mnuh6hgy{,�@�@�@�@�PA>}̖-;UU/6;p[o52Ă)RtCX-QF%.2{'1A�@�@� L@) Jގg"� � � � � � � � � � �B86l`ׯ2P֭[m˖-YWAb=?Ѡ*TUR\SF,к *jSt͂zˑ"AMwWN?=3DUC@� sH p@/޾}{ܭpWN\z.3P-T8<hpcFоX]NժUsQA[]tq߻vj `d[tiP�lYx_X+t}~#5(SO۷VyڵAհ-ZD}'g_zK/?o\rIv?i&͚5#FСCA WRXvm$8K!Z|$w Rzg=!�a-@7o~Cұ~_%d8 E [VQ_׭5dK{yɥE -8G`uי|CY {Qh~+ ;vpTAm'Ap Ԡ4?ztGot'<u^H+=#U4sh � � � P:t ]A^6nu>A|?HD>MkP蜀?k\I6mꮁQEatgaZ_3ôU!|3T uc~CGpߡ' Տ[~Cߟ/ jյ"~ڏЏokr>D @�@�J�ZɿWj%o3@�@�@�@�@�@�@�@�@�@�@�Q@H*4 ?*<ıCqEhv jPهcOZ n.G*b /|d7v4>fvi ,FаgdhxX^" PC|V<M>VxMߓ>`+<VіmMg7O߹*8AC%bCmMllVhe[@Ez;5k [[˖-]V׮]#tǣ⠂;?̞=g?#(4^z@,c0xA *񫯾ø}j*WI :Fر|3 6څ9==H]>$222\رc>--- c pR嶎ž[5uT71߶m6-*zEC�/>K /|ئr_2/c6pm@T7I R`u]ZYCj:XP4z(@G,8ȼ_i{A/[8WW(:m;+HgƮ΁UX<+?|ر?_c1?hbi{nxZy}Qرt^(v mfWUO[|l?:^h � � � Pt'>2̛7-Z]׀x?G}VP߃V?h֭sqj9í}AVw>Z;u}uJfY}jiM}cjqff Pߖy;]k5p?/XL5ņJ/cw`nk }?ws3Դ 55\Gر7`}ky5}?W!� � @ 5ZL@�@�@�@�@�@�@�@�@�@�@�B  ?D MʼnnçTt@Cݺu]x�N:SQZ7PTt_5{9 H|5m:zXk{bmڴqE[h0F�+B 9oc4KTC)|u[~whȏ -iaڵ9W~F8dK a\kD-p-5,]Va,*^jSq#g}矻[ԪU+d0+~u8Pz'/_ܖ,Yb 3g)K~?Uԩ[Pc;o.tInϣq„ OZzz >| 64hBVs΍ vj~gϞnPxBTH�%W@c N@,^@*6 [eoWd�`>/71#(KZlGRؖnPٗ_=̂Zf {~ԟA@q܄X6_ yϧA5 -+REi>H8\tXvx_&^?tN̟X}S:QXtxi@�@�@�@ :;eʔ0#HR8zZlε*Īm۶5Mu5yܿjΏT~VXVԧuyQ?:rn-8nA(y4m׸8Qk܄B5ڇئ~(g>'jo* H2q/^a?_ϕf^w-+k]^};s\m-@�@�"@V^KV@�@�@�@�@�@�@�@�@�@�@�I`͚56=L*" FШ*4"ܹ~ >92?XWRAO'K'C TWE4-ۏMy*)|m\ě7/T(oW,kl mMd?pR!ZBN-w׵kW7[֭[?z}]S's1.JAUVTi ^<y 2ȯ (޽{if~+–ձ]%̥ /tƎ- <l.|,?[TUS7|~+6Yq` RO@M[84"7:nP?J)<QZ>ďU�.,!�muE}}tVph YkYFFfV<)=F 1-4S[kPd'zX}ES.×Lߍz*?R_;i:N7,Vƍsp~KjL#� � �%s'G}d˖-s}%FS5$k.Ot QR�Ο|ns?cyw sbֿY@F+B.% PcG>Ck+K~C8Vol/9|~4;s{}_料Cߗua5@�@�8 @NW1� � � � � � � � � � � om۶?Wx |VUls֩S'J P </XW} j;lWxW3 ( Z ~_@![Sp8p韧>\+;.j4*2⋎/hSt}~T^׾[8hKOj Z Ҵ*]2o{={M0SO=k$?ʨ@oK֭[_b͛7:,^wP!*5b6l+(gpxV 頼*@H¡X*6.֖Ӵc*�DXP_8#i=$}n;@�RO`>~ ̞z*uT&Udwiv 9?-^AŚ5hz.@/A*ds,i؇hH2 Ec]ಎ|HQA5k5V?h � � �n9H+4KS'tZj\3}gAG t9cկu]r/_,Q \ʬoD`~^ԏd? y+L}Z]_krWck|b8<83iQc?ݢE wi � �5 Jގg"� � � � � � � � � � �R@}n<}tW^zaݺuur<,73fD +LUPZ{+zir#c@ 7mq8+<[l5Rp O'pXq{Æ B~G4VW"R@-lCb÷t[^dϚ5+*h뇠ZꔾRrSc=f/+} ')i SL^{m¤?x|uyOO_>&0zgF}Y{_qפֿ'}poTMUV.<KPm P~`u6k~2XF�H>;kA-Q{Q Ώlt!:1ߢE\3vڑ⣾i&M\R)Bݽصk WoE5Vf)kLC۶m#}T^1 � � @* /矷W_}՝ Kyֿ;CRyn:<g_7nM6jժegqFpN{F5fR /:t0kάu̡M Bjej{uW>C_xb}{ʹ>A\6j 3Թ9! ]C]iA>k*UՇ! (ԟi � �FW Jގg"� � � � � � � � � � �d#0{l{w߷I&�ۻb3 ͛7f Uyٗ_~>AT؋ 4N=ԠAP݀� k}*0@Ed!\駟B|0Wx޶m[p.$ 8뷷� [*65kDh} kP?�dA-R8 *SC4]~qX˯x[ΰaK.qŢؔx瞳'ӟ.s 7`w_xv郂 <yrj,?|.TNk,M]VT S] ,gVX?áXe1� @if7 vas R\{' woTDcH57bAU0W}Zj ~WqAUN:YǎP,R=c}@�@�@� Z'x…H) 9sαN:)賩 edҥKm|$l͚K\V u\)*4+G]+ky5< Rݻt^jAYdɒAs!z85]ҬY3ׇ5P5]v7/� � @A &ZL@�@�@�@�@�@�@�@�@�@�@�Uo iW 8 wBOa2E.\h|}giguu-E֔@�ʆ ͪhJ8d+ѴJtBU\9n8 p~,Z 賳~zSVl薂4(tKΝ;#+;n-)Zzߵ??VTAj]v jӦMx/Lb/>}ص^kgqFض~T|ԨQ6fT\s5VZ5/vj~w}t7uTgX㌌ P>M="Z Rq0eE@Ъpo^,6$-\Ŋr@ Aʕ 8ڇgm Z:k⠻`vQq5훕ch5n&-ZU1GDkUMp8gѥK7V\i � � �Λ7:yeo5j(̗.Qiഭm6;8Kg:tp ָq=ű RȜ9slnдBtMA Ҡ9q:ucyML@>*XK=i+t?]n]ׇ~D!jPbժUl=y!@�@�#@Vzj%o3@�@�@�@�@�@�@�@�@�@�@�:W_u ;wvE߸ʕé 6qDl2]ti@�J �Dk <*VΥph^x~Ճ?s.y7nt[>hˏ57TDM>KC9?q1 (\m̙QA[*:V**B3-)`wus9SAp,^nF{c{ǎ9昂Xt_z!{_{my޶?OnYzGۖ,Y%u<9m4osuziڵw!<Xt(*| ¿ >B >+Xo5F�@ 9h_S[Bt*U!8vϖ BNhۺ@^g!Pz4o<WHZ5(Y*T *XYQGOC�@�@�@ E׺9҅uY.{]tx֭[g֮]낵tiӦebs]vk4O 5V\tX[ha� S Ν߇X|yGԏΡ@�@�H5GJގg"� � � � � � � � � � �eV@ /3jǎwKc+"?NV`sϵ*Uek@�rPak=NXLp>82q|}ђ{RcHO޽{#/xA[0 Ν;]p֬Y\hjm5n8+,o=*no{N[ή:wܖhT\Bw3=k^z)Z**<K!Z:XRY*N1Ϣ^m~'^)*}~!� @ ,\оk4iTsރV+�J֧Ou5jT+ǫ!Po V3f社#ӧK& � � �E,nW]u 8袋LAP 4]@Ϟy9{]WzW_<G3-[ Lb'O6]2ԩ㮽P?иm۶ $/>%Kk~D=_:urzr}:tHx& � �$@Vj%o3@�@�@�@�@�@�@�@�@�@�@�2'0o<5j+^R% K/uF`|'ڄ \ჴ4+aÆeLE�( oi:^VyTQa1> FD[~㧫U8F@ *pӱcA8<իgҥK#fb3Vvm;#Tp&G˗/f͚e)En~bQ-!C`&jp ^e/Scw .gϞ=-u۷?MA{ Rpx)̋@a ر#KB|oߞe: (*@,oP0/ +3@�H9 ا~j*AaW1N ={tc@pTZEN:>~6mwÉ'ȹg � � @ظq]s56vX߿#(V{nywΏ=vj뫿>33x^Z_q mX0dXv?ש?qӦMVn]ׯwqQw~� � @Q 6ZL@�@�@�@�@�@�@�@�@�@�@̘1FiouɮJ袋\12FT$̘1cٺu (!b@e˖|»ppLxS|x︬C)DLo#jժ%tK[T<<05Z Z~wߙرcTȖ(X&[&j/n'u_~wy֢E {sƼNn~yse{,�*L߯ϮjFg 6uQX 4ضm[f0bQh+V �|  QB{Ttc5[1 G`׮]8/4 *`> 0` 8N8\r � � � RK]C=dg}vJ_iY]q /~aQF߼ 6?>#[b/T81c}uM<: RG`6o<ꫯܠ�ŋ[:uOt*I&Ҭ  � @ P+@x& � � � � � � � � � � PT@oW_}M7drJn60wwﶗ_~ƿEpLC�@$ (ÇlweHGP܆rPNU8Hik[n m@.SglR|VlVmrP0m̙nA[ \Uk֬yQA[*uw ^ +iРA6j(kӦMȴ m]s5vSO=eEh<s=ך6mj'NƍG-cʕ.(kܸq. 6LK3##}5h *<KAZDі:nTqa9۴i 2br!Ibw@XUn#� P6o€?3£'t+޽{Maϟ|򉩸BpO?N;4S@; @�@�@l :;wGuʖBo;cCux k׮]ѯD>_Q!<+ԶL4]_:tW P˖-3]7AyWv8 <#ٳ8VD�@�(j%&D�@�@�@�@�@�@�@�@�@�@�J;\Hwر8p`^6,*V/ڭG?|;M!*R~ab+8� @#y��@�IDAT@YP ̕9OKԪVcJk\~^p-VHK)^zQ݊_n]Xbe~4-M/\fiPDr }W^yvm. ǃ]wew]wu~6|,]w5o܅=v].,ըQ}%X@مZepDwsVZ5]X~8C#ӚcH͋7T^=b� �J@̯+W_Y-7r)vqǹ0\-!@ BZ+~> kg[JB � � �*sN2d)_1@²Xjs9߻ ?>'kaܹ_֧O+_| %�%tmo}֤IuG]P/r@�@�0D�@�@�@�@�@�@�@�@�@�@�J7|coM%5tP*ߘQ۷oP\9u[ aÆ`iv" �&܄sr~Nݻw'(ˇl0D4_IZV*tiC4ݰk׮('m Ҡ׮];=jC Bx6{l;m9Y{mӮz3f;&q< 6lpnf7x-[v! PR-u{XAX~ ?NZʕ]ȕ@< @�(J^8O?mo5muY֭[\^ H@ ?~+uV;lذav/� � � P :3mҤI%&̩y|ĉM®S|髯j>>liٲe.�(]~O>ڶmk^z{+h@�@� @V2ZL@�@�@�@�@�@�@�@�@�@�@ <#v'p!�n#٠B?#bн{w۸qTzj[f\Җ.]+pAM;vӣGիuEC�@�P#mC|Vy9=6Q@~J4/K<H%*\pe/^ߣ;)HLZᐭKC�ѣ_4 <EǍ7vڗꪫr<{ӧqg*&Lcwi+V,ɬoI{}+??޼c*Ur]:R>ʏ}U>?O2h � @Iб>Cc /_۷l� ?ƎkouŮ;s�f � � @ <t.?v jUPkV}ZTXp=îPn 2."kݺu*�,p-]~ڥ:׌G�@�(j%D�@�@�@�@�@�@�@�@�@�@�Jp/gy ]qfؐPƍ7h>:߿VZe 0{l1c͙3Sv)ةjO,@�@�ؾ}{T8W8+tlHƻvJAժU• *w^۰a+Ԯ-lS�|S�WZ\�TICx:|[T⟞38&NuQ8JZ*E+xiӦowyjWح?$}5 +Y~i9s5m42; [+?)K/1热4X9UVʕËd@�(۶msq~wL?iX�e[`͚5SOc=掑n6Pe`@�@�@�[O>Ď9y'S2e&Ayz~A>Xצ~6n84hfzk4h @<ɓ'?n]cK<)!� �d'@Vv:GV>܋� � � � � � � � � � �zK߶7xN<Rl` ~ZZ#n)O/"ӧO/>#]aN8 b{nʅGiy0 �(ĆnśJt;ƒnyרQ#nWUVMZ;T@J\ᠭG*4-le7(0DDžQӾ}ժWnm۶.]Xvܠb˖-Yfƒh+0zhW(L[]vM6٢Eg26 Ν;* .KX>+ʕs+ry 3!� �,/u]gk׶[n9H PVO4f{]`$t� � � P wLO؈#J:YMo}֬Y3 byZlرo:uꔧe`(+Wxtͯ~+5jlٲl � � P+TYHVf � � � � � � � � � � �eK7o߾z޲w}TV4]�3<ɾm޳_~vavUW!X#ԩS^R9ID�@�R!g[!]~P.?cbR@ ]0/4χ`m޼مbu 7ҾTv[O5hZXeśVHb^W^zk?櫯~o U&(OVZWh 1~8P=kk֬qڵkzߊXrΝ.Z AYݧxMn>vӱ5o,߂*8o� � )}!Cط~k#GtœqTqĕW^m0WE.[׹[w}E:~裏\'V�  0)ĭ4}.r{mРA%~տP-Ž &Ŀl� � �%{Z.]E;MնO.?.¦v?{lwMq";1ewN^;/_}U+#s'/,T/,*K)ۊ+woawq.>ia @�@�!@Vc3@�@�@�@�@�@�@�@�@�@�@�J ީ8믿^Ћqҥsƍs?t7/W +km0,^Wݻk.CBg}V^m>}O'|{ɓMZN'z@�@ TP=P7h*iӉB} 僸4nԨ ϫR`ڵT(z֭.ȇn\fΜ cMaZ nikRSk[?ϮhTc!L+0zgmС֤I[j z],;Ӵ3fXn{>3S֛o鎋g3鳛Lg,t8+qLk*Ua׬Y±AC�@�H}ynᄈJ/Yj\m&? >8V@^S"1B^ω\ӧ~ʎ>^LǮsAS+Q@e˖٢E hŻI .pZ yŻb: � � @^~e[`)U@ARcƌ_+?'{VaZZu魷jsl>B? J>1 OnU2}<'SԏV~=]ãkw}wMѢ!� � @ 2@�@�@�@�@�@�@�@�@�@�@�RX@EGw+֞«Zv'9]N'P;#E,䉂~^^N?۷ aT kv5\c_۔)SLN}3@�@�"رcGTHWv\Zh߷|.+ޥ !Ro-CJ ڹsm߾suT|͑`%=χ/ĦeW^.R{9=T/ۛqub ϫ`ݻ۷~[ۯATTlԨQ0zn˛oٺvm8V@,1� + `+?/7c=r<@�@�R(W_ٯk{Jn6mZl6|wNHŃzb[xa1O6vyuN??nvNyN:>#yIk.,/y(XK*ۢEz)� � � P@}q ֢E ̚5zi^92:{ 7k;jr5S| 0e9:}_Bo:u10VAkċs0-/~D*k׮SN9*Vh~ƥ8փD�@�H}O^= ?[p}Ao*aTZ@�@�@�@�@�@�@�@�@�@�@T}ʕvw݋+(eԏ1"E,䉂~^^n6_A w+,9sLWp?71u5ݻ]}VvmWp ݟ܁� �„4ԩS@^Mun R� rś޸q{^}*.))QPR(KGs̱s9D}̛0a UZ&M[n1j͝;7E~3<cO< CaNhEv`z_n:}Ul� � @n֭[ggu??Uô-ױZii:ѐVD=u馛O?M+g[̯ <>l4iUT^"� � �Sɓ'gtϗ(O߾}]|Ӯ,ۡ Xr\DfͲ< goޅ{?P|ǾVP* /t}洬d)Kz?b"&ZNqͯ_~~}С6nܸZ^@�@�R+Pzt)o� � � � � � � � � � �jz5hРp^ f*O?m=+bcƌƍ*vZ޽]ڵFe_~m޼َ>hX_뱊l>Z˖-]xqE>VN;?E PʱaÆ_y[t+%!�*"}>駟 Ǯ^[ۿi&tWؠgϞ`h5\x7| o_^|ڶmkrڵkK4? +]>S?{&E}%DA"(" b�bF(@ Jd%I$$[[zfzo=OYUn}[uNr'@�@�(�4vȑ#amn4S)XE<҃رõ%U:u-Zݓj(+I_߷_~%Ryڵ VIF钣լY)]"Q/*(6c<VI=_޶nl򃦥t,]XZ?) � �D"%$~"<SQ>pIKӂ L՟5؛oi+W.]T֭sf[۶m]DA; mRj$>qԡCS~re{߻woS kyԨQJ=x`ۢE,%X.uԱ?Õ?pc>ɞ|1.XcRς v,Ԯݸ/l)ƠdYmH'%V]dsm19}ҵXև~hsε/4M?wZc=JСC껨ݪϓj&V&uXСC{Q@�@�@�DT㛗]vYOV5cǒ/Ψ6t߾}=Iټ⋮ ~'M~饗L2KTҕW^iII}j<_PBzˍٳgې!C\n&{Loh=5h\Wߵv T֔߻0D^p%zݑ~Dv WݓI3f>>>%JbR7?VJ.2b{>#a^86@�@�@ .L � � � � � � � � � � �q)pg\3xɰka݀)ФI 0lذ@<yw^~^`@ ^�(1 4mK9xU�dUҕxԻu;wL6-t֩:S"E^?OZ뼀vhѢ@p:MĆʕ+?sOxgIy'_1 uq/Y I I � � [zoi/IT[n;x f xqDY~77nmsH~yy 践<%vz\SL +Wέ;^�nƩUVj`[f͚5^@) ^�Ek*'|2Zՠ@�@�R%&xIgT혁F7#<⎬ u^@]~…p/ȫKxJ% \U)Qի]YjiڲeK|6l֥~r/s@<iƍNNx|KT&LƌP Ov$1h*q-GVJ,먶*1/Ӿ{/xp _|+6̽\udZbkU^8֩ڗNnIiOcx* ۹s_q%K8}d!#MI5HWj � � @ %vPEr&'9^QmhԫW/xo~ߔo%q^x6j}Ev\z =׿ӫNEJB M>:ݻBG~wy'p@=^ʕ+S{LѾ<\?ꑒI.,i޽Lg૯rMk4mI?o4u̘$gmfơ9& � @ؾ=ֽY1V$*Fu@�@�@�@�@�@�@�@�@�@�@�O@#+g䤤Yz�zРA7o^`AЇO۽曮z={'uiM`Td@B.0^CZwUVC=| Nݻw/^<{nˌ3={J6v)[1sߺ$e_Õ)_<.8hzFI~HcQ. � Jߠg?4kK鷶~ + WhO7pCk׮b̙PTpn~ժUN~#F sUp|%U 5вgum͛7'(*wzu)8XɏCj)? � �!i&4?31'Mw'VZ௿rE(1~o+?5mԭSr&SN@mM*Gc)QBj)*%NdIɯCrˋ.9t%J@HW MO?=P+pc":W?V-ܸ_Op_iLGOkF:)Qb.tz׮]nv]tq#ԆFr MorSm*Wk]v߱:i2t0VI@�@�@�xӧO@ cZhQ&Mj8#J0^BnkR_ B{lٲn֭['8j'NE~뮻.Fx/<y~B-}J)Z*s=)9%t }zx$nG4p{\suύ"7-~h+/]v!� �djJ:4@�@�@�@�@�@�@�@�@�@�@�L jg }e{z˙3yj ^yl޽nʔ)c^6^�봼w^M2yvirJ<+Xf͚?sm۶6rH[lyA`x a�Zjeõ 7/Ё^`D{ i ;"Z9-0/͟??ES � @^Pn;Sͼ$ݚ7on^*k3<4/Yl߲'lgY…mŮ=P{DU~7[ w{O޼ֹs`^`wHe6p@[?oG:\7|u=`Sr?ȑ#=@�@�(Zkl۶-#cwVr̫Vm߾-/8.\h^bb$ƍ?ZÆ mر每oK /'˃[5mHJ18W3I5y |.C>s?R[߉&ssEqڮ%r#멝^3fyAt|q+խ[7ئ ' /oKcfT @�@�@xQ]zwR5ܘ*/Ψ6z!G%3/uY/JO~_GąDtc:3L_>_xNP%?K Ν7jB"{̋\ k2OQ$uIC77kذavWgg͚eGuu_p)F߯cF/D#f4:C�@� ޅI"� � � � � � � � � � � (/f?`H~KDHWXa طo_۲eٳR5)օו*UrTHvڹK4~�.Q 饗کzB�p~YZ&./z ~0hCo 2eS � @d IAnꫯǛwKoQќVZ{ǂ S[CAnxKKm,lX}SSF$n&wTwޱ6mڸa � �-? 2pVZHGvAG; '6Ò%K\R\%h LJ}u!u> Hi$t?Nsjcf?pU_%KH=�NIv^6hm}be1QFY˖-cJ@�@�@ ;_{?lU)۪j[mO?ԍѯ[%Rb^zɝɓ:ݣnRR͛ƨ&=&Kҫo@}iJkpN=5N_7o^חvꫯ7M c=II{uк&qVGRv Yo .="&"獖f7Ʉ� � � Vt=) @�@�@�@�@�@�@�@�@�@�2^{y% ̩@.xcѣ Y{�9ܺĕQB0M+WNQun#F0Tnۇرcֶm[SSZNLf -/5uۍ7ڬYkIkIDhѢvg$ � �~c.[6md .`wZԬYӔ|5qۥ͛wn0%J֜9sf]DT%KLd7-b۷;dJq_)ROqco9vmGk.l� � @<&LH3P޽ 3tP];Wj(]t/ƌl~9~N2t|ҸBRSjJ1:Wn]zdTǏO՘S2"}OL%<K� :G[9|=p@۲e;=C � � �')P^=믿LIģ=Ezok͈63ϴ?%W"'*A5Ԥn݃YT69_IW^y5in ē'}FnhºufÆ ??}s{O{Cd¬.av I/O{ҿ5 _0~h+/zڵkC!� � $ԊY"� � � � � � � � � � �'A{�'|+j׮#$?{l{衇܃zPVAϟÇ8%uӧ[FImr=z֭[]v.\;۵k;)Vf\�'+•Զ\3Xٲeu յ~K͛q%\b{sfԃm@�@�vZj)jΝ?zߤv8SOcڢE)Amذ!. 4p~ v*5J>oVIdٯ_`1Gqd+BAԮ`#JR  � �.a%R23f2�Q|Юj;ӃHmEwPYc+i?R%jR[,)t|E5}7 vS XHJD\T,7or$7M6}|&YD4~gk+ϟ?y}c{g=['s^ � � @vS.]ڍ G\nRxцV^~{s;wнaW~el2%DouD>uʪ'/S_y5jM~ߘG<Zq/x~D69@Rm-V޽) [cǎ`#獖Z'飏>r 2@�@�x V\i@�@�@�@�@�@�@�@�@�@�H$PT)|G'4}YM֭ @AO;4Oyowm??{0ow1c7ntKQХ4i$_vAsy:uKz0v۶mSO�6)-fE5V.\8G?y,\�lҥaeOsCCʪ^zvۨQR}~o믷o֕@�@ V( g&M\}oܸUX.wp}n+~c+и?)m]+}m#Y*Ϊr뭷Yho DRN$(ؔ)SCl6 � �ĜVӮ*1bDO,w֭O7n׮] ΡDv7uwyg"mn?Oɴ'`7t=S'Fc=W{Uw]ݲe J.]L>sLZf9%b>pKc%7VxLDc1UnJ?/}$cNNR_%mRoZ&hRwy?|ڵ[4NC_4Uk&g㫭:tm/b"Euˬu?xwW @�@�@ ?iÆ &͉VSUIXiCknݺ/^y+Po7Zќ9s(hV~ZE8'SV6l'~_ 'L`~VldS??~c^p&WN#/Z}>n"7-~^ܳ =_;@�@�@ { x7>0!� � � � � � � � � � �ĩ7jժسgO)xڷoȓ'O+?Pr(?xٳg~g xE?n:={:K1= Wx&Xt >|8wە/_>% n޼ynr*UP+V,=RUNK PNW_}u`֬Ynp(սL2gy&0h KFhժU;BQ\vڀ2pm=  }6m]F%E7 � �YG OQ<^`o~/Z ʤ)I+w:u{ ~6`j\mڴ l߾=ťQyʕ) Ʈ vȑƶ � �Ĝرc^7DMn@5 \}Z>rik< @*T(%YJPԩS':MJmj׮cٵTݨ]\?V$K/aS@*['jկ_?p饗�G"_}%h_yI{/+K>XyԾ 7&s39w t4ӧOO DrFDc\䦺klٲ/)tK fժU/X_jz7jȭSRYfuj_)z j/Y^ZwgZ^O<)dŋ."3gN&քC#� � �VK^ԽɵuS/6ƗՎy&Ox֫?^z+#{k: %MO*x/q?{uw?~ uݿ@ɒ%],XP?I%M47#Fb\]"='[Ϻk/ƿoח闑ܿi6)E?^z.?3ׇgdpy(F�@�&9n'`J@m5F@�@�@�@�@�@�@�@�@�@�@�T g_|yĉH""۽ 4/9[&n^@z3yIKeú7=^Bt5/y]yyqҼ@sϙ,SSCY|Ke^+^xK6f^N%~ ыKI5_ٙgi^Fg{:Aރ%H0e4iy-Zۼc +^IkҤ 8ߝ% � @:Y'D^Pp[f}J;we˖׼Q)3 YhkӼ%s<@�@�.%s{׾ӧy}pQ?Nf>a jD%53/07XԎhKZe^�d7q)HID\CuR5TѢEn-[tcuηXbLuu]g#G[o5XXg^_w͂ SOو#K,g^pgեZ � � �I?qKVi[ɽ-9j{OVԡC9sy 6^i]ǎuo�tqzkvYP}F^b3wʓ'v?Ixz%rKd^'9ӔR~[,tHMKdC׳fͲG}.\h =zg}C�@�~;v,=/=ψZK � � � � � � � � � � @C͛7wv*BPK<7.*+ԴiӒ&>kD)SJz*`@v�UV.A07Ν={Jdɒ%xb7o͙3tSƔ(Ki% WN K/%V8!� �Y@@T5krw1 8*Z.]E~E@�@ ; |W#ի{q-K.O9]-화WdR(<|'ڶmP+a0m@1ޛ>ڵkgKqx_ ZӦM駟:udSI@�@�@�+͛7ܹs]žʺk2dlN(3&%U4hKVL۷8S2:N_q_h_yI&MI;'y{א#"� �dj*N� � � � � � � � � � � ]:,5k|.o ֮]^>O|sN0 *d QuO>Qp. EɲP&%*Z޽mRdIKnK. ZI^I$.G5kF) � �dXVZ fK@ `]v&NH2 ns@�@�ꪫL_^xnָ-gΜ[,~hgR_Lhkj%%\Bk6St 8ׯ-^ؔJ*9L_믿n}j%nԨQ׍ � � �@\lԨQvEY֭]@'Wh 흙'駟ZϞ=]"Jz#=c?ZxҥVz2F;/k>>v>i&wСC?o>C/=G � � ^ w{ GE�@�@�@�@�@�@�@�@�@�@�7%BzwAL21OMgqA03'OvSv9p3^_ ��@�IDATy,%7{g]`R%̑#}7nl5j0%Jˤ@WxWjELņ � @ (5\cK,3g9眓aǎA/MI̘@�@�ͳ^{>#7бcGСլY3z̝+'^)|`j׭[>ԩӉg)дZzu{7vڙT{q5k x;fS[on"gdK@�@�@ X.2;l„ vgg6]we S}cʔ)VV-Sa6m|1Ux pc7n^zV6,X0O"� �Ĭf%JMn֤IV3&+FB,T @�@�@�@�@�@�@�@�@�@�\~[n%*P@V*{M)wvꩧl/:dC… ;;wn}K0vPKȑ#Y(aF"ږ@�@�}Yfa]}sv $ޫW/2d־}90GA�@�@ FO=z *Unɮ:kР̙3Fj}JkgϞ˗4ҤdZz%Çsp5nk.ꪫ\o͛7.G�@�@�F˗/wB _|a+VFg5N瞳~zmJ랄#G-[%ѹe˖.VLW>Tlr!i]&N}1c-[ڶmkv)eI@�@�X Vگ nǞ � � � � � � � � � � @8z < )AE۹s?AYMڵkgJ5m4:u}.jw+4n84gC�@�?m{[$JL|-ؔ)Sg6mNDvG�@�@ k lٲ>#,s֬YVpakѢ]}ִiS;3 R{H@o[4ik*0OÄ́� � � ?7ovj/1;gޙ޽ۺv{'*#XƎkǏEYR\r6%˭Di(]@ Vto_M<V^m{ntM b@�@  P+ZicO@�@�@�@�@�@�@�@�@�@�@ .t^pɵk{uޝ'}k֬W^yz-+T}/ 7mڴ%R~=uV˕+TA saoKn!� �ħ#Gs{1{ǃ#S$mgl2G .H[A� � @6عsM8Jʳk.Z]q.X_l%K̦gi!~W1cM6%ڰa-[֚7onZf͚YމQc@�@�@� :t~:tu^z%+Zhʧ&L;ri~5n8Yݖ-[\_wO>cժUs}M41*Į͙3%R? L_r%֢E ׏Xr=j� � -HHB۱' � � � � � � � � � � Wz|6dHM6. W2$/d (W_}!^zY.]SNIڵk]-&oL-?S#6F�@�7xx߶5kljY7s=~k7hFmK>R@�@�-pqX믿v?8p+fF /ttsʕ18;b@öxb;w͞=fΜi7o"EM6uT  � � �&[waD*^ziJ<ձcG{Wp;@ t1?Uɵ_~XKuEZjd=1Pe@ tŊ?Q#._rm׷.̮J7{F�@�� IB۱' � � � � � � � � � �  *0fS@{=lZR%[CvyťIv?i=\<j(\2-ZwmW_}uԒv!W^v@�@�(@\;wyY߾}_~viی3{UVO?m̙38g� � @Vf͚qܹ ,/[թSǍ;J@3ZpO?e˖ $Z^zK[\}=8Y@�@�@ {G}ZZ57~zצ<v4۶m 6x`XJ5k4G ul.V͚5M+]ըQ.$%A%Zh-^%S)R4h7nlJx?A�@�@j@ jELņ � � � � � � � � � � �0#\M6YZ즛n믿=x{g Ǐۜ9slܸq'J*ֱcGԩ)S&kD�@�v\O>ʕ{1޽ɓ'۝kZOHǕll„ d s=7ű � �P_.X:t%R\ Ʉ� njK.%Kj*駟կ_.B�W @�@�@�8˗Z7R>W6GqFHkVhQ߿yq?f/%R(ݻ} /^sŊ-Gó%q*yf[lYpV>|uDvJUrei#� �*@B_jݎ=@�@�@�@�@�@�@�@�@�@�@�';%aڲea﫯͗_~{hعs}_W_}e۷owAoFk۶թS'v+O@�@�N@~i\3ϴ={Z׮]N; Νk/Kf͚D�@�@�t8z)*f% ڵk;jҥjժVJ|yYRұV@ h Q[b)p^k)M;P[%]իW � � oSOlg}qֹsg;3yM6͆j~,YgݺuSN9%f֯_o ,pi_M 4*V|9X '@#GlݺurJwC?qϞ=nSPè/QoF�@�EjP+v� � � � � � � � � � � F@z+ĉݼh"˓']xִiSkҤ5hЀ[a2rxΚ5˦OnSNu=se5kZliժU*q,@�@�R-a{2|禺Çm6h ={]pַo_馛/(uF�@�v6mKd[J szꩧA+W6c0RJnV9rd;N( ;v>W[ͫWk֬1]5/^%Sr9Ai Zτ� � � @f(a믿n#G_o]tqx~7=z >ݻwvY޼y'M~ǵm?L2P}/Tҷ+H"i:.;!)ɜf!#jkǨIUTq}zVX>� � @H&6 nǞ � � � � � � � � � � �lݺզLb~M6=;wnS5l%R-=͔>zXA:쫯 u4=l|WؕW^i]v*T(}*A � �ݻ7ް^{.nڷoo1g)ۘ1cLZݻ]zL � � -͛7۪Ulʕn ;L|B .P˗:+8*UDѺ #G\[[I6tV[?z+@.!$s$qV|� � � JaÆٜ9ss֭of͚U(?c7ϛ7ϊ-ݕHFx< rڵ=*Ur/L<,YҔ عs'T_a>o%ڡ,Kԇ#O?ߌ% � �BZi$J{"� � � � � � � � � � �A`ƍ۬Y~K { ڵkD[ZV^%{ʟ??;ŋۢElɒ%T2-[˺tW#� �!pqwޱ>̵5de˖֪U+'+J:tȦNj&L/2Vu:vhgyfV<-� � �Ԧ8jV�c%/RQ-`ܹsj)Sʖ-f.][4+.y׮]{f!)Qf%~r۶m]\wMݔM8+�f}@�@�@�J3vX裏 ƜX+vIkӧOoƾ[�^p .XӦM-O<Yf+ٖP^ }?kA}RҘD@+ Ϻş'doCՇ$X"� �ă� ~Iv;D�@�@�@�@�@�@�@�@�@�@�=)… /b̙=<{Zʕ_89r=zj W\mʤ@.)YݺuMsz\ =,?m42d?P|nݬ{V\x@�@�L8%/mϞ=MѤIkܸ;'Rp3fy̙.I~۷nڮ:8N@�@�@ >(W|O~!1)Q?ϟ-Y(Q͡/nŊ3-5k{+o>۹s `ʚoKԬ8R,}7tYcF~6-^csz@�@�@�L<%2e޽۵6lh 4 /ׯoY%9VZƢΝku׮]ۚ7ofD+|ulOB!Hٟ B-8`g~Cͅ 9r?A}~?C?+t}J̦m~ak%RB-&@�@�� M V@�@�@�@�@�@�@�@�@�@�@ 0J/]Ԕ\KQ{uG+V O\=>v{P94�fh@LhЬ4dcUVu*Ub1=,?tP7aVZY=iӦYa@�@�8z}ߺy\pԩc5kִZj9csNVe˖O?dK,q^++X]s5.Qk@ � � ٺu)PliDO'PKs5RHW\DUh-YO;4-'M{%MSP[iVhf ޽k.k&ҡs鮡DMJ�8Y3!� � � JF4|>}KDdTS{VZ5RJp>`'kTWmŊ|rkGA*5j3{Q Gɓ{}%XWGgBPK-LRI/&^~^UI&W }y. );@�@�@ j�$J@�@�@�@�@�@�@�@�@�@�@�bO@l ~WS)%Z;x`1t.V{SO5zP/kV9kf=8r-e޿LV`Cz@U?!eW0Db DZzd'=駟ڐ!Clƌ@w}u<@�@�Xu83gN0ʕ+o{o *g R;B/_>hL~~ \Rm�k62ׯ_Ge֭iL � � @z h| Uhp5q&]V'f7Zx^kFsNKm*BgӜ'OJo1-J @fY0f?:/T;Ssk?x8pYEͲǑZ 7| ~b-Cm11}NpC�@�@�@J΋/&Zzu0a{2eʸqж^Pߊ^~_#4+y\Q$GϪӤDYUVu .:u(~3}B :K?!’ˤ 7P~D+OhZp}:]>7jnC ZVb=~֫n&٨P&: F&GR„� � �#@BP+v� � � � � � � � � � � #^�kм T C *?`1o=zVZ }t.iҥ.۱cG\K@�@�j,_%R« 6ifJ*`|$. J2%U,-5+p1!� � �YA@A[5lɡp uj 0TPؓ+Oo^rE)AwCA5: K#鵟<_j&@�@�@�}%Yf]˪f?Ֆ-[L՗$<';Artϩ_uYv1=#[hоBm&^*g~Z^~z^ICK:?Xjr@�@�@ HkBB۱' � � � � � � � � � � @ cvЋQh3g*J)0޿0ɖ6ij:MJnΕ+ ? s2e]y6akݺXdw__~3za7tɓ'֪K}@�@�Hw%RR;w!Mj7KiYbŊY@�@�@�R*�]Q;_k&R/^q'~ }uQ[/2-ٱ � � �Ļ,pHɵ4A~B4ǟ^sDK3 tzƸq9["駛qC~C0\/ ]~ߡ7;51 � � Vڿ$J{"� � � � � � � � � � �dGњ77[le3B8|m޼y?[57U!Cngqhv;L2^� � � � � �E̪W7<8-{ � � � �ĂWϬC7ވQ@�@�@ � »D6g$  � � � � � � � � � � �(Уf&edZ|ms"m:5m>S[~uՆj*T6mԩSl@�@�@�@�@�@�@�@�@�@�@ wYfEtC�@�@�jʕ � � � � � � � � � � �x25RkLl\ti{'矷kDRDr쩧 6ػk[n5%۪Z <ϔs@�@�@�@�@�@�@�@�@�@�@ =zwرf@�@�@ P+\(� � � � � � � � � � � |cfO?mֺj~;RUϛ73gڢEK.zʔ)cw}-[,KE�@�@�@�@�@�@�@�@�@�@�x-w19Ҭbح'5C�@�@�8yj!% � � � � � � � � � � �dƍ%s2k֬_ <p:*w6d4i?>E֮]ۆj7oط~k5j԰.ƎkGMJp@�@�@�@�@�@�@�@�@�@�Ȗso2["'� � � "@B ^"� � � � � � � � � � �Ķ|YfÆv]#]&MCֻwo['E… [Ϟ=mʕW_YBy/_ޞx ۲eK=3� � � � � � � � � � �!wY6f  5 � � �-@Bx � � � � � � � � � � �i>Ĭ`4s;>.ԠAbnP9y6~x[vu^{5;묳m۶wߥHG�@�@�@�@�@�@�@�@�@�@�8nEF2˕+8e@�@�@ HSF�@�@�@�@�@�@�@�@�@�@�_ٰaf矟 :+WkO=ر# 'J3ƍmĈnyeY_+E�@�@�@�@�@�@�@�@�@�@�xE ƌ1+Y2#1@�@�@�bAZp � � � � � � � � � � @۶uj֩Yne?|NG}4˞CR?Scǎ6g[`5hzmK{VXԮG�@�@�@�@�@�@�@�@�@�@�81ìg5k8NE�@�@�\Zq@�@�@�@�@�@�@�@�@�@�@� йyɦ^}5+6mu,X[oْ%KVHثnݺ7olO<M<٪VjW\q}'v,pT@�@�@�@�@�@�@�@�@�@�C`6vZ4'=@ � � �,@BX: @�@�@�@�@�@�@�@�@�@�@7>oRLұcGW+;;"E<`W/ҔPm۶VB0`mݺ5p � � � � � � � � � � ǎu`V;z^!� � �ď� Zs � � � � � � � � � � @Xz4,WTW8G/ԩSmɩ?+snѢ}vZ[lРAV|ya6cƌxZ@�@�@�@�@�@�@�@�@�@�R)pSl֬f rg6G�@�@�$@�@�@�@�@�@�@�@�@�@�@�@?̞'.bkݺ@- *?o6maÆٺuK/ZjٛoiϾ'ϙ!� � � � � � � � � � &6jk1� � �Ĺ� #� � � � � � � � � � �*f-2eζEj5ӥ^<-YF.zN:ܹs<[.V\@@�@�@�@�@�@�@�@�@�@�@ B_5_'^l� � � H*� � � � � � � � � � �dqÇz2+[v]tQ,~6~j[o{̎9׷#FئMG/ªTb͚5qٱcDzr* � � � � � � � � � �ėo,QVTikܸq|p � � � H7 � � � � � � � � � � � f۶νjԨ U:<.СC3رxbŊY߾}m͚5.V<yo+O?m۷ojS'@�@�@�@�@�@�@�@�@�@�HFVVB־};˙p � � hfK "� � � � � � � � � � �YK@}֬OaúMuYg]we g^{M4%j׮V\9[lxtF�@�@�@�@�@�@�@�@�@�@�h ٛo=U^B*r@�@�@�� 腣 � � � � � � � � � � @vxiB̚6َ?n5k̮y=#.kAJli&{7lʕv[:ulvxd@�@�@�@�@�@�@�@�@�@�ye̺w7l۶Ѧ{/˜7D�@�@�H_j/#� � � � � � � � � � �B`74{QUX܃ѩ("[mZxq{\ҨgsϟߺtbϷ~jԨʔ)czիWGp� � � � � � � � � � �'!oY6fu=lƌc:t8@�@�@ P+\I@�@�@�@�@�@�@�@�@�@�O?mVYnfK.jժYΜ}{>}6dȐlp4h`#GM6Y~>;Ϯ*_ � � � � � � � � � � �I tj{yΝe7n'= � � �ď@|?U?י3E�@�@�@�@�@�@�@�@�@�@�b^`6w5{A<yPf͚1_`bŬGK/Z}R~u-Gv[J瞳;vdS<@�@�@�@�@�@�@�@�@�@�2bfF.(VU^=˜E�@�@�H?j-%#� � � � � � � � � � �B@F*d֩wZtըQ#%dMx۷o ><d:YΜ9UV6yd[jx /Xrn~!L � � � � � � � � � � *[w1ͮرc[B75 � � @ P+/>� � � � � � � � � � �ĊfnvfmݺvAB]%JXnlvȑXlYs˶i&<x-[6lhճ~Ȅ� � � � � � � � � � �Qo6kܬ?e۾}o>ǣ@@�@�@�)@Byݨ5 � � � � � � � � � � Ǝ5/;i-]ԽQF:ϓ9>}nG>b(PKPpB={UR.+Syڵ8!� � � � � � � � � � @7ܹF4ˑ .>w'p6߃f/e)kV(/WTB+RYl_jlacbfs?c˘圙x뾮9g<:u_ t%A�@�@�w � � � � � � � � � � @ c;<yiڵk/_>r-)u ӄ uU#GL) Ԯ][_~v´&{J,֭[k̙@�@�@�@�@�@�@�@�@�@�@ ÆIIʕbΞ=)S[n.@�@�@�R' @�@�@�@�@�@�@�@�@�@�@� ?i܋uXnʗ/qUO03ԨQ#tSlOh̘1jѢ ]wTjZlyCeqrL<4g}V}{=o^EU>}C)w1OJWVX]2u]jРAsoUpp֯_[HX*UtEFFrʚ8qb9q*UJ}ĉW&L޽{kĈSNcx� � � � � @JXڴi4~oڴ2e3" � � � �D~Ç?WVٳgɓҥō\,(lB�@�@�R@6� � � � � � � � � � � ?Ԭ^k hӑ#G`7P} X۱cBCCe*V&M7߼Ѣ8?iӪC7o6nB^y*TH<V\ǙyZpʖ-ϟ~ZYؕ[y?C5kԽ+.KO>rȡ{͛7o FP͵we8p@իWwm,XL4[tr̙Юkҥ)j'+ � � � � �}(kΝ;5~xT"""dV^-[gB�@�@�@�@vzuYwVc}R^#� � �G@^R@�@�@�@�@�@�@�@�@�@�@'FYJ{_pA6lP X_ :t;t.('$N 3@޽{'H z)㏄% [o{j V5g),,$^ *PTpalҕl*Uc`eߟiӦ²:vVZiذa.ʂN>@5nXʕsemօpY=3:u κSLQN/1!� � � � � ,iӦV6S+V&MV[lq |T@�@�@�@ Kw-'}QL[3fmy.}^"� � �L@T\@�@�@�@�@�@�@�@�@�@�@֯'Gbl? **_ōY@Uݣ16`NAAA V֭[x.,) + dɒEzҚ5kd(QB< *䂧vqotgb\ٳU^DFFO>K۷\x �)k֬˖@;Μ99s渠̙3+O<1X@�@�@�@�@�Wg}V ,p{rȡlٲy@�@�@�@�_o%Owu9u]1 ~  � � @ P+U4@�@�@�@�@�@�@�@�@�@�-sʗOSb֭[4ih̘1j֬|AM4)m۶~:t萦M& Zre~[x@-[_|clwܡk̙.,B~ijJ˗/wkwQ]t7|g,ec=Ms?v?w /wD2dڶmnݺx$kW`$~+P^=M0O>[[{5{k&TM,P»4-^X64hР8:׉H >裪UV#Ν\rzn-F@�@�@�@�@�@ 믫sjӦ]}߾}Qz_{5rvzVoڴy<x0+^ݯ{N6<f��@�IDATT]vok,\ݳ}֎3gx#w…zL2c{a}}^YcXG�@�@�@�@F;H|")s$s=i[9sse � � J?G�@�@�@�@�@�@�@�@�@�@�U? <QQӸq5kO?U<yt= +;覛nrA?n>쥛윧zJ3fԊ+ԳgOpz px]wiȑZ6ۮ];թS'7� 0~խ[mϔ)T~ .p)Qn/С,T^KnCozB,رccծ][  x ɽ]Q'dyuAi;wɓ݀[Vɒ%݃GI.]Z5jԸbyk֬qm`߇KO0,8lr{ի۷_zl�N;Y[9/Y"� � � � � aaGov^pb~KٲetRW;SۼMvO}n&M(88X?ѿ/ﮫ^Tl2w/ʎ)Rfn*\ئFɓ'էOeY}lr,wԩS 6}++:@�@�@�@�n@`&yHK?.Opł>} իs5]_R!� � �[@z@�@�@�@�@�@�@�@�@�@�@  Xm۶-(_{55h?^dTBwRb;ׯׇ~n@�Wv۾ eaV6 $h۾+5leZʕ+e'ڱd?pѢEkn̙3{Q;=+tҹ-[T:u2m0޽{ uLܹ]P|H6,|wzذa*T@~>KWaw&>}csr4jԨˊ ׌3\{;.X"� � � � � =Y}qB֭+ts³Ν;5k*k֬{Av^Gƌ'v옫^T.]dd׮V6yF>tg!ZvOn}gR4iad̘QCuWW-% � � � �osgyJoڶm+K3\1x� � �^R{O@�@�@�@�@�@�@�@�@�@�@�dE՘6m"""{ZjVL6ᥓ 6ٺM{q/R.\Pǎ�6\(QBǏw(P-;tʱclٲ[nڱc/^ sKٳ:{;̐!; Y@ 8aA:u=裮~彞lۃb o,Yn;C{@* cOZ\`}Fkʒ%+񺄅Gv\ZЂ z] � � � � �5Myʟ?~w_w-[|ce*V=݋{LvZu/B,BOe_|+{C.e%/U\YӧOwa}u_˽YA�@�@�@�@ {KH'b4i}T֭]l~ٗk � � @ P+@�@�@�@�@�@�@�@�@�@�HVˤsX7 ѳ ټysq d=(]tn)$$=xj*yg֭[5`�w7,t�,>c|Tvm9rDm0<vX˗O}J,γC{gYV?ۗ1cƨ@1j+.`gYYn-Z"E衇} Be˖uEZ(>YЛ w#q#� � � � � ኈ^v?f͚^}(;&(W}Dx…ЬYo5n8>w½?]v<;w;TVtw+X6#� � � � pUW0A+y<СC.uo`ݺus\̾1x� � �NRN@�@�@�@�@�@�@�@�@�@�@�dXDj f5"""܆Q`A:o޼1_@OȜ9N8Ⴕou "TJU^]~d!C.$Z1Zji͚5޽OϞ=?gʕ+/ӧu>M4I1wx>o߾.�xn�QްـYNYdѐ!Cdq}7-4SN7Z4#� � � � � ,< О={+۽܇2>O{3F_6l믿 2Zjc]?pM8Q.v轲X/F@�@�@�@�<VIsI-[^N3gNuʘ1ڴiu][_(0V@�@�@�.@V i � � � � � � � � � � Ǐ(%կvcc*{3թS-={ֽTT:xAFxM@2t=?‘Ν낺Zn}r,ʓ'+}.hڴi*Qn&M<YQX k׮mңG>|Xgώ'`^x iXZ[KhK֛ocǎ]s!\ޥXT)= ,<y2OQ1ʈ#4}t-]TgΜQf͢e@�@�@�@�@�HfWŋǨ݋ʔ)^ԅ dT:]}mժ)QFرz0`>զ}ڵ֮]ڴh"9r$}7rjg? � � � @8zTPwaCco~X={$]{_vK@�@�@ % ]چ� � � � � � � � � � �cy2<Y1+hf˖M:5eʔs7߬gym+P[Κ5K� *{nͻ{qۼ^z)k֬ԢE }zԽ{wjd[M۷owKcAZٳgw@6y/ӤU߂l5i$7moӦ-Tn]كO<C$+VLիWwz /nbҥ p,X׫y.h`zGz꫶`{‹/MЮUjŊ]ڻw>39/,Lkƍn}֭ni�P >\VѾgQ&@�@�@�@�@�U zQ\37M6iРAʙ3fwO?TcǎՆ z/Z\^gM5p@wߩlٲW֭[/e\rf͚2rʾڽ.@�@�@�@� M'O8W޾ޗ=n= � � �G iL � � � � � � � � � � �$ȑXIżfF\Pչs߫K.kjɺ ¥lJ 6L/,(K,<x'~mkٲeܹ\H"7n,G.l+<<\%Kt>C1+yeW~{TuͷϟG{@, 粠0 ޲$ haZVgkopk?裮Nld:9o2eUwO>qo&f~$pI}z݀۷F?s~p lj ik6g֫BlLgЎJj}Z:}+vMVGQ 4ŵ00&@�@�@�@�@�Q GF*\^yOոqc͘1C{ l6[??~<M5<%4~x6m4|qɐ!5݋:p֭Bw{Kw=y]v驧Ҕ)SjrAZF̙3մiSw`2dwfu,@�@�@�@�^W^/<?Q]q1b3PB>e+~t؉� � _ xT<…<MHJl\@�@�@�@�@�@�@�@�@�@�H#<4ȝ;. Z~ *VX=lpPwpcm۶ͅU/^-84'NpVA  6Zϟ? .h޽VSN%J(k֬Jj͗/&L@QL|``(gaX gAl XZHH;TRo<OcYţHNA�@�@�@�@�@ ZֽlܸQ'OT %Kc`^ӵ牫K;ٽ=7ײg)Q܀Scuʢ.  � � � @gE ɓ':Eʕ]8/~_Ks � ��ZԊg"� � � � � � � � � � �S ϺX W`A-\P 6 4j}WW=Cƌf j׮B@�@�@�@�@�Cբ* � � � �<X~7\ 6mmݦ=)\7 � � ��ZTD�@�@�@�@�@�@�@�@�@�@�@Ξmʕyڵk݆:t(N^99ryitA/x~6@DDVZPWr/ɨQb ͙3ǽ P-d!j3g,YR*UP@�@�@�@�@�b8~|&O.yބ j̄� � � � Οvr>JG^7qDe̘7.}. � � "=Sj � � � � � � � � � � �I+nT~Tk9R< ]&Pf͚˶ܹSŊӏ?ke'6nΝE),,̧k{'[o|=  � � � � @ȑ_zÇא!CHA�@�@�@�HO?-}~mK͛Tzϥ7f#� �X?.6LL(� � � � � � � � � � � 7HݻKOKuۯWbŊjԨF}r 9sB5g7@,Y\ڟ'j<zo߾뮻íj � � � � �$6w\@�@�@�@�:UIs5@�@�H<o&r& � � � � � � � � � � �/"OaZ/w3ZjB|{M SL;\PZ˳c9R%JyR<Spp'ͫAi޽L� � � � � � � � � � [J< MUT@�@�k � � � � � � � � � � xTkܲeKm޼Y^UwEգ>iӦZ`L2:z^}U.\X*TرcoJ� � � � � � � � � � ?gH;K%KJG� � � @ x� � � � � � � � � � � Ν')֭L2i \2@``5jB6lؠ}?V͚5qF=C.hwՉ'| @�@�@�@�@�@�@�@�@�@v&O2dR=@�@�@� P˯>*� � � � � � � � � � �@hTkdz:u?zU_" ϟ_?-[gjԩjР � � � � � � � � � � >T?^sXBڄ� � � KjһA]@�@�@�@�@�@�@�@�@�@�@�.)MVb͍7… x#4iҨC3fݫÇk*_5jɓ'~"� � � � � � � � � � WKHm&չ � � @j P+5@�@�@�@�@�@�@�@�@�@�H&#Gp)d@ l \xҎ;RxKiȑCӦM4w\eϞ]ݺuSPP}]Oq� � � � � � � � � � :wjזO  � � �>!@O T@�@�@�@�@�@�@�@�@�@�HμySG{5jP dɒ4�hBo߮x@).]hѢE~ � � � � � � � � � � :}Z0AJ6)5@�@�@�S� � � � � � � � � � � (gH[J{H%:%ϥKKB-Ljժ_R�W +ݻwkܸqn٨Q#+WN|2!� � � � � � � � � �J_fΔ&MM4@�@�@ J&x.� � � � � � � � � � �t *SF*\X)kVeZ]-t͒sOJHծ][˖-K r%{}f~7լYSWkƍ~>*� � � � � � � � � � …Ҏ[D4H/@�@�@�S@ԥl@�@�@�@�@�@�@�@�@�@�@  %խ+\pttoTǰ%~~z:u*~pVR>SݻW/fϞo]M4w}ϧZ� � � � � � � � � �4# 3.AkWm[/ng @�@�@� P+ � � � � � � � � � � [JsI=zBDjr͚5UV%(6 ̙Sז-[\V,YԥK-ZTÇׁR:C�@�@�@�@�@�@�@�@�@�RҼyҩSRҠAҹsRnR)4@�@�@Xל!� � � � � � � � � � �@҅ qW´Sʝ;cs} R|r;D @ZҌ3m6O]=ZAAAiɒ%K@�@�@�@�@�@�@�@�@�@�t{ti_ogVPG@�@�@�(@VJ|Wi � � � � � � � � � � #l'UweΟy$쉟@5Ԋg!PhQkڳg>cm߾] 4PŊGL6#� � � � � � � � � �ĉRh#GDOTʘQ:qjK}@�@�@�R@]MMͦ � � � � � � � � � � �I%Х.]W˛Wj<}l@ժUoſ�D Qz_ՅURESO*$$$3cl0!� � � � � � � � � �$Sܹ҅ 1ytԸ4rd}B�@�@�@ J*i� � � � � � � � � � �R%{)0PKJCKinjm߾]G(�UqiϞ=<xf̘n\ӦM p( t15jHWdd%{y� � � � � � � � � � 3g޿ۮ<pԮtxbԀ2@�@�@�[ǎa � � � � � � � � � � @)#/~yA҃^-7.PJWHppF \E w0`nB=iy:uRb/СC`a\Ν[oݻ+(0!� � � � � � � � � �$IRN m"&jU(@�@�@�򿬗@�@�@�@�@�@�@�@�@�@�@�[kWɓ5ȟ?'*nӦf͚µzFR…գG/QeDFFjъpɓղeK<y2V@�@�@�@�@�@�@�@�@�@�ViyzJ.^ntRڴڵR V@�@�@�K@Ē\@�@�@�@�@�@�@�@�@�@�@�(dwYKxJ*i _0%"p ŋȑ#g} QݺuUre}'>}BCCJaɒ%Fmg@�@�@�@�@�@�@�@�@�@ ~!f%X~mKÆIG: � � �I#@V8s@�@�@�@�@�@�@�@�@�@�@ U T.s sfSYKx N)Ȕ)|AZJ˗/W[sҦMkƍux� � � � � � � � � � p|#OΘK'KiUs?@�@�@�HJRk!� � � � � � � � � � �XK)0$OS" XVHHΞ=Wh]f͚ϵl2… lZW5\e@�@�@�@�@�@�@�@�@�@ ^gH3fHQS@Tn4h?ZQ;YA�@�@�@ Jt.� � � � � � � � � � �FJI+zv??#i/I.]8'T~}͝;7؁� � � � � � � � � � psHgsu̐AzMirLk/#@�@�@�HL>L̫R6 � � � � � � � � � � @8w>SN)22g\h׮yڽ;@ӧ<!j-[6ΝsL+xh`ɒ%)S&]VUTI)8?taoW*… P6m4n8w}W:<Q2-=eu :{} 8[ۼt&M͖iӦuymiO[F_mL � � � � � � � � � wn ֭̄Ob~ޥ>޾-mΜ9df[7麨:ubż{Y"� � � j@-@�@�@�@�@�@�@�@�@�@�@�믿~zر#Ƽw^uX4wkt,.npٳoV…=jSѢEݲD*Wfz.ej͚5c%g$Ǐ_m�3z ae8qͶn,/;wy̙)\xV_'[jZ3ftᅶ;` as7tbof[L`~27 � � � � � � � � @|_Ço><xPGl>zh6 ϲ>I/ ZVL9wZOV'٫۹3gNʕ+jΓ'/[Zd&@�@�@�Z@z � � � � � � � � � �  :tHK,ѪU\@4C6Y]\R%kaΝ;jiA,xqfլE r={VΝs;v=`n*44T;wXvrZHlUX5jPݺu]&Z+Tk&Z O^w>ɾiҤ-ZرcN@e .dAQC٠ ) 8elݻu 9000j]O.l#s֖fkc\E-<gxxxһnۣ][ڀٱq a>#G7۠ow6o[7d#O-@�@�@�@�@�@�@�@�@�Kٳ'[G-my'h. *_/g쬏bw#Z:oK/""!%tiuxһbE>-]G}wOBBBQNvM *P-d ,~EQPPk=% � � � !y-2! @�@�@�@�@�@�@�@�@�@�@�#p͙3G .tAV~Q!Vd=T=n[坃m6W? jР4if͚ϓnxѣG륗^rdX?ꔲln @^[@Ͷf γA}&AV6( jժڔ={vdMx׽Kdc1{8qℛ-֣/!gt}-pXm콵Clfw%_|[Zp � � � � pII{%q> � � � ? X;vhӦM.Pj֭λv B m`)>>y<퉻_z}zĢٶݻw+,,d-d[oK*2eʸӧA�@�@�R9ϳS<+5l#P+A)@�@�@�@�@�@�@�@�@�@�W 6mf̘5k~nS YHyɒ%.�l.iӦj߾UO:Y Zƍw^z^S,٠6(}xFYٻn'XP lP Gt-D曕;w9G.x{>K8y/e[no-m ӧOhl\�$ t�%׋)>h/@�@�@�@�@ YJV~.� � � �$s\f֭[k:{c,YJ(f *Z_ECPVrZPܹSfo(%)]t*^'侜ʗ/ *- bB�@�@�R�Z Ԋg"� � � � � � � � � � �~/p M4I}.]lmVZۀ d9s͛z<j׮2dݵ4ѣ YfW&U̙3ھ}{l6["y@7hEK,2!p-o`6ظt *.[ln�fζ @�@�@�@�R�Z � � � ٯ]6{;Z8:YSٲeUti)SM2ISN)$$D6m҆ d!f6رCʚ5*W*UzU뗴j � � @ coǙ � � � � � � � � � � Co ӲNS-ZPڴi]U܂MB~'_~*TPlm,ӻwo=)]4컱e7o޼9jm6bB9TX1PKy* {8KL.Bޢ�goiO)wnRJdɒ$l˫@�@�@�@�-@V~i � � �.Ҵd/hݮ?V lJ* Zvݼj*^pA7|j׮뻹jժ ZS@�@�@ jߎ@q& � � � � � � � � � � w ,Ј#4gvmz'u=)kL<*~?^ Zڵ  *ģ48Cɓ'Ge <y 8amܸͶ* Գ0 [o-/B,H+gΜ ^' D )l ھ} ز�[8 6ϟ_~wѻ,_, @�@�@�@�R�Z)罤% � � � :׼y4|Y#G([lUիիWW9R'ߵ|r-]zFϒ% jڴ7o+a2 � �v P+v� � � � � � � � � � �ի]pO?&M;\4"+ &hԨQZvz街_~YAAA x(jذa.DeR65kn:@! βJ.Bʔ)#\D eʔ)B ؿ;vЦM.=ꎴ- \UTqߡiF+U@�@�@�@�坢 � � � ?ϟ… 5sL͚5K[lQ֬YՠA5n4i@BBB\`l[ p}۴i-[*s)4@�@�R�Zg Ԋg"� � � � � � � � � � �>/`0@_|U#FaÆ>_浪 }7<xݫ~OQBgV֭_)wIEu@`׮]Z|V\~M:vҥK²ʗ//˕+E$x;D طo֯_5[07 bZիWWZTT)[)) � � � �)W@2@�@�@�H9;w&O3fѣ>[ւԩ`ZrEkΜ9>˖-Sƌgsκ;%K+N@�@�@ Ԋ<ZL@�@�@�@�@�@�@�@�@�@�@A{̅C5J0S~!C(o޼?~{>kɓ=Hn 0}F-4kɒ%_믿jJ>(‚}*Uʕ+,, Nڴi [zVZ8ur̩5jvڪ_ ʜ9s]@�@�@�@�@ AJF A�@�@�@�E`Ŋ7n :rի>o^EMkR Xh Z:u~GK΅j=j֬ҤI � � bԊ[KV8@�@�@�@�@�@�@�@�@�@�I xG4i$K#GT֬Y}V={O>={ _~YiӦj^w}/.{P矿s9!y.\+Wj޼yZp/_ӧO˺u P JZrUR@DD6lྫ]t{mtTZU 6TwY � � � �!@o@�@�@� X>L}֭[J*gϞҥ (=% ;vLSL_|E)((H??'OXa# � � j_@q& � � � ��@�IDAT� � � � � � � s;wTu}j֬*4vXW<#+N8QٳgjY=zÚ3gNǰ#ݫ3g@7 :qʖ-&MA.'_|_Qj�q �˖-ŋ`ozUVj۶J.@�@�@�@�@� P+l)@�@�@�7'|Hw}zGTb)cرc}=nݺi*SL1 � � �I-@V Ԋg"� � � � � � � � � � �>%믿]v*TM Ufʕԩn&DUHkBT}{= <XGQ4i6l7|ӧ+88X T˖-]r-_Ij�8y,YsK6oެ%KnլYS.@�@�@�@�@Ժv+D�@�@�@�C>|>S(P@WϞ=]_ĸe>p}z׵zju]6lZ@@�@� 6l8@�@�@�@�@�@�@�@�@�@�˗y.cҥi%;SzuZJ2dPÆ k׮(5y_? Opn@rʩlٲԹsg]V{qEXaZXG?f֭ͪ[k Ѷm㏻�zhѢz駵n:l F�@�@�@�@�@�@�@�@�"C[oO?cj˖-۷/aZWc [n4g޽[˗W>}t+@�@�@�M@d � � � � � � � � � � @X@G6mԨQ#M2E2eJ)EyՂ ={vlRGK{™~gJtxx&Nf͚Xb+Wgu진[x.P<xP/ תTU>@N� � � � � � � � � �~$0o<-[V|MmذAݻwWڴiT7oe˖Uti?B@�@�@�T'@V{i0 � � � � � � � � � �$ رJ,oF)y>і9sjΜ9.{UddOz*ƍu=h tc+\UVuAZJS…J�&;wn_ruڵK;wȑ#UP!=ڳg5"� � � � � � � � �Nܹsd˖-լY3m޼Y<AZ|>\}?OW^ԩ= � � �.@ֵ[q$ � � � � � � � � � � sq!M2E3f ϟ_~~G{~٬&Mhɒ%:_*}I >iM4I yTLkE�D(Xh֭[o߿?N � � � � � � � � @ Xfj}fϞ>H9rH P)>}z=Zr תQ6nxp8 � � @R DzA�@�@�@�@�@�@�@�@�@�@�H8{f͚a{' Ӓ.]?X۷ow.]vUj5C oOɓe'va[lQRdNuԉ=viĈʖ-^P4i+(SLzwSUV/Ŋӎ;osԸqbP\TpajJvt իWO&LP޽]-{ĉzꩧt-_V۶mm9}t=3fZh8pf͚~A%JpΉY {\iӦhLiөS4uT͜9wWE>>lڴ)Agg`uՠA|wtڴiZz;[n. Iă/_.wgŊ:tK.H � � � �lFrwMu � � � @r ۷O7vf̘p&g}v XyiܹeorNw 믮n+WNpm@�@�H)c J &B$B� � � � � � � � � � � v i=dݠAlRSLqQ66lذ}'}Ye͚Uj,YREٳ}rmܸQv{?w!c˖-S^�vݻ+cƌn*TH:tpp_~CPPvYx/~'믿ֵ[hQuم|q,p_~XϹs>}رc>^|EDǂBCC9,qk.Y8}?")""B֭sAI&ٳl;_l� sN?^!!!M <tZXׅ \;Svm7stX(VZz~W.̓ @�@�@�@�@�@�@�@�Eּys̙S-"L&EOwY|ιֲ8i}HK0-kl\WӦM{Uq�{GDwEQ+¢QV\YAA( H*(H""E$Ld|\fsܒgsϫ6mڤ[ڴ>ԇ� � �d$2٢ � � � � � � � � � � _^fҳ>O]Sջwo]uU@NyU߾}]hѣGYtչsgxJ++W۵lٲ XpM:tp![bŊGOwNǏk<x{1fU\Y?^z%-ZH ֱc]:ur 69ٹ 4/k<p yl޺|FDD~:x rk0{yml-PO>9mۨQ#w$ sͲP:I4vKիW{oՀ޽ի;_잻뮻\vvޭ[nŵ't{L:r[o9i=V^jժ.sȴz@�@�@�@�@�@�@�@�@�8qBӦMSB-n??jTtY6mo19}`9rЧ~5k~gΜ v� � � y33fS@�@�@�@�@�@�@�@�@�@�@ ;V˗W6m:"##g6bLd߃c0^]K..i֭)jR,Y]{^eSEџ1yթSGW_}u6})R{y^Rw[%uzeרQӧ{]׌3t+c0/ZhMoх^.JV| -' e󮻴7-JkӤBۺvz@)Y=O7n/mo׊l-Y=ʧpviٲe4ځ� � � � � � � � �믿_|9/^<ˋ$ԟ.)~Zsu6#>~ǖ+W.5J֯zРAiQ%u � � �)o"(6C�@�@�@�@�@�@�@�@�@�@�H\`ٺk-[7L/R6_x *Tȕd/w'ʝ;֭~[۷5ŷ܂?lZt{xƍ.@nV̙3P>ȽWk׮Շ~W0tM6l >܅Xk?ƍFC fY͛7U۷oX_%-Ɵ??mֻWb̜9SEUÆ ]9)96 t�jժiȑYڽ7zhYV޽]+Wĉ?~<y?gϞ֭ {n68de 0@'OT>}\}!Ι39o]{?6 gFrǏ뫯r<a„bu|:p.uYm۶MNIi:uʵѢE*Tp饗jȐ!.po֍7Sv6=C.;[uڴi5j_ݝ/[ɮŋg?N~&Mf -ODDZlg׮]/?c<g/J*5d֞}rl�.,/6pMsU9ydիW/檐n}k֬q!OC@�@�@�@�@�@�@�@�@ QW_}U7pCtD7ʤ 'ͫ>} +r KoiY?AO^:0$]n+ZvmwN[jĉzw]?g|A-[6z2o<Wζmtei߾}󳾆njU`~/_^<KZD&@�@�@�ȞM � � � � � � � � � � � $w$\XЋYxl7z]h;.-Z/wY%KөS'BHo7tb [c0ck,$>pa`~̍, g+7p{bR:uQ Nߖ-[܋Vy p{?c>},Y⮷P 3f ²" ųin�,@ѣԣGwY]wUV2lիGyAWI_ܩF6m yA ,LNhҤ ޳ewv}d`{イ.hld6,<3%r9cܹ9{`0 _@!7n },B m @M7|S#FpamF=wS;9`!ejhׁbOi^Ybǂ,@&{Fڵcn1]cvN,4^5taƮG[afre$'Pkǎn2eDo_p/>2~v9dB�@�@�@�@�@�@�@�@�[?w}OXZ)>ȉwOaBe$֟.]wUz5mOaBmIy9r?nmذA[vʱ~5}d<jZ>Sv;ٳg>?2f?cZ9i5Y_Fj0 � � @hV � � � � � � � � � � �~ 8piTP}K͚5S^d':c컅t![N[n]nA9۷Nً_|.(f.pʵۭL ӲVi&8qBqR-˟,$~gӐ-Z]vm>l 0@K5שS'mbŋ]Ճ>+]F mӚ:ujo[бٺ&++PvYmY"EtRw+.<ɮ,kqA\˗/w س (݆1 +{ 4HVgZ ǻꪫԧOj$snJ(ׯWegs]NV'3 вe˖ɂ+& e1' ‚�cNb8o<H3gN>/R;y{\1̵`9 dΝ)S/l tbmJXUݺuv+Vt r }X�c', lʕ@) p7X:ܳg,O<6~{c yu @�@�@�@�@�@�@�@�HoիW+22RM4IӦ$9n)L%7q*P &x_<BѬ߭ׯwi&vZ}Dz>|ĈOd߿_wcǎС_? 2cFo_v1!� � �@h@�@�@�@�@�@�@�@�@�@�@�Wɓn .]nԨQ:{,pɛ=J*nQٲeg۶m݋^x}رx[艅[]qn,XC^]tq/^7hԯ}۴i^<y:wqƹ IFw[Hlj/*THvx≀顇:/f.)`$~IgΜQѢEsɮrE0w\YPɮ={>ԧ^xY˗7B@! o￯FiժU.t˻KsȂl ճ{֛>I&$oP{&3ȂYbSc{4x`7*yF]g+W.Nvn,΋Z͛Arˊo{M1CU6BVٴ}vqzE/]{ :Z75iSBuz0? sYs}(}… CI@�@�@�@�@�@�@�@� z?SۧЎӟ2bmo`}-5f9rayYcC?~e)SF]t]_Gha[/vl2z;n ?fiUzqUI5 � � �@�@�@�@�@�@�@�@�@�@�@�P^6BƟY `jcSXXXmZe 1ڴiSqO_֭[qFRgyF} 7ܐfm,dnȑ#eU+VuX^S>}ԭ[8q ]K5\JytI5vX[d}mfuٽռy4b]wunzgJk.8p@1)7mJ,ЩG}ԅ[yI$OjV4`9rD)! yۿy!x^]ާ?6͈; bE�@�@�@�@�@�@�@�@�J.~XaKi!QџnShOq70>8ӖYn[]HXy},੘lܸ̙_ޭKbnr{ǕTX;szqTI � � �IDɜFF�@�@�@�@�@�@�@�@�@�@�yTRڼys@e:tHri۶mqDnEھ\rGj' z-Z0-+逸Rǎc-_<UhE6 =zbŊnef/O<م{fڴi-*dA&^;vLÆ Ӕ)StwD7yϞ=ղeK7NNt9 )?Mɗ3g?v {}7.gUduf:{n͘1 2ѽ{wʕ+5Ezo +:u+nʕ:yEǻ]5r Պ9`.6ժU+n>{ @�@�@�@�@�@�@�@�Ho/\yqһ-V?Rۧ񧌘sǟɟ$VG/<oʂ,<kΝھ}{mb }w1 K+2P6 � � @2J"� � � � � � � � � � �"иqc-\0͹K]y<"##^x;9_6-X nݴiXSĉ?/ڽM6_ky ~X@XFQTam^F-ʦ׌W~<cn^=g/?~\Z[EWZUO<?ЫW/dھ}{,X0ɽ-k̘1*]y湲*U??]ӻE/Lڽ{nVYF̛?{~S\R2eʸA89"g %l& /…inZEu=z4+#3V?#1'6 /Yؽ31]Rumfe1' s+_⊘C]סCu9Fc@�@�@�@�@�@�@�@�@ k Ν[v`Ѵ[j$VF|hY7abm2ԩ6Od Y>쳮׏2~f֭v5kWHzzʒvkԨ=@�@�@ XjKr@�@�@�@�@�@�@�@�@�@�@� \{otC ĉeaT~uUM{u[nu? - -%poŋ "[}ZY75e*<<<zY X͛]I K2zѣGYR3nu֝WySs-]v^91϶^9?Sݣ۵hP\/f͚kmƍ)*h:tȕcǎ:3inŜJ,B|lY>}br?}~Vi}gnpoQWv㡇rAhB [o\+V ƪ7qxwnRe!NjR…*ʭOiXm{wjܸq<y~X7i=k>|^zm3m49Ǝ)S2VZSNiҤIo𞡱*Jw<w{ ΙgM_ gWivi߿fY9gӗ_~ٳgIcX| gݰ}KtYoꫯvbĈ*E�@�@�@�@�@�@�@�@�Х 4(A[ٷٟnShXo>1m;L-}*_g+{9uIwq^|EW u <Z٧zJEO>-rķl" Zt;K.IÝ[y/b ʤ @�@�@� ^.b(@�@�@�@�@�@�@�@�@�@�@ -*Uf+BaQw޼yuUWi.櫯rAW֭SX(lRs̉wHҹsgꫯ ˂arʹ. _9w{yQ~dR]h#<%K 3gθ@{; nAfo{)<eeY5jЛo5j׮]+ ?^tu .믿 챠 ; 4p[O^d0v,h]%TrXg[k 6.d͂zr{W? S"?g. 2eK/MaimȐ!n0 E_t3G.LB,X|Э l@.,Av\v_^}I>{B' ڴi-͛7w[f?5ǵi.0i֬Yۮ9sz%i'/p685jVX႓~7WE]hyʤY]&LІ ܀ ,ЕW^' ܲg=[}v/V^ݕrJ,5c |{]v.Ўͦe˖7�[?hb'OtP 1e #*Σ2;׶̙3gѷ~0{㏻+رm`Vxqn_ #A,]v=ŎǟɞUv<9f]/v/cBXh � � � �%`9kMP/ � � � y,Lhxx.~ A>ewgShX+X@i&M㶾hea6%0}$k}Z@뻘?~'g׬ϞdYpjAj>-lm\U;i5իY?ȄM3޽?UR � �d1kY{O>Yd*`w@�@�@�@�@�@�@�@�@�@�@�t(ed{a9Pu3p/5_r% ڿ,^Xb `ҥK`X+^U ݻw�JL",X~瀝=klkFyIzdn1zhR[]v2K-Px 62P#Gd Q@KΊ'Np5 ~H8+ןgP2 ?0'|҅Eyelr-oC1-OΏcegX\r'SNiΝo~ x?\`XJ>SO6 tȎ @�@�@�@�/pUw{ � � � � GcǎP>IPZ_Mg\1&Ֆ$}޽*U*MϞ= 6Sn]˗/+TTП1͛7u֮3Ⱥ( @�@�^|RY!%GNVJ@�@�@�@�@�@�@�@�@�@�{YJ*ѣ~hQ`K//LЂ jܹnv۶me/w^څ*^f)ScǎՌLW $п5J~ QF;δ> L}IVۯ_?AO(P[P{f긒SNerڒmo{^kwyG+WNm� � � � @ P+K~@�@�@�HZ֧~aÆ[niTs`LL$O <Hrիɓ'+o޼(2@�@�@�:9ޒ @�@�@�@�@�@�@�@�@�@�@�BJx<x jӦ_A3!u�I4C^z[ɓ'\[oiΜ9Zxq2 ykgРAjb)Q. vzTN|;lٲSTB\8YRGܠA6>XzDDDǏ3ԞA9$ L^|>LW\qf̘M! � � � � � � � � @iU\q^`n]u@ bBdyl~+׿^zr̙b@�@�@ #Ӡ@�@�@�@�@�@�@�@�@�@�@�@=4yd-ZHj R-YدZ;w֫<Sa̚5˅<-]T7N{=w} L+j׮~)`i&;1bJ.ݻ;%\:((4 ?P-bӧOh6V={4vX9Rk֬M7ݤGy$gr5@�@�@�@�W]%/�n>� � � �d  Ӻ뮻dC`<X]t@IIڶmn-3ǂ� � �!*wT4oԢE62DEV� � � � � � � � � � �+pIe͝;WUVwWC`m:?#?x4kL̙3l/, z&(T}<t9/_&M믿^_|qsnxS9ܽ3 X֔)S4qD͞=[*URϞ=1eʔɺ09 � � � �A P+� � � �$ p!=s2dZl^{M_~y[ lݺU?ƌ4He˖ l%� � �$ @V0~,&P$6A�@�@�@�@�@�@�@�@�@�@�B]B[ڵkm۶iԩjذa79C/Нwީ.]O?UXXXhwrߪUVZh,\+.,K 4~x7_^^z:uƍgk-Ll@XfO=K˕+oYrgB�@�@�@�@� \_JG�@�@�@�SO<fΜ>SjԨQb l޼YoF:u\sMcG@�@�@ %jD-j)ߕ=@�@�@�@�@�@�@�@�@�@�@�BEPBo\V˿Ҷ؎H=馛ԻwLe^^Ht۷OŋOp=+'PF n:l:l%JCƍW0[#@OԣGYxVz4zhw[85p@´B@�@�@�@�@�@�@�@�@ݺu5c ͝;Wv%O8QgΜ V̙nAիW1cƸO´؅"� � @{72� � � � � � � � � � � Ν;zJo7|SG'vR^4{l 2j%c yԲeK͟?߅k=m۪|w�,l̙kpΝ*S;'͚5Z) R+`hY�e-^X ,PDD+ZZRvtE*G�@�@�@�@� gVһ聆�vC�@�@�@�o@%KG޽T:((k޽[FG}Y[#<g �@�@�BV`^?y{uS-Zl3CajiQ � � � � � � � � � � @&NOyհaԦME>|RJiȑ+ȑG9rDK.=ׯﮣ^{u,?w\-\Ϳ˧ QFB k%#y{ b 7/[L/+R7:綾^ٳ? @�@�@�@�@ J{sjD�@�@�@�صk B>6m[oU7|ʔ)ϢԤI4n8͚5KEUnԻwoU^=p � � jjr;D�@�@�@�@�@�@�@�@�@�@�BZ`߯ &[nѿoU\9ۜ^ 'xB-?ɓ^IzG]~=znX袋c=k9?VXx욵3;gNR%\pe]>-ħjժ KRL 22 b?w邲jժ7n&MFʖ-[&Sp@�@�@�@�jeQ � � � @Zs՘1c4qD:tɺdd6eM<Ysq}:v쨮]Cʕ+W@�@�@ J)!P+v� � � � � � � � � � �dʅEm޼Y?3ϨL2nƍϺ[h7|S 4v!]~Ϟ=݀6lPPyjС޽{H?5ɓZzV\UVyڵ.d+wܪ^j׮:uȂ,/vd5+~7ٳoݺu觟~uawT~}7[}ϟ?RŲ@�@�@�@�BD@94@�@�@�HBFΚ5K&MrJSJԮ];7[ $Q 3]/̙35c _6_|j߾nYAF?˴@�@�-@V/Z)cO@�@�@�@�@�@�@�@�@�@�@ ={VÇ׀d/wU>֭a! 7o( ^{M:u d]ժUS߾}brQ3m4u![ViSdaqf7w ɂV¶, J*\,VXVa8Ce7[Ф+6.8X/Bo٧Y  � � � �d\2 � � � uҥK_yʞ*VK[7TӦMUpᬋIرcZ|-Zs0'Nu* 2s � � J&P+v� � � � � � � � � � �d8 5j Z~S_} ٿƎ?P?կ_?-[ w.?zd_۷e˖QF(`AB6lp[i&m۶MOv5ۀu%=.H9s b ) )g׵7oݺU6[֞={\%ٳgw״Y7׬Yj%� � � � �&@Vڃ� � � �/!M*})_R;'-_cY?ZjI&uaaaWi*Y?˗WuWUV_6@�@�@�� rHRnǞ � � � � � � � � � � @Oav��@�IDAT믿Vܹu7oUsʕa-fÏ93fh8n&{jܸqMC•֭J*iڴiհaCEF#`%%`D<yf7yl[�Qҥ6pAr\T)\GH{l޹svkgΜq� *=fq6 . � � � � @p /#� � � �umԒ%Q!ZaTԮԩԾTg-\X˖-ӪU\<yN:lk׮ 净C]~֮]B,8ԡC#Ggu7mTW^y.b?Je@�@�@ J9"P+v� � � � � � � � � � �d  '3f>yԦMԶm[€,,ly‚7oݻ0|eIΟ?߅M0Af7H HTlFwv[۷o`}_݀^3ʔ){eK,yzN<5Mz}O ʲSNEk5t, β7԰uvM2!� � � � �&@ � � � n93*DXKUDhu(19sFk֬q}-\f r:zլYSիWwsj|uTQٲe-[ gm'}˖-ڸq~giAZַܹsʕ+jԨGxfgL � � @f P+g@۱' � � � � � � � � � � ,(ǂL¨,rʾuWiӦZgn[n;-\P-Ү]䅂uY:tPbB={ԬY0!Wȑ#ڹs <O-ț-ɾ8q"֮kgݽjEH"n&/aH8~8Ko@n޷o_egCbKΜ9]fAl6[Pdl`B�@�@�@�@� P_)C�@�@�@�N,M&-X _ԬYTVN/*Փ9mݺU? ڰaCtӱc\t%RJX*T=[ؖs Ku[2j~Oo߾Ϳ ̲,/gYHZVvmթSw.ђHD˨@@�@�G@xP\DPl� � � � � � � � � � �d5 Yd.jٲe.^Uի^n-{q/c:xm&{zӦMZf7nܨӧO`盩y.aÆR'`A85kt[ d,-`!K P 7p)n�YR…/T{Pp=9[(=xF}99sF6(ѣGeÇo.y в J,0-fZMln @�@�@�@�@���D@�@�@�@�R)p|B,H˗m(kվ|}SY[HΝ;e˖ق,,,ﵑ0-VL7[Ȗ-ZmOc'ܹS_?l޽{~we62M֗[#l˳rg' � � @VʯRnǞ � � � � � � � � � � @8u֮]իWBw̗E˂Rn6rOn/[6[�}Z(Vnm{nݺnP/WٳgV;~xz.T+"""\= lf v=Y D%6` ez}Lس*}e>s>l=lW|= Ff ۧ L1?-̞#tp1>dod2/,ěo `B�@�@�@�@�[@>ԏ� � � �YUO3gFhM._?aJ�pۅC-/\j׮]߽e{q}` Z~vG1_|џ1:;Ӗ;wNo:jvo)6[mîOgYø+Qma^pXrʩPBqw7 � � @$'ZbS@�@�@�@�@�@�@�@�@�@�@�,f۶mѳ,o>}6^h|m-X >q{q O X+TBnoK)мysmذA[n%'ДP8ž=qgoH F3*fx}?rr_=v ) fyh$emc3+w  p ՊU֑@1 Ƅ� � � � �dt2 � � � ""iӢB,/ԬYTVNRjhoZ8p@Reٳ{Uҥ]?F/*fЕyX^8V|^ӧW*Wqp!Z_<y$e)¾,+l˭/" � � @`J#Z)cO@�@�@�@�@�@�@�@�@�@�@�={Tvmu`Gec WǥUΝ!C+}eꦛ󥯿2}C � � � � @Zԁ� � � �YU)%KN6l ڵ j^ ̯saÆ~%_Ts|Z@�@�@�$@V!|WD�@�@�@�@�@�@�@�@�@�@�@� PdI 6LÇה)S!s-0ht~^pRQ̝M � � � � � � � � �LAix[7T))<\4I9s$8Ϥ]FB hQTK|*(@�@�@�t P+O @�@�@�@�@�@�@�@�@�@�@�@ t=zw޾|#0!^]z챨@2IΜҸqRǎQ@�@�@�@�@�@�@�@�@ =""V%²v쐞|RڸQڴI8PjRʑ#=Z~u.]TC Vɒ%Ґ \HΝ J5� � � @ dM*G�@�@�@�@�@�@�@�@�@�@�@� !p!թSG_~ f@0yD;VڲEʟ?53gof̈5 ^]� � � � �UWIkKロn@�@�@�@ c =+-Y"M5o .,k'u$o/))=נA/^\gF~ o7@�@�@�BG`^y-B]%3B#i# � � � � � � � � � � �@5b}9rd7 [JCJd0-ˑC3UM-KGTF�@�@�@�@�@�@�@�@�HwnݤRpiҤ>fsH6 ;ڕ0-d <X7n+u, t옴f߅g.K � � �E@r&9@�@�@�@�@�@�@�@�@�@�@�@e˖zGhiP#U O?-U(KN,T?i\ZiͶ � � � � � � � � �] "BeBU+D;'/(JڴI8Pu#9c[?Ћ/J*%Kg.9ijo^7@�@�@�2�Z,r  � � � � � � � � � � �jժnөSҰfB 4V z30HΜ҄ RR۶ҶmaM+@�@�@�@�@�@�@�@�@�/`L%լ)U, 5bw4ԯ|}F_f*駟V…]V0kBŜ¤;#� � � #@�@�@�@�@�@�@�@�@�@�@�@ MrʥcjzӴn*C oT%Z6-M*.-n-) @�@�@�@�@�@�@�@�@ }ƏuJåI9sB>LU*R$}ۚQj_jF^u͛7[UX0ܹL � � �dl) � � � � � � � � � � � �i&0fq<y:wfR)0mԩxԤIz$xu+5k&,(͟/(@�@�@�@�_.W/R%驧b//S&j�K� � � �dM*-X ;?\Z8:VZرc>NA,H@+ɑC~ĉc  � � @ ;Z%KJI-Z_;2bjeijF@�@�@�@�@�@�@�@�@�@�@�j^Z^xaf gzO *֨|SJE�@�@�@�@�!0pԯ%Ϙ!m߶l� � � �s[$*@B6l ڵ j^*R$ԏ"cojݺ/lÃh;M&\ElҦMR o@�@�@� P+j܎=@�@�@�@�@�@�@�@�@�@�@�ǎS Txq͙3G9r&�d^>WZNZ5wd˖IW_-u&O@�@�@�@�@ ~M*_^L6x `vE�@�@�@�BYAįӥ*U:v/I|mԨQ#,YR_}U7gN9=a_R@�@�@� P+S+{"� � � � � � � � � � � @Vț7ƍ+WY8=d0-;KGK| N&> � � � �d:r夦M쉌d wJV; � � �YD "B4HjJ*Q"s!=qi4pԲ%aZ$Nξ+(2ΕΜ9oq ciE|A�@�@�@ $# G�@�@�@�@�@�@�@�@�@�@�@�4S}[ӰfB ~[:|Xzᅴ3jEzeo_iPhm@�@�@�@�@�ķA-P @�@�@�gJIK5kJ+K/5bw4ԯTZF8Ɨ}:wz@Ν."#cW#+߁ie}@�@�@�˄� � � � � � � � � � � �N;ԲetwvڪQF doBHyuǥ%CaiԔ~IiXҨjA�@�@�@�@�R,pM'{2R& g  � � � J3gJSJӧKKUH:ICH)w[R|VXOP;z4…ҥyYe˗OQ � � �A雂\#� � � � � � � � � � � @8}Zh P@,pbVxAiDif)_pQns-]*s6,A�@�@�@�@�BMk%:{6vr{Lz� � � �@DDTִi҂ҹsRfQ!ZUZzȑvK;Kɂ ҲeK<wVRE�@�@�%{%y{2ZmM � � � � � � � � � � � rҟ0a ٳgFh2mD I-[ߗ^|1ihno& � � � � @Ht5tƜ>-uw)@�@�@�@� ERR?j%JH#FH6R~i9ƵkjΜ9۷+P!|y ӲjR� � � @: T� � � � � � � � � � � @f([ƍɓ'^ldAo9/>$j' � � � � ;Kr߰*U:u_@�@�@�@ -Ə, T))<f}={kr!Z}^HZ:<xW6mKP5_@�@�@�2�Zlr, � � � � � � � � � � �@-ogԩSCE4 ,[&}|pRXXl{u(=?gx@�@�@�@�@ 'u"=7@�@�@�@ -""AV$ CUڱCzIi„:x_{mFzHٲeo mUxTj b@�@�@�U [oJP9 � � � � � � � � � � �dJ^ziZdjժ)͛G߂8{tgHMJwK9s&G�@�@�@�@�N`4S�֗\{@�@�@�@�@ =տjT …v[ER"ݻՠA믿VXXX AYx\虝 u@7Rߟ=@�@�@�/wT4oԢEL5Lñ � � � � � � � � � � � @ӦM|TvҊ+TXi-A )S K0 {#ihˤ矗^}5 "p � � � � aڶ e'L+Ü<� � � @8xP93*@kti~J�!Cp_yɓ'u+o޼7naZL~>\7tSiOBR_(B�@�@�@ ˄� � � � � � � � � � � �^ W\8q"##u7ӁٳғOJ7,5n 2A6[oIo!-_ C@�@�@�@�@�L+3tmQU wݕiC�@�@�@�t ZJvvꃶqi4pԲe0-kj>}aM2E NS}'sŊٳu; /XP:p P8 � � �"@VS) � � � � � � � � � � �YCotaʕzAs^࣏-[W^?[:u*UQ8 � � � � *9[SU;#� � � @8{VZH_YS\YzŨ0#{~jKOgz oȚ0aJ*-ZD{EH2͡! � � �L GJ @�@�@�@�@�@�@�@�@�@�@�@ :uhԨQݠ>h<[8zT0@ިNBUۊa$-̍ @�@�@�@�H@ddN<SNӊiұF昿Rٳ*Xʗ?zevޜ={vȑCaaas߹rRΜ9gܹ;"� � � @ <(͜)M*M./U"u$ "oL_a}\ڷolnnC paPi @�@�@�@ p,@�@�@�@�@�@�@�@�@�@�@�@ k \wuz7ԯ_?UP *8ڌ"[j=\FiqbEEUZ5}C � � � � | :|F#Gecǔ| y#xS֭wPRH1�dP@0dQL+5bfFuET@$ " *A %g_fmIt|G~^O?8]78]naE++e[p?Jh+P ,B o)⊀!� � � @ \W@kXiLVÆRqVMX/_oѭTHUVi…z3ދZq � � @ cg � � � � � � � � � � � csS~16zn*VKxҧOVmr N&N\� � � � �+pm߾=رܹSv:acw`Vb IY`({Q cS`*{'OΝۿ۱\r)gΜ~o·SN9ſ_(:+Tdio]Vl+fѣGOطGÇjǂEV8bbcȬ!Xd˔\X1/^ܿ~}ɒ%J(͎� � � � :9sh#-Y"Y֭ hi#<~:Ê׫WО1c$u>E_>vfhiW]%{>(ZF8@�@�@�mJO6 wr#s@�@�@�@�@�@�@�@�@�@�@�yK*n:o%E4Do_D҃Fɀbd.g7F6F0@�@�@�@�ȂӦMNضl٢[-| =o] 24kCﭘSH >YhmjroQZѮ?C/^fIYxիW~<hovi.IWi38af4@�@�@�魉hM Z\9VpMT'Y1o6mŴbA7nZj勼GӰm @�@�@�rr_)B�@�@�@�@�@�@�@�@�@�@�@ z,aԴiSi*QDe 7ǫfʟgd [nzڶȹz� � � � @VLi͚5Z~}h qF9'+u駇)]tERJYV@bΝ;r3X/Cbjŋ m޼Y{=6vo+Ulrɶ>[ 8 � � � k+W;V9Srudz+Uj=gszO{{w"usuԵn]@�@�@�NZQ0 @�@�@�@�@�@�@�@�@�@�@�%Z2Qԯ__:tД)StꩧfI3x]bT 7&Q?hK+K"=H41!� � � � ӪUeuիWZk׮m{hk/S/zdRpBZCdbǾo{lKIЛ6mŵ6+fږ/_SBm ug׬Vk d[Ŋye@�@�@�h8vL3'֘1Ғ%A֭!C6mbw|^z%}ᇲȑ#Gs(k Keb8 � � �D@Z@ @�@�@�@�@�@�@�@�@�@�@�89K9a5lP:uÕ3gΓ넳%K?5usK='oRπ#� � � � b _ 7;e˖VȊs9jժ/\tYg^wH Tʕ<mۦunW+f  *v)b^*UR*UTjUj,EʫĜ9� � � Y={hڱCԮ4pԸ3Ν;ízX7|sbq<J&M:uTRQ7BڡV}+ @�@�@ 9b@$:@�@�@�@�@�@�@�@�@�@�@�@dfϞ-ZszwOrG "Yrf̩O>D;vHٱ\{Q9#� � � � '`~m[j?9rCbFZbP… C@pYٶmʕ_}8{b\ wըQC(3_5E�@�@�Z$رqEfΔH ѲBZs 6袋.ƌ#+FM-ٚ{.nk^xAڸ1ƀ@�@�@�ҥӥM!9 ~2C\@�@�@�@�@�@�@�@�@�@�@�. ]>LW]uJ*>LyF_H|#͝C^_{0{LzA顇rbs@�@�@�@�AO? h…Zl;yAիWM7${RJo5Y@Do{ŵ,Y[#{jժڵkuEK@�@�@ hΜZV)-*n- "i#+{oׯj)RD[bZg;^Z+VPV"eD)XP㏈vIg � � �D�k` � � � � � � � � � � �d_+R RnTtiWU!GJ{K_/S*KPP+ݻKI<#V@�@�@�@�Iܹs5o<_Hkݺu~˗矯kVwj֬i̙3XPKn:t/h"/R7oV9Tre]x~_֭ e � � @ ͚81ք Ҏr!vƍ\QqnŘ,D{R4ӧ+_|D46+41!� � � 6( m\� � � � � � � � � � � �-ХKm߾]={Tɒ%u-}Lz4~|p)-O_e~@�@�@�@�4c }oxb?~\*U__u[b2cț7/@gEۦM?mzqFqgv%I&.Azcߔ¯e@�@�@ k \W@kXiL،԰a$+Ujͻ_~6l&_V4ӦMcDc+P Árq @�@�@� PP+un\� � � � � � � � � � � �ѣnݪ[oUtm۶!޽ғOJw%Uw j۷ϓK矗 Iu7\� � � � @ lٲESLɓ]Zz,vhE|Y2d+Ux 7D ;q+MwÆ |QYf7ÇUF 5kL_~7o… a@�@�@ vFZcHKHEJ[ǭEjFnaoܸq?E;PF3t'{^f?ܝm#2[ � � �!@APO@�@�@�@�@�@�@�@�@�@�@�H /;vcǎ.X]veꇋHN hUڢY xBMzQj4wI � � � �]o\r18q.\4mT<7nڵk+gΜr:E�ʔ)ovCwSNՠAtQ_쮍˪ޮ];69@�@�@ Z쑋К0AnTo<i@dk-qտ:w]R%.`׭[ &~R&<&#� � � a"'!� � � � � � � � � � � �䥷rF哗Fs2TO 3U`fR%Ǥ޽JVT\9d/;OSGTwÅ � � � �D\ȑ#><|p7NvRztWe˖[."Nزx&M}a:K:tPǎըQ#ȑ#@ � � �X2رrE%[odmULbL_|J.iӦ)O<6nv#FnݻU`w=,Z$ժ%:nV-n@ � � �iضM.N M.5mv_9F�@�@�@�@�@�@�@�@�@�@�@ =믿^_}.4#, R|kUܹ5lذ?&C.]+#� � � � f.3￯?\V6mt5רUV*^xby#G -%֭j֬d � � @68vL3'֘1qEZ+B5*V,6aɵvYl{vi9Fx衇| Eێ˫\YNhA�@�@�VꟁSR)W"� � � � � � � � � � � �#+W._ԨA>EF\S'2 j߾}$='L.� � � � @;vP~TJhBw֠Ae-ԩS'i%'Ĥ@ٲeuwjĉڲeyO:uwсbrn @�@�5={O?nEȔԸ\sBԩr1㏥Νc}'=zٳ_PL+Dku&it>Ըq<a � � �DJZ@�@�@�@�@�@�@�@�@�@�@�@<y4rHժUK_~Y%$i[^](P@{IC.AkWB@�@�@�@�NZ`Ŋ뮻T\9}.Nm޼Y#FW_|t\�'PX1uM_}֮]멧6<㾸^͊#� � �-r+rRe['ڭK˥^.TE{=<xp`u… Uv팼I+o޸K:K�@�@�@�VT= @�@�@�@�@�@�@�@�@�@�@�-` Mnj+.%@!Zٳ/NI)X Ru&-F' � � � �tF &hźeuh }ʖ-{Lk֬oI&B ؞={/ 3G�@�@�(p4k#r1R%o߸bZC3f̐zVM͢nQuӧn(I֭[e[͚5SE\GA a& � � �  � � � � � � � � � � � @"Vyj֬Eqp=$5o.ii-5e}ٳU 2h pn+2SFPtkIeB7]~|MmV?|xw{$̟{9^:ҷ?@�@�@�@�xGտo۰aΝcǪiӦ̸[GUڵy挛|Q;Z)BeИXΜ9u5'F;TU>J[/ � � .J"vԸqkN+RrEγ^֭[/ʵcGV}Q-ϬVX;R_n[w=a-b ]vvڥFo ޻w|I]q88��@�IDAT4`�9r$߇}m[oӽ)$0jn� � �D�kaP � � � � � � � � � � � .PHM<YeʔE~G YS~+P7S־}?!O,hYFC Ѳe˂Zh~'~fv̸ܺufϞqرc~)SK.Q!WIl6l(KKC�@�@�@�H5h@oǫN:s5cs%ptIOMKl/<Ļd?nao3yͰƻQ˖-eI}Y{コꫵDz@�@�@�"r+rţRe['--]*-_.tR\<Kؿڷo%K5Qڵkrի앖rUV)o޼~ju O:b ]۷umK,Gvޭ.HСC߱zԮ];<xПc}Μ?قZNoڴi~=ɮg7h@�@�  j @�@�@�@�@�@�@�@�@�@�@�@jM4'(eܠDJ}TIį*Pݛ >䢗]vY( m׮]Uvxgeۜ9s/lS2':̸:gGݺuեK?stۼyzXk4@�@�@�@� ̝;.PJ`i&7IeݻwWƍS9,qH(W_'p"Of?D*;ع]s;vЅ^u� � �dscǤYGjԐH}2DڶM1CKZ5{a]qZlFB )Vz|A;3obguVʔ)3mAk)]/~MB0`O?+RT/-cO=&N7xßkה)s߷5)mq/wߝK3< f � � @ du @�@�@�@�@�@�@�@�@�@�@�bAZ-E~[.)I`'UPM@ 8=4:OÎ%(\pzH/4sfJKb״O>Dvܭ֜9s|B � � � �Yয়~R˖-}<fСKhB˕+WBCc^5%H(RrNJ  XwY,+yhx^3\r<yjժMj˖-9� � �d=ҧJ"v\n劘KSc߶Rb2Li/WAl$v5רB $V:9w0jqKNs9GCb$i9R PʕC׫W[-k>s[%GBqh}nm2<~� � �dY%~=L @�@�@�@�@�@�@�@�@�@�@� jYf͚i'$ >ﳷH}J#/:r>Ǐ_׷~w<L߉%Aׯ޽ʖ- vYk֭<x&M䓦<3.0f 7  K[P!uU[=zT_~ W^yE/^ .r\;խ[7=~vQFٳ;aX7n># >\t>ݻ۷oVZYW}֭[թ#]|R&)ӻᆱKIh.L{{4{lΝ[g}>e k}5k Y:sQFv'|@�@�@�@� XloTv|'uUxرce9Z\j̘1>sO?/Y/-N7dyJbdau%F7qZ;kߋ@jР~w=&?0ث [Jb{v]Vo2>e_'t[oU^zƍu]wx%`6.=l0YFm۶#<keO6>@=Ν/K�m߁%Z6/,58\Kl1n!,aSO߳%n㲱͛W]x0 @�@�+W~YH3gʭ6z-UN_R7⧗^z_`qh/P' '$HRc?v_i_kO?+֦M|| zۺ+[7fn|l*cIm uw;,UTbu=:E[lsu|O5hVx~ӎ;|aוּ3+_RqWi-.e7 za-g75O>/bϮ̂@[ /Fȳ`@�@�y jW@�@�@�@�@�@�@�@�@�@�@�~ZViӦ2ejԨ q.K<!=XdvuUWVZrKbnl1:tIE-[o>)I7o @YRK`IQI7W^-ZdW\q㓆Z-Kbŵ껳X-; \YQKaX,Ʌ֬М%DbzY 9s)˗/WV+XP~׾Hؒ%K|#F\});,m.,EV 1Y /۬YwsN?WK\d738ۼyJZIw޼y>lңKrbߗ5_x S� � � � +ܳaLŒ& cݻW{DeXq~İv EY{e~OI̟QĻ_Ebd9fŲxS=Tzu_P AY~[-[s{KLh"կ_'>|&LYfϞ&MLW_-uVR%8nZ"xpBqd.-kŶ,v.]|Lgkb|nݺ>r-fmMJڿo|ٳ'6K+eE,lr̩#G$O8ǯ-o[!/~S%=VOmZ6KTmMKDm) @�@�JѲBZ.DE#[#ٲ%oyWճgObU-XT\�F,C{۫^S#M6ͯbZ֮z_ڊh^x[lZ%v,m>ŦJ&0gω /2eŋl_QY[`AXtY>- L.>P\ʞ+VD+n6KN</'vm y-zvo&]ve>hqN: j?@�@�@�#~ @�@�@�@�@�@�@�@�@�@�@�@�p7@4&O`@@@_% jS3-\Ѕ.٧rʁCȓ?/t۹y.k+pInC]B@CuEB\8πǎ ,%LJ :\-^"SݻwqI-u.I?7v]K]ѬKp>B׻B[z+t,5;E '}Kp <׿B'bfSN9%c. Gߓ+품yg1Kn. ?ߞ6{^opM9.aI~3rH%=98o@�@�@�@�R/\wAWƏmof/ .]:PpШ,fg6mڄ5*``KIuf}_.s #[r1yɽM>O>dTWXs yCǚ5k揹cz?c)X \P㸑 %۷m~.p5O=T.-|C9;tk׮<.}%_pK߻_lN'33j u;� � �-%K%JX@- 14*eE:X<xjԨQ*qܒ$.gW<ۯrųC}:f1߲Ǐc ?ڱm , ︢M;#v+Vp]v{sECz@sŶBsOY|&̄?fjݺ_h\X}R&1R5k\aܯ>n@�@�"[b0nI�$Nq @h � � � � � � � � � � � @L *TH.Aԩ͛oy0x xqSֿ+O=z\q+uY ]6(P@/^: )wj׮z{y%?\#FK귻K+V:PԿ^uUr 0yz߮9z>?Txɛ7ohvׯ/W�ݱ${9.٬\/1~6.]߶<4tPrB'v'$=*ST%.Bcڿ[%ThQ߷/Bf� � � � ob,{[˗߱Zj;רQCȕ:䏹̲8+:%Y{w ͞=[ƍ׃-YHZ%{?MIlϮUn]͝;Woi k;X\?Hܟǃ&j oqMW4k}$ ׬Y3qժUl/|<.m[9$ȑ#k0 Sٲe~Mۿ1o @�@�U+W^.\*UJYͽ{KKJ˗K/$]z+W2rN,r%5\FwVqXGX %q~?BԩV^3gך}G>ds Ao֎m uw6oצI2\5c' |w}K۹s_%ٵGvرL^ =(Z}kׯ'_gsrHnݪ?؏g3 � � Ue � � � � � � � � � � �  =cƌQǎբE ߬YOXDzクLQ ԲIŭWX$(ԩS]">A}Pbn0%\\q'G01 oʕW\`Պ+X%H<xz%K4kInAӧO T:t蠖-[Dfl2Yy%E?Nפ)S&??(V '#KaI0a'OHwǎ-_S2ܹsw%Xj[I6Vk� � � � +6hѢtďڐ�wޑ_`A}JbdLoڴigS-%1zgwpS˓'.jӦc0h{8<f?B 3- Xo#Gbւqج=ះ_<7_-/|41!� � � 23Gn ]fk+#NHr?o9NBdc[z2ٶm[PyJ~ۇ RN8mM4Q~dž/}ԨQkaJ%vlݺuֶ%wV V-q^s xD^Ŭ8? Ft0={]<W/\᫊H ~?><ܳ5ژsB[omoٯq @�@�q%\ � � � � � � � � � � �dSyjĈ>/ <tyrG kׯڵkOL2i:\bЉ۱p֬Sfl_[b+o(O?t{⋲^x_ ?pQ_tkذayM4slO~^:~rEZ$~%µ_={>dI;ŸϟC誫JvqU^wkEۆ sm4@�@�@�@�t"_4vrM7E}XڜlS# eهu] Q\,x^zZѥǏr~vb{Çw [n-pB-<s ;~%nf.J*6k֬PL,+ֹs()C�@�@�.O[nlYSϚ:Ur\7JYI(b{x -xr-<ޒLk\nݺDl;x_7iEА֖%[;f㳖m;V>/Yj֬>}h͚5;=׋qѣhw .\X}7"Z.,X|vy`5/ٍH@�@�_"S@�@�@�@�@�@�@�@�@�@�@�@�ɒB :T_:t l)0s4f\)Jq+P?B uu͛|G-%i#)m+V?.DVkݺucXس>[jyz(EIQm޼Y7p.\4c ܹ34?Kbo#V,Ѯ] wfHY1{N1>c[!E*^8D!̭Il0~Kvgᮻ}/gIfʕ+z@�@�@�@ M6UN|T+v%֭6mڤz 3%1`+x__fg1-kO5X+KiӦJ-[6E~.ls8}f8no?. &,>tP=L>]guOIni^zbA Rof^b w}z'eɫi � � @ \)~[,[vԻtV륗K/+mďo]}OdBkN}l#YVHotwoKN8Q˖-W\~[;fҺ-A[Khm^pm^BHz1+zP>_g駟< n.\K.>իճgO.]Z} \_|".3 � � @T` � � � � � � � � � � � @r̩;v|xd1ZX=C7tOhk#ڵk]zGeCy晾%fx/K` ]{+Oj -jܸ9]tE\Kbo*awq \s=W5r1 D`.K2cVtZE}*TH#FP˖-o_~]5YK~z/@h"?\ڵM߾}Ef >ݻZ<?f4L|- YwyG7nbҤI1X � � � �ix뭷|K]v[ ~la5+,)ڴi +}vbmVފ[fK:kH/ߏ%o~{ر>ѣG=+5dUV`Jb{^=H۵}FeZ\6sq v5o<#SN޽{>L[l1M-Y6kW kصkW<V͊Y<{ȑ+YdL*( v~g5k4@�@�@ &Y[*5J$[BcŴOjWI1CKZ5Fc[^|E]9o^]v=aXb탿+HI &VHH"SȸxY,%[?cV(%kϪfaw}ׯ1{jj֋9rDUT7 ?>fkѣ jHQ|&g7_G˳'bְa � � @lh � � � � � � � � � � � @pIA/ Ύ)%&駁@?$vF]A+p\J "PR+~pDB^9֣G+p Isw~׀+ u1Wd)pε>\‰}.I wܾʕ+\R=;.!jB ?0 _W7p1߇\@Ν6׫ڏ% ̞=;t7|p3캳>;>Ďfa{rhnݺ;ޒ=x衇.٬%: i07-0sL]$~qI;.s`f@�@�@�@ .)p[Ϛ<yr{N[W,f/_>]v`ܹ>>B>W脛W c7I<yx,f>->s=ȟ?1oZ%vIj1e7npƂ $7f̘i㩮HX`{g}? Edv СC~fpYg-ZIr|' (Q"LR~\RmߗK7n\ xؕ?%p ƒS\m۳풌:u8s=`_Μ9]w]Kɔ2W.P`Akg� � �d݁'7p7U 2%>8r$3G[f_O=c Oi LJ?w}' ,QzM o3X ֊֎>m ;ZAeXsEŋ?!v>YJ׋s-JBmʕ~9ci֭Kؿ ]l+uuEmHۛ>} ^}UĞ][S5IZ]֭[[ ~� � �Q#`Yb:$hx4@�@�@�@�@�@�@�@�@�@�@�@ zԫW/zdF'9"ը!կ/} M2e%zВ%K%vK~\b[ r 3Yrݫ+VbŊr;/۽]qSK:؎K+E.\ ^cۑK!Ex ~㥶m!sN=n۶M.\bOJeh>.sqI}O/{nٲE.A  � � � @,駟K]R(zܹs+h.%1 =R12ZloܹCChГ6mutţB$;ö}v?{ ;I(nNB+>ǘ͛.Hwu^xbrgItuرC/+Q7Dd-w}'l\.x"gr@�@�H_[G3fLrkf vⶪUn)r5sLB~]WBk?%\y_KxRv,kے,|6x`s=~=7s[Kt'^itٲus 4Pҥz†.v.`͛'gm?nذi[vv{@�@�2WsӥM3w,vw j7x@�@�@�@�@�@�@�@�@�@�@�@,Ent-wQΜ9OzNW?M=$-[&4uRv>}Jm!WL'=X/D@�@�@�@�X悃֊{ѣGBe_|E.\XӦM M5XP '8NH5 //mݺUmڴzN:?DVLV>_^z)Da@�@�".E֭ hOAWO</>e5i$̭I 5uέpәg'}CQ3TWލWZ27j@@�@�@�('!W/J@�@�@�@�@�@�@�@�@�@�@�@ n&T:v]viذaʛ7oK./ΔbZv j޽'uoNN@.6xRP+u\� � � � _jժdǓ'OV>}4`�u٪QFyB+RժUK|%y;vo-!qԊ\~IB)RD{N]x'Mf5|pjJs矟E�@�@�",g\q"Z&H3rZVcQ#2^~'Z7|bZUwTϯ jYK.լY3Y&6"ڿBC�@�@�@ T@�@�@�@�@�@�@�@�@�@�@�@�fϞm۪VZ5j-yM,ʕrR?&M믿N}JKG}twIkȑ#}B3fD?v\%1 � � � @ L6Mոqc_\kUBǎSGѣ[~u'g#_~|A-]TVnP~X%[nСC5x`oݩS'^vXG�@�@�5McHcJ3gJǏK jNr5i,`5h&ڟ#/[LUTAFht%KO<sNU^]cV N==C‘غa;NC�@�@�2Z`6/M.5mwQP+?F� � � � � � � � � � � �'!xbiFEф T\SU`Freo_WrXe˖uů>|bHMJ#*\֮]vdIU?ߞF  � � �d.kAkj߾:/Ο?v 9x;Se[vnmhѢoO;4zh}g<y*U[oq+mYh � � @: Қ3'ZDz[rKTX:ݜnS%7hÆ 6;]d/ ,-ܼysUPAnhVijU1]Q/0Í@f'jo-ZD � �d] jV@�@�@�@�@�@�@�@�@�@�@�bP`>I?~jժ`&M"-[&W)cAO;{*SL, 1"� � � �Ġ1z &6L_|:VZm۶.ukbS12d XRk?cǎՌ3d:voQ׏:@�@�@� #MWDkUq\AKrEvt�,гgOM:U?c:)ϚoƍgD�@�@�H jޕZJ@�@�@�@�@�@�@�@�@�@�@�Q=.{UW]~A7o3a?,ծ- "|3( y^cq@�@�@�@ >ɓ'kѾFu 6hB]vKrX 1b~ڴi>D~ժURڵk:aÆ:S E�@�@�X2髙3~r?KTjF @ t޽[ to$U+ QEDK:A�@�@��RIAq% � � � � � � � � � � �İ%KڵFs1<;m%VK9rd_X9H:I=3a � � � �(\q$vΜ9~_|/ըQ#5h@Ŋ1f5kfϞԂ ?~5mT-[T֭]z2g/ � � Eǎ h#-Y"-*[$V6r(0CA�T lذAe˖W_}͛p(骫$Vs@�@�@ 5JZ5JW"� � � � � � � � � � � @ XԇzH?Gy$g?}tgg)'-]f|@�@�@�@�bQ`޽Pό3d:2fרQCՓڲf͚ʕ+W,N1#?Nsի/_>]r%jҤ5ksb � � {{+5acTr\mqbo^(_'HL8㏥.]#G2@�@�@ Y j%K J@�@�@�@�@�@�@�@�@�@�@�@ zս{w?!j |KX+(!}e !&)0{ԨxtIʇ � � � �d}jΜ9~>;\l+SV-թSGuwN= #7D ~w-X@?߬/GL2hVՠA]pV@�@�X2رrEǥ hk'Ugt [oU+?3f̈Le G @�@�@�OZN_z;D�@�@�@�@�@�@�@�@�@�@�@�,"p|ܹ֬Y>LE"˚S[֜a%H.IA3[@�@�@�@ 6 (.o믚7oϟ﷡C ̙S*UR͚5C[5TbEEWZ|~g-^X-ڵkTT)_0}۷.B-[61s@�@�ch3FZD*ZTjZ2DjF*V,CM@ 7o>HWhdqCٷOn\Q7,� � � @r4B � � � � � � � � � � � @Uhj׮KRTƍEW5?M/No~)0q@�@�@�@�4>V… `jWǕ;wnU\6ZjRX%bx 6n(+<g۲e˴tR~IkVZfeʔIC"� � �سG81ք Ҏr֏ImJǎMbJhm;ʕQ60� � � mJO6d(u2Z� � � � � � � � � � � �Y^`.!J[mڴIGVzcmH{K˗Kob'K-[JkJgYG�@�@�@�@ 8/ nV\Ȋo>|OXbVŊu9B lٲʙ3glMf {~׺=V8^m[28[}yjժQ=\ @�@�@�3cHcJ3g5+eO p�o֬(k?.%-\ec8 � � �^Z(z;D�@�@�@�@�@�@�@�@�@�@�@�,*w^x㍚:u>]wuYt7={$SVݻKq;xq饗;L<>A�@�@�@�@ +;vLk֬bŊP1";~!?\rL2:]!BVh+  mݺUׯ׆ oiݺuѲM6γV@_ΊYAJ*J*.}Uȑ#+@�@�@ ̉+e,ZV6sMC�ݻFcxI)͞-}m& "� � �$)@A$yZI! � � � � � � � � � � �dWKfCO?>}dWJo-\&`,СC\F+:@�@�@�@�@ f?^ݲF9:p@h~EgN?toKVɒ%u)c' 9rD\.+yf_ c7n={sPB*W/fʗ/ڷZvZT^@�@�@�LسG81ք ҎRqڶ7\j "3fYfZbx4]W髯iT@�@�@ (@Aɿ;y3@�@�@�@�@�@�@�@�@�@�@�@�l 3gNkV/xb{Ĥp9b5`ʜo ڦԫt'Oߏ; � � � � Vʊ֤IeZo"HViҥPN\fZQ-+e[R%JWm+^+"E(G.x"cǎiڵkvjųB2[1`!5ke˖*[lhp¡kA�@�@�Q`ʸZcJ3g6z+Uj41!���@�IDAT@,4t-ZTGփ>UC޿_ʟ?`@�@�@�@ N@�@�@�@�@�@�@�@�@�@�@�@�%W_cǎXF3<3kM0Ff|u7 Ez"EERDDT;QT,XN<SOc, *PD,"U H"M&K&<~}v4ilaK䒝p5׬8Ce>@�@�@�@�@ Hȑ#.HiӦMɁJƴsaKVpYkl[m_eѢEUH䥭s!od|.~W<}h{Iwޝb}׮]z5 ^,ˎI=|]/N~8--8QhK{ގaB�@�@�r1ӓBF,oV骫Z*�*p7kÆ 8qbTU4thTU � � �-O{a9'3"� � � � � � � � � � � �(pk̙j׮5jQFe<ZT.>X´rdyO?]][KÛs � � � �Ķ@޼yUB7R `m۶gfaN~ӺuhѢd!Qk`SNQ\@w!\i-D76 ʓ'Ocu<v[ں?۶ވ`uva:t-- 9x}lj.\؅-V 1PRJ%agKv v@�@�^ƏO 7N޿aՓ 5.2!�Y.о}{u_LL9y- � � �d@3G 늣$@�@�@�@�@�@�@�@�@�@�@�@ vloQ&M|n)ve-kFڼY5KQV9?,#-YR � � � �DXݫ={li$2*fTUd88*8 J ͺO[~Ж:l|)p/ ,"D"EhѢniY]@�@�@�VL в$/|R&I!ZI5k"�D^-[Vty __z0`7@�@�@�lزE޿'-Լy:ן,oo @�@�@�@�@�@�@�@�@�@�@�@�Ix^=%tI .O?lA|fi8ӊWjTJ<6"� � � �  eiuRNףjT@�@�@dM5zdTtURRɒp!�+`}GJ :4,{/={-8 � � �!@Vv(s@�@�@�@�@�@�@�@�@�@�@�DWu=ܣyi--LY. 0K ˲x BM?^( UB�@�@�@�@�@�@�@�2;%'bZI[JիKmJH͚IyA7˼)2'p7[oޣtҙ+$@-/۞ @�@�@�H @�@�@�@�@�@�@�@�@�@�@�@ n6M<Y ,PFhѢl8kbyeR>xmq|I!M@�@�@�@�@�@�@�m+W^Zʔ:u֬z./Z L+_ #о}{ϟ_CJ-)5ա" � � �d�ZYFIA � � � � � � � � � � � o7ٳU\9]x1bDDI<"zTnDOEQ&pejQV1� � � � � � � � pGJSJ={JjIժIO<5pe4yԣT  @xU;v;s{={Eݛ@�@�@�=jkEM@�@�@�@�@�@�@�@�@�@�@�@ ʗ/L-ܢ:GձcǢJH6IO>NONE-:r8@�@�@�@�@�@�@�@ gv ׯJ*WNjL9RjZ0!oȐ!RNRɒ9SGΊ�]wݥ hƌ'rXDn{J^ � � �1'7ZD@�@�@�@�@�@�@�@�@�@�@�@�lȗ/x 5h@ݻwܹs駟D\9ݎOK>(U;% ԯ/'i:u;@�@�@�@�@�@�@�@�rV`Jiy_4zڵjqv@d7n;O kWًZpn@�@�@�"#b)@�@�@�@�@�@�@�@�@�@�@�?o]'Oּy԰aC͟??='ɓ4NI1H ͥsQ* � � � � � � � gGJSJ={JjIժI{KeJJ[O%AV4h.1+]Cs;v$D'G�@�@�@ "jEB@�@�@�@�@�@�@�@�@�@�@�@ ^7n9srʺ袋G+E۽vcIŋg]4ұc!T@�@�@�@�@�@�@�!;aä[nʕ5FZ&LH 2DI*Y2NS@�OVL?G=&X&9@�@�@ ԊIk@�@�@�@�@�@�@�@�@�@�@�@ y#|ԵkW}:x`,r4xףJ*Hܓr;KE ivi<ingڵ~5,h- � � � � � � � DzcZ$vԫt|˒ț7'kʹ@� ϟ_<yر㸓XmDHN � � ��Z9@�@�@�@�@�@�@�@�@�@�@�@ F /hĈ2d6m~-F[f͚%|tyIaIVҠAҳJ޸Lq(`kK3gJ.]{TxҀL4fTld@�@�@�@�@�@�@�@ NzjՒUzN 8PڲE4ICY3*i@�({^$R/]Yf;M]Q^ G�@�@�a9|~N� � � � � � � � � � � �Ĵ_թSG]w4hO?TW^yeL9Yh7 Oj2)0yN 7[ Ŋқo&i+%$$GcǤE"E � � � � � � � )/-'m*U.m+  /(&ɟ@�-PX1/P{9Y֛^7[?up+Pzmj,(P8 � � �9"Y � � � � � � � � � � � @${#jݺڴi s憲YIw$iT\9iꘕjI/YMU\_c� � � � � � � � p2+WJK-[JeH:IkHzIKJ˗K}J-Zu2�'p+_|W Ӳ@ gi6T@�@�@�!r"� � � � � � � � � � � @| *TH|^uGZƍC"|ڿc gK㥪U[ڹYmڵogj?ϳ � � � � � � � �i xy/:USUK~{'i (m"M,!լvlE�]~~ZmݺUO^%Z`@�@�@�( P+ .U@�@�@�@�@�@�@�@�@�@�@�@�{4}to_&Lp\gΜ[o ҅bt:|XZ:sI/(q4zt5{L*_^JWOIU^i � � � � � � � );aä[nʕ5FZw))DkS'dHՂr@�/p1曪^FdRO?CMYRY^,"� � � !,*F%@�@�@�@�@�@�@�@�@�@�@�@� 9sx4SVOTaС{<`�}1i|6fܴ -2ޏ=bCP!mX � � � � � � � @h+/ʔI ZFKZT;//'o  v^ٳGG󉠵GjA["mTTdʦT@�@�@�rZ@@�@�@�@�@�@�@�@�@�@�@�RXb6l^}U=쳺+i&}Ν;k|cR<5]7 }THx&Z)_vD.lA�@�@�@�@�@�@�@�[4uԳTTԻT4peGf @fUW]vWo[I?guҌ� � � jE酡Z � � � � � � � � � � � ݻw״iӴj*o<x91m߾]ݺu9 J+0oJ~>,cOץĴEV.lE�@�@�@�@�@�@�@�عS6L\9Y3iHuki„!CN%ˆ"�(^Ǝ^zeX?>'j.}2%p, � � �+@V^j� � � � � � � � � � � �q"РA}ڷoq-p-{SK知ÇnЋ/J}Jy<[c_R%g4@ؿ@�@�@�@�@�@�@�X8tHz!駟2•+-2e²֬"-]*-_.Ԣ7oQ �Nmxۆ (11ϯHjG}ณ@�@�@�6c"@�@�@�@�@�@�@�@�@�@�@�dnM@ dC.]r%\r}rk5, O8PůJ/-[&=?SO_Z� � � � � � � �W®:t.4ȸ-gbtiyD 骫ٴn-,q9� 75kM6ڸq9|C^z)SGbeE•2@�@�@�C3C&@�@�@�@�@�@�@�@�@�@�@�@�xǼrP!u}<o9ЭDc7bժ?k(/K֟*0-X@�@�@�@�@�@�@�@ |tybI˴~) &rTԬ4rdRք "uDVZ~lC�Knݺ?4iC}Ϝ9SǎHUʔH� � � @ WvW � � � � � � � � � � � �%wߩO>^ht~K:u~+䅇%4o^hQi+sCcv \xt睒Nl:묤%?@�@�@�@�@�@�@�@� ktR׮I'~EulʕRR˖I)fԫt|ԷԢş(<5@�(U< ?b[V=㏤*QA�@�@�6P@�@�@�@�@�@�@�@�@�@�@�+]M6UBB_rP @@={"Q'O'U>1Q*_^9Sj(7GT˛skvj"z* G�@�@�@�@�@�@�@�L` NϏ/  /TVR޽´l&Ozj<x �D@ޯ_?}ʗ/MӧOH%aZID�@�@�=a{mE � � � � � � � � � � � @ tY6ܹS_} 3Fvr+>|:wQsQ{d69rD޽{ѣR/mf@XXeUpa7ϝ[«f}IZ'So]={x [Wj:xw^s p p)dɒ:SUx؅e � � � � � � �#d}>:gn߻Ine >#g;~_i-ӱc /H<"G-x5d<]pf8~_ �D3zU\Y7pE|ZlvߵwiݴcM$׶۴hQYy~K͛w,Ž}7݃ӛxvgB�@�@�@ xNWpNՀ"� � � � � � � � � � � �AOF_~ p`b%ԳgO=) İamڴI۶mKnݚb}Ye&eӼ U1UHTti*Uͩ˗/ *%Z_tRZ*y^z{s୾xA5TLy晪RmFY ʸ$@�@�@�@�@�XRNc5@�@ ݻsٳmeطo_eKH_ `-?` ,B p-Z-m[œbŊ7Y_%tMҔ)|.#ڱC^{R?c@� +ڵ+yiXWl`ߵml爥0{-u'~lmݏS6_Z � � ޟlYi$yXniַ@7D@�@�@�@�@�@�@�@�@�@�@�@ K,lh̘15j&O, ܲ[nA ,<kƍ (QDU%Kt K &rdu:r䈛uim p/٫gcfU~Ys dZsŊu''YS[dNsjZpjyꩧ&]Yi°lbټ~}Qoj8ѽo- Tvp. #[\e>j׮s=WS&MT~l<+z 5A�@�@�@�@ ~ԊkMK@�@�~=o.lKPW"?DpoDp(,/m~ؾ_ॿ$zBBɓl5Elzݬ;~u釁mV7Cl[ɬ,dsRR[_ԳY3+u,?> !R^ @ X{jlԳgmePLOQ!SvϰC_{5w}ߋv 5vB݃m nߓzi~Xٵ 5i\mKvN=sGَ� � ��Zjeގ#@�@�@�@�@�@�@�@�@�@�@�@�lڴɅY�/+V寿@�6�UT)E4eD6@n4v0,4�ॅAIc[TZUիWWjTF s9n6 ,]Tƍ)S캜.ʂlS$5J: auP yΜ95f\|źKtWaÆ'\9 � � � �.@V_!� �D/ iƍOy)-#dߏ.]څ?d},Ÿ+n][S,Â<,DŮMl,`%uЙbhOɮgrTlY ^9ZQb^? :I]Bڏ?Ezエg+ ''{m[S/¢'iO Z ` ^cMi-"9Y[-8+^' ߲`쇜/�4'3ko!eʔ9ni}iS@�@�_@_#2oǑ � � � � � � � � � � � I ۷/E,Z c�IBY0T*Utg- ,xR<5khղ1?̖66/_ޅ8N~1e^:u 7[ BѼys5mT͚5sp8 xbe_'O٠WڵSժU+ϟ?@� � � � �9*@Vsr@�@ :k׺>֭s 60a!J ^0 вͧrJTʄ/pabZbsp]+|7K$/#[qa[R/&|lכ bB�r!F4xpJ{l{OiQ FÑTZ4m=|xXڽقRkv϶0-g7?ZB7g;ݖ+Wv c@�@�NF@y;D�@�@�@�@�@�@�@�@�@�@�@�??~G͚5K?.] sT VڵUn]7s9RJn0OŽ!yժUZd.\( eAIՠA]p 5``OXp'A۶m[DuAKΝ1chњ={妛nR׮]հa� � � � �C@q% � ~z\2y^z~7= 0+~Wf U\xeĠ]{&_/mwbӛwy!\}^^ک*T 8UyWn3ԸqYUZU~-o J$ݻw'O{Tuȑ)R{c˕+f?BxKfc% _hplQ,g,P,hZЖgy8%\ � � @je�jS � � � � � � � � � � � @f٣~A-g*Z5j䂛?|\zu2 }/֜9sl<( 뢋.%\fn$7بQԯ_?M: ,ֹsguEjՊ9"eРA]=[Al+&@�@�@�@�v Q?@�@,aZlY_~ѯ{~ ARJr"lEaZLDRBfDcnlUVi߾} (cOOTfMըQ#yiydU)\'-+8_�m۶% Y_HR^Z.}v~v6}؂쳥a˗/ͥ~ � � je@q$ � � � � � � � � � � � ,`I̘1C|GYX|fԴiS5n؅ %$$$J :tHϗ])S] rZ-[W\uF_#\?T߾}ݠ)m۶߯/\5kx <X%Jp޽J,a}G�@�@�@�@� Pd8@�Y͛7k…Zh/^,P Zj.xBl>묳l}v^%~7ntapb gqk.WӜs9]dKRr==#@ ܹSK,qLS{ jK?@˖M7>a.gk&Wa~0g-3+ � �ė�Zjeގ#@�@�@�@�@�@�@�@�@�@�@�@ ٣/RGָquV~.\Zh *ĹRl4*0a;?ܵծ];wM@@ ң>-_suUil _]oG}ݧ Ei$ � � � �M@vŨ/ �ģ}jAgg~֦2eʸ0Zj Y8fɓ'hslڴɅXu9 9suy繹A.t+o޼q"D3@ }\W-Cl~zwHZdA˗U,@ HرclcŴЭÇW ϱiݷl|Jc@�@�bI@_M2oǑ � � � � � � � � � � � {ըQ4|p?^GQfdJ[v,qd0cǺŋ}رJҀDӦM߯ nO<+5OvR>}Կ-[V/9@�@�@�@�r�S"� �X5c 9sdϟ_uqATn]7+W.yرc.\<[ ͱMrի' jܸ."_Bغu~'7ϛ7ϽXw+ZZep0g~K"}xŊajc8p}K ײvÆ U~})R$*ə@�@�@ bje@q$ � � � � � � � � � � �đIhĈ:| MСڶmRJőMM-nݺ䐵)SSOՍ7ިo rzxzG+UVׯl6l믿^o{-7[@�@�@�@�@ nq·� �e/Nꂴ֮]B,@QF.,L+_|) %`9˖-ܹse!ufrus,XI&j޼ ț7oXDXxSΜ9ZJyQժUu`J pJ β@ :=* 1-5!!Ag}l|PL=NLLS @�@�[@ۑ@H؀� � � � � � � � � � � �$ ڵKz--_ &ӵkW]wu*Y$L'` :T~/^ .@ݻww[?nh`3tQ7ovAZg Ooѝw) $p֭[w {!� � � � @DԊ(/#� �i XHw׶mtiiӦFƍeZ Hx6"@Xh͘1C? [r .~/2]qW;YCN)d5eM<YӦMs;rYv?`J ѲbŊe)G`7ھblayv=Z(tZ@fBR@�@�2-@VDV8@�@�@�@�@�@�@�@�@�@�@�bT^һᆱDoSnTfm1͊ d`alel>-Z4˲2G.]aÆ2d, ٣{G /z(NZN3@�@�@�@�^P3@�ѣG իWbŊe=Uji0-A  XSjĉv*[Zjm۪u*^x.n!UG w =(-r„ Z` @f͚0[?SswC=d(n:eazv;w\}ξ+ezߙ @�@�K@_2oǑ � � � � � � � � � � � c[Ry;B ѣnV*T(ZJsS?ЛoW_}UǎsJ?T`FXzGݻwW~7oްcv#€i;@�@�@�@� P+;9 �ģ={_>_GEjӦ Yf<fru|/}ԼysUTL\&*@nXfiر<y~&M\0l4h@m͢ {5i$w={-+,]v*]t@�@�@ 3jeF-2oǑ � � � � � � � � � � � #GQ߾}3ϸ?"ݻ:uDM\hi 4dZ=N9YxUΝzz'Oj{^"_}:o^~r{? � � � �R@\y٨4 �Df7NƌB kq;]v ,5Z 6mF?\ ~.pV\!Chȑ3gjԨ! iݺ6mW{!@ ܹS'NtqF5k}6رʖ-4@�@� P+@q$ � � � � � � � � � � �ĀYt~iu]勁фhصk oׯ7ow}WgyfVׂou*ڴi;CZNi � � � � �Za1 � e/8P6pXΥއy{,O"@UvÇu7{UZrg59,`AyƌjԨnNYZG�.0w\7|p/jժnٽ@y@�@�\%@V/WBH@�@�@�@�@�@�@�@�@�@�@�@ `/}Q&MTzu-_\ ʽ4ԼXb7|ٳGӰarSL<z0]-Zp > BgX@�@�@�@�@�@�@ 2 .tWRE~}Ymܸklْ0ȰS*Q!'O]p߿6lؠ>H֭Z&MzR rytwB ztjժUPzHi冫H~'Ԓ%KdZGGTij� � �q/@Vܿ�@�@�@�@�@�@�@�@�@�@�@�@ 8nI{;C?\ʕ?ZsN裏ʂ޲sڽ{M6zGqw뮻 Fae6 � � � � � � +VPNt?K.*\pW!@ ͛W۷ח_~e˖B*Y̙3l@X֭[p:_kҥٳ8i(-A��{Nk׮ua ,P5y bB�@�@�U@h2 @�@�@�@�@�@�@�@�@�@�@�""`RkN'OִiԵk׈'Z ݲe~mmV/RT+[ay7n\/3'ILLO<#Go߾{5T멧j{~Lgw-,\CzW܀pYH|,@�@�@�@�@�@�@�,8xN:{Ӆ jСjذabG zHժU־όY]veCU=WlkժU:մiSuM۷od/kFW\qj/ R&M#ߋև;<mܸ1FO>QǎUdɈWuݺuz뭷\P JJkrZ̭rU_}͛<y߽K7oέz#� � @ !� � � � � � � � � � � @J#oY/֔)ST~;m۶iĉ;vݛa (ֶDիW~��@�IDATʕ+z)Ծ}{GO\lڴI;_2e"u\Q;ԨQ#͞=[V^ϻ= ˪)_|ׯƌӧgU� � � � � � �de>܅d b1w1YFװMOLv׬,,l=Ov ֚;w,YBNۛE8)ݶGu֕Zb^|EUXʃsСC?ւ tѬl^k.Yqd"=YѴi\Pnv}#y_ߞH{3{܉#;oPV-Y_U,bm5kԐ!C"}ZG�@�@�NH@bg@�@�@�@�@�@�@�@�@�@�@�w=ZժUM {oXwz'Rk+u}hS>h޼駟#^ͷzKŋWn"~h?SO=K%JaÆz'ux7-[Tƍ+di� � � � � � �ɓ]VF4g]z'[d\VcնDq.|sbJmz"}f/𩄄vڲ5&Q• ;{ァ *DEN(P@~5ku6'Z!=Dt uϵ~B퓙s1ᖓKᖝE7;bZcǎՀ\?;SG*p.@�@�@ @i& � � � � � � � � � � � z\H (OS8"XTN '*JO?=W׭'C qSNUF#TpaU^=x _~۲j/wެ*r@�@�@�@�@�@�@�9sj=CzUP*/^"gQ9i8}fB%K(bŊE9R]{5p@uMÆ ˑzpRrJ´7oCi֬Yn=y(o޼T5W쓝m2=> =m}HD[34i$uD=8' � � ,;c*@�@�@�@�@�@�@�@�@�@�@�@�T Pɒ%z&r-髯rM_~g{Tl٢W^yESѢE]UW]\!XÞ:uvءF3ΐ s&w"+VCΝ;[nʕ+բE m޼YF҆ t=hȑӧ+={tA@ÇW߾}'oQ ܀8{nٶmեKtRp 馛zj <~&MԫW/ɓǕoX&O˗ .pu-RH/^O?TՓUt~Y}~W{>kfDzzuYg>Ӎ7ӭ[N˖-^Dbב͛6m_R=z>cY] jݺ|^7=[fl@[ϟ?#] nڵںuJ.eT6 ?UVYV.!� � � � � � �ػw޾""~1N9հ0W`}/^z#\?ao^ժUKH_Qa#wݹqϻ>%VQr:U+cfb4ԩjٲerw+gժU_>χ ru\Mǎi>3)NόCzP}I4h bMڵa}ljڴ 3#3d>#;i!~WFӬrtc5nE@T~ Q ;qcƌgߢ=|gU|y=s~jZ0ݻo>bgSo-a/O=Юղ?hm+[VR>~m}֬ߛU:?g>L6MK~_Ss_MoFmzmH0aBX{2?97[)Sי}{]}g >ѸQ[w~SOEc5 � �ēy&@�@�@�@�@�@�@�@�@�@�@�@ jժB}:u xfop7 [믁Uz뭀7AK/uϽwx@7P'p嗻}`j s9+PD7B`ƌ7/>ޠ'm@D5k{4#D" *K… vS%KqV/o`?43;^P 2ryS$ ^z hѢ7xF K~wM/{Hu. r; [)kvȦmڴ xdEl`(|$裏7o|:xxko߾O<D^v{;@۱cޠ.ހa)<׿^zB/bVKy � � � � Bo@!d3 � oF ܹ3*%)gԬY}/m(Y[(UZ} M_CZ1+Ӿ7jg[ ' U;> : TT)J=~D8۹P@ѢE^JյPBUIANak4> zj\L33c5/ɐ!Cʕsm\+ )s֏l޼9ХK;|KӬrL>Y6vځ/)yǛ7o^W&z/QY./1_۶m]^U .pa~av?w\-{7Zn;'tǼ`ݶx¨g{_'HHHpD׮]c^ȥ;8g.rǺNGzBv ઀u֖^x!LܗwNg%!Tp]Os}mذ7kǏwv^SoF)a(P@ ƌ:Q@�@�r߁޿AIrs+r ?|@�@�@�@�@�@�@�@�@�@�@�@�H%/*[駟ǝ[o5k=C$n%/XJ=-~iyaWzWJ ҽ{R?,/˝sya^йB\lyy r+ /kx<ɓ'oݫ>}UGo yT}A ~%o}gnAofϞKo0'M4I^&yaiQO|;C�SɏmgϞ@ԤIyD m&/K]EY{!N; <7 {m}'׮`e˖ɶ} 8 Z!/$xnEEܣFJЖ-[ "o�Yb_L � � � � � � @N ;V^H+UIs3o M |p4<Qvn811Qr`} BȨ_CZ1!xﳽЏM!)=py4mԵG}wGӿ ^7W_} ,~8k(>T3S+W?Ou83\K.DÇw}?B3cg nxNa}gl vhҥkܶݻw~Kwyʔ)>H{4se^^ x~t΋z/kտW^//,[0/[6lXr[@A]qp%{+֗ю{̙3u RTVZٷ~;1b^u>y _|qɞߴilMܟݎg+ O?K(!{?e8eߌ>qio3jCKḦw̨?7jS?NP8G  b}ˎ;pw$I@�@�@ G?I @�@�@�@�@�@�@�@�@�@�@�@ Z?UPl(gȑ l=U}8*Vjժ TNWa6>&zM6Y|ܞev*Ub6UʕUdI3t86 Ld% j_dn_Ofnti .f͚rx ҺfٵתN"5<xP  ^_˶5PeS(_ ^fUT)ۮۋ/b`k׺3Km۶MիWweъѮ � � � � � � j֬Hi}NO?]UTk|I 2$s~ /[oW^QvRVۯ! 8:ֶ[�5@,NH"aO?cZhsԭ[7H8}NgeԨQO=x xP]B3kȾ_Ϻ, `9rąYXki߾}~?l:*GWla!*„@<k){a6Yh?YѤI\_';-8l>}t{vH_=]tUZ0W|@ݫsnmHN|fx7e},kԨ\ ɿgw_N>8p>k絢im-ӻ?w}]Y8kBͲ8W[}Wp?S$W"JW3(8T @�@�8H\@�@�@�@�@�@�@�@�@�@�@�C ֯_?.)111˗/w=fϞsjŊ,gǎ.(,^*l) |۠VNi a=|pre˖ ]r%n@<w Zټy ۸qcп.>?ZA "5Yel2Y%Kkv n60K.L^O6M Y0ɉ,> � � � � � � @ TVM .=d}>/_^oW'֎;իWk9߿?EVӯ!1) 8m^h[,Y2neS/^Yg+>q-?Mk]l_CM}fc{ Y9S%\ڴif_~=³>CW BCfBuUbsLăNO:vX57{5{Va͟??91{I0i?Y~ '?+b}qzr֭.4_s_>>p>kI >L}\siizݻWև8xv}gzD۵rJ{ � � j>F�@�@�@�@�@�@�@�@�@�@�@�l?7d2:IB.f:n}i˖-n9stȑ䆴,Hk[:`�6Hv cp ꫯ4azʟ?*xlA ֭ <UX=dUYj&M5S؀Vڵk3u|mA]6IiժU7e8;i0`uwy^;zdgiURDe@�@�@�@�@�@�@ {o,?QQM6p /}t}mNw‘*c_Oqxpߊp5tStO_1jԨv۹sСCiӦW!)S9uThLljJq4XX~}SO=.]7^z%(P@ 6L?7k&4<[Y G},猜F7mРA9[l:7B,{/ e:hǎOdg~kac Y_zz"ی\|qCw uLv_q: Q .Vp|3Epsj瞓]{9U΋� � �8x! � � � � � � � � � � � @\؀ }6lؐZ)Çkܹ@*P>?߳gfϞ|z"$6(AF^'Ntg3Y?AқF´ZjRJ]' u P^=b73.X`)́VAF"u? 1eʔ,=gNm?K"l%%k${TJ_iQZТ~BJ,EDBRv/D7\{_x3g<;{?o߸_~g]E=CZj}Y*T(iR5bZ@�@�@�@�@�@�@�DZRǎ]_D?` 6oެ>}`>HFTRkVϞ={no=Kg[Ħ_CT1  نoݴB >kmSO-t+*VW_u8kV?ڇU{jrmE"6(6;kQ&MteW_R:>,p+!iB9Ԇ|e.=zH]/VBx@˗/v&Tìc׮]k. 8Pݺu :>}nF=3ڴi>b}mH߁1U6lg;CѢE]I  6ض/17Kq)\+ y7n\p|Y(ܾ}gJc) Lc=tPYP^L@�@�G@->  � � � � � � � � � � � &Sɒ%+I+V0a_~}թ[k^{׭~kĉ>}|Iqn۶ͭO2jl\[+(e$f1c01cƨ\r{4cElߡÑ#GVۿ-6̙M'L`.Vĉ:u~g~윬0ðat1֭[o'PܹݲY}%'OT-TZ:."ٛ<yr_,M7ݤ#G"1:ur`=n9Ӈ~#FȂcVDRJ{� � � � � � �YX pzSիӰ~eCfܴvnݪy</_^\rWaoMcԬY=s/aϭ{9wYf8Db }*V[aO[nq p[9]wB,ӆ d!]/v> -[؇ 溷Xh?|ʗ/;-Om=Mcg!}vmq>uq}\Rn>#CZb?b haD7pfϞ"~ڧ?6DDDuNg6mŋ^l%vv<'Yȧ~0B K߁eCzWsNǹ1 vfΛ7ßyBkl5c3]#w?mcCغsu}Y k׍g56]`{il۝曲o9Ls<@�@�@@�@�@�@�@�@�@�@�@�@�@�@�4!p@LCM 0xtʔ)xw?xEuWX"xaRnXE Ur^N੧rOL3 ,.]m(^|ŀWTeoFお+/+f{^Wȭg{_E0WL#_n]+vcvKVZnsV^W+\vwo %r;KkӖ-[q/W)x\[?@ʕ^Xsvbf$Lny x(zر<Ic-Z(^.,7Dk dsdȐ!ЦM޽{Jq/Bg+1Ю@B^[A�@�@�@�@�_?3@�@�,i=T{S+<W^&M!CN^1A!VDׯ!?ב={@ƌ>sE˖- D>6o{X VeCtV\yֳƍ׶?/"p ppe#^HU rJ}D6?Ycg&Plx!-/<`/hn1뮻]ט> xVcڵk^@I+ x!kpv@x뭷r:t(}E~'미dׯϿ_\/l馛ӧO?k"{ɱcvO͒%;C>f>{mǴ~/!~})W\n*T|駁Aya/*0lذ+[l`ԩt?{!Q/2zCt|g8us 1 (ܹs/xAO#jClѵ/־D}Ɏ}9۵W]_X>:;pzAp/}@�@�V4Ooviao$c@�@�@�@�@�@�@�@�@�@�@�@�҄o-XldHs¡QR88=^yC h̙Bjsֽ^(y2ƒW);{'Oyp^6/�L^ y!Pj W*xȯ"[K. _+%/h,^rx@ٳ(K<yR^Л6l{/AgT bW0M/�yݼBgڷo@7vmn{/MO?K[@�@�@�@�@ ^ji)B�@�R=}g+{s='@8_X_/Av^;vpϰCD朼e͚U^0 yAgmv1D~?S`mΝ;3L2cjL9`Qb}/޽{y}"""zj/^\%K<3=g(3ŪQ.c~6>|عDA|N1 2k륗^&/LH9rH}R/'ڽgq^XbJ= t+'{ITۆ. ߁ݟC"}zaMھ}YM3B9\Ls6 65Fnsklޗv_^rl?JykСCw~:rH*T(~@�@�H4oT~e׉/66B�@�@�@�@�@�@�@�@�@�@�@�,VSO%HORxj=Cjڴi}GԱc׋ ~֞={)dbZӦMv5wh׹7'Mkٲek.tw޽'O7ߜhNJ &SNZ`ԩڊt%~wUPA{Ϸ@�@�@�@�@ JTv� �Z`ʕn:=O-C8>S۔x>ҿB2zh 4ȅͽjԨQZg XG}~�׵kWB\ {Iݗí=tѽS\G\@U {v…5d5l0.`]@�@��Zqj%tD�@�@�@�@�@�@�@�@�@�@�@�" X!wީ%KS#v7ntQʕK}ժUq6ٱcGZ͚5Srml٢}?o6lVXW^%vnvyTFD?f:ttE?vOΟN<Ν;hѢHNT @�@�@�@�@�@�J*ԩSOW^}ݧ=zDx#ܞ)DaJ<_ri}wuad#eH۴H.־}{}z饗wܡ[+V<{^Y \%v_BG OKv^`}M4IUTq7o.=ŀ� � �@:?f0ڄ� � � � � � � � � � � �$/;j׮] &+TC]! ^У_|QݻwO>}裏t)UZU׿\0Y6$Y~X֫ZFRʕ"y:q^}U 0@u|B %Kc5\RJiʒ%K#{]_Sr~ � � � �a4� �5k[oV׮]eEy" gΜ7|OTLGSNʜ9s ~_jȑ9sf۴i.,>�I,zj5n8O,zI� � @طO*P@7O_?: Ԋ � � � � � � � � � � � @8~^x5k_1cFȑduYp,LeN eڴi۷>w.]1j*իWO7p&NH>*VP@�@�@�@�^@7 � :V\w}W};mۺ {l}@ X_%Khɚ0a"""Ժuku+�Ls9صkƏ?زeK5kL+VL&qLHwvO5uT[N{Ss+W~4@�@�'@VZcK@�@�@�@�@�@�@�@�@�@�@�HEk׮c=3f[nQ~TFTtJr X{N˖-s  &w_h6m,T AxϜ<yRz{ァcǪcǎ"� � � � ua~l� �D8vfΜBv>3eϞ]͛7wA 7sd0^#Bg{ܹ.c С KRșLRL2EӦM?E~\7x4hy󦜓 ۶m_/Bt!Zgc…= @�@� Pl"P+.Z� � � � � � � � � � � �^モ[1޽{ӧs^ ?^V^駟֕W^K=OjѢ+tfEʕ+�{Mػwڶm+37n+6%8k@�@�@�@�C@@�RC4k,s?\VZԨQ#5lPիWWƌSsVp@ Ysq,L˖Ϯ![U`~4#`!vTi8և\ ȩSl,P@9!Z� *uV}n{]h# J@�@� GV@�@�@�@�@�@�@�@�@�@�@�Rŋ5dM:UŊSntwhѢ9Xf}3FGwܡ~Xe˖MC$~vޭVZaҥK+؊Lu] ̙3U|z � � � �)F@sh( �p'Oj./ԪU#Gխ[78VVMYdIgJHOv?~ϫ[T)tM.oE]2OV#uҥМyi….+P͚5UF 7VPTt9|Gjd;`ʛ7ի4h߄) � ��Z jߎ-@�@�@�@�@�@�@�@�@�@�@�@ lݺUoF={ tʕ+ pصk&MqƹV{U׮]]';~|IkjҤFE\,.#wQv[okd@�@�@�@�R�Z)h@�Hw7|# qڵ.LB kV%JHg) ~0:bŊ~n0/<O@,SNiٲe.Tᅲ;wTlTJUZ58-_2et@�8r �-e?zYV-WvmY^tdh � � Ry@8 � � � � � � � � � � �Eٳg?Ԍ3\VVԢE ϟ?-s޲eMSSΜ9նm[uEuM> .]w%+p롇RSy% >}څ=:q Ҳ � � � ��Zs-h  �m{l  8~waA cɒ% H>;vO? Ⱏm۶)C .|f͚0֭[]hm?꯿R̙uW} ߩXj-Z4Lτf!6Μ9͛7²qժUڰabeh H8% � �P@_Toǖ � � � � � � � � � � � F<3gO>_| ;U^]M6U&M[!'`E,d>3YFsvj[M7ݤ,Y?z^zI9r䐅FYȖ]IYZ~\A=zgQ޼y: � � � � @ v!� �NĉZbE0@YS3j  AÓ,,~N~YBʔ)k&a]tQZgH֟iƍjV\F ޲!gΜ*W*wOjٲee!{2eJF$I!`.-$kڵ_huK>~]R%]צUTQ"Ey@�@�H@C;D�@�@�@�@�@�@�@�@�@�@�@�t}O]ە+W.]UTn]lh-YDwi;vռysw3f̘2O0׀;(_|իw<ya/cU+h1vX4f/,LmРA*]t8A@�@�@�@�T(@V* �Z{.z`X`ПٞSA  bA H@HH;s,�g.|'Xrڵ˙XH΅qX�0 �A|~ M ֿD~jUeUmylBw<xҦMݳ;dwϖ}w-_kS 犏 � �_@_coǖ � � � � � � � � � � � 9V櫯Ҝ9sߺbNV ^{{ζ,H~+bZ6~Zt,T+]tԬY3I&O vܩ7xC#Gɓ'չsgqSN4( j>=ҥ֒ @�@�@�@�!@V<@�3  >2gR?@_fgDsҺѣGe˖`rlܸQ6lpˬϊ svqa}YO  _Çоuֹ{Ww.p3^z ײ;ŋ+{m!DK G޽`gTRP+B6ڲ,Yc@�@�Җ�Zjߎ-@�@�@�@�@�@�@�@�@�@�@�@�hΜ9k-ZH/͛6%JPժUXreUPAVX!iX>?/_F+e@�Q͚5UV-WµL"YfU&Mtmyʕ+W4:̎r!,kʕLnZW_}u6ͱ"SNuAZY)YN*X`w̖ � � � � j%)7C�@�T ׻ qU,ߐ'Ob30bŊhѢn 33Eo޽{}v7n۶-sapv bhpQlYϟ @|Omj!B6B vH"*\/_>B�}0*piw޹s,զ:tj}$Yo߳-P9_) � � y � � � � � � � � � � �  X!Kt9ر X9X\9WNJ8Q)~ǏצMo_՚5kh=,<ˊ\s5Zj ɲ7m47߸F5lPZR˖-U@54oeZcƌф {nW4[nqcuUlR:uJ?f͚F ]M]vUz(b& E�@�@�@�@ @�@�$`Ao@ljFAӫPB.@,#t ,dΜ93iK߿_ևHXGhȦ'O ̙,;��@�IDATSfA(tj}W\@ %A ײ@ !?owcL2c~SyZEɔ)68qݟm1t޿o2 Y7?hզvΝ;:S@�@�@ jŚ : � � � � � � � � � � � @ ZjY蓍6Xa%Ktnj)Z+,!Cmt͊ X +a9XV kn_H"2 .X 0ˑ#G.piʔ)/t1ծ][v _Gim.jƌqղB(XfZ6V^ ?Slߺq:rP-Z~<¥ʹ@�@�@�@�.@V@�H Gu} ߁bAHڼO.U@7 Dʗ/_pb ~Zn᯿;ful ?ֳXAl6>=6_| S@ MJ}jS{aG~ҥsN=֦v_{[#v͕+ۆ Pɔ7qwo6}|>2>xY'k!ټ}:MXYt@�@�@� P+jߎ-@�@�@�@�@�@�@�@�@�@�@�@�D?P 6ƍyfeE%<ӧwř?V/dٳ'j/trEB _/aS+^;X) Ͳ1K*2eʸ e*1 Y�. ך5k+`!R~֕W^y,)r{+6`TeS e,5JbvLX YF+Wt!v۶msRW^=eS0 � � � � @ P+\K@�H~J-!4|;9sfZCΜ9]eh9rp}"O/"YL2ԩSFobԂ5,%teaZ6|TʮEh8i~0y{0 �_رc~$4t mQ v~Ȗcm6۽v͖-ݨCYݓCvm1>mhG6BT]Aj~ZLQI @�@�R@k;D�@�@�@�@�@�@�@�@�@�@�@�MXXQhر#̊6YC,Y@_pɦǬY*cƌ.(t:oaEO+џѣ ~v/lJYqB  < -]=<yR| ך>}+U\9e[V+VYYڵk]1 3WX1apV‚l$͜9sp4k+a]1 ;PY[}ҥ]WJb@�@�@�@�@�+@V꽶 � nW_תUԸqcuхGAN!OSX_ lB>B,YryNܳu%B#C g e}6}Qv6G#Ԟ#O/CG?ßZ?c`}bSbfaS'ѝ!�b:LÛd}#+F{elCG[n_>6Due}Qv18݋݋??gjR@3?,4,4�h4ȟL^#� � @J P+W@۱% � � � � � � � � � � � Vy+[N #EFӓ'y < y=N؄I'miJXp ך:u v*^ jժԩb-!^m޼ٍ[lq!d~ ó}-8}^ .ϟ_%JPɒ%hY) @�@�@�@�&@VZ/ � <۷oW߾}5n8կ__*UX |hߟqZ'_dRQYUCOam8_T{/<Q/3~Щ臀߉/ȑC6Zގǀ� @l,/lX?4ʟrE<{S>w#O S:\en94+|hWT~?<ߓ(OC>mݏyێ@�@�Hj;D�@�@�@�@�@�@�@�@�@�@�@�Ҽ�HX| ך2e~W(P@z jР+=6 � � � � @lٱQb@�@� XXƐ!CsϩPB<x vݻƍ/cewƍ…w � @Zoū9#� � @J P+W/}7eK@�@�@�@�@�@�@�@�@�@�@�@�@ժUk͚5.Pw޲Mpo]'O֑#G[E�@�@�@�@�@�@�@�d;w*U't}nDoVծ-?OxU8iIk'}m[p�@�@�@�@�@�T(@V* � � � � � � � � � � � @ +WZlnݪxŤy)_|jժƎB@�@�@�@�@�@�@�ҘݻuA*U ׯdɒ+V'we%!c}nr>8֛" � � � � �A � � � � � � � � � � � � <ŋW޽5|ڵK;nݺ@jܸF%+ŀ� � � � � � � �';\r^w>}fΜ%J$I͓ח*TΕK 3K-[J&zVD�@�@�@�@�@ (@V@�@�@�@�@�@�@�@�@�@�@�@�_^͞=[{՘1ctO>*RԩW_}U[lI@�@�@�@�@�@�@�ҐƍհaC=_fZhdSJM3~#G:NjNZDں5N2 � � � � �"P � � � � � � � � � � � �a*+W.uI|ۧɓ'/?%Kjժn t1 � � � � � � � @>}ZC Q ŋkʞ={0ԶtRQ&nQʓG4)LD3@�@�@�@�@�R�Z)RP@�@�@�@�@�@�@�@�@�@�@�@�,-[6lR|٣/R5jЛo+O<Ke&@�@�@�@�@�@�@�Xnjժ'|=_lULjigI+=[R0&)ԪZ1]WG�@�@�@�@�8W  f  � � � � � � � � � � � �i] WyQF1bvءN͛7ĉuתxݻϟӧOu.@�@�@�@�@�@�@�x 曪R{O?駟=O!z å~v$/{L6] � � � � @ P+\k@�@�@�@�@�@�@�@�@�@�@�@  O^k֐!C"Tdv9sץ^nݺ>Ӊ'R�� � � � � � � @ ܹSM4Q޽էO-^XW]uU$:%q[ҸqRϞ1lfo7h 'Mf 9 � � � � �a-@VX_� � � � � � � � � � � � @*WjZv~aZJ͛7WթS'}':|pv � � � � � � �)SB ڴi.\g̘1I[iӤY r0#6 � � � � �iH@4t9U@�@�@�@�@�@�@�@�@�@�@�@�%PlYW?~w=ڵk:t|yŷn_i E�@�@�@�@�@�@�@ իW/nZmڴъ+TFHk%?nQ޳~oFuv~֯O#_@�@�@�@�@�&@Vj � � � � � � � � � � � �Q-ZT>Νݻwk:uꔺwﮂ ziĈ.p+Y� � � � � � � @ذaj֬cj„ 5jgϞcTdモWO&$^*P@4)Aw@�@�@�@�@�R�Zrj � � � � � � � � � � � �D%/_>s=Ow^W,wzTHժUK6m,C�@�@�@�@�@�@�@ L8QUVU|ro>Ym:vm)."Y͐Ajݚ@Eeg � � � � @* P+_`N@�@�@�@�@�@�@�@�@�@�@�@�r̩:hҤIڷoMejРA*U*Wj@�@�@�@�@�@�@�HQO#<➙wU-rɓ$-'LKoMV$1۵V֮MW@�@�@�@�@�%@V꺞  � � � � � � � � � � � �Ț5Zh1chϞ=Uvm5J*TpA[?,Y@ ! � � � � � � �)ƍ뭷҇~7xC3gN&yu RjҜ9R<ҌD;hzRBĉvv� � � � � JESA�@�@�@�@�@�@�@�@�@�@�@�@ 2f̨ 7۵h"z뭚<y:+VL>ΝӧO'a � � � � � � �*rJ/6lؠ sΉzvRfRҌRѭ2KU>mF4)eV#� � � � �$�ZI@�@�@�@�@�@�@�@�@�@�@�@�HqҥS͚55x`WP̊uMW T`A}ݚ5k?Ώ#� � � � � � � ^jUZTdI-[LUTI1BACC)SdkJ];_5kP�@�@�@�@�@ / G�@�@�@�@�@�@�@�@�@�@�@�@ *VkժUZ~{1hB ~uФI'u8 � � � � � � �Q 6LZRΝ_*_|Q w_X^ҥK&1jז &NL6pd@�@�@�@�@�!@VʸN@�@�@�@�@�@�@�@�@�@�@�@�(] ZxmۦAi߾}ԩ+>v-hъ(@�@�@�@�@�@�@�-p=Cݻ^xʘ1c% }Uj,Hm+M � � � � �)L@vh. � � � � � � � � � � � �*PHSsў={4b=z`jذ|Mر#\Ov!� � � � � � �"ǏM6շod;'Nw٫':$[[I&src"� � � � �Rʕ � � � � � � � � � � � � yꮻ̙3~7N =bŊmذ!ME�@�@�@�@�@�@�H)V7믿V퓭--gIgϦf͚%[{5k/ MG � � � � �)E@rh' � � � � � � � � � � � �)T Gj׮&L}iƌꪫ\V2eTbE_VJgH@�@�@�@�@�@�@�IjԨV\yN:ּ E^['Eʖ-[)9.Զ4iRrc"� � � � �Rʕ � � � � � � � � � � � �,Yyzg͙3G׻ᆱJ*tzG+3@�@�@�@�@�@�@�R`޽m6}\rRcTdZ J l աCK+/ڵ֯VH+gy"� � � � �U@> � � � � � � � � � � � �$@ ԠA 62[xZniӦVZ*ZzBN: d' � � � � � � �W ""B7x:NW\qE5RRLi.-M4IrRƍ]y5.&NLVpl@�@�@�@�@�p P+mC�@�@�@�@�@�@�@�@�@�@�@�@ KN5Y/֯_UV{Zp+vV`AuU3fбc҈ � � � � � � � [ܹs&/)ŋu% K/!&LPV9sdjY];㏓�@�@�@�@�@ < B@�@�@�@�@�@�@�@�@�@�@�@�H*T3<+Vhƍz'n:lRW;–;tPv@�@�@�@�@�@�@�tM=_.VX|`/V-/K.)6mҥKաCdk[8n�ph m@�@�@�@�@�7@�@�@�@�@�@�@�@�@�@�@�@ ̟?_}Qr4hf͚Urc.r=#Zhvء_~Ytµ7o{OK&kk:u\ZѣձcGu]<yÆ s翎<jﯛoYmڴ믿'O7j � � � � � � �)Tvmڶm (µTbz7NjB3[aa.z3qޛs}+ջwo =OmcAXuĉ Co7ӨQd^y啄qiƌ*Q楫1 � ۷oȑ#ݽtРAJj͉zv� � � rJ׎#� � � � � � � � � � � �)N 40h˖-3f֮]VqZbl!.R=ꫯgW+C ի *nE2X… 믿&:uJZrW>ڵk_>lɋ/ּy#DTzu-[LVo߾z饗t-رcnD'@�@�@�@�@�@�@�(p=hɒ%T\9mܸѝFL]cz?o!~+ihi֯_=3~wնm[e̘1NΣGȑ#gYfzߑ `E1>wC?4w\}:|8`a![n%4$M @ ݻ}_{i\:[KesE�@�@�HCjͩ"� � � � � � � � � � � �)`T 6 [;URlRǶp׻(da<ydӧ¢Ə/ zꩧTxqըQÅJ[.Y[\Hw… 3<9sSժUմiSӽ/:~TOoCK.Qj4p@FܧDߨ2@�@�@�@�@�@�@ \3UREJ jkB=?S{/KKI֭eJ۷36߳c\uU9rdTE67yjm"CdvpWq^š]ݻ'Q5 �&`CΝ;գG]wu{� � � Tt19@�@�@�@�@�@�@�@�@�@�@�@ |I͝;W@ *<@<g,(gΜܚ͒Cࢋ.R۶m5n8۷OfR ꫯ g]}ղ +V$ygϮ Xb.Pwq_͚5 [nn/nVdI~pH3L"3(SLpM Bl[? � � � � � � @ =z^|E3ƍ(]t0P+13g%I/$Ug8C~"o߯/ y(_n >w4qbbU:ur=kk_f2E�@ lҧ\?MZn C�@�@�o:@�@�@�@�@�@�@�@�@�@�@�@ E;vLڴi# z's`-L_v/ݻ׽߰aC{ڳgY[@SO=͛cǎσ:uʅ'jJV0GQ&M1l po޽eC q7oZn-{ѣOzOM6UϞ=_߳iӦk׮};yt3g7߬w}WvrAn3f(_>}h…:c͒`BdE?| -<bʕK}37mѢEjԨ,X/ s :ylm6EDDő@�@�@�@�@�@�HI/HY{VJrzO/R۶H^Æ ʘ1{JЇ~n=6ln&}ڽ{wpo&.](k֬.`_|}*o|쯛S>X =]^zo]woƍUn]jҥKډ+υ;xc}KIv|r :4½]6<nq~MO?YŞ?쳮I[Cd}]BɄ< @>bt-{믿Kݏ~k"?7K_Eܓ � � �$�ZI͡@�@�@�@�@�@�@�@�@�@�@�@�(pk5{lW\UYQ "nV]qn h4h@?W$)Bؑ?l޼Y5kTb\!,+e}ʝw CX#+2eaXvUB}seG@%z6Tzu:tܲ,۟ۏ} >\SNڵkfc^{5P<xjԨ¹+1,2dp؊XZYxڬYTN)R}.+HX0K._1.sU@e!`b?W0c }^6 2erYV(eʕ۲s;J � � � � � � �)LZF;uimٲg轈\6ѽx}9s/ܵXBOI&ɓ'o{^m,Hk:|F{gϤyq>@m>j˥$/aĈ_@f;tl9r87wq/n/`e? >f`S9~ڵ]_lٲjժ-"ٳ-Z-[3w}6tYӧw}mucOS@�)pAwOڴi<Cd^jY_I HsiAև?P+{ҷ~W^y%ȑ#n� � � @ly_v C�@�@�@�@�@�@�@�@�@�@�@�@U.QΝ+ *SV^̙3"F?Μ9Vd[jr *cǎʓ' ڲJJeD~HbYa) Mի+`ŋg3HڱcFׯW\leŔTƌ]!&+aXεwV+hY, 5j>O ?_~TYq2 t˝;,p>s7JB|AGPR%ZJ˖-sB?\[-.oy 9s {2+u嗻ꢋ.:g; � � � � VEǀ� � ?zɞ.YD9s<lO?w}z3^O *V~}ĉXF }jӦۨK.گ`߄=j(Q {wy:D>TXSrcexaƍթS',XƺvO?=0`y=S .F|ꫲ/Sy*R{fo!&6~�o[f]VBl={nf/e޷e6X_Yfq+ @eϞؽR}v׏16R_ٽhڵ*[ϋ/M裏~tӧ`\S޼yYرc]_ *3� � �6?]͓qh,"� � � � � � � � � � � �MxAZ3\e-[ �* +`AB`(]haG'OvQ=\�V9\)ۮpn-[HF{!Cw9u> 3Xe d\f:߿_UTь3TvmӭcN>VZ۸uV:kH6 ,_\Vꩧr֭[XVlܸqP?gr-+y$ݺu2L<xڠAdGYreYY � � � � � � ,~ Ӳɝ; Բ`l$/KZ(0-kio^^{w`!O-[67[Β7\uU.0:Duc} @ާMuX?СI&)SB+~( y,`Ć8uX ǎsӏ>Hv?w}n)Ypk6~x~lw  @׏W aZ`1Sôl?=K/ȑ#1aZ�� � � w'p6Ð};Wv +P%R]UITPm%]% YƾDe|g93yΜy#@V<@F�@�@�@�@�@�@�@�@�@�@�@�]ҥWD!"]{}v Ev-<ՒZO?ֵkjǎn_,YܱBHy)QZlŋsk~eF'NtZa+Pbz!Oxo뮻dΞ=N_\.o֭[y晸.>bUO?-[P >׽`}4~xWj ;}"$VܭpWoCe9sʊߝָqNg? � � � � � � ӧOרQdc7wcѷ_z9[')+Z5={… l_%ۜgͳ x|yyR<ww{LZ}3{9{:x{ЖaÆnݺ:~ ynI޹hX?77Sٲeݹv͓vI"�@xyϼʋʓ'Ow.eBK-رc.1߫3!I2eƵz><F�@�@�@ >b? � � � � � � � � � � � @AA~}iQ+V{^Pނ y-[6wď?xőgΜѡC}3pqƹBFC Q׮]e>t5רf͚Oŋ.>kj߾;x)Wt)I'v튾~ `V7o К0a}OH"jذ~mٳ'ѽnV|kΝQ믿tU\9<Y({G{>W\zsE�@�@�@�@�@�@�|N $$D?zbZv|r.ՠTxi*D]Wjq]trpqx;SWѼ(yJԩ7(P=XfC95jPZdn;wN3f̐XH֘1c|HMaXXԩ׫snɃ>֒c7d @:r};wlYٳp]jٲf?>e"';飏>wzɈ�@�@�@�%A�@�@�@�@�@�@�@�@�@�@�@�E d[dIc~'e͚UޢPVȊY8UB+reMkFBhtwTRz7]�W۶mճgOwgy&BFvc=cǎڰaǏG_ 6rŊ0`)?T O<z_ѣ"^SUxq 4ȽP+m۶%zeED08I\߬WBzʽWƂ� � � � � � �Fx!x뭷Frj͞-5o.5n,}+WMpc"N9x5qDz#=qry©$j׮.Q^=[;(?sXfG^\=l]wݥy_~Q˖-cߛvڥ~`{YfΓN<B�Ho2\#[O8O>${6/~R/_>YWKN^Jcǎi޽>@�@�@�#@Vb8@�@�@�@�@�@�@�@�@�@�@�@ "En*zw] ;`.`W޼y9EuSV>Ж-[\!iE˾}C9sf=.aÆ<x ƪ_ʔ)# 3ȑ#Ν;dȐA>\ʕ+nʥN:E>=yȑ#>+$adΙ3f̘)\cǎU>}ԹslYlٲ]vÇ5w\U^]o*VJ*i᫯q܈#bZ{=~+r /hʔ)3f,X@�@�@�@�@�@�g+uV}k 7 ?pҥxIm MKjQloϞ=uQ7'OFhs.l.ל^?9då;S͚5s̙3#n'kճ>[kOn.w<Ş'dG|^;wn*Uu-dDb}϶z 'N@�(T~Xݻwwߍ~u79 .~u/^7꥗^r׶G oM[fM͹xe^u"_ � � �O 꿲#@�@�@�@�@[WK��@�IDAT�@�@�@�@�@�@�@�ȞKo[~iWhРA ҡCջwom޼3_|P;vg"XtS0 Ѳ^|E_UT_@Es8 슾X뮻N.+eϳg 5{ڰaS >X- {\qƹ"H׼ydŚ,X l8q+qm/ {;ާ T<y+NRti`}yQϟ9s@.ŋeF/=… }_y7Ei^{5f_]vǂ� � � � � � �+4l0*[lagϞuaV :! 3HK3r`,?3UZU+VrDjTvm?q lZ.lObsb Ș=nYE|s* oN܈i2 9=:wl,#o޼J*9[Ѯ];܍nٳ5tP7ϻm6}5ǣH" -[6uxhҤ{{qQԯ_? 0= Sz^'Wc6O �-?{BFmȑ# /ᒐRie6qnΧE̙S˗w!j*7sٲe}3eA�@�@�@ @?] � � � � � � � � � � � �$D OF*Q6n)+caX+Z9{G|y7%ӧ] ]^{mi`d!]sۃs)K,ؖ)Eo:!!!.»2O+5sLn۶M ]w劁XL2E߿ʚ5kĶDG>n:r+U`Ȼx� � � � �F*U)2  � <nI<KsIpmXb.PA >/{қoJO>yOۜE@+oS ̣^zI+ye\fab6mRɒ%UL+`õ{nYG ׆q)8#mg*cSvL{@ }Di%=hߓ"4R;… ڷo=s挛hᑑ"k@�@�HRÆ ?#%x � � � � � � � � � � � �$Y r$_H2gZ_|,hZnµZhG1]C�@�@�@�@ MJS~n� �$IgϞnuƍ*\paaI9rTn|8#H'K'Jߟ#?lL8$$&EA*+'}ԤI@�`f�@�@�@�? P+/XpOL@�@�@�@�@�@�@�@�@�@�@�@�={QEsIfs:XΜ9 *THo4ee̘}+V)̙3FVԵkT7B�@�@�@�@�@�@�#h"?^}Y´AAAn7ܹstg}VUTǎ҂W_IGN kw,YsŸ6~' NeJJ} 3o5iORNh  @ 2)7D�@�@�=j߳E � � � � � � � � � � � �ȓҖDCj*ݻ7J\lYA x*Z+` � � � � � � �"pYO#jݺ:t萤^wYk׮MOgT͗M1hT~ ԯ]SL׷P<~"G"�   n"� � �(g@�@�@�@�@�@�@�@�@�@�@�@�4j$U"98uꔶl͞*lsoVƌe+<<\KVӦMշo_UV-- � � � �) g�*D�@�RHgxjѢES._AE 1i<r(֭;kO5dHԻ1wB�@O-?yh& � � GH JK ’̱ � � � � � � � � � � � � �Iȕ+ԩWmYtRm߾][kԨ{Gm۶UJ"c@�@�@�@�@�@�@ ] YFoƌ 72e/JJW~ՙjrpn]ʇ E�@�@�@�@�L@�{. � � � � � � � � � � � �@lA[ǎʕ+5{l8pʗ/µ,`f͚Z� � � � � � �\@xxz[oU=z+%u;JΕ6aqT < &](S15堹2 � � � � |m4 @�@�@�@�@�@�@�@�@�@�@�@�XUV;v߯Ke˖OUV-*UJO>{Ya9@�@�@�@�@�@�@ƏkjԨQ JѮxYհtҢEi(v".ޡt`A"NP@�@�@�@�@�t%@Vz9  � � � � � � � � � � � �G 2nӛo]vV׮]ߪQF*\y͝;W.\H @�@�@�@�@�@�ұѣG /'P*UR_|!h!q4g#Gގ'Bti[Sq"� � � � �+Ig@�@�@�@�@�@�@�@�@�@�@�@�@ W!Chڶmz)[N-[TԥK͘1Cg pG@�@�@�@�@�@�s(k֬<xpd}{{wO̙Sv\< :HzvBN@�@�@�@�@� P_B:� � � � � � � � � � � � �,P|y=g;p[}N8L@�@�@�@�@�@�|T`͚58qx ȑ#Z9t#R*r\Nj¹ � � � � �*?+G@�@�@�@�@�@�@�@�@�@�@�@�@�h%J?ŋzwtOQGT`A5o\cǎS@�@�@�@�@�@�@ eBBBvM|IիWO;vb_rltIzAZ#GJ'UFJ xU4ujJ݁"� � � � �@/7!� � � � � � � � � � � � Qs{7Q+']w]m<C�(PzSNiΜ99s>}nݺ{ZLmwC�@�@�@�@�@�@�8pV^W^yE:tP 4m4-_mO n.3}<])q >;^UO:.\(eΜwz ��5}5 � � �+tɳ- � � � � � � � � � � � ? -=XZx԰aŽ(H]gj.\N8jժEkU\9u@�@�@�@�HF*U#Sf@�@ Fիkݺun_r/WGxl<sFj^ZDQۯjRңJ7JVI1cj{!� L}s� � �$#R.j%ތ3@�@�@�@�@�@�@�@�@�@�@�@�Sw?<(}{@ .z*-ϼqfҁTlوpZjy~eNW � � � �\�ZW+ � ɓG'Otʐ!gArʥzKݻwO Ξ F<8!y_KO?)3fH,-[vu -ou!c?MD�@ IL'!� � �>%@V_h q& � � � � � � � � � � � @(P@j"T{)Ե+aZMx/ Yf=zBCC|riFӦMSڵUdI=.t+,,̗B@�@�@�@�@�@�@N:eʹ0-[N>~XժU_yRϞQO }~}y@K ӊV7 {LZr;m9@+(7O@�Hnk&(C�@�@�'բ � � � � � � � � � � � @ XXV\_I:u@W<իÇ+$$D֭Sݵh"O*\+d7g?WA@�@�@�@�@�@�@l 2i&y睪UvӡQ8!M/ xҭ^aZ\P!i<QJ].7B?of&l@�HL-=C�@�@�[ ۇ � � � � � � � � � � � �[ !2e5m)M7ݤ_|Q7nvOչˊصnZ uҴitiF�@�@�@�@�@�@�عsg7 SPP*W뮻.cmСҹstIzeg.i)"-]*/e8Gr疾Jʔ){@�җ�5Io@�@�@�.@V­8@�@�@�@�@�@�@�@�@�@�@�x9 Ӊ9T˂z(�@ ] -[V իg+:t ղp6m?e � � � � � �\@HH2gE,Lwޚ8q2ēo4btb .U$}/_}<}Uߏ5> �@|5|:Ds@�@�@�H�Z 0@�@�@�@�@�@�@�@�@�@�@�@�]\YXNPB�.PxqW .5j(W^*T5kѣGk靂!� � � � � � @vc;_~nт[؏X\Z$m2fmh"� qG@�@�@�I@T؆� � � � � � � � � � � � @˖RWZU*[lA�+pת{={9)S(0`,xnݺzd6  � � � � � �//؉qwF۸e4i_vpUbVx-Z5)8ʶ& oʓ؂�  0_ӏ_<� � � dLlj � � � � � � � � � � � @` \sԡ)"F>s!@ ̙S;vµKUPAÆ 7ܠnI/6nܘ`M6j۶N:8@�@�@�@�@�@�|K`16h4hPb8`1cL{.otrV撅o@ҬYRRhUSz@�G � � �?h4:H@�@�@�@�@�@�@�@�@�@�@�@�_sW 'H YdQ֭5qDY(ւ T~}7NUVUٲejժUdbYfyiٺvXd3 � � � � � �ŋݸa=Z9+V3v(y.bL6)dIf̸ZFnjx� @z`fz}e � � @lj&v@�@�@�@�@�@�@�@�@�@�@�@�X7翼ۊի'+@��VӦM5rH۷O+WT۶m5sLխ[W= z E|7uTeCCCu-hرI@�@�@�@�@�@�?ݻw+<<<AAA4iz-!~Z ?ƸxW*ϵ^b<~"Ф4tyD,3F< �#|̀y( � � [@�@�@�@�@�@�@�@�@�@�@�@ VK U=`/  VN:z״c_^>.]B .nݺ-YjUXX ܲz:tt@�@�@�@�@�@� htFτ?\]vؖ!D^-Ϙaԣ-H0k'\)]+=9sxH[=?%UT �W%|ͫd@�@�@�?E � � � � � � � � � � � /t|P'6/UjРA.Xxm۶MwujԨW_|n&mذ!.#� � � � � � ܹӵ(SL5kڷoKK0%is^xAڻW3ND]D`dDˍ@@�Qg@�@�@ p.y>=G�@�@�@�@�@�@�@�@�@�@�@�,_)44Tu SNp89}ʓgn}2g,+~e?<U7o^… H""WV, @,wEV^詔f%GV=b<&-7;{Μ9?ӭܹsnضgjLŋe9Dh񮑟y*zWs>2?39n,Y(5kV~f˖Mٳgw=3>-y@�@�@�bhHRE92#؎� �9�[7yL;e?mL+xULcVǝ?_|֬YGyDիW2g1ș3/ćJݺ]Բp-%ԯ<ci]q8҉9rD6~fy]3&yN??ezxF>w^ *= @�3k Fs@�@�@�D xyS JK &�?@�}@�@�@�@�@�@�@�@�@�@�@�<'Oj˖-ںu[7ݻW{ѡC\q!Ue?-([lȂVo\PEA0Vyø~VȻ5-%KDeʔQJZ|yW8{,?@ 081g Y:wqƹ@1-"he[,c+0jV->S-*rxUǶb8sV qLaL^[.~ ղ‡9r|GΝ[w]cv>  � � � j%&B�@�_1cǎ!  u<۸:u*Ed˖͍O1(em*z薍QE_\�vw~SH{VjzBBՠA7H"!ńGl<}zIAACTT37h~z߫c>]@7µJ* *9,+VTeA�@*yx� � ��ZI Jg"� � � � � � � � � � � �>/p?oV^~A6mrVXnᆈ@V… Uyb)|QV Yq.+eExY;v YҥKjժ][k֬Yb{@ ̘1C{oeٗ_~ʕ+_q^Y@[>,lǶZAo!A ÊX@ �9,*c `(ci];{ ز-=ضEs %OXH̟?[]Պł� � � �%@V\:C�@�_1]ou.<dPEu^Z"Tyܹe٘}J,66=ƈLOvaGÿ5=c{=Iu&zT"]/_` l-S:-[^(i?lʪU~z7_,^;Rd(Xy&jǍ˨޽3pCE_c߱[y.vAתU+b@� @�@�@�WϿKK CRzNVR8@�@�@�@�@�@�@�@�@�@�@�Q oݺl2Y[,4[nQUR%UXхXA"_X8jYQ-[x bqBCC]$koռys5iDVԋү@N4uTYq,N�?oV, p&+ 9)rȏ0Rx>eI3+ > ȋp*TȅkYD+}"pƂ� � � �)@V`@�͛7qs;uڹsgD`u*UYP#³!Zyn'f6y1oؘyC,Lؼj&̑D'ꄳgjҥnbOX в 55k*{],H|e*Ck|07&Y^=~n}ٴ@ @�@�3t;D�@�@�@�@�@�@�@�@�@�@�@�\ @\R3gqFeʔIuu2kvAZK&VjZj,XuֹV֢E kNUTIʥ9|T YZh.\d ڲBeF^,T)[lZժU]@oR…#f4O:Vop=Vξ?>|%KXu]2eʸ5W\~A@�@�@�@ !j%Dc@�@ lLc͚5nݰal q!P3ge˺ ec^, ;wرCZ0#m۶MvqoQ6Xzu|n$]f̘sjٲe͚5P< л~Ʌk-ZHK,mF ׺մiS7o'邜� d/?i � ��ZIMJg"� � � � � � � � � � � �i&b M6MӧO׾}\VZD 6TӬm)ycǎi…o5{lRbEuA۷WʕS\R@̙3_#V+fgv’̙3 <�%J@?)Ba2/?#,|͂ݫ={Do#-+g)#ʕSܹ# � � ��Zb@�ҋٳg?jʕZjV^ƺ%KtaNdNZpVpppzƆ6n_daZZԩSGuuk2e| 9,Zl͛y,ŋ&'K{.\~m_YsZ6µ]Nj.��5״]|4k�@�@�qt;D�@�@�@�@�@�@�@�@�@�@�@�RU:M4I~YԽV+h,_܅͜9ծ][{vfh$?i&m޼Y[nXwޭK.)((HŊsHld,D˂XH {oZ;wԎ;"V{Zh}zW+ dE-yoī5@�@�@�H~ߔ+"� @̴d-^駟d; iZV-ըQq S}5k\ BmذA/^tc 4PÆ ]@cȍ͙3Gcƌ'Ou]nKf\8Y9x?{GyD%J4��5׌3@�@�@ !j%D)cԊم � � � � � � � � � � � X�믿S*SLܹ}QW\g 0 jܸq5kgϮzHsŭҸyBak׮uqFye˦ *DY˗/eˊ {|/m6js˖-:yk³`- ^[=!C D�@�@�@  W"� 7oٳ]uy+WNT~})S&,`htRXBJ.- jٲnvȑ#mlȑ;vBCCEϞ=զM7m ф 4qD=zԽ_>R~\@ %57@�@�@J@q& � � � � � � � � � � � B3d͜9S+VSO=N:_YAwy%޽{9,Y{FMBrVLt!Z'NpaBUZ56TJj גV%N`߾}"Juݺu.hB,nR͚5Uvm^G#� � � @ \ @�ײe4}t}Wڽ{ (-Z&Mx�l hժU7߸`5Em۶n-TPzr#ozi'sp ?3@׃Is,@�@� :t;D�@�@�@�@�@�@�@�@�@�@�@�RD`Ν0`f̘ի_+"K=>C 6Lzb./R\ ,,L6lp׊+3rʪU U*[l)&n/ \pjY֚5k\!E+t9Sn]vmnߗ̙3Ri  � � �Z@t9@�RM~Д)S4uT:tH7xnjʍeȐ!Vѣ7oK͝;WgΜQ ԥK{ʓ'O60n\ÇkkFO>ܹs'2K,/o>7G"�)|y]<\@�@�җ�ZI= Jg"� � � � � � � � � � � �*`W_}U%JiӦM#/vE}.€,`G", 9.]ƍw߹BN:… ^zn ˚5kb/_~VZB,n׮]ʒ%ԩM„N"� � � j:D�@ }T4iƏ۷N:CG'U X蔅$}gꫯdڶmG}T< _ÇS~={d -lcɛ7/4 �,|͔gfʸrU@�@�Ot;D�@�@�@�@�@�@�@�@�@�@�@�M`ڵҥ낟~ieΜ9ٮυ] ѣU~}ŴX@ ̛7OVoqJ* Y L2QO$JZd/^֭[*W\j֬Zl*Zh � � � �Zq@�qzKw_ݻwwZW. 矚1c>7T\9=z-[6`:y)S}>|J,mF^tI} *6n_O;@�`fʿLyc� � �/@V_#nǙ � � � � � � � � � � � @ׯ4h *Q(YXc?]*44T'OVVb=_n={v5iD͛7W-tu D M,`ouavêYڵkֲe˦I) � � �I@j@�RV`ҥ N:.XB2gΜ7N`5j>C멧?|6ƨΟ? &/{µ~i 6̽WR\hk|n � � [j%ȐS9@�@�@�@�@�@�@�@�@�@�@�@j.^ݻI/ LjDvn5O?{U6mꫯ&DB Xa.+ְaC/^\T}=zMV:{o .\X<L" Zz ʕSjoZ� � � � � @:X~nv7~%K-_\+WT.]JoZty~mݻW>FҥKk.*-=N[oU˗׆ ӊ +Ν[&MqƩE|@�`f&k:4!q  � � @ ],n@@�@�@�@�@�@�@�@�@�@�@�@�T8-]Tz4zh=۷F !b ޟ1cϯ:-/O?T}v!C ڋ� � � @ 4j$O<!in� �>*k0a6m*+7hki? ={V <yhԨQ>3_d̘1zO/ơRf!fZR޼y`(P @�t*|Mxa@�@�@�8rD*XPZXj0H"}@�@�@�@�@�@�@�@�@�@�@�@� Svj*-\g#b25I, 5?e=OTZ55nXV$f֬Yڳg|M´|%ED/_^ֶm۴|r-ZT:u_ .9s&X � � � � � @̙ *𚯾J'L+qY;vy.<ЩSq?waZ&gDŽi%qBXjU7hkwɄ1 �0_3T|TV � � / G�@�@�@�@�@�@�@�@�@�@�@�xǵxb}7Yu &OB3&@xx&Mr'P6m\ִiԢE @ڵ5~x'Ԉ#Tti.(:D@�@�@�@�@�H# Vׯ?i&yinhرckŊV֭[& }zA4i7(Q59q^g  0_lk&(C�@�@�ҧ@%ϒ>F@�@�@�@�@�@�@�@�@�@�@�@�:u:v3f{p ^zIVRXe˖ =cʚ5kz@�5x`Y]a=p@�@�@�@JF*U#@�,gϺO #w-[�)?C>ϟ/SCjժjڴ>r XZݺusϹ@ @RT?)o@�@�@  /6LS 2Sci+ � � � � � � � � � � � 'NP߾}ջwo´".]5tH[~hţ&NN:[n.IeQ=\(Ir_!ZΝO<&MqڹsfaZjm;S }<>@ڵӳ>eO. /{OZrL_tҚ;w_v;cƌڵ~wz�=z_F#� � � � � 6ֺuk_^+WLO9syzR۶meW<Sʖ-ƍZ8#<)Sf<dP��@�IDAT1bڷoXMjժ^/͛7'tG�0_3%Ktw\1WzW<"{~'O}$ef8@�@� Ŧ � � � � � � � � � � � Æ s xWӶ!>t/RիWwŅ~+ZvEW03<:ȊH 4cvCPPƎ }'W{9G M߯ pUV7ߔ`K%<<\7nԺu(ڳgb̙PNj3{D(`|kǵh"͙3Gg\}1?m^ߴ{n@kބL2-[Bjժ 6$� � � � � @:ٳ7t PB:e»1%nWr_/^|Ço߾ر6mۡɶ}͚5Oe1rȑlM/z뭷4am۶-.j*UgOMxlR7o /Kp ׌uk޼yQs}Zh!F<X'Ovo>|pLk&S@�@�@�� P+^l� � � � � � � � � � � �i'p3ƅ]ʕ+Cw̙3륗^UwiȐ!QsϭCr/V0sz7\8pׯyw3_֭[!C[nEO?/P6gR 6/_^}IP{3يD^|OcjY1,YR/VհaCdE@�@�@�@�@�HSjʔ)9s两__#c<1Dr+_]S.]tńcl^D͚5զM$_#~z=v³ZjҥKkXb^ ٯJ۷oKq. p׌%ի{A+V 7ܠo}<xP3f̸|ͫ|@�@�@ >J @�@�@�@�@�@�@�@�@�@�@�UH?1Âu, RJ1vfƏ"E;8Gرc#%烞={�͛7'e)*`Zn vY1-_ ˓'O)888Es^xA-ҥKsZkg-<e|OǻBb{O۷w߳ǎKOݣ/ � � � � �$I>}nK5IIm(m]}< &'&DgW =裉>7pYz뭷b;ܟ ?VBYcP7|ŋ{%C�xkvh}l.Iv:䶭\2b|j � � �D P+@�@�@�@�@�@�@�@�@�@�@�@�X`ԩ-9UVԩ曈Xaٳgm۶OV$;o}sWZ}Yf֭>k֐!Ck޼yovc?GrʲQ Ν[_oɽԭ[׽N~mr_!bvڥO>D\sM')cӧOwA 5k +.wjҤ&OqCsӧ>z(si{]�?G`…zduɒ%̚5Kvm ׿'OFK胙3gb>#m>6=EwܸOO1-ZD&!!!_>,3C?c}:uꔦLKvu뭷 6$):~F_~Y{ճ>6mڸɮoEgAe'NиqԥKժU˽[lqôiӼ)UgąᆱkV Hp{@�@�@�@�@�^BlƑRsk\=14hj߾Ol;nJLE4c ׼W_}U+VD49Sl˖ۘϲebH ?(Q5jThcb[N{6Zcx<snԨQ66vm6kSj2-[;bA�Hw͛H%] 5w~9iҤ(s2Fe=6'WY_Fc w5?y5z� � �_5z� � � � � � � � � � � �ƍ]VJBtnvYQ+c-b,ĊXȎ-{ѱc\]jҥWlRVL'رcu-[�kԩXX *… Ok^V[)rť ,_UJ BTVM6mJr-RT~G{B }{q+c!~dV,jʕ*Z>SU^gYpRzdz'NT9-B~gy(P@#Fp:w>,LЂ/+VtdZϑs›nݪ>}V-k֬/s#<۷+{.lT0eE T1ckRq}86w(6h[`UT)ge`wHɒ%c9Z~`smeʔwm۶M<f5`ƍx@v-{X[-lΜ9a-0i6o3�>0a b7p~{վ?-W ׳0-{?Z@�@�@�@�@�@?Z, qXVӦMݘȼy[5bu6y,\駟=K/j޼FTl|?zl˖ۘOǎch*a:"c6g N5ڣG81CƄc{=3g6h;6'%buo;nN̙K/5I7|WOkq @ PUR:_3,,L+߉+unSrd1_|)"\@�@�k ~z� � � � � � � � � � � �Çc Jٳ+D5tPwف6l[! A/q{*U\++Э[72l0X2m4}jҤID  $bA<xg"_׻\SbvJkɓ'Kr5i$ըQ#Y*Uɓycp+(<<\˖-s2frdA~eѢER Y�nx.@>~wf 0 ߲{zô֭['Yr,l׉łYd]_vm̙SAAAs۞kgwwPRTiǟ!H! 9KD9!>.(Y�P% HFtȂAA~oo =9뜢+SO\ky:u*}z, /܂:i֬֎cjf!G$fomj\3gԿ/e /^¶3~mM?~笳ܹs˾wɏu v>ji6@�@�@�@�@�,`C| lݺUϗСC`!V XP"k -ke}*WBޫVO.1ؑaEŐPk\eYbmx^O?ul-ڴ+U%Khn'O=@Z:ydZc"�YR5ϿC @=m{[n:s{ߤ@  x_3 P9$ � � #@�@�@�@�@�@�@�@�@�@�@�ȮaΤI\) gϞUj\hXKٲeݺ]7v-W\6qWk޼y8quLQ|yoT)R:#=>}-*W\U|F XQցXYub^`]˖-u%hڴiNc>@s_,8.rw 6p… U֩Ye۷6wS!7XO-,;-DA`.]au" 'ON=7޹3PE mرcz?eu ,тG%7@fbŊMXP6*W~{b},aY(}w1pi}`e@�@�@�@�@�0M!]=1m<UJY5x`}IBMjUbWڋ+\ǻ>ߥzzeiZ/'5.woyߗjû;d]^Yk/lm64iD=q3F:ur@ k $q… 5n8Y8dBc3sLom3f( z@�@�@�REZRP@�@�@�@�@�@�@�@�@�@�@�@ .޽;^~z>:;-[7Y 6x(9st?-}myZ 9mҩw(BTJ.}޺X`ʮAV2Cy*c\_k׮]Zb:wc[v?Gޱ-liӦwϲ+WtJ{Xn,x޸vZw?;ӅnٲE]w #<~x;K=׫[B1NhC.2o7@4V%{;d_~ejJ ;>)';֎ ܹsݿP(e@�@�@�@ NآGS9}FՇ"� @= Iڞ):XBbxڴM|ȑ^L$Ĵ 6T.wCɒ%ošv׸܃-O6'jڴiڴi ղ`W^y|n!eD7o[qZ KB4-1@� 1b~TL 2$ޣaz={t0׿Zt{ r@�@�je H@�@�@�@�@�@�@�@�@�@�@�@ s\|ŊLzرc:XI6,X ƮʕsK*cyZ}Q ^ Kٷoԩ8-g[n!:5bĈdO벥r: |Իwodǵ`= QڱcnTYW\/BoF~z[7o(gΜѣ5n8YOo1 䞛1 LJ{[9cǴΞ==z:5k\p6ߧx+O<aÆY � � �]_? �V}Zhvڕi㱶f͚iŊ];YGb[%}%1mC 5p> 7%&L%\z?a iZ_z?~܅}g;vN`mlղXlXdz-[z[ԚFv@�/1ͫ 6Do۶mF֩S'=m[Ə囹k(C�@�@��ZY:R @�@�@�@�@�@�@�@�@�@�@�quεT-ijT`AYeˢm vmQDHLӦMV͋O?>h"PLuu؉ʕ+e!!?]viqx@<CL3=pO>ڽ{}FUׯ>g˗/jm3gNLҥciΜ9n_;O?sE-_p|ɨ Xݳz)_qΝ]=x:0!%ܴ p߱ucw͞=ۭ:݉k,F8q Ӳ{yb&GqmcSC>(wj1 � � � � � t" :thS$g0`"""\~({`ɉ.RۭӾ(W\L*fe!\OTc;^MGɮ_Z -[k|ש~jw mxrvcڟ-YuÆ U^=-]TOڅ탹`;b@�H�kƴpؿun [l-۹sg27~/[SLUN� � �d̥" � � � � � � � � � � � 9Œ5*UiY=Һuk=׿/܅4iĝo߾}niӦ܂NC :oV%JO<6)m۶-*`69rЋ/^s4iyȑ#]�N:u .`Ygg[nյ^#GTx߽N6xS{e]s5Xb*wϳuoN8ٱ~-Bl´>s 7Bl]wݥB i„ j߾Fυ꫶I[n[ r,eQAY`Ahɽ&7 1l6oN6Xmh76ĮӚ5kr㫯rf5fժUKwygf+ǏױcbՎo˽{ .=n8Wzulw)M4IV zjSB'1~" ʻۅm~7S@�@�@�@�@�֞6|p;Z`A'XBbx yj֎oe]'kg}%X{Q];رc]׻ᆱ!Cr?qm!-\i/ v}gz}FtJn{9{\C _y][K/egAwJRԩS]~1 �$^5owfw[ w;{ifQr @�@�@ K .'A�@�@�@�@�@�@�@�@�@�@�@�PΈ,:eRe$&]=֭N|zٳgvb0[i馛t뭷O>.Pfɒ%7o ;m>w\xQ"138p mؽ{ŋvmذO. AeA!|!jT�>L H#rOL2ut׸qcיI=,@{Zr:2e[H… Ϻe֑^A0]v.$(,@ЎeYg}> 4h,k)Y'f*_ Aԭx6msXpѣU\اeY_f`Yg366Y~gծ]%o@bQ֩СCev $N]tիHYNnB,H+O<3grwa;dDYX믿:k׺#իW߭-[:N,Ҭs;fuGBߧ~?!}kӦkX~ )'E�@�@�@�@�@ Mok_شiS1vĴXG-k:$vHjOPJ"{ڕOמcTdIY]Ӳ>eqkK.gx޺vjdO?<O|}]R͘1õinڵ]._\Wdr}+,@�/ ~s?S^;m۶Gy$pT}Ta  � � @= =%kF@�@�@�@�@�@�@�@�@�@�@�@�5kpwy'KgSmܸQժUs!qp+J*qdc׮].+_|>F|;+ o!'N}pA{&ه{@XXXЪX|d-@AKh ,SjU7Mh7o^= .P%Wy4Ђ+c]Jip`R[nUJb'cשs. q:v옊)B˂3-Ye`u?[u]?u%OzzifY#~Һ@�@�@�Po jժB @�Xr:TV4>cdΜ9#kعsk mݞs\ENge.ZZ[ܹ]ӣ>q+vc4ŵ}J?7|S&Mr)9^b?J Ln.Njmx[lRT`M2>XٲeTN �M5A۶mɓ'ݿC%iV}]X� � �YK`>)"B3Gj:k-kCVZ s|@�@�@�@�@�@�@�@�@�@�@�@ @/TϞ=5a]k޽{u5$X{LzJp`Ȑ!zh"5h =O͹H Ԏ;OwyɲA1yxkjMgώw\d/PkϞ=�P~'5j(V)Cu8vXYuf4|p% � � ��Zo@�UǏ .t;vE=\s^aRaAVOrH,wޚ>}*=֖W^=]yϒS'3/_͛k4hPH;S8@ Bx_5C{J@�@�@ k+' � � � � � � � � � � � @Rz衹snS ԤI"/R'B6n8Mu_|: z JWyN-[Tdd> <XÆ ӽ낵J*Βԩjժo^ܹ3hVFz+6m|MYGte˖Uڵ|ֱQ??zHyIq@�@�@�@�@� `m:_}x uE>Pk v-2'XyR,' ,paZΝׯ_?HnlAZW_}j֬傛2kdm<L1;#�]5�? � � |ebSb@�@�@�@�@�@�@�@�@�@�@�@ ={V]v… ]GuVyeW &W^.d;{!v߱ท^zIk׮յ^}]vʑ#Ge&y;vΜ9 k޽C|}QYY֭#G{Xx>C7NŋW'� � � @o jժM( �$,0uT׶Q@ԩS;)8xz)}wyG NQ?=?{X´J͛Wϗ1 �L5S{fjr<@�@�e}iuP.i蕍@л&@�@�@�@�@�@�@�@�@�@�@�ɓ'u׻o,k*ZT=xkW@J@X}s ѣn&]zip6:ٛ4XgINR|BXA˲n:}.DkƍС^uؑ@b,D�@�@�@ �Z]X� �mX|lFA@ ?~ 6LzC}w}Wy >vT pʕܹ-N%KLx'@�H�k&)7}4' � � bj%H� � � � � � � � � � � � \<yhʔ)޽t"ܹs=%Qĉׯ zJgn-ZO?o^j֬*UfΜӧOgJR P 29sl{`ɒ%zUn]ժUK'Ov[۷oԩS]Gz9r_D3@�@�@�@�@�k9ҵs&Mv f:R8r,DJ*nSOiڵ!e:{ƍ' رߟh}-z7oaZS]H{L{!Cx_3>,!� � �80_ Ӓ/ � � � � � � � � � � � o VZiԨQXb&zҥ۴sN}'.$ך"]4i$M0uU@mV:tPUjZH͘1CӦMsӽ{qƺh1 � � � @ۨBZꭔ@�@ ̟?_w}f͚TudSX~~m3FrRCp©{T<SamT'O|µR*Çw?֣>€� vvTX� � �E`>)"B3Gj::u#uQ@�@�@�@�@�@�@�@�@�@�@�@�+`o-^XwV:u/ԩS=!p!=jڴ?#Ehʕia'PlY5k{:q4hUʕ+O>͛7g? j@* X֗_~O]tʔ)x@Ǐ?O?j"L+9 � � � � � \~1c{N\r.fժU .pQY8R6mTV-M6ͽ}v=3!e׮aÆZ|JuI=zжm۲eM;wN}L>]SN+Rd@ �kHf@�@�aEM$ � � � � � � � � � � � 'OСC]GJ*Tp\{!^/ޙ3g4j(=:{ }*,,, O `g)̙38|9rDKV-ؼys5h@rzBSZz-Z qӦMʛ75k:# 4iByy ) � � @o wEjD5@�@ o}_^_|z傆U^<!,`{XpָqW_S֭.YO_{5`�(P D(>#Zd{c)Zh(<D��k}ʹq � � 9| ̑ZΜuȨRQ@�@�@�@�@�@�@�@�@�@�@�CB6|IM0XuY;XiԩS=z ڱcn=*^x U,nʕZ`,\vBԩƍ~WϟU)Ag͚5Z|"##?jŊ:q�/\-[tZ\pA@�@�@�R_@7 �dG O_jϞ=.\k׮ܹk'ˑ#Gvdɖu޿ њ2e;vLZ-ܢݻ+<<<KX;K/)O<.P"EDҳ?M>}W^ywH2p.@�x_|,}䨱 � �du J{"� � � � � � � � � � � �i*`C ĉUvm_zR|Ȃx YVwq+fQ~BRŋe˖uXzuY_u뺱J*n]HVB! k\zuh!Zui[}%6mK/T^xaΦ � � � j(C�@ { _Z`뫯֭[UdIuAڵS۶mU|썔jom@-̙3]ʕKmڴQnXT,VX𫯾ŰsnY/C{믿uz="X� <uL{!� � @ P+י@۱' � � � � � � � � � � � .//Tܹu-_~jذa?3ܹs5k{=M<G Pr2C(#YJ`Ͳ`KjʕZjDϟ_j:o|e)*M6_~quȑɾ P"uEռy5jt4h5k/?5@�@�@�bje Ju@�1kן:uO^'OT5ԪU+]~n$x(.Z9~/^,ɮѣGUre]uUر O+X`GZ>zK#FΝ;]wݥkֽӒjX￯ѣGkc{Bʞ �! +fFl� � ��Z|;D�@�@�@�@�@�@�@�@�@�@�@�U裏4rHYGڵս{w7֫W/] '믿pB?^'NԎ;ԴiSs=ٳ'<p(׮]BluVY'+aaa.�ςZjm,VXјE i!p[lѯ7F<{;Y2eoVt7oК5OQyJ\"_VX+Wꕕ#!� � � @J{"� @,i޼y3g:}J*ڴ]I&jذ/uX{]FFFjɒ%ZhV\3gθ6L FkݺJז&d5?.X˂uu׹wX,p .d5Jyq{d}U~TB# ��k}͘|B�@�@�#@VboCVp"� � � � � � � � � � � �!-IYG<$UzuuYڵuT@.r w͚5K3fp3޽ۅx.D뢋.J2HرcڰayoQ*T ֪\lbŊ:lٲ"q֙Ϟ={|W۵m۶S в~[: 7] kԨ"ExŘZ֚5u=X!.d2/cl|@�@�@�@�t P+9 �- \Pŋem6X{W Tנp /+d,pիWUVia³:Y]f͚ynRJ8 ƏF~[Zǎվ}{YVdO:N;,tR+VL]vbu ;K^z*�P 5^o}=zN:@@�@�@� x[[ � � � � � � � � � � � @&8wtkĉ>}ܾةm۶&M{2Qk.YgK-̙3l2K/Ut 7nݺQ3�YK:ۼys:cq֭ڻw>h"""T\9e2eʨt*UzZPٰ69] ]BljOܹSaS[v7X`fS hNVꦅ 6MNvmtm-_ʓG |c~StJvF�@�@�@�J� � ֦k@ tڴikPU1z겐-ZC'Nynܸэׯݬ/ژ.d!fef5r?Cw„ o`ٵY ժUK 2pϣGٳ5o<2kkl׮ Һ+{;XLN� i � � JE%P+v� � � � � � � � � � � �̘1Í1`kYuuEvڪTru8s:Zfhɒ%. XV-jJ۷wAaE rSX'Oj^aI*=cǎ(hUdc%daKŊڼ*TPc!:tH8m~ORo϶}ǗR-[/_^*TPwKy K)_'{hZ~FLz8 � � @ P+_`� @`+hȳ@/f(q :uꔫuX[ʕh6RL7EfpiY zSk' -[і[ .hadށM1,,,&Ǐ;,sqqv]I&jܸԩaЭyu�~+;,ѯtjѢ Ѳ ZV>uG�@�@� P+a P+.#� � � � � � � � � � � �Y@G/^FgծS)Z|dYؖu8Z?"2IÇ]0u8d7]udUUuU^=�ִiS׉R…ՠ  QGT޽{eM- teΙ3,F زݛ>MmF ޼}{ug͇JabO8!Φ6uM?S89r} IJ{,/:ԋf#""\guY;/i:駟$ ز- 0u,lB|4  � � � . � nf0v4h|mwKO?-_{oEmܸQ7ovQ[Jy[V`k`q��@�IDAT-K(‹ś6/k˲ڮ3`ڈmFk[]{݁lV_k²V`XJUZi)`K}b{,Te3gθvSn5jPŊcR\9=vZkM`9ٳ'+.-k۴X;,6Z@�&TX� � �d_ J{"� � � � � � � � � � � �RK֬Y:�N-h۶m rc,:&ܹsB>.p`syuze YC6b::@."7Z0 �)`0/\c^�ME2B;>vN xo N,x˛|ϱٹϞ=v[g{7Iw_ωEtтż1oBϮ &]ly![7Xˠ$d+~Y7 � � @J#� @: L(=nԻ?T+)y=.dS6sN7yk 6XlY7`GNyk@$ks 6eg;v[Tϼ6#ojF%K %{L2-qX9{8fػ,{cٱcx5卑?j1v}, {%v},J*VZڵkB|v  �@5SǮ � � @& P+@۱' � � � � � � � � � � � S!`k޽.LL:ֲp·â` JQiҥ]Vց B ղNuySF{j x p,;WF/0pj<e;Uml%υlթ#5j=ZȖ21 � � � @�Z"� @H̘!=)x4dTF]�{µi`m_XSya[ ,paD}`EY[#yA]4p^&1 `ݲWv}owYWaS/`˛Zg`]+Q ѲO@�2B~x_3#9' � � >j%ߙ@۱' � � � � � � � � � � � � � !aMhe sJ)0daCK DːrR@�@�@�BB@ @�|KRǎ?!կ5h*TGyD  � � � � �$S@dv@�@�@�@�@�@�@�@�@�@�@�@�@�@�$&ը{B6n5qt?dvmQ:$d+3]uʊ� � � � � ~YziieKi|43)v˗/;v^g@�@�@�@�@�@ j% @�@�@�@�@�@�@�@�@�@�@�@�@�@�M7i![6 ٲ:]ʙS ?֑!� � � � � 6o ƎՓN:vlH\y+T۷'ncB�@�@�@�@�@�E � � � � � � � � � � � � � @Vjc5ZFe@�@�@�@�@�ػWziHR%VϞ=ϪCp¬Z=� � � � � � @V: s @�@�@�@�@�@�@�@�@�@�@�@�@�@ VlRm,EFFKH9rHB ޗ9@�@�@�@�@� 9" .TҝwJAc  � � � � � @AJm@�@�@�@�@�@�@�@�@�@�@�@�@�6UH6v]-[,l![5kJdž  Be@�@�@�@�@�$p?)3CIe ڽ{Μ9 s) � � � � �'@ CYr$@�@�@�@�@�@�@�@�@�@�@�@�@�@ K T,x ں5fȖu o?dF- ۲-BC�@�@�@�@�zsICó^]Q |abP-g@�@�@�@�@�@�*@VR@�@�@�@�@�@�@�@�@�@�@�@�@�*I6^}4¶m1C ¤![l./s � � � � �dVzJZNi lZ| ;vZ) � � � � �dGU � � � � � � � � � � � � � @* T(ح[A}}e*22z|eiօUH!� � � � � /=dݥ5BSҥK+,,LvJr@�@�@�@�@�rjeKJ@�@�@�@�@�@�@�@�@�@�@�@�@�@�(_^˲sgtmoj ޗ9@�@�@�@�@�2Z知[nP+V\+%K&M2TsܹsDڽ{w � � � � � @ P+S]. � � � � � � � � � � � � � �d^r$6v zU:Uh!� � � � � ;vHIc_ݥ^t(S ZQ`@�@�@�@�@�BG@й@�@�@�@�@�@�@�@�@�@�@�@�@�veJ6v]u Ԋ_]-V65O@�@�@�@�@�RSa%{N]>*tz´A&P+V!� � � � � @j%H � � � � � � � � � � � � � �)PԹo[[Ν+GkyA[ŋ{{2E�@�@�@�@�@ i'OJo-RX 4mmڰ!>,mMV6T@�@�@�@�@�T P+A9 � � � � � � � � � � � � � @ .-uZ?}]ivJ*Qۓ) � � � � � ;'}Ӓ=~ai@iĈ4{L͟?_E9GD Xֲeˢ>3� � � � � �$E@h- � � � � � � � � � � � � � @*%uB׊OGmX%="� � � � �dgY/z ʕ-ZgyFCUӦM3QnZwNԶl� � � � � � P+@�@�@�@�@�@�@�@�@�@�@�@�@�@�2d]}*̐ߗS يd� � � � � VxBkZ_CԫW/kN R? ڷoΜ9\2UP9 � � � � �Hօlt* � � � � � � � � � � � � � J:t^ҳז/հtioO � � � � �YA`.s1c3mc֬o߾:u>#\ɧJҹs~zP#"� � � � � @jm@�@�@�@�@�@�@�@�@�@�@�@�@�@�,*PԾx`̐ѣ-[6:dQ#|2ޞL@�@�@�@�@�2J/, .(!}tfŬ;CI&fdɒ1W)Nn޽jũ @�@�@�@�@�K@dX� � � � � � � � � � � � � � ڵ^=:dkRO@-/\˛Z � � � � @ =+%=tR޼uŊ0`}Yi X>fZ  � � � � � @RJ#� � � � � � � � � � � � � �dE^,\+2?+ ,;'.}~VrޞL@�@�@�@�@�2Bo֯UD=zT={ԥ^oҸʕKj%r@�@�@�@�@�O@tX� � � � � � � � � � � � � � @,pm[:|8fKCCJ:?d|yoO � � � � �i%z4`4}Ե4iTzgt͜9S9sc֞'%Kj߾}c � � � � � �Z @�@�@�@�@�@�@�@�@�@�@�@�@�@�?z93d/^lEDU'S@�@�@�@�@�#=RҜ9R O>_ʕ+lT |޽Aױ@�@�@�@�@�O@tX� � � � � � � � � � � � � � @2 ڴ!,dk2)2?/_I%KJ  ڪTۓ) � � � � @B'NH* *)"%oRXXB{Jׯ}ݧSN q =&P+NV � � � � � @<jŃ*@�@�@�@�@�@�@�@�@�@�@�@�@�@�RSBZq#fĉҋ/CJ8?dreoO � � � � �_JO>) כֿzISk==eH@DDZ)dg@�@�@�@�@��ZSs@�@�@�@�@�@�@�@�@�@�@�@�@�@�(THj?zOir)2?N" *^*U="� � � � �Kয়G.nM?ef0i&-[LsNl}@ɒ%e˖�@�@�@�@�@�HH GB@�@�@�@�@�@�@�@�@�@�@�@�@�@�W`AeKᇥ?~Y:rDZ@z9L믥nV,d];i@ix:~Mf۷O#GTΝ5|W_}ʕ+k!U. � � � � @F %-]z&-Y"0I&{{ZUsΕlժU+abt`! � � � � � @V@�@�@�@�@�@�@�@�@�@�@�@�@�@�BC@WcǤ˥H8u|APٳRѢRÆRFѣoYDz 1Ν;s sΞ=[S}M4Qڼyn*2 � � � � ?6L*YR 'bNO={tٲe/kLBegu]B�@�@�@�@�@�l-@VT@�@�@�@�@�@�@�@�@�@�@�@�@�@ 3 /hzX֊![|#_ҙ3Rx?d jXV-{l͜9SwլYSw^_!6<֭*Vb%8 � � � �_JO<!_XңJy$g|M{"EDQݻ>#͞=;jY(dgŋ l@�@�@�@�@�2�ZQ\@�@�@�@�@�@�@�@�@�@�@�@�@�@�1CO^{+V HEիg[oV~<*̙3j>f +By@�@�@�@�K`2ɗ9 nʔIٟy-8j9b,TfgŊ9rD a@�@�@�@�@�@ >a � � � � � � � � � � � � � �Y@ _>Y3Uĉ萭K37ސNCj|![-ҧ~_~E*TW_={:_UW\qݫɓ'k׮]{=7o5n8޽[zXoٸg5lPO<ʬX?7|SW?_~Yrέjܹ7o;n>߅2dUϝot_Vc:o߮>@K,QUR% ><믿˗PBݻ3ڀ@�@�@�@�B\NO?-%5m*-^,5iB=}뭷d ?zt E16 8=?=zOU^PR 3B`֭㏕7o^wW_}Wܩ3qD?^rekաC[zFhZ68p@-' � � � � � Xݐ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ pur|LҲe$UR>RZEI[K>*_|!UCǻ+ok5j[EDD覛nR=\- вro6V°U:* 7<.,­neZm.]\'_kڴi. .s-<By>|-X V΅ k׮g:[nE9r7|}:*aj޼ {ꩧok-S@�@�@�@�BMi)}%-L˂.RlРAdvٳ{㏻{Fh+ڶm{vLΝswqGU|g͚/\={&wA-2eR? {Fia&MҺufWƌ|FXxqW  � � � � � @RJ"� � � � � � � � � � � � � � wH{=KKC~Q(fMi\9BZ>TZ64B~Wu뭷oWJ|!aWk̘1*Uիf*UԦM̻uի5b :u߻˗/w>kZukڲ1 µ6mڤ}]w¼ϟևin~o9s7]u6`-;F\:EQ1Nw}[nugچ@�@�@�@�BQ֕/J@z,%}'3ѣG/v,ȑ#:z ȊӸq\=SL3B{^B~g?O=#9rȡ9s*o޼zu)wތ|FXX1W � � � � � @oG'a6E�@�@�@�@�@�@�@�@�@�@�@�@�@�@�#`![GURdlwޑV@AQ#ذT|z{t:qℚ5kdW_}͛'O>Q,*PcuDk۰c7ԗvYu}?jժnYٲeݴk׮8 7.\Xzb!_VV,e_ru~k_^缶.]bŊ 0 ھ}?mhҤI `Y|ֹ. � � � �$aԿ4uԽ4}TRJx9}*SY7xN>BںK.='9s[Rv=+_|ԱR̞1L^uuEwegEq" Ԋ � � � � � @"J$!� � � � � � � � � � � � � � _ < Z::dU:yRʟ_N\Xlծv![7nt2lͮ_[qum+e['6[cO&Ms[8V{qZeZÆ S?hʔ).P: 71̣Fr\#GtaZonVy{g裏ޕ � � � �/JC%լ)͚%]qEʊw^*eNް`L_zumwsB =#3B+SϞ=5g3F]wڷo¾mfQͳp:|+ � � � � � �ȑ @�@�@�@�@�@�@�@�gN൪?  *cfZ7-3›cfaZ`h¡ G'pDAs9p8w}>ZumG� @� @� @@mAY_JEGiڈGկ"JP_jGi1Ոm8(-Ss_uU rܪO>V[bU/X6u"XW<%-"׿uƌquEv튐K.$2tkQeN k'x"??GydiJfRy8?zk> @� @�X__?8[0I=�I&ń w-ޣ^{<{¦00{ꫯ|ywA(f@|J  @� @� $D˹ @� @� @� @� @� @� @�Ymq1uEGU,{eqElID׮[ooDi؈'a|^_<;<HyL*"3g,>!Cz1/W2f̘1bD"AZzhr)kg?ٸۋ\wQ%N>ݻw\y啥s΍n!]tk�qi+Gj- @� @�"]F|s/GiS?i߾}{/ŻK ^SNMaJ}o!Rzd1{キ[joY+ @� @� @ jiOx  @� @� @� @� @� @� @�@mkGG\|qD|aOT|6,b؊s7ݴ"dk*>UqB{u]o\ۢW^}8k[oXDϏ'0iҤXyկ~5}7Mq\P;eʔb}dV.(ۿb<'Cd[W:uj]0kX,71gvm# 7s̉v!:ȱm1`b-sA� @� @`y k|%b-#:txъ={OXfz=һcܸqETM'm+mcyG�/^,!><>OE޽W;nݺEfA @� @� @� j^< @� @� @� @� @� @� @� @` ցgʀ;FlIDokihn~8o>8f͚O>d\{' >;9x饗sBlM{챕~ '|_h+." _B'z#Fc9f~o/C6h nGkFr Eh3x+U=z(´9"yiܹűEtԩm; @�Z+}h)6N Xfώ#<3J"F8찆];餓bW/ﰸ_b~Eo/F*ޫmYJ+# ^~n?~|wi>6mPcUW6eyGxF̰]v٥xWoi^sE#g}bUV? @� @�h SDq=Qj՟ @� @� @� @� @� @� @�h@ z![?^աC+68bw駟. P2lj„ X[^E�_~Zgu_SV$ѫWO]s{vi9%^{-5>*]v] @�Z-I'4F(e /D|r+B~a -,ׯ_\p1mڴdMJ^D*#!̘1#:vzo߾w+a}y) @� @� @ Z'.Pk\I� @� @� @� @� @� @� @ Ȑq*ZZ@6"C _sW @�hYZ6Zh&UhEĺ.e?x'bW_~7vB㏏{.D5� @� @�0ZK.$@� @� @� @� @� @� @� @h&SGQїs#~~#D/}T5x ʐV8ܝ� @� @@s5+?я"X#Z5jT\uUCrݻ|P] @� @� @j- @� @� @� @� @� @� @�4!m*|{>hEk<dM'h4@ @� @�/PʯOx?;Ya>lp 1o޼c=?B?믿~k׮6X&@� @� @�@\� @� @� @� @� @� @� @@8S+4iR̙3g!={+m׎)SČ=M}#Yg~/}hrV^y&g&@� @�hpqI7G>mE?8.q&u5\A۹s6mZC @� @� @@ @� @� @� @� @� @� @�hdZfϞ'N تUH̝;sѳRb̘K![7pr1lXСnѩS;'@� @� rO8܊:`@ĝwFoY+ Pk; @� @�ho @� @� @� @� @� @� @�,жmPZ7kMe֬Y1a„Ƞa[הފ9sOG#ǵKDVk6Z;vlug![5!;F� @� Ьn)[ߊx0#ڵkVC4e x.%@� @� @�-X@V ~N� @� @� @� @� @� @� @@@c+jM&ӧO/^y _ z%^xWojďW.]5 J5 @� @�%YqaMk z5gΜ9sftСo @� @� @@,A @� @� @� @� @� @� @� А:uAL6-2l/n͎^馈ދh&JVkU *) @� @�hO#=7bu#;bDurdV|w*Pk<�$@� @� @�MT@V}pM� @� @� @� @� @� @� @@a\cޯRV;Ѻu![]T' @� @�+Z O<1w"~o~3 WciճgFW#@� @� @�x @� @� @� @� @� @� @�  2ls"~"dk " _ u @� @�,/_Ϻֈ8(5X^ww,ХKӦMkw @� @� @`9 ZnG� @� @� @� @� @� @� @�׎z-&LGLRz2lkP![ @� @�Է?iĹF q=;Pw^sXi jO @� @� @@ ԪS- @� @� @� @� @� @� @� @`ͿWlƓ'GjQSVnG� @� @`in5*CsNĉ'FrPk:vX̙-  @� @� @�%🥖 @� @� @� @� @� @� @�XnEd=4zȑoUÆͯCFt>Z{ @� @�j0"<#>8#l ,ZC 3fX%@� @� @�TU. @� @� @� @� @� @� @�ZkEdgתloY5p ʐW= @� @�-0kVyEG}FygĮl_v;̜9s @� @� bjGm @� @� @� @� @� @� @�4W>}"z .x㍊k c @� @�Z@g}&EvZ'Go2n +СC3fhi� @� @�hV4 @� @� @� @� @� @� @�TfD}/ZcίeDoeYga"~Ϟ� @� @fč7F|'oG\sMGdV~K*жmhݺu̜9sI/u> @� @� Ђjo @� @� @� @� @� @� @�,5ֈgZy.\5d#&MvkeVUV)_iK� @� fͪt��@�IDATX≈]w8z̉ˆ3ΈXuՈ[nkD:v(P0C� @� @�Z@ � @� @� @� @� @� @� @�5 z{W'Wٺ䒈+ᐭ^W @� @�Hh*"3&">ߍ8ԈRޑB:t3fh5L� @� @�4?Z @� @� @� @� @� @� @�Iw=冦LFjŷ-+m  @� @�F\~;q;1bDeEk_zϳG2Pk̙ ռv  @� @� @�f( P>TC"@� @� @� @� @� @� @� @@} d@{Tro]=d8o]8d+ @� @�뮈o}zZE{lD6:E\}uW?' )о}5kVCB @� @� @@3 @� @� @� @� @� @� @� @`y T=yzq߮VC#V_|- @� @J,|yӦElqĿѵ8B!ڶmsi[h� @� @�hf5 @� @� @� @� @� @� @�HUV}ZǻVٺ첈3Ψv5l +m  @� @�%G{s.|ff=D/G hH6mjH`m @� @� @�f( P>TC"@� @� @� @� @� @� @� @@c3b*j_W?)⬳*@ ֪Z3xK!@� @�/0o^Kg?^)(9&#Z^[ 4@j^ԏne @� @� @ jN  @� @� @� @� @� @� @� Дzu׊ZGƎʈώšW_zVmSҖ� @� ~oxwgQs#uԯ@۶mcΜ9ۨ @� @� @�f- PY?^#@� @� @� @� @� @� @� @@Xy初w^A+^mCZ|- @� @ oҾ}ĬYgeGGk|O~ڴi#P~(B� @� @�Z@ � @� @� @� @� @� @� @�MO{vOZ=dk"9"dwC-_iK� @�hO=qZU)mius+J+EleĶFlUZ>Ӗ@ٳg/  @� @� ,j5h @� @� @� @� @� @� @�h9ݺEcE-:C{,b؊z?qҹXauЊm+myދɓ'uʔ)۩V֏>r˹�s'Ĝ9s"gn[Z5jm׮]Cѵkעvҥr|l$kR[_eU6{ @� @% ->M69+׏?8rXvƌu̙Er8k֬brTsZ[Ҫ\USmݺudhMy}sԪ|,Y;vXlw)TJƪ={|k[,:74ۼXOUZEo-WeQ 9� @� @� PWZur @� @� @� @� @� @� @�4Z aZd)ZuE'![zEõa[k]vi2k1a„ꫯ�\jYy啋 ܖCro߾!Xxx.\0z W  >ӻ{b}_J_ׯ_k~,B� @�( K.?~ηrXS ZT `9P*CSmP2吪rpU9,1/zk c9?-h|<')UV r(X3,bp<^ꃥ1v޼kuoJ/Jjݻw=zfVm>ǭ/;$P4C� @� @�Z@񜍒� @� @� @� @� @� @� @�-Nk׈O_Z;<b؊z[H l PҶ믿=\76KϞ=+èr8蠃b5(³V]u(\|E\wމɓ'[oVqWYzR nammY||E?Q'@� @`I2*CUDUs5ÈsOUCr@S5z]2LK.Eܹs~NV@G'Mo=#z0>hR]ƴiJۏZSo?|eY> ZdX3D:ky?ay_uV+BlgezORְ%@� @� @�" P.J!@� @� @� @� @� @� @� @�f!PZ;ۮTZsZ7GQX*-p:딯lY7LK+=P<#%NjoMlA(n믿~ׯX}i"sA*3f̈'K/TeXKl|\~M7!CİabK֭մ @� PkU`0%3D ^0d)?缰վ1Mfg(Q߾+bG5}ʀ{KV?~|<E�uPꪥ{WݧO6Ӕ'Zމn @� @� @`YZüei @� @� @� @� @� @� @� @ |qc#{"dGCJZK#|2Hv4YFfϞ],}}E￿X0;8p`5tb;xXmvs?1gG>lxnb-߾]lVJ+5w#@�J`w,xꩋUt�K+0sȠ &jkg9Ҷm"(ÍG9!!Y Ν92eJ[E-~<\rnZk!}K/<2\_}#J!;cg?k^3 @� @� *~{aŜjq@� @� @� @� @� @� @� @�j>搭RUiCJS4![GtqN~ͽZumѣw|GlMlEfmdK?'Kh?p3& ܷo>zyc=7<Znd;�X"ZKdɓ㥗^_|1^~xW*o+zڡ4̠rHQn'2@+kew4BZzͰ<eiӦM0`@k{z zk|.ĹDG @� @� @`j-[^%Pk\I� @� @� @� @� @� @� @�-\ Cx"bgtD6l~-ؐV(^Zҥ#.8b}O>;nᆸ[E{Q,nN;E 7ܰ~nrzwիmΝ @`j- h8 }cܸq5~ō۵k Z{C jժUuRH`ܹż8Ə_YsM4),9w`_? TYXQҋw=~4 @� @�h ZK+Pk\I� @� @� @� @� @� @� @�1"dGl=LD)*u[8dteVieVҺu]\KZ̙GzcM7/sr-Mw)]੧n-n3fLo>k8bN:->!hS5&MK`֬YE`O?9m &ļy9YdmE]4� ׯ9[zz[O3g,B^z"`^(r;qN۶m'5xQOb:thxZq) @� @�hz Zz;W @� @� @� @� @� @� @� @�: '5vlNu~Vi 9&FvZD5W?F+"|"8C<0_T@`Jio1q]wq8C裏Ç7hsMQ?{>ϖ?:Yԧ\3D+ó2`W!@nqs)g πM6$6l2dHp;,?GD� @� @�@Ε @� @� @� @� @� @� @� @`2d멧l=DDA[5ܦM*DYs΍n).=zt 0 8∢: _H<yr//<(0ro|qGǎeu�4fZ-0{z(qESdOd]oMND`fKl\j}w]vE֖[nYgxAUV FϽ/~ @� @� @�-J@?nZKoJ @� @� @� @� @� @� @� Pq-\9fK.bf͊?1rxc};.v}w C/_RzW_}ut=oݺuk}A Xj5'cƌ<@L6-Xcb-b7/aâwMF@#T^)|mb߾{ܶmf2? ^ @� @� j-=@s% @� @� @� @� @� @� @�WWx%kUy⥗)S^c9&N:8p5F/0y /,BF'pBtԩ]  @hs̉ =ztQs? 2$vz뭋ڿ;H='敒ǍQs=]tOӱ;Ǯni ԩ!<8<~Pj� @� @�4ZKj-+  @� @� @� @� @� @� @� @@ OXTG̝1{vY[ϋ6m(}~2W_=4_cQML:5~_ȑ#Gj#3 pV;rKzqw|Æ v)van[nqDE d{� ӧO瞱^{;wnFK:6(983R @� @� @�&-P߄sOcr|~G7$@� @� @� @� @� @� @� @�;PvYsܷoĠAlzk1-G�g?_4pty vZ|k_38#=o稍� @@ [qu]W鬲*{%\kg�-лw?_ĉPo=:Ob=(w}k׮F7k֬СC=  @� @� @W*-eI� @� @� @� @� @� @� @�+]7\Z+u~ᇋ�3g J1Z5ٖ b @W1O=uQ :D@K1cFtMqWD欽EPN;ãUV-Ƹ X@ 瞸SGqD׺˛m*:㤓Nj N� @� @�-P`ʔ޽"vء,ÐOf @� @� @� @� @� @� @� @�$/Eo?YWUE޷ntM' aZDl.b-"Cr\j6c3 @� !ꫯ)o~36`_'V[ jxmh۷w=.4iRױc"o1rxwߡCi\ @� @� @@,A @� @� @� @� @� @� @� @@s8⨣38#ٳgs,@.N}ĕW^?O+_J̛7oZt) @�'0nܸ~裏oۘ8qb?7߼ ؈h6m.^ziqꩧW_}oo6}bSg @� @� bjXw'@� @� @� @� @� @� @� @�袋bĈXy8 vaq뭷UW]7Z @�*[oŗdMcǎ;#<h׮]S @`t{l?Wnxgbu։1mڴ%j9Z;vlC3& @� @� @j5f  @� @� @� @� @� @� @� @@}=:o\sL}4(۸{OA5;5o޼bw9~\rIc @�Xob׏)S?+kGܬ{8c6>_Mǚܠr>~?;wzRK35kVtС7 @� @� % @� @� @� @� @� @� @� @`y|qQGa7-W=Ə_~y<Cm!V_lKpܹsW_-}nժ\]q{Y, _/ @�i38#Fc6jjΒGs=Wؒ?VUU/^}wax:(DOhi%ôjiOx  @� @� @ Z6?W @� @� @� @� @� @� @� @�8bq6=KGydl馋N.@.Ĝ9s;z8묳kmڴc=6 /i;u9Ĉz @�F>v-^y"\)9ҴG]m53s^Wm0zdHTjݺu|[ߊ1cW__zT 7fΜYVVzhJ� @� @�@Ft� @� @� @� @� @� @� @�,('%\R,+/u\ c޼y&L?|.L cg]RS;3뮋I&2 @�h_җbڴiqƚkPseim۶ qt.<u XlK~}lv2הՔ @� @� @�#k<} @� @� @� @� @� @� @� br)SGW\;vM6$.s=O,} 7Dַz+{z衇C7.2[o5h׮]yuݙ<yr\veqw:sNjt{E3sLZqGN;yM_;.rkX<׎:ƏO1"xzs=q饗+mYѪUČ3⢋.x O^Xp Gڨ_t5n׿^k� @@@n-{߅]thĉ<#T]tySNn)8OSyO/fƌߢ׾w}ǎ[f{W>/G-i>\-뮻ns-"{ 6{b-,tٟٳg)璿/ /~:2p(e{ Qj5+ϫ>ǐs?\o߾{!Ry|V5ϭYm_{b}UWճ>իW1֗ʁ7|/q$=φn{Y]$Y:tPk� @� @�h � @� @� @� @� @� @� @�4a\O>ѯ_]wo}q1jԨ8#eU\=7Wx`92^Fnp{ ϝ;7OY;c=+Ь,gc 6(s\=b�,z.L=iҤ8cE:83SN"㧞zjdՒ\>ua?ݻwV@w}XGq\T/K|S?jci`\>O  @� Ac~_u֑,Kr^!M90w6Ay^5r>7x"pkEqs'qZӦM+ZGuT<D_)C3T*5؜Ce@X ,ŸrΙ#,}/Bsr{uXq4Zn-K.$va6lXpC=4>~Vk,Ym;?P.}cf]]R2l<KQ @� @� @�uUW) @� @� @� @� @� @� @� @�(ojwï>SNgy&x#_@mݶX=υ[oUpeV. $"n2w]v{A9*vd;^&lR/p@ű6(}bx :v~nե;"OFnݪ]>bĈx駋 7޸EYf]iiP @�qŦn:a„]eeg?aY_2j܍7EX6X2%28 ۷=3̙Se\(mYz9ʹߏզMb^9ϩiN2H{)B۵kٟ_?2+K3g T yh|slJmUӼϫ/ǷX7_&>OS9翨jM9E6kи[Zkz<TԈw RSi]׮}E{.D!@� @� @�U@V]G� @� @� @� @� @� @� @�@Ν㣏>Z.w\s58 Vg\,ƞUoyQs|W]uUdWXU-ݻwq.~?x^E ԪT=~Yr!\.ƔWu)9N;Tyzv͛\sMb~~EVxhVjh� @@ݻw曍/D~"CO;׾'O.Xks )<7KgB5tx<>q۷o17 Zʒ[_fM7T_DչNΛ299o⋋Qoyay.a]9Юr^X}o7ԏyWoᆘ1cFeZ=أؽm>,[{,豸f^e*g]R+7x#V]uߑԃZ m @� @� @@3_ ɀ � @� @� @� @� @� @� @�4AU^M6֭[<#瞋^z)Ƴ>[[ Uڶm[4URۂ۵/_uYW=\~y'˅scË/Bpux' 7ܰy @�C೟l\}EPQͽĨQbWzō7Xwż<i߾}[l^zi瞋>\p޷ C9$:?~|q7M>9R`92>OG.]"UKyU[l _3SS?j:`|^ ~sNWng+v?ߕYic]ouA6W=VT=1ߝ{'2@ ˒ @� @� @@]jUy @� @� @� @� @� @� @� @`9 NŢ7|rk[JgւW^<CU/ܮx>e X\.e֬Yij=G O4)&LP>}W[mug˸aZvmel @�׿0N:QwxΜ9V[E;^̽<ȸ뮻jw%͝;r>׿:cBU6_̞=;.",9wqGtAZ:|qmcʱsYR%ϭ5[ >_ϫjq}WNXu.Q-uXߟ>;.{fxvC+nJ� @� @�4MZM5 @� @� @� @� @� @� @�4s^z?c޼y+dC ){ꩧVØ1cbĈ}7sjC. hbR^.{_~/_vM6);υe_{GSNj#Gc뭷5G� @q t=ڸ+~Lcqߞ|ѻw9 7Pk7s޻8s-GrHyڴiŶ!ToF',8{oEt޸/´2ܷgϞKߖdW4@֏|^ÇM4/fU~5y,YmUgp,{w�R\1cFva/t7n6Hw9v֭A( @� @� |j5gkd @� @� @� @� @� @� @� ~O<t$SL)[>_Wk׮quo㏏?<.+R~o;FguV<ک뇉'aҤIűv5,G>l,zkd_|?裏Ϲ[osNUy"v/ w}}/^z饸+?<6(^Xv &ĸqGű_|�_G?QI @�W`-,'^zixo7^s5EHUvVM7T|ΰ/< sLq>ti_8S=Px㍕mm<%Ka-IP.$2ST5!:W_}u2GYfxꩧx믿^2ySk:VwyryY֏E*;;[u]#\V.v[d8w]d�Zx䱸fm!˱rKtA{E>ô`E/;<L{>}45|W>R @� @� @�$ P9=Mc!@� @� @� @� @� @� @� @�f%駟^U= 2o9> `Ūˋ*EXV.t3;".+W]uUt޽>~lKׯ|+ Mg9#\$+eo|p\}h6M6$Ǝ[,_^;/ЫM74f\rI|K_*ڬ(vw֏9fHU.b?thݺut1~b[o]<\3όSO=V5zɅ3Cۯ[ @�![SN-27xSɐp qQGI'Ty1C{3* :t{'ڵkWsV[a ?Ok}8,BƌS1`eHq]˼y�\W_-sd[ fι/bU'} M.+-}j:VgmXԼnQkQ}_20C-} R׿U:gV}>EVkXo3?)r|{_.՗%ul3hsύ!C}6m1 @� @� ШZFC#@� @� @� @� @� @� @� @�-X |G)^wuF.M Wj*Ygb[|Ibٷ6mİaG\@:|oٳt0aB߿.r\?idT/{_GΝ�ɓ'G޽j*\4:CKM_e.Rw}Ҟk  @@sXyKA㩧.j1@ 345bĈX}?A kz950gώCk\|e}[nΠ 2KDzJWf~ԩӂ.ep΋ڷozނsh֭[Xs 5༮ϫ;;O?wE{I z6kk3-=D˿%_Qe֬Y?o>}@e\K-'xb~& @� @� L0{"vء~v.w5 @� @� @� @� @� @� @� АUW]8o?bȐ! y˅ծ]` .?nsqᄏqn ҩó {"w8Ês\ssk /3PlմSSk:oiB{G"iڵkץi5 @�@g88WU}E8I'~x!c9`,oyl\[Xri۶mdKYyQ{6'[p.mTݯ^C+kQUQu=!ÑGW_y?Ο3dm\.}*oq՚<۬6ǚaRyRnynV5jTϘiGuT˳?^6DcyA� @� @�@kg @� @� @� @� @� @� @� @�f'йs[޷v۸K+C`gϞjѭӧ{ Zd7;uwy,j*ݻwSN9|ͫ}nA};3V_}]}#@� \2SOO<Sg?O>geV[m\U軸6}Sy~U1O>U]h>uS}o4cEVoӟx_SP&NO:u^ @� @� @ W*-^� ٻ({o4��@�IDAT* E�HDv5T`$Ē,7j4E4zD5Q.X" ""MPoF 0}眙={ @� @� @� @� @� @� @�@`ժUqUWu]'tR͛W_2Op@{Ѻu SO=?cĉ&>믏򚄾BƖ/_L}GƍsC @ 4o7:9Ǝ"9k)ҳ]wO<Di&N88c{k\[;+W38#H=/]tQ <" xJUC.KK/e˖qgyfݻ솱;ˮR5 @� @� @�j"0o^bWM:]E)PA� @� @� @� @� @� @� @�J*駟)H馛nh^_FӦM#//oc彳tHKU [_=<7ygώw&TP  @ Ԫo(O?4׿f!9/BuGn,L*a%}W6j(jޯU' '{? ;#+CY"ڵk$k" @� @�RJv+}Q%  @� @� @� @� @� @� @� @�ׯ_7.~)C 7VFw lРA0 s=[lz @�[ne{:/7ݣ>s1rӧOtAGn=4WG :*R5dٲeG 3gbԨQ[D zh4iҤ'D˖-+Z&@� @� @�@jk&@� @� @� @� @� @� @� @�\iӦ>Fi4#F25{cǎAEΝc̙1|&LfFG� PZ:+w= ={-Za/R,]{)Z`…;۷oSOE 4Og;wn<qq ڈ7@F`� @� @�([ l @� @� @� @� @� @� @� @�R__$iGqFÆ xtUVO?ݻǕW^ P@}]1v-^$3gN<seaZ'NzEnb^zE=[Vԭ[#@xw7ވ#GƫǏϾ^c,<i~ѬYJai2pLֿ30#!@� @� @�%7/b#JXe@- @� @� @� @� @� @� @� Pz뭸⡇&.>ScנQ֎̘1#޸뮻>&�FI�P@Vb�B+)_7|3>hڴipSHOZwmhРAaY%KrAcw-[-[+owu7/ղڧN;c^- @� @� @ *;.PvJ @� @� @� @� @� @� @� @�*+0{ӟC?Dlk{҄/K ><Os9'vic @JM !jժ8qb92 =ztx_~.ѹs,8lN:E^^FRVX|yL4)}l?~|5eʔϏ*u{g3zoU.2˦OPJ @� @�J * @� @� @� @� @� @� @� @ ɣG<g^{GydqdU~5|A<ٚޫ4'xbz~ '0< PʝX!BRO 3fL7.[M\Æ ܝw9 o}[ٱd!@kYfɓU+WFzZ֮]fAZB+OfXdI4nܸr:U @� @� PJ/PvJ @� @� @� @� @� @� @� @�j%|<H4wnqAhժUSuE_SOe7m4 :ꨣ&MTǡ3[cj_|Ǐ &ĉ ҼyԩS;o}t1ڵk'|~zj˘>}zN:5[DN_3iIL)tn]w]v%[v kРAĩ6lXwy[5. @� @� @�MUz>ZS� @� @� @� @� @� @� @�T[UVŨQ_WoD:wwO6Q{d9sW^_~9 z7cʕѹs,C>}_A�5S@V|_@MH )L(M<9{-JǗ.] nݺѶm왭}ڢEHdLP ???R3X?HklϞ=pd)d:ǥ0N)N:ڨ7pC 2${f� @� @�@ * @� @� @� @� @� @� @� @,\0^xx㥗^~;VXZݻG= _;vXc]Iz+[v0<Mnž}}{6۔u#@�UT+J4k֬,|hڴiӧg5)(={,YpL56md[`mݺu<FZj+Ej66F Ӛg?֙3gfW_}UXuͳ0:dZ)D+-[,FO~#Fܫ� @� @�l@ * @� @� @� @� @� @� @� @ IG#G7x#= x-Ν;.ƚ֭[cMVX|„ 1iҤ8qbBzꕭ3M�T@+`,`+=)ܨ`;}'jժŽ֫W/zlMk)(nEkÆ ۨ9_|E̟??[g)mܹsUcE}Rh[A[۶mPմiӚf$8p`,]4yw� @� @�tZ땾 @� @� @� @� @� @� @� @@M|ͣo߾Z0O?4Fcƌ¤Rc=MiԨQѡClMd54v +Wf!b)Sŋsyyݻox`t%svmt� @�+ڭ["bŊ,)ksɎ'S;)py慯i`m֬YyyykWkY?Ew"=ׂۧ55g-[l d-g={fl)L:=)tm}QkC� @� @�(@R ]C� @� @� @� @� @� @� @�X "M3gF`I W;mI؛6mM4^WnܸqԫWpM\iUVE8<_FL<`շ+\ &OIuN:YXA(Xz~cwuUNG\xa`^  @�$мyh׮s{KUꖾ @Z|YR \Jkzf*x]; i…Yˋc eNπiMMp6v:ְa,yׂؠA,9m!c~z+jMHSoMώ)y}kiz^M`MiMViMeo<~Mǖ,Y=g⬓] 7b- @+EKi)+o'_ Hg}v\~[ @� @� @FkbJF ~5bH6z֒ @� @� @� @� @� @� @� @�)&g}uIS֌3bΜ9QZ^:yxW"M^vz�m~ݺu Cd-[vmܤ}Яvek#~K.x≈{hӦ'@� @@(JHEAǫA0U"5{5¤RSi;Tm,W$?~E˩Dz,+xMckmfd!dk,*J ϥϪ� @� @� b'@� @� @� @� @� @� @� @�J,۷֒ZtiU&MO![iZΟ??N=Ըkc=4Ax״4y\<M(4yY.WGrHI'Etqme+"@� @@HPZU C3cZ/_<K.zj당H@Eu)rMϽky4+xNMϪk *N>iM[O>$:njʐ� @� @�@Z) @� @� @� @� @� @� @� @`)+iye_q^"F㎋8[nh֬ܛ� @�j@ݺuc6֒ "N;-kH>(+Ѷmۍ,r @� @� @@D] @� @� @� @� @� @� @� @�.иqmE<D3Dt ^ @� @l|eSZXW`̙nݓ @� @� @�6 Pk@N @� @� @� @� @� @� @� @�6F"Ǝ-{ߋ첈7 @� @@y qQr~CW裏y8%[ @� @� @�) Pk#\N� @� @� @� @� @� @� @�ؐ@V>qѫWĻn @� P^1rdEW %@ ̜93Z  @� @� @@jM! @� @� @� @� @� @� @� @<3bƍ#z"7\ @� PCDte[XS`ڴiѡC5#@� @� @�P@V \F� @� @� @� @� @� @� @�(@N/q^q3g&e @� @4fE<`E2lԩScwܘ"%@� @� @� *A� @� @� @� @� @� @� @�(+xՈ>%-J� @�k v[D'q{)SSJ @� @� @�J! Ph @� @� @� @� @� @� @� @�J#гg[o}={".,MM @� @@I/sΉhذ$%\C@i-Z|I㎥B9 @� @� @ Ԫ�'@� @� @� @� @� @� @� @�*Vq[o?#}6k׈+Z#@� @@m_",82b$PySLԩSuB @� @� @@U>'@� @� @� @� @� @� @� @�!DѣGD~^lYu~ @� @j q1mT$0uˋ;֤a  @� @� P*[S @� @� @� @� @� @� @� @�Z#3#z:dkkl @� @@^y%7#.t"@`Lڵ l\AW @� @� @�@- @� @� @� @� @� @� @� @@% ~zMFWM7EWr4O� @�j.0dHDϞ{]ԩScw&M @� @� @* Ԫ> @� @� @� @� @� @� @� @�N`"Fꪈ/83j @� @LfΌxላ.*TB@ L:u*.!@� @� @�_@]%@� @� @� @� @� @� @� @�T@^^WDjGtW  @�V_b�@ qMu� @� @�z{G @� @� @� @� @� @� @� @@-#⭷"N:)bР>(O� @� ,[qѠA �MXpa̜93vuMGa @� @� @v Ԫ @� @� @� @� @� @� @� @�UT`"n9⩧"%hgu� @�UH"r>YVꖮcǎ%B� @� @�(@R)F� @� @� @� @� @� @� @�#ҜԽ{Gp@%D,[V-k� @�S`Ȑ"ݶz_ TGqEf͢}ձL� @� @�TZU  @� @� @� @� @� @� @� @@Q[mCCFygDϞcu @�=4#F>9N<qvE0r v}JhY @� @� @@MUMc!@� @� @� @� @� @� @� @�j_i5o^7jU @� @` ѻw*b6M jue*Q� @� @�jG�� @� @� @� @� @� @� @� P:v1"⊈~">:@_  @� P>3fDhذIhѢ|Q+HZ;w^9  @� @� @�%UR) @� @� @� @� @� @� @� @�@܌_sFtqUsA� @�Jֈ7 vܱc%@jYbjo @� @� @Lj) @� @� @� @� @� @� @� @�'o1xp'GpBħV\Z"@� @@Uˈ;aѱc- P+ƍK.bI� @� @�@U3 @� @� @� @� @� @� @� @5#~:#O7 @�T)X8QrZTt@MHZlMlٲ @� @� @�rU'@� @� @� @� @� @� @� @�TF>G,]Z-k� @�/p*Ѓ&oFnj۰� @� @�(Z倪J @� @� @� @� @� @� @� @@ehE q={F]=& @�*N`1c"?\ѡCk\Kȑ#W^$ @� @� @�, Pk U@� @� @� @� @� @� @� @�T?'|r]曋=_dj|"q*w߈U*w@#FK.$veZ?ѱcxg:c�|-PUaa"@@2$b}"Z{Y1(U{畍y][Y~iL2EVe%@� @� @�5L^  @� @� @� @� @� @� @� @�L`1iҤ"Gk /PzC矏ᆈ+xɈ{H+jIAuɚ{ TT%jgڴi1}H P Pa)0fرѠA,<nݺJ�Z%q>r9q#-)4wCKu^yeCUA`ԨQzU @� @� @@5 @� @� @� @� @� @� @� @ j*ڴiS$C۶m=_dp"j1~D׮W1{gk)ll{WY9SU P)_~rʬ'U'O &0Jh�J"6c"پqƑ[<9rd.ClW @� @� @�ZC @� @� @� @� @� @� @� @@67szvo_" ֠ݺEFGr",(N>= TDRR Kb�*I+> {PUa͛7f͚j_DOQ^|y8l@ իT� @� @� ܟ, @� @� @� @� @� @� @� @�+кu5/I n>\5o#;,S#t瞈xK-Z|ѵk׸ M61us΍G}4>8b*l(:th<3;į~fm ϧri3gNt=~ӟ[lO{(7osݻw7.VZ׏/<F/BVf6k6:uꔛh5kV 0 8qbB:>|0>쳬GqD?;?o޼GMB\XT]a)Lpgd?C׿.Іa#VXO=Tu].nգG?~|F\ 橹u-_<;%\Ç% 6,'c=P~wKw}E$쳿tz^H7p+\:jԨg= '@� @� @�@ݪ @� @� @� @� @� @� @� @�F !իȢ;s,XCOp@ر}D. *?cxY`A+,xw=^~hҤI*L!ZrJVzYȟ8 O_yYH :c7M{\UW]w}w=c|' IY)G?Q,\0;IaZi9W^SWx`yWp#ĤI NM{wk.ٳCSP+TM+{K>##쐖N;-RKq #R�e>:RO? ޓ5:tiʔ)}g?<=8p`V.???fqtAqi�E M^Ѳ=<yryJu W~Θ1#sqqc @� @� @bjU @� @� @� @� @� @� @� @�2hݺu 4Z~bYrˈ%" #rW%e]ƍCf ){>, 2Wy׮]ʒ} fm֨;ȵ, +KA\i=zt\wu~ݗdy晑KRU:EŻ~<Ma^/bvN:$#FȎ},,q/<Wڨ[nEFk˗g/lLsN>YӉŽ @@=ba{}޽iӦ#W_k6tc˪KY6jԨ,ΎܳR={'ܹss)Dk}UV{,D2;)&@@uh{&oz;f̘H!W<|U/B#bB� @� @�(eP* @� @� @� @� @� @� @� @�.04at':r!?V]W~~~b־} oyL<9 *)8Hַ;w .?9V\GuT"DO:uʮIڴi߿vvEZ5kiӦE;-K.^SɲebŊYWAhI:ٰa|Ig^\pAGy$~wyYRWA{e�@~^2a>V{D}~>u)ʂSHV+U&%8b- .Y>V=,(}bCDE[;g.^8Rȯ畞3jA]/Ri� @� @� Pʢu @� @� @� @� @� @� @� @�*Z ;eUq Pݩj^zوn"|2";;sfRyի =\{dxQZ\ʦ%&Mʂx㍂뼦Бssύ;3[_{wceeRSIÇ·<8蠃?0+/x}E#@�**Ugջ={鍽PɴlQ}]vq衇O<SL)d2s?Oc5T?ERcIET0G{fѣg3kO?i%>ZԞ畤`I˗/'F=jҰ� @� @�d`%wB @� @� @� @� @� @� @� @�'2r91jTgEt1lغr->(Om۶f%FƍcѢEYi>~ Ak⡇֥K?׏; "IohYbEX%Ҹy0`@ֿTvTZk/bΜ9kK�UENX'ƺ)tJwqG y)Ǐn!6l={,{X*bv�,?DgLn7ooX-+k-G}4w\ԧ @� @� @@s@� @� @� @� @� @� @� @�8˗׸1UĀRoDuViE{lߴܠA֭[v^Dn\6,;_lٲ5NA?ϲ@_y啸 v}Ma$)HN/<ZnGyd<YPסZlt .ٳgcƌ4bĈHbM4|0~zVZ|ᇅl @@U:U=,]c+W"J:N:m=:M7ݔ4K9s.\zQPȢa ,(o}#@@y ,Yq]oZ㏳Hq=|cfxYoJ5 @� @� @� @� @� @� @� @� @� @� @ 6, o[݇R)o0"͉DѥK¨J H|YpU:3}8qbw:զM?,h+Iˌ3xM;}Qv,}Ѵix㠃n-?4hPˮ׵IAZ[lEHR@[w6-Z]zV Q[-Z޽{[ou\tEY~\sMzҧO~c�@nzcoB'Kr(>Q^C)H2Ͼ͚5}{XKt] P7"e(y暝m۶^yeM7{J#0z FFƍc]w-M @� @� @�+[% @� @� @� @� @� @� @� @�ܹs㫯YfUNWĘ1}F|pąF|eD z"MV{_p@\},n]v7|39,묳Ίɓ'gSL38#&L;r/υw='uyE :th61?8ӳG ``4)^zie &M}Z3K.$&)%>:c ۺ;`dɒ/~?Os_2+of;. cIw}7 O=,Q=bժUY ?{I Z{Iv!N:SsNKc=6wݬsˉ'wmVg +A�*,Q= I"rXRo5>vEફʞ{Npu4R @� @� @ܟ- @� @� @� @� @� @� @� @�%Rp~FSXSN05N)_GlmğѣGʕ+0?< Z=#5C҄:tɵtSN޿*RNEb6Oe˖m,]45jq4h`/^YӦM9͛v:رlu֍-Zlt7=kŊY[l v(Gg.]l_~s` yeOx㨣v);참˲zu @� @� @�!0o^[G ~5bH6ZF! @� @� @� @� @� @� @� @, *v\qeyyt @@X=PzX/  @`}_l =3+X#@ NGydy1lذ8p`ԭ @� @� PjݬWJ @� @� @� @� @� @� @� @�*_`n#u֍c9f׹`]~;LvW_q?A6۬{}m>r!D&Mj3ZT��@�IDAT @ ,\8D?3Ts:wk9z^ Hg[ǪUbF.x̙ׯSxJ!RN;-6|4hPz뭱{&E @� @� @�E -Ev� @� @� @� @� @� @� @� P5&L[;נAXlYw7˗/n)~_ŋ9akI&ŷu;@�+мyXpDv~*K#@6 G=߈5%>h׮ݚ#ye6BK.o=^{9rd.dR� @� @�XS`޼><b<gxy(Y @� @� @� @� @� @� @� @ l2܌\iLad_~yL81UtAOu㨣c޼ %y5´J9S�)Э´n6U#uôRm X[y^Ob-_*n\cѹsxwK. Ҳ~*� @� @�>Z  @� @� @� @� @� @� @� @�5Nm۶Ĉ#bwY87vĿUl@ @�Ta"V8*] PV?kG~eOZ{G-0T @� @� @jUv @� @� @� @� @� @� @� @�5Dn[q7Oߙ~aC#. /j@ � @�JϏ戓OrJ53f̈}fڏ?x|cws΅6 @� @� @�e% P$C� @� @� @� @� @� @� @�Eyyy {:,^{y>q}{7ިEJ� @@ <T;".ܚP1k u]ѥK?~ѿ+Ν|Il @� @� @�J@VYI� @� @� @� @� @� @� @� P ZlwqG92ZXKŋ/o{A\{mʕŐ  @�(3!C"\xOU"=zt':8rao³w^g @� @� @�B@VY(� @� @� @� @� @� @� @� Pz/r}]bߣao/y{滛:> @�xhRW� |qꩧFzcĈqmoN 'N͛G֭9� @� @� @`Sjm @� @� @� @� @� @� @� @�@:ub{s]3ty%'H @�8o~߸r&@d3f̈ . vixsz+SdSsٝ:u* @� @� @�M)z @� @� @� @� @� @� @� @�#ЬYc̘wbキ/7:8Y1o:;@� @�u-瞈 YqL2%>qGɓ'iz+ N֦+K� @� @�lHTl @� @� @� @� @� @� @� @�u]g?Pl 3;;=U%&@� @6 {o̙k|ЈO_=J/0nܸ4hP.sHZ~4hРD * @� @� @�R *%b @� @� @� @� @� @� @� @@ f۷G [mU,^b;b>6mB\vW5;vŜ$@� @\{mD/=6#V#آ &r0aB 0 vcǎ/&Mgyf 'P@+ @� @� PCU @� @� @� @� @� @� @� @@ qlٲXtiW_q,ӧO4iҤW 뮻&NzgzG?ش&@� @ ̟ucEoD+WFsNT3gYg]t{/z3fL 806os̉%KDN6 @� @� @�*k @� @� @� @� @� @� @� @�JH=o'tqA t1^OωqQy&˯^i� @�[_׉#O7⪫"fͪi@Xbbw1tx裏:uz@SN *5 @� @� @jm�i @� @� @� @� @� @� @� @jn뮻ۙF^5NV O?'x{nb.DLR5 @�TAZ,~iuEkq &\�Fݻw+2~ӟn&'unӦM D۶mjq @� @� @& l_46y  @� @� @� @� @� @� @� @�%<xpԫWoc9&Rz4hP?S⭷ݺEyg^ @� P6 _O Z*#޺k%Ps)t_};Zhƍ*6lXf,f͊m٦L¹ʬS*"@� @� @�j@v  @� @� @� @� @� @� @�'pBHgIO:q [G\xaĹFqDܹz;K� @@2[x-,Zg VŋGW^yeW{.:uTgώmݶU! @� @� @@@VW @� @� @� @� @� @� @� @ t!zuY͛7~s܁!P~uE ²t?tw Q @�E5//Iڴ):gfYf>J<q饗Fݺ3դ@I3v @� @� P1WV @� @� @� @� @� @� @� @�Z(0xu&Kc:^zPf Owމ8䐈#8眈%Kܹ@|eıF,[9[ @�T?RP i7.=&P|A=H/_<FmgSW @� @� @@s@� @� @� @� @� @� @� @�T+D~~}ꫯbРAkS}5瞈xn"^{~z=iROZ}ǩ @�D@u%R֓OFt9G3gN/6m/bo߾YRV֭˽  @� @� @�W@V}� @� @� @� @� @�]IUKK4Hw4(*-(* *ꃈ") !HK7H+Hw-?,l~uwfn{g_� � � � �@\ԤIdu~5{~TTԮݿ_o/_>D6-tn � � >P+E iqdBA'ioѥҌ3d$D@o1!N9@�@�@�@�@�@ M�t@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�OitPPt6:% x4}ԯ4qݳޱ?oc  � �ѣ׷믥~=k@_ݻk߾}_,Lʕ+:&Tx@�@�@�@�@��Zk@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ZuJ:Cpp\eiTuN`  � �jyrzBJR!y�a  &hԨQ*ZhӞqUp wjF�@�@�@�@�@�d/@V�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ lVZ(QB+V NbijҥgK9) � � `G"3 /Xh. (i&Wo7ng0kO @�@�@�@�@�d':#� � � � � � � � � � � � � � � _ ?^gΜ YΞ=`]|tŋ~ԨQC&MRԩ*U^!Cd̘QO^)lv ,_.Dҕ+7UOy&*W|ߘn=w;Gŋ.vbsiҤ Y˖-[2es � �~#p?~-؞mgc4z ɒ%fͪ3~u$ 7]!>ҭ[7*nZ ]Jhq·� � � � � @ P+y^wz� � � � � � � � � � � � � � � @Xȑ#.xj!DD�-;JTI-)eZހ-={,9rloF˗O3gΩ7oVʔymH~a8p@7oݻgϞ׽{.HBb[,@µʟ? * ޗ,Yҭ#-� � {ݶm9x߾}n|}gf - ԊF{@= rq=+˖ =,_jZj Kh Z!� � � � � <Jם^#� � � � � � � � � � � � � � � m'OjΝ!g]N8qM<Fޠ*o@UbTF e͚Z>`+{ 9M4nԩS_jݻ{B.ҥKnBwy۫mv{þ69whoǬމ5o޼!HE-9sk,Ə'J>]6M1Ck)yr乴 ڵKKk6|8w˗/ƍC 6mZ7a7jժʕ+ {°l6?m,݇/^-ؽ{Ϭ~ *.[-Z^m?+v)SFe˖uKjw&K,n;@�@�wܳauVbaYVRzms>nUT)5jȍl,gϦW{}llc6yl,;y'ڵKOwv6δgd /{ƶb%Jp!jn^ IY_y[ʕKz0@�@�@�@�@�/W=%*^@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�, ٲe6m&S߾}\^C# *X .l!DN&o#ox}{ jLTx&x/] II)1,7`k$iz)E yht=ronBKjݺunB~ xXbHpXr7zT&H߼y ~Y XUԩM( � x2`T4xo ,jPY ^z3M7²,ʻ@@([O\B,k۶m!7�kUR%ea 4p F">&yMbZ.]p$F�@�@�@�@�@ arΕ6Ls&T$@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ /_v=.dzO*޽[W^RѢEC,{)… 'bz3 ܹS,,rE& l*W sP{-IH c 9M<2c/.Ǐۊ{> U^]5ktTHaTl2Y ,[nQլY3eΜ91.D�B@L4HY̙B͛’mg*U,+WX¼˚5k\؏YVC섍7vaaqK5$66l:wpܸqj۶,.m@�@�@�@�@� P+W@q$ � � � � � � � � � � � � � � �#m6-Yą\Rk׮ٳg]pV%dN-[VKvI&` �;vhӦMn .'ܾZjQj׮Bl{JV6Ó5zMKgW (GLm *SLQW {X/^3gžөSmݦvکUV f"@ `"@VZɓ'kҤI6Jկ__7|s`- ]` ӧOdɒ9ٞիF�IY ?_paY3F۷wmI$ N� � � � � @KEV8@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�t,`g!9rą6UXQիWWժUUJ.]:Grh]͛7 m{n;w@լYMo[V}\zKOh<ymV{ *' 2fʀѾ'Nرc5{l`A>4i} @\ עԇ� f}w9p߾}ʟ?Zh-[iӦ Dm,hʔ)nٲee˦֭[PÆ 5(Qq8y@9R:uo9QFcǎp  � � � � �D.@V>m%P+2!� � � � � � � � � � � � � � �  fΜYfi޼y:}rʥz˜,D,6tR7 {nIFuUft-`)S⸅.\M(_hٲe*]z!ocǎiod,YkuMYf `@ Ԋ+IA�8p~ >܍n&ps=rʉ<?]#dd vaE]tQ%40y 1lQ]vQ@�@�@�@�@�@ r"l+Z @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�?xfϞɓ'kԩڵkgϮƍI&n!J@9skoi߾}.0oW˖-e2eJϟW_}{OV6m#&/n:g߻zꥧ~[E��ZI3~7nn(۩S'\ ⺟Lmdw^5o\{v㫸>!֭[UPTGk  � � � � �D.@V>m%P+2!� � � � � � � � � � � � � � � G>}ƌゴN8jժEn5k*eʔ~b_6lдi/h ҭުm۪uʘ1c|:?WuI=nB'x[oM>p@YߓO>^xA3g.n@ jE@O,PܹsUzuӅiKOZ͸r g3fB z饗Ԯ];؁ygΜQbԡC}G~яÇ`sE{h � � � � �,@V̯l8@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Xjx ׅ͛%ٳMn+Voڵk3w\ 8IէO͙3Gԗ_~){ʓ':v(xի_Ÿ:w;wP(´%KOvҫJ(o6z7 � @ ,[L7Vf͔6mZ|ruEie`VZ֭SŊթS'UTISLۓQ> XWXΟJ)9@�@�@�@�@��ZI%@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�8UV- .t([ܹsճgO(P ;Jb-={v7I?O>޽{رc>OBV` o6,YRG\I\3fs=[ꮻ҃>&M$Y:� �C&[hE4}t5j(@{XͮP~7)S j޼mX-pa 0iȑob~.\@�@�@�@�@�Hj%J@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�TѣzT`AۅiXBk׮O?|hhvBd͚Uݻw׼y܄mڴqATf!lvJf ,PŊ]pܔ)S4yd+V,VurLW_iٲe+U#G^@�@�\`Ĉ*]{?~{SNJJҘ1c\=3. [`*ȟJwŋ,ڂ� � � � � �IL@$vA � � � � � � � � � � � � � � @` 8qBS"E_׾}\MjS:Q/&|߻w>So*Qz!wo%j"8դIըQCׯW-"ؓq!`X`uA< qK � @4N>:wx@7nT֭Y LJ-_\ox 5nXSQ'N~SO)cƌ~.]:מUh  � � � � �$-I;@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�r劾 J&}uMiӦ Z -0k׮0a^}U꥗^R"7`�;۷_)948p,(K.ڹsF=J � @b رCZÇ5k,0m JJ6~Զm[UPArRss 9sfd͚m˝;ɣB p~tmO4m'fxΝ;wk B�@�@�@�@�@�$!@Vt@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ֯_=z?P~OMQ zRL{W[ְa\֏?JM6xjMnlT@vT`A~>?~ەu � �q$n:z*PV^yQTʕuwj*S˧3gԩSpcǎ:tΟ? *];RJ^0"xΞ=AgϞʒ%ߙxC~H� � � � � �/@V_B:� � � � � � � � � � � � � � � ~&Mh.&AO UT.µl޼ s{w%@>'|ѣGM6Z\N͚5K7#<C&@�@6mmT &(cƌ@Z]3gw}I&1Ux;[ݻݲm6mٲE7nȑ#]�iծ]=jJUV %#!CPz/{.]:.(@�@�@�@�@�@dzCG@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�s/Q rpyi^:uxUTI?e˖`=3g5k>H{NrO-Z?w^E7[@�hH*_^<80K+@ i >|X5jPB믿R{zgSuݍ/^rA;v֭5|͘1C .f=zp}K'OIFSʔ)_+˗z~>� � � � � ? :$-͝+5lO-׈"� � � � � � � � � � � � � � �$ Ӻ{tRM<YkN"= <3B?' �[k7mTӧQ%cqnٳg+Gޭ3gθI-H`ر~@9_lm66ۗ}=0+_}U}?THhɮ  ׅV!\ZlM6iŊ h\[dcߕ+W8͞QFiĈOL^dI/njG~M4IzW_}͛G_ ۷oק~zUqJƍv)Eo]ZD5;vLZR~ϫO>vԭ[7(?~e!pv) � � � � � �ZD%eT;@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�FK.Z|ϟôLѣ3g“*6x޺$+WhZf}R(Euǂ.\ݲɻO8?<('UJmօ+n_ {W\MNA�@�;#Gjڴi.8)[lqWq�]Lo wۧ?1>(U^] О={4l0^Z*TkK.EYݻdjmI T޵kO>ц 3gN/^\C q2eʤ|_|~^ZHVnuPÇkʝ;Ѯ׭k~-YdQʔ)=z@�@�@�@�@�-@Vh #� � � � � � � � � � � � � � � Oք 4yd)S&_Ֆ*UJ?O M!.dc"I*m&|&N*%W\_<Lv >}K gK&~9;> `�ƍӖ-[y4#� �'`㝗^zIݻwO!ˡ b:믇ʯϟ߅}:tPۖ:ujuIk׮r뭷ɓ]fM:ݻ=#zsT~}'|R@:^pA`v?>A ԫW/w8p@NQΊ=.{ҥ~^5kV� � � � � �H W1>!� � � � � � � � � � � � � � � t$6ur*>KI̙W޺&Μ9s""O_`A 2Mܽ|?h!M.\Pt&pIvlٲȗ}"<8N.\XC� � VwƇa%1ڵK:x,(cƌyeWK,֭[ҥKoZ *nt4~ܹM:A2O?ucA /P ,SN+!CΝ[6{#O<n,aV>6&>Zڱc|ڗ@�@�@�@�@�@�5A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ 2eʤ~:G~W||_Uv>cWC/e˖5}Nl27avÆ u]wiذaj׮חv][orM{=zP~aם<yR?k˟) (նm[[.>_Xp}v1Bwz%l[SǎեKZ*sιmw}w+Wtm~wf=cjҤ5V`S͚5Sn4zh&7A)Sdu{uۻwo>Ʈuݺu}_>O96 }x;w w0`ڴi-Z_C-d�{c^{N`- �  O_-/ 4gdk̞={kWcX$en|iAO<Zl|WnUF wӧmlgVP=qDu]ݾ6v3K+wc9[h"EB*Mݸۦ(vJ*9GZ蒕V<{lgjS[ϟvټy^y啐�0_{*Ŋs;ST$=$|ɐnbcЈ;b[AAAa-?~<d=s4dϞ]G� � � � � �DO uvgo@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�MvݡCM6x8«lҥKŋtw[nQ>}tw�+&'IʭdΏ?A= | knܹA3gTRY 2-[)Ju6Mns_^kVԩ]մi:_'ĉ=v\|gi„ XRJ& 0 $#GGga\7nt_/^1rHUREWּyMo/SO=/[ؚw21cƸ.ݻl˗݆cA_.fM4i@fiQvmi?Z`kRX 2QFʕ+>؄h\.\ֻwfiu}Ξ=+s � �\ %c@ Kjڴlle ^,'lo6fܺu2f›mdv|g9/ڶmԩSNqR[qxʔ)#{g{ }裏b]8X)lU `is|dZ- 8PjՊ9le0˂ ٘¬X곰O6ƠO`ԨQ0ЁeZB-.w;Y@z֬Yݧ~5vDQC{]QȖ- Ëb76#� � � � � �1H#9@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�|6l&r8&0,+6MPnd>Gq[_~ٽ?.LUVns tb\r|DlBnA)Rp]dX(VYؙ3gѾ6&]:YM>x`w^vm4iL޶@NUV 9Uٲe ,Ym+Wh…n?MީS'Vpaf ;v 6l50->!YMjn:3;wnPlx^Ǐwײ^z~⥓ X]'OA�@�=SܹS%Ky%1Z[uFr7B,8]tz]@΂PBS��@�IDAT Ƃɓ{ @n u_bʕ+^5nGiӦ ɶ舜C잰lZ ~B視k[Q,?8.X{Cy V)R}o GXw@4̙S� � � � � �DO2zǰ7 � � � � � � � � � � � � � � �(`AO6qz̙}<"v˗/&C (SNi„ ʚ5֬YۤŊsr?^#Gt!\6ay%K|~;[ c-ae̘ztzС! [GD$o)U{[bE*.]ڽImw+iӦu?:f&);ݶ'|-*tP]{Zn̪Wzy_~r%7Ѽݓq]|޾GV޼yC~Z[蘅my }%F}d.@�@ 98C 1$#{&9Zec={7t(NwfXq*U\@4Ρw6g?Y۳uxϝ|DPucB gx.(2e˖N:.y5'xvd)tHu LF+6m$^ޠ]+^{5KO?>¸-B 11;wn-]4&r  � � � � � @Jb'@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�9(eH*UH5[nu_yX-We,<gƍn ي:ujWM7IzxBc .삧?vS?{ÃB>)83.Mtm{mvJ?5O<q~F61x\\Fv1,{NGZG;w{b^7oرc:o�]\M] � @rH&9r$޺3/6b k2dJ(9Zl߾, xΝ.ǂÆKY0| (SL!aaO~3jQ7|s֭s!evMcSb2uv%c ~hܸqѣncܨJ-\}ATu~'8p/ � � � � � #bA � � � � � � � � � � � � � � �.`^Ϝ9qO 2|rY?!-[>!ބ7Izx¶&r力=6+W.ל ^Ӭ^u͉aƌʗ/-|&~T{FȖ-,<k޽ڵk5㵻q,X0j @�@ y -[Vk׮MP_/_ڵku1uEg.]ҷ~QFɞmLѶmk=skNӧOwYXx%qm..Ψ>u͘1 *ծ1nKV,6*nݺFO>?1k'St>({ƢoF) JX>qѣmGV9@�@�@�@�@� P+ 6#� � � � � � � � � � � � � � � [|ڳgOlŊSL4vX^:> Iwޭŋs no.\p`Gd6 λ--Z:F^|9VZn_+u^>>u2dvoM_f͚rG6ʕa]Ӈln݁o&7Sd@^@�[iӦ:uj6җg;vgUܹ5bu'NO< i߾ gy´neϞݝ̙3 =& Z'NWGڸJ\U?v]-*>?pDlM`Q|siܹvj}͒zQ[`ou)ҝ-J*z#6ZVpplQͫs]A5� � � � � �D(! @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�O%KTϞ=Bk9t 9&ի jذ^u}GEFn2 2_3<# Ա/_Ro!bW;n޽p}ȗ/8&n:t6n:wϤI[p&.]zӫM\m%DGqBnݱcܫ9y{odV8^C׵k.ѣ5k&6y$9s?Vwݼ&ī]멧s=Zf֯_Fdzd~:n޼Mj-[}S^ X_ 讳ֽC@�@ ;j9sf8[c*Y_G2|>7, .WfօyWFr㻗^zIVŋ5a7Vc/ b{.Snec/Booʔ)9>Ķ?B`ڴi#۷O?oպ1ro 66b!V9{ǮoaZ#GtڵkCNv<ױ*ywlǗwO?|l,j}†<=.jժ8=jY {g@�@�@�@�@�@ <1=@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ j)SzׯҦMLJu1yd7Mm;\Ըqce̘Q 4l2͝;M~SPPB nBp>qD)SFgϞ/+u8 P& ڹs $ɿ{-[gD6ѺIӧNbŊ&zulBm۶c-HwuaT6t̙C=t_pA6mR…eY4H&:ۭҥKi뭘a\ /8Ss/s~'uq7a~ܹUJy睮nǘ1cܤ6M|ݡC7Iy,\PlVjUwcI7߸_,RƎ :);UTW\9^{?5ۺu}l~ þ}wZ݇ Ɨ}Bvhɒ%.}  yXwȽ yҥKݸtcSlƀ6>2d~G7~* ' x~pA3f̐H}*T;<P+WtAOT^=7^c-`k׮馛\,W_u&p֬Y.gŋf͚.lٞ]c_Rb=z!Լys-[ֻ9u¹mkVU4[ݡea6^+}a,ڂmo6N1-⮽c/R=[',6޵{UD? akԨQi ?cjadQ`j'-(ۂ) � � � � � ?9.%ys9J4Rxϔ؟]@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ }wO?T?x kN>&K�+ []Oe&WVͅ???-&Ϟ={HUa׵lM>,Y(G!ʛ#GhÆ nryznBl <.6 |6mdk2]|M)UXŤ@8&/Wym @dUQ<6@ l`aSO C!gd tyׂ,'t0T*"|kD 4iҸ;v ˜-)tڜ-[6jSY@菫ȇ?e6iݺ3h �f v`=#j}pO>ąK}bUmłv̙# `9D!>i m,�nݺ4 4Xy5_}_su E�@�@�@�@�@ rΕ6 $hR'8 � � � � � � � � � � � � � � �XK.p{1ݻWo5'4MLTrOk*Ut_!̊{N̙3u;D6{[oiĉaW_&kIXXC?%&ٳ["L7|׮]rk&яksX\yKcw&׏DU}nuɟ?8@�@ =OzTFx ukFl+ bʡKtX }5߅Ӳ~B:ªBzؾ߱c ԩ7n?-�mmbaZV-}ҥ4iƎ+VZRHq!iӦu#sh~v7֎f5n莟br@=槟~R%|Ӳ~ZROZry󺐷:?E�@�@�@�@�@�-pJ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Ht~X6pl2 6L HvE�{n7ho߾Q&{rhpwľ};wnѢJ.}+ҧOc~IK?'|2A=B:vlTdɒhߕ8>Zh/^,c@�@�0- 뮻\o >1 b8pڸ4cƌ, rʕ@- ZvVXឹwٸB,,¹*Vxݱ"v|?ojGe˖խ[gX @�@�@�@�@�W=%>*N@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�X`۶m.T^/ J2e$7ߔMlYfnf KbC#F{UZAu%?;C̵nݺ˗QFnoo'}w/kԨQj׮]"S"�#// ?S+ ]ϫUVZfN5kF O$]v~:zΞ=ԩS0Țc㮢E?t)RDjR ԴiS*U*]xQ qGډP⡚gow̙ѭGՐ!C{Xk׮nl}ݧ .h„ 6@�@�@�@�@�CRܹRÆɚ"ڝO#8�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�b-PD -^X~y}z\XU+ *TZok>TRiРAn+]t޷FC`ڵz4sLSoznn5d^wy,T`J6m]x�W^U~\ߗ_~IVs @�H6_7СCվ}罷�7xC,[o#|rr̩oF6Α#G!{3fLxb̙34i\.?Dq}Ĭoƌʘ1cCm o!lqQl<bn͋ɡ� � � � � �D)@VD� � � � � � � � � � � � � � � @Nw}z饗Լys5jH/4i?'A6v|OKfni;;vVX*UDw®n֬O֭[0q)_| ۈd|ӧO{8q 4ԩS2֠ � @ O^?+Ο?_|2dȐpL> X G}´ʖ-+ /| :wt0;ٽҶm0kw fK{@�@�@�@�@�@ e�&"� � � � � � � � � � � � � � �  .#Fd" Y[gsSիW5m4~\炫f͚7aZ޾5hMHq׶Sz7+WT5o<͜9Si#6U#� �Jʅh?^Gvs gOV%z7ԇ~uiܹ:yfϞ>}"E D >|8լKF/_vr@$ � � � � � 8j%;gE�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@:Uj„ Zvʗ/=zPB۷lr@ "*QZl4iҸ .\(TRZl]3gK/v*XV^ ƢFE�@�w߭)S6*(u5i:vݻwǦJc3ϸ,h{Rkڴiոqc?qG=Cl+)SY([ƻ'Nq/W\"큂� � � � � �ĵ�Zq-J} � � � � � � � � � � � � � � �RB :t<ҸqTtiթSG~83pxR8y;vm.mРA{uV)S&}8qf͚%K꣏>RpppRlҧ#G>3}ǚ1c˗(m � @rO>ggKn>A>VX,ЉلKN>w}WŊӈ#_Wٲe#mH֬YehsN7oԶm[e˖MΝŋ#I[BہS Բw@mG�@�@�@�@�@�? PO/ B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ w۷mۦ9s\rzW?~4p@رd,pA-[/>nOڳg{=7 | u]ڴiyK.bwSLQZԱcG5i>J"_F � �EaäI/,O4}a}=z-'xBgr!J~W_U"EԿK۷o=g [n@#Ghݺu/N?-RݺuA1lI޼y*U*ba � � � � � �Z@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�DFG&Lp|[馛TlY=쳚9sΝ;'`aR/k5kotIFeرceaTAAAא}mٲ},\x/tjE`1cƨrʺ;/_>\RÇww@�˗iӤ<y Õ2f'lIx[o'>󼅟Zր<NntaSNe'rԹsg*Tȍ5,HkΝz]`q\*T(Wo9,L~طo_ � � � � � ),Z� � � � � � � � � � � � � � � �Q XP… e/ڸqҦM:uI&_jժGUTU`͙3GשSDwqZhu q۬]vw |N:Blbzʵf7hС:pn+Tҵ; H&lR// L:L7@o6o ^ڿ_WOU^)kVߛiZ&M;6؍ rέ_L\Z5+bO'm61B? -Rx uЁ14Hl߾]%Jj6^& 裏+@�@�@�@�@�x8tH_z;Wj0^Nd+%P+^Z:� � � � � � � � � � � � � � � ۧYfe޼yڳgkvZ6qѢEMׂ.]%K׳g*gΜjР6mf͚dɒӧh#G<4dDv_[T )ΣGѣ5sLτ,գG=.- :A#@�x P+`8qB5 -cYLzKxpʝ;wze!=Kv-[RLׯה)S4qD-[L7x 0+VL. 3jc'O*M4Ԋ;SNƟqW+5!� � � � � tԊ$P+v� � � � � � � � � � � � � � � _ $עEdL6l˗={vUZUUTqK TT)JBrOلk֬իj*߿`jܸ֭L2J"E\zU  )ڴioݹ͙ݻw_ոq4{l7mZn/-C� P+9TkƏ]+[7IyBe.f믿\= q.7_|s�رcZ`OSʞ# 0͛+UTz쩕+WʾIp¤� � � � � @ sRbnǑ � � � � � � � � � � � � � � �3g67֭[]VPPJ.e˺W{oKŕ)S?5nR-[hӦMڼy{ݸqΞ=B-ͪU&x3glҥ:wS-/^tRcƌq֬Y3r-jIRI Gq�3gԬYw8C ڵӝwީn/B�S@$mGå!CyޗjԐzHj^ʜ9anI&iʔ)Zt.]bŊ` ovcֻgVdҶX+VZf͚'m_+Wg}$L $:D'@�@�@�@�@�cbJV8@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�'t}nq }eΝr_<yܤ6{…UH,XPyMց[k޽l׮]W:G s*S[ʕ+&u/_|G+Vаa4rH?~BYw߭t}|pƌnYd ȗ/jժ&ѷ *(gΜݜ)\llP?�D͛7wFz6m@� @VrXHKiXɓOG',7a,Pys=OZVTɅV4֞+K,3FT߭p{.^vV^Xlʔ)]6l$={v J^JfOޠA&$ >òE( � � � � � p�Zכ@-_@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�d$`"[ Teǎ!Q6؄TdlyʕK9rM^]fͪTRyW :qℎ=>|XwY];҇ԩS@*Z +^ "%Jrpolɓ'pӧI۷o]N:O] RbAhV>e˺W 8["l={6oB,΂ڬd˖-$̂l@w|bOXw*O ڰAZ- ʔ)a֭[UV�*{`eq6n,L;ׄ ցc>i*("1T,WEƂ%"vQh4&DQMLE%رEE@@@ Ho'C;Գ9<0m͚{}7iR?>{;vl|EsNE2nD /3@! YMϻ{!5m/fM֭1  @� @� @ Z+PkI� @� @� @� @� @� @� @�*@ J/7χJ-oŠRUzzJ*Qne)\kM7Zje˴^rFҜ^^r/X .\ejÜ9sb\|=o̙Y{S@V4i 勿\>ʮ髯/>ON:) Z_׭2dyذa1%O5kB5j} (<-K7hlNӴ鳘.-Ӝ>g鳕iҖfT?F)ܫBwD�k. PkI@ȑ7q=E =,:iB)*ezKX)SrZqkzKsZSNlx8=kq98xYqZ,3MiBpAi\|ސA_y K+#~7Ϟ w"L~iNI.]]vK@� @� @�֩@5v$@� @� @� @� @� @� @� @�V!^BN-z~N!V@,tKW5~\Q?sA[Ӗ ʇoЮwpbs^_haF~/e3~D 2ܹscfqeWg8}fYiH|@>p+}RW@j޼yl2 DK94 @~\J bğ쳑Ew^iEn\W{YV HӸxƌEXi==}wEc46*gsȃrӋi4rùҲqYq+&Y෿mY`]yGiРAҥKC  @� @� @�@5Zs;g @� @� @� @� @� @� @� @�e(駟µͽ?7{q'~Wwǥ  @@a *5 Y qMCDtqpBnyaZa)[ݻgsO>d6d^}ű&D߾}O\5� @� @�T lc5?ՙ @� @� @� @� @� @� @� @�e)PF8#㩧oxwcǎѺukbرeD&@� P.&Oo"2wÈA"7U.nF(P!twܱ@[fͪRJ4n8&Nf8� @� @� Z+� @� @� @� @� @� @� @� P5j{K?> 9䐸馛UVѥK{cΜ9KJ� @` ѫWV[E?w..@@XxqдiӦI&1iҤ /"@� @� @�V@V: @� @� @� @� @� @� @� @` ?)ƏO<DԩS'N;H/>SW_Ro @�*0xpıF.&b?!b̘.hР7Z`„ 1o޼fmue^_ 2eJC @� @� @�% PbO!@� @� @� @� @� @� @� @� ԨQ#u떅jx_s5FNb*F]T  @�.0`@D.{1jT1|x9DԬY{lhQ&7U@ ɓ74 @� @� @�\@VG� @� @� @� @� @� @� @�H 4??裏#n-{wΝ1{lX @�*FWD׮ժEbdBvZ(s&Dfʼ-5)SjG� @� @�TrZ @� @� @� @� @� @� @� @@yC7.zꩨ_~yѸqٳg 4(/^\`� @ {q!x݈#tp]! P`رѢERJn԰aØ<yUl @� @� @@ Z%@l @� @� @� @� @� @� @� @�*@G}4&L]w]|'ѹsfm+QFU$@� )6q͚E^D c I @\g͛n#S֔)SV4  @� @� @�+R  @� @� @� @� @� @� @� @�C~qyP>:m]t)瞘5kVK @�r+ڷ8Ȉ%Zi�Z`6P+;¼ybܹ @� @� @� , P\]#@� @� @� @� @� @� @� @�@vnqO?7^zE&MG/ŋפj @�X/Eϒ mÈur9 @T&Lf͚ly+T^ӦM+oM^ @� @� @j4 @� @� @� @� @� @� @� @@Y TV->xcĉYְaâK.ѪUbĈeD&@�|ѵkDkGnģFs%} B =K7mڴ ڲ!Pk]� @� @�H| @� @� @� @� @� @� @� @�V)[9ov 2$;۷on::vwuW̜9s(@� @`]\ܐ4v=o"^z)b%~u @`]L2%5j.*:ҿiڴi6 "@� @� @�ʯ@{ﴜ� @� @� @� @� @� @� @� P&m۶믿>Ǝ=\4o<~E&M?i⋱hѢ2i @�Tl8ܐ4G\kW~O`1hذak|)Z\^7)D� @� @�XGj @� @� @� @� @� @� @� @�MZjѵkxcĉ?1F?яUV_:^X� @`=|]B]#Zx晈;㈟d=\LXSNj_:QFԬY3f̘Qx" @� @� @ *N  @� @� @� @� @� @� @� @�#gof :4N<߿i&wӧl @@x챈m#* #q|W Vj%ڵkǬY h @� @� Pj{ @� @� @� @� @� @� @� @�H!Z^{m;6 Z޽{G&MN-Zq @�e/:EsLג +YۦXӳ"[lŪuԉ3gk8 @� @� Px h @� @� @� @� @� @� @� @BTZ5<xbĉqM7Ř1ck׮Ѳe˸KcС:A� &M8Ԉ=X ⭷"7yuw 5 @`} |7STEjU;_ @� @� @j+ @� @� @� @� @� @� @� @�*@ݺu3Έ_=={?ڶm{wq1}J㡣 @� ,\?GiK/Fnѡòe!@@ ̘1# ӪRJ7uWv Xay��@�IDAT5kD @� @� @@IZ%El @� @� @� @� @� @� @� @�W֭[5\G^x!n I&ѽ{xbaJS0 @�T7ވ}/8(C#;t_G 3g*`׊馛Ɯ9s @� @� @�V@ :� @� @� @� @� @� @� @� @`Vp@w}1iҤ[c„ qG-K.!CQN"@�(SFzj~E4j5kk%V$֭b܏@ q+u� @� @�@B� @� @� @� @� @� @� @�k׎N;-^{1bD~CEvCqmŴi*/ @�*@~mۈ"780b+`Gu�J)0k֬HϺyU@|� @� @�@2@wI @� @� @� @� @� @� @� @� lqUW_|/R.dm\|ѬY8cg G @� Z`Ԩ8Sȅ}q^A7Y )Pk6[ )PkܹJ� @� @�@AG� @� @� @� @� @� @� @�UT?&Mo=&OvXh".O*+~ @�ʝEcN;ELѮݰ8QN @`~mdMj� @� @� :VGKY @� @� @� @� @� @� @� @�2lSNW^y%FguV< ccԩe6%@�XaqePaѦMUʡٳcM7--/}7hK @� @� @�UZ @� @� @� @� @� @� @� @�%[ǕW^k 4( կ~͚5:*Ă ZC� FpCĮF.t%b/>}J|7*B TZ.# @� @� jkQ @� @� @� @� @� @� @� @�l*UDN{I&E>}PnݺE?y mq @�eF#.l[ C]RnذaJ6m=T�5 pt� @� @�(Zr'� @� @� @� @� @� @� @�ؠJ\xᅱ;lbߣUV1pUun'|r1jԨ8s#Y.nş2eJ3foN:f?8Sŋob7xh_ɕu/RV_.]w{-uY  @Z /1{vUDK*Mc.(jԨݻw Ռiֈmc7DZ RA-K3.ue (#9sDZw|ܹss=/a� @� @�T^Z9 @� @� @� @� @� @� @�tŃFaÆ_|cƌ4@ $cĈꫯF.͛ǑGO>d̟?*_˳z4hPV˂ _YgW\qEUx>+WrxvXV_ VZt1}٢SKSt  @`-*rcܰ&;/w"viJXO?͂dSpO?tRnӔ VѨQKݒҌK]Hj}ws V^װN� @� @�*@{� @� @� @� @� @� @� @�T*^z)ʢ>|ɱ.m\juYҤrݎ$uwǤIo߾1k֬8ꨣp޽{LJ~AB5k]3~W_~tAqf ʤiʟmx'N¹RpXo7zũ.~Nl @�X`ȍ#+^FV"իWw=vqǸ;-T=4@*" .4~KբtoӴqp*R@ ̝;7jժU-XZjTR%Pwx }kX'@� @� @�W@VzN� @� @� @� @� @� @� @�*1cN .jժ-](-[,Tv?_|1He>lnYڍ7'O^z뭣Eg/K4m49䐢~z>T"QF9EJLR,fϞ+_,ܼCW_<.~N% @`MϏ\gD׮ई[qmi,`hӦM0G^ +8bLݤɒG7;ST+8T)D ̙5k,Kϭ]/B  @� @� @@Uy~ @� @� @� @� @� @� @� @� #0o޼8裳pK/4&Loȑѱc,,'SO=5}ݥҥKqYP鼞={AcƌESXW_7pC 0 "58ꨣ#c=6HMi;)++MsN/t4tи"-86{ٵǧLoC<CHe>><eaSW^ye4o<?Hr\])a-wy'h׮]tnݺYW HS|o<gž|l{f> [s6 @�!0jTľF~{D߾ Sg;I'lRӧ}?O/o9<l,?iҤʍi( vi%5jdtS>3Qz袋gq-3ΟcI̝;Rj-Z{կw].tիW.q{~חA� @� @�*oJ}&@� @� @� @� @� @� @� @�ʻ̙Ӳ@{. J/hNT)_6,{Qsg ѣG@Szs Zxqu]ًS՟,h+dଽ+ҋ_~,/υ±Ҿz*+RW͚5}ѻw,+Kl%RoGqD}5Dz|~z7r-OİabȐ!/"gH)` V-S /Knv1DfϏu9i&;6iӦTߨQ,kĉٱg)(+{iӦeu|qi?'; @䆶)4! -]%iiL/ݻwƯ*۲1| W^y% Jcilr73tN>8òg裏fi<[|\=2H!S)9UJ*ZZg?Y\{q뭷fA)T1;L //Zo @� @� @j @� @� @� @� @� @� @� @ҋ#-O>$ ~Y/OrJl;g=IB7^g}|0 JRW>)xOҾ׿5+;sOcԨQOgeSkO/ ^z,VZq '_?TLרZjTV-6d+sԧ:+w߬io~0R <80 3Ki}=nKt)Sderɓ'geJq<LԫW/;3mt9g-OGved;A�X _DydH#7~WTҴ?Z)6M)(6Φ闿e)xW_?i( n%fgVZŏ;{GNRNn<)Y))9M؇Ҵ9w}w}w %՗歷-w]RşvZ!@� @� @�*@J[%@� @� @� @� @� @� @� @�*̙3r}=M6-[cǎ馛mMKv)f̘f͊/.\ 82 VJJcƌm6+Nj֬Yvnz1| r-N:q_|Q K RיgYt7޸h={_[½=ܬO<D<cEիW־^ {x饗СC7ȼhѢEzYCk3խ[7;}ѢET3l_͗9vpѵk} .o&~fk͗]vYVg}I�Xĉ tDisUTp Mc4fOSwQT2B;K,)vmbEZYo絑#5RxZ ".J!j)H8=w@y;wny㏋}x?K~:۟~T< x  @� @� @�)V @� @� @� @� @� @� @� @|e^^zk>>+ **[Iiő^\4g1bĈ/~˿Zjv? %[^>Ĵi⩧pT< ,+XݻGϞ=cѭ[,L);߷o|//.^6J&M{7 A; juo][D&M9V7xc<qgߍBjԨ_iP� \ފ\QĔ)qI-ʝ)M6K;묳_ƲK(1wVˁ!yE]3UQ!+ʙ@>P+$UΚ]wd~K&@� @� @�@- @� @� @� @� @� @� @� @\ TZ-ƍcƌY͛7϶7n\4ZEs+jՊ3gfZ/e۷o{g<<o޼x"7nȇn-sr ,{'|H8p`s1YR:͙3'bX]N;vl\|3:tڵn!&NXKlYըQ:g)YKX͍Y&O#G޽{2m5/8 P+Sv[kKjx≱fE>}ָ^'@ 9ӳ4l"PQ*{zEd @� @�Xֿ+ @� @� @� @� @� @� @� @�Qy_}ե2xYf뮑*tn~_ŋq%ml%f _26mݺudA]|Nώ{1iҤ޽{+[l<#ճhѢѣGT:h֬Yv ov.XS\{ѢEHU}#>(ƥ=cY~?҈#ж/<ے� Pj\k䆣q晑 #--@BRl*@ JAԳJ/JAݕu]w^  @� @� @ Z;?g @� @� @� @� @� @� @� @�e,pfY7|s\3f̘:th\zYT Jӳ>)hc_.Lƍ噹Ԁڵkc=x`qq9 '7xcVnʔ)rԨQٲ)Hn.q`TժKa̙ٱcf… [nɶի{Wk.5j~v<:]yY:v[ouEuXY?:tn-&N<@YL&MD^]9uӟ)lYx׌3Wh[ozh6YZA+ @�RLqA >xш'ȴi믿6m,Sꬳʎw MS1OiԩSyqaE>}Ꙫ|R+9s2]YL @� @� @�Z'|5 @� @� @� @� @� @� @� @�v۝㩧ѣG>?+"R`Qvqyދ:* :3?ώ|1bĈ8>r)ǀ"rY@R {"GzYW^y%9ȿ >ۙVZѣG/~ժUvѶm8Ų孷^xat%d/$kc J/OaL)D+{6.i⪫ZnW`7c=6yHAmկ^;)4kK5}1pv-v ,{wwE J%OƉ' /Z*Y6 @`#GFn|q5x6,+;,sή^~;wމiJcZE#YHn?~皻ᄏI jmwWw=n~x㍸˲}=P7[ @� @� @J[B� @� @� @� @� @� @� @�(p> jӠNR֬Y/^hQ3&j #sUTm&[Ϝ93j֬5j(:_G W2o޼dMb„ F-o6 vmv+α (0xׯ_oӧǏ~HnGydvOMIv->'}+Z_̞JN)w vCJM�&Ɉ[nl=_k&ݺE.3\ճsaT1J>U^ �?<ΝԳߊ(GR>\L @� @� @Lh(bРNڪ @� @� @� @� @� @� @� @�HA;LUVzGW;[yS2GKNLaZij$6,vu׬? G`=4B ѣGHoݻw={>{[7 ʗ^zviMK @j <xĉ'Ftq\:0lذhݺj: ]`Yqy۫} @� @� @�BU(wB; @� @� @� @� @� @� @� @�5xktne8s4mڴ2t`8~<xp6></^\Զ5kAcƌz() UVV[+j+׏o}C\5 @�r p-\q7ˤ]СCcqǮӺoh޼:Sek/.vmK׾1j Yo^.yoz裏.>0 @� @� Pvޕ  @� @� @� @� @� @� @� @�xsgo8zHAi֭[̜93{,\w͖_|RWM/ZOO>ƍgZ[neTVmr6 @�S ]}~_+n:jԨ.VA#P`֬Y"PaÆ^.M� @� @�T(Zv  @� @� @� @� @� @� @�<kuʈN*O| ԩS':wO:5 <xprܸq>8Ϗ<0% @` ,ZѫWD߾Gt:R_jFV1^^ jծ]'Ӓ;cއ~@  @� @� @�BUhwD{ @� @� @� @� @� @� @� @�*@?q6;W_eAZ)d_z+ylnРA\pѣGhٲeK @Z ̟1FOD<Xᇯu* @�̙3) @� @� @�' Pk&@� @� @� @� @� @� @� @� 7nzh6+/G?0n馸ˣsѳg8ꨣVZ @�7/#^y%"7X*@�+1cFԭ[wG&@� @� @�X@� @� @� @� @� @� @� @� @�hѢE?1~x'N:qiE&MSOW_}5/^\vte @\ 0n"x#⥗i˛c7/6j @� @� @j]& @� @� @� @� @� @� @� @�jԨ 薅jM0!SNvUW]G.vU @΍8찈#^|1C嗳�\o|$@� @� @�*@J|u� @� @� @� @� @� @� @� @ 4h ?x㣏>#8"nfmsѿ={v @�]`ΜC^h~_ P)Mׯ}i @� @� @Z= @� @� @� @� @� @� @� @�(Cw9?ĸq⩧zřg7={ƠAbeB&@� E"<2rK´vݵPZxSLl"@� @� @�X=Z4 @� @� @� @� @� @� @� @�^zvacń 뮋O>$:wlM\q1jԨk @�F`#~;b]v0uTV:6lXY @� @� @�5g:� @� @� @� @� @� @� @� ҋ-O_BFԪ>[*@O?4}􉫯::v={>:j׮]YH�Tj4#io_9t~= x^[O-~m̛7/4hP.ۯ @� @� @�UM� @� @� @� @� @� @� @�Z7W-~%Kk(bĥ"PYڵk7pC\wuGW^YQGku9TRY�Tx\f<DOGo2wق2eJ֮ d4� @� @� PU qF� @� @� @� @� @� @� @� xbDU)zNXu|*@jC~8871 6lXt%Zj]vY1p'4W_q[ޯ42V.Y+MM6-6j @� @� @PVj� @� @� @� @� @� @� @�lGQ{`Aǯ*[lsN1dȐ8o߾Ѻuرcu]1sΤ @ }wGzkG@ x^+yT`@ѤI z]#@� @� @�TZ. @� @� @� @� @� @� @�Ex`Dj+l:#,-жm۸cرsEg?Y /ĢE> P>qYK>@ZRVƍzN @� @� @�*@r� @� @� @� @� @� @� @�T�N\;RF'/\Z.k׮ĉo#GBVZů>|+q�(?8="~ۂhFTkF*RVfVYN @� @� @�ej-kb @� @� @� @� @� @� @� PFo'c Pz7<:x7cСq'FM6F>}bƌPI @` |UġFoq.D @`رce˖8 @� @� @�@@9� @� @� @� @� @� @� @�(M78∈՗~۶i6 Rֵ^ VZE޽I&�}-*~K]^A @Et$#j(JXօ:*Qbm] @� @� @]� @� @� @� @� @� @� @�X4bkH[={.Njժq<'Nn)ƌ]v-[ƥ^C]83}K|Wy @z6,g"[YI?kVG`ȑR @� @� @j  @� @� @� @� @� @� @� @`?qDKI<>[ugz ><f3h۶mqwӗy@to߾ǴiӖ)g ѿ}El JںTOyHB|Ml M� @� @�(SZe @� @� @� @� @� @� @� @ Ԩ$<+-TJ^{Eld۟l8֭[5\G^x!n I&ѽ{xb…Y|ɘ3gNѾ}:tk+ @� (˸޽#2C*`u\ x^+WKc׃*Pk=઒� @� @�*mI @� @� @� @� @� @� @� PN8!b%}{{'W &P5E<I&ŭ&L>8Zh_|q|͑ c=w[ @�!0eJ1DtPeƉX# ^`Ȑ!&[o]m@ @� @� @@! 0+i @� @� @� @� @� @� @� @`9?aDÆK,^$D`9"@ j׮vZk1bĈ87|3.\TR֜9sr! M7ݴ1 @8"68*UV^QJچvBOcvjժb� @� @� P i  @� @� @� @� @� @� @� PRj =z,ۥKD%K&@v۸ꪫ[ @|g/k(x>#z(b X<U@v- @� @� @� T/]1 @� @� @� @� @� @� @� @�_`֬Y1nܸ:uj|71mڴٳvrf]~{{r;FE5eZb-z-rl}(.p]wł Z=Æ '|2wwCN}wfΜ9E˹sƼyw}QMϩ f-L)8lѢE2$_VR%'ҲU^= $+߿߷&Dk֬-1͛ni6&(oD\w]DZ~%Wi,4fɯe 3]ٜ09ce~,Sr9uj\'3nR㛒cjժec-'oV4o8(-7N9M֗zZ_ի� @� @� PjU[ @� @� @� @� @� @� @� @2dH|gYpرc#Kӗjlzy>vEY)8f㍧Eݺs_ɓg٤P| WZ/>-Zds˖-uֱ;f[o/o�xwbȑ$3Kmb;~;R�_zg̘̙3#,D+KjJ )!1|U }H!XiNYO ԗ|PE~v2Kwe>+c҄k6lSNsݺusuc7z}Ngi̵OXw#G?]jڰ)3?fIc4^I5˛S=�jU)YҘfEAU@dUDӔ_[wD֤[٘dV~;̵¾ұ4)8Kw@2zPZ/>NJilE阉@2eJo; @� @� @�5pN#@� @� @� @� @� @� @� @�V.^>|xyYVzQ|6lj*vuעvM~s\Y,h&k}1nܸ5zxcYzmڴ^{;SțX3~։)*PK/4R]z1}ɹxV *9|A~jeR`B@ i´Ӕ)RV H4Ѝ|G/Q<cEaЏTo)YõׯsFI&ٜ�LK"Nx^fu8knFzHsZϏQi;+ L |S xJs;6Oe{xesÔXFb,y^oBRV9?\DiY<쫯ʶKVܕBƊlqN~\CHv 1R)Tqҿ{IVŹzB� @� @�lx7wE @� @� @� @� @� @� @� P!K?8p`K[oe!,)0CqiE۶mcw^jW9ըQ#RKu7g'Ļ<H{?я~Z}/z葅Z H\zJϏ,JW\qE: I)d`Aݺu#}+A"Np|`HZIg)T/ BK!]ŧjڴi4o޼hn֬YlYbj�#0hPĭFܗ(\փ@;k„ BRde~=>LAŧS<@)ڵk}>x%U Vym]!���@�IDATE}+#jqlFjÆ + SKط{9ڸql=-s/1RV O(& @� @wPRTDIC 9gIT` IPW뢋 a׀0A(($3 5 zfg+ � �M a+lV � � � � � � � � � � � � � � � _W_}e}l^G+|UV֬Y3_iPh+ m…6w\׾;woӦunʎK}C&p9۱cmٲ6o۷o7oGY^Qx%&/`Iz9XtM{ٳDžڵ%/_>nR@4U\ݓu#UWխkɭgD/׷6VlȮk$NaHzިOMz=4/ī~LLxaG A\  c0sBHp-PROyߌ(ХKS(ާ~G ^<> oM8: � � � � �%+Ql,֭#n^" Q?@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�"L@+DKD7[li۷k6lhٳgZ:k׮uZSNiӦٳg]V= 1{p] ڰa6n7Wp>WQB~!+W4ϟ?C@a R8&]W|۶muVDխH".X/]^:als'@BfxYg1_EmñcsB =3'=KP-[6>=p" T8p(V׭G7oe ӤCyEwWPI _@2~ BHV� � � � � v~ J["� � � � � � � � � � � � � � � VZe#GզM޽ *^xPcO8Əo'OvtMֿ0@hpPPޚ5kL{5)PNAZ_XbVjU7URAK.i2ՉƜ<ylٲ)͛]z6ժUM5kִ:uإ^BST;jM#Be[fO<U K%~z'QMܳ@:W'.z k yZ R�( P[}7vHNI\^qW\9.T(pzvR_sɒ%֨Q J P+JOF�@�@�@�@��Zi'&P+vl� � � � � � � � � � � � � � � @>^y7oUVg}%Jd@;Fm/v->ۗEd ۷ϖ-[fK.+Vʕ+]Pϙ3+HS5\+@ ݺu[΅yիW\|Vn]xаaCӤ\rEZsO "& @fs/|˰T!`OfޭPO^BmUc^<5)Hs|*0�>}<9/TsM &nw&k׮N??vȫ ^u8p9rrquZ.@�@�@�@�@� vAnǖ � � � � � � � � � � � � � � �dZ۸q駟vwxkӦe˖-Ӷ; S0ш#scP[!d@>l .gW[ \Ȑ†0AsgԎpa [jnO?�_]7nlM6f͚�ٳgX8Ph /{ve}YϞ=VF]9@Oo=zӦMv9H,/S?UVuA?e˖wIF,Oڰa \v S֙3gB t饗ZzܤBx)fr=zԦL8R"� � � � �B@T`%X@ E�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ L4{174h4;vaÆoa zkV#vZ;w͛W((4iƒ6lh׷"EPl@T (E˗/7-ZO8a pߓ-Z/bbbTڌ@-hh̗i /&:[rYhdӤ{ʕ+ԩS.z`CԪU˅h)@`<:e l{R>}֮].27oyf�Z%JO<a `̳ Z\@�@�@�@�@� vOnǖ � � � � � � � � � � � � � � �d*[o|u^|E߿߆ ₵\4zh7x!f̘aӧOYf]PV+p@7B e @n:[pnZz/&5hjk۶l˗U 0H =m4k N3`7۷oϟe˖ٙ3ghѢ^~ ީQYpN8P֦MlŊ.TqM{9r<&}՗ʬef*lN:@DYX� � � � � @۱% � � � � � � � � � � � � � � �F`ԨQ6`�+W >ܮLӶHir,CZ\"z#JN<³7yd۱c,YZnmWc4UV>JOՎ2cǎ4-]Բgn-Z;I5J 熚%/Щّ#%^8?5kٳmΜ9nڽ{Ę<4ibM6uˇB,o>[d &]h{! #mժP=oeOڛo~e6b=@�@�@�@�@�&@V8ZicK@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�^֧O8q=6dBB|V^裏Zڵm.,ćdL@O0>s@ R^vܵɚLs8'N̙3mԩƍRJv7M7d͛7'.ZvBN@L_ B3ڷh [i׮]6m4wTo48J6  @ؼy͝;͛ +PiƮZ;zQt[ݺu7ވvjEm@�@�@�@�@��Zi?jݎ-@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�j-[XǎMZl2M_~uk_}5k,O] p)/߷ӧ[ŭsֵkW-O<aD�O@Z S@"J*ezyV^=o5a P+:fvҥiE6EwVrm۶5o*[lЎǎ@ :tf͚e3fpZߍbŊ֥K7),8gΜQ,Y>5RE $A�@�@�@�@�tjfOl� � � � � � � � � � � � � � � �*zj+,xb´2DV^~GwڴicSNphXdu]nXժUm̙{n=zuԉ0h93S 軩ٳmϞ=6h [`5h6lhF'Ofj�عl8G ~S?leʔ-Z>l>}l͚5}v3fJ,#u+悧Kqۺu Vx3~;w.|+W.k׮]ו "� � � � � � @V4%� � � � � � � � � � � � � � � @6nh qQ͚5. ]*0>z W  ?]͚5͛>]voٲe˖ ,P@w}6g۲eҥKqJɡ �)vb={b>V㩧ʕ+ 6lL>֬Y3Gf ʕ+gsM0:d-B'oEjK?С(P RH@�@�@�@�@�@� P+NE�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ }ǎ;ZŊmҤI >to#G{]JnlÆ ';^ [ڵ_~.Ba<XK.3gm5G TPꂵ{=[d ]H^e oٽΝAXA]vu5x`ۿ}v[x4v�\(pE> ڷo96md׷VZ#(�lƌv7GJ � � � � � jE) � � � � � � � � � � � � � � �.SNĉ-oȚ!Ȟ=iUZ=ٱq ,X5kfwva=-[6r+M@ `ٳg͛Zj6d;sLaE*;z쮻2SL+:ud \zWbbb2H ۗ(x7ؾ}m4x VPi$k}.s j[@�@�@�@�@�@� V9C�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ go%Kڇ6~x{g=OnvkѢ-ZzYxE'|bׯ^x!=b(-[@- 4 (+l'޽{Q>lԨQvۋ/uMM}]/ӧcǎ … ӻ[G�L$f;.F)8]vֳgOk߾ܹ*ԩSm.W)'Ottn)ɲelְaC{ꩧr5kƭNj%p {w[o5 2JTR6tP۶m=7SƍoCb:[bub � � � � � jE � � � � � � � � � � � � � � � p9{]0r('0a77l/Enھ{?{  jRre?a=<x0ػg( X?w\g kMϟ?o+W˗^gtQƍwmŊ{WK >|fΜi&MSNȓX[BB7/+fժU.UV[o% @ k lj6cY~kÆ 3TRŶlbC B 9M:W۷o1cVő-[sq;sM<َ=֬Yz^@׭[^r/IlYuZ=Һ]z|Ϟ=k7p >o?ӳېm0{f]?J[kȎԎwBR㎤Va9 � � � � � @J � � � � � � � � � � � � � � � m'NtN:4ڪjpܹs3<14O<agv+h[n.GCQ44zP}F}L:ye˖YӦM#v9r 63~h ]wY˖-#C:"<5j}Mv>}tKxߏ6 ᇺ_~ey£kc͊314=})LW^q!#FE`5z>լY=+aҥF}?OwV~x˒zX"eIm.GO?5jT~,O<.Zf͚傊8U�w1 sz\� � � � � �dv_k]!� � � � � � � � � � � � � � � ~ RJ.<URXPvډV?.H++W]jUۤwa|;t*GsK.I&YB"  N9s 4fΜiޢ+\#m6.6=pϻwn}=cW_0@@Z+ ţPA?7t_-Zd-Z(vIKib}ĖoT#+%o]r%֩SӦ7#G- H"֦M;qDTUիW/˕+W � � � � � �YE 2XVѦ � � � � � � � � � � � � � � �A@=wO_~iڷo5jŅip{cճ?.Ȫ[n.]=ϟ֮]¬ڷoo={t={֦Lbo+roZٲevYbKmӲ[7_ >vomذ~gZ_-~WǛ=j_)dNצ w*Uʞ}Y[pۉ¸^{5+P@r3}~i: >`׻ S=T޽NV;v{:WP^|ESw˵_cr'}ϻ^t/mϞ=vwPM6@ɽk_|m8pM8ƍg/6m4w>hF+jZ)Q=CVR%WCa}U%koɒ%.dJcǎ6j([n׵ӿ^ɝxf%u0`s=vF!b;\@+W96YSŋIPzN?~<痞Mzx[Ν]S |r޽{~ǨXfr-[XÆ -[@uwPHԩSr3Xɒ%- ,O3O>q}+~֭[M9; Jm#R_ҟM1/VIr1#GgvvM6u}2q+mƌ.f_ž{9u~W\^'qxm7ߘQ XL*}[&eOS@�@�@�@�@�@�,'=˵#� � � � � � � � � � � � � � � viǎ - vP =l0k֬ G -[!Comwo5x믿n[.̅f)[n=z50pW(͍7[[h<)S09>|8nP`'>fJSdJMK.$ڧ� @뭷‘TFtuי�N:WQBlӦ x&L`_} 0yd?B>#S͛7ϭ /_>SD$Grov :ݫ~׮]FnS8)(A%SR=z. _U Dн QJ&MW^V|Dۤ<*TK!Nׯw TS(<-/uFm P_t]Pa[j[bի]К_;ul2ӧO}J$#FΡ d=߭|]Pk"mWp"j1t//{nݺ.0R7p{ޥYH̼˝낄;(5R)Y2Zm۶5=kTXৄ}jժ]L=՟5=L:WԿ ?1GwR@ UIsV̾.8ZUUXƍ]0UGPȕt=x%yr۷]~s#R>SA-ԟ uCڵkP@�@�@�@�@�rjeSN@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�]$;˗/7h+ A5BST?n?m޼$믿M6;bSB7 {Vlܸqn?ni J>CYR`A)R."[~#p ۰aCZ$~ŋ5joBt-{])49s9rK/^qϜ9ՠALA� Pԥ^ P߿(A|.(ꫯܹs[J}$z۶mn Ri׮ kĸʽ}O`[SQ<Gҹ)YիWϭ_kíyn]G! MShѹ뮻7禰nѾ}{ܥ2}o><kOz8|<BΝ> 䜄*?-B_,Y-Y2/ן5߳'QH! ꉖs:Bwި~:tsι>k0`{s=?I*?\N ϵC)'T*sAGzS(BwO[(,aCae/|.]@ϓ' T %e @߱ٳg7&y}Z S0Ms宅իTղAM T^]x$7W[MKwC(az!s<F�@�@�@�@�@�@hڌ� � � � � � � � � � � � � � � �܀8qnҠUTcǎ.]T˖-릤v鸀 bQQ@~4ymذa ء:E  tKXk֬WPޙ3gܲ-ZXMֿZaO|)O^iٲϟ)ʿ9L4 }Ƚ[7)] ;vlM^ޟUo> {z0¿v _?A&* KM)T[]%^Q{nw-y׊%\r:^sQ Օ�F@NrC*}ݔӁ<<SC,XB(հ;v Bae_| ~)lG (~r,C;M6qvz&|~ǭyE} Em/w^+@GcS:5KX _A PK6ڭ:T^s^;IN;vrߦйwʔ),^ [� � � � � � @(B@CQ[� � � � � � � � � � � � � � � �(QfϞ=6 ֭[g ŋMk֬7c=6^rowI-׶*F QY~{'ܯ0:uʺtb>]wuA{9ry-vV͞=;ڛb}&x ۽{Ov׻*�I wș35k̽g3gδ%KX@=>+߶RJ٨Qܹ0aBM { VU%->*Tpѣޢ4ʕ-~]zIR Ç. W8.I`Dͮ*4P!_uhNx؄ϯܹseM4qA:tH>k.X!^fq-[~ĞMc^r"@6J`-6o5--Ko[={Z>}l֭�_5 ϕ~)UV.`?ÄkR_6e^ɓ'Eqsۋ)q #Ŝ9s FBԼl~@�@�@�@�@�@�*@VV=@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ -[ .lK. zgǏ7$,[lI(ŋw͝;7eʔqK,oyߜ;wnv[sƒtK/4�PaE]xZQ]F{6/AΝ;m۶ml{{̘1oY]Q=~7ovm~:Ϙ1;TޟU"`Ė%ܕ?�H.='ֶ}nHA� |5טBRkCڎ;Br`4tc&|~?~&dp?}gʢE._~}]<̛7/#bYbĖ%UٷHK2aRٳ;SNo9n=tæLk*-]b'\>WT7oxzSNFAW=Ovӧ:E�@�@�@�@�@��ZY��@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ hPھꫠ7An-666n??nA*^4k̭=gΜx[-^ؽ+-I!Zk׶<P`{{_ժUJ.ݲx\c* ӧ {ꩧL^QpwHsok|"C 1 //xޣX%?z˅H}8 NPI)XvI/̙3Lئx9s{שS'i{|H*$=g'K6j(˓'OW#"@|]K=B['x7nl;vݻw`A{JB={VWJMUT ظqlٲeCᔽz۷-KEzӦM"W8Kb}Ė%UYfYeR tq뮩+V~ln Z ӺkhѢn]`b^(cIk!-ߑ^\r%֭[7.6yERRA`PyM7ȑ#CVeKnwy+V,da � � � � � @V P+_@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ Kq6}t۴iSP۫|�יn?Xps+E!:Z_{eʔ)v7({:tM}Q{mǎnl 5}/X? ~{M狒yra'NtAɏV?~Un7]mKݹ{M�:tp n/>&]QH\<x)@0@=M'|>/<+t(Na ҽRJ?޺'xs޹sfqs/o1^%aV^]* %3fլY.,?VVkĿ9>rHܮ^{]w^hEF?3*ǏwAÆ Ν;y"]Ek'OyښfϞ۫WnM4sA{rio=P{pB0aB\qgw vz衇\O֭mС۲eKw ϵ}Oٸq{6|o/۷/ N~;Co\ҷHg̘Ữ}(hL~gLV,/*KJ[UY S.\-K:k 4Ȗ.]j}rʸ0e~_~k+U_ݞ~iw pzi ߑڥZ{^y.EzYn)t[ O)@�@�@�@�@�@� =#� � � � � � � � � � � � � � � @$TVƎk6lo1hUʗ/]uU6yd駟lҤIy:W_<` NQ8 oӦ\=wuҥ guuOݠ:N2e\`? P=5jvi@^x4X5�zٲe74 vbŊvQ+c&/hfrZj% (Pnf裏L]gw@IU4ѰaC gϞua}מz)6m[O� �Y}/~%(XFn *廒!^~)B+X{1;V (ݿƠ}X2kժ K/FrT` Ԗ.KVJ-Sr\ݓtL￷/uָz>n$@3,_ܾ[2d HMA*HK^>@)*`̙3fVBLSX]cZW _<y1ŋ]臂?gă>hGu#%Jphr$ό@OjבS(7bJ}~`K01Y 6‹*`J}F깿k.ɛ7o#V@o{~*UP@Bt:uRdI{zRuORJ4<~]f>}R<Vͭ]vn{=U_=sJׯL*WuQY`}_~B,ew SH—uM,Z^{ss=aB oѣMO)*Aɵ,^O@޾ot-Z˗w'k?dw͙3ZhV.*W|@Aoگ?5m:H/X.KL!pj~袋LFj9} u~M7sRPUW n߾/dlj0{l}� � � � � �[`Af+W) delʫ � � � � � � � � � � � � � � �DBa4дn۶mP 6m]4-FѠVrWT)}(K/u!^#T, >| z駭p=H�"E$y/PXP^=jޣ( AٳǫhѢzǫH2o>(h¿] ۤ ٳDž\) ؁T3hؑ4~Sͻ1R9Riu/-: d0Gyą-)LRጡ ;t@/SzNMgއ*DLA TB.ZΥ0I`̴+X%ַHL\M4q=ݻתV/'XK}&ZAN ɝ;wS ZڏBJO[e][k~TRxt68nZSBZ�^zիpQ>>U � � � � �X{٬Y,@LvBi � � � � � � � � � � � � � � � |?ҥKdɒɭ)/L|̙ɮjP-Z.\7@zF׃O`G}z!+P@*G{2:t萢[o5RHo߾D:35uG<x{|*T.jdNy4ؗ L21¬oT{ʔ)SOʕ+}u$ժU OeRqԔ_UT"5BvN:\ oHwM!g_.z`#GIă ;#Amԩc7?XM4!P+ӜJ� � � � � d3훲% � � � � � � � � � � � � � � �DoiM4.]،3,քd۩S'Yf͛73C ݻwoDVFG5kf OlС/ڟg{lٲS(I4 T5ˡC.wڕhV4z(ӽ~ĉ/W^Z2eһkG�(Xi󅫆!۷7Ms̱^zj׮mW\qǺwn111\2GN̦sRyI ɓ}9)m0\QơW^Pt,͗8_ۘ1cL͛7_ݺv!AZ^ǎk6l &x#� � � � � �P [p@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�"L`ƍvWZZ f(`O Q�[:I mذatRرu]n3g$R+p9wm}vYkԨ=C./bmf&Y��@�IDAT󎛎9 @P^\!]zUfu뚽jHH/C7۷/՛l,[.fϞ=.lKZ;w 츁WR~<#vZSUϞ=O43kA̙36uT?~ #͕+~.lXEQm~>|T^'| � � � � �dw2Y3ꨙ8jeH+@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Hիꫯ2eW_}e\rIg :u ¿KҿS,Yb#Fpk7Yr-֢E ˖-[k/ xG;h<yL%|#"7}o{_s=vw!iwMjWC%{[듇mرvAkٲ ԩլY3};O<ҁMO>mK… va'OI&M!Z]v[oծˑ#dԂ^xEmذJ.QU"� � � � �d�Zi&P+vl� � � � � � � � � � � � � � � @T lٲ qQݠ(]0޽{]Yf͢T5 `>p/^:wW8H8+?6nh&L'ڼyTR.;z"&@V9p Ueb?EVZeʕmMe˖ s-9<DCl֬Y6c 7]*Vh]tqSV\VۢU?B]H=>Zzf � � � � @J P+vl� � � � � � � � � � � � � � � @ (LO>.�'!CDQLFe>ծ]ƏY@@+G[}ȑZnm]wk][l'l̙6uToMZ*Uon&k޼e˖-dg P+}~lÇ͊34|A9Fk.6m?r7W^yh͞={~@ J6oGΝW U~h^zĵ桇qن \}#R!"DP @�@�@�@�@� P+@۱% � � � � � � � � � � � � � � �F`ȑ.\r6|p7ui\4d8p :97\'Ooɓ'ێ;dɒ.`K+hVZDI!p1w5kiZt QhL|A8 3t%JچO'{5טcVT#ښ5kl6g7޽bbbqִiSkҤʗ/ñ=DmŶpB[h+H"ֲeKkժ5j䂁#)k׮z¢HfDԋ@8 T@�@�@�@�@ JI!P+vl� � � � � � � � � � � � � � � @غu.k׮/ZժU3U (>d{7aÆ6zhB!~z1c R7x}+/[*T(gd ϛK ,p!Z B\z kР]}ֶm[ /_LY6rl_2u3]ٶm͟??nZl9sƊ-j_I55j԰ܹsg:@f8wmڴVXa w\_B`9nݺ ޤyl٢D#GP0�ZI  � � � � @ P+@۱% � � � � � � � � � � � � � � �R`ҤIc0[n dkΔm eveÆ sAZ zkٳga7֮]ksuӼylƍn jժ`ƍ0["Em O?ْ%Kln~ +P5iZh&dLF2iFgy0))6ٖ.]ZN:e9sի�K/jժ&"-+ Rlb]f]r{}i(4Ze]fm7oސ+;W^.XYf<T7Z4@�@�@�@�@�vTnǖ � � � � � � � � � � � � � � �dZۧ~j<^ںuf<iƅdچa˖-#F{g%JZ?_ZB<ywv@>l .jg[ LAuֵ:uX5H9[G}\]-B:uMIB#*jC"͆#~ͱi&[bk{)'GVreY(T![-[%`4 aGgΜq߷ *m^W{!W\dzQwϹ_Ov]>?@�@�@�@�@�H\@]YJV J� � � � � � � � � � � � � � � @>^y7o޽{,rAO<icǎѣGŋ]у>h}%-DW0! Y˙3+ мzVHHk Alٲ֭[B !:.b0 IY) KB.4aI 46{_Ho"wY&.G'N*J*.pRJI[WXbbb"I >}ڶmf7o64y7nﻥ:UV-�{;B]Ə; L@X @�@�@�@�@ sNV@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�,%#Goiƺwn7p/^<KY믿vmO<Ο?o7tZl<hpP,ܛ4[X1`ޤP /ĢtҖ={̅Bk"F@![n ui&\˽kT&@hRBUTi 82Κ#&w%Mfv5mZf{}p ڰa _@D9)|VB7rYٲeL2nʝ;7d 껱sN۵kرöo&hڪ9ytz]Z5IlJ/.\h_~3άt@t1 � � � � @& P+'@۱% � � � � � � � � � � � � � � �YR@aZ Oo1(@}0kaÆ6HgڵwԩS}L+XG.XLC2yV(›b_(B ,48ZaT- 'ܷotMy+b˖-v+0 P7U^݊-/ Pk 1k|滏EZ>ǎs =/N :.665NA_|q\%t3.j?(Q : ,eٳMIԇ@{+P.}J|3gθP~S P+p+D�@�@�@�@�Zj|v;D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ :uʅk}W.hJ!( j۶jʚ5kfw:цW^m ,sܹ *B:udݺuc0h;7dΝsG R&Wx? JM֗.]:nR%K EĢ{=#4)+bn!t-yE_AlTbEԦ0M Ve@j%Çax-~,g0T RAz֨OMzV, &S/~(o okN>ApR³I}#Gm |S?Ziz˗/vIY`ʕ+]Y['@'@�@�@�@�@�jH; =5Z� � � � � � � � � � � � � � � �o={tSllX¦M§lG.ȅj5m.RUծ]oYߜ8q֬YUV٢Elɒ%vI7yƍ_~vךڑԃ0-9r0iJ(NAJ;v ORd>lx%W\qA &VhRTH|(нQw+СC!7?~<^elѤIRC( B!ZzP@�(qYrieUȘq;/Q Cпߢ8ꛨO?kA*כ^]111'OgaP(~;_D_so{M R)W%%(:^(UV+)͛oRߗ|K/*TG@�@�@�@�@�@�T d#{,U2 � � � � � � � � � � � � � � � 4X~-XM/vU\E+\KV OLc0 dAw|i۶mn:\ujԨa5f͚nݺh @ ; oy^(7 rRhº| T$6)I7o^Ӥ{&@ES9w>}M p_~N:7^+$KgoRP o"/Ls/^D @ )pUfGjFc!m/t|aI'/g%-0H W^:{l Txo(Շ- ^F)[l?귧®Μ97?M%5y XQΙ |ռp5�-F 4pSL _Eȯ=.0A@�@�@�@�@�=_el,֭LÜu4@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�&NW^qPի]¬on˗/wW k/ ^k`l<W\nl^ktM \{�^xWŊkڵkpʕ+[W5de˖uS V[^k/ JAz }Bk^(A ']%*^)ij&Rz{\IuSֽ@n; `*TM >( � VNfd 9g\zmy(KCM RTEly>~׷Q[ԗHnRI8y}e[B4OMQN}0U2VT>Q>Q2DA\w}} � � � � � @& P+X� � � � � � � � � � � � � � � @ xaVڵ,~ΝP,`,/, \+^s q-ZԽּL292Nw[! ^8LP*Sh7$'Ps/(+@ Uxajk/"<[<6ujwk'Vm_/Exak{$<Z�#wΝ4zk*]tvYoIwQ%᤾N<aؕ h+WQ§\}/d4.-S'aЗ{o¤&u' E)SW^1c  � � � � � @ e'"� � � � � � � � � � � � � � � bbbVZ "T@a rSV1jZe lM$ @�"LhwUa:Q/h*\8VD {7}៭]@<{Z޽n^z7 � � � � � �st@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� f/= @F :dvYɒ}d� kwy,X^u@@�@�@�@�@�@�"L@;!T@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Tre͞~l˖@b=@�p 8G/^< @xmΜ96vXɚ@�@�@�@�@�`"P5@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ %G5TSZ@�"A@H8 }agƍgEڌ� � � � � �D�Z  � � � � � � � � � � � � � � � � @\f#GMb6n\  @do7XbQj�dcǎ٭j^{=#Yɴ@�@�@�@�@�JQi@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@-5_̎c9@�"O R{EuG b("jXwoob^K4Ć%D15b+ vED(T?w̳Y]] 3̝;~f>{rK@ q ,{7ԩSu @� @� @�bs @� @� @� @� @� @� @� @�opa%T~ ,-Yg}> @@ \uU#M'e @� @� @ @� @� @� @� @� @� @� @� @�.кu 7Dzk믯�" P  P Ç+"nq+ $@� @� @�H٘ @� @� @� @� @� @� @� @� @` |wGꭾ2D<lĘ1 F4jz舂#/!];j PQcǎc9&|ꩧVT!@� @� @�DZi @� @� @� @� @� @� @� @�jA"2#<sU_ @W_}?,>L+{5#8蠥D�+'ԃbM6nmq @� @� @*ʯ @� @� @� @� @� @� @� @� Pimq^1iR]F P޽#6XZwߒK�8餓bڴi裏Fƍ߀3 @� @� @�V@ @� @� @� @� @� @� @� @�<K.h&3*Z&@� 4kB+n' pC#<;v j� @� @� @` Ze.D� @� @� @� @� @� @� @� @�U#иqĭF<h㏯k ,pK|,JU h]zq7F^zz @� @� @�UD@VA� @� @� @� @� @� @� @� @�sψ#կ"έȖE�ů:u"w֭<-K�% Kq 'ęgvZIU#@� @� @�zZ @� @� @� @� @� @� @� @� @`F̜q+TkFUrV /+š%@@-?~|xg.Uw]- @� @� @�j@u?� @� @� @� @� @� @� @� @�q5)Xk̘6 @` Sԉ8ȒK�ec};ƃ>uSZB� @� @� P-Z6&@� @� @� @� @� @� @� @� @@z# vZ P\~āFjUjw}rH|Gfj� @� @� Pjո[j@ @� @� @� @� @� @� @� @�@_W_E�N`u">N^sѢ}O 771|h׮]P� @� @� @ ԪrD @� @� @� @� @� @� @� @� P[nq^1mZŶ5(GD|I![{dM�8⡇G{ @� @� @�UPȯի`t� @� @� @� @� @� @� @� @�*D+#78 iN# PNCX48zو \{1p{cB� @� @� PCjՐi @� @� @� @� @� @� @� @�X@f7q< @@e^D߷w'XW&jw]tQgۛ#6B @� @� @@-Un @� @� @� @� @� @� @� @� P<0"-`A0znmĦ&!CqWiV @� @� @�_f @� @� @� @� @� @� @� @� Pcn)Kk\A @TŋǼybܹ#- riiw}- .\f;Ee^dI.gۣOgN:%.u֍ԫW/ׯv~I6l 4(\nܸq4j(JZ7i$6mZz O?GuT.Ը˫C� @� @� @ : @� @� @� @� @� @� @� @�@ǎW^qő $t<}'@:[fΜg.\f͚m~[7gPv¦R4v *rίXF&FVE/d![oҕҒB_uڗҒꔥ>C7o-kF5\sZ+ZlijO!@@E qa+y @� @� @�TZUF @� @� @� @� @� @� @� @�VgFw_)D<̪ @ 5mڴl>}z̘1#[hV * N))B}:tX&iӦ|Tύ7³U"tKe4T)+k%:mϝ;p7o^9sJ #KhK~Ò}>`uQtY{ ?i&Ҳ:d�y7x#ky{4( @� @� @�5S@VͼFE� @� @� @� @� @� @� @� @�RՋvc)(@ c4iRL<9LzԩZ-Z`U4t)mw-ײe,)Дiɇhկ_V.K >MʸHf͊h|Xڄ  ұ[뮻nk.۷oթ[R@@5jT$  46: @� @� @@-~ 0'@� @� @� @� @� @� @� @� @@El]D~ム VA@M?~L81R(g}?,@+NJEKV@-آ00iuɶf͚=v5H--)<eYӳiӦE~;@^{- eK.\X| PKСCzz׏t)[`.�!olM :45jT3f @� @� @� * @� @� @� @� @� @� @� @�lk\8ADqG P%Kq'|Ǐϖx/ 4ȂRQ 5޽{N%h5l05իWֵkץ᫯µ&M]92 yKuqYFmnau~{M6-ZZ Pƌ[lV1lذHB� @� @� Pj{l @� @� @� @� @� @� @� @�(Q`5#~8ᄈv(ӧ|A|DžK Z`A6XҩS,gϞq衇lu1RXVݺukaTVZEZ5gΜ,Xkĉ1a„O0QFţ>SN-j۶msα馛7|Ha[)0N!@` YVno[4idwJ @� @� @�V@U" @� @� @� @� @� @� @� @�?ywGUy@9f̘cƌѣG;3h ?M xYP JKvN:帚V@f"b2w?~|;pIrO=T|QPP.]D IK JV@ u]ϾV͕]� @� @� @*lU @� @� @� @� @� @� @� @� @�(p[l1p`Ǝ4H!@ƍ˅F)HkY;[ν[DݣO>(6lرЬrI\R\zR̙3'>{>h\wuhѢhԨQ[FϞ=c=zD-73?P }^;7|Hay  @� @� @@U @� @� @� @� @� @� @� @� @`7䒈+\N,S@ zW_)xdѰaҥK{Gnݢk׮V^-{RPVZ f![n=:z뭸kbʔ)Y ]Ν?qlvْһ r/b>4tHAx  @� @� @@U @� @� @� @� @� @� @� @� @`Ϗx_*Ǘ9lX R?-/BL81 ޽{l6q[oi5h`l޵y䑅:uj5*^xꫯvרQi"-;c暅 @tgy&<}Gާk;B� @� @� Pjkl @� @� @� @� @� @� @� @�(@.7$ e!C"='F@ ;6~lyg㫯;guVjP (@۶mwْ?qҤIK/ŋ/~/=zdA[դI)G{~ṟ={7'= @� @� @�,E; @� @� @� @� @� @� @� @�s 'DyfĞ{FhQM*\`YO?4:v %nlVu5H@ t!;lI-ϟ?? JZ#Go1ԩ;how}c6Nh@5xcO<1:(֭[ G @� @� @�) P"5E� @� @� @� @� @� @� @� @�j.pmq饑 �}UP`Μ9OuAAAuYgE޽cM7%#иqիWΝk1"n83k׮Y�m}u + r=3Xd  @� @� @� P @� @� @� @� @� @� @� @�׎o#n97kȠ jXdI:*ڴizj4o<z衘1cF >< o$M>㣏>ʖ;.u[lE\K<yr%@UW]/r ӪZFo @� @� @�]@j:@� @� @� @� @� @� @� @� @�%p;ѯ_D.H!@`%O)4SNqaE bС1eʔ4nx%[wUsqNj/'NN8!|رcpSOUס7 ,^8W^ye 4(w� @� @� @ Ԫ}܈  @� @� @� @� @� @� @� @� \:u"rܲܪ PqOqg!)D{=3իWYv P:t{n5*xH=ڵk6g�"@M7o^lw}1dȐ\pk.U!@� @� @� PL@V1  @� @� @� @� @� @� @� @� @ K΋0 / Pɓ'G߾}c73fs=jtIѴiӲ4X`-n-&M'xb\tE.XkW_}{<OǁXe  @� @� @� P$ @� @� @� @� @� @� @� @��E.c (oÇ|:RnE&M;c-HǸb7x#uVPӽyꩧ'aÆuYa:th<3QFţ>?{^UR*+ТE8sO[o5wqGչs*tlʔ)Odߟoq-3g瞥+z`رqM7U{_a&L޽{ܹs^B'X&@� @� @�uk� @� @� @� @� @� @� @� @�V^ 1xp?̙)'_>Ӹ{?%KĘ1c⭷ފNiӦ^{^{m��@�IDAT1baZUQHg}!i.)KVٳc1s?{Tyy6JWxm^Y=6j(:HP۷={fLUoy˗_~9 ֕v'|))Zƍ;k&l~{yYg}ͪWNB;DÆ 㥗^UN?  @� @� @�Q@VmL� @� @� @� @� @� @� @� @�2 ѧOiE̛WƓ~`nŋ?r-`zz?u|*^귘^~)ee=Li߾}c6]֒‹=gvN:(3W\%[B-P;ïɎZ//~oRe?>L;3@~~4/CKz_sq饗駟kVvQG\pAwܮe6lXv6|l5  @� @� @�jS[q @� @� @� @� @� @� @� @� @71cFį]~`nFAAAaK )<ill2XcUp%jf͊]w5j>|xnݺuQл _~V,i_Y|a-sZ#8"z꩸[nYK?^һTZ_qQ�c=6:tPbv_rH}1bĈXs5W1g @� @� @�*eK_o @� @� @� @� @� @� @� @� "v"qYѵ(o_~9͛ݻwO?=ڷoTlO[/iӦw?c67ѶmӧO?[oE-㏏޽{g-Z:Os)a7tS;[{wѣGp q… }?OsΉ#Gf�{7 JAJ<@|Σ>3gf}<b*c=i:uj3BjqgG&M T~O81xWyѩSb-{V_.^zٻԋ/C-lgx2dH>~{|q'F )oY;\k5O>BϾ˨SNySQƍ^zE:/"3<3w)Dcyl^` O?4o rwn9'hnN?i~KsllNN뮻rZ_Pidi_u>sGŏ"=%+ /;Ck6nH93bv:V;lƞtmeaQeM6[N/JOI,'K,y,>6j(/~7xH݊ށ\w};{ɾkJ?<* @� @� @�!PuU%@� @� @� @� @� @� @� @� @�Z*x\T.$!rAR+W_e!(?/,|\@W<0~e)'Q-k5* Ja9'tRGǎL{wp`9,'nݺK/OuRP IƎive1cFl7d)#+Jj'}а@a]T¼RrvmJHah)׿u4mڴJw裏uFz[>g1=)Tk=BRS KAC}J%;SlYֆn|pV?=)k[n% К3gN`^{\6{stoܑϧ~:ڴi@TrqEΝg) ^q\R%\y 27zY_Ӽ{F J:<eydi^ ғ 8S˖dǶf,,'Rxa +KR;?^tMؿ}zwXoZx J?'' М0aBVWѶ]w`y;@rLưarA´< @� @� @�U~3g @� @� @� @� @� @� @� @� @ x#<@~ 3I&)%XY8̙3#g-\0 jѢE`¦;#~׿m۶- Ju9~e@)'dx vyl;g?> IA/)$&tƒBWMK!Z)'Ǭ:YKϞ=c,^zѸq,'+z+ Ja?i)(ЭO>of|wWN>RPV*{Wn?$mƠAКRIsK,ن f!u/ޝ.]>)�_\}9/BFYY;\kлwHaTw^eWݻgmP4ǤRXziYӟ٦9%B*en㠃.{fk)l-.Ww7O9wybȑG "0̕JIi_W)HY;RZLcIOzjY`AֵڗBJ^,SdCR8f*GuT|_+_E벼+j裏U @� @� @�X+ss @� @� @� @� @� @� @� @� @ lUj"??b򍿠 yh׮]?{vf͚mʖ[nY;̚5+RUZC ɂR)oq4o<ϟ׾}laRG)$+}{es-Z)5\NF F (/cV IYvZVDsuӒ\R8ڜ}_U[ND))? {衇 ޽T R�\*k)<W^·'UX)&^>(FNX,Zi|}իW%y)įybl6Gm~ݗwLa[)@*9$VT)ܜl /ٳ#Tx`9˛'ǝ>t[n%?sҺyEw_@zSiݺuߋV^}~YM<@I}bzSb!@� @� @� 2VF9 @� @� @� @� @� @� @� @�W]ѴiĹ p^Uԯ_?nlG}Tx,(TRFK/4^l5jT;6;ָqn)<hI=O92;'ȂkRxwߝU۲P>#NO?4<ݻw̛7/kQؿ?yW)+PaÈ +.ՠAx+Jh)Gcu׍o=:wÆ [:uꔽ3g5m6{w{~:XZ e}UZ^Ve6Zj(˼I?C9hS%}EI1M+ssk/~˛'{i&~$ ʟ+zTHI}{/?)Ĩ0YbGҽ!U~;Pk:]w]S˾ojx� @� @� @E=W @� @� @� @� @� @� @� @� @�j,мyq} *@ZkH2yL0a;t}n۶m4M)_kߘ;wnL:5up;#R@U;.R@ 75m٦ӁEe\?pq?<;'qّO>.+P }}Wq gc.,UUŋ~;:;_W]NVK,·RY0\߾};҂Jm*NZ+W}淒Y K%UT)\]<oGz#FȞ JJ:^|ʼ#X} wW|LYbO<1z<Hg+Y_eifueWU3gΜ0`@3Ҫw#@� @� @�; @� @� @� @� @� @� @� @�T9\T.lK'=z*^_=4iRx<RֲG\cԨQ g+mwѩS8p`upn˪wyriŔ)S#ѣGgcz⫯*%\wz .SgOɼy뻊L*kP/s9ѦMxOScz>w}u KczSI!*d"ԗݻg]zꩧZO|:K>i(i_b#s)믿~t֭ؑXy寲˛'S>h{DVsX,182k֬l䟅yG /Br).6dԋ_6}/o^zƺ{ng}eJx^Y@~Uƍw =묳� @� @� @ Ԫ7G @� @� @� @� @� @� @� @� PUn)#rY;e.)(ܔ;yy&L> .Xk}۷ςRRϟxbĉٱ:}<u?qgd?;s\qY0N;nalYӧggԭ[7~_fmk׮ӟ4Xc8#V϶gϞ])xo.ke˖Y-Z!CĞ{ SO=5:LvT@ykƿ,-O͘1:\-=#YMj2;.uoRt=fm'|r/J4`_^xaW_aÆ]4(ש )']ORcǎ/^~;wnB4uԲv+⋬n~HMVN~nʯӁsTTxHAiN,i_V)Ozc %Jo~ɪ"KY_<U;믿ΆGzV/x7s!y cС1f̘~Hsn K%v[\uUY[?xӲ#IU, R0Yu()/2BzSC=zowm毢R�bY<yrCٻXO:~1bD3UxիW-0l @� @� @�UY%@� @� @� @� @� @� @� @� @@ )#:r5eh J<~i>;v}\;%\RH>}SN9%},?ΎY@N y})@'c?]yq[lfz)x9餓b6c9P~͚5+ܗ;=zt裏΂%RpH ;CzwqGպux'~:Rw:t(lF \NNᥗ^M m0q 'guVwhIl KAZ5#GFB+l۶mg/KlٳGzJ`/ƥ^K?)Ȩeyp +˵RSO=>`ٳg.6nx]4iRpK}O1zkREeҥKt=k'`;r"B{.6ҼJ *KjinLe9Z˛'S[ſ|RY !LCv/3Krlڴi֘BR_\sM:Ѯ]ȇ9IZ%wqѷo߸;#URNfN%M6zea|)3\r-q9d)hY,'Y1ͅ2_uzһ~E -\k3 @� @� @�T@/ *m @� @� @� @� @� @� @� @� @@ X(b#�40o& )To%ԭ[7ZjUu OI!/oqRS1]{.<mQn)k5,W#|0T97. K]u$_*b̘瞫 ,Y$ R˲Жԭ[ʹX9ZMJozR@Tz{/)% @ޔVTRs&MW?w"i~I6mZ֓?L0!R[^G JaC^{mL2%6dq̓%}̞=; z&=kVNsp>0nEHյ^`AvUWE Kj;w^])u| :Ka \bO_i{USU_g)n3<*tK@ KA{V!@� @� @�+0}fȈw~[+*j @� @� @� @� @� @� @� @� @�e͠A;GlԫW/b+) 67o=zXAv@ZLaZo>[O J8ʪD.J FJ#}涎}'.n*+j8+g.Ka[> Ju;{j 9#z?_{&%p{,k>l~d.DIR?R4=u,ܼLEv׵)LY|N;;\c- /ܦs66R> }٦:ܱCƕC߁\}ײg/(9?iu~ @� @� @�TSoj:8&@� @� @� @� @� @� @� @� @�~_2# Ѳe9rdL>f)dl7Q ZE|U%4\vşꫯw9wѴibgޏ3f:0iҤ(8UJat^x fmVX*ᄆf-&M,xe,z_JNYMSKjp_E oYx<;vk&9HAOյ[1x G}y=,RW5B5kVMW6o8sb]v?Yg*W#@� @� @�9u r H @� @� @� @� @� @� @� @� @`U ̜p{ڛ \uU1`� [N3_N)DnРAqwĬYrqGnZr/^'|rОEEϞ=3Έ?~9qhU1":"]qquUZ٪k,_ =C8f̘,O=c'V~tҥ?~* *{*ٳo߾1dȐ+K.uV\n喸+cڴiz:O� @� @�*Z r92b+ݞ@}� @� @� @� @� @� @� @� @�D ?ɲ9ׁu7|!PÆEtPĂ VJh~ɒ%O=da4m48\Bs7n\YkfJ+RRVG?tfN`Re˖E?ڮq :4{x嗳;.=zlk׮0" ~bHͥzƮtU G @� @� Z+(_SI� @� @� @� @� @� @� @� @�8ȅEuFh|eDcu֍=3[̙ÇǑG.D޽cM7ttPH*a.EZ0w,XjĈOG}]v;,lZ tU97o_lvs՘p* @� @� @@e /G%] @� @� @� @� @� @� @� @�2[o-#= p@ǎwVOVQf͚E>}eY?38#::۫W,d+mmEOM@5HK/>l+QNyN/6hj0] _}U7 ]tQ\yQ^0tc$@� @� @�M% @� @� @� @� @� @� @� @�TGΝ#.8+"q\:t\8HD O7n{Ζo9ƎO?tKK!'۷v!vqlݣGhذa &M^|H˛o/n1`iI&T)#GƱgTu� @� @� @ Ԫu܀  @� @� @� @� @� @� @� @� Py\1lשS;|"RvjKe6dHK }xeqYgeaZݻwm6fz뭣K.ѠA(ԩScԨQk-'OFed^.ZlY&-Z_~y\{q]wZZEWw @� @� @� * @� @� @� @� @� @� @� @�(@.O$n-b]#{,⠃ـ*I`~Vѡ�-"[N9_|JٳգGr-[nym۶-ڤm!p`ѣG[o-SL~v9~_m]5lذWP?~|uQ[o5z: @� @� @�JU] @� @� @� @� @� @� @� @� zE{lG{D+ߖ3 T@u *i۷>8[񂂂7n\2jԨx'c[΂vmYG?;f@%]>M`Μ9fK zwމ?8-ZrIoyuFϞ=-Z6*zꩱFo=5`X@� @� @� Pjՠi( @� @� @� @� @� @� @� @�*]{".,b+x衚%PNdMO>1cF3&F#<i*M6M74:w\x~v *QSΝǏc.|Ggtއu!Dnݲ%+B: ?i <88㌸벰<&}'@� @� @�~;[3Q @� @� @� @� @� @� @� @� @` N"8' t1n\l֭[.-EG:}x>?8[ s ,Ȫ6l.^#-m۶um6.0gΜ8qb|g1a„OO>)\NZ 0gB4hPX"OD߾}{Ĉ{֔ @� @� @@ Uo! @� @� @� @� @� @� @� @� @*|r=DѨQU>f-X8raR=zNurIwi~%K0BƏ-of 2$MVX?zYVZo>:tԲFÆ ϱA|W1y4i2K>D+ɗ 6hjCͶSH\ jѢE5-gwyg}q7G˖-k � @� @� @ Ԫ @� @� @� @� @� @� @� @� P%ԉ4(gψN"ܲJvSj@Α yxUڭ[n-%ՙ?~|g˄ ?ϖz+ 99sRj*RVѥM6_RWNf͚-u5[`q.nƌ1},-NmSN)S,,\~K.YxV JKzs?|7_,X? @� @� @@U=^ @� @� @� @� @� @� @� @� @Z lEgGpCĜ9r:]Cr9<En *FƍcM7͖.;'O4)&O-))mS`R OZhRͤ[nԲkG Zke˖ٺkkF%e{>k֬Haji i;-)8,t/ak)mmvelu:)�N!@d ĀbƝwm۶- @� @� @�Po. @� @� @� @� @� @� @� @� @& \vY>j_e,P`"^{vtYf+ JHAJ)P)Rҗ_~Tѣz`SRiҤIõR(SZZh͛7_fI}lڴRK:?K앖Fe tjoőϟ_Ns͖yn}Q2{(:ud#~BR8ZN LKZ묳N~'xbL81 :餓~X&@� @� @� jt$@� @� @� @� @� @� @� @� @@me_w߈'k4zcJ;q)^ԳӗBҲfy)*5spYf-7dPn OZpaҒµ4h-~RK~_ݺu#SҒĒ%K6VtIUEE~"-i,ŷӾꗥ>RX0֭[lC:d�SXuin,^>vex'UW"@� @� @� Pq*RK @� @� @� @� @� @� @� @� P>DvXĩFnDƥT@% @o3&GJ+\qnh׮]շoxbq=sl@ ,NJ Y] *-,+RWJ|PW>|WIA_),_}𬦹ô)TO\7mڴ4hP]=G @� @� @�I @� @� @� @� @� @� @� @� @�U"]IUoYi%D%FEP@%$. JEUD1AEP@@K$;{Ϻl,;s]sy_?ʔx9Q* +'e&-X@V8dtR=.4k̙[#Bd;� O:d5x`5jHgV4@�@�@�@�@�@�B@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�'PAZIr) _B<RjjzTfM/^\W,L+zCk@�OrQFoɓ Ӻ- � � � � � �A*@V^8� � � � � � � � � � � � � � � � �OK*H?.]=.P/~#СCjڴt޽{g0~#�A+`﹎;aÆ曵ai&hC@�@�@�@�@�@�J@T؆� � � � � � � � � � � � � � � � � Ͽz3doСBQ;{+c<A$`UTI+VМ9s/+UTA�,7ߨL2.,pܸq5j1@�@�@�@�@�@ H G@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�`&驧];X^ʟ_`/nݺsaWZ5k: 7o߮:ƍu=uh< � � � � � �1 @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�"Rj E T Ԋ'h69sF۷WΝիW/M4Ir P@ &sΩo߾P8 hРAʚ5kL@�@�@�@�@�@�H= � � � � � � � � � � � � � � � � �A'%4ptRRAw) .:$IM߱c7om۶iʔ).( LΝ{L;wtZ?Ҥ L&n � � � � � �"~v#� � � � � � � � � � � � � � � � � -\:w. UP(Q 4l(M+n6&aY7t.\KMC� <xP:uRݺuUxqmذA]v%L+n� � � � � � j � � � � � � � � � � � � � � � � @0 $!wy/NlA YHK}В8?1{=5կ__ .t3Y?u!@Vȑ#ǏGnDŽF_P sE}*UMQFiʔ)*RH Ԡ � � � � � �)]@~@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ -*%u 4I` y&hJ3GڻןRV Nz>+P<Ih2e DU�Ur6[8MM4 f *sųwŋUjU=3ر6nwɯ@�@�@�@�@�@�͉@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�$ RSOIvIw-5m*4wn*/p]RҨQ)"I޽[5kԯ3g{a0!@hӦRJcBBB<{Se̘1RSN[5kV^ZW,YRB# � � � � � � - ;@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�C mZi idI駟uJ~2dGH9X|UsiŪ[<<K.XŋնmI;CCC=<TtiM>]}f͚e&?@�@�@�@�@�@�| P'&B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�%ғOJIgJ.W'GGV5)#'I˖TUvm/_^ ,е^b)$`hʕ*UhkȖ-ׯeUT?G<ƍu'n?@�@�@�@�@�@�$@V8An��@�IDAT@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@_GuJH/^^r4…og QCPAFׯZhviԩ&H۷WHH]ڴiժU+=MÆ |DvR֭U3ʕKk֬ѻᆱ̙3;U@�@�@�@�@�@�0@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(pT4xtueߢV!KG4HGz=.|'!>@RhٲeR|i&w!NwT4r(;uzҥKkɒ%?~fΜ2eDy<@�@�@�@�@�@�@@-@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�+ >4yT:u y*жС -"pa5h@Fĉs%8E�+ 'OիWO!!!՞7o^ըQaرzꩧ\w﮳%O#TT) 0@}ц ԬY3!,@�@�@�@�@�@�@ 1ٌ� � � � � � � � � � � � � � � � � ? /ZR~?{H@,R҇J.$$΍]TfMmٲEWƍ[!xeR᧴iz޳=c} }9sG}Zh"r-wu6oެ]*]tIW4@�@�@�@�@�@�!@VҸ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H3J~+oVtY H:H/(y2T!Մ [΅τhA�'мysI&Bϟ?VZE?V^Fŋa] U>}<-UzueʔI+Vg}<y  � � � � � �.@VF� � � � � � � � � � � � � � � � � ` 4>]ʜY K'ONmB^+O,b;wjժŋk޼y*X`l@֬Y]TԩZjxJ~ʶmtmٳ?gΜѦM4vX͚5p`ȴ@�@�@�@�@�@ u/ @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�0U ׉uaB ݺIkHS I&A5c eϞH&m۶UhhMOJf탾gWztѰԅ aU\9f@�@�@�@�@�@�@ j@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�'PlԸ*\)?o@JRfR^ҥK. 1B-ZPv4j(O>n@ 5jL2^XTVG'Np{'W^i7@�@�@�@�@�@�@ bb7 � � � � � � � � � � � � � � � � @ d,';'^o@>ҪU(2>i2dBB/Hn2dpy֯J%Jmy>@nmذ!0O \fM#� � � � � � p\P? � � � � � � � � � � � � � � � � �Rzʕ;6mROHV8Y'N#,Ϟ=..\2uJ&Mstٓ%KKﶜ9s*wʔ)Sf; T(l)%5k&yn&? 曞级yuݏ%S*`O6zSNӧOٻn(~=44T6_x126[߳gOXڴiyvz nzmL6ҧOf3fwmicwc9]tIm۶ܹs]_c+k^=zЏ?G�@�@�@�@�@�@�(ԊM � � � � � � � � � � � � � � � � �@;wFo߿?lIe<d}R5B4`eȐ!ʰ,oxö¯6 uIYF;µ,`ypf b ^_ʗRzGRky޽f͚i%C{J:ʃu}an#Gѣ:v[z-DƼ&;m\<[``yðAY6痍�[٘l]gΜl; ̖-"9r䐵fz\xnK;?Թsg=:&$~Z藵ǾwTB7_wu*[ls� � � � � � � D[;H@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�bP?7n ѲdJu5׸P%JD/iР&8𘮺*YxG& 8u ٲ- ,}8p lݶZJvrA&X?^{ʔ)ҥK--)i *%=HY&Cz~gZjdڈ@ g7۷O{ ?#;$ ?YSٳ0)W-T*EfKoƬYi{Qs--$,lv 1oݻ#YY' 27o`}_>o`uM7, βq7@�@�@�@�@�@�@?<%E) � � � � � � � � � � � � � � � � �)QB)֮]իWy͚5.<?lJ.,$˂JyҊ)B )[ȑ'6r<yIr0 ڹsgؼyf&i&e s@믿͕*Ur!'Ic)QI%KJ<"N ES_|E}:t|P={S@p<yR۶msÎ; 3,D믿ٳg:c0ڜ/_>7ɓ',ꫯv붴 - bӧ]7(3Ҿg-[HsB_4iҸp }طiz5mgB % 4H}q)@�@�@�@�@�_<ŧ9s:u|=L  � � � � � � � � � � � � � � � � �E~7-ZHK.պutye̘Q˗WŊլY3eQEUԩRE&0-k\wunK$ݻwp?C =z  qVUTQjTzumo|-u*u(<(Э[75b=p-Bf"+$YܺuOo߾^uUaKeʔQeL pK[ϕ+WFYf_& f-m̙nyȑ,,XbasIOJBҘ@�@�@�@�@�@�@ jTRԻ؊� � � � � � � � � � � � � � � � � \`ٳeytO^7x,rn, b]`۶mZ|-[ɖ,Y'N(K,.XnݺW%`wW*dZSV/{= >\mڴqϐ!>s=) &+]viÆ a$nܸQtwI(Q…)]{•l{N{0%KǏk.Df-[\ٳg]moe˺ N[lQH֝4h'Y!� � � � � W<y9s:uzv>@}= � � � � � � � � � � � � � � � � pѣG5m4O1coe˖M5k#?u´,TɿkjTiΝ}){հaC5jHoŔIÆImFyի|M :4,<̙3ʘ1&M&MDqHZ~d+Vh͚5nGq ULtuשTR*Y J6m /^Ν;yfmڴɅYk_LT|yUX7p*U̙3_� P+:#� � � � �t;D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�6;VǏׯ* ~I;\re$SG֯_,B,jժj֬ZlbŊSwO<!'m tOOݻw_|z({*.$VZaYA )Xk-Z%Khe!GpdAG*TpΝ;)46$cǎiݺun6W^n&URE7| "4\dɅ � � � � �~ P+jߎ3@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�8q o\PS ԨQ#5mTwyrK?u~gM4I'Nԁdagm۶U֭ x E?zT*WNSG92�$" \ PΝ#lƍfHa'?Hd.\yyٲem3g .dsҥ LCu l۶M+WtݣK..]:wo֬YSPh\$>r\!<"� � � � �$yԊg"� � � � � � � � � � � � � � � � �A)|r <X.\ƍ0& ʘ1cP)%6ڮݜ9swi̘1:}4i'xBvRJY'lN0AT}hn}QϞ=/ϢEt-hΝ*Teـ@ Ξ=~/Zb,,FnZʖ-KxV /e'X`֭Zd,Xkڵx'nV~[dɒ(�_Ec@�@�@�@�@�R�Zjߎ3@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�qƩZxz=.H+{A3g4~x}g.dBbyo^2d$ICitiz)g81c {g;&O5lPGU֬Y:mU`:u-|ޓСzf͚Z'!Ǐ… 5{l7/[jZa#O˗OfQ_  P+]l� � � � � '`"p@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H^9r+ i޼ Z曓WGMƍ5p@ 6L3gVnO*cƌaǰw#G %jԐF opf͚i.%nZ.\cqXI;vƌk*O<;tw~ʝ;w\XNرc.Xkڴiپ--Z{UjxUM &P+i_Z� � � � � pԊ}HOL@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�,0uTO�Py=#۴yfO(ZVL}'ڹs}QVxq}嗺xb+H%d. *-OpT E-[讻W_}cHO"Ylb<&RD']vwQrܘ߫qZxݫoƅ'@֬YմiS <X۶mٷyTzu)RD/6l= � � � � � �U@ze � � � � � � � � � � � � � � � �X۷[UTѦM駟hѢ)$%v<W\.L5Znz+VH~K;K<#y=:tȽg,eرJ6mRɘ@hh&L 7oƒ,(護RժU p5E@ٲe]رC>f̘u$G�@�@�@�@�@�HVj%Ig@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ 2D˗׾}pB >\xÔrrȡy󺐙={… )%=pa%OOΝ;f͚ɖ'OUW]ZqǏ?նm[(P@s͛]1!@ R.]|r[N5jP׮]U`AeߎL � � � � � �\i~@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@'O}ݧgyF/,YₓP4E$ŋW_}?XkLzxH^[i2Oī7)Ci՚:uS,P+[l>AD8q^uO]a 8P;w֞={_Pb(W>YH}X�}G{@�@�@�@�@�@�+@V`})@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ԬYS .Լy\Vԩ^/@vb :uJUTѺu낳#W*D"4klMOG1cY|=ٳz8!.]?\8l0�uVu҅6 ޓٱcG8vX-Z=o`wY?@ � � � � � �M@yq4 � � � � � � � � � � � � � � � � ݫڵk+44TK.UjՒThL(V,X duj͚5IIU?.5o.m+ߟǦM<Y 5_~J>rZq͛7VZ֭ ?ԡCI@FܷW_}/B_V@U� � � � � � @p4@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�SԸqcKNrȑ7NcO]tgIqڥK4sLM>]'NʤJϔ)&MMꮻŋU`Aד 䍨R%];Nɷ6lP6mԩS'=qj.]~;wM18`vmʘ1N1Qm裏e˖v]M$QFGѭ* ʓ'O7 x ?^SLь3taגՍ+W}=W^UuIq9񱂖-[ݻ﮾}֙@�@�@�@�@�@�H Ĩ:@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�//jΝ駟m:tHgv:'O҂/"OQm|LR}Ew]۷$L״ij̘1ʙ3ڶm+wl٤ᅲ~Ezm #=*VAū={=w >|֬YˎnsڵZjUoV#Fp.\Xv]WbŔ5kVnӧձBjfzK&LHQaZF~1={֍x =ImMh{s\u| ݴ0B 4}7ck=� � � � � � @d"@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ŋO?k&Z&.]ZO>OI6z"kAv[A=N?RN~XeʔzЌN,Ԉ)nժIIzIs`9C0; _K.]]VթS'ժU+ryؼy в~A~,A%Js۷ϟΜ9k;8 p}zB|~UK.P@×u{z@V.kA=.ǵ}<q.|pzYe#� � � � � � |�C�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H2իM&6!KرC[,8_ٳuҥ@6e[`P\BҀrGuB攐~\O&5ZWI{OSLѨQ/_x7ѣʖ-[I&}wdϞ]Yf ) *[o9r#_51x ]VO=&MĻrbTD|͉Y亢.|s\Mq\J4qD}..1@�@�@�@�@�@�+=r}9 � � � � � � � � � � � � � � � � ߯ӧ~x.\iӦ/ԀGiݺu/t5jժUʒ%ڷo ܹsnuUREE<aeV۶mj֭.`ф _';uܽ{wM4IG￯oF3gTꫯbŊqiNg #7nsM<ٵ㭷ފP4gm6p :pRJ$য়~Z o5k&yW_I+K/͚%= sΕ3TVxw:u~wOX+.(Vn5hrcϢ=?6YӚ:uF1cƸʕ+]ؗ=Eu۷qƲg52h"1B7nTB;~Lҥ >{Z[Õ!C7.|;ٓطk.>_d2gƽZuEue}oTnb vc篿M6jժٴ>F7:t=vnvw=[-[t{^[-^X5jP="}=YG]`!NgΜqASNF 3ϸo g;v. 2D:v_·(|y\1^xOdD g( @�@�@�@�@�@ 8B@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@+`G.]R&M͛ Zt,[nq3w^6% y'Nvښ={lۧ~ꂷ}YY�F|& 0 8k7l (\6mҥK^a>#P-3P4iҸU^˝|'a^wq,ɓ]UX†~gɓDž$fV2e(1]乇y6 I iӦ z<o0]Y̆ ,מL2l^={dKkwʘ1{v^yje1l6֩SG7t gp?1Ʈ X@{gyR,@W^n�Hf{vBBBO?{;.Ʒu|clܳPLZh! V Kl`Cjذa.x.pL βozI8gy `a6V[ݻeT-aϠwyB.җqޓ*f?~ +W wk.l�ءC-m@,9{2!� � � � � � (%K � � � � � � � � � � � � � � � � @vܩܹs+K,bGelW.�‚,dnݺzdATaSϞ=7ŋ5p@ʕK]wb p'T[΅sY}ccyUŊ^{kms`*ku7c-/,⡇rAk4kÓ4Ɠdop]4juUY-)ŋ;,$[sKygqd}nTNܱ BZSgXΝ=Lw]sayvҥKys7cW]lYX…`Y0gbYٺu k۶,H".˂GBb)ŋ,oz>|+رcZ~LgCvZ0M 4pc?l̏|[Q1VrDըQ|Y,ζ:>}څYXeڴie\RphiӦ/gBa.lkٲenwutXu\wݻVBkacγwH%ŒsBz뭷>|]XEu[k׮MpY� � � � � � @tMkt{َ� � � � � � � � � � � � � � � � �  ( ,*$$D+W5~xeϞ]aShh,Ɏ9s (X pxȖ-w5^˻d[in³"O]uUJ*jA`O؎hV|1P3,X;Yɜ9stY}w:zիαp_v"+W\];yf S{T+ޤ87O>ɓ5k,̙3G>en5iD?9<5{l]O޻gϹl"Y5\~L0{6lyR:tҏk"\w@,{}{,Ɣ]v_w7S@ʌm1b瞰&<yҍ6:Y=,fϜY͛3SPKO[ *$ šBlyO_z2.[ߨQ?~5NjrFfc|]Wʾl_$}[X& � � � � � /D9 � � � � � � � � � � � � � � � � �#` wQdߴiꫯjٲen^rl"w!Yxfj0,"UpFTŸcEqa]#A[nذVX[}iwc֭.$Ť?P*]ZjBd!0]v/ڵkОVZijڴ,ӗoAZ˗/wA4lE&;QfM}YO\r}ѢE+4%yk=g}{o[8) 2D%Kĉؚf6VۘݞLyQ~ܻ!s rبl\?+ʗW븎ekCjO]>͟[G ޷o, =ҥd� � � � � �$X@R� � � � � � � � � � � � � � � � � 5jp3gL܊Ֆ)S&kҥz)eVX .\vL 7Dնm/N2;worxٸqv54 \1c}4M}.$5yCF^ Ԍ3t}]VСCeĽB.; d:Ν:X{mʛ7o@uk+4�% 7߬իWu:v{f͚^`Mm۶EoW˖-5m4Y_]_G_}q_9r³vޭ;v?ݽl ]{>-:ut V{^ҦMͧ � � � � � J&!� � � � � � � � � � � � � � � � �1 XD tX@/^\3gѣrʰ,]v:{, ĉZlY~n{͞=5QF>516 eX;,r@<kXb6 .,}<R< //1Jׯ 6l_1,P6Zf*U_U5 UիOj=ǜ9sTs*TpҥKUV;wnwX#l |y[HՋ/<yhȑ/ݻ|„ ~lEٳf+ Խ{w 7n Ӫ_r;yd2}.s`Du/cl}DU_m&浍ꝑ1cưˎj[NBQTekۼyw?O59s%#� � � � � �qo � � � � � � � � � � � � � � � � @ 8qb۳~Wx' xg]M:ukWZtתjժzGm۶ըQ\[_~eoqZڵ]ڏݻwmeхxY{la&_}6l&Mr 2tP)SF:u JlUTqݻ-=V܎;ձcG2|uM[lõh":uJ^o߾s~z}gzW D=);ِ^xA뙴{o@޽էO/_ޯjyC�-rʕ+ٳ8}h=ӦM?!Xرcȁufr~ӂy7 믿\[z0= wy'kW_O6A'ɓ_AK}ۘ}{CVOGu{nyG%K;Vwx^J~3nݺ>Ufޓhc+Vйs4~x]V6[xwg;}6ÇS}}c۶薾acG}3gθl|߸q^z%ȑ#>77P_($tUԴiS=j޼yBd&`� dB�@�@�@�@�@�%!(@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ qB1Aŋl u |ʔ)nFWMڵ]xƒ%K4g͜9SwyM[xX0Ԙ1c→I&;wj֬k|iysɂ'o+=;wv,Bn ӧBnaSNUզM}wڼy\ z]`5.{.… .l^uge}0-ZYf'ȂḚpºe!-2d+Xhٕ.]څgO<&ZX ];y";y{0/vsebҥK5c ٳGS޼yc�PWdI`w޷~B -{dndpctt9~a3ia> .TܹUD Ww Nw?O?6#`7thkx%& z6 W*޷jȐ!-ƾ<z_ٰ Jm2 |1"1e˖뮻dիXh!]_*V3obŴ|rWwŞg F]=;Ǐwc=Rge}? ZfkGqXߠAdttclvE][ӧO7RJo"{ػbӦMٳ md~lcC<,hTn_SLQƍu0_9+`K{n##Z� � � � � <)"hQRJIu3O@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ 9 X{={օTȑtĉ.B2,*d!6Sv[�G=\@Fcۂ,|H"B%U��@�IDAT,>,\& -k9f˖MrwZnX؆ ,h#մiShb-  du)lO'I*[VdKyBuŧ~^,B ~oYН=.]:`珊-[x ;ڻw Jh(n:t FP[oUwavht},,˂z?U'nBM F:vXȿhOy:h+×qٮZ8_(>uG>Ǿw#oLB,Ͼ@�@�@�@�@�@?}{NiN@@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�()S&M2qӕ?Doj̙URh덮MuwF{wG.]ԪU+ZUW_yvD,<b„ 7G5kV͞=m ‰1(P@@XXF-tR͚500yXRZoH:[PKze:zhX]{<m<{&md{ne2nFuQKkzJi$:-+gS%�1ÊhowȿsuĵVNwVt㲅/_>|Zū?Ⱦ;s_x^zJ.p1>!� � � � � @$NR  � � � � � � � � � � � � � � � � ˧saÆRƎjժ%>nݺյʖ-zk[+W1q=={(FL211c'7o $&U*RRҭ&VI?gϮ޽{AGͣ-UӪU\ #7bŊ.)v~_dɒ7o Sѽm&`-_{~%Ǽژǻ}OI} o_קN~wuMݻwW}=RCTH{� � � � � �Hu3`D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H<'OC8q CԩS'^|^s(b3gN[z|8SN9r.\oQ>ڷoJxIÇw}.[ `˟?oqj^˖I7ۜ9sT^=M2E4VZ?~Or}]4RN8_| c|gux@ gϞշ~?#<^*]DP{D@�@�@�@�@�HKyHW:IIqj%KB@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� 2D/J.jժ/g=zT.] +5M4ʜ9sZ9rH2d uVY͌3ԣG|`׀)qnA*^\6M I]xQ+WzO?T3gSd= ?~\} 9|>UFdS@`֯_/Ri>snLl͔!?xrA�@�@�@�@�@ Ajş go0g"� � � � � � � � � � � � � � � � �D/`֭srڵk;vDB"ɖ-,;_0-뮷~2iYL׮]U\9۷OK,o!´WU֬ҨQүJonG"Zʚ5kԿDٳ}KNIIQ K,.4r1b/ծ][%Kԫ 6$f&];nR5|O{Go$Rp5B;ppZ� � � � � �IZ %ϔ[H@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�%0uTuE:v=zhѢ*O0`>#eʔI}uAHHHu&si<ϧ4wTzvɓ*U6mO>$q+6,`!A#G7|:5kUTQT\#!<27qDM0AK.5\6mTٲe#4I _ޅY2!� � � � � KyHsHuԊ݈#@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� uA#}v5o\?n Y`ƍ8p ̙3[nz'1cƘOdo 4j$O�z5kUo_~ڲerΝxSpcj̘1Zvˣ aÆ_>{) ;vLgִil~ڢE {ェV!sW2%j9~L6#  Ws?wV-ҞB0K43~,3fF&ӈa Y1Z EтJeLBcUy9ssޟ~9"@� @� @@*<@iI� @� @� @� @� @� @� @� @�#zx+>:v'pB/j׮]bơ ,_<|cԨQѪU,8헿eTRel|ѡC>D^ݦ)gYʙg\rɦ9 )HGt_LɶmƏ~իW#fPS(:dse!Z)HkĉY`v D`-뮻..j� @� @�H =Ux;-  @� @� @� @� @� @� @� @� P"&MC{7V\x`ջwZjSY,zժUY?6lX,[,:85ʢKIOF;#/5\)lVZBg y?>zx㥗^ʞ)|{ܭ[hӦM/_>*V ̞=;^xxg+)45}wӳ};rw`+"HSNca"@� @� @�C@Vᯣ@iI� @� @� @� @� @� @� @� @�-';ѣGG*U?ir!y?N:%z|>, ycĈpڵk 0 EvmKKN?@W_hذGƍ7M 8Ng9.=\3&ƍ'NFѥKe]sٜBl-͙3'^~lN_|1>b-f s=G[Reرc\wu\ @� @� @fUxvZӒ� @� @� @� @� @� @� @� @�F`Yփ>k^:co96 <{ڴi1rl5jT|ѭ[ӧOqѴiSeO>Q\uNGk5keY`ժU&L^x!&M}^bETV-:t۷v,oLю}ɒ%1ul~5/Y1SL޽Zl;su]0ʕ+mz#PڵkǠA⤓N*DkM @� @� @@U+PvZ @� @� @� @� @� @� @� @� @T ,^8x'{/jժ=z+[`aESK ?~|1cD ;KoqFzܬy>ѽ{ĵFrJї|ЋE=(e)0K+dsBҴ6D֭cvzԢEhҤITTiHAoV̜93xxbƌ<ޖBR[;uꔅgըQ㇞^{E.;c7.%D� @� @�# Pk PkL� @� @� @� @� @� @� @� @�'yl;vl,\0 JZݺu.]D׮]UVQ|F<gΜ4iRL81^|x!/UO>-2c{」W^o ~4- ~ (ڊo8b޼yQ^\oʐoӦM˂Oi~?ҽqѼyhڴiL۷j2UtҘ;wng{|l9k֬l=)=;S ckӦM'ޣw$G}BJT; @� @�@ * @� @� @� @� @� @� @� @�()8g &d!P)pkŊQjh׮]t!ڶmE Rà֬YN^},%-/^g$J뮻Fݣ}eڬLV:wh('N!}orv[n:-3go-gϞ(P>ի;P07l04ho}z y=xw9p4[[N,P-dEѲelY~()`KM� @� @�S@VujNK @� @� @� @� @� @� @� @�X|y5eʔ<yrklѼy,`+IyA Dj׮]?䓂P1o޼,P%hp>,c5B>B;vN:Ŗ[nY hr7q1EO<{~)DOcΜ9YRz>0e hJLِ?fz"/ժU+ [nlټ6,jH ,[,R… ?y0 /X+vm>oRXZ&M4ג>W]uvF� @� @�ʼ@jNK @� @� @� @� @� @� @� @�>(RT _Y\2� F  I˴f͚YhHգ|ze͚5Y�V ZtiAF~F ȟSJ DIc͟R}Z֭[gsZ\rq7F^bСBL8㌈M[p)?QF(vIϔ4 g}6F^t-{ΤgO Zz:TT)RV:ue sJA\k3w9=T\Buυi)s9Ugszn/Y$/^\L#٥uZ~֞ʕ+`{P> J=dE{:eѧO\,QM @� @� @` *%Ux;-  @� @� @� @� @� @� @� @� @)"Q=Аe:S VZ@*VUbʕ?,#+?#j}}Zjm/SF Z{N&7=q'facw^¶L@Gr3I 7G}Lk]G?Ose\pAMR)*SP^Z_;(*�yp/ <zVS)+IЭ4/-՛_~zzNgڡY+Vr SXXz7X;L,=?p,)(v97 uQd!~ @� @� @ *5Ux;-  @� @� @� @� @� @� @� @� @RF~hH~ח) $6|yxâe˧vE b-�/SF Ъ^z6\{q%vmC]'4HO'UG1fLD//KXBL@ J5_~yL2%<HAZ{i駟Ʋe˲>+XO4�ӳoO[}Xv\陜i=55s;8/0`xwbԨQ2g @� @� @�%T@V/@iI� @� @� @� @� @� @� @� @�9.P@Q $8G @[n*oSELya4;c۶mc=믿phE@ p;3 gώ?<?رcsSu\y&^S/8묳JЌ� @� @�^VxB? @� @� @� @� @� @� @� @� @W 6x Fcǎ֭[Ǎ7k֬ keRk"^}5 7Sc@+E`ٲe1dȐh֬YtIѳgx_W*4 cƌ>(9䐜G @� @� @@U @� @� @� @� @� @� @� @� @@ 8;.N=ѣG^R^ S}".0bg>|xlv{l|c-(r%KĠAq??ѧO={v^hѢE"?  PwuWt96mZ]� @� @� E @� @� @� @� @� @� @� @� @�9"Pz+cĉjժy΋e˖H^y߅ 3@;,ʕ+ @.\]tQqG N;wnFytD�Oay} @� @� @�e[@VپFO� @� @� @� @� @� @� @� @�9(бcxgkn!ڶmO<DV]; #~3gƫ}F$@Hϟg}v4n8s91o޼,TnݺEz. @Xre߿O @� @� @ *  @� @� @� @� @� @� @� @� @ wʗ/rJ̘1#v{:*,XEXN=5^/񨝗Ƶ{nx#G P$ofxѤIH4]vY̝;7.$:!@&馛C:ul3; @� @� Pjm @� @� @� @� @� @� @� @� PnG{.Zn7xcYčE\937z*{P†5p?X`ڴi1`hٲe!CbΜ9qYgEp: @3fL<qim� @� @�(#ȅ6L @� @� @� @� @� @� @� @�(p@L>=?8SgϞ=*o@~͛G\vXjU=:w?`_|1=h߾}L<9/x7N-lnAe{.  @� @� @�R. P_`#@� @� @� @� @� @� @� @� @�#PZ<xp/":u]tQ,_ H+PBGsOdɒg} Y!@F_t-}xW_G5 @L2%8Kh � @� @�uZ~G� @� @� @� @� @� @� @� @�&&LW^ye\s5ѡCxgvM?h"˾{dƍuF֭@{ (>ݻw^zŊ+bȑ /D>}\rS#^;w޽{j"@� @� @�J@Rt1 � @� @� @� @� @� @� @� @�ʎ@O3fN;?я㎋E26ҼKFs~'M]v!@`V^w_*sF:ubYOz*RKBj$@� @� @�J@Rp � @� @� @� @� @� @� @� @�ʮ@Æ cĈ1lذx'p{삔ydDW_6X+Vmݖ[:hٲe#{챱9�%F  }qA>SbV( @� @� Pjz @� @� @� @� @� @� @� @� 7f̘vX 0 zsΥS*V8묈oon1k֬ҥ7wB ,_<EN³={N:mp?$@@I^+A @� @� @@ U/  @� @� @� @� @� @� @� @� @jժ_};6͛ڵ:VZm+QRСԩSc͚5Ic Xti\qѸqo|pRw뭷F˖-7 @ ̞=;;lv+WS @� @� @d *YK @� @� @� @� @� @� @� @� @{w'O`RnSLv(5jDx◁Z+W[s \r4lp> ~a\|ű;8cbܹ1dȐlw6�H`qF-⢋.*E#3 @� @� @$* WI @� @� @� @� @� @� @� @� @`#bK`Եk8cٓsQओ"?bĈuKZM4ue|"~9;c :4>7o^ 4(իF @ <8&L~{TT @� @� @�\;UQ @� @� @� @� @� @� @� @�("v)Ǝ^{mӡC5jT%иqD7ܰn)PYfn�o̙3'NKkڴi_YE]u6 @,<qf;v, C6F @� @� @ jQ @� @� @� @� @� @� @� @�(jr)ӦM֭[Ǐ~8cE}*mB,˽3:[oSږ� L>=>hٲe92 |7ώի( ?yg?eaH� @� @�䞀@ܻ&*"@� @� @� @� @� @� @� @� @�"аaxg<CѦM1bDK/p;qM_? &NvXk.^z饸[7+WL�eZ r!Q~˴ @� @� @�W@wv @� @� @� @� @� @� @� @� <Ș1cFѧO8#b'a/~qWٗ@fu3fL.oÇSƀbŊoFD�X|y|F7 @� @� @�N@VY� @� @� @� @� @� @� @� @�*nx'^6mĝwYbWy@1~OyѢE@YxǣG^{E I_|1=(W\Y1~d+W?< 9rd4nܘ  @� @� @` ڬNN� @� @� @� @� @� @� @� @�6~헅(/98޼E9 l뮑lٲXbEԮ]{;@iXzu 6,vy^Vf7n\=:ҽD�_ }3<>hm @� @� @�I@fwZ @� @� @� @� @� @� @� @� +5jԈ!CĘ1c7XfM8XtUvT h>+Wmڴ#<25k/R<cѽ{7`#"@Xti;ƎQs @� @� @@*G @� @� @� @� @� @� @� @� @�/gL8ӣW^1{?>#X<b/ʗJ57/}͛7?> >}zѹsgL gxz=:v}e @� @� @`?6 @� @� @� @� @� @� @� @� @�\rO>>СC\s5zꜬWQnѣGĈ_^#Z]`ҥ1xq�]ƬYnVZ -F.]O>qE ݗ @� @� @�U$@� @� @� @� @� @� @� @� @�%\`w'ƹ瞛={_ G}t VjFdv38#}"F,u-8 -K.$ Һⰼ/5k7M-jTrUn^zEn^Mj"@� @� @�ʰ@2| � @� @� @� @� @� @� @� @�|@JI&:u+SuMo„ 1jԨkb#~/[,>SCXF^bҥq }l^Ah83c޼yqqe5իWou F߾}SN??z表Yf> @� @� @ *ް  @� @� @� @� @� @� @� @� @ o>,\K.v-Ns o={6m 7P:Y_ڷȶF"t)*mJ[9#0w,�I&q=duG:ubYr)�xG]v1qxK/rX!@� @� @�|% P+ k @� @� @� @� @� @� @� @� @TP!;8<yr^hS.qeʕ+EnoN=R UtI'ȑ##lv?_o]~lQ|;bZxN63Eh"kbΜ9&jԨQPW JUV D̟??x`~+D^ @� @� @�r^@V_" @� @� @� @� @� @� @� @� @�hݺu7. _~yt-L;n`%)aÆG}tTR%n馂qu]qaoC );x []}_?(>ĪUub֬EEѝ>lrI&E߾}m۶1qĸ[b̙Y]ʕQO ԪW7@�*NHk&L~8㎨UVY%1n @� @� @ *aL @� @� @� @� @� @� @� @� @`s /_>:,Hz.~Xb.mߪU, ,5]vyYxO'|r<YѣO?[o5~_g~ 6w}آn+D4(M&0vݻwt5͛Æ iӦE X֑ׯ @@YXfMw}Y ώӧATV� @� @�(%JɅ4  @� @� @� @� @� @� @� @� Zh)hs6w-&O(4i+h{I'#Fȶ]pѧOl~Əu֍1cz?;Vkza&1{R?U'={ƞ{֥'N;,ʕ+NZ@�,裏F.]⨣BNS֥^UT)66 @� @� @ *ְ @� @� @� @� @� @� @� @� @(_|y1eʔr-#j+Vl9Rݝ;wnϪUf[.֦MXdI|riS&sb\J-X>|xһwQF;6 :pR@ rN`ʕq]wEFei[ 4 @� @� @�J@zM� @� @� @� @� @� @� @� @�rHy1z+cѵkxs/O1k֬o=B ߺ/v$֬y?\(G  Rwm۶#8" |4iR<ѣG6fe6̱x>  ͚5c=6ڷo1"[/4� @� @� @ *_� @� @� @� @� @� @� @� @� @hʕ+~z+Qv֭[\|űbŊ9A1ҿQFx|:u&rD6B`qG-WUv_6mZ 6,vy雇 ->5kĨQ_~ѨQ}3gw:t(}6" @� @� @ *  @� @� @� @� @� @� @� @� @FsNnݤ~hܸq9rwCO֬Y,/Kk׮1yr<0u뭷_|ͩ5k+)RLO+&Mg{_n"~GŻ۷;Pȩ=zij>[od L>=.읯W^1k֬^zJ& @� @� @@iUڮ @� @� @� @� @� @� @� @� @XfMAsmz\X3gN̛7/2WriSLZjEnw]\2WK:c…1|xm/.9?,ؖk+;sڤ\+K=eD`ѢEo}w̖ UC-rԭ[7B cƌjQ x;��@�IDATJ@zoKm]wiӦ /{lTZP @� @� @�=@v @� @� @� @� @� @� @� @� @@xK/-/رc\Y93@Sfb?9,XW_ٲ;uk\|SOeu{YE5kV ժPf[׮]bٲc^ʐ@ K׿5 KtD_-ZI''O~ӠAom5(:ߢSXlY<;Sz[bQFe{_~yiӦd L @� @� @�B *$f @� @� @� @� @� @� @� @� PRK~bժU ,)vammʕ3<3LUV]XreN;a„9sf|gf͚,[n==3[ٳgM7rawi 6i ̝;7N=hҤIyY]p­ڪT/^ݮ]ӧOԫW/n Uu֍FmlSoAD̉'ƕW^?OgqY0[oC +;� @� @� P*+ @� @� @� @� @� @� @� @�]˗HaI˖-:io}^z|=P̟??N>e] Ҿ[o5FM6?YK],X;s{QVlw ;J*yu]cԩzTRwy1z3fL&O]veѬY8Sދ?< z_:x?8?',j-_YCAMҢE;vl80ۢm۶e?i ԪT}t3p#ݤ>4hР^԰aøꪫst-_|l2s{_]vV¤IbQFH5)_c=6qtA) ,T<[<WV"9Ss=%KĶn{:4{WK& @� @� @� @� @� @� @� @� @� @� @� @@iXdQt-K .{' r?~|ҔB~_daUkG?_~9֬Y?]tQ\s5YU߾}cY`V Q={/8n,+m1bDt= JY)3όŋgR?)L+MGqD<ѧO9z)5pf1ӧOvϙ3'v}hԨQ6?zՓ~S-S�9眓{UX1t钅ZjSPSzfԏ�7@pgÙ3gftKY'pB;3+!Rh_]w]駟fc9&^|łR<~ 6Z)yw wiӦe!ӵkרYfYhzӟ{7 v @� @� @�eLb @� @� @� @� @� @� @� @� @@H*wĵ׎ Ν[umE :c}:td4i{7nc=׏ĕɓ'g-)*VaÆœO>;#zK,ٳg… )d!|;6\\,lgѣGG JO?eUV-uԉ8 ۗO:G PBPK/`t'f5puVZŸq⪫R[/kǫWiN ^SL &ܹssaeMWWgZ`:ƍ߳ 6md͛g &D 4t/4-+]v{K}SN)SdszLg}+W;fobvt2 @� @� @�|@7r @� @� @� @� @� @� @� @�PO>YWyUUc+Jٳg2s,!)j}S Fȟڵk\-]4XjUz#,4k,/^m~e {IaW 6,8n)ƌ{g|BqwO)nȂn8蠃SNjLaUk΂RTo/p6ǔ¿=8㗿eV837[Hp(szѳ>˚@ LAZգGxǢwޛ!jիWo:N:8CTkժU)0i)m>Ȗ)~U/~gcڴiٜBZ׬Y[neo> J!]vmFJJ'Q @� @� @�Y@V1� @� @� @� @� @� @� @� @�6_, hzB*Vk7x# DH|[ڍS4 Pf͘8qڇҔ>�uW=\1"k¼va7]GFeo,뭷ʎ袋^M|H7i ;/z衸[Я\ձ6+VD,YyϒVz7@ 5iҤHaGQ@-[̖?O¿Y:;a}g[xFhr%Ξ=;g͚)l5wfڪU,,WULAZM6ݠwǒd @� @� @�M#ai, @� @� @� @� @� @� @� @� @`/_!y睘7o:oРA^z7$P༕jժ-Bޞ̙M;.Æ ˗ãRJq-_)t+Wf!T׿"kȑqg/7"”BչxH!bCBrk2dH}koʹpaΕH;3 ~;cOTV"Li[ :{E&fflӯKLYO?t /0[ԭ[7 Fܹsqٻܹs=X63M2%瞬}>}ύ}o$v @� @� @@ U/  @� @� @� @� @� @� @� @� @`4h8f̘uL81V:u@?|cCjΰf͚ß}ߵR8bC9$|,پSO=58#W^4zSNԨQ#x Yzuz`[. ug駟?s &ĨQr[kɦ[@@p Ѳe8k׮1mڴ,ܯK.R})P+vmTn<KO?3fdM7xcN6`ѣG4j(T͛7}7:Hmv}袋GڧЬSOe]wѴi(_ޟn, @� @� @�%G)9J @� @� @� @� @� @� @� @� PH>}N WnR`k~:g?cd~u;3mKN8!r,xfBiN9ׯ_\}qoћo}?)HVZ;fXi JS!K,jժmjb]wmFݼdL^q饗fcٳg4i$veM.[xbѾ}[r D%gZ!Z |mH2W]uUv/H1qwN;֑rXhQԯ_A)T' iǥ{R{S xo# w> 6lXsgġ)omɂC۴i?Oⷿm~;wtޛOcK.͂GGviӟ4Zn+W.\Z @� @� @�@5yS# @� @� @� @� @� @� @� @� C3f'ڴ\3*6]կ"+ [0`@\tEY`_|K+;ģ>^{mz֭[}qmz衘;wng?ŸS0֭Zps=7 PB�1tvmבJW) "?H+yOvmWpu]Ip5kf_qѿxGb}{8p`bŊ8䓳Rʕ_y.DժU ŕ˗gHd)(:믿>.)#ڵ#kUms|G=.N<8s6okC-R^7.wfO<D; I)0O>sB Spq6pߒ߂ !~v9w4r KY]-z3 @� @� @�6QnĨQ{)aU.r  @� @� @� @� @� @� @� @� @`8㌽"6̘1#.]:tիY Ja)!6l̔fϞU5m4[nL%KdV*U*hpfm >J RJ['|f͊f͚Ŗ[n]ܾ1~aP:j՘zҜryj*".8TۦX`AȗB*VvZqV[m2~^zҥK̜937oA xkZd?wR�i2woʕYǕ+W.JFI_ @� @� @�M# P TK @� @� @� @� @� @� @� @� P*Tڵ֢SV&Muw(W vY700iiϖFѩSmݻw)SoۼСCV܃iThѢ>aÈwК7jՊ'\/E KSz7Y渀o}nWO?BEShoegŊY7]%cwv)~Dƍ9m_FnH}!@� @� @�(9JεR) @� @� @� @� @� @� @� @�R.-dk.ZZC;. G馛⠃ڤ mB4xMyF5_= w}wwWƯ~�\wCJc)#gEe%Fr,(^7x`9sf{@ShOf͢iӦѳgySp>K� @� @� !P˷� @� @� @� @� @� @� @� @�J@ʕvxԮ]jX&ƫ~z|q5\5k,6 #^y^&OӟbѢEQRR1쭷:?R1:ߒ{eSp֬Ybڴi1ulSp֊+"?4e˖ѦM8Cyٽ&MVR^ @� @� @�]ܚiW� @� @� @� @� @� @� @� @� P ODݺFEW1@]`Ĉq 'drK>\)`Ј/X0W*RGq ?> zǢSNqD߾}|}jXGwdɒ2eJe Z|yvhڴim6ڵkgn:ZjիW1)� @� @� {YB7Ւ� @� @� @� @� @� @� @� @� y9޽{tI8N=Ը+Zj8{~y(8)Fi=:=<qtL@XtiL4)&N/R̚5+֬Y[mUt1zvZt!RxVժUK@UL� @� @� Pj˧x @� @� @� @� @� @� @� @� @`maÆwߝ<q^q6rѬY(O!8=Pro5jT^rE ^:M&L(g̘gկ_?vGuTt%:w5I� @� @� @j#  @� @� @� @� @� @� @� @� @�M'п{㏏={ƹ^zil:S~o ʡKYjU/<R@N>}r~p: @D |Yp֘1cbܸq /'|իW tP?JHM� @� @� Pj+l| @� @� @� @� @� @� @� @� @ 4h sN<cqwF?{ws,m6 d23[ C(*K.Y"&Zh?=sʩNg,~<q]z"_ڪUD_~Acn5ns̉{'?~|va#FmTjB,]`ƌ1tlyWߎG@Ƀ>8fҥKԭ[w9K� @� @� @ ԪB7P @� @� @� @� @� @� @� @� @�8c]vc9&r˸sΉ:uOդv~ Ԫ&5b~, 믏)Sı{nSLu͋#FĠAeȑ`x㍳�38#[PI� @� @� @@uU @� @� @� @� @� @� @� @� @�KСC 6,K駟~E:^[@{N7tS7fϞ)$Ί֭[WI9%g͖G k۶mt=?d-Z=  @� @� @�TZ.# @� @� @� @� @� @� @� @� P*:uğs=㨣.]d=zAWsKl'jO;Q&M[nuf9~zUpD@y ,X ^xgQFEӦMି[)\C� @� @� PjUe @� @� @� @� @� @� @� @� @@)v#G:+n?YVV[-LR~ .cK8pꫯ뮋;3V^y SOf͚Uq #)4kذaK/e˴iӢcǎYd aaÆӡV @� @� @�TZ&" @� @� @� @� @� @� @� @� Pv M7z={̙3+̂zl!j}]U1Q}gѧOc֊k6?hܸqm15J7|3F-ÇS*g]~GNjԼM� @� @� @Z-u  @� @� @� @� @� @� @� @� @�j/н{8qb>qEŨQ[oUW]m @q":w^)UW];Gydԯ_EK@ zΖ5v؂h۶m+"ndMN:Ы& @� @� @�TZ @� @� @� @� @� @� @� @� ͚5!C /{.]]wrTwƌUU/K<3馛ƃ>x@rr ?>R@^ZRֻ_~eʚko#-2u-[\T'@� @� @� P{j՞{m @� @� @� @� @� @� @� @� @bk|qꩧhҤb5nAnXVgUפQ4( JAnb^{դ) -0u{1jԨ(L6-}fqoynݺF @� @� @�Uޢ#@� @� @� @� @� @� @� @� @�>`YV >{c뭷VX`;u$>O=To./rݵ (?ѣG.)xoZ\eUk׮rG&lm7K  @� @� @�eU&> @� @� @� @� @� @� @� @� @�5EC>;vm .K.$ի\@B,X㪫>(z#GڪG2eJ³Ғ5a„~&Mb 778w]tɖuY$@� @� @� @oh}Z @� @� @� @� @� @� @� @� @� i&rK{}ݗVf)P`J%̝;7\sM7.RH[ J< /ǏO>phM<9J+oF;GZwm۶W# @� @� @�Z, P|S'@� @� @� @� @� @� @� @� @�~-T~G=⨣-"vZ WYo爦M=_G.0s̸믏sfl:t({Z @`?S|ggYfe׷l2:wgz 7uYg@� @� @� @@Ԫg @� @� @� @� @� @� @� @� @�LSNkUW]g}v<Sq=TiD~~?b޼?(eiРݘ*4ܩS7}u'YgmڴB45C`1nܸH!Y)<+NߦR~h߾}glAꪫ  @� @� @� P J  @� @� @� @� @� @� @� @� @@-% 6pAFԭMDLJ=fz8ꨣbĉYG+ܨQi=:#{/o~R:E̝3cǮСV'M7pCr-Q�O5X EKX),?i;-_|EA(`A*`AiժU;wiRV# @� @� @�X'Gl1dH;Tî߾jx � @� @� @� @� @� @� @� @�+(XP\IZ;$L+a]2-2yӟk=Sq뭷jV*GѠA,>,\KVz6۬UC뮋;#5k~zꩱ+א ,RhVnIYcƌ3gfH믟ez:g;W* @� @� @�U] /TA @� @� @� @� @� @� @� @�(GlѲk>hD PF_޽{wRWjU~)ϓ&DtKp֒Ma[\qKxQӧOb5׌s9'N8hܸqj Z}]s?G̘1#JPǎ RV.DUV  @� @� @�-[F {.=zݡ @� @� @� @� @� @� @� @� @@E l/Z}4s%wzFSN9%v}^{mJ~y晑B֭kG}v)b⛜;7b㍋?>ꪫG))v[uQ"PR~cƌɖW;L)W#؁֭;'zjnx}ڴiyy/  @� @� @�y#2F @� @� @� @� @� @� @� @� @V \w]$T^GWHLx,Pk5׌/rfϞni|gq%ğs1cFĺFL>8s%gF_b&\tPԩS6{-X`A?>Ǝf)D/Yfe*M6f.?- >@ @� @� @�hɓ#Z2$bjT}rʝT @� @� @� @� @� @� @� @� " %"zXY , caÆeY)|nݺqg7)&///;v-[" @ I98i]˼y2Fh΂^~fm /޻DתD ̜93 JaY/ƍgSk޼yt1:t:[k>M� @� @� PJ/*Pv$@� @� @� @� @� @� @� @� @�**FFD~\mI hU a۷of)lM[-[>(R(MeөS`O>Q>RA;cn{OgAZ#GݻgAZ;Ӓ.q@\/²E/.)0+-22&@� @� @�JRW @� @� @� @� @� @� @� @� @�)p18jկq´Bvu8CO:u… -X R ' +Wn!WE+Vlj^ c1|8SAL3ݓ~8c}){#uH=;@zЬ[r3fȦQcضmh߾}l&~gcM4)t}b @� @� @�^ /z� @� @� @� @� @� @� @� @� PV hizo1{['|2ϟ_lwygwqŞ(/\K/mŷ9w,LkBR٭'tR6t{>}ĸq. to"0eʔ &L=͛gY:t(\Yg[Rz))߲� @� @� @fLѲeĐ!;P3TYUY!@� @� @� @� @� @� @� @� @�JmAզMDAވBBőG>6lF_ȑ[ohky_ѳj^ o/ JJ!BG+׿ƤI裏;/RАB*̙3'ƏЬ/2;6}l)ku²ڷo_΅f+t:+_ @� @� @�U@@VoB_J @� @� @� @� @� @� @� @� Pu:*_QSujd5C૯O>yY`Ax[oEpVp-⠃"<b_:x t4´z/"aZi( sxwOs9'ڤ=@% w}~m,\0Q ʅeVPn׮]zQ^g|+ @� @� @�&W?Vk؜L� @� @� @� @� @� @� @� @�O?EzDANVF H!8ݻw!Cuƙg]w]ꗵҗ_F~ME4l1sfD:em\´w߂F)hѲe˪3p#qӦM/" JY%7n\̞=;s m۶s²Y44y:'@� @� @�('ɓMG!arj4#Ph$@� @� @� @� @� @� @� @� @@m8G`O>\Y駟#GF ٪_~̛7oHPϗ牳ώ_R\M)s̉^z-1L<x,x1G b?~\hVZYs)ĭuYPV f\jb v  @� @� @�j@nZs% @� @� @� @� @� @� @� @�TYf?OYxܹs#-Z\}qG %5i$V]uXmbV31$0}4hPaĉ^z`H[0}DZki)+ 3g̖v J}eԼ8mbm3|x:J_ݺuJNƍ i;´z泴1$M74y睥Us ̟??&LPU4,+mw9oaYmFÆ ko&G� @� @� PZUz;W @� @� @� @� @� @� @� @� @@ |7駟__}UN)?Ou\XlQ+X/)`+զMXgubui{׏yHYf{ EWSvXZ\hVZ/=(:?-X+zۍ5* J[J4o|KzҢEhٲe=4}'^zeim_]v٥!۵H }wY`ָq rBRiڴi_4$+9Y"@� @� @� ZWUz;W @� @� @� @� @� @� @� @� @@9 O[ooG>GeAƍk]pBRO.'J+E u}ܹsN̙3~‹RhQZRHW SI]eƌ,:wmQlᆱ[DnbW/'44iR,垫䓞?>{S%=Rg=OA>)*=ŭs6l)+,XP7~lI^v^z:5{-`RUzwR4Ы?ӦM+ +޳t.Y6kfZْ[n]߀6{0"y͛7waefm8'F -_~eaVz7 ܭzK Jao5;l~ @� @� @�'��@�IDAT+B@VjΕ @� @� @� @� @� @� @� @� PJh2x>|xYV iժUt5 JU%_Q%�}'Y�R.+~9ұczcmw9 ZQco 1c^T">)8+ܓFڴiSRhT o⠃RhT Ī%M2% \/% :R@W$MxEK [c5bu׍veRW./g)[ =/),+euۜRIqm۶ٺv lK_m*n+ @� @� @UzyZs% @� @� @� @� @� @� @� @�P �^x!^|ϢQFѭ[%R RRȑ# #FĴiӲ=zDZvmHHJ²RZnI!k9NNԩS' I=ELB6mZ!VShY JW_}O=Tv?RhR:\I!elAt9 K78{/su@.0+z̙$R8Z J˽sӻW|n @� @� @�5O@V@۹� @� @� @� @� @� @� @� @�"B<yxg9sfmM.veZKiZZ`A5hРH#1Nq~'\ܾ;{FѣGG:JVԔ_СCo>6lX fX͘1cbرG ;-UW]5v-wh-.]D jH5Q.0kxXVϽo)h`V.8+^gu~`ƕ;[O @� @� @� *|Km @� @� @� @� @� @� @� @�XСCo'|2 q?Zlkӧǀ1p7o^&vI'>u֭93I>7x#[F}Y,\0V^ytM�˜6xHLJ8qb|ᇅK)$mYSݺu:[RPZ qR&aYEgΜu[nvڅx.s6 @� @� @@ *@۹� @� @� @� @� @� @� @� @�iӢ_~qm[nep qkQ~,\;Ae2'xb%(#kj+Y֬Y7YRzv7lСCURϏO>$}x뭷"{YVw]lْ¶ׯ_u7D6mrUf}]a`VѠ^RPz뭗vnUtCߥ8K� @� @� P1J*Pv$@� @� @� @� @� @� @� @� @@o߾ٲ`8#⤓N7߼, /;#뮘:ujqyE QW =oF1x1bD̛7/:vm]FΝN:۹֪@z.,p-oMfZݻwv-vZJaUO<D\r%Y}WxzoRW.(+5nܸW_}s.W^څYECv]Ku]~S7s @� @� @@j-]%Pv$@� @� @� @� @� @� @� @� @@1cF\{q7fa)~zviѼyZk={vݻw\z饱Zk-oS6mZ<31`x~~veibw֭[&>2dH1hР\/=#z=z r]pa<Y'|][g!p2ϝ;7,k5a„?~N bu׍\PVnݶmX6mnݺS-o @� @� @� tZKYYZKq� @� @� @� @� @� @� @� @�~%p=y) .SO=5VZi_sd͋? JO^xa}Q~5VL:5 #߿KH kbvN:Q"P&xwcY`ۈ#I&Y!=k5Z>Rֿ,Hk̘1QNHRiժUL8qۜ9s"aY)4+e³R_4[rAYu [1b||=F� @� @� _ZX-Z+> @� @� @� @� @� @� @� @�j@ d9bС-ZRv kt!Rpʖ[nYՐϟ>l}sEzb}?v}h֬Y iTEI&ŀ" 4(7n={7r_,X׿ tJ *ZRܹsnݺEǏ?X *e_VYe,,+xpT^VX_ @� @� @�j@uZs% @� @� @� @� @� @� @� @�j<rJr]w z;_I'C /<;˫W|Mz뭑{QG{wjTfc5A~{,jt)N>8#Z-͋/.처0aBvj ?>}"Zi?WZl.炲r\箳>w|+ZO @� @� @�. PwXV\I� @� @� @� @� @� @� @� @�/p}3<3 4^L;7xcs9Y`T Tiڴ >Ȟk}ѪU:.(*0vظ;;YfE޽8=w}wwe,-H+f J]\`VZBrP5pbnq+ @� @� @ *Uz;W @� @� @� @� @� @� @� @� @F ̙3'9x_~qAVɍ1"zH=sѢE8 ѣ㢋.'|2~,h=:uTh'PC5\}YDŽGy\n ]7w# @� @� @�TgZ{6H\I� @� @� @� @� @� @� @� @�+0w,iذa/ ZAwzm1uycʔ)+h$8餓bM7ӧkC[V=.@Æ cz*zj\iРAnsxމ)[5kmV;` @� @� @�U@VmM� @� @� @� @� @� @� @� @�ǠAb뭷^JM*Zm۶~ٳg̙3\?ƫ=\ <8~߮q�رc~!-Z5\3<vm#oRnl)… j%۾UFo7 @� @� @�* Py&@� @� @� @� @� @� @� @� @nxG-b L֭[cqgTfוW ;cG=*u :#Puԉ:*ƌoݻnj3wߍo9?Xo ?~;pFz| @� @� @�VR['o @� @� @� @� @� @� @� @� @ {ڵk\xqE-z'}qJ⥗^}W_}{F^Y<cq?kYR{?PianCz*yO*c„ 1`lvm}*r0#G1~Xpa,]|Q^evO??^kVT:Og;S<Ѹqѥw7ވÇɓ[o-<g .6,xg#ԥȒ[qgϞYh]qJs&K @� @� @� h2bȐvXz]gX\X= @� @� @� @� @� @� @� @�guVlqyY.Ԟ|ɸKߏW꫱{daP5>}7|Mʿ_<0N;=ztԭ[,UkR;D#=hѢR6nܸ{Jw2iҤxײ m٦2΂zmݺu}qǦnZOs̉{.f̘c +쯬޲Ƴ>Ĉ#bvB4h]je)wE=KSN#<2,0jߘ5wb/޽{K{~K: @� @� @�%P. @� @� @� @� @� @� @� @�T/> z꩸ꫣ^zk4څ f!7W^ye=̟??;vl<1|8餓⧟~￿kz0v3&_֦0 5i$J J?c ʆb-裏κP@fy͚5o=kR ';w^jce]dyWҾ/OI/S .#i-w}wp駟f!)/-]w]J%M+沶kwYu� @� @� @"I� @� @� @� @� @� @� @� @�*(pwFNb=[1CSNF;>X{ r!vv FbtjBk?{,VYeJReZ&Tr\O4) Ywufwh9[/?~|~`_VnoY-~}CŽO>%nL2% *Zk֋+ diAkhԨQ]Ӿ傢 @� @� @�,P @� @� @� @� @� @� @� @�TSgy&= O<iI!T[lE{J)&f�M6$n,ȪW^?ӳq1"Obu։w=rVϏfS㦛n?0E26mDZAo~m݊.:(z?r!@شi"j]r%Ѷm2VSw/B+2ZjUҞT_<Fݓ}٧YfE>}^G I%//NXZ?KzOr" -fMpzקOHIosNU'O}{͚5c9&{ +Q9sGy$Nݏ={Fǎcvƛ8Sb1?tϢ[nq5dbI]tQΕx{P?G^xaؓow/K/4<3T|wYRWQ|+G @� @� @�* P'@� @� @� @� @� @� @� @� @@ H5cǎmݶBfs+_?SO=5}xwcq_;wsf۟y\:>qHBzkn- [@?�=|꫘2eJ@7|bRW:u..͛|Aw+׶+~:fϞ'xbev[l_;st%е֔BnRY۸q,%"u]3?1o裏SN1cƌ,j֊GzkZKgII}[iny񥠩ZF- /G{{fAO{GlwqntEYvkz&R0VӦMc,7l,@ .BRպ뮛5saE =ztߎ{ Ka`U\{K[E?ӲP` #Ѻu+-v4}4hwJMVv  @� @� @�UMYGz @� @� @� @� @� @� @� @�48J˽sWgA>)N^駟fv IeY N :th ТѻwXokj׿;Cn Im0}7;V�:(RV*i\7pCyvH[)DnݺoF;~lѬY>CK/ZBҠ:?|,\0v횅ʵ^ov׼y,8XV?KzOP믟k#ԯ_?[?:qOE]$s,⎥߃HFe]&dk.c:6k֬2dHFeAf)+%^vQ%BV^yg .zp XRR`n-ZNՔo\L� @� @� @U`ۚ&@� @� @� @� @� @� @� @� @�j"0{l)K JB_a?st!MkݺuNAi kv?sb_Ƽ6ds1lذxc\zzr\r]#F/>}ą^^~aÆANKj)`*M7ݴp)xj1cƌ,$mYo ٳgomݖ_g[o5ڴi<:֭[e*eyOJG *ZҜ쾤T߉̱h?KNu2|ͣo߾>D *ZrnXƍ Mf|w_Z߂+*WD\q紸*ʊY[oUb'+jRT)RL% @� @� @�*EM [' @� @� @� @� @� @� @� @� P)%SzWMǧ~+r,-#SnE^1cdrsmvg}/u ϺcС1|;vllM̝;7RI{` 99rd%Vnr!h%z~4h;[mU{Ā'MSLܳE.).{k<ֹw',Q%c+t!Đ!C`}7vu,plV*l";вe˸˲ 3<3:w@T'[߂˵[Y9s_UYg ~}{/N<Xk+(<dw^EK Lw RSim @� @� @�eS]K� @� @� @� @� @� @� @� @�5C]vBF]jҤIL>= &Z/rC%oѢEVW_]~6mVZ-rw~,#7>ʚԩSy7]u=\riy ;+ۿ}NYSo)4iI$,<ƑʛofS[ }Zt_w=Pw^:hE,X|p 80^z8c"-O)\W^u͛;Sy5j"ըQ_WW_e<yHߔ͛\y)4 @� @� @�U"@� @� @� @� @� @� @� @� @@5H3ݺuA 6l /0 OSllYaÆ-r[ow[xe92vyXi*tV_}p +jtw6(r){5D u:Cl^;V[m5kV KQ,\0[bѡCM4naoiG}tBm OltEY8qbD:th *NceaZ=zȬSYRŵu<+8 \s͊FUT7&N0aW^YqE](Z&MJEWvMVF  @� @� @�@r@ @� @� @� @� @� @� @� @�j@ syG I'͚5u]nSO=5?&OE^+veHSN 80Xc8sCK>W\Д)Sd̘1t7FO>;csF Sz3Bi'x<J_ͭN rɭK֫W/EESړO>Y<1dȐ5jT*ySo_fmsiea;C\ve-~h׮]lVYo6[Ɣ{6nf #Kzoq4o<Zng#襱ٱz(z꩸ wމs?yƹoLq`Z媫?8rmWcGl*Эkwt� @� @� @fŹ� @� @� @� @� @� @� @� @�5Nc -Rs[}ςpRp)) 6mO?w\СC㠃~=#q衇ƑG{lЕ Jva/gSϝwޙt))NNoFߨQxOvEW LZwu:3<^!# :ꨣ_1xg}ҳRݻwʴ7ջ UV#[h۶m܏=:>8sヒv) [o 6 6l}OR%)U}˂RIե^m?gפ:]t/<R(WϞ=cY<0~1M76lS�FmlIg !JvJ!{w#�}fӜYoAq`V%ɥ1~ѱcrkWCKl+}wS_-2ieLi @� @� @�+D / 䯐uJ� @� @� @� @� @� @� @� @�UN/o9>Xku|韻;vlEuyt0eʔ�vڕG#qƱ+/׵[yΜ9馛fF_˫tZҲ{W.7o^I&ss+s΍ &DzNgΜ:'W2?S2֡C,$}djgّhРA\RW %K![2}Es_/7guVnvgwګfa~ike\Y˘ @� @� @�<9eˈ!C"vء Kjo @� @� @� @� @� @� @� @�X\`֬Yѵkرc<쳋,^_qO,u)_^jq2u]1zXguV*(sW\\rIԫWB WyҤI{,ώ;ls;G]c$ o9=P!@� @� @�XJoΕ @� @� @� @� @� @� @� @�q7z(v,ԨO>5n{WtyJU/ݟS8V[m{no~SnEOuyWYe8i[.Nu3daZu֍_]of9Pr~4G� @� @� @ j6f%@� @� @� @� @� @� @� @� @� x#uVpo_?|pHBjz8qbvi裏^ziiӦOj~~<sٳMZi|K+W1նo(j� @� @� P&Oh2bȐv}/ˌb @� @� @� @� @� @� @� @� @@8o.9j2~eaZrJԆ0t[\sxc1rرcy1a„jr /)H+n1{xo0-|HS'jґuH� @� @� @`1Z%@� @� @� @� @� @� @� @� @�_N=ԸkC=4~'4(`,c7xc%^5ѣG;qw /۷c9&|ͪ1@ P@~~~<{&l_}U/fZ\E|J'! @� @� @�BZ6 @� @� @� @� @� @� @� @� @`q^^~j^ ?~|ΑB޸+*d:uQF?ɦ[nxԩSD |7ѧOԩS^Ѱa:th 6,ve?,_,ik%R� @� @� @@ԪW @� @� @� @� @� @� @� @� @;klM?טU̟?? ڵkoQGUƒzC {/ ӟkV|裏ƬYVt\;{z]wnVz\~z7>o}1r-5["& @� @�?Ίw*A$RD+`T,?$OBeD%B ر +*"Hxvܻwޅݻys洙y߻w'/ � @ [ � � � � � � � � � � � � � � � � �Tyn- jܸZ~U* <s9r>C]xᅺUnry:,@kҤI8qzk:c4d5o޼R^7U.\G}4ܟ}YթS' {۸Az-ZcV>D{׮Qٹ9UۀߺXo~V/#� � � � � �Q`R{iҀQ {&P+{;f"� � � � � � � � � � � � � � � � �R`Qs%VϞ=ue裏VAAA(MO>]W]u|Iqw$鮻^Ӕ) UTA=zP5ʴ&0~NL͝;WM4ёG;. okРfX| XKzͨ;HIjI:mea[mll!-Hr1@�@�@�@�@�@ �ZipJ"P @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� bJ=ҥ.Rp AXLÖVH<󌮹M6Mx r!i)-Y"nNdEEヒt,SBu^^9 *[p7o:8P >CoDuA믿l>a֚5kԱc0<kȐ!{N:S5J~yȖnopn- Mk/IuzH߿ٿގ � � � � � � U|$Zq@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�$0/H4ꪫjgÇk]w-:a j=z>c|uAU/=.ZgYx вoe|,0-<ͻg}6_|E}o5nX{V߾}իWpo4yh3 ^̙3+hٲPm,~V;tP!wl[%A[eaqkJkGse![V?=̭� � � � � � P~7$P+{;f"� � � � � � � � � � � � � � � � �xJcAQcƌѢ hN>d :4 VU4ydw}zU~}y:չsje I￿h˸,6mev\TT~[/^~e͘1C}Y8Bw_u޽xoݺuf 3J̟?_s՜9s³Fԩ_~mݶ=mL\o[Ж}m;$Y-dk]�_o~&Њ� � � � � � PjeoLVvD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H(,,c={GO<֯_נAdE-^XO?z!M2EfbcrJ2֠A|'( J J~XQTS6QyF^{IjUTUd5sLkz7 *<o.]'?IwpM{KVy,` ,DLjϡ=z{^~I&~2{[[VPM\dZ୫u+mq9X@�@�@�@�@�@\jeGVvD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(E`zu멧ҪU@C=T[VTu{ŊzW3τyTNN<DwqjٲeyOSi[ϗ_J|҂~l_&M=#*;v_r_7|SZ .$5o~zsp/{hv;s^+׫l t-g}>l4xu9 DP4ۻiS͚5r*|ꭷ_K¶msWV3d{h-Ydo~Pub@�@�@�@�@�je3@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� aM>]O?tϞ=[ӡCKXv%+j^P )yw5k,͜9S,( 9uaaZ 6ܺWg[L?_AFG'oXAtYUUӂF(x_E:ǃ@AN_|E~6 k j߾}㎲]va*{<z%ݿ7߄Y .Ԃ ws\㛮ve]C: m:u^{6mlنg>̑n_VP ذ$`˅mn /SW�+@�@�@�@�@�@�B@-H2n P+c*"� � � � � � � � � � � � � � � � �R`aR`BfCv?E2 "��@�IDATĵ{}n={pc iҤzYX޽պ&lܨ HAHQyI,H+ 5m~'Vo[3FAԭ4|tRf[ގ;YГ? > - K_}Uq�ͮ[ndVA[lf5 , mb ϻwah̻}ɒ%a_⻬_~FfdJf[^fTR op7ވ3neu.-9[ 7^S@�@�@�@�@�@r AVvD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ȱU~o-ǭAavm' ײ![P:u½vťXц W}ٲey,fY{Gչsg}vS Kۚ5 O}IAVQp/,T˶Zvv*ك̢ ( A̿-IsIGK?,ի'zjdk6 `EAz�J v*e'׭[ִi0hޗ 6MD҂,l* ^hͮoc&Hǵ]V?oxg˅h\2 ߌ]Z(fcmd'1>-5g|*B ,X+u೯⮇�;gE�@�@�@�@�@�O] ގ � � � � � � � � � � � � � � � � �[Iz,?\`A~e!X>J ,[\ qa\c{ M}ANaiFe,) 5$YiJ2/ ۭt{g)5*ك[תUR_ f7 jVq(4˂nmdAKW?^;VSOi餓Vm*{o/_<q*p!VJYpaX.~&n!Z$A[~V)A֋jxfA^P/ j֬Yvge|C+`'omYo}>DnkSQy_^YUۻg5@�@�@�@�@�@� P+;7EVvD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�dlƤ]ݕ~k˦9x=ߵJnZ=۬v r}Y9~TP խ[׫חn4B,QhoX0ۛ7ZT 0<W_su~ iidOҰaQVuyG4t0x΂2,dɂ.XLg1._,B^]z㍨|(>v- زRЖ/w} � � � � � � � U|$9.1 � � � � � � � � � � � � � P}kKw}V~,};Ois+t6WݱmIf_c][|l|xҼ9Əs=/^cضq4jqIs+,kkn_in+3ߕg1\ďS'i\m+mLRm~=>7Uϕnl}#q[ys?&-?q5e&sJ_"ӭY־T-|k㤹I=MړvI͝;VjԐnaQ5kJ~>8IfuۚX厭TǮxݵ~N\Ju|3iXi8i" csʵU[=y݁ҿ%T;j*R>zvw |睒Yk? ٲ9e{(@�@�@�@�@�@�@�Of4@�@�@�@�@�@�@�@�@�@�@�تe/յE~_|lsu<vkTs1JNn67ϕƺxJjs}&OjsseTJZmnLLǸTe||qR[&%[ϵٱks6Jͯݱ+Ӎ>XWm~K_w6^Z?6]=]_9-=:rmL7?]_icsmKUձ;+m]z_@�R XI|ˤ-1v._on]ݕ~ߟ+qZc^yҍߞߚ^/S]g2u7>Ujlٴۜy~_2KUw~mrqJܮ-^f2&>'c uJ5//w/LX?s!-֯&MF}Va쳥sΑvu[^ٶ9j5t,_RFᇥNb䕀eud[aQKoT>Q~I={J;/ � � � � � � �Z@�@�@�@�@�@�@�@�@�@�@�J"`_v]Ԟ59,Oisd}\wdRjoLTԘ߿Gwm|ҘTmv >8]?.][56:[p_lwD}qq-~Ϥ/չ2Ƥ;tsS3Ҏuo/]=f[M*6iJ^|Lcܱ?֯]wҜǭʲη񶥛\YlS͋Ǐ]ses3gfvYֳ%뷥i{Yǖ8nVlm\\+ѩǧ[e9GyS޹#i]LHI?Ư;Nt3i<qLΕ4&usرm1ImsQ޶Tݶz]+>jw\+]_qߕ\]x؍ǏmhsC� � P{IcHw-}4xp5dTj5jԨt@ӟJ7LVMlYh\gƍ<ZgKKՠԽc*\@�@�@�@�@�@�@�V9G޾ � � � � � � � � � P-,䪴/oSR5ϝIU&3md}wm66t3>>~LeﮡZ& -#ynNyurQc|L/y\I]cziO_'˴ֈ-ﱻ\_ÿTtsR][tImz~iM'5]_2~M6 @�@�@�@�@֬/ zi睥_: i׮_P@-#CΕu w5nk5.]),y' ך5Kz%[&M}<d~@�@�@�@�@�@�@�[@~};@�@�@�@�@�@�@�@�@�ĸ q!6^cwRqוnnqIҮ+\_[]Gub);vmzR?6Wv]3:=]=]^zyZnOjϴ-~MYӭR]Gy:@�@�@�@�@�@�H'ĉڵ1HSFO߫JV^F4v!{K7,uW'3j߂ֵksNhaZoYKwC-[l۶@�@�@�@�@�@�@ ʧW{A�@�@�@�@�@�@�@�@�* |z<sLƸٔ]gyS}Ư+~g۟yNj{HjwmUޒY] 8IǮυǤjO7K5ߵҟcu [ߝgk�e[}?]HTy=]EWɿ � � � � � � �Vƌ,PS'+Β.WXX-AjH׿nשetkHsHfEA[/]}u7MիWn45 � � � � � � (_3lL � � � � � � � � P,'Y֓I9o#J;uvΛ1L\n2>KoJ[U޲\c9Va7MPTmvsuǩAEkKwΕny߫_U\' � � � � � � �MWѣ% ֱn7@QT8Cb;K/-BLE } {ץ^[oއ`=?dkWvm7@�@�@�@�@�@�@2 U_ @�@�@�@�@�@�@�@` 륍-?GX/1ܘQ6Կ^ Od_|\hOYmlimTm,kv7?ד?cl � � � � � � � �UGoƌ{O]ߥN6:Q4Zr4|dAF^(.!4vwEp3r$i nc7@�@�@�@�@�@�@2 Z@�@�@�@�@�@�@�@� raCVJIRӍײ6;׍u=NZ'ݚvWoC?Y-8(8ӶT:u$8im?U+oUښsŏw}[M @�@�@�@�@�@�@�@�@@EE3D!ZS^5aԣ@ "P_J7 =t^ ȍ@61Dh|P5}tReVrs� � � � � � � �Z1@�@�@�@�@�@�@�Rp FJ՞Mikٚq玗_+lN.H…^Zœ\[?vJ/:Lqcw.Wfת@�@�@�@�@�@�@�@�@�*&p4nt]gI qtIRUf*nڴI:t>ZfI xN~ ֭- ·vUݻdM].%@�@�@�@�@�@�@�R @�@�@�@�@�@�@�J(TVZ)mǥsK;6كPd-N=2y6d\Öc?NZ/?A�@�@�@�@�@�@�@�@�#ɓ1c'7 F+nJ.´m) (ᆴ)P_Ew̙Ҍ?JVԣGImo_9B�@�@�@�@�@�@�E@|y%@�@�@�@�@�@�@ G6EAM~`tL7l< ʝ͏IH7&[# GJ ;;vk2]!t5kysƥ J_9 ? � � � � � � � � � >T;V7NZX:{cF秭_֬Y< i}o,"lU 4(|PM7E޶[={J � � � � � � @$ � � � � � � @~%TZiAOI_s:Isҍ_s|~EeI.4)^wK~7owc]i}U7ޕƻ1ٖnm~eC�@�@�@�@�@�@�@�@�@�uҘ1_wsImH?t9.Tmw 6իsv#GJIZlYB`H:E~]̚Uu_Gnr{G{߾Үn � � � � � � @^u\y2r � � � � � �T@<blcn~R{x{حu\YB,4)=iGϱo^XdeڛN+TeM@�@�@�@�@�@�@�@�@�@�#eZxyd Iվ h͚59N.Hs, !Pio:(E͟_5cFٶ~}*gZ}H TE� � � � � � � N@t:!� � � � � � FAG+]S.J[u29g1~_zϪ7 wrmvos}V}uHsŁR~?'>/Wttf$@�@�@�@�@�@�@�@�@�@�Dr7 >f œN'F<*t tիWחFnMs8 !PIvYS \N=[9ۯ^Bɞ}# ײ-۴7e!� � � � � � �X@mpz@�@�@�@�@�@:xP;6rSZ)ڬVPB`&{P (/crʹ^8m\ � � � � � � � � � �T~_F_iZiP [G]w.|r-*?fƒr&ti9\"uJ}FO?- zYM .e>H5kY � � � � � � @(( {9 � � � � � Py8$eRVwkOU&Q3]')7.4݅<&מq|LZe-m~b @�@�@�@�@�@�@�@�@�@�@` X!sO5w^ҙgJ=tguFkv_l5Gy$8U]Kvҗ_J3fhAA Vf, ٲ 2kY(W>RӦyv � � � � � �H`RU+i4ijt9Ur � � � � � P9\ 񀩤~LYn-(qV *f_ͅ;'W֩SL*Lu-fj0@�@�@�@�@�@�@�@�@�@�@^~9 Ѻ~@:(H˂alVӟtWDf>{աC]K/IꕳeY}$`kt飏5DׯdqǼe@�@�@�@�@�@�;I ގ � � � � �T+?�\Six?h*>6]?6ոRO~�Uu 2ִ~6@�@�@�@�@�@�@�@�@�@�@�*J1cߗzFN;MjҤW_}?CJzm+?\;Sf̘?aΝ r,!Pm,,sH p~, @�@�@�@�@�@�*�Zٿ&L@�@�@�@�@�( ҅Mϑ֭\+Ͻ৺uK¤\@TRկ/5m* *ϯ2u}vY;Ug. � � � � � � � � � � @> IO?h=doZ'JݻoyǗ\r:~:@6hݺuxŋt.CΗgA^U+nvw%[FIVI͛K}FZI={J � � � � � � P *�׎� � � � � @* `(euwJխ̴?>.~!P. /$)ksX؍'K@�@�@�@�@�@�@�@�@�@�@�@r ,\(uWϟ .xԠn_m4rHvm?~8-ѲMi<^{=ܜ^=oӾ_HSNf16n|$`嗥E0><0 j2@�@�@�@�@�@�KJZIӦIl+Uu/+G�@�@�@�@� ~=v?]=UisSYݼl|j֔\h~TkPjb:e鋏l9 � � � � � � � � � � � @Ҕ)RΒ,HSlڴI#FЄ tO=m&;h%xgn,ۥK/)Xj-`Ana}KQ֤I_*ٸ]% ײ/_jٲZq � � � � � � P \'� � � � �T{_s]8UrڒT\T~kǤ (DLcU]{5zGG�@�@�@�@�@�@�@�@�@�@�@�KOcŋCB-=0H6l&.=_8yt7Gu7n',k睥R~,�,Yl Ҽy=عse![iSBt#� � � � � � @VKJZIӦE.E$ m#� � � � @f6D!VR§u8iLYxiR͂\` 2ucmq&:6vc@�@�@�@�@�@�@�@�@�@�@�@�=KmJg-sN5 9餓sG3Ƙm$0j(M kr"Y8۬Y<"@/^~9 ײ7ސCGeZH:aQ"� � � � � � @JRҔQ @�@�@�@�@�%AV.Tu{`[e~`\Yޖm[,wmnnyK bC�@�@�@�@�@�@�@�@�@�@�@�@ ;D!ZҐ! °5ܼo͚5:th4KSNU>}6Qر #}W_U~Ӱ0d ЬӟF _J>]p-'Li(`µ:H} g � � � � � � CrR � � � �MQ8 *k¨R ,AVӅQeRZscTu rm$*_~@�@�@�@�@�@�@�@�@�@�@�@ VW3& ;uWw>[jӦOsŋ@ݻ} Q<t!~<yrj/{jʕꫯԶmn[nK/{Ougn֟QG뮻NpW@-;k& 2e^x ĭ )n?^[? dž� 4j$~x{s(\+Qԯ-9j. ֲp-2e � � � � � �S rt@�@�@�@��~$>T~_R%aC7¬,T]0kϊì6ը2@�@�@�@�@�@�@�@�@�@�@�@�*0{4zJK+ .|TPP6ꢂ`ҲeԳgO͟?_Vhc;:u/T DE�6As=nw_nk<gΜS|G1AZ9眣c#|;ĉujҤI:c6[^c6ȍ=giڴh>}-Ȱ@�@�@�@�@�@�@`KKV6`@�@�@�@�0M*F2U©<WKpm3\,B\@+&M1eS|!ub � � � � � � � � � � � �B`r{ 7ߔ:wR6Lj2+<tu衇j„ 4hP &1cFv VЬ5k,H0--lAZ<P]vA�V[:餓4s5r[lm6׶SN.P6q߿o=@-NT@kK}FeI񀭑#vRڷ/Y�@�@�@�@�@�@��Z #� � � �UQN*\$oIӵ_Rm) rS~ H-ZuVߕn-?N̮Q � � � � � � � � � � � � P}^|Q3FzaR BP>}op饗CK/?y5kVϒve}:tZn;#@tZRSu΋{Tn;Xpo~͟?_;sɠ j: gd!زgo==+[' ~ >?8S@�@�@�@�@�@�@Z U_~n@�@�@�ȍ@aaIZV@, *up+ \8ksT͛KmۖMqc]idC�@�@�@�@�@�@�@�@�@�@�@�@�%wGAZ| H*5iU ?3f}Gկ簂´ڰ$8gYd6n8M:U0)tRtM;w7n:K զLco-ܢ~;}cu릟g ]_~~iӦsj{E+ɓu=bf͚zH/_^G#8"&M_ziӦTݻwzBvqGRt,,^nA.,k5&HqssݚAV(p'x7ܰatkѺ1<oc=^5\v!S8P ?Gɞ>$`kxii・C<(PkG�@�@�@�@�@�@ ~@�@�@�@Z [[!WJ rutK9#feT[`1ҟsDŽ[Џ� � � � � � � � � � � � � i GO?)Ȟ*Ӷl2tA~@^vn0بo߾ڵ,).ȝV.]0+ WꫯP+ta .L,µ&N._ohYȖ\#HС. 80<?αkӟZrFgjZ1b>C5l0ka].P/K/:{/~|Ps OK`0[ǎe=0D?Ofm^Yf.xƶi#xt ^Kk66O]wu뭷A\ѪUdA2ի6 fp-u@zRvV/l=CF(ll(dž� � � � � � �yDRG�@�@�@�P_d͎3K7BAt[AU?aЕ=0Bʤ6{owu<†� � � � � � � � � � � � � # ( sJKÇGE>YДW͟?_;Sx?||rc0ʂYE3W^εkjq-ZȂl1c. B^xtM7P=?a9ٶ~iܹZpZjhn裏ԴipFkڰaCfA\<@8B^~/p={_۷4HO=0X*ḷ,WAU^w 9{GzjXjNl9S[AXYu ' 6L&LuoݺuZbE2!@%:k=P(L+iԡF{QnU@�@�@�@�@�@�(ҥ A6M0ӫZy@�@�@�@ @aap傮LW\ȕkcWw]խTY0U=xF( Tc\ڲ}(k@�@�@�@�@�@�@�@�@�@�@�@�@ KGKSH-[J-eAZ;|uV.LV$u5 b* ի-[7|3]v-nҥKlte?pd!XmܸQeLU^=m6:thnWY5\=GZ60@5j(?G]ez;Huս{0먣Rndtϰ0| ojԨQLfa?|s1a�Y~BTU1W rtͩe>.PBvԩxΝ;_86M֭-D*QV|K\ pQ8$`k+-p1 � � � � � � JМ@�@�@�r/<U* .*?5XW_zkT�PnaU~՛5<*\+]{ � � � � � � � � � � � � �ciXixiɒ(l$Ⱦ ڵs$XxʕQʵjҞ{9sh B J=͵º,˶/\oz?e[M{ڷo!C8�Mjܸqamֽi[TO>0i|iQ~,H˂>5iDgb^>7y䑺[)jcvqGqrZ^TV#GJ?`Gwy -iT46Gzy` dZ3"viRXE�@�@�@�@�@�@� P+__@�@�@�m.iSt傯t][ұjp\ȕUo-1JzUn3ӎ� � � � � � � � � � � � � @֭|P3FA�Ԯ4bt9R_?B iGyp$O=zp^zTKuq{P/f͚嚊5kքa^[.nKztwj̙^xArn_Ϟ=[ ~;M:U'xbe߇Z;v,c>LXKneAgsUB馛ԢEqO:IA.kG~AKD+@.a4cg駣@ 1|µ,dOJ&7� � � � � � @ P\> � � �7,^eRZ r_aRF%VXq?l] bC�@�@�@�@�@�@�@�@�@�@�@�@�@* 4z4ap'): B IAQmuQn4{l6l&MO>9xί _.´6n( Lv-\ׅ^Xܴi&y智袋TZ`Y 7ܠw]{:ujYh+e/) :,He9CPe˖}.] >}nFY_>niF'O.~],lo4$m[H7,]qp-{Bƍj @ gE|hrgp{Q 5n, (qDb@�@�@�@�@�@�@ O2K<Yn@�@�@�|X^Z2-ʯ@+ksu7&YUIʭn(q+zF@�@�@�@�@�@�@�@�@�@�@�@�@�j!`{o5sd FIg-#U5br)A]yj޼yx1m۶UQQƎAI޽_}VZȕm ,(.;w#Gk aLM4у>8@_8vҥa駟]vaS#xrMx��@�IDAT(s ,ˎ{oOoN=T7Rɂ/Ю ÚZh_6lPfµ򗿄t}'+o ;2Hn�?)o^:JwygJyY·6Nv^0o_ŋcVXQ<?~Ȇ�-|<nw'SOISJ_,9M >uQV~pw � � � � � �@AG)E{{ � � �GrWҞ\kcWHի|eW}8UXt � � � � � � � � � � � � � YQ's' . (Gd{ti3Ҿ+ 2:3�+'mVp̸qi&Ks,jmִv .kANu7nݺ:% c=dYsx}ü^}U_*gZC_eAZC -ZHYm '*<СCxEmڴin͛.])Shߋ/zR-Ү`^X˗ߗjHfY .?]A^f^tAzԲe˔Ё�-`ald&4hPl � � � � � �luKV?k~*}B#� � �T5XYЕ J'Y6{A(�I(\UnW6kL:m � � � � � � � � � � � � � NAT[{+ ZW'tMo~_ .j}QÆ o& jE[Xv-xf2x¹VXX4VӦM]SrڵW^UNq'fu]kilDZ믿Bo D=ܒ īF@z ؗ>ԩҒ%R۶G(=TAb2n@�@�@�@�@�@��Zٻ3@�@�@�*ƍ%!X+VDaXxv]lvP+ rVVƏx3$5[$f@�@�@�@�@�@�@�@�@�@�@�@�@�^ƌx@YS:(Hws\s.2oӨQ*υq%[E+Կ/-\PjժsΛ7/ j8pvo@z 9z(\kiƌ~ݺUo#@�@�@�@�@�@ޖ@혉� � � cU$eeR®\VN0 ,*~د׫|Z@�@�@�@�@�@�@�@�@�@�@�@�@�@�'d4~4v~IÇK=UK/_m:蠃*%Uk8StqU}yկ_?iӦv]\rI:͚</>E &ɪڵk\&!@~ ,_.=tR۶Q֡F?  � � � � �  P+{ZOe& � � �%6I.aKSu+%[' M?@u\˖m. J1}AA|u@�@�@�@�@�@�@�@�@�@�@�@�@�@� سSJGK=0,3vyr3<?X'xb.e*&СC0Lm޼y9 Jw_;]y,}>F҇�FY3碽H3Gzh7NYSAӟJG)u옛  � � � � � �M(6 � � �(vҕ~[Ha%kGVle`jxF� � � � � � � � � � � � � @> |t]ҁJ#FH/կOwʽ /jM>]}[j PhG�RVz)idii2iKµwz:.�@�@�@�@�@�@�.ZM (n�Z 1@�@� 6DX}v8nZF q(˅a0G\c@�@�@�@�@�@�@�@�@�@�@�@�@�BǤѣ :K>\s|K XV[y u[n*d,�d(qG;D߻pQGICHob C�@�@�@�@�@�je3@�@�@� X`eJ²\H_Z}-/,ʂJۛ7ƸV6i"l.- � � � � � � � � � � � � � @u#iXixɾ�â@j׮2{><:t^uu޽Bo쳥ٳy*4,�d-04yr҆ RޒηΝ^ � � � � � �y,@V/.Z1@�@�Hظ$ʂl+Ww~rɺu% rc~+ ғ@�@�@�@�@�@�@�@�@�@�@�@�@�@ kƌMڷ, svfE Pyzi153<S9gԣWX(UԩcE![%kYVRZ> � � � � � ��ZٿjeoL@�@�s̓$+UV6DZ?x-JJWwXv roG � � � � � � � � � � � � � �[O`<ihii(4cpi Fw )/0Ohzj iR4BO @N6mf̈µ}Tz{"<R:Nh0d1@�@�@�@�@�@�*$@V/Z1@�@�=`!Xn_L( ˵K ƊoEhaWGV rmq8F�@�@�@wPRTi$礈(Q "ʪkZݠ몬e . "JFP$d$O3L79EUW׽uﯪoA�@�@�@�@�@�@�@�@�@�@�J~ZPB*Uʮ]7ި7*::ZOʃj7N[ޱڵ`A6}Y`7O*TH9uRŊ934@�@�@�@�@�@Ԋ@(� � �Y$`_@0,cBlf_o;y2ic~c4YOѢI � � � � � � � � � � � � � @X@92+tS H+|rO? lذA 6#S$}Vt-K/ET@�l%`1yr \o'6m$/̈́fEc@�@�@�@�@�@�  P+rV"$ � �@\o_ 9evݖǏ'=pB@rN/-g*ŗ*@�@�@�@�@�@�@�@�@�@�@�@�@�țK_ Hk yB}ϛ&_gѿ/\Rj7!CۥOWXի Z81e;7vZ`B�@�@�@�@�@�}jE~N Ԋ܎ � � @|wo ±pKi0-+OQQR2�K ^OdI4K@�@�@�@�@�@�@�@�@�@�@�@�@�@�B $$HgK#FH|"( %}ԪU@^8y4i´ }GZ5W{n|S6Lzq/ɰCS1 iҬY}&!]xJ7,]vY5!� � � � � �d�Z%@�@�3Gv>,iTʟ_*[VP!eXiͶaB�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ;GKFI6H-[JJ*(G>rܹsվ}{3ZKҩwyG 4_d{$8~ \Ƃf{^z))�d_ \@?^0AڼY^xa \lX͗/!� � � � � �-@V>i=KVZ:<� � @.]$jK ɲmeaY, Ȋ .: � � � � � � � � � � � � � �'`<_-!}TԷo HQkGB ' <9r-[ڵk+Ky'5x`~z"رҐ!ҺuRRll: ղ // ,`B?V=uvG>t@�@�@�@�@�r�ZV"$ � �N .N;!YK ʗO*SFT)/-4±/v]A � � � � � � � � � � � � � �$غ5cA<۶I:HwIx@H'Ne˖*^M;S *T=*U*d=;l. &ts>~uҤIɷȽ˗ZZREfW/uk~' @�@�@�@�@�@ { !P+r;J"� � iNB,kǎ˲?O7,*Wef m+Xt9@�@�@�@�@�@�@�@�@�@�@�@�@�@�ȉ\ 9R|yi@ sbh3G`ժUTjUmٲEqqqqQQQAUcEZ{ �Q`飏J^Գg \G&@�@�@�@�@�@�)@V@(� � 9 $$H11?Blg+پtR*,eAYD K@�@�@�@�@�@�@�@�@�@�@�@�@�@�rWڳG*뮓 ̽gdMԮ];Wlll˧kՉ]y7KXƙ@�.bE Xµl\YSwoYC@�@�@�@�@�@�%@V@(� � @'OBodmXcۮ]ҩS9<j@X-m`, *\t@�@�@�@�@�@�@�@�@�@�@�@�@�@� 11ҭJ'JP҈Ҝ9Rҝw5By8^\s~$aZu,\P-Zr=!AG7NKyrx[@�*-}Q `. 1Ղ@�@�@�@�@�@�V@ Ԋ܎ � �yX 6VڹSںU,~`}`>kSTTTZ $_Y~V@�@�@�@�@�@�@�@�@�@�@�@�@�@�$fԥ[oI}_<5fttuWכzIA�H{u}x/*ԫ _~9rY)k3uYܫZ'O- � >k%]vY W� � � � � � jEnNVvD�@�²ll,iY˪^]QCfϕ+K b0� � � � � � � � � � � � � � @3fH7 ?oÆҲeI+;|X@֢E҅B*VL/@ y_o޼bbbBVZH"X%B|GCE1 @+}tԾԷtRR{� � � � � � jEKVvD�@�I7K?Xں~hj}̂j ,,?@J`Ao � � � � � � � � � � � � � � с`)>tK&M#aZJw97k Dg}V˧z{z/֭M ھ]Z5J)�Q')S>><pp]<zYm@�@�@�@�@�D"&P+r;J"� �dcGaY?(spxç_TTv 4˂,[Z � � � � � � � � � � � � � �h=sgYԭ[{+WJBʔ9s @lܸQ_(¶7ncԲ{wP˥ #b @8xP7Noʖzn=0q� � � � � �d�Z%@�@�X &FڴI>sf[, ڵtJ eYsbe @�@�@�@�@�@�@�@�@�@�@�@�@�@�2V _@k4-*%{/A) >} +!j5i$&n j%:$/+PRWIA@�زEz@ڵRzҀfU„� � � � � � ^jE.IVvD�@� >CfЫg!Z?Tt�-[Z � � � � � � � � � � � � � �d޽RҢErRjU|сpgd@to9Xנ jz7ϩKHIǎ &Nz8*)� Lޓ>@ڿ_%em"v! � � � � � Y uV\Iv&P+ @�@�BQi:iYeZZ}fVuᅁ଺uO/kՒy&@�@�@�@�@�@�@�@�@�@�@�@�@�@�Ⱦa jgy;i3*JjRYZ駟믿|^k/^\111*V95n֬aŨQҝwSuF�HEIϥwߕZ*QB;ժU*،� � � � � � �Zi$Zi$ � @z U5kYemRBJ5jH]ΪWBOP � � � � � � � � � � � � � @n8%?~<| vi)s) |8%_oKDf/-fuoҥl}_ ( ʖDž Rjs…sE_ze[{waZDZ#@ { [N>%xѣտnÇ믿7|1766㳿jU=Mtڶ\MLKsZm64>o ^lg`EM^Lɒ%vv@ %cxwb.D8Pvl\A� � � � � �d�ZC%@�@�R7+W>z=gFU~K >Kʄ� � � � � � � � � � � � � � ,СC.dŖrȑsĒ|ݞBUfP?h£0*[baVV֖i`l6ZOm? l~ؾ~?\u?tƖk4Â/_WZg3=⋧�/`cӁc{طo_y꧟~ݸhm 5jU㌿wool:uF% KR[ږ<|ѿo}p;OKVRg{|'zi4˗Wr\xW(G�R`BiH南ҍ7µ:uJ-+ȱ@�@�@�@�@�@�*@Vg@(� �y{ZJZBZ<ݻ4=uRg{\� � � � � � � � � � � � � � ,U,TłTli-L%fZvO!.\؅(Q-Ù,p%8)c?ŖV8x ^ZK^õ`?[Ќl28myzzK#n:y,;g 9wljp jlՔ)SƅX0!@6n޹svڕdI Ѳ`LgQnRZk/Wec?s6cPMu#=1’vo_lBhH+|2 ײRJgUTQժUP>1 ^>(; ̕+瑨 @�@�@�@�@�=jE~. Ԋ܎ � @سGN:{_]R>.]ze͚y"� � � � � � � � � � � � � �9R~~łSx_*y޽, IHHH_ 3p Slݟm>6�n2?kBe,'xZCizJ4QQQIBʖ-ry\-B 9Bjrǻf۶m͛emݺ5q}vl7ׂTbp'?^?hvsgafwv㜝 ܲp5j\vmw 5�D.jU XM{Ν兛F^/%@�@�@�@�@�@�&@Vg@(� �Z ZXKsn>ƍ&MK[0r-C�@�@�@�@�@�@�@�@�@�@�@�@�@�rwX(Ν;lAn,#x޿Y0_CK Q)S1!yX[pWd׫nYVlaB+Wvغ zvݼqFmڴm-{d!~0U^]ժUS*Uv{ήupVm@9l!h~88p v_S֭Փ?} Ho'aäy /~{;G>@�@�@�@�@�@ 9#P+r;J"� �Bqiii\Y3K[>̈́� � � � � � � � � � � � � � "m۶$!aA, JHHHle]XXXPpxmB9Jc% X6@__.mi-|ΟOXRO4d�" !P"[l!E%KD ;իW1o޼914B.L@ڵk`%[u˸n#Tta5`j6OnancM|Y~}5h qKܘm:CC@ G \3F:yRS4Hj*Gw#� � � � � �$@V|jEnGI@�@ G xܹe$ lyz-Ƅ� � � � � � � � � � � � � � yca[l֭[GIlea>~*W,-@%J$a8p ײ: ٲצ\g.]Z5jH2׬YSjdr1!]k/Vtt/_&2Y@R|| , .@_|ql!Z6[h@ll{~zllk֬q={nv4j͍7Vft饗̯% p6gµۘZ_K*Tljb_@�@�@�@�@�@ 9$P+r;J"� �9BfΔf͓͒~Q*P@jDj&0[k&@�@�@�@�@�@�@�@�@�@�@�@�@�@�L/}Z@ƍlY~։'\+ y:_zu̓Ҷwyb�i ݻW۶msz·\WV-UNdaHd ؗCpB}lAm6Y05l|T^=<sud\G-PkŊ.͖|1.\]o͛7WVt뢋.R|2AԌ�R~פ ϗ~{{�)@�@�@�@�@�@  {ZaS# � 3vNfiyVm-brFh% � � � � � � � � � � � � � }v]6lZc[8Eʕ]Ԯ][?h֫x6O@ HԩSuoy7ovyܴi Գp,L� ت_~B A5S0g͞=[}V^xլYS-[5kLM6Uٲesj7iwп5khɒ%n^h[Zh2e\Ves G+, Gr" ~[ڷOo7S}@�@�@�@�@�@�+@V@(� �d f˗² S'yF.><-K#@�@�@�@�@�@�@�@�@�@�@�@�@�@�\'+WjŊniJqW ¹袋\8NzTn]ebŊ::�g'pAe{6_[NMhӠA]zjذa?w XXڌ34uTM>݅.\]qjݺ *Xb!{k޼y;wnݪEkK.o~B� G}'OJ}$ *-^,m+=ԣmC@�@�@�@�@�@ w y%P+r;J"� �Y&oK_}%>,YC7{UBY<� � � � � � � � � � � � � �J8YҥKh/zSu%[!ZÄ�D"k.7]VVJ ~uɛT&MiӦ.Ɩk׎PI-YD'Ovb/1 ܹ:v͛Bȉ۶mٳ]PmٲEe˖W_ݻk׮.�0'6#@ ̙#{TҝwJ%Jd^8 � � � � � jE.LVvD�@�2UG1q>X(/.ҵ@TB6!� � � � � � � � � � � � � �^B",X =zTŊSÆ CllJ*M d Zr-[& y:uJ.-ZUVnnٲ}tQg.>>^s5aر*vM6o^EɨS/Y*i&}ך2e :y:t蠛oY7tcO@ذAѣPJתX1"� � � � � � %jn3 � @ 8!M7H/p J;K fyi� � � � � � � � � � � � � � +,eo5gk.ҴiSNc4͚5sA)QQQtr٬ZJ?-Z�qllԩv%=ϢXB}޽[[֍7ި=znݺY*@ ~$cڴi8q[o>uIw $eB�R 4tt4`c޿7@�@�@�@�@�@�!@V@(� �dқoJ| Ɂ�}}PPN � � � � � � � � � � � � � ֭[NYfV mVmڴQFT@<&Cw@ ;vLK,Ѽy\Pw}{bŊܹtU.gh?sرŋ>}W^\rIqqq9sO>vm԰aÜڊ�(p;K/I[J={J?.5iP � � � � � @: 9$ZQ@�HWϥC}(PjNaZE롨 @�@�@�@�@�@�@�@�@�@�@�@�@�ȓ'Np&Mɓm6թS',ӡCլY3Oi ׮]BO}A޽znZQQQy$^x0TÆ Su_f @8%?^#GԜ9sԾ}{=ڵkE ɧ? -Vz)e4$ � � � � � Ԋt%@�@�tƍ6nC~~tJ@�@�@�@�@�@�@�@�@�@�@�@�@�@�<-`!ZSLرc_ԩSk_e zi:�y[ {tt' -X@e˖U=t뭷2/kݻW=:u衇R߾}Up}{"Xj^}U3 ~l[nF1 ޟpzYi|Zm䅞G@�@�@�@�@�jE~ Ԋ܎ � 9 ̜)=>8+Rr\- � � � � � � � � � � � � � �y^`FݻgϞꪫTD<� ={4yd}ǚ6mʗ/>}讻RS*+}B,LVZ?BregY sN .믻,h D�"0u3ܹR΁`sHi& � � � � �I"?Q$ � @gջԵk:ӄiEI9@�@�@�@�@�@�@�@�@�@�@�@�@�@N:ѣGiӦj׮vޭ#F(&&FcǎM7D  @r4`�}n ) (lР^مm%$$QCjٲej޼^~e?Qtt4aZ9҃l&Pre :TׯWٲe{f-9 ]tV>]^`ԡd..- � � � � � �%@VzIR � iҥJ?,K/p_ @�@�@�@�@�@�@�@�@�@�@�@�@�@ XՇu 7ܠ-[hҤIUh3ʰ!w ,]TO> xg\R/k{|/2)0{l=#_~7߸c_p�^2C>}Զm[nZbLSJ^YIq2e4p@/[Zʅj[7֧~RmȑըQ#[NW|2_y5 p8Heo߮zKvzC2 5jиq4qDرvܙaǣb:IfI3gJGJZOZ" � � � � � �J@�@�2Q`0k{ώ3 @�@�@�@�@�@�@�@�@�@�@�@�@�ȅb.xc ~ZUTɅ;]J_՚5kҶ}y??S_|94v-dE9t͛7k.X(3[c[23hw¯ucW_}傕,R>&oK8/kb}u7:[zJ r{J*]ˋHyEZK{DLL͛UqqqҜSk= 7mڔcNC@ kRX)om7MX#��@�IDAT@TiƬiGE�@�@�@�@�@�H?ϒ@�@�4F|P3F򾃡(މœ � � � � � � � � � � � � � @ZF׿U;w0l~9W"E*s `Cz~L>>gv;LR&m]t$ vw_S;vv޿Xɟ?3szGeQv,Y҅+ٵpUW݌䅳r6?|=ڰa*UMjԨQgSE_֋/)S_~YƼ;YuGZ.͚5K3{ Q|6m4h.]hϞ=Q-u @. ו7H< o { � � � � � @. !\� �G>tsoK={fv@�@�@�@�@�@�@�@�@�@�@�@�@�@ ' XpS>}4rHYЍ(Q"'v%W/fΜsϖ-[ܹ$@g?mᄓ֎ͦʨGEE̚bbbn:ըQ#!;utcLJ^JAf16Dr;v?u^$̨2 .ԟ'sS^z͝us=N}26 .|RJF@ nYZBzui8n]c2Ԍ� � � � � � 1g~ ,cC � @4HC0 O3y@�@�@�@�@�@�@�@�@�@�@�@�@�@ ]z)5o<իW/]Jmh,j֬^z5cҥ裏TJժUK~6oެݻwiĉ{tu׹:8ɓ'O>СC駟?WjS*U:.[=_zԩ믿^W_},<dȐ!?x`߿?{l_^-[tgX{H"jԨ^}UhBeF;v{uϪgW_}|wܩ}oצMԱc3ajcҤIiԩ=䓮ogќw?ƌkתzڵzX~Ś0a >Eq;Ŋ o5sϩbŊ5/ZVɒ%տ.WYfO?MjϞ=g ASZI֭|R^/ݵ`~:t166] ֞{,pZH)pBl :0.Hzkmkj {Gٻwvɒ 5[¹Ӻzͥu 4q#. v2v ܽB zTvmwߴ¸llh֬YbǏX^Ǽ?nLwJ_rv^xAަ`}I>5ͽ?|b4j(5ov= G ~wnMVg|S?ۘN-� � � � � � QY�� �vU}Rӟr{O � � � � � � � � � � � � � /?O 2ۼ_yҔ)S4p@;7=Eि.vvK/uNr7*{M-BC*YGqHw}XȈշn:^ڕ\=& ڲBu, l.$Ÿ>܌3\-mmvYmp~FqFca? P2 RjGJ},P.]8 i?~ڴi# JiذaС.28bA1t-Cٹ�^o вsoAm ТE"jRN\X3rHy睉X?[n½,Tf׮].`ɿC]Vcδid0ue!`LZj۶du5vXm߾=ڑS +1b~SΝ]xSWN,olsyYgpǴPsvppƍ_ҵ^~[={tʕsc2ca[sK w6 {m,t%{=/jyaw_\dXȤ3<ýu^C53{c) pŋ˥%o{o. � � � � � �Y!@VVsL@�S˖I I͛nY@�@�@�@�@�@�@�@�@�@�@�@�@�@ C,#.(#C nٲXMW_} _u JzWlU 4kX]𓅄X_B@6l} /K K =zzx a$R4g=,|¿̽H".ɓxVTdIqW;vLfraX tW,& :m:tVZQFnY}+Vt3 IYrz->eAQfdL)uС] _2 + FKiӦM.o߾.f͚۷׸q\]7~�I2eܵc?53w܈dއ~ȬGq-˦onzݻw ޽ ñ{Lw+qR&OOsimeӅ^µhAk6ٵOi'2>&/S~C{Mo)e\^spǴ^siu5nT?=e] j0>}{g׮]]�fwN ˳v=X[-`o y7}/~tH)m ŋ_VҥU~~3{OK3]bEvh m@�*P4|1 N7J119C4@�@�@�@�@�#OM@�@ +J%8:D�@�@�@�@�@�@�@�@�@�@�@�@�@�ncQ6m6=3;vlb3/-)_|nnDeVWfʹ` e;Z}dD6Y0?Yؒ]8qB 7( jڴ,@S&Mie, wڰa?XJ*n,Zje2BbIfdaeSJH?_&v~yEGGWw~sC -$Ƃ,<fsիWwa@ƍ]yǼOÇm'Nt!0~-ܭnݺ{ծcǎǰBm:XuXi+5 vM'c2< 5s=s´sPFjux&?颋.r~X=ecG}ʕ+0H\vj0}0T#Z6LUVy;|`PciJc. @N?],SˆB[  & $/48'6#� � � � � �[X}~ � � � � � � � � � � � � � � � :u$ 7n\헅cXRJ4|p]xBN:nPBe-4rHu-dy!߫W/Ҵyfp cǎ%9oP^|Eo^%JH .CRkOr,PB`ڑҶ2^fM&e(=7|?+­_t253v cC'|R?.]*k=g,իW׸9}/io2>-8•p~ .M>לu&q81k=לn#PFS *X+v)4hb~̽UVy/ý{}zezvdee[86޽u?!eC%o@�@�@�@�@�Mj妳I_@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�\.`-=x֓k`_~-[>}СC߿f̘fw֬Y㞷�ǻ`jĈgVYY>w}W~VoF={LRar+'\ٔK}SjGJےK]XZq]s&΋M+VL=3+VfѢEgѣڽ{wɓyΨq}3ri;cF;#>} {饗?eҳZj]vfh]\ppZG#ח2eʸkwڲeKp3}6N¹G?/։'J^$ K9so#Q=5{sRtTԲCү5 � � � � � �d_﹡e � � � � � � � � � � � � � � � �)<3ܹ AoS#{o駟#B z5j(駟YfFjذ =z9r-Ҭ#' ]vɎ|r5iDg־}\ub!#e'|´t?m6?$PWaZ;5f̜9=uצKD[jYH?mڴ ޜ)uU%4n8-]4(֯_?mݺ5ڨQ#WnԩmŮ)Ǧpv"mG8}gH|w﮿/[3]}.40s ù9Nj>\_zB,m64-Z=_#YZ5w<v옂{?.5nawu:u1#E .XoK'c/ @�@�@�@�@�@  NM@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�_ `{Lkd=?#ReMCڶme3fH업޽[=,@n߿o?~x x…ܺ`tAlݛ-Ԋen7 ȲPK.DKv۪T²,w?P&MrA;K,ɓ'5qDXBtK˦/R+O\رoJ۶m`nLzjWdaGV] ۘNصFf9ʕӟ')seC-}'iNpj:tO?[vTvmh"zw9 >lܸ 6xOϗ uԮP}ݪl`0 |vvl{NZl_sdnVOk_Z{5wyn6[-1#_sҲ>ufٵiSϿٳ߳~cX?{ڵk?YeʔqWZW8Bfy.vM9m4^\sw K5ow= ް;7KW\!u&oLС<*u#� � � � � �}P;< � @IgK0@�@�@�@�@�@�@�@�@�@�@�@�@�@�IB/:w+R … qƉ=ttB,8#:=.BFbŊߖwX}X؆M*Ur/bo-[L_|{Woll h֬yM:Օ+;#4a3F/1,t_T5\x_nݺzǵxbז9sx?NzWU0 );x. _zʅjw 6Zn,Hl޼y[|ASJ,~ۑvƎie-HwV ڄj<ov,;?)Sz.lk.ɮ% 2_paUӴiӐ5}tfΓYKBB =޽w< t0^  yZHW_ivڂtq,TRBvdtʵ~z7;vL=Ӯ 3ۧksJףy"E,^;?էO*UJ'Ov%NnӦ;{j֬鮹tI\:u߹"{fk.}.P9w$/_,i͚5\=l5Z;X`olק+~k㪍ZiA~=ʅZn-olfk;64o%opV>ԽjPͨmH _`B�2C{o57&31@�@�@�@�@�@ x%}J>ƣZrk/3_&%dLԊ� � `o!RL  � � � � � � � � � � � � � �!`F]`XXfd7qqq.ʂOjdxk.]pIO:f?mEM+=V?. *WZ­?K4 P`eڑ(eab;wt,2Tlٌn R[r ]v/.˂,,x z1%:N}3qHp" {wec#u#G={^savnpk0-1q%?dݛz`F^GN#,-o1¾,˿ !-BC/B$Zr>!�a xh y}I/$﫰 � � � � � D_}E5K!S<!@V F�@�U@s< � � � � � � � � � � � � � o:t ֭k6CkQd{jYMFLTd>G}Tzk2g}V~i[h̙3'#vޝbS8}2 . 5)?G8祾q6߿_|Fycǎz衇ܘjA?uZl #y1/\[GѤIO詧RϥJ"�"= i>@j$]@�@�@�@�@�CjE~ D^ � � � � � � � � � � � � � � � �d jn?F[У={ꪫR%OSh޽{֟9ggSR\pEښ7oj }ׯ1-dP  pmHSG0/5"d٣ɓ'kܸq:uʗ/>}hĈ!_ɪʱ7n, 6|WW^?#)4</R_#vڥ^ÇW6mtR5h (�d@ , 9"� � � � � �$ȗMɶ@�@ xCއct@�@�@�@�@�@�@�@�@�@�@�@�@�@�8qΩLc/ԩSԡCYQ׮]U^ɬ+=CZv,(W^2dR jʬ6qt]wwaX͚5s;O�[Ȇ񊎎v_| lٲ.<V/A˨li=s.N:n|۷ .9 (2UV1cƸ�[ntrͬ]z鷿,,zH_@�@�@�@�@�@ ~EgY}";%P+wWz� �H@lt2h  � � � � � � � � � � � � �i ך9s&Mɓ'k۶mV:wN:+T59x*]tCֳH" *fy4}t7&۷t]_ZnCR:w111:t _~8p.vg &hĈ3gڷo'x* f̐z<*}�ٺ4@�@�@�@�@��Z"$ � �Za1 � � � � � � � � � � � � � ֭ԩS5m4Y]W\m۪M6jԨ (m @z;vLK,Ѽy{bŊ.LK.o~ƾ8^n<ǎ7|S/V-ԧOK+Wݧ-baZt}aÆaÎ @vuMgƌDZG[@�@�@�@�@�@ !P+r;J"� �a ;!� � � � � � � � � � � � � �Y*`A˖-ӷ~sj׮]*R6mBSZl.LSTTT#�N<UV jѢEZrbccUNk.qqVX{Ovޭ֭[oT=Tns@'N҉'jҤIΝ;_~^�M*VXMF� ?.s�ҟy!� � � � � ��Z/ :{3J � �g%@Yq3 � � � � � � � � � � � � � ml٢ i,YG@ I&.lQFjРJ*mNC@ w ꒅeY`ttW^SNt.UV @[VP!wda,BǏ &hǎ_u릮]}.1 ȡ0M6믿֔)S4c Y_t7-ƞ bb^zH_>\?\?"bB1$YJc 5mͪh կ:ыU>U1PJQc\j 3C]=N"!#9o=ʞ^u#NsCnO� @� @�8ZHjͺ+  @�3$ PkD� @� @� @� @� @� @�h'NSO=z _{^kdWj TYy啳" -SW^ɓO>Y *AZ%P=z4۷o_~9vЫɓ'W_}J}2<d7[o*뭷^:w4 - :thUJb->;s"瞶䍉�i xc^UW%]N, @� @� @�* Pk֟@Ys% @`j @� @� @� @� @� @� @�V`Uͣ>ڸ,8ƍԭ[õVZi UݻwoV;n'@yz<ye +GʱRJ@jVղ  U_z>|xgM7Fm 6 K.d[>(g{'sw^H.]6lmݶ kڭ о|0adGy0z @� @� T@VS[5s^&@�̴@&s @� @� @� @� @� @� @ L<9#GqJ(O<Q<3rC޽{c/R}{Y#*ZG�ҼU҈#�TJN˦ﭼUߪZ-K0ʼ0tqU@Q&MT=~e֫‰]w]aiqL8Y塇</Rb*ЯmU-p3O @f풮]S LEjk� @� @�Zjͺ+  @�3$ PkD� @� @� @� @� @� @�h7%Saê>~aeQ*zeYr饗΂ .n @Kxת^x!RۣFJ )k-i׻w*PoVȊ+X/ZJx#w}w`TF]wk5\kV3~>_HKߣ>ZGyq}ܹsy+n%Dk 7JB�ef_N-9d%# @� @� @@5Y֬۹� 0CfI @� @� @� @� @� @� @�5I&Ua*Ç<MƍkӣGٳRZjZS97|3/rU_z饔Z±J-Ge ɫ^1f嗯jnZ@̕`~8%gJb{*mUWM0VZ)峧 #FTz*O<DUjR>3%ڷo߬ގ%̸@m ϖ[Mn-Y|֙ @� @� @@5T֬۹� 0CfI @� @� @� @� @� @� @�3(_l )>#Gl.?Z&Ob׮]õJK,S\tEӱckh+}Qwc̘1[֢v=@,?ơ5\ߗJK/]+ ,@5V4S%0i„ mvp>}wU[}Y>3-wy 6lXY�Yy,"YeUj5W_=坥 @@ ~5曧;UC\ @� @�hMfi Ԛu;W @�fH@ 19� @� @� @� @� @� @� @JF=l|WowСC^xp[le *sk}\#e J_@ z7k o(Wj^o=*˕K.YݻW!teYj 47 P%@駟j R*=a[:uߖYfZAp%lo]xw2Kpf=<^H6˻ZBVZiZs�f@mj&$kpCR @� @� @ Ԛ.Pk\I�!Z3$ @� @� @� @� @� @� @�9$PYƌoq)CZeYE%hSq-Yh%h_`ʲ^tڵu~ 6Q>k%$zwkz+SSW Y+Ao%XJLӀ^³RHԒۊĉ/fĈUR=,GYw^߅RKUl^2W+mZ|Y.aS|YVXa*meM.<;q&|=ly~ɀ_ݴO� @� @�DZT˱Ys% @� @� @� @� @� @� @� @�V/0sgϞU7xxT=j,@TM* &Lv;w[%d>|K.޲wyS(ice3Ocmo!^%?le>߸{wWtYǍWSrLUBJL eeUKB@@ Zn:=5jԨ*\T_Э|1lqwvygJVY'֗M;/.JyG`w_y2.AeYΝzHY /[}/1ԬG|7hР\tEyGgmΛ6Z&^[ɑG  @� @� @ t\+-G�hg|2fL @� @� @� @� @� @� @�hVP4`×e 3)MtTٯU)aLUj )cεcs5n7XR^P'MTY]/!g%�f}ؚߔ@z(δ֛К.KL�b 2%;6jEכI;˻Jy6}4]/*!a˻G;i77uhV=<,?=YUuwY=Hi_ kZKH/^i -W]uU>qYara堃g @կ_2:4p{ow#@� @� @�@?[ۓ-}imwڞ @�N@V{d:L� @� @� @� @� @� @� R¶J->@zM7ˈKe.|i K}}e cڦv eiZ4 ԗX=�iа-KK /6�"P޷%X^El=]_h8֨Qk63rZn++^}MCtRm=?CJמ{?<o @g~.$Wwd?  @� @� @�6# Pk@Ys% @`j @� @� @� @� @� @� @�8>9sCiq!h"޾aܸqKp|0kV?%K!@�!P,ζ&_2 @� @� @/ Pk֍K]I� @� @� @� @� @� @� @� @�)pGr´6*n]<{7}QG=z##<Һh#K,w^?$7Fe @� @� @�/P@i @� @� @� @� @� @� @� @�Z!7|~ о뗁fԨQ9s뭷f&lA>h_ FK�&>x~  @� @� @�Z@@t� @� @� @� @� @� @� @� @�9'p׾w; @�XdE O>dգGtAYzsG瞛&O�$P~xSA @� @� @�ڨ@6` � @� @� @� @� @� @� @� @�xd-L.0aw6h j[o+"/B.ˊ+|+_'ڍ@&nn @� @� @�5`N'@� @� @� @� @� @� @� @� @ Fvɪ@thD \= ><W_}ug 'ѣG?#&@L799%@� @� @�Z!" @� @� @� @� @� @� @� @�_6i-hruI._ܽL�@ǎ뮻fyg3̲.o|95$@@?#9dܸv3l%@� @� @�̔@r2 @� @� @� @� @� @� @� @�mIwvH>0d茅�|Rw93r\tEy嗳6dUVi_C�"p{%c4 @� @� @@ @� @� @� @� @� @� @� @� 0#%Dkݒ_Lפ{9 @mt9_<#Uq={̽6jhA-;-SB� @� @�hAZ @� @� @� @� @� @� @� @�fI$ߟ 3{. @% 9묳2z? 70}y睗qƵnZ&wߝ* @� @� @�/T@ʫq @� @� @� @� @� @� @� @�Z_k9+^NK> @�/0뮬=zn)w$@@ndynhc3 :��@�IDAT @� @� @@3jDM @� @� @� @� @� @� @� @� z~[N_zJ�fFm/8#G/~|Uc>"@@(aZlv[ @� @� @�M@VQj� @� @� @� @� @� @� @� @�.&w׺ϜtR]#@�s\`<2dH_|pYz$Ç}6 7LZ  @� @� @�_@/ @� @� @� @� @� @� @� @�h%G{v]wׯJ @@СCv\uU1bD< M+Bvq\wu8qb^ @` v2lX{s#nO� @� @�haZ @� @� @� @� @� @� @� @�_J?^ϿuE7"h'={UZW^ye&L]w5{Ή'_~H&fM"@� @� @�UZm @� @� @� @� @� @� @� @�Gr2 <̓}ه 9:uw=C O?]o駟^oɞ{nshK.0W^i3* @� @� @ ԚU9 @� @� @� @� @� @� @� @� }4ydsΙ\fw$@�I`Vȩ#G .[ouV]u՜qy7[p�_ 64_m4N� @� @�huZ#a @� @� @� @� @� @� @� @�fD` uI.,[3˝C�̂[Wu]yᇳ[cI=rV]B� @� @� @�A@V{xH� @� @� @� @� @� @� @� @ JvRK%KҹsrggM7k4 �^; ѣsꩧO~z .{7g:_.s#nO� @� @�haZ @� @� @� @� @� @� @� @�>o'_JҡC2xpK/k6|�iX GqDyyYeUrGG'xbtZر _|< }'@� @� @�4@7" @� @� @� @� @� @� @� @�sH]vIƌI Iuky睗^8_Pܖ�(lI #Gg?Yjr-s磏>E�6/0lX[�  @� @� @�3% PkL� @� @� @� @� @� @� @� @@K81{GoN_N?vΝ;hW/x><<xp|~W^]y,KǓݓj_6Z @� @� @g ,!  @� @� @� @� @� @� @� @�h'kq9rd=ЏwZ#@�Z@këzݻwvep 4iRN @7ׯZ @� @� @j;H @� @� @� @� @� @� @� @�[N J2x) .}- @E +'pB^x\~?~|vyj?餓2f̘_!@L~{rk @� @� @�m[@V~FG� @� @� @� @� @� @� @� @ rJr;L9aÆo>[ @@ԩSo[nSO=w=oRgq-:F�(Jvt� @� @� jgn @� @� @� @� @� @� @� @�ڌ&?q&as9ѣGveOC?aVYe3'\{Yn2dȐ9q{$@@;vl|;k - VZ)vZFU=[dWϙgY R{f5_<K=y7馛殻]D@duu[o  @� @� @�C@Pv @� @� @� @� @� @� @� @�]kCM9&>~CIǎ8aɍ#FE]zq_KX>|xB�/P ^vm2nܸh\1^.]r{̓>M6$?O2ח}ss=ӭ[~ԅW_}5O."@ .Kg=%@� @� @�NZS۽ @� @� @� @� @� @� @� @�hC}I-,+/W^7x jzƭޚ;q׷jfk7nUaRh3M炕W^9GqD`ڏeu͹瞛ѣGO/e 64Ǐ? ={B?<UަQJ=fR ?: @� @� @�$ Pk6A  @� @� @� @� @� @� @� @�#CWKrYos:E8?}7'NŽ;NR6Yf @@\R灂n.Gow<cZKӧOJU ~zj7ӑ_>zn%\2sL<|[nU;3} h5%SB:J� @� @�f܌� @� @� @� @� @� @� @� @�Cg|%/4(k){.C ^=ztseʘ1cr5T_rl{ί~*~BW^y%}G]2o/-_|qwެZ9ӳT!&Msϝ'UwQ5٥K򗿬@8∼Kc=Я'|2\rIr!Ի*W\qE|͔>а߾:>v؜qyᇳ [Vͫ @ s=9bP{`J\Дg˪wo~MW &\{䷿m<j8&59#?]vZ@K-ߥoyJ-s^X[[k5םkY^z>O;,-|}Wwg뮫,Ryv_!@ ^Iy~hy}# @� @� @@Kꟃn @� @� @� @� @� @� @� @�bemS I:g)뵠~馛bgϞ뮻{:R5J)!Zp@VմCeUXI ƨc= H)V_׫p5~o6lB<J8V%lIQ³J歷ުvSb=nK/M.^%^аkO=TU6ڨ ~_~9;C՟hg}vb|K_u떽޻z�O JQGU#LXisA9w]v_rWos.ojsUw)悤<`Yn7|U2,J YsW^y衇{h3Wۮ 7n\40swn j mF`䤓863,!@� @� @�4@f'  @� @� @� @� @� @� @� @�-ۧpZH D~\v{,guV2R'of:,"Yk _~l喵/=\veUV9VJyk_RQBQJI *V%4_|չov 6,_}un pVСC~VC7zUXV w}s'5.=JJǎ;.~auYtae7[s1[!@@[8* k˻t7W\.z\PB\2`=Zgt.K0b\µ<p}e]wm,SNգܾ69w~ w1]w]Jطwy)?g2x*@+fmWR[n+sil\RJW Z+uw4gnB |QR̫?mnxD� @� @�hV5 @� @� @� @� @� @� @� @� @{ z+2$YlOޠ\~޽{4Wa*mYvgy H_YBU^{kFުwɠA2qYoZBMSS.ѣGum ҘKWu>Syԃ3JJ)+|A&LPzGΝ+na^}լkS½<ȪW_}u?7UJW~v,  ~A+|+UW]tw5w .,2rj93sA P*9,k.Xfe@tg̘1XW悊_Wys饗>+ogv +SN9%cǎ5<yw66ѥKj}UViܷjU(?(M _nɿ_msFE� @� @�hZ̀  @� @� @� @� @� @� @� @�ZT#yꩆ0^}(RDJhɀjQ Z,:ulP]O7^<ƃ^)זRºu'ȳ>Gy�;VM(wyOFm_=_Z¼Jǧ+x`F]w5%$fcmC=T+_ ڲK/Nx_5>M7ݴZ+?k.h:kZ\P|f9眓W\CJ3i瞻hgny|wI'T`~S`M޻N;UieZ?/| zjY~Za|_' @� @� @�@ @� @� @� @� @� @� @� @� 0gj9V;oLVYeXdE#GLOٳgK62|߮T>6|w}bo߾YsWVϟ`rgPK8p`.첔q 2 ++d\{/J]  FV;b|Ӛ q.8qb6p̾[Mַ1L?scgqFFU%l6˚kg62JPwj/ G޲.+ krK @� @� @�Ԛ @� @� @� @� @� @� @� @�Y 䪫~>/3OYg^ze7nO.]ʷD<K׿]wݕO]{'?Iw]w57|sԵ;~G_~9{WyjLCM k^W䡇jlgҤI9 /4B�*СCjhwD&<֭[.\p)k&}14y3Z>*S <hS@>(]tQ>+M_8Ykd-S}!w@x;t( =ZX_t0* @� @� @@s j.I @� @� @� @� @� @� @� @� lUrɠAɶX|u\sUW>O>d~ӟVS=zιSVN;j_bY6FY+C=4 ,@?gˀrGd}駟^7vj9lذj9%Hkʲ.[b%d~wmiĉ:mElW_ Vr|7wq6l,Y6m�mTsfU%ep-dG]\Y@_~yXN;E6dpIsA1zUH٨Qr'hr7|Y7ٳgve{թ% zZ?(k.7HN>9YzL&L9U-;- @� @� @�):qSE� Мݗ G٪ @� @� @� @� @� @� @�]sI~Og ɺ۫ <9cpСCJյ^~87|s~_?ynO}Ax?-R+[{GqM7gnᆔ�fu]~yWS}Ѫ]6`ѣn_~v?)gqFU?J {M#FțoY ۶ TK+2dHJo~,2|ͫT_;Ծ{+hW\q_yUAE'tRy{UL=P}׫wn/&Mվ|TBr˪Nk.Xc52k%7|۷w.җsj套^g}6^xa5?uQ<g.{7w*幗)RZߋ-ا W1c ALp )t)Y·E!@ ~O~_j/$zhV5e^n-0}e� @� @�h]wڿI<0Yn95yNw  @�mYkh26� @� @� @� @� @� @� @�`esK=3N𪫮-"%';S]5 *f~6,_sU%{Siovt2EU Z|?c~JG 暧Ӻڷ>}L؈A=<+W^y|Z{*pM]Z\P]&NX*hZs`'_y啜9s/_r~ԩ翁h_1jsЛZwyuK_  @� @� @u t~{[h]5gݝ�hC6D @� @� @� @� @� @� @�fdO8c暼3[mUk=s;�ZԁZ~@bJٍ7ޘ>;RK-C9={l1Oד7N-h7i[r{Kԡ[e-c7]N:{  @� @� @�! Pk֟c?( @� @� @� @� @� @� @� @�ݗ{o$Zl´f @LUKys 7tPk-첵evϐ!Cj:�6+I-7=z$:M{Oi3}K� @� @� ) @� @� @� @� @� @� @� @� @` <df%]t0syWrW{]AO?=s&@@+<y9`:s@^{VD[~w׿Θ1c2qĔ>%tkV&Ys5[�,Drs2T ngdv� @� @� :{� @� @� @� @� @� @� @� @�1#KV\1ʆ/|ᇹKfvw~=ݘ �#j_ɂ )~<#]xgvb~UZ%#Fdذa?~|&O78nmV^yhB -4C9�9'pMɏ<TC֟Njz }4i}[oMN<q8B� @� @�h7v @� @� @� @� @� @� @� @�sP´Jn 7$7kիWJU @ ,Dt'{~ | j)uZeܸqK3`{Ykҿu}puqɝw& lYjAz @r4ۥK$@� @� @�X`W @� @� @� @� @� @� @� @� @`2& _$"̞  @`vt5rH-8{۷o:#GqDy @s |QreɗlM2=$\U_wݤN3 7o:aBC~ @� @� @�) P}>w&@� @� @� @� @� @� @� @� 0>0}dĈdȐԂ%XWܘ� /̨Qr[okM74 | 9aÒ<+O5`O&9$K,,P2uVǎ<|5t'۰� @� @� @ S@� @� @� @� @� @� @� @� @l4)7{Mn)Yqvk7"@�QEY$?O[nIsAe饗G{n wW^I~c�Z^=4><ӟto}+y7>J-D!d\_'rHC~z[ @� @� @�ګ@:p&@� @� @� @� @� @� @� @� @` |_ ; @�9-СC|_K/??w^N=lv9ó.cǎsO _ɍ7&\}wҥK1Ǥ1FPѣ!<ÒuIfr @� @� @= ՞k @� @� @� @� @� @� @� @�9_"9˒-spg @@K޽{= ><W_}uխ}kYnr 'd-AMB2hPo'z%tRҧOrɘ1%$;0aZMX"-y챦{ @� @� @�LOO� @� @� @� @� @� @� @� @�8䗿L??mjU; @�!бcU6lX9眜Yꗵg뭷NfǏOy'yݏ￟eɇ6ԏ>J&LH&NOq+q$eYvU;վ^')u;': e٥ǵZ`ܸ䡇#䮻U>_%l} ǩouIZ @� @� @m j @� @� @� @� @� @� @� @�qK/M׿N9 @�h޽{O '+2g}vfJ9rfE1PW^IFNƌiX/eo4,|ie�U±ʲUgM4%i-\%3ܫ5|IڵkRjW_/xkX^`}8o PgIz*yGs5|X!4;I6,`v%'ЗwB!@� @� @�@ɵ2Î @�|^J?}޶\O� @� @� @� @� @� @� @ | ZMk @@K()2eFLoJizdUZ>C>%N^߿- ԤRCаaI%PwdԨԮ@խ[C]lBEiX.pCT K5]k睷~QaS%ȫkI M*:~|Cm{uܸ}e9u}݆}2zִ<ʾ^*˹쟖@ o:bD;9ê_>YsdJM[nZξ}%k5{i}wv' @� @� @`N n=b9Ջy_Z5 Њj @� @� @� @� @� @� @�3-0iRr}bN&s /*la;h%PМPJ''G=s!ޭ%@]r%:gϝkaA;BVOw[o5^`޽„^:מ=%ljm[~ke;oכ.^oΝʚlC.z7ߔe<粬׃:vޝ\B~;g,K}jY/_0+W_M&On{N ٮWZ)YydB(}^JN8a%@� @� @�ږ@Y @� @� @� @� @� @� @� @� @`n1ד?1>nǓvj:|aZX#@�+PhJXAG}zk{%ᇓVz]8,ÇVuWK/=oF- o|w<η ufsKV l՗MՃJTY/KT}Z?=wCԼ6,{3'k *e bR-PU9ZKߟv=Y!,qEn6ڨ!GZ~Mw}Zg[^ @� @� @�mQ @� @� @� @� @� @� @� @�̚i5|7{n$?l]7|)* 0m}M,q@K(aE%@[T609蠤odu=k.z0|lҿZkJ%eUjs4k *[՗e\_0 ~/畠UXjwk%h` R]/ҥaYk׏ZzhW^mmY~OooNvءx @� @� @�'ar4_sZ"@�ZଳOƌm @� @� @� @� @� @� @�['Vr U0Ф|IB�[,djABnyfjB>n/&Pn%QO޺nE aF{Z[j}ٹH-a_~zOl(KWϦ  @� @� 0ƎMuKn=)@qfTg @� @� @� @� @� @� @� @� @cxW !Z ӚR4@ OC{r-K-S|NrHR;'߰ɘ1 A<ʧiv!nmꪌ1"Gyd VX!;c5)X˺SO͑ۻ) @� @� @UjI'  @� @� @� @� @� @� @� @�,7LL>*?Q2a'C�K`}=Uv/9Y|溓v4ر)tlUR~vOoJ�OUϞ=_J֕W^YlBvu;'xb^~O|&M4v 0c{Rr3v @� @� @�Q@V{|L� @� @� @� @� @� @� @� @s \p&ON_MƏ7r9$K/Ƀe:OxC^NJv)yH.:u!C駟{O?=,Lvm3|]v%s D(%0˓- @� @� @�Z>  @� ٻ(7RAz& +"zPpؐ" J WR"ٜ YBvIuMvvv)ݝyBF�@�@�@�@�@�@�@�@�@�@�@�@�@�kxQ^tBk?(կ/8~� t$Juy y˷ }{X1yVҐ!RɒYB4p@۷OzXn]/^`?~<άR~ժUK&Mv?^@� x9v*QBz饫ǫ � � � � � @R P+@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�X L,NRJZ^U@�GsW]62d6/G'v4fmRt+)mڴzd:f!YzRܹCiŊ|ץoԢE }؇  @dҠA y@�@�@�@�@�@��ZIg � � � � � � � � � � � � � � � �\J)RD]$je1h.̙ޗ �\@Rbyc=g K%/J7Jm\'Wjlٲ6l߯jʕ\*UO?TO։'4rH.[wﮗ_~9*ن�1ԫwZe{μ� � � � � �$1p@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� X@pZ,HJf֭GIr]_@�)йO/5n֨ 9"5i"uK>Ռ3kѢE^P]1=ʝ;p(}:+^) KNIzŰ#/#� � � � � �IL@$3\@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�G`)UՐ"ťե+…:k �Z];ya?RdR6R4nZ`\LiӦKCJ3Go(oMF}饗^ŋ0+T믿VFtP}C��@�IDAT g}WW3f\ � � � � � oj= #� � � � � � � � � � � � � � � � R:wRhdK77OT)a"�$[o*WpC1&F>PjPQCZVф^n&q:p@C jժW/ x$,йd< !: � � � � � I euV@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ Μ9Çc9zN<?=ںo9uΟ?s^Uu 7H"RLTR].]:e̘KL%KeϞ]9rpn'ܠg/'/ipxY@�D$k޽nٳg k1/haaa5[Kwߝ_S]e˦Y-((o޼n]ɣ4i$"IL=^zfˁokСni芽m6/\f͚ŋGum'tqzTs۝#j6xKT½>[ے<yiӦuW[dr|v޲)W࣏奎3}X � � � � � @2ّ}@�@�b'7a?v  � � � � � � � � � � � � � @8rvܩ]viѷo>B=,?yueP/@- ۲mOt ,½,%%-UW^} ȫG,FBA�@ &.Y͛#-[hǎ.w7ި[n%" +r(Xh]1,,&O.vVFl,tB|:g_Jdɔ3gN+V̅(QB,Y]}}^w>T Cȯ&uΝ)/H~Нw!6=pw:t([,d{ks֨ngh!Uì }|XǨ²5;GB fB@+_sr9µwmp#?|.+VIժI<#}W � � � � � pm?yy,͛'ժum&S&u�Ə� � � � � � � � � � � � � � � � @\ ݻW [Izn)[{Blɔ)S\v+VuM-H3/hժC^4z[s̐dȐ/^܅Xvm?V�!�C%-[Y sA6vE&MThQ͛7bk)˻~ k]l_5|ڵ3f ˧*UD,+VԵNc>>zaihi8{L^RD¦| 9^խ[WÇWgϞ}X]baF( -YfuXfm[Ǐ˷o _Ș=Z�ҥK9B= @aڹesJ ﲢ?:w z(4E/@�@�@�@�@�@�HCϱ@�@�@ *(P-P/ � � � � � � � � � � � � � @| 8p@+Vʕ+#V&[, PB&R.yv~"/݊XHJtG P �$N ~={f̘2ݻe/KVʕb J:u"<xP֭# J&W B J,YȎFFI'JՂ, ۣͅ;q1uz,(dN+W'_Gvo{/=2ߣB:ed{O (o^-K @^;HӦ ~� � � � � �q'p䈔=4oTV՛j"P+)ˌ@�U@xq@�@�@�@�@�@�@�@�@�@�@�@�@�@ ,`ƍ?.\ŋ )k`.$l)U ԊhEyf8j*h[.\PlTZ5ըQC5ktnvc  @سg[XؤLYhNկ_߭K.a.Rwl 0 f͚u֪WSpfI/|ԢE᪅dmݺ"رCaaan7p[(4YPSΜ9u79=R_ܹsw);٣-~Z/ ޿bŊE[Hpɒ%]Z$ɩvRJ3Oced � � � � �$vb{;D�@� P/&vB�@�@�@�@�@�@�@�@�@�@�@�@�@�BRB2~G3dVLTjUuwbŊʒ%KH?;uiYF˗/&֮]}ݲ@  @h 1bƎe˖Kԩ̙3�w<a7W7n ͛](O࣏nݤ/:uJ\㳹ի\m?J" ˲%RP!.\؅,Y%a _bYڶmtq78 G+SJ.e˪B .h {-Q#yœEnjB�@�@�@�@�@� {kboǑ � _jN � � � � � � � � � � � � � @؍ǏI&`ԩSzi PN`.B̙'OxP-[oƨ @-ZaÆB:٪U+nZWRUٵkC3FVrCݼ|PYfnw*/gUMJ*8qZ-~We<y\X&*Uʅ'YV4iIMpk7n-fgΜq TTI8\Jw#d-o_ ,68@�@�@�@�@�G@ػ{;D�@� P/&vB�@�@�@�@�@�@�@�@�@�@�@�@�@�U`=zFM6){.̩`!Zӧ%ϝ; jʔ)8qvܩ|}С tHJp[oiݺu.k׮j׮2d* ~X8ϟC=^xArK\m򂂤-?cCao ۲e{m, /|nC!fk׮u!˗/waaaʜ9VꂉkԨ>_iӦ V[Ti|[C@�@�@�@�@�.@}*ZW5@�@ ԊD@�@�@�@�@�@�@�@�@�@�@�@�@�@� pY}w>|̙nI[v իWW*U^ݠر믵k.UPA<~eʔZc@�kx;ںuZl邡|LYԩS4`�:tk.(#TN%˥`4iBgÚ={vb4^+U$RKˑ#G (`6lO?ŋeϞ=0jժb ,�7~oŌkaZuJ5cThǰ � � � � ��ZԊG"� �~ ;!� � � � � � � � � � � � � �A0?PÆ ʛ4i-7n)S4t .t$~ΝOPB^G �(0|=.C bŊx;S<G~i߾}_V 3[BNU+iiJ)wPxxVXS~ЪU:ujUZUuqh6 ػwΝ޽[7x5j[;,[lRj1yNҎҏ?J+&Y@�@�@�@�@��Z ԊG"� �~ ;!� � � � � � � � � � � � � �;>|2gάnݺk׮^(B"\$6p }ϼ;;˷nڅ.]:#�!$pQ=3/]96nޠs<_u7kYfrj @fϖj HŋZ`Ə &~S"E\@ծ][ҥu@ o߮iӦi3gXrw}jٲrftN~I4I޵9A#� � � � � $ԊLV8@�K@- @�@�@�@�@�@�@�@�@�@�@�@�@�[.|)O<ٳ:u4iM*HXxD߾}fz7?tV@�D(0c uEɒ%ӠAԪUD8գG}W{Ȑ!ʐ!Cw\&zTԻԫe/uֹΘ1ctUռysVhx#p-fΜDMrU^=ukOZK=+=@-/[X%28@�@�@�@�@��Z PD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ tGH"k۶mڵ+aZ]Sϒ'OnrJ?ޅj/^\}QXX5 @RkKkƍ "gΜ1b&O)Srn&u(U.5O>ÇJr4g=3ڽ{/^^i�**.]:駟ʂ|+W.=ʝ;{1]6}H(N-yzԾ꫒w � � � � � �N@D2 @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�;v0'|݄#<)SH7oui<xʗ/e˖%2,@ nΜ9so(G,Ym#@&M\XL֬YuwhQ )/}ex[9pͫ=zZjnγzj=n{uCf_| 2d6luqa[{Oco_m[( � � � � � @bML@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ Tw0YFoҧO*ݣH"qm޼YE՝wީ(x?T�@´Zhӧkƌ.2 +A !wܚ3g5jd}įܹ# */*~rA=Ӻ4qD/<ۧAL2)ZE HSNZhMW@lR*TФIԋmˊR Wz� � � � � �\�Z* � � � � � � � � � � � � � � � �!+лwokNݻwŋUD+ @\\Đ!CԫW/uACA�\ŋtR/cjժu< @4i4zh7i޼-[irӧWׂ,o *yiȑڴivn!] BJ\rϴcլYSm۶Bjh;S]eb4� � � � � �H@�R- � � � � � � � � � � � � � � � @խ[7 0@cƌQ~2euBRӜ9s4sL5mTaaa!O:�ė@>}4eM<Y*Tn'OÇA^ӽ:p�6 eqQO?ҥK{mCjjٲ%K"!&p-hںulRJzpai aCqcɻʤ � � � � � � Z@y@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ٳK}j۶-(DT^]g"wa… [oߗ+)!"E 9RYdQΝCSI^~#R\þQׯ͛7SN5 \.?~<m4?km߾гQ]ϥ}IB� @�@�@�@�@��JR� � � � � � � � � � � � � � � �$-1ch.|aÆq>gUbUh 3fpm*TH<̙3zt}hѢj߾/^w֬Y޽{|zף<.Xc,YNٳgO>Q @RpႺuƍGIJCv 4jРFrJWv-kܸqn^m3ftAfرc:S27{L^C~;wNڵӻᆱN|2e5W}֭{ǿx>S˖-գG8=aTgaP]vYի_|Q5k޽{Cr�'O~tŅZzڵ*\*W W:սhRٲ~KeA�@�@�@�@�@�V@6@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� :tH?yw@4k.}ڶm[ ΋^Þ={\ևdɒEo\`m[Ç#ywgR&,lnr 9Ɗ+jȐ!zj*?Gn @0ʟčA%^,Zj߿֯_ӧ륗^RFdתeҤI.,uZretJ*ر^y!N?Vh)+0-gҬYyeև 69ە+ s.]9;&3i;1>}ZjR5aY_~pB?Z .ϟW-4x`=jӦ h|W̙3NNtwkɒ%ҏPi}}CJO?-J � � � � � �Z9 � � � � � � � � � � � � � � � @ X8R owvse*N"~a+VL2vXw3_|5[^=B'ݍ5j衇zz/^D�СCժU+*T(կ[Zk8qRJkԩuXPԩ:h[͚5+f p˗gJ @T믻w̙*Yd4{vǶoP'*Wq;k={sxf/_pk=z8 )~ɭ[E g~o*Tƍc{naQ"-e˖:x`|t#d̒Er35bRJҺu!=:� � � � � �(K� � � � � � � � � � � � � � � � @Og}^iӦ#؁Vj7Xpk[nJUJLҟ\[�X0֭[;!�M~ҥKe)<<܅|Gn>a{WwuٰaC],<Db64~@6Cݞe+yj A+fan|A>S .)S^vqёݻwUUtK;w;DOtۗ/_^Y{: \r{B 6,b[|w)k֬cGiz)[6yyxgh@�@�@�@�@�6k@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ٳu)wC7>?\3fmݦ7|S9rhȑ#<x֮]3_ t1}?,DB2{w6ϐ!CDõsN/_^%K\ 1b )S{=SO]VGTOΟ?n@ox{9XٯѣGotۯ֏mg}nݺʙ3&M$ * �IM`ѢE.vĉeˡCTBC3g]gMO?T ￯7Dw ˮo׿;wn792;kװaCM<Dw\0ׯ__&LFSI-[?xӷ,YR:tZQ5dߩSjԨQ7n,TnժU.w},pn۶mҥxWM߾} �Co} 9ֵ͛m6msq|JUfMŽß;vN:9ճ~=cۯ:jU6fs[5p@YcAikۼJ/-}n~K\Yqח Zac3|馛nw}~?~i֬5jtesQ>o;/Eõ1?|0"w4uY֭կ_?7zR\>gL0@zUyqyRIQ1#� � � � � @BHP:J?@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�,f.\8")kZ0&k,ꡇhVnXo7?x Xba�v} /]@}/뫯5kg"j] Q^yFmOlRٲesw}j޼ 0�* <jZ[j_kfYJ>^o]�$D t,P ^ D{²ywMxyB{:uꤦM Xx]VtׯG� yՅX-^ !zWX`!W pg)QoُKJɛwnӦMp5 G֭{Zq7o,B,@BlmܹsgWgTvTbx \O>jժ+o۵kwձ/^\SLQ֬YwuCXԃ>肦Z̓}{\{UhQ[uc6ؼBX=% ~GX-ZpA9vsy ڰa~' -Bٳ+Wbٳgu M4q7P. x[)/YuMwRvQ@�@�@�@�@�@�y� � � � � � � � � � � � � � � � @]T0{믿v!U9r><쳪]}QUVMB`W^тD͛nڟ*U*Y@F"E܍m?ÅMKN{ 2er\ 1b?ԦMd HO� ˜9ҤIqw˻*VCc&{CA�],&ea? O^ kضQF`kBe<qFYtiWS?~܅XKtZMl9RO=nTg{uyHgRQԩ%Elʾ} s Jmov!*Th}bK暈3]xQ-rHB7|ܹsհaC+WN;v3<;}Z[wbOv4h ʛ7%˕Deʔq/Ym[Lݻwk…J2;QFnlO,00cƌp>Ϟ[lޝ%Kgmlwj*e#,8u=igvwiӦU>}\O�6+;v+_ s B@{݄Xb>Ǘw^Ƴ Z<!>"� � � � � @RrImԌ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ O^N 8ʖ-^R4{l<ym0a!ʅ T`Aw0wy ~[Pl߾]1cĉfnnLo!:ɝ;;no7ʷE?,crC N@ l,(Be׿-ZDToj5Ί:ռyswTe#_5vXʕR?5jpqZؖEWky|W\wWtI{/M H}1hGi~daV6wbA[V"&Y͏O. Ç[nn߉'wu]Z`;uٷY˽t - \9D?u ϼ6_|�. ʵ_#/Zj#_?ѬtY}<jðadAVӦM#B"ʊ}fXڕܹsnS<y|){ * z!ޠ"^zy7y䙅x � � � � �$WjIf @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ 1-ZT[nSʔ)]q}޽rJ/\*{0`j֬ 2Xb޼y["يݜw~_Hz?=qqmÆ H sN+˶m۔)Sk]l⮇?k.TT-n|k` &^Μ9SƍZk7>Wv㊏z^$?=VOjt,}'ڿ֭[&Ml.ltO?euO?ׯw}oSģ?痈Xk}ʙ3>#.\X&M_}m'WaXР͚5+"t~+ϟ?b۶m[`k.{イ`3_h?] ع:kׂ֬܂w}F#ߟW@�@�@�@�@�@�` LmB�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�3u*,,L3f̈:c[ 7]b?8}: .M66m̙N:)u={֭/^8bە+s1x~3@7r;vƍU~țYG�@Ŋ]uß) X׵ gP}iݗ'O<Gm'v ۷ 9ʒ%TgZ*UgQ%˓{UukBQy5e7/M:t}_,p?vs\_7YheEҥԩcjȐ!_�?Zq.,w9ۜW|cL#~pڵkGN0!"_ھ~"Ep4 \,ȑ#*Ydn ޗJ; Z� � � � � �H@�R- � � � � � � � � � � � � � � � @`B}6G T j͚5G\xQ>٣΅i5h@ٲes:uJ2eʸǙ3gGcşv|1g=h g^zn@�(_rYqrʹ*_~mXdzyY \vʕ+.]/{1O֭[hN||UX@}Ox դIK1_{UZԹsgՍnl 믿. *UըBj|)Rhʙ3{9͛7/u߹z/3gθZ >ٳkԨQO|ĉBl_tu}Ь^ziӦM#q<xPm۶*uQ_W}̕+7oŬ_ƒ|}|{g7\ۖ9tl<>> n(t@�@�@�@�@��Zd � � � � � � � � � � � � � � � @Rx4w\VݻU{'s?|Iw#} Fӧ,F*Pnveʔ_K/իWٳ0a*Wnҿh"CFKcǎΑ#G\;vCؖ~kU:tȭ[8?㵝}>|ۥKkf}^3,�$E ~y衇'x^rF]*cƌ.ФaÆ6lw?"$Ttzj}~z{nmݺU/fEw?ókn:u6mZ+zbcu{-rk?#8_㏕<yr~' -ԛB];Dp&: x矮Ygdnb;+Q/=c{ڸqc\;{q6/P(_6mn&7m{ڳ01cƸ-[&{џ$?(h,?Okر.m\VWN ɵ>L7ov㳏|>M4wĆ d_>>}4c gX藍׊ZYɒ%,hf~EaVvW={ v{7TfFnRKZC*.,:.7nG�@�@�@�@�@�($~e@�@ X!͟/=|2E�@�@�@�@�@�@�@�@�@�@�@�@�@�@޼yeaMwar3x#nn7_ϣ?Κ5m7iDw} Z|͛3gBoRmݦUVP ;TfЦMwn}.Ď͗/ʖ-낹4hm;NOP D[ӧOpe㵾kA>vK0jժ,0+Z_uwS۷ɓΣQF1MX/^܅X8 HeʔqA6ڵk 7nԩ?\JrZbc +Tɓ'G{[>27V^\�=ן;w΅ZZЁdዾBZh;FT /wqBv},L[n'.V,\B,̮_r@9y'yNqWoljʐ!W6&^gڴy7߬={y,x׿\eϞ]˗7ި%KȂ-Vlka\6FBe<asy>s.ʾ kHv^聾TYm۶m=9bARڵk5}tתUk-DBYGBo-4iӦzg\, y TdY<fD ]3mk֬QժU]X~GtdYײe˜qܸq.<~5rH7- 0`e!h19W\�a;'NT4i\衅G`:O?킍MdZOS~)|xkyAщe@�@�@�@�@�>-T$r?pL,$,< q � �(0t00( � � � � � � � � � � � � � � s7u믿4|/!~nÂf3fmx?)Sh ^`3gvaZpe+ß1UϜ9,rWUS `{=Y8C.]:Naڱc @ɸ1pႶl-<Z"tpA}.`Ǯ]Q'ԍD׌u\9D i̘Yx}嗪[ntϞXT֬Y[Hƍ]xSH手`Yȗ%O<bkmC^y-qVY`W~G>hs_ ￵sNC6maYpSN}ݿ{ӥK!_^YנA\�Uk2peiysyaR"\  � � � � � $?7Oۖ$ b=hbMǁ � j^ � � � � � � � � � � � � � >|Xkv7>}s=%cͧq1nHo7OLłZlիWkܹ*UTbcA�b-`0w0˖-s(,L׾?zꩧds{(q'0ytڵRB^~e _~ R΄7ĉc67r9u=hذaUid 6/ SE[t&LpnUR%]3fH<#m&=Bb@�@�@�@�@�@  ��@�IDAT7@q$ � �Z~1 � � � � � � � � � � � � � pD~tw\w hcNJT@K(;j޼?Q%KL(] @P<讗yuMLXJBM6z7 /$#daC˨cZo}駟Ohz]h/Qر#{KNM4>˂- dSH+Vh֬YjݺLEW_EO۾h"nl6V 3KJ.^^&tإ-6- � � � � � ԊFV8@�K@- @�@�@�@�@�@�@�@�@�@�@�@�@�SNK.8q^uB`7$=QF{.Dkܸqʝ;wC` [lQڵUhQM2E]Ǝx@=Vn HjIKHUE/K/^Ӊ'\lȑ#;NM`…4g>| ˮ NBw}z7Up}pbѰ]$PTRRncQ � � � � � hԊ[<r$ � � � � � � � � � � � � � � � �%>}z}74hɺ<~͚5IzPݻwiӦԩ $YgPr*G�.Pxq͝;W;wTjcRXHSO=EVC?Lˆ<yr}vo˧;z`^"+jԨ1c:}:#G*!i;vLC QbԬY3w`ӦMn\ BHVSڱCzAy!R"_H.� � � � � �Y@26@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ t]ׯW̙UR%=#:p@H>yz- ٳg/^, 'I2e�` u(QBK.UZ/%B 8quơ"`1wYp̀pS`Vi< DvK*v�[>|Xwy yR,,Y2K.~9j۶rʥ}UVڵkF> j@ٲIT~}y%cD<p� � � � � � P+4� � � � � � � � � � � � � � � �  ԬYz՜9sdϟR<ݡ� XVU@ 6̭^ZUT PT�$N<yhѢEjӦZh.]ѣs!2)^SRb 7Wy'Bg'*$5k0f!IͼϘ1C;vpC6OժU5h 80GGٳg5m43gN5o\Oѣw^[ʝ;wRg +}e0krIBt @�@�@�@�@�B\@ � � � � � � � � � � � � � � � jJ[n]VյkWmڴ*x_~_U׿"Ex#� U mڴ裏I>})?P.\HC ~o߾]s6mujÆ QFH51trJz))y"hڹs,XG-[V{֒%K&o"1…8tMjҤ~޿&OO)SL khZ8r~TpNBiD)<<q � � � � � @`?@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@TԽ{wرCCŋUT)թSGcƌQXXXd&1һcj޽[}QƌCD�/ЬY3mٲE۷דO>+jʔ)o8p!=nbs3fxAO_)K,|;O>R:u~uɒ%ӝwީ>@-Z j^,Ȃe-ϾSɓnߣG+WNrrΜ9{Oܹscn|OdIi8iv#XD9@�@�@�@�@�',+Io،@�SפÇ&-!� � � � � � � � � � � � � �,0sL 6L'OVզMRfM%O< #hk[ѣ~ծ][ݺusZ)S Z?hH7oV^4qD-[V/Zlɵ> {;CÇ+[l. G~R+eq}fw l[T]?h֬Y.ʙ3lka[yT(k/X-j*Y8n2eT~}5j}ӤIh!~/M ^~9b � � � � @"8rDʞ]7OU+ .!P+T� �g�@�@�@�@�@�@�@�@�@�@�@�@�@�mCiȑnYvrʥ͛E./^5-۷o0nSԩS',X0E@ 1|M7ΝvΝ;oN2Q?<<}#G zELfѫuk}nBiիWϣrQ([BU\-*Ur= 5SNpWX6_]bҥUF UNtM}$ ?^*RD^tA�@�@�@�@�@ j@q$ � �Z~1 � � � � � � � � � � � � � [lqA!㽻|[Ei]wUƍU~}B.<xPgִi4}t*c!ZwZj*UuF�W`֭5b>}څPvE!ݻ_k_TZ5uMm۶Uԩef8h@4ujU͛7kҥZl{.\P,YTlY/_^ʕ!/^\ҥK#gq!o>mذAjF͟_țRxvx.wq[2gRG"ضMW5JgOɛFxah @�@�@�@�@�O@ ԊG"� �~ ;!� � � � � � � � � � � � � �!!p4q; Pn?߅ϟ_kV5twH"! EpB͛7;X|{qKR3 $,LkرOO?)k֬j֬ Alذa _] qb e˖MڵsAZHDۥEᅲ4>$VO:ɮViZf,hٳJ< ,%KpbŊɷdʔ) ~^EGѮ]dB6nܨ'Nr6yzʓ7O% k54ȮIR/}^~ZuS"-I~4 � � � � (ԊJV8@�K@- @�@�@�@�@�@�@�@�@�@�@�@�@�W/+@_}%  tRϞ.u,YٳgkZ|\`FŊUR%c >+Włl}J"ʗ/5knݺU2dCO �Wسg[,)ӧO d+JYAΜ9SfҶm\X-Ժuk/L,$='3))/*~[?loذAX-5+ٳgWBRpa/`6Y�m3gN%K,!=IB-4˖ޗWb!M7J(![ʔ)݊},x yDyp%/[lo*N?Q8 $ vE ղp-/� � � � � @ P+oZH@�@/bb'@�@�@�@�@�@�@�@� Uo&%M("cP)-"q ) W2%R-!RJ4)w>g^k=yYZ\w}@�@�@�@�@�~\ZVY&'֭[eP3gP6%qpy iذN/q۵1 [sѲe|,lǚ'쇯 *@�Pµƍæ,rg}tqcG+V 7s54-,^f_C!-44ӲeKBёtj[n#UT?Kv^,X Zh/_;vV)SFkӫVZ.(g_w|SjJC?|x.Ȏ݋/]4駟dd㱅Y8C܏08+\7 Hll.+|l5h/w,Tµ֭tIۼ(Zf@�@�@�@�@�!@VZٷcK@�@ %Rbb%@�@�@�@�@�@�@�@�@�@�@�@�@�@ W Đz.No.B,do/ ڰao^{RoRN: T\9W 3k=o1BVۓ`T|yJvkԨ6m,4 @Xɓ'Gè,ܥXb:ոq'duٵۮa0ٳKc=tPN8Arʋ Ju-.)3ez//{o܂lYR|^5Tzu�>{_JdUR%/^<}QycY ]f{^rDz,{o!Z6fsRn]J Բ`-{M(W75%GSO;am# Y K/I<"'uV$XB٘@�@�@�@�@�(Hjeh};D�@�R P+%&VB�@�@�@�@�@�@�@�@�@�@�@�@�@�rE=g^=&tikܳ6C-c>X 0*{ ~8YNa_bEUPav*YK(l߾ݿ6߼y6ne跇g| X@=ln0D˖@�(`U3fW_} Z3dVW͚5}{Wrςe?m۶͗eeׯ46XOzuB6lPz:(q~?)к予ƌɟ+ʵ`+V'+ e9z[VwleʔQٲe+7,˾;vyvVo {g'zGms IJPecYm7CBfs{RKar|Hև] "͚I :xRwGNG:tݛ׵c � � � � �$ P+Qfk @�@� P+ )@�@�@�@�@�@�@�@�@�@�@�@�@� ~=4t瞑qy6ml-[l0L,t g(vY`Iqn&eZL �䄀,\P-WK,]Y] -`Bkvw .YhVeڵkCZH SXX__zms n;dSe!6S6`<y+ ݽɂbAf!^A_ރ`6¹[UT,DOjҤHք rqUHl\C&4sf$Xk(FH(WX'8 � � � � �_lʾ["� �) +!� � � � � � � � � � � � � �iXT_6LM7I=z=>-K{X͛e!$^{ ֭^5mT%KWooZL �W |Nc9v۶m[_k]b_v0{Y S.gB} w[i]jvlaЖ֭[}Pžl,{hFzᅱ*^J(+vo)Sf,B kM(&,_YV6RraeipYz)gK.z5* � � � � �K@/oǖ � @JjJ � � � � � � � � � � � � � @ X!$LF [bɷvOd^&OVZzR1@�@ '\֕:tdٔUtx~L{i3?lM. ,~x$`BN8#rwҀGDҙgʅS;@�@�@�@�@�#@Vuoʖ � � � � � � � � � � � � � � � �/U>}ѣ'.zaHQ@�@ \~I%˦D=)#q4uvmhtRʑ�6ƞ^`=kϗ{O0ŶmxB׼#5@�@�@�@�@�@� };D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�'I&ի'Կ$H몫RI% � @Z^|Q:Hq@ *T>[0@Hp'W(_sV-{w#\\EvŊE&LΕڴSYS̙b � � � � � j6! � � � � � � � � � � � � � � � �J}JuJÆIw-ԫTt^Պ"� �MҨQR.g�-Ptիӥ="a[;KիKG Wiܮ!mFA˥&M;L:ȵ>G!� � � � � }oǖ � � � � � � � � � � � � � � � �y$ucRҀ7KK7(-Gb � �y&;Җ-RNyVv�y P=Qc?<kZ7#FZT?_<8d$Pb$`{|ixB}{"ń� � � � � �[@}| � � � � � � � � � � � � � � � @_I/$5h qtҞ{Ƭ[@�@�"%+iIUfX `JY/cG$B<Pihi P+&#-Z$u T`v?P4F � � � � � P*t!� � � � � � � � � � � � � � � �S`X#.Z,|PTpV!� �&f4aԩSjgYҺuRҌ*UV>\g%PN$TmR%fX�u?vmj/A�@�@�@�@�@ UЏ G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� gI'$m+ի'}4lTf!o8C�@�HI`Hi=KiuVB�"*PYVI/(խ+ $5o.U.u(=|y*Ͷ۩S#WhF.X26f!� � � � � PR]@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�""dh}cX۶iӤߖ6,"�4@�@ %W^=W*_>Y UF^x!5{tmڵRϞRZaI}H&H\a8P駥+" "A֭+,- � � � � �< 1 � � � � � � � � � � � � � � � @w; ꣏:ԩet4@�@ ˗ؘM@�, T7NjF?^:trG9sb6m ݥ>f͊j+Թ4eJmG�@�@�@�@�@ U`G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� _I?/%  5o~},Yp5 � �oJ*DBnr@ A�@ٲq"Y˖II{-=d[5kJ^*f l]å>ՠҪU@�@�@�@�@�!@V8N@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(SHG%]qt3L'<XիWN@�@�/ҹJKg D� ĆgYgIW_--Z$]r>GKw%M&ؑDϯK_9_}%i#Ttrߒ3!� � � � � @zJ+"� � � � � � � � � � � � � � � � lԾtIRR~kԫWWu== @�@�8KJӧG'|"@ -S7C:UZV5JjLzeE jHҰaULSiSi@i gիΒԑ~`Z#� � � � � G!� � � � � � � � � � � � � � � �T`6CRz=i8Q#.Sҥ5dȐBz� � `Sti9Qe �q~JK[PyԻTԸԧ4aeKVy'P\4ewRǎҿ-ի'n-*5{F�@�@�@�@�(lj#J{@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�|.`oD[sm#4hƎÇk-z � �y)[&G^ւ}#�; 4h %VZ.uK+Kg)=d$|k>X_ZTz|yKik6P?@�@�@�@�@��ZP7@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ,Y"]xa JIw).i<o߮-Z@�@�XR6Mj.K<@ n6ңJsDB Sn~ש#]uoܾ))%KJ#9*}tRӦ5k[JG�@�@�@�@�@0 U*mB�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�RϞ-}AAܶm:v:Twu;@�@�X՜qF/Y�SZݥ#% [`]Y"UH'(RӆPjԐnY??rL7׬)]p{Ҏ;m@�@�@�@�@�D@L`X� � � � � � � � � � � � � � � � 3fHG)}tҜ9CnV1bJ,;@�@�B-[r u3ib%㏗U/KIJG%YP%HÇG/ivL ~Ezi:s$ SЭo-4M! � � � � �E@R( � � � � � � � � � � � � � � � P6nz<jUoSc]]&L'x=0|{p{r8 � � ~M4I:+ PTw+/wkY`:Uھ5Ut\.Rz qc裥A E�@�@�@�@�@ R@b@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�F5^yEz9㏥5kԭ[7u=h=i @�@�$I;vHm&Y@�,дtĉڵ>XץV$ `C, -U~ŋ##9馛}ڷ" h" � � � � @jj � � � � � � � � � � � � � � � �Vڵ;O:di|kt]Jȷ � �OBeZ*W({)}…҂GB֕,-[KAkeb)H/$B+#vo"� � � � � j'!� � � � � � � � � � � � � � � �ERݸ4{ᇑCWB{= >\*UJ2"� � oƎ9@ xt5һJI'N8#8xYSOE·Tmy ҥJSDBzzKjD:'Uo � � � � � P+]� � � � � � � � � � � � � � � �<[7KHV>o<G~Zl|@�@�@ L*m {. �&)H=Ml4`Tt]KK^+y3nM^=E"[͚I}J5kF֭@�@�@�@�@�WJE�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� /KK~+M,=dm6uIM4qvOfB�@�@ E i0&�) a]5k"AgK+K&=䲮@b҉'J>+⋒ը!]uU8*S@�@�@�@�@�r\@'@@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@p t9R׮Rّ>nM-҈#TdT7c=@�@�dZm� nR>/+C#ZQ#NHPƍ:!P\4ndtҴi 'H$'CnԄ} � � � � � j7{C�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� ȑRܹҤISOIʥޤ?P?kaCM<Hšcƌq &ҳQFK.IO t)$m 0`'ӆ w^#w(m՚5kNq{Ҷ~zhB~/>f.+gݼHXo >\˗תU񻼗_/]FvT^=wqtQ-[!Cx t׊8dMFxLV}ZlX?RɋڧsˋjԈc=o䳅m[U"{Jz!oR+/~M7EϖJ$06lH= � � � � �!@Vn(@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ l(u&o/u ͞-jFYF]vue[sM￯M6e4xbOyA[M<V?z[V8_諯i;ڼyMrzʋuHnVO]:dep16>M6{\3~zn >s:}c~<?>.ϋ`aZ\p>9ׇ\E]j~f݇ر#Zt׊8dMFxC A-?xH^<c]^}f]D @M_?Ϥ+矗,4jՒ.\rY׬-r^$ a"% KBihݎ2!� � � � � P`*#� � � � � � � � � � � � � � � �#RӦرҘ1RYwUT)uQw}/Aٳg ˅-zz {K.U^?8ڟ%S,XǫԬY3SDߥXxةS LN3ղ[l.,vrbDc;/v%0-j:D}#w}3-�Y,w9;\?^x,RWo֬ta׏pJw7ؾNik6X3 NJ 0G ĎދE+9E{ T*]|4|x$\Bi'J/͚%)!v-<,W_~ ֮?_w_k%̈́� � � � � @Pa@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�x۷K}F}!7Hgoˆ {O<򈮼ʝBb,kԮ];ww{Q.5O?SN;']JTbŴTnݺ&.-)oפIC탘96+eㄓx}"1\r^zc軜Ȭk,O72~oT[μyykAF{gv+ۅ<lHMkE~֥ CpJ!M*yf*y#oO^$oj+k˫ߜ(VLj\NBWmի'  LJ(u&n]훒.`?-$ԏ?J}DwtAR~ҢEY/-@�@�@�@�@� yS� � � � � � � � � � � � � � � � A_,͞-=tw>|ϟi8 5iD?tUW:q^wyG+VW_Sƍs~M?:wK.dm;{\=nf^ҿlg} 3gn=믿TT)z뭚2e cpi n*[^կ__={袋|HaĈ!W\q_ҥ6l>3:r0gz'W_B ڵ }wm۶y?ֱcG$11СC 5ʷСCwK/T 옆gV7Oޥ?zz{7`mZji;+g?Yڵk֭[G۲e(.)Η뮻==MXZPݻwD[A$:7RG3f>{J!.裏VӦM},_|>nkDcLnݬYcTN?fY}[n}4^z%)S޽{"ECM+ ly뭷oɂi.?<8 ;h~=~̻ uꩧF׉&7 |G,/['2;VVN{VNl߰ϱS"wQ7^Y3'ׯȑ#5}s ʊ[9M=q9A{^zzMlzk\fcfe Hg[ᱱص&;)cɊ֭[lv8e\ZpM/}e=}^}UcUZ_{Rþ��@�IDAT;lTƤpFŽ .Mߎ}1IZ=2[]v{o<]}2rG 8x[D"^fHfoQk T,B{Y9Fo$#它\nRze~:?{=HKUߞ � � � � �@� � VZ@�@�@�@�@�@�@�@�@�@�@�@�@�@�x X1?<MA{Gs.\&paW1 *Us1eu-4iR/|_& =z۸`?D+pwZ?3 \(HySN ۟ \8D.wŗµl◹hVnlڴ)pAZa?]e˖{h\M!C. '8餓.+Nnqe~.÷믿Guu<:.)Z̎ u۹D./g01uNB;%Ku?]96+̎pBhnj߽ \YF}Mk׮SN fϞ [N. gn~q Ux*΍Ta嘉[lv1.\vj &Op7P +ޖ?l<.+p!F~r_d}Vz衇7۸4W,Y??z͝wvi iy?.*qD !V+Q?} <=o7?i;Mr~A1?TtfomJ +W֬Y <c $ fΜgCcƌ㷭gS#oD6+c@>ʹe׿#<2gȼy9jvߤjnۻ<57MXv1qĄ>7v R֖=cS*c_l Mtlm[ۯ\s5 \/>W[1Q߲3^GmYԫW4i@dL>+"ΑDhQ;G*aCOkYnݵ+%uq?ITKbt O>/r$9'p*OL^)@�@�@�@�(?3w S� � N?J>(@�@�@�@�@�@�@�@�@�@�@�@�@� -[y˄ s… 2e`mj֬ {s~YHMq;eaӬY|pClvCXؖ}~'}9bYԭ[ׯgYcǎ,$׿ݦm۶~н{~}7,ބZN_?FNG}t`3̎'aA16z`A?_f,<^1MV8'jd|c~e:pwHOeeA+?St [[biNfpp,% =z+U'RcMfվʎ 'X@M*cco&Mױ9 SeJ/Zfyy:| Z01 CzŝvܹoZHT8%'+'y`2,'=+/2jmofO,(t>*,vTLꪠjժ>86p|0Z%Z[bEtY*cGfh!$;l]aU5 lY~۷#8b;'o=XmvZ<1Ke ZP}VT?>N5 KM7%XH=?rw2+SI-wt)6\Vݫ.1pkIshG-RBx%+p \g6"@�@�@�@�@ �ZqPR\TL � � � � � � � � � � � � � � � �E\`"㥗_^]4H*]:uwyG[l ~nj{|tq?;}z\ؐ_nmr~BB9BEȨ~r??|9[ԱcG-^XSNX]m1b\h\@\Ћ\0_n0{{SvmP.*~7֨Q}\٩4Xvٳ=D<\@ʕ+i?xxVtAg~z˖-.C˗5jfbS*$;?e<v9ٶp毼\\ItUkϞ=e{ݝl.p-[z hΜ9)Y:$mR9Nʶ^,ޔʹj=V^ǁE6`)o֭[ˮc-/1:~ߤIh;վ}{_?;nx䂶䂯+վh6l 7tnF5h`*UJ.dʏ_O=lllڔٱC9q~cp~Bɒaa} ^Tˬܹse>٘B٢Hfj+9f@'3F.N\sMxoR;z^o]ƅd֮a[]WT-));gɅ0&czf֏ml9cxcUtxʘdŧ2;v/e>.T͚5ӌ34d_OJJj%;#0m3Z]~2+5SeER9G2;GДy80[ɓ%iRÆ #~I^*)mؐ?PkDK.ƏH}J_}%"J( @�@�@�@�@  UC�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�rCe@Z|}\(LpBQe]v'K؂x+%KwaHw}烱>syka36.Q`dR6_w,bմiӝ1X{9ըQCCA䷳Uy͚5Ͼ@ܜB7 7v6mڤJ*T s+h¿ .3g\'1M>t-Gpl{cl1 m0|%3ᶱ|m2S)lؗě6d܈W֭[]9k6A]8Ƅwg^^= ׌J_�+—i!]& 6 ^KfvfXG[\2ا <~+zzu'q#6)Ě::tPnK":sbdTƎxά%;5(c2%YMܲcovnN1 %{ha\}ﳶUN]B񒕽ǎIVV*chck.d7o<L[T]S[a&ȅJ- H\Hf_~x;^9٘^$s$wƱR~˷H>+-K\T_?o" [KH�\~zH.Ե � � � � �w~ � � � � � � � � � � � � � � � @3 /<ztjժ ??UT)=c>S0C9`a1ŋ3.sf|ěo){mٲE\B}.o;tǺ|N:Xhĉ}l3g͛ea0y9YM|3Yʶm۔ԬYӿx ;OvLSsd)f ;ՌWeA ˖-g/ݛ:$_*c˶ ω}uYqzؔ߮?_6uoe]˾c˗iZ|Y^fSV/#G^Ǐߥ *x @- P ̎U^ϰN36%r{ s/w*d2zޥ[7_cZT}vYy2%]tEq;2kɎmǰ[v uָ݅˗رc뤓NR=|o3IYC3,,/6-U..&\\</8T 9RZ> ~H.["Y.OJtoݖV ~!r|?ȥ K Ք ,l= � � � � �Q ǚQ'@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� XөʅII*(%.s1~SjȐ!zw/ˏ'1)||V,'k O?TrKs7W]u[oU=\RcA]eZpW>}TzuZ꯿{ԯ__{5kVK.ZdItY^oTJ_==\|Z|ba?s1<d4:ڟrmray^zVSLwqB;ob'3/[{|~{i:69+c= }ճǙrܰk׺뿥kVӦMsxWl8UE'OWᱏW`VXpٔ(QBW\q6nܸKzrwi4Vr坂n2;VasR  I6Yj9qGeY-LM6cjӦMvGe\s,C={oA֭pn Cd6c>ʹUV-icIl N8n5='\ Ev|s΍f| Blcec}*u8&2Zۯ%?dI5}c Ą@+9];FrVؖ9S @Jr!rA?oOkoB@"AN=$͙SVk~ZE DuuI5jH\ <KS>iA � � � � �9$@VAR  � � � � � � � � � � � � � � � PPfΔ:JZB>]rR=mV[H[vN<DRjU|~dرc}Pc=Ke>,[/ W^y*TQFN]={TNuW^Vxi^:yw~G^pl 'Ñ,&Zj[ֶ-[nݺj޼_7/۷}uecbA'Gyc10pPch,6*駟0%uR9?YE2l[IޘoƇy:}Y~G,ta>9{G["o,,ĂޞsIy3xekOdZaVZ^H7x}ȑ#-3O>- ǖpnĉaiV._2R틃]ʡ=6vaZV H8pOp?S^ziƯ~[HZ*$x` xX_8z9yYyLffbŊ^{Mcƌai_~,Xmh`J2S+IeY0N5nX,Maeu39zB3ʱMԖ𺒬Ϧzn#v-)& 裏x&Q=d=znҤI0a! +e}.rǴFlV1He ؆^f!Ljg}ѣGGҷ|qqE*P:{'ѽr> V$rdv EN` Xi*gKeFG,X.V:+w푻/,hv?\rw"a� <p-,d"� � � � �kA1!� �Q` V-;h@�@�@�@�@�@�@�@�@�@�@�@�@�@ =KguY0U]LB:\r%Aǎ@[n 4ibZj׮ ?/_>pӲzo駟~]c.<"p!{x|PT)A 6,7]w]j\EаaSD@ԫWϗM,Xd^{3<#+&t s=?ؼy>71s3z'5x (Wlٲ=~zoi߹]E㷷vtMi3L }옆NV\pVc=6p!&h[X~6~NbE߻`裏6Vf͚,vr(\-8}~wX#Fv[?k"-; ~:Uo~*ѹz 2$ji5e}"+cL':3gvi~;.RJtlcz!uJ(\xᅁ /p-Z6lsaBk.ؾ}{<{c硝;}ɇuմi`ƌ~l I'Y&l<ff<\X.cyȑS^X_z%\8Jb>cߴeO. _Oj֬鯍O>lPf vև<LW\p_^l VWXdv/W\|Ł \ ]0uԸ�c~savƛ7.|'8|]muQ - \0oO1)g1tҤI >^M6_|ԩS/%WGf}+cfswٷ,G ]4gUKzl58g^$s$+oQ򓀻qAзo~_(p 8 x!?նheGXV~&AE@�@�@�@�HESOᘲ(Pwc; � @~ZOZ*M;X@�@�@�@�@�@�@�@�@�@�@�@�@�@ ?nA㭷J'/†YXoСCBi&,]JpTrarXY=*ȅP.;H~ ߊ\TjX]|rxߵpBկ__.#Һ|޼yjԨ\zӾ o'!vkjΜ9uw}*4Qڟrmիeta$ᢝ֧mܸQ.,G.\nS`}dʕ]9xe'X=W{n�;.]Zݺu:Y.TL.L/oVD&XBtW_~ Bx}Gٳ<W?}ץIJJ_ͩsoV_վi,-,ٲeʔ)#) ҵ.,*Ǝ<';&zϦrn/3bcWDM;]?]-^X.Ss΍{o%KjzZ}cꘔY]t7 m}pJ5;}MzuiĈpO]֛oss$g:Ƕ&;HENly_O/+M YgIg)roW-5W=TYHo yU+� � � � �佀=wɓV>jE]@�@@ U F�@�@�@�@�@�@�@�@�@�@�@�@�@P å۵Bz sy}N;4=s>&@YHrX"0x`ie 8q{n 4hPn2>,p& M�#Gꨣ. @ .eam۶Ր!Cvڡv4jԨBvZ)Rf3U$  uխY3R 䄀-֌DR.H4`R ײΉ=QF2y2mZ$\4ѺuR˖K]$w@�@�@�@�(\jexl� � � � � � � � � � � � � � � � ^.Aru]]vՁPK.KhӦM7⫯x:;L}TӼysUVM+WԂ b ;W6͜93wp ڼywkժŋWjE�\撟6nܨW^yk׮ŋk…otqi9^TƤ4KB9sv)% NyvOgrS+.ysoiܸH}voXVVRŊI-ZD^O=9ÇK_/]w]$µ7L� � � � � 7u%? � P~ZOZ0!� � � � � � � � � � � � � @~2Ej.1c}IO-;<=:=R4i:Z3o<5j(ǎ@�@�{オn:_\߾K/T锃@ڷڅi] {ر#,{-ohSO-K˔f7ޒF&NSµN:I.4x@�@�@�@�@ VW&OZʣJU@F�@�#@V9V@�@�@�@�@�@�@�@�@�@�@�@�@�$ҕWJ !([0$XR=e{"K+Ȓ -[Tti+V,knWTR؏~ӦM.0!@e|1)/O>\vfrF# KF?n岯նmuRy]½^{-R͚RǎRRӦ@�@�@�@��Z?ų)["� � � � � � � � � � � � � � � �7ߠ;u74g97�\L2yeo Њ}%7aZyϾ\e{Θchbi SR@�"RҘ1ڵҸqrԑh!U&u {Z&+%n+pҼyҥJFI.zҒ%z � � � � �U@zdi � � � � � � � � � � � � � � �9?:wzHzYBg F�@�(m[$4& �#ҥOzJZP??Njte>H/_ҬY3!H+4mt#HuH'$=aC@�@�@�@�@� �Z8QK@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ M9HcHcF�pD�@�@  L"խ+>$UC�( HGҚ5ȑRFҠARfR͚Ko-mX(aefё@^5 .[& � � � � @ PhgZ� � � � � � � � � � � � � � � �X`:uk/I" qsi � @@V@Ci" @PAjN6LZ<򷖞=s /VǥWU/)UJ:lץ+ "գ'R�@�@�@�@�@�j%+@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ,[&l)sGkL@�@�H,u4cZ@ ŊI͚Iw!gUW:޽%~1@ŊҥJ,-Y"v4}zo`E9/JA�@�@�@�@�_jAm@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�/M>8MY@�@�|+`aZ[oC�@ժRҫJWKtEgHUH+ *-]ZD5nZ=[j^zEaCysػxok(ʞ,Y"%BED-n{[(喺-*%.V".٩9|p93缾o~9gKoHwAT� � � � � .j ;"� � � � � � � � � � � � � � � �)X\jH*Y2-.LA�@�@ #X@EIef0@�(-t /,@W#}AT)zuǥsS2BTKҦMRժғOJv]u@ّ#-"� � � � ��ZgIM � � � � � � � � � � � � � � � @H,Z2i4P4K# � �DG,� @X]wIK{JSJMJ}D/RDMciHU3[MY3i0i.}]*ZTvo=C�@�@�@�@�8@hW{@�@�RC` iԨ:@�@�@�@�@�@�@�@�@�@�@�@�@�@ ,\(h!խ+'ʕE ԨQCk׮= ԩSVΒ%K<yhӦMʗ/_> � �$` =SKfXR_�[ޗٲ%`Svѣ=@ .5kIFߕ 믗ڴ*WL'UetֵdA[U$6G�@�@�@�@�/oR"̙Rɯ'3531#� � � � � � � � � � � � � � � �(`tEǏ'L+_ôs۶mu1=z4f;qiFV/"� @XсҕWJuT@W,ln^4Znj9JR�VbE3={>ʔ@Sr.}L˔*i/Vn5uK.Y@�@�@�@�@ | ׆!� � � � � � � � � � � � � � � �1I͛KMHcJwPΝDn<@�@�;W:\jmgfnr_L[  dI1BڵK=+f͒Z?_;\='\Yzyi@YSOI^(i#}i ,1)E�@�@�@�@�E  � � � � � � � � � � � � � � � @|K-[J\#}3g|G\fR*J\r݊@�@ ,PA)+񫔱f6'N=a7y} �:?+͛W^ 'Tԯx\vbj3d 10(KX1鮻$P@�@�@�@�@�CT@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�*|ԪU LO9z;P=V?K7t,T� �6l=o]KjɓRnq?3 @rJz&M&Nԑ,nzƎLn+ܹ% NKiV駥 Fegn#F� � � � ��Z > � � � � � � � � � � � � � � � 5RE?X.,)ٍ[tV?KX,2B�@�pضMڲE_?zE_2˪Wiх1#@,ukw͛+]ZZA*\87uBׯRbHfo[` H#f, � � � � @dD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�L&it5KI眓�nJ.+BYds ,f͚~v � �$0-Tn8dFUSw9rXd@ իKO<!g]B\;\YzaiLP,cU4pu4yTԧd[]HSJQQc@�@�@�@�w � � � � � � � � � � � � � � � v i.,}7o#`ѣf=}In]*{ɬ@�@�XH0 7-pRrsӏ9qBnn}>!�E*}g4cԺ4qԴt? <Er{٪Ҏҿ-Y}˖RɒcIWG; � � � � g'0=D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�2K^+SJ f2رO[K. � e!FA{E"RF= @z Xvv&+H?,ԯwtRѢRÆ /H+WW/#]&w]ҼyڵKGKUHuJ#c � � � � @8 ί}C�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�L%pt jM&b"pꫯV֬-+Rxqկ_?)p, � rcǤe-!o8@R,=#d![,@�(_^7p]iϤ_jԐJ/n T  m M0}!]rQNҔ)ҩS@�@�@�@�@�_"� � � � � � � � � � � � � � � �wJKH'K%KqcTa*-9ܪ=zpJ>- � FKJ'NHuQJ8<ys)[�?;w$ "L ~C; HsJ-[J ݻ#lp]/oL1BڹS4Hھ]:T)ǥkөs4� � � � �d2 0@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ~Z=Zsz O_+{'ܪY?}_ZG�@�D |t'pB $*EE*[VU+$ ]Җ-K/IGJw-/.կ/=|z̑~EviHbEaCi 9t� � � � ��ZiK � � � � � � � � � � � � � � � @sһJ͛'|<G @~_P h#->/C�@�X@[7<B/ m+xԣGp/ @ \tt=җ_J{H_|!U"f tiOiTرoZA 6m *+VL6i#� � � � �G { #A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�"OoxB3OS&>Ǐĉ})vIqV\9߱ڵkk̘1ʒ%lٲeSp˞=is!r3o9ٖ5k֔ @�@�X/qGE l}Q9ro6yuTTT;8ki*\kMp4flsi[[ʕKs[R@�pțWj>K ZH81/_ �޲[ QGRIm~ihiPqcBn] / @�@�@�@�@  .WS@�@�J` ijz@�@�@�@�@�@�@�@�@�@�@�@�@�@ R֭ԑZ>H.(RG?<(lÇc؏m~[n#U¶,µ6׭ĝ'O6ۗϭ?}{nf-�� �G`.X1i@�E9#Oڻwo-8/}{fpjqs[Ucs\;6@1 TPB:]Wawy>6Ed@ [&Mf̐ Bp-۪UKdE+Z#G})q1.Ϝ� � � � �Pߤ"E3ƍ3�pHj!.U#h#X��@�IDAT� �&@@�@�@�@�@�@�@�@�@�@�@�@�@�8\Rzr Ksʅ(@TT߯={"vk!ZSڕnc[>vXݷ,eç *۬3g͚U-[l17tPt3۸v{o߉'dqRm oAbCl=CȬZȖfoa(lP@�@ ,m[$?=Nͱwء۷޽[\mv7mX cMClpxp;*�|lIiԨ,=0y[pmgz͡mnl7se l>~fq<[hѢ1vD1[1Tg-( @jصi['ݖJ+\\OҐ!r>_;*V<A�@�@�@�@� P+ZɷL@�@ Qj%@�@�@�@�@�@�@�@�@�@�@�@�@�t;JfIKJem}[?0Ν;c.ov-tdۙMd-Zo`?L'O� Ѐ37 pY(Ab C,L .`AŋvkXH@�Cgѣkã?"y$yfmذov˖-~[nHKe\.ۭ3c;Mp #D6#_p*YJ/vL2*[,�$U :ZZPP̉+ƥ[Z}NjxѨaۦMҕWJԡ\P{` � � � �dD|;D�@�%@V8@�@�@�@�@�@�@�@�@�@�@�@�@�L%HӧKMd'y0&-o ۶m!ZǏ. S}[pa,,`Z7  ľ oE%b."nK.#t+2@ ,tb꣏"믿_fmS<I\\pp )d6 ZГ>QRWa =ʾO+7+WN_|*TUTw - ⃵,\k }\n]M@Vj񝝹iӤ!CaZ]µ.,s0z@�@�@�@�"Y@zj%ߎ3@�@�D (&B�@�@�@�@�@�@�@�@�@�@�@�@�@ ,Y"5h =䓙fqZn]̶amܸ/n 9r$B.e!vݷ@$[? Őqڷo_L@0`bolX+9r!UL/_ ڹA�@� \%IߟҚ8?N<5k~իegsV)F e*+Vz1Ҡ ݲ]w`(ݮ_>&ˆ+WK/T\"m�%pP µ&O k]} \>gθmZcXu:w6@�@�@�@�H P+ZɷL@�@ Qj%@�@�@�@�@�@�@�@�@�@�@�@�@�J5kH_-e͚)cǎ_~ ]eFb+W.&Ȃ[R'O"&Ǐז-[b,6 m>seZ+V%\ou>T� 1Ǭ aΕ6̘c Qr'+VҥKc6 ϲڜ”,XRJ1[}h/6ߵ?ZJ?_רQCjՊ,L�)` J&I>n|0TR۶Rr!}gc5Kz}/,[E+pm!@�@�@�@�|;D�@�%@V8@�@�@�@�@�@�@�@�@�@�@�@�@�L!pW\vT+'N-o OEւlQ,Y袋.C*T8hF`V{KdYD0\k>(BlNc�8 RUV= @ 5>LY:p@25j],Xo6gy^ve.gr_<,|־t_j/_e˖9};uWnݺW=EA�b lW֌ɓRp믗 }4M`>ii`CNwo[;A�@�@�@�@ JCV8@�H�Zb @�@�@�@�@�@�@�@�@�@�@�@�@�2RҸqRv?.`ҥ~[bl0- ʙ3,0r~c1,P6 ۟jׇV֬YE5d[Zt .8{E�@ <Wr=d!ټ}K-;wdy qY- :tk-\P-ZUF骫RӦMUpV S2E0AKi^uml20@26{v X/\ݥ^¼Q � � � � @ |^oǙ � @J!� � � � � � � � � � � � � lqU֭C#ol2}w~ŋkڵVUfMU^/n WTI9r䈼c@B,,hkK ˵aZRTvmbQ߭nayIP% �)p5RɒҰaٿHƍ]0ɗ>}UX1j԰aCfٳgؽ{͛7 r[dN:w͚5S-sΉEfµ&N$ԦdZ͛K'ƞ=rJ#x5D�@�@�@�@ W@q& � (A � � � � � � � � � � � � �dh[n ӑ 8p@Y4|YѣG"u?jՒm0?.`K. |>d˂-,A>dq*RH @�"D>}"aM ۱cjZz ,( .I&\r.e3f_Cf-Dޟm]RNvTp8@ ?ך0!pMB:u҅&Lph4w$ "?w), @�@�@�@� P+/ ZɷL@�@ Qj%@�@�@�@�@�@�@�@�@�@�@�@�@�Ȱ[\_}%l<v̙6Η-[,Yf͚+U~}YVRs� "[Iǂ,X쾅Y�FӦMu׺įv|̗A^� 6HIɅIm[v њF僴vC9-Q^=e˖- d{N:M2EVFt7cǎkeיa Z{H&\&.<pͮ]vYjl*-k6+^ � � � �D�ZJg"� � P+QL� � � � � � � � � � � � � @8p@Rqci͛5aYt թS-ʛ7oxu ?ŋko|ɓ'}@FVԮ];UR%0\@�$-H6oΓ'#,Ʋ}Hٜނo;u۫L2i05#F6o_h̘1:xZho݅UӨeE�Hpq \BmJ+\I)gHY]sS%[l\nݥ|RjB�@�@�@�@�Ԋ'g ԊO@�@�T P+@�@�@�@�@�@�@�@�@�@�@�@�@�W5JZZ*\8vZ};v/_RJuֺ|Vҿ�8zϟ)S0UV|>@FRv8 @�Qǥ ޅO5ɥ曚>}*TÆ:wҥKOG )iӦi?~ *;C{J(92xԒ%p-+-[.Z睗F[oI}$!7z8@�@�@�@�.@V͂g@�H#j@�@�@�@�@�@�@�@�@�@�@�@�@�s+Z=ӯ9FႽFiҥYn&kNUVM2X`ƍ.d>s͝;WʕkV.[l@�Z/uKY 6L}wQs4h$A`5-aYO<J*%E�$y_ZfINIW^jV̤qX>@zmɜZ_ӏ � � � ��Zɷ$P+v� �$J@D1q � � � � � � � � � � � � �NQ#Ii|)Koƌzw4n8ӣGuI˗}gh\`׮]>XkZx5k޽{}ʖ-[O �$GhQǤ#9ggsdoE @&ԩS/jΜ9>@#@6.I8p@2%嗒Skի'e͚Z#x ?^JժI}J]JrE � � � �$@V_Lx6X� � � � � � � � � � � � � � � �$F`@֠A ӲGZjUVʛ7fϞ5k' L+1/ qj…駟Tzuy睪P|M9r$BGF@�2ee&o\}ԩ-gϞڴi,<0yrV dq -[̙35k,;QJ=q#e@7Kv.w- 6C.^:t(ͺv[7]/.j֔G*YR華sgu!� � � � @& P+ @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�N2k\v[^.*9qnjժO>馛e 6L;P#@\m۶Gk惵{=<y2!�Dep8vz!5jH5jЯzJ,�^+Ԝ9s4j(1 @R&ҫ}ʅPK< 54pa];i@Ve'-Lkpifn2e4͈� � � � ��Z%O � � � � � � � � � � � � � � � !\}64[~Zhݻ[oƍn1`p: &x믿y5k,=>`Ν!C7oijӦ^y啐vw֭zw}/BHΌɓG{ڵkߤgտծ][-ʌ@ /6*fKXi}'~=%z)R$$=W_֭[3B-43_~Ewu.R5kꪫ|Hr8{7lnp .'5n! "@ T"=4c[RTT Txqe%rߥ#wIyѢR~ҦMқo\UN曤ı � � � � @:Ԃ� � � � � � � � � � � � � � � �Ȳ^z)(obi2rHUs+Zx<VΗ/_7@ & oz,~q1bV\SN%۴B ©۷O3fɓuСvmݚ7oo;^%`͞=YF͛7WÆ 5`�EJCD; �XLY3mck6w[/s(nD~-w gv?eZ`ƌら]2qJjσ[Ç}(Tʕ5vX8p@/̙"7k.][?^I*?~<l0=>, d_ٳ4qwgRr% rJ;tɕKߤU Gk FNgt � � � � >jkAO@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ \>=Wn1g[># EW"շo_իWDzs9n!jԨQU,YfaFE"=|Zj{lٲKk7ߨ_~qU-p_M~[:tЉ'²t @ X!ը-iӦW_OlN/hʚ5K]q> )-W=K|7%رCZ%\߷db7aWo߮[ uz¢Ot"S O%3-O?חJRח_JǎEkiF.]ZDrZT4htHbj@�@�@�@�@ +g"� � � � � � � � � � � � � � � �a+a\RigyFեKm,*U*giٳgORXO< ֔gU0!x#Kzmy6mN:ƍk޼yZ|,� @֭Wu՞}-ZT,6JU@j^<.9 … ]{ Ez Y,dɒ -?z)͞=;t dX�w_꫁9ʕҽJK¦  F˰ r.Q.|S.Qzatii�i;nF� � � � �+/} h@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H@~eHqGYf&Mz{lz=?룏>rM1ckܸq8q."=*V֯_G}T'OT,Yt-o;vLzR˖-uQ[Z`9O>*QYlu+@K/oO,?~÷L-[hȐ!.W^yE~={kg%1B#FP\^{5]wu۷? m۵k[ܸy{2eqرcu[o*kk[=>/׮]+^_|8ȑs:.qc>пoSg@rԶm[h"(qsM6ݻk}v}ݪSR1e˖Y@~Q@�(wRj1?~C-[q"o<÷ɓ?.YD_|۶r6WXfn /Vͯ YyH8bs{ a9}Nsgӝ;wUW]5g<[=gK<.9s3?C=3g'o޼}797? kߙJYxljݬKk^#oop$#@ T&Ҷm#jHj.)~Oi%Y/=r9r$qG�@�@�@�@�]!� � � � � � � � � � � � � � � �$G gON ?Z馛RvQ|րdPV~m84vX5o:tHÆ [vu-]a+U䃨-o>0W_}}"Y^zl,݋'OX}sC6lؠ-jΝ>jСgV]Owys+)WXџkd%1X@#O?{dˊY{_Vݺu}? ?,]fbv, efa ÇA `9x``ӦMOԊ_7xgԩZhQxo;oe!l0UVszY (W+Wv _?',� @V _,! dmӦVnڻwoǂ]ʙ͓,ւ,$Vmn_v[]-Xγ`}FzwԸqc]~> H"1q ( \P!?i7gS2K?vqݷ\Y1{lBc㛟|p&]‹۷o{?\6  V^(٥wik ZM3"1.wO7.1\<@�@�@�@�HRJ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ 3 Bt-ipa եKm([^zj*[c=͛'[L1ZhRf|WP' zGqv?pjժaÆ>V?~<>c�vΜ9s|P՟3gÑ>&MW^jР '|I|b~Xhm]VZhr?~Ypc$4+R#F8p@?֯_C/_[W_Cl_R5/{m$֑#G¤rȡ*UK. KK,U`Aֳg6v>#`[YXa%e֬Y-[6ft^UhQU^7]֭mKSbƓm۴bŊԮ@�ST͓<$?1|]{: .֪U+6 +-j~njLQQQ;w?V6dz駟[1c {KYno֭.]W>cN Z%K$4g<=N<.9s> 9cۂ![q6綀֭[p;@ͧ-,y?01~Q@�P(`KY_Kn%&)-I..8 w6] Z&Lʗ tMh@�@�@�@�2@_e12@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ M~EcB{Ҵ)ݻ7` s9s{s*U-?sL;vLss 7<x -]/_^='xnAb"KF7o^^ н{wd [S<xPcǎ VN:-×=×ukP% ڲe}Y=-P+X,*1c(Q?rʥ.?` 7R?b%NժUxxoe֭vȑe}Yf,.BgKBرA fpڵkD{X`X͚5˂ۂ }ljי)Xo(oOfi @ X)3;Pp.LpnaV6׳bsw+wÂ`kԨSP\ 2dz7n|,viٲ3fn,T,ly1Nb挧/1h:O'f~vژ-kٲeڷoyq|~,p�Z.;YVmo%wMK?^r4H:\U+p$ .Y{ \}@SOI*D? � � � �@3m"� � � � � � � � � � � � � � � �xy0#SoBɣ~! A ٲeV,إY￯^zl~[bٳ{y{lAZK,A[8X=V]xl_a!V)СCUX1V<VKUۮĎ!83֬Y\.gի}~X&9Z/+iH"zuUW)_|fc8 ]ĴGzrZPƍݢdG9`_;W Zu~w) �J=PSׯ_*s4X.E#**۷o߮.-M6i[[ ÂPrJj3Kbgؤk7%4?a F>}ܵv~g)SF+V&f^yǏ�@ZRr҆ ;wJݺI\ urmۖ=My&ֳ]K\F*Wzf@�@�@�@�2:0s"� � � � � � � � � � � � � � � �)ؼY9Rz ,P)l'"]v[oSN퐈gcݻ>{O&Lc*THuVmڴ鴱^xqѢEOGz<gdV-Z/x޵kWa:ԫWt�p1CLE>*~VgNŒP[6oYSLq̙3n͎;; sI}|I 6̇믿VǎO&kиb</Ojذʕ+&i@ ڦe=Pӧ~~R`A8ewZ/WΝ{8㚻~jڴ>sƤ:? 1Ӽy/ԟ&MPb ;vl둘yq*t7]4i=Bj\J #o}実Xغ4d?#rR:ҀradtŮV%9-X .x[ 9@�@�@�@�2@L9j� � � � � � � � � � � � � � � �kIŊI.G)dg]Kʠ;LU-h@~teg>m/Vܹc>y5駟չs +_|ϴlٲኊRݵْQ,T"EG>u7Οm xc?}јǩq'ƌôZwyC뢋.9rZB¬$Ԏ?(?^ܹS:uʕ+}{fҾ}|gF N 0Ra&Çkzדu>'!� qKj9;C?CF,nӎ;dUl.,uw6w'4h<ZQwbz衇4s̘SkΘy\R1N;ZSoaO>vL$ qz=c \^[%}g�U4hd ܥw)2-nu ksֲ͛iB"/E5 � � � ��ZH% � � � � � � � � � � � � � � �  :ʑ#t?w+[>(*t-'cRY?ڏM6{gw,cǎ~_^N{W_aFo=ꟳz~g=*dV$v{ꩧdOSLQ޽}[aW7V~du7jHe˖U:u'&;u %J) :tVZ۱oϷEcK_|͛w=Bݺ5KxKdٲe?2xknoj+tk„ >mҥǎ~AfgϞ> 0бӧ+v<|E @3}b_p饗`~ߙ~v%q9VKY՟Z'_q~|_i@�j.-{nKd!69bz3݃{w9*U*)-*Xl^^pᘹb칻}=ztMZb?-1s`&w9|}\>wm۶C~wy~w'oƌe}j$4/}Oiq.\_LHsΑZohp\d]+-i҅4eeիQVrS +ڕMS9 � � � �D@6Ep: � IfI?] � � � � � � � � � � � � � .Z@9RoCYʔ)/@?|'OPv!ζ 7n([~ٲe>Lɓ>dVZzg5m4_0]=ŋqKi`1B~֮]'|҇٭9B'NaY| ʬQF, V+^p{XK/BfݪV篿icy|@TT<yʗ/]�0i$w}>M*o޼ިI&n!|kaSÆ ScSyΜ9e}½}jƶ,ډriɒ%g֕W^m-nS˖-uebfkڵkRJqSjUfUǹsz#~Qׂ,_ {85zGBĖ/_Sp:1cǎֽ{Tǹ �$YwaZn*͇l> /yˆ\3|jڼ .͇llۡC<O>~nos^g͚5czkUX1fݱ/mۜ%Ksze ԩSs΃?y\r6NwKFGGy8>U~}мeZ1ZO_B|~"lai߹vTΒ`o,0־KU\9=A @}4|ua9Pr`w]Ȕ 0kVDrҿ%wN:;wJj\@�@�@�@�Sa$o$(IPtP@�@�$ cri$ � � � � � � � � � � � � � 'Nȅ"H/~ܺuhZfNjѣGJn{Q…Z)zիuA$eaS-e�xeARI)dAa jJpb}}쒒1ؒ!֭󯷵c u(P 3tfײe[-;@͎I;&9ѣʕ+ș3YSg{Ǚp H% l4=z[ڭfMA�@ Ӣ\iN/ݺuÇTaxeS s^w^>-1gL<.%sl9ؾu[}O` 6 ~IZмl?Μ9SǏal_�$WeKjܸ2uY3}{];h֜>繏(lv]yDzܵ"� � � � wCE N2k@�@ L n � � � � � � � � � � � � � F´*Y2+NFU|{Leʔ3<믿>5qJl{-TV*XԌ39"O޽[]w]>C~ "5J/Nl>\.FA�@ `9Opm wuˍX~<8T e֭[w=eV_pݷO6MbcǎU ;@� #2,5i>@N别^=[_9CuzUi@)_?;l"g @�@�@�@�ԊK&j%l � @J'#� � � � � � � � � � � � � Hi}Yt[W^k˫o߾>4)W\ҥKnݺx{;wni&cBc4a„]ʖ-q~@$F4ĉohΜ9nA;ODm!� pڵRŊ嗟`C?nݺ)k֬$ nPS$ W>,<jժ.$-ZӧcǎT 78;'6nb?S?)& QN  YؖPZ"c.#^>]u5KR۶wz� � � � @\j%~6@�@ Ej@�@�@�@�@�@�@�@�@�@�@�@�@�; uٳE0c��@�IDATF®{ڿ}]:~_^zu!@ X#4tPo+i)@�Y`X馛?I΄in4p@u멧ҍ7ި,YiV8XooV]*I"Et z֭[/kSYfC@�RG*6?^ڼY*U*e[W]%:mU-mLTrs"BXʚz@�@�@�@�^@|;D�@�%@V8@�@�@�@�@�@�@�@�@�@�@�@�@�Ni"iŊiw>}Ժ[ԡC8;wԘ1c'j׮;Ν;+g@  ,,}><lٲխ[7DFYrh=zTs0˗/#GT*Uԯ_?k.Ì �i%d4nd[?$Ԧt Rrir]@zA冷]D҅^j@�@�@�@�@ j%_@q& � (A � � � � � � � � � � � � �DRK}DD}'7mڤѣGmʕQ_u֪Sd9 VZɓ'kĉ7oJ.N:K.VJ �zԡC҄ aٽԎ;|eaIݻwwsòt T8P|2dΝ&M`ea T�N_ZeaUrI-ZHB;/<IGyDڵKz1顇;,< � � � @z |yoǙ � @J!� � � � � � � � � � � � � /RBի5vwpvTiIPB ãIGϊ a(y 4 Z(RB -j ?gS6alv~9sgΜٻ3w.B .-ܒWw޹.i+|^x!^{m\qyDzf}7߼ @60s{{ =o>;zjFÇCVZi &N/9s?!{b?Ofذa];K�3%ܴz0\Ll]}Mu_\M?LcO<19j @� @�hM@Vk*m['PmN"@�̵@# @� @� @� @� @� @�h:-HX#9묦k\5g_+_Zk>nmf*sU7c{ϝwޙEY$;Cvu*dϬv{ @�4)WJ><p7<ȑ#sg}=V[mۯ,&]E7̟/\=<0.hWv @K J?%_2dM[µ8 Y{V W3Hv1S7O� @� @fikZm% @`j @� @� @� @� @� @� @@ uWFɵצ is&Onߵr 7jToQ&d㩀� L0!wU27|s]n<Yp[!w;VEoY`% Ѕx%w7qS=| ޼ sE婧rw}nu{&>=iFC\s5)%*h 86:WNuO*0r@9;m_W&g*_4\rqb55'@� @� <\Ԛ{;{ @�$ PML6"@� @� @� @� @� @� @�M/p嗧 Izjs'M;#7xcѣGo߾YwuŌ\;*oV~SK ?~|_mVuxV +Z& .8U`Nk"t5WL#F.˟:,qYJ\''\,u]{ee H�.#PevRvlUYy`r?w%{w^wJ~5Yt[3;EL� @� @`fZ3u@Jَ� 0n @� @� @� @� @� @� @br-֡MyAo4?_ʪ 7ܰ.lA[oׯ_4jt{,{oЬ2J8qbXb:nM7&l6,Cmkhw}/S{*lE`رꫧr_R:˽ǻRJ[*s'0a„2P%RZh:0vwN)޷wg&]E�+pm-Z%`k iTCS$>3R4&?YKWQ  @� @�L/ Pkz9y%PkNlK� Zsf @� @� @� @� @� @� dgzh7Y:9OT(#G<Ù4iRUBYgZYs5kde;<x2jԨ:(ew}uaz|W RmFiQ3 @�"pa3$W^Sz\|J2Vʔ)SnTҿj4@ ?;3UI+rK\\rlVvm6d7C#E�s$PJV)%h^{%{"sT]l׿&dwqDvZ% @� @�Z@\Eٓ� &Zmb @� @� @� @� @� @�hjweMӸ2<{キ.e.T&LPseõV[.VXAPӜM )U#<#SKLIHͫJJpܺ뮛[.%Pn[nlEr=Yy>nܸ:�oN)~{~麁 ʰaòe 6k\y:%*Pys=u뮻[oU_ZtMeE^z�"0ztKE%U^g;!mpNZUJw|{̓NKuqw$ @� @�3 ԚQjʖ @�5Wlv"@� @� @� @� @� @� @�M#'Mr!MӬ.ِI&GöJC=Tlp{,'NU_i+Ee>dȐ <xjYtEF7@ xꩧOet5?^r]ׯzUVꫯ^í;ZD�#-!<mҒ}:X;H L*J徽ܧ'jT’JYc5{ ;vWof|6jԨPFyn`Va%e7CdU Nc&cK5$S$;-߯ӡf[?|i=W}g7  @� @�Zs*PkI�h@61و� @� @� @� @� @� @�4&|R]lmfoX *!F%p2o,?SJgZj:hРA)+N]8p`JYIv~pK03<SrM\B+k*Yi*SKDy-4eN�.P:CjKB V0u>ZBYSw}SK ?~|ݑEY]mЭrԸw*AK45S L0-9<{5JqWROi*U:SzW?ouzG4�^`ܸZµ"V[kۅɓ%Pu6Y{L @� @�Q@֌"m-PV$@�̕@b @� @� @� @� @� @�hvJ[.9FiRlj$1c'H A*z$5^y|^x: i)\..teRX`&N_~9/R^xᅺ<4W_%aVPe]~  @`>aTl~{}j|r^GUU™yz^Ӣ.Zo5f'k5Ӝ sQ=p#<JsR<OmԷoRJꫯ5X.<؃�Z(aZW^u饩IwV8ߦ6%v[?ydRe @� @�t@g5v$@�I@VlD� @� @� @� @� @� @�RiBvo)Q uV#XgM)u)0`~{ˋ2#\̗\rɺ,S˺_<ee] Xpg0aBx㍼ku)!Weyy A7nL/UiCJPZ L+ %<Иsf"@�:GLT;pKѣ�(eir-v{2/ܛ/RӕrB M[M]4iR}\\ʽpPrO-\\5 cU:_²_ճGe㍟h6dȐa~D�:R(]uũK\{H64ի}[Tz{ləg&+ܾP @� @�jҶud+ @\ Ԛk:; @� @� @� @� @� @� @�N8_OȔjNoTo R?,A {j?y vW/ZӖ^ _J j,/)_~3ˠ{g\W^OoRucyeae[oǷZJxV 5+R&N8#׽KhB $k8o-2uBc^JBD�4xcrV-8rLbmKPT#4"Y2eL l Z,w7g\˽skq_xw{r<xCu)ͳZ.o͖򺵩<#{JX#H1/a%dz;첖"njp.J}4Uc~-[n[ۯm#G&*3/V @� @�jҶud+ @\ Ԛk:; @� @� @� @� @� @� @�Njd53h@ A|@~)e]c ʺYXK@eJ*t:x�L[�e^Br j-ث ?mش%`r *ˋ-XrИ, %g�+%춄6oKmYYM^o[7P~{~֩3n{ƺr]A^ *%l%VKVmvkͭ @%\ {Mo$;{yoKs/}))cvX򓟤 {z@� @� @5Zm@9ي� 0Ύ @� @� @� @� @� @� @S{,YuOJJ�@W(apsLWk @�M`?}Iw;=?a#o~SVOf�]].Jr&Ɂ&*rzx-Z%֛M� @� @5Zm]mf+ @� @� @� @� @� @� @� @@d饓o>}$'w  5&LH<Yc~&6,)!%d=L2;} @�&PB>:喖o|#yd%{qG2'>w؋� @� @�# Pk� @� @� @� @� @� @� @�\2x߾]#czW#Lc @@rO"PINfhM7գ/�'@@2$=y{KƎMp%YVZ)3I>Óߞ:lM� @� @5\J� @� @� @� @� @� @� @�ta^Jn!g. M%Pk��dQZ POF@4  @BK�5$c$5`@w'BۺԷo\pAK(v%O?ݶ}mE� @� @5lL� @� @� @� @� @� @� @�tQ?)+}.&P #P˅@�t&%`:-Z@�r%Xrر_R>dh z^x`r-/'mN{x� @� @�) Pk~ꪛ� @� @� @� @� @� @� @�\l}]M],2i  @@ F `x�[`8K:+YzK_J J.9'fݏNn9pÖYo @� @�毀@v @� @� @� @� @� @� @� @ L\qE>]K`>}ɓgX% @ju0ZgWh KZµ. 2$9d啓-LGfnK&^~xr!ɷ=6 @� @� 0jcG @� @� @� @� @� @� @� @�'wjhEw5@V`"@�:T@Vr;vhkrKrɞ{\~yT ! /rYر-aY뮛pB2th2|xr9%%M&N @� @�濱# @� @� @� @� @� @� @� @�M*pq^{%?Q2rd2eJr%$Ҥ,m(Z&qc @�O$k1*W%]`ZGF5߱� DvZ2fL?E':$뭗|-|3'眓p@y*'@� @� @`Z`X$@� @� @� @� @� @� @� @�z &SrQɰaK']Rr=Bo@>ݯ_zD�tn ]sͮf-%@`fM755 UMv%ϓNo~q W%d]qj� @� @@յΗ @� @� @� @� @� @� @� @�(0`@һ}aĖJˠe+LY'?NK^* PmZ� @,JVV[e_`}�f(ߟm]rM7%~ޗWrN;%/8s @� @� оv& @� @� @� @� @� @� @� @@(Z&M@XB MW] ܸG�tO "t* Xy&@@+b7)ߞ|C7'{#JKLzG� @� @3juc @� @� @� @� @� @� @� @�*Pi79㌤OwK\% D�,Djut%@`~ ֚'@�><9[´>dܸd}WL8"|֙ȱ  @� @�@y^� @� @� @� @� @� @� @�h;jFfuiCe6!d49 @@xde%#Zܒ,\ɖ[&_#9t�&',|ҫWrUv%%lrµ% @� @�N I� @� @� @� @� @� @� @�4M K<9ڪTjM<{ٞ� ~?Zէ&[`͒K/MFgJ @`nV^9ᆖL#90vHV\1kt?#@� @� P5@� @� @� @� @� @� @� @�XEMXꕜuVҧO[Kʵ+Pϒ @�+PC{,:Qh]`M[ַֺ�t%{]w%sLr'lKN;%+|SW''vj+ @� @�չN� @� @� @� @� @� @� @�t2܀Ո YCxҤZ$@�O&o=S``=H2 }6ؠ%<k}-Zk;92yOn%epO|"*Z* @� @�% Pk~ɪ� @� @� @� @� @� @� @�L̾}aÒ#~W@>]K�tGiСݥGA 4Jr%{)Xkn-G�#w%O~2}X#גoOz沼n>\qE2ayE� @� @@"PU@� @� @� @� @� @� @� @�hWz%]RˆL@jdZ] j;?,hK`@ ^m\zi2b`2Ut{ߛ|[\w]m)_JrI =䮻=hWL[Z @� @�=M@VO;K� @� @� @� @� @� @� @�L' *DtxAK yҤ.t&@�@ Zmn] @6TV�:Mc}I>8y7cU/9ǒ?WK֡5{G @� @�toZ @� @� @� @� @� @� @� j y;m]DOd.X$@�@ (&J@֬d'@�$ЫWrɲ&{_W^nj 7QZ¹wPr%[ou% m%@� @� 0P  @� @� @� @� @� @� @� @@0 y |ߵkuh:E&M @CJ*t!�.* X8&@�-{nrmqM]!C/|!d[J}4okrHrm҆ @� @�@.r '@� @� @� @� @� @� @� @�)S[oe„ )*x=J 8qb4RU)pRFF+ͦ̓>QzO>u۷i/ ,@ʼQZhnyrtK @ɓT5�F%P렃Qt�.ֺ֖0=L"9d=�̓&?A_a[m5w |s-駓?!9EM79d]c؋� @� @@3 j泣m @� @� @� @� @� @� @� @ J+2]yWk_\ֽuy7ǏK *e^³:vڭ:7sʤv9t *[%\kjTR /EYh-2_<K,R^.iI&rj[ @n3fL*j&@ V >⋓K3Wl *!]%\ k ժ..\_y;  @� @�4@f9A� @� @� @� @� @� @� @�:P`„ y /LWʺ_~9/Lq!Z%kVS 6D%D[nr *M<WZ,RTA8UZ+SL˽Nz \+aL87^y�(in`cAc3MOŶl-Yz饳RKM7]vٔ2\-^/P2תKD�p/: t3Zzi%뮛|[w~.ZGR|Z{;dNv9ww\5 @� @�hZ-x @� @� @� @� @� @� @� @`> gy&cƌ˳>sե\毼L(UF@S b:thTBJxS qjRGWA[lм-.\Z}9kF6QFՁhe} H+!`N? i>p,Yay9)PrӪ8 @{含v@`nxRu�X`/})uiΖc|-eK#үõdFnF @� @�*+ʫr @� @� @� @� @� @� @� 0%T'O<zjOUv*I%Fu)%<U/[n\037Ӕ)S^x*Rj^WB^}袋Z+b 4SYiRkdܚE<h%Pᭂ\{b�% Xk~ɪ�[3IN?=璫jڧoȐ#[J/Z瞛r%|pI> @� @�fՌgE @� @� @� @� @� @� @� @G yGZFRJV 9*He]% 00*!Fnav} u/_K ,Уuvf^zeСCgޠ5oF}͕Fyg v!n%1Fb-j+gUVɪZzlhuܼjMqs$ @@C _ 0_kV @@; ઓNJv1Tc峩܃uTKyZʩBr-ZmW0E� @� @ju"C @� @� @� @� @� @� @� @@x饗CeԨQF;vT%\"*D[lEL )*AE%o_L, U[o'CJ[#�/<)\e*Ap]mղg5֨KY.eEݡ7eɓrg @�A@<ٕ�6 j3  @v!{_@iY}|Tȹ綄k;\kmkMf� @� @� @� @� @� @� @� @� @�@ {seէJYy3t >*!C%@^iJwXp\˳u裏*QK\)W]uUzL2%zkeu֩믿~?o@cIڰM @�,P6۬+Uf! Xk0V @@ |'\O5gՓci)<uyObS$luk;L� @� @r @� @� @� @� @� @� @� @�xrwfȑs=eܸqumfʚkYfo.h]O`)e-Ǐ?\eĈ9묳K/ۗ}KlPaÆկKLق� G �hkU)&{y49d=f @>%H;@i{W"_zKs[N9%<Z[n)\kZ7 @� @�' P� @� @� @� @� @� @� @�[o5rKnqy衇2eʔ,p CP[oYfeho5@,BKqzgrN-%h׿uJ]߾}럱hn7OY5bһ@U!@�ĉIu;VGR?ZlKS}w`֕%@�җKn))!U4N{Z;/я!CJ>8wjm!@� @�? @� @� @� @� @� @� @�#u{n:D<yrV]ul92lذlF4hocY`VH)ԍ#<;3#Gf̘1ׯ_l[d뭷6lW^y=ujMS{ @@g <TKgD�ՙ'  @vd'?i@iO'|[w~JK{ߛlɴ{Y&@� @� T @� @� @� @� @� @� @� ЅJH]wݕ:_}nᆼ Yn[CC6F\veP4@իWZ<pj瞪n֌1"?6Z\kiOݧ,fS @@sҎVjhk @>#W^IX[ho;k}gMz\- @� @�̩@?2;ٞ� @?io&cǶ}[ @� @� @� @� @� @� @xgr+ȵ^~ve뭷k1vIr=oCJPޘ1c2dȐc=뮻f%/oJ>:Tac*m!@�g'{=A1,W9˒-H=6ճb @@r O~|Ӯ9mIO??yɤjʜf{ @� @@xd?M5́?3M  @� @� @� @� @� @� @� @ u]�fM6ɠAr1d<y衇_:z0{@铍6(~x9眔�x _2nܸ|r-W R}~j%3 @�:T`T\´:#M7M.%|z<̞{&[n*|}1hRK%\xawi 7,9餤-Aɚk&'ה( @� @�.#Pgo& @� @� @� @� @� @� @� =:Dgj4aÆ+{qug~<xp+jO~2˻viYuU^7 'z[Ub<[uIg @z��@�IDAT�. PgȐ.PM$@ ��t'Kkzr^mM~Tߩ&s$n*{MJ֘1*%@� @� = @� @� @� @� @� @� @�4W_}5?ϲg 7ܐ/~uPM7ݔ~hz /}aZwrfԨQ9蠃rgWC뮻sɄ YjdZ]4�rG'+嚭`Z=::P`ݓN<hOd]_%@KVK9&4(yS^8 @� @@7 @� @� @� @� @� @� @�?p8jA9餓rdt5_O}SYa~'�vX}sGgȑ3||sõ;<s~̎jMQGs @@OA�' X3-&@@WX~dkJWrرy%,|I{&m2nܜkk @� @�% Pgo%@� @� @� @� @� @� @� @@x衇r衇f#< /0FW <W뮻nN8<9sWdUWQG%I&O^j&@�&PgZ{:t Z]<i%['7[>m^ho :㌤oOL?9n{ @� @�toZ @� @� @� @� @� @� @�k/Yo2~qK.W^)SdvʻNiØ1criUUXtJ#񪫮ʑGW_=ugN=\~_fʉ'ءM)N/ccԃ/|pn\ve1bD}G?ĉ KjdI澹_}3X if lo@f;/ӼW/xl XVneKz@R)#',K>KgM~<;|ɀޗ\|q[=Eo  @� @�Zպ @� @� @� @� @� @� @� 7pCuuk=ܬMHw}wjP̎suЅ^X d_dEbWr㐴zsJz;6/N%[=s_;7m)5gyfN9l5jT y=?g >ٍٟ35  @`SO,4uf#Q{3|tA[g"o& X5L~u#k  0$<ČK-|#ɕW&O?xb2fLr-Z\~y2qb1S @� @�jM @� @� @� @� @� @� @�4~'>b-}s}w7||_l*iLq>^;eyNS ZkOzNnn?\7ֈ*[㫯:w uO뮔Qʕe&GМx^=lFMm: "@�M$ PNt x+ ,@?.a̍ 0'޲C^wO%dL?sdO~29j @� @tysl� @� @� @� @� @� @� @�YSNQG . s-ssfYRK-%Xb7;aP9 &׾V ymLҮ0Acޮ>v :.-XN=z }7W\q<7w.Z&(μg]ۼG�z@ /)h@91o^mߪԻ{dumN`l/o @`>yEѣgI}c>GS-(dA#Hn1=H  @� @�=F=( @� @� @� @� @� @� @�z?|K_gګi|\ve~W0n-Rxs<|#Ї>Tn58d5:d50K.dN?'?I5M)p __Y8t5ǟ<yrlv_R}l򗿜rL7VWvN{:x;Sj˭:J.䒜9餓rgsޯuǻ_0 ><?|zx^tEW1ԧ>޻~ | 'G3x|߮_K_ )s9yg~pyllNǚ]Jn $藕W^zFYgĉuӯG?ʏs=m1it_j}'[=hvk/R_|0oy}.9zᇳ;fرOfm{.'|r},9C>7.rHFY_g֘ɿ~N)(7Mz83pGy&g]ǰara՟AovnmɑGPxgay3~Ζfu֕U9 0%P<p ?@zg]vej龻l8{SfZޚw\|-H=6UY7oNױǹ#jR}' cv}tKsM}|!C7Q avx� @� @ n @� @� @� @� @� @� @�YsLi;^eJS *-SLbJU *S%@_wQnj1O *!Ce<TB~6~/AE_~y5@uQ [ozYgur饗f饗oi0_ E= UemZ}n5e k*(%+jGTq.:pgmЦ%EKӆHmݶr:KoZkX4}+?%_bZh:ԫ@5rwëZo~di-fקҦ2V2{+ӸՕYJ]9g%�FѬy;ztYgӟt}r=�2Cഭ*+R}m3t|vig6m3{W#@|n6:N;՟[sgw<7`k\eWôAva S~>f--祼o"@�Gj >u@ $]gJ}W?g2徻=^kv7h6n۞FVgZ2rS[cϏ]j0M&P}M^jF5qsF陸#CI}wk'f4q4� @� @`j1 @� @� @� @� @� @� @� @ʀ^{m@Ǟ?eH]w:(,V7tS~;Nt39-yW?߻k V+U%7MJͻ:_~TpJpV9f .*ӝwY|R>zTֵu*v*O6֟|ٲ$]M/R:p uXN kw; /p:,jy *n ,@4iҤAQ%lJOy^}m4sPRJPc�PnzXjAAG?;w]~zT#FeL]1wqi\[曹ꐬ~\kfrT7plKZ97eݑGY/򓟬ՊgJXUOŧf&s:mN=Ԝs9ks׸6tgu=|'>Q|&i(A}%Loر;|>gFf> @�v.*i27q:n6sҗidIv<^ -˳+%<:V;k:رו [[ݯ_ѣsgT='V搔ЭM6I6<DG1 @� @�@Y  @� @� @� @� @� @� @� @@{<su5/|{T7Xp;F *S ZtEFU#0,roF)K?xV^yWʧ>z2瞛VX.WVluF!TrKju(Wc2?묳I.VC͸q㦮kF *IvZx>;8ŭg0Tg}вo*=1(%ث1w__zRY.ӓO>Yrw 4+|FrW\g[B:�6|@{F[J\{u+ԡlz?~LlWB.袔а9.dKXUٷy5T~OqF7Fs8?3|65r_})Lm9KHV +a%LO8*!%/?ggwͶej @�y(ZҝzLן套zh[ .ϋ-Xܖx?ьV徾ٟZmx7YֺTɞ{ N=6U0xv;y~lset H~k[Y;JkM9%l֒{ޓ̽6 @� @�jb @� @� @� @� @� @� @�4!C#GfNB34O>3iy|&'?ګ~o�iCe}f"\sM|FwuW_ u]?<@J֭etNJ`X Nznj6]k ,P6Zlꀧ=/)/g~ؗ :]kv}(^ O?y[Sl4k_U:{{ߛ뮻.~zw)DehK/dמئkL_/~^j Zi#>37?7i@i;9u_NqVc ܳ]?CgX V+soRJ@Y4k-?/{ @@JV k" &}Zz饧[-#Fh~M/Sk:.z*T5;4O:*9d]| od{~ @� @�@صڬ @� @� @� @� @� @� @� JxˡN:)&Lֽ?CRK`zu5eOaпF8pG;s)2u}YXdE+PӽQxGg\5_^A'O5X#ov}naǺ cX:VBZM彎k[5>4n[u^זr61q:sΩ媫A4ݞ�>8W\qEV~^KpXkSc҇2Agx<3n=\sZf_|٪iP~n4O[STJW>N8O>A{'xb\pAj26YO�z@ukg{o_|L]7n\U ~XJL!*-*T8r˛}V:{'Ϗ 9sh{'g3S}O IIv.(wb @� @�hM@Vk* @� @� @� @� @� @� @� @@ u�g?٦k[{6va@[Vը 6~׿zYxᅧ_Vӧ8}YQm]إKҤ4AP"T4vjDc"I,$$F4* ED {/KYκ r|>Ǚ;w9ߙ;sϣJ*ٳݶ./ԃ>Lw}%ۂmlYf{&M3fJ^Xxu];r䈛'&&&g:6~;rIHc!#JժUS\\;?<H~_|'i,,qھ}s2gݻv{´.r~͙AauQ%;hɒ%qFU-.zA>A@-QFnUzgW9q-$s֧O$x@ޔ5?/鵍@�((w{Qޣ@` DZÇnI< ;u?/eyoϞ=ڴiSŞK ؃2Ϗum@� >@w&3K߾paä>e  � � � @ @�@�@�@�@�@�@�@�@�@�@�@�@�@�@ e˖G}$ 馛’2{nvAw<?ȂlJ:O?u~@{~&޽jԨ-8c=Z=kʕz衇 Mv< BZ-]Խ7|p,YRvuwd?ڵs?^ƌ:eݢ-V  *wZvlJGճ>+ lI&iĈ zcz#czS*U\رc]:v#}m綼yf%3^6un!h˖-4ydoϔڵ~z7l_|b_mڴqQeʔq4޷o[?qD9~7Ȃ}ǦiӦۅ99r;tZjUVn`ePv=Ϗ>?P˜ܰ<˗/Ouۀ9i]쵅]|*UhK195@�$c (T(FիWw6|?AW^y QF?sw}ݧ:br'; b_`ulz<?5@�2'D"/UGZ su5 � � � @ DzpdUO � �IsH< � � � � � � � � � � � � @v,_z˅/_>68dZȓbnI/^\wu,ǂ,HyI/RU~pyE.lիeRhcs e!^]r%n) ƹԩS'}.dkԩ_]M4Iq̴^.\ؽm!Ohuiy睚?Znl &h͚5.`˂򗿨\r.\sխ[7 eL/PM%Q/?s ]6l( c6XN:\zyt6lI㍴i,84=W ~1e!ed܎k粥787vh\em4bŊ::߳c7NQ|l٢gy&)Lcm@w l;wݻBڵkoV~?o߾~V,<lƌ.Hr>yay֬Y},f+V f <~&w ۲jd̙.ή9zf=11K=z8yx统W^yEMe!�W_}{mIs>?3\׬]y]R#X@�@�T<?I11nJBRwi9^,o4SD cA[6nJ罬޿ZO?_ڂY%H0囀N{kK^д'Rժ/SFckϏrz8(7yߩIB=4|pɒw'y' ?=0E�@�@�@�_QyN޿j2ψ@!%fdCA�@�ȚK/IFI;wfmB�@�@�@�@�@�@�@�@�@�@�@�@�8[~ߺp o/ Bbcc]pSjJHHЊ+t!e!]Yl؁uֹXٺNrmmY]cW۶mQoҥK˂R,|c= K><yRV,$&;.ZhfwVDD WT_Қwĉڼyjժ}q2;Bb\HYٙSjәmm Ç]Y0YM6}XИzyDpC/M 8PH7yc'g> )#ln6G�@P`y&M0j{9WnFyPŁP-i#=PIFcpT}Nƍ_ S,=4q奦M[H?秆Sw  � � �䁀w?}=[1F P+N&]A�@� P+8 B�@�@�@�@�@�@�@�@�@�@�@�@�Xp.cs J^XU |ڱcYY?7y5y4a!QfJsPx 5'Ǐ?g}VcǎU׮]sBBe` ѣ>Cݴ@�BS'W^֯j%pfֹc=9%LZ9'A�E@_,q)1Q;75ioԡtR~R\\06!� � � @0 ]@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�hݺ,XSjԨQzg4x` >\]tQ6.^ti1"l2m ltZ={T :/ZhCmeAkVM7b̙3Y֜9sd76EFZZi/ �RJfZ�}2ek!i#=�`l1mB�@ | :v ѣO> kwt]Wµz ~@�@�@�@  A[@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�$`!AV͛m۶U&M4d]wu\r-;EGG_~9tM Ћ]}7|nx9RNTҢE Y)SAkfիGov>?[]p*hȑ#] YCq=#A*� @ l&+MȈ@b.t09haسR^k-ZH]tѡCB.{c.R5 EHeaZޟ#]}4hteR<I � � � |gv#� � � � � � � � � � � � � � �%СCY>n8?uQ\s7aoըQX{z\c#M2!?>Zdڷo#F*]t0{MjE'nW`9{ލ7׮/@�T`v_yJHQ+Tw yt<>3e^i(GMGsZ҇~]5k3*lC#cvm%$ Ҳk*H]']ĭUhgZ� � � �!P(ћ)@�O^ #;ó @�@�@�@�@�@�@�@�@�@�@�@�voV Yj7o <CݺuSv]} CG՜9s駟jʔ)ZnlkVSڵsHQR>ɓ>낣M@�W^=G >ҳ)1s/FN`-{VPK>l036@ d:u Ѿbv'X^0!rTN Xk ~d� � � �NB-{lclu8"[{3 � � � � � � � � � � � � � � �A.ЬY3OJo$e˖;w.R骫?%KA�8q>sХK3oYW}ݧ 6h…z.L˜"~Y$!!3jl� �dM`vR^ �hR^HhTxm[3^ǹի|M zε@�@gڵ+VH_-oNرRmB�@�@�@�Ȍ@Tf6f[@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�BYqƲ2b۷O}i̘1o2eWڷovکu*^x(w#P٣Jח_~ez;w߯N:hѢ%22M 馓 �䫀w˥C(P~ȑ`6mGw:ŀtAz;땱' �HE 3HgKKF^ZҠA5HJ � � � �dA@,  � � � � � � � � � � � � � � @ ƪ_~Xo6mڤ9s?ׄ #(""pjJ-Q\x*RHB\ȑ#Zd{#[YhV^(5o\_|NuQe˖ fGʚ{!� @v l[BaK@�ȍ`Ç{ЏR:th4Z@�(�hYyeiʔ@UoR<X p�B@�@�@�@�L I06G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Oի{vzo>͟?_ .teڽ{ jԨ6mf͚y&M l`Ox^ *l٢NK.շ~uKVZnaÆM6nXbօ|i/ � P*@'"@ t<Bnf,YR^{m!� ~;HIW]%Iµڷ.@�@�@�@ {s� � � � � � � � � � � � � � � ѣ+~sׯ_%K$~Z۶msoWXQ\pARЭB @ DYpʕ+|rIe4MjR5h 7oѢ*WF@1&@�@ W@s0T�  z'\_>H]v@ @�R(SF@ٸQ0A?^3ƾw4hެC�@�@�@� �Z\S@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�l Ԯ][Vڤvz#Zl/\Pu!sYznݺԩSGKN ]n:]֕UVիuPlY5nX͚5Ӑ!Cܲg&sWIDD`{2 � y *ZT*Q" @Tw<xP}_*wL � 5#eRi8%/R]8PT�U@�@�@�@g@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Ȇ@ ԹsgWWe\R+Vps ={6mڤ?۔+WNe!]5kL*jR o4U@HX(ֆ ʏ?ׯ_ln .?_^z~ߨaÆjРg):_5 � �i XhĄ�  *T^{5ճgO͚5K͛7ž$@�BSiSSO;4~4reI j@�@�@�@ jeV@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Ȁ@ժUeK.)>~,Xh͚5Zv[ɓ'Сcǎmb ^+eժUsVREVbbbR rSò[͛]HƍݛԄRJtIÆ hխ[ׅiEOI{~ɪ @�H!@V ^ �A)k-Z$%!i#=Խ{M'W^֭͛맽"� @Ν套?ƍtmP- ײ-Z-#� � � @ b'"� � � � � � � � � � � � � � �@tt6lʙ=ILLԎ;\%/suE{mOqqq.XrʪTRRX[yU\9oH7$ 8qBwN/۷'mʶm\֡CF˂,l5klٲI۳~VBB#"� @ P`oz�-Ъ4ex4rdƃ;- ˽ m Z� @ H@Wۏ4pdZ-Zih � � � Ǯ � � � � � � � � � � � � � � �@BڶmjǏ֭[]ٲe 9~ђ%K[VoY_,Ȋm2eʸybRm+S߯}i޽ص[gYvJ*H ^kh۴i۪V*QQ ]/^ZOYh �jUvݢC @X l`ŋkڴiԩ ՚7o  �,Ptvm XkxFZI5jsC9< � � � C@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�B ::Zjr%<yR;QI-`iʕ)l3… 'kYVҥUTTK%d+<yuUhQY/Gr>|8bAY|uY_~祘Ӛ4iB*Tpּ7:j1 sI@�v/UM{+i @j ֲO:k׮3g eOn!� @ ԭ+(_}z9:v 7=.!� � � �y)@V^js,@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�HVJFiaM{uL;k<iƍ),<;ZYPؙs[WHW?~u?Xx7_^V łSN%18q"Ų>~<cǎ%hiM7 $+Yd3 6Y[g˱)e˖uiWݔJZv!� @xy^k"�@f,{ƌ.T{\z5j@�@ mJV^c魷oC@VnR#Pg@M@�@�@�@ :#mA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ J* Ç("uf*e!S~?* yjU΂,*yU�,[>3$^>]^-?pDyLe듇zYW~0Z~`XѢE ,8D)τ@V<67yqL � @ MVS9  ֪QFRU^jǴi\`z6C!� 'B{;µR*WN80e@�@�@�@�P P+mD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ,¡TP!([?!_ͣQ䨀 &r@�@ / ~[D�akիWOӧOWNԿ.<M@�i2e[n qZԠA Xk`dB�@�@�@�Va � � � � � � � � � � � � � � � @ ?.EGXuT@P Z AL� �!.gOeˆxGh> D'��@�IDAT@~…=m?l޴iSM6M3gСCj=D�@�YSzi*iˤ矗l}Km8 � � � 26 � � � � � � � � � � � � � � � ji lxtw`3@�@ je]@�hJ2EZ`viɚ4iMF�@ ZFn;[~R%i O6w � � � :jι � � � � � � � � � � � � � � � Mx)::;!""j  �݁- �h2pa`'/ĉ+衇Tl� �y#PԻLi6g +W_i GA�@�@�@�%@ֹdX� � � � � � � � � � � � � � � �a'p8ZawR9"#o%$s@�@�-gT�@ Z:;X'=zʕME�@ J&}ft-{IMJ͚¶o/p,t@�@�@�@@ 8 4@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�FbbXydӧ%@�YJ¹ @\~֢ERrsݠ5#Fh̘1ڍ � DuJFIII[K?.U&)R||5 � � � @X ֧!� � � � � � � � � � � � � � � @r ԊNeWJH>3@� *[6A @�WeKiɂ7k;o8: �dXP!⋥W^oƏAJå/pul� � � �dI@, � � � � � � � � � � � � � � �@|<Zxhs"#> @�ȈR2ْm@� /ZWO/im?. �@LtuҴi -Xܪ[Wz1ç@�@�@�G@9@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�rYqrH E BS@�C}0]B�ȖkXq-:OI=z`l3 �'P'-]*-Y"-TԱ4vt`##� � � @x DWw  � � � � � � � � � � � � � � � pn *[,pҞ=RBBK%JH.-"E3bB@�E`~L`i @ {? }wٯiNIS'TԦ䓿c R`)Sŋ#ZRZ@�^f$+O?-}wHw%]sdSw"EDoh � � ��Z}~h � � � � � � � � � � � � � � �䠀jEG`T@ �Sݠ%KR �´R @�.oTVgOIA>s3'嚾}S-@V>� @ Dy#[(<qb \kWZ5i$fB�@�@�@�2#@Nwf@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�BZ@>}4>4B Jo+G�@�2.`)` /.v+ K{E�`Er=m?N}{"� @ 3mIK+W´zKj0{~̘Ckg@�@�@�C@P � � � � � � � � � � � � � � � /Rtt";J*}kކw@�@�'ffE ^:ymΝӿ>w �&Z;wb� �&P?K?$͘!խ+TԿ4ml= � � � Lj٠- � � � � � � � � � � � � � � � ǏT6СR©7?..Y� �dE`~L>@vR*imȐ]ȸ@VυJӧgXl� �y'`G_v4n}ˁy^R~'-_wH � � � :jι � � � � � � � � � � � � � � � M Ԋf%@ ,<zAR � @Vʪ7;62R'[OMkst١gZ� @A(YR6L;WZFf .ZmWP4' � � �'@VzB� � � � � � � � � � � � � � � �a#`Za:Y^(5lxjc- � ÇL>קTkԽzIJoi.`- s_==uJ /B@�!Pcҏ?J3gJ H< U,/}q9`hK@�@�@�HM@TX� � � � � � � � � � � � � � � �a)@VXV:uaRTTʕ6nR) @�Ȏ ʎ"@Rzg>{=k@  zɾ@�^׮…u@�_P!sg7ۥ_{W|PZ"A @�@�@�@ ySjD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� q4 zO>�㶞 @�IC,R!0tAŊI={GhE `?Y:u{|t,e=K � L9l4wvtĉRFR۶?)8} � � � }oH  � � � � � � � � � � � � � � � "ǏK11!X@T:v",RԻw+d7@�@(U0 e`OTԷ/!!|Jiz Z"Y֙;vLI35 �@:cI6H}&խ+wT4hP`]j?ډ� � � � $goo � � � � � � � � � � � � � � � @( 8|h{eHGD_ֱ� �CZJ̉ڨUK�B:uJ<8Hk(hK&H 9"]rre۰@�BCûtƍm^xAZ^r D�@�@�@�-E�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�0DBL \si3;#� �8x0YRڜ9n"~/.N9@+ 8~<.Y>Zڵio˻ � KKÇKK+VHH*խ+u$F T34zC+@�@�@�@ =}@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� @7â;t4J:I"RϞinΛ � @, @ /Y@MIe�y/׿JNlf>CiÆg @� 6m>H*W.Utҗ_N_h) � � �.j"� � � � � � � � � � � � � � � �%px?11/z4cǎ(.!!!v_rzHj-6k関Ed*T( �dIJҮ@$&&ڻw{=v}I8q•ƍ[iٲ ^}>䈊x~)%ƺbL {s9 dv4 ~۔ǶPݻZKժ|?W -Ş\NΞ,Md%e{Ϟu刈%/=@r<0m&@�`۞=~/4vT4l4ddA[L � � � Zj � � � � � � � � � � � � � � � E?P1γn8p7xnڵK; ߊ-9r$EpqmZdϿ[}l'0;KKUxq/<,@VJ.&`eʔQٲeU\9WJ(6# �w gh&`7k֬Ѻui&W6n[nuea7瞆zoQ%{Xb~|^ORF YiР/ND X=z4inV?Mޝ͛ k۶Y+Ž2^0^.WڴP͛NoSfwzdЬ3~U?%)oa[~-\m,h%e}_:LemdB�@ 'PZzu'wk%VXF�@�@�@�` P+X B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�sQW eWl�~+۷o׎;;wԞ={dq'li?t¦XUŊUn]lS6@tF՗^yH=Ȼ@ .$U,l^>"oA~p9 mZ_+*UJWREUVurnv,#� @p x"338MAlݧ/X@~VX˗0-<...) .P׮]eX _^܂_XhK||b|0[_ݛt/l޵l2M6=;mFbmhժӌ߂xA`=?Z�i+?ϢX=_ʕcb`^^5gU .]zTy;2))y|yTT{ye{.O^GDD(~ڲ_;}&Ke[oXIm9:;ɋ}%/[@R|/y{u֦&C,۾Ky, ⇄m_&@�"_*M,ԷT4xtMw+΄� � � �A,@V� � � � � � � � � � � � � � � �9'&r4kׯ_ʏ?~I7nL@ddۀ�eQ6o޼[䥬7Z ב?Q@v߹}<~v]uѢEڶm 5 *S5kזZj1{ � ^6^W7/^ٳg- Ҳ@-W ӧ6lJ]JVĊeѮdk, &.L˞#ڴi۫s9#a{2+`GɃ\//s B:daG~`Q`#[c{;3�@;?(\g1S{%|lJ¼,`¼bךls]~Ifר뒇+B욵 tn~un<:@�G &F0 PK?/nֲx&@�@�@�2Bdm9 � @X 4jsgXu � � � � � � � � � � � � � r|#]tvTN5ǵj*WV^4_n }<ɂRjUURhEEE3φڂXVa7лu뺰 L+q"@�L .y1#;9YO?TӧO̙3o>fۮ];o@.e˖.% .6 =,\ [d,.ruU:tP…}0t, B-8yBz|~~N<yV'c ?$穅 ,YR fB ,+y-[`8n9[3' [@ c*x:IK/XNo{,iX$e7u%:� � � nPA=[1z!P+w}@�Z\ � � � � � � � � � � � � �R͒T�lp^ҥK]|rYpVBB fV e:ݼvڲRV-5k|_~}R04+k֬ю;\k)₵5j LXM6uИ@�@  &Owy *^.F.L^xaXAYploT^Jg},O>ׯtBVXswƞ9gΝnn~,Xmkmd!V]W~pVe bB�& ղ=+~Ж-[]j!v~'µ- xXYL/@VCzK&H&}T4ltR*Gz� � � jeݟ@۱' � !2F � � � � � � � � � � � � �亀7&.TޠRr~8b -^8,[LGuYuq[В A*Zh冀biV;/@K2eʨYfjٲeRk @�'pW{#\_{ӻwoW]v-Pa"(;i$W-Z8 0@v[؅%uB, k֭l۶MV쵿ls :qDCDD=Fp˻6c:Lڟ#^i@ԖNTRE+Wve{]X仱dj 9xKJcmu7KzIQQ!� � � 5f{u;D�@�2$@V@�@�@�@�@�@�@�@�@�@�@�@�@�\ J%K8@. ۷O_~+6… eGGGI&袋ԢE ܸqc/Kz`*pvXRoDoF_ ݲ�e˪m۶j׮ڷo6m0tB0 @vuW^}55?ʕ+5f.j/׿t… x~I'N~^ڵk=k]wu*d,X/ ˲ 7bVlɓ'Prq éXbRx-[XYIl, P>>[/۷oOg|euUV-RF Y!d9ZyoȨɁp3兗J7( &կZ@�@�@��ZYʺ{"� � P+CLl� � � � � � � � � � � � � @ |.H\?ah֬Y={+˖- X^҂,^xrTNǎӒ%KW_inn[HCVԱcGuY_|bbb©@�iSi ?4iԩÇkСLg s=+z\҈#t7v`Em?jڰa+tf˛6m҉'ܱ"""TBTl,#J@8} ղpA~~??zhwyYfҼVZKbŒe!gYOjC <n-uE�@�@�K@OnǞ � @!� � � � � � � � � � � � � o- `8@`_Nӧ#[עE ]%7tF# sBV\´:֭z۲{G�@ ,J/Rzp ˗Gɓ`zuˆ2&`O?^}U顇ҭb3V[%8u, k͚5]օg[iǻ͋)5j� I^l}9aYF�ػw:+0/[8ݻZR%ծ]ۅ]ZJݺu  P+f@~ ߔ?QhXEJ-[g86 � � @ 3DV@�Ȑ�Zbb#@�@�@�@�@�@�@�@�@�@�@�@�@�r]୷åcrP 'O̙3{iʔ)ڶmjժݻK.K79[kqƌOsN7hW^}m۶*TP*ek@�PqcyHҨQa9kpAZcƌQc"z'\i�Tc/gѣG//�=Z\b+keղ,{.b,<Bd,P&yVoYg/rC ק[nYM˗Wz\x ԰aC>+ L$[ 6µ|`5i<մ @�@�@ ʺ<ZYcO@�@ Cje@�@�@�@�@�@�@�@�@�@�@�@�@�uW__ڿ?2!ٳgkܸqzeo^W_}zDul@ 5xbM:]}l�~iȐ!j޼y @�/kFÆI=*--n]p/82226_f^M6MQ-XL2aӿv$>>^?-[&e+[lqUEGG, _~R8iepl�i㏲5VrA~(]cbb\\ /Е&^ڌ}�ZX@( ̟/ߝ_)!!6}͒3!� � � `je: P+v� �dH@ 1 � � � � � � � � � � � � �.K;v8@6oެW^yEo6mڤ:hӧ*VXn&M &Ama^ȍ7ިiGE�@ WOo6d,{q�Cճ>K`Q.)S[oUDDop,yɒ%7ou/ ^A"E\KƍeQFZjC�<ؿ/_~.p_Ė-[VM6u]tZhB *' lg =C'hV馛$[Gfo@�@�@� P+@۱' � !2F � � � � � � � � � � � � �亀7^7i\?HC`ܹzGIC QuKc`B l..^ τ� @APA9R[U-[wZ~^u]}Y2!o>e^ vwfbB-[绲K.Xj]P[]hKf\K ܝu @ F ^t+thymKV˖-պukkΕrʅ]"Pl .G^}U7N.֕WJ"u&/6\zI?@�@�@�2*@VFގm@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Cǥ0Xtiԩz'`K|tB Hh&g Xp3<?zо /TϞ=uEf͚*S+qqqॎ %k@�BSC:o/_ ͅfXFZEzOO?]CɓZpf͚yCx,UV<H@�p(_.2W=zTK,ŋgo/m @С:vK/TUTwc�@ӦIZ=zHիKÆJ!� � � @ @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�JJ:qK=Zhn:Sn+B\p߿+6пǍ5JJHHH; ʕ+jժnpވ.ި) �(pdB U+V0kʔ)*UT۱2wF3 ´fM6MӧOל9stUTɅX~+5isBh# @@Xb3>i׮] ͝;WN:% غuW{E0G�Z &F<8PVƎƌ\gt-R^Ryq � � �'#ssd@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Cx)::X{neZԸq �֭[?7|~͛o]CeDܹS[nՖ-[|ڰaʛlzaÆjڴ7o-Z|@."�ɓR"bښW۷oW='|" `?뮻 Zld&O^@ҥեK=3ܹ, @ 띅()3gԌ34zh]km~RWO=%=ҿ%]sX׿nI];,N@�@�@�Ȳ@Do� � K/IFGn � � � � � � � � � � � � � +-Z$}E. ko$H W^Q۶mA ;e=?daرCk֬ѪU\Yl.]* W]@׮]AWQW@�'ӧHi$k6(teP H""xNӋ}IQmI$H(Hd9KP⩨3"*gDE=EED JF2}{nYgwggwvgv4ӡzQt?(jf/WY ͲPO?]s-դ �y(j*M8Q>ݻW'|.y.5^;w52Pw۫g^xAr_q\ `B [F�@�@�|*nT4yԩS>=8V8K � � � � � � � � � � � � � � � @B %,PUʗy|^zfΜ+aZ_~nF5n8WM-�:cׯ__:7ӧ /T|GwuP8:̞=[wqZl;ny}[n/={&m9眣Y͛77ߌh]P!ձcG]~9r,:@{O\p.\W^]mڴ?-[,b'_twd @p9~(VS�FԩSo'=\S͛7{I'?ʹiJ]t;8BD,G>�y˖-9\zY;o-x^u:g/1b8ôԩۅџ}li[}ho›3HHuwgy?x衇ZP/ ڿC 䜪a|vׯ,t0/ %/ͳsH씗VVMe3 v-⟋լYSvV\G@� [H{t)!Z{K+M7,Y@�@�@� �Zs � � � � � � � � � � � � � � �민Dsyqv@;ηN/+Xd^|E͟??Wd>Ȏmu@&LN;MeK-ZX֡{u~>o<}醁9yX |ڴiSpە/_^|K׿TǪU3}ݧZ7nGuު[_?y俔;m4EZl`; �\a{T @т>Xhձ~G}>{{`xԩS'ggcǎaèQcY-/ m֬?|U\Y_| ͷg6mU/v!Kevޭ aM?m۶-S J;DZvxZSO=ms<oYO}֭CA|=v^V̫SVm˔)!u 45tPo= *(#@ -*u1HɅʅJ' n@�@�@�(pjK #� � � � � � � � � � � � � � � P0v$P+W:c3f&N:t=@зo_y䑹xĔCq_~7n,ownz,[yM4Iݺu;vT~2>/*VzqMC aZkmG~zg}GqեKY8… eרQ;l}y� @X`߾\ xTT)*| U,hB?ƏbŊ/`z_l2tg$[![nEO<+B rOԢE|f8qze_ ڧD߿7VAQfmԁFUʝ"REZUa9Q…uuש~9PZJ`׮];n,P./ %/{Hh˴DÆ vܮRJg-׸q4uT5lP=IyrT @͚rr@N=EIBh  '� � � P*SG�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ EVw};ÇXgy1vUsNm̭aڵڵkpȮ]ꠃ:`Yf/-&~}ncJE[ϴ%k 1z饗jժUٮ2{>P:ްaZh! ٲnݺUVl};@ ZQNx� +p `fb%K!>|'{~Oyrvf+̙9ϕW^Fx㍜.:byZnrɂ,x%!m,O)7J+hv g%"- 4gV.}ɒ% |ze[ϩsy|!:>{(+Xt.벲mk;Og֣>--ў0 �&`էn%4h-uaޝlgE}@�@�@�Ț@tE[dk@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ,P+YC wZ! N᭣޼,l^'|?\{Vֺu|ʖ-};6n胈Kj׮Fq@Pɓ}xŋղeK_^  f2:uj<vXߩ=#:StPF'Ntg3h~~޽stM~Q=E#E]Ϟ֑_-Oz*U6m^y/>ɶٳgx}z39QdرÇH]{^eӦM0a,:?~}q߯C=4|z뭷t=h9vc9{ :TzR%|VFa!�;SN)sEa~;!^r.ٸfjZHk~GzO<è}Y&wf=V ֭/Vw޽9lY줓NgvzHrlkXXj9FYhnvݷ÷ ]ŀԬjalV>`ߞXۆov\Z„飋/gYֶMbZi{?^~e}駾gjmx ˖-ԴiSye32?oY+WTI?|u3=7YHg(}{ƾOk;0]>:X gS���@�IDATmw}W6Z0=x,~'9F:ugBNw)*,,ą K.9mcW_}ڶmgY&ւ.rog왔}2 �(`w%r^颋K/\NO3 � � �d,P8լE�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�j,?%:ꫯquwHtlV`YPZdw^Y=&>:zK/[!BYAu:P+|رێke2d>YfС9q3^{M{(L4a,/GƍnwSO=N:u><m"M7l>Cס]z1obAUauZm)[HڶmۼuC"9bŊNywNȑ#}։ump 5p}z@�BSfΜMpc9jrwi߾W\/s=ׇ~3h)+wƌ^ik#Xo/.kPF z?SV? `v9X<v´^ނ,l bK.ĿWg͚˰}7n {VKStiY@|Xۆov 2d[}ljYg%kpevveϼjY_yZ@lݺUG}o}'})ԾaCz|lf dDb=_�%{6`waȉvii̘1>PiP+{da[nSO=3 sazlTR. h7тy e9|dop|@ '\ ܟ԰=~~gOC � � �$@�@�(0jT(Tr@ � � � � � � � � � � � � � @ǎеF)eAW_ pо}Woz'ZCȅ) Zj\r.|*ԿoSZ5l%JN86mڴ կ_߿^~/υi>|puZ^q իvZ|d23e<uJxe6t!~?y/s $a~dɒ!b;/ ,]YxN.d,et\(oӠAЮ]ra_۹. hf޼yn}\jvZo:K� u [ � 5o<.gвewO=3~ j{1B4h)+7\,̸,MM7ݔ^vom+Vd]vV@"w.%Bpd]9qDoh` bNk~w-[jC%(˱v Щ i3Ѵ !iۏfikA)_χ~8-dmkץ"-ܹ׎ ֎4rlzGzp_Ν;C.\o~Y4?+ -V4 ,dzb{؅z_j>Slf&[8_Gy$|/s`~Y ]a{rYچh~'L޳VNNdْ=o4[РAT#�(`O(tꩡP¡СB -^gC@�@�@�).r(P4q  � � � � � � � � � � � � � � � ?;%W~A-u/(… ':\f͚iҤIڲe_|rF uRz|]*U\*S\zokηK.cЀpv̎ゴ.�@.pJ5k LZhaN;Dsi_ڵ\Xxx&a7?~uیt]r;KXg/7xC.Kkرvv̙VZc4n8]&M: r yPB_'{OcpA ]p8x2@� ufCB)SE8+"wa ]p>o`m<wV)ӖHfNhB{09R;ݍ"VvR߳gȿj*@-=?("' \so@8a͚5K.xLA(K.Dw b _Xۆ1cmj6齑vm8ꨣ?nWLJdmL:�>M6MSN2kGjo[Y^೟{+2e{ؾ֭+{/)}9G3s iχQF~־!^pZyF޶m}Æ գG;?ۈ(AxHi 6G\_�dEH3SFI>(?=h�%ێ@�@�@�d P+ٮE�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�\j$N5jԐuJkTHCѢ)]kX'dwܡ!C[*Uhذacn1\sY8_2:NСx8dM=RC09f4Ρ-RvM`*;lp`vZ߁yaum߾>sپi{㥷l~Uα'+˭C۷kݺuYٍm@�@�=qƘh̙3,L{iyV)#n%2Xa~,d6'NCzԭ[s]+G�a[afXb<e}OZ-VZz@zCVKeC.ܲeˠ6Qq&x[<3[zva>kӦMiWu|־ ڪF{]#}dѠF ;ֻwoY0?ӧO4x> D U ٓaN齿M | h?iY(; ܭWr{6ʅ}JW\!*?0 � � � 4T@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ȆjrXsβy.9g+]/pƌ)B֬Y}G裏|(S߾}Uxw~zC4Ioߜ\k=9hYi;ޱc8+WEM2"-͆U<xQB;4}Sooׯ윬;ţ+e!� @hذ,4tΝ9~Rvk8"vJ.unSZB,P+mlPOk\tEի`qܦ۠Ap8p<dm*K.L ٺꪫ|1c\{ҋ/YR6 i8^o~N.�qd45d縩ˉf>c3;G~A^x َfsh6iobyF:V2/zHÇo]2Qw./W+}`\TNO>?@�@�@ _/.#'� � � � � � � � � � � � � � � � XVm Xҗ_~瞸t}ztA7ٳÛYֹe|(itIXf۶mɐoѢZ'{mY4IocG4MWC9D7nԸq»!+VP*ffΜ_{,^XGuiRJ$Fn!\5  ʙYw֮]Qf � @'O~sfԩ[nܼ>'ĉe!6XB4iC*7g};ƣpvok֬Y֭V\^nj|[ދ7|N9Mf҉';S-R޽}`k`A?F`,XzjA96vim>ii,!Zz]SPMO˂)x㍪R^}U=s:x> QU(F;Zvm5o<Fin?gSO=U ߵF uFܣh~Խ\ 4rd묗 � � ��ZQ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ Ԋ>|8p`I˗/[S{aE:)|gݝ:uҰa֭mۆ;/{n޽[ڵk;j2e|;vM۷8֭c,<:֬Yg-̆h׶ :%.L18!.ׯ7[n-3ϭws:T>X3kgC? K_~ѭު *]W^gPl;ܜ^zYf+eީUbFVVTti.Qhluse@� @5tG]o9<XTٲe}�3=ӲDž^Gy-WL{h)?S6C.]TdIvtF;:矗gmz) M1O;/ͳMƍ}B]6m\͛i0{6]piѶ[2swhkS]uU>\(ڶ/$vY~ 6]Lm`? 4! ܹs}\eN_|E{ڛAwܩg}??@hMW_I^27܂Es)Pn<loj:tUQ 9bժUx=RW O=X`֭[" .{3|M -тGsuJy b,HkKz@ ?vWҜ9rA}I5kJ}H  � � �$c � @F *W(@�@�@�@�@�@�@�@�@�@�@�@�@�P!z6e\Tȅn._~yp!׳Gȅ^~ p:`|8:mζ] SuBraX zC=:-Y$?\XE Nzkbr6mڔq\\Q|駡&M@?-;#2wy//}'C5k/_>~ќc46x/ڔ*U*B:p)o߾޽{\'!בu:3|?>:̲y: 7_~61—ky䑡_o{mcΝC3kmnBBguVulrAlo9TLN;vRU\8Wu ]jժFڻw/|:3 � q?_ɓQ:e&/r<aԩ>*;B.=eb=U B.>)2r97SSPS׿69\q@ s=꣏>r!v.7db,-ws4?_;,cie˖O( y%J:X[>&gF3kF<xڏk~Zc"2KWC.qȐ!iӭ<kyZ;N.,M-s n:|ꫯ?;dfjo$mm5{|3VvF[lHg(}۳{a\sMOR?s"'[سrkݼy|\xvSf̘_6}r1DŽ9SO=zϞL71ў?gƎWvO?67Qgx.2#4:u  J*R9۶\)j:]߬Y=G6o'!� � �,Sc/d  � �qxIipi8b@�@�@�@�@�@�@�@�@�@�@�@�@�@ *2eѣ}ڜbpN:s8f�J.v-X@Փ 7o,!zxy׶tu.AHתJ*탙̎li8_K.Y. .̙qaG&B͛-[uIaO.NuGu-q'\'r/#N]/jĉ2krd*Ydx?{_u]4hPx3 �ur@RN9U*$ݟ}M0!OǺ[pr#~݃$=evwA:c5n8(2Ke0!=#r!12>}.S֭TN~{Jk0m99dbŊb.;}iժUrؾBkڙVwMvLs]sܬzevLҾE|!㤭 iYb7K |nQ}\ڶm+ئ|P޷ўGffdc\ef:su-ۺt颿ڵk^V+cw,5k&l�UTo\.p@�@�@@/3Z۱' � �ZQ1 � � � � � � � � � � � � �q(ZTzW@~Yg^|Ejժ@{D{t)d7q{3<YCgui~{u.nb6v0?3:駟4k,͘1C~*,:?|RTZUwy'ZLE�9:9V_.)駟W\N&˽{Z| WӮ۶msmW3hjܸ͛j] -jY&bu4mT ޹sg:ܙV2 ZS]LF0 g,o#ށe˖Isj%ͥ({^zJWCW '� � ��O  � � � � � � � � � � � � � � � @طOD}pvGy{ߑmu;Prz [:thkӦM{N;wvqJ*nӧNϹH"~)LVXֵ^ h޼yZlBʗ/zc=V;vTٲe}YSP!F۰@�iW}M&M\G'|4$ӽ{j}Ql6mJ2eh~}2>\u\֩S'.]:0~?X"bV4mT ٻworδl 2drHQ|Vد.B -HkڿN<D3F{@ *HMGsɲMYֿ}TNC  � � �D#PSh6d@�@�|R?ґ֮mB�@�@�@�@�@�@�@�@�@�@�@�@�@� l&t\ǫҩf<JN`ĉ|HЭުJ-EgV-tRwN4ɟHVZjf͚вMy>P C=Tk֬z_~E5z{6D�(l vaa?3׭X[v=7aZ~̙35~xba%\2vU;wVvTxD>A ðdZI.GnYYϞ=5bĈqI~Y_+{bX,([n:3}'~ܳiԨd> �A`J�C_V\ޭ N>Y*T p � � @{j~jnǞ � @TjEF � � � � � � � � � � � � �U`C:rN8!4vSO=_ uWbŊi%/l2 2DBPL'4k,l2}kΝidjٲe] @�R \j # X[sѷ~:):X�?Z I +]~ %Km۶Сڲp*ǐ/6mtydzzDrMݫQӦMԩS5eUX1]{k[G}-!rP)@}]64z\tWK'Y� � �p@@�J@@�@�@�@�@�@�@�@�@�@�@�@�@� Z%U.)\q=#uV3F<6>}`֭[H ̥wGԩ;�ӧkϞ=m0qDr)m:@�B2$|%0'O5j⊄s~P]p;wn5_W_믿+ ,-dVZZB;sA� o>͟?_$>sL?;TLkNw:vmY~ʯWB`̛5v{ԫ4hԦM8@�@�Ȋ�O͊ցu@�@� P+I)@�@�@�@�@�@�@�@�@�@�@�@�@�, ,Y"խ+͘A~Y,L7ѣ7訣%\:]jժ( XgƍXsҥKuii޽ *t-Hbڴi<y2 *\{9]z @�Q$f,ջwo=:d)_|bV6j„ ׯ*U_5j.Tֹ/Z__ޯ<|{#T-ԼysիWOEw h7nԜ9sO?~o߾]EU&M\Jվ}{] Jw,A�Xn^y%%\}Żp۔`=%c)}@�@�@�'ScjnǞ � @TjEF � � � � � � � � � � � � �U_#~Qָ³ `>hڵz=tgzY(M zw[oׯڵkG] `/lݻ[n,6D�@ �.|.2>裏OޓI^Z7|^~e렃JlՖ-[Yf,q)V߸qc5mԇhA[ŊيP P�,p޼y=|;w~g?]b?{i֬Y8e˖C>.ZsO N{v.|tWK.@�@�(=5OVv� �D%@VTLl� � � � � � � � � � � � � @\~AVi|aøcطoz75~xmܸQڵө֭[Nc(]Ȗ={7hĉ0a$f͚>G:cU~Ν;5m4M<u2z>1E�@ Q�.QLbkÆ 2d^z%uEdA {{Lw}ʕ+:Rgyf %lٲŇ̙3O-`~wvE4TFԠAYxMp@S@�b ~8=huJ.?4iC -~֭3jE@a gƌlӥkN<Q _"'� � �dIf뀍 : � @ 󦔈� � � � � � � � � � � � � @VOڷ, l ~\.Z*UԵkWp ~x@(O4I6{:n޼8 H`ao3� dt�d,_j駟tE[oUƍQkCY@ك>oWٲe[n/Ca,&kPxqթSnYV0Zp+Tg@� ݻ~3Ee\g7}npZjA B۾yV P+z+D�p?-z_髯BK/>89ωZ#� � �XR!P+v;D�@� P+*&6B�@�@�@�@�@�@�@�@�@�@�@�@�@ _-zTj\E9,0w\}'~No;رlС6m;CS\ؽ{{M2E_/ _^+Vmݺuk.�" �Yy_߯7xC{5:4tPj/۶m?#Gj͚5ׯ&/T1-0S Zpax\xl\.X \fA2G5kc}(WL`'@ 6l~w-_\K. ˖-ӊ+d6*Uz i%rFA(H.CYFI*(]|4hu � � �U~ Ԋݎ=@�@�Ԋ@�@�@�@�@�@�@�@�@�@�@�@�@�gI'$m(/CQx,hƌ`-N[۶m۫M6jݺ<U$ΡW͚5˿Mٳgk׮]T;8uɏGy$!mIx2 @ \zY0[oO?+T^tAS~v̘17n냴,rG`ǎ0%K-ƕ+Wkc)RTزd![6VV͏6!ms 8 ;wjժU~dYxV0wV0+W·[XN?l4j@ aSzihߤ]k8C*R$aM@�@�@�l Ԋݎ=@�@�Ԋ@�@�@�@�@�@�@�@�@�@�@�@�@� )m.*CQx. ۷OsZ~I?C~댼e˖`-Z#P%r*,h?-lŊSfԮ];s1~lذa^U"� t�.+>e=>`x:uOB~mkƍ몫%\ *T=ok^/6AM|R`o -VZ5h\\@)O׮]5k֤;gmܸ1 Ppan}5j8 ς0YXF}$=D;j@q8< � � =5vPbcO@�@ *bb#@�@�@�@�@�@�@�@�@�@�@�@�@�*wKOke-[4k,ɼ(YҼyg)RDՓk5iO-HF:$O7u"oɂ:ϝ;O-[J.ó,XR6m|jy5 @b \b]V_oN˗יgs9G]tQr)p>l'Nb3gTŊug/VgK`Hz?Ӈ[cs,L'ձk[*UcʕeN=o 1@ ݻׇ^qÆ ~Dڦi7o|@Fڀ= ݳ, F[VhE ׆!@ ,X Y/ %]xtrs @�@��O]@@�J@@�@�@�@�@�@�@�@�@�@�@�@�@� ']z{w\C *]x [}R0]hsc ?\u֕Mԩ5j)q]]˗kɒ%e㯿pi]Gԣuz_%K״iSfS&E/E�t�߯p✟~1c *mꤓN҉'K*8&v;yd}駚4iT38C=z ' Rb(x\:XȖAO B{RpX}VeTg-F Q)Yȕmڴdmܸ1yY$, +m�^0<RJ8D0zg@s-9mۤcQ#w\Jֹm&gA) � � @^ Ԋݎ=@�@�Ԋ@�@�@�@�@�@�@�@�@�@�@�@�@� /H]'mPx XVJ@ӯ.W-X^p.]={3@իvڪUز-[fjժ˖-dy[]:_jVXǕ+W&ظvp`Ag|OҥwWijٲYy{99: @x6eS6}{Qzվ}{kNmڴQF|PT9b>~w}m}K(c=VݺuaZ"( 30- B}}~,8`m>؏AV0vp4c2euN xKغunq-Y֯},kun eLD eAp]Ŋ2o {�H_ϥ_o0WRk@�@�@�D况_bcO@�@ *bb#@�@�@�@�@�@�@�@�@�@�@�@�@�*.n\CH`߾}`'F x>sBֱr`OUVcʕ]£utl:`.RHPDRN-x:ۭSz:n^e޽;|f`vPfc͚5ua3h *qE?^l[P^> 7HMd@�,@pq/^C,ٳgkΝ^z:#h[v |r?Zy£3`[VرcGmgBAC^ۘ6B,+uA0-]4m`>XoD6ں`>Ҵx*VXz`y. XЕ}G7۷H-4+upV0ot,ОŤ eLm:_j�^E>ն>uXDW}w-KH,G }ҷa  ,Y"%=tҵJGl@�@�H|5"P+v;D�@� P+*&6B�@�@�@�@�@�@�@�@�@�@�@�@�@ >*)PxΠ-5kքq~$L7l;yDd[Giu(tn7ZEAFh[gҙ{=S:H:O# v>+V YURŇczLc skkX>"u& "uF,C�@�Ԥkܹт.\YX୅S{p xlZpaY6ov:TkmPXmܸjҤll`ޘ&`mPk7A[~1mQe.$[oڠgg4|Ϲoy4mple}alvLlu £ӛ¼mѼW=i,x>`lަS/` Ԗh&ԖYfdi}?4R8[e%Њ%d~Q:|KfͤcM9F_?3e,@VA;dU<\O:x뤳ϖjil� � ��Oݛ@@�J@@�@�@�@�@�@�@�@�@�@�@�@�@� !=hQ\Cd(`Mh?u4nSD<mUAA'ةQvzNN\?deVV,Nsj ̲1+W#2Oq}ҤIrҍ7J]$)z@�@ ,@pa fDn/_e˖ʕ+y@;w@ : Bxlji,DVZ~]jԨC|j"(eHmS;7o *4 p*uTziëבcم|za[r J:uͧK= B"ٲ;1Xoӆ 0e=c惩-&ðj ؚ5K='(YVզy&Q P+79'>\vt5WȵYr. � � {jW@@�J@@�@�@�@�@�@�@�@�@�@�@�@�@� }ܹq= #pL 7NrYzi�}1 � @ \bR �$iYԩW\Z_mY�C( @ -F{NڻW┿qDN@�@�@� Ǿ+{"� � � � � � � � � � � � � � � �!`ږ(u =-_/zO][&iŊ � � � @Z{x1ҍ7Jo-Z%Y؇=hV˔g5k<Kzqi̔ @�8pS?R&RĉR(A�@�@�]��@�IDATH:QK@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ȆΝje]HJ5-nM7N[WR矓4 � � �$=Bi(i,?I-[S¶>XIV& �y,pAҵJK&HK&5n,=ukW#� � �,@Vt� � � � � � � � � � � � � � � �"kZr'9-Pt-3HӧK͛K.MG<@�@�@�@eH]J.}AJpܹ)[ HtYRRÆ)cHsD � *);K7$լ2]'@�@�@�d P+ٮE�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�, XVɒYލ@  /.]v)To(u u$}q>:QN@�@�@�^?8BOzYµ#%lgOirSB+Vw,,d?=*� @4m*=СkII=zHSI8( � � @ jŀ. � � � � � � � � � � � � � � � \UDrՙ"@|3ΐF<Y*UJ:duk魷s\JE�@�@�@�2PA:T{IMY*W^zIMZJ;VZ RY� @0J ZXzeiC}{ g� � �$�Zt+ � � � � � � � � � � � � � � �$s'Z1\S'飏W[WSjDziϞ|~ � � �$@"R˖ҠA+HIVIo)u.tRR*YgI#FH_-ؑЧF@�bŤ޽ӥ)Sڵ/N{J6J58 � � @"#� � � � � � � � � � � � � � � @ EV]5j@ j%4wt1ҀRzђ}0 � � � � pҹJ#GJ|#m,M* *YhcI/+'o/ ,'B �y'СCJ(…RϞjժ%]soyW/� � � Wj@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�gSd>;)Nr\Q# ΒnQ:ΨwQ  � � � -S I _RZXzEm[믥 /L ];%@Bf̐֡@�80顇R&_8Qj8o_~D@�@�@�|'@V � � � � � � � � � � � � � � �@%.5 Y:~ i"G[SOi@�@�@�H:uRBF_?? m[jN*WNI:Tz=iݺD=u@�@ w:HziCYjZzU's*p@�@�@ �Z]X� � � � � � � � � � � � � � � �H@|t19rQZ5Gŋ>}S#[s" @�@�@�QLKۥ y$ j@z}쳥*U K/yF'in �$@aKyISH}hu-`Ӧ$9� � �#T@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ΝRױLjUiHiRx`X� � � �%PԸԯ?K!M()-_.oRR RҰa'H7'ֹP@�rR];ץ ^$@ZK( @�@�@ #2a � � � � � � � � � � � � � � � ]%ũp *tiZW_2CI۷a84 � � �  :{IMٳS}T"eYUWI/$[6ʮ �$@)-drpixAGT @�@�Gj壋ɩ � � � � � � � � � � � � � � � @d *Q":"�YX1ŋ~a$ z1iά � � � @b )"u4pҢE[ok4`԰d[g%!}cGb A�@ Ve!C W^oG-w~ � � � @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ _/.#'@ r)h#zT4z{wU !� � � �1 T*s4r7ҷJCJŊI?.u$+'k' ,|ẏdG@�BhQW/i idbEF"L2!.@�@�@�|%@V  � � � � � � � � � � � � � � �DعS*Q"!�\Yz!i"!C g~� � � �$@G<y-i i饗)S$ ][UKSzQitiϞD;� @t{ҼyR׮)[7ln]te � � @jeZ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�v.#@ zc҂ҩJJMHo)B _}*� � � �dKä޽'�*%!$BztwP@QQDQDQ.W M{P(%! ?kxI9]3ٳg֬\pJn19wNhmlqr DN&@�"g'6Ν~zRB� @�S. PkI� @� @� @� @� @� @� @�ս{;if ]49'5Lvۭv5 @� @�L'nɕW6O8#)A$[N $K/o#GQ&2$@�3L ;,)߸wNk5˅  @� ЮjO  @� @� @� @� @� @� @� @� |aҭĎ>RK%矟<`['myԽ @� @�ASFȗ'C$\{%^*s'[nsLrСH�3l% \pAz%m,+ @�4Z( @� @� @� @� @� @� @� @ |A:@~ 3o-dvhL  @� @�)kFq%GC%?ɂ &CV<$+p@ry)  @4%eoNzj<Xqs?FV- @�:@a  @� @� @� @� @� @� @� qZ7�#-$W_b*'i @� @�ښ@ ")c&zWK.I>F@&.?5·ʘﷵho\yek7B!I~dذYF  @� 0aZ. @� @� @� @� @� @� @� Zݻh>FL9$_,trQow. @� @` ,`''ݖ uW&ݺ%e&ɜs&k|[Ʌ6ͧZ#TD�P`sM{.mO8"y)i @�:k @� @� @� @� @� @� @� @@ **h+:%{<Tr'T_2rd[iv @� @�ڞ&묓|E%W ^r^{%K,,hor=Ɉm?ZD�3@7>}}-y@/  @� 0)&E1 @� @� @� @� @� @� @� @@n?: '0St~x{4&^qf$ @� @`vKKMn19Nhp9gFI 2קUB�&Y`yiW-Kr\  @� aju؏V @� @� @� @� @� @� @� @�"0|xá[7h̓zjҿ;'l<@m @� @�ڪl%n,ߒ.g,|rUN;% .|S>$g<H2jT[v @@G(.8 yN{.Ys3IώS}!@� @ Ԛ</G @� @� @� @� @� @� @� @�L >8%0 Ә8󮻒#JWgR&@� @�L%eMWJ{,2$d=W^I?<Yeda&G\w]2tTjj @8:W3kr7?F z] @�tpZ= @� @� @� @� @� @� @� 0 4w2AvmSN9e*Fg]qYr%SYoa[n*ɪ=zt6|l6~k'wܑ?,trӮ/{of6pê]U @� @@;(Y[o{l'o<PrI7ޟ{d}-9dvi:h }|ت$@` |3?sOgBr9Ɉ*'@� @@f> !@� @� @� @� @� @� @� @�@3P[ɫ2dȐx㍹ꪫN^%>LY+@/u 橧UO:FG}^v=?9'?I_>_MtM|Oo @� @�ګ@jUVI<0gI^{-TDJ]6odU.}{zOLfZk%_<D$K-v7g~N� @5]� @� @� @� @� @� @� @�Ç7.79Z?s1'.[͎}yR/o}:̢%j-G}T״VW3ҥK<uS2LPzH:*0 xdݒ6J~xv~E /<JL  @� @@;X`dNJn56,2sI9dM^5L9$ag'ɭimu,d|%@M .yd0YbjM( @�|bL* @� @� @� @� @� @� @� @�ګ4Z>Z{*T.>m,mi~Xx7f--o\s͕9眳3Fɺ:{#5H7@>}bf- THO  @� @@5YgC%yRlAr{7N]4eSN>�T]zY[K41; 0 NK^x!9?O#?y]G  @�ht @� @� @� @� @� @� @� @@ 9)r]wc_lXf6믿:~ϵ^ . JkjrjvVWתV_}~իW~32c=c9&?2jԨ]sGo-RڣGYj.,%ϯ&[<}K/7U=c9KSNiiA NC=={f}M1P:s￟~f. MU)aZ'tR|%V'?_ws_}NȂ .kTiPO<D]Ǫ/}K,M7T_fe*L:몫/eK/4]tQz뭺V[q|͖ƚk&wת~2rɉ'&Ү@7K)GMii&@� @�̬%Ф,x{7%`?MNwOf56,r۞ڄ7Zktdbc+a]+U:UYKZc襡KXgK'm @` ?g4 3L~/W}h5e  @� 0S!@� @� @� @� @� @� @� @�t\GWQwjfM6$%ȧ[-PV[5鮻Z_Ze}٧jsԓyFUrQGaY%jwd%a[S: k 6u衇fСRO **Egw̟u 6*6˞{Yu5\SMwk>뭷^$V^}|㘖mtÇd׮>*ϊ+o;e]򗿜Fպly0_InO}5{WΝՌerL +߿gô%6tӼ)ɷ~;x`v}ѣG׭(] SOu&ݬ+ht*,U_k_٥\8oҔw^)wɯ:HmȐ!-nvkZ^ @� @�S`RC'?ArɠA1|2sS O>TIySFY~UƁ&481 %NhnFmu {/.L1 %NlszG� ~x G6ޔ)_J;~ @�ZsJ @� @� @� @� @� @� @� @`  @S°ksI'e7E]s=tׯR>} YJ�c=:+'xb. $z衇}=KU8}~U*A=\ޔ rl[o/թJ9o^֡AU3u[ެ6JVcYfwoVY[)up8_PʑGr%0lؽƯ9眓bU&-[oU>*if_,^GWU.zh嘉WK@׾2\{5L'xwyu\_uҥ;cRUľݮzJ*,H 3D͓[^m)&`*3OKU~/Z(l @� @�&Y`ee]eŧ_{m#(W#HV]5UyϤ j_ Mcs=Kc78q2^J6lXz+jc %Nl @- t|3Ϥz~9ar5>ږZ- @�tΓ~#  @� @� @� @� @� @� @� @�O`zWUZ > fZ޺~u饗ڛ:XhՋVZ)v)/r>(;STBJRK-C,zw)t9s9g5ys-ǔRˆ>9AjuVV-eO )7x`H?~]veKZwA+9TfC<w Ww)GlF}O6@qUVYew=]Iw)!X%$YʽX%s\z<xpV[m\quh\=)fy]~n1)_kLߤ ^}ӟN7rkq& @� @ekcM>yᇓON5gST9$O=5vMSj /fc2NGܪ^,2Ћ'usꉫ�SOkd˳TIy}M먉� @�C`q @� @� @� @� @� @� @� @�(n/O`պl=@2Kcچ2h)OU3I=tk�K ]/oqN:餬z;sסC%Ԩu(u0wu8g]9gqFk4wQG;اzAFQF5YuY'7pC}o[ jW֭U-Xf\yyg궔`uN5Cwݜyv}/~17tS:C5;[n2Ao xm+lmLR2I:1rF @� @�f2lݯ_c)c:z;*w>U}7qcYdfkI}` jl_{,gϞe&w,qR7X.85K=K|ڨ@{n.ߒNHZ+zswC!@� @@[l> @� @� @� @� @� @� @� @d tֻ>k׮nEY~ R&m}lՌÆ {Z/?ػ>UhwjfK.$%$ C'TJѺ뮛~8{Gݞ}ݷM*+{X^^{ tT:_и)K*u կ~Ug}RBN9t-kmȑ#Э . __}veOZu#SOMZ'W]!@� @�h' ,T՘Yr-{N<2#՘qfR%ϩs=w5-gzX1)oE@){I6U`b'76۬U @�h jJX @� @� @� @� @� @� @� @�R`ҹs?un)3*ę(ԯ'UW]>G?Q<;l$I(%Xin9#һwjruA]lk)]vXfZ=6F_,RJٹ袋S/E/b>Iswи̻{%L(;ejW[ouXbvipuM4HxW_<#un 29mt_r +$W^93^#  @� @�&GkdCM䥗R&c#$o䒩BS7B+y&Zfu֖ %10(f }h[mv[r I *Znc;& @� 0St)z @� @� @� @� @� @� @� @L+Prv]L}ӟs=K/k|͗?޷ 뫯:%lTf&Js]_~jYk_KϞ=s%d-Ygc=rꩧ4^6 ^zB%UJs16lX^0 /*ollAdrH&cFO>Ykczް S~_ցmL eRʽ?z:w]x≖{~|W}]UW\q9}g{{ׇ3<Ygu:k}7[ѶAKp`wb=1bDYf,b:t. @� @ nӒ{M5T97S'?izƝ)eRۏe<|bcC/5벯8z[CX ,` |h V`͒3T4N<%e#@� @ _INh6 @� @� @� @� @� @� @� @`|Ç'ݺ-W^y%]tQJh^{/}Ku=ܓ[n%ThVH~rgwμΛ:+̉'XMHzsDTvTTPUA{sNz]xu=_WТEfm>.]lY~կ~Ցg;wADE t*5Ռ뮻Ǖrw}7{lfVqW)0 #/B5yzw.wGG?QK}R&-?^=oyy'}_ՄQFMҽ~o߾w٠8~=7w}JzG}{g]-A`{nc9WU5",RwGXhOJ>yT+I6RL?f].Ze[!@� @�h=z$oqDrɠAɀYg O^ƊZ*{3*cFm4ѱıзrX~812N-e2.T:ЪL1 %NhU3l @] T#TYnd57u4� @�#Щ_+uSG @�(PT%믷i @� @� @� @� @� @�\v#s%~7ceO>}>PB%XQrxg`T& 6,=YOvr3|Fiȑ#P_u@QΝ?v;S#-U͘ڳgϏoGkMb+GOoסq=.ZggI^j%W^m*9{YguߗOݜh#wydrif K{WJX!@�c yˤ7ݔlzM� @64Yi7thrw4] Kg9uIJ:|~Xb{C/“2I:'*:<w\#PkUJv1߀SZ @�̬N'/PkI�$Z  @� @� @� @� @� @� 02jjPL$:Pk&궮N=$_Js2=4eOv&o� @�S nQ7` ?L#He[%dke2(?xVpe+'?q(~ @�LS|)?ՙ @� @� @� @� @� @� @� @�/l-{,ko jK,g3.;-^|ZwmjBjFșvɱǾV~wZI^(_&~# @� @�ڴ@΍>B_sNGɬ&eyYfO;ݻMG�)XeKGM?>e߇NvI֔:� @�& @� @� @� @� @� @� @� @@><Yp[kM m̳>3 t*LktjIƄ-gr̙>W @� @oz* 2>ҥ\쳋:SF8|7dkq] nV^9_R'| ͇ @�:@A @� @� @� @� @� @� @� 0n>H_|{>^X`%J+%ށ;kX`9̵%F%ErQIy%/W @� @@;}SQ /'|2o߿3s1G[.sι\>hr2rݻk_?-'�4�(ϗ.(yZ%GcP1N� @�SI@TT  @� @� @� @� @� @� @� 6JVmmZE�$йs&n|Kj%vXRS @� @�:@j o߾m(jU 78p`ե,1on}\}rUrujilq:dkjUMh+`cMv9YelsmG� @@;N?8&@� @� @� @� @� @� @� @�&M`[I;Q ,|rI'%Gɹ&K/M� @� @`foFKk? H[n]S>-~8<ܓ<B9j)eyϪ.7_ w_,%K5&@�&P~/8ycwLX#9䳟mk @�ڳ@i; @� @� @� @� @� @� @� 0Q>5Q$ @`,2l}*$'|c% @� @L/УGjhzi1jԨ 8%dG_n\-%}tlfCs6~K/M|0mI]>J @� @= jϟ @� @� @� @� @� @� @� @�(ZݻO0 @8V^9CM*9dq] @� @�Z t9}mJJ2x<D*Tn*tSd첩&@VK{N2hkm lK @� jP @� @� @� @� @� @� @� @� @n&t @`B]&lu^I~o~|s:{ @� @�/0|e7GU9[TZ~2<ɺ7`kgo}mk?qf[$'ݞmrM @�ڷ@|'@� @� @� @� @� @� @� @�LX@ք}K�IXoᇓmMv!9&l @� @�@UxbrС=$%g쳓7OzJV_=7  0_??nJO3Ozh]S @�tLZs+ @� @� @� @� @� @� @� @?e¶np @cs/n,wԨY @� @�>.еkZɷ\pAK/5B6$K_JI^8y?O3gL[|m5$?u'uN� @@tEO @� @� @�vr?��@�IDAT @� @� @� @� @�(f =OG{~  \{Y&w}^216&+^?M;,irjq, @� @�XtѤoqG#H뤓AX#Yoae�['e?NVZ)sc!j'@� @= jϟ @� @� @� @� @� @� @� @�(ZݻO0hݖ|ǻɕWj)Ք,Hr~ɍ7&睗7ߔ @� @�S&УGFY3$%`,{rɨQ[%]4ϲ&@�-N;$^}t'G=> @�:@ } @� @� @� @� @� @� @� @�Oju6w'qv%< ,@z2c:uJ?<ǓUWMneƶ  @� @�|S>$g<p曍p}Mx#яWOzJآrՍ @(ϯv=y3+HGݝj#@� 1&?  @� @� @� @� @� @� @� @`925JϜ=d'յkc뮛<`ZS"@� @� 0sΙ|3G'^ <h_$-\tQɼ&+|o<d2z^y Z`YO~:)l>O~n#m @� 03 Ԛ?}}'@� @� @� @� @� @� @� @�\`Fu=g S.){˒SOMN81ANim#@� @� 0:W33R%瞛<T2hPr;4^9UBJVw]L�A{;I{.ONMN?=)ϲ @�fnZ3 @� @� @� @� @� @� @� @C |A{:Ǭsv1eV;'Y}vzI`* |ɝw&/ظnm*_@u @� @�|%oxbrСɽ&[$s7O~4F oG7+wem=�" @�5N;  @� @� @� @� @� @� @� @� ޽#FL\L<X&|WVٷ@ nd6KF @� @� 0ʘk&\pA2p`ɟlI#l_NMzNv9ϓ;H'_k]�W`y4~_VKI  @�rZSnL @� @� @� @� @� @� @� @ 4'֭7TLE=LFxe{||=s&]|&햼z  @� @�L{EIv%9aÒ[oM䣏ON6 +YƸ%$2 h/sN#ɒK&lغ3'@� @`rjMc  @� @� @� @� @� @� @� @�v%0|xǦPL.8_d?RS#Kn!Y{䩧M� @� @` tlar_Z3ɯJ',pҧOg$<~-u%VhqG뭗s2`@郖 @� 0Ι @� @� @� @� @� @� @� @@FjJ@]YfIm[l2Zk%]6[z @� @�RK%{yf[o57(YcWd͓#L:2dW^u�Si|s%O=brA"@� @` ԚޮF� @� @� @� @� @� @� @�LGfV.E G2bG׶Kn5);'=#Z @� @�@Ϟɧ?ɵ&o<XrK$]lm2|'_J&O<JK'%FMv%<}vrI .<wG� @@[>m @� @� @� @� @� @� @� @�@3P[iRJ Y6K杷Ѽ #믟,HmDΚuVcoL @� @�3@NɊ+&sNSW$;<lr!c86$'ptS7V#f@@(ϻ/0 9Z%<pv- '@� @`Ɓb @� @� @� @� @� @� @� 1juQ/&_Kd=Yfiモ_3LKL$nҴ  @� @�mvO CK=6+-H+YmO{nzd{G7´y=#hgaR#}@+  @�@ y� @� @� @� @� @� @� @�hÇ7ޭ[킆b=HFL:uJvyq"i&ɽ&#F$kq4  @� @�+YfIX#7?$m~RK%{'|r)1>HsQ_"Yf|+7yi=d*;$lx @�)P ( @� @� @� @� @� @� @� @�)P&,EVV`^c,T7bY>z|7J{YnGeBK=H^/_? ֪R֭Ν;K.-دgfnڵk\ʾYg^U_^ӣGzinBӘw=Wɾ!@� @� @`lEIRޫ`T_kkO5o]O5ܜW^Iݶu@Ǵce̾2N_˺v}e|~RQUBYY}ucu|[ٗ9v_.ce~bKo7^7[\G!VM.0w~7Ygdݒ4YrɶJ @� @`rjMc  @� @� @� @� @� @� @� @�v%PđjWmi+P&:th2lذ\y睼[{z_Y2)29exLJ9~YZ]kĚco/UK䟭'{{B]ý!_5ʾI-p5쳏wٳg&5\U{e9'681G׿&?a/%={li @� @�hUQ6ؠ4쳍�aZc \qEru''j|yĴYq2_n7뱷K j5%oї2.?@ê뉅[5Keu.!\u94CZw5q2^_z:L\srK{yzo)�fm1<,.K.u)&Gizkre,\r衍g#$� @�v$ P}XJ� @� @� @� @� @� @� @�L@7S:@77ި_2du9kU&_)8T&p,>.cL jN9#˾2ds)r椙k"1p2qgsҲnm MǞش$RD ?R׸J,S jl=ܙgy2|͗;9Ӿ'P=djjP W"@� @� оK$_Q-UaK7sIye,_[-Kwo6,e)nfvK0Ugo7Ö^-c2?X|UYlSJW됭xz\c gsr:`<)sVHevGKK`K<39wK;. @�ځ@v!i" @� @� @� @� @� @� @� 0e%wG֔ͨdJ^kl~]&_,Y%$룏>e2b3DD5h.oih;;JYzד愧eiYeղ4'l-62kYk Y+X�u)`f ,,zJY$ʴ(.x.V[%_jris- @� @�?*h{VKx YuQYv٫Ъ_U㭯cͱױK%j\Feo߾uQw/H[JִWtYf%eA/ZN`+vжh-n QF},̀ܟe\Z.Y QcrH7S~]uEc  @�̔fʏ]  @� @� @� @� @� @� @� @!P&6>6*F/rW_}*!Ze)'.e"fQY/hZZ 2)bNZWa =K8ZY_KV3lAk t^Z9޽{,"YtE\/)A] ler뭍I-7$TAf_3 @� @�tt8T…ʸfY+]էXYZT:UUW]z DTcu7`rrxo/'-dUBKy.7x#C G=-øJ\3\ ϬZvyEi{Q/~|'lgeߊ+j @�  ˝@� @� @� @� @� @� @� @�tXս{^X^/~饗 .W%efmV-T攠.6lӬ L.]ԓ[ .'4'm.o2g4[,K,D,-%\23OpKnw OZj$@� @� AJ/u+2ƺ/%j?TaZ;LϞoW@VfFo߮YfUL,t*Hgu|Y E(cz2&?9i[Au {Z>ÖKkgָ^~V]vm9ԧK/Mn%UVI<09dy_;\� @�I5iN"@� @� @� @� @� @� @� @�ڡ@ ֭6 6yĈyOg{V7CJpPY6|z袋hM?dM@Ϟ=Ig{Se ÇܖnKVYp zȐ!-5=[/}K/t5ĶsƤ-'dUXn-fFu5&t� @� @ 6, ^jOl-6K{1FHkۮ޷ d]o5cTcB~sg))-PRʲˎ8_[-ZZp:CJ ѣ:3}]dER5i%,%tK.㼦\`㍓{M=7я?)9YɁ@� @`* ?ϧj @� @� @� @� @� @� @� @�' Pk?_=O>d? C^xᅌ9L(RK�mYJ)e)ub6ݻwo _}ݔSYJ]s?g}6ov}jY Zfe˷,%kf)ϟxcf%\{$@� @�hN=sϥ_|:thKg*j:XnV );;F- @` 5\)ʳW_}5Ͱnn?##F[:KT͐o߾R{%�Lr·~.$?i'gg?;:� @�' PkY� @� @� @� @� @� @� @�hcÇ wjcj#y7裏,=X5dȐe2 r-_?ԧZ2AB >Yqe\5PgykqySz]kJׯ_V^y庾RwG,s̑\uUcr|&ߒM6=' @� @�"PB~-%@kРA-XhZpv, cz-�6% 7>QFW^i k 80J _>묳f%RK-^e)|wK.㻌c 왜xb%^6SS!@� @` Ԛ.M� @� @� @� @� @� @� @�L[>U_z<-C=_~_` W_={wKVS!@` dYJ]2zz2ͧz{s}KSNZRe[WnwO.4s䳟M.,jv '@� @�heL?c,o *a9}Cm]wjju߾}u=AO5�)йs,"z})W_M k.<L̐!CsJV Z~X[n6l׎@/Nn)ַVJ=49ꨤn) @�LN=/ @�G3cM^}鳞 @� @� @� @� @� @� @�"կ Jhڷ㭷=SOw]wۃN׮] +dUWUVYn3e]@(y=XJX^sy3jԨ,bYguZ5X]OG~%^*Z AR@6&dW%@� 6ݴq%G#<Ҳ.NoeY*aZ%TK!@(_ Hy.P!>lFN:e%+~^zteF5M^<8FVOd}Rj @@<u? ZSnL?{&Eq%I""dAYAE *YUYúb`U1g*Yd JPDI{n5=3=CL̿V=@�('!� � � � � � � � � � � � � #]$m*^>!nzj}2eZ<K~gŲZh6lJN q;vh5kVj 5 o^ڵkJr?l ӠAҨQՊ+B�*@q> � �Sn:͞=ۯ_Ν++ZoKr|4h +ł�$Zl/Y0 mp%J߻M͛ŊKaH_]2 .լd0ݴ+  � �Y`>5K\Nty*^ � � � � � � � � � � � � � � � @~صK*^<?H2M0A~>3-_'<餓tm۶>%cA�+PT)iƯ–-[4c M:UӦM3<۷|ݺuS׮]աCٵ.,=TԻ4f$r � � � @^ ޽[s0M>=xV}.o7n5jUWiƲuY)ޱc[͛7>ZQ^zIjq7ڤIj/ؼVbEǥk _n^i0^@�@�r_P-,-"� �Gw-mPpH@�@�@�@�@�@�@�@�@�@�@�@�@�HOʗ^~9Qz~,\Pƍرc5k,UtYܬMNԹsg/{w*(%ʜ8q_KٳG۷W^UV8 \9RQ=aJ@�|)qT4iܿ!2(@�@�.б\qs~knV [kʔ)9sVy7YвeKnگ͛7WʕqC�pE7 ںxbY {+4h67ik.pfFI7$){tR#� �dQ,ENA v@�@�VNrO@�@�@�@�@�@�@�@�@�@�@�@�@�b8$o3v~"eEnF7|SWVVԣG6mT J{Ɇ?Cj7n}sU:unVTk�魷LA{@t� ep � �9$@A8ų>c߲ZV( kNm۶U ?wE�|*e͘1C_|_Vڽ{w&bu2eSھ]?6,I'>W � �D 0} je͋@�@�, PP+d\� � � � � � � � � � � � � @-9O?_|ѯ+WT׮]էOqTR\ U4fۚ6m%\~\r"Wٿ_:pAO?ZΕfi($+�@�@�!l1l 1W.9બ[]{xЭջt jJgh( vW_}>L`ٳUX1utpݻ_V5,FA_6L\9"� �dCl%)W"� � � � � � � � � � � � � � � �-{Txbz7ydy晪Y>C|ڰaƏPL+!=D ? ԨQC]wONzjWO<U曄v"ȑRNҩJ%D � � � @_ի.&LЅ^ӧQ4h iٝ!�&PD _9s֯_g}Ve˖sGy/jK/i~}O7ժWOzIzdA�@�@�8 PP+N@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�O`׮.5n8jJ~/h"_.Sr!@"ZVo…8q٣͛Nӌ3ܥX17-SN>ϻD@�@�@�@� {n .BM4+RK.{ &r @ʕuEڸqz-UTIW\qlNaȐ!ZxqK>[n|rUjZ3'FA@�@�HL<\ � � � � � � � � � � � � � � �ATqQo1eSС 3<Sk֬ѣ>uƹnرU> \nyGrA)o/ BoT:udrO=z쩇z(׺h6l4kҥ:|1/lRVXc=V:uҹ_gcqxqw~nݤkvkn� � � � v?W_}N8M>]-wRܥxhΝ}1/㉹_߾}^yPB(k :A{ɓ'bO9y˷؜ՓO>h*N/J Y|eA<M 3ܹs@҃JI%KJnDW]%mْ/ˠ@�@�5 j5 !� � � � � � � � � � � � � � � @n XA-+(޽{}ϓO>YZҏ?*SLt1ַ+W>ŝUVcƌo-Ƿ/bC R.i&M8QǏp0mgvmvsMfG^zo߾zUHkN|A,9~e˖6jlD4h+?P:pQ_x]@�@�@�@�x7Un]w}+zj=> x… ]y^r3uVv1͛Sj/^ x+||ҥ)e\yNc߆ 4uT?BH{ks]\9 2Dg}磚7o/buI\07Nz-4� � @b PP+A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�8 $RA-K$٭[7Y"ӧkذa*[lG[]{{ֲeKp 1YAK/%Ϋ e뮬\ h3=1'Cv1]tQϺջwoC˗C=+K.Ѯ]R=^TVMx ~0``^-L|"))ؑW=]@�@�@�@�l۶ׯ;<-_\C1'ϵx J.)s3n ޮ];׌<ֿp ݏv,$y7MGoed~|ѽs8sξU?~|n4'm\tdtGN9E< "� � MIj.:� � � � � � � � � � � � � � � �$`gp\,-3gΌ9ad^FyڅEilܒf%qʕ+]~q/dcYu3H{vm8qBP[O\]M4IOBdoׯ_ V;Vlٚ6m(+>H飏%_.ejE�@�@�@�m_~EV ̘1C>ʕ+݈[{˗Wٲev(ڋv,tmcY5Icʩ16ol95Y֚;wM~:kU =?K/{gOu@�@�HzLG�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ w'FAZ;wԄ &%K4rHYQ.?9sVҥ%{JK.."-_\ߴo>Y!\}u]wi{ ֩7}t:?s矯kƍzG5o<)SFOi#ݛEq7jڵϣFc{|1;L=?VjժѣGkŊٳwdrI&gՏ? $Y2X3 ~Mo&OMz?N:iÆ zwO?iȐ!jѢA5h?~*8~v.Bs \3Cp켌ڱϒ7|mW4v̘1zͪ]OXNt3%dˠAd}׿_g4B&Onپ}{3;>p7}7>C>|n<izK.O%̳0 � � � @V1ٯJMƏco,vY|{k̙~V1{vk[{7_W'^|N8ׯWӦMu-\ſ_x}'>n{6SjUEK^{bV(֘}lﻠťm\Ǎcw?lQ,n36m3x kgNbŊf͚y ;Q;V_V%=z.ZSN ik}ys:U(:묳Եkהk3{66m!6pc|k_۶mu뭷y[jر~G+O?׆ǚ҉(;d4琑uf} 6u1ǨK.It䊈Ic|)N>9;w@�@� @5\F� � � � � � � � � � � � � � � �I j}yXA%Kpi-e2,0ZKKhˢE|2NKiI< 0@f , %2=l_OiA1#FCj֬/TJ\v^A>e dIiFVˎ['h|"1+gDvB=WǎY+KhKq+vwdɒ>qm%S<}F͒2F&=lKؕW^oa,--VLLY<oH;䖖 Zci+1X8d֎ɒzgʒcZُ?"ǒ޾%ߵpV͊RY8,glh\gq|y3R|y}">ڿjɲXLK$jٓnZ.d? @�@�@�@ ~m_^LˊX"3Z\ӊ_b,hu1W_{O]wjٲ/loj[\aÆџObq?>ڧO=jժ/ҕq}ٹsg?`>V$K.[bk֬9fOZ<{~nRxŪd˷e HVv|*+e1޽{ٶmu;h<["52j Y?\,y|q Qi%Vm֭[=gcs46pUW驧}i~۳gOʊwlq۳"kܬY*&@zKfs9dd^[t~#믿>mVUKnnSҖ-ٺ!� � P`(U`5E�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@` ڻW*^<o=e_xK.yۑ,nI쬠TrqIv ZYB_~Yw8/ҟn mV+(doXĿo~r }Q5k@diK8j 6-ilձcG <'._q~K|h 9#իJjſyYXbIKbiV駟W_\/vi|*[lwܩI&"YŊcI%Uq|KlickJ'܎%WoO,q%ִ%2C,3rH_xεZ˗/Ŵ,d,}F ."EdЬSzƙɖ)S'bm+Z\KNjE7lؐrɲe~:uR%ÎX yw]W=~;ݡ � � � �i>c_^ziI+WiڴiJc[׽)O8g:1[l׊5jHm۶q͛7{"͛cïK/qKt";S=z;xm=3PXܭәg雽[}%[*UdEY2 e8Y9CԣG߿ڭ?Æ Ӝ9sg|_ c7e֭xз>ڵk}Q9+v'XM7cWflj׮>ȟksBXQ,[f̘iӦb[gǂ>֭[c6b&OYiA9̬#{pB_D0k߭HnKޞ4\-I@�@�HGh:9� � � � � � � � � � � � � � � �$]uAdE,dɒ~8VCԖ@W_}OFSOe˖%k P9S}B1cha_M6VSo۶%{G bI 9HڰbWZ1[++|d۷Oi Lі-[dő,QeG{m$~XҒ~$&X- %mYfbi+15*SXڱWZ57KBjm޼Y&MȒ^Z S`��@�IDATlp}`l3WkbGpmzf͚kE㬸dĵǏp ].\.\R`|Ƃ� � � � @ [іV0bViʕY}Y]qP(_]GqjԨٟvŚ-V]lY̙3-no>nũ Y9D;->m,ZLf#ccW\zPXݭZ0U\ʤI{nl礷M/o ~ț-W#F#cs;ޱO9?7 Xm߾]={L9-]ll<6֊+{g lB X-W&,g-r~\`ٮ:hm "f徛O}.o,@�@�VNro@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�3/QBj0Ν;}2nݺj۹X"EԌ-䃣G#<gyFN9ϊNs ްD|w!]`ZbȂZyC 7ܐ|Qvm͛h" a#"VREwu\\ĚAX-a-x2ֶ2C,|N}|3s$/8 dd3XuF Ή&qf>|vɓ'ga%KhժU ]H7'%tYgIӦ}g@�@�@�(z;<_`^z#UW]]x_y啚?~J1 6SʕKd1VZi„ >ۼys~zu{sҥٳS+_DƧ#ێǣ A|bZbuZіus3:*gx!,Zh!+գGׯslci'X~,qWA`Mgwޠ[+vgcNs:j lԨBlIs{9颋~%WoO>(]v ԭ@�@�|#P8ߌ � � � � � � � � � � � � � � � �AA%"Gk֭[ߤ%+c=;v.T\)l#VթS'^RYR;냗9]xݺug?utܿ>'7߿,e%HcC,D3ʱ}^'sIuf6k=N;MÆ s%tuשFA >ߞg;/a(_~9\H1_� � � � V,Wm۶:]̆˗/-RBf\2e{zub6oa|.?cC:24X^vUm/cyohݥ^ꋴկ_?A,Μ9LN,qvXH*?ywS^mٲEyl`ցdsCіD~:Z?ؓO>^{MÇOZ:v+(7*W<QYZ,ך!@�@�ZZ x � � � � � � � � � � � � � � �dW Wxv{1,YR~O;',1%9[ԣG-[6ZSLI9f;gO:Tǭ@%;uM7iҤIc9FK֛o:K`xkժU)2 EB/dlXFqO?4e02ט1c|1nݺbŊ]fkFzXl 8Nz}UW]usՂ t'jڴi=3cY-{8VZj?J?+VY;̏_}uي,QG^u!� � � �NbnVbmڴܹs A䀭΀?{񅐂-nqN[m."xI/n~ӦM7;%Ohh\d>sz<YvϏ>>mqr[l>^عsK`^#vR.NQ>ͩQ_܋-/oߞr?/D 'rn&{8qNzZsi$2 xp޽~>#FP.]xwɖj 濱2"@�@�"@Ahq. � � � � � � � � � � � � � � �$@"Բ䗟kٲϟAaȢTVȖ-[ʕ~ E.UT9 <8-Yr]j往QG};'ӳcڳbZFE*8fh ,C뮻#]v:բE֙nwϱB`Ǐ}e駟4vؔbXv҄ R6Z1{8plxҊYQ$K8}tرC?g޷vOUywpB_D|1+^n`kk֬HKo 9|cƍ} _-V̊5lP˗}v2Wl,s=?XƑgϞ2ǩSqY>ռysm Ukrei8B|Ґ!q@�@�@�@�_|&M8W#cѹٗx6ƞ?,֣GըQ#U,iӮ]{_dB /\eʔo-?䓺+կ_? ><UX-A<c6l~ FƧujlF;Or2cѳ_cJ`l´V<âE6[3gK4hmÖw}W}YL٧gdK.QGe1CW^ twcy66c+$fs7Vp̎Fls^|Eկ__,g,bk9`]^J}O6m^xT"+QЬ|ϸ\qIiѢD@�@�@ ( � �cB+`@�@�@�@�@�@�@�@�@�@�@�@�@� ,XtG};O޽;tJ(C.i_#F]PڵBP%. !W+\+rrʅ\T6mZ%?Mu,x;Pɒ%C!W(h"K:]u]oC5kNJ+BU%+ Y.h% AS1m]PF=\bO?rB۷D}f͚i&TRЈ#R}\En"EBr{c!WT# w}G}ԿnܸqhŊ!ؾ%K q)SBu=C}.Afc3m%t 9l޼9v س6u놞}T֙p_gw!t3φskK4X5rH9 7:p@ȬsBg<8c ۵kpҥC.n^t![m~}B\�x U@�@�b!O.ի*V{BQhV>}5[nrE_"W!G[\a簲_>{]w,k|kq|W`wo5+rōRٳC?vˇnХ^oٲeq o\AhXcQ;̓-x?a>B3fs֎;~L[5o7EUX{nBs ժU_9+W�J*!W*:d֎D΋}!WH_QޟW,.d[XѳB]vl餓NJ#7ٜy>k.䊧.=e+ڜCf4r܉矇t/袐+l]TiVP!7 ݛ] � �`>5pBv1@�@�xq rn� � � � � � � � � � � � � �QfϖZ/>:)yv%++ģoF.I*Ąy֟l%+n.wpEsھ}-[c9,WZ%WPKX\D*U*. LА!C[.Q\q*)DğrE䊍$ok֭rR} 5%_K`x5 v2k+mӾ[g`d֎e׮]r|\2?}3N;sm%Mխ+^zI.!\2Pbl/;ꩧRϞ=5l0Dt-H/i� E`F&M:tr@�@�@O;J/=؟@;w'C=c\b6i̿/7mڤ *xuQYZxmb)Nڵm/;5bie5fݾ.^i{03{{ţuɒ%Suş Cy ΋f<7.aW ,9l,=~x~}*Uf6wm!;΋c[lѨQ4b-\PN?I6ϻyD? _ C2>#� �Y?} jeߎ+@�@�('!� � � � � � � � � � � � � wSOb>Gqqtjɒ%0`jխ[7.&EzP!禛n%clLi\i]k"-m_m?FVXmĉ%3gz-u%tZj]ΰoKcJnX78Sy@ Bp"� � �b8mz|q-6h@S߾}uFn=Y>X[|y|&kq|3Zׯw]uq? Xᴏ>ҲϢE .5\tbXT8P3'\\["Eb@�@�@?ٿ+@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�p96RxW^u>|;8nZ_|OZ\|nr,͛7ۿYvmLIkn=m%XO;4կ_?a,Y2͟\u‘#G_e=\Y?>wP}x)ib332ev\� � � � G.?Uu޼yz饗|qC.cq-Zpql[%zl3}%JȊe39drQPOFWh;owءN:iĈӧJ.eK^=/摥;{OnFn)["@�@�FP-I[:� �$Kw-mؐ � � � � � � � � � � � � �$Ho=49bk^xtʕڵO8g A+Uȧ_,Y"Kińx81>pVZ1cִiԴiS]r%ׯ,m~ZNkRz]P4:Ƃ�䌀˙]H4I!g � �7@I=F9p zUxлu]tQZrSs6~ 4H#GԾ}|kQ ꫯgO?ٳUX1utpݻ_VZ mrcЋ} VdnL � �`>5rCAq% � �bQ@�@�@�@�@�@�@�@�@�@�@�@�@�/;YgI{JE9}ǹsjz7zjjJ=z)D~oIm\ʗ/}^`:u>CYB q۷/"WNcFpCWmIwޙљ� `$s� � @(uXX誋XL?ݻwZ۷WvԶm[կ_z,Ir1$yP7oN5%JւlٲE3fЗ_~)Sh ~_wSN92,SLAH1n{ڴ^|Q:@�@�"|jQP+F(NC�@�+@Aq � � � � � � � � � � � � �'jQ %K,%;vƍYfbŊС:u䊿tV }@`5aM8'ܳg,駟^zyе<k'+__4�$� 1I@�@�V?;wjڴi>e`fΜ /_^-[T֭ڼysU\9;D  @s~ʹY.^XPH5j67ikN.Λ'/-_.=t%{@�HVS(};D�@�bVLL� � � � � � � � � � � � � @^z)\~<M|O?T}K\vN:$mo-h%4�'uV O:U3fuǫ[nڵ/WT|.h�"rAsaB�LpI. � @BPP+ݻ5g_daV$f͚5#իWWfԴiS6n^" {;vų湪L8w\^[p:uqyǪի}{Cza$=\Ș/D@�@�\`>5ʾW"� �1 PP+&&NB�@�@�@�@�@�@�@�@�@�@�@�@�@ O?-zOe/4e]x) hBڰaC+V,_[08CbΟ?_flWjҥOTծ];VT ΝrBJ@ � ࢩp @�@�(Onn:WL}_k_L&(U\95jȯV`b 4a[ݣ@ .{ղeds . ?(QYQ"Ezk۶eKe-_^؝#+)#խ+{z$[˖KWAL,/%=ԳA܌K@�@�*|j9fRD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�W/Wώ:(ϯv͛7k̙>}f̘wyG9wqB:'p_?xU\9^]> GoѼyR'Ĵ߈VZiРA~۬Y3*U*zZߖ7 ^|19M/@�@�@�@�b8]~ شiSJ+83w\+ھ}? jYa`=U*}*Z4ρ#[}9NK.-Z gYQB f͚"}[۷߰"EDp($}m~pq-ۺI n[s0:H[_^G sC@�@�\ Ғ4� � � � � � � � � � � � � � � �'{w(V|޽_V^ZP[~aY[T ʊkٶvW^=YBQH^j* sɒ%ַ~+[lbs1h^մiSR4/{Av *K$} @�@�@�@ 9*V*b19/^8;hƍ4+eE0]?fKZv@ hݺuZ|~G]l/e-r >}�yC=4K=bXG^;vL}ҊpsO6lk͹fuqMAyHFp -+RK'KF � �y!P˂� � S?.}Aݜj"� � � � � � � � � � � � � @j{^}5-;2~M .LY4HW\9_X˒Y:u꤬VrF`6i0mD.u);ر7zGDVqjԨ/Մ93unON8! �+`]mVM$p` � � +JB:z챂1<J+ro;q<YV!WO)UfMըQC[bzSM`ʕ+eU7e^sN3+UV-_8+(lH"5CgYm/+u"oJ j 6hgLb5EIӦI'pdX@�@�r_SP+v\� �$@A8 @�@�@�@�@�@�@�@�@�@�@�@�@� *+͟[Z1.]@-Y߾}+U})@mY2ŋk#>?`%m6{s1ݱ h5pY&mw,#ԥORٲ. � @dxJ@�@ (hO$g}v8A+,+Vq#]5ի5rZj,$ͭ[Nk׮W(~w^?ERG߳ڵk… 'M}X-+e…CPAjX:jVDjBthHw)ٿ{\DŽ@�@� �ʾW"� �1 PP+&&NB�@�@�@�@�@�@�@�@�@�@�@�@�@ 7,M,͜[Z"?Ki-[Dv|ǎޥPBROgŵZ?[8+V@:2-k.WxT 1-IniӦ+e0#b֩SѲN2&L\>qNuRo䣁1@ H�w\� � P (U mZ]zuB;Vp'ťJqu]Vc9@l޼Y6ljE~vաҮ]�% >shi|@͚5S)R$G7)ւ7JP~8>ߤV|%6Y~[EN9%8 @�@ >̧f߱h/J@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ qvO%[, h}+Vʕ+S%0aOYD(H:}PF[В%KFkcmR% c۠֯үs~QGD:u )fZTbŔI\Ӥ#ݥg.,qJ@�@�@�@�_\rjԨ_olY"=g->sE!=Pٲ\\_;0j#*U"x8p@/"+eͅEٓbd݊,xU|mEU&ޥ&!ǡki<ig}ԬYxm\jTn%m@ܹҐ!RM7I0,@�@�H< j%3G � � � � � � � � � � � � � � � +UDn-bWj*sڵ>h~.^XVxر#KV*Uj>}K$ m[|yYBؿ, bF[bLKڵ+ʖ-*q@%$1f*|K[kڶ#gA�@�@�@�@ *T [Vz k؝}2{Ewnj0{P Kun"b]5` ^[sCIu/^ PH۶m+oemŲئM܀mվ[lՊ\ʔ)�Q5lυ\U0/f^Ѣ{;…zk߾M#PsH>c:u$+ղexkEJڂ>zUkWy!%Ya2@�@�UPv~!� �Aǥ0@�@�@�@�@�@�@�@�@�@�@�@�@�G`�b9'O驴uV_Xk E"HВZqȥH") =4/W[-9-SK XWKi%\-!fڒd}V}{?mʕbŊAp[3xm 28*U*a}X Xۥ3)ژsEՠtNI@�@�Q:p '׹s%O9E]:DP裳P-كX{dq`߶A5m,Zb\o/[_qҥKV{v{衇{E5G}~wsW}mi_.uz?u?K[D.#m3}NԬY~mM!ƍ6m֭1ag{ KH'X!ԻwoŅ � �10R:P8#� � � � � � � � � � � � � � � @r -.P{$ެW^÷V$)2gd`߶+\f % ݱcGbIA`k >-gεc%KLZ"[CqIMjn KT}㷶o]stW{03j3Ym1O{NABjժUSÆ ~P\ͶAbJ*kݓcD uz^{-|}@�@�@�@�/jߗ>H..լ)/]wI;K.Lb1 *nݺ1]c'Y,[~FVkQP ɶv… qѶA=md >m\>xmy[Jd[Lc]ݛj=`?`m.�"}}[)_yTZU^[~0]NT7[ ZH}}k&> 3}w??>>rp“N o5  +.]'uda CAx֌@�HvB.JA@�@ }҆ K� � � � � � � � � � � � � @[QI#:X}زB[3(ؔvkE{  "S'~bY׸S.]Ki >#vڱjm^[2QKm,g5hR mk,afzYY"`kkP@ޏu-i5Z2+ekd$o,oH+t9G�W`FJi$C'=C�@�@ :v?^zD}I4իcĉ 9p! DZbБ, -Y=~OoklxuvŶl?5uwqSoǂב1{;u˷m侹FX}fkd,6bV,"g{ H9 صXf92\ΆۣԯԫWx.1pp? 3G:5N.Nh6mvq%.FD^{M<XؼGo� � SX4r% � � � � � � � � � � � � � � �  B=[KYR%ƫ'Ғy^KW^YJ'םwuɊmkP*xY*mѪ e3ZѫĚm| { h6(ę% ^[BʹI5=Kʂ@2 JZyI͚IG � � � �$oKo.RtsIVHbDmb15{w*1x+#Ťh|#ZM|~H9LA<?(reG{my[ 9A?r[jZ=qP ,r?8fxuPL,؏[|?^۽eq]֙gmۤ1c$+$dJ kWq%˨gVGVmۆລK/L^zInԪw)n-y[4m*sԤ+ᢍo@�@  vY@�@�rJÁ r� � � � � � � � � � � � � �t=V1"ڻC g&L.0to(Mi"@ !5o.v4q"Vi:ƍR*ҤIRy E�@�@ :v?^z7%K7 Z k?g%u,W(gG^{XfƏN,^9Ko.5}TtҀǶ`^qY+ŴN>9\l[7?;!C_33=9F� � |jR>Wcp% � � � � � � � � � � � � � � �ݻI6fd>%KgͣV?5z@JFf͒߇+@�@�@�@� UҰaR&ROHmJ.['=ԣ4jI\7l\ ]voyӇdljUJ{i@iH~wg[qd9;G%]tɳZ?.U,=Ԭd~…:,%KJ/(!=@0ߦMet@�@ Y(O~#� � � � � � � � � � � � � � � @vp2C ތ%k^>\zI7v{n� *иCҽ&h7 � � � @ l,=Ԯ]ҿ-h!M ].չTHw,`4jT8FXh/ DFuꄟ|TF#Ej,Gfp^ ;?_iÆpjդMC93|>BZ8<9s f � �'@A{&@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� {7-2xMۥٳI2@  \uԽt磁1@�@�@�@�ؿ_#$+sR{<ԩT vԤt9yۓ gFy'o̭V$知NE][.Ɋn,Bƍo>LڴI;VjZz%U+åAq㤝;NJ=Z!cN>Yz =G�@�Hn%= � � � � � � � � � � � � � � �#`JHM#p;vH_.+'͜)wAޔ@ ){N7t@�@�@�@ VICJ5jH=zHWKoK:86ȭL/N^/&]rt/uo!C3o>[zIcm+gX J={JO<!\)-X ]w]sraIg%ukX?P_/ܷ/A@�@�[Z= � � � � � � � � � � � � � � �#`OM#p J-ZHo%NG�R\##> C@�@�@�@�,`Euƍ X9hgモN.L*[6˷vsg[1+?㎓|PZ&<7tԻTt=O?ů-|I4}v#ҎҀR*K*mߞ<c+RD6LBO?-uNyz@�ϑQ � � � � � � � � � � � � � � � @](qx eKbEip8ܖ[ @ stҠAү&`> � � � @L[H?,թ#qw'VNǿi'S*$R LII+Spp!McH@h(i[gt}=|{~Ƶp+m*ORF1톕P`di4{6j4a+UdMB'Ե4|TtҤIR( - QCSz]iJiB/,չkҶm=Bnץ4}dtQ_9 � @ 瞖#� � � � � � � � � � � � � � � 6peIDWօCK_#vB�B�Sm@իRA@�@�@�@�<d}ŵjIIg!-\(YK%KalJ*n=puIKկ/ &X!#Y# VNҎ T*]r[{yI =:sfn^x5k{wl� � j � � � � � � � � � � � � � � �$j)Mq$0md}4et]Rtp� #P҄ /]ңJg/@�@�@�@�kkW)w-��@�IDAT-sߧQi5̘͛!rRҕWk ^JI^(M*͟/v4dH8p⋥JҒ T?PZL7αU+iSGksrávs4thA#� ��Z~~@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�TJNѬB�}{E i\mB94A�8DW/뤟~ 7bcn&MJІQm@�@�@�@ f͒8CjLii"JR&E~ҙgJ-[/@қoJ=L5iس'W:H㥉;Ŵ'7jI*}H Y͋RCIVݥmⱦ @�@ JH@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ R(DV~H`ŊpK.U]2СRR=C6fϖ> EQh6 � � � vrUsJ]Jŋ'`r^{-wyUBn!w(WNp֔)RժRNRÆ#mPxuH-pȑүJÇC[,1륷ߖxC:$i͚6v � �)@Vb7j� � � � � � � � � � � � � � � �Yl^Xt+L,<Y3H1CLVd6 @ٲ҂},O;3؈Y � � � �q#`&^J{B3¡qSQ*Rֿ7htywz\l`i+,ۇYr]wIjIzIy I*Tߧ_}%M.5n]dГOsrP@�@ JH@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ֭jaG6v�g̚8bf4#@! sd�{wiji׮޼Y=;<~!� � � @[3pi!CL^;W:문.*d?i<iB>pWsKO?i4yDZBn魷@ `U/(-Y"]|tҁJ7,\UC MV՚6D @�@�G@9@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�v Ze@@l HG-#3RrmZ |taС ;t)QB:uA�@�@�@�X.}hlm,ϸkWXk-0{<S:;Dc~}K 4*I7(4aqtRVĉUXf˥0 ϫWG/^@�@ JsH @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ @UtD  :H̑t`%f!�Yl$uWe683@�@�@�@ >֯"hca JJeGE|4sf8&>jZuTteR(mY`rßsN8h V-~GK۷qk Tz\D2DzEɂC㏢o +.@zѢ5@�@�H|@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H'eKxZ`F`$u,g%}Ix�4+ABϤnݲ^ci׮c) � � � @ X?MӦ[o@^{MYO{SNZL[}sIӦIÇ'f֭ZI'J~+sԳTCҟ&si[NʔnAZ8cRÆ҈E,Hzn𾜜[E�@�SOL  � � � � � � � � � � � � � � � \[CVrl͌RG].]СRy�&P ғO'ŋg,i4o^˘� � � � P;wJw)oH?_:"?.GHL>>D0 1#nnE`.xhX=:tҁJIkSMKQ -+/ԭteӧeǶz=#RҎE_'j� � j%y � � � � � � � � � � � � � � � @UL+(%B!i0Mifh׮n)iA@`J3i3S @�@�@�@ k3ΐO>\jղކ-0xp8|B:H#ߞdmAZCI˖ÒYeZ7([vTv=4owW_-߹,ĉ9HU � �*@V9� � � � � � � � � � � � � � � � ZKg RP<di@iPcǩaÆj֬Y jd(H-ÃXpTX#@S/@�@�@�@�X9s<BA +V&On9gYɒҘ1̙ ĩyjִzu;Z4vTԷjUj=7&M^|Q0Aj${5 oit6l(cs$@�@� P+9#@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(0}W.8KSm6lp„ܹ3B @T&ٳáZ{NB9,;E�@�@�@�@㏗,P„Z`%f!N¤[?6 4 (}]6#*^ԻҐ!K/IIKWB t6)H7 ̳ج}4mxԮjAc@�@ IJK@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�He-[­/]:h l&'vԡWR˖_|e˖SN@!�&P4`4yTTDP6Ha1 � � � @im+4eTfB"رM7eBϾpPXҎ ܐz2$ (i̘p-Hb47CեW^^xAzY㤥K3\Pf6i"}qca9 � @'& � � � � � � � � � � � � � � � @Z[ÿ JjlT(ѣÃUV7n6l͛ E�"8Do-v3ujTC"� � � �)&vtiߗVM1�kjԐ. ׻ {Nkiذ&DlYOɂ F kvd< ]J_~)m.yT#֕MB!,� � @v%[ � � � � � � � � � � � � � � � @ XaZv/ ]s\h4ktAi?~x]xig RR`׮]p-[6ݶm[ݍ<oc70exj3qZ }y?sΝ;elr#J;wF.V?,nTܽ\zW0̳i%2,Y22TR+ڧL2i @�@�@�( ݢΓ돑xCT(j1Q`:KO,[}7W3ΐ?<mX#ʕZzqåonIP!Km WQ#ϥ/:tyF޽p¡^V ՚2Ej X@�@�=ӄ9 � � � � � � � � � � � � � � � j% C7mV3F[6L.% -]T:uJ_ w4?M&6/l޼9=z_%[f>eAX9-^0Y(U ĪJԤI{-Y/,+KpJf[6?i e~lYN-*Fx-[l[^|y=bŊ|S@�@�@�@�w>~ LF볓LWIk37<,)NVp]_FCJktIukX[=^+7Y:d}{ *3Q@�@� P+1D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�l"ޑ X5)JEZNzMcnj5n85h@-Zx"@X�:wCw#4FO7nܨ 6(itpVfХdMիW4ɖ[S2eLe,\(ը1I*uOuZv~Z@}4>,}ڵkG4[ώY)Yp- ۪P+WJ*OժU#Sή)  � � �$С]c~uaZ&GhE)=trr";-5k&stEV*zWWzai`S|8�HH:TVMzw3MS\&ON:)e[M]8* � @| *'G@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ \Z)t][6m$|2?~ r[I`ǎZfV^#L³cIK3 9QF$4J�NBSŮC y6?:mɒ%i~[t/{уjndQX [ͳ>?vMR@�@�@�@ \.H:Ē4I><jHmY`Di WxeխaCi03ϔZ̿} '  ]p}ImM8j /~FK'梩S*Cڵ %ThGE�@�Y@x>; @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�r%`ZejS6J0K.$ r(3gjҥԩS�TX~V\ǂhY8VȒv UF]L6Tvm>TjU‰O-(@nJ>+W?>z۷3Z0\7o޼wm۶]�ґp- {オ~ew}Ud4@�@�@�_``~/ (ڵɂ)*YgIźEw'!}\WⷉHuJ/ 'Yu( *vB(pUΝuׅ޽FB&O:t_}$U4炣"� �*@V� � � � � � � � � � � � � � � �@-5_l8etERRK[g_qƹ#~e@ 6lؠ~Ii6~V{P.{: B,  >|, 7 j\9mæMdAs l{ő͛7GaatժUS5t1yj"l|A�@�@�@ GI' "լ)nmb9S>bY;yqV5JjT80|%OhIҤI�o5 r}+>}$ǿk- P � @ 'j"� � � � � � � � � � � � � � � @jnk!y4ttyOKU֒ǫsαZę-[lٲǂbŊ~Rl4=Z³ljBŋ6c�YTPA[nk?k\E͙3GBBBe[]ԩXtQ@�@�@�@ @Kz[6Zi#H>Զm$z9Gj:Y[A:$饗o?+ YT꺤b-Lk*$լO. TˮaM]8* � @| _ � � � � � � � � � � � � � � � @>.;bq'tԵG4b^/RK,QNb߈5(D.-nZx B,'(+Vԁv,dM6iwj֬3E�"{> 6̲6o dz 0o̙8q~ڵL2`{5h@׏|H@�@�@�RLOߖ&OJy@\c#+ =seATbŤnݤsϕ  _ᇥNcuf$!r}KӧKV4kGVќ� �ğn5B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�r+ur&(I&0n\8@eecI5pہy9ېG;wjK#E³,LBTTԫWχeus#\ZpN!,'O B lpڵkOfձ- B=?&M3Ɗ=#o^FtAĒ� � � .YI'[#FXԥK%R W`[ny$[4 Ӻ2o_cpk.EJ X3Ƚ8C i}j;GE�@�Y@x>; @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�r%`ZKjS6CnA9Rjs6~xqB[lт Sn7ce72av΍k7 4ի'# mB�<�g=[,d˞3/S {WgOƍ]0e9Cf͚y � � �$H,}iփ_ l&=t啼_.Gz=Wj6c3&JI~~gaj{KH+&GiEY&HZ)S$WPP � @ 熚!� � � � � � � � � � � � � � � @.%\nR.үJ'J眓JΚ5ˇt)w;`+2BZt͛s}@]vD>$˂k;<YA?UTdF�r.`7losN riڵ~ʕ+iӦ:լY3?˗O;~#� � � wԾtiFVZ~e,`BkHW]T۽{8dK RM kٳ'CzyiPɮbR#Z\'sԧcEz ՚<Y:$];iTnݢGF�@�(:Ξ##� � � � � � � � � � � � � � � @ l".]@;g&R߾R˖һJkR^=/3 , ʲ/+mܸN:>s~z衇QF*UT.f @/^܇5h@zjZJ~v)hϷg}V7ovGyjG[hQf4@�@�@�(R ! PkO)0h85njּ}υ):穧$ŭ~#R!Śuu҅JH6rd۵@I^&MQN֭]ժI:i4gsՇ##� ��ZEQ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�nV-XNr?CAR,PGA 6mO?Og̘ukઍe3g}6mT+WY}Wi׮]Bvs!$x=DMs\ڴiC"@�@�@�BxaCc=\D m߾}A`̙?,VO9j~IO8 .=W:` d^]zI+=-jJe&{S}/>v9,,Tk$>k?.pd@�@� P9" � � � � � � � � � � � � � � �j)Sa"0mԭr<4eԶmW_ij2`ZSNՇ~觳gΝ;UF sm�n$' D�FOt =F>ov[9эpzHQ#� � �))_/KI?g(%K$PkfD .5hp E+VPZΝ +Z\99R`]+rJQL tf({-M,ԡܻ;ɂ( � �!AOj4V"� � � � � � � � � � � � � � � @ XV۾dlh}Ծd͝?aZf5n8խ[W-[LF:ڔG9shn@UjU~z7ԼysYP̲e/AC'_~jӦ aZy4gsH\ .?T7jKü~z|jҤj֬.LcǎՆ @�@�@ ^{MڼY5 sWK*;I+Ҷmfv>RC NZ@=tᰥUR%!˗˽+ר!}\߳dAnQu � �#@V8s@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(D ;bE8HeץaǻwaZ:uʿۦN^ztn-裏еѣG#G[n~n0G� PL2>hoɓ}'|+ fU쳏:t'|R+W,ڰk@�@�@�Tx9/ sXI_^Az(Z\{-=қofRBƎ~[3IR):u,LﭷUղ;C4V�@�@*ha� � � � � � � � � � � � � � � �.eTtB7fͤU.;bٳg$P+ TY4|OkVv|%\3g_՘1ctEHډ�什 R~q;UªUYN>d믿@�@�@ ֮__/vM/ٵ+uRٲGMV&YgIݻ˅KvQRWS%E]H_8H֖w$Wh i͚oeÆwI#mZu � �+@Vw@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(D@"!% g-͚.bZuرS:ꨘgعs^}UiFvp n={Ԃ 4o<}jٲ+\ 5 @TVMݺu=p-VXQ_~0ӧ,Y' � � �&^nN˼jenK|S KX֗_~)W)\ƜPA>\cCFBrH>TȢn]g'|(u,Q5 � �)@VAo@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�( k*SHAcpYFrRj嗥gʕa\2~xu)-N}qٮ[+X�Tݺu5iҤ<l<}]X5_ ?v#;~;t'|+Vpo駟!CM6\U2g ~իSO⑥^ QɭHu]:s /ԧ~gϞE>/ ƙ3goWǎ5x*[70a~gyz뭷{2b> � � � Sk'Ub?3/ZE7yK;N(O<!u 5l^6oެ:F^rrxիWTF q;q_ =X|6mԣGY]d͙#]{dAk'K\b ݃~D?4zhY^*sVwWzՂhiy;H| .eڕ} � @bZ"� � � � � � � � � � � � � � � @,Ptl&`YG<At)C[sd=ҥKj…W\yɒ%ZlYšvhYfuyy^xA?MTUV" ٱ`Xƍe!H︑ׯ_7h-KfIk׮Շ~CBmRnVrNĉz'ꫯyw߹dd9i^u֪Xq-ZHw"Ebջwo-p)l&M_~*k84 � � @v}W:㌬w@(Fn|'})eqk{C=T*TЌ3Y@/kV\_,g>SOBLZ:{+ ڶmiӦ?ט1c|.J)SF2D>]oRjTzl/_ܿO ŊrMp�9=#馛Թsg]uU;>.OksC-?פK>Wa#@�@�8 P+OC�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� lBV v Y6 IT^sܸqSZjǁ> 4(2G>)2#Np >PgϞqR/_ڵG~p[ij//^3a 7kƍ#d4z'x^&ᗃ> *5p!1B^ꫯ_[ok`֬Y9rd̻�.,s~jၷr֭OAmD*6g3g_y5o܇%R;+ � � @ \H:d}l ԲXKtOQdW_zRZ^{:Pr/wm/c9&sƃJ`"Xׯ_NC,Y>'}E";=[_TR鬳$TY!r"VX;C{NuIw^{{z:T42nJ҄ W � �I @VD� � � � � � � � � � � � � � � �in%P+H1CjBrc qJ(:?^ZlvGHNA ~s1V {yOcƌQ5R !ZkZ 9iZ .͋~* E#B~Ū\iӦk:裃1M320h[0h,kݺuT.*UaZ}ΝN͟?\i?( � � �d"`g}Wڽ4ɮg'-[Q=%X {Q% }Ōծ];_w]b^z)_w; li~`ĉӧ?x[s8p7f_dk}$}ta'Lc]OEuMܹS#G:v}Yai\잷ݾ;<Ӥ_xBrs( � �I&PI&Fs@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ,Pmew4`tIsυ8-ZmqazZh,XľKp~Go^Vk_~EW_}:Hlѣ5i$կ__{or>+WGr~ jaNex롇!,6x]dr->$?۔-[Vs4hkF:uC,X{Q60jtp 8n8_3?OիWGќ9sTэrףGr)';cC=4ٹݸqx t#R><ymNެXȎ]D߫UV6l*TϚ5K&LOs >SZp.Ruݯb=_O?H:u|+jw 27+_~,\.aIpdϘuW^ҥKuov7W5M=?\g?xٚlx7eד=<Y؜c0_o=.=MB,BV8 ׳:>3zcɞQsm[{>۳ߞY͛xb7@K^zdY)ݗXژn=~~^ӦM, Qj5kfY g}cpD9{@�@�(\ ڝc偭Oފ ~W ~ ./ˬ/OnF24h|;駟|?_|4!~J)u?3iZlZkVmΥ]7^x tsnKVVN,BrN8A}tur}r>A+s?<%1{ݒ{d'jbl_϶.N&Ж;#W|US=͓^/^gA[.Evn,ה#f%KdAuҿȏ{7k;ѡ^m}wl){o«c^mE9p%H{-rբ � � 6*.@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� 7PTt^¶y7P�fkת]v~K /v#Fp  ˱/؇UE7 h!*6@n[~ .A3XN4{lu-mܸdӾ08}SPܳp?PǏaZvΝ;\-D˂[,d믿Y%٠@-̯C馛daIݩe, (Y`ya2άέ]{O?lG&9? ]?W^=?̟?߇ʵn zB8/kѮ_ 6:\.;Ǭc9BjW-vt:'73:,FY𝅒YOcŊ>t﫯RժUe=n-'rSL s쳏~wqC ѦM?Ӈi* ;ލjvZCl_Y]g gvm\ =,@ОV/_5kȂgΜm >z}m�mׂlv-D,z+Xژn Z۬}]Gks"-0Bn8C@�@�@� Fec;߷jm߾]O>zltǎaߏ< y%7egѳgOY_N~wM'x/||L]Jɳ{]~۳Me}B֟df#<ҟC 1+][N,Bٝ#{71c ]tU {_!e]siϺe˖O=Kh,V˘k֬G6lSY?cםQUIW^~_h]XX)?k_>B?޽袋裏f͛ 6HMe7l[ߢE|_FwP4ɽ#{/{+X2&'&tƖ � �q#( � �(0|x(>x�v� � � � � � � � � � � � � �iӥ (7L3(;оB B3gݡ![nO>SLqׄB5 mݺ]owuWʝtI~ w$ʕ+.t(Tx. yꩧ<_rZ 0 <lÅE#C.+wUW{кuzn͐ 9_ w+yeȑ+v�$go��@�IDATؑMZ\X?n0H[]P m޼9Tt5 >rArn�` X %? =˱욷WE< 淍^?yﶽ$m㣏>t`~ukO2e3ÞY M6s:}}zn@PJ"c9SB;wAzڌZ׶m[_7?;ڵaQtq~nP^?;Jvڵ=hРȮbicd,TV>Ykĉ~ ZL3?Q 6,TVD~J{ժvA  � �(Pra]ڬu{?l[_J6m|_E[z~vF}?7b;Ϭ".]r?.>=~Ie^dZ\M(6Z YYfwm/9wߔ3H]K6K3??~ FVXߟqؽC?Kh,8!C;9 X{*U*zG/xX)^u[ Ԋu^Y޳0c%5c]yѫ~_X_3l];}_{̿|s(TD([O� �U,2@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H[M)]:i0 پ]V]'*V,!8ꫯʅM N:Ph"}7 %#ߣ4k,| ^xAnL" jРܠ~ S%7\Hd]7\>cZe_/%|#ƅD_91B-Z g͛:S*U4gdz:QW sخc+v ըQ9/[ϟw7HyךmcXq{&MlUVi,r?r,̤5kꠃ HgvFV̇/.-:D-8/nJ=;w֘1cs'Yj97`<Ȯ?8ȹnܸqd=;.�L.\P=_"+fŞ,b߭n4!k3kñ<g|O`ٵ7X/46_?_v6Gl?Į= %}Mֆt`5 � � @ ̞-#EufZے%K_]\u!պK"> %/}#,\0ի'/t/&گWN\׺닔ڷϼG}f̘^ON ωl`};v}OZLVvBCEv =@6RI'YsFzK/M6ɅGVtapK yw?fgl;Ϯ_//˗/zƎ# J/̽j}I"M"w.U^00֯սkI,u>a}M6޵A.+ۆ*Uju2\_o׮]{_W_--p{{THgGV{?,M,{lV#� �Q@<9 � � � � � � � � � � � � � � �ė@EnPភ~SZ <Z{|;uV,,RD }w!_YvcZ.\(/ܽtIbXUW]A,Pkذajݺ>3>P}Cr~_p>·:,|~HXէO=9ɍifǏ6έ YSu~}W Ap7x,L)Xl]̏~֍F5k֨UiԢ}ʬiD/9 's2*-u^zXX{~[s8e^,MXژ~~߉ŋG`~"NmPj*) � � �3^k/󷅙X X+ o$8vF3wlu5jzꩧ|?.[۲W ڟS ^|Qά[hx-[_;n]rĕE_[ `vȮx+K&vUZ5Ax,}3gΌ9~33Ԑ!C;4 kpV۶R.R+H@ݻ+W}rA_PS{'bwmcfvM-.}a 7jӽ̷]ˎ~ZY 'M&zh얝 � ��ZE!@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@@ҥ 9˻5HIfIvyaAlK0΂5koyf=z?ʕƍ}f%K^zia7Gu~ -[ޓ"@һw=zN9 P9I:uғO>׵#kXԭ[W7paK2;}QkܵkiΝܹ,\m)Zjzg26/ z?رm0=8w8|pgl~w}ڹɯ<VXGPsšfw= Y]\ v +ˮ=C9+ZVߣ"� ke[o+ C� � �R&qO>ąԟ%X~}47}G߱ s1;wnFKѣ8�ըQ.U]_~YR%#[;C۷+:h鯿>~Xb 'N{N郂Z?ʔ!u҈UWlJkׯ_7lOV}AWv}ݫ֯ScuB+LS~)к4{t%RvҽJ˽s Y]S>-w?SxV'{bywꩧgϞY]S7=V^CF/v%>}Uʽ)nO>Թ[!� �r � � � � � � � � � � � � � � � �#@VMOv.7gEel 9+6Hht/UlY5o<e>9)o݇}N>]7|s3Un$I Ҳo?k@ .iBF~76o<ߦSA%+Tqƹh-]|>d)lO$tJfvڵ?/رwU|-?\( ~U >kłŬص[N+X]cy~XI5m4ߚaϹ?N\#SfG6k3kAg\v͈<6f]Fj?L ]vm?xvDn$[H/(D!J 3  � � P$? 5lۡ-dԟb$ Wr7On y;^d}w3<쿯_%} =nUQ<HtRnu[[a7nn[VbYF?S_aV¡H7$K1G%?3f6ً{ 0 ijkY?fN-B?{ 7 ‘yLVMzuiPi@#޵Z욲~ɓT/w-_~ ewMY@g]aP}ܹs0@ÆI.+L=T-7N>Y.h,Wa#@�@�" PO�G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�pYE.eoiJ:7 r^lmW1 l2-X@z ¶l yz6`jm`j"VXQ&LpnkF]vuƅGA,^OcAZ+WV:u| -R+p 7n˖/_ 9|pu<C@__޶m[ 4ȷBի:*db?^W\q<L 믿&\33;UTIӖ7l$@W,,gUƍ]T+mݦͺm6_l% #VYMc:Va@eu{<Ϫ{,)}h^pS[/~+mQFo~SL jv+Wm,̲{Lsvm`XK`LmV]\] 6i,ϸgή63uc۹<klF]kc׻ 2|hȑ9i$|!j:vXlܹ>dQC=( � � @ $Pdɒ*WN:$okA]F}"Զi߈m]E~꫑>;auq@XUIϬY}z̾vXˌ3tw .׊Xs,VpeK׍70+ۏ7.AVN{%LK.Wu+yW a{1%,q֭.XD3rjܯ_?wlχݻYS'DjiI.ЅI. Jzu [ލ嚺KO>??>kziF_|Eô5ep>q%.?`VN|4dH|VWrtirn #� �?ء � �>5 � � � � � � � � � � � � � /Z4l~]CBJB' K>8vs\'Լy0԰aÐ "[`6c AC.)ZjZhQ f G M>=U.+Bt~]Qeŋ!Gzz'#w9C9YtYCn0H s9SO }~ 9#v;!7@d 9^:ujܠ!7έ ~:UV\po]㶎]5k <8#߶5>ln_;nW?υ\xTDY?cLڱc uw}CnԐ *}c8Y{Ы=_|1d}{5̙3qݠmݺuziXڐuysnذaez5k,OvB{kƞ iה >K3Gz\hr-dcCnl_Ffook[ . #OlB.oK®۷oev_!ڴiS<V:e `~e,d � �d(Pra]2f&fME{/] ]n;> /#Ȏ04 ߖӾY)} A?x_!w#:/W]uUc?{EqZ轉B� X(bA "z`==O#6DND JH f573Oyf{ϛY}~~Y_H8p EM<G k=7{fd;}z{ƓSy+~޼y3ok-ZȴcYܞcl9frwa^[6gڳEVtϬ3WfС]Yݛnn)c̙u{mQʕ~}35aZO?KT߷G7LyQ-6͟YZf'gMa � @Xg aIYlC@�@ F>+wre*X@�@�@�@�@�@�@�@�@�@�@�@�@�G믥˥yXJ2OBBYh/wXrAr!ʅ iܹڸqwSDT- r}['l$7\ݧ\^lذAnMЗ=g`U\ylݺUŋ !:F# &:XqI(Qn[ 0@˖-SϞ=uUWKnOG}ߖ˅`7#е=dzFv7M+%77rhMX6dp!]rAKk#ɅPeOa`sar<d,fm 糐(q@@f?neXB.-[ z͚5:t\;Mb{IӸ}ם9D @�@�Q|ܿi֬gr| ̞-5j$tѹUBvfVZ޳%dY_=+ٱ ɞ3Q{vӳDy9[\5jH< /hϗy{o6`g PͿҌRzYr_\ZOh8Yͱq̗_*=tғOH~vLYA6&gc6.M0[jW?֮ *x;kP "'wT~* .QUzێ;\� �t?>7I_%P@@�RA@T@�@�@�@�@�@�@�@�@�@�@�@�@ >\IZVnDjY2nt%rNқoJm&^ <X/sUEC&B>|'nݺs|?|eddDjYxNN5F16dnr-nzI߬Z pc/�0kp~rMV˩/:ܿ-[h̘1z׽p@ O>r<:&~ք R@�@��ZsAwa{>haH,)K;3 ʞl28pc:X)=]g @ÆI}J-ZH#FH+-g_߹Hȑ?R:%'@��ZKRD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�O`Pl> ć+=t9 /HX0ͲgIĒ%.]:7ha7Sg:{l/pw{ոqcuY:3 Q^`͚5^-[@rʩZj*sqB'>e/9N,Pkݺuh&K%^ǂ 5%Zm-T뤓N/=zBX+ܶr@�@�-~0RQwƍ;1nyyпs1FaZ˞3_~Ú=\x7!lQryv_܉Kj>!iF5k x/Γ4Z>@j(6rǏ$=3V?ٹ ~XrÏ2%DxݱSZ^J@�@�)--@ � �NOZ2vuP2 � � � � � � � � � � � � �9241A,|,\(]t4cIW\b|YԤIGիW/Gvޭ &xkdUVM]tV zQF>jvR߾}krkѢnF;QbƎoY,G5+Op2pS>rvt3Z˒˗Δ*o} � �Z|\J#͚LJ|R 4H]w]XIl}̙Iᅲ6B:ᄼuBG.p cR{4mt9+>c.p [9_o.7zuhwtPV8[f|ƂRywv[~pq㲿X~ZP?uoh  �*^ߧrrc@ظR* � G@= � � � � � � � � � � � � � 77z\K>y'U[RÆ(KH`.1nѲ`ɓ'{UuutAӂŋVغulͺ/_>KHj/$`5i$m޼ &ڵN9ٶ\rI퐪Z:TU � �M@yt.ٳszc+p rҏ?Jiiǫ  oٿ /P7nԨQ#)/`C|ei�HڶmF_ ʷ^Sv.]]\L V cZ#� �"P+A0D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� Z`6)=[]nIn9k' nh9 4kLyڴi _xW^yEܬ5jP6md0j*U*>!MQZaE"믿jԩ^�~w.tT>:ՠAfG 33t5Gk@�@�@ .{Ge*OE-[^0 K*5o.=t=bƌ:s#8E^ ǒnE?_zٲu֍0 qwCg]n)ib鬳e*@�@�,@Vɸ�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Y@άYH˗K#GJgyY\@J.N;[e1&M7|&|H֭SB-[-Zq*W\M@�vޭ &56mڞlذ4xUWSFF~ep J{L@�@�HD$fS;1ۗ GFugH͚͛O?cY}=xt1%K$>Xj{\Kb}ɍI}$7*#$-M:TIr7'UQQ\� � CbK � � � � � � � � � � � � � � � [ nUjJ;VY3=_:wVZK oӆ ?p5mTM4>hխ[WŊc(ʕ+5go^3gmR47}r }޶yG\$, � � @6mJWmd^wU r/v CzP+<'{eN?]KɶۇB;,ZTʕ+k̘1jL|=$vuxqvB)lEL>� �D,@Vt\� � � � � � � � � � � � � � � �(mZy/I}& $g E u,X樣?븅l-\P~mz-=CdEёG zkU^=o-_|S(P]vyU?~G͝; Ѳ kzm+WhY}~8`)f-{ȕ_BV"%چ� � @ h=W_Bw[2UP!i`gM}IJTlYթS'Er~ ,M"zԦ4ztsu o:Դih3cXQTI3"m+wcQ@�@ JjE b@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ 1,PxhKbBq㤎Ŵ-3uV͛7 kF hǎ^GT'\˂8/|˶l&?@ ݲh"{_~?,D+w}ٳ4hzySS� � �!`Z^||uLp 7=GZf̘f͚ɞ @ZĉYg5?Pj~u>}hƍ*S'p$&K=zH<YI%Q,Ծ3tҵJ?) @�@ _j勏@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ,P+==ZX�_:4&$' @qgښuf]ppc!7Zdܹ;lٲ^uծ][~>k >}?,], ̲;Ɩ{!uBի'cA ~VB(2@�@�@�쟾Ŋw.g}F !|->W_-)]v4}wߩm۶Dr失c /t N?}wqoسqƹ777ƌ\Y/gˍIwܑM � @JN"� � � � � � � � � � � � � � � :[u6tҔ)SOI_y-Ppa/#t ;,^ _d믿 &^ʕ+4L2Uj֬;,ǵ*ɂ�˗{Xu=[7TLXh}X؞}tYGqo[BqH?P+--] � �  1aT qqY@* `^~YjX]tl#pptw$ j ^z{M*UԲeK4@,qkL]z`jgHO?-psXz\@�@j7@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ۶uKU6=ЙG�(Rca89-[l-Z$[-|Bw.\ߴiӞKK(5jCo[Z5M,iA_, }7jŊ{ βp, VR҉ YW'(cQ=�ڵk{!ZU/4R(1Oj剋@�@�@ JŊI;vD0IJW^:v OSTJs¶%  k8�ko[Xnꫯ=^K:X/O[Bc*pBb@�@�| O@.G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@M36gB (,YЭ~ȫdeddx끮]~lٲ}z,gԩ^xl/-SR=[Sre7 e=k+V$crZfY�^zϾ[r�͛71�,;?让K;?-`D P+C�@�@ 9ӥ,Iz{,Q$ bIL/^ziOoڵ&f#iUzHnLCi;Cͷ@_sQÆ|yS[:u~88ZcҢE9H|#խO5B�@�*1U}@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�e؄,!y .~Uz>6 ˗5:h'-xkŊ94}t/ Ȃ֭[L?5ŕj@e˖B,¸l}[+TϺ-SAśC`ǎl]vl۷tG>y{Ug-@ k@�@�@braq&H%KPjm3)ni:i(!]wu\ڥ:٘رc Ԋ_Νƛ-vfg9 :vN?=冹X@�@� @@@J@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�MFV嗥o7f̐ԉ;%#@ୌ\sN/XȂ,`Br Zdw(ڲe~e.\Xʕ. ޲t1[K,)#`?S6mƍf=hÆ ik6o޼[B7?�k~qβ -, wz~|X@�@�@� /NVܰX҅uir K/zN<1eNGc(p5O/.]h̘1X*ЩԲoǵ|UfCO| stKEHsȗ)#� �'X$j\� � � � � � � � � � � � � � � � +mTT6/. s"Ji0ۥdS I*PXZ5oKo߮u9Yo پ#ٚS߆4,Y}o_nfM[] +VL-Zھ⒙;vY_[]em}{B,;bQ?Ͷf~1[+Th[;>S, �Z[q& � �DO=C^y<SJsHŒ_,!#͚%|/L _>Oqz{-u͍^=s /`t;?U.}Ծts4E�@�D@HԸ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�V*UJżaSH^(X"}Թs̫@ G $+ka]Z˦Mٲ~Rm�& nZfA,BXR֠- t:jA\寅 :?ne߷ڂՎu׮]ܷ;w<jYv^^kXef ;piCJ.g[ вY@ ~�jD�@�@�(_^.=%Ns ֭s9FBj>ZVY4$]$m߾]]v7Nݻwxς=:u V5^]>ԯ/tSOk@�@� ;H@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@` J\ Py1鮻N!CU 8 *[ƪ<eZnݺuen.e),[;fK_[7!e_ua]9x(,q 0ӾZkٷX@ 9@,_IQz� � � %@VBݎi{ޒ3aDCq[3Zs)a\)!`]K.jZhرjS칡Q/wTbkmyg)=tmRzҩƶ>JG�@�+@^ @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ R1PߥK/Rz[BUf@ <UD oCuQ´N>dqQ/@� u0C�@�@�X +'GJܠ iSh$}Hv{tR~?Hǂ@4scԫ)z7(2*Чt=s3ۥsCS&IU@�@�"p٬, � � � � � � � � � � � � � � � @l*'OrرRӦ…Mu뭄if @2 ԯ_MfsdA�,@V@�@�<ʕ;A`)Hի=^p,h./ Nii0.TzKG5`@f0d,UJjgBgAK͚IݻKV@��Zg@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�"m[jj!vtRRV-@�hР͛}S %u � �$I1ҥgI]q\X+J/ ?pc> Swݕ;]}(j@4wF+&dA:K@�@  A֗@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ 6Uq4͟/k'=4xkR2qn!�$@ J;A#H=ݻC}&P+==F�@�@ 9$T N$ aPA=ZE[*`wo+5kz5#ppk|P`>}5=_vJTI5J=[/^R � j � � � � � � � � � � � � � � �$j'e׼NYxVL\0y{K@�rhР6nܨKv*#�Q P+� � �a T,)"{pZ "]tTXw5;IEJ]] It@RJ 3<Y>=n8FÆIo) ~r@�@ j.F@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�[` ڴ)ep^Y8@ I,P˖y%i$�Zzgh � �-&U&[rޅ'��@�IDAT7O?O»Y\9嗥ߖy'[Jۂ*�=$`@RӦ35u"YwK(@�@s� � � � � � � � � � � � � � � �I%m[jM.h!-%RbIu  @+WVJ4wK2@ 2"s*@�@�ȿ@…//0dtR˖ = XX͕WJ^+X PƗ^N:I: iOiz魷ի~^{uUWIzIg'zki � Lyh5 � � � � � � � � � � � � � � �@?; jVYS{ � s se*@�vb64F�@�@� coAo-̰xB*]Z/D(R$TԭfMؗrb>.X*Q"jϢ 򧟖5:KZC@�@�p � � � � � � � � � � � � � � � �xYif)=}j(Θ!U߰TTpjte'H'/VGK@�x XּyY%u!�ڽ;P0 � � @|ԑ}7T̚%͜zޯ_|Bm'҆ $i ,t4tt嗥֭ƍ=+1Q6m3ϔ>L*^<ܫ9/R W?)Z.P=H?\� �$@VN*C�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@LP&ԞIxB_lr+W7NX1髯mʹ@ׯma@ v* ķq*@�@�ҥҌrҊRš+P EF`S'F4AnnQ:}7OOG%P+@Ҙ1RvR[oIii9ȡ \{K=zDVZ(C*D�@�VP!� � � � � � � � � � � � � � � @ }v;vH;w "E=ҥ-ݻ^o:wڷM Jx@@jР~w_@ n~V!f39!� � kJ'(-+լ)u.}d-ec.s%EVƎ HS?,U"'!ς@~ܣunhԩ#vsvӪ㏇BŴ@��CO@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�rsx#! zٶM:di[pt?@l0|( �Yoye=> S?,pVC � � +J"mڴbv75RɒYg%_Svml4KBnĉ _N_1"q}8W^)}᜝%tԷ4cF⷗"� �A P+w6"� � � � � � � � � � � � � � � @ui&UK!z; /wޑ5 MM"Ƃ� @kV%4wp/<@ v8@�@�@�'cRѢSQ1dԳ3dI`p⋥kׂ&M8GDફkzfΌɋ@nRK/>ڴ =^mu � @ ] � � � � � � � � � � � � � � � p@s??HWK驧BO =hhPxyI]$M*5lXpf@�` )##C fh5R@@6� � @ ;LN`ŋKvK ̞-͘!]zi5U{fdcgas _RҙgJVEZ ׅ#`^}U1s]"c}6Lr5wWN[~چ� �$�ZvGh � � � � � � � � � � � � � � �I<MիW7²l,[vKz5cå#A$@�HׯsFr) � b6@�@�&'U ʣ(ǒQ`PV-㓱wikWwB9yGGDHΞu~=Ebk/>(ŧJޓNn%>uR  �  A'띥_ � � � � � � � � � � � � � � �@2I'I'/\XI:ЂiP O*[V9S:l �D&РA͛7/ @bmY@�@�@�X ,)=S4iP~"ؿE_]%B;iCEJcJ;~g̐#4b4ytu4jb4K-6^}C @�@� ;G@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@`yݳc*^y垗Ґ!ΝVkdkR͚+@�"[.\~_0, @M � � \tԢEH.k%Ə. j@wS+K,=dyz`{`A ͛K<͒)+WHcH˖e'د]_ji`#� �%@VAS/ � � � � � � � � � � � � � � �DM3$4/Rd jYJGJK˹5rK9Q@�"`Z;vBr"� ߳65  � � /{r(#ccJNCVPKλoۥV,8/Rُ R__%,pRŊ9H'$!7� � 7 � � � � � � � � � � � � � � � UHm .L*V{ƍ}eouIsf?k@�&pQGyy@�l&8.C�@�@�hF%3S_6YlF.$Y{HrٳSN;gazG"]gjזz}Kzԣ_{lK, ^=+-@c[;#� � P+ � � � � � � � � � � � � � � � 8<&&5@Z^}U5Jڹ-HKoݶ, �D*P|yU\YjE*u Wp^ � � @{l`{^^˥x}B.0I/PғOEd}`|yDJ ~QN<b%Яp4n\j(r˂ 'MA � @ ] � � � � � � � � � � � � � � � gK6-IMI]wZm?¿ڶwb| � @ݺu s@ *[HT@�@�@ O5kJwܱ7F )==OEpr�tV `irTnI~g6Q)BO=rOH~@R֒}'Ҽ#H|=O � @lԊ+"� � � � � � � � � � � � � � � @jՒ7UzqefJ\"m߾oE^*%ljiD[|^!� j͟??KȳZX,  � � P.UQhuS`*OBc0񬗺OU+i,{PllĻOԢ.?_K" /;Jr޽ E@�H|"DZ� � � � � � � � � � � � � � � �Afߴi6nm7ٰl٢[Yκm6޽[Vuf*TƏVSluv y[K*Q/ڷK,ҥKL2֮;_q:)vt9?^@�r &MZ.B�*`߼, � � @vءe˖iʕZv= j'l߾]vmmMKKSbż՞~zzʗ/+B jիW!+īOar8ҙgw>gW=)1;mۭ6\ 頑##so6'fh1ŃgkSžcllGTRK0{NjLG5*mR+-曥wߕ.8H-<#M&OZD�@�RQaT@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�lիWkժUv͚5ބ&?~}e(&:9]NX5j|uj2WB!\yY_d~? I7s[]U\9o-ZeETR5iڴYFTR%o]TBʭ>G�@ 7uj….qLr}ȟ;=ep5 � � ]̙sz=Xd/^+Vx95 q@hQn\`5333iӦ=A;e�֭VvŞԨQCjR͚5UN5l[322TdITqxu鬳X)UY¯lV1CoذAo[?Dr[,¨l[R3Wz.j=u,1kH?ogTu?ǎ}ٷcn;ʖ-6l[gkI/  ֊}SCҩJOjY(R˖ҵ׆>Gs) � wq � � � � � � � � � � � � � � �I%`-][7-_\}Bl;x2bUX MfL6n 6.]۷ln([m&RFF|elD~6Mi[CƏo-^p}&[^)SzfoTZ[9U^]&<C=G(@�p,P&~_e, @,׍>5P6 � �$=L2[N~A6NaXQGv=S1 {<Yڵڷ0". DZ0kzu[xZ׻ᆱvPZZj׮&McVZy7UEa |=aIQϽ?fhە+W^zOe_ *璉l~g}?im1E7l9=^{F1Y?8,d㲿ad9B*yc]*?VREժU:8˲D&pqM7I7,u"7Y9\os>'G]Fwڶ2= � @?/UcW%#� �))}=Oi@�@�@�@�@�@�@�@�@�@�@�@�@�'\[h.\g !-H&… {e yIMVR%$x,׭[煒D6A2;_l;̛$&Gq7.[@�,BGnݺ�T'?3X@�@�@ LOp{i֬g¼"N~~^(BZn͛aÆjР,<{h΁4l崴`>|͝;WsѴid`˖-ۡCE't,0%z< =~d,k cDI›l lgV6Ƙu s c1B/ mkAN6nu;{Vi!X,ؾ}ecvolu ?஬ 6i%gˌkL^xۨQ9m iytm[.S8Qj2( � ݿ㥎#)!u!P+u==G�@�8 'hA�@�@�@�@�@�@�@�@�@�@�@�@�R\4~=Mh |e ѲOfYR06)Mv}BD w5TR:#&Wׯ oBÂ"�뮻t7d3R@G^7G t."� � %T Բgޓ'Oȑ#' Y*ZڶmO{^VP[,thʔ)ogiƌ.+S׮]u9QFQn1.L;BSW!=ߺuZ/xㅶǚlnݺ=C .ٸd! ̎jY/[ G۬[KB 1:u<#dW0#=RY"}j3_v"hC"\H\]" � @4Ԋ\@@�K@8 @�@�@�@�@�@�@�@�@�@�@�@�@ L 6~سΞ=[s&?")"̂%mҳ%JY%;xboC L'B駟m۶yMP6l>ڛӶ7&h+Qo,B�$pqǩE8p`J@ g!C$g(  � �)*Z&M;CÇ{-u駟N:cǎ*UTb:m͚57n>S5 iҠz;{^|k-hU+2寱dRY~WjcEKi$ łl?pժU+WV2/SM`Zdfk6X*KRjUGgdd1 MLwo/s~Blj*MSgAղzX8GrE�@�X n/J@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�+jnҨjw%KMh!I]tm2 /U&*}"mKN8&͛煭Y�۰adRF 5k[7oc9ƛ41{YF�MZj �عS@�@�@ (k׮uC{Ϩm O>:sդIt#_TeZ~KPW^yE :V\sUD|Օ*tQi^pfΜٳg{9s[z CN>do mXb|dg˗7α7ʂl? >co5E>w 6ưmKEeBr,7\.LLzAᇃڋkq}gIZcGur#Hޛx!� �)#PDtA@�@�$xY+t @�@�@�@�@�@�@�@�@�@�@�@�@ ۶m³&M)S/^[vm/&:u(---R@,[̛hf٤UTZnvکM6*SLS@  {&Q $wK| e6&!� � ˟5i֬gyo?]Ȱa\nQ]tE+բEWƍ /{OJe][oUzh:r:0+Bs:`k.YXִiӼBll?:PV-/B,ȶVP!I'i&/H>sV ~[`7i5ƹwCV@[_Rrv+ A" $p\8ԩSLP@�(@UU㥎 !@�4� � P+X"� � � � � � � � � � � � �žk7Yx}Wބx۷oWjԶm[/&kٲ*UfQO lܸQ}ɓ'PBjܸ?xp nB|SAw@ o.bmٲś:= 6a--} � �$@2jY<#Gza>7|.B/,*q%lOkպ] KYH˾.L' dzdo|hN3fhͲ&Myml-W\2u$}-dl϶Knذ{vm![[m|^zرC.N:XnYryҤIrnjw #գV,!� @M P+r;D�@� P+,&NB�@�@�@�@�@�@�@�@�@�@�@�@�^`׮]?[mߎ5tlYhQԦMթS'-`b X›,&ϪMإKu'vGh \r:ꨣRTn#@<nM.$XxF � �$@2j/_#FxA?tg+---9nRzm6zGtR]uUJ*ũ_WBOO楅0_zc0&Lвe˼pM`c-ZxAu Kќ@ dffj~m|ʔ).}"gڵSǎg*TϞr}ZLx4A1i驧|5tF}pMOBU#� @  P+r;D�@� P+,&NB�@�@�@�@�@�@�@�@�@�@�@�@�R`hرz5zh[ ܹ:uMĈIy듪S6mĉgy̙3UD 3|gOWʕ^T7 @`֬Y}/f]7X@�X /-T@�@�r@=zGTfM=:38gP`ΝzWddve۷KիKw)Ys LguX*7wqj߾� w#}͚5K&Mr_˂L2:ԥKzFFFu6m>e-U˗ԋ/}~F-<y'5L/@�H"jEnǕ � @XjI � � � � � � � � � � � � @X|zK|2tI'Nөڵk'M_Hj Dcƌq}?X/[l-UwB ʺVZUժUs`V5jPrR^#�1e+a-�.pu.A@�@�_ Z}.b-Y ~[TX;Ι _^{ :hȐ!^pY& nMg%-Z$N޽[SLч~vx 1C[4hi6q?uᇫ{j?O{ So=6RYܹRÆҗ_J}̩W<#t>138� �A P+;FVv\� �%@VXL� � � � � � � � � � � � �Z 33Mj^y*ZN?ts9֭J,x$sN}8pK/T+##CM4! 6hݺu޺vZXBWM&/eժUKuԑ]_^=o[͒@ LMza=PWp w~EӼ_ � �@ﭷ-AY.KO^ziٲe:t7 /3*qۘe61a1bVY[lSO=[9*T(%#@,n:qD/^\gq;<uUy(-k'-+SD7&%7xl3fHUR+ �)@V@@�K@8 @�@�@�@�@�@�@�@�@�@�@�@�K4h.]SN9E^z7yMł@* ڵK}7Y\~tʂγPYh/^?l?˔)# i֬7om۪~ll@�y*Uxa@ _.-_.(@�@�TRΝ;uW?xߟgqnݺU7p^~e 0@wqGjNjSZUz Mjży4x`olBN<DCguW~8�qQFiȑ.j-?_}Q6mQr~\4mԢEp^O. W,\xd[^n\\=wMKK?@�[@/Zq% � �Za1q � � � � � � � � � � � � ( zǼ T+B}eb@EK 6^s=9sӝwީFUʕ+eP~9smTR%kN'|uzU&'!�$pM7iʔ)<yr*u"@zl>sT� � @eb-h„ zgfl oQ_z# ޽C!Ε+؟oasÇwA/5i$mV\rcc, ??]{K~}9Um@PQA@A R, b]? E.lUQE)DDAPzQߓ7I6l+{S].]zr/_> Z؞_͍}Y.ŶQ;6eYfwi.4.D�@�""@VoTH@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�2K`@^>bذa6g馛ʬ#.%\>#[r~>XKߙxZjv!۳>kSܬak֬;s(Qn?)}ӧǫ @ԫW͛1 P07*U0 � � >[o'Oq>5>uݿfGaV´֯_ou16m̙3}+´'~%f~~Yϖ/_oqÕ.lܽ|;e>{R~ f\q^}x_d\0 � ⃀� � � � � � � � � � � � � � � @m۶c=f 4p}ao}>hvs4l.]ؘ1c䫫V&M� 6 L2֮];klԨQ>>;x kѢ6x`[n]fg@ ԯ_ߖ,Yb7�P֎;Ԏ� � �/pW؄ }VZ8c6K>I{qfRxze{Mh7x-Z}QkԨQi(-A jԨaz gO=|hٿ;:'hVEO1'8$s6s+nH܎<S͍g\0 � `j!@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ٳOVQG6!@4֭[رc} ݛoi͚5I&E5uJC='ƛ<yܺkvv$$;!@q*K~ �PV騙:@�@�@n _|tOR8N>d;쪫iӦF#FY^i:A.?~x{_.R+W\.kbw/Eʧq?6j(kذ+imt7[.ʘʏ=l2/Ș.g /s � jeL'@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�xwUVVjU9sVDd1'N>}>cr@VV}G 402e;<n6۲eKMDrhΨt6*W]^z%+W3{*ֵkWԩ 80%mh۶ 2.\h]vw}~r1cdvgf[ۑGis _ҥKmգ=nf|ժU>+VXxoK-L}r;^"<?_.eq7+-Z}->MmmذavꩧڹkoV^vGS߱o݇/p f%Dq 7k`N7Yp\2_=^z|yuޫ^{&n[hGnܶ!hWW?Z%yL!P+3yz� � P\tDV/b;k7sկO?N?t}#+믿ovY=|xˆ "wkoָ\`۶ms}FtVB 0X1ヴd.ҥu=Oϧk_~~ŋ 8Ɛz)]8%ybٳgOu.?V\|yyf6#h 7o'{i]^}/vݣC � @Lb@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ S8 #k ֪RJR(�矷Yfy5 ϭ6W:9zh?BԼys;$l ٦O-'cx; &frͼziFr'_|ѮZ($LaCs̱;P뮻.y<yM0!}Ym)mPmI :>|$}6s*uF-^[oU}l2B_*uGkOmi]q4VmQDom&c=^3rI'&S5((YS[Sso裏7j#ƠG}|<>/-[_wIRx 7Q>1c\-ߍ{7XZ#2INuid}nmE/X_]vvu3-Λ7/Ny@ Ytv.#� � PLx3Ϣ 6cMVG}N_k/S(ԣ}wcFKov)ۡ+VafFI&{;S5JZ3fc_pٳg1mݺ,zC{/Py_-LAx_~`믿5lРT<92#;}fwemʔu � yje{N@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�h2s=h7xcӳ϶/=ǨU]p>8E(XcFY 駟DGqDСwy1/>lX>mQF=ΧSxSܬ RS8o, {cvk֬i2Wbm&-;ֺv::oxz6!GO<8�[p5hԦ`Ⱥê =3!ΓXTh۴Nv뭷k]n-[ZnK/utx펬SΜ9zUR%kժxS`USh}OM8n:SV/(*M&vgGM,YOXuMmա _/_<ϩ`{2V}y٦D{":KN`F�6j@ � � @qX~ zjׯ)p^ZޫW/Ay׬SN`W^y*Uʏo#|g}N;y䑠 jfe˚u^p믿|BN\k=ƵnO2ec:w#7 2;CsUԽb?YXu{[ݺuM!-Z\|1Re~~ǦƢWכulo�sE@�HF@d8@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ZN?tꪫwL*D*K.YfY:uK.;g[&LwiS~Sta٠Aꫯ1䢣FOڵkg;&S E/8(6M«4ߜ9i��@�IDATsBZ;UVmi^g<N"I:(;wz>IN.EY_:yw[l _禝V$ҶxMh c=U*O=_vSGa˗[/}i۶_*dK%?bm. jذ[AUGdW>˗5&Q֤*ꎶM_ G׿_O#hG:r}_Ǫ/mmCОX I^z6t@ Utu@�@�k :Q]s5v!JtO[nP*To14<@}%JK]Mw"鸟v&S'=u2Ss–t[wmTZ*UTawe\)gL>}Ǐ'ˢo)�QZ=Gy.mژС93kʬV-#3x5k.,s9 �d@b4L- � � � � � � � � � � � � � � @ <C>0䮻*4 6l}G{wmիWoٲe 5yBP<I&omSL:]t}ѡz2a{|&SJdoً/he˖͛cufW^yeD{k%ѕ{/\ju]Gvv$>F9lU6mx>S?If7+Z֭}XTfcɒ%ֲeK۷UXoo쭷8@s=<9cU>cƌ!Cc=f 0MQ>oM8~S܆'KvM7yTk׮v 7 nZu-(F%2P+rlB~W zO}1x%I~Dn#r&lMϫc%8N˟~^}UP^# k["<P9OUS] ڨm' & Ѥ2פz;u&*ib ? kpLPo2mz/y;v5{I'~^G6+QȢOY^wz=ܦ kך~vP&M{B׵hE팬/|dXdž#y2DŽj&y � P+]ԋ� � @ |֮]T { =huo/̙3y|ɡeB#ÔtUt=(ݻwŋ}{tvO{ťl`ƨFmӦM  63�曦WmUuWxn{カ}Շ]vŞ|I?N׽pUٸq 8t>]~VF =+dNPQ QQ[6>wO>h"8#4~vw֭[5JXf4Fӿ?ƤګvAQ~/\0xi[>jժMY2{|mc-Sxc fb"y5啪mxaƍ'|:UpCṋ\T՚(LW/s3@vuҦI0<kA@�@ 3JfF7% � � � � � � � � � � � � � � � ?1+D3[uOޗTԾ̛74yBt4&kTСC.CִiS?5=Xԡ nSO=4ifj:ϸq9nV^hB)jwsO_OD!V;b+>:>|ڧI 5^'&fkmƌ~WM֧+mWڶmkhN!8PjBh[οs}׾x}UpԎ;O^>~"DMIEr饗`TkRsS{ըQ ߶~&Pz?(4I MڣGD* zgwdʕ~]xZ6Dn;S+.)K3*u'Җ*"-_i} lS{Z@,JE[t:IJԩ8c`Th?/c9mSTÆ M9}_TtV~1h S_4A^_۶mw 'xgގh:Mgq]|~VMN&/8GLv[d-c/ޱ^^={3UQ )~ky� � �EQ@84={guVl;vmVh>q5kZٲeyYt?W]E7ݓQUJ,*l8ͅX-^=3gf gV8E]4Ϛ.a#'&ilJo߾ܹz5ʮ*6m|`vox4(HuVRr+Ǣm«t^)k:g~Σ~=&tAo6ݟVJ8hqc9ƷAǜRt[%޵G*Sb"0CUT!}QNlH`:UPu*P͍T yP7{Ca@�H`  � @ʪZ5'j@�@�@�@�@�@�@�@�@�@�@�@�@� 4 ]{w:Ra& USz+^Ѳ\O_~q!1~PοoѣG.`ɿ^|McYK/.yƏQF Z`*?ǻОSLZхJnv\} $ƓS݄\P_riӦeY.'O׮]>O?_7{lMFBd:7_׿:I91?x֭[\L2YzhZjРA赞 6lMW_.(_~?giҷͅEѲd‡T.*J7ac2x2^[_t=qܤY.+M9r}GuܴiS֭u/ZmNS.lÚ7oYdв.]ɿvjXpBvu,7m}Mh?czWi!w&^U_P~,(5)^ytz{)(,Yʶ~{Y.g/~ 0m\`ZɓfΜ~*\naB3T;8/_ƍ'w$=C�@�@ +vjךׯu罢(5${[Z_=;/9/DTqWCtwѢEak}z뭷fi|DbSN֪U/U+\|EҦMV9lj׮Cl#r8 ͛7@>΅{>ӭ[`U ҸUPt߅Keo,J{C~_1@֕催{Ld|,t8Oڵk((:uh\0(.Ȥw~7_Ϛ5+%{|AN4&ȵ-|a ѮgeLrJ\Q<2]QsթK_YY?y}챻de5iաC[y� �M@'Jք e=Q@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ P6mj|򉹉:Xb*UӧnIkƍMnf={-[ ]z&W_}֬Yc;wÅXfBu\&ǻ ̅XZB%D}/C,1^/[orvvi۶Imʕ̅7i\hYXMg˗ϛ4i.ǿW^=w:\(ׅK/d.` 1|sSBy)ԬYpAh'bĉBv̅ 5)xcccV?n"HsaNvxT& 눊 ;/c.ݔ,nW&4="KEn[m۶;MH3Yd&\z&[5hnr]uB &C]ģ{P*sMj.}Qu.q.$\PDs_lJju& /;÷ۅO.k^@(>FMLO>ؙg#X{"? ƍ۝ @ܟ?㎹>@�@�@ ӽhuFDzGڧ~j#Fs9't<.tozFÅ{xsnxEeڅm`I) &ۛu_֭k=]tEݫ :_8cc".J.Nh|,s k6:449x`?Ӱa>.?$ȸZN:i$t1L5#uUijo7V2\pT)scWf#Gjp5ݭ?3а.ev=  � P,ܟ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�`4Yq:BRJE 4-b\sի}&֭=:O?瞡uznL<AUDNËDDh4& T(B4̙3^z֨Q#ȬYl]v D'ںpD{jē𵫯4b܅awx1pLufhOzO7oS*_4; [WXQ0kT ,w+Uؒ?-yK<> )|e]*σA׮]y4ce7ݶx++`OWs=M`ƫ'rgkv m |M?o^ z?omȐ!$[og;J*~RhvXM+,N5ެϽ՚|oN7tTVa)g@2( *~+=B�@�LS?SA?={og-hTsÏ Rc={ώ8∘>Bgtjƌ1FW(.7 9찂Q-?k`G_z%\b}ßE'^blgxd۶mmܸq;ղeviddǂST`Wi&6XRW ?; Ηex_uD0_NXX/7E D;M=9{f{b}W|ʕfQs? k?Wfnz]<I@�@ Jfv= � � � � � � � � � � � � � � �N?t:t1ٷW;o"mɒ%(pD)X)?_|:DΓ4H1&+@7tMOo[vv*HFyE:پ[I'dcƌ}.`Ǩ)L+|Id9ic#Isd?|/؛+SNϟz\יy睶|CC,^8N)**ѢIÆ ܹs5[!U˖-}7ܼc=|ȡ>Ӛg!{wqGn qGa<VMheSV^O<bذaVjlm۶Ь(okhݺ5klеUn .,olgY߾}M?hټ|vR}/DZ@ 6WD�@�@ toIr;^j֬_*0>UEuG|u/*uId\{uӧOMzfz.]-{<z贆DTjcZ纇{%kNU1 JvP'}G{oFգk&ȡ$:k[qux_S"c9U keYLr_!k{:⭫P8F@@Q./ύbPW)#@�@ B@^"� � � � � � � � � � � � � � �du]JnB(dڴij:~w{|'췯[/y~9vX ~(E$rt.mG"}MsqǙBg9mU<馛,pI&_/֓d:pݬb?:wAl2d){I?C~VL8sR>r_G~BMdڽ{wӤ2cMqXmiРSv=3jiUf(`_JSQ`^ꫯ6ym֒) Ν;[ڵ; ͖&}TVN%VϿ>˗]vumj;bȑۭOxkmܸ22e6퉬Ou5־}{G5RV-[`AakA�b"l"ZL � �P8ɓM#,yםS;2駟feԩAm}/tLA+M4A= ݻwrU)xgϞmKŊ/VX�RQ_A1_Ÿ%oMԽ>څfk֬ɷD :=?N B}0;U\ ]/nVx٩!-'/c9޶ } ."Ǐ^ިnذ񄠮DcSymKE_xc~xX$}~QS++S]}%ƍ37m5/pòKbx,7k.v.!� @ �@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�*Wl=OoA�FT.\ۡ&S&pر~>`IJA[`6?曡I5Qsϵjժkg϶_|OpGyVZ<˖-DmɔE͛:|ɒ%T?0Ĩ$\?>M 4)G}duPMYB{뭷#z.?WT/^2o~ʕ+k4w<k;؍7h~)Fa03f�~|G6o[ 'r)ȓ 4=zt䦸ҥK87#&SdQ?I׶Ԗ>&6MzشiS[rQ4gɒ%}Rpc=ff{!QS߽_~l JOF R} Oik:=P*tO좋.6E"}^׮]}T:evȏӤ4!S c� � @PBwN%z_?O9mrtV*&(cƌ*U:Tk93O͛[p^B *}*Tp'r\} .J\7&#CMAe)^ckR``L5/uԩ[tuƍ~ƬfΜi'Zi\[nn©v/4\zΉ'klKc_Akuֹpm} ?M0}~#Gxsq5j!CuAhI&2D6&bRl2I-]6md~M6v{*2wJYKY2nyˎX=^5쥗^}5֞lC�@��ZE= � � � � � � � � � � � � � � �ieÆ .,nhJrگ?}Е&{:>DK5IwaQ2wyO1LJ<fSW}?ৱcIe˖-}Lٲecwߵ;ϟoĉ~R`262MVfzR;N}QDyvаXU0&SQ?[%GPS5)&SPˎ?x&S?4I?S5k|jrAO9iҤPХIKcUz>KD~ E(KW@TziA '`|?6hr=zx}RY4;r$3իmQw`:ʗ/o j֬Q V*�H)@HsSb%7&Ӗ%JSPGN˼5)PKaPzYbA8ӢE ;#M:Ks]zMl{]f9_z4Q?d|mQp&7,ڬ�I]T;A(]ÂGrn4h j˩xR?X6mmVp%Vy@>�ZE � � (LKu* ߞu\myå0gN;42e)Хrʖq{2{Oc>dHc8*/!b{キuQQZ( 8G>}Q}ԩ@^J.owR ilG!;ZSnO~PqtYEA@}hSEAGۏ'j jذ?>C6j(?Fr5\ klNl8T4F@ҨQ#_bshEu]p{j9s(m۶~lL2Xu]T;wUn]?v6kxjLtI>ڢ{7cn,LE_aƺ&be}Oc )LKtnad{)ʈ_憋lnBTȘɍ't;!� �EBDWuE[4@�(<O>i1[𴉖 � � � � � � � � � � � � �$& <L?T؁ڵk$y{. [CbhGVPJx?|(PŊԪU?uvNdۑHc5[f @ 6ؼyD/|MS:hR?1ub3پjSMX쪫!c4aZ 8p=#=9.]IۚDPR֫W/tPJL]Dڶj*ۺukѺ6hbd{Z]9>/|B֢]C՗b9?Ο9yЄ{&p@ ʋtsɻ@TJ] � �oJ:YMmƌϦ 4(K^w(0Hu ݛ:^ڏTZJ,S:5@ K|i=W:QZq'fcƘ LX/q) wASzk>ƭg8>c͛7c.Uc:nj׮۬c*=z{χei7*\pNh_ץc""_>kSږ׾f 3[^D9vM2U&aMS}]#g}v1O'sw;٢E>{qvfs\!7ƍˠ 3a:E�@ ,[f 5ر7P5@Bv@�(jw>!� � � � � � � � � � � � @& ̞=8 Vy睗DsH_խ[^{>*iᮻ#G<;lsεݻSO=m_M zl!Vv&TD7RQ&OlCW^yʔ)cW^yU|P9jv  Pt$,�RC27TL] � �o%.5dR{w\{3ҸE$1v,ޢEE7[ĬTم%\Ö;s]P I%ɼ[.&DJ}iBT򻯛7ovt{23;X~=~N?({wZJ2+742q 6mn?=@�@ j%[Ho$!D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@  4I&O<a\s 8;ꨣRybYWŊn۷V`0d>1۪ 5i&_5mO?O<0mf>ZUt<imٲž+oۜ9sl}{UP!jkou+@�T (gϞ6jժe_vicG@ Tv%?@�@�@xtI6qD;묳vֺuѱ([ÿvmٓO>Yl´?ݪ?6vfRJ4ѧO?Q\9BIP ܘXŸyѢE.P+uVSc~塱]j/bW&j4vG8Tw%P+iİݰ `pWY33ܿe1k@�@h rhw#� �[{w-]ZI@�@�@�@�@�@�@�@�@�@�@�@�@� ,[?cwس>k͛7뮻Ύ?xh(} 4ƍ~?.2k׮]qbJMPۦMD>ņ lٲ S~_ا~jǏˇ{^MڥK\B'd'@ -_<5%W$˳fͲ &W G!�QV4s83'@�@�T hz&xD ^z٤I?VZ#8cH@9zyCyg#FoZ?x`߿i|sα޽{[FFI+u:W^-[Иqg+cf 2ďk /xUTj=sMS;PN놜}G1w .FKAW8{o̍çR@�@�< n}ل f;橪;@{0 ��Z-@�@�@�@�@�@�@�@�@�@�@�@�@� ,\|A?!WժU /?9g( ڸq+WP5b~/2[Vd;5{^?O?d}Қ1cR8&bGy$Un @ *]7) @ӬF 37kۧVA�@�@ @- \Zq^u֭[s a 䃂.2{ a o=fJ%_OAyfSـL ڵ38N>dҧ)iXzusu1zǒ۾fulȑ/رcᥗ^j X+_|H))~] MlC9ߦUdYf\`1  ��ZG"� � ;!� � � � � � � � � � � � �ER`ժUsϙ&4TȖ}<LٳgHQ4:_뮻駟XT ؼyl6gwKRJִiSkٲpֺukg}D~;?@� (񩧞ߛ=@�7_ls%v {!� � yvڵڌ =ǖ-[_~oӻqFmȐ!v=X~wVZ0{;g:4sL6lK~ls>W^ԉ@ YFm#F1cXҥ}ݹ #ҥfի¢զͮ߀ʘ?ovfƙug � �Z9_OV|#@�@�$@V8@�@�@�@�@�@�@�@�@�@�@�@�(۶msCo'ѣnBnN;~Hr+ UGe>M:]m\թS֭k 4ۚ4ib5jmu� !k&馛"H^`,sAf}gּyp$ � �&Pf֧O;C8R'Yge-!Mo*ne\2#/ȧ~jÇzˇkpvQGGkF]dYz@.}?eZϞ=N]Z2e U;{}8^`l37l}f־Ycr7P@�((/� � � � � � � � � � � � � � � �xv>`_N;oҥuOW^=(LcƌѣG֮]O%,+++:M,y'ۍ �yU-\05p( M+sox � � @.rV8 w}}h5\c;caWn d:t1k׎}PfUu\D;+ԩ 8о+{w|֝wi+W4fGƍMc*.oٸqO>?֭kG}p T~\J͝@fg f$P+3Ϙ5mjvUfCD߇ � @a 0; @�@�@�@�@�@�@�@�@�@�@�@�@�@�@ TPO*^|V~}kذ]r%6b[bE <f}vuY-zvEƍ%K駟^zY=RҥcbirIAA�H�Zv2U9Z  � �&{~nv Jlbϸԋ^z%%͎=֬T4q}g?-Xy+#ZZ VSy/MAruamB [nӧi\ZҕW^ik֬ofΜ# `GqD ulT  !~ر$~͸/̆5D� �@,W @�(O>ivfKn9@�@�@�@�@�@�@�@�@�@�@�@�@�8믿D 'skҤr!֡C?& P _|M8ѦM?͚5u^5cW_}? x*;찃ibР(pKE^q* �i۷?푆2Thۛ{d(F�@�@ J:6c$.̝;׮z{뭷LA[7t G:J(Q8XDZK*6l=pBݻ+m݊Hk9f raQԏ駟˧~j}-Z4f~Y۶mM6ֲeKkܸ[) hJ9BFkLoכtutSzwKqzVٸqf;^\?|S̖/7TQ|fo.ѬjZڇ� @X\ل -~KgJ.u#� �N@-> � � � � � � � � � � � � �֮]k,ai<MWZnmZ8O!W}5a>NAZϷ%KI뒝sʕѣGҥKTR>n3=( �xG@uR@� hC5[l]ST) � � !P+x;뮻lĈ>ꫯSO=ʗ/227x ;<\ȊKYɀrf<bx p]};pӧۆ \rּys*mXb /?h aӦMˇ5mx~|aÆ4~}s17>e@nDqe@ْ݉@�@ i3H@�@ !bb'@�@�@�@�@�@�@�@�@�@�@�@�@ 6mdSN/Op ^z~zwm(Q"�H\`ѢE N5i_~m۶ƪBڴictk*Tx~Z|rq4"�VW_utc[�J)gGeYdz@�@�()P+x~{衇l> O /Zlˬ,璉y9r>}X͚53ʧU+s s\uv֭~5kz &Meƍrʹ:;#*ѬY6=5g?p8gi[Z Bʔ)&z:?Ǝ-2M. uC>(jBofjf R@�@ Jޚ@8@�HH@ @�@�@�@�@�@�@�@�@�@�@�@�@ %KB)Hy&^iy0/,QF{ +TǪ P8o惲4Y&\ԄuZ^ ԨQ)E>HnݺC@�0auV\ɤEnkyYRi9"� � P,cVF /`O?VQ ' Nɴ&M7xFa .mE]d'|)`&ӊzƌ15zΟ?߇k)N>z̜96n+RְaChР7ᮻPCF ~zܹ6{l?믿mJD jZczdɒ%3/Oyyf^3K-q��@�IDATW ff.� �$@Vj%oǑ � @Bj%N � � � � � � � � � � � � � _6c  󂰤ŋ4QYd{MWR4&H[dvR ~w3gi:-_v6m}\rhºMI5kfUV-2} �yФZAO+@ im  � �F8j;ARoRJ=;Zw/6WXaƍcѣ?eN<D;餓}b$:ҿ]w-]jVtpv nXƈf͚Z*hѢE叩XbݺuKTs-ElիWۂ 7|qH-P>c˔RZPx[F֗0E]~Yl 5 ˕'udn5.g^ll=>جD  ��ZG"� � ;!� � � � � � � � � � � � �Q`͚5~<MٳCAK�-(իWMIj׮m5kִZjn;C;|Ćn…uZ U44h 64MXt @!*U & i3i1^0uXi. � �,)Zy6b裏lƌ>l.]Xvuֶ뮻W6ydOlڴi.iƺvj5mڴH)mlߔ lt)sA3s| B9Z*Ԉ2ed/.uEKsQ:wf>/X*Ok /(;sh<^z ܗWcZj;%96Z^'yYf<bֻ,ԩfO0SG߇ � Z,� � � � � � � � � � � � � � � �E@iF="ˊ+Dy$yZ+5Qʕ+C(LZj&DyZBRn (lҥKCKM\>yݒ%KlfoP:SپkݻwiC  �7BٲeMc( @ܜRU � � @qPA;?^pJ~z F-I&ָqc/dɒ~{A}ٳg?l?}76eD6>v!M7s=6ium5=A}Vv> Z`/Ԙa;.iQxAQXaa0nࡠ.FPR#?իޛGVTT)VV-leSSbjpC~�F"my]Yf_Vfp%r � �#@VsV@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�M uQϹ~Dy O1w\/}�Ty| t-5 ,2X.;¡+WD/X1/MѥaԄsk׮5M0_fvz>ʴOdM0ѠڵkFVfMS( �U@kʫ"#@;\ � � Qy-[f_}(G5ShQF.x_{ChLBy-н}׹._|͛Maճ͛%\bm۶5p/?S25?4m?r:> ӘAHST�m>IjKָµC? Sv_Dt1umٴig 5&E9?G)Uأu|dq05c+Cjk{E - 33vhųo7ivfƙ&gN@�@ jݐ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(aÆ#[ni`b<M0--Ф{(XJ5&WJ. dnxhov=4I^Nm۶m kBYdvO+jW0ɟ&� &U5k,[XjIVj+@�K jeL/@�@�H?si\᧟~?ϟo&McA)UTݷw܋X@P@RYg5N:>c&M4Bɽ[ou̹+# i4nG B͛ :Mx+~k1<2G ×ϵ^�1`,Q-55&ZXdbAИBAji="X0]N@fT{Nf͚e.3z\_%҆ 3kl`sQ � @J0#� � � � � � � � � � � � � � � PL4\#]rOZzhB`2 h5\tzMm]07&ˋ<O5»rzI2wyge0gn-@�Pŋgݟ@�@�@ +V<?"+W֢ElҥrP(++~s螾Bvt__K4 Q8ᄏ>\'ܼN^e+ĉfOupdX JhpݺuG01`1X-[|VxV`1X7AeNnq_ B`<|Q_أZZЗ짤h@-̖-3s< jeل j%Jyf}]Yfu&z$!� �'@VYs&@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�2V@iL=U4 f;,ԋ� @P֒%K^i1Z75Zݡa � �_bիW?o/_F4ffvQůo(Ans .T{BA  R6#}J7Pwɴ#oL?3@�@ɢHڈ� � � � � � � � � � � � � � � � � � TZ@8 rPV29ld5 � � �a#Fuja+y@!P ͅA4X ̙źڹN&NSa=L@�@�b(@V1|S � � � � � � � � � � � � � � � � �@j 0X"@JUlJ@�@�@�b,_flvqŸt .MVX64"B\j٬Yimژcvf $@�h2 � � � � � � � � � � � � � � � � �]@?_@7 � � @Qx],=bis(Pk˖L-, j]hʬ|yS[o&vf5k]xa&>"� @Q P([@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�\ (PkӦMf͚\ @tj+}k@�@�@�zˬKJ5,(| ڼ_Rޖ*e־ل 7j+[lPc͆ ɄG@�(*jwv"� � � � � � � � � � � � � � � � � @*UQ˗/OhA�X@UX� � � .v3;8flcɖ5Y*%Z&DQRQUJ mZ=""K]$d_;cY;ss=<w[߷ڶM~%{dZWKZO @˖jeTY3{{֮h-� �W@zR � � � � � � � � � � � � � � � � �a%Pxqן-[U DjE٣ � � @|otY Qܹ2z4!~ :tHZ4rDg%_/-[lM]'%.]RߏW@�@� P+i@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�l P+i( P+O0C�@�@�)w޽4qtG:}gj^}7-P#xqt3+GwiR<geV|4zқoFϸ  �D�Z{9 � � � � � � � � � � � � � � � � �i ,X[H2lْ�"@V J� � �Ď@ǎRѢWKcJ7K'KmƎ#\"EjʗfΔf͒>X1B_1#RGΛW:Tz]wIw-_# �  a@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�R(^8Z) S@t; � � HdVCi$)gNBi׮#eD9�Ëh\JG| u񣏤5k6nG4ͺoC+q7M F@מzHkM � ޟ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�f26^Iϟ?ۥE@�@�@�ȗH~ _?lYqcgKó*,6`(UJ3FKi#aZI[0z@ZϗoK*`.Mx$.<G�@�J@@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�I@lYTtp @�@�@ a,XKSyOIїh' ̙J*@R˖m.O}̘c /nIޝp:@�HO(A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� +VL[n�$ P+ O@�@�@�ȟ?u\uK}?^E ;k󡇎=48sRz*%U"}} {Oj/ +=@j{ � :BgK � � � � � � � � � � � � � � � � �@"Em۶ @�صKq0@�@�@�e!1eJG-jA k>#aO9rvԲ 4o.CF8_xqii0<}@�@ kZoZC�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ rrD j#P+jO0C�@�@�2 ZU7it Cܹ% 3 J /6Lu^ LE 駟۟R n;}p{  � |oJ � � � � � � � � � � � � � � � � ��Zau: -{G0< � � @߈qqWh2/ zp@å7#,]+-*W_cK7vKq일ʕɿV@�@ TjJz@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�D @@(8 @�@�@|R$][0eIwƨ !FbC @<R>{ ԩ#*$S$+J?.=pay� �P W !l@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ [vE *Ԋʠ@�@�@�L XVGJx6!sCM]HvL\wY8x̙ )ի'vtpWy� �F@иR+ � � � � � � � � � � � � � � � � �a#`Z{޽{æOt"Sʟ?2O@�@�@�/4Z4I򾒢 ~ցaU:' u+#5n|92'`fe>*`!FI?$ ~t;@�@�P J]F�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ,Pʶm 7t"YԊQw@�@�@�` $ʑC<p`RWh@C# ?:rߤdZXւҮ]Z {֭C@��Z7@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�UPB;vdk?h"_@?�@�@�j:$%n-}w[>B'`[+jqgJ:t,n6c :xPXuRRo@�@�x � � � � � � � � � � � � � � � � � jE fxd]GFi @�@�@ ,PdIi̘*C8 4B~f@>G;묬i3VZXHӬY2}<bҤIY& � @ /8v9 � � � � � � � � � � � � � � � � �.@VaƇ@ }-Μ@�@�@�@v{`۱cܹSܿٳ'mK|rcn:z99s{{lEZ*GԢP=z޼yKڊRzn]7;@V Z GA v\v6lؠ[s۾}ۗp+[֭;{a9'O[UXcn%˻}2h?qc@ΓnECyo@�@� P � � � � � � � � � � � � � � � � �Q.@V`@ 4� � �1'paqFm޼Y[l_pn۶ms7{l-u 4\r%le.~0Vróݻ͛+RZYs${ 򲰙ԊǾ*\-"E=pŋOL/QJ*O^^C %?P˖ .^X-]TVr7 J|k뚅tv\yp߻nG,tˮ~ =.]Z'|U\YuqZj뼿o,[;IJ@R͚#H/v@�b[@>@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ /[ �_ɻ[� � �  Ʋ5khݺuf+xÆ Cc(P !@¤,`ZjDŽMY�N8wo㏹YXVRroni6aA4v徳+{쇆ٽ-[LfJpBjJ,µʔ)es+_ @ #WJc_±͛~e2VRE5jPu饗L B�zZ2ESEz_up ]~g} ݲ9� jР5kn5r!^6/Zcsy!y4HvCyl M#� @ !� � � � � � � � � � � � � � � � � pTܹs <B�2 `ZZ@�@�@�$[nҥK|rdvГ^┅H`DŽ=թSGKN`(VXPT/*;wn¿2S,B,lӦM Nf!eM'߲N>dYMJnBc8iddGΝ/BSN̙3vmh4]ve[]fL_/(ZyɅևłǮ{v>8]## :uiӦ.,ig=[h]S'ץ]Yf � @t ] � � � � � � � � � � � � � � � � � -Լcǎd_c# j� � �D}d-\/^6 ԲK([*Vš,{S-aRѥqjvKlٲŅY,lŊ5kƏ͛7'TafժUs5jVZf[9sL؏#jyDkh}2e֯_%JxALSf\V^r½,m۶ gBf̘oFo "Ep- +6Dˤ>s&P+ 5|6iHۃX9U!� ��Z @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�[dx׮]10R�@Bu#� � �!|ro6o<wꀗcYʕs&z:UZՅ0YV޼yc /^\vkРA"zصsk3v4M<Y6mr˗Ou)^z 2e$['#Gڿ?rLO3/pAM>]cǎդI?;S]t]3R`Kv]'-Z>3zҥZnۻ{ESK94q=J^]x � @d #� � � � � � � � � � � � � � � � � j޽;} HI@d؎� � �,`Y?~g/m67 *nݺ+}͚5]V҆#w;~H1/xOoZ`ϟnӦMƍݮKv;fMTRIy JjI b׶l٢W_}UÆ ʕ+ոqc=Cj׮ʗ/˝* [=uVM8QZ)Rąlq`h(K&DHw KK{Kog � yjE9 � � � � � � � � � � � � � � � � �[ >>^vJq�$ P+@�@�@ ݫٳgoя?肴6mڤ8թSG 6e]4hN8!I$PhQ5kWyf qi:|,͂7o3<ST9s&>a$;F'%]Yh~ij|ԡCYxLb)Vn6w[nFnV6mԷo{}멧͋HGZ# JCJW]%u$l � j9 � � � � � � � � � � � � � � � � �dZ bݻ3] @l #� � ~I5}t͜9S{Q2etgO>jҤN=T/pčH<%J /t7[fr3fm֢E {:dAm9r>@#4e˖oU꥗^_>vٲe裏_~eZتU+gwi%;rZ֡C>#ߑ+ZP'͝+HE�@� :A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ $ڵkWHRb\3R@�@�"Y`ժU>|.R+VLgyz-UVMF[NǏ׽^'L+xxhѢ.`롇ɓe/ey.\؅4jH%Kt>_Gc~G"۷GQ,7Ԃ Թsg´R8ϹrUW]~ASLѶmԸqc]s5Zvm GʕB9s·3/N+V1@�n\G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� آлw}C�Q-`ZeD � �DoI&ۼydFO>ݎT9rN:vaXϴi\XM.]w^5k̅XMŊ#uo/C" &gϞڷo Wرry~lHY /t~U ݻ+...zʊSReIz}{yeY*m � @4 {4]Ɔ� � � � � � � � � � � � � � � � � k.<@�L XV@�@�@� zUF կ__."}ڼyƏN:0SQ&j׮i>3mݺU'OVݺu5x`UI4iB6nܘɖ8<Pܹy@G_ ӵkNmڴѢEt뭷ֺuk͟?_z߯-Zhٲe1km@;7kیz*T+V7 �S@`jR � � � � � � � � � � � � � � � � �a*'O۷/L{G@ RԊ3E?@�@�^={護gU\s͛ŋguE/# |UV>|֮]N~~itI\b<\ù--_~E YӧO׈#TX�Zտ14lP|I�Gf.^֦~M:|8=+>?2>@��Z~@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@@08 t( P+ N"C@�@�@ B֭[x@e˖՝wީڵkԒ%K4`�խ[7BGFrȡ-Z襗^Қ5k\XشmV+W?@"ܹ mT E\_ղe,i7UܽkukȐ!aOeiN?þQϖnIC) � @Fʨ!� � � � � � � � � � � � � � � � � AjEɢ�Za|r � �Q*rJvmX,4'k9RM6Q3XSV4~xեK\S|yO[ne=W.B;VW]un}*VXM͛}Z_^c5em~-UڱCkQ5,� �Y,@V � � � � � � � � � � � � � � � � �!@Vv&'kT@!� � @ ٳWyiҤIuwx.&wQ(J(B/_CWJOk޽h2&̝[:p &у�o;+0:JX֨Q\ /5fxyLi !(YRBz9i UA � M� � � � � � � � � � � � � � � � � @ Xc` B)jҗ@�@�@1c\ִi4qD͘1Cmڴ%>uQ .BJӋ/:u/Y`4~:r-zgB -'p뭷jݻ>^ k[7y Fi@�E@h9@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�T,Pk߾}K @J{"� � @fo]qڵyP:8uY/V֭uz%=0Q7֬P\jewf۲ir)6lXfLK7x:tM6eejO 5>>ق� �%@VZB� � � � � � � � � � � � � � � �1!_{U͚5j*VSU  @ Νu#cJt@A�@�@�(Xh4i˗kΜ9dAYQ>s=eE{Iذa^um%}=/YD]tQ/<:KWaa„ 8p`}ܾ}|A5mڽ{wjc5tP}嗮믿B\}u}wan޼Y#Fpgs=.]wyG,;4zho^;vĉe׷`_~Ys;uڵ%O :Үc͚5>|9v-i1k,SO>*8lk{ͺvi @�C@8@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�2 x+V7V b \2 #"� @Μ9u�f7@x7a  � �G`…jٲ ]1cW吗1o<eZJ6I&Cޮ]yU>YO?o6dmf>H 65\ٳg'[W_{OUTя?n!d+F '_vB2kZxq֭>}>Sw._S莈G rვ*U \|{C_y.x*۵k]G ,ςz--X gB ڳGZ,5vM߻AdYf*T,+[h! b^f^@�",G@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� vAOx.znp@�P ʎ#n#@2;v譑KA�@�@�&`R\r 0aVwŹ0 P4iDzfC޻ᆱ׻k!i>eJ9B~zɣxqtg;Brʥ#FWJPT)dmzPH Q"Z ڿ?}M<XF u-}d6o=ܓE#<"{>jԨZjݻSL ,hf͚z^wf+} lMo7|ٮ.* Ho߾X N۹s2S_rR~SOIWg&E�@�XofbM"� � � � � � � � � � � � � � � @ \R_<xLB1 d'#9 @�jdL[2Q � � @=/_>۲`*E ']gC53g֊4vH}f3kNqB L^+_ @ +\>#͝;W=\ғ@uFMscǎ5\גeYG2eʨu w=>|x¶`=_ǎ5~xY8a8 z ��@�IDAT .Psxdav[Bj![\iTW*[V{  � @};h@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H={G3fݻU^=u]BMesѦMjݺu;ԸqVѣGkԩ\ RJ%nmƍjԨ#[Њ-7f /OasV߾}_oq'P*Uԭ[7_-g_y]E&M_۶ms}tE6oެCjΜ9;t蠋/ؽ@� P+v=#G X;v� � �E>SKȦbs ~>~„ `Y'NTA/UK.ш#h"rM78P~hYnn._~Iڷo:<Eru%-8p@_|^{5 2D/xWU\<f[޽W_mO86wX0yŋդI 4YO+VP͚5>w|Nz2{8ڰa E@MzjI=ײy󧷊ߛ;&P-ϮQfl^{Ii117x>){gC>lW^-]]*xiCpk饽Ϛ5 ~2ϯ* *d ȳgכ6mw ~phe_m۶O?lX l޼=Lz{;?`';Įd^ v}Vڼ]m=$.X|~nݺꪫwZaᅲ�;e%ibfΫa)uq-\>å#]&ysåg@�Y@p>; @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�-}VoųUD eTɓUjUoمU%n\o'[,n, ݲ4<oOj….�ԴE~Gr-El1}Ƕcٽ- ְaC}'>}lqN ӲҮ]; hny_~uaX-*i Bn ,Pk t}>VZ/;uP@�bO@;` lQC�@�@� Q ~;X}'o#67`߹[ }o*cǎu\>@ƍ]pXѣNZ/amݺUgE-~Zܼ 75,JjՓ܆@ӡCgbǯZJ[lʕ+]M Z$c2K,qyu];w -I/ [l~wfʹG1cnPb~pd 2曩Ν$n+X}b;6c;-[ VՙxM2EW^yeꊥ-Pweذaܢͷ+\wܡsK.u[7,�Ϯ ӦMS5\pΝe׉`5u+;j\YXU u~uW^kvѢE]Z{9f>R^灅Y]v 렅quU#Gԅ^R6R{rk2eʸ?J,鮳ׯwaq_cs|\b8jy B?ܼ͵ww.K:s/&JΞ=۽w` ݺusɶ9-U>íxYkRy[Iޟ^[ � @ @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ #{_鲅+O9Е-m6u-V^=DJR~ٸq_^̙3G[oElEm_тlG[�҂l߂ 0.ϲE"m~??~6h {kBQܢdw]iJzh׊-FA�mb3z!sA�gFԁ� � �Q.`U 6tߙgPK(Ԯ]}o}p3fz):tmk=s=geA;~vXpb*w[]۷?ݛ9 2D֦<1$; !Qef_JG_P"E ~N<ģ;yvޭR̾z.駟vAgW_}o/P6wv9?6ݥXb.C,Pk~?taH7xWPl±,�m0:uÇy: _ t1߻`5Zη~I:SK85Z�ҥK ʽ=.YٵlB^ ԮWNɅo6mw'h6a~A8yY_^@ڱ]ViAgq;iG+|^>3gz1u^?CY_j>}s7?_ /5Vzp@�@�p P+}C�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�v^|3Ieʔq /y*P,Yfɕ'l[رCo<+Rv٢sUTqAe˖usZrNP|r߸}mq< ;p[K.nț7ocAӦM_EF?cս{w>@'NLwga^~{~=#�Ė}@ ޟ^HlF8@�@�@ ~SX1XRUX+L2E6g`W_U׮]c> xb̙.xjСn>US$??qW`s/իW'4c,6?caGVl֭[ݽHi$a ?xda,RreZJJ[l={Bml>_|IM>F[O cpJwk<UR%=C:e׳cǺ|h5y Kϫk],1땃LGj׫@#iT… ],�2ioq^9餓ϫUWZ0}]ܹSmڴIغuk7߭[77aÜ_ҤI/u^-8r׮]iފ/Vt'ϭT+G})@�@�Cm@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�2}v',R7[OwO/^oNX -aC2X+ բEd͞=;pB-]Tw_ /..=O_<sԨQnAܢG}n-dZku-hŊe޽[~믮|Q@�@�Ȩj*ѣ9@�@�8^{줡[zֽ{wYp}n:tXXHRdRk}  ; =ҸSh"ݛK,g}Vgu\P5k<?=+67c9)͝k,ca*V͛ʦl v�;ikݜq}Ƃsqv?,><vrwk>t1byIC?pk,Q#ްaCR=<+۶msi]NiHz{$-,*iϣE>A @Sf U͛O(h<YeRߧu^s,-?v.y8_|P^t{c@�@x7a  � � � � � � � � � � � � � � �D@ΜqZfV\y(N:$TR 6 nK[*iY|yM=oԨ7n &۞={4qDYp-/w68p@Gָqd:uY]Iˮ]qƤy� � @/Zs# � � `mZJSL `nP"Ew#GTXP=tcǎ:s{_<fЙ۟c:'Tv_/tvy9+RvwV>}ԩSR;I!<LWr¦Ҭ (.(}@$}wG_%7h;D\5m]nӮYsgAcs9gc\Kj׫`\WB-[vLwԩs`=1+[n Z=eȻ6 ;ZYGO@~?{W!:f]qiެ_jr&=k׮uCu~ds瞓jƌı � jEf| � � � � � � � � � � � � � � �ĘI'Uu#oٳ $,nڢV'v~*l!뮻N}Uo/-jA]\rIj׺w 6ko_E ,_kB=7%M@�@�)cIA�@�@�&`(Fu= ZY]er-Z~qu9 /6w`a1J.޽{뫯_J'3OB!z0i$uXb{/$ٽ{l";A%A)͝lݺ5D=?Z̙3]_.첣ᑅ 0@<@B0R6t#",\vXSO=?U{yu?H+/_{W%K;C^{M6hBUT ߹F[ƍg?layrY_j+?LтbZVJj+"3yps9eר=k!(v^,`~>uzoo-Yr;V,jΝ /ؼC=@>/}N%Kz:z4ofV콘̚5K˗wyc/KUg-)>zG@�@ \ 3A?@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ (W\-ZK/*tʕ?Wٲe][m=-Reſk֬;wߥK*TH'Nԅ^Ç[n /6o-[ … B .^-+VΜ.}v-[(?{jK~S[G[ly晪T[`ί{@�@�+`Zޟ@�@�@ />o@,6lpG&E+Ʌ4Yjʅ!./gaZcǎu+m۶u(b k2ջ@c5j#ދeڵm 'Ǎ?X>~۷O|͛,a,LBzS;)RKL~?#.<ou_OO>jѢ[/wA6DI@"y@5j/�7Xp͉'γmKnџ_m<~1{%-nں޿ s۷w�:_~eB]k6n&Uf|6lx ɓ'yԮWGrټ]2d7l^.8zheXN<g"ᳩSN.>gl֥^>{17@>/o[oY}nhło?s7o,kըQn:΂ 4uT/(Pm Vx~;{I@�@ ;/('� � � � � � � � � � � � � � � �AJz裏b قezr =裲ìԮ][s RBumiɒ%:hҥnѫ m;vt7N2-g _etIOd oYu5$,66z?ϯoYw=\ժUK;wws/EmLn ٢W]u-8rH(hb]l޽{nݺzǏ' � �W`Nk � � @ѢEw?jY@QVڵ&+7pgڵ{O?~mF ĥz t'y晩]X9X) (Yʕ+»7n8/)\H?L>fZ�5g̘6|Ɯ9s܈bYyݙYu :4al6m* ರ[t%jժo\}͝ѷo_gm[6gdXۘ1ctYgZjvfսs9'*W\YtԴShuo,9ddUg믿^3gt^YI:hbIts<f6p2e \W7oˍѮ9ڵs} F k.Lg>mX7tkɮi]y}f׫O?ԽJ(!;*GZ5j /voZOM0A d ޯN gbw~m 6m4i" , ?Yp>/m׻kUP}YH_޼ySOyykS ԦMyzggґ=g@&\Hޯ@�8N G㶲@�@ h&ҦMA@�@�@�@�@�@�@�@�@�@�@�@�@�@  7{וԐ!_gϖn@[nǎ.<J\l1ȕ+WŬr̙4r rȡʕ+4Jܹs'lN<Ą=سgʓ'O"m VJXWj @lXP-n( zTN � �Ā@"g|7?10qѢE.H,"lݺUc Im"cۖy `ǯ/36wbY~I~,,xolB,7T s'~ݙp{;ǔٶߺ'0@皒Ͻ&S e͟?_'|*UtQ5Z-~׮]:{\A㏻ܹ9daٲB? oÆ ./9':sfsl vomn8U ~t(Wԩ>]CF0|Uy!rxd-Z$Tk-QTmyo>Y]/si`WڴP'n&"TK酈JGD$ �²ZL1}�11}< � � � � � � � � � � � � � � �+u8@[, WUVM^H oz80-+e˖?`jРqـ� � @FuA3z4!� � � ԨQC3gTN ޫW/R+jWӚHD/4OO?Lmbǂ[ju|I[۷O5INÆ Ӑ!C\ͥԬY3" :u{I(\H>d ׯ^~eu]Nɮ>ErsK tw8/-z:hΓ'fj<h n}7ʕ+ǿI_K-TP!I*�Ar^RSNfF5hzg3ZEg{ܠsy[v̙`ጩ@>/ (P ;Fk3ôlx.}sO;K8hvC�@�_1A @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ J￿)}.m<  � �@DkpG�@�@�>@cƌѽޫѣGgQ6m<֭[8I|||rVpa7}O;4 t={]t+B*TвeO??رcS*;j2#<@s=7r1WSf}3H &wjm%駟;CFt[lqu]6up=z5yd/ KH Rڑyp|su]:øZӦM#"hgOiy[{e|� �'@VSF� � � � � � � � � � � � � � � @L FFL:EzË � �$'sp^a � � \oY^zﯶm۪aÆz衇JQF[J޼yu5ׄd֭mۦ)SSN%ժU CY= (qv0Bk7`^zGɼϤZ^Hk.Fi ܹsbtkָq\О1ZbF_|{>m4uQ pkݻj*Yv\ٲҮ]Oȑ#l箻l2CmxY P5� �Q(@VT� � � � � � � � � � � � � � � @, xb o؇WR˖(@�@�RBm@�@�@�_R* 0`*UV \K7tSAJ~=G<cg #GT:zyf2l0m߾ݽ^+V,kZu]xqv0hݺƌ>vzI/ó>[?1)R<9VwaZ>hBٱ{3(_^ZJzٳgu2{yΒp&C1x2 � |WD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�X P+V<F�@�@ {*TQFiŊ˼UlYuE3fz ˗ ڈ0?WvT\9u4zj=䓄i]gZb @5i$XV[+>{- ղ@H*'|$P+ }2D9S;6F@�@ Qb@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�b\`N`G` � � m5p@[N`5kLժU?g[h >|XzB.RٳG'NԲed5 l3@\j@-ls 6_N.\}{裏dAVNZi6h u(+e � �Zi � � � � � � � � � � � � � � � � � �1-ktTPL30x@�@�|馛nr)K,qǏSN9EիW}^;x`. f}ڵN:$q1c(Wk׮6m(...Jx%(sK**&FiΜ9:Su9o֭[7լ]/3Γ'~WY_$O&P+\ۓOJ۶I>=_ � je6m!� � � � � � � � � � � � � � � � � � ۷ 'D`2 � �D@ժU#hѢE;wzM2EgyJ(v_תUրE 4tP]r%*V ̚?z˗k̙ٳJ*YZ>~&M$ Y<yjԨ^{ R)OUn]=4h{U\9CuAjYHgB%߇ � ;jιf � � � � � � � � � � � � � � � � � �dH@ q � �d@zԿoZrz)޽ۅUPAUTQΝo,MŨÇkĈj߾J.:uh*RF7S^TbaEVꫯ… ]׮]Uvm;kxԩj޼ kذѣQKjZ;vH۶_t=%@@�b]@X0~@�@�@�@�@ٻ0/YXҫR]P4`1hl5!56FFt{;;;.[fN̝;{NYs^@�@�@�@�@�@�@�@�@�@�@�@�@�(@@x@�@�Ja!*l٢/R\r-Zjժ7nkܸq={DUhL lݺUBcYgqԩN:iĈھ}n}ڰa^}U]|Ū[nu4[\ZvYkԨk:ꨣ4tP3ψܯvzz~m5`�7}t33bkjYY"KR%iXy᧒ԣ � @ x@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ o;" � � �1%PK9c2j(߿ iB3%%%cǎ֭<HtEBA ƍ? Zx7o޽{˞owyT|Up?,Pġ( t}]W_ma ץ5k駟vڵk] _>}ػiӬFZV1lMF髯.#�  P' � � � � � � � � � � � � � � � � � �+cG))ƃ � � @ TT)7vҥ3gʂym۶=lH:uGn۵k'[Um lݺU׼y?kviii.W]mĖj<[m^<y=zGԳgO 2DVS?mpU[lo_]}RSSN2֢ES8REWO@-J <SiD쳣 @�"'@Vl@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@-oyUݡ � � @6-[ El͚5+LR,%==]ʕS&M\6mڸsA$Eݻwkɒ%Zh/^nmB6l:RreY vE 6<ʓ&SF[nESLф 4zh >\}g^ݺus`}G\ߓt駻P-D(Kk$BOc^Νr'zH$jŤ �Q"q � � � � � � � � � � � � � � � � � �"`Z5j$Jo' � � e![gyf.lɂlYpf̘^{M[lqYVF-Zp[͚5SӦMK 4-͛7kʕeŊZl,4͖7& Fej߾[Zjc%,_¤'xB&M'?^~ի;uQGcǎ1`~K|rSNѳ>:K)))C HaK_驧k@�(P@@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ؾ@~{@�@�0+P VY,_~qMK, 5}w.i޽C,aÆ.x·li%|ԯ_?xkuUJDZ={i&mذAׯwRR֮]5k}4{ 8k޼z3 jݺuBqxB)==nቶO.jɺ馛k.`{G:]vQ=y-<kΜ9n>} ҲH[nt%SOu`&M>3Y 6},kEWk06M+@�@d*GjA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ nvj֌1@�@�@uԑ-zʵ. 6YbVZիWÞ,iܹ.jƍ^OTjժ`-TժUKv/5jpa//UVUʕUJDKeW0fcܹ3j˶m۲-[n݆ddVfg 5mi?>?}jyOM *Wvꖑ#G*##C?zAm6g}XPbڵ{rqY}r˖-.,>GBEi:pʗ// vmӧ "1+۸w)=4f4zttV!� @dԊ+"� � � � � � � � � � � � � � � � � U61MFLA�"`o@�@�@�" ԭ[cu- MY~,\+4@ʂ,Tʖ )[߾}vuHWΓTB,hgTUŊ.bZ}.cKfffpz`hVh_X -[G.n-Dۗ@Q7[EKu´}xΜ9nYx~'Yؖ$%{O( Ap-{_\{ޗm EBž˷-{SXWZZ ஁j.D}.@ߗ<>[cl.eoFF^P]t � @Ԋ-5#� � � � � � � � � � � � � � � � � 56 MIA�"@VQ8@�@�(XH--{Ν;]ݻaV=4*} q0*5hLG51[HV,kU|c[yxJJ Ѳ۬(ir Px q`u-9;laZWֹ@,  vZz~1mU^݅pYXx`ӦMݾ94Y_/=t]ҳϖm[8; ��Zg͙@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�IۥZb4@�@�H?W SvƏƎm /<0/q#jMH X`fRPOzW+@Z`3iV,AֈUsjhiPN"v**F�@�((Em) � � � � � � � � � � � � � � � � � � ;vH5jDah � � @>LS*#Ƕu`lǖ@ΝxhjYY>_ࢋ]#@�JF@q@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�V`vf͸C�@�@�V`䬐#,x2@JkWis@Y+I/M$}iv"� @q*"� � � � � � � � � � � � � � � � � � �j%E � � տBvN#P!k5==".PgSqڵ$iÆF@߾R ͥ � PL  � � � � � � � � � � � � � � � � � �Ļ�Z~ � �$U…R~{~nc H X]ntʕRSmJ|ƌf͒^y&@�N*@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�F`fͨi A�@�@�(/,HO*abpSROV_D ں'Щ4ltū@�@ ԊC@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(S7#@2@�@�j!UʩHNj1hիguaΘJuV-i۶k6 Wi&ix8@�@ ԊK@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(w9`��@�IDATYԬY̊8@�@�@ ,P㣪I42P!j ž4%%fO)]TJW֨tҽr KN@�>"@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�C`V)tٶ-렝;o}22¨]@�@�@ Wrea# � � 7J[ 3S:p@6m֮V,,b !Pzߦ@ZY)(ݳr>\*l[R5R �D@r5 � � � � � � � � � � � � � � � �w4gΡ{7ٷU&٤Ud=@�@�O@ @�@�%iӲ(9&ZM[(@ ~/SN 'թ#_}()v('\ԬpgYS6ONj0Gk@�@^v&@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�=.ʕ˿彙<0x@�@�mz&* � � �ćwImJ_/>'_.x$i n)DBreZ5iHN Ԫ%yEJkKwme � PtnǑ � � � � � � � � � � � � � � � P/7 3SQ@�@�_`ɣSRߏG@�@�@�bG`tgi/-E$-x1#C:2<+u!p@ݺҦMngKdRS[#{jҍ%=/=#� @ U@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�J@eKG\+YS/y@�@� ضM) � � �!H3fW^EågQC:Ģ1/@VV%jm^5RWY &j%uWYs"� @$Ԋ.u#� � � � � � � � � � � � � � � @D1{B Hm#� � 6,Zq  � �$Œ'@;qd܍�Z@ *U={ؑ]Z )I=Z0AǨn*C�@�B B � � � � � � � � � � � � � � � @ ,ef~.1"� � @6zjj' � � @t ̘!U uuDRrr?3ZH ԫ'mPN ڻ7VǢJݻK � �Zyɰ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�^~}餓̠Рt1Q� � @ "� � �gåJ u;#W~Rrݪ^]lAҤkKV+HӥX^i$/b@�> � � � � � � � � � � � � � � � @t\rdoK СRrٷs@�@� /@V8@�@�fٳN 첬PгY֠A7R@FҚ5> @-+{fol rtmv?h= �*@֯!� � � � � � � � � � � � � � � @ sdۅ .: � �U@q � � sWVRϚ. }j_/efF ԛ@Y[QŢJ_-n,6#� @Nrp@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�bJF ӥ_ݺԵYC�@�@� Ut;D�@�@�M`niRОHN *TժI}@ÆRFaC$B9TڲwoG={JIwA@]^Cڍ� @�Z#� � � � � � � � � � � � � � � @L \|qDcxnИF�@�@ *ԊB@�@�@�" ̛'RǎE:;W<x0[6xYRŊqM:e5l(m`6ڷ/N;=Zs^~9A6 �q$@V]L� � � � � � � � � � � � � � � @ ~TjVӥ .HT � � @ l*ժUR# � � @ 򋔔$lYD@RY-q)^6ʕ/Fg*Wj޽>ZU4v$ I_~ J,ZM� �e-@VY_Ώ� � � � � � � � � � � � � � � �  ʪkWMbWI � � ?mۤT8@�@�@�A`\7RE0dTIJK#P+ܭߟu˿#?IVI??}' �$�_Y$U � � � � � � � � � � � � � � �S ==]{վ}ܭ~oҩn[n<x-ےLwkoCk[^ORrbv[|y%%% *xI&ۜvbŊnʹe]%|Ufomݎ � � kޟnbZb@�@�@ 7 j*G؆@t xΝ;OK蘥?n?fcx;wuqխ.CCmm/x`^WTf @Ҳeg-8h\rihiPy㈳@�D@t@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ 1,jǎھ}[Ivl_ݻweϞ=nmm'z SlB9?x*4ʶ޷u&mXq\0Wn[-y9y~z-$/b$zTZ-6am?k셮׬YSԨQÅyC�@�@۶eZ#@�@�@ ԊƫXm1 6eӦMڼy[[}a֭[6iY\rp<_ۜ㎡JK&MvBos)ژZm 1b糱?Kp奘ۭ^n]թS A�|y+{ ]̌VҶ qsSOI]WZ8@�R@ � � � � � � � � � � � � � � �!`qdr[lq$rO*g, Ҳ \dmaMdO6q[&M {B'mVTX1eWQ&N>8;~.6Y^y~(`qF-]ԅAg6AW1Ѐ-v-{6]?  � � xp3� � � 0N>9:BNƽV\իWk͚5eڵZ~[ٓ*T e\5RaS>k6nUڭM|t=:Sd[?fh}bcnca26o޼Z,ׯ9#sm֬{fCzZsdl: o Gxojo.\~_>F@�M@x@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ,xiݺun8 Pl ]ߴiSp4 VYlBCZjKvk l¹vsJE][,,%##C~MgjVR}/g-W& ]'VZ*� � j{ � � p6Ln_~EKT6[,Yn/_+Vh˖-XHVCf>u=5hE6>eP (VX𕍩w\Ƒ-̿u (3fu ]6n؅kƑmkB./\j[w&P+^tSOI=& g �ī@5^B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�zDn³&7bVaFdtԩ-lg=hEm޽{]H͛sCϟ&P7  -f쥥& ]"0&@�@�"+\VdC � � �رC #.+WԼybF-rmXWRSSբE Էo_ԴiSfkbL[ndhGo[٣UVɮe2uTw?##axy NؘtvԡCmVUV<< Բfj$2{+#,;K\ݫ__ziX骫A�@ ԊKL@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�JB&,,t'% ʶl<Mg!X6dKջwo7YhQ}oZL(c%BUT&`kpOÛYӂ@8]~}idqOfff5jf͚6b�R@�@�_*U?') � � �1.}CAmΚ5Kvܹڵkӱ, [ХO<Qmڴq!L[vZFau%B,m. n'LKmƴ-s[3)))jVBe[@"-hvT1-H?.=t1� @ p#� � � � � � � � � � � � � � �%m67Md7yM l2uAwhհaCԴiSr)nŠ�-Xb^b;1!`Xς,tlY`>-5Ըqcl2bł( � �!`Z^0@�@�@ @8 ](~w1c{͜9ӍZ%թS'u]CU\VOBG1gk]ּy4go{U:da]]vUnsW^j߾ Vw,`Cސw}\ Bːs%jזnIzAϻ8,]C�@ Ԋ Jw@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�طo.\-@˖͛7-0˂,E:ܭbA@6` [*6޺uR/˗/_[))).X-ڵS۶mݭ=FA�@�(=JϚ3!� � �ظ1 EL_ ,З_~iӦojҤ E6l<Hظ(%q*U,T Bݻׅkٞ~iY�W͚5ճgOǍmՃDzRxo8Ts8(7tJRRюFixѣcݴ@�D׹  � � � � � � � � � � � � � � @ _ٳhYx$y3#Y`__|Zn ͪXb-F5j䖣>Fdddhʕ_ˢE4qDw&buXM/;vT5  � �زE]P � � @ )y9PB JV`…ObAZ6lPժUջwos9ի[6lX'RJyw5k W_}Uw}{N:I'| ٲ%|oSs愿?{O{*ach=H7 խ  � @@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Xv~G-ǂUwN<De!ZUّbӁ; & -Z^ll2 hܹ9s^z%mݺڬY3uE]vMgGA�@�(UVh@�@�@�صK^=:B+'˻|>}Zrj֬?^z=X7^4œP+GnkC֭ӴikҤIz8GOWBa= ryMؿ?Z ĿuI=$#"� O6"}@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H`˖->};ea<~ ԹԹsgufr%]E ʗ/VZSOA ԳYf駟~￯cj7 Zjjw^zFe;; � � xSã � � �!@Vl\ZqF[o)S(33S}ѕW^�-3 Piii4h[<=1bZhs9-?Jv ~Mu?ƽ*W.1UnMv%m� �Q.@V_ � � � � � � � � � � � � � � �$… W_EB .,˂rF=z(џ.?6l([N>`5|͜9S3fԩS݄}{U&Mt1cu1i_@�@[6m@�@�@� P+.Ν;]+>L)))8p^z%zꩪQFuǵ@z4dXG'gapƍsz\p."u-- 9 ԲI'eo@J"wj._3FzjA�@�C:Ԅ- � � � � � � � � � � � � � � �e(dM2E~ݰa ӧf[X3UD@rr <7tP، ͞=[|[Ə뮻M4y '@. رʕ+u � @) XVZxBN� � � 1 a-b%ZiSO7P tYg)ɨ  tEOK&LpZ6.wWK.J/6ח@>UޝZJp+q.PtȑYKZZw!� c4@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ {3}.ئuֲSժUuIV\&ֺ馛\aZ1~i>e &`_|Q .=sj޼}YuY .2ڱcGS"� �%yTvt � � � ?#8B֮]/֯_6N;4´'PlLn9sΝ{UF\HЮvu#l)i]jLI)隩/~{y}Ҙ1Jچ� �&@@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Rؽ{^u 4ț?|YF#GԲe˴xb79ܥ^f͚z8!$@zУ>Yf&7n233]_ݺuտ=ڴiSbK@�@ ֭j . � � �%*o>=ònɍM,ZH'O\ʕ+ hh߾Ǝ+W^p[:tYg1Xm@-/kR ;w{oKd"j{?KғOJEMh �"@V.(lB�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(y 4i, 1b7n{ռ[+Dq%vjD�  /P/ 6mz&lذ ^{M6%@�HXAZG@�@�@�.Huֺ\ =jժU73"P^ѐ!CW_믿Vzz{RmŊeТ;j-\(wr %Dϒ*//:G@�@ K@-  � � � � � � � � � � � � � � �ذaFf͚K/U5e-_\ǏW߾}edQ@�h(W Ӻ{4g͚5K=z߮Fŋɴ@�(q-[]īB@�@�@�2Dٳg먣r \s,YÇzQ:@k7|kת]viP)t3ft۶I5j$`*WFiz@@�@ ZԊ+C@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Xt.r5o\_|~a7c=&|H0µlB7|SWVǎugk̙ Aw@�@ QJ+M?@�@�@ QTIFo?Ǎ^rNӦMpBqZj6!?gKK^o y=C:e?Ҥd_{O˾g:eZP6W^)Jcǖ9+ �,@VF� � � � � � � � � � � � � � � P͛7S{nM>]SLѹ瞫B]?s|j׮]NK6ɓݹ۴iS*6Ӆ^c9F}џg?KGy׿oY1F]v饗^Ґ!CTVR9ƍO3<P* $Zh+WN}[oŋ{5q箹mQ@�XXn{9 4H#Fȳ+yo~z>?a-%s JF@q@�@�@ ZRR;#ۚ+W0f~7Vgct?|M{, ;E{nvmҥx*O<많;jذak5rȨիݸ~^AU-ܒ\^x/۞;w|={jԩv:7_jZ~EkUe-Ph֯/zUVymǽX+3 J@� %@V@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ?͂,X^:u!eزe /vf233b wnkVy]Ms.& XXԼy?V} oǎ'Mm۶ETkK9DžE&[|򚈯EM6XVeo-{]=#E;oo[{y{W/z5k+Wj/ԪU+ըQC|۶w< Pzem)gB�@�@�T%"Z䗲ϟmYY9 .eip7SfRFFFY?úCucߵiӦnJX[p jӦ{1pne„ z=-vڷoV^=7z饗NsECG-}󍼱ȴ,W޳NSkl\qq)6lдio?"9g@@�D P+Q<F�@�@�@�@�@�@�@�@�@�@�@�@�@�@�JPn&]vez衇4yRH0ݱ̺tRCJdߤ$]~j׮l4-ܢ3<Sm۶UJJ|I}߿8_}̷a`F8k7j(w \sM$OW?@+uv_|E7ތ[ Ҟ={b&ЫW/7]ܱEßBoY pĭa~WJMMվ}r93@lbY%BK@�@�@SA-c֔+,Z};܈<^*U~;xc<'7nN87;bM:uGaYfjuQp`˗/w}v{LwtϏԩʼ^ ںU%ޯ5reQXJiH'${>DC֭,<J~Sg@4x@�(D@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�nB'Ӆ^Ǟѵ9RτK0ԙ>,Xf͚eۭo߾^zmINN.hxi1FN:I6Y2229؈<Vr>-.6d6ڵkկ_?Yp 5p?,FG!#RV-N͟m7͛ڵW@�@�H\yC{.$rzxw뭷R-Jupuiʕ^ HR;ʿL9#նm[5mo!.\( ƖŽ-Rq17w}:cu%v<ܻ<wglx *--6%WfƎ%oKe|9@�+բ1 � � � � � � � � � � � � � � � !׌3ԦM볅Mv'OVV4zh5h ؏7Gя? :TzjZ~M vUW7Mq[:uy-]T69ͦMc;w*WΝ;롇i?Uh„ ?ڱc[OOO3|#S.+1ٴ~3F_| իz&tI֭ywdխ[71B5kt͜9MHhcz']e]&WO__?Գ>~X>fϞcjo?wY%5ܷ~_~Ywې!C\tIY׬Yv5P/8[mQt+33S*TЭnJ*Utwuֺky;<e}xW{6,̚7ox=fw];EJsǞ7|Gqki$@Aš.SLq9` .pwǿnd&q饗^MڨQ#u]oN+}&S @l)~=Ԁ� � � gcۧ{}Ow^u]k¾KApyY񹍏ۍהԘvim۶͍Հdž >[V>8x]{OM47/l&MK,ȑ#eHtknƐllJ/Ƴ{glVjx)B6fƋ 1Y}^{5/Rr[b_R Wg0҄7؝z[|P7k*9hO@:묳JQP[Rtռ6PG/ O -%tYP$og9hch{d{N6~?aRR~}"�  c@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ :</;b2LT~A@_BnvfU Ԟ{9MhsqǩSN.0e˖:]Ȓ_G{6q'|&ϱB'<baӟkEB)ֶc9j> }lUVɯrY &kMgY�Mgt?;&ֳ+{|РA.&PΝ+{u]r%ڽ{6Q]Ղq9縰ώkiȽ z]](O<N8u݅ydKĄVPZ6!套^ªs[�M7,a~.>[0=³,n6e&P�횽d~袋\XڤIt_OxAů#oSSS]SO=%ؐ�D@~9ھ}{7nZd} Clg}6[V~C3& ”> S"@6oo#@�@�@�JS±@K}gݐ}߱cGPИ՟8\~cyYNIY|7;- 8q,Xƚ%5faコfW\aՖYmw_WqHJVx}߻ޮ];e"RYêUjԩ:suw]Jʾz;ۡC7k>#ݸeθr8㤅n7g szP|ynL<ƽ9y'6O=u!ef^_gwܹS{۹ސRR$ر=bz7P{_ vzOF=}7MQAe_)hٳg4n@� (@�@� <X P^O@ � � � � � � � � � � � � @ xXB\ [QSr)e 4hYf7iYw]7;aÆn7џ?sLww_~ewӦM>/p"X7IMForංgz5jBDen VPW_}B{z!Kn7VP;lG/T7j(w\} $3fI{yϹmk֬qۼ@RRR`Ŋ} y'ݶŋބ]vmބn۸qp[cy@FFF rUT)M<=mڴ ޷/mcwݕ+Wxn<]]}n<؛е&hpr xи9vxfmwyg \m˖-s>~zp=9Wк=W(o.C�8|/Z=M3gN7o"MVxn\JS{̛,7VLvw@ "m pEJ@�@�HH5OttmBNG@jO~ȾKZ|ypg/}sa B,lk|,^p|nݺ[݀JzIYwkh^e]rX{.bwM_x`ׯ378Z bya#1bD_~/ ;Ƽgbb}涅348iAlýK\;|M4q־,rt-L~)yB' ggΝ6[hnێݻwq3-" }E\s=nرc]}&tMn'p?Ba@6dIM)@FA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ a}ԩ>Sܹm8qRSS?7jݺʗ/}ɛFޤa֭B k&oR?tISJq:\ r{QMX+ևN;9K8}yL^7nZpap޽{˛TQ[l7p"u& MR䮋Y[1c+M6Ujz -껟uY{Y/\M^zI^{>;9ꨣd/7ᢆ |̛(sؿneժU6 O?|+t&oEy!u|(\f͚ r{=9@�B ^Z)/ Ro[oݮ]{>Y)gb>US`fEbV � � �Q%`Lʳ]<z،};}dc#g7+1 {0qŒY6>Vc>=/J<~Ⱦۊ1ܾڵkg$ظ$/,8?>BC+33|1U\z:p@+UP\b~菍< 6V Wg4qhbUp ny9`��@�IDAT (sկ/M,Wϯki, )MA \utCIܓ?w}UժU;$cAO<7n?<X}Zj8xA=ztV~۾lC�@ Z5ZZE;@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�bB{֭1ނv pPK3fp;-^=fTXQ۶mSϞ=3NvsZʶ&' <dXN;r;w8}ܶ$6'|" ɲ2|oj۶`YMv޼y >?v5/e eRիWW;mܲ?cu~sȿ6lc;˯*E+691cƸ ;�[lbЉ5ݎ!X-T%--M6a|k._݄Y< �&{qh;g͚% }SlU|-L ^C� xv � � �+`C.JeÆ .7w޽{v1 't",MC Ѱaôl2y:Swް pJec6+%q" kڴ&L۷+u;ȂfΜ-Ͷϫϭ֞*+3N8[I3z7wc֭kRn{mkTHO=,@z!!`υo\g\}^%YRSShU|kwjٲezר݆h+ۉ� @ !� � � � � � � � � � � � � � �,`=m[͞4}Cݳg֯_7|Mw嗻Ir+8p;mڴC7sH1vWVM|vڥO<Q6 M"4q$N sKܔ*eaISLСC]Z'*z6kWlG6noРADJ6svݺusqe߾}z뭷dOʫwQG駟~҅^讥eqK^+s 7+pKU;8/ @^š_ve:餓kj&t!Xpe?(7)q� � � ;Js߾ZjUVɂ#BKn8fa}JOO?B_'OyWc6~عsg=S1nS6d֗w}W]tGa/v / g<se*~)hqpIg"ykc F4ֽd}.cxOFJa__KSH-Zc(?X@L4I̶rg[8Aom, pSguVaR@�%bjV@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ Zqׯ͛-,ZZnի7?!.RXBcƌqKC q޽wkYݭMgX <q-j;cams9n;ӛqv_;;ۃ_F/|]=m8+vC6޽{lGϘ1?ݭ?Y^*e;8NIDu[ouy裏\Cx誅|ͪ_^y=;DkVnzꩮ>`fo@z/=Mꫯ*--MrNp}tٻxo\kt-lJiQhQCI*YJoDZRBȾ}gϙ\ν3s_89|3wON;ҿCHgg KV:R � � j\D@BByGr9n/^,X I0q<c^gEt뭷ʞwڴi zI%-ZC=m_3 .?>cL_\?iRlmźyY^\Kɤ>K[{}>hZn$[$1@z^Tĵ'iH�JrG i4i&oPҥXח_~( ևv҆ ~L �D�Zt+ � � � � � � � � � � � � � � 6ԩSթS'oP ^)7[Swy7x[f4|p=jڴ*T.H111ozCaѢE3gz76ի=oV ;]gǎulL6`M6Z`ڶmj`6v͛m! )%m \;!V^zi޽O>DRv߮ h֬YjF8qnA<W |hӞ={X~KHi[r 8sL;2d~G=zTgҥKexaA#6xg L}bccml<{^ǁ~>s͂ *ryKZe={,^xٺ= \r%)/VFN6fݺu1 ҳE@�pHsNw´^{5oоZ?s\sz촿6Y)STzur-q-[mMw@ 쭜&P+e)@�@�\ Բ0- Ij7n>j-+V<N%ga+Ko.}.1~xjaPbŒNJ+S֭[³> $ԯf!td}zSJ/v|Æ S˖-e}ad!) vB)10 ޽;SOj%nR j5z?ʗ/_\l /^̴i25+@K}7AO:lJC#P0@=Po??m={zzy'J MVXMbh}讻?\HD�@ \. � @Ə (@�@�@�@�@�@�@�@�@�@�@�@�#7xR|[,~UnV kРoժU>7Mm.B|nn@°}]_}9s/_Bt|?w  Z9r]~c7 ls%yHk¬7(G.WfM.gjԨmsz!;a_ҥ .saR)ncUUX+M|UW_܀_q]o޼y5k\ؙꫯ|. |/bnD աJ*ɓ'{>78s}O<oر:u\X WK/܊ Xmϡݻz1ӑ#G|v-[ٲe}.WreYg oλtbvI:smvz' �q`P=w~׺ukgeؔs0pZw#n&3gL @8 n}~&b )nW}˖-Zcyo+Ƕ5j(omwcFs㰿]t36L߇~w\J& Dv>;)@�@�,)PP3_}ditn_<>_|P>3?bqgtR_J볰ZL,:7p0:uiW}gB|m۶Yүj)~#G}Fw;/4]}.�+^=]x$|[lܹC߳e姗}r1yhߩK?-Z^k{m~#Fx%ׯ~RNSo{[ߵ[_dγvY_eݻׯTg}oǽx}'TX=nС䫕1fLޔ#=|%J${gIO>Ͼoc#}d?~;$rV]v^{{sZ7ѮgSrG@ kǔJlvC˄� � " #CtE�@�@�@�@�@�@�@�@�@�@�@�@�L`׮]r+ԃ>(7hX2uٿV^J* cǎf7P x=v;G &vpI]紃C!HIB:4uTo>:tHk׮ c b\x\(\L{`1SH\ NÂw%~vV{~Pk8B{Pz_noذAF^\ܠY^Bu=E�TX7ߔ6\}ze�R}9眓Iob܁ @ ,Z$5l(~\*_>݋@@�@�@ULm-]:>KF@fr^K/%_'Lp{]gEj>'s=>.f`_GzYX Ȑ WҤI~`HYO_(Kjژ^cR)'~8c?pݺu^]d3kڱcu~|eVU2IKKgK;&~x΁W_~;/ySz[}GC=Z7k}oþR7IjƍwC^sA ^D�V}OT?_3\@[q$ � &I � � � � � � � � � � � � kƌjܸh䩣bbbu jӦM{2}0G}Tovu͟?kN'Nw@jJf͊b0~[8ƭj{>ڽ{ァmjСW^ @ lPL@m۶%kR&NHnd,P2 � �YI@tû>(]hO?!C>O?~J(MMveD[F\#Ƃ*V~H7nwJ_}U 09s6&M>ӦES2-&|\�RՃ+@~r<ONQ;@ J=[iL@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�$*Tɓ''г> tuwkUnԨQ$fWr ߟa_~DŽ� ɪ^zɑ#fsvڲm>3u9"ô)i޼yag ,_\ӧO ܷgulٲe\rW �xFKG`2eJ6=բE"@ k+aZ � � @4 4m*ׇ'\t/eG՜9soimڴQO۞  RVt-jժ<x.˗/%gc2-#|O8! ՚5kjjI#8I/ZHs/^Cz#w'M/?j͚574_~j $4$6>i$ɂzKK,ѪUoG\seE-) �*H<F�@�"A`iiH-uD�@�@�@�@�@�@�@�@�@�@�@�@�B'pI}z{hѢرJ]z饊 )9".\腯͛7*VZl~w0*iCr }o7\R?u7SNnSFR.](TaZMV^=u:JcJ#GJ7gVV@�@�B+Pps)S[K(dbcaݻ?xK*QD<:M , L&xWBn;A]gR\I~{1}ᇲPQFlٲ{s2[JKK3fH^2:Tn]<x0~vY*UJ2%!<@4y)-_.8*Uh˖--?ڛ#ZC;@�LرC;Rf^�Zu, �D�Zxר3 � � � � � � � � � � � �Z`^:|Gʙ3ZhVn/\ʕ u(?lÇ+o޼a\K;(&~'h׮]j޼:whL @ Lp~Ĉ^pez7cA�x!il#T@�@� P+loMXYgIfo}wjРA< M8[z쩾}bŊ!@V'YhܸqաC >\\pAި Y۶Rl~a{ׯ,XK.'྆"E' /  ^-U.M&]~XcǎժUThc# �jkn={h@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�\ 뼁,f̙*Y7H\Urer-:ul>%͍FVֺZ в:ux4hg ڷsNYm&´2.q]… +x&L+RD qVH眓~ � � �D@ǎ8oǑ#G s玿G!u駟&TVZ^BBvq +O|rw}*SnfլYS˖-oM)ʛn^ov;Pkx7j߾}8+ݻ 6@kKZ�mڴIG֐!CJT ��ZgII � � � � � � � � � � � � � � �ilqi͚5<x`<xP{ʕ+ եK=3o/ Ȣ'N?'{Z+={j^߲e^~e]s5*X`բ � 䲏]( � � �*С\4wnoZ]2⑙CK._|%Jxŋ6>C;v,#5ɍ5J>=ڼy&M5j云^WJKӧ'ܒ^zIP߾}>_KIu�@\v ̑e 9 @�H d@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�YbŊnJ_zs=A)gΜ]7V=p.&@Zb~o^x,YCtҺKtwI&n:ʞ=;h � �)U|F"� � �DJKӦIYG?X 'LYfiƌ+T@mV;vT֭U`̨D ? ?J,믿^/֭r5nݤ/!e_Xbz{ܹsx |tR <#R(P[io4sL8B<C�@ xv� � � � � � � � � � � � � � � ZU={z믿kѢEk۶mʑ#wزݦlٲn@SF m)2P`˖-n/x gm… {{͛7}ݧ TRX;.� �D]RF[j� � � -H}Hos"0"y8nfoޱc~m[uI jժ.B4#5HL͛7oVթS'?ٳgOt'"л\gR˖Ծ}{v˅F]s-5)j<&R#0x>5K.9c@�@ ts* � @2an@�@�@�@�@�@�@�@�@�@�@�@�@�4 XO?%KxK Yf7Yg5jxZ5kTjռRJʙ3gɉ q6 ukʕ^`ֲe˼Uԩ yx *d\% v|-@ .- 36�@�@�(\ʔKGGhE /,)=4`9sU-\.)R$ ng.Y>G} 6PBKueI&^_ILLLЮ0غuk-X Ҳ><뇷Pm۪]v.f6Ѭ4{v8x֭O?TٲeK,u H|#5jh 4kvBٳ?r8@ Y+&͟/{9 /ٔ[q$ � � � � � � � � � � � � � � @ t#lrCi_/Bׯr! ۱*Us+W@Q,@ N8 haxyժU^=>rWRJz`p7tj׮ ̀Zr @�@ quKK@�@�@�(?tu |'OH1mnޕW^V]f/m߾]SÆ ոqc5hO ;vL?-ZN_}ׯg}^xZnѣGiӦ/ἄzu΃Tӽ0~Zw}e-/stEYfP6OrugT'#� @ J!!� � � � � � � � � � � � � � �D@޼yuƫÇVX!mpoFӦM.1MٳgW2eTbEYV97-瞫~<X ɓ'uV/nݺu ׮]=Al*P*W͝:u,DfDŽ� � Z$O'BL � � @XԲv@Vܹâ~T"eUVͽ-qM+W… zKO>|>J.zyGd2!pC믿�´5PB."p jҤd!oLi`g1cV5b=jٲԩYl"I. T @]p4r4sfO@�H�M � � � � � � � � � � � � � � �D@<yA8jZjV^- ,І %Kz�s+UTܜ+WȅBڶm6mڤ͛7{K m_UP7nUTIUTQbRquE�@�Ho;%sNzLy � � �&`a%ժUͷz]h/^~ASLý} y睧ڵk{5jz*QDP X@X вKz}'OT|tA^`-9-[_G ƥ ( &=THv[|vg]3b+)0nݤ5k$&@��Z!x@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�."o>'NB֯_ ̟}6nܨ+4@7| ` ŋne8:VH`޽ھ}nX-[ ; L ̕-[e˖޺=9s @�@ ZaV1� � � !CK.,,\'9 VZys*ַ/x(YִiӴ~;ǂV*Ur޲K}L#pqۂV^́k­\r^ZΝe:uO^n}TzYiЄ={vwق,\k̘1 E+?424f@,QCpD�@�xj � � � � � � � � � � � � � � � a :͛7{C6m؂,owź+Ez6 Jh>묳8|vڕ%&رÛ-+nfOWɒ%.b/4sUl1!� �D{MjE= � � @jj\6Lɓ96B){son† |ro^b,xi^ @ *|Q˔)Ͷn}Ĕ1Om-0^el-4&dz4:/4f͚V˗1*in>}c~&\nN0A7tڵk-[&|`R_7;Mt_ҽJw%!/‹Q4 �@- � � � � � � � � � � � � � � �@޼yUR%oNH )m۶‹FK,h+W.}ٲl<۶ PB|zdy1E pgσ}i޽ڳgO2xlO-Pɞfm6[[B!ohP%Jpv!@�@�hp QΜr&@�@�@�oaC~#ʝ;wB-Zj״f/?4o<Y_w|NBɒ%UT5Y?7eL ;v3>@-m޲e6odKY虅f˶II4dHm֭}]|Zt,D/M%J JsdP_% .#=d(@ �   � � � � � � � � � � � � � � �d BX\9oN%=e![6]BI|D/'Oϟ.xiI“6{l!Lvn2n-hۜ-[D;l!i6:$m`e`d&xX߾ Y^u!Z cphZ d( Zu$-eKoL � �*`Z" � � @"馛> B>M~ZjysB'Y_׆ yӦM^>?xAPuj@_YV˖6[_on>K>pN<yZ}<ݻݽ{kK70[o={v,ׯ-m=eo6#+[.R߾RBkL8Qu߮7|3tϤIr#R۶Q@Ϡ Fx@oR^!� R"� � � � � � � � � � � � � � �D VdIoNm?l6Z@m{X:Yhƍ>vp(+75S X˖6(^LLǶ=Gq wc�.)ĉͶv1o^m8eKNJ'kK x,TvhѢ.؁ҟԪ+;.  Sq � �/`Z_Oj� � � O>)׏#H\U^ݛ:%-Xkǎ>�-X-[c<|pRr-H CLOюC; V?[>Ĥ&~]R!/,,VX1UV-^Xf ѲՕ 4H7Nz)G7W^yE-Z/=z$~p_ŗ^z݉ќLG׿瞓δjpa@�^@4@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ + pEt`@V qGe g Jn:.e#GozN.tj7X^ pˎ zܹeAV`}_m*=L~MT_~k@D k � � P+� � �@ɒҽп^˗K5jkMW$ X͕*UJU3тs2 Z( ׃6n<OH=Wփs̙`y@_,Xe3!p.MCHÆIݻ>%^?}0`5k+&~pyU¥nFєL߽;ƌ;#L � lK � �0A1Bھ@�@�@�@�@�@�@�@�@�@�@�@�@� XtTv(ye#=4v/ {ʕ3N\@ r&�?Ƚ k7Ƞ r@�@�@ULmy,b'NH I_}%e^CSo+pTdat]= (_|Zp><<^=W"->l*TW5B�;bŤMç^P>D@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ Qx¦EhYtڵΕU,@�@ vbcéF@�@�@ ,H륗ƌɨr@� H&IIO>ٹrҌ3O?O(;k|4xp4&t4ztdU !� jEm � � � � � � � � � � � � � � �d] ʖM:5ȓGKZRz5ij~}eKB@�@�HOS@�@�@�][:TzA"*IO=[]V-9R>-Zqi0k5#!T=GZF3'I@�X"Qq@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�0 *\X~9.]>X:yRjB"7_"� �Z@P S> � � CH\ u*= @VN{wԧ&пp]uн'JWK= !Pԡ4ztDTJ"� qjE- � � � � � � � � � � � � � � � ,`ZEoZIsJIeJ^+ը!MY@+@�@� :[JF�@�@�"E Gi4i*顇"Ț/ ]u?7Ȗ-L[L㚥å>}*U"T;bGk1 �D�Zr& � � � � � � � � � � � � � � �$,`g@EIfI&5m*+//%8% � �)سG:vLM� � � +Kc>4zI@�HW^v:v[TdIM4I'O֜9s?0'%=HV*G@&RÆWu*� @  "� � � � � � � � � � � � � � � @R;vd@MjrIkJ{QlYii۶Q,@�@�HZkm"PO@�@�@ zԥԭeKVנ @ X?4tԩd} MW]uz[݋֭[:$ⶽ~B"T8BG.NZ:B@@�SP-@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H�ZJFS^|Q*_^G@�@�SZE � � �YU`$`AkWɬ@@�8P3駟Z$ Jh;v =z$;Y?x^KmFTթl Xp}#!T@�0 P+nA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� XVll G.,=nSGIUJ_/-Yh# � @ZZN � � �)P'}!:[I@�h\ZTAYjJZ,~ϯӧO?G{HKI<AQ!#t]Ҕ)Rh@�@ @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@,Ph3+#ΛWGZJ6MZ\Bukihn9mC�@�HlA�@�@�V[x9_|3Z[I@�0ɓ ]ϗz6l_5jCsȮ#9¦#Gk,TwL3n_TgOg>5M! �d�Z~ � � � � � � � � � � � � � � � �Νj/G%K?.LrcilKI)�M��@�IDAT � ;L@�@�@� |ԧԣlYL@�hD{i$?q`?ԩ]ѣW3ҡCR0s=94 4~{i,@�@ H@ V@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ԋ@޵֭oJZYSzegjx@�@�رC@�@�@�3F+ӷlJC�@vHгj4n?XR%,*FӧOwViذa@:jh5wTn:_H@~=/_y%'r8 �$(@V,lD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Hm*ZԿg5fϖ-lW/bE駥SWG#� �DΝjEǝ � � @hr-!o/<P* @ kL֬7nvFӱD kPZBs´ґ@xq=;8@�<x" � � � � � � � � � � � � � � � @ >F 嗥?t~X*[V6L ϕ(@�@ ,PpK@�@�\X 7 < �`]ᅲ.JNE11tݵxAGԠT\:u2\ {! � �ZI@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Y d72 ]wI'JII֝y� � ! � � UH>̮G�H@&oH6HªEQÆ /H<!}{cG/R Ԩ!k'}eQ �Y]@  � � � � � � � � � � � � � � �D YR޼܈0z"Ұa`#ޓl`nݤKðT @�@ vM(@�@�@ .X:U7N3&J@�, P裱ڴyTԣWxT4}kҔ)R<S@r#}hQrG@� P+)!� � � � � � � � � � � � � � � @X X'/^-R:Rv….%#� �dǎͼse@�@�@�Y9Rn魷"@tl٤.Xm_DjDQC={N?/<({Ԩda_W}u}C }5.U4@�(@VV@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(ع@11Rn/H'+]zt;H>_FԂk � �Zq`ֆZ@�@�@�޽믗>0Fk@�,pR߾O?I? YXА!RҀҺuѱ>5ɓ瞓Εʖ ͵(.7MһdC�@ u5-E�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ v P+#ojlRv…җ_JҕWJkK";Z � �-`j@�@�@�HqR׮UWI}39@ ֕&N=4gTtƍ AQi $fB RRc� @ ~!� � � � � � � � � � � � � � � @ J!TyGZTW?PZJرҁ! E"� �\l*ZԿ' � � �)ɓ,X39@  KZZzyi\Z5'֒cת%Z%͛'͘!/8 ȕKW4I:x03kµ@�\"Qs@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�jfyLAͦN֬:u ʕvԪqq@�@�T kxw' � � @_yEjNj^ԝ �##!X! *=ԬeK`+.PzQ.,uep4&p0-. �^}� � � � � � � � � � � � � � � �D _hd=j]4vR~m0-K{@�@�h69Dch � � @F!ԢԶhQF\k �d@HK;wJMH6%_{޽M2eeˤ!C\?#wX[7w(|p-C�@  {B@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ j*å'fϖ*UwUR � �ojTG�@�@�@ N &FzuK_@�(UK+Z:y2~dϚ%M.}TBdzH8PZB; �N@yq4 � � � � � � � � � � � � � � �CҁRѢaR!Oଳ5kɓŋΓ:t`xP<@�@�HkccèBT@�@�@ brzKjLj �)-$SO?{ڴ.t AB=3DCkh �+@Vzs5@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H';N!*&gN{w_ߖ]rԴ S, � @S  � � �VEQzDd3 @Ԩ!]s+tT4s ń@4 (}lY4!� j)%"� � � � � � � � � � � � � � � @HZ_`nU^=jK;*_>䓔Gf&u }RRKӧKǏgl#o5iU(iܸqf@�@ =vZ_G-B�@�@�H9^vƏOR)>Ty]W{=:*}aLeNh5j$)"dALd6mjդ1cBki# �'@VYR � � � � � � � � � � � � � � �d@Z|>_\ ׭[)ShʕqaeڵZ~lSӦKSGC\YrU:x0cZsN}WZ|yo5D@�6{m= � � �--SFq}G _?w_Sx:ӉbQ]CJ]'zTl:^s{4`4}侢� �) P+P� � � � � � � � � � � � � � � �%`%,z͝;WÇ;{:�7j+\zX jԾ4xT裒w0ӹ_TDc$?ف� �D YhVj#� � �H&I<"'8U$*XZ5'c3sGV{Lg__ʕ=#_Ǝbb#j&N  ��ZH) � � � � � � � � � � � � � � � ۷t9GStU Gf̑#Gʖ-ї///$&q3`ACS|nĪbŊL2^B IODv � �*`jEͣ � � @vWi^ڳ'B*N5H1\Y1V ǏKo%'4g?X+%  Ӳ?>+MW\¢T@� 536 � � � � � � � � � � � � � � �YFikua4^~::u*U֬Y.L۷oo͛7w޺袋m^~e}'X{1/^<ngmTn]w}*T̛:u]հaC:yr̩_ ,_|ᝓ7o^=裪T-[s^׊+4c o`lTNoQx ޽۫ct{{w䃱cjɒ%*Pw֭[N78 ,M$=?hkW9sFmf.]:PGV'O?@V@�@�(عS,@�@�@�j :v7}W$lGEO.+Svz2=}G9sح[7x~DŽ$";_Ԙ1c4n8q5jT=nذ[hϯriquǸ"m*ׯ-|.4C/K~·d`B�@�' � � � � � � � � � � � � � � � @x >Gٲ_ ??!CW_UZW_yYMuM7yaU?~I><gϞq  XgVWm: ̲yiӦz衇K/yXmΜ9K,<B={x۬ ӲK.uWzeA]o]BfϞ+W~v] 6ھՍN֦M>#mӠAH' Z(w?N՞۫p^q /sʦjժy-?@�@�(n, @�@�@�P .}/g矇@{95kL󂭊+뮻ӳ,*G :# ޽ \=G;+*㏽`{\gz1`2cRi^+D@;D&@�H�Z)@@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�?C�<x~W/󂬦Ln=zV:uTPA͛7W5hҤI9se,˦%K'ԴiӼrm@9 ߲@+fSNݻw-[B{';[p?[l xK1w\/,+1nȑ#V6]7 7|p=zmeZzꥋ/ث:th]%Ye͚%7X\x\{iÂ^Y(￯"ExE  � v@pi# � � +}J_.=|xԋZd]'xaXݺu˕+]zz7d}֗TcZˉ'zv>/}3f¼X;~:vn}ׯ/cbb}>}6 =^}Ur6L $`as} * �$ =mlB�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�^<:y^u,YRe˖sӦMuYgiժUހujtm]٣}i:q:u{ 2WR%;TR޹6؜].]ڛ ,믿^k׮uA taoi9rDǏ޻۽#wq끕FiK8 ;x^}8{l65+~{gQʉԥ6w 9KmH\ =JhB[N(@�0;&P+nE�@�@�"\ _>iuq;O"QT?"~s_)[ooVB}ט=w[iƍ25}W^yWQZyh}*TСCuwhuGBߣX~ o{=9݋@"^}EՔq")4�@� rb.� � � � � � � � � � � � � � � �ؿ? R: .p5l{6'8]ع6|>\n ˗/իuz#GqΦ^x[9R7_9sxyyk7߬u֩cǎ^ӡCh۰aO?y}mSGIQCFJg%G„� � F@Vll 4@�@�@�(-4|4sRf҆ i,H-0ウ4i ep=GK/%JwlU>K_}Yt~* (u.=G D@ QeȄ� �I@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ |E?{wS=cϾLv %kR))n)O;E;) Q.ʾ ٓ-\kr͘Z^8ι>Ϲ|mAV{Ѯ].+lyZ_vQ뮻NǏw;rݎ;\tUz<y;9sFSLQt܎{=yC9ڂ .hرNG5{liFV>/tm>}Z(+W&LIO>)pұcAUU*� �je"'5ENI@�@�@�Jm[i2?*Uoj nSmm/^TZvZum ͛7//H?J-[JK&hW6F ]9Q!Wu*� @J#� � � � � � � � � � � � � � � ?8R:uJ"-Z貢XB2eRe'yۙٳg/& "##6gz׌fYVv*{w߹A]M6kwwc=/i…ʙ3RM4IW:ΥKԩS'޽;jY/.sԽR"RҾ} s{$ag`k@�@,P+"G@�@�@�BCBirɚO7Ӷ"Y)!=ML펶N:@n{ܱc|I]O5fYiTDo{t/0,dI飏|ލ YOXC{&do*� �Z>1 � � � � � � � � � � � � � � �#VO /f;npٵk6nܨS oeA[olj/.?Yjʔ)W^Сz-wC< ۷owWcAZٳgWѢE@,[o![6/aX/^Ԉ#rR͚5UQ:ӧl}eVzXb^O(7rBĤAt�( ?^KV…_ſ[ � �A&@V]P� � �@Ҹq҇J԰wo�W@5q/*Y'O=kwqĉڿ[f͚Ӻu*}=̙rХƍ/Ҧe/A�ONtC@�b/*cۊ � � � � � � � � � � � � � � �  x2<Z+WW_};wvׯ?._*U+Wun8V=ew}ΝuVu]6lpuUΝw}'oΜ9zGPcǪ`>}unpBiFހ-wu]N:J&QF*Wz!ftȑz'y3<GFFZj¶FqYԩS<xz)UXQ/eNc-!9ZX.-_={Ve  � @ >,EDZ/ � � ? 8ZTNۋ49m4\Z,&MRvԱcGuE:tвe˴h"̙ӭms֠Au3f+"k;0`[浶>.}?3ƝOR=^xQuQ޽:>j۶{k3wK r@GE= �" @�@�h<G � � � � � � � � � � � � � `֏\F8s7iӦM*]7 :q9s˰.]]v;Qxxe{a3l۶Maaa*^;o?L2)]tQ;yz̙3g1cF۷Obɓn(X%R\/W_VFNPPN>.@�`F _<KfMy%';@�@�I G*\~I`@�&=4~#oHY;"@۶#5y`]@ȑ#TH+Vcjۣ… n޽{ݶϘNi{꒳8{VGCi9q @b<"Z%U# @ X8K HB N)7%A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�&26eC4iTbEծ][Wiz:C8[`AZ%KU|Blٲ]eq-Lˆ ĺ_ʕ+uew|4gwHUJ_|!v -´`@�BKcGDV- � � @`Xx'xO,txq`R@ܹNe ԶG+w)S&3SMo&-^8Q:0r渡!аT;Q_j� @BJ#� � � � � � � � � � � � � � � @ Xg9rxBZ^( K/X!nY/>D�@�Ucɓ � � �\@6oIK H|@Q`hre),LZJwd3UwoiȑX7a �!+@V^z*� � � � � � � � � � � � � � � @ x:jլY+1͛7Nh޼gh3L3}mذ!J!@�@�SJ� � � @LIӧKFI| U*\Ӗ,C hsco馄G@ +}#cI?$/U@ǎrNAC)A�@oMI( � � � � � � � � � � � � � � � ࣀu7o. {f _Q'N::=SF=۳ۥfͤ9[H s � @ t4ZAvY � � ݻKMH]HjI>+  Sd(_NeFNSsDo< P.]{O0@ʟ_ZP喸`$T sf[7{)M@�^R3@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Va J6mmX d͚UZ=zHjpi,sg:*Y2]X� �/ � � � P4o;0?<締-*QB2p'#\?,-]i+4ƟzzKkeK*eA�@ uS@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�HuOg wcg}VڱCPs2em+ޗ � @ W#� � �-&#m U(vԱt`hP{@ {H;KuHnf4daZ ud{"Pt睞@ЄǶ ��Z~ � � � � � � � � � � � � � � �A(`J~!1#ҦM҄ ֭Rj{B@�HBo߱C!� � �@BԩW_IKeJFI)Z N�_I>+.4I3G*_>BH^<-[@�d P+YX9( � � � � � � � � � � � � � � �$ugHiHmJVI}'](5i"U.M,] � :}z)[@�@�@�]-륮]% _C׃#� <)T4zg~Fu`9$@ӦR"{%9& �)@V`^7J� � � � � � � � � � � � � � � @ DFJG7@*Uۥse<YTssRP@�H"Ç~D@�@�@2g V.\Tk  @ 8!TgҶmR߾RCHyp'1GO??gD�@ǫB@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ Vc<FDĺ +H6ե)SznAzu:c@�@�Q!Qf@�@�@�*W~I=Z6M*Yu\F |9HiGii`){`1uB pwN><pLI@�HNSc#� � � � � � � � � � � � � � � @ Xg6q(Su2|H2qV@�@ ;O~ � � �@ w.Җ-RҠARԩ[fJ�$}=TR~/Kr%8$V֭=@�&jR@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�B@@T_t:SҘ1 7HzI۷PE(* �}&6o*� � �@#m(ը h@Z:N@ D͓G*[V5K:Tڵ,#GPmX` Ťh �@9 'A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�!T-| %ѣ=˭y%qvA ӹ~c7ސFڴyF\9 N!@�@�d8|Xd:8E�@�@�@>LGz Z5C<O~TT6Iv 쑬{˗[Q/*p4n4rat-_H-[JZjʅ�&`o}W#L@�mBS{@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Z l֭t1aEhhZ<ٯCB@ S&W/G<ӽTtҳJ �UD�@�8tTp � � �$RV-={NФ]A<mS<, 7H'JO_2}?Hka@VF&L[PV%| ]֠_?i0)gkG�@ Ȃ Mm@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�8ҥؗ.IyF;XB @4RҚ5̙ҙ3RÆu9u/% � dZy � � � @h I/_ =[*UJW:p ,B2HmJiz‡1\ڵ 5(GJ#GJUJիKKH/$+MV\Gʉ@t=?Ǝy@�BO@л@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�hX:>";'T"թ6A 5SZ@')~uk|y:p8@�@ 5.\""R@�@�@�HFUڼY6L xqi�kSC -pfMH? L ~9Wҍ7JKI3g`֍R#%K � j � � � � � � � � � � � � � � �@uX`=LlkYԪ%My!oJ'O^}ߖ-@�@�tIV|RG�@�@�vmF< ڇ^6r玽N;Ǿ5R߾RRӦҾ}ȑKܒ\ >*m"͙g ��Z}}( � � � � � � � � � � � � � � �!/=Tr yJ[Ǿ5@rرcm+=T4hPrTdS@�@ )ɓG � � �@LSOy/%-*#4itbڴyKH =eH5jH~+Y֭?HݻKYDI8@ŊRzһY9 �%@]J� � � � � � � � � � � � � � � �1uW̝YGwO>)MN,B |SڵKz =r>sg̅2D:~\jQ^[@�]a϶Ö � � � yf?t4mTԥqc(۷ΟNK_mÒشIJ ?知͛=[%J$o8:@^޽_J� @j@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�$`ԙ]tR :#wrIy^}U1C*UJQag-9{VjDZ!� �8tH ;  � � �\-puR>ҶmҨQҥRRҊWoϒYS*TFFJ:]%$TT4|T4gےݫ  :Zyُ:u �D P+ � � � � � � � � � � � � � � � uH}׏<"e})uٻu4v/RJRfС.]q4gN֙#� @ XiIe � � �Mu"['M$%U.5l(M&ٳ{oZ{SV>+'%=נ4o{y^$ �Hch_% �I,$p � � � � � � � � � � � � � � � 3JjIaaO^3@M+u(]+͘!?.z4~'D[OoVӦ̙ޥL@�@� >,ED$lF�@�@�@ ,uki ̙V<8o)W(^;ti[ʒ%BW ikW)o^Oώ%K{#<}ud@Ҟ=-@Js.@� P%A�@�@�@�@�@�@�@� @��@�IDAT@�@�@�@�@�@�@�@�8SliR@0 X\fRΒuy)Yuh1 � � @<y#� � � 4i"͘!m$5o.Te(@Rٲ]:v5s$V`ip<ڶ|.'_/m,Td  @tR<!{FE_< �!ßɅFũ% � � � � � � � � � � � � � � �@2[GvV)-8zT81,T%eK/cڂe � @k@�@�@�MB/_i?f͒ʕK9߷#Ujt"M9s̞-pRRɒRsI9rH~(/4`!kK@ %~Xiޔ8@�@kAI@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ jդlPTn 920-o5-TEMOw9S@�@ >Çb= � � �"-Էy4mtԴTKbb۴ki ڶ2dHRp@5k^4r咚5-OZP:rD4Iԉgpv})/ вe( e@�@ J9k΄� � � � � � � � � � � � � � � � &԰�<s bWHiiذUtIj^?޻) � CR<qoZ@�@�@�H@wܹ҆ RRѢ3fH/&l|v]jԐ, <9v>s'U"',<ykJCJ*Mu zK]HGK�  ��_CJSO@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@q?tQQS?sΝ;ϟw^ßPXX?UEO<Fރfͪ\r)gΜhyD… c"ET`AeȐ( XXzO֩S.g]γN"uY:ryǿ}{,ٳgޏ… Q޳4|eNaVm>* 6>F_Ljc'yFw]AK\hw;erhїe̘Q]w3eUB� 8_' � � �@ٲҰa+HSJFyB+u&u.9Y 8qℬ;rmO<h$֞x|tEvo!sʒ%KclvaWzܹsK@O,m&H[WN{tmRժ6;?)2@� xz iLY A�@ ba1 � � � � � � � � � � � � � � �$Nt6mڤG6l6w1;Xq  *Z*WbYXЍ7ƂqoNVU& 믿@. Ԟ={m|“/_>uz,,Wʗ/*TpŠ"RY^hAOx^=zF9BwL:v:'4+yo];UydrBœ 8y`?=D*7gTWNm]@+w -0eZ6\tE{ve�vI02PDfe0k vyehn}ڮf̀� Xӿ3 � � �$H/ yA{%')?Cw4胵'Zx?susx{]I+g֞am=xtfM~LۏjS- z`%Xϖۼ{Y{O<~TpawvRMaRWp'Dk|ivZ5m[9R:P-)gG�P(UJj@P@@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�kرc.]5^ /W5o\eʔSvd 9Ոcy;۾}YF&Lp;X'z5k֌of:W b&$ѣh&zS[v1w:XJc<Y3Gu�i˼aLidw:tmЩSA9YGh#Moӧ{h;Z֩wx焤pGoZlڮ{9N8msʕ벩-Cm9گ;G@�A[;@ : � � �@С#'I;VUSjRpƍWyܬl_Ja%6m͛q˖-QS{~nDDDDOY=ܣY%Q۵32Laf}<tPT@6'QmڴgyUt騱b͕|Yb<E7nhU"YpoHYtHx@ 9?+R䔜@�T P+U99 � � � � � � � � � � � � � � �'`@sٳk׮]J6nFըQC=WhO>+kge\޼yݱZjWcZv-[掯!Cխ[Wv;VZ :famޖY�ҕunh!Gу,ԨXbW!eϞ]f>h!Z6'+ d@ 1tBEc>omvZ'7[o|h_~nFZVG@�pƸQπ� � � � .Ԫg?\?^v9QRpnpo%4n<MҥK+Wj͚5_믿j߾}n-¢,8QFNXOwQ ,hk $rg响 GݻuVBƬ sno˗wcornk$>Y\nqiNއ֜i09mrl}?.["�-`arIcH?g �@NSꗉ � �A%0r4x?<jQ@�@�@�@�@�@�@�@�@�@�@�@�@�N&M˗/w,4B4iheʔ)Uv:=-X 0 Q-ZM6jܸӡӣC@ X(ў={4ڵ 胅c`AC0 !ʝ;wԼ-�- Ʋ"RK:+-ouye Y m[ힶ?;=4(P4~ֵJt`?uf@�LɖU͚Ҏ 7`� � �-#G.\ ܧ N>DSiv9AJi@w,|ɭr7>L㎸Oʵ''vuIYKrTR%UX E뒲 t,{o[DfadLf}%TVrxFN<9 ϲJY1n3֮-]w]E�P=Ο(< H@�p 9vQ_q@�@� P+)9 � � � � � � � � � � � � @jXGlƍĉtRȑ jٲ6lٳFR&c͜9S'O֊+@{W>4hbeD >}Z�k.wj{u,D?up) E͛ ϲ�-@!۞`pehs6Z6o?+>)T;,XН)Rզ V| ؜ �[Y39[K3H)& � �,@V�_<@* Xk9U3YjU<Z%K^^0籭,&K'lm=C;w8=/ZH7ntJ.<ըQC7|)S8%pkժUZ|ێkSkʚ5ԩ[oU7VjB*`k69an](BTgtrn%@ n>\?JOi@� P+ם@۱' � �Z>1 � � � � � � � � � � � �  z) =鑯M6jҤҥKG%M٢ܹSSLф rJ-[V={TN3gΔ-LٳnXe;ܩhx(3=c?shAYi1/ʌ*p97`bvϟw-ZT7p+ŋ[Ʉ^߷'Pw+D T\=ߡRc� � @ @pA?5ud[07\B6>H孯5+ٯLM/:D?:IE3fw}_~}kMT^='.mgM^~M/vG 8;prȡF9ԴiS|O-͚ǎ h-]*'Xs>kζhծ:M  @P8YʜY련@�^@_boǞ � OjF � � � � � � � � � � � � �,h 2Dk׮U]vʒ%K*Nj*5J}.8vM> Y@϶m۴e˖qںu#_mN�<c=e<6FDD^)1A(`y߿_e. )@<x)iӦu˥Jҕ ۺ@kcoQ7ޒN � ��ZwM(*ZLr/*U UNȕdΣWwٽ{5ϟ9sFg֔)S4}t*Y.vm_e"E֭[9sh֬Yν@gϞn&4i>}$՞�e$fCPNTTgZ15 �~)0qr\ @ �Z08KV@�H�Z c{@�@�@�@�@�@�@�@�@�@�@�@�@�N;/6nvfPUVMb,�棏>믿Z pÜR)X'Ojڰae۝/*<<\ t;eNghZ  ^,`}WҧOҥK\re˖U "kAV2sxPt8�O@�@�8Q`B³-'J:>bl)#vֆ8|}nԮ][-[hRJž3kNܹs5m4}ײg7|:vv)_|IRS}={$rBפoMء-BV+WJ&] %UkԐl̛7agk@ lD7H멧${π� j%x;D�@�| P'&6B�@�@�@�@�@�@�@�@�@�@�@�@�H :կxlg,!眞ƍC:O<*K, ?X͛7kڵfcgϮ2eʸMEHNT  XGi&7Ѧ6ڲӧO+mڴn筕*Uҍ7莕+W&0gb@a!.Уs!A@�@�H!R gKwGʓG ^˷߷o5wڥZj}j۶m.]~F^-X@&LpN8͛;Txxxjԧd=aZv ڿ?99_nx-<BfVUUDb  *'i*UXXԚz"�)@VZcO@�@'|bb#@�@�@�@�@�@�@�@�@�@�@�@�@�8z맏?X 6,BО/DYpI-1U6lؠ+V8߭rիWq2gά *bŊ;_`2@ Nӂ֭[玿9lڼ}Yaܹ6F5j 71}%Z~ hRʘQN ߗ=@�@�@ j%܌=@w x=iw#IGKW[oI&V;wnݺt Wٳ6m>#'p{'ǽ֮i�i8ɂ.\zc䴛J6]K/JٲIUxneA1W{馛 @�guJ{"� �> !� � � � � � � � � � � � �ٳյkW0ۺR̡u駟'|zU,Yݒ%K?kҥZl/EDDZj\әMTR @�dpN/k9׮]tι ;~ͫ5kVZQcL4uhzPA^=OgU@�@�HR�S  K{$ [:~.i>IjݺҥKG@ lݺU y̘1ʐ!ke͚z>-˞@;rܹӳiBtóZU "<EF L9l� Zj%^@۱' � �Z>1 � � � � � � � � � � � � @2 DFF_վ}{39r$Y93ԭ[7ɓGSNu:4rz4 ȑ#Z`-Z䎿2f̨NM6V^-5 LspӦMZ|;Z�mYz뭪_923g_V.8@z98@�@�@ %J e΁@h l / %r:8Dv)} :wɰZ'#uWVc7Txx ={!kvo//> ӊ%mZ9RfRʞ ڃu �|Hٳ ��ZWw~`@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�`8{:w:}ӣG`_խyZfڴiZjiڴin`_2\pA?fϞ+WTܹztEuQ*Uzc@�Tʖ->[ʿ[˖-s?/^#F8ȞSݺuucժUF H~e@�@�@�@��psR,R֬O/]:_UfM :TrKמ'@'azj 0@ܳx]Y9[\mS4p`%#�\@R~ҧJz]@�t+%B�@�G`H9S'j� � � � � � � � � � � � � 8ղeKO8qjW_F jԩS5k[oFgΜQFԸqcwz7i@�`�˗k޼y3g~˗O-Zнޫ (]t]tI4aԶmR � � @\9r4P#ڌu @3Ν;6l:t,%n>5mSwq+nڇɞ-2|b/[  @Bt{reBb[@�8tHzi~<s+<@ @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ &KN/f<~g͝;锁^brJe2dg}vڹ,K.M&$cYyNOS9r=zTӧOW߾}UR%´$ (iӦUڵ5p@͟?_G[ov.۾}{ϟ_zҒ%Ki2 �-r;>Γ'A@�@�@�@ ~^{M 4PZn:´'c/PBmRG3OٲuWDĻNI+'O;ٯy~b �\@ҪUҚ5x vG�@bKI@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ /f̘iUZ5C kѲp{GWvY, ?ݻeKtwk޼yQY d"lٲsG I&ySݺuSΜ9TBIaOmsZSW@�@�@�BKŋ$n|5jL3mRXp7Rܶğ~z^~U] ׮6nNix( @� ԫ'.-#'л) �!ՠ � � � � � � � � � � � � � � � ]`2di;[nU̧@4i4~xȑC]tIŒHVrCbJ;=,mtz;v. 6L5k$L+U'G�H6nv}? ,T}Q3P7P@ ZNF  � � �KԾ}{} kUʟ?̙>/oܸ/_bŤM'FL:qBڿ_7O9RrnE@�dMS @�&jR@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�/gϞ뮻ԣGL ݻW{)dѢE;ޒY?v;8qbҥ hѢڲeLttT{￯͛W^'O'|_9stiXp*[ :>oF2$^HB={VVVTL%K|իWkРAR^|XK:Z+Vd̘Q<ϟKԩSPq9r䊭y�@RjwH5jH͚5 @@�@�@�Hf{?k,wW^-Ti'fϞ,YR:kn;={ٱcGʛWjPKrπ� ;{B 2!@�HERS#� � � � � � � � � � � � � � � &L͛o'P߾}JjĈPcǎcǎ<P[fM=\?Y0koQںu … Ǵ9Ho hǏ ͜9SvO2[sNӦMeCl>ƶ<΃ʣGAJv=,H)% ZFP;Nol~=>>w7lؠ5kihj\aŊ5n8^6_/@� ,Y V?"aggׯ~>'u@@�@�@�H3fh5j$IC񙹯Lbn=C uW.<<\J(ۧX{P@@ 哜lC't �$�Z @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Hi#GsãRz}/j={$0`�7lΜ9y'NP5j(͝;W͛I#PjUu=X4i|>hClٲQĴVvY7tSvX珍7*^x!݂jy2eԫWTSbk-ĉ?>l{`ʕ}>tzԭ[xO:[x6(]+s{I<`5 Ky$W~;Dr[w-[a3 � � �$pYG]vսޛUg澂 o;MBw|=~jo>}z? 4CKj_Ώ�!,н4}{#Pu@�7.)B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�e{vqBʺWRE֡_…\uqȑ#jݺUrըQCSLI^u,4iӦ:v옖/_._CŮ: RU&0iӦjҙo3:]ԡC * (gwćp/PBQ믿zլY3/31w1筛w6UVg~=zk1) ܹO2,IFLRb\ϑ#e&C�@�@�@ (&M$k32dH/5 x#{)RK`u.ۼTR_6 @ 8|c4@�R @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�R~4h ){ٱM&8U駟Vu͚5KcƌowyGFXPUƌUR%[뮻KgΜш# ]߻wo(P=o\ǍrY!bzd7G}&Mhԩ->֬Y# /uh`ŋW-twuo>}3h ^6 .͛ W_}UYdq9V\k i&uU>`b{؁|=ދҥSѢEr%< Ng[c5{l^R޼yefCpnݺaÆ}ӣ>~M8ѽ7p>sܹS͛73<\3f̘!wn=^~e1D g?ԱcǫM+/¡C:<k֬nwZ>Cmg}ֽ.]z=>}Zg)wr'FmtŌ/ub~YD ͜9S7|5j~]` �!+b[N,@cN+,]~{ʕ+K.Νsr-z'`]?v;po駟jQ=b^-cb~ye� � � y{Rkyfnݶe˖8={wU$_';~|{vU8f9رCUTÇueN|a|mObV8z^m;N҃s0@�xҤ:u?rB݅ @�{Q@@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�|bŊURxbY6lP^ " rUhw֑#Gk.7`B,ԩlٲm~nEDD!\ԡCnMݺu` l˗/wpIŋГ7x#*+ !ʗ/^{ʎǕ,<(Pô~'YG|vogΜ�B,PQFljժ9Yh2{?o Ynl٢ڵkĉNR܀ pXۄ  ힶ�.gW2}9B@{Yfn>r�TbE-$)76)S&3K в sԵgYתU3gN7 6n:w}^GAq}9_y<yPN:冇Yk%t6[ouineʔqCXq}f_\˽`mݦpt lxֹs?} wz[kݺ-Zm۶UV`-|n!bwO}ce>;yjE@XX)=yxx] :[l!l�-fak!3Ⱦ+o8mw^xh?[,~N-҆W@�@�@�7{^mSzgK,qGn[d~ԲeK-t>=3:;~l/ckO>c=7ٳ{Fl#]w]!kӰ_ړ⫫Cp7vY{ @ 8MzUi|q}WQHBGB^YE:"M, buŮZEB"K]@R {?$$7ɽyƹΜ󞹅x?>GD�@ kPLy � � � � � � � � � � � � � � � Heߺ0΂9ul٘1cԮ];wh pٴi9΂lY>}|AZXgkVᆱ߅oUua[ ee:?tPzey݆ \@B֭\F^h׎ƺ8 JP6,(Bl6 M, !^Qf;o<U^] Y`k%KgqA .tOF`e!k_}^xxT!$XHٸq4gUPAց -Z)" 6t-̖[/[fm`-Dl)B,T+C0%yha ʬm˗wQYrg]eWFCFצ'ksdu >f3{@… ۴i՚4iʷ mic*E"`? ! !7©8r/n]o¶U^4`�wgh֬z׮]nhYuzmI82c@�@�@�0_UR\Uv[egΜ3B s:~{h냹ѿӻg޽;~FÞ={\V׮]եKYUddftOUFmMv{h9xF�HOSIo+!� 9qSUj� � � � � � � � � � � � � � � � XXMN3=uZga9`Ekݢʕ+XutoSN.Pjժ.xfC? ;;OŋuoA5M6M?e>ٝ.^}-*Sʂjrblضm ˉcteaEcZ^z7nxXVlĤF~B q,³:|pb ժUsk ip3'H0>|T₿C6oܽ̍ FU5{lYHiِV.ϋm-B1CJ{o@( 2smk 35^et=smft-y2e ^3mEse׹}/ 'ۥfƔGҼ}ZKJl]9 5?}OjݺuAڑGM7m+ ɲS ɲ^̂iw~]ve.m']z+=) � � �$PX1w_?딝{VW{cgK.uχlk!?{;p?|{fz'ni, ̿3+2{vL[+/8-E �i'wF,F�@ BԊE5@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�F6oª>rRfڵ^;%^Ԗ[P'6..N-ZМ9s\i^j')3IJ4xĒVX^4HzlaӦM.&WcA._|^|Eu1Tj9{vaGua(Q"zԨQ]3 n'tPs,L0BrNyvDzŞ={ԦMdgleҪCZlZV-7럛:3%#j]*!k3kPlxtY՜ ޔ )y z]9Zg  [He7|r/ߋfjCVK.DӧO׆ ܿ,@;@-̵ Xzb � � �y)P^=}׺I X%wBd95nX;wvl`'swѰzj,S}je4`ښtzsNm߾]v1 �@>C馛@�PĄ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�8uaPpoûZWfҥK:駟udWRWP!)R1c$?;ܸq4v9EԬY)/tذaZlx QDM;<u+L 2t թSGЫW/}g.믗uȘC(#GqUꫯD5]cʂZt5kָY;7$i226`˗'={:̭!V`ژ~έ}X福?xXU׮EU 䍀S Ԓmۖ|'mU(n9b 2ZhuTϫpNweVǒ � � �SO<YG jo'/B@nқo3<3O8x޽:ў5FvښV|:SԦM> �!(UJMzH1 ��Zyϡ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@&MTreM0!EqƮGyuf`z٠j䗹`#JN}��@�IDATd}._leXx{%we˖ (ۿf͚]@Wdڵ駟^>|+#߮;vw<51|/�KHc;w[ӥKaiuAeʔq<NL/GVy!-\0։ hXX_L�ؼyTzu5h dϒzLӻ6]D 7$ޮ Wڛڡicj_Uߺ�@D4l!P+uA wT_qƠ[ V:ӮQ^|E٣G|ts3Gz+=X� � � @^ X U !{[=gB6q\'{l~Ң e/`T;|&_v^zԿ/^<;E/ @cY!("@�CC#� � � � � � � � � � � � � � � jnp̅ L4I;v믿nM}СCav6mJvش[VW_}51i֭Ct閛 A2{ bdĈI0'֢E -_Xڜ9srp!-:N6l+-SRgڴinޮw}WgynF,Y-7nl~X_9)Shʕ.63Іmi0 !c=nPY~ilԩ^mm&e۶msSS 쳎+~m9RWv!~͌3dax8f-oΝ-ad(`?KoO-)263,;tkNO>?tisqO9ؾ}{׍gs5ڶvY7d^~=Ř1cT~}i%K\x\n#YŊh3#@?8/^ǚG0S-SKh]c -7a6mォꤳoewUz+;�,@�@�@�@ Ly;r=jJzow\\mG}T'NԠAeG)'{;p?*U|y-\uÆ ze)3gϮikUj~w=c.@�/СT~Y� @ xÀ� � Æ(@�@�@�@�@�@�@�@�@�@�@�@�@�^'p/*XŋN^g nQF x(X[^N[op#<666pW0r׸q=8]ݭM, _|EG;|?㏧)ѣnklٲ/4,+gycǎ^z饀Fܹs/e֎^`[ r s^hQtSÆ ͛7TZ5 6v 6^BJ*gy&/y $ xC f+ #r^xT2z{۸qcPDzd'\W_}{_{1:gT[uVK]vݷm6^ tMĶ3G/X#`f/^`P p8qD? mWz�|jj j]ÇY&+pȐ!Ez5j(tҀ٤o>`͌fs)^d^yWLzCF-[\ ^8\ _K<Wv~]^! kʴ{kڵ믿>?Vʰ{Z9۹}icF$ǁ>]~a^W'3pW +@ :g{ 0jLK2.5~"W]aeèQ^ȯ?^GZl;L{;A�@�@ ߞN7k,дiӀ:NY*TvB s_}Uf͚?[9i?;3dE;u<xAZWDza}d֌v_L<9Q @ ޳H1 �Y?gޟ1dRm � @ SҮ]9t�E�@�@�@�@�@�@�@�@�@�@�@�@�@ CjРA:W R"달#7y qӬ=fydȰ … zjyg^׽{9o]^ .u耇V"E9 ҩl]O> /@H^�d،Y`)WE#^XP,y^m+VXj")yA[*SLbA^ y!{n}xAK[ 8B%/$!嵘rޘ8 6vyΌorLSرc5l0۷O^*/TF[qk8W!@.x?~nYg&/VwijrvIz:x Q2]ig{,c@�@�_TVV/b�䘀=[իWӓ='ɱfPpF>zlؿmhѢ%s?9$E0lKj!iO>0'ʂ5b2?W_~L �9+vtK:(@ }ݻ[@7Oj.mY\@!� �! P+� � � � � � � � � � � � � uvEiZtJ.^u<׹s +|«iK3gt(/f0. 'llѢE^V+Svܙjg*,z Ɩ4P˂R:ȴ])˱PσS(Z[rkY45q9s4zhM8vmݻwX*Uӽޛj!@ t¨NG뮻.h* � �y#@V޸sTY`ӦM^F(QBӦMS5#Km<xN%Kܹs&|O<_E;@�|%ЪT4fLjA�"N@ʞ � � � � � � � � � � � � � � � ԲeK]ve.XbZL+>>^ pf͚eMnn0yd}?aZnsXČ5uhlW\qw֭[ˮpfq˗ϑjnI =yIm}0m@}ex^C>N֖P/5ZMmͮÇ]'=eŹ� iӦ->W@;vjժz\�)elY)&&Fk?ӧgeàV}_5  � � �dNh"SM4ȑ#̕[wEgyfEMw}~Xw^ux tMYȗ[i~|D�  !!� �y*kSOIvi588 � � � � � � � � � � � � @ YF۷g:7+YdJ}ǏkVz^~弯P58t>cYx̧~´:uΝ; /T*U3w?~\7xƌ# `;S_}V$g{? @w2dHX'H`5kf̘K/uA]tQX Gm6U^uka  <"wI?7D7H'P+ V#� �-PT{UV_+W z6D�B!p 4H/C\r(2@`ҤI;TD lyQj�DiU(0m5G�"]`ny/%͛'k @�P@(<4@�@�@�@�@�@�@�@�@�@�@�@�3իW]Pif5ygs=1 ΝfΜ) p .iF+Wγ$$$$;v"Ed#C >|X6&J*t pBey۷oWƍwilR111aUTfڗY; @nEZNg_˦D@�@�H[@mX�#`@ofzv'tmPBspqV=ڵbŋvPa@ Lm"-^ @x]@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�"AଳҒ%Kԭ[75mTw U:۷O7x 2{WtwDTE cц-^oK /f͚:sպukhB 4ȵ i ˉ`</7|KjѢEnܵkj׮mjȐ!Сʕ+VX2e, B k{Hefm_B�@�@�@�8rJ=zK/^ FnèyH֮]>p-[3 � [izN=#� rH � � � � � � � � � � � � � � � vUT… իW/C޽{îBӧOW|r@iaZ 0`ƍY֭ӣ>8Y`9眣%K`-kYp͑#GR+e @ Xx_|ÇpÆ *>>^۷ѣUbEھ}6lؠ#Go߾2Lˠ;5j(G)"G)@V/j� � � @( .Gy֭nvժUKCCy(ʊ0ŋgϞ:묳kԩZ`aZv. `^(U$ �'P Wmj� �DkIO=%9u � � � � � � � � � � � � �[`ڴi[\]@Rlllnt.n5c ]s5zWUT\Aj߾}Zl,Yľk/*X֭ƍmիƪVw oN8M6=WZ傣,<Blu۴iSײeK5kLŊ7!zx꥗^ vC�|,,%H<I@�@�CRګZZrX֎*!@ رÅi1BGյ^(Ek>|^6mk׮Q"@3@�+0p4iqT@m'-C�U`n|yi<]pex֋@</ @��Zd@�@�@�@�@�@�@�@�@�@�@�@�@  ߿_>^unO)Z6Ν;KÆ i悴:tR#w:߳nV\Bn?xuY<3ugȦG[{Z@OvZnf:tH r!g~դI 5L>sO9OoS!@T.ut}Q`� � @&'j @{FS޽UJTaad =ٳgkر8qz꥿oE) @+V>ynB@� P+jeݎ=@�@� @�@�@�@�@�@�@�@�@�@�@�@�@�H`.XkԩS~X={TLLL(m6[oL2z衇t7`ט\صg1ZʅX ֭[u Svm/駟8ڲ^a[t8 y pm޼gmܸM7lؠui˖-N>>֭ F 勋˃Z!3^zꫯ 5O5D W'+  � � R@�HXtyM0A ^G]~ѣ{V)8zΝ)ShڵkZjBӮ*oc^!� jRz|$�D�ZY?Ujeݎ=@�@� @�@�@�@�@�@�@�@�@�@�@�@�@�X`Ŋz5qDR2`�s~*W\,<\s#FpUPA M7ݤ… g#VvZn~z}\ ,HF:TfM7_+@Z@t X ]ghAYB -Xl`:u^[Zgzw^B2GK?>H|D� � @ !@Gѧ~!~ڿy\r qqqi5sL͘1CfrVϞ=ջwoժU+@�rXCڱC߳(@ �Z825CV@�ȼ�Z7c@�@�@�@�@�@�@�@�@�@�@�@�@� # x{߿.BKӲuV7No6lؠ֭[[nq*T(N\yϞ=.\kӦMG ?Sb�UZj^u*UG #t+ .sNeY޴э:lHgv&-DSN6K'|_H@ GHZP:LȦ � � mMH 5w\wq4vm۶ Ԯ];5nXyX>]{> y={֬YㅧVյkW7֬Y3h= eL /]qE5"�y,@VO�ZYcO@�@ (bb#@�@�@�@�@�@�@�@�@�@�@�@�@�00^o:o .]Z]v׹ر)<&N˗L2ӧ jРAѣGC{,{ljX]*Ur[+WVŊ|ʩo飯4T_~ю;NZHh:?,˼J*p5j;jAw111L+mP\9(A�XRjPZZ[7J@�@�wjSJjuϟ{DjժZl-Zy- 8vVZKqѢEsbz7.BuAw+ P" @x棢E>*SQ@ _HV@�J@@�@�@�@�@�@�@�@�@�@�@�@�@ ,h„ nي/mۺ."Pk޼y5k�pڵ.PG+]s  3FRjZh?dAsNY8?(P@e˖UOSO=5hrmzLY_ݸgϞ׻|,8 6DŽd)RHbhtUVM-,˾/^:Tj l֬YW @ x[}{yA:T�@�@� P+N7E  wZ`/^%KhӦMΠzjҤ6mꂞ~eZdak7믿v:²ޯiƍJ `B� ѣn"*L#@� P+링@۱' � �ZA1 � � � � � � � � � � � � @Xg}¦fϞ}yWphB͛7wa%KY~֭Ӳedaa6Z't'NpuA;vyGPRDUҮ - CRN-dȶN Sv[V2eXt^۲xYg6kcccS<i XYؕk\޻w|iv<xrO9wrnNg59qYx3sި)9)0etґ#~(@�@�R Ry/_@3[&+VLgy򗿨N:S{mXq8v6oެ׻ўakʞPxqկ_߅}ٲ⢑6#�)`G2D wb3@�l uBnǞ � @PjF � � � � � � � � � � � � �(`S_~͛F}v(PuzW^=խ[7q<3\'oyTm͚5Zz+VB qƲPs=W\pʕ+U$`- (J:!FM-㩶,XBіmj%JH6ZIY'6Ĥz捀ui!lfu1弭￧ڮ#R z(IpS }G+[ .Zq,i}&L   ߖ[f@�@�@ ep�a'`WZ+Wт=kk֬jժjժSuJTHk[z ڳg{^m6OJ:[l=K ,lkÆ UV-,6c@�NdIjkY� je]@۱' � �ZA1 � � � � � � � � � � � � @>ЪKoM Z~}bxbc*U\pt0 +ull9ʲ?Z{퓅Ɲ;wN9^~'|sYgYfjҤ;N>9 4#,$iP$m4Dɮl HõiѢE2h26M9/dGSN=-BR.&)Ӥe }4kYj/ggÇ9Z`vr? YpZjaj~h!I۹f@Z+VQFO>b =' &m4@�@�< P+9$DݷP- ڰaC|_~q/^\zIQٽt[sO:{Ԧlž1RN9=9p@=_O9VǤaNS:u\=Se@�@ fI;Jk eɔ� �Zid<.M@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�N.r7{Xu|qFݏ?fy=Xr"9N< ,xAKTzu7y普c̖RKZj&1iǍrJ+)i vڵ+Y@"O:F`f& K*fbYǝ-ϣmv鿶}i\].]B]4!@ x?E|: � � �P­,L{hZ?vyR`XٳH{'>?9qDjť<|Ɔ} !_2i=\j1 � ^({H5J<87̱@�ȼ�Z7c@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Ȅ@Un]7[ X'w JcYY)Cn,BlEgI{;v̽ON-mnZmmOBRޖĸР)Ygh%ڟZG{vC3fPÆ DIԡCw% K0E�@�@�@�HDecf{xYFjWׇ{}<Ogh:@�]{Fw{5~ �,v@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Dq&U hʪ^TR%-ZH^z.YV#MT 5kx 0@�dj%`@�@�@�@ѢEecr2lmGIݻwp[6@�@ Vz9iB"@ ZH@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ J.‡ZlB>/+um Z}2eB[&!� � � � � @x 4h 5l(v �5� � � � � � � � � � � � � � � � �xEԩSճgOuUƍx뭷t@�GCR^#� � � � � }J&HGFG{i% @d Z#� � � � � � � � � � � � � � � � @w7z6lX"Y+Wjҥ馛r@�)wTLDVJ#� � � � � @6JڷOl® �@\O � � � � � � � � � � � � � � � � @D (P@/ʗ/vڥ*oj׮??!h=*`e.*"� � � � � @>^]jF;V|P� jE � � � � � � � � � � � � � � � � S>ʕ+hzS\B"pa=Z1 �I~@&F�@�@�@�@�@ O:p@*Q"ZN[@�"EΊ3E=@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ nM4Iz#Gz8 _~ٍm@ J@@*S&JL3@�@�@�@�@�@ WJGJS&[  �a#@V؜ *� � � � � � � � � � � � � � � � �(Э[7͜9Sf%\=IBrzuUWRJ �' EK � � � � � eJ:IcFAci" @D J#� � � � � � � � � � � � � � � � @n mV?_ws,>}֬Y=!@ }#� � � � � Ro_i,yϽSa@� P+5@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�hԨ-ZiF[lZSh׿Ν;~lڊ� P+Xl� � � � � @>M*\X|@� jE � � � � � � � � � � � � � � � � j… UhQ{ZjUnc!_|x mX�XVXɒX � � � � � @ +&u.@  C@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ *VN:j۶/^vuB'3Ϩyj׮]5#@ R|T@л! � � � � �C}/lɇI �-@VD>*� � � � � � � � � � � � � � � � �y!陋|g.袋.'|8 u>}z)D@�tJNwV"� � � � � @t(-+ �%@VD.*� � � � � � � � � � � � � � � � �"PHM8Q}U5jԨp2zHm۶_e- Y2+ � � � � �O8W/٥U @d x_Q  � � � � � � � � � � � � � � � � �Y[orݻuf(A K},XEeivB�HHJ6Z@�@�@�@�@�H]o_OZBj0mX� @n @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�?Ouk׮]zg]iP =ڵZn~F vj)B � � � � �䙀=bYS3@<; @$N"a � � � � � � � � � � � � � � � � y{ׅjp ڽ{F){l�.oTz+~@�@�@�@�@�0>}$ﱣ @� jP @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ZM:pSFт8pxO 4:R)?t5B�@�@�@�@�@�@[/țsT@�R Ry@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ]tѿo-X@:uQ"O?gM}"�XVR` � � � � �D@FgHGei4 @ '*!� � � � � � � � � � � � � � � � @d njmذAڵӎ;"A>֮]Cj*W\XՍ @x !� � � � � }H&H'N9& �J � � � � � � � � � � � � � � � � kѢE:tڴiM6\ A;Tݺuu뭷�dJ@Lq1 � � � � �Q!лͥ �a.@V � � � � � � � � � � � � � � � � �+PfM-\PJҹ瞫.rCB`ҤI5l0ƆED﨣GȨ/D�@�@�@�@�@�[WjP?>wQ@�HO@tX� � � � � � � � � � � � � � � � �dS\r;wիvi,ݣU`޽;ԯ_?i&Zh7dQ !;z  � � � � � @2޽Ǔ-f@�\ P+9  � � � � � � � � � � � � � � � �D)3fCԩ>h#!뮻C4@�h P+8E�@�@�@�@�@ x ڽ[3'}@� P+'T)@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H!PP!?^SϞ=5r[0@F_]JJ{C �iilb@�@�@�@�@�Zڵfͤq㢖#�@\ԃj � � � � � � � � � � � � � � � � �^ &&FÇWrt7jzC;vhƌOT_WO6MwyF;]6lЫtQ;t蠮] $$$[n5\K/4 H!}L0"� � � �{'Of=+BwtJB�4޽g^]*X0jO}@�@L~i@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�"E z衇t})?,Y:ܷo_n޼Y[nM6nܨW^yEVҩO?]o[VD U\Ywas XKG/@�fy> GS��@�IDAT@�@�@�@�B ߻w~'|�;:%!�D@^RB4sf՜"�'ڂ� � � � � � � � � � � � � � � � �Dw:z.a7o%K7̐⮻R=Tz 78t;<͞=_gyF;vP߾}U^=f͚ڽ{w6Ț~{O}ʔ)B ,PzPp � � � �dW/X@O=8 vm?~|v YyJP  @cV}I]FL( @>g9 � � � � � � � � � � � � � � � � @GӧOפIԽ{wYXU(se&LVH|VkU*U2܎ زe :bސ5 @Ćl� � � � ֭[շo_?~<q"­@ wG#=.GC�@_0E�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�};jҥ."Ut*2ydM0A U,tSN';gu R۶m?h̘14׿~Ӵi\/FYfrz԰aC]|'ڂڵk:Z;aÆiɒ%.0Lm?WرcCjժ^ȶ�Z&�@�@�@�=zhw}޽{oܸQvڥS֭ޚL>Ӹq/kѵ^lgΝ;մiS=^z쾰o륗^ҫUV's='_`A 4Hׂ \Eeo6w+cNvضmz--[L%JP5'qzSN_Bx� W[1CmG�`;UG�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@-ubiAWgF_|B,jʔ)ZvV^nuM 겐+;رcիW/=ںuB,XB:tu)..N'NT֭yTOk޽{ռys}z'\^zZhQZ0/:]-R& @6! � � � @ >\ڵg킭ʗ/>}| 9]wu^za{VYM[X݋ٳ ʲgr^z.lr/Ϝ9d{ngY^~sY9e_xws�ꫯVLLwM7iȑ UV 1{cu96L@�@Ŋ'K*@� P+5D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(+ :~cקux:|'uȑ .u3ϸN0m}jȐ!ɶղeK_wmΟ?_7p<xvNeԪU;A]ԿTJ1QhΜ9zg5tP>u�4rD@aP@�@�@�GǏotaX\s]F w_*2a *aÆէvڷo s?Own٨Qr k׮-3f m-kӦMZ|u&¼j(P@w{ma.Xb>غu+#..ҩS'nݕimrk >h6@�{KӧKJ @�O@;'@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�TZj#KB4%,_U&M4m4ߞle˖UV=z$[g3 >iYݲƍ';ʴ>ǫRJ^znwfa[ ~']uU]2�d]@۱' � � �EԾ}ua_f'Ot J_bb0zh?~ݯo֬lڵkkݼʕ+i]9WdIwxZ`jq:v 0`[nI[[k.}n]SLѤI\طzyK, �V{T}H3f&0@�0 P+OUC�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�([fϞMל9sREݻ-[[n=:l+V~ȑ#-L5\ AjpZ~ǡqqqjѢ]n'`Sv ; �!") @�@�@�7ǎQ kOmڴqS.P@67]v /k֬ц 4p@X7?eÛoC QVw^}GnlԨ,4+l *V7xCuq~{}7~H"ir@�|&PԶ4qb>kA�"4QI@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�&ŋ?V׮]u%xSٱc\ҸqTJ}+1߅r?^Ju2O8: vҥK: 駟udY}mPB>sw~Д)STDh buB)@�@�@�W}…Z=+VLyrؼysE'7mTs{f` >I&`.$kCN/8~ZlN}u5gW?l'hΝ'-g @ itСFZ� jyV � � � � � � � � � � � � � � � � 1c4`�[oF2o];vpVXƍkڻwov;v*V_K\suw%,lˆ@ PBN`ŗ_~E&O2JgF?L|.Kݥt&A@"cA DEb KФi4Q:,IoK3.m3s]gϙSsfx~[>իW/*mNXje'0F�@�@�@�(PChժiǻau|>| :4], Һ㏫RJ޽M悺tu,GUllVUvmEGGk̘1Zl:ڲe+ �y_WsaZ_~J@�BK@z@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� ؠ?5b <ٳgoeʔQ˖-u饗TRڷo~!'1of-_Ö⛂ 9i$رc=zׯm?N8M;w ܥ_~Yև_ i;f 6LKNr|~}` 4HO<4:o^ *Y2{@�@�@�@�(믿^7n]:uʕ+{m\[/^j[nuۼضm-)&&FƍSǎ[o߮W^yw^6,HSF z&~DDҡ}gi׮]o-[nB 顇}жm[݄۴i5k+p@ T(ߟ-K@�Hi-A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�O>ִ`-211TիW/teXoLϝ9aPllV/mP͑#GGuM8QCMm׶. *\f͚$`W]uN>}8pdӮyfw#<#_Ç+0֣Gu N-;de(( � � � @ Xhw!y[9stҮ{ 4Pƍd|*[o{9͞=[Æ s,xjvܴid\ӧOw|[*UR߾}5sLw΀{ŊS5dEFF]]w.$yۑ�ժU+ 4ѾGӧ}a>v옞z)TÆ O@�_bI'O~[@�(Q� �m!={v? � � � � � � � � � � � � � �dرc 5j(hǎ*Tʕ+% ڵ ܹSǏWɒ% ιzj9r 2Zx\.Ϝ{ؗnӺukEDDhܹy)xHBn @�@�@RTZCt>}Fjاpn�_~E+VPUf󺐐8ըQx; 64? VZnrѢE߷o߾t}O`>s挬n}vwQ'= 6vԮGU4nԣG>8]E�@`^)6V5Kj6 ..Q0"� � � � � � � � � � � � � � � � �a-лwo)S7XYr-Ʃr'@̊)22R 6̊Kk؀ mPօ 2 iyt8t\|L � � � �([oGzt\hթS'==Dm/Wyۂmv*TJ jҤIK @  T$n-CV>ztur�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ }{uLÇ77aò4iݺu1G@כsGuEŋ)yx@s՜9sTZ<':�+pk9tM@�@�@�@�C *UJ:t �yW[$ӊ λg �#@V< Z� � � � � � � � � � � � � � � � �*P|y;vL>=þz΅:t腞6nܘ#]jT6/wռylG�#G)Ż@�@�@�HY 1|Oƍ||@@�'pKӦI7ݔO@�r^ "o@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�.TҥKu嗫hѢRUUV)111S88q"SKO{j֬yayG}$ +{饗Խ{F�/)&&N@�@�@�@�h/{zj| aZ9N @ T,j%zmE �yS@\ � � � � � � � � � � � � � � � �auj4ho߮ǏuZpaz]T)E89_|7z4x;y�dUD6ބK#� � � � � @i$)>>OvN!��Z!@h � � � � � � � � � � � � � � � � ( >} *'N]v6mZzN;wn4w]ws;cC$wG�@�@�@�@�@ 7,9"}U @�2*@VF8@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�!-եK? {>ݺuSN4j(@@�@%r@�@�@�@�@�@ժUWIc@� P+ D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�R(WL*P맧z*؛#?n5mT|"##s P+Pu@�@�@�@�@�Ȩ@ҤI=@�Ș�Zh@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ d|APF^zl[C6oެ뮻NUVĉUpm�!(p I � � � � � ={JJ3gEsi$ @ #� � � � � � � � � � � � � � � � �6l( rk5ayJHHH~Y`˖-)SF_}/Ȇ$l& ѣj.@�@�@�@�@�HCࢋM:ٍ� @&$ #� � � � � � � � � � � � � � � � �&PH͘1CƎ[oUN fl۶ͅi(QBӧOWҥl_#RttxV"� � � � � @h )M(%&fh @ P+o<Gz� � � � � � � � � � � � � � � � �'0p@M6M_:w#”;vpaZEuaZe˖qq@ =?&&=Gr  � � � � � \v, �d�ZY5@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�k4{lZ=ݻ7D[=kUTTf̘ˇ G N � � � @TTJ+&%" � :u Dw @ f!� � � � � � � � � � � � � � � � �Y%pei޼y@ꫯ͛ϻtBB} mۦ'O刋EDD0ؠDZ #Gܸ3D�@�@�@�BOqcJVx__'C@�Ջ@ @~ P+?<e� � � � � � � � � � � � � � � � �^VZ.TXbjݺVX{ァgy&v^*p}o߾i.LlgϞ+fu Ԋf�@�@�@�@ d[J9 K7ݔ1E�@ )m S~9E�)rJ � � � � � � � � � � � � � � � � �,PB͚5KuuPw-_QF#Gj͹л̙35eM8Q>+Wte} �"p(Z,h � � �@߾)`ACK � Z*U&Lȏ �9!@VN(s@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ DJ,S믿^>~i%&&(P@ÇֆF34h EFF:W_}U?dmV_|OҥKFi L)::F^"� � � �XWUF)9#qGك� @~}=ʯϟ~#�9!@VN(s@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ )qkȑ#oO>D˗/O=?=zVZgB.rP  jůP{*@�@�@�r[஻D c؊� @~SiӦ.A@�C@P � � � � � � � � � � � � � � � � @ ̘1CӦM H 2$ѣ:tt^:uJÇWѢE JxZLh  � � �mIV;I>EEIϖL � p@vRR҄ c  � P+� � � � � � � � � � � � � � � � �EtM7)!!!hϜ9Zf ??m|t]PnݺiÆ A_.C5@�@�@�*UVd>-:% �N&%P+ A�@^ @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�k֬Qt)Y TJSddy䑔v[nw={6hmctk߾}Aa# GkALLn#� � � �'пmڴ9;[@�@W=={~ �Y!@VV(r @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ LVXe*!!A Ll27.c{93g(..N]vՉ'R;} @+@�@�@�Dwo@_%YV_� � 7H K'z[X"� 5je#WA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Bot 6hԩj߾oPBL2d,4*M>Tndfԭ[717`o8&@ =נkA�@�@�@�B@LcG)2\cN @�B\X1B&L<@� P+ F�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�2'`!Z7F7PP]8Tyf>( J>EoTՊ+nݪI&SN%? @n9rѹqw� � � �wJrj֔5 6B@�BAgOoÇC5@ W$@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�.@vzWk.6yaR>|?~WSjѢE:s挿aAd;vɓ}v=䓪\V@�PbbBu @�@�@�}n :׎@�E[s_|.- � P0I@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�W ::Z>M>݅lM:ՅH۷O oӧuIO:Hu͂9!!n7`sDD r-moӨ(uu"ETpaiM֟?0|eVZZ`? RG:Gc@�@�@�@� Xث-[٫-[9֜gқ^=ږ6%ݼy ͟_MeLոq\ڎ U՜9Vc'kkڶ3!� .KKI&H}Ki' @ PB@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@/IСC:x[>|XGqmvܱctq<q6l;vh>|, ҲHm- +ŋ[nڴVzuiF-ZPɒ%tR_ޭRJu U e&2!� � � �) X�ՆV7ՌS[ھ$c[rw=Pm^-׭]p5EzxmjV΄� @zz ޳8@�Jن= � � � � � � � � � � � � � � � � @X޽{ݼo>®eY) BjeBVmL˔)jժ,XVX!;KHew ޠTDDm[J (º,nKoN3g\ؗ 6@f�60D7lؠ5j,;wƌ8q Kµl6sٲeU\9/_Ͷn̕ nߘ׾}� � � �9)`WVȑ#6V ֽmjiMVdKv [͸t)>yd[nS{՞m[|}L}t] DymֽezVSڵ́^3RZONfXo=K[O+d^}| %Jpsufώ @ o !=4})@�Ȥ�z$ #� � � � � � � � � � � � � � � � �*`cڵK۷o׎;lwu3pAD-f/J*jԨ,%Kg ^idmS-=Aj-8p=ӟ~ɅY� P8@v+B WTI+Wv=S{nL Q%^ٜ� � � �!`^#luk^ ҫMZ S`#[:r}uaH^pRm, Y˓zkV^e5o eyk^u֭}^RX(}ޣV7޺L 5բ4aZi; JjӠ- � � � � � � � � � � � � � � � � gsNm޼ ,e˖$K Ѳ�%-”,T-[cccU\9/_-m Iڷ٦6yZVF'Oʂ{K/8[]goaZVժUUZ57-mQ."7V@��0XE�@�@�@ ,~{~W \zeEɧ… ! Wk'[Аu bB -{lﳬ :|-[9y(guqz&־Hֲef$pv.fߡdZ @zI/(w{;cً� @Zj%~@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ c 67j/@kӦMөSܙ6hdY�"iƭW\Ysttt wbs )R={{iMeر?[�֭[ݼpBm۶-ɠfZ5ktsڵUNխ[ׅq1phZG w-=C�@�@�>ڵ+gyZ8EEEc-Z 2eʨt,uѢE/:a'`uh xBYؖlYe^(-wޭ+W%,XPV7liTXEDD\h9@'г4tRv � 92 � � � � � � � � � � � � � � � � lF Zf׮]ׯΝ;AmPT 4Q-ț-HPBcYA 5HUT͛7OP4ޛI&P'Os-ޛSK[/QDg s � � �Y#/ 0{on,HѣZHPٲe!<Ӳe$A=^`-XA le!s6[];ӧo>yAw ,ys-TrnRy붭\rm!�Nn]K w#� @V6rI@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�O8uZb^zN8:d*Z(]vU:u܀6cóӴ:ll_n%&&7lؠY֭?޽Em -5j ..4 ԃW � � �y[`.>..N[l֭[c3,DB � C.޶WXͶ^ yw w(٭TRr!llYf#GWhQWSz\zu]tEQ)?@ )}k@ xVr=@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� 7jѢEZt~-[L{umR j۶>^~}.]:,F#(PVv%9{j*7\RӧOo'Om&MiӦ.Yf%Q#`Z=&@�@�@�]mBƵyfl!Z'Np, Bok7fV,; @ɒ%eszRjYֶmےYXy[V+5kTڵUV-;9r\Gg]ü34@ WU~n� � � � � � � � � � � � � � � � �9!p!}w?p_ .].SƍULh@ Wlκu뺹{6Xֺu|rkn`a ٺ+tWUV6@(j gB�@�@�@ l,T޼~zmذAܿGDD Ʋ iٲ[ںU CpC@LL J-x˂/y[~S/by5&@ 5/T<@p~)B@�@�*0rSҞ=y @�@�@�@�@�@�@�@�@�@�@�@�@�@��Yfy޼yZrlK.ąY(P]xV…Cؾ},nɒ%Zp BK.Jmڴu]>Sń�%ТԶ⋡.Z� � @~(UUk~z#?v>#p޽{]vժUy͚5ZzvᎵZX@SvmlAZv#eߠ ?m^vnSѢE4hK/Tu֕q1!�"pҲe}.- @ ɫXҹkNycgJ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�wǏ̙35m4}7nU|~nfP˖-Ud|gCȬ@*Udsݥ,6^`ΝwyGÆ S%\VԹsg7gf ycǤ3� � � :ul/_.GXBwvv2s׫^znB ]m9 X_ͭZ:={ЂقG8Y-~FqƺԤIUXknPڵKU"ڀ� jS � � � � � � � � � � � � � � � � [?ɓ5g7hOڵW\(@  ( {qW߾}fϞ^z% <X5kT.]ԣG,X!Qp9%@V8@�@�@ N>~I-rҥKrJYk/ӱcGY5jԐ՜@�&PB|5$ѣG]ق7R��@�IDAT_yaJԴiS]~nJB %"E)Ss@  eþt�@�a# F4@�@�@�@�@�@�@�@�@�@�@�@�@�@�D`˖-O4vX-^XիWW׮]u7m۶*^xf"֬YiӦgn LV~.ʗ?7Vh  � �QTvV/l}GݫyiܹZ`,Y'OhѢjҤ z-<B@�.L`Zl}W.fW^yZjڅFFF^؍8 Ȅ@nRD4qb&.© @sYҬY<СBB�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�2,p1}ߪ^zӧ}]7`/  ח?>/RcƌQ޽eZz.WLp,p|Y#� � �d/3fyZz (ҿlR 6A.Y)ϵ@�B ԩ=}i…w'Б#Gサڵkۻ`KaB�YBV"Ef\@ O HMygt @�#  @�@�@�@�@�@�@�@�@�@�@�@�@�@�D`ڵzXbn ;C5 LH.pQM4IG d{-[VʕSllm`Њ+J*I &,@ eR8 � � cJSj Oo=͢E4eM:U/vZM6\s5.Bә@�r_ !!A?[YYdaVرtf~oU;Uɓo̫_ @{Զmsį_-XC�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Y{9M8Q۷G}Ν;x84L DGGowիH]z饪S߯;w~߈{{}Ly[v\U|]tj׮/Xssݺu=yOs}*^<!� � �d̙3<F&Lpի:?뮻NJʾpe@� P&M<h W__|kx=~ϷiF{- z%=0!�Y$PԬ|je)A�@Iw � @ )=gOޔ[!� � � � � � � � � � � � � � 6lаa矫_~zԠA0 MF�ǻ༿o:yF!³l:}y֭ڼyi&_^֭s… ]vZh-[qƄlS.*Tfϖ&2q@�@�BFTvV~鍐i A Pj>Cm۶L={TըQCYG�S#Ghڴiɓ'رcСCQQQa3�$`crz ȷ{\*͚%mo.t'!� � � � � � � � � � � � � � � � �Y$`a9_հaCwUViѹ7ͨQԵkWȢ26@[osϥ8ѣn[oUK rҤI袋W_D;F$&&6=裪Su~,kZvOꪫ .c;W֭[?Ozw|NҎ;d.\P#G]#yȐ!j޼{Ov}׬Y&믿>}?48ZwG*^K~'?dT7� � � Y /_uaK,O<aZYZl_adAvַβe\iӦzݽmZwҥKիW/ժU Geߦܴi}PN#Vg111ݻmucǪد_?W-ڛr5wݺw.L �dX@ q � � � � � � � � � � � � � � � �d]ͻᆱɓ'k̘1[nV]>ױgΜ/BǼ _NA ͛} H.ua/s2%M6)..N )!!A[lqAr7oVBy9֖ j.X/ofV-\(׫oV\|y(QBRw%^zna{,XNzW۷}vW^9sFǏ&ߗiO~<ȨGc„� � � yVGiժ:v( =  ~?ݐuSNw gݵ] :? Fl[Fk޵qmCaju7ʕ+5j(״jF-ZxV#]+i*w=4n8_6=CzUF g_@� ere9 �]@ � � � � � � � � � � � � � � � �UԼysUTI˖-Sr%v_7ZfԿwsnU7 կ_?s³S|]ֽޛwy{3W(Y>?.{n"""Ըqc=:7x VZӧ8UT WYݠ . -�}Sjش'Ȩ/MŊeLG�@�@�Нwީmۺ !]#sga4 P6mr-c{+ضԺ1"5 })qqqk}^fF`}ʮfg:ېR-<4sq+66VÆ ƍ/ϒsƄ�dT@[72 �❀� � � � � � � � � � � � � � � � �9.uV7e.]4~x*U*ې s3Bl)1,X0zKqիWVCnimMސkd6Gn?PO<DlVZA@mqigxw5kZj{WPAF:ӟ4sL%&&}|IE6Ш|Jm58qEfLG�@�@�ȫe5%Kh޼yOT~nnr>^mo\zk K_);۞캿WSuv]=~"#} vlBVk׮wܡ={jСxs؆�UsJ;w6@�Rr;ك� � � � � � � � � � � � � � � � �yH7֭wy'NO?7N7hwޙ)|yn{L%Kt8p@cƌٳn:hB/8K:yQQQQW@1}Μ9#k{ァW_}UVXw}WUVMr/6n@kn6Gk֬ш#\нޫN:)=} 5rH7-ܢo~p=C.;'yӳL? kAdn߻gc۹ 6T^t[_'L?u|f͚宽i&5mTs4VlGyD ?osqg%<3]~>a4nc/rnP6m2}ol`O-_- Բώys=z\gئc׿ 8ٶtH"P+=Z� � �}Yڵs5>ȅ}^'<xPSL]}ꏓ'OvoX2R=yx -X@Vlܸ $ o 6Y]'æ%JkJ{umZiLL.W vmkV{q5;vZ;,LgҤI/?t43IVOե7oެ~Z^-jEqW\ӪfoOZk~}MLLL^!eZuu, VV=[of̣;־۷?… պukW9>ijn)Նѩ=SpXbwA<Ov0 MF�\,n6m@�R ",[M@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ l;}7n�R B,m`S[z j!VdQ/ZlTclPG f=znpH 5#Gk.]cW^q@cm!т:ӦMs@}RZ֪U DiZl Jׯ0-;(GVdAH} ]6અ6қRwLZXg}VDMsn_~垛=[󫯾իաCf͛7=C ˜zlj馛\]#¿lP{լY3 <Xr۬e¿,Dʦ;wvs{vY= j t^z.N6X=+o޽;^[0=Cv*/tmھ \oo7uA|� � �9 K7τi_Cuх;vL]=lzӢE Y/,Ty饗( tfR޽]i&]uU.@Ȯk.Y+&ZY:Zwtts{XAW`50Z-BFn:Y?&m`[VOե˕+'_tEv}ݧFSZr3үkUOv3׬!|MmV͛7yYmnGa<FjxuVy}j5m۶;,5m4-` }W?1cwb3g |In 6ɻr/@� @V^x@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�0Gmƍtm@+V護s=D�?fA;hdAL]w֮]wNLlT|4**J 4_, Zd^z%cAV veZv qFe;gA)۷o„f̘K{Y' jҤI&տ$"=~^x$Wo j;n7o߾]>l᫯t[˗/C\xYBBPBn۳gRz>vAoхa 2D%Jp{GugvKa!v6mbNBlT>>}:[VfMy^˖-+{d{m& ͋qڵs!z'9oھ=bl@ cH!_q8 � � X�Ҝ9s\Ăg;^?B͛{S:t[5Y=x:x \?uw9:c7Zj6YjJ{CZ٦GLH]Bjd6k+tYVSӪK[M/W2en`=)-j魵{MUOv/Vl8?GyDwqԨQýwd-dԩ]W/>Ƕm…?.^6[f}[EZ5.ԩw#= S}I'O @^;U4 � � � � � � � � � � � � � � � �@`߾}nPjÆ ]xmڶm[~Gञ={ ]:V\ŋ.dk~)7T*U\Жw-ZU E)1+W 6"" "6Fـd_t,$hѢJ/ydCz,… '9lPUv֭z'cl@أG+$ kdtMj֬ɮMosz kpfd}wq"}}A:n_4ئ{䱱3gʕ[WVMgΜqAsΝռg{P@-߯q&@�@�@�sN`5̼6%YixS 4k,kG->SJ\MͻN6m\j+VpAo_e![3g\R79rD&LPR5@1󰺮)jލջozMMV#}}gvuiVh?RN>U L_R<i_z%^kaMv7~x}݊=? MϊZ-tԋ.}nKϦ4nv]}ei=S;&/M  ] = @�t D(B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�HN:Zf ɢKfelFl@I֮]+ 2Zx^z6lؠ!Cc,�Œ,nݳg~78;?ezcdI2u @駟' fF5 RKa^MOҺhz-]ǜm׊+@ujĉP ӽ´uBtA]qzwչsg02Yj_V-qb}i' /Bc}owaϣdɒeNVjU~!)|)rJ � � �/`A?W_~cjGhA;^kՋ[l^[d;'ה-[jʶ/´`k``ۼe5Izl]kz}r!}Knzxj}NO-<3}5Zuu&ڻW_V{ۓ/ӧuZS|z+Azi �1cF�0MG�咪ysi)B�{@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�K[ouaRcƌ Xb:|,1`[ݴi ӧN뮻\wSܪ m>o};6tqۚ4i習 Z_^JV/g}+|r~ڳA!`?S:䶍;V:u]U`hy'l<o޼ڬY3eɓ7n @}73ZcBiyׇeVshvMT:pχ=_s2o 4P@-YL � � �lٲz4dmܸ V-] ڶm⒘URŽPBGz)ڴhѢ$ ޽9!X+ضm խ[7LΊPOVrj+dYQ7N^|y;wnGJ$eEZӌy+kNZ4MS{1YCm4B_[7iʔo'-D�BY@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� kРAHqjҤkÕ5tP?ޅiuAeʔq;?jժn _Id @jSZqe .m@Ν;DV ,xS";^ds/-GUll>cY[VF1|=?}z'^xYHMm |O ~4nm믓1'ّfAZv|UTIݻw״i\[.]WIBhżmN{5J+VȒ6o[7tJӧe!dm!*`ZEhh � � @ X=.S6mdLs)Gfh̙kžsv^BHvڊ֘1cl2pW߿lߖ+^8P|||ۦ6sLwލ7ޘ̾Ho]ګzKo>^2׬UWoٲ{k<َVZ)|)l{Z%\L%ܶȑ#gɾaB�2*`Z۷KKfLG�ȯj'O@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�EPNksmДuV[ /[wSLLƍ;ꭷ߯o]?O?դI?7@R:uJ&LO? ЬYܶg}6@ӧ+ر{խ\ [ܙ{o+xZNرc;kUW],כogy3eť4~XВMYÇ"{ܵk ںuks=V{.^}'7[~SO0 |;v &N<,ɛ~߸/ SoذAܵ`?~\/vi,YR5jԐe\d t,_W_}U]vu[֬Ys-Wf׫WυsYك>5-Оo펩\ M�6{oZ*sف@n O#� � �%`Q'O_s5.lСC hMW $m_%/^uho'uF5l0.]]k߾}niZb4uTD 衇\V۶m5bٵ-ܬf͚+b-ޛmjҎjj]6,$dSj50yt1B_~}WuGz֭sw &o.`v3vg-Ӫi-*=ﳔٺqZuu[=/ M&+Wǭ=+tY<ރޥ˴ާg,Lrj+|6mܰN:iOh6䶀W|_~vK? @D<"\K;@�@�pXH=[2$[O@�@�@�@�@�@�@�@�@�@�@�@�@�@�HKs6nXuɞe~knTvlT]vn/|r}g>ࣨCR7,(MPD.*X @PAOT9˝ET,HDT@,!g7nI$[^cnfg|9 ~'y[M8Qv-עE婧/裏/+<h-8By,]vymeH\E^:>Z8SRcS6Q]P01 6|YB͛;z֠AL,heAXVXm۔kʔ)^ N6lW@ u-YDv˔)YЖիgoExygš,D,Sxqy^gѢEUNn+[DxZ?믿ѣG{[` tk.GZeS.]K3yPv۾}4k,3 f#x>vu]jժ;tbbhkժϽk!kngy9; +'om]F @�@�"@G_rUXY6bcmڴSO=#FСCޘ^Nƣ"oܸqkoծjl=-Xŋq@O[f6i+X8{^h8k 9|JըQ#ܹssf_6gc]wzǼ=/Ym,ѮBVZ;wjʕY@Pvƺ6Fic3f?YWk_z%o|Bl 4`Gq:1}?{~Ax≪Xbk袋2vo2^EsZ1nl}l|>6m?mݕW^nYP8_i3{?lx,?ׯ}ѷoLlZڟ gn2|gg)R柺B�gT;<jܸqt~ @ X~  @.\FwTn.ǻ$K@�@�<pV�j � � � � � � � � � � � � � � uVĊ8pW@RJQsիW{a:V38T.ŠMڶ~Uӱcrmv&͊SZԌZھ}> Z *xsO/;9mn/oV֊h=,TP&ƍm3 Z"6̎gK,8bKvŴ{E?Xmn;ooF4ם~~O<W~ qz衇Uhgm4gYf^ǵ@f-вS\byiDUW( ^7@�@�G 1 i~Es-`A ?U% Ǥch,w1#m- e0a -ÂGӎs9^.1ͼO;uf]S$m<<5}mל^kǍWkؼy/_:uxGl]8ڱ~N|{cسSz,`sZnק '/"\\:8h.^ , v9 P+G\l� �\@ � � � � � � � � � � � � � @ XD+j6s7SA b zCWyeA_fJ6r^nذA{>jn6EpsbnGz)/(k۶m^^+Y_+j*X+fl2-] G, SOUΝգG psHpu]ow"@�@� P+>s4^O2Ecǎŋ0r %ӧm}@?ZU4-;װe˖GuQHoG_W/w3 w�Y!CԼyx@ .qJF]@@� P+7HweO@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ <-ZмyoO<j]{ Yc(g}6m,Y2 ;<j7ڷomqXq3siϞ=JHHv(L8t>S%&&j޶%JPƍBVM6E%GC ">� � �D@5h o/k޸MVtyƫ:tDFc0yf}glߚ5kfy"e:ǨoRvmܷ}N+7mڤ?POݻwk׮^_2e# ׌� Gi4S �Q/Z_� �DqH6Dp' � � � � � � � � � � � � � �$paz1ZrN?o޽sJNu @.V^o+i?9i߮ QFS1rԤIt#ZYf0:KVM81z@�@�"E 1jneFJ ؘz ^Yf*WkOWϞ=խ[78 -pWj^}vtM7. FiƷj޽7ofΜ>H/V"E?_\pWάE�,sr$,V,p @ l(F,͞-u.7!� @l@�@�@�@�@�@�@�@�@�@�@�@�@�@�8vm$+vڴ):KiE6rņK.Q>}ԢEX@�ؽ{W|^ӴiTxq8p@V贘giU]ũ?3;f{]vi>/6Bcj\4@�@�(x Ѓ ,[ G1c̙}yA秝vlԩo|g^ lVD DC J[n՗_~/ Eꫯ~/�Gիl^lHuD峪n]OBZ䢹Lkr~WD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�x8rDڲ% YB ղZ}UN5jHZ~dyz㍩<yz!5kL^x=\uQ D&wVd/֬YԹsg={>cYqσˢhѢ<b_>aneʔr8 \)K,n@�@�@�hٲl۽0sO?g}Cj˫C:yUfz.!11"^ >tR-\P+W*99 вAk׮W^?:�/pr Ԋ"�&Q|l`o@�@�ƍx@ڰ!x@�@�@�@�@�@�@�@�@�@�@�@�@�@�+ ( +ugcZ~< ҇aU~Uw?|MVZU{VϞ=գGkÇ`/kƌ7o*VYgbŊe9+�- ժ`_:4Ruk/ r3D�@�@�|HLڵ[hٲtFN@X@_؎8իm۶ԦMvڰaC*T(:Y@�ؾ}dٴxb}ҥK]v^I'SN9E5jԈ@ nUr|y,^ׄ� [ٟ0͞-u P+kE�@�Y@c&� � � � � � � � � � � � � � �ػ7pBm =IRJaXܶ-R$￯ӧO>Ν;ժU+uM;wiʖEC�<8xg}O?m ~-ΦSO=UK%-^M6hH4Hn@�@�H P+R ͛7kѢEda[6^Z*U7oN8!dS; ݻwƿ-,kKMk׮_\9olJJJRfr=(tbJ㏥3ΐ֬?h @L KV@�Ȗ�Zbb#@�@�@�@�@�@�@�@�@�@�@�@�@�@�(YN^H+V,{X=UT\ҐCDCi޼y9sf͚/R r):uI'y)F5|g~Yc gϞ: - ӪVZ"KkKCJÆUq- � �D�Z{yxvڥe˖iҥ^P-wn ~VL5nXM4 l]ҥ � ZrVXm٦uyEUFԢE ojٲZnu<X# /U$=tv,F�"]@!roǞ � @!� � � � � � � � � � � � � �q%icm K7ZJdaXi˕ ;>̙3G6Yώ;T|ykN۷WRR7_>cU@`K[d.\Ey~;BfԩS'o:d?C4<wH_y}G � �ģ�Zx׹XkY?Y̚5ktիWW ԰aÐTZ5;a@ {O?iS?{gM6Ml´,T�ĢJEHo,^ׄ� j%k� � � � � � � � � � � � � � � � �"p_s+d>e<aթ#Dzyɒ{@IԽ{wo~J ,̙35j(<xPe˖UVԺukojٲ7ooetl!KaE=oIl]K�V:vK.D:t+VK\ 1+`%Jqa � � �1"P zwś/i,fժU^kڵ:t萷yRdZ:nvڪQ *|h@�cعs֭[M}/Lxv *~^\Z`M6NC�Mwo;˅s �Hp @�@ wI< mؐ @�@�@�@�@�@�@�@�@�@�@�@�@�@ ,|";X~`֭rERiu9-k&8�+ʕSPT_~.۷O˗/ג%K믿ֲedլYS'p75mTM4իg79aV|xʕwɇBy��@�IDAT+Vh޽JHHPzԦMm6en?4NbŤ^k@�@�bM 1 iƟڥq=什i Y~,HZ"EtqyZey:n?i 7ooM]b˿kHSʖ-gcEC�Hp.hPnR׳�Ě]Yժrұvuy{=E@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ؽ[ï2hg ï˛40R%Bh/PD oޛ&t5kxA[~7Ok׮]fʕSƍըQ#5h ejذ,l˂hcOZz~Gon?"S,$R7dhB͛7Wҥ ۜ@j<(_u4@�@�@�bNB$2je!8֭lO3g۰aCJ{�`Z6UV޴SbbbFdDd?G+1sNU׶mېp> ;!@ [.k=k>@l jM@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�hض-YPw2!͂%T \.Ru6 6Tn]o:sB_Պ+iժU^`믿م,O9^[QEbQKi! []v/ȟϔZ` yOV&M- +UTv, @l c*@�@�@�- SNnj[c!:ׯO;K.޷ÇwUV&ٟ۸\J.WXQ Nٟ8vݻwk{Pyfof4fZٲeCڵk'{&լY[._|^,"�KwoituD� KjZ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(8rDڲ%U(h_nQպw!aX5jHZs+C/S&eWȑ@ZdS=Bbk֬O?YYw}Wrt>*THժUK 3l[UۖV g ,&oK [h[RR."/ȭ^z^>})ħeA4@�@�@�H/`[owSخwO~pիS|vܙ[JHHPbbʗo;XB/hB B6g XP۷{֭[e0e Cb?`tg~Нg/6U^]J ٟ �+`ZG˅J.Ð� @�Z!@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�8V +?�+<{ J=+D`կ/xb:5Ux,!P V}A)v`XҺuiڵ8z/4iѢE^c~0. ;ZG+hm DZU<99+�j?mVX7³)8(:oskqf;z}ԩㅱծ]ۻz"Z@=t@�@�@ lN8+/id-[V\V/X8V Yu5kքc>$dc~?/Wlٲ޲?OULu}Vw%׶�9vM-[pֶmۼsv\fSr&M,{&bGllXx @ :tJO>K@� P+9 � � � � � � � � � � � � � � � {f60 i.gK N}eۺ4bJhѢW7evaG\.Ykm˜VX̴gϞt*UTHDNgE$R"ͭ Y.e ߿+j@Bs+ j?~ܬn K4?8͖kԨ݇YF�r*μVDNd{@�@�@�ȉ-rYS1[W;VII n{tQcܺuk>m<ƒW^.¼2k%]j lٲ O8q:۷d8ڼxy2y>99Y6m^p>OY={On/s[gc~x| /~fce+ge#-C^V"�1%`.u#P+n*�Q #&B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�A`NBٟ\VX0u*WNˏGC�XH+(iSV–_}ƌiӦyLCyW6lЪU俶@(+i53kV/jERp?ٶܟN' m]=s@* Ɋs˙>xl俶¡i'_$ԟ3kvM<6°6mЬS%hi @~ >_@�@�@ m/ϒ~9puHIIҵ³,H˞d٘qM'vdc; �$$x /?HɟzK)~8qF?C+э?'xzddc̓_ciǛӾ'k6^ع?~/gj޳1{nu6mcYۍϯpۥy~`m׶Mvٲqo[C/s?<}@�Wwo{~_@ �қ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�q dmڔ~j4W OUN͚~\y� _jĈzwT~}/T/B+iP~aU[O ST-[R«҆XY ~P\ԖO~Q)S4 KmUVp Wp/+jYQϪU:8_0/ dǡ!�"hc@�@�@ \UJx֢Eǔ f eR fl ƈs{/8)x94?M Tӽ )Ɲ(ʙQ63 ǟqiqinRKw�Kᔰ(?+x6^fn?DLٳwo:w~A *ƽBl9MC�@z ΕWн �$@V$ � � � � � � � � � � � � � � � �q/iðP,n:V|hVRv\-=D6m_cǎzuxAS9+Dd¹, \R5mۦ:ulF @<wkD�@�@�q_B. A.LIn2կ_jxV:sl*W\;Oe|~X~n|Fh[Ej-ګ֭ HԬY5qts^΂� @~ 4l(4}:Zm@�H P+C�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�8p X6I.OF.3'UոԩSESvgb@"yWkŊ:묳駟s1puox/)SjofnAO>n&$%0 -B�x\k � � � '}MhxKK*III҅gծ3xyi0~}BZmǦM%%KoZ:HK7(sܸ4bTx]6'B�@ zj=H!�D�ZQp" � � � � � � � � � � � � � � �DݡYqcӎ}w91\94 MXVBh ۷o5zh=QNp 11qD9rą &W^va :sz4dȐ@� Z[Ω#� � �ĒҥY~+:$%&³>[@Vݺtq-) ,}t҃J�nlH.,<˖^~Y:LO?^{Mj,@� ziߤˏ3r@�h P+}D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�<py5Yb ڻ7+%Jj0:?Dˊ3&$W @p( ӲvW[nQ͚575kh)?jٲejٲeʺVJ#G5\㊱jsC�B@\$ � � @d-_eZPԮԣt睁 xfė'omcR2PSO͓A۶ jI29xI'I6o^zꩀg&@�U1C4(O@�H@< � � � � � � � � � � � � � � � GH[= kӦm TR%u^].%u{l�i @8;/jʔ)Tn]{*_|8ǰk.RY[׊-Sf;PsW^m ks � � @ >,!U-Z$-XoTd!H&rK I³CstĉWHFB:W6[oh9?N_H']w] p r~,@�@ JtO'P+ A� R@ � � � � � � � � � � � � � � � ]W|0˛7K巄)114 ˊΝxb#�#giĈԴiS=0`+?LtUU0-A `ҤIzᇳݻZjiz4h .\8!  UP,^ׄ� � � OgJiiiBZ:t o/7*7>OBusH^*%tyտn֬?>{g{=Us � P{K/Y`*+;@�p DC�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�G`߾ð҆cmBes*U :ו+e+0GC�"M�$jAZשwyGs, 0WvժUxݺu@B le\տlf @l Xayo*@�@�@ L βŋL߹-[ʍJW\s"E'С@ƣJzITZdXzѪܸd!n[7o+l{#|a� u-Ҽyrͣ5 @xzr4@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�J`ά6m }׮PbW!XVJB+@ zd_~YO<V^/;wN>蹈0t*Z<rd[7uj5lP}#<~]8Y /@ Ԋ�� � � @TSjx֢EM۷ˍJ-ZB.DJJ,"O$O}'=tulY~@y(ۯR%g fΔL)]!GB�7ƍkO'P+=׋�d&@Vf2G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ [Xi6n _[VT Mӯʕ ޛe@ v/gyFcƌq`k6m[u8nG҆i4iF`m_sNr Hŋǻ׏� � � Ikצg-\ڲE*\Xj<׿[ߵt˄ С{xԤIV[G{tidB:w7~^Ə>@�+лdZ?=@ Ԋ˵!� � � � � � � � � � � � � � �ĵaXsСPCðjזڵK]Wr겅dY @ U`͚5zꩧ /hѢU馛Tzԍxih2i6lМ9stꩧfE-ZP^O5 GUX]0� � � QeZ6XP pCYmJ%KFTL66m{ONcnbZSD^O8AZ@@֌OKKG^_ �Y ǻz=VժYm{ � @V<e@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ & ~p�V ~m[Hɩn +T jX)tcdaYOc ȉ7|#GjԨzHW]uʔ)4v BȦN@-;mz駟E))))cubs} � � @g?FYwݕ0iܻ㏥. h͚%u#E~gTTdD iX3+̑^{Mj.Io@�JkWKO=@�x P+2׈� � � � � � � � � � � � � � � Vp-mVVw +$cW~�[}^ŊR¡ @xfΜ#F裏>R+Wa_T~\/J޷o^uee{ʟGvòK{j۶qo5 kD�@�@�[`& �_ ~@hְaeݗ+=|y)`SR>sIyy8j9"-_.u}JۋEZTR䓥SE !� zIvw!�y/_Y1g@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�swo(Lð4Hɲt@ 5 Po#Gj֭O^zDwӦMݻor<99Y[lѬYԣGϭު/\>?v @Xbbr@�@�@�ض-/ԩ#u ]}`nY*@'9e \)'Z%4p`OdlKVEj!w\ d;/,UVt�@� )Mp�@ Ԋ%"� � � � � � � � � � � � � � �\�ԀMR7nx)UԲe:?= @ z٣_|QO>֮]?~ڷo=Q=W^}UYhFR 0yW/W\{ڷo_u]=zwr|�v@�\@(t@�@�g;ŋZ W:Qܸܸ]`n˕+s9] tN חaN<!Aj"'  iu@k*ֻw �䳀jҊRӦ|rN� QjE3 � � � � � � � � � � � � � � �y%p萔P,?,kfpX0,CY0!�ĠFbر7n,TkРA[U~ڼ$z-6Q^"E覛n҃>O˗q Vo@�@�@ v E {zuq;i,[GOmۤ|s|o0-[0ղeȟs%K믗>[fǤb"@ >:t{+}1Z @�TR-XB�@�@�@�@�@�@�@�@�@�@�@�@�@�@�"}$?*uk.,Uռyk ' r4@�8Xz|IM8QJҍ7M-,G\eX]*>Cxqa:*A�C@O@�@�k{:I H6{ Ɇ6۷.80 ZG?Z͓lFh$-Z~l)V,[V4I:@ԩR&yzZ� @owj C @1r# @�@�@�@�@�@�@�@�@�@�@�@�@�@�@ v 2 ڵ+ ln�_/W *z ^!� … 5b?Q:u+ h{^ 999ZʕUW]1chذa.;;�&@V1� � �ҥLN:tHgcu#Ğ=t}g|N>?2eJ]lE iߥ5rcl:`=ڵF@�!yg߯<MK@ 8\* � � � � � � � � � � � � � � _. C۶de寷TaXM\9uقʗޛe@�]`9rf͚ LɓuEp~p@$C ѨQ@>}dx^V"�(@V,U @�@�H8xPZ<58B-l˙Bs, Y  dK.!rtOxf,PڷF_۾B>\飏 D{� @d)pҩFF @ @�@�@�@�@�@�@�@�@�@�@�@�@�@�:Ç͛ڴ)}[>t(2-*8V-mP, ' Ԣ!� ]٩SzAZ\3<S|N?J\ *kBsƎ+J@ ԊD@�@�@�س: ,ZTڿ_*S&̭K[YI 98"Pes$i{;qD5B k'{]j ȮG(ZTzQJZ&O&$:&F�bSz.!P+61W�dG@(  � � � � � � � � � � � � � � cVX}F+e3l\EJ Rïx49u~8i+;  �DΝ;kԨQշo_M4t$i&`Z yPotB{j2ܪU|N�ˈT΍� � � #G+R,@ki^dIM餓$7MBss&A `mG h⋥ r;VJW\8@Vc~7rUU^ipдh2�  p  � P+7j� � � � � � � � � � � � � � �D=aecGqs ln!߯TbZB�V?Ccƌѳ>Ci:tԩΫ@=zMe_'X5X Eqh.@�@�Zkժ𬯾zKrM7=+a>D->n\W_Ž.mܸqPwwE iظ~{rK3gJ'=*@�W^zIoC>j9 @nʍ � � � � � � � � � � � � � � �y,}{Y6[4 JL2 �-rJ=4i/nM_*TWwoG}#Fx<) pU1 � � �Q`ŋAo-[J ?´_W^).{GC >H0@XQ?? >׋/ݻwo ^'%]HɅI&}r- �&нt4kty{� ¡1@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�,\.nMqc5k~?sͅu@˔ êVMj"t]p@mOC�@�sȑ#;aÆ3f R6VINNγ@.Lw}&NCqF@ gpN� � �X&4<kѢ3"*tRR>yӦ\hU<y~z Fi,y^ ~ (}|mO/W{MΝڵR:b~ HÆRTT\#W� =+KmJLV5z�W@zr4@�@�@�@�@�@�@�@�@�@�@�@�@�@�CMRð2Z޲Ed~KHaXԚ5ϫbF[Ԥ(YhXs@�r.`!MF9s~z7uPB9? {䙀ݫ'e˖ե^gyFrKwF�r(`AEp'6G�@�@�ȕgYp…6جY 4$Mdlr:-]T<7YB 6HIsʍJ\ z-/.`%,RN8!|yljUҳ}݂ԩ�@�'=7Ni@�"N@%t@�@�@�@�@�@�@�@�@�@�@�@�@�@�[`߾@8dY1?+Ьm$  j<up@VҞ=;'T 4a³4h h � .IdҤIܕ+WW^*V /0, @Kͣv 7xZ~zGg @d<HVd z� � �&YeӟʍkI³'0oV*]:sN{{y橹=d!GԷTD P>#G .PÆ 3$.'&J5jH//u  xc7b*@�H@-nTv$>!��Zy˱@�@�@�@�@�@�@�@�@�@�@�@�@�@�@@vJ ñlBCB_vUP2_޿Ǝ}V?9r U*aUh � ۷ѣyf]r%z뭷믿jiշh)ׁZV{zg ԊO�B�p X- @�@�@ qѢ�dz!{xmvr>H}Q-= <t睁_,*6{lPƍl^ow. /[͚̙#H.+TjL_6� A:I%KJ,]qEu ��ZI@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ҶmڴIڷ/lJ°C48 ԕ/F6y{k׮PEɓ'{Z6lА!Ct]wBeYT*xYꦛn҄ tgd)!� S5j(w`BBWV\޶f͚UF{W_iҤIؚM!`f{Ҁ→Fyy*�j-Z] � � @T lْ><k%ԭrԾ} HXYP7߬~^PeӦMN.A%E4~xYF 4Ѝ7ި:ũ8f!]~! #mvĈܹ:v옫+ȯϲ߹dGW_}tj3xA{yuH9nB=H./j%YۙgFJCa]ʌ3;hժUyFD^t饗@�*Ptij!�Q$@V,� � � � � � � � � � � � � � @,>,mȲ+Kd:z.C|OjImۦs W"LUԛ5kmN}Xz䑛~^<@�˗ה)Sܿx~%\"+k4l|޾ށ Y1(\p.@+o,6-@ ԊG@�@�@ o/.L~)pR{hYnHћrJatС;v|A{)ްa̙=<餓Rևsaĉ+Tvmo&O>@gqF8Oű"@o /,TkLwۧO}댷ȏrz)/Zjlٲ^}5q%KkzyD*V,z/꥗^v%o_8:묳T%<U� V=#%z{=` �.@V � � � � � � � � � � � � � � @ 8 e'r9T^ EŊaXIXWr`^/TaʘrX V&Mt)sB>sYpoM.+nf|u 9 �%駟jĈ^qf͚i�bAXY;85`fEb}=@~j/^\ п/q` *BCt @�@�K`.S,Dkժ35Y]&%%*gK5۷l\_E]BЮ]; 8… ۶m]w坿sZnn&z¡9ǘ:U<XjF=[zv?.1rܯoe8BI}׼S^߲L<Sgפƍ?}ovz \h_anc=իW%/v5h„  @ ={Jwvl6h �-cȾ?@�@�@�@�@�@�@�@�@�@�@�@�@�@�|سGï癅fmE+_UXn*40SJrB֬Y몫J^f;s=^.]/ԉ'_~,ʜ@ 9?9r+vizwug+:Ӵz駟~G}]x~խ[7͖_5y%Z+Rcƌۿh @, *Z4kB�@�@�2gKg\)aEdrV,[>̏w~g{ڲe>3g *lU6:l0Yڵkk3˗Y6pmri]h?>\97ݻW SO=n!v.ok?Z>v$' @=4hnd3?S=PJ]$Z=O!�_u?D"P+d"7@�@�@�@�@�@�@�@�@�@�@�@�@�@� `WY Vph-[VxjU~u{rŵzꫯjŊ^^zyŏWVnݴao뮻.>C_ܹs→K{uYgy۽޾Vd,uw|:*5zZVB,4~wzV`Zɒ%bM 4_/B&O, ֭[^x )S?xW<UOѮWalٲU2 �"o>Kz'?uI'eE+bXV-}:Sh"=zᇽ2]l7}<o] `pfEoj[!@<(Y5 @�@�Uo ;abE))IrÈn(0Ggam_}͞͵hB^xzr;vMy)=HaZ裏jΜ93A{g-YfSN3<S*U Ҟ[ںҥKEt 傱GGȞSsj{ݳgϐݲzorI~:յkW2Z5c7ݻ)#$ ]t=ҕWJ3fȅCκٳg5 \RWUvϟ}l\Ȑ!.14 qwui+Ǥ gf͚)}^/~!�_yڧ!�đ�fs � � � � � � � � � � � � �V��@�IDAT �/ಕuk +mVF-Dտ i.KI~ͫU+&Ue+|{gu-s7n3<oz뭷,@V4p@/l&L1chK/KNN&;1|p�w|^�kWlfڵkyfYF\s:u[o;Of͚7|SeO>^hٱ޲e\+W%\O?]ӧOwfx@-+,eE-�ݻ0qW`� @lٲEƍB'w^ԨQlI&WjJ/^i" M6O-e^6tPeA4@ \bW=֮A�@�@�xg.- ̗/,L؆v,<=ޒ{,hիR/^k^@=[m_|-KZjN<D/6em[nQd@ւȲzָЁ̟?{ק Q-2}{-!o�;vxϐ-Ȟx={4h \+\;ڳt&;=@~K*YВX~fY#|64btrm֭!n>G GߡUXm߿o:P;ӤIt 7x]ȑ#e![Vxoܞ&[N<7 *ٮG�8FtuARx0vG�VQ@�@�@�@�@�@�@�@�@�@�@�@�@�@�XzYV.k]KHHCð֕ }8B(,gKWְad0{Ro^z%]~jժ^=W}ϊYwpRtA@T ]@4E`Ů1i4&`%jD5FEQ EDE)"X@E߳qWwo_cnfgw<wowf?O??Cx[oUjtEE5e|rv)*0,ZC͛z+ 5yd9@kٲeqyE.0jqa7xCg}vTE6lcE8\=*Yy'xy{{$P+" @#YfH.8P@kРA|/vDߟV~u'F]4@ ϡ:* � � >pϊ?尠p-QIW\jʏ|L/o>(:xW��GsIN i`CCͤ6cƌX7y智kOa}n-Mי0aI׏Ig}I_7 >Q\QǢ\sգ>~wQ\1{ex_a&@۔m^^c}^KV8ob4=6ސ!C福5k,ZH~ Ǎ;찜0+X7_ۦ{{lx/ o&4'r۩>n>\z饅,@�#iZ\%p@�L6#� � � � � � � � � � � � � � .PP@Vp,_^Hڰ!wo\TQ0,br!a78v^\kex~ {g7s%q\uU!Y ;BΝ* )h.ժU+-^8G㣎:JѣGt#ږmusװaâ�/;vl4jժ3 rȵ^oF7px6.27*|n^oۂȅ? �#FqO=vax:묳BP)ms6ڵkP}¨ z/.[ 3P˟x *c]@ }֬ } @�@�bpX* <!+ +m7i=>. ǰ{W˖-B\-8Cc\b~*=q{ﭺua,1r@۶m/& t+X_5q}9}qi`v Z%]p±kDѯOB}>"iy:st7G} {.<veu</Zy,/(oRKiy{A>b5kĈjڴiN5tܸqn?',j׮N:]s _ k5k̹I6m4a„h[: Dn� P~?kU, Ho>Y!� � � � � � � � � � � � � �T@ '7qUrV^0.�0=k֬h7],'8sԱcG͞=[~^{EaZa\ Ef̘!5LtZjNT;H9Pz矏tRH*"S=PuGaZsN9BO]vY޻r@�rx-TrX~os?>罵$@?(s@֭I/?⒬n@yjyꂱӧO⫛/=@�Ba4@�@�@ m|,: rg-_/ wCj}vi9駟F 6̙ i}w:C`p}q=Лo>@ ,P|L׻AZ(my@?#<ps@ocQ8+BmW_}Azy?K.1K }.tQ>>ꫯj]wB?Sքc=62l7O!\e ZW:y8!z݅^u~y?V[%_pkٲe"^:ފ/BKxb@�J]`� jCÆ!� � � � � � � � � � � � � � -ZTp@k, Z2u+8 pI]B`?`:3sivnhG'|2 5jTT6'͒%K`œ̙-Zl֭zgyFGyV' rHP!݅6֭[^z飏>ҥ^\v~{5m4m+V Uy2 �%O?i}߿\*s/Ds|ɺ+hС9x8d}? 7P^e= @ѡp � � � lI Ϛ<YؓTԩS"4+GY;fwށО{9]~ѴL `zhU-$91>d5i$ZJjՊo2.X;CŽWz?pN8zs9礬 !v 8Oy۴펟>N:)+ܯpQ^:Z~m꘴&MD}BkpsxڗK=E@RxY 0$~vק@?^~(�-9HϽuFYs-50ϽcFǗ{ {9-܃>X:1{&B�(K#-\(5jT…qw@�[F"� � � � � � � � � � � � � � @`}[ Cs\ )Iqf뚹T(pJ$M -^PF:�⋥BPIKijEBm=t$qԻԺBA|6Yi'{Dolĉ˭Z#]}:+*ղe˔tavk1n8 2? -Cx9Z.*6#T:CRnmV=|A_>*r-0Jo~:@�RX>Xo E>SOU۶mCIzK5L삲<~m~sÇ\c\TJrۈUO)Zn+gE @ p}ZGVh@�@�HTqSqY?F}աZ>w}R8&Nˤ@NN pxٲe?&]vw vQew}7@>VVر o)tpաCc43YR o8=7q^{%s(Nd[oEiڴi9pqڼyTر=S;cs(Ǥ\>c䠥!?ʸt5Ze[|xηCH&~QnϽ9o>~9}cq5ԯk_:o-5t\ ho. @�J(з9%\wG�l& � � � � � � � � � � � � � @^-S"$+lj² vWkHE\mmrrUilѲ[C E<}Y}ӡSZ={OGE:"M.BOn.R7\r.Hw7?Zԁ(CX(;6 B͞=;T<AZ]vYT́nz&T%ܖ,Y]L1b:5iDgB?k}S~h{]�NC�@w]w{B8轧E3z8lX/T{ta-e&PށZvmzr Ė`@Bਹ3 @�@�(ms V<L$\'U&oO801Ebނ]5 O>$Ojڴi {Cuɓհaèz-W_i\yQՙg_ѱo1ڹ{. *X=/"\~z衇t)vp/;"/U~)<kMKdK?FNJ 6nXO=>lC~_y~\1iޜr VCS/|Ax Cé Q{~{뭷6zXk駟n) %sЯƍC nnSϽ>}ȁXEif\Vu_!�@x#{ @ T 'm"� �'6CmkF�@�@�@�@�@�@�@�@�@�@�@�*J`ŊP²/NR g Jo"m46W`ѢE:ה)S矫YfQ1<s!9r19Ͽv.Tn]]s5r�Yg3AZ]tƏAo6mw\�ʅf pC Fm.ԡC(HkTEr8gvs}fRUB>|x[}ծ];^4c@�-([n /0\l[Νտ~jPElދ733DYo?-v頃ҝwYM�ddWUt6@�@�J-Рi! Ί\[jUmDhVq׮ Rk%3fDA-.,wȑq?_ׯ_?WU֭UW]IXn8@/Btla1{wi?*-|c>ocڥݻjժU!dž6u8[;.'駟96Ey.ի̎IϜ9318UO>YkSBU6 %!`k?iEWkU|ZU ' 9�}p[ z4·;ww›`͚5s0:v=FGC�([ W_U.Ua @i w}S-%WeUc@�*X@ ~�X= � � � � � � � � � � �%YoNnSX1p,A"MK`XlYT鮻>\V՝ksؔ/9E69�/ l2�YQ$T5rSH+Ja&oڵkBf͓ן'ZRzr �xpg}V͛7"F\~(#T_v˿/VEa傘.IC�2]`ReW3}o~@�@�*@j9(P&h9l[8<+'-\0>@W:S}:hhڴiZu9<aZjѢE, #$kL^ә%{?Uz?hРqfRG'i:u|?WkEy.WcCHGK~ '|r# c9=|ެV[EW(J.\FC�(7^JΟ8V̊@�U|<o=@�@�" U$&n� � � � � � � � � � � � }j|m2? y=9 uRږ[dAX*hj)p\H+u7jժU+u%lT.6A�@ \_СC[oIW\qET\}QuYyoOLu-o9yvO;TM6P3T!�.Ԩk A3l> � �H BHJp&Э3tRR̙3uaEGep|~X:\'Zް3'KHz",+CI]$-_EQ/N<zJr馛B܊zon� K${3ѱf�$@Vſ+D�@�@�@�@�@�@�@�@�@�@�@�@�@�H'ksïCcH[.u4H j\3u^rX[ޟKd>\k՜9sMo4eͤ])my5lذ2] G�k֬?[nESNՀo_~G"|h-vsժU%V\Jr֭[>=0Z @ >T+]� � @ ,Z$M,94+~=<f$fw^nzi sРA9$W7xc7й_|k ʳ^KCHTjmݦkĈzgJwi'|22ZjFZB7Oa<Wrq#c{ ϻ5Nx CWog= <8#F�]~1cJNJC�JCܥ2@�@�@�@�@�@�@�@�@�@�@�@�@�@�2X* ±<EB>PNs]N j^WƍSkȹ;Tj˗;³z!4@�(ҥK;u 'DD:u*K^[m:R\"*kVTsOS|zX/ݪUK� � �#r³&M>@ıOf~zb m_Eq Ym:xwڥO,žbm81c=>@Ħ:QHlKBƫV_o]7}E�@_?q@�Qf@�@�@�@�@�@�@�@�@�@�@�@�@�@ --t@O?^Bgfl-7PFբ!uW_A�@�" |wQ@}ݧu֥^vک(}e _UT)ȁjz74`-@�4oQN4~4@�@�J.b $̙=zH'tӦ%_g6/UVzDz}/ciӤVNjhC?\Ϊe6i"me"Pk}j׋۷׫#G.ܹgσ5~jݺ!'կ_sG@�J.@U *ݦ? an � � � � � � � � � � � � � @16l-J` `ʕ+];5�aXmn</js @�@�>}n=jR\ ?_ 4aL`lUPkѢt?jUcj@֮M,Z[&KB�@�@�)SIró@ݭNf}tnxVW,kG C^z)שBvYm$awwA;Ѝ7ިmyHF n ޽7{@ jԐ?`E@ ]G�@�@�@�@�@�@�@�@�@�@�@�@�@�\[0 8+y0qSðvAKb^Ʃ9$n@�@�HcjС9rdm[oTVx0TRa{QG{}ݧjT@rN@�@�0ի? rԩcε]:PLLpda vBߤTfLmfʲ.ݭW^yet骫ҿuVG{}~7Yr) �T s۳4f Ze'@�Mp{8\� � � � � � � � � � � � � �+cJ;|ô֯_ooHJjZ{`,cyQS � �C`Æ z5,T7n\<[>8PĐ*QNs"z9@o߾)(@O6`3 � �"˚81wǼՓu zZ*0\LX "jt9c)K]-{^yBٟؓ&Mh tEwgiԨ4bDccElD�HW~u.@� P$Y � � � � � � � � � � � � �d%f-^9ï*:5 Sq0Ǿ-S � � =BG}TrfΜ?\=i Tл7o @V=X1uO� � �%rg}yuJ]*I^jۖzJO論iӤ_ (ehF5Kڰ뒪SǏӿo Mvz 5h\% @epM7Is @>|Y � � � � � � � � � � � � � PKHXM;P+ժqV˖Rw@VÆIc@�@�-Z SN_o>3Rણ܎<H92 Ma @@-M@�@�(ҌY'J' .tBv??.UKZ� GHkKァ&+@-":c 37CJ*:SuG[o=zz郢X7E�{)լ)Q w]B�≀� � � � � � � � � � � � � �%pPk?߀~թ[75km]wM`xW/\B�@�@� |7;ZH8tiӦ_(D.Ym;C-l+` P|o=@�@�(Ϛ5ylTԩS"4!:; M&U2pq/쳉޽ 3~zZJjn8lЛ3u≗륗hmדOµZX @ 8W/2acs@�lɸ � � � � � � � � � � � � �_`Zi~qm\7i 7!X;(b%7#w � �'|aÆOB=\#|֖#է+G5 :_"P V�V-2' � �,sg-^,ը!u86~ɉô<'- L+_OছS 7^ *3I9O~_gʰG-[{=Cg}nk /Ldk@�W_?w @|*_oֆ� � � � � � � � � � � � � @ZqV~XE.֩YI{:/r@V\Bv"� � &ƌiu]C'tRkeMޛ+([*U Yzjt]vY!j@ =֯OlWxI!� � @ :78!Z&I JݡC"4kРĸKV#@XR:L驧~JYC-ZHsd5AI'נAS?W%HGK=$5 @ 8P/7Ͼg@�l P+e@�@�@�@�@�@�@�@�@�@�@�@�@ ,[O`xti*k仠HqnkHr @�@�2W`ݺuzg5tPM g:CTFʖt^f,o:sb թSg3M@�oQ#P+=@�@ s65<Z>")IݻK]Jkgξ P1/u4c4jt5{v-%'j֬䓥ΝGG@ zB3F:l{qf/@�@�@�@�@�@�@�@�@�@�@�@�@�\`ѢMbXxr�,Om8DAs @�@�*/ÇnӜ9s4p@s=}+Ng-otV^ѡўl<d@4@�@�_`Dx֤I$|SԦԣtUó20[`d[ >X:DÄ `oLhR{ |K2E:D@ݕWJTF �T@ZҞ{U[��Zeg˒@�@�@�@�@�@�@�@�@�@�@�@�@�T`ziMdS^&~0tIUn� � �,_Luwkҥou @!M4QΝ5zh jHO8PZ> @�@�qyL;̝ 8<%!� toK={zH餓yFj(z.U<tٟLؓ |Pb7'Zʄg@�JC_?KcI,@ JGmB�@�@�@�@�@�@�@�@�@�@�@�@�H+]c<?^PrVܪT6L r^RYKjf� � �.v(X͙3Gvz!m tEim-½ +aÆ݀zW0�d@?IV<fl) � @ ,Zqx֗_&ΉЬeh9Hn, *U }ʕK'K͚%v-t+3ΐWQR2;Q@K"ծ]]&g)#xԵt=ҩ濪>x#-� IԺ:i,uLr@(jE � � � � � � � � � � � � �T*/ï2^8u_mujVNETC.!� � @V^c=Vmڴ-ܲ;M: ~Z;nf* ֭[wJ_`ӭު~@�i,n]bLMC�@�(%K!6'JEC"4ac4@4n];7$[tAرҐ!CICJƚXF l9s}k+4a?H&j"Ȯ~}u1$BWtɽ)@�}ws!1cGF�6-@֦}@�@�@�@�@�@�@�@�@�@�@�@�@ \ kSX?z;UV"*9E@8+7l(U .!� � �-2T;#5zhծ][]wjV뇆ʜovm7=#:Ti4(@PUGoN8b/;"�!jUZkg � �anpfΔ6l4wN9%7<h @Y|t]i^ksI^kf(f&P+!Qk֔nM:DV׮K{ؖ/><1}GI>g� 5jH{:@ z߅ � � � � � � � � � � � � �$BW JyC6zu֭qVϋK?@�@�@�Xb9;6ڔ}ݧ!CD׆#FаaBѿG[p@Eo:GU$z-T=@?,�[ .]Zy!� � P:"MϚ4)16-^Ӹq"4csóvءtR@�\yYǷww:´bld<9sew? >8էt {YJpe @ 3mF�(L@„@�@�@�@�@�@�@�@�@�@�@�@�@D.`@|ۼg4H yDQ,"q8+׮]M � � @ ,]Tx&N(g _ns9zGtkܹ:4|puڵB#PY{o5�X ԪZ$� � PiVJ_'>LoLjP=Nss|� ( >wH\m[9ZfϮi{v/+KKgը!U"mؐ?\r @ s:ӥv2w?r@�؄9 � � � � � � � � � � � � �p!�?z?b]Q,9ԧ(+rQ  � � -Ri $3<S]v7o_@Z[pa4@ CʐD�@�P`i,h}Kݺ)KW_j* eH[wTPZ辗_C-9sc_3a/u饉;ֈôm9',M&mU<1 @ 8|^=i2c{@�*L@�@�@�@�@�@�@�@�@�@�@�@�@�J.|yj�Vހ.MqUƩaX]^v0V< R@�@�@�R~ 7 ӊoYNPoZ@khcǎ o~[�JM@RdA � �%p̧&³&M>@!H^ZJrK쳏4xp"<M4@ ]O ɻЭ彞˕OZ#GV=:TzmôO;y/=x&%ێ�d@xMn \jUǓA�@�@�@�@�@�@�@�@�@�@�@�@�hd\VvnUնơYu ޟK � � �/0|Wg.0LkCЭq#plF!]v?~<Z@"ԪH}֍� �d?xM;L"vMKDxVUӊF�XDy=QCZFQ:<Eƕ]9}/3gy5]Vz 騣˜}cK@�R @ !{� � � � � � � � � � � � �X, uEY[zYo/u:/n{3� � � Pޡ7|S`V UCn@qpp\w]~mۃ�lR ԪRe7J@�@�%ɓ˥Z$t.}JժkU Hn9ЯuHMⵯk׼rehRZ,q^Uҥu늶 g%#J @ +]u4kԺum?[� �Z0@�@�@�@�@�@�@�@�@�@�@�@�(]p>iÆaXZIzk8U@�@�@�S/´Bô×D?^{NϝbdzBQ odJ;TZ_Ei � �T/6rLRNRҩ&;&tH'3;zuf��@�IDATk*K/slKy hXۜ9sݬ+U`*wM`O~%9gw!�3;[�l�Zo=@�@�@�@�@�@�@�@�@�@�@�J5!fUʕ+7^Z|x:<^~ŀIN7Ϸc?@UCu@6®j/tk֬]q_W+$x"J/︚MC�p1�MM;HkѢ@r6H..q~oKG!@�@�@xq|};</ȗׅ}>y/:x~Seă*8ݷ]bi't= }@}]'we?W߾}5h_{Mnv |}QACxb͘1Cڵ+5 @jܐ% � PY/(矵$$"Xb/ᠸw>v?Mܧq~ӨSNV[m ~WRó&MRxOJ!uqq `2F;˖-s|rŃ߃{Oط~q~ڵEyyu֍[8_xa"L]y]g-qԪU͘bvJWΞ-.eZ K.I �=Z9Rz {R1c.(w~Q|Ο '5ίwɃ_>׭CUA9uɃ_xЍ{LC�I =Hj~z69�Tn*!� � � � � � � � � � �d.]4gG7q繠ln pb.px\tA?66{qA(/q<?.0˛\A[ y 5ėM AtzR/�' q(%6PTހ-raP,ޥ,  � � _p?OܯXs?9};,O'I߉$/{:IM.{?y;ϗ<t~~Ay/vq+N> z{f ?@q QF@69}}٨O)oѼEC� t9)T'P,G1{.kւ� @E 8k޼yQ`ChE]?7>uO'_g6y܏?ZqV<dӶn4i>%$yY8SwsJ|Ow}Dh֑GJݻKoU@ ||5}8ǔa{… s~q?xA;]H'{$yN~{ݷx oG_Qa_9$u<!&~׌fJKfZ aa믳oyÿ J /{=Iӧ+|1GS.\:��_J|Mヒ9;כͯ84~=kGzx뒏!u,W~nkaqSHi@� ғOV=a@�bY@�@�@�@�@�@�@�@�@�@�@� uIHo[nc\_qshVbKA7qr1<;ǸO<v(hi8.e??|M=A[.2~xq!}مid BC, )-|bC}} 4@�@�./wAȸ?'};qNA84clšlj$(o~_O{+Z"+rP/qZ}x:* v?r7璋y:9XͷTs .O(J?(~(/t|讻ɓ'O./ փ�HA!� @f aΜ9uHgꫯBHQah}Q?B>O!T-ZPnR q?@)*} K|> s_\y3p5k2l2 A'tҴio!DAm&³&1UO" *J1*&vc|L!}u8k8yp_u|~>P~ݴ[az./7B?7/cNNrߋm=(yyN|!(|N|UY}e{'?iƏWjwYx]>OmcR3vNsǃ?3v|\<8~rO{駟W_x/zռys =i&35 }ߡ7d@�*�ZAd@�@�@�@�@�@�@�@�@�@�@�G]~ , ΅^\ w);ႡA =jժU|)h(l|_ʳ% hپ ڟ:ujJXX ZG.}4]"~pr]Zp@p,}yݺ}O Խ{Y.I � �YAEqq1"q?/'ONn8|yq?Cx؅\ ɊEvZqrtǞx^Wo8g2![q(FC2~Xv}@�,G>:fɃn"�dp |֬Y1cF(?3={vT>r\~]vQ(дi| vgZś?CFxp߇y(uÆ>+ !H?H:<i„Dx*LLo_31iRjxV`ZȺQ'+o8Gmsm@ ~,_|8H@8<=# {<<As$k>_m`_K&vߋ:y~O3fLy!m]#" 2S@{| |I0}n>֥Kppl_oN>yI:ύ>͟[} ك_SZRXk'^~_=zأ5}Q<8�qǥֱ= � P8j@�@�@�@�@�@�@�@�@�@�@ CG?t;<]6�K�vA;wf㰢˙X&yߙ.??.ɚ]dxpax8x:uy yMH&wp=8†TS=Ns1PJ 5ԧOziz4@�@�OV}7cOk i<r56vq]_w_qP<ԩ/1e">DfߊCPv y:{:7}" 9`coUtxW@QmIv?3B�\Z. @�LELBjԩS駟F!ZWT!O|Zl-ZDcW6pPPL8lΜ9BO<op`tE[tKA.F^b(C 2g}ubBFXuEq }�SG˗G;]v+ xs4M6gؑvm>fx{#Fȡf>^GuA;v[믧6VԄLkgoU󛳥<tsjge~{=^c&w]z~, @ <ڤMV³2@  :^kf � � � � � � � � � � �T ̝;7x7o^δ $RvZh6I]!.�뢰.LC \d(lp'qrsQqEu.R\~pZjmfm]>rt͕BuSîz`yƗ^zaբ!� � @8'qM=ß^w_ݸyx:}Ş&‮wqI֭[<뒧]8E;rRr?QPd;q?Rݺu7{pu?_]օi @ ڷj!�TzC|'Fcw0wwY<xpWzA5m4k6ӦMg} :5jTԯ ٳgQ͟ۆWxH!!Hk&s(G'=!}pJNܝ6O眓{U@ /QH~xk;:묳">6>V">7'y5 ^z)O}ܪSNQl<ypVOoNHOysǚm'tR>Wi7a\Ln.``{?CF~ӧOo߾gF�y&ց� PU e� � PV#] e� � � � � � � � � %_~ .pM<'q!VӞ碭qVVveL`mɅbc_ۺ.F]{pq)7oCҰaRS'Fuks+( +Ώ89ӿbY@dTAC9we@�@�L9x|OX"G]0I߉Zɢ_' F}?q@{^PP 8b\<4ov#KuNe/бcG 4HW+ی5,YD B D~qOn�T#H瞻q}l kE�@ oE]ܸq,Gm6 crAL8a?lw}T<46mh=8msð-<u .os><qpZ[ЬMi3Zk`Q|rwpi,}ߏSFիW/zL.]>6-X<t'hʔ){UVi-‚v}wypp;n5s@aW^믿r߽s߁N{VnT'\`Q8!Ǐ׻X߿ 0 MFo +@�1$~o��i#YmgWi}f2bCʈD�@�L P+=@�@�@�@�@�@�@�@�]X_|Eh5k]YfJոj *@ \p 'BAxhѢZj2ԭ[w믥wiJωMM.9S nh780חҜ W /$s @�@�H/KKR|.0*аl9'>whN/i q_Qr<bq_pfrիWo8 5P4-[gk6 @`?,]p|oǵ � P|>LGoi-^X 6\ȿW^QCNhG&L{iŊjҤI(Op ?AzAZ5~тn><ԳgnCB(-C6;k|7cdžsF!1C{[xI<FJSgksÅ~+"-7K`KZ)AMυ_|QrX`~&?;tk`)X"|>h)~ZzuwaQpie �y!]C^e@b| Zų'Pxn @�(�ZE � � � � � � � � @C3gjƌ)ci9P˭Z*$qzpM60@r 0CBW={v6lv]<m۶ѰKH׏Zj*KÆI>qwޑ)*v~<i9T+nU(? q2S)@�@�@|5kVN�yw5_?s3xϓΪQF%Qa7@>9/دG~hܿȁIqHG+_js1wEXۑG)1& @ _҅J˖Uvv@�*Kk9r^y{\}B+:uD1a_ք7[oi̘1Q|>!#8"' 9/ 7$.䥨}e~ iXn.+- �D}Hs=P)kE>NPtҥKyer㶮N+~i!HH!LV 1e>cgCm׮GGqիW LI.3Q /Dߡ|,I'$!�)2p/)ͥ,@jߎ@qO@�@Hj!� � � � � � � � �я? ?>S%͛鸨ò\hA8.d5upx!@A.k9υ>Q/(wuhtPN:-z.|s_PBRŏ5p`"\,)o֦B^*a*JRS  � � Pӧ|r o-Z͚5&9߿\h�T/8m<G~-sѺusV6mR]D+}tԺꫣ|I8KD�JY`pW(] fq �dSOiZjv}wvaQ Eݣs݄#ƍӫ^zISNCMv&UUH?,z1'3ǭz}8l„ ᜳ碠_~8 <6p?ɓ0qի/&:ꨣXZ QUo~Sz͖%}z衇W_s:tGG!ʺ>_A<Fc|gϺh @I=W{B0cI@� Pjߎ{"� �E PHL@�@�@�@�@�@�@�@�H?wA)S裏>OYqm\I˄fe]EVX?\.>mڴP?_v**Q˖-nK.f͚lQk03bYõ j B�So7+ܸ9u\B�@�@�+b?whH~CBo7}vpqT5k"~.d!o@{ܗ =:uc^%[P ;.y~!�,\"-Y[ɶ!� k׮)Frws1QVc!PDAyL 6 ) >CϳXt zf�Z}{O>~i͟??:gazESiH_~[o}y֭[㏏B*'J K\S:ˆkΝzդI(\Ndg>?>|F~8z?\reZt[nJ~#@)ùxhQ""@� U|>o=@�@�" U$&n� � � � � � � � �T?w> gBUCڌt9*мy([ !.S? s F!{jv͝;PG \Un]vAYN{Kbׯ_q+@�@�@~q_~ UVz88!T#@& ӧO tCׅΡj v۶msٻv?" sɓ~A?!�,JKVm �Cx3*_'|zƲ5)М'|J2eݶws=Ruv R:Z*ôVzP8.#wG@|Pd >< q^}jРAjٲe($0e=3Q̙33B)k$@U~ }w q?S1bnf8lCd{ipO(;qD>!9 ;KcH @ U|So=@�@�" U$&n� � � � � � � � �D`ʕz5vh7n~G:t~�ԩSI@�lXhQTX~ҤIzᇖd^aw CUPj]ptޔ � � �.b^4 ~)ZΡ_~ޥKu1 r@ @`UViƌQ@ BvqճgϨ|=N18}onQq-[=n#GaVqš@�"WH @�  $ :TլY3uY:մiB_o{vZDjµY=wђCh/@V?6lШQt]wQp֩*hm$-kg?#zC_¢(.R^zՕn`KnJe k6~]:ڵkW*g!-ߡ/;#@ 8P+t}լH@H<zo @�@�@�@�@�@�@�@�@�@�@�#z(87 2c?{&E#䌀HQ% \@E0ň &PAI"HArF APP@jw陝ٝyf;U|{tօ $Rn]y駥^z 3ųqH & ȑC7n>82e|IuFP i/qPJ(     Hp̺xbYtV/]x -!9s&GX � :2db$ҥ}u !`;h4iH ~ҠAmoCtȚ5vk׮(kG$@ML  @`ʕʹ�;wxiݺzR(�:2eo!/?^ &wwȠA@0,HR�Ҏ3F @0}2o<iڴiJU咀_NMSNÇ1kזgyFڴi|kE6l͵o߾{ l�@w3܃6m$ }뭷rHH E,qQHH�r$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$}8 ӧO3gjg |b+5%KF_Y# lsOK(.ɻdܸQ}f%UNȤ~/]X*_ $@$@$@$@$@$ٳgknjB?rd̘Qgu._|)� � \&P`AMؿi+,󏶭Á7߬r2Ij T`4*Z$@$ PPHH|ػw<cQ;!V^-5jGH  ݽ{wØ^xAʗ//z_|Qrҙ5 @ \tI iAɓһwoyᇥp.@DMVn6۶m 2DnvlzWE)75e }(FܹsjQ͛͛lٲ\%*W.]*_~Y?S)H$)ŋ"_  %[x8VHHHHHHHHHHHHHHHHHHHHHΝ;eĉ2i$ٰadΜY hIJJ, jW_F9( )cUr@`+rW}wv6 $@$@$@$@$@$*@eڴiʖ-[NXׯ/}v5kJC-HHHXb_ΝuO˗˂ oȑZPvڵ *ѝU;BĹ( � Q@$@$@$`#pQyRK/$իWbuԱ* ,VZ ~SN'xB&L oJٚt 7`ӧc?.9rpqH * @AiGث6m*.]:* ᅨ9#%K4(e}v=N2~xرcV Ț5kD٦O._~˗/ʒ� $/ E'xY^D b  Qibެ6 � � � � � � � � � � � � � � � � � � � � � @ <yROxU)SF+p 3sL9qvΌӊ`$@1O ]ceFrTe9|<"uo]I"E8qܹs1^6HHHHH ZJb7t̚5K9i]͛; E1;/,H%5kVm<xHSɯJʕ+m+Ve 6h Ԋ3z� � � � {c &#Fe˖mxR�ĵl"<[m@$/۷4ToٵkoVt/*xE?X6m$V\Y^{5|n?~9a[\… ͛)ϝ! mO&<裲vZ9vGްaCrdR N@}Z<yD,I-eHH uV>l � � � � � � � � � � � � � � � � � � � � � M`۶mҫW/)T<RR%?/2|piٲd̘1|HH @˺u]I&Il٤G SO=%".     p$oɐ!C ,X >lݺU;h|뭷E)S&I$@$hnO?TWX!m۶ѣGkauȑ#zScꪫYpo& $@$X0ѱ~$@$@9sF={vmG{Ra+٤F ]tsɚ5kdݺ@$]v)5k̝;W>s)P@tU!0(W?P,͛7'N)ԓ رcCrˬY$_|$%)BRYjTVM4iES",H ssԊ � @� �IHHHHHHHHHHHHHHHHHHHHH ^tVXQ;xwagӦM%MAO}2fܹ̙S7i,ZH{15sIj~W<M6yR &eĈ VeRjUyb!3C a_-8_O>L0AJ(1oHXHHHHR%K߾}믿.[M6/_>۝RK̞=[1J*%؎&ueg6m/^\sN9Nqca_4pqk5\ĥ oO?$K,~ɵ+AECϞ=53gJJw ?'|rqJ&n/^שSh1K\� @0-HH�cDݵ�DJ$ (駟nA9v6<™c<իB ҨQ#=/E2(&`0~s7o3խ[W+`m$>zl]2clhzV$Gwh܆~RhQٳ?fndÆ b-s ΜYԘXy Aآo:4""RHgD=;#]3<y~{ޖ-[}$@$ޟE.5N0HHb�g3cIHHHHHHHHHHHHHHHHHHHHH LOM8M9z|1{WdRl~Aɓ'uU}>1`}X8V]`̘1CΜ9?v,[Li lCo߾];\~~yݻpB^yɘy� � � � � SN#< d82dcKg.]$YDZb!ɤd} 7,-sm}_'Նתir-q ԧ~*g}V_wu'WU"^_mϗ/ 6grJ]q.Ǐ<a{t 4BpVX&mNiHGE � � D-tE?"Mwv2'b ѣKǎDNμhBn [rCA͛x/CXvlRnv>}dϞ=F_رc >\]`ri=+k ;n#?Yf>9j(=2yˣx nI`eL`AÇ/o]J>}j{:x|E꼺uԪUKnVs &а!IHb@[cI$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@ jժ2e8q,]T5k [M¤XL(P+Tw}RlY0}8ؽ{w-cW=͛' *u.SVtM}WDB*سgϐҦD8WwylٲE;B<x4jԈ'ReHHHHH Hs̑k'x_|lܸQO>ȜR>[[Bkw,cwc_6p &?_v~X j;%:'K($[_^8ͮ^.ٳG^z%-^F mSrIFpX֬YuxyժUWػ.\X)BMnphWG2P|~ pC Fd4qHHH h'NΝ;k{Ni'ː!{bqNC%%O7ia?p@rt߾xd[rCAk.- =kNڴi##FH6Fׯ*U*jLv@ϊH_u # $DxLl<bk+VLBfɒE ˗Ot]"G\ގ5K.-Ch#}OwF7H>tOtwFƍ'sQH⍀*9,Yo-g{IH V9l � � � � � � � � � � � � � � � � � � � � � E`ٲeYJ*U:Kg eYa8)M:8D@.]M<,PVqPb*':pG6oެ:uO?fHHHHHD>VZINd֭ұcGH,~?wch{?6 ǢEը[eU0 ES)5NoI W~GH6>|)wpzJ%&StDȜ9'P4ٳbUG2P1       yx}GJ#m'KN[B4ډrC%%`ҦKNƌ#۶m>([rCܢˑ#\s5nt'xB`ORM@n5]p?;"ϝ;'|OB(Yds7SL2qD=wu;UPk2{l[r{fenl WKΝ[^~eH*؅ H `SݺԊS&� bWpMōeHHHHHHHHHHHHHHHHHHHHHH``v#O?4E&\|7z"ɓ'DGZh!ׯ &HBx2~x=iM6O<-;wJZ^Y*]Vk}-hpLڣGj?(:bŊɐ!CLQ&½+Eѓ;|r<y4<mYG-3fʕ+˰aôGO' cǎɨQh^zI;7ujWϞ=iӦ4SL_~E|A=i gH�W\)fC>rЧ[As%w+R�Cfҵk+Zjٳg%ꯈ<8A?C;]_u6l ٲeݻK˖-u/ {[o'oٲE]Ma޽B(;Ўw! [zr{Y}-,'vn'ڀЯ_?W^>!i… 5k%3� � � � � ^aHm-߻1<~&Z?~<ѻ1+Ǘ6E\<XrC> [ُ>Lw?=:tH/:/~_Γ'ugZ3رd^t`kÒ%Kv%N-t8lnlko~UT{GhPo !t:?+oMHۭ[7]'+i7NVZ%חz*�_|!H;GΝԮRJ9j֬( 7j8x.'%{⭷*+V6ϔSeöhYMvNؖa}7& pώh"~cs#⸵3|HE@JHHH n qe]ƈ&7 } +Vj7|sj#^(l+CZد̸%{<_>Nv"¸,1Fpq 9_6(CЯy91*��@�IDAT p1dxGӧO$`D iD#Lu1][xյ`6 [Ό3xҤINvE4!u`\Sc8p@͝;W*T 'P3A-… {!b*Ʈ N W>fkʻNN<M<G`ĘɡCʥKonD $tP.({޼y>w<}Q?r1.'+XPdXqx:rH=v0\| 1D T34=>ygiS(Kxd4$@@Æ"@$@$HHHH {ϲ`̚HHHHHHHHHHHHHHHHHgà&+[ʹ&[0b+&V\,RG-5RB,5RBDpg̙R,5q]cir`.]Rp[ZI&Vخ[G sYʹ>uZiҤO>nV6lh)Q!U `CMеʔ)Y`KreK Y}$sK zYj򻥜4e˖vZ7p`lO9+G rk),tRv)17KQx*ϗNIY?qUR%o6mڤY -#(#a,%ؤ0[P#O=rYJTJZʑ'{jܸ)/rrjb~ʁ}v7PrQ%KZ#FդI]7%wEo# #%ȥq܄iӦHgɴվ}{Ϯ@mu>AB\ߨ٧AXg} 룏>ڳ$@$@$@$@$@n \pRs$f%!ލK %@n)iK ew^;Duq'*a PBzxd?aX9 6$L>'ҍA ii ן}YO`p)F>2 �v 7u6e[9sʟ?DtTرN%wWZv/`16+ByD} CPLQNMV|`)nK98Ęt;'v9mpsӎmR2lf͚5ӶϔGR=}_dkvwyG`Ľ)>(ONۊLD&k<:"[;rU$@$�w� � J'Nc.`H>JRzLaƤ#㮻1JFP^X`a j7n]͛b5W|?A꫎㼂awS؆b@{_sֺ|/2hۨuf)%/aFeW՟X >ʞ=sjڒK=`6laƶz*']S/bL+9ungE: }X_kʩNxId%TiṆCn 7c'LԺuk=ڔ h,^8UGU2k%9{an3`>tOtwCɝwi ʓ� s(_,5 HR2{$u g    $ jE.&                0|hhRR-59ݲq^B)c=<V<ypڂpZ�Q-L̮_<1cF-JG)ʐ!8ؘ w@4z7&"o8qi^ &rP0i֮]w 4 mB bh~N.Nc2�GpaS=L;7 T{|!g]vȄ|i5f '<Ȼe˖L@XL?3m8p%(#·~調F|u#աC{5+V4paA#~[w՞z8CzXXժUuYH3δxAji�Q2CXmM$@$@$@$@$�|ǎ#l ލ@6Y&="FPM9.&_Kةp[j6uT &j 9dԩ6` {r>{Z_n HwA@v0F* @&nlnl4n B=©]^RqI^,sM׻_op 'Ʈ a~MgϞziԨggts"}x.)}Z|~ESZ{*l&ނZ&mRkiڴiWd]GD¸HV�@<L$@$ <X'D#!Z5kVk`#rNnH w#qE03 @vo;W<emڴI VgDŽcGz9?ۏqY/x(O�;MOŲ0VΜ\_son!n-_}\Fv^K#Ϯ:ظaM�4EΝ̷3.Ӎmխ֌ѻ=>oa)A?+ uԧM<X_kʻNӳZ0 cObc~9=n2p;+ٲe>(9KO}d~W,押qp=wpnt\{ӽ38Ag/_>TN$`P&kҤxh-H$(I^xHHHHHHHHHHHHHHHHHHHHHHb@"HÆ"#2oŋ18?W�DM%#q(,۷N%K\(z믗N:+[lL2L.JJQNkd׮]xJEXLj¥w1thѢڊ*Q _~(ىʉTVM01B2SBZz[9b5W)&w~fj"'ˊ+ʩS?U~d5 C&L I༘P]<�9e˖5Eny]5Y\G:rQ.rzJK .,&zq^&O,ʡ|P9r㚾ět}QSo_}X uD Y7m}Af$@$@$@$@$@$@a&˖d/MzjJ*ylDn1ƾ.}4h@NPR~'hI-&^K7sg ;C ֛Ug]F9RoQ'l{j9?޶ ugW^?Ă2=Z3f?%⦷+=YqvA߰ ʕKGMI9v͜9s}ŋvD'LAfcVzoK7L>npu]k6qa[Mҥ%az`Sqm#ά3 pA@@$@$@$ƍ'O6mxJoݺY.[e'E ;Gnv%!'}~i](QoQB;2tPm8@B=nlslPy"`{nWאڋuq{mFQ/{?"u3z<yxa5`XWLz}ֶNLɛ7믺=z`x7upӧX_kʻNKNN;h{߁=mԞWe2^(P@"g$X{an3Fn'c> � 8C /2 � @ V 4VHHHHHHHHHHHHHHHHHHHHH @P A 8fܹE9#;7kLƏ PBsz2}]vGH/(QB>y^Sco4jH (dwh+8 6`ȑ#! ҥKԩSe=4:g͚5VZ%o|;D#'kj~,u!gAk׮7wiv_vxk5kx~۷oݻwKun+uB]nKӮxX~. ̆`؄ֶmjG9e^-%( sH>,sHHHHHR/*Uhd8ˊ`?vn^m6 Cwd7$Bx/_dƍ)j{K7 ;<ٗ BNg9r$J~`8nt~RDwN7oYp| p QFXN!cB(J,str p\�7![vK't͵N;^8 ͊(#F&M$ʹۣ}"Eݾ?gOٳgu?1T۫w>&    p&PT)v !`#pmrƸ$n'1_ ,kʖ-[dsEv+"{2d#blƱxeuŦzĉ=+* ;9D_g=uAَ/\a}if|PlNg]1ueʔ7թ)~X^"SOΝ;'>6sL;T7upۧ+tF7ה;߯q;v},}=7)c\e%O?kAx G <W`ߵkW7~Ot=,'CP_)/R|o?\E1 8&PȊq M' &@A>y: � � � � � � � � � � � � � � � � � � � � � FPlciĵqgR9j5]rAoL$|dO /^k!Spa={to!P�A+8ԩ̚5Kϟ/ݻw8KD@Yuюt'ң<kDI&i08{7b_&/,Ku_^7O:N!ɲ9sf/0;@z_<8>�(azi'G yLy~G2m4뮻<j'b+վ  8ǽHHHHH ;+G'6q#v {y?^lYm[nʱEyޏ>g"@m ppggU?v0c{MogxE Rg_m}8ҭ[7,N!XUF OP앞j%Զf=o޼:ҥK%󶑹i[s]㺰?ןx aÆEs5 N7H�#o<!~pԩ+rU+"r � � � � @D |1eʔ+vz"Rw|gr; *ڟ_Z4h\s5z ucq[/cRmsL{sr%K z<Yr֑e&pUi\_ 6ZvX׵iFΜ9#Ny'ɵXuk[uc5ӧdɒE>/Z|IjpSpi{=f˖M@P{gp=P{$ǸjzQP 'iӦ2cƌ?{a^h$ng}s Ν+M4I�5YN8� @ V 4VHHHHHHHHHHHHHHHHHHHHH > @+i'D%$k֭"gttP6Ѥ(9?vco߾r-2i&R,Z(#Mf-\P-**UoFi5kLrʥ;@| ~\tTLN$L^새~NǩfB/'{˾?)p\xDYYF2e9`7L}DxOE\NMB#YĉeA8p/+pl p۪U+gLTL[c?~ԩK      w:tEz%<;w] d/\0gΜD4_7$Jae{=@mǵc8kD6pύ^'?;XB$w˸q<P:t( ēk%)uʳٲeK)VZf޽kAqOdҞ>T=z ;bڵut'^77j8xuۘǏ[oU;E_2(TNZvGsP_Rx[TzѾ$@$@$@$@$@G�=z_~YU:$!=ZR sϙ̀Kc5F"` ~2p@ٻwyڦ.v_`{6kVGdǎa^NPy=W#{F!>h$gB d̘Gd_ cXQ'l슱l-{q~ql͟?_b[۪!b[ؽ~W-({Ӧ\הӳѯ_?ɐ!<3zfٲe!W@hsG�fgO= J\ 3_4z)jժm{X#qOt[s5-x9<|;#@cƌbw}w<N$ 1k�M$@1LZ1|Xu                     P~P('ٽ[d6 D%N#f3%F#JId(?XdPE 5IZEԜiTUD ]E:uiNM74l(JJjU DJ%$RI֢X0VͽlD(? /.r"+(ʮҨ.,Yn;I͚eɮ󈖈pL{`B&&VP L5i "tT^zI; kt˴iuy^7oւ]dwNjf*r:0a'֭[K8Ƅvm9Rmb$p(Q8&@w_ۿ>ddž> %<gTCVDoec21]u8pOKΜ9u1pLtO@e0ɼY&_4o\;ӧtE _!^�GD#CFG2e3\;7VACu3ԽkνS\x\ǎuLh$ss>w1L֭U7`\'Ç_|Qor7d+8O|�+WfHHHHHD�3gΔJ;`HigxImy/6Kg?n%pwRM=y2y1ީr2o;8 ǻ1y ,!nڂ`7@3foT!.l\Ơ0w\ u`S=իWnm]4_GI xG9alР=W{i;x <q۰ >o(C8 F G&f)Cxe6<˟ts]㹹83 ;9➇]-b>OPpҶm[裏Է߶fqFl# 9 Ug$@$@$@$@$W0�?pFa2 0@@Lu1fv;0ܼs@ԧYfj,-nDu}Dxg]l~W=v I._xjz9?A!?q^n8X@*y2!P`Wלw%Z`@L͵嫏#`mH}gWu{믿mǧԷ<LO>DIn(ݺupe[uk?3R ³$O6@}>0-yCT d?uk߹s.{IuJJ||wXQMJV*TÇSU6QF[&ELZH{.k 6j{:y''7 `NazHͿQpHHXpHH'HHHH {ϲ`̚HHHHHHHHHHHHHHHH?X_Yɓue<hY{X햵qee-]jY[֬Y5meMdYcZ֨Qᇖ5te lY?oY>kY?nYYXVϞյeudY[-XM7YVÆUeUjY*XVҖUe(`YrYV֬>̡*JβdI-jYJYVUeժeY $ԧU+jβ:v=,woz衄<e dYbYCX;Xֈ5rd-kT˚9Ӳͳ%K,k*Z޲m)Sܵ- m\`YjңCjՖwfϞŽ*qՔАZ:tP}[zjunRj%JXɌ;wnK x2Q,5IR,Rzvʕŋ[J`H8+!/{oe׮]VMZli=#rJ) K <韚XO>RT_Kg)ڵkŋ[2eRz~:Sڿ)?sR9P}ԤfK^]O`YxTgGpS}|eo |O9!UP+j_^J*\R/^{55R=|4ib)CG?B'i)DE-5ASF1uR"cXo>KM>T9\y(shNݧ]KM+;K9m;tC}KrS7b-/UH\7&o�̙3[1~Q?C}_LѾy7ng^}UK9߈j~$@$@$@$@$@"pROٲ[[x֖mg/y5h(a]MBe<6{zoK�)W,&,LۗjԨm9h+q;rmo tw ;H[lNnk�+˜lnX?;> cƌ,+=k;iJ(~,%y6;֭[z}6eH)gZ<` S6 :v9L@K7*/E6%qpÎ[5왱|pbj;1S/X [w|3(^+:*aŰؙ}$@$�]c$@$@B�3`WSBV;v4=v)Cpk'C@c$mgȐA`ơ` ƴMgq)z , 1*< r_)16m/er_R @L%={cbž^hw7nߵ;1bnmJϺG\uѶXa& Ə*ɣLߤi1ȶn&_ؙ~7Kgҹ>{۱הx;~0VvuiC c tPw3?ɲ<}:t(YʌBg-=!*7B #y'wPntuwe Vg(Y0 @|[o$@QE�=D%jDenc    yyc"U%               g#r',}C;;iӊO!u~RCk]dRm"Rs҉\ RuH޼WUNVe2ydQADD9M%re(s9ɘ1(&gҋrਖ਼rV j('hȑ#r*cV(fS=&)qI㢜x^Q%ΤʕSQ(zk)?_q#ߩ&m|8۷o5VS&3K{ۈ-H,A C&/@v-%K~m =} BΜ9̔#{I%*4`5j(}MɀD%1g&'    H YJnD(P 7:л[{ lFm)5(DT(r6~7,ݶũx~WscC|ۣ_++qNཌྷ8Bum@Ϝ9?{=^uzoJqZ(C3lJ]޶>{Z7끮U.;^ 7D_9jς &hx߾}E /L$L<qoS;PIw:D;$qe  h%@zfX/  &_u%-CbN$믿 [r1nHy }VGO87rzLmi<T(vz5jMxQH G&ʶ[Q6o~ϕ+)-)й:adWDX)Ai۶(17n6c'.܇gΑ3 vk[uccV\:}n>}C M6ѣͮTx۷Oڷomf]eK޼."|A~tA $>l{'C8sYwF){zcČ3dɒ%RbE(& Dp+6LDA$@B@ոE E7N"SM!J5 !  V`g"               w<+XDUvV,F K#Fe}Hucmb\߹SLMj859_ce{Zqk۶mSرc%R7رtU oe1@i"^|E2e!ֵ`q"y[j\΀"!r8dh S]N7uB*ϩ-ɵ/ښ\LM9p w_|!p �qOz!)\% � � � � � x@iȑ駟ʎ;VN[o{q%bթn'ڞRz?9iG ?e8D\jĉKs3eBS8bŊiQ=k\o!1Mtɽ$@$"et  "0gܹ?UU*P@tU0k :D!N4m4PB TvA)O`o4gIӦMSRaKҤI#Ç%f1"~or!~I͚5e;wp Nuy(eC5645U05}6uGRCwO?<|EgR#Y&H%.iP䧟DѦF$@1CZ'eJ                    #ZeD-C=fįM`>T֬:w{<]7] F_YDڴIW G$?XO\D?\nFɟ?tAڷoŵ2f.u ]C"Z֭[KٲeM+ezoq>?`0GtܴZp/_> W;  Wy~ٟ:uJfϞ\>;j(\%e� � � � � &�!i7qi RJ lnԨMw+bH,؁ܐM-pV8)*׻ɱM;Rx(<yR͛!~)StS7t&Z\.iӦNi6BJ|r知PBZP ck9>0� � � � � @fd͚5az :T;k!1Y.΀PKҢE -ԓ3giS}/X+W(^e7,]vnjo1b<>{nYxg#Z#WT4 ;V'ɑ#~=64[۷oHK*ŠA'PuG lx(.vu]G7o/"h@"uw!;v|G[pTR%RE1_ TFF ̧\ZԲ9$@UJ:A:7#   ""?/rXJՀ� � � � � � � � � � � � � � � @7UĦB2yKhU4"F@ KT8n{s*Kc d'p/={/J*Uعsv0i$ٰadΜY6m*rvgf͚%<`$GwY;($Mm|َ϶bƍᅲ3gʲeׯ/~     �1V\)ӦMnٲEL3pYAHH @p}޵`wk׮-mڴviQWUNwe/3<}rW7|x<);,EHH " � @j#pEyW@QյV:uR[3ٞT@`ԩZoJSAC G&r"ɥ_|Q{9#ѽ 6>}Ȟ={?ŗk7}t=ITzƍ˒%KvOc8 .?3}et(]t*=kְa"C:<c1'a,y R,u=1%7KjB[o% }1/�ML@}zWcD=b; @,WQ(=P^-H:SP+سd   8!qrL              Ps%I< RF\ʬGzܹ2QNEA*ǜ(u $@)D�1 0pyY)R ̍5%KP=nC9\"<_Qt2X[ʢE}'NH\YfZy KȳHHHHH <xPfϞ-͓ˑ#G$cƌRV--Un]M$@C`ZqŊZ|}[?RD 馛o?ؓ1xRL>|xT6J*ҪU+<xpT֏" C. .IHHJ{{L Z!J5=$0&^mKΝ;k"MIMGBcؘ1cɓһwo-UpQҋ[MF|ڴiYpɒ%K}mۦرc|ZE3JGuK_4:`3<#o4o\)e$N[rqXt~رC^~eG #,^,vm)HFZV옒HHH\�CWHHHHHHHHHHHHHHB"`U,/\9FťLm^0(Zd 7Mrٲe13ĵ~nz4WZU2gox^ 8!�'pd|r[r:uJ;Ψ_#իK4i I$@$@$@$@$M~Gfl9{+^ق`3gh:B$@1Oòn:k!~Qm'P:lР4nX) G (VT)1bD8 {ٲe>ᄚ IH "4 � @x)(^zEE;0`̝;W ܺukX?UR)n@XbrwȠAtұ5 jF1Z۷Oڷo/>K cS=/jÇkBH!HEQ9~\ o߾{I=_{e i&-N d<Cz-)VX\$ E<Q<"Ss% 'rneqb,                   E@͋ӂRFXʾsnҟ=+1+{s3X�Qv@P#2(9]3&8f-O$@@ 5m3(3+.W+ 3׬YSU&*UV4DցH (ڸqvzj=-ZP!�*UHڴ`F&    2S0~z4ZJ +Gnʓ Lʕn+Jɒ%}GG  Gp~ C8֯_ų�bYOVZa&+ )K<{9"OS(8 � � � � C`Qc.Hv0 w9R^%FkS9i*Ѕ ^N53>feҤIZd:E1;  N=lz쩟'}JX&)Q}ug=Zƍ''y˥N:RŘ:qZayA]vKٲeM4.�`gѢEҨQ8&¦� @z"`RHHbUjdIHHH f ǎlXq              "F@҈LAʬIgJ|uhīS2-FmPf$@qK�Cwޭg <&\9sFҨEҥcf8g *hp@$@)IRk˖-1 ~]\rIյd8B` "3� � � � � @8p[N6lؠo>- A @H_%v;v֭[=?ؒ`SؾV*˗/0%-ZE|"xҸqc9t*T(E0O JfD$@$ "}$rB`[uN &KoC9Yި_UJ`۔5qbn@=*_};VVZm{ւ;9s !G&EMT({X{9)eԨQZ@0 EQ\+)d6T.a'Ν;RJZGy 5["^+" &M0A4kL+[ZVj&oo +5kwg}V'HH 'hyg g̋HWQcD.<� � � � �)3$             p#(eħ춽|g&m0ī| Wگ_j᪌}E@M>%DP' \��@�IDAT &pI=X8g6K8DȜ9+WN;g._^Q:h&m p0Gپ}l۶MȮstYI*U<N $@$@$@$@$@$ izw&'mڴru ĵ TRڎsAu E}ʹ={=#矵 qŋر`E �2VZiO?4<"?'xBN:"/ � �] %3" H>$adQҢE[M6bGhԩSo%K5\#;vݻKO\Zqy5ڲ,Y|?^ Al6ƶmj!:u0@ `EdʁΝ;wܡC`nVM&[29so-3gΔ Hn\R/+Wg}{?,ժUKfHRș3Jjp 8#@AO8Bgǔ$@$@$@$�H$@$@$@$@$@$@$@$@$@$@$@$@$@qJ�ҽm{Jq5'1`?4=17nҧKTHHɓ'=B6FA32?; D L޻wvl C0 N}9@61B $@$@$@$@$@$@ @h T;vKcӧO m a19s^ΐk$@$;&hGp"Ͽ^s%K֢46jS8+2'[n˨Q"S@r#UV <2� @h?C � @rXVF w%^u(!e5E>ꫯd\vm-xҼys^:ݡXϟe˖/3f̐-[ʁ KZ{Z~%mk2eݙ@xiӦҬY3X6�֭ c.]*xNvI) d"=(ȑ#DI+W l3 O`͚52i$0aFsܳgOHH v"0� @rV):;$   W8&F"            HF.$Jn=2d $b01" � � $�0ڵK; f8ꫯEjΙ+& $&&&pE9x1&Sΐ_~E9JPЅ#^8sv~\T)^8HHHHHHDȑ#ZX Zx/3~I=y?3 ls&*TH � @�AL#F؍`?:{… {F%J?؋N@iFɣf&1'c<ГH�]DbHH"I�CyJ6lY^Zs$e+W"7ʘx;wؚ5k~Pҍ7(MBNFRJ)32_I/Ul2|Yd;@jذM6B`˂"@Ap]d/oѢErIɛ74nX4h u֕UJ w *W˗O=lR ;˗]d3'I*2_;V9v옔+WNHV~*FzKp$[\N;W#Ma5IRoԪ%}HٲAl @LV觉ZcJ   pE ]ab$            H ߗUNN•_c.w VTɵm/s]6F"  "�A-kp&Y BzOSfl)RD2wqŎ%X!p%U5:$؛)S&-W\9e Yd$@$@$@$@$@$@ƈ ~c֍ &M)P~1f :(Nu] "὎}'Q}t6`؅a7 X!f9dQ![- ,(G}Զ$@$": kE$@$~cukpij q"RFJxDwQCH'EzJ$sfx{m&GDԩSziԬYSe杔1L`2u!9ztqn;WGM:%UQ4-Z+1LV=(A,kC׫H҉'cW.5j<kJ*%jhYF~ٴi8 !T3bǫU+"g{!&O,3f̐]v5\#M6nI *z@y<ϯk16mHJ*֓H EGT86H j PP+SCA1% � � � "01 � � � � � � � � � � � � D�9 Q9 V}@KD{g5i"VvQ)u}2fk}?6@$@$@$@J�g88f8g6<2!'8b/Λ˟?ɓG;t6$�9;vL9:*G?ؾ1L͛2+V) � � � � � @l=vXY|7KNlq̗/]TP @tX^f1#Va]lfd~0K֬Y/y2{li֬YTՍ! 'wDHHbɓ Y2YJGB+H\Ys-,qw-嗢+[ؾ67%tXkFdɒ%`ۂ=y|eU13D?Ç+Z�,ٿHS! 5D%EwIX6~=0f!9w jIP-˒;vg ē۲e_F<_bŊPb�l[͛sigo5q-gRUAH c*�L]'GQP j͚5KΝ+ .?CGoР >y |b %n|ZÇ7߬g[ d0� @4PzZ|㏣6 @<Psj]E7 KD$@$@$@8 w� � � � � � � � � � � � L,^ŧ3LWa~s{|/2bR}݈Sӱ̙/RُZ8  � � � @ 9sF;hsfo1L87jIXf8ĶgA|+{&)$ 1I ?Z'N80!zy)RD iAHHHHHH )l9pfkD؎x_5΋!;`?qaہ3 ;i؏`/B|(mڴ]$Bf؎dbSnVvܸqQU ?@$@N. ~$@$@sxr߾T' g) %Z%JwÆ<ȅ q`N"o#KTrRD $0+PQ *ED@әg3' 0`@ofٝ]fw'i;tMu=[K'J֙ri yй0Y'O?v|ba']Alq >)"}Z=Ƈ~.F - -[n�.ܹvuW7v֨Q $v<v HYlje+[>hs6{-I&gMV\p@Ƃ?5KtT_ ,-@^OK~j׮]e!Z6wJ*%-Yo_ij'ʹ Yz.Y׾c[3P'f5wokPr9n9e獅.l>gJn3@.XzXw �DԊjo@y5 � Pl' � � � � � �@nR>x*B(!#'vs"$=ȕ+u)4vς¶Of|+ � �O)s4nȭ[n~̾cf:ul0֮];xlS b@ָJm;.[,#d ُ]r+dž0:֨QO!� � �d]Zi>9vjb~c!\qX6vѩ)[eY Yx~Oe+V ˈAlp]4_,J9映I>l6z߿;-r@wQr;� P.;u.�ak5k& ZӦI#G& 7 ~z!\?Jϰ ~A@d|Ǯ]kkWѲeK~{5o\Md7|E> O>$7۰1vi m۶.vygYE,->}}e�Z9#~͛C~ժU >[Zh!6m.jy0^~ZB,Ydo`>�Bi3F a,sϕΕ^{-ʝɥx3gԬY-m}oO/Y}߶6V }o^t.\a,sW_}ld%Tf]tn.1ւ@�LxiwodB)#d�Z% *D�@�aRLl� � � � � �dIPhᅦ}Ut>ѺdG{Jzp}J0*^XN~ZغDr@�@�EnxND "izA'̾Sf֬Y3[Qa[l!!݅m/pNcc!2{ ;կ__6J* � � �]WGq#]aAnǮcwD6z ?Z}S[y,/:n9 ~Ocߪ4:;Xzh\tYGz>D5$`@}UG)ƳJSN9%D_.q@ wDv� rk`,{rգulap2ru+)%mdW\!wb/kMuVoN6-:v!6X]Ѷniu\FyC|w믃6 �/FkesX Xwq HAK'?o-rE@\y</ >c,>{lP.ɇ Z3gm .FG?Zؠ냹}YxdS7smٖP3 Ms:߾w>\]&>;lwk G}|^e7~ZѿwF߿e,7Ծ39Է%ߧg۵ko>xrOۼtw1ߙ>]޽쏟G 5_=ʎ� � � � � � � � IphTIv#oq¬*WMEl݇nn ]=ԧX� � & Xvvc#f2Gl:2:qm?dys;^S[|U܅[-:.taJX'=Wpmuhjҏ6ocsd?okעlwڶmFp:CG{. � � � `6Zh&ZcѠhђ%KY>%:X][Mep|N=6'*[-Yn^G?D oϵ:{lߌ^w_?ݬnȖ6ꏬ(eg@N:Oa:ҭX@�@�}³|ˊrAaH;K]Jg-u(n-W_Qzc}6-ctdaN6V`A'6Z}uvo�L:5?5\[HGdM?q~cf|ۘvTApزhﰐ1 =3Z_̓y3OUtr׳)CDV_}}goYcc4h~ $s}nwocSY}{c3nkjw[Mc44g�2<0={瑍v /`bǭZ c9& ew"e~ca=ˇl;nߵmG{7ql_VV-['Sto6?/ogCSwd}Bg=6 vىzM|@ RW}6 � � � � � � � @ b\OW>dco|ewo׿TC^\`U0יXe%6>m[%@�@�@@v4Yf%bFXߏXhj�|7c1Mn.x:lhska7/i[9bDEYG֡M㍶n,&:C4Yl7,։Qn#y:;.+ � � �_)|u8)?DuLئF:V?}Ýn$zh}OǶFcfi ~>c_vўz_7duDm۲c_dA$1xS:p/f/}}c1 iwkWiE]NŢ, � �z |M]F0X:HGN-<e/~ӦeM=!$ K,`F0:ѷu}Y0ydS|݉߇Z}M[ݏy{lGiy[۲:Dׁ_ a!`u [ݻaÆAxM}pՋprgagtܹo\mC.Xe,A�[~h׮]0&*`1¤g 9}qŷf`Fd;Vou|Ѷ~>g*>gM-l[nAq >l }"۷тb{/A?믃?m{{bۿ}/ng!:lWƛc_@W{ jӦMp~a3}x� ͅ3@�:_?J� � � � � � � �l$`7ؠ*)/vYq~yFQ@+&{hT|0mDV˹/e? � � @ X>HN:ZShSp{m_;4{mO[?gαc;g61F?ey[I߬l7yc:Bc@�@�@�@ X]_Jkj2>\qMcu챯Gv|'ɾ'}ݏM=?yys Ze>ǏN'S_x}S[;ʳѣ5k֬A o\NÜ9s]v%EY@�@�(sW?8<5﮵%Ьs-r9G ,æd矃 ׊ ϯgCy,ock6Z^>|}Mc.ةuC, e>rPPjwKr]/8| J P<{vm1gg9ìlh֬\YI? .>?'cgRt}珍Ҙ+e@zrurrSQfJ Q۶m[(i!fC}_-X~f6ߧ׬^:8?{T4~cRܬ  �tF(\'Vb  PqY%@�@�@�@�@�@�@�@�,pxl\|Tqymt6z Jvp&@ )|;fU0ˀ� � � 9s` JG JbR6@�@�@�@|}Oum?sl1cFuGUV2dN<Ġ#rc�ui`w;NŢ, � �/H.[V'͞N͓>ft #u(o/  ucud5<&,#`/~[S⋂P- ҸrsgiL$3i'O_.8!Y�d}sIw%zjР${9jಖ )_ *u*NB_\ Ab] r9ZPu@�t4_!ʇ� � � � � � � �%4e!SATnMvRP+heAUkoj]/*z[nZ  � � � � � � � �/{o9眣#FNvX^`7f;^ϭcL@�@�Qo6 β�O> , 0<k ƿN HO?-=_´8m'\fҺu ӲkW驧ꀤ믗N?= :4}@� N,02G~?(5o9妤'`?OwJ\~D @& X=W;ZQV5r|@�@�@�@�@�@�@�(5k ,ʇ\EW-Z*P+ }RݺV؎I+ɿNl� � � � � � � �d@֭u=k5j(9Rgq.BmN@^^l6F,QGF%( � �L,($ S Բ.9Siǎ1K{yl-<ץMx H< ]}\tErA%Hg%ٽN  �j)P^Xn b@`S:m̘0�KMG�rW´°O8!w8s@ JW!� � � � � � � B`+F)S{otNAU4*vA ïbGñl_臨oc7jkV � � � � � � � �e#ШQ#]>|.7N&LP>}4l0,P' Z`;ehs@�@�T Z%}AAhg믒ݿaCJeu릲+.|PV]1l@ҋ/JcBnE1B.X]bB.L:4Re  ˖IsHW^ge@vpٞWN;H&fQh @ ̙vV ]je � � � � � � �duT0m]tJvjME*ljf7/އTEz;. � � � � � � � �p-<XwL:T::/: 6f,s=Fvi2;? J׃b � �0,Bl=[?_Z6}04뤓iv@Vz҉'ƮqI,@曓{fÆҘ1Ґ!ȑҠAa嗇1 �&0}zxݻڙs$Pdp B_?;n"�7rWKZ: ] H_J׆!� � � � � � �oaXU4¶Y&V<çMB_?1zX{} @�@�@�@�@�@�@�@�TN8`|饗`^ziw;8UG d@ ~97|Sn5j6e  � �-Y><kѢФAC/óv؁s/&_\ipJǖzki颋 NJU]63 �9#0mZ}v9eN4 j֔VE,pp}ʥ  Z* 9+N@�NVpYrB � � � � � � @f XTl=c4wݺbèUh-+K[%ڰ � � � � � � � �$`AZ6zN=zN9]r% ]'Tz\\L 5[lþ28Wݻ8 � � ?8<65 óN;- ƍ7(m[}vqŶ%ಝu]a8&up4f e~@ ,P렃ү\ԪEVqضp LI4K(\O-u,@­X��Z%q@�@�@�@�@�@�@� ς +^UhHV}`TUؠ*aCaeZpUt]z{ldz @�@�@�@�@�@�@�@�@�tر0o:;V#FUW]]׃ RFҥ)Pkz뭷4a„φ � �Dי;7 rɚ=[3'R%u04C;K1?XJ?^ߤ5SW - W:0uUT} �)wYBJ@rje+O9R8Q\9g  @cAZu9ky� jë@@�@�@�@�@�@�@�$,lZ{_fDˣ$;o7B%3؍yT-­Bv6n+6 � � � � � � � � mƍ+BvnftM:4tPN9f@:j͜9ӵ\=zd.� � ?gYhZ@jԐ,,K36m$=^l/K?$~i枟=KCHmʅKW^)իE@�DӧK]{h #bEfRf@߾EI/(~xfR"�(`o=%L �&@ � � � � � � &_qU@d% _ZTl�U4oT~A_^i^^b @�@�@�@�@�@�@�@�@�S.Rש=3f^r!c\ǣ<Z�{O@:jMw6iD͛7Oũ@�@�X 4ˇg}EѨԡtcGE b@,ѣN!/|_i顇åAKW!@qN:wW/3@- e@ Ul NLVL䦀j)-_.ժ5 jC@�@�@�@�@�@�@D:eTT>*vyDEdWNр78ʖY 6\hЫvv,@�@�@�@�@�@�@�@�@�R 38C׿\أ{k׮6lz *.gգGp � �!vgahgY֖[G)?.}Xdj+%]~tmҸqaeYPN@piӤc-|" бhQ&2f@~Ґ!{Trʊ�jےW3 ��ZzP@�@�@�@�@�@�VB| Uqրph {ݺhTEۼݘ]G 6+Ll� � � � � � � � � @*6s׎8`|뭷`>}y<xN9F5c@ ,m]2AK̫V0aB)#� �dJsY'͞-͛'rj6 :pھTz%%n ߖZ̥Ύs:K.D]:pC9 M/.'7ϟ.5˳8Γ~Z߿C @�Lj+Ii,2 jek"� � � � � � P`ڂ* *NUlUQנR0*TZըQr/*X  � � � � � � � � �@nONHj̘1AW\s9'ׯ+g E֌35\!� �߆Yó,?ڵ óvIH/ ;ĉ)1+Sm&O<S:\MK/*W.Ӣp0@ %ӦAݱUV("p,WO:; ZYsJ Pf]Zev@� �?$Mņ � � � � � �UaU4*d�ի>' WB4(z?`@�@�@�@�@�@�@�@�@�@�Rhٲnv]uU0anf5Jz ͛5E K /: o&M]h@�@�x ӂ,B 7v(5m =Ν{--�px+À;8Sv ]ϝLU@l}eN;MZL[C @�LU;6KN@� P+_c@�@�@�@�@�@ ,*ve^6V-phr~;Z(VXZ@�@�@�@�@�@�@�@�@�2PaÆA_u5Vw:( 6uMOfE)PC SN@�@`Cի>0<_~V$ <8ZVzGdǽp6TI:T:Xi@GӥѣڵVL@�6M:.#C YZ+ݚH^#3ϔ{,&LD�]H_-}Ԥ_@ .^ʀ� � � � � � WhxU`hU TЪ 6nSԼB@�@�@�@�@�@�@�@�@�@�M5Z<\]{ΕG5{A,hqSyn*Vu8ŋ룏>ҭZ � �X\, qli|i͚vЬNb@ F,0W\8;{Nzi %so3F >LZDgL+9E @͚ڵa֏^]:0idRe~@ vEPA5@{9cHw| � � � � � @GAUe@uvSaPjx52}V:m~=7K*@�@�@�@�@�@�@�@�@�U //Ow\0N6-:ܺuk :T*Wŧ\Y$`kwr^xUw=QX � � P\*YI)կptEax;H'9)GC5ϥGo? ?^[78W$W=еk&"XlX"/O:hɮ7N>  KNDZ~ʀ� >jkAI@�@�@�@�@�@�rhUt«89+WJ~jvӑJ4+koE_fS[í5ZiY � � � � � � � � � @={Ӎ7ި:K]v >[j*|E`*Vum6"@�(_7p͚YN;v٦TNX_p~ёG@EvƾI³|P.H]GjV!�e(0uӉ2TP) j<Eoli\@�M% =@�T JM� � � � � �X`Z!U>_7\&9>lyQaW*WņXǍрDmi̚?v� � � � � � � � � �@]ӵ^qiȑg .uHO)`f1yyyZk iXr^}U;Ja@�@�!͝ax֜9uvN;Iut睥ڵ{`bN:uU#$'z/ora=|ޜdiyeV)- Ԫ]X@T:J<@ ,@@Uz䑰 A�H啠 � � � � � VINGFG6WTE4ccU_"� � � � � � � � � �Y.иqc=Z#FwܡoV߾}5tPo>80[,^~eYr � �eax{}$P^]]v8# jF@x;H[7+:+,tp$#@-)0tI @ wzDj ,_Y,)OiBe]!�9"ХR۶9rҜ& t/ED�@�@�@�@�@� X !Uyh.޲ /݌ラM& &,Fn)ܟ � � � � � � � � Yt��@�IDAT� �z}6l.$x㍮CիW`+@'|RݺuV[m'� �%apв矇Gb:ȅJ_gmfeQ2@v X'JM,RMd9B;NsO餓䮃Q罶P4V"@ L&ը!k Pf>PkŊ2;$1 !r0$ծ@�'`!ZժIfU<9F�JW@e � � � � � PuR4*po>vۢ V-ڵë⭏.{@�@�@�@�@�@�@�@�@�@�*J*O^xAG~;Z{*V[zdogڵexĂCqy]r% C�@�$jGgSbAYu]VpM:$OF�BSZ-Vf ْU и+u< ի g9"@: L*\r:2!P2{Jdzm!Ph)@� guNai߆ �e/@@ٛsD@�@�@�@�@�2N[pկJBlYab 9f >ʖU.meAV4?'}z g- � � � � � � � � � � tAw N< h:];`bFkiٲeݻw1J̦ � �^%3gy$rem04먣y5"@i cJHnZJ?*TG7DG]3J?W_LC6t:`@ j$P+^δ<[nfӲ Hc.]Ӹ ArE@�@�@�@�@�S`ڍîbCqذǶ5/lR% VS ]86ʯd@�@�@�@�@�@�@�@�@�@�@ vuWM2E-M7j]y8p;<miHBbŊZn][~'|҅:W-Rs� �dw߅u^A…RZa{!{nNRJY a?,}t߸`jeWMN[3&|/@ ̝+l"ǀ@ X*E'ĩn}&M"P+^ �!`LrTZFB"�Y/@VֿĜ  � � � � @ X' [ymzjUgZjW}UE`ЫZ@�@�@�@�@�@�@�@�@�@� f[\OS5qDM0A7xN:$ 2DZ βv?O?SO3(.x � k> 4fϖ. Owmκ ;xg%'@ nV^]3 WOzykϗ~[Sg@�J[`4;B7.>7b @_ECҨQrᄥy$�d@rQu}!�(P1 M@�@�@�@�@�(m% VѠEe<SZe46 4+THtT#� � � � � �x^{M׿s飏>}jᆰVZPr/@�@�@�@�2T{GaÆט1cC~xl=(¸#O:4|p]tEA,䫸 I|ImoZ]~ݬ {||7W_裏Nl� �da`gҊ=ۡtYg@ 0-c|*UK'}x =3ѣsK{Ck3h y:JpYwU:>PzI?uNY`TW +QI/O*# Բ~l(M Ͻ:7=L͑kԼ 7ԑ}W@r@�O@ � � � � �)p++zC|4*vYyE5BZ WE\E+WN @�@�@�@�@�@�(@SŋӲeˊ:;w=rБl J@�@�@�_uY0`~iY՞nݺVGqʢ~pKaÆ;vJM@۲@-֮]t^:Gx'OV6mԮ]W@�B ɲ, ͚=;ZjU&( Ͳ-D}{:g@�5J:Puk驧I&.$ȓ*֖fڴiz\ВKZJaѢEZdlʐ:f͒\Սvn]S�D\I͘!UuS/FEO7*/t+3<m%'Mڴ@Lxo >)1 .aV&2"� @V.ʜ# � � � � &^VD_~ W-PDC*aUE|.W~}$ڇ'*@�@�@�@�@�@�Ho?+A'A'|4*fP  Et@�@�@�6E/ϵz޽{믿ѣG裏V˖-5dȐ ·Jkhܸq뭷Zg}飙3gtt?U\߯н,G}T u~@�Tf>z}:vZ:K18-rP?zKr`7k֬HW_}ՅwJԔ)S|^Yop nmY:m\ԯԳ1dis PRjQ_/,Ub>X 6ntRX'ikz (Z}@lJul Q@�@�@�@�@�W`0,]E-_*9ٍ>*:Vv_6̖sFbs � � � � � �H^zi;keZvt) @�@�@�@�2F|sOGi̘1Aш#tys׭[7VٰaC5i$|-wQ@~R^HvTG *:Էo߲:$A�@�JE`zi‚ W`n00뤓- r_@ F#T Zdk+ aZ/SgjԐ~ZBriHS~v�9.0m\vm?h2-Pk +4H >\,)Ļ=u��{}uWLf@�(_ן#� � � � �)`hЕ>~ٚ5Vd _-OV[mU~]^|ժ@�@�@�@�@�@�J"h„ nB_n3QcN?tm6kuz_Vu5:kw:ݍ֡Ë/[ƍ-ܢyi]v]tAr."^:Xf2DӧOc{N?{x =矃2~ի/z`oթSXj_  � � � (vqGu]꫃nI_N;4 <XM6Mhf͂zJQ>w?Wn-X@zN</`&>Pkݺu)oa;<y:w-Z@�@�p?ߡ7 Ϛ3G72JmY`N: �e `?"Yos=7ikrq|ٳgvڞ,]TӃ?Z'pͶA6+\y=zֻd@nؽyk1cFpjժv6p{le֦:`_|h֬Yuv.QFv?~yy7K-[J\ 9^W#UP s L*!_QV/HMq'`+V9r´nc@[]o'~(m}k�{u=:6cǎU׮]ֶk�b@�>hXߺm:@� P,9 � � � � # |xUt\e~nzH4X[H5knreAX66jT<^8V2{ld@�@�@�@�@�@�@ ct V+]߮g}V{챇8Y!ugm6vs :5lذcÇ렃 #^ ך4iR1,dF`:NXO>dg(Cu-CN,\ˆz+?v nlka]>PkĈ}AgB{ァs v? � � � @ P#eSV[mc]r%A՝M8QsLPgA͇gy5j|Awy5Z[o::iցNIEdž>PCbXjUP7{W8 � P"~*Κ=[{\d_ҝwóApVvR*%:OB�,ukv%YHŋ) /v ޷o dG =˥^\ tIAX'|ھL2E{wX+UVN`}augqF65guVОgȐ!u).g4m4=c!} ¿,DX8ܹsewpk} /^zI*ݏӍ\Չ7 \zϛX�ﴯ.>m<:"L'?[oIRlp_}uewXgl2\mƻֶk�[޶z`¾\D_I@ ֩#DV"%#�e'2ɑ@�@�Vͩd@�@�2/V6M4~M];f7.T]Eìml] qY� � � � � � ^_a�yA@nmpֹ۲eK͛7O+W:y~| 7x{:??:(խ[7\UnԨQ x˖Mu_ُe]}պ-:z=ꫯ԰a DEZpjժek׮A'Dk֬u(k7-[gAuQvu I&<;Y0 � � � d)Y7T- oJp? m~6mh̙AmtM Syx@:k/}ײ| :r05@ ["[^I#ג 0B|x֒%9̄Y~~W (9#@QׅPɅWuTn'²h C5c {Ag= :w]~f.e= m}smXu)J65& PςcrX7,+k&xlYvoZl{lڴi0C\}`dOB$JG!YO$ܘ Xf۶҄ b9)r҂~m|ihh=%.@r֮og޶6?)GX[Pn5=\L>]={ ~~ᇠ`5kL5\�Iۉ iw ᅲWPr_`!P۲) � � � � 1VaW+V$ClY  rYEv.odZ  � � � � � � Pr?uPЩӲY[,:ud?hz0yW+[hZ�lúu\D-,xjժyr,!yȑ9I<CeϫRMv-蔨%B;0u!XCeݻw[P˗/c@�@�@�Dl@o=ZtڵkԟO*U?߳>u|DVoWV-اuRju6n:~wJ_^֬YSsGzY߉c � � � Ίg-[kڼy~bB,@Q#@�\6t.ɓ',x P˯׮X 6o×_~LaƱmj3}뮻޲656<A@^^sZ[bX{f͚.'_uUH v?~L ؟sq H.̵s-K@�M C vAyk}'?ɤo.\I%,Vr{},vʔ)Esw `/5@^vX_C*lWs ख़"@22@�@@4x( � � � �H7w0hVhUDLZ\«,+le,�+|eX@�@�@�@�@�@�KraRwKgvUSN\dM}vCr0b <88:xg}V|IP z{o`>;NӧO: Np  ,p;4#� � � �/@On~׍7ިO?]Ç矯3<3+!";jbmò صkצvq?ўwg-@�@� 4g\8@Axܹa+[kut`SW�&`|t5rgԩSbkSup֦Ɔdڬ$jScϷk ԲFnݺ魷O?XGѐ{^t2s=A8][֭ުN8!hc'? ojdK/Iߖ @aIgYz5?ifj}u!e%`J˗˅~' !m} T E]6t2%j[jA�vU]BMEi(]Jח#� � � � ׇ!X>*/Ы|c FfU` +?uWdxS r_@�@�@�@�@�@�@ 6nL_~,Y.l7no˒7c7_wŽnw86r gyFwyfΜZn喠S*]NBL<@ 2D/= dʸHk7(jj,ZH͚5`@�@�@�@�LgzPGk?Y>#Gjܸqꪫz:+u[38C_Ə_m) TzUjU}ѥxF@�rMev ³li\²v~7óڴ0&׼8_( $O nݺ`믿V:KIlJENԹsg=c:#\?e׊\p/vܩn¹/BM4I'|zk5j(xΦ{]h͒f\,'&-Ge8mHV`*7gTviHO&7)UFVVRΣ |R߿NU{!܉vmZ\ �E첋dU'gK^ƬF�(U wv� � � � �i)`[MwFO?-wctuI^*{tIRa.]w9 UKP֭/wacJ/Zl)!4l܍Ҕ) /Ho!͙#r\ᅲ>4?>|?!+w#l/w_:;5lW'L+- ) � � � � � �):@uq?Vsww!Xj7Z':阵EzG]'h}$#,ь`YM7ݤo.[ Up9~q~gr-[,?3Wo'/13 � � � @f Pra̘1A=%\z(?Sݽ bfw}|&@Ea ũ-iYu?c!� @n O<!]~yxo6H H?bEx#H|"s<by+m0 (O[$״$?zMm_ENWYI1TYX ۷. µ,Xk: -"<d5lP|wPzꩧv?<W6o.M&fI+W"8e([oRJ>hIӪV ˽  gjז:H<YB=L6Q:.uS'�A` �@.�G�@�@�@�@�\̠6o8Ӌ/JրB\kJi`˩>}CjN#B,`U+s0,#]Ahs~L. = "۱ Vvɒpk~+O/K7 !]ptir7J86,oӦRݺ_[!� � � � � � @@F{ndذG:ٵcmz뭃)8{_|2MŃ Rt?Z0^{t~uL?`B :3}X=nӦsOլYSn̯,l„ ֮]}רQC?�;8pﯱc@�@�@�@ Sŋ_3gtO!awƍua; ˗/+`A e#;w/@_g)R6'Q@�@ \̑?7G:Gw;O.E[髯g& jBwf ! Lp'*K,OX"_Ë"L ֦Ɔ^N6ƷS[mSciRXۇiժU;8[$ ٲolCl[7eʔ|+aB~'O?ԩg7kOeCq {!//O??iAdѿV΢T2Bw?MEƻԖE Qz M `" P/%@�@�W[@@d@�@�M~n,Zg62¦ Z[u&ױcUg� � � � � � �%Pv5iV#G駟.gϞzgt 'hĈL4)Xf^xaQޫ׫K.zuu_SOo» qƩJ*:0+넨e˖,+Ktoz,_?>Cz뭷t5@k�m [e76?z_w}Z]vv}c9FK. ['CV^`@�@�@�@�2YZs=ѣGkƌu]5l0}A'YޞwqGY}u=dyAENNOcZJ~~{IٻԩS)%zO>Ԏ@�ؙ.`[x{ԼyaUJmJ;J:0L?oʏ�!v\[i%S&MP駟V>}\j7G>viIsmVW]u &%><hrg/66DmVwT+uxߺu -oӦ xU5?1kccVu`[ֆ^N xۮƌX{D~Uof/`^fZI/ `V}3zO? 9"k/iZ}`^33L(& \),)^:\m {oƏ{\boQm/^ݺc'['NT 6ܔkQFs 5@/k{ ͝[ĆF�;aYOaO@�(e20G�@�JYB|Ut!X~au�, Š]V6ec@�@�@�@�@�@�@�Kw<w[N~~q=wY>?t[nUE>(lh\c7cׯ_?Z׫otΛ06 ̪z?:g-yԯc� � � �d�??ѹYfZO<,h-k7n| ,YDM6̙3եKR)uظq㠣#F1) PwQޯ�o)Ͳ�- ϲMS b)Y.U+fQNEN>YZPjlC y tdYb7vONͮ-|8æYp6XY+Uv6+bf }WAxv?1_/\x4y2a P+ rQ;iq!(pIn3[g'}Gɪd2@\x#,lQm3.\d-ED \޸/I BpJUr;� �$%@ä@�Hka!Wh/Ǯ/5װf㢹>6 Š >N4oAX  � � � � � � �vG@�@�@�@�_9͏3Fw_5p @As9XҥKaWow}Rxַo_-^XM4)cS@_neAYeY><lpY2Y~c@�ygMiҤХlzwթS7` )6- :liܸ4vCV& ԫ\ᮺu Z.$1X`)af¹<taVӦPbʈ�Eraa)\]'I @*9uŒ?g"� � � � P:> 7 Ê}Cl ²ǿl+KpC^5㯏>ǶP-@�@�@�@�@�@�@�@�@�@�@�@�hѢ&NJ&LЭ.Yd:S4x`l2} %X1g͚5pwꠃ"LԄ1 �+jYyyҎ;YChխ[e @*^xA3Gz{[d=BYf7`))SzA?{'E}M/RUEHSDP-Qw؃$FXb+{l1jB좂 b=/{w[^x ;.;;ߙC3Ҍ :u* ?/^\P `׽pԠAz]vq}WY 6iR!\!5ׇ5@�U@|}h7 � � � Wx;a°6, Wi#u*eae=� � � � � � � PߨZn,wӐ!C*j^� � � �Լ�?~Yguտo͘1#7,k:\vet6@zGpG}g}V=X%s@�Q+;,ˡY3N'Mٸih֑G=FqMi3 z+vMٳ@I,(<Epa<P2E:42Z3 �+8P|d|%X-*vw]p.{kcǎٛ!sB�7 a@�< P+<� � � �T%i O eM=҃c -W83y߷I}@�@�@�@�@�@�@�2ڷT[|ۙݻwϼm@�@�@�@ YEO?|7.r&L7|e˖sg}7TŪUO_Gu붒ԭY*nViF{g̝Y"� @U |E'[Jv] ?Իwz sU"�kI/ 6 0@<ʟ_BP܂!k ]0:`W.]6kf�y.Fo)7+СC5} 7wb 4@v lg- I)5jlٝ!sC�pOj @^ oG�@�@�@�~*tC~5kVIV *=|9 tk` 8mzcV_π� � � � � � � @uh:t<:2@�@�@�@�[/򗿔aiPm|ᡈ0u)p85h ܮFz%K[xq֗0T+;u'NFf"� %_/;Zq:cFM6I9&:<+e2 �E-pR~+gҌ<2 P!Z'K4fz%  ђÊop_*74V;kz9!<k=E�jFZW]%͟/5n\3m` @ U�@�@�@�rR`޼ ,bebe.+0k4It9m̿P-$gF!� � � � � � � � � � � �TNvڡd8qb(uN9]tE:uI'/aViѢEY_>oVw\ @�@r HᄏbxָqiRw3EGyC{LzB^K-_ח~XG:hGuMh7dS`({wUlΕy!z P+uҥvixB W!@> xv}lkB@� rw@�@�@�rX`2 1+ceNj0 5xWna0� � � � � � � � � � � � @ tUwq?hĈ+uיgm`k1PkY_[n%q쩍6(f � zkw) zm!0.LڴԳ 'HrXt|s @ &u _-}I;(]}tY^Z�U/@~9,\j;R|R߾K @E6Tj\r6Z @vʎ#sA�@�@�@�p(̙i0V`UMt(jI͚bŠ6mn$ߏeN 8?!� � � � � � � � � � � � @v6`]qonM^{n <XsNv U.PEeu9&MҨP'| �-iQh訧Sm: w_w`|=6 @R_oj׮ky6)пK'mm:VY䎀8+]zi PjU0_@>Rǎ=:+�X}>5୷@�)jJ"� � � @ C)b(ʦɊC7/ aWl"`a_ִE N>7!� � � � � � � � � � � � M6YgN;M zkwNvu5;/]@zx=Bw0ZԱ{Tu<@�V-M{f,_rѓN* r @vBYG:̏ P+tiN&U4�*+l}v!}hQ(!H*]}5k@= X{@&ԪI}� � � �3' ےЫ`Uz@ZkWk]զԽ+k0ڵKύ � � � � � � � � � � � � Pv:<TySO%ZzktA[.~(EgϞKBP@�*%0o4n\}WGA[44kРt~2JQ"@\/|4dH=\$jPw!d:`sX4ԐQB5�@ ĺeKY$peI?/#, �G&R8|̀� PU,@�@�@�sʼ]?�|90̿@�@�@�@�@�@�@�@�@�@�@�@�@�/ -oaÆ裏\3<S'pBhRU d;PkȑZl9U.?"� @;Yq:ytn;Sb]PTD[ @kotR, ֭ G{l̕y @> <bڊ @M̀@ t$9{Ԫ7#@^ -4qbW @U�o"� � � @M 8*_9 +e=ò<]p@Ov:딄co_r;o9ӊW#@�@�@�@�@�@�@�@�@�@�@�@�@�*g 5\.HC O駟 6ؠs��@�IDATj\Ds[ ^|E <Xix:#1 � .%Y!;4 imڤYN]DtMVw@�X7JjJ#FaZ͚Uq=Y#O&M g!#3fH<lYڨiӤ ar4jR̀@M rtҟ,կdTcZֱl@ :w6g޳gn � @V1ˬ# � � �X I*=aY=3n$ rUw/XrV<9 � � � � � � � r{nſ}ZV|åW|{ � � � �-@On?޺vk%\nI]wj:#>luҥ؉*իTև~;,?sukњ<y}J"� P( J'@y'+q_ݩԫN &zҐ!/ҬYgzrq /n-X{ U!Uv/TuHZ^-kUVK_3G.:(/ @*P7$lEڏ~Ѩ �T�Z-@�@�@�@U1+>g惯rOrt px _q>C�@�@�@�@�@�@�@�RE ;n.9jz/[;@�@�@�@�r_hԲePB7 5rH^(ṡ8,a+9qŋ+2}k$T뢋.z뭧N]vx �,,e,O'L|-zFRih֡Sm8ט#�+嗒8 a /Yk(z5!<LqV%zTcs8M7]H&4pԺ=,5p֨QC:;֍u@�Jw4P|@�V.@m  � � �9!bN}'}M::�˷cV~2�ƒ;g36 � � � � � � � K.дOϗl6$Qn#� � � ��?.(РAp :kذa0`@(9~ᚭPAaZhjW Be%ܹs`}:cΝ;~@�{%. ?|%B�hzۛ:u~Y@h=tJˇ\?ӤVҿ/$ E7ߤM>wMױ93}%w۷oN<BN~/x" o^@�U f=ߛq{WW@�l -I� � � @9|oKbPVNe~n�^@9'i.%Xز%' i � � � � � � � g>XNe7:( � � � @n +[V&+k <Xn:,}jԨQ/D bU믿3ky5rH Կ̧q@�pɓKy' 5ڵ\:Hmo� }b& aҕW*;Kg-mI'-/N믗" 94`(dȊZu;J[G|._^/￯e@>gGR j{C@�@�@�D'}';8S?'9^; :ImWW3E�@�@�@�@�@�@�@�80Vs5BZ@�@�@�@�<'O8lzCd >< ԺuꩧSNѺ뮋TuC%EU?@Uq~O>dnFVi!#�?JǧY18kXi޼|ihy畄glkkA{@�!@ #?K6vZz.]N IZk|i9D�l+woRz+AbVfBX/!6L>i=WVV-D�[GqU,]@b � � �e C5mZC,)9 kXݺI;쐆eq?~n:% � � � � � � � @O曟m? � � � ��?>U l5tPp tWco~$isn/뗿Ꞛ*�_|@-ϧv4>#tWd<@�*5KrXohM$9$š[l!%}tս԰a7 �@^0laZE 9+pei?Ǘ^ͤa P j<βBoTbּCYҿ/U':Ȑ@K;ZPL@�5 Pk  � � @̝+9 'eev萬ٳW\&MJվԯ_-ŀ,mu ZQ{ � � � � � � � @ "#T(@P` Q@�@�@�@�X<~hO 9T߮kFr s9G[mO^p_[rH| ׯt@ԩ_wqjժ8 �U.gi)SzugtixVL WyX� @N \_u\W@. vy)Kg!l˭m P .\U. &2dǹ@ UlH.=D?- @ wj�(6g}@�@�@�4 +dy,?6~Z808[~<N7.y-@�@�@�@�@�@�@�@�rOci|zCˀ� � � � H"8\viOC=aÆ_~~`=CFfp܈#tRva!\\w1d@z*518L˦B I8f@�@,>@Y*lM7Mó?>-ma54E �䕀kjb鷿]3!IBx#Ϗ6JXkx5,[W'n@B�B?5"_*#9}i E�RZ_M @^ oG�@�@� SgΔ*}bWǾ~E-֭KpPbpo ;W � � � � � � � }JۧQ^R � � � �*CO;pA=\{k׮:쳓o׼y, {Z`AU ԲˬY~Qn]Ipo3 � Paq~׵M>ix p6kV-a �&*e .9eWC 6:Kӟҩ1 @ ֗Æ3y>RFjN׎@B~s{'P-7c26 @/3uE@8çY � � |o/L4eZA4 k i X s@�@�@�@�@�@�@�@�Sਣ//9~xqZ � � � @! sS 8PǏJ'x N;M7pCF/tzf rϟoe<\7+5#T0+m�mV?Lƀ� @6\4wJ³ix&SOկBݺ)ld� PejKW^Y"s! s=|to[kʺ!P< c"`\D`Q4@�|+m sv"�/@V � � 3gAY_|NG?擳xqIs}2Cv%oٲ5B�@�@�@�@�@�@�@�@`e*]vY_6޻>@�@�@�@�[~h}w;StGPsт tE}2ZӦM[aջwo=jԨ  �2e,g}yj_65otꢚm&Q<@<volv椓j@~  'HtRz~Z�?pVPLn%z֮]Z/~!]z4ttin!� ߴ>@V.I@bzYW@�@�@aX'zo+4\o|hXpÒq/>@ndK� � � � � � � �  t(!nZHh%j1 � � � ��?>hӦ ^!vt%U /b͛7OW\qEgϬL_|յkW=3Zk? @�V&x4i,ŌSK:YR+#� =JEIG-xcϜ5SOZzACsu**UtR> G b0 В^]z\hm@�rU Ojh Pj:!� � �X0 4,+NcpӦ)\d'Up N2v.[zY�� � � � � � � � @:J:̙ � � � @ So f{Ncǎ]R?i1bjժAV`ZROF\XA�ܹҸq%Y?^GAѻ8Ӟ=&MLJ5E�-j-Zi9\rl l~uMW@M bo6\袚j Ef2klKX:' 2EZ > |\3 @ʶ(C�@�@�rDξZ:59ӃnrDht0sXH:@�@�@�@�@�@�@�@�rVsΑZv)gI@�@�@�@�*)@O%xY  ŋWBn! պ[UvU>?@yUӦMK߶m[=Zgu*z� PށYq|%_c҅k Z!�+z1.n;Lwmh98di4a  I J Jw-կBXUΚ̅"]ͥ', PhԺ* mX@ 7( B�@�@�V+tcK֭p 68=St9aj<@�@�@�@�@�@�@�@.k֬Ywiٚ3gN2s熋p$^=]ոdn\ln5? 'Ϭjt!FbCظqǿ5mT͚5[all2w@�@�@�@� 8/g*ǩ¨! #͜93f-{&9 4gˡ;CN Bբ_k/i.rB*_V5g!PǏ3<S?vȑI]wݕ?CG>[z 'cm?5*f|fn۞91ײF7}?_' CяžZK'4i|3 �䎀F>8 rhV ꫴwos@K'W|,x9z~1ߒy5:3s};̛RL=w\R'&>!ıW1>}T4yG~_" VKd侀O3}zg5v?/niwqǼ}ܞ]z{}k˷oޞeenǼ۷>دWzcy~ s^,?*B7=}}ҷw_1dޏeMyҥ{6ݣ6{ /{>>c:qJKM~Kԯc@�!@sX'1O� jV_@�@�@�ǣO>L)cִi%Msek'u*{<ip�B�@�@�@�@�@�@�@�@`M\Py믿ִp"K~71cԷ]8\/u8U͓х 2/nu 6 y,o/-7 :CpQ 8wm}e(="_kVZ%]9믿6pä@Cyp@�@�@�(4L0!|4i⋤>?(w J\(-`!�|\D.ryI8k̘1Ipb.\et%b@ Wz's__9\{GƍӞ{gaY:]we D].8[W3o6s۸^oǿ?fm>X($cqxۅ%}^OXt+}Yp!̾i逿:C`y(@z1ǐ 1RǎiA3L @�rL$_gN[zW_W0dx%i4EĢq8XT~e$}#@ê Y< 2v,}.sc|;DScذ>Q}$w€8H[+H<@>};9;6@OK6=-yُ2򼍋}xXz}UdvmtQmknZa[m<mYqmmb^6-oϏjz~=ob^ط؅߳0乀{<5wV&l}w}ڙc|]#j睇 v-/yW6]{o>M.qs U.=g޷1;`X#@u ?2zgue!� �.peIӧz Pa_C_2ЇѡY}?W@�@�@�@�@�@�@�@�Ȋ |+SNM ȱG?'8RZoI1Pb L}iUqP4?2S,ͥ/.x"qtq$B߶i&7h#m6)b}63 � � � �""hcC^{m$ӹsVmY8bm*lr(ɓ''_rwT޽zKE�~EO3G?GO=~IBznݺ%?[z3 Ǣ.Œ4qT]}.p1̼] #K.t=~i[n,=#�(z\R%rk{SգGIhV[ʆ!�dW>?"+}xSbFSO2/.eM\dޟ_oopAH⠀F?2O=<҃|>Q %S{(N㾒>Q #GRSOIZX 7zڸ(ṟ.'o_&\òJ@{;,3Cmoc]i ЪH{uWaշTo{,땞zUO/*;7qGoܿ91 Cq Sځ.mUq[vܟܗ0ޏ2>Qz1̗F|,;>߾vqk}ߎ.x\S?q[q.qş(,- ֋A�]a?QzyivY6B � � KGhx.&}ˏc  � � � � � � � �dMzH￟L? 'Oq1+b�gbm" XDL}hśAe-=ztR9^h8hqԩ<~u_(]u9 � � � P|cz3τ'\zPIhРAI0UllLCv6 ky,=,Y$3fL(dz2u]IMy睵.$k :?_>u?ǯ*hcfVBmӕ.}vye^gNt?Gۮ"˱f,ЙYӏw_,r]n}1S.@�|$0+gyk,'zRm&}v`|^cڎ�䮀*coK]|]v[ 'ȼϗ`(0-/ct(ޟ _b8Aq}&Hfq}tCpzTG /P++@̤Js^<o+s9{wظs_1 ՝%1Ś vGoiBHc=x[պuSsr}Pu2S_]a|Wߓ9x@!.= 6Լ|ߛdcp`?Cwq&s۾^Kmk3,q}-|<%x1S@Ϟر>Z�@3 � �T7J]&>S(Pf} 9%{ P!Ҧ*IGߎo-PYV @�@�@�@�@�@�@�@`M&B}'NLz޾p67|p.˦&v1 o;P2OCqC7.Ѿ}{uUݺuKF_UQ4k+@�@�@�@P+?,X;OҥK;Cg}6 {饗?$0￿.ܗ7eʔҚ;w@y,©wbz.5g,\� :+uq>s)j1ErEG\~n)3<+_[ IaM@�, 8(17RÉ}_sM\0,YE<p-T7&1xKmۖ,v M 9 6-t*n y 8w9z.&T]>;dD)o/n۫81g+y[s{dO% k뭷~\o{-q&x[ ,XP.>?CL|,8\>Vџ x?nJsq%soF̀�5+puС k,K t5ߡKo_mU�G�@� D K(\" iJp<2Bmp1=XV!A`@�@�@�@�@�@�@�@�@\@7Ԙ1cB.agfN\rA;[:$F1 ̙3' r֤Ivgܹs(.+rKGM4z[! � � �رcuwꡇJԹ{~%,̣G?9l:c"f[p}х<@0F.pGZjU2Sn!. AnZ eиqcm.zux.Ȁ�%+.BfƏOq8@@n]c[i!sez/X@߂ 1,Ŀ];7ԩS' fS6'"IW8} -P ԣ栮8sTx3ythZkʴBdk }5Ԉ*X,ZUYzɓ'/OogϞ|}1hӸ-t_Ͻd@*-Zl|1͟e=o<ml y;V; 9)څV޶mEN61'c0q?SxS j޼T{އjrMǞS<zPzf;Q74klK܏|<@j^xA\;U,�#@VK*o+@�@�r j,OB�͟f:3IxVcd( <@�@�@�@�@�@�@�@�pp^~d|7dqpRϞ=qpյ/]v7%Ԙ8`k\>z-͜93y]م%S.� � � @<oYJr衇&AZ=zțvC]}s>>}*:餓{|X=su~.Z7a„>7%rkf:v1 Ѯ"1uQ~kдipllYݺu[>1"а#P.fR8Y2:<쇯HvpV OJ6cE@\H޿{.;Ͽ\l;dN]hޡZ _L>}yPI ,! ݉Xo}~{c -X}}bBN<Q2YK"Pkͅ.{%̹ΣpoУC<u0 ToϿ*aZl>>'ǖ$W[]wߕwh|\q_&~;|Μ9I's2qg4iRYõ~KCPmA�:XsY{m' Y1(*>Uy;^� �K&N0,WxE.>4~|:NpQ4e aRz  1Nґ" � � � � � � � @ 8,^?\ofm[o߾jݺu E檀'3F]7L>;-ZPCW^D7v!� � � P.8b]wu;wo?W .~,ZH=nV?I{:T*ew]~| -.5TGcln|.&/hi,D=1\xg%iԨQճgϤ/-؂EyԠ@U׻ׄ^C|,hxTwE�(3F!:ؿjժ6( qhG j3 @fϞBXVѡ[-'/7hӦM3%p ҳϖy$6!7n\2m[x;C}wq{HAo]r?}>؃[=Buح[7zUkX胿)xџװa$'~w;1B13 =iw})V_(Km[䓥/<�T@+@�@�J T l/Ch±$$kX i8?EKY ‰)%pnXU4P( � � � � � � � @ SO=~Z/BrQ/0`@2nvN~qa$+b]X^|E=ZӧOOvygmݴw<@�@�@� H`̙kt'ۧvN=TjժֲVŅʮ*qZwuuyN 2… ,{t 8.YD͚5[^LaA.,Brkvn4V PsIHu,Ze:؄SoǾ}j֪V8X@]d(f98+gz@Oó6pU-o �e ㏚0a a!5mڴ-ZHBb`qyg,QC >E0XiU)ľxI&oPqȴXw)JUmCz뭰v2u7۾ݻ' BQh4ud{ߙǏOFϛ7/ߖC v>}M6 ! mBBhT,g@Rd;wn*�;;�D?y5Ʊ˔)S>Sap]KPVp [j\`&J@ʿjUގW"� � ZOB-Rp%=7.l1dBGE,4WǎgdžG�@�@�@�@�@�@�@�rF[p>裤PN;$ytpq?ER{}']@�@�@� [Ŵn :TuYgSN9EMW_%Z7|s?Ix K/_~YJ?$K,/n߾=H\1cg}l?\hg?v[mvj۶m@e],XP8V?gWO!lRvسB(eN>B�rZ! !B:,A!!믿~NC iOa%&j׮u\T~VOM0KB\éu߿|gCskcC0o [jsCf@�5pЖ"`9,m6z뭓z0~s/|"9ot0sպudƁq_kL"Xt??l ̜93q] \t֬Yo.18:|  ]pJ P.T*@�@� T-9!PKJ&IpP%}"nE+'zt; � � � � � � � �$uO\t^{V[mEA[\dz'`7_馛()V@�@�@�x=\u '&N%\.**Z?\{^.[&TҘ\mԨQrpG .T (+_//~ꫯ_׼yk;*wi'i& fn Jջ[0ó_ZD!!FYfS__?\π� Pq)S$a %,\PmQB<e⾼\p(J}QrN ;KyfϷG1PJ:^HO+pϓ ηO4-젤7x#`-Z P0`@='4c:}M>Heс;NСC/¸7  ~8�Ǽ뇎a.땥TR I% yE'@Vr*o+@�@�r r̈́'!@EzeW(hQEb i- SN� � � � � � � � |FKSNնn8@ Rvr||AM0!>hqZwuHUE�@�@�@C믿^;w.́5r)" 1B{l0t$'O?lРAR==:@QF¬y"xȢ<Xw}xivKFl�#T@f Z&f�6Ss1g@\t/&g}tf`H֭ C�2KVp \Vۇ`^loݥV <|XSO?F%8,ˁ<أGծ];E@qL<9{9 TrޤIԬY3y;;'|:u*5\[ci4| gWe/8q _q_ƿQZuׯ_2n ?lٲ@ E9즛n6aǐH(jno%6a?F;6\uKb P(jU$Pv@�(@ zOB�D'߆s)? Фe:MpnX2c*)\€� � � � � � � � @ , ';\ }c8]}=Pm&9~pw 5)|:x`z � � � @~ |*utAIÇ׿u~@v…KtW#7߬ |$<?⍻kREŀ�#1c$ypCE}W/Դii0-A B]rmóFL_k-c;i@VC_?W#�9"0k֬d?ſu<N:5)$џI`EkV#@ >$䥗^J,XvIKXҦMkx5  iUyP 7Ty>G! ? ̏#3pd\j~SXY6mZ%kʽ{'֭[7K-y;_Jϝu9sf~駟_|n;Ni Ը7nyآEc7n\mTK^K` PhjU%Pv@�z[��@�IDAT(�ZbI(Kѳϖ~p@,=* 'q2.@�@�@�@�@�@�@�@�XdO{ァAOLCP()OZ,-ZH?np׳E\@�@�@�r_>Hk׮~X[lE7ZSOCQ.]>uY֮VŅF{7:Qc=BI UϜȾٳ."^{|?.x7g)0wBR%hy:~|Zْ뭧<)]uଞ=&M ӂB�jB࣏> .iЯC[hqsB6tӚhD�pAzxtg}>}$}!&xE4<t BRٷ^y=z衇 II]ϰ#y:r_`v_W҇VHot&azuItw 4\ѣGkN;/]v5F�%0qd;k <.CUg}q=wV3 P@%m7+ hX2*OKVx% � P.ēT୷'H7HU8pbsBn~6Xm@�@�@�@�@�@�@�@P\ bȐ!ϓ38Cm۶-c=EiIh\~tW � � � @ pVs(5 .(֪UlMn/}wqnvM>=)=x oƍs%ࢊ̋]d# ']k< bY1<+ԬN0$0{No-H] -!4f RА-Rf@�Bz+y"lrC>d,}'dž<1ԩSUW< !Pv_O>IB% &Y'@̙3GO>yTf͒~>~&}t?;W_%2{^Ї;f_f@! ,\0gLr!͛nE"ej >E¬&�Z#Pv@�(�ZbIE"l*.=FIjٲH0XM@�@�@�@�@�@�@�@�0a~_'z:([8+%Zxm � � � @ L:Ul:v]kruu JX3W]uU{: pb+9R<vi'}IQ]iV R&K³�/LئM8o_j&K]xE@n-ү_?@_ٗpE@� |zkw߉C�BfV(ЯbkρZ1bDtGku75@� ̛7/|T_ g8kKg)yV]ҥK[o596سgXsVW;X;Jɿ _J?ϊkaäk"W#@5 Uyڕ)D�@�@�'0iBA m[) H/VU>M� � � � � � � � /zk֤p򌋾j*MXc:$^}UM2E]tIµx�@�@�@�"}W뭷^R𦬰L6h#=ӡ:ꨣh^Cj{쑄խ[W^{5x≄iͺ  &]K!@(4 Ӱ!J;;2v EENC~7H.29HCJRh* ; k.)$>)guaZVN 8=SPZmB9眓7JȤI}Thk?}:g7ߔ; ʟ"Pm>ua~aN:鮻Ғ%K-4,X@76Ls6|ƌs=0yX OW^l||ǀwuWGQnp@Rȇ̙. jC@�@�cŋ:'].R`E<9= t@�@�@�@�@�@�@�@�J ̚5+oIУ>M6٤Գ@a lVz5d{IEJv � � �矯O?T<򈚹,CN9ѦjČ3`1u|SE^G)S$_ L?zzq~ `gϖFNJz}ӦS +IW^"͙#M(sB(. E �U@�@`޼yK'^{mş;vk@@6`$DkbC%pѴi m4`V*V,m>d7|�GB?&ǩN=T]x޽{E48X|uɡr."M:UW]uUb^Dܬ*䨀W9d_szs4 atʿ �U#@Vո2W@�@�VuO±nu sL: &)HI-+� � � � � � � � P_~v[}3f:jY^xAosXlYr!!,2{СCyڵkϖ?{hy4@�@�@�Bp믿^\s {c_|EvaI!أ:JoO9!bȑI!cr߫l:묳ba_,Ao]B.vm5YoB{wRd]'2K?;j²4']ڟ;-0w$|%ZlYޗYg]~zժU+ŀ@. |)|vLoB }]vB!ci;H-:<?I'Il#5nkH@�{ z)=z5x`խ[7gV~av{9RцlszjܬʪRXW~6LK.,suaPӧT 1 C&\;\w A$_oY}N5ow'C8tvq<yrrƿ'we('Usϩ[n馛t7jر!X5l0'=hԚ 憥_Ǿ&||O>)5~Ǵ9}ɶOs9(|hFqw͇F@ #� � s>kW NO %'\ci � � � � � � � �Y5kvyP o>Ks^lL;3)"gg.25T݆ZjeoU<'z4i\HͶes^zK/?֠Adɒ"� � � @.WbPkIqKnm }/^/ lq!/O?)[ز*/Xëb9= /0)y饗gM=tgΜ)|'4o޼jk٣^7T5so0=Tw?wK={~ X|ɂ/<o>Cļ ԤJ>@w__ PTVi"#G>Tr~ڨ TIuZl@� wՁ! +ɹ Sӿk}z8sfuX~Cyק(oZ7Wl{MUoeի$ ڿ\=?_wVAg;__]r5Cd~dc _Y߿e9UߴvX69|`#d{X1nOEרQ# 2$uX[*ap쯥i9gqz&ξJ1i ?Ǿ6m9п.#?SC?ӧjg.6!PZ{wiҏr@ jeSy!� � P>@s>H'Rv%*RV@�@�@�@�@�@�@�@|/FvK_xX ٳ:,NwǫsΡ_~Usc}S.\8avPl,7Σ]vI1jӺL@�@�@�@> ?uTs{1}]b /$E? LN2p>wI=CrJrJ6i$)vmi…Y3ΐ:;ʾ2tI'|r7~쑯ҏpITvnq#<2AHCb}s{N x [4hP+ iE Tƌn]aPTj\ ~o.;O5J 2% r&o۶"@�*,_&a3:5kwm~αl<yY^U=֣9=^Sfe=e]4n8mFfm4vlͺF3fȢj0`Zn7|S[neQul5]~e-ϩ"eWY:TIwL43m߾}C}WLB[+9xټyR8aq{Lz:Ou2YNl~4߿R8x?_1bsyu8q}GuIPq䊆Ѷу@|gY+%:'dh  � �K j.X^yEjEr'!� � � � � � � � .P0/T̫"5<_4kEG˳|\zY 5yAB\wu+"  � � � P}<5k_wpRi~DP2"fDEŬgg;O<xz3G sV̘PQA#(Wګwٙ}0UOwWx&Lww- :t#GŋMVm۶oӏkj?/tsnjS7Ŵdc4hP҈ݵ$vL6#XI IcW'WN _x'nr)=!t٥U1۷;?N͜SҊo띯bGs,fja +< ;@�@̟?߶~{/"_Bvm9?3=sU{+SFP{I&v]wyAm$XA"$wE=8%wzE!.LNgIٞMߞo)_R9._^槺BS){9蠃0Ԍ3jt갦M>>{7wōت$P2Jgjv衇靘Ĵ^sbKA`W/r-v9H`Ju!M@y@.'� �@�@pQL$U"c'� �@�� �@�� �@�� �@�(_\r㎶s9sxSOYΝ϶֭[RǍg͚5s09I AOs=/ڤIl׷?V'9(RߥZ*UG_9k:ǃ`駟7[h{s„ v駛y~>OYXP?#t}ۗ_~5jM8<L/jꪫW\J]UKc?C\sM mʔ)ӵPy6p@*Oٸʱ>o߾}}X~s?ý!�@�� �@�(9|-el%<v;1K/7VIJ;~mfHJ6?$gcc6l*0`�f#aڪּys{ǼLe#0K/])e"qj#vZ"l>;믿}d g@ԅ5۳Lr*lغ}Qm"JlO9NAGvT^rA<U.<.45Rz;<{Wle5 v|:~` +`guuŎ:(o{[6uڵk]wտе#@_|a^ٻVLZ:"V3>X\3q  �$ہ+r%1K)SVB{#1|p/`&}s=׏PrS{M7b?=?ڠ {1kФ1 ꃟx≾;<J(VUm?5Ec6zW_$>ܴiӼXƚo>hT5C$:^_vߓ]D<W[moUGGyϑ8{?O/WU>jcJ6)"M}#whlk_\es I}޹ƥ767FS^:i WLΤ*EuB^yNْllef!&g7|sƱ}M3+%X=˩ թT?Ӧ|ȑ~i!uLUͧ]O>gGj qJz_{1xjǨM(l-w21I Cr ?\\A-wV7u.@8z\ܬ[O>v{>:KJ^Levmd'@ 93=NB� � @�� �Z$pQԪU-!Pƍso(-ƌDpj@�� �@�� �@�� �@�� � FΙR)u}8܇s,9A&$圢F1fG1g(}G}sШ[ns9)s9JO'9;Ѽy38ѤI>UgZk9ǖs2SZpΩh] VN;mItDSDG}t{DQT'|ㄸ6]KHo ;}<JsU/|M7¹ShW}7s^qF1ImU*G>>ť F>Э$pn@�� �@�@#s>X+e+q,.!ەsɦeF4OFW^yp s|9'~?4*[HtQ#'^va> t۟3n q~t;aSQ;cd5$F愌"3<&teٳgtG-Zo hڶٞ5=Sra;=][مe˖ҋh-:ٚ^}]BU׸2kܹѺms}n]p绰{6EuY  Ac7lʗL<̤%$QGQtQt Q^EZ{3EEgaQ D5jcw@PPc#@=SVc<B{ PDN֏PF'@ϟgo'x㍩<m~ r͵'|9C1_}UN:RSN=\{~1hIAs8 Շ6{q up?~Yێ<ԩrcUc4qȫ뭷꺄-Bs9DN('B91B|wMǪ<V64)mG4ʉq536 UPyݭÅFVS)_2ͮhtږ^[dl|넪z:eK.VUٞ؛DƱTc7͔Lۜ0fD|ԩS'ow~iӦb\h|ӥ*w۶mmu/ Yfq #UjΗD1yNL%Qhe}3E7XғZPdwsςxB{K)P~/9;;;?Np"ʕR+3 TO_)S@ fϮx H I�M WquqlىNf" �@��j� k.q77r;� �@�� �@�� �@�� �@�C@΀a}dH(+֭[G͛7;|^{ͧ]+Q>B䠧k׮~UD_ܙcV,r$ǤT4{pZc)O #G~]`na 6vr r"ʕٖF9Slv^ +OUqu$;MBZH �@�� �@_|l%r-[e]-v*og>i$<3ݑWp}We )${}}/ܧ9l۷ﭷފo.ڲDև^wjICp 6{VI}Ks[ ԕUiL75_x uG8AUӢ;?S~dÕ(Dr]cퟭ̒CxO'Nn>YCPKyD_NzCc9&lO>d~:(a gALX2INFC&c@Ve"::( eN_,.)@B'>jTɓ'd޽~ɟ[}mT{W$,ƒ>bx$loԒvJQF$_J:OcK!oRx㍽( o!Ю(V^;8 x|Zk|x^}@pq>!dG~'UIӓ|$[N;- ㍴McBȔ|f>c%=vWM'%B!PgOW)[TIǧ;57e*II/q|euQYuᇇME[ۮ'Q1c%ƪJg}RBbЭ[HXcB)~Cl; 4nڶ:rc{Te.%q` (j>[lxG5,ǏIQG߁&9 (n�&V|wi׈!@�� �2=5n\O'� �@�� �@�� �@�� �@�gN`ʧ￯T}xJkmY9'(~{5OGyuŜ3Ms +`9);w9?2P9j(ߐ!CR1}1!ߦs::IY4?O~/\ys<9 96`�sNꫯC^J?/hksLMt2l̙&!p\y5Wyr]Jxn � �@�� А ͋ _[I[NhmJLz!o vh/:G_~)=}tscvw9'7k.Z隕{pN]9DI|Vek=e'(gMJ ;phao*~;΁91sě9i[AڤYNTt=saumSs�oݜ#^[h9گ 1c\!4\g=EkfHk]~o{ƍ3w lEG!�4dѴo;G%!]1 :tM^z%&Ɨ8as ~u]/hȫo;v9 sBĘf?'巇*:ƫhLK1CȳNcQ[{=i?~V5Ei5F#;n/F^Gkm-&M+b~W>~pBgxt?hL򑯭'߸Cs|;AT2 gA ҞmlV/UVOkjZ]]V�_7]w_S'SSlOxV5Sd7e/l+<4~xmz/bS罈hvUIs馛ՆsZ~W_5wu9LӽN;4rOuAN<?ZOk__'7w wZhwN[OaT\`$pTZSH �6Jz@�� �@�� �@�� �@�� �@�� �@�'r^#A/aae)ǐȑ#ӻk'OwfyS>׹sJ9s dz5OuVF@y ~([n93g 8imMW|Ou 7X6mL`ݺu|pCW+OZDuAJpFTT� �@�� �M@t!_[I6EW)B[!3_y.asϵZ|N+%\zWk_$'5ӕT[ذ3^Tilw4!B9/Vs+bj*ۺvtm$h0k,ԩS*-[nW#8%;,^viMr7,!?y/t$Z&0ݽkvfN\lU̶{.syw3D#^~BL40@]j9D@�%CS`TO1d7K@V"j'9{wͷox^I0qDkǫp zq$r ۋWV/T84v?|KE8rCaB煲MOI$b3xJτ cǎ֣GJ'qAN�5 @@6" $9-~-9-gZO/w 74O/_m,g+3#Ӷ4:.fzm0 ^N0Rut {^ ?͛7qkBԉ;t{l]IP+fZƑwm[o;ڪ{iQ'żգY wxߣ%zގ/a*H2޽ &9 @ihAvH= �@�H4狄�@�� �@�� �@�� �@�� �@�eJn;Lj%o.D},?c [xOx0KN#B_+6-1<KT}D,'J_{衇l}I4zhCΟ` X(Vz 6{oXJӅE4O zQ7nϣ �@�� �@�;뭷Ue)4%ŲߪU+T/b]v~uֱ5[F6=;Ju;L"[peoyD /915+СC;㏷~$35͇cXaggѢEv7ڝwi*oz)}N,q\x!߶_~%n5.4٘5-X^[veҫÉ_{y&'[JMPVo̒pv+?̾o94?ͽ2MN � �Z pE~_\ '3J%$gw1 zut 2.])juDJSNMT+RNXb5?$z!D<HWǑm9XpoX/t^ :wӦM]1e7]CR"&i,VC|I?#vWؕW^pKRH:I'dSL1ՏI /uBe}1Te{ ˝BM!.ŷrtdږ. HISw1CmԣO ʟh5!n$v?ꨣ|~ԨQV[-!?OR}Q{NJ qצxJV^kJ!P~Jcґi[(+gݳgO_~^[}DI%4N@m\�@�@�AZJ� �@ �,Ӊ@�� �@�� �@�� �@�� �@<s}~1$6C]tW\h)￿M>>/5tPkٲ(r߾}駟N9{P< XeɑЉ'hnNLW2Pr椠v'Prj9g_NT ͓] ʋSo6lذJ� �@�� �4Ho}'^�j4h 1cTJ[o7hJ ]G^zT4rV-m۶v3F 0}m [FSNyWXa'wfHP>�vWK9%mk>6l裏v"<x|zg/͞=[*ݧSNi[v{[E7إ_GqҒ<q;=^`rٯS;&`AvC= .}hzkRDjB`<_7so.6[}s^ۜ�sUi~K/c4׾1nܻ"6mj� �L`Bj]p <@'Hy晦1!ToިQ#;\]Ɖ`^xo[kO4fW_or-qA|Jkr4CuWU.jJMЫ{}Bȧ)Lۊ9VlCT~]vz՟}g(Q_cwpAN:gD噄 _\e}1]II/wrJ[z^վ_ztL2nLhp>'C q.nD6to;Fj w~W/ALk/6<xpғ[p4Z;d4]ҁR~gg(#O<D|֡C` *mO#F9s؝wމp/iD@Zz5mZͬ@�@ U$D@��/l� �@�� �@�� �@�� �@��J>Vׇzrb 'C>s0_|i=X/Ow/btMM0R^;cq^�J=%b5ydםwy/9NjΣ䠦&AbTᄏBN!8RѣG";|AW_}3gLˑ>W(\KEcᮻZ[p I39ֵʕ*>9p|G>c: |uuZ@�� �@� ^ziQcs -2md#BïUW]ۥ3k.߲Ȟ~IrH0v饗;/aFPiժUmD8WtJ)>͚5d2eJa%ez:A*Uٰg̘qqӧu0 ,gz{;g-Z?|ා9;338#UfdlFvZ:k߳>ogy/|89Lo޼^4L% qAuP:_}.ܐ9XVC̞~ڜ#6ӬY3 74Nl„ekgN;+su1ǘmIcR @�@@Q ^x^lGBSI |6$d[N% JObZF"ѻkJ[f{xW_mGukm\rI8exnvߟ5:,#<b! 1ԀpAB-;F\c42(V^O;4vQABW뮻~P{Z!=3.&߸ 6aLO>lI4HώO==qIO{ ±Iyu5\㗓NҔ,*o6o-_~IV]j_TU'*|ʖ|Te{4fQ{Szٮ7S( \e*qhNq覛n5T3ԮʕF)Z`]wu~uR/7g$9餓lWλv?_֭[СCUÇ{aR巜CJl ־T7l3;8zo[ӧto `'oZLU/o[$w~#@@ %X㓞R@D #� �@ \vYiS' j#+V1� �@�� �@�� �@�� �@� !>揖]vo[ YS]Fȉ^E|ITDN+rRs891,V}lo׮]3 SΑp4mڴދeFEÆ  ќ9s<ŏm"`VKG @oG;vYt9D|8q8oСC7Zo"ϟ0-,tt^'fOfso#\9ը<Uru"]oMIB<YWDDΡ9A�� �@�� 7[o5=|v${q69u9'vi{8sꏓ-k9/KMmLy(M'D`Եkר_~tO4)1noq"Ō$ruv#N�3_{#α:JۜϜºf{ֲ-R*_lز^)[l9s91hwu'(+)Tq2C6qmSuUe| 'DαOPWg9thĈ2M6m+9|mG3xe[_Nl,{M74rB Λ'O?#h#~yIi#n*N>9Fɓ##ψ-o;B�R;#'H]tE1Ihת4p@&83զոc믿~llу>\}sv$q}ᇑ:4~C_8%ΙkƱ4iğO[vԑ7|ӟC=:w9hUV9r41wi\.F^8s}^K3<X\uY'z7!k|#'1Uz|.tJ1=U7MNJ~��@�IDATC|.({>=>ުYu/&1RN8:ՏMJ MG9o.D7nܸ{k9q9igeȧNU[ܜrG6rVeoVGJg7IuUVe7%{Tmʫ8U*dqf])SԮʖ'+r і[nmNtv}m6Ɠ駟^^O;& cۓ[l'%Y.5vNN6jܸq"I P~[)s3 {~ճC ߅8>}zD_>:*IL/i@:ُSu@�瓮GjXJ;� �@\vSg-cvf3gc"85 �@�� �@�� �@�� �@��Bg5'e)tM_&$e'9ɓ'[.]9-͝;לuls`;43c>s'u.8? ,… MssN&s4ľ,sjNp,G|909/Ҝ#'sћqN9JW<ѲeJP֜i=裏sZ#n@�� �@�� l9Ysl]&lg5k?ޜ9v9pǶTH[sBm7琴({ǎ=Xk۶.|s>K&_t;k2,|o|XZ`9}8q6ggU֭[4}}bT6;žMZ`ێVEGeXd_~]w}z쬳2'fN,1rh1 GfƙK33 ]'5Z1$&.$R@<v'L4IJ5g]A3bep1Η) m?o>](uD TsmNõA\r~C1u(bUӸEB<dG1gRS9v[ ԩSsD=R6b=~j{Y}L'bN>lo> b_N77[{m+(6ƧD\`Ç7'm=KbeȷNUW/UI/g;c==Sҷ.N8ݏԸT'YqN"U(;vҘRWW 4N7SՎ1M)ڦ6ʕn8�vk^_ u_wMylǎk|؉DH]54)sN8{O?K.Ŀ#1b F@u3WmZI/ PWp / \Wg- Uב\@�� `^jszD4H �@�� �@�� �@�� �@�� PĪ{ol.˕v`e vm؞wl=)rT=USȥn䩧jl]wuuԹ~@�� �@�@mOlu׵}׮>]_6&9Ȗ EΛy/b_t~;mUCO:$Xrq\KHgT.HW> 9q>{۵k߅:&Of_!%0kܸ!|\<ku*q29[@\¿4ior!*7B OIݣy1zh,dc+P[om{oI ɶt7_/"! J@B9oKEP+?,<:ԋ 2$0P8>uU'wٖR?Vˠgu.55\Ն]ک_uU^7%$T5tԨQ6l0;3l I]'CH۷7{e7ɞ*Y li\af  ߿Kr9RIHgΧ>,ק~:UW[o$O4w_W;sJ@ UEZC9� �@ }{Ϟ@�� �@�� �@�� �@�� �@�Nk׮ꫯzr$'=]tQ?BO͛7AJC?ӝZl U_>v 'جYGrnJ� �@�� �@ ufr֡C/T'hc0963×^ziNu<scK.[y˙*XJt%k[CON鮻8O}~Zsa"9wlA<kd3WYfmrL"Z={-G"_� �" !?~zk_w=}dwJ_]SPRJ k²Wr{LŋMZԩ֨Q#{7g1=r>_jAozIx-vCzM@ 7`'|đꫯZgkӦMb2PWuB}m�/:(~2Ἄ3F,Z('bAM*WF&;Θ1cr2ΝEj%(Av͏.ֵ39s*bs<$l7y%رcG;l=m:IH5N/qXwͧ\I-g׋;NߥpE?'5/{]~3?xtB�( KE.FRI% �@�(M_l饙~R qvf M� �@�� �@�� �@�� �@��*:u{Gɧz*ZVYʣ>jgy{v駟n-[,ܑ@�� �@�@C./)_K$Gr)1-%RV[H6չM6'L>|5iҤn �Z%r瞳n;_uU}9yGX֭kDn&T~h4}u+$%-͝]B @ \$ηWFx$ #FX^J*/'x?~KϷLN)z$f~W~L,IСCOmՋ=#v} /`ݺu=ӋcH$C9o7ܜWU즛n[la{キ:n:t'|v{18c}yV:HVJAZ.;%3=j3j۶z⫗D%N6D8}8E/=owqkgN}۽Rρ/@5NO] Xy;om'<=ڦM`cU;B zl@IӓZo5g4g3<>RPDPt)� �@D\xaJgHI&AT# @�� �@�� �@�� �@�� �jx3oމN;d,Lag$??KOm}#G:L@�� �@�@'p[[n {|{o#i9xֽk ,;[fmyE^@Y|ϟ(8�6l-҉Jo$fB?,{fscn֣G`VJ��J‘l@$=w1u�2y\yK"H+5C-,C E rj_$V A$8'|q裏/d_{ Ծ-uAmSd[{o6l3Ç[.]2uB#. $@\#N˿5jԨ'ٗ DSz)_~\jGͶ &Mg1]we;eTfL}s{g.W;ecƌꅹ:avsxP=]*~lխf;X*&@]@PpjΎ#!�@�@^.쪫̦Nkwv@I(%B�� �@�� �@�� �@�� �$w‹.FersAفhݻw/I@p vwx |wq֮] \C�� �@��J#<b쳏Zi"us!e[`wМB#'r\@)Gloؒ�O>}pY Z"0eTNLw뭷w9њ6mZKgnIJos?W!+39]@ow0T�ǖ!� a'jH0~"7[lhe˖CX� NeC"}/=~yeM7ԋ1:w؆ڷ$= ֽ6zh{O>]z%U"-!}!�?kO{!m۶N뮻ږ[nY^]tƍ.?ONdu5e$:B� ̙3_^x!^M66tP'"oRd�Ǧ$бᇛtRYfLA�5$V�*GB�� �wٵךr`Pv A�� �@�� �@�� �@�� �$Yo믿&L`΋ynp |A~9:` C9t7 � �@�� �$I&{a~_; !Z ,s9sʁ-bj-Dh"{饗졇N;eomժw)grۣGB >s3<c}u$;V[mHo* gIDK>?s'pVNS5*ɉ&KC �2&xb{p$4  ZKXKƉTe|+5E`oW^qK/m뭷IFƍw*m9 jg&'|d#:C "qSc$SmMxD d̓hoBvP/, S�ӧmƾM{ĥZ*{f(K*#$rW_5_ޓ`)ҷo߲?@.Çߘ kO�" jΎ#!�@�@^OsOzڝ PRJLI%� �@�� �@�� �@�� �@� >(ѣG۷}h;{xdlرޡ}gܹ瞶8T@�� �@��B@N;4 _~6pâM$~;ZGuhjӽ^6c [mlM6$?`�[~k)D M@"w|w(Gr+͛PYr+B$|ƍ]Dy>9ƕ0 a^wr $… wޱ1cxg'SlڴH4G%2$+( Lq\#]ט[oeheXarrڷ AP+~-g}46_~ݻ{h˲.?e@ h |]DSd󓀒ڬ$2x`[q8u{s1fIJ'*U^}콺BEe&e$֩S'NH) Pg.PEȶ1o<[}}E_U'n@0*PGJ' PjUV}Ԫ̃5@�� PtgmvmAE!PiA$� �@�� �@�� �@�� �@� >:z/5\ӆnC!Cx) U_O?m?w,g];� �@�� �%{G흚>vꩧZn7Q%~_Fm.]z־}Ui%_B/8U^ !:U%g{Qoi]ZR�r;yLQs9S˙C8 `߸}YOTݨ,VZ˖#ˏ��#@<o>ӫ %qsz_O~Z{SS6m# ٳ];C?~dw{y߾}8_;ѣyԾmhZX"-f^"-3gδƍ{۝'%_>= !�"XhɎ. OԼys/$M76pCk֬Y08sJ7MX}k^QgJ+2[_$6N�M'@dj 4:tHvHכ{l;<CJ� P�ZpTkAjbg@�� P}gav]f}Tc9I'PN ΚA�� �@�� �@�� �@�� �4,r@#ؓO>?:Vufy'-ZhXPmQ H@k̘1~S@G95l01bNJ �@�� �@�AO?&Nh{챇J#H?os=ގe\O@61 kѣ+r+r(֚qUWD$yj.gXWve9%չsVϒ ͚41W..�:K:uP9 �1ɓ}EC?trF߳gOZNUSSǎm饗.Ԙ_~i&L4IHKVZl 7I[2,Ss7ʩ}2ӦMd9st#_Zd˓z0IA 3-%DeӲ8㪫OͥP b6}SOpp(#oQާz5}Ї\!޿$%/RT?Fs=3fyn۶m=DJnݨ c&tͽ&S;A�N�A¯ ZH@�� SO5~sڝ PRiAI'� �@�� �@�� �@�� �@� ΃>RիmᆶI Aygv_s_~駟z=use-�@�� �@�@&oѣ򶨡Caf;찃- NKT;kz-oo9}`:dȐ,G9 ~ҤIi} 9sO^6mVX9x\vXm'@ ̞= *~THQsMӝW=/͛7^ve_kWn ,W8G9Ι9ųJ'aP�� �&  hR,L_1ātb]v]kY:t@;/?O�M2ŋ}'~.<M)*nlXw֭JB9o7 nDm +XSBIxR+ eF`ޚ8qK s ̝;}NT_I4EώG`16;Gb/eyvfg~GL1ZXV@>8/껄KX څ}=Ϝ# '>-}l?,C�0CP�Aq$ �@�ȋ'Wtf5�r#PN ڐ@�� �@�� �@�� �@�� �%w/l~mGr!'뭷 0;ǎ89.{!S͛gǏNDtoh֯j+ 46hԄL@�� �@�c=fW]u=֪U+;蠃l}:%-bwqI|w#<6pÆ_{r&9| G5ka^q]җA$|Z%*Yfy/w('aݎ;6F̤ӨtN+YZncx49�� �$CDB;.8<8 D:uꔚԞ[c5Ԯ];Ɠ$ꪒ Qy�$">N6LZ_|O B{=@s͒͌P7ʩ}V?mvI.^GܦM ;ՃΞ#A@PW|j JH.Zj)T=$+'## ,[meNkXӲ{Te2gCfڴi2\cC?F]k2iPYmPf │>s4|Cz~»0Ҡn2[gN)!�D@P˃V8� �Eओ̞zʜCvg'r`PRI, �@�� �@�� �@�� �@��bWIo~.g.1-}(GzJM]WrD(]rأu5ɱ|O&Mo߾^`m~ZkK/]&� �@�� �9ko{a$P.=zw}_zlxlٲh8qbI|,Z3iڴwP''ur&9򪫮 ّ#0gLQuoINvLb_Ab(0ɩWlտf?~ٻ.{fϷ-5ųT}hQpC��աž�ʃ3L5 >T&]k۶wJ)zmZִꫛD(E7%,n$&$铞 @9o*tHvd.ۮ)M4� oI=G՞Snܹx`$d&$lmgv9ISRQevmYf;ޏ J%-NiC}[>X`A*: =.²yϓBСDMnNɉ �!V Aq$ �@�ȋ'رyN()4X@�� �@�� �@�� �@�� � 믿lƍb[G .J[05CC p-'q}.rI<AvzuYZהaBq@�� �@�@" g^s=^TJnJM[.+"r3O?m=͞=ۋ{xLYeToˡlxaNw8^L$Gr֫6n8u gGC*^尦 ~J[i3E9T N. >Kt+JYNkֿ$g}{}@ �@YXx7"GAx5'\Ch@G }0WV4i, I@"ݣ3gLM'IxD}|֬Ye*`^c$ֹk'rj"U{"X4R_g( N2$nI<Ouʌ0>HA�<RPgGf AY|S$ +vepHN0;'4ɓ\ÄyhGe}}SOǨ_\Ƽ6~KDŽ:@e~^bJ@%Oqň5#pfoe5!�#VAq$ �@�ȋ_btfN%G| @�� �@�� �@�� �@�� �̏>&NE\"͛cØ B5# Tr"ipZ4lWN͛{'@ѣGjٳ'Njv)8� �@�� � Ⱦ1vX{ꩧcʅ zA_^{q,`'>oFNlCaÆY^ a ^9v-0i.gyr-[N18s9{\uUS/f/;qu^PQsŰX9U$g| & ha/=۔x"|hժpDu3[z✛X PS)A� /~BtsQ%V{)khH*5פ0+6<8O/ײ{,> /H >xKCJ@9oJ(v5O_\Ee<TPjp_{MR#K¤*<ho;5j3c|l|*%Xix>$+]܅2;_T~eYT'NLpПYiQ�~K>>L2oj;HMu@Q�+4;dseE饝C�K5U]̍?s[j%?� �$ԡ504(5A� �@�� �@�� �@�� �@�(aX O2Or,a:>ǜN5?"ֲ>\veKNIe} b!lH68<c-k66m2&9<ҥA6� �@�� �$?`/zMBBrاO04$ۇ#5yd$z-k.穲H L`mm8; Հ?{aܹc+yp+ ʉcc\3M͚5_.nVu-TɉbI0g*oAe.'a98U u= %aڤI`ܸegwuf:ijܫM��<$@I3q9 W%U4$7/#�O"!X_}mmx &vME}XMG6g?R>c.[MQ?I/RH3%PN[)TiY4הI8Iϟi%$L^&M:q%Ac=bܹޮy|YVr>AiAP-uƧ_Eten!ܛ=[m6K&cz~C?&c2sAC9ėU<S_FzƍK[)'TPe~zE~+ǗCٯm]L}O]@| <[/ko> P}jUY8~F3� �@� E^7E@�� �@�� �@�� �@�� �@�(YK9O&lD>$w ;卵C Era9{~&/ǮYbsMJŋsNrXeӼy*?9 ɦ(gr< >zen׮oϵ� �@�� �291bf>C;v?ދU=&vwd3СCj$.el[˲Yɶ#aL.Zyjc</B f'pڵO#?+r׭[7?:;tz5=>qĔW0śyds?=laR²lfҟjg^\k9u9(O*[YC*+Myǝ.fc<2w9er(;'nE$殹D ?Vgm]0 �@�(jk,|zh[|LZ3VzgQ%>i[q(.٦xF}M?Q?<jgBe6e/r4_z[' cea[Pق'\l-a[$c �L@bXdTJx)>Ɇz/LeO: Olesŧ`Slx 6<wZs- Zru]-lWPL0 6`NjU_Nr a.{^TcGNu&ӧO B|N=hyB5[+B{yůrF}/W%g ֤r-[PᅣPg˄<eTeCٞi\Wz \ϵ=SP>K}އ <YsJS *};}.Ř�@ E Ԫ / �@ڡ � �TI@ԪB�� �@�� �@�� �@�� �@�@ CFVjܙkpxX ko\ c}X[xh?> Gcd}%h.g:8LP1� �@�� �4Drַo_?/Ahڴi)ӧۘ1cl̙ye4Ȧ%g!CĻ:wl=z6!PU`cG̓3Ǹ@TXpV6]-m'91=:wnyɤ)t8,>lAtLvⰬw(p~m83fiҲ9ٺrH|b;@�� �"۷o_Prĵ4WF},=[º(_W&8gϳ lNtkl7-̽k10qPȨ>km~Q|,A� � $!a4Ɏ?{STʎW_NOuvn:+H ]'[w\V`5STˡmO6>w �ZŤYqY}TUK<[җlyOS2LÄL跄~*[n*_TkЏќq^�!>1rb|fl>� �_e"� �@4_5� �@�� �@�� �@�� �@�� P2jvThQ>�;,r伨S65֘kqsU>ǵr'?^=� �@�� �@�U_O HgNCStN�:L_l9*jarF�*yóᙕM7nߍ/&~󰮹f|mnӧ`FMuu3*+<89nsϒgUӴ~̶lȊnݜg|$#� �@ jϫ6.Ǩ~6xFo]c|~LKMSU'=K)Lp_w qC�(> ҶmۢGGu\`zz=_qᄏyv;_m/csc{^`zXb*�R"V)]Ue*{*CLP,4?^Ƨ_N;muz{6JAOﳄr>̳avRyu �R$ZZv @ h&&@��ʊWV@�� �@�� �@�� �@�� �@�@-Їk!2.]ZN;u)p� �@�� �@�gr֪U+?sR8= 6]d30wֶSr:& l$3 fi "ZfUdu\!ufWLs �@��ꂀWwfcǚ=6lS� �hl/蓼"H;hLW4g!V!�@@Z+dN$(laŏ¬kV] �T"гل 6@�5 V q( �@�ȇEf.Ϟ@�� �@�� �@�� �@�� �@�� �@�� �@�� �@�5!зat.5kV8 ̟ofI@KU|߫W`ֈ"ZU8ts~@�� �C .~gr @�i:vF@ZZe� �2{ry� PԪ_� �@`Behu5+M!�@�� �@�� �@�� �@�� �@�� �@�� �@�� �$8,;4;KBHC>f]8k83gM`xq0: X!ֿYf-O@�� �!0}٨Qf_oRsb� �$ԩf:%5u  V2� �=;짟V\.9 �7;@��@`"&M�@�� �@�� �@�� �@�� �@�� �@�� �@�� �@Xe30_9ĬkWfI4K>"[I0kN=bY$� �4�_lֶ^{5̒E@�@ j U@3Z@��ʔ@8lu4d @@Pas*@��& ͖0/>� �@�� �@�� �@�� �@�� �@�� �@�� �@��G]s_bCN,^l&qA4+h͞]!չs`aU$� �@��N@m3;leMzjI �@$ŏ!PNf0رrD^ �@�F@=e#BP+!C�Nj!�@�@ HPk}@�� �@�� �@�� �@�� �@�� �@�� �@�� �@�@qu.l̞|lذ#ⰼ ̟oYA@ʹ]za:똭Rѳ# �@��E+76;D%@��ꄀ= jNRlJ<$� �t.ZyN� P%ß� �@$@�� �@�� �@�� �@�� �@�� �@�� �@�� �@�;[nifg&a'.ٳƍ]<KZ'-^l֬IJ_*ij$r;?1A�� �@> ̛gvfGmִi}sC��iԩ~Y!P*$ꥒZ @�@M ل 5!�@@>� �@�L�AZL� �@�� �@�� �@�� �@�� �@�� �@�� �@��"=ͮβ$畅$5}z!mژgYubRUFɟ� �@�(i7`fS � � LZq(Z#@@"s昵k�2K!�@�z0{ `@�@1 U @�� Vp � �@�� �@�� �@�� O=��@�IDAT �@�� �@�� �@�� TޫtT+j4 JXb`IF 11kbI5GQT EX׳;;. Nrܹ sgϜ< � Pw7F5*Ǔss Y&ڴ)He,a֨Qɳ,@�@�dػWĽ\V@�P~}VYC�Bի � �-` ƏW(_j/GG�@�{ � � � � � � � � � � � � � � @Ev3K&TD b;wJsM5gd.]Yg{ @r콊@�@"/);[="9@� e$KdOA�V #VF<� @ t޺bh= @tH]oΆ� �I(gTr6&#� � � � � � � � � � � � � � �1 P4ntEҕWJYY1P(Vafi`5+/X IwzF,q%(@ @�@ o#H\hT@ Kr-8*L8իJ^ƍi4@�J1x~%V HlF�(@B2B � pwKl� � � � � � � � � � � � � � � p\ K}tGggMe/ۤԳtү,k'n{ � �$[Ҝ9ҳR  �Z?I'KմO � p(K J|#tҡ"�P� � P{H+I8< � � � � � � � � � � � � � � @K{K/( V1`^^fN}$j&HuGYoD�@�@ ƍ !k  �,` ZNfڎVZ~� �%СC;nb � V9# �$$J"� � � � � � � � � � � � � � @ yt7Kg)U,J99ҼyEg͙#!K;IN?]6ծ]́؄� � �-g!x" � !uy͡Rvx� �1*` .Q-@ HG/UE�@�Z6� � � � � � � � � � � � � � � P4q'[ҬYɳl믥{5%K veA]ʕ;@�@�@ IzIE @�X4sWwj@4,Vn<#B�@�XQX u@�[ZQ{@�K�8x" � � � � � � � � � � � � � �$@]wI.]rYqM3g\@FYCuSjNJMrf@�@�U`BWj@@�pRj.e+SNR7@�(l)'GZ<1@� Vrδ@�*PZϩ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�0k&Lƌ^z)rXϗ/.8i_u y%#XnѢ*!@�@�@ƌDVKCqPI �$%j҄�Җ IP+## � P˾ ]v] $ԊW!� @BP+!^F� � � � � � � � � � � � � � � ".=4dҠAk_>~YfI۷Kh?: n5[u#w~� � �XZz;4p`{>كs4@�P`2S@dU={̒@�HLv!I|CB|iDKZђ< �  :7W\9)O@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�8S_x5-IEg}dIUu f]xa0?j?@�@�@�x LBU3#� CKP+^xJFF0_@�H=U+ii3-E�CZ1@�@�lj� � � � � � � � � � � � � � �ĊK]Jt5jƢf̐/zYKG;JZ( � �DS`rv2yj΅� @ XB3όQ1bBjYc:T@�,СhQO@� V4@�bKZzP@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ o/]_KÆIdgɳ,i̙W k"Hu<+KpGd� � �$cRJJ/^n:F[@�8hKyO$?90.ͥ � &`CϙU@� q3 � p`$:0/F�@�@�@�@�@�@�@�@�@�@�@�@�@�@�)0b4at RÆA@mJ0k g5jq.@�@�(]?A:ezEKYQU �Čm./dT $ɗJ!� 5KQ;'B�RZ (@�j+A=@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ f͒>(>Xڰ!H5ctwɳzjNv1ڏ� � @ <yԻRUդIŠ �(ti@B-.|9JQ@�[j['m&ժmu @y Pd9. � P � � � � � � � � � � � � � � P1;vH}&Y)SO?o4 nE:h{wǮbY@�@�@ v.HeTJJJT � PAP+-Mjժ*ieˤA⤲T@�".` ,Z$ee� p`$:0/F�@�H`Ϟ`ʕi� � � � � � � � � � � � � � � p6ISJ}L_~)=A?\^0?>H9}5@�@�H.`7{ j%�E�@xKբ^lE�ɒX!/)+ � [hI�ڍ�HA8 � @wIU[@�@�@�@�@�@�@�@�@�5ɓ'kԩSLU-??_֩S2 � � � � @E xݦZPz+] 3 <fK-{N5JydZֆ}#1cBsd=9 � �)pСRR/sHk|�Ů �q%`lxY,Ҿ 6i|c{ 2VtU8 ^-CB8~( FZrMKEA�88J4� � PP � � � � � � � � � @l Xr˼hxW7mSܹsUrerjjjLՏ � � � � �-egҧN7KUJYYҐ!}IK\m,C5XF�@�@ >_ kcIN=V%b@�jrגZw~x 뀎Q;[˗4\?_,dp~'뻀v#%j'@{x& � _={]@�@�@�@�@�@�@�@�@�AKND~Fݻ\MҼ믿&V̽:T@�@�@�@�"-uꫯ'.LEWO:$駥ucӥ[SN?iY7n]Z+WZ>4?� � @E ' $/ɇ "j*e'+ �:L͟}/[XJG/W_/?_PkԨQV5gKժqVu@D("@Z "PJzvN� �$A4@�@�@�@�@�@�@�@�@�8կ~?P-UXZX  � � � � ^|z}A> eUDYԷԤIA"o^xEL@�@�*J`Lj\nݺ*TD�HfԻ6-s/_Ç//xNѴ vad];)%`o>׏#@?q$@ Hl8E�@� r娞!� � � � � � � � � 'G}T~vܩnݺkU}Ywܸq^-[{-[~~ijӦ/Pka 6f͚Zjiȑ:ݻ |I=#y#}z衟ًʺ{nۀ4zhM4NJ x =z饗J+8q{gqN:餂6ꫲiݺuUNY@�@�@�@�@�-uWɳ,z1x-hR}IIG!yݤQ-UHtYWK^>g}?` � @ 0o87"hȲeacL8S}@֬zDZ=,XVZc(?|oV Ŵ~իW몫*x-8xYx1b."41cǎ<3O[5ydM2?njtwm۶^yӟI 6FӒj`\'UfMedd,ciH vb!,uSHD~D|_&Kjyi6yY8. 4Z� �TKBA�@�@�@�@�@�@�@�@�@�( l[oK<^P.]4uT&gy:v/_|ŲdTe9s"\r%/] �a^E{=SSOXrO?qgIy/6m  ‚>,^Oe8wߩW^stWjذa~98… uwy9s };@�@�@�@�@nNy]^iPy}RӦiIT~QᅲxW߂DV={F?u [`5oD3E!� �$%wH7\؞szSG1'o @�$MzlY <c:cuG'TƍLw%r l,E]'x㍪ZTZ*WJ*i%߿?Ғgeeenfc)-'|:_js/_ .@X.`qa!-"VҽI`3>?I4 ӻW(b@ @R P+^n� �p *U9 � � � � � � � � �-'h޼yz$V g~/K{nYrZj, &>5iҤ 3ڋj5j>hw}S"l7,.}~�+g܎sQGybh6K5|?aVFo^TY Ԑ;v.{x֬Y~E[ KfIl@�@�@�@�@vHw-yqiպ԰tɒg{OrRü.X#yݤ];5:=4g-z[n.` @�@ |P^KQkƟ)XB�Xj5ƍdɰFиqt1hĉxMw٭[7_Yx h\ҥ?/?ѮSNȒhyxIKe 1XrLiō۴Yzu >ܯmwk1*LNNj7<ݡCr&�tZ@rZ3H \G(@�@ ^^g � � � � � � � � � .0g/qԳj֬ȋtc8pjԨrd[XJ 6wU[l%^~e?%úꪫԶm[Yy͛7guX_~˒db <$YV,g:u]TJe[۷bz_Ou5<sСC h  � � � � p{;Ӌ ^Z/XnpK.|SZ^'>Uۤ㏗;سGy;KzUZP?7"gB�@�AߴƗx Ɵ0$*oDN�ĸ%jڴre lܣc -'|+nZظLSiŖ\ҟe dIc4k׮aÆiW)Ss:޻vkZ+ iKvw+9_/8҂4ΝRId$ϗrmJD�2 TNB2 &P)lU@�@� ZAU� � � � � � � � � @{Zp{WG|eeeP=\+,iѢEwŖP\4iZj!C{wY],%zڋ4f=cr 74iE=u-… eA!c � � � � @}'͝+͞-͚LKw[Y t+! ̻w7Y!c~顇,9zY\ -?j� � @ /ժ%]|qa^/Txr � \˖IMj4: I+? m\dh81tiϷX_cѸqԯ_?M6M9ݽФbu~ꩧ\?LOF}74x,'CաCrV&�<vZ@dڵ6h @)@�%JqyP@�@�@�@�@�@�@�@�@�@ J))*E+WˋEz&M /PC?.T^_Ҏ;nݺ}o` k„ ~[]td1uQO+nA,?Y}]?:nݺ*QIҥK7� � � � �I.u'O'nA:Y3aCi {J/=ddkv/\{4p`b%ӲDݺA}TZ@W,/?'GG�@�J뮓U+l}?0dB @�:4ۙ?".np04e dVVz꥗^zɟrrr/mI{1?Vʇo߾={9r>EbiXM%gʍ%Hh? 0>_g\x3!@r m+-^m PPy> � P%CS@�@�@�@�@�@�@�@�@�@ ZՋ)S9^tj^=z-H=Te-m;j֬'j̙ObX`[I '|222C QFtM `;^s5Zv?|͙3oɓiӦ~~.WO>Dr[e� � � � �I&s&|t*:u~dZ^7ZJja{H#FH]&}ԗ_.uT\g"� � +0ag(|A�GjuXYUM4^58]"]veǍ<1W^y,~3zj֬<L;Z%2dHձ䑣GVƍ'}WqVjuէ"H\J!HPvH/-B�(P+ Ȝ@�Wbk%oi9 � � � � � � � � �%Ь�Y ?~@˵`vmW_͛ ,SO=+;;meʕ6[뮻Oujر~buի0%KRSSuWǰWŋ:`�ծ][Æ _޺u?w ,أ>o_nݺkժ_~Y'xꫯsl6 � � � � @b XKO<!#~dj֔:J^b ˺JJzu˔mO_*xtI׍J`N4@�H Ke(,CI ZgL\a O{9 WцQffJM6?+jذnfѴo/L7Chںh1,V:u?6ɒlY۸>F?kzeG?J`"}j2M"ڔDo�ehVZZ}Me|!�`3  � �~*Uđ8 � � � � � � � � �@kiٲeׯFYK~{;<?U^دְfȑ#xb]zm_|֬Y'Ѳ?~xiǨk׮o<?!և~?]K.Q6m4bĈFרQ`%:s5g\/Of>l߄   4m^@ܫO?ZhQpl@�@�@�@�@ ~^ J/y]bT/)YWe)M(-X oS9Sz9[[[/_YZ]K2֧@.ϷF�@�K;ƜXyۉ'? �$%ӲHCZdjhIl s >\ӧOה)SD|Ν;[ns9l;>M<Yvoٸ@6k֬Lc4W.H7t<X~.2?IGWm-/裏ֵ^^;2vXfqH')ϾCl:N3>? 4 x yHKFHx|$|+i  � PA?.iӦ �E@0|"� � � � � � � � �@ݺǩU;QY0Km6?(Ch*wȍ7Iׯ6y}v?V۶mUV2?hnذ[NtթS`[I 999ZV^ʕ+9{6I,yW p s@�@�@�@�BTv~Ȣ% ײԱԩS0eN_ + P(G\� Kwogm҄ [l?}%㤮]G:#'D>PrQ(Gjժ^wi޼y:ü[^ƭ˗+##p:r֭~] >nqVLMM K:q q+ U?){n6#P� YTx$@ [{G:dh1mD�p ƍIc * !� � POK;cl@�@�@�@�@�@�@�@�@�8x4o _W>RJ MhUn>TfMѣʲ1ܕ*URYiٱ-͛Zڵ+!!� � � � @--[V0eZKJ{[WjV^t,y餔@VA"{.Hj֌g=@�@�W%KVKşgZff OR @X?eAMj…oРD[(eP@֮]{g7X+W쯕vHK:?O`|'MSc.G}Tw {"wˑ5,@@Hub� �uf{P@�@�@�@�@�@�@�@�@�@ [,ĉ|9%;@�@�@�@�8ϗ֮ fY,7Y,K- `Z0g , !zju*UaäkIFC.T� � P.I&u\-%`I>% h֧cIYB7|kd)/rݺuu '%W_?n>[G_JQY~d Px � P&j@�@�@�@�@�@�@�@�@�@v;:w"~D9w߭;#QC;@�@�@�@�PfY˗KvULOZ ϶i# \@gծ]M4Oki<YTIIp@�@ >H6M㒫tR͚5r^;%#|O7�G�.j:h%ZbRݺuٳKكQ`<S')--[G_JQY,Y88jB�@�$@B21 � � � � � � � � �cv}4` � � � � ;vX`zbNXNNSɋҪU0+3S߿pζh!&)d7;ˆK={^Ó�SRaT@�@�$7.{f+L[@�,-QF& Z6~@" 0>?_Uڄ�hVzh �#@By-i  �Ġ@~>ceJ � � � � � � � � � � � � � �۷KVI+W;$Z6bU.vX0Yc22 fY¬YJ,-[) ц ]#@�@�DDo)Z!� 9K5thǑHDyU2ڄ� �"ЦddSRH<H.j%Mk@�@ yy$Ԋ29C�@�@�@�@�@�@�@�@�@�@�@�@�@�@@;wJkHkJWN-M[bU*YBV$/ov mݒhټ~YJNN:Iwy[gZӂV#� � /u,vZ<֞:#� }]֭nΈ@l&X!u/5 � -m;u:+A�_Z@�ajC@�@�@�@�@�@�@�@�@�@�@�@�@�@�JL_LInYls7mRشTQ#Y3TefJɳ,6,|K&p]wiҤsZ3#uK۝@�@�@ F,/JO<!H �1.|/P+_(W_}k 'G�@�pߣ. +` $ԊɗJ!� @? HWv � � � � � � � � � � � � � �DR`Ni`ڰA ,qηn-z5&MMy%rS(+EX;$T/Kĉ/}?/^UvtH� � �Qxoãp2N� @X+.@ƿ *0odYdfne@�hU,A�(�C*~ � AX2-KEA�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ,9wN(]¬eK JK޽ -1=f-[pJ %{#?5h q? E�@�@�2l$=t=IA�@� X:uu˶?{!PKbR@�@�PT)##He@�HU"� � � � � � � � � � � � � � � � 4ɒ`Cf.[BbAՓ4dY- m%rs JA ;n>Mpt=@�@�xQJ˓4@�CXLjHh9s]4@�AO[Z  @HUv+D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ .6o.Ld&*nyV)?hUcY,[nNӧpKes,%բ ?>F3f4bڇ� � @ !5H5j_1 �)`IU�3sΉRG@�>`AEs"�+@B}9 � � � � � � � � � � � � � � � @ $XˡBlJ Ke-gjQ@d~/Yߺuҝw@�@�_8CS\O=%tXB�@�}^|Qڹ3HeAj lA�@`塞,D@�@�ڴz+x,?_ߑ/l\lj'"�.@Bd~@�(w� � � � � � � � � �#HIiӤ',<gjync @�@�@�@�h l&Y2-[B,涾u뾵W.%Ų)#Cٳ01_- p\xG֕Ə~ki+:p@�@�ؿ/~!]ydn5~{K=@�H^3(l{kٔ)!լY/K$RZԽ{ D`|~-`4Z$̲Y˖ISH7ߣW juY$Ԋ@ ~H?5E�@�8HIJSe@�@�@�@�@�@�@�@�@�H`PiWreiȐ � � � �UYb )|çݻ===HeIԪUbmn%ɪZqXC�6g.. Y4 jIU5@�@�H|=$Կb4zt⷟"� p}=omLs}]7^JEB^%%I^=9OO"GH[HƅjKRm[a]w} YB�(*@B!� �HM XA9 � � � � � � � � �t&k'-^\iJ.a6 � � � � Xkui˖<˶ٴys'[#KհԨQ0o^/X6$Y\vc�+jԸR}lU) � � PkÂ[:5uү~%l_@�Ww}-M6&cHf/Y'�= mbPmyk`߭IU [@� @�@Ô� � � � � � � � � �'KcJ.Rloe@�@�@�@ 6nV& m6hiǎB~}I 0%=He6Y,7ի$)<K [Jw-=dVgg,!� � @ &rgqI_W;N:@�@VAMn˾sxMng *0ctzڝOWv!@N~J>|Q(@2��@�IDAT%?# @ P+@�U 5Z @�@�@�@�@�@�@�@�@� Qt)%=v@�@�@�@�xa\)egNjU0Y] [YԼԬY0YMɶY-D9 XB�}^{MRi˖+q 6LA�@�@�(.;KUWI~$v3G�@�@裥7ސ=Xr wa=y췩5)|]iDOn]\T;u~'  @ +ޅ � @Dl@s^^DA@�@�@�@�@�@�@�@�@�@6mg7CztR%< � � � �1-`;-!֒%ҥ|& T{wЄ gVR˖RҩJ-Z%Ѳvn2C�8;ZZPܹx @�@�UlȞ=ɒ4n,MD"؊� ԯ;_O-M7�N` ~ma@b0>?1^GZ�+_J>X|B-:昊gG�b]Z Q?@�kT)77@@�@�@�@�@�@�@�@�@� #ٳg&PI@�@�@�@ irrŋEo fZ˖Iv4UHԶ4x!vdI,qՓmDfͤO>~37aUg$V:lE�@�@ rk ;%j@裠/}؆� �R>'Ӳkג_~)o/ժeC: 8z$Ku&ղ}V\83 $ԊW:"� @ <9nE@�@�@�@�@�@�@�@�@�AΓnaߊY A@�@�@�@� XsKeIll)??xݼԦԺu<n4@ W^}U&顇YzzP  � � KeË%�[7He @�(Yਣb+Z f̐ YB H&mA�7{ /ZEEXC� ־&lA�@�"&`?7"b'@ � � � � � � � � � 4m*{4ed7Y�#FH:"� � � �]…Eŋ%KeY3}`:C`];j`E�I꫃$(Еݻ>sk@�@�@,iwx'UV0#( � P@:RҥYr뮓7.HӧKފ)|]iDWAߒCjը!uݺp6@ HoE�@�@掸8E�@�@�@�@�@�@�@�@�@ .0~ncwk@�@�@�@�")`a*Bg-Y sgsyNA⬚5#Y�ĎQAC%K0֬ة'5A�@�@ Q,VhdZxdCa@�J8PZˮ7T3x XXڰA/NGZR(?ѣGBj#992 $JW6 � @ P+f_*� � � � � � � � � قkJ;J@�@�@�@�( l,͞-Y27Y-Kh^ԡC0 %Ѳmv%H6OOl~}a`ۥeˤd � �DO`sJժI&IGQ%@�ؿ`J^뮓5d6-,++ZM[M^(}Il̀q&�$� 5 � cvGnO{i � � � � � � � � @ ԩ#r曒E92I@�@�@�@�rΖf̐f,L|ypR ӣG$曥=Yii\)�ę@.gYϝ[T>[Ig/&E�@�ݻ[ڸU/T@�Z{�n)F*F5!KeɴTJQ",r8HZ1c[V߾IKA@�2 PT� �%Բgd) � � � � � � � � � P^(?Rn4|x#� � � �.mgNkH))R۶A+Hyxo1G�'Ф4utkIyyA¡CW΄� � @2 ]5,{I{'�mE�@ rݺIK(^wԨQ͑HK5hPv P@aJޏG@�JߎJ},-@tjã � ! Px2 � � � � � � � � @ yCsrrk./޽`r{M^,ܲE={RH{vh)^�`JMMmJ*۶to_e/۲[RV#_� � � � (` +LeI:HҢdz>yTV"$@mnۮcQڍMu ]߷͋v}Vm]{[?wh[>oݺ[KA�@�@ ۷o֭[ɖiW!6þú[V}?egoIo-}t4[ù@�~8LܺZߓ*i'ojjkg;6Cr}Q6wvv-][=NA ;WկU%Qs~ΝwMps{] g\jx.|_w e]7Bpw/HM>#oM-9s&{ѤIow߽>[.n[yl^>sފ|qn(�= eb?@�@ l`^  � � � � � � � � �q+`7nٲE?`F۶m' hmc<|ق6NvcYiժy:vݼ& PzF5k֔MnruQdK) � � � @M.M"M,M&F^_tQҩJm@jQ@�D@fm}ms_ۭ۲[wqs Jl}6wDT}v9Z{XP5맶oeC7n}q) � �-`AWXe˖iڵL֭͛ hwȖ^l\/FiӦL-6mڨnݺ==GC�@`?֗dB:%t}XTW:YYy䯧x[٭oxPl~"[R\ͭv,�sy HZQr^m>uZ`s75|w]pn|>X—ȗiy:ȏ/nlz+x|7/:aM�'`}K3.|nypCoݶY.`|n?^79\TQn]-7 }}Ϸi=;tQyy9  #@By)i �ĢK0MA�@�@�@�@�@�@�@�@�@ 6x7_m'i&dܲ]_ٍLv!kZ`"l7@ٍS%MF,w!SSSnr6/iRuRʂEns6/nj1.tl>w7 {&=qقCY` w3m[\1>ԯ_`W^6lПܲݨFA�@�@�@�n}Ia- aIJ=$'u,_/@ ,[wM`n<Z)׶>le׷m͛7]am7>nmiӪW^zm6Y=RRRJ,fI;Nm}>on}.) "gnέ{~ lsG^B6Wvݲ4hPdr� � f͛7Oג%K &KwЄV*++{=Ͼ;--8 WyR>Vf1^2^6͝;W?nb?-ڷo]K.n? �'`'G:٘L6^lW)4!-vrwe nn۬ʮᓻб1-jz]^ڶбɍtskMֿdSKʾg]m+bKIn,Hƍ &[7 Zʑ8H1ص۵amg}>o]lٶ6_Ͻk|7rNղe0>]B nkBܵ]]#ofgskm +7o!tnv]aϣ X_f7mܾc7ǒgs>3 7tX}4>7ݲ5kR Pe}>oKBB?oMyn^[ƅvl,]o{Jgn*n^ $�u � PJ~!V@�@�@�@�@�@�@�@�H`7^`rl[ݨZ,nu ȭ nnZb|Ul6a~K`f3܍-X_9^&MLM6-X@n}5 � � � @bXlɓh͘a.%kG#]~y0L H<~ 6iZ3˶)41SFFn}XɂtEےl`k6rnys�--q{nxjA]Kd}Fd@�88 ;sLM>OJe,9bIlI֭ulTwH~uKkIǗ[ =tҥz-?[cvqԣG/Iy?E@�+WԪU k֬Qއa}Ua%鰩cǎ:e O2nweύbu:\U'$dGO'6_}n6B%Z?Rf͊Le˖dc.c5 m/0m_jPc7 w [m_h+3Ǯ 6}X_[v7FaE$ .7nl#kD費NDf-vɽfй]Z&KCA ޤU/2> <4qR+/+e-[&LP0~1<^}qIPB#/j:{.4j̶]OKesKFA�ޒp � @q~~ � � � � � � � � � pvSfX|\3??vl,y~"[`Edms妫8Xhm@IђkkosKee]^l[srr Nak7 Swg)n.h�  � � �$uy14u1R׮VKc ?) @ XiëW.4i.ؤ'-(]$ ^m]x[S\? nis'hm~߸m Ã\ڶüf � �@y>S}嗲ݒJ#Gz}]R)K,\ ܩS' Yx4Y'{Ⱦ}ɵ,yl#\u@ ,(%V@66MnY6.gqֿ`2۶m$vɾmn}[srd6@%Y&(m={sҮow Jr x_um{],Mv]%Xl|kɶB/-v7V8KFfR]mr x|ЮX=vݷD6k 7u¾;@^ -skwω{<w7[Oku7Z}%-xVVVmwbMRѕ%Ro;wkrn Ml9s 36x.o[^nuw}G( P1$ԪwΊ� �I"PJb'�D�@�@�@�@�@�@�@�@�؟ݸy,(ҥKrmn7XH+}w0fKv%q q7o=XׂZ{oM4_\ErAlަMkΟo@8) � � �DGS^$;M:xN8A^ԅ �NY,Ф9`|۶Smw!Cs T6'wp;6=ʊ&BIV${F*D%T$)+N("ђ>_~q^993s~?Z枦w e[`gFx8]�"�|D$@$@$@L�h-[fĻRF~p 7ܠSPe@x+_*ϡGUVƆݨQ#i֬`WD$@$`͛u MN0LM&aqL1 $M*vVlmΜ9:-2aWB}(WP<"_iAu-G>`˖->7 oA�vC2Jߥpl ammkʌ3;e˦6w㣏|8#�sNq^^^{N"?A8'q!gx;\+9r7Adߒq=xawߩ�弿)<6]>~Sp{M4ތ[� � � � C51U"_}%RF89pHl*bT � � � � � � � � � � � � � � � � ěU0 6/jLc ΀Cpc=Cp; tFLnE<D;-4`Y�a8O [E$@$@$@$@$@$[b̙",qf>B1Ac[/F$ PV,Ʋ<LqmPA(b<ۊajSDJ&HB@0d@cO7nc]b]&d`<�7 � d>@ӧO%KѣGRJFn*_~ɓ'Ig7AFĶmJXN}Q)7'PRjJ#BC`�~g Mm!a\ cWVx׷sUד}TcKa a-0l+!RZreacLAE[83ѦTh y\aŽB}"L$.n;l3 .H⣟;~#oXxZ͛:"qݻ7@X2m5?Jة9sb͙ut/i0QkVb֊HHH E1syNiA^RY%                4T믿 6l) $cX|y)ёH <xP? o?+s H/&7HHHHHHH8|Xd޼S"Zg"&4o.re"9rσkIH F@?`A&mIEJڱl;mL2Z8O8q?~rqq;>n1.nv&fz1@<l5 � #@SL'ҥK5pk3ݮ];Bx h_|a?V2G0N:I.]nݺg=I<RZzZn_^ &A| Qg.[L$m#^6s3[CIjժzz¶)t,bLk_r;Uj |gy+01Z;n)|/W\HBo+`oaDV߀m>g2EܹS=;-G:<z`lT[DZZEQ�q1 @ bV` Sy >`?ZYF:^(>y jώ{� � � @HvY"% T20Hc� � � � � � � � � � � � � � � � D�vaڵ?]8 uf"3rʱ?SyNHTw%O?=F5d1$@$@$@$@$@$@$L S"Z~*bN1OLl7& (ـ6ll!$a%1J1V@ؿDPd]k ЪT?8 Ě�Ě8# "˟A7|SO#mzwge˖={Īp χ'Ol(~իW/ݻGeR1� E o)@ >s͚5*uQ` q +6EϔkI Np>Þc@[PjԨ!5k_KLM�E IzB 2~/J~ H'O㱘fXbt!@_A%?S3J8/"BJܓ(e~1~A/ac _$$ +ev1 o&qfH-~Bdˊ)D𳢠µ_Lo`$@Ag=IHHH $C08!2gH!7$tR $@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@1'm6YbiSرcgjժc"ؐ#Gב@@PQ:ALS/? g^[.$ʁc=HHHHHHJK)SNL7#.Ҭ)֭Cj̜H DYj\v�MHŋױlca܎H <v`griz :|K7#FpdתUK_yȽH%p � @@1c+b$W1kq8?vX?~vɈ/ V8TE@RH[ j=aSKCϩ_|NN]R%V�{XZ m%~ 6bs͐[3/6q*5�Ͳe˴?Xr^'+RU^]1fRȳ܇u}7l<]zR^=?8|@ ߃}ZA8ˊfḔ+W#-SpV� $$}ۺuߢ! *y# .V_Ez(^bܞHHHA=vSE:tHǎܔ@*$ rVHHHHHHHHHHHHHHHH FlES.٣WlY:踰&�^8"~ptEK.Z 4FuܭeIHHHHHH׼*t߰}{ƍ") !50 샀J+VqlV-c7 �ONX8~t}ȖbP!x�mIH <xP^~e>|:tHz! P!o]�Bg&Mg͛C=:bC o3 `Yx CBxG]hVRE(F닥$laF *{nE[V6kLń("ck"+bWT)b~;Ǯ]^VZ\bT+Yd4 ˖-[/Hw R]v1"CɓmذAM$k֬*p{o |7oT� dJSߜbRō:lB {SbVǁZ$@$@$@$�yGkWWs#H*d`TYY                ؾ}̝;W4,Y8:!%Jԯ__r/Bh }fY Cm8;sr9�άn      $$`bL,bWI|D:uiDR6U&HǏ ҥK5#GTRRNˮYԨQCrʕ0fEH%?8^"%0lٲM vr&=K$@C�AG!O<@n t~'2l0iժ<36qk̚@bH(O?ɬY?V?"W\! 6"E$Z@m3*9 C㬳2ߛH֭e˖R`qW]0{v5-ܿ?Ν;PB?x\i 3e VXg}Bwjڴ={eɆaleƍt*X-|=U0 5x5C!HE$�n= ׫lJ`7ž 謧V\)>;I$@$@$@@Dzv97""JI%               'NȲed2ghѢd *]tDb&$@ \C�EɁԉ Aڷo/_|̸ � � � � � � Đ}"&;ȕW ъYcXE$r; 6<| ;!Uxk7D�[N]b|by+WN߮(YΈȵ�"ǒ9� @X`gAdrwao͔ qwjUd+/V1� %JϷEPkӦM鬒ڵkϖ-ZH=Z~Ou.$mۦ"D{%=ի':tkFJ(t8s+!C<{g<̒D>C9s~j>+VREN;̂$  Z7o<ύBV}-ƐBvLٳG Bʕ+U@ "eX.@UV9r � $,[E k֬J<"[ժUKELׯ/~¶%*FA&g=IHHH"ED|Pቫ͹ $T20H*, � � � � � � � � � � � � � � � @I&YdH޶m[uʅC. @ݗ_~)sk\skHHHHHHH ^kygy1D8_-{!ٲūf,H `\ էM&gϖ;vHŊ@_3iҤ\ve?do&O$8aYp@H"[ՠAi׮\uU `<< � ȭj$ޑΝ;?O$=x0aaF-Te"/TzMeA]vɸqdĉ7Hʕ=5k֤`Om.! Xedƌ: UkuUt1qF1ObZo5"?{*;;O6ao! Č� G=}Tclh" ~AQ+U3s+|dĂHH ZN<)7oVE<XB Ŋw6jH.hU#SKA?g=IHHH|]wڜ@RH%ʒ� � � � � � � � � � � � � � � � u䭷ޒɓ'5 AGӍ;@޽[yLNJnݺI޽|m2� � � � � � @ } ?^d^1ADzlJ$OTE� $QG6R>}>|X7n&[h! c"Ȝ?.8k, m6]tI#)R$saC`< � $%=ֱc LO`rرcng}V<o[@$JϷ&q3gʨQdRlY޽VP!g"F�ω&MRA;o^맢):ᅨ-T&y6m@"ZwꫥZj>[_ x 7^yr 7wN;-Պj{Ҝ9sYZʂpnݺRN)P@TIH 9rDVZ}ҥKeeEM Ɯ7o. Jj'm](V' � � � "Pv97""JI%               pE�x_5k֨_Ϟ=5hܹ]Hƣμ&kN[7|mVRљ7qkF$@$@$@$@$@�M(=T{�p"_JHt$;vѣwߕ~Mڴi(W\)� $57ʇ~nݪzA/`$ߤ><D(# L>};`?$z%_|L:8ℙa2HT:x9R^5w3޵kWcKTcI @!w1cT61! ;0OફDf|Qy➿o_ҭ[7>T<lS*@pB3f{2`�wHo3ӵ-6jHׯﰩt2-$@&�aԕ+WʢEd޼y_8*:EB,)< V' � � � "P ,"O?jsnDIE <+K$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$�4 @u~ ,Y2~\I$<tԨQ*Uxq뮻LP!y)kN$@$@$@$@$@ C`1b-d*ұ�p"  %L5Y $$�uǞ={ԫWO wArΝaIE`ݺu1qIΜ9oc WXn`<: � D+Bw<f\YlڴIZj ,"E$d=Y)5TzMvAÇK/$/˗O,=z<y`y$@!ٳGm+,kϒ({p~VHB"Æ gLhSOɛo)˗AIΝ%GLM?P;_~Y:c̛7o4 Ϩ?~he˖M5k&mڴ-[ | HHطo̟?_Yf͚%VZ* 1… ˈ[) j"ܓHHHH cs*Gْې� � � � � � � � � � � � � � � � � � d-p+S|g~bZ}I \pzOҷo_yr'AYE      D#L1"lc`"& "ujcV'Qc}H y ڶm+{lذA뮻bZsYSHիW_|QlZ<=aɊ� � � do!^2tPie g]bEYbcT{?HH A*2 Cg˖-FXf Ŵ$KhѢjGsN}ĘQjO>ݔ `-Bl VCʕk̙3eݺuҳgOie&& H֭[eĈ2a)[rĉnƍRX1馛TlҤIQ/6mӇbZ }Y9 D$P@J7n/2o<փ>(%JkV/_UgR�R쀲9$@$@$@G W.3D$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$E_|ԨQC{9 8͚5kK 5QԱcG2dHTp!AΝ; fQwq:h i2AiȑҦMy'cYt,+o޼r˶m1N7~!S`IHHHHHG`nLID.LL83d_H%K˖-ucV`Qo9K$2s<;21&j?.M65s[c^lٲIndy:u,^Xھ 2X  Hp}WAn֘Gq<&').~ طo>F&T\O$@صk4o\n{o]gNv'p܏a%Bߕ)#WnUWԩSG{ 4ޔs%=_~nZx پ}{zs) R[vIV7+#3;WL1˩[pTRE}dٲeҤI;q- ę@,65۲mwgHʆ gG}Tb$ZZr= c'tW DJx+W,\]sa|{1/?xXKn;ۡoh֬){ úڵkˬYy{V VHHH Aȑo[@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@H�8C hM6iO<Ǹ9#+D0u8"̙#g4'Ojٱcʎ;Ns]~7ovO$6_As N8))+#ȑC,R S^xL0!#Yr_      %_b~Ԫ%RdC-&`H)p6H f0/U%d˖- PB1C8N8>;=p?��@�IDATw?GuO?-_̛7ψpާq%!-Gmۖ(c=HHHA*&qWC:vȦ,ZH`D;%BnX7ӦMkfnC$@Q!tRx(YdJYn2=uV7n 8qMr_A{Aq~X#ApXM9W"aLɓG xqaOmFDG} QvjcShj"vz0h!zK˖-SlWD@қw,Buts_Ϟ=9/bywқMT ˧~e  DHdgoF֭[~13=yr%5Nk!~>v?[>3ͧgFؤһ[abT8Wխ[7Q5ĵ 8D&_H� � � @ y lA � � � � � � � � � � � � � � � � � D?#]t#FhzJrh+mݦZ}KmjEBnA*Vi|zR=4GzĶ]t\Uzgƍ[ Φ<,vg-9R`"      ػWL7RD)WN5DL%ɛHH ;&;vg}VB8pMaÆ鷆~͈oӧk�%KDdZ\* XR%Q\̉HHH ` !+|GP|1+:.~r AT۷oݸ � DG}$M65Ng˖M!gd*wydsğFc͚5KwsDgϞ=ҩS'GB?~y<RժUeŊ*A3&F/ ja o^ʚ5k``\ ;\8y!XH; oү_?y3eG=.Ձ+ KJ~zAb9蚃N޽ O5d3̮ˌ(Tz7r9vT<WUZ6l0vvyl%bG =fƒHHHH !EA8 � � � � � � � � � � � � � � � � @@P?\/_._~yµ11y1-=0'x ZٺiL>Yh8gE?t5i:;w +HHHHHH 3`{`ԧij?1> F Xm۶ʕ+%+dzGcHSG3qΞ=ÕW^iF~L^6f#$iF,XdHHH+"wu.\&1Yk[Xڟ]2d knwv$@$k֬Ν;СCGN;-"F"xc_EW<;~M[_~E6o,Bs֌| Yɓ' 0oFOqׯ_Yϙ9r]v:!0&^yiT_z뭷ŋSBP0ՏW"/}Hwܲv#O>7Aw+m-A Jok5oY&RnxFi$Oio*URw}W^z%i߾;v,들bXm   |{1)L$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$0a9˖-#զMLԩ:#ć~NZҀpի@g۶mrw "ĵ^GQg}z3~Ȏ%K^(-\P?ynҥKiР2|pYnɓGz)#P^n=zTF!_%^xr-RxqO0eYdU<i7ߔ۷K5~Pp]@ýtH":M>]ۻw\tED_bL6MVZׯƵO=|g\D67Hr05n8 n/lRn6[LL$p0uD{91"AsΑaÆ? �PݻwKK.C7H?8~mC/8Ajj� � � � � � D�4#,FDBre1ŌɈyv̟H xeÆ z4cƃ٧dz9ķ)CbŊ"nq~#Gfo5q &  J�Gn!vX J*rUWI&MܹseҤI?K8qBرL ֭+̚5KNv*5@aOHѢESw@߻ b2 r Ϡ-h3.' }ځc"%{>&X kQLڵKm'NbS=܄}&ڵkզw;vPqmإze̦3-aFkўٳgˁ06]=C﹂~{^lmAZj.ƌRZ4Zx KվL%`pH\]K`k=rH}.Xb5*ܰl2_hB`#gk]CCl.k}$lݼ95ޝ`{Ā>zWtاCa)XOwP٪9h޶c""q'z27uHO41N6B ? ++H <>37=Dp"9Wv9\ƎC]úן`c.W,":3h۶m^RB9sޯ_0FBY` gvD#JϽmBϑO nܜ n仭C'k?5_{E ngܧᓈvz{-d ԟ; lC%A}m2L<H3� � � � Dm9NɒQ,Y@ 8g h                LK899/!oo4ch7nԩSGG,rL'駟g&86F(MLP}e5kVLj9ƙ1O Lf˖-VeF)Us:;we&HSL8:;Fɹuz˓>p_;˗/fԼys\rq|r8)8;1A(yG9s洛%pcS#pp6lu=z%KFBq̌ӡs1g 6q4]o#i1Xw}i-gm'X9~=,Z0NC\veq͌S@7c-r?Rvٳ1>={ )X;tӴiSJJ$@$@$@$@$@$@&p{reHj9p>qNtȈHYl)٧dz9Koo6^Co-%c L$@ׯc Js0V @kہ)l `PR%o߾jbxVke6N|馛tA6lc>2B-mɍ64턿w!䅶jCaDHVgDTHلz#duٻw*O@*=4cw؇Έ|]5Lc"i٭[7/Oƈ\9>+Hc,{ 0oF2Y]m`'Xzuwj3>}Mn1t%D[GeEQ<m2#8pk\As p.&x~MQ'۾4+<kη PW 9 ;γƽ*q�lD\U5ks<͛ő܌CS`A~ƍ;xBr>SO9FFtt݈8FL)R\HcOwP٪9hhBsHw][#(?#i{$ X%#ϥNx9FH'x39FM3fn6ª,5܎^=p1{a{cHX57q3cٕ+>A{*ʌd ^NxP}yy7vR~b -{\|^׮] =ˈiܞ;`ː"uif cx;8)0 I$ 6&    h]1 ,y@A(d                6YlP?6QG+2nݪ t!yuB8F 8x!`wN^I LpП:u.ۧO2+Yv B^pC.\C@ bTBPY&86-[V1D2"0p2Lq, &Fm|A͚5?~?B8arS΢Et!``&!h':tg֭[{;jm'lrm"M x1� � � � � � &ÇqkpmSl @b8m98Klxfil W3vYg9wua#cd sgH u 7B"W= &k|# 믫]w;w XA-н{wm:nlv߻O< 5f0)K,Z7kG Vwp` mo;.#T&JϷ &FLn4%R6h<l 4mӇXd7px'VP !<m i`[SDn1Ct,j}x'QUViȵ=S 3ؽ{w`Ëbi6?8oqEbmNAsvdeڟ' A}0> fC x\(۷OK 1Dܾ <X/?_~ٳG=ͻ^n!|m؜_7l1 :[]pƌz !b3R-#VSZXw 2UƂ<ClS5gu5fj 5氽?1"+�=]Ca/\y,Sdr^^nnxܞnލܴ-T5p=BsH-eʔq]}vݮW^?9wáj$5OhN:%P[ jLsA3� � � � DoSE*1k                 $SHOe&ʕK+W_~ųO?#$aN+1b"6ӧOGz;~YtW*={&SLf͚y<xPM&ur<,AHL`$-Sl 'O,Jzeiۍ#lذA."1b_8-ɻ+X!M8QL0JiԨ'pZΞ阩Vg*U(o0Xƙɳ8Y+fIvFMFM QRD )_?8HƩ\n1BZqrs9Gw̍2N{_[,Tvi/wbk%RX      0 2bȋ/yW;ŌQd0cN$@$믿</{~sgs<٧ù\xb=.-ZTKť,HHH|׎7 &ȡCԩuja<0 ؓyLM_k;SbE.1" r1~? d1L( lV{vZZ0'v6`S{.`" X0Au|+e p}L3z9~,ZH)7M*)|L�s7nk !11MfƖe{z>edv`KlDK8F,Hhuw}_q8%{{G%\_G+"{c#j(=vQ >\ڶm+իWO|B :MFPK ({P~nm1ml?y7687oNrzゲ|c]?X\Cɛ]~)lHM{ʹ瞛朊Y.Ğ_ |`�o?k8o޼}17kx cD?=|gc4e~ !y*5ֿ`lΆ{膧ΡO_w#>4Twq3b'wgjS_-\S6sOlj<5[hNof;V&9l& � � @|`׮Sew"bSJ$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@B >A ɜS-&M$/:EOj$�NrHX+}v> <k"#H^z,\P A-8T>#*ju'5<StiNDHfe:Ayfի5kV?K.QG-[ʬYt{ΡXLl]M9;Gl(ǻ1^0^}U޽g[ X6z&<~@Jz$@$@$@$@$@$@@^ySyr4HL$@$D`y*T(#Y%̾*9lu<wߕ o s[LMHHH A o9 $k Ӳ>"߻ d<7zvyr 7fѴ T\qHA�6{֞_,ieϞ] bS [k{ Gl:mZ[Di]_[Pm۶w~EK%bLOŵ>yc/jĭp'AX_U Çv ,~qktYǎ+W^yC#Ի/}o=6Ի[+]g_Vv'6nwjҤ\Rf̘!wu|wZ-ZZ\,O4�X%״Rʏu9-rM77,c^5k삍{zFjZw [[&#]vc|@<z`un&P:k+hebEoIO}&ʵ]1KiF$p:� � � � DcIǏn--&                  ( _*!Q~y7d̙ҭ[7O]:,_|gfJ()R$^zIFd/{Y1/ҳΠl8h Epcw'SN2w\ѣ@ɦ03 (c[u|&=:MI[5kȱc|àkڵIk׮&MގXX]vLv;ˍ< DƮHe|HHHHHHH`;1qoOc(bPih C�cugSdz9<Ydz'TA-߀ePq̘1QhżIHH2N�td<s6ӧOwz@S {Ur//}G$o޼jb-#tjSR`q � D5\=Rdz :MpxYAri=<=f(N/֖0Q]@>/r_CT;ڵK '<ƌ 2ЪUOTWEI0IŶ7nO<Cfe̙!Kز(ƳѱI&}eSWw?i'F?ܼӳb<>СN/ !CH޽yo.Y p!&ץKն{zkfN)7)!V$)p1H_>f!|˅2<G2׿+eg4M]usŚws'=ךm8LP-[ٝ@J� � � @d xь7m3e07                 Ȍ{9Yt OLkC)[lAzl3/RE խ[{ �Ą hѢ&xb]_Lɝ;L2E֮]Nb_ܹӳ,3{u7̑#:ui5mT ,>|XyBZ`N8%G1eXBn-駟6's?ꋄ:s98b{ Hn;C>ly䭷Ҳ4[/]Xo¢tk`{'Y3?      WE?_̸ȣy|bXE$@dɒE=2{�[bgs<;#gr2g_^v=?h3Gpo|{uD$@$@$ f|M*[jU{ܸqr!O9K,1,feEMpg@. B̄z;ڧO9z kɒ%uUV&<*Zv6 =_~憉HbAJ*jGد_?6r(7eDr<I&C ,<Hg~HUD9nX؋*UJ绱 eӉ}m #VA8 ܹsT<_Ԯ];xc}ùS`⋧۶ͼT5bn*O=TBAlBd߾}j'o+#Dg~5s0[v_dϞ=j?_kxo?<6Y@Gϭz.U"o;vG-ʁ.G!J>yo[|,O>מbQ<yĉ/|xC,N2 K'p1H^,PV(uց6 kyz*kPsMwp@z7 P:i3:T]P玛߹ךwÙ饗^ˇ!4(!   @8x'|g^y                  T3F owooxRGDz6 δ BH\s.BPF.8!�.m}…~7] 'BPر #nV аaCyG4e]fQ/\rtݺXN?2^)PG(lҤI2sL䫯RiӦIZT TC68}rA0ڽ{"kWng租~etMKl֬9Rnfڵq?o8ch<iƌ`l5tP-V|r,GpɓqZziVp63p|g@AAm8nxShshz|q1� � � � � � $?<%USzxu6Ғ+W5&Hm~1L`|6Qdz9"wFI5Xu]'X AeQGLm~HĺN$@$@$@[T\Y{Fxw*�}Q @�zG6ve޶N:jo{믿.?8VɬY^lg|)nO0 B#F͛7Wa- ؾ@89v6.AX v57xczv$@$aÇW;C H}&ϦMx`IL#Alj[w|lZpG$b"ӫWV,M'|m FD|$_dmDñw{>;v:>zBs2zh=NvW\ Q 1<8X2ݺ 䈔-+RXk6GY3?Vcx0D-.bwcˎ !?~T`A} $߇ K`߃;H'n V lW-`;GbZ̙"[n'xn6~ǖAh_Ş!0's ヒvsI|tZlv9na{ c|"#}!o$_~9׀b̓2ǎ++VqX{긹[v|}y Vgn]&T50}>hLp^`9[='H^k8_xw˛ok-mb B\L$@$@$@$@Q Тys2O~8sFPfI1&0buV eq$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$E8;9stnѣ^k7keҥK1q\~p@.;ӝ1ΒesQJX©QFe\{qDtzt1NqMSzuEtqFse&ȏc8Ǐw:ƹ1N9qE*qPtgYZ#~-[1Վq*&-DO< ^ر1q\8 -/"89g:bLN#lٲ1di&܍=`fLx裏"E8`h`8k֬q;<=Æ s=)J07h1N H,]T Vyuàf6㠭ƨM cm P:v옃cc\T)َPzk�w&      #pc @)XqzqNv$@ywrέc&HZBAx6dz.K|S�u]F1jvL[q˙2\Ǜ%HM&H5D[MQgc`l`uFA:/^f/6<S- 6#FXDH~i@^ժUsV\6*\yw]ٻh!.dkQذ,+}H$lBTj}f݈ I Hۆ g8hFHm8ŻnwbgNvٲe}( 1b4?R &oSfMՄ %lKzد�NB#r搅4Ct%D[,X1Qm-y*UCw{>HsOL`Cg##Į6UV鸑2 )_Է[o^y>w"$<?{0{14ʖm_tA#f�C!ܯ/znv0bN…u$6mZ`~xŸ:@6?4Wp{~9R}S/YDq48ojW_}_ĪX!2.~KQkvOn# 6`װ[#zW@ܫs9z\^Cg u8c,(ӈF| ^1nw{w@m^_ڈ;M4{;KWn]}}9|f˃]s96Oּk?>sx* %ܖL_u\r�<&    H'1JxD\D֮)[6\J@WE}TK=:� � � � � � � � � � � � � � � � Jqv�/W\qEʴq=&lذج#pP+:$[n2eʈ Djt7NMw߉qfO2Ad8{FJ5f1H#=W +FpJLp z ~&@.6)8Dqb4(T9vNpN`ohp}x'[XV`APBƙSȘkwV;l`bHrdĉb^e$;K$@$@$@$@$@$cǎ%"Z 3<D$@IE`b0阡 &cvI ?xP8/PsE(۷o{W>#y;L3~30@2-֕Hh۶] )P@ 3_<)R$`{S a痑<k4l|4|p}[|\z饾? d*|{"UwLC{ݻ E?+9*6sN1+jDo{իWSO=%F\8,p, l cG8~WGof!lIݫ.6^[Q'Æ }umDQc].Ϙq|1"3gGr&C�$:uQ#.;f{pcFPQgϮYfkHcCExU͹C`3͉۔={ FoaEyw@g{h#\cF[]'oDW_ p[ňp&Bբ^#aK#uc]CiFpz=Ɉ͆["Ps7DrSmB>Z3zOhK"^kW_5#,]oYCכ)xHÆ@mV' � � � $`T' jaG|3016dܹf$R Ar$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@! IuСsI-Gի܏&�Ѫ-[ �#|vAXעEn +3S[3z<,X =lڴ]BaIHHHHHGhDر"=&FX[L 1bELL$@&@Hcƌn5d[1uI9xG4Ƴq{l٢Asu;K1b!ȴ /?_̙A3- dzq8UW]%O? <8qHz|lZ=z6gZjU@#<R϶s/nxi\3%�ʕEY "&3C8 s1'D*ܗ2/@@6} .\(WÌ3[NigqF<L7 !ڸq(i¯;v4q9 HEPJnMm۶yH)%p$q ¼ڽ@hѢ2h }7Vp>R9#   0;&2bDp1-dk]̋Hnby Fa܅HHHHHHHHHHHHHHHHHH@ dϞ]nѩYjJn6iܸ1)A _|r=Zn-+V Z9r],+3S[9&p:u'ށ ,Nv܇HHHHHH NSdf>}Dx@D8UŒ� @ f{"ZF_ ay#XZʊىwi<;YΟ`G;w\m۶?\jԨl7#  HgLׯ/ڵ9@i2=kf1ctYO1$@%p7j_1u'l /҈2x8vڕp"x60YCO<]VΕ+W<q&lƉl*RŴ$jT.o&Y,_Sn㲌HRZމ=zT+k}*0+WʦMdĉV8 VXU3goFɒ%gypxo]!pkk-[R\+G/;ƾZnQw SJ8ZLm vjg?~c?C?iӦ2i$+b&& 7 � � � d6�7c)) BZ<"&Kf#-C}T_R5l � � � � � � � � � � � � � � � @*زe<;H2eu& Nf-$@Z뭷'[nE)B>$@$@$@$@$@$@ID`#!&3ψkL$@$xhʔ)+ի5Ʊ ?gΜ)n6H r6(?~ xF0<C!*r;'Hړ� /7JfͤhѢ2m4)U&?E >\.` /HĈwN/REdĈ=:tѮgTg>ڡCɒ%K6*Ikm ?~iH pAy̽f@ܥo߾2d)VXrM]IbDj<v3ֺ˗˰adҢE ڂp2ƕ{'cǎ  !}8+U$_^ ^xyeȑfҺ{s$NJB/K,ѰaCiժʕ+lMb}AĉҧO}䢋.[oUz葎\if$s'Q߽{̙3GEy?9py.]t%J݁$bE/1S:PP+) � � � !PnL͌b .$R Y~$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@x;VF-;v8"X@6m$weʽHN�ԩS=ήpBkV8�Y     H {<Ij f:< @[Nƍ'&LCvUd+_|1!HkM$&8~(hԨ9> 0ud<gq$@$;w+1cC e1">@ybT2! JϷ e@ߖlٲ;jxg G ~)r>pG-[&W͛Wnfu9묳2bqDZBw#,^^m 6We'OA_�5jd6lo&&C |I8qL<Yg.7x,Y2%" f͚%3glҥW\SLġNx'1@(ٷo -  f* 4mʕW^)pq^��@�IDAT{n(\� Z!�q5 � � � ʕ"kg,YD[bE1J"9sonM$JȲIHHHHHHHHHHHHHHHO:#)Sȑ#ҢE i׮jJ)J @8"P%Kxl߭[7 37w&     =vxSO@+f0\*ua$@$(OU(g邠M 6f͚IժU @8p@͟?_w%uhuQR%epfb r6H 믿oQFI޽g f֧n3?#@u `- @Z|JZ(AW˗K*UsrUWIʕf� D�lW@SNUQݻwr^N3όB%ܗ-+r"]&bV9^[٢j0n8w+_eBf͚I!4M>̛I�!a[?P 8ղeKD` SR5?~\`Zv8qBʕ+'ՓuRJOIv� xl߾]VX>L"7n,M6Uܹs{LPP+|~ $   Ud$MUʕKS'Eq]ƍH aA@eEHHHHHHHHHHHHHHHHNVGiӦ̙3K.͛Gڵ%K,Q NòtRuZ;w|Rtii߾tAVHHHHHHH s}D 9.gkkL$@$ n6{leƍRX1iҤlAh,{2� #G./Ei09rhVZI6m^RfcF�� @BBQ-:tG8㌄+-[䮻ҀH{%3$m* jyM2 aPy�+.\cǰU n_ѢE8ee<͛E^xA䭷Dv@")STgժU:MC!_|(Y� #g?Μ9FIǎWp`wX|̗_~+xdɒ)ˁ #H}O\z}ƑWח H"ERHZHASP+|vܓHHH7qW wjsnD I 0+E$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$u'OԠpW_}%rRG8G8p`$  ˖-%K8֭[KժUIHHHHHH |b%&س~I VHbH`c>(> * NDQT%*ɀ"bœf|9{3(3YQD |7 ,&|ytOuu*~hF۷OՖ-[Ҟ]DŽU!PvqWmt 3TNReze:gȳ"@^ Ϻkt]w^uUث8%OnA=z1td -K׷P+(~z+F׬Ys]'SiҤI˙G�"O>I /mH$_(쳏wn^СJڕ$TL彗K&0mڴԹ?Cm۶M%qrX}K0^�E ̝;7u0`}]5Jku)Ă RÇ8W_}_z륒4o\N@ӸqcUZ5_o@6]G,еM60T� JLBN@�@`wnUI@?4* l%IƵ喒jO]{ %d@.u0r6@�@�@�@�@�@�@�@OF(xz kkNn%,2eJ*@| W'sЇf͚- `j} @�@�q~BU+֭s|=@>s 4($SԩSUF{U*O ymUW-a P9s2:i2:Y:xgN,Wx�% @L4)i{B{N%&ٳ?prf?~n6=W^s1nc&e@.]SBOg曩9sw;7і| 8ۏ;xIR6|su%sδ!dp]~;,0LyI_+`o8p`~LSZT:(V' @0d M2z$*UTIrR3ΏQVL]'O'7n\oT{V[mMd{4V̙W# 8qرcSS'% JQF�: 0rŜ$*( Jo;@�@� $@*+Hoh7%ԭt-G"] Z@�@�@�@�@�@�@�@�1cFj z`8z� ,HꠤPʠ݊:*'MPA~w ;;Ph:uqf@�@�@�"|RJb8?oN8AI"^ �p{a͛5\Snm*`RSSM"RSF+@fNjuʔ):Y6mRm۶LիW_ry+*@< @ 8M7ݤzJuI'=XdixulI{YO9P@dt} >L H%Uqx'ZkRI{տ7pÂoorN`>|6duQN<שS'5l0w[.$m4}R)/0k,<q#Gf_\[l5k2T~H%[裏7|k&iRSA?~*q͘1c'qB'!ld[ `5m@ ̞=[_}K?>U=?a99K$ lL6l9 >$*1!Vx' � PJ:(`"q^{-޽:Kv-_ K mD�@�@�@�@�@�@�@�|_~%5q{&k֬FɆ DL͚5K#Q<Fl$?/H |&'sPO̙UW]UM4I lw-roѢZA � � �,s[J7K_Uf:@ o-ZjsUWmu. 4[o8ܦ]v5cXQuuc'pıcǦGwJӖ[Of5jՊg+ K-@<RF@ pЃ>(_ҥ;8Z}ճ~e|}ثWTus3<SݺuKȖ`;\%V*:th*iǻ۸~ON馛jUV)|A<@ =ɁݷrĈv['Iql߾}v!Վ&H̥K/ IC/,x4wTVbVy.N0ds3gL]C7j(W\v[@8+3]&M{~שw9aSL<i֭_gE<qFvuқ7N|\XcT@' Չ2}]TđbdiӦiʔ)'NTN?6|N穫wз#s򶄄Z*yjm3 � J J2*oE>lHOH5k.A SrA] � � � � � � � �!q(|$X4dAR7(E?(Ӓ}Vt` J*E%uW<N:sl8ӟwru=IuOhn5,x  � � @6 t=( p)y RW� !4f̘T,~yo-\ojvpԭ&3()NHeb1s3mmڴi*Сh膚7J*nv;Ķ$oE<_�#�UG}TojԨC9@]v~9|Jh^s= ~cQ=Ra,ȥ[jcSr >}ǩ_oZiN~jNEA ܦ4uTr t[ϟU>N]r#S'bfqG?$SrLz\R2ӧ/N@s~k:Aƍkq/̗WU,:qӹ91ӯJ"{t1h[9ZWX׭x7y~7` Rɵb =p) =kN7ߤH{<*(8u=Md� JHUz;މ� �+p)JnIÇ^8 ,tbCR-w  F@�@�@�@�@�@�@�@�k}?$J&&U P ۷\8 edt)z@6z`9іKݺuZH|˃__e#T@Ap`%.ϱ8P{ڰa dV� � � /,~@ 7H'$HYl� P)s{8ȁ ȭzŮ'TٳgM<95u3W:ȱk?vӭ*;}|_ YRŧ+l)ԱNRd @Y$@ k>IPCV[:u.]SV\' ~_Oo_~xrAWw P@.]ߒPC\͛JJ4zh5jq~!~'UշbT߶Od%"E+(ϞQcvO:~xoիW/<YfY: jke)pMW{$iԫWYe9sR}}Npº_.nuۭy_S'XtB8#53ǖ8)/wSrWLݏ=N3k֬;亂OՍ6(H֟䜋ɘA\Kp_߮wS89Vg~yQ*w$*%Vx' � P@&i`>[b%!7$*MiIW_Mעx<srA樲% � � � � � � � �!!i%cWTԺRم =PՃ!ȃ!Nxy2 4H 8z PJ=587K8ӟǘAp7&@tğUVY[@�@�@�rE`L3^=V6iuse@ 5Ʌ6Řh@@P=Mہ8 nyw28O1cF*`V믋7mO]IbUߟYV{R) T$.f*lTʬ"Dx�K,C�U 'x $lF:Tk7Ի+zΝn}$V~裏4({whBᄏgߪ:EA�2ȥ[Kr%{ʔ(63QD*cǎ]? 7fmTuMWǧ؝wAݧ+c8;wnUVMu򞘌݉P86ԋ5'9tuRϞKoAҔsϕ?+{O2| pgo%Տ|>g?:{yen8>gh^Z쓿/;; O{{[{9w}xϒnᆋqmNZj\%#Oyʿ3]ݎcZnݺK%s}%<Z^~#|J~K= PXD�@�J'ҡ*iRj=t!_c$\ HtYZk-}ȥ:@�@�@�@�@�@�@�@�*G Pؿ6z`B͚!iN;$ZmJɘ +Ozн=uJnt'&uFW6JVJ VTp\xz=x҃*=+F@p4I{`8S@�@�@�t<H4XԥK+G�eY 1Pg/L:&uI=-`n1O9- 4461Pj>1(yO.@U\_<8$8P5*9Ő$H$mv]+jXO  ׎(�\`ĈDwo%}M#N;Mjje,Z( ^ ʉs$Y>&g\۵k-[-/}}yƍJhd-6󵤓9W oIU; L8qquB6n@N4;9ǩ5\3}g?e[mfZn7r?K'`wr6Oc2v]Zůe&sÞ\J[l$R &RxCc(\p#ψ <u}Ol7q[rLsyy (+{{a>7C)x=~>/C6j(!Q[~^*kǎ~,yL[EV9Iv1d)F _w^sU_N^|~w_38~իy  V,%zZ%bE � s5_y%}|R:찒-租n+tH98S$q<ȥ � � � � � � � �ر{I߾:gsɱ9=28(\=`|bKu�R{5p#CˌOI8b81_^jԨ88mL'Z � � �%HOCsΑd%q5 @ $1MwO>+Q_ԱdT(Nbq>]'iwYf\,pɹsjl <3W'xH/n w҂5=}_$KB%qMr7$AؤC-mz ?l[ [�Tş}6$J>iC̢cQ[)~ N$儹.w6ۤnMA}ݞ�Ngi̘1:~T?'~b�+K׷$ԪNQksD'Ș:u꾙#۬jժ  |nG3]/(ygcRlKrxkXkN/%>X2D9׷KO/n<p2 q焘8)&s{vzYkJn WpU +1J<_x{W8.#w +bu|Tqe%g:3?Ʊ)iL Ni ~ҮNRP((Ϩbz,຦|N8N2^�ΟՂ y:N9Hd,okر,? Vk@�*H`(eKWnJIǥ#Xp[#H;y`-G%z+,^@yRa � � � � � � � �'- ؙ{Or-uWE )SŁ<p̓8d)Vq[zQAy`[wBqS'r<|uſ  8=˵q@ԑ>HA�@�@�@,V骫~Xn\B�&>pI{|s_un6ٹ`;=x[pc7O`Zj*۲c{Vݾ68v 7$qAao;_~e^Xu{x~o�zjm,LK7K}M<=]}#ˌy J H.gfy\<lOȨ �&!%d:�B"Z=:l*&'ufm .~vt5չ󚩾  /M �&MJI`'wR@wX݇㬳ҵ^K/2vu" 0& u=Lp;nfz&l nw_>WilJor̘l|J)m)}>ɏA4=c_Y^ʼnݶHmn. 1wur+i, #=sBm>-xcr-O}xN4bx^kԨQp9Ni_~>q޿b-x_jc2Oc<3N}9Ac x6^{ű.S?/q1 ׺{S#xߥE;rV#aW.ycq.8]Xx_9~idXq}\}?8-;=^To1?G(ɴHUzyjގw"� � Cɔ)҈Kv{9ViZ (= J֭C'Νv4fɼȥ+'@�@�@�@�@�@�@�@�*[PwkBNB`*U*{K3kAqI〶ySQ2Alyb*zkjR8=`ˌ`GFOc-o?砭0>_Cd[&- |y-y; Ł\q>}pX E@�@�@>T:xi8+ϗ-XQ $faHIA,חhmQo۩cv $mn.:(׼y[ == `Uǀlq mضnnuu[wȫꀑEUo&;yǿ{1Yy?swo#m1gaS;}yq{|t5R߾Re SޖQ7 u%6{oi}V/Bx�E0 xHw$N>Y:% #*f}]8uTM8qqrj6 I6LIФ߈Ca׈j_ :N=>"M^-߿Izӯa,N�V6jԨd<N?t{I$<*E owمZ!*:(;1S4 ++qͧs` m*Vy&UsiYp3>mqϡq>Kv2Ncd?=� 著/ n?5m)egYnTPoKݺI7qr퍂 {0| ib?x#׈S߿wbQ!EsCQ)sAqަByv焂Sߓ𾦟+yX;Gx|xwqIA�_{1iRaӘd)0~ĩۀ|͹!1nw}/ xnߡ8-j} S| {>.=~#m2yʤ^7 &LI {=q $*#Vx' � ʝMwI[|P:%v.~W_z+$rЗmBr-oAi(@.u0(^J@�@�@�@�@�@�@�@�Lp�يA LE iݥ.]B2-yZЖ>ϹzZ] N=*}0V|;ΧN<h8-.8(.2^uuԧϝbOյk$ EԀ/H+yELd@�@�@�H~BRV|R@�2O૯$PgR_r@k-3oڢ$޿z^zIyGիS;s;8۶  +8$ۻc[w68}Io|*i? iY˴y6pOc{ƀp�rnM<eA94q1WIVziCbCQ,ג}r";|{`F‰X }ǵx�e-@�>=1rL+J{)vZf=HgkW34s 4>&}Vv_ijL qb$+VT/MyucIbI= \(@.]ߒP\|bxmTqDU1Hď͟N997?%-X*ۥ|u~nI ysۙ &M1KlkrSl_Ju?OA`e&L:Kի%M-ɱZxoxn4f} ^F0 ~(~~d&"F Dq~οbis |/?'w+@A�c~=PP͚}$G3\:!by=]*;5_wSgZ<8-|&mg.;9c>7Z::ɱY%Z%5/?>%% Vɜ {U1@�@�pp ɴ$GN~ۖIqp 4I8P<8tھF%?7.$jJr%V� � � � � � � � �$0w[믇DZ}$؍F!8hխ[I'W ʷҧt!;mu̷"� � �$JK}&tt9a\> @ |͒YNJJ;,]xaHբE|;E=t:_H'\�w8Wg֗|k7_ip<RIP<0>%_~#FH}* (TԭtAaJ=y@�L9WCߘNN>Yd PU $ۚ?<"N91@�$&hVvq˼KGL9I<@ ̞bw:QC'~ſg('@]vJ]vFre  PY~ҷa s%}T:8_W' hYPc$$ʂ .d6FN=Uc%&) J Pkx3 � D'aä>ZXszwL)fkam0uԩzBb-I2SLyL@�@�@�@�@�@�@�@�^qB^ }ڷ<AM7A*_|Qr?uZ6@�@�@-SRY3Oƍo},@̑ <$'S^]jN:@m x҃JW\#$Heuq�1s\/[o--]ye8,q{F\|uPJ>]Gz)l#'g%Y}G�@ {f }@u$cG驧kΓn=oVkȋ�U&Vd1I9{ɴrز;%אLkr~6߼dU � P&]xaHH[o׊lA:ac3^Z^Kg҆fv5 ]Yޭ'Z@�]/d>>Gy%*u֑t 5>҈a-Kдzۇ; i#լ@�@�@�@�@�@�@�@�XkzW €=GkWv&ֆ@QI$+uj$`RQq@�@�@�G`dBp/.߼sR@`"x'rc''r'i'i5oq_}%ytecJuW顇reoJ[n)=t>=$^XSTt~KKNDr(xRn!f � YC>;᧞*5iY}}N:IzHHٻ%Q/$K<TRɎ3� @ 81…a PvXk%sQ_ےP@�@ >P:o': Z c?<jE:7s$Z(۷2E�VL`{9F�@�((DYt7PwE&*l isggϐy8ABGagp~i~8kL@�@�@�@�@�@�@�@�@<ϗ^}U:0XcGפ <ɉ<9*ao>3+n^� � � @ <Ԭ4g3NTA;Nl "ntЫ]}vBY?n)<ɴ>\c0hc[oͭdZ t$M&9aX_3<lXHذ!ȑ&Qto%M � @ sHkw{o+siK?ğJ[lQy潓 =~$:� @,# RRap[KxyeҤ j-O@�\G]~ԡԠgٛL˒ZR6>HjJeɉ~) @iM@�@`7KHCJ5k.y\u Sq[݁Ɲ?"yjԐvUkof� � � � � � � � �^ߤ7 A:_i<isϕw@@cޙXE%1Tz.1� � � 3gJ=zH#)]uos8O <jTꀡv7vM:餐) tD6oM;X6m5ה5ս,~ΟsK.Z9FZio=|:}SOI=$5l z|d �) yD~ܪ_ ע- %;Hr;8իWOgu� @% <dH~MyFWraIĉRݺZkռ@�*C`x#B2z'9U*cKn1֜9eLXkk1?;4[UẄ́c@ [Ȗ#v"� @F jT{M!KQ-?݁<W;V1#̯tRҎ;r)kuQǍ@�@�@�@�@�@�@�@�@l,a<RZ}頃&L?0UjҤlwz+:�iX+@�@�@�@l^]jL0!$]i,KA�*N< ԲtR͚!0՗_:JʵdZ�\ߧGIL˟jޫZ> $0@rKC2L.pՑ#ѣC2;6Dk/饗?-d �KzI:H-ZHd|#=hv$ǐ]NVXXcL7&?9=쳹 @ t͒8;Z&s瞓v-"M4(y% �TJZIU[ɴ,XV盋+޽ b?7 [Z}z@�Dw uF=s-~C7#K?/}RÆ҅NGe~ � � � � � � � � PqIHl u.M*9(gKGA w!C}GG�@�@�r_ =>n・=>Tj>=D�rA`ƌ㤍7Ƀ_K. A<>ACO9%$ʅ.l^xAj$$OrT'˪yYg] ɿ<äqBp+|@Dotx8it!K( � _}%~#s a>5_|!::*b ~q 8\Sr|(\pArΖk :4v}D� t )䋀}:KO?ȯȾm7) � YgK vZhCs[d6Ԯ-bBIJE  P<S ^� �\7v.45Bp^3~;;K-[J>+9 @�@�@�@�@�@�@�@�1a ~n]itRzX!{mH+9p;x-@�@�@�LpvG YxBU+mB�hbڸqҔ)'KCHsH&R撓 r0CB㥫?}4vl>uj>V81yLQ^]:魷#|cý3 � PU! uH~kl*Ӧ$+yߊ*o^3ߞ$# |� @% tS$A`B=&oz@�[O81KUZ+~uvB-4lXHձd@`y$Z#� �ܩ]6DGV 󯿊x" YSCipiBgئMb@�@�@�@�@�@�@�@�@L{S2`Ir s�#Γ6޸LVBhV>S7/7C�@�@�CZ4aH#]F�2\_7ߔ. |gQ~(u.4w4`J:fkwzO=Z+KϏխ+}.a\<ږtS曥Q9Zx忟W � 3fHW]%`XE&I^*mav uV_UVM"\:Q>UlO&?J&ݓl[>>� aN(^a PN燶󧟖^~YҭZs] �E5Q}*'aՒ |C^6��@�IDATR<8ŝwN#~!@Y P$Y �lù;ת]Ni#=LxӲt!N;ATž'@�@�@�@�@�@�@�@�@ 'Kz|o.(c'K]'5iN B͚{صO+v^� � � @8񊓱r�CHmV.b �+(!x{<sҞ{Je4{Gҍ7J]H+kHJ@[ 1>ys>*Ugf( 3KNbl[m%rw=s!~i%"!|� �AE/8 $Һ^騣^]gn\^|Qz9ap]k|oVOr9etI/ @ tSؾ}m@9 ̙mnJo� �+~=޽M;ܭ*ߵKB-+z1'L(_[�-@B>~l= �TYK+N< VNý{KÇK _,{l<� � � � � � � � �+,ࠝ춛4qt̙#k @ӦҀJ%ZNA�@�@�@_j\:4w) �#h4bDHYNDZ=&5j{z$H7qeҸq!TαĵvܨرK_.5k&W{xv@ˉ6$lBz%a@�|HCēfIO<!M:T'r/}4)TIK1o`Ꝫ� @ -tbV@%o;>K;X?_r 7,2x' �ӤI% /vڭ3| +ey'/ի'>ԩep�9%@B:  �/J;J[BI)\`!CWj6tH/<� � � � � � � � �&'կ/]u@@?|tIR͚ٶGl/+иqbN>OW#� � �T5n%$@wBQB0!�}I$9H.;zoJrP]?@֞KrBHWCr .V[-;z]%'ryR@WZ[m%u"qſgla3B5!� ÆI\}Ե4f4htR깫Pt꫇+1EmE&={3_|3 @% |6Rn :4}طvVdZ. � @ev[o焙_&NL\sMelJNiΜ _mpuޒܮع4sfn+G�  V6 @�2C3ٝyW5̌mXeF !2y6@�@�@�@�@�@�@�@�(N`ѢoBpO>Sr{]AŭFB,3uPSrQe@�@�@�pݥK.nAW[7;D�rA`t?9&o8$?_첐ogN>YrbJ<Y:&pO6�4/Y+LaC嗥W^IXMJ/(}að.HSzE�@ ͓oE CϤ }hG1_ʛo~믥kj { ,pu%IaHA�@{g . @ <xۮ4xcXۢ) � Pno} /^z?t㍗'؏I ~b3amNҪIƜ.] ۀ@& P+ۆ� �*j}t}R*IY6 >Z:`%Y l0 � � � � � � � �y-믡Ԗ[J*yλ`@$N^#P9 <I$� � � @y qHq6� `ٳ矗N;Mj+i%;:4rsϕ5#mOO?`iNn4ztHv;J|% 8Hrǎ{?|I[;V:CIJN^>sR [WK_@�pn^t9!Hnqr5}\=KqGQ#i5B`q!Rj$q3d ꪫ}G�@n ?Wʪ@? =zHKeח}ܰ#~[U!� KMi@{z!M6MW^ye(kB-חO` 氳 PUK^� �䝀D7o.W~r>jդCЁ=g@�@�@�@�@�@�@�@�IPnAtSΝq>}NiOV2KA0o2k@�@�@�xAC ?47ΝcO@�7Oz I [[O:TCЯ9sB#m^JS XP뮟K7,#9d3hdKʊ Ԭ)_Ґ!̙!ۭbbR׮8gω) �dSOvf.Ock ǥmuV~[ȉ<re6ȦIǫbrFf� @̚%=HKcJ;K@{W-$Ԫ@�R୷BZZ'H*믺kuiiM6'r|-o,4ztI~#@ae � ]r!KJ:"Hڭ> g@Ǚ"� � � � � � � � @tJ) "x(2s-A {I<IO}a@�@�@�2O +vN=USzmi3o;"@ [, "w`nݤ7ߔvYzeilipΝWֽ~q1:眍+鬳H>GA~)[ #F]&謈@j:/ŝv.@r,  �"0iRH '͚ui;$úޝ^Xw'?xſg@�X { ' d}ڇ ?7}/ =( � Pw!a|\.ϺKyCɾMJ>+=THZKxPZyxe@�(\࣏V$~饗u-<Z:xBv馛J ޅ� � � � � � � � �e/@ٰI4ujxl~},|WO0@Q#7  � � �++0~ԶkI\#93@D7,u*ծ-u6n,?̙Ҙ1}}}.ƅ i0IRp7o^Z͢,w뭥 6/2ɴX9Z[5)͞oQ.}Aێdq= �'pԧRFRҙgJ'|&LQ=N8۠ _vܑL;L$Y$ݾ � P'q@% w_gK͚Ƹ/ro||Y* �QI:0fWps-ܒi_:?iҝwJ^�KĂ9@�S%3wd)[ wM6P#?L/HzH@�@�@�@�@�@�@�@�@2 AC ɓSZg2֍@ x|:;K&> � � �'!IkLA�(@\+pTn~6A+-= J}ងN.xzGYOƮJキ2KQ >@SI>KLK*p Ko/[w:@�*F I6?$|Ei駟OCޚ$=؊٠,Xc)>Y[ne*W_1DA�@.xPxzH*RyBJ' j.sro,@�0KUr'/UnL^y睷yWZ>N|1Jciೋ P�=I@�uW_ܑGyGt\߿Βw?a @�@�@�@�@�@�@�@�G~f@&NDZY`+Ox}WZoTk„֌� � �  r ,5hV#�%9?.}Fa%H)]qgҷ*IOSJ'ࠤw!5jy|OדO^X_&Mnk@NҐ!)+/Pj6l4cFӠ&HN=P{w)%AA�@RIHݞvK:0(?Wwyzꥣ:R7V>rPRΙe=]tV[moV9� @ ƫj d5p, 3&$fw_w__~*= P|Y: @ 8y}ZZI[$7Zk̃ ;9gNl v 6?<([x � r[ � P~I#I'_C;єw#|{y&Լt!gE � � � � � � � �䪀ԥKX9vl >x|sRCƊ ֈ� � � ?(tm#HCl<l3TYsI$ImSNoN?]}ϖ٦1اԴ h.}t1'h뭷VϞ=sq+|vUi _uNpO?z 7~)ww.x $:da) �T:kn)Ǥӥo6<lYgܓ$x* ښDm,%0p!ROGjҵ^_@�2xiΜleD@ m[nQPZX@�@ >Xj.if͖5U'\wHRv]~ i5BߟurU � س �oIW]SuHݯԻw8\ $ZV7 l?ct># � � � � � � � � P ?oK^٨Qٮ! ;JZH" � � �%0n\&7b4` kyI-ZH/q4d}I:N`Uxmq#GJ:IݻK[K>]wēw߭?P>VZbxR%|/+@![o믖->*y 8/KO<9@�H.9S17H⊐Lk(&:JrGI]'=zu衇'w)>UVYaXI^_+y@� 7M7I LV[Pdj*S~E:X3훾~ZիWX �#߻*Ra'GѕW^!eU%+"֒ߴt7KNFA�H) � @~<Ըq$;[o8dY { ( � � � � � � � � P>cJ:H^*]x4zԥK"@<7&M€A � � � PŵkK|"kWثx _CSaNi}BR]v^yePDkWS$`$:Lf OD_C$%6$f}Kuye|_ҽ^+clyq 7\`・}%ǀ8묒W"� "C!?9)|#wԬKs2N;-yCztA-Z,6mL VM"#_tEzꩧ4eʔ!� PKcHk5Y Ph)t?^z5A(jՊ *U*v @�\/?m;žΛܯZKO:v<㏥/jqf/@�kwfygåN/zU8jm}QKӢx@�@�@�@�@�@�@�@� ҝwJZI"}�իny WfMA.;vBP]#KG�@�@�&\{J:KJe @8GI7Ƭ: -5m*%9ѡͼJu{KW^kQ>K7- ÆI/qO<1I(e+16].K["[oIW]%]xaH7k֒[c $$t=,@� 8gJmM0dHH6/_$:c=&~/I6@R#<R7\@�pҡ=ZKGV $dZN 1rԭ[lxg嬛"� < v~qQqGgy&um2[Pk  Cĉ/< @ P+1{� @ |ԣv;N+҆V<*p&L|y@�@�@�@�@�@�@�@�V\AK3$rp&MV|9*V{_}Uj&$>b@�@�@�2S_Igb@Ǝ}8u[/<>yr!P-{gս{$xa|+js~=OR!EIIG830 裏r rKCYbϤ-Cr/`fc:1@�X@I]cǐ7.f̐xBС/ZH'pB' /h+<I?_?Ν[ʥ6@�B2U}]*q=.dkw�%G+oHUy@ n=$;\^q_r%jժM</$*fJZ_NA� V~o@�Wꫥ-Ɖ*Pxy0u;S@�@�@�@�@�@�@�@�@`>XjZr@ߗ.TRe@bjԐ^~Yi'K ) � � �+0eԮ4hԯtk#@ L$tRzRӦ! :ט1'=TZ=CIr#ӓĄ$4/TG ڷ:JY 7.oڴi RA~e_#+-РaJ/,W :>4|/]U 8ܬYᅲ=@�(6'xp-꠳o%}Miu+ :V=Իw{ !.H.Sל }Z%@� tԶMN-aÆ]CƏڴyvB,$ԪL}֍� K7(wt!}q~2_׍ɛVvm]?,iPyrWZ{l3@�N{ ?nn5h7N:ʧ ]/@�@�@�@�@�@�@�@�xIiĈ0`W djI/v* [v!� � �8 9zǎ6�dwI>+|rH gH~Af< +&ONv' WqX+~Bk!}de҆SN9%IVOW^ye/♕p[dJVvq$ޟӤ *{cks^@XzUio'|K/Iz۹pB{z.h'{.MB3fHk-լ FiJ.>T.!�䷀+: хJ'P+? ٷ/ m}hOv?LiKB, �'p5%H#s.ҮMΝ;/y o3'vXtoHRZjec@�@ ]`Ȑ0(G[7i)M5_Uy+Pk`$vƍ+o' Ysnڦn~gW]vL˃( � � � � � � � � P:[n;L:σi( ժ) d~/PبQr X:h yqS>A`K@�@�@�rxS0vn`Ar^!G�*Qয়BPsϕ5 :J3F:∐y'!nFrФ.L\pN]qKez{nXd 駟ZZ͓.TD1jѢ=?ުK*" $dh42FB$e!4( 2e EJIPJR Toyw{wx޽w=>{Ͻo5fN8~8'5zԷS[VqJ%V!8iS0Ƌoߎ[n%ujn]L$HELɩO?�֬I!?O< +иqcz뭦!YDD Y AE$vR8߼W}#-zVhղeKrʹ=% fٲ9Y5ؾe;LQꪫ9H,\Нauxgeѣb\iZ[C3L.,ch9aA(\p m۶e~ְ{Wt޵X`;w3ǓGhhU?-|ٳ3 -7OgFa",dِmÆ mkE@D 7 �U=7b{d6.71Q4(7EIJx Q6gc{6>\9y�0^7Y'˯9~9v5t/O*LE  s/4Q=zᱫ2qD<)g􅵽9f==<`j-Z@V\?Ktp =d ̂vxۤ?g1%[fւ@0 %H]naR9s`h N[|r<XdI2駟bv8)ysbD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@r@•yh@(ZxE{/9GX72qJQ C5YoM9?رcq':#8." " " " " "(4CN�dC1‹K20+ş<8T`_,Z⦵i#{|8Wn@~0j('E);y֙_ƻ1lذ:]9<q@ֱO/[Qē񦼾F̟&M=XRfN0m^/fhx1xL׉ۚ5ku6Y̤ux'y4ҢIoapG4V(^ܯ-yZue." "N.T )C]wL=>M:۠ C0gG&SJO^<>994ؾ?>Ν .EyVAh߭ȾE{~Nϳ@^Ѡ]vOj8DHyanh 4pf/Z wg[0ʖcX͛7;ӭmY Z`./<WV)<BձcGPD#G1[M=fYۅ_Pn#4Ϭ.e eiP,i\`?@n G^x6_ېm7Ɠ0*,Dm+Bp>8iÇ@`Lh׽ f Pp~ͭ5'n UVСCACU%((}OVMW�=Z|)qϐnj~ju{'tkܰgϞa8G}c\ AZ֌Cdѫ@z-3zū݄ 裓OϖleT/Gڵ3'Bnݜu]"1 hJ" " " " " " " " " " " " " " " " " #p=0 p;V{$?wE(v0A/Vk5j�(twO>q]8*OqTWt%s]ϟQ8=]%�f ʔ7AL5G|w晹iwOW^W\%z1/ƹSN9ŕe9ѼXbܔRfg˙=^pl V\"˖-z(vh8\q7p@3,iB`q]^?Nj25^zo駟lNZ<5i!$C:RO_rkEӦM#&(慠$" " c9=F+VƮK ^ӫW/\tE<b{lvSGH,)˾Q`fJlRėFHErZ/MhdTbEzAW~V}D؆;ѥK]&V ϓy-^4~*cr~{ QR1YFV\i:`o:cųJ1'lz,cB q饗?VN*Uބ 3du-c +;83ǕlLW.6?2^CPm&عs:_OP@HP[n 5I9h2V >KS[zw 'UBD@BtUBOMn gB  f*Zya,�5iXv NJyA8/ =Pg*O#PGKg~\6t!R}CD@D@D  0#aN�E`.ZNd'۷jWAA9}==:u Nو@ 0dL|2mP%4%@&u5q_M`(EB@7@=иqcWJ*YܨZoݫ@0-z*`^+&"&4P8xPX˦:S#`H@. h4&;}EIVemܹsVsXZԿ{25yyMM/2z-<3{=,cPre5 ժUC3~min{gR0Y|Fhx}~!ڇqvg9ǝ4=KT47 $'$ e Q2f 6oޜ5#*\2D%_ shṳ�̙6ͨCW_}ՙM4 M63S^D,[ }Ϟ=1eמ OVM%N&MAYg*a^ѐt}\s[|'k*U<qHw<;h~[_m܅VW1\*0Ns+vw  όej<'X2nٲ˗/Gn\uQQO" "4})ކ\P++mdR U晐i?'3o>[ݺuA<+D Wun?r @߾@nw۶m.CZAjhk)h:m;-XL8cֵ֛!lLsh;ay}DKD@҅@t!" " "VvKm?]Bie.7q1X⠃3HtRԩ4hQMnm#|;0]B<k׮]o6f%;u*y^20sl33]M)Qx~ܹ3֬Yc:ӯŋ^pB; `�e<sвeKo\`/<ck1�v.;b1'" " " " " " " " " " " " " " " " "5 + 2}VD }0Ŋ焆֭[裏bQ0LLC:u'nj0 MbC̸yu9܍v.md `SL &( ҅$CT22$&>6AnB� j^{⾓̕lO;4[.4 Ì3Z*1s%by~Gnn/v31Dqo*šz p6-ZVٳ"!S@KݱcG7:xKm^uRzE|c7n.Ri8lYXߥxs˯bkРAnn~p.B <6m#7h00U OϵG/~Pvfu5k JS&P((fy8} \z)(>(ijgᦩ_k)ޟNN8zz!b]h}4@{9rxT~},\НN:+L56ͮ]ch4fgeQW^s?g%6_ l\l s;.؟f9׽̜7n+Vpu2̈́<HgĽ`LFp!_m42p۷o︿N9,LG+sqYg ;M"DžoyiM4gqEncx~P]ꪫP\9 0`f@ " "CO<)\w hGɀq4ѡ`=N"i>q0]j0HHsmmr(H >z[3٠wga_R'ۺkbnyD,{A=g8T!_rmUN鮻�B6mrcl3204bbCGhűĸ &8xG^bz>\8r̘;kutrЫ@ZA%Hjy>y%Kz^jI]] yy4Ygk޼7o<O?,+S[_>},�Û2euL[γT^f38#w}פIO?+V̫^yf{SF όv zPޭ ./{8udpg|wuW>,゙ex6Y?g\ޓO>YgA/]Z(#;-$9C=|$/'" " " " " " " " " " " " " " " iJ`r+[2M+jD%Э=| 6x{wuy=&2Ŋot;ٿcz&M8&.& v gB1L`)#Ѕ?31NτwCWkYD@D@D@D@D@RGy6N<~5嫣 "⋞w5W?GCE-Zx^~y‰HƸx=qTR0yvj۶mF8>fYg_[dZ9eMm;L6-7t˛:=ýoРlٲr%¶m7dg=Wټ`۾=>쳞{ӧOw󌃹ĜkXd<׈6:;(g& ƍڜ2l}'<ﭷv9w)k{W^nFT}8GLvV.ɗ^JOO(`Ziɒ%NL MF7^ڿR@@U"  #@}>H׾ggO?9ޛS|O4w}b]mׁ׀TG3'>5Wg&K/UP-|<73_>G&ˣkd)Gp{D)3sxj&ffaGqv0P*H~ff*/ȓzR&f춛Iv.PLѣGm?3fVǶkÆ ݻaÆcN`g)4^/f|bt357믿YB /whlOO23K.vlBb<~֙Bq&xgzkn| 5tjώ}rD"&sgHN53s]D#i0}Y-X 1;$qfBPmÓO>3W&ehچ~z?v{.ijϥ d F1T'~L=\pNǺٖ m<J"[l\}utM]Cܒ"q=K믏]{&mKG^o_ӡ=Ԭ{ u03`q.7LzegcEשSV[N�cBߘ:5ʖ%2lJ" " " "<wA/y쬤Zb80 ׸E ɓ]g |N v(2QKvȯ̙l5bOqA +Wzc'U8[aG ѵk` 5d5t6Q\972g=X:l�j3gtxnY1i]) Qx" " " " " " " " " " " " " " " "}խ뙩MMz#"Pzg=0^iRA(߸7U,^|ATġZb)X'}2Z*tE@D@D@D@D@D wWg-|tUTxB@41yژ/0jfs0_())JKfqn<bLTP6˹.0Ԋ6<zseZ ջwo 8ז)M@1uό<ߥPW:++㠀b��@�IDATwΝݺxZDFUge6dI&^֭C֤bڞ,R<רNjڏ =:svV.GmR 'x޺u )OxUA}h ÿ}{w"V60q?m䌛;[zf<yM uf1vOwL¨ mDqǺ~[hbi*qX}46<sf? sx=Yz'ڵk*2FMAbZ4bO<z=w{ر.s1nۗ_~6<lv3c3뼯)0,K`q`s/P1Dž*3w _ŊMYf BV3W_C>4L~7iҤLB,X%ksO[C-jÅ:Иo$4umPUVc$m}]v"݃mH}̨" O;!WyOͩf<>%  9=vٲe.&7!\pNǺeO ԭ;;cjrjz#@?naڴ~>}'؃2gjgf&֊O;ǢxW!Ƽ\Ygh`.#-",d+Q~D@D@D@D l ԯ̙ԪtŌ@N_ / !q' w}o6cg,.Ԯ];QG{{{  gl7 X`֙{@0,P8c_D`ڴixlٲm@ 8;,0fq{쑱,ؠ|Iԭ[` @:u\Ǐ2e`ܹnww>jU`ɒ 7`LRڵw%J" @UW۶^kmʉl޼9L$,cnM+h.Yfy>:#.b+͛7gi8+VX_yaΡNۀ}a} ,"8ՔJm*+&O?S]O;͟ lSRQdނ5ű#g~& l( º&+& Fj21ṯXc\ۯ_?kY-0/Λe٘D˽rNСC[oaXh<H ͟|ж-0iPJJ/aWcȑh߾=�]x"c]#fk^uvQx-L>ͫߖ9/SRPAʕ\쇉S!>^hjص'abnތdkڵ'N%g&keFD@DP`gVa5i8a&Rǿ{Y 3E񬀧OVu: r@&3w^z89J>^Aچ&NsRX3ƌ/ܭ1;v,n<s`{tn;*ET⾱''R"gIA9 OfV_Lfn:=5k+Wwźu\?՜3g⧟~rW,3{^z)x <#x饗"f̡va;9CXfl7ٛ1d)[MZ;$a ؽ Pa'_ݽ9Sv1`cVaj*\f2#E=.=mCj6VJ~󷺷SxrNP6 Wdf g+3s9LCSw/Xw<܌uM"?p=GSSWDV"8g} [;2z9C|v<&|n?G ?ȥWmh%LOH^`n|.&xvCSq+q+$"iT-&x18`)aur2W׏K8k|胀EoȓtRhmYucW2ã/9!B X+<]LS-jX'x"|P3< /ԩS]x֭]+Ѓ5Bà$" " " " " " " " " " " " " " " " " H7a'(4k>U:TsUЦMIg1x'NJo\p;EA# b 2O*:QSID@D@D@D@D@R�u{ O_Q_҇;,h<?0amm+u6wߙ19H רQ#cW+!Xo51.Ǔ(r2SĵN:f^/_^Z`W@ݺdT/> 89Rٲe+ 8bLk,/yW<F/4QiҖys`_v/ /M`{2V|o=4sÿOVi1%?&ASu]NcM6:i*" "8{0S[iycGRT0=4Dڼy3za=|72&ɼyVk@JCz ؟bIW}8 L8˖-s}͕1GvZ4:rISx'ZeWP@߉}*ʕ5|խ!JcZlFUM`}}0Ǿ~헑C kF^|pƶD-`ŋV?@ \Owle @_-N.yM~N㏰V3`3  E}<H`3چ,Q9׈#}lذaμ1_vBP~>9LOK4ʼ;W^LúŋlW2~NA9*yEW/+_H. y&өy3s j͝;炜 {{Ls5zU9@6dj?Č32ƽXF}Y"ǹBSU$8ہn 9J߁!J-': ֹ <:]@>H g` aՉw;c 6O ^M?S*UeA'| amٲ+'$1&c$�VfA>�m۶&ߪuf 3 WȂA/s/.Z%"P {/L غ՟`2&M N̒c7neƖ8'gQH'bE!.\tE&fjJ" " " " " "lږs|!W^??+⋀4΁[<ZӦŒi|-'x%vSXƸ+lͫmذ\jS Ƹx?Fka9KҘ1cPZ5g5{LfPs*SLld;y&$ 期.N48:&Ǐwb6lp"3h׈%5zq_# 釦W_}ՍԵ -K"7+} p≾|}RO19|`g COe'qƹfi1y&<&L� iCe'@V˗} ƺ=Nl~ ocRdž樛6mr'; O"}챌ѲBch*HqfQV4`[䩧¬Yk ?dXJEI4NMA=?ܕH3PX841~sQ볳̶s=!wq(Uhfbi^#on/tS–iܚD}-ƠЌ)'Onڿ� ,N-B`�y0fJa1rr.hmC'yOoн{w⋸˝z0&vB(-�OI]5u~i uws +_'w GuuPɓn`1Asrᱹ]O_E"Lj\�3+#gRc3=gd5frn[Xũo*G8o߾裏ܽf͚ǾB5WZ}Gx]y%l<6GD 4j%(xA/rg.`" <6:u\qFAH/QD =3 ;)ț}%]r4;\4:3b./ /sub� _J, ϙ3'# Pb -ج^V_ $`zn0ܹ S?oނ5)&bKA bc9!U=CE Dqh4Zz5V\oݺu.?CD21H uzT ytLV̴Rᢩ"Ӱ� M);&LZfZYqqj3SxV&M7tI8)t$q1q+ϔbqq;த%;`-t[^/бF o!.e;G2m\\sk|:>ccEh"5I1HsBk?ЌM6Sz~aײ.r0^~Xfs9 ϫS\X1޸qcz%Z_Nt"< WE@D@�tڷ4} / |)h3-0I-P¼|ihodu BUb;.胅i9>ZcŴrxᇱvZwy1Z05bHJlD06-})P)H\S]v]^)"o) {m|rhJƾy]42]ALJVY߿9>S`-bD ^)x 0\aZDQm{6 9rP" R՚`{Z6ƹRL NK?sK0>w Gdi_"sOKVμa%Jsg1qb{&$nj IU{Zf2#|wyz{wMԩ[XC 9DCx{�7dcX,쵟@2%(Pg{^ʞw7mZ%ONq#C8oVoY'kРg| ۽7)^=yv1٭_hQF91٭[`{ޟz= ʞ Pc\mo޼yF p+]gM ݶ.,c%\Yy{z,x={tHf-ܒ<+R :ʗO" " " " " " " " " " " " " " " ">ck_3yrWH3Cxy>=3qa|=r)F0L;o̘1= 䙐S\;K}G.K/ LʫQFh$+<V-ϫTl:5k<<磌ck/k /lh'' <ڢ6hUȓ9Ve"L8f\usp)S<5jqΫ't'e3vWX˒i,ϳ*/U{v3\%ǒ3qvדּ3+wx"F̫I8?e7cvլ/*N׭[8pWJ {M9A;1Tf2'3s @g~Ydr yEA@z�<D@ذ3m<o(ۼ9Q1ի5l=~Xi"kMS{n|I0llKSţYd.o%Cݑ,UUvnߘi*RX1[=$}W{ݺuX˸ v:N+CȕVkdVޝw鴪2êaWc#D}-֍"S{cWIm.?3I^}Uޛg,dofZ.Ʀ,x )ILHp]&gC%I?-~^xH1Ѭ _z%w f̫m۶n]<Xj2Nqp?,qx nGK8K=1g !{ޞ{7*뚬#n4(@.;~pY&d!п)yo<IfA3|W3Ľ ^-e#l-[soF�!2RWy/^30\%=+@`zS&m`MID@D@D@ =OΊY<oW<3XgF-m#�|8^N^jUO);c\gCϟ]s56xPĭ;"9f.[zG,s 柼C9祀sp .2k׮Ό1ࡦEH34"'ip#-o޽?\O?toƌnr3�cǎ3 ߺC/ (6/'" " " " " " " " " " " " " " "flg#gZs8GZTM#ϤV^ طo_'0̸?N<ݻw&QXoTHa2R8(XxOE7%Kē `^-f&yGy?ER!D@Ҙ�łlEǔ9l:޽zm*kʥ`"J/\Yi X碋.r_c_lGz .̨۝|M)>8aL'j+8)E9/?|'rd*{o^\Iw}8|g3qpřNk,2k ͫtli޼5I%%ҥx{,/:uQ>5JRg <o";S GPˀƇZ?pcΝ;ggY+sI@z�E@"ҵz{&O%*ÿ:xɬƺ79V;{4zCѣG&hJhl߲7q3<`;hA$$59sO?m,#a4_Ҝi*O=sM4}tYN3XϥtP]iTirgz+VݜرcpCx 7 ,wqG95Vi(y8W^8>Brs &XP̙ezsdeFF=L2Y>n I}-ŴD2_?d rOQ9o}{ 6,h!^o֠ӧzOʹ.0Lt̒Fې o 7w1+5IWؕgʵi5^qbnyLx@P>CwHzX%Hq4:.15uYMRb"u#I6m=]#=W{u' ^ݝVwG6K0 xjsYfvscg9@@VH(@ض F`W/H-C~?ҥ_F"``˰@Xh/yaRC*Xpˎ6,x p2O+ eD2Q\lpgyƍl2X+,h9Sv۷pٙ6M6 ~_p*N=ЧpE�l,IID@"9v;O41LqA&#ҥK[د0`SkX " " " " " ԩuoɹfҪ@oOɓ?@)' bɞz)\+Of9÷~ je1& ۾yf7 21.3a0Lʋ76 �~^ϓ>h7w׊M<35™4M)2ebȐѹA.6^9*U\tK6-[?| ¯TZ f>^e|.Z^ݴ!Cp:LD K{20|80{6P}tPl'ِCۡH'O4+׎Z73O#).AnhJlo2cbx4r?a_Ԍ_dY h-[iBeC:lŒ3I'eGyUm&ƿ`VV]`Ѻ!c@~0}9_^iSਣC,; kgO?TX>Aƍc!i3VZfm;!G&@ gS)M--­—_Aubܲ~<"ثALT(̟?4.k_j\WR"0lpp�$͝;מë _Up6b1o<=3]]/r8fRF `D32VkA ژ,X&MX)QjeR!E@D@D [[s睗^ pnLdĹRTnMעN@~ T�4&`ة}}cz7,^ TƕWD@B`X0н/L@hEs֭#CD$`ڡN>0К9ZZ͚#f߻wos=)Y*i̺]wၻ/%&ނ Kvs/WoŠd`o3MD۩ Dc)b퉟x>bJ" "S#5?[<߾lɔt4awr'['i7FN4b[e(bQ +W%KtfQwFPKDlڼ"pᅻ֜F55w iS} ggj>}sXtzqjVB<$jQ" I@`z{= 4s s6w$$j曷Ƹq[? @ҕ8y t)16୷L*dk#D@D@D@D  Zc8~19+Ud9p+JQTT)zsȐ!.@C" " " " " " " " " " " " " " " " "4˫]B۶^&MqU$$(ϛw4XaIau&aAsQaoE:TD@D@D@D@D@;CEݹ@z<8h`寿7 ) Tbrٳ'k&abh׮]ZUvܸqvH̍O=oA/>?8IݺuX Y{M/D۶mn%6$-]Ƌn݌)n烛3 �'ߧ3/*%RVV" "{4~_re[NK3/-ȦA2ލp=sR%ȯA.7=kc8?.B:EH%J5kҮr '`}u+�ɔD4Rk>YTVF 9U1<X5ʹH#x~>}|%QN|DRQw_CI�qMGoLk6L4 mb\=OʪZ|q+V}g'T)Ox*pu@U? #D 1TDDu3Ouʀ3 aZMV.qD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D pcs WW Ҭ⪎@B L,c<U,[6_}[Ni@(rH;xBfZY *-F�.Sx!Tъ/Z9f СCz6̙�B0, |=Lh7ТAaQ G,V<[[!.F+W_m{6iӶgH-|$o@AgW/C|\;N�q/<4U1 U) <Ёظګ(Y>9" ++_v-[n_g}\;HfZQ1x] $yw E/~Uϻ(gHae4NR*@<8{o74͞=۵WU, q>^]~�=(]xE@nd.&" " "(pi;\�'�Z箞׹GG=a�^/~ΕD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@rOtAeM7͛=\rμ)*׬|9@͚;iID@ lݺ;vرϡHx)s{H GnHwW'쿮X콷?/U4u<#ҟ-@2Y嗧}SfBeK4i bRVY[8∬ڜ}I uT"dĉ;:p{̌ʕ 2tj1[u̜yfO<'t\H "?GVdݓG %T @ϞȑO?48U&c@9tiy&зoޞG@*P%,#:dXkl\71gJ\:u>??=Z.~:?uQ%/R'9E@D@D@ ?4j.3-^w3D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D078lm[ॗ.]NlEԝ08g-LTW(^N<[L=*tݜ@4GFQ#3hMD�XV-bE_}8/[ueMf۷4I ;4riew(l:μ/tO&c5k/ 4;I3&yo_D@Þ#ƬZ4k}`Jࡇd"ŭ"Ν?R`e8H" "lMfZvm ky>#qŅj" " �W^>L> LcJ'pe?ZG$#:$UQD@D@D ̙0`䓁JHYPk<@9u뀍CD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@ 큮]af7SO u˔LUh6-}VD@HS^0mfw&S-}4D@D@D@D@D@D Ah@1@q%%y3 �\�|9p{Z|4j+E`'Iڵa&;w;ˌf'!-E"м|)vO.uMqƌ(];w*ny}r0A tKPe#" q1R>}.N.P}8jݻlOCj1sJRUicF�]>%(h+V�]qGA&_ӚϹtH4u=<#GMRr-כJ'pI@J~^" H@ZxUT&HK�-[iRlV#0}lXw\ٯ<(@:`|M7 d2f޴z0T\ŁGf㳚48嗁m"-" g/ V7Uy(\D@D@D@D@D A7yM`DuelD@R�h)Rϱ^Rsn~8xW߶^)]e>,X�8^7=೅2e:EZh XX,-S(*q)Κ5;k`sa74Ks͢EӬb$sox10lz50d@x%)n�dPgK.ņ rU<dU(/*t[5B-m1v퀃z*mK7{F+D@D@Қ5�4p~8)3P琓4{㍜cD@ L" " "֬Z�V .^3-^PZ^q>m7@Zq#ӎ" " " " " " " " " " " " " " " " )H`&4F�ƍz+AU yg|:X`dOa&90a18o^" @Z0lԮ]} q(d�w: SO~:BD =P̗㱃fG9jxÀ#UEC6m|j~ 6pyT_�?oa)Sҭf]#8_=LDNM&Fiv2ŊQTH"|\/�cLf}o].F6X:0JqVҥ_;@a'@m2%HW=n^ݻk UT"p-Fa7ԨpjٲTZ*sL PkWsa<…ҥ:5UD@D@D l sP;~Pm� Cc|y`#D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D ^ 4i|@v~9Y'e& ?t6P.`9~_5{9jot%~H^1?kmU/ l P'7Q" K'ڶDr<_?dI` _g `hK}䭍Jn?K楃7 ھU� <i/J󧙆ÿhbkn62ʻHO%E`f S7A*4=jРpPmGz؃xŗωS,Xf*[lD! Β8?}1ĉcO=T5߳4j'" " $0goz=)I2g֭KҤf5ʔ&MJ"  P+3H�|Ai9= C}*UV(d' Gl̚Yl[W_Z0W/`2߰E `XZ4wnב" AͲ{!Xz%jU-D@D@D@D@D@?RSZID Z_qqj�5z]ip+u4ARxufMWDJ19Evh7#p!Ӱ#p@`Dz5\2ED@D ''r-;+4-uEDsx qcZԍܹ /_vUlTbB@ CL7.ǜS*k7k�j^|q/VJck:?ڵ6Iz}ҩsVί(Q9CG$I%ϵPID@D@D - �W�]jZT)וVP+gt@rOE0g;lgy)bt!?Ӧԭ럛b4DMy"AbذI6?iS @b=Tf/Ј_(' Х P/FOIw̘`w=ڵ%蛞W_M�m_{-Ζ5֮.\M 2ӻ#P4:(۽{/'%ں?xcD@D@oƏAh=b ~%/E>Uƥ^7Nj -[d* t0D@b`cb)Js&sOӤB9F:998P@ `_/~V]}VnI˖ԩ@2x#`D@D@D@D 1(ҳ'Я\S?j2cѢD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D  q/I M4: EеY_� r/y@9rH;@Æ-"%KNUR/4:-0}:Pr~Y4w{dJxzs%JGitF`jرW(AρJ>7֚2_ۤIG)t8H`H }6mr[m/Ը_t,ncT'X x駁5k� wT}F @ŊOf5C=^zd̹Y5̵ 04h�ŐE *$3jWHe�1Ѭ(4} |YZ-@ s!T.Å*4Y?^Z߇yމ$7+rNp@rFZŊ*4;oo׺l0M=5Kओr(haS 8:@`}{쳁[nIZM!e Rh=E@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D Y lt  tӮ%}m`wݖkLDY~o^yxe|իW^ t�x`^]y$#ڵ RbkN Dpc}$c T&[n6��@�IDAT 8@jM-.s]͚=�Meʤv=U&y30h0`�P<0nЮ]rYKM}=o?[>*^غկ4Sw⣏k=8){xI0@l4}ٲUW]Tx!EU+w3N;4p u=PM `ɒ%f4?$Smذ3:ܕKQ+X2*X:{b(X8ds"9!`>h$'91ukŒOӧ^d̟Lyԩ2LDD 9LKa2 [ 6?."9J[xK#03z` {曰q#}a>׽]d'CȜER@T((" " ":w=FLw ɅIZ>xP[@rذ8 ॗ,Yin pn~'<l0kpꩾpgJYg9FID P/Z�cg)и1з/yJ" " " " " "PpMu(R'2*L^uM/x@ժ…+3$Wm8s@꾡w/Vr]t(_~hG_t ̴* (ݾ=←R] ݔD@D@"j`Dc,L+29m)H®t*ڶWA'i}0E,m7di˟6q]w@f[uz'D?o L~{*DeMGݻ{ǔcS }E m.+y@_g26􀣎&_ _{ysfL4*S`f]Xg3fFYUJDޤ-" " " "W^ƍF7c ^2fǦM�D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D  Ph䓁 �ND:ks�ޛ\{qС�Ec9a9ǟ@Eٍ4:@AQ)�hkYx|2^SD@D@D@D@DpX'0e PBZ@Xx }Cҥ-9GKL՚ܩDO_yoww�{JPYSGuqEײJ$/W.-ZJuhl/Y?e*@A9 M1[֏A }5t{^xVkyxvmj((&^D*C,֭}Kʩ)M^OJW%!8顇g'$;e")IU7*ViJ^b#Sz3oޟ/mJOc pN@V2' UE@RSJ" " "hvԭ,`X%i1 X;JXߗBJ" " " " " " " " " " " " " " " " "jN8`EԉO~oh]v`4ա'''c:7U}6ih4kPwvox!˥@~X7*Y7.'"]8fNyslX7 8A8nOG䓁2e9sYc<O 쵗/+ j>|,JɷGOOS"ޣe)#"PXl0䤓|C4TT!w߭W^#_IY98X裏4D@v!@"6E+R5 +p@F{eGD sH=:+ϖ:s��(@a&@h4VHN MpD pUH+֣?O'RRԯ^.[D P/" " )N(2`@W$jQ+[CUuv'0mи1`'SREzm_0{#S[jVR`ӿtt~";�6�eW(̿[yD.4=i7<<(Wp_T!@C^:uWc9Ic-3`:`{wc$*6Uni|)'p�?~}t#^Kb]F7*_>TnG3�;oδu R6.]n7Ԣx_^ wjO/86kY(Y] -�* ƈZ0 qТR^R*ҢhEҢBȒ=Y+YJ[$$(HZ?ϹS{}2ss>yg޹Μ>gZ-" C-=A'@HBk;$#�}+@*?7�wݕM0*" ]�3S`Q~zt':c<'ǀwз/믻GYP߁ m~ _Pܰa(+V o |0~<0z4PT܇e-.R$\P+>~KD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D =Mڷ T5+$[Ln8唐Rn�n YgW^ pp D@2�  %8w=Y5X8ܹx5+B49|�M6ohwu!܄2$hEeˀ;3$X5#+NVkD VhĆrP*S&1I`8`Fy{vP[GTG'h~I9sa�jLP]A2�sګ'zęp]CժUG_#T5a„i@�r#s7&a}"Åm*DBM``PCMقu|sj֬ V[H$ŁΝ#ڿ"Ϧc$�KD*;:gjx#gձC`ȐY(_>Kd/WN"ZS`Ao*3j&_XXV^_<p!.K®˗O؎#FD?)xCqAmr'O];` L{*@P}@XCqرxMছB"L:�f-Z�Ӧ }vm[HWg??i|7AK^B]zid]{iIG`3UF�]w,]2 RlE@"uk#]�-2Z rEAn"& [ ewagcRJǨ_j ՋVP='h1 V^}Q3�K�̈́I54l,IA@>yLF.&@,)0 Xx}ΉRjן~z(_~}:u _%Pzw(ܨ+" " " $+E0WV0&d]U&" " " " " " " " " " " " " " " " ~!C{;BAV� bQ924 8h 2 }TE ֭!Q%K"vs+;dgUTHZfZq_u"@Fڷ[ C֮ L_'G U+A$pE(|啡2 ZѰjU ^Y7ʔm CưgА2(q-T(( f<RHk,�&N<ԟyeओՁ }Y @6^{弿~L аaa[PeLخ!^&,YÇ`Z�^fϠKVNfQ` 3u)&z57먦%rj�`_Zf:�EI~}ID@I`֬]ؑbr#?B 0q@x;?AZ_3@@X A݁cu5\P+{_<0 " " " " " " " " " " " " " " " " "g ]LW8@ˢ[DM9@^o W/w[w9H߆KVpb)> xA[7tiqc`hv4+Cz%S{㦛'�h {8p`:`ܐaB͚n Eno/E>S,Gᇁk;qR7%dJ:@" |A:kyDi-�U�]:5w)@:͉ h"yŊC V@zp8;j(J@Zя w9z+pE1cPOe%%B7|3E PXw{i6^D@E`͚ہٳ>;\pA/YC&}?ϖF`4vVț3v*{/mA2s " " " " " " " " " " " " " " " "w^?Q{Ձqɂ@v@;@Jn9$6jTHbEy_[S6dub+A#@I3#<0kCB16�O? 5*KGC&pK\|y?o?w7xxj?4kt= WGH7�=]?̜=7\(8t`j`,K-KYICBZ ,]x&+VUiQonzA\AD O,FÔ@|BZ_w]_NCnMePkJ`ܶo"z{uLg]kID_̉}^2С*[뮅bC+5 `u~!"N2J'}[D@D@J" ,\ի Hqb# Cxik<pf,2R Q:41#CgH,E.(AUCoq=&" " " " " $@ki*̝ .ʳ\"_۶%.n6?Qp6Vbw�֛N ~xέ#@" 4sr>"׮}6m@c矐8�+W^c4b;�tw.`;ڵ6mBe v T\DlِsF/=Ljժe" gJE hpw)"Rl~ � A; h< LU+Cx LD.&6mNg~ д-�nXܡChY#PR?,Ѵ@:짂DO?b虹 ⿯4ڰacM{@<pY5�_qB3όm lAV � BG o(M^ L4l 7S59C_ SHA5-СxU`A^+N ͛Ck4 F)'])>~f֓O)]9$wgj P 0z4EM|_T!9\OuTNj?L0-͵h|1!}{.;]u4^y%N=1"M5㮷QD4 ԩ@P+Eu`^.vs׭y ynH\�|1UD hҧ" `9fq^ӧJl4<c?hծ]jΛgqm7fD P+ﱮPD@D@J{֭C8,y@𗝰OiS5+$xt%�b 438hX ֶ4 k&$/b+"�r lp!ЪUh;XZ+Ym2<7([֯1UD uh,W#!Chϼ};`AH|Y3;g24Gay֩rj]ۉ@ |p {&ǎuew`;Ք)i'&X*6w}{`Р]+1|A)"  @s[t':d>:2zZ]J#J.o1/VW' &@Qxi%26쪇a_,:?[o iv$$hBZp6Ow aݻg E /l Ş+K\zMon�M{\O?8[D }LAD@D@D@#'a֬1C#ʹr6jmArh@z,^�اp=at/} Ral�0�u+�m۶Ǵ(4͚3JWOAɒ?[᧿ F]M\4'p]>w%Qrs[!i}H,XyM 2BwQ/ڵ~-$Vi1cyqQq֭[&M2WtsWt9˕, z˃9˃E:IJ[v+V ŋSQdPPW]g2{^()D.ұ2T2˺ y ?iө7}WNB.9Ӳ&zӧw٥Uvoii'[A3͛aC@12Sf?yЁW 4pbz믝{ +W-\b OQKesiH)ӾQܮn¶L=(0p`JOLКqƴ6�&&~c ܲ7O`s:Ws7~c#9#}SmaM/ &?!b/Əzp }4K!ov|?}&N}n{y30nݲݲsݏ<fB:uꠝeb^+>yk~ |TC$�fTג :LX7zj0._ߩ̿ʺrF4|v^:<@Nz43`TgSwΠZ&L_MqTAJe!x'W.o,\iu?\]&|^(-.peyeemlo+xJ2-S`:d^rƍ_Lf;qyK_oz2ӌ7/YiW9�'.-[A&ޭ0q"L4h2;|Y`w{u̻ny~Oߎwqς;l:*TTIu>GD ϞZ8+" " " i"pU3wFV); g>ӆF?DX h>4(G 5Wf\|hxŐc؉ pPQs'vGc.G;T7h+~s"S~5Aw̠GA|; @s i7X:GM2 $ֹdcȅ99X`n2Ec9qPcNs PdsnG " " " " " x֯-&>R(~8mڴs_Nr,ײ,[`Ye)'9 n/s?,90e<Ή^9`npe5Qs\ti+靗1TSX�8 9b,z,WO? hDkB #n <�Ц p衡mXO? ;Ӫ7zӪ[vP[-PˉźyPKnM7mz1249']n+-m*U`|r!|y�Ӆ238(^q k+AAb&U1rb:us72]X4(6u.,Yw}[)繥OoLL٥&tY(yN9tAv2�=eB~:<`0o_<Vc ft9E Mot˿P71e׶r^U~#}ݜ|_{ya9ܜ߹HcOn39F~SuNP;wy?~[O2N<裐ajnqє$\yʭ\2�.w\^l٢ƴNSSiwEnyHlb:wp?nH"n=|'&ƙne_}m;J]G.?>/ 3|2mQD`$H~~mXa: \|oi9s.z|,4b[vNlsL>aĈa:*@ Ԭ>ݱ`?x{!=Yn\q'oYߕw%/,1-r²ˮ2w:䐅;[>a\'w+Ǹ9\&0!{][O]>IAE3^\ڵkwoL#.0gsǺ. L;.0w ~̽^hQ^eW_aZj4ίyr }_O>Ӛ5ksgfZqς{= +N3?mY=a[wfǩjժ[h5ʤ%GHsV+" " i"`0ms4EקuM!F B\D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@JcFZO? 3h0Û1/x gb7{4o\s ХK|܂z튷89!qbrSI�@(u*T9p sНH _xH\9_H?z!Aā&n؝W\)b[~9 | G7ۙlq$ze'F82"/" " " "0_:T Q#\(C>b,pv%QJR,2eWWFO?}\fy;93]YF(Frc(>FvPSJ[x1!Z7ҝu3fhepFZFsG!2m2ݮ[ngzu<L5bGYNLTri3z,$\e}Foe]Kù4KA\g.FNd+L1q&#8 G5*Clr3u,-e3YĴo,眘Vz? B>锦RLʕ3&nuvFdtWh(FuF$u1Rwݗ_~w}ך.I.VGŊmtC9Fzǀ '2mb%$|\;w抑ރ,W=okaޭJ*eWb-|~+5}ε[ԘN|[&[>9,4m;*>H2NDdKce[�T~ L7 Źwݼ}φ_-7|k.9u8cມ;ׅec_5j$4z<nx[{FYp}&@Aho߹Ϝ2]ssCAXm㬋7Z O:՘ L{g@W>{Ny=;m;>V"/xy ;6Q^=t ݺuÑGaM<xP=Q⎣w4EE xR'&&ڙ[ fYo\>޺g&KѴ njcp<˔+prJEuDuB~͹m@~cslσkC e[KZ#V30H+)=Xq}AXeo`3r;?kב/&C|/z表_>4ibf #@s?K,˭nZjy8#йsg'm+۳>:涙 q#?⦙3g{uFl V дiS;5j~G<I70W("2LNࡇO[[PfeBt^} v0}]<}0b"" " " " " " " " " " " " " " " &` Ac(3f@b|g6A(0`7;FZF\xa ^,pPg79|`h4t hX[]s@zwݟLZ3nW̹̼s'bi0>s�rsgSAD@D@D@D@LB}̝ #䫉?IE{9}WvNPh9iTə>9qqEQds)$>gL)FS#72lY)Fs#⻉6}OX8HhF۴5ТOs:vxe ]`ޥWv]zuiNZ1TXd6 6up4{mX<.f)D4\/鸣;'*ͱV5I~go-+]�|~)]O*.]h;X_&c:䷓ 91fS:x|;ϼaÐ1RO4V3Z )$@J]9 WzN4 MYb~m6FN!,]Ι[Vsf^8 `30f[MF8S&4\Ԭcfz}T~N$vf>|ƽ|3MpbۧOWE> Qۆ͌)D2 owel/>ON؞u[~R_!s 6 ˖ z8xÁ1c~%?&Mʕ+mO '-ZvD_[l6b̛7ӦMea5X4b]$�&Oy`Lq=楗=C! 0O˶Z5s>+Nᆲͣ>o..?Yb>We>LϮ5+g2kwe=O[f'K}N.={c 3bmh2zvԩcۧґMڴkn %Xf >S|gxy#/[u@RN>C̚5 oɺ8ۏ:(kVv)5kY{>kK8I4j۶-N<Ds1׎jЯpu9Q0U&o�,X�c|edIwS"" " I$@SJ׎6X12md0xݶj2@S7b$" " " " " " " " " " " " " " "XfL5Z0>Pd|7:QXM-}6(Av^ W'b́͹w�Ma9r`s`h<: dz(^D" � \i?On0w΁ " " " " "7\29oKt|(N1NV4zWeޝ& E+Us}gr>i{D})3Nu Sȩqřj xnP= 40B ,L_|r4ceDUo9D|<gzXx]vMĐ"T4bzeuie/TwOQl?ܦWVi4J'w~g^ĺc&މf4圂 L8w鑂vN.ߣ#<WS(daЫp y.2J6]̊9gۢ ̟<PљR\ *{9bYhu;M?)26E]y�~k\3? !?ywsicq2YN: +@*]JcH}o[f {~ i=gM!Xhhbt˱pa)2ԊD%>c5 ?ӧz;.mˍC3|{ޡC 2!Q0}!T?v"LtcX m_m~qula;,]IJ7OYhѝyGg̓lU|?-se>;޾,nrmEnq $r3jԩ4HӦMZ&M裏'c?XCwys+l5}޽1�6 ;K/_ݦ}ӈvP1FjE4[3oK% P&[=aCK@P+~~2Ԋ!`4ֵtķ0pq;f)DGCkK[9tv�Msk4jn(." " " " " " " " " " " " " " " &`NھSe?*3%`ЪG@zq&;-I]Pp@qN E<(]m/ vb:nn[R2 (GEA!7'3+|it_ ;Eg)>Ł&'IZHFF%gL9((tD?S0O@E8'M>%L4qp;)j4s(Oz~;K jD`.F �Ì-n{m7'3oee>c xn),,O.*o~قBzt̗!)F4&mѐA!(H8N|3R0ͽo!߳4ge{YINLhbt3߱|qhذ!4h`LA43}]xa(eFldȶYr\{ hM3@e{B`mi 9a>CteQ`y"\?׷o6YNطAYTB�N>Rc'tO.o`ڠI޿TRKÈDaꄀ1cq4#/4F/zK.Ę;}7U3O-cq˖-0+П8<KCa"`?2:ueBx!3dGǍ�[hpβwehyR4f[j%0938$>+h4sY ]u9׫mؑJ߶f/a}'3C̟qI&7ofϞ3fq6<l l;o O �X@C;ZӱFe\}Ni6sL<O1"A ;+ΙBTSz|~hr\W*CZs@ 2<R0+WU.<ݺTFre}7S(CZu?u5" " " " " " " " " " " " " " " qlhW8 Q>|&;s_s2y:Q22 +f}8ؙ8nNa'2ŹB&+*!4ۢ(e U9- N1ͱ_wXTz # M 9.5L˖-[0Hs,HsPn'@8 hD-hDo7cϿƸ8eE8&&t>d,p?֭[ŷ\eu&ZҊ"9hg03Ǐ<HP裏>z64kɒ%x*)I%7'SGٿGf@'|b zMuQ6-Roir?Rw&Xۀ8?f\wp)>qNZM�gOvlSd~M4Qmi PDy g'1!2|dh0=Bwmk2`{+; }ܲo T>Xmvip}دip-X5[` \&QH .fFDjau9ѥK/^l ̙]PY2i)¢];`L]ϱdž'LH9u 06Wfٚq]RJYS"gz9qzݙ`-XO@7a#r?aC֪Uipĉ& #2ɓ1~x^DƧz̶w[oHplhUHFBs'⡇im={zl L4$~tZ`6p@а!pI)֊kVwTZӞ" " "̘uӀ<0L_~i+U@.ҔL%L%+;$Yv{!.< +C(ESD@D@D@D@D@D@D@D@D@D@D@D@D@D@D &[�m̴ׇEŸFG矟CzgiњTPX)L1.;-$)CBv@5'byŊGuNm$"<(S ΉĹ9đb8ۙkqP8)69M$$Hi." " " "wZ<8;,Z ռ;V,dQpS6>34n1c5fd~6† Q@E#],4u,&=]`tr T.2 ��@�IDAT6:S+\5Cbz8>4bx ?]X67#>;M6qg' +Guiw&6)ָq㝓1΄XWICDrAzӀHf͚e˖vpe000y�vԳO2)&F7�TMaYrldy&̯q*K0c  "@QZ$TkL!pmAO#c94nQ/ Fk܉`s z3x*,GKsHoQ0<Rc%'r_@mV~ BH~ ifώ}_!Cߑ{\r=ȑ#ѯ_5z75o_*Nat#9vV]_a0{Dof44b_I7dҕm{?-mvaޒάXb"zQFF{mOr֙ϛ7iӬ10dkˈ*Lcwy'y6߿koNZ>l9SN:t6 VqT2ԊP+~vSD@D@�3442m⋏lU6\o1N0G["``}uZj^(&" " " " " " " " " " " " " " " !e'3�-deY;We Dҥ}@FZFWc2Xf?MF) <@P,B3Na\\: ):Ɖrڵ<swM;~'DUvmxŋ tj0ڂFxF{o,xP iΜ9kiqFmҤ!6r|"yA~hMA5s4oVSjnLGժML]f#LWu,˨LLϷ\)~O>02RL{Ӛ4qin\r۶md+p4 "/f͚5 6y}ڢE {[K%$Kf{MioZ#N[;?&R34`Pe M {_qJ2 g#m~ibD#K 2Fb,F7 ".EIcUN̿xWk\yU9#wg}ξ a;&͔h6LN޾ D@2&X3pΉfze9XVgٳf͚k`4 :ɻsx#UGVH@wРAV<FQ|5ر#FZ{2e?(xO2ߧuy*MT)WHo͇˗/shDx66N:v*[lήÈ@pLӌ ?}ulԨ;b {gkhV:uT^ii^YԞ[k#@L:,kTreI ,yx'x+šqخ2ݸu]N7n>~,>)@P+~2Ԋ'` Q3a !T> `:?q@$ WH1mۀaĈ�[9DSagas eka: /n'!RsN9VZVH"SZKD h*)J& JsX6~MPf/Zh&еB`_o!k3sLkwߡD؃(ɦ>'?hpBk E- `C޴-gL?ټ`Xdmٲ5Ң1$�EhC3yaٲe`xb=8J(P ^^4_@# sL*}}͛7c6-Ҭ ir :u2e:zәO/5-h|k4+ѵ/qVC-O)I ~+i|JS"i]3X]PDlUYaٍ&qE0oC佃&*)N4po<Eec`N4q}N)VOFA4el?5ZʚmuE-7D |>8v0A~j%N3nҬӦĉMY3s y3fMr(ꨙDt5yW%uf+y;K1.0dwޱҥK! ˲;z7^5o.>X E9v։RJ.iӦ^uH4@&W_}5^|E뮳E4l7&MdM_aw|(]iHa 7`-|7}gS{׎vTngVbHjŏ^ZӞ" " "L[ N>!ll͚5b qX ;8t,J@Q9VNd^D@D@D@D@D@D@D@D@D@D@D@D@D@D@D h(ܥ `ea->R?:>ss Ō7B0|%{^6((drbQ2*U E8Z"E@r"@)ݧ~\M 8It!'Z/" " " &@QMcz̐8_:/lz(μ,N<DkS%[s4X;Mhuf'>""4J˞M%'lѺuk.]:+]РZL:0*Ɖ@ݻ[cdCwg&*>(TԈfc4>Pd744ٳgO0nVe˖M<yUH#><7OlK-V,$o> I @Co(ҖɁm)' *T;f*>[mڵXh,X`Mkk} 'X { ʽw 4{&u326�Gu7AÊ�ǝ׼eybקscY>dQ0fL/7BmCM}Q44`OAr#0x0Luˈ-7XQFmVRk㏶ .}9i4:Ըqck:=0"x4 ~{g,h~-Z0-ѬY3,Y2Y;)`lvT裏dK1b^x Ž;sqgfM=~rƍ[qE _�W]gFRE@Z񓖡V촧d<Ν[a: .gءcIGq<XQJs ,}\2J._]D@D@D@D@D@D@D@D@D@D@D@D@D@D@D 5꧒Q> 3 FT55QFf`cEK)B"u\Fq Sz@EF{xm'" "wԷ~k͵h֬YFt'ФI+w@p P0hs`t \ )lOZkJwrNqGTX˗\rի쓱⋼'�Q_ގeT~ȠV|B૯26m/^lEiշo_+ixhѤIu>رD}`fa4NBJkpGQ]4L`ܸabP5J2/lET2+ؼyͧ9c=֚je]h<#Dd1ȩZj{k/k"5pNv 4v8?8T1JwۮK_\rgm͢iǾ 9cQ?B~0>_\Z4Ӣ)dS/6†浲KA"y С੧iiS�MgXeMϳg϶ӪUlc9w5a^F3_H!,YomC"MhKv!Ui~ }5~˭q g~57tƎ͛cָ̏ζ:~sαFkp8m۶TwR/L/Kl$ C g=E@D@D 1S@1SO ]* +WT)yɢC[(Rxw_ P+w@/3 ={ ڄ5F]F?q͔j5j)W]Ae˖aѢEvJƑ-jdn0( " ~#|{&[|gխ[^ 9TXoW|D@D@D@D@r `xaP`ذ6Jj'Lފv~:ڶmb)DS%�Ɵ{9+I)=\q(UTϜCӄbi*9VAH`ӦM:uM .4.Ew^a^Ǐ.oޚ'+P'P`0`1իWOiL vHz[#.L?kEdֿkh|-[nmMOO>dk�l:�94UMViJQdh\l@__,H9iz1rط"l 3m+"?,R�\+\~ (z +)W^#jJ,شiSW&P/z ̛y'@3.Q gu5 NGO`jfMrL-K[9]4l֬aMƍ{g2]�Mp~m`e_O [;v躤x�C ƫ>H?|=SNI>clgoc-[v�m'>1vΝ;O*6(Z~iUVe?;)" " M'42u67="˗/o+*90\!:^gtk= ~HR+ |vC *0kVR9'exHa: Pqq8O֨Qp3EYjժ d5"D@�G8kT\iUjU;8۴i8 ;E@D@D@D8~qL2jz"LA'|w}7>S<3ѵkW+rX"yǬTh ]vrNZ s%J렰dЮ#Ixt "@f3_m("G ?#F[}?40f9D'>4裏5\00@n{/k3gϹ2Pkq_hDP8 NƧ,^xP]Am< }Y0-x8ѡCk7v_7 gľ M4Aҥ ]D@D?h;~ 4Qa w@$m{PtxCbvs$<ŇVb#ͤ(O3l2ɤ*۞ؿ�,_e |/ĆcXM!РШ`Cо}{#ʺaR >< ެT.',ctIִ& A_B`˖-v̙3kӠvN; =zߒXmO:si-܂CbMeK.#<n lC>}mShѢz)HMn |؞þsN>yXm}EvѼc-2 ⿻2Ԋ%>;@1:27mڄ:lS� he$`"n`8ݒF@ZIC$'~^ j%K#>}ŏ?0b<I&cÆÈ,Y] M2Ns8?l<Huv3*@&q\b?=w\,Z[nőGΝ;OGtm" " " "(g 2x(PBNQqY.㢋.(%@A<~ۖ Tkq0yyPR3{g}|kEMObx?(wou?z_n"s r)g<: P{ј1cMwq:ꨤGh@Szݙ]XV-McnEaQFaڴilS𣉫p| [V`ٲ~ҜXbeC,kxW s߲oCVl^{}DC?Ē%K0o<;-[ |Q':uꄊ+Fs(octa>ixyG5*njsSm  O2B, 4hd~;u4+S Ȫjժ[g]~=@h|& \|րG3'h{=CGCT66Ժu5jr_( o>(S-V^mt[ھ0L4cMf '0vXy{7駟 4Yc*$�ʹ؞M7)g|#oaK`#o" 2Ԋrw՞" " " J 0^vB7�'@uE,–eˆ?iL}zY0A2*ŷ'>f߾_ ed\7<ch߾p)Rn:Peq_$"�<9_{5l޼ ,|u&r!2d(H " " " ">1]vJ'Md �;_#PPA�ǟ/Z}C4ګW/+4c#(_7wVD k/`th:駟Z\ n}QϔCZN3gM]vVb(i$@Iqz'5VFS[:beTw3@ϝ�g4i֬1Lʕ+qeL+wtUr$< Uq|b*U<WP]wj֬ )~Gc֬Y=oܹkq̴rWO(Z(ڶmoݚ 4Ѻ[uu#Ge]],Dzd4cƏo 2Zsŋξ]t8y&޼;l^X?6\s-why[gt:֮2bWnPt jv0}aL|ńFf:}M[|WXt)ji%&#rmfǑ,_ܶ_uU(W d~Lf_.#3ݝ /X^}U϶53.2Jݝ`~7|3ԝ8L4b8\E@G@$i2b~&7+>E P 8v'``<3i0BAXQۈmԓsQ:w1o 5dJ9hpƌ�2СCx*c6CQ83Q!jX!"Qw_+swXqi_yxФI+GA +?Fg  b4=KM.bA#+V,йDW&XߴdkR(6R̗PÈ#dm[vQ6m"6jɓs5jdkW=1Mh/âEw-@&WNj)W^mU'NLڥums"W~E6_~iGlM5'9^4vWHRJLs3Mz!K7bԨQ7MV=\YƊ:=mڴA…}{EID@RKfr &Luց:;vcwq`y#Hf y6.ipg3 4nuE P~}p#}hXLs; ڳ>pqyevh1i$ر#mz 8]W@C 6`˖-Vj).aEM$\-Zmhl_={N}8뮻l;;V1h; ,#)� ;}ݶ1ձQ,  ө>Ǿ|gnOtP:ήs$ AQ "00 {^3Qkr$@au'ʖifKm#" " " " " " " " " " " " " " " " 9`_xFh>m?|*Usph¼y02|Q+NTR+QfΜ~VcD@D@r&PR%\|x7�q(P֮]Z/" " " " "`pL0) |�_|:''>h[^8/ڏ=X|Ai |5b�qX(ͿD@BjԨa5^uk4GQe˖ :)ɸ| t钶"*4y|w5{{S g%Rum#CHTmA4  cZjA(%@-! R\n-O}sM8}AŊYE'|sí+˗%\bt|ݢFCmR>,>#kvlQ\EX9q6~zӯw5ǠyiڵzHmfƗ'hH?1x#l8m}QG=2; SD 6rM?FѢE֮]Nsaر2eO"F7l `iqRKW3ѷo_7nLyyʽdr:$R #�͋:vz0FZ .Đ!ClȞGOvkݺh! N (Sמ" " " " " " " " " " " " " " " " "@]#СCr_"T9s{?u,%㎔"'x ih)?>?~wp \2&MC"c_:pSHWtDpè <n*U*1b$Lc 6bD1'?ފ#HeA)45x`P|jɒ%Ѷm[+$w@r S �Roߎ޽{[i_0Me9(/Ea8CH[U8k4Z1}=C8Pn] 0 ū:Ew6|V6'{Ϛq$ r.G K,i,Xݎ j4c\(1y]飏>ݻ㪫k@zjPԕiM6ԢE kz Fnul#Kwq^BO>aSuZ NI4M }gY>l0z*>Px/U@q76oܶ$3v<ji`֙ES23c +Lu[K*pίsՆW\ә+nyNc-iNC `{ӱQ߱c{j*ǁ"~ NK|o$}=D?$m%OQ#[lz3</ׯ;~i͚5m}W_}h v|Кn0 ͚56:,L>}`Չd|X'ѪU+[6cސuv5#{=K$3͠ IJef)IFgj%;ybuqm]w+MqFr废~L.>@իǔόԟ9:䒍~XS-WЬ(|1"yXo޼_|1.t-ͳw*Dn9眃'x"GӦM1pƞsһ{|ISaO孯=wߊ)D7(kہ<l6xw)vCr' CW*l[Xiw"4@+E)矻U￶c7;r9сd?lٴ 8[D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D { 8x9ssx5ओ`E<-[%;lܸo^}Ք @_ѷo_P2Wҧ�dɓ'ӦM8p /D&aS]CaKi4[j9cSTiRc7q_~?LitPd\M5h�ڵ)t " " " "8[ˆzmb2W׮]Aw�ERSh7ߤTb*t>裔Aދ[nSNEXرc͸63͇aÆ hicƌA$!9sXQ"PCKAd+gMOٳSxQOs|p%{ k^CqdlSH,S Zl KbЋ-%VG`A6K:4rȑVP;f t^tmgIv<}gsoAβn{LO֡CZΦq۶mCcO O2*TȦDK90^%iOC-QH2?]0J!Mg7!m-9\I} 9kIg>"EFYgeH p cXXBSσ~NK|o$>C4C&\=}>nS}/soi JQhΜ馛r/~^Y_d a=˵^O,@d ݖŋ[A \=G͚5 'xwcDu5s̄&lb_Dm6>I?嗸rJ.]?~]WX1/_hr=N=Qo(h+WlۊYNw4sGM; h1v4Y9m ͍ٮ4~|n/{P?su揽G(:[&y4w&jժh>8> 4b`{l^2hZpa˅kcutg<сq?mo>~pUW {ϼuiܹws-wu<<E_-! = O@ZzD@D@D@v0*`&wct&M6;ŰGͮ)݆ lc 2?Qj!ۧc:@R  3FF"gqVVE[5j 2_T?h|FCq|�ʥ^ÇہhݺuiPmH{(8p j׮C87lذ3c7o'Ig[V-k8e)ǁYz@Nu@ Ph|bԨD9]tE  d ;4fg,dR`9<4ϋE,L~P:aD?NP¾Io:o3X7 !뢐)s=׊�%c i9OO/<|uz3(qTY~2-3,[sd69.1Ε4dv*Wz=\jTrs;, 6p`ɒ%Ѹqc۶[̄@ Jyk"I<ز0Zi 2Jz_yVj4l4Mi,R֒<\܇6t!t#[0~Fo=ޞlOcYn報+ҝRHHuhDMDs|潽z_6;2kIwor  @SW�Mx^x[JE]<|dۇT4ziGG�1cX?8?<1g;�MI'&`o6hշo\&bɓē޺um⻗毬d C޽qW[&g%B}^z0y�R7N)w}׾; _~."cg r,!RHbIyk'=K-ۚi2BPʞ];g1ئ| 2 c]q}:;4) h̶^y'"ƟFW\sM[_c}cɓA]vYO3_/ڲï۷ۉ8�t=vꩧqN4Je־fww=%YA YM)" " Iaa:|}`0vTvʌ.$bvfMV GZ )4PE@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@O:f,:Бˡ+m ;h<a<Y2e ~6a$cИ9Blڴ 죏>В|$RqrD_W2;TIpϱ?H}x||{8X4r0 |WELD@D@D@B0r$XP\jbM{ P0r<?Jk|r ]@M(_R|(&n޼s9fZL Rwމ;gqnO~YT2datUx$rNQGny'xڇvXfwNX4KAdEbn;ػԩSQhQԨQc'&Mel#FQŋaB$(8Oj%3UXO?5�)!må;ۭ̩.#8zKw>.lҦ믿ޚxyOۼ'4 ZHwZJ{#&ysymҽ.R_D)?N d~GWrcǎ;OMq\Ahڴ)-[滨Pw$-Sfr۶mXvvciڢE [ /l`~{=\Ǐkp8{Zq-{ (k˵w`{AET+b^^}C$dl;;ٙ3gdĖ9s&k"fkwߝ@=�Yճ?:޽E|xMp<?˚>֤C*j y 5!CUiquJiy]"؋mguqBN,ȑ#.Rl& J܌3wj+sr[M8Ɯz.Z`ΡEIJb3>4ځ|goz`L1;b oL=flM+V=Ӿh+$5!`!0~ȨQHcJ%0S;A-&h.T: ~PFOw'IbB뮻)K/tx_(sx$W_y;vT_}w>^wx{rk&..;c!t8C~ald7Nzm JɔqM6q_~u]�5`bX(B[A&wv!`!`!`!`!`!`!`!`@5z.&U(Yye7[[F᠕ +孷ޒ=zH~TKU I~ZD Z5<Yh;+>?yR>]f DP֩9 IfaѣegL8#ۇ|s4N X�CJB{lnO;4W6"@ q,Qk6=;;bחzX ￿YhpJm3>qgϝ 7@ȿk_tk 7n+k)>[z(VBnO_UⱐEzt%1\%QL$T_o?s3B0rg%poQ?-rCrͧ,[ޛ<CP=l0 C0 C2t)ER0MXUbZ| |r%1�bI!9~a7z뭝̀N8aq cT:r H4f<-d:ƱbT�ALd_Huىwa6 lz *] $w>|,} 8)G߾}kR 03f[w6iM9政5mBUVrGy]<IvV iÓSl0E飏>І!|C./li'ز ]tE6>BҚ㿲k #D\r[]u]VY$km=?v<f~sw'JN若#`Os5U1AJгsE9;D СCɥv~Ϩ\K\ߖp1H*HE i;&Rj QÆ2>GqÂ9tMiAg}|sn U/>nOdP;^~ecc毛1zZy݄1sp9їG1&㫛nɍ<Yx%7|�N:$π>jC80?$$NhYK(U OKA~Re O-?|dF{ShK믿v~q ||Ma)$XP(c?~Uo2lex^L"&7'VP"{3ϸ?,<;3kVW\Oj]O ?Rxep?1sUAm<ZEOo뼿Qsy6łu! >@{3Tl |7Dy>Ⱦ^Yۖi0:tk'w^7Fa,Bq+[j~g6rb [gK/waNC纘 `Ԟ'I>!cre>C=;6I,%=#c ׈F2ߎ 5 Br(  <Hg7(?} Yb3>y|xZn&#_Xx"ӗkF#܌m>]I;kT!S6:@ٓv98[;~.vlʹo9XY sծsIm7qJ j{ 1 d-!`!tRuEV Ut!EQ޽qEhgvIA.f) ~%{qtdHpw'��@�IDAT]DDHI^"T8jpՉ'mDXW'HEo5M<%qW^:+R]N\?Ef4묳F:a %Zk\sLD+X/(Flڏ !n“!`w͠ C0 C0 C0 C0 C0 C0 C0 CJ;,2nʄ*8}wi9$.TQH3"%u>JO $%iH5E37ћo?./]p˫>9_*J}~g.tStJ *i?Ə-F($.Ruq^PF =,uS/-%xL'0`SFJ䪝gBwA W_}uʦ#]BH3#%\d0RBHrs~_ .%cgr G^-rG]]>\G.HH!CDx=Eq.m z:B=JU:°/T�˝_}RPHɐy\'%O =%JEHuxTBŰ1RcwopmU><]lO-%mӸ~dr-=RKetV,C0 C0رe;WV.Y7ȠfDY>hWqՁx$2 ]!6)"nv.O?ԝc,%qnv&t'|%A+TE>o}B>Wg%ʕ2ɾ@Ĥqqt27FW"u˔`wGCW6,wѭOY Zj<+ uJ^ 8<< +!/J-Ϩ?ގ䊹li<׬1V"xggv"?&~5ǹ~L ׯh8EOTؽf9(~fH޳j{۹cϝ΍ǩ7xõ!JZVJԒ+;m)4; &!eTQCZBBp}PA WIy>(psӇQK]Z㽤c9;+_S[A'W/:GSG�VdZ8R/橹~Y:"麤YYjv2?vbyσ:mWa'AIDZ?�Ҋ? 4  R$͋'(U OMBB,U& Ϸ-6_I{Ql-{>gp,nw)NV_E=x':,(U~~{>SEy#)ImUHo ׵ *6˟H+O7S6ӐL F* ?:bHg꫻30w*T.]8*Zp5jsB 801J+j0rH!GbY-({c=ڍ,b6 r\ke\'ه]4[N3 >4뮻.رctwG۞x≮N*|TɎg./.f)NTڞOV2v$}Bdm�Y׮]/3-Ά=UCsOיd=Rõ^@}ZuV8Z$R}F5f><~-e,Iy*p63IR}&~8)%K94A4!$T<B)2y}s nҮUPsmWaoJQ8!mwR t-'8q? <SPQX e"Y0 C0 %tKbMph`2CsYO P +PP`4Lof>3.mE>ҙ@;"C X{n?j>P =&LpxP}^PkR8N?t/$j.IYu0I~f[>g2 VC0 C0 C0 C0 C0 C0 C0 Cp@@S>5GNە;8~Q� an rO iT[@dBKyA$>b_mv"atvea_)"/|s _|E.xHx."P#._+r>?> >-? !a!I.AMq'{ j&"T-_O8O/($x_fud! ,ĊBicI!e '<-a饗vuۇB>qwׁ\r;/M%+!*kؙ{7gV6C0 C0@>Էd`#k{ )?'  I΍ 2` !&E</ŘdY! T;p.>[n_'ɾ2nCXjW4?/2/C#GuTy%`\B;�N'乍ByxUZPb9q/c/6y{\-g5ÐCő>ZsnCIJBf<m*`{F{F9bomo>^=[j[]& o4F*YO_^@�ɬBBCZBo.]$!$hg%e;Kc;c=ܧ>r~~# #J%1WnHN!O0Mg~xN '.7|}.;+}4BƁ!!!q/;i^<-$wG!__R_(m|2fH}Clq~{8I .pr܆Yb%ܱ T,,7drq5pef4z&U&fDGw}Z*Ky (ǿ76|<cB5H�^!- j^Bi6>}DS%G!JYl;)G#DʰŲMe^<̩UD|Vl^qUVY%bJ`]cXƙ8=BX7/>0.SAR<օډJs_rKA-GD!믹{cO?Oٳgh+)ZZښCbBy睠ݲ 1數|kʛwy#o;/4. sq ɸ! M#+ۑHAjE.mIDScwNgSH۝vdg7ʵק=lMP7},!`@;GE]wMB @QR{s'0 k';C @=zu&lϝw)Æ 5{-(!l$j(r)фWc eT'\ru׹}_l&\~C/DdĈFR0`\U\̕zX .2aBmҶT C0 C0 C0 C0 C0 C0 C0 C0Z9,Q"\dEVZy[Og7t(ٞ(Qg.:?}G":th Ȝs) /p.%qV.]ԩ<ӢFryKۋ)CVN+"P0> ]$?,2d DXmxH7zs[n2 ZuUz"WTN W^y8{](Y DE羚TWII~]qһwoх۹Z>y]w9PxP'WɜݖtQ巒/moRG$\`}@)S~W.W]]JHǏbo[ XmCҺ~!Jn!e8!`!` [^&-熎sw_e]/(]ڤ܉}˜{;V0d`"?B ՎNjd?$BȸuJl|͓U%sIp]?p+ZϭfK(]SJxHc^NysN8^js-5*b6Ԛjhgg6ɞhgV޳gDs!vׁc`8k:oٸ(r6<Is>jZH#BR}8'1H#tc<IJ^/#w澪C}]%%%Fv{o'cDK#%1[m؁x./ßbYfqNx_!8!ՠ+C!>b理qI ik|I)eJBHHחT}Clq^=+eWI￾c.,%CImPWݫ6o 4<2}'vl1>`3";Jܖ;HL "n:nRs ?/4BbbѤgȏ,DYGBnD ɦ ݧr-IvgLJ}pڮ暹,9g5Q칎gUMMy<bC} <!cbywYa&NS-57бN;$6T vUi_A .>+~kރ~Nڗ<?7nlZh!ygڵ#8bY?}?pCmq|VC[a12Q v ݅5Ӿ)m'JX_>IjCڎе-0S3uVZ 0i\-R4 C0 CiI--\dĪ 83E-?\F+/2;OyԆn(QehgdꫯvQxxb[m`4裏dM7 L`~mɗ*j;x2;EX%e!`!`!`!`!`!`!`!r9 Q_!xBdeEdZkXC1>0iDOi! 4qDG돳>[~4`m@k׮r2Vp8V_k` :* M:sذJS !:ez2Bqu_0>L3|wҳgO'P3DoerN<Ag+FogWdWڍ1T|H~VKOs|[O(c@M~|[ Wz/K9* YtC9)[o%-"mǤ́؟s]gZ/^믿ޑ<[0 C0 C(5Pbذ*.ckݚ%Ǒ#c=U)&?f=zY<xI:cBu.nJH3dxmȐ!ҥKA ÇWZA0GoZ&f Rr[s4唧^m-mvPOZRk9^BYO_1n#/{+,V| rB=PW8iul(ҚʓY&W-G!3+!iX9+k)Vw qKእ_N=)pZrԧܹm>aL8CQE`#HE*U/L}B[J޽=4+u cVzqRu8'?$$NhYm -t?JۚBw<L_[/WH}wOj YVd)0ɣR,u@�979*$UX||}*ct=.:u*~>j1FAc<| վcCR#E1Ez*^*o}s<a1Y32Šf{){Vs4JU#P$s,}6o:x`,il о2TҞQOAs:^ξUVYEG*=DY;E]$\5 —SFcU矧|s]}VhZJ+ȳ|:[aۄWEwqֆ <eq}}؅kVG|_ԢmﯖMLbveؾ $Yr뗸/}%cW~|h'u<3?xGT9 Cڎеn{ P0 C07~+2tX#&a9t@bqN Ɲf„ 'S.ry; qb"l喛? p0z=ҿ22�2?|Jp[\rd C0 C0 C0 C0 C0 C0 C0 C0 ct]4)/Ը?# "܅V^2 -b\,b8XHwo߾ʅλ+7xcCZtMŊcGs4Z2tM[o-[H*Qs ;\ =MB�Cyrv9A* ;6lBGymJY/ t X ~ۓO>&B~m"WMi;20 ry5p,ʻ;s/Wiŷi]{%-oޗ}Y(0 C0 B�}^3kGB8Pcu1b0%ؤk9kqc-@P:AOk BZiR1_QU $vmZE ^ x?~۽{\?*UPWmʳ閲΂СCoS4喧Mj'ĖvQGfm&l{o9RkkPL& ] 34RkEӵlug=۵kW9b='xbul^-U-hDkRnĂ.(6Å1N8A W}^i;;Umve={yfQJ 6L dK.qkKmdZ87i!RKl,`9&Ri_/E80?$$N(Ṙ[RX=.)x{v[O;ŎY[/Gei /o@h/g.<Jy&UX.QFoE*ii\hj%R�>:b+RXƧøZJܖ;HL "0_.EK g}V=\{4j%>QrSNJB3]wkC67|Uv#VӸ)<Si-t g\I{FY)F y~Eү}#\|r7 3<?-W(1֪uB0:^FޯR3ɚ u �O_v= _otcǎ=zTTS$٦BT̮ܛi?Nl7-bE [{-xԚjNOoӥ#t-'):�j{_+mBo1C0 Ch} q:0:({Z X@fqF_ΝƠQ,O;P/㐃G=< r8v71T7}mO?S.P$ە*.`0 C0 C0 C0 C0 C0 C0 C0 C ĴN;M䪫De&;\_-BZ+�[@EQ:F+*槵:Ȭ2Ei>WN1''||?q>#kTJ,Uavdw뭷ŵz?iI9u Cw-% vR?\N:$A)m�Kbv<Pn{+?!:uoC�a!PW^MP ‚!CH9PD,ׯ#$zw%>ܤmZ/^IzoCFa0 C0 C<;%+^Ҋ}' "#k81lA(&4wqn6۸7X'H:iAH+PʾO}r!82KHR&B>J#"gs5o~BVa 7tb^Zjn)[Q-QbNPU'|GsEw1[r.b喧DR A@PȳmCԚT @١C':Vbe65M޳ÛA?B嵬w}W.Q8T*?*ǮτdUWu6<O4Z9д|R}8Զ1gn!1瞓zj^ ;6$-`[G!.2p/cP/ ir:Iyq|r 7s\ K/ˇq fUS3J1ws}[ /s)H'CCB⸂|%͋#۫B>q.\?,?HZ6:N!2Q$[\N {WW_-ޛ1/;3P=tVꢷ#Y)Q,r, ur mokV~gi1c8;*?B<>j2>ѣGmfqCmj?w0\ ^xÕVYd%&'S2?óW8-Q%6 *sl؝Ө|=XJÃ>>ozoCۉdŧh#=0WYj=DžCA1`']k0 `NcW ~+ fAW!:^Fޯ{vDuׅ%w}UkSZe1YNmmڞbvZ#@Ml嗟~i`}4..T,i@uN!vÐ#t-'6V=V( jBǎ!`�dwrdе n.q!@^ }&02Dx GB|X|`L`3wp ι % JA>?`0c=\g߽{wLj; swv ]4 GHiwTaÆ9,.R־s9I@PK,!`!`!`!`!`!`!`!`m8i5zMO@"*mL=*<ò.8©W_}&裫Yt'RXCzt E+ @>Q:A%p:9;j'E5zAmW-}sEg 3 !Ky"R ,t `Q-}p-Ȉ#䨣^zɉy睮g}&WVZ>BԍO%\" 4GwBg&;eQز.|A!`*>,oW-  zQ8U%^p>!(6v<_~]m|}!s=WC,<TM/;tVY:{zDhC0 C0 @E8@tXy{M6wY6|s'.V妓C9>uVj`!6){""lض a\8vu T;1!eAw߹-_Iqc9<*k"e'6�Y^q9;k<Kba'Z#e ]wuY#׿#^b"<g1o=g>܆ ӺdԨQȋrJ9#l<8M;r嗻gZ֓CG}Tˬ3-=;98V<""ԙSkT�Clćv}T:je%fZeUQdl@9?8@~3dU-Y?dNx!>i1o}?Fm0G?|BxaBw,6g篃ߒ_zoi4L2<y0%>|6#NJ%3c i~kfb-ܘ'B|`-u?c3&( B|\K !sYpW GP;ǙgywKmCƁ'UHRKi IS'5ҍߧicg kj7,U._[\к!xOϝ |eo-رcsDTKvQPW^W;#"U;W/1r(moSC{qOcX&/}}kƉI<^ۜtG" }{P㱐gs|?L|MQ]fƼq3LipBF?;y+ew9)/z'?6R2߉X(JC/9Xhxօ BI+)(}|Z Q/xJga\!lcσ>s1GMB1(1>pZ,0Y#f} _ Z7 l/~XpF.̍9e`΁oWNm*d]XljÃ-juC<߶5Ay߭$A-?`[:q${\9k9[䯍m Ă!`!`S^~׷(zp�\rH;ґ"Ut3NxHů"pS҅HG /"npF:hOkR% u$ԀWH\: -P\NjD?K>+D:AHV\qHI"NJt`ΕQ )"uʝOGjse<u~t@;qᅑbc+Ahi*9Ω%v]K0 C0 C0 C0 C0 C0 C0 C08HhȐ9~aQK0F:utIG|Yf/~v֟B-.T+رc)7lsX9NC~B#=1nE +$F"G.xrbI4%PjgX0>9rdG|G*";tMr)Q좋.꞉)2R¯H W.dTiBJɜszy`Z #]@ۢB~/DE#]_P%}I±Mavˋ2I'~Ӆq#])Kߏz)m~xS誫~z E֝_gq˗s3fS?%ԣhE}EEݺusiH WZ_%#sm~reU;K|%Lw 1٧fs'H+eR9p\ }׽KC0 C0 HQ%BXkƘ^{Y07.`tDxak/]ߥlRԟ5:tp q֐Ke#i Rx\ڌ<H#'~u'&Bm6/2e5 Jh?b;6Ik{škm"@֣N; {-ѣG;;~f l= Ph ]wd/_![SžZ`Bx`믻uc*A:a_B[�{˺`ZrvD FW)[ 6E*0kxN*c}~xĺh`9{^<nHxZfqϣk3{vr[m{|rѿ]M2 'K<ulh@q0aWJu.xsեagF�.4˻9;ω츑E)9;cIs-Isr!c8QBpI*#ueK ]3C& T-4r;q +؍6~x(ԏxd8˒o%6u[S2|_%(?BR+h^{m& 8S;>F?| ?J տn\s)y=οA #,tuBƁ!!!qS$0݁C�mV&WJױؖBײTH+!j#ꕿ_k\?wQ:I3nk@MfrgxeW(0S,_n5jT0Ij8VAڜ~05+~>>Cms_bcK(?箵ZyCbH@ã*⫑O^H0k̿;Rj�&`C0)+h)t=YHK1uy^yMB>~f\ q|nh3wGh^\?:}Lcaw߅'*\h_PߚCiσ*)ɧOBV--Ν;w"GEݘ7~~{'l++UM(U9c/qbs]l޻~_&& kx]eU"MLc<8k|M7ցv~x !eJG(eW|;H֗2znB^AVEG F|RTQI[TI[ j5}}tx C0 C=""';WQ9EiRE'D&KH'ڝדּ:ٱjhX`Q'o50CPqWܾb?PxEL*x<(59d5UQ"OKm+AࡇDYGDe+IΩvUK0 C0 C0 C0 C0 C0 C0 C0B8XSOJw9qZKdyD ).n%ΐ^zItaD@E<)OKZ8_&i^Sgh޽E}D-B E2h Q&Q_ UWUd}o?_ErfyRLeY 'r'&]`mb%&r?DWBWO8q(CVI %%u>>4Q,mGj˄߮u]'0*щ((B.\+G^IJ'x`VEtѼ( 8Pzf!`!`]&ݻ\{mN\ E6D ]?*)ؤKvO;1Om)Bȸ+ 0?~o3\ޡdrv^|_nvQA旟O>)*FtMRQ2§ܦ5O<i\|YN;$ܧiT@JtM;JȚ4ʙ4aζ1D'=I3e̘12tPQzfJ^ ,gz) D*B!n8rTl{L,'"ݺT+:W%r5Ψ'"&AUE7e]&}mhaC 2'Nq$^R߱9jOϩz_dZ8]y�v%ɤrm*%*&*$*n&z*ig9fU :[򹱘&Mn|Ǿ  CZ!!i^<- Ƀ8|hkZxՖ)/J52W8q?R}{^ŴEɳD%J^&cCr)xGQ-*n72$UiisV8i.I|whaKHw;p1G!]s5g eȺ[@6xc{t ٩SJE5*Uj-XZ49ޟ*#cǎO [ %8E|ʩFjEڥbfJ5];KʟzbAz"ɦ / 9~\lL*>k)s-S}D_/6 D-sKm} RyPy=g}k>;0GOr衇ʔSNY,"SroZu`_y_>xVEl~*^UPN:$߭tJ~!C;oOR!vjmߔ}Z]! Q9i+pklt- in;T,KD}TtmQ:4Al\+!`!Pwt͎BD ٯ⊢2xyLJ7NtEE^84-z -C0 C0 C0 C0 C0 C0 C0 C(,iV2\pXp',09чo}E:j'=;K݂A 'EX z.^LFMOdY8E VG7,致h6rn_ (6lXŋ^]x}7D.<CL>}`ǂ!`!`@uv#g2(UtR]E#%v lOo)X2vByq-iQAn{wsqrhkL5Kd}q9;wnsyyyc?(s,D`=pdY7+rZ6 @0x+չr:i%i,kH=#޳BjO_0׈j YV%K;h~O9Ed=ϱ!Zw3h!}AHF,Qջ-.YV#Ūؒ?yq=f! Lpmq%bAVm!}ڶd\B#zzPR8%^w;wQϺs_ݚVu[o/E.:|q"�a?:}<0B 3? vcxT';;:#B|M^e„ I~H>mjar) )Bzl'X _^O+$.0vO5k׮A8;R\ؤ:>Yd<6=fEDH>LiWZ sO}ݓiԎzKN=To�'6FlxmVΟ_~f6Xk.C ni2ύ0!"qJ{q^VlFrk,)9l"' riTg_;ԪIWi!`Mȑ"ʅ  L,FGb>h{+F�] 2AIPط!`!`!`!`!`!`!`!`,iq!OVl]dg)޽{.3d[aNJ+(s5WUu~MD9:MPbNy#;L^GL3ɳP~WwD a)Zb@v袋;O7t%g`ԣR,]HX؉h"~C=DX]iht*-wOd`䩧XTgjއo!`@PG}5��@�IDATLTu];BBg4#x-aV%lTBǟ{1q)M'A^{AMB2~ 믮G?3f[KTЈ2*O}]1 Awk-ᄏ#<xVֵϯ ~#~{g @"nšHOrIO?}Ђ#")BCO?ۻw[<y i>RZ?Sn7<E{Gl a:$Y <xNT>Gy//[nZ;jےr. vPBJccǎ;6 6N<D'PX Jz=4ke;y9VkHчadСB_/"wz!1-o:x@>8qJΧ24LV O;F#v3B3ѣEȪբCί ;0- #P.(rHqR@a~ }GV[mLՑ0~+k㑬kSH8%\9Q ,)SVCcj,{NMa<Bv?l馮/K64;c=Bp[WUrEMLˍ,Bo{o+ m[Չ(,'g}Anz' Euԩ<ӂa-֬Z0Z)Ը1ɺѪ5z!`@A]T/:qQpѝk3p`<t̮Ǔ>ۖ�L({d 3r!!`!`!`!`!`!`!`@;A bZk|KDJrV nUUOJVDҪJN. Oah]eϢuYcB(,!`�,>~G! yFw_#.JC.*({dܸq2s;ˆmVؾR <C0 C0�l r9=9O_{rG Ar#ci6"Z$l6 !Mtc'H[:,7vJ¯HH_}'�Ao&z /(Tb95Nz5~mM70=\Yb%BOKTq㎓ /PVXa9餓5}WÝr]vEwfP1, |*'*R2%XDpSO=h<"5bY!ʕW^W? 7-5u(z 4"*2Ӧ%dE Oێ~ {XfeX>5(1DTk!>n4PZj*B72,N bZoUYB>oWqW_ՕPE+2秅xEav('ÈID P}dI|;'n/ӟ_k_r";oC+� cٷz#xgTP+]w c#Htwܱ#G~<B)0a+r;/+b_?ʔ1`_p@8>u#TÆ mƵ oƸ{wP;!wUW.{r _dE}ADrkp=;S3K˫t8}UQmy-#`ZXYLC0 Ce0a:!eيPz ]G#{^Ru]~v!`!`!`!`!`!`!`!`#p1"&k)dϫWL^W"FB NuIP Y � F'Nt$ P[V_}u%ZTE !Pw ; EcǎuDS?<!ee>}( &Kֶ!`!`ԂnU K/u{]vqdFY"6S8n2 .S1^:dr"^noVtp#Ic!kvꡇ?ks#R7}e[ouzYb[RF޳=#[YwyO ў={1O~{N[EBhVA-ǘ1c@]w/gAܹة}mkޡw 1e|?bu6V!x OǯiE DXכfi j CEh1B%gyƑC#0p8mk|o֭[%Igf9lQ1AQO:3|M Af%QOzB\ a(ľL(5Hd.|ȬvH~uɲ|7N$ꫯvm.6~ZY> -PC<u/e89֞OI{~7'ͣQ;ْ5 hSϪ;x6=tP` \|b}s= ˼{|Z*Nl3ǻO)Tw.""sQ]Zv!&U9&U9vv!`!д0>ͮCsj O;ҴC C0 C0 C0 C0 C0 C0 C0 C 9iQ ].#2dHX,Vi<REt͝ /;𩧞r^xaYeUBEYD4̊`#B޵sO>@O? k++Hm;uTqv!`!`@ys'@(0ۨؐtMJypw6̈uQ,ߚ!o y_0蠃rb5˴ C3{ 7LK= [E? @ !0~xksJ߾}CqrTͷUq eҥK3Uڎ{eɸqd7#ur qz(f§5(H^ÊSyY" h0W^y|嗲:[oe;vlY Z#\-yWEŽE>ѣG;d!°|VXaMg@O >\6 K/I6ՊB43�1Ȏ;g`Z@ =)‰'1?=t*g#.z:"J@_Wh[mU8v0[izIv^J2".*5FHͭz1&5+:th}@"?:ʽ+F>L+Bݼ\3T~INGGq/6CٛꪫSNq_Yӈ#ܜ)|fE BMo{9p<䓔^fi'->I!P{LPrMPrLC0 CiXb QgJPLp(=m8=,Jﴐt C0 C0 C0 C0 C0 C0 C0 CG%J8I*$Q$Fd@r|RKȲ˖sŭ^'pY LnY`TS7->E< ClʂT ->朗#;ݻwV[MV]uU֭[ !`!` Jr,rWT3#�SO!}Д fD?#ȃh^rc(ȨeYJ2N/wغ 3sC8q 6̉(@;sʮ>n0azڢM6DnfLVv�>{u]24(N:8@\p"\ҵV׬d'*)"=z9dRD�AD0k�)#<Pa޲w޲馛 Wnn @;G�`Çw> l۶+Rxy'ǀO,Ҟ7#b72_s=eюy7]-0Cl]gf/wMCw<.B:.cW M{A;{G~7'(n}v̪svڟBWhK>xhy8~pXl{rm|N R2rH7bK5|kr)_P+!`D�񣧟~'S0`>}oԶ .@9'G dvǻ0,׷o_V�^zex-Q7|S n#Yg\x8Y02 jU~LPrLC0 C)yQ%dl]y妬Bһd[n9)[oM/MK:?;0 C0 C0 C0 C0 C0 C0 C0J#p"g)rբjJmя>]o~Yi_E%=t.3;2fqD-O- i|Xb %G\Lfat a!Pڨ5^sZcǎ>p#XfV[]Lv!`!)]ɌEXΙ*ZمoQFD7pCG[lDz#�'cdm ފzBpj˂!eMgQ6|sADb0r[) p5\=TSFm$[llT_K [#7Zk'7"\$goD & �"~(2-+G|9"g--~7G3i3c!t@q!@D=`@d> z7fr$^|Ŝo `GW_F4,ǡ="j}^+!` t ޯ_|ȾYdۀ_ c!Xz7$V_sJN(w86VˤUخ+b&K~2qĜtn*v8h,:񂶓w6vRj裏ʃ>ƨoAd P~<h!Kyg;"Ig:ȺrvU#ŗ裏>؉e梴@Aӗ/_|}ked͘mܼ.v:묙,k3 qO?]8 gI?CpA">+5!CrPʆN0 C05JtⴹL7ր":gҴC C0 C0 C0 C0 C0 C0 C0 C8.B_>x,'Kks eT#X6PU `".#b)B<ս{wbEUA ◎;/! ax7]ok{XɢK.2 C0 CH%CY`tndj_);ąl!@_vVr_VP @>g}7l3G=^HyF~iy,gB {Ν;7jYֆO?$?w}{fM6=L34޽g$hxI۠ɻvı?ml,#ccU8\S0{R V+ jQC\"{}DL Q5F]Pe߆@ p*|>Tu™f#B9iԵi *_C O/-k50hZ_Kh] 5cDrKk@H&9i,MLP+Kȳ3O48El_ȏ3 x#|"}eVUTl9y M�ȈMY+e9Em"krիB2wc-E#gsfb;(�x]~�s.2NtWww,F HNBH<@mȐ!N [bJU^(uO;sIs=K(<< Sz)[z@eVeq jUi!`4tG__cM[`Jҝx$$QRAjгs C0 C0 C0 C0 C0 C0 C0 C6 1/+;!!;,?NZ$ dDP#?cyW2_u�AF Zh!teMK=d �{;)z-;ޖx>:©f@4 C0 Ch"FXMT2�C=ADY!UU�ԩ̔-!P&L'|ґ!(DZ@ƾFqUyflBV bVYe}[V �!Q"�o!3hH{+vaiԨQJ(;‰}7NaDxvڵBs&?T\opAاOc9ҪG$m:.Jb+ #y3yidz#!\UN q?>+!Gw%W\ё6=V5+o;D/ĞM` *#8t9F9| !Qi+\"0SVO> ~ 5߀_mS42#~_ ^@ fӖ6/eWWƴ tqi jj}JشǏ/W^ylfɨvmU@NțM5+%o[hN-εҜoR찃 'b<ﯿ0K|dW!P[`7n\N4(v &.Yve 09Ý0)mGf)DꫯvZsO} :u*/f.%hKcm٦ϱ^x]w=W'f%0"^Y9;&U`Zcgg!`M;Boi lC]/9x�ٸV C0 C0 C0 C0 C0 C0 C0 C8IT]'9j\d\Qf*%^{Z3ZİAd 2U,R֭#B\k^u3|-B\<-!U~gG -dRDS'@J dR?;vj\!`!`e �ǡrqRGГ? <}VXAr?B7(+ 1$FLkQnVs_"hsPBX]YH(`T�QKzb,n:k%Ys ~>-%E|굲DL.n+|py$,lzNCQ!g[D/H-E?_t.vy4Cʈ1˳0*B /RK< U2(?pj~mkܷ6Ψ5ŖØtA 1g> ~ Cf 򁜝6C/>,#Bj?/1MPvW8@ G3\ k2gqtIv:X6l5Ւ::f2Dd^S>l]&@.~祗^rsmq;wvsl=T=-RltE3Z  yf&G-K.a;cO>d;\rA9!xZ(W::x]v#8B{4o7~?C-Z"ʈ#dРAnt 6p-rm#f 츣p^ cE0Ԫ60Aʱ3 C0 C`E _:"`Cⷭѹ=.-JR<C0 C0 C0 C0 C0 C0 C0 C(){ȵN"O+'UɵD.0k2 (r"|"b  A\si'xs5WnSUv ,C M /]-߲ЛŶ>t)G4R5!=m C0 Ch][{okw}YG I\O; | };d있~fIz cGHfgO�4"=vZ'2˸g򿬊Qe2Po!>BDg!#K�ڔ7yQB駏| ;v{^i3ge6B?MƹUc`^pD>sj\sثW/z@Ky4;EjtP^sE%iMPe1,q~3xYk|G޽?N#'De1foęOcn7! !"0A;ޯ}8m }޿!o@M(ͣe[Cq2~>K?+7NAP/ c!]^j>}wncVʭ*3ϔvءPU@?beX0TGE@Ddz| l �/# ػQL8Qƍ>P#?A}KDJ%0ihvƐa&ag_-_.Ύi]}lrguoTnNZ766GyD.r뮻TsiC9眳*3-wT5qwN{]"Ẋҍ7؉gՠ&v9lvj \ ԪVٙ!`@S!D`."':8o7}aMp(K ~BjE"!`!`!`!`!`!`!`-�M(r%"{\uVO0 U(]|$J@+Jj %2H $TxDyE,ڃ.d?Wj c7bY|X(IQ7dq<]x HwޜVǎ["!`!`@x u)IB>0<bʢg9haDj zKdx3~(�d자È7=ق=$<<| �Dg)t$<^aEu<6#Kro`ׄ�{ ){�<WDQ@P䫈Ag!䯿4:e> "/? y1<hW!C"B[޵Yh x0J;+MvKD( j3ɻB>ZѾd6}zbXs,AD.PtPLZ$i,ǎ>vb> /!ОC*:} f<S%pycbZ!Ds�l?2|+pnܧ6ym|М Bܷ!߯q7|+4LI޷v8j>sgݻ:51L:>*Gͥ^\w7}'|RN<Dy衇d6s=Wkiuow/*(2tmٿ!@r".jo\9Z5gi̩0ƞ?{Yua|*r:^Ԙ[hz?.s{qn/˸{;$D}O2ܕ` xe]&*1[hS~it|駲 +ZdҾGkw>^y啺2?HrK7g^ СCeт_ڮDưd9K劌)*Z?|V,#`ZXYLC0 CjD�t7.p83lk`%0 C0 C0 C0 C0 C0 C0 C0Z]w$;,r"\5R~ %i,"&rY,) -o }< >XړPA:H,F؂!Њ ke/Xߞd 1-OH�N;{֭[}F*Պw0 C0 t8`5EZ'^I5SwO"1O JRZHX`GvҚf [8H!߆x28\ad:q-b \[lT1@ŵ3˖]l\ǐRp= WA$M<ӽ{wСCH6>]w۬gn h1P)BC//<{C> `dĎIVH6v%ADm+>꫋dIEn}p6(Yg\|h5SZ0-CA[{@ fX|mZ}_�,cd(|;\oFhe5dLn]^*>DI}_COwf--�coq_q{(x6 ~ <g65v ^.7g{Fjذa~~6l)aÇWQ ڵz2`L*}(( bF0 99a�ŀkXQ׈q]s1+F (*5'9! *<]f&uOU\WMtwUsWWzߊgAᘵ'ߘΛ]o'7_&5m_oq;G9YQn[ƾZh *X}'r"3g>֭[s}KTE{I 0<|!#[o?+|~GC=˝rb]CO'5r+vh[o5X믿VsmFkvɝ/q˵ ~F$ %n^zYdpY1u,j}.Pv � @R r7f%PY5L 1B@䁸3c�1 � � � � � � �D;N:nv!M.XCvjo?XE<d4;?s.:U;N |s܁ܵm^/"st~kv~#YYc}�g:uwX.ds A}) � �GO<Qaߵ>c)a'|wvX@L/첹 'Xl~G}nxbPvkr@M\0AcR-ZLj\nˬ@͚5-qƎ$L 6K:"/zˬ48lT\f)5p8<GWHT$r7O <߽lN<9cRnⲺ ̑Xˬ10|M.R.?j Re҉P'sY WA/7n$\z YuI0N~y.į:q㱖}c(ќ|@_[׏/ս�1|, ߟ;qޖ!@k|7ix?C~߿_e5k y]HK:^x?C= ~:wim%;aguNa{#7!3!wܑKf:`\7޸0aB>#FKSC @pK!E_Fpp_W_hU`|s>u*r[>@L~?﵏c6tžjQ)gѣNsxAz뭗;T_+|B¡g5~x͝^ۆpB Ocƌ%r=zk̓|?O<D]V^2'qշoL|%iuQ8OϏtPZucH@�2#G殻>}2S풩( nVΞpRf 7^Tw~ucH@�@�@�@�@�@�@�Hl~ҕWfS䪫d`!@~%t0L )[X.;`OLZ?1Z~ױwZ?x-ζ3`Zsc~X.m~101!\L ~|hwIA�@�@X*9SV]X"&||<9 Acfcq_)1Mcp}(r@;;8p,w@-wA=?(!s}T\nˬDk1ˬ|� E_^ e5.l?cye6&Qr >;&9yVLN͆@^nEahմ8xyr,(ο..$WI|aL ^u;7ˢD}WNKJ/(fj>3=W5:Q`֬Yc.wN_n6m 5wj||͆mDg,^Ӎ} v튽x}yПux=#kNkmv|H[y^C:ކ{__/E; x/C{0Y ( W/7C!~ ~ikO!?)\!n#YLjPIrMi!]fu/ABƝ 9i07 7?>䓹>^k4hР>f0,lUN$iSVȇo$5\s6W|W%ylO븯$ŕu>1S]!T ޝs<.b?b/1-wM獼}>ƍ]} ڏQs3낇B&Kwޗ=7.$Tkt*۷KyKI^ ]_ 7c=uعsgmf`' :R +zr"^;l]~My;<yܽ DZ^}ڹ$Zm].Y\֯'sO '"P,p)*H=-TKc:$*H+@�V7w‰$Q_ PÒ{tְelu]77B�@�@�@�@�@�@�@�G:FV̦+<#MgmteY1Dq@T1(P {d觟~c^99~`Y3?UU-A;^;cUՏI`*raʊ|BŠe~(?r� � @zrR\ҬI=?{L~ 2cŊ|l9r�>S4 ǂ>1b ؏|,[1~q@"; 1QEp|9^W%ߪM/N*uLsSr[/j\nc@$꾗ߴVyVLTe]Šxvi~C\f 2N~37j![.hLYǜ BLL][TjL徃szY0@e^6c"e˫}exg͊M{ĮbJ ^}/NjbR~ OS_!)4ztjUzuq()~9]eA{}\ׇ>vk_K[.[EZV6|}.;y_/ۗ]5Zo*mms?xm~'~O@>vv@ۘ`:  -ed}8eI2?[~^x}T{ݸr{*P #WWwO{<^up|]UqB6om?۬M߾q]ny ޥ_V_=$J<|뭷±hs=^V]u\b6`y7rA띸 ^}(dW /S Yj DcGNh19Rg}d'[j3T8(&rmyxl㪊_[q8;8?q**/X)-j;|L?vcʺx sE85<[YCz~uy-C!1҄po߯:I|dy~P{.9|N)d^fe|}ǽ^[|?>o˝C^/tWSN�ON 8ay\7a>7ba:|AC>5i_v'1H޽{s24$\soOs4� OB1$ �Xc iT*J¡bSOm2 C!� � � � � � � Pٌ\rVJQg2[C!4fLf}t% IJ 3T2~88?Xw|7>\Y?>8G_]Pb0*/r@H_À~~Uu񃟮oW-:C-`_1pXe}CF@�@�JY &=CtilǦSC r�a~~|l[]]XS>n]<Ǘ>ܯ1bcb1h>&FםmžjDE�[~u Pl嶲~qyMX]cupa'huˬ?_N_W\fݎ/~烪+ns,q94: R UQc}h=$Z߱7XbsLR_}ԁμml{tqz`mb\&r~/.Uݭ|V\&CeVlz^.=8ˡ}_)58p[)lb}kֳk9sΑFrBJvΏpq;ߏO nqέxy=_}?^W۞^mH&m_ގo⵴:?X%&h6AO\7~|u@^'ٳ6tSHh:b-iz){/>suCmS^y}V {=b}zzU} 5.mn߻2;!nb24kk@C L,9X55g\$jMۧ~Z4q\`|u):qucJo Jp>\klI)Txii=2)@Y!?#r%Ί-䟻%_Ow?vx+sk{<*N8 ;OqUx~}&qK$v?Qx|NOJ$!N;I$y@ML6h\��@�IDATX^\\yuzEDy OG켌xY=59/.]:'t2C)畓jM + ^?B<s-_߃;uf^o#&r-' |Ͱay)XGe4� >}PD�@�,+H^RG.b}�@A�@�@�@�@�@�@�@�Ȧ@(;y7-Ijod٨J Qgj@C <%>\U~@/vfe?Wu~!h?4R!m?sfpa]1"<T:;T by0be8_0u_.@�@�wP1 UNj517Ƥ;d|<_.s|,<UcE8.t6]Pᅵ{4=pVM4%X"դ"G% .!Vˬ岺e֟|Q\.YeܖY߫j9˲? 0ϝ{J:Bh ᴚwWXJ[n\{ *]N#ILs ?׌k/U9mj\n}` NJ{+y9N eI^dZnuɪ*1;6,?P +Px]}9.m|M0~:w~1tZ%VX<#ކn$Mq{챺{5fmvv�|z:ϟ'Í1E] ݣG+`CcbB~ɝYUuOC|{gq]V]?.ޏοq_:+'M0o޽ƗO~}  YsdiB]-󾕻X|^!O?w�|'/y?As:;;+pFϋB\zEjp4JqK/]s9>s:H=|žqOkyx'FX4X'B<fW俎yxnޘFeOn]Ji-DK,_p2Ⴇ˝'bbx".˕=.3^>b".'h/}P/I*_>o v ϚD&J?v6څNV|*+ 4nթ9 �D`H6٤&;_HD @�@�@�@�@�@�@�@�³i's)ʫ[z v-[ubmZkIwAB,?~?<^LBLԤ zk? � �)0cB@乸(V3sbKyDq$˸qҺfFB\~rN$~(>EjIO<PrW^Q斬CwUj+iU=>Z &Y|ū@魿Ufi}|_3.ͫ 0!ϩJ#Gn͠E恿]߾}}wd32ƞn;?Dy0d$wb1wz8poZZNzDgo0ʨQ8b#g96"PǸS*^;uL *BN\!V@vm 饗"L$�5nZ{'ĉIb]:ipep5`̥*{e:tJfN:lx܊oYfs6G84O-@l?j� \P']|b@)8VHNA�@�@�@�@�@�@�@�Ƞ+wT :ԩrepfds<UF� ,ԧ4|x&Ʉ@�@�@|ť}_$вBri0O?Q/C9 SIM6QH()9}}ҳJgOIU\HNLS߸Fjժ~` PkF|r3HݺUycDa]w]p맻(_.ܰrpZ_|Ǝ 6@_}H-[i+S3ɐ�e'Ӓ ^{-SUDZae Aq񽒔t B� tUw^r]kuνH#FH_qM@� PxL bPL@�FMw$j*0Y\ !� � � � � � � � -ϖFC5[u}$9�YU}RAbpR@�'I!� � @Z><⋧ԫ`Bv[]kv xuK޽Zo,]{IPA/NC]j'pС2&VqIUR3H>*xb[֤I*p߿.iTk\-ի }!x2d}]nj۶fvIGQ@ ھ oD$ Vh1dL`tiX˨~Vbdi2j4ME|MC\?.u(xRQGIoUi @HFFZ �Ysgi$ÂW � � � � � � � @V' tE yRPkV t'e � lUwg � � VO 1(U GzLLkM5pܿ&i 5m4r~KK]HԴt9қoJ}$Ҟ{Jۗ1MG~*wNw"N9S"^j9 j sg)u$ZM;j]~<xv}p?7yjO<SdjE lPNꪫדO>_5FR&Ьt_HQ,@B"39H_JmڤzT,8wI&>X:鮻[o]Rk1A�'@B3j@uV!� aߧ @) A8_ș=ZE[@�@�@�@�@�@�@�@�xUi$ǡV;PAB!JvU=: ZI2Ƞ$x4kV@@�@�(s?;$s)A&1"UILTJ"PJ?@V'G.Hk--xwsqO?xwVZ 6(ﶛԶtŞzI`Qjέ.&V]{{N:)[^zi98ٓZ̺6!^!mݦi!3ۆ@wjM6 Okߐqt!od �)RIv Vz�hsE+ɿXJS];wߕƎ__Zn9SO?-v*@ >ŽY)uD�P&J|@� <4u<UF'r2-_̡ � � � � � � � �[`ti_֥vSHXB).$:0'N`LJU=>C�@�@� 8A7_Q+! $ֺʿǻYC:li \SVlNCmrK$ ҆JcHf?D]:�'0x+ҨQR˖WLoon]oP>z9YgIk%왽_|:CrI(R@fʹeر:t;|922F {Cg?WȻ_`SO }gAZi  0c"i uJ_ZU>$0OЫ${o+Z;,=s@� |śSB� P@�FWl*0a "ʕi 2zF� � � � � � � � @"'5i"9NQSreT]kVj%�S]Q*�.ЦM%S@�@�@ [ߪULm[@B:h)*oZ%モ 6T:,՜B`,iXDRNJ+I'\ޒ.LqGi Q Ɖ�u2$#GJZ1w3_xwj޸8jذa2 !h�J@Νu'p#i-r^zi:/u\| +pRR酝cG 1VӦiuB�'*-w]Ե4iR]f8Ȣ@gK,xcrܶ6B/*�dO Z^1T.@B]x@�L 8neTJ[,y:*M@�@�@�@�@�@�@�@ 5!֎^zImTA+Z/ޠdd5e$Q@�B<M Bu3@�@�H� 6GOM9G:tΫP|2$ vQO7C.*#=K_|!uBb iχ#'98^Pc.$J Z-q8I5v.R!L,tlSڷ 7!ڝa? {ケZW]u\sͰ?8=c_\;&�>nwPyBQ'Ǟ=K 7YʫSoI5H:sBW_MgݨV`KOpR\K-pEzN#�.w GtHU: �  %'ЦMPƴi%4� � � � � � � �EI!V[dPO$Ey >XzL @6HrP3� � @ 8܂ airIxt%K'TM%,dI>I�n*MC:vVYE: ^}4eKҙgJn*5m70/@ u?,gRW*+4sf $jh Y#$I˱ǖFN~]wU>`IϻB5yٳg:\|IGS[lvi}pЬY U Ƌ�;%+|̿O?INN@A�] Z(wP+5D� x]peϽ]|4qԭҿpNpf @ jܧݥ(@BR @nMZ}i˞,"Pg.MB�@�@�@�@�@�@�@�!& (&UjUISV]UY5a P"z4cF4f � � P(\Mtk9'IXo%`Iᅲ_ai3*] >Kec8+EO$'gv}-Cb|Ug}$ =2_'PpuEIU2 ޻4$jv ʾ!cѰFj=[otLM4)['p{\Ҳmjǰyu/hZ2YG ,6L:tiܸi7-EZ@�D H_C׮/HoRC( J% ~Zr\2 _��!@BҘ@�|﮻@Z%7Wi � � � � � � �pJIЎRhSum Vu:̿;,4;^{%"o4C+@�@�(crh)m,en-I`cSk &SOMӼ4Պ4ĉiI+-t/H$`YgIm$;oCNq!@1{N~{i-#0 7g'Ԛ(cŠ429v9(i2ݔ9*$Pջw\39]`VG>)S.oasAӖK}" � M{! UU>DdHU2 @=~19R0x:uJٽN'@ sݻKN>Y~iU6K15 #�WH 2SKdp@�&Co$V iH#VCz2.@�@�@�@�@�@�@�@>8 q;ϜOm_06C](GV�RÇci3 � � \6a{t=R>)RHoJCJNRiuh'?^:0i夵֒*I5vh {Cx3S .QK.۴ic֦nvL֭6,CN BN!  G$wO(2oz7<SuҠڵ56tN>]rK.I'e]V뭷>l :]F�1_ҮJN4DAHUs!@MZS{5n=:WMoKI,2҉'J~޺S3@ $Jܡn^Z7c@�R-p풳RpBp@�@�@�@�@�@�@�@ E7$]tR)X2uj2bjx.]sMS';E>F�K? � �dA A5BM#sz$sIl#9y8pK&L? } ߠ[zO$'KN@ ?,m}Pk$NU:̘Vmu=[(cu+aN2C,f7 oyYgmzf)X0﯑#GjڴifcذaZeUqH|$6+>#-G-Qɓ!CQ6� m^J矹ZMロZQH@&ɽcH| 9uI;J{+_|� P3{85.B� p;"� Pcܾi]j<_D m*8ɪSi@�@�@�@�@�@�@�@${O:`A8J]rhm:د_&V &֒_? zQ@�@�\nv|LH/m4ujvBͳ/0v4ntt L}wiŤwv2!_+H.�|(nzn-ہduҙ7in=Hj98Yҡ6~] Y͛Dw@գG}G7_Hiʔ)?!6V)D?c\@oa�uY$9⭷q$ @FPYTj"�TևnQ; �5Xzi]%|]ht᭩#C�fo֗<Z� @y /͘\|Jڇ� � � � � � � �dCB!sQ熨-qh"4iRcLi"@F՜"� � P~>Oߌ/w"=WoLݩmׯ' &T+Iծ]ҟ6- 'RnT˖M4t?*@:K{o#o6vcᅳ݆A9*~=UBi}DůAqزeKZdErh3`"$ 6,Iv &nݺieK5.@aI˵/#)' ) @ *P\f6D5]Ǚ~ Oy-'0@z C�JH`y%_ @ip+qiGZ� @N`(ihV@�@�@�@�@�@�@�@�?W_nUj޼SĄZZkL 1t?@.h!]wݟ?@�@�H�5?M O9ō6&Nlq3&j"pMI3ΨɷNc 8'A, >K>;`iƌuW謐mu֍]m�go 8dKDzMT|k3=)Lqo*SҐ!C6q~ߖOS__{ypl<Q~amfZjt!ɵR4ӨJ|jɱY.DN$Ԫ!@ 89�ɳ1c;vLI萍E-H+K]\J魷K]*\#fLkͩ 8NJW3U !@BB2N@�A;wߝ\n3I*bE$C�@�@�@�@�@�@�@�Dgm^(u\J-kRwnd$lB`}Jrp~  � � �!ЮBPpiUK>`(-メQ+ 'H.+m4it'H<" ,y]Gu wB dN;j=(${Y|w )䴡AE@$?_O)ÍC۷o|PhkN;4M<Y'xB[l\r_h gCY3;$'b>lԙZ"P[jV#@ xט׳1w}/Ge-{}9.+1(?IrO@�b x_f:^Z7f  �EP8oT PmJ?(͜Y-} � � � � � � � @z.ILңGUzkZ}ԺuaXk.Z*v͇ P6Ҹqk@@�@�Ȋ�p2g]ZH>i)Z`$!'zJ./!m*KK,1}ݹd\r晇2-p5HW]̯m#uו&Yi_sxplIM)eG:_zI:Թ!k)D5B�>7ND4$oչsgZ^y2oSO=-2\렃 Ifl( 'nE6JMZ6GiUu+p;&|O)"@i J~*qk\k$^oi :@jjUm'dQ8ר3 �P(yK$r@�@�@�@�@�@�@�@�pP%߿ᇰʱ8x]VtE۷3]6 NMo. Q+@�@�H8J]`9(;AK}~7vN=䷶r]/{QG)$ g$)iI+9_H2D{챇6x9??HJTA_!9Hҝ~RnsU.H}C ).�jrPiM}%ҤZ7ceѣu1zx(+N:I/rH4fng}V[mU.m=2P gOGL5@) P&mA�X,ްmJ -/T K<k'9Ჟ"_9h+Dߓs( j| �e.#9ׯ!h~ "� � � � � � � �p0+Hr,yK\w}\>/'@�@�rp�8?3GA[b3< /Ӿ>iҤ$hZcՁ);,4fK~*r5 :4d2e=9G zOoŊgK[o-yD7!ѪUVig̐Rx[*|>bYe˰5bĈaÆGZV fO<D%:CcpjeёGgyZiԫ>*}E'(� Fˈ@ c$ [j)ϲUgj�5;>H!1tɵ[lZ#�X`j;G� p;sz!� P p?NMn`| ĄZӦe T@�@�@�@�@�@�@�ȬYH;$GfQM7NGЯ ɃE4C� 8Pq6ҿSe@�@�DIU&3fN8AH#304WH=zH]6x[Bm ɰQwޑ9&9gU1:֙!K P4J={&Ayى7#첔_K[r 6jg^&]$Իwjxu#$CB1vJIk|!i$M<Y߯ 7P:th„ nC>zTK!\(ϛ7_qT@�h(?o1@`K,pDz}鮻嗗8ud] >뭠 H%#� aߋR.nUG .(5o.M^* � � � � � � � @x4ct 2̎ ouo.-4ztzDM@ ͚)UF֓!� � PKBrƎMq%͜Y>Hzž6r:H0~|0輶 I裏|Q  HUv~W_]ZkFd&?H /\1\&M@iӤn<R񇋓0 4(^^ZKtꩧ7ĉsotyd+SNћo6P9 %u#$ 5Ƌ@1|,c@�$ԩY1uE�R7}$׊~[m7i0ieG-@`Njd]i@@�@@rBwFXl1j � � � � � � � g.TZ}4Ԩp4@pW;&8C @ !=7 T@�@�HkDm(vI?.9&H'-d14JY<ϡRG`dgO駟#`us=nI~p$( u-dw6\8~7B װٳg:ߟ'd7ž_W?rv*EZhԪU+-ՑNUYq[oUH"mEe(*i 3?bXũSi +Z٧1i^veջwoykKwkܝuY72|_}չ[kl{G[FS(ח;LMѣLN3KV CA�@ K~Tc�(ЩtIpQ>GRɹBٗ✧M� s V[Z� P&&I#[& mi@�@�@�@�@�@�@�@�(=wbM5qp[r;'MJrt mm00 "0 � �VZeX{mg%']~KtיڥW [nA{oYֳk GygcS� }6.RQ1l O.w_|EB3f f͚%+Ű[5mڴʤXgULU1VOy \k1v,Hu6m²V_\ڵ%类 ٨Qi}>�פs̕0(E V34 qҁJaI mmݦ6($QO?tHA֎ Lw 6!!sks9:rw=TshD"=4`4a"gT#@4Q8_JquP#@ _t/KI.t:뤪T@lp9�%"@B4@|ƌ|[5)=@�@�@�@�@�@�@�@�" w}i)MP+=3G$wK^+0xpwVHo= � �(3(S P-]!Bo鮻7/[^>@kzA%p ѣkTo^z=DAL}g裏駟^}:d'j":TL :n1ٔ -݂ .{,'њqD[jfX}J`/w'rr-wK.RK-eY&$X:\ &QbWw .HXc4dsZřENDm,pRXU( x8vXzaݽW؏a5gm/׸qt-裏Yo %PRji)$#vrhjh#OّP+;3ڱbNN})kHÇK~V즛Zy1頃[.)-E]4RJm-� yv@�}(|S͡XZ5 � � � � � � � @3SO:tJb0|%єhD騞=;$VIP@zR*9p � � @z을ZԤq`⡇V׿׍SUoV[MZ} ~9骫Q&p 4hPl:Yn{ IL{('jI:v쨍7Xڵ%[LaNQJɽէ8،34mڴ\"!dNTO~?&߲}]vp_~\y_7uF*J\VUHˁZKaJdY%̆\ y(EpB[%At'q.(lOJ ѲBc'jtI'e 3 4kL;C1cts8hrB-Zhvʽ|L4`N;7wOjs4l؜Y VVD�bP 3N9S 9) @Z>8e]y4x4d>WN] Pj(( @�JY  @5Nچ@eN5qbe � � � � � � � @C W:ǜS.-(S(CWz!v%H:} � �pRg @7$}W:Ԭ6?K.}tcՠ`[Nb\V8Eɔ__]x z뭷nXh4 vK2ȝ9-Ro2U։ +ݭJVɴ` b\֬Yq8ǹbڹsg*nEکo_q% Uu됓Kl"u&m¼WHQmJïJ؁Rxj8+Sp0\Ǩ⊬ԸqĕWԪ=ܳq+T`kri\kېѺ}c=B뽵k6t)vQu 3i 6L Pnn �'$| $\Y6MZ骫!:H'9_B Z_|RG� jw@�HرI-LipB 8F� � � � � � � � V顇'30__)!q[Z@`n/v4j4`ܾ � � P,'%5I@jlsVHT9ֿ͹ΰUl$@ReTn&N^}aKÆ Ӆ^6m4HK O<yrW^u&MҔ)SrrB,'\Zyջwn_!K.dHVTZńfUU7y\$i~G׿wk_ou?߫G!|Zo=U^;VkF)� \| 2PTTknZ^hXvCuޞtM.jK5 \L \qz)J±I[DM vjڋ�Y}OɆ@~Bpz�dB`Ť㏗=VzIb8 ^:M PK,!}Y6&#Pvb  �dUA?ن:wHU??F�@�@�@�@�@�@�@�j"Ґ!R 7u&8CB )!Z3 A>}I޹D@�@�Q f*ǖfp喓vs`.Z;P/uEGΝfGyd.` 90K/ &ɳg9iV׮]uaK.ZeUԱcG9Q4|݆.o裏)k]z $zXO?}vc:k/SVPH _UX4U&>P3F!IP&ߨ>믫o߾zRK5j}xa8SNuOC7x>@xmV_wY-[,lE;:Ta}&'hQ1jX{6!@fG (|N�dMۜ=*3޽J_pG  '3cRi@�   �dQj{,9Sg+Z_~)͞]11< � � � � � � � @U.}BpQ 8C"=䀥@&A nkm� � �hLbLi -'RogԶx!O.a®oL.fΔ?ޫϫ|PcǎհaԴia!0}\G7XZҺ뮫;.$JzGm\Y!3+o9|aw%D#V=f@mF.`qD7=:!&Azzaz-9R}@7��@�IDATSgu6dɵ>`r-3W1Y1DPAO)-0lZl)-Q[oU /vi'Lh4|pM2E~{H:BT~!Y Pb $ܟ.x`5攼� J~@XC|ysi)U@�,.} 0nJoJH_|QQ3  РN( }.ug@�2>7U�4Ps)�@�@�@�@�@�@�@�@� "⹅iIW238%]!&I( @MJ!B0| � � @1+ZŐfYXm5֭nݤGb+spjZqty I/axGo߾z<A)WѣGj׮''8ڵ M4I3f E!{g-NF_g}vMw}W7xc.)ۄ je/}'g}W,hwP0%;͂KW^yLaא3 5N_H%F<蠃WAjTP!\ɵW曫SN:S!B2Whh[WXj֗#@vHykr4s? @+$WV&mtK+\א}6 }'�t!V_.@BA� PcJݻ7eH3-4  � � � � � � � @ v**WlrF}MiM\6j58dHIJfeT@�@�p.4)о}GimGZc ) *Ag)la*yeӅ^0#d,U g  jS n&'8ӧミK+!)ɕoD[NDA>;v 'wСCCg_璴 8P| ZJ]tѐ!C4~xOd뤏,( 6ݕ6~J?͚ 8)MsĈĚ5o@pS7⋹Z;SK[}|lSn+tRr~2!ZOA�]ZP+{#@¥2]zg+\GKbeVȓo!@ ,2қo6x4�w4;SE�@^~\{ԻwFdZZ}T@�@�@�@�@�@�@�R.0v4n\`Ӽ󦼲X~kĉ3*B=vޮ@J3rd@�@�EY3nI3Q2#/>=Di$%P##DK?!hQO>]zj.P^I~pjv-[G{'ds-'8:묳v۩u _ ƈ@F~6 N%Ϛ1c}\b7{1ߞɤ_}%-hokĈC~NmiGSwei;SN9%$O=BO=TZI$j .%xXb z駋T&@B>)OÐK4o^1@ $JIf>U} @Z _gW?\ZrIo#-@�l k٪3E�HU "� jp߭M#Vg+� N@�@�@�@�@�@�@�@Lc@lR5hv& j�_7y8 �5h&91@�@�_iSDٍ?A|2r%ֺoIaa^yErb'jֹ{y\zii>{'y-BfN83DCf'%fTvԻwo9w}Wo.K -P%<D|ugk„ 4t\R}G-ve3FNd $*ޜrUڦK?<N9<!'|~ܺd MÉ,'[5jTn;}g_FmUB?_SN T x曥_~KLRsZsNMɎ J~RS@>ݺI_/}HI!/6TVk;"�55>Ro-H�<w �UwR.U|(_Łˠ4@�@�@�@�@�@�@�(WH| w^'IP+3K]W=:uf >J/Q#@�@�M ĕ�5m7Ɂ'NwB>J <Briu 7H*5kV L 5\s=7<K[O> TuA[oPp1 {1yرc(@kر9¾/}ݵK#kVjk$Ԫ_vBy` P"^#l<R?&foQ[%J2k*ЦMva|b.[l:+$]Z}m@ڶCz!k*FU FB ,�e*@B-YWoj�G`E!Cޒ| ;6^{I,#sk?"� 4y}@ $\ �TpB=+ɿOP g<MF�@�@�@�@�@�@�@� 8x=!`&S#1()ygٳS\I�h#kWiTU � � P$*N)zK , SSᇥ-8]H;K{0=õk 32SO=E7߬:H}y 4( +SȨ@׉ƌ?\gq_uUv)+$* !Vq4?VX?H*hBN{數KVrI&�LAuB+BSLш#4sLG- >J-G[7 ~S~1Fs&#�/@BcjeoQch8_C$K:I; {/46cB�(Nɹi| d\ZT@=8Z7iqemJ_|Q'� � � � � � � � P'Ӛo>5Ja մvJ<S͗{g/S_%}'D^(lRRDBI e,5*[5[-Dv9yuf垙Ͻ3sλ<9s>. F@N\m?� � � � � �<y5k|BcW<"]ۣ#۶f4c 9k0LF0%2QR UDMfѢEػw/zܹs'N";Ș1矱yf,X͛7Gɒ%W_۶0e@S.pZcmFg5sXVX"߿nf=%DMu?~K ڎpH*ATۇmۚPBW̙7o6@7uk1wO5GrYe" '<(<NJ� 459Gqk >Y; @!|=ئMgB\B E$@$@$@ʔ@͚V@ ٳlm� � � � � � � � � � � � � � � @иIPI>KU(+xqoOH 4 <$$H1$]h"    `!Z ,Gvڍ@ԩ;�k?~r" Yk|([h4zUKPbe lٲիWq(Vvڅyxra„ 8t|=J.ŋ':s&dΜ覄 C*\gɓ;vx`C&M̽[׮]MUVH #GٳE7̛7/^u8pM M%ާhܺ߶X; ė�KIB jYV(0w2D$@$/ zq`2`n<{2Dz^HH;z\aw4 @3 � � @0;F @EH PP+�HHHHHHHHHHHHHHH :ve[l5xܹ� ؇@@61� � � � @8H[Ͼ% z<X1>&28~ܷ6{' K= E6m58ڽСCqydۺ­ P!ٳKFPHEH \ ̙Æ 35$HEF/'NH4$hZ;*I‹Y{ !b=N{<x0*Uf͚ŋ54dran*N-I ˩]H# ;| 8 wB�ֱ%& jh &�o'l?>Rn܈O % !Sy#F�ǎ9|UJ>2>,S ~@hH�z  0#pt)РAu%8Žg$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@g@* hb&Xg+qm>[%N;vWHHHHB{gP8Cb_ظp(_X6-b&߭(@Dj"oMÇ~AEp<'KƲe,R& lٲaԨQغu+N>-A(KaΜ9)qC@vjE|y\YUP!:tH3TT`ӧOǥKо}{+d aG _|";|?Y*Y`A 4(Q0`Æ=�c|�|5}\%U*DKHH PP+')�oYkaI mSC>6*bϹsCϡM#5ڠuͬH (HlHH$TZ^d!p:Z /2J(u]`(P�,YjY � � � � � � � � � � � � � � � x�%.nc8ds @޼7 A$ʖuA=:0Շȇz 6 B$@$@$@$@h8 jE·$bTfMQp}޶ ^(  W_}yAݣThc`I&z]6ɗFQCb'O_|\ d_2@߮];<xlCN̞=C իWM6Z*~iϱƒ%K4[h7|ӟZ j~Lx]}] [ԊK(o@V%u}ر(߿T UE͛#FŖϛߎuZKSLAڴib}U0rH<S�Pq6Zx1~wl1TpyX|y-bsL@n[ѥ Сwo8z(ƌ#׍/Uo^}U%qC5G j$@aA;l:eJƍ`� @(_3X&0x0 S,P]嗀 , :k>Q|^3tΙ0� /q/`"  "E�Qb"s -gҁg:t&N(\{l'lq4h � � � � � � � � � � � � � � . r%0lX=ӅkT$Z6?H4lH@C͙9ܾ};~WYD(HHHHH (d@l*,O̝ ̀�mW^y[YJuK;\[{*3sL#"E 1Jر7nR8vb_?X`F? 2RiӦO?ٳgmEP)+UbӦM10a~[f9f'OGe,Y$F^oH"jV}~k9=zwQWA-RQ`6&u!6*V,Yl{-T | P 2usI>Kt_\v?o׮]_\r7o4jz/RlE@#}QV-(Q^xVҘ$ (^h r] >>}\3^ C:u%Zaplp � $:ԊF1 Ȱ?cb A cF!cc@<A뫯 Fl1^;? :Piٳ;p>N@\ 4HHB j©:d#aOX1Mw ^,~[eԙL2򦻬NRA{.&               #ixhx뜟CA-?QM[BVC$Z�ҤՅɮ>IEw­4* � � � � ނR5V8}B3 *UCB|v qn+_zoz@}Y~WCF9Ǐ\s[hy"&:J*gϞaQ>1ˆOKzClf{c… ݻ7VZA�qM41cĺ=R:u#S@%ʒ%)̜%TtSEƒs!Bkט͙3'ҦM#&l߭ '"ΝT+WXs>ge'yxRsғO>iK͚50fݭ[7޽;c!O@Eft +WNEI^<#]rz�\. #s îb{D$@$53!s-c` hQGs!.^TEO8R8 ƿo?jݺ۹H x#0 � � @08sزZphc*U4yU֭[Gp˗/EYHHHHHHHHHHHHHHHР۶A PP+~V ȜrL$@$)ԩƎ}>}`ŊBT-Mva̘1#ҧO4$@$@$@$@$0 j6D69Dʗi>oG8e ?\9�~2q?~<v؁>d_xI!w8Fb tIM:SfqJ"7Gɒ%crΜ9FNZIʛ7/go5UZF2e{x^{UP+}zQGS<`ŒUإ"^r @SO9D}-TuO.4iRJ6mXkS4i={v[AW]sU`8v=.]GѣG[oaL[g/f ;1)S/ƍeqۢ皜qL؞eˢxv& WZD$@N@u#;?翃0H !3'з/pc^c{ (P�48q"H:@39@؉c_2qO*J$`wcwڴHH tIfM/*aQ1y֭{ęӻk2󭎻?^ uz+W.WSDO�9sqqt+V &%K΀oK9rDrw)+W8gȐɓ'6mW/w}PgfUdO.:VZիW2% u+\0v*o'мys#{nL:L3Dؠӳ$Յ >qp gD}>¯tI@QOW91� � � � � � � � � � � � � � � @48Kcj*m'?%AffD#4)K/%lH  t /yW>Z.F:tcǎȓ'Q;FW>n2A>s|9r_,/wiڸ{Ѯ];x MXr)x5П ~}Əqp~a ]YHHHH< p@b,úus 8MI,n 4E~,mϞem\θb \ى~=/)1(V֭J(#~fjOo޼_5N6رcBE۷qpk<hٲ%x h]*pu>?6XKO_tp-MYS+T!'WcqVˎpuܚ=*6ս{Xji N6l\f ^yܹŗɏ7|#6ޝeP6l`K:dc*UB2eL~]Ż>쳈:b#[Ȓ%KtnK6mSNW_݄+c߾Iވ\W}7rVWA >f DlrZ>>BΘ1UT!Co~0UEt^1j}}%nbǗjC@ϱ={Be;3ǫqgX>СCqRXNK˵ xEBH%D}ԷAHuEEɓ!/bڵ&k-g>&1� � PP+ j$@@@ ɐ736*S&M  xg1^kҮ5>R\q nL$@$@$@A@m[˪^= 1eYٲ > pմ5dj?C=dm۶-ȼ?y;HXZb4ծ]l{,q$d,f0V7u?,x֕+W~GtSF-XHhSm,I# fS{ĩú|%BZ/j8En+sٳg-qjժe1'zK1cXaըQô+1" o_e}$@$@$@$@$@$@$@$@$@$@$@$@$@$@$8R,e6CnBGۗs-+iR:}:tȞ� Y{V;FE=C TAFw>[6>Zc$H,h9r4iۚTRH{r<mϣk|7o4Y\0jW~6J$@$@$@$@9Ғ56d o mY)S곩e:mm/mϟ d< c%_.:u,J[%AE 8~䞣е"Yf?m;ʕ+1\r72뜓$Ibf&ENڧ&MDlO)RX_|%PV^L͛GA MD̶Ǐս{>l[͛]vS٭ϓO>ixgv1]CL'Nh%2(ytsx#$fS3>(~"df0SLFՙ{1E/\`>ۼȠkE˒@|~o\9=ﰔ&w?$EXczX ,^7,UDx+ 7>ĘߦիW}@<3h 9#0a=:Y$E?Xz[n5>AkS7+]t7]ܝ" qdY Zֹsޛ_Y*TDLغx%ڤ-_Ğjdweb>unHr<ip"'}v4S`|%ȁi+P<5C$JxG3gMIH 4>;Ȕ<YoY|`3c3{ݍj-]s:8=g۾u˲R,?ClF}^f9rd"  weY1: E'Ϣ'%%%:$uօGD#˗/7E5 .4 G8Q3i� 2[l1jNqXn]SرcMg urW#G?uPor /87@ų;Sm;wfj85kw}Ѵi(ׯ7 o?e$@$@$@$@$@$@$@$@$@$@$@$@$@$@$g{, JBz3!ڕ+& !eWH `$Ϊw@FDBc·Qz#X#~gگ_?]:ڡdO-]Me˖-"T)r艟m� � � � ;^Z(q? ͎ȹs[*yFS=r~ KG/b,۔Z$bo_RA q8~۷ɓB!u3Mg4#FDtDm6lVlYKkzRJeu!bV)b" j9UD kΜ9f'cμ^Ú7:Z7>\T<̙T BEryn1Iה)SLP}ٺQ$͛7R2ߎ(ӰaÈ}A!C5ǎo3~ɯ" _JK>nZli“y|R% +RE@5ge%ܙ3g6y|ƍ[*xYŗ; jE[ &s*VP!3'"C*zD _uHN+K˼J=z0;E?Ac$C}q;X齭SPMj~WZNA-N?޲ҧOPQ7 j07^?}|bnHƅHHTO^J,`Nk}H%OxÜ~5&10vǎ2+Ww<I4J8$2xD$@$@$`s۶'N�uPG&*"Eq9GX1c1勰Dڴi!"Boʔ)TR1,\t @ q8I@̟wAM-$BZmA!m/}hժ<իW<׮]3SN!3ٮRL8X@1|TR?o_a_.]}"g{zJ$@$@$@$@$@$@$@$@$@$@$@$@$@$@$fJ�v^=|9xԩ!> ǪN@kHH ^eY�ǻ.oFcGؤIH0fO< $p,&M+Tɓ'm_~%}QdȐ!"Ot?Ƹ|'~ � � � � x@@JHC\9_5LZvc;؎,=p[˷*W~8fb;@KF4i^#36Z'%$͛׬o%K>}ڼnݺcǎ5ȅX cpΝk;?^z歈f97׍7ʹY}Y kl捾;z\&t7׻r#&"\3fȑ#U9sƬ +ܹs泮G/X Ν;3mڴzsa{9sftez/^ ¦MñoL Y2okay8zX�յC.\`|�q+3gOk" )4 Kݻw7z([c1jt>͛q* eロ&b8a<CyYڵkqsyhȝ;7+"ekl)Oޕ\r_uaJTKbz% lHHL@^r;XHD@a!8~+:jmSӹ;3'i߾^tQ*l%0޶5֭=6H p(8lHHL̙! I d dP\NgpS2̦{Fk0'"ѲthϞ=Pa,uuڵKëj9֠ѓ:RkRMC5l8o<b^LhZhvСChܸq|z*}ׯ_}[l1>b"              o7ի;BD5m›7N�eI@Eq-1 $sE@ E C SqHӇS5xo rJWwߙ@*4i)c\=ˇQ{gWN$@$@$@$@$@$2fT``!&]|ގv֬$uE<&to 5nv:$R4{L#}c0|,]#GPri],ni\!ƏM%D Wly#5}t_fs=a_<fUV5oܹ}۶mF0 �)9;7"msؙ):nY)dV`*Jd�~1]٦5pMNQ2=WΜ9fE5M&?|>!CN:~j%)mڴȟ? dz蜡p f=畳^'WNV\tBgq@֬cSBLa)S&XbQ1bý$CzOAWZe~sn`D f?} #<�) o+?z_Q"%}pGyH%+ɍPɍ0#+r;|x׮QP+" � � � � ?G.La(3G`죿X<yVrq s07n\`7<ssl9p-ã%6F$  ŴHH jլayvȖɡ9@~QD[G$ȑ#b'M4i#:EO)rٳgC עnNlI D Zd 7on=]rNIHHHHHHHHHHHHHH„RHL  0 ;&MԺt/UR?h!h*g$@!M@c؞< ,Xw75}uo|50eY'Af[ܹÇGʔ)QB;){aBYl;IHHHHHB@ W/ 3:JXvSw5gϞEϞ= ˋ/( ˇPZ9p p}@ݺ{scl*5jE=:u =s`S6mD-[6ئob;_t{%AM̘1n2I4ysnh'븵?VaN:12Y郦MB_HЩmݺ[6ȟ~i,_<zU>1>:}U*L�_PCP+$Hxi,T4Mѱc]@tS=!o޽{c*2@ /__}8`C4~Wqر�[Blj887G,Rz*nܸO4͛7j'C'O6t*BO"6u     & S2[XS'sPf͂<O1Ǣ4cߝOI$em/m- 9pxw$k"@,G i-  H�uN[ U+Y€@\갗8ܫ+t$^:J7mڄԩS{t"JHu&s׺uk9?|RG_]܅ƍcfH \ם?8-Z6ӧUr;%J,۲eKD=o6/>oHHHHHHHHHHHHHHHƒf2PC@K] ƎF{ (V,<8*@@jܹ� :+h$g\I>9 ]0jyc*Ni*\>\6"9N2dS0I,M}ݥ|MYkIHHHHHCJqHw@<y;~۪sfn3Fb…S\,ύ|3.6D>}'0l0S6X#H_|E3fB&CŠP#}ާmbo*9@ %̙#4}1E>cɹ4C5瀮tYU$Ye^?1gt k׮s^TeL͞=h%~2IR%K5N#U@9ND_~A޴T|:t.][vu^98�M,?eK~zjƟp[_Kid:39B~nL DvsP*�_|d�}_rB,Ypys:K;hU͓<y 8}d!b/^<yg#GS jI1&     @l8}9`]&CwkDۧqӭs1y8|YcL3� ! jA$@$@E`GЕڵë- xJ k$H :P3rH#\uؽ{7zmDԩBwrAhMUU_I9]tQNk׮hݺ5>̿^0S )�Z$Qo/^h,F2թC@\�Pzu[o>q`XbtsHHHHHHHHHHHHHHH D \ * |cOR%h@m!�vK\I(@޾hIA1� @|ԲeqćQKO_H) N·Qz#ʏQ}WQ_YVjj*F1Ø1cFS;? p � � � � � m @w? � |vyTD)4om۶Eǎqinސ/AB_0@HƹUשV+{*<5yd|} >~<y4Y,C&TI*5l%YVA(gZhfjDtٳg.mOŴMfDqlݺay2ի'dWcvs2ՠΤ5]pIā*1{7b޼yf m۶pP1Yf7"[Ίf̘q̔*,\vg5jXSO=etyҥ9UTlL/fZUT0m9)O4HܓDOz ˗ϳg}1uKsz€ݕ~)S r{YWpи7**ƼA[M,<W0��@�IDAT ZoNm CtE9W[<}sYֳR%o.om*A=Kҏn4S?r> j%k"    pCJq Ϧ?Zo_Z1Բ&MgmYP䜫t| ! HHHlL`�ʛ4FlfcͲdynSw6{a*R%Rq0bg#թS'KCm*U~wK-l;~n:KL>-/X#-Qٗ4iRYf,6ѫ^x=ztvq8nK돜D4GDS8[avX~}K;7nXa8YºrJ}Oq2              ͛%X]wYVW% QRQ6C fH X8|XY֒%<%bn9y_}u'0jSZߧ={ʇѕHlJ<;,Zg0ĉ7Qr/ڵy�/SmTߒ+F-2J@$@$@$@$@np@M&y%$,p^h,^<޲DX*PըQYܲ(">l`;o^ĦYY\c[ss^W3B>:[+V4cjnUP5l?b-[66qԩS[O?ժU+{vipYOcx"0eڱcYtg\-:5Yy:D,̬ WӦMk,K ?6@/HZ ?H"bL~J�|sSV6yкe̘ZjYOU^=ԵMږO?jƏÆ6ٳ'$bPݻwI}T"XXXօ :ϚSy ݸȥ@~[=M@/!rٱ._VZ�ϱDwBD=?`)]wѣ1JޒIOPƍc$>"j\̲lٲ^Ǜ\rBJ0d+M4AsW)L="ZliJ.վ}{K|<m_}gQ3ڛoLKKQ~n$WnY?F @H##翃b %nӧ[F–Ξ'wcj5y<jfWx22ON: S++WXB � � ] T*L`W i;| �>.''[oF]w-c*iv¥K μQ H!=>wYڍ2^Wwe"x"ĉٳȚ5kgWo]TRA ￱o>.\:!+                7̙@߾_=-Z ˗5kFO'0z~0 HC` ㏁G).·QKߠ/fΜ9㭏`tE 0˗/C=aHHHH pJ8}ݮd^x4 >N.pyݻ~([Q])2g &w,If J-[ۖwdrʘ6m$vk`nyNx\#ج=rFn՟~ 僈?Ego 8͛? oұN5hDvp\r@D͐-[60ZFs1P(MCAO.-S�;ׯӾO ?Lw'h<u} 2kgv ƍ.>ܷc0BpI35P \ycv?x Ps(t}#Ν!Ϲ@"kH5>DODDX|9%ˆg]zrho߶ZQ(UJK$x#;fHΝ<`d@B'.] snWu%Kfj{fno[ˌᘫ?/ gVsЯZC  & sȔ <dw$M�O#!8 _,Zc� � � � � � � � � � � � � � ؛}89j$mnskD̝TgXHĴm� ' A6mzK$@$@$@$@EUx"0s&D.૯{ ۹iF]?CڂbŊ|ڶcg=p3U\ҫϊ+^KJ'jݺ5%KfBjhDY&>}wW^AV-C ڈѣE�ʚ5k*d#*eGdBiܹ|>}>ȏ:už={0~xyqa>pr~I;&Ɂ9sM +N$*N; j ύ)7y8K<9K@UdU~ v nv6_?LpByo&㙊1@t{T DVk`n ?6-癎фJ NIO׏3E{KIH q \'{ʔqk隂%l=TD ~%F?TP!s:$z$KhA#  ? qϮY%% DH8n߾fw3g~'GLՓ� � � � � � � � � � � � � � @`] lX#1ߐ-[mKl4̟w.L]W@`Ƨ$&&8?ش X11-a$@F@7n SPk8p@u)*U w}w@dc$@$@$@$@$@$@'SOг돉ƺu|߁1D `:[oa"zo K!%!<y26n܈~a֬Y1 _*Vm6s׮][Dc… Ƿ˟A"n]By6}5g57cdruݘ6mZ"Q>7lPrQuRNbv\ رc}ESD ٳ;sѣ4i )A\\Ov@t{LJL⯿guB?>CtڹE'}%ʕ!70lذ… Xticٲert &_"gΜ7} _ >"4?# #nL˚&đͫWƩS\g ͚5wOO@.*g$@$@$@$@$@$@ڴ38t kwKtQwqg@וg mLd<m iXs# aI4HH–D3&o_" PO&`Pu랗)={PX1wⵟwp13 � � � � � � � � � � � � � � xM@H@H�LǢ 6oڱM6֯x�8rȓ'D;-[HC@^uYN"E(Z۷\M$@$@$@$@\3O@  Hu,9_>} ԨQu )NџULa~`B ʕ6] ܻ"LSQ .]Bq KgsB)lٲ/{'X&6 ׯ;FTpӦMH&wm۶P0 ɓ'1b 8Zߗuu;%ZfȜ~ܕ_Ŗ2ft0S'UBď"&箕/:u ѓӨ(ˁo 4[8x lf_={R&MP4(x_,_xQ`xbժUÚ5kb*ugNjSBU_Y=B% ?jT ^?Ewpw,Y � ؅sĉ1;&TXKtɑ"<s ի_~ſ yNL vAɒӄhx AE7.$ ndtUcnVM$@$@$%k& dɢ2 tD$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@H@6&0kq6Ȃzz40m0r$Ŵ<#YL$<Cf\QP6@U (ZԱFi ;wAJ$@$@$@$@$@$@ &$ л7lz P#]W` 0U9s ܼ $OȣBN/_�$ Z<"<lnwKǏw|Clٲh%.] "J5 /XoZe-v#R" 0]vM + 8R&ɏB0vXlI<[k0Mdղ,'$VL!F߀k!wg:t0*Mfnݺg!xF,C̙3\|q }b^;ְ5.3V$/,֤ⷯ {Xs# EU ur; � � � � � @@ϞK/?� PwwM?d?6e˖ +V#<bk{TT?D%5k6iߒo xs TH|uH@z9!0L$@$@"w7RP+PNpjgoh9 � � � � � � � � � � � � � � � ES'xGH 깘֫rxɸZ,,xTPk`߾ij-� ';�tq_BQ;0fTVbZyHi5 � � � � � ʗDÌcw4n :eϕ+ ؽ` 27x-*9;<L  @l~aYիW#iҤW+f'ǎy{оRJbZ.\yѨX"AŮ]кuD3DrݸSh3}<#YV~arvԇ)I*y ,YB18!ӋRJ-[ _|&hsʕ|#;Xh X^KZ%$@$@$@$@$@ j8t<(\hX}O-ʨ%? @wlΟ?H$`st۲y$@$@K@ߨsZˀ='O8ӓC$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A@u- $HlPRW$H:~e5ֹsq<�5+0wlE$@'Юp:0mpqYP~g凖HHHHHH”@~}` `v@k`Q"ÇG߾}e\ə\9w;= @޼@6df[R ̙#Q!=ƍ?@Ǐƹ&peL>M4AΜ9丹;vʕ+裏JLLE7gw'-V%.2xYw<qmaȘ1)fq&޷̛7&(Sƍ5hsm3՝<j-c?U@ˊi jL2n!7(w� � � � � $:ܹ5W\jP0dk}RBAyGDyY ]+( @V3ZL$@$&?<5 @ҥԁq3               !p<Чwhr` য় AP]V&>+iz̘ob FkI6d7wV~g$ ?m!$@$@$@$@$@$@$XD ۶M͚-[gxoMѢE SL. 4h�|,ѣĉɒAC O<-#}E}W^ȑ#jԨ?%pI|&8b֬YѾ}{V%3Z'N0rɒ%m HERP+Zԏ]@vI4$ n޼\&&_X"/^((TTIқc޽j!ߪ{/fTP+3@< PĊg"     9.쁬5�4xVվM2:t?f4i*gM$"l AaHZaxe  j68l$2gVbO$@$@$@$@$@$@$@$@$@$@$@$@$@$@$vi͜  l 4n]O<]=,;[Q2#Ф ~=HH :w~|x4,2� � � � � � � ;qEo1m`T: t^f@Æ:r$<aT{$I5kA2I`)R .bŊ_aoqҥ`&!ׯ_7"}ArK/4i҈D<ٳgL~yE3g  %DlPElI`P1Ĵi"_|F+իWڵk1w\ܹstSN*}!LjU`P@naq"'Vd"|)}HHHHH.8zԱV@Rd5 o~xWچ>*YBR ; C� � uJ۸Љa& d{JA$@$@$@$@$@$@$@$@$@$@$@$@$@$@$`GBZG izWGaa4@\�gϷ4HT X"NF$@$@$@$@$@$@En]߀ݏ> ?pkT4dΜ9ؿ?v d@L̙aY?tQ㽋~Vi+*>T~}9ɓ駟ЪU+_ʅ+s̨\#B_~JU2oVZȘ1S [t)Ξ=3fE"f)jAz9r!d"B`ǖ)<\-{<yrs]߾};( 'иqcl۶ cǎ{+Wyh~B )-![ՠByNZbN     Pv ͛�^{ ȕ ز{ "Cea 0 Y �iW& %2 5&  [ 67摀MPP&f� � � � � � � � � � � � � � � xLMHHw_s=89>I~G >B@QP+0AIթ̛D [xzHrd)lKh � � � � � � $6tO?V�vJ>YVDԿKL8cƌIX%aPJ6O<*g&$Iw}&?3g`([,TȨAF`tҥ &L;v۶?Mϵ8p#C Qz˓'8z(v܉""[*lZsĜZ)S&Nl~&bn 6*nШL$&M:`޽5s^+V<[ R4DTP+%oNxz$j � � � � � ;r?re`dGLW_cFX1 %rB믁L߯PAFZv_  hE0� '@A-HHHHHHHHHHHHHHH4.n)Q4!%1$@*l:χ,~])&)JliX |9xl$@!Sw Yw>V      ՁmۀcbbiFo{` jjǝ{b8w=xehI'dΜ?~jN>%V:u}vtJBƌK/$c;[n0-_].3gD޽Q^=d˖ SO=UVIrF88t&Mm"wn{Ժ@WGuG[A8HAի)O>1nݺᡇ2 z8z&M8mvxuŒDxwWgvQ" J*_:J7 X\ZHHHHHH dd�d.Xȗ 2/ o_ºI*>}}FE_UR$ h \YPF('�O$@$`O*U=mU$`GԲQM$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@ H,BKys@Eҥ7G6M}%vԊKlػyX8X,$@v"ڴƌUHHHHHHI uj!"X{c׮vFFnb<&ĉ1qK>DIqH :YI&>|8~`�/^ĦM0tP)RĈ!ipҥK#mڴ(Sヒ !N54?H b- >@%;RJ2'ŊCV0o<9GT֬YcΧ͛7֭[<LX:yИ�ɒXlVʔ67yD@p Dƣ &(3{@I &9r`ܸq_pwJ*F4ĉ13sKHG${"R,H(گ{ Mrp     #P0cpdl5 2ԩ| D+~}n. ϟ/1fF:~507 ?mۀ-[�~e"bt1GIHBY74^?8fI$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@[?Ю]oHWI^I +*uQ+;8=x`&HL;CAի'%lHHHHHH@QQӧGjyn2e *T'x˖-qΈL0Is5K#= A]^Pɓ'Gy3ݸq;v6̵}v)"E -Zŋ7*ĥ5W\SPQ}={@=s(Ur 3kSXZ9s.9,DA-ϙ9IS;zO0vXGAFI&Tp~9s`Oz{kI3D];GLZ!|p5     (t;|urI 2H֭%K1Ɔ bܹF<A!F࣏%'+]& 7 @ժ֑d&B$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@}69WhO|2s&@o+[PA3gBpqcw�]pIZOClYH T`.K#VIHHHHH@Ҥ@/�Ԯ j yL2oAʕѫW/1"Qf Vc O[dHtH*UV /r믿Kܹw޽{`#tu5ϟ D|27o^;wnhL!LÇq<h:˗/cTQUV >,n]' IAD894+@AD&'KbVgKR۶m3~C D!BC1l0曘8q">ԨQ#DznE@E\4Gʸq; JU4ib͍$@$@$@$@$@$rԯG2=e+Ax!;\wJ*Xr%ԩZjG̙]^sTOB 4 jeHH:0M {o0ZOI qPP+qU                iZl L {^l;h`|6ЍZg!8Ȑ!>~ M�/ Y 6J {?]p-l5$@$@$@$@$@$@$`gy@D=Ł~^'woyҥ1n8<䓸ТE (Kh�ѣ)kPfd6&9 2tȕ߾}58p49_oߎo:;$^֬Y+WK#LX9_ K$I^X .ٳ8uN>m^ɓ'q?U3jذ>SB *䚀 L&}.fbs 0~<z x,>(J]0s̠&N7q/v͚5ͳe,ShH =;3*T _~Y?dCG_J$@$@$@$@$`o:6<t(0p>[;|�jsch<w2e?ʳèV.]*s6Qu>Hx)okby &@o>lHHX2 g2~$T\'58:O0� � � � � � � � � � � � � � � @bؼs"qc`VHpZm>HpmMb$('94y(f@P̞=/�^{-͡$@$@$@$@$@$@$t}S6 x-3Ď7uM6ظq#:v{wW&K}ȟ?z@ťK1dn^/@t-#ta;v,BIߏkAG)[D.K,FK2fT+]t%؝w)SAOk]vHd]<||o/ŋU_F0KEO h8w\HOoʙ3 Xj<7o^kʔ)E@*Ud X 0B٪ }^&e[ Uc [.O:)D!F@J.\s_D%0\"ݶo>z8 /Sއ&M @cWpMZp/ � � � � @x*q0۷;Do X1vE0* H  QoCC  jgwIHO@h0&  ?Iˌܹ=/ǜ$@$@$@$@$@$@$@$@$@$@$@$@gNl?˚%[?l6}KY좤iզE/PK +ʒ$H"*}?c 3fsxs9{Y>o@�@ 3.?~OWS5kfƜ?瞓*U Nռ"*N:)"`%=h~ @% WlzO_@�@�@�g}W\V iъmϝ;W;vW_}Ĥv1zYiwzF}4xtr:y%E r̩2exSZK~׮]MH*eS+VQY(ݻӚ$l![v+W.ȑÛ,,~k./jΝܷ֭}_{B�-=P?' JfaX,UD /4,M�~i*ZicF)`Z$V?mh@BGxeYך7o+]Jn޽ըQ#/1ƌ@{Yf;իW/" !> X[TTj+G ԢvsF� � �i zȅWZkK5jSv}76m;LYʕ+@,HHo! a $�Z@�J{ŋA[t P+WD�@�@�@�@�@�@�@ KHIo!w!gmjWUoEړ,P^+*{R*=G� \q҄ R˖KF�@�@�@ eJ6륓OZ_&Y[o0Wׅ^1cƸkexŲyD@#~n)}}TRޔXH?k*o޼yZ;v BR ̲0- % {w.Bկ?I RW ,gyWx%Ko3 Բٴp L}6t^>qe|F8(ྰ>c֭.wNw.ke!h yZ3gJ#͞-1%1G@�@�@ \pZO,ڎ_t'QG)SM6jԨƏ:u}…sI>1JPp@� A^wީ֍}_aH~W@�@�@�@�@�@�@�RYQC#y؏פ[cߗD~[:F߱3 ˈȴqc;ǜ � � �D[E i|[z%+%_;ou}鮻9z`Ѝ7&B޹S4/$VtQ,`A(Ui&ĉ]`B{3[ msLfϙH@ ϗ.>T;6JF K:3˂hDYVZ3g }zobŊQvp\G=pC` P+]\<@�@�TA&Y_x I?X}{|#<] :wf͚SӦMTaGMkjդ=62ƃ@ p I{F� _~)wTxv.!E[>;I@�@�@�@�@�@�@�@ "]uT4w_a2gE*V,ԡ1-^ڵ; z� Ub� � � @4r:YՌwuU\1W~}=ׯW)g%ޣEH]&g#mۖxOko)ti=!@v\wl5;2W_,ei֭R޼HY'Ih2̣*U馛t 7hŊ:;^@ rIwtٳgUժU5dȐ7LF=@ܹ% c!� � �-pQvŇJ J]JeHw%\)q^V6mtg{Ӟ+?E ^}U:Uz)ɮ!@4Ԋzd �1CW/"ad]SaC6.E!� � � � � � � @]+#U(M"R۶C0gdO'jEcM߳ (@~aX:D�@�@�@ G)=xTԥT4icݻu?%$'k:� v b+p~XcŶ,=kV{1Y3暺-j?ٱC1Bٓ_[Ylٲ⋵6fi$@*U4k,/L:ڪU+Y&F8C< i�ۤig܌4/__+@�@�@�D@-1c˥K.^*_^jιȩ_~s9v;iTv^{tUR!F�J@�;~:ubl@֯(? � � � � � � �ē ~㎓_z9iB]TONN?=z}!P+I`Ao=#b s @�@�@�@ sʕFΕys={<v[;j0Ag]֘;A {X!@|\4e4~|^dj*$ϟydN'`BysyV |oR7zyȑ#5}t=@rʥ{ׅ-MӒ%Kd![$-27,n-{1LZ2!� � @ )#wy7ʅK*rWu{O0. x *#b Hp� @.CU+aThQB6 � � � � � � �q'`XQW^yDZX")G뮶m^]==~)F1Z] fy4@ vޚ5d!� � � @v4~4uu:I ;#4zhWg]~YӉ;ۥAB,R6ҩf̙%dHE 䓥yQ Tdw0]#x +f䊙{>Uo]Te˖eތ!WuY\p ;KK/aI'!1Lش@L&ev � � .\]HSH!vgZu׻k*%СHÇKuR P+5G�@ J/v"? /PZW � � � � � � � T oi=tҥcع=,? .F_eJkJVnv,T�dD y3y5A�@�@�@�qҘ1RժRҷ~zW驧Jl#ܢE% zQi'̙rat�(ji([6.Eej* a) 1l5J ҇Jzt9Kt+VTϞ={,]3G  ,^zI#G԰aԠAOMBߖf]d`$vn/# � �dI'I?.h\{uDܪ.@-0otuwHv '@V)#B�jU,mb,`Z6ĸ,@�@�@�@�@�@�@�B)e#~K߼Z)O Z��@�IDATf(B5e)֨;߳Βv>(̣ k+&M-uOX> � � �!ж4w_xySΓʖm =ݣnAӧOO ꫥcz>#WS'exP g arjJ?ش@,G΢ ..,oE `ȕ+(K&<8^9shKQ&Lps piҐ!HcCC< Ok � � @z"͜KO?m%,ڈOT6n:w֕ʨ$ P+G�@ FUVbj_0@�@�@�@�@�@�@�6m" *HK\#Էd['}tEam4X?.¿~ gHcƄ,�b'p~aۿAC�@�@�@�80cGo7ߔV\o t֚5k2!cҰaN!~lLid}!@|qt~֭'zqjaFrFdWp ˋ/J./FFC @j[lٲ?$@J\jժ:, dZzzυ8ij"� � �Y+P4e_L[REjP5Jzg/kԵfZ� P+\"�DT`Ni\ɾ4@ cE19^� � � � � � � @ !=tre/K*X0\v1J޼Rwzk!L I+VDiT;v%{!� .T>\ Z'+|{/A�@�@�@� X9HKo!-_~N*3۷x&FFR^ҵJjkȽ|z:RӦ;C {K6HQVǓ> P+{e)v·W˽s2Ŷcmr}NUXQ=]d)[Aq@˧_~Y=n{ڴiSGXC2D*W߿sX6% r4@�@�@�l(RDGZX4I*^\?cb5+H: JݷznIicY#}! @-;/ժETX1t-@�@�@�@�@�@�@�F.p54t~Ν"D/مal#FH6v-+Sl3Gm[.8̙sA�vmI-ZH*H< [GVbF0j@�@�@�Ε+$_ȅ*B~/ĉݛ[ރJj#W_>ߏO,]*]|dCz}?<|$@ɒra#$Θ<Raˏ=6ʣ߱&;zy~}xғOJuJ<[ȕ+^z%}zꩧ<_reccA \s>cM<Y\5k>H/o^e$jSlG0FX� � � vEӦ;-TtYرҮ]qvaChѽSJ ڴtii۶03ңJÇKkgL ĭ�Zqj @" |'tɉ4jƊ@ XL{wΗ!� � � � � � � @|7ސ+#YEV~oB믥; qX$8ʕTƌIlF�Wy>?1P3>o^� � � �"N_}&M^Gy~]4jcGW.,kȑ{GdņZ,as;Nz4h/dW+$M7I H&$Θ:R 7FZ}W`V)wn˗�3۫gn͛kօiKk[j4DI&1c6nܨ:uoMGs*ȅJÆI#F}oVI 3{Q P+k!� � @XJֲ0lݮT4`oaI[7Bjds?∴ݟt}Iq22+@^ !� 3 :u#rKȶ) � � � � � � � GU .+#1yJhXa!2"˖Ef8 ?@5��t XQIKVΝm/Z � � �d@Ӧ94q4{t EI+J=7x){{ۥl)#-Wh/6Գd6He9,XJ+֮y<�͛ =8 tC ͨ�˾mٲﲬfm|_裥}ŋ}C ;daB<v/᮪ԩSq@BTt_toe˖u5 o۝7?9wމWJlצc � � @l{yK/u,=dǂ,ݒ_/]Mv Mfs^(]{t(HLs3j@�8@NNB&PCq� � � � � � � �Y"0~tqԱ U6L*S&K3#^{Ϳ�ò},0]%P+JkZ?$Y! p0&uV0FVj2<� � � @Ԩ!"ն{n]J)){z (Ԣ2Ž;<Dp.)Э`ğM7I'KV^+y s ̗/#~߷nMybg  M$?C^zΝBq7c{RH 5@ѢE]1ոqc]ƍRZRf}'G `! uH|@�@�2;ࡇs-+H"=_YHθ\9fM)kE 7ԤI[h#T~� P+b+ �SnTξkE5w @�@�@�@�@�@�@�Xկ/}.[w:uZ# 2}ɹFk\a~Y!? wRեRO(@�>Z0Aʟ_:�W#?A�@�@�@ ;Ft =v̙ٓ-˂4X`X(v};%[8ZZElǎ!-{K W_/+<G>gKΞe$ٲ%)tk޶I{N4j =^?Qfm'i5*H@.vWd/p Xx1HkJ۷KAØ5KZ:X;'� � � nwwf̐Ε4nͿ6ˤ~c1kRr咺vA"?ڴ:v^|%+&p@B�@�X/riY$@gh � � � � � � � xӦIK͚I%JH>6mZF7ON9% ݠ*VtiNS"v͘1)@�T*WƎM<{Tf � � � E;C^xA{n]^=7$+fbqgRpOwecHY*[: XՕ+㸓t-M[weʤ~7Ke! l*% 6M:9B .SOszQoY_U+M#.p7l0]q:s9r[LYSnݥ<4=:h:eD � � ]jդC%;f?h4}TƈҖ-{fKy[xnqcy}m[\Fl KEC�@�X |Uc @D@RaC@�@�@�@�@�@�@�@fΔZ>Z!ٳwߕFΝ;?vp>hq"P3DVLFvܹ\0;f� "Ф˩sO@�@�@�@ vsK]$͙L,"*_^>7OjS?{ vmɮqNb>\alV+5 =50>#X]J%JH?XhY*]:J# X,L-ȟ?<}NĞZДMŽ+}!C{q1[anBRkScG 7Of 1cD~Q*f;w<*5*hԊ:eD � � }}ҷJ~*+']zTt?D ##,^\RRkM4\5ֳg{cG{wLR~%"@R?Q2@�XN6K 2.aQ"D�@�@�@�@�@�@�@�XMRݺ~ф/Əj԰7[3tt4_.]"U,ZY3رټ`�<0>RQ@�@�@�IaCw}] 9u u$mtg3nAZ<A,Wv*B712ȕK:i0i#J[ʔI94km|f5snM=P˶Yjʜ0h XH]wݥ &`i'>,%Kgի=\W|Gk|eò}/3fHkքpt9vmx � � 7I.\i' 5o.-4/`STۅ?>;njRvCT̙rsFwT/OOvR*.ţ!� @,,PjXe#bԊd$ � � � � � � �,`Ա_Ҕ)Rz{?p@jJv#t7SON<1BP*V$P+q<Sz=q8h}J='"� � � sr,\-,lˮ :T矔8u_/֭+KϋգV7RR PlYa_,�2`JOʖ _c ?˿)yE1me�s*~j ܉Trȱ_Ƕى'8 C Qծ];͛7/ B3f|%ixD Ի~j8h�R Wc6!� � @bw} Hv>ERΒq='yI1ͮMOԹv]M.{®RZBڶMb%KOGq 3&H�Z �d_hݞ,b-PaC � � � � � � � Nŋ H0A6Mjx|n߮]; DdHFJҒ%q"Ԋ₄�%g!#Zi3@�@�@�S o^{wi,VM:dI˥s/Jr~ο}Ng, l`@aX,Pk"/b/?ySXAn?/^�(THR? #:uyZ lڴo, yq@jK֌3gLpH~C$.yiȑQڴi5k$@G۪.%Υ| 5x@�@�@�ɾn-'-]$;ԩ4iBjVvƛoJMJڳGע1Uejm͎[Z&һJcJW]@ R5 @� dsSeEYX1~ � � � � � � @b E]$r_ 3-R8p4h ?:u\q5xdoucQ1.7sjŜʮ5r@�@�@�Z`& l_sR͚СrEM۷˷}!~ kz-p5HVɂ6ۯalM>@ ,}HkJO'߁@>.u潯:u8ng/<y(gppҽ0,glxwyGGqڷo+`Ag)Sc[$O.[QGM 8~h � � �(_^4HZJ1?&ؼt #_gB,lɚ]cZZ{{ælo^0*;f?`/% [!�&.ϣ!� @ӎ Ԋ`Q(Zt6Fƃ� � � � � � � @Xq^NOI[.0o<?^~{O O,jUR$ݷ@-+jgh+&'Y Ȉå>J+\_x  � � �ď]xҷJӦI',]wtqrEΝc'_[3b"EBTKHm}p-kV7m?jB)z-Q[Ѹ;cI>XaA.R24})P ~DO8RRi =! ܇ٳݱ{B,\@h q_w'-Z}w_ihXZXZ2gaѣC1 :A<k3@�@�@�ؾϿX@P-;ŽY U?]gXLYSZ0$=n}/dg׮8?Ҕ;iK[sE� P+1;F�o ʖ B.`l6l > � � � � � � � .jtUK.)͟/u?Hg.l:무ڟYwߕt "q Բf;hhN7N4@ #vnIR3#s5 � � � Xڿf؊9:wԞ- 35X8 /ĢG[/}sI\C� r"zn9F"(6=ȟ?6g'ey $;DCP*Wo\A]5qC%E r'pg}}v_i8? /0Z! ۵y7 /C�@�@�ͩ!C$;GԑWx?!Rݺҧ֎N;MXѿ<.@Yx<&0 s; �a7OOGAE$=A�@�@�@�@�@�@�@�XFryX†JIÆI\ %-|ּ.]xWzZ6svd?(YR:H?PQ=ʘ@۶ҍ7JӧKgy*?]JM6m3mvW%yСj޼_ԧ.o7pWp[{ pB6̙suWJ*G˗oϔ]… {=� � � �Y#`Aڋ=ݻ1cz%۷ovݮyZ*+R]Msj۶m}&{̊'l?GX#'?ۇrvt_ׂu{ʕbI'%ؔ'O&{<c^vKC�pj^4hoY2Kɨ?JgռP,xηP%޶i~qɝk݉6lMvƍ޶QMd6vJa) d]U^Pk׮c߻P!pv\~/1ʫZEш#롇~cvywڵqxe㘶L~ߎQ?;ҝ\cSAb! NW\.}?Wt',B!`ų.? 1_8ϱj*_~g}~g_&ܶn{T;=c.e[^+P @�@�@�] ]8=Zm,Y3.-=~Ua$l߭ۤ-[(nӮ\ymnH]xDoEpm`׌T%ob+װĪ9s䎅[v曥JyG vZcH@�HUojR1?@�t X;_� � � � � � � �!XNzAi?|RC A7WΝ=㎓N9%DNZ!KM0bE$w%P+ k믿~:bmǃ,vbj.LLtUn~WjK .dL.LZK9ApWx 5ZF+lrե/ݖ(QBs Rq@�@�@� Z W(f?kO;MC?eپ+LV F4%-j I rW}S:w.,YӶ;}aɧARGYo ~fLVڥJta]jK ½[ [!m=vkY@AAV**T ,<DVvmi$ ^;$P+kH:mN-nWX V??"Am\l{ȶh6mvFav8?5vQW^l[2 \-2eʨty0'|l:` \f͞cv&{`07c0ۯ5wȶ[նS:ft[ݶKw׶Ӛ¾O,ֶjlA8Mpk5v2 ~X'OUW] r'B#v?xZcrw(h3>mɤ;X<}~{%&O}>?ܶn;I2v߶km;/ � � oۯ)r`}׮/=7Cyھ_-nmkO,8+dOkWIS_w>:9!yq烤|kZI'kڱ _Ymt;lfsD^ktZ4! "R 0@�&+rٴ0@?iڝEC�@�@�@�@�@�@�@�8pu]jR' JK^*w};zjpU*z)KW+m&j/-x@}=ϊ#`X??W8)(d3Z]ܘ]h RV͊ URe P]K0_, #uvk%ŜA=ffE,X.$!ʕ+2 � � �,`_ +Ztp <WSIVwY?"V( -Xsp<gmBIn(8E{~Ұk)iHǎn0]^ @nS<5WJ.'ܵk2-+,em} BTAH@ , lJrfJ'+dl)ZHM/^CC jIMJlZ1s :ڱ3gzӬYpB'l*Vssl裏8l;PۓO҅v}y_٭x|1,F(ر:uxS͚50Cz;i58Vi(Ɏ!ZV5hvѶP)oN<=+EHwV㕶]oBw}6qKVcdivk hfa.Ne˖MCC@2tP[oΝ;%<vÒ%K|vϞ= o{Y}6~}ṼsG=ퟱ7>ۂ8?#-ǖgիW]re@#^NyqiԌ@�@�@ ?HS$4twvGgH9}=?,_|d}IC훴v'Ic_Cw?ւ6nHw}Ѯ hlՂm*T횛ine"e*{^j-,eӥ֭VB<; j%g �p MP!@LnZ۔9@�@�@�@�@�@�@�b>AҕW3]2߽{"_зdqv$0SnZ<T4c+Vd0஖ e˖.bم}ŋ'}Vp HQvBL)P߬١ b~ϰB}VɊ%BPHtĉޭ賋" $"I8!� � � uS ov=kr dMv }YjS_ mԭ.o0܂`}0AVҐ H x udf,#VWICm\)+l~0J8/` vWlS]^|/ze)* ,c6}^ Bj׮>}':0'y\-5eJͶ.]Ey!sѐ!Cth=3Լys/͔1~cv|֙MVxՎUڶ\PԶق0RJQFmֶ iZ#e"Lt-mv pLy[ێ}'*wLxv}}67nK.D\s n}ߎ'N kɚ1c;wnY`}vۺAb|VYdk[nJ;[!j{WˋYknfvJfקԏ<FPlT$@�@�@�Me ^:~֨Q~PsOkn;bM;]b!T,�-~{מؾܤS<yYfm}p΃;p͎G#TwRý36?Gb׎.;SL~]z>^f=mxAg;wJI-[JM;IJ#�.l@�5kƟFS5@V41B�@�@�@�@�@�@�]鲯]]WOr C_~b QmJ(+Fc\_lcq)-"V$ֲ`s"RF"{Sp]hEAS֭iVt:.^ +tΜ9UVZðuvq[w}+*fE+WV*Utд"4@�@�@�&`hPP8 vIZA5WhU c\@S!WuGۏQM۹׷sߡK[xӢ+``r.eZ~}nuy`6mٲeEy^x, g&lhT�4p4zt6/Xtj4X<@-y_~{qX(}իWOݻw,,#ޏW6)imЙ3gz#&Msm?ژ<LuIv\eVmŋ{=Y&۞'pZj兴qJ;fi]:z Z۴Od/M2E?cv{c*UO`tw駟N<8`bر϶~GbS{]j Np,>m }όYfyϝjAM\>[\l;�۵z?@�@�@ 0 /He,)hdSrcuBG_omO/SE^77-lJٵK, # Aoc׎u(իWw-Əlnvx!Z+$G�|v �d+YZ OBHc?:w>+z!wŸ O"DXˌ@�@�@�@�@�@�84M$;Ҏҍ7J]'q'f<^ d<q&& Fѧ@qŏӥG@Ϟr4hs3EV\ڝ7Bgd/-V ZؙMV nܸ %kԨgJԋOcX: � \!HV9(?{oە+Wʊ ,/^ ݎ|m%J#q@,~-BZ0Y@WЂs+e!6YaB!=$  sΑ(qEi$ӦIg!I9g,W\!4yrxY=/\qƷoU^pN֭լY35jȅϬE|O>ĉ0g]t&+`IK!͝;+_k޼yI-ɎOZpMvK1%}Kٙ-`VՊd1?(;;wnovi1L;igZF +_F{;B{ܸqڶm6l *>0!>daÝ`ka;wVǎrϳw3;ָ\�Sٱ4�Q#|k[g@ nm夷v?3١kzﻴeK $ sZUoUݺd,EZ^[n}l?O=O;hTLի;^q7eٽ^X^['wr+_a ZaXK@ _X-ξk;4<Vo$~y3v@�@�@�@�@�@�@ m-[g ,TΗp_^kFKKC?嗥 Uv'#;ޓ:u+.=Fv  l޼Y3gΔ:/UCV Yի{0ZOJGv [bu x;gΜ@�@ q^%q5#E ۷o [aKz-&+n!B]5degʕ+`dwµ,,L& r #,<|+RJ ?ҕp.D][r8bN'i1MHd9璅<s^PIlRJ"3F >}*6ڥgz:utWzZõ?wr+4k,Ws+r"Vl~,H˶sh}.\ }/næzy~'h�=[DžɍLHz{֝`;)4i}nw+NLf,f~ɝvۨDnvޱsEUʀ6?:LdF �#`ן|i&O)SxaWJn_)ʛ7'fU-s(:[Gv}ԴiS)R${�Z犲J@�IGN8YbH&Pd59I4@�@�@�@�@�@�@�mҰaҀrEenYYrBںu,P+GZ˖QetV\茇͛KsKI_ d}[1I&>W_}mnc R[1}zEjԨgbOʖ-+Zn'Vֿt}A7@BFԬY3լY+ZA�@�@�@ kzEѭ0ŋdY:ر{U1W-B ^�P6mry'OTD[ o޼{R.ł-.d-[&+n̊YqȈKw~22^.ҽ '۬q <XotzkԨQ^"s {1}':t.2X7xwL.ԩS{ald<kժ{;6e!Z�3?Η/xMImZô[ m܂Mݺu/ �:ʅ?zPDz9;g+bpTxt6[vM^{53B=z l l֝:BC�@�@�@cƏ۵kRN9/n]waQa[ /qF" Bɮ}sUVj׮N=x}B� v,ѲY, � -UWIܒ 1!C{ܵl(Q?kaa,B~K� � � � � � � l. .nt1YU6stGy$F$ou֬&O"7(WeL~@b5I\$F+LyfH~~ʹմ˝Xzj.\ػΒM%KLl(F� �DTU"bY$h{& Ul{ '탨Xɾg@ k,nKԱ7m-cµ V0YgMkv{o+'=|,�.r7ӡ;=| F  >CҦ[NNy'→gϞ[ea,>#YmX0Iڵe%WzThD`صk_|| +Wz;vE^W{OWSN^@_ H[oyA-RuW{`2-u]|mЍ9 ի,;Q}p 0荸qcre驧76F�Y+Gf9@ ,Y_ vH˖-qMAx_?a:5"˫cǎ:Tf#Dk]wCq�j�#� +,(\mV,yƓ�;wmyE+뗽Mԥkq#� � � � � � �{P/* 9.Tvտֻwo-_\Jer.KBG-xԷo,{²Vվ}& ��@�IDAT\)Z{[\^ʓ'bc8d#}Wŋﺓg0]bżbgy*:.]: {"`'Q+rh[VxZjŒV @�@�!*Xbs3}7ZjTvUh6:v@ nl? oLWB ~Szuo7c##Wwʖ~vw~!4b%P1bՃY#bAD;ԡCBOɽuVKo{/w5:y9}{=M6M;v p6o\M6UݺuuG8`| {ҧĉTgumڴ\rgU]jU/ɎA]`ܸqeғO>g`s_4x` 6Lo=zy֭Q#7TDV+#B ;x]ǿ3ד!�$:>3j(}p,pwc 6d[ \ٳg{-ݮ=s.Bu]ʕR5MVx% �3?НJ2<^v`g:t%+LDz~ޘ% � � � � � � �*kk=H+VH={* r BՠV uE.N;-#\5i"*Y2:b$~hJ| u" p +4ꫯz1Z: ;j߾ڵkڵk'DQ X>+hExK֭7Y: � @x^%뎞#f͚3gjƌ}+NnȭinMVBL}@ll… eaydE`iwN:{5j(_|(Kz -[J<7ݢ#N\F-FVQ2uv\`4hm۶DK -lΝ^V^BPfo^ufѢEժU+/Ȃ42[Z�;Vs\B y~-DȾ(P pK�{ZhϟtK޽{ky"Պ+&Oڵk;oEPs6zƸAd ĉe<d�gYKwfI2@�D:u8 Uʟ?t .@ 4DH2y&ijڴ*P9<Ŀ�Z_G93R^� �XXʝ[:΁!@jv@�@�@�@�@�@�@�@P\ԯ ?ʕ;9rX|Wl_gmrEUDu,@ht9]#fMf lܸѻ`/vou% N}%'OYC|I}W^QDx֊>6q閗]vW.MC�@�@�{ 6m7Yw}'+caYjҀ[ TP-DOcM--ۦMdlM??Xg zSbłq qpuIw)* a/㼣&uA.s֭l{;Ynp5[k7gΜ+Hzw{(_{51 .ˌed<6oެwy OUD uQ(]k"qsasJjx=z;-/lfa{Gd[=[ܝ(fv{1ǨL2c޼y7Gnz:uK{9x ԢEh ,Fa > ]{]no)[*X0 � � @ رCo.X@5S>^nUE6 4]l(.ӧz $&F JP@�Gï%w^ 2Y~-g@�@�@�@�@�@�@�@{OK<v9 pEĉRfB @"~7HgN̓hV<h4?{̻hъuUehd"Q6=CO4|p]|źktWz  @�@�@ ~6l}vO4I˗/QG뢋.R TfMQ4<~=A 4P^=o K9sO/?x|AmkiC>x0{YRz>Zh }{'@{_裏`*`>7ݻ{UT/֭[aoҥK5dؐ]VX?}F ݻ7Y}neZbʖ-Pl;Oh=d׺tJo߾S|yp {& ]Ô)wN>du'="P+}7nӿN,drQ yJL?- ItM޾~;t#&]qy&A�@�@�1b^WK7]pzeghe˖޴j*ٱ{曽kF<[�1[ @ uI+D lŊI7FC�@�@�@�@�@�@�@�u"t≙7?t+ׅ7K.=L{}v*V-PΕ X`w!ѣUjU=.t| ]f],̥d_xx+UtL]&3C�@�@�8xۗ0vXYa対JEp ^1y& ,PP!h›aΝn\M2śm۶W~6mT\snEWntoFdd5J Co-[%vfE4/29+x뭷 xիk^I c+o̘1:S5h uM ҧp- ~f߅}Y5JEB-x(yݻwkݺu矵rJO�%vԩ.eƎp'~jذbPl?}1c֭{K:묳dZ~iY/p嗫I&:sVN_p6.>߳q, @�@�@ [,|O>޾+~lB=Xڐ;SO=z!=c=zȮ'!@d4 �!p&Rtn"2w+N]@�@�@�@�@�@�@�T` ͓^=vaZ4`�jJYbQ۴ij<#80Ieb]]v s8q{ ,ʛ7ob07|WX^UbE[!� � �dX˫Zj7nZnYfiڵzջwo=냥 E9rVZ{͇~Op:-dذa X膅Т'Ы@zdne…cׇCY֭[ծ];o;B!,h0CMkX}~Z!ʻK_}f϶޳>[kזL<ٝ4OVp0,g"`ۭ/žBWΝgE_-6hWxqլYS:t?֊+K/5x`U\Y~;<Yx '=ҤI370(GdE~^0\1;{?u`Z>?rQcA�@�@�[_~qתU6mx;~k`Oߋގ˗{1]}ժ[.\Y|s|=@�h lw\4ƨ�Z^,@�@�@�@�@�@�@ |"wAԲ\aiihSc;?\6Ь'KJ%h5FW]cLm09D)cT!$)CBH"*C_)Q$ )TEB <eintu}=}sZ}4xMbՋI"sd I̙3һwo)^lݺU,X`ժU+ma�*#xܚ5kd̘1_aQFEYH     Gw} VRE֯_o۷KRbE #eI dȐAjԨ!uɶmۤM62g#.�aÆѣG6,"='z\EmI`k-90m[Ν&MȲeR^+d)ѓO>)&LCJ.]^Cc=&ʕ˲dʕ2{l#±�$5@ލ! /H>}L?<DX֬YMX >:,D+]j۶,^\;N6Iy39Uy'q F<L"M65¤-|!>EE3Ð8$     8o#6~�ϟ?`CK/50. >WEz7 MC̚PP' � � D?.Rp3fv$F@PHYM              !D-"3g@(_~RjUb8a/Ü9Gž3=ߤ/D;B6S>G;_"I6ˆ "#F0 W"0/H._L:H:ud޽J;� � � � � � G�zkLTd* #<"roc" (XtɈر l7Iډh4yK_EJZwYP駟6bA@$@!n6fy뭷eAzcYt̛7i!(&@,YLnDpNݬY39|pˡJwy 8[oݺU^|E#@WZ5)]|rN;3gN,-I!R\~})TdàSZKNF店lڴ)je U'N$*LHHHHHCܹsұcGiѢ` ʕ+RJ) sMHE-ҳgO3v8D�h$@qOZqY  x#eKRM#jAL Z4               g^vm!:^,@.rMVk׮5q#->Z <puԸ6It)* ٓ qIʕ~H-[L+Ug=@ [nn:ozDckW4      ̜9V5ziAxc zHH V@D b?,X @A|X)&բPȞ=A$]BBDTCJ IrL$Hv�+8q@p CG>z2?cDKvi߾zcjժ203;4;uٲeS>?/vWZe x )^@@L䡇?P,q]裏-3f̐YQ U/X>)VƳ4͎{z4      $�qw}uҧOI>}|Vym۶u4jԨ!2$@ PP7%  ٮ:I3A %�A-ءCIK$@$@$@$@$@$@$@$@$@$@$@$@$@$@$ɐEnE.kU53BZ̛7O}Y( .ɓMiQ袛e׮eIѾ7HFhD,%Mc/jDaڭ[ƌ"uRP+ioٳL>]U10̆gn؆9+ݻWFe&n"XZM6 &p &0!T}uǎ .]*^[eF$@$@$@$@$@$իWKեur=Ν;wޑk6¸5DѰD3D/1:p1B.0`R]qHu˜�.7+5馛dرu]'5k4TkEBo?Z''53DΝ)QIM="$<paСkN7n.4q~+>zҪU+#^͛7Kǎ=~ KRJpC״/1"{ 2x>R+-ZdA(܆'C?ĕnAK|ʕ3m;ôO?TbŊoF7 \ĶgsgϞ 'ྷE>PMJҥ(R.dz.媸ڴi2e3fɓ'.B:2B n„ z7Bd8v,)l٢VfL$@$@$@$@$@$ '?w⺘E3|p3"sacRZ2eȲeĉ;f;b, cr� � @hlݚ$E!d*$�R$@$@$@$@$@$@$@$@$@$@$@$@$@$@$p!5kDD*UѸ DRD$h %�9]v 8|}v.B0/_ImP@Bn~Z#N CiK2|,Y"Փ/X2g,T\Y ` !rӰjG ̙"A`ȑA)@ u=_dz駟~5hH @7uTm+ic)Bb`AC/O k<C3 |9 `UguHHHHHH UΜ9#nɳ=UPm۶2A-?C[jSx+=~֬Y꧍6'˃a>N:w\cXˆE˛7 4H'.]:>#ZиҽSONjg? F ik:Ap9$qc7eEM䣏>2}5AѣH{'ClTsڵ2nܸ)G55]VXa;<mewQ7=ӧO uTP i> cJ5ʼg/ Y ,haOOc 9ǽb0q6pC"Eȥ^*7N<髸!]WT)cYU6O>Kܹ{m<-?BĿ1 ##h"NG:y%ж¹(G&    HzVDhE`?q�mڴ-, @@;zqc  Y[.cH PP+!+@$@$@$@$@$@$@$@$@$@$@$@$@$@$F^u}"*-2{h0ڵØi~7tMa#rLr|裏JM`d̘QoSGWQ͂WvOٳg Ҷm[9@(=';˥dق%P$Hl܏b�?۷wyG7oٴi&8 bnI:wlذgϞ!mZj5#f`xv7,\¤!x Kyiڴ۷/T � � � � � GTv,L4c:vh1~pT45} {~_<ᨪ4Sg©\ SNrmW\!={IJϟ߈L8QEK֭M_],e'ѴuZ~ Fnx&_/W;wR"n.GC'dذaҥKnWSD{b-B {1}>X̔)Sdƌ!@F/נM4x*bM-dHٮY9AkqSjժ-[6"AT`C柀/,<4kL hUZjfLDƛr.׏ yaŊa^}U#XSpNV԰,ӧ{}7(PO<!k֬˗;*ax3< H1NG:y߸v0uȑH.*ic/gJ̔HHHHHH 0o߾2|p)W\*R"PA'l$^D&Ol|{#C#OUXj  $E,9&D$@"Ӌ:b%              4L`)SFTHtʕ">ݪ'?j1,rKS%KL5TZNa";wn4Չ:H \| J&W]u4PZZJ"%|&Qk?[Dm}b@ Qh;=#Fȶmf;w.d9&ȠQb  ,y,L!"6m/중� � � � � � x&�8@K|io-#gC%h_B8v)Pv,|ڵk j*.[<3Q˘!jOGЄhޟ8DտRM�cw!^l̙#KZΩS  v765L>,~+i:ˀ`Ʋe4ơj!_B,f=dK,Cʘ1c$`|"O~:\FA)Je&k:=/]U.L}T!u/7of?̓'1v)^r%ƛ}?Thx+zXd|{ scdž:鈥wxRVz� � � � � � nݺI͚5塇}wnv PI4N 2e , � � D-̐Y@$_(;L$@$@$@$@$@$@$@$@$@$@$@$@$@$p!MDz7NTId$ƍE.mciӧ/62g,wyN!C@@'O4ACz)ɟ?kXp|(m/_^O{8p@y'{ҪUdy%K0B,]*rȭT\A-w>gϞ5m޼ " >6|Xԭ[}qBF (RFBU&8cG h?>Yf 0M<Z SL1ׯoPmܸQڴic�!~` {lo/G@?A6(Ta > RoLVód8]JA *!P~WSLEa1QLثʌ);v0m0GkFKogD-_{5'I ٳd͚q60-Z$`!EYl̲oL6#PQHȑ#RHFȔ)mڴ 0]<.HHHHHECv';} WYw q?? /|WxH x߅wPg]v2ïIo(BP o?ʄ LJB>?C.Sow�}-{ks1سg ȅѶv8`;_\B!|>w}몫ɇRX1%_?Uw%OF)M5ʈk-_\^u'I66K4h6hE}砣]n>瞘_vs7Aúvj|²db7x'E@h<R>Mb'{~]n9[@roٴW鶾coͳ۳׽傸ѣ] g ;vG+Wdۡ ~I9F;*^xCO*UL9Зx 7*d頏ԩly$7.. >RG젏O>FLi{7Y_ >Q_};OjGzfv-IMflg( w߲eK&;޵wq: ƪUg8/oLoca))e?'^ʕ+M_k(q cu9sS_s"zN nL8Q4hpn 6uhA cz-}'=}k$ p}*a2o;gs1rd|{8p׃scQ<‘g(ӄ T � � � � � @ `s wV᳀{gΜi[>FK| =|K6y|[̹|&vZCR }ߗ//0kQϋ ?vE81F$gO#  3g,+}z?>B2 0de]yeL%-W4SݨVwT3s             J`jƲҥœƫ;uZqQo4R, .d\;0<xUtio֭[g-YҠ0K,o8qB2\r%&Nΰ4,`ըQl,`i�J?4HIqɖ /XVI{$K'vw_Y:?l߾\UDq]մi֎Wm%?ȂǶ4XT*, cnӛ~zK5UT)K"_li 3SV rd`N׹ʏgN4PY6tP+cƌ5AE]lڴ,{G2 .dݺu<^Wn! u #Nl޽hnZ`e)vvSͿպohʀ4wj:|Cz:ӕN�ZK cqqm?4i;v�c8 4 I/TəVZ, .DD.޴#13#   HFU?$3k 3eW 1} x޽ܩaƌ]X%F[ٵ,T~'�W^~B &xD"4(rYI]-'}-{ Pfԭvo E8O5 W_u@"N8GlLYQ^ytG ['7WbnVܹM5 γRA;Z@1wH/]l-r{ܟP*_e_ 0|02>WW&Ol|o3x3c]u=زO޴h. }b*RbiʰyZõkӳ߽믿6V -e]G Ni8m۶pNC_}Ч6 G7.f**f5ku@&'r%H4Ν;M*k-1B?yՎv͠]=>cS8:[n1@!<Ƶtqi4Vޞ^磫P>}߹詯?sϽnχsCz 0 V_5`[n5]nTʵ]x \0_׻g,x{;g|@H'@O.SWNXF>.i$@$0?FC� � D�U_iLE<�{`n& 6N'O%z믷˧jo3 |Ŋ.K~0{7\kھ&MH6\"]|ysΑȊyG:UN5a[� (6 � � @h߷i;;R2(;@cfs:L$@$@$@$@$@$@$@$@$@$@$@$@$m4e+�r:udD 3 j@P b A 7onobD- .A~{SOPja|4f'i 4Zaeʔ56p~Up8s`&{-Dh$h0ii0=rtǏ7ED=<ݟ'/60ж?H)WZ5-.vP21]` P#F�(�m)£اO>.V \!P6S0vH]0lA-3AmCpcVZeѣDD 2O<a]qfB&dh=N`$@$@$@$`Y³b�nR^XٳgwQ[P [83ﱶ8Ż-`3 At ` ja9cU,C{L'`(k>/ ffqW'PV`;cʻrJWޗxb^˓I=|}ڵkM}Qz֬Y}[W+{kɉ}b/BXح#.{5?R>'^ 9 �O wJ87<vyZqN hg`'O ~q0v򺻝'/ᴇz GvaÆ HQ [Pkҥ4|cls.?m#C?Uvm3鷓�'HO/9W^md?Ǝkb?xYf3(ZpiiH+TyEaMm7[.\R%uwz.wr7A-m_~ŰAdv\\cݷ8� 9]gNϙP@G:y1v@,<,@x,2ZPq+ xH$ew$HH ?UL$1ooРA2wVZeT} }9ھ_s.L\}`!A lA-+ن)k?v|F"@AɧכHHH BnMʨpelH rChYm              4I`.}E>@@EZIg#EuHr#ңDр_ٳ2aQ()XXvm5kVQ EW5kɒ%.]Z֬Yc;vLM&9st- Z/ 2NZpGƌ jɓ"Vo*1YlhP ZJ_<R cqx;Y]}f=Dɓ\[dL9>R@,Ѐ>Ɋg9L?>~,Y_~?z-[VΝ+:Qm#} :l3}t9uh;>o֭͒[֭XBT"&M:u긖tbk":0m! 6gI<Oz-ǏO^!C̱w2fCl;pAE⚢:u!Ӧq`hEIKÆ \rHHHHHHRK 93tAkQlр?]~PT!(\OL ~_wuҴiS�˦E$kq@0O*U ܹӑ_oIm%8~۔{1UA+?N|(6c^vب? eQ{[kҤ=I ҥGE^Xvݯ';'o'w_v@tҼysw vjՌ~o $%ۖ=a:-*dh8r)=vuz{<-8p~&{ߺuvUW]4۷zĉЗ1/gD2qK`<O6ND>NiN>-*c5˝~;y@>@Nٮ.*T *Jl�Q6e:rQ91C`peeA3zaNfCc?Ss<kH?=I)N=@h:F%J6N!QR3~WШQ#QU3~zn|9m)Xϔ}vrH-ȑ5cHHHHHHA ǿ/Cj_o~b|mŋ7?Ⴤ_S{9ۜ;sgbaÌClX[u6K= .q 8O#HL{ � � -[Deʘ) B IZ yXY)              E]}WdFG?1-T B+yj!p C,ORz3 /E1 vZ V@Aa`ToJΜ zj6p;rgAygTݽ: vzZ}{H  fźy{WeJPݻeڵr]wYKٞn#:� QFً\v[߿iO<smQyvPΝ; `hOD>=E6mذA i1{bjfͤub҇A6p\'F,̗HHHHHb�Ά h ~F`>̈*㏻*?g4?~#᤯Ek)]WAi^|lsۉfl^68^z|G}]Νͱo9s|pkedy~v5ݯ'Oiߟމ}B 0<`72b! ~ eg枠gR<<2Mx�Ϭ={۵i{} @c, T/6uTiܸMB ,! 2p/Mr|>k[_|!zj#+@׹`_Howƌ*U>@ի()ŗxi6?85׿磝O4m#{{:S{yx>m,9_MA0ucogKo˝3k|{0yf}Rur|$@$@$@$@$@$@ `�Ϟ=|E$?4 >H'D_N\8CyN})iؿNE S=2 V2  pL@pǛsC PP+Hp܍HHHHHHHHHHHHHH nuEzQ' (* Ҷh`E`ٳN>m%W\ftf͚Lٹs2+S@+O<ri{ҥ$}%W\l99qu{= Es&}of^W|co|0%cg%s)QZtLS;(OF E� Ich>D#GJVLuBVH��@�IDAT+M,Yjm wkӦԬYS&L v_%hO@l[&?$D}ɹsmNkѢ)7߸s-ߴiS3gym;Ю;~ԨQDiӦ&~G&09y﷓7$׏x̐HHHHHb�@cǎ=4 0c P< p8 'vC#O>,U^!nݺ۷ˊ+ctWtxusE.t-r#{$\s/WPL:uJLbh6ly* ~A|y_9r]:^tF$( <W@ (ڞ<?kŋ޽{ hZf*U*,dϞ]ÒD.or춡tµ\PW*�HOyytwʣ>j/i̴ǩ}=.|vX|lذA<۵k\mGEs=}_#yNYuՎ;RJ?| pM@4 ba9uhޝfs@Nk;1ފGV<k1L$@$@$@$@$@ p1s‘O(tK_˟dE(|&+PRpZ8mԪU+)39 HV$(3  /A$nRk � � � � � � � � � � � � � � $w$5vH߾"Mڷ ͟?:ѝ ϚJA8 ʕ3˾dG,Y2eʘu_}Um0y}`ElٲɤItm-[v޽[�'A/  A 0va7nkx僀 ȆJKLӋԫGA<iVk֠矏K|�{޽{`UvE*Wl~zjK`-boj ݼyi еn eY} S0]h+Ν[>SM;g&;6?ᰩS1-+cmٲE7nlD^z%Y~=!�͚5u֙u-J`1嗥y*p 4       2!} 'F`}I3m /wz8- >,~ NZ{x)^pW'pSˇ1vW/lz@gqY:uosŃ@_3<EfC(89{ 2DqAlV0_|ҨQ#+7n,/?sIDuh1@�4չҲe? i=d$-_۠ ׶m[)Ym!\!nɵ,?ue/@j޼yk%or 8R.W^y? P{v<oʄ~?afA?;yf||LQ~a\w*U yǎ6mژ{HL|Aۙ\t?o6][o?/h +_jzC3g&:=ca4ϙ#}U_|(QBGCU`IHHHHH M(RgQJR9%Oto7">!`ɓ'eɒ%. |*_BǛoiԭ[791y pV82M  B�b_Kb�2X{ � � � � � � � � � � � � � � $ ĕRȨQ"={B@S'̙"1a>~#@%WXQ_Xz-w5mdÆ ҭ[7LK`p?߼y=`:q 8ЈR=&KՕiOmfA� 4Xzt7\@(QRJ=! k׮=zG > vq1W6鹖c EF!#Gٳg{ZAg+D`yl׮i3 5A֠AA/L:E̙#W\qybALk}ҤIL6={v2ey >\|IiѢ 482;pxC$}S@i&L0bTUZ|#ML(m@/f?6{ §0;xg}&3f7�ӧeڴi8'#Ho&!ʌ:چ�p/ 41n@I7 � � � � � @ `[Ǻﹶ πT3xA r p-BYfC`9~IvҤIo>ӧC@u}-v�_`Ncvi W>8wS65_>ї^ݤ?I=2W輻O }qnmܸqef|Obss_K7u?'e iȑCK eCKyz&z3;~hhRj~jhg?#<vyZi@֥K~|pC~}{7Ϭ#Fw/'\:oC/e`{ncYv~K6qwoߣN{}~j{;m^zI G_}}\,!ągfVou|t7۠vݺuPC}|́}{Xnxٳ}wߟl+W.)P@!|ø sG1ꡇ2=tr{cmy$NG|X_nj#8^jhRP+^M$@$@$@$@$ :!;vlPؾ$w='isҗ૿Sso 9N|&N c- R!vq#>}̟?̝߱͗p5Æ ҥ snLH ,sF$@$@$!JYK/E(3f3 +⤉|eO&J!`HHHHHHHHHHHHH#ճeaY_nY}Zֱc]i Jg]tEV̙-<keɒݻ`\WqAzgy*Vri6*^IC[u5WP@AX*`�K퐯N04+@~ ֵ^Je˖ֲe'iFQK ꮢ:�~KI|⁏N84ؤ)NT҉H^履?&hY-J& $ g9sLE,2TXyHg =tRK62 jpE@ug`N|4Шigjj޼, k>hg  fВ~zKe2d{14@Y O_ K 4T҉~)t;Mn3})ѶsRʢb`昣.`>4?625SZu?,j)Riڟƍb ?(ji6KB-@3WñNZhzQI$@$@$@$`Y³b�ewn|xO;`,QwSY9`?˗/ﱊ3>ҥKw𫯾ݖ YժU3#gϞV\Zw*UX B误EE-`  ^nkȚ5Mhdǂ%u_/ >%}I|y^ˇ≱zy<D}g|k[-ZԜk֬\YW-[6K bT,FeŖAR^q{|Oכ9SO= q%,@.Lgޏ*I4ٰ'v۵m ߽cZǫb5~ Oqdi]p 믦I9™IԩSnsµ~3_p/E=p.=3ed1F_sc<qbNPocg@v̙3<y*e^*T.A2+B- _}/㸼=3z|ou{>yFc1{ggBЬ뮻c 9:NzA_U~6mj<@޺6 ÏvFx_2*8,o 5woXo:g|};_N]<NreKǼ8m|nSeoegIK&wC� � $П9 6żc˜5k0~>33 ӦM;W//k s.Η)[t_Ƽ p||ʞ=զM 0_߿WlYkkjԨah_H+k;'H UE$E(`h$@$@$@ p"}<D2c1CDzٿ?f3G^=GE.4 *~fN$@$@$@$@$@$@$@$@$@$@$@$@$y1DVgD:uJRt2h?QA QQ mP G;&:@tr`0t/:+͛7�pH-7Nukɜ9ylPt;֬ q=x�H[:Ο2_i.qCfM3&qĚM@' ':y^YJy,/M*e*Lq' 15Gq|4|ANͳ]Dȹ6NxM~tYv91҆TLF-δ4lݺ՜SM˧̦ͦ3M{'LE3gDL'L w}HHHH 8_% Hr6o>~߾xφޛ-_o˷o.)4�\r%M5۩uٻwh | Z'=|Ck2ec**Ӈqzߛ(T@?`H޼yEERzD5AdĈr]wo!*Ihw,)2tȣ{kI./F{g].'~fl""x:E�׊r׋Oujyh `zKWl)ývٮLa=_ƍʔ)S[ou_8-v4B] )ۍ)V&c#dz*y}x_�2~xiԨZsNyWDE@EL?)ӽ2}t{>2w@ν@ҏ}xS7sN=" F,A ){󜉵[l ./t=XdQp͚�5j*%2dHXg$@ L;c� � �|m/Y04͛/WbJN\s]B39}Ot1ml /WBc�B,XcB͍酏sE.^=|$bJģ:� � $".::&B�a#+D*W :`dž\j<S � � � � � � � � � � � � � @2-XѦDD:v D)3g/Rׯ/?+W.abM!q,/={1-⏀I\BqWv^I>܊�B=cRvm75OWmK.FtW_5|%a,L !0D4h ÇO$&r"8q%(]բE ٱcL4)#PEfA$@$@$@qKUбi̙3O>aiݺ/J=y8+RSP55e VH Ƀɓ'KZ@eLP%,'1CdӦ [(T w!2`@2gرTP&٪gĉ*@H),ޞ@{ٲe*967u4#GnݺwA2߁WxGuc= ?O^fٳGV*O ASرc-ĕ7oJZk`uֹG,ZǍ7J= B˗/+Llw}B?H<y^vE=|{Ysω죒XIڐ@$ IڡɋߡTHH�ě6m"2 e„ RnHJ9aN$ *�pWܹs9)fL.?ߕ{� � � B`׮AG#//OJ! j4S'             'E _ |b=~IѢE5&RJTs;nfի3F2gi^O<WPSs Xv6yYKEU5ד@P2eP%4 �iٲeU$%Α#to7xmB˗eɒ֝;wNbϘ RJ`:Yr̟?_X+ZbZ(aBA7o޼Տ� � � � � � $'Pd,ZH $%K?@`$'ӂ'j?Mavٓ/Z u]C^&ou)%{nOeѲe#V�_+>D^|{}qn^\#9sڵkǏK/L,1MnD{mȫP!ޞvGF'bZ �evL0?-@ ofv�O#G#<"ӦMs?]m64i?P6m$cƌ$yQ+R�"a0<|~palٲh5rmcRA,s88i~y�|d͚^|yiժl޼9Ŵpؒ8X      H2etYׯo{)S"%s.pȑ3waG#oYj]HHIA2th;- бYHd4T(WBZr| l N� � � � � � � � � � � � � ?!:RfO<ȕW=`ɒ%&D,Djܸ-9՜E  qV$Qs!ZpH͚"F  @Zo|nIF�BDħlٲ*_Wo`y#D`:t _ΝXС bA; ںw.tzFP: � � � @|;&, J�5}|'f4iD5jd|݁CG`Μ9&xІ ͚53>H Q l߾]Nj;P hтz}ԫwoE{O=TL2vZboٹS@6 Tӧ]G{Gp;wx%ĽBB�AN7o.O? 0 $iv^x5jԭ[W^}UXbɥ|߾}̙3B8_|F-jDq/UYt,ЇٳeF~aQפ^~eӧ"H_|E؊\Z58s='h<y2y!YRN4pSժU pgh<qay:."VLHm7L# @ؖ߱qX   ;+|a UT)r bmEq-[I (]t.(# sD0ϘKAxqk  g<PҠ3@KCFg8q5mR<f]IHHHHHHHHHHHHBI�>@o_ExBkW<yB ӊ'?,RȚ5%Tr MɑCE46#-A h p$qhi$6^0*RV7+Y:u.҂c+"]vY$@$@$@$@a#*aC˄I *~y7۱cT\Yիg>a�n9stI 9s |&uL:"rŊ:8qBkE{DdUqkFz.KN@5m:�wy5{c0A $vEСCVߎ|O?~J<N#hJo|'k!ةS'Yr쯸 9(F0 V2@hťN:a)he̘C Y^ǎeٲe|@\~3fB._|qP*->̛7OOn^#GDuIvxS3.%Obm ayHHI`׮]Ү];#.޺ukyU;"Dўs(_% 4H斖QFxWH PP+B9qO  I޼" 7&:C�Cڝ;� � � � � � � � � � � � � � @h6y�];'w 8IxjLDn!N bD K +K73 l(iS% \s52~xAp.5˗7Rd"y`= C:t&@2&VZU6ol&KRL+ّ� � � � � iz7d֭?J/nIr-w 'kgΜY ṪE�"+_~ԭ[W 裏|ݻwVB{%DFٰs!M ϥݥ-_Z+b,m0-M;vOH{BZdKbZ f͒+V8LFlٲ2|p9vXd a.|v+ڬy5.}iZM6\.-\\zr7Kgo]ƍ'{1;FP'mD<J,H/ 8"^ 0HDnF#B 7R9 ,H1-NC1 � � � � � @ 3gv2+Vݛ8 &њsDQcbH"fӐ!CdٲeӊB@h PP+< � � x%{H"D�<)!̆HHHHHHHHHHHHHH/gE>HEڷ $%~s4@�ZeʈO*FxJCLp3 G�&Obr~Z6oK"8̟?_|A]kٲl۶M*W_}ud \HHHHHH</6bs6lʕKz-A+R5jd81r! y7oSj׮-O\;K&N(Jz))TPgF� n-zt| BO�c!T;ZQEl_P QFɠAG~}qLAB(C@nݺ, "CP׮]%_|~!ψFB6zd߾}visM6iD/k֬1:ul޼-^X(M65b]FA(^;x?z[|y7Yr̙6௰1bTXQdb8QѤ~ HHHHHH  4h@֯_/u�/eBE`ΝZ`A0`v]Sv'T ^ٱt4X  &k%fb�b@$@$@$@$@$@$@$@$@$@$@$@$@$@$& ;'MD mEr>\4DJ{!14\ q4cBT@ ]$D jyE Ok{Ov-|&W mK6lؐ XXbtY01N:w^H0a`<y[@N$@$@$@$@$@$pu}'6HxwLO>DU&ٳgkK[yMpc�%@B8q7<X~aw-!9sX5k)SFFmD֭[gի'\rIBsaRG�TG!Qq ӢօL-YJq5m&p萨`is _~F8DKny38rtшΝ[L뮻BIR+V^92\do}E … pH pN.KrJO<iF/(s-ZT.�S%pכ$8Bކ bx_2- uO?pu JV-mc IHHHHH VO!A8~ȑ?�4~xAΟ?/s̑{W gI=d۶mҵkWɚ5+!� $0A#  m" � j<              &Ebn-r-B"| RP4KƼc�o@AX<8!,Ư0xqeR1GaC�%"oFi�#kN~PHkԨ|&mɒ%[n_F#دJ:t`BU\B[_-<d̘15p_      @-Z ׯCٵk qlٲ6mo- ,0B:,*"` R)^ֻE;[  N2-Z$G+W- J$0e ~[sgQ(1,+kS?L,A-`C}O>ӈ̘1#BD; H^+cƌC>xȒ%<C7.]Ȋ+f͚00ayHEeYzjݻTTɈKrM7w /`QƋU3]t~ 1L2ݎD@޼y%Gqeg9=?K"EnݺF�i'~ߊ+ {$C O<R~czHHHHHH�~a3c@mժb-mXv<fH2qDٲetɌJ[DX[Hҧj$@$@$y{vF>_Hi�NgIHHHHHHHHHHHHHE�'OK_E uED7 V#T<e �Ƴ.-pw uwޙTBi^^I_~&)S,Cp:uIkx NvL3 P ,UDYBMjҤ yO.%     G9s4l۱cS>PnRJo\D#t}v|Y>ɺ袋hѢR\9$B ϕW^;`Io>3DdDڵZ__}%q2ZV2SPb2jٲ"wnX9'pi裏=(W]u`!>s>}9 "v7w S|1. C�[@?&\`Aiذ'^z2Zj=jܹ2{ly1ݙ3g.(Ƒ#G.X'�?#*TȈA,3N~dɒ1\,_3 &!Η_ƒ"Y&j Y/      OjԨ!8p@ƍ'|yΗ/3pJj"\"V2I&ɦM؁mۚ7H1gIHD�8N7Jm$�D:F$@$@$@$@$@$@$@$@$@$@$@$@$@$@#qWG~~-%JD,{f֭ l ("+;"yQ\ȑCtb̙ԊB�tM惠|ԆIN#<yRZYvmr뭷 'PU *.YD[#{n o-חUXX      (7>5r%ta֧~*2P-Db\ � eͮofD tUZ<#Rti#ѲsP O?-I:] .@q,]*Wsa$zl ڵkW_<Kyi޼ .Pqש�<xk׮F�~:t0Ǐ7|c&L }3JʕM?-"UTF)?ވ~w[*-2m\r9u&3^/[6b s^Θ1C֬YcHιs焂Z@(@ ̵7B0&(o? :TFm1G̙31֪\ziTU      Ƚcǎ>>LL"C ;ͧN:S c~ϟ/s5+ ƍKfͤRJQPH j(5̘HH -8{VsW\jͺ@t `][N$@$@$@$@$@$@$@$@$@$@$@$@$@$ !-IJ^cE%|YeDTL`7 1YD*K4�h`#tB #՝:u2SN a}ri)P VuX" &y:rrJY| ߛٲe3“O>)wq 7ה? � � � � � idjrAb"Crr%E5x@`)S&$Hߪm6ٺu];fu ~ڵkxFd�BZtF#hx啤>~|nRi3QM9sF-j&e˖ɓ'q7|Sz)ܹ<cI "=s,ˈH9ROn Ϛ>/~H~|Ν;eXk]z:zBz,!1uWZe0 +qg.7|@ }2dJBzΛ7l} lxw�BG4gp#�rӦMM~[jժenժrZo ݸp F M6F2 $(V5I$@$@$@$@$@\wuviϚ5Kڵk'wgWn>&ҥpBo^5js99;6KE!pvvZɚ� � @!oH޼hD䧝zI{OW/{A 8Pd׮f:L$@$@$@$@$@$@$@$@$@$@$@$@$"0g |ѠV+Z$�ҧ4.0N <(997,7'q̠P\M<y*aܲe+!p]M�D$<yxHbeݺuvZa<fZ9P� � � � )7+K'pF?` [ՙ[l1>q)pWUsUW˗/U#^yfH ݻu.#4 tώ; :=5c)RĈbŊnߣ@,#QQ QQQ߳@(ĉcQ/'1S}Z۷i0F b:tH>1blܸш7w}O2e"TFLvD:uy#O<aM(Xt\|OB ϣGJtL_%(0SgNo?D$K"!!Z(*҄iѤI(ǿiQ2iҦmMeD2(Id)k3ss}۹>smZS;1w3fxwžqFygm{M$bٜ:y u;1-x)gnذazW}1V޷/v'Sck 3fjaz^~饗z͛7rğu=ZwjINg-r);D�qG`,ǿK �i-`&o?^&L۳իW˳Ow߽N܎$Rl�{ʔ)qYfy ]DI!D qq*SF.HN./qM5T؊@ |o*U*]@ɒҺu)3� � � � � � � "q -w.:uDN@ݺEt8v-)5\Pժ%-uVjQ!/+v`s0YAӧ $+fgQ`ڵkwvY|\&I~jΝٳg{6n [H5\ z"gB�@�@�@ S59ZJlk-<(Oe!BVT=zWµl.WҮ[05.)`5rJX» D+cXV:ʕ+{Ef ˪RJڏzEgnY؞}v-Z4#];W_.`l*]ڿL7O<Y$K{™۷9 ԵP…S޿3'|r{'k ѲiL(tmI+iA\7^1<e{kI�.?~[)DW֏?p"vBئm3ێv;ǎcڜY!ze붿L9BO! ' ) [t7;<jHNH;vk.;SO=K.$kLK781� � � s?|oѮ_^&M7۱ *XիvM)R$4B;:go?Lmmߺ`阻NVӦMsk5V� P+#�DCsMxY4LE;~Vi68BƄ� � � � � � � h 0@sM8#ѽ`}&irBT\2b Sj zl^_dt$B ܹs}T~7[HԩS/{?bjռ'UzB Wr.yfEK ??WXЮرkK"/\u(s{� � � ? qƙdO?wiDVB l߅e8Y!& f V߾;xYxqYt&%{n[Na6gKUЀ6m,<mNgmz+pń@* ؟!C&Mb?᷸/Rǎ_G+ )ky晲ق1���@�IDATU<{ZUV3tG6‚0ٗ_~{)cFtuK/$UZk3 ׎q},壏>Jm ~0R;^icU{>{j8L`M$, Df J^` dիW³ /͎cZZ޼eLƶ:;Ν;%+V,CMu.]ApѣG޷NoouY޾+xB {/ -۷d-[#Ct{ IrG6n$P+ɛ#� � �,ڵky;n7ꫯ_{aO#F*Uqr?hmߡe\`ڵͶÌm_y~�N:ya:^3^8�Gnl �t#G @Jt߳Y|!� � � � � � � h (M u?PYL.r ~/{ ]dҺ_Wʔ^(=\|@ As=wؐ8o޼yl׭ؒKK6XviE6\r^t-dk.�beP,|ٲe~ Lg{y:!~Xj™@�@�@�HB }~'yƴU`UVh4i$/�ɾc[aS<ydŞJKluˇ=Xٜ62:탱6[ݶЬ`Jpݖk2L|YwfaviAqv\`V |Q]Gv[r9}?j[ާcBAc;>o~uz g; _WOY>3w- SN>]ӦM]jR-Կ/(`o;e'6geCfa[vTllY,0 U1J1f{AOvBbpَ]/8}&>d!fYضSϞ=p3;~Yw_.'`߷l=n.\X]v7o{7n_P-{>SeVپ em0Zn{?~iGjӦ72rm1E�@�@�@ +nݺM,f>vX :T[n}UV/e̩ۗe#<`kph"ټp}am?wjռc;wԩǘ@�X +IA�@0vҙ;ax 8[WZC�@�@�@�@�@�@�I`?HQ~g�cMu$W{"kcazJVhx#MJGKs<@ @PtUV=lEG|K, PSz?k;w<\V/(Xmb/z"Ez!�]&snٲśX .gv}͚5^/se2c.XW|^a?+d? ُD/ڶMd sG@�@�@�JhѢ¦4p>A==cpRp.-8<^PiµKaşmYidm@pۮ[Qs`o߮;vxvmns9p޼y{c3hv\Z{Mi)L Aپ+@1\ͮ[!wm_3>.0hr!(u4[2 Op4xkM o, *ꪫٖ;NdT=^=f,ʊADKkރN9>< \ _Vf;e2VoTcx{9<?6Y̶N my 8O8 tV4XcJl̶]k>'s% m{cm?`2w#j8 x̎[NpRJ?ʄ@<@-{Z0#S}|my0Xhan ȴ6 3x.hσ}8<x϶K;~l}_Aڵ})k˪wGX@�@�@�Ȧw6_r%m`<y0e7s Y6۶~k+|j/X;98?fY:b^mk-? Q  o[@�pvҙτ� b46Y � � � � � � �+?H룏3ϔ,Ps"u9s~!dgHc-yo?@+(`,`f�~b Zj_(BnVh̙RYCMV)(XgElV~<hs} mp^p=l:Ef+|)_|^ὠVيHbvYU&x2GN;Mcit顇~\*צԯԥ&y6x@�@�@�tBDVf+<[vU %Y$+t`SP£3aZv=mGp. V*~oAlN0}uN. _v=hY ~?mVʬT~a`/- Df�p5H]m%PP[`8}rDZ%rg\Fd Z"۷yw2~d2.]? IƎZ}D"[>c}c;vBl}i!VB@:vڵk{cMLƉ'͇츤/c&eK{رL{u{}~v28f\C]kܞg׶}[MVH>#b{,pfإip<(g!fJ= ]_}Vj=6ZgϘ1+m'3N7l˃߷vXͶo%dǂ*6mm |ϨcA#ci@�@�@�}o&kn-Helm_#�. ~{qОoڹOf_a$2ζ6m׃և`v_d<'P T,³2m  lX? @ZsSb ߍx; @�@�@�@�@�@�@�, ?~֘1RFjw^BXqprtQW7C=, \x_HY&cA*`?N e#Vڊ&Y * em/?lxi?j3U~G m+h? ^CˠϩaCwٳ u dB�@�@�@� +vds& µRpkdtélǁ>b2 g 캍p[; .3G g B2gZ2V *mAzD'O Kw+zOCJ-A; =!CW_t$^RӦI'; *S&G1[O&MVȴfkXom;d13vgญZ]ZPOƁit>ǖqmd׃p]+|~?0g9.>/uiKʌu;Vi!6.`Zhڵk؍=Z k^v�Sr0m>VڊYmE|}A[ V\n3GeFfB�@�@�@ l>dD1'}v1ʮ9Y f?ukŅX_Ȗ'mFЕ1+nbۏaaB�$_(m-� Y *]:ݧDR}w'[ɝi@�@�@�@�@�@�@� |{RǡVsJݺ5AZw ("|rZŠPƏ?.,- HKqͱ>[:cjb۪SGz5bҠAw+>6@�@�@�Ⱥ?Xh,p>޽6m] 8sY'L曍\wK>UԊV`*Uxs<CdW P(OUVՔ)SԩS'5o\.()bLs9Nn#lz#, � � �P ;hV6/qWGE�+N`B�@�x 0`Ld"]"w&p � � � � � � �N`lsgw-FO'LGv/jL:YS8N?/'hL3&>* N .X WN6_*mG@�@�@�@*G j9sY'`5O0@6-|KfwxZ$;s <+S&Ǹ@bG.bTj�Z!0t+e6l � � � ��Zi: @~@i&'`Zk6@�@�@�@�@�@�@�0s]uo)}Ա#>$V`|inbbڒ-'ԪDVDrŞ_k@�+p Ґ!~UWI/U__~3@�@�@�@ ;KgK7 zԨie@ ,}t6ٹS6LC*T(0 A_@ yճ>GyD~:ڵ+<&p1hqkHg[;Y#� � � � �Z@�H5RR X@�J@� � � � � � �ySG1Cz5iLS')W4aIWzRVJ,ЦgcJ]+jNcdd @vʖ+~'-Y"t4xTt]dB�@�@�@�.j/C)"5n,%mK!xi+ӫqm.S8 vW 3>}wu .}u$yV ѭÄ�1Xo@  � � � � P+R"�DU(V,DWdIiݺ#� � � � � � �F`BN>Y:U1B=[r)7gRVr$`!o+JS m+mDRo5$ 3&G@� 9k'Tt-k@�@�@�@�0 ر>^|Qz-fMS�(]?RZ*=`A+N8!=QŭF@p:tпowl5iD-:<@Bɣݻw't t P+]4D�@�@�@�@8"� ~=6&MdCD il<E@�@�@�@�@�@�@�RJ`bsu5Ҝ9OVJm,h)=N<Qy: ѣiČȺc}睒}vaw뮓, @�@�@�WK? uѴnߎ?"PR2inϗǸ'۶IVۤLp^ �hРM qƚ<yrJX(\`bb4 "� � � � @ԊƢ �عSھ@hn=zu% Ԋ6 � � � � � � @N-^QC?^6/J׭j0!B)֑mO>IYqڷ^Z(A+d5 @ .X =4ny N[(. � � � e%cS{{, /pKCJƺwK+u$լi/VW--i@ 矫I&jժްK&,;wn X} _x##C�@�@�@�@�# ud#@�@~zѢG OF�Xֺu9x"OA�@�@�@�@�@�@�?K7$tҐ!ҏ?JݻKyFrHt:_)>Lw6m>;[D@RbҘ16E�"?Գ9SN ~MRJ@�@�@�@� 4nx':u>Y4�qYzi`⸲5=|4o!O *Sf�@…5rHKuH4,Pk%2!@,P+OH7M � � � � !"* @46n}?F %JHkFy@�@�@�@�@�@�@ ++WJ"U&]w/_VZ`/md!peJ_V\_~,8⋥%Y%Fn'j#c< @0ҕWJgKo)-\(5h k'M2 � � � oѻ4w԰t~^3# t*LKim1ߴI8^=MZ叞@t~0vR_{1=3z+q!U{M2!@6lϭ}봈� � � � �Q`/|TD�o]'P+GX qw  � � � � � � @ ^-vt?) i%ϟfH)%`{R5YL\YVlY{wi(ifH4SB+о4qSڎ1@ d<y#}~t晒R~i:Kw@�@�@�@�l/4cTҮ]hE@ ;J4~tʕ BBWx~p؀ ]-+ˁj.9x:OA�"%pu?Ԙ1cԺuk믑?M ;vT9Q55&RxzE@�@�@�@�@ j%Z!�@P@ 8eaZń� � � � � � � :V; W^|Pp޽Sg$,WZj/}_`鍊$+YtdZfl;cJϗvƎM11@ \ MivrԤ\D!� � � �8\[o6L]�8,/kN:C_}% ,RRa}8+w%x H-6mhոqc͝;7hB/sNB`TԊꖣ � � � �V@z � ZEw @JWn]WD � � � � � � � bTKUJ/ iYqBV@,lYBb~Q"g+Nڕy~< B_5MeKi8t҅JKo`ʰ � � � �(XP>i,LiSz<C� Ԭ)M*թ#5k& c.B^+h!5fԊ(!@j׮ޏsʪI&?~|MSD`ǎjȶdzaA!� � � � @J4A�H[\(|/�T%[A5&@�@�@�@�@�@�@� _gYְa]wII}rNFt*=װKS= :QԖ?$%jۍ"@x,phi zu#FH h � � � ץ1c$ y饬W/PG9 7,]vaC5sh6!@V<Ti pqO?yÇBc l߾@؎ !v޸}bB�@�@�@�@� P+?G�Hor�mV%J ߅[ � � � � � � @T6n2D/ԯDLT"<…j&K)oC7+PЏH4ڷVMf5 Vz7ߔfϖ5wjԐ}Vr5̘@�@�@�@� XpܹR׮RR #v\o@iX֕&N-GCOXҩjf p@](N,ٳ={͛yEb&!/@@�@�@�@�0wJ �S=6km8@bĻnݡ~@�@�@�@�@�@�@�0 l$=Tc7AZHE ,ZD쫥3^~Y*Y?%Q*ٽu:u6+BȄ� {Z${Gm[woҖ-_-"� � � �O=%M&m&կ/qj3!@Zf͒4Z oaGХKn7aq�Z!t"+W.w}zWt饗c$LH Ka4 3V/DD!� � � � @ ? �)'`ZrJʀ""`aZŋKkFt@�@�@�@�@�@�Hs+燍/ 7H9O1{m[hSz *%޽@]R%RaK2@ժҰa…eI;ƍa9}C�@�@�@�p/,4jז/P4rQZʴitERСQ5  $D�t+5n8}:묳?; ㏃ڵsIL s9o<4� � � � @ԊF �]{lLoH%%uRiD@�@�@�@�@�@�H=[H=zAZ=$q_&RM`Ɋj[6{iROʝEd-j͜)StLO@� X[) $U,  1&@�@�@�@ *v,sͥЛ%K2@z t.͚%pԴt뭒\{Եb4zt1.;@^_&+wD�TYf.Km޼Y7֌3TaK7{uZt P+_@�@�@�@�_ _C� �ضM*T(-dGdIi<e@�@�@�@�@�@�@�%`U ,xt=WK KJT/XX_'ZW__ʛwG*:lpai̘TcA�-pqZ>}ֺ6ip!� � � �ʖ^}USi<vmOڹ3R\G�0T,_sI/(z7 }ˬ4n4jq̄}_@po'z�VL5jP.0rtb;RZ`Æ J(@VY5 � � � �! P+D �R96F@J֭BO# � � � � � � >v>OKfK2?HG2eǁjvgV >3RbiCVnaF�a(^\n?X_Vz. s � � � @˖̙R~{e�Z梁u֭=// *!5nnёl ,E�(~ǺձcG <8`'zj;.~+eT`i1!� � � � @z N3z@�/mNVր�_6% � � � � � � @2ÆI'$vt%҂r*r3֍@b,P^N*U[bVj o/}ukj �Q(\X}1(Vv޼~"� � � @ qٳ%;Тt5/ G |vlxH7ѣڵQO;_c@\Ν'z}+\e\�@|siРAap ڵkWY`ժU7ʔ)5<'~?fȄ� � � � �i.@V�> @o'P+ʬC ,)[wy@�@�@�@�@�@�@ ;wjԐz,Hd|i|5 6%Kʕ+L/u{AV2Fݮm4~|@�-Pt~ֳJ&IjI]Jfy<� � � �IjU?0w5kJwozI_@,sΑ:ta2C^VG=FQg$Ä� po]oFvč7bIF+WTRܹ^=Oa Ȣ@P+D,>@�@�@�@�@ eJM@�"@VXHW;0$OWƍ� � � � � � �$K`.%+֫Զ3H+&W ,]JVBz0tt ~ _Qʕ6ƌ]� s+0?HsH&͞-ի'u(}U � � � @".߿q3ϔfHdXdEdI嗥>&OԑF3ca!ZH}ĶmZKj/F@ j_|k֬Y:}`^xqԆ@C"j*-[6$@P+@ڮ@�@�@�@�ɓx �d],�׮m� � � � � � � pxݻB/-Y"]ut=Rժ".sesϞ=ڰaֹJvem޼9˖-7hIӟnuK'ˌ׭<y(o޼^c\:1ͅ >gsIwM W}`l o/ *@�# -]~teҨQCIKgu&X�@�@�@�H@"ңJW_-ptir$;n{I+G�;O=[% ij0'q';F?Jw-{oF P+ʬREaÆ6mڻ77n_gqF q$Hʕ+K@ތ@�@�@�@� u8C�@ U@  ȑ< @�@�@�@�@�@�@ .Et}҂WH,tR6bqR\*WNAvܩ]E28Jyڵ³2,+ .+Vܥ_-3g20+Kرc~![,1ˮoݺU{ͬ+*Te[AȖ].]Ze˖f+cs e3m;$`ZVp wSX@ ArI:'H>(h!5o.Y @�@�@�r,PKw!4xԩS  p /z&O~[S'+oCA{J63jUca @"*V>/]e˖z饗te%bլ#EV\K"aJj,ϡA�@�@�@�@� MY! �i&@Vmp:WG7] � � � � � � cE,H/FjL1b*i\ؒTRL o.p.\%.,.]˗kRY>eaSr~T%Jn/^ ³wP-j4qzh0- N-kYwZb qXPeU\\o_L 4h ƌ!P+s!E�!Цd`ΓN;ֲ- bB�@�@�@�(`-,cGo_K?(駥jc@ ؾFhZ4j$6"` ?l/^\5if@ E￯>}xZwš$Z}UYetK&@�@�@�@�@@j"@�@ j8@pp-{y@�@�@�@�@�@�@ [;~ROV3,@Z L&o"P+}׮]?Νo~}+S ?E}*_ DXb+pٸq,Z:\c9ƛ~ʕ+p- e˖&O]nܔ?~UZUիWw5UV-o>ٽI*U+KGm;kjQ) 68CD� 4k&}\ФC%HuHm� � � �@ /H^+pt)> *P EͰ@ ҄ r~;tB=b7WzIc.-Ce/@ܹOFӟ$;wh9/Q}McB� {SZD�@�@�@�@ jEuo@�Xm#]:@ ,iZRn2 @�@�@�@�@�@�H{IJfx/Nr" @V7үoƛ[}w3gvuB,w:ujժy'ď01k̛7*V͇Z^hc,XobC|i֭S)b穧ׯ_ ۲uԾ_2܎;.FX@� 4l(d?,]u4`t]|;6z� � � �-`p OzUiPsR{܌( ء2 ][KcHKr(gz<xvm,t@mz�%yB]tŋ5rH*U*: sΖ/_U&t t P+]4D�@�@�@�@#{ �1@b, "@JL � � � � � � �G/0ze:vF;vit@EbeĉM_kԩ6m+-[D2e֭[wުSN>d{챉d -WBo>묳={d@2ۛ-lܸq2dvܩ zjԨ7n]V^}6R)?uK1@ _|z .!gt � � � M ]&wDjFUzq\h^#]'.-]qi9e>~H׋/JW_vxfx~ZF !pjj߾w|5kF2fAY^@؛" � � � �Q P+[~#�DF@l*:jeX � � � � � � p 8P.Fh4|ԠA» e;Uaf�k֬g}?\_|f̘ݻwt駫gϞjذU bInsVժUيvwl}-�mҤI6le!hM6Uftg{IpaqIc*۔q @ tȾ+=_[onA*R$L1 � � �_UӟZnQJ\zH;wfC<t-СҫJ_~;jE~2�@:u4uTuAM4;C-[t%  .QZ0t> rj&e@ � � � �X u~Mc� @|Ԋ/#p$+:?v푖q@�@�@�@�@�@�@�Ǝ8CjN*]Z6M=0̬,]*pBVd,|iܸqT~}wqҥ&NyWdXBF=ܣ .@ie ({^ӵqF/$O>^@C.ĂJ7K.[nQ²vΣl#�$U> "UWI/U__Ԯr@�@�@�@zl?5�$X>({+´^0Eoi ʓG*[6z} @ʔ) &m۶:s /) ,Pɒ%UX$U#V'cB�@�@�@�@�D/@�,c/_WB pX%u"� � � � � � � 0~Ԭ\QhQi@ 7@ [˖-0/袋TT)iF~Zh#G_7|B,k׮TRvW!(X{j}34p@ڵK~Vڵk{L<Y{ ( ta.@,k˳ @`#|J7$ ,D.ip!� � � @z sH3gJEHKzI6F l7 ]uԭd2ClziפΝ O?aZń� ;o7wܡݻ;޽{c8D^`…VZ�}zaL � � � � �Z@�'8�ZG�a@�@�@�@�@�@�@ ĉr!59H H_|!+qF�9 P+kt5l0}*W?)W\.b.]޻ޡCW< YSRի޽{kԨQZf&L{6m *4iҤH1r`.L3&ۇ#�,Pt}~V~rra-H˗< � � � �8dϤ_zKYSzd# <_#{c/K]yysX1` @\x@#FO<N̴��@�IDAT:i˖-a&I t'&aͬXNs.@�@�@�@�@�x � g={Ԋ31#pD;@vc@�@�@�@�@�@�@ ,8U+X(aB� t 1l0ڹs{=]x:շo_WF) zգG` m %^#<s~7i5kTx'\0}A@�!pҝwʽ'I?,\q5뤅 ց� � � �dOK;JW^)n^+,�(VL矗-;tÆ#yFPBj �aꪫ4n8M8Q-ZЊ+=@ojՒfV@zX0c[3J@�@�@�@�$H 8 �j FJ֭;vh@�@�@�@�@�@�HE)Sm%e# 38ZƄ@r~Eڶ@?xAY;wv~oꫯꢋ.RB|'PF u]op+]ϗ_~;υU}={[>lW,Py3� +(ӻ`rE5%+P=gNB; � � � @lwcǒuݺ=ǹbZA� t><gaKz|MM˥Ssl @swr_~7qo5`;h;{I'%xͬش?K0!� � � � �j@�@ w8+< P><� � � � � � �)0mtҙgJc?ZJOF@"-r X[1ǥGts*W#FoO?QFSN*P@AC'`Z>-Z? cСjժ^;v]q3&t]C �1ȟ_R|E믥SN#  � � � p.+#ғOJuH}ttȑ[sӿNUثt?=-B#C� `JeM6fɔv .Ԗ-[1^w b.ndɒ1o@�@�@�@�@ {Dpe@�h #>[RM]jb< � � � � � � @Oڷٚ5҇J'Km=�YBV6U_wݺu4w\Z`맲e˦+ ㎱@\Զm[9{}kNrW^ݻcƜ7gwZ9 @oWJgKo)kj@roW2%z � � � woc:RÆ>q9#C |ZI/m_/]|Tk!wb f %J_t:詧 CCf͚%;'v \+B }aj6g � � � �N@ �1j�&8 w>֭;x* � � � � � � 3fqN;MZR=Z6M:C@ "˖IKK E1o[o+(h"}ǚ:u:uαr@ʕOhź+t7nݺ0aB֘f-/Vx @\5]zH| Y3ϔ0Fm4@�@�@�RY|y?̙'K?.ڕʣflKS% P[7i|w?C`jiB/D� Ͻ>z衇t-W^mBN<D.\8- H@e˜@�@�@�@�@�x � g;!~̄� P+y@�@�@�@�@�@�/~ho@ZTz=% `B� XVŊ]gXKUy/նm۰t~@R4h ͛7Ls9G\ 6$]={c:� $ .&Mr_|n-5im%K@�@�@�8Hs%;}R~RÆҔ)- ҥF׬/{LCʖ i2˗]LB wܡzK/;6nܘepjj)L uf Ԋ /"� � � � 9"0 � @vʮ#� � � � � � @*̞-u"ի'"H:'zΝ馛tEsΚ3g81!D?^/&Lɓ'nݺ:uj{$,釦nr@�l)\\A>?|1]  � � �  Jk)#5m*ڵiH@nW1.fbV:; KE�H^'jƌ3qS-Y$`m J:+L' .ZTʛ7FX@�@�@�@�@PjJ@�@�RFl.mْ2Cb  � � � � � � !Εv ,TfΔ.DʕOHX1+ *֭[VZ7رc5x`s1!@@:묳{LEzגҮG޽I+G�gHGW.\SG1Bڵ+$ � � � O_ƌj֔^zi`qp_B켐ͥ}JR(T({ @ ~6mrƍkԩ)<ڶm4o<e,`AݥJy%4� � � � � P+2"� �TD I9m!� � � � � � �aG+VpWY.] vo%lYjYF-[]N>][5jTw}e`K@8q.իWO+W<`h|gԦMQG\sz;#ڃo-W^<ZÇOڸڷV*i]` ~ԧOժU+TJ lgLp-\@ܨԽTj+`G |+'t OWM֢E � � �ϝؾ-})9L/}5Ϫ裏fDJ:ulk{i>MO~Jss 3j '/B 6Ηz뭷!C誫҃>f͚iYS,?!M3gxꩧɈ&@- eB�@�@�@�oK8}ۖH'NHX@�@�4 P+M7<F�@�@�@�@�@�@ M, 7jזM^~/Nֵ+%0#"`5/\vء/Xv矻1'fPdɒXϟ֍з~"4aA < zwխ[7_5]Vnv=Sf빱ZSJ1cb" @d Zx^z%={\,pv)fhn۶RRj{֖-o/aKzWL\b1n85iD{yiӦ*2!� � � Eg\mחCڼ9!ֺ&L|'Ynlt Vp,[ C^ �cBVgϞ q~/g}n[hҤI\<7]\v`^zN5RRQ-D�@�@�@ |1lYX[1na P+[!� �D@0 � � � � � �Lƨ{wɊҜ9ҕWMEw~Eھ]X1A~/0BJ%Ao*aZ]w]‘ (&wWx&q۷Wlx%+mK7tj^:+O2܌y4�),`[n/իɓ 㾴ϙfU* &-\(u"/U"/ƍGr<^=zpߧkɮzZr6]wy>UOjӦM^!� � � & $W ߥڵScӗ{Yn4Vy,C9'0v gAt)Z@�0 q';&4d 0@\svؑ.Vpɛ˗e>YfqYlڴijb 2P Ua@�@�@�T 1l[ -v;@0܍� � :Ar;`΄� � � � � � �D]e\M.}_H}\;YQG u-v ;FRWGc=$z*UJ*[_޼y̽x/o(%qݓZW %Jx1voVHY'DQ_~0aݻa-e'EO/ŋ¡$ʕä5kty#֭[={׾lM2E3gw?W@�@�@�HES|);ݼԱtENiW\/}rַd?>0J_|!m& zBjy~Bjl)F�&ЫW/3FڴiI(xSjU៨v׻`α,mdSqi2Z@r\?=19@�@�@ 2;mqlaK"3vXh@� {Į=ZB� ( *$?g � � � � � � �a"8ޝTۗ,ٳo"BІ$E{~PIҢZ(RQJlYS!+{۝f,w;wy}qs};s|ߏ<"#p4ztuR<Bځ�i Қ*?{gX0nT7| vܙ08͓O>_SNUqPOpL׮]:|rȡ : W^jݺn;Z|ۧnS9KHXwB MuVY-Z… PkePMoY[x 7 yW&c7üʟ?QFM6;IG} &xϝ;Ww}<A~+{Z` *$/N,_|\ѨQ#q^&%Kz]/rB]*0`lp#koѢEñ؄el)i( R mi-_2dHՖ-[ꫯzUVM?ʔ)yZ#ێ͜9Sx =駟tiiٲe^ 4Pu={M6]wݥ9sxXرcim}݄3mwy^Zۻ[jF~SO=[V6'4&B*[ nIn]MYwy:wҥK{uX}/m_cݺujذt>`Ez>}tO>9du^O2ErJx� � � @, ء(wCЕuI0}#<wZ_֬Y`{V7nMv &Qj'NԦMԵkW]s5>7_JǼR;&gq7f?<߿>sU\DCzfo_~M 1Yq|ĖCZ[N?ʝB KN_@ R|]KӮ];y5L5k [s-ˮbK/)p>9}OOL<o kŖ,Y]gMyD(] � � �D S;mJzuFJ'Z_U簭i[9p@�j9%P7#PZ81  � � � � � �DK*ը!7 ҪUҍ7F c'I^ ų ʉ2c ]z ! , 4X `h!O^x7_X ֭7pa׮];aPB,�Ll_,G )X(ҩS'o C4iIY=7oBXbbsnԼ͛{&vb@0O?Uft01�SNrZV,p.~2y1^zOu{?'Lj-n1 5K.pW_msϞ=v'T';vԡCgqE1/uy@/"@D ߟCU\ڮQ%.{~/>ѣGm,т], [{ߦCtW´l!-Zжmۼ={xAdlOW&X`mW\e[0(4AKrK+/$ ,^&M wݻug{AէOy~ qy#=5kdJ'JB,3{Æ nٲe I> � � �1,xq  ")TPB @f*U;g%w',X ;f1ԎY0ckev|d׮]{v´\q^pIMؼpT\C%GӁjEZ5 @Rf*k̙tv݉+һǮھ~띃M?Zp,  V2@�@�@�hؽ;{K;mMޒav)SvZp;ھșQ �$ȕK.)7F�p nq� � � � � � �*Utr_ ./7h�rsIyk̏�@ ½/o͚5 p.]hذaIkaU6X{A dS_$Bs Flx@CHg?FeA"6hk;wL,`!qgܹ^Vxu]^H^tYgiСެZFŜm0Ʈ]z˷09眣wyk{5ZҥK -1RbE/4&-W7 cZɋ.3g6mt ;VlP j۶&/\ lLWti-Ho^DfUV"@BgsΎ\Ї�X>D�رS͞}} *\dV:qy5qD/dт|@=hS[vw}]ϽG[駟. 'b#xb!Z˖-°JTѱczzmrq�à Jئ.ZFZmw-hѶmeQR88`3u&ifSph+fja#Giپfnvڵks~/im~>[Nx=I@�@�@�u;M2p*U=IݻK[FNσ9bׯ5K3ccm{nݺޱ;e;1:xKb!v,J8=={wL`JYzc:>bSG`ɝӃJydOXj 5Vi]  @ ؾey.(Um0PzTJZ ϏvM]sf6;OVx@�@�@ uiz4-)Nu;{K;vGVöuo M@ ߮s@�#vgY,R P+u>A�@�@�@�@�@�@�Z5ْ nUʗ/Jk@ x̪Rgʌ Kd v ZLo*}u^{/3ϔ t[olٲn5k\b*La!KnݼM?>p\JI %%Vwv{Z֭[{/'O=Z( .~Xgz꩚?lH+;G}پ}ڠ3V cAlt8,w  `m0-m R9SޮWv]= lG,҂le7pe!Yb۰Ç'9ZUUh$3ICc۱? k" κ[x /K/Mf`ʹ~Pp~|?Dvq\lsgiɒ珄)l?쥗^l@A-;>}o,3Pl?@?^q#5Jiڟ:t{Y|o@�@�@�wŸZl.t3{%qk{pv -7u0ǼR;&g݁u/ W0;e,o>K|LzGK'axe;'qGɂ@ND@ 켔ׯ:QBݣFyeR u[~ ) :w:V*Q"tˠf@�@�@�I`Ϟݮ!$#簓ߟUmvo 簣K[ M � rX nť|@�@�@�@�@�@�@ EJ=$7@tr!()› E6UŊQL6B.-[ɹ3[.+Y'za ЫW/o* v/f͝;P>L .<*h+0}ݧzjgzL$oSӦM |R 蟼yjΝ:3ѯM6Ij1q֬Y믿VX*U2Hؠcƌ 'ըQCSL> ?֗7z-^-VԯP4;2@ |CCGOmۓ{aZv"Qjf^tE3g >}~eY{ H^ϕW^ݻkС,r߾}+W`^˽@s\OOk.]*Y֚IsדSZ;m7?fՉ~@C&.JA�@�@�@ :vC.d]:,iѢU K ς919waԤIwvW9 iksjc9>>^^eOC,]v B] @ ~ؐ!C�#F+H87.Sc|7\j rxض{[@@�@�@�R8xp_-s-vJC ԊMo@�A  ,dŊI;v${ � � � � � � @ HU >/=nt]ruG@id eAJ%paAotW{K/.<7YCR|ye2e ~sAu |X`A)Wزi>*U|޼yIK=I& w} Aٳ7cڵ,㎓ݻW-Z,�þ+$93<S/V.]{n]{@>I* Ëɓ'+Kiٲe"ڶ>0xb_ G '{eȶeM!ܭ[7/Xs^駟|I^>| @Kۆ}Ǻ˽i-4u&JJ/m$5j$j%}E ieƌ:tPeZcfeVчS)^X%.,^xAuR{UnD@�@�@�(THrp�`NGJQ6qc9uꩧ3ΐkҤI9 &>1 <VVX,Ȯ!iL[tn-`Z+=9"�D] cE-تo޼9l-k p;K ^`;j׌S"2< � � � 3g[mvo NH[]NDA�@�P qV0\u#@0j4 � � � � � � N;{i4p?H{V�!6n*U B"oYƎ!- e ? VHof{A/M|w.@灥e! ;wN^70;C~!0/d%Q ĂTl�+ҫ-h%P̢cǎ^pʽnt$nrK,]|M+bO: *ZhtQe˗'}W /9?I)OA{o@lɊQ֭Ure9 KDkC~s-x oߞx{W__zUy+xYj\:飏Ҙ1>*WJ(?ǏOh}m[&|W]_7'|P=nt;֏}o&Ι3gz,TBD) � � � }<qª<\ς=:p@8t,Ǽ,e\ﯲe˪CG^8E]f:`c�>̐Ygh6&;LVl�1'ܝos`dɒ´۫e;;w_ vjw�@�@�@� /*u.{Kދ ejE  �''tP#kj? � � � � � �DΝHUH>+0@-G�,L2.!PRY0SG 'wjM<͛vڕ_~{m۶9]~{zJ򙅅؍%O?7H}hXBp9ʟ`˻tȂlpC kpo >q 4kLUVgՓ?m]ڒvYHɓ&e,Y[LX2S~wAؠ1V,(]7¥ he2elpF3>3z-Y Yb֙gx?[hǃ>e&MDiҚ@ ʖmԶ,pʂnje˖ya?fc?ba@V1QZۑ9soipe֭Mz(+m"=ڛx⬎?ޫpš4i.B7.]hԨQɫu&ܮo;rdyr13Y{ڕ믿^=zslpN; f?湑m_uz׽ o1fm۷Ypa?ox'{A/l bd;{@�@�@�@? S܋ +6m5k&ς=bL>;a'ycrڎw+crVi-Z z+vʊo{0q<s^e9'tˡS�jE @5sUv]3cƌ;v}Mo3, ̙3ǻs|QhbT _/Ōx@�@�@�RKnIޒa[^ؑr;{K~ϴ^L7T4GA�@� /Pu *͌>Wtw3vr� � � � � � v||- {}yl3_c\@N:>7�KX:8|ժUs)R|Æ (P{SN͟?n^t-Z8}_}aÆ)>p5hקO߉'6|_|5jO}KXMo<x!|n@C3˅9tO>7hkK|.Yk+W._N|[lIw\^ s>"WW76lL:WL_<y|.D&|UT6dە~?;vXjFsnV_֭=gD}{dVӦM ]F׮>=Mw2&@�(Z{{/mOo϶%ӷo$WF; Is{d6usˁE&<nڴn۶@7n_^z.weym<L Up,o}饗zmlӦ/L׶΄Fʕk<ro.֕}}}Ç|1оC,X. %GweIZj>S#}.,4ߋ 5MG7e˖'|20= �q+*q8 � sOs|\LG!}[ _wRJ^{-9GyOSv+ qm{9{;Nb_i'f<Vv<scq]37?sže2bD"�.`ݻwWy];g'aiL,f͚uSQT@T <WdTw!Ío  %w3Z� @$,[;'sҽ$9%Kz>-I{ⱜöuo Mv[]K= MGA�@�P T*tt=ZF3HK[DzKc}o!!< w~[!� � � � � �D=SOI#FHGHw!+|46#@fƏwrL 7϶mtyk5꣏>RŊ.L%KLn0C-_\{w7P\T޽{zjU^] f1~InF0 Ǜ oq^ ~_A۷o֭[箭GK. Icƿ\@} /?^a(d.cD[7iVht'g!oᶝdhbzvŋgXXGɷr)?~~7ovӚ5k H 4Gޒۿ Fʓ'Nm rl> {;j`fpua*]QuE m?9 �%*%r@�,w8@F._^zYOicz_\wod|Ʊڽ{Kc$ɏӥd|LVI-]gRԡsO'+N˺c:ů=G�bI`С8pn=ʕ+W,u/ji&+Wλ /~pAࡇ7ߔVfM[ՓFΚGѷ9}#�  ˗oI'v қ{oI6`-v$|+iCfPueynk@�'`ź^bA&m KG�@�@�@�@�@�@�O?- .(#vt]rG%'W e=/Q>3o^v&LlR Ӳ`5l,( R O^Elu \Ee֣ ژxܹs~,di۶B0rʔ)0+'xbBV^;x_W_}uH[ܸc32'"@, IkەEJۣIye`´ ӲbV,@+ۅo׭j`G޽W'<5&ݲ J0+6o[JaZ6ͱ^Xb7.h7 � � �D; ;qrI/u,)pBh[;QՒ3Q+J^KyucH`</`/=p0e| <bJoz�IJTF uMk׮ĉUpXrTmԮ:쳣4hضͮ;v@�@�@�B+zԂsء~Q;*. � @(,PB|( v P+{KG�@�@�@�@�@�@ \.}V6LڷOV _"jUڧ~b駟O>^m.YGQc3 ]v(P 0H܆#GxZ&M@2oլY\PJiu_|믿_ƍjQ Ii42LD](FȚoۓ:uꄬ~* X/K< =CH}J7dSf͚- kw؆� � � � X`{I~(M\?h%k%eʔ),,F+9uh"[?(%=GZloZnh p,:uR%ǽ}^Ӈn^g,ZHVl)N߱cG:?7-POqd�Z@�@�@�"W`Ѣ9ޒ-lnY6m} !!w@@�B.@VȉY�A 2V,PNA�@�@�@�@�@�@�\³^zQi^T,_"@ _/Ue΢qP=Zvc7;|O?,ZBlUsꩧ~BY±ϟ?K9rl٢ҥK{.sgyf|ӦM߿ƍk H-egt!.c4rL�,G܅ҽeP+JO?-g.!=w!~Rb!ݻwߖZQ  � � �/Юt;4~իuws=\AxXbΩJg!͡,`ZIeDp#i @5j mܸ>ov,܅6iO] aRueħ %mPR  � � @ ٹqJ+WT͚5Sw@ rF}� �.@V 7t@�@�@�@�@�@�"RjWKkBx .hŊ�#]vB><Ƹ@f4am޼ ?o=LkuÂjԨNgرc#6L˾21%{ DA9|.M J S��@�IDATǤ_~nUz rei�*+Rvm5Brܹscw0P � � @< n *$*$2 w,Mڵ /PիWݻcXDVg$Lؾcm/Q!imŊRqK@@�TK5lP͛7׻tz)ܹӻF'+9LB~gl2h&D� TdgN@�@�@�bMdRK>͙=Yq/ L+־\:ԃW �d@|ҁY^-"@ #� � � � � � @v=rjɅsHW\9RA)  /pjU< .eTՁn rȑ#�Ł@7[_܈r}Q*U4~x~ǨMv6� @ŋKs-Lkt睒W.J޽զM]s5@YV1!� � � @ ԩ#7p;Hjɝ|رccXB0 /~@^0/EjUuͦ �묦N믿]z}t aÆyȔ"tқ`̙uNM6MoR>G�, P+ @�@�@�@� P+V(A�<"oТțW*XPھ=>O@�@�@�@�@�@�@ {N:DK/֬ N8!CM 7KbGދ &hҥ]t Gq ϥ}n;}FիW{ ʕ+jڶԊEC@�py 'M$U& W^yEYg&u � � � {ݺI+WJ\"u*wufzz;K7n :t,yZk% @-  #�!`׶<'uG:tPЭ9s_~N ̘1C-ZB)@ UDff>@�@�@�@�Ebq'@� P+VsbŤ;#� � � � � � @l_jԐSjN.C=Z*W.2#ĸuVDƎ.𩧞R Ծ}{:p@&jexu}kݺ1eXB={T޼y^.p.N@�D@aY5ˏ t3fx [Vs#� � � @L ?/}}Tܹiw;(;qM7i]D_ƫa2$ҢEKsghV&Stm[nM|w=Յ^yNoqFګ.H">eF>yR6m2:+#@&Ĵ� � � � �1+@V̮Z:� )jEʚHj-@�@�@�@�@�@�@�+oUjJZJz9< OkHS3r.ԯwyG>O;wVRԵkWo@}eR+ :t6lZjiܸqkf͜9S6eΜ{Jv-qZ, @ ~ 7HnӬ^NWOr2ߡ.H7|z3f&D�@�@�@�Xh<Ǥ'֕fxsTRE]t OA I=$=;eQwlڰA\96C/@�e܎] ӤI^:Ɍ 򮵲sjcꫯk.J`6djD � � � �č@7"�D�ZѾi, Kk � � � � � � z#G\7hda6(/J*~,bCaܓ y%\SjӦM 7]z*FJС^~eBBCiΜ9{Tvm/D멧g n: <XUV̂-iҞO@�\QKߖO:TK3ÇNPn?dB�@�@�@�w!X!~rԩ9ໞ 0a-^XL@A T6hWPo l"OVW�#P~}-X@EUc&_x\R|Aپ,fdO<9ڨOj' � � � �ė� � @V6HR P+F�@�@�@�@�@�@�$5n\@ԳԬ+CqL @ kә�.B6oެ~Z>Owy 5N:{>eرy#l۠O>ڷoŋ^/k^V9b eQ@�$_v`ȝ;ViƺQ@?[@�@�@�HK\9魷31HuH#GJ5ٹQFiСgde[(AA hV,L� C'pj\p;v^ժUK\sM 4{bZmڴFtH@8Zt@�@�@�@� ,&E�@ 3jeFy�ZqV@�@�@�@�@�@�bE+rcsn]&M˥^U^5 9VRJGm6* K/o5lPv&L 6"?e<cС4h+wzǵn:^.,̑3gl_߶{4wn6� @&,e`ʂl}ywO|ӢE)@�@�@�@ nZ,N:8^z}.vLL@=?V;RAd8_~r*T@ ^ (wND_۽{w2dH_;qFʻ@pj!`@�@�@�@�@ w z# �(?o_66E#@�Z <A�@�@�@�@�@�@�D[Rz5ZTzuFDȄjU%E|?h֭zռys75\ʖ- pnڴiSf 8p@^y dy)MjĈn0\8p.\S'ORJ7>-ZUSGHHǢ@�ZeKi,.UɅ '+w} n.]P?=/>G�@�@�@�<Utҍ7J۷c/|>zL@SFI9!RRܐ �ij@<3tP3ƻfڿ<dYgΜ_-ZȲ:@-̂c) � � � � @@ @�@jjȰ�Z&c@�@�@�@�@�@�bZyIAeˤ/  {J7ΗQD ]veޏMסZ`ϟ^zI7{i7Bb \b=nݺ:餓TPԪ,&׻ݖJ駟?j:t7)<[}Qƍ]%ɖWA۶ r( �DgkKCHW]%լ)  `9sԸqT~}OGz :� � � �|"M(+ҵJ. RxqX矯_|q$.  Nꫥ믗n*bָ@*Ut@ u]Ucǎ^�Ԕ)STLdS2#l FA�XVɒaY A�@�@�@�@�( P+VME�N Ԋ5GcQ@X\ @�@�@�@�@�@� X ZDn Y._�dUR4+p-[z? t-ޏ8͞= ^8x7IrTvmժUK'xWTVM0JqFYFk׮ի?kʕZ~!UlY/뮻tꩧz wn.oO ד� @L<Mb4t a ݥ|fŊsϩsj6mڴ9z"A�@�@�@�R`.WS3FXTn3ع}9HyJE m[$;&3iO˧&/Rʩ} �(ТE }7yƍ?ˉGc޽{]'n_cd~2"`ZJedE�@�@�@�@�xxX@ [  P+[W� G jܙ "� � � � � � @ |%HIF�0 ,!%UJ, . Lpa/i^ h"j#[J.J**{?eaP-<?ЦMōf?6lЁ<y~Uprmye'tJ(V\Ӧ}ݦM R@�p;~=lt҃JI7(t]Wu]%.-k% � � �)PS@޽ ;Yt*fϞ|[XARwHo];i$ɝJ )NԬ̄� 5kB:v쨳>[oZn=Mf̘C}Y�"@vɦ̓� � � � �$ P+ /@�zޔȬj<(Wg^C�@�@�@�@�@�@� ZPFwiXrZ�,r!L 0wܪR'yٳg֬Ykj,5go^KH,e]ŋW1w=&~nn㼟."O< ㉵{߾}ۍ}vر#G,eAc]|yUP ;묳*UzXrn2V^HVܬp:�ĩ>åGh}- v(< ɮ믿^X6@�@�@�ȠGqA[:$-?o5T5jԨ 4,D+U/JNcb>B  rd) �%PD }'\g; n棦&Of͚`}RW^?f}Ԉ� � � � �,@V4=ڎ�  @X7@�@�@�@�@�@�@ fR۶wI}w 9+WJjEN{hIp V 8t6nXؔl޼Y[lB~w-Y$!j׮]R Բ`- ٲG\rfLUq#>|8Gkg³´b%nT +WN9)S9d?ea L^rh\~}� N#'}Tz1ۤ;x.\ƍ-Z^pH � � � �p]\Ѐte]wI\"]|I^}YuMZR֭3$&W;l-GR:@B/!P++4MyjرYnVtt'#J=!"@ lYJ � � � �Ā�Z1 @d X� *T@�@�@�@�@�@�K< } VRF![#�) XYgoF@<yTre'nXjm߾]wvAH% _8p@4f:ܱ*[B,Jx>p@XWG *TUxqY%ڴ==[j>K @�8VR!C{bmZջtRfԿW-[<e2? � � �ħ@2oH_:$;ȝtU3gԵ^Qel& i $4a\0|A_j &f@�8pjԨYF'Nkt:?k,ڮK,a�aOɮ � � � � �Js@�B ѡCrHr`T�A $ z&&D�@�@�@�@�@�@�p ꫯ .Z:̨E�@뮋ѕL ̙ *x%Z͓F|vU L7KK.MFVܬt:� -*{ԧ҈3H=z{K־񀯼Q@�@�@�@� n-^,=4xsIgUÆ ս{wM>]9r좘/{c!Wxg^X,P-X1,c! �Q.p\:t蠦MjԩnF${3(5 G Ud@ � � � � 94@�(88c+MSQD;vh � � � � � �q,0gϗ ,čMV':-ykTvvGm*TaZѸm ÂX �(`uv?TB&O:)*UzS?L V$@�@�@�6yK*U["E7ԬYOD[ho^zIᇥn BYL [?;ww"�d@ƍ5|>|Xˢc#Ghʔ)رclu {JKJEAci" � � � �U@r0@�x P+:}T|kv!� � � � � � qs-?rI.7ht9@�X_[:YY+uŋmZό XoIgtNG�@ vnYZJz0:p`yQ;/v:JO@�@�@�@ [V,{$ilV-տ-Z([#O`W/lBZC@ {*WJwA5yiH/uΜ9.<w.n%MC 6,JɒGE�@�@�@�@�j$xD�@ DjjȤ@bΝ@�@�@�@�@�@�@ bR:|s#GO?>:bIC@ ,PxqLf8tHnl213ąi�@�] O˥{U'Kow� @ lݺڅeNr@�9znE:,ujҤ:w;L2'0vt ҽ2W s!uQ@�Ȩ@"E\P4w:u{,UǏi5jt?(V*M � � � � je>F� b5(@;4@�@�@�@�@�@�|ԪԴ4kR˖I& 6:   (haȑC"i, � 9]rW]%mOSצMRFcv܀� �%lGڳǥP@�@�(TH>\ZPcԉ'?آ;3ZJSK7$ ]_zjˍeby7@ r3<QFiٳ:G8ɓ'K.R@l lWɒ?z� � � � �pP@�@ jRȸ�Z7c@�@�@�@�@�@�"AE,8Iin飏y΋@hKu~wHOϥ`LoJ>gm% ݾ=; �G Xdø79,9x@�@�@�Ș@^z ʑ%K4iR*bx5{w_?iȐOji@�Z;CSL[oVZiǎQۗh3uɻuWfEuԁ�@% � � � � �Js@�B @VPc8x yfE�@�@�@�@�@�@� ,\(k'5n,4}҅, Ȱ%RzМ9>PHK n3Ӛ@�o^ZXܹRRg@ג >KA�@�@�@�2+`={J+VH:ttܨA~.lĝRRң]p6n P+L,yvyiժUjҤ֬Y}NǏ9眣˧6 #@,PT.@�@�@�@�@ jԊUG@�E@hYS3^#P+^5D�@�@�@�@�@�n~AO6oN,ڴ~zMۥOˬ8|h @"RӦ4'C@�BwRŊRG7u҄ ґ#�!� � � �(YR3FQ*[7I=?&2g4  ')=p4FuWm- �*p)rpjܸΝM͒v۷z٣?P]t93@�g� � � � @4 k6#�D@R޼޽Ql@ !� � � � � �Ĉ?>4i^k# KY^\tNfJڵfje!j WuEO w!%ؑ!i42/`&OlF]?Q@�@�@�@� ~A]{|P6a| `A7( .+yg46Fj'+ͽ �&PlY}Zstkܸq,kϻᆱZjiĈj >.R>v:ueˡ"Ș�Zbj@�@�@�H~_ΝL9s@ ԊL@�]paAA� P+-@�@�@�@�@�@�@ %~.\j@ZF4I{C=@ /bUddE_HS'F"OmϏ"^եœ|+I߳iO^D�֕|SZBj\[:DgK]O@�@�@�@ =ܹ~eˤN $t6oNoN>6+xCz=p{FjU,}m �-P`AYԝ.![n"љhݾ}j*_$ֱcG=䓺 U$ @-,@�@�@ 5KzI͚F^|q+V$@ j�*@�H.Pwowy�!@VvL@�@�@�@�@�@�RJ_?oKI^�0 D?H Fz+i_$ ̝+/8T!`'+A l@`qIm3% @`V5d:@�@�@�8ZR%H_-ծ--Nd \zm ]f͒>Hj.iXVV-+k.@�ș3 ΝG}T;w ѳɴ 6$z':ZV<yta9rDSN… W_iРA_# P+V(A�@�@�ȴW_;2fD�J@Z]4@ Z nbK@Z@�@�@�@�@�@ zl!䓥%K :uJ5-G�x P+^t,Ps^jm."P+0 i R|iOǧ 9֯FzAreΝ@�@�@�@�/.nIWjH]s;_D>˥ O?= +VH˅-HI͚= * ԪZ5TS/ �~믿^3gte˖ڲeK'{Q>} /,P+q`-+۷oא!Cv;<;. ēB(`ZKpT� � � @{i;lյkZS [j7 �*@Vu � � � � � �dUO:IZPz ֕We"@ AֲvjePэBV,,oӦTN 6nݤ\R_e@2cDV'Z eS; � � �Ħ@СRB0&;k\~:t6l8s #>+6oofIMz_@Wx@8֭U ǒX @ {oե4viK&WkuۮL<YsG?µ|nO]ٳ3'Ct&9@RBF�@�@�@ :TN?={. :C+@�h}V(R �X޽L  Բs@�@�@�@�@�@�@ <kHݻKuHKcJ˖I;x6@ ?(`w ci,#B*RD:X} HI3fzIԏ�aH/.;#`s,LknPNooKF?S � � � @ص7꫒;UK?>i}VZDڳGjV蘭*ÇKcgc/ iq *]:ma $8pl@*<G�@-jZ*TYg_u'sʥnIG,4JJZZօܹsѣG4ؿ`]@�@�@�ϓO;EA�FaHfUQ@�(T.;@/ڱ@�@�@�@�@�@�uRRҼy+H˗K]~Qo82@�P tRժZƪm'3rPZ@eKigaB@r夦MS?xl"pѤ8(\X_Z^zQi$KZ6e�O4HۗPx@�@�@�MZRun~vlai KOe^2m=;[G.+B_X_~!DxD�@ɒ%5k,nZ7p ~ݓeAZ?p4%KaZ>۠P,Lz<y$�!غ_)Z!J@�@�@�W&C{Kk@ ԊK@�"FnuP@ l*+j@�@�@�@�@�@�P @.yլ)͙#>*uE�H@ "%!l@> S Q.>D( 6nJ~tIC�p XKkHG ?a6r2uX � � � (VL.x@;0 DQQ �Q$(+f(fs˺ak\#( " (H뫱ƞg[SsssNF-Zd־ᇛK8DTK^>2GAؑG5}kiˠAf]@|UIN-Zd+G� �Ntw'G rJ .ڛ+W-zو#~ن�2HKo(4 �@�� �@ nfkQiج[< E� q~Ӑ*I@�� P�Zepj%A jp/ �@�� �@�� �@��M`SN1kݺDᮻ̦M38ЬVtFz�rf;{DM`l3eRKnߧ\-.5(_şجY׮[/JB"%x!qڶ5;3 *\~YDn �@�� �@�(CKO/m'HK^yeld7}iYlrV/a#0cY>'9A��DtS tVXYGkU"`AZÇM74@ ,XPAÆΈ!�@�� �@�yDۊ\ـf5jDe@@P15� � P~( E@X{m3Mf_Q��� �@�� �@�� �@�i%78o֪fnf'VZA /73Νs. HI[8�hl̆ 蕜 60{B<ac.@�%QGMl3frf+Q]$zuYJ瞋VY"lA�� �@�� aP36=lʔ򎲿>0'?%_DT='@ |l@�@6 |v ЖT9}Ƅ'|:uM@ ެN3#@�� �@�� PBࠃ:/_?B�@4C��2E�AL%]TN,^\k � �@�� �@�� �@�(K`\3,z:ag@ o|X׮]Oj~ԒCݺO@^fZu(dG]i+ nSB PY~f\x֬xuDT+� �@�� �_o6{v~pLK_Lv%K:)f]\΀@&HPeLL� �r|.s?5AlD5k)?O?47p$@Z,X`ְadM� �@�� �% _{.;Q9[d @ cZ� �I�A?Y\ j} � �@�� �@�� �@�M9Yː!f7h6}٩f~׍C�,?4kl*+ jK֞ziNb&! ϬN?ߦY۶n.3/9a./HT[;~@�� �@��fW17ߘ|psaUl!9! 1c̖.-LC s$բE'e@�@,ܹs;õk׎=o>X?tz꩸se?\Zp vc>7k(# �@�� �@ uԟZ S>@�!Vf* �@ `N` Ԫ@ �@�� �@�� �@��fWͮLN8 � Pڵ piQXld槱ݻٰaiL �X{m}4Qc^2�*IKdKQd8@�� �@�(7d%u]su[o]tQ8:?7R5ꟕ˾=?|G mje8A�ԫWώ;8;vM2q x85Ǔ/_<zwNr{=z+Ga P,@P;u� �@�� �z6ي?d��Zvǩ/ �T  `֕+%{2�b M@�� �@�� �@�� �@@V/DH'̮LZ>lRHS �&gG8-dC=@Phn8-hGU2Q;J P0Ə79MRjBs �@�� �@�O;JD^}z4[gz<ծ]$eUqWydo݃6{E^~l�3O'@:|O?٪� [mСCm5Gĩ" VXբE _P\,+e@зnÆR[ @�� �@�HWr~fZ~-gB�($%VBu� �  j),]@@Pz; �@�� �@�� �@�@~X_6 N+YϯPZ@�%0gܹf]f6R/<|`ֺ5! fFzuʕU>}r@b}y`]xZ_/j*y+WvNety'W-ԩc믿5h9oG7i6xc,qI8 d@ XFk/нωs+{!g˗/KS\>zR-ߜzjA-҉b͚5('}+/7%^nҸ> �@�� �@ lԯ0u٘1f￿}lڴ5k~Èw\ĵ8Ғ~п к!֣گ>]%e z;h_X2v[ ;H>DQׇ~ЗZ25 M5N$lc _}UR-sH�8�͛g?s=6k,=y[mC+ەZa]ͪet ߨ5zkގweʫE-}'îj He 8UE٦6< j9> �@�� �@ cԏ>(u 㬣þXkR_VuSa_~U:`ϛŇÆҾ` 6Xl΢ѢEaØ}-bԾ �*K�Aʒ:@�@D j5jT 9 j}MF&Q@�� �@�� �@�� � n+dR307`HE �c��@�IDATdcZ%" Aw.RŌO4{-}xvd�mʔ)qg϶ M00DDU7]wҤ01SłdfӦMmM7u7-¶f۴iysYB�%pfk3~W_EKKF+5"s^sN >|ml2}駟,?hEj&!w&z;z&DFM`v:$x0[EM$\2)T&grj(Gu]Ʈ .z1@�� �@ HZ:eAX D"v;n-n< jfZF;@ b:'8QKbb t~yۡ@էbE} cPZöxsq!}{ZuJC?CPzRQe($0c9&5@�@v0dɒ2Q6i[teɞMK߲!m} eQJߩ1چDߤ5hĉتU+8q )-eJ%o<}ڠ=J6hSXoР)N7b*9 HP |xg �@�� �5W]5,ֵ!0YU cm{M+z_XvV/zÆ֬{?+؏UׅgÖ.ve_V$UlZԹa_+T@ UX@�@p6m $xq"@�� �@�� �@�� �@  ȖvMfZ7;Lss @5l̡[Eq>�mC͋R'ttCa[E  ǎk&Msikgxb&MC,9J$.wNJ^9AL͔ĻB /`7pɕoo޺tNT@rzW\púDA%51WnnBssUks7laӦw觥P7Tߘ/I5ˏ34;8. ۵=)>v]DuݫhGG: N S 7/Cm+6l6h#嘜�@�� �@�E@m? (@hk[bhGGnZ GjKHu]S2Q9k:>V,u7SkSm->ݾ \<ԩŮy}NRZW> ~x1�CrG(r]?8K-!�@+[w}g,mv;6-e˖Qڧoݫ0 }ݭE߽7|z` R{/|jo^ OKv 3`Ic#8#j PAB� �@�( ɶeg¸^-\/)\j[՟ej=v[`oMasse,b}Ήg,V`Kv` cMV۱롟-,Lu-Em7[o+eUmU}1z~̨{@ �@ U7*7fAc� �@�� �@�� �@ 8ff[n17i좋>�lN�;w׃dĉ未u|ɭp ef^ufr8o{̙3}1$չsg;smmqk6۬ʎW gcy 8}tkʔ)6~x;N9Y׫=z=;@&ݞ7ow((cAe: [luر h0+{&ks&&Ukr&G;U^ W_ٸqJ5A;:1ypv(dž!Gx}} �@�� �N@mz �(nuX2Z8+}\ -v m ~n[yڱ%~0/^I\WnFի/kܴ>w_NbWBA!zD܂EuG9*3� �w9sL"M!Aw;W3`fjwAVwBXRJHU*yTڊKme*9ֽnD #_~iG:ݖNj4mԚ5kV&6o~$rΰʅ{A �@�� �! {Tʖ> _R촱A}( BEo<X-x%7wHHdLQf4[[챉zMVKu6-M\"[ÖeU[uq U#Vq5 �@ %an �'ڟA �@�� �@�� �@�� `/%1-3;sK @� 8?6yٵ&?3 MM0'uT@f\cf$Ms!C؈#>pwi'0`u ii[.MVC4 jcƌ?Fis'qBh~m۶ї"Ir(LP~rDw=9nԨQvvv`G KM&MVlA<KM8ۄ JbDFGM&@�� �@�(Tr(vOjGFx-6]UPK>өSRh B$'V+l9V lѪUX_m|I@ΉSyP}\"[+/VUP# =3̶ۮ)P@�O@3g,fͲٳgF9y AR]Cnݺƍ{% -i]e3&$uoS r櫶PM^:}t{w4ZUmٛ6tS7l3b-E~g"@�� �@�@%WpV2VKݲkŊavhAu]4gKQtS*j첚0q2tW.Sٌ!h۰+ȎK�J�+_� vW>Ӟ4 B� n?HK �@�� �@�� �@�� P�43Ӕֹ\� �L`(s%v%]3⟟  NM16 A!"|~}Y{o֭[[>}뮳]w E@GNn&ɾoxq/ܶzk߿۠wrxɒ%W_ F9DPPϼinyZ8-TP  ZT*%&G+x rzShgx7KM&@�� �@�5jk{ et;^uP;+ZGN$bx \'Կމ+9vv.%eXbzd&u j.} ��}O6;K%uٽ`?YKW^~6d]x RR=vLʱoX{oȑ%SVQX7*M�AJB@�� �@ /Kϟo!_)eO 8dS <Zʮڮ];z X3]PT?leҥKmѢE~nNָ qSu7.'ݖmVP6U5Sc@�&_5/JAn  �@�� �@�� �@��~{֪UfgevflP\- �txsLB:&& A/:RYl^}7A _ h?셤Nꅤh|o>_Urk2!JEb]qũz^\nݺJ!PYz7PP樂 ɛu,Ml|kRYLPK9[2ԫW;&sDAPQ%%O?^z%0!$]w]kٲJW[ni;L �@�� �Tx=D g˗&]N2B<Ȓup�k6H/(mA\K-'~ K ͚5CMe"N@?ηI΄� �'>>>s2e}~dE^{eq*C`}TIm۶q/_I6' [oe.v[{i뭷lw-TM N"@ JD� �@��{=.tܹv=FZM6UYvqGooѾh,K �T %TlA\+,`3gδѣG{1=+\_ӦM!> X3Qv@�+gdI^B` Gz'*L �@�� �@�� �@��bȇwpʕfgivf Ĝ& �T?*DsrNv޹Bq2iٲe&= P&MG73<ck׶#8žx a*.gݻw[n7|^;餓sϵc=։25(*6r-g'OK h)1ʡIM襁TP(DvRoVZEC-zMn>u� �@��LM) %_ (HZI:}KtO�u '+2gE?Rǃs7"lONT1{|H^" �@ k]<qDढlЊK.eз;vm\^V}t JFǂgϞ"`|A>T[QboA\K6,С'jT4 t@�� �@ ' O,uU2hvq!lFަ#i%bF8p K@:({izj/% <mK+fewolQlͼVKXd9 ʅ@ �@(EQU* '/^E� �@�� �@�� �@�26駛]xoM� �4XȜc+HCb$QTƌhYNEUm*{mȑf}f!C@C+҆ ❗~vhyVW�YqQmfwywqvt/97aO_A5|Mo[n݂xD Hlu>&-r0m4K2e <;i帳]v&z �@�� P~Wm^WKWV\!! z#! /ɡ:(N:+/o^XKb|A/,ǍH_ZJsZ9)}hزeˢq?NpŜEy@�" Dzq;ƸA?ǏbCrdZ~}.q>ڶmkn-Hus'm4ibk4ve۝<ywذa~(Ν;u9&@  j9@�� �@�yA@Qg̘mΜ9Yf… K{n߾իTFf͚ͣ+@ h>EKtƂHX+i);Fc7wZ-ARQ}}jYNp*KT =C�@pmY[jM}!>* U� �@�� �@�� �@�I` 6zsΩN;좋6,R+@�E@5Eߪ䛯$k (wOcV#U=4i矷ޞ{9':9t( I 4tɋ\϶zȵ5N>dm 7L'>cC܏>;ԤqYN;d't}i8HoŞ={It_x&M>n?QZ'6m;<q-Fx+Ð @�� �wj *N:Gʩ+HX7tҥT<KΑm �*I@"YrX^?~I#~^~eMׅwiG+*PCaolVn֐zA�]?{'/??蠃LZ:t;dU' qN:Jh.؆esoM~%,׭[7e]|l޼yC!� �@��r9Ϟ=Ԯ_ZӒº[*<77P6gj�@ڵK_c[q#mS|+?#h"ƊhH֭KcJxKv`A'-�  c�!%GP+w %� �@�� �@�� �@�H+̖,1;sN7N_@�xu][}A r~) ޽+#I(򎀜]{tAСCmϻzJԩE?x{K. lp ʍb94y\m?G'()GΒ]I&Y,YA�^{m^݌zk!>vWzr wێIX� �@�@X^Q⹓'Oq…tj Hfc9H"Zr|FMԤU nӧOQ ?~=n\WJXK nl׮O3&۔V˖yWl @ / ߶7|yJ0Ks;F Rhd@ӦMMq}-Mᄈ>~Cdoٳgiu& A-73@!�@�� P]V^텲MUeXb/lʮ*lu7lذN�L@G4vD1^ V[QP b ,\*n6N45�t@P+4I � NMp �Q&#@�� �@�� �@�� �p>m`s-29Z@Q1œ@@QVJW{eƙ~xR$ Ы٥M`ιS9' Q#<̙c_~wykxSZjye]fv={씂\>SPPNGer0(r"xG{Ƿ;v!wu @% l֣GCr 1}P~6)tMvYg&Rynf߬SN@�� �@ ;[/\}>uY;)́XHB54�@ }>]b Ͻ79r{|mԨA~MQ}rtOr� ysw fÇ@%KC]w۾֭IK~Zo;m̧~-]ԷW% re]5#Qn[\8� �@��F`…ޞ*ĉ}x/nBn}3ΰ6m(@1X )>_b[ؚ>k3QSb5kbMjTl֬YlRlC ej!�@�U#} �! ;7w�@�� �@�� �@�� �'j]sقf'h6hYӦy_5*�@ Ll7f{E9F@O?s“c8CªZsWHE ~v{a^{Ovh&z6`�;cSG}bͳ_.N{,޽{w[L-"oCA!�IN;cB{={ws"Γޮq>8'xyXB�� �@-[n%t;vX ɒ@]v}OB1U@qX?3 SƒC &iֹsg/"є F_SӧsT(  �&믿[o7 :Ծ{okꫯ>u:RxZjo/}]xޱG}d#F6o$ݻwoׯIdK'~m � �@� Ȧv㽘9s|6pCngim۶BZ^ @U|A"_|M4i%`xwܹsivi;u䯗�T %΁� � $LJ� �@�� �@�� �@�&n^=@ckomI5l!�!)` ]U"0f9G fn[dQÜ3 j�b"oI'd<_/p"'`v5xwxϙ2E@_xtvmL`y҅@nлom#G4Y@֭}z{J �@��r["m7.]Yger.9}#@�_ 4k% ?SDS4z)ߏ޽ leպt=ۜxy!�= *c3<c˗/={W\a5m4H Oj֬Y*lۚN/wq&;98m6 r 5*̺Q+@�� �@ ;Nm|)N6$nnҵoR  �#PN/Z(`0a}^ʟ馛:mvvZ]kD_:<zy �@�Y"S6K  /Nz'@�� �@�� �@�� �@ Ys o6wf\bּyA�(xsOs T0$%!6�4^�b /A'ƾNXνXkl~ұ;ԟo喬OFU'䚤OW_}r!ak׮]3 @&H<KQa֬Yz* �� �@�@ X h1x <ywԾ}{0hРAy  �@]w]e]| ȁѣ{g>pb-l=pcQ\7iX˖Ց;yB�{9s^{՟ @ 7[#qժUkyC=Yg8p|ɦo4BpfN  �@�� y3f̰#Gڛom;^tɋ3w:wxVo9@�H@Æ Kmႅ رc?l2_'ӳgOoոD�A-@�@h܏?S6Q#K  P.j� �@�� �@�� �@�9H@R/7f1f9XX@,_n6jٝwAeb ֻwړ%A! ?Wt~X!@ ^'UiR.$T N;9=jl~ժUnj)F`}ꩧ{qI{t �*B`73<ǥKK/d<u;:<cB[Is!�@�� PH_QXvmCkza%RH  �dmQ窯T[mCߋvX߾}*0}zI ZJVC�@4?ܮzojݺqvGFm}@Xs5K~gocn}.29X"iITQ/4@�� �@( Hx޲W^yņnZ{}svU�nߧ`'NtsG;cW]u֤Ig}O>{[z򣂔2H{$@�@\ω � fK@A( �@�� �@�� �@��p�Ͷ줓vlTJ�2J7~ŬWfCH@cȦL1ڵ�+Gr-:~6lXN@ c:,{^CL+cSOXf:Un/̬;w]p֬Y3꫽cڿGA-k!#@ ԯ_ߎ:(/wy6d8pk� �@�EB,ᄏ5mMBv}76i$[|1"y(& sS/3f-X{1tM-Zxב A-OΉ,f:'҇� P$%;2KlĈ;sEL0n1(2묳'6a' Qw}"QxuZ>4n\xuF� �@�@HD륗^#<6lT{=߿xb{mРA֭[7Ĵ!�T;5koog} 2~pJ}q6L=Pǿ~y2e�je8A�@xkw � w1nE� �@�� �@�� �@�(Ozk7smEq��DKП%on֥KU,}57Y,"R03<cwy=#֩SI"U'kW\qw'T=ARH y٩jr:qD{'DK.ċܤ%� C`7O?Fe+V:V +6!�@�� {챶{?r�sy@CN8]V  � РAGȑ#cǎv58;d7cYVZ@�$9Q>S|kE^tvuLfK@ kx9sc;m֬YY,Yu �@�� �x&M3<Ӛ6mjt}wvڜ9sL7 �@p ;淼Sf<xIxO&M1.jM�AhC��2H�A %iT#U l\@�� �@�� �@�� x m5XD/|М,, �@ )V'= cƘsfn_i'Ы9fǧ=i@38 i,x9&džӧ{g}_^xaU?a;w>F_Ö[ni_=Fa쳏ըQʥ,X`snƬo}ja*\z饶ەW^Y+95~'#e J(*W;cmVRSO=eSNzX.]|vB�� �@  ֽ{wܹM6͋雄nݺX-\ !]W xkRybFnND-[@=h~ 8Оy˔ UbTPZlwͳg}~7qm۶{e  �_~ٶfT?~:gȳmSCD.(K/do=f4 &+?,vʧwisĪovocҷ8g+ 8?>i �@�� �"'kYϞ=}O)?;+7+ǃC޽o@T-ZnB(]8J㕣@:mСn|;l֣Gnv.e_@P@n$Հ� �' %KJ�->V= w@�� �@�� �@�� �WuNV 3qG?7{Vʞ �T/>r{~p{K,;?ۛ5kf6lXC U_?K?_$r7/n-nt 5IO?uN=P-{wN| s$Ĕ+aѢE[o٫j?sVi"&N2&LqS3XiK_~Ç1;I$fͲz;LL!*G}dcǎ{LgK� �@�(I&ygiXs7| K{h$^.S'xi׆׶h.^YKjywZEyڟT޳..#}ڭj^xN9R<gΩ]3nى'6ϙ A-ƌ&@�F@<?SFm;CNW309ؐ!Cle3sLM\ St|wiyL*_6& I4nРAvQGʕ++V364sCJ� �@�@PN;d}ƍ5&Eϟ}/ֳ%>1-g1A  \s2'cj7oKѽ{w;餓lm[]> 2ÕT!�@�!2</O@?8{!�@�� �@�� �@�� -Y=<Ҝsɓ{l-U � �pukU cƘu d"=m˗/.(&᮹vUWűb {s)HFQ"F 4~Ž*;j+;#?OUJxws֡C8qw]ɤ2vY6mNXsc9ƟRfD1M<rL,~v}w˄Yenڴp ߷ AK0`�︹tGk c%@�� �@ ȱάSwOZǎ&WضSUj6d}Euo_UVW:뒯IП!=׿Έu_=)kilڌ3SN{NW%ߦ4IԪ E� WBwFS̶=LAFk j|.<r'^a+ӮN~ƫKer!6~xpjժ&uY& A-/�@�� �!eט]v$_]x^ܥ:%>=ک+)6g\{RhyA*&;Gi'c\=qHOvo ,"SJ} P%+e� �\#PYzfjڝ<J` M6[X Po@�� �@�� �@�� �& !!CJ=lm927ۜ3.C�@"/hC383.]g/2AW/>2[0&/l:㫷 9&j26lT`o?[o8MmѢERA<m„ N@)HF?luZͨ:Ŭh٫ZjUWYw)UI:SJ0Vd:ߥO<{窒B�� �@ ]~QGW_m> >ܾ̼SxmʢIw2^2v]6a}g>] L'#e&TL~+G[޽KI\.ݗ+rx݀/]U3L\jU!B�LছnGy|MyvM74gE69*hX/m ;6uT/Z u.:~=Zp �@��*J@"'ݻwW_}KHUtV~"I_}+)VgVޅd$&;L4(trF-b|}ֱcG/p\'P<f*Ά+ �@�i'ڶj* Br$ js*)!�@�� �@�� �@��Сf_n6qAskֶma�矛MV^޼(1f=p =0Y̎<2kْB`ȑֵkWp 3&z^ju׵>{o&M~j)Ѫwm&^/š7o;T*MZڷoo7|vgSSOzG[eHyv7pNQqVC9;4hPKgzz)7o/G]&cEqS*a좋.q:Iqz4mpܹ]V^4VXa]wVvml5jS?祉Yꫯ~Caf ΢_\ &Dgwt)1;:ԱdEl]ϙ~}]ST?41Uaʕ~<ߡ%K+D[W%k&Mx%C (ꘜ+$S{#Zx4}L7dgAe5ji"N:r@4'fsεSO=1ZhaW]u5n8٥ۋjjY9[x @�� P$d=l0ԾV;FmߋvK楗^$d裏{~饗v_�v /`cǎmSN9ŋx*mN*xv-n)QSzjw+ĶOS)cE)]7cƌk3ƶ۴ihZy}i'#XyytNgBSOyJ^%!gzzCe?)Yt<Qo?`{8UzT~Df7T?V&L^rU֕k �.9NqK.:dE?O6#كۺARTJ"d8_գGآ{+|˾v7sU$u'}^/f!"Jۗ[.H$d m%[m-M-d_:/^eNh 'Z]|y~u)&} e]0:yF8S{*w-WA�� �@�I_޽{~ 7hHR.{G{97fJ`Q?:sC~D4ҹ^-/8;/PU?O?mӛok>k,ӧxWE딌{EYh"_'?ciTW/[nv!d*]X*U&'W5Ecn;oqt3%MvϪ7(<ݣxA*c=X<%= l5lذ8+yL@��D]HRfd3HaÜ)ԩntE"| =� �@�� �J��@�IDAT@�� �@ R$HH߾ȧ# @ HӦ]J_=. nɛ\nE"GQ }aҥK9HMe˖;&UEK7"N(w{gE0޽{$ȝwYs5#<@M8 i8-M$8g'wTsqڒqNJ#9فλ{9NZNH~8F$T{=z#NT*>7ɶ4w=kD<ؿ#9td.ҺuzL<9&GxRwcǎ7y:&FL5NǟW_y*9uFt8#x`duy}:N̼>1rI'}+YJK?FvqG59W.\0Mٳgdĉ9G)ɾ991Q=RpN#:筷ڟN_EJr#n2(7m0?!pj2Tw}=e˖Ey.sq"Npc\;<7)8&DB9-2D rCcBV2 �_~n/G4htTp#N޷;sq:j:O>O GN?s`&fS:ʫvRS)8wi*e9mH m}v]z}gqRYVmJR='%˧}j+;s]sMgyN֟bTt]2:'Qp}u|baW/Ƚtb]wE"WK@Aw+ߘA߿N,2F-l.%9o*W 'q͝;7"[͠A*Wv"lO9 Jol}ѱo|Kva,{?'M4$+ɾty흠/fs608>iܸ+X2X0Wym<% |RTtݣdJq=_r33G4؃~�*CߏPkX vFT 'qG'pXT?S'`oxijjlJRq[~] TYMi~{_~akƄ;z;(M6}M_2HfT56?Clz7ϔ5{Vپ~;g0޻{"s5ԼC?Sr߅{w#(*Ha#@�� -n<0ƫlΡ|ΡUЈps U ]x\ @�� �@�� �@�@Qot;sdSTէ� K9眂"D!YA7lb<G@N{5-ANşF'nƥIGoV@룏>xM kftT(M ڜ9s|&Lv y_s:(x2rM 0;ysEp (t!]kއ[ϨoG;$]s=xQ:uxGߡ|jժUux4-\yFmT[*PiɑAT뒅s\HNSYr(_u7|ӗENP]A *&9 ?CzL>ݧ+a~_XgJ;O ʤRq|/|]*sH 29zc| w^SNTd �ZiJr� 1rR%) JS\])H .]F|K/o?o6c=SmITސot)Yٔ]=uنT>+>y+HJ8$㕬?I${&LwT ջrH;_|;v*I:/?#T꧴oݗ_bC1R@ V&~X\5� D<Ȝ7|W^gi&6{X*A*Tю%l+r>\0k,*wޥÆ ǣ$n+('Fj׮m?ΗM4+ɾtiooY>rl:/ػR%j(ʶ+R.M|*Ck"\Vݷe˖ʎ|@i9|(Kݰ#|Ƚ6~?Mᯱ I{gDB ?> j)jMfQZSJGQo_2[ҊW)A#1֭[}^;'5\.RRgI\KS4GFP 9RǢE3gSKاO_q _6t3=l``컐=)q믏H-BVJ-B� �@ K6l,eF6@B_rw2!&B�� �@�� �@�� �Tf]fGf}oUL!�@|ٴif<RmE <&qA>ج<E[z]xرf]m5(8F`ٲe /n |aʕ+M4;~7o_5%tA6j(sc-MӉ<$guСC"$#жm[><+ ~nE79os?hu5 YgsG57Aܿ{'e͚5-227ݯ;&_h38>uu*uIEé/Q;4F<x^{#N܄h˧~ڜm馥ǻwˤI\?ımܤcs[~B*C͛<t{ *LLʕ ,;1bt܄js=pov.yS]wR^rܔ� �@�N@mӻۜ9!ysovB>xҾ4mĤ}z91ӢmJ_OEx{گVɞM],R_СCSMm\2+YIL$OR.z:!6sf}gɝRߘ?R_dط?E}`9oG(!0}YVЀ� �|"OO? ':ea9/ʜ`"Tc`dkl=Αn7W^iO>dSí 4oʶWMNoIզ^yɾʻ.|k׮6mu'Y/sK*QJ3KTTʗ}nժU)HRdC\26n\a@�� @͚ƽ\ �D }7?ׯK(*Wh<[^k GvO݄M{MԸtͽH{*,F[R,T/4hkJZ|rlo癨J!*1=k̳�X4Y!]}_+r*7>># u:)b zC`© 5� �>;RB8ڵ5D͖,)R=@�� �@�� �@�� �j!0bf.hذDPӪA�H੧41'@fv0CksB@Ҳ6*p-r@Fl޼yi/X0Kmܸq>Jd`cDQBMy; Zp,I !p<6p~r^*1:(I%=+3BvH޳ f' aBԩSM{)Sy#]3v 7X=sN$$rS-ûX?:DrFIOF)JO.sI9/Y-13 F3F&@ߴpKJ!%^ )d):MKWveBOEˤb%1M9rs ? >8s>T.\5W^v-w I �@�� 9_&>sCfͲ8$bŊڀbkN:y}7:6Jz'RS*e xeN+2Vuo_l+xeS~<Ke_4T='LJ^:OK;w}eD;2џ|SK躄FbI&v[?T~UR&֭a �&бcGoR?r9UmCbŴv *,jĉnR/[)]{/ԍ7m{=5Uf[.da@y jh%:S.M|_&nlގH4Hǝ3ZiDJR� \9R �&q/o+w4D]ʮ+Y[h7:Xe+=6uylCW)r_W%:cV_ g~dUg}eL)=])rAgӧYLCP6u� �j' qŋ�Dx'y �@�� �@�� �@��Inܼo[o=sQ^}t2&-@�Ig;:K@L`x3Xi>kA^Pv@vl~`^{mG}/_nd;Jm Ef͚ƍGk}/yJk„ ֶmیC8}jAܙkz7OJc̙3Mo6`�;$_2Le2cCO9oʽk/y䑥&K\IWPaCQ4 uu1MoL[ѡ{ѓUPþ.Y&P`o[Do9BQV,o6/yYgJ( �@��%ЪU+;sN2 B"jÍ19䐄U3'ȱ K%-x0JLm-:J7+K}ޯ>P'TF*輪I\ԧW$9r-W_}U,X`nm{]D"f3f1@�!pqy[C=s7dС)̏R0p@m駟6W4;k׮^#W=.QM/vA876Dr!t-%mTʗwiK%tޣTK9|tO;t$G$T0 ֌!�@�@P|6�'lmڴ'?CT<&T(SSʳq?: l*^Q'ץr_W%:״<Ssα.ԗ~dyϒ=#~MSXT?p+,t]*K �@  ޓkw;7^ؖ,)v � �@�� �@�� �@ zˬ{w=40uΛͺtIG@�@@"fzh.2#q̉թ̅@@ZrZ  = hT۲eKW=e!)1cgϮ0.4GUq;\f6`lM6Ν;g4ѣG… ]5 Y!Iz{1kg3СK.lȐ!^LKY QM Y~ >Ei"L>8T\Iw_L0.ep1kڴmᆶxb{'JӚ/'~ݫ[nҋhuI}M;A1JgKtAމ?<yrfatyp y>13 �@��_o\l=χ"',駟uF';c-*4h… #&j) BoOk;UljCVo_yޯΫ\ 'TF*輪9N;c)L')to7< q|wwF/ݗ+ooo|JUe3͉Vr.� P7onW_}}6a„kv|yy駟J˦oizRM'5kz{N&M .0H9s֨Q#]-xXHWv?O[i7t);־⋴}˅L^]/|%%j,iW]jRnW*yV圹s̩mNmaZ}( �g>6 ( ("D(k@1a9yu]0+fQ sX&LH1 **bF� ?o،zfzf:<u]Eu:箞:߇@f­R yCyf@�\uq+GnȥVeTzv]~=VROunZq\&TQL쳴mfq-}'u?x+Qk| 3_zs.r+޻ᆱ?Oz3ϨYfVł Sq@� VmOJotA�@�@�@�@�@�HO s׀6$cL =Էozg-@�C ˝2Sp0 Z9*HO>YkE`d\`]w:F&'>|x9rdkIy 7T^9a''=IJz�z`<7dcnڴiPǯx݊,_X fN\GAJ[/_QpM6$ci t]O=T4(#I_sG S/‹G Fہj̘1:ch_~yQB{>oр_Uo9 . ڏ9]U Gu Zs5eŁ<͏#}Cݿ]w?h< Nψ#5ly衇F@tpDꫣ`^O?$uYj웹PNM<ſaNz͚5TvS߶Ӧ;QV:0-?^I]8O<noOPkZM? /} mE< � �*dNhcrH4"np"k&ڻS;It5jB|ɲnVu1 ^$�Ngy_?#e^ ^E*矲[ҵSyeJk5d\2>^u]I*x?^uR׫t@ӹ6NSRkO}' SiI>Oi߫hc\)$מvt'(.*Z+~g/'lmsWV^+6޸d}@0N9xm4qĬp(=sΑo?{Q9sxS]<^:T|W`L?t(ef"gHI=?SGǾpvء:}=7W^<F:SyrFW_yD?q?M ,XNWY(He+9/M|.C|,KK۪飏>n=ztm!0o)5NceVA�@ O|T8…yR!�TRM^~em_A+XK-ǕLz?n((S=.SI-%Kx{XIm%e}?(߯yB=#S:_Y:noJ\Rk꧟~*7q_۫9eW^:vO7=0p-{ڙiMUm0>}-ss|\tqm|l\-N:hz뭧iӦSN^lWȄ� �5$p]Dݺ53v5\H4k5š )H_ <� @�@�@�@�@�^J$geI$ H$ @ -K$ZL$F:RX<h03z(O`.o-G 8pfD8т< 5{k?%BRDȖa`b}I@_{ڵKtM, Z>נAA!q"XV Am!p9$i/m2'OChTe{/q,۪￟ٳgb7N@dͬꫯIu^vUWE ah` aPj6 6 sWFϻuOK.M~087FHj'/5L硍De++lxyu9Z'Bm/$ cF}G ʬ_Fx2_c6+b,׼6,q'G4$)~/_}ΟtMSL~k'Bwؿ!PfSmw< ND_kkV"$YҶ*Pʃ0?`Fr9뗖mimQc/cTK,I{BDЙ8Ëݻw?L+iR{9 Ol6m$B+{F�sko?P@�|np3E~\wDIأk'ko_> !PXJK4o<j?>4LE9O=Դي6Xƃ[ҵSYe IKlwk^וT^s9^q2, 4ktʒWYIOY߉i'y;e'Smޏl>%ړF\R{?^^{)~~?ns{QH}~< |bUWMtҥ*urfB�(C}!aUs饗;yk̙9rܮ߽{_ToN}eqQ(xw5#8"-7?,ow}|B⬢> _GO5~g>[ 75_ϓVRYr.KI?!n}E.K׮]ƍBb=ܓɿM6k߾}?OʺF*s]ϥ+_:eL5w}ѱto$]]aÉFsts' P~*v19 Vz!@,;Ac~I&z־駟&BW5N?pCK+^mjOI>%ۗWR[II}SNiv{lCbp}v뮋2,;Kl{ <nmy[ne[gIkYUeW^:.ݞ/FUT;SYqyǬ*m}K)w)7ۤ;(v̅)V<n"6[a6foVr  �Ԁ+ $-Z$5lX;dY!0ztRHV˔eZz,+Xw,� � � � � �xiHg~}ddl@ ~Za-kfΔ:u^{M#kI @+ΓZS�*L B hUOkxj۶m737��b1cBc/sݗ_~Ν;+ LcZÖBi-^Xa�aB*Е75J!�Bk` rR߫0I!€hZEF`0h5 mE_a{)+0AͅzjܸqYªDi V߁l]!i H[դI>zvT'U-BE~ A"PBGAw7Cb} C[H:ꨣׯ[rVE�<kzs|9R%@ z)]p0aB /WQk_($UHHk]vE!༾+:WTz-s|G?InU^(%];UllKWI{*[>-mqkOJ;N{RySw}}TIcv߄xo"ұcGuY 3Fsi /$l'L)j_At*$mʊ}nYH2[SWee}*J:rrU57^tK*_+B&QMV^u1TylFPhW}f<Kk Uߏl=2Ϥp{&Mآx(Dxn9[UjWUDz\L]g'S% G�]tΝ78cT%Sm?Su\j*뽸le?|ɪ_>0V';V͚5mo&cZ]ǬJ;>rC=[oU!a<6O kHic9Y'ܿc @B- �Ԡ)5hU- pI')gr|+Ƨ@�@�@�@�@�@ &O<x U*Hkmr@r{ D!a>ϧNC+C/'kk$ w};j=Ƴ`kנA-i!ʦd(=9\XjlDY][n SN cwCRL쫐)_Z<Ά;Q3f @Fߥ&[ax^zi4yviurb&@ EZ)<D�i1~kԎk\L"'h7o^TÔ gTm_?p�kk*xٳgYL3\ĨR|GYIDͿXpa~sF5%%7+k{e7dw!� ,|}uFY.{kN!յd /P7pCtW\6mTl#]G-k(^�!��w@ZuU{=̽Sb@&f̘믿>F*cتU(BA#(R]{8^ց?U뮻N+sMʚ=nXwzflmt=='7n\GSOE#8B[ouuZIBʳ֭G$ �TTI'}$Ԫ(#P I{dB�@�@�@�@�@�@4W_M&} ߾y@ zqX]TM&uJ2jeh^!A$Ԫ�^{<W^9PZk3,={,w\{ ɩGDAIUee˖s9'Jh$lMt+\;-^|Gz<l293oҥԩ#gCP=ɴرc{i}[o%id=@�@�\p;խު+R<N 6L׏8z9So6*_~Ym ,ױc2WietW ^g.Q7Rٞy=z'`m=z7jѢEdJ{쑑M@ 7n1ch:쳣vut)ȁJ=OͶҥKZBۺˣ&_g_~5R VYY4 � @ ԫ'gն 6�伀ꫣ{t>:Kw6lOuvjUVf[r"߳$t@gIz{-C>#5dȐo͞=[SL̙3ym9 m}˫k&ֶLqzףlO&MRݺu}q7jjذa&v6rD`Dr@�Y3)$՟աi -{4~`tҜ95˼;T@�@�@�@�@�'#GJI}$½L �(℀XW_IkQ�T9#ѩtAJ' M F6Ç:' 'ꩧR6 :,8Q׍5̮**O?{ ) [IXŪ@&^~0d|0? PAbLFh"=裺 !^FN@ wktH:r/g@VEJ� Pyhy?M6DmvڼQF}^wa%[tw8A7S pPn/]y啵[FFUkEB|8t ҁV8 n%sqծ]PӦMT |>cFAs3V[m-:k-]qEAURE@T~?J7`ϞUWeu1) Uy=rR>(]!:ٲ ԯ_?Ma2/$k'|rA{」6uY';ci ,YD^xat՜S@y`rW_=me|ކӧ륗^ҋ/^xA ,P-;j]v*・ZaLB3LB|< @ k¹Փ_aqeXCnM:)`�J1@�@�@�@�@�Z'1Bz1WdRvR0@�l3G)e`BRzZeIGQM!2*_~)nF7uc=D${PƉ " ?((]wݥٳgG{<�s׮]e>�H$_2}'QB4;q$̕H9jeɁ �.->w~3wމt- @}U֭,`…+ꪫ3Sv pP:D-4i^yM0ASNo&'wC'8\I?TjF!XQ@ ;7$7?>DI6lU佀;8=ܣG}4 |裏@*ضtYgH˨& q-(Sߏ2ypZRH8E` @ 8ֳ>G}Ϗi ݧ[ժU :dM~y\ۭJ%oꫯjQ_/֚kZlMWfi"VfO"� @Eԑ|?EHpʄ�Y и(YP � � � � � � PkoLɤ)NbE3!�K?bU9S9F6ćȐ;'kvX6f{GtGj]w矯3<3oe {Q1<HNH /ANo^{n4Ϙ1Cto[4|mz٢ED <<ۓi98;H;1_v4d1" RsE@�@�GN 'w7c;ag'._|Zl>}DzݻG lk&%iU5?>_Vw,SLٳJ-َ8 imѪ?L842!�TQYf:3׿5Jxwh!r_n)UG�'p2-'8ޫvAu.*yͳd @�Y[G�]mG}'N35JD"[uj=~7ߜ$[9XuU){wE7aik?6ֺu> . tM+WnG|*h!K@�QIﲱd h(Yp_w1 � � � � �  v2V6S0@�!:t'D@_!v6$p2-'"V&UV6 87,|=SsE=؊<ԗ_~ Hޅ,Շ]C[ҥ<s9ꫯSOhpC|p P Ԧܹs5a„D�6;6x,"F�@�@ Yg^8L<YJs0Q<w >'m? Psᦰ7xh5kVDӉDs}[lN-SU.@X{l)@�r_[mU4_s5zCiĈ:cԭ[(iu&&6e˖EsOG׻vy'^mժmlv~QLB=@vP+^ᅲZv^@�|̞@ݓ6OuԩQ▱a`ȑ# N>Uy5ֈ@� ,YD3gԌ3~ӧ֓cpS^ԻwohѢ;%@B:T@ 7&V6ʀi:ٓ� � � � � �@O'=҃JC(*j� P/Hw-yf. Z2VzԜ@=HKJ!y)kM6gSN9EJ^ַ*6wF ̙)Zl>8/_.p|N .O>Q�Z/=q-"?7|(x'Q-RCz`s=.x A@�@�jFaÆn9_|!'76mZt~-sύvrʼncǎQ{ bA /Nwމ9@gWzr6L{Gxmm۶ă~(o/Gz �'l'|uEI}x y5jTԗ섋 P d_E(9$4ܜk_|1_0a-Z]:yA_S*9IUC>� *©ܭ%G�YQFEm?q9ۨOBg_3FN 6 J>N:E}CC@�V> }ϳfҲeTNk.J\xF}]oV�C_+Ū �dBIdLlm @B[W4k1&@�@�@�@�@�@�xd"S %Bi᧚ @lqb+1VFoP/*ZÇK'JjQ9*Giȑ;v.RnպBظ^|Q2|sB?<q:EL+HD!'T<vmeqpݻG7t(VM} @hA ={[n-'rbʾ}FuZ1`F�@�@ Z6.-9ʼney9@V[M:t9mQ #bg)ȸO?$`g9s<ϓ ��@�IDAT:ȥ 2D]v5o< :V1DŽ� PܫWh1bD^uFN`n#ܻwoiӦJ.]'=:ujw<iҤ|mѣ뮛 V  @f}hj  Ckvh"? W{%{(?>TƳV}_Fmf͚śb�䝀`gϞqi=Q}vD6,JL&Dԯ_?LP Pv; @ 4nLB<T9KZa/ � � � � � @ *:<A 7%;+N@�*-pK-ZTz|`Bz-i}@ X,UzIjeב4!XNu`ȒygD4N 믺[t/QGz1Sa 8`ΝI<}6m^{hGɷ<[nQP[ J݅5/8�3f̈; o=TϞ=yu֩G@�@�@0`v뭷Ο??:5ͷ~>(mڴi\A<oD뭷\ Ny!>*J5gΜhno/KmN2/jѷ/Gz @ 4A7|W^yE&L1chɒ%s~p B[_oԩS'Jv?)`_h<ԷjK �%ЧO2VAU"�Y(֎;FСCJ|^ʸ_I<O?ҥKu6l%rr-ndҞ\s͢m�6KgEkm#N>Z/ȾWڵv$o_ݺuj'O遥Z �+Фa!PH *\|I!1 � � � � � @ |A2w+ܠ'uB0XOyZa� S/$#c#,i"9@ճV`РdB+kHȨlQ0?_Be'9䓣zFo믣DZW]uU<Cՙg֭[[UOkmxsIӣAU4iƎŋGl2JhXL @"d/Ahu0/Dwߍ?UW]5 v'xbsM7'D�@�@�lp\_[i֬YuN2L_WYeI| A2~L @i.v eg'oh9@?}A|Q6'k 4(m7ye & u΋P @ xvQ?׫)S衇ҿ $s.]&Dt1!?c;hƌQo)GdrfѣGԻw1`Ñ|P? @�rK⋥pN8*H*�dIBYᾍ8ጓθ^:ۢ5jT{j*2c-dPUs̉:}<s^<m =oV:~ٶmFK~b))@Bg �)μ T#C@�@�@�@�@�@� 8O uR;هDZUS @\}Bi ԴzBܐ(gQτ@ 촓߻0NF뮛uţ@T=QKBN8Aro?q޽{;6+Ǐ 7ܠ~XxuSOz뭗kա,d9ur]'q5/x{y=v\ʌf=psVK(feH O?EСC49ܹsL � � PՋԴ Y[ ۄꫢD7/Rx)N~͚5y�M"y@,^8p¬fhˣ:ǁ"|N ԩ7>H-Zc}@gիWh>㢽xzף>iӦoעE}.$;v)\ l͜9S~ދZqUW|-+6l3�NL!Z͛" � n+~B^<$B�TnݺE2T~!~}7:^~Ǎ%}>V-[}+L eˢDX{u,{q߬]{'ׯ_}Nw+H G2"�@&wU 9-$w t(< � � � � � @@%rkY*/ VRV! �e̟/w4zt+i x{#Ld@RғOJuţ@T@.]tm/_ƌ46l<w֭ˑm;้'C=$<ӧ{ߍ@; [.t@m|AI&M ~C{@g<K!묳 WI{G^:OBde/=ځ =5lذ(P6!۷sh"WL9@�@�@ K??R}Q 8_8 ېɁ֟}(xS_|}`MK?v 8_dzq@d~4g];wn4=?XTP'oGXo-n< 4FShaB�/sv~[ntD[՜hp9N0.τ@u,]4s'Ϛ5k=jQ?r!Q-ck!'@cRh $*N}@�VpVhG' 0<A�@`5֐=4~Osqɓ{&!S9_sC:%@ K|OhM曢DY{СCW8 O[^|U!jU@�,XPȌ�qd+ � � � � � @m 1ۥ6moۏDZ}\? 7ܐL~ᄍXzʜmo`l;&w0ZP<O8-5vi]vo~!o3:0֡%ܹs~=w- oo߾\ .U݁R租~:T#A|=84e<KkV 8` "Oϙ3'͍> :7 n=sty&@�@�@&l=z(u €z_8\|'^:ۣ|}z9y@\KiӦ!ҏٯ n]z x/_b[,ۀd-?y'Q.owРAEmotB> |oB[e'@�CI<9u!G?pZ?nOML+`Mq,~T39tI |lٲhu_{I?#}UYfR Ă&V&A @ l'N;-O@� 8)VϞ=KҒ%K+u2uNVRqSXݟ9~OP XxuɳLW;r{];ǯc ulSXPTP"�d@ԢE nˆAhH 0!� � � � � �Jt K,)G+D@�jU`Ri%'aBNuU GBCs?Ρϙ-[n)ϗ]v&MzHNs嗫^zQbmF[lz͝^R'n2e&O{NoF4w:ꨣ4tPu,hn�޽{4T4H9`;8?| D"QGҁAK_~% FT@g?v4<{v2kiqyaDmCҷ!cu谖ڶ]7 dp\� � �@ƍNrۙ.5OǾr._g9T\viذat'ocs{BTLdo/,7܏-@+~uS\OkIFmT6ΏW[mlɫ*j>De@� 8Q~{GQ U'<<{l}nvqEKœ#I-]w(emq䳱Z.$Cq8A~*hp99V۶m{~^;D".Ԑj~&@� Z`iڻ4G�(A3;&'q_j\>ӧN+,}qok~y5ה@. ?~EpjE!-i{qءN:= Nd{t{\׮]WH|o5ֈ?RC@�jB \ |h q@m&\"� � � � � �d@# /nYa tuA %B�rK P3cͭrSc$B@iM|  8ĉ 0A�XAZ~́yh4rhՍ7XNB曫sԩ6`4d˛5kVpwմiꫯF<pcǎ߿>(x2!IϥM(Q|31@@uǁ/=OA81x<Uvǃ=9H/=9@ŗ ]pv6L;<%x9$q)$3]7yb߭B0[[8Vuf A/Jl@�@�_c;Ȼt&_;v_&>HSN-^{zk~ʚx^zTuX^keNmҏX|rqS>d nʏYFv<@f~?4?z@)N/\>x9|.oK?9B5>w}$Ԍ3tBa/uL:^: Kq?cD-pC}<j*Z'5`TM Ʉ� @! 촓+Ǥ.d � PU'vߐt'I!n((np_=jLj O}qj{V_}R~ϳ2!PO?Fe->xej[_'r{ކnݺ!]vWq, Pj~|@� )_ *q>�ppO< � � � � � @|E2رR˖##ʑH1@�,ji]adyA)^NC:&V ԑ'$V$ DuD USLf'5gΜDUm۶- v<HB:9:i!g\@6mD C^zEZ>@ 8uY^<@u7*O<pՒ`@vSxxq.k*ۜ|Ϳc./Dq<xxtXSDv|\<9 7P={, LqʺuK9th2鯿*$*}>49rԾ}N> � � �d\ql~&5{Dʩ N܉H%ӊ^_5^/yWz_wJ//Kz?EįyMn{q@A/[L㶉8y~)|  �+ tڵVs΍fkgΜYԷ~]|!^&gs|>K/yc|.ss?=~?.}-CD~''۷oQ"uYG͛7yqE@y \)-D�@z©N~jU0[E�(K n؂Nn':Rqjj{/BP�?Nku[JjRᶤNq{Siݷ>Vu/pIe.ז-[V~xveYS~E5?v9/} }Kmc/Y&}Gf~( �y)=,H.jW ܿn~2w@�@�@�@�@�@�R׿n˜`]ut 7Y@�@ (0AztfxM&Һ떿.k P%j| p]v%Oxᆱ{/?M8Q}Y7OAv=Kʌ_2](g6Ar`36 n:J4du9;t (*&ܩS?8Pv,^O=MHDݻ(^lA=pw_^AK<;u#W;si$68]@j/{<n]֠T=8>'(F;_R{ tq@J`<~ T'%?HÇ"� � �'0OSŏ@^x?vp/N~<:9kԒZ>- ?~\|_.^q~/},yVuq]Rm^ƳR4)xݒ3S\o$ݶq>;#R_#~<51!P\  Rv9 � <ɘ<w%\ϞXvV�8ɬg͚UԷg6[>9*~.ZyVc?),1O]||'=2W9Qjxz-)5AY~+ϾNTb#pIG �TA`PG@�jX /kѢE{ݗ/˸Ok~mY_}UQk;K$O[,Z%2"!xRcK}vxYRkZj[W&eYKkuqimb_w{ߵ~?nG2.x^*=NvSxm5cƈOh[/6ҟI}˥.� xR@�}!`B�,pB-e � � � � � @)^V]tt .?\a u)e@�*)ozܜ L8febKlpB!\J|p}Fsz!Sy�g+ $ Br".֊ڲe(m}jO7B 6?~犛yN�xPx< <uwKߔԁutEZtA%-=�كƋ4O}?yt<ډ =\mVˣ�\�Ћ/JlZa:9& � � Pq.'UvĸM1u8L 6P<Zq= <gď?{qP6euW!$n]w]#k9ebBnԡCm"�@u֕&9aD6N*kSntYgEVqP\6<6>WM]t^sH+9c׏zsK}:yu)Dzg༾.'!7O.@�B2DRNB �*1==OZ}Rhj?nDۯnVq?kz<nˊq_ZmP^KLJdԬ٬v>ۯ2n+sYy3/Sg>_/6м믗8cwMnQ߿lrEZr(' @4lO9T$BL -\ՠ � � � � � @ ̝+]|4fBpK#P2J@�@G|0 CF >oCEX4|R:<(UC<PM6\` P!n)ٮ헼JPxuaô>dkI= I-Rh_r5|vZ* � � @~ :@S{Nz1$ J@ʛfTY`w}*o � PS=M<YÇ׀pCʃ<oԹBTku:$PfK NբEv � Po{=o&VmO@�p)'J\|zqCV$СgUy#kvB>Zed|>jBr7Ê ґj!�d|]v!P(K](5 � � � � � @v ̟/zFҽJ]$}t$#G@�=A2$AGAmͲL<(;0j#� @'{K&͚%rK#-fI[nMMO>z衇JZ-'^U8QjD[Ekv Ҕ)|W@�@�@�@b*n2�'+-(3Tl@uoy ?:l& @ L T>\MeaäoTKj֑!s&k:X;� @9Fz*Y>� �UX\:=ރ'\^|1J\~YǤJƘ|si? $K@�T ,Q, L˖I΄� � � � � � P{_ 0 wޙ|DZ'(j핋=#�_$_VRÚp _%VhL $=ti&6@�(LoudK|"]}uTZlR?opX~{t{N?iԼj3~Br7JRd@�@�@�H`դ.J^cqd֋eQ!)J ̜)uTpզ �y&0avmjUVrt-ᆜ@V͓5"lv� U=zH}H\UŢ0 �wI;$]zi2-H ^C>{M,[ﳏH[n)~2vxy}OjqV �Y.Ф'&}w{Z0_@�@�@�@�@�@�dPX'Һv?N>97o@Y=� ~pIwRPgB P雷s@�3G:kM>d`f_k0U0^wu馛 K;kճjF%jj{R:u^㏗BI=4wԽ^GUs< � � �y.йرҽ&'+MVx @�r^z%8p>իW 'cΕRSNO}-Zd_( �)p 'Rf97 �"[RϞһJ/,vXּ_?駟Sse|uF.Pr}OZ1� @6 4n0P3KH(=zo2 � � � � � @M |INu҈J":@@;(6 PkM~E)ƒg'j`B�@�fϖ:*پ/}t9RFm.p衇Ag̘ӫZ'n]iٲdi\2C u:uL � � � PyfΔvUw_i?$H$OT� @6 i4hР޼J䓥{,~%TD`<y|u@�Z.$J @�mݷԦ4mԫWmjoNjRm'?J{_{-7|ͥS6jU*D�@&MxY@  � � � � � ,da'0?N?]Zm5@�Ykח8f_୷6zRqH_ �TԾW'۷DoիilL޽{Ӵ~J7v;\?[6cI ~;m/,㺼� � � � 8 7H"͟/u*!Kzg-"gO?I;Ve+|@�?~vyg.Un)H u(Cv.3j: �iI"͝M@�(&HH>ґGJ<#5kVl}گ9Z {MS%}9RZ`Uij �*иq2mr#O$ʧI]@�@�@�@�@�@ .LpڦtuYg% qQ6@ ~A*5RxK3DTdpsT~|@�|xUɌuKym$WJ><7:g裏 ׉'KFSJٴK+F:ufRtRңC@�@�@�@vK^(]vY2OWx3|� ^rN*1VF�@ чHk;:V=fLpݤ)SWY"@:NҢE:k �%paZkI]TX �Ԅ?JÆ%F+$߃/S+H˖KJ+AJ\<;,}}� XR@�hD*0EE <x}HrLJ!� � � � � @- fsϕH7)~'ɄZ$/@�=ZW餓 g\`|3 2NY`�Ay@�rLJӥ˯A9vXJ,nݺuu饗{رc6h#Ըvn{9S[!`$NƄ� � � � :I6Tai・9s*=>@yo-6!&@�rE੧n!СCuw@yry풃O3!@zI͛.k!� PHw%'oB9uE�@zܷ׾?M=tջz~okg#r^}ٳkjN 43!� @M F jzJhHZwy@�@�@�@�@�@2I矟Lu@3NK Vf|@� 4jt R&.[B3f$H!< {�'r@�xqmCN&-[&=4eJ2iJ+U>jfQ'O%ѣ&N gVZ[zdp]Β~9K L@�@�@�_o?4n4uԩtUv(>E!%0!� +O>Kv[$ӊOzD'_8P5+~%%Z-Z!� PG%l)Y@�L Gٚ3:S8u,5m*R>֮:%qp{^KSZy\ @ P++8j! � � � � � PKҥJ'(9?!f5M#� Pѣ%KSOX4yGZ{m?jY&0hҥYV0� @ 8q=HnAƓ&IKmWC`72N ѮPk@:y>y'e6ى@�@�@�@;$O�m"D`Eumx� @ Fw}wᄎ[ʅrUGZN!~y1ʅ@vRQJ� @ Bқof[( �%V[)[]oc[@iWZIzk+<Yu_VG\~{;bT P`@�jV ~9f@$ܕk � � � � � @<񢋒o㒉FZbbm@�Sg x֤IumRτ@N 8K'd)4 �7iXS'iΝI{LbJoֲZaG9眣Ç c9`<ԑ?^zdb-}MW!� � � P H\ ԨԷB=ij1{KΜL �9/h {hjc 6V| 6|RA{Ϗa�KҢEwx� �@8VϞ 8ůD�@� zҠAi[u'oi)JRV_:D*eE^F� VN> � NKE�ܰ\ǀ#� � � � � @ Zn(]xtK睗 5 �*pү* R Vm_7<; � ㏉hFI# `{Rn u\iZƍ-B>(+҃J?,=|2Y3!� � � @:vƏn-yݡWI?ym|@�]0l0|&IgKv ~ J;7N業 � Sl'pB{@�**X"qԥhկ;찊n&q9WP>]L5bDF6F@ HE �;=-X\/Ԯ� jן#� � � � � @n 4jT2KGLuY+J� _9V|Oיռ;xM=")AH)K� /]pp]N;J4{tMRv[nJVywQӦMSݺuճgO=cX}r`w!C]J8CU � � �dKN4ttA6$g]A)P L.ի'9Y �*Ci1cƐL؁jBzYow~ <E�͛D _@�'IZ"� @"p/tҕWJ眳DGG5XѦJk%RV0jq�t i~@ 'HB"�@P+ߎ,UMGr#� � � � � @M teDZ#G&i|tkti �< sHUlP뭷9sjj@�k쳥 6;h-[x`h�uV5WT;mڴ+]i/_^;6l(x^c&@�@�@�@FҵJ&%:X]hjbB ]ߖ:tVY%O �5+pk֑G}%V) J<#}4ddI)+2*0wԤI% �-p% 3%!VD�@@-K9*;å;#Ę^*FVC^|@)>0{1cOLy $G@�rUZz(w v @�@�@�@�@�Ȍ/HW\!mt9ҁJNuRӦ[A�@:͓<83%gB:fHnuMcl0@ZuU驧jf@� 餓$sbnGn߯vWE`Y"j8ѹ馛t 7hԨQq7dI骷Nkmv99Xk@�@�@�_woiTɁnZr?!go%9 �(po>c5\E̪2u옼#-]Uţ0ԪmѢV@�'JiXi)6E�@t}ңJH$teEmZ뮻nvؿKСwKG4 A$ԪD�@ H+d+& dPZdS � � � � � wN#N%o.u"-i,K@�Xƍ|q%Z 88Ƅ@ Gz\F�@w??<ٶ҅:%0re]~_G%pxb+ԣGQ;ҝwJ*mQu*� � � @ ԩ# .ԫW2a3!PKݻ!� P;wuo?p !ϔKIO?-z81VB Ε7jRA@�2&K"}}6ˆ@�_yUf vzj5'͟/͜W+1 V~_j� $C NHpWp #� � � � � @9KHGKmJg!4{t:aF�@ Dsϕ( pB.]kl4Hziٲ'{B�@ ӧKԱKuI}$5lx/]p"CN:i뭷ֵ^\WZY"$ -B+[D6iOQQZH"[NJ ,%|13f3sg:̽{߳<{RBrŤóG!� � � ewߕMVs= i"�Dȑ#ձcGu]0CʒH o-K3q+`ʔ0@�rEץ]$>S /"�İ`'g5hp1>Zg%>\?fFb߳yo!#bb[zb]Z~? @ 'fOC p FSK@�@�@�@�@�@ w vtLb̆' �D@K:EG}E |5&V,֭g%Vi- @ -sΑVFFE4uU=o,-QGwf=��@�IDATɓ'ؽ{wuA;vKў)HK7_[&!� � � @7Rn>?…9˓OyW|Rժ6Z� Çu]Ɛ߫~nC"\s<;ҫ#\G HtW � S# "xz혪:E�@ les>D]@Q˖-ٳ~[^˵?1j+;vju4n\GD�P@� VœjPҶm-@�@�@�@�@�@�Dسǟkl``K/ {l"f@�xXH3F[*P ^ZE;Q`~?hYgEcY ',M@�H ؤ.'o,M(}tUR~7O?Uխ[7+Rդ(^$={kM:UjիVBr bJcח~%e � � �(prP~`R . .g"j,</Q"gن� @ 6L_x'+g%i#ho߾q8@6nʔA� �R[ƼIk�� @b +k'͝+^=R.O$#;gN46 ͼ~馛k.�Q#@�@ gHL Z Pdj#� � � � � @"X _ʗn]更eA6"�Ļ}IuJ-[{Ki_֮v3Ah֌Z$@� It],oq痻djJm۶u}^Ӌ@:M4UX17Ѿ{tŋmۤjդy⯍@�@�@�Hؘ?FW f$jB&`� @4 2D]tQ=3DC;J/(=4xp\4F -M-8B�@ /~t\P@�HDO>9駟~Ҙ1ct&ߜPՓ֯l~#)5l(77J,@ g!�ĭGJ[mh1%`GK'}~#� � � � � @b+ OViS?/K%D�>o+-W_A8#uCjxMH �D}ĕ+KmH+-Z/L|)kj*5s(ÇWLK)ģ̙N:]v;gϞԻRK#Fe3i � � �*o$u*TreDBQ"@@(9T@@v{LO>$"a6%?rd3';b@`v?G1PY� @ .,ℨ[( UB�@ nY8Q4I1ӀTlYooq͚ҡʍN#]~{wDz'D^@?�@ A8Bں5AO2{?Z=;@�@�@�@�@�[i &U �Fo^yErkŒ@�~RM !P䓥Es$G o, Mž6-oʣ@�2n=?~ԱdB?>֭SƍUE 3f *Y<'P}8pF!CN% N}̭@ !N#@�@�@�u%ŋT|пS@T ~tQU-*� M7ݤ^zO@ir}I;K&M@lפLh@�@ N9Ezmi(b@�<4tryi[Lz7` [9D:<iipY?>zJtgw�"O �-pҖ-m@|/|P@�@�@�@�@�}ޒ*Uv4֬!>)\@�-DRޑe'Ug$Rik Xpu)S⽥@ v v.5lk!gv7o7QGI&H"iV2ꫵdm۶MUVԩS3;~\01O?P#!� � � @x,ҢE~+'N O˖V-6K-@�S`РA[SOGFFQtڵf̈QrY`&ҥs G�@ 5yFziڴ8o,C�@?jl<k˖i.ϟ_7xc;$z9sYlj қoJv}vĈ, 1jE@�]#ޓ=Cŋ󞌞3BM@�@�@�@�@�@ HkH?M­SGZZ:T:pD^ �D-!}tS/j|# $`OV@�XغUzIɂ~?H*rJؾ}6m}cl[=OB *Uŋ}0j޼yﵕb0Ob'K\"Yp; � � �G添k\/غn]x'pM^GGw= @ <޽z=zoCe/,]vԪpaU K7-l.*K- � $`JJ/4@ !&NS[)mݻwkյkW~i@[ח֮֯OFgmJ#rY<@ "k� �8Hi˖HL �ɴT؆� � � � � �,` ޏ-y?PX xXn3uG�@ (7aI>-+AK+VrZ)D"K<@�Dش, R՟~-̮]tarʔ)<@EՈ#\0WsϩQFh+%@"iLi ⋥m4@�@�@�<QO>V8C{vf</@� ҲTwThpK+]V-YR*P 2S* �&0tTd'%ZG{@�/ZzJF6oެ;#]jyI Is$TX Vs1H [� �8¥}"Q:e"@j{Onݚz+@�@�@�@�@�@�@ZQQ_l&ߞzj쵇#� U0"cŊehG {K;vHʞGE@J32%zH@�G`:[O:$7lOHGy;[v N|AyLJ~v+0 xZp~gUZUf cڲeԩ $m믿4l0@ܹƎE/ 8P^{mAi㏻v/ /={$<f׮;W=.X՚={+E.X-� � � @8,_) ͛×gij _~� @>nU^]K/]lI]N~L{IժIKk]<w֔t@`&t� �98ixXP-̙'G#�DR3_ծ];+W./$Ɣ)"'!l<ӽ6n?p>Ek>뮻NK,9(X>zԣGgy�&@@h;#@ a,x]ܶ-aLCj#@T *� � � � � � G\{rI_-!/� @~?$!W|ekU)'5NF<@� dT\)'xpUm2ߥK7x@} 3<uO(O?ƑbVJ*Zl.5lP<L'?VZ9ݻWmڴ^w}+uM7_2 :ϭn55jhҥ=z|A-BpvO_ڰ{=%L?zoD%[[?'!� � � N…GJn?^=%Uӯ]Ӛ5ß79"� @߾}eyj5h&1iҤM̮O{`?aA&LN9Ezn]y.l942eBۗ@�@ 4[7s?- 8B�@ WjV:piN6{IK,%*ד]:lpaÆk ~ȷz˛'`)1}I.&MK @ G[ �"`lo� wnN0 @�@�@�@�@�9 eB+Wڿ@ZFI*\s0 �9xmii@A9ʊȒ:hd,Ą@Ӧr"XcL@QI@�, x4.0t…kI}'vtag7c ծ] 4n8=c{q^@nݺac\s=^zyuqyy-[ֻ״Ο|IUVM\[o{<YvLp*:OEf: ^x 7)|e z7sR˖r*){lb_}y\wu:sY.U@}^d� � �$ dU( *;oY;ދ @V;+ �i <3z衇ܸkV ҡukugW^ILev}" xbŤɓ%[̂jm~ >υߔ.@@q �tҚ5R6ݡ> �D-HWKK%Jd\g}4T*Uv?xhc-s̍$Xwp :fE~q[$3gϞ d[` eupԷnJ~K,@ Z-gz �$D�߁DZޓY|@�@�@�@�@�Ȋ-r=,<嗒ETH �$_I+]tzihgH-Mnḽ2@ ϗ7lXF#\)u$x_,~'jJ-҈#F6A7Z 'U^ s Ӭ&ۤp"ETR:㽉߯=Xh"){n)'ퟴC;>pEUUw߂lYJ}mZ$_S9J=zpf])Ẑ@�@�@�m+ ,]{d1ԑl|X^%玴:lr'rE�@ O>GyD/n6i/f\馛\tDVJ}-]wԸq>o ޥKG� @ T$M"-\(Y_"AL.@ 1 FN?=6pX-xֽ6dc۷o nh[c/6wnrܻ?~OsU^=/kS裏z+v+5.]2ڋ@ #Y8e#� (۶%mG z,E!'!� � � � � � 0~_H]&%uV,Ԝ:"� {q.w+HOZɰ=lBMvsH �d[`4g9s-}(>Mo.۴iSk;W5c/4W)"S]hÆ С[|ح>,wmɭUZ5*ݻWvСCkɷ/]BzeAX\:̭kzꩺ[rpmk(בgoFoYC b-Zx'g_7o /?\?뮻3Hځ;]puDګW/=C9n P+W{mjذa<9{N<{,X@={&'VYn ,٭… {y^-{]:<&ڂϓ&Ir14hPg}YvΝ;Ureu]e˖vf[۞~餌~7H0o1O{?SnѽIg>I|Ľ"TJЯ7Ku sf͚j^/{/3&ik֭ߡ-[I&^^+5I;p@�@�@�t:žvB.؅\}uA`fGEqC8S� @O<Wʰ]vMϏ:(]?k^l'mת{ĉ^3_2ecӺTwBK|Om\c놙}Grf$}@�@rƔAp7-% �/`Nl<K.I}! ]4c9ƍguZ]1^xlc믺曽q28O [oCpj=6<\cʭEhlvkV.]~gl|"mYߠɿUT)oi djm?ʩ*/_muMqP61'O6߶"eN/~4bT\=6}َ�ȾȴR@�9`@-7v�Q prW"T@�@�@�@�@�@CEiVnQ^i E: O!�${_i, Q%@@:T&lrr!sD�kٓ-aO\)oy<xZ_[لݫJW^yg[Ydf;v6_vwM^ nG&[p\z em{饗zۺ8 c,0.ҤMY61;ԶmۼmӲdF[ѣ&U5\I"Wp z7Oy?|/Vk֬Y}vND8o{E)mMIĭ`Z+K{A{&B Yf>~[|^<-\"EcWX'@bx]۟@ɞJq?eq ee{?X{jʫ=ܹ,UtEyAM·ed3z^ElA{/>O}LhР\_nl?%XаqiI$@�@�@�BpwP?u!U$=4#އg\?\- �[-k"ʂaYڵAV..�X{7n]ߛ;vhذa^Dp;Y8?ڵlOy.r2>3<]6%VZ2lC�@ |6ǂj͜pÉH �Č-r}SRÆc]}!ݺuӦMo߾\tr˲d=S)Eh租~u뺺=r-m&LƢf6Vڗ<իn۾}W׵u]wn)ozc}m.@\6F1&U&Q]m>}qys�`VWm)1ӻSGz!rcۋ 17h� �(V,:4BSl sLGAx@cyp;O>MG�@�@�@�@�SIs  Z><O0@�^n@f@`߾*Cm@`8lMB?+ҥ � =[o*}ZmY?=Ѐ zY pA.W^I͛7&˺y-_<Dڤ\P.oW_}yy_p-%Kxn2nME:^ݻwO#~Ǔ'O n.V>-ZHߦM@.].R6DNai̙9޵k׃\4\G_^g\8X*y.pQGᅮgt_?2%\8ׯ/%._|-m^_NNÆ \୤ͥK(Q"q(n/7|3)?Gno[D9&`6yǹEEM.Vdɒ-[xΝӧw?5|E�W\1]`BVJ!� � ֎k7֝Yz}Y }ŋjUǰ' �x衇7x#O:餤laѢE^￟Gw?}^#p@˖!,s< ac;|q$nHB[#@6M8̆FnO4&"�ą 8@`/{ -[60m4*858;r16Nݹsg~5XPZ4a?~߾[;q;v76:R߽.Vp?)R$i[Fu1OI;{/x;:ywncI[[?٬Y9h@�@ BG!m)R~L@�@�@�@�@�)S5K.;NZL7N:( @�@ ϗ^~Y(8#Wի6Wxmʼn#PTdQH �d$RKիK_-+{nFG|nڵk;O YcJnB^ ؓb?{pYgoiȑ#&�Muu?:S&7{Im֭|l?-?hΜ9>VWKF { m_rH}s '^ %7 Z.~mosncw7{s< ju&׫vںճgOﵖ Qޡ?( vuJ.0pR=?ׯ\p*رnVURE:+Zhǥx5Ƚ'Kw}Wn½z>[n]Y~f>'I!ne{{$IzoQ.[}뭷-#FP˖-<1{NTjU}ᇺ <O75 @�@�@�*%}V5KZV: ]f~__@r6P!ē �HP߾}isieץ:A0t~W^y%IvwbAQgn[zXҎ ]<Y1C:)CnUp%l/\hF2er( @�@�'+iLKRƬuˋ@ ^4InTdMr[<^߮.(,cQCgCmҤ=P+W טrkyzcQC+\NѼy'_rv&umn(c}m߽ ó>;iofu-T\L TFκudc{=7ۛ1<ߺy�ʕO$ iFPkA �$kom lGj)7`'zDM@�@�@�@�@�@ qMRrK &*' -G�@ -?l[ni6+7Rr!dب+D�{}Lt]RfrrH*e>'+CpMF:th+Xw&[Z$楮-j*;w}>-Nd,cK(#:ǂ�YЬ2,V{W]q5k}ѤY&=g'EM3f$_~%[7YdϏ<H5LVp6kY-^l1{ K'gMN\971^ >cZjyu{I^$X~gynJ goذaV 8 x=HWvԩS'jժ,NR(kɖ � � �d*Pb亐Z=;Pu#~"� ]sϹ]@fǎޢ,Jgԭ[7}^y)kO$"`lرԙy.Rg,@@}x@�VM3G'57J!O@�r.`׸\\x/xQݺ痼/m[$ XPy7j1OzcQC+kyQG>X#Kƣ'M|+-ҔKrJݼՂpe߲eK mT~X~\.rŋDXZ>� =b6D@{=h9#@�@�@�@�@�cvm7MH|5j@�PlC~:Z.҈;+)}ƸS, )%x{5?H/,tR}1xϛ7/)\`WU]``!87iL)RD۷oݤ,Us+ԨQ dvB yAB c{;< oޫ-lh Z,-Y䠪"mڴl>[\(;_`mҤIYnvM_vmc٣͛73L=+=X}z饗ԵkW5/\/{Sg!Y|7[qÆ ;Z/{_-VI;8Qҥf}l}b X=k{ҭ>ޱcG 6vt^zRӺw^/�;#kuWxoMZ @�@�@�;J=$]4 !] = eI �䆀0@o:tnLj].+V3O`/}W:_X:y| emwЛ� �TI?_ڽ[n|ʙ|@�v-sn|0<X n!)8TƢQ8Ɣ@zcQ;^=?f…=)S'O;wTѢEC>X4>d2?֭[gꫯ&`򪫮:'=o.Hn,xH Ԋ@@�WZ{iy P+ 5B�@�@�@�@�@ f̐ԑ7J->HnQDR �dM`,7_[;kDz7Z+3GB :5eI �l(eɻw #'=9Nj3gw3E,ձ4x_qT{t-p+>Z  ett-8QV4m4/PW3<ws= Gk:SZ|yR>Yn]6DZl.]z^�Pjn+<n}L_|uW7tkCMwu,Ϟ={L2 '-wuK6 ?^ gKKz65}E=E߿M6֭W gҭꝛvyٳgOq0ɬ|G�@�@�@,iL5HH|_ <N@/H �M;kN۷0:]i 0#Uwѝ 3(s<w,p/T.~ � .7 e6ߐ@�mLli*y_;H>5ǔ[jŬ.cח./^>Z[lѣ삁6oޜ45+W8դ2k-e6w;~v2Bg׮]ugxc9c+aܘ̃> ;ȝB@�|jJ@ z=炚 � � � � � HxIzRÆRѢ…Ҕ)R͚@[@�Ⱥo[նm֏)@@pjW4 ΓNZR7@�G[z] (|QG-Z>ZvF&M@y*Y~ez'OXP`k)xkmn[\[xq;oW^yŵ –i% UD /ұ cO5;(y0w}7)H\"۽�C݌nݺ:UF o_~ņ@Q2e_;}]ȕ`LzӧO1?,MO+V>}{& isNC#Ge%by\8/)E<-�\ozH6ߒm{D_re{8-$`z3w_}^J^c rCh0P$ϛ � � �TŊ֪UR.mI/}y\y`J<Z@*XPo/<  �A?_~[7x*\ZԲ}m!ݻf [ڶmwk+w:t^zIrܵey.2*`Fʔ uoC�@�p x>yasW97.'% �Y>]nLaCIbƜ.]ڻz,jZcmmK><qC1<\PZ='7܍l.uqzo:sq5u.yy8\D>L{9/hWFu|.^X˖-[{1vZ?-񵔝1ށ*WNzEujk@ n @�"$p-@*bL`Р@c8 ʦmn;uj63Hx}'艧 � � � � �95˿Vh'6 qd� @B <p PX n]B5F޽@QX9@.<d Pl.dL �Q/re p@I'/ڕ޲eK/�7"EZlpAj.NRoMu8.hQN FL(0u%/z/X_+kǟx≁O?4&$@Bʗ/2dHRt=%mڿRJ_5iqvrp~m �YaiӦ(`yXڽ{wM\osAnvM:Wl Y&PZ5X`!7bܹJ*`{Z^%{cKs>зo_点ޒ _~TkޏV/{ӨQ׸5kz7?`}$ L.Y >n .̫ٺ�K\ ۴i:6kOoMy� \q ~cBA0l@�@�@ _|Ԯ(yg }v߻@sß/9"�$]S曽kZcǎ _;VZ^_a]k8s-SY4h o,ЧOܵy.?^]pB;o5M@ ȹa`l(ӓh@ srWf.|'ezL_~R;iEhTX+fc]1YFcQ3+{PEmp<ݻ7'Hn״bŊ6ll\ غukzU-ӻևLvIyduuҁqÂyɎ<@g>:3 q#!� @$zL/D错W/$%[^H9OŅ IFI.4)D^!B � � � � � ̝+)͜)]tNx@�@ ++VH5jHKݖ# |TdTz'GM`Ro-\9jG}@�rC`2gq㤊Z*X07JK={Ժuk-\P?֭+|*N[,P.Ѝ\@,[=Z  xfo.7؍CvKn@,Y20[޽{&)_~Os<O=T/^<x"vv^zH p匿傲d .<Hu]'m޼YkVR2*Kߎ{U_ϑGuAe!VܱcJ(Yڵk=Pٹ)\pɴ@ \yK3?τ8<4 @�@ loH< U?B |_Y`VOs8|z$#� p;tM6l{={ׁoǹށQ)`kKmU\~FWiSlY;IW5"k@:,iРO :]H^(-7)x@�Fkz5kt2cM"Y+ۭ҂1'pB3J_kemuպ됓۬M3ΐڷ A }7l߽WYߏg &lA�@ ^}UZ6ϊp(,裥0 0^ xi2 � � � � @ڤ^ 3$ҫT^ @�ZZ,P[@DL7nѪP8y"`..-sbJ! �35mt-f gp[CnO]P], 8:u:uM*Ve_x$Y0',(ߙgIh�@�@�@űKo)5i/ⷓHGH#FHW]GR  @ u#?]t-[fwy,Y6S* "M(5nSU *P?Ү &lA�{-xteRҸqRiV@�-0}jQW:5i$h" O;oԟQ0ɆȑRǎ~$ $ P+"wg@�@� *۶-;2B� T[܈� � � � � �K`Bj:Ҟ=̙%L> �&п@xBBfL{&Rɒʚ{DzE] @ L,Y_VΝKm.v]cǎ 5%5mT+V駟wuԻwo߿?.hx@ZUZo<.E#@�@�@�aҜ9YgIO>)ÍwTn U"�D]Gҥ[ w>,ӲFmڴIJ��@�IDATQ ڵڴ <@4?7*S&jB@�@ (Plt[3"� {%ptY e5zTR%5o<*9s̗T97&M$eKCKdV�9 V9@�X@s"@8NMB�@�@�@�@�@ -Pڵg̐fϖ4HlZ� @NVz}TX1'9q,;—9! ]X-uD�ETԢtҼy~R}饗aÆ":sBy$PtiMvTbŢ~=dI`Z-_O |~>SOeɕ@�@�@�Ȯ7|/tʧʧ]C|O;o-)H3q �HLs=zƍ {HƏVFm8$+<]cuS:|Kkn|yb__!l,ˡ$@�2'RnҵJ7ρjR@�8_c³6lYSޟ^Bm_fMgԹs۷o_>n|宭z!@8 33B�@� X@{;Ev,{#@~SrD�@�@�@�@�@ ,}LcEM"� ~cӡt?rD ʮŲ@G ܪU,#�#%#}teСRժtYgދ\%b#l3)nlw߭ /Pڵ?U۶muUWEE;O?,գL2k^ 褁d,e;; � � �y!PbE|a.]z-=?v7Xd:vv?s2w\0pJ~ �$`v>a5i$ͷ7tSOrʥ$ ڱZ͛Ν~z≢LT zh Mz! @�P[^= !-Z$TBV*!�Ĵyei0c֔W#GA wٲeluiAo㏧KBl`l9Iۯ\ԾTZNrXȪBB�@�H X@-K۷P˗7 Vd)@�@�@�@�@�Xpx ?H:<i4'!� @xzV$GB Z,Vo-$#l۹JSP+N7MD�8صK2ğعat5[w/*(R8Yd,PE[b.tI'I;϶iF]wFP~[SZ^H+ � � � T^aX~Xkɒ.ZIwz1+z`={>:tHD@�\`Z^{Ə?TFrTNÆ st<GV .̙ M{w#͟_]Sl(7[$@�b֭*Uv?/pCW!�Ĕ޽R׮҅J;f6~H(P{nYjR:QR.r㡥o/- H g!� @ ~߲mⵅ 8Hi˖ت3E�@�@�@�@�@� XP@Xy܂…ӊYt@�xX@[zX?|iO~A:Ī@Ӧ~ X?F�U௿}-v~6ډ'paW^ĉUxq__4h *] z>(@@�@�@�S.H-رc_iӦ3]aWqzժ%-[ @.v֍@� {ݪ\s&LI&8Ṽ�OZj;wѭt[wA@_eDK �'`qJ͓nMMjVf; � <fܸЏa !ڵޜ+|^Z�$;j5%!� p@&jD""p֭)B@�@�@�@�@�@ >\jZ:\iy Edʓ@�@ |) Ԥt˗u %yĞ}rW^ݩ1 cI' =ԩw|@["f]K.ѷ~?_)>{އbŊG(_ţݞ!� � � Hmڴї_~!C^w+n<ܽQu.mߞHֹs% "P|O �+`j/G}$ IB (PR%w iJڦ_ ~qRr@6m9D5H �  I}H3fHKH+KSF! @ ؼ'yw<Knʕ̉d- =y?mĂ@X$uD�@ ^gvŪ�bQo@�@�@�@�@�N/.U~YC@yWJB�@ Qڷ퓆OVX{KGN(OrA�rK_N<QzeMN/JέR%PڽQ,XzJxgy|pegXP;p<+@�@�@�@ 4SNZf={FOo<@w -J[([7؊� @z{Qv4eM<KjޮlO`O>]KՅ_%0M*U' � }9I͚I]Ϙ!ڱ @J~qrFSnQ ٳx,㏗MD@B�@ 1哶oOJ]Z~ � � � � �K+*UkqeˤK/\(@�xS5K;V*Y2[KbQ%x}⹣9(P@jP"V- Mrw'~IzQ? bnI {?/_PΝu]w)^s~ gkknݞ\(,@�@�@�@  1|=UϺ0NW/W~ xg#�9`ZW^yOeLu ٻoI#PlYTk*T8J_}U}n[]ٙMR2yX E!� @<Rzmyg-͘@ \7't@]~"EX~}#iW$K/I&H} Ā�b$QE@�-J@=ô,kg"� � � � � _-7!Y:y X@?U/@�HdlD,AۣYjzj4א!MJgExr@�, |ԡt'A.?n=K3D9z[um۶@5nXׯ:fT j.j׿"h@�@�@�@ j+G}T?n:ლ;tqƛn> ḙX!m*B$@�Bؽ{.2X M6Mu 0Ip%KE?U*jzjh\\6ظQ*]:Up@�ȡK6s .]f �q.ືԽԦԤI76FWclYT8ʫyRvQ~^\P+.N#@�e'V,?_P:^vv@�@�@�@�@�ȺUUWI+K|#|?x3_ � _H\#]t㍡Ǟ䵀:. ec, @ K[}Y@Қ5R׮rFn�Tcǎ… ?ѣW@.tYթӋZx=#{@�@�@�ȡQG~iԱc~l|>='fIG-׏  �9նm[7c_;]kQ~XΝ5k޼Դ\- hmt l$)]u6 � uR+k'O*Ug='@�H矗֯ HG;+V9_XaK{J'+@@=w@ N''fąԲuo@�@�@�@�@�H< վtY_K#te@@�^_-ե|JD +ʊƣqߝN&@ 6fΔ5jՒ6lƍj 6PKȺ@5|ruݤl7+;Ґ!׻C1PY� � � �qА!�+u%qjҤ4_)#í_ /`ڴi!;,PH0[>9-yp�ظQ*]:\ �DZ OʕRfݿR#]+G�@ZMziOd(;@z٩J}6d.PcR~Һu }jeߎ#@��H&EZaa$@�@�@�@�@�bR`G3h/>|,f'J#�Ĥ_>@*T(&AD ֮N;-AL3HGiSZEIϗ.HڷOnQ=i"U+r*;L\d>S&L:UnFk߾i6@�@�@�V2{nѽ:ᄆ^?e;R$Ε <P. @ڵ]k O>Q͚5c3  .3uגpczZe˱QXK6Ie$BKi# �#po}ޔ^: woiϞ1 �mYgIƥyZyyy$ =ftRJr#_X+=Vjι �q*@@8=4+&J#� � � � � #o:v/[&%}Ԯ@�HG~b^+'KkiV"/a?ԊhL駟"]G�__}sK/J[TOSao?-D�.bק7o֭[SNf+Dqϐ^(=`W!� � � @UVҥS4}l@N_KGVᄏ*c˥[~Dl?mF�H)ЧO[.FhΝߥZdf̘իȪ@\pajܸ&Nlmg5 G G6&ߥҥs #� @ X�?,hʓOJ+Fie @Y#rڶU뇐V-)+Œi6~E=e{?W`Je#S\\{=5 @~SrD�@ K;#Ÿl`* @�@�@�@�@�[*U/zK�W]%gDM||Z� 1-[ڵARV\{?h|D餓R>#QZzj4֎:!wuHEJӦ]�$kۄc|yA{@ -ĔaÆi„ :u>l}ib[$o=0sf*�@�@�@�bHQzZ~^~yލkoʬ{dG??kTt晱Z� 3_ܪ=AׯO%\. 'nj0 0 ˗ύfиqu-i_;OoT( R @�W ѣrdc4Z֮.@�Pu=x/Ful;)+TԡҶm~;]s1ٽ#_ح;Bb%`=7 @ A 'fƄ@bR inL4J"� � � � � A6 A -2jߞ@Za@�0 -Խ;2M?^noF۹@4 X@"Ee ^(!ˢ@ yzExrT7oK+'E�PZl;O7M7ݤ;C?34ʽp$ EB�@�@�@�K}r= _~U ~l>[`wg,x6@�  hÆ ^P- chB_g̘Uf/sB ɓVǎc4xE܉任MϞɷr lQ;0) H  "�AT%�1+(J0!PT0$@0AA$% Mٙ =3zzz}=-mAD@D@DUp&O(Rv@hC*" " K"E?zӦ@Ά / ԩ{qd_h n9=4x>so@$3#!" " 1% AE JV" " " " " " " " " " " ۶WvM1}:0ld p�TD@D@D@bK�A~0A4 v7#c m]GZP�ڴIh#y3n]o3/O�L4q@۶?Yje^WD@D #FǨQp:ujklW`Ŋ&╙燇i0sf<}Ă@qձlЮpUKMw䊩X<~RHoLg7tPS(մiSEY~>x-|u> ;W4n=0@O_R툀@V0SOC�5kŒ�'}" " #A1D?a*Ur]=|Ww@X_ j7uލ> o_z" VĈ@R1ڸ6+"keHP+H�ckxwf puQGp0(![&&vbZ �v QV4m@ 0#cm_�ofJ" "o4k^ϞG�O? ̌ITVD@ o&lРZlݻcΝvG}$)0Sƌg}J9.OD@D@D@D@D@D@D ⋁F۶aݻۤHr}x&A_K }_9,Zׯ7"0rH\8j)&S'1ڰ!Y�0p`Lw_~_OED@D@D }Pۀ+[n Ǎ˙95D@D@A`@|hPhqR5,^^y%{AVE^ƍڦ#" PP D@D@D@K@Z寽@0 jg]�&l3xzeZZO? <:{ǿ@ ,]d0+ `ש㖪!@qjՒjĒ@�cm[D@Ӣ]W ɂ˳I$leP$ǁ g!ѣG{^z>2n?3@x75PϑsFqڔ@ 4j{晀8Əs}(<E?T+}T$T;:-͛7oEb׮]i&Wh: l@qSwi~`Θ^O#UFCD\9_?`"裁7f̴Z@Q/AD@D~)f=95bG#�zrR#cGn~uE@r" A{1 j6/$ A\" " " " " " " " " " "g{ ̞/f0M7&M^|1 ե#" " "o*uݽgpkh{nԲ^{/_6~,Q+`D Gx3�K_Os" "_:t0 jvڸ(sd<?m&r68AED@D@D@D@D@D@D O, ;vzkp~ ZNA-B7u Q(ڼl֬~E |yỷix.sU@~0·*" " " MV-fM&M..̅s%〇 >ƍ� w.^w+\8%K^2�ګDJ$I_ʖnͺ\KD@D@D@D@D@D@D@D@D@D@D@Odt>}RyX &(P&0n0p |y )q"oZ " " Jo?ws`-[OI>? 0g&zuOD$yJ޵O'O_~ m{l`(u@;HD 5T2N:$0AgpN~b]v=O>(4"" " " " " " "z; xm\9"[ wHw/0cвe*AD@D 5vp۠~ʕhѢ6on5-<8@P:o\0;m$ пb4 и10m0~<0P~rٲ*{N䃢ZݺCd\3" " ># JÁn %�˛o߳ó7i~ms_k}p$@t@8&SH<2em@D@D@D@D@D@D@D@D@D@D@D 3&R`dcSO $4q6uID@D@D s`[8f۶J5�5UWH$ #r ;*" "i3.uv֭ŋ d.8�Zd 'Ť_|z /  aE}-" " " " " " "}{`?]tQ]_}H" " !0ۗ EŹk l/E wF9Gsݺ@LFE + jee%" " " g`\P@ `Ĉ3F`РID@D(UP4j')cS }4p@ۚ%.|~ ~{ 9OTD@C@Zᨭ@ *yބ~("EԊ"LmJD@D@D@D@D@D@D@D@D@D@D+�ƌ Php J@%ڌĉ�E 3PbE੧?XCE_VGZ:/jMb (_ED@ҙ/">3xt׊]IbYW#{-Ŷ(59*:m[Mԗ" " " " " " " IHBZ?x}�w =ܙig5kUzjVD@D l߾}52?Ba)t?l׭H':)_]Q;;>}_Gߊ@$;QR$kjt#gK/,�x7/ -�EFD@D OQ)S`6=<j ޿LYDkti;#Z[vD HP+Ͽ^D@D$僓&<0"ݷo7*" " " " " " " " " " "7\{-0bD 5n|3oЯD@D@D@O}]w^H`IFȑ0IA{ʕ ^SE(E8'Ц >@ED@ґBx޽HH,"(< ~m2SP(վ}{_>5u.$ÆEwښ@ to_]uJS~DA3x@x{,XШUPO?46nh'6>srJ Na(rs?M&U*믁sC}e"9M�%厜t$@1צMa| O"" "#KCq&V>hGTSb.+qYVӂ(#S1#QM!`*" " " $ AD׾E + jeeݒY^Ŗ-u[E߉@t9/׫*" " " '{E?o )ձ#Y%+͉P$Z5K-D8,߀KtK?Me'ŖÞ=o("ڵkguٲe-B&S"Bѭ;wm۶&YM6j\{-0p`f[B>7$'`sha-}O޽<?-[q@O>`q"Z @ժU1d,~=(Q"U\nX6U$@e}/g�_1nTo@zPV8;=�O>]yDX8wʗspB"[}GJA{1Yez!P4p @~ 7+HP+-8e;$�訪"" " " " " " " " " " "x&Vˊ+KuD@D@D@bItg1@LBCG6l�^8x~"I`*zlZ-$Ppaĉ܋-" #g\i1XNbZL+j-:f߀#Fu[d3h.[ٷ~{&[`Gqڕ@L PD sx/Ϝ7>hd6-xbSD@D la)9;駟Э[7smO" @-a]Xfa-92}*"�zL_b@D@D@D@2�")<�ɚZGD@D !Oy1͞ }t&;Com R'cfߨ"" " "HNP? [D־}]@njș&Ogǎ?4Y vó={{n[s;3jNop7>c< 2רN n~f % N … g)bv<NLg%Leqch֜/UT+><|o)af&Řc u| *" " "+{}ݻ7K?}}}p[gn=>ro_>˽}<yr-[WӶ^}ѱcQӉ@ X: C8,`$gϨoZAσ| 5yC&}u>T>U;q_C|se=׆l릢Ef2g>z_ٽm+֭c͚ϺU&Yx&s*T�?|0NċGJ* . b̙&+E6 rwp}Fpp+\3`N 3'\jr +~ա?S7}7'l:hv6jօ 'Ʊ6~{yX$-+Kcժ Ɨ"u�)>?%mΧ5&ܼ#Mu<?8[P}߹ke>auhpP;gη-s9f;ц>nn\ǣ"" y!@[2m;yڙP5{wxwow[{><ۡjwovvew?vy޳Njѕ+W52 |r{uvcw<& w2%ҥ=z�O= Hl̳�0`�Y[u֙km~zزe nj'߽Wrm ߳3e˖9U\$jޯnl lh|@H(9?'М @^9{>z한~vSQCM=zǨk 5I.2q-л}fn>swag 얻gj})kgd|2""=k6l`nQ=9O1xw/s-ּW$j昝cB26Ǎf74 7V4cíO*#65k v_~oh)Ui@#no587Dۥٸ܃NG;{Bb[aܴqUs_%Eڻ$/ j%SE@D@RRD0R�X,ߢ� t"@g͛7g!;m3dNt۷ot. W0nS/ʗ/X\MbCrlS('jCuy$罓s' :s2�HNtW~ltA֙t\J8|p,Qo ,Iq�j(ի8DKE@D@D` �.8sMb@TBLf{|*,|>pC<@$~>3X.=~:Ϭs~ g6S̛7W_ tR2a|n3�]psg}[f*" W:)j�z 0d3] >;ѮD{3Y7ٜwۡ-&R~v6'>r|FsϪ-"|6uϧnϫ.8uy\nKl\Lxk<˚3[[gN3SM33,6Mwn7ϸ;og g=Ɠ&wɴ�op]jy7=4߯bmipΩpPwY3lkp#B{m!}>Oxٯ5y?q{_>Ėߓ7A*mED{)<*" " " " " " ":{kg';;C#xH PlQc;m 8ꨉWMvڴ9~v.ykvuo!p6 F<LVL<Wa&k7j. ;flgN^=29x5""_8_:ڣ/'ϼ6q?6Pλ{vf2ם{w{v!{kޣ5<?o<wqp}LfΜϞdNz~ރy_ڇ}ى�Kl>UD '&|}w<K=^x_rgFt/^%Ke֏mUT׳f͚|#o8%>S{C?^j2$ǢvS5[Oub HP+wH'lt__`b7o~;Ryf-sUvLJ͜[sF\$cL7FuKoƦ98ҍ]߹1_sϲnug7r7:6nލC-߹zִEҖ}r2xGRx<'^2^閻6\F*"L3h";^ݍ9' #7:C86#Yӎ{{_쬍i}gk6(}xJl|^M .4U˽׃mڔy91} 8s(gukhx voRb\V:u2M.xͥ[րmsu"=ԊKmID@D@D<zc\~Dv~7͉$�7n܈M&*NYޚZlK,.t 59G\:cKAGy\"ŋcÆ#Lr3J㬷ԼK8p4فac XM QM*U2+}yPH]_\?Ͼ>`&|tSK(~}<?{{.cw5\|ԥĴtno48~pF�5'޾ pC% !_ﻚ =py>{?;&ZLl%~V-Z[vD j}\|qjFxHQ>[\É67sogvۇ~x=ٜN @o<@ SO/jVy$)b4Ͽ;29 e9qc<+ U9TD@Kr&wxgo3m(yw6 g`??\l׏8FKЎmLpKC\oy=Y&S\Vy ,~}fsLRE@D@D@D@D@D y pN{%8t:=7ϱlB]ή([ji[wCjpFZ+.l/BմWm0َvpg*x &g9g iMl:ZYW&ym?. )/(iPoH7o#{~ ٽS}%K.yssȉ<*Iύ17hby7~ ڶkb2FD<:t`wP|k<8].^C PÆ M3&$ 2ٿ*" " "x7rBe2~vvJ{l7~RWp|U|>L<2fmA'9r gr+9)&S_ enlWp>}:q6g`ltc"NvTD V78||7rla^shxbq/3MQG\+/<ܸ}ŊVkرx|Tn݌:J\+Κ5+c={sXh Ykem(nUrW ߜ>+p6>\.Yv^bϡ��@�IDAT]'po?%cH{#fD@$Z[L~ule xc6+髤% $AQÍ1�3g xۿ>xԼd0TD@D@D@D@D@D@D@D@D@D K*zxlj-tXub tv u#+UOAtQ5*tr:(3@NC(]kCED@D_$gw 31Y㽓Oz[`'{~07!�}YW+`)oCX &{QAq["IE^,g DZq BL'h?{lTKT�D$.ϡrly|>D9N⵪qPTN6v޾sI]>ͳ9W"AR>wy/pw<?Kpk~9kھ 7qwwqC03M{k]k"܆Jw։kD. u]t4orױoy}<Ӝu= {$Bt/gfI {pwܙؖ6a&\f9QIn|˓'OƔ)S0w\;_hQFTR |m]�y&^x1<Mˌ'jŭ[6I[֟Gzz)ॗ~JcvLby`РhoYHuvg +ǣ<" NI'@y 9gmUD /htZPw^isqv\r&7ۺ1iӬ݇˓N:Ɏ)JՠA+8|?·cM0hlٲsܞJyr6'ډ Y2fMhǡHH[s_me6_mڴm7Ocp06@Lj^. 4 ۺW&$Oڗ!Pн;paV& A:}̭il?8j{"Z�DP>E@D@D@D@D@D@D@D@D 0sʕXjUƴzj;O!--BG@#@M'jt2 =UR�]S'e:ӱ[իW2լYSAE@D <>nkog wIߧtNwD c뉓<}{.10#@55'y䑺|O? ؁ I(6h"w? L}B\B9laNa@>- d$s |泪_R\q2)KUP%s5o>+3+hi7u*W?k;ݮ./ 0iǒ^2} R[\>g$;8ϾRڥUD hq}m(Noe3wxm(xͺ>\jJ볙>WJk:ڞ&^k#&ui\"pKF*"h #l䬃0$2~Mت@ 0,mnZfw|G .GPwNG;j6>^DWg=Xw\VH>!@qaĈ4i}F_I&fk&." W8qbfڷo/ؾKso&I6Ll?m ?΃Z!H@d<ki3A8pO*g/xGxŋkm%n=5�ŀV҉\rK=-mn[exIFynI#Gѣ Nc38 &%?7y>3WH:uЮ];;n| SPwX{c])~YgYG2Ϡ;Shڨ.r\x)Ä>F m[gN㗠VϿN[f<h6 |t2"l }r|!j PL㓯C(˱d,[ +V"ZҢ( �KNN81�SAQ<)i):&3) 8w.)A"1jժec9LAitPE@DT.]7dr&Yp:b_$K,G"@b˸}>θ,|XxtG۾d1^n0*" a̜ 4i;ì"% g?{yd9Χ�kN DvȬ"D.K(iu7|6\r<8vXR,8>5!?B'Cد>D#: 0Aߏpؾ}{2Y;Og}VK39PJ@ Pc%L:X&LI;BpĹk c%TIF qqoh;whѢ#9; h'w1y%0<'+OvNw]6M{*bp9K'\OEbI6cSkn5'>9-&=~esm&3f y+sDa)&nӦ=7SrSL 'Nh! /2+W6"Iv-A$9Qj><)>h۝|纮Pʉ.k<vUD@rO1.?/^ۥ'{X^?xچW{M"1|m娣%\;5JycAOO>ĎxZak'{_uW_}F7nlYzm-U O&L`E)؅?W]u_%c<1)UϤ+'ʉP%0<B*qCIP+3cG7Fes)(@ 0Y .Ă h" d$ُN]^R*qO6?{a:'7OQ:f0i W:i֭[7cD�Y^gzVH,ϝ0!މ ?tL!)*԰w(�K|&a k֩SN|g=&iU{I0 ?O<zk5&h33&eoͤr)1배v䘜M.!?|V83&FE PH{L᝸%۱cGˉ"{y|nX/fLרױ؎} x'$53I ad%(N _37 kݟ3{A-+t]xt=:n a9[߸0-EXȍbXGSI+[QcڲeqI]iW.Ή=] iC E5mL"v;殮KZ-.w81˼mh$(Y潔w2;>?LO?Rq>'^G猓/aÆ~R袋skt|[alȸqlf /^W^y%nԮ];ȧ->L :ԧ Q$㣓@#NXKgdM +) 38 et<)""?{l)K<mLrm9k伳e>iw"om#F!C0k,kh)uqE[3gbȑxQ8sNIy=x oCΝV3zh >_~1馛ХK)S&iq۵y.pI{jx> HP+�%wvD@˖0z5>ې|vB"h__{-p(@1/�dCNj͛g+VXL&А<! ,l+`BVkP\AĠ_&KaB6h c_>LAED@}Xy7͟?L s⽐|~ӷw?833 i?LTR@n)SRt$"  1y1~|,m"Ou� Y+fhQ%s YTED ~(FK&`̈́x+bR<NpL~q8><s{X}mq[XxZc&nb |աc W/8QU( n*O^"x::XH]veg9grc6goI>hI<'!Q;rbj.iKbD{m6SX`A]Ir嬯uѿMJ\S�9~^ $+ahg.,\{ƨQp5\]wdm!}_ C=ӨP/u>ͤŏ%Y)1!GL&|۷ouJoM{+J(ՌVH}۰aC0Kr9-ˠ盧]zk/)Ƨ߿? � >_|Ÿp^1^z%|=cD_T³>kȗ oM4 ;x`}ݗqC0!}i~HP+K /IV6 |t2"lI'g x5(ס�ΝٳggLL$Da&2PT%_&mep<Ef(0ÉALFeL(RHq�LxΜ9?�j1zI (8: !L>31!5l0TlوEMW]j+�=z�[ujO" 089aJ‹ŔRJVZ&*0@"J.ȳ}@l޼&K,YҊ0sD9O.D3Cpuy&e"k qKP*^&T"iӦD7\ *ؾh2Ǣx<ID@D@D@D o890:;Gr %TD@D ;G%u Hի{Kŭx;1VX1;`Ro=;;Qd mW[9+m[*"  P8Zbn:NS l͘ثW/|t .%ͅ$>ɹx L6 ͛7?{$R/kGছqt`E t*θn*^*v_+rygq=mڙ$=XҦlt6LڶRL 6.R`?Z_[n7|l⤍o߾&UFt[nI޽/w{߮!O/2~i+>;|G 5%ds*e HP+VZyg_@t3F&!NFMi:4j PL㓯CHkO/3fW_}e)"@N:)c:W>ƍ@bŊYqMI&`*" "(˜5kfΜi:蠌38IUD@ 0cj~%ϯKL#\r ~m% |a&^'ZMjE| VdWNh NҮ€~sLFy&PH}[nI,Yf3E9tͬ)HZ@R2c)ׇfDSbY`c?&&mׇ2 L TR׷}k&S%5ūyQ@О@w@QڛIh+Wl@ҎqDj#"(A!?ޗ8Z,LJޟwifV)6ٳ7؉L>\P!{MMI8+aJ;NQs|_ĉb[(,W?SNISEâ Yoٳ'.aeqL0gu{9^2_[/.�Fڵ~P$DB@H(%vƌ^I<Ekh#ฒ^;%9 ?Ğ?]ҍ�(lN5۷"] PJ ;н{wȊ*%PXkȐ!KqG[D{PX;L:QD?x5ХK5PŊSO\$}'N^Zyg_@t [LMjC>" A-¤G=ެ=(fGߊ@رc>sL:N B<D85l2qēU` k8͟?:Q3ΰSf\<ۥ}50='&C17nNL"6t'm6`Bu3?~8DlUVεŨ0&Q@/ Paֲ_O&?3ϑ4Ƿ Xc?wqv[.8Q,GED@ ɂ D[4'Ma09Ni&r%@ų؇1VcrׇbZL("" {F`c>z 7;0AK2WI技@Sp Y&ubNƉqӦPX8Rpb[NЛlIBYJ, kVʉqNz;9M/ӧOnj3OѱiԨ _ɉ$NiΜ9v;EK.iӦ=R9;x`+UT)HSN[eT=|rs=x衇J~3Kas^?א N_:~;?.ڿثq?S(vθ-kԨ"ED9ڞD�}9W^m:i.7ol{.iLBnݺYh '=òFb8%.ZjCzQzl6C?xFi=g۷SO�t "&?Z6FNTZyg_@z+ 3M6 |t2"l;i`ƫ)@1O]D@D@D@D@D@D@D@D 0({ܸq?~ .Pu(b`a-Ɓt"otc _|iӦ`|ݟy&8Fۥ28qdr&`?߼ysP\rw:"1hx8gBh:iJ 3)s:+Q D3e̜93C "L.w!Xv>Wp b(*" "_ $w}gk&cŋŠ919ETTK`֭~<{0 )ׇ.󨖉_ ?6i 7QuΝ8#ФI U?UK@*=7jē+2|O!;vy;լYSb<Aڗ@ Ц]5mB sN[1oX<Oľp8䓭89|)r: HM'O|gF lq(QDJ�`*kx]wLc /Z}>|{~lyoˆjjqu>H&$lljI;q_@MƀVDeX~i*" q @@,it59NlJ%햜( ʅkz?O?J 0Cݍ8*]tNEkQti 2ڪYm`Lu][n\ƌ.0pFTUL@Zy*A/E@D@D jx�0&7jԆ|D@Z>:6aT8XG4^Mi|u" " " " " " " " )IܣFѣmZ&zsA֭FA,-[ ɓ'[&f҃mK.Ru`" Q'~ Riժ,@?\\LLC�>_tE8s"Ts5AE@ۮ$JƬ}*WNգLb�I~1gʠƍۄr5@lڴ&Sfr<NRN3Yc81W(bcԩa28?(Ƥʗ/Z$" '$%`dMGB)bξ3ϴ7m!Mږ$vf͚e(gx *Tȼ!c㴪" 1 %NT͛Q`A{ϤBPgZiرvک?G[x9#@A 9/C]p8#`e]r߶Iɓ@k֬W^i}e+"ZN̻?hnKFt4(Z$9k׮>UnI 3S I)4h`'/)Ь"" N+VX%8ymS&MRJlcOgō7ޘC̏߾}xѧO;v`lW{G0:J,s&NvCSe|恾}$+Ƥm~$wvDodEmڐHPG'#¦2BPf5(FJk_ 0t-[fX^|6H裏k.HKt$;w.ƌc/^lg;w/\B8iyUE g zw0|p8O<w y ZCD 0Y&Md>0Dž^;t3a};L lw݉@`c~t钄M^r%&D"Z,͚5CmM-?ዀ|V7oO&c2?& mӦf"Xt)Əo ~d@&A{O"g 5TK@*寽@<޽3f̰BܴP i;0EqrϡDh!" IM"[#tⴙ3衇IXFI}yi<َ=#G97-[DҥYFD I1,_|E!6lK/NժUK#y$(֭ڶmaÆ) s3&~m8>v<zLm{* N@HĒ}fxB ㎳vJ*;˸k ZDN`՘={_R"[{E _)E)xOd,MBq*^zxIf^v{,>䓄[k׮6 &)u]l(hGӏ>Ȉ|W݄ۘq*E@Zy?;;RD@D@F_2Qۤ6#Ɉ)8.�&FR% P1n8 2&ES^Nо}{TZէVD@ ,\uܸq#֭km제ZωA*Vh'&Q0I}#$cǎСC1ydEpy䑩w:"HLri~ӻX0J p=mߗ B̽+U(c6A`0K"wꩧhѢ @G'"R$̟~}ꫯPre\|~V~}/_M|ֆVXbσabQFىZL�Z_K@+gC-c2e(*ˤj׮M\JڹEڈ+?)tKq:1Q"Ÿ5kd4\5HD@$Rp̙A1<smTSqx׭n."k.P@1}H`b>�sW_K.ķB/"nf+ԛITBf׼1`;}i\0U" `&`3 ?rC+MrXkiP ~urJhg <C}#" y%@1sZ%E g̘?nsXYŋq駣f͚srJډ,Y}kKqܹ3>cX%>w>gg;^ ~,#zal~l+;Y j坝~)" " Q#D+ lMjC>" A-(G4^Mi|u" " " " " " " " II΅ ~g믿+0kmr< 5ZD0uT<#`b` fQ8Ϫ͛70uL�L@Szu;ժU Gu("v܉aÆ7b/pWkA hd0HhĈxW7O<1|0[;`bTD@"$`Kc0cJ`V7ď?hO.+ YnjcEjiS . uzU�*UiZ~ްaC8nʕ6y^hJ*%@ #K'V$_~bW]uZli5,+^%^= X{ѣd)SڢЌLj"" "{#݃ⴗSDx6$Ed^7;tP < 7vN9d?4_D w}&oߎ.]X*}LSO>*%} q;afNK NV&Z""?"j-a;֊N8êWj M6E Oe" "7fϞO??s~Zj׮ڶmXv-(| 4}5p1f(_&|zx$ 4>ĕ�(zgB ul&na#IV" " "5J_nHZ<-6ʼvvմRi @`7 iC…qmY!-:&}b"�&ӧڴi7n?1YWӺu{KŊQNԯ_P$2Mj`_|?8ʕ+gz&x~jg#ߢxwm'|:য়` Rҍ�p_ |r"2 60` 8e^P@ٲepLD@D`6H޲c9jԨahL*li߾}vﴑz表YftǢv ~Yq2&ԩMX>$J6#"+_ m.4oF׮]{^OUbX{X_AnN-YLvHǨ"" "X3:u*)b^s583P@60{PlJ,n'x`.E@ґ�Ǐo}'OK/=`"ܹsѤI~ȶh psWe] 7q:O#ĉE@PT/s>>#Pދ.wTFD@D !lbxߦ0g[n }$]ޝٳr ЯVy;t7j*{^>>kC(N{#p%u~m޼9z=Wy&~l+;Y j坝~)" " Q#0z4L�)q(?ڨgnHZwg�5 xOdz P'mKD@D@D@D@D@D@D@D@F`6͛ѳgOtNy;JD R{9HIZMPz?믿?bXt).\ `~d%KDÆ $ iܸۄ/D LhB̎;9,ho"?{ o zgPL4.EZaep!`[TD@rAjU̳J.~UcB իk(bLf"lСֽދ댒jѢE3Z'׮] {ʕ4~¤?@zЎ;7n~a0؜ UzԪU+fD@D ]h�6x`0w*TʇcSJBk" " " "g|^ȑ#Qti@?/֭[1j([>}:j֬[n|Xxq6ܴl׮]xmC&u8_}>}qv>`Fޓ+\`A_sKvmxWnx[U^~9*C<n]` B͊@t�YeǎOz/dwjѢ}k۶-ʖ-F@ p|<vX >܎+G?ߛo*UJX8.ߍ)#a!)p\C 2!W׃+۷o�m6̫kb~+w L o-S{bI@Zy+x" " "5wȌUD@|@ڶQD@D@D@D@D@D@D@D@D@D _+լY3l˖-C&ŤLHz@O'0&:l4^E $d)=z!4h&Nv'c;?W^+PmfBG}Ԋc3 6lXU2 s1 p=X'^^ 3g~iz63@?ŸB+M6?j,AJ(_ծ.͂-d%sN?־}{p 6 sJT_Ggs:9'LS$4]vYz_lv~.Zߞ5<H{]d ೰JP'<@IQ.V/츟c?5Lr ]zM,x?'xd} {?zr#\wuS^"Q rw Y1+iӦaÆ `љ3gb694Evw9_~vٵ('VNg|7w\L(d^~VTv~?i%3?/g:Y꼞h.26'/6w{ > ˗/G5;={" " " " "v88qI'YQr ߿ĴjtlPB;C-2+?B7~o߾<%ӏw&Ca"qڀyA_R0qۯit„ S}<niǎeI>ܱ­l˓}GV.]DwUרyᄈ:(U|' bN: W]usW_ꫯw}73k||bIMj@g޽gK 0_zXr%>s+w1->SsM82x-Բx^;B/X-+V?#>=g-܂MĹ̛7ƳoqFH+יt,ӏvVQx]2=T{>2mڴ{ <~Cbkk6~+Q \oY<|1:t5\QF{ik" AXvE@D@D ܖ]r#*"3&-]h" " " " " " " " " "S`N&ds=RJt9m|˖-|ܸq`U(,vZ6Q4&K>TGGd<WZeN  an/"-LD77x#uY~ شmUT>͛7g_m h L;vl݇~o2/Rh;{ou5/L`͚56ʢEl}ݗ0L1Q}=O=gxkw"k:ٛ ]mۖȦY# G=&l>k2iq뭷G<L9cL �"kg| M,8PSLO/cM&]y6Iȉc<O2焌d}LG=ј\{c4Q$tLx|ٳ'Zlim`9L28SЭ[7 1cbŋ[y?֩S385d3mr{M6r&awɒ%>oƟ1͆ٿD:N:I6"Wv<e-pmO3_POƘ1c=&b<mK?d'@_O<Ѿw5k}WIQr$H桎&Ը3Բ,һP˼ߧ|nyEs-D yَ_l\rפ7x'rH M͚5Ei1ж=y䄶+xaU3gN;U|9}1K>I7[7ۿ%ý;4OSmĉ6.2"хZlqmY'Oţ0s~P#1&e\}#ޔ5O&M62JS 6^zEaѢELr `\%AD@D 裏Ƌ/9}ꩧpG&]9,X`9qdZeKkZoڟ@> *{?W^ySLAZ0`G2ƞ(٘q 7�)FZk}]%.c1i/P MMz*(RN[58<�hlj3O߾}3VI L{3sf[kkѿ+b׾}{?DER|0ޝ" Q#`bmIp6$" " " " " " " " "^(p$ nڴ/� B>. E3Q)瓩4k ]tI&'E[Pwgf i%UKl"_4? 6m *[ljժY'F:T\N^˵kƐ!C6p˲g~7Z.F O?t,>x2%Q}=N"OH¶'P,^5j KFYBcdL$_}:0Z$|it>bb(ncM&+kذQG(RH2s2lHl lۯ~7Lxbkk⽁ r[ . {h9 :Ԏ/r,_<c9ٶr>cCQ3(^w S(Q" [&j[j%uyOBKuI<eֽ_m{"(sdK!-9ڂ$&:�85n8@Mu"uqgeYzǐn_R h~h#޳N+VmkډiNĵJ½kӶig}MVKW } k7J<Ǚkx0J>1­ߒޝ}|ŬR:wlmK gϞ77@_|kׂ0]t rf*��@�IDATWwN/_ݺu /Vj}㎋I64N#!iڍxPc+3%']WϺ~3> 3aKǑkf,jKx#/}_CDdXʎ;b…xгgOnkua>cqj ۏtcm3/1c஻Y|Kɒ%q7}Z ^~m۶MS6>6k1lذb|=WvS}4~+俉V})^>w6֟?MSh(6D@D@D +8]Rt8"q$'P4'`ҥ:u**U+ Vx"{L]ϳ$(ZjtwíիW:[xWB8?6a9j [nΟ~E&OիWgoQzueZ|;gH6 a7GF<W辞0`�G0 kzs5 DAMUN`& $we([F f<x+I"ǚ̍N'l�$KItϓNf|Ph1?N9H{cWÄ}o#syKW4igy&y~ݺu`.mjd|5cSmbb@1J"_rJ )Ѯ1Gc{O}vq\:T3grS&㏣YmCD@D@D@D@|O-ZؤXϷI }h50GCm$Ը3ԲHƂƐjG-W9BvC]w6ѦL[ѿSNAjP@n>/S aX&ڵkBӿzjBے<Ӈ;/d ߒP;oԨQËGy$f̘aE (BvڡDURlV4oܶC=d<+8>Iy?�VӽPL+; @ Vls/O&stPQfڟ{Fϴ0FB+ԲHZmV2_2L0'bѣ_+ƷDz|}r7IH`k9?3S, 0F7Ē6];ųO ѦM d:uݱcGLWHO??[6K@ޡ ϻ# 2-R-"K§@t/؎=lt6@3<PD@D@D@D@D@D@D@D@D aVZ~YC9$ad'N{g7sθ+2~otcUW] ŕ8rH|X|95j>}dɒۘ6m 2iРuv vBn?tg_yt`YJ駟p>/ro 1޽{qc9s&89{l~:f@yw}wl2ˊ`/_ hRvǗR3lBmu?l {  \(> P("ŋ.ŝ�A/ AJi;e}G;3;#Wwʹ眿lfkVĈt{1oҦKp|= +Jzcuo!ʅW~tMλBy]9W+R0e]|RWc: =̢G]J%88p#/(ӧ\>#ls[_^<@愴1pwu8sC3fke-OV_O zXr%v',js?xyGd&~gtz)~uYo2ds@9v <`3_;ﮄ'H^gq?} 2鱇މl!אf<f3b/qF FU'X#:"\C<,1/vR83d֘6QS0bn{ꩧ:2*9 u}>9sc=>c8IsM5Fm$�`u]<Br)cH'<Bb!ʬta\UZމ_M:!4Yg#D7R^&DdZ=1"e܎0qFW=絍=m#i!BeN:餤dJ}rZ0֭9AuGlW\q ~wc4qwqEFJ!kjpꍴsmV0?ڈȪ.|gn>2k8ꪫwne̷oG:\^_WyOƢyqCqߗ)k3s ._|q$T1_23`W_gٵ!`!`=B2)]w]C(5<&7nr-N)8{µ}|Y\-iͳQ4e2X ngsYZO;\^,d>w!+u[՝O#mk6E7N?>%[h )K<Z`YǙvw=8oEVNӻKV[m5G׷Må9.EG_h|YҾ9O5N1-ߞׯdּǏ8 1:ֻvi'w-oK|8dpc}<Y1<ۇyk?=m's'n-DNGcРA.-\CDA߸{6$~"ͪϴ~}M6WﳾV_jsΓ lEЗ\5 pC7sJ%UpbZ-oˤ!`@#}-c矿 uȑNyN8DTT\ĬydͥZpy+<TZgyZV KC7*b캙`[." 1y6k\ϓebμ5q7o'8?r׺y{6gZӾ"[ ceAnI٨�62"ͯCc#=&iR9;i5ʵI%/:]oωo"W n#Bۉ,(mnrڝP<i`xnvLg k[c5Dq.}s{/BtO\!ua -7˟]o#te0 C0IᇛK!yf<sCHFq506zȐ3&Mӊa!`!`!`!(IMJc:7-eiTAPD$RB -ShS9D*<vJ*EJB{F*eRź*E/BFTot8E|MtG8r=yk U%HUđu~5nԐНU ?RH #Upx˝џ;oRbW>_ޞ’c=T>;O? =R%g8;H{x/UY(FL%R"_{]<!pc^h饗v:3<~QHiܕ>C}䕍wOk]\J)٘{); `v.7|sC.~5BuDԉd4losIyz!#|:v܉U_CPHKo̫3hUWu}\)9k y}=mRK-яwF葒QՑtz'yeߟpLP'\,gl\|LU 1eH-];CDȹ6;#BޗO8B7qT17n9蠃"u_x!cJd%:;,Dp%feĈ :^:,`u !mRC<,"B}s&RBH%?ƫc&' 殌-( @\\JRoe%~R52ԹE30CCnY'`RVg%o˅qB^ycqe^:eWzCR!ʼ<yctBuY4b '-P y؆ק\W_}b'O-JlH+wRR駟>+R_BvܷA]\,)+/7K^95Zuu5lذ"8dm@Lœ}O!TH ]D:?ڈJd󼬝FFG1A(2Ƥ%#KKy!됾hA^_WRZ5 ;k,Stw9.Ð<to5v'%K2iʞK,W9!`!`B�}}:YwxdYX4b)_FJ`*:w}7EWφ27ˋ4L:'LCCDhh<ϓb<'Kw{Bޅtو?/ \vewE!a;RjY},|>?{ިNj۪HWRw2sDݖ93o<E6۸y'Cf=А$WNGbC tB^꾩'rv/pO#\hihkyj'i&ԑ{7= gQA&<LCȪϴ~~$2=T" %pcx]N!'J /0ц^Qa 0"m lqJfIՖl@ 9/x(Z0ob翡r/dY|zFͥZI<e/2OWRH,{^٦nlؙӃnYg5 ״.d] ew}.YwCO&oS/J|[K)ɴ;朒nWJ-d?;J-| [7*WnHy6滣l~14Y�49>_}qcҨFůDnتji'!v%Yr_ʕ=Nv?]St݉7ߜ"%b ѽkkE;sK/Խq_?J9@IqmS:wu� 5"C0 Ch663wX@j\b(:Ƨ)bנ0 C0 C0 C0 C@Y]QzA+֞s9w,R;\)ѣgݝC9N3!5J8g ݊jó}O?w̘1|=Y.hD8CcǺqW\˻*7FqBşO:`";r<0nBHo]d7vm9V@B+ʔ80y8Z yo/NR6ǏwQXJ;OLs9s ߨ<,+&G g�m= NJ_;<GSx?NBq<V^:>oBN"p4OYy' )?ԇߗG/2 GcdSjy5i56A sUW5+ -a0S(Rf!dw7 {x>dH!f(12}k)7F+4Lhq!->E?7t+ [1 +2+dH!ʐC!ctBuIrp+^=Shy|I=~>)'c򆷾M9mDsPO;Q+yaq4sF灍J'/^_wqv3ey2}AZL<x'o3v3|y!ܹ7ښvqGvRR o#t~Wgdr) [mޚ@u2 ;4 .Ð<$p~Mw`1~Xk-ReUJUC0 C0 ֭sw9<$Mjys+0mܩ07?}Y\HZs|į%;΅,IH?nqz&yx͐w!$uPY3Y:yejY=`!#Ѐ-더m箬 QNQ{;L}o2潿*YZα&qּZNǛ>tR}i᤾^9{H7HχFN&^eʾe1iT:CEL·|XwqN/r R6O34ȑ#\olZa#o82R=(RuU 01B@6C肀?~s)xqOEBNy:P!s G1#Zҹt\Zt(_ ΍O==6lXovy5ͺFy2ِyMpyйN8CeРA:0VEt'}yUK]—�~暆o\UdB!6N:+齦-[Ҝ[N:E_|p~7ʹvaG"voVWEv"D.eq=j{,oHSOٱQy晣8ǃ '|oݨ*$FbQRu^[6/cK{8%v[l1wP7aR},!`@b &gĒ7 M'v`!`!`!`!`@K 03*$>,2'uf(_}gN<;oN}WhRj*QVES W_} <g]tJ!©AcM6qt%ΐCʽ+J"'O=Rq{\d6%\RQ=\w^\CO'|-*#:BܪNoH\T]EZQ*Q=+wXoU%%Nqu:|?ٹ\p꫋$VQgN+TArҏв6l1%3se"|n_C5Puސ*QN({׷b [}T.؁!`tC>vl'zđB l+zRBNQb@Qg8hcK{ׇ|BWKG:kx QknkXK%矋S 툅x}ڍ C@dIDXCE~~Bü-!?6P|\`ĥnCfTW^y1oQiaC\37Rop eA2݊E 6B+}iㄐ1KX,o\NoȐBRO兖//ޖ!xR?^ +{<|e>4W[nXrl_H{ZۨiVjm EީNvP/2f>d %q#OUц_K\-ޤkym@LĈn eJ#YvaZ柡mD%c}$305I'T(OΩ1ߨӓ؊:CsW|Au.x27P yCD__w:OU8.Zژ_o=cxj!`!`!3$\YɓeH@sߋ.79?ʒ!c<-==7s2ˤ9di^󡲡"٧ix͐w!$u6_J+ֵ/ /Pԁc屼Tn |DyG ۳>x QǔrMLvPv5w>3}61+ɓ8n;A'[dMOּ}rzd￿DyΌr1Ǹs}?mY6i+g!yzYuW>х/h=Q62ERi:hvY֫ ]gk[uוpNk/J@v/oy<ŽްVX-*|U:-X˲!`G@r*+>{#~L\5.w덴F܊/^j]ҁ +`C<O}\:iU}y~n?Oe}X`ܡ\So?fyvY2k$' љ T r" /X?¿Jnre9=/J-6{_C#eOCh=ͯ:gSƴ9; J|gyo2`�wꪑsvRdC t둋V3K[KSo;Lh=جz| �S̽{NT~/^5J%ӟ2KK6w @O0B"h!` >籀- C)FSyC0 C0 C0 C0 Ch(<tI/WjmF>jIOSC=T~ߥFS#89w}'wy<BW M;yh=(-c{)8vۭO._|,2z'v[zˋ9wF0}uwӸ򼿇}{[o ,?zZ$x- C![s5 N3߸-n}^ϝΫ C@dwD(̢68gYN³zhHq-tד_qHj߆ƙ7H}I/|Z"ͪ pc=ܳYcMwC p·7hР5?F-@ P*G>dظkCaiﻺ__ky2kl>Au '8ѣG;>1n [m#|k7v}e80O&wr4 :Z8^cXȸ24w'<qd%${B˗l\/Eo-Gx1wכ'Ҩ85j}aK/<JS-{[L17D\w#:묳dm%{;CO܊7 -P_ڥ38 vo4 w(ϧ?}E>>ɩ߿7Nۈ:4y}UuO7]zM!q{k&創܍8�؂nYT_TR\88-!`!`�2#Ty[=#˂pFI{9_|giy7B\0it:uS}ԓ8^!2w3]IYs=e]wuqgo 6ؠM^Y*7xRt8 }omK,+U<Gu`uedkJǿk!y?/K,D-Ѻ{ּ~yZ^oN5<9{H:e iChCtNJ`{w߰l{H!ׄ{hH}iC|e?8Bj n=rOlͺԚn`C-N8:k'h@ЮGdGr<�l%tRHe@i"s=t\+\u._L"6薅k~h\8O32!йNu9۬k)Cէ:ȑ{FsϢCh=ͯ·IS9;:L9唕VB-ꪑ!|rT ZAu;Q\4K[KZ/\yG*zr|=loܫ<sC~߇5~|?mOM vAs�ˆ!`@o!s8#--C �# �n1 C0 C0 C0 C0 !0x`Yq OZQLfd+3](+}Gl-tF6mw(OtҞ<8%Lr-6T>|s&ȇ*7pPT#A< L(NI+~JY +y"qݜ~ J'.[Ru?;s!P]c5dȑ2f7�Fq#("o!.P V ƍsZe@i~ر/8RB^:)t:+KMU\t|[2 y㈐8u} kV %<\x"k%’A?~D$[- srUf.!k-:G_gyﻺǔ|&O~dzC\モnb3<d�yrcA!CTd"yqǯ3NaugƯqȘ%o,qeH:E٬qeQ}`o*O7?W<o W[m5CǛnhyO+k /Wr@dt[-6ud`34SahO^!B 1<-,AO;ݥxgvek`&M6,(k%~8k~C˟WZ!d<K_x|=}G~N;-KE[%9Cn;{nIe0 C0 C0�Ew!ifȲp49e$ysS|ϻExI㯮o޼BdyfȻSONNX{c wLye7FP<>L_}'>cZJ6|sG~vG37#\r[b-*Đ#m;/ |[s;-o[_C1FH_H]m#xZWO8nT?dcFgPV|W~_NjqV]uՊ$!؀ 2FYL*u:V~C020BuYš=渱t+#5 Vҹ;IX]vk|7Btfׄozs6>T}-|HvIf7,]vO6yr饗n؜苲)!|y z~>쳻CoQaiVFݨ$o'=)'侵;)w9 tQq' _o�VQg^ lIY|$>䓆5, `ZR5 C0!�`%A@}矗$3 C0 C0 C0 C0 C0@K/z%I0hw:}QbFl7x#Zkdfpxy#4%.!'ǐe[)N8G))WpH~݊.ߢ.G A|A5p@w'}b gQwq0{=2 x'ueKGqR$i8j@oUVq2/s<`�g\4L/8F8B#1";it(8 _Z߾r!]G}s5@w`uSxY}}^YzO}*7dy-㱐7HB e_xʣyMXYI:8DZ,=i8%%F<S6>g!b^S<P0x宻rd8 {|αҳ>̳1Pϓ]}}Wws/d*gqF2f+C) f+*_/ŲZPT9H:<UWd6}^xᅊ<[K0BYt�uW9,#FԒdSŐ";:t#V<]ӧ<cynMN9W~NZo|\V{r˹$Ɍ+v)j6KmEϷ[_4Z6+-U'EE}zC!rO?ԭѾwOz !\i\;�C0 C0 C@};>qV+=ͅ¤\ܼ<O2\Zuv_狖Ԛ~!2w3]I')Á;w:(AVye?Γ5|~y7hxZo Swニ; /t8sꫯnmʵ9#H9$syoHraTWߓ?mµ:z8>c*z衅W <ȓ ycZxC"hNR.Zcvm7AsJLjϐr@h.$z;>KݰK[[oKnk=v&j~+i:T[WChuthD!^5{NYfD"Rkt+#Uh\yvysz͚f]_lMO:y8EZ΍vUR ^i3U@F_}UGTd:ǵ-oN\;x'yů[nq7l%=0~OOV!rQ/gβWΒ;e 9ȑ#؇o]n=,Bү_,2zA|rKG~'%{ѽik 6o[9C_& "0B"P8 C0 P([@D!`�_|QHT!`!`!`!`!`� ,^}ղۊ'iL$ 9~wٹ={キSJ^uU#p;!~٧vZw5\#(A �<7t,I+Xk!c=&|CtHO>qiHYoa!C(wŃW> +F}|?ʣ^ivň2q/oH*Nӟ`nȐ<HUQ1w*o Kts΍^*h}y~kw;7RKw(ס E]$ߝ?$!!esa8ivgcǎup3ϸc_wo3t"Q$AgOS-@bcR}lo@@߶{<e {1; i{+˯~+9S+i}= {9?ɝ9QrFyM +0<}9#8Y'`A9+p!&m{o#{d}\Y}k@xg7|Kn0k~GSM5zg%^e!\-Æ@XgQErBa}|+ym<8M�O~gHɱ!!? sMn™oCNLRDOc;8ar+_~O"#+!L w',RHY2.CW"+)_^{[T-K@Wb\S7r!%ެ|q,-5ܭ^{6Cӗ;4hPhrMqʷ<;6'0G� s9#[{0}N+b Ot~!w!'[!$=LO�ʗtB;H}7 m#B⽉ r#C(kE; o-޿+o#t~1͒' w?a+KFBNkC0ː0$O a9CHߗqOR; L~C⎃ !`!`@ �:bt\pAժ!,I`}%23g%ͅ'kCqoZl^Zs|Twr=霟=UIxևt_ }^=N~8^!_yfȻ#<Fk%oww:뭷s9}\ m^'/ E>;8ql<|8e}`5pXCfȃ>O Nb!{"{2pҏM<!m͛z!T!=jt C?+gy[ZqCn5fOHI+nKըY'D7l0,2ԧG$||hX@v׿6m�9k~ްK*:N 3V1˯!`2jJcV.AyǾEY+WO1VϭH1k^-wҁ +^<iB\G)霟C=VϥZ+yB<mBc\̿+q }][ZYݬky2ِyM>:2|=z\6{zW鱓.BH]J7/1X`^耼uN;ФBu8Z 7g'.l8Şط=Cܼ4C6xcGVr6\Qo\Ie!r<LYrߐv')<xӛgMws̵"_nȸ~)xz?TX{b'6v5k.{:|^6 @!@ނ!`!`�y獢/AF, #pQ4̅Gk6aâhYHD?dșD UiE0 C0 C0 C0 ChC0+ZdQE#M/*D7_:=H 0Y%ƊT4Rw5EdGWUƊTy]W.O?WC護ފa_yuZ:K.w_dCjM6d.G^xaA^Kt{^I T=KG#U&gH c9&:묳"5:wyP#H\)a;W-*ʧJ떑j)IKCŃ*Z#Urudh8N8W&_|ţ)V[mHrQr: rJ7X#H +YVrmOwEbyQH*foleqp:͝S'둒vUjSeʷgJSHIj\q򭨡n}D+xmJp*F+R 6tN�mw/6о7aiOR+CH_O_GF.5,"RcHED%+ʢf"%@_]+џv3a,BL*d" ׿v}�! ݒ5}.5TݍULgHwsve<\Cƚ5n\.g =G@?袋z`t:#GF:?LF"kI}:uêSHZSC1e [lE<:^]VN3Q#ANJ"枛nˣ:tsI͓XE#po`{E:N+o, )d\NYƕ>dHTZ޸2|TzǓ}Ȑ%X��@�IDATQ ')n=2q}V+jYiOƷ6e'mcZ·4 :4Zwu]S-IK{W/c1򮼠%ܜTm6 !0u)}b4?!Z3OW'S/7Vcff'36G&:uL>uzH1Dj曃ymK^(:+'?+b`AX4f%o<?'d~WWH궖w)?ɒ7Ɲއ=m)= 髃3Xe:xaںaHq/G=h4^ h!`m:ztmq3NFV<YksX[g2Rļp<aA|B gdr)iޙt.t=zC92R7p'?>$+xeH'䞐w!+u6 81BVʂg8`ȠW^ F76iϗ<zMJRMۧDaebZI"dk^罿ȉt߱~ާOןQy5$9J:mv|-$_yIk= yc-!m7d"i;Z׽G;_~9^ Mu Wfh t!>>_YC\pA-mW|u�(kڤ׻'XG;=Mщ'S_UW=l|:!`j+WQ%뮻,=wQBH G*2_#wbܗdL }]<\,1\\:mS6b-w[zl7c>RUsئ_s5ξzfr)yptM7ӳYsYɚp=$o#k<f;uD38c[otʟvzN=^zi?Gl>쳅&UOi>cyqޜǓ<2]dr>!wu׹JzaяWR"CH;AӟG{<ٕd}y>ឬ<'~LE|NJo'Ց@g ѽjk -tE�3E_>j x C0 C( "rΉ_4g%r䑢 El5.m7omd*[%Ç)_VC0 C0 C0 C0 2!J"Ɖ|eoPI'C~uU^}beu!(j&Jq UW:%UU9ǢdA^:xRT[4j(lL]S%_qv;SɡD_VWT԰Pe%�G_9Ve;Q2ꫯD8+pW.pTQJQÇn9>T1PԸ۵]{o%^5w:z5pP%zEO?-J"o𮩣xQ",Qk:"HRZj)Q'r'^>ٱ!`(1(9\}բNE2bE{>mQ糺oϽ+hATqSOq>'WOK~>mw{RݯQ>M%6sO^#C>ޞCp k4<DDu<SO4L_-2"#G~Ek5!*͛]ɱu=w}?q>9ki52w(u8v+NE/*ы瞢KI̹<^)hȸ2/�z^?-!ʢʗ7P}>MPD9C v;q9QOвp]H;H~PJ'Ǖ1465OL7S#c7\ې_*i;OV1SJ4hېSgG"OˊQxXc@1D {oWFxc駟~4rzCOۈzӍ?רvG:)8*nE)W#J*Wva_֬/(AW%{V]7:CO>3P#m٦}\#08^7Ѷ C0 C(>Hh\;<'R"7W@>z~YC,k 6u‘9ruj٭8sny9l[9dҹк):EW!{)<C+n%)/yr"ʇ|d"e'a!RGrE9Q%?8-2tP׺_mfCS}!kSDVZ޼e=/13JZ^ENV翬)+kz{tIN}{=E{9CD MQ=Гx뭷dfsr#5r7:%p5GІ`ZֆEqV[MdED<QY!a쳏=Q2Qb 9EI.׎;(,d{5DRf@5W�"sE6ת1b6i5ͺS˒WQM#:m+(aEHyOOY褍1B.5j(Eg J+9;%*\وzj{\/3o߿()vѤ>#.h+"/^W&lRHԵrd(ˮ$DR"v _y/kPr9jfQRum jB|唵N/mj#SjPJd!Т[FE;E `NER)[nxcQEQY̙bS C0 C0 C0 C0J:T..B,RħRH{c?m?tϩX.;„)ؙ, Zonq'e R[|]qTg8@A1+l2$T�XLQA$d<[ [0 !;%AsѳH;飏>WdRO54odeų܎9}sc$bV(OܢJ+2f踨9<rXh &W^ys;[l<kR[&v3K9}qP~@Ds=KQ@x~ 7|X52,~7,|@p9;0 $l _.;V_}u9BӴ{^}U9Aeu]L3Դ<[e>&7)[~z],ûr9{Vw}ݥ% /Gyĵ{ ɶrS3{Ni+!`!`#_\uUA]`1fm&/|"INqNU! W eUYu)27XEꉴPt].H<Iߢ5.sL5T_Rvm7Yb%+yT.b; $8Jq|Bfȷ7V-k;?ƙ^+h=<qwg6;5QiЪ+".b9]>}Ueu PP+)0Pg9(Q+? d\wu˜qĘmQ7iZa%_B�9 3̐Y&_̄r28*A(Ϯlnn|e@\|3oҎuJS=huו7|Sz)ǢYz)7qZcǎy晧ǩB;QctZLJFYyT74j}0BxbO!`�=X0 r =Efu±!`!`!`!`@#�̗_Hűƍ؟Kq7 d?cy=dZ-FIw =Xus@gС*4]a0EaCeR2c܌|Gșg~*u֤NByoq¼^{ɂ .( /sܓ1"HO{C[0:W^Y}Q[SN9"q\�iB_v%w!-m>S]#A 0):^gʭA[8a"S9dQ rA/"t /ȥ袋:GЗwyNNa)NMU"n.cv)G]i2H~", :q1j(GbT|MO/K.u~S8-d<wH8C)bȽECABKB#Ad[md$AHiǸ}MnRXw-B&8BA?K/ TX[kq2NWXaV,0 C0 CU cA/:r-BLZ/뭷s\ D'{fjaW¼;nB1b)o1i\}{oK9|}"xg^ȑ#e2:]+CZV M6 azذar!8;t`̘Бoo0=hղju͑]ve{t]ctx G%\QV| [[G  vZlffLDz[چ!Љ`=唝Xʼ2sEH!Qe<o0֚xKĞ@+( ȍsn叟0b"tf,.yYW뮻o|Px/VS&SO=˖i] }Zd 4?:'_i,;%Л$^S}Vh'?dywLw>i]^ߙF~zõqvݖ M jj0 C0YԸ9FଳD<R/TEyeoL[%ÇyjBY C0 C0 C0 C0Z|./ V8*Jx^r\}q&<䓂믿)_Jg2ba<r.H]|rS?ޅ#>X?OpN3P[F�G'gqx㍮Q[o}7;o!` ]z饎DGi <zV>\ԑH>ͧh&fWAI.J" /8!_yG:'-X9Y;gC�cڳ>[>E9nС7.6^scnT_H:_askdt544P+)x2 49] ,@"@[zǺvI'TZh!n)Jꫯglh"-Štn*4;f C0 C(d#F\ dW_9CD05ʚ% 8idTo%afsJ^/ӌx>XoOz$Z~=8(P .@n&i !`1|p'K/9~mQ3;Ñ>X 6zf@?336'#%L%Xd9Jfb,[@P�x_l%lAr뭷1և~H/d]tgK\=ɚ{^c;Sw_a>bN8pbKH Y{e 6p[OI]s=Wc9ꨣcS`-2-п)w64:ANs=ug=I+??I'j/t<aZ*J累}GEtaPVC0 C\]T~#Sj5Ib!3PLN!`!`!`!`Ԍ;"j8YwA0$ȬOv_}2'u[OG]vMY/rNIhM75ra+D"s9k)LXE]9Ai8{D,8siW\@G#@_O?O?휁dc[`:+!J`9j(%AnVf'of1.W0'm|j!(oݩs_ß:7[Xow~zYc5ܶ*:m�<+w*{n;/.82,"3܇<mܸqv֣>j}VN<11cdfsFч=91eChU( 5[!<'p)8)^HpK;:ny4{ C0 ChO>3'a D8БuC&6п)B,4ׁ堜|2vX'=zU->c�q!k~8]b%ZFSo|PI>psȀ[#Ӳ`� P_|ѭSۺ52}hȐ!en[u֛k.G13e9-ԍ7l.XD C :œYg5']@t}YGzݳ;W\"DlꩧajxY0bYj"93[<@-6̯Ev(QnMhWtMUR8_CәgJo~炌qu }NPEqY<1;v"y0gU 9Vɱ^P^DP~IC0 CPZD.XEVPPGp̋LD눠C1h+!`!`!`!`9|}W2,# %@b54"q+vnrw\+ÇkyVT<L+7Z`[nEP\r%C_WNhQCc`O9Cho EꪫB8N/aWZi%sokAx YPθo׈zR'QBW^t-5C#y7vðvƥeR|84)W_}U1Ɛ#WXa͕,O@#9.#CCv6sj !F)+ Kqx` AYC�o5l`CXy21 B Ch08a#< iq ^zq$` U "1 C0 Ce@nC:N Ar9 }[\QC0ďSO=68�A!g<㘶'Y?d:ȭON'Ȭ[0o :kU=@![(O[CON?tw}㏷=PYK6lpn-]쩦An+r"cTAYD~ ٭!Ͼd"-p4�̵EC' >!Zh!7_HR !`:g!@6u̘1NvL' A9%@`'wm6l# .\{-'whwuE|% 8Ee 7_] g]a&hg6|s.D6tR eڲZFUl!#Ԫ;{0 C(wWEVPPGTF"\#ꌪ:3P쐊b!`!`!`@[#,쫯bA1'IDu'Â*NxUMU}2-x7 CO>L;Zk圐m0�Ʈ(a{=8 �M795l=r}9a?ԀH-@ �y&NAqD5$6f5t}=]M6Y�b%5J|O2\s9=o}N1%igfaE D b;VjC='*c7.ߑ73d,\oeq$ȏ8o0 QYfȲ0;v|2:w8\M=N7|=Jj"ùm霫^vmc 󞩧qح漰noF/B ƫ8<x;KY롧2{"h!`!|ʫȀ a{ y:z ȥ]tQ-^Mϡro@sϹ 5rK>}ԉbNY+Cec =#G� fi&GZ}: !P~XK|嗝kQ<;2skሐ]w]G8XdBw\tE~®֋�뙻{:(9MSq^|1;j%b' C ) o=wv0Y%;K,8 ׯ C"2 #MJ/ƠZvv*|E/TƐ|xnNٮem{:9c8>P.2'mv=C.:twqFǐr)r衇:Ыթ3X{qdB{#`ZׯjՏ=i!`[(:,4ZV *,WeP.uFbT0 C0 C0 C0JO ]J5nڍu jW+ʓ`}*wN `u]rw:a/RK-%8_qc sFтkY. cH#zHd_9ǿb~ /3 I'T`!`78gCby[eU'+ Cpz 3Nq$&YЄP F@AٱLmG>ȭmQ-NMq0zh?vD8NM駟c@8W ]>3NfB+2,q'[#ybL(gR[~fpNfgf[pe'/&a0 H d4-TfBeY5 C0 C`?D"An�y jqĈ,=lMKd@!| 蔠dz>8ONisᰛu895J~y9N'ȖX`n !t>3A?5&8ܕW^Y C1a;zKvi'<ےZ7w p|K5מ{:}'KɄjLUYF R!?jk mx*g3L+U5;PAؼ~3GUY CF�[w}-] ֧~nG|"D~I;i`0l0\nIo?? *siv66vlenK \W_#8Bc:9 `ZgZcgO!`"B�n+4ZV *,3Pg(v@%[ C0 C0 C0 C|mwB,ȱ'J:"+=ٕ'a]bX o!zsM``o[}9׷o_gFblY0 Eaƌ40H40<x?1 C`8#{qBSC;gǢ7༃G wӝI'-nx9Ev+h.j#"|X#{}q�~2dI3X|F,FC(=<{c7|Eqx(gdM4Qf!7e+g /p)v9[Y{h>QKrW Τ9?.6HJ#sm7{֮?˽!`!`�k`1&HP5L2$2:94rdKb>a0 F�88zNi>so{۬6svv;6=7!B]<sስS`dRX@o � u$]V zx'uRN>`Hxꩧ$ -+W\Cv!8̶!{P!㉜y0 <FdmE':TywF�bO0~J>}lqU=Φ5f@5c,=˗_~YƏnG'+.K,�{CG}Tf9\vT+=z2j(GJ9\sUk4M.s/XYgG䍌Bm@2e]&k}n-Xuk꿊w^e)#ԪS#Ԫ;{0 C(]w1}wZd%@JP ufA9:#@*يh!`!`!`-v%_qEݓP}W}|_9W;3D`aq 8s&JG =Zx {}Qd8;XH3$P@:wQ|_L5TYveAdYf `!R06g  8Ǚ5={kZz-#3qr 04 cРڔTnP!С""j,ޡ�tXqGǦ) 9Ȏ#SQSNahYq B�y1h1w]a1>f癳6[{aHY`~ņ6#`'+p23~qjj0Z U3%+M.N>ɞB{!`*UVC0 C0zȟXeNeR콎$kх~mϹim@ G{='7+{߆. ~] 9'r6s>[З;v;ћgmf|%F�xt 3ݖ\rI.D j* 6̭[mB]t>wёjAja! UW]1b0~~Ž C sEmŸ;l�YߐS 4+˘,Q7oX C`N& ٥_C|]{I} %�B[:Bl,#p_c{VZ*·zH~?.o?V~n\z2<!;Rߡ`ү:0BA4B' C0 B:TD|h- `Z%:` b>Fv!`!`!`!`++$&,ʓaXL-J;aԄ� ɲp`J@ړedc#ZqCOO?6 ʓ(Jz#a쎴Iּ@@#QPo 0x%0 "xb-zO.9Z2k[qlK?묳64O!Л0pk8`ð{!c[zo߾MK@t"&C(e5yx-B�W&1<8({ K٠Ch94w1Y8�o8y6[1e^!8ȸq\ סk駖6GkŚ<:@7G ߩ'cOB- ٫tF=[) C0 Ch*O#i$K <\s9ٵ=6-MCT?]|k?(ΰYI -N1кt?ЛQ:afsȷСcc>8[-=C`yXӎry0ΥC']YHEs5x;6l#.| /tdZ;SxdL/[o-ra>Vg׿_D+OAf*{Rn iO]r2X0 E�{ ^V19+ +q>䗴3f_ܫD >\>hgZk9Fm$v' 5\#w[NIh#GtyꩧdmeTc=d 60qU=B@v9 7;zlvmk"ZhoP5B' C0 Bo?G=h- `Z%:d݂+3x ;!`!`!`@ FIU X}1窷jB,@:w%Ɗ_qtsς!ppr47{ƉH2KI#ao(0V ( qlTLd0*EY 6xVv] wYd-bN&W%o#:Jz "=&#?h8L묟ۍA+6 pB_ L6/,eC�~x'X~ƌYV=XN>Y7Y<!`tE�{Ǿ?EX2d _/&G�x �lpƛ*1Fy~ð27% !y!8`4_3wKH| &mtmY�/+cg~#g=k~b) +OJ톀!`!` *#Yx{<y<$xYߣ8;38 h<`#c=r믿dk$Z:c/׽X9?@#/ czJ3Vb<�k4^oyZ5Bn!e{X_4?^z\-Ҫ|ef?6y~nS"ȨQ."l-ԇN{cD{S2BNy+!38@Exgӭ�z^^S㸼='BVjy3l֨~˥!PA�dqe\nI{uA{9r �uy;;ChwqGG]b/2ꪫȐ!CdwVXࡼwyqnO9n+ȉ;5Gku-/ :Tr˶4HdeEN=SksmZ׵jՏ=i!`A}رFk�#*A%ԙSQ%:#@*يh!`!`!`Y!XqgR&Ă(tcjgzO>Vgyr jQ;(87S~S /3H -"O> 4)k|ւ!P(a` wc^N34ΈS`sXPeX4!P: 8K6fc}EZJT)Yd&Uo0~Sk@HD?gq.CϞvׂ!P4qCoDk<+'+xh:5>ZtZ"7(馝h/2"]׸4,C~_m߇=}8cPWy�8106`; {Ǡ~9%6/8@s7plAY?~$!}R}\ @#G}T3|>gTC># Q-iJ2v0 C0 C| Y<> c@Ipj N~f0g8!�idi{/BO{g~yd&>OՁɫmN .[Ñ.tu7BQ @}e]yؓhѮ0*>߿BcxP6;<Քg-6̍Gzybg[oÇ;լ{ZIn(L2Iy2ۂ9 : [-X&f%m0l#%r--\za Do#.Kz\$y% V]!_dE,~V̱DҧOP-ί" .pج9aȜmx96ߨ{_ /β;kg ?/jlVDoF"Oo"0`o"#rqm\H+CP~IC0 CP?\Dh- `Z%:"O?-uFbT0 C0 C0 CD�?XAԱOǏ=0bM<qu(_Te἟s(yFz,q,c[xr#X$eDoI�7|? 0o92N-QàBg#2%Jޱ77>B1/� Chg߿Yh)Ѣ +Hb";lpbM>3~1[މ9 i7 !d�XkX'}Oϸ8йoYeJn4 N9hBL(;3^G>>6`,wJyMo2&T3߭2y2l=r1꽡??~|0s,g񍘃.ٟ6Cu?o{> 8{d˾o##gf#h>[M=r_5;d. z0{z C0 C0ʀ�s.՛ky2<f< ǀ^,o6*SS[S7{l<2hů=:H~ٷoT_::'(b'|Crw{F_a:'~c,wLmTSM<{tc c6rHowZK,n[it c?2j(VEh9QofgTkME|tdPVC ݙ,9TNف!q81>ޓ=^^QVe^f<!I`Yje?Dѽ ۺ]"9]H|oB |y_H@٣N(s{Ǒ'=,B2d7o0`@;` 6W_}1Y/J za;V.=cgz'[olj'gLm7T(P%C!DRyߊ [9۠2Ti J%MJ(E _׾ǹs9YϾk}^{wc\mnבs'm:f�?<Y[{ jKL@v0v*IPi" A4Oi29i' ,K,@|l'vEx4U+r?] YAH8QFAѬp!аt[h ͛7'шqau6' sr0:tiGc6YoБKs2sfsҀ;ʲ>tk=e_s);#n2/ם`lܱf͚$^:xdx)}D@D W?Y0K?m?-[ZND+USX˵Ή5h=$6>rq}pVp��@�IDAT6MυCKjs0}?@|8Q(;Ό3\WG 6n /rx>N(E"EHG[9p1b"@c�s̢ ~ q]/dfEgffNwW){_ ?q씎5IO"�ǚIn<:2fh;S~pmGdh[Y`ŵ1 nw`^m\ڊ` :KRd|dV" " " " a :N�(m<1gd8 Ǫc tpcxTdNA,�7#ƹݍ@Y^58r8<4Ζ+E?˖-l眸\<~Cېpߌ<i;zP"wio /8.LۻB\h{}2�GO6 SNW嗞fCb^L ) 1f1xv[x<#iSρ6(Al$�' s(&Bp2Z<6(n28NɱX%dQT Y;Eإt12νiӦmJa97n9fvooU+yvsa!G~{{g-(0u&*U*#p?{gx S,pS{;6lIe!nxW嫯-do.ZLsvܹޘ ksxvŹhjì Ryw\ `CFZa/AP1" " "wiW*�Çfn]rMPL6a/" " " " " " +SK 촼m~6a` E/fhƍ0CF_'[mjClNN e-Y$oh�\vmO4N:ij='hoܸ3sY4p) Zn'Iw?i thɘ<-]W@g4v\v0fFڙb|s:t\ Ψ82vN"c^_890Fݺu7"iXG#|eK gQ@]# 3Fo]( w0tŶ-}wA$ p<ۆ`Mʊl91@Ҍ-g;\xgIE\P:ЋN]S0k3-�8%&۰ :0:@D s ag"i"1@G8b~ /bq|u]lm7s}HG�ncM췺ɐ\.M7E഼ X0#qIhdMtS;Ǡ'."|ý`W"2nDг! 7Cl7\[ڐhmR\4 G_c"wp[wDq.%W PYD@D@D@D@D9w8R(r=R$Ջnc n<nlڭiO0`6t3+Xy1Ș((3{q :GDZ/.A'n鉌+g&�19(`RCtaGq12k3Ǩ^N+Hdigo瞣;;gǘ=(2YpPlwţc.#(d?·PO?p�4h-tl{B}sSm zsX&sq:رqBYŘYxsPStڬ82"r6t{8# E *J;Hm{N{ OS5O7.)Gn MJ4,52fF-r;r2ںdi嶹mt^sc|D7vNm:xI'ŋ}Z kq|O%wƌϟykժo3n`ξh"/͘\stBއvg$ܽ ֜>l^3gz8Qx-KX-5A109#pn`? �r*ŖVHH(#a|+ X~ ]ѣ}fkW(&(�FE@D@D@D@D@D@DȞ!N芓 -7&*U0a,MZcp,Ar�͂"YN<8y91WdK, h1<7 m6oAVXi<Y" 3KgMmw#8 tN xJl.4Vc"O#@.KΗf>%4 i˅e/,=qbYh&]?^qKӨB'.9Rpa~޶\`[ q5hDL#IgLփG۠~pp8̃F͚5yq5R\ @ ?[Ӡ8 _<M?V l][6\4{i`|lȶޭ>6?\礱>u2r|vߵl-Yc.wON;ǦM�Q{!Kg~-FSےA`$?m=UZ\AD 8@y' +KHNyf3N:3<M:=s?)"KIhȱ(7bҌ9.ű`L7U4-f`c[n|˥O˅Șۢs]ǹ o0f߷99GCd ';W~|mDl#mG0>L-(yl3iYmv":c vWhm#Z߂F]PPn Zns Npݥ`{l35UL'*~U~0lp:ronۂiwXg\XCp8DpigCb;yh ۃ6i#X7pMp[pݥ`LǸi7~b7]TmƑ1F01,{aׅ61~ƍӖ#27m<-MD 8Lȅn S;l js<`1K.l\ڭ;[:>[\;g{3vw22>#Ӥ:gu0vhLf|G>`u1NJ uc]P S>Kݷ8K>rozDUއt15 ?(r ɸ{L>[%ؿ {0w}o6oaԕ^tNA4rWH=:?42g3JP+J/ _~-%9E .>^e:1໓޹*!UuLUݺ]]:wYMhincF[6Ls[p|u컻wc7F-|7.hݍU+/v.n26_T(hҍQ/cܗ'axZO? �t�y&6n|a#IϱN g)S<}i)g{n1 !+N<ϫڵk{|o`ů)X;@:}=W_yc/<SժUQfͼZj؉xONז{wmUVayʕ+AZ</hڴ'{Ra+Nat{tuRI@Zſ*>;)" "  %@%뮃$4[e E(f&L� p`daX(1=.mN?=m U`*["uEz!YjM "zj8ŋ祹\ 44įP6 RҼ];-hqM4j hea 9M :1Xp5}thҤID |cqBl;%Bb7ə4 \n)/<z3H/Q8p |I@;4s4Ѳehhd$k^0{/Haf k|] gq1K{iEQFiƻXn9r1'bk]6(-޻98 d#7(s LSal /D =F.6I3=YE |?\[G!0q"8?PgOd՝R :�`:h= ?En#יD촦'|dONd\w}]; \gq0s;ȉWAD@RIN 6%"ZڵkCmk7pT0- }0^ӑDdI\[\w?qc) "�h?19 30˅c .vcmn 9pt1m:r9 nMqov1`ڍ3Ñl._o]Fc=]ypL[wmk7`OnKYmG{2vVo+s vAީ &@G_| 9(r4T% б7ű{<'t�͹IY%% [D!N+)x8" 9Kb$,�l@滦{u1C4cOhcqKv8cߍ@* 9F+]9nYT%̚5W8(guO*eӸ%͹_y^}pŵLHAK\Q?NҒ~8p{_;;ԯ_?.t|}G2yB!^ն .}Pd>SPbjGp/j|?�Z~|*5d/WAD@D@D 琩0 *@X<JbrXrY.]zytbLcA,im@ (>K,'i ɊN0F~Dhs1߇~ gq hJNw tA֭=Clgr^a%R0`g6a^*lgL@c^.4sȘ8A9sH1r$B.KCao iFGy"H4B1s"v@n0bp:f|V<69]0Zʻ)� " L`:X hm|Ϡp֝wqFz:]|.l9Ɋm=(4nɛ0` ^l]lYޭg{88a)vN=WN6'\4i?޺Q "v|rFAD y:u|8G9@2p.Ѳ!3Ct�=z$ 'rIESʾ(bOu"<62췲K:hP{ԭքVztXl_Lwb?؍mqf|v'l;8QPGk;">c#^&N[Uqdml\60Vؖ�m$îb۳q78 9p Clnq fns n1 7.QXڍSs Ǻ9 " "E$#>wn`=n^9>C0=sk>c.SvhCA�5BBQ=Ws6_v`θio\ E9άR" "lU"l|t{_ t'r|2rZ ǽ2\'+Ѷ\ c?80}a׮rg}tx   l k !(j(N\ |}Jr/9E-S� ugZG 1ɓ92myw`7%W}$ʛƙVMtOfeTmD@D@2�ٻ@I5|+" " " " " " NcxBXN+V,&w~ϑ2}WrSeWo?==(Eoh6@B xYN$믿Z|7'D+'ս{<,nQg$Ђe`fd{ h͙3ܶ{YW]utEH07ވCSN<E5&ۀ]z*Za}` x)#ɐٓ'OD>3obtaG0NS(dN:pz' �\p[F!j.]SbԨQh߾}kآt`s\wpꩀe⡇{&݈!8+";t퓠VԴg: |/Esab~ab?9^1'9z"@ ΁v: wcU:�St_H>5LK~_0wF?�s " Vlo.Vu#1L|~$E0xA;~rK/3fZ!J݅% = C*U%k�Eڋ<h߀vf~wm"%*G#I@Zy]U+ $@'/ƜWE ; 5úu~" " " " " " "  @+'UPOۖ b9, zh0q -" !?`ժUy"Y gt X?5E:t'mROϚ9s&>cPnݺp'f\5k$SxN2>;^W`k]bw�G톖-5M_ؼysԃ) 0 (" a"`]O8(h/tش)б#LhNtQaÆyBODvߟs@& 7$RQ2k KGΚJ""B]�>‚H">p6D;n2Bd8KM;2%7Z@: PPv4 " " '^{N6AD@O""g P ꨣ}//A4M(93Ɵw}G] I�'J,a"@-XVd_ jqLldI@fVf_?^D@D Od IZuTZ `z8 cE `q=rų=r4s<Avg(usu9ΌE=޲efQ8ˉgmڴɃR\9Ԯ]:C<#gQ0jd .}]o!R`l֬'@6x`i{Gm ̙3}EȖN8MQUn%55u:>xM؊gMf\-aO.-[nv DuX1xM? X tн;p睾;*BRPtرfֵ]wC"+G DN_~( "\|4,] Ԫs)w�D{o5^ B}b#@A- )@(<f @Q " " " " " " " " " " " " "?ԭs," "hH " "ma"6{ζ&>p/=e N44q j1P@GZ "P8P8*" " )'PJ݇vHuB(3$ jEM" " " " " " " `:yWN+(Q˥ cq\ ]Q `ִi#-QR2zSs"Yf7=ZN$gϞXT3xÉ;wnx֬Y?wi'z83<VZaw-S | O/EǎOX[bn|UB pnkrz `�nY{/ྩuzW_E_"r.Pd/9眃7Np?){S@ˢE5}g+x:iq)+`<ۼ _`uD %h7MIuA6< SA�r('8xy`*~}_?oNOD@D@D ^MG,X Axi( :خR$9XX |5lnu{k?<vc}�}Zo|-_> 9z` ^E8g_AD@b%X~!lsM j5WE@D@BJy%ҋb:_~ɹ" " " " " " 9J?|+'z-A1XAQ,iI]NRk"(^r|YK,[_fWQF<Ν;)U)R'?z̙yZϷf'u7m۶8(�E(On{;SCAb^SQ7~?n= POO �gWT(ςb|e?G60f[np7E@D i~xm`4Ff@]wJ%uƫLaԨQv܅2eʄ,Ŷ)<þ֤Ic[:WH͚Z{[RG^Jqش x5"Z/\z6lTlwZe}6/" "Mh6 juT6Lup&*�8HAD@�ox"pY@FCv\DԭA_l0GÁ �W/gQ" N`9Wg{M_/vM9T; j |" " 9C= 7�T CAD@D@D@D@D@D@2ixN 5Nm bmm-cDV&[E}>-amYjd# 4-]4O$+(&zP|yԮ]ʢ':ux._%-ϽL_ g^\VL9#W_O>K/R[,+P*4@~ aHJ@͛h"Ss1xpyyqೈivছnW\!j/8{mК;0m?أ; vLH4Lkm"ջxUVXùG }sU6NQLu@v#pv@.!~_IqӮqX)֫ uN:z47҄~6x)1˄ U&" "S6>(ʊ@Z _*UZ \D@r�!-[U%E@D�;|\vl??0rrkpW_ tE<o'>G?si#\U+Vd_T#n1W50JepV8J%" "蔐!1UE@E@Z"8U'x)\׮<- P-2 O"ͥs7nKi"yX`׿[Ybse^g`׫UfB{$v}LX`(DVZehٲkF֭=1$%糞dNz*իc}&+|YFF� PЫ];`_w)o|w:t(J.o96m>wމk-1hBQ(&~1;0QX8߸BZ8\LY|؏?zDnE9*\*D%P:#0a層k�EW$zXb@b"@A-N78䐘N"3~�њ>`C?z#欴c8A-ꔠV+[f!~0g/Ѷ@r ,_)Vr9+wpi'`(_ꬳƍѣ# W9Z2e3N?ݷv/ S'` ZrKD jԀHw)q#WMvSD(L@ P}AZ>C$:FRDGL _ŰJk3Sf睷 c9,:fwhq њ8>`E~ofD:wJ.&<ްafϞ'of‡b@]vhJx6lقk.;spf{7֭ۦ&/CZ'Y[vϸ*`b`Fa�֯_U#f2뮻}13Mp>Ȭ) " oZȑ~gf,e>#Ss`/_(M < |0p5�FʕcW{ƟS%U2:X 0=tL�]{q K KT!д)0t(l|%sʭ@<C*~" " #`ӽ A1V" %н;p!p@nEw+2d&} vо?/[VTZED WCI ܟ(A@ZE�" " "*Ι_T:D04DETQD@D@D@D@D@D@DNV8ڶMcBu'.m)0_e=YM \lTQ(Ef22eu^\<+WzwGNkF۶mA 4vTZTH)իWN9s0vXr))=Nˣ߳8vޱ#ߗgⷲdW7x+ v,ѣGcb[o6>_”)S0n84jԨc@`魷^>'`X+�L{t⫦:wxkvZ;{xO3iaZ <djE?s~T4A{iHW5CAK_P+VPZN*gG^i˕06wժ|"" " 1X|"1N" " " " " " " " " " " " "PB?g A" " jѾ>)D@D  SO EůsNq.ޡLoh֬H"P0o^v)lc`=S%l T-JJ@ 8'J2he/qVd(:B�VOnsGr|ljb9+=AKns]N9WQk" '~zO kɒ%ybYN4kMrv5kݻw`Ek/ 4;gAᬙ3gz1ԤIO8>QH/^'iQ|QzKSt)0r$pME=&2<L0xy}B)q),P.B׮]1p@4oz\ca h�'\t{/Ю/#8T{Ptic3z"Wݺbv=xb\hgJ^=E5" "@a;+ (EI`cm@ժ@Ϟwz#`UcD@D@D nfԊbVٲ*:"" qV:qD@D �|2в%p%wO}{_ Wa>}| ƛ6իs^aͥ@  CED@D@D 1/$EER%`ժD|D@D@D@D@D@D@RA௿hvmܘdY0O� a 9d[Q8V\&" %@U6XD"5|Y޼W7:fM#c,c.uE%z)8o޼<,hϨPZjxYLWX1mԉ%0d :GuƍKD'[sK$#/VYSxjwy':ku]x(Tq6 xeW+|!NtTF*wbPwĈ,F9s򅵬}%T<_SΣ�H ?cp1);NaxpLhQl{}^ڴ8iUJ칧l6u+�ax G;^GGT-" "P<Ԣ n 瑽s?'>]\&On8�`@O͝"P&r%y3@?l '@{gs] "=b]D@D@D $ :Ore`ݺ" " " " " " #r1Ksi.ǪQh,6'n�`Dܴ&" %by%Ki&�˗GZ<, /?O4v(SLr c&vZ̚58ܹsAQ=3l۶m1x`/nڴ~`S pI'_ĉ''| _m. P΂L Eh?Yԩia%$`�ZtC&Mc{ _…[蠟>۟ТevF ^|ř]\9pzwz 8NEH:gS3�9~; jeELR96AI ?�4h�|/ռyNlSJ@Z)ŭ@m7/몥 @( HP+ER~^ZUKD8~ #`as!k׮a={ <4ln=Pp5Wǧ@_"U_RJN_LI5 > $d,E W^TUID@D 3 HP+3J$X5H-:;tX4.N맟|`)+TTP N]w y(-" $~/_+ޮ�w}Y4jժ儠O:SqϽt<, h-ZjGS93=-^G̬z ^*ֹ3fLUV>0�3|X xĊf0?\p>h\q%aPb"@Ӂ)S^s|<H`X?$�;.�+$@G� }7p Z~+,An tLb�! q?qgY\lM!PPKB(YvQUH! j={+)<N%" " " " " " " " " " " " 9H@Z9xUeز ؼƴ^'P༱ N:t� Jd?en;_?W/?ͥ}6 8$" In]uk_C}޼9>Q_J(! A\ DD@D HP+o�U?$K�E\ bE[;z|! cm\yhMD@H`ʕDȒ%KmkYU^=O(syi-ə~l2m1+?К9sXeʔ1ǾqQGnvG~x6~xO�N:?0j(/_>J"!-�g챇穧? Sشi3#mrHJXSN8sD@2�)E-iotI3=9ͼ˚%~ƥ^ukL:0t/a]vozY.ӼB ,J%JɼI=5WA-I{1zr3EtOD.;SPkժ쨋j!" "zM�F~ڞ($V9@_�*-" " 0y20bpU�=8vtuOA}Ç[Ǟ\|'q<2s֒ϞsX6 QyD@D@rrҫ!'@AC^HOD@D@D@D@D@H_ d9aȘFNˉ`ծ_0' " G௿ҥKD6kdP8k#-#x(u衇OͪU'q6'{Wk<+@bk ̹o[lһ9*+ҌfGࢋ.§~j*-pI'et-gn{VoDFз/@/;޶&2`�4k׋)վ}g#E@RB>?|g$AJIQtG`ӦM}=`͇&a+w<> @Æ ;2rNPKBlY~UhqG`Tu芧%�W8xM`퀎{=Z5 'U$@AիCY4JD@D 4n pn΂ʀ˥"d89 " " I&`S\= |"e/" N⋁Vy!k<+Ӯ{(84ͅLctj[G)%ʹ"rHU[bV@H,8z˖D@JFR%t(N%KG@:P|,.M#h_J:wW.atf(DziMD P()(Ҍ/_nF'u1 fQDk6#eVVg=s7ol޼쳏'uwxqcΧ뜑xBX |z61rH;F̏;;/hٲN�vL ^ϝ;~tq&ID !>zEQ |f(@: <#@W\bĹ;u>>0VNT^, jѮ}a(S8p%:?ҥI{Y0z[7ǀh{M{_5`~}w x p:+$E@ڲiO.e."-8oyc278l]zѤ 0mp%�up))*"2 \vٳaJr֪NGa��@�IDAT@B 8ANhLD*W3XNZ%DE@D@D@D@D@Dr iS;,_Hy=*7˗D@D Z*O4+(|Zp)E,.;vKsD689X/n޲8`Sn]<㞀VsNW7ĉ'͙3`Ry= VSOƌ)5TU43@S֭[v >,/aQ^D@F`zॗɓ_t?BZa}n NV 75rF!3f�W_ˇv! 2�=8 "z_l\�m*}eK3&�:L/j�E<Rߥ;K *@6,0 " " " " " " " " " " " " "'N}8" " qSaø" "G}Us8\t;x!~#E@KO<ejV.Z"zJ=sQD@D@p$6@T_5V XD@D@D@D@D p,য়|,'UXLP/EN pNmsK +HOi\ yf3$X%KDڸq=Pkժ e|ׯ_hVڵQl\Su믿q'5sL/^f vqGh׮(rvZu]f,yNNɥ?;xzGŒFoƄYLE!k7.4"z4=(`t:o4_bҤI([ϣD@ &@'/�ݾ=p�EY0;^?0@ #OÇOY4MUJ` jE"hy�-Z:E̝ hnz`RϞ:�42" "*M�"0" " " " " " " " " " " " "ulj蓋D@D@KZݺ%]D@�}<r м90`�h0a%;싓 苕{\{%KIxƍa~M�Kܵy-P=4qy*'v+d 'e>D@BDre0օP*@ # EV*UPt;e*n8Eh2@blZ " "6w #ڲ|r{]v%O$Gy}Mfvm,/6C}]̙3 w6 eUi E۶mѠA3бcG5 5kf49]7r']vc tMQNf4r5 }7qE/hH3=AG4.k(b2k,t[/&񘕣#C瞃>HX }4`>56+#\ROc ?~Bk3&�*VLtOD |V xu j+Lp8ֆ0q/|{@^0!sW2x@Ӧ}cD@D@D@D@D@D@D@D@D@D@D@D@D@"q &s_Hd~p:&г'DŽ?&OhcP2d9w.0bp ?tP" !y] |yU|'9 ~" " C9@xT|*8P+E`_Ъ/嶻bZn .Z&AO?-2GhkLT -PXҡC4);5Or… XoԫWh@ ji{+Wă>:8 |ӧ~7iVG\)_ۤ8@_?ڷd2n|Qٳ5_ƍce~))SLC)'s7�&�2]L켳/wVLGu4ƍÏ?* !Ь0oO {pD H@ZAJ@ t jB ';۷&j} {lwD H%~sUpN,�؟TH<'UJV" " [ |5@Æ[)%" "I=x?'c/-v�.̟/pꩾ/@fo?lY;I,/r NsTV"$X ʔ+r wJ֭˕" " " " ";YtmN \{<(E!,-Z_ww[(N`˖-XlY>,'dlk eLf͚^RYsРA ׮]ʕ+D5+ P(YN<1J^3ɼ 2mڴ爰i& 6ÇsxMp' ;jPsƏo9=܃J*͊hFGO=~A-^)eTP{͢cǎ<yIPFru3=1>뮾 7p) F>Æ Cͱb k4pk׃Ӂ .�zntHEŊa+#CKӁ%WW^&N^z X&�63θF*S&PݪUPRQD@D 瞀xuT&l!~Mv=[jz@8 PM4gT*ks̭.8SJr??\3xbZS�뇻*@(0_>_c'_:~�$@D@D@BB`HP+$D�K%E@D@D@D@D@BMdɚris;EkkUJ_NڸШ̥]L;4\D@D@$<:ȘbZ7or uQyiWP<o'g1{�֜9s<3gb֬Y6 vygz8Ѷm[O,(yfH#<b~BBA0K/=JÔ|p)(ysYg7+A;"~ *U+ЙFa;SOEOo߾!$"@x |쳾"Z6X{TX <䓞,1X%y?eU@/LpPA(S8i{rlHVH?k}I fpNv(~xX d,HP+c/ ."  д)G( !" " " " " " " " " " " " YI`~v5+J@h| PlIh@K!37o�X A)xe@׮@fw�^ C*@14n |q1!Q L8i&("P�^ IE@D@D@O Oϥ3Gre`ݺ" " " " " %믾4:NsX#E(İ|uvƻ&^5&"~EVjj׮]^"6%P0y]c-~miEax)|z͙_^'5tP1< m&N \_=^y䑘f'O!{ ,_6/0a{2qD&*m�6<p5?8qjѷKNay<6)pWp ;v@~2 :ka"@Ϟ7!W``NwWnJ%�>~+T: ;P\K@~y j.X<6f̘Oc?"TsQ'axMRʔf~n jeTE@D (5eJˡ@iVS%" I'(IO@x!{)Jo�=Va>`swO@* 4o 3f^}0[ˬ%@$,E@D@D@A}4 " !# A]GD@D@D@D kPjjN8VAƍ[whБ[kډd7dm妔$�_,^\,Y{*]4jժ e55e}ͪce˗H̗G+x뭷@;gON<1(ָqcO8 /byP�nԨQ8ӊ$͝;ۦf^.][n #Zdgk@G=y|5KY#F@ pꩧzbD@њ::XuP}l!⫯ /Ν;{8Rl(ңpajղvGq&D&/&2OU4ŤI{(=nн/eРAֆPaKAJ@y?P'Ф p]�ʖy " " " " " " " " " " " "  'f 3cU" "  jw6AD@D;1!6o["g/eC5�' CnHTqX-[�˖tuOt9@ uT㥽E@D@D i̧W@TK ∀@ Dr? ߃wy(h݉gU Ch" "~w|7`rZzX"(z4RF {^'恽aOf垘ϡ=6oތ?0O@k̙&ʕCKݻ',*W\o4뮻#G):&%b)u-ছnB~#`wZ ,;h6hz̀ƭsօ%Æ (O9*ha 9L`ؓ"Z'm?c�ElLNA�%z+?xԬY*ˆH!t>=ऀ(?tTRDH]4E'iD@`~c"XК8#`] œe6^ܓsG{OAJHWhvA7'" " " " " " " " " " " " "P:}~vDx!,D#Ц G*Զ86kSpILj@fs%Uk0o=ED@#}|ko=tn][5 n0q?]vpE@߾� LO | �:�NOյjzN{0 ,Y'd0`x{kN; &x^{IL+x]Xv-нgqڷo aQlaÆѣ(v5'x"Fer~Ws&;g}68Բ~41- 0 bS`i8ѨQ#Ok5(_Lw'ri۶-f͚U,t\xL57xwT2EcСCMg3;<pfp*yѣG{iYfiܸq3f L21-w?7T@Q;{nSBb>ƟMlyosY]C(Yظq({gw}zG}dɺ' sӦ˸`Mgtk[|\pN>dL6-'S"R|\y%P/Pcxe_NbZ!x*VPhS| Q,Eh3~aݿ뮻V2{}W_]n;bNZj׆ϭvKh*H@&eWlCʖXh�eoڿ(649s W6&s�7_kcm1v+` |~aA s\%"#K.+xc5k_(SԯKU/ " " ! mhm#Y{sfl " " " " " " " " " " !V[ }L@V*NA A@. o.MK1snnp=8Z9R='"Oct_~4L04n՟p MkUD 8<]氶9ɞoIFY;b_W($P*+o lo&b/؆Ŋl [zJߑ54ŴL"/ ŭҢs3iºw޼H ~_a_uԅKJ*h゙sg0햊+&g b 6l… /PkyvM5kxa}>j >ۻX?x ژ:'vqꫯ0d,^˗y晅_3kM(H;,) yO-0}={;3Ex)ST~~+IB1k_^sbZ4,D[n) yK/VZtd{ L:TPt睾/-Qc+=:re 3f̰I,Œ<9,8A'0TPߦ(3T3 2O\X@o-[,lׄ| *H>L<⋷ tOi>gTa$PA-aͤ;v,0Qe&eZxuPq+]5Ap&M?g{DžC 1&h=VÇ{YeXo6l#FDM6 #ea&S>D2k[|OX pu<éKSoLezٲe` " " }];oyxVf6p y°dnHD @a&uNTJ@K0goU\J@[֪jy$parqn/7_ikKH駟}?<xѥKp1cڜ ´i -X]s?x$ժz~ Nm.V&9ɞo@n!*dRV^WD@D@HreO3*@NoȢX[BYF,;(V[6OAD@D 4M4g c^Q0:juER6j1Z5Y<'1r)hԨN!r&<?X-Z'E-^GcM6뮻ړQBlJ=;[Ggћ(Zsg`ݺu7n9]Nvځ'L;찃' F!DiAN#+_."SO=wݫyA viJ 8h`b ɼ'9x`ӥCMÈLOXs *T>hoy=X~")(m6=ڏM=39)U&E8Yĵ˻VX矏[~+iD?+,TF^� y)QZ)[6rD'S}ݔ_ SHhꨲdΝabUT?|A2 hqO?�7E4__瞋?|`y0z꩖O3!Oav㸞 }hֶ U6m ƽn K^;K.&׬Y3ô@$,8w6gELnVѣ@A2װd⮹r�Z})" "? jtRH8nf jq9~?gy&(z5o޼~8Z[/o_|1&OmwZ7p1f^o.nM6:tKZмygh6/t!" @j<㉴@ "N*βT" " " " I},~$qBYʢkP5L(ՠV,ns VAD@D \֯_U0kLWF` 7/]n]$\֮]K,)מ={udc=<&Q;P|jժ9(ܹsf͚kעbŊ6!Tm۶^B 1y #a\s5x1x衇PP=*WxvdϱM< :p7ߜOg_n]zS}' {ЌpB̸w_9O sLj6 g}4 ̙3erΦ\E ;{kjˢ@ r-޳" ʕ&X4c+} rlQ OgtZqy@>TBK jٿĺ"Ϣ ?v-*NhQ"P\Բ/|)ШQqsɭlx8яnj׆ qq|'u{ax< [A<ƭgJ•WqZ vepI'ᬳ; m0 (1ˤ$�ECSQ9\ 1nݺ=V~" " " " " " " " " "}$~7\[UwH~JϹuV0 Wjzw &.ǛVQƍ ?Ў,6jm_i>5j=A zUܲe }QYwWm }tM/Xx 1̞ <Ю3yyY*!"Bܸ'rP-a�\)~~:BD@ZD@D@D tTBW6Hr�ٮ[WE@D@D@D@RI9YrBY4sN c~(t.[" " )&rʨY_25kиGN4K.yinۙ!ttZzR矸{;`)Av՜瞋tzB>s ;^L-:uxJA#ɓ'{F\WAddF%*[,Q<?'`}]/g :բ  Meo !%4H$—")"JR*}i5SE9hE"CDR?mcO眽\{5oMPPWIヒ'zZ w} R|{ ϙ3ǜꍳ^U{9,^ P+^~($k… Aqz1r(�ꫯ駟Ƅ CRУG ]dKwWX0M _6uA>Ù <3ȑ#ѯ_?p@' GKܵK͉tToGqϽ{]? |g"?2~.}N­$ ,^|13ȏN_y9]L-e+Q{%)ˀ0ls~{aT=aSvԢ85X'T[-R݈\,ٻwoό 6,<kO ,p6}+KS�CN7Vx|\VXenW /qt6^/X8LX}DS|%3mZ lݰaC\|Ů89l~\=2WUtMyDăzJ*O>뉑Gq͛h uu>#˚Q_Ѡ[D EU�ZV tRCh)mk7n;6iCm}q>ڶm*خJH |Hqp<N;ӉIP+9RZVN;ANb /u]2~P,ZY:%Z6;lSbC^Cuml/_è\[n}lfa �tR_?3g6e5*HbB;iAD@D ?g|ygq}ڵMN?h}1^{GXwK]" " " " " " " " " " %K Vp>H,XXđ9sat >LWD8UZD@D >yi6>CD@ 47'Se{M_Ɇ'`c͢xc8c-Z;W u{`aF+\G4 1Kk9ѭb~eylSd" iJNO!| Vg['ud(W.MO%N&DD@D@D@ҀO( I%0zU X1xqib4CmW. 9]J@ WK{5{!ϻ:;\6Uz!.y{yGy]xޅz7{ر[מfM gJы$L`w}޽#c{wIWB{}vFsxޥ^ꙣc{w#RZ/]w4ϜDo^ƍ=~wdžL3Ϝ͇֙cPϜ{>gbG9vehӧ{UTlPg<s꙳k;c<C9 qF9 6 3^zY[P)2qIo֝s9EcP=s4]yޒ%K:^[kٲۗ'/ %-y sn9!QecWCD[^:u<heuly3zɓޙg@ 0F?V~O8l%3l0k!?r:M6uZqz&h߾{[?~Ox͑g" /m3Ҝw y;n e$ {ezM(1ݓwπ9ʕ+癳GD lY[=v_NrD N�˨&'76Q3L.Z&2 달Cò9M[a_6,6k̅e">*b&C)sxeD03y|]qg<eH"``([zנAM6kS`ݔSxl_={\9]=M؎~0 LHkժ;&FSWzuMsa1nvpc[ xEmO K" l1!gv˖y(iimz>Z-_&˲LЮ\a{HƗ[x6eWvm!l=C]O}eI}A~~>|{{s]"eiҋUfd;/ۅ&Lpwz6lp}$,SھCk6+'WD@D /벱{EXte<?!NH/b⋮nY>Y?L,|E hJV^eND@D@D@D@D@D@D@JM㰶Vۈ=(Z$XXıÓk, KS"U)& Ou:AGd3잵'*xT}$[,` LdCJ*yrM|1 ,V^&ش`owڵn"О{9�`Degd" iLG;ᄼ L䙦gO#zr_P^c]OV0 )H 4p6 j%gI6iߩd킲|4A1I'ϛ5wb'KD<|yLɁ켳gN5=LD31orB2-"֯_*hQi<tNgȁ`QBRt|UW99-Q0b#0:': (Q_r{1w\)Z~Μ9&\Y:π,<n\T0>3(PVF Dž/͛7we.⠖p]:+ 7og+dQHg̘<9y0^9^3Gȉm>?⸱I&.@P$pŢ/Z"q;f?㞣|n@؁8sh`tljq]"ŧ~¹k`9�\`t^uǘYV#޵ɴ<c`7.Z%}MfǯiU1{qܸq)G@2P,}fZt&d+,qM69A'lq%ˈ,˲�`v H(ׅ[ T܇>,(NV"DaӚiĤgZʕނis^u0{ (!t_Nt(E(H'/]")\6lKt=j{j<Nj ,}T)+=3O_(rKmjþ9Q{jA1q{R(aÆܹs+$V팃*H.}.V]p~]j&y p8˜0X"eDʶv?M\g:.:ų^3oR'Xxb&VZ0D qK]uYfޥځ3ƭgz_"-]v{]tOUZS"*9tU(&ʎ Gd2N0'q >HEܛO>)J(:֦IPK@TDAD@D 껷8ɮRH\O<?[0 xxqcoԳgP,e.ԊW!66-|}xPd0btfv9Tq[s  kwϋ|=@zi&y*d<ӸsϷ|I+S~5N 9J (IVؐR J@D+׮#.Z)" " " "lV�.-?\�;>{m/.ג@fXjQU?2cέ`>aBZcbOeRJfe:nM<ChӦ *T�s^zO߆ EuҤI00Gycy|0%uYn נSNhԨ;橧r�P&ΑM< ˅?9u.S}>h 8-ZG )q$3gDf\z֭[iNQLԮ]&h17s箙D{Ŋ]6hi&ݻ'W_}m!q/_&a O„\aF\.”)S`"o0={6L+t'eJ>m (x<1ʝ aɒ%^W,"8v…":(DX01 Z.]ܵix׎ fXbow=-VKh�x8l:||Ԭ {.+|g6A8X @ǭE ":vJN*="~nn:OuJL|WyFAX1[Wfկ_?4slNV +ի\_Da2wŀ}mƏM's4'B`'P\پ& [Yg`uFq[rz_{衇}z4hGe矻l+ ךsNNqbxZ/F9!C\=sΰIu.|~寏E)!<ZHC Xsf�5/ag\jUnk\}5pqSmᤓN QgUA,l Rڵk>aG,g'nD0ñ҉mk1;&6JOA|Ӟ~i9Υa3Hcw0&irRϺYVH_E3<AO<&^|6qin[`"tDZ@r ^X.w,Ps>Hn6(^;1 #sDQ G@$@Q ǩ*D@D@RCeMOMD UD +I[Z^k*Ԏ|ě'DƨM>ݍk8vA9Ga"\Q˖-6_LJ/H賁F_K/GpM H4H{D9]|KLDpv,a:JD@D@D@D@r@K%;]9 .,˗A,O58a|Ƶ\d/ࡳhYʡq�QZcc 5z!,:= f/~0h2?3+`p1D ;*Q(\ٜvi:usRI'_4:C[`[O?4<X9?餛εy-!K&$/5Gu%]veXN.ڵkS@몚_� ]ws>h '8B1Qw&Cwy P @nݺg1`UA4f'Wc .xwq6:oܽuUvZpuPb ?&Gߒ&v'A-r6XYg0AI8.SNg}QɍA@ɬ钚YP/2G9ӫ$HW}] ?$PP+nώr'8輨loGe03qQەu.BJku ){mA$(E )E6lXz-GSءC׶g BA.sZtXXt-X+Z;'m"Z/uջ--#<ҵ]eE-(EySF{E9\�[BbA㽇<&^ٖĺ)GgvPP[oEfLo&OH/\avo:O1-_;E@D@G_囍c2d$Vo֬YIx@ܭ_j TR%=^$w L>H)X`N II&"PX6ə KPlj@|xE" "@>Tw5 |ӟGOAsaBS_w X"57o <e"=}t#Fp<qׯV~9"g#3jSAA6и[_[��@�IDAT $扤(H!=.eUD@D@D@D@b\jre" " " " DK dq92omڴ-CժBY2V8D Euen_K" " K`�-Zh/^&E٬(3N|?S "騸A3`S^vKZz/;1?ñ _fG[moͪW~)E''pl r;٪P`p낂h`<UPۆ :_~97onx}~}{tܸqNx UK\~.mܸ ,,y? M@?証{n~*UGq gW_|/sUadѣy>)a"_q 7F90¯ hyvU"Zj"mhaƻvwO')t&`P;nO͗cQ5BLϹ'iAZwo&_˗/(>|7x+on:Of(͚;ؼy vF /}8p`( SxeP@Q-O283JzZ;—l:8m ԩ6 n&v{^~Xd 됟A>'MƍG:4N)!ZHc۰z}'IfMw}I`36v 4igL"( e;+5 bJ*mbsn5_YNO?W&/*{w3&&LN: lIoE~KEeaӦM[4ĭA>}\m"F" "#8̆�X?tYIV2dHfXO*^{Gv% y?WND@D@D@D@D@D@D@D@D@Dvءt6a|Z&A2w}ܬ>HGA_" %/q֩u FljD!@8˗ƕEAE@D wSSߥ?Zjl >�O"I7OQc{D[`ڴih۶mH7~_fP۷yBx^zG߿֘<Єwg=CZʍγ8?&Q-E lOBnC/<to9y2E/asMl*="YLD@D@D@D@D ]wRY&" " " "_LO\tй3Шl(8vV O.`ka~`z9WNP/Ĵ+" "8MGVǏLj#NP:@N6WjUs~}sҠ9s8'zGjՒV"tO!'#qso;ꨣ8,>WM3:y]xqi/A#D^LPEy 53ۑ#G:[.(6FN5k`&_'�8΄lu9؎bZ]wtw? /[H%ZN!5kA8żӑi9]ttzo8=^۴ 6|y0Nv.Q i+yr&aÆX+b(EW4>¯ ]ͳ5|ס+x>k [iAZᚠx=byiٹ"ۘޔٞ!ZmDd"P.r`iG6^Gj2XXbZ}>_v`C[Ŝ)Jc݈Q4?xu`@ȳ0epe&h=-e/M_=Cf-.[kP>RDyS N=AxxPTB_,O]`R9$b{J<&ڞ~Xz62'lk˰h�XMחi&*T2bZlg=SO<D@ǎmbX8RxT[|ᄏܮ}">&XR Ëg,8|)SZl_`:t3I-ru{챇?ǾdbF" "v 0USg֯_5ٯ>zqVMFի]-pc}X{&6Ld梍m݊<V)5gEd j{&Xi"`S͗L$ҭԊ<wc(bu`cK"oh Rx*5noذ mFf7xٲeǘ8vWh@-X8s86K./`;}pvwNKQTˆ;kMR FD );l?ng^.Ϸ4g60LD$Uxv:RD@D@D@D GPPɰ)" " " i@>̯,L}<,ukvm`s,S}`X+@- h|38ǧ_|bxظw',<~sI' cm$'4nح{/:?*suM^kizf͚N e#A-P48m9Yǎ͡N"4Q=;àѹh*dѩCLi0@JVh8q"?xټ pʝU!F1^{ W]u9sszs̙\7+SMqB/i gؘ;NPE8mxos@e˖ZVA8ңHtM.h+^/ (t/ڠ9+<W9ԭ[7*pl/H~c2Ngye.[`rjApB7xcȑ-5꫎7,y 2X\{. 4r+[%r϶~a Yz5IS]pMM|sf䯍uuK6^pAjV#Ee"P8&ዑ[Q|{&3# C�,kn,~&;FEi|ן}Ս89rZ>-Vن4b0&(si=쳮\DqYi=)ø LWmڰO Ȃl) [ PPkÆ_1|pW{`7^W^yeH#Xƣ7o^v'Re|\Oc=&,S?BZh;z> )ab`ߞbV? lM6'Z3dV &݁=O>RrYD0}5NeE|IP4SN`h"lrEauqz&lYʔYG'/w0lcq ~=Y:mkBZlihBb p6'uК7oPY_" "  Xa嘳>9e^6wXD;[ >,%RK&" " " " " " " " " "P4]\M8R$c _ N2X U7i@,b?LD@D 5fǐV@P}7ωyG<zs-`S0_yC7O01j}un>#7;s)LqƍA"nϹD5oCц @3pW K8&[n er> (L|$3d%"P,-gl;19&2I24 r%<xԩi%!FjՒ+*y@ienRtiRD@D@D - lyy{}yСף5my5jxVH'Uyuz 'xyySiE%JD@D Yg{<Kƌ]veI'կ_+_}\^=sΞ9LH1{&♘MR M<}<L{Wn3Ϲ9huL3"wYChD[ [<|ɞ9ڷopZٛ>}g.Bא9L,'=L{駽 .kРJtA9{1cҋɓ'{kO<=3>ʔ){^'֓MBlP`(x}֬YXs4q=jժV^k99u_+n z_x3Qйljas'&˳./?~;aτ&MX*�E=U$lPx-3h_ ޲^"ׅ9s'vWS7 L_}wM`bbnd#t&?Z*IJ_~ٳn=;CLRE`ϻRϫXvͳrXpve<茘yemHh#FX7{ķ\ݴ,gfu&4ŠWaD\X,7|z u&�]tE^F.E7#WH  ᗅg, iwOp }6(ޟ&AnYwgeUYaݝmAL7f6V"?�vpV|k9{XݻϪU#!y^rz^۶}{ XꫯB d;7>`\a‚cg7oG͚5]KN=Tτ G`ҤH-'c)7*KG+&&/8O[2y@Í}XA71Lŕ²9lpA eHqhYD@D /C};W=X㻂?ܭ ;^/h lɮ{ Ah_HM&0oJF|]S9w\>'XXlc'!X Aeĉ@FcɈu"0¥5T%N�}tr$L@]ߗHqwg̟vg}XQ~_|EvڹFk׮9)+߇z(4.[`P0~yUL'pbS0m3Aኀ@n׺y|K/RnDϿ8[&" " "PVSTܕe1cV̞<bNj.<8s=ݻ c])i&?~X,^ Ve]Z~m2?m_-d 6D%K`\wm7bvF9>8YK{aW#gKL¹^z5̑;ΜL9nӦMi`*a4Vؾ@nR^wvyeZ]C$6}Ql2#@-мys)oy`ds6&�׃>+Li}cw D`s&;nN; jhs X_"^ "V~ EZСCqsr]w(}ЦM8CA}cZ9`"l0жDO&bݺu?>&BϩP[_+s7 > WxZOI_/�r嘢Q+�^yh>u=衇D}B"R9Im3#F�=T\vp;$eZRF[nL:gΜ`YoևL\5v S7UɿoQ'RH StV%:6oCVawA۶ma:�&.XXRv⭈Ww|:$-l3Ѽx"SfP;d XϒU~z?־k�v:u='7&jqн{MR.:h r5F3V�w`:&bH6Vxl+_|~h3|g|rg]hkd;u{㧟YdU6yl$`i(%BҴJr)WE@D@D@D@D@D@D@D _z jc>HLd, S~)Z=z�c9qbfX2֪P>0ztDHD@2M#uz8 I)"PT{ kn p E!?<Dƨ1DK% Zi|VyK}�qtxe]TǦE@`;�ٴ칧w"ϴ\oyѰ!SOţB@?;P)" " " " C~~-w򫜊@<SbY ~PXEZ00G2G? }d,vjG: ( Ba@0S)4'0F+1{Ήi1G;;xD2ixME3^s(3s̐x֌3@v8xV&MePY:0yk;<nҤI8餓JΦҨQ&z).5|K4-$QwiYQ$DL9)!i1 ,@U6u9ߟ'OW.;H)�H䴟Khݚ_gв%S=6dLѯ2F{챸; 51)\"aT`}`1ଳ|gAy 0o<>?|((rI:u^غQ-?0){$R)Lz ^}8(b�8+PkaVDcҥ.K6 Ū8mWw|lIDLfZ{J<ڞbWmEY`@͙ h矻!VV]are}̝k 2[-V�w cmc=/{9L7ʹXE-'D_E@D Ԭ;,Xd~Zj1H/[b&RE@D@D@D@D@D@D@D@D@D@B ^pAN"cH@N))tNf^=OiGE@껱}N$sNر@^^-x㝟 p)Ĵ_I5UF >MU\ WD >ΏP0<[)E}叻8[ҷ)GZ'"PP_Pb_D@D@D@D ' T ]YWE@D@D@r�E(wV/E觊d" " Mp,.wnheʔ11ZN<7r[s@ uVnС;lR7:O'Bȵ)qrJL6 hwn(kѢ9~頛r֬YK.O>$4]wU, fhx.jԨᮧLI~5W2o14h?9>*,9 ^֭3<~)`s皨p3ICVZ%+<PSf3@.'N�Hҟ6ꫯv"p[nBV0F`ba"m~05 %kW[nfԫW]v~ֳ`ʶmۢJ*Y}RH_.fEr0Pھx뭷 6 [â)"м9Ltx_(6E(X6+kM Z^q(W@ο+˰m/P;JI$(S -4(PiԚaj$jeqq%%PVw,HO~ȕc{o9αl+"  z5p8@$L9Nю" ""nEądw{/ K,5͙z*J*23=Hj LD�8wWꄲ�ʮZ\9gj 2gu^jP" " " 5+t0h~dYD`Qȕe06U UYǘ2زEx-@`O?NųedQa`B'y?:9�?# .h"p;mwv"Y`ӉSҥs5\:4޽;ƍWd/\0$G)Cg >쥗^oeT+ʒFcǎ߼g~^N0vXBI 6:lٲ%>$Ā<8nP3'y\oߦsi&e˖ mӂ#b ЏEGvXd(ۓa"EaV}פI1y2LV`ȐZd4M 8c1gΔwa2z7?2(.~bϖ-0!m"ZD} y~ed{e)")ƲW޽3%Jg X[7l_|EneZ3~\t<*svgѣGIR* *]E@D@D@D@D@D@D@D@"0*ԫ'`-X�x`ݴ]D Ԭ EZ1F.jH:^D vٔ+ED TMp껽z34DlL,!YƧʧ}ur%@k:u:RNجٍ>]-K _ҟ(9VHH*h3VZB'>7֭J&(nc%HWtt)`\pų8V/eZ'N$rZ@t%" 9@.,/[bVZ5'egU^=H)"͛P8iӦaʕV*S<y8裱뮻FH[�k ʕ+r ׾}bҤI>|80ă.uj1Fgcv;ڴ5rb#GL]D 9k5 N(/կPLdQ&1|'։U⊍iˁ7�YFhE2!*r矋/M6=(lM.nx"?NtrD 4k4D@D@D(; 8X@MEcE hJ3W" " " " " " " ")ϰ'"P\*VW+GZy^+(*5K/!x\"nɞmi9|YOqS4W&(Kc;vz*K3l@jae_r޿JSƹuߪL@Ÿ,u]Tx :RD@D@D@D@"oc.$`>CY & O64:w)uPSTZfOH2+V bYUu3a>;�i׮ *UT)8\1cFH@k̙ظq#v}w'uyNGabRH3N;Yq)`ڵxwI}OD z]JUiis;l4{ۀ!C`1Ǥ&,{E?SDjoPK&б] #U" ) xb~aio&ye={jernvHC7 .]@_֬ "Z�+'" " Ke?)g" " " " " " " " " " " " "P\6m UZ\1* cR5_1wH*" "PEjמEƇeK&K*ƏN88HKH@@>]�֭kGn@9ʍ\'"" " " " MreC΃R/" " "qp8r <_S5M@LhqvYޔׯ_(+W?(ФI~nlٲ9@KYXf}L6 _~ Wlqsݻ:蠃 #3Ϡ戺}]^9F ;KJZA-K/>wYzjg߾}ꫯ⬳2Gs+ղe"F7�^}U~P.Z(#F^zCl"5Wi"@D P}͝tAMEXަ\|2<h(="(7ٛ?LD@Dz_+d'ի|IP+;ϯr%"PX&RP" " 'f~G>{T)x@:"&nr}ټyݵQD E. j=LV~+?tJ-P\ȩ(" " "P @B-Xf fugQ4jJ:_D@D8l2%E;;'?|~.\@?:t-`{7vaH%쯾  D~ ;֭[cذahnJI%c)"�SѣMR9WяЖL#:LKychX>JDQ~} 8?xi,'# iڣS_<ʞ);֕mXW@~lEt%]WL"M``Р|*`d_DaRHU+`(K>2'{oW1d ^{e_#(.*.ҊGD  |pѰ{YD@29pG{bɒ'+?wfφzIA$ RD &ڵC9ӧßr?W6v)JO("g"" " " "*W֮L(" " " iEe :>?p Ԭ tФ ppOt$%FD@rZ{Y"Y Z|94f`E6mjRZH/(͚5+$5}tkZJ*YfׯVe" &@nݺ9q@E(:#d].�<h}7L n]bwC=Φ})'u7wY}?g("nVW7CED! O? x"^ eGH"ۍ2e>,% /av퀇׻U " %DZ+VPVD@D z?VVXeFD@D@D@D@D@D@D@D@D@D@D@D ZU{ԊPD@矟TE@D iS #G!CZ#:%R'�7z�y(]$R8E Kq}o 8O;@n_ ~ HP+P@ÜK"ήr$" " %j0o^EMÁu{ʗѷ@^DVoU^Fm4E dl/;:,bŊ H9}6mڴg} {キκL$6lh4*ŧC�)SgϞ8̙3d!YV8p@_`z`睳2LupСq8Ju g}ow( r*~LQv@Mta5 e˖-( о=pA@˖~@F$\tcEAD m;?:N$ �O]w'�koO$#"P\W֬+x@X �:tȾ)G" " " " " " " " " " " " "P\~>8@|=lp1 S! cƌ{1q61IHJ'?|80lXgVY4%pi`KeMP+MYɲi$ Td'6mjёLD@D@D@:Z4'?tF췟;}B$cɒ%!Ѭ.L!7N]:qge fժU eʔN@ʕ3w}QHDoq)g5 g 0򾓉$y1b Dnݺ9щ]e)y22F6u)̉ W^ *pYDSsNP . RBMK+V�];@]w5jeR(9#Gn6_~9wepL (�S\QCTG5cwމ-5{/y{�'LQ.ib ~,SE&" " E!/(J:VD@D@D@D@D@D@D@D@D@D@D@D@D~5vQlu1@R >`.'ФIRU`" " %D`„Sg[8 ͚ '9YR z(pm8'5x&"�{|%p@t)p-hpbe O orf\H6M|GksBZ?DC?'RHKN}&?-BXVxbPTV^SNe{QJz*%YAϢ?l#4')bG2Xv|7pwK.IMD 5Nc*i)I { 80ػ:4%؄]#ؠc1~xVꞚjZSm@J=JѮ]Z%O&j*馛lҢZ@<g�: _$1ô@høm;lLMD˚namkID } Zִ/A=MJd ş{.c@ZXR%-D@FVӦ@ٲ %^D@D gݍ|￟eLVT_Ͻ _Mj LD &N[kVoj3Φ2'%F@Z%^d@DZ2!|K`B`R}4�m@H 4UE\4~:ТEhW0"~z|Ǡp?\ްa7oA7vZix%F�EN9l2eS:,ͪ�ť(@+v`n�8bmۢ ѺukTV-(4 /s$LI%p)p\ӳgOB+Vhݤ2(�ڵ}A޽} pv-[J$nE*"�Ǝ֬fE&OV�XO;tBZ$(@ZPX+jGfJI(1 F!738&o.d)b( TQIVbE@D t T <|piT%HD@Dv٥X:4'aJ!D@)c@ÆOCE@RIӭ"k5F?sl੧q$$ J!@`D@D@D@�,�ewzP3v.9NBʒ0~)PV E_9یNkZ-իN:(UB&@=g vjgr gѹ=֭R%(Vc͛дiS<sVmAdz4HH1&aGoDƏrx-Tٲ�).(Y&M^{-N<D3W[@ɞLW/.+s0o뮙N*wO"l 컯/p�dt4`͂2 #@Qi(eӐSO ;;� WD@D@ز[LԩD};'ࠃ-" " " " " " " " " " Ms.̛2ev`s~�vy:-D&1UDަ" " X6Gi<c-*U(W.p@P}7s}5p=ۜLl ^m)LpkZ }QO$xvHF�nxa?_~o`5 єx&�aYK`~un݂H6 j%J~)S" " "SwNٳi/CF`)/ųq̊͜@6Y fF ʗ/y(E1>}8-UvQ+Yxy(KiN hM6 ;F^:tQFF'7b)i/6= |^Ve9^"OljVAۧ&lf v6{ĉ&�n ಬ vaÀ[oz�XS&D b#/K�9f\?s38gJzI`;0x%&�'6D@҃ڵ /�o lTq~G: `}q�ь:1zxE)؆&!zWd" " " " " " " " " " Isg؜L{[ӊFHE@D /ի%@ PS_0dp@˖շP}7F/FƠAp1~;S>x`}?/ c\jT#^ { \~9{ֆ -@Pw7`~wxQ` `֬LΙ.O@)" " " " i@|It"8p<s&@-?�*T�L{710/\EvY/$=:@`"B\^{T>dVʳ�y>>#믿s܊hڴ)8 '5c-˯e/?}uhݺu$SO=ս_4]tɳ]r@u0ASV{V' +K&[E]6m`vKMD F>W[HD &sF_ښ5kl`yjHa- tD T8= Gk I 4NܐN<ֻj8$`(_\KbZ%w$�'0әuDe6;hl%sؤU/=صLD@D@D@D@D@D@D@D@D@D ; plM7[" " > �h7oFsS�m-@@@݀DX ~c8ƍ",tq4ilx'SzܒN*M"ؾv-&9w≙wR|r{}ᰋ/;,ԋ@LD@D@D̪X��@�IDAT@D@D kȞGD@D@D '\9_<#ƍaNSԺxE@D W5c dpѬ˗#pn]F 'E-Z)U e" iCOij(5FCPTk=taoFl8)!9Gv>6n܈Ν;cΜ9!Q_m>Ķ6}v ;7xow*y2e^_}U <>hQ')�ժB).HK,-rJ 4_=J\x֊HK+dW_%Ah[DPϒZ׍i '>@NnKK۶{l[%#P_.zBsB1c _eLqutFuAZ'P?|yLw=w"" '@A-MN>W("[xJ46b֋:w3 xAY3s Vl�l{'L AU38tvFQC" lP/8`i-Z/?Ƀmu;(B}D@B@BONJ6IP+N2+" "<7oT6`�<@y"Z lTd fe˫ًjVtiԬY e|6<Y(HK/gQ@k vfWs9'$PD G \r%Xn=}bܸq܇Z((!e;�υe큛n<ʕ+c̘1&q N?t{ɎBG �:v|RB*ŀ\Q@ PP=7rG? 80Z% v]wW[@Prob�:?gVqM"ahүwMi$]kb: }/D ~x=9QZhd>}k{h^m(6(%H㤽D@D U ߗNz CD#n42點4zk4~!f n:}�jsnZRpt@|,O!@ e8˜1#L7~/mE|s31Jʑ$BNZ֮MdO#" " " l<3οiJN=f̀M) SD@M\t)y7lfԮ] e}83p)3ԪU9Nv@r ~/4+Q@k&xZGq:tÇ;!,HKo [oM8`ҷ{m`,@ ^}؊Z رÄ"S]㫯DeS:!sp '6!4P2ٔ$�JŸA)fZL0AAsTz+p~~C|Tm"Z �|&vk/ڴILbEXZ8C S&MC|ObD}O<<IP+Ϭ," " " " " " " " " C#Ϲ{Gަ" "  HP+2R%8 /$L+"{TͬsnS~1\ ̯R-w 0!DޓϺ3c[׭zk{0]q0u/+QDD_"tJ:R(" " " "vl͝%" " Gt@j(Em=/-`?Ų(xbsD%zWpQ :o {tZ~VD@6n܈O> gQ<kƌXg*Z9.Q- wGy2'~z}a%clҼy`P R@:0Q(|u͚Q~R+4zhԫW^{-Fd#{ y&sR.D [ 㯿=iu ?<v w""W[�xkKP+'fk2 /aN U 8da퇰shx챂#D@ғ�ٙ^vV pqۭ I`NQ[ժ._" " " " " " " " " " D`&MY8"ol8@&" "M�~ :1^KD@xeSKI,rK#^D@P}wt_zeW/?`"s8~ZZd-+o8, rH�Y<h#{"`c[_}u{1\@K/U"  AdPT" " " " 9A@Z9qI&[oo LY֨n u/u%HE/" "�ErŲef-[ mի6mZx'L,+V4S?x?sl?G[mׯ/:J 5+W#l,e3*t{GZ"O\[Ix-E+{وF.2\d~�iS @ #QlK.&Ĵ"Һx=B2w,=HP+=΃RK9e_?<�'zv횜Btne{vԋ�Gl Lw!E.[!(v_]w@H-XX[D@D@D@D@D@D@D@D@D@D 3 |Y2e|g$HALD@D=Gߦ|‡#E@r9bX3ŴY8Yط? 3`n:L;�Wyh4?0h,Y2WPs:q+Z/"P) =+" " " "S*W/ϩ,+" " "r{]y7t|v)O"C`ժU@,2Dz}>'p`?;sXYD S,X $E-> hРκ/ 2'@{7$?G[5kxPtSXwPAbfty{(Zz'@ws΄no|&v䑙jQD`ҥA`SN>vtLg PcGM~*,dlj o�/�*o@:蠂o&M`pv W]סSˉڒ@A \r 0z4l6Q-/hH_D@D@D@D@D@D@D@D@D@D  t\|qޔ?{'Ep`NsDbD1`1gggx* ΀ D9S;N[=3OVUvkO[" " MPBS(@Zx͊@@ڵ3.[o5;@3bkvوfmWs-�vW]Kpp@7E@ZF�]bk%V>-;nM_\cɴf Y~fl@}bAjj}U�=^} !E@D@DLbvfܓ h9+fUD@D@*GD ž4˓e7|.Xi,R1A֚o,$ZsO>]!{.&" >SeYl~{֭[7c9JrNDD =~ J{gL,|Bs McƌB;/=Tbd%ޜ4�ېo.&[r5a`;h [m+ y;\$6a':u*@U 0"yhLk]vnIɴ`^kֱaKrPMpwhcH9 f݂ܿ eD<tf́N;-7^|_9s7""P!ĉf_x{8]@ `r饹yiN<E@D@D@D@D@D@D@D@D@D@C`6l(JB YJO7F("f:4lqV\줓ז4G@J$F6>f?\]w߭Z|+3x*" !ЫT8wCLBȪLarIO>\6LXED|IED@D@D@D@Do;" " " BNN!C,Y7kl.l\0(5L4wIH;)6$Y={NBFF}vQG7 hU#+7n\LEgy~mֳ?>&"YR""PN?8h*}y')ҧ"�NƔzN6fx_Q;wc9N<Dݻ-":B$4=ZɴZO_xȮ%#i@F"#.0T\rGEUWvX.)wlv=9M溨z0천g%8/ qH1IED N8lr環s]oZ{4ND@D@D@D@D@D@D@D@D@D k#PvsOd" '6726 0v[nچ" uJ@ٹ= 7rُ?6L:9 |g!;וMfgKs[6:7{yviW4aY ]wf$;sf;{Uj-" " " "PS,ĔV(wߙuWNDYf1z\b7my(}MD@DH}L[oMM:I�0:t`.lL;ǚY[`<&"j(?>=E7탐Y+�7رcLG޽{.@MxCscA$Z}>}믯m3d!ٚ 8n |I'BBb\%򗜑f]Ij@ H5):Gavf\`v٭;~U:QBԑIo7ǥ87Pw͆%"z`8u)Z$%|eUVF tNRlͦLɍmT3x" " F+V]uU㼯"" " " " " " " " " "P>sG*" " -#@BYg5k׮eӷE@D@ laK2k:5D@DXz-TzGM7'lȆk'0x:>T3:BG(s Y} 9}MK qIuf!@(V@4" " " " '0J+g54oU."" "6_|ELE,OT0]о-Sfm& f @ O!vYgcb2-.jĉ_\X$ Hɳz꩘l8Z04j뭷?_jUDz$'")ldpzôj ^xKV@lOf —+!ab݂e pfi pRD<"G^{?e%C`͎=HʨW>JU]:{ |0\nAQ_%кܻ NlKtӳ3O}H5f>Zպ:�0 X(A"" " m"fodYb6N?첰u.喓mAn*""$Ԛg5HM Zݺ2|)j@ }7_dG13_`v=JJv7 v! VZC,-'RB-a\mmKJ(j J_^^y嗜QDD@D@D@`|$(𥗚!&D`f֡ôiM#@~4נuw ZoG[; 3\lƠ @ڵkg۷b |1i<Yןcm /fۇ,e4D,o>4~~~S뾏~5oߦ_2f{mҤIq1vXxg1gD}_}1~ֽ{w[klYf?E@!@|P}'ɾK֛[}ߧ~[9.^ 'x:.֧O%rH&BJF9}?7W^N;Cb2MlT�r2;xPEDi|=ztl[la=Q&?9ϧt},#ӵ\r>֎ @<NU7ƗAϏ?uJ]vhSJϦogA 24y[HmA8e6lĉfm3^JA٨Qf-"P[a2ww>}ks }2P6Q [y߇y#LJٙf/퍭.KEGUD@D@G1cK|=nj|I~F_u 35<2u1m_mS:000{F?" " " " " " " " " "Ȁ |9ˈk>sٯۆ$Yg1Y/T0~um5^ h NʂYGrBs9oc5_>WZ f$Q`N\m_+s_>lj=ws͍\qvkQ?Nq˷Gp;ܔGZw{G"'1ov=/-GBW&wQ;L0leD]Af={bz,.]5$\!.5H2!|mYc_/W8l%qjڇqkmW3Aw>ί2̕Ϗ}5fd`o2d]w5\Ri{&"P)ӅN RgyD@D@D@ r( ~I;3Iȧf6eJ&F'I|%>>}!CN >=uE@ d6`@n6[o:SOowYc Vb_s,EĨ…�D hgu֘܄2[rQ"=9$AߩSDH>],Ob饗IHNMKʑDA=}.oOd>}޿֢*5ٯ6ַSC1"єlN[!!QGeׄh( {0a袋Y$Z/LVYehkS{D05ٟzʾVjjwЧbH<~q ey+j^ӷr\"^uu_mV?VXa;#*(T*NV]l-8 *PJ@@mXm#_C�{#4{\Q50sZ;+q9> Fwd&RɅ|ߓ2QS͂\+S{/s9gt:uS=ϫUPA쿿٭6ނE1 RfYu٨ߤtGmy HC( !L=K;el3CY9l q;#R 9R&uWQ۬l^+嬅꤃f^Ӵ)" %!@?_h|a+u8ׅƚc uv. RǗ:Lq%?945_>T\uJvZ." " " " " " "mu_GZ2d~\)6rcws}$*k㰬w*v3"E^#|nٮ|H.Wrӟ\rގFf+dvvZ&.9gd>C|16>L%I})>&k+4lm?9]}OmWH_GED0|xߏ5qX>Ax)}}-u N--f}喳%C<#ht>!Kd)Yg yx~8M? ͷ9>-$Zhl%ρ;vj9tS l͞|yFij/cz~N3m7W U`!g|™o?kM{#ÿ1blztkX_w5NM`Ӕ&zv@86^ rE@D@~O`.3?,-!XS}!`2%dʋh*(< ۍ]}k7N~7ESs(nZ\Sm -p 5|ų/I#-߇'`܅R#W,r4+X`b)^PI&po;=%ގ?x1bDH8 _h$+YBpMO[NME,OxUGwdއ&VGLߊC}Nc0٧z?}(a9el.^{?KߟzU7ַr &BM>4*X7շaG5OkSNWs^'>YR<hqY{rDZ-@}ifQ[>g'+?R1m[>5Y{XTg6Vs=Ss7֟6շ>SWo2eJi;Mӷ2>:ٯ}i~P^=[m.Gk؜ ^^& '`Fe?NЀ�Ikxi5�(+cϭϩzwV[mvc56Jz=VAo .F/2^%OZ&;${O.Kʗi!L~ȂLccS'9VsrN)ۼ?Ce�a>w^C N]M0gYtEk*U!ۛMI5|YϞM/m�/mxuI[Ԟz&\ 00g?]R: P~ϖ~>҃W$MrNdu3W1ϯ7.'EvuQR?h:{06LL09o3Z1p3d>O\6Sq1 {uWO_@ _1^+m=詏-^x %|>$絏#Ս)>P'ֹ;N mM/|ƙ>Gur{JZJ6mj+ƙxRh=\q_r?S,d*/djJg%s Eˍ?�WR\Y1ur!#FH\}ԮsL!|/z|5LgUP&ه oy/2d\3@]3,/f нBn=P$0=Z20$M$k_Og^-o}a|獾FjA(s2%\ws&|nIMB>a?߾);`NغUv[ߦf/nν&W}Κq+0|X π{8d�Sヱs=^{5{WAɭXXctq<VCn~+Xc x]<L +Bɴ+Z׮]m֊1nd&Nhƍ^z^yL#O~>$:&"Y.] 2B|XglktdF< Ʌ瀤]?py>(Ν;$+g~8?=L y}B/9'd}{_w1DB_x/j1#5u~};NvυOKܛ6\?sٮo3oO̟>290={fÂx05U>;ӓNsB.MK{| }>*" ;L7QD@D@D@*F@B+'J  -8W:a +^gp}\iCg" ""B _=(=BP\RL_nZO> ,m 7lN*d7 I*4(2ԫT�)JdFwtf?/hpA‚]BPG_QQVe`4pI'ٽva!m"Ѣ |',$e΂шY^0u>S>WSE)ߧz?1hBI(WuS}+QT�Eɾ4 (&T"$i=ѠF񎱓TxQ~Bܜ59G_w7L?KK{[G^q̟&OzR]gi6'KnK{:];4ݻ2mn a*sR%<xpiH5dSk afPYxL4W Id hr5W/ gfW_]s֢ B7E~;.2)dfBɘz(Xw}xϫ<1 B6BIǐM>y=gO-1XGcd--.H(g(\#2.y?{f'VmY$|kY _H d32NtEYr>坅j-k"zk3 UW^'דW._G,-1Ƹnӝ3kw̯W( do/m晍3x?$֓N>Xiy5{˗||:9ΰs?$ט?P¶~ߖC5tS*/j@e s3` dn$ѹܸP# k>CN"=Q!ʕ݇ne.-TLLPNCc:m7[|6?u-%lͮvWF-pQ@/Nc=GgXav>'Dz |Θ_c>j|Uj@U毼4U31%z,B+`4]~>hLODŽIc+DŽE$-*zL剾H5PkD&lnUY</1xFi!&U$SWV~Ͻ'5 >(ݺuݻD3g9Kc-<f?OB,\mg̗>1Cs4j1Z#sd̕|̯m) l,YὧW~w3u_s~F 25~ /-"{*' np3p7M-TB4 ED@D hBS_ jyc v9rYs]m9(~+" !d6p٠A$nKٹ7 3PVZP^�x`|F `ɚQJ j'|8+5JlPaFPL9`)pṬV8qb8W;b@5lv74 =IV~,W1@ 'ɢN Ye ^dJ_cowĝ9i_?M.-U%&}chjf%<S`'B cFC澧E%~F6>u7Ē~|CVdgOUcӫqw5?Mnӷ;q\I|?eg 4\�lݗ*]ziP36`:tmJ Oa.XHJe?N}z=YڍqUi=f藭'[Z,Y*ooFtF~wAf%%w"I]tA_ Gu89UQaر-SN:E9 -!AYHZ|ȑ9oXp<NG{ԊtOC<]h22'wuI\\` ?w&|ZxqWlP[I3gv*<r>d.% 8>6%;9: OU 1-؂\6ɶa:d[}|ul+gs&}U@=@=] K_\IdA, ˏF2dK4.|qYЗ0Y`;wn<'DӁ!Ϯ@ zf]vJ;SvkMڱ170NҷbW#6czgy,_V<:kxG&'ZM-0 /NԗmUp#ԶoZ#FGy$c`/ZkM]HJFV gyf3OB%^z %?lÆ }7I5Xv˴+t·{B2g}6"ҥKHmr]iC٪f}ZS˹ 2#Vrk.sKWeß犸nc5|}o'}<[[l0`CzWYP%j=;RD@D@JJ@LP+UMW ˬw6f~,Ś(H ʋl7L(s2-x]ډEE2++Ș_0p=C]]ץ:H'}/v`R%٤`zjyiyHxoMe6% ;(חYf)#x}8%<ާz]oUz=}%^{:a„hAss3!.gs9vG.",Lio>q>69_u@ ik`S ڍ|ʻO^}.Cx%r!f=gP(;zo�zcxW^ۖ*uO@ud@s̭|n=w 2r#lcwi `]Xwi 춛*fw]cW8ҼK /Gb 2{OD+M5\o;Q{xd2K-eHvnp_ '*rMfoAe*uF�'c%>7ID^Dl>)wG6Dx@\<�pD eP(PKɅ_ȱ^':˩N+/>u~F㊯cFMtՖr W}LI/cΗ?1n }|m#JvZ*" " " " " " N�_ ة` Gft.Jʷؗ%<_!Hdxu'~m%09.^YXw;C/d[6SiEN`GNzSjJUы|\ɅB@tm ր/.hE!ݰ9 vN +/&9Ϙ9l unԥ𪴕?vwC=dÐdDSnu=ص׎a;6$9rd\Hov!_i7h]!`?BƦ<n1XϞ=SNhVIѣGB.lxkݺu+9KuwTGqDq_0Q~\6\QĞO^Op=ER'ށZK-T\gKt {,L TZ@@ Z�K_rЄt{l%Ԫ.R/7{R9Ǔb6Z-" xe302 #ՐN9c&eX ngǠFYNLu�tp!DeK/_௘<Lc97+SYi EHQ)pWc4˳믿] a~a1}oc"Y%@FIca6 |ciV[m}+},s%v3Fcl?_Ƀ|F}i 7[OV* 5 WGK?qZ�ޟܕG@@ `[<,LsûEp|~viUuxQz0:Ԭ_.}٧I%q2ga\n5̱\s,8 ;5h>)}̚ VW8g>e1:>q)sqF%$H{ٷSAKp!8r 52<aڵ38QbqAB3[, *Xc~|rUj�rKxlN$ NDG\g.Bkae�\ X- GnWYW'qija *20$ǖulQTD@JG�W66t}C8[|A~HWi =VD@D@D@D@D@D@D;Ǘ ɚuHW'˟\\],q)k2\墋amH6SkB~2 u|KUD@*Cb?U|~%1ǯdk$pDtYfH,$aK&I_#j$J&_w~,W/>^}lYUEdI {7&( ;;ړejZZ|+xnH}H&p.fm"c#<b IHvV[.z_{5w~헺V\[-ܣ?$ LXP<Ʌ$Zێ>ĶwWrEIZo+lmk/ovLsK}璘$+ԅm%mn]{埘ƢkJRb&4e*V nB @#t䠘ᛧ@!x7I'YPZrBq; ,vx()PXI^1bRh0 H:/ RParYǎc:0( 1.:s*S)$Z*X^1Jҗ+5 bؑ��@�IDATާRzߊ3oNJu='<nЗ҇zJDq#@y_e6y*&-sV&>^d?}+d޷22ƪ@$&Uzy/޷\epc)ijI}^|1'{$.(zNA@.],?v1SU!ת`Ik :zm!3,Io8|r,f131yꩧlرabatka]vUW]5ʇh[ۦ7y7s&L`|MtXwumֳݻGljdQDTHfg&lq 0vy s ^Nxty荐az:d9Iȣ>7Q6`y<X^2i�BPuI2_*"�Ay~3ag|YraOֈMED <8/11ux]:Lra18W)/_]D@D@D@D@D@D@D!;$f@^\G#j Sn߾]@+`,eq݆\[f7e;Њ@#ŮlvjWE~8A^¼e1?xb/~Ш#U`aݓQ?0 ݒVwR ) 7` >>E 1Qbu[Wcyplȑql$ d1d]!WZXVm]]A"3ѧO;48hZy5{՜ҩ@x I+_~9c;6|Yve ;w)Xfgq C#hyсqY1d%Գ-gPB-'ZD@D@L@*߀2^  9lSpR))j�~CLe;t 9fgeAU"EIjzfAT0jBI FchK`.믧:/\D_|15AK<zhkS_!�dJ*f!*UH23::M-QZQWQ\9DPhct.$dJsVjwp֓Fҿ}8i?<߷2s FޯviP=!׶w/fjXl]+{50$osOeO^'grcAFdbM6?Nev${9/Оr 7f#۳ϖ m?.ap45j=c݄]Bnݺeu1nTD I�<qM]Sx@ңGXg-QACN9@nd)Ȫ؀9�@W|�62*E7VM @偊<Pɐ<Apܤ#afjוM!=WRNcxV\VO�St>$?!@駟f-40xbGK}a\1z@R):@D7uYeÆ ?JM�\;pig!1>+B]7OUJ 7f>himeE샯"[rk=`8cƤI,؞-.? xb3f=h-/2z>KnO 祿bKUTkå^ƊCV[mҟFX{5Z<wq5;+$ .0Mj2սb±{zegq%9~[´C-$@kˑZ&@Oۄ /ڷ~fL3PVOE}\IG� !bM> *P4j5GH@hBS!U8jUzOfkm$:3tTh@Ocى'}!e#_(&^x{ E bHK @X{%l�ʈ#IDA h/N `,J"0з#SOy2 S_ (#X "P$ۢo)u8QbJb-v5 7#ِ(+*'| D馛.hw1MsbK!X*S [ WK�f?X2BZv0;Bw#<b={QmYyOVgG'B f睗7<:]wuuF#[l/V@0O46ISN1. ɬ+qA™gC߆n8!&iֆni)@q<>s3fLԽ Y[o=cFS_o;v qT�N. AI-_HCAN:1k$"PSHă%!u s'xׯ&J: `o0)b|a!1'O'85jI;V@Ϧ&e\I7UxRZ_6JZ|_emit6|cX�giۆu+,yK@V L2e. VJmb�9+ջv@PLJfc}z8j.þm #08 K4ؐxr_^hbRG  /;o|%^V]]rJ-;.g;0;Cų ‘P{キukV+] uYC#<:t萵Kx{vꩧڸqlm SoHooOg;ZSz;6G,J|K.FYu>?Z}!ڵsZk/"6*(4-]SBE@D@DL4)V RpJ؄- | -A3|(9(f" "<@.Vn\},(W3D& ^0~% /2[ L3T`t"PCQȑ#cQ`T$]|Ņ>־" XO%0,SJ`TW"ʩH�F~$ay%Dơ@(q"Q0(I1J079VU5[|#We`:T� \_oX~shPGJʂNV' Éػ۫sGֽ8i.=6viZp_b;}WHm"6ӏE j{s9Cl17yf_nɍ Y_DV[me$K(DU@n"&駟F ΋?ptơw>}kQSx6f>hJ H9,Hg}'X3ӗQ:4Cw GYC}٣O~] T*Cq V> ;Z~QX`Hj֫2IghH Ƙ> ڨ.Ճ2ưD[ yUjka#2M#\Ȏ)Lj�~[6BK~7`?w/lF(+V8bB? :xҬy:vmnb:I<m@HlzY#Ǝ.D/u;25;.N8;QUQ{oLX%'xuQy&d]:>Zq> oʱ9s19fki|S[AqrԨQDZ/mu։r!dC> ]e3>tiEW樼wXk 678jZwO>*V" " "PRДgZmn̮Zhjvm>TM@5qu" uJl= 0k߾6AL'1c$Z$"@J ,(UD@j�z*M|ƍ"1Bݻw U Y`LOFv:k+WIS-­^R N,(Ql3eYlW}+ ms{fR78EW歌S}嗑Yqo% RkDCJhVO,1}٬Zk N\|>H i }u.g1puZQ[g viĂcYZq}رSirZ9:d@|Jqn! *"pf?+$X N{ 7i'pww::}]"PV̱v]wEFiϠx&EJIo={]pAZͶ|QVH@8&\HED@BO>y5\1hުaAoÂ-+rڴߌ+1,vHa{]9~@V|w1p ϩc qF}DWڐ!NSrN2@Bl3 8#ɳ k)l2:L|07E"G-2\>~[n]D |]JQ ԂSQ?ї!Z�:6+~Bvl$!/:t$@JL'N]Fnʔ.g4eYzҤI>+g}bi>sα /0ki@ףG+\#B]5|ɱbj=` l6lX5ήsVAGÇDZeu׍q<3wF58Z*$1ɘ_Xgp|mKozI<M~ZMч" " "P9TuϤZ&^xٛo=hyϓA1+wJìo_7;묆e} 6zȑQxJ9#&s 8F(Oe;@ `\3CVAY0YhbbM66l3[j~ QFd(Xb %0IGcW SN$ɵ6tӨfVI [c})*NU8n�8yӟb,DXgyQbJ1 3'kgOe+ڨ`'mfnZ 4hPtwyՌ9駛]rG<fvYgyx㍑Z+'-G #oqڻ/io7m7 *׺ʮzkb(vi'[tE+I!@;oɕ.Bgpto\>n@>9O?k1nRHݵk(DB�%iP" 5FXp$A4!8$馛(r1g c ede>e9,uH!qƓ ~q,k @WIძ&@  O>d/7bEa&0I5<Tu:@=o_~=ś!Bѽ{ӠmYPqEr(啇#$/G8 U;G, )ܹs\Ы(lx^D*>h@?M 6r{m޻>^[o:(!O=e^ {Nw\/x qm1Ԯujl�<r)vI'Ux!`Õ S:4>gȚp cd:؂O?%9""8!b??Uwas)DGs(VsT&4](VK|U9(1:`$n~f]緘*1bD ,@ hoqL!-"z+&)=z"cDIHEZ.eyG+UWb.µ@&"PBc>f̘دR Ş={6l(KxT GȰa" h:o%<fuT]HIsVB[lEb BPԴz ]NkWvԋvmgW]uUuQ#gt-lqFË8pp SH~Rk)(" N +W,+-cuG Jm-B,3qF]ttMQ{ YH;Hwmń8va6|Uݗ{SZ3R> ${"-ǎo6G&I>MԃUE@j�!h I $B¨àӭ[0o׏:vV. dlayꩧDZ}ddtV}WN/" 1$%-&Y3`СCz^_ PuHH9tC0|/FiAj׆ł .+QD@j�6nх� %A^bUzZ~m1) JO;/~oۥKطR@*" " %/B_Ɔ8I~;YjqGa^z~v*9}. >#OB>|x:udwy-袩bWK0`@#-R^ L f^[KTZ^u?2dk2 N_W�.9/8�Pqw޶nf[Y(D*V" " "PRДgZmn9]!J E=" "-!fKte6\f=f6 jR}ݱ&ʆn=zc+tM_W-" m"Qϣ>pH.E�M74!.s9gO<9o{1`"V0|cbX -MU;D@2N~Gy$* $';SL:CV'y( Pܿ+9++634S/)" #@�=kaФIlWɒ0%qR5Kg j$cwKTVp N RTZG$b7(?#_o\`6Z%:!4X8SKqCpj /\ 78SaUWN;Ssʃ[G-3l\r}ֿhr.ol|:<y߶g1!,K.dJM!@q$$A7eʔOMSϞ=cZkBƵ1"1xbL!)HŜGED@D8"gIR6;M66lhoQ+AUjmB?q3d|HLCn_3@']c!cƌ}0\Lֹ#>(}mj1[@aC*D5~$g!O[v@/bl°_N?џy 6؉6l~veh-*%3Ż4o*ۀvm{ĤJ DmvqH|9昣 g)|ȫ6;МBlfU7L7xc&~ĉ[np j-d>;`饗?>TBKh#Zg_@I hBSR:jv1!yr*Jg@D@FyG~ZoŤ rs=־}B J0Z ֊@ رcc?4thI©w=ed,vvqǘԦk׮JNX?TJ$_Ũ I Qjc2qDHo?GĸEY$kd�q*뮻Qz.]o߾pN)8ZfOdR,u%<p E5Xw8]ʂ'|me׵ zm>4dvf}f!8Ы!PbN뮻HpJ0HA"@%$~zH@^LwqU\j$ϗ^Z T[ ׿c)8e>('_@e EF4z ?9[l:묕iL駟?57|cK,Dc1BED@D> ! 2<ꫯF 7жzh_⋗U8jUN)" " " " " " "_ڝwIB E[niB7B( ƍK#y:c{1+ v)XISVtuqRV2ڽ\}#FaÆ?뮻nx_bŌg@W&"P~m#ΓO>|͘`[nֳg_$ƚDN$VI3g)lb:tPOÃ\P6IůjRs4-+^ 첐8? h{w2drcqCWM!YǢJzv&4%ř)VnGrxY}rPc " !f&[T5jk C)+n0jf PKE@jdA1~u1׋;HZ!rY˶jj@kHu7{/~{ޚCV7$\Oeފ'ZmkA'L<9:` H�:][]ke}dm9,[ս'xTZF,$%,`rȾAz_[L jՉ-Rf!_vH`!Yҝ 9±p_|Ŷf:ofQ? =`DRM fCf/\3<Lzk]N81:G{4V-: @^x!BG�v~o߾Q4L3e_|xN2g1&gA,ۃLF5RDނN_uamvu(%_%wMm ?~((po3B@S|ڶ~{[eU>xw{>l=yv3~ 8 RCaj5qb bC5| U]#*" " E�f92.0Lw1N?hbw}6zhڵkWo 9"&yڷo_Q<L|VsB zgwYx'l!fX}u-'@s9}hM7޸bL[_?o"HWV*VNK9B۪OD@D@D@D@Db$+g " "R<bFQjT\r%s=< %Ӫ}YE@ \/uva\5DWMYm׏ =餓*eJz%vm>裘-XTh3LS&dD mØ޳#F$J@Rpȴp衇/RHJ+;\lY| yë^6`ݻuQ+UZD � Riqy7O?mqe2'AD -8쥙Rd$6ltv1iR#p2F ?Nj$'D z(}]p:Qocǎ5d]wJUQD up\mբN'O>Į8&"]0L<@0aB ƀ8"DJon>,&pAdZNKT�:;&Ox6lXw]|ŭW^1hA/:@h oK/P_A턒iIua/6.d"z뭷bpSO=5̝p j_X;eo7t#&O!~7lg`*V" "./.￿aǼ&#W^y% u]Js r#ޣ*Ya'>\rI%Os%,11+/'] U}wyϣ/l[lE[ve7 $;m#@m 5\b}11fm^1J3�*N7޽{t_yc %sva/D R4yh; @ Ou!0' ix ۷څ (j4?1ΪU!%8)ƽ$zs)vbt +@-5\5!R)F묳N|fnV*چNF7瞨`% }ŶnkZS?gcƌ^;MAߵ^yV͜}+ z I c9֦'4hP魒%mcL%aazZ⠃`0'l$f!W\ۃ$p$UdZdEٴ/DUg<bQ<ԫշm)�t$&B _4'hQ2.3VN;=dȐ6韓x4tp$LC!IoО!LBP oq8N3όO8n?k9M?˯yK4-ͱO5Ǣz-!<3C'Oߪk \Na$D"b ?Ø(>.UW]Ν;^{eӟc- Kxdt[ fuNcE}!pK0?Iik㎳E]4&8AzҤI{_nL|"{#2s~ .<ěoUxYho6C"sjY$uzwݔfO2}z衘3<rl6{J|mVd]82Lkv2ythxRrtoUcSBb{O$?Ŀa=}ζ]v1X8\ffvڊd*" " " " " " " "Pn_$Yb%|`w"M艐V BrB$.Zi9|^}A/}@/`è@{g~x=l0SSL[n%t?8՜ ²vZ/4=@!RW /qzu]c?2$S$Nk&Q2l0 ,3.6tR25jmvꫯ~;vqMVx<x6Jm#> VvyhK裏6?_&!G%bYHb6`@%9*eSډ'c)}ٙofW{ǯh8}½f<JG@[;;rZښ]ǟo⸀Q$g}Um(jD@D@D@D@Cu(UoSOɓm緿o)BB>np1K>~L" " [jsv82?_|1ҥKJ@_~^xᅊK %Jח^zFvf8{�Ը!9h͹ `r�z7 }\}<S~<7mHS pnoK�o=&.7n\ PDlڎ1;sb/4<{Ā$CD^4vj~Bf?)/ѣc?_ <mcy[˸kɵo.- _ێãv/|Ղ>so'fq]m|0R}kZ}k[ǘr3qk~S5xEe]6u}7i*24qĘ� =z~$<=&ep饗`*aZl94tp <(Dyn?k9M?˯y1z-EZZjͱzmou׍Atn|W^U7J!%ENs /ΓO>ubx C?16P_*,?>qrd<,g7 rzFw;#&&^XIX=J>s[do8a_˼ k.܏$Wh_ZZo)R]{[R5!.~ac|V!J 4,kr!1p /p JkǹceȐ! +}mQ%yhU뮴켭=O TRh<)eWoki*,(mA>MV2XO[�]vc†d{n "˜RͶEXfeLb+4jVToܭ>ɀKg[^Jɷz7 8H:Y8Ӫ\+ `౷~z$X [ tggu}Gv뭷FTv2sA rnzy@\{9l`~WaK/>cxr)-iZ*RKIJ$$ا#<2ƭ 9E[ESHjf%0Nsﶵݻw%-JS,{bƭJ1Q駟n؛[rF? jU|Oǡj6#G6p>{LHE[HB,5srbcGljU5QV=վrݾrjOsǝ{ؓ?@ֱc63}^Pn.AD@D@D@DrBXS2<D ~-x駓_8џzS/"7Sw$V1 >/z&N2`uI' np?쳣 }i,3(Jҥ}^vpp-TAyZjE7W]ubQq|K8(.׽!)&IK TB -$#P:F"T?a|Ɇ;}ZkeGqDѴMmOK£BiSΦqk^L+i@%FvvuW;CK>'H/ ʼnno}WR}a`X$̩FQjVjmcqkb / FC=T+='HKDc@Z <?4W-dع 3[|q ]}#`$Tp2N:a#q }쟵ۦ[35~ܯ$5\Z6X9w[M?|c5r[ɓ'=<UK|-:5, B0bZﴕ� BV$tMo7VHNPz̟q$:c9&:dq,$0¾>(=" xs1meOאnI0\UC-7J,D^HVh_򜵶^< lGK<> tPJqT .$M"l`￿DR�WmݢMHB�?lhxR%rB:BEe2^|г$ĞY `;cF VߒAF-SR bϞ=GɄ?l5m+*7\HVh_Kdt&n%<;V1Tb;;w hM`5X#yji #b¼K6tАpS>g؅Us.R͡/4=@sy(P쵗kW?36]ӟÇۼ}9d/`~ٺ[Q0ӈaTmw}ܸqnp7|sSwJs qފɚJ}1NS߾}?vg/p%4jP&Ng%}r˙]uU%V)cF|6I(}$q#$nLcyg[.]lqHC;WՌGYxWz}2,wyښMQFE_ kUj@6O]@pj%ot6 (&X` XL|cY LכܿZD@D G ͊%9 *_{9jR QVbn '`G.K"%6*0h rܭc;ݺu,\}g4 %x.q!{mBwi/[k_>?)oU瑆5[z<gZ~q$Jոc=6>1i/壊rVo9Yx2nM\Mj!qmي=Dվ7su]g$CR;:t(,')qbJ@H o=4[<VR'B#FDfq>]s{so }?OIŭ B˫=2j ͸ s* 4fihpvo/7VW^KWYl„_j]4 ȴ>kі7s$'h+KHH\<$|73qUѷ(P+$pj\tE1Q߶n(\fnT .5_WSh^Wh_ .+_-W.BSq =w[mՌ .)1}G>x/B7 -cIl /D1*%2g9Wlby4ƴwmGqDq׌3BP袋�}@[ ؖ!nJ=VzO#lLX2bx6w|^螶VsgUb\sM{駭GQ?OS}O*B@ *9'pM6 /0$lϜ/ 1[sA ksH bUg W_}-B q?6i4-Yp . ب1Mn^k$b I'Dmؑxe]*bX?,LkpYu0)'+f-Rvv+D a",EՏP.yn_|ELfL!^|Eߝz=n&uYS.oDL:r֭ =8ۘ{]s~1F GY)%0cJۥf@* X!l^!g} _aH)S@8'O:(XL }S-" "`G9 ,.D�@diSTE (P��@�IDAT#\;rR ťťxq--"Zpw)>9&6d7'de7<zUM7$8O4nF77yN A~''4A9$z߫ mモSO=y#殻*SN9eR\8i$Ss:D[mU٨!;?_vc.pM= +N8ԋD{>hyܺasdmCeY /kwۆ`GhY!ь3(~st*kV}Qg5\?s=Wx 8pc 8+g}d_"bdG`L 4v}i焔H_hIZPi7ihT@{8ݩrXc"8hc'{{_XwmIW_ޡV[9N$l-pM9ꨣvi~hu]ٕ&Ԝ3y'tt 7t}]Nvm7Y|ś![k/_8|{W&p5 2p_r#T9SGʴ+yZ99G(e4is^=Κ|}B{キS\feBn/=U~NY .`CywV!1WfEРAY5+ TqNbdFhkc:dJ}T/(wN^MB8%Jq,Z6,\@ޤ,'h3Ϝod͚֮F8\Ixpn=U6)u뭷80Kg-.%N;bq RU{}@4_WfAk(-M6TF]?[ߪkYu+_G䇥F{ " ,Bk�TxV!sN矯 կ#b[ u-nGrFWEnF'cW8/ bgw8\?9Y{u{#GxQ{he 0龽f^�r W=5ȡ޳V(if ὅ֩“ȸ?(TGeݛƓnriw@>!c!v4/YִS(Wo_O<NpJA<g +2zchS#n(MPi>4SV(mWI;Xk̮ls 8eY[2kI[sP^ cigiF\>Sa z|+J+VT?αOD[ou@[!`!`!`!Г|8,rOuQT[—mP:E ח?$gD�ھF=cj[/'Ðԯzmt]vOFy`3/ 5C h,e@�[:(CuF�}.tɾp5 )~-H!Yrfւ䗦hnWZ_N φ`?ZYR=b양_-| K/ chL#ognW3Տ)ks3:ImI{o3n`/"{l/TQ` Ap;Y7.E&y{"IF:9묳N/#v4dF^ ,Q=E`N l*}(s}w u3:isB- m7렩ԉya"kO|utaQy4./_P7G8: "E0td?Hs=pΉ&1LeHb/_!x%eK Y_6:~<6\OiǤrZ5-O->ߓF-Dh>2iקchs姭ѱYfOZVCu3|W^x槳칒"%C0 C(|;5KPBzjM2IYZf]F` 謳\ᆧF#4IV# %:9 xi0q"#ΩP8Rε!mv<k'c?n!`y;.;~\PhH9\5K*F"~PUbԡ;½HD WEZfxc΋'eG*Lu>HM:yH #u~6l3oN([ёrkgiHE*@el2Qnsf^^&S.Ru0/ZjuQ_F*$D_|1`#c=gD#`D?|N"j*؏9{5Iy|T½HG .U}ZHy#DgsHE-o"ֺrE%h饗v#Uvm;3W;8r]K.i07w F 'nvjWIkGf%nF:tUV?uw*gD2 mUVv"U+,3N-ॆ#@ yTUC" Sg^AoT"R;B[U { 曵|ЕAoyJ[CI7_ʆVAcHG9Qm0YmcOR_u~1_[jLh&rI/פF42mkD桴:_cbns.=o+u`hk"җ_~ƭ*}!yoaMPfҧ~[˟wy*qGӕ 6<tȚUܻ &{wHߜSZChk7kZ�#rh$NkW#z IW\qE5 cK|-O�M/[ͺo]WAk3㘵:-_JT&}JrxG4䓻Yd+He6[u~QdWQ_<m[1dEYeeyGV]@n?^J+_XUuUAzUg7y}O@/eەSGn߷G `/Ȟʧ;3᪓MrO#B<uxW]u{>2|5mAzX"Rp*o1ƨeUun4Ce%YY~ZC %V $k e/w▤sY$۳>7 mTO: dE>#d,*ozh»羴qل~ :77~釓iFh2*^HdȍyӞ!PCH&'<WC#x:I8DŽYC0垐9&kA>ic!sLZ91!D2ԏ9&}ԯ=FO/%ڣ"uQfy{RU*c!`!`!``']h ;[ʗ e1tnne䌜<`PeޮIYxrOa ̐;'\vy� 2 j/[j;uP}(*AfmK)i-*'Y Uy@ւԡH}ft5K)k!u? 3vѩ 0e Z:MgYr~ B_ܓǜU? IYwI޽xs)1oU~9ގUcd $]~Oy}#|Gz?lGG` 6`t'rO-D?6tN_՗JhYH?^6m]wH}eL\pAO M΂BZs8u4׿$Sɳ.<vpeIH͍~}gZR{}?U=i,ߧEY9_/ƫuY,zKfkk! 䙵FOk.ߜKE'f?:Ò!`!`[Д*nJ ẊnVe72PD!@>"sFyC0  V`S=_S8͍*[``<:7|tI]0(#5/Ddz!w\p]wA"x+T.2({)ߖ{Euom}J|B0FyO!<JۜQ/'3<`Oy+tM6Y4׊*vmz3~Ȑ| D J`u/] ( XX@<ꫯ^{9vjW iGЀrk/C9T{\]"\?]g"#C Eøsq믿9:)ƕLQ~D!>R^c v9з-T:+m]eUT':3\2DŽs8{I'>czʧ|WOG}tz2%yV`pP1i{jT2eh2 UJ(pi(mZM"ּtȚ09 IMi }Z*v Yf!*{I42]ԧs.Lba˘[ky2RՊ:o5|NFZζASrֲ"Φ%D>=+kBKGl%PoVur"Y{?Cz<BX!ee#I&$VŔUTFtSE4UvbZqw35>AO9 }Z|z饗/.˚xy) owΞ%g? )K@-꽎 7&r]IExѬX@>ꨣ;Tlad,Y  yZo%5:UV(-s6.wJ:" O%!}TV΅򤳰o,rڝB!Yh>}r@-ڇ\yqƩ8Wr{7,O 7Dn"wȋ!eB;&i>=s|F8#K6e9Yc3d )92d!sLX̚cB=$;<^g}|o,U٫VC0 C0 C0 Cp`YvGi][—%,>Xtn8t.Heo86#k,!PÐbũ.; N]6a 6 n#*Ej"m)GMB@-byd gCuB,Yr(I>-Z DW# !C9<ӣ; 3<'H'|y7}l3gYzYsZ/+LC#BȻWSN9e8836dȐ4pTTz~BNNGhZ_y_4>q?<rOZ^/(P}РAU!:D_*mNeY}C@8/ڣ>;<|"z;t"O*\ܽz=í9|hzɃG6: &hD<se ;T?4ooZ5˲Ӿ&{&jw| kA_f19rhjcyz:-kşhwFIʒ!`!`!`4|y[*kB,5TQ~!`7߈xM7_f3%|236H)Uk9 RֿQh,.AѠHy'Dp_.* Yr%_~|yd]r-~hV;k &@z)w^lJ6ע k kAH;o-+eyW+_TSM%:k0 58j@^E]M}Ϲ":`Zqs53!eJa'u(gy{N4 u-,?_{aRAOYrG R!_/UJTDW}.lvBK<3_]Yp!WDbQDEU h硫>b;E.Dq= )jP;w*j 5EJ+ǴϷ1. -e!JkVB昐r[]}Uq1䋹2Erɚk9ܼHq:şs@H _I[٪%ꜰOW=]Pښf%뮻7xyhR[.5yZa)?<]U%t6 /ЭU4s7m 5 !sLH99H[8У** {@}~. ͣ/%A{VVo}R& z-$ѭsZ_c'Ѡ#\'ڑ5l:FK/YIeCi_m1~~򐽞.hų!eeو?#Ctl2'.]s{B0yDŽNtoQ7%>A(OدZ4OYsyB.k=繨+*TV|P.2Qۺvww-e_DZT{P%>C Y!YP>RVY!4ڽHܧѹ϶{ Iga4fխ^yBBH9iYV0 yϲLҾ9+`.BC.W# dɍ}e1E{BއBxj|_]9&Kŷ3h,4B cB61%K\ҾV'wqrW䠴ҤNt| m6!`!`!`@@VѪ$YR_Bh7KH}饗::;ݰ;z<k4:>y]OSO B/b;iĦ$A䭨$EIEٹ"駟:YfkJik,9qZ>V4rӎ!kft5VuO紲5t}p3ꨣ {}y51HY:#Yzi1Y/cΪyh]ogtR̻a\~ĐDSmё'r?z?VdU&|8M6Ϸ)]?I4 }rqBqbGy믵Ӟ/^ԣќ -K+Gйcbn#-B{-^H ԩ"oRYos9rc]pc7ğ >Y߃*ctuBy7-'s 赕9%xZ_fg;3Ykլ~uykuRDm`q#2''Zqy?!!W ZX@ji!`!X@F0 C oDԡ0'*wqi E82.sN|(2B% u'p>ܯgԣ"]w%pp@[8aHk/Gڠg7p*As0=Pj=t>|P0V'!`") Wڌ%UU:zQ~I/U6vT95Nƙ/ёrv&J槝vl=IiƟ i# eP�ygyү>0TB +}k4wyg~MiPV8m$ޑZEfzBezO?״6!sLH9֍7D�ӌq8!svD:b" v:Q6ԅ/ %Bga[mU!f3^KI5mJ :E_Ǫ?߈V>~]F?n0P\Ch9~$F狢RNh;|9D�yfֽ?g6[UP.v@f=1g@%/<FxЎ;ָg<Vg2ڡ|ms:q3!{x.6袋_`T'r-bhjWTkx7Z{O%='h'<aO|9y/."q774hR$ϳou+n?Xl1|\QYZ~>lGI︬DC޳$}# %շs~M,<kn>霿}Ϸ{l'//}|+x?RN{4y+um=ٴҾ;SW:Ey`L; Qf3q-MR i}{,r擤sgݗP2DŽmcE1!gYkYk䨣A(*\ǜjqXmu4 C0 C0 C0 r �'8\7)ΗLヅ1jn6GlH>P-Fx 4>y$Lt_4;2ۍsU P!mΥ &vMn 0Fح*K-T7P2ڴ nVѼ] P$ҹ3w?1tjJfypA+BtFcBdYz! $kR_fY:)ͼ{1n }W#{$M|l߱?a BNNG[it {Gz!k<Vʮ~p|_?~^< #>됌 ob߮_ ~ ăGQ0Є]HwQF}rK .90z2wO0/~/?xg.'(hBc{寧F4 hv!sSI[f囵"&4�ymu8FF~ZCu͋3ԽĞ}Wj!`!`F�^w.e-vm'W]u@sv4 C%2,"[9k$~+ߵ?ϷVs#O?õG՞c8:d6s@QAoeM5T/fDlck^舓78a[#u<H8eO6h#!s>lkHYppZsqH8}m(/p{p ΋.{6tSWXy<qj.L;+�~$ݕW^fUWrtIΑbQe-_(Wg)Yں6Ȳ.+_~|51=\A)hk=! 5 f1!׭?iD?d?R9s. QKK.qo*w|QFȟ@v=֬d>$2jfmD[U?Iu|ݚF[4/׬6xښCH9!M(*epM4sZ2]pnz%Q箢y=IPtgC�fK#"xJĞsc/3R'hkIﭟˋeݐUVZ<kki֦OԪ72S8u10 Ce6ĭZqobULU4.O_ 뮻p${!쳏ws0vB:>c)8.@(.s¤:q>L+EYda,N1YlS+;.+!Y8G4[m't_=6˓nPFX)'Y[ySjU,6k"(tw_y뭷(y+eSm+YvIIҹrCƦ i \V96E1y̙/ߺxqo wQJZ C0 C0 C0 C^Ξ)}s`=2 M:WG-u]WDa#*ƉsOL6QG>#v�dx_[P+9CN8Ack9ikArnVѼ2׶גNZ%K*%ts[)'gtF,c_?K9~d}WBͺ/k?̻y6묳@ A~e9j^Ӷ-5 > (*4>[A=\H-B`CE%A|S| !Uk4'4C}裏w۔SNeVld">P~}O0~YgYg%s1f;e_G=SFp+bnV5:f'<'xBqm>>'p-k^|Z=5/r^{ъ"אyjul0 C0 C0A�]Wj] 0P󂞴�]l@ p"/A4a m4^0׸_fs1J|nVe3G" ު*7+s;}W!CX_q`p!8&lRs8L39cS5<OY,)RϜ1͠ԴSOu5׸`Z8̯ڕ2/ͳFǐ$p#3<x=x`9}s&(tIĿolvj"ہ`ZkV 3C5XC6|sJ E^+2�n뭷w}W?v~Vy2D?)5=]x逯1N[C ϗoSimcBʩ[31Lygܜ}=ԂL9:t<Rgcvsy /P(æD`@8o+њ/aM~ܸ?Ś⋻jD[ӔikkV{j|oV 5 !sLH9YuͺF[y7IF;]SOlجY}}Ckr)RUer2 s5|#(v- KR% `Zi'hk8JqV?r )+ E.< ; oYTeb[z*_Ajk)_W5UO,O>I|؇A+ve5{͋~/%1t 9xJu&@AŊN,SZȌ. UN︬gy`)G}[ӝ8-\}͞o'l2CBH9Կ4y+e;վV?+`>hРš@_` <އPCuz&K*/1!k2DŽKS5>6տoj`' G(/|rEU9VC0 C0 C0 C"[mg[m՚_bs-=N F2ž&S\}A b{بFv=o|_6'\6v+8 <[lQЩ!%C x_[P ѝ:lN; =YFkAhVѼ2ZJZ%kTF{=:2Bfݟ3gNYzYkԮYfߕpI }|DX7zm?Gڈ30c.h /,wqGejϯwZnFυِj�<=l;iWBh4'[v}ͯٻHyܖXbf IM5xe%#cO?u]v@@&$f`#oz+'Ȏ;zm*c=&L3,ÝtB/Nuˣ4f׳ӏ"fUpZk'ާym^|!t2=(=YkFp>Ez ?e]R>)[mo}N7} C0 C|գhTƪ+ELkYy(Zj.W$oH#5*fmHyA"Z`"eE-n"pN!`#SQ ֒2Ⱥ29<rWzG;ntvؖ0`^{Zk;wi@wNxuT O tn)Zh"ehsΝ 1{U=G*@4�\΁'7jpH AnatM7E믿~4"y׻4hsqY!RŁhg}|U(Tԝ^`*R!?dGg4HgF|2ʺ^|4͝RVY*t9R!r4EL?Rtܹ;zW . / CtgD*N\=J3_HTueIkv`}ߨv3ԁ{5:ݍhUVvƓ̻>TSE0�8oRTO[չ-X_|;B9_vtIp1>C.oh :HEO1jWhjڻn@{.htOW$._#gY5~w?ڥAk@ckVB昐rVZi%W7L]jӤ94reyI8kUCK Mf-"d)A"xUHښ>൵l֬dyo-m&Ҡ!*Qs!51f'EYaW\ΩB[=mOYf黬5+sLV9ZmMYbROO.:>̍N8!a"UtEYKQg慼<.z'tN)w{Fc1Ft'O? 10Ji`ߨY+Ȓ!&6ɓ0ۿ@~.ϋ WWYpZq7 L5qrf T<q6&-r[Ug#K"[J믷V r<^z | Bv,tr-y ;wy;,ͧ4}4D4hIs=K=M6շ.v"iwyNVl18Q\F]l5d%(=keڐ5NVY!<HxoI4wYI:" Ǹ_9 Zr“¾jd d,;$MK`n 8sox;V@ 27%:&^Xd` o#"+44n(D +!eCAOOx}\=_Mҹ21Yio5\֚#kl%kwǠ9dIYs 2 x~ʶ-/0t#L+[xl:Tt˲W n2 C0 C0 C0 !-)vWM[—ۈ@>N% 7)502u:kh5pv^-PÐbiogCd!,y0):!(>Zfe*cRoPhU^MqH;;<m`rFkA2o%MZQϢBt5G^)dl?Սu e U (@sc1\ssY:#Yzi1Y/*ǜUZ2~CޕVqz:)BȻWމ1Ww߽0z `#dB .ilUX[/blBޙF{F_j;^h Z'tR͎AYEO>y1)䞤=]m_g}.u.d !RisB- i(\?P ~e=ܼl*Զ<)a\܎t}G<>!둼!Ikt_%/7"oFt<멥3;NU/LfUC!>kj|$cB'CmZV@ƏCZsOy?!!PXuU#|zeW:XFdWSzK!`!PlAS^(P\Ʀ t7kP oV|9<N;mώd9}!;a@F7hM9uaG(C,G84 ,^ `42dHt18`?#^U�gInpUwh=tLC=)2w"]wi<`pzS/ͤz g-NȄTFSO- 3A?BXa ?E >tFCFK.qm=8CmeⱢ j:~YexNES~z7Fp4DB0C?Ȟ>r)=܇&1F(ݔEp̈]vb%Okv%MZ;R8%E1)U!QȼNԝN8j]I%MO43\U'=MAd}{]y=7-B[CI_.ٯ_?I>~g5 !s 6*㷿Sa2,M+l 3]w]7 heTO#o4%yȗJPcIq's='~NTY*C> q`3֬8pac fܓJ[!kVXš|HQSm%`X֚7f5kZ9E$CUOOฐ=N kXc>"!J'XVwNU1x>awQ+GUU׹.> i XX'{:_x( YB]ۿjIsy6"l*W*t+^̩WeHyeF7k�?RbB�[xo `|MSە9<裎oza^Κ3Lsr'J븂Zv@-o(ξS*#g/$ Nwa'GCވC,e$=kEǬ5NhY!FuGO0\,<t:MIbRPPVNsZ=i2﬏24}Z CI{0X 'it<#?LԠ%T.M"7ʒ;` O/TJBe''o93]FzI|secZz돡sL֚#klc2ǤN=1%Ep cW73ƙW} ("fp@ˍU}v4 C0 C0 ;��@�IDATC0 r!-ܲ攵\56I|xN`O۱2 'ݒ΅5)50K/9kS9R(ܛe{2>/`ILKyxԡl4\ȾOx`yy7ըkjYzLz|?SIkVik,ݧN&:8I[ύ+Ԃ;�>X|kft^ƯƮ*Mg$K2M?&dLiezW9K'%]@.D inwa?0`QFgu 8?·Uڅ/q':cs/24:+~KԮtq}7z\=yo&W'x",v7@BCZ ۊ/E%lsГ1Eg;ꨣ)tJNJK[\|B~<d~\ve;};bNX^_^IYkDN}=D~֪pAZ!t2ަEU9oH!sVi~Z 5O[$Ѕ= ovi'?ӱ%C0 C()C/S U ޷84c_/#PC0,v-RŢH&B�G E_E<bqO8Ln :D\`\_& g`(WO>dP@ J# P@,~3(mϋ{Q`oqj'H+ M]8@>;5~e5GDOIkv% }n;PR]^9p 3YJqҊ @U N%3/ښǘ~e3c m͢'|mJkHB昬rv =}hOs\$zL9i{1}ݝ820J"(N g>ikVXB#5.mmE[exps4 *{ZIYD_ۦIZgp^*p]o%ݎKl࢚Q|bcw- C�[n CZ0,"`_민$Z\^^^WVYW㏏4turM�\z+ɳ&#<zF]|j|v!Ϛc _tΓuUWEs42Kn;W_0 hV[X"RެuUVYEDKh/27fЊ*+z"5N-gsK:7Y5{=/t6?ygrկiv޳4=uTţ_&:"+F}\u,\nT%yxײȍ #!DvgCJԟ9W4c?9e1ܓUCgs et}=e=tG96$ZS3*eo0 C0 C0 Ck~Ek/F|0ڞC^I2EWyve*Y[֔6>Cyeo32C=4x≝~v) 2">i~kV:Užʷqb-tE@$ikAښS\-L}ԣ\3y#uxϫHe~ ed}=_o昵^]S:)Y^<qc 4`sȱvY/O0 :4,kLGQe`^6I!o.m٢_ݬǷDMg7Y5'G-.#;κ\0~n#~LJNC5J0]п=ܳmIԭsi:)tdտ)kU,|4�x@-WPzkV~FoT61fչ󴏠ȟ6l6SvZTy[2 C0 n#"N*2xKw6V~va|AZ^DEWOYrFUW&?l=b0 ?l?Z֗#rm"k9#,2"O=%24#^֙LjQAN;:eVuz\Im*wߝzk7,*l}ZPj}oSO=]*pF)ΝRᕜr)rG+F4 A1DJ{M3[7 F[CP**Ѫ"ag /8vʒK.hټΛ`w\q:x:-Ծ}czȐ!B uV*0nkWWJ@ ҒtMrI'C=$;SpA>oYmatbZ!2"s%w,O %'phDQeֲs[嫈vXXtlOWmGϴG-El?n_F䭷D[蔮s蜞}o;@ɾ.R9ꨣD?nTײDjpcNT#`aOwu 7(U5j5`s>G;>XTI;]r=nvWbM7}Yd /N5gUw;oB1q! fZpjC^ik# hI袋{Yfɝv[C)#igm+w5|͝L{*A BFeǡ4݆O"mLsLL/I$vV,,BJ[CQP|OUȝw)5#[oŪ^ du4 C0 C0 C0xD8Ur[%akj^nk { cƗ c<9]``4%UHF�U/<Du;U/Jk!6j0hɺ+n UA61}fծ3 鷲߳#[pKoI^{]v<2s8m(ѭd疙gY4HWkc {;O4ԉa/ t9_|\̚r)Lʸ dBW_}U}Ya Эt".[OdѻU +#裏ʠAԿrCͣ|} oFYkRl4Jy#dNc^Η?_Ȝ+LJ`T)Y{k' C0 C0 /p~fX C*F ƪQn"$%4[?0gIuJ+$|pwǺ ˭4JP g}Lqx;lnk*h]XV! \p:rG:%QFt/NP@Y0>[l![n 0N8$dVZpn]7Z?D5O_}wUʝncChuf7 Z8$ht6Wλ׸*Yo8]y_@Z_~۳i=Eڛy-{sv&͑]T}<(Jv%ᣏ> i;82`}ب*[p)|8%Xy[i{&\֎ȸ\sY=xpvvt`0s"#*}饗G#G ׿de-ҿ3N6YJL98WQ'xWO>d7[o= 8P(tM҉f7,nM(!M[\z c(-Ҏ:9e=HML[F'Ƚ=Pgx~ |f7\u :]L0ARsKy.NNJ`q(nF!o}k O?YY\3W2\›m8{b>^A>>䷿38c!`!`!`!\s%W]uL 6@&xbgxe9 @ |/gtb/Wat‹{7^*/A>y+l+h?7v1[l1N,j9{lu^C8S2 ]m[d`X!kHBs1SrHEI:)#U­։!⭷* 6lOE]lsI/*衽h?[ձI\firF1 <.qӨn/:`p@o".-+vrs1vmW)=dQQzIB_Ȕw;B<Ebҍ{goޗe Lb#O `0 C0EvWtrŕa9wn5dq;[vJh+wj8'j%pC0kQG%ɅK}#QȊ+&YEP1 J,s=W.B8`}5^'ns̆\g ^F�c=悽\qnQ@1,;ioӍ EFmdK׮僀|p\7|hpc>rQ4+>̭9y?p .@y08F!yŨn+<gT.m#2е^<+ZʭY THКKߊ.z+KC?U'p|rDI88.%e >^Jۿ{c+_ vS(oZο"mEtKz뭷L-YoM;mT :TjY7d'c9d-tAW4O?7,;AQ!HN|g^'ɊJpN +`[ꋴrmNwYt+0?.$2z+VYe8yR}$<xc&=<ȥ4ժ@bd*8=[doj^媫60 C0 C0 CG� 7gs:먍B H@x=Љք{M79{~X_|q8,UA`-DӸ}Q3Mskɰr-'K.6h5]rv`_cyۏ?38;S/dg5XeQL %r7wgrGD�x| ~BPNuы.裏.wuL4D-W֠>>lwl-|ҥ;QF@/T;C?쉵E]$w*mSR"p衇:yopW!+y'K ݴK w=" kP+j!`t [t d:y~2:E|Sdi /zkrO(C{՜{suؽXɆ!`4Wy xFoEʇϒeMCQ>qi#/24j#|,m+P1GӘc)|,�rQt[ @&JJo+k38l2ꪫmg]jaGcRqvr+K-y8 $eB5_.@:e,unēѰ߽�JO<[bp裏<A[ga5;(w~-!P57h( 8,8*Q0: }'qXmChT2_IQ"{T<k?DԹIeC?,^{,̒o![%`MAfOz tGˀoW'q^ A.)f/^ziǓ~*|l6e`}Sq!:,v*nLs38jVCSwZj)s|炇́|Fq4ao%W8_Eϋ920O<3STQ)5Z)%C0 C0 C0 C裏\%q+-L>=JkGx ;:ux5t4]w]nzk_"*uVޣ Rf_*Li :J` OWWa70]+}Kz~Cׇ x駟:ף?^%O?]ve9ĩ靧/n\O>k {S̢?;uM6YKuy8 y> zһᄇL52s p=lSO=[ן/1yskeEC(}uQ+9GGS֘ ~;dW,D=hZΞ4 C0rE4Y,V#ʼ(K4:(3+,+vU0z�?E}D>4OeβvqRL9NfP/^xaYa4xزNcA]1 l?.w}yr:0r\sMxd 'ΨBw;.Xa_~yl:sV5VUC(#_|񅣧VE?BW 9(-֧~! #5餓=h�`\ ]e>?v{bV ?mRwWdiYg%R&v?c-@YI5 ;gy"P6ۈh\ug-4Gt=Lv_+09QG'qBWj{z.iPswd*cRÂWv~NJSN9,"Ȃ .�Y2 CHE_~Xyw|ꩧy`&ȿ#{G.뉵3<x!M~dgE�S, s'u:9gq kjZZ{ C0 C0 C0 |owOq\-d|jC0�<["#X : I&Kb 3s|MY*"džO?%r/ P9|L -C0ZG�=8|B<>=I (،C7_}EiРAzɹ[lvstAj_5g__A.h=Vjqq9۪ۯT-T\2?7>rVxK.q/lbrAe |^wuJPM7Tb !@^/%?zoZ@ֱ' C0 \Mp*3 8Tȥ2C* sL5p`.YV6ߕ:!`Tn`Q"W\1́W:A7߈2EϿ6Rp"NʐdD6LdE ꇿ*pĂfx衇pg( L0AUd4 . @<N˯)쬨�3Q@] 1 ᥗ^rA_p]E e^tךht {Uo$AO%ՕW^ibЉq'GQ*ufH®@G /-Yblr4LLC[QΝx≻-`CU4x0mgwRکJ-tD+' ۿc C _^4A{J]N<QSNqF�jtڭUˌ3Xd!O>\tE ]wU VE=}D,f67h~U,߿?ϼkMk7@/!�5ez2!>HFydG3[l1'AgigԖ9TA^C@0$acmP[2 A�?0^�}Ajf!`!`!`- /:@ |?"�.crG Ch |? t-wqOeP@ȽZ2z 5)UW9^jURE"PC1V=rEM>º:8mAay@G!O?-O=[Pb/ǗL3sxe&/wFAr-Yge"n[NWﱔ?Cչ/c�=SmC&Ur>8*%"vW5\駟^mVs8ߌNK!q;z I_b4HW' lZΞ4 C0rE4Y,P#ʨUF\%L+vU0*d]Rُ*A+^䤓D6?>,gߕK(V?>gCe" e{}>',E0O j1hCa=n߆!G�MB(̎"%nzޭo3BBc_y{=VY@* h+^uXǁUiik0"` J GcM1#OWYZ`o!-׬}s2 ]e݊F@eKseY9SU .@n;Ecq"[m%YCSv_kr " K.55QqKBD Dh _'>5o 0( n#3J g(6la@\"N(Zu)sMW7<U�Yڗ FI qL4�\ C,!us_|Q8zHAR&813vI&n~aA_~ !`T~Apc FS-|VAbZ}׭͆!`!`!`@2Ȩ x l۰M~=>kL!`M O?`Yn~ vZ^1&[+�2 oJV}Q'�%[W_u>COegYf;9V!`Th,z |oGߵmBUf>qQ*B˶\tA:ѸDweKԓ1pǪ:r'Y=" /L ;eM&r9:^e+ ^{Mn&??__H/遧h 6@g=>z8U5zꫯ֜mQG-D]eZΞ4 C0rE4Y,P#ʨn(m`%e^l|W!Py߾쳏Nj X!VRҘDOT׫am6M<_"r5"*ޢzw}(?#3tPux< em~;W(PJ=& ozمExFWq!�Pt#. "@'tIHU}E9NA- Y úSpSNNq!` u{CK1݇2'/M'r- LeiVU79ء&=>Pv:}e55@W[U&tX "p<P]}5Ѹ2dq1 ꫅8^s5e5(XxXC�r nFhwf6H6qNʺWKH'} A[~g\�}VU<`%9gꨱv@�>,r^z$k�zD8Ac/NZs S[ Ag,!PV>syGg^WE_rOS?yG-֯X/C0 C0 C0 CO>]`Ƈ` Okood@<쳵#vȪ]`-:jl!L2ȟ,=̎7E[7탿`[o96lY zm=حr C+@|駮Ns{hMoAܼrg/;s1fu/{лKvm776Qz|W�dvpC{a<0r;<뮻^uAy|HQZm4:+xE|E7#;=@#˖ Cy>; Zyi e]V[n9Y~e &h>?a'Z@ :v!`!+RefJUku!܆ed@**VmwȦ>>u"H;GD.XTST(ߋ2(D$ryO= ?3 ~H0Y2 "^{ Q(BZi9GLo1 t r1B(c�*GHk@OW9.BbN/8me^Ys=],Ғ!`UΏѱy=myUۏxAhE] ?U*]r%V[5B_SarEVnU9CꎫC;U/wZ,3,cylr 7 b)dWtVXA&|TJI_r>S3ֵZKYgjK4X̸-(OmB� I$i-!P$:tK8qi 'l򁛐 3v=8o3>i| 痙u5 ,!P0x?4;=5?``8Gj�0 C0 C0 C0 }g׆M3<>-D.0ϧox4)%CENgydd䅖 C�y{bx@C!lq Ah:zk#y08_0 "88G$ֹB}?ƥw6պ ՠ]z-FW A[oUV^ye9Mv~>Z<H &l񔭮e4#n}YgcY[_/%"ZWBw<oJ`:>>:v| CWԊA֏2(:p@Yb%d2WO:veE7 C0 B4[l-P :*\T o2P6+YVUC,*Vgd"IVD%I'yc.Re�Eg}(G b?,?ST=iu> 4ʋ(19?:A <s=SXfס)]pnE?ai+qӲ,UC[ҵ*d*os=}Pa1 ±"bz'Td^dI%C EgyBc_J,» `CW\XJ 0`Z}5mo WvZӻuX߮h@!a*p Gp;!Zz饝[2BoϾ{}E+-3X]eU)$su"l v;Ʋ׶C ď0g̑&tR&I8B`#K!`!�=A�942/9G 2I9DA|�&d*M6YZ1vDos~莐q2 _N;gLYN%F/t s sJ<3�?](-5j3{0 C0 C0 C0G�v/p#<5q)#[dA�)Ȍ˓"G=: SN_[M;WpoYcΖUپ*}>@37i&rk@z%-!)).7zR|X?zR%CГb??/tq5|Vo\s%po :jxq.`5%!"/|e[:pE9=!km6Rz5.b lf[_ȣ<xJcROj_?>==Kcʷ`!O?}s=|6n- /, -;x#"j'F$ E3 C0 F4-P/hbD:B* tU0*M6XKyI>,aBT+* H*.8(D@P"|yG_TP.T�޻}�-Tc>8 5c;zJ_75 m8NV!{rd}*O5i+ Y*/(ccV~sDYYi9 ,oZʋ?mt# qC cKX~cdӋwD DRd{o_~l馂c/&8|;ZgiGkv55{yDdEE'Rv5){-N}P#}3d!b-cgQaA> zH~a ύe]V ,6Zf|-h0KF�\?' m§s4?"7�徽v4 OcwA]B $okD{WY.sgpcmkg Du)0Ag|,@h1K'P+L-GC0 C0 C0 C�NQyWa~xޫ4;9ă+_ƾؒ!`t]o}0dA^vfYgs,s}f%jB%:%=@6U/* u.?~ 6$(;Ao?LK!`!zC:[d|Xztg\ω)z 1,b>~rW]$6vm[rrgs96YnS(Jtae] 4H~{+mlлoY8 :蠃d-l[oYm5Qz-cV ?"zW5(8k>EA1=ourd&އ?/U7;oE5j5B!`F4Yg:9Z¢l|SJ!OCFsb&hS盦|zauQ]R!!*w.e,x|<ξ?8A  xE ^P޵:�PAu|ppDB'$>hW^{dM0-N=M$5gqذ`?+{2=-V }Q"?ܥ>~fGh+kVֳ^w"fVִHPn2Q>O@{$0H{=dU/*öo(13<s饗V\ow]VI'*皵eVlZN*ۿ-Ȏ\R'*r}eO�46xbytI@[>3쇯?h>ZM~w2ZsE_\Ĩڛ`ԵjD^;B屗6H6Y"ڨ%[![dBIRQJhA(DTD|u\]ݽ\˹k9\眙ys̙.7݌X<q^&iȹM[OdF+:=a[ƹ`;3<M `DGY^<#p\c\rؠ 3l}srfb&"~\0&_1:h 1m9g8 :b$<1<?S9J?s(" " " " " " "�p~tf۔#ܲɑ*9dNrN-[zD`?H {aumEfZu6 8uoh8m A Qլ<}S/ :qF: ),eccpbŊq1hJE GPW6ǻ7XV ~?R.ξ'n#r(j1G:֭N8H;m :P3f ^x؜''d&wހքðabec۶mݻ]vtpB<3xcG}46K6l�$q{@{#�I;o?J~бؼmΏd�8a,L9{z:ԩהmb<4(:<9*:;])" " I%MRqfr8Ǒ¸j7A [f~gcSE@BN`Z;.(_;;Z{φ8YLtL�t(dL21y 6cPH;q !&~! pU#XN^Lx "@Tr�ISo)lSmT8-UOWѶRP]1s8NJ)Tc 44 $@cT贶cUl_)O!: bif*#_9!ӟﶍYTnRcVטbbˏGrL[[7 3p?裘 ֵ#N[o~]UÂkY"?zszhS 8F<l~e͛s6\ g䩕+v7]LA Tv,`pIa|TŋA,-Zۦb*cuH]֠A4l9ub#0 ? ؼ׈84萇TH* ħ4t`s #m@qP;9H# m\ߥûZ.dͩI@ֹtmA RZ?>t _ط/vK@ lpH%ֿXj} [ZM)/[,ZxR9 ϳPID@D@D@D@D@D@D@u/\Wq87eۦfs˜v[(iK<% p#aFczL90gK՛&!@U'j)<K.EYUOW>5sd \8N4YHg/$t\K:q*S-{0QoAy8:ީ}SٓJK(C6i$gt4^|Řݏ?;wF6mb.Sc_ꫯÔ)Sbrut0v'ǜEIV2NƍO<SƜgҩV.]кuuo'N9Ң. d9N׽t) ?'|tV,f��@�IDATT͔ 6U|.H=>0r,xa+%c^HQ\FZ{F'oժUt�gzWH.9 7dT(9*,*" " $M*fr8YʝNFIȆΆ2dOTkXypG� [nn=\̆phXrуHlٲ1A7c+)') LG2U3FbƭӅ Op7fY@z 1.VdJRk[m*Yw:~c =5Évm*ٮ2R(UFOiQ P�*(06B)8蝥dmm Cme  $- ]ٶ *zҩT65mcV;c2{D�s5؞meK Sl[ʈΞ 4k mN#\PxcOG 4㏧br|5裁?jAT ׬xL*#pk))\W/M2WLJ/#ׇSwĜ/-tޅi _<N*UĢ9\_(�)9H#x9sA`N:y69=$pp;ܻ򪄅'T5C\f8_mK,' u")q>Ǩ5df+:b  hL? `(kL͉D p=>%ؿ&lfu8}3Z[3J�X?_0'V>?dǂ} 5>3rٗʡV=3XD@D@D@D@D@D@D�16]an3rNRns~̌9.G`ps6%zAd m~%\ uCfjk'4" :!u䂎lt:$m,_: lYr-\/ʵgP# ([2Ⱦ5crqHxm[~qw3T>\;?DxFŧ6ƥjdn<f  Fc /ƍ/ ʻPhHG[|O=j֬Y1QtS-]t~'t:9oC쫢ؗ]xcȣQF8cq1ti [^w J,ro}>ݻ;{rFӰa�f뫗z`Ki7 +esiA~)mBNTЙ3RX9pmIxPB]BM׈@ h@!A$_ 0sfoeeL51cu3-g>* 7�w eɖd̠P|0` xĠP)xa4bOm F paLfoE1 {o=\:`5 ^UPӧ_Q*;%z4m[/6m+{#`mk[MeKxV4öUTk_]e![ض򝲶f}U}61e7 $1!A,;oj$@Dl?=668^mO=y3&j[Xm4!~78fejmrjiπOޣSO/N=sN6zh~ObryU͛Z~8t\F@߯E㦫I@߯{t2y2\ 75{/ppQʣM* 6-Z�'!g<y�>9l2SwT03jcs[TP6NE :8Ri;XWՈEΥ(lrCoT4\'硸F`1C|U/bM*G;^\90r͞мU4޽d֒s\:ӵk]&{#i|/?S#p_cd>]+ +طp[,~&0H|}Kq[?#BF+[0$[}O|ñS7քF 1ֿpk 9ʡV&+Ot 1(+<fsLm;N׸f\I4<fsL|8 %np 񁺓õy\fJ٢VAD Pw:\2'+EywǠ`dnrA\_� ⣍M~Rm^Hy ɶj;LQV"Dzƶ~>?lتx?SB07dmS!@ٳg;=Wcq1NԽSƍڵk|nџGa޼y3g!1͈:(u1gZQ0eʔ5[^zhҤI,6h�0D=㴷~H+vaXX'y?d PPFOWm�7t1l3L׌)v{o~:u=_GK5AX־Llm55>KsF}NnFɔcYjyȡVѸ*H: h447á<opE:WE@D뮸<B;Gw^ >$(M P&a㖚 Bq)A%1c PɄBN&LM)>-S "G2A>S 0XP'~$|3#;LDŽx->yMo8Z>r{-r E9JDOJm`j+G3jemkMlSٖٮ2Ja)魏QVkOi|{ܷ6);bCm*ٶ'K]eʶD�$֦ڶU-e,X 'jOX2;9a}/lSmcV1TdlGmW $Vϫm~Kؘ5&jSy*ӳLD3ܿ3vpE++ olj֬f͚aȑh ]:XNȰЗH }&co׌?ΐ:t�&L�:v m1#Ssp=n.v>b X̜~b̉%T@e˖<@QQ#8o:rmnp� >|[6*Rs6bzLM%hXu'3sRF%*2RI))�ײzI8.y~otUrsf6i󜶎Ls^oK@޲M,ԇ/rVm)Xrmr58>(Q0�3~cipb^o6@j W@>& KcؿZO61%m} Y_b)۶#wv|B1໥ yC@ p;A0m%ǯ]r2.1rNm2\q$딜'Ty_e9kkkPcaLy}`k \RoۖRH󼉈Q΃kCr^aMʰ�א9&dXp[c[jy!9n:1ljX+R8hcJFny %dl;~?8fAp?g-Md,h3WX9fݻ9͛ Usyd�錊N1u 7@=]0gJu`oN[O>ܧ ,w! E#駟⭷;.\06wþAZb˪VsB}ܜ,s:B|-Z|>Ӊ#rGs ppʕ1Ktɒ?]�_|q+nS!ڃm&ivѸoqmcp\k[̶r.kφZ|&wizsM7=SYDjЀ&8Cu39 HZa{<w'Yy#YThpе+0>C)p, mиFcR xN( /q6nv ތ ?=sR?/A( 'MBMA&b۶dɒاqD 6<nQ?Q}0:1r!HA c,q,gjJ,rAXRP ()@el1+\U`F�M4D)3Dd@?lmlk 6j|{jm-'jWMe=1֎զqkS[jgtgppdo–֮2 7Di𘵣V*Ir[�EU&jOyl NQkWr7uqU`{im4ѶR/j[9fͫm56 2fMԦZ3Xv[5feWjcVm An k>5;ʜR(ygܕ+W$֌&9H_S񒍧S}镍EtZZ6Ц 裑/X�z(bPFxt@Z mhwYzʶ9T F:ڢa3)*D 6oLV\m3 Ã9R-8mq6wDe5AbTl2E*PхeVH==枀ɓSrDpMEu6ħl8'X&8\k|Er;Qc͇r."Oc 9D6glipm5o*hsgeip;x,~}Ω> m[~"׳ms Z'"֙3>WlaVv'69_-cy)S_Ivo61xu~|hֿoֿXb%yG٧$k_Al#֗XX4Q\ " Z"D�49Olep>8~[A׾Jխ!vso9?lsĜ3b۶swL1fh9D]Mmv0mn0 ns7m.ʖ߻j+:摨ReVlxڜnsl6<@4 {/0h\`4Z~Q*9'8.4m\Wk,r\c0m9dž6Vdܶ1%EM-5}'6=~X~M~綍liM (XP!1i>ǥڶ<͜\ 7]LWmkg 3&m2 DzR;frpL, ([?eo WwC^u3:uު (2:)裏K'CZ?M`Em3edN{ H:Pb;oߌժU9u:蠃bNVRo;^v`JZt`e)ߍo>+J0-wRY{vz/̅)߷q�XбNS"̗WQL>28NCsυ;8׃N[H^ Ee[c66:X<8v~19M?y&&j#im(i,e_W`YG'yX`n9d K@'lPt$4IPG 3bppIeVHwV>6ZD $fN: n"x9N;8LQ#g&lx#]8ω`4&F`cf m) >SE Km&<(5&(E.0Gƅ v 6&ei ql-q"k [Tތ`[fֶ>SkGVvi|Dm`Dm#`{\Ϋ]6Un2;)nq[<g5]1kO)U-^Q2}�W^mR UkojpնmSiO`5v|jcVkS4XՎ1ei1~ YƉ'ʡPAz.)ͫI}x 6 b`bR*#$M߯6s-| Vช~ s6k �mawAR.))&Ɯ"K^6y{9s83ұydv)r 8T1xM<'8h8M_vݾM'>Kdp Tlaʾ@!|8*!?lwڱ5} 'Bm;>e^EEo~U3rG1cx>޶r;Qq>Oڸmcebǘ " "fl1c-c?`߬>_aغT tr5w{l}L?ak<D}5'ZbL?o`mGAjeSyE@D@D@D@D@D@D@@Hm]r2:9.vYc[sSfs64z{m怹|.{J9ks69^6kKԍcGCz�x�pTD@Gছ:Ż'KEuӾGcx9}a1!shcIۏ?q$5ymirx!6[˻?ےG48X0(ܶ8F&+}Z7ڽڵWƫ&s6>> [p.>֒%~|Q^_:{R<Q'm:-+V9=]0}oTdSk0it|.}`#4sc)ouݜK yw9rkb�߃?%<YN?Y9 gU&̏'�:CY3 Ν6yu؛, #Ccz3Xm}7ߍm߉mno_ǧ%64ј98V8Dhƿ679Yn[J'A'sD /?mObӶt x'h%c*LUH'C~= :"Uov0y2p餪2I&wmLCy:?lqح yLD�fm4�+�;ĨQ4xlj:,"YN<|3z=$R.od_U<e8KSnb+0`�(8pp OFo d+켳WsS@^qsXG.%?)9kf' ~Rwx``-mܖsÔJ &м9#7`"NtD unJy%w>`@?ܕ� p>DD ʹ4UTѼ"x#0hpȑ4N7)su>~ŝw[{u<4hPhD@D@"v"Fs9dS2]Nvn<�t�k1^rCعm[7MIOJ3IY5jԈLCyg�TR% R~ [+�3rl 43\hӃcO>A*P^$nsw=wr#>}Yڹ~oqm@<h_D@D@D@D@D`df " " "PPv �B|2H9s f�M�gsu�( N.zε*WzBqQ8`$瀞=о@T Plp_ 5[Q}w pۀn7O*;3@A;#Fy̡˽zH bsNJAި d$|Od\ة+{-(B^K�4mδCR@jʗPAD@D@D@D@D@D@D@D@D@D@D@D@D@D@Dh/;˲utU{骢h\ͽSMW'fMnEsB`c_jN6mrN.mq|fŪU͚O>eO?K5W]D@@6D#uj^{-eQ AU@'T嗩uj \w5(gZ@C@СD@D@D - /�L \{mnox#sD@M@U{( 88`0r$P:p�hLFxB5O/*J,\W@ҥqeᡇ*jD0ktj$p@U r*伇U/:+8B qcSWիQNsZ t|9п?t){~NԕAw((Q¯mϚZ" " " " " " " " " " " " " " "<Æyyʶ훛:#; )@~gz?Lm@nXyܮj'" Q'pqEy^mdQk.C_|O=ٯN*T�Z?࣏r&"+vA,iht樼F`F- MgHnnS*@ȡVH+" Z98UH93 ͛wFSi3i'`xoО.n)Q" YI@"6tIݻ˩V+# <P&pQG}P s}CTPE"@�T8TVU̗@޽=ܓy!7�]˵TD { СBD @ΓzJa.k֤WQX+m 4bʕoxJ$"@fjm-(~�:thtlF\sRM`;g]r `8C}Lu@X0[[ZGKD@D�qG[w8_ ߢA砃/Oc秞8�NV-jU��u'9 [r<tbTLSX5׿iӀ OJd钓7%jNLD@D`['@a "?D@D@D ?> n q\9s7 F  wp~m " "PrUjFr@V/S�]zù]cND6mF(|Y@/F" &[oW^? Z9ʼn_@ vr/b :֭ +̜z"-PsL "V=tS,X!5ޯ|y?#L'�3*V,N.VD Pk2 :tթ|78M@ɒQw 6aK*@ ] s˩$@Y>p(ژ<$Go<t-h2  K%2@ СÆ >h;>yj9G|v/pU{{:?pKvMKR]D@RI6V(,9*,1/" $p@^ec�eDy/�L^=@ V"Z—SzD9Ƨ2@БOjyM� <pH>#d }⯿°{\`@Uz/D@D r'=4([8[m ̛gլ 0'ŵ4:on@r(. Qٳ{']/" " " " " " " " " " " " " " M[ԛAףh".j+д)0gNHH79J7q'" 'PЧn�88S{Kl,s}뭞ǧz/wvh~`ŊM@NʡVJt؜P.9 >�8 R%`(? :Z5p>yH` |UD uP+ulug&@R?p%U5"ظ8,n@Tg-7/* [D U`+Udu_?fͼSiӀΝ9 3S E0hl|XuGy!\) +&p!0q"p啙.; :wqӖh'ezؗ)�SADI5ƍ{; ST 4o̜5_.o?z+r%;UJE@MLn]@M^d>; x!Gѣ]vɦD+ӧ{#&O. \D~([ '1IofEAjwyb' жm�i3^SM=<J9jSr0>N5�WR[{:f" ' g;D�' ׬HeUMذ;sxIoڵsv4^{MTD@D u`+ulug#MW^B'p< "|)s@:EO�իgwTzj:JTdK?8y!<" AC>N> �i(d:sgpQ�e<x=`R``E 9g}$3V&KE@D@D@D@D@D@D@D@D@D@D@D@D@D@D { W(Qx][V,1vrM 0!y:*" (+Y\Q틀D@vG={E%KD q]iGSqǨ@ G " &Px+�jql4elƍ3�[%`BW/`VӦw=Y?@j`hSD@D@D@D@ C`]P0tD�7!'k_~h> .xi4pt6ma ~ӵ"7NfN8A&TJHLFǩd٥ p�O=_" &g^Pk$nِ>=zofzHhhx!ᜋE-!#&<D /*WHy5`2Y*]tEE1wݹ3@4r|U^Q߶uWD |;+2r_AD@D@D@D@D@D@D@D@D@D@D@D@D@D@DW3|T&:J`Á3v}6[kru@ٲQy�{z;:`ۼ\}˛2F۶~rEcFyy̜ lڔ)?(0ZtM̛Kw0�U/wå " ! ZsE@D@D@D@D @@0)" "[Ԡ.ZOl)(Щ͓O]>p%HID@RK@RWwLӂW_:vSL=+E% @�ԪU;:T4Z+Ц*7 \?=ӽ`Ygoa�ͶdHFAJC�tNSz%%Knݢ"j@J]wTЀНw|̚?^%ꮺ@2}7Wkz@,Z4l' LqPtGD oO䓁cWFHD <6nʅL*@f Ц̖)lӑ{ݑ/3<⥗-.;ݒs==GN;[l+9%Rll+ʛ.?>;֤⧟z[: {n5Q)D@@*J+" " " " ! Zy*d�O=xMLƶ'@5^O;5UD@REljsXxm/|4}:S @*ϱȅJp� Sn oLcʨ҈� t7bP?ў@x,_<rJr?xvmnLeK!D.&y3@# G`2`;:6w}I'-9Ʋe*ﺫwnc yw8b@GY4$C,\7b?N<f#5淐ل �=>NGڶL6Oe(z z]D@D@D@D@D@D@D@D@D@D@D@D@D@DF،s=_a}% eN9QOAD@ [PVAD@D@@RW;j]vpޙ A?};Ҹ~`=<Ǯ]5(: ^]+ KiS`֬^sw{4z t눊sGG7p~Qȏ3 " " " " "PrUjFD@r@~s/�4ouLEu*Wh4BWR*r=E@Dp`pt@zkG sQLJ9Z9IJ];`|~}q;:2tϞa/ʗiW\qZlѤIL'cSMTzG@ бB+oӁUQTswEgX|l/�T_goqw#?-�ޏo5k�F Th<Pଳ7K!; wŵ@:K5 mxpvn*? eΜӞD�.�9rk=zi p@NiWWU(2ȡ砿" " $Pח6 J/w?|w 3gjG괌 йa86s-TDP {/f̀o.tm.XΎSS-[vJlln;jZ\sxQAD@B@*EkD@D@D@D@DC =�\?ب(|ilp\Coxpli,"P0uV<0y_X/:KD hZaçQ.Me@|5*!D}Zh<x-@J@;<Z\SD@J[fi$aQox|:(9%SOE]q7OIe֯iwUwڵ@Ŋ�zU /_蚰;0s&0aéȲ '� 4;U[ԯr }D@r� R]AD@D@D@D@D@D@D@D@D@D@D@D@D@D@H`K`ͨT4hZ'("Sg򥭄7k 9<~UT D2 TE@D@D �ǔo~8p!c<}:$:9hvM" yo?`ٲ/'@{Vlٮ+D'�u`c:hЯnέ#~o:nc]8Tm�9 Ц�j}iaй" " Fw%�gkK_}h O98H`0W寜D@D`tdӦq/(< *4~ěo6;@_ gfKULׯz鄯9J.NF/[x%cS-:^=ER"9t|vW߼cW:x'G3-npW:>QҽNAa-K!ZmT8gcm2Yӯ]x"qyTm͘!Z[Nt|-ggTj( 3�TAʩB,޸q^Nv9竭 / " " gѣ/=NyAZt1v,3}|2У~@Vvv>C$"f3e9J6l߇7ؗzOw߭ļyPLlJxE@&^O3e" 9O`*(" " " " )"@Zk֤溭@ _gWpI`.󆹙nX̛rHsu�.8t`Rwo8� aQi*]?!v6u@W;`~Cᆬ`(( +�WK&t邽 C b3_~+h,X): "B3I's948 smTδt/ÙKnp3yv膡%v-@nU' }|sbgZVPKAD 7yvND@D@D@D@D@D@D@D@D@D@D@D@D@D@D 6m =6l N<Dg]ڣOSN6oJUOm0ZmL." " �Ǔo8XଳdƁ],\>н}8V-:J_$ 5 OX)JzS7/^^-hobҤI΁8s&9<$[*@VCxL*@ ȡV$" #p�I?P\Í+us*Q4=x%о"T:V^dt\2CBӦ.أ "zTlh+M V-Ë/v-P" I#p-@Ŋ^y!i7Սr@ɒ%qEaXAXysmW� ȶj@zp?ғr)~/c{YիWv*c 'N%\b?)�~8xBS܌ D09. :([8 9 sRD@D@D@D@D@D@D@D@D@D@D@D@D@D@CZmwejz2yg}?9.YC`gdMUPXg@*((ꢎǗ'{'PN\K3gGs@9M�C�ԓPZGH'wIg+S:t�#��@�IDAT/{X�.vq 7yD8+z$ " ! ZškE@D@D@D@"M`]4U^D@"K2?RV=7ހ 4 " L@BfM`t`2c3WNs�m�͚6�M/2y'$D@W_9D(]:k9眃͛7ǜjH/N;/OOgH*D�09 Dݺޑ %F#yO`HfrNW%'@�Ї;x#@+Wn~K:GZOwޅAZ̛Wt@ 4l?MD@D@D@D@D@D@D@D@D@D@D@D@D@D I>…^iN!tl"paСM7�eSUVTT)/w<t_%Щh@{:= } OD 72Pp{{<__{ !`f<d/ϔ΂TiӦG8|*YN䝨iTfMviӧO,{�j1UC" " " " %.]W}TqϏ0W - 4jZ3E@D `+P pt` @Np)I `@6=֭^}+Uq߃!C8cдi$[A \W-y晱~`ƍRb׃}r�zkol�QZ!]V-V[iӦŜi/_sE:u*|� U T 0~<ЭsN3'Nt ]jռ.9)SsKAD@D@D@D@D@D@D@D@D@D@D@D@D@D@r�eg8Fyqyп\U�C*?jU.)" 9Mz " " E%n +�k'nJ=No;x `fS.0o鏉@컯wѪwkKZtFg.O6:J;<K/s�3Uǎze}Aw pPBi"  Zɠ{D�jqa͚HV_x][nJJ߃ߦ 0thJE@D c`+cq Tj\ }4O*@ C-@S�f1fE~9G!k׮I]H5K#�HAB /ė_~r}^ùE :ZgOsd@rkK$"0r$й3piI�&Fͱnu֘1ccd^ MЁ!�? 4k>=c'ePIt[r QE ^b]&":WV\#p^VSSgᔆ_֭堶"I޽#Y}UZD @F) " " %@gGPy7)qG䓽=+$-[z݊><9" @`큃φNJh{E!7,\t k0k_ᤓN&8n8.!@͚G/"424@Сjy+" Q!p@pFR֓O=pq� gfˤE@D `+ՄuZ;բ!e:բqTx}oFnd/�D;Iݻ_;TD {|3ȢB#P { ]P}:|EE ૯P*Arj �\y%0l@ŝd*!\q<?N)?}(׎˯!?)O>?S*Z GyS]sՌ^Zμ~U TBDʣl3y'DRQD@D@D@D@D@D@D@D@D@D@D@D@D@D@D~ p>b25t: ޼B +0jsG�@ [-i@ /<0~KW^Ibտ ,X�@NA{i#GqHD@Æޱ^*PPB@QŋJ-Y,tP׶m71w\<PB'Fg^}A'SW8"TM<ȡV`tXD@D@D@D@E@EH@E.ȭBz \s}I8#�`(@TVTNU�3f�~2:ʧ_y@6X8P/@|ro9i-s#ޘxU@iӦa!;y@z/ou;TVSSN.7gsθ{AoB%v [p &qye#C?r@p{}hٲ%~̜9r'HV^}@ }7� |-p{c睷5;:], G�\�\vOB""U۔C>}[D@RGa =%6qbK{sOsNv@XСWXJrP7\z( 8lO1{͗_~<�}Ѥ)[K/N; h,U E@jeϳRIE@D@D@D@BF@B@TH+W) )P+W hh+@: "rG@ީ?{? u{r}tPvwfm]5q۶mQbEg|,J,I:""z�5k'Y@u֨Q LuM*6nLY"ˡVҥ㤓Jn4}0iճgf}Gߟt׊n;z?ࠃ/1ۼyI|7Vzu` xN=u[ 6�lFڵ^GNɓ1 tTI,h5D@D@D 3Og';o"Y;UP:tfV60x0 ;zOD С…U׆I!V x5.]% 뮻Ν.P�9}m!" % Z婻DjEa" " Lg(UJH2EV-`<O>(_9 ϳPI{ZP!ﳯ*'�=z�u�tEGD?DΝO?J1@ .0n@ '5zbѱ>w xq(Ǩ_~UD 놨 !!@N~Ço[0~ d7n]&s9P*=tn ,_sЪM.w߂ߏ *To޻`,eR  ,XuQ-D@D@D@D@D@D@D@D@D@D@D@D@D@D@Kॗf̀*U3U8p ڷoz vw Mmٲ**" "ݺy/tdѢpUd r݀/>�;rN8$``ӦPE Ԭ?WHN3S9�G_=pގw�o_}U̮nGt睈9ժXQ@D@D Kt7/]X&:uVME@D 6of! u/_w>)�W\0<AD <`+<B%4=}:mTFD@>N=S[gwO=d,8(ys=7fδg<" &p@Fy; wU8QdI<#a-bhջWJY8gBS4D�D9<:Lz9`W &e˖4z-4E^a~}R%`�?'zT,L5ks}믿/ `Ξ-)">[*lE`CS'f' /"͛du$ @ݢM~C" 9Oʕj" " &瞀4�C/PH aÀ+hcC[nԩ]wH% >ux;, /OTx?P*p=�mj|9з-]; Tu?(e9}mwp9]UUND CP+C@ne9ʍ'Z |1@Ml\zo   sU" "`+ʜn ̘wEc "U9 8O�~t횿#-c?8u֍*B[ԩ_WEe:g:EaLH| ЈO=O)'D@F֯ԭYTƹ>+WN^Ytv{쉗^z p1_!8p~ժkSxG6G]�;TLq7:cbhT b@z Psb " " " " " " " " " " " " " " "m>*G7;Нܮ];ԯ_?۪moҘud/CPAD@D =X�qGABj}e�v S~'PX @wT<:Xߴ)w=wN9LD'Əj.8H ثW/,_?|tAYY')@ iI6QOD@D@D@D RP+R[8O?ʗlA!<N;/ӘYF�D@D@' [ѯ%�zS FW. <.: 8@`l4Ia݁vVC㏏&DZr�ۯ8:w,Y✶9m $@:q~abJԝ4i*T>:6>оHF:g;/W\qSڻ#渱dɒɸtfa�4m PJT8q@R+�=w)qqav( jU`}i9I?d wSYTPG`FoxAP;w. 5;ȰGu\UZ(*U78c:EL1p]F@?d=:Zn'뫒U8 ࣏ȑ(o͛;|  _Abر8 b*ˁ .� J"  Zx *@Cl}r*e�܋~p+:)v ;~ɼ~ĉT^yd6j?aƍ R2" [{3fe]8iN#D۶mCT+^{y%Jx'" 뻕c{2W˽dk0|wT۳gio<L'rJ }dy*g(.1cnw"@-e˖x i,\P'}Tȃ�b0$á<ˢ9srkTV :KtK/rR4?)�"Zz Cϼr%kqNG˓cߩ#݋ۼ#wcuC8TH $n"" ",x`:," " " " " " " " 9H߁N�FƏz"۪ch 4֩[b 6,?rK ϩr)8qc޼y[ǮX]hvҥ[Qf '#" ֭ʖ͆" "[.FfSk6t|+]9RFxo 6lJAs̙^烎yܧ#*3C|$Dy~$?hQ~gtI't_$0gS@E+ŤI:kpLWQ<G:aছUW@AȡVA(ȃjFE@D  \6j4ǰzjL6 'OƯ @Κ~*SU>/wlڔt_mr~,[ >(/^<u|: ,p}:<=RV�ߕ V6Sr_}wP:0u*"#'p p;$Î;:зo_}]T"p(4JuW.}> ~#)%`Noq8]qmpx(#dɒX7A3[Upshpߋ@ @׮�C~C{5tڵ\S1tPku]1ŹwAC-: Kޏy"t>epQ)D 8A:YTd9cX̰ʒh?/'" " " " " " " " I"f p<fڷL}r3{̚5+/qgȑ#q7ohsp+ͧ:+W>|gh֬YR5qӉAn 7H~P""Zx̪@Sn4lu8e< Rhڴ)>/v߄H1dAZjՂo/3d: LB-kDPֲ+kY] -PEi*BKoe_y1w|>Ν;{}Fiw/AF´O Z6ȓKlGJ+|-6l@۶mѹsgױ_ԼC:z4d~W܏H<HynA$@$@$@$@$�ܑz >TZ})oȐ!%%V^|&޽{ Fg^_G%I$@E Aq:u (J3ʕsIVo4gƍH=@AD�=% ;w['GoznE=FVE %J83n'֤W^:>1<s̘4inewRǐ[ $hK4h)jrرc{AS@׮.P ~,$@NEva2_s V-\~8;')Z(N8aW?;f&gT07;tnGȜYw/d #c=3gʘW!.ӧVrM#'Пn� D6׉cIIHi^c6>w=$@$@$@$@$@$@$@$@$;DNfe @ժ}Сh,NIB Сݘ�AډmyvײWZnm=TTQ82z~"^*Z¤{|3 gHxIc);_�sCāwRJ$�X<x{ٳ.]:{W_81V ""v D , rڑ=$@w Z[<eRz Q2U)K{ .c|}xqW_5ק&Mkȑ#ϲM P/jen1$@$@O{     ( ! h#ZϧW;$;g۶mD8`8޲(RH_D4I\$ i* � 8@ l=)QDYɲckyّ5k8;MɾE',%; GmznE=cKU$G4tm9s_ gMu9%\ 4}ЪU+)N=6J'p0 FpZ`ܸqU,ԣ(#GgvGc# NkS�39cPPdo<N8?D3ԫW9swk<W-bm~F1|8$6bZ|34q\'O&-|Çh]g5k;\O@@TܹH6� $G {y_'GHHRK k s{        T:D@ X&l_`$A n7[IcRl> G͚5 3<c/iӠ mKEcTLĚ5k\}z|ʔ1IrG;!Nz{E$@N"ܽS[8|TAET$CA{񢓎b-1=4牊ڼ{v\#͚5CÆ ׭[g{fc_k=ED5)S�wd!?Iܹ>ϖQZSSF;懪Pش Jl *]mڴ%-bѩ_|9`^]DN$@#y c$@$@$@$@$ TPK� � D? Zu@qN~kٲe {"|سgz1uT#~o>4I}ǐM.@EKïK&7|�<dI;R_'ޟx ,Y]oƌG^v5~i&Ol;-wڅ>�?8] M@8jԨ8H6ѣG~C,YбcǸqajU`jty{`$  ت]tiH@ xyә3&m\05&{Z3f�0e˖E߾}Q@{+MK/˚PB6lX\ [8kQb˗/+VĆ :n:ug/݈TJyrxW_}e_gHjCw >}:=jشiS[�e{ ɞin]V-sN쩤tnGU3O_*έ:#M8vsZIWRžW =ҹҹ#CG@[.$<~Ȑ ;ӢE ;Pϫo]tx3RnA% SL#@H/ynfa iK> 4&;rT/w"h%sIŒ9~ <@˖]):Lyg! [h 1tJcT\~<<Q+Y?%LhD:hg9rkN Mm!12"U]Xp.`'+"0vԫ` VK=I $e  RyB\&        s:r_ iKUxq%KvT*WSJs4NzWts+pmbh>4Ϲs ̙3kΝk| Ra1,KRwg&5Z5H @xq4",$@$@~[`bWueK%͇WsxhޮKڹ4o}'1$qt\x3VJ)U7*9/@֝r@~C*ѡ&Aw$@ihT<M\% 5JIPJ(I8\"͛]w~ ,S(/HCc5\LXHH $ � � ߯)g,kbCJ`ʓ'U2xY˺&bSx~8#+-o[ӧƏom߾+%U{ˎN0,tݲeu"e*U޽={vK+V5O[jղ;v%Vɒ%'OZ"eסu%BWg6^y{Cv]a/{lկ|ĉiY0loSOmSF KDϒLʑ#Gw[nDzw-q~j׮m/"_qۄ{YkdY."O$@G)K5x%5ʐ.-jѲ&L:z.}wyvZz[Hj-f_{zMnݺ5Ok,Ҍ6n^xNO2Q.m۶ijC2eϮ?z B$/ZvΝ79sZ ϪSꫯvR׈ۈ 69]-KNk˖x:#jޜ[)7I$n=/7x%Bo=1sӹ2=~H:<peedY[іxBJ-7w-I6mڲyljEMٲՒ{ٹTJE5{pӔ>lY}Z2.dв.Mik~GI@ncJ[u>mZ˚6-.y:ǔ(Q{3<C{r~FN5}eۗuYVzs*|C2WB$5w tw>zD bZsh %.ŔuSwbSHHW<Ϝ9)h|.דZ# $      VYfYUZ֑#{9A *$K/QW 7~:Ǐ*Vh}kƍvܒ/Roi<\J/{O=zԎ֭Ni"~hs]tI^?p>z \ի[d%?� Dojݫ. @t9{;;֬ҥ-bYӧcǎIQ%;wk{WQf䉁cGy΁ϴ2Vw ݻ-Kssjn#j². @ŬH'NI~,kɒw4'D乥aCj>-] hOXr32SI' {9K@y]eIzS Tp͵Q".m*3,$@$@$@N 'zYk ^8ۊ;|2 @ $͛2gښ5k~˱xС]ʓ #Y9%r믿CΝ;kР{g$|hɌ\~W_}uf3T\vլ:%'Ϛ;w]k>$_x.]wBX?qG{DaE4l-qq4HbSvjر#,O,i3g NE/W$tʖ-8vyNkbhC\EФWc]Q@ W\KPGVܹ %F^|E{so5\PTx]rݛ%G<[7M$Ol!]vY =ڙҹ͹u>eel$UGO4ySU<w�eWBRwR@X 4iby%4(e8ٳ'4c-^=ުeWt$/e!o.i'ƛc ` 1n3.5'ͬY[VRe lYx`}t~hPVU OhGΏiU~5 ]£e,#ϖY$~%$x2JOvHF`3r7ߪ_G_䞑aƢ|NJ�k$@$@$@$@$@$@$@>XI￞-5Yh.d:P&M뭷޲y8;IX?G 6^4ڿ{{K 1b6̙Ӯ'/g}fW񯤅&ߺ~SR_qH lj|$ KZAjIf)JroY>hYny} j͛y<ڻry3VиG}4vٳ5uA&˒j � LY:%ߦ7sBKq(@v>PՔ?92RyJȑFlÆu\"X{C%      d;܍HH \=?ٳgiHDgqM^&}eʔ8uY8&1:8d"~CA$͛7Yöm %mV-⸌CD:Э[7{ɐ!Cܲ.)R"ypM!m_̚5 3gΌgϞ}XmITY?t ,[P"zu b$@$ ]2X8zXrw\�#@.-hӦM8;W5j@̙i&H:_+W.n5Z^']|A]:\'NL4 M6x6Z)@cΜ9'ޛ{`ȑ[yca9M.+>9nJX!(T =vݹ8Ç2Ǜ٭[G2fL];:>RdIm6~'9މp4 /�^rhSi\y/(]T42q ej{&LN!pC*ܹKBpbzo>Dy;t&iLR">r)'l sek5f`J<QzuHr(ܮmI qya7ў]ң$YvEVh- D'ks׉ <+ h$pd6?A%|Q49 � � � � � � � � ?u@⺁y� X>q)˗/ǘ1c8^zyK;`T.-O/"N<+W6\ ;wȑ#駟;={vk5JXΝ;gT{:1) ロp-IGvB$@$! )y@|͘aJkצNcǎŝwމL2㥭 b4V&?c%OFٲe1|~2V9@ mژ|_ TW7!VC$@׮ԩ޽7&v˟KO4)Q%O nn4_={ wŊ;֭[Ǚ[qi!?3�rRg +W5k&    'ywNJfIH 6 ޕ&zdv󥧲Ii>-L{n"ܵɕWi@U\\j[7Y&^z%vmQ?s[C'U4]QK&~zl1z \::> $]A.`8M$ ('R--OFlKTQ m-Zڷ"xPJkq/\оUPnuܵ\xN.\7Ɨ_~is} m(}xh#fh6k ׇ:7v''@sQNs+K,N=9n+m0ZsKӴx:'`TWѣu.=\;x\ewu$~iN7 = {1n8 4(.>HM@Fx8/Яi  < pfWwgwsܹscF<x( �עG%sq 1x5|Iz]M*C=y ԰b �k}DΏ?Ł8uw=+X � � \\C\k"w  ={JƉ&%|?/ � � � � � � � � .5~*5mۛȑÎ27wt\qv+WġCl_.~%q{N_RYOiӦ1b]c5ٽ &,ϥ]N `4-Bn&V_?H PP+){D$wS=W];@uG2;xk;q$k%U񔧱+'&M$/]vt@[nĐ/l~EP1}(9c! s+oě9! \<3o8r8|șӛ='SGQ"$VO{y>ӒUV('O~Uқ )9Дjv]1`՜:媹 XHH $HHHHHW*'ǏZ# y�yA&9l2`b|\wo&)S&.m۶%]ug�Ufg̘at~̙`?-"*RQᎪUjkӱcG[dDӢNI>طo_Վ,971I޵qU  p li &Շڋr k н׺:@6>T �л%:%,]}k\':}[G$q%A&ĩ<pOhbԩ~-X~h{X[ֹ�A u]x8}uwnE=bcǀCoŪ1-twuʗ/oCxǙ : nb`S7%"ȾTYN mZ㜪/� +I(�IX! 8@j`FM7\Ii18)uEsL<g/BuO�_<p�7<?IfS >kyK*LIǑ#j(M; � �  NKӀ� @I6$|jIHHHHHHHH |=ШР$f<uEӧ錔mqO˝n䊳m^gR6Q7o65ֽdſ{EIRJٟ9a7Ӛ`bџ}2W� D< jE!dHAnzɻaK2h@fF$]y<qܹD:u gϞ,޵kJ_e|r[tX 3Vr3r='f͂3%Kox`0g$4x& %+KV,˩<~<p i\O?FLK-KA$Aճ@+>I^3 L� � Y96D$@$@$@$@E@i|_  %p*eWE J^U:+vX!PJIr-zp}?H]S|׉pR''$bd��@�IDATa3|׶PWƍS_  Bby1yd7/^ٳq<1}tq*sθuN[H#3bÇF N� � C`K\3f^xBޖ@\'6l(MW_*[h!bbm}Q˜a޽w^ik׮d>|8kx#˚rO'2ZsfoϭHGԎ;Y$R*~*,'rn >$`p4bZz|G ;@Lc-$?$N 7 ޓ,A# zcDT5|4ء48~ ~}/ <ɑ1Mz*5i$3C+yҥo9r&�pBII"^jժe?{J& k׮mòEj=<t7; � @  }3>k_N$� kI:%�f$@$@$@$@$@$@$@$@$@^P0h8 jMdꫫ?w<Mc̞~i|4lΜ9UU\v[.^dm޵kǗiLJӓɻ&8={ګϟ~$%~ժUO(PN @VXvH TiӚŋ!rs%<f6;9r|IW.A_Mk,$-VP!c%orvf{LW_A*s̙3+ Ro51^u@|#`ϺI  H*BH*%Z|r}u'[REI<$\璯& իCy/Kk`ԨQ2eN=c1&suir\C$@A$ C     _ PPWr܏H"w|c=jBub֭:Nsc=fs=tHE1W]wޭoq%K!u}2W^h۶<2O8`6$WTH+\TC4Ȗ?>]NP?nJ(5MTCYKjlzC VCԩzuM )ۨX<dwHH^aoi Pj;vA1N|’ǏܛdJrNZTLS?tM򰿺$6*iZ3JiOȞ=]{$crH@foέuo9zu rR!Vo}K 0b#ہg |㝚5kb(Fqԟa#贅^qMSNh We U$= k=[⎳k$@2iY $<,B5qg}3R9e-2c"E mɓMM?@X4ɓ'J'ߥIU96� � D ׉ph8  %мyo$|ǟ=#        PRj'M]$l<ylm۶I 3hҤ ڵkC%9}.i+nbNn: gϖDzW{D2^K 8Ў8//[_bayرسg-'5Ϝ9.?`ǎ&� Dqהf@YHH|%@pP~*T�j .�:qyT$Y cS-ifyf[,*@k܍ktY+ BR;hN iJ�7711!2͐@)Dwכ9!fIŴ4oo6I /п[sD ɥt|v<^_~ex? שƩ`lZHH $ $ � � /%0&1'O@de"g]AF!ͦHAʕƜ#GX"Zee̘ر%TXlg3g,q̕{=XE&L`/^,pquo?`${[_ Z"``.]:%JX|A\ k;q.^h*Uu bVbDÒ}kӦMnXӧ%,-y�oiZΞ=kS%~"Jbȃ% #YӒ~X /XҿHv� � $G)ZȲZ,+Cs.ZԲ:uZlY۷=̙#c<$ⵯqzHZkɓ'[zW]*Wl_/A.z:uk?c_.W4i%"(Ysm3TZ!OK8-hR5jd-_<n_wqp+z/Ycvtn%G 2k׮#KJiaߛMgeQ+KJܿc/dYs[V,ӖuWw\cロup%l% 5cFv˖ULo*Ehy>(TMKC-+GK䓖w/@tx]s_-v-s Xm%>H`]}V…9?#ς|):/f,W.3'Ve=e/5=?t~KtCT#(W<3x\"H!@H9R3j5F X׉X;_ gذa[/ | ZnpIHHHHHHH 4>.S&jƲΟςJ*>8w *XGJ=͍#}Q+}vyDK\X;w$I]_JqOADv\6'}?\qL#( -Io=m6.n8}ڒ\5r[H g# 7]c{3lj\;^_dcYuX+cĈ2d=4s=WK7y3V ST$>kWqXɵ_u;}eUnbbnْj2,$@8~ܲ,Ixb~DP%e^mʍ6͒q\ScsHd1uh 3$5 ;@I   p8p�țXU+ְ@x-`P`@ʺB) S&/vUwX% (V >`ذx:"ҒPAA } ٲe d~Oi?~8"wq-�n?9?l޼:ǯ `@^=`$ gNǛLIH p4OfE]thQvmf (Xp\`B//Uz Η}iɤm68qٲe4NK篺*$X)뿿 N4k}+jƍϭHGC͹#Ny^~so_sOQ_SO=7$x';3bE _>cNq巵 ֭nG˖-q1))D!@ 76HA'@ 9}ছLs:[hJ=K.Eq5@!wy'g䙐Q૯YjUE *^ۚݸqЭ[7i}9rq~̚u[g޽]oX8ד@p П3|Y; Ju0cP\hr:܏HI`(]:̑.F~?J|ByHz+* � � � � � � � e@Æ]w|M %NDl?%KʳK.Ot$eݻx>QmwQgǿ$2&'݁+~K\7?� D>74yU%84νLX+ @8 $}I^ {/1tS~3Cwh^00?Wcz3V wBYvM]_ѣSY!% P[H zLtxykOsB̏sW/`z`ɒ[o |-йɱ+Whhhn*Uu&+}]Iv:ʕ#LށBK[ jΎ{� � @@ &8Uu8b$~k])oGG$$O<L R6TdU++qĞ,$@$@E:Kt0YH UTiS@Fڝ@?I$H2G!xq}aڴi"$|8!/Qb!*!' RPrOTȑ%<>dW[f�VI $MDw:u F ~L�5EI%VTW~?h 9ol-펖QF3<CF bF#tK$p�9y*3 $M0L+i � @$H@5@I  /*D$@$@$@$@$@$@$9kruO?5ΞI(V68C>lw h_?k$o;Uy4Z$̺I 3￀8ӠAs'^~~Ns/h,ؑ#@6@-MLJ5<,'1گ|ThWBM:,Y~{zBq׺FV\ hIOŊ&…@4`4M$`HR� � � � � C [6@YHHb>P}PkY>rHVTHFk7jU#Ѷ-P:{~nI$@$|W]|!vO up 8ݒy�ʜ} {/Zl*gbȐ-vKTԪs*Д?Z2{DNLQW/Hp[~|rtQ~2cҥ+Dv:މl>v킈AnDGQFȞ=L'Qpb /\XnY/|d? 4o@6PWd2DQ̝+7,n k6b Q[Zi32dW\!g_$d#۬+UÆFQo!ʓO>)1#dn%6n܈֭[G\fz`FHHJGAxr:T @0a/'d k(ƸHHHHHHHHbUծ L濘֒%K *3*5`&_$ъk"ܹ3MBH 8{}h< # -J,Yɓ-\01g*cƔmojժEDx#RS;hH\RDtF@ ʸqM7%EKPtMrIؑ믇MNu&!/6*:6|8 %Mܖ[7H6͛eJ ѳ$"{v݋/lI1DdH 9& � � � � I@ ?g%ܝHH b"Eaǎ4P+'" Un@ɓ7� � ޹s$Ξ>.Aӱat՚.bZEif݌ի!+ug!ҧOb޿ot\yj9ÇneH豉NQ*"[F^LK&OMBMXH@߾@&tz?ժU+: >{1-z_BcRDȈGzilQ#N60^ExSلBZIPOW֭mA2e�DUR?f�ڶ>1fAݺuC4hs߾0F� � @ȓ6{i( � @PogV5ZJ$@$@$@$@$@$@$@$@E@֯v0}:$/b|pOMv,aHY# @x PP+: @$3yrt\Bb2f@tlryҢd {Oڵ7f̀%MKWe4Fc25lbKzJS_=ѸC@.wx �G ֦Mm6{^HXП2ǪhD_ � Y.,$@$@$@&pIx1PVa$[С@ʺDBA`'Y[x~3[!pW^B=&~d^*u5�3g[Hb>"ٲe ֭['NSk^[EŋȜ93J.<yne?eq8{6'aok=~Μ9#]0mڧz vꎯT|[!saanA@dC$@'0kв%pq0 | 15g…}.r~z/>ӢCԮB}EZOh/ &M Z%x;t�Ę/.�Kgz&z(RhhQ#!1P�:"J$ v6J _#"n@$@$#@ n-d5'      3?�jʖ$t*Eq+@2PZIBO{wH 6o;VZT?2e1 /C~9ŷhݺeDǎS1n\吋y8PdXq#If,/}� FIQ}"NW]⹳bȒ%K8͉r,�Ջՙ7�ǯs9b5W֌AjՒ@ |w$@$@$@$@$@J [61  %)`XulaC_ *@JԩɁ& h%pdj.^$$nxLlڴ /VX!Sj8yr3~y֬-bZ;w!\yec|Z's#`ǎh%~y"!CL<<4~'r/-㏞Dy%2cX?ӊ3}%8~܈tH1QgK)� .lO? .bŀW^v^}=-S�-BC@E"4vm\ Z.gFe7=vJE xk7�Vyѣ0Sڴ"pm@L9DESHHHHHHHHHHHHHHHHE`6n]cr1^sX}TXH z8alDO  'ФI] FdJH?J J{ψL�\wD$ X6"@#I lL'M?if# @9<c@ryuզ brѣp"ε�  j1gIHHHLZHH 4kfG4OE�K]�~"$@$x$zr"Unސۋp!qۍsGB*9=\K'yŮ]Wf9^q/|i[?1PڦL{#@PX<8m!BZ~pЫ⭛7o,9$@G`@9#yX"{G:c Ώ_K\ ̀yǚNH @,ŭB}3"H 8&CBc'�ZA3']6^�*V al.ҧWV@2               "{1y!1k-Cs]ɐ]:;LQMZQ}x9  !Wc>?<mbKΐ l3@cs~"f@~(WX :@d̚u|ڵeQa B yRUV9v\e!y 0f 5kv) 4 r/d*UHBZN9HHHH b PP+b ' -ïjsФG3f@:l!L  ((5j{ 1֮]'O'G QAIoO?-Nr0UWɀĊK@ /^Z4i.[ӹӲ`p8(U ;l.PpZe$@$`,\k UN@mۆ+W:T'Uy`NH0s&p& ^Μ!&p.2Z1R!-ߒ[noS0,ػx=#'HwTXkHO`:C@�ܲ>[%               p& iro[BLA+ɒYHI Δ):^� � ;W\q^{q_@бBq;xutb.9'[OH *UҼze% ̙zz#XZ Xx`P@?W;J};ЧЯ1,$@$$id m!    H$@AH<jH'bxmb C{ի@ F`+r$@$@ .]:|h׮^z% `vСCXhFzG,?᧟sUQ,3:w>ر#N'Z*~y&]ą ETg,YhC(@�5j�im6  X'k>hj4H!PA&\+ӧGɴS<4u+0w.#С Ķ쯿 8 j9϶XL@+dmObf#UP�0`�930~94w,I@'oc� � � � � � � � � � � � � � � � 8~h[ wnr!'IPF~_ CZ<HHbwT嫉R=/ B,![Tе+P($/ phu" <p X4|8`a ֮]~Wq8r@'+v-cWF\Wb`͏yF$@BZrh& � � � s PP˹dž� @0 Y޽%4_D8$$!YYI{HHM gΜ]$J~_}5VVܹ%y_:t:7۶ݻ+VZpڿV~99P[DZpb "S7th}6n4 EHBF`  8 V�7cƌNJBG@L5f2az :y5#*: 'NŋC~oooBK {v`L3v4Ɍ"Q_Q}"(a]0}~@n d!                ӧM!ٍOIdBAL$}x$N2e"   $/LǠAocWD|ŠJr8[mÁ…Gvβ;$#W^5kaÆ7&"Zw>ƻ iq }d嗁+?Dv_h= @t4&,$@$@$@$@$@?/ � D6.]獨Vd֧@ &!) @GIHb@._L IRcbQJ*C=#d"j_G"FD34{ٲF|bE`3^D,$@$J*5ׄeEPAmrsj*+c a# |/`2re``Au72΅<6L6YtDRjm�5j�K8Ƅ\�| +ZԈs;0Aۗ1c= TlRfIHHHHHHHHHHHHHHH e>Qk �]"-]iV^ wN;6\O$@$.p?#C#ht8G% ȑ.H8Ǚ3ߌ#w#O*s-#KaLz,>PX:|W(_Ćv3:bɅʕ qlH$ *,$@$@$@$@$@?/ � D69L1c"w I 9c̚{]ܓHH 6 \uPqVtiӦŘ1o\0 -`x�g1DoX8pCw @Ǐ́#49 TU$C3bE�V ;ػ׈h`gz0B4 *Ypv//_5#}>;SِRKL/�7__m\ R�'PQH2OvHHHHHHHHHHHHHHH }$(S&qQJzuq,$@OZ    ~{[ʕ[`"17Dg֬-FLKD5-rBM@͙(r:k c񉀊98(]r;*V,A)#,y� i% @l26^� � � � @&TS+\HH 2cjz"fZX*bЯв%Cȑ&g`[bm$@$@@%"[ZN6A$*)ScѢ&nkKӧ/M[I:rLgMb=LJύ ޚ5FBGo)VL$@%#^hek$HsV~_|1ղ0Șшʹk|yU€wB PpI�710{60j߽V(`) dtNe}2gNi~f,`<̢i@@ɒmE?,Iư� � � xG`~_oap,0~'  Hŋ[=jP$,5k2%\e         H=3:$&=|#`߸Gi,>U: &B$@$�<3-2Ȋ`к"EaڴihHmNB ]:}{8_T x1G,m$;# D9\\#qGC*UwOsͦͻ۷Ęxߕ }P]MLef,?c3Ҥ,i- @lfl,HHHH4j,Yi#" Mܨ"JAQv~*~\X�\m$@$@&@-g_kذn[Dȑ/ѣG˪Sہo+3/4BZॉ'Nq !a$@̙"!\͚5AQظq#J>)r{F]T@Km~} ՗. m Ѻ; >u=8kKz8ν_>}oEuplݻ$Q _K\P`peE@e^ |-@A: � @p O]w%;qبkɼk0.3'  ||e’7/? pHHHHHHHHHRO7�L4Hw/{x#;7t)|}HiTPKtDXHH @7/ E&ߋF*n{%@t6ƍ`!~Z {/pu&vS'F́fG"??d7w$Rz@OŴnEk4i74Ο7~[bZ'|>zH"`0f 0iD44,$@H@.,$@$@$@$@$@p);O-ܗHH ̟[ɽ p}U VA$@$@\[C�G;۶aǢEsVG;v%(S8ì@޼ѳmxٺT[Fzrʹ7t5i*FfΤ  gЄ<�=@$]`U?<A۽$pM&,غqF%J�Ç6yY7#T�|2^LKط/qӐuogM NP2e DVf= |`~@<tN1-I:wgHH%p5@͚{**B$@$@!Юk&k7עԴmIHHHHHHHH@6/M� d"[ξ;Wѹ6C.[$<S(xH Z -Zl|*W.&1%QJ$ڷzd. ̘ѿ?p /�GDW_H^ז,Rr|*u7;c׮])]qлTpYt逆 /.RhLiPA͹I1H9z<|$9m?e! "]}$@$@$@$@$^ /N$@N и1I_5" hЇ=z�O � � �5T˗GϾC%x̙cZ>qWX X̼BeIt|̞ rKs- � e:ٳo @PzwSP+h]:0Θ1~-$$s[BPay…5ps  �:n<T (Z;^'0x0P1¼g@9˄9X: � � :tmf܂HH GTtRڂߑ� � � � � � � � � !q#@j_S+'4>Mp)T8*T`pH  h~ M)S$ZOIH <l᧟Fa,v͛Ci Łw߅u^}(R8س'TV/ͫdIF+@͚qСx9Nw"Ə7y6Xā_}u ;+GTxmGIHH �PpHHHH|#@A-߸q/ &XAvNM=c_|%![i&>b!  `V  D.EAZS & 8J;-nGzW7D3@Ŋ-IH ^XI0F(4kL'V`߾}hm8@ڴ1\O4DTTEoш  ;�w ̟ !$Wۑg+_5 ؾ݌X܈ FHakҥ@uZuԪe~oG ueh_;C,$@$@$@hj#]:cGς(z  %s:. T['         x賫gMS'uk@-BK孭iՖ-co-� ɓ. j)k"~wca6ٰzQ0gϜI~=:@޼ /aM~9CRr%Z?]b{i~{c8qjr,Y=[};w_KSѰk!jδVyG`$`L`@(� @$V$%H$@$@$@$hrq$@$2my�GI6WpS  � � �BITUt}6qoM)*?uN-S_\k"uM9:ysFsX @$߶'�ebH8^{CQ-a&ImU�IU\k"pFGP~؈\Өy/i^6M}h" Ty~`jU@G4@E7T0̘{.7[@ 3IJeo dHHf6n^Dr_HH|!оNn_hcrq � � � � � � � � � $$p40nϮ,˼zZ2H*^- � D.SԊcHIBOng5mr3kxI 6^pZ˶%qH۶%KRofY}W�-Z,!m\̃De4GPr%(q{ :<wk+\ᶋN`O_?N$@$j 5qG$@$@$@$u4&;v,� � @&i{bGn.^E2ߨ6;H$@$Pr4N!Չ.&2ĹGe#M>rdV}5#&I[ kx==HKqM#Z,$M2Ie-Q7o^4u}>] jo1p;h $G`XY4ĉH!P�p=]w5j�sghzy3'K/!/A@B) HH ŋwD 曓kIHHMLP19*\G$@$@$@$@$@$@$@$@$3]Ѹ1Bo5&`N\@޼/$^O$@EOA:nH cJ 2d�4FIG^{ h�8p jwSf&F>hL l Tԯ,\}$9u ~Dr9 05"#(iQA-pB7شɽ%*հ!н;УZ&2hLFǎ@a3$ � � � � � K kV jː� @4$Xxh H@嗁sMr C `]$@$@$  lB-&^<@9 S_ |۱RW ޳'tH@[׬ 3%&ujB$T]?ԑ@FD(\p!ںW� _eK W.qc; zԠ%K68C\K|$%y�:�z,u^9t,x pP) ?h(RȞvA �;wb$"P^5$@$@$tw E;uJIHH{3O^Q/         D୷�gLZ46eˢJ,#г/S`;E paRP+pLY @l[l礽زМR+V-4e].,A@cZV61GNre`lEQf/#{ysS߻7b{Dڵʼ^H|!:۷˖|/ߓkNW4/ ӏ#HJ@nYHHHHH%ZǏ[ ' tW_ <Zc,6?{goSBT(*A26(*I(54*C ȐȔP"IBۜN{ιg߽^{}ٳU`@x%9��@�IDAT  l%%nh;iRF1~G_%Pn|LƧ|Gp⫯qr+" A1 PBA@ha?SNt'P&pݞҪU�T@S^ψ/LJQ(V VRnZ]RJ7ȹ_SItSO*Uׁu<ΝʕwR,p�|hL<p �}ଳ*U�CHO#hקܝD 3x/]3j@v^Gd~' O >@G^%+<!ձ" " " " " " " " "^χٸ;wf]o*~=Pg^ZN]@VJ."PdV Қ1};]"ƗիwRj8 /FVo6(X"hc"#jf]>1Vn Px/<+uT/{2g~zw؞-[]\{-0s&РZJnR-VѧZID@d++" " " "  PS*<[n D 4*A T <sA,$" " Aڲ%ہNӧg<מ! h +<<_|_o/57mIGD@ zB=4kVQ D ^8TV #G)o5xƒEx\G/kvmBPr%޵A1=` j0&;P =g "Mt 8F 'O(iw#nxϡmZ<x r~'wA'm<0p'ܼ`l "mTݏ3&Ukz@܎v9@^=~T" " A"%KfD3/ -v4/N,Z�)$/߯J" " y# {J7={f֭M7e^5AओO?PL}{F}�l{%H%磈<GT]BC )HcS:w-(ELh'p!@NZ;?A|?sצ$#*"*Rn3X d:s0S׮`ey?z+Ie_`Il L My\UǟToN;3� vj쳁+:=np NQN9Dr3yF@e.�`u%H&{" yd**8ˬK<eҞ@bgxEU?|80b'};P.Т7>װad.l�輱jn!^nؐ" p5f�/#{:q,;P:iPԊp=+o0Z,� LpfY81 9�*Wc+Dq?N{:�E<zԨj!" " $p@2xg-\OMdt.$@^ gA=45ZĎ�}x#mPxڱóM|FZN4'x�m֭l{vMD |A-ڽ*䍀+fL <!'n3`÷h9y$;#�>Ţc;:vL͘)~KF?^]�G+GGٶ-kz5d dz}Nr2i+pSO%J칇~';|_g臡$" H@dl5YD@D@D@D p$&QD@D@ PP_z@'i5 J1mK" " "?{Z d8npҥAWժ@j@�$->ͼ*pرy;6YA ap_lOCc SԬo@ƞeB n$" BNխZ1Q2ZKvS9G)L>W2"?jy(_YPO$磏<Q` ٴn k. T9Q\d `_cb9{ Hoۮ`;Q4kH<*_yc.~%:r<¾}�'|㍁ BQ{KiyFoJtk_ k\({Zsx E60lܹM.,:?q$" " "9FL 2q%޲@~ \~FO{%ȍ�{' ʳ둘V֜V#N{7&yW/>XzYD@ A曽XR7``]R?W|,.x!/c7_G{ɓ=:uAw+R+!mߛ7/>tONg2}%Q?xy}KID@=ZD@D@D@D@D@K@Z%E@D 0!?ft0("+@vJ: Q Q!J" " "l|&M/0u'ŏ|1tժ^z\kx+l=# ~34Rb^hlB:12dhDÙy PحiSF=G詧_h." &е+#\]XNbD0ĉMDUrU6"w_Oƿ/n:Xw^*`? � AmÆTi?='O?\ O8#FxQ625(cr/#?\ܟ81c0{&!)qm6>{S{swP| }tގ" " "ڵzmBt'Ċ�o_.UGD@D@D@D@D@D@D@D@D }⸢hCgF7>5T (^ }i;$";1`D@D@N@nyg Gz5a! jjkj`G<A^�{&W|ԨjN>9C�\‹t�H۷^lۖˈϮ+�45d]K?ޫ?Mz" "@MID@D@D@D@D l_󛋎H%wgөT3%^S/P~Sd&_-ffqbz-s._MF< ѱ*:WH= r\9c^%" A#xw"QVO8"mƍV(+cay(tH)1رzZbp1%#5??Hٮ'Rl L\p@RѢ'Һuz();qYkQdڟsyω+Vxߜg%  r--sD''1WHLK1Vȉ@Æ@ŊW洧@p<5QYID@D@D@D@D@D@D@D@D@r"0>0m=ht]^P%,N\{N-K9u&>6O&" D@n^]{wo}DƄ.1A^xIF`Gk^~ob]Z_}gK-/\tQ`[wuxbAF?xٵqc^Zlnغ5wd+",잒@~ 0_7/" "Jhܵ+C{A}R~K|Ԩ 9 @3*WH, lnA-4\h38'{i󷘗?m޼قYku<ӧwީ3;q]qfL=iǎi Bi*dV/M͋EnԿgVSbxn. sǼ-YNqܒ!C9YiшM̏p Ik ." Go=;؎^n" $iDiӦ&j4&j�_A)Ǽo{Z#FxNNܧ~}.Q4i-m4 xI�{)EG*'76SN'ܶ&d|w~7wix+L_ K~?K>KP;>1W^+eY%: 2ƺuϪZ{AyS4砈`֞B\"]D7>8>N L˗8U�K 3|V&wgժUMt9wt]l6Xӿ _#;sI{(ge??Q9֠UyHS[_6l3gӦM1WW2JzCo3<c8K3Ϛ>حKSo+Wq@fk8Mm'_L,]tB[( fU]+L@qeU�:LD Ɇ T�[Z$X?,x}X\/&FvZqо=0w ojŊsn s,|%_L$}0ARт0[V+yug޽a6K@.[-mV7E' _r п'*Uz8 |o\-K$qe=ribe2ޡR#]=_䯑j "5![DHJϤ, -" "G;Â\O<0PDB W^ s [@}D@D@D 03sbԩD hhDcB_uko]2@6@';2mNts?\ /s0/!FǤIb&Dvh × 6(2�{,@יNw lQD~\g2<>^]qg>hs lj*#5j@@�[ٕD@D`7' .Zx`k`F%H'4 c |J %(JyA/2c_}=9ʋ֔)@m{sxa:$0ߟjb=~+crKBqpg0jչX-M#K_zև}}\_e_(˜b`EX/DaNCKEM&?@ 7}꫁Cam122I/RpV&ٿ‚mݓ/…S(m%CDʕJӜsQtLt0?`dYd." " B{ ?ŋ�˗/w"'|=ꋖG7Y?}OZkqo3~ӁIa-NU,j[Z;n6%%@3槟~/\ljǁ>oŸ1ŋnc$ض 6.B|;? 9ı>_=P7YgLjXRZ;_-\0?˖-scO6Q8 |??P8mh{n<C OUm_mԬYjPQг'p)Gi94eti|ϡE@GL%?YD lHh <ՊV_ M4c עhS駁̞m#D̥0'L'}a,'bQƆb'v1Gu>h.Ƨܚ t ] a{>o)MLPqm<-e֪g[V$r]ݛg;_D׬.ܢX؝|:)^mv̮H}D^g8ccGexAy@ |(H|tFH7{ƍӭ]W_<R@^=-nW3])Ī@ }@^=*"7�|1p睞8[v *+" "0oѶ-k@^Ƃms4p{iO4T*1o /|@ZEe'C˜3OgF eUXϔ_ s)(N~`) vB 9M;?(g2eOD9q::-$�2^O_oNJ8؂OFÆ U 'ʔibG̃^)"_|Zh_]w]Dh'H4~' l~N4i?bgNctNKtmw>>vZNnW}se/Q/�0OOٷ'#9EO:)[tVN\L~sJ|`NetJrI~}N*TpΙl'?}Ц L,kl9\=tV˩HC+'ek '{߇dqLÛVtı$:=~(HW%`=g0E >Μ9 Rv֬Y=gIqZ<#v"WM=;hNɲDݺ9 I|Q`^;0�,'&DT~[@#/{w?R0Ϲ)Ea,>c8 s]`V\Nwz07 & \|< "dKD@D@D@D@D@D@R�ڦLòiD#〾 -S$ߚr#Ps-gIx4hPߦfXߕ#sh{43d{*Oac0QK Ф'.@N%[♧)Wևf?p筙8_/jųgv)F)f}b.LK'?>8m.sN^%Ĝ?>5w<8<剭]r p}0״G#�INLУ/H_<3s8Э'&7i35Cnvι䱾R ysOؑ?*?f&+�{D쳁%K`~|HJ "B}cJP+zv:RD@D@bJ@/41$8[aڷ)@6 %"0P7񃶒DC`�OF fO$" " )O?j%P#DcA~;O`W@ Ƣ0sO �WtpcĀ � . 0qZ ?O`]@~xшE39 ƉA+V MilOt8ze3ukOHbZXh3*g0c=6YjVd:Y\|򞁎 -? dQ$S`4vκ74ݻ3mE:Dzj7_\|T�/>/fRab.LlCtc_ڟh{b(n^(T܇BuN9fymM/7安XN9xPɆuؖPwsaۻ~;0qkYr' {i N2/ąǻ 2}I8X&PP$Hc;apN :A'yYlg&PH,-=z4ƎnbLXdvu\`'(ߧg\x)O>><͚5s9&&z"P$UuNH,|5jo83h/}~pYһn0Xq/.\VfM4n-Z0ߦӝQ2h<8ȭ sOF娣E@IKO>u)ő@&Ԋ#^e--(�Si`?BBTiپ1[cfطťUЉ/9s0m47f,ShaXѵ}B0@6Rd&@0S 8=u`J_ykMw|jL &1ɯLv~tÜ - PԌg |>W5ldSD@F@7g#E@D@D BSLCjρs6oti5 $"PCL3h!UXhfLϽY|*` BSȂt%KmZc ;;_ȟS L;$$@h l~x0//oPXDaJfũr8!!Aq +E@Bj}xh xqfLk:\+%' jEnz*?st((`C-ּ{ ŵ?뮬 pYߵ J_3/_V ''::b}. φR`prLg8~f`ѕMkoٷXR*%ᢄ9dkc?뇗uŭ__ ya <EN-XM;(? vO?9St&mdN+n&#Vlj 잙NZ-"PdYuXf1Fi}-ÿN, "7n `N4M^Z݉n͛7X{TK$#{f?l03ƍ7pS5rϥV%` ! 8Qthڴ)Zl . P`XMMJvUD@D@D@D@D@D@D`̙裏&F/^܂tz@dJo_oNMb�s9\rLugYSy<xǎ.ƃ�վ)u`x^Q[D nG{G# A-] "w[7v62k˧dr-~o_̘ɔJSNihFNXm۶;wbxQ~ k7;xAZ3"0c;:�=>p0B=P?[bbZ%sQGԙnl2uGDs`FgmcB3$OHqSyѷNM\s$" y# ż [Z4," " H@/4?ΧP${ SHU3Cw!" 9!9"# <(0Z6$/1N ]͖7`~3'?PfځiSܜJXp�P,Ki1H~E^mDV4gP4N[%JpZUTAժU3M&PH?ݻ^|ɚ+WL:ݵВjҥKu2Q"07v[wN8}:`Cɹ 3[f5Aiɒ%&:M2ױ/@L rX|G=<( d ^Wf?81~ȟSntVCl/ CDaQD =w"gD~so?N&{6Hr>�3 nЮ]" ! {pUKj jiڴiN@L!-R1� z81gXDr6hGq豭$" "5~71Çm.N 33K`: sJaѣGgQxE]6mڸgN`u jHC" " " " " " "`~' > iv[0׳WJvR5j 6}Iwd xpۧVzAcq)z>e)őWY5ٻ-h�>'{ėi~qʕC#n k/0l0)6~1F̫\̱Zz[.[C>?o7m4Qk}2|Kˑ#-{nٲ;ƍӰhk6;A7[LJ[Ԭ9o($"4WE$=;)" " 1% Tf Tsĭ0su M,3`e/"Riqp)U5U�0W�6y[*B" " "%:@-\M pgw \(Zed4#PZ sFl6-e)t,fŀ 9ƇO_عs+$Cs#,D@R?~{ƺ1x/>RL+iHP+bjUVUTT#Щп?@m>o2L7͛&"~v/[{ϤX?Ѣsk/GVf5?G5jHԠ .I}o:7ov[ 42LX0>6v|W" # {ѩA} }p,A ۶mNQ`遼vӷA뮻[C9$5^`޽{wm6m1\pAZhNXϙ#Goi'4<*:&*�| ={b ]~}/9; }gx`֭ѹsg76ɸƃ3Z:UgE,x$ƲG=˓[F j%o۩# {m"{LfٮO<p@g r9>q+ j9E?vd]vi!'Fn3"'EcbCnJk?ڷKG_Z^QT+/ںz,u|M�^x&$byj]U/HfW$=;)" " 1% Tf Tsĭ0؂7Ӧyb)q;Q2QqD@Og/⪀'@ěo-x#н;H VD@D@Ҋz^|8͟?pgw Q4p )@ժUCrҊ*+)BG:}5ktZ QG$8NT"<hF!]\n:Ӂz۶m?ό'iHP+z>Jl!bn%H5G퉹DZ"E`;q=ly̙FA"&/=C%)i$ .CQ-_E1x(Eq:uꀎv$p fY2s7�t̲['8hh z"WDJ%L@8PdʕN<cǎ84vy,^Ào..4j(l/-`?Ƌ/ɓ'* ˗5Aзo_}[СC7pT# AkrUXD@D@D@D@D@D Ep"Z\jrM7Y糜/QT3jlݺkf)߸;W_}5bI!S}<OJ ޢEdL@pзhQEpʔ%V*hw"A}m kƍꪫBҥcug)AO:1k^VP!iT=2,z8()#@- 1d0Ay^(Ǥoxt͞Mo᳠qcؘ<cp6mڔRE % _1fVtĔ^hb3PIp(Pl |7,c]kGD L;‚8<�{o& @N"{'$W1E@D@RYYgvĝZLe˖u~4 ^F /єTXf Oy9;vK8Tu5 -N&"7&x We8psRVtm7.6lΝ;@ 墣D h\dFKB";sgvk~8bbB*$h`77*8Fl2' NAO<MHJ_Ŵ(5f 0j0s&aӳ iCkӮI/_+9 *NBl4#H K|BZժUK$:t6i$sFml 2!NSTpvZԋ>=뷷n97mT\e~ۉu!;VjϹ_E HP[@ؼyzgA( Tjռe&{_;l+0"IK@7]*36^ .$z6:RD`lů0`Ο.gVwݢQ#MM} fo7x٭_g{i_ȞW_<L)%=/m ΋d̀ 3Bk\33nّI9 g}6(:[JJ" " CZѳӑ" " "Sz)@e&@5G cq!4XwDHO<<,=,}XEL kcu>r[ .EW!E@D@-[0k,gGC>N?Scqsog+&Y-U\H^t:ŵ<~p,Y&pܮ "_J䭰J.)Di|Ygߧׯ.)Tks::+WΉjM<9Ltq`@޴}; hgf_]P^{~Tw >жU �ΝF3f�'fL2T 4pSݺ/JDVÇ}l|s{[]~/sƗrME{``ŋow"'*&4-"f4zh4j=zp +N$" $0:Rw}7.\K/w`Q]+W믿.}Qtle$SM@ZF D@D@D@D@D@D@D a( պqw J_7z vz͛~`xpl$ƃ˖yQ." #Gz%x&[=ӱDG@nq(ٻeE%u馛Lk֭.:KzlXnLhѢ"09FE3_{[V@ ]B/mVVj-=t͎Lr73Rh"Ntn٨[.,X#8"*Ҋ@b,HEĽkD@D@D Kf>ʘ]Č{|Mùeb2HcywExJ, TB]t>,]BshڴĴQ �R/6G?ӦMsNիWǘ1cЮ];bj8L)L0kI:*$E aŴXM6D-&!P<w_,^8 %R1D v-iρ?-l{G{{2oҥ3#aڦnw v A9?Ĵb) P�aÆԩGi D}衇S˖-p#T Gaݺu)HDU@J{N&k‚Ä`}pࠃn[5*oho%#FVZxҌ (`} F 1(SD/)SI'dn�E•D@D ¾vV,9GydI}+"/l35Ug>_p$f,ѬY3'�ߦM7oOӊU0)SO?t\yIc:=Sm<tiቤݵlڃX2ID -/{O~.]̷xl߾}>3i>;kBnG O-Q@W_&"0=E F~qbŲ2 0w``�c7~<1- :9ZZz  jJK" " " " N@<*$=<0p mRYL \~ ;p1^ $))" "tݻ7.R'ua[ou:tsZb ~ yKID (>€j;vD>}A?Yfǁ{92PjѵkW = OID ~/8&|g(i%HW=Y~=峒$9ýkhݺʘ�jl2ZDY, {}N 5ɫ@ 5u3~&R /Ѷm[̟?۷G PNy=z4lOLફ`h>cf&HP$.u&ID@D@bF?tA(t±c~z衇4#cր0l0'`.J" ".= tCA QFT?,_>}:J(dP&%H$P(^xX1mVPzuK ^vm|'g#5?ȩ2\w(g/ j/s(w"%~wԩS }RFO<1t(b޼yR N;4'm6SOƌ񄵊6&LC&UDeO  tvp%@!dcf /o1h+c��X aqv^{%AH$""$" j<WC%>e|34J"K |=СPqc,ϠD@D@R  ѕ*UrVO?4XGug܇Ays9Nx'."hs<`V2oΝkOw\pʖ-N)hܹ3]"s4n O7͛7+q[B&a峈XD ']Y "߷zUfh":}*$3͛7wvcǎ5A?\`/ R}\rn믛y(\^ 'oժW(gDtb7.9%H3f8qQ >~!(`[ W_<LPB -g&",!}6mйsgfΜ9=P)(αW_}/2Nh8+VdAZQK.֭R,@EUVο㢋.…^o|у匮(7Ò}<dI`Ӧ(*CD@ �޻�d@nyL[ >ժU,P)Ub;ǮaÆ+bEV&CF8Ѭac`> |'u+`!`9b[cP#Ti._��@�IDATZK/7V oH?P' 2p¨P2b/ AhDUAD@D@D@D ?QBD@D z}^y%eU �_|5 4 8૯*@|0@fEBnV"y){pEvj׮-4r@(egYogM0H=z45jaÆYUX\s/=cD@"tg\_Z$iy(Q"]$O>k)Y?U*P�U:urQ.3:^|9 v᠃J=�$1s>0JNsfu%qMUX0sƌsQ88[g1MEk{Y" " "[:NGq99(LJa[o{}uc4'H~KoMq9KcǎN|˖-8Q;+WAMͽkAl.{C˖-M(DukG_/[KD X$PiD ] --/{OowlcD+r>J[!@_ӧc۶mWfΜM6i֢5�$ r倣ډ!Cnć'(n~-%@!o7<K/ta f>}W^yֈ@З$n<]D@D@D@D X$PiD@D ?x!ǕD .< X.2$ l2<SS H3A`Vk֬ApעJ*IPQD QZӦMͨ w`MBZW_}58�\ve.7|ŋcƍB*#IIUи1@cyټyeaiO@ݺu] $,Yz j*É|ewy'jժT?H)|;ЧOXuZ/٢?FϐXBJ]W5'{î+aρYP.%;^zK/uFw~R`/D6'cѢEhԨ֯_kD@D ̛7ωṞE)a7c)S6ѣG':@zo)h;ӰaP�K0qD̚5|O]�}JfQK8,ARtN  jņrݢg#e;@z ~)vy')5j SĔN)3sK#&LjMw kMNTd%o[N3?�{u Nf}梵" M@Z~*@PP믿T ED@D (_ULb >x00ओsB*@n݊{^:k˗/wA~ax(TPyjG&P\9zN xzsakPB'GMC͸rLK5%H7/׉iٿƌMPDE Ԯ]FZ)Ԩ)T5ʉ׬YL&Qr7]Ǯ*)S&j@zO? fAZjxо}{P\O(c(u7ǀ0n8,]_zM1"ע!M>C:l_:(@a;wSO=i +QX1Dlق͛K|5'X&"4/GǃJ'o1.bnl2E@D@D@D@D@D@D@D@R p,Nnբ?ع瞋m۶H4\ 34ƃ% B'kWH1w F-c;t1dܪ_"~aذa>E3KAúQ#OXˆv`8 `ʔcE t/r7;2 i{o吠VlED y .yN%R`V(GD@D h@꫰@ȑ. :t�fNv/}N " " {Xn3N:k_4i;O1+;CNk{OP43D~HD޽qꩧX)vҦM~�8q"wv9U3 7S;w`:JLয়`ereOLlټvN.GH *UBѢEݳ"5jZ iQ4N:.`-qףtҩPMAD 't}y7no )Vw߾}1hL2o<NXYf`[Žzr?et Wk_.`8><y꣒$ةS''ۥK*| C1ͱݱm۶رcG RUHRT[}^#PH}mݺ5-ZTpљE@D@D@D@D@D@D@D@R`X/RJ,?ܱeN7tSbOngxp‘xd63:PGID 0PTbHw V+k|G#$X?~|Ai(@q6ف}|uĚ&tx}=f.mVhAD Nⲫ" " " " "(XVjFD@Yg;[IJbqw+zJe." "@ׯmUM<o~<裨VZKSDt&MѪU+|1b3L2dP~UVa۶mn�`Y[>j֬%K^z._v͞=["[vaX}MWʼniz(0q*H%JDw!PBWI@zwnf\n )+^yԪU+SD@Lx+1}t')&Q<xΜ9o>1a'eOoW_EO;4)Sƍ\r%ѣN )RJ>  4�, ZVJ," A`ڵrE9A(uꗒAF Tԯj(":СC/;=JNpx뭷PF K۷o/2�" " " " " " " " O~I3f�<P裏;#@≬ƃI;s%xŽꤽD@E@ZjF݂҅np׮]O))b;(ņ@Ӧ02ओfΌMEC@ЋݱƎe~r=PJ9IP+g>*"$R(*$ ^9J"ILHZ&d�s GI\!]D@D�;v?hΝqƹ癥c 2QO>N\AȾwO=T"Os16(lٲKL  YfڢV+Ō@ʕOcŊ`֫ gq͛Q^Hi<}ꩧ]v1`�'Ƶf. /`F'z+֭˟{x:Q?sehV<gr۞1Z'kY*mNp) JYj@Mk\ P; XO"UŊE/.=^r"wPH3P*?7N˶'kky<N_bk^l|~ �#_|񅉩~ kvwA!BBSV(_n{9Ab>/^>=ܗpcʕYfXέߓ Gh|=`1' `LG 64HD@D@;ÉWD[nҥK^<y2ڷoF9q>'x?csWv" "~ Ro*T <xgUcǢCh޼9nv'ʝ~YG>� .tϚcE d5~w.y ;h<έ<E@D@D@D@D@D@D ,XyuQ2-8q"ZΝ;cZ_S0p8},믘]fLKڈ]}kϽ4%%ʆQc|qi>ep[;UD@R26){1 nݚq=~ū/n|ر#6ll {nfsǛols><'` @ÁիN�ڴ~!c%3Dآп9.2gF9Z7d]q]"!=u͝Q<X\q53_ je˖wrD@&PQ.`|ٜ*@T LtDL^=bƚp0mD O;@,Y:NE}dF Hby | 7˩M6%T֭KDV9($K`tLf͚s'drRWOU^'x ors|WrsdGyuAk2rp6{~ϟ&;Y"?0IOLd(2 ;dȋ?WgȠq˖-S,x+v/~oJsVZiԩ?~[On۳:FD 'M 'E|鐸o+|(fwEqoND_s(ZX˗ORLAS؟x6c\y/E1ϣ7{`1Ţ|۶mrͭߓ GL z(LL8x7~5sLOD@D@Ҝ�. rg JS5oRPgϞ``DQT iuYOpᇻooQN'мg9[D@L߻vꂅO2d Jqe%ثW/0f@&Eq:qLpWL {o͘1cРA) ?,ZCde㐿3hnݺv7tSNb93XݔߝhcO;_|1YgOՍ7ƤI oƀFkgBacFźՔ__ŋ'KUNT {H8QxΜ9q}9;f̘ 3Wnv3{͛m۶2(`%ǝsL4o~caP0 6xe- .gN?5ڡuH}mig}6 .l{;{AƜbܢX'cM48־=̇xȎӚ5k"; t j Jso-@^t̻:`}E z%J�{ÆFyQID@D 9P)$RT@-Z\8s;"_uU Q%KTB:*Ŗ�~]`"ѧR|P O>9 ?8:X'khŭnذ'N43rjpc\[TV)Yu"Wvag6x019dޟ%ؙ [Qo6'ձcvMtp/z)bK+D>W;8W{>ǙxO~v@@t<`0;,#[A瓵Eqk& ܳbk>dw絞؟}Np,?tZyt<#q7sg`@l:VP%0X6 {r+ g4 'k+=zOy睗CSvUVwg[G npe_o&=+ۃ;~:t(.\e.:LD@O-X~bЬ^ډms\,ʔ)ݻ\rn_?*aVGc,S߾}A@jj<65f@.w=VZ4++@2(`3sc +VሼE"Fci<8#- {x0a/_nŗu^4gѸ$-ӆQc|qi6e$OWJ*"  {Oo-Eqw_$(dL[>:KZn&֜z!_嫯uhzlZr6.iթk!D9- }xss7S){kr\›/Ƨ~)Sn�m}3bCUc�,Yf~C+~/WD ; <0<E@D@D`'DKU+�'aĶ&" y'0g~[[oa{& : j"I<AUi( ;˖-sK~Pq?g:*Uy P fڴiXkיx_a@S iu18g]3ʗ/C9$s=˃R@[7|y^0'<îmz}aoSV|&VC=4]v}I7nB.AmD=W6lXDalwD@"n-[ĝwމމ EpXv){ t>O~ПFe /oq _ouc:3b{4h C.]O/~Q~'xkB|}iF@ 8N!" "8DX:*&@n g7uaf jƠK\;/|9$ ޳/(bAP;4zhlڴ |N2ukb=+[pT@y, lܸ >bZ `wN%:闶 mڴ zQS~6l^2'c'ШQ#|A<w\7xpFf4&iϧĆo(AT." [FFc`J>}݌/tEnhxGJT_$(<yd'~Jɟ|n&֕cի?Y+0qHBۘm'E(J<3^utAπBL{W%\ȚcW.Hx$A5<gvy_?RB+իW)?Ut3#@@ҡUGc/P\BN~xqo�)n$"`Z:fP X  Ԫ<" " ϔ/"m?pbQF94~t+\}gDÍ?ss> 2G91 R<L1-[駟vƉEE*U\;ٲoyW@~e0" _^bʨ Z<xK/Y`k[cǎX5r7W_?XzΚ5v뭷v϶mI&:.sE_ٳ'N r*U?^z%WaÆ9OlŊ~ӧOsqƽ?:tX~ˇu.Y$$7u$g[G6)<GM dj*xnÇ %nN:ܹ^%˄ 0qDw> nr*l/Jg]Yg Z޽{v իFgqpA @s;wvhn�r۾-[caP#94}ly}:mD1^ }&g;s==u5EzWLt^ߠ.̡wx{O<: <`�ÏﱏNy\uE; N=T'&4~x]a Q'*|xyᬳryO4-|`,SnܶLG" Cz}I+{P2r_^Xr{VܞIOɔ@)ľ )x{ /n6�ҥK]~dw>oX6<9;DX >^fbr^ =ڵ3'N8`ncR8e#GaLyOhJ"wr= g75~]3qi8/U~۷o|:7#сGƌcή$" '`޳!^)g ϗݘB֭}𸜾$h"ݔc43 UV;;pe) !ۘgn,dn~Er61bۅdQG~2{l&-@P>wer 5gVڗ>xw_1,v<gvvNy*V`+֭ic,S^UVőŚmtgfL6 }׭xp<_�/W9X_k'y:V:,K@nb(pWb*)}tw7n󫉕GxNmL[( /vWA5vZr4hGuvprŻw%O}:jy{.IF]/C<ΐ[/S$(? }8V.^CҥK}X;ٓ`ʕ)<Ѷq÷bYXP= )bqSNb~=x8w j~D@}R�u̳B͍¨1%гg(t1RwyKq(8@U" iO`ǎPaPBm� CzB} ^} ӊdKcB&2ѩl 3bq/L#Tv퐉Jʔ)! @<@q!믇.tG6o1P͚5i[ *U*tW:Bf2C͟??d >r: Y^sh Ykیwӂ9y\x2Đڵ*p In0,H[g`nk\Љ'ڊ\ w3rGnذ!dBf�2! f&ڕdAC&䎫UVD=6bb;4ϐ`6aF\!3r!oDB{M<9ԤIL~7Cf2ڇYfMD1& 2 ꪐ۷owU\fѣ;?v5/Dv2[p u&K-[v׾ɰ`Bb;eiAC/S=ǃQ ߡйz}){$%/^<dbŊ,oȌC&@&Ι}bLY=̈́3s<veЅҥ{ѵ>O/ɇf3,^Ȅv=;uWs][DD\&y>>LH-d^Y>Wa#T\isC|S~[?넉u嵔]m{vi0!X0cƌՁZ}ʭI+{P^~_f#{V?IʍevWӳ2>3琉҆.dscǺ;˱_v!?q] SDr:<y}9\-B&4r,c$g}Eq!Lisbea|Π\E@B@y}H{!+ԧńVջf$cޙM5oJB**"$QZS)JdOϒ=K&;/D,!g5̙33gf99sγ|ys}%8"/|\x޼ys(bb`ovفfD@D G wB.R>&ќ/17ޘJ}'|ٳΥo+ŗe˖NYI@|Fn.3My2|'}W^q?l<'WBl;-n?cc7vAWnذaZj1oׯ_K.9PΉ~l?]7�<_#ĹM?'輙Q}4\ہF"} W9aLMds{o&9ʧRʌ}Z?F2kxkn9f]USO=?ЧKvc� ĺ832>@۶mc~!CS94q_wWEvBR2dͤ}{17b/=NeO1b{Dl~'c}!uIes}آ?kr]w;RHy;8wL0! 8B4`eԭ,ZY&>sR1w2cD W̄ZT=Є, 0jql)y0.7uUD@(fؓ^("P8ԔRX Q.*YD@D2F(FP,z4֭[v7n *.xw8U24DbM-ܲp:EJU0k]}߲h^|YG+Fc7|-b+F ji_)c wqoX 0.\"S؊ELwK BI14/-XCA~m]|3!Kaꫯx׈#]\pwA0{lbsR m$Lc; K^]O:$oJfh:_r% ؆:'=":tIT0=XH4rZXǏ% dfz).T {՟BԢФ(>RvmkDۇD]ìtR|:x`3֬N//2{-t`T%a.b}x+{sث*A-?c/??,O5٘ȻS({n%<!E 0Pu\(Ⱦlkctxl2W?P2/iر z&Ms`.cjя %=ga uYN`3VϘ>ќC@s]ɷ$⑳frs#O><,<y+~2'." 'o{V@L%c%}4zT(0qs<;5d\%Z0#)mB<OMu:͢@1uΥnnx \.s:�ŭ㎜Tnvscdpyx74m9Je[-؅;A-UoBޕ|=zhgWj>2 F6Hj~m_>}4W\[y93C^)JP+Lj}[EMy晕v.X\ݎ9H+ Eٹs?e ڸnÓjL̃:vc9 j%Lωf~ӧOwmO7{4y,sm6Hs#e˲799c̯- }yc9i9RHw?#7I/'{S6{sOtL_G}t992g#E W̄Z)@vh&+V(k͚Gp�Ю]YP D^|1Эp6�*bE@D@@֭aGdڂvD`@;6m 3Ěk?s\=܃?Xb p y,lj:U9}: W_p9/„gΜ 3d$,oYi_1"nV?`LdĬ馛V.3l;w޸V[mU_V`F0-AN>f܇iɒ%裏N:xv^+6x=`b\`Cw1)wXU6~o#%=ȶy&[[yX0zD`8ދ+f $&r7. ֞.ߟ͜^EIEnkՋ[oE׹(+\&XѯxQx�l06o*=MӘ_콘ߓ 4lB"O-՟!׸m+AȈ)UINΥ K/]w݅:>tgq{;&LX??7tL\&Vjs m۶nl[lwU" >gj^oK*o>k*^d}sfb^Ͳ8`΍ ]EF믿ލvmlUC2xXA4FZ7|sM~=%Ll*�;_ STb$g\$?czy/]=Y3y|laG{wqrHE)/81} ޡo3f{꽯>f' v>!D]b:j-"%n6!?' <g>6}ȂK.Izj^|l27G{�2IID@D@D@D@D@D@ʙ�<R~] xU"s1R2[lx <ũ@yi>;'VW3M=ğ1u5*)4{͚5bs90Ob\/˩yml^Ta"ZwK~jFLq>ޞx$o퍉yN=Qӧd $3ճ3IWԘϊÆ�r+�n!3Su gK$&=/T(~ڢL4e$[x"4+ksDP|0dhLP-G~6V "P@ _E/fJ뼪5" "P(G &* !oW_ Yd~(:}qbC+\E(3[(9]t:SH,.]w޹R<BoO"F$ EPpW[IcA@cRG?K… &3.~~C:u*>2 f*biVUNl?~޵Pi xmU;x`wZ5SNx7@�jtdb$J!. QL.߿Uهr[hdYϻTAD*7 vDI/y=}d'{eޯҽyŮ%b HOBlԫg4yL8%:|ѣL #Ǐhҡ4) y@|esFmO?4c�r/_w}׉庼70O?{+~^~ՉA~^jHWR)(;4ݻww|DfΜ9n-խY?}UA>CxĖۯjhfɻ] s/t|>wMUD@D$ pܼx✴ϸ"^Uә9rH70o<izΩ(zQ u]/X#" &(?Gm]cXq3y}b߫xW;&5\=/ء\msNwx蝷]_<<O[}/Ebp}oժUf}P;f<61s*ml8p5jTE|gnݺ:<GJ޼惫&L{J;i>_ժն dž1k@s|G}*?9^k=\=E~${q~ӯz%BEލץ"_-AYD>WaJv 9p CXcBf`X`ͅ�C„#U<֏͙@cT?(^~iE]M V7Y!hX5|Yn71lXB3X<-Xܡra&tˎ珵J(qcX所䅀Ā؋BD !I�.ǠЛ@aNIkJP(5>}gC>}38:z;A1TDǥ(&/[nɓqWd-;f!Ѹ駟v`@n!W_}eϪ6lկ_?fkv&&7OdL/iO+ϓyX>ՕF dC~?A(E^S^5ԱcGP8s;Y1$g e뮠#m|0lձ"Pqƽ'L[1-!VP^TDdJltiU!}OPUaVݪO39ls3=? )r۷o4̳[5sρϲL^k4d<Cͤя"�veD ۼg/x+_Bj.d}ݺuÀV: 3)~(\3O0&OTy=ÍC1߳l`l<h`́ /,ƪ" " 9#6믿ΉVqE*|Up718!Lso?'v2cƌzo)@1hԨs9sf a`~߫ި w_\q+* Zq)q} @p*0jKlB<Oz}8蠃R.Uiٲ7EbӢE׭:v>@( nn ôi֬+3S; '- qV,^`r{bg\1h>8uE_}㏯rGGD"_`aLM:?s|7|\x.jZ..H;%U*4d?*bM"qqcb3ճ3c89qL9^xs]˥n0ܴ)pM%%r&Ed~mQ(Ex;>w9#7/{Ş4;48Ѹ'a*w" # AHD@D@D@D p27.NsFU(4&Mc1ci ]/@^:n` "#" "od 4袋]|Nk۶Ϋ7YgGyĉi^` ܾBI)~L^pT帝à4Yݱ' ?j_)V *dMb啜<g/Sy_yJ|7��@�IDATkV^ 45+uY]󱎘<b?ubq/2?|W'DLp,mE`Ң3g xxg\=*v駟z9go]U8($h{*{"EɎ9' pGsO ʟ6T=Nn?=/صwL's:Hv/TgZjUu.cSK^-Ap  j'qcРA3<c: :>Cm>}ϲ^lYE?&I$kU W_-qX|񊟱W ce"J?# %o؉mӦ}7ݞtd<C85E9~={6xM|ddV9]k FY'@yymxj\n+9o jL|wtSO=e6$" E@sr.>8;tV5*n<Y`giU՟2e rDx Deلy썲+Zt)˔ ?33HRƍѱcJED@D@D@D@D@D@Hk׮x,q~KR9If[-'W 0mhN̗6{YW >"ZӢZ{۸.?ρaLկ:k/Jr# jF<할Vp[e֬Y't~^7{QH9ٻqLL©Szsf6tS;!՘Ş/%+|_sO! ΢�rLEP\LO>zN>j+`„p)KOeѢEl2V_[|q}ŋ+3;1 }J%EVrƌ8=H*0q"@wn"2ŕ(~wsV" y$`%Xf -i!(믏D6(,Y 4m\zi+pt} Tى@4n,_`m<H䪫"5#.]" \'" "{q1Qȏ?Z*{!b+h7n[޽ݶ>m002nܸ9DL!b* .~_~s9;3\ven1': h6 ߑT2c*ɇ?c&v}K8qh;F&@ msN}Lx)bp2KwWXf\r%H1Ǹ E,ؐ/}w(TŶ-m3 ͌uN:U3aܶs=}5rFƌ9=3&eˍ>1~iذa >&~~#v[O>q6?<k׎l F2SWX?YoqpY"5jpu]mڌ29\Ȱa"`~rH �]~V5kQ:HR"M7D6<b}M}?3x[n7ݶ{A<U_==裮]&ǯ)sIԮ]COtM?hm3Gnng)չ;*gb)_ fUfNӜ2~n1aYׯx'؇k ={ݬ"ڑSO=-$񊟱W H{?N8ᄊ"$dc?# mNq9b_cN5ꍘnejovrzu]n_n&9>{~(ދ3BysJ`ҭ9gyίX`w~8?"&�fC@a/bOJ" " {Wׯ_}̲yג9| u]ݳ''[ps6 sr>$tO<eE@D`8s4:c%AE*A1[XD{8zY0De\)+޽g)mB<OsJ%m\s͈g#gLYtѾ" " " " " " "P0&,s`Yn.[ouӎ;j 7scʶ(([wu+C.fc:k>#Nso51;"ի׊׆1kyWF̋^ЖQ)|fs[rb! {gc</{m+z,Rnn;wvX3~ċ2qDv٧s' `>)2e+mz19Ǚ3ggǏ 61X J'`aH,fI$bK̿8ba _TcTЏ͙[ v('|rD :tpKO"\@z<1ؠA>/G'o`_w}ȑ#:Q(]`ؕ$ Ŕ`SJ" " " a 0AC\.9.zr]W4~6(iV#&w_ꡒE@D PBDM4<ӡC5_j*Fc#&b0BqԩSo4֣ (|<6m81)17x"La]2[!C1ng;NĥTm>} qbo˅^k̑QTk$W_YѣGXUѠm:1S [X/@C,]3EFJ Q`a ~qǹ}F_~hüyv"% 7Zs=BѨD<#|?N:ɉyw˖-#iTNOt͝Q5/)B0rytIcF6a^<β NZ~jt p>og/?Sg|QG9'͙3ޝwYͤON{OޠRLi>|Hv/T jn=4a^Ϣvl=؊{,H﹤=vއ)l߯va:v^^<P,d5p{^~`u(~Z F8 :hp +{_8iԨ9K^gjKGO< B[:MY4-DlCi$߫W g">;`7)/62 Cxxr;l3$ d-w 7D(IQ.Kq5z\cJh0&qU@9=g9k3.|`PS1}9TρIN|%Ω1R}{3ߛ6myfa/d/$" #9 Es!蔨a9D۽-_<{uYgwc8^?##|Df <yufe2s\;`ߦ$J *;0o>-&K<SǦ+b&o.5{ڵwJ7/" " " " " " $@m٦W$xZฟ\YxqE<!T^lx !A9I7Cu|pe横Zϟ?_ٻ3ڶeƬ09%O`„ٖ|3C@s\qE(J@ SgxTm=Hr9)G{7p8{D3 j5noGƍϘ~`^rwd| pL{ bLnQ} 5$a~3HBX56cƨlμE .^�Я1r>O%SP>q(B6hР &F")x$6hê]`XdM@#GolJ" " " &w@zi2*>P7� ,Yh,vZn1 ZD@D u?ɎIL߀Á8*ND@ʜĥ`Ѿ}{S:tPTD`h0mʕ+ab3(W_}e .<L~HUNbJ`XU_UdGa_}f[,z݃j1 �*e@^{suu2'FhZz姟~ WF fR<=&3\ n5`+b;xnXG q+۶||M7K+VHXc;�`nxwbsߜd{GhѢEc/f9z'^\p*ˌ6xXp]VZXt_}^|Jl}{Z|>_*0lSg74ng_?e{lva)MZ5!1nE^k&,Cu0!Ubٰ ٫ "-e˖SNO fmގO?>Ί{e{ $^{\|+a[7}eւ7^9&xo30 ?O#:Dqy1$3<sbr\4sLpd spt">ccaܸW]O K/ }UC(5,3Z@0)7>z̒j\ B''94h� h_gSrĽK@ 8L/ \1_*A!>/iu]{uCȻy >}nCQdslI?A߇X~[<^ SD@D@D@D@D@D| ̛7kY nx≁oOoq?C)_ۢlVi@6 <=,Xr%|pzd5//s{0i3{W W͏ cךSy?>jhJ9&@K.{W0w ePn|wl"楗^Z%Eg!; . r-WgL:|}4cto~|<|vfL/"sOߚs JGLfqSOSaڑjZ9cŌ903/U_x uoz}1G&Mz?.]jfCA@SVtJ@4 Uf ye: 0!E�]ߡ8 @{eQԢ |9g{:v,j" "PR4[,lB;}ԨQ,Yi\BCȰ&8޽{qׯ_Crp$oaտ:"}7 ,T׿[)<Aq4t:2X")mh (FAo [>@fh۷/|yt^Q>s J!G j*G?xT^4$(؇ E8^=\\)϶T,ҎL.rn{</>qltW:jSt*qsymVNd|BkqLfmv2/1 Njk jԐLJEI` M$"g3p3 O=w_)T t 4_xᅅBrE@D +{v_~Vyb}cwvf̘r!U' jy۵/#F`̘1|mHgիW/,#s ~@>}os 5 8l~ca6M�l9d@@q馨G}k/V"ٻEY׿hC_>|x |֍7HAgFLƴm֝I&dg{.+G&ϕPq&oӓL6X<H$ル8QsD@BA@#E@D@D@D@D@ XlX5~@l^ӦEy,A*@GEv0 zՃ_&Fky睇cÚk>D1AN)rX['KdTvm1U۷oj@)\3>Yˇ~SLWV; gԲeKټysjݳbQO1_cX/8}<[y:3a0D`M vA^ۅmaJS*Y^bTٖ̮Udߐ(y}/bKo\1K9o7E  J/RQ4.>ꨣ0tДc@*PBʘTڑɥUmx-7V~PKI]|N$r6D;wv:m+L 6 g}RKN16)Wi" "P*(nB!nݺE(5b}/'vBqU%(Vap`ԩX{)Uֻ?8#`8 w F+ ]5n8t�($D!7|_61+ӢEB+9>�Gq=ؼi<i>G,’8L{0Gͣo>(4i|գQFԩS`)# ([45`ur[rb" { ۻkQL=`);&26?Ӥohœ,N嗁g(34"73&ګW/x>e!R79|=/<d㤓sɍ8 [i; y\) Qe@fb)" " L@ {vo9XtۨKm9$]pF?~{`+V;G` �ΛL&L�,@nV=nfqT޽Ag %Ȇ_x� p´Y z}l.r_r^>Ƹq㼯Z�&`�<$:USt VzmڴY\EW:uvÊe"!ó1j($:|M80 @XI}{$"@3<:T\s5Nh VЧOprUO+"<ޜ̙3} {`@7VPiiꠐ9s*^H4SॗHI@)i"#pc=z4:"}iUE(\V-/UkD, 0P'9:VS9oy]wݵ`uQ">}n01.t۷o @U[o /d6;p> Kh)%&Gk׮h֬{9(I&b:nyu7ٳ'~"o/ ছO?]7m pS֥Kp*'(w Yۿb;'xv4?SOżyp ׫W/͜gw2Fܓv6S*-W6ipgl4]Q&ηN,˖^M9Y Mx+Sfb 4?JP+M`]D@D@rE@4"[|%8Ts0*^>K-\Y ^%79&t^,=;񫯢RD@ʃ- L-ۛZgjZ)"efCC]?{-Z~�'Rz"'5j0!k <,p0'@.]hzȔ�mVEJ"F0MLz:uꄱʪ@~m'dN1[cǎh޼9,Y~gp\ @KV3~bJ"POÁUD@rE@"| I`ܸq:t(N9\uU& B)@{7@mQj"E@D xA}Æ OX7W8] {G*LrD@*9lE@D@D@D@D@D@D C .)SOQFD߃TV-pQ̙3ѣG \wu1[5)(`Ga~F)E@BE`(/20wnUr`m�{݊-KyjdM@nY#:ٻUFHߐ<|*o.If4*駟Oޛog;JK0~<0r$|9p0{vmG9S+79LqC9~@q"P䯘y\tBvm`U6kJਣ`�&ЬF{OGb@zQP(&Msfa=ߢ9Qu 4pmJ" "K/<S^z.*U=qGyG,X?8p 6m겢hb_fѸxM,%@aâh]f ipHJ}?Ub-_|sdMp)yjwǘ1c0o޼^�L< Bƍ;^éjj믿nN[OJshx_~98tkV9/"M=> dG`Ȑ!.rpJ#@qv ͚5+bί}$"kZo۷oW_}5E*٠SN{>@p6l3g#C{p^0@᱋ĴSoF.]жm[ (k*|FKL+W` Pf`Tn`eukL@nyV%{x_G_$1pXbZ)2n.{=L6MbZQ/ve1*`1+ZL3۴iƊ+T䔀9[eV%2`az$Qe""P.$U.gZ փM("" "P, kwPCKl8pu)SOm "b" "P6oqmɒ%;v,Xc \phb[\0E[̺hܹD"eF r'>,7+]w2f7t"Xwq^*7p<<- K0yrG�ŀ۵0ض];$S5D@$jIPJ26V\uM7(&e˖tMq:* (�EgԨQmݰCŢE0b|NPkСN,/ogvZJ-XzOb5}@Ο?t/rJ q;qVcN+s|:t@׮]YʔQ7|3~{NܛD@D@D@D@D@D@D@D@D 6l vagS3zhs�/; p6HkvJJ?K,#q>Zz!"onT#ٻ-9s_W_}w}A?z P615MrxJ18Sܶp%@Ӧ0L 4mA.袰"P$_u\ht=K�," HДD@D@D@D@D@"8wXID@D@rN`ua9/N@VfZ�~*8KVY`lhÝwAS@6#?]pVZ1g}p}]@+B`pYF;[믏zdn>(/_SdN46K'ճߞ'| xI-%($rLqvX!kE@`$W_Xҥ ƌ?--]C &l S`k]r O?_tP{챇9ܹ&Oe˖aʔ)8p 4h xM.Cݝ̴c0ܺj5] >{390_|7[[u]jsϹ V^|" %O`#kq⍼*O}9)=l0>qE@D@D@D@D@D@D@D@D 뮻.{1\~9r$(N[`>&M?cǂaJ(` af?*ID % jD|н2Mw@V&"PLd%{8VU37o[oczgXGq{7 J3Gi_BTW/asѸ{.cL?mΜ9%ϱoΦc˜?8(/9p1-K@)H/Y)PD@D@D@D@D @xX�3UV" " "@۶uG-" N(|I}@n!!" "PAA ,5oiӦ`8�ǡف߸}…y@Ϙ1cnf?;bSmk eQ(ԩSb L>vfm/{xΉ6ȼCYg&0'c}E@D@D ;[n%N8<NĔk<,YSO=͛7w۹袋O߲+UG�hnsXmڴqZ{z!l҉k=fϞ(6k[o=N?t'^N=%HF`睁_9&Kk=B9/KVʞ�;udή`{}AD@�m>lx‚ &ɗ qwQF+ډjժ9;Yf[բ=ҥKKjW:wsgϞ*>r46_|0\$"2 KQRD xnO>{O.{`Ϩ2ٱcGorqǹ0m%6K믿ZLQNK(Xv5נf͚g#K7_h_̼ nN:)LtdA,vYUn˖u�^[&" "R" " " " "3ʕi]E@D@D ^G qL"t䁀HଳAM^*`!" "1߿yw?7QNL89g5i֐!C/xZID ~w^xl֬Yyc{ϝ(9XkWa$ @.@08|1t(@nP&jմ &<L~YH3e]MwoN1E}Q|J)_j[V{etM4h_ck믿{vYp l)@2Zd{7HysUW](NJ+LGW^q1 k-r _}#>c)S࣏>r⍴=ȠR-ZSN9o9x VvLG@ZhSbxG$2:| /{'oKkZK[Ki>xb jez8(4 j PPqRDTCnLٻe>W\qfΜ5j8:ˡ�D)Ÿ&dɸ%J"OLl?7f fL\]w硇J}?fOSs{^s'P͂iD7@ |]tRf4XsG#aisWrߏ CX 3X OrU]߹"|E@D =tԪPfzko(c 'O.\n!΃ oC{&J2 gv߿ㄗ% lٲ[7o.r-]0 <D,62:J~n=||O?nֺuk1ݶb388p'.(+pmm7=0 Pa:L�;vU|kfjʍnlժU+ƪ"9Ν;׍(J9 aGowkMџ[W_ |+@=gH5#-MA I)ܡɓ'kūj6bĈ}_D@D?4iF tڵ)Xqwgu `f,$e@@*epD"9;`z1dPpIiU9g֏W_}՝d3?Q8ܰ!pfEGQG˖O<Q˥ԝwڵ=KN2){̸=駟vc;}p,|*v3*zw8Օ+WbС>|8֭ʾ 2`T1f4mh覆}NThiR*N?ogĞg2~<@۶A<D@3?{ʜ@ &PL\:9…�89/.)PD@Dҷ�0ciX� '0aBTX0qWYIZB! pꫯDLd5lf[l[ θ,I@A_~ d}'n}^`(D g0e [o[FF- .�<n0ȚF1cƸ@_|E)(b+(~ouZguܳb'r\N"n^( ^S`8^d}j֬{Qdf%(f;:D5]9L b ^hk/t<wм9gM47W:Â.]>T"q?cZp{΁(W^J~ ?n0tI8cܼG9QˏU" " " " " " As\|DqڽG9>8_hefC=d~77p yիgi|R&0q"p!xh/S!6|rT|0(k(ywweSP{=ꪫke˖Nl[/"6ӧ1D,Ps/6'΃� kxbv=]|Ņoj71\rͰgX^*E+f~$9;)" " M8CBu:r^a3�]?T"{4X=8J?}\~xʉdI_~qA)Ea y 4Ŵb6P5jM6DAY ^8mr _\i J؅"jذ!UVd(S�C„`AUŒ' AOQpb޼ygD ,]sq'n59)HDcO[7ič8UV Q%K؈g}V!0LN/ q\ąc$Odx-,2pT໿o}6?(w,+@'{94^fgY z̘1o1 �HU7" "ij{@]>Fm^f%".~ڽ+>"<K PM_%3n:JD@D@D@D@D@D@Bv> bKqiӦ9?޽{/i_tСl|!_<`$slNOtsa9_+-`Yyh׮2}? ը_b᯿k <pA [E@nٻ$[f͚wѣNL*)Tyq{ݸ>¶nk~C-ešP˥\L~;0r$r%p֤LW_} r?[<@;So.Uƣn\�QzdpbCZӑ" " "(=3TɁ+T#dj0C6gϜWt}" " sƎ^}h~ABK?Ák ™3 mU1լiɠ ͵;j{[_ע0vݠAlkWI}駟xb pL,hqaP8/.& Zx]+Opɰa\ԫ~>:BrA@ZS=&553gfr2"MQ59~s48ުg'E)EQϩ5k,#zjj-[EU1'4{<)+0͚5+AQF͙oTs(&,_|I&j׮m={;q-J1q 5}t<oO=8AɈ),VJ" " {S IM8ky鹿Tn}vjqa>p޼yxp%եX>}'(@J_j@)?>~<ivb}nfXZkRsA;)=3<y2.]ma)6'n@TS6F5so)/ "2߽U3{6Ц [P ٻ-$bE5~Q|č_z%ԪU`>b(7p61Sh1@=P;C)5Wm  2|b6E?'*Y _JC@_ q5ϝ t0aB!j2E@J@ jeNG@@(Pe&PTfu9&/]ůE@DJtpBw`%ME x"k*&" "w -N؅@uuA[6Ά۽y})Հ\l7~Mo q%V(zgҸqc'�HI <L;@^ HP+{'bŴ^@ (^gXqc:rE#L,Ka-Oܘޘ\5[:%WZ),?>wOlhkQ!捓(D@}8\=g +b&1?~mѢ=ܹ3vqG'ZmP4A+^ypE^k/'{F<YD@BO\k=ad 4˹*?ҥ :t?f9gǰd8FJh88W*oW7q'" " " " "|bU��@�IDAT " !bҤI}ӬY,qM{Ni.2 h?x뭷oRǎ]t ;'x"0op=Lh>o8,tD@�V/* zDUҪ)ٻ-l.az!g#/ 6uŽ63.A1%�X:urKP4sbxY-RKڞ#.&X*h+Lh^JG@;al}rsU W@ jL@n&7\Ðp[N^аb9|]X (R|׾=,$s@EUl . ; 138ᄲE S4 ޺uk3*Ҹ[H hWNl,Go jŵ;[όdm^ rJs+Vpk~NŪ& S'+@�~j-y3g9?Ɛ!Q3;&bUM@Zi#[8qg}vߴAD w~74@?{kogk tyOQX+va@d>{, qys@0L˗/w#tҥnZ"6q yc#Ot[S` %8CU+h/ Ȟ3sv:pb 8m40@K+Zl niΜc ̝;{(wi'OM׉UkE@D 8 0X .ok# 8n6a_y$b>ps)kYdfI01lGuxԩ!$ UID@D@D@D@D@D@&xbgqs)m8G1*28ژ!^C32sL0>rUk֬vuWxy=tFuQ.0?$ꫣw>l64ۧV@Roiweq…Jr$ {r<n3I2hgMْcbژxc6,>8%ĴMƌA^c$erݗ_nMa*QgvUmA@8ak`S?b@ _13 AHhӑ _i^ ,`! _E@ ^0\sM�F. ~;y UD@D@NR4Bz饗a/gQh7Sj >ռys_uc0+ <^XDa?25j8au]bk[YgJkn_^0x[3$yk~.4] ̝kow.?[hpY<ޚV-Oau&C?htx)ЬK_EL'tNq~UR"c߾}#<k$"_cQ`+V8V[|v*qkyBcqlWqS.5k֬oc7n)v}渉c5Q< O\ES-[=m˝&: S1>#Ů=a)6$"<:l1Lx)@eCD/>20$pւ ܳj7ܽtM]}ҰaC7^N@ށy I+'ysO ˀС[X?%p;_~9wpd "6Q8sYۊc ̛7mg9,ڵcZnٞ_VRV[Gs|M̘1yu4h4iNKFMS9@q/v\p2qԩ vN*^eᬳh뀭{tW MdNrz(`SꐩwHIBLsg0vl+YUfb^OyCT}(rw+Xէ O>`>~RH´a\ơ&q<F"`cbhm܏0X^rLo|lcE Ssx `+E]ÇWQJ%}z8sE^k7/U!+f~$9;)" " M8CBu:R]v*/]ůE@D %; cRD L+3�|h>TD@D@rLND(E4ҥϢVV-57{,'5{ԑy%?QP\(hMWƌq0pko믿ŖVOmg"Z鴙6p OO.e힠Y75Ч0dH_$"P<@,K{꫁޽iV~OSϣ7ߜ}fAD 8>`Zo/{qwo|qLı޸[\8>{c*Gpl}]og3.1XWl}8LOyB')^x s$R7ܰ9&O^^ _~J>" "�'N:+"% {N] ">=ܹs]O>T`0D\೮,y}€ |yf8 =Q"j93@`1 ^ʠ=ƅsLp~$\k؏xs2\p*60HQf*-%" Jz*}hQp޴Ac5Ҷ,]�ָݕ y=S֭Ax:>S .VU\5\nqhܝ1c[GLD 1"J!@n&*"9ٻeNG�̙ݘcc _&pL̅1<(o\LX~ml<.9Ev|x^aL.%D`bY0:o_?6\|Ÿ+&lTv wXM;$ۀv޹*ꊀ䍀3G-AHhӑ7(ּWBt} _=)Ev!IBG`a/aBWEUHD@D `4믝.`M]b+S4.S`[U=E.@bWUlx:΄/|Xsl,ؗ'sh[-Dnx]m[LIDBtlg�+"`$eЦMpKL9e{,n㸊؅ۼ�)UcQcS޶Ԝ9bѢн%N̵'9yk1Sq{&pX 6Y'XaKo [:^2'`~YJ" % {U"3o\0Od-;yxCO[(^pDHu:gb>7+S_F} 8?/ùOknذoʏZ,# VI" " " " " " "P{ZT1?/x&o>v]M~s{FvyAM7EŴlJzh^.B4H /N<1|uSD@R~5R='`%_?^G ^%WM>S oX[_zcb&q덇8qkVŚtm&M|?�wزeKt&L(F9#[b&t{yɪSȭA1ŨdDC_9+f~.y:RD@D@D@D@Jz+Wd("$@#?zz (*=h}`hӢqu=!@LY\>7A-:d'Eva@1+x.Ŝ,�g[ngk`8`@t>=*g u[mκV"P, h=8p)[;_ʏ�mדKxX|`O`j 7qD~v8cC;N' \ ] r1,@>&9$!" " !%?%r"@E7Q(]u͘K'   گpZ{r_q:%`Zwh4@;,{jTZu?&plMiKr {r8Ƶ,`B-d|'"A歼D ,(z8b(3lX-|0lS,xHK̑#{-.}-}vWbZpFX-SD@D@D@D@DX Ԯ XQWE@D@J2``/~Z ^Yf�.." "Pjȿ&M2Ѣ!&Z6lc=1<HL6 ˗/ /`ЩS*>ہߏZ/u}7hQy<f:nx!௿>:URzY$Pg^-U D"s^Zh7`ΜW2A6 *p!pO͛ fc꯿$ke*" " " " " " " " " " " " " " " "P`67+mc+E Ҁ]E dQ#d*Qj"" "PB,z: j"qW 3nI'EE3rAkmI?8l*"^|8hӀO\vJ" " " " " AXoqZy*/Ȇ'_|u`1Dh tL|ygk)KGað6۠~x;8K,RKY˒RdiQiE~I{Z6KI IJ_*ʚ"ɾE!B~iD]{ݹsf}<3g}w9s_~͛kҤI~ִiC^zpwE8%.,˖O w vƏ<RjZ*UJzAi -E ,;;+qD%}A�EEIXM a08nGipiɂ;O<9nE+lW"� � � � � � � �QC3G0@:TXQ92b `Z6&dU"@!ϥU -; O �Bǂ9^~9͡DU{aɂ4ڷ믿n*G�K. (z*>@@�x P+mE�@� b3H@ ʔƌyGᄂ>N0… nݤK/%461A�شixG]vuvWUa.Dwߕ!̞=[5j<y$@BD,X/5ާҪURvZ-[2Q|ds@f+U,v[mv($H^}L  /ٳK*͛/->p;m_ed}7h U&-s Y0@�@�@�@�@�@�@�@ llKҲeEc[Փ9M_lLY,z@ u9r$ko ͬ^=a  �@rxpjď@bҠA҂R {n4w.yg+R/xq0'QݺС8k@�$x � � IR � `Jvz'3J@ fv!wK,͘!~4~̚Ê@�{.谛| *͛kԩ:s4%lܸQ_|zMhK$M+riҀRBߤ~ ~9(g6o߾r,`2Q%}|νR@�HV"E@�Ja~e\5uٚ<Y7;~jZX1.bǎC@ {w_ � � � � � � � �q+P4p`0>?NveNݠIp :$(]D v"P+Z׮+K �+У}S[/!v;7N0N<q Cͮv {iD[`Q L~hM @D@ � �deKUF5 �d5!D:\dpT@ ,(΂J:Kz4U"�I(޽UntVfv_4o<.I(]RE`o"gN˥> ,ԯ/wtq 7ȽX0ԨBxC:ᄰv @֭[Y!ahm@�R+`عLK+g9wj P]tJ[g+xp@ڳ'ZJ@�@�@�@�@�@�@�@�2R3Yp#azt P+Y#-@VFSߗ_J;wJs<=@�'`w-#]"-ФI^7?R wH7G{ԏ�aX>*THz]#Jڄ�$�Z] � @ ~ b X5 !}TbE iٲC,ā@Ѣr.Rn]uuk4&"�q$� 袋.҄ ܅5@oh߿7o.[N$:(S_~Qz .~; spiǎD)@ \6nY:$믥ciӤ3 G[YD e˖-~MK@�'` =a V::`wӳؾ]ʓ'ǚ@�@�@�@�@�@�@�@�#%tuK/ڷjז9<m%-`H~t@wmܱJGoԌ� @F zTԽ{FJ]ė@VғOJ"-+WOh-W4 昞8Qʟ?5:@�5^� � A>:8aP@�]0=lTtƍal%mB m6#H˅/Y:X@.t;hs' .ԀԲeK*T 9sJCH|" X,v[oLJ &w\0YU_z@4lz.}@- �XRZJ[b'3SNg2+i}dA#FHeH_/-] y v uQ` � � � � � � � �$1H='͝mrؕ@,- ~IlF� Ppz Ԫ[  �aȝ[zi$ 9rH]H+WJ:*Uz+YE7#`J[ֆ ҤIRѢwz�E@l ځ� � 06Ȉ� @X8B7N,Tkv!6i<)o T/ }u]ժUS>Zׯ/@p F$PI.c^7 ׫'%d*z`{{I{MWh("R> '3J/-_,XX.8jT  g6&H@ȦCr \>TB-ZHgGR+`p  � � � � � � � �&M. L\4dH@-àtXu"@F QccL?@U @ .X: Ŵ X^KZ֭ϖf̈:b'mԴfrĮ-Hfyw@�@�T" � jE>&-oVڽ;ͥqZiӤvVn #|,�I"i&9Nݺugh]tE?~jԨ7xCh%ɛ!R"M7e cc Vz`Y 4ǥ b0V@Hl| |yGU; M4B.%P+!N?="rᩋKGa5kJK&D%@֡x@�@�@�@�@�@�@�H.,Yk-ڴnQ:,/ˁކC`<re)+[c !`sx#G:^K*Җ-Rz]'@�@qOy4 L^}U;Wʝ;ײyVBJ6_#B(j@�)W$b@�@�&p6@� T(!M$rK[KH@ΜҀ҈9H?׳$ h7nرcյkWvi*T.}ᇪU|M[N|9@-[T…P#ߗFaC2iٲKJ-ZHO>)(!]q4}z&5 ={^*U:w.[Bz1)4f @\xnd&Zqh$@lˆd-6I͞-}IzR*R@ eغUʗ/y@�@�@�@�@�@�@�@ y:l|mRǎү& =|{qF毗5"@ EVƙFj9]=6<- �"PtȍVN/`c'Ok餓n6mYDO``rSs䓣.jF�8�Z6b @�@�$@VX@ gLl>hԫWD@ Yׯ Nʩ  4fuEzu饗SU^=_~E ,p˞#@+4AVԩtgst(_^WG$ ت];0ނ?U�q+ro];wb[4b(Kޱcʔ)Vj@ 6H&(Y&u$+ח&L_sd}Vڶ-QzI?83NjB�@�@�@�@�@�@�@�H,7LӦIÆIcJ*H6~|Ϟ' z@·mhi P+-Zi[7NkX@�0 yTT0_DE[EIկ4rTlpBy( _%n-M.M(U_ @" [>!� �T o^)Ki˖6#� &K. &^WRF +KLߠԻwL@�4 ]V:v쨓N:IEq_η֌3ԨQ#7�j6nܨy駟%ÿ@i^/@p\:([{GHKsJsH6~׮q_h1?^:LeK&iBiPt都@� ^_4Lų Z*UmJ `&6PhruTCr2PB�J<- � � � � � � � �) \ytԮtRXQ_`iV_�ZjEGZ@�2K g #2kȞ=1r7$sT[Z@ D´>H0AV-E? ±h � @ Xj[u �$@ND_/M]I$pҘ1x؄ZIv!W5kָWuuש|.8]}՚f>_u=sէO5kL0A~;:ƮE3"ԣ4qtRқoJ'iJg%5m*D.QFI'sUV)ya@ 온T)ome%>NykzkXtN_VZ� � � � � � � � {W۷x3ɮ]YS_b6Zx_|!%Ux}G$@d\cud&fo(b  �DSv`̏h_;ӫltR̙'Z@2D´lM Ӳ_  @8 v � � &`'2lIN@�/ڴZ &=ONɤv&2%>E�8X殔<xڵk&.noQ6{6~ӦM鮠y'th;8 Bƍ% tuoI] u .;˃I-h&˦ /|"թ#︽̑yGR%^z@;@ /^ *0 .yE@ e %P+e{P!顇 ++']u~ vhQ){D)C�@�@�@�@�@�@�@�Hfͮ9R?^Z\={2r-ԕu)!<N.@VtqRR"ѩZ@�LƑw萙ke]ğKÇKsӪjU#v,lweO-@� f ϶% � � $@VmL�$@,/K5jq[m9Hvav<Rjһ&M(ĉyZ` .ibŊbŊ[vZ]wu.p6oެiӦgϞjԨ<8!D@GʖM Γlx�k <y i JQ$>\)wni i„`_; Q ߸mT?cR4;+!CSO6;:X DX&N>@�@�@�@�@�@�@�@�hVZTڬ3ϔf̼qg}w$_̞=z9}�KϢYYkA�@ 6'Ϸaâ6G N?=:կ*Uu6mA`N˂0-'ND}@�K@ڞ@�@ $I[14@�4 !tqRÆri㏗>TjRbG.F �]a>g]L T*Ut}i۶mڵ 'h}GoVիWυ q*?4xkҘ1qډ(5dIGᅲF6n7 ֓¸(Sm:lAϤ B >P:tTK@�T ,\P+WN,�SlRݻپ_u\{iĄmўh ,^,xbj^@�@�@�@�@�@�@�@�d8(' jՒVZ>zO%`#P+Zԋ@f ڳf6@�D__nsgiD@ ]jٜ!ÇKIKvEwԎ�رCj"8Q]  @Ԋ=kF�@�H`~-;H@�^ o^\5LPOHIA@ OMs#Ĝ.%'KQz)̙S>@2OLwy '9K9,@ tRǎ Kiگ|6r/ 5x :iܔ^cD_ςu)Sɓ:unր�-`a芓-�ıI'IԀVNĠYHMH.w\Esi4U"|#+dU � � � � � � � � +PGҨQmŊҳct,jKH[5`*F xwޑʖЌF@�X <TtUKz[Ȟ]IZ"k;SN}7~@KHۥfͤӥ?>;QzF?@� P+)=B�@�jm@�CP$H\ -D`֯U-J^'f7~x}ݪ]˧ziРA*Rŋkݺu=zt颪U*kVƉvcݙ#ʓGY_re [W &׾ H˂v B,L}Q@�LX=Se` �q,`PyoD;c% vLYԻ鯗W"VwzQkJ� � � � � � � � @F \vdaHv H}QSO̘;d1D qm[R_/5"� k\^Ε~8֭aėUrs Iv,m> J W?h-*`iK6w@ mC@�@�X@8x4@`?%PիK.vi~@ aj*ZTY35a:GG@ ~'pܹU`A5mM<Mz{ӈ#tK;30+ | ձA hٲRqWwi]| L&5h խ+٠O>N9'>C@ ~.\ܹs}�R@�8Pҥ08F(^RpLiam +YRP4F !�>2J@�@�@�@�@�@�@�@�8Hǂ*6ƶN];YDBlvY@ .4gxrM@�@R߾#$ai@ ^ʔ|SN;M)oRҒ%Ҕ)g?h5 Lj%֦ � �&@VQ"@�L(_^8Q;7rLX)@ vī-ZH>(y^ *@ /_W^yE۷WyYxqf͚s=WGxb 4HW]u8t#-ko ֮Z^r|RnrA~R yI#ߞx<{dYhVzҞ==V~f!�jUr)Yr O&P+# u.rZvM)M]pA8-z@�@�@�@�@�@�@�@�1)6|i4bE駥HJ L.ծW:@o>yUFʕcѤ@� t$]zt�uѮ Ԫ%7GW/?vZ@< l̡bL*Y0$@ 0mD @�@�P _>i˖8l8MF�@�UJ|v @ Gi@/7~=:F@ v.ei7e˖:c]MtVZ6mڸCyf}۷?& ΰ6P(RkR&`#7H;VʒETҺui<9Ѳ0-ˬ ,x~}l@� |7TLV` QjeY#'}Q0KV_,?!OsHgSi+ � � � � � � � @ h!-Z$u"uti - bdS@ ʸmyқoJ[g\Ԅ� @X >"am+B 6O-]*qG0:uѮGn]ߤO? ƝWh- j%ﶧ � �Q8DIWA �d@ȑRnzV@ t̚%ը!-_ge "m۶iKyըQ#UsNM3fL={q:ꨣB @䑆 \IJe5> w.O/m\ГZyE2 <Hq_RΜ{㏃’Ɂ"@xKUR% e @,PnJrn)0AC+WaD J~R%Q|WP= � � � � � � � �qpTTtڵ�!RV7Yg8?!@| D0gnȹ~! Sh  �y7~[ ۢD y8B`+ϖfLz@F Z%թò02e2z ԇ� MK � �I+`'lIq@�8|ipg/t ժ\a8ի @ _^epzs" +cե^\rɖ7nw{G\K.VHrê*_\Sҏ?J/$=uJ"=IO>6i"+ X5k}vNA�@vVH΄ <ܪUpׂd BN?]5@o:]{xT>r@�@�@�@�@�@�@�@�L(WN1#͚%xԻkW&Uągl Ŀ�Z <S:餌@�c0dҰaan)mC > ~,.w Tm[ @ZS NOËY@ jb3@�@�D }CDA�@@jZ<XzQgODHl㎓M.HjT/KHF%K_ֵ^ *hѢjٲ>#w.Hr{ڿ1ǨJ*ʞ={2rg.`KKI{D}u 0ꫥٳso.I ()`-ǎ8CB?ii4 n9T6r � `duWo~Mt&NаakFKW\!w.Hz?43)XΑN#� � � � � � � �hLZH6I'i4"ӧǸ2H@yƌ&c@�EU+;$ ߥ T*}I07kٸ{~]`,^`,T({L@� P+1+B�@�j٤h` �Qp#zE'jPXūJ=&Y�EΝmԩSխ[7;Ds;{ scB(Θ1CO=.b.\X*UR.]ߺ.Hd6mڤJ=ڴi%JgUW]竪]my_#Q W.iĈ R2PG\~~1cSu_Mza 8B]޽{fܸq.&Mub;g9zgԢT嗒kUKO :䓕'OY!kA�,`,L&d%-]*5nLbŏ>*wN(sے޵q~8r3%b@�@�@�@�b��@�IDAT@�@�@�@ 1l׽+'5h 7Op2o{l&͛'ժydM ] b_}zKڵKj6ۋ@�@^K͛K+Wƶ֟g&I|́fs// ,ٓ롶p|ux¦zi0戦 �ħ�Zh5 � @"'Kl yCi �!pRҝwJO?}RD{ww1csΑ֭܆[XUXСCݤn=b-/q뮻TN˗ Ψ>}({{4{loOԳgO5i}og͚)ShRy?O�YBܯz Ky!9FUZDCP!@{~ѯ~u&^Zk݆֬خoH X\VzmBڀ�\W~x3e ܲe^ Y^.7--|{8s~L,ի< � � � � � � � �(SFn̞r/$Νk7W cj׎Y+d@z"l 62~Q# �af9R*UJjTڸ1s[/2&sY[r YBjJQ: i诛5d@W7U.Pj"S%w+@�b/@V-@�@�H@j%ƥK � rK0'=~O )p]~T4o^t©4hݻw+S ɜx-ٲe˵xbe+\(d] `w_~Y۷WE7+u…u%0wUR%{vxc?f[֡q jͪZ/y�'pRҕWJ;v^up,Y lW^N8!1qM~:b|_ԩS,quz~VaåNBnRZP5*׊aX5 j;'P+d,�q"Pre46YAjؾ]{hQ8:plXb6i QXu"� � � � � � � � p`o7]wI?,z4iҁ3\_-CȮ<C/  bvϛnq~B�@ 䑛%'Bn͜s|9ά%ڿd+կ/]vzuF OW̭bc&7I  �ճv@�@�S@ܮ @ enݤ^$`QIehvm魷߻{G| '«Xϯ#;al mJ۷kڴiztEPB.,$u]Z-[￯79hРA0r6B#L2:#%Мj{U/~D rDҽ^:%뒅7i"/kRk\/!YJ,i71)6xN<1:;#B&c$V�[`K3FLnB^�!([VZ"Kf+VIJfI+hXvv4m;X; � � � � � � � �) %w_0^ yI^*}]JKG1kjj@-mJ ?i b/J*Hx@�d(VL81Ѯ]=LJ7f y#&L_I` 7M#\5*uN[GsgG} ;<� /d#˖ � �q%ɇ) �$wu )k ,p1Ժdt?5`�7A,Y@tv/^ܯ.x']wJċG]X+4iN8=#*ZhimذA<ϟnVX jb j/駟ֳ> 3ΐMXnjժktw;̝vIbSL_={v 6�.a{.~m<6o췱Yfn`w;vߺutʗ/_in{pۿ3g];Ng}zoN'3X`ڕu]uQޞO d@raӅJg\Ԕ@elW=I.$fģ?4bo)}ֶbWV\#kתcǎkx O+uUW9OꩧҞ={u]:uh[bOd 2h_'Pno} v)s\:}*UJ{ƃ]wbC'~3ߓk!^ @f<y\K5 � $`n©i|užZsҸqrfZ율tRӦ;8?GI6_"� � � � � � � � c7<Bn?Yz.L|풅np}Ux7i\ɶ1Ge?;< (sς HaL @�XB&Ǐ=WjF5Jn>p|mQ^\ 5j$=C|z3~iF:n]_*-޻w?# "7Ծ}Z^Ͳ �p?R@�@ ׻ݴS14!C …3J*ݻ=/K{8ha4aR@ Af#t g/SX mܸ;Ss=[`gy.t˟?^*V}'xÆ N>dMx.` .j*<x/7}t~2.@ޅ=?[.sϯBWurns\Є-v9r._ąy ~kР׷o˽ϳ:/*n۶m2I>͞=ׯI<忯߼[n{׼o6pݲeiϻA8<K.ë'ۗ*UsOgQ۩ʙ37d 瀕ի 1ۇ}?ޫTסC_*;9g%r}PPO>~cŅkr)Rۺuy`x֮{w2u\H 9昽jm矞gow F�X C cقZ o(H4ŋ}ygןi<i�w:6.8?|wѩzޭb!F�p=gTX@�@�H�U � � � @hv;H+WƏO_Ӹ*W\SS@ ƦYwyR=yGyn  �#`rM>O.LJ>>LfdL=/[6͓82iŬ&EO_*Eo5 ƍKaB�B"xoAA�@�0C6DN`Dvj @޼anᶍ z@ 1wBlBI "ᇞ n5-!]ko͚5{_4yd?||9ʙg/w!w'eAYb!X5oܳ#e̙~Ŋ<YY3<޽_vС{vXѺuǶl {7o޻LEn&PBަMe>Ssgs߾w{_y8pǸ?Ԯ]˝;>(Xw*f!%,Kz&nRΝ8+vv&.=&X߾}*[y+{="ZM4a^x_.♚} Li7vQGyeʔٻH;:w1 7<ko@Ϗ<4.o,I˕:uܾվKp( cAw�$fy&Z?_yW]s \Yqz 9?|۹Ho„-s -猖,"� � �`JX@�@�@�]re50_yW\_nN?=m۔@ 6B1K< n={<Bϻ}> �DtJ~F6kWr|mElװap^, `>Χr7תeƞ7cơy@ WLV7i@�@� pҖ-Q*@�OJw)]{4dHK Y_~W,8tF%n%K}A:utGjZp]ީR+W,4f ,_ǎ&" П鿮x%\Y 7 vaÆ^_W_>|5k&w\rowj֬\~iqƩVZeF!%6p1Jb 56__~\@{p饗ʅRJrA(Ztywuw~ʓ'OP=PTj՘# K")Z*g-oC?vtRFpkXWg~þŅd?>l?a}+?XC]I>ǁv'ڶmիWkڴi~}MP#Bo>g ۾[jVl.'pB-ǨV{N:}> |ʕ@|#�h%JH+V9 jةQѤ-J=zH6͜NݱZTki;N=7Eo@�@�@�@�@�@�@�@�C6rcNzHnȡU῾㏥ -YKx{}i2k@�8$7l\aS!Y(ly/yAl ֭ޔ^e9e>T̃7e'}gYgG�Pډ� � @ o["�d@^Rvw&X>#k.)P4{vpц}f]tZ'FeKgw<5jɓEtVb rn_$x³-ǻ \p=7 -~e}ť~~?XiݺL" ոqc?B,0B*Ν{*x.֮]fi̙/UDr1)׺Ƴ7CXW_}7@n!ڕ/u,u\RT8C0AzyeKr:mߎ\fhkXD^Xvm[_>.5u{^oX/nݺz'.l{]Ah}CRuk8l\ôsWW^yej͖ ]zۗIݻKkR@�ɜ9slKu � (PZY-Dm>}`}{[70CÜ>Ի| � � � � � � � �  J \=}J: v7& G�"Z 3f__?�c"� ԴU7'0 ~N@fR&R#y!=te~Z`_KdN*O%"Ɠ,溡 �$@=C�@�@ j֟#�^.j~`w`@2( M$i#]rԷ{maB?h͚5-xq?-Zt ػw }߶m֭[C)޷ 4hѳgOkN-r!+W.y)6_.UBx Y&9.ڸe?"|vՑƑe͘1ý9J'NO>b[FKlܸQǏW=ԨQPi&I/~K(G["XO>)G@$ JobB�.<Z\JJaKr>ol>VVMGݘ1c#G?$peM+LZfMY@sW!oҥ,RR>i̝@ ,Pz:#3�HAVL  mɝߕՎʗsI%=ҴiR^g@�@�@�@�@�@�@�@�7BݻKK],d^x績*WD9sJk;v"@j"ZK< ɍJ �+pY'H|#թ#-8> φEo]Z,檰YDoG|*owGIua60}u�$@I}W � �T@r@�7K<F ,`\�Upǎ)~t4WZo4fn2w\a! NRlYuQz뭷4Ϯٳ"I&@$ G�n:wwa �~҂ >O:UA#{HC,;mVX#Fs~@VZzem7x>rBo޼YkF'xbPb`(l-;}ȏ"@r^{M^2O@2 /K/sNpҀrRF)g}|$Hkǎϩ/p9lǂڸԻKŊ_F.]T\pAcaݺuS"E4rHgllر:~[۶>YokWHx Ԫ_~"@ SxrW(q.ǍirWA}&ӫ a<{X~n@�@�@�@�@�@�@�@�㎓^=F|ԣUιjDq6ۍ@ ,P+{v~i wcХ΋�=@�@ 3sӂ|vj֔t.,'B)`Srs<rI?&LdqY0J EjL?^9) �/[S@�@�@ y|h:@�wKO=%u*&#pMohAU  ֒5khɒ%s1~/NY!Ch"RR*\,[ K.~Wz\Ã~0V:uT%^TV_vÆ U}f@$ +d7Bvģնm}o;-#e`)(Pȟ?_w^<f5nX/:u/\_شiҳgO5uoB |4g?dСZr֯_w}W\ҠAv2,HN~~=ڏ@rJ$qjh\UWI3gʅz7P LV\iذl7wq͵2]d/϶?s}Y/_>?lupQ-'F} LiGSCg@7XRv0 ܎/ׯ} I?(136yBs@MlsϕW;*8?|cŒ'nVePOlrz� � � � � � � �$]c$yFTI;v UvO^'H ʖ-xC`|`N W� �(UJ1Cnޚ ?`0LJ`<z*Uޒ3IPAX8Fkb>T̃w(}gk$opyZ G�H� �XG2%͡(0`.RU\s~47] .6^�$@~>c%-OR?cʕ=o͚"73Vʕ++Q]xȑ vm 0\h;Wzuo^{lڵΝ;[p޶m]0#G <x:#w~'υuE>|炯"?.̻K6Zj֬鹠 υcy.|k޼Nvƌ `+U7ys'6;vfϞ߻+={K\Bϼ3gzglkݵk+W.oذa{{.$7+ d=wyW_EJly<y'}ϐ=79#s \ޅSO,YsA}>y^^9)=feVa\'::w v/{ܛRJw[\d ﯹ@QzrפIo˒>[v6{9snwh( `y7'X;t1lJ@ ]4")6E ϝ964hc!s~_~y{sB�sU#� � � 0^ � � � n\KZx˖o U6< q}NC�JxӰw>35ľOs@�!st 3w<9aSN<۷{{^<.}s/l3T3oysMey/xy�ӿmKD^@� R"Ҕ)Rz1n P瞓zHZ>C8V/>Ʀ @�$ώΝ{zLbt/5m*ٱ߸qRj -^X.G.$B.bO\\;VXe*o޼Z?ۺ *K[nU|>v;.lIs }z"+WS.˿<m߅iΜ9r!Z=t1Ǹk5ըQC.ͿupoTְpBr)ꫯHo߮'|RfB"s� r҅J +d&0y;}H]'u .bƍ.0K.|?uTrAr!8ϱe/@ҽk~'umP?<o)Or_n_ht٭s#Kp�$PT4`@"*.ղe駟f|Ԉ�Dsw oB,K޽W_;+u*t9V pm KIGy[llqև� � �W*5@�@�@�@ [n,uOʓw,LFgl_V蚩 `׺Xo5:/"pyN*W./yWp� �6;JUHLϴ+`qROK*e:ViϞ`Bj6E]&M.ᗌ#�!xoGo+@�Pvh23T1+T#Ss dj3ue3!� #`7 <"=d 5:A\VZMZ8<@,?vܹڼyxVjսYU|yܖ1b |Nv!*3gtwĉ?m3*F�lf͂ "۶My K/IIv1B&rAYmwF喪O` m@ӑM>@jD.t/\( @ -*]$p'^~ t P- *Vl"IrZ#G&9G \ @�@�@�'x � � � @ C:ho_essTթ#=l[I@ O<[25$nQCi2wz� @4-ڴ,Ǯh:@`xn. xA)_&@-s gAӦ{<?!�&xo$,H@�@�YhNA�@�Vz &vq3dPbꫥ. &MM~ lڴI&Mң>K.DŋMJ饗jرϏ<fϞ]>F2\y啪PaZoJ't~aZ}imړXࢋΝ%||ժ$Ӯ$=fLIO>\]KU"; &Ieij%´REB  ,o@ J.;I Xp6W_ʔn!LwA$Θ!]qERvN#� � � � � � � �$@lKJ+j%5j$-Y0!?Hn.0$  6-Z:T>´ �NM9s ]|O{-K!@X_v#FHK/$ٓ1S 7OYS<i,´Rc2 @" dM7@�@�b)@V,Y7 @Zy'8ukiΰ!1vKW]n-V%Kn``AO X ԩSէOiF\"Ity ^àvɓ'kZh oYիWWΜ9S$[r}ҥoǍdBt <T0x۶Ү]kkNn]~tYgϧ,j2|*B,*\8Qϓ>*RdDn 7o}RJڀYH�ǻEtg$@o pp% :P<n:nϟ? ʢ΢;h,X1c{JȑrRƉ' � � � � � � � �V`-Yf:,nc7in}QUĵUn,WKuRݢ,�&`Z[<?x=%m+^@�-;Է.sk8xP^8> @VZqK:IժIӧnz1旳oOwu`J}w%;^#�DGp� � �+`Zn>{  �@I/ /Yzm)O,$С|t}){].�I+V0zyݩ\W5l۶x;w>sҥK�OEՙg+]PgS/ VoJeJLETR?Y<<]הkkЄ4"MJ$}99gxzV{?~z?tZE]&zYOA�REzyd WtޗwY7 /i /\N]ma>Nƍ`&yl&~W^VᄏEX<(&i'J6;EZj �Y*Z_4A8KH@�</><&;Y,v\rIT?裐D_ׯ_W[>R]mv״io*D >>Xq,YErp8S8p`8<� � � � � � � � @ j*x%Z3ٳgOa.M%)=zϰC:x},v,W^>5l.OG� pB-խ[W<@9~(@ ̜@�r@RJ?z+{3>ֳ=_M3 u,Ƈ2sq]qr .裥[oBj4ojƓs)Tn]rƤRs@A�@@BpͰ� �e-㏒c[ԩSY/N^<*OM qUj&x @� %9VV-YUo/Cp}UrU fH([JAɳƌ%t0aYu ?7;G <ˉ�KP.NkϖN2% &ZG7Vi9:鬳C&ϤnS\LM LYr˄֖~Ν6HO?<o��@wYJyX`AdIiȐ!|üB9㭴8{wܧVxz_H͚qhX-sOB�@�@�JT*%@�@�@�@�裏Z IvW77:=yFV4?ֳJxY%:�\{#뫯*eWX/+U  �Ysw!V!FS-[8pwyakI=G� ?EI/]qt%q3V$.^,Qzx( @ ^q?kR^� � �+Q#~t޼=@�@ oS'Ln? 5mvz1yzZg >\{N<DhB5}3gjW߾}߄3[!M7ݤ>dZr'I')$ܐ?>| }>n駟F n<uaaUksmB!!hпdII,[&ԥԪ4~b=YI"H7/x_|gtkA�JDaCiliѢ9<MsիG>x2$Z;),*zR@[o )Y*Rǎ$ҏn!� � � � � � � �a>PUVQ9̫Kf ;H_,Z;Hu_ @ V\azmKHB2ҕ@�rYɔ{o3 ! -]?Iڵ.좧~:baV.8 :>M'٢ .Nؓ/<Lk]4y- $ϕ^!� �� C  �# ca.ΕvM6-cNCXg6ӗ_Vt!ww 3~ +5( Aq IBgu/ɳ&O9s愄"[tGIG( �+Q{*pB[mUHwƌ+}Q_}O}j׮S/Pհr]wbȲ陸~]J*)LUvٷ �/ˋ7po,-D�A <b8hzLkmѣOWժzZ5nA\aFwpR='f>p@�@�@�@�@�@�@�@�5>RMQ[oyCm3 Ǵm+myIG�XJ*eٌ~.:vuKf8@�ROaMe=WtfnO<)hb\n(1R4Ij>͉K-9p )ndqg Z Pkx! � �+Hj@�X qR֋//)d[Ќo~uE]u}gt#p2,/ظtGkmQ͚5թS(H?:(LyN%jҤIr( �E\L't oxwgaucϞ=5~x}:Sâ?n0c~xf'H(ԑGƋo1^ r7$O �Q͐k׮"�d@qHd16B k̙?n {GhѢaLr4^\ M^o̡L$82ko� � � � � � � � @ zu~k qǍk5%֦Gd+o*]@z xDB>W<X?z#� @I +'u6y-]:5,;E{b4 c4bĈn G Փ~Z2D{E g?k'ovۭy2 @ P+>l� � Pl߼y �,fH[o-9ŲLmG`MjԨSQV{сޱ&/i$ nr!jܸԩ.]7ÅߢZ/Rx;]?C0W^!"yV}42NMDWKÇg\ij4o\_&L1c7Lt5B{uY;Jw-͝\˧&5l(}H}CL  Z9Rg% @f lT4kVfV@ݺuC Nvヌ*W? i-c]l;8z ,]*=t 8K}82 � � � � � � � �"{5CoA_|y[M;8*̷~5[zx}iCӣ=JN /'Va‹I_'h׮gp �kq4jps5mz͛ڵ{W۶m.۷/^\M)vKzQimD[9@gH`B3N.Pz5i <@ Hc8E�@�(=5"VN �!P[ /@ w[;^wH˖-_2X|&M~+ԾM6Da7=䓪PN?tQPY!2m9Ak4( @v xQB/YG%sv5{ײeKW_M ߡ> ɵhڴaKmѕag=x>D* ,OTH% WV<Q@�\0`rKJ@@ ʇY r_.nZ<@8zɰoA8|{ZT:MAb<^zI1C:眲n � � � � � � � � @f >|x~sZV&N YI־bItm!B� Vђ֢# � P6ah7ߔb=rI!hU2X}=85jH7x~ᇲi @ Z:l8\ 1Nh|d9_Nuo}{%ofk) �L?+1@�@�AJre @�ѐF'$~9 AsVW.lH q7>:|\ jԨQzGu熋FȢ۪G!CҎtWܹs5yhHqo(Vv �,PEo'Z-?}kժU,uvFK 6諗^jv&$FzS%9WSOUx.R߾R׮qoQH'Zg��@�IDATD@� 8a  P+?גz4M:EW_}f87nwoS>lx>b>]wŋBNQ  � � � � � � � �oqγYo5gN:Ԫ8}Z 8K/)λbK C'7 ]zBBA�@�4hL!ɲ4stUfxy/>^r4hƊ'FҬ4SGG!Gu8֜9Y=:!<vYZTx@^� 3$ʙ"� �H; �d@p=3Έ'e~/p=G;Ԍo jtX޺=sN ?h ;$b9A-[믯*M}wygXd1BSO /TΝä^� Nk+zKu:/@;[ȩ裏tCVY0 `[嗥/'byޑGJ_|IBnMM@j߾ૹ� cƌPk]%y=djy5hV_u)8pt"$:OG6]~Zh痀ǛW/6Lr#� � � � � � � � p!'amKfo4fi ͝6G̭ׄe7.fϖ=4B�p`IUӽ*q.#F�@�tQC:1 xU8CKܧ_4Ԯnׯ_oI:v6!;$ *=x{뭥RHpݢk)htEҁI>Pj</C�IjN@�@�JK'IUZڼ @ 8V>qBX~p /CoM ;jY?{J`Qk ]TÆ U'dkt-~Eɲ&LӇ!i]vE뭷Z?/B�(Y'<KbO@۶md;`40i! m¢H{wi}7VHb/{CI? y_=?75 P:7Y  >N5Sd`Kʕ+iu I?k-,\Yիon[3g`Dz?RUӸc{K;(uE+ � � � � � � � �A/47R}ЦM7}Ŕq Z5Ss&}ByiSy4n8MC�bp{j#ǤoW1n!� @ i.zSձX/^ᴱ:6٤n~ -D R74itIy몆 ˠNaS'NN9%}V9> edɱyD!~Rժs� P` @�@� 8Ap @�8ti=モ}"kk2SZ$]va!SNY#]ƍӘ1cرcDzCuv릛nF@�OK><R3vk#-*_3gJӦIS_ןV+GKpn{-լ<- @i 8*' �&ZZoI ln86,4,%?uqRz[W_w7S@�@�@�@�@�@�@�@�^s;0?= u5۩w!oOrk,}TL*˥ 6+mc[˖*U?Wo,]*u 7rU~#� '}t\ƊBbtuoTGDi]w̎N @SZqҭJm ,&4n,=X'!Y7+nz{yV[I~-[{J@�JZZ%-@�@�rZ'i:� @ rHP=^yņˁ^mۆaPÁ:t}OҾe3f%Jh}a2jٲeAw\8EVZY5E�(AxIU+(Ab>E҂+ϝ+y!sH?Ξ-͚\/O>r8`JMJ+^zA'k=KWb49 r &ȵ%Vţ ^[`[-/K#yt≒P{D))SY$޾瞓^ii� � � � � � � � @. 8։'vn{>I!$OoڵsIc}]<<'yMn]Y]J+X<�)Z˗/$>B;63?OZ� � lt94smz֧4hнj׮Utn1*1f,{Xcxm/VS:|R5>\Zyw~ZZxM愽cpyq4r6G@�V.@B( � �$PA@�(v<Ѷ]; cst@z 4n\[Ӧ T=.!]zint ?$Աy ~qtPNuTk&M@�S'NݩE+re':JTq«V <̒DYNxE'ɪYSpxQ'6k&u,ի'9!I(tԷo\㎐3Ju1 9z5#�&d4,.S�%cZ5Nk3Cck=t#H&]~9ɜJSB$o׾n"Ո}@�@�@�@�@�@�@�@�K|aa]Iݻf%zjH㎓*fyF')XdՏ/knF~F HS934Y �' jٳ-^PgU)$bڷ ;pz@i z~qk{L^iJ%%~=zH>TTqس6m zFf?th|kҟ5@�uK3@�@�X7 6Qx5 � lҁ=cg@ ԪUUӧО{ woyf7gӦMf9aV@뫯 ZjjѢEH|2=,JβAA�@ x⭷z2q%`^&MŸbM,MS۸L0_RV- \=['rª5uu_܋:rH]O:l&O D�V-пr!Bu  N⤴N KA<3^;,u'vuDծMZtZN[5]v)<� � � � � � � � �k/ʗ]4Z{u9H<"и8S>)hv.,Vj.*W]aN,[PUT)F;{x_}u4f � @ lt]{E|SzU57^0{?(Fd׷ 'Hk;H;$'R:? /w,^,]BRBkWG6ʶ^@�XVo"� �  H`@@�( _(4H:Xi・':$މc"~+g:KbbtZ4o<7.JʕSƍYݻwK[t}y S^( oS^Zu `&L>Lo:q5h 5ioN__dM6x`eRq'yCN!ߋ$lu 'N5[g@ 7 9ywߝ�$Ǡ*TǾ?_oqr-'>0)5{2J߉WUo=D2UI8 � � � � � � � �.x0w':\i]o֍|t k[>7Gpו<ό�)p˗P_?W&OA�@�p|##}queYpl}YgeprO#j-wZXkm=%džYx~}p\d`ߒMexIS>G_@�^ | � � @I dxOA�@�ij^.D#Nby%F4iͤ3Έj=[7,Y.NKiӦEMYZh%:6\%k R � ^պtqoOT3G2D6L1B5J?_\YjTrN͆kK_,]tQ`߷<pNE:ʊ'}H{챲g O=TH@{"syԄZ9@ x'ĉ<$_9DiڤnxСq>{Ss8-�4KK@�@�@�@�@�@�@�@�JP`5F}s <?kw\=eΞoA*t1 G�l˖vB-<<SY ?@�xg\oAw/9TJ{"i mlKx]uc7/ywזZȬ{<~8 #mUf"�d@h&D�@�@ 3P2@�L;;z)/2gsPL\hc r`N =WxpkQFƍ0a-Z~_+jmg~։5jT@�u/lkVr;`YRzxHOb6mQvJY삃utګԭtd<?`{K<o+n#�,<.gcB#e�9%PTZ|/:NgJ W^xAx1xxSV\'<8ޟ5+^NE)\ׯ|M`_r+(@�@�@�@�@�@�@�@�@kD݉|P$VҎC<iPs[ XZ^t`x  � Pc=W?ҠAq'6H9Nٱc%ir@*qb㏏z;>G_W_I[o棎g6k1P&MN:)>G.sW� P˾ �@�@�QZ3@�tߤ_~Z_өuwމO/:thX(`z:n4h]{?R}Q=Z;>W߾}uUW Vpt@ ^'8ZVR? uH,}Q,I;V׿R;ɴ |4l(Ҍ#|mԻL80DG?' �dB:c@�r^~!�HS [cK.fΔ\R\,^j>N˿&O-lU,ɴp @�@�@�@�@�@�@�@�X8iԘ1q Á.̙lUXB-WO_P!zI@`e`ٲh9X^yEjA�� �k%мtq3j5J2JK-ZHuJ(9ic;,^Voŋzƍ_^]!6Y[.+8&o'R8KzVMc; gPy@�ߒ:<E�@�@ 6@7/ = �%pAqB!owUzUi-KyVJ 'ᄏ[Ҧ\}?~|TǍmg:j(5k![I0裏Z@�A9; N>YjRzthUɵaH<qlDi`N{<'9AkJJt ZXrEҷJ.+]CvC.w9 ?/rV "s7,]ye`뮻~Qr`x2穛6MaL$>@�@�@�@�@�@�@�@�GIƎ?O*iK͚%y=A </~{qB-fyp&~5Nz3|d@�@`m^dz%8iB:ƀmU&m+9f8^Z:ko87pҽQR{.vXnmR-=nZ>ҭdZS>(!\ljz_@�JZ%-@�@�rZ i:� @ 켳4bTz| 3( Rp%Od^7^xq8_~"fOz&\5^?\mݺ<LxuyIk;wK<>[;v$ֺ@ܓŸ7-XPO}t5V[Imɝ?NB;{䓒'a9eBPܢwIvE[JMkѢ @n , Xg �vmi H?5K/Lv-Rѹi'J Rժ{L+@�@�@�@�@�@�@�@�DdP|*/ᇒ6gSY,ol쳒/S@ 7{tBUR%7:A*Iwߝr' � : xl[{{/ J/ pTn=z(Nd\rYL0AjLgå3b_~;OI-JRӦ+ZsI鼜7$'<8>RA#cF'Ժ}@�K%q@�@�(D |2YU+ ܅� �.P4dt{+$N9߆"(XkWC7VVea7|!!'N 4B2}q1D[>?FA�@ <yj�IY}2^ҧJKG)}tVq \C^{tMgω_) @. ꫚7o^;PQ@�H@ x+'v㽰'iMiߥRiM~-~+N'  � � � � � � � �-69̣*.`τg&*WNS:Lh9mD�˗/ʹZ^[گ[R͚ťq@�@�Vr=q8q7_vYz8.HIrɽd@FK/ű;/NT' 'y[^!N<1N ұ8G-qP>8j8օm::&@� Vrd@�@�:8 @�@V'y/O zT|鵁wB֕ =TYzei=,WM%Jgy;!q95n8Jխ[7]q~ӦMsnkY}~/ @ 8K#~t%n^l^1\d޽ `>g4|&*/>\jN8Prb`  kO?s gO@pڵ"w߽Vx`һ V~Ɣ)q|ʉle3C�@�@�@�@�@�@�@�@ 2[]yerq@fωZY8zE^Y >}w_/ n#@ ,Y0b*UysΒ9'^g�; � @) xMY׮q[:q"O>HsO0h W$j:NrA*07(-^?W^7VʺuB8H ʺE}_~}- CAr׸>?t �Gj$~@�(m'� � �%%`H.N&>"� @8x/z5k&|4qԷ e)~+j7 K_|hԯ__m]H=(qVUzl:� @ x-zZګԛVo8wm>w2-i$ON]UII4rR@�駟Gə>Q@`U^4gΪyҽƋVwsgwD«zM6?$p� � � � � � � � �i(P4y4zt.dipi8pJq-7O-.s/zkgϩd_`J=VWO|! �d@R˖q=U=t_+֩#9NN;[| &PtRϞ'AwN:l{ߨԦKSm)}Ȗ~͠<Xʏ=&pBa>@�JOZg;!� �@jB>]F�@T/^%?~HW' =Dk?l t}]B¹L-\g gZh"}KU%኏p5mEr!j TbEy[V Skpe/*Uh˷MfpWVMm@ۤx?~|j^v1c>:aY]U>|{l.΋h9V5 y �Y(p%BʼnbGzx'NOJ6Z?l<nUœ~!曒x 1O2I=I~^moOMdܓlSK?$d,'Աz3s +%c>o=*zLަ>Rk2r( PO]<ܫ) �� AHg_"#UvpI%}5a"'~-iW<qF2Iݦ__pLcmx6I6jL:Iw cRo'de093Gx SplSp<\IO$ɘc1}AA�@�@�@�@�@�@�@�@�S;\wĈ%!(pȑ5{v<y|eaM{0Gwxa~мOM|¶<5E}J N.sRX|,6<зb酮Hp}JO<M;yP̃6uyP)@%Ժ8+q)y_@�X[0\RvqM1ҧwzPbaiW$jBaIjdg: mԡCsΜ9!TM6-~wuu7IɡרkGe|ρ J]넬xuUÆ ոqc5 Ao4hC+?H+hoy9V[IǸ@� Vi~ � �9%$Ԛ7/Mg@�Xm_Š_~%sΕo'Ңh++ IUlB8к/,9?d^_tJ&<jaR'O&-{s29u~&Mj[v2$~ɵKk͚5VZQME:R=z.0`Lta$qVjҬ6,$kmꤓNK:uN=[@�G'z4l;xCjDbOT^8`?嗇E^/V\\W^;.Q.nCd,Z=qyVV<`puߗ,HL{ 8(ucxR'㞢@o'cqP~bԱQ1R26JEu,�3yTR2nJI#%ۏ�+G"�� rO{y ‚<wM0^Y+sDZ[:w3,9)\x+{.iR2ɾvm'uL3n+85yݖ8a:OQc񋯑%d=56z,q_ad|cdSԘǡ � � � � � � � � Is5kkxFa[^lnsZm0j}a~V[y7딺#d=G#uS:)uSΣON}H5\͚]I]dSIo{B~d.Z)u}C%sR6MC15 Xda粽|tuҭ&@�OqNw-I°K B8(֓O*wD[nir6 i#E {.NV:xng)$Zճ??hرwi\^/F~Ϸl&_~vd^}y93q^Lq9nwc~qR^-BF6k,my~C'PeWx@� Vi( � �9+.>LA�@ <qg|Qj'&o~(',X�~U7 WT?/ L|Mn{`D/Ir-mR} Kd6y$'6QuɫWn]mh|/ʔ)StUWp׵)~ԩSDYu„ yT8kg|Q-LQgO ヒ/ff wQ~@�E |}K/l3ό'ˁ ]wI;yFOo:K=9ckݯ`m8i?.c%a\Xx蓅5wQ m~(,ƫ>]մT5n<-D7Oz`l}|?`/K<*fg[T뱑[K2S;V|c$Q`Ȑ!g}6G@�k%b 0U ;k8Ʒ}=\}/)xL\i SF!lg0:!i;ɝq$V&^/(szxg:)jl?cdƌx[y +l<)8I0dcl, s>@�@�@�@�@�@�@�@�yJ֧'[ms{VP)5ْL^ɺus|dSMra0ǦwMց~;@Ҟ́*jO|d]M#Y$`d[2߼.>({u lX47j!dۧH@�@ 2\B!DB$(78˜W!U\Cޞh7ON�ݕ-vFP8S7qކ աCߍ9Ut駇$[QFQ5IBܣG*Ri (^2yI&X3CRWuwD }>M6Qv Yڵk%*P5xtY>N_tts]: @� V~t4@�@ B<$*>  �&?2s̼:k,9pxj-$yniG 6lZ3D %^bWX1/)ٺ=]=<u"zg}lͯI-—g?'IW^yTdRnYOu]bN~ձcǕ6ѓ,5iP< VY~(Y/vi~ͣI+=xqF<Xïo\0y's7 �9*3HNXV6k|PWGKO=%cٴ'Ջ$ G걎=rx' X[Ok4N,Iy ,+j.{%*,xѦ{|mj}<y1Yǒ1E/$dSR}c% "#;U+˔όv"@xQ𵒂 ,X&ۤe~jq@d<1/ 40$d|I}J%K=E`Yx:INQFk &]F2FN6_kv� � � � � � � � ;ש{ӏ?UwJus+9q&׆ Fk6|'HMR%Q"Uq_re,X 5ɜ(}zdNT߆c{mHZ^ۑNHuxoHA .IpL'JιD ݠ � j N&q=/qȄ=~q\*?+ m9VӐY3F+-ЧO kpiH1Ò|eiDc_\ɺ^{Mzt~c~':&<}:x$FWXI\]v%K># �M7W5d$`^r<p ɒ8UWo"� Pey{!� � Pc@�U@ӧOϫ3f̈u%2INpݞٮ](=[_EPm 8a4QF UL&{»''߽?mڴdRl?[[lE1y~qo=;7,AJS/.&Zp&M%Ng7'kBҎEO/I ' EzI.@�sBL颋 ~{Yz _ջDI<S:|ޥ׆l|'/rxNj\3u �.x›6cfL<K$/!kj/;jժc5)^$($[c?0;3tb^ٽMx?Z?<  @>t p#8׸iޘRJyl|۶mo\1Ma)X?;p]9ϸPx&u_X{<Sؘ׃<a G�@�@�@�@�@�@�@�JWk8<^5Oxg$k8<iK\۩󝜬M(LzrWʞVc?G<'O[av}(_ NK. %+̕L'}ڂ� �#wC!9m%ۗ^RX?˯Kk9VRRaGGxBnutP\}Y#FIf.?~/,]}׭~i 4(Zvsw_j*JLU-.ޣ\X-ziEw}7J W^ye﨣ұ/_,K É_vS1r �*WR@�@�rQ'Rr@"}F�(cPtJ_(qNt$Io.~MLYV2o E\U+q04 ~}OJN'7n8  M4[oM$r>w&5c:3<&Q% W8[nyI]CiذxC4[{!� W]%#uO _'Jx"-H=O:%WZ=w/W'g(٦&hud!q{b& - V3W n*řB$֋:jԨh3r8\:kc&W/> Ph=z[q|@ Z\[θnhԩ4x['"Z<\stcɘeʕ+m�DŬډm%oC n{x[_J45U@�@�@�@�@�@�@�@�bwJo$k~8!4zGdyޓeyntXoV{ۼhѢhA}y󢒤rqVޏyzR6phzzDzG h- %K;ևJ_.xc4Ly@�@ ’${\S^&䯃+u9rx|]\8||aHX1N80N_O7\){z5$Ϫ<Jw^|Nɳ\O>ы/}[oU˖-uq餓N։'ĉqmcǷi(yV6;J@�(ūӢ94@�p7B,xuꔻ^aC6>3KsuY;>/Z�/ _~e$$LwROl`;Lߣ |oq'OK V[ɬR'V K/4:ԭx²6k,/q6l#'KkWI vJ@�^ |&xJ^Fz eIG*eNI&Oyy|B2/&KQ%'d/RNo;1MNX$ v9V>~r:wBsw_3S;uQLi3D�JKBDڥe^ 1x&&p<I֬Y3n$ *8I(pbALcW_#r5 's-_g8(�9WW!� � �%'z � � � <r=)uy.C]to=)&u][9'uN}JwZ„d={y>AxE%[)@۶{D =9 뤲w@�(;/ad=I !`A.xK;y@ , YPꮻ ɵh IEUWժviy0U6ly=a5!Q[G]:yVXZҲ4 *+r@R@�@�@$l9, � Pl>s?^ƍϒ� #71rM6)vp I?N`ZX3gNÕCf'|RrqB.5>lkرQdqaO {Իr;,Njf��@�IDAT ҾeSi �e"^D<c^*E/t;.H/(tPLM,Y}g0aR9)K0;-YեK(Hz Y%D~;k_!ſwH^7D Q_Rο[>א=X*T`ĈO>>Ν @ ӓQ7/%2d:I}a9ᯃZhB|p4I5$ϟ@uA\*0:q 'Kx4k֬e^2I֮]Cs? � � � � � � � K.[xŗ!굷I\ ri7p4iD{G4k7S ҇N!PRǴYXRN=IuZO?T/?8+P(u:HM6q k*t%ٶV(ӑG*~ڿ?k*@�@�p\'.uM-!f̟`I}, uBZaUTC.ἭPX]z!KwGy7s[TO=6]yܐ?a(^&6#�� r3 � �,╒Py;@ `ѓGWΥVZQPl'�rEdGO|dc6Зp0D&{r';igՂ zЯfի+iIӤn$4?k� @ Q=znqZ[+$:wBN,3&JD>p(|㰸 :vup . .!+F_uh(0S h ZluB xd]w-@�O'8 \[ΐ;vl15s̉zQXk6t5&O\rf"l\ G㗯ªKg\/ӤifO+@�@�@�@�@�@�@�@h筟:Zϡ pҬm&Z2D\lKR >A7Dk=&M$ύԯ_d[믿~;Gs<.-΄ZW\!}q3i � �֯׽KI`+a9{#5ٖyhT/Oc;kZlYHt SvYg.Ӧn$w;W/rat1ncP@�HgjC@�@�B 1QBA�@`8bĈ|u̙y}ue @hSNo %_5sʇZx1;\] SNM}eci �e Сtqʐ+FGxuDG]ÇKڭq23f'|}r`ٳgG /ҋ`K/tEilp"vZf*O<9j'&BL?$;S^ )+1s=/w9 ժI! %~75*ߘfĉѹuF&<9ꨣOԮ];zAsMj?Vq-XQNէO($ivqGWD6 � � � � � � �ŋ5n8=:J3fΛ7O+V4o\p@~^'j,s΍}0a:iay}A:^G `KZN-ool@�@�2[ V[ueRit$ kWl_{M!>FÆ+l!1Bx&˭4LkXG].d֭[tn^ku]/8uYK@�2_( � � PlkIF�<~A| &hϢtغuh2Xz -F <)cjҕEiȑzW]O&駟C ɘZIoQjH:xRKNEA�@�ScO'jz*+CH+|}JzgQ?PqTg͚B-oh^EA�jp=:p( qzHN"mڴQ۶m뮻}QFkn <Φ �-P* )G0}L.GE%|[nVa@xFcoիW: ]@6l3v%]2eJ4I5z̙3$[ƵCث-) � � � � � � � @L815Iœ] ǭRJD�UV^k6Rt8ذ@[ύӧOpoiwkv_۠AԗCNU|e9z6O?N:I:|㲡G@�~ XN?Ɖ\+_}%Ғ%k?ܱ[^Iu­,Wljk}FUhX.z׽{wr![]χLď=X|{ @�(ara~� �!2o,ԩjdK_/|8L믥w>�~3G Ph{wՠA4~xU WڵkW=p 7,نpt(V D |w5iD{k(cݺu}K`opS%i� b) � Oo?qbLugOIWҁa]QV<xP[/.J,Jdʟ:-[/2GX{ҥѤʎ;jwWΝUNU.+]KݗYe'Ls'?@ 0sK.e=Z|A4֦n]I4[MP@ 7fϞoL{s΍xL{DIsS(z|L � �d�U23 � � � Pr^Cհa4|pO6mDpvihK"82$_󟆌C<'~EuAuaْ`)>ÒK揆8YiѢ_KzL{ ü>)3P@�@�[ɴTki[Κ=6Xo=8VÆRR}+ctwƌ:#x^~9ӭ8SR{Yg1m @& ^q?kR^� � �#RȟBA�Q_(xWz,+ѣGH)LjMP٠#Pz(𻃿xj2&;/Λ7/ZеkW„t-Nک0Yz5iӵ @�BtI 7ܹZDZ<"j9~u ߉az}5DO#P|ڼyp с؉ۋxp}~?{z%s(# ٚ.f @FT*{F459}t[8p %rR`_뮻�[lEF#@ 8^nݢ#_| |=tigI\ @�3[D; eIH?-R.!E=)ٓȮ!GI?g~iyf3,9}Νs3]HHHHHHHHHHHH`rJ*q5.Tԭ[Gٲe H""Yʕ3[ǎMOQ;[һwoc1lK"'5&J6 F'DڶɚUdD& � � � @@L$ mߐl 4O;;SU&)\$[%Jmxq5q1$}jժɓH�͒>'4VZ%CB� � f $@$@$ 0Ch@ٷ/yȑ&",yS^jH <cdž::`ٲy߀, $ SN@H:矛RJIv}&NJE$/QEʗwHHO`fZDN5HQ#EjԈlo0Ld G:uHc=%�7-_\ΝkO7nlJ1C2$ir W_}O>$d=~H$@$ RhI#:ʹidՂYX< � /A 25xr̤ffv饗yg3pvG$@$@$@$@$@A_%"      Hj263g44PMժU~R^=Mn޼yG$>{x`C 6H2eiӦf&gE*QroȮ]ÚIE&OYX+=<N$@$@$@$w%ؾ plݻE4)2+&b'ٺ>^}$b\YfI֭?رc,:Xheʔ)ҹsgiР|GϠ7$@$>WS<FΎg� � � � #s 8J$@$@&>7n|ᇲrJ[tUZj%e˖(: @z dҕo$3nHZ]tnqMo:_ŒEDڴu:' � � dx#~*{wQQE$GY3 8qBK0a 85kVi޼ 4/P@2 c p M5k4[>}ȑ#&=?rwߞ;g-VX"s==!0$ șSDٲDUN3qDuXڡzuҭ[7iҤ D1!E]ϊͲ,\:,s*V(:t5HB$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4>/JS/͚57|= HJhѢr7 ~gT-}Ҹqcɞ={Be#pqɔ)[I/(2zh<&J`$@$@$@$I `V-K$[HW{ ]w}~Կ,o-$B-o sο$Ӟe˖rM7￯zKdB䚱 aiCdzɚ8sf1q $@$A u:B$@$@$h+Od߾MEzJd~wt#sH%K䭷ޒI&IrLB,Y2ن� ĀL 1cȷ~k^zKVvQ9EFMlHH<F`FΝE^E}WQcHE 6Ȉ#L`TAY۶mMy:IbJ�f-. .?#ARsѣԮ];}Ǫq$a,_^dȐXvoWrٲevZEIHHnA4ɊOp fƎkuIFLk`b`W_: GIM�I> XSFz]v-$녣=g^YHHHHHK⥫EYIHHHHHHBFTF2:uI AVVZ`8I'� xɓ'e޼y >G5IuYO_O#~a/kZMHd` B$@$@$@$@ !pȞ=ZH$[ۮ]"W<,*V̗dKW|^H,煽޽EyȒn�/xfv7s°=-#bk6 :]v0b! H7+F#g3IHHHHܹEQUV" J{9Y|1ꃡ_:u<4J$u]fCw5GNtA$zq5:e.plK~HHM�Fj:-&QE3_K˖-5Hiڴy̚.xH^fM 8P,X aÆ&>j1.30YHHȚUDc D@`˖-˨QK/ݻ-" 5B$@%PD ضn*G6@wl nlHHHHHHHHHHHHHHHU1b 2D?n|I^0$@$�n2w\7ny_ti[oٳ;mL)`x&i1/ E&   $"|Oŋ5Rb"Id\L-<L%?[{^" qY4\2M*^*<CC"z ~LYTj |ڶm+W]uy � � D@KK   (`(uQsH H(W| ?q:9bv@$B+V6{1ErB$@Q"paX _#o4n8J}ݺ`?sdzIHH+gQ^|Q4!>+ҥ@릛|h\rWFHcM^z\o� K <xP{=Po-Dʗ풦OgyF fȑ#}l  Zɝ[d̘ 2( szW>#i�ꫯBlHbK2}tA ` kO<ϟ?uGh+� � � � � @L _%x8 � � � � � � @ 8p@^z%cW[jUf͚5R+ ކ?> էOcZTÚ[ٻW%=T6oSGfMS/Ɨ.E%   c|h {:�xT/FJ++T(vh$KB<^xE"<K  lњ5kTRU@l$2駟~ћHH bWhR     Xȕ#m� � ĚѣG{JW.բ^`O|חf͚CڨQ]vAD  =Z:t`r;vФAåy@EØ?<re9>'q/ !.[=K?NӵM}[Wxz!ٴi&b6moxr># D"jB$@$@IMq^)SF|IG\\]iE17i";8~cǎҾ}{{8nJh]cnKJԨP- =Z"mb5\L"v-[f#J|qFt'jժ dfI<<K+L+׃� x@,"'NxGDJzBA!W\N4Sĉ]Lkڴisyv^\Éiy~ꫯrg6g7u չpe˖2{leʕY,$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@&�W^y]ؿ,X@dZU(긫=XǏxپ%^-=c| 7b?~}0nܸ4s@)S8.ٸhp}5%V6["    7Ȟ]ti_YѮ>")2}";wc*/y=i< H"7(GCX1gU"HU-h.%yyQ*O>Z~"O;'v~ix~ѢZxX5 dZn|.%  ~xv˾HHH x7$@$@$@$@$@Q'3I$gA,$@$@$mu K. *jue Ƅϲ}vtӮ:$5|bg߾}h"1cԮ]ذf\?%i'swԩ3իy񬇀HހZn!^s5㬾OJh?zD"ŋUHHH9EtJ(>(ҧy=,<3@9sD]MG0_<N$^,u֤iʮ]L<nab^N(Αsv@}'LR~ɠA$K,+'(ѣtYRO̴ JRum'8 1՜,a& CVV0g$[ʶm(\Éһ3s5G5jԈh;h,o"a9N:X֭kjM2Ez-'O1cH"EqHHHHHHHHHHHHHHH#֭['v@#h..߈S[!O,ڶٲ'^-çUVf=z<7NGۨh�AOTB-j1r6I$@$@$@$@!ЃpCqx*{꿿l"!;/U/ • 翇Z.|!^_WW_ .@zZL\ ux.ULx}Ő}HHL ѕ<8vG$@$@$@$@n P P  XfI^SjU4mɴ0L2ɦMdqOk֬)=vc^k$b:uG2#pvZvj9zyj̞=[}>zp8U(t?|[MsXE[5j$3gΌMGihZ5DcD͉CNfU  p9$Ī^]t(:kBdZP -[}gn{E$B4[i[ulٲwܑѸ"mb5/tUutTx@1b& Ly&' ;v$c?vz!X?� � 8&Z'O:!+Λ7O*keN tZwuWBW<pb9D27K/TzZ?O `$coB,֭[gugMHHHHHHHHHHHHHHHSZV-dծO߈S:Ov6YWKu v. "lڵkU8}OȖ`)u0:l""d!    pN ~uzDڷM$s"Ç|ȢE*./{dd?^4oN^H̾,S (ҭȍ7"ȡCe?%u!I.dA{#Gѣ'DNx[ i>;wn D$@$@Q&ZQHHHHH 4ȑOHH~U-ZH̓|$qkɗ/wy / Nd<;\#4)dS'@ִ+Ym&:uJsb,$z;w.tJg 4iD(~i]p~Nnfc0·~E"~+RWß$@$@$^#͚h)"({"QXJ 2$Af/D:`O#W'}r^Nwܨ3!U䩧;U\UFtRYdUea>ٺukg' @ Z?hmctK,z`1+`>&Y(E8&/]޼yeڴi&y`ƍG|%              p9 J6mW_p7=e7mx3d #JOۉd&+j\?vIÆ _~I*'Wj!w|%$%    B�9PAEcp=󌨟ĉ"gn!pdYN0/Uq9995u\ IgH4Ab!  _j ]� � � �  s4HH -&gΜo崸=z̘1CƎk a\W&O,s疦M;#?~rm_|E`okС}>S#CN_ŊwRxqy9sO>m>[^zfʔ)m޽RjU?A_(o̘1a A:t6i$@`ƍRfMy饗̸JeѢEE*U|t9Uo>y嫯/Xy) +&Xy<yk׮Fns'2ϛ7OFiUWRE/~dϞ\7xm1B믦,=f0߼y.~^/`kk.ͿLL~q# q]PPK%J /`1#<b{G=Ktɟ_M%OLEc$@$@$�bHKr>#H ɤNcG_p,F+"<CO %sA>} Y ј s^Qٲe?j1yqG HJ =gǏ]weiu& AR5Ԝ ~Xvid?~PԩSR`A:tՆ^ѣe֬YF7\D owxMJq352_)tµjq =I k+[QZ5(N,#+K?H ivHAEi zzҪU+yǣj웁̧za:  [ ejk8;i ʕ+Ijc."0a Ѽys7ӄZHX~fs)kqPc !\?e!{9|РA[o?`vO;)áBzW˖-lٲWM'rk$5jԭ[׬Ɏ7έR.               lGze|&F8;'I~8_h9P<\ 6^FQF;pB'44acken S;P9gw6p˗mۚHvsq?B]m!'%K;.$LJ*\rɲk({5zn݇{w+DK']O 06Mv4$@$@$@$@$@q"95NAOJs㍢1A DP#s`Mz.^8ynEn&WZeĹQZ|#c^{}"i� � @ h   طO#e͛a(BT bY EI61;wߋyLpv�UH<K@Yjphi"*WA[]t2gάIN<ii|N:H$ZV|, fBƨ L=M2N n!&؁ *X׷֬YcM{Gٴii?yL jim߾ß}Z0b1b K/:rHJ';6ʚ5,5 4QIRѲ-5668۰+`lҠ[ׯ4(i_9zmذ9+4{MprŴʔ)c >^u]gh@Ô:dDX:4Pد_?ӆ&Ki#T?g϶49Gnxq]6p;\s L55µociRvnݬsZ8&l4ɡ,]$՜F=s%ZiLh0M#qۇ<pB#7wK9}oۿ[$@$@$NC^t^kYEZȑuTs~+w,kdgľGY6E`D&dMk=v6m9N!󪎅V֭;]5hikǎ<Mrea|C͹I@;M_vuM^kΘ:j"\StҖ&/4yyr8mBˣ1V )n~Lt3=~sMPge˖ͼW']RO|qՅ&Ut}~i� @#pݖ>K`v8\$HˬO>iFt ljN8YÉ<߉Nn &XK\1>3p2ӤFBH#_nifv<1pW1'өS'#+ų�@Fp!*P~K Y 44ɳY B+=uԩf Ms?hHHHHHJ@HHHHHHHuƏo5@d %P0 vNN}գeq5N`g9y g_Yjղ4iblq֭[glq`c.ab([`g^]D v{q?m;Ը? d:wCą0ae`D7bFf^_~//[ر] fo~s]=^ _a|7. � � � � ܡ>8kw昆 ؆-y8f(Б$%sCs�ZxNd;@Ns q Mvxnf � d(WrTHHH 8qU t W/wa^ڙqb- o@B&<޹}vb,ɢ $G2Çc061,@pl0 d!߶mC֜9sL[HNHaA IlȔeM/##av!8٥zVٲeƈ؉p,҄ZHe"EXyZmڴ㎔6+f  QBp ڏI+?|Jf͚#ƄD_vyꩧ̱˗Cv1cU,\wvc@0ә3gCqͫܲ[?G� � ?ċּV5,D):E,z5yp=":7':sf>C5.\̃xŘ1oTʼnvZ##q 7`V3s½֮]_cj_T."; >nN@;rXZљNt&'FFҙA8<Sފc>VAzt]dN6~XHH"#\BL!# b.e'ԂNp4NFП5h4pJ|^N]΃u$^NNt{"Zc4n8eokq 7'p:$|M#"7>Ul 4\P4cn\81LxuȖH%l{/b!     H$<%      �l*V>1éS8_h99w1pldΎO>6]v<y9f'pvXNsN?>+Wɝ;OTB:s #rr#m;e@vمh҉S͍ѡ .lث{7nWDr^tsk:|/~\+'#    @4U{5|[ &ٳ-رठ ^+G<@i}..t/0 Z8ώZ(N|L(ٰak͚5QlM� @"_HHHHH 98屐� � x3޽Bk3̑#yA%W\f+0K{WKJD&̒RJȑ#E~M}$'NM$%KL9k1 gK.]I&ɍ7ޘR;,I4BU[ʔ)#gʱHvL"ǎ5>t b( ,M%ݺuMe>t萌=Z ?γ: .@ʕ+g56)XZv.˗ٳg&D2>S�j*|C\d?~aw]ΩPBJ+\?\ܜ DVJ%R tҢE\]Xn˖-jժ d:/ RB\'nϞHǎ";w|Hܮ� � d`:u3G[D^|Qt #:bӏV1wNqC@]2&I~&{̿5ׯXB NuYҥK9qhr%ɒ%}͹1ώVuʕ+49QR�'M8}n^DHXӣ3-LNt3ils5y6dQ'Mο~z]vu'UUw=4 {믿Yf\@$@$/+1Մ;m,Nn 'N}ygW[AbX?4N$S2bX QԹʑn Ntc֭[y5a-GT&-ZN6l7.A?8|gf75~)Q|8>              .l6o0NNG ;8^'62vb-[6y;qj=zi⧔͚53\sShQs~8;9T8N@qrmKc~36olر~$b^kXී=JzJ#$DzIHHHHI_L ( 4h R@xY?6`3#X+N {v<71'yi!~|.� � @ $axh#b{$@$@$@$@$@$@$@� |4ϔ)Sбs=&#W^-+oa1h79sfUyqFYF O?do-[L G h%PNa2 W^zꙀ]}+ɡmlj}pC-SO=cʕ>Їyݺu/ؼ -~ln#v^7 a}%@umyp<k֬rAQI֤I9v]B`nYhj2 Ek nr� � dd)[ȢE"c.X#6@0 -LW_֭[*G:6Eo8M08A뮻iupi-I 'snz̳Ӣۄ7l9kZupɉt&8̙Ӿ~jKq X!馛\'TӸNִ4`�XHH"#[YR!p 7H<y3TxpZu ڈ &5Xýkkўl&cMNn N88Sz:Hn@V9Gc9z(O)6ckqgW$2C"j$c/]6E� � � � � � � � � � � � � � #mȕ��@�IDAT5 'NtTߋ9a|գe~^$ʼnLvٿ alʔ)ǟ9qܘ_Ѽ˟?Q1~8?PjQI۶i} wm� ˶:uX ( ,\?{{`ؐ!CL9}`!p&OvѸ$"}IHHHHB@]L M>ΒiAv$E\p=qs\ \܋`Xs99~ZZ9"-. � � �j '      HZ/̘1Cp[o|Ht5ŀƮ0ܱc.J^(RH=pZ]Scl %A *doh_SN |2g3N,Bĉf?n٫?#G޽{ũ̋"⤟TNut2֮]$bԩƸؿ~ư? bΉߧq'ٍ2k4;NsQTD$@$t"Æ4IDtS<-Ȕ)"6j$<z G֭M`̉d&#}:'9]6m0:8M7o81Jܾ^BiЃNupݣ\>cuW8fNg ^ә KcW+f yx׉OT;O&ո8 HJD3w(,YGAP: w6/Fjk8Nj ׄ;i sN 7: j ?X{Cĵ6cn\,8eQ^Ǐ/GCf!j<nJ� � � � � � � � � � � � � � �>&Ԇ \,iE -;'H X; E.ofN_b9aOCT@?# h欷vDѼmձ-b8-O<iFڳgOҽ{g5A{嗍mT,Y\"p+3EnEW/*%"    F RrʂWюG18y..Ev}7/m#Dٲe%W\n� � @XL+� � � � � � � dT5k֔A  3L.XAݻws='Hrd,`a eal2ɑ#G8ƍE#<"3un.-~'^$;j2ԭ[W>Ln X,e:=zTsFRLA�Iaʕ)M.]\bEsެYRdu' =Rpa;v{o;c'){饗L0:EKZ ΃A?Oεh|G\R~EZrU qĔHH O*Esz7EgwyCE4k&j0\sƍ˾}쏒 85iD;<3޴:8aÆO˖-[ ǣ9經sd\3{~o3w\sdNup: GsAq!'}-L53J`kJ<yfzrЙ/^,SNuaf2&0`\yFou-AqHHS⭯x ʽ+M69sxMMMAcNF;Mm ۿP4hkJ%K *;C8iжFͱPI_`ϿCqpO(9|v=Ȟ={:k֬1k~ϗ=%Y$RDn/H`vw;Ck,wx%e䕎;vH$@$@$@$@$@$@$@$@$@$@$@$@$@$?nl,ZYhQJIx4z윀-ld\pv<Ç owc g>n+B۷ѱC0mG#A`۩xk�N 8`l` @V _Ǐ/[^{MZjP8@vDnM7!     p@/%%s`]9y..Ev !]|bF15j � � i$@$@$@$@$@$@$@$K ޔ;J~R l6DP;Em۶cnXzi -` 믿n>{뭷رc#aawe8C2-2bZ^|vwۓ'OoQ.۩S'y7 k.S~30]V`A<?a6m<b MlpB>SAppGA:,?o!A_m_M5ova>>5\#5Q5R&3!A(wrcH~'@8Wxq~̙c`8c=f,];H5j(#oc:?n/`puיdk.z 6 ~EVa!  <HEtK"":yשvSdKEj8NLjL?ȫٽjժ hn/ 0_馛03D SO=%H ]6zx] Ag̘adǜ:#7GA>@.2Ɖ8/NAN+ٯ8':S8 Lp kd$ z<kv=Џ Vn.˗/ڵkgЍ˖-JqdQ $MoG}dλI38HL@8w\y9E㹺FU \ 8Yi$JAR4A4iݻ׬@'sy$FIm s5!CJ Ekң׀5ءrd4P ce_uhFPu [f<:onݺ5VT)Ν;              0l0yG/5ahw# KW=ZvN# e#ÕpvXѣiso;T=-ɝ;9%*} /4>^-WVk8qz8'urc][@ %#Ț5kL$ӂnlقɲ}oWu+loӬH/1fݻťl. 0{h5EF . E     (R끘,N{>m:ynPNaر&o-2}tH}(<|?y � � $:#� � � })^ϛa(BT bY EI61� ŋ-MrdUZ҇j+'↥- VI4h,54=\K-54Ϸ4IYbq5uԳj9M!rփ>hi@jKUZjlq:<`UT)s,K,v[K8qG] gjimճ-[fj9KY9r䰺vjr-Ը|Y .0`+Z?^jj@Z0ւ u1 ~oڴi ig3KyY/8s[ ˱̚FL2Y52qAu߾}{K5`l0_{ոqcshs3,4YA>K uEk /tA`CYh/c]r%F.ѥKKWq SM\gi21WKeJ$-  O@V֫Z:wtna89񮁩kܖթsxo[ʒj۶9J0]s o捘_VTZdC=6MBji3yd*U8f hBa3ϖ-is{/бps{pfUPֻkU^݂=t5lTD KZj@ҼƉl^FKgr[8љBQg:zRn2@VJ :[E\TM6ʕ3Qi;IH Q>2eq@��?O?upFh"/6wM0di[ki^ ӄ[5hA؉Nߧ<࣎>o)\^] Fb t\r5yjlauE'zY8ցϰ&y62r3X{IdnӦ4ibq^0N+}Wցlyq_uK3&@2䓉雽� � � � � � _w � � � � � � 6 5j%q㘂oDW=ZvN `=Z('N8$Mel~1}5{챔naP>N?;6l0.du/qb'̎(5NocZ,p֩ll՟?)&>86 1٫_M֭[[;wtX!^kYܓʇq<<{>Tw:     H`֬YF^paTGGŽp�ޟ3gNw}7/Z4h`]}j� @%c}Q5|)w� � � $o.,2oȵ&ZMC'o_4[e[^"o^)+ @4ߢ kIӦM駟 B]цM#\(<N4оѢhv�A;Qjj@>?pE~UME|ԨUta˜ɭrNw>,?)SF4yY'hpsM4a=~ F@ O@uGo5h~kI8u\4Zg'Ol6W-\M`(P X DE$sf?5Mi7D~X{E in'� � @Psl*ҧoV='QZysoyDIwFoGyD/BŨw- ,h:h<Zs۷:]:=oF1c3�|U6E`rt%tr[p:St /LXKh}ALA>M-4lPԘT. Fz˃<PXmE{@bH$@&нȞ="3g[NH =?? $SLn1jriI{;mB4|FjԨ!={4Ͼ59h"~u(G(o 9= u:M8-ٳg72h۳#HxDG6]/o>]l"n+2{H4SHHHHHHB*QFHHHHHHHL�v&L0}H vzsEj|գe p62iΎ s߰\M%P؎ qo0AE zzqEk;` wm5:d˖Mu& !{壤f}7}6oKA4q% *u׉//2dHЏrp\eVuq閝� � � � � @Fr-K,Q0s`z.4Ev!#%"&$^Z}N{<$h"SNZNe]  �>`Q˄ZQGIHH 2D gс W)2&wlN$^[5J? `xZp.I;wJֿ2eJHk.,TI&a{G"[n%l=7WXp8} <X&M$͚5gyFTTѡmOdX � � ՘$'h!TE4)  iTȾD*%姟~W_}pYKZnme'\$ sU;޽{&M$h5c ׷5yCYd&}4bڵCU&pX ӥKYt[""ȓHHL*Lvq M�"0h 6Ag.'SG^3l0G2īR/#kcM&k&ΨQXb裏s[$הD/&lG/`:z%      Jx6 � � � � � � G}$o@ ohxbevJe׉kߤIy~m㳅 <9sW_}%<H6Ma@ˎᵱdTyPEH CdZNIHHHHG`Rre;^#%/߼m۶w;v�F  /Ht5aO$@$@$@$@$@$@$tJk#FH߾}M-#wܡIbn�«A]vYHrX7o^yvSzu^kc5 dȑi& *UJO&E}Ƭ (!Qx  \*IO=%r"ӧ5&@S X5.R9@ㆾS^=u>2ZCў8p ܹsjE{nW6V/_Nc#ĉE~G)W\>vHΜёp7nqɇ~dZ � 'q#<jɓGyMЙw}W~isҲeKɗ/Y3^/iIZk$O{O^k24vɓ'+W$~Ӹqc9s~yF-Ү' 0&             H s?>~'PBƧ}&@mD!&VG`hGڇb 7Dcǎj޺uk)UlٲE,Y"6l;iuuN7|#&M26ի/wȽ>\m[dZRHHHHGL22|pgVXQv]S<|:d|2K,)KIP,  BKKF,I$@$@n& n: },@2ygЛ&8|1bUtQڴi#X `! @X6m ?{lco]hV P֭iD/D 39D  P!S4ȣQ%8jzm^DzK{#n&'>}Zf͚%cƌSJl٤fV5 Ld:73$rF4BժU_ѳ8yy΂ߡO>Dvmz(k֬ ,}OK4{6\ = IH I|o }$J0M?qDپ}4h@JӦM .Hd/a>hPeCK/.YpƾJ}4 O~i/^,+W6H\hhvŶD@c5׈,]*RFe3$@$@$@$@$@$@JDx � � � � � � 2yd>E1͛7z kX>kܹS (  +GwqsKYl NIr:W~ƌr iѢ &M]'RȐ!_]v2>*퟽� � � � � @߾}ڄ ]v67lݺz`^P6M$$s|X_H&Ԋ5aO$@$@ pBс˃-"'wo6G$6olO4RlR5k&ժUcpᤸ DF`2sLch"@dK(J2"HH)?yqwzaD.q͸4?:@Ocǎ9 `.^{1jذ\yr9O$g%{삍-[S%9k<5HZ-o޼}"zw8H pW`rwBIHeߝA7ey\^n VbEQFRn]Ωx}cb/}4?Sϟ/z/bֈfQ\9O/#JY$#c$     w#      .C&8!lljՇzzL)[K8ؚX"Ν;=w�ٲeO]tꫯv 6e[6U $"DZݻ9     e;rwDoo<2W3gIIH"'#L&rƉHHH 89u@wMی� �2N<Y>3c ?~An/_|.b� DݻMD8/8xǎR|yi޼mVjԨn<߆yJ"Sx~P� � @ +"&ҩSԻHhO<!"'hMזGtf~vZ)X\2pЄ&l{#p̝;Wm߾]ʔ)cزATD$QٸїrjdXǎw߻ב� @Ӧċ>ْEM6u$\p FRvmԫWOj֬)rJr$@1&ŋzt+VH<yoJSQǚPbb,iL4YVlHHHHHH 2W"      >n|矛5Gș3\uU'V^h9 7?dɒ%c&VSۨʕ+{&!U&ux"CGBL!r="o> � � � � w <3sI^7ސYzw0.Q7|I�˲e˺LBC$@&c}eP+ք> � � 8$ CPF.^(oQY @R8p`�ۜ9sd׮]RD krݺu+`�⤾ 8d'yf4q&pFDzH0ѨQ#q^"߉"]j#Ҿ}D$  $$^E�}/(7oTԻ;L$Ҫ7Ƹw^믍&@ `qjժe4?|o R� ĔÇMpy8U۾}Lpy8vׯ_$*]tLHt:|ٶMdDKYVUlFG " F@嗋 S6cǎ7|cy晹eYRR%tM5ml<JԩSn:zoذ$փn YY<G@Dsi� `?� � � � � @J]RHHHHHHH BY;ww-/J |7` ?u,D@&pqYf,_\;G>{kp% 3h=ȓO\9:     ;vy%cD\O9x`yGM<̉' cgţ$@$>=\˄ZN( � � ā�'4q. .6߼]tQ @p5$BFkܽ{wy&ZjRxqύ@F FӃaeˌaŋ7!G YWRO<ؐ<HH 8yRW|\"#LDmgOfͼ7Z$^p@gz1/b@rf+THI8t萬^Z ,k<꫍Qe2e RqcE$yxsDẲ� � D�.jy֜8ryދHu4}Wn/ejf[qFH{Y~iV\i~VX!(ZYE,Yxo ӧh!/�茏HHHHHH A诒 HHHHHHHoYt,Z; 9rJ*ZqX/_^r1Q@ ?|lQ`/UT)UN< h^P_?g>P     /.۹sgABgyFz!ɜ9DwdxSOi'/UW� $dO&IHHHHHHH .L|uVX g̘!4+FA@!;v@v0x$wC|k֬)7௸ ~?#+2xH¾d"j-?ac<HHԟOKdQ%8Dd%amQ$vDL%\DB: r;v$Yd19rlڴ$A]A+4N[eϞKC$ ikKvZT ɳJ,i;udCBB\d$;7) 1̙3嫯�(5 � ѣAM\.d3gN_0Lg~'thhAQP9`AglObB $'$>coXsqɛ7y~]wFA"q{Ei1Vr]YHHHHHHHHHHHHH�d]fG}vו+Wɓe޽ߵL2RBct `/RoJIH௿˺u+lD >(_W6md&VB6j}1}WGIHyHHHHH@�|H+Zƍ_=/ cHHK/fUT+Vg}� � @jQ}B$@$@$h+Od߾M ߼}Q: o@y,#@#EFFp:0\+ҳ� DN&@"(qɳʖ-+XZ1 ^z9g \طsυOIHC"=&2|ȍ7piE&N3 VZetF̻9 f2 5mL;15ϟ\ 858I`۰aO8!Yd1 T;1zJd?‘zszA\H$@#PH׮"O>93N25XnϠ-Z4>W4^xyΜa@q$2nNW4x&qA#-c _XNa% sHb=VHHHHHD*^ZHHHHHHHclແd:` s=WJ.-HUN K. .n&j۶mq36EىcP l*Udi˗/5% .2dHt&Qdho~lHHHHH ?,3f0 ySN`ć7|S^}U駟^zgNg  tH̎j � � � � � � � @\ dϞ,/?~+a<mڴ 0\DPF{2>gΜq[ ֭[a0B}˂Ry֮];c a$c]c=DԞ[^x!>  iو&e3FSɒ'QFlRhK-U#5\c6ӚEl)ɵW_ѣZBLS$9&^!5$J#pH3B_eӦMv%eH|8ݪU+,NxZ, VW}O?sYp,^8@YHH "ѩ<)N~~ܥK^|v&M`4Xu[1A,$@#pI u:X#B)QiU&v[w:o޼g{_ &2v,iyRh              T -ZT7nl6lٲ% >-R?QrZ`_ 6ٯ~ɒ%S?YHB�]xņMT….352H, _m+d̙" A*@$@$@$@$@$ `7?.uUҬY3&ҋsN& %=C/,$@$@$vL+DHHHHHHHHe&Ϳ߿.oذAm޼y믿`ר[xqclkE]d6Ds9Mr<M� c0A@0A0g! W\a)z@߽hY"I20HH {-d\sgAD#Q%CAR>}I.yQF0ylm=A7nh^ᬹm6#$A ߔ.]:e×! ۷:&lgH$ H[h 3$=0(s.~x ik׮!+ � d�HHX<H�(hͿ8p t/R*G1U^STs3r?yu]P>bk?kر/WYWFID:umg              H.iӶhӦ۫N>s/.6.X$?M]ؚ)RD`{'b o.^ ,xF|C$�lۡF,)DٯZTٲeVV}}^J�>M%2H*nr� � � � � xW_- .YfiAҪU+W^ϦyUv<wJO>1>ٳ'ߥ&� � $9JHHH7#@P@~DKQq,i!oiXHO�$BenٲEP>={@ce{%Jh�OFd X"_0~ED8T#i0 s1cDuyAW^qpHH ]_E/YoQt5'#֭L.2uHÆI9̈u 3C 8"h]lvD0 B^$�$l鯿Jyg:jȑ#.wK�ӦEX6Fn^$ulH2*YE+KrnϞ=) t[A0]5^Aŋ3xϡW `m=tm쵠}j|egL|eݫB%GA?YL$wu͎HHHHHHCPF$@$@$@$@$@$@$@q >om6}v:t(E 1>k +VLh;IH�¶{}F <y2eyBl$]aɓR;$+ޝT*C( "JE"C%4k"(M Q*4($(%dHRIhPH(ЄLqo~>}Z}^k=֧vmiԨfƍz~~y_� � �d&l21B/lR-ܸ+dA擹h"'Ng5lP]w.x, @ly~Ht@�@�@�@ 6N:ޒֹ&ԶAet.�͘1ûTR)+*W|(!Vmذ@&AGs7m2-~d@p[NtfѼ}b+ n!]uTt(y"�䥀7nݤ3믗g_ v^! XG- jKZi۶m^9AUۖO>kXLL2^Ǝ1}-VblB{Iwzۄድl0=ކvPd"wq^)Xikkb#:\-u~Zjnx @&۷A3ٔ'@6;7n",[@4fzO%; oˤצM"EžM"#`ms{צ oׄѭm=c'{d1֦}HTO.]*w`Z95y � � � � � � �GC- 4HPnX`O,Y[[dcǩ[`L_p<nG]`Ϟ=ڼyD`|[O67QZjsbsCH& ϖ'M.9HQ@�@�wիӰa4uT?^]v5\N;ڵYΖm&^oVI}lΝ;J7y[/_ʎ� 7G� � � �$@!裏 w^obntXYf&hѢ^ge1rpCM>ommmzRr 1~ᝄmĠ-[A(jXGxlu.]^y/:tCjԨ5Ԭ.D]&%wV.ptIT9�#w:I.Sc餓@jY�)䎇sxҎ!mI/^-kx[;ǖ+Wj޼yޱmlbokX;'h:ycKp`.w0kIv{ӦM^{)|mmQOx-`Al ")~,V[J6b=yoC�#ళd<!Ih.²%dA/iLo4v|iy%Ji2NxƞCʟvƩ4v'=ܷZ Ov}AZjjڴiJp9k؄1� H w!ݹH~@�@�@�@�@�@�@�?ַvޒ^wu p۟~ضƢmMՃۥJqk+!!X_:o T}em|x1Yzyk<f<?"!M.TjX4Ir � � }bm~ <55Zl7濩jԨϮjժ|ݜ={smUW]6mڸ|'&o62E��#N@�@�@�@�6a-۷{[GuT&YF ,pmڻEőj@*f &A'තrZu4-Vl?u֭^4 zI©; S6f\u[�6kVNI/)ٳJM/͚]{oKDmۤ^N{'b-(3 /t Ժn?@T^m3f&L.({` X[ЖQcƱ@,~mm뀖zzۿui {rD[,PX"E2*.Cݻwcm^�` l&GdX{zmmo��@�IDAT4h=fm�ڿZnLl$k^`KB��"g{QG-`=cm glvZ-^8%JlR;\ o˄N=c۹Er]'5nkoAOz_3mk}FɈm9昔A[&h@FlݺuKC � � � � � � �SN&b]S0^=deŊ)ϳHllaS:d~N~2{JA?(umNocʶK+EթSP8ymiW`(%'wA�@�@�b!`m| :e?n"; FxkF4 X�y[׬Y;2ۜ%VW_}[e˖yAU7VtYgyY>B�@ ZԊ4 � � � �I(`CT-iUoB&ړ?{nrOeN5h։9x:ZԴ&<mrtH-6xX9vd:v!+ϖ… {ྭ ,(42X[j+Oz7 X[›M,֩;ݷ-wرX؄$a8DlӚn3۠x0iMXz4-mD{~^$aCV97i"y,V~r;M(vdlq&k%`BH79V%!_@� =H5j[8g]�tҸq嗇oH X#a֎6Mp6Xc䶶?X0K6P%hX>k^ncԷ=A[(:v=CxK @G Fv;ݴaC 6ٵJi'YE;d `+T2M Ik{<H镑OZ&Rw}޹}(%B�Lz&S; &,p?c۶oիW<\ӱ75֎IM~='-ik:~Iݦ0S~I}cɨM ~Zm2jXLu A'Xe/d֦ & 66q& 16fNB ƏZӀ5$R)+ � � � � � � �K +ncسόƧ<Y&mᇔK6Wg4Y&scu0#SyJkm{ ^'۹d}Ry twJjO魭T)X۶% w}ﰾPc-xmH ;O曥#$7Ewܑl@�@�@ vI&by%KxAK-t(>)<BJr:#Rqs;`*`qb6]s0ژ= ,f͚eڵ\U9W.HN/E]N8A5 F҇}#� /ԊWr � � � �I"r4a@Z˖IU]qt1v:/٫utNbQQvƍڸVP.,Sv1+ѓuv.Tay{됽׻f|)u:`EHg=L&OVz/}/lY�J մtq؊1e9mnݤe6mLC�ҥRN'nMnpWK|=\)骫w]^#;f&!p9I6/Lu&Q='/u)p Ծ.΅:|@%OI'=:,I lԋ-d'!]ug$J@UViԨQ.8p= @^r6]WA=$d)A[&Xi2AA;Ƃ/)M>JFApsR.D(7CR6o,e݉:SRimk?/'*m–K' � � � � � � �Gؒ>O&ec/y A_'Y'o!mm} =J}rU-xw_euA}R?T)XI [._Z_; � � ] |U~}o k-w}իW{m`@Xv)7{y2eʨbŊQZnz3]%h-\x. �+uQr@�@�@�@ n~Uz?'HI\"'5l7 &;òNw*MM]Adl0K}렜b߻wXzMbԋ]lmz Z:Ig%w1RM—Y|4Ͻ,Z5{4`r&Mfl1wdbY L\Ϛw3Q{J�Ŀ):ԟn]/5܉T‡ 0iC-()l@--6A;(hkkN<Y[H鵅SR߷6QuA,ԣ\zx@i3G P6 J*޽{v �9Z!O)ę|ɢY[#hصvLx{n헴֦ɨ]ӿSUu[Ҷz[nص$u;&mcm]I3@~xyKwoΫ@�@�@�@�@�@�@�@�zhZǬR7} n?o_ˍ}XsYʞʨ s)v>O //n_ɓ @YAά@ lLvO?I3gJ̵n � � Iʕ%zy  X7[M0n,X[Pq{Wti(Q"]{7ڼxK@�@ 2I*O@�@�@�@�r*m4eD&{?VԲ\9oS&HQ=Zn´t]?^7O:Lqcw&N$\l&?֗_̑,8=/jTW�[׏|ն4tёˋ=#�d]Nŋ8)^ ^r�Ŏc,X}%F)e| bn-)q4uߞ魷ZO 56IPWzsի>+S!;@�TjY0-;IB� ؠ`=#g[%UZF^X5g;Y 3#%kԎYA@�@�@�@�@�@�@�uɓm('{=mi9G5KjZ: FRՎ!@ 8R u'HG5 � � @ *{Kƺ~mN< �M+N}@�@�@�@�\4}tRٲR~^6lƍ9KЄ{w[zi$.Z~FqY& 7(id ޻AC$=lpgO Li XpW^*U:ܐ@�"wC~�KmL+6ر҃Ad͞�Yҥ҉'5v, H ['Vrq:B!x&dZc @T8dɨdE& � ޿T@�@�@�@�@�@�@�H`i4i`ZQ11wfԴ~}bR"@&M7U'Vy � � @'K:Iwg=[ � lJW � � � �L]'vD~'֡C_~N.T*V,pki%ʕ̑j;Ϛpm"'{5iF/A…%`�[؊˒/`], ˥SO5#LScG<tU.@ ,W[om([Rʑsŋ5|1{C�P`&C3܄"� @vϓRwܑ'  � � � � � � � G6=Ne(5jHI;vc~! ObHPH;.XjwR@�@�H(擱} ISX@�DZyN@�@�@�@�[?(QGIK馛$GҵJK_s?^zu^2:%: itukII :u޽IU+?@[ѢCI J,}d}+2�7 hɅ"�%`FՓlZ.Niښ")py~IM۷G27@r \xttRvҕWJ7'g]UV>:vg%[;]kTv<m@�H`u@�@ eKڑ% � � � � � � � @^1>.ߊJj8m$r"e-), � � @< T7x\Rʆ� @ P+M# � � � IÆIK5kJ=wh[H?@B[<S3Gz}-mtJVKRҥJFE'dlzI&Hlp餓CYO>!V4�m8OD3gB�?rԷG̍ؾZf̐ϗ:KccdO_xA:U=oO}5 X@- \us1) *+UR �DE`b~'d$@�@�@�@�@�@�@�@ |S83k5)#͚%U&5myJԺPnV5f}ԭ* � � � J;3]@ >bP @�@�@�@�X 쳒M_4xPkL%<T^J|7m7VΕ7s}K }IvQ쮻ƑSzeiziRJyD:`Cw|s/ - @ rcJ~-Rˏ=g]|7km #o/]tu֬>:3Wэ\{Gzhc �6lʖM w@�@ K/_REZ?' � � � � � � � G6k֭`9,J;HMH-[s+�1=۟}??1,Y#� � �N`?M抴x U #�cHB�@�@�@�o;wJO ^T)WcH.DHk~M#VD(uxOW_-Oː9֨!!M(wС!H#GJ8C~i<�[ynO]Fe j߳]…Rě@֭1[ )!`r~Zz}ɾ,QvJLP릛nRʕջwDT @ dI � uݳt5xgݏ-@�@�@�@�@�@�@�@ nEڳGz*WnJsR_x.D[GVfq+F� � � `ժIKI_  �C AD/D�@�@�@�") IgKݺI~]z1?8uDHH"~0iuTL{QzMWsϕ;j?u^]]0AZNZ^ҩJ:J kW?QKRRѢWH{&jM(7 5YYa$DO*U)KA><>IH-v k's"2ƛ}].(H*T/,@�*aTlT$3@�Z` ܗk6T ]% � � � � � � � �XgF9$ OرuI_.=DrՏ ۶UX2֔:!� � �#pMRR~P)9%E�@ gʙB�@�@�@�F`o_bEӥ ~cm.Rɒ S} |ti~9sIGukiLϤِͥ͛LZ5?݋/JkJ6ߣFY-A?v̳Վ&M efIB�ȝ-^`_~n<;ӂ5h\P`jTs;OVϿXxK\믿Z@-- @ ,W.Y! � )0n?� o׿۷OjPh@�@�@�@�@�@�@�@5ݺ.(9Q ) V$ͅpIҌ;Hw!g� � � [C- #�  GB�@�@�@�H65k!CڵzIK/nE:ĮեiSB?0X<NH JI6HK!EOjUkW~ޟ>cm el~le!Æ- @ gKN*MFYPR/.gڵƏOSRQIɂV۱5HZIWcI)S< X@ǒI?k'$@�yZKek"� @&]rԩԥ4t1ioˣ � � � � � � � @uc%Js^NOHK7$B9D�bŤ ->� � � sc � @2 P+_]� � � �J`f'%JI<4: ,ը$_}&G{=/Pd28@:bgGKW_-7K+JcJ͚I%KkiAvȋwzI'5C�"!{tiI։Ǝ=79h,(=?C顇+y EJCmu:u L<jfoi{#v'nvUT)ފGy@�|#*W.T"� mwߕ;N#wG nx � � � � � � � WK#Gs/WEXaz&Lct$OIJb E{yI~[i\,>@�@�@�(ЧTԹgO3&+@�,@@( � � � ۷K/,sta-H*HSJ6cIe_K-ZHktP˔%͇,hj"^مJ ~zj4z,@rMJ#͜)i_3۵K} @˖ǏbM&1{^~X6%$ʫG9Uओ/5o~bErŃKUCI--dR2eԷo}=@� Nf � #_RnYgIK_}%qF"� � � � � � � � )u"l)ufI cs"L,]xcGRVJ!*yvtSOIE$D)$ � � /l<رҒ%ҰaJ#�jj"� � � @#Ա?WHwK>+m M i#*<uj7~05ޒ :7%JHo-nODgAH%P \k#MT)I3:Ģ4*=dAȦLE H,?^KI^X姴 Xɗ^^z)2c 2aK}&u y7 ع ZYF|}k<N88 Gi@�|&`8ϪNu@�P`4vm7W^:!d� � � � � � � �$AO?cyXP ܹwAB� ̞-ի'? !� � �Ŀˀ� @2 P+_U� � � �I)`t9.^wn +Lʪ{;{H~ӊO޺Ƣf z.LzX<*Pԡ3ʕҏ?W_V$ u]wɷmޓkvΝݥn+륳ϖ^GcZ;7K.}۲ys xw/IK&^=(qݶsTVwt'?|Mv �y,`*U㝲;@�X_kmJK|#o � � � � � � � @*%K }O9ECirY3@ {JX/:( � � @ z?ͱf< �&_U � � � �$b4pРaC?p<?D[*[6jv]VZثݻ'[J)׏( =}P(׻eQPAzcH/]++լ)tYm uk 'Y<dA,H @`_S:uGsJ+,6K>\f~YAgv@B� wg~1kGկg'Mnm5>\G?/ %A�|-fTb& �x֦~)cyޒ^zI*S @�@�@�@�@�@�@�@ ylWK',<iMjԤd*I 9 3ϔlIRɒˏ=#� � �DFx9iB}\+ � V@�@�@�HS:!tH'6m eˤ{VMIMߢtA ?uQ[oƍ/u ,ٱqt˗22ytY~- q;H[D q%#YqR(�X`sΑڶ/+ŸXdE bAzm̟ $UXgOKKJUHŊŇ.!C4`�U$@� TR̋A@�5z:u-eI � � � � � � � @ 3F*P jX>N=Uۜg!@6־^=1P6Δ� � � ~+@� !� � � �QغU;v?5Y (aܿv 'DPqݦMR˖~׶m E+NNWJӦIS%scA.]v4zo:u׸ukC@~&v:<];k]E @ Z:DixiD;<0" +'͙OTܼ4iR̊B$K}HKHŋ߹ФzUojS"un1o1s@� Y#U@�dwW/\( 9dz  � � � � � � �+`O`WqnIKgK+KMH} =/ j@�@�@ .{Թwo,KB ��֓!� � � �Yؽ[:URLڵFZ 瞓Zl"m9)͘!͚5Mg}v~YgRjL2f!<80'o֯^|jKQ;`aC[jEF>@L'S@ .{RKX"ŊI.u&]|4th C$W?'@33^,WjK|_~pOO< ,:! @۟J*E.� @< -v}㏥u㱴 @�@�@�@�@�@�@�Ƚ@($u8Gv=w~IRK'$h!}AV*!e5k" F^}U1$@�@�@�iƎ糰v @�d V@�@�@�B:~t9\i:Mb9E=zE:+ijw-_h"i&byl-[SNVH{;Mlr�?.-]O{%?oKI"pԧ[$^+V,O?%^)1 MsΑnAdM[aänzlBc^@wo믥F;{ك}.[~7].{W5n8A)& 6@ݒ"!� _f̐?^"]u|ԩdh � � � � � � � =fBu%k5s]/ka<gK'z�|+RzK c-G�@�@�Xn]鮻T @ _ P+_T@�@�@�b%7ҝwJUHMA,(jdk^zi7o"Mtsg?9i:ѫdۏ?ʖ'l&`uu̷7lU wtiA曥7;FX@CKB�MN{qҒ%StرR۶_el� T,OHO=%YgD MJ~+;5c_כ]`z衇b_J� ""q 7@�XovV$+ᇥ%T @�@�@�@�@�@�@�p_;U뤓\tR IK\#]r4fLOH%u?oǥJ_.}TN� � � T6ץإd9@�Htj%+H@�@�@�@ n֮X֮wشΚ&viʔ4hF . n͂}+kI9O6M~-͢WJ3guЖ l&ʔ.P9W?FH'{% o'P g) WwK&qՎCO=5~U%s jU֔z!n$ ]tiK۶Ŧ,{ jԈN~{ws3S}zN<�B`r|yxXN �DG`z{wB~\ESJիG'rA�@�@�@�@�@�@�@�b-`*Tv\ VV^ocl<g X,[қoʍ%8�@�@�@�d�cJ,쵥~ �AZU � � � 5?ƌ $U$ "5l(͞-Y#=tq~q^|ExեK13zI-[%ݵkf̘6msEي peIEũ,x1q4iԴ4kt~- K7g71{}{rK̊@ @V5:/KJE<[2HO>L*RGIR1@y6;5@G%Y:Vi\5γ$@�X`"qP@�<OB# ,=}}/V4v� � � � � � � �ĵsɍ}O7jխ[7o0|m[(#wʕ/ڵQ@�@�@� X;~|~� @$I]� � � �B`Nid?LRR2kIKO=)P_iӦSN[շoo͜)!}Թ~lB@Ibz`Auiq<NJh=x<˂hYps.-ߏ6ŶÆIs b[rG�^gկ/d^}u_xRҸq_gj@JZζ\#WKA~bttkf9rd,A �,_N@thx@ o ?t=Kڏ Rt@�@�@�@�@�@�@�Ȯ7pE,^^&oos84|ԵgO'�}lM{O:}6 � � @>ӥ JSM@�`8jRT @�@�@�"-wdBAr}|RڰAzs…[>H۷Wǎw|ʕr&҅J޻/U*U?S e k8/Ge~w\6oLZ?eJu�&M6nn5N>Y:iKn @$lݥK/,H'HժE2Gŋ0oI"y'5~s #\W>= X@- t; @Zݨr#!�ĝeԊ!�X`.Ǥ'f6QK߾RѢ9-OD�@�@�@�@�@�@�@�VW/T)ŋt:#>,W'Lwع3!oG駥u, Q@�@�@� cJnK=Dt&7@�RZyɾ@�@�@�@ -;U h!-YOvRNR3,qOh׮:,=: SRſPM6~toc qP8-B(-5YG&-\(ҙg^,ز60W_VKk�$J Y^{M5J*R$E@<n8xa(B XKNkK:IW|VM~]@]n&]sX-9NL"�!e/JWR"�d${dst-EH 2z.C�@�@�@�@�@�@�@�U`$zYZKF^6w>_llX^jVo;..J@�@�@�,РԷtmQΜ@�#j$A�@�@�@�XJ>fM_trMae^+Wzׯ^zIEz']2dرC<ڻ/"qbBW\O>eT辙ZbEԊnHs[Xݳ3gJ~*~qcV.{y;}i<%ιCJ1lq_vT۳˒u侎]CisyOssHFB� +pt6J:$a1C;WjD¹M#G_:uhܸq9SO=Uǻ]pN?:gNH'!Mҥ_ZCxH]cv GMrzT~Q_[#~7sj׻E� eWrzMXu@l̙ ݢc=66H'אHg.2$r!`aN:l]6uנk=5OE�@�@�@�@�@�@�@�ZZ]-,v2V4ƖnٲEc�Ν;kɲGL6ilAI7G47,XDUJ-`_ҷJ~(=Tprי!� � �dO{S{fַs$kȖ @< P+_ʆ� � � �1شIzqqc騣G;Ο/X^&j_ԪU+y䑚"G)R$ͧڤdڴiڳgOՃGmCnĉ>j1"荛WdsmpGST)5j?}4bĈ4h*ˮMn?$�}n쥲H<H:gjذa\F`֩JigI..O]W^.F{ޒj^_"h}]Y 3<}ojժ$`!$֭w{URؔ\ 6@..N<?M?weѮ6PkC}k#\vl.4v$`A_?FBsrA⢔ylAfWl۶-VEB_flo3vLk72؂< 8# @V,VBR*9?v 'q,:F zqhN{9- "Ew^}W.8bmCv=jUwouki 'Ҿ= � � � � � � � 7(4t_ӷtRխ[7Ϫ鱥V?͵nV7b7ηz>6nlڵ/P" 1G6޷o/ٸ%KyQG% � � @vlK7 L>ztvpsH@�@�@�s]/$mnן҂[')|rKfG,o:(ݝԯ__:tPYm]E+WM>@? L#)] ,x4۷oɓo?Ν;&?C\GD11C 濞 _#P׳%ebIYIxm"a?}g>^ޫ?lؽ4a=ݲA% )&nTe]C=TݺuSfdI }E$w'̃CWN|TX��@�IDAT:tgr^#8 ?h]LKRNlic䥀bzj{2e mVEٳgfOoq,^G;Yή]_@ _倜gqlNle6]Zh={x;v p׮Cpя,@~ѝ<\~,ᒝ#ɂBHb @@�@�@�@�@�@�@�@�lL /}*J:6Eʣ鱥sllA\nok˻ xq> -_\oX<ܫ즳PZ̙ҴiM~@�@�@ 6?L>rҥS?sE� IF@GR}#� � � @ ;g)[V. I?/m uip]. \eA{=/�If(u:݌f]tq-_|M]m*++6nݪ9sM6ioG`] 鼝1\paoEE@-~pfNx<y]_]o *m96Β T/ŪkS'pXn.Ɠn֮z6Mv)x_뼬Wl-Hv;g�i X; Hz~A$!M ~~g)kmTJUPAwʕ+<LŊ6RNlicDB3o.oCsN΃f|/O `ύ]bPkĈZoڹ A@�^{~m~]{2;i7 F y睚5kw cR.o%bF CwSJ*In$f~A5JNO � � � � � � � @زE]R�i*RjԨ<'xΓٳGO?;}wD.=:?\C֧izk߰xcJ"y??ǹJZc>;kD@�@�@�)`cl6-s �(@�@�@�HO?\? T)Z~g3f;ծ][\pZl`ֹqѣ;8ut=2?m߾]<͛B I,d.Y@4eٲE_o &+;v쨿K2M|ǪhѢYyzٹS"ڵKz{9/(e]MUw&?EK{nܸQ>u:E0WviW_}U5k|ǒ}]\e2x"2|;$}d{5tP,Z/w=9l0w!]I$噀,-, b͞-'!}dݚ6MؼT /#m/吏z z>u?FB�`*o4i?iwɈN@jk ZpK rUt-ӿo"Y;ꫯˇ.ے&~뭷kyԩS*_]N? eق<#9r^;/xn]r XܱT>*9EɨMrJ~^@Uܭ[þvs3qD/.X.PT;gnz衇w^;olhZ]s rGgϞ^۷~y n>Ο~q8s-^ R^ ?)U.y~tw{@�Z`"<RgzǮKI@f%l0Ѓvѥ.ڼw_ίرc{騣r^`S;nР.GիNnS 1vMp;ynmނ ~M6;N6Xܮow7ϙgѻV+SvȍGM$]w\=;⾒@�@�@�@�@�@�@�Cnk,N.\ݔ/dyߴi7wBx.UdIM>ݫIu:i CHo-j2O<1e Kous8�onI'oʫ1OF}2f%VusciI۟׃@�@�@�D1AnXSn9۞si @$b"c � � � @e҄ ~ -77 r$Jne 6Ml&(~饗t 'ujժ>#r):|X]fO(R6)"$Շv 0IׯW6mԺEK;w7޷~M=yd/. hY sMm h뉻yf.\؛[ol7>Kϯ3-Zh֭^6Q7xgie~,nf+xd&q9x]wyMoyVm+Oeu,ky<?ܱΘv̂Y<<ϗ}v~7(ʸx >_ꢜX:gew՗_~~˞[gU>~- 5~- esw}\榛o6iXCy'Q6uڷ _|~w=fдaI yS"7Mf,7R$"`j`67:uLzqmm6 ۂ[!CxmkY`m۶y@- em۶)Adԝ` E~t3D[-X eM&`ǰ{NExa; $"d֦�T@:3ZC^1siZ[>k 69 k3޽wĎ9-? $~{YfyL,/ ^lAl_W\[x6 2jev. Gn.~ R W)Ϸ@GB�o ysE(yw>cWt/co7{wmh(Ey]jbk-̎SkoذA6yhyʀ]C.]; فK݉u R|r/^ւu2:O]WoIhkX\bj1]cﺟ{k@�@�@�@�@�@�@�@�CrcA?n^˖-UAH+V/7㧭_ 5J`ersI]lzժUce'7Ƨr9ac+jEF}2^OnGW u}>\.]t@n � � �#p7˝oϝΑۇ; �pI � j3BgAa(B  )dg &̟o fSuBN8?:PC svڐ`:t=| ~{,ԫW/;rl3sL.t1DŽvrnbm>c- !7{6ѣ]}nn~[\pЦMB.L/enA=nud4&NL?(+tʗ/4h;:ۆ\ xND^Ǝ=??uayYʎmNۗ~9 , u ޝ5>_7 {J]ٮwGzs9'E￐WEHrei_5vBwق%{ɒ%{~oMY0�3τBEav|KB XӦP⡐$ !4k^yos=t*QD)M+GSWp{Σ>9\0-oy xpP!wL =x(woJ6Sv{uY){lvð޹ *%Ϡ.^cwSO>+CիN/Oٹ sycP}]E5=CB  ~s:uqj%#k֨u + ]O-[Q͛prB%KL݄+V &qʄ㏔< 8=zz衡fܹ!ֻcs#\+ԼnPhܸPh׮G�@�@�HPƫ$ G@�@�@�@�|,}{! m_?o}uZGO>~Y暠);Xp2Æ#[Y6f7,+9 \v&r%XX93kRtl>BPwtS@�@�@�T_U )#rĞ� @2Ois~B @�@�@�H*{N: BNi 駟aäsW &h֭j۶mʎr&PZ 븨+lӤI/^\+V_mwGZj)۸ίm7ٞ?~\ )ΈrG:t)];og8 ҉'(̻&֑jԥԽt%iu駟V ~z}ކnAr4eرC'|>;qz{_{5omAF[l믿ɓ'^{ } ޾ի_꾽o)M${)WϞ=e_~Y.Y\}RWMl)YŊ f{ބQ(ZTj\8P3Gi,cGij}U}4|4fwNd oQ.}=C{<o }FF";SNR׮ 7H3g@| )#ԡԾ\C'{eu7IybQ!wcMyf͚r)Ny,7m;<a.k{;j8-m(*)%D(P,YlS; JD-R9m4w;y̙3<=sHf;%vb8BZ0:XR6<f͚e#؊KbՆa3ϹDyٳɓ'{˳+#F-[6gzOٲekqIoYFO[@'ȵ]a|m8p2-t̎�̙.lWhǮo"ם4wy^*8^YjhǨ=NX;g}6kv,m=7s]y"ڛpvaׯ7~̃S/6bxvyT)%[*]:6 #� � � � � � � � 4.̀<m\O<MqAIAh7omObCꫥϖ?wz OC*Wv}w1VZ_`R&rkȍW� � � @L\Ӄ }PF6$2 O{@ pW  � � � 6IYe魷khØ5DzXb++Wζ-vݧ+2+t0S)}v&?/6m/{AG~ܹ..1cFŸgJ*yo?uŋOcLg!9/_ hɒ,`s xyyx㍺+61{su(}Påw=HN%:bXxG^!TVK>dA-I\p.r>'V~ڷofқo]6Y_~;hh޽cXA.#%7䌖;Ԁ'|߭"#�,%%Z?Ĕ]NK}T8O9ڿ!yVߒ۠/$G{ /lܢ(-l}xE<Rw!z?sn0�h%?/8WVӆ>gC,Ѷw'w}Mwn%!O^^_{lu6lX2GyDzR~"Yva Ql0A2_{X%@�%)965biQc#hg ?ћsgǚv<f%h'Xz6)kV9u\cv'watرu4?]GkW]u{1ﱷt]Hϸ$'xw}X&'~[OGiH/) � � � � � � � �0�}1"sL7z A>DA?Չ?:Dmqj֬J<U|s[D.?c֭?V oX~]/V1W`ˠWА!r%q5]'KG�@�@�LCcRXcCFΰ @q P8Y7 � � �Ib5OheNa=uUuEL2$KcA謌pټ.R 8L `l2Y'=,Կ`d\_(l.e-vbɯ֭[kܸq9-Z xɛɳ>Fy|g '.ǘJ.)[r?p: [`ի{5:u9眬5j&˰JnAR1KlY6l%lzm>Kt)D.:ch',Z'k$:G=߿9׮]uɶڽ}'T"KGINkIf]}ñu6% VK-۰a'U?sR١C/mu]%6xeKIA�Xϗ6֍rY 8<?l)wL@vꮻ҃>CźΉXGKbw%k#yii}g~ΩߕՆQ~ٷ{l(: +^�Kvnn*$k˖-˶{_Kp;5k.r ~<L/qp^[[d7Œ@[$UID]Y 6KզMI-^\[?ڏGDIık"Y<E %J%r.~Yh)qN'|RӧO׭ުI&ֽ]li';޶\w "s}4NzjyWĵժA.Pub D�@�@�@�@�@�@�@�R\`fO?΁,RKoIw}?CP]~իW{}O,%rÕZ<"M*jn}, -ND"XXscE-?EkwX<knA_ɛ@�@�@�UƢƎU1~.X" @š ވ� � � �$T`l?@tz~bO?/]'>bLezs?o:Kݻwך5kd[7o3yd>3Equ1x⭣% uHuV>X΀,b?K/x6-fn7 (mo?}嗲ΪAzٹҦM`RM‰%m:Z]˗/5=?3\0Y [=Pf<m4hei+]o1wK} b-աUV3} U5|" xWP{Zb.]trx8 ?^7J~'l.VK(P_ P*͛:.lzzly�p9Vek =$*%*~˳N;[%_,<3{C!J: Q-ނ@JnKC mbZv5sj9i Rjϲ,%%'>Z4SN.ƒ[]]$xK~.fvn\t"[%"$ {W[@�) 7y_ݨ >8vM:i˺@I+Xڮv,m}O,S- %<xk^].c+W_}kv y~駟~wڵC&6cmt2Er,=K?;r%Ko&V|DT@�@�@�@�@�@�@�RT; o֯}d�d?_zutI5kׯ(2[dc uLJβc. g̺J19 !x >]_/hAJ2KD@�@�@�H7W; ~2Ej@ .3@�@-3B(GIPS!CBcHbN/#E . +w_i=BCٳg\P:u,U^zRJyk׮rIJz!:蠃B.i7%"r-s[ p8qbu V4*4~KP7裏=c /0dYlYl=KvmYuB5j]6kZ,:/W^޶,Y2tg\?o[kfꫯf-VZc7|s UW]܂>pCj ]r%}koéBeˆBGoW&MB.J˾p@{ ކ\7)I)iuyM n=:Ph&z<o ۶%~þܹ۬s +k"@PKB-[B JHJ͛C/+/4y7.Ըqco6c{/m.a7%͚<>|Z^Jp "9tز%P\PCYoU~Ω]iohѢE?ΗGMsijMzN;4oZ~0֯_Xbh= $r?o=A{JV܃_{w燪VZr%^ h<c^Scܬ6lСC@�*`6̙駟ޜJ+9)1 Tεw%?w .kSm6mԛ85c]gذaY뎻'k,￿7… 8㌐K5KzڵgI%5ׄyR]#cLTU2 � � �D`JT&"� � � �$7߄Beʄ\+fco;RЎ;[,+ !!߇B+~VOLhc,ly O?nyYu P1Zx}xF$yIkwk U � � � CʕC+BX?U @ s|xX.$@�AdSp57T&RWRS"=D(t!.R%PhʔPhߦ]f͚y%ұie̘1.fuD |ԶWhYD-0%*z2vuWC%xQA@wi KlY2 k#Sp:(~+r~)nݺyN;fo -9Q^;3C={͙3'k5s9!Ke�o߾ 6d-3e1%gim߶@VZyy׻}'[yK~$׊F']{lӡ;;җ/DY3\> {˩6իWdxzI$;P \.LA�" X h-Cq8$+Rx392rmk7nwhRvoW{=[ {J·,-ϒ :4|q<F 7 99ͼ~yFݺuC<wn.w lC= 6 o,I% >#VFjk߰zYk\xKUR%/_cWk V%!`?F)Vv=T5D@� <|l gؕ㜄@,VfBy]1»dלlס]؎Wumʦqnnǩ=v|l ?袋SNi҇3fx 츺k׮^;v6mZ{s:ϚI#`y':ᄐBk֐K<4U" � � �)x<@�@�@�@+qNeݺu^޽{57~~ `c,^B#.AN~IP֡ŲJ^}"X̞=;tfS߰]zv%[1?G P1~7"Z߰>NŸ]}!W/ƃnٱXRv$Ԋ#@�@�@�REh.]Fbs1~.U>]�$Z*@�[`ji]>ڵ+ڰX <4hϱ\*J%t޿~7":%4b4nR.gH'.<۲pBiF�Q+!Z.v󹎆rU~}dNrA:fϚql gO/^,^5j(Ļs˘1҉'Jo>K%L7|\k~ oVcjra!E[LZ|4i"+|P p G.ydۿ\v~N%~|ԺWR_W/<4�۷oի;3׬YL .`WnM8PSzIc/w *gK',w#t!Rs@ )=4`\4|Բ=yS۹۹MAoچaV^fUV-m vhֆl kqSOI{ǏID]8KC�9ȵG>nFo3SRSfguώ]J*ޠF7۱Ub<P[\9_*SLY f(ʕҰaСrGHjK*Ңy3 � � � `JY! � � � @NKiӜ< 26.v)9~޶U\&+sJ#קJz}V-yYO1uVԾko Y2U>_uv߬4dHW� � � &cޏW0~. lS ͖MBx |@�)M>Rp6p*;_@ Xp $Z&M:(QkWGɇE#;\g)h5?(ש;K<yK0NSÆ 6Kq{>Z=D")qM-@nw}, ǖ`kTpɨA-0r&R@ C\N/Ɇ S.(wԙ�c+ fiõmGwϴkx_|1>+a �qgɮq4vXuKxY(@xB.!/PHv'ƌyԷԸqr@�@�@��Uo@�@�@�@� /p~ҵJ7ݔrq]7,:k3j~Q:X7 $lլ(O.P[ꫥ%' sV � � @,ѨQҜ9R^G�2O ,|@�@�@�@ '/hYJ$rԽTfN*鿹:tЊ+\bXC9Du)C~-VJ4sLVw'ܧzKCO䓥?N8a<>U"Kؿ!G]w=U)ߪkr5ZlyGڰO i-_q* l,_}%ri~QKvs%H#GJ\܉}vm7/iM|Hlh l޼ {WlK/{{v[ 6c9HZ%Ӳs =Xʛ@�G,ϝ+n?h6lh# 8>. k-~k_.$i ,>MITg~Z$mH-j"@�@�@�@�@�@�@�@ B!Ͽ7WsӵQ*QcK6VZGޟe&ѱcG/_>7l}ēOJG!}Ըq@�@�@�ҥKuKR.UWti0ϥGɆ @ P+>0� � � @ ,\L1^R߾g7p6''pfϞ-.բf9FR$SbD^}Ui] K→[n{c̽e)RVӂ~IMt׉Į<k+fz,?q\~5kVg- I>w@T/i.kT  mIyVBBoݼ (]KT\s;_w'l(tS-j~xߺ9D<e .;.3o*U[-C�H"` .)P8>N*Esׯދ˲azntؔwQcIƍ\N`_o'YRtT@�@�@�@�@�@�@�H੧ɓO?\w<%Ԛ?>J eʔQժjՙZO]}u֝jk;w5jj.n* &]\l O/*r@�@�@�rQ}tVڰr5_`\Fl<� U#� � � )?,Y%KeC]w{N.yNj)N6mZjU:]Fb?hQG||M;FQZ`ZKuCqDT%fِpq]o7bPkԩnZ/_Au4Ҏ;6vi2rF:j^X @ dчKh"~?"N%>Q@W\q,1L'꯿ГOS^1] C�sO+4i,ɫ% o|͘1 >q\2E8K~K,q .Pǎ) �)!` 6Uk Ca�I+мGjL2$iH\�+v}}\]餓$ۇ� � � � � � � � %_rCbԲeVoFJ@Ν]܈ܹ~l^kNZ VfOƑ<z"[l#@�@�@�([kyMtL79svЮf1 �)*@6 � � �.~@: ֮-]w w%(L+͓~L\9{6!,_:?vrP4E3&R|y4z쩛o}G$3n:XB'N}:ܷnsG#]%Z*jG.pCgm֭+KC� ,[&m'uGt]$ӊ.KJUw%^~I|D5W77Q޷% @|ڵk>WJjБGnvIKLY˝~K-tgv<xpW@�&DZM"@� ]+|g坷ܵ[7i%ae � � � � � � � ~5jH￿>35mZō=D]|Ö XJ:,W ~B-B2D@�@�@0jo5k&kӦկ_a{@�� bo@�@�@�Xy;r}Kg' xy:=ԡ ~  츣4}zo|[2U [>  Zn(vQ}۷KLxz-.FޞvCuC{.}WNНw6rI_|!xHI\JrerkNJJQHਣ_߸Uzfo-JJRLdɒӧϟ.@ \ZiԨjLd ;%.s{_jN) �))`5}&nէ �qغOճTteRz4k+qc8W#� � � � � � � �DDKo- *ק;,LLA.CڤIkں8+ =H nU.͛Fx&ȍ+R@�@�@� -I6izg˅^oD�@ f$Ԋ% B�@�@�@ s>Xb 'HK%VK"!Sd–]:O 6Ww׫vUW}yf~#OkR@JժIcD৥JrtWꩧԌiZnK3%zFC+W.o%!V?8Vx!裥m-Y԰!, MtҺk]RuqhNjܸ`N.) 7;w}6mwǖiӱU:m<yd>eUi5Y @b?v^ֆ� sHKuʵHKm?$Y c@�@�@�@�@�@�@�@xV.TË5~ʕѣtMJ.t3.o,9-Ə_6 iŦ � � �*гgO7ƩtDk6H&gAM@�@�@�H)u Ҟ{J&rS]7 USjl\{m"w_["p=-Ej0}(s1 찃tşP+PZl.Bqj„rwGjJ\YI>ol^C� l(?-H"%C`w;D~þyO7F^F�" ԫWO/Lwunl_H{FoQEgܛ'M}5i^ԵkWg#�&Rrt[��@�IDATel @A,Y˙-MQ%77O6M]De.@�@�@�@�@�@�@�@�!p%xͻYf 8KU4KBdHsΝc5̑lN;%K  � � �9Zd鳬  �@Z1@d � � �d~¤4yF:髯o^r1)&` Ԟ|RzJ x67!% X6hߟL:4oQԬԯ\"i*w$KKQ~Ji ,Y';V.)tu^c@ ttVZvڬ6mŋthv?\O?=7ᎁrI}q'mkc=d~ڮ]l}gTRzꩧb`� P,P먣eլ@ ֯F;N.\ysiDۤ T@�@�@�@�@�@�@�@ K`'hf޽MJt1'/֖-ilT~UR ҥ ~ ~.@�@�@�Hb%K꥗FOU['iԨI\[� $JOC�@�@�@kJÆԑ,%Ԛ0AN^*jx{ l$wg:̙TlSdpHE �#,ArD]'OXOغT;O>6oN-J-[ f kE ʔ):X__%V^{--@ J߳:K 5\ҥ}Ԡ/M$+'jz<.89v  @J l෹}tJoG�(ԫTr5{|~Zj޿QE3; � � � � � � � @,…J{K;ye,>iZ_KSq?cm$vt|>{!aCyckyD+?K@�@�@�H@ \̵1n "7~%ke �l/@BM� � � @ ҩJ5k 8*U^~5ttRIZ2rҏ?J=�$@i ZUQ}_JZYE X-Kb・ .;n\)}tR*K':X;iH^�&'uSi=@ oR)H_,9++;i@ljh%:?0|̙3uj: �ށ� tSH61x>>*�A &O)ժ%p5.ɮX!#u'Y$ � � � � � � � @Rb@2uѬYSն!#ռ k;Vw_kΓϗs@ � � @f 4h@/<! � P .tV� � � @2 XP>;qY-KҐ!ҪUҫJ',-Ndj[f_…~o#k<C ^իqIFI ]:tᏂ@9F8߸tȑ~0ϹsK`'=Ԧd5Uԩ~�b6G )6lK0"B.?QN;%Eըi#Pҋ/J?/n>J dCHbu6.45nεzCĵլOw},]ج{ѣZ_}lR@�]ڗ4vۭثB@�$WN㏥i*'UX@�@�@�@�@�@�@�@� |~*Ubh"˗w(^Yg]yzq7觟B)R{Y31՝; ?.EY*E�@�@�@ N<(]p[];ٲ*i|v� @H3J� � � @j ̚%]s##3K sΑ*VLmֱ7[7ys?JT ^SG 1eʔз>ѨQ-`d·Ԅd%$eKI6GK>(Y'ڶlut뭒%aKν{~p5@ v^bK-Z ~, zz*]m]ziC7wz8f`g<Ih?_P!6_|ָL]/Q@�BjY[ [` ɒ' o{nKɽ-.1gK7෫[{kI{K|#ٵ[ kA�@�@�@�@�@�@�@�(7Jcf˓ON=5k<,?|=j\|nn|ņBȠ1u)S_ 6@�@�@�0X]~O.I?Oz`  �^;7e � � �$%ҝwJ͚I^yE:Li髯D�k'fP wŠ}?,Jc#T)u"hw޹%Q8>Z =D׎@~pi -@s矗~QZ@2DㅡCv[G)YIbH`dn+`!:HڼYEO?k\ ?>Odsyf[@J( {s>xKz6l .x]PחKQï]s%,1%<_9rKp;o@WP?G�U`j?G'k ]J7J呵[-[Nwqi}' (?ΝK.5mi*l/ � � � � � � � Gi ll#6Q \sMx׏lpM"J~oE&&\#5j$}4zM2C�@�@�@ aÆ59K//|dq{/a`E �(@B d@�@�@�HA}-Ŵi?HL:7KeAǟפW:0ek_:å+_̙ҾnľLA w2e$lI(%3G ӎ%}T[W.ԾdނN_R_'Zv<d#3-@ Iv~b%fPWR[`wְa\ƹ.xzSԼ80-[THתT>%ٴyWJOev.?@ m~[XKFNA�o?ircR~�sWKhz@I驧cQY;}IZ65 � � � � � � � @ |*5l(r~<5]+I'ӌUzuT+=nc&>Z:\)OTƀ ,ٸiIW[$0B�@�@�@*U㘎'8 Aۇ{Y**@�2BdFl%� � � @ l(ԥTd|ԑzKZBzC3η֭f߲E%9@q X2O?|4{㎓-nt!PPK5eJAߕ9[γϖyFZXZH.dӟ}m-M7I&HvBA ,QE%W8ɩ)Rt8$?VZ- $Na:z/\q^"cXg޽TZ%JFw|ꩧQFn�IA�H+7G8LIc>ju2;]sfiSɒh=Զ4id߮v~Jl! � � � � � � � 'oa֮Ԩ!{ln5@ p'Z?Ə׵iԹWW\t2b 7}rJK},@�@�@�t/<O[rٶuKl<x� [j֓!� � � PҙgJQ3$ ?lj4rtt***0}z Ar\gó'1 D Xr7K瞒%z]icG_Z<WI7 i1.M-ԫ 'ZDzIiG%Y-sF}6>aF`c瞓l0ˠAKf , #ĉw0K= PX^З_W˻1ܹٗfǂ 嗥!CϪVcgN:TbNsl? /tɠWTlg`  @ @ns) TS89w?:S[%  5n,dחMۂ'ـG񯍖,I@�@�@�@�@�@�@�@�@Jm^-5j$ 5!ԪUYxOvN8AzEG܄`(QB>cJ ?GHKw!K@�@�@�Hv?6xLn- @�x07,@�@�@�bsˤڵŷ.X!'%/_ c)-q9ou `qt+2Xv#PkW?%֚3g[gv\|r hJ*S^d;[х d')[mJǏ֯p46?f͒Z䓓zTsn[Dž� NJ3fH-5o.}^qŶT~g \VUʶs۹%HGJϟtǞsY;yիW/y@ %ڻtISi2R`=Lݎ}wۋ3' 7N&]y| vNC%&V~$@�@�@�@�@�@�@�hߗ6oޞ`c߾RҢEÔDln.@OzM X ŋ3(ٶ~dt,5h ͞- hIR@�@�@�A[L%K{D{/r*@�@, � � � @q̟/ $5j$YKuEMS?x﮻GXg|Ѷ:zV?hs0 X£gZ,uX=o#GSG ;(hAB>g:~ϡC eMH/,{dI=TzL^E ^ӵ$5\(Μ)qtqUWI6u "~~7Kv;ӷO:Iׂ,9Z5z{%c?X~k_ N:ṁ� BcH$ժB 3ό<1.%s`H̦vm`ر~4K�lKHm � � � � � � � �~'mSLo H[T?>bZRn+t%^૯v$/n^{M1@�@�@�Y%eo~-  � Vax � � �$jC\:x?ܹM7I{ULci'`-tbɴח>FiOJӦEnn.\Z8j:S]MiTߊ䬿,= yxW(`/ɹ-*}l~>}�<�-` -OBA� X{Y;jɎGZZ#y[jZ5Uv0j?2٧z2mV "@�B~ zKAH-nZ[%rJ"ޯdZwISo1 � � � � � � � @A&O=&H\RХ3&{<6biȐLHm1eݻK-ZI>@[VY_j� � � @ z7~꒹d48 FA�@ zU,@�@�@�6l;XT‚{=LNp>~PeˤZ,R,% ,d|T^<G~/~@Ĝ 9su뢿 춛ԳłX 5o.Ա?^{4n bϒL`F?wH%�EA�8L?u:@iԩ;5E ]*UFKeo[%ZB-k+6 ^zdc[\"*[TD �ҪU$@* Ԭ@ҥRq2?$=tRj~ҥM7IK_|7i>l5 � � � � � � � &<ft4{ߏ(ÆIW_`֭-HkSOER> ߯*YޣJY � � �%`cƏ cRF&NLfk@�C!9P @�@�@� X۷o6vf魷^*{T\]?3H#YgL :uqbWx@ XNsqn~!x ,0%e� Ԫ=wA1Bj?^I\?ֲo�~B6Kֶ[@z4l(}tNJWǶW5co&Lyd}j5ě6j~x˪^z~| �)&kRRӦ)Vq�@!gƳ69Dm7˥2eۖ-Mc;5B�@�@�@�@�@�@�@�HK'((?Rid6R!W\|-ƍ=DNy<.ǃ6n,M" '5kc � � �dY,?*U>IY&  � VEY � � �Q&N_{i"ϣ&Y S /;Wxd_ZRzM[7iRiYbbF|<G M3ϫ\vY^s:,>,t%^F GߪUQƍ:w,A˖UWIcJz1mGz@@ @~m;/9Sw_w3/O%_u<T+|z?@i==Z9)|nfw}.ȿOA�HKc=zQd)H%zZש#jRivojOv;x75k_:KV-6"� � � � � � � �I,X}668\_ogY{HX2+;GM+8XJ|/6Ə\;w}�v� � � @X,o9Y67  �Ų,@�@�@�zH:h?[KKmI,KUd]ؼ_u,SFzkf@ڵ}WGim%ײow-xW X¦cfI2lJ&=7Kк{R.~-cH 5$`ߙ|ԠA2Վ @Ql5K:AR7u [']rJ^ n,QA^ɷYR[2>˖-駟nݺ9FA�H9I$oOSaWv:c3τ&Y}wHgO?I֑GmwT駟ۆ-@�@�@�@�@�@�@�@�p)SŸɳK9S: h"]z76rK0(O>w-nv7OӇxEq � � �&PGusY+voj) �R � � � @<[XnV,AKKH#5o.5k&Խ{ln]=E8_%#|\SHvڵ')Yb›m@/'}&ԏZ)Wf=dU?,? Npt Vעo~ɢ/%$R n۷O"@ 1v^cGKFI;Y7kA lP9q%opGj>o 6g?\ٯ%qwkDZժUSO=71 @ _j$e7#[`&vy ޾dmg%^- $-\(}5  � � � � � � � �9 Xp=zH_~{Ne:WK?`g#edOd&xBZ(<.ʕWH{]^iưׅ]>C�@�@�@�,mII* bQ@� LA�@�@�@ o]v7f6lؠK[\ϭ\n%\ 3[)gw̺N)kirt-auβ`ާ*=tD{2[ =Dϼ2XF*c-zMjܸ{NŵۣJ#GJ?.}ւ_Ο/ &`}E kou.r/Wv6R|ZI7'huk.WOoN;<Y#"Yo?];UO_K~.SF~ߙ~;ҙgJoH9,"^Y[pm-~"moo +`_;H/P;㥹s%[Y"ڶN<1ڹk}p4{s3; }XKfv us\+s&mڔuW3<ϳM;mY\;[?U{aʖ-AHMư ]c2Y׾2 muk5\@Rޱ߅w7|ލq\wooKv[X.9tq5E_K@�@�@�@�@�@�@�@�Hm}z֭[qO<ۼև'~owe=/}#R߾ 4k& *}HWqDPo|/{j\Dzs>"|D`D丆hclx nVe|[3REN?C퓢> � � �(n6k`]*UG<SJ_X_AA]~s6 { 82-Ca7k=fR@�C%GU �-`-͔N3gؒ ߄7j֬Y=i3apo,XxV`- Yx'Ɗ.;Uʕ[}ս2mԥ\MK}w#u0>SK.>܂u cbGnu%vHЮ"}qwζ>YR}1$/VsQl_ P\_MV>[R{YW\H\k׮dׯ϶/E,va:$a371`_}E'`WO,',RxW $ؚ4I.Ɂ]plBlY֜ fp?8Z¹dz9=i˦C7Cr~!`_ctAsIgƶR+iyo֬ `ul^Z{_mWcл;[%ͲY֦"5w{:fvf$ٲ`PjNv^hm4vyo,C!`A �%nĒKJg�qep]v~ɻ.\qkF}nv vMu{I6 굝е'К0oom\:xvr ^<oD�@�@�@�`J }XT@�@�@�C,Z_YjUֽ= ģϸ˶֗b=4s懮Zu>RU5jPZT^=ﯶt7e;ka%a},ԩ5]L{?m/vA[<ZۖU?>p``lB/d%g6xve鮻aUksϕ{Q%HCDs@�@�@�x XL; q,6C!xۺl yVܒdvow'j*wKb Zvomx9=k[ nσvo XJRs9>}'VdY. �`)4;RÊSUy/M>k˗/nq[?uǢdɥ#RpئYUkD قǑmYv`lPju4':Y2lQ!ծ.e͚5nֱ:5mw::6<ԯε8^O댼ݳ/WXm? YbbS:Zw~>jE~EsէFo/va{ HY őh+:ˇ+W̶/4Ӿۊ~lKpW}2w^s}.P[fj=ڴ/0] /Vlb~h-ph,%@FR-dγp?2O|ng6lY2t](̘'cɚ㎓-ٜ?D?u\b'7dN?D~_x�#0{tr}US֊@A!s;y6`|ɞ%JTuO?ĝ/O'KgK,d*ӡǂNJ۹Qn7Dl"o6JSuڹip>yt(X-jc{-F> 2q͗>ڄ-#Z>9}~@�_d0(;ww[N,y֏?uo>AFdU܎w$WP82m„{k?q\-`7;@) NWN/Vp{5L[]K'hQ kmsZ:j@�@�@�@ VW$A�@�@�@�#`ɰ[}7Zp~/[?X`7lyMD[OvpӶ>EV'y>>6XQ=A| ^n]Yߝ{{キ5k=>ŏn6~>He‹}?l}]!n{ww?~XV D0"ܾc"yl,Anc76f!|=->~}ƢQ\8% K>o1_bظfc‹b^H>#_:l s8$Ԋ&B�@�@�t8�ASplǑˢ=sm/ί|lsJd -hk>>m=\l:昭YlhZn kA}fϣ=iq }ѦEƂyxJDhVǼJtX;ip8fmڤ"4ͼys|m[* Y@�bXrpŕ7%7~alѢE^gA0dɒ �[AD0dyG Rא7]Z,Y4{l;aիWO{챇w 4nfËDZ,!I-uw0_qX=f틶]],z~hA'}[Gh.YGQ[2$`$%3w-(Y6|_ ~.}w%lR.Y0>HDiC{l�E먝iW/9Kw3m3w{]۬[&I_}%wq\[X:>vK"OH睗X>h>(Zmy7Cxt}R 5PH)=DXvAf?ZG;ks'Ws։:EtvΓ :YZەZgh𜒧wgˋ,ֱtxCA�] "sNo-ۇ@l,I֬Y:JeǮV8X Tk׮mⷴޮsض,iXp:Vڇ% ngW˜zKqdK*rkV-K<U>Rǎm[AZy-@�@�@�@ 0ۇ� � � �,`IOZv1V,kÆ ~>'fSyq6u>:6 D,Xy|&MZe˖-vzoVywp4~]l*(-<~D*q_D Prr>_r%ϽG["g>6n6=3ۿ>*W_YhbN�BE@ĊP* +EET^Q {CE)D{.pϟ3L2s̜o?Ϝ$NvY{}C,z%V sD$@$@$@$@$,hdk>[1�]x=rG1% (a}>1MYQ5>"6#3~C?|bJN4NI(dK^ jǒ1� � @AS,|> "}yB߼`DrJuj*9[g\^ŝ`(}AHiw=08 pFnVۏףVZꬬr2rqj.ieT)ND^{-xp0vZs WgZa #= ޢ:hŻ@,B MQl}D=o(ײN=蠃 !#�'~w"# $"Q?B Cd[mEEو x|E: {}"_/9g(v,kM.xÄ_ hakFԏˏC:8fA]C=[o_1o"H^͘H S0D?s}p[8Yh.д[Fm0f[.jy}h 1~"moB\=iůޡW-R� 嗋wc@#%… wޑEҥKQ0'ke1O( _H sV` [|0Fh1юjذa9OfqK||SSĈVBxi|0kxt,ud|L\H/e~HHHHHHHHW)� � � � � � � @YyT@n2F#(JSNo qm)WXal2]o C9D7o.-Z-[S. kcEҬu+.ug0K"6/vMF2fEVa(cU ^pck6/)eV2     ؼyY~sw}DݹD %r ;[,"Y엺{. `MׂoG=P{%ƄYbb|JKښxn@Ӈ})6aO$@$@> AT\yxr!o,Dzwa09A W8,^n P"/Kh 0a$ȠcnRg?1$t^XY|C\Kja"Fh!a(U/|d<a4 #k\7kxݠA؜l:#a\ ;[9 \ e`̊k}0>.DC0y7&l=D]sGL0#] �.Bf|1Ĕ[;# Œ3IoaSС"lm&;ddcKXJ*կ__X@VL((sIJe<VA-k!� a 6_6#ro^FevKaK\@ZnaV9VLyE]->va2f)Wi� xWOȑ^Gw(9.XlTgFxܹBg5nX?L o/0fP8iժvaҶm[]w>+1m61ss?Ns_gA@kL~3&ұO֘sHHHHHHH pJ<O$@$@$@$@$@$@$@!�"L6ӦM 1t}/6?XGZ7NY`,Yf#~yrG SIgfa,S/+WԵ|OuVsHT\~¼@ňvc⣏>R9\k/#bm;` PP?+I$@$@$@$@$<{] X 7+B H(Xq-}wOX[6o-H}`l1gKB#PþV 0'  ؠ *<hg77 ayw(;*TP/`!v>5Fu+r劘P.;a0jb'6mT?0` C6nܨ.^‰/BAlq85 3v7T@~` Cd]vEE*P5kuM % Qaw" a #DNtEg&C~08(yb ϱP¾r>: =|9VeX5k'\avɧ~{Vi^(kR)SDN?]OGܹpƒd�0Ă=@|ho0VDJ*pna� ",dx@`;/ 0Ix@��@�IDATkas3ck?X@$@$0gȡq!f:)3-իWS)s5(*A@ ԲeKiѢsCcpF1&?b uQA#0oH>bebd6̼6-!@[?{@$@$@$@$@$@$@$@ poT<HHHHHHHM�6''NW^yE`?=.Ġu|`M?5ӧOWAٳg ֌D׮]51d>;~Facu>ba0C3UV> vA@Z2hԨ=lq_pmN[<Mٺ>K$@$@$@$@$@D[!1v9RNb;nA+G_AA@�W�~|XQ筏D[UӏBO6 jM� � OlqW^\,05k  +A [`T e<nQEFe"2K,Qgqe˖UVZNJ=أXBzԷ<PyCaÆZᰏdF@iLzaҥK 0!Nuyƻ"A2eᝈw"d@{ B[ׯ_i>nZj֬y(0&ȑ*3w%2hVtniee˟?�e�/*T`ws"<U\k01bQ4" 0D|AM 0ʪn~U[�A@~`@$�s` q-=Auv$!ލ->s֪UK(ޑ5%Ȍ@߾bD8h|EL�c3f̐qUPH :m۶:up<spo\*AO.]IO3@GND.L3Kz*e,ɑ� � � � � � � W) b� � � � � � � D�ϫ] 2 ؔtQm#<vg„ jW;h)8O> [N׮cu);SW hl<;')rB(Z3tR]ߎ!pwТE i޼og}"W\dZ4IHHHH u`7?Zpl{ "6@8^$2+eiqKK�c5ڴiSLd ܀_ +.de}->b?}ZZF@!/&IHH'6h|ø+/ZY.]ﯿZMkk׮YlR?0\pD 6c?AL;c]tG| \RN*o:Änk.1m=0~uC!)LRB87ԺpB2$m=CBR%LPE?F=ħC!C k;|ΝE&N v[ yhij67{j ec+?> x%ni00@4 VZ;b0�A߱h$0� N�c؂OcC \B<蠃"֮][ſ!@$@[1"#rYsH `sGV:|{f̫A\!: ekn|=AO`%"{$rnT"+V; � � � � � � � dF$WɌ"       f̘!=;V}*!-ǰ8G-^Xƌ#/8cuSO8e إ͚5K?p[L͂|6m*5k֤�0iڠ ,X5XӺukiӦo^/yLA, � � � � L>H2f>hϱ+VXD-vS,o1ap OX -lY-D Ѕ�xԨQCX01> @!PH("  l`&pewS+]oq f2yda/fmV? lkac>yҥKUt>;v]C$/2e0a>Qd.h_BL∨3gT#[ b>:uRǏD'ƍ'hy|ZTEL"0@` #dE|~ij,ʀVcQ"0FSb7閔f gCʎYL LYvlWpifn@g$cWZu{". ZX,WK.-xՠxOa,Ua08 W^u,믵u֕:uHzt5/W\a`iH'0lD؍-6ۉeQ#98yg)pNҳgO֭:Z~,Y"/i8Aps'k#F*f3yLx*HHHHHHH ]%iJlx< � � � � � � � K�4x nD޽{nt<> s̑zJF%sի 8PJ"/84ix7ZvaM4QQ(3W~'7o̞=[~mA_uf!9ַyRB*WVx � � � � ?~Aa>|Ac`218Mj~\K@yK�~ [�baw@hf͚7[<o$P(. j%}$@$@$l�z,p2\ Uh̘1]as*XL}5LjM6�/'xo/ocǎU.p^ c9Fbƍ)>V� Qa[otd= Fѣ>.^XvuW9ꨣcd `� N*'Ne˖<DP.([lsbX'C"}:8 Gx?D0kKSJy %`Y`;Gтx! 1Ԯ][?0 @@ A|rywc5h@0 ѐFI KD$1AcEx (x" D,?~x>|L6MTOֹHgE�"=\qaRJgW<HHHHHHH(*I HHHHHHHH @p|=DN=T9K`SHCj*5b]G 񞫯ZڶmJzQtŊK/k9E?piذ!}HDB<`m;_kZn-]tN8*PP,2 � � � @#gʕ+u=5WUV `TF ]/߫mrJ3H0@p ~gfݺuE>x-B2eTl%6ϙ:q+>l 0'  ؠ *<hgw .4i}e.`ͥ{r�F#0epNA)8sŤBぬQ}!]~i<yqҶ@<e;v=أ2E�!ꫯSG8ի.}Ys=N;k׮q1:Ϝ-̌8_V\?tGuxcoŴ3+* ?u,RC\?#|9T;WJbn']oqgl."Z0fʕxkI6,3 DZyޢE80~l֬jJ=P!DB2o$2IĈqd!-rbL?\N}bsϕ:d}L6E/M[,@>'T`譹bl(J7߈1~CEFLw� � � � � � � o^7�H$@$@$@$@$@$@$@ 믿ʰadСj3p@s=+O7|Sn6]޾}{ۥI&H:4g_|QuWVMÏĴ#K2 �G31a]_KӦMgϞe} BA^HHHH%�w}7y؏�_V(VZl!Er$@@�׬Ycv1Mo_:_u֕C9D}ԯ__m]! `B$PCĦQSP+lŒHH|`'<< B߅tc`N}Qmܸ?=zH|3, / <|3TA({@x5ܼytYN:$ӂh  D�z-5j $<e˖Qbe8q<2xkԘw Xd� rwӥjժx<묳J*<nSWDC #C y\B?a ϋ  Rq%!h3>D` fhB7o.a'"tXxbywTo޼yqFkaA7�TRyP"fH4 21|`n0"J_駟.]t@"=f]q7.K*-ti1KaĒ� � � � � � � C֫C� � � � � � � @bEp饗s/\.By̽%0w\<x̜9S}yRR7Yƾ;y'%K Y֭Z';I o3gMݦMt�ַC`D(;y"    o5ϋ-}8c|aTPzI:u;8MG� @ڂ(! ;J4lP4i~lj׮M?6_Ӈ}a(6aO$@$@> AT\yxr!B!Ht]wz`H xp vI V[x׵.e!oEa~K_@<꠽QF2p@aDPÇg}&]v38C:t0l#(Z=S#qjHeR0ziJdj1FaĸB\ #Ȥ<$"#b=8*f;1C8 o,[L <;0] aZbK$K~`:=CڙGutIw\fi� D11P"SydH0Z2^pj 4H{,E5kӹ?\瓰HHHHHHH"PUbxIHHHHHHH  6I&n+&:u:nׯ_^~r ?r)T6/ L-[oVҥo߾j{YF 3{m3     |r>*W7n4h 裔*Uʞ- � @@~gւҥKUb[}-kh)l=3M>(da_ jM� � OlqW^\;F�Ξ`%/Xz);cw�# O=#6mrWF/nA0ףG5l޼y"$#x@J*sO?].aÆQ2&=;<#p>9"dI s0><yS#믿^'25%9oH~$w?d.@ -2`Hb)k˸q6 ڴi5p򎱿.[a:$@$#7Yn:WtYw.0Fg ( z]+b|?0@t'ԹCJj\,@pbkoǂ:ive]1Q\u]�c"      (1yJH,( � � � � � � @d{߁f͚E&oH o;?^F6;ŏ9L"zL>]cYhӥK >5H � ?1B}p aÆ`Vx( � � � � d� \=m41c̞=[;ql1 4mTWZ5Kb2$@$@l2Y`~Νy?^{% @!QP+lŒHH|`'<< BxrWء*C | �&<^|EOT(nРAN;&C)R3g\r%:A+ROEoUq*vǨ<3z!N;4)W\Բ@F0t7K/$]v8~YfFq:A7Z1BoJ|r̷SCQ!`sEƎ#x-b*Q] /@ڏ;89cuRl),KB$P0>C4i꫺@J**Ďg(sO@|cJv\+ۀ)@}$fIE)H%�StIZGJpJTYXǑaÆ 梱v_ -[bRzump? 6J&~!      #UIHHHHHHH +:/pY�%ڝf{N^zDjժ|$Jt֬Y2x`?ڡ]veRnDr 43gɓ7,tPޔZysQ    'qF8qK?թXmVX;0_lN# 'qLC0%Kk4رtIZjgz_%(d)  �"   Ah\Ѽ.U!|yZ}t�͊J�ɞ}Y58,]c9&yH&d`8rHݻr-J�qrQGYZHkrgڵkk@>W�& ∅pyUW ޏA6g*T' U`A li@X ybUň=RɊB=3B3p߽{wiРAҒ� =Q ٯZYn@dbwNk駟q=m%ģa@$fhU&Lm䂩@ <:WУGye]v)~ _ވ +Vѣc6o"M6 }'Ȩ^Z֬Y#7o6c[M4,â:u� � � � � � � xȷ*$@$@$@$@$@$@$@$0h`O?->r)H�'pL4I5jlnذA r'_/qf N`ѢEef *D "A    &^zI.\><HZ  &?ƌN*e,R?.]>Zvq.$s BOMaAA2:  Ȕ�4y\kv ~ ˴iT&Û1 88!2ds=rg˝wޙS~[ ˕+Fp@%U3ΐ˗C=$zYǑCW_-ݺu{W{ �IlLq5Jq^Yp lHzA8rM\_+Q?% ]"9D1bbDLd_ rÆ +WB~e˖%�KI$P ʎL ~ /_^E(?l?쳘 gv~.([4lؐ>&` Vu2@"?w ?ҳgOϜ`n�"[K.ŋ˼ydܹ?K*UcՅXQ       I _̫֫R� � � � � � � D�M2 Ə/GqD<dof֩(gϖ3gp.s=vkժ%</9� ;<O>)mڴ4 jE0s$@$@$@$@H�*_0|]|qI׮]} $@$@M�>&0+﮻4O;4i޼yaӇ}8lŒHHHHH diӦlrQ;8p`VĴƍ'իW)S6m#G/<'y+QuA<CW\qEX/!lb=z7|3Eт<?p (9p;w,e]#3f~6CK2_| ^xae]wtP^8++">.xA릛n~Z8UFY11PDLyNb<o`D Q py饗7 :+VYf*D/.[A8rMCnB,bB?sUy睬e(J @CᢘObEj9}ѣGnuꩧ "~%\"e3 >fŸ5\ eoLy>r\G|€CIL:UK#7Zp [n1,z�ů*k֬' B>cC9crKϿ뮻dWt_C9D-xys>`HFSNgyF[[|yC~.\(W]uGɲO_#~'yǥO>*7vbPu&￿Q/촓Gf %Kia ,1-ӻ= *91;3ٟtI6W(USڎAWa38CĎ>hodȐ! 46K? m[D(2=nq]Ѳ.]O<!X|2M/vu]'z X�deIHHHHHHHHHHHHHHC bZW�~A!uj_lYyo 2?s9GFjKÆ ?f\|[ PnVO(8ifر{wa@$@$@$@$@$@aUTQaXq`aw(i=Dr.5k~rA̷a]5k^ Ϙ-Z+�a%xI (K � � � � � dJ`qoKZ2*-0D]'|l꥗^R'+x㍂rWF%믿t&L uU86AV6 S!^Gp.պukuȚM`ngu:RM."!SOɻ[Pν.r}%dCֵNoĈ$-Ĵ0A S'HilٲEN^t~V6B}'/Ҷm[Ǘ_~Y~Gd֬YB F:wʐ^{p:^`#`Yܘx~ 0OpZ(!,`>yd҂`yЇm޼:5u!eeZ$-ZObD&Čg1C7 )0QpʎEy.)Oի8Y m% "#P!8<s9._LF?c<bh:4bҥƑ3`0/dƍPD0feŊgϞ:fD_}Jdذa}kkCG/ӝ?^PiMϠ>,',gXy7>ooIUPA-ޅX~=?~|C{UQ`㾃I&b*޽ @N7LU3l"jb'&yRXs| ;�B`֭K;oWcѢEς2旫U¼m46mxfeIԎB3}O\w@ cXXSxD(4hB(xQ*ǜ<-#wHHHHHHHHHHHHHHJe˖=lL:ꨬMY͛7~넋kﶥ D\;3Fn'[MzWuM_,XGuu!xS GzGNc6[GkV.lg� � � � � D�֊[j׮-/u3X#Hv.\ϳ=D]Ghl)Ѿ\0M'ƙ⮥,rrPkժ 0@<@}Wo# 4ٛ(idY^     H8:#ՠdvj~`A-"4kLsvXibV8c34Y{T^]fS4}-00Wp<ݩS)̣pG\Y\2e駟"fY)lɧxcǎUGkp8]|`{S,a%ӡCxgU 0C_t pI\8˦A-c!Q{Ncs;~{;T1L'A+9;#=z%Kszc^̙'?[uvcw tpgZg;r2=&w*�S$uqZ/FP(ȏ ѴiS "5!�g=kgaN=O;|r^5GqDѥ\ABS[~{ܿoCC<�0t3�9m]uU*,W_ tgyjt?'C[jUMJ**otupp)݀7NXyKMTx 2jM_؟nk'=,ƽ{QFzߝwy? BǸih @@2EvMs; `SN9Egd~{˶;3Gc1T߿3[nE>3}`^z1}ij s/p;ޏyO /9ھƍk[i`N.1b`!<|Rnb              (q5kvXY`߇<d+N8Ngw{LK"OVYf M׭C<֭c Dn&_@ D8x`_džyPȑ#UX+̴7 � � � � @@�ku80]A7B^GB}鬣K4h_dk~%QdZRT|lGúJg|¯/BJ jͲ� � � � @ "�GpO̩~S;CN:q8q�A(8t½XR%xNCLW^QT ;lذAi+DrX%OuS#.]ȮF07o|9hٲ<#r'tF}K/ݠx*;,X8{e%ck;uTYf}9F5f|vD=ù8Q08(NhB/E>8\`AОfgA8s!He q-r"FGOڴ#Q_>~6a:thNۋ~s#r'qHTl+孷6;\A礓N*"_Oic^-R1 qLD?|}~:>6tG5vIǴs-=Pd][yE6 zcjԨ!S0n8m~Nu^lD͛'~*ѣG 6!kӂ: ~Fz>ҹsX rJ=>`d\}*Ɏ~6rwg%l7> ?3wg xϞ=[~"-[Vz@n,6Cwi:mTw;I8/U_n'lc~4$86ng`- � � � � � � � � � � � � � � XӧO9s樽}Rr!@ֶ!kȖ6y۾}{曽-wL4IƏS[[/&|[:5Ⱁ #Æ :4+Cgl e`LHHHHH )z͢ħ~Z R|\/1#5JV}~-%N?*ߓɗG#Q@TmKcc#.p R_x0@I!PXKUc9IHHHHR9sL8QS\)N-!!^;VuIrҿ9S�ÇrW>xwq]wuYg%;v"AF2N$W^I;m4MJ3ίJ0m\B۷o,%#FP0(W:焳C r>Sk`l /0AlEwM<YF;1 p饗w$ 0x h{Q'Lj֬ԯ__G 裏Vy(<?pM,Y"H\+zvmr9HժU=ˑr:^͆xW<^^{5}1lツV\9u <8A{Puʏ6Q6m4<?+VX>?ƌƑ xcbofhـHƫ+{&MBK'Ux'>ދ/ z߭B]mC$'Фӭމ |0 ݨQ#UM+?x`wG^A,z@@|�˸g̘!gwnG^D A6ă/]v>:>{YPCI3U͚5eȑ^pƍEJ#'OZ`!EH R?УG5~Kpt~Uf!Wed$ eʈY$ҳ!j1"E&Ɗ!L <2em3tM*Bczi>H6l(ĉ_*E36g`{%e La gŸ!Xbnݺҭ[7zUkCʅ=2Q?p1J*؂_B;J,iQ6WuWP7lؠcC|R\?Ɠ1"\{vŸ�xb4hN;M p/6]T T6Rr~�6ju?}C{$>=oK'ox'Ks\:uW_}U0֌g%GqDl.c@Oedz"q`>*|̝` '8kq#<GGx&p߷j*,<?&fyk[. d� zgg3짭ݜ Qq);^s~6鴛Sg΀"K*@_W ߭Vmd_t~52d|N6y~ӘW.޽\tEPyj/7?. D`ۂyTG7;4^'=HHHHHHHHHHHHHHH@ X3esmc,l7nܨ ߄cOx X#eN\M}L~lMvNy睧6;~ژg|VV8rn}[_.Y+똏ӹ.2ڵKP=OV{w}WmCM� � � � � �|mV\{,/A&g'WZ$w\%[Td9ueܸq pԩ[kI>:d~R*|b\y>ScOT_ <sCnyJ/+Kع5^^K3uŹS;�TՋU\<; 3@0 HHH"@/q#f!P#F8^{%#3\zg:ٝbC<Źꪫ4ƙӲeKg;Ic |13ȤǙ=ƈ7ɿq};:ɺc#c1k׮}٠3KH<xc tqpq̞=1@z7|en߾c띷~[B89rml#Gq'zͯq$ԏqX<HLLLj8~㈷1F1A�ucE9f0TkݺcDJ1tv}~fs=5 \7O:cCM̌8Q]4΄,VEc|{l,J?u뾷C6Mo8uo(vU QFT1O? dPVfR1ʫuQ#q1'q.)|5NֵF.cAj0H*xkey)},3Ae2"O]NDd/䳾d̄/'?'t Lh> 2wm⭷ފbL1Wrueoxj;q옉l8gv䪍u,pk4ʋvBӢE '=4+H30^?ʠ,^ʨY<+hςv j2I{9:d22}%5m+)_1}EǙ93]F11:֕\dm:YީSX~ޡ^mw٩Pcµrk:;t3^glnɚw;w;A})=64TDZc;W[o8W0ΈcHOlC0GplPeC\^aӦM|O}^ySKՏ{lz5΁ˡdj?~s70"~}ɮ-~t;?F}. 1^�ۉ1{ s}ƘPWX'ox⿻u ȧ1/r ʏ"YzugН͛7x 1^u (f~0/D3siwĽpBwqx` Q^ܟ ;%OX|I#^"q1nnNՆ(߹ ?e�vsٸ:)SA%6Y<w6K8m+̤�[fZ~.;O~~+Vڵ:8y%T��@�IDAT.@eњO#Φme˖) <.+&     (&W)fx: � � � � � � � @5ؒla{|j5X+njX-[8gy,\Y旉T=liS7oZlas+o^5WַkQܵ"nރs[nvW-4n8Z?@E?XG9H=yՂӓwB$@$@$@$@$zK/*[ӹ&v¹yK4~g[ٲeq>}8mڴ1Nu6AT~/IT&ZT1+W|bAE][7Ia<c%'1Bϋ] _y|s:oZJ'^W^1vΐ ?}Wv0� � � D�4Q Or g|e8q4 i>݇Ϛ= a-J 쳆8aÆ1#ăM0іnZQ i0/q '8n1* }Fk 0nObC qaxp!(18er;f x|ٰj*.5\-Z =34I :«`"e8禛n p8:G8>~+mpVxֱUXxś.B �6@�"3U:N~ Q^!CPYk@ b,[1߳?xv⋡%78uXp' f٘pO]N=w}f#~z!O~I[cM^up nG^ w}[+~<g6 ;oNqg} 1Bnnڵk&Qzs=Oz1j_/x\/gem$Yi%AG|w0a)۰9-'0CF1}~:F�<"R6~a>C $kz}]w:^P;D m9p jys/360"xk܂Z~>?w@lkq:XH?mZ?P^8p1\ۏA_c h\,ȲJݎͺSӏ{?ovjժe HM6&~CX!$ƟSNu 'rrOW lC\aAvy9v9x ;CfNz>\cVlZ֫WO80`o^ :TaSq9 dS!2"@;W\c nӆ( d"j7) ;X6) ըQmvy LvT:i[Ѧ~Dz!lXg1패 ,7nIHHHHH!*ᔖ� � � � � � � 7c?uȅk8}E^:vi~t1i$dװZHϏ͵o+1B^=li[q/VIB\pMV$_׭Ԃի;p`m~ٻ+96iZb    Ȉ�.]̌"Isd8W\o" YGhl)>]v:Ɔl8 :,+ $bk~:i'8@l 8ouG}_Z2O>?c~aIk5Δ3_K>6k Tyßdƺd3]Ƹy3� � � � � @A0.LFb˕+X)_~]n #$FC@,^X`Xz+"[{163gq(ň8 1cQGo"/,,]TGb8P4�Wd_LU51\eֺuk-1N{O!fI!رA~1bjb98#%>FoEb|W(UVcP30* p 2jԨ~Gz#Gbe]&FIHԑ7?qG.XQ#7U]{>SO0M#31\vU>RQ֬YcѼys1тh)ŭg!s 4)% |W6~߉vԯ__DF1G3Qɼ읈$?Y/~`qT]31K7/l&>ýO hGNqh}jDI.]Uu\OyA#Wu83+Ʊ~keȌO9$ges8>+SY6EH Yi%�fAo7"ڷA{8$g!C ƄI BLH&L3"r"Nji{xb2bV06fDdׄ}֭m]?BIh[;6ӾW\i|[>(c1FC1FmT\YmdP+Jub#˳p~/eubK|3I7y3o{]'Gga|BЙkt.!>^wqbkl'x=�s\rI1ow_'>%*ca|cFHJB7BeY,vlԝ;*0FC3jÍ!'_1^fx5I]v#I`l'>1wHwi31gر"oa$<"@�cxOn8fv6m3g:.5[,&~ʗigq0蝗6@/i.\f`p}1u#} ^N@$@$@$@$@$@$@$@$@$@$@$@$@$@$@9'�b" y\Ӆiw}wkmlg"qۙ=o^=U ^& }O ?ku%J֓ݓƹ\q~$;6Wnӯ\� � � � � dN�k;dIό#x z'[GWBX%3~ tM8Hw+ ZL_%úk;n[q"z~ yM?켮8/zk)g/7 iy]WSHeaÆB*VAźdȡͼ;/y'    : gSID*0�ϫ uYXPְ`XiۻᆱHt{QWǎp!ďi!>8ĠS|~0qgOTf=(?1īc&fV\[!`pf5kTg?p4vt!n6Wfq纜~˕LU!h"s.}6D.Btao 0`QݬݺuswLv‰/adq 02Dwy*!-[s|n]LND:W0}h?x?nɯN~U+U$C6mڨiD3N1zRN<<Kg*V1piӦL :4b3$~*Ʃ}1\@A>DTmo?ٳ26geQ?_/~W v-;/Ƒ^ڢfV9 2bڼ"{oݢQ g1%0/0S}jZ߿ANq߱^m?"yENkhm{{~wU.dmo`flim2C1Ln6]pXgAcJBr9Aauyɳ>,_\uÃDeI'xBepߟ[oU﮺*x$_tEI0F܋;xn&M 7nI{5M&`g|@^Frg^) zN? FN^pCN(RFC9"�E1lf)vW[OOmf0L5߽ʂc2 ~ʗIcq uC,Qkѿt,r,fQ} }veloy+.HHHHHHHHHHHHHHI�6ϰ; :Y@Ɏ?oo~ccmi7:N\? ־KHvJ=-W: ϵMjz|Sܸg!D#L4I?\̂O͢13� � � � � &яB?$D} `zWq3ؒM3>VVM}jͿai${5νmPThS3F5~◝׵M/Y|z^㏷{ݿo e v\hܸqayh(Sx <FFH$@$@$@$@$@9&СC?~9Ifcϖ_~E~a7n|ɱȬө~;_ss8dt8D:er}~BOp6) po#ڒ,O~_|Q> WCW^is9G(_~vi,-ZhI'd}iӦVZX8r6 ;uwA] +`H/rXIo}CEl>lambeĉꬱ]v*N3v'.߬YT{9rʉD ##pZ8w0Jx♉%<Hu1;A]aLB'>G:uB0d;xq, rquw)SgϞh26 g$<wx'WilB}�P`0ڶm IVI,Wp"ߙ$PB3!2}:E1c] SNR,2 vxٳNғ!x H#"U>'B<>`,:r!Oz@B>=ƽviۼeTcjǻ׭['=\xᅁgmΣ:Jm>̨~m,}{mc;"h5\)cX#9uւ)݀){AdڵqIA` BRurO>`57E0ϱO?}tӳqcDpO\1cƨPƚH+x='eyw3<iD<MI&A<wmyцH5^ec6?EWXQy^Ǧ;4.],Z%j 1]B h � � � � � � � � � � � � � � @$ nCD!̰uiWu~ccxmi'Y_~>c]s;,ʶ+]{Tc\'l^k_~.׭ˏ+W{Nm`'5a=N?sPV8&    �_bmݖ> d`$Vǖ1}[%YO+!? wqpH6O>?c^'A͕R7 u ~EG16~" L3 jZ3$@$@$@$@$@'pYgKkcJ @" veXQ7ogΜۇ/0>Chժn8}.Ry;S:FZd=\GO=TM?lР(O~W^͛u8N,j?1K/$ Pg8K.J*!% 'r4KF^zx"n}]=2Ll7ި% 3C=$giw}Gʵ^E .lO]nݺPW_-+V(.`I}W5kޝpn{-駟##0"| `ƍΒQ/mH.&{'">ꪫΘ3g\q6ɔt2�~{ƴ pދyqy睧lx=V3f(@ǥ0j׮]ctX8:uj ȍoP g`Ϥ\60\ ?w}Wd6V!ebZ$/ڴ*pbڤb2ɗܧҥK3<nAb~^mw1!0)~q[KDi[d"߂wtC?ᩧ҅>&ݯn0s=-1^v ؇{"Yvِ;k2C1 XEq?68Xׯ_N@0OP!ko<P!Hn?SS vƞ�,x6l@+s9zu0eamüy̝;WY "~kI?2;y8-8 駟܇ƭs\VD2zȹn; B" MJS߽ښ~jC�s$.^l/Yp[XtNwEU&CHf}DyZck}!*[s1� � � � � � � � � � � � � � @!ܹ;6N=z\Mں�#wvvmu~ccx{z'3f]ޮ]L<kkst@*ۮtSݏArz}AZ_vc\p r,Ok}8 � � � � @K^xp fɂ#|[hl)ѾdXz- cA?}nm:<ڭ׸T>zkK8[[oqϹ}lx]|_{2k,7n\~LQT)[69n{@n~3     $�@<j՞LJquvnO>Dq;@ȩgϞ  mcŊF"\@@zp6j(u@۽{wun)`m۶ruw-[5jHӦM|?p.pΈZJ_}G3 )l{Ka%)A ȫqo#<¹$ _uٲ=:�zg-{;[.ؾl~<y1BufpVG06ƭa(n{ 񥪋~{ᮋ\s ۠}zU>R1YL"wV[".\l?|}^2$Q1gRB|]L睈<yD&o"S0;yRB]H|8=WN:$uv\$NF]?Nz)6N/_%w" xw !4&ԩ# 2y睱v;cRs(h7_x~ n\:#BnTs*jC&9$P)#r[uc3iUWz3ag2Ƭ)R}n O߫ahQ@cp"A(/r]wEPT%~6lؠ|Kx҄ tlmv)_,$_N;4]l9!?ƯGe3Oo6qsرr#`ظqcE^c=&#GD|_<!>|!L8Q|_'SӏO?~LiF5@N[_n>W-Ps>z뭲h"@RPjU/?s8}m~wAx s*9^y(cq#<Ać~*_&6@˜o (s~~KTva>a6`<X tc׬Yع$?IF[3f[eaøI 0_yy`vtm7{5n\@mf/܆WYpm7`Wi!0x8H2:-[�f;6h &f塇ҹ[n%a.ڵ!oBTm-*䅁HHHHHHHHHHHHHHrE�İ'FX͵[m[l,3l oF$T6v۶8:a}>+I _&ÏlIaomL3؋Ž2eOu%OeC?A<}ej~%[~Dvﰯ 3� � � � � >??N_?.B۾훡P}ϑzt'ص^n 2EfƖs >6o,XtA Au~CgLx^*p3{?6_gnPky.͔k=ʹ^[.s߷l٢u7n(sյA#n/)4 @$@$@$_~ K3}z2,J`k@ddyFwo3tɩVcD[zט;84uq̠c:ɥc;>c(\verrJݷ뮻:i|GNÆ 8wNr圾}:}qc*!F81 Ts1b |.]93#ᘁPy~t1|IޚA*K5bQ΁.AWM8rz`q!y4F|p@Sn][o2v1N@ի+oY1zzs03c gڵ 0ر2A$yN7/wmڴq|cY3|%\tg8Ycf-]$.~z/ׯ_ߙ?>h׮c&G3U]Luq9 $;eʔ8vMߦz^φ(E3{VZvۭ[7Ař3gu@uk&[Gu>0N c#\-Z8P:w""3N"Tu;> ػtC཈w8`RfM'`Oq>K,qY}̈́7$1jz3x/66v<=6 qlb" 2-A/گb"ی?rfB_Jxgb2&M8K.I]E!'e$g|rxsʎ3jTegv@sc|ÌX;~c1`ڰnyja"kG}ok@Rש苸)'/3b/4ߌFk ]{cj(ƕRϝ7pmG R*;r(nXYd}o^|c.vږ/ٸ�8SPQ" TEP,k,cIGM1^@QAAA@DE,XD!`AEEfe{ww;3wnݙ3MCbžsH8t>R:TNnʐ]d/#{Ŗ3|wG8$g[vEuD>}h̻)B>?sF3r2m]/eN.'\YcHT[C2hC Wы]Z ߈={F:g\:n>htH{?qW6=_kʖW %R}rW}K/4~%Azzt}p=G[ZMeE3z ij~#P>f}9tf뼹sM*C<&3!˻QQYܾ $}]=sb{ysE\lB!ctNy4qZlH8W~}o#|PP[,^"9dGſ8/B' V%t\幬</𽬸-M�i<yrD[  � � @_ � � � @N8M6]l!vmw ypUN.ni㏏T}ݷIE3Q6Fq l']g~}_}kcmO;~[DqOcdH[Q?}}W__m;w^z-vBw_ qX'@�@�_11}%\7~8u}OUɌX^+F#ڏN׳rsj֭␼_U^SWuܫWCvv=g3s|^ǔױv+WYˊbU*q* o,viM+翬U)f ghVǭk ב/kC [+{hYoy—8 �Y $UҨQRHhː n.H3'A(H]J= vPF*SHTrUBP=ʪ^{=TL׷~P�KCOp7?ɱBV?QB*5eLB=3.̙3V)ThCDy!W泬1CQDUhB� �C)<l:PSEWd b*e o$ nJ($3ڱ*M65>zjFQ:eu]^q eyLhد5\l. AY/>@?B�%J{G!B\D� 7+<7Y^ >5ccRI0M!2'CI>,kR[6[,]Y9U*]'_cC>2(6pjϖn]Kfi㍋#z]r% c{+$CEje.N~ssJHX-KCex2[^}Ie-pƌ k{V\/ŕ[_W*qT!D=\'jl6zZ05[됭L|k\!\WcJYO|ߖeǏճ۟ IFY2['tRT_Zm-P3[u>1{htrQ**_bj{2-+a'l̕y P8fRH.KT:u b*:ޫzYysmCTtoe)kTv\[K_oF=zBrdN:gE>w=׵^UECH3: ECFu)XH lIއ+r}RuQe,W;]y^XYWe+>@�@�@� z암9!� � � �p;Gmx≜׬uUm =uۖ+Te~zOem*kSV>uFCj?O1B�ׂi{VWԶ)Z̾.W3[[B~m#!CDm6C0\ PI7XJ!� � PqLQxw!BDE_خϫ[_VRY7t?*q V4~e_Zͫ6/QQ,bUVGXٲ7WKkVVbl]cb:؝wb ݮZG}9R3C੧=B3EPZ" �'@ڳ%с oyI>aveq|P_~y,  o-w_938722{-Nie&+sR{�^1hР.9r+\]bnxeU>&ȭk׮yYb\hmst{xN> 1=P{ݑey`Njc!n̦ƟyuQGO>}`8~]|sMwo}Ϭ5χܤjJ0Ar%O~X V L~W#s}k\?Դ|Rù.7µ׿*$OV�;o :}' ž4}Ei775Ϥ3U8D$I_|( \>СÒ$)NNزeˊfVZΌ7 �'.=Ti8)!0q( Ү￟s20~2%krI|9w;vlt}СQBP>IP+s<F�@�@�@�(*%"� � � @^{5u=j[q'hTRlu&矏lf;馛*rMbckk'3f99 cMm۶]Pd|�@�@�e>|xGaQ/Kk}aȽ@ϳQ8!ٳոqfYki|tBZ2$nE~'^bocNJ=Lp<']tPlѢt#1Cs*G!7N?I [K9?k� � �yXa`L=BO<1$ yXZꫯ>uz+}Oyoed.;FJK믿~T;.DCtz(#K�`nWѰ+Wr`r;AbϞ=kmٙ rECS;褓N҅^|//-P\m,#T%N]v;#z%|ݑypB]{ߤ|뭷ԤI"=`tPꫯa&MVΜ$uMΕo1c qQ#?_w_~߼φxѰZ8>V\?,fXF@M+s5jR>@) 8WykH!v19 k+'rnMguVTp!cǎS<$(j19Ϥ3iVѲ&MN;M/B9Ưsuz뭧7X[֞{6mDG2 @BuR/!V$t l1bvm7.zG:jqY>{ァ޽{ B{Z/e~Mgy&Jfo&OŋG1;sν>JV.˄I@�@�@�@�@�@�@�(y%u[~EmP"}& Q/moq^'iРA^֧}6k3?w}QDvXuUsX� � �E"ЫW/y/BN)n5XHJT|lf3g]B^K׫WOu{yT(SZ-Ϡ6ò:~)TzgO1]{ .N;D s(|'@XǢ@�@/uB3jԽ{9o&颋$2@bۿ?(+ <Ȩ A%K駟teiذaz \6zGדȁܨjȐ!ӟQBw|E VZiBY=֣ƌo9 <'(5{qdklM-EhѢ!|׺ktGn՜}y.(wLRjzK7<_wuQ[o5gU{L BPdU\?$c;ִ]Y5݆|Rp‡S[O>hJH!oJW뮻SOe˖Q`'ԩ )/uSD}2qvmQO(&saÆY_]w­EMH]OqaA |QrFשlH?o2{yNMOFN֥KVeUy/)&"d֬YS`J� � �@W)MB@�@�@�@�_첋^jR6ܗS׮]5p@*ٜ2j-X@_I۱L%RY^{l<ubzڵShX k:"� � <Sپ嗣:o3pr$ 8G%[s*OUH _R?a-ߙ6mF#F5{+'6o~J莫㥱cYwjǝ"� ;$']aK :p/I>u~ugkҤI:ꨣt駫UVel=J?^`˯FȮ!W\!57\렱NFn y1Ǩ~55/2+ٚ?~a]yrSBDs9GkF3B}'ԭ[n햘<Dn\@k.|9ݷ/XXL)MVA* []YL%QL"EFB |$,V:Yuā   ^7jH;\s͂[gVJS_ofpСr8bM0A|ItZ'|iW%+ӧOB+<H5W\qŬwJnMVg(h>JtwD.$+hVREE/2yY~XkY>($< Hpw="� � �@W)vw@�@�@�O_{-;եK+k\3wyQBg'[n7m&;s{N8A6mZ[r H i}1J;y1r-tFI_~"#V7+� � /2J2lذ(";nfNGɶq)_/U0Pm)''쿒;Qı!L|wy׮];qr˜G,%A+`'HPj($Ԫ%h� @eINSYٓ:+/_b޿pXV:ӟ-\w P  .h99K/޽{sύnt*V|MX믗}:HrW/_|![ c=Vgyf7s{76tSx:Cje(h'[jYg?Y\~)I*�žYXدr0E�x"5(+\w+Tb NR3DyE A{ݻGA4hPd@>=:GsF f��@�IDAT%sa֬Y5jT4I}]o9 N"Ā�sm[#Mdby| {wN\W ϟ*\o^f͚i뭷2M:A/9 � � � P@1Wl� � � �d[!1!C3矯UW]5ۋa~yp `<4rt8 OkRbZ.9~կ_(Ď;bJ*TyIy)|'u矏3{~:uZEXa@�@�p]~}QT6H;wƎ;FYׯ_B2ȿc{7x~Gu]tQnݴ;D1pHmVkB EqB?C5HUM0ގ� @p'Wf2_:p˖z&N /nO?-ZDI=Pmᆹ1358qht%!'7߼s0{kM4I=B+#8"j$MlZ7:]QraÆϠ�NwwF ݠГp�7 ̙3G=nzI'iՆM(t46L~HNfv̭DȾ) usI\j8)9;qo[mUԨhm6l_VA�"ƌ^}U3FVx{U"wv`O?]*I({@8P߾oKRʊ!s ,I8\Hwyp 9_6 (<'Һ曣DZNyEE`_|EtkaÆ>8�/9Y � � � !*_@�@�@�@ gygo+AAByf̘o{D}5kesƋ->+!<P:t梘.KG~Q⻮]ds$ʦ&B�@�@ ~ƍF'n믣>=Z[l%ubSȭsG�j.^vб=~7wn%]w-Ƿq/f͗U ;@[Z7 �D wrVD3WmjnLv]w{ѴiӢ�nү_?5o<G{E40`}Qэ#<RN�ZkU}FNu2{LnHk}U>}ƻ^�},8P?A>=MJem Go+I7o<=oõkF >hk׮KR6 Νk},0O\? VYT (apNS~.D!µK8رc7_}رclS?ǀ�T$?kҤIQ-7,wzKk.l^m]9fΜ%9r|߿*!2\{׿J/(  f͚/\k'G\'ː|')4 qP':-\\zjРAO':~.dyv=C_ʙ:u6`  � � � @E@�@�@�@�;w?|vmQ . JD5_m]}պ["Dټk 5s~gEIq26l3>k[o=?VSq&wq}Q\8Q\RUP;oG�@�@o?@O8QzZ:Ve۶m\n:6mZ@`U@�駟4yd :6k⣏>Khp-ԯ_p @b)+į޻ VVZEXY@�$ $9N[UF(%=I>2)a9O߾}J jCAXyzDŜ栃2zk}x =#QVXA;st:q7`eJo_ C wp8@>@2ɃL>Cѱok[سgOI.>e+ )SDǡ}V^޽{˿B<Y]w˖Vr|yr~(-RS)9U{K%'p"Лo.$vC%'?~|4;ru]7J`ޡC㰧n֭[5hޅ�ׅģ:ԩSH9n6Zc5jn|J+X ㅄx҅JS %TOZG;{sȐ,'}o]O=TtOSNqWi"$\ /DAG;1 � � � P@RTTf^C�@�@�@�) Fq=ڷoO?=j )ׅΪs5j;OG}t^f[m %$rp]wUzRReۍGIܞnСQ̓oFnpo%?kP+w@�@�| ̙3'+>FkM6FVjJ$Vc P[A駟?FƏO.\~z '#}6KTmmrBUxw~ה@LBi@�&;YC*сH7\W;w)HNO>d,O>F9G7jҤIfUhtP1'i׮]0dW_}%s678>D|ͣǢԧܔ_~kX7n\T#s=YfYxՉ &Łwa%Ǣ+[n/W, 9rc>:�8E7/~[u[n)]3W\?J'Cy2<� Sz|4btW($ .ݥ?(wʜ8q|ht ȝMDֺuhn�JGG(ifϞ5v{Xd{[lE4ر7olJ@ ̟/mBcf u%@q=[gr!:ղej̉mz!͜9S;cDkjaw0VXX@�@�@�(0RR` � � �$TAj=jذ:(ߟ>ݖ駟d9΄*y:ã~9Y <x ^z) N={FǐXuUslf@YѣO;#qOz jg � �pacIdX d<:hF3fӦM7]R!8u,SO6M?ST D1 <qzBjO 4W'(KR{MʒH-I9@�^ w~԰�t!`>C:g'8f-\0޽{P \8Xo qUy4(sv-F_{\hXt#4ܹcqdV+YC~Az}_w}}ǡ9O- υC/!ly֭[nݺK(G`Μ9;v^|{;=tiob.]w"/O< AqF  p pPSA>�>*~µtI')HOsʔ)rb-=L4)9wXSNtݸ&ȣ@h" Ps*jc?\jo^]vj۶ipk|@^PH%o{0[o~ |~Pk6|5pȝ;hx � � � �$^$~R@@�@�@�ȫ$vm_=M}ev͝;7+q 'w׏6xϟQFiĈ>|x}Էb mv͛7a% 6t_+D__~y9K+VZiIZ%)( � � 8Σ|GKF'4WW[ldk[/I@S.3/ @\U'8cƌjK~=5j% e<6i$~S*Jme 2@�r!;*yҁVn5w , <:?Mjmc9hʐ%7WՉBxtW_}U_V]uhٳgԉCVXab+^׍w8ǡFjmڴ\|Ǣ'o`JoMqkEo}1#Ho6:iL|:!U*Q2$.Ǣo2 DvNcѿ] so>:}:9ۚkY`Lqr\~(sPUF^?kUH%_ yX]7tɓrך7Pyt2ua˱Ȥ QF7vFnkMOӏO7v6liƍD@ ;v٥7T*/t= :|wlC<P ̛7/VC×3<#Fܹs禢;[5@�@�@�@� z@�@�@�@ Wn"t#eȾb7NO>dmݗGA ٳgk̘1KFc_堶n~[mr(K L6M'Nٍ?>ɲ}ڻu릮]jWK jʖ � �,E4sL}1N`d6Ngr8VfXZk) ̚5+$!|>gy1{g^/7`5h`e!pQ P#jci[ M) @ $9Nn6FY3JnN 1v(іNj*j+]ːL7ftEģU߃+Ӝ nh Sw/rt,:I9Ez"k7C'm_~Μ J 7NcSϏy;C>6#ox;ȼoFM[lM6Du™K |K~},N0!:6b5ֈ;随E[OJ餓 *p |qP, ftiSOI{- |+OV"s_'έ:HDV^y(h7�ML#Jy\7n ]'*Nz7ht'x(dŖCaP T:)䓥+𭼈�K.ۺj&͙sV\qŨG^eU*#/gCIET_ԨQdn2~{CX@�@�@�@�.@2C@�@�@�@wN&3h =!(anr-^~9ܹs5|p 6,Jb6n>VmNᅬ⹸ϺGHð:;cvԦM(r'XyM4IN8c_c#CJZ  � � P_4qqiӦQ"m_;vYSi`@�pܕyECu4~,]X/'K☳ @v֬8ևZűXK@�Hr|\ċI>ٿ+߅];~18+f<ZQ#mfm%q ]W08 8q~~  ܨSNjԨQ.Ak耻ncI\|ћMX[cЍ"=nc8;}ѱ =uro7`E>}L&C |7^غu71Q{ۨK9|>=FQí*:踘{?_9RQ1@~_OZ3~( "h瞓N=5uns9(Otkp .:kN'OrM;P'�wC1!k)E'}>nO9sDq6l8![DY}>Ek,*_-~J!B d{@, Rπ I5I+zEƟ #G:<-]W@tSr՟矗}W{Nh;F;i5֨y' � � � ' "� � � @ СC5dȐ(;=q-gW{|gQ1cDNw}աCg«Up]Ǐhk'Pr)ۗ;{>~ܷ@ ~?I}O̙Qdݱ |̹͢;u V6� � �p~eqRxjPIu7n>cg-]d_`Ahzщ> +%KO*8ўˀ@ 8$K:b[X_jv`-@�'  !I�5,I>ٿmpO7rO shnFX7hhp @ Jes_O9M:5?cyt*?t\޺u۰mW_5Qf? u|.W-EǡޮqjdM\`INuC?vGPNa6k.jؾ}+e~!oac UǙ|,0>"kw :XqqccwJȺq詏Eo$ _~ {٩dI*e), k{T6չ~p %\}+[#�9p5 7H]$+ꫥ"  \׹.?~ѴI0cY>3:i<̪?(n8w%}Nǯj66kw[O͛7@�i):WHD5E\ h@gO%r^cǎ+oP"NK p{/ �c÷z+zw]AnC3 � � � @a _k� � � �pvK9r^xᅨ͏ tY]t[o%)rRv;ƍFwh3GsR%rx2eJhmg=D\^*Z 8iO6m}AQv'NGtbT$\k$*ۅg@�@�@ ??S'=k~}؝'}p\'lhtz <N5Cɳ:1>X'eAsq-rL*0aԱBc)T[2,�  � $'ɅW1͓\ŴrI>ٿϸ &O,7rr8Y{p+~DI)@ԁE=8sݕK\a`cq`b' qbOݰ\Y8aGWǃ/>c AO?QNר\|,ǡE~݃8>]QKʷM`y֬Y;D>xɃ~,ǡKVn^ X4XxXmՖn>>|ۿQMXoH\b?]{XsXlժՒDoR0_VPZ- +r%[|suPyȟ@859wuo[;<uZ=ƍ=Fގ9rKn|< >};:v2uC/i_G ?ƏYqF6srF㸁1T)'G裥p&?[@8SOh p%Dk_/{w^uQI&)?ިQl|_Sr&y>I:Y|dDchU@ 'yϠl � � ��UJg[SR@�@�@�(|'r W_}5J/QB@mF<~n~hݾSvN.qmQN˅UKk ;vcq,'f66n]wu!᩷zaZ nI0t]Ocz0f`NOv6  V, � �Ծc˚o|Y#@NZ ~ ~-~®ʵ/X"gq_LO0/qҬiz=L >Gܗ1$ueMNJLC:8. }Yj-A�@ IN%jsde||d)s;}(\ĉ.$ B?qfv8@nzl\A[~稁+P-+< 㩃 4eY Hc˖-3x8k90ch\+b("gq1N1^b9XAO=B^|S)7ҏX#1詿|,\hђ"O|zqcƥKJ򁏳8ZF0Nl`>3}#bYźx7sӏC=5}W|,JUh+_{tr<F0~x;Ckͫ @~ƏN>Y!t%($`Ϻ 0 ?3|KvcSc!g<|*QCϲX Iy4t^7rtLYӸd2sƐq-Oݩu6qǸ^׎j|^e$C3ΐ|R7eB| (^R^$Z{psQߋs)'J}_.|_{/ɼ{p2ly||#O{ٮwnqr1z@�@�@�@ WIꖥ\ � � � c~SN2n mĝ|h 6X2x>NJ~~>g( c{p{֭[GIڅ۷o x_1cƒ1nǕ)=~ޏݏC"}m+fo8'qsqkc3wM\}}SjGZR@�@�@.k[cӟw=G!ǃM/<ƏX Ð9.*~Ώg?f>>ume.?&~C=vxtI8}}+>euW$o~!eqTes)KTNM]OXZS@�,@4޸Fwʰ Ё+E9$߅Kl֬YQB 'ňG7(L�]FK ָ24+SǙ׭[7dxeuF+GWeʼbٯ5x]g'4ǦMF ռ޹Bݦ^z)\ˁB;/moɵ60WKf)nQ_oYǢyeqWѱ*^feǡ_w%yqeq寿&\n.Ep#~,h|zꆎnȀ@M{ >8H:҃k 7]h7|e{sUEU9ļ*ǡ櫏ɲnW[O}LM1/`ˡ]&NT忏W(T P JS W:l:TR<({)NֈqgfkL?7uHfM?kiϻ!_<'q|:q<s}VW4׵?Ns+|s3?Ӓi㸞&}W6}m߲qiדI[#@{NG2鬳]VJz i�~]wW}wsekv?s!ٖ8`I<@c'NܣwGF~Q?e>'\Y\Ҿ7{NG @�@�@�(5 � � � 5u%ɩNپlj<[43ۉm6~mm3Gqێ}n[l$؆!yv<~C Mۨʼn8Rn+ne n:nǓS-[z.>~{HӐ8cǁBܷ=q?O}3\6n{cMĉDdr3@ o,ubM@�@�@�b8 ~캁Y8Ư:FJ;<i<^!~ޏxZscUuŏi\~^NJec<e=v}:c"sXs!\%[0~`{ĉ*:^@ӲuR+3E ;ҵ]u HU[F�H@$ncU@t&XߞxwXW~WQ8)Uz#@7^{NqEk\+refec\Wō2w_2}n\+m qpѣSɵ\!֩ZИךuʶ+ ǢGǡfGUEWwe> ~O|ō0>ǍFO=?8teϏBM81cN<qPwN8%d|1w0++|q鍟+:ә>=u< /H={fgBз�Ԏ@.KԺKݻβYJ #[tNWS?w,kx03TSQǏ-}~}iY'SmۅF P^ҭǾq#Ѹ1iyǏq#i|mXu6ucg@�H 81;xﱇt} @,Ri  J@myfy`q'${]YS#J<^>~8 8G?  � � � {A�@�@�@� :_|񅜌(:AڻMOf{?l+e&�fSNs?viҤIˉ}y=phޯX-}<6l}+ݧ" ?"q2gw_w8Dg&ǒ#~G1%W£PnoMB~9 � �$W!=.C e׳'s8^Cu\\i?ʊz>Az"J VQ-:#~OX?88Dfrcz<?.׳,X@=^ùf[NPH:ԣ%@BЏ8Շ{]\Ze �TC wȷҁ+ZJ]]7#P@h%xPuB8Kߒk5kVxXԷ[ȑFrwKFImTydB m &{%@@�@>PgM%JeG;B!@ L"u&o/ XD!(6/ҠAXHuW)`@�@�@�@�@ ܯ&`@�@�@�@�7+�E*@B"p6 � � �$}t]ҿ%M*#vN pxii=%ǦoذܷB%W:/#� � � @֕vEili`iM /7OxTFSD3ϒ Pk$Ӫ5^ТEGH H\SEa@�@� g$7xMuksol0 � >zL%�} i6_~Y:}vn2(w{SIUD�@�@�@�@�@�@�@�@�@�@�@�@�@�"__:d%uv^R~H j"@^|QjӆdZB+$*@�@�@�ȇ +H}HܓJ5hԢtRfޚ.cT&*pZIN5eJeu/@2obY.F~XI@�@&M.\7nMR � P(| !4lu:]XX0,RvI^ر矧wM=J@�@�@�@�@�@�@�@�@�@�@�@�@�@�,칧4j4aǧb:ݜ9Y.sE�8;gIZ* 5)  � � @bVZIcR=&5n,qԴK_~"S83Ϥ*wQ:5! V"7kN 5`t%7K;d@�(J󟥏><P:$i-/ � 7ސuZLz GQ(G`|ᇥ5Iu8T2?JUr @�@�@�@�@�@�@�@�@�@�@�@�@�@�pl{On1󨣤wީuai }vݳ?R#]KmS^@�@�@�WOgGOzAi$kD[nɉa(CJ#9'Z,-@2=|1cCN9EF@�@� ;i.H}J|  � kgz:v{N"Vř>f͒nUm7i͓.LSixm,@�@�@�@�@�@�@�@�@�@�@�@�@�@ ]iSK3[7NAK2DZ8<F�bxyiѢԱ\,\|� � � �XeiSɵHkO%/}wogyXcTROTjs, HU&[Ҟ{[^wo@�@lM6zJ1"uؾ}*!3 � �!pM{H' , I<YJimfͤ3ϔV]Uviip餓KZ) � � � � � � � � � � � � � ,W=V4I:T[WWjZid tgFj0%}H{c� � � @Nח>XzIilMe ?(qci・>'gT*ZwRY*o@ $9qbdZ;$u"sr)A�@�r.k R 6XZiœ/ � @ < O>Yb;SKb'L`bפsϕڴ6LTG';W8P:0i5Vx� � � � � � � � � � � � � �ck*ֻJ; ~Լt9̙%@(r wB>} z � � � PW?\2$\릛 R^[o? ,@F҈R:ZNƀ@H/[ĉdZ;KO<!B5F�@�-|hp1Ҕ) 'H'm:|@�H?4hP*PJHiJQয়R|.]HwM=ZTw+E!ʌ� � � � � � � � � � � � � �$SM$>4 69D?>eT$Aq,Zٚ$ʎ#sA�@�@�@`\S:(i0i,/<PjX:T@Ic@6YGz_^skc,H/0rԣKіo+ � @UחidS'_0 � �52DrKRأsOOWw_Q#woW7ߔN6@N'KF�@�@�@�@�@�@�@�@�@�@�@�@�@�Ƚo'H.Թs*N_ �UxiSi- W� *5@�@�@�\+!͜)]yejNu…E^PV\Z j9%@2ڒ.<X*H>HH+Xe � @h!=˩z<RBYC@�Iয়SOפM7-xꫥnݤ&MR f̐&L.@|s@�@�@�@�@�@�@�@�@�@�@�@�@�@�JQ1?NGkv7N?U(3'0hP*r޺P� � � 2t ҧJ\"}_;(iP_a|*^*)~7>ըQFz̿X.T:�쳥-֒ � @a lM*hj%ެ �ĉs}s{VYp֏5A"_^|Q_RI6,<k GMݯ=+!� � � � � � � � � � � � � �@L,{*nc}v4mZiP^ G`T7+u*5Y #� � � @]W:iXO]z]woIc%c@ 믟J5{nٜ;B`i'~I1DH4?H,9i]x!4 � �!pH\ pM7I?\Kg � P>OKaC魷R:XֹJzaCƍݥ3\L_?~Ҳ � � � � � � � � � � � � � �p[TROoq՗^LGSqvܱfӿ P7 !� � � P͛K.'M&uV*;KMJ' %-ZT<:nJ5cԧw9X,y'شi Z#C72>XvTѣ#x"� Jvƥ��@�IDAT�T^T=˜\3mrXf� �E(0~KW^))lYaKFcF#Dä3sϕ&ON%*[7Na � � � � � � � � � � � � � �YX}u3S><S'˜+Z#խ[[x$Ԫ&oG�@�@�@ >'Ԛ2E󟥱c=fͤSN^zIZ8 6ZF+-XPKe"'Ӛ9 C:ӵr˕J)g :vV[-HK*~!� �d]`3TsgiSOnj! �{Nް;i)YAX ,\( _7XjZ yssSDvMA@�@�@�@�@�@�@�@�@�@�@�@�@�@�jQNT̖W^<n?Jl ]~嗵2, #i1XbEiqIS^f� � � @ 8߹Jo%? u&h!~4n\5ϿI:ֻJ{!c׉5(~8_H{}V_}5z_0J5ל|ԯ_u � @ ZL%xuiUv3U/QQ@�(R6,u~Jh"- HYz .;{췟KҜ9}IPWH � � � � � � � � � � � � � � P`l#=KW]%5o7yr,@}TjH3)"P6� � � @ 8`tҐ!+I$f@I?/MGO?Uwғi CsN<DիW7֩4`4ltRݺ%MB@�@�j+ipiPit}{$',`@�@� Խ{qv>eXHzU:v5y3WHFT\zn7G�@�@�@�@�@�@�@�@�@�@�@�@�@�JVET2O?2ϥukH=.Y @ON,ϸgGw(> � � �p/N8Q: iT7=WrK*Z"U$C7dZFI/x{p G%+@W_r"HNU@�(]w\pҳJZ~mE�@�j|t챒k.\('~԰a5f[Ȳ_J>(zԸK]H'x~?B& І9@�@�@�@�@�@�@�@�@�@�@�@�@�@K'#;h`RҝwJ?XqJXW><rTtj"� � � P NtKK *74zҤR5Q6L=Z:�_j:G>_Jɴ6pzvaZ{K!0yvҥJ"=t*mo)@�@�X>j8S 7 9M7qXUB�@`^T̡C^~9}fȇ ɱ#U*?Q9S:lwiӤ&M.֍7o[UɴjG@�@�@�@�@�@�@�@�@�@�@�@�@�@�r,8.{!)M(m?I-ZH\ ͞`$PIڵ:sH @�@�@�H+nJ>]zO鮻mS01t}Vz9C_-<oɴ6 ֔)StiF]y$K#yd1P`@�@ 1IgJkOڴLL) �%'pBB"uzt9vr%A(0oCDMJ;nܹg)m:Bum /㚳h@�@�@�@�@�@�@�@�@�@�@�@�@�@�/}#}t7K믟՟@~Az\jۓP+W@�@�@�f31cwnEjZ|sˤ>*a ^vI#-*JekV{9K$ƍKuG<ԢEIRPh@�@ qksTNV5*qE@ �$Vˉ$'(:TsϕV^9Ŧ`${C"7?\>]:TiDiL;~VK?O?_@bU@�@�@�@�@�@�@�@�@�@�@�@�@�@�@&K~*x4~|*nN;.^\nJI`@I=J]{e%VY$@�@�@�JN`n!xpHkWV~Kv� =zHO>)b%*c%Ӛ0aF38#<.'iNz},SL@�@Zx@zu~}gOi]7(1� @ tRұJzISe6jTDaUR/R9i9aVcI)-K#m{\W_}^3f=#e#� � � � �{Sqm().JB(J!P@@IK{hןd$ $[4hD%Bݷq<kyι/:� � � � � � � � � @ .,u,}4qTijդMbk4lx%E l[I/@t@�@�@�F!,(g+INxB:Hn]_4sҜlV+K\CVnj׾´=N8A7έ\=2jU2aW¸L � �-`c 60e~tR۶O?w �$m ~S'{K*ROhk, l"M,v*[^Cd%KC /<p߽[꾼:K f͚N;m3  � � � � � � � � � � � � � �1,дdבo-tPSoسp,*+ë́� � � �@|&Y̕+@iR>RJR3Hbm%p9қoJ/,]m5'Z2ѣu7^Ys |Tt R^} DŽ� � Xg)}[?H5jH;Kw'~@o@�K`&駥*UnݤAZÆI+GW[iM|IǶϵh!,鿋z]aCɮSc1d{wh͛Wsѱ1 � � � � � � � � � � � � � �1-`?}9_~;|tҥJV D4Rh<je/KG�@�@�@�4,8 hZ% isT/r8x.Et w4rD8 ]ʐ@jaZg\_ҥu%dhСt}cwo`F�@�֭y^L>Y5g) � wTt]H JCsdDF:u)U.=tRKe[gd3g駟*n+W.#/g^@�@�@�@�@�@�@�@�@�@�@�@�@�@�b^CV;知u7ߔv.2$?ҫJ_/ɓ2s�"� � � @ XʹJÇKWKcJeJ&WP:,_psmK. /^{M0@j9´6n U=T@kkqe#4kR9V� � yݙ_.SUH/mY �āuꃴ ,aF*AB 4yԻTTte}]HsH6fԹo6mƍkĉ*Q.!� � � � � � � � � � � � � � VCi\it[v$ҷ~}w ._ArW_ٙi?O8^� � � �+PԺ/zmGJzʔ9Gz%iݺmK$C+nA:L%Viھ}In& 0E{@t@�@ CvV>B*W'`Y �d^ ?7j'>K0C:XB WOHMH,}4nT4vv4kt|25d]|źꪫ\8.\8 e  � � � � � � � � � � � � � �ĉ@oK?,t}R fEqI^7I]&(x(2J� � � �%P\BkY=֭taҹJ*_]-N>]7|U+OeǏG>(^~X'{ֱ=%'Lkǎ0~VQu/Sn7nX-[Ky _{0~O%� � @S:wAG?c\^&\`zܘչ.ܥGєc;Q@S@ 6l c6ea#-X ]wςհXXzy];T)vmO*]Z<XZgJ[K5HU}:n}7ofwlc� � � � � � � � �@|1f@�@�@�@�@ mX\-Hi25ndu].@1#ۗU-X:8dȐȣ>Ur/_=zh)=w _)B�@�@�@�8�ҪUK/IyH]p+7fg+g~7n̍Ed{ ^u (a{doz0-[7xc6ܹsϟoFv)aUKUj %*r>!� � }1iB믗jԐFAY @s_SצMR{I?c;9aV�Y.0otRٲRRFwI_m X!!u$yTԳdmw!}rǾ#P!#KO{`'/VZ{I949j@�@�@�@�@�@�@�@�@ "qw\of:� � � � E߆> 曥_FV6jז^{Mڶ-ڜvOZ";vK=*WdQGjc,Mwocw':K:C@XR@�@�@�8@Cw}-m*]qTtž({4<yv]:q '$ݏXdE\sM5ɂuyk/{׌,5aZ̾}|g©ȓ/ʗ/_XT޼ F߄ 'K/싱>}$τ� � @fʔ,R{evɼ>%s1.%E c;QB@ ^yE:4qki4ᇥ?{TF INꭷݥ}8e~gti:y;8"K[|yΓN:)ph @�@�@�@�@�@�@�@�bY rcyKv@�@�@�@�${/pզ\gRժ#G3ۿ/i!]wիgY 0w n= "BkD̀� � � � Pt啾U>piz}{u%@E_o,kh$'$,+V/ͲYM^lY?KH֜9sd^3$NM:UA$=T @dErO=UjZ:ɂ,@Ò6#7@�@�2ʕ^F'խ+Me`A "h j$vdנļGv*T>XrF頃bt 6l_rJ' ?lLxL a7ٳտ_~e � � � � � � � � Œ~��@�@�@�@ F gxCZHAz)kYHyxuVO1~~O<!ͤ&Myqרq#:� � � � /PԹY#+ 4pԪԶԬTPsRԧO?T?xWʖ-b~ՙgիWkܸq?tuONj=7l0}G}?C.\fW.\Im J6ꫯpz犃w};w@ݻO3f,R*U׊+ԦM0k1bDXxK.Im|뭷4fWﰍr3v7juWsIz޸&iV|qM+蚞=#='=aZɷ'|?<"˷0<۩S'/_^?pxKJmݾ}+^|E=0`@x<ծ][?CZj+cqn:u7kڴikϯW^y% zU7TԎ)[^jǽ=KeoF_vR?h+ � @ w[;W^ϬR#;k.}E3h׮](l9rȑKw_ǎ?x zKy'llgҥz矫XbT; ѝ)ɑyF�XNzu饗>Z.t'=>YB޳եƍ5JȾ6ؒ;7]6 � � � � � � � � @t |O#Km@�@�@�@�rW{CYyHrIC}=Mw{ՀZ3gΔ:!^z̧Ejc{1YK=)O<Yj 5|pXؕa) @�B`j+!ӦEEshD JeYT s# F VӃ O 8 x غ5{x 7n̛7/5kVPbŠD+W<L:5l:kԨ"́ h"w}wаapY?|Yc9&ؼys0yy_SZqϟp _~\V]O=n7شiS¾X[뮤yfϞ,Y2Xvm|:+۷oE 2$pAF0gƃKi/#9֭ :u| Xp%߆|A7oCI:Uˉ8}aoSzۇ-Koŋٺm5k#1 .,/cЅkm۶-%cfH#wQI n݂c@�@ ̱{1693{L&<xpP`%7o.< ×klƀ3{5\~vu'}Y*SϠ.9Kv8tmr?>99iFn @L lO[BAP;1#EsHᅢwn|~}jVn!|kƸF{:9X � � � � DKmC�@�@�@�H\Qzo9_,qz�pe= � � � =yDʟbKvT]=cׯw5-u>6lL81MբLi-|ڵk{nÚVK'6~ou'ӺXSǎ6[ [ 8 L9#b;@�@ 9p'|s ֝||@ s˖A~AP/hu;u `g/&s+߫;w»򸐘])1SL '>`˖-{R3cAT{$07}A>Wrɒ%f͚z">e˖ î.]y+hH;zy( IeF6kݨޡ gJ=X .:Ms\Ur{}2e"eɵsJA0|xc{H}+i+oC+xju&M 1eٗv%:leq./_~9i ZjU}1R%mUf7r)"ZS9#ˍ Cਣw(n%, @�@�h h{';Y/>�jРA9nذa1c;Xs9gFg _ "Og}}ͪ ϸ=Pe˖I99ifn @ |U\^ vrou砀}=wؚ5{S59ؠVp4߿Op{wܑ޿(� � � � @ {\4�@�@�@�jz7qĜ[k6 F�@�@�FLo + W1\IL&~mBTYGj#[d"w"V㧟~J:~HVZ۬1-#\vm:Z)8n ;)򺃇 @�@�@�H8r夞=9sŋ;VjL*SFZiiǎqC<5j[^Пqr/Kz d&N~NH[fMkD /.KUT  .hKnPW˗/x.RŚ1cF8^1B.K۷o R׮]B %ݎܨW�N<D?^Wn6;vlR}.KE>}[nR|Kb{{~¥&M+iϛ|>K/oTF䘲*=Fuʛ7ou.]B+$us;^}ÇUVrxI~\똲OZppґGJw!]vd~x5 � � 3ƍsϕ D7o۸6i'}뭷?X}fn۴lٲ:=4vl˝îիoKpfA�7G5NyG_ƊNc;44,~RTtԩiIG˽HK=4U7.iӦUV"E$޿ @�@�@�@�@�@�@�@�@ 8[9[4@�@�@�@ K>+:ldivJ5dT-7ݭ^?ƍhѢI/OhѢGZEygUZjr\0Wxꋤ&c=͛7y9CpR%Kz lUB�@�@�@�/`d7P瞓;lV:t/  g{uUn]5E?+N꫓kd?x_~lI#-gɊ$`]4h\z ㊨YW0ݗa۵k O ÷?^b#n{ԫWvv㚯mۤ /L6Gn0-[Bm8t Ν;qLdݔcBlJkqUBhB.\zgoinqdڴcʂsܧx/Fj,L 3')7:@�@�H;Gʝ(%}tRڒH0cL HNA"7ٸN)ϡuuYwvX-ڂןsa5h 7!i}NNnmNU1c_c4nXW/ 7&mU#zЂҬY>`mLߥ:uV'ߗaϨll֦{hs{w\xq� � � � � � � � �Ě�{|Xoi/ � � � 3DگVj!=tҙgJ7$lv=7mڤ%JͬGGZEZ"V?t5h}}"KH͑Y+! \\i0 � � � +K{K_mE*JӧK J.+G={Jg[Uڍ8Ae˖d\rlSdp4r?.fÆ a]xqBN>dرc]UXVZÀ#GGM6.,h/bEl޼YkO}J\#]r)r y/#aZ۰_~0- ))[VfY;f,,O>?詧RB\YWy6i_ǔ$}*\]Zo/U" C mie96 D�@�sΑ>\?KԪ%Y�?YIjfYHioAX۱ zouڇcMW\qEc;ɘ�X֟y6vOqߗV #L+qY=&wtR+Nl,O$N60-(J MGq w? � � � � � � � � @ pm.:7:MF�@�@�@�[l2'Y`QNrMϗU AP` &h۶m)fz֭-rZ"6Ms]A-[XNNzjrjݺuGu o9D% M qI� � � �@ժwW'JK*Ib^ ֲn1cFK)R$|>Rq_)^NdwuWyjK#wS Һ%PvIbeʔnxO.QEޞ֭VʚڵӼy>Mw)d~TX13M;w ,Yy(K]L]yt҇Z4#wǮ-VFôɷp I M~Lكv\YQp JTU>{_ݬ\p ys)on[Rc꯿J>3#w|gI#ć^z/, � � ]6a.: ӪYSAj'ɼ@<Åm\Ǟ8cylBof.]Z#FЋ/(7n H@ ,Dfz=%7ސV ȱ&(pCz-r>aC),{{I~F(>Snwrg2$|ܾ@�@�@�@�@�@�@�@�@�|oٝ#� � � �!x}{&M>~A:,:RmIKe˺Cn:I3X].L˗/Ed,mZ"JJ,) 5kVdږV#=59OΥi^}L)v *qTPt1[EV<o]� � � �Y&PtPBI#rT\W{Bu(�W҂lߵ`7 vG:e6}Fjm^c |&˖- ]x.f6mվ}{/o͚5E‘tP�dX6YȖMySmذ!|.y 80|}mFa!f <;@.i#ta;.m'&ǭ瞓s 3>xJ9=vﺵ?aZWG l;‡w?A;  KK<,+=ljǕ3v~ovvߎO?]x.Tݦݏ}S%\->G6})/v㏗;'Ըq4 � �  %#,`c+~9GʲU>lٸ[>C}衇vnNZ:|K3-#+vFZliW.P~l rM` i`ˍoIólx ۴@\Ìo&rwcw0yT4lor'KGK7(թ#^y~åɵnZ#Gt㔍yfbw � � � � � � � � ޱr@�@�@�@�co}bjդg,aZ#F:>l|v ԩ6_v?:Z-HM[δi4|=CǍ3fYnr5iy:ɧHW b]GJ:wv$]QY&@�ի]wW}ڴ(h MRT,]$ 1x>ٿclg -smGuTuW̛kuǏw(ԪU+pQn&.Мp-[+n4ܹsxN9_~ `l`ف+gTR0eʔpjժ˗/⋃ƴԣGgMztΝO.4+\r< :& . lc̓O>$|n֭�Nj  \`^vY-SZ#wGd [uAApa_Ouu.cʖ6bĈ7+~1>kǬ+T(P lG {4~ŊbˊLÇ\]nx.(l^z KvܧXA8s ʁ @�@�L>#}C5dHMZ` k)\q J\p۾6c;/r8c8GqNK3<g_s{9_M}Ng G u*pkm 5*6n̕&(X4ƌ opaAfAp}A0qb_&}gaÅ  4iw}7͛#� � � �$�WIMW@�@�@�@�|oޏ݆ @ Ani � � �d�}et2kSzj۷aGݏBV<A+=DzA.]7,(^xpUW.P+kr̙3'Տ[}{7<̟EߪY@aWNr&@�m5kҥf s5?+ x@Z:+ʲbI oXi+KFIcHKJժIImJC?,b)Wu䂴R<_ C^i&6l Jzxڵ:CvS…{7j…R�pjvڷ_8Q_/f{oIiJZj%4-mh ؎%Kfx=gw?"ڴi:4ےc*}Hemۤޒ3gJI=zH/˗ y @�@�p5r҂R6=H5j$@㬋mқo>;<;0t=zc;njc%˗/ǖ66{�dH3i8'T)֭eJ 7s/컉O?;j֔u9 uվoi֬6o,lw~7X{E�@�@�@�.~],@�@�@�N9;@`n<pW!� � � c/GZb~;H]|$|yiynݪe˖U.[W֕|1b;;>7݊S"�ij@<vKOWz{x>ٿ{ߥw VtrASHVժl^qW: 5ci$n݌/Wd^ +´~gTWͅ9 JL9*dҋ/ʅJ]&uhCX � �1 `Z6&ЧE`-#p#ͦ G\ZM"4~z 51te'}β�-X}Qt~Bvb\TB<1o<5o܅Ε҄ TL7D�@�@�@�@ JmQ� � � �d�{g'KC�L@-@�@�@�`/kI<#UWI7(oȨ#}=یF , � � � �-e͞=6M… 0N;MZVZTz!_<D B|y [?ۋYOgH JL GViY3>|^d-fDK.х^k p5g5drfҝwJ_.x`@�@�[ 8iVjF.kժPWL/vti*UғO>xOߤS%7ڵn{H͚\^;ͿN;W+5m׮SGnO:eZLMZk,w � � � � � � � �İ�{8_,uE�@�@�@�.RgaQX7��@�IDATMg%-^,4`dǮZU*U*|:ҝZQlv~orO@ܳg � � � G ҙg^S ֲ˔)S_%4_*\~;Y]MY('OW4 j+>ԩ'q㪲`3Ȫ0;vhn@jҰa /7=t9~ց� � @"|;>XV$ ֲ(U(*6 ۷Kg {xqIi E ó,:WW[eYeg+84nŇguT67W jloڴiԷ"� � � � � � � � �dN3ǫ@�@�@�@�&ik^[j-vOeScƌԑkkڴaQ ֲگdR%pc/'K'V;)nʽճf@�Y#.-k GL =zu~dT o ̏�(sNWsnRlWu֭QVm/j[Wj'З+Z7eV@7:4kV=լLgUV;T]f_zyi#]+JʩV@�@�_w}_}NZ2k[";˖'I$C;hpgH NhiƇfYx]~Q1%$ <$M'8;}̅� � � � �)u] � � � Ue$A�v 4j � � �9!x_N(':3pcjڵ^*tkr�ʫ[7kCMz>Ko:d{ se@[4KF�@�@�@�*^FNM:U֭nTi&I`j mt;Lm /3,j'\aV +VL'~&M8aҬZ>I)@VJhpt]R R۶rs?KJV4o;چ� � '} 7̉j@�׏%ը`z6lO1'uaZkƳkH,=teRjA>}+|oH66_Ҕ)~c!L+64D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�h\r!CW?)Tjǎʗ~xZ]J?M--k_K=-a&@ � � � EUsW%o߾? U µNQbmt-CUby`dE82'Ppa.<_Rwf[&S0=MMW^6>ZnMZ\9oΓ'ZM{@�@�/HĉripK3gW?  }'7,5k&,)s4iذײ�%wޭzc3h}޹Ӈ-y*WN*]Zj6VڦoIkJ}OǫT> � � � � � � � � � � � � � � @4 ϟ濙 UVw3ʻwߦ-[jĈQEu:YظQ[E:Ķ珖@�@�@�@ ʔ);w$WY.ӧRl_TѬYMԭ[7X:pPk"e6=jkz7}{_ʕ3d^oiE~'r1 +k'=qu � �ijhed >` `aB�~%K?LV4x;oAKL+`K|#}x|Rj 'Z$* � � � � � � � � � � � � � � @,XPZ /7o{ァ#G::W'ʕD*-"E#<"]C=W0_v ,@�@�@�Ȁ@͚5enI[nٳp?Bhƌ:&SK?U_\@%Jd`%ꂄ꥗x3uWשR%p2#@Vfﵿ& .RFEIEfzY2 � �dLଳ$̚%=ԼtI>X |(nƖ �%_r'Je".,կ/x{^6?;, ̊g-\()xtrr'B-7nlF�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ȼ@QWm۶Ѹq4tH}U|喖:K-U2Z%,Z$+=tDi!Z' � � �Ĝ@]M򰫤n:Wu>`{o>!w)]c˛뫻j5P)_V֜^1aZѵ2zMWB#:vߎ@�@�H.p҄ r#ȝ|%U*qԾ3=sq1 њ6͇,/hYj1Ŏrf~<yJ|xVvRZbl � � � � � � � � � � � � � � @l w\;Bv믿oi;w)sϝ<N' rٽ{l Pf)gY � � � |.vYbӯ'iĈI.~]ʩBu꫏=tgջwz}*S&a%%L+K3ۥ^yG*P@jFG41 @�@�@ GN:.X =ԩt}mIW]EhKn V� '~4sϲo+5j$԰TDdnԂlzW͚ Obrŝ̄� � � � � � � � � � � � � � � �%KT^˒%t]oZjX}n;Oʛ70'Ko-}l4@�@�@�H@*U܀]Վ;4eʗ<xO+o=WjVjR*R$N9o ;P=z\$~0b}4|4jnԤRY @�@�%jդW^|Pz m:X\jE�H`Z5cdovjԐ<SDW!Q+n\*}hmTdսH!]B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�/s5 _OK\ U,xtU|/({֭5ke9"P�@�@�@�|E[V�|%H K6@׮ԼTPt:н{G-Z\;_⊪nЂ/P-Rc&L+5}n7_:u|aK/Jut@�@�JA{Z>*p,;튇^-}Uʞd'=}a<P:qbO`25sc>o^Ԡt睒]*{}K[٢EB"Z6feߖGZZu1R D@�@�@�@�@�@�@�@�@�mIO@�@�@�@�`} >[O?IK{/]H=zH+bh <d4a('pS466!� hkӦI &Z㻿V$Δ||'>M@ VƎZfIŊIVDµ6 >egxc]vYk/~ 2eRy"LV<⋥NJ[´Rz=+<r_KUHա/m` � � =I</tR^rcҒ+r$ hIkM80xIm \O>~Jk, :t頃ŶmH`V,pFc@�@�@�@�@ J,o=ڎ� � � �d�{g'KC�%ШT&ٗ#� � �d�}YRrW௿C8]$tT^gL`b_{}HZ^9!@VN(@�!ρ;~\zs||k`&@ CzM5g/{R۶gKGUss1o5DžHpc'Q.M#FH;P+ȵ&ȊmEHӦ "L+GÕX0Y̙a}{nݜkkB�@�@�ظQ2DWZV#ز3ϔfH;TxN;-{@@ "y³fϖ֯'Zp]dTB"j{m J,X ŶM+ Ͳ@�@�@�@�@�*1 � � � �{s @5,@�@�@ m6bضM3FOK_҂,`ڮѿ [~]@oo"ɉ3 � � �$@ٲ 7ҥ~u(ysC /a=%C| NջNSVMUP͟+ 5I _uPyz);+Zk'?ZVR&ʕ~*,;}oCNŞؼnq>6sgV@�@�[ˀGi0'oM:n}Vj)SF:9 ~uo*Tۓzhw*}|HV$4+rhfyJG!{͇hYp1!� � � � � � � � � @b pwbnwz� � � � vM^YS2kֺ2[}.]%Q&<v4a4}:aZѼn6@�E`ti_aDubs իrOx>ٿ<�Ī=ZpJ.n@B8͜\mۖuacy);LP2ĎiZ|yi; X+ZT:(cZieݖowq8iT\t%RfRY.� � �-`!2#GJO>)͛?S~dLX^:P買7K>gy rJswgY1ZN*V̩VVY H,^ic_U, ϊ\…w_@�@�@�@�@�Q߫$V � � � 8{6<�d@FR͚YD� � � ۻ ƇҀҋ/J;vHW]%x=^qФ4lX'{?;G@�@�@�@�'pm…µ}V:pMU'OsqF9u,=О#+xx_??� o aZ\[ָqҘ1KhmK-[JEdf@�@�U>[t/&HO<!5n,թ#Yօ&npvjAd￟p5۶IGq�9!~,$| @^uڌ6IM_~~)%;Ԧ%jɤM :Hދ"� � � � � � � � � @z8;=J̃� � � � @l0ۉVo_|3HK+tdL+`wl|2wpe@�@�@�@�%pQҝw˂µ ʗUޮ- [V?,]qE_//Yq䓅jm*u(M&tRgyg}g)̃� � �Oys.BcZI+K?.r{,>{qq9E�Xh}dTơ4nUq#Țuv~fYPV% = G;c ]mogL � � � � � � � � � @VpwV( @�@�@�@�C"znA7Nڦg)ժR)jd-y iפCݿe P+Y � � � sժI/}'l0R%m[S'c]۶)oތ6~qw}͊.\(/go-P͛FڻОZ;V:qa_}U:\X=_# � � @V r/HO=%xo]'|駒}v<-Rdˣ͂{7e,,+S>=Ȝϝ+}Xxֲe>ނօJuJ/(,#bc,emR5VTa˳ � � � � � � � � � ,@�@�@�@�`/:~jbuk./;ev5X=Ν-sf%sy7en@�B`ti_aìX"ˈAVю;&և�D7`- ZH\Yj·kժv;'LZLcH6;xԭ[ȗO:D_7ccMrnJӧKi/-XTzmBf͒Y]}τ� � �䖀/=}ԵtMR)[d'cYt<>>/rxס7ӯq'aN в<혲bEN.Q?ǿY+`W'͊ܶlꨣegŬm%KC�@�@�@�@�@ {@�@�@�@� pTx F5fy,@�@�@�KKU`rΓ|9ifɎ=5ѯn?kFGhEjS{@�@�@�@�؛(G|ѣ_}Wkr{F,ʂ;綢2u싅?Fݹs-۱ Akڠzڞ7/ۻ/ |iYqh+2|yR^RfR‰&B@�@�@ Z;iP_?i�}{[ VKIA{gRÆb'kYI'K[.W_ܹ].Kofu+DtԗdzX{'ˊܶ`3lJuuUs/ � � � � � � � � � ]]ۃ � � � � 2kcY\9_W_~ZziS馛|Jw”u_~)+ LV֩f~cր� � � �ĵOH~*YְaR>RR$\Z5ϰu4vdaT6Y#v4hԵ,-XUkw#l=$}Qn:߲Ez]&#.ud6eEm`bZsKI $W6 � � ]ŋK7,pzI|ݲTdymm޾]?___:U`x,\D BlP/R ظ_gY֯ylvmK}(._>빗q\;2 AecT] Ͳx x � � � � � � � � � {{@�@�@�@�`/EY^ XmkF0AOj\:XgOcGHXUj^}Ԡ}-Ep@�@�@�@�z$I|õ}V>}!H6Z_$Xqgϖ & ֲv/K/XnaJ6YAIy|gʶ[p+[ߎ:$vH O&,_[ /HꋭT � � |WHC->&/>ӧK*$6>n[�g< ΄@" 87 в6.bSr><Nƴ,)ߌ XE{eYxmX1J9,kWBﳍ1!� � � � � � � � � �$5  � � � @ 0ޗ{�#h/KO?-pt睾jnRٲΨõZ If;jζ � � � @ Θ!f7oˋ݋r[^{M+qDt w⋋֊ ֟Gx#zڜі FVAZm&n>Z&H#|tRRf~@�3rZ<DTTL!!"2ϳf׽)dL!C2"3QF&snݞNgs>w^}a=<?@��hf?Ss)rf=͚7/2&tٗ_}i",-^$[QEΗ]moA8EΒADkt3U5[-%{T6u@�� �@�� �@�� �@�� �@��g� �@�� �@�L�{_!?]ƶ6:u2ᄁ} 0;]צ֪{67*]_  �@�� �@��ʎ*7k4zj_mٓOO'# M)'!:lƌBZn[$DJ ^ԩEnÇS`=̮֬o_- @�� �T˗xc=՘53HTKsByg-f2;T8O`YК46']zf; fɱR"Z٭Nwy@ K KBM61l3mo` ]<zK� �@�� �@�� �@�� �@�� �@߻<+z @�� �@�� �Le"JY|^hf7dvf^$zQNteW^3 o|UaDjU!�@�� �@�@x5KwFI-*J{f\RN+]'E˖--͛/w ƗolhO?~e]'rțb 'үWlĩ?Ӣ(JTsV΢]Fؒ_fM/:VF-c܃ihm̵#ƺwouԱwީڮ[K\/ֶ*ۇhg9 )Oz a� �@�@zÆ㦿Fg5?LΉoiֵk{ ͱ8/ŋ=~r 5T:ߨ�={147_ȪEck׶dK:k~S) )%9}EC6-Ϛ;7.˒älqZ3d6Γge4:5hV;*6߼H4_{g@�� �@�� �@�� �@�� �@��|v|u|u|Cuu;k,Q#ث.Mwl;>:ٶ⫓-@�� �@�� �@� .&{͙3ŷύC"wlҤ^hg&פI` ̩ lZjs-n-6gN(ZEZR5;D R3"/ ӹs~SLqo.hQ>A} 6/{]MP~T~{S]|'V?!@�� �@�� r;&t;ݰ$nrfcǚ=YEӵ>e…jY䔺BD:倝mV{A85DD:X2,#OLdq<8k|a[EuNc+v~Lɻ~! ::C{KC^SEmFKnK f[lavE vs, �@�� �!EBa~w>knӫ˚W*_˼y|okN <^NOrCT21+$e1/-nE<<ŵ֜;Q+gLcQ?9gͩ׍5r_EKcg4 믿iR(ghVX{={e֡YNE giq~hӦ-Ң=k꿑a8v3;mhnm.9BBB�� �@�� �@�� �@�� �@�� �2$ fdw[>Z'.!Zl|Ð-mv'?g-?}mkXb5Dԗ׉։׸u<ۢ1X'ⰵb<� �@�� �@�N@ &]g.dHD+6mqd3 9͚͜}gb)?oN Gl6mX۶mK.֭[7j|Npk"=4f7l]z) dGfla뮩s{'f̘jKLǒ}<=ZBhѷ }EYp DrKk߾mvֽ{wx㍝@u[JJKĕtt� P 4s¦6zY2( v[TQ/5Æ� ,)J%.s)vZɊpX˹88~_,Fְ3(i)O)˷VT,q8~-C>.ĵ DT2ng\kmD2kEZ3LL %ufӡ?� �@��ʏ|e7 Dcd|W<KrU F~; -|/Cp:\>=~~;,ymN~tךgtbö!ALkͻ֚Gys3!RNdZy֢E p <<󗀼$f_|zWl7EΌ p6crtݬȊ $%Q$ XC�� �@�� �@��rGxܱ&@�� �@��*//EcâxkJ/(?w֩|u<>:p΅xږG) d0W|uN>A,~-?x_q_k__ɊJXKZ['n<\+[@�ӬcG!C �@�� �@*9s{gK*AgA7؍7+UIgSI O^GmI/t1|wJLg=^zo{RqȞ~֯9Z43{y3^P^0g܎^6~F4F+M[w wANd߮VZ;<-s\bi.9. }74irƱ=XJ71 @�@Q"B M 0kIFVIhq- � 9A{˺=eqZ䓻ۊ\Ωw3jYWWujծ]jժr&[VbrM胆)M@h9y1?)x 9m9' [J.c̙luW^{Cm_ka� �@�@$9OĴ~kmk1c[ٯpC8@9Lpƛ8GVcqǧ#,:q'98jN9i>r2_F#یD֢9w|%kmFjZlq.cr>Αh YZuXEA \նq?^$믫\IpVՕ@�� �@�� �@�@N ST@�� �@�@P|zCu:l�'ȕt,.ŋ/ Uf<A7 y˧?Y\c⭃ίTFԸ"1x-[kv#'6?ԪaC�� �@�('|OýUڵ]UnݼʳHlKB:Ǐw"_ޒMt=[߾}m+nʕO=e6xGjvfgm.Hʙ$UO?=3^TOŎ.^{.HNYk#}„ {&lo v1p(�Z1I@� KnN=լG03FγN5B}~z� Phi3fpBE3neĔcm mn =-[$\a,<$ 6m/hzEnY  �!qxX4 u@�� �@�HF@SLq?%CSs$͛Jk-S*9ɆE6-[OXd\;KhkM7Kk6[lz??Z%[qYA@뫯V g[L8+hi]v/x,{}38{{\$_W� �@�� �@�� �Uʃ2m@�� �@�� K ,_8l_`+d|u< AHqa_ j)HF@B\!:CumOlSBk/:VFds (�={Kzl6dH !@�� �@�@(GŽ녴&Os zֻwo/L9#[/%7xg}㎳:Ȕ;B%0vM7)_7߸Nl+HX{N>9L?Æ f>3իgp_$<4TMfܸqky/}S;S�X>I�A5p� P! YpBQpè^*� Pde vXˁ[FPtNL-cI"N-o9{' ZNz%˼E:$[nE v!�@�� �#b υō76/a֭Zsyđ^t+VCa-a~)/G7 lmVŖmۚ|% lN{('S_]Ŝ[l(N?ݽs-sI%ϊy3a%e'Ua� �@�� �@�� P`W)p �@�� �@�@E{ԩ|j.\eZ_+:\o+q66ʙE\+:~ 1͋Lru֭-( �Zip� �@�@"}#Go^}Uo:製M+ ٷ^x{'[Ѣ"ŋ͚77:]zKwE9;C>`0`~^T+s q.ǓO>i<ӣG;쳭_~͏GF/Z  �@�Cw*hJ�W<I!y+ꭢ]@�# l%ߛSLk9lZ7 g]Y%j똌ZMr=O %"'o% CP�/[niYs � �@�4`֤I///ӒD6m-5A@/˾%؜nLHȆSҡCرm6֤I DOg-j7w]Q7ΒhClofի3kά}Y^o#j،kdW(&j./N%0s&IH+^,KUEh,ߞ%� �@�� �@�� �5Uʚ0C�� �@�� H@~?|C v]tsULb%&ka7k֌DWZK,Y#Z q %1z-6Txk@ =, �@�� �@@BZ+M3{キqvԩS@:V`/f'(UW%LJ`С>駟n'|rj]D.ŨQh#K/Ԏ9QF%YuA{�*)Bܩ$g&+g(+mE%��}W.;o\_9p+ٳ=9lK K@ aiݺVm]C�GO xH`evVz9{m%n%@�� �@�(�O?ۄ b"Z ] F;ңAj4ʎS �U0@Z;w/J,PVEV]fYϜî{,Y.gȒpV2gNQ]꙳ ZD`uꔬ|zbsEXZ/A0Kf UVXDCt)� �@�� �@�� �TAīTΐ!�@�� �@�D@~_~qZZ'B_}Pkb+6!)@oV,Zy:>Z-[kQCo$1l@ Uai� �@�@^x좋.y+8SQB,˗/|ی3@D6mZeLUr:6mZvWN2渤_|~GuTAqe׿e?.t5ء<*sj9b� �dGw#PWU6ۑ;۷ �-iR9i$r^loX%E>JENu -so٢vdM`ժU#4<yZ˯;~+xM[rԩSl&��@�IDATQs! �@�� ۿظq|ҥ )IJD'lYkM8;WĵvaiI&fW]ev}D芄Bg Ñ3닖 %q. rlQpij",iUvA(9KJ ,^ +lk"W&ǖ-M kfI,Kς@�� �@�� �@�� ^%A�� �@�� P˖jꫯlC]Ygu|*:,6 +WS\+Z#簬ʅСCfm Q �#V%@�� �@�D@b2_쥗^$^ 0@":\r)SO=p CTR/hַo:NGxO޺k*T!DB[xe٣>j}!Cx/_j/oZ� �$PȂ;)]ENUEta;̓ �2 g/&L[xx.luolرwU2v.k>FI�-Go_(Qanݺ߲w/rq  �@�� Px.]j}3~mm…ְaC֭[.<�#dOK -HٸvuWѣN)UeQ$L3Ty-isϢⅳEE# 1,WVDfX(?DBYa" DvXoAR� �@�� �@�� �@�Y ^%kT\@�� �@�#s8q?/ŖhϪUA>fSqZ$썝$IQy} PC.q[+⭕?aʔ)^hKvn)"Uȷn>7Z/\jed� �@��R<xi%xX+[n:tmfUc.�=ffʷ1krkfMslrJDYF٢Eعm^z:kTGy;묳￷6pq~A~>�BܩB1P JJ,7wz, P$|_'$ۍ5򎟝;w6-ڑvz*4 䊀Ĵ[{XfϞm5׆:D;_+`Cbz@�� �@r?}QLo A iXO[<+ףe@@ ƍgN)\IPW^{^{eM6-yf]gv! 7կobvm-(rˢZ*rg1L!ܙkƊ bYZJ:f-ZlYqĵXQ �@�� �@�� �@�@Y ^ S? �@�� �@XrT|xV2=n>K.~ݩS'wZyGK!P5 ,v]%駟z<\k[%׭[7wk-lAŨ!cj(A�� �@�cp 6rH˼rU":~G{U / W_`jmhֽX4Eߢjꪫ_~v}YÆ KX �ZH� �(dUU_N:_ȿo"T@P2m9q&Ez-sFκwmnj@"0k,l?IĕH<}ymvw@�� �@ ̟?^y1b&B h~"̻F*5qD{7"%NJp=ok9BZaҫksIS[79m/h7̵,"!,g*X 4bVBYA0k Wgna� �@�� �@�� �T8U*@�� �@�@Xt}6f--jʶ~{[u׮]If7O@ }_˷|soӦѣ_!jpMֱِ!Uc� �@�@U% w}{1S.;jIosyn /> .R;S\n^z8ʵM}V~}{vKuZ� �(dQ5U9[.{]ȿo\)TE~5/GvIym 첋_kΪUV0f@ iӦ{gcǎ>j ٻ֫W/ҥ ?0 �@��ʚN瞳'|z-^{Y>}uO`Ŋ~^,nӧ͍9(C9*ޮfmVonDV,:#VvK_Xg6sÍ:u$բ։"YjQC~6 �@�� �@�� �@�@E ^"6 �@�� �@b DQdQbBa+rժU>fRaP@J?^o^vכn/hܸq!-%u� �@��*/ ~[ڈ#lCl~SYAlSOc=QFY5Es9حꗳ:Br @$B8%׷:{ 5 j4 � �@�� �1˗/ A fHymy< 9rk9ꨣ|.\hOE]dM4-<@g}A}@�� �%)h/ǸW_} 4:p)@7%k57n wNhڴiͭz?xk.r>}If?h儫 X&3':3 ^H +ynuYj۶~jԨ}A�� �@�� �@�� �@�� �@�� �J`ɒ%> } sO;mvuY~C�eD@o_=\7|co_8 wqG۷_ڷo_FZ@�� �@�� ƍgJ|ذaV^pN.xbk\?mʕ.Au{vI d^oܪE%'0h {M+S߁~ѣ;ֶjs49ibrB�� fF6sOD) fv%+a38{lB�HA@_y`ĈݫW/ӧ_6hwr|.[{ `|s' �@�� H`ʔ)v3>j*(tGo>=- z!�'0˩Xq_O>q"w}hֆ6wn5߁x-f0YӜkc57N-%Du5k޼hHVH(KkA� �@�� �@�� �@�U�*U `� �@�� P/?ctt}g[!mȑ~Q-[y䑆V§JIgO͆ ݧ� �@�� ԩSxΝ]VbP>oRjժٺ.@sHK\{;lQlCT" s99;<U~wcɒ%{|~|*DžV9@�@&,i~�B™Wȿoϟ+ �K?{Ǟ~iS9Cl=4> TC"[Fgyƞ}Y|pv)X޽I_6!�@�� +mvO?(Tn݂#@!/ﶇ~ؔlS/v'#Ե2[,QGqcs\ZȒPV`Vد_? � �@�� �@�� �@�* � �@�� �%0vXש[ݿm݈w, f͚e=1fԩtIvZFtI�AO� �@��ʎD`w`&"'J<ގtUWY~lժUb [|-Z~w7oEf'O)SիgmQw{xWosP^wu^T+U|Us6tSGQʖ�Ze˗!�@�Y(d!p- ]K!�*A`ҥ>)ﭷj?7vwq֫W/ U `>#58 X)� �@�@V>3 lԨQ^@Ϸ.]du/A�G@ξw]uU5[(%{="Y%F � �@�� �@�� �@ kīd !�@�� �@�e졇2`+衇j'pt$NB̞=ۆj>On|Gyg:t(2 dK�AlIq �@�� �E`>dHv mIغu*_|a&LwyFŶZha~׾}"ŋcǎ>Gγ>*\պΪr/W/i� �@�� �%?p v۬YG޽{#Uh@~mȐ!6sLk^M6;yϕ,� �@�HI`ޙk׮֨Q#CL+%1N@ w*Xw x>?uֹj՚:d 3_L+ �@�� �@�� �@�� �@�� �@�ҥKE:;|lĵcĴxI � #мys;smҤI>+ҷo_:F� �@�� �@ $rwrd"U:^{Ikr :wl't=6e יgiÇ8�oʺR.@)\r%pBwT[uf /J(#Ui� �@�� �$E֦M{ꩧ{h 4ȋ1{?f袋lmBcґ4:}t;G Ut;ڵkW]3}|zO)N`c>x%.~+pvvG|`g*˗W`h� �@�I`֩S'{mر^Hk-(JSW'tbW^yey!+u;鸜3[nm\o4mZÉM_~99=6ǎ?~WQo959k �@�� �@�� �@�� �@�� �@�@qÆ mڃ>hv}6hР.[JK`ѢE#؀qƾdtbK;Ɗ_8ov+@\P[O?C~2o :~kժ.ηx/�zA�� �@�� �B/vN=2r*{`7Y~}[rmر]z /s*rJ=uW_mZ**:nj߾}L,[6½^Oয়~k7o7ܨQ#3Y]CP #� �@�� �@ ֫W/?i7t?kՔi7ʟEr>vyH\I&!9.[{g/RQSSNA|M1Gz>;6Lpq-$]xLWw'Aׇ59|ov6a„ B�� �@  (wvqٸq{~z-??]xq#烙 򫯾2Gb}gMLbӦM3+s[Y?g޽#;9]@߼F_*; �@�� �@�� �@�� �@�� �@�([sε~gm]v/>C*l T\9=(i] ,^_~e?Bc:QTHu<cϧ:W#G?#]+.+!afqNǐ6rWyLɍx\7C}� �@�� �@\|>QRˣ6J72} xjK`a&wu^<*=z1bZ 7θdέMP/'iӦv'g]s u ^:uT jU‡F!�@�� �@�Xcǎ]چn! N5j԰SF.2`nw9oO\U5"gb}XjUduonmV"SNvڕC.. U]~N<VFy>|w_l�P&Mء?pgϞ>>.8yC� �@�N`v9ؓO>iW]uլYBԶm[;묳ʽ:'tR6V5ۊz@_N?l.k:uM6lhת5׎>\ 7^_ߜhB�� �@�� �@�� �@�� �@�� �r' nݺJmˇ"}y`ri6-[ӹlcS#c };Pf#gXvmq~nNJ2J s5i� �@�� �@�9&fmf{qɫKeL~u]ۼ30\jժ6(i˗T2zk;3֕POskFzű% AG}N<DOVv&s շ,}P=J);EB� �@�� �@ |G֫W/;sAPIv4j[o fE'~XgS?{뭷I$^$׈AI8^?GuTE̛7%۾<@9yk~{A-G_{ 6!�@�� P0Few=f\K(*m""u&ʛlIK*y^|E[)f߿-gM9=?կ_Fg!�@�� �@�� �@�� �@�� �@�@2eOd#Ff͚y4PD riؔ&6vcI'GZNuo6JӗW} KNJ#~;+ @�� �@��֊K/drI<K2{`y y:/ZGVZeGұcG{W>ʋj7!^{ͦNZ&%I9\Iۈ7^ޫӧ ׻=wdv{ 4GvpWVjfuA�� �@�� �؂ O7*C?L3jO?avgoٞy,x7kZha?]prJ#?ܾkmٲe&-]Ԇ 6lc -[&E:/]d^{vܹO|@x6V䠒?n|]yCӦM}?nO=x.#~h<"C*{+$ƌc~m~<뮻ON>dc v3g{7ܮjk޼yLm;֞{9`/G{ХK_qеz̞=ۺvj߽0-uz7tw_O?}Գ￷=@mϘ1<L޽wPN5.S=tQG}#[ok.Sys3'tm۶͛@�� �9i9R>i%]q9ss1^7\i>nNf>G<nVOt$lmecCק_&Ė}Qo_á* 𷦚כYtdv??=.Box}[luY\Qֲ$QSO=_jOr1Wk:C=d'pBY4C� �@�� �@�� �@�� �@�� �@^PK1q<PZ+S׊۷>6qD{'|h֭J,LA(?gu]>O, T3&/bSfϒ^*F:Y]+Ao6ϫ}Kw}l՟~gŋ裏6�/|ub&MdwqGk|o~{WBPqѣy_RςA�� �@�� =[ꫯ|nJTNBDzL4ݜ*NOAd72UuF?Co++M]*_<(GfqǚAs=\ %|Il/\6 7^Wܹs:;C/7<Rmڴn͏91l.@f<:2$Q �@� sDYݡ9$0dHmA+JG߼ߕu@) T 򥬩|nwq9'`X7"gǜOt衇F;Swܱ9N Ŏi%\"q_:u瞑s}%RoCk믿9q.9F.AstwFN*ٳ%d\k믿/\쌥Q#_9Q'3GGyduY'R?T܇h9GPuzBqі[n-_</"'s:筷ފ>~D.wsi_2g&>>g}v#'FV΢#FDK, Nc#cKTV-?v]oxzQv6vmȉ\q~{֬YqI#qֱLJlҍ#SSwYfꮌEĖ@�� �F_%+hΣ9۷𗟋91ftsZf>':Hvms5dc4T#o7-!L5ٔo=]vtG.>r"Ծ?Nߞn~Yttr! p8?4^GNHۃ/&]c2p"aю;XƭP= �@�� �@�� �@�@*ī"q@�� �@�@~oFg̘LҫcFM4~%Z@Pt7?߳|eKFNPoؙg-?bwi'۲e%NJV\K:'TS/NMuMsɎeN֏dcջ'?lW|JM|}ӻx7]c<xpL>0]u;QXڸK޽{G.iqIP}.rIo͛:MJ@\  �@�� �� &x{L|>\ K 8S;xj$T6PKOAksQ}tA墪5;w){r;r'\y RQΏSN9בx.tBOP.]3LTdt,S^T`s‰ʹJ)N@�@>(d|[} "GۅΏw^@�G` %_oiF 9L%BQRdA95$9B}J=mڴmoG"SA,+j) {キm/:cԆp cDzPc_4 ㋒i"gvݧ$*2j?CPp�Z2\֩S;ɇzui&Fgq ҼyaÆa7#W9/kǏH4K>W X(ޕ 5qD 箻ǔx[rW`ޅl+ѸcJ賄B4.]lG$0v_`O� �@�@U# p> FV];IA*枙iGHYowܸq~|>0QPKmfcC1Su~^[x86g|6M^~ 4(]IųFi8i ΔC=䟙(� �@�� �@�� �@�OxgN� �@�� �hv(M~g5m47oo[ `XQEZe]OxuxZfV=#V=:t-ZCX3W7$6{N'&dDzN֏dcyd)w6?SwCy{p% g=%UR5k!K/.h]Z~%;C2p?jUF_!�@�� �! !%f2}tK/U){]գn-v,=- 4| 䍌u0`9*i[bT_dVm$kB`bz>l.[O!o6]K 2dr!䄙1cF5>  �@�� PU+?˰� �r!*NqOkTY^=]vs[o9as"XqzsD̉" &s6pZUOM6$Vnf묳}w[׮]c;8sN挟VV sF'|⏻[HbK.5dJΝcU!vwm6*v8,/9#<ǭƗpXvXs;vLdq?'Ns\rmc=Ѹ;ucķL%ǎ]xbtK쳏Αg/W+4+s4po=ٌ#WYĿo%k!�@�� �"9*VqNY=3if; sƒ>9fO:vm{lO~mC߶g}N8ةj8Y|6 ˝s=/NU:Ԯ:Q9Qvs:Kts\q m� �@�� �@�� �@�� �@�� �@�@i ȷW1]to<XqCfmb1Ŋ7>c[jcgs̙3ǯ'n~ș|v R#x6ϫ$qX3k/!UlƤV|{:u'1f\ (ɳov-_oN˦MfG@�� �@�� �TM=t�ƎodkO6Ul)d72_/M'ٵ`K^|!NAFbMZ<6'ٻMBLQV*0P@�� �"P2+WVTh�rEgϞ6j(/8:%GN,ra %W>erVB䐸;[ov~m8?~w?K?ĉmɦsӊo7~{M7c?wBׇ}X/:׬Y3\Z 1'ީ9}YUU)j׮ms{>}n_~כoyS7|c뭷^~W${ϊUdGHE^m-^xa+Ct"Ӹd3p_k )1zzu/#_C? �@�� PnH6uT`ZnT9m6lj4sBݟ>umIJT*C~]wp<~ů㟵g3 m'qz}TZi~o.T%=">;"dz8 �@�� �@�� �@�� �@�� �@�Jc;a9sfN>tI ?Hk\tة*Jϛp<nFxL>o,#~R]Wk__<we;w\ӭ\u>N;4kԨ|6tP;c-mU#_}Æ +K' �@�� �@�U@ƍ嗜QJ;TJLK糵fʧ6\ڵ6iҤ$_gLfS7|3fLVA]XbXzS!m.שލLtx2}H+nSʆ�ZeÕZ!�@�� #IVb�*)weȽ +JmWI,Ybw} >܎>h_rL>}M6Xmo޼y>-_EqƅCڞ={vl6YGkRU$lٲMr?W^?x;xjy5~i)xDAKVl_Z2eʔC%w>S;ꨣ|[b:%sq)q(YC MV~|IW� �@�(S{キni;eQy6LslY'~s@][ l` enSOnHSl׮]ж8jYt=3VV-/p}wxPts\qL~.IHn� �@�� �@�� �@�� �@�� �@�Ho߾֩S';묳,J1ĕ+W<`Æ 3kvaW_}+9?vڊJx2n|U~ȥ+NՏT⏗f{mK^{4hO}g=О>3}Lb%u>{.򪊀qC�� �@�� Pl^@&r} ڨ<kT￯qLfʧ^F&ZWʢw}mfkT<0ͮJyQV}ڴic}ϷܜM{Aw|_oLՋ:9$VaR �@��p:#8_:  �Tr뭷=v]w5\SG}%߭O>&*:ֹsgou?6pW^v饗?`Gyw9}tq'˽㎳1v,ӆDT$"{M%[oo5iOv-xPi)ɺWYxq1gb~7c 'Z߿6QFuG sc麱c\nYD;<k֬wև>cwYq3Ϧ,!ާ~_Q78p@<m۶ څ� �@�@ӝw0Δl惙i]Oyy*nfL6\ov';'|V:#nht^@{Kۋts\qLہ-Hbݺu3yS �@�� �@�� �@�� �@�� �@��2)yO3YqW}6k,S|I|L1c~K٩ѣG&l2cd-NUu:]-qoZj,y&md{bU{Y&F /VN?۵klD d|p7� �@�� �@rP{mFҩS'_?l-U+?~Ft6L߯lϟ?>M4u%W\aM6u&:%xX[RPNвn] ~^עnM{W雇r|Vp*12n� �@�@8?_� Dq^uc=GEiӦc_$btaO?=kq[oIuP|vEYƍu_K. PIJɚrsu=/wm7lͬ{lݻL_z%yٌ3l1(]}H=&GޓO>0gW_)ރ .6l0_'L?0<s-[z)@6y䜍~ kL>:!y>D)X /G /؉'腬d_>[dp A3Ϙ+YgPtMs֦<>0AJLe]vk1V9rIMeqgw/8t_Eﶘ/fފnŊ&q4=#>zE!�@�� P$yIT+ZJ:4 D6tAͷϗvNOd3]@eΜ9~2To6UbCXkNPd#cA$߆gֺ7YkN8 $հaCtMzeQQիw1JfoJ5w>4<d$8Uph� �@�� �@�� �@�� �@�� �T ֈ#(淛PL!C|ך4iv5joK SOٳ}c3c+.9]<w:X6Rd~ș|'~q=IC:ٱֺ.O:Y?U{^EWl=xlzP^~e:uvm&Al|ֳ;J-7Ҕ`m]vK{?n;StIvuו:� �@�� �@�J@6#7('FҪU+_Q2)|/I*D{`T6l) Fv#)I|{|ͩ.YĴm۶>*rڌo#z6du #5W%ջo6]}K 7ݗ?ɾ5Җ _it(� �9s4ѣ3t! 6iTVZU~J,$.� sh 7Rsn㡇㎑ڨ^zضn}ᇑ3:}]׳gɋgرQ.] ;NQΝs9'jӦM"H-]4r?:u]29#G~=]/_Kϩm Mevӑ3:Gu\2rxm&Rq7r](kCשΩ_wGM"~K}hk&r.vx"w��@�IDATC3x܇ bN0,Jc<O\_|ŨyQZ"a&?~|Ժuk_<>ȉyN>]z5z\nUޑ1֙646`hѾߵ[lY$jwM6\A͸=ƑON-T[[ouѿ yQ:@�� �r&LɉG.[/ޜKk:n喌A3i '٩[netP R'24W4tؾllWGN|̳MGGyd#\&q~Ŀ=W=kUn>|РAw۷ADoDι%s1ܞ4iRV[y)@�� �@�� �@�� �%@Ju@�� �@�@i(~HUt}XWVuQ|as{qy_Y)ovv_bݽ{w_b++ z>ٌ/qsLڸdİ"<׏MS\ȑ#8Xlc#Z1<L/tkmSPE e]"3fL[Y&F RW,ږ .Pq}k[]7erIP PUEg]UF8!�@�� �>dq9}U"1d6BU22@SPu(xaQl^{%;W˦D|.M7IUEQҜO6oh33Գ.mLq \x>Ϧdc7;@2W]uU6ɾ5v[oׯ>HN?B@��*ܹF6ѣ;C9%pmTiTVTn6lWg.w@� *]r%֢E s"R}9r؝Ȗ5m4؜߾+[p9a#s ^Eɓm-0'^-I9DcpK/̙3Mӹ9G g5ƜV7.]`s!b%sv74FkJSk%7-a\wIJg+^.a$&7{cI~ .Oz~gS_t3';͸=\9:XO9ygN/H_ �@�� P9!$?s*Ot |P'auMԎEIeft6pO炙?7'm N6 2K;ճ-nǚJ;v6\qLlm92sn ֶ>� �@�� �@�� �@� UrÑZ �@�� �@�IxE _y愫rwqɏnݺWvb]W/~g5ki&ihu~.n2?X'XJZG~$$ϫ> /Xjūǵag]e#뮿z4i=-8v+.I~naB ӬcG!C� �@�� P >>?8' .e]m:{Z66l)d72'W^>}o;B6nowQϙ$Uy~#Gƍgydvmo߾愂1~3X:JrSl6�j7y8/s"s>mrx -C��JF�ALWUVU'teFE]iGdQp֨Q#4hO]1|gEI>m[o& Zg^C*\SQ\ƑMm>=_|av]xᅶd� �@�ܬo{gD$osv582=B</gۇz.2/5E{ݻʘ �@�� �@�� �@�@$@J|lt� �@�� VOn0]+Nk\Gn2Ye[ >әW6cP"΅ zt<W>IU{ƔxNINUznݺ.:Y>PܵL_~ֵkԪϐ@�� �@�H$ ;`wyzꩉ/U|^LٔnV6leʕk֯_?{gOu} jۣ*8s]M'K".DU_|WFĘu5c � �@�D?$vB"c� P ԯ_.";sqP .d>mիWiFoڵK[MzҞ?믿ݟ9r=qvekeopۺkgqָqTp� �@�9+ 3sU%u[.]% zaLf"8*]E)'U9x㍶h"o8pժUD� �@�� �@�� �@�� �@�� �@` ԭ[ IH롇}衇zaNZjy78\e[ >әW6cּy2Ɲ=>U{پ˖-ۂ QF֩S5}vٳgСCɓ'Ga&L 5!�@�� �@�@e' cwy{[֭+*/:sL;Ӽ֤I|dBZs57ΔoԨQ-[J$r&dEB=R%VUJ pUWwPRTiǟr dD$$ʊ">WUwXW]sD DD@D$+ (H,9 2Wkf`&t9EUwW>Tͽ7n]HG+i: v� �gm ̙R&gYCJץA;B6  H g渾3{jkȐ!3fe˦;sj֬f;~nfWPV-u].,ŮHS{<o<;V-[]vׯZjE_q@�@�pJ.O?&N xπJkG`Ŋzw\t\t=9sO!)  � � � � � @�U)A�@�@�@ ΝuZǼy]vUƍ)S4p@/ʑ#zg}AKawB8_{Mrٳg^zcbŊN2pk۶msd}@|.0즛n 72hr.UkAQ � � � JV:ud`3ܹsҖ#g3/ OsD.]Z7n_~[۶m]QQQI^z饲PφCBQ)__s50 XBeʔ9{:!� j#v:\ +UJ JsAZ;p�%pQ}=z&M*rhBmڴqc%"#v޽0AG秐" vޭSߟJ{X F&  � � zׯ_l {*EGGގ$[`5j V;d;TN9sdo@�@�@�@�@�@�_*o@�@�@�Ho#G?ȑ#eH։k֭u5׸iӻHn1111pȗ/_KH6':͕+Wl<j[]ɓ'q…TkoݫW/UZ5Kî~QB@�@�@ ׯ5kYdI"j=?_~6lXdɒ>}*WLNY)^z%ev-vV۵p¦M7o2Xawd  � �+e{iG�Elٲ ?7߸?"<S[tEb`*vY…C0CTZEa)p͞=? #k<'Odn@�@�@\ʕ+^O?`VZPBؽ? U87 6h7n;Y 7B3 � � � � � � � � � @pȑCݻwwuB8uTM0Aw}vڥ.L͚5scƍ-'{첑!48_isB9LkժU1c={T^=uu|LV\3l@�@�@�[lٲ/ k׮5j-ÙMO?=[2/R&MrϜcǎqT*Uθ "5kָ8BF#T~uAk׮ܹs Juq @�عS*RD9Sj$x;$^]4Hڱ#$OSIV-y! w�!+`1O.{P>}FaÆn-{Ȁ� X0}Μ9nl21W\-[Ej#� � ֈB}>~3gN6mꫯVɒ%ӷ@ 0 volOm\|nYeT`~<[ !!� � � � � @ ^%1G� � � @R-? =~k3im.VXR}On;w߹ULjʵn޼ (!"&'pURkvX@�@�@ x,XkF+Wv[  fpɆ  2D2er%gK,qL8Q-r籱:sg :e^ v-8Pot{j۶m^ԩSuNàjI@�C@8 S7,Tع|r4 'NҥK5k,͞=ۍ;D .@_~ԩF/[l#@ Cŋ?-\P6裱+Fd͚5]@�@�@ y{Ք)S4i$W)n.TiӦj֬Z.\8yc)"X:C3fp5z>|j׮vک}&@�@�@�@�@�@�JXF@�@�@�Tߺv?ZT)խ[׍שf@�~W:~VѣXkkݤI7?8 P+ � �   1B֗}ݧ׽Jl>۳g ٙ<ySɒ%K|m/[l[SO=G}TNY9rA)oS{VΜ9gRJs� @j%oҀ+,NyWK%KJ{ޛ p}0 ׯ׼y\%o?˗O5kԥ^5jPժUy�Yǎի|r}-۷oW̙u^zn_."EGGGG� � @X#N ͝6mA5\ 76hnEEEs\`߾}9sdY*SZh-[y*TPwš � � � � � �A'@{;%@�@�@�u0-q͚5:yʗ/^_venz%zASx �8tV\Ke~<yTvmY komc…]B�3 uf>E�@�@�I`׮]۷,?O]8cJ姟~u]7z}H]f9=˚2e&NJغu)rNaa[oQŋרQTz.BPeAcO>:uꤡC .2FJaԊ3q"��ZAR\@p.VY^4rdX. $^ �*`լ%KG ٿ ձJBwUv3ܹs!Q."R:_j*^bheZٳgwZj-8g@�@�@�l Ҟ5km"5`]Zeˆ�G_vׂ hViJ*.lI&+؀@�@�@�@�@�sګ @�@�@�He}NJ/^,><qlZlV`,YRQQQ\6�"`uȭ?\[{k׭[ϟ_^z.rڦsQfY/@VX@�@�^zɅiUXQ=$ W^y\rMw^̙SYf=mZ`Æ .Pn…8p}Qʕ+wt۟={nv]Vtw]#@jEX@�Z@>=U8p_ج| N ܁p}h@ t~7Y?Z8Xh V.r+gGHuǏ(f͚*t۸~z#s̲ < Fu%hLRLl@�@�BCm[y*YPϰƠUfMw`#G88J_{K ٮ &נA*W@@�@�@�@�@�@�"H*t9T@�@�@�Hȑ#6˖-s^rmh@Zk+U?Z;l̀�#\[ȝi&e}XPvRJN! $K@d1 � � vn~]w/PϞ=]=رc#;~):::cD4wqA{s3<B"oL-|4|piƅ Z_ +@Vw@�Ԋp)My^7ߤh];hO C�\'cnhJ-d*n߾ كzDj,\˖-+(4@ ލw-hl֘8XJ׸:FYfMb뼍� � �OòСŋkɒ%A5q3V?G<yHg(qSs*vJcABjժ傴 � � � � � @d ^%?G� � � @Z X=V ֲZk.`PB|6;K,iYD@ ޽۵G8 lsm-komYk a߱H5N,8"s � � )&Lp!:GzS  & ڲenf=*TP! رC׿:׫W|kϳ~igϪ-DK.ک&@VQ!@�O@ ig'=4{Ne�\k]UH+nڴɅq^-:5ݥKK(!n9b/` "6o]ݰN^9rԾ@gFPBl  � � @j ?~5^l,oԽf͚^xa|ݟXj۽K|RHl/bcc=5zLZ<zSgH/U@T@�@�@�@�@�@�&@{ 9 � � �Ջ:YՃ6ZY{?&&2::ڵ)-SL|kkm.RS 8|p|{kk{ Ɨ1tv-@4P<R@<- @�@�HW'NO>qRZl[oU۷W̙ӵ,i3 2d={o߾.4Ȟ2 7 @ -z!ɓ'5m4^裏а:5@Hx@� P+cc4JNj/J/ yY a5p}`@�'p1 U^ʬ, UxqpӦVՂ6o&ALB[H{nm۶͍[n=mhYnsc|ٲe={vq � � @ ؽ5ආ6Z*QC]$߱܅ es"{mk<9rk;UTzkCG�@�@�@�@�@�R"@{ � � �uhuUutӦM:p@drJkk{폁muLc۷Ƿk<p\[`׫]~kkmmv63gNq bj  � � @ X}'Oo=ݻu:uS|kĉ5jN[n%JHEP`ݺu.|sرzk5*lAGy4i;C:u =j鉡X �'@Vsp=#ۤ\sY=hSC@�4@"�kZ6-[N cǎΔ0QQQ*P)rh`nޟRY6MOcXlѣڵk76duh?o?~<أ57BWdIG.Z'v 3 � � �.`vZYe%l5wk_*UYE@o lm-!i 6g<{c`avع|P Ҳg_) � � � � � ^|X@�@�@�2B`m`YxQlll|񬝫EomZ_[X ۷/͵]ۼڮAy~V?!pj#^jh@�@�@�~)}]=Ua tEZRƍ2`_]_֭[O>С9uq8r >|[ծ];ؼys'M0d.\Ǝ˗ghzիWRDJ@�2B=}Iq|twϧك/wX4'N VۯTX9 6Z%Cl\es˗O\piou\Ix:&&Fp*i޽{= qNm OXQ<sf 6"_[6o3 � � �.ݞyUZ:I{L^hNu8Bv[В.}5>˟ G>wLSAرc{ioFhЁ~Mm4 O=Jr!4~Tc@�@�@�@�@�@ hVl@�@�@�2Ra[]^ڦ}nNe'vyyvub [ k=Y'vm~S)g@� P+?G� � �$G`ɒ%O]Pʕ+5kVկ__M6Uڵu嗻l+?]Hŋ6m䞇6kL]vQZd; w1cȂ̙#.Z@kTXQQQQewjѢE5kfΜ:>S,G.О3�Zq(% @xXKj$8\tp=BڼY^gX0>Fq@� buOÓʼ6+Ze`u!_۟Z%q-tFsȡ1鿶unU>zhh-#^BhRCOhDŽ}G;00-aZ`9{B\/@�@�@� xk<Y^$/ݷI ȫ (u,/P+mؽ5ֶp- m7C0`gd!فy^ݿo'Ormvx?mfڦvmA6nْC'Oq 홈?ڲ 3}s`ؙf΀� � � � � � @^%X@�@�@�@�:u`kclurb]ӄm[[l ]kD7 B lw'OXG<[Ǐ'f~{lޯ?4QRD�$J@�@�@�غu >} Yv{.YX1լYS*Ura:S|y-Z/h}YXPg͚5nP~N p-Znݺ~@ 칷XM6ͅXgڵjR*U7~'vJ¶fÆ  [z왾Xl?CZl@�Y\!rҸ?,U&J^Rr,7 @ ITlZW NlwHұ_)ٯTSb~nm8NEimigUNjI"mI`w^|kLWOljwm=@�@�@�j$i/U 7t *^<i~5޶{z!p©66DGg?3F؁vn ؟'ݣ6Mjv[,{}净b9s^y>Vy1*Yd|U�-[π� � � � � � @( ^%eF�@�@�@�`k'گmmjmu NNns[]_[=FWm INIk^xr]Ks+::|bosmSk̀��Z>@�@�@�K,ѢE\ȕzeAX` .F{Ffўa6v킴9?سrʹpʕ+ڵkL@ ctR{?7a˖-?U+ݠPB6w?fP Z իS'KI!.@,b@� �  ĕӻb@�@�T+_xᅩekX;|jVܟ|b+:mmCb4~o[Ɵ~IU+/{(YMm  � � �+eXiĸi0K͚I/$u$bQږ)+ƔñFفC\+;yLJXaV.ߏ4p><p~m N-cǜhuIvbR~iҭڳĖ=@�@�@�@�@�@�@�@�@�@�TlAL6`4~[lmx`[ywb-[.7TݺoowmӤ\v~_u]:  � � � �D@|,1- ~ӎ;h86Z׻eSBuϯ"E/^\Jr<=?WKfŬ[N۷o=`D:x=M0�Z{n92@�@� @-"P+N EA�@ V9O<n<b|� � � @P xu%iXi yaPR˖[oI:H^>L ?PK㏥Rv.mXZT4H.iHwʕe+,� � � � � � � � � � �tY6qG*C@�@�@�@�@ +K/MӸ_ :Rθ"@h ̙SիWwch O/$@�@�Hk,YB-[zOl@�@�@�@�@ nQpfRb.y4lcҍ7^Ҁ[ٖϳgWq4ullG� � � � � � � � � � � � � � � � � @f@�@�@ }'P+}  � � � � 7JcƍsJrImJFImĽg Ij4.T*5]vY\ /H?.}4tTV%y� � � � � � � � � � � � � � � � � @DNQ)) � �-@Vh?J� � � � �ڵҳJuJeHO<!///յki=*u,-)EG` ̙-Փ|P +2 � � � � � � � � � � � � � � � � � p^:  � � iSz} � � � � �?KcJcHKJ J;JI-ZHY&XnU2 .H:TJ̙ol}ҕWs\ � � � � � � � � � � � � � � � � �*q!� � lŊI[[( � � � � @0 Xp֣Jժō.5l(M.mԦMdi҈R*xҿLQQXgrUmIY# � � � � � � � � � � � � � � � � �) P+r� � 9 /N98 � � � � Q J>(U$լ)Ԫ4kyRRLrZؽJ<#]s)(YRs㏥c/&M@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� P+4D�@� ڽ[ @�@�@�@�@�[Ii\{euO>:v͓6n^zIjX֮zwxzzI+WJMHKzΰ>d@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ n) N"� � %Jĕs˖(/D�@�@�@�@�H}ǥ3;J5&Oz,֭{NWOJ:t :4T"}]4|x5gTj-{C�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ j%ߊ%@�@�8/eV_6 � � � � �!&+M*  +&5m*͚%/-_.e؁SqOnAڹS?^ʑ#v&iFZBSGi098@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@  � �@BR<Һu\Jʆ� � � � � GJ&I}JEH[KIJVI˖I=&U{ m<رRR}iut^ rS\|뒅1 � � � � � � � � � � � � � � � � � ,j˙ � �!P<Zq9H@�@�@�@�H#G>z ѺZ_{6xJ+G$O'+R V 0åK[j8 XY@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�2L@ g � �(@V$u@�@�@�@�YAih[7pKO>)m(}tRrᬐ6Ƕlԯ8EGoBZٲIO?--Z$H5kƽM=@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�R&@VX @�@� "6VB�@�@�@�@�J`^飏B^^ڲE[鮻%!U]\Fm6ʗ/_H? {qoUxq(2"� � � � � � � � � � � � � � � � ��Zzf9.@�@� P+(O B�@�@�@�@�*СR6R"R~RlҶmҴiҭJEuS,psM:vY d$ҲeRRzKGt� � � � � � � � � � � � � � � � � @Jk"� � p{o9  � � � � �,`AYo)h!]xtRl{I;vH_|!tT`:,w7p4ԧϧwVo>̏8bEi 7wޑjԐfrQ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� P+7G� � eڵqSE�@�@�@�@�.M_R*QB?#;믗. .:Tz5i0FkU\8+jդfͤ}@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@  ɡ � �je*\e � � � � @['=TTRرq!Z|"u.)"ssJ.=԰f͞=[zʘD^-Hniȸ@D��@�IDAT�9 ך81A8t@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�t P+ݨ � �RRjq- � � � � �-j3RZR ҿ-YpDžh .u(ȑ%ԹtOHGV޼yպu�£#͛K:Hzǎ ,(EB�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Tr  � �"`\* � � � � @,_.=TtE/KuJSJ۷K'm+e> G^VdAfQQȑ#եKe˖-!lh/ϗV{́!� � � � � � � � � � � � � � � � �d�Z@�@�"Q⋥+"9f@�@�@�@�@ //JF wfͤ3[ޒZ2gN8o֭&L֮]EgϞWK?$-+ p@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ l SɁ � �@jqĄJ)' � � � � :'OJI'+'ծ-)k'͝+m$ԤM ?='7VW +R|%1@qߝٳեW_N"R@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�k?@�@ ,P:\*N@�@�@�@�@�`gfI7޸A%KPĉRϞҢE /ȽGe2EzABZQԭ[7eʔo24 J? }tR?M( � � � � � � � � � � � � � � � � @ '#� �@JR,ʕY~J� � � � �@l4}tmRR&'5bDSU8HKJWKK_ XK˗kŊիd.e|2.?.zJ:v,J@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�BH@:Y@�@ <,Lre@�@�@�@�@,gd曥 /Z͓!Cya>[=U9lE]`>k*Uw9uFRR԰aS?UP w;3qv eQ) � � � � � � � � � � � � � � � � @'""� �@ZҒ%w\ � � � � 11 7HEHIӧŻrK4pz!iʔwԸqcUZ5YEسg ͝;7Y˳P8!-/'evv-PgϞ:W;wo] |'NTٲe5uԌ/L: S&˥B ^>_~.}ށ.d  � � � � � � � � � �a)@}< � � � @ l۶Mt?#=y5km&Lb1666M @l@�@� Xg[@�@�@�@�@�8tHGpayڤ~ 6l5O{|%_U~ '?М9s?'{< ?>=.LxS`[jI+hݻ7/!XhX~wnM#mPA1Cz-w5^ݲeOu'W@�@�@�@�@�@�@�@�@�@�/꣇h@�@�@�@�"G`ƍ7o>3=I'|r㏲#FK֦M+h֬Y*_1ݽwȑn@�S@du@�@�R"pW1  � � � � �}K:Ņh]w]sg6ofϖwT)D*1z뭮"O<<yk׮ɶm`aHQ;.p^9rHUTIj:ïZ?{J*O[&wZր8R~+K.7nEڻOֆM ,� � � � � � � � � � �a#@}9 � � � @ ԭ[WsY<SL_?+::1,'_ֽޫ֭[}UXz'w)_|9k9X�@ uK:c+ � � \v+p � � � � �+{R۶R"R߾*I"m&yJ^ptᅧ+W *;zG}>}({.xW9stv^`馛n8qU0իiZ@u^?:.]:Xn岜qSϥjդoY-ZTov6nV`!@�@�@�@�@�@�@�@�@�@� ꣇i @�@�@�@�"\ sЫy&kYK.D͚5_&:͟?`"т& jɣ � �+;T2Z{)9 � � � �T`y!8RVqnWaL2DϾR^%2P`Z%KT,YԴiS<xP=z_a޽>|:wM6W_ t W/HI?>͛.]h˖-ZlFڵkոqc2wp…̔)Sպukvʇ [>oӦz!۷-I&SNFwjw%^؋/薳,e^⛽7b_~#<]`c=߭[73ܹS?ڵk'  ;\\}doOYٮ'|R=+w>_~e,S@�@�@�@�@�@�@�@�@�@�}}wE۷/è>z_ � � � om͘1Cwqgmn5k91cƸ> ?߿CA7׿-G)***p[? p}R$L2y@ Ej@�@�8/'P � � � �BGʛ*Y4qԧ/_J*[[G Yz7\qƹ oV￯[n%~'`/;_s8vL^X5qijҤ٣Urٳ rΥשSǻNt C{={v-X@­^z%w-*(֫WUe۷o,|*FZ֭[]H ʑ#jժq{ *]Xܹs.T^?S./C޽}{׫A*U7 \&~j0yҢEsNwQ 裏:? ;{oC)7 � � � � � � � � � � @p /:qE>zG+ � � � �fH_bҤIʟ?^zիCɓnsulҲeK^Z3gvK4lpgz}ggZ@�M@sbi@�@�RMSK � � � � T&‚>4.D.Jy{˕+뮻N۷o_5jߎߐY >6g8v֬Y=̤wJ?(M YRvZe~raX>J: aEkyKe/v[<xRk~vl}%5jȅY5kLVr}.˖puɂ:t0ٳgNJҽ-ʓ9stפ?pذaۆUuwR56 ޷fVU\x7 w\@e:Oo?tۿVXΩU!p] � � � � � � � � � � @ ?WW߾}ULQ=|룇J@�@�@�@�%p3+Wx饗3x}R…u0˪_{1bψnIr?GƙIq|� pN4 #� � @ ԭ+!3T$B�@�@�@�@�2T_[]*W SڹS^2sgyCS{Oz#.~9rp]tQ{ժU=z4=fN7!C%/a񊉉Bh׮]ѣ[ꫯv>u,*PzuEGUy~w7*Mvɻ&k*T}e[ʛ7X�mǖi޼yիW/_^~ k(66օ~߽od˖-~fJ.,[o.C#Gt8p@ƍرcwmu \UJz&m,)ĉZpϧeϞ]%KtcʶZ � � � � � � � � � � W \>z") � � � @x ^ZNo]`4hSK"3O烽::5kc}@?irH3le@� P+i>A�@�@ Mԑf42Mw@�@�@�@�@�4lRqYT4e}!}{t8y}]Ur~;ɔ)?[A5k .t˖-^_qnj?Ϝ9{i׆ VrX-?ϲpa\]dKg}֕sݚ0a/RH+]xT[|BPW޹5V<m۶ g:u@�@�@�@�@�@�@�@�@�@�@�`غubcurR}s@�@�@�@ <nݪG&7CQ.[Lweʔ=[ܻwoWH3do@� P+QD�@�@ ڵK}@�@�@�@�@ 5,ᇥUեޒR1Cw֭,YRsnkZn/ Cׯƌ# ;bX ]kN*M…G&ճgJ(-͜-P딅9st!-X+~o WNw]ٵczuW7ߔuqqң.]뮻Εo]gYX^ HC֬qkKH'NH]wX~X@�@�@�@�@�@�@�@�@�@�FP]u-s4 � � � �&T :}UӦM5zh+ի~NRJ^##$aD�HT@DYx@�@� iΜ{A�@�@�@�@�R*p4tR 3>Z7K&ҙp{K{ZZ5jx vnbTrԡTի>U-6l~ѣGSfMC=v5̝;W<S ̲ - zUX1:諯u]s5g\߂^)RD*U?.UPܹ駟KkJ}ƍzj|/ ,=l˂?dɷbI@�@�@�@�@�@�@�@�@�@�E **;YfrHG觜|^ � � � �@R}3T&S#F /}ݧ3g~o-۶mֱ>l^}d홤-ˀ� pj![@�@�@ I+WJ{x� � � � �ﲰʔח>LU _9BҢp۷oׄ Կ͗(QB۷mٰm67ݷo?ްk.7Ƹ5(W3o*ZД rSLQB�[-&O,kW6mrS{]yرcժU+[uuy׮wzΝ;tݺun Һ @}l![6Oz~Y`ѣG2e#5kVu]:~4i[ƍU\9թSm+1{/4{mmgg;g#� � � � � � � � � � @dS-du? Gg� � � � I`G>D,Lkȑ.]hҥX'NtҰatEo?nٲoݺ5="Lx� bS{IfX@�@�R"`Oh� � � � �d3;|*y>:Uߤ֬}V^O.`rέnݺ+ 0@VrIӧOwY(/>[c {&TI?O?-'}Tٷ}YeD ueaWvf͚TVM5jŋ]eƂ GqM4Iַ~= zWe}W@.n6eObԫW/}7n8tP7OΜ9էOPLG͚5SժUկ_E{uY<-0aÆ?wTge  }ݧի'8eۑ|yyJ2DNg!}ُ[� v=u- � � � � � � � � � �^uCL}t꣇ڵKy@�@�@�@�NHo ²"luja}6)RD%Kݻ]WE׮]l2+b}TEz\Vl4sLeɒ%~ ѣ^x\֭[kʔ)$d �@Io8-2 �ΝnDIM&Hx}'z J;vI(F xCy~]Z � � � � �A/pX\`ر /WQL^xd0ij+VTK/S",^Cu(/*.-9ÇM7ݤm۶O?ҥK\r~ mذAeʔQtti ڵk^bMeЯ9rRRPn+yfAVBɓۍN]'*JE‘s � � � � � �W@�@�@�@�8@k̘A:q"C]vQ}QLW !J^]z- � � �@ݽ}cs־Rv/f>|X\p ,Můsg 2� b)^@�@�@ U5fNM@�@�@�@�@ Y^2M*Y!+ծ-w_\Wӵn:?hi[Rz曓eF#GT֭U@G֤I$,*$W,-C޼yO[59aZ;k֬n3!wܪYi7) ֚<Y;wd@�@�@�@�@�@�@�@�@�@� XG>z � � � �%爬˟&=3A�H@tdE@�@�HͥResl@�@�@�@�HTaiW/HcGiG~.x@^P͛5jjժM" {H:H5ją%b׮]6mzUX.Bt,M?{m[bp � � � � � � � � � � � � � � � l†͛7'{D�x2P@�@�@ǥ3#G�@�@�@�@�T8p@92.payEqA4<#4g4pTL:M6}vM0ٻx)z4iR+ Q@HFX1&v%h, E bCTDPDҤ;ϹY^o˽{gvv9ߙ;9OP9*VX[IyS}nۮ;^J/ٳG (XD"먣4׬ZUZTGZT@�@�@�@�@�@�@�@�@�@�= ڣo"� � � �$ b?tTm۶1|sL*�Ud\@�@�@@։9mԽ;  � � � � @6m&O&LN,iI=$st!<L +W.}oQ=;cY35nӦ^xmfkWR%j{uo6^Z۷ĉ%[ժto>- � � � � � � � � � �$@˖]U zɄ.f\ G{sp@�@�@�@�|l2xW)xW/oߞ$JRҥ3-+UV-ݱ/@ H֧#� �$@Ҕ)Rʁ� � � � �&~+K/I#/.u"=Գ*=P'NOJw_RLj.UF$6ʿ[:oqe˥>.Tnw->S@�@�@�@�@�@�@�@�@�@�HMn2eY?j� � � � @: |2'N'"�Q]h1 � � @cE+]� � � � �"z4rd9fjH&S4znҠAL+YK:㏥+HdԿ:Ԙ:&@ǎҼyM7I'-X%L � � � � � � � � � � � � � � � � � P+Z)C�@�@ ' 4mZ ®@�@�@�@�@ /zH:Dn]ɒr4n~˒%8T)JT%u$ ZH6KK&}T<hնtiC@E@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� VJN*� � I' M5 � � � � +K:t4S:0iČ$ZLwoBX"!ktRŊر A 8B3'^9lXFb?LQ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�P+?Z� � @ v|Sڷ/a � � � � Iw-}ԤIF#^]ZN3FS*[6)C!SD+%6'O*WNJQ(ZiN2>oߞ2U" � � � � � � � � � � � � � � � � @ P+O1D�@�H=~?YJL9@�@�@�@�@0ϗnUj2c9R:xi4iZ'3ϔJ*̣/><#K͚E k! ߖz*mJ:5% � � � � � � � � � � � � � � � � � V~X@�@� X.M[@�@�@�@�H8sn6>Z5JE5KZROJHS4n7 *uFI-0hht1gHK6%u(< � � � � � � � � � � � � � � � � $JSL@�@�IGWĔ@�@�@�@�# I/]԰ԡ 9H~(-_. .tTZ֍ҥR~R߾_[b$P/Ko%h!M[@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� , � �%6LZD:B-;B�@�@�@�@�8 '͞eDi*Y3 Γڶc84l&왑rYHp^NE'#-ծx � � � � � � � � � �gFXBRE˛7 ɼO � � � � 8~gy"xW%xwI~̓~Cx8' �E,@B"p � �&pR:.!� � � � @ #͘!dI֯Z.<#VV[vJ^"zuYPH3O>ʕyO|R_2eKiذ'_(1 � � � � � � � � � �+а4~cTxz~ݯ!� � � � @ 4 ^^^ﻈ~~/N %B�P *#s(@�@�@Rn ~% @�@�@�@�@ v^{M<XYS$KDtu_H&L+Ocn$wo.M^_3@ vKW\!~ti{֭÷ � � � � � � � � � � PeH}J%KJ4+ю||� � � � �'P&x7xW2xgIr¯ $J“F@�@�R[gOkS@�@�@�@�T嗥 /9DCD˖IItP[ꐊGKŊI+}eKFFN<1kM]|y>֯<2g>oI @�@�@�@�@�@�@�@�@�@�@(H&cG~@�@�@�@�H =+ 8a� a@�@�I[7\9i„`9 � � � �S`6ixO3+VHh-7 5lRrlDBSJ|۶I஺J$@oIf/\[n+I2'@�@�@�@�@�@�@�@�@�@�@NR9xУ97 � � � � 8~syW<x7~s(  'j "� � %C7.5X� � � � �E-yRϞI lٰaҪUһJtE]2 {b~~^2u9s@R%3dI];[ݻO>/i߾s7(͞ @�@�@�@�@�@�@�@�@�@�(QB8k I}d @�@�@�@�@ J//J/ D;m(rj99D�@�@ o~9s+^5@�@�@�@�@ gs.o6lzJ:LCK/,ȑҚ5ԩҕWJ5k'G 1~Zڿ?s߱C:l3'RYeK2%Z/uU^Rق!� � � � � � � � � � h\ RY{Ojw,A�@�@�@�@� x'~Ń~/j/1OB�P K/Exd� � �9 t*U$b � � � �"edIOn)e?RRZ5HeJxh:i⋥ճ٘E$%Ko ml2DBi߮RQ'iBi>i򌩯%猿/|@�@�@�@�@�@�@�@�@�@�FcGC{,k~E]@�@�@�@�H\ Cy ^] =q (Bj!6B�@�@ Zҥ3:c7.-X@�@�@�@�ґGJ"M9_'r'Kuf$VMzyiziDi�rȭG }V*U*:+&{1cr_oH5_~-,Vi}tY3 � � � � � � � � � �R`߶vˣo@�@�@�@�_,_sx n�$� Q`@�@�t/CF밑@�@�@�@�x)}{iŊlf}'=tRҭJg$$Z/ +UmY@*%ٓsM,%;WRM ,>m=⋹w � � � � � � � � � � Pgn_Խ;i̾@�@�@�@�(* =_ ^u^U:Hhj%p � �,йT4vl:+Pw@�@�@�@�رC"K3#خT$YibiPm[qc{-W_,sIzIEwLB Y̑V̾P\4b4o^%5Y@j Hn޼g:X@�@�@�@�@�@�@�@�@�@� .`1 ͛k;`C�@�@�@�@�hkooo�/RR@ $Ԋ10G�@�@@ QF>= � � � �!`,IVvX~AÇK:Ho-]+=tYRaE-01c$K69${KKJE<,itR()V,ߘ=mr_o@�@�@�@�@�@�@�@�@�@�@p O*T<3c"� � � � @ ^~~g/N"%F�b$@B[@�@� C``o+@�@�@�@�RO6m2�ݛ}~9#̙cI]@V,E 5vH2gPԠ4}zw5ko"^UJ+WJ+ztRٲ7k-ld?@�@�@�@�@�@�@�@�@�@�b/p㵶}Je@�@�@�@�b#p~oo¯X¯o¯ /b^@�$ V4� � >G-8jTԙ"� � � � %_?_2!sڮT)CSNsbbyukFe-A>nMkj"=dy'GҽJݺI%т'Le|� � � � � � � � � � �"Рԡ I^X(d' � � � � '  PB^,pX@ 1@�@�@ wG  @�@�@�H  ~ю;mjΝ;k.7y?eLMy{ huc-'<9M;kc ~ObŊɏGNJ=r X*Ƞ~.]Fʖ-+?y?eʕS9o.R^_Dti8.mX êU?qZn6mƍ7?d'~?QUREUVUjkժ^zn϶ GϩJ?.vد˘C on3SP .K˖U%Kۗuُzݳw��@�IDATnOC^S{>|~n?+7?oS#6Ӽ=gD>?4y,?ˏg<  � � � � � � � � � �/`q0۶ms֭[DNmycZ[m8mdWU; mm_mGkv~շomZ#۷Xȩot SbE7tAnj@�@�@�@�H 6dSc}ia}>>Э[pF{ٟרQ#ܟQn].Hj˙ � �I+`ч &LLjPp@�@�@�@ G 26ݲeKi2}vh#6oxh`ApmQMiʕ m| ~j,RUi쾷e>ټ4X #ye67:ʚǖF`<wvܼ@A AY֨ɏ*Ur 4]w}cyRǎy(n.\*<.ZH+WtAw?ԩSGk'jٲkg'2 ~_ۼyse4o<kڵߤAjڴ|UG7߼Jcm{,Xy?/g[ݼ=?9s=ߒߩV&5 4P&o~-??ܦ>X^<1gw~>Ͼsi>!r#%l>e/2,a!?Ogf G;?  � � � � � � � � � @2 XΟ~I9mv{͵y?v3[v~O6}|dyk۾|ڬ~ַnZV&m?ֵ5eom^u[0kk~̚P̖yYmXb$rZjUUR%[`mm}0 � � � � (nm4o Scҥ/gu衇aYG}{e1 =۫?7qҿ\~;+VuxVZj޼Zh!#8Br/S@�$$;a@�@ ?]5Zw1 � � �!`d7n 'tyk~X y O>5_~DLe7ze^e>ٖ '3I|lǪU,IJFAnn}"`0t]{pc+a@@,G%KX|cSN9E7Vzhb}^K?oє)5ƅc׵馍?JUVAZcA [F>s@N-gF4X=#VyFK~ڳ=4r\s:~2Sug <aב"ua׎}56\O} hٳmπ� � � � � � � � � �]vجu"km&7lZ[̬dM'ujҤI$O~ҷͩ}%зr7k1,ovM}U?Ev6hwldMem\YUk pvc͚5]pp@�@�@�@�XlY? [>sĬό;%:լYpַg {hwiw߹^Ǝ޻پ>5ڵkE[&C�(\b>Tdo � p A4sȐB#GJwܡ)T)RSd$ i"?|Α/@�@�@�HjK05>GEYVh^,U; rj^>qM-y^1 $ܲeke[% vw ~ %*[ wNLK7̂ # |vv=/^<>^oN.es:tҵi5KTA|mpKdtR͛7OѢ>`uY]tq㡇^'F%`,u >fԂij5)QdpOf9[ DZ7>'%twR`SQAe%la YG߁=gؽ?ԞoFz@�@�@�@�@� ^(9 � � �S`ZbW\馫Vիݸf7fB *8k,42|*CڷےqgkmkjvڙƺuFo՘"8TU+i) � � @: ػӧd[v}jX۷w D}jX^bO8pm۶%;QO"B� V_� �$� L~9*|t K+_#8炒 � � � 5Au>Φ%uoɅl5.D$Td>v$$ڔmP C-X9X8 4Zj�ȩשSl)>Ћ/_~Y˗/w O ,i-Z$=o޽]FK6gYG;O}u{&)ynv=?]=7d7ٓiwʕ˔(k"-i%Hf]ve 2\y߁=kd}m>|y[@�@�@�@�@�T ^%.uC�@�@�@ =edf-%Pv"E*Ͼ! ^-/fmT-Ʈ5KۄŒY[d}_4hsÆ ըQ#ױpxf@ -HJ"� � � X?֧sugXҬ.]~5l>5sLY4ީY2=zP>}t駫TR@HU@�lH-KJ,$+%NcBT{SHI*_>!$8@�@�@�}'kb?( `'?Z@%KY`h"hU\o1<Fd˂ -т` c֭iWl C: :?F &{޽{VR>%Ӛ={&OY%Zv v(N?D>�i{F e˖6F6M  `,}۷Txq۳1|֡ua~jO܆٘A�@�@�@�@�H2UQ\@�@�@�Xb,oђ%KtR}wnj|@kg:>)vXR-b!e˖prk_,ћG۱c;]>q:شiSY\Mb_Z?�@�@�(J#e̘1?~>#Y)XW^ԩRP(/RoWO>Qjt9N(3 �UZq �*@B_-Rm�T;'~v5bt+G䑹#5G�@�@�@ v0˒dY ~ޖ[Oa[�%|,#*U]3i*`CKaIK>ujl7m۶5( 6TF2, 3D^c=>@M4Q]"֭['H)׋/qƹs]vՕW^nݺ]$|_~%lA>4}.{^ y"{c@bXgI,~=wsƦM.]{N6F A�@�@�@�@�H0UP@�@�@�%믵h"}Wnj [ڵ Y[]K6d ,6Om)SIZ`}йŬYR8y-`m-VբE lM-WZ{(9 � � {1aY<r޽էOuYJϮRj]饗^رc5o<Ը袋TjՔ+A�EZr(' @ P+uO1\{nQ,>4G1k@�@�@�T`.Pg6ZR 0\r.΂,Y)%J)v%@B}<ZR.K`d5jܸKdɏrHQ;yf >\<Kx֫W/]~ԩ+uo٣I&Mx㍺K/f[RMW@Ƞd_n]x/+V 'ʱKc%S焹A %Kg%ز{I9'@�@�@�@�@�xu� � � �&` ,/_|kolB׬YDRVY-}ظxp 6z[R#8BGydxlݺT.T T V*M� � �dw@{վ}{ק/맀!A֧?|uM7~2'@�X P+@�|P+XI*\Iv~(wx;g#� � �$u`W_:<4ÆڵkXP%ӱ{Sf'sN:K. 'ٳC (ASo(Q"Mӵ7nܨzH>/?ktHmaOF_.Le˖ߎ|mk|j o,'A|`I7m>M}Kicj\#@4[nu,Ois'ܲg X>M6 � � � � ��**v � � � y:Hu&}v,Yҵkժl@-Zp1>*O? (r􉶬{vԶm[7ի@ !HB � � �*~?^w}{syP!o{Wli<Zv,7֬� PPjT@�($jd�<)I^MPNzW; � � �$%�/2S ЪU\+Uf͚GKc[ *$n(U\%ݱ;Ϧ6Z.kVL{QGnݺq-{"|޽1bN|ꫯAHL^%z\2_}MUA-e-\v-Z$k )mDyk|"K^C:Sؼy,ַ~Y֭[pJ.bAllٲKi!  � � � � �Tx = � � �d'>ׇ~>Hsնm\;>ZmڴZ8k/ǀ�.f}g.]*{:v;NRD?["@HU`Bv� � �$ᆱk}tDP̐ݻwk̘1{b ]wu+gl� � bE@�b+@BspS?5$&UWI/ծ:r}ן#� � �$͛7/c= Xr#8"<Z\Nĩ�%A�D~`˒hIll2lhx|ps1jҤIJ=?ueGvm$ 7xƎ.]WF $܃[_~vRbT~pƦ$J“MH#% fcX[֑G:6gC=4* � � � � @aR@�@�@�V^3fh֬Yn6oJrڷo:Ȧ֎2 @='|"ђo:?x|:Sdɒ/G@��  � � �I-qF]zgԩS' >&u{qwy*WAC=z$H( z$JsJ@�TZIz(6\Q J6ՠ4xkB_I! � � @߿%A;_}lyz\PQGXK$BP]X@ X?Kc}hɶ~UVZ pǎuqǩjժ)o>Y{5{G]sJV6Ε={jW^|q.Qla͝;׍`O?%dYbkVP!b @ ޽%/9{a5ܿ,A"<A @�@�@�@�HBUQd@�@�@�@[Sq….Iω'(O8@\r PZ�^`ٲe3g-~tܹvMՙ"@H#Xv� � �oW<uwEx9Ԛ5kt7guޏ<*V>�("j4A�@ /j%.K>tҏ?*xar}Ϟ##� � �޽{]Yfs97ov 2ڷoCx  @2ؽ͒j$@6UV.XNҩA$TڵJq}?b'Kꪫu},%Wt}颋.c=e|qރOuZt+%i۶mnݺq.1G�'O?$h>s~Bԩc=V려]v*UT ˑ@�@�@�@�@�Jx:@�@�@�K'OW_}UӧOwmO>dvini%JH:P8,vZ͜9SKg ?puݍRx  ,@B@�@�@ n{w;\A*Uĭ<r^{M_|jԨ'YfRu�� � � 6J5J3޴IWOnkWVsd@�@�@� ,ZL6lݺU͛7wxnڴi#�E,m6}G.q% d#8B;wvcNTB".YduK:# CΗ[o\hW^=_{ek8_@3fhٲĚ;d;vt%Is iƍU|y`˞5KZ\d � � � � � - @�@�@�@L0A/f͚uG:3eЬMŋohʔ).:(>ԯ_?Y_bR8 P+@�@�(]4p@iĈ 76ͯUԧO}WzWt)w� � ra1 �E-@B/Utv?YiRŧ\q � � �/w^ czWo/UF\G֙j*G@ 8w\Hwq,ݻww'` , I&I)mS6ԬbŊ>}>l^Z,Kfo֮]*UOvO:$iӆD/E~f8 %.`̙Zf*W9u릳:x � � � � �* � � �i*o>5j^{5կ__}չ瞫c9&MU6'i&K/7t A^zB(Dj"&B�@�@�HiK|ɜ<f&MgqFv @ $'#� +jJ6%+ UK :ƌO-Q@�@�@� G:nNǎ_|Q?,Auncf @H;vdHdWXN8A\ppI/_c=V~KTB9Y ^,YJ4k,%ذa&L d.6wqڵtvکxn9A�%ؚ:uKnh;wC:\' 4m; � � � � @W)� � � �$͛OhĈ.ƀt'L)G`ƍz3hܹٳ:x)GE H'#� � @ ߿ݾ;6mڶmvTa;\rƏ3fcǎT<ʂ�$� Qh@�T V*Ռ:6jvҒ%ҧƧ4\q � � �Xj {駵zj$s9RJv @ XZR•+W[nug=%ްdH<ђ7Y' ,[̝ NU٣I&i.iK2euܫW/w\3@�_~q~m%@ ,X"L � � � � �)(@J T� � � @>6mڤaÆGQƍu5Ȓi/_>{buH?\s裏]wݥO?=N(4j%;B�@�@�D[o߯ӧ"9(U`߾}:sG>Sڵs]/@�r(|� � �,0d$қo&r)) � � �!0|8נA+fM2uNҌ8OG}zkƌQ?\#,UnI?&NH2pnިQ#?~'֯_o]\%J矗-$q">)A\r޽akVuџ'}w9lb@�@�@�@�@�@�@�@�@�dG~aYckn-QΥ^J2d;"$Zl2|:sԹsg}EX � � � �ٳu=G%VCl,_ŠA cHkj � �.Юԭt^ʏ� � � @[HٳGf TZժU݁sVX{Lg}F/;rڴi3xim6=.OժUݾ,i??lذ+Լy"%Go;v&M RQT"k(cxzꩧrJ}ݧƍ`D h.C=䂨؉|,=M0!{o?񪫮ҕW^Y:StkȐ!駟 uylƍ 6tY, 4i#K<$ #QΝ:묳4tPq@kS[X#38Ccƌի]2ρdE_*� � � � � � � � � PX .t?<k}jj0 $0Ż豈ںuF .@K/01?5kԽ+)lРA8l>@�@�@�(83ue>}'[l]wݥ.]k׮_]vZ{_pֿiVI: =36mƏ2�@ zjEoŚ � �$J| MţP � � �M0qjժ,/ԋ/;.ne [Nsє)Sd<xh"YBKc5zF.o6oYR3fo߾-?~_d,T5zh-^He˗c[+V/ dٶr.Yҷ~.]_Yn6Dm52,a%Q|I,{~|GKlد_l/[ۥKփ>Xkۧ~ZM6u#FpcnfY,C|XDx>o"k=rHY ' Fo,X'%oA@�@�@�@�@�@�@�@�@�;v:vڸY۰޽{'W(mbߓ}g/_PU^k٫W/ >\C Q߾}]ˑHCZSOx2qڴiS" � � � �$`R,Y~O,m[o~q\?O ZF-Z\{5H^`Nv�i,@B4>T@�@ 5w$AsF} � � �!~zuz Ba},жm[]tEn%JboN:$]|ř֩SG^z}?4kL\0Oϔ+e$ɿDGuTν?w0k1Rv%K$~ϖTgy}kc%~eεȓ'OV*Ud~\b|YbE]s5z'{CXDK$fn%]<xJ*NX3ax>HS AG֬Y:-纛nI 6tX/ Kڽ{w0?koΫWNPf@�@�@�@�@�@�@�@�@ -|I 4H˧ο@,{d0VbݎC͑`]wE<L]}uVhéO?T;vp`@�@�@�Hf#GwjҤI2W~=>q6lؠUVW^qI2eJ 6La_=:=>WMVXd? @ P+N9F�@�HEQ(kG@�@�@�ȟMd.6|g:3<I>3wF[%Kfj&h5c B~[2EgEurwYn W\%MI_~ƴZ'NTJ\b(vn Pmٲe~ԨQ#f͚_֭6Ғ&ZYfd7nsNWO>D]L\4tOκ<ڿw= d,%zzŢ~v :E9Ϭ\~/Ǐ{. nZ2>@/OKe|,,%c@�@�@�@�@�@�@�@�@�Hl9AgW]uyORe݂;Ek߾}UXm~mRvmuY_zn /Kի;.>Hg � � � @~V\?P)dq-[VgϞڵ_~ԩS]+IO +V^0g7o:襗^*ݲ/@ I., � �/pqR.wH � � �D+t1kPE/_|Q7oa=zwKfשSG 6Ըq_WװÎaka ,>gb|d>|^y:C5tPժU+b׳}ظvZmV7x,N~/{ QRԠAk7tWրAfn6\r%d]f'Ov׿y[tGƤ _z= k޼ya5֭k�xb <8\Qά[NFoͻ[|ׯw:5 lܮM3g'ԲeԦMt'uq,o̘1?C.Οg}-ݻWv?%0o]vW\}Y'Kcv޽{dlcǎ;)֨QC#Fo[+%ьlݺuLJ{ bOs;/V?<Sz裏jPf]n׸wzْlG~׳{|&M4{lu9Gݛ,Ys{dT%J<|%}烲,^uw e;|G&MQGeX2Hkn Þ@�@�@�@�@�@�@�@�@�WiY{/kݻ];qklm-N .!⊽sN`8->b?[!?5ٵ#G>}s18aß'#Xkn1C G}bNF\BX{8 ?fޯ,ͼbjJ{nvyyE5{/8'٭m~;`dS^kiq-*TPNd?fj*.<9PEӼ 6sYxjaqdV~�fʗ/^xA-Zp^z^@�@�@�a^_X 9[˩O {hs%w;5XYbqaÆw]bc5X_.@�@�@ ֭ z` ̜�*0bD(tKv@wqylBS@�@�@�pBAPizMPjBAQ( ~ ISpf(R %*TjGݼ- Åo6m B . UT)P' At h}s?) ݄xP +ԬYЎ;Bk˖-vڅA¥ТEBA"1W KEq[n Q$>n_h5 U( ~BUTqP\V ]]l3fsv˂PٲeP: -dfaCK=ӡ .$1s #ݡ:BA�AZ(bWF:nA…P((عA~7 BAbP�˭$ ۵i+ BAg(H殡;#\ # 9sf׷]GvM c 2$ s9n]?8zPd+tWJ( dz-ٳ'Tzuoҏ?cסr_'Yv4hP̊$ A1^ڵgj~l>H 90gtRW / Ox d^ub1ӳgOwž7nM|ld9s2س5H*U � � � � @Z V"� � �'|z-X ~1N, X ?Sڲvi/ԯ_ŨX faE6߿?t嗻e>n{ 2; x: Y HCAB0N͚5CAg{WL[1Xn;V|EoW]ﱢT}Q>/+! CƍsW>̼/К5kBCub7,ʖvvC˚Ԏk1jZ}| 7oqt`@� !ߌ.g  � � @y睮?X(wk9a+K^98sMX<~:~^O,g=s}e@�ȿ [ � @,H '\qҥ]N\Eg͑@�@�@�8qk\aIy+C5jpMV 6,58B%dNǒX"2eʸD\n?פI14`�D#Dogq#X$+?vͱAmȂlYjYiA~0;K9dY`,)uߺs5O5j(w8[ώoImY [YhjY,?XZ-/1cծ]-ڴ$r?KHƮȄZyH̒ ᓫٶmڴqu[n}?o<֘>Hc=mױ"jUmmoKr[б%yv >W,_[dɒ~Džq=Gn "7烪gAcbŊX>. 烜/?r)i?X^;jժL5(\7ӎ%i  � � � � �'@J3J� � � <3Qq (mZ{Y+aeK]?wqm,Ю]hkrk3o}F(Pt׻zpyy2km}i38k]bЭ^^sԎ9-+x=9b&kBhl9-zZ޽{])&MΡ�q~Q8V^1T ryGs<G龋e ?VAҬYmHY ,Z){v � �_*Zv}g;9ͻ@KN=zϡ>84dȐ7,IGѣG)ScD[.>H'@�@�RDڷ^yE:@�@�@�@ jrk eb$c= y,޽>hW *id щ?շo_3F ,Pܤ ݲe}Y}7ڹsgʕs͛7/kٲ $ /m&HajA#5nXA,cTn]Y]Y_OZRnmކ M+CeseO?*+ ;vDvg͚ ) $o$kr׃kنuֹi~sQG71ӧk֭nYNUT ׮ k;vn:u>mӺu>Xy'H)H6Sx\s5nAb8ٵ駟*Hb6s4R۶m$rYw+Cd^4:%`gE&HV軎k]Ap+Kv|~~ۂ\ߜ][jڴij׮]~vv_쯳}P "'烜/Rr)i?ؽ}ƍ Hf>x k.R^@�@�@�@�@�@�@�@�H%SS\۶5j$dլO<N;M˗qΜ9[2~xɵT~'tx[,Onm;crn C@Z<|9ZZjѴi۶m ?謳r"A-׆1//x9w s&xh׻8K,WdC.hbMe5YdivZٽ@�@�@mot��@�IDAT�HFXaѼ[9/[];irnV{СCyKA15h-c|C9nt�_O�& @J d Ur � �iڧt @O) � � �^,hBw}_~dHxgϞ.Ao S;0͛C<O>Yprޖ(Q"nŪT>h"}2dHcYg?5ji}姙ч%K=gM2][Xpl6dms'K,qiYy-k<de|dnW_}g_ǻ΂#Ǎ7-�+ERҥymd'ug+L4+㹭^z%wU9,�yٲehKN^vˣgmW0-@X *2h0c,I/2΢{Eqn#E/2d,r烬D^;~=:fgx5duNҥKdF�@�@�@�@�@�@�@�@�R^Wj&l]-UJLe'a11Ϸ+;vt};@]4kÁ_N>#RJɗ1_p[l "m ^Y#F߯M#<?ZΝ;CO4M-NÆ]i*{Nm#u޷EiYyв~->o„ !@�@�@�@ |Y)DnͿ*yR'{<uTȿi?5jgY& ԰daY S6F�HZit* � @zX|#=LzԗZ"� � � )`#FkС_%޽{]=,OݺuoI,ڹ >�iӦ.qH߾}ow]\6?ʗ/-[dMj{c>IQAH " "A�*" 3u]5bkOŸAD!(Ad诞{z{=suU]]}ԯkzGMf;wXL\άYf2VVg:.jժ力4iRbuh]vB炆)S췹m۶իs<7wW_u 2Uc+TQFه~htpx%¶rZp63T!&ooI'dC{m8wbm޼yͫ3L,V?%V*r?( m#{̖e,?E?xfd:Z>A#+VGn0N{_e& � � � � � � � � @>>n-Zb8m>3OE X˗/7oE㑟6Ñ|*zl޼.EKl(h?ȊG</Ѳ6}9tСvu7袋R4Ʇ#<҅elڵk-ۢtMm_qx� � � �$@Mj矣^hhNY5w ԪVZvyWnrHxY4gTX>S#u,@ ԊǣB@�@�(<F0۱�Q@�@�@�T %%>AAR[nM=+mժU.tF Xڴic|mذ!}0aիWZlicƌqaZ{v6?BPoUuuTG uԠ@ԁl޽룺d,:?-VP4&NةS]tI0^4j*UdG~)I?(P)sUVscǎ ^3Anx,uTO<ѪT.pwLCN35Ҡί?WBB;v:F1'l ,p!JP,λxG黬_~,ӧO,weW_}%9={v̶Us{쯛a62lYf;wvAQ;0ܹsℛkz=W^ T@�@�@�@�@�@�@�@�(n7põ[^dIj5j԰7Zd{x<x }k2Q|y/(;]aPT~mڜ:Dͼ5ixW܃}}=/nsmԣ镱/ |3u-[mW}֯_\uU?sN(jS=XφAߴEq7{쥗^7|ӪVwB � � � @nڶmkRσT7=—N3fB?Ow/M&ҭPWsP@�'@V � �q-p42{꩸&C�@�@�@ f}4Sgf͚ocM*}M+͛7jժKevw$>G|X2|pm׮]{̙3]` DtRW:VvˬrʮBQy6ls9裏b|춥" _|MTG5>Q Jn+WU׬Y#~ڵke˖2? 5$R^x^|EȒ2?2נ_~َ:(_na.,^u*f͚.�J˲.͗9K u#u6lr:7;udt V9pB׉255նmf<넚v1OA3tET;C;cr{{.O/9y. u!WZsGy};<;SꫯvןrŴ Mwvrs~kY{-8gj!5^7]Ot.PC_zJAǨ_~VVX.}ojlyuYw2bpANin+=Ba=\>Ea }|Ŋs:^wݏa  � � � � � � � � �/֪U+;mܸqqW;I}^."gC!Ij;x'mǎn]љ;wzveٵk3,y\~F R{p x|o_n&OCn̻dva_C~O.xeg&cg)H?V?6}/+LK}>tdA :u;?qSNfPXYɒ%: AL b>3ҥKU � � � � N}\hyPVϿjyn~ >d쟞MsqǙgrG@f=D3fk~O<UP!|l+/5  �Ā� �q fM&AeBTz*U+ERPzPhÆ\8Ƈ@�@�@� Q`ݡ!Cjժ֭[zО={ TF BvZ(h:CA''Wؔ)S-t. ~ᡠ3\F\xcAP :'ԩ .z렃a( /_ޕ# |,4jqUv=BApy9|U_c<@rM7Nb (t BAĉs{? խ[ו0Pб+׽{P0(tGeAp3 - 2Aoо}B-dCzaRC[וРA\:CAZ(ZhQcǎN:({jA;ڷ sSeAgP :וέ m'ssɒ%S_(Dr*U*AäPP*iӦlRBAxN3t~mv>PڵCeʔ ;4mڴP {B*$| ,{4 u!RBNU&믡*46 Yfj tQnvE綾:hܸqeW,qoIuAu t[7m4ԹsP~?3AwW 1Eg[t\CAGмy]?B|Vt]߈| A#poϮ[#xG(h= Dދ?Ij� � � � �ğ�UP#@�@�@�b-ꃢ~%jz._>Ym'_ QoekӦMwSFڔkɮͰQ!.]kvW\ “\Q=wO>quԏ7tmj֬;#C^2AbQA,r+/]3ߓ]?gևIŷp23τ{_MՇoqUڹsۤ KʪUfٲo֕]~ԟbZ˂1ׇ@+i]8 p챡op"Ԕ:"� � �[ rm-gg\~ ̮~wӳ^"+ %=˨}Cgf;y]Gmná@�-PB .  � Pkךtل f[ĕaQ׿l͚Ka(yYfcc98Ƈ@�@�@�@ GyĂ :YcAHr!EP7c h,(# :QYdA -k ʂUu̖-[,/-Qv :YС˂/7OAC :YdA+'藟3^z܌N>d :Z`WwkAY~EtrsnN^-hfAp hs1k}@v澳A Vz#z!dX=/u# 4s4rFT~,Q9sݗڿmw>lcǎg}ւlֵkW-oGھ'Ac= B]Vfq)̂ 4Ӿ{^qkfndYZ$ ˘wpŊY]s~fZer`Z}Vf-իWޏe/쥗^ ԂSkݿb+^= � � � � WI#~!� � � ̙3]9smf_~ys.)k-ҥK]ک5{֭t~ڵefW]<@7U{46-Om@m2r3ѲhsʬlߡAX-[.B^x`5&wϴY~sj۫07h2~6M!cvw 7H,N@f-Z=TQւm#� � �FG[n-[#^'ZEn0ZFy]_d{~73b5}6i$L̞R. lj%e@�V@=t9V\9B F2*5i q~Gߔ@�@�@�b+BOܹswvYgYZjxJ E9rDa]ǏXY*x9nQIQ >PK?TAjLל,r~qܚDcɓ'ѣ7ް 6$:D|`k߾{ke+X&N'p ]`^) q٨>J.B z*Ss=`nf sxYӌ~,{+kh}ژ1cLɽzK/[Np@�@�@�@�@�JrO@�@�@� 聭o1֯_o\s]vek٬?doJ<9UaÆ 5kY~v[kV麡>?kwzEPuf#@2@�@�cT+,--ͅqu\D k/<<@� $03 � �$7}q{� � � @^*UdW^ySSS^[nuS֩j_kх:jPX'tuQn|پ7VUNeeO,P+7 PLNC3\si_skh7~loֽ{w;\V6n^y;3^z~ǣ>}LR¦sHPo̢`z µ;8wO�0O>D e]sG p&^%43xnfVǼ.[rk(g-[\`�:uHG�@�@�@�@�@�@�@�@�H%JYge pZ>)I/R;cM0@2Ű^<9ݱco׷ŋ&ϝ;x㍼RuaU(/pW_}՞}YS!C6lRX@�@�@�H,RJ߃:w잗 *$NdSDj̘1vu=CV6Ǘ@� CnWf=@�ڵfd6avbJ.|uY"k jn8Ii � � �E#w^:$( fֲeK;]F׮]n_*9~[ ~\d(2C hSVvk .Ć lܸq6vX7n߾݅h)3ϴC=4jY< 6uղ),6*LKU}Q\7[n toݺu4իÍušr>6A>HPĉmcVlYГO>B25;� � � � �#ͮ"� � � KVF ;s\mVC vi{o/lԩVtikڴ+&[lq՗/f͚> Ö@ Ak쩧y>� � � Psq@hҤ{nR*U l [vyСCG@ jE"@��ZP2ǥ71ÂQ{YR � � @㏮:ӤYɒ%-%%5QVΝر4FժU|| lڴ)ݖ˕+gH4P(Bou Th6x 'X"]{FBTУHÒݸq 8MUxΣDvm?`)S  >hwкukylSoI&kPqϞ=w`*T(H5 � � � � PRO�v@�@�@�l6qDW~vꩧ1Sz6o!U!/[(Q"sa+VO?/AWn .:tUn$�Z s( � � N`ַo_4GYÆ ӽϋ 6|p PL*&D�巆tʯ…f͛=ٵFdYR � � @| lݺվ7nd7#Hwuԩuю:({A@�v4uT@ imذjժsw @j֬Yօ$; <]yZH <yuYo>M6h  ]m۶ʗ/oڵsZjlҤ 1<�%믿5ک͛7[2e5K.ֽ{w֭ըQ#v"� � � � �D*1aP@�@�@�N`ժU]o^N??gv"}v~/>fΜN9%K,.'"@V0@�@�@ & #ׯ-Z^z%߿LC̖/d裏UW]~^!�H@a@�'@V,$:p)6'47GJA�@�@�HlߺBh ʕ+w(0D![KN ֭ӧQ-XJ(Y ڵu Ka6p@[x=Cve}Oٱcs=v[޽W^5kCբZ={?liii. Fߩ9s޽{B ֺukk۶ T*UD�ē\0{l=য়~rMFY]�;4_\x� � � � � 'WA5@�@�@�H -[_|a|}W֫Wzi=c9Ǝ8#@?\|?~ھ}sַo_SVV {@! Ul@�@�pڨQ /GyĪWP/wﯿuͿ@ JjE b@�(�ZӁ+~MqY:k̬K^s~GǑR@�@�@�W  \g)Sj<e˖-Z0͛yMԩ;L@ !M>͚5ˍ R` 6t!? TUVM}+h%wewy=.�'t+ Z.{g7x)MZÆ ߛ`n۶m6cƌp =r ꔯ`fM6uavVV谋 ,s-].\\PLwS†.k] � � � � {ޘ- � � � gvZ_M4֯_okōjK߮];TRSĥڝ?^ZZ}w~/ Rhֱkzrax|GQ$ P+I,� � �N?+|#Ge]fJ*v u]g~{Ї:Vڔ�]@~ �q#@VW\Q'iY~f[h�G9 nH  � � �';wA3sLl2j�`:ʚ4iF~Vta@ fЫ0 T~-Z:/_ޅp?Y(ԂXJmvwXƍcvCzmNgq=cVn9 {/(�O tF5r V@�-{n[dQw{FG_ =FFZ  � � � � �W*s � � � ڼ ĉ]pOjjkw_dIcǎ[nm+Wά!@>S?駟lڴi.HkÆ VbEС}֭[7;cjժ A�h E@�@�@�C`<{=c'tR|T.Akzj{  ޽{'Pm@ 1JD-@��Z{6QS/+^p~̏O#� � �/54 Ѓ#F+TKWx~^(x }:_[u\:*Gl4TTɎ<H^Ѵip)ːom#FpadÇ[˖-�'0~xSqY׮]|[ (hKa5 [>fʕ.D.Lg'ĥu@�(sq?/]㊭UV8/C^)3 � � � � �9 _%'!G�@�@�@� =&O~m(XE}j3WTn#7ntfΜΘ1önڜԮ];S]JJ~JSK0Q]@�@�@ gvZS83xI.*˖-sAZ?U^nVc큘"�1 P+� @^ʋVbK:^š j쮻1w4 � � �ضm r7o͟??М0SNkР ׫Wmpn]�% ~ͅ(XG,: jw\!:>lq֤I:? 5zwlȑ/X޽.SO=lYoڳ>kSNA;Î;,> ]v"˕+gv~@cZCŊyG�$عsX–/_5t=?p{ԭ[79t{U&� � � � � HWIE]@�@�@�H+Wp-�nT[޽{Zٲem:(kڴkϯvMs=Y  7g;w5pVZFhly �E%@VQɳ]@�@�@ vhԨ{ƅ^hjՊp l6j(3fծ]nKo KTHHQi@�d P+D=gcq, =οD�@�@�@ 77ov[ 8;vp(HG /C5|ơ44UG[ԡVa>bٲeQan߾=\!}`G }v;O?Ԟ~i\ÿ!CEp,~^y{mvgСC裏NHj*N1$GrZj^@a9 TrHxL2#L@ P~ 9"§-൘"� � � � �ă�U(P@�@�@�Ϟ=;ݨŋ-v RM@Z/FZPKyv [`-ZӦ͚5ssjT Yg@� P+5F�@�@�*pt=SCύ3 ozO_�Snx7wuŮ ;묳 @Ԋ"E �  eЁ+>KqUnڵ3;`c;>� � � @Alzj9hG=H_+tիWw 88a Q@ s]vٚ5klժU OSJ*lZpՙ=sNҤI0` jݺu׮6!&Mwyƌmup /4]aO܍ ѵ(|gӦM+S}Ȗ: 9ռF0 @8u{ȩY RtCt}pS{΀� � � � � @_%QD�@�@�@ ܹ,4|2F-S[]PJՠA_~/ƯGEzX9]d R;t'bŊvᇻ#<8  <j%ϱdO@�@�@�[o垫?؁hz{F޽*gjh2e{ƠA\V˖-s}@� C\F�@ /jE+֥WbT۴4 ^| sS � � �̯ZB7|G=M!jrB34栗Y PRt-@Tnjׯw Ta 5 QE�Ph`9VZ5еQFSJzejx']P5ꫯ8n8۰a5m5|8p5o޼pJv|H/k|n䠎3#躧eOXB"G i ];#{ g{ ?2eʸo݃;{?@�@�@�@�@�H6$e@�@�@�(^j{`"ҥK]T{@S vz-9 ڵm5UB~enܸ1\Tٲeso ySHhV^@?  � � L iÊ޽{wL =[#B6ol&LcǺj̛7viz~e@�(zP@��Z{"Ё+ym25טٜ9<2{w3>� � � @< (xK BMm۶n(4C[I/Zju b@  P(,QϏ ` uJ,_fqZ a(:&Ol_~kjwvS)))SN֢E TG~5jԾ)<L|tǺ}f͚^f)ldȖ' RjKڪڇkvO5֏jx[D,DK@[lI7_d6^Y}\fatzχgЋhMA�@�@�@�@�HT$ꑣ � � � 5Cj-[悎|ؑ&W[jU;C0cMT[E?U{\PlES~;ߗVxڲF/ kShn 9E;H5(jcϞ#� � �^@[~ƍsiGG}t:tp�~c?{V4mۺgjǺuFV<H�V@b{q@�x P+ގHCYRR~݂ugV^W1G�@�@�@ 9o:c0 !+2B̆rʅQrtcJ* T_<:re&7Xk^- Ҽ*e oo~O#;`  $so„ 6i$hnڴis|ֲeKkڴ Tc ,hkΝpB3ggϞ*L){v1v P׹>uTSo8Jrǎ]\@"2}";{j]u4Yͫ4r^4 )(-tyw>DK* : qSd3e � � � � �Y _%kA�@�@�@�!WvZj$VpP%دtҮ?6]]dmMҷͪکn޼yoC~WGR׌@@5vAFgr!Qǖȭ�Zb=@�@�@x7G=S@Xb{ϑG'i&MEnzgzi=SCٳ(6@�r/@VX@� S"-\Es!'f'lfD, � � �(@ uRg/M3Spd>0! _i)TK6$q WCFu.c2e~<GK~|Z wϑӬz߻wCe urwaձ/y)By-d> Ňh9UyS;#׺c@_l6k֬p#˗*(hHS;𨎪;)k^sG w[茶>P -[#JuaÆᠯVZGqDa15U#Ws]j;wv瑦۷/p#Wø98,)2 ){ݠWu?_G3~!r Z濫̦D+d6u#_3{ek|cGyMkM5F7d5딿^etGO_G_=?Z{ /A} 2 `S@�@�@�@�@�@pR8l@�@�@�C@m*զ\L֭K7m3N}[]lPT/}K-jmk#تFlyFk lƩovu6z~ۺvjǚ2GNUffE[}_r9U?5jf͚93 � P+� � �$eL>=L ִM+uqkEy\ =g@oih~i-Na͚53|h:t`m۶uH �/@Vc@ AJjҁ+h|?쫯,xȫ~|9soŚ � � � =urS3u0SXjއ7y-rG6Wd0չ0 12wn̸LԀ)4r:T,?6H&5Λ;w-Y$ ~sk֬q TAYuUAU^pc?ܚ4iB ->:/ՈhM2tz�u=B|49 iS~_N>*bTA/qL9+tir?q{Lj꾅@�@�@�@�@�S*yܨ5 � � �$p-?U?q j٨m|}VշcUՌ1̇*U\-`3d@ oj͋@�@�@�P ڢEs44trJ&gj(4+2KxQG@�Ctr{� � �x ͮW RE�@�@�@�b/c>8![g>`Ky^!>mh9j˟}v^x#QN;y?-Y^VSQK5xg+:urcVeZqF7!1|S:V^ݪUYmd&N?S8<K!Z[sGZJJq.De˖oGf2DcQ ~뻬q᧺gмw8A5|k񵿇|q/h � � � � � � � � � jjvjQh}ڌS~VmhEl/F]#yߏOglkB4j}@�@�@�@�^@5mԍYlµ6md۷of蟫UVs54_re -nǀ� P|?5X � �d)<g՞{줓 0?Uy@�@�@�(`5Ze&цV@mc 9iر| ,^RdGV��@�IDATSSZӧOwkԨB.B85(e(t/#% � � � � � � � � � �$b6u.P[@�@�@�@�- V-#�E@h. � �I,𗿘 bvfݺd@�@�@�@�@�@�ؼyM<مgڵkL2ֺukuWiƍt/6 � � � � � � � � � � � � � � � � @2 LG}A�@�@>j6vٕWf  � � � � � P({YfYjj tܹ ~.4[ouvYr ^l@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�-E�@�@ V5{N0;|=@�@�@�@�@�P`ʕ଴4:uVR%ر>u'Re@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(@Vq<3 � �cvfW^iֵY٬[ � � � � � S۷۴i,555|r+Y5k̅f <:wl͛7wcZ! G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ Fjb@�@�Hd07Əᛉ7@�@�@�@�@�B6ppVZZ϶g] :t رU\91vZ"� � � � � � � � � � � � � � � � � r* � �7r^}Ղs=77@�@�@�@�@� _&Oƍlٲֶm[޽tM.@A[@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@*B|6� � @< icvfY><3kK@�@�@�@�@�oݻwی3Yiii`WFЬM[nmp@|C�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ jE@�@�H&o4Ss1:լbd;@�@�@�@�@� omǎVZ5ر 4RRRXfU@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H@QM@�@�BdIW_5k쪫^z(j6@�@�@�@�@�oݦLJKKUVYRe˖ֹsgKݴI&VD!j� � � � � � � � � � � � � � � � � @Ul@�@�DS SO5lD=uE�@�@�@�@�@ 9sXjjj8@_~1-b7pv*T P � � � � � � � � � � � � � � � � �I*@VXv @�@�h rٵך j@͎8"S � � � � �+f͚pxVZZM<ٶnꂲڷoo};hխ[7~w!� � � � � � � � � � � � � � � � � jz � �ċ}٠AfovR3� � � � � @tvi?S8@+55Ֆ,Yb%J&MЬi˖-tiDGR@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�0> � � +hYvf7l裹+!� � � � � -pm׮]VF 5dܹuɪUA@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H( � �@f>k6xYnQ6� � � � � @6ol'Og)HkݺuVLkӦ к]G-R � � � � � � � � � � � � � � � � �E@h. � �9}ِ!f_ � � � � �'w^9s)4+55MΝkPׯBm۶rNP#@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@��Z쀳 � �DC̦L1{y >)@�@�@�@�@� X"]xԩSm۶mVreرRRR\Vڵ!>� � � � � � � � � � � � � � � � � �1 P+f� � @ -k6zYj%Qf@�@�@�@�@�PPִih-_J,i͚5sYw굖3 � � � � � � � � � � � � � � � � � @ Lj"� �  ٳϚِ!qYM*� � � � � P͛³,55fΜi{ڵk[JJ 6M;vh+WNཥ � � � � � � � � � � � � � � � � �og@�@�(@˖f˛]yY۶fm8>� � � � � P֯_³7n-Z6mdʕ ~nk=zoh5hРk � � � � � � � � � � � � � � � � �$�Zu<@�@� ]bEVN;l4 l@�@�@�@�@ vm3f̰T… ݞp.]X6mL2 T@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�r+@VnX@�@�2(Q쭷ڷ74JtU"� � � � �cKó;vXjլSNvg[ lȑ.LkرV^b,Ʈ#� � � � � � � � � � � � � � � � � P*^ǛE�@�@ &5kcֵfP( � � � � @lݺզNJMMիW[ҥe˖b]v6iJ(afͲ>}!bժU+Aj"� � � � � � � � � � � � � � � � � @4Ԋ"e � � oofCuhv � � � � �}ٳ----/שS:wl7x~LP~, _¶>#R~�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�[@> � �*pfSiڴYfy6� � � � � PWN5%ax֭.(Cv '؈#,%%jT/N?tٳV\> � � � � � � � � � � � � � � � � � j%Ae@�@�(J31ì_?ɓ<(kö@�@�@�@�+vZ3f}G֣G_7~]s56j(ӧOԋ ;w1]֒%KD֤IܹynڲeK+UTUVً/h|5j|{~fvZ.]ߖgĉs}]Xp=䓾l{O>9ux@�@�@�@�@�@�@�@�@�@�@ oǗC�@�@�@�@�@� P+9#{� � @)cf: d<@5nGE@�@�@�@�B.fÆ 6~xdӱcǸ_Ֆ.]j2 @| (*--RSSt{nYE]³t]VZ\9 K[WzC6lh_} -'xzUn6|pR͙3^u+]4Z � � � � � � � � � � �C68 � � � � � j%qd/@�@�+ڵ߬[7GzT@�@�@�HZqĉ&Mذa쭷ފkNz]ݨI`ӦM6ytZׯ8Zn킳}ܹ5j(4:urV=~[o#F؝w?t]ؾ}{;t7ӵ{Z9k޼[ܠA[v_) � � � � � � � � � � @1M1:* � � � � �$�ZIq @�@�O}{7<؂~Ց!� � � �$tR s饗wTRx!L+ގIv={̙3]xVZZڼy, RRRnsvYٲeBRMSn&{G쩧+2^ʕ+g_~yY͜wyq.U}Y� � � � � � � � � � � DǑR@�@�@�@�@�@�Eu� � �I-p9f3f]vّGuԻ!� � � �1Pͫjsε;N8;묳6-ZdwY}[r :4]}>s{7{AӸzjS7Z)G}'|f͚e#Fzgeʔ[nž8q+|6rHkԨ 6m3t_ڇ^{-[?o'OJ*YWqڵӭrv8 @:+V,5m4۶mtN?t ڵkl~^3Fm6m?N=T۷ok'|}ֳgOw-5{y]زe}ᇮƎkz~֪U\_t>|رÅxz}vWW_LWQ^ � � � � � � � � � � �$�mo'*D�@�@�@�@�@�< ڬ� � �Qz6,x&2 � � � @>~i;c}.ꠃA]i Z 9]Xߔ°n+W Rpe)3pAY Q=S\ؖxy`c9-WxB:ۼy[rbA߈믿^}ݶtR_<x,Y>3K_ 믿Gj*;ӭ^[0`խ[׍)I&O̙3]ոq{qW㩧{͛ggNw$L0j֬i:ur!W 캠뒮I <|+]ut]˰aM]cNmmyw(E�@�@�@�@�@�@�@�@�@�@�&NC� � � � � �1 P+� � �< լV- j{9@�@�@�@�]°=\2dկ_xSѣ_6jְaCѣ[KW`̬YgP(>}[d)̪gϞ.G^{5楲xb2e_)KA>J(a7xoTQxq*T`s`FZ*Ca9k >]~nAmWa@wܹ mZժU5ٳǮ*]?l=]|֢E \mW^yŕ[T)7b۵kW|_}Y{]HV[Ν]v)Jו.(#6ɋo]_z%kٲi&wmXL` � � � � � � � � � � @\ I5@�@�@�@�@�@ >,ER � � ^re?4}WWN@�@�@�@�l[�` '`'N1c؅^P Ѽ˗髯j{N;ͽVӨQ#ƣׇz&ֿӡCJ*vgE!_;vp)롇2(seˆ5S^=S-[f?7plݺ{=V)K,Ym\rn9A ֭[g'OTKKKs y߮];;[oW R½u)X6m\U6nk֬q}{gjf.h+|Yzċ/rBz-;CƯޭ[7 -y2 � � � � � � � � � � �ķ�mo(C�@�@�@�@�@� U0?>� � �<٬W/{sAVC�@�@�@�=0mN@QC׮]G.4P+rҥ 0o<S0ԩS#WK7﷭pW\@x>h>pZ[NbArϺ0_v߿onᆌ5I%k.1cF8<KZ .tظqc5rHU2eb:,0a ׯ RX͛Zܳg],P+;R~}P RgU "ݵ@t<@�@�@�@�@�@�@�@�@�@�@�R6J!� � � � � @?q-jR � � @n<,x@�@�@�@ 3?IҽYNv+*/C l˖-.X+~׌{�;;;vػ*B;H�"HeQ,eQ)}׶6,(RDPA ЫiJ ?RnHIy&3w̙s^3ߩЏy7eEjQQQ@ӧO߾}]K^ũSo߾"}v}_-[v͛7رcuA_m+.jСjڴi2k+?gӷ~.]UV"W۶m|^-2/ ڊ)"+{nر#i,u/@�@�@�@�@�@�@�@�@�@�@�L6AX2@�@�@�@�@�H j# � � @I<"{4~gq � � � ue&`X˖-s5ٳg@4l:j(EGGO[x~a6`Һ5rH)SF7tWs .+5|p,YR}&N L>]UVU5yd\ߏԹsN>6fǏ"q<(]*W;ŷzK7nԡC4{l=ԩ+SӐ!Cw^vmZfjԨB6O>č=$$Dl4o޼+ܹsyV+f?y+W.kY7o^v @�@�@�@�@�@�@�@�@�@�@ ې '!� � � � � @r(=E�@�@�+x)>0Vӟ͛ NB�@�@�@�@nkN۶mӴib;ŋC=-[֭kY_|Qvrؽ{U>/PNk„ <x飗^z{1լVBTR%WPǎ"[֬cc{1a}駮 iժΰa6mhܸqnn[vň5k $`E֮]w}WTzTpap z7smE.\(~Xb߷o_լY_ /X^s_^۷oW|dů.\=zӲ[ӳgO^m\?7g̘6O<I&)44T O>Ç{ h_}UW�ر0{GTHEC�@�@�@�@�@�@�@�@�@�@�mdA"� � � � � d+8S@�@ HK͓ASsKW_\ڿ?]H<߾5u'+*CS@�@�@�@ C Ly\~}իΝ;5khɪURbŊz'Oj˖-ͨQԲeKW3~[믿0 XqUzu=q^ڵ쿢ԩNeʔ߇}T6V`A[A+ey �]ocB<Vy嗕7o^l ^SDD"##zҥ:qkҤ^kj\~N|g݊Y<+5vXZJ9rСCnΝ]19s_~jРe?{9uU_}ׯ<yQ+Wv?J*k*V H9w59sU\9mV;ѣ/+@�@�@�@�@�@�^ 9y-WD�@�@�@�Hk6mzd,u^ e � � � �  ;@��2&y-3|>c!R Ҝ9Rܨ"� � � �~/w:uֹYVTfŦv!+={KNںu+VUJNK<v+nervAWX{}EEE_~]?["+UjU(P ؏@ 9sF+Vϲ"Z}gBCCVz dʔ)8V޽5iҤWPkϞ=:u *bŊ%ksfÆ :~+ԕ/_d � � � � � � ͫ@�@�@�@ ľmb{ LZWY � � � � :9R[zE�@�@�(UJkeK飏@�@�@�@ X!6m;}+BWxOVZ=I,Xe'/^}qqʕ˽ϯ H5+/zj?YtE7o >@wyG>F{.Gj?#^J4+pVnݔ>@�@�@�@�@�@�@�@�@�@�@�@ y x  � � � � ��R@�@�@ kKSJ:I*I<>8@�@�@�g5y=d̮pº"#GdH:t|bn-Z_W@jժƍ\[VӦMSO?d'Mtrk:w|%E�@�@�@�@�@�@�@�@�@�@�H6 IH@�@�@�@�@�@ (w!� � nAz_?>U,0i� � � �(}Lz wXz7qfl .hڵYNѮxSXXFg5jHsN53SW_uZplIFm۶4)uمف� � � � � � � � � � � $6 sI؇w@�@�@�@�@�@ (!� � eoʗ:w2Sg � � � @m ѼyC({nEFF h-_\NRլY3SᮀVɒ%5-[6tKj(9r$Vy-4@�@�@�@�@�@�@�@�@�@�@�-@&kf� � � � � �_Z3C@�@�2رΝR^R&f @�@�@�@�HɓY_:u긢Y}ujժٳ .\@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�bb7"� � o%J]HTr!� � � � @z DGGkƍpW@kڵRҥ]ѬCuӦM?.F�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�GZ@�@�G _)SH^+u(-^,+>c � � � � |tų"##e,YG*O<jܸz=#VŊo@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ N jN@�@�HOZuNʛ7=Gĵ@�@�@�@�@ =Ν;UVZV<ˊhmݺ zhSO=05h@9sLarM@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�V  � �@ҬYRVKӦI!!)zD�@�@�@�@�ؾ}Y^rΞ="Ey;],+Uh8#A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H�MH � � Z̙RvҐ!҄ u%E�@�@�@�@�8~,YH+G_uZ5jPlz\@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ (\ @�@�.в'RϞRrI3@�@�@�@�@ }.^ gEDDhÆ *TpEz!nҤ͛ � � � � � � � � � � � � � � � � � �i.@A4' � � Tn^]>lYi � � � � {UddҥKu ˗OM6U.]4~xW@ҏ� � � � � � � � � � � � � � � � � � (�@�@�믒Kvf � � � @kH-ZH/qFtc_l ?@z 9sF+VϊΝ;֪Uͺݺnݺ Irm@�@�@�@�@�@�@�@�@�@�@� m2ȍb � � � � � @ PP+1 @�@�RW/umҜ9t^@�@�@�@�__*YRھk?{Ԣ!^7oVddիu(Q4hլY3*T(u@�@�@�@�@�@�@�@�@�@�@�@ 7#� � � � � �W @A+@@�@�H? ]E WF�@�@�@�RZ_?驧+NϹsKݻ> ֒%Kųo\rQFjٲ򗿸ZUTIK � � � � � � � � � � � 6< � � � � � @Vֺ@�@� /"?RvRRr~ZL�@�@�@�p{Kŏ?=zHW]1 \pAk֬͊p~IѪ\+5fnذr[u7 � � � � � � � � � � � mR@�@�@�@�@�@� V� � � +͜)n-u(-\(.9� � � �d5zkޑ3؋@Rvxui,XP͚5-ܢ0W@DI@�@�@�@�@�@�@�@�@�@�@�@�d I6! � � � � � �JZv1X@�@�fϖZwVʓ{5 � � � qFx֥WH_$.pI-[,V_U!!!S+տ U#@�@�@�@�@�@�@�@�@�@�@�@�4 o\@�@�@�@�@� jɍ` � � t oFviT>�8p � � � L{#.QΜ4ƍ/n:EEEL2 ӰaܺYfʗ/_B � � � � � � � � � � � mҕ#� � � � � �i*@A4b � � kK_~)k')}C�@�@�@�V\9eK.^K}-<YҥKuQ͛W7FpU*4@�@�@�@�@�@�@�@�@�@�@�@  $ 4� � � � � � �%�@�@�vO?zJƏ3>@�@�@�@ aṾJ6sj*W8+m6e˖MիWWXX~inРrsœ@�@�@�@�@�@�@�@�@�@�@�lmZl3e> � � � � � @g � �dnݤwޑZCf1@�@�@�Ȃ" s,站Db?Y^rΞ=Ey뮻m @�@�@�@�@�@�@�@�@�@�@�Ȍm2]eN � � � � � Ժ܄= � � A|P*YR+Na#� � � @HK~+EEIK{gyLp1-]Tڿrȡ (,,Whm[W^W` k` � � � � � IeW��@�IDAT� � � � � �  � � � � � �YCZY>3K@�@�ȑ޽]wIŊI7ܐeD@�@�@�@ 7f}R+Kg f<xP#FP׮]ճgd>W)mgmذA/^T zȭn~޼y}M:@�@�@�@�@�@�@�@�@�@�@�@�2�y|; � � � � � �s(@�@�@/$8 !͝+5iP@�@�@�@�/н+tԷ/,%w}WÇ}E܋]QA={(22_@kٲe:q˧f͚B]Ǐwʔ)^ � � � � � � � � � � � @ [@�@�@�@�@�@�VQ � �@lҤIRnR?Hի � � �dFW;wNϟcn_pAQQQֶM/^c.M4|EѴi'Kْ#GUʙ3g<ys2=I9^Z}>_6%N>+V*sNeϞ]hV޽ݺN:܃D<y@�@�@�@�@�@�@�@�@�@�@�2k,gc/[:f&涗)ZtN;oc/c27oɝ;l~h � � � � � �i+@Aj � � FYћtRҢER2itq.� � � �A'`cǎѣnǏĉnmN:bΜ9_BZKzӽW �Za- [*ŵ˗OwK۶`*TmgfØ1c+drJWܬ{7oU<k͚5.YD {u͛;h˜@�@�@�@�@�@�@�@�@�@�@�@ c \xh\lɓ'emmxKז511s#8 )uѫGZڲ7ylumX28!� � � � � �!@A?,B�@�@�L&2}t5RGgN/X :gI2@�@�@�::x:k}a]oZYPTI/^ܿb+W.Ukm\={ve˖…ll+d˜X-.\o{ϟ? ;;w`nUPml^"E(Xb2k۶sӣM2EC =?fm1YN0=Zd;֞ ~upU\9l#� � � � � � � � � � � �,e.],WsrX^$bWk܌|@ykxTɒ%1k[{[ǵX&ķN(oG7ocs71^&W ,a/fa1޽{]1\Z(5)\l)oEsI N|a? � � � � � \䎚@�@�@��|ŬoZw}4@�@�@�" ٳǿXxle߾}n4<fa= YŚʗ/m1[PY̵,tWK~/+-lyر֗;۴i+fފYfՂJrk^.]Zeʔ/V,m֭4gW,=/<T0;֭5j %w� � � � � � � � � � � �YG`Yv&bҵe0�ԥ aY%bxE,kSjUk(Pklm~Xq,d?!61-Y-X&W[޽[ׯw,cϊ =,%J\}ñ|ѱ^4@�@�@�@�@�@ (w!� � @T$͞-]{Ի4e|"]  � � �$ `_U;wb.lYgϞ={vZV@f͚BJB}"Z\?LaI[~]I@:-cU�U\8ԞSNź>˖-++V\9m[*TJ_Y3f?+:¡z>쳸f � � � � � � � � � � � Çk׮].[coٳg۶e'bj ]Y>+d&M%Yr1ܹs#V r.Vlˊk\b_;vh er\,eY[ʔ)߶זͱ[~66@�@�@�@�@�@ (\@�@�Gn]iL~;}U@�@�@�L²F[nնmܲ}v:ccǎ.pe+[J.Xe|ɖ+4Ǐ˂3hk+fO?s1CT\Yǎ[oηp .hҥ1 � � � � � � � � � � � ,/cŲ,Geivr 'O<W\.7eh6m+Kc-y1WJ*1ߊw2r'or9V͊ok+ٳ|P[,sW9V܍� � � � � ��RC>@�@�@ (Z>TC?4x"(ɠ@�@�@�:+XdEb.7o?ӧOȑ,eu]#Y8Rʝ;w͍eL Ȗ5j$8V5a,eY %,j!"E$v(#� � � � � � � � � � � @"D[nl<!BE֬X g7o^>o)^,d@0V%RNgs/ ,\skwŵ,KVjXʙ3w(k@�@�@�@�@�@ IJ#� � @FMzmi�T)iȐ>#Ə� � � @ ڵK֭ӏ?_6lؠG\uU.Tzuu#ZjxVʕ]ϊj&/פI8g-^X+Wtm\ȑ#:|sؖ-jE,ؽ{X@�@�@�@�@�@�@�@�@�@�@�2sO?iӦM{}a7A5kTNdY+UbE)S 2ά)q ɓ_+#'OZ;vpk2o<{̬}RF ]J,_G�@�@�@�@�@��hǃ� � �YN{}a#+[F�@�@�[vVX5k+"dlٲUѝwީPX*W "`՞={9:uJׯעE|rmܸQ;w]Aoمׯ/[6lgO � � � � � � � � � � �ŋyf^e,/`˖-[tWˊT^]M6U>}ܶYV�R|dEloںu+Tgs,X@'N*Vԩ)\p\]@�@�@�@�@��;o:SF�@�@�G{ڶE@�@�@�)`u)""BK.uE*P4hzoWݺuRH̉HUW]f͚%iQQQ.0kGV׿4fWh j5n Sxx- @�@�@�@�@�@�@�@�@�@�@�@ Ξ= g-[LVrNrj֬vmU[jԨ<y҈#`[,si۳g~GmذL2EtVXe,֤IWܮ|vk@�@�@�@�@�7)"� � @/,'|4԰aDZ@�@�@�$pq-^X .tk+u YMC9r5jU*[lizt gmٳ<ǎs!ە+W =䓲vZZҵ^Pyl � � � � � � � � � � � DGGkƍ.C)+eųΟ?%Jqƺ4l0իW=\b�(Slbw^]-k֬ь3… *UY-Z(,,L u>/@�@�@�@�@�@ PP+Sf� � � Թԩ| )U� � � @>}Z ,М9s4o<WdžV~}Wgj޼UF g #s ,XP[v7C+p|rY( ݍ5JTɒ%]a믿^7xa� � � � � � � � � � � �q XK … >|XŊsݻkܸqV TK-ڙ3g\+VBySNeEj׮-[M6n)Wwk@�@�@�@�@�$$7i � � %}tuRҢERWg!� � � V6mҌ34{l߿eŋj֬:v쨧~Z*P@Z @<}xOxmƍvܹz'5x`]}j߾tv骫g� � � � � � � � � � � @9V7|N/ӧUn]]s5;jժeY#&@fȓ'Yf'|r?!Cȑ#m۶.c… gF� � � � � @VL@�@�keK>X}H!� � � ~<y mٲE5kTN4bnoY1~w+#@hhl0`; ͙3GfR޽ea믿^ӟԣG)R$9@�@�@�@�@�@�@�@�@�@�@� .`EsogΜoVWzdr|AjՊ#p%W6mb_xQ֭ӂ \~~4o\;wM7~v\ɵ8@�@�@�@�@�WZ@�@�@ HJF?zR0 @�@�@ lذA&Mg}]vYÆ S׮]Ur DVϖ!Cٳ?O{LwnFqV<y2̙  � � � � � � � � � � � =zTӦMӔ)S\a+ӱcGKTdI@�XٳgW2tPEEEi={f̘1cƨJ*ջwo5i$@�@�@�@�@�@�Ccd � � @ T&}h4`j � � �3g4qDhBuQDD}QݻWs<@1-2@ܹվ}{_4o<{ULWtkݺutL @�@�@�@�@�@�@�@�@�@�@ + X3g[oUҥ5n8ZӿoWbZY`\@HH7o i-YD{#<"ℇ/Ǐݻ"� � � � � �i"@A4a" � � Q6L>D?(f � � �A=z*TcǪSN5| 4Hŋ d @lԲeK.hǎjذnF͞=;8 @�@�@�@�@�@�@�@�@�@�@�ؿMʕշo_*UJs /UV84@ 9e.cEYfꫯ7߬o69s. � � � � ��R@�@�@ c t M(=ks@�@�@ >|XFr!@ L0�njJ*e0RH59r[n/e5h@rZh>ծK � � � � � � � � � � �]4l0WƊ<sڳgs^Sxxe˖R@ @ѢE5h -^X֭S*Ut뭷qƚ<yc @�@�@�@�@�H_ j?WG�@�@� .駥N A2,@�@�@� /K5k_M>]ٳxNzk M[ȊٵUaH'NЇ~nMEIS@/rJ=Z5O<i⸌$ꫯ?رCm۶U.]ύݻw'kG�@�@�@�@�@�@�@�@�@�@�@ ,裏Fھ}{WԦwʝ;w_&|F\Wf)iqw?׿<PJ'&LP׮]3ϤtǏߗ}-S*/fٹ_|QV;СCլY3-\0U<@�@�@�@�@�.@Aq � �d#')Li"� � �CԹsgW@+ծ]4vBPIiӦK.^;wke˖H;gj֬Y:rHj\"}ZtÆ ZjUPlbKN˨MrbŊ ?7:ڵk>y � � � � � � � � � � �w}Zjiܹ֌3cψ+׾fʜĵ/L2+eE|Mmٲ%'~-ZH_}R .GzW4bKwƎJn t[[nС 'O&kG�@�@�@�@�@�d PP+� � �[YE&>|:sϕ!� � �͛ոqc?^k׮U߾}Ai*!!!8pBCCe-[?`s֭u=,;nܸd+>7ɚt'WTIӦM?O_>hG @�@�@�@�@�@�@�@�@�@�@�܀ h"mHN>#J\Y+sbEnT)�R={v 6LժUKZv}Fk̘1{8~xԩ ^72v?~WkժUըQ#Y- � � � � ��Ϟ+#� � @>H][Qڳ' !"� � �;ԦM̚5Keʔ F*IZ˖rCA>}R,ĘQ~h9sh„ zR{C�@�@�@�@�@�@�@�@�@�@�@ `|Po+c1/d3ɁWψ+׾@2KeN}Q͝;WљD;ix/q}?z븏Jި(;.3ץKtۖy VF ͛7O\sZjM6p � � � � �Z ?-S39@�@�(yH3fNR҂Re@�@�@ X,uw6￯ 5ĜߪJ*z'UT)ӧO-SƍCPB/^?\K,Qu}[nmF~g5jHTlbu,$(K/N:ɂgyƍ͎+X^u7NoeҤI@__~O>q'x*^^{5 P"I=vٍ1B9sJ,aÆr�y=ڙ3g"""tiglٲ!ڵkTh֭j۶믺լY3mkƍPPzGvm/_S{ zݧ뮻g)qbu/Zh>}\{j߾}*^@�@�@�@�@�@�@�@�@�@�@�\sghҤٞ26̕+WO?uZ}vuU??Pȑ#/5m4+.`9駟Vҥ$rϪU|}Q@}u $) $xp|2'oy\ pnf?A 'O֋/?P}=z˺8$y@/sN79sN:3f�yϳ>E)gΜ5/ey*59Rʕsyuֹk#|XvbѳgݲZ_.\஑X_L8Q{V=l2]uU5� � � � � @Ȟeg@�@�@�$-*͚%#r|9@�@�@�,?,-4or s׻П_Ws,{5h S+Ajݺ֭hVD? u݅,eŜIJa!0 Z<XϊҬ�sbIVɊ~Y:t {\܁1XHd!Ik5kt= YXk ;&W.]ܳx뭷RVˊ+oxk޼{ǎG}T Xfg8pG9[-kVDVŊ@ܼjӦ Z͞o]zre,gsZ'Ot{~tRPR;K � � � � � � � � � � � @Z Xq5*C22ϗe",'2n8Y"o޼.blIJoRXae`,?EPs޻w:umz@IWR/_䦛nrF]2fg9oeԔ)SԲeKSJ̫:'N(<<evr09v"]kŊ cY1k^,-O5a<Y1-kre yEʔ)s9ws[|\,o>;A>Z� � � � � @V漯 @�@�RAꫥ?fT�]"� � �dj/T!i+eEJ*}6UVBDkժ ZmӦM}־W^zʕ+ REEE :tȅv ;YpĈ*X;߾$v}f!k۶m2@ZHH^xwg}?eܹ.ذaC/Oaի#/_^Vk;.ր\}մikO>ڽ{:vV޷f[΅630i$9rą-f u=mRmSVhs܎DlݺU_uwTTWZYA3kڵj"E\;{~in$)uVmE–,YJt� � � � � � � � � � � @\Cٿ+ / D6m/![ M8 X"l]?#GtEZ`AH}zg=[r@IT/_$,,L pş,b_yWh.mE>cW{qʬZJ̫$e\VO?w} 693/n<Z|Q.\X\7<Y2kVXkSFt5x\{9ˊ]ڼ}!#4˹Y>ɞ- � � � � �@$WD�@�@�2@&Igy0r@�@�@�8x`~t_AuѣGuqѣ6m bUZc'Yoҥjܸ"##]0ڵVOܱm۶u틅@re˺c`h-6 s<-hsw\&q#啎PB{3Z͚5ݦW^XHΚDGG^2eTbE߾nZ͛]-{ϊe҂nv/m޽t|ynO3gC^_V$̚*Tn,j =r Z;4@�@�@�@�@�@�@�@�@�@�@�J=w*RHZ]2YI,ay kr5jP^\fݺuh|/4l;gDz>sM:՟]'.Oa$v@&ėY٥g>4leYZʿ/%6R2X+X贈ŋy7U\9s͛͘S%+eٚ{%J/^ϻ}6,CE6'-Ɖ� � � � � ((A�@�@�TEz5ipT@�@�@�$իWڵk3lrm6mڤ jٲeeÆ ڲeF˕+9f͚U:u5ѽRJX\'{3$$$V?Iy1dYHwѯիWk׮.$n2@LYQK[Μ9. Y) _zޱ|?J.zKw;乱ڥcil|KG]/5YFv*Uo@�@�@�@�@�@�@�@�@�@�@�b X3gh 6t^&3W4p5.}e"F\ez콸r!^1H>;/13K1W$}1ϱmQXKJ̫$g\Zr[@r>K.աCTrX,i؆ _u:uJfR޽c +Pgĉf$+gy,?g?h � � � � � J{s� � �@ b  � � �.зo_W端Jk*;vֺ:?5euQtBCCcz9zѢE|ubwq .o>ya<3\uSj~5e5ٽ{vrʹץJRTT]q>}\X z#<7%Jpgz9Xo$"QH@/^z@C�@�@�@�@�@�@�@�@�@�@�@ 6m07.."6lpWjٓKeHҥ͊۷q$i3I\.\ݗl)WIθ ,Nc-_\gϞu }<x˧7xC|ڵkrW 5jf۶m[ϟSNb͚55t`&cC�@�@�@�@�@ PP+Z&� � �-RR}xj_@�@�@�23p2|6l>j(EGGxb=s=*vmɓ';~_\pu K„Ӟ={O"`1Kl.1clPߕ /de\^`m,[Lyu[aÇdɒ裏4qD7ӧs�c A 乱Эg[liZJݣ.=Z[nճ+ � � � � � � � � � � �i,j֬YzI\bz7o*Vz)%]WZUɓrJUsN6g$t~j_[.DzG s纷taI~/%*Ix{SN $s7hѢ:}~Osްc_.sȺL2曵zjݻQ^ycϒ须K:t26@�@�@�@�@�2�2eb � � ӇJ5kJt@�@�@ <S�յ^͛7tvݻ>[{*PNk„ <x飗^zz4e9_d [ C=-[>PDDN:J:pn۶ͭ,Xga2 3lŎ_)xXW_}[oUvΘ1Ol~D$e|vQowr#?x{n_tVΜ9رC7n#<"E}~?[j+[[׮H iڴڵk'{&Mv*^{lʋ9~ͭy݁Až^yY| CA�@�@�@�@�@�@�@�@�@�@�*uu>vX=裊'nN8^ZA}'tEv$c޵[[aÆRmڴѸq\Σu֪\5kNMZ3l~6/W3>/⭭%{_s4qD{p,cɓ4iBCC5`�/X6&*ImԬ53Bpk׮uϮ>}̙c׿UL*UJV+mԨQʞ=}Y/ 2Ŀ/X7 Wڵ]n.Xɸ@�@�@�@�@�! '@�ψ.']}uF1c T`Ri|iĈ@82�Ϸ|&u.4ktRHHƹ@�@�@ mB|h[\EV^zi;6h }w.`m~5,tl2W[nի](+$~ҥK˂V0B}o[w|Z\C.e5{^9st& 4pE:vufΜC >ܹәx˗ ~XbZxVM%4 Ya)+f-22U:sj…{\1jժ@u]믿>B Ϭ-Oرcǵfk:{6lؠJ*lgH9[ػp2ooz!"5 BU@�(M@Ox QGOE @"( )$!rw{CBnYe>7}'bM7|nF*nx"C 3LT7?a|ޯ_׼뮻ⓟd҉^ҥKq׊7Yes/suJ/83[}8fΜYy`V^_՘߮׳Pc_?g!@� @� @� @�-U@JK}rM� @�)Ɠ_sӟf[U D\s5ѽ{J|+2|~dT6㡇*B/^\yd]Fz}݅B<dEcUK 䘲%+tP\qE]U}oy+ڵ몆S5[ygeʚC=qY^I}}}zESPrGEH֐dV֑{;^zrkz/Y*z׻V}-j24+벮}9ѣ/u^$kVU:ɟ<kQ.)ջw&.j4hPd[72+k9Pkɒ%U|wqQY%:ڏ� @� @�\]nQ� -GbTj�5 \}ueELښfe..woرG_~~= @� ",:c* Cߌ/BV[]hQd+/u𰢈/Ìjj/2ȨᲪ4<�2 2鲺siz^ngW8u3(]{++DZ,0 AfY;8qb}nda5}с+ϕo s{駋-rWZuV};"oĥ^;s|{ߋ,ĵ @� @� @� @�,^%?=c'@� @� .n!8㌸KUΪj {u]3ό/| 1eʔȰowmܹs矏 ٳgc5Z5:9tE5'ӧO/W'~_ɓMxVvuU{4|-r[lrؕZpaoujZq~x:_Yմlm>Q4{NXsmV`„#"f;D#@� @� @ tlCs5U @�7ƈE~?n @� Jǁ^xaq'_\)fT�hԩSd+;FKXK0ܿ|3qm]+Ftvccu粼s7ljV45[_55tСVSYΒE;w.^Y{$)CdVr)k^3Z ?a\~EkUJ{:K @� @� o��@�IDAT@� @� @� @�u'aO\sMH54[mU~qonWZYmy[Xڊ=zȑ#75ڷ5t79ixhnV<>WMՙÌ3be5EyͦuHo^eu~3д.YS:mFjAfiyƘ1c[7|U7j&͹[_r<3qE]ti  @� @� жƺa @�Xk8w3]K9� @�ڈAP?O|"^kڈº!nJ/ڭ[^l-X˶4X1Y|'7o^QwYgE׮]Wv @� @� @� @� @� @5jT{6."N;-<@渼kŰ&N^j+x 0`CVg\ ̹ w:Ӻ_yo|#;B矏oÛؗ*v+~?~q]wE޽Wq  @� @� @�Svн @� L_Gcm5.:eߨ L{:/6/rF~B� @�V[੧fmSN?>2xB@{'馛b*N<Em)5 @� @� @�UNm"@� @�Fg WnqG}tnѮ] 3&w;#HXW\QeÛjs= ,Ybbŵ{n|?ϋw}_>UMxƌq뭷O~Fgw3<3:ҥKx+&D8� @� @�F@ֺqt jef{\:^>b⠃K>/=_q @� @� L~k}٧(9#nEO@+x n喸_/ 8Scͦ8p @� @� @�43* @�XϏ p}?àxrH;w^w_,X.}ifΜ]vlx7CѱcǵH3:^_ş/sOlfq 'nm3h>ϳ0 @� @�"Z$  @� Ќwn)b"<27/5  @�4{M6$>'}.<c=C9;C zgώ_Wqwz_^k.( @� @� @� @� @� BusLf̘?n#8o߭߯6l:+!Mo+Lq]tYA͋Em]wO?tud_.wԾB� @� @�Z-Q( @�-IO}CN?=[荕� @�9sgϞqǎ;<H<EE]ua{O < 8XE{'xB?"8_~  @� @� @� @� @� @@ߡ?SokwW8cM7-jhk6|1q @`*BxᇋqũZ3bY@� @� @�@f( � @�&0lXďq!#GF\xak @� @ ,X &O&M'7lܹ-:w *BwѣGlSOŇ?9sfQE?{G1t|6y�?eVN~?ȟY @� @� @� @� @� @�,н{8Ê/B_:.ҢgM6cnV]w5zٖ̝@Xti<s#9OF#Ǐ_d^׮][I @� @� @�& P=q%@� @m8+袈#"rB� @�W`ɒ%1eʔ*kyaYoƌBAYa &Đ!C}Ѯ]꼆Ȣ/?"`+;f̘0hźO> O'@`=3<S=: gu/N;{# x- @� @� @� @� @� @>?|cXQwƨQ6rݻ/@xNjus3gΌZ#8].Wzg!@� @� @�Z@Mˌ @@6-b}m-oFb첈SW|WTr'G˓#fs$ @�4_jӧO_eP_eNlƍB2+[ðFS:??EQ?ٲ(,|׻U, ~B ,\0?zY'sFϞ=#X/رc_~kw#g @� @� @� @�6"^<h$@� @�P`֬Ysx4{챪E[l;C:Ծcǎp.E dO?]e-\ΚnݺN;Kvux;YL}O L1bD׿z;� @� @�S[M� @�|[Eyd#D聆� @�@M4j'N?LS.Sczm]&(+wҥ<m]o߾(ʢ3<3}ծx_+tQ:[Iܬ ,^8YYW=smF!u;s|(P/- @� @� @� @� @� @ݻw~E+2mڴx'',W\qE,Z(:uTjmž^z&@- Ge͟F-Fs0`@Q {YgUϥлt @� @� Ђjg @�]#n%j_q)7rn @�h_&kyYoF5 j5zeeVK[2ia̙3㩧ڣ>wbܹ)�, fmb-Ν;4%ZY?9Xg)r;ڵk[lE@'vqǢφ"v @� @� @� @� @�Xl24Y>OӢ raÆZY+V[U-s,4ȟ _R^x9 .~8裋unϜ� @� @� P@VC } @�Gw##7 _x3&@� @@+)STaY'N ^JCEa͐!C,ٷhvW紅N>}bܸqE+txW?OUq୷SN-K7<z"\+ 3d\+,5@,{ueެYaghСC0#8(plݻwoS3& @� @� @� @� @� @`%Y+0bĈ5<lEAm=E_W-{]lfE}Mؔ&54oD?/2-sNgɒ%@Ϟ=;;#pÇ9}mHfF� @� @�SZ @� r# .5*bW~W  @� Жlڴi±NKv" `,D3fLU˰h߾}[\빦i:f;]'00[fO?~{rVܣGNnZt>lJ-u)6Y~z/rd½ɓ'WݺuƎ'tRl6E^o3<B� @� @� @� @� @�n;YSp!4o_^(ڋ/Xlw}zƌY3M[7e4hP 80:uTC`C EML4ɚ5n։mElV1tТ 0`CNǽ  @� @� @�V" P<H @� @w^~qq=/mn9c7R @�@dAMٖE7/nѫWFX#Fh]uܹ:Gg ;vuע5oeA`'EVK߾} ,, ufU>}S۰… ,2eJQt]hѢJ*ݲH/ñva8C~noYK|e� @� @� @� @� @� <.]Ë̙SѼE�+2G)Ν[u oqQ'UEٲ&/ZtY@oe-cڴiꫯV-r˶`۷/{e {QemN6۬, @� @� @�) Pk}6 @�V p5cF=>W�e7 @�^`޼yUH²ϟ_%2fȐ!E e8Vr_7h/н{~틶fXZYe1`=HG-3gltzN`M6٤ZgA`fkϐl={Hymd8V峞1cFQkE,+YWYf5D/h4,ɶ;P#e^Y @� @� @� @� @� @�K XFQ#Cګ)kj2hʔ)OAGYWH *õ&iרe=MuRӧ=:~&or58ٲ&'koreNw%K4n\V5}Y|Zk� @� @� !jmu$@� @ rK;G}vu׵y� @�43 )b'V[徆!7;v,n` 9 ,KǦnZ~E!`,iӊ®gy*;w2­,ZYثW 0~{Q,`,P,C:w,`7x#<[sr;L={vQW,˖h# 7ˀ\ov1a„"H-  P]vM/c� @� @� @� @� @� feE[2)C24瞫2piҥ\6kbp:Guz\-ùv=@>f޼yEM:ɺ'iϡiڰabرkYp8- @� @� @�$ P%=-c%@� @U leq{qꩭjz&C� @@3P '*uӰ,* n2&hʠڪ1{V۹?[Ӿ}f:sj)YԵ[muƜo~-Ú yz嗫~³;5oseVÖE]t) s YlةS":Cz:vڊZ<.te[xq/-Zҩ7ߌ 0+/[Y>rʖSPfbˆeV`!gr Z @� @� @� @� @� @�.u&uuuE[ݹfmIdMM0))Sğj;k2)NVdG4me]M)kmΦikZcSzU69ڔܔ7 eYڛ-gMߔmu>)ʚe}o^58ְY @� @� @@kڟ @� Ь=4⢋"9'b#vکY @�h*) % i@!Cȑ#mk,s 4',+k3,7o^QW�f`$tEneT <',+aU~L8KMkD-lm\ ˂†eb./  0Da6/[k!@� @� @� @� @� @�x{2x*B%ka\ipT֔83f!] *5 Z^5K[uMn5iڛu7MeMєu7徬i,7gM[ܗc @� @� @�Z@֪A� @�*F<PQGEz۹8 @�-P z&Nʰ ),)C2(kܸqv}" ,E={,ڠAWG\vYԩnhD� @� @� @� @� @� J2PO>EkSRoܟ @� @� @�ޚ@l @�e"~w+S#n-_ @�h!5yUe͙3Q&eO5jԨ8C2(w9: @� @� @� @� @� @� @� @� @� @�. P?!#@� @M EoWqymb&I� @ ,Y$^}UekAcU0ְab„ vտh׮]u @� @� @� @� @� @� @� @� @� @5j O @�hɏO}*kQZŴL� @@Xtid֤IVaZWc <8veFUWW;_7 @� @� @� @� @� @� @� @� @� Ц|+cz&K� @@s䒈{8؈ѣ @�ٳg2(kɱpj=j3 lO/k׮9: @� @� @� @� @� @� @� @� @� @� Z @�l0#~v8̈`Cqc @�F`AX&M'7ݞ7o^5.]ĠApѣGW2(kȐ!ѳg @� @� @� @� @� @� @� @� @� @�v$@� @z}g|{'^n @�Zŋcʔ)c5 z׫v!pۮ{j ߿u @� @� @� @� @� @� @� @� @� @݁� @�k,pA\qcD Ɨp @�+tҘ6mre1<3 tMkT P-  @� @� @� @� @� @� @� @� @� @@ռ @� @#~Nx衈Nt @�X3gAY p{ʔ)hѢjzj7.ò:w\C� @� @� @� @� @� @� @� @� @� вje @�! кᆈw+K#. MT  @�Zo aYϯֵkFX{ 2Ѿ ѣGu @� @� @� @� @� @� @� @� @� @@:Y @� J W":+#ܳL4 @�ZEbEXĉЬ *[5kV5;`#FLXV~st @� @� @� @� @� @� @� @� @� @�ڶ@͞� @� EO>ѫW ! @�4{:ujP2 +excҥ|ڵklI[رc 0`@o߾  @� @� @� @� @� @� @� @� @� @@| @� @`v;DsNü@� @1cF0 ʰW_}5/^\ݻQ0֎;h{1hРԩSu @� @� @� @� @� @� @� @� @� @�u% Pk]I @�֣]qqQf.M� lΝʠɓ'ǂ 9t=2 l{g2dH/_, @� @� @� @� @� @� @� @� @� @�6@ % @�XCC8Ί?>bM'@�hofd֤I6qĪpߜ9s9t) Tb92>hէO @� @� @� @� @� @� @� @� @� @�U@Vs}2E� @�|wq7߼"@�hVK,W_} Z^PVfM>wkᩛTX[ou7jǴk׮:O� @� @� @� @� @� @� @� @� @� @@KՒ @� z#=0 @dVa5lM2L+Cʥo߾UPcԨQe 80:v5 @� @� @� @� @� @� @� @� @� @@m9% @�H_%C8眈kE3 @@3={v j.\Xv6j5a„b;C RvZC� @� @� @� @� @� @� @� @� @� @?jB� @�-F+#33"n @  @�T`5wj;wAUXK0(W^9: @� @� @� @� @� @� @� @� @� @�@57s @�6@]/qd� @� &x2e*òf̘QC1`"+vg} x㍣]vy: @� @� @� @� @� @� @� @� @� @�ZU  @� ;"=7b"]t @*tҘ6m*N2kE{;G3<+_ ղ @� @� @� @� @� @� @� @� @� @� <j5` @�X++/""v.$ @5kVL8QXVɓ'ǢEٳQ0vmh; ]t!@� @� @� @� @� @� @� @� @� @� @ej(  @� \>}"8Ĉ^av @�67x#2i8V<\vZae ֐!Cb̘1UPV/=z(O&@� @� @� @� @� @� @� @� @� @� @ jet @�h{GqPSOE(, @�u.hѢ2e*fΜYݻcǎQWWWc1"j;ó2(_~9: @� @� @� @� @� @� @� @� @� @�MZm5 @�L#>3ZL�X1mڴ4i ò^xᅘ3gN5vE`-"Ǝ[mgHVe 0 ڷo_C� @� @� @� @� @� @� @� @� @� @� Z @�hAxGg?oqIÇ* ^eBgM2%/^\wU0VbœO>w^}+^4hPtܹ:G� @� @� @� @� @� @� @� @� @� @�oU@[t> @�YgE\w]9D}w3a @�E`޼yXMñn/XnݪǞ{Yl+?袋j,O=:vڕYgxa_cر˼n L6-n&Lqג,=ַ3a @� @� @� @� @� @�f6 @� @� Zj'i @�y"?###9͓� @�-N`…1yUe͞=[NbUXȑ#3<+[߾}sv??",+Ye{o<+ M>=xӟ$P!>�K.-=cƌ/c]w�#Y-_|x饗" @� @� @� @� @� @�S@um @� @� @n=]� @�T`# .ZFDt8nN�C`ɒ%1u"(kҤI1qĪp^\ڵk ƍˠ<&]eȐ!ũy38yL<#1jԨ?ı燌U, CL�G{'ᄌbqYgO~xǵy~c6[ 8� @� @� @� @� @� @jY $ @� @� @�@f0 � @�B+"n-Sҗ]�X@`5 ~ÖYjdV۷Q0ȑ##ʐ\4(:v\۽{"kM7-B7f+w]{Y^$@�֛K/|~=:tP[GVs{"C� @� @� @� @� @�h]mZ4 @� @� @mocmfI� @�f#п>G lf  @E ̙3 P!Yeɓ7߬F5 7n2AYխ[r-xGt)N=Ըꪫ?i\pbGq[>lP^ڡC�S~8~3<y/B1uZmg3<Ol<0˖aF~ѻwXxq^{m9k_Z<ӵ0OŕW^爋/8~}W7?|3CYgU裏.Br7pCdV�aGܑC -|ڴiկ~5xٳg|ɅAI @� @� @� @� @� @�h3m۴7 @� @� @�6$о T  @� f>ZF @�X`Ač7XBdXDJ> z*N,20"&>5\կc̜93Ν=\׿E�G>"b*$[VzѧOϏKFb>\K?W_}u1o޼rJw^کC�o?>vy"jq1S\?�]w5N:"yaeXf׮]4FUO|\V}{vۭ\vaE{㮻*cb~H~̚5ؗ0\r>`yg?/R98}__| Ab\rIL2%:FT @� @� @� @� @� @�z6mZ  @� @� @@Fm @�h} vBAЪkr @XdI0iҤ6qb]nf̘Qe`C]]] <hÆ &Đ!C}Z]vyR\{Yj)_}lѷoxc6,28묳 ȥu  @�oI_ ~Sae�zW\qEn)A;cږ[nY|ɍط/"jȑEV=:x"<3C6tȐ24+?p g7ZsN<EV^zO~ {<>Cr{"úw|.^dV^%Fǎ[ijK}fV~8St @� @� @� @� @� @�Zz?_6}nv @� @� @- jO  @�h{qQ'�[69fKc5 SF}}}Eѯ_FXK0,kѡC(06|_Zeѭ[&62L+ %- @x꩟Ŝ9n ƌFx`w}q-Z 1bDd?o?Ad8b;1o޼:th̚5ؗ!Yˆ %V+;k7�x-V~eWtҥ6,2,^y??я̙zkӧʝ9_%׵kX @� @� @� @� @� @�hmVoަu͎� @� @�m_޶ @�  7"9O @E d@äI4(+_<yr,\_=cm2![Ӑ:+;_zo~32Pky G�֗p)=s5 jx@ngpi.>lc5<Q>qEVjeW\{<CqZ;Sdh֊u]Wsg ӺOr~'jp  @� @� @� @� @� @@Poo�6m  @� @� @@+Ji @� @ 8(O}*j_@ѧ ̟? Pe7xP` 4 =zt2(gϞ9:N`ɒ%E@_|/| կ~uĕ @�{vZu!Cj_vVFcE/Ɩ[nh_ӍQFŮ7|sq`뮻b7/B/^~mg1cēO>G?a|~FF~3gN45X@; @� @� @� @� @� @�Zz|mZ[T @� @� @�J'!@� @�&}F< x-W^y%y䑸[ꫯK.$N9cĈѯ_"a뭷q '_W+n8餓k_ZySOӋ lȠo1G?Z{G;zˏp]h\y1  kױQ~j<cرcuo6<l#G|cKV?qEU+j��@�IDATqc=6."(5õ2Xg>xeG~ cq 7ĵ^qmÇF=⦛n?u\/Wt @� @� @� @� @� @�Zz6]n @� @� @ ͜� @�^Was#nS6AX N:ujL4j'N< Y78 Rlb̘1Eܗ}k1*]gώO~qgǰaÊ3<[VL07k֬jH/Rџ1cFO�X_]b}_Wq-{FNڿ"4wg\8Ë@r_[??OZ-BO:<@qiӊ__yrAZ\pA}{_;Cn7<?ri$>OC)^c=sqn/5.?~|q^fخZ @� @� @� @� @� @�mE@z^7O @� @� վviۛ @�'E:`@į/m~3.Z8_Ùws}2ˎ7qQ Xu{ @u ̜93c5ݞ<yr,^ȀXPrAp$+pEŷxo߾<2㠃m6y" /#<2N<xw|%N=< @` sյPbƌ3όo=9XpazuM7;↹/åz"ӟt|-F¶?VP}eև?x衇⨣*Uboy|;)N8"jѢE6D~v8ӖdmvAZ~{X.WR)??d8W~O?bY$ôsI_rdk;c/9W]uUt֭5 @� @� @� ԫh  @� @�(Fz|{46+0aBĈ_z%0q @� @�@f0 �ڶ@pgkf-]F˩#~:b5v%@� ̛7<4iRn͟?@ dAUdr.Xچ@beXŕW^YiY%h9e_}bЯZ.re&aS/Rվ}e^_َ zڪX͞=ԩSӣ:9 x]dI_Ν[m :4z칢O� @� @� @�`*-: @� @mPoYMc[@ss @� @�G @� @@s8餈/})6:!@� .ɓ'W!Ye`VӰYfUu1X;cxv/}!Gc-3< 6x?~ G!T Z ^h׮]l YW^˜:aZyRs+C=bȑ @� @� @� @� @� @�)FM|5 @� @�hZ53 @�4}/u\~yGDwe 6ԩSi0VӧҥKe&lRemV{.dq7oc98ꨣVz  @�Xtv_-|+\ @� @� @� @� @� @�:6+mVU @� @� @y j @� N?<b=".$]�m^`ƌ ʚ2eJ,YӧO5x9r2AYN:UXuGK 6dҥ @� @� @� @� @� @�B7 @� @� @u j @� ?/c. D`ܹ1iҤUeՙݻwo5nܸj; Rlw֭:G7mݓ�X; z: nq Nr( @� @� @� @� @� @�V*ަ>X"@� @� @�C@ @�ژ>DgeEuW @@`M<yAYs̩ԩS 4PQFšLXV޽st @� @� @� @� @� @� @� @� @� @� @�U Z# @� .4b"~8b̘V7="@ ,Y$^}UekTcU0ְab„ #ڵ!@� @� @� @� @� @� @� @� @� @� @�֍@u* @�hQ1vlħ?q-jK@XtidĉcҤI˴riWR2k]vˠ_Uh: @� @� @� @� @� @� @� @� @� @� @m-o3 @� @|G7QmU`E@V007yXpaEԣGFXO ֵk @� @� @� @� @� @� @� @� @� @� @y jŨ @� 8 b">_b hϏ ʀ2 j=o޼JK.1hР*kt- *C ={V @� @� @� @� @� @� @� @� @� @� @�-[@V~~FO� @�$OFrHēOF[ hc/)S2(_d:tuuuU8;w} ʠ7޸:G� @� @� @� @� @� @� @� @� @� @�hs6K @�,W#v!K_b'mL`ҥ1mڴeM4)&NXW:6t3fLAY2L+C, @� @� @� @� @� @� @� @� @� @� @�&@� @@8/eXh3g,°ce)SbѢEB^cmv1dȐF2,s9: @�ԩ??1bˆ;lQ=Ǝm @� @� @� @� @� @�$ަ5=Ms!@� @� @�@sr @�ZqE\rIUWE|˭v&FU + j5ʡk׮Bv}eѣ:G� @�+P_q! 0e}˒}(H ҮCiѦh_TR'JJE"$ "5]ifyܯ~{=s^gMtJ(;@�@�@�@�@�@�@�@�@�@�@�@�p`MQ� � � � � �.@VF� � �@<]wIO<! "-ݥsǵ}dònۿ_eխ[W;v<-,Dcx� � �!jF;7Px� � � � � � � � � � � � @ 0&)=B�@�@�@�@�@�R P+5!G�@�@�r@~ғOJ& :Lf'Oj׮]em۶M{n:uʵ6""BJeU\YZ:-(tʕ+W6#� � @Z@/[Vj2=@�@�@�@�@�@�@�@�@�@�@�@�`MxGz� � � � � �*@VR� � �@"?)4p7ow!{M5(kΝhѢ ׯʕ+*뫘'O1@�@�@�⊿F&؟_/2wY@�@�@�@�@�@�@�@�@�@�@�@�{ۄ- � � � � � @p@�@�ȹw%W\z@rem۶M[nM>566 bbbԺuӂsۏ@�@�0_ޮ:w>L:qtt>A�@�@�@�@�@�@�@�@�@�@�@�Wۄ띥_ � � � � � @j%§ � � @(_^2iH s縛;|Qm߾=A8V,{AT<yrʹ  w>-,Xbcx� � �*Ч4uj{ר!իw|� � � � � � � � � � � � @8 0&*}B�@�@�@�@�@� P+i>E�@�@�rRҲe/8qvܙbPֶm۴{n?sʥRJW6mڸODD8^ � � �)pRTtH³F 7$w � � � � � � � � � � � ��m?@�@�@�@�@�@o � � .@][9Rz@ Xa_nݚཅiY/^c+Wm7n|ZPVtt"B=  � � KW\!M {W � � � � � � � � � � � �䄻L@�@�@�@�@�@�O � � @A矗Kot$ŲAYٱcm)X`v%xGEE � � }Hw+#"$_.V3^!� � � � � � � � � � � � SoS4D�@�@�@�@�@�.@VN  � � @"뮓|P;V80їE e:tylٲpMU\9"E � � .^W}(W.fgA�@�@�@�@�@�@�@�@�@�@�@�@ ' 0&'u� � � � � �9Q@x3 � � @ҵJ*u|cǎTòʝ;J.ʪUڷooYuY?~�p@�@�@�%/{Ko)?.<)ꕣ, � � � � � � � � � � � �~)x� � � � � ��Za}{ � � 6[oF̑ڵK98*N:ݻwk֭)eڵWW`yX˗W˕+^)SFł� � � 5e ?X@�@�@�@�@�@�@�@�@�@�@�@�ȱ̷ɱ#� � � � � @ P+l� � �*PԴ4f Z~?-(+qpuq . N:eaYe˖U|@�@�@ }ZIҎҵצ\� � � � � � � � � � � � @ 0& G�@�@�@�@�@�R P+u#@�@�@ N<h߾} #G?Lq'N$iÆsuEǕ;wkddiϯ (mBTX1FEE}(wF|YJ,! `۶m;mMeyYue&  � � @N:w^ڞ;v̅۶x+sgg}m7ͫ<y򸭅(Q·OqdɒPx{@�@�@�@�@�@�@�@�@�@�@�@�8z>jx[jƟ3cVj$g6[oESG`͕+=^V|VNJeNk � � � � � �d�ZY@�@�4 پ}o`Nڵ`"̶Ze JZ Kn\-ok,&fʗB?dܒ/_>m8tRkҥ](}ΠD޽{>P3;3V~>,]eխ[W;ve+Wν, � � �+`ǭYFVʕ+~zm޼Yl"�-6aς,VPM³yѳ|e|_v(Mg><V,bM,XJ*VZS[;@�@�@�@�@�@�@�@�@�@�@�@�)`W{uKٿUk<gT3ē Vj$beY}ۦ\y6Ѿcȑ.pB=6Ǜ}f.xH><B A6?(ZH-ZMI:HI,{@�@�@�@�@�@@"P@�@�HmܸѭV\[ಅj/6 0) *[lAT6` psv-6BŽ9ֿā`߯^$g7k +S  +]|yVXQ+Wvm?|5ս4f Z)K[iax[n=-,+ggVnժ}n?2ɴD�@�@�r?.\e˖iݺusm5kg:Co:=I9j)6&"F agIWkرc}su95kL-Zp=7aA�@�@�@�@�@�@�@�@�@�@�@�= Dz9%;vЮ]{n]W`BGX-콅DYaQ"eKl'4W<y_*C5fb+IѣG]7dy/H,61cQ^Ւ59sp-c$Xo`2@�@�@�@�@�@  ;L@�@�NB֮] +[qe[7lBl 2/zj۶ ʊvaQe96x,f}5- Dـ2煏:u YlTjժ|Պ[iZ;K.֬wr{yRV|۶meʲWa^PV_e7oޤ.g � � �Y `׾͘1Cg֏?( IkPuUWڵk -�ޥaMBIM4I�tժUnvO>]/N87Y`E]V{f‚� � � � � � � � � � � � }Vd^z56,@رc i 2Y}͛& oJ<&6iiYݑ=bȂlkg|oiҥټK]՞^- okjUX@�@�@�@�@�@�Ptꝣ � �A-p)mڴI+VO?+Wjn=tk Z rj߾lYJTre@3l sI�+ mF7nd/>s`gVZvz깭i/|L;Vz{$gO`^Pm[n70@cx� � � <gĉ5o<|5kԅ^[-Zp[Mv{xb-ZHf}'̞[YVաCY(:  � � � � � � � � � � � @ ܹS9,di<xy*~R˖-{L2ҥKe .'Jr뙴dǎn뽶@5 V[layKܹUlYUPA+Vtճ6먨(ow � � � � � @ D V @�rK(=[j6qG{Lڵ+;û炳~-]T]|P 0[ h&+l0&?vZzf![=z++$ݨQ#6nX@p__ 2  ;v%J~+&nK,^/^ /@�@�@�BC&~Gn]p-Ν;cǎ.H%Pbꫯ4m4D.XgϞ.\+222 {N@�@�@�@�@�@�@�@ X,wv � � � @z̟cY= [׭[Z֑#G%( :�$ BlkXJ,Iސ0>>66l[HYPF_ѐÇެVFjTF U^ݿ=U`0k @vɒFHn>G�@�@�@�@�N@J �(@V<!%B%[jh"WTEEEଆ zVp%tN8#XB?-[BؼyshBZR&Md!KԠ`Բe._a`#/sZXZP²lBg#� � � ߐ}FӧXbtUWy&wh~n3?cڳ0 ۷n713l;N@�@�@�@�@�@�@�@ m\@�@�@�(Mj*^ڭOwB �# 1�#VRխTr⼕4rsX~`-[ׯ_V y[lq57ժU˭kV:u\jBFL@�@�@�@�r�Z9FM@� P+QZ[q6믿ٳ5o<Yܹs>͚5saJ=s< %*`ľ{pB޽[w?ڷoB˗mɊƷcG嗳j_Bc{oೝ;w {KS ʲ>{bl@�@�@�ؿFѣG կ_?u-삳s7mrܛo1cƸ ;w}ݧ6mڤ� � � � � � � �$`>V � � � @ X~˗/O?³=\r,/f͚ AoXY_W\GzTn]5jȭnuxX@  {H@�@�@�@�'n@� P+o_gW<A 9s>s͘1hYHR˖-]q;O-ZP…4*l@jl6lPTTgK.QN\ZVЊ+W.ݗ|Qץ-[ӥz=֯۷zKeĸ6j, � � �Ç߿ ҪR @)?~\SLooFm۶Ր!C\x  � � � � � � � �bb'@�@�@�{xb-Zȭyfwe jРׯjIs9] (-d̯XB?[G=v옫b![M6Uj![.ǂ�%@Vh/Z� � � � @ w!��Z!sθL:cl9`/%hn;wN<f͚/V\V޼ym\4tl@جY4}tζk.UPAݺu_MGFFfxO8?PO<p6nܸt_cjnJ0_~X?{m[ ʲC=H?B⿷E @�@�@�RO_x=sʗ/o-SBK;{SOmڴѰadvc@�@�@�@�@�@�@�@ UcJ � � � I}͛kZvN:jժI&nDF\VR28~µ,Y,p*\Ӻukwyjٲ,{E jO@�@�@�@�6@�+@Vz&pݱc&L>@-RbԹsgvtExxZr6@rٲeO5e7~Ʈ [|#Jrʕ~Y11cƸ"Je״BsIy4ZF>{;w0X:{)S`aY%KTDD8^ � � � iӦn_?{U`c}} &l}СCyO � � � � � � �IXib @�@�@�H}n wv!Zh᫯J{ ѢIp9$ <yRVru|[ٺrJW3hIzPB9·#j} � � � �,r �A,@Vߜt6 \Ï;Œz-M>]%JpF={T۶mWt$-uVM8Q~,XenM7ݤjժ%}P2߿_^x۷O6[T 6xoxk\6B^|1J|RWhر5Ax!ݳ:+ՠhΝ � � �E~G+T=G7n *]س � � � � � � � �g"|3b_@�@�@�8_W_iڴi/\`5GlmӦj׮�I U:[/^vN:¶X@ {@ @�@�@�@�@o �*@Vgř€F^{MPn\xQǎ X3K`zwGk׮Յ^H;v5b=zT'N8m ç}nؠ3V ^{۷˂Z,kʗ^5jlNU\c � � � K.ՕW^~~7 y[bNu=hС<dsN� � � � � � � @8 0+&}A�@�@�@ ~ɓ'@(X[k֬2{l͘1CӧOתU|uLʫ{+\]ܹsD  Ak@�@�@�@�j�� 4jͭ0+IN3wUŊտtM*Q*9sW_դITJ <X}IPtzݺuzofťؼ~Z{IeY8 IrժUau P^ � � � ~zm=#*YdP7_~j޼tZhp}A�@�@�@�@�@�@�@�L`>V&rZ@�@�@�r޽{esJ{=͟?ڵu͛7iUW`ӦM:uL)={Z+-[ ކ2P@0t @�@�@�@� P+oMG�/~ kd-[vE5kA{ȺFp%!`?Ço!+SOf͚. nĉ.`]tҪTiaY:묀C҆ N � � �dQ4`� 8P/rʕɉ_|.R/^\_}J*3 � � � � � � ���]@�@�@�@/p)}=z 牎v<zRӦMS`4i&L!Y[nE7tsѪ0 P+n(A�@�@�@�@  H@�G@𹗉{"رczgZNBtgE9;(gu]t4]ij۶mM|wI-[J?$խ[#� � � <o03l޼Y:tPTT-Z4*e@�@�@�@�@�@�@�TXJ � � �@llƎÇ0\y啺]@ ~zwokڵ`AjP$o'MBFL@�@�@�@�r@O� � ~5jH#}F^i]<묳ɓ'^zsܹsܹ֔u֔v9ZʔL9@�@�@�,9sGy0,Ob*Tݓ?CW]uN8|� � � � � � � � � � � �(pQ⋪\~im6Η BV@ *UJsVX3fСCjذv˗ai � � � � �d�Zɹ@�@�M`jٲׯիWg`[ .]Upa5h ٳ%m0g<y\ۀόZ|ХQ@�@�@ vܩZ=zpZΘ ՚:u͛'|2-@�@�@�@�@�@�@�@�@�@�@�@ |GU^y=3ڰa bŊ!�a&ЦM}'Zjoڴnڵ+zJw@�@�@�@�@�@ P˓`� � 6;t>/^<S^ ]^x!S[lٵm@_,;C^zeI$Te]~Iȑ#5dm߾]6mҸqt7jժ;v,CݺII, � � �w߭ _egnݪ;Ck͈K/ɮ*͜93ˆ SO=Le_@�@�@�@�@�@�@�@�@�@�@�@\~馛tk͚5BdddP̙3G{ :uJvAڱcG^2jS7VesRF WfҥnT:udX@�@�@�@�@�@  {J@�@�%kĈ6mn,޽{5k,}g:|p\ӻȮ]4|w'Nx:z>s۷/ۛGGGk٪W.BUbEDž_^6i$Y]RQQft8 � � �Xd/PB;Yӗ=p@8{f[yWݺu5~x=աCvO6Y՞i<Ci:@�@�@�@�@�@�@�@�@�@�@�@ g ,^XM4qu+VZ„7nرc/dz;;uiܸqZ|2.IzjdGS0Iɓ'o-`gyF7|Si  � � � � �S@tr8 � @ L8 l裏\PVf͚۲r Ӹqc]wuܹs'.Ĩo߾UV43Η/wJ*+u)Yw_|Q׿|7 HmHӧL� � � @ 6LM6Un2!|m۶[oչ瞛b/,<K/Uʕ]{ڵS?_G}TSLњ5kzC�@�@�@�@�@�@�@�@�@�@�@�$`kN=zW_}ˇDﯿz5h Kju(,\ϔ륵扅?u!Rd9s[ZSjxu\BLJ}Jwr.\O>DW_}u� � � � � � {!� �C\!{W]te`\6; FFFO3N0A֭~.PөS|!N� � � @&M3fz��@�IDATvkԨ, B v؞-؄ҥKSf?y6qծł� � � � � � � � � � � �$eW[[oՋ/RjKZy۔5Z'6zCi֬YS"3=oJmڴ)C>ɽHm]z4w\͙3G>`vv#� � � � � @"f1E�@�@ P7|Sqqq׿!_|kӧך<ylݹs7nAhѢn?C}f5o\CUB8r䈞}Y͟?_yQJw}Er1'k[o^zIVX!3)-6l<z?ԳgO^Z>=~K.Q } hȑ:qz+sٲen;SZ\; dv=ɓE($eKOZjv^}ڼy[hWvO^x3lA# [j EI/fA�@�@�@ ͛Xu5ڒ󉔞سq)**Jw؝:u]w;b}wg@w!{ߖΛs3AuU{>r& t_׹sg}Wz=@�@�@�@�@�@�@�@�@�@�@�@  ~SI?v옫7߸ Vw*]tڵKcƌUjU=*SϱuVٜ>@qWdɒ',YD'Ntu.l^kOu]ثͲo>Q"E\]Զ<IވiY[nfW䩧rȤI߿ J"Iw^W'Ǝ\bTmܸQ.\;υ4ůb}]W{B J^\O>qdunTzu]pm6YH\fқٳgz'G#޽?W4_駟/L:ݛ~Z%7ʿC0cǎե^˜  � � � � ��Z}h= � cl_… gTM0Amڴqf̘5k`,k~ـ7̵j*dӬ(6@* 矵vZlRtEx{mʖ-?X;vP.]RN߾}@-;~Ӟ={daR}Z6(, PXAe+ڼ~z7>K/O²l@ծ]jYx p{ձcGVJ3Ǵ,faTG ;Q6k֬YLbl{_s5С>s}嗮e 2ąmֵ1 ޔ|?je66G�@�@�Hয়~rAT'mt`;|"/V )6A^3 eo׮J*&MZy=MJtel9:viD>[FQ޼y-Q;&MIpjN� � � � � � � � � � � �a"`0ĴiӔ;w6O|Ai߾֭SNP$ T\͇z euK,b+W΅#\Rwq;LLjdX9sy+I3EFF@.4B?MJu5OR7reZ%f_^Z-obGN]L^[p{YaY-b?g6,]Ե)Zc簹7tlͫ.?t[nEk֬Q]ȓaÆ.@B^Y+zMKu;h?Bz6_3СC9眣ÇRKGԩs{dukX@�@�@�@�@�@ rvi= � @NAC-'b 7 ٠5e˲e�"d HA^ّ#G4{l7)O<SeӒ%K4l0+V `YԮc!P^Ȓa�/ ӲAg,]vu,kѢECkY�-`KDD�3}mPB.̎[-6`[fΜ 2s44h dp\l Z|T\@�@�@�lVfi|"/6qlܸq6AB̧~Ɜs1cƨ^zرco>7A·;ouR[xN<&Yڳݻwg@ӠA?oߌZM<zhFs!� � � � � � � � � � � @ XhӦMPGquG^|E.\X;vTu)S_WԨQ#*_J,sX[/. {9+O?2o< s V#XW޼ySR$z#-Zp.VÂ-_~kͩ6Y҉'\=TRvRU [=we… ]k&sc]~,O>n3裏dl+W.�G}T6OW+J*> d5 TKեKLf^EIp+YWq>)]Ν>Om.UW5 � � � � � @�9@�@ 0ܹؾzuuږ-[k]~saUVMwremڵkԨQ*W >s`1[Rc7]5mԽo _v}ph=\w|)%k%/%>&60wz7ܠ.[ PAk^PZŊe~am޼Y?>@/y?zx'"3|cX@�@�@�[@O$BmMh &LJٳo9ݳ"{Fd7n:޹ۮ^}e6+T^7kLC M"6ю@�@�@�@�@�@�@�@�@�@�@�@ob*ڷo qqqz$ 4^%tA8"Va=l-[v\ӬY'O_:'I\jvt͝ѣG6Y@@||fz.%Jp_[- 2[ ,rn.ЦMɓ'$^K.,Ot 7Z,֟F_V׮]հaCowM$X]Us[ _r&󕼟% Y={=P-8 � � � � � @fʌrN@�@�l<ѱcU}Z|yƜ,blF/ŋUViݺuStidAN RF6XmϞ=.oP :eKnKxKbl�+ׯ_gJ/ v<7 O`'[-[j޽V6~[Ѳ5j} o{˅5o^V^k!� � � @RcǎL私<HKRs}5Ϟ/h½]fzwŊs_şi[6n݄|e9 � � � � � � � � � � �@ƍ]ܹsGVfx !QQQ$k$S�4Ă,Y+VpZĎ ވW#ŻJ޼yo>5kLo:u}uF@ bV/o{u7W^.X\ve.pȑ#n#IYrjժ x:J N7K93 kڴiv7#� � � � � @@�HI7~70&=.-ݻwפI\X`_u S_|k]_rIl68ѣǧmSidS^uM2E\sLſc^dvl '*/ ςF5zW_;ٵ7NV4&2|bҜ9YzY.� � � @Ӷm2%T+O/^\6n˖-ɓrʹeʔq-Z111}I vJ{e@�@�@�@�@�@�@�@�@�@�@�HNA׮]㏻:{5B>s Pxevر W]u :{mOIF' VK.Q߾}oVZWov'LeGa˼yx.P\\ƌ˾>}z Lw?ϟķ}2z.U/׭ޚgT � � � � � ]je<E�@�# .1Ͳڀ(+:Od5B 6tN:?|z'0.H%Jp>|ؿo6H.`*8eɓ'6븝23| RNTHYSD/ڲ~7? zUlY]ve/] ZΝ0{WK{ァz݋ɓ'V(|ذaDV^ۮպ r=@�@�@�Nh#5**JSN=t~_wιs&hŋ?~ ̄76^~}-]4˗kF/\kڴi 3Ԝ@�@�@�@�@�@�@�@�@�@�@�L`ĈZrL]Yg?Cit5h֭R{8py"6ocȐ!ڰaz}Fd< ވGY_z"֡CznVl_}?\;O*kh\ UVhǎC4gݻW^ѣGݾcsl1cFCJ޼j$hDY~nWQFA"� � � � � � P+� �"PIʎ|}F ҨQ\g}vFfΛ7ovf˖-3oS}?�'NTǎ5zhvm5|p 5e=Cp1_ۤIO?*;7߬ٳgϞ|Iw pꫯulcҺXT=Kp/\+dמ-[:# z=B>Smڴ)O{XVѢEUR%7 >-[7W:M0 ^tbwyn�9@Wzu}YyiۋWp/@�@�@� /믿O9H2/+ok= Yzŋ~$wv~sٳ'_v{9wL234ʂ� � � � � � � � � � � �$`N6s=g y3GyĝtMNHjԤIUR}&WZ][j=,dXM M&[EšeK]t WG _Mi;h uJ5O7bcV[o"=ai|,,w\vN\kdΝ=9 # >bE,Ymɒ%5b,<Bl)Q,sQbdL6M// deu_͛箳n:7N}kad tRJ?K6(T;+<mڴQ۶m3d% � � � � �d@G}K\K � @* 7H+3_r4`|A!ol:u|!>`7<Tj,i7|d7ntm]w>fծ];~݀5+<fկ_ߵwɒ%su֭O.u.7ʂ,p¹7n, iڴjժu֭l FYqi;GZe˺Я<fR_&flYp3�+[6xoU]lY&N?[nU>}N7,O<n�\ut60?t~z "|}ڵ9vi]y啮_~eE@I^*+|� � � @ T=\i>j֬aW)=HԩSݳhV6A .PA\iĚ5kd�N̞:619c 7&9k=k2;g{=?MWf͜Mz � � � � � � � ~/͙#!� � � @*T 2d>Sl*s͏ȟ?ϟ}5~7\=[nE3gts:{qٰ96R_ f͚%kb\Uzu)SFJf[ؓO;o>Wx.tXF:t,XX kyl2՚'6&z#V;ӤI\!r5(::Z_bNbYj׮??Z%Z'j5x`e}dfeY˗/w5QVWd׮]_+…YpڵkݜK98ՆywσՐ' KUXe˖jϳe˗Ovٳg5b絟g}v.s=jŹN6#[?={TΝU%>eo񆫽b?S jˈssrرo|9@�@�@�@�M N[h �9QB?$,mۜ(}gɗi$X2A ȑ#eɂm˽~z7͂.8p ڝ}~1mٲŅ<KsX!Kj׉oz^ۀ%K&ymO>Ƀ|<xP6b/?k Rݤj_F<hʕ+~S3;t嗻y6@Bղs /T,;[@�@�@�KB,« *,|ž1Z=v̘3l+{M=s2@�@�@�@�@�@�@�B\7EH=&_G�@�@�@� p~G}ԅWů VbӦM.(=\ؕ"k؜ -'$~o;6G%m;~lh浜ɒZߟɹBVXw*U(W$o޼h%RR4+0ThQT WFWʌT  lR޽x&C�DW+mĈ@�@�@�@�ǝ"� p�Z//͛'w^t+:2zh 8Ѕ .)d z'4y[UH͚5+}KةSTp}.8z8qʖ-j3{ݥܹkOf_#� � � Ν;eT:t￟!G(?YlZl|P<H\@�@�@�@�@�@�@�*J � � � } :0d]{ eQCa^J8C v/Yڵkkks)@h @  ǻJ@�@�@�@�]_;Z� �!"P+}{48DٿhB}QZ܀뮻N!ڣov.]UJWʟ?J_gwEuSkHӦMS%߼ynYx`N 6, i  � � @({ gAZ\rj֬vM<ĞmtU[?C~& � � � � � � � � � � �d@=ԭ[7%s<;t-Xbqɰ8g(K z(/ܹsK/iʔ)ԩ,Yg%97 � � � � �d@)ߒm � wtiilm[HM :Zz!;ígןcǎguk:uSO/"سg#F^zz԰a�ΚݾVjJZNV-kU@�@�@�HM୷r y=(`aZ:tPTTd?@�@�@�@�@�@�@�@ 9_l=kWr{9 � � � @llƎÇ0\y啺}5|*""y�!# ;C~[k׮U^4h խ[7d@C5vQ"� � � � @8 N'@�@ bbmۂUٞyjȐ!Zf�ӥKlR&MYyõW[n}ݧʕ+?.L5"#ŋn/@�@�@�P#}Օ{G'O n|/_;O̙3 ;J@�@�@�@�@�@�@�@�@�@�@�.(_WԩSe[_|pj!P !A ipN:)WW_յ^-[hܸqi%Ƨ � � � � ��Zay[ �@֪nOyرcj*ժUKzR54l0ݻ7;OBZ`Μ9J*n+zolԑ, (@�@�@�,p뭷j5j:wݻw`￯VZrsUR\@�@�@�@�@�@�@�@�@�@�@�rdС>#m߾]ַ~͛p;C3fбcrD 6mڤ#Fcǎ*],jժH֭<P@�@�@�@�@�  P+A9 � @j H>l 3f6n( $:tbbb\`ѴiM*ٗOf͚ hҤIZznEFFzޡIp}@�@�@�z_~QeτX2W`u5ר_~/Uh̽(gG�@�@�@�@�@�@�@�@�@�@�@�'PD _Ӗ-[\HϪUԹsguYڵ^y74:Ç]T:u\؝+_|vء#Ge˖Y(� � � � � �A'@V� �(t"P+oh=nۻᆱme˖uE}gΜIV6ߣv[ZnJ*\W]u֮]ӧK. Z4dKC@�@�@�r@ƍl2um![[S:uJTV-|>ӰaB",<u � � � � � � � � � � �d0`+޽[cƌQҥϺ9}޽5zh\R6?2F`bŊ.?뮻ڼy ;w0gA�@�@�@�@�@�G;]HB� ..@ilmp|8biD S-cM0A|-Z$pӹsguM]t/Ma$`zYO?TSLђ%KW\VkNrnJZIKUэ+ � � �a'`!O6 r׮]n"ֽޫ ]?C}螳WCZV� � � � � � � @)=|;¤Ct@�@�@�V`:geF=\cۦM2G"h &'O~.\o}Hl5h@۷w矯B Si |T4b � � � � @  �  Mʕ ކfl٢ɓ'uܹ:͚5]:Eʛ7ohvVg͛5k,M͘1P m}mm 9".,_@ԣGFs!� � � zs)_|.oWѢE3ba~F{SOmڴѰaD06C�@�@�@�@�@�@�@�L P+q95 � � �$+p)/7oF|-X@k׮}^Z57_I&jԨ *UTުQ%E0O(MgԒp5Isw[^,#DIhֽZY c * ,~|9z-kxn8@ ̞=;=POSx7߬Vc=Wte�UG @� @�5Zm/ԭ@}4ֱOI "ӧ7Mn*驧k]M)EDe*z�-21L,#<ҥK2dH>򑏤-xK'K?Q @� P/Z;|߯t 'dĈ۷ot.;n矟Uhg޻.S @� @� @� @@ղ @� @�,P~{rW}ݗ?yg!o&~3VlԒ(6luY5[('V ~֬YU]N;]v٥Zzo߾ J2- Pe??'@� @� j'j< bjGsdG?ZKX'O?t~VI%(luСV&Z&uرNzZoq7Lz,ƍ+RŞKv-k֪N]O%/zk]tG' @� @r sE˾~9өSnXdԨQ G/})%B� @� @� @�h.Z% @� @`UUV _0߮B uj\7xUmh3g'>ˏ<HI&e=J܀ZOOZ>�/ P?C# @� @� Кji, ТjǷ\?:Iu,P*OA{ケ?)3fH.]I?o}ʺvۥlѣGk3gN{jc`2|ʲgРAպ뮻fwLΝl<~9I3ϴ @�=7Xk;6믿~:z<xpo.5Tk.ӧO60D @� @� @� @`u ZG� @�4U`ٍ)z*lPzj~uM~u-^UjWZMw V駟'|2?x )Sd޼yi׮]z WJ[;@K> @� @�hZ52haZ[^rI't nʤ &T!K%\-ӫ>" h(V[ni5n:V& ଆ uҤI~zV[lE;ahژԒ[7},6-m9B� @�Z3ѣGWqҽ{|~Wke֬YUߞo /?v;saUc 草� @� @� @�ԍ@y:B� @�4Q=U=RӢ5>S1cFubԫW*\k6KYӸ߱l4ygΜ{\Z~#5y*D7lmU7 mO@V{FL� @� @j7hSZ81PL-Lh+Ə_m537xY{Sʄ~o߾|ͫm{jDs4gΜ<^O<DZ& $zl6߿Xvڵ9z>˩N ju3  @�h廄k6rK?<8{veHT~ڗ%4w]}{}ݷ g}ҩS8<}&@� @� @� @�Z@t� @�X)_|1%X駟^oXJ�RYK ܹs6d*xo"gϞZ7hs-C^K/TҰ]j,N:q۷>%!Բ)mZtx Z> @� @�ԓ@zzB�mZ@Vs&l|I'L{ q*ANe}DT&o{ݻw馛V2a[ j?\eRWUB䯲I_źa-fϞ]Quرr-Jق>uӕ<ϭnR~zq+ۊ @� @@} ̘1#s;_;y{ޓw޹Zv*nӏ%%}}UKyivBJV  @� @� @� @�ք@5 @� @@= :$%X瞫h,Pc_άY~Y7nB=z_V/bݴknvi>^R'eW_jE+4--lP+`ToJZGSR[B�"Z%@� @� @`U Z'@�) Pk9Zi: Z@t OO=T&OU&P2ӧO_]v&lpsuuIYKpTY䄶2q뭷J)F]^ʄerX$2!j5,:tFmT ^}i %lRBJPY9;O4Z$@� @�(0sOʸq㪵l�ݾ}7%|/QhX 4{]RNa-a%DkڴiaoA @� @� @� @@=Ԫ @� @@K()yK/l5hf*K}Rcѥq-)뭷^uo%Ikv.]RRϤvi[RNPqjx}7( R'eqk!SR?.ɼX7-VհZus\Z-9 @� @�( P5>Uc"@�) PE>73Ϭ. (P#`E'ke₨īy5RS[+^˾R̹cǎk^Z&͙3g^tߢY Z%-;w^l8lP.Y o\/}O~2I7+ @�=ȣ>ZXM4)O<D;gvU~Tװ}GYˏw"ǂ嵬廎Yl6J@V /k9R3i|ͳ[gm6lS/xm @� @� @� @@= Ԫ/ @� @@k(!QFI jS`SW~REâx4J-fH[]LaR~+z&ܲ^XMN *kDz+Yw: )e4c׆Z-%\lqcB 5-U1Y P{ \xa=F @� @�h: @�V{'gZݤ_ygjM%_T]ʤkZMݗM6[}-E * *A]eZE_k)ص2QaBX9Ҳju>- @�hn]IuѶw)/r^~xX°^va^ngqA[v=zh *naU~g!@� @� @� @� @� @� @I^uc+&ijx-y ַr^YKXՂix_j43ixmyR~WS~2)Ze-T ۯLsvU=k@UKW OYpmҵkתnJy" @� @� @�VL@֊y9� $AR(6`A.0H} -Y`뭓gIwjq @� @�V P~׳gjm1 @� @� @� @� @� @�6*PڣGFSfĈYwusw|sr-|${7v @� @� @@ hB @�V!ЩSo~*c-L#H>K_ja#ɼyO.( @� @� @� @� @� @� @� @@O!Cdڴi;HVInɯ� @� @� @`Z#nJ�eڜ̙Ӗ}u ۑG&뮛זJVY|r?  @� @� @� @� @� @� @� @�Z3rdʔ)UV>}؀;wN?3fu  @� @� @� P x.%@�@lk=ծ!r_zr}ɵ&뭷rmtl@r @� @� @� @� @� @� @� @ ̚5+Cĉsg-\C6,W^Y] @� @#Q��@�IDAT� @�`N'@�4UHKn- \}rɏ~l],Mb ZMs- @� @� @� @� @� @� @� @%̙3'Gydvm߿]t#I:uJJ  @� @� @@ղ @�DV2èk'H9&>|k]wVZ@V( � @� @� @� @� @� @� @� Xycn㎋=oM5od̘5qw$@� @� @�h@蹖� Æ%'&? r̘rHү_/N!L R3 @� @� @� @� @� @� @� @�:8餓2z\wuc=ꮗw$Ӧ]t� @� @� @`) @`U ?={&\]''<3s֥ O@v' @� @� @� @� @� @� @� @8Sӟ4կ/<0;7:I @� @� @�u" PNn @�mK}oaÆ j[O}K<첤o{ow#ɛo&S @� @� @� @� @� @� @� @�hMg}vK/ATC`d1c궋:F� @� @� ZA� :=4_^ws$?'\կ&ЖFn"Ы<|H? @� @� @� @� @� @� @� @�*PJE]>ͭ Kn%9s  @� @� @�I@V3Aj� {\qŊ^|Kߓֶnɷ!*jJ]m @� @� @� @� @� @� @� @�V_#Gn;w<䭷cWb @� @� @�ZkM  @�IĎ>z~ּyD4]|9&93ꪤC+#k'?2W� @� @� @� @� @� @� @� @ʜx9s)SזڗM6Iv53f9H� @� @� PGa  >d؍=7꫓6jH`Ez"^%@� @� @� @� @� @� @� @�ԣu]c9&#GgQ]\j Kn!={9H� @� @� P'A 6 Hv!5mߨO;NKJ7_Z"VVu @� @� @� @� @� @� @� @�;vl8&&-p:4yg @� @� @�Կ@FzH�rÓNV>P[e/ydr)h Z!.' @� @� @� @� @� @� @� @�JCҨJúۊtf-OƌYK� @� @� j)y%@�?NVvH٩M:KwOFZ]A`U ZU%@� @� @� @� @� @� @� @�Zx  Ri2*ڵ[7\ŭ\w]2o*  @� @� @�, PɄ @�4M`#L.im |\{mҭ[403y^ @� @� @� @� @� @� @� @�,^`ĉUn햫*:tX-ho z{ZPu� @� @� Fjo @@} }w}Ko[G?z*5f޵=':ۈ  @� @� @� @� @� @� @� @�-Uӿ3&;wnCYߵHmL � @� @� @jC% @ s緽 <X/Tts֯V@ɴi٫.&@� @� @� @� @� @� @� @�hgy&Oo1kvs4[7m *Pn @� @� @�"Rp"@�N>dyWj3f$t6!2%Aۀ@ *ԩ_I� @� @� @� @� @� @� @� P/Rݻ[o5VmB Kz*y&4R @� @� @�U. Pk @`J@'?זּ+pɔ)I>v.׵{3{1 @� @� @� @� @� @� @� ֊Ci׮]nѣUsһw2fLA @� @� @�Z@V( �h;&\rɴi-}4˒/O|Bn]Mh)PI.&@� @� @� @� @� @� @� @�2ӧgȐ!z7rwgϞ^kZ^X @� @� @�% PkYB @�V'&%?j[?)NK x&P<6QZm0 @� @� @� @� @� @� @� Ђf̘8 SL´ӂzr]6,81yѕU @� @� @�^@֪7v @r t~}ۀk%grQ0 [k']$S3 @� @� @� @� @� @� @� @ ̚5+CKMߞ-ܲv-n I� @� @� PWq  @ 9WK/A`yɧ>NrIKV>}ҽYԩ@ @� @� @� @� @� @� @� F̙#<2sOn߿HttP2fL @� @� @�Z@t�hlw\oPj5e BmY:y{?a„ 8p;Xw7`ܚ� @� @� @� @� @� @� @� @Q`޼y9cs뭷f7oxl 2eJ[q @� @� @�Z@�h#_Zsɥ~3|'u6~ 0;lCuUE @� @� @� @� @� @� @� @�6*pI'eR䡇js'ݺ%u @� @� @�Z@t�hkow\;ﴵo@ U;C/|ao2{<8p?v"P] ԪǢK @� @� @� @� @� @� @� @@8Sӟ4կrWzjs;'n @� @� @�! PE<&$@�ڢ׿L\zi[12r6maG}4f0wu(Pz;K @� @� @� @� @� @� @� @�6$pg{^ͥ9蠃:d6J>}ڐ?:lX'} @� @� @�C@V}< @�K`͓Ojs2skMu[xǏOǎ[/|;u&P;7߬N @� @� @� @� @� @� @� @ uE裏ny߾}ӻwmi#I:uJ-X  @� @� @�-C@VxNzI�Qo|#:56 F}5y%_n?kֻCvUGCW @� @� @� @� @� @� @� @�6&pqȑ#~7Ç_hp@_7&~%cƴ' @� @� @j9JO  @�6(&$}4NJ>z�&L^u$P&VuHW @� @� @� @� @� @� @� @�mD+ '>;rʻF}駿k_[1lXrɴimiJ� @� @�Z�h_r2wnrm rH6y-yǏdGH`u7߬  @� @� @� @� @� @� @� @ \wu'?;Nk#^!~ctӊ_  @� @� @�U' Pkj� ,믟~gi&5R#F$/tNYK'zꩧ2`ş`/:%y:ꐮ @� @� @� @� @� @� @� @�ZرcsGC;3 &zH+3fw @� @� @j\J�hV}.+ךYՑE%W^\qEfKX6o޼ 8p'9BN:tHfϮ @� @� @� @� @� @� @� @ СCsj\]fܸq|+?aÒ[nIf\6\I� @� @� мSk @�U"йsrUW6AiBkPӓ!Cޑ:d-X 뮻2rl ]7pCeرk3zJ:vLY%Mk� @� @� @� @� @� @� @� @`jELZ!5jT: ?N8VjO<Ze޼y{ォJT+ @� @� @�ռZ#@�2aÒ=Tbi%S&|Cəg.{PǏOӮ]\&.5,O?t~GiUO=T&Oji:$gα @� @� @� @� @� @� @� @^&NXinꪫҡ}- ʸq꥛u׏M6Iv53yj̝;7̓>m!@� @� @�ԛ@z{"C�X2jRNr̫O|"E/~_H\䬳j<c?/| 1bDtI?YcdΜfnTs @� @� @� @� @� @� @� @�?xׂƤs΍J֤Io4a 7$g/Eߕp}٧Vkc~zR{<Cz7QfE!O� @� @�hD@ @�V@D:+_IN]wvU!Բ2ztw &,5Pk9'V5Z&2fcǮ+!@� @� @� @� @� @� @� @�:g} qӧOnƬ jC`ג;Ǿ׿w7o^ZezO @� @� @�zXO @�e |[W'3e䬳OjΖkySI&C͌3v__ӫW<?T\wuys'fwnl\?jԨ;6[lEճg庲Ka/9ݻw.,]t{y>(%LԩSկ殻w]]S&}ׯ_N:餼 9êЯ~8/RB؇1cBF{<0jfLnr1dȐ!ڨ/37 @� @� @� @� @� @� @� @� P>Um[oű6tӪ.ɸq㪺$>&''<x"3g̅^{]5_%LsΩ.g>޽{زj,ٳS%\\P{q:4&pVbf͚Uw=ȑ#kAawVtKnr5פ!ki5_JKKS @� @� @�fhLh� @`5 ^'M LZTr>MOuC=3<HuW)]w*@TB>OUaU aΟjbO|ӟn<o|4U­9|;ߩJpo93 *ՄUB-zS´rxm>8} *A] =Sk d#4Nzꩧ뮻O>_||#p!ɳ @� @� @� @� @� @� @� @�4ԩS]vӣG%>hР@-˒ +Qdy9z]v-ؚܲ/劃:([mUuq<pVeY5U9|cj u`vm8p`JtU|ͫ3?^iN^yWz4ӧO ':nj6V @� @� @�S@Vsjj� >R 5J]M7ufxAZn8?mE=s_TJOHd۷o5gϞ //* kzo;_~yuǧL*Ve_پ˪M''̍7ޘrn _/FYmu]o~Se:@s94k(h߾}:Ԓt钳:+fͪ6#Fdv[~ {39sSC� @� @� @� @� @� @� @�h%iȐ!)5@,Z_dѡ@o/ 0th T-m~+_Ʉ 2jԨ|)QqnݪR_pYR͗rβjZ3ЇJpVrg?jCrv)?p^~XL47^zivaXK4 mx%@� @� @�4@jH; @�W?HjHW}ݭi_R2~|rP-[t9mY{֒պv{xpZ-n?ظ{yS&=]q9ZU&Euׯ_uNW^յ޽{뭷^:<SsfΜY YovfϞ]5L*Zk+p U'\׿uxUJWlv}> @� @� @� @� @� @� @� @�f1cF8L2 ӧ2[-N?|u2On'ʰHƌY|կ~M6d|)u_JCݗ>8۷ꯔÇCUHVCKR륄d/ρݻ7/KR.X4 @� @� @�4@fhC @�k@3}MrJcn[.(p\uU6 Y/wyµp WǎS&ͣ>nݺU-)Pk;kR&n=#U0<) mITe)]N8'?9眓]w5sO`آmGqD*|렃~WMzgӿo_.� @� @� @� @� @� @� @� @@5kV'殻ʖ[n\ciqƥwuM[<Fѣ|)W Q|aVc=V]*KR>яo?^՟3gNQF})?яR,Ku<uiֶc @� @� @�_Er> @@]yf&ɈuX'L%Gphׯ<yBgm={6_U'6YgL6SO-]ˤw9\sMΜ93^{m:uꔟgĪe_);vl;찪]M[y饗޵ @� @� @� @� @� @� @� @�A$Y+Zr=nK{X%_\p'?Cmj߰aɓO&>aoUx֔)SVY͗rT)5]͛/8sNoST&MT ϬZ)jK[T\Ժ4Kc @� @� @� Z} @�"ХKr%MrJ.t v7CImbYs=xwݸ]6x~o/tβޔkriU|+_ix2iw_Wkao䠃&=#G?O>9/b8t]wL.+F?ύ̝;34A� @� @� @� @� @� @� @� @c=qM7ew\ 4hZ{on]Iɘ1YΝ'ejK >+T˻ׯ5U 7߼V{y饗2tЌ1©RfY˒jL:qMK;N� @� @�XP@ւ  @�-P`KQr)Mhih]g_N- *i<~ /*<yr~|k_BzUw7WA[eSY}م^˛)STgk֭[~袋rI'裏yWz}'E(AZݻw&X@4L*o~L6:g02) /#e2^ZFmդ}C9묳I\{g훝ˌ4  @� @� @� @� @� @� @� @�V&p'ꖌu]=cF.cUc6t4,YX[z_êQ-U_귔|)~v%g?Y&M̚/%kyj,KRj-_W/^Kz9ꨣJZ/믿rեYqo @� @� @�MX}s9 @S2?Xk]$$e_$},e0aBu 7駟ή/~<xp<̜viU#nmnj!Rc ><=Xuc?|3y衇}w\f͚nuwL+\FJ?]]wKDjguY'ԧrꩧC;lM?Ӫ`FYm_dL +dž Vm]|DUoΗ 0 7vA� @� @� @� @� @� @� @� @5 :%WUwߕڠA'N|W}EiBawrwJ=?ư{GYZ͗r^o-Źq- /T;wnPR>..[lO|FQڵkRC_j?Nj=Yj]m @� @� @�I]^k4C�4AoK6(CjBC.m ڤd&Y}%P3ֵ#<23f̨&W͙3 Ú>}zथr2j|ͫ sσ'xU&IknE.ϴiӲkSN׽+p /mc̙ҥKty׽U(X~ҭ[5(r쳼 @� @� @� @� @� @�-FẒQ @� @` ]+o~3_~y>&ݭ+޽{; >|n֔Ԙɗ|+ ,K9Yi߾}z5U2{*D<e-Sui X{ \x퇻 @� @� @t@� :NmRr 'l:RGa%{|MsW uС66` KTշo%][.]outyôʅ%L,z^Ǻ뮛~q#@� @� @� @� @� @� @� @� 嬳_0QN7nܻjL:ś5�jL9d̘wj-KYYM;vX-zŽ_/MKG� @� @�X@ũG�hyPKn%e#Yրܹ?>W\0k֬<裹[c[ 9Ir-i% @� @� @� @� @� @� @� @Jȑ#SBSVjߠAr7ھ}Æ%?Y2eJr˽ދf)Gyd4  @� @� @7S;!@�uM.<?.|[ͮ&y{+dСׯ_ @� @� @� @� @� @� @� @�u)pWOgSN9Y.dҤIy7InɕW38#/Bk @� @� @�Zc]N @�VX99_N'fnM;67 .Hv޹ -pi^rW/& @� @� @� @� @� @� @� @�I1#GVAN=Aeܹy^{5w󭦽ΝO~򓟧]v馛z뵚 @� @� @{� @`Jv%x;+~+VNgN:*9餕kU @� @� @� @� @� @� @� @�-c#s=w wիWƍJoM<E9OjMX @� @� @�! PE<&$@�@ǎW$>|+vWN`֬Ò7N~kU @� @� @� @� @� @� @� @�-?:thp~РAC#I:w>n8) @� @� @�) P95E�#-L??9d:X+L\{mҵk+a @� @� @� @� @� @� @� @� l<@ 2$FJv횭5$Pkq*W uf>h @� @� @*Jy5N�XLrQ'><KkUW%?Aӟ&[m՚Gjl @� @� @� @� @� @� @� @�4ĉ v-W tС9]jK2eRs06,d4 @� @� @�S@v/ @ 65g@+I~x+ @� @� @� @� @� @� @� @� d<N3f̘tܹm.O;sڷooyNox`2wnrMm  @� @� @�]@j'wC @Xwd&1%gz!$` @� @� @� @� @� @� @� @�Mxg>O>k7~Z1m6ƍ[klWjgmU  @� @� @�kF㚹 @�NKdĈ_%oy{O^}5㎤S;N##@� @� @� @� @� @� @� @� @/Rս{z֭[] cfvZR+Rӳg%o+ KN=593ҥ8  @� @� @�kV@֚ww @j><H|0kݺU ѣSliA @� @� @� @� @� @� @� @� LSN;voO=kj]r%9×xa ?m''<́Q' @� @� @` _ww @�)6*9d֬yu{MFL>;g56!@� @� @� @� @� @� @� @� @yO!Cdڴi;ҳg 6|̛7o0lk2f �;� @� @� @Ib @@Xw זz+$ori+ @� @� @� @� @� @� @� @� @f̘8 SL´Sԧ% pC2{N� @� @� @Yj5+ @�/e%?{\?=;79c˓vozB� @� @� @� @� @� @� @� @@} ̚5+Cĉsg-2j/y2Ou @� @� @@3jDM @�Z'|sɽޯuVrIkL� @� @� @� @� @� @� @� @@} ̙3'Gydvm߿}wX+'c, @� @� @�, PA5G�h)%j}CI^|z[vZspg @� @� @� @� @� @� @� @�[`޼y9c n);c}wX*0lXruIZ @� @� @�V@U y @@ M+]CMfͪמ~M|#|� @� @� @� @� w`VU{tI) %4H*(-W@BD"\DQ0VZZ<1v��@�IDATw`8s滞ggZ5 � � � � � � :uҸq|!LTJ(=#HJGpB�@�@�@�@�@��Z1T@�@ d$M(]+=LBM߂ƚ5r咆 {pU@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� W_}U_|ƌ5kƠ( &LH @�@�@�@�@�[ � �,P4z4bԯ?͛㥴ioN+ � � � � � � � � � � � � � � � �@^4`�}7jԨwFZG#}8"� � � � � �DS@hq � HI~(z✴sdOsHiP/BB? � � � � � � � � � � � � � � � � iSÆ S˖- 0GvV.\N֭>@�@�@�@�@�@�b&@V8@�^~Zz iʀV0"EiӮ=tzcG嗥&MO � � � � � � � � � � � � � � � � ;怇.]B:tq|pʗrF~Azq)sf^=i;.z� � � � � ��ZD � pOjP:p&v$oORݺRҕ+ҩSWCʔp+@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�KF߿oFRNԫW/K7|ώ/pwR4H͚IKg^[T �@�@�@�@�@�� � ppXr嫡ZK~eƌ%._~MJ^ILsHfBC�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�+|r-X-NR޽ƤIԺukuEݻwO@8'%_VRP$t^A? @�@�@�@�@�@� SAG�@�L S&_j5k&SJiaZmjrp92@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@~<yr](GU^==cj߾(_[B ֬jEl � � � � � @dF@C�@�H<w)M,Ӂ;oڵ ~'@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H\wք \7>HC Q'xYd/MԊ؈#@�@�@�@�@�@� Y)C�@�@ر҈R9ѣ˒-?/5o.>gT � � � � � � � � � � � � � � � � A,Yk /Ç R஻oxhjEl � � � � � @dB� � IÆI{KÇh-$kڴYl8aCʕ;@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�4We.^xЮ L0A7o!дԹ|ja@m@�@�@�@�@��ZQx@�@ k'%=ρ3_~.] {<IOO<!/y>o@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@  .9˗/kڴiSΜ9q| '}j^@�@�@�@�@�@ :jEGs@�@�D&нScI nj ;$&.~4uҭƘ � � � � � � � � � � � � � � � �DNŋeY$Ih;@ʔĉRԒq{ � � � � � @;\@�xCZVN=sF2Ej׎#}{ifNk � � � � � � � � � � � � � � � �$cȑ#a6Egݻղe0勄/?RPЍcI}A�@�@�@�@�@��Zs,@�@ $K&-sTeK%<Yxϗ,<,}k � � � � � � � � � � � � � � � �$}*I$7 B<Sڹs oxK/(vlj]'@�@�@�@�@�@ &jDs@�@�D&`w~Q*P@YSڻ7a#%? $K҆ Rj sL@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�bG`Μ9Zn\|A ҲVZi۶m6lr=Cҥ7^g � � � � � Sb* � @"HN2EʘQz!ȑp4ytPK>ҤIXc � � � � � � � � � � � � � � � � &]MLi5mT7oW_}|Mbi„kkդL N'@�@�@�@�@�@�!p%I@�@�ȜY1CZU][7OJΟ? .ŋk>_tI\Y]pM. mI4%KD?<=;|饗W.TJah � � � � � � � � � � � � � � � � oVٳ:s[s\}V%!Wg[[͑۩RRڴi}5Fҹm۾ƍ}U|U4h>}hѢ.։\ Oi(A _i֭]-n[kco޿L2)=!� � � � � �\ P7@�H$6aɓ˩Stž>{7M83gj7tu"9 smտ:n"ldKԩiҤqB[D[n-!m_!C' � � � � � � � � � � � � � � � �"`!W>Ǐ-ǎs?[ ZB,X[NzZ~NBԤI,YR{`ە-[6}~+`Mk.سg>r{n:6Tphwd̘ѽٳgwܡ<.[R@w}CC�@�@�@�@�@��Z)3F@� :z,fkoIc'NpKmgXxM< ل > ʛe,Y !æR:<48¨RL)R/!?'O\6,ba-W\qcqbm[_xQ]ՠ!_�p… .l¼ml3W %,B,d+SLntovmdgvOC�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ޽ۭۧhn}AWjxjX@Ͱrwm Z'!\jxuJ+񶽵W_$d뷽!!Cl[f-6[)RDVdذaؘ,\+W\nə3[[R޼y] C{6lؠe˖?ƍg{׭{]YUjՔ#G.gp :!CVP,Woaտ-NZm {l9[g˂ΝTg[ݙhѢ][Ŋu]w?0=D�@�@�@�@�@�(@V8@�M i:|:9rD6[{eoB6<fļc^0SC{ p~d: yA[1k>vv\"sd'O:oBشigllRM˚5e!mUŞ- @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�/m޼Y[lѶm۴cm߾ݭ,ҥKmaRضȰhv[,(6HKYz0X[,| [r,Ɏ󚅊(P@$- R…w8u͛ jҥZ|c!n%JpU5jʗ/ r 5kW'KX_vm[Ο?~&/[O6Mt]v*T ײ/~WG�@�@�@�@�@�bK@ؒ: � @ C O{'>ٶB,X)dI/0 Kʛ7ʕ+%KeYlc!v&{i$:Phl W-k֬qk`gB6h[6ћ+W.yMNWnl#� � � � � � � � � � � � � � � �*`Yk׮պu~z޴imacP* RJjٲϯ<yz>Lƛ$IWjXVxɓڳg[vB,l.ٳt ۲k+V-ŋwaNs| l2͘1C3gԒ%K\[c= S%Sht*J* yʹsd!n6.[kSiӦUUӗUvm <@�@�@�@�@�@� xBG# �.QlҼyMH&]x1xҒM\ڵkWD&dYv2f‹BٶgY葷ΐ!w k$`,µlm8p 8Ͷmbג&M9rOZɋsm2mN;5Q2DK:r$ʧr � � � � � � � � � � �$R~!>x� � � Vww˪UzjWnɗ�ThQck v*T5,YX *`e.͛emذjXвҥKL2*Wʗ/ή^?#+`֋/ָq4~x۷OVC/V'͚5˅͙3}j֬7o~ibW%_>8v@�@�@�@�@�5A�@ Ԋ^o߮m۶i֭nm۶&&]|!UTʛ7fDwqGbm"MڴicNG vΟ?߽{*bAp {n>},I$.@뮻T`A gWX26@�@�@�@�@�@�@�@�@�@�@�FGW� � � /^f-\-K, ϲs i*Ulz(4믿fXʕ+qF]rŅlUXQ{>UPz6a<>goq!Z״iSXPYbi,XM0}`yڵS6mt뭷& Ɖ� P+P� � � � �"@V0s@�" P+b:&_M ڴimsႄNΟ?lɗ/ !"`?eˎ;\.g!\6aZUH}n]X1ʕ+P(G r: � � � � � � � � � � �PGH!#� � �DYZ|̙sgϺʕ+ ]*W2gs9s-[L/v"E |xb![RN߄^X)ShС:ufͪm۪UV*^M|1bF% k֬:uYj,y� � � � �  @� j=n:^ڭ>|yLTpa*Tȭm J6mw; �.\;wj˖-ڼy5ˑ#Gg&RD *U-rK!]M~565 � � � � � � � � � � �CGHϙQ"� � �D]jL<YӧO̙3uq̙SիW^VJ$I~qH0{m۶8Pj׮ ( f<1+W4~x[ׯW͚5ձcG5lЅځzӧ5zh}.ޛݻ`@3B� 9'B�@�@�@�@� P+~  � !Q8wVZe˖iʕ.DkÆ t,B~,hѢ*V[l /pQ7&ϛ׮]+o- ,ҥKlٲ*_ʕ+ 2D?":� � � � � � � � � � � ~H � � MعsƍI&iҥJ* U )-{nf!k3fЉ'\mFYf*Yd@;V={͛ռysn98ܹs;h٪Zjժݸ,�Z � � � �K@-  c,XE?C/^T9\hO2eTT)(P쎜�طo֬YիWk岟Y *R*Tʕ+J*.C_` (@�@�@�@�@�@�@�@�@�@�@�O~!> � � ? +D3rH}J֬Yոqc5lP>ҤIݦO~ p%Wք k.WӓO>A/caҹsgWgUV޽ ,&,Ynݺi֬YjҤ(w܉\#J|Ϝ#� � � � jӡo �J@=M6iΜ97o.\(C <ʕsAZ9sڅ9EرcZb ײIU/M̜9^U^M,]&M/}&//ƾ)WD�@�@�@�@�@�@�@�@�@�@�@ }@Œ@�@�@ 4 M>]Æ Ӕ)St-yjѢUdɒvWj{;VF]=:iӦJ2eۗ.\P=ԿY=RJݟ'K.믿Էo_= z<t&@VԼ8@�@�@�@�V@ �DZ@=&}M:iYVܹ$Ure+Vؾ}-Z~Mז-[\kVztwܵ|B�@�@�@�@�@�@�@�@�@�@�@�}8@�@�@ pΜ9?܅ܹW'y*7+Wh޼y/?(cƌzs)k֬~?`Abs;v|;*I$~swqZ5kԈ#%K8�Q P+`� � � � �q*@Vrq@�"/@֍V7ovp~-]<U,`;$ @<xk͜9S3fо}Txq=zGU|k_` '˸@�@�@�@�@�@�@�@�@�@�@�;~!l2 � � <yRG} ԩS'͛:IORѣ.Xkv7P9rV{UV*Rƌ|e?S˖-S-dal?J.hCd< p�Zׁ@�@�@�@�n@қzwn� �\'}v˅$qƹ�%Kȑ#nRM!L:8>"6sݫ׫M6Zp*W&Zre�!!� � � � � � � � � � � � � � � @ \xi(P@Æ Snd5KV=l?mݦ]jΝ>|fΜj֩Sֿƍ`~0x|:*Tp5] *jժi֬Yxwn� � � � � �]@0~@�@ٳUJ,XPSNU{nZJ={T4). p-.]_աC eJ(ѣ7@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�K`*Uz^{M;vЋ/t҅u 3ɓ'p#GpQgqE,X+eʔQ9ccA s̮5hЀPX0 � � � � � 9R)"Q � +(W\ݻjժ۷kɒ%z'O8+D�@Ȓ%ڶmӧ.oĈʝ;z)Y&@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ?gըQC+V֭[ꫯ*M4 |dt?%K'|R7ov5;Zn&Mѣ7mx&MRΝ;護޺iƒ}j֬}QjR � � � � � @/@�B ڵ˅,XPk׮ըQsNu]y( @ٲe?>;wΝ;rʩqZjUs� � � � � � � � � � � � � � � � SժU5zhM:U_}fH mڴӧ~wmڴIsMasO_ј89v&M/R*TpZw\ � � � � � �a @�@ Ξ=7|SEѣGl2͘1Cu֕MY-((H5jPoJ:&4iD]v>>}Z~Zh̙36oذaz{E~W.]ܻb@{이{u]ϴl<ͻBB?2~VTɅmٲEٳgWŊSOȑ#� � � � � � � � � � � � � � � �Z`ͪ\RHիWVZ7#>yX"*UJV_%۪Uԭ[7)SFov=/ d5;UyXiӦ .A}FsQF{e?O6lNra}?ڶm~!$O\+rC؁� � � � � �ĦKQp-@�{%Kx6mfϞ &t~+W?pl;۞={d>fr8ɓ'uyM:U'N{-h…<y._ڵK_lb`|6{<և$IýWt½sNfr6ӧO!Ch֭\ZdΏc֮]p6!� � � � � � � � � � � � � � � �q-o>ըQC%KiȞ={\2g= .h۶m1bCTD8?=ڸqa9'(ҥKѣGpz김W9RK.՗_~B~,Xu*iҤJ:ά.]Gyj޼y;$YfG}/B GC�@�@�@�@�@�J@ � ,gW݄֭ ,Y2dlH| *_̙S۷wBqòe't26{WJ*c8Z¸3oCm`>`O(<t萛8e&T٤>PoH".@]ڵu � � � � � � � � � � � � � � � @� XMƍ7o^?^iҤg=TR]vZ_=>:ac}ꩧu֍pR$I\x55jHG;wѿ/(Q"z~i8q/^;j|w#޽ݻ֏pu}>}zqѬY3+WNh � � � � � @\ bD\"� _ |'z4zhCɓ'~fʔI2di}oR#|3Qodvޭ-[F97ܹs[{1ctqu!8ٱ0-xf͚a͛#F@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� h֭ފiy]#>kxc7Ec5|pO^Jr…ڴi^|8OBÇ](VܹܢE ?~|>3ȑC>}n{ذabsI?c\ @�@�@�@�@�D� � Y`ٲenʷ~ƍPM<Y#GeVX~ArիO?T7oV۶mˍޓњ 2Ϙ1kskɒ%,Y̙҅}sqrWjIdMz)[v*Wl4w}&qS4v} R7nϟ-[B ׯw_߾}eRHylTtڑ#GW_iƌ*Po=R6fРAZz|պukoق>sܹSeʔ_}lb5N=ہnݺ.LGx{d_۷o< 3g~uI˗עE4qD9<4hncaZ\kN61wqcL2]DnQX1iJ*ur?J*UV~?:� � � � � � � � � � � � � � � � [jX ʓ'O… ~M.]r58nIlٮKX<Pf͚I&{Tmkn`֭N8ᾲz-^} sd^픠 WjZtCa66. )ZX0YmkVҘ1cdbvڥ~XWZ}a- HXx׌utdtM=޿ ,guKwsڴi/n:Y oujKxŤ&M\dK6k,s=]mjNC=Ij}zDV'ѨQ#w?DP؅� � � � � �1� � po_t7Mt "eAC6iÆ .&/ :s挛ԦMdeGvY c\ԩSݤ ;5j,BBkw}lO̙e{aZ6)&uM8TbEuoС^4cxlc=͛_ƜlҞ}7.|g ԩSZV\,Xj̙O`FޞM&zꩧϰ�ʕ+¿СC./ >&>[[Æ ;`lܛ6m&P+X{6di߾khY'|MYxqkyrfڤ… ۦ YgϞ=Z9rpk/&rs3Ǘ_~YM!� � � � � � � � � � � � � � � �%0w\pcA⻝<yRwvjKIh7a󰰬rʹ( fQcRV#YMVSӦMջw sdQ>| %KW_jX} ۲Z1W\z ճgOW?&M4W<sa۾nIXE;'ܛїV[oU[|{ynZ 4pu}QW7gKhPD[lԤ,Ad?^xVXu`<c!t.kk{oK*%{f4@�@�@�@�@�@ .Ԋ U� �.‰ڶmYfuPe˖ gѢEe!K,jɒ%nӻ&9-X},Y2}n{رnmĶZjtnM bTD 7qN8|lIflҙg=-,իeZo6y͂͛77u}v2O>͛W6˂ƍ7!-O<J"̩PBZxql؊+KLTHk.l$ѣG* m B֥Kze[oѣnR?&dW_}U2dp{w{6 ΚM[~Xhhi@o&Y]mxK,i, W6ާ)S˗/YZ](cc9rYlg۶㙻@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Xr (ٳ%#}=z' pu'I \- SWjlI$ b#[%5\0Xl|AW3#1mG4N0^ P0a>clRS:uO?iԩ>W^]fjn/p5iRN-j- HxuoN*UҪU6e?;q"9r9[goteo/^xzbZsغu .4p@W;޾c y_@�@�@�@�@�@�Z?65@�@ Fg\=]f_ߌ]wT9͛baVҥsyBNRJ*,ǂ>s=35fȑCD嵪Uڄ lWʕ]MJ lR&=#^;SwlL4IΝsBo~W7B,,<,8ʂv׆\r-oMfk6h:u5qDYpd>a_x i>9st[Mt˝;w"ڰ²,l޽zec6l( [t Ccǎ!ŋG{њ7)K@�@�@�@�@�@�@�@�@�@�@�@�$"tBb1cE�@�@�$S1cxՁd!>iӦ … u%W#xo#zӧyXۑ]'͝;W)_"3NZ…fɒ%]*R۶z2Vī?cx< *͛kĈ~LhF"SĻwȜcMY}[\5VLl_?^ƍrʹ?TԤ ,[n۷|M=s\gu-{}@�@�@�@�@��Z3j@�?5Jʖ&a%c, TedɒڟΝ;cǎnRٳ>5kvZM&SyH<*V9sh˖-&Ь]_@͛7˗{mܵ,*d0kGk|/iϞ=]K/&yS6֣G;ǝÛ孽Y5fa^l/C#>oذR@kNz}<ޑk.~=\~ 2dxkc;SL'N|*]֭_~CsbI~;vaB7 3~{g ~5� � � � � � � � � � � �$zUgO� � � �$09rh߾}k ~:s2etͽVW/B|z1iݰ - Ynʔ)DflڍC BPγ}^ZL<NHT΍qY?~<ևYϰDŽ?[hFws{iZxozOV &s̾-n6{篯tC'؁� � � � � �DSĄh^W`��@�IDAT@�@ fgKzIKRZrMpjӦ .KZr,ijݺuD2TbQlBM r>~۶mx@cƌG}6ҦM'Oʂo;w~W>g͚`k ˗/y6m qZ׼b ?gkpgÊl.\x5wltJ* -[glylUNo)R$!ωv׷PmcbB~3oR_vN!� � � � � � � � � � � �TJۤoI� @�@�@ A TVMG߈�:unziӦ +|*,Ȍ-2Sº~Loܸѝ^`P/%^M`=3 q^z\% * 6foSjUYm' dfu};?T\ցY~zc!rA@�@�@�@�@�Htj%G΀@�M wߕ/z۲`N:B~~Ml!G^ YKvWo[/_\iҤ vdQF){zW4o<w]7TPPPE^ +B}qj„ .Lf͚[gΜ Kܹ~D2ҥK+Wulqw[nѸqjժ}|Iٳ'>,Yҝ7sm72(~0.]([l9r wI&+yBY qhcZγc<zg V ,;p`!v5w\ 2ߺF@�@�@�@�@�@�@�@�@�@�@�@�|SK{$ � � �$,2e{|ϙ3/6?~.nn'Zj{"\'OկqɍzHݻww??SEvJX Y#coaɣ%JzHd\_[$2z89h eȐA7T񥬛֍3&[Lǵl2ըQɑ#{&k֬ѡC/vZYqTjڶm ) � � � � � @, \ @�rԹԶDq._Ժuk]po;~I7 aM 9&rX;v[BlrRݺu$ 0}7x`;w}eڴi^ueΜYo0ޅ*5iD6aZǎ>}zU g}V-[1?ӭׯ/xcB]Bdɢ]IM駟ohʕN8Q;Ύi׮dcdQfrۑc޽0omʞy7Azٳ̺jժʟ?ʗ/a+T,�huF%K0?M>E%y= kw[ۤ>kSLoƏAoMxݶg,/c,>mذA3fpdt ɕcǎw]O � � � � � � � � � � � �>_J5_ � � � `jL<9^ܣGw?SOZ&d_VÚW[۾<sʕ]#GCU޽+WGxu2"JnTfMY=gyVq-2S6tw G}!M~[@Y6g>}7n>jXk^-#Gϑr}m?8š*۷M6#^Ql$2VG} ȎX>H;:{lW?̛oIg# lY}ITZ8:D�@�@�@�@�@�d@ � @ L.=Mo|}yoKKd,+{イ},@ >Y Q֬Yk J6I̙3{N'NpKٲeS2eqmiѢE`… ﷍ylٲ.ɂ|l" B&[[+&w6&~<fH6B~M:Յl٤94c%Ka}ؿx 7N;fҥ\XհaCل{O[nu,0ww@Zb*Us,H&>iFu?コ,¿lvrc*W:&X x@`}?Dsɞۼy4sLjf SHa-y\ OsɣRJ`.gBhIzB}1od,S_ިQܻen 4/,zjMaPmل'= _( r,h+&|gK/i.g{{o??facGߏ7~]@�@�@�@�@�@�@�@�@�@�@�@ 0|5}c#NISN`Q � � �!V͂wNI|+M4Zpױj*Ww$IZf͚4X xbUPArKY2g, )/_vB ,¨F4ZgkQhlv~DS( :6njXmc`&vٳg]_ g@Çk̘1̀\Mx](n9u|AWs%%V$"M6 ։_͂4h{ޙ2erFw56 $KL-[Ԕ)S\ba}iZ:"zݏIM{}Q;cAoǏW9ylz\I&)UT<x >06,Pj̴o~e _,@�@�@�@�HI|A^�@�I`۶"9U0%)exM,Y C=֭,*#d.@Z]6&;Y Rd}l]X~uֹ@pɓ'$/? .h߾}mr& U6|?`>}ns}l'ؤ'{&3fM m2bDƑa/]&Y=Ӥ!cag}wE5MlM㽉?6{·DO񹶿wlb߾}UF لD ̣ş!R^L= � � � � � � � � � � �WԨg4nTb � � �yGtRY@WV"O<IHkY=[[͊\/6ET;%:- ԩcq!u]u@"sꖄV[Į9gL1uQ믿^So&& իW{ї_~֭[wh ϸx߼n׷z2Q9LDDY.g~~TT-8@~xq'md@�@�@�@��Z g@�'pԧ|5 x LpÈ\R? lܹ۾cډ"{֤Ie1s ҂֭-^y=$&'&Yxր\Ȟq'@VYr%@�@�@�@�@�@�@�@�@�@�@� /K~*[oIR%V ƍ� � � .^'xj}j޼yB~5Ի'ċͼ… բE q2e i1bVXm> &MH VQ ۇm�!2@�@�@�@�H y� � wWQH&H=w݌-[V ,Ќ3o Nر*U} կ__EE I&o3~i[krEpƚޟM\W_}ٳ}_=&Mѩ|� � � � � � � � � � � � )SJ,ի'IcHIui � � �H"F>}̜9Sդ]H(.=:~tw_ 6d}jzGdN2d(V߹s lܸ1aZ k@�@�@�@�@�3$AgW �$R;䛼$2]TԫԤ$I" gK.5n8*TH6pY|�\ Ǐw}EvzTN߹{ߓ!Co#7'@�@�@�@�@�@�@�@�@�@�@�A)gO~'MZURŊ02ƀ� � � ڴis>p[EHO}ڴiz饗i&IF-ZP~-[1HrztA @7ٳG*Ur&Otݬp_.Bx\ŋKcT � � � � &[@�["D ]o֭6%L+'WJo>o^cƌQ|TJ}ڶm[XM>|իٳ5kt_L2Eu%L+ @�@�@�@�@�@�@�@�@�@�@�[ }z~LڰA6reNW� � � _ T%C]V[V۶m]X̙3t -^XǏׁ4p Zj4h Q|ymܸiz<y4k,חZjѣ7I`˖-`.LӺI"� � � � � Jd"�ľ? ÇV&H+*Yf /+VBֹ 6| ,bŊk׮nrYE��&M͕+{=-Zˎ ݻ+0Z� � � � � � � � � � � � ]wIcJkHkѣ#:@�@�@�9D7.߿D{z4i\rs:]#H:2etI �ѰaC-[VΝҥKW_MXWWСCߧ K�ӧZ/9rܹse5h � � � � � @|@ KW�ǥ<y?KumP6Gn˖-[Ծ}{ZJW̙d>| عo7sFė@PP<x4i,YJ*6m{`ڹs&]W � � � � � � � � � � �  (!'m$)#kwwwv@�@�@�<;S#GtlYf*\ GzF Ξ=Bʗ/jժҥK?fΜ)oPBP_qJ*iСŀυ hukgmceP � � � � � I|k @�XHix)CžΝ\ԫӧO&X̙3G֭SڴiUr&X 3gd!Y… u1(P@5jpK͚5]V=5!C^#G@�@�@�@�@�@�@�@�@�@�@�@�839$"怑w(&<EH:2 "$9.ۻò˲ |PAصK+ϥUFnUʒ%@�@�@�Hu|6iҾ}ԲeKo^M4QsJAoG{Q.]TSrqu]?ՠAS*TH5OyU6mOQ^Z~|j�zreu8!� � � � �I*@Vrr2@�Hؽ[Cr!NR~V6RLoV2e/|gZ`N8˫f͚ѥZjʖ-[7" oyZӜ9sp<fծԯ__ŋO"D":@�@�@�@�@�@�@�@�@�@�@�UIz2fn]nItµ @�@�@ 5 9rD?^_˗O[v]6C:Bsnܹs5x` 8 GU~mVr:gVǎx`ݺuSΜ9áj)6l?5n%Kv�H�Z bO@�@�@�@�H~ߘ+ �`դ"M+DYQ#7*~YвqF3XٲeUjSJ…#X!po߮Ei…eɒ%Py:v Vի<y\JS$ P+I99 � � � � � � � � � � �$B`oO õ,`k J) � � �\�׻ FpoQr4iK.ԂK$ÇkҤI9rW֭[rʩM6뮻TRԜ3رcս{wO^O?}Qȑ/ϔ?~;3s#"U@H @�@�@�@�)@Vʼo@ \?+:v[ʙ3/̩E:l̛7O ,zjZr:\~b~ʗ/E*M4RN@$ lٲEK.=lݺknBTzuTVͅPR"6 P+/@�@�@�@�@�@�@�@�@�@�@�@ y5`4h"wK*v԰9EG�@�@�@ N+eذa^6m7/J:uԸqc5jHkV <7#WĉZh&L˞CtV\q sNC={TڴiեK=c^(T6: j*/H?n- {<[?%!3B E nE�@�@�@�@ Ԋ[L@�"p\!O!%HmJ=$سg/^|Jm۶y-͚5ʖ-kYV2eTtio]`Ӡ9$L:\+e˖iھStNWrRJ:%8""P+"o+B�@�@�@�@�@�@�@�@�@�@�@ "\<X'ܰ25i"|tRBL� � � aw~g7Nׯwͪz~ꪫ9rDXiΑ#G4o<͜9SSNyț7ִiSY)|裏~lR:uR 9Gz|_|;RX1=С2e#[ *JF#� � � � jb �B` _?i@i^Q#n\#vءKRVXndTTTWٳ{Z%KT%mۊ <kj͚5UVy!Zv.]:Yg tB Xl:ԥ|Lօz � � � � � � � � � � � ͛å#Çե&֕ҧO̙9@�@�@�?5i$M<YӧO׺udsCT\ ֪YTRE2dHp$8q№-[sze_9pϯZ׻ {&M$vJ=at>S?)SFm۶voO<酰 vmۦf͚s}5~/�!@VdGZ� � � � @)wv �$XҷJ|##wԮTHOÎH^g1@feʕ^ȖmYٽ{kR,;wQU:[E.]v .,[ʕ+pؿ6m䕍7jÆ Z~W#m[\XpY`RJy,D^A2b�Z 9 � � � � � � � � � � �C҄ Ҙ1~YFʙSjPjXjHrlX@�@�@�KSbƌ_d!L1cFUT͉R+dm.+`s~,YD/… `o}9>^ծ][ul c߾}e!R(Wu7{:ɋM6א!C9g*V;S</ͧm H a � � � � ,j% +'E�7mۤ~\_'uԾ\p-II.[=[Oټ+u{':诿ұcǢ5kV3YBt饗F z۶Ο? (DQQQ~ܬlٲE7oJ={wCӦM=[VX1/A -{XH Bs � � � � � � � � � � � iXi8iɬZ HV 5 � � �Y߽`- jh"ܹ;(W\^V![[`SRds$ƥvXB˗/ײe˼i\!dϞ]+WVjTzuomh2eJJ³<yRf@?iݺuKtKioUPAiҤI:6}'N'hP/\[w=[)T]@d' � � � � pj"�,}CモRR~VӦR )=6<N$#! .`(/L7?_͚Ck{uVmܸ1XQsѣGCUlټp# 8ϥɓGyJmk렖;wnӎ& xeWwu8ܱcۣ,D+4$Z.]: i. +۶ Ȃ P s @�@�@�@�@�@�@�@�@�@�@�`nk͘!79_ܼ̑nq?X~}"E.X � � �N/^m&P BlN`y+,Xdɒ.\)氰NX|֯_6YpիWkժUޜ36-6oY0' = -3NNFӂƹk&5kN:]fVhѰrJ_4{l/0СC35,0*|Fj@ 7*!� � � � J7#�(p4f~ NiPjVjJʑ#[M[qa~F\ʔnѺ?|aJd[m T •vY=e![i'gΜq/{^`YfJN3>v올сb!(m[)+-vٳgvhv-BYd9-8Ղp MZ @V8� � � � � � � � � � � �%iT I M6k]{dʕKp^@�@�@�Vʰ k׮ $s̲`B `İ-+6IPl07cs 6mʖ-[_yAZ],x^P2+K AdI&lGբEP* brvm ;T*V7VyO.]b/Y7n,mŊ%KxuӧOYXP%@ @-@�@�@�@�hj]4z.� T.F&HG6�n]6m:$Օ8Ojp}!Cѣ“z�- r}Gb-vdV,::4޳XvlʋoY ײ`m֩-SL^ ݶ2f( Jkc]}frTљR?~bW{։Ɋ7^{g%ضzZڎ;R}4u:-3ά ,ض͌YHj;H@�@�@�@�@�@�@�@�@�@�@�@\p.M.Mm͛'7Iʟֺ*ʕWʍ:3/ � � �!`XOP6mڤ͛7GLYԶmۼyNl97l^K. -Lb!Fv0I0OIJ``ΑyF`bs8pKĶC_,e9c/9rp/ .R/Tp޺H">K[hUh +{m[ 䂰`{Cޱ9ww!\7v -XwʾGǎp6 ˲k �I%@VRIr@�@�@�@�H Bs �\p[0y4pҎRժ]wD ^%. .YrX$ZI-[JRD.aRLM]Kxw:Ă `NA ֡%h]3Y\Y'Nwy]¶gq!]AǷ൭p`e)4,ض[lmg>r${, }Vz M( P+^"v@�@�@�@�@�@�@�@�@�@�@�@�pr_3Y{FUT_`� � � l ,Ȃ`{ r@دm~$t`ǎsW)mI.dk7H#mn؁]_[`Vd_vN{,j^Ynn=ס϶Y<`[sʕ{B7 i+VXd^Ж:;Z PBs=@�@�@�@�8�Zg3@�p}d4ujLOJ;ڴ*TR"yelSȅ.I!Z-ZHoS/LR%)~{5y4/iF¯~q諯'ʕ*Vk/C ԊK@�@�@�@�@�@�@�@�@�@�@�@l̙~lX៣P!?XNvmr<7 � � �I`6@id~rڊ� @ @�@�@�@�/>r$ �/p5hzeNөUrׁ+D4`!*kVys?覛#qhG#ޓrkϋ~٥^$fjڵj֔>Xz~ � � � � � � � � � � � � iiJW\Νm.KLymin-_ײIVU2g4ڃ� � � � � � � � � � @�Z1l!�cҔ)~֭;IUF ػW:T ߂,<k@<)}ԵT4iηs:paX83vʔO^~-<YKʖ-F�@�@�@�@�@�@�@�@�@�@�@�@�(/?ƻb㿖/̑f? >쏋\תQCJej+O@�@�@�@�@�@�@�@�@�@�H P+R,B�Rѣĉ~!U(o~V*)AT7,Fl@M}-â˖IN7kRnRJ,~TJYx;eV4Hk, � � � � � � � � � � � � @@4R~i`.^,͝+͛J$ ت^/ժI9rm@�@�@�@�@�@�@�@�@�@�R�Z)>QK@ "Ǝ CvBz @l8JV'p6 ORÆR^RVR\z=cһJݻK_.͙#٠['-Rjw=7ϗ[SGߎ{oE�@�@�@�@�@�@�@�@�@�@�@�@�| b²:v߳0- W?dc,tpUd #� � � � � � � � � � @x !�'w4j5ftTԵԺTL5] c!ZK6IuRw!*P>(-_j=.]V Z^R &M{Nj6[y T@�@�@�@�@�@�@�@�@�@�@�@�/1T_zȯҥ1_v?ϛֲ+KJRL=�@�@�@�@�@�@�@�@�@�@�`~@�dغU6L'iDd\sRV̰ -[,JW*[61gcw<]}pauYʿp,<G?LcG`E½  � � � � � � � � � � � �\Lt/Kv15Y_flH'N xrbT+&Is@�@�@�@�@�@�@�@�@�@�j]e�BիC3 F^-ID59*Z7NʖMkeN�=mCRϞrm֭q틄u۶~ZõF*W@�@�@�@�@�@�@�@�@�@�@�@�'E%+7SŋEbرҮ]>9r,\Bl쓕b � � � � � � � � � �I-@VRr>@  ,XhY…RΜҍ7J}'5o. +R7HwKMJK*eΜسFqK/(}8Q*R$e-*HgժҜ9RVUWI?nFRi  � � � � � � � � � � � �@lR:~ ƍoԯtW~l٘/[[ɛ7,l#� � � � � � � � � � 8Q �N1i4i0Y#*$h!t RƌP!x! Қ5K*UJz).Ky# {JEFK-PwܑўحbKt-RR.5 � � � � � � � � � � � �  KV5։ҟJ6kbL$}We![+l, � � � � � � � � � �$T@J '4v5jsTԦtmR:R4`!p~sH_~) iRz ?t={gJjZ) /?ݑ#//=j{I � � � � � � � � � � � � RҦʕ cǤ+%K)Rґ#^y[eQmmxq˂� � � � � � � � � � @�Zl#�)i4b4|4qtT ~ `A|à-wڷ=߳GGK:I6h #uՑ׮ZԵTtҖ-_K2ĵ'!� � � � � � � � � � � � �W  ʕHe =d,d+ؘլYC6 � � � � � � � � � @j P+5mڊ�Ys%ШԫtRp2vE,˗U߾ґ#R6mg9,cq=I}Mzm+}QdYPRΩw _>eK馛!CSOi) � � � � � � � � � � � �lt, ǺS۲atiz4i&4iEO/}΂� � � � � � � � � � jEe 9 DEISH#F!ZkJ J"eZ,$ҷnQ߾5yrn/.ԡCdB%Y9{ھ}_ ZoqDmϟ/:$իQ͊1 }7ͥnƎr0v@�@�@�@�@�@�@�@�@�@�@�@�@�ZHJƧVs^i2ɂlmƽ->k\˖ú,p{yz>^!� � � � � � � � � �LR} @!hoTt=RRR4Ir)N'}WR^'n];sBÆMM7Iiӂ]OH|sTٲC50-9S9*TO'>QC>ԲP yw!� � � � � � � � � � � � )ժP'#[˗ǬVZ^mqhAV-+9rO@�@�@�@�@�@�@�FgH��@�IDAT@�@�@� P+5D�T`iH?Dk,)]:~}nE*Q"I/lʿ-'edm=qdLo L %u$<)=HIݻ)|3J~eHSZ_/M((o*G�@�@�@�@�@�@�@�@�@�@�@�@�(6?ƿ6mzAK)F++Vexi} 􃵂-¶bB�@�@�@�@�@�@�@�@�@�A@p HF(?e?Hk*)_>ys'&M9:U Xп.-t啋\K. uU+U${HO>)+syFvC*VXBN9Sz݄ 2%&TkdB � � � � � � � � � � � � @ȜY\/o_LmYֲeҨQ֭1{[Vek ُ-@�@�@�@�@�@�@�@�@�@� #@օq* GZIi#|T6KEǏKYsJW_-tRTaլBV׮]SJj_GC}^zk˖-z饗wtڵƍ3,U-Zժ_B4Iʝ;Y.I@�@�@�@�@�@�@�@�@�@�@�@�@�/#T_b7f^?`B,lkJ믘m Whm[)UJ*\XJ&f_@�@�@�@�@�@�@�@�@�@�F@q, E?9R3GʘQj@z-馛%.z@ /}҆ R˖Ku4smШQ\n12nJ.yԫ7t~K:uR"EN=(_/e"ժKD.L0AZq"A�@�@�@�@�@�@�@�@�@�@�@�@�R@Μg:x Blmeli:1.sfdɘ h¶}ǂ� � � � � � � � � � pjG �a!`;r4zida+RÆRlaQU*{H={J| >,u =?#cƌq[*^xGlL*w~V_|۷k׮[@-cPm_wԢVʔ)s@�@�@�@�@�@�@�@�@�@�@�@�@�/5T_b´֮ Zߞ2EGڷ?"MP!)ײu趍}X@�@�@�@�@�@�@�@�@�@�N PtA�V` ?@B,t:׮-u,|TzVERr!Y.] <yNom{Q۶mO߁wtK~0}]v 9z-}h_,͂oh"W4~u}3x*� � � � � � � � � � � � �@z7;C~- 2eJJKΝ; � � � � � � � � � :JV"@ ;[ ʕKjT[jLʟ?6jX͛ߗ>LʒEzyǤ9ܤ:(sOμS*_%cm=v駟jϞ=ڵiE&IaؾmS*Ґ!/(@�@�@�@�@�@�@�@�@�@�@�@�@�G _>J:Qi:?hB2o4xm[1\osٗ-@�@�@�@�@�@�@�@�@�@ Ԋ;J{@ X~8Qڿ_reK馛sJlƍ~h>-Թ-[cAPC=yd]b8XzK]j{_x;CGyD ~?7FW V_4J^p}Y@�@�@�@�@�@�@�@�@�@�@�@�@�O CtiU;OfMLЖnk74S}H{7?BbHV[ � � � � � � � � � dIy#@ ;&͜oR֬ 7H+5o.a 4' so)_>̙ҥK_5\hҮ4oR4q˅?6]qt*V?|� � � � � � � � � � � � � ٳK+%*%ex޽1GM-{;w̾l!� � � � � � � � � �&@V�B`fi'#-gYXdʔ*(hd (YPѣoH=g;{q8*[na [C9�Ձ\޻1ϟV"]mС*P c^z^-h+R$\kJ@�@�@�@�@�@�@�@�@�@�@�@�@�#+T_:~.iژ-۶2eԯsgQ9rA[+&*$I?[ � � � � � � � � �  PBjs-HǏK_L~(gui)jyhx l&u, "u$'ϹUW^Ѳe4=wK;H;J}$e|vמ={zξc}ڧ7oep(Z7ɓF$MԷTԺ4ujƒ"!� � � � � � � � � � � � �P wnJjq7~>?`+ 6yP鯿"E- زЭuѢR,q_w@�@�@�@�@�@�@�@�@�@� |98?!ZIwKJI͚!Z HY`F" ̙M+M 5lx<y}}*[l'kر6lVXJ̘1C_~VZ‡M6YfK]s|]Tdž 4rH\}zcq~/OYW\KF7bދ룳k?F,:thYMy;v옺vGFWuѢEի*V^Rld.Tr%)zHg.v,l>v_~a'5 � � � � � � � � � � � � A9rH+%fEEI[IV,tֳfk7+zɟٲba[KƉF � � SL5j(-]4lhufl&MM � � � � � �J@ %u@ \n??@ki)S&nݤoʗxFQ<yνA\"RumC :'ܠu뒦ٓ,aZռys}jܸ  澠Z؝\nEڸQ8QrV Z>#/gIwںu4d֭~'Rzގᅲ,̭b,ZP'f Y _TkM0I.}Դt'n\hK~'/_>'\C6 � � � � � � � � � � � � 3JKLsC p+XϜi$Ih;_1a[m۹rJ� � �$I4�fo;w&qիW㵲5  � � � � � �Q {%1566#�'`8.G?,/-*gYez~h.<қoFv6m4}t-ZHy=S\풦Ν#Gq ٹbŊ*X&O{Æ xbmٲ%prFJH-.]_OAq585i7/ƱG:t ,/ պ%fɒ;1.Xԍfy/kԐT IzF3(Yf9z@r>oVjժk׮ꪫǥeϞ=url䲦wP*T(9ps&3z;}-,/]tF'¨ZT@�@�@�@�@�@�@�@�@�@�@�@�Xnn_sC'j;dH t+[@�@�@�NضM*P@n>~>>퍉'jԩr 7hҤI. 8[R+vZx@�zre㏓ @�@�@�@�H@ʞ �QQrAA~h\ߙʕ '+~j=T_kРA7n9iUӦM #֭[yf<xIwmL7.$Wѣ!rAukp=wڥJ7>eG S۹sZn} yaK_|! EڕKr=oVg Z|ҤIŋ'gSN9uF1CzϫS>�/g-X'%Ouuh,@�@�@�@�@�@�@�@�@�@�@�@�H@LR~9{HZ%Mr-̝[ mBΤ � � *vZmV;v };l L @�@�@�@�@�@�T&@V*4]`j?di$i~|yY3w믗2g>r"Э[#j>M6Mǎs߇fWt5\_sRtWx]ve\`ݻV/Zյ}v/(tm۶?Ԃ #Gw}BoBnv؅ _~onUj@80߉PS3qʕ+jҥ*ZЦMmÎ62dPdv/cO;UTI*T.=MH5kJcjw*>]T<oV'{^u]Rv .Nd.}trgr6{l;hTʕժU+5j(&䙳:+[lQ5ϻsHZo޽{3x] =oY,@�@�@�@�@�@�@�@�@�@�@�@�@ llH7팋jamk7 N&[Gl^, � � g#cʕnںu7ŦMVZ*Y>}4n8*UJ?T`6ouCٛgGS/^'Nxst OԩSs<o &.GyD/߿,T+4�lȐ!.wآE 5m;_R'X6@�@�@�@�@�@�j]@ \Ə s񃴖/ nAz=?HD75B 1.u2aZdӰaC]y4k,cXgg}VkV-ۿm۶4rHR~KyG߻ 5kXVƍsϩyzu7Ԯ];}GiZj^@XǤ_ծ]\tlb=ZjZ6?(}<۴s^H˧~'|s4^zyaM? r]nٷoyPB<x6oެn,:>腤YX|u We:u}>s\/>b&xY?~v B,kܹܟ+ch"/ 4$~n]p;)ϭrk+wK1}ߦO}ObgΚꫯz?O^G>{v- |Yb رc2fuD  � � � � � � � � � � � � @ȗOR۰m~-++VH&nb3d![6. ]@�@�R޽;|7gL2^K/h{^XUhkm.ɓݻ,tkԨQ.g7B]0zo(o}؜7Q{Nu1e77irwM6^o~vpXr7!Vlt7kɒ%޼?'5 � � � � � �)E w'SJe' \Y5mtTBҬ\!Cr]"pq\IFC.)uxʥX8JhdaApcWk֬8dxPٲe},:XHu“.RY`΁Zj<yx ҩW,0jٲei#Ytej_npIyeuHX�1/zKiPÇdɒ^,jaÕmԯ__SNU>}UgS\9o7|zdg3{hsm\hyɓ@/ I sY\-r&͘eaݺub?ou:}ނOqIa�gmѢ |kc= .eƍ^'~Zu Nt}p|=s ,vs\hQZ0{kB z~ŋ|s޳ Z BNi0/.'=c֭ \@�@�@�@�@�@�@�@�@�@�@�@�RΝrc%7 ۲{dn[J冷2<-@�@�.ƍQ.4w4=|7ǏBl^{-7ք ܜ'3tUWy86ݻ߼:uR0e]+Wjyln'ZjaaXs؜16a˘1c9q^~~a/kKΕ+O^P|x' �#prsIώ|� � � � �\�\;�00X|F=:H]I&`V.HiYǛ/ ´f͚͛7{!L?xWŊ^lٲ:X̙3Ǎ2hРA>YdQ*UNDO^XdLYWZR<x{lȘ1u4DMܮeFdmݺN:w}TCNŻ6MV~M3g:tPUݺuO9Y֐!C@O?DiεkL#oݑꔋsYb/ ϹiGHWs=yϭY=y ak >1 8qN8}c@,n#*d~]Q2{^'ٹ[۲eR^h}z-];}pZjy{9ۗ@he6@�@�@�@�@�@�@�@�@�@�@�@�@�+'dj3av^ؖ5¶Inƍ(nʝ@�@�H:{-% |7Um!y9tl%y3\eKӦM9YX*/w}7suysG{ァtye|*c-6g}իym>-"%!5OL@�@�@�@�@�@� P+nA�p<=;&@˶_eXˤѕW$W 8/#ҽJ<#uvnZv+W.@PӮ];3SO=-[xl.SN>}zթSG|r-YTRgNG-~SK̋_]VX[o_~;wVs1fٽ.ճgÓ?NgAb5\4nDƎ;x:VvDYWPDcr!mR1Z|yC-l{+Km( G�#\˲sakrϹtraY~wo#wQ9e=O>wyΜ9>sve˖)gΜ;wsI3< A_pzyk֬ b� � � � � � � � � � � � � YlH] ~9ӎǎI6ZAؖ=7dMv`IYȖͩ}9s1l!� � @rȑ<唝ccm9yd愱pKΝ@/ zwdd̚5KÆ ,̫Xb=u6m\pd/|[o1uy%=\ � � � � � �\$.<E�p?7/&Hwu }VjH.($'GQrWzsYƌƌGK.^N>}t!/:mذAUxn)X3faÆv9{9FXϓO>^R|A 0 0-[^|Ecш#\l/봃 pA<XC 8(dPB 裏z{uʟ?zZbe:o<9rD2e v^gjJcǎ:_}JҴiӼ֭[ሸ i"iS?@- Ӳ%xBCy%5Ʊس'O}G炼$)<wٳGw9:3gn޽^ˇ\IZzٱ0{ʕ+f%( B?c@�@�@�@�@�@�@�@�@�@�@�@�@� <6F=AVLlrnovk74э9-@�@�8] mtwcؒ@+7oFɒ%Cw?mFUf,.6/d@\oBбlf͚gqskwܡO?Իdl@�@�@�@�@�@�R@ڔTY�M+-=TT\G, ,^:&EX/K￟ZhM޼yk.#|Wʗ/m۶MժUN>uS.2w\YH}~Wx?}NTtieϞ] ^&7`g-;w:z͚5籍&Mx=Y.֕?|aZvPӞ={ɎfэSWL탫JEš,hʂLm1L׭[;v3.iPvзϺ.=]ҩڳb6wlyhȆ«ZhqBNMc{M? $UTկ_?߿?SܨW^yEwq>sv</'OF_k̙z陳N믿z~Y*[- � � � � � � � � � � � � �\0\/'?Dnl4gxQmC6~kI-[ʍϔIR 7K:IݺI.!͛'שA]\@�@�0(\Wf ؿ߼ 9UΝo.uU µƎe˖yG͛զM<V/'f9=6  � � � � � �)M >fVV{�Z~.ƍ\� #!w4nԂ5$$̂@jسx?rdﭣ,{(_4p@uх#iӦ~YQ̙]Z,YRTW_}US2euV=sNd:ww]WvG 7#G=ʙ3~G/@;fXxք xb7Y<7R`^UBOh?,Aɂ{Pۻ *"UV)|A7aW;x/}zg<e[?iҤ$3 aa]u{,x?=\~]=G]w /)]t^ڄ6dm۶=zAQ1xqHW^inҨQ6yOV`Ԃ :4'O}U^QF.Բ1oK1c .|N'O?c<1cx` s=  � � � � � � � � � � � � @l~MbaYv۽;dn XB7?7A l_@�@�"A?yd K\0OuWMgy|6*TBo\*W+ݿDۼ9g7c֬Y|87p&Nxݿ_c<*ѽ{wo>Ѓޖ.iׯSD oN{BIl'  �K@~rZ� � � � �(@V8�gؼв-+-[.gƅkа |/@qk=cǎɂV^-̒%^|E/(M4,C^PN 'coҦMcqڴiKz|oe͚ Ӳ(~էOYh߂>Қ۷{Cv+VBzU&TK>*͙#n6I2$8wF0XKt`Æ ӝwީ(CӠA`$;qw^| >|veCuM2Ӡ1AYZB{67KלӖsVZZro:enXh:+WNk[o% ׺X+5l(/ e^Hٳ*ըQC}mBku5{mݾeʔ) rྀ;v𞓲e&tj%#.F�@�@�@�@�@�@�@�@�@�@�@�@�T-1Fm![7J=1L67Sö� x6f?cƘBػ0+/4EQ@) XFcl1_,I$jLP&jXATtAtiw&g-wwy3w)gϋ� � !P/y_ڭwL<M֭c<6駟y3yy9n2#<@;R(k8ˋ=nO׮]`%h{GsUF.s96lX4vx̜їo9x5%5FO8 �UO@w9c@�@�@�@�Y@t:hFiɓ}fh@ U`4iEAVҙgJԼyşc;VM6;9&gqδ@֮]=zA9W;`9hhҥrTβn:͞=[۷r>_>wR-ɟQ~ۉ^Vz)ET:.) ꫯp$J tLEM2%^m۶.\(?*u9,ʕ+MRs>̱Ý[9v]SNlf͚}i!,-,e' ͟/9vZlY܉ENal sG>خ]xm!ky{6Ū$@V)Y@�@�@�@�@�@�@�@�@�@�@�@�@!x+mmίX}͚I9CR G � �@jUWSAcdl۶-cfq3<HSfј@hc4WݺuPEQm\_Wɤ; �UC@q9K@�@�@�@�*�ZJqT!IƌQe裓گ`*©"P>Gze[7* X>S>}tn(`tq?Iz EaN/G%NJ S-rd徲:t &h}%Y`tEAe#H\P,@Vx � � � � � � � � � � � � P.6I~+o·.UTurn%5Ђ1� � z@��ZUs � � � �@;$;.n͛KG)=@UME˖I>+R^ /HRׯ_s9G[lѸqP(U:H^{ms S$=K5K(8pcF2sEܐ CH,}aaZ>z_5kVY82#-RYN]qg{;ҔnW]u=в!{B�@�@�@�@�@�@�@�@�@�@�@�@�@ԩ#iNg6ɡZmy`.GYjԐv5Э � � PXE|%Rr(� � � � � � @(H r& Bc,h9�vmC+>a%T'(͛KzMn]EW?j.;{q-6׮lzK/$xb|&mڴIWK|Pn驧w52.KCuU߾" � � � � � � � � � � � � �TZՓP,_y\ʚ5I÷:]PdRFF֖4GmڢTVC�@�Zu jܸj7g� � � � � � @e~?e>\rxرR!]Jj~;R@ q瞓V?_:~_˳y L(=ҶmҹJW\!kxhÆI',rtE{-k@5osd6Y;`O*-]  � � � � � � � � � � � � � lْC kfmZ5iSZ!p+̇{~]5^ � @XLuW%aEA�@� /u& ZmJ@�@�@�@�@=$dX +@kpiG&5j2Kx�y̟/=R. 7$O{NjX\~XS'ۤDjܸBƏ<3%Lp3Q(LRF�@�@�@�@�@�@�@�@�@�@�@�@�@�~ 3F8g֒%2O?0k~ƬVj [^jק � � � � � � � � ��ZeokH#G&!ZК1CWOW2DrVRj9)J\`RgM:m7m*uVիWJmY>iJw)_dR:ä,ݲzn/aR@�@�@�@�@�@�@�@�@�@�@�@�@�@�4__j.YZ [aene(5jdoĕqfק � � � � � � � � ��Z%Vr[H5nuԳtI֡JuV9Nb Z%r{I(I'I4hTV7]_xcISJݺItyRU�OGzE&<Kͺ8=K?Yqk@�@�@�@�@�@�@�@�@�@�@�@�@�@�ygɵSqŊ$\[-?6-kyjV+m^Zv � � � � � � � � @U ֠*_}" JÇK/]+ig]uUҬY7Tquaä瞓|SVM:XgNHB8QO߶/$=4bԨtIxP^,/,YҀRKVf-[J/utERekv� � � � � � � � � � � � � �@Ӧk.ʕYZ!|ӥKgg=aC5i=l+oiÆ_#@�@�@�@�@�@�@�@�@*U2@1/NBh7RG$G)w17 I;H[$t?,rJTyvݡ7; *1H?թCŅ>]=u$(+Ն Ϥ}v9�D�@�@�@�@�@�@�@�@�@�@�@�@�@�*C\;w.׮ J \_|ٷW^WVjWfR_#@�@�@�@�@�@�@�@�@" Unj@) ['gRR>ҥJG%x (KVro^yEzEv4p4ttIRO亮ޒ$Dkz_?{MKqlz;qc:uJviUXF%J á � � � � '��@�IDAT� � � � � � � � � @ںo_l,Kò�eˤ-[YP:mb ps � � � � � � � � ^jh(Sw$@kd˺w qRezX J#0cF҇&mc';NjԨҜj;}}N;MrnJ 8S{+c`Ew$߶MPP@�@�@�@�@�@�@�@�@�@�@�@�@�@�JWvmU iŊ$\[\ge=zu-.öz\N@�@�@�@�@�@�@�@�(-JK"SfhvԺtK&9,Z`&i(ד:gԴt'Auu)9g87۶<(cwΦJ\ GcI5Y~{+ ^)jM"Ҙ1E #� � � � � � � � � � � � � �@jRfIҥ]oCVn%Kɓu-6n̾Fz0ͥZG � @IqhBY*iÆ4~T~e<B�@�@�@�@�@�@�!@AŸN%X0 1Br]XjX:; y^@X( xrҺuRqI}H5jTyb̘|n+WJmH+I� E[/HK\#ϒ;S*ݩJ˒C|� � � � � � � � � � � � � � PԑZJjad\J +^|eK6iBR8y� � ?5dHe})@�@�@�@�@�@�@Н\)B Z%@uC~$ AVC�lr<N,ի'  OIS^ƒBlۖXtJjH/ l:(i} 1V)3Γ^}Uz?-]p{{ V4O7mJ@�@�@�@�@�@�@�@�@�@�@�@�@�@촓ھ}IX [9gK}ukvU7Nro9kg9@�:#y UWqPg3V^>,G�@�@�@�@�@�@"D?Q@" l(}4bD3aBr6/|tR߾IVE>OزE䓬�-Խ{ҾK:XQ;Dϛ'}4n\;~2wt>P骫zJB~}-N9EZ i^#dIWI;]βys%<F�@�@�@�@�@�@�@�@�@�@�@�@�@�@ KXM$SyWH·R<9'/O?u{;=ˁ[͛罬AW3� �Uӥ/=~Yg"� � � � � � @z ׇC`;[%f9@aZ{$giv/f(رҘ1tZuki@˒in"իɓI)MWt:(tRnr[פϗ3 Ek6^`"[ r 3^?J2P@�@�@�@�@�@�@�@�@�@�@�@�@�@�QjfIܹo]W [ > ^a[o9#� MJG-䱸r+ZI{ @�@�@�@�@�@�@UQYM 92 }$8 -OA� \)}aVxҦM{H}JwݕhuXmWWpܤΙ5?s.KݻK/]pA2 OOpҍ7Jwߝ\yRz^:$0+3 p9@�@�@�@�@�@�@�@�@�@�@�@�@�@�p\ wm|yefI^tvmQ# e)o4S'6x� �#KokՒ??X� � � � � � �G@s8*$�#;KIߞOT(!eM(}iVu`KI%$ӶmU~H:%I)ԅ ,jS{JKIG%u&!U͓>;iC?.w^E>' s_aZ , � � � � � � � � � � � � � @: 4l(v܀͛ttidモl~_rVjmyӦg @�@ Ojז<Pr<> @�@�@�@�@�@�*�ZqDF К5K[W:?O<prse$q䰬> Ϛ<Yrƍ9=4ZFVfڵҚ54Yu*uŊ3뤖z-=HGH]g9DMVW0_Y$t؁t:V++]}4cҶm?K( � � � � � � � � � � � � � �TVr/9fd$-<Μ,W.5iЭfͲrwU+ �WA䓥_>Kɕ� � � � � � �[@}8 *n4fLVĉ;9ӓ�-8T� ܹòRnח_:pk^ҿ?'V̪ !XaX!+fNlݮftoHrgYW:,{mhR~ j |toH\#wR:Uˠ*С?3GھÆ9"� � � � � � � � � � � � � � P8Z9 u ~N-|+,?_쳬X�!d+iXo w|� @E8\\}@�@�@�@�@�@�@b D?Q@6o>Hz$Dk8ݺvM³nU/ )c)h9y֮RwЏ;mܘLs95mے#qRjuA嬵jIkN]<ꐗ0z0 $W/k0{u?/SWR|93ӥOڶMNr5ܱubiɒ|y5tn]"�MB\w]){Ss87g2y9hobYegK/I{Ksl=@�@�@�@�@�@�@�@�@�@�@�@�@�@�/2v-݊U1M:$xl aP@�HgAu<6V(3# � � � � � � PԪWcO[E}YVر~ "hQzuܳt|y؝r+ =P|>|i|rpVnv:h[fs9d(:uӦd`%;<T/w㼊ERCZr !(up>_JVϗ,Hw$Dŝ5۵:v.4 - NW*܆.Ziv:{d]]vI;_iӬi&c)&k`˫8P˥wM>+uo-BV`� � � � � � � � � � � � � � @ xVZؽ:X$kyχi1#kci^3"x  �e!{ó<޽֭b@�@�@�@�@�@�J[ؗfUF/�ޓ_r8u}IVI8o갞0;4Z>߁<qG4;ǡ*wO`갩Pµ p:P׬\Sx:o^2ǡ:+ҠAZa[\]!6*Cæ{2IC{ѝ:AW/쳥NB<ޏ~+͞Κ<{$/c8=Zv=\41-+aäN8Cz?I%Ar뱤 i#taU^ @�@�@�@�@�@�@�@�@�@�@�@�@�@�) i۶7BW93G$!\9@x3xˏC ^,k^5@�JJc=Hե/-@�@�@�@�@�@�(ojQ)`TDs�## &뗄h9H[֭I(_'!NP w*__r`Oԁ= S;<NdE3rxZ 99 {:u6BuXy֭+y]Os;Gy/sȘ{U#cjݸ1y~}P|-[=BxVW?_r@^ӧK>'zP۵ M!I'(M:ap _2I^=#T# u+ydc(Kޚu� � � � � � � � � � � � � � oZ!x+u>uYk?F¶ \z   �3iݤe˒,IA�@� 9th^ϫ@�@�@�@�@�Yc[TfE�Kr8P߾I8 a ͙#͞5  !Dk'ACmHh9ċR>j|:QfMiugM݉Ý lM *C[uGÝw[ӦM-iSD{N$}4yr2﩯K˖R׮RyI;K;&HDAN<ѷNz1iƌ$<ץO<m6YKw!xcb @�@�@�@�@�@�@�@�@�@�@�@�@�@�sŵUpVΚ3k޼uVʇ=x<1-|n@�#Pz2.wK8PG3A�@�@�@�@�@�@rͣ(gM.JcQMxS5(I)̧Nmۦѯ5j(֎zԏzՋoBq ԨQz*Kn<3!<swgQBOܡꠃDr,Psf%ZȐʳRI=$$h9hO)@F6Jr;(5)Q6W[ kFD)T.= &MEil_3ؐ;c`^s%[M]xiH8 N9%s* sϒCbgu&!{n2DŽW;yP'-´CS-zS-֊R\hw]wi詷]''LSOI]H#F$d Lnc-i.ghڴt}4}崙¹ � � � � � � � � � � � � � � PџkݒZ=WJ3+<vǔ+0;qVjVn<Di݁�(Gqr7o9M]r3y0nEz ǞxO%{w{EީիF㉍x\MqP=L{(,L={K9WC[s@�@�@�@�@�@�]@\\#(qoղ(uy+W늨^7*y3\^~4Uoǖ[M}?D (pn:@d(YiԫI&yre]ݢI-Zm{̗hP-%!V&G]B5iRf҉'* U좼8,kT)Th͙x=:u'Vɾ=2(y}vdɒwQC{\zufW{nݺقݹ sLJa#g[Lm߸qvm3p;ls; Զ]w5n7RP#&.TZXQڎ-\trtGe.{)완ڶm-6{c~ڤnwqK 򼗇v{8-vO:M-]}?t S}_}4{I# qL=6>ӟxK6#vY?m~t>um3ltl@�@�@�@�@�@�@�@�@�@�@�@�@�@�,,h<p=LԯK-|Y3E $0Nüû( @I x܆uQZ`}4h0M8H%u>P}1cBTJzǞO z>#Ǎωƈw$s&=i^?{l»Rü57#gM}.y|y)kcq<sڰaC.@�@�@�@�@�@�&P-/0JXo(Ł!Jq?0g8\#ބo¼1ov\ڜ?d;a`!Jab0.}ݣ==2mڴmҡtܹ O=4 њ0!Y޽tҀR~ero6M<Y2E$@k޼$$]Z;&Y;'Zr~cpϼom0GCWGSBlR]|j[tMj[t,lqGP%ԶB[zµZl&][nܷCJz$s-nn!<[+n:$YskNIp|_t[ mSy'4zn,rk^:ㄎ;g A[-XhoŰ&{kUVka˨QҠAIc^| ܆ã@:?NNT?- tKު(.ݎA�@�@�@�@�@�@�@�@�@�@�@�@�@�@ @4@Bƕ:eo|l% d .m0! l<@Rxl[Z=ƉWJk׮8gyljɫx09Cx/y5yWn YST/+#}`k<>[J2sN8piH \?(B c y@�-пԭ4th>O@�@�@�@�*@ rȌAf͚9sd֯* uXzG χ 0uH""W:ODBJ0M Bi۶ڷoQҍ罬CUuk%!;9#x<u#Gi;/9Kk$?騜OП={vm=?EB6i-(~POyZKd=u(`h.ZH!Ɂ~t[l׮]f[t;{cp=J{l{~ۤM:zQs?c<rhVG_vHϢ`3gfý\YHGttXbζ0KάK,ٮ-Hhn!v!\+mv#uTaZGZ%Hێ$ӂvtθb@u8Z@�@�@�@�@�@�@�@�@�@�@�@�@�@� x,('3x![[\ڶ-BWA[!+Lw9W'x�%%q#<q8f+ƽ2jȞְ;4+z,%0԰#ϧ!y/%:@aW-?ȁ[!-ryo/gqpZrؖ Y=^5r8E^V<V#�O@*@�@�@�@�( %J`qh֗_~)Sh1cF~XˁY!2{W&@WF)(갖QA"t9 W׭[wJzIEA&Im#F( ~&NLI/$mԽԭ[2|wBpV ԩSvih A=nkq;t m֭[ǝ2R6l #ϟ.ڡg n]8nߟ*ҥ&u9;D,ϻ`(H~:V8@C}Otu!›| mSht;-X -\|B['Jkt;t{,w?Tԙn۝[F)�b)n" JKÁ!� � � � � � � � � � � � � �@J -s֭qDCD!&E~C(T5m7,e˖e a,`BxPjPX|RÇ8,st8~ pa>LCp\ʅ1�yLBmѢE漟wx@*{s� � � � �y T@-_?q@(sC'@ѱci˖-K4&oF); ̜93!eڴiQC]_jϞ==*3iH%cPa8,k}ڣJHOv=dʼnQ ÚTN0Զw@p'_FڢØBO8/}¢(KHW^)򊃝> ˓ux`VuxVEs[!hr[ ɓ'˝K\DEh9Đ~{֭x(GtcJm㠴P>X0@ڴ)6aZI\#}w3F暈QXӊ%P:GKV鸲U@�@�@�@�@�@�@�@�@�@�@�@�@�@�)t֬!'BW~h튇 A\QI漗>9_i!)tcѢEq9~vS/5ko借u� (Cl-YNen!S)+6vv}\{챇\s3 lL@� PD � � � �@jG-|GO:k֬8!!r !/ q rP8,fR&WwRpiժz޽{렃AzqR5-[ u n]QZ^SUr8qcyB;tb!!v8eʔv&Ԍyh}?S};9[u"*m-t睊ڷ að;3gNf[t;tƍ;tح[#r8Сwnn;x˝v 4n -l{$[i\jZE:aVZgҒ-SO]ֵ%P+˂9@�@�@�@�@�@�@�@�@�@�@�@�@�@�S J p#ە:uԠ\9O|Ɗƨns,@@ 6hXc…o2{|P<r 2g b�+B֒%K[ْ2Nµt=iY=F@pjΉ@�@�@�@�@l=PkQ z5v8@?\7z@8 A:LR5-[ &hquŋpQGp]E24*|2;ל}U5Z6rH5J~Nٵk.[[ըQԗ2_E=u;,kWGqDyZRE02}YU+z6vhcƌQV88+=u(UOj~8zz͝PSitEjڵ77MզM){pNU}g y衇_~qmj!P^y@�@�@�@�@�@�@�@�@�@�@�@�@�@µV{ﲞV) >^C8|+ly|Xu ?;fIZ |%}Wu޼yrux?GcN5He˖-Z06K�c@%ضm[:`=իWgCBVh�mf~� ;@�@�@�@�Icԧ~zKCcbC9$eܹsy fIcRM%35jl¶EG[/ J+Yv{m1"28ۡvu?PaD&M>(=zFWmz+#Cx@’?u-wy'Zls;t֭ۡ[18b Lk'n({h4h>h.GeO+.S?8yx<ȸ-:|N:ewP'{@�@�@�@�@�@�@�@�@�@�@�@�@�@�Q`͚![!u$x\瞤on54H&|r͞=[f͊wuVj`7qxVYfv_`Mt a|a`8ϟ7-1MƁZi߾:tWyQ@�$@VUڜ+ � � � �/P&Za7ԫi9,d}_#LkQoQE-~̬5D`֖-{kIOZI( ( !Q:"ի֧W"7wq[�8@GuTr~%/6Ruk(gM۬ ߞ{. ^=fafqǵ /~8sQqsЊk3fhvRWD~{JV+_' &hȑ>|xxy3NI'$TӪ|tرqÄvxǫEew@']"� � � � � � � � � � � � � � P<ɪUR i|K(g];+[E ɚ>}z\MOgΜ:~i8&ִk.3@c5 -?bC�شi8[!oΜ9Z~}ϩΝ;g:uƬ3/G�'@VŻf1 � � � �YõB{91"6tX?cԡCʹEokذaru~ϊiɒF:U~+HzA!Gz5yd.:c@ƍ^$@FF&N7x# O>uQM#TQGNj~U%I*CF_z%-_<:0N PJ3zk޼yqugA[,OrTɃ'v>}vnU:*%@�@�@�@�@�@�@�@�@�@�@�@�@�@�Hk͛qLRB�WAed;ZƵN6Ux<gMF_~e\l˖-VZj-9uѸ3+'�Ccf-^83`+z୭[Ɵoڵk\Gf#jU a#� � � � PIJ4P?8׫8(N|6lXI9try'z[b':S~ E:Qϝg}V=Əۡۢ{LR$NV.Ae˖m_ի-'֚?_QT 755J='Bġ)~N=Ը]㡱*.nSLQǎuӞ{Yt~Z.g:@Jd@�@�@�@�@�@�@�@�@�@�@�@�@�@�a\o|﷧Ys0M&MڸaYF ~dӦMqhք /uYtN:Aq(2k,M6-:Hc8Lk}~={T.E�R PP$ � � � �[D롇C s=W'tBA l٢Ç7j׮ .@W\q:tNZcO5tP=gqFSmJ[v/B?#ۡ}vi}m~?øsN **5D6\~{ꩧOk…qs}q2=OKM@e~JV} � � � � � � � � � � � � � �@4rl8rEV%uRFFrكBVΩr.S'ȁ1}>䓸N4ISnݺ޽{tڵBSE�rظqc5q8t0]6 Fջwor!T^NA�M@t" � � � �U[`f̘+`hٲ.b]xmݪ*g_a֬YNnFU�'̰atwĝPGD\z:Sⰰ s18*-NTf|ǵyf]r%k*ĝ|A{gYgG^+'Nk}2dHXV s"|?0C2|?M=5R5G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�غuP0ia^9K}%mۢi꫷5f;V˗/ǚѣ: y<P;wV͚5s �9<Ϝ9s4~x}7n&L 6!S~ڵk@� P# � � � �-P@-@F?>`]wu:餓ū'A F;0`@PA8~_k:uת[ni.!ƍO{:Y}.L7t7oGկ__/P9FA ,X ~_?#{[ny睧5j4m/ i%P+@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�X.+h+niJ.]YKlڵ5uk`~/g7z8�ի( �%!eM8Q|A\Go6ʟG} 8r%6@Xj!� � � � @) )Pk]iС:蠃tm#(CcɓVug![{L{:u /P7|s<f1O ##CEJ5kLygtp/XuIc`UQH/Q֭uӯ_d%NP"|?͋@dX� � � � � � � � � � � � � � �F7n^yx\iӦ.ԄP^Uz9 �  ̜9S#GԈ#bŊxN8A'|r?!@ P^[ @�@�@�@�(P_z-u%1!'cƌ!L"^q@ݻ륗^êf͚Ν;G+l ~jذ0ge*PZ8nʔ);uwĉ8… uG뢋.ٳ0X^a7nΙ3G}р ǵkצ94-.Q N] � � � � � � � � � � � � � � �C`ɺ^{ /Airh믿:h_´K@�ر.yle˖?wQGiv;v#� � � � � �J@[|:+IrG@>z뭺+5x`[8*8{9kСCl 5je]ӧSNQ竃#ؾˁ_vׯ_(m]vE<ܱƵgϞK{ynyD%H崙C�@�@�@�@�@�@�@�@�@�@�@�@�@�@�*ƍ裏wѣ^y8eҤI={^ 8Puԩp#�Yz[c|Wկ~ &9|V\Y87@�@�@�@�@�@ 7Pa!'xq(u-W_}U{y2_N2224j(xqhʷ~tuQGk׮ tWhȐ!iy^k֬ѯk9<n<6lPfS��@�IDATj?^_|EŋlaG'NU&OSO=5<US+q=w9t 7Z\>k,g?ۡ;ׂ |Fs9G};H}ez͛7׿8LkC,M't.r٤}eryO VXn{7tS?!eUi!oFY:s?|?i曡g(v.O˙#� � � � � � � � � � � � � � �]Vu,>#͜9Sg޽{7[WYn|IqjҤI|1r[l2=C[ѡ@Y{V1{o~={Ɵ;yW{̞➯a1N}u]wUV8\m|::@�@�@�@�@�yjm޼Y'|K7N|)W_믿.}>ٳg'ФIuֲ<R_~z饗Pg}6Y|y?ǡ5@;+gԩS'n e1<8dĈjѢEϣ/ܶm[01ϗu?>rʲ}a0S.]/qwyƌSjܑ ?c|=P< 5|8!&eY~Կsԁ&eUsmwi=P-\ފ~ׯ\=r)eYS=-Y$\С*wJ-RO|' � � � � � � � � � � � � � � z1׿+G tIU_ mڴIoVZ_ܖXB#G믿+BΒ۲TEQ:fO~.cڴiey5K1{ :΂xeӟ`w}6lX뭷Ɵ'@�@�@�@�@�@�&g5\ ]ve~^W]uUu%tEFeRܡ8a7p|}]UO{NC~XfM=CtGϭI&qhᬳ*cXvN<8@j(kԨ  ٻwogyF/ֱ;aqwI77xF*4Q7x#LJd);){2ŊvOoH~_i;Gq@\f|?iyssѢEҢpy|?c@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�߿0@/IΝ+ոq9kU_e˖OΝ;g嶬SN3oc 80(۲\Uų$|*=va Z-G[n%犻0)խ[7#9Xɓ'U"� � � � � �B @1cSO=6יnݺvI (CӦM_:3ȩUVqCD+tQFz5v8̧nfm޼YO>nUwy8nܸ3Ecywm_z8Ws;o~O2%sպ;csǮ,n?O\pAi*msO̗OV{?+W/<Wn8Lˡ|'N\^3wuwﮟg[&ĕXڢBϞ=N'C)p � � � � � � � � � � � � � � PO^ziÆ 807tׯ_Y*!sYaǝX]#GTFFF{ eOVљzOYRM眿k}Ju̞87`-ҧO9� � � � � �T\~G]n~inGZJÆ ]>+z״{vm7͝;WC і-[3<3nmڴI\rڸq?8УGP˖-s=go!2>\ e˖_!P~"cq88-'xBu֕{1*sf~m=+V?P/rӰaC]z:2׵qU޽>n_͛]?2ѦMFA3~.{2{YZ^~_=Czᇵ;yz,m?O5a„8Tc=6>3fāC?tQr[q@}>?xnQ{۶m:,'..YD￿n"t<,x뭷S_-P? *n{~?4h#gqx /QFi̙r;se(|I|SΝuwxNsWvt'jРAaN^fͲc[/ Ǟ2|pWwڵ/_kJkm7=rO yԒW[,{bAm1v)-:rGoFҵk_uqC|pOi?*ǒ~gQ � � � � � � � � � � � � � � �U[`T={SNyܣ{N/ֹ瞫0ޓxh]tQ<r.Y2kx{㏏o+Ƒ)rEڼys<&ZT6^o&y|n-{jΥ'us[VйdǗXv_}<fsj۶m<ǟs0ǷxS.;k|9s#ҥK-Z.,nG2J1{r]ִi>pWOߗ;v,x � � � � � >я[JbF#VFmyY>2H)㦛nwˢИN;-CG?fޫ/›2y&2#'^w0`@ƤI2Ǝ@e4n8/<sm-\0^}><# E%۷ψB2>ǯvf 5}2j׮裏fD?.gDA@v~ĈQXUdԪU+# (ϟyN&]@"HG V: Q0^XbIшbCEP@ t ;~fֽޖϼ^N{޳Κn}Fx^Z7ϻ ڎy.\8v0 x7uCxA^-[v=zt rnJn>;iqB s2'8ͭZ x69Y=_\{Ν/۷+/({|GVn.z/8p x駟=hҤI{x!ZnC/\-g۷ϊwc͊/Xmwx7]{x жm[ׇ_|E?4h#H+tc&ލ}شZJc{iB}SNn;^Nh}/*dNK }'z^r?7^@Zcǎ~Dv>?1WGs%̉&ؖ ]#틑\]lHbx&FzMk}x� + /+=$o̐-O d{"X>M; ;.7k � � � � � � � � � � � � � � @F^RZj C*W! ?Y]m`6l]'3g߀Z嬦ѼӧIk޼Yb6 1 ?LgWGvi}H sɓ]۬ xZ+}Z](eHDRGvO>(WkK.$`5mVj-]x/-SrC9~9kWV~?׷o_yѨe5{;9yΓ}9e@�r+r ]@�@�@�@�@� (ϟn*\2[1{ҤI8@-۹AMW zJ*,d&|[οkr)ٳg,nY&@:^ev#:w|v(<a۩ZjhMu%8sܶ@"Qm۶ # Ʊ n?a[[aҥn^xg &x y=1_۶``c=vă>l۳YxPAUx믿oq=8|A& y`);wt,5͘1ͳ5x!A>,-<`cvF,˶Ϻf7#Kիi{>c}bW^=π Z-]?pdž{!/O<Xn]^6uǍڼwިl/X=pQCFHbvHAh\9/D;b4gۿ~mC.|'oݻN}x}jx Ԋtrr: � � � � � � � � � � � � � � @Vo||')J<?�GÇwF=Ym">d4ςVəg:6,[@ZF~e::2Hew, rmٵkWhQe5/R6m8F wjHDR'|YMg׶Ho6׶gy&;Ȑ!y}q"Ԋ>_?fOQx?Jc3 jI � � � �ı@af\^UdI7 רQ#m߾]^Vhݴ_}nPZF%榼`:g}J.-棾|ݻf͚'lٲvءcޓwؽn&խ[WeʔZ6 /-k>x7ݟ^X{AZn R+|hL?tꩧ ҿoYFoڴɍ/_]֭-[lk׮-ۖ_~EovhLx78hm& p&X6ئ`:,5kLmy7^z}쏜/R Bw^؛|/>/n۶-Ͳ_… ohfqÆ sO~?}Y_vZʹy7oƏ/A 0-ѣ;f;3֎/fuMDz emȬ/Fi_?}M4b4˗]N7C7UZL@V}ߧ4>bIكbŒi4 @�@�@�@�@�@�@�@�@�@�@�@�@�@�@ JYtȮQW Y&M\#[צmXvxZdh~YOމ'/2J_-\LDZG6ɮ~GVa{աC*U*ՏC~F$ d2svO[==lٵeʕ+ߴi~4hs`g2ZM @dVҌZAY � � � � 0@ShQ}7(H"Gl /`|w\rc7҇XP([iڴi?A[rּy믿ʕ+eYU$-oCc@"gf`9ꨣuVjJtٲSLѮ]{K.UZ#FP*Udf￟f;9n>ܭhѢ孽1sgϞ|Tg҂,](Znܾs.\肥s~Xl>P?dgwN'V}RJ.sq!}?o:urm?Ϧ WWE]g{OK.Ze==3w K!55of}ѿVi_U?h.h\P >r ?>ߧq,~榝 aϙf� � � � � � � � � � � � � � � &`5_w"쭤L*y=IV/ Y 0慿OשSMZh ֑l̖d5%Yʪ\f9gv̙tٵ-_KWb`g8ZfO9~jeT30bHi;�� � � � @ U\9uAJjc7ݻw^uUW TP] jjܟ+W#Gj\ДfU;w?+4}oܸ1wVw{{̙ix,3ƅ\.)}Oҥ5i$vڹ2:vXgkt!iƅ\y.O>:uj¼loRicyXC-򰕬Wڵ<ѣGg`k.,i_kվ}{5JC Ij۷o8O?gewN'ÍDq/\}7fg>}ݧK.D6馛4h u]ׯ_h1 ?X={ ^zcrֶ7xC^ziǶ?amڴ)__h5(kb쮉f]_5aÆ+}nn:7ٸqcV;h}*4~ƼeX>dYް>Y.› � � � � � � � � � � � � � � �93Vۗ5sD_g# ~F,Y&ׯ8udL~҇@ٳՑsrjDfu;!'"wveI}0ZF\';לozz-Z'|2', FjUf � � � � �&pD<';< ?uG-ڼ͛?<^͛%Kԩ|AbaX0 uU2e믿Çջwo㏡yYMnڽgqFVGzʵ+p޵k 3@ y Ֆo]*Uқo_~ٹ7D_~gs~4VZb{9X͌a!77xm۶eHϳ}#<"Ӿh[M*;4}tSϞ_|;\V9=0Ν;cq>{H_-;p@͚5Kl :>L[l0mըQ#s=`j&d59\s5:c]hR~'?5kPf}1Zx닑\Ѹ&Zh >X 'B,j~4[ɂ4sio}ꟓinh٦5kfMA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H\rսj۶r4/yCVg4/f TF 5m4;3ud?xUXQU\uUV?/Sٰ}v7L/!=n+mڴ)T+Zv wx]LgkeU̯FQ5eX=\?w'F*!�iv쐼ˉjN3?@�@�@�@�@�0Pv!,W_}V^] D PÅ֬YYL`AN={t<.pB떱,]T{*Tm޼ٍmjd6dѿwSnOr79/m_m nժ[?v(,ʂqe!. fݰ[Y [n mҿkcƌ X0S޴i\ڨQddϙц3<3|,-˜f̘B,'t9N;fqxYgn9_spc7 b?7~_iF0&l7-"´~m<,Xmžʖ-{O]tѿo|ͺ+3τ2H6�;?~ sꫯ~;V-rbee~~ jC?-“7nd;�#F觟~}e]'|r(0ۍDy3g&;gG~]of0rUNmŬ^Ѻ&Z"鋱v,]m#ż^a3w/֯_ow}Wti7/Xh} k~>d46 m~c4kQ|^6gy@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ )N:$͝;WӤIݻV_N_Cį<c?k(4icH/cuI2g0uTܹM[ݢ7ʯwfFHخ=;뮻Ns,E.m< 6qDW΂Y=( Z\q; k.[Ç>;_~qER̯!5i$WjfE_ {饗԰aC-[LgVǎs9C�崺+/Ȁ� � � � �ćw4a߾}^f͚UVeL~ndԩ^L <Sƽ׬Y9sM2-׮]w-!}SN9%<d 4o<p뭷ի n/ix;3?[޶… w\ރ"{7 zrmӧOC x7v nE \vefaD۶p.FB7^pX xBmڼ~m>T\9PX"?~VZؼ&M텿.R+V,8p`sM`~$1m߻!αɪw:|GF]xq V xA*21 xUsЦMq^P;'>9l\r#ǾK2;wYE[m 4(`d3Yn-c6CVcOm9څ>l_xB!ߺ"/ͯVZ<o/*P{m{g}gߣ\r^9v퇏n*jy!{/@-0`m3 ٵoQ[&k]s&fw /FhxYx&ڱfqMžڷo콂`<yrvS~S{=^lA i1d5Ӷ#~R� � � � � � � � � � � � � � � [ϻzZV7juY-DR Cu}9眀$t<cάޏDӧOO3oȐ!T曮Vhw ':b~zbŊÇG&:2ԗ`FO<(Ukխ{G.+O/X*1^x@˖-v˳c"Y{g6حN}}^Xw <s-w'Ǝ3lذ@}-`VSjjԨXhQN^[\vgWj'ZD@ 3PJ^ � � � � @ ٦H^(z)/JFRǎ3\.gz![ˆ2<D栖,Y;vȻ&qE2sΝZr'yA/20y7QeL,f8p@n<xvf^^{5y7!wM?3yGŒduɻ)CߺuۇsLVtEL2<PժU3Y2f/X@\p|\ɟVUPA!Z}Ѿμ!e "lf'lܾ}@{aԷo_y!ol.Bd}W_w[%Jd}AO1B7|@Eyc>ǹm BXKiCVD^AѺ&K_hnW^y%*Dۗ C:ڸq3b}\ѣ)ȵgdV}~iG4)/g � � � � � � � � � � � � � � @> X-աu]6msV_%vu1DŽ6~޼yԪU+tMz'? ::#c֬Yj+V,ӉxZVVįɖDsږ_ydW sׅ׫VٓπV[#bVjpYͿ*UuӬ�8v]_@�@�@�@�,wn4H= gÏxG5nܸ,҂rM2Y}߂ ,k׮fe.]{ � __~>+;Å"df g !CsmP *aڵ.K/-H}w?)]i :u>cJf' 9cdC8OG^~,3aG 6teȐ@,>sG/S߳gv>Z)Mj}~ͭ\,.ӂ}~2h@AiČe � � � � � � � � � � � � � � @ݫz(;wׯ^zEM6^@A> }DH׿X'6X p :bCތhl_FmɯyԶ>;ev-tի5f;?> - KPBa9@ [DUxClg@�@�@�@�@ &EK"Eԩn;V?tgjʿoS'tR%Kތ>,ffծ][M4}F)S&,$,\r{2{;4e˖邚[nE˗/wZ_}Ao5c =#s=W<իWǕ;~Rk{pm5k9shҥz<5qYP&ow /{7ڪ5k,c3[nZ`.<YT@%X#=^b~??m}.9bϪlٲ\i c>}?^&O P@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� (QE(-믿W_}U>֭ݻuY*^x*5vSOr*uej$md*U6Ѫ#1>?c1NeىDr9Ç]='>7|+G?龷# �9rԅtMG�@�@�@�@�OP"Ν;jСjݺ i߾}\Xӿ/M:U򋻩ݹsg 8PmڴIVC =ƍ炫,@jժqծN ЬY+<,p!uۧ yhѢjذzBJ.vi=zh?ٵ3[o; Y$cIuV=5jhذaj۶m`>V/;^w6lʔ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�T(_~Ǝkɒ%4VCcǎСN>d.\8UHR}nV-]T%KW\z*`Ģi˗/״i駟ז-[du~u릋/XV1 �%`h5'b~"� � � � �9QUVi5j P;tEq3J=$w^wc<g³&Lx'ԪUnĉ]=pUWnS&M9 X?B E1ޢ_w>?n&:cc|$nzgMJ-ܢ|o%B O?>/zwlA}Q"E\4nOMLߧ1tgJK] ct1@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�(�իWr>cuVW_,/I^gyZh4 8.wiQ>P#'\d& ,ЬY??VwoΝuyQG.g,�y4)X'zV1VG�@�@�@�@�(@-˖-SO=7|SnOUTa@\ l߾}~y-\PݺuӽޫO?=;,8B,�lj׮ KtQG/4q+b 9r߯o%dǎ>|yt^\;=/n?Xzb:5>PݺuuwꫯVbb~<!Os+z" O_{MJ.z%"q � � � � � � � � � � � � � � �8|M>]3f̙3yfWkd/Uuֲ)-[I'E#�Z>VҼy4w\}嗚?٣e˺:wg}ڶmg?@ f&U$evɎ@�@�@�@�@�aƍ.ls5\ݻdɒb CO>믿qƹЩ}jW^\cnn:TFR2etW D mY/l٢w}YfaÆO3f_|4i⮉W^yW⸓Xo&׮] .@T.]TPm9Oԥ'S/S HK#F � � � � � � � � � � � � � � @B XBg֜9sk…*%JPӦMu)Wոqㄮ'G�ػw,Y 믿v/ *ܱc .jk%g@� Z?z'/<#� � � � �io O<Y#GUhQuU]v?|/X *O:U Ѳ ;ʂ.RF,'o+yf͚͊զMn ` lڴI닟~ ]kt}Âh~c35Ѿw_2 PP~f'x# K7~ԧf'OzJzaiRFx@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ۧEi{*TҤI A*]t7C�"Z!8hY/vߋVgʕ7ŊSFda<آE 7]L @,@;K: 7bW� � � � �D.@n۶5JSLq>m۶Un\Vzg _M0A|vl,gϞRJGnVTA닝:uR9$Z`&M$sQRܵ-/^<IZy3>ӧG7oVӦM\ JK`Ϟ=4qDW^ZjE{&~Y6&ӟ~uC@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�r/`T,Df…<xmp :餓BjըQ$Y?beVmٲe.@kҥ\p ZƍՒ Z / "y_oV-cD�@�@�@�@�Tȷ@p۷?Gi˖-FPΝձcGs9Zj*L#c[jƌ:u в+,>cݻwׅ^ʕ+xɴªU\?8k,C)-[tZ:tp>fƀ@^sf=hM6y7ʪ('S!D+3C/p}>pL-[V۷w}]vjҤ{(,m08kڴiwuꩧkE]f͚e~ߧI}zqs5koJ � � � � � � � � � � � � � � �Hj^X͒%K˵m6wGuԩµ,`˦k׮^RSt-A�TطoWc Ȳ,{ڽ{czl h 4Pɒ%S6#@|Ժ3I(� � � � �I'@p5 /5ydzdvnYgO?<*TPL#FnFΞ=|Zh{OU?묳R:' X?vǬ/Zъ+TX1jJg}+UnMDwj…/Z`uֹ<LuEw7nJLXz&Z_ 2 <c\?4C|Wd4nV¡̙Kq׮].hK"9~A@*>׿[np+%v@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�E`ͮΑZc5VZ^?X# زp5j 'X(c@?^?,&��@�IDATZO~z^r/hf آT4mDD?? � � � �+@EBXO3gjܹڳg*T},D mشiϟy湗mذAEU]pV۶me/0\nNjX%Kuia ǩ>:;`�!$}Cd!v۷wƐ33^`&Z(ō7;6nԨX:>'~_NmP0YHiv\`i29mis>yٚjZG � � � � � � � � � � � � � � �ܹS~؍k͚5@CRdȪUիM,S1 @X} [n]/ ڶm[˗լYlLͺ "Iɫc&T4f"� � � � @B xVz믿ٳ]DXTXQ'| Pq&M԰aC.]:f;Aۧ˗oB2žlZj^mڴqAOpC~7̙v#PBpfd/닍7VݺuUH[,;/oF-=xd 9g .\ ǚ;]j -Lо-Px<}Ѯv^T$)>?hϿ&.[LRٲeeAzh/UVMX6ߧԎ}4su?YNzyE�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ {X-{tPV cu8Ǖ+Wn/mF_1zWK?mذMؖ9x`�-,+<H٫QF(Dj0 �^&iX颋PA�@�@�@�@�[ 2Ui0{Yؖ.]p5k0 ^'x{ɼشi β, w}+W fW l:S\AXzu~h.pX? ׯrAL,_x?V6l֛b>_Mʮ6o˒%Kf]_ k-C!6s1xI'鋵kQGs%{nw K,,{  kEx"J> c\mߧ9?O u&/W?? � � � � � � � � � � � � � � �yطo֯_,'<'o/`w]Yuqǹm,p˟V_cYlj*CB\2!ZJWc� RǎwK>¼� � � � �ā@BjetAX…|.`f` 솳ԭ[WuQZd[nR3۵f͚4UVᅲwvl.eKҸqc%Jը ع�&6@&?4b}>y8$$1 :۸qc~?QA˻~臢)4 }ImRHZI_.)vD \-lC{ك#6X 'இA[=}{租~r}B]lya? QFjҤ.%%?P6}=KK7,)M.v?1 � � � � � � � � � � � � � � �+pa^OxMoٲ%TKo:cTB7ie󬞏*W\h)S cRm۶M[n=e7/o/ޮ]ҴjXllu~]rnE �M+G3ΐڶƌtyk#� � � � �H@p,@fڵ.l˂*9Yx̯ZB|,znlUTImvn1ഛ?su 裏v-~XB/\}ʕ+C$c}qϞ=[ 쓾/ p YP}7bx?~iA>6w=,P P3~eOѣc= n{PC5Ѿ;.~V/X"ئMiOl0; 6=h}t&�Oڃv>_㌶=zd@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H|a5\,\$ϳ `u^.Wv/*[l=UB-#Sn},kΝi^;vHo2zٲ6xd@8 ,Hg˦3rI�q$Dәg 3O  � � � � @B$]Vvv.`X8ݴ>|phSv#nYݜyM6nT*UKW% <솧˿qx6>o⛉4 `Еp2 dQ 1 XkY_PDg4|~$}`tXw޽{C}dxKi}т{ڴc>EY_02/Z?W͚5],^x8gٜ)SYԦZ^&!C ӬY_駟B}Y `6yv+Vt~MqA?bmk]}2h?-v,\pjL# ~4Ѻ%  's � � � � � � � � � � � � � � �B _Kϳp0$`u\wq/6muy&O[&{+V,͸dVWjXM[^Vj׮}z_'.|>KV6/χ}6+0Z^~]![@ i:!iƌ`VbE�@�@�@�@�TH@HN -^[lqctV7 *&Lvng ߰5:8oMO:<'nrZYP)6ʕ+DK>7nt}BmG ñP>~?=U?/Z_ΪY_h3 /ZeF'õ_:gõ.L^WVD>fD fBzI{8>Y YϨ/Z?˪/[?[fcQF}1k{4UIZGo]hQK>rtֶC&i,FoyDzlm@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ȳ-J,HX郖GV%<)mȪvSf~ЖmY}^~-'d/;i۶6ێ?v::n6ljXo~xxm+!VϫO5ի]*U_ruy=~hZVc?8@�RO+NՈfΔWO=Z� � � � �-@Vϟ0{Mg;frF d?nvԿUЈ燔X`WۍΣ>ڽ( `1~_?~Q_~U_g}{x.8/~h2/:6XFõƏ'yZ^C X }3~hAE{J o8lzzw<y49)>@C->MZxi` x8@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ՌhC߯i?pʯ?mc2 Q@ց%7qwTPCZnVƟՎkHe fum&OՕJelغUzi䅂Yi bE6 � c͛aZ&M.ծM � � � � Pj)�@�p>=\kn쳃ZRr򴕖$JJӜ.KڦҰ Iw)/Cp @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@`&R`XH۶,@myF^ԿtlJSȡ"�q!nԥk4maZqqR8@�@�@�@�ȕ�Zbc%@�>0Ҟ==tr咅kw\v[} VPg2EBW/i´rZd߇O=%m4 � � � � � � � � � � � � � � � P0 Z�u]wIիK0F�@ c+aZ%JH|µ#c%"� � � � @(gD�X´&M kM 'k ׺RcqzR ԧ77}Եt%kI ']iPNz嗥޽c|�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�D +I7J}J#ծ/@�fϖwjՒ>~0� � � � �*@D=s7 @%KJ=zHFIoK*HIUJ]jO<!uth4LHYn݂W_%L+!Ob];u_0L´q8 � � � � � � � � � � � � � � � %JHJ+WJCJSH' Z,iM@�r!0fԡԦ4}:aZ d@�@�@�@�CpH @2 *%)n0\7e[nT;O1BdVm$@V"<9sTHj: ,^,vfdamm%@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�:JB^~YF^E"K!�$@ =tR~ҸqRVZ� � � � �'@VsZ�čt Z&,)  U,]p4ruk2jOfϟ ;jV5J*Z4Ck1c6mU/6@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�"{K}'Vpܬt%a@�H-;AZ=& * &)Z@�@�@�@�[@>H2e?A;VWbŤZݺIm[4M2B&AsFY:tB; <(yԳtҴionz � � � � � � � � � � � � � � � �(U i`k- ."bk �)lԺ4}4yty � � � � Ǻ �"PtUK7J/$*$pTԽ{6@jeJ1`֩n+^<JlN6L9R>:4@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�J1]t4wZLg)u(MTM1 �aGKZIKK_}%u& � � � � @ D' �(Pt5õ^xA:tH/u[oI;v$ciS< g%iɒkKK%JVimt,ysifiOn!� � � � � � � � � � � � � � � �yI3gJSa*g%}Q-#�V`^馛+J1C:{C�@�@�@�@�b)@V, @ʗ}L >\ڷ/8R%KwޑvnXlʖI`Ŋ`V҄ RR#6wKHLٽ4Դi7"� � � � � � � � � � � � � � � �I)оҬYGK/j%$ei K[Ko%%YS4@�@�@�@�RX@>4Hd k>05th0Hk㎓.L=ZCPPeY |Լ5*YUM$)Ҽ@sJ|@#ҥ3_w@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�C3j̛'U.]rԬY0hG� z-[ʫ;%}t � � � � �!@VjgZ�$1H]'M,m =mtp-7fgOR3и T�StkHg |S>ZAG4;OKKcjҢER^y$+#� � � � � � � � � � � � � � � �ġ@ر҂RFzL6~58<` @ $ntyҠAwH3gJuf@�@�@�@�Hz@@ =VOZO?-k00Gڻ7\hm l9(vԡosQ r,0Բ3ה)R9 + � � � � � � � � � � � � � � � �$@Ӧ;H}'i#]wԠ H_4V>\zQhi<D�@�@�@�@�'@@��o>TZ^ߥ=%{+qJ@ FV SlW6ô:j E >>yj=ҝwJ[K#-X (*Ͳ2 � � � � � � � � � � � � � � � @ XȑRNICR)N#�I,nԽԧtUZAg i � � � � @T@�GR%馛i$aqwҾ}fZ[Bb {�"E,�pׯ_*46FI㏥M_ ^֍  � � � � � � � � � � � � � � � @ Ԯ-=jt]wI6vJp @ AK}'M ;,U*F@�@�@�@�@�\ k:VD�HT*U>֮Wi͚ջ4a.(B J>yԱt4eaPGʕKҢ l %{ԬxtRBQD�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H@ե!C~Z_ZoOq @ ,]*k'/'-\;!#� � � � �Q P+l @ VnE1C'GUݥʕ}IeoA UPɳ-[N={SBAN:I3GjղX@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�RV,@YSzA0 �D_`^顇fͤ;~Z*U*b � � � � @"  xC"8nj� @~ X֘1K_,]~ԱTX~m'J+R" [aZ7K}|s*R>XHPiӂ+WJw!w$@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ MJӥm#XE"ضMz9nYuD`!@�,&M ᇥ?Y^,WM@�@�@�@�@  \i0 �ptKK/U"]lERR'Vz$9ؾ]:<iFi`֒%K4eOX<U~AC![JO;@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�h +'=@҃J*ժ% $[=-@ VK]J*ytmi֧"� � � � @jE*r �)+PtҜ9݌isZС%<8Z0;ΝH? ӪS'!CT~}/Kc@ Lz԰a0q$iD^D�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ eHw{IV`V.6* @J - ,5j$-]*M,TzJrh@�@�@�@�@ ""bb!@�j;WZ*8=ԹTjaS 򻀅jutk>)|{ء[7i Ohٺu^ur-*T88xP6,SOI ]Kq� � � � � � � � � � � � � � � � u%?)Xo礏?Gz:V/@ c@@zMAiǂtxy"� � � � �.@L!� #:u,PkJ[9s㏗nY>]:|8Ge$x BFI{JݻKô6}/ .}>cF7nMKY� � � � � � � � � � � � � � � � Gir+/N:I`@�F`,Mwo۩0'E�@�@�@�@� PO� uJ+}u$jդ?'\+un@Vnw}K.JIzK6lZ-[7JI?ZzZ,B � � � � � � � � � � � � � � � �$PԧOśoJIMJ=za[@ .Vz:K*S&Rqqx � � � � 0j%̩@@�E~} Ko>LjV^]3@ QZqFKPhI&v.L=;ռy6?^k֬-ܒ J)9s+U(͟/TNJ1X@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�8(U1KZPz=ijE kg>6?䜓CJRD *I%Yװ EsUȂ$Q@QD䌤!U0 =3sʪuﯺfyi޼0,A�B,}RHM*Wi@�@�@�@�Hj%˰@�ClY[7ibiRsg8kՒ""'~pxZ B9rԪ7i?KzJ*u)>�Efͤե#Gᅲ&O: !"� � � � � � � � � � � � � � � �$Tͥ qݻ5z*If t}^%!}_sqh � � � � �D M �(WNz?%K,L륢EK~Z;vP>}tw -wߩXb.%$Z<|q**J?iZ3/Zf̘̓9sy]qg&1N$;c =-H&V"m .tS(F � � � � � � � � � � � � � � � @~G2MΊ̨U˯%|7nT޽ZJoY,޽n5lPv#Gq k׮ԣGYk8�%KVI< I2 � � � � RJ)Oq"�@ kI)ԡ4nT\O?U/3'Ok.}n|t n'_I ֭K /)~m8cJZ^\_s |6)xvlڵ߿/_DOw* ~4jpKh"� � � � � � � � � � � � � � � �~G,}SG4{5\0Tw?eBvP6}v͙3ǫeaA^ۧ5kgϞ.4iA:akYNjUPlkʕ/cgIJɅI;JW3޴� � � � �$Rf �a)PԽ\0d*mJGKժIŋK='sXv6m^}U|ٲe#<OxZ;wNn$T#QoDnu:Ν;5h =cJ*Uvp)|+W>.;NC|/RR*R &M!� � � � � � � � � � � � � � � �GQ 5.I&H H I͚IW_- &{%DkU\{J&Mooz5eom޼YFRt4sL/nuVlһ^PbԫW/߿;N x׿JPZJz)wn@�@�@�@�@�-@VEi@�K|7A+WJҺsuRɒ[֭S6me/u[HKmⒾP-%=|´,m`iH^7۷o_eȐ!z]3^%;e6̚%5j$]sa5iBL!� � � � � � � � � � � � � � � �IMĮ֯hFcu*TJNQB:_1HG3fj4mT 6xbo;d޽[<@tSٳg´Ν~-8; p7B֕V> ; � � � � @\i:1@�H|l% Z:TrsԳղ$骫sQҲeMhժ׉K7|obFizcupĉoemVڵu޾gmTJ=sʑ#?._|>@~,YW_}U'N(]t.t͜9S,-2eR] YI=#}[h~ $ � Lm>sOʚ5-w}7;vP^ɖ-:t=$ ܱglKǎ}{<<~!<ԿX_?|>#㏚0a*U{*K,:;u_j*Qx (P p{z7`�oWjռw+XgĈ6lI&jРR()0RҜ9RZr[Gv.!� � � � � � � � � � � � � � � �IH Pj:tȫ+QP!wstMJWAf\AѣG:E?WȂnϟ?&~Oo2ǫodlI*UO,ys_ƌ z[TXS2zhU\9p-\+yrNN\4h~l!� � � � �\@ K@�@ ZF.Ij\<*SFz%C߹O?Tk5CleCZn킽\[l2F @ڻd( ,~ * m`֭7 ­N/(}lR]۸qc/;з~I&yY_w³,',Dڱ0-[ZԬY37lC*XN 6կ_)qF^ؿomݺU5uMcZ.; rFZx{z�詧>}B~g~a׮]Z{#GqF%DuwZS~W<y ԩSNM>݅:/-pΎ٤`Ss,4lȑZ|.]1T4B"{mᇷ&(͞-GV"?n� � � � � � � � � � � � � � � �@ 2TW^yEVjPTݜp{W\!YWD7,u"*%}t622ҫzj+c5P`9_n߾}^}_~ūwkʔ)^@O@w}X*QD{[C3vp޹@V x1k)αE� ,>}d\)4Ws[e)eƸ@�@�@�@�@R_7" �$˩rASڵҼy~HM\Y".GKkնm[QEUϞ=u7jذa߿lREJ/^\7tw,duwz%HY�ٲh"(feAAc yٵe=,XMʮ!<bM6yg3gz[ϴiӼ`̙3M6^O bmM;ܠAլY3kԹsg︍,,˅j<=P>K}?/}Wˀsy]dė_~5i]gr:;e~f_|, S~ '&{5vؠS?ԥI {Wuf%wD'7ΛUƍH � � � � � � � � � � � � � � � @2T+zk;S'?ˏWZJreWrR{I\-Xjʖ-ׯUzUN8;Zp(gΜbu|SF_\{9YՄZ4O<Wo߾ݻ,SL.|u p^^A?.wCZB y@�@�@�@�@� iAm@�@ Ul}]?\kP_?{w?eK/G61ê^z6lYfiĈ{Y˕W^q۷eƍ&nDEEyg7dɒڻwwPB޶Yf^;^{9{䘾^_,jqK 0s2dMRHYdmذAk>3rHobbYX/cƌK?].LołxZx <ⲏϱnZ(7d,XP;wٳPZj)K,Zr71+);WY콲8^;eqM坲o]}nH/5nXW]uDŽx@;7Kԧt$8'b@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�Hs|RS;vL`~Gpk\C>Pկ˒yiKɕb5]Q:u9sYݡ oO?T V2e۱`.[L|jz7׎WDJԣGY׮]d㌹;vheA� -}_3Ȃx@.�Oݏ\� � � � � |oJ �$eWը'dZn^^{MPֲp+ZMp +V<Mui7$01cnJvϧ]ycuCyYl2jәܹs5zh/P˂bN|: X%Y8WcaZn۶撒6!\o <.Q[ݛoJ_|!9oMʑ#4eaX7|j.)o.[lޱjżC*)[+(6c /ЮiӦ_~z cwB(&-=,)Wu � � � � � � � � � � � � �.V��@�IDAT � � �8| I]jpP#seZ/ 䲨;㏻'Wcݺu:Rq,x*b@m0;wTR@ Ʒ&Qt_v2e,,oOZzW&fceKcf"ywƕs';8� � � � � 1 @�B!`Z_l ͚%#}TTr1.Wٳgb… u<0#s|Ȝ9"##e!@/k֬9T뮻N~ڄÇ&XH֧BεDEEzԦM?:t,X&<m۶qRXt( pfK<}g>7Ի?%-d7zm̭ޫNp?/R|l\'OV-T6['jՒVo׮^|1~B�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�R@is~Gk ~޼қoJHzJ#hQɂ\9{'LcǎźСC:z sUKɮe….ͥűħ~�W<Yf]} z @ӃY)XVeӦM *<>&d_xqi [7iz.aZa@�@�@�@�HD[#� j-%0c&-+]uԣj{RZ5Yc矽O5kПMXWYgҵkW<y2܏?>v,0˂Zn& iӦ4iu뭷gyFw=H_|N8QFdɒʚ5 _5;߾}{_ă+T|IWZW߽m6K^eʔ;)P.]uVjJ73gĝ={G*UJjRʝ[.xԲ .|@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ ^ n.;_'^%H)Kҗ_Jc![7}B )O<ڽ{}QTTWiS/w5ErBbo?~kŧ&Ν;aÆ?[~7uYƍ%?^Ç?8qb]`"""TzX�KVbE駟O?֮/)[6@�@�@�@�@�Ml � @Jpڵ?õ,F ҥ*UߖV[nSz1bDE6"o޼zcI6B{=o2eƍn`K U&mԯ__{#<6m}K*rˎ;!łrȡEz=vlb6Kdd)f֐!C;acqēW_V%wl:`lZ<Jqk!uO?-}lWywo?n:-[L/:;e_ O O wޙ -6I&UP gu<qͼ…^4VFn<_4 � � � � � � � � � � � � � � � @5ua}w&Ny̚U~ӣ4lT\}"?l+ޡO:uj#Y5\ o@M%kgƌZxx QFy!n竟KZpyW˲j*Wfe̘vyc};WѥjJ}ub~ҥK5ydfS,YN3)VZݗԑƎ, WW,0p@�@�@�@�@ RtK"� @\֍! *%-[J+v{?cFs-uQn0+WλЎY/R^uoMְ]vU͚5u{8[.5ܹsu]wEO԰`/ {cǎ�zeMN_lI壃XxϴiT`?vbe\ٳgʕ Ӳ>۸x6~Ӊ'c\*YLŎVe/[}{<{1gYpXwv-ڶm9szMZ3fw[n^ԸqԫW/VZU ޣGIWk׮ &mYxW4iԼys}'ʗ/__;ճgOٻ;"[eK߁|b kmLٳ&H]AcA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H?w_fpHM…!w$LMDx-&ڴI.lJ<J=@b=ݻww:@/ ITS'gY?~r-:.;vTՃR갔)Sƫk6m3v.Pagl͚5ՉaA�i.9jrGNgꋡ� � � � � TJ*O~"� �ǏKk)kh!|+oN,Y �*^= %֭sθ,�믿&(Q"z9Tdd7%]tv)ay|q`Y62vԩSq0%K*[&ey$0{ 8\^\/5jԐM2dO۷O*Ub6T)Ç1cF/(/}qN4>}1۷KK>* v|F�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�HhZO<Q۫CUJ8 c% (zԪԵ\К:HEQzD18_´6n(dUʕ9s(1XmۦX})U`2�<i�w^~NNK.@�@�@�@�Hj%ŧF@�H�,2mکpݻjդ@s(!qjq)B,WRҿ-u~7[`VYfVZ�ĉRr_RNCM h@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@"NԺfZ2$ttK/IW] @'OJ&I_;dIǥYUN"� � � � �@0]C�@�DHVj@ i6?\\9?8hQfMM)o%=@0!ҽJ>{qaZ6^zIWWtVGD ۤ iC  � � � � � � � � � � � � � � � �!&tҷJWKW_-5n,͟8�I^ 2j8IeJIGHFI˗K=FV �@�@�@�@�R@nI � � @,͛7kڴi:uDjV,>TTI[\z̞MÆ 7{|#FHZI>*Yp[]SQLws^O.wSʔ)(i$ϥ1cΝ[( � � � � � � � � � � � � � � � @sʗ֒o3.jӠAԻw.>[?knl9@XT#i@*kׂP!I#� � � � �&@i |D�@�3-[kM2E3g޽{fͦrjĉZʖj֔Wr<z$-ܒ ۳g4i~ urjN['yXҝwJ>OXkF)k֬AڵR~җ_Jh5cƠފ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�B$qED|W_ MA,󂵆CH-['mPEW\!uTR8Vh08~\=ZittiG9¤t@�@�@�@�@ j@�HQQQZ`Ml͝;WGqAZTd]_O &PZR˖~PM&!GxإnZMVTX'dR޽&N6:tRJyIuOF\.ѽJ'*TGE@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�+c?4cTvu`q ٳGgiҥ.L:NVժYԭtq 7J}mRFR.RÆ 'D/@�@�@�@�@� :[ZF�@ E:tH?e![-rNµUtzu]US7ݔ!:\+_AAZ?? DVԧN7 1C tg/"#0OfK679@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@� P+f͚>}hJ6kk;몫*kW; I$'ɓO?ƎOY*Z4 � � � � �G@�q@�.L`׮]>}5ե_J>rAvSTT]uZJ;潰Lnݺ7PT=\֋jItIGf̐nMj\0@J!ؾ]+?Hk+vC|sG�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�H9Yvy>ʕ+]POMW!-B/Q[Ki$!3֭rԷzTC~]tIft@�@�@�@�@ Hj f@�@ nuyZӦMӴiӵ}6KkPO5jӽŠ䉻 _?֣>.|M @::sH Z3`t#wg'JYȅAZի'R- � � � � � � � � � � � � � � � @ moɓ>}飑#G)u:v^ED<W^BHJ D8qB<ѲAٲIK>(/ݣ � � � � �(@V"sk@�RM$Yd5i4͘1SGw E*U=]ye]uXlP\)M;l0nV'Nܡ/:uJ鍦ϗnžՓҦMa:ٳ-׾} 1͛K2i � � � � � � � � � � � � � � � % uɄ4mۦ~Oj5Rm^~^2�شIKϥuox@.)c`ߍ@�@�@�@�@��ZIg@�c4ߥ?M#FLՊu17+UX=5kVOO?}""%~6lGwQ_P[WUK)Kw1P\) $ (^-U$YV6R#m"� � � � � � � � � � � � � � � ��ZDvN8ɓ'zkԱRneQ?v-̙=-ʍi�;iD)W.C?HlG�@�@�@�@�7@�R?tr=MsLUdbI. l)5m*ȑ9_U7H^?Gor ,Z$թ#U&%eȀKb l* i-Xg}Urb#� � � � � � � � � � � � � � � �$�Z -ri&}s߿Qs:Z>M]PڔH!ZJ;wJ"u$5k&O � � � � @ P+Y>V� @XjLIskdL  jDʞ=y3XzIIzMks% i;Vʘ1 1 h>iH?Dk4)Kys{4iP( � � � � � � � � � � � � � � � @ 2(͝!W_T:>y]s�ػW2Қ?_*^\Q^)"&@�@�@�@�@�/@@�@`ihiP-)ujaC?\qc)[0duaTm۬_nݮ;wJyy*QڴR֬g?nʕ q2g>Vao@37L!ZpZZG�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�U'}NQ*UtFQ^q9m0_炴j.(]HO=%wap5U iTi(I;nY..q!� � � � �B@P& �T`n-\,teKBwd T,kݺzQzm7 2r?1g )}'J'J'KٳʕRRN]^0C,D&8? 7m!� � � � � � � � � � � � � � � �$ vҤ9{-ХR%iѢ_.EB>Xz=NCI>+,x)]e' (m$ը!{Ԫ#G=G�@�@�@�@�H\ן#� % %Y(kM.K'zuR̗xdGrZltJ}Rbn-ZHQQR>҃&cT)]}{əSZp*\̠s4ǩK̙h .YH^Ro bW@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�d(0qԨѹfa[#=,*p_w%ԩR"2G v  ϗ""ҥÿ@�@�@�@�@  gD@�@ }*\ nõl)S<J8qBU>_~)Vl´l_.]+٤%= 6T4pԤ/4ud[,h &!mYVVRѢ/"� � � � � � � � � � � � � � � �$}!{},RI7J  L#G~=͛P_J ]h 1W_IKK͛!ZuHS'~ � � � � @ P+<KF� �1vC{fΔ2fn׺VsS̮MWapXl2؀R۶#kk""[OBg f͒r>u7ʕE t܇V@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@.~cԬ)Ù8@79p[Қ5wKT\LNIilm5"#uv;d ݽi@�@�@�@�@ e ?G�@ ElX'e,5n4lµFKj,)X!~r[,,{%sPE9sbab,l oQmۤJeKB.֕!� � � � � � � � � � � � � � � �)]jpC ջq( !%}ԣltR׮R qw@p,u߯hi#,{  � � � � � P\:C�@�d'upٳ,Y&M .nPey0-$tsBlNrZ,DlYiժ3lP- [+T(9<r4en-%]}[\2 � � � � � � � � � � � � � � � � <HҖ-g/Mi)W3qқoJIK/$U=~O, n ibHukm[bU � � � � �K@`I �$9͛Ok͙#e&5mkկ/O!=T#NB^0- +_ޟ̐} ƌCu ղrv纒swhXi>]wIw!(- � � � � � � � � � � � � � � � �xcNgaZV/fSC \6KO?nݤnя,Ұaʝ[jBjJu; � � � � @b @�F`&oCs9Nkr.ٻz℔/k?o_)s_g֭*U"#wg֨QM WU*-\(s:bZQQsIo}8sd,md˝w!ZA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�K+ǾX Lֱ p2vm饗z©%%i4)}z֖h5hpZ[)1"� � � � ��Z � µϗr攚5Z=^S3*%oeX;vH/%=*?wҤT~)IRZgu H^{M*_צ3>O5K23{74O2@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ 1JV:u ]̙Ocp.o!YV~mkoWr8pe!Z'#, !BY$Q2@�@�@�@�@�$:9 � �zJ;WZVUQ#ˤ&O>J5dȩ- VW]%|=M_g,<%*JZ@13IM�ӗtT$ Ҳg;laZ1~M]ZHUiTc@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ !TM-Ҽ9aZ =#p~yyoTFN<=}TڲqE8tMj%YvÇ޽mXwMV0z@�@�@�@�@ |RtKv!� �#`Z4tdMciaM^xAP«b#a?8Olxmi.ĉSIb7 }cIqob= - =,Vl)̜)}?e:P!qc~uJӧTƍ� � � � � � � � � � � � � � � � NWK%KرmII`"Fj//u*lw͢ե%ٳHk,Dk&]<xP�֭;kf� � � � � @0 "m � @IUҪUg~~8շJ:sԯҖ-~/qIժ%V.㇟YXT HˎYVҗ~Roai$?Dkx>_ye!Z^+Y0  � � � � � � � � � � � � � � � �&p5/HٳK >.D`RА!~`֋/JIiӞj[ɓ0EZ]v<{)OjHYСR DV-?B Hy&@�@�@�@�@ !#@�@�DxAرw&#%U~ פk4j$YRR\֭'8!YY۶RnRRIq4ʕ1c~۽?DI,xw%@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�B#Ы䓒'4UC`*魷…矗:vSS=FŊZ&rI {!ZÇjB-BR¯1"� � � � �[@| �P *ڻ7PT$ե+>n?tbv]GՑ#GÇj͚kt]ڿ?B^{2dXÎEǏޏrpUۓ'OV[1J`km4i\ Vj65Փ.]:ovڼ4MˏP{82ZӧOL2)cƌkX,Ys͜9w/),QiƎ/r,,mΜIa$@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ 9 X 6hvƍڹsvڥݻw{[]rjjq5I!#VO$PS$wܮF.o}[ t"E(""[sȑIS2XNSOʛWʗOZD2BC jm۶M\익u֭ji`0A4͚5~Sww֢EPB^Ѝ,[v^ o&NjՒz@�@�@�@�@BԺP1G�@�2E_9[sX'ץqٳ[m?u߾} "\M@s-�"elbəaSĕ\u5CUm\!W1Xg ׊klA]Ю^ЯS n\a1Cbپ҂l"Nlbv,{1ڤ9[sԪ~M3`/;vH&HK&eƍnoJ{ � � � � � � � � � � � � � � � �]w.]Z|]pP>/`'e['߷oM=\u*jX=a\o!]eu\)]ʕ+j^K,)‚@8l,4p`ܽP%P- b}?%.k͚5^=# ®baپ i ;꽓¸lk!]gbߵp *ZIuq;BN$թh5k懬%ױ3.@�@�@�@�@�-@V~@�.A`,7-'u䩭Cy]MkKn]]?6Q$fR ,YVlX @+=?oYq6A 6;}& G L̉yW ghl^m޼ys͓'&wb.i8?Dk�$ծ-zUTo� � � � � � � � � � � � � � � � @٣;vx7˼�+ XbVq!ecL Z.kj!_˖-{Yؗ1VSjբ \}` }4|\x\ܭZ~% ;wnO?y5wҤIºJDX-[VE­ ., r¥GmٲE֭Օ+WF{XBea]UTQ5W KʋӨQȑҬY{鮻&Mj%w@�@�@�@�@�'@V @�R*لuVo_(22 ^&WtBQ֌*kLޚ-[\ Rfo͟?j:)̙3:D+k֬%#`\el{nڵܷc6v&\2f(`?~)9s>ѡC9~]s6թsXݖAJ]~sYc~}@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�.p̥Xɓ5e^ ީZjZbEJ;8kYP`]|U|yկ_ܢڵk+K,A+ pnU2e~BJC=Ǐى'_Bwի{T>C n,Z-`˂͛eŊ~5l[]͔)S"nxZI*5ooe@�@�@�@�@�.@VR@�.J֯_7zMbo޼ ?ٸ]vejaFqS<y50aA,L+fV -vZn"4{o`UpaosH"W@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�RO7NCդI~/^ W:eYw^͙3GSNV I>7-[^>N;JI.<*]reb-|gw_Ǝ+m(Q kРΕ+W$7ɂf̘Ժuk5m4l,͂FF \*5ih?.,)W@�@�@�@�@�+@Vp=i @�D`ΝZfV^֭}E4s*TPtjADZ ,pamݺU[lZXkddd02eʤ-Z[-d&'d'[`A�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@3fi=z ;հaCVErWSLш#4qDI:ud=ZղaA XlJt$ b:_j)j-͛7Oõ{nU^]w]t<&LBM5nX:t^J*AG\jt?D͛b䂾nҤI.q3@�@�@�@�@�V@}4t @�'`V\X":@+d,9`AdA1\rVG Y X܆ {[lsk׮ƍ$*7-6Iޟ%KtұV{zbPz @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�HVo߾e!5 eQ͚5S|B{bCƬNGC|)(Hib0Jh:KҦM+#Xe[ V޼w߾WJԶm[オK)m�Ai֬Y^-GyD:uRΜ9CƱg4~岽UeAZ+4� � � � � @ P+I?>:� @8~/矱˗lL2yJ*%[K(ŋ{he̘1C1B(`mq,`kAjժ5Xgl+W.ZlYeȐ!=)@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�XdwÇ{Y;vwI辄o߮{cVBǺu릛n)ܻN,tkժ2e~}/i]jԨzeptR}e3:Ν;^Pr+cٳTڵOhED64� � � � � @ P+Y?^� @زe~7-^8z #G(u*V YXO`kZ rܬH;vxZlge˼;4ixA[+VTJZ  � � � � � � � � � � � � � � � @x X _]#GԕW^_|Q-ZPڴiûaл'Ojԩѣf̘oQ/֭ UСCOԳgO>|X>z)υFI%ב_;ڷogKy习Fׂ,D֕+ܹB̤o9r\P\� � � � � @ P+�@�@ q6lؠYKuV/Bwl"*T!C,wE�x w{,Tkɒ%?t|\Μ9UJkQ2e6!� � � � � � � � � � � � � � � �V`˖-^xրtתk׮jҤW&wNϙ3Go&L S`U K.ڱc{1=3 h[Y޽0cǎ:utο{vɽرĉҞ=Rr~VR͚R4a08� � � � � @ P+>8� @R8|~'͝;W͛7{Y*UUW]Y&W8#G#+��@�IDATE)ڿrέUZj^ TSٳg?OF�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ɓ'駟zaZٲee`5ۙ>}q{UqMBBOBQtQ(E.xћ( BIHf Z3s},r9v옼2dS{'�T/_6߫yI6m믿ٳ?UI[n,Ǐ75pNOH?)YD~!Zd剫H *P:= � � � � �<�ZO+ � ݻwe˖-o]$88XJ(as*U$ix#s�_ ,,LY%t= 2eHY0TCj֬)2dp~f� � � � � � � � � � � � � � � �<ҥlڴI/ԩS?8-CBBdҤI7o޼2{l)UsO9L`kL2E֭{%/ѣ߿_}wܻi<)1H&" xz&5� � � � �  P8s@�Z <<YF֭['񇸹TVMVj^{{{;C� ҿ!ܹ#ʕzM{:gF�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�T@Cڶm+ӧYfI qٳgsΦ^ԩSW_u.Æ 3AxǏ4i8|BCCeĈ2|BKnYYd "}x �@�@�@�@�@� P1D�@1|Z,[L]&+WuJZ/H)sszE�$! #7n˖-[$yҰaCiҤ4jHҥK$,$ � � � � � � � � � � � � � � � `O3fHݥEcO8Қ QFMpO1ߛnݺ'J=PqU]R|yYxxzz:t� � � � � �*@@�@PP^ZΝ+K.iܸJ%}@�wlذAV\i=ڵM0qA9@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�I䭷2N#FH ajI{q%!1*&:u%KȢEL͕:TA'OYf 5n 3!@�@�@�@�@�(@VB|* @�&'|̜9ӌuҢE Y$K, @R]vɂ _~WJ۶m{# � � � � � � � � � � � � � � � s1<#G h8R6mdB}mwyGM&+W4uina.ǎ^zIʖ-+˖-770lƈ� � � � � @ P+>:� ֬Y#G͛7+";w_~Ys�S@õl"3f0Z ODNC�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ؽ{TZU'EKZ3^sJ۶mƠE9s~/ҪU36={H5o߾g%3_@�@�@�@�@��Zϔ!� 84Hkr9ٳGrȑ8(@ I ܼyS;0aq1btQ\\\ G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�-p})U,XPVX!I$_L>]:$rJ`c8K… RX1S/x^H :v]lb - G�@�@�@�@�@ C�@Y 9sFz%;wK߾}%M4rq+<<\ԩ#)S˗yObUVaWY6Ϥ?],l2UZU>grߘnyfYty~~~1fL׮]+,,Y"Ǐ'|)۷oERH!7-Z$X`O> 2ȴiӤbŊ̌C � � � � � � � � � � � � � � � 2D&L lٲ91 6رcܹsҰaCyWx\I,X`8FÇL2RdISAp I kN+ɓ'INZkB\2 5ug"ᅯ\tIۗ`kat� � � � � sH\@�@ hhi@αc$cƌ fl 3;<<<D_~׺Hĉ2sL7 &~S @nj|||.屮d t:ծHoi$OrM\c ͛˵kdrܹ߿_swww޽tIF!5jԐ>@s � � � � � � � � � � � � � � � e̘1aZ}h0/,)R#G/gcɒ%:ZQMÒKiܸ )WnEDȑ#/ȼyӊi wyβ=uݺuo/ҥKŋMMtJ' � � � � � I&PD5o@�@ |G&LKC4T(i?~\tdz£]Jmn˗7H: uo#uԱ{X.]L2ӹwM-Xv@ _^ çvԳ*SFիL92eJOe7HvDh � � � � � � � � � � � � � � � @R1cҧO2X"F'OʢEd۶mңGs̚5+Z!|I1GhԨ*UJ&Nw"6m˗OH(ҥK[Ξ=]pI<DԩSJNG�@�@�@�@�@� _)C�@IK0a i֬Y.\|cM,snnYl7nX<Ncuq s:tءex6&*[l!dڦLbJJ*Ν;eǎһw=V� � � � � � � � � � � � � � � �S`ҲeKI:=M}]rEF!9s挘C۶mk 0"ŋ[ܹ,^X4̋{5h\\\6D<f矛1ۓ%Kɝ;ȑ#W>);v۷B�@�@�@�@�@�X# ")! �$p!D<+W.e2|�7oʲed…2vX _5 >Sɚ5:u5$$,i׮iFdذaCٳ4lP<x`Bƶo.zҥKo-ٳgB2da_F2^zՌ?iJ.]=(\xь~GMRƌ8oݺ%K.yW_}%?]֌Wǥ㷚gȑuVqww<ylܸqyf9vT\'M4Mܺvj>vu YF/|Yb׽Yh PqK4ib]n6moVN>m׮]{d.*M/_^}2♙3gJ)_m;ӛϛkȓQ_|!'OZj @۳m1:SuF jb @b߰P4nX7onM= � � � � � � � � � � � � � � � AAAǛoV"͚5v~5k+W.S ZVNƌ#ǏZ!Y1MXv[ԤhРAL=Zcr)Q3'7Ix.]3gHڵ>}?l͛WΝkXt["3qDSu&Oi%m}_|ѼֺPZIDi-W^yElg0϶mL]=M-[6=zt)+c6O:u#D�@�@�@�@�@�h\=A@�HӦM2eHӦM|5DIڷooB͸'Md4@~APw5Lݻw7BΝ;k´EP(}aZׯ_7R+W?H͙3,. JJ4UV2bs5 4&piu1 VD["EL.-m3!X:& E%:moߖի_?�( f?Ȍ3²>}c믛)s~ yt>c z7⼗>'gɒ%g4j: kt9sfxA]uڶlR>sR Y۰aСCE1 oر ZnL?zkt!Z͝; Am^1=;wΜ 6uE�+4^",AC�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�]@h™bmSqZcK/+ ڵӥKiҤ%ӢE SKeղk׮~ϟ7?>3ׯ؝ŋlkر{J$Ǐ7#HlZIkh]aÆK)S4w $ovbCu*Vh4Nqyyyc~~~昆]i &և:z>||#8^dɒҿBk{q5kV'N<y'\� � � � � �1 #  � 2L3edʗ/iVլY3slf*-[Dԩ#gϞ;wFׅWCu#*UJVjn޼i4<ȶi^o>s.Y[)m6X tjΜ9%cƌƎ+>>>)SDtኆPi.^6zhٳg|f1.ڵ&LEX.\Xta6 J6 ҹ{mѰ7 g Vl⺗.n 3OF,x 4 w7n,5]3`�Ÿ)4xKHCtA3g4ߺuKt)YlYD~gjkРkoҥh:뱸ݳk&qAv)jD(AX ` � � � � � � � � � � � � � � � Z_mSS펓'Oʻ+:u2^cԨQC͛gj̞=n|4\K~hVӦMkZԺuk5kN_?V>Y륤JJf/qhMmjPW_}eB{ ۾}HBυ $:Dځf:)[w*nnn j8#RGɟ?_,X gΜ=z;u."� � � � �$uVO @�$*U.]JtO<#c}4$jbӦMCy뭷d2uT\YСKHX?d˖M4PjիWԩS.Ұ-@Ν;7n4T5oߖE)pC:(P,xYa{6%5}t?ydɑ# Ȳt16up(Ohx[k۬#ZLە,Y<3\uޯyN;v vy駟BZj[,+]ϫyh8>?kKg4,M_cq >\t\Qs\󲮵&>󰮋ie>Il*15ѿ4@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@.C1ԶFǽ{/XmkذlٲE.\(X6ksXz]P!$"C #GʠAߖdɞO>rp X_Vm%{MҪUTt鈺C 6mژ;!kL;?ʕcJ&M"j$G\G\]=Z֭['*Tz]ۻ]E' � � � � �8?uN4@�H]vriunnnQr咹sW_}%|Ӝ`¡�!b]TJٰa;v,Ri]6iӅRuc{ݼyStnRZHc—~9sf6l ׯhH4e]l{j-.^-.WsJ___Yl5t9|y?cBdѣ)wtWWW6yѽhY Ӛ8qt)x6/Bk3뺘Vܝ;w9ECҥK'Yf}䳄z@fϞ-}ICd\ � � � � � � � � � � � � � � � N"Eح_(>-b'N1Z[XNϟէ&}l޼Ym&'OuΝP[\s h$mZJ<f7S(qmV6m$?4mTׯ/&Mx>С ߲#jM'99� � � � � @Ro @R` �$af͚IݺuE4d&)4]�իW/ ӦMKJǎu.npႜ={6G9,YD: 5UV&0UT]C{+W";. B 1}#>񖺘JV2b]t1ANQ/ mzsϽϟ/ 6nݺ4 mmݺpz[nE7>.2zڦ>>>~7z/6f׼l< .ltQm WJ%l'{x[%28@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@Zg@xأE{gʔ#}SH'=ի֧=:owww)]]E!P`A4ojFG1zECBBBᅲs՚5ku2GƓ5kVQqvaj;/_޺%{@�@�@�@�@��ZvĤ+@�̙3,^�6'-yxx/fvʖ-kܲeKw-)SPɆ*6Ծ}{c"4iȼyd߾}fDΝܹsz!_4tI[xx6nh>nԨ̙SҧO/bD… MVz=]b]kϹZi{5ʌm۶+,ΚXlڵnA"?> uOFC{=ɜ9̞=[;sŋP,F}6GlD4믿L8%} ۶m,YDRN@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�#Z-J*Pt__|1%v{sN]cN#}N5k|cx!s4Mk�i=g6m$sRJZʌAiZȪG ѪIdy7Mjo͛QGGZOJK9s)Vɓ' � � � � �I^@$��@ xyyPX"XRTVЏ⊳gϚFnٳgϾ+J4~xyL?PҥKg]v~C 1 ?tH^L0.۷ vz饗dذa}W^]'*Utԯ_|A`˗/7cqҥK#B$}MRhQڵ9b.^9p|'9[."\lܹ>H+AAAh"sMMȔ@M>]N8a?ތ .cf2|8p^i믿n4XLMt3gΔ۷˽{/4RiӦ O2E#:twU0'i?sD@.:VjUWcm{075/=?^\jUFq1cD ꢥ#>>>wϹ` }Ȍ@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�9v올\n}jG=z􈳶EL5:b:u8֭+Z6LHkd̘ {t~Wz#ZSdܸqbզY~M>rU:tɓlٲz1vnk&7nÇ;d6l;w5ʕ+4cC /ٳMɓ'ˈ#u=ֺM2asL^M%;^?̅n^h=)'ҥK2qDϥp±\diͩYf> � � � � �8F@-Ǹ+ �J@w~WmJ˖-➄6 ]XԪU+믿:v(3zh5 I4(K.i.Fr=lWtY0 =|0"Jp͛7Kٲe肨"EȶmL.&pҿ)Y >ܜJ]tһwoiР/_ބs"(]a5 E#<yrn>0,UW<y̢_^=Ee`L1vX`ХM6&tLr!)V]ڽ{w9~k.]S#GcꠋUtsʒ%L6l?͛WV^mƫsZv1E/j5gWW `*=_4sp^ra~/o>]Pc-3.y6cglŋKҥ[�/yuQ~c^.k֬1niذڪWBm}ߺ:7nXv!9sLe\ � � � � � � � � � � � � � � � C+"~adȐ!Z&1ƥuVڵk':u2u9:t`jlٲE}&hH:$}ui)R;cTVv9pΝ;R4?zPuQ#ޫ`Ǝ#%u4|j{L26@W_}+>uRJeh({Z||g)S&ɖ-\vFҚH-Z0U!ufM\?3iS#i{3F.wMLC�@�@�@�@�@�܃^@�@  h�СCe̙&ދJDӈPuEƌ=WÎ4&(uўCý (`_ r2aVEXMÂtA>?L~邑ZPP\pAgE!}5n2YQ߫.JI>uk:Ml ݬyiO2eEzH̙#}ej?~t 3 {vEw`*=ٳggWtƞPt=bL4nԩ&8nԨQ&!7S@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ hRJɠAcrArRٴH<==pBiٲ (_E'n:pEIf2ݻwKJDCF)/_6AnVۛD;55itM7< Ӛ5{zڿzӧEie;^ߣ *1@�@�@�@�@��ZI3_@�)pQ/ʕ+K>}̂ ]@{z#FŋcHZmܸ1s@+W< eG|3pkʔ)SL&>2>C�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�_~j*[;8v옩Ӿ}{<y=&tݺu3Z{쑼y>]g\m5iҤo]_w,URńi](77gq[� � � � � @H$gͤ@�@ N"E7|#HH^zI֭CRF ~1ШQ#)Zh'Iʔ)c@ŋ .PswB{օ^sΕٳgKPPtY:$ t!� � � � � � � � � � � � � � � �IVߖ;wJ˖-Eaʗ/T4h@J(!cƌqd#0n8ٻw~?UǶ#^ej^u+u]>6n޼)k֬]T@�@�@�@�@�\i1' � dڵ2k,Yd$O\6m*͚5ڵkKTzҵkW&bWtF-p..?ߡ ʥKaÆұcG � � � � � � � � � � � � � � � @" 25o.+W*U$ҙ$a9sF֭+)SM6I C.^(իWoooSI+V~޵mVF%3gvȸӇ:otÆ ND ψ9 � � � � �8�ZL �xXB4Fݓ^zI|}}%J +pH)Rh8Sd ֭['7on6///g*@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�.`ĬYFf̘![v=Ad 4k̙֬eʔ) C թSG%Kf3rFovnMCh ܸqԷٿ1D"� � � � � ]Բ+'!� 4f֭l2R3J͚5VZRZ5р-WWפÌ@N8alܸQt;w(P@ի'52 RLD}s � � � � � � � � � � � � � � � Hhh{2vXׯ9R<<<q@xx7N  2gI:J"peiҤ<yRf͚%/L-c߾}ҲeK 3J,Ȁ@�@�@�@�@�pV2/@�+Wdݺu~zٲeYx%>>>/J*UbŊ!C4Bn� IΝ;w^ٱcf lٲI5v&H+_| i،@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�p  tݻɓGOnj8$N>-=zM6e�GʐO>?[o%}lv|`!!!W_ɐ!CzO?ILxB�@�@�@�@�@�ԊK@�@~3寿`ɟ?TTI*T e˖5Hnݒ˟){]vKbL^jLV|  � � � � � � � � � � � � � � � gΜ7xC6ol~)2v|3G_|hM BX@WIQ@+)R1cH˖-"]uVVvq6l_\]]z:C�@�@�@�@�@�Ԋۈ3@�@<0A:;v0a:{]<:ٳg7ZK%JHɒ%hѢf@W `>t<xP8`BN>m~s˛}UTʕ+GE � � � � � � � � � � � � � � � � hEk|G&X&M4]gˬY?ׯˠAL@{,W / 40mʕi4TPfΜ)חI&IA�@�@�@�@�@�$@s � ?۷o}MܻwOܤ@Rxq)R Ґ-}.]u+xwޕGOt;ry$xO. 2<rC@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�ѣeܸq,Y2ywo߾Ŝa4lҥK믛Plٲ!Cl"رC6mjokMAZdƌ7o^uq_ � � � � � PK � aaarɈp- {߿o͔),Xl x?~{"p-9}8qB?nZ7 7Y,V4�TR&NCh � � � � � � � � � � � � � � � �Kƍ2vXJǎGBHOԩSߚ07oJ׮]e+W/(|r:tݻWׯ/}ƍ�ɓ'˂ $gΜ2dܹ3N2@�@�@�@�@�' PI$@�@ hxϙ3gѣ&رcfA?gϞ]|-mڴ7o^ɗ/_Ė;wn6 !.;w\Ħ/ вׯ&ɑ#hpn 6"EH$Ydp"� � � � � � � � � � � � � � � �8-3f̐)Sȑ#GbŊҭ[7iٲd̘fӹ{,[L;YndϞ]wn6}MCY hUV^4 SN&ӳOBիW6:$>>>[oI6m= q � � � � � ?j5@�@� 2ZtԩMkV```\SHaµr%Cn3g77kx@bЅM׮]/Fi<yG)S8 � � � � � � � � � � � � � � � �IK`2uTYd<|Pj֬)Z-ZjI*Mu2|X,3EM4fMR"$y8qB&M$?ESJi۶ zKnܸ! .4AZ6l4HB >}� � � � � @ P+>:� �+p]! ײ.\0aCΝ;jVL$k֬-[H{]eeȐA\]]#А,]ir\tI._cj"gins6hkooot � � � � � � � � � � � � � � � �D+u\/_.X„k+WN֭kjժֺp*v풵kʺud۶mu@jժe7o.Z@B 1ݟ~I/^, WLiР٪V* uWXXٳGV^m۷;___i߾4nXRJ8@�@�@�@�@��Zǝ"� @Eõ#‰44H<ۦaZI2fh^u%]tf^;/[^-d±4 ڮ_.׮]H{=իWE'ٶ4iҘp7+MlgnHC�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@~zYf :v Ӫ\VJϝ;=oоΝ;eǎf<Zo&GR^=i!Z} t Ȇ dժUf;~NZ^xmb~߹sDŽoT]hÆ At� � � � � � P� �N/aH&\KB(+6I_k`Rhh#.Z)iӦq(ɓ'o8F 88Xt!۷ct͛7b8}mmzLGbAlV0ϒ% ʜ9٧J*j7G�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@={lm۶R:tHDkf*UJ+fŋKѢE2n5@Ȕkl��"IDAT#E砭`&XHj׮-:f&p)uV'_dI)QDVpa 揎SnպNv`/ԩSGJ.@�@�@�@�@�@j@�@�֭[f#ua]S&uӰ)SE(iW#☻Ĵ%KWӦQ1md&Mn8.tMm׶>ۃz{Ml7?iҤ1ghk+4Mҥ3aj{=SG�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@ Q ܹsGv-{1A8saSE'Pr)r2edjsКZڬ(V1Z!V۵k… rMXcp/ ЬKʕ%C sA ) oEk~2wqSG2g,sزgn~+5}vNm{~^{._,Ν.]d6O޼yM}-[i � � � � �8�Z,  �8>YZ^YaO�eQQC}Ԑ)]dUt!mP""EX4,jHVpVڴiM8 @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�bx=z؆\@Qi ɑ#GDhiOBL@'!@ZرcrI9{Z+W0,+.wTh WЮ<yH|L5~gY � � � � �$fc � 4PK"H[HHH{}ƴIxxxĶB377-dɒ.Z-=NC�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�#p=u s玩{5QMhm1bmZDwҥKgyҤIx&HHZHׯ_[nEad2:@[ߩM6jV�CG�@�@�@�@�@�{ e/IA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�x"'@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@��Zv@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�' Pܸ @�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@N& ����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/libllhttp.pc.in���������������������������������������������������������0000644�0001751�0000177�00000000465�14607525267�020363� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=@CMAKE_INSTALL_PREFIX@ libdir=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@ includedir=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@ Name: libllhttp Description: Node.js llhttp Library Version: @PROJECT_VERSION@ Libs: -L${libdir} -lllhttp Cflags: -I${includedir}�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/package-lock.json�������������������������������������������������������0000644�0001751�0000177�00000265734�14607525267�020664� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "llhttp", "version": "9.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "llhttp", "version": "9.2.1", "license": "MIT", "dependencies": { "llparse": "^7.1.1" }, "devDependencies": { "@stylistic/eslint-plugin": "^1.5.4", "@types/node": "^20.11.10", "@typescript-eslint/eslint-plugin": "^7.0.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.56.0", "llparse-dot": "^1.0.1", "llparse-test-fixture": "^5.0.1", "mdgator": "^1.1.2", "ts-node": "^10.9.2", "typescript": "^5.3.3" } }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, "engines": { "node": ">=12" } }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { "version": "4.10.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, "node_modules/@eslint/eslintrc/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/@eslint/js": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "engines": { "node": ">=12.22" }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { "node": ">= 8" } }, "node_modules/@stylistic/eslint-plugin": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-1.6.3.tgz", "integrity": "sha512-WDa4FjhImp7YcztRaMG09svhKYYhi2Hc4p9ltQRSqyB4fsUUFm+GKzStqqH7xfjHnxacMJaOnaMGRTUqIIZDLA==", "dev": true, "dependencies": { "@stylistic/eslint-plugin-js": "1.6.3", "@stylistic/eslint-plugin-jsx": "1.6.3", "@stylistic/eslint-plugin-plus": "1.6.3", "@stylistic/eslint-plugin-ts": "1.6.3", "@types/eslint": "^8.56.2" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "peerDependencies": { "eslint": ">=8.40.0" } }, "node_modules/@stylistic/eslint-plugin-js": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-1.6.3.tgz", "integrity": "sha512-ckdz51oHxD2FaxgY2piJWJVJiwgp8Uu96s+as2yB3RMwavn3nHBrpliVukXY9S/DmMicPRB2+H8nBk23GDG+qA==", "dev": true, "dependencies": { "@types/eslint": "^8.56.2", "acorn": "^8.11.3", "escape-string-regexp": "^4.0.0", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "peerDependencies": { "eslint": ">=8.40.0" } }, "node_modules/@stylistic/eslint-plugin-jsx": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-jsx/-/eslint-plugin-jsx-1.6.3.tgz", "integrity": "sha512-SRysCIg59Zvn3dJPqHziiHwuni4NNj1et5stAmivmyQ3Cdp2ULCB7tGxCF1OxpkwRlZQue3ZgdiM7EXfJKaf9w==", "dev": true, "dependencies": { "@stylistic/eslint-plugin-js": "^1.6.3", "@types/eslint": "^8.56.2", "estraverse": "^5.3.0", "picomatch": "^4.0.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "peerDependencies": { "eslint": ">=8.40.0" } }, "node_modules/@stylistic/eslint-plugin-jsx/node_modules/picomatch": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/@stylistic/eslint-plugin-plus": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-plus/-/eslint-plugin-plus-1.6.3.tgz", "integrity": "sha512-TuwQOdyVGycDPw5XeF7W4f3ZonAVzOAzORSaD2yGAJ0fRAbJ+l/v3CkKzIAqBBwWkc+c2aRMsWtLP2+viBnmlQ==", "dev": true, "dependencies": { "@types/eslint": "^8.56.2", "@typescript-eslint/utils": "^6.21.0" }, "peerDependencies": { "eslint": "*" } }, "node_modules/@stylistic/eslint-plugin-ts": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-1.6.3.tgz", "integrity": "sha512-v5GwZsPLblWM9uAIdaSi31Sed3XBWlTFQJ3b5upEmj6QsKYivA5nmIYutwqqL133QdVWjmC86pINlx2Muq3uNQ==", "dev": true, "dependencies": { "@stylistic/eslint-plugin-js": "1.6.3", "@types/eslint": "^8.56.2", "@typescript-eslint/utils": "^6.21.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "peerDependencies": { "eslint": ">=8.40.0" } }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", "dev": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "node_modules/@types/debug": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==" }, "node_modules/@types/eslint": { "version": "8.56.5", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", "dev": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/markdown-it": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-0.0.4.tgz", "integrity": "sha512-FWR7QB7EqBRq1s9BMk0ccOSOuRLfVEWYpHQYpFPaXtCoqN6dJx2ttdsdQbUxLLnAlKpYeVjveGGhQ3583TTa7g==", "dev": true }, "node_modules/@types/node": { "version": "20.11.27", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.27.tgz", "integrity": "sha512-qyUZfMnCg1KEz57r7pzFtSGt49f6RPkPBis3Vo4PbS7roQEDn22hiHzl/Lo1q4i4hDEgBJmBF/NTNg2XR0HbFg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/semver": { "version": "7.5.6", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.0.tgz", "integrity": "sha512-M72SJ0DkcQVmmsbqlzc6EJgb/3Oz2Wdm6AyESB4YkGgCxP8u5jt5jn4/OBMPK3HLOxcttZq5xbBBU7e2By4SZQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "7.0.0", "@typescript-eslint/type-utils": "7.0.0", "@typescript-eslint/utils": "7.0.0", "@typescript-eslint/visitor-keys": "7.0.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.0.0.tgz", "integrity": "sha512-kuPZcPAdGcDBAyqDn/JVeJVhySvpkxzfXjJq1X1BFSTYo1TTuo4iyb937u457q4K0In84p6u2VHQGaFnv7VYqg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "7.0.0", "@typescript-eslint/types": "7.0.0", "@typescript-eslint/typescript-estree": "7.0.0", "semver": "^7.5.4" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/parser": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@typescript-eslint/parser/node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@typescript-eslint/scope-manager": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.0.0.tgz", "integrity": "sha512-IxTStwhNDPO07CCrYuAqjuJ3Xf5MrMaNgbAZPxFXAUpAtwqFxiuItxUaVtP/SJQeCdJjwDGh9/lMOluAndkKeg==", "dev": true, "dependencies": { "@typescript-eslint/types": "7.0.0", "@typescript-eslint/visitor-keys": "7.0.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/type-utils": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.0.0.tgz", "integrity": "sha512-FIM8HPxj1P2G7qfrpiXvbHeHypgo2mFpFGoh5I73ZlqmJOsloSa1x0ZyXCer43++P1doxCgNqIOLqmZR6SOT8g==", "dev": true, "dependencies": { "@typescript-eslint/typescript-estree": "7.0.0", "@typescript-eslint/utils": "7.0.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.0.0.tgz", "integrity": "sha512-kuPZcPAdGcDBAyqDn/JVeJVhySvpkxzfXjJq1X1BFSTYo1TTuo4iyb937u457q4K0In84p6u2VHQGaFnv7VYqg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "7.0.0", "@typescript-eslint/types": "7.0.0", "@typescript-eslint/typescript-estree": "7.0.0", "semver": "^7.5.4" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/types": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.0.0.tgz", "integrity": "sha512-9ZIJDqagK1TTs4W9IyeB2sH/s1fFhN9958ycW8NRTg1vXGzzH5PQNzq6KbsbVGMT+oyyfa17DfchHDidcmf5cg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/typescript-estree": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.0.tgz", "integrity": "sha512-JzsOzhJJm74aQ3c9um/aDryHgSHfaX8SHFIu9x4Gpik/+qxLvxUylhTsO9abcNu39JIdhY2LgYrFxTii3IajLA==", "dev": true, "dependencies": { "@typescript-eslint/types": "7.0.0", "@typescript-eslint/visitor-keys": "7.0.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@typescript-eslint/utils": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@typescript-eslint/utils/node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@typescript-eslint/visitor-keys": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.0.tgz", "integrity": "sha512-JZP0uw59PRHp7sHQl3aF/lFgwOW2rgNVnXUksj1d932PMita9wFBd3621vHQRDvHwPsSY9FMAAHVc8gTvLYY4w==", "dev": true, "dependencies": { "@typescript-eslint/types": "7.0.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "node_modules/binary-search": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz", "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" }, "engines": { "node": ">= 8" } }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "engines": { "node": ">=0.3.1" } }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "dependencies": { "path-type": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "dependencies": { "esutils": "^2.0.2" }, "engines": { "node": ">=6.0.0" } }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "node_modules/entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.0", "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/eslint/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/eslint/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/eslint/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { "is-glob": "^4.0.3" }, "engines": { "node": ">=10.13.0" } }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/eslint/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" }, "engines": { "node": ">=0.10" } }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "dependencies": { "estraverse": "^5.2.0" }, "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" } }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "node_modules/fastq": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" } }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "dependencies": { "flat-cache": "^3.0.4" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { "version": "3.2.9", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "node_modules/ignore": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { "node": ">=0.8.19" } }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "engines": { "node": ">=0.12.0" } }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/linkify-it": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", "dev": true, "dependencies": { "uc.micro": "^1.0.1" } }, "node_modules/llparse": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/llparse/-/llparse-7.1.1.tgz", "integrity": "sha512-lBxN5O6sKq6KSOaRFIGczoVpO/U/37mHhjJioQbPuiXdfZmwzP1zC3txV9xx778TRNFENzeCM0Uoo+mE1rfJOA==", "dependencies": { "debug": "^4.2.0", "llparse-frontend": "^3.0.0" } }, "node_modules/llparse-builder": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/llparse-builder/-/llparse-builder-1.5.2.tgz", "integrity": "sha512-i862UNC3YUEdlfK/NUCJxlKjtWjgAI9AJXDRgjcfRHfwFt4Sf8eFPTRsc91/2R9MBZ0kyFdfhi8SVhMsZf1gNQ==", "dependencies": { "@types/debug": "4.1.5 ", "binary-search": "^1.3.6", "debug": "^4.2.0" } }, "node_modules/llparse-dot": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/llparse-dot/-/llparse-dot-1.0.1.tgz", "integrity": "sha512-3e271C2LuDWBzhxaCUDzjpufamoEBuTYQz83QyMixI/i99BntCEk6ngHWOhhDb0XdtNNh6qAfRmXyjgNP+Nxpw==", "dev": true, "dependencies": { "llparse-builder": "^1.0.0" } }, "node_modules/llparse-frontend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/llparse-frontend/-/llparse-frontend-3.0.0.tgz", "integrity": "sha512-G/o0Po2C+G5OtP8MJeQDjDf5qwDxcO7K6x4r6jqGsJwxk7yblbJnRqpmye7G/lZ8dD0Hv5neY4/KB5BhDmEc9Q==", "dependencies": { "debug": "^3.2.6", "llparse-builder": "^1.5.2" } }, "node_modules/llparse-frontend/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { "ms": "^2.1.1" } }, "node_modules/llparse-test-fixture": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/llparse-test-fixture/-/llparse-test-fixture-5.0.2.tgz", "integrity": "sha512-61KI5J/b5uyRktD0y1EezleEW6UfaxhHkn1adLKNVemRZzklE+SpLakr251qo04kb9jN/ytk8lllgK+yFOj4cQ==", "dev": true, "dependencies": { "esm": "^3.2.25", "llparse": "^7.0.0", "yargs": "^15.4.1" } }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { "p-locate": "^5.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "node_modules/markdown-it": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", "dev": true, "dependencies": { "argparse": "^1.0.7", "entities": "~1.1.1", "linkify-it": "^2.0.0", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" }, "bin": { "markdown-it": "bin/markdown-it.js" } }, "node_modules/mdgator": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/mdgator/-/mdgator-1.1.2.tgz", "integrity": "sha512-S2GvsLIznUQ2McXfpe6BCD+IqhnRuHcBO7krqnvnsHgDpjjO1mLhr0vZtVa5ca4WZET037g3G+94DznpicKkOA==", "dev": true, "dependencies": { "@types/markdown-it": "0.0.4", "markdown-it": "^8.4.1" } }, "node_modules/mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", "dev": true }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "dependencies": { "wrappy": "1" } }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { "p-limit": "^3.0.2" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate/node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "dependencies": { "callsites": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "dependencies": { "is-number": "^7.0.0" }, "engines": { "node": ">=8.0" } }, "node_modules/ts-api-utils": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", "dev": true, "engines": { "node": ">=16.13.0" }, "peerDependencies": { "typescript": ">=4.2.0" } }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "bin": { "ts-node": "dist/bin.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "peerDependenciesMeta": { "@swc/core": { "optional": true }, "@swc/wasm": { "optional": true } } }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typescript": { "version": "5.4.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { "node": ">=14.17" } }, "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "dependencies": { "punycode": "^2.1.0" } }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" }, "engines": { "node": ">= 8" } }, "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" }, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/yargs-parser": { "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" }, "engines": { "node": ">=6" } }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } } } } ������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/package.json������������������������������������������������������������0000644�0001751�0000177�00000003502�14607525267�017715� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "name": "llhttp", "version": "9.2.1", "description": "HTTP parser in LLVM IR", "main": "lib/llhttp.js", "types": "lib/llhttp.d.ts", "files": [ "lib", "src" ], "scripts": { "bench": "ts-node bench/", "build": "ts-node bin/generate.ts", "build-ts": "tsc", "prebuild-wasm": "npm run wasm -- --prebuild && npm run wasm -- --setup", "build-wasm": "npm run wasm -- --docker", "wasm": "ts-node bin/build_wasm.ts", "clean": "rm -rf lib && rm -rf test/tmp", "prepare": "npm run clean && npm run build-ts", "test": "node -r ts-node/register/type-check ./test/md-test.ts", "lint": "eslint -c eslint.json bin/*.ts src/*.ts src/**/*.ts test/*.ts test/**/*.ts", "lint-fix": "eslint --fix -c eslint.json bin/*.ts src/*.ts src/**/*.ts test/*.ts test/**/*.ts", "postversion": "RELEASE=`node -e \"process.stdout.write(require('./package').version)\"` make -B postversion", "github-release": "RELEASE_V=`node -e \"process.stdout.write('v' + require('./package').version)\"` make github-release" }, "repository": { "type": "git", "url": "git+ssh://git@github.com/nodejs/llhttp.git" }, "keywords": [ "http", "llvm", "ir", "llparse" ], "author": "Fedor Indutny <fedor@indutny.com> (http://darksi.de/)", "license": "MIT", "bugs": { "url": "https://github.com/nodejs/llhttp/issues" }, "homepage": "https://github.com/nodejs/llhttp#readme", "devDependencies": { "@stylistic/eslint-plugin": "^1.5.4", "@types/node": "^20.11.10", "@typescript-eslint/eslint-plugin": "^7.0.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.56.0", "llparse-dot": "^1.0.1", "llparse-test-fixture": "^5.0.1", "mdgator": "^1.1.2", "ts-node": "^10.9.2", "typescript": "^5.3.3" }, "dependencies": { "llparse": "^7.1.1" } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000034�00000000000�010212� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������28 mtime=1713285830.5511148 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/src/��������������������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�016211� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/src/common.gypi���������������������������������������������������������0000644�0001751�0000177�00000002205�14607525267�020377� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ 'target_defaults': { 'default_configuration': 'Debug', 'configurations': { # TODO: hoist these out and put them somewhere common, because # RuntimeLibrary MUST MATCH across the entire project 'Debug': { 'defines': [ 'DEBUG', '_DEBUG' ], 'cflags': [ '-Wall', '-Wextra', '-O0', '-g', '-ftrapv' ], 'msvs_settings': { 'VCCLCompilerTool': { 'RuntimeLibrary': 1, # static debug }, }, }, 'Release': { 'defines': [ 'NDEBUG' ], 'cflags': [ '-Wall', '-Wextra', '-O3' ], 'msvs_settings': { 'VCCLCompilerTool': { 'RuntimeLibrary': 0, # static release }, }, } }, 'msvs_settings': { 'VCCLCompilerTool': { # Compile as C++. llhttp.c is actually C99, but C++ is # close enough in this case. 'CompileAs': 2, }, 'VCLibrarianTool': { }, 'VCLinkerTool': { 'GenerateDebugInformation': 'true', }, }, 'conditions': [ ['OS == "win"', { 'defines': [ 'WIN32' ], }] ], }, } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000033�00000000000�010211� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������27 mtime=1713285830.555115 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/src/llhttp/�������������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�017520� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/src/llhttp/c-headers.ts�������������������������������������������������0000644�0001751�0000177�00000005646�14607525267�021743� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import * as constants from './constants'; import { enumToMap } from './utils'; type Encoding = 'none' | 'hex'; export class CHeaders { public build(): string { let res = ''; res += '#ifndef LLLLHTTP_C_HEADERS_\n'; res += '#define LLLLHTTP_C_HEADERS_\n'; res += '#ifdef __cplusplus\n'; res += 'extern "C" {\n'; res += '#endif\n'; res += '\n'; const errorMap = enumToMap(constants.ERROR); const methodMap = enumToMap(constants.METHODS); const httpMethodMap = enumToMap(constants.METHODS, constants.METHODS_HTTP, [ constants.METHODS.PRI, ]); const rtspMethodMap = enumToMap(constants.METHODS, constants.METHODS_RTSP); const statusMap = enumToMap(constants.STATUSES, constants.STATUSES_HTTP); res += this.buildEnum('llhttp_errno', 'HPE', errorMap); res += '\n'; res += this.buildEnum('llhttp_flags', 'F', enumToMap(constants.FLAGS), 'hex'); res += '\n'; res += this.buildEnum('llhttp_lenient_flags', 'LENIENT', enumToMap(constants.LENIENT_FLAGS), 'hex'); res += '\n'; res += this.buildEnum('llhttp_type', 'HTTP', enumToMap(constants.TYPE)); res += '\n'; res += this.buildEnum('llhttp_finish', 'HTTP_FINISH', enumToMap(constants.FINISH)); res += '\n'; res += this.buildEnum('llhttp_method', 'HTTP', methodMap); res += '\n'; res += this.buildEnum('llhttp_status', 'HTTP_STATUS', statusMap); res += '\n'; res += this.buildMap('HTTP_ERRNO', errorMap); res += '\n'; res += this.buildMap('HTTP_METHOD', httpMethodMap); res += '\n'; res += this.buildMap('RTSP_METHOD', rtspMethodMap); res += '\n'; res += this.buildMap('HTTP_ALL_METHOD', methodMap); res += '\n'; res += this.buildMap('HTTP_STATUS', statusMap); res += '\n'; res += '#ifdef __cplusplus\n'; res += '} /* extern "C" */\n'; res += '#endif\n'; res += '#endif /* LLLLHTTP_C_HEADERS_ */\n'; return res; } private buildEnum(name: string, prefix: string, map: constants.IntDict, encoding: Encoding = 'none'): string { let res = ''; res += `enum ${name} {\n`; const keys = Object.keys(map); const keysLength = keys.length; for (let i = 0; i < keysLength; i++) { const key = keys[i]; const isLast = i === keysLength - 1; let value: number | string = map[key]; if (encoding === 'hex') { value = `0x${value.toString(16)}`; } res += ` ${prefix}_${key.replace(/-/g, '')} = ${value}`; if (!isLast) { res += ',\n'; } } res += '\n};\n'; res += `typedef enum ${name} ${name}_t;\n`; return res; } private buildMap(name: string, map: constants.IntDict): string { let res = ''; res += `#define ${name}_MAP(XX) \\\n`; for (const [ key, value ] of Object.entries(map)) { res += ` XX(${value!}, ${key.replace(/-/g, '')}, ${key}) \\\n`; } res += '\n'; return res; } } ������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/src/llhttp/constants.ts�������������������������������������������������0000644�0001751�0000177�00000032365�14607525267�022122� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import { enumToMap } from './utils'; export type IntDict = Record<string, number>; // Emums export const ERROR: IntDict = { OK: 0, INTERNAL: 1, STRICT: 2, CR_EXPECTED: 25, LF_EXPECTED: 3, UNEXPECTED_CONTENT_LENGTH: 4, UNEXPECTED_SPACE: 30, CLOSED_CONNECTION: 5, INVALID_METHOD: 6, INVALID_URL: 7, INVALID_CONSTANT: 8, INVALID_VERSION: 9, INVALID_HEADER_TOKEN: 10, INVALID_CONTENT_LENGTH: 11, INVALID_CHUNK_SIZE: 12, INVALID_STATUS: 13, INVALID_EOF_STATE: 14, INVALID_TRANSFER_ENCODING: 15, CB_MESSAGE_BEGIN: 16, CB_HEADERS_COMPLETE: 17, CB_MESSAGE_COMPLETE: 18, CB_CHUNK_HEADER: 19, CB_CHUNK_COMPLETE: 20, PAUSED: 21, PAUSED_UPGRADE: 22, PAUSED_H2_UPGRADE: 23, USER: 24, CB_URL_COMPLETE: 26, CB_STATUS_COMPLETE: 27, CB_METHOD_COMPLETE: 32, CB_VERSION_COMPLETE: 33, CB_HEADER_FIELD_COMPLETE: 28, CB_HEADER_VALUE_COMPLETE: 29, CB_CHUNK_EXTENSION_NAME_COMPLETE: 34, CB_CHUNK_EXTENSION_VALUE_COMPLETE: 35, CB_RESET: 31, }; export const TYPE: IntDict = { BOTH: 0, // default REQUEST: 1, RESPONSE: 2, }; export const FLAGS: IntDict = { CONNECTION_KEEP_ALIVE: 1 << 0, CONNECTION_CLOSE: 1 << 1, CONNECTION_UPGRADE: 1 << 2, CHUNKED: 1 << 3, UPGRADE: 1 << 4, CONTENT_LENGTH: 1 << 5, SKIPBODY: 1 << 6, TRAILING: 1 << 7, // 1 << 8 is unused TRANSFER_ENCODING: 1 << 9, }; export const LENIENT_FLAGS: IntDict = { HEADERS: 1 << 0, CHUNKED_LENGTH: 1 << 1, KEEP_ALIVE: 1 << 2, TRANSFER_ENCODING: 1 << 3, VERSION: 1 << 4, DATA_AFTER_CLOSE: 1 << 5, OPTIONAL_LF_AFTER_CR: 1 << 6, OPTIONAL_CRLF_AFTER_CHUNK: 1 << 7, OPTIONAL_CR_BEFORE_LF: 1 << 8, SPACES_AFTER_CHUNK_SIZE: 1 << 9, }; export const METHODS: IntDict = { 'DELETE': 0, 'GET': 1, 'HEAD': 2, 'POST': 3, 'PUT': 4, /* pathological */ 'CONNECT': 5, 'OPTIONS': 6, 'TRACE': 7, /* WebDAV */ 'COPY': 8, 'LOCK': 9, 'MKCOL': 10, 'MOVE': 11, 'PROPFIND': 12, 'PROPPATCH': 13, 'SEARCH': 14, 'UNLOCK': 15, 'BIND': 16, 'REBIND': 17, 'UNBIND': 18, 'ACL': 19, /* subversion */ 'REPORT': 20, 'MKACTIVITY': 21, 'CHECKOUT': 22, 'MERGE': 23, /* upnp */ 'M-SEARCH': 24, 'NOTIFY': 25, 'SUBSCRIBE': 26, 'UNSUBSCRIBE': 27, /* RFC-5789 */ 'PATCH': 28, 'PURGE': 29, /* CalDAV */ 'MKCALENDAR': 30, /* RFC-2068, section 19.6.1.2 */ 'LINK': 31, 'UNLINK': 32, /* icecast */ 'SOURCE': 33, /* RFC-7540, section 11.6 */ 'PRI': 34, /* RFC-2326 RTSP */ 'DESCRIBE': 35, 'ANNOUNCE': 36, 'SETUP': 37, 'PLAY': 38, 'PAUSE': 39, 'TEARDOWN': 40, 'GET_PARAMETER': 41, 'SET_PARAMETER': 42, 'REDIRECT': 43, 'RECORD': 44, /* RAOP */ 'FLUSH': 45, /* DRAFT https://www.ietf.org/archive/id/draft-ietf-httpbis-safe-method-w-body-02.html */ 'QUERY': 46, }; export const STATUSES: IntDict = { CONTINUE: 100, SWITCHING_PROTOCOLS: 101, PROCESSING: 102, EARLY_HINTS: 103, RESPONSE_IS_STALE: 110, // Unofficial REVALIDATION_FAILED: 111, // Unofficial DISCONNECTED_OPERATION: 112, // Unofficial HEURISTIC_EXPIRATION: 113, // Unofficial MISCELLANEOUS_WARNING: 199, // Unofficial OK: 200, CREATED: 201, ACCEPTED: 202, NON_AUTHORITATIVE_INFORMATION: 203, NO_CONTENT: 204, RESET_CONTENT: 205, PARTIAL_CONTENT: 206, MULTI_STATUS: 207, ALREADY_REPORTED: 208, TRANSFORMATION_APPLIED: 214, // Unofficial IM_USED: 226, MISCELLANEOUS_PERSISTENT_WARNING: 299, // Unofficial MULTIPLE_CHOICES: 300, MOVED_PERMANENTLY: 301, FOUND: 302, SEE_OTHER: 303, NOT_MODIFIED: 304, USE_PROXY: 305, SWITCH_PROXY: 306, // No longer used TEMPORARY_REDIRECT: 307, PERMANENT_REDIRECT: 308, BAD_REQUEST: 400, UNAUTHORIZED: 401, PAYMENT_REQUIRED: 402, FORBIDDEN: 403, NOT_FOUND: 404, METHOD_NOT_ALLOWED: 405, NOT_ACCEPTABLE: 406, PROXY_AUTHENTICATION_REQUIRED: 407, REQUEST_TIMEOUT: 408, CONFLICT: 409, GONE: 410, LENGTH_REQUIRED: 411, PRECONDITION_FAILED: 412, PAYLOAD_TOO_LARGE: 413, URI_TOO_LONG: 414, UNSUPPORTED_MEDIA_TYPE: 415, RANGE_NOT_SATISFIABLE: 416, EXPECTATION_FAILED: 417, IM_A_TEAPOT: 418, PAGE_EXPIRED: 419, // Unofficial ENHANCE_YOUR_CALM: 420, // Unofficial MISDIRECTED_REQUEST: 421, UNPROCESSABLE_ENTITY: 422, LOCKED: 423, FAILED_DEPENDENCY: 424, TOO_EARLY: 425, UPGRADE_REQUIRED: 426, PRECONDITION_REQUIRED: 428, TOO_MANY_REQUESTS: 429, REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL: 430, // Unofficial REQUEST_HEADER_FIELDS_TOO_LARGE: 431, LOGIN_TIMEOUT: 440, // Unofficial NO_RESPONSE: 444, // Unofficial RETRY_WITH: 449, // Unofficial BLOCKED_BY_PARENTAL_CONTROL: 450, // Unofficial UNAVAILABLE_FOR_LEGAL_REASONS: 451, CLIENT_CLOSED_LOAD_BALANCED_REQUEST: 460, // Unofficial INVALID_X_FORWARDED_FOR: 463, // Unofficial REQUEST_HEADER_TOO_LARGE: 494, // Unofficial SSL_CERTIFICATE_ERROR: 495, // Unofficial SSL_CERTIFICATE_REQUIRED: 496, // Unofficial HTTP_REQUEST_SENT_TO_HTTPS_PORT: 497, // Unofficial INVALID_TOKEN: 498, // Unofficial CLIENT_CLOSED_REQUEST: 499, // Unofficial INTERNAL_SERVER_ERROR: 500, NOT_IMPLEMENTED: 501, BAD_GATEWAY: 502, SERVICE_UNAVAILABLE: 503, GATEWAY_TIMEOUT: 504, HTTP_VERSION_NOT_SUPPORTED: 505, VARIANT_ALSO_NEGOTIATES: 506, INSUFFICIENT_STORAGE: 507, LOOP_DETECTED: 508, BANDWIDTH_LIMIT_EXCEEDED: 509, NOT_EXTENDED: 510, NETWORK_AUTHENTICATION_REQUIRED: 511, WEB_SERVER_UNKNOWN_ERROR: 520, // Unofficial WEB_SERVER_IS_DOWN: 521, // Unofficial CONNECTION_TIMEOUT: 522, // Unofficial ORIGIN_IS_UNREACHABLE: 523, // Unofficial TIMEOUT_OCCURED: 524, // Unofficial SSL_HANDSHAKE_FAILED: 525, // Unofficial INVALID_SSL_CERTIFICATE: 526, // Unofficial RAILGUN_ERROR: 527, // Unofficial SITE_IS_OVERLOADED: 529, // Unofficial SITE_IS_FROZEN: 530, // Unofficial IDENTITY_PROVIDER_AUTHENTICATION_ERROR: 561, // Unofficial NETWORK_READ_TIMEOUT: 598, // Unofficial NETWORK_CONNECT_TIMEOUT: 599, // Unofficial }; export const FINISH: IntDict = { SAFE: 0, SAFE_WITH_CB: 1, UNSAFE: 2, }; export const HEADER_STATE: IntDict = { GENERAL: 0, CONNECTION: 1, CONTENT_LENGTH: 2, TRANSFER_ENCODING: 3, UPGRADE: 4, CONNECTION_KEEP_ALIVE: 5, CONNECTION_CLOSE: 6, CONNECTION_UPGRADE: 7, TRANSFER_ENCODING_CHUNKED: 8, }; // C headers export const METHODS_HTTP = [ METHODS.DELETE, METHODS.GET, METHODS.HEAD, METHODS.POST, METHODS.PUT, METHODS.CONNECT, METHODS.OPTIONS, METHODS.TRACE, METHODS.COPY, METHODS.LOCK, METHODS.MKCOL, METHODS.MOVE, METHODS.PROPFIND, METHODS.PROPPATCH, METHODS.SEARCH, METHODS.UNLOCK, METHODS.BIND, METHODS.REBIND, METHODS.UNBIND, METHODS.ACL, METHODS.REPORT, METHODS.MKACTIVITY, METHODS.CHECKOUT, METHODS.MERGE, METHODS['M-SEARCH'], METHODS.NOTIFY, METHODS.SUBSCRIBE, METHODS.UNSUBSCRIBE, METHODS.PATCH, METHODS.PURGE, METHODS.MKCALENDAR, METHODS.LINK, METHODS.UNLINK, METHODS.PRI, // TODO(indutny): should we allow it with HTTP? METHODS.SOURCE, METHODS.QUERY, ]; export const METHODS_ICE = [ METHODS.SOURCE, ]; export const METHODS_RTSP = [ METHODS.OPTIONS, METHODS.DESCRIBE, METHODS.ANNOUNCE, METHODS.SETUP, METHODS.PLAY, METHODS.PAUSE, METHODS.TEARDOWN, METHODS.GET_PARAMETER, METHODS.SET_PARAMETER, METHODS.REDIRECT, METHODS.RECORD, METHODS.FLUSH, // For AirPlay METHODS.GET, METHODS.POST, ]; export const METHOD_MAP = enumToMap(METHODS); export const H_METHOD_MAP = Object.fromEntries( Object.entries(METHODS).filter(([ k ]) => k.startsWith('H')) ); export const STATUSES_HTTP = [ STATUSES.CONTINUE, STATUSES.SWITCHING_PROTOCOLS, STATUSES.PROCESSING, STATUSES.EARLY_HINTS, STATUSES.RESPONSE_IS_STALE, STATUSES.REVALIDATION_FAILED, STATUSES.DISCONNECTED_OPERATION, STATUSES.HEURISTIC_EXPIRATION, STATUSES.MISCELLANEOUS_WARNING, STATUSES.OK, STATUSES.CREATED, STATUSES.ACCEPTED, STATUSES.NON_AUTHORITATIVE_INFORMATION, STATUSES.NO_CONTENT, STATUSES.RESET_CONTENT, STATUSES.PARTIAL_CONTENT, STATUSES.MULTI_STATUS, STATUSES.ALREADY_REPORTED, STATUSES.TRANSFORMATION_APPLIED, STATUSES.IM_USED, STATUSES.MISCELLANEOUS_PERSISTENT_WARNING, STATUSES.MULTIPLE_CHOICES, STATUSES.MOVED_PERMANENTLY, STATUSES.FOUND, STATUSES.SEE_OTHER, STATUSES.NOT_MODIFIED, STATUSES.USE_PROXY, STATUSES.SWITCH_PROXY, STATUSES.TEMPORARY_REDIRECT, STATUSES.PERMANENT_REDIRECT, STATUSES.BAD_REQUEST, STATUSES.UNAUTHORIZED, STATUSES.PAYMENT_REQUIRED, STATUSES.FORBIDDEN, STATUSES.NOT_FOUND, STATUSES.METHOD_NOT_ALLOWED, STATUSES.NOT_ACCEPTABLE, STATUSES.PROXY_AUTHENTICATION_REQUIRED, STATUSES.REQUEST_TIMEOUT, STATUSES.CONFLICT, STATUSES.GONE, STATUSES.LENGTH_REQUIRED, STATUSES.PRECONDITION_FAILED, STATUSES.PAYLOAD_TOO_LARGE, STATUSES.URI_TOO_LONG, STATUSES.UNSUPPORTED_MEDIA_TYPE, STATUSES.RANGE_NOT_SATISFIABLE, STATUSES.EXPECTATION_FAILED, STATUSES.IM_A_TEAPOT, STATUSES.PAGE_EXPIRED, STATUSES.ENHANCE_YOUR_CALM, STATUSES.MISDIRECTED_REQUEST, STATUSES.UNPROCESSABLE_ENTITY, STATUSES.LOCKED, STATUSES.FAILED_DEPENDENCY, STATUSES.TOO_EARLY, STATUSES.UPGRADE_REQUIRED, STATUSES.PRECONDITION_REQUIRED, STATUSES.TOO_MANY_REQUESTS, STATUSES.REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL, STATUSES.REQUEST_HEADER_FIELDS_TOO_LARGE, STATUSES.LOGIN_TIMEOUT, STATUSES.NO_RESPONSE, STATUSES.RETRY_WITH, STATUSES.BLOCKED_BY_PARENTAL_CONTROL, STATUSES.UNAVAILABLE_FOR_LEGAL_REASONS, STATUSES.CLIENT_CLOSED_LOAD_BALANCED_REQUEST, STATUSES.INVALID_X_FORWARDED_FOR, STATUSES.REQUEST_HEADER_TOO_LARGE, STATUSES.SSL_CERTIFICATE_ERROR, STATUSES.SSL_CERTIFICATE_REQUIRED, STATUSES.HTTP_REQUEST_SENT_TO_HTTPS_PORT, STATUSES.INVALID_TOKEN, STATUSES.CLIENT_CLOSED_REQUEST, STATUSES.INTERNAL_SERVER_ERROR, STATUSES.NOT_IMPLEMENTED, STATUSES.BAD_GATEWAY, STATUSES.SERVICE_UNAVAILABLE, STATUSES.GATEWAY_TIMEOUT, STATUSES.HTTP_VERSION_NOT_SUPPORTED, STATUSES.VARIANT_ALSO_NEGOTIATES, STATUSES.INSUFFICIENT_STORAGE, STATUSES.LOOP_DETECTED, STATUSES.BANDWIDTH_LIMIT_EXCEEDED, STATUSES.NOT_EXTENDED, STATUSES.NETWORK_AUTHENTICATION_REQUIRED, STATUSES.WEB_SERVER_UNKNOWN_ERROR, STATUSES.WEB_SERVER_IS_DOWN, STATUSES.CONNECTION_TIMEOUT, STATUSES.ORIGIN_IS_UNREACHABLE, STATUSES.TIMEOUT_OCCURED, STATUSES.SSL_HANDSHAKE_FAILED, STATUSES.INVALID_SSL_CERTIFICATE, STATUSES.RAILGUN_ERROR, STATUSES.SITE_IS_OVERLOADED, STATUSES.SITE_IS_FROZEN, STATUSES.IDENTITY_PROVIDER_AUTHENTICATION_ERROR, STATUSES.NETWORK_READ_TIMEOUT, STATUSES.NETWORK_CONNECT_TIMEOUT, ]; // Internal export type CharList = Array<string | number>; export const ALPHA: CharList = []; for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) { // Upper case ALPHA.push(String.fromCharCode(i)); // Lower case ALPHA.push(String.fromCharCode(i + 0x20)); } export const NUM_MAP = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, }; export const HEX_MAP = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF, a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf, }; export const NUM: CharList = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ]; export const ALPHANUM: CharList = ALPHA.concat(NUM); export const MARK: CharList = [ '-', '_', '.', '!', '~', '*', '\'', '(', ')' ]; export const USERINFO_CHARS: CharList = ALPHANUM .concat(MARK) .concat([ '%', ';', ':', '&', '=', '+', '$', ',' ]); // TODO(indutny): use RFC export const URL_CHAR: CharList = ([ '!', '"', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~', ] as CharList).concat(ALPHANUM); export const HEX: CharList = NUM.concat( [ 'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F' ]); /* Tokens as defined by rfc 2616. Also lowercases them. * token = 1*<any CHAR except CTLs or separators> * separators = "(" | ")" | "<" | ">" | "@" * | "," | ";" | ":" | "\" | <"> * | "/" | "[" | "]" | "?" | "=" * | "{" | "}" | SP | HT */ export const TOKEN: CharList = ([ '!', '#', '$', '%', '&', '\'', '*', '+', '-', '.', '^', '_', '`', '|', '~', ] as CharList).concat(ALPHANUM); /* * Verify that a char is a valid visible (printable) US-ASCII * character or %x80-FF */ export const HEADER_CHARS: CharList = [ '\t' ]; for (let i = 32; i <= 255; i++) { if (i !== 127) { HEADER_CHARS.push(i); } } // ',' = \x44 export const CONNECTION_TOKEN_CHARS: CharList = HEADER_CHARS.filter((c: string | number) => c !== 44); export const QUOTED_STRING: CharList = [ '\t', ' ' ]; for (let i = 0x21; i <= 0xff; i++) { if (i !== 0x22 && i !== 0x5c) { // All characters in ASCII except \ and " QUOTED_STRING.push(i); } } export const HTAB_SP_VCHAR_OBS_TEXT: CharList = [ '\t', ' ' ]; // VCHAR: https://tools.ietf.org/html/rfc5234#appendix-B.1 for (let i = 0x21; i <= 0x7E; i++) { HTAB_SP_VCHAR_OBS_TEXT.push(i); } // OBS_TEXT: https://datatracker.ietf.org/doc/html/rfc9110#name-collected-abnf for (let i = 0x80; i <= 0xff; i++) { HTAB_SP_VCHAR_OBS_TEXT.push(i); } export const MAJOR = NUM_MAP; export const MINOR = MAJOR; export const SPECIAL_HEADERS = { 'connection': HEADER_STATE.CONNECTION, 'content-length': HEADER_STATE.CONTENT_LENGTH, 'proxy-connection': HEADER_STATE.CONNECTION, 'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING, 'upgrade': HEADER_STATE.UPGRADE, }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/src/llhttp/http.ts������������������������������������������������������0000644�0001751�0000177�00000127367�14607525267�021074� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import * as assert from 'assert'; import { LLParse, source } from 'llparse'; import Match = source.node.Match; import Node = source.node.Node; import { CharList, CONNECTION_TOKEN_CHARS, ERROR, FINISH, FLAGS, H_METHOD_MAP, HEADER_CHARS, HEADER_STATE, HEX_MAP, HTAB_SP_VCHAR_OBS_TEXT, LENIENT_FLAGS, MAJOR, METHOD_MAP, METHODS, METHODS_HTTP, METHODS_ICE, METHODS_RTSP, MINOR, NUM_MAP, QUOTED_STRING, SPECIAL_HEADERS, TOKEN, TYPE, } from './constants'; import { URL } from './url'; const NODES: ReadonlyArray<string> = [ 'start', 'after_start', 'start_req', 'after_start_req', 'start_res', 'start_req_or_res', 'req_or_res_method', 'res_http_major', 'res_http_dot', 'res_http_minor', 'res_http_end', 'res_after_version', 'res_status_code_digit_1', 'res_status_code_digit_2', 'res_status_code_digit_3', 'res_status_code_otherwise', 'res_status_start', 'res_status', 'res_line_almost_done', 'req_first_space_before_url', 'req_spaces_before_url', 'req_http_start', 'req_http_version', 'req_http_major', 'req_http_dot', 'req_http_minor', 'req_http_end', 'req_http_complete', 'req_http_complete_crlf', 'req_pri_upgrade', 'headers_start', 'header_field_start', 'header_field', 'header_field_colon', 'header_field_colon_discard_ws', 'header_field_general', 'header_field_general_otherwise', 'header_value_discard_ws', 'header_value_discard_ws_almost_done', 'header_value_discard_lws', 'header_value_start', 'header_value', 'header_value_otherwise', 'header_value_lenient', 'header_value_lenient_failed', 'header_value_lws', 'header_value_te_chunked', 'header_value_te_chunked_last', 'header_value_te_token', 'header_value_te_token_ows', 'header_value_content_length_once', 'header_value_content_length', 'header_value_content_length_ws', 'header_value_connection', 'header_value_connection_ws', 'header_value_connection_token', 'header_value_almost_done', 'headers_almost_done', 'headers_done', 'chunk_size_start', 'chunk_size_digit', 'chunk_size', 'chunk_size_otherwise', 'chunk_size_almost_done', 'chunk_size_almost_done_lf', 'chunk_extensions', 'chunk_extension_name', 'chunk_extension_value', 'chunk_extension_quoted_value', 'chunk_extension_quoted_value_quoted_pair', 'chunk_extension_quoted_value_done', 'chunk_data', 'chunk_data_almost_done', 'chunk_complete', 'body_identity', 'body_identity_eof', 'message_done', 'eof', 'cleanup', 'closed', 'restart', ]; interface ISpanMap { readonly status: source.Span; readonly method: source.Span; readonly version: source.Span; readonly headerField: source.Span; readonly headerValue: source.Span; readonly chunkExtensionName: source.Span; readonly chunkExtensionValue: source.Span; readonly body: source.Span; } interface ICallbackMap { readonly onMessageBegin: source.code.Code; readonly onUrlComplete: source.code.Code; readonly onMethodComplete: source.code.Code; readonly onVersionComplete: source.code.Code; readonly onStatusComplete: source.code.Code; readonly beforeHeadersComplete: source.code.Code; readonly onHeaderFieldComplete: source.code.Code; readonly onHeaderValueComplete: source.code.Code; readonly onHeadersComplete: source.code.Code; readonly afterHeadersComplete: source.code.Code; readonly onChunkHeader: source.code.Code; readonly onChunkExtensionName: source.code.Code; readonly onChunkExtensionValue: source.code.Code; readonly onChunkComplete: source.code.Code; readonly onMessageComplete: source.code.Code; readonly afterMessageComplete: source.code.Code; readonly onReset: source.code.Code; } interface IMulTargets { readonly overflow: string | Node; readonly success: string | Node; } interface IMulOptions { readonly base: number; readonly max?: number; readonly signed: boolean; } interface IIsEqualTargets { readonly equal: string | Node; readonly notEqual: string | Node; } export interface IHTTPResult { readonly entry: Node; } export class HTTP { private readonly url: URL; private readonly TOKEN: CharList; private readonly span: ISpanMap; private readonly callback: ICallbackMap; private readonly nodes: Map<string, Match> = new Map(); constructor(private readonly llparse: LLParse) { const p = llparse; this.url = new URL(p); this.TOKEN = TOKEN; this.span = { body: p.span(p.code.span('llhttp__on_body')), chunkExtensionName: p.span(p.code.span('llhttp__on_chunk_extension_name')), chunkExtensionValue: p.span(p.code.span('llhttp__on_chunk_extension_value')), headerField: p.span(p.code.span('llhttp__on_header_field')), headerValue: p.span(p.code.span('llhttp__on_header_value')), method: p.span(p.code.span('llhttp__on_method')), status: p.span(p.code.span('llhttp__on_status')), version: p.span(p.code.span('llhttp__on_version')), }; /* tslint:disable:object-literal-sort-keys */ this.callback = { // User callbacks onUrlComplete: p.code.match('llhttp__on_url_complete'), onStatusComplete: p.code.match('llhttp__on_status_complete'), onMethodComplete: p.code.match('llhttp__on_method_complete'), onVersionComplete: p.code.match('llhttp__on_version_complete'), onHeaderFieldComplete: p.code.match('llhttp__on_header_field_complete'), onHeaderValueComplete: p.code.match('llhttp__on_header_value_complete'), onHeadersComplete: p.code.match('llhttp__on_headers_complete'), onMessageBegin: p.code.match('llhttp__on_message_begin'), onMessageComplete: p.code.match('llhttp__on_message_complete'), onChunkHeader: p.code.match('llhttp__on_chunk_header'), onChunkExtensionName: p.code.match('llhttp__on_chunk_extension_name_complete'), onChunkExtensionValue: p.code.match('llhttp__on_chunk_extension_value_complete'), onChunkComplete: p.code.match('llhttp__on_chunk_complete'), onReset: p.code.match('llhttp__on_reset'), // Internal callbacks `src/http.c` beforeHeadersComplete: p.code.match('llhttp__before_headers_complete'), afterHeadersComplete: p.code.match('llhttp__after_headers_complete'), afterMessageComplete: p.code.match('llhttp__after_message_complete'), }; /* tslint:enable:object-literal-sort-keys */ for (const name of NODES) { this.nodes.set(name, p.node(name) as Match); } } public build(): IHTTPResult { const p = this.llparse; p.property('i64', 'content_length'); p.property('i8', 'type'); p.property('i8', 'method'); p.property('i8', 'http_major'); p.property('i8', 'http_minor'); p.property('i8', 'header_state'); p.property('i16', 'lenient_flags'); p.property('i8', 'upgrade'); p.property('i8', 'finish'); p.property('i16', 'flags'); p.property('i16', 'status_code'); p.property('i8', 'initial_message_completed'); // Verify defaults assert.strictEqual(FINISH.SAFE, 0); assert.strictEqual(TYPE.BOTH, 0); // Shared settings (to be used in C wrapper) p.property('ptr', 'settings'); this.buildLine(); this.buildHeaders(); return { entry: this.node('start'), }; } private buildLine(): void { const p = this.llparse; const span = this.span; const n = (name: string): Match => this.node<Match>(name); const url = this.url.build(); const switchType = this.load('type', { [TYPE.REQUEST]: n('start_req'), [TYPE.RESPONSE]: n('start_res'), }, n('start_req_or_res')); n('start') .match([ '\r', '\n' ], n('start')) .otherwise( this.load('initial_message_completed', { 1: this.invokePausable('on_reset', ERROR.CB_RESET, n('after_start')), }, n('after_start')), ); n('after_start').otherwise( this.update( 'finish', FINISH.UNSAFE, this.invokePausable('on_message_begin', ERROR.CB_MESSAGE_BEGIN, switchType), ), ); n('start_req_or_res') .peek('H', this.span.method.start(n('req_or_res_method'))) .otherwise(this.update('type', TYPE.REQUEST, 'start_req')); n('req_or_res_method') .select(H_METHOD_MAP, this.store('method', this.update('type', TYPE.REQUEST, this.span.method.end( this.invokePausable('on_method_complete', ERROR.CB_METHOD_COMPLETE, n('req_first_space_before_url')), )), )) .match('HTTP/', this.span.method.end(this.update('type', TYPE.RESPONSE, this.span.version.start(n('res_http_major'))))) .otherwise(p.error(ERROR.INVALID_CONSTANT, 'Invalid word encountered')); const checkVersion = (destination: string): Node => { const node = n(destination); const errorNode = this.span.version.end(p.error(ERROR.INVALID_VERSION, 'Invalid HTTP version')); return this.testLenientFlags(LENIENT_FLAGS.VERSION, { 1: node, }, this.load('http_major', { 0: this.load('http_minor', { 9: node, }, errorNode), 1: this.load('http_minor', { 0: node, 1: node, }, errorNode), 2: this.load('http_minor', { 0: node, }, errorNode), }, errorNode), ); }; const checkIfAllowLFWithoutCR = (success: Node, failure: Node) => { return this.testLenientFlags(LENIENT_FLAGS.OPTIONAL_CR_BEFORE_LF, { 1: success }, failure); }; // Response n('start_res') .match('HTTP/', span.version.start(n('res_http_major'))) .otherwise(p.error(ERROR.INVALID_CONSTANT, 'Expected HTTP/')); n('res_http_major') .select(MAJOR, this.store('http_major', 'res_http_dot')) .otherwise(this.span.version.end(p.error(ERROR.INVALID_VERSION, 'Invalid major version'))); n('res_http_dot') .match('.', n('res_http_minor')) .otherwise(this.span.version.end(p.error(ERROR.INVALID_VERSION, 'Expected dot'))); n('res_http_minor') .select(MINOR, this.store('http_minor', checkVersion('res_http_end'))) .otherwise(this.span.version.end(p.error(ERROR.INVALID_VERSION, 'Invalid minor version'))); n('res_http_end') .otherwise(this.span.version.end( this.invokePausable('on_version_complete', ERROR.CB_VERSION_COMPLETE, 'res_after_version'), )); n('res_after_version') .match(' ', this.update('status_code', 0, 'res_status_code_digit_1')) .otherwise(p.error(ERROR.INVALID_VERSION, 'Expected space after version')); n('res_status_code_digit_1') .select(NUM_MAP, this.mulAdd('status_code', { overflow: p.error(ERROR.INVALID_STATUS, 'Invalid status code'), success: 'res_status_code_digit_2', })) .otherwise(p.error(ERROR.INVALID_STATUS, 'Invalid status code')); n('res_status_code_digit_2') .select(NUM_MAP, this.mulAdd('status_code', { overflow: p.error(ERROR.INVALID_STATUS, 'Invalid status code'), success: 'res_status_code_digit_3', })) .otherwise(p.error(ERROR.INVALID_STATUS, 'Invalid status code')); n('res_status_code_digit_3') .select(NUM_MAP, this.mulAdd('status_code', { overflow: p.error(ERROR.INVALID_STATUS, 'Invalid status code'), success: 'res_status_code_otherwise', })) .otherwise(p.error(ERROR.INVALID_STATUS, 'Invalid status code')); const onStatusComplete = this.invokePausable( 'on_status_complete', ERROR.CB_STATUS_COMPLETE, n('headers_start'), ); n('res_status_code_otherwise') .match(' ', n('res_status_start')) .match('\r', n('res_line_almost_done')) .match( '\n', checkIfAllowLFWithoutCR( onStatusComplete, p.error(ERROR.INVALID_STATUS, 'Invalid response status'), ), ) .otherwise(p.error(ERROR.INVALID_STATUS, 'Invalid response status')); n('res_status_start') .otherwise(span.status.start(n('res_status'))); n('res_status') .peek('\r', span.status.end().skipTo(n('res_line_almost_done'))) .peek( '\n', span.status.end().skipTo( checkIfAllowLFWithoutCR( onStatusComplete, p.error(ERROR.CR_EXPECTED, 'Missing expected CR after response line'), ), ), ) .skipTo(n('res_status')); n('res_line_almost_done') .match([ '\r', '\n' ], onStatusComplete) .otherwise(this.testLenientFlags(LENIENT_FLAGS.OPTIONAL_LF_AFTER_CR, { 1: onStatusComplete, }, p.error(ERROR.STRICT, 'Expected LF after CR'))); // Request n('start_req').otherwise(this.span.method.start(n('after_start_req'))); n('after_start_req') .select(METHOD_MAP, this.store('method', this.span.method.end( this.invokePausable('on_method_complete', ERROR.CB_METHOD_COMPLETE, n('req_first_space_before_url'), )))) .otherwise(p.error(ERROR.INVALID_METHOD, 'Invalid method encountered')); n('req_first_space_before_url') .match(' ', n('req_spaces_before_url')) .otherwise(p.error(ERROR.INVALID_METHOD, 'Expected space after method')); n('req_spaces_before_url') .match(' ', n('req_spaces_before_url')) .otherwise(this.isEqual('method', METHODS.CONNECT, { equal: url.entry.connect, notEqual: url.entry.normal, })); const onUrlCompleteHTTP = this.invokePausable( 'on_url_complete', ERROR.CB_URL_COMPLETE, n('req_http_start'), ); url.exit.toHTTP .otherwise(onUrlCompleteHTTP); const onUrlCompleteHTTP09 = this.invokePausable( 'on_url_complete', ERROR.CB_URL_COMPLETE, n('headers_start'), ); url.exit.toHTTP09 .otherwise( this.update('http_major', 0, this.update('http_minor', 9, onUrlCompleteHTTP09)), ); const checkMethod = (methods: number[], error: string): Node => { const success = n('req_http_version'); const failure = p.error(ERROR.INVALID_CONSTANT, error); const map: { [key: number]: Node } = {}; for (const method of methods) { map[method] = success; } return this.load('method', map, failure); }; n('req_http_start') .match('HTTP/', checkMethod(METHODS_HTTP, 'Invalid method for HTTP/x.x request')) .match('RTSP/', checkMethod(METHODS_RTSP, 'Invalid method for RTSP/x.x request')) .match('ICE/', checkMethod(METHODS_ICE, 'Expected SOURCE method for ICE/x.x request')) .match(' ', n('req_http_start')) .otherwise(p.error(ERROR.INVALID_CONSTANT, 'Expected HTTP/')); n('req_http_version').otherwise(span.version.start(n('req_http_major'))); n('req_http_major') .select(MAJOR, this.store('http_major', 'req_http_dot')) .otherwise(this.span.version.end(p.error(ERROR.INVALID_VERSION, 'Invalid major version'))); n('req_http_dot') .match('.', n('req_http_minor')) .otherwise(this.span.version.end(p.error(ERROR.INVALID_VERSION, 'Expected dot'))); n('req_http_minor') .select(MINOR, this.store('http_minor', checkVersion('req_http_end'))) .otherwise(this.span.version.end(p.error(ERROR.INVALID_VERSION, 'Invalid minor version'))); n('req_http_end').otherwise( span.version.end( this.invokePausable( 'on_version_complete', ERROR.CB_VERSION_COMPLETE, this.load('method', { [METHODS.PRI]: n('req_pri_upgrade'), }, n('req_http_complete')), ), ), ); n('req_http_complete') .match('\r', n('req_http_complete_crlf')) .match( '\n', checkIfAllowLFWithoutCR( n('req_http_complete_crlf'), p.error(ERROR.INVALID_VERSION, 'Expected CRLF after version'), ), ) .otherwise(p.error(ERROR.INVALID_VERSION, 'Expected CRLF after version')); n('req_http_complete_crlf') .match('\n', n('headers_start')) .otherwise(this.testLenientFlags(LENIENT_FLAGS.OPTIONAL_LF_AFTER_CR, { 1: n('headers_start'), }, p.error(ERROR.STRICT, 'Expected CRLF after version'))); n('req_pri_upgrade') .match('\r\n\r\nSM\r\n\r\n', p.error(ERROR.PAUSED_H2_UPGRADE, 'Pause on PRI/Upgrade')) .otherwise( p.error(ERROR.INVALID_VERSION, 'Expected HTTP/2 Connection Preface')); } private buildHeaders(): void { this.buildHeaderField(); this.buildHeaderValue(); } private buildHeaderField(): void { const p = this.llparse; const span = this.span; const n = (name: string): Match => this.node<Match>(name); const onInvalidHeaderFieldChar = p.error(ERROR.INVALID_HEADER_TOKEN, 'Invalid header field char'); n('headers_start') .match(' ', this.testLenientFlags(LENIENT_FLAGS.HEADERS, { 1: n('header_field_start'), }, p.error(ERROR.UNEXPECTED_SPACE, 'Unexpected space after start line')), ) .otherwise(n('header_field_start')); n('header_field_start') .match('\r', n('headers_almost_done')) .match('\n', this.testLenientFlags(LENIENT_FLAGS.OPTIONAL_CR_BEFORE_LF, { 1: this.testFlags(FLAGS.TRAILING, { 1: this.invokePausable('on_chunk_complete', ERROR.CB_CHUNK_COMPLETE, 'message_done'), }).otherwise(this.headersCompleted()), }, onInvalidHeaderFieldChar), ) .peek(':', p.error(ERROR.INVALID_HEADER_TOKEN, 'Invalid header token')) .otherwise(span.headerField.start(n('header_field'))); n('header_field') .transform(p.transform.toLower()) // Match headers that need special treatment .select(SPECIAL_HEADERS, this.store('header_state', 'header_field_colon')) .otherwise(this.resetHeaderState('header_field_general')); /* https://www.rfc-editor.org/rfc/rfc7230.html#section-3.3.3, paragraph 3. * * If a message is received with both a Transfer-Encoding and a * Content-Length header field, the Transfer-Encoding overrides the * Content-Length. Such a message might indicate an attempt to * perform request smuggling (Section 9.5) or response splitting * (Section 9.4) and **ought to be handled as an error**. A sender MUST * remove the received Content-Length field prior to forwarding such * a message downstream. * * Since llhttp 9, we go for the stricter approach and treat this as an error. */ const checkInvalidTransferEncoding = (otherwise: Node) => { return this.testFlags(FLAGS.CONTENT_LENGTH, { 1: this.testLenientFlags(LENIENT_FLAGS.CHUNKED_LENGTH, { 0: p.error(ERROR.INVALID_TRANSFER_ENCODING, 'Transfer-Encoding can\'t be present with Content-Length'), }).otherwise(otherwise), }).otherwise(otherwise); }; const checkInvalidContentLength = (otherwise: Node) => { return this.testFlags(FLAGS.TRANSFER_ENCODING, { 1: this.testLenientFlags(LENIENT_FLAGS.CHUNKED_LENGTH, { 0: p.error(ERROR.INVALID_CONTENT_LENGTH, 'Content-Length can\'t be present with Transfer-Encoding'), }).otherwise(otherwise), }).otherwise(otherwise); }; const onHeaderFieldComplete = this.invokePausable( 'on_header_field_complete', ERROR.CB_HEADER_FIELD_COMPLETE, this.load('header_state', { [HEADER_STATE.TRANSFER_ENCODING]: checkInvalidTransferEncoding(n('header_value_discard_ws')), [HEADER_STATE.CONTENT_LENGTH]: checkInvalidContentLength(n('header_value_discard_ws')), }, 'header_value_discard_ws'), ); const checkLenientFlagsOnColon = this.testLenientFlags(LENIENT_FLAGS.HEADERS, { 1: n('header_field_colon_discard_ws'), }, span.headerField.end().skipTo(onInvalidHeaderFieldChar)); n('header_field_colon') // https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4 // Whitespace character is not allowed between the header field-name // and colon. If the next token matches whitespace then throw an error. // // Add a check for the lenient flag. If the lenient flag is set, the // whitespace token is allowed to support legacy code not following // http specs. .peek(' ', checkLenientFlagsOnColon) .peek(':', span.headerField.end().skipTo(onHeaderFieldComplete)) // Fallback to general header, there're additional characters: // `Connection-Duration` instead of `Connection` and so on. .otherwise(this.resetHeaderState('header_field_general')); n('header_field_colon_discard_ws') .match(' ', n('header_field_colon_discard_ws')) .otherwise(n('header_field_colon')); n('header_field_general') .match(this.TOKEN, n('header_field_general')) .otherwise(n('header_field_general_otherwise')); // Just a performance optimization, split the node so that the fast case // remains in `header_field_general` n('header_field_general_otherwise') .peek(':', span.headerField.end().skipTo(onHeaderFieldComplete)) .otherwise(p.error(ERROR.INVALID_HEADER_TOKEN, 'Invalid header token')); } private buildHeaderValue(): void { const p = this.llparse; const span = this.span; const callback = this.callback; const n = (name: string): Match => this.node<Match>(name); const fallback = this.resetHeaderState('header_value'); n('header_value_discard_ws') .match([ ' ', '\t' ], n('header_value_discard_ws')) .match('\r', n('header_value_discard_ws_almost_done')) .match('\n', this.testLenientFlags(LENIENT_FLAGS.OPTIONAL_CR_BEFORE_LF, { 1: n('header_value_discard_lws'), }, p.error(ERROR.INVALID_HEADER_TOKEN, 'Invalid header value char'))) .otherwise(span.headerValue.start(n('header_value_start'))); n('header_value_discard_ws_almost_done') .match('\n', n('header_value_discard_lws')) .otherwise( this.testLenientFlags(LENIENT_FLAGS.HEADERS, { 1: n('header_value_discard_lws'), }, p.error(ERROR.STRICT, 'Expected LF after CR')), ); const onHeaderValueComplete = this.invokePausable( 'on_header_value_complete', ERROR.CB_HEADER_VALUE_COMPLETE, n('header_field_start'), ); const emptyContentLengthError = p.error( ERROR.INVALID_CONTENT_LENGTH, 'Empty Content-Length'); const checkContentLengthEmptiness = this.load('header_state', { [HEADER_STATE.CONTENT_LENGTH]: emptyContentLengthError, }, this.setHeaderFlags( this.emptySpan(span.headerValue, onHeaderValueComplete))); n('header_value_discard_lws') .match([ ' ', '\t' ], this.testLenientFlags(LENIENT_FLAGS.HEADERS, { 1: n('header_value_discard_ws'), }, p.error(ERROR.INVALID_HEADER_TOKEN, 'Invalid header value char'))) .otherwise(checkContentLengthEmptiness); // Multiple `Transfer-Encoding` headers should be treated as one, but with // values separate by a comma. // // See: https://tools.ietf.org/html/rfc7230#section-3.2.2 const toTransferEncoding = this.unsetFlag( FLAGS.CHUNKED, 'header_value_te_chunked'); // Once chunked has been selected, no other encoding is possible in requests // https://datatracker.ietf.org/doc/html/rfc7230#section-3.3.1 const forbidAfterChunkedInRequest = (otherwise: Node) => { return this.load('type', { [TYPE.REQUEST]: this.testLenientFlags(LENIENT_FLAGS.TRANSFER_ENCODING, { 0: span.headerValue.end().skipTo( p.error(ERROR.INVALID_TRANSFER_ENCODING, 'Invalid `Transfer-Encoding` header value'), ), }).otherwise(otherwise), }, otherwise); }; n('header_value_start') .otherwise(this.load('header_state', { [HEADER_STATE.UPGRADE]: this.setFlag(FLAGS.UPGRADE, fallback), [HEADER_STATE.TRANSFER_ENCODING]: this.testFlags( FLAGS.CHUNKED, { 1: forbidAfterChunkedInRequest(this.setFlag(FLAGS.TRANSFER_ENCODING, toTransferEncoding)), }, this.setFlag(FLAGS.TRANSFER_ENCODING, toTransferEncoding)), [HEADER_STATE.CONTENT_LENGTH]: n('header_value_content_length_once'), [HEADER_STATE.CONNECTION]: n('header_value_connection'), }, 'header_value')); // // Transfer-Encoding // n('header_value_te_chunked') .transform(p.transform.toLowerUnsafe()) .match( 'chunked', n('header_value_te_chunked_last'), ) .otherwise(n('header_value_te_token')); n('header_value_te_chunked_last') .match(' ', n('header_value_te_chunked_last')) .peek([ '\r', '\n' ], this.update('header_state', HEADER_STATE.TRANSFER_ENCODING_CHUNKED, 'header_value_otherwise')) .peek(',', forbidAfterChunkedInRequest(n('header_value_te_chunked'))) .otherwise(n('header_value_te_token')); n('header_value_te_token') .match(',', n('header_value_te_token_ows')) .match(CONNECTION_TOKEN_CHARS, n('header_value_te_token')) .otherwise(fallback); n('header_value_te_token_ows') .match([ ' ', '\t' ], n('header_value_te_token_ows')) .otherwise(n('header_value_te_chunked')); // // Content-Length // const invalidContentLength = (reason: string): Node => { // End span for easier testing // TODO(indutny): minimize code size return span.headerValue.end() .otherwise(p.error(ERROR.INVALID_CONTENT_LENGTH, reason)); }; n('header_value_content_length_once') .otherwise(this.testFlags(FLAGS.CONTENT_LENGTH, { 0: n('header_value_content_length'), }, p.error(ERROR.UNEXPECTED_CONTENT_LENGTH, 'Duplicate Content-Length'))); n('header_value_content_length') .select(NUM_MAP, this.mulAdd('content_length', { overflow: invalidContentLength('Content-Length overflow'), success: 'header_value_content_length', })) .otherwise(n('header_value_content_length_ws')); n('header_value_content_length_ws') .match(' ', n('header_value_content_length_ws')) .peek([ '\r', '\n' ], this.setFlag(FLAGS.CONTENT_LENGTH, 'header_value_otherwise')) .otherwise(invalidContentLength('Invalid character in Content-Length')); // // Connection // n('header_value_connection') .transform(p.transform.toLower()) // TODO(indutny): extra node for token back-edge? // Skip lws .match([ ' ', '\t' ], n('header_value_connection')) .match( 'close', this.update('header_state', HEADER_STATE.CONNECTION_CLOSE, 'header_value_connection_ws'), ) .match( 'upgrade', this.update('header_state', HEADER_STATE.CONNECTION_UPGRADE, 'header_value_connection_ws'), ) .match( 'keep-alive', this.update('header_state', HEADER_STATE.CONNECTION_KEEP_ALIVE, 'header_value_connection_ws'), ) .otherwise(n('header_value_connection_token')); n('header_value_connection_ws') .match(',', this.setHeaderFlags('header_value_connection')) .match(' ', n('header_value_connection_ws')) .peek([ '\r', '\n' ], n('header_value_otherwise')) .otherwise(this.resetHeaderState('header_value_connection_token')); n('header_value_connection_token') .match(',', n('header_value_connection')) .match(CONNECTION_TOKEN_CHARS, n('header_value_connection_token')) .otherwise(n('header_value_otherwise')); // Split for performance reasons n('header_value') .match(HEADER_CHARS, n('header_value')) .otherwise(n('header_value_otherwise')); const checkIfAllowLFWithoutCR = (success: Node, failure: Node) => { return this.testLenientFlags(LENIENT_FLAGS.OPTIONAL_CR_BEFORE_LF, { 1: success }, failure); }; const checkLenient = this.testLenientFlags(LENIENT_FLAGS.HEADERS, { 1: n('header_value_lenient'), }, span.headerValue.end(p.error(ERROR.INVALID_HEADER_TOKEN, 'Invalid header value char'))); n('header_value_otherwise') .peek('\r', span.headerValue.end().skipTo(n('header_value_almost_done'))) .peek( '\n', span.headerValue.end( checkIfAllowLFWithoutCR( n('header_value_almost_done'), p.error(ERROR.CR_EXPECTED, 'Missing expected CR after header value'), ), ), ) .otherwise(checkLenient); n('header_value_lenient') .peek('\r', span.headerValue.end().skipTo(n('header_value_almost_done'))) .peek('\n', span.headerValue.end(n('header_value_almost_done'))) .skipTo(n('header_value_lenient')); n('header_value_almost_done') .match('\n', n('header_value_lws')) .otherwise(p.error(ERROR.LF_EXPECTED, 'Missing expected LF after header value')); n('header_value_lws') .peek( [ ' ', '\t' ], this.testLenientFlags(LENIENT_FLAGS.HEADERS, { 1: this.load('header_state', { [HEADER_STATE.TRANSFER_ENCODING_CHUNKED]: this.resetHeaderState(span.headerValue.start(n('header_value_start'))), }, span.headerValue.start(n('header_value_start'))), }, p.error(ERROR.INVALID_HEADER_TOKEN, 'Unexpected whitespace after header value'))) .otherwise(this.setHeaderFlags(onHeaderValueComplete)); const checkTrailing = this.testFlags(FLAGS.TRAILING, { 1: this.invokePausable('on_chunk_complete', ERROR.CB_CHUNK_COMPLETE, 'message_done'), }).otherwise(this.headersCompleted()); n('headers_almost_done') .match('\n', checkTrailing) .otherwise( this.testLenientFlags(LENIENT_FLAGS.OPTIONAL_LF_AFTER_CR, { 1: checkTrailing, }, p.error(ERROR.STRICT, 'Expected LF after headers'))); const upgradePause = p.pause(ERROR.PAUSED_UPGRADE, 'Pause on CONNECT/Upgrade'); const afterHeadersComplete = p.invoke(callback.afterHeadersComplete, { 1: this.invokePausable('on_message_complete', ERROR.CB_MESSAGE_COMPLETE, upgradePause), 2: n('chunk_size_start'), 3: n('body_identity'), 4: n('body_identity_eof'), // non-chunked `Transfer-Encoding` for request, see `src/native/http.c` 5: p.error(ERROR.INVALID_TRANSFER_ENCODING, 'Request has invalid `Transfer-Encoding`'), }); n('headers_done') .otherwise(afterHeadersComplete); upgradePause .otherwise(n('cleanup')); afterHeadersComplete .otherwise(this.invokePausable('on_message_complete', ERROR.CB_MESSAGE_COMPLETE, 'cleanup')); n('body_identity') .otherwise(span.body.start() .otherwise(p.consume('content_length').otherwise( span.body.end(n('message_done'))))); n('body_identity_eof') .otherwise( this.update('finish', FINISH.SAFE_WITH_CB, span.body.start(n('eof')))); // Just read everything until EOF n('eof') .skipTo(n('eof')); n('chunk_size_start') .otherwise(this.update('content_length', 0, 'chunk_size_digit')); const addContentLength = this.mulAdd('content_length', { overflow: p.error(ERROR.INVALID_CHUNK_SIZE, 'Chunk size overflow'), success: 'chunk_size', }, { signed: false, base: 0x10 }); n('chunk_size_digit') .select(HEX_MAP, addContentLength) .otherwise(p.error(ERROR.INVALID_CHUNK_SIZE, 'Invalid character in chunk size')); n('chunk_size') .select(HEX_MAP, addContentLength) .otherwise(n('chunk_size_otherwise')); n('chunk_size_otherwise') .match( [ ' ', '\t' ], this.testLenientFlags( LENIENT_FLAGS.SPACES_AFTER_CHUNK_SIZE, { 1: n('chunk_size_otherwise'), }, p.error(ERROR.INVALID_CHUNK_SIZE, 'Invalid character in chunk size'), ), ) .match('\r', n('chunk_size_almost_done')) .match( '\n', checkIfAllowLFWithoutCR( n('chunk_size_almost_done'), p.error(ERROR.CR_EXPECTED, 'Missing expected CR after chunk size'), ), ) .match(';', n('chunk_extensions')) .otherwise(p.error(ERROR.INVALID_CHUNK_SIZE, 'Invalid character in chunk size')); const onChunkExtensionNameCompleted = (destination: Node) => { return this.invokePausable( 'on_chunk_extension_name', ERROR.CB_CHUNK_EXTENSION_NAME_COMPLETE, destination); }; const onChunkExtensionValueCompleted = (destination: Node) => { return this.invokePausable( 'on_chunk_extension_value', ERROR.CB_CHUNK_EXTENSION_VALUE_COMPLETE, destination); }; n('chunk_extensions') .match(' ', p.error(ERROR.STRICT, 'Invalid character in chunk extensions')) .match('\r', p.error(ERROR.STRICT, 'Invalid character in chunk extensions')) .otherwise(this.span.chunkExtensionName.start(n('chunk_extension_name'))); n('chunk_extension_name') .match(TOKEN, n('chunk_extension_name')) .peek('=', this.span.chunkExtensionName.end().skipTo( this.span.chunkExtensionValue.start( onChunkExtensionNameCompleted(n('chunk_extension_value')), ), )) .peek(';', this.span.chunkExtensionName.end().skipTo( onChunkExtensionNameCompleted(n('chunk_extensions')), )) .peek('\r', this.span.chunkExtensionName.end().skipTo( onChunkExtensionNameCompleted(n('chunk_size_almost_done')), )) .peek('\n', this.span.chunkExtensionName.end( onChunkExtensionNameCompleted( checkIfAllowLFWithoutCR( n('chunk_size_almost_done'), p.error(ERROR.CR_EXPECTED, 'Missing expected CR after chunk extension name'), ), ), )) .otherwise(this.span.chunkExtensionName.end().skipTo( p.error(ERROR.STRICT, 'Invalid character in chunk extensions name'), )); n('chunk_extension_value') .match('"', n('chunk_extension_quoted_value')) .match(TOKEN, n('chunk_extension_value')) .peek(';', this.span.chunkExtensionValue.end().skipTo( onChunkExtensionValueCompleted(n('chunk_extensions')), )) .peek('\r', this.span.chunkExtensionValue.end().skipTo( onChunkExtensionValueCompleted(n('chunk_size_almost_done')), )) .peek('\n', this.span.chunkExtensionValue.end( onChunkExtensionValueCompleted( checkIfAllowLFWithoutCR( n('chunk_size_almost_done'), p.error(ERROR.CR_EXPECTED, 'Missing expected CR after chunk extension value'), ), ), )) .otherwise(this.span.chunkExtensionValue.end().skipTo( p.error(ERROR.STRICT, 'Invalid character in chunk extensions value'), )); n('chunk_extension_quoted_value') .match(QUOTED_STRING, n('chunk_extension_quoted_value')) .match('"', this.span.chunkExtensionValue.end( onChunkExtensionValueCompleted(n('chunk_extension_quoted_value_done')), )) .match('\\', n('chunk_extension_quoted_value_quoted_pair')) .otherwise(this.span.chunkExtensionValue.end().skipTo( p.error(ERROR.STRICT, 'Invalid character in chunk extensions quoted value'), )); n('chunk_extension_quoted_value_quoted_pair') .match(HTAB_SP_VCHAR_OBS_TEXT, n('chunk_extension_quoted_value')) .otherwise(this.span.chunkExtensionValue.end().skipTo( p.error(ERROR.STRICT, 'Invalid quoted-pair in chunk extensions quoted value'), )); n('chunk_extension_quoted_value_done') .match(';', n('chunk_extensions')) .match('\r', n('chunk_size_almost_done')) .peek( '\n', checkIfAllowLFWithoutCR( n('chunk_size_almost_done'), p.error(ERROR.CR_EXPECTED, 'Missing expected CR after chunk extension value'), ), ) .otherwise(p.error(ERROR.STRICT, 'Invalid character in chunk extensions quote value')); n('chunk_size_almost_done') .match('\n', n('chunk_size_almost_done_lf')) .otherwise( this.testLenientFlags(LENIENT_FLAGS.OPTIONAL_LF_AFTER_CR, { 1: n('chunk_size_almost_done_lf'), }).otherwise(p.error(ERROR.STRICT, 'Expected LF after chunk size')), ); const toChunk = this.isEqual('content_length', 0, { equal: this.setFlag(FLAGS.TRAILING, 'header_field_start'), notEqual: 'chunk_data', }); n('chunk_size_almost_done_lf') .otherwise(this.invokePausable('on_chunk_header', ERROR.CB_CHUNK_HEADER, toChunk)); n('chunk_data') .otherwise(span.body.start() .otherwise(p.consume('content_length').otherwise( span.body.end(n('chunk_data_almost_done'))))); n('chunk_data_almost_done') .match('\r\n', n('chunk_complete')) .match( '\n', checkIfAllowLFWithoutCR( n('chunk_complete'), p.error(ERROR.CR_EXPECTED, 'Missing expected CR after chunk data'), ), ) .otherwise( this.testLenientFlags(LENIENT_FLAGS.OPTIONAL_CRLF_AFTER_CHUNK, { 1: n('chunk_complete'), }).otherwise(p.error(ERROR.STRICT, 'Expected LF after chunk data')), ); n('chunk_complete') .otherwise(this.invokePausable('on_chunk_complete', ERROR.CB_CHUNK_COMPLETE, 'chunk_size_start')); const upgradeAfterDone = this.isEqual('upgrade', 1, { // Exit, the rest of the message is in a different protocol. equal: upgradePause, // Restart notEqual: 'cleanup', }); n('message_done') .otherwise(this.invokePausable('on_message_complete', ERROR.CB_MESSAGE_COMPLETE, upgradeAfterDone)); const lenientClose = this.testLenientFlags(LENIENT_FLAGS.KEEP_ALIVE, { 1: n('restart'), }, n('closed')); // Check if we'd like to keep-alive n('cleanup') .otherwise(p.invoke(callback.afterMessageComplete, { 1: this.update('content_length', 0, n('restart')), }, this.update('finish', FINISH.SAFE, lenientClose))); const lenientDiscardAfterClose = this.testLenientFlags(LENIENT_FLAGS.DATA_AFTER_CLOSE, { 1: n('closed'), }, p.error(ERROR.CLOSED_CONNECTION, 'Data after `Connection: close`')); n('closed') .match([ '\r', '\n' ], n('closed')) .skipTo(lenientDiscardAfterClose); n('restart') .otherwise( this.update('initial_message_completed', 1, this.update('finish', FINISH.SAFE, n('start')), )); } private headersCompleted(): Node { const p = this.llparse; const callback = this.callback; const n = (name: string): Match => this.node<Match>(name); // Set `upgrade` if needed const beforeHeadersComplete = p.invoke(callback.beforeHeadersComplete); /* Here we call the headers_complete callback. This is somewhat * different than other callbacks because if the user returns 1, we * will interpret that as saying that this message has no body. This * is needed for the annoying case of receiving a response to a HEAD * request. * * We'd like to use CALLBACK_NOTIFY_NOADVANCE() here but we cannot, so * we have to simulate it by handling a change in errno below. */ const onHeadersComplete = p.invoke(callback.onHeadersComplete, { 0: n('headers_done'), 1: this.setFlag(FLAGS.SKIPBODY, 'headers_done'), 2: this.update('upgrade', 1, this.setFlag(FLAGS.SKIPBODY, 'headers_done')), [ERROR.PAUSED]: this.pause('Paused by on_headers_complete', 'headers_done'), }, p.error(ERROR.CB_HEADERS_COMPLETE, 'User callback error')); beforeHeadersComplete.otherwise(onHeadersComplete); return beforeHeadersComplete; } private node<T extends Node>(name: string | T): T { if (name instanceof Node) { return name; } assert(this.nodes.has(name), `Unknown node with name "${name}"`); return this.nodes.get(name) as unknown as T; } private load(field: string, map: { [key: number]: Node }, next?: string | Node): Node { const p = this.llparse; const res = p.invoke(p.code.load(field), map); if (next !== undefined) { res.otherwise(this.node(next)); } return res; } private store(field: string, next?: string | Node): Node { const p = this.llparse; const res = p.invoke(p.code.store(field)); if (next !== undefined) { res.otherwise(this.node(next)); } return res; } private update(field: string, value: number, next?: string | Node): Node { const p = this.llparse; const res = p.invoke(p.code.update(field, value)); if (next !== undefined) { res.otherwise(this.node(next)); } return res; } private resetHeaderState(next: string | Node): Node { return this.update('header_state', HEADER_STATE.GENERAL, next); } private emptySpan(span: source.Span, next: string | Node): Node { return span.start(span.end(this.node(next))); } private unsetFlag(flag: number, next: string | Node): Node { const p = this.llparse; return p.invoke(p.code.and('flags', ~flag), this.node(next)); } private setFlag(flag: number, next: string | Node): Node { const p = this.llparse; return p.invoke(p.code.or('flags', flag), this.node(next)); } private testFlags(flag: number, map: { [key: number]: Node }, next?: string | Node): Node { const p = this.llparse; const res = p.invoke(p.code.test('flags', flag), map); if (next !== undefined) { res.otherwise(this.node(next)); } return res; } private testLenientFlags(flag: number, map: { [key: number]: Node }, next?: string | Node): Node { const p = this.llparse; const res = p.invoke(p.code.test('lenient_flags', flag), map); if (next !== undefined) { res.otherwise(this.node(next)); } return res; } private setHeaderFlags(next: string | Node): Node { const HS = HEADER_STATE; const F = FLAGS; const toConnection = this.update('header_state', HEADER_STATE.CONNECTION, next); return this.load('header_state', { [HS.CONNECTION_KEEP_ALIVE]: this.setFlag(F.CONNECTION_KEEP_ALIVE, toConnection), [HS.CONNECTION_CLOSE]: this.setFlag(F.CONNECTION_CLOSE, toConnection), [HS.CONNECTION_UPGRADE]: this.setFlag(F.CONNECTION_UPGRADE, toConnection), [HS.TRANSFER_ENCODING_CHUNKED]: this.setFlag(F.CHUNKED, next), }, this.node(next)); } private mulAdd(field: string, targets: IMulTargets, options: IMulOptions = { base: 10, signed: false }): Node { const p = this.llparse; return p.invoke(p.code.mulAdd(field, options), { 1: this.node(targets.overflow), }, this.node(targets.success)); } private isEqual(field: string, value: number, map: IIsEqualTargets) { const p = this.llparse; return p.invoke(p.code.isEqual(field, value), { 0: this.node(map.notEqual), }, this.node(map.equal)); } private pause(msg: string, next?: string | Node) { const p = this.llparse; const res = p.pause(ERROR.PAUSED, msg); if (next !== undefined) { res.otherwise(this.node(next)); } return res; } private invokePausable(name: string, errorCode: number, next: string | Node): Node { let cb; switch (name) { case 'on_message_begin': cb = this.callback.onMessageBegin; break; case 'on_url_complete': cb = this.callback.onUrlComplete; break; case 'on_status_complete': cb = this.callback.onStatusComplete; break; case 'on_method_complete': cb = this.callback.onMethodComplete; break; case 'on_version_complete': cb = this.callback.onVersionComplete; break; case 'on_header_field_complete': cb = this.callback.onHeaderFieldComplete; break; case 'on_header_value_complete': cb = this.callback.onHeaderValueComplete; break; case 'on_message_complete': cb = this.callback.onMessageComplete; break; case 'on_chunk_header': cb = this.callback.onChunkHeader; break; case 'on_chunk_extension_name': cb = this.callback.onChunkExtensionName; break; case 'on_chunk_extension_value': cb = this.callback.onChunkExtensionValue; break; case 'on_chunk_complete': cb = this.callback.onChunkComplete; break; case 'on_reset': cb = this.callback.onReset; break; default: throw new Error('Unknown callback: ' + name); } const p = this.llparse; return p.invoke(cb, { 0: this.node(next), [ERROR.PAUSED]: this.pause(`${name} pause`, next), }, p.error(errorCode, `\`${name}\` callback error`)); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/src/llhttp/url.ts�������������������������������������������������������0000644�0001751�0000177�00000014310�14607525267�020676� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import { LLParse, source } from 'llparse'; import Match = source.node.Match; import Node = source.node.Node; import { ALPHA, CharList, ERROR, URL_CHAR, USERINFO_CHARS, } from './constants'; type SpanName = 'schema' | 'host' | 'path' | 'query' | 'fragment' | 'url'; export interface IURLResult { readonly entry: { readonly normal: Node; readonly connect: Node; }; readonly exit: { readonly toHTTP: Node; readonly toHTTP09: Node; }; } type SpanTable = Map<SpanName, source.Span>; export class URL { private readonly spanTable: SpanTable = new Map(); private readonly errorInvalid: Node; private readonly URL_CHAR: CharList; constructor(private readonly llparse: LLParse, separateSpans: boolean = false) { const p = this.llparse; this.errorInvalid = p.error(ERROR.INVALID_URL, 'Invalid characters in url'); this.URL_CHAR = URL_CHAR; const table = this.spanTable; if (separateSpans) { table.set('schema', p.span(p.code.span('llhttp__on_url_schema'))); table.set('host', p.span(p.code.span('llhttp__on_url_host'))); table.set('path', p.span(p.code.span('llhttp__on_url_path'))); table.set('query', p.span(p.code.span('llhttp__on_url_query'))); table.set('fragment', p.span(p.code.span('llhttp__on_url_fragment'))); } else { table.set('url', p.span(p.code.span('llhttp__on_url'))); } } public build(): IURLResult { const p = this.llparse; const entry = { connect: this.node('entry_connect'), normal: this.node('entry_normal'), }; const start = this.node('start'); const path = this.node('path'); const queryOrFragment = this.node('query_or_fragment'); const schema = this.node('schema'); const schemaDelim = this.node('schema_delim'); const server = this.node('server'); const queryStart = this.node('query_start'); const query = this.node('query'); const fragment = this.node('fragment'); const serverWithAt = this.node('server_with_at'); entry.normal .otherwise(this.spanStart('url', start)); entry.connect .otherwise(this.spanStart('url', this.spanStart('host', server))); start .peek([ '/', '*' ], this.spanStart('path').skipTo(path)) .peek(ALPHA, this.spanStart('schema', schema)) .otherwise(p.error(ERROR.INVALID_URL, 'Unexpected start char in url')); schema .match(ALPHA, schema) .peek(':', this.spanEnd('schema').skipTo(schemaDelim)) .otherwise(p.error(ERROR.INVALID_URL, 'Unexpected char in url schema')); schemaDelim .match('//', this.spanStart('host', server)) .otherwise(p.error(ERROR.INVALID_URL, 'Unexpected char in url schema')); for (const node of [ server, serverWithAt ]) { node .peek('/', this.spanEnd('host', this.spanStart('path').skipTo(path))) .match('?', this.spanEnd('host', this.spanStart('query', query))) .match(USERINFO_CHARS, server) .match([ '[', ']' ], server) .otherwise(p.error(ERROR.INVALID_URL, 'Unexpected char in url server')); if (node !== serverWithAt) { node.match('@', serverWithAt); } } serverWithAt .match('@', p.error(ERROR.INVALID_URL, 'Double @ in url')); path .match(this.URL_CHAR, path) .otherwise(this.spanEnd('path', queryOrFragment)); // Performance optimization, split `path` so that the fast case remains // there queryOrFragment .match('?', this.spanStart('query', query)) .match('#', this.spanStart('fragment', fragment)) .otherwise(p.error(ERROR.INVALID_URL, 'Invalid char in url path')); query .match(this.URL_CHAR, query) // Allow extra '?' in query string .match('?', query) .peek('#', this.spanEnd('query') .skipTo(this.spanStart('fragment', fragment))) .otherwise(p.error(ERROR.INVALID_URL, 'Invalid char in url query')); fragment .match(this.URL_CHAR, fragment) .match([ '?', '#' ], fragment) .otherwise( p.error(ERROR.INVALID_URL, 'Invalid char in url fragment start')); for (const node of [ start, schema, schemaDelim ]) { /* No whitespace allowed here */ node.match([ ' ', '\r', '\n' ], this.errorInvalid); } // Adaptors const toHTTP = this.node('to_http'); const toHTTP09 = this.node('to_http_09'); const skipToHTTP = this.node('skip_to_http') .skipTo(toHTTP); const skipToHTTP09 = this.node('skip_to_http09') .skipTo(toHTTP09); const skipCRLF = this.node('skip_lf_to_http09') .match('\r\n', toHTTP09) .otherwise(p.error(ERROR.INVALID_URL, 'Expected CRLF')); for (const node of [ server, serverWithAt, queryOrFragment, queryStart, query, fragment ]) { let spanName: SpanName | undefined; if (node === server || node === serverWithAt) { spanName = 'host'; } else if (node === queryStart || node === query) { spanName = 'query'; } else if (node === fragment) { spanName = 'fragment'; } const endTo = (target: Node): Node => { let res: Node = this.spanEnd('url', target); if (spanName !== undefined) { res = this.spanEnd(spanName, res); } return res; }; node.peek(' ', endTo(skipToHTTP)); node.peek('\r', endTo(skipCRLF)); node.peek('\n', endTo(skipToHTTP09)); } return { entry, exit: { toHTTP, toHTTP09, }, }; } private spanStart(name: SpanName, otherwise?: Node): Node { let res: Node; if (this.spanTable.has(name)) { res = this.spanTable.get(name)!.start(); } else { res = this.llparse.node('span_start_stub_' + name); } if (otherwise !== undefined) { res.otherwise(otherwise); } return res; } private spanEnd(name: SpanName, otherwise?: Node): Node { let res: Node; if (this.spanTable.has(name)) { res = this.spanTable.get(name)!.end(); } else { res = this.llparse.node('span_end_stub_' + name); } if (otherwise !== undefined) { res.otherwise(otherwise); } return res; } private node(name: string): Match { const res = this.llparse.node('url_' + name); res.match([ '\t', '\f' ], this.errorInvalid); return res; } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/src/llhttp/utils.ts�����������������������������������������������������0000644�0001751�0000177�00000001021�14607525267�021227� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import { IntDict } from './constants'; export function enumToMap( obj: IntDict, filter: ReadonlyArray<number> = [], exceptions: ReadonlyArray<number> = [], ): IntDict { const emptyFilter = (filter?.length ?? 0) === 0; const emptyExceptions = (exceptions?.length ?? 0) === 0; return Object.fromEntries(Object.entries(obj).filter(([ , value ]) => { return ( typeof value === 'number' && (emptyFilter || filter.includes(value)) && (emptyExceptions || !exceptions.includes(value)) ); })); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/src/llhttp.gyp����������������������������������������������������������0000644�0001751�0000177�00000000615�14607525267�020250� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ 'variables': { 'llhttp_sources': [ 'src/llhttp.c', 'src/api.c', 'src/http.c', ] }, 'targets': [ { 'target_name': 'llhttp', 'type': 'static_library', 'include_dirs': [ '.', 'include' ], 'direct_dependent_settings': { 'include_dirs': [ 'include' ], }, 'sources': [ '<@(llhttp_sources)', ], }, ] } �������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/src/llhttp.ts�����������������������������������������������������������0000644�0001751�0000177�00000000302�14607525267�020070� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import * as constants from './llhttp/constants'; export { constants }; export { HTTP } from './llhttp/http'; export { URL } from './llhttp/url'; export { CHeaders } from './llhttp/c-headers'; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000033�00000000000�010211� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������27 mtime=1713285830.555115 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/src/native/�������������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�017477� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/src/native/api.c��������������������������������������������������������0000644�0001751�0000177�00000031034�14607525267�020422� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <stdlib.h> #include <stdio.h> #include <string.h> #include "llhttp.h" #define CALLBACK_MAYBE(PARSER, NAME) \ do { \ const llhttp_settings_t* settings; \ settings = (const llhttp_settings_t*) (PARSER)->settings; \ if (settings == NULL || settings->NAME == NULL) { \ err = 0; \ break; \ } \ err = settings->NAME((PARSER)); \ } while (0) #define SPAN_CALLBACK_MAYBE(PARSER, NAME, START, LEN) \ do { \ const llhttp_settings_t* settings; \ settings = (const llhttp_settings_t*) (PARSER)->settings; \ if (settings == NULL || settings->NAME == NULL) { \ err = 0; \ break; \ } \ err = settings->NAME((PARSER), (START), (LEN)); \ if (err == -1) { \ err = HPE_USER; \ llhttp_set_error_reason((PARSER), "Span callback error in " #NAME); \ } \ } while (0) void llhttp_init(llhttp_t* parser, llhttp_type_t type, const llhttp_settings_t* settings) { llhttp__internal_init(parser); parser->type = type; parser->settings = (void*) settings; } #if defined(__wasm__) extern int wasm_on_message_begin(llhttp_t * p); extern int wasm_on_url(llhttp_t* p, const char* at, size_t length); extern int wasm_on_status(llhttp_t* p, const char* at, size_t length); extern int wasm_on_header_field(llhttp_t* p, const char* at, size_t length); extern int wasm_on_header_value(llhttp_t* p, const char* at, size_t length); extern int wasm_on_headers_complete(llhttp_t * p, int status_code, uint8_t upgrade, int should_keep_alive); extern int wasm_on_body(llhttp_t* p, const char* at, size_t length); extern int wasm_on_message_complete(llhttp_t * p); static int wasm_on_headers_complete_wrap(llhttp_t* p) { return wasm_on_headers_complete(p, p->status_code, p->upgrade, llhttp_should_keep_alive(p)); } const llhttp_settings_t wasm_settings = { wasm_on_message_begin, wasm_on_url, wasm_on_status, NULL, NULL, wasm_on_header_field, wasm_on_header_value, NULL, NULL, wasm_on_headers_complete_wrap, wasm_on_body, wasm_on_message_complete, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }; llhttp_t* llhttp_alloc(llhttp_type_t type) { llhttp_t* parser = malloc(sizeof(llhttp_t)); llhttp_init(parser, type, &wasm_settings); return parser; } void llhttp_free(llhttp_t* parser) { free(parser); } #endif // defined(__wasm__) /* Some getters required to get stuff from the parser */ uint8_t llhttp_get_type(llhttp_t* parser) { return parser->type; } uint8_t llhttp_get_http_major(llhttp_t* parser) { return parser->http_major; } uint8_t llhttp_get_http_minor(llhttp_t* parser) { return parser->http_minor; } uint8_t llhttp_get_method(llhttp_t* parser) { return parser->method; } int llhttp_get_status_code(llhttp_t* parser) { return parser->status_code; } uint8_t llhttp_get_upgrade(llhttp_t* parser) { return parser->upgrade; } void llhttp_reset(llhttp_t* parser) { llhttp_type_t type = parser->type; const llhttp_settings_t* settings = parser->settings; void* data = parser->data; uint16_t lenient_flags = parser->lenient_flags; llhttp__internal_init(parser); parser->type = type; parser->settings = (void*) settings; parser->data = data; parser->lenient_flags = lenient_flags; } llhttp_errno_t llhttp_execute(llhttp_t* parser, const char* data, size_t len) { return llhttp__internal_execute(parser, data, data + len); } void llhttp_settings_init(llhttp_settings_t* settings) { memset(settings, 0, sizeof(*settings)); } llhttp_errno_t llhttp_finish(llhttp_t* parser) { int err; /* We're in an error state. Don't bother doing anything. */ if (parser->error != 0) { return 0; } switch (parser->finish) { case HTTP_FINISH_SAFE_WITH_CB: CALLBACK_MAYBE(parser, on_message_complete); if (err != HPE_OK) return err; /* FALLTHROUGH */ case HTTP_FINISH_SAFE: return HPE_OK; case HTTP_FINISH_UNSAFE: parser->reason = "Invalid EOF state"; return HPE_INVALID_EOF_STATE; default: abort(); } } void llhttp_pause(llhttp_t* parser) { if (parser->error != HPE_OK) { return; } parser->error = HPE_PAUSED; parser->reason = "Paused"; } void llhttp_resume(llhttp_t* parser) { if (parser->error != HPE_PAUSED) { return; } parser->error = 0; } void llhttp_resume_after_upgrade(llhttp_t* parser) { if (parser->error != HPE_PAUSED_UPGRADE) { return; } parser->error = 0; } llhttp_errno_t llhttp_get_errno(const llhttp_t* parser) { return parser->error; } const char* llhttp_get_error_reason(const llhttp_t* parser) { return parser->reason; } void llhttp_set_error_reason(llhttp_t* parser, const char* reason) { parser->reason = reason; } const char* llhttp_get_error_pos(const llhttp_t* parser) { return parser->error_pos; } const char* llhttp_errno_name(llhttp_errno_t err) { #define HTTP_ERRNO_GEN(CODE, NAME, _) case HPE_##NAME: return "HPE_" #NAME; switch (err) { HTTP_ERRNO_MAP(HTTP_ERRNO_GEN) default: abort(); } #undef HTTP_ERRNO_GEN } const char* llhttp_method_name(llhttp_method_t method) { #define HTTP_METHOD_GEN(NUM, NAME, STRING) case HTTP_##NAME: return #STRING; switch (method) { HTTP_ALL_METHOD_MAP(HTTP_METHOD_GEN) default: abort(); } #undef HTTP_METHOD_GEN } const char* llhttp_status_name(llhttp_status_t status) { #define HTTP_STATUS_GEN(NUM, NAME, STRING) case HTTP_STATUS_##NAME: return #STRING; switch (status) { HTTP_STATUS_MAP(HTTP_STATUS_GEN) default: abort(); } #undef HTTP_STATUS_GEN } void llhttp_set_lenient_headers(llhttp_t* parser, int enabled) { if (enabled) { parser->lenient_flags |= LENIENT_HEADERS; } else { parser->lenient_flags &= ~LENIENT_HEADERS; } } void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled) { if (enabled) { parser->lenient_flags |= LENIENT_CHUNKED_LENGTH; } else { parser->lenient_flags &= ~LENIENT_CHUNKED_LENGTH; } } void llhttp_set_lenient_keep_alive(llhttp_t* parser, int enabled) { if (enabled) { parser->lenient_flags |= LENIENT_KEEP_ALIVE; } else { parser->lenient_flags &= ~LENIENT_KEEP_ALIVE; } } void llhttp_set_lenient_transfer_encoding(llhttp_t* parser, int enabled) { if (enabled) { parser->lenient_flags |= LENIENT_TRANSFER_ENCODING; } else { parser->lenient_flags &= ~LENIENT_TRANSFER_ENCODING; } } void llhttp_set_lenient_version(llhttp_t* parser, int enabled) { if (enabled) { parser->lenient_flags |= LENIENT_VERSION; } else { parser->lenient_flags &= ~LENIENT_VERSION; } } void llhttp_set_lenient_data_after_close(llhttp_t* parser, int enabled) { if (enabled) { parser->lenient_flags |= LENIENT_DATA_AFTER_CLOSE; } else { parser->lenient_flags &= ~LENIENT_DATA_AFTER_CLOSE; } } void llhttp_set_lenient_optional_lf_after_cr(llhttp_t* parser, int enabled) { if (enabled) { parser->lenient_flags |= LENIENT_OPTIONAL_LF_AFTER_CR; } else { parser->lenient_flags &= ~LENIENT_OPTIONAL_LF_AFTER_CR; } } void llhttp_set_lenient_optional_crlf_after_chunk(llhttp_t* parser, int enabled) { if (enabled) { parser->lenient_flags |= LENIENT_OPTIONAL_CRLF_AFTER_CHUNK; } else { parser->lenient_flags &= ~LENIENT_OPTIONAL_CRLF_AFTER_CHUNK; } } void llhttp_set_lenient_optional_cr_before_lf(llhttp_t* parser, int enabled) { if (enabled) { parser->lenient_flags |= LENIENT_OPTIONAL_CR_BEFORE_LF; } else { parser->lenient_flags &= ~LENIENT_OPTIONAL_CR_BEFORE_LF; } } void llhttp_set_lenient_spaces_after_chunk_size(llhttp_t* parser, int enabled) { if (enabled) { parser->lenient_flags |= LENIENT_SPACES_AFTER_CHUNK_SIZE; } else { parser->lenient_flags &= ~LENIENT_SPACES_AFTER_CHUNK_SIZE; } } /* Callbacks */ int llhttp__on_message_begin(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_message_begin); return err; } int llhttp__on_url(llhttp_t* s, const char* p, const char* endp) { int err; SPAN_CALLBACK_MAYBE(s, on_url, p, endp - p); return err; } int llhttp__on_url_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_url_complete); return err; } int llhttp__on_status(llhttp_t* s, const char* p, const char* endp) { int err; SPAN_CALLBACK_MAYBE(s, on_status, p, endp - p); return err; } int llhttp__on_status_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_status_complete); return err; } int llhttp__on_method(llhttp_t* s, const char* p, const char* endp) { int err; SPAN_CALLBACK_MAYBE(s, on_method, p, endp - p); return err; } int llhttp__on_method_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_method_complete); return err; } int llhttp__on_version(llhttp_t* s, const char* p, const char* endp) { int err; SPAN_CALLBACK_MAYBE(s, on_version, p, endp - p); return err; } int llhttp__on_version_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_version_complete); return err; } int llhttp__on_header_field(llhttp_t* s, const char* p, const char* endp) { int err; SPAN_CALLBACK_MAYBE(s, on_header_field, p, endp - p); return err; } int llhttp__on_header_field_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_header_field_complete); return err; } int llhttp__on_header_value(llhttp_t* s, const char* p, const char* endp) { int err; SPAN_CALLBACK_MAYBE(s, on_header_value, p, endp - p); return err; } int llhttp__on_header_value_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_header_value_complete); return err; } int llhttp__on_headers_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_headers_complete); return err; } int llhttp__on_message_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_message_complete); return err; } int llhttp__on_body(llhttp_t* s, const char* p, const char* endp) { int err; SPAN_CALLBACK_MAYBE(s, on_body, p, endp - p); return err; } int llhttp__on_chunk_header(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_chunk_header); return err; } int llhttp__on_chunk_extension_name(llhttp_t* s, const char* p, const char* endp) { int err; SPAN_CALLBACK_MAYBE(s, on_chunk_extension_name, p, endp - p); return err; } int llhttp__on_chunk_extension_name_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_chunk_extension_name_complete); return err; } int llhttp__on_chunk_extension_value(llhttp_t* s, const char* p, const char* endp) { int err; SPAN_CALLBACK_MAYBE(s, on_chunk_extension_value, p, endp - p); return err; } int llhttp__on_chunk_extension_value_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_chunk_extension_value_complete); return err; } int llhttp__on_chunk_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_chunk_complete); return err; } int llhttp__on_reset(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_reset); return err; } /* Private */ void llhttp__debug(llhttp_t* s, const char* p, const char* endp, const char* msg) { if (p == endp) { fprintf(stderr, "p=%p type=%d flags=%02x next=null debug=%s\n", s, s->type, s->flags, msg); } else { fprintf(stderr, "p=%p type=%d flags=%02x next=%02x debug=%s\n", s, s->type, s->flags, *p, msg); } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/src/native/api.h��������������������������������������������������������0000644�0001751�0000177�00000030572�14607525267�020435� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef INCLUDE_LLHTTP_API_H_ #define INCLUDE_LLHTTP_API_H_ #ifdef __cplusplus extern "C" { #endif #include <stddef.h> #if defined(__wasm__) #define LLHTTP_EXPORT __attribute__((visibility("default"))) #elif defined(_WIN32) #define LLHTTP_EXPORT __declspec(dllexport) #else #define LLHTTP_EXPORT #endif typedef llhttp__internal_t llhttp_t; typedef struct llhttp_settings_s llhttp_settings_t; typedef int (*llhttp_data_cb)(llhttp_t*, const char *at, size_t length); typedef int (*llhttp_cb)(llhttp_t*); struct llhttp_settings_s { /* Possible return values 0, -1, `HPE_PAUSED` */ llhttp_cb on_message_begin; /* Possible return values 0, -1, HPE_USER */ llhttp_data_cb on_url; llhttp_data_cb on_status; llhttp_data_cb on_method; llhttp_data_cb on_version; llhttp_data_cb on_header_field; llhttp_data_cb on_header_value; llhttp_data_cb on_chunk_extension_name; llhttp_data_cb on_chunk_extension_value; /* Possible return values: * 0 - Proceed normally * 1 - Assume that request/response has no body, and proceed to parsing the * next message * 2 - Assume absence of body (as above) and make `llhttp_execute()` return * `HPE_PAUSED_UPGRADE` * -1 - Error * `HPE_PAUSED` */ llhttp_cb on_headers_complete; /* Possible return values 0, -1, HPE_USER */ llhttp_data_cb on_body; /* Possible return values 0, -1, `HPE_PAUSED` */ llhttp_cb on_message_complete; llhttp_cb on_url_complete; llhttp_cb on_status_complete; llhttp_cb on_method_complete; llhttp_cb on_version_complete; llhttp_cb on_header_field_complete; llhttp_cb on_header_value_complete; llhttp_cb on_chunk_extension_name_complete; llhttp_cb on_chunk_extension_value_complete; /* When on_chunk_header is called, the current chunk length is stored * in parser->content_length. * Possible return values 0, -1, `HPE_PAUSED` */ llhttp_cb on_chunk_header; llhttp_cb on_chunk_complete; llhttp_cb on_reset; }; /* Initialize the parser with specific type and user settings. * * NOTE: lifetime of `settings` has to be at least the same as the lifetime of * the `parser` here. In practice, `settings` has to be either a static * variable or be allocated with `malloc`, `new`, etc. */ LLHTTP_EXPORT void llhttp_init(llhttp_t* parser, llhttp_type_t type, const llhttp_settings_t* settings); LLHTTP_EXPORT llhttp_t* llhttp_alloc(llhttp_type_t type); LLHTTP_EXPORT void llhttp_free(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_type(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_http_major(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_http_minor(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_method(llhttp_t* parser); LLHTTP_EXPORT int llhttp_get_status_code(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_upgrade(llhttp_t* parser); /* Reset an already initialized parser back to the start state, preserving the * existing parser type, callback settings, user data, and lenient flags. */ LLHTTP_EXPORT void llhttp_reset(llhttp_t* parser); /* Initialize the settings object */ LLHTTP_EXPORT void llhttp_settings_init(llhttp_settings_t* settings); /* Parse full or partial request/response, invoking user callbacks along the * way. * * If any of `llhttp_data_cb` returns errno not equal to `HPE_OK` - the parsing * interrupts, and such errno is returned from `llhttp_execute()`. If * `HPE_PAUSED` was used as a errno, the execution can be resumed with * `llhttp_resume()` call. * * In a special case of CONNECT/Upgrade request/response `HPE_PAUSED_UPGRADE` * is returned after fully parsing the request/response. If the user wishes to * continue parsing, they need to invoke `llhttp_resume_after_upgrade()`. * * NOTE: if this function ever returns a non-pause type error, it will continue * to return the same error upon each successive call up until `llhttp_init()` * is called. */ LLHTTP_EXPORT llhttp_errno_t llhttp_execute(llhttp_t* parser, const char* data, size_t len); /* This method should be called when the other side has no further bytes to * send (e.g. shutdown of readable side of the TCP connection.) * * Requests without `Content-Length` and other messages might require treating * all incoming bytes as the part of the body, up to the last byte of the * connection. This method will invoke `on_message_complete()` callback if the * request was terminated safely. Otherwise a error code would be returned. */ LLHTTP_EXPORT llhttp_errno_t llhttp_finish(llhttp_t* parser); /* Returns `1` if the incoming message is parsed until the last byte, and has * to be completed by calling `llhttp_finish()` on EOF */ LLHTTP_EXPORT int llhttp_message_needs_eof(const llhttp_t* parser); /* Returns `1` if there might be any other messages following the last that was * successfully parsed. */ LLHTTP_EXPORT int llhttp_should_keep_alive(const llhttp_t* parser); /* Make further calls of `llhttp_execute()` return `HPE_PAUSED` and set * appropriate error reason. * * Important: do not call this from user callbacks! User callbacks must return * `HPE_PAUSED` if pausing is required. */ LLHTTP_EXPORT void llhttp_pause(llhttp_t* parser); /* Might be called to resume the execution after the pause in user's callback. * See `llhttp_execute()` above for details. * * Call this only if `llhttp_execute()` returns `HPE_PAUSED`. */ LLHTTP_EXPORT void llhttp_resume(llhttp_t* parser); /* Might be called to resume the execution after the pause in user's callback. * See `llhttp_execute()` above for details. * * Call this only if `llhttp_execute()` returns `HPE_PAUSED_UPGRADE` */ LLHTTP_EXPORT void llhttp_resume_after_upgrade(llhttp_t* parser); /* Returns the latest return error */ LLHTTP_EXPORT llhttp_errno_t llhttp_get_errno(const llhttp_t* parser); /* Returns the verbal explanation of the latest returned error. * * Note: User callback should set error reason when returning the error. See * `llhttp_set_error_reason()` for details. */ LLHTTP_EXPORT const char* llhttp_get_error_reason(const llhttp_t* parser); /* Assign verbal description to the returned error. Must be called in user * callbacks right before returning the errno. * * Note: `HPE_USER` error code might be useful in user callbacks. */ LLHTTP_EXPORT void llhttp_set_error_reason(llhttp_t* parser, const char* reason); /* Returns the pointer to the last parsed byte before the returned error. The * pointer is relative to the `data` argument of `llhttp_execute()`. * * Note: this method might be useful for counting the number of parsed bytes. */ LLHTTP_EXPORT const char* llhttp_get_error_pos(const llhttp_t* parser); /* Returns textual name of error code */ LLHTTP_EXPORT const char* llhttp_errno_name(llhttp_errno_t err); /* Returns textual name of HTTP method */ LLHTTP_EXPORT const char* llhttp_method_name(llhttp_method_t method); /* Returns textual name of HTTP status */ LLHTTP_EXPORT const char* llhttp_status_name(llhttp_status_t status); /* Enables/disables lenient header value parsing (disabled by default). * * Lenient parsing disables header value token checks, extending llhttp's * protocol support to highly non-compliant clients/server. No * `HPE_INVALID_HEADER_TOKEN` will be raised for incorrect header values when * lenient parsing is "on". * * **Enabling this flag can pose a security issue since you will be exposed to * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_headers(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of conflicting `Transfer-Encoding` and * `Content-Length` headers (disabled by default). * * Normally `llhttp` would error when `Transfer-Encoding` is present in * conjunction with `Content-Length`. This error is important to prevent HTTP * request smuggling, but may be less desirable for small number of cases * involving legacy servers. * * **Enabling this flag can pose a security issue since you will be exposed to * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of `Connection: close` and HTTP/1.0 * requests responses. * * Normally `llhttp` would error on (in strict mode) or discard (in loose mode) * the HTTP request/response after the request/response with `Connection: close` * and `Content-Length`. This is important to prevent cache poisoning attacks, * but might interact badly with outdated and insecure clients. With this flag * the extra request/response will be parsed normally. * * **Enabling this flag can pose a security issue since you will be exposed to * poisoning attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_keep_alive(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of `Transfer-Encoding` header. * * Normally `llhttp` would error when a `Transfer-Encoding` has `chunked` value * and another value after it (either in a single header or in multiple * headers whose value are internally joined using `, `). * This is mandated by the spec to reliably determine request body size and thus * avoid request smuggling. * With this flag the extra value will be parsed normally. * * **Enabling this flag can pose a security issue since you will be exposed to * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_transfer_encoding(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of HTTP version. * * Normally `llhttp` would error when the HTTP version in the request or status line * is not `0.9`, `1.0`, `1.1` or `2.0`. * With this flag the invalid value will be parsed normally. * * **Enabling this flag can pose a security issue since you will allow unsupported * HTTP versions. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_version(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of additional data received after a message ends * and keep-alive is disabled. * * Normally `llhttp` would error when additional unexpected data is received if the message * contains the `Connection` header with `close` value. * With this flag the extra data will discarded without throwing an error. * * **Enabling this flag can pose a security issue since you will be exposed to * poisoning attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_data_after_close(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of incomplete CRLF sequences. * * Normally `llhttp` would error when a CR is not followed by LF when terminating the * request line, the status line, the headers or a chunk header. * With this flag only a CR is required to terminate such sections. * * **Enabling this flag can pose a security issue since you will be exposed to * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_optional_lf_after_cr(llhttp_t* parser, int enabled); /* * Enables/disables lenient handling of line separators. * * Normally `llhttp` would error when a LF is not preceded by CR when terminating the * request line, the status line, the headers, a chunk header or a chunk data. * With this flag only a LF is required to terminate such sections. * * **Enabling this flag can pose a security issue since you will be exposed to * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_optional_cr_before_lf(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of chunks not separated via CRLF. * * Normally `llhttp` would error when after a chunk data a CRLF is missing before * starting a new chunk. * With this flag the new chunk can start immediately after the previous one. * * **Enabling this flag can pose a security issue since you will be exposed to * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_optional_crlf_after_chunk(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of spaces after chunk size. * * Normally `llhttp` would error when after a chunk size is followed by one or more * spaces are present instead of a CRLF or `;`. * With this flag this check is disabled. * * **Enabling this flag can pose a security issue since you will be exposed to * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_spaces_after_chunk_size(llhttp_t* parser, int enabled); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* INCLUDE_LLHTTP_API_H_ */ ��������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/src/native/http.c�������������������������������������������������������0000644�0001751�0000177�00000012131�14607525267�020625� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <stdio.h> #ifndef LLHTTP__TEST # include "llhttp.h" #else # define llhttp_t llparse_t #endif /* */ int llhttp_message_needs_eof(const llhttp_t* parser); int llhttp_should_keep_alive(const llhttp_t* parser); int llhttp__before_headers_complete(llhttp_t* parser, const char* p, const char* endp) { /* Set this here so that on_headers_complete() callbacks can see it */ if ((parser->flags & F_UPGRADE) && (parser->flags & F_CONNECTION_UPGRADE)) { /* For responses, "Upgrade: foo" and "Connection: upgrade" are * mandatory only when it is a 101 Switching Protocols response, * otherwise it is purely informational, to announce support. */ parser->upgrade = (parser->type == HTTP_REQUEST || parser->status_code == 101); } else { parser->upgrade = (parser->method == HTTP_CONNECT); } return 0; } /* Return values: * 0 - No body, `restart`, message_complete * 1 - CONNECT request, `restart`, message_complete, and pause * 2 - chunk_size_start * 3 - body_identity * 4 - body_identity_eof * 5 - invalid transfer-encoding for request */ int llhttp__after_headers_complete(llhttp_t* parser, const char* p, const char* endp) { int hasBody; hasBody = parser->flags & F_CHUNKED || parser->content_length > 0; if ( (parser->upgrade && (parser->method == HTTP_CONNECT || (parser->flags & F_SKIPBODY) || !hasBody)) || /* See RFC 2616 section 4.4 - 1xx e.g. Continue */ (parser->type == HTTP_RESPONSE && parser->status_code == 101) ) { /* Exit, the rest of the message is in a different protocol. */ return 1; } if (parser->type == HTTP_RESPONSE && parser->status_code == 100) { /* No body, restart as the message is complete */ return 0; } /* See RFC 2616 section 4.4 */ if ( parser->flags & F_SKIPBODY || /* response to a HEAD request */ ( parser->type == HTTP_RESPONSE && ( parser->status_code == 102 || /* Processing */ parser->status_code == 103 || /* Early Hints */ parser->status_code == 204 || /* No Content */ parser->status_code == 304 /* Not Modified */ ) ) ) { return 0; } else if (parser->flags & F_CHUNKED) { /* chunked encoding - ignore Content-Length header, prepare for a chunk */ return 2; } else if (parser->flags & F_TRANSFER_ENCODING) { if (parser->type == HTTP_REQUEST && (parser->lenient_flags & LENIENT_CHUNKED_LENGTH) == 0 && (parser->lenient_flags & LENIENT_TRANSFER_ENCODING) == 0) { /* RFC 7230 3.3.3 */ /* If a Transfer-Encoding header field * is present in a request and the chunked transfer coding is not * the final encoding, the message body length cannot be determined * reliably; the server MUST respond with the 400 (Bad Request) * status code and then close the connection. */ return 5; } else { /* RFC 7230 3.3.3 */ /* If a Transfer-Encoding header field is present in a response and * the chunked transfer coding is not the final encoding, the * message body length is determined by reading the connection until * it is closed by the server. */ return 4; } } else { if (!(parser->flags & F_CONTENT_LENGTH)) { if (!llhttp_message_needs_eof(parser)) { /* Assume content-length 0 - read the next */ return 0; } else { /* Read body until EOF */ return 4; } } else if (parser->content_length == 0) { /* Content-Length header given but zero: Content-Length: 0\r\n */ return 0; } else { /* Content-Length header given and non-zero */ return 3; } } } int llhttp__after_message_complete(llhttp_t* parser, const char* p, const char* endp) { int should_keep_alive; should_keep_alive = llhttp_should_keep_alive(parser); parser->finish = HTTP_FINISH_SAFE; parser->flags = 0; /* NOTE: this is ignored in loose parsing mode */ return should_keep_alive; } int llhttp_message_needs_eof(const llhttp_t* parser) { if (parser->type == HTTP_REQUEST) { return 0; } /* See RFC 2616 section 4.4 */ if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */ parser->status_code == 204 || /* No Content */ parser->status_code == 304 || /* Not Modified */ (parser->flags & F_SKIPBODY)) { /* response to a HEAD request */ return 0; } /* RFC 7230 3.3.3, see `llhttp__after_headers_complete` */ if ((parser->flags & F_TRANSFER_ENCODING) && (parser->flags & F_CHUNKED) == 0) { return 1; } if (parser->flags & (F_CHUNKED | F_CONTENT_LENGTH)) { return 0; } return 1; } int llhttp_should_keep_alive(const llhttp_t* parser) { if (parser->http_major > 0 && parser->http_minor > 0) { /* HTTP/1.1 */ if (parser->flags & F_CONNECTION_CLOSE) { return 0; } } else { /* HTTP/1.0 or earlier */ if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) { return 0; } } return !llhttp_message_needs_eof(parser); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000033�00000000000�010211� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������27 mtime=1713285830.555115 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/�������������������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�016401� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000033�00000000000�010211� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������27 mtime=1713285830.555115 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/fixtures/����������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�020252� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/fixtures/extra.c���������������������������������������������������0000644�0001751�0000177�00000025303�14607525267�021551� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <stdlib.h> #include "fixture.h" int llhttp__on_url(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("url", p, endp); } int llhttp__on_url_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "url complete"); #ifdef LLHTTP__TEST_PAUSE_ON_URL_COMPLETE return LLPARSE__ERROR_PAUSE; #else return 0; #endif } int llhttp__on_url_schema(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("url.schema", p, endp); } int llhttp__on_url_host(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("url.host", p, endp); } int llhttp__on_url_path(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("url.path", p, endp); } int llhttp__on_url_query(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("url.query", p, endp); } int llhttp__on_url_fragment(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("url.fragment", p, endp); } #ifdef LLHTTP__TEST_HTTP void llhttp__test_init_request(llparse_t* s) { s->type = HTTP_REQUEST; } void llhttp__test_init_response(llparse_t* s) { s->type = HTTP_RESPONSE; } void llhttp__test_init_request_lenient_all(llparse_t* s) { llhttp__test_init_request(s); s->lenient_flags |= LENIENT_HEADERS | LENIENT_CHUNKED_LENGTH | LENIENT_KEEP_ALIVE | LENIENT_TRANSFER_ENCODING | LENIENT_VERSION | LENIENT_DATA_AFTER_CLOSE | LENIENT_OPTIONAL_LF_AFTER_CR | LENIENT_OPTIONAL_CR_BEFORE_LF | LENIENT_OPTIONAL_CRLF_AFTER_CHUNK; } void llhttp__test_init_response_lenient_all(llparse_t* s) { llhttp__test_init_response(s); s->lenient_flags |= LENIENT_HEADERS | LENIENT_CHUNKED_LENGTH | LENIENT_KEEP_ALIVE | LENIENT_TRANSFER_ENCODING | LENIENT_VERSION | LENIENT_DATA_AFTER_CLOSE | LENIENT_OPTIONAL_LF_AFTER_CR | LENIENT_OPTIONAL_CR_BEFORE_LF | LENIENT_OPTIONAL_CRLF_AFTER_CHUNK; } void llhttp__test_init_request_lenient_headers(llparse_t* s) { llhttp__test_init_request(s); s->lenient_flags |= LENIENT_HEADERS; } void llhttp__test_init_request_lenient_chunked_length(llparse_t* s) { llhttp__test_init_request(s); s->lenient_flags |= LENIENT_CHUNKED_LENGTH; } void llhttp__test_init_request_lenient_keep_alive(llparse_t* s) { llhttp__test_init_request(s); s->lenient_flags |= LENIENT_KEEP_ALIVE; } void llhttp__test_init_request_lenient_transfer_encoding(llparse_t* s) { llhttp__test_init_request(s); s->lenient_flags |= LENIENT_TRANSFER_ENCODING; } void llhttp__test_init_request_lenient_version(llparse_t* s) { llhttp__test_init_request(s); s->lenient_flags |= LENIENT_VERSION; } void llhttp__test_init_response_lenient_keep_alive(llparse_t* s) { llhttp__test_init_response(s); s->lenient_flags |= LENIENT_KEEP_ALIVE; } void llhttp__test_init_response_lenient_version(llparse_t* s) { llhttp__test_init_response(s); s->lenient_flags |= LENIENT_VERSION; } void llhttp__test_init_response_lenient_headers(llparse_t* s) { llhttp__test_init_response(s); s->lenient_flags |= LENIENT_HEADERS; } void llhttp__test_init_request_lenient_data_after_close(llparse_t* s) { llhttp__test_init_request(s); s->lenient_flags |= LENIENT_DATA_AFTER_CLOSE; } void llhttp__test_init_response_lenient_data_after_close(llparse_t* s) { llhttp__test_init_response(s); s->lenient_flags |= LENIENT_DATA_AFTER_CLOSE; } void llhttp__test_init_request_lenient_optional_lf_after_cr(llparse_t* s) { llhttp__test_init_request(s); s->lenient_flags |= LENIENT_OPTIONAL_LF_AFTER_CR; } void llhttp__test_init_response_lenient_optional_lf_after_cr(llparse_t* s) { llhttp__test_init_response(s); s->lenient_flags |= LENIENT_OPTIONAL_LF_AFTER_CR; } void llhttp__test_init_request_lenient_optional_cr_before_lf(llparse_t* s) { llhttp__test_init_request(s); s->lenient_flags |= LENIENT_OPTIONAL_CR_BEFORE_LF; } void llhttp__test_init_response_lenient_optional_cr_before_lf(llparse_t* s) { llhttp__test_init_response(s); s->lenient_flags |= LENIENT_OPTIONAL_CR_BEFORE_LF; } void llhttp__test_init_request_lenient_optional_crlf_after_chunk(llparse_t* s) { llhttp__test_init_request(s); s->lenient_flags |= LENIENT_OPTIONAL_CRLF_AFTER_CHUNK; } void llhttp__test_init_response_lenient_optional_crlf_after_chunk(llparse_t* s) { llhttp__test_init_response(s); s->lenient_flags |= LENIENT_OPTIONAL_CRLF_AFTER_CHUNK; } void llhttp__test_init_request_lenient_spaces_after_chunk_size(llparse_t* s) { llhttp__test_init_request(s); s->lenient_flags |= LENIENT_SPACES_AFTER_CHUNK_SIZE; } void llhttp__test_init_response_lenient_spaces_after_chunk_size(llparse_t* s) { llhttp__test_init_response(s); s->lenient_flags |= LENIENT_SPACES_AFTER_CHUNK_SIZE; } void llhttp__test_finish(llparse_t* s) { llparse__print(NULL, NULL, "finish=%d", s->finish); } int llhttp__on_message_begin(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "message begin"); #ifdef LLHTTP__TEST_PAUSE_ON_MESSAGE_BEGIN return LLPARSE__ERROR_PAUSE; #else return 0; #endif } int llhttp__on_message_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "message complete"); #ifdef LLHTTP__TEST_PAUSE_ON_MESSAGE_COMPLETE return LLPARSE__ERROR_PAUSE; #else return 0; #endif } int llhttp__on_status(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("status", p, endp); } int llhttp__on_status_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "status complete"); #ifdef LLHTTP__TEST_PAUSE_ON_STATUS_COMPLETE return LLPARSE__ERROR_PAUSE; #else return 0; #endif } int llhttp__on_method(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench || s->type != HTTP_REQUEST) return 0; return llparse__print_span("method", p, endp); } int llhttp__on_method_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "method complete"); #ifdef LLHTTP__TEST_PAUSE_ON_METHOD_COMPLETE return LLPARSE__ERROR_PAUSE; #else return 0; #endif } int llhttp__on_version(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("version", p, endp); } int llhttp__on_version_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "version complete"); #ifdef LLHTTP__TEST_PAUSE_ON_VERSION_COMPLETE return LLPARSE__ERROR_PAUSE; #else return 0; #endif } int llhttp__on_header_field(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("header_field", p, endp); } int llhttp__on_header_field_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "header_field complete"); #ifdef LLHTTP__TEST_PAUSE_ON_HEADER_FIELD_COMPLETE return LLPARSE__ERROR_PAUSE; #else return 0; #endif } int llhttp__on_header_value(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("header_value", p, endp); } int llhttp__on_header_value_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "header_value complete"); #ifdef LLHTTP__TEST_PAUSE_ON_HEADER_VALUE_COMPLETE return LLPARSE__ERROR_PAUSE; #else return 0; #endif } int llhttp__on_headers_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; if (s->type == HTTP_REQUEST) { llparse__print(p, endp, "headers complete method=%d v=%d/%d flags=%x content_length=%llu", s->method, s->http_major, s->http_minor, s->flags, s->content_length); } else if (s->type == HTTP_RESPONSE) { llparse__print(p, endp, "headers complete status=%d v=%d/%d flags=%x content_length=%llu", s->status_code, s->http_major, s->http_minor, s->flags, s->content_length); } else { llparse__print(p, endp, "invalid headers complete"); } #ifdef LLHTTP__TEST_PAUSE_ON_HEADERS_COMPLETE return LLPARSE__ERROR_PAUSE; #elif defined(LLHTTP__TEST_SKIP_BODY) llparse__print(p, endp, "skip body"); return 1; #else return 0; #endif } int llhttp__on_body(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("body", p, endp); } int llhttp__on_chunk_header(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "chunk header len=%d", (int) s->content_length); #ifdef LLHTTP__TEST_PAUSE_ON_CHUNK_HEADER return LLPARSE__ERROR_PAUSE; #else return 0; #endif } int llhttp__on_chunk_extension_name(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("chunk_extension_name", p, endp); } int llhttp__on_chunk_extension_name_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "chunk_extension_name complete"); #ifdef LLHTTP__TEST_PAUSE_ON_CHUNK_EXTENSION_NAME return LLPARSE__ERROR_PAUSE; #else return 0; #endif } int llhttp__on_chunk_extension_value(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("chunk_extension_value", p, endp); } int llhttp__on_chunk_extension_value_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "chunk_extension_value complete"); #ifdef LLHTTP__TEST_PAUSE_ON_CHUNK_EXTENSION_VALUE return LLPARSE__ERROR_PAUSE; #else return 0; #endif } int llhttp__on_chunk_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "chunk complete"); #ifdef LLHTTP__TEST_PAUSE_ON_CHUNK_COMPLETE return LLPARSE__ERROR_PAUSE; #else return 0; #endif } int llhttp__on_reset(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "reset"); #ifdef LLHTTP__TEST_PAUSE_ON_RESET return LLPARSE__ERROR_PAUSE; #else return 0; #endif } #endif /* LLHTTP__TEST_HTTP */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/fixtures/index.ts��������������������������������������������������0000644�0001751�0000177�00000007464�14607525267�021751� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import * as fs from 'fs'; import { ICompilerResult, LLParse } from 'llparse'; import { Dot } from 'llparse-dot'; import { Fixture, FixtureResult, IFixtureBuildOptions, } from 'llparse-test-fixture'; import * as path from 'path'; import * as llhttp from '../../src/llhttp'; export type Node = Parameters<LLParse['build']>['0']; export { FixtureResult }; export type TestType = 'request' | 'response' | 'request-finish' | 'response-finish' | 'request-lenient-all' | 'response-lenient-all' | 'request-lenient-headers' | 'response-lenient-headers' | 'request-lenient-chunked-length' | 'request-lenient-transfer-encoding' | 'request-lenient-keep-alive' | 'response-lenient-keep-alive' | 'request-lenient-version' | 'response-lenient-version' | 'request-lenient-data-after-close' | 'response-lenient-data-after-close' | 'request-lenient-optional-lf-after-cr' | 'response-lenient-optional-lf-after-cr' | 'request-lenient-optional-cr-before-lf' | 'response-lenient-optional-cr-before-lf' | 'request-lenient-optional-crlf-after-chunk' | 'response-lenient-optional-crlf-after-chunk' | 'request-lenient-spaces-after-chunk-size' | 'response-lenient-spaces-after-chunk-size' | 'none' | 'url'; export const allowedTypes: TestType[] = [ 'request', 'response', 'request-finish', 'response-finish', 'request-lenient-all', 'response-lenient-all', 'request-lenient-headers', 'response-lenient-headers', 'request-lenient-keep-alive', 'response-lenient-keep-alive', 'request-lenient-chunked-length', 'request-lenient-transfer-encoding', 'request-lenient-version', 'response-lenient-version', 'request-lenient-data-after-close', 'response-lenient-data-after-close', 'request-lenient-optional-lf-after-cr', 'response-lenient-optional-lf-after-cr', 'request-lenient-optional-cr-before-lf', 'response-lenient-optional-cr-before-lf', 'request-lenient-optional-crlf-after-chunk', 'response-lenient-optional-crlf-after-chunk', 'request-lenient-spaces-after-chunk-size', 'response-lenient-spaces-after-chunk-size', ]; const BUILD_DIR = path.join(__dirname, '..', 'tmp'); const CHEADERS_FILE = path.join(BUILD_DIR, 'cheaders.h'); const cheaders = new llhttp.CHeaders().build(); try { fs.mkdirSync(BUILD_DIR); } catch (e) { // no-op } fs.writeFileSync(CHEADERS_FILE, cheaders); const fixtures = new Fixture({ buildDir: path.join(__dirname, '..', 'tmp'), extra: [ '-msse4.2', '-DLLHTTP__TEST', '-DLLPARSE__ERROR_PAUSE=' + llhttp.constants.ERROR.PAUSED, '-include', CHEADERS_FILE, path.join(__dirname, 'extra.c'), ], maxParallel: process.env.LLPARSE_DEBUG ? 1 : undefined, }); const cache: Map<Node, ICompilerResult> = new Map(); export async function build( llparse: LLParse, node: Node, outFile: string, options: IFixtureBuildOptions = {}, ty: TestType = 'none'): Promise<FixtureResult> { const dot = new Dot(); fs.writeFileSync(path.join(BUILD_DIR, outFile + '.dot'), dot.build(node)); let artifacts: ICompilerResult; if (cache.has(node)) { artifacts = cache.get(node)!; } else { artifacts = llparse.build(node, { c: { header: outFile }, debug: process.env.LLPARSE_DEBUG ? 'llparse__debug' : undefined, }); cache.set(node, artifacts); } const extra = options.extra === undefined ? [] : options.extra.slice(); if (allowedTypes.includes(ty)) { extra.push( `-DLLPARSE__TEST_INIT=llhttp__test_init_${ty.replace(/-/g, '_')}`); } if (ty === 'request-finish' || ty === 'response-finish') { if (ty === 'request-finish') { extra.push('-DLLPARSE__TEST_INIT=llhttp__test_init_request'); } else { extra.push('-DLLPARSE__TEST_INIT=llhttp__test_init_response'); } extra.push('-DLLPARSE__TEST_FINISH=llhttp__test_finish'); } return await fixtures.build(artifacts, outFile, Object.assign(options, { extra, })); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000033�00000000000�010211� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������27 mtime=1713285830.555115 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/fuzzers/�����������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�020111� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/fuzzers/fuzz_parser.c����������������������������������������������0000644�0001751�0000177�00000002152�14607525267�022634� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "llhttp.h" #include <stdio.h> #include <stdlib.h> #include <string.h> int handle_on_message_complete(llhttp_t *arg) { return 0; } int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { llhttp_t parser; llhttp_settings_t settings; llhttp_type_t http_type; /* We need four bytes to determine variable parameters */ if (size < 4) { return 0; } int headers = (data[0] & 0x01) == 1; int chunked_length = (data[1] & 0x01) == 1; int keep_alive = (data[2] & 0x01) == 1; if (data[0] % 3 == 0) { http_type = HTTP_BOTH; } else if (data[0] % 3 == 1) { http_type = HTTP_REQUEST; } else { http_type = HTTP_RESPONSE; } data += 4; size -= 4; /* Initialize user callbacks and settings */ llhttp_settings_init(&settings); /* Set user callback */ settings.on_message_complete = handle_on_message_complete; llhttp_init(&parser, http_type, &settings); llhttp_set_lenient_headers(&parser, headers); llhttp_set_lenient_chunked_length(&parser, chunked_length); llhttp_set_lenient_keep_alive(&parser, keep_alive); llhttp_execute(&parser, data, size); return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/md-test.ts���������������������������������������������������������0000644�0001751�0000177�00000015010�14607525267�020330� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import * as assert from 'node:assert'; import { describe, test } from 'node:test'; import * as fs from 'fs'; import { LLParse } from 'llparse'; import { Group, MDGator, Metadata, Test } from 'mdgator'; import * as path from 'path'; import * as vm from 'vm'; import * as llhttp from '../src/llhttp'; import { allowedTypes, build, FixtureResult, Node, TestType } from './fixtures'; // // Cache nodes/llparse instances ahead of time // (different types of tests will re-use them) // const modeCache = new Map<string, FixtureResult>(); function buildNode() { const p = new LLParse(); const instance = new llhttp.HTTP(p); return { llparse: p, entry: instance.build().entry }; } function buildURL() { const p = new LLParse(); const instance = new llhttp.URL(p, true); const node = instance.build(); // Loop node.exit.toHTTP.otherwise(node.entry.normal); node.exit.toHTTP09.otherwise(node.entry.normal); return { llparse: p, entry: node.entry.normal }; } // // Build binaries using cached nodes/llparse // async function buildMode(ty: TestType, meta: Metadata): Promise<FixtureResult> { const cacheKey = `${ty}:${JSON.stringify(meta || {})}`; let entry = modeCache.get(cacheKey); if (entry) { return entry; } let node: { llparse: LLParse; entry: Node }; let prefix: string; let extra: string[]; if (ty === 'url') { node = buildURL(); prefix = 'url'; extra = []; } else { node = buildNode(); prefix = 'http'; extra = [ '-DLLHTTP__TEST_HTTP', path.join(__dirname, '..', 'src', 'native', 'http.c'), ]; } if (meta.pause) { extra.push(`-DLLHTTP__TEST_PAUSE_${meta.pause.toUpperCase()}=1`); } if (meta.skipBody) { extra.push('-DLLHTTP__TEST_SKIP_BODY=1'); } entry = await build(node.llparse, node.entry, `${prefix}-${ty}`, { extra, }, ty); modeCache.set(cacheKey, entry); return entry; } // // Run test suite // function run(name: string): void { const md = new MDGator(); const raw = fs.readFileSync(path.join(__dirname, name + '.md')).toString(); const groups = md.parse(raw); function runSingleTest(ty: TestType, meta: Metadata, input: string, expected: ReadonlyArray<string | RegExp>): void { test(`should pass for type="${ty}"`, { timeout: 60000 }, async () => { const binary = await buildMode(ty, meta); await binary.check(input, expected, { noScan: meta.noScan === true, }); }); } function runTest(test: Test) { describe(test.name + ` at ${name}.md:${test.line + 1}`, () => { let types: TestType[] = []; const isURL = test.values.has('url'); const inputKey = isURL ? 'url' : 'http'; assert(test.values.has(inputKey), `Missing "${inputKey}" code in md file`); assert.strictEqual(test.values.get(inputKey)!.length, 1, `Expected just one "${inputKey}" input`); let meta: Metadata; if (test.meta.has(inputKey)) { meta = test.meta.get(inputKey)![0]!; } else { assert(isURL, 'Missing required http metadata'); meta = {}; } if (isURL) { types = [ 'url' ]; } else { assert(Object.prototype.hasOwnProperty.call(meta, 'type'), 'Missing required `type` metadata'); if (meta.type) { if (!allowedTypes.includes(meta.type)) { throw new Error(`Invalid value of \`type\` metadata: "${meta.type}"`); } types.push(meta.type); } } assert(test.values.has('log'), 'Missing `log` code in md file'); assert.strictEqual(test.values.get('log')!.length, 1, 'Expected just one output'); let input: string = test.values.get(inputKey)![0]; let expected: string = test.values.get('log')![0]; // Remove trailing newline input = input.replace(/\n$/, ''); // Remove escaped newlines input = input.replace(/\\(\r\n|\r|\n)/g, ''); // Normalize all newlines input = input.replace(/\r\n|\r|\n/g, '\r\n'); // Replace escaped CRLF, tabs, form-feed input = input.replace(/\\r/g, '\r'); input = input.replace(/\\n/g, '\n'); input = input.replace(/\\t/g, '\t'); input = input.replace(/\\f/g, '\f'); input = input.replace(/\\x([0-9a-fA-F]+)/g, (all, hex) => { return String.fromCharCode(parseInt(hex, 16)); }); // Useful in token tests input = input.replace(/\\([0-7]{1,3})/g, (_, digits) => { return String.fromCharCode(parseInt(digits, 8)); }); // Evaluate inline JavaScript input = input.replace(/\$\{(.+?)\}/g, (_, code) => { return vm.runInNewContext(code) + ''; }); // Escape first symbol `\r` or `\n`, `|`, `&` for Windows if (process.platform === 'win32') { const firstByte = Buffer.from(input)[0]; if (firstByte === 0x0a || firstByte === 0x0d) { input = '\\' + input; } input = input.replace(/\|/g, '^|'); input = input.replace(/&/g, '^&'); } // Replace escaped tabs/form-feed in expected too expected = expected.replace(/\\t/g, '\t'); expected = expected.replace(/\\f/g, '\f'); // Split const expectedLines = expected.split(/\n/g).slice(0, -1); const fullExpected = expectedLines.map((line) => { if (line.startsWith('/')) { return new RegExp(line.trim().slice(1, -1)); } else { return line; } }); for (const ty of types) { if (meta.skip === true || (process.env.ONLY === 'true' && !meta.only)) { continue; } runSingleTest(ty, meta, input, fullExpected); } }); } function runGroup(group: Group) { describe(group.name + ` at ${name}.md:${group.line + 1}`, function () { for (const child of group.children) { runGroup(child); } for (const test of group.tests) { runTest(test); } }); } for (const group of groups) { runGroup(group); } } run('request/sample'); run('request/lenient-headers'); run('request/lenient-version'); run('request/method'); run('request/uri'); run('request/connection'); run('request/content-length'); run('request/transfer-encoding'); run('request/invalid'); run('request/finish'); run('request/pausing'); run('request/pipelining'); run('response/sample'); run('response/connection'); run('response/content-length'); run('response/transfer-encoding'); run('response/invalid'); run('response/finish'); run('response/lenient-version'); run('response/pausing'); run('response/pipelining'); run('url'); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000033�00000000000�010211� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������27 mtime=1713285830.559115 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/request/�����������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�020071� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/request/connection.md����������������������������������������������0000644�0001751�0000177�00000044210�14607525267�022560� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Connection header ================= ## `keep-alive` ### Setting flag <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Connection: keep-alive ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=10 span[header_value]="keep-alive" off=43 header_value complete off=45 headers complete method=4 v=1/1 flags=1 content_length=0 off=45 message complete ``` ### Restarting when keep-alive is explicitly <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Connection: keep-alive PUT /url HTTP/1.1 Connection: keep-alive ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=10 span[header_value]="keep-alive" off=43 header_value complete off=45 headers complete method=4 v=1/1 flags=1 content_length=0 off=45 message complete off=45 reset off=45 message begin off=45 len=3 span[method]="PUT" off=48 method complete off=49 len=4 span[url]="/url" off=54 url complete off=59 len=3 span[version]="1.1" off=62 version complete off=64 len=10 span[header_field]="Connection" off=75 header_field complete off=76 len=10 span[header_value]="keep-alive" off=88 header_value complete off=90 headers complete method=4 v=1/1 flags=1 content_length=0 off=90 message complete ``` ### No restart when keep-alive is off (1.0) <!-- meta={"type": "request" } --> ```http PUT /url HTTP/1.0 PUT /url HTTP/1.1 ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.0" off=17 version complete off=21 headers complete method=4 v=1/0 flags=0 content_length=0 off=21 message complete off=22 error code=5 reason="Data after `Connection: close`" ``` ### Resetting flags when keep-alive is off (1.0, lenient) Even though we allow restarts in loose mode, the flags should be still set to `0` upon restart. <!-- meta={"type": "request-lenient-keep-alive"} --> ```http PUT /url HTTP/1.0 Content-Length: 0 PUT /url HTTP/1.1 Transfer-Encoding: chunked ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.0" off=17 version complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=1 span[header_value]="0" off=38 header_value complete off=40 headers complete method=4 v=1/0 flags=20 content_length=0 off=40 message complete off=40 reset off=40 message begin off=40 len=3 span[method]="PUT" off=43 method complete off=44 len=4 span[url]="/url" off=49 url complete off=54 len=3 span[version]="1.1" off=57 version complete off=59 len=17 span[header_field]="Transfer-Encoding" off=77 header_field complete off=78 len=7 span[header_value]="chunked" off=87 header_value complete off=89 headers complete method=4 v=1/1 flags=208 content_length=0 ``` ### CRLF between requests, implicit `keep-alive` <!-- meta={"type": "request"} --> ```http POST / HTTP/1.1 Host: www.example.com Content-Type: application/x-www-form-urlencoded Content-Length: 4 q=42 GET / HTTP/1.1 ``` _Note the trailing CRLF above_ ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=4 span[header_field]="Host" off=22 header_field complete off=23 len=15 span[header_value]="www.example.com" off=40 header_value complete off=40 len=12 span[header_field]="Content-Type" off=53 header_field complete off=54 len=33 span[header_value]="application/x-www-form-urlencoded" off=89 header_value complete off=89 len=14 span[header_field]="Content-Length" off=104 header_field complete off=105 len=1 span[header_value]="4" off=108 header_value complete off=110 headers complete method=3 v=1/1 flags=20 content_length=4 off=110 len=4 span[body]="q=42" off=114 message complete off=118 reset off=118 message begin off=118 len=3 span[method]="GET" off=121 method complete off=122 len=1 span[url]="/" off=124 url complete off=129 len=3 span[version]="1.1" off=132 version complete ``` ### Not treating `\r` as `-` <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Connection: keep\ralive ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=4 span[header_value]="keep" off=36 error code=3 reason="Missing expected LF after header value" ``` ## `close` ### Setting flag on `close` <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Connection: close ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=5 span[header_value]="close" off=38 header_value complete off=40 headers complete method=4 v=1/1 flags=2 content_length=0 off=40 message complete ``` ### CRLF between requests, explicit `close` `close` means closed connection <!-- meta={"type": "request" } --> ```http POST / HTTP/1.1 Host: www.example.com Content-Type: application/x-www-form-urlencoded Content-Length: 4 Connection: close q=42 GET / HTTP/1.1 ``` _Note the trailing CRLF above_ ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=4 span[header_field]="Host" off=22 header_field complete off=23 len=15 span[header_value]="www.example.com" off=40 header_value complete off=40 len=12 span[header_field]="Content-Type" off=53 header_field complete off=54 len=33 span[header_value]="application/x-www-form-urlencoded" off=89 header_value complete off=89 len=14 span[header_field]="Content-Length" off=104 header_field complete off=105 len=1 span[header_value]="4" off=108 header_value complete off=108 len=10 span[header_field]="Connection" off=119 header_field complete off=120 len=5 span[header_value]="close" off=127 header_value complete off=129 headers complete method=3 v=1/1 flags=22 content_length=4 off=129 len=4 span[body]="q=42" off=133 message complete off=138 error code=5 reason="Data after `Connection: close`" ``` ### CRLF between requests, explicit `close` (lenient) Loose mode is more lenient, and allows further requests. <!-- meta={"type": "request-lenient-keep-alive"} --> ```http POST / HTTP/1.1 Host: www.example.com Content-Type: application/x-www-form-urlencoded Content-Length: 4 Connection: close q=42 GET / HTTP/1.1 ``` _Note the trailing CRLF above_ ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=4 span[header_field]="Host" off=22 header_field complete off=23 len=15 span[header_value]="www.example.com" off=40 header_value complete off=40 len=12 span[header_field]="Content-Type" off=53 header_field complete off=54 len=33 span[header_value]="application/x-www-form-urlencoded" off=89 header_value complete off=89 len=14 span[header_field]="Content-Length" off=104 header_field complete off=105 len=1 span[header_value]="4" off=108 header_value complete off=108 len=10 span[header_field]="Connection" off=119 header_field complete off=120 len=5 span[header_value]="close" off=127 header_value complete off=129 headers complete method=3 v=1/1 flags=22 content_length=4 off=129 len=4 span[body]="q=42" off=133 message complete off=137 reset off=137 message begin off=137 len=3 span[method]="GET" off=140 method complete off=141 len=1 span[url]="/" off=143 url complete off=148 len=3 span[version]="1.1" off=151 version complete ``` ## Parsing multiple tokens ### Sample <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Connection: close, token, upgrade, token, keep-alive ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=40 span[header_value]="close, token, upgrade, token, keep-alive" off=73 header_value complete off=75 headers complete method=4 v=1/1 flags=7 content_length=0 off=75 message complete ``` ### Multiple tokens with folding <!-- meta={"type": "request-lenient-headers"} --> ```http GET /demo HTTP/1.1 Host: example.com Connection: Something, Upgrade, ,Keep-Alive Sec-WebSocket-Key2: 12998 5 Y3 1 .P00 Sec-WebSocket-Protocol: sample Upgrade: WebSocket Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5 Origin: http://example.com Hot diggity dogg ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=5 span[url]="/demo" off=10 url complete off=15 len=3 span[version]="1.1" off=18 version complete off=20 len=4 span[header_field]="Host" off=25 header_field complete off=26 len=11 span[header_value]="example.com" off=39 header_value complete off=39 len=10 span[header_field]="Connection" off=50 header_field complete off=51 len=10 span[header_value]="Something," off=63 len=21 span[header_value]=" Upgrade, ,Keep-Alive" off=86 header_value complete off=86 len=18 span[header_field]="Sec-WebSocket-Key2" off=105 header_field complete off=106 len=18 span[header_value]="12998 5 Y3 1 .P00" off=126 header_value complete off=126 len=22 span[header_field]="Sec-WebSocket-Protocol" off=149 header_field complete off=150 len=6 span[header_value]="sample" off=158 header_value complete off=158 len=7 span[header_field]="Upgrade" off=166 header_field complete off=167 len=9 span[header_value]="WebSocket" off=178 header_value complete off=178 len=18 span[header_field]="Sec-WebSocket-Key1" off=197 header_field complete off=198 len=20 span[header_value]="4 @1 46546xW%0l 1 5" off=220 header_value complete off=220 len=6 span[header_field]="Origin" off=227 header_field complete off=228 len=18 span[header_value]="http://example.com" off=248 header_value complete off=250 headers complete method=1 v=1/1 flags=15 content_length=0 off=250 message complete off=250 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### Multiple tokens with folding and LWS <!-- meta={"type": "request"} --> ```http GET /demo HTTP/1.1 Connection: keep-alive, upgrade Upgrade: WebSocket Hot diggity dogg ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=5 span[url]="/demo" off=10 url complete off=15 len=3 span[version]="1.1" off=18 version complete off=20 len=10 span[header_field]="Connection" off=31 header_field complete off=32 len=19 span[header_value]="keep-alive, upgrade" off=53 header_value complete off=53 len=7 span[header_field]="Upgrade" off=61 header_field complete off=62 len=9 span[header_value]="WebSocket" off=73 header_value complete off=75 headers complete method=1 v=1/1 flags=15 content_length=0 off=75 message complete off=75 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### Multiple tokens with folding, LWS, and CRLF <!-- meta={"type": "request-lenient-headers"} --> ```http GET /demo HTTP/1.1 Connection: keep-alive, \r\n upgrade Upgrade: WebSocket Hot diggity dogg ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=5 span[url]="/demo" off=10 url complete off=15 len=3 span[version]="1.1" off=18 version complete off=20 len=10 span[header_field]="Connection" off=31 header_field complete off=32 len=12 span[header_value]="keep-alive, " off=46 len=8 span[header_value]=" upgrade" off=56 header_value complete off=56 len=7 span[header_field]="Upgrade" off=64 header_field complete off=65 len=9 span[header_value]="WebSocket" off=76 header_value complete off=78 headers complete method=1 v=1/1 flags=15 content_length=0 off=78 message complete off=78 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### Invalid whitespace token with `Connection` header field <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Connection : upgrade Content-Length: 4 Upgrade: ws abcdefgh ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=10 span[header_field]="Connection" off=30 error code=10 reason="Invalid header field char" ``` ### Invalid whitespace token with `Connection` header field (lenient) <!-- meta={"type": "request-lenient-headers"} --> ```http PUT /url HTTP/1.1 Connection : upgrade Content-Length: 4 Upgrade: ws abcdefgh ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=11 span[header_field]="Connection " off=31 header_field complete off=32 len=7 span[header_value]="upgrade" off=41 header_value complete off=41 len=14 span[header_field]="Content-Length" off=56 header_field complete off=57 len=1 span[header_value]="4" off=60 header_value complete off=60 len=7 span[header_field]="Upgrade" off=68 header_field complete off=69 len=2 span[header_value]="ws" off=73 header_value complete off=75 headers complete method=4 v=1/1 flags=34 content_length=4 off=75 len=4 span[body]="abcd" off=79 message complete off=79 error code=22 reason="Pause on CONNECT/Upgrade" ``` ## `upgrade` ### Setting a flag and pausing <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Connection: upgrade Upgrade: ws ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=7 span[header_value]="upgrade" off=40 header_value complete off=40 len=7 span[header_field]="Upgrade" off=48 header_field complete off=49 len=2 span[header_value]="ws" off=53 header_value complete off=55 headers complete method=4 v=1/1 flags=14 content_length=0 off=55 message complete off=55 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### Emitting part of body and pausing <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Connection: upgrade Content-Length: 4 Upgrade: ws abcdefgh ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=7 span[header_value]="upgrade" off=40 header_value complete off=40 len=14 span[header_field]="Content-Length" off=55 header_field complete off=56 len=1 span[header_value]="4" off=59 header_value complete off=59 len=7 span[header_field]="Upgrade" off=67 header_field complete off=68 len=2 span[header_value]="ws" off=72 header_value complete off=74 headers complete method=4 v=1/1 flags=34 content_length=4 off=74 len=4 span[body]="abcd" off=78 message complete off=78 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### Upgrade GET request <!-- meta={"type": "request"} --> ```http GET /demo HTTP/1.1 Host: example.com Connection: Upgrade Sec-WebSocket-Key2: 12998 5 Y3 1 .P00 Sec-WebSocket-Protocol: sample Upgrade: WebSocket Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5 Origin: http://example.com Hot diggity dogg ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=5 span[url]="/demo" off=10 url complete off=15 len=3 span[version]="1.1" off=18 version complete off=20 len=4 span[header_field]="Host" off=25 header_field complete off=26 len=11 span[header_value]="example.com" off=39 header_value complete off=39 len=10 span[header_field]="Connection" off=50 header_field complete off=51 len=7 span[header_value]="Upgrade" off=60 header_value complete off=60 len=18 span[header_field]="Sec-WebSocket-Key2" off=79 header_field complete off=80 len=18 span[header_value]="12998 5 Y3 1 .P00" off=100 header_value complete off=100 len=22 span[header_field]="Sec-WebSocket-Protocol" off=123 header_field complete off=124 len=6 span[header_value]="sample" off=132 header_value complete off=132 len=7 span[header_field]="Upgrade" off=140 header_field complete off=141 len=9 span[header_value]="WebSocket" off=152 header_value complete off=152 len=18 span[header_field]="Sec-WebSocket-Key1" off=171 header_field complete off=172 len=20 span[header_value]="4 @1 46546xW%0l 1 5" off=194 header_value complete off=194 len=6 span[header_field]="Origin" off=201 header_field complete off=202 len=18 span[header_value]="http://example.com" off=222 header_value complete off=224 headers complete method=1 v=1/1 flags=14 content_length=0 off=224 message complete off=224 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### Upgrade POST request <!-- meta={"type": "request"} --> ```http POST /demo HTTP/1.1 Host: example.com Connection: Upgrade Upgrade: HTTP/2.0 Content-Length: 15 sweet post body\ Hot diggity dogg ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=5 span[url]="/demo" off=11 url complete off=16 len=3 span[version]="1.1" off=19 version complete off=21 len=4 span[header_field]="Host" off=26 header_field complete off=27 len=11 span[header_value]="example.com" off=40 header_value complete off=40 len=10 span[header_field]="Connection" off=51 header_field complete off=52 len=7 span[header_value]="Upgrade" off=61 header_value complete off=61 len=7 span[header_field]="Upgrade" off=69 header_field complete off=70 len=8 span[header_value]="HTTP/2.0" off=80 header_value complete off=80 len=14 span[header_field]="Content-Length" off=95 header_field complete off=96 len=2 span[header_value]="15" off=100 header_value complete off=102 headers complete method=3 v=1/1 flags=34 content_length=15 off=102 len=15 span[body]="sweet post body" off=117 message complete off=117 error code=22 reason="Pause on CONNECT/Upgrade" ``` ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/request/content-length.md������������������������������������������0000644�0001751�0000177�00000025646�14607525267�023366� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Content-Length header ===================== ## `Content-Length` with zeroes <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Content-Length: 003 abc ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=3 span[header_value]="003" off=40 header_value complete off=42 headers complete method=4 v=1/1 flags=20 content_length=3 off=42 len=3 span[body]="abc" off=45 message complete ``` ## `Content-Length` with follow-up headers The way the parser works is that special headers (like `Content-Length`) first set `header_state` to appropriate value, and then apply custom parsing using that value. For `Content-Length`, in particular, the `header_state` is used for setting the flag too. Make sure that `header_state` is reset to `0`, so that the flag won't be attempted to set twice (and error). <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Content-Length: 003 Ohai: world abc ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=3 span[header_value]="003" off=40 header_value complete off=40 len=4 span[header_field]="Ohai" off=45 header_field complete off=46 len=5 span[header_value]="world" off=53 header_value complete off=55 headers complete method=4 v=1/1 flags=20 content_length=3 off=55 len=3 span[body]="abc" off=58 message complete ``` ## Error on `Content-Length` overflow <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Content-Length: 1000000000000000000000 ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=21 span[header_value]="100000000000000000000" off=56 error code=11 reason="Content-Length overflow" ``` ## Error on duplicate `Content-Length` <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Content-Length: 1 Content-Length: 2 ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=1 span[header_value]="1" off=38 header_value complete off=38 len=14 span[header_field]="Content-Length" off=53 header_field complete off=54 error code=4 reason="Duplicate Content-Length" ``` ## Error on simultaneous `Content-Length` and `Transfer-Encoding: identity` <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Content-Length: 1 Transfer-Encoding: identity ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=1 span[header_value]="1" off=38 header_value complete off=38 len=17 span[header_field]="Transfer-Encoding" off=56 header_field complete off=56 error code=15 reason="Transfer-Encoding can't be present with Content-Length" ``` ## Invalid whitespace token with `Content-Length` header field <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Connection: upgrade Content-Length : 4 Upgrade: ws abcdefgh ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=7 span[header_value]="upgrade" off=40 header_value complete off=40 len=14 span[header_field]="Content-Length" off=55 error code=10 reason="Invalid header field char" ``` ## Invalid whitespace token with `Content-Length` header field (lenient) <!-- meta={"type": "request-lenient-headers"} --> ```http PUT /url HTTP/1.1 Connection: upgrade Content-Length : 4 Upgrade: ws abcdefgh ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=7 span[header_value]="upgrade" off=40 header_value complete off=40 len=15 span[header_field]="Content-Length " off=56 header_field complete off=57 len=1 span[header_value]="4" off=60 header_value complete off=60 len=7 span[header_field]="Upgrade" off=68 header_field complete off=69 len=2 span[header_value]="ws" off=73 header_value complete off=75 headers complete method=4 v=1/1 flags=34 content_length=4 off=75 len=4 span[body]="abcd" off=79 message complete off=79 error code=22 reason="Pause on CONNECT/Upgrade" ``` ## No error on simultaneous `Content-Length` and `Transfer-Encoding: identity` (lenient) <!-- meta={"type": "request-lenient-chunked-length"} --> ```http PUT /url HTTP/1.1 Content-Length: 1 Transfer-Encoding: identity ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=1 span[header_value]="1" off=38 header_value complete off=38 len=17 span[header_field]="Transfer-Encoding" off=56 header_field complete off=57 len=8 span[header_value]="identity" off=67 header_value complete off=69 headers complete method=4 v=1/1 flags=220 content_length=1 ``` ## Funky `Content-Length` with body <!-- meta={"type": "request"} --> ```http GET /get_funky_content_length_body_hello HTTP/1.0 conTENT-Length: 5 HELLO ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=36 span[url]="/get_funky_content_length_body_hello" off=41 url complete off=46 len=3 span[version]="1.0" off=49 version complete off=51 len=14 span[header_field]="conTENT-Length" off=66 header_field complete off=67 len=1 span[header_value]="5" off=70 header_value complete off=72 headers complete method=1 v=1/0 flags=20 content_length=5 off=72 len=5 span[body]="HELLO" off=77 message complete ``` ## Spaces in `Content-Length` (surrounding) <!-- meta={"type": "request"} --> ```http POST / HTTP/1.1 Content-Length: 42 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=34 len=3 span[header_value]="42 " off=39 header_value complete off=41 headers complete method=3 v=1/1 flags=20 content_length=42 ``` ### Spaces in `Content-Length` #2 <!-- meta={"type": "request"} --> ```http POST / HTTP/1.1 Content-Length: 4 2 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=2 span[header_value]="4 " off=35 error code=11 reason="Invalid character in Content-Length" ``` ### Spaces in `Content-Length` #3 <!-- meta={"type": "request"} --> ```http POST / HTTP/1.1 Content-Length: 13 37 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=3 span[header_value]="13 " off=36 error code=11 reason="Invalid character in Content-Length" ``` ### Empty `Content-Length` <!-- meta={"type": "request"} --> ```http POST / HTTP/1.1 Content-Length: ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=34 error code=11 reason="Empty Content-Length" ``` ## `Content-Length` with CR instead of dash <!-- meta={"type": "request", "noScan": true} --> ```http PUT /url HTTP/1.1 Content\rLength: 003 abc ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=26 error code=10 reason="Invalid header token" ``` ## Content-Length reset when no body is received <!-- meta={"type": "request", "skipBody": true} --> ```http PUT /url HTTP/1.1 Content-Length: 123 POST /url HTTP/1.1 Content-Length: 456 ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=3 span[header_value]="123" off=40 header_value complete off=42 headers complete method=4 v=1/1 flags=20 content_length=123 off=42 skip body off=42 message complete off=42 reset off=42 message begin off=42 len=4 span[method]="POST" off=46 method complete off=47 len=4 span[url]="/url" off=52 url complete off=57 len=3 span[version]="1.1" off=60 version complete off=62 len=14 span[header_field]="Content-Length" off=77 header_field complete off=78 len=3 span[header_value]="456" off=83 header_value complete off=85 headers complete method=3 v=1/1 flags=20 content_length=456 off=85 skip body off=85 message complete ``` ## Missing CRLF-CRLF before body <!-- meta={"type": "request" } --> ```http PUT /url HTTP/1.1 Content-Length: 3 \rabc ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=1 span[header_value]="3" off=38 header_value complete off=39 error code=2 reason="Expected LF after headers" ``` ## Missing CRLF-CRLF before body (lenient) <!-- meta={"type": "request-lenient-optional-lf-after-cr" } --> ```http PUT /url HTTP/1.1 Content-Length: 3 \rabc ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=1 span[header_value]="3" off=38 header_value complete off=39 headers complete method=4 v=1/1 flags=20 content_length=3 off=39 len=3 span[body]="abc" off=42 message complete ```������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/request/finish.md��������������������������������������������������0000644�0001751�0000177�00000002536�14607525267�021706� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finish ====== Those tests check the return codes and the behavior of `llhttp_finish()` C API. ## It should be safe to finish after GET request <!-- meta={"type": "request-finish"} --> ```http GET / HTTP/1.1 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=18 headers complete method=1 v=1/1 flags=0 content_length=0 off=18 message complete off=NULL finish=0 ``` ## It should be unsafe to finish after incomplete PUT request <!-- meta={"type": "request-finish"} --> ```http PUT / HTTP/1.1 Content-Length: 100 ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=14 span[header_field]="Content-Length" off=31 header_field complete off=32 len=3 span[header_value]="100" off=NULL finish=2 ``` ## It should be unsafe to finish inside of the header <!-- meta={"type": "request-finish"} --> ```http PUT / HTTP/1.1 Content-Leng ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=12 span[header_field]="Content-Leng" off=NULL finish=2 ``` ������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/request/invalid.md�������������������������������������������������0000644�0001751�0000177�00000033440�14607525267�022052� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Invalid requests ================ ### ICE protocol and GET method <!-- meta={"type": "request"} --> ```http GET /music/sweet/music ICE/1.0 Host: example.com ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=18 span[url]="/music/sweet/music" off=23 url complete off=27 error code=8 reason="Expected SOURCE method for ICE/x.x request" ``` ### ICE protocol, but not really <!-- meta={"type": "request"} --> ```http GET /music/sweet/music IHTTP/1.0 Host: example.com ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=18 span[url]="/music/sweet/music" off=23 url complete off=24 error code=8 reason="Expected HTTP/" ``` ### RTSP protocol and PUT method <!-- meta={"type": "request"} --> ```http PUT /music/sweet/music RTSP/1.0 Host: example.com ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=18 span[url]="/music/sweet/music" off=23 url complete off=28 error code=8 reason="Invalid method for RTSP/x.x request" ``` ### HTTP protocol and ANNOUNCE method <!-- meta={"type": "request"} --> ```http ANNOUNCE /music/sweet/music HTTP/1.0 Host: example.com ``` ```log off=0 message begin off=0 len=8 span[method]="ANNOUNCE" off=8 method complete off=9 len=18 span[url]="/music/sweet/music" off=28 url complete off=33 error code=8 reason="Invalid method for HTTP/x.x request" ``` ### Headers separated by CR <!-- meta={"type": "request"} --> ```http GET / HTTP/1.1 Foo: 1\rBar: 2 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=3 span[header_field]="Foo" off=20 header_field complete off=21 len=1 span[header_value]="1" off=23 error code=3 reason="Missing expected LF after header value" ``` ### Headers separated by LF <!-- meta={"type": "request"} --> ```http POST / HTTP/1.1 Host: localhost:5000 x:x\nTransfer-Encoding: chunked 1 A 0 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=4 span[header_field]="Host" off=22 header_field complete off=23 len=14 span[header_value]="localhost:5000" off=39 header_value complete off=39 len=1 span[header_field]="x" off=41 header_field complete off=41 len=1 span[header_value]="x" off=42 error code=25 reason="Missing expected CR after header value" ``` ### Headers separated by dummy characters <!-- meta={"type": "request"} --> ```http GET / HTTP/1.1 Connection: close Host: a \rZGET /evil: HTTP/1.1 Host: a ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=10 span[header_field]="Connection" off=27 header_field complete off=28 len=5 span[header_value]="close" off=35 header_value complete off=35 len=4 span[header_field]="Host" off=40 header_field complete off=41 len=1 span[header_value]="a" off=44 header_value complete off=45 error code=2 reason="Expected LF after headers" ``` ### Headers separated by dummy characters (lenient) <!-- meta={"type": "request-lenient-optional-lf-after-cr"} --> ```http GET / HTTP/1.1 Connection: close Host: a \rZGET /evil: HTTP/1.1 Host: a ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=10 span[header_field]="Connection" off=27 header_field complete off=28 len=5 span[header_value]="close" off=35 header_value complete off=35 len=4 span[header_field]="Host" off=40 header_field complete off=41 len=1 span[header_value]="a" off=44 header_value complete off=45 headers complete method=1 v=1/1 flags=2 content_length=0 off=45 message complete off=46 error code=5 reason="Data after `Connection: close`" ``` ### Empty headers separated by CR <!-- meta={"type": "request" } --> ```http POST / HTTP/1.1 Connection: Close Host: localhost:5000 x:\rTransfer-Encoding: chunked 1 A 0 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=10 span[header_field]="Connection" off=28 header_field complete off=29 len=5 span[header_value]="Close" off=36 header_value complete off=36 len=4 span[header_field]="Host" off=41 header_field complete off=42 len=14 span[header_value]="localhost:5000" off=58 header_value complete off=58 len=1 span[header_field]="x" off=60 header_field complete off=61 error code=2 reason="Expected LF after CR" ``` ### Empty headers separated by LF <!-- meta={"type": "request"} --> ```http POST / HTTP/1.1 Host: localhost:5000 x:\nTransfer-Encoding: chunked 1 A 0 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=4 span[header_field]="Host" off=22 header_field complete off=23 len=14 span[header_value]="localhost:5000" off=39 header_value complete off=39 len=1 span[header_field]="x" off=41 header_field complete off=42 error code=10 reason="Invalid header value char" ``` ### Invalid header token #1 <!-- meta={"type": "request", "noScan": true} --> ```http GET / HTTP/1.1 Fo@: Failure ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=18 error code=10 reason="Invalid header token" ``` ### Invalid header token #2 <!-- meta={"type": "request", "noScan": true} --> ```http GET / HTTP/1.1 Foo\01\test: Bar ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=19 error code=10 reason="Invalid header token" ``` ### Invalid header token #3 <!-- meta={"type": "request", "noScan": true} --> ```http GET / HTTP/1.1 : Bar ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 error code=10 reason="Invalid header token" ``` ### Invalid method <!-- meta={"type": "request"} --> ```http MKCOLA / HTTP/1.1 ``` ```log off=0 message begin off=0 len=5 span[method]="MKCOL" off=5 method complete off=5 error code=6 reason="Expected space after method" ``` ### Illegal header field name line folding <!-- meta={"type": "request", "noScan": true} --> ```http GET / HTTP/1.1 name : value ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=20 error code=10 reason="Invalid header token" ``` ### Corrupted Connection header <!-- meta={"type": "request", "noScan": true} --> ```http GET / HTTP/1.1 Host: www.example.com Connection\r\033\065\325eep-Alive Accept-Encoding: gzip ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=4 span[header_field]="Host" off=21 header_field complete off=22 len=15 span[header_value]="www.example.com" off=39 header_value complete off=49 error code=10 reason="Invalid header token" ``` ### Corrupted header name <!-- meta={"type": "request", "noScan": true} --> ```http GET / HTTP/1.1 Host: www.example.com X-Some-Header\r\033\065\325eep-Alive Accept-Encoding: gzip ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=4 span[header_field]="Host" off=21 header_field complete off=22 len=15 span[header_value]="www.example.com" off=39 header_value complete off=52 error code=10 reason="Invalid header token" ``` ### Missing CR between headers <!-- meta={"type": "request", "noScan": true} --> ```http GET / HTTP/1.1 Host: localhost Dummy: x\nContent-Length: 23 GET / HTTP/1.1 Dummy: GET /admin HTTP/1.1 Host: localhost ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=4 span[header_field]="Host" off=21 header_field complete off=22 len=9 span[header_value]="localhost" off=33 header_value complete off=33 len=5 span[header_field]="Dummy" off=39 header_field complete off=40 len=1 span[header_value]="x" off=41 error code=25 reason="Missing expected CR after header value" ``` ### Invalid HTTP version <!-- meta={"type": "request", "noScan": true} --> ```http GET / HTTP/5.6 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="5.6" off=14 error code=9 reason="Invalid HTTP version" ``` ## Invalid space after start line <!-- meta={"type": "request"} --> ```http GET / HTTP/1.1 Host: foo ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=17 error code=30 reason="Unexpected space after start line" ``` ### Only LFs present <!-- meta={"type": "request"} --> ```http POST / HTTP/1.1\n\ Transfer-Encoding: chunked\n\ Trailer: Baz Foo: abc\n\ Bar: def\n\ \n\ 1\n\ A\n\ 1;abc\n\ B\n\ 1;def=ghi\n\ C\n\ 1;jkl="mno"\n\ D\n\ 0\n\ \n\ Baz: ghi\n\ \n\ ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=16 error code=9 reason="Expected CRLF after version" ``` ### Only LFs present (lenient) <!-- meta={"type": "request-lenient-all"} --> ```http POST / HTTP/1.1\n\ Transfer-Encoding: chunked\n\ Trailer: Baz Foo: abc\n\ Bar: def\n\ \n\ 1\n\ A\n\ 1;abc\n\ B\n\ 1;def=ghi\n\ C\n\ 1;jkl="mno"\n\ D\n\ 0\n\ \n\ Baz: ghi\n\ \n ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=16 len=17 span[header_field]="Transfer-Encoding" off=34 header_field complete off=35 len=7 span[header_value]="chunked" off=43 header_value complete off=43 len=7 span[header_field]="Trailer" off=51 header_field complete off=52 len=3 span[header_value]="Baz" off=57 header_value complete off=57 len=3 span[header_field]="Foo" off=61 header_field complete off=62 len=3 span[header_value]="abc" off=66 header_value complete off=66 len=3 span[header_field]="Bar" off=70 header_field complete off=71 len=3 span[header_value]="def" off=75 header_value complete off=76 headers complete method=3 v=1/1 flags=208 content_length=0 off=78 chunk header len=1 off=78 len=1 span[body]="A" off=80 chunk complete off=82 len=3 span[chunk_extension_name]="abc" off=85 chunk_extension_name complete off=86 chunk header len=1 off=86 len=1 span[body]="B" off=88 chunk complete off=90 len=3 span[chunk_extension_name]="def" off=94 chunk_extension_name complete off=94 len=3 span[chunk_extension_value]="ghi" off=97 chunk_extension_value complete off=98 chunk header len=1 off=98 len=1 span[body]="C" off=100 chunk complete off=102 len=3 span[chunk_extension_name]="jkl" off=106 chunk_extension_name complete off=106 len=5 span[chunk_extension_value]=""mno"" off=111 chunk_extension_value complete off=112 chunk header len=1 off=112 len=1 span[body]="D" off=114 chunk complete off=117 chunk header len=0 off=117 len=3 span[header_field]="Baz" off=121 header_field complete off=122 len=3 span[header_value]="ghi" off=126 header_value complete off=127 chunk complete off=127 message complete ``` ### Spaces before headers <!-- meta={ "type": "request" } --> ```http POST /hello HTTP/1.1 Host: localhost Foo: bar Content-Length: 38 GET /bye HTTP/1.1 Host: localhost ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=6 span[url]="/hello" off=12 url complete off=17 len=3 span[version]="1.1" off=20 version complete off=22 len=4 span[header_field]="Host" off=27 header_field complete off=28 len=9 span[header_value]="localhost" off=39 header_value complete off=39 len=3 span[header_field]="Foo" off=43 header_field complete off=44 len=3 span[header_value]="bar" off=49 error code=10 reason="Unexpected whitespace after header value" ``` ### Spaces before headers (lenient) <!-- meta={ "type": "request-lenient-headers" } --> ```http POST /hello HTTP/1.1 Host: localhost Foo: bar Content-Length: 38 GET /bye HTTP/1.1 Host: localhost ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=6 span[url]="/hello" off=12 url complete off=17 len=3 span[version]="1.1" off=20 version complete off=22 len=4 span[header_field]="Host" off=27 header_field complete off=28 len=9 span[header_value]="localhost" off=39 header_value complete off=39 len=3 span[header_field]="Foo" off=43 header_field complete off=44 len=3 span[header_value]="bar" off=49 len=19 span[header_value]=" Content-Length: 38" off=70 header_value complete off=72 headers complete method=3 v=1/1 flags=0 content_length=0 off=72 message complete off=72 reset off=72 message begin off=72 len=3 span[method]="GET" off=75 method complete off=76 len=4 span[url]="/bye" off=81 url complete off=86 len=3 span[version]="1.1" off=89 version complete off=91 len=4 span[header_field]="Host" off=96 header_field complete off=97 len=9 span[header_value]="localhost" off=108 header_value complete off=110 headers complete method=1 v=1/1 flags=0 content_length=0 off=110 message complete ```��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/request/lenient-headers.md�����������������������������������������0000644�0001751�0000177�00000006235�14607525267�023475� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Lenient header value parsing ============================ Parsing with header value token checks off. ## Header value (lenient) <!-- meta={"type": "request-lenient-headers"} --> ```http GET /url HTTP/1.1 Header1: \f ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=7 span[header_field]="Header1" off=27 header_field complete off=28 len=1 span[header_value]="\f" off=31 header_value complete off=33 headers complete method=1 v=1/1 flags=0 content_length=0 off=33 message complete ``` ## Second request header value (lenient) <!-- meta={"type": "request-lenient-headers"} --> ```http GET /url HTTP/1.1 Header1: Okay GET /url HTTP/1.1 Header1: \f ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=7 span[header_field]="Header1" off=27 header_field complete off=28 len=4 span[header_value]="Okay" off=34 header_value complete off=36 headers complete method=1 v=1/1 flags=0 content_length=0 off=36 message complete off=38 reset off=38 message begin off=38 len=3 span[method]="GET" off=41 method complete off=42 len=4 span[url]="/url" off=47 url complete off=52 len=3 span[version]="1.1" off=55 version complete off=57 len=7 span[header_field]="Header1" off=65 header_field complete off=66 len=1 span[header_value]="\f" off=69 header_value complete off=71 headers complete method=1 v=1/1 flags=0 content_length=0 off=71 message complete ``` ## Header value <!-- meta={"type": "request"} --> ```http GET /url HTTP/1.1 Header1: \f ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=7 span[header_field]="Header1" off=27 header_field complete off=28 len=0 span[header_value]="" off=28 error code=10 reason="Invalid header value char" ``` ### Empty headers separated by CR (lenient) <!-- meta={"type": "request-lenient-headers"} --> ```http POST / HTTP/1.1 Connection: Close Host: localhost:5000 x:\rTransfer-Encoding: chunked 1 A 0 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=10 span[header_field]="Connection" off=28 header_field complete off=29 len=5 span[header_value]="Close" off=36 header_value complete off=36 len=4 span[header_field]="Host" off=41 header_field complete off=42 len=14 span[header_value]="localhost:5000" off=58 header_value complete off=58 len=1 span[header_field]="x" off=60 header_field complete off=61 len=0 span[header_value]="" off=61 header_value complete off=61 len=17 span[header_field]="Transfer-Encoding" off=79 header_field complete off=80 len=7 span[header_value]="chunked" off=89 header_value complete off=91 headers complete method=3 v=1/1 flags=20a content_length=0 off=94 chunk header len=1 off=94 len=1 span[body]="A" off=97 chunk complete off=100 chunk header len=0 ```�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/request/lenient-version.md�����������������������������������������0000644�0001751�0000177�00000000700�14607525267�023536� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Lenient HTTP version parsing ============================ ### Invalid HTTP version (lenient) <!-- meta={"type": "request-lenient-version"} --> ```http GET / HTTP/5.6 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="5.6" off=14 version complete off=18 headers complete method=1 v=5/6 flags=0 content_length=0 off=18 message complete ```����������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/request/method.md��������������������������������������������������0000644�0001751�0000177�00000027254�14607525267�021712� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Methods ======= ### REPORT request <!-- meta={"type": "request"} --> ```http REPORT /test HTTP/1.1 ``` ```log off=0 message begin off=0 len=6 span[method]="REPORT" off=6 method complete off=7 len=5 span[url]="/test" off=13 url complete off=18 len=3 span[version]="1.1" off=21 version complete off=25 headers complete method=20 v=1/1 flags=0 content_length=0 off=25 message complete ``` ### CONNECT request <!-- meta={"type": "request"} --> ```http CONNECT 0-home0.netscape.com:443 HTTP/1.0 User-agent: Mozilla/1.1N Proxy-authorization: basic aGVsbG86d29ybGQ= some data and yet even more data ``` ```log off=0 message begin off=0 len=7 span[method]="CONNECT" off=7 method complete off=8 len=24 span[url]="0-home0.netscape.com:443" off=33 url complete off=38 len=3 span[version]="1.0" off=41 version complete off=43 len=10 span[header_field]="User-agent" off=54 header_field complete off=55 len=12 span[header_value]="Mozilla/1.1N" off=69 header_value complete off=69 len=19 span[header_field]="Proxy-authorization" off=89 header_field complete off=90 len=22 span[header_value]="basic aGVsbG86d29ybGQ=" off=114 header_value complete off=116 headers complete method=5 v=1/0 flags=0 content_length=0 off=116 message complete off=116 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### CONNECT request with CAPS <!-- meta={"type": "request"} --> ```http CONNECT HOME0.NETSCAPE.COM:443 HTTP/1.0 User-agent: Mozilla/1.1N Proxy-authorization: basic aGVsbG86d29ybGQ= ``` ```log off=0 message begin off=0 len=7 span[method]="CONNECT" off=7 method complete off=8 len=22 span[url]="HOME0.NETSCAPE.COM:443" off=31 url complete off=36 len=3 span[version]="1.0" off=39 version complete off=41 len=10 span[header_field]="User-agent" off=52 header_field complete off=53 len=12 span[header_value]="Mozilla/1.1N" off=67 header_value complete off=67 len=19 span[header_field]="Proxy-authorization" off=87 header_field complete off=88 len=22 span[header_value]="basic aGVsbG86d29ybGQ=" off=112 header_value complete off=114 headers complete method=5 v=1/0 flags=0 content_length=0 off=114 message complete off=114 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### CONNECT with body <!-- meta={"type": "request"} --> ```http CONNECT foo.bar.com:443 HTTP/1.0 User-agent: Mozilla/1.1N Proxy-authorization: basic aGVsbG86d29ybGQ= Content-Length: 10 blarfcicle" ``` ```log off=0 message begin off=0 len=7 span[method]="CONNECT" off=7 method complete off=8 len=15 span[url]="foo.bar.com:443" off=24 url complete off=29 len=3 span[version]="1.0" off=32 version complete off=34 len=10 span[header_field]="User-agent" off=45 header_field complete off=46 len=12 span[header_value]="Mozilla/1.1N" off=60 header_value complete off=60 len=19 span[header_field]="Proxy-authorization" off=80 header_field complete off=81 len=22 span[header_value]="basic aGVsbG86d29ybGQ=" off=105 header_value complete off=105 len=14 span[header_field]="Content-Length" off=120 header_field complete off=121 len=2 span[header_value]="10" off=125 header_value complete off=127 headers complete method=5 v=1/0 flags=20 content_length=10 off=127 message complete off=127 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### M-SEARCH request <!-- meta={"type": "request"} --> ```http M-SEARCH * HTTP/1.1 HOST: 239.255.255.250:1900 MAN: "ssdp:discover" ST: "ssdp:all" ``` ```log off=0 message begin off=0 len=8 span[method]="M-SEARCH" off=8 method complete off=9 len=1 span[url]="*" off=11 url complete off=16 len=3 span[version]="1.1" off=19 version complete off=21 len=4 span[header_field]="HOST" off=26 header_field complete off=27 len=20 span[header_value]="239.255.255.250:1900" off=49 header_value complete off=49 len=3 span[header_field]="MAN" off=53 header_field complete off=54 len=15 span[header_value]=""ssdp:discover"" off=71 header_value complete off=71 len=2 span[header_field]="ST" off=74 header_field complete off=75 len=10 span[header_value]=""ssdp:all"" off=87 header_value complete off=89 headers complete method=24 v=1/1 flags=0 content_length=0 off=89 message complete ``` ### PATCH request <!-- meta={"type": "request"} --> ```http PATCH /file.txt HTTP/1.1 Host: www.example.com Content-Type: application/example If-Match: "e0023aa4e" Content-Length: 10 cccccccccc ``` ```log off=0 message begin off=0 len=5 span[method]="PATCH" off=5 method complete off=6 len=9 span[url]="/file.txt" off=16 url complete off=21 len=3 span[version]="1.1" off=24 version complete off=26 len=4 span[header_field]="Host" off=31 header_field complete off=32 len=15 span[header_value]="www.example.com" off=49 header_value complete off=49 len=12 span[header_field]="Content-Type" off=62 header_field complete off=63 len=19 span[header_value]="application/example" off=84 header_value complete off=84 len=8 span[header_field]="If-Match" off=93 header_field complete off=94 len=11 span[header_value]=""e0023aa4e"" off=107 header_value complete off=107 len=14 span[header_field]="Content-Length" off=122 header_field complete off=123 len=2 span[header_value]="10" off=127 header_value complete off=129 headers complete method=28 v=1/1 flags=20 content_length=10 off=129 len=10 span[body]="cccccccccc" off=139 message complete ``` ### PURGE request <!-- meta={"type": "request"} --> ```http PURGE /file.txt HTTP/1.1 Host: www.example.com ``` ```log off=0 message begin off=0 len=5 span[method]="PURGE" off=5 method complete off=6 len=9 span[url]="/file.txt" off=16 url complete off=21 len=3 span[version]="1.1" off=24 version complete off=26 len=4 span[header_field]="Host" off=31 header_field complete off=32 len=15 span[header_value]="www.example.com" off=49 header_value complete off=51 headers complete method=29 v=1/1 flags=0 content_length=0 off=51 message complete ``` ### SEARCH request <!-- meta={"type": "request"} --> ```http SEARCH / HTTP/1.1 Host: www.example.com ``` ```log off=0 message begin off=0 len=6 span[method]="SEARCH" off=6 method complete off=7 len=1 span[url]="/" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=4 span[header_field]="Host" off=24 header_field complete off=25 len=15 span[header_value]="www.example.com" off=42 header_value complete off=44 headers complete method=14 v=1/1 flags=0 content_length=0 off=44 message complete ``` ### LINK request <!-- meta={"type": "request"} --> ```http LINK /images/my_dog.jpg HTTP/1.1 Host: example.com Link: <http://example.com/profiles/joe>; rel="tag" Link: <http://example.com/profiles/sally>; rel="tag" ``` ```log off=0 message begin off=0 len=4 span[method]="LINK" off=4 method complete off=5 len=18 span[url]="/images/my_dog.jpg" off=24 url complete off=29 len=3 span[version]="1.1" off=32 version complete off=34 len=4 span[header_field]="Host" off=39 header_field complete off=40 len=11 span[header_value]="example.com" off=53 header_value complete off=53 len=4 span[header_field]="Link" off=58 header_field complete off=59 len=44 span[header_value]="<http://example.com/profiles/joe>; rel="tag"" off=105 header_value complete off=105 len=4 span[header_field]="Link" off=110 header_field complete off=111 len=46 span[header_value]="<http://example.com/profiles/sally>; rel="tag"" off=159 header_value complete off=161 headers complete method=31 v=1/1 flags=0 content_length=0 off=161 message complete ``` ### LINK request <!-- meta={"type": "request"} --> ```http UNLINK /images/my_dog.jpg HTTP/1.1 Host: example.com Link: <http://example.com/profiles/sally>; rel="tag" ``` ```log off=0 message begin off=0 len=6 span[method]="UNLINK" off=6 method complete off=7 len=18 span[url]="/images/my_dog.jpg" off=26 url complete off=31 len=3 span[version]="1.1" off=34 version complete off=36 len=4 span[header_field]="Host" off=41 header_field complete off=42 len=11 span[header_value]="example.com" off=55 header_value complete off=55 len=4 span[header_field]="Link" off=60 header_field complete off=61 len=46 span[header_value]="<http://example.com/profiles/sally>; rel="tag"" off=109 header_value complete off=111 headers complete method=32 v=1/1 flags=0 content_length=0 off=111 message complete ``` ### SOURCE request <!-- meta={"type": "request"} --> ```http SOURCE /music/sweet/music HTTP/1.1 Host: example.com ``` ```log off=0 message begin off=0 len=6 span[method]="SOURCE" off=6 method complete off=7 len=18 span[url]="/music/sweet/music" off=26 url complete off=31 len=3 span[version]="1.1" off=34 version complete off=36 len=4 span[header_field]="Host" off=41 header_field complete off=42 len=11 span[header_value]="example.com" off=55 header_value complete off=57 headers complete method=33 v=1/1 flags=0 content_length=0 off=57 message complete ``` ### SOURCE request with ICE <!-- meta={"type": "request"} --> ```http SOURCE /music/sweet/music ICE/1.0 Host: example.com ``` ```log off=0 message begin off=0 len=6 span[method]="SOURCE" off=6 method complete off=7 len=18 span[url]="/music/sweet/music" off=26 url complete off=30 len=3 span[version]="1.0" off=33 version complete off=35 len=4 span[header_field]="Host" off=40 header_field complete off=41 len=11 span[header_value]="example.com" off=54 header_value complete off=56 headers complete method=33 v=1/0 flags=0 content_length=0 off=56 message complete ``` ### OPTIONS request with RTSP NOTE: `OPTIONS` is a valid HTTP metho too. <!-- meta={"type": "request"} --> ```http OPTIONS /music/sweet/music RTSP/1.0 Host: example.com ``` ```log off=0 message begin off=0 len=7 span[method]="OPTIONS" off=7 method complete off=8 len=18 span[url]="/music/sweet/music" off=27 url complete off=32 len=3 span[version]="1.0" off=35 version complete off=37 len=4 span[header_field]="Host" off=42 header_field complete off=43 len=11 span[header_value]="example.com" off=56 header_value complete off=58 headers complete method=6 v=1/0 flags=0 content_length=0 off=58 message complete ``` ### ANNOUNCE request with RTSP <!-- meta={"type": "request"} --> ```http ANNOUNCE /music/sweet/music RTSP/1.0 Host: example.com ``` ```log off=0 message begin off=0 len=8 span[method]="ANNOUNCE" off=8 method complete off=9 len=18 span[url]="/music/sweet/music" off=28 url complete off=33 len=3 span[version]="1.0" off=36 version complete off=38 len=4 span[header_field]="Host" off=43 header_field complete off=44 len=11 span[header_value]="example.com" off=57 header_value complete off=59 headers complete method=36 v=1/0 flags=0 content_length=0 off=59 message complete ``` ### PRI request HTTP2 <!-- meta={"type": "request"} --> ```http PRI * HTTP/1.1 SM ``` ```log off=0 message begin off=0 len=3 span[method]="PRI" off=3 method complete off=4 len=1 span[url]="*" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=24 error code=23 reason="Pause on PRI/Upgrade" ``` ### QUERY request <!-- meta={"type": "request"} --> ```http QUERY /contacts HTTP/1.1 Host: example.org Content-Type: example/query Accept: text/csv Content-Length: 41 select surname, givenname, email limit 10 ``` ```log off=0 message begin off=0 len=5 span[method]="QUERY" off=5 method complete off=6 len=9 span[url]="/contacts" off=16 url complete off=21 len=3 span[version]="1.1" off=24 version complete off=26 len=4 span[header_field]="Host" off=31 header_field complete off=32 len=11 span[header_value]="example.org" off=45 header_value complete off=45 len=12 span[header_field]="Content-Type" off=58 header_field complete off=59 len=13 span[header_value]="example/query" off=74 header_value complete off=74 len=6 span[header_field]="Accept" off=81 header_field complete off=82 len=8 span[header_value]="text/csv" off=92 header_value complete off=92 len=14 span[header_field]="Content-Length" off=107 header_field complete off=108 len=2 span[header_value]="41" off=112 header_value complete off=114 headers complete method=46 v=1/1 flags=20 content_length=41 off=114 len=41 span[body]="select surname, givenname, email limit 10" off=155 message complete ``` ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/request/pausing.md�������������������������������������������������0000644�0001751�0000177�00000020042�14607525267�022064� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Pausing ======= ### on_message_begin <!-- meta={"type": "request", "pause": "on_message_begin"} --> ```http POST / HTTP/1.1 Content-Length: 3 abc ``` ```log off=0 message begin off=0 pause off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=1 span[header_value]="3" off=36 header_value complete off=38 headers complete method=3 v=1/1 flags=20 content_length=3 off=38 len=3 span[body]="abc" off=41 message complete ``` ### on_message_complete <!-- meta={"type": "request", "pause": "on_message_complete"} --> ```http POST / HTTP/1.1 Content-Length: 3 abc ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=1 span[header_value]="3" off=36 header_value complete off=38 headers complete method=3 v=1/1 flags=20 content_length=3 off=38 len=3 span[body]="abc" off=41 message complete off=41 pause ``` ### on_method_complete <!-- meta={"type": "request", "pause": "on_method_complete"} --> ```http POST / HTTP/1.1 Content-Length: 3 abc ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=4 pause off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=1 span[header_value]="3" off=36 header_value complete off=38 headers complete method=3 v=1/1 flags=20 content_length=3 off=38 len=3 span[body]="abc" off=41 message complete ``` ### on_url_complete <!-- meta={"type": "request", "pause": "on_url_complete"} --> ```http POST / HTTP/1.1 Content-Length: 3 abc ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=7 pause off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=1 span[header_value]="3" off=36 header_value complete off=38 headers complete method=3 v=1/1 flags=20 content_length=3 off=38 len=3 span[body]="abc" off=41 message complete ``` ### on_version_complete <!-- meta={"type": "request", "pause": "on_version_complete"} --> ```http POST / HTTP/1.1 Content-Length: 3 abc ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=15 pause off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=1 span[header_value]="3" off=36 header_value complete off=38 headers complete method=3 v=1/1 flags=20 content_length=3 off=38 len=3 span[body]="abc" off=41 message complete ``` ### on_header_field_complete <!-- meta={"type": "request", "pause": "on_header_field_complete"} --> ```http POST / HTTP/1.1 Content-Length: 3 abc ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=32 pause off=33 len=1 span[header_value]="3" off=36 header_value complete off=38 headers complete method=3 v=1/1 flags=20 content_length=3 off=38 len=3 span[body]="abc" off=41 message complete ``` ### on_header_value_complete <!-- meta={"type": "request", "pause": "on_header_value_complete"} --> ```http POST / HTTP/1.1 Content-Length: 3 abc ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=1 span[header_value]="3" off=36 header_value complete off=36 pause off=38 headers complete method=3 v=1/1 flags=20 content_length=3 off=38 len=3 span[body]="abc" off=41 message complete ``` ### on_headers_complete <!-- meta={"type": "request", "pause": "on_headers_complete"} --> ```http POST / HTTP/1.1 Content-Length: 3 abc ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=1 span[header_value]="3" off=36 header_value complete off=38 headers complete method=3 v=1/1 flags=20 content_length=3 off=38 pause off=38 len=3 span[body]="abc" off=41 message complete ``` ### on_chunk_header <!-- meta={"type": "request", "pause": "on_chunk_header"} --> ```http PUT / HTTP/1.1 Transfer-Encoding: chunked a 0123456789 0 ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=17 span[header_field]="Transfer-Encoding" off=34 header_field complete off=35 len=7 span[header_value]="chunked" off=44 header_value complete off=46 headers complete method=4 v=1/1 flags=208 content_length=0 off=49 chunk header len=10 off=49 pause off=49 len=10 span[body]="0123456789" off=61 chunk complete off=64 chunk header len=0 off=64 pause off=66 chunk complete off=66 message complete ``` ### on_chunk_extension_name <!-- meta={"type": "request", "pause": "on_chunk_extension_name"} --> ```http PUT / HTTP/1.1 Transfer-Encoding: chunked a;foo=bar 0123456789 0 ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=17 span[header_field]="Transfer-Encoding" off=34 header_field complete off=35 len=7 span[header_value]="chunked" off=44 header_value complete off=46 headers complete method=4 v=1/1 flags=208 content_length=0 off=48 len=3 span[chunk_extension_name]="foo" off=52 chunk_extension_name complete off=52 pause off=52 len=3 span[chunk_extension_value]="bar" off=56 chunk_extension_value complete off=57 chunk header len=10 off=57 len=10 span[body]="0123456789" off=69 chunk complete off=72 chunk header len=0 off=74 chunk complete off=74 message complete ``` ### on_chunk_extension_value <!-- meta={"type": "request", "pause": "on_chunk_extension_value"} --> ```http PUT / HTTP/1.1 Transfer-Encoding: chunked a;foo=bar 0123456789 0 ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=17 span[header_field]="Transfer-Encoding" off=34 header_field complete off=35 len=7 span[header_value]="chunked" off=44 header_value complete off=46 headers complete method=4 v=1/1 flags=208 content_length=0 off=48 len=3 span[chunk_extension_name]="foo" off=52 chunk_extension_name complete off=52 len=3 span[chunk_extension_value]="bar" off=56 chunk_extension_value complete off=56 pause off=57 chunk header len=10 off=57 len=10 span[body]="0123456789" off=69 chunk complete off=72 chunk header len=0 off=74 chunk complete off=74 message complete ``` ### on_chunk_complete <!-- meta={"type": "request", "pause": "on_chunk_complete"} --> ```http PUT / HTTP/1.1 Transfer-Encoding: chunked a 0123456789 0 ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=17 span[header_field]="Transfer-Encoding" off=34 header_field complete off=35 len=7 span[header_value]="chunked" off=44 header_value complete off=46 headers complete method=4 v=1/1 flags=208 content_length=0 off=49 chunk header len=10 off=49 len=10 span[body]="0123456789" off=61 chunk complete off=61 pause off=64 chunk header len=0 off=66 chunk complete off=66 pause off=66 message complete ``` ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/request/pipelining.md����������������������������������������������0000644�0001751�0000177�00000003070�14607525267�022556� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Pipelining ========== ## Should parse multiple events <!-- meta={"type": "request"} --> ```http POST /aaa HTTP/1.1 Content-Length: 3 AAA PUT /bbb HTTP/1.1 Content-Length: 4 BBBB PATCH /ccc HTTP/1.1 Content-Length: 5 CCCC ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=4 span[url]="/aaa" off=10 url complete off=15 len=3 span[version]="1.1" off=18 version complete off=20 len=14 span[header_field]="Content-Length" off=35 header_field complete off=36 len=1 span[header_value]="3" off=39 header_value complete off=41 headers complete method=3 v=1/1 flags=20 content_length=3 off=41 len=3 span[body]="AAA" off=44 message complete off=46 reset off=46 message begin off=46 len=3 span[method]="PUT" off=49 method complete off=50 len=4 span[url]="/bbb" off=55 url complete off=60 len=3 span[version]="1.1" off=63 version complete off=65 len=14 span[header_field]="Content-Length" off=80 header_field complete off=81 len=1 span[header_value]="4" off=84 header_value complete off=86 headers complete method=4 v=1/1 flags=20 content_length=4 off=86 len=4 span[body]="BBBB" off=90 message complete off=92 reset off=92 message begin off=92 len=5 span[method]="PATCH" off=97 method complete off=98 len=4 span[url]="/ccc" off=103 url complete off=108 len=3 span[version]="1.1" off=111 version complete off=113 len=14 span[header_field]="Content-Length" off=128 header_field complete off=129 len=1 span[header_value]="5" off=132 header_value complete off=134 headers complete method=28 v=1/1 flags=20 content_length=5 off=134 len=4 span[body]="CCCC" ```������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/request/sample.md��������������������������������������������������0000644�0001751�0000177�00000043624�14607525267�021712� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Sample requests =============== Lots of sample requests, most ported from [http_parser][0] test suite. ## Simple request <!-- meta={"type": "request"} --> ```http OPTIONS /url HTTP/1.1 Header1: Value1 Header2:\t Value2 ``` ```log off=0 message begin off=0 len=7 span[method]="OPTIONS" off=7 method complete off=8 len=4 span[url]="/url" off=13 url complete off=18 len=3 span[version]="1.1" off=21 version complete off=23 len=7 span[header_field]="Header1" off=31 header_field complete off=32 len=6 span[header_value]="Value1" off=40 header_value complete off=40 len=7 span[header_field]="Header2" off=48 header_field complete off=50 len=6 span[header_value]="Value2" off=58 header_value complete off=60 headers complete method=6 v=1/1 flags=0 content_length=0 off=60 message complete ``` ## Request with method starting with `H` There's a optimization in `start_req_or_res` that passes execution to `start_req` when the first character is not `H` (because response must start with `HTTP/`). However, there're still methods like `HEAD` that should get to `start_req`. Verify that it still works after optimization. <!-- meta={"type": "request", "noScan": true } --> ```http HEAD /url HTTP/1.1 ``` ```log off=0 message begin off=0 len=4 span[method]="HEAD" off=4 method complete off=5 len=4 span[url]="/url" off=10 url complete off=15 len=3 span[version]="1.1" off=18 version complete off=22 headers complete method=2 v=1/1 flags=0 content_length=0 off=22 message complete ``` ## curl GET <!-- meta={"type": "request"} --> ```http GET /test HTTP/1.1 User-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1 Host: 0.0.0.0=5000 Accept: */* ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=5 span[url]="/test" off=10 url complete off=15 len=3 span[version]="1.1" off=18 version complete off=20 len=10 span[header_field]="User-Agent" off=31 header_field complete off=32 len=85 span[header_value]="curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1" off=119 header_value complete off=119 len=4 span[header_field]="Host" off=124 header_field complete off=125 len=12 span[header_value]="0.0.0.0=5000" off=139 header_value complete off=139 len=6 span[header_field]="Accept" off=146 header_field complete off=147 len=3 span[header_value]="*/*" off=152 header_value complete off=154 headers complete method=1 v=1/1 flags=0 content_length=0 off=154 message complete ``` ## Firefox GET <!-- meta={"type": "request"} --> ```http GET /favicon.ico HTTP/1.1 Host: 0.0.0.0=5000 User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=12 span[url]="/favicon.ico" off=17 url complete off=22 len=3 span[version]="1.1" off=25 version complete off=27 len=4 span[header_field]="Host" off=32 header_field complete off=33 len=12 span[header_value]="0.0.0.0=5000" off=47 header_value complete off=47 len=10 span[header_field]="User-Agent" off=58 header_field complete off=59 len=76 span[header_value]="Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0" off=137 header_value complete off=137 len=6 span[header_field]="Accept" off=144 header_field complete off=145 len=63 span[header_value]="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" off=210 header_value complete off=210 len=15 span[header_field]="Accept-Language" off=226 header_field complete off=227 len=14 span[header_value]="en-us,en;q=0.5" off=243 header_value complete off=243 len=15 span[header_field]="Accept-Encoding" off=259 header_field complete off=260 len=12 span[header_value]="gzip,deflate" off=274 header_value complete off=274 len=14 span[header_field]="Accept-Charset" off=289 header_field complete off=290 len=30 span[header_value]="ISO-8859-1,utf-8;q=0.7,*;q=0.7" off=322 header_value complete off=322 len=10 span[header_field]="Keep-Alive" off=333 header_field complete off=334 len=3 span[header_value]="300" off=339 header_value complete off=339 len=10 span[header_field]="Connection" off=350 header_field complete off=351 len=10 span[header_value]="keep-alive" off=363 header_value complete off=365 headers complete method=1 v=1/1 flags=1 content_length=0 off=365 message complete ``` ## DUMBPACK <!-- meta={"type": "request"} --> ```http GET /dumbpack HTTP/1.1 aaaaaaaaaaaaa:++++++++++ ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=9 span[url]="/dumbpack" off=14 url complete off=19 len=3 span[version]="1.1" off=22 version complete off=24 len=13 span[header_field]="aaaaaaaaaaaaa" off=38 header_field complete off=38 len=10 span[header_value]="++++++++++" off=50 header_value complete off=52 headers complete method=1 v=1/1 flags=0 content_length=0 off=52 message complete ``` ## No headers and no body <!-- meta={"type": "request"} --> ```http GET /get_no_headers_no_body/world HTTP/1.1 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=29 span[url]="/get_no_headers_no_body/world" off=34 url complete off=39 len=3 span[version]="1.1" off=42 version complete off=46 headers complete method=1 v=1/1 flags=0 content_length=0 off=46 message complete ``` ## One header and no body <!-- meta={"type": "request"} --> ```http GET /get_one_header_no_body HTTP/1.1 Accept: */* ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=23 span[url]="/get_one_header_no_body" off=28 url complete off=33 len=3 span[version]="1.1" off=36 version complete off=38 len=6 span[header_field]="Accept" off=45 header_field complete off=46 len=3 span[header_value]="*/*" off=51 header_value complete off=53 headers complete method=1 v=1/1 flags=0 content_length=0 off=53 message complete ``` ## Apache bench GET The server receiving this request SHOULD NOT wait for EOF to know that `Content-Length == 0`. <!-- meta={"type": "request"} --> ```http GET /test HTTP/1.0 Host: 0.0.0.0:5000 User-Agent: ApacheBench/2.3 Accept: */* ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=5 span[url]="/test" off=10 url complete off=15 len=3 span[version]="1.0" off=18 version complete off=20 len=4 span[header_field]="Host" off=25 header_field complete off=26 len=12 span[header_value]="0.0.0.0:5000" off=40 header_value complete off=40 len=10 span[header_field]="User-Agent" off=51 header_field complete off=52 len=15 span[header_value]="ApacheBench/2.3" off=69 header_value complete off=69 len=6 span[header_field]="Accept" off=76 header_field complete off=77 len=3 span[header_value]="*/*" off=82 header_value complete off=84 headers complete method=1 v=1/0 flags=0 content_length=0 off=84 message complete ``` ## Prefix newline Some clients, especially after a POST in a keep-alive connection, will send an extra CRLF before the next request. <!-- meta={"type": "request"} --> ```http \r\nGET /test HTTP/1.1 ``` ```log off=2 message begin off=2 len=3 span[method]="GET" off=5 method complete off=6 len=5 span[url]="/test" off=12 url complete off=17 len=3 span[version]="1.1" off=20 version complete off=24 headers complete method=1 v=1/1 flags=0 content_length=0 off=24 message complete ``` ## No HTTP version <!-- meta={"type": "request"} --> ```http GET / ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=7 url complete off=9 headers complete method=1 v=0/9 flags=0 content_length=0 off=9 message complete ``` ## Line folding in header value with CRLF <!-- meta={"type": "request-lenient-headers"} --> ```http GET / HTTP/1.1 Line1: abc \tdef ghi \t\tjkl mno \t \tqrs Line2: \t line2\t Line3: line3 Line4: Connection: close ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=5 span[header_field]="Line1" off=22 header_field complete off=25 len=3 span[header_value]="abc" off=30 len=4 span[header_value]="\tdef" off=36 len=4 span[header_value]=" ghi" off=42 len=5 span[header_value]="\t\tjkl" off=49 len=6 span[header_value]=" mno " off=57 len=6 span[header_value]="\t \tqrs" off=65 header_value complete off=65 len=5 span[header_field]="Line2" off=71 header_field complete off=74 len=6 span[header_value]="line2\t" off=82 header_value complete off=82 len=5 span[header_field]="Line3" off=88 header_field complete off=91 len=5 span[header_value]="line3" off=98 header_value complete off=98 len=5 span[header_field]="Line4" off=104 header_field complete off=110 len=0 span[header_value]="" off=110 header_value complete off=110 len=10 span[header_field]="Connection" off=121 header_field complete off=124 len=5 span[header_value]="close" off=131 header_value complete off=133 headers complete method=1 v=1/1 flags=2 content_length=0 off=133 message complete ``` ## Line folding in header value with LF <!-- meta={"type": "request"} --> ```http GET / HTTP/1.1 Line1: abc\n\ \tdef\n\ ghi\n\ \t\tjkl\n\ mno \n\ \t \tqrs\n\ Line2: \t line2\t\n\ Line3:\n\ line3\n\ Line4: \n\ \n\ Connection:\n\ close\n\ \n ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=5 span[header_field]="Line1" off=22 header_field complete off=25 len=3 span[header_value]="abc" off=28 error code=25 reason="Missing expected CR after header value" ``` ## No LF after CR <!-- meta={"type":"request"} --> ```http GET / HTTP/1.1\rLine: 1 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=15 error code=2 reason="Expected CRLF after version" ``` ## No LF after CR (lenient) <!-- meta={"type":"request-lenient-optional-lf-after-cr"} --> ```http GET / HTTP/1.1\rLine: 1 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=15 len=4 span[header_field]="Line" off=20 header_field complete off=21 len=1 span[header_value]="1" ``` ## Request starting with CRLF <!-- meta={"type": "request"} --> ```http \r\nGET /url HTTP/1.1 Header1: Value1 ``` ```log off=2 message begin off=2 len=3 span[method]="GET" off=5 method complete off=6 len=4 span[url]="/url" off=11 url complete off=16 len=3 span[version]="1.1" off=19 version complete off=21 len=7 span[header_field]="Header1" off=29 header_field complete off=30 len=6 span[header_value]="Value1" off=38 header_value complete off=40 headers complete method=1 v=1/1 flags=0 content_length=0 off=40 message complete ``` ## Extended Characters See nodejs/test/parallel/test-http-headers-obstext.js <!-- meta={"type": "request", "noScan": true} --> ```http GET / HTTP/1.1 Test: Düsseldorf ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=4 span[header_field]="Test" off=21 header_field complete off=22 len=11 span[header_value]="Düsseldorf" off=35 header_value complete off=37 headers complete method=1 v=1/1 flags=0 content_length=0 off=37 message complete ``` ## 255 ASCII in header value Note: `Buffer.from([ 0xff ]).toString('latin1') === 'ÿ'`. <!-- meta={"type": "request", "noScan": true} --> ```http OPTIONS /url HTTP/1.1 Header1: Value1 Header2: \xffValue2 ``` ```log off=0 message begin off=0 len=7 span[method]="OPTIONS" off=7 method complete off=8 len=4 span[url]="/url" off=13 url complete off=18 len=3 span[version]="1.1" off=21 version complete off=23 len=7 span[header_field]="Header1" off=31 header_field complete off=32 len=6 span[header_value]="Value1" off=40 header_value complete off=40 len=7 span[header_field]="Header2" off=48 header_field complete off=49 len=8 span[header_value]="ÿValue2" off=59 header_value complete off=61 headers complete method=6 v=1/1 flags=0 content_length=0 off=61 message complete ``` ## X-SSL-Nonsense See nodejs/test/parallel/test-http-headers-obstext.js <!-- meta={"type": "request-lenient-headers"} --> ```http GET / HTTP/1.1 X-SSL-Nonsense: -----BEGIN CERTIFICATE----- \tMIIFbTCCBFWgAwIBAgICH4cwDQYJKoZIhvcNAQEFBQAwcDELMAkGA1UEBhMCVUsx \tETAPBgNVBAoTCGVTY2llbmNlMRIwEAYDVQQLEwlBdXRob3JpdHkxCzAJBgNVBAMT \tAkNBMS0wKwYJKoZIhvcNAQkBFh5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMu \tdWswHhcNMDYwNzI3MTQxMzI4WhcNMDcwNzI3MTQxMzI4WjBbMQswCQYDVQQGEwJV \tSzERMA8GA1UEChMIZVNjaWVuY2UxEzARBgNVBAsTCk1hbmNoZXN0ZXIxCzAJBgNV \tBAcTmrsogriqMWLAk1DMRcwFQYDVQQDEw5taWNoYWVsIHBhcmQYJKoZIhvcNAQEB \tBQADggEPADCCAQoCggEBANPEQBgl1IaKdSS1TbhF3hEXSl72G9J+WC/1R64fAcEF \tW51rEyFYiIeZGx/BVzwXbeBoNUK41OK65sxGuflMo5gLflbwJtHBRIEKAfVVp3YR \tgW7cMA/s/XKgL1GEC7rQw8lIZT8RApukCGqOVHSi/F1SiFlPDxuDfmdiNzL31+sL \t0iwHDdNkGjy5pyBSB8Y79dsSJtCW/iaLB0/n8Sj7HgvvZJ7x0fr+RQjYOUUfrePP \tu2MSpFyf+9BbC/aXgaZuiCvSR+8Snv3xApQY+fULK/xY8h8Ua51iXoQ5jrgu2SqR \twgA7BUi3G8LFzMBl8FRCDYGUDy7M6QaHXx1ZWIPWNKsCAwEAAaOCAiQwggIgMAwG \tA1UdEwEB/wQCMAAwEQYJYIZIAYb4QgHTTPAQDAgWgMA4GA1UdDwEB/wQEAwID6DAs \tBglghkgBhvhCAQ0EHxYdVUsgZS1TY2llbmNlIFVzZXIgQ2VydGlmaWNhdGUwHQYD \tVR0OBBYEFDTt/sf9PeMaZDHkUIldrDYMNTBZMIGaBgNVHSMEgZIwgY+AFAI4qxGj \tloCLDdMVKwiljjDastqooXSkcjBwMQswCQYDVQQGEwJVSzERMA8GA1UEChMIZVNj \taWVuY2UxEjAQBgNVBAsTCUF1dGhvcml0eTELMAkGA1UEAxMCQ0ExLTArBgkqhkiG \t9w0BCQEWHmNhLW9wZXJhdG9yQGdyaWQtc3VwcG9ydC5hYy51a4IBADApBgNVHRIE \tIjAggR5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMudWswGQYDVR0gBBIwEDAO \tBgwrBgEEAdkvAQEBAQYwPQYJYIZIAYb4QgEEBDAWLmh0dHA6Ly9jYS5ncmlkLXN1 \tcHBvcnQuYWMudmT4sopwqlBWsvcHViL2NybC9jYWNybC5jcmwwPQYJYIZIAYb4QgEDBDAWLmh0 \tdHA6Ly9jYS5ncmlkLXN1cHBvcnQuYWMudWsvcHViL2NybC9jYWNybC5jcmwwPwYD \tVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NhLmdyaWQt5hYy51ay9wdWIv \tY3JsL2NhY3JsLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAS/U4iiooBENGW/Hwmmd3 \tXCy6Zrt08YjKCzGNjorT98g8uGsqYjSxv/hmi0qlnlHs+k/3Iobc3LjS5AMYr5L8 \tUO7OSkgFFlLHQyC9JzPfmLCAugvzEbyv4Olnsr8hbxF1MbKZoQxUZtMVu29wjfXk \thTeApBv7eaKCWpSp7MCbvgzm74izKhu3vlDk9w6qVrxePfGgpKPqfHiOoGhFnbTK \twTC6o2xq5y0qZ03JonF7OJspEd3I5zKY3E+ov7/ZhW6DqT8UFvsAdjvQbXyhV8Eu \tYhixw1aKEPzNjNowuIseVogKOLXxWI5vAi5HgXdS0/ES5gDGsABo4fqovUKlgop3 \tRA== \t-----END CERTIFICATE----- ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=14 span[header_field]="X-SSL-Nonsense" off=31 header_field complete off=34 len=27 span[header_value]="-----BEGIN CERTIFICATE-----" off=63 len=65 span[header_value]="\tMIIFbTCCBFWgAwIBAgICH4cwDQYJKoZIhvcNAQEFBQAwcDELMAkGA1UEBhMCVUsx" off=130 len=65 span[header_value]="\tETAPBgNVBAoTCGVTY2llbmNlMRIwEAYDVQQLEwlBdXRob3JpdHkxCzAJBgNVBAMT" off=197 len=65 span[header_value]="\tAkNBMS0wKwYJKoZIhvcNAQkBFh5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMu" off=264 len=65 span[header_value]="\tdWswHhcNMDYwNzI3MTQxMzI4WhcNMDcwNzI3MTQxMzI4WjBbMQswCQYDVQQGEwJV" off=331 len=65 span[header_value]="\tSzERMA8GA1UEChMIZVNjaWVuY2UxEzARBgNVBAsTCk1hbmNoZXN0ZXIxCzAJBgNV" off=398 len=65 span[header_value]="\tBAcTmrsogriqMWLAk1DMRcwFQYDVQQDEw5taWNoYWVsIHBhcmQYJKoZIhvcNAQEB" off=465 len=65 span[header_value]="\tBQADggEPADCCAQoCggEBANPEQBgl1IaKdSS1TbhF3hEXSl72G9J+WC/1R64fAcEF" off=532 len=65 span[header_value]="\tW51rEyFYiIeZGx/BVzwXbeBoNUK41OK65sxGuflMo5gLflbwJtHBRIEKAfVVp3YR" off=599 len=65 span[header_value]="\tgW7cMA/s/XKgL1GEC7rQw8lIZT8RApukCGqOVHSi/F1SiFlPDxuDfmdiNzL31+sL" off=666 len=65 span[header_value]="\t0iwHDdNkGjy5pyBSB8Y79dsSJtCW/iaLB0/n8Sj7HgvvZJ7x0fr+RQjYOUUfrePP" off=733 len=65 span[header_value]="\tu2MSpFyf+9BbC/aXgaZuiCvSR+8Snv3xApQY+fULK/xY8h8Ua51iXoQ5jrgu2SqR" off=800 len=65 span[header_value]="\twgA7BUi3G8LFzMBl8FRCDYGUDy7M6QaHXx1ZWIPWNKsCAwEAAaOCAiQwggIgMAwG" off=867 len=66 span[header_value]="\tA1UdEwEB/wQCMAAwEQYJYIZIAYb4QgHTTPAQDAgWgMA4GA1UdDwEB/wQEAwID6DAs" off=935 len=65 span[header_value]="\tBglghkgBhvhCAQ0EHxYdVUsgZS1TY2llbmNlIFVzZXIgQ2VydGlmaWNhdGUwHQYD" off=1002 len=65 span[header_value]="\tVR0OBBYEFDTt/sf9PeMaZDHkUIldrDYMNTBZMIGaBgNVHSMEgZIwgY+AFAI4qxGj" off=1069 len=65 span[header_value]="\tloCLDdMVKwiljjDastqooXSkcjBwMQswCQYDVQQGEwJVSzERMA8GA1UEChMIZVNj" off=1136 len=65 span[header_value]="\taWVuY2UxEjAQBgNVBAsTCUF1dGhvcml0eTELMAkGA1UEAxMCQ0ExLTArBgkqhkiG" off=1203 len=65 span[header_value]="\t9w0BCQEWHmNhLW9wZXJhdG9yQGdyaWQtc3VwcG9ydC5hYy51a4IBADApBgNVHRIE" off=1270 len=65 span[header_value]="\tIjAggR5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMudWswGQYDVR0gBBIwEDAO" off=1337 len=65 span[header_value]="\tBgwrBgEEAdkvAQEBAQYwPQYJYIZIAYb4QgEEBDAWLmh0dHA6Ly9jYS5ncmlkLXN1" off=1404 len=75 span[header_value]="\tcHBvcnQuYWMudmT4sopwqlBWsvcHViL2NybC9jYWNybC5jcmwwPQYJYIZIAYb4QgEDBDAWLmh0" off=1481 len=65 span[header_value]="\tdHA6Ly9jYS5ncmlkLXN1cHBvcnQuYWMudWsvcHViL2NybC9jYWNybC5jcmwwPwYD" off=1548 len=55 span[header_value]="\tVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NhLmdyaWQt5hYy51ay9wdWIv" off=1605 len=65 span[header_value]="\tY3JsL2NhY3JsLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAS/U4iiooBENGW/Hwmmd3" off=1672 len=65 span[header_value]="\tXCy6Zrt08YjKCzGNjorT98g8uGsqYjSxv/hmi0qlnlHs+k/3Iobc3LjS5AMYr5L8" off=1739 len=65 span[header_value]="\tUO7OSkgFFlLHQyC9JzPfmLCAugvzEbyv4Olnsr8hbxF1MbKZoQxUZtMVu29wjfXk" off=1806 len=65 span[header_value]="\thTeApBv7eaKCWpSp7MCbvgzm74izKhu3vlDk9w6qVrxePfGgpKPqfHiOoGhFnbTK" off=1873 len=65 span[header_value]="\twTC6o2xq5y0qZ03JonF7OJspEd3I5zKY3E+ov7/ZhW6DqT8UFvsAdjvQbXyhV8Eu" off=1940 len=65 span[header_value]="\tYhixw1aKEPzNjNowuIseVogKOLXxWI5vAi5HgXdS0/ES5gDGsABo4fqovUKlgop3" off=2007 len=5 span[header_value]="\tRA==" off=2014 len=26 span[header_value]="\t-----END CERTIFICATE-----" off=2042 header_value complete off=2044 headers complete method=1 v=1/1 flags=0 content_length=0 off=2044 message complete ``` [0]: https://github.com/nodejs/http-parser ������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/request/transfer-encoding.md���������������������������������������0000644�0001751�0000177�00000070765�14607525267�024047� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Transfer-Encoding header ======================== ## `chunked` ### Parsing and setting flag <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Transfer-Encoding: chunked ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=17 span[header_field]="Transfer-Encoding" off=37 header_field complete off=38 len=7 span[header_value]="chunked" off=47 header_value complete off=49 headers complete method=4 v=1/1 flags=208 content_length=0 ``` ### Parse chunks with lowercase size <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Transfer-Encoding: chunked a 0123456789 0 ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=17 span[header_field]="Transfer-Encoding" off=37 header_field complete off=38 len=7 span[header_value]="chunked" off=47 header_value complete off=49 headers complete method=4 v=1/1 flags=208 content_length=0 off=52 chunk header len=10 off=52 len=10 span[body]="0123456789" off=64 chunk complete off=67 chunk header len=0 off=69 chunk complete off=69 message complete ``` ### Parse chunks with uppercase size <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Transfer-Encoding: chunked A 0123456789 0 ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=17 span[header_field]="Transfer-Encoding" off=37 header_field complete off=38 len=7 span[header_value]="chunked" off=47 header_value complete off=49 headers complete method=4 v=1/1 flags=208 content_length=0 off=52 chunk header len=10 off=52 len=10 span[body]="0123456789" off=64 chunk complete off=67 chunk header len=0 off=69 chunk complete off=69 message complete ``` ### POST with `Transfer-Encoding: chunked` <!-- meta={"type": "request"} --> ```http POST /post_chunked_all_your_base HTTP/1.1 Transfer-Encoding: chunked 1e all your base are belong to us 0 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=27 span[url]="/post_chunked_all_your_base" off=33 url complete off=38 len=3 span[version]="1.1" off=41 version complete off=43 len=17 span[header_field]="Transfer-Encoding" off=61 header_field complete off=62 len=7 span[header_value]="chunked" off=71 header_value complete off=73 headers complete method=3 v=1/1 flags=208 content_length=0 off=77 chunk header len=30 off=77 len=30 span[body]="all your base are belong to us" off=109 chunk complete off=112 chunk header len=0 off=114 chunk complete off=114 message complete ``` ### Two chunks and triple zero prefixed end chunk <!-- meta={"type": "request"} --> ```http POST /two_chunks_mult_zero_end HTTP/1.1 Transfer-Encoding: chunked 5 hello 6 world 000 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=25 span[url]="/two_chunks_mult_zero_end" off=31 url complete off=36 len=3 span[version]="1.1" off=39 version complete off=41 len=17 span[header_field]="Transfer-Encoding" off=59 header_field complete off=60 len=7 span[header_value]="chunked" off=69 header_value complete off=71 headers complete method=3 v=1/1 flags=208 content_length=0 off=74 chunk header len=5 off=74 len=5 span[body]="hello" off=81 chunk complete off=84 chunk header len=6 off=84 len=6 span[body]=" world" off=92 chunk complete off=97 chunk header len=0 off=99 chunk complete off=99 message complete ``` ### Trailing headers <!-- meta={"type": "request"} --> ```http POST /chunked_w_trailing_headers HTTP/1.1 Transfer-Encoding: chunked 5 hello 6 world 0 Vary: * Content-Type: text/plain ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=27 span[url]="/chunked_w_trailing_headers" off=33 url complete off=38 len=3 span[version]="1.1" off=41 version complete off=43 len=17 span[header_field]="Transfer-Encoding" off=61 header_field complete off=62 len=7 span[header_value]="chunked" off=71 header_value complete off=73 headers complete method=3 v=1/1 flags=208 content_length=0 off=76 chunk header len=5 off=76 len=5 span[body]="hello" off=83 chunk complete off=86 chunk header len=6 off=86 len=6 span[body]=" world" off=94 chunk complete off=97 chunk header len=0 off=97 len=4 span[header_field]="Vary" off=102 header_field complete off=103 len=1 span[header_value]="*" off=106 header_value complete off=106 len=12 span[header_field]="Content-Type" off=119 header_field complete off=120 len=10 span[header_value]="text/plain" off=132 header_value complete off=134 chunk complete off=134 message complete ``` ### Chunk extensions <!-- meta={"type": "request"} --> ```http POST /chunked_w_unicorns_after_length HTTP/1.1 Transfer-Encoding: chunked 5;ilovew3;somuchlove=aretheseparametersfor;another=withvalue hello 6;blahblah;blah world 0 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=32 span[url]="/chunked_w_unicorns_after_length" off=38 url complete off=43 len=3 span[version]="1.1" off=46 version complete off=48 len=17 span[header_field]="Transfer-Encoding" off=66 header_field complete off=67 len=7 span[header_value]="chunked" off=76 header_value complete off=78 headers complete method=3 v=1/1 flags=208 content_length=0 off=80 len=7 span[chunk_extension_name]="ilovew3" off=88 chunk_extension_name complete off=88 len=10 span[chunk_extension_name]="somuchlove" off=99 chunk_extension_name complete off=99 len=21 span[chunk_extension_value]="aretheseparametersfor" off=121 chunk_extension_value complete off=121 len=7 span[chunk_extension_name]="another" off=129 chunk_extension_name complete off=129 len=9 span[chunk_extension_value]="withvalue" off=139 chunk_extension_value complete off=140 chunk header len=5 off=140 len=5 span[body]="hello" off=147 chunk complete off=149 len=8 span[chunk_extension_name]="blahblah" off=158 chunk_extension_name complete off=158 len=4 span[chunk_extension_name]="blah" off=163 chunk_extension_name complete off=164 chunk header len=6 off=164 len=6 span[body]=" world" off=172 chunk complete off=175 chunk header len=0 ``` ### No semicolon before chunk extensions <!-- meta={"type": "request"} --> ```http POST /chunked_w_unicorns_after_length HTTP/1.1 Host: localhost Transfer-encoding: chunked 2 erfrferferf aa 0 rrrr ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=32 span[url]="/chunked_w_unicorns_after_length" off=38 url complete off=43 len=3 span[version]="1.1" off=46 version complete off=48 len=4 span[header_field]="Host" off=53 header_field complete off=54 len=9 span[header_value]="localhost" off=65 header_value complete off=65 len=17 span[header_field]="Transfer-encoding" off=83 header_field complete off=84 len=7 span[header_value]="chunked" off=93 header_value complete off=95 headers complete method=3 v=1/1 flags=208 content_length=0 off=97 error code=12 reason="Invalid character in chunk size" ``` ### No extension after semicolon <!-- meta={"type": "request"} --> ```http POST /chunked_w_unicorns_after_length HTTP/1.1 Host: localhost Transfer-encoding: chunked 2; aa 0 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=32 span[url]="/chunked_w_unicorns_after_length" off=38 url complete off=43 len=3 span[version]="1.1" off=46 version complete off=48 len=4 span[header_field]="Host" off=53 header_field complete off=54 len=9 span[header_value]="localhost" off=65 header_value complete off=65 len=17 span[header_field]="Transfer-encoding" off=83 header_field complete off=84 len=7 span[header_value]="chunked" off=93 header_value complete off=95 headers complete method=3 v=1/1 flags=208 content_length=0 off=98 error code=2 reason="Invalid character in chunk extensions" ``` ### Chunk extensions quoting <!-- meta={"type": "request"} --> ```http POST /chunked_w_unicorns_after_length HTTP/1.1 Transfer-Encoding: chunked 5;ilovew3="I \"love\"; \\extensions\\";somuchlove="aretheseparametersfor";blah;foo=bar hello 6;blahblah;blah world 0 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=32 span[url]="/chunked_w_unicorns_after_length" off=38 url complete off=43 len=3 span[version]="1.1" off=46 version complete off=48 len=17 span[header_field]="Transfer-Encoding" off=66 header_field complete off=67 len=7 span[header_value]="chunked" off=76 header_value complete off=78 headers complete method=3 v=1/1 flags=208 content_length=0 off=80 len=7 span[chunk_extension_name]="ilovew3" off=88 chunk_extension_name complete off=88 len=28 span[chunk_extension_value]=""I \"love\"; \\extensions\\"" off=116 chunk_extension_value complete off=117 len=10 span[chunk_extension_name]="somuchlove" off=128 chunk_extension_name complete off=128 len=23 span[chunk_extension_value]=""aretheseparametersfor"" off=151 chunk_extension_value complete off=152 len=4 span[chunk_extension_name]="blah" off=157 chunk_extension_name complete off=157 len=3 span[chunk_extension_name]="foo" off=161 chunk_extension_name complete off=161 len=3 span[chunk_extension_value]="bar" off=165 chunk_extension_value complete off=166 chunk header len=5 off=166 len=5 span[body]="hello" off=173 chunk complete off=175 len=8 span[chunk_extension_name]="blahblah" off=184 chunk_extension_name complete off=184 len=4 span[chunk_extension_name]="blah" off=189 chunk_extension_name complete off=190 chunk header len=6 off=190 len=6 span[body]=" world" off=198 chunk complete off=201 chunk header len=0 ``` ### Unbalanced chunk extensions quoting <!-- meta={"type": "request"} --> ```http POST /chunked_w_unicorns_after_length HTTP/1.1 Transfer-Encoding: chunked 5;ilovew3="abc";somuchlove="def; ghi hello 6;blahblah;blah world 0 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=32 span[url]="/chunked_w_unicorns_after_length" off=38 url complete off=43 len=3 span[version]="1.1" off=46 version complete off=48 len=17 span[header_field]="Transfer-Encoding" off=66 header_field complete off=67 len=7 span[header_value]="chunked" off=76 header_value complete off=78 headers complete method=3 v=1/1 flags=208 content_length=0 off=80 len=7 span[chunk_extension_name]="ilovew3" off=88 chunk_extension_name complete off=88 len=5 span[chunk_extension_value]=""abc"" off=93 chunk_extension_value complete off=94 len=10 span[chunk_extension_name]="somuchlove" off=105 chunk_extension_name complete off=105 len=9 span[chunk_extension_value]=""def; ghi" off=115 error code=2 reason="Invalid character in chunk extensions quoted value" ``` ## Ignoring `pigeons` Requests cannot have invalid `Transfer-Encoding`. It is impossible to determine their body size. Not erroring would make HTTP smuggling attacks possible. <!-- meta={"type": "request", "noScan": true} --> ```http PUT /url HTTP/1.1 Transfer-Encoding: pigeons ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=17 span[header_field]="Transfer-Encoding" off=37 header_field complete off=38 len=7 span[header_value]="pigeons" off=47 header_value complete off=49 headers complete method=4 v=1/1 flags=200 content_length=0 off=49 error code=15 reason="Request has invalid `Transfer-Encoding`" ``` ## POST with `Transfer-Encoding` and `Content-Length` <!-- meta={"type": "request"} --> ```http POST /post_identity_body_world?q=search#hey HTTP/1.1 Accept: */* Transfer-Encoding: identity Content-Length: 5 World ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=38 span[url]="/post_identity_body_world?q=search#hey" off=44 url complete off=49 len=3 span[version]="1.1" off=52 version complete off=54 len=6 span[header_field]="Accept" off=61 header_field complete off=62 len=3 span[header_value]="*/*" off=67 header_value complete off=67 len=17 span[header_field]="Transfer-Encoding" off=85 header_field complete off=86 len=8 span[header_value]="identity" off=96 header_value complete off=96 len=14 span[header_field]="Content-Length" off=111 header_field complete off=111 error code=11 reason="Content-Length can't be present with Transfer-Encoding" ``` ## POST with `Transfer-Encoding` and `Content-Length` (lenient) TODO(indutny): should we allow it even in lenient mode? (Consider disabling this). NOTE: `Content-Length` is ignored when `Transfer-Encoding` is present. Messages (in lenient mode) are read until EOF. <!-- meta={"type": "request-lenient-chunked-length"} --> ```http POST /post_identity_body_world?q=search#hey HTTP/1.1 Accept: */* Transfer-Encoding: identity Content-Length: 1 World ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=38 span[url]="/post_identity_body_world?q=search#hey" off=44 url complete off=49 len=3 span[version]="1.1" off=52 version complete off=54 len=6 span[header_field]="Accept" off=61 header_field complete off=62 len=3 span[header_value]="*/*" off=67 header_value complete off=67 len=17 span[header_field]="Transfer-Encoding" off=85 header_field complete off=86 len=8 span[header_value]="identity" off=96 header_value complete off=96 len=14 span[header_field]="Content-Length" off=111 header_field complete off=112 len=1 span[header_value]="1" off=115 header_value complete off=117 headers complete method=3 v=1/1 flags=220 content_length=1 off=117 len=5 span[body]="World" ``` ## POST with empty `Transfer-Encoding` and `Content-Length` (lenient) <!-- meta={"type": "request"} --> ```http POST / HTTP/1.1 Host: foo Content-Length: 10 Transfer-Encoding: Transfer-Encoding: Transfer-Encoding: 2 AA 0 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=1 span[url]="/" off=7 url complete off=12 len=3 span[version]="1.1" off=15 version complete off=17 len=4 span[header_field]="Host" off=22 header_field complete off=23 len=3 span[header_value]="foo" off=28 header_value complete off=28 len=14 span[header_field]="Content-Length" off=43 header_field complete off=44 len=2 span[header_value]="10" off=48 header_value complete off=48 len=17 span[header_field]="Transfer-Encoding" off=66 header_field complete off=66 error code=15 reason="Transfer-Encoding can't be present with Content-Length" ``` ## POST with `chunked` before other transfer coding names <!-- meta={"type": "request", "noScan": true} --> ```http POST /post_identity_body_world?q=search#hey HTTP/1.1 Accept: */* Transfer-Encoding: chunked, deflate World ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=38 span[url]="/post_identity_body_world?q=search#hey" off=44 url complete off=49 len=3 span[version]="1.1" off=52 version complete off=54 len=6 span[header_field]="Accept" off=61 header_field complete off=62 len=3 span[header_value]="*/*" off=67 header_value complete off=67 len=17 span[header_field]="Transfer-Encoding" off=85 header_field complete off=86 len=7 span[header_value]="chunked" off=94 error code=15 reason="Invalid `Transfer-Encoding` header value" ``` ## POST with `chunked` and duplicate transfer-encoding <!-- meta={"type": "request", "noScan": true} --> ```http POST /post_identity_body_world?q=search#hey HTTP/1.1 Accept: */* Transfer-Encoding: chunked Transfer-Encoding: deflate World ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=38 span[url]="/post_identity_body_world?q=search#hey" off=44 url complete off=49 len=3 span[version]="1.1" off=52 version complete off=54 len=6 span[header_field]="Accept" off=61 header_field complete off=62 len=3 span[header_value]="*/*" off=67 header_value complete off=67 len=17 span[header_field]="Transfer-Encoding" off=85 header_field complete off=86 len=7 span[header_value]="chunked" off=95 header_value complete off=95 len=17 span[header_field]="Transfer-Encoding" off=113 header_field complete off=114 len=0 span[header_value]="" off=115 error code=15 reason="Invalid `Transfer-Encoding` header value" ``` ## POST with `chunked` before other transfer-coding (lenient) <!-- meta={"type": "request-lenient-transfer-encoding"} --> ```http POST /post_identity_body_world?q=search#hey HTTP/1.1 Accept: */* Transfer-Encoding: chunked, deflate World ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=38 span[url]="/post_identity_body_world?q=search#hey" off=44 url complete off=49 len=3 span[version]="1.1" off=52 version complete off=54 len=6 span[header_field]="Accept" off=61 header_field complete off=62 len=3 span[header_value]="*/*" off=67 header_value complete off=67 len=17 span[header_field]="Transfer-Encoding" off=85 header_field complete off=86 len=16 span[header_value]="chunked, deflate" off=104 header_value complete off=106 headers complete method=3 v=1/1 flags=200 content_length=0 off=106 len=5 span[body]="World" ``` ## POST with `chunked` and duplicate transfer-encoding (lenient) <!-- meta={"type": "request-lenient-transfer-encoding"} --> ```http POST /post_identity_body_world?q=search#hey HTTP/1.1 Accept: */* Transfer-Encoding: chunked Transfer-Encoding: deflate World ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=38 span[url]="/post_identity_body_world?q=search#hey" off=44 url complete off=49 len=3 span[version]="1.1" off=52 version complete off=54 len=6 span[header_field]="Accept" off=61 header_field complete off=62 len=3 span[header_value]="*/*" off=67 header_value complete off=67 len=17 span[header_field]="Transfer-Encoding" off=85 header_field complete off=86 len=7 span[header_value]="chunked" off=95 header_value complete off=95 len=17 span[header_field]="Transfer-Encoding" off=113 header_field complete off=114 len=7 span[header_value]="deflate" off=123 header_value complete off=125 headers complete method=3 v=1/1 flags=200 content_length=0 off=125 len=5 span[body]="World" ``` ## POST with `chunked` as last transfer-encoding <!-- meta={"type": "request"} --> ```http POST /post_identity_body_world?q=search#hey HTTP/1.1 Accept: */* Transfer-Encoding: deflate, chunked 5 World 0 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=38 span[url]="/post_identity_body_world?q=search#hey" off=44 url complete off=49 len=3 span[version]="1.1" off=52 version complete off=54 len=6 span[header_field]="Accept" off=61 header_field complete off=62 len=3 span[header_value]="*/*" off=67 header_value complete off=67 len=17 span[header_field]="Transfer-Encoding" off=85 header_field complete off=86 len=16 span[header_value]="deflate, chunked" off=104 header_value complete off=106 headers complete method=3 v=1/1 flags=208 content_length=0 off=109 chunk header len=5 off=109 len=5 span[body]="World" off=116 chunk complete off=119 chunk header len=0 off=121 chunk complete off=121 message complete ``` ## POST with `chunked` as last transfer-encoding (multiple headers) <!-- meta={"type": "request"} --> ```http POST /post_identity_body_world?q=search#hey HTTP/1.1 Accept: */* Transfer-Encoding: deflate Transfer-Encoding: chunked 5 World 0 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=38 span[url]="/post_identity_body_world?q=search#hey" off=44 url complete off=49 len=3 span[version]="1.1" off=52 version complete off=54 len=6 span[header_field]="Accept" off=61 header_field complete off=62 len=3 span[header_value]="*/*" off=67 header_value complete off=67 len=17 span[header_field]="Transfer-Encoding" off=85 header_field complete off=86 len=7 span[header_value]="deflate" off=95 header_value complete off=95 len=17 span[header_field]="Transfer-Encoding" off=113 header_field complete off=114 len=7 span[header_value]="chunked" off=123 header_value complete off=125 headers complete method=3 v=1/1 flags=208 content_length=0 off=128 chunk header len=5 off=128 len=5 span[body]="World" off=135 chunk complete off=138 chunk header len=0 off=140 chunk complete off=140 message complete ``` ## POST with `chunkedchunked` as transfer-encoding <!-- meta={"type": "request"} --> ```http POST /post_identity_body_world?q=search#hey HTTP/1.1 Accept: */* Transfer-Encoding: chunkedchunked 5 World 0 ``` ```log off=0 message begin off=0 len=4 span[method]="POST" off=4 method complete off=5 len=38 span[url]="/post_identity_body_world?q=search#hey" off=44 url complete off=49 len=3 span[version]="1.1" off=52 version complete off=54 len=6 span[header_field]="Accept" off=61 header_field complete off=62 len=3 span[header_value]="*/*" off=67 header_value complete off=67 len=17 span[header_field]="Transfer-Encoding" off=85 header_field complete off=86 len=14 span[header_value]="chunkedchunked" off=102 header_value complete off=104 headers complete method=3 v=1/1 flags=200 content_length=0 off=104 error code=15 reason="Request has invalid `Transfer-Encoding`" ``` ## Missing last-chunk <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Transfer-Encoding: chunked 3 foo ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=17 span[header_field]="Transfer-Encoding" off=37 header_field complete off=38 len=7 span[header_value]="chunked" off=47 header_value complete off=49 headers complete method=4 v=1/1 flags=208 content_length=0 off=52 chunk header len=3 off=52 len=3 span[body]="foo" off=57 chunk complete off=57 error code=12 reason="Invalid character in chunk size" ``` ## Validate chunk parameters <!-- meta={"type": "request" } --> ```http PUT /url HTTP/1.1 Transfer-Encoding: chunked 3 \n \r\n\ foo ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=17 span[header_field]="Transfer-Encoding" off=37 header_field complete off=38 len=7 span[header_value]="chunked" off=47 header_value complete off=49 headers complete method=4 v=1/1 flags=208 content_length=0 off=51 error code=12 reason="Invalid character in chunk size" ``` ## Invalid OBS fold after chunked value <!-- meta={"type": "request-lenient-headers" } --> ```http PUT /url HTTP/1.1 Transfer-Encoding: chunked abc 5 World 0 ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=17 span[header_field]="Transfer-Encoding" off=37 header_field complete off=38 len=7 span[header_value]="chunked" off=47 len=5 span[header_value]=" abc" off=54 header_value complete off=56 headers complete method=4 v=1/1 flags=200 content_length=0 off=56 error code=15 reason="Request has invalid `Transfer-Encoding`" ``` ### Chunk header not terminated by CRLF <!-- meta={"type": "request" } --> ```http GET / HTTP/1.1 Host: a Connection: close Transfer-Encoding: chunked 5\r\r;ABCD 34 E 0 GET / HTTP/1.1 Host: a Content-Length: 5 0 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=4 span[header_field]="Host" off=21 header_field complete off=22 len=1 span[header_value]="a" off=25 header_value complete off=25 len=10 span[header_field]="Connection" off=36 header_field complete off=37 len=6 span[header_value]="close " off=45 header_value complete off=45 len=17 span[header_field]="Transfer-Encoding" off=63 header_field complete off=64 len=8 span[header_value]="chunked " off=74 header_value complete off=76 headers complete method=1 v=1/1 flags=20a content_length=0 off=78 error code=2 reason="Expected LF after chunk size" ``` ### Chunk header not terminated by CRLF (lenient) <!-- meta={"type": "request-lenient-optional-lf-after-cr" } --> ```http GET / HTTP/1.1 Host: a Connection: close Transfer-Encoding: chunked 6\r\r;ABCD 33 E 0 GET / HTTP/1.1 Host: a Content-Length: 5 0 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=4 span[header_field]="Host" off=21 header_field complete off=22 len=1 span[header_value]="a" off=25 header_value complete off=25 len=10 span[header_field]="Connection" off=36 header_field complete off=37 len=6 span[header_value]="close " off=45 header_value complete off=45 len=17 span[header_field]="Transfer-Encoding" off=63 header_field complete off=64 len=8 span[header_value]="chunked " off=74 header_value complete off=76 headers complete method=1 v=1/1 flags=20a content_length=0 off=78 chunk header len=6 off=78 len=1 span[body]=cr off=79 len=5 span[body]=";ABCD" off=86 chunk complete off=90 chunk header len=51 off=90 len=1 span[body]="E" off=91 len=1 span[body]=cr off=92 len=1 span[body]=lf off=93 len=1 span[body]="0" off=94 len=1 span[body]=cr off=95 len=1 span[body]=lf off=96 len=1 span[body]=cr off=97 len=1 span[body]=lf off=98 len=15 span[body]="GET / HTTP/1.1 " off=113 len=1 span[body]=cr off=114 len=1 span[body]=lf off=115 len=7 span[body]="Host: a" off=122 len=1 span[body]=cr off=123 len=1 span[body]=lf off=124 len=17 span[body]="Content-Length: 5" off=143 chunk complete off=146 chunk header len=0 off=148 chunk complete off=148 message complete ``` ### Chunk data not terminated by CRLF <!-- meta={"type": "request" } --> ```http GET / HTTP/1.1 Host: a Connection: close Transfer-Encoding: chunked 5 ABCDE0 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=4 span[header_field]="Host" off=21 header_field complete off=22 len=1 span[header_value]="a" off=25 header_value complete off=25 len=10 span[header_field]="Connection" off=36 header_field complete off=37 len=6 span[header_value]="close " off=45 header_value complete off=45 len=17 span[header_field]="Transfer-Encoding" off=63 header_field complete off=64 len=8 span[header_value]="chunked " off=74 header_value complete off=76 headers complete method=1 v=1/1 flags=20a content_length=0 off=79 chunk header len=5 off=79 len=5 span[body]="ABCDE" off=84 error code=2 reason="Expected LF after chunk data" ``` ### Chunk data not terminated by CRLF (lenient) <!-- meta={"type": "request-lenient-optional-crlf-after-chunk" } --> ```http GET / HTTP/1.1 Host: a Connection: close Transfer-Encoding: chunked 5 ABCDE0 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=1 span[url]="/" off=6 url complete off=11 len=3 span[version]="1.1" off=14 version complete off=16 len=4 span[header_field]="Host" off=21 header_field complete off=22 len=1 span[header_value]="a" off=25 header_value complete off=25 len=10 span[header_field]="Connection" off=36 header_field complete off=37 len=6 span[header_value]="close " off=45 header_value complete off=45 len=17 span[header_field]="Transfer-Encoding" off=63 header_field complete off=64 len=8 span[header_value]="chunked " off=74 header_value complete off=76 headers complete method=1 v=1/1 flags=20a content_length=0 off=79 chunk header len=5 off=79 len=5 span[body]="ABCDE" off=84 chunk complete off=87 chunk header len=0 ``` ## Space after chunk header <!-- meta={"type": "request"} --> ```http PUT /url HTTP/1.1 Transfer-Encoding: chunked a \r\n0123456789 0 ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=17 span[header_field]="Transfer-Encoding" off=37 header_field complete off=38 len=7 span[header_value]="chunked" off=47 header_value complete off=49 headers complete method=4 v=1/1 flags=208 content_length=0 off=51 error code=12 reason="Invalid character in chunk size" ``` ## Space after chunk header (lenient) <!-- meta={"type": "request-lenient-spaces-after-chunk-size"} --> ```http PUT /url HTTP/1.1 Transfer-Encoding: chunked a \r\n0123456789 0 ``` ```log off=0 message begin off=0 len=3 span[method]="PUT" off=3 method complete off=4 len=4 span[url]="/url" off=9 url complete off=14 len=3 span[version]="1.1" off=17 version complete off=19 len=17 span[header_field]="Transfer-Encoding" off=37 header_field complete off=38 len=7 span[header_value]="chunked" off=47 header_value complete off=49 headers complete method=4 v=1/1 flags=208 content_length=0 off=53 chunk header len=10 off=53 len=10 span[body]="0123456789" off=65 chunk complete off=68 chunk header len=0 off=70 chunk complete off=70 message complete ``` �����������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/request/uri.md�����������������������������������������������������0000644�0001751�0000177�00000011745�14607525267�021227� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������URI === ## Quotes in URI <!-- meta={"type": "request"} --> ```http GET /with_"lovely"_quotes?foo=\"bar\" HTTP/1.1 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=33 span[url]="/with_"lovely"_quotes?foo=\"bar\"" off=38 url complete off=43 len=3 span[version]="1.1" off=46 version complete off=50 headers complete method=1 v=1/1 flags=0 content_length=0 off=50 message complete ``` ## Query URL with question mark Some clients include `?` characters in query strings. <!-- meta={"type": "request"} --> ```http GET /test.cgi?foo=bar?baz HTTP/1.1 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=21 span[url]="/test.cgi?foo=bar?baz" off=26 url complete off=31 len=3 span[version]="1.1" off=34 version complete off=38 headers complete method=1 v=1/1 flags=0 content_length=0 off=38 message complete ``` ## Host terminated by a query string <!-- meta={"type": "request"} --> ```http GET http://hypnotoad.org?hail=all HTTP/1.1\r\n ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=29 span[url]="http://hypnotoad.org?hail=all" off=34 url complete off=39 len=3 span[version]="1.1" off=42 version complete off=46 headers complete method=1 v=1/1 flags=0 content_length=0 off=46 message complete ``` ## `host:port` terminated by a query string <!-- meta={"type": "request"} --> ```http GET http://hypnotoad.org:1234?hail=all HTTP/1.1 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=34 span[url]="http://hypnotoad.org:1234?hail=all" off=39 url complete off=44 len=3 span[version]="1.1" off=47 version complete off=51 headers complete method=1 v=1/1 flags=0 content_length=0 off=51 message complete ``` ## Query URL with vertical bar character It should be allowed to have vertical bar symbol in URI: `|`. See: https://github.com/nodejs/node/issues/27584 <!-- meta={"type": "request"} --> ```http GET /test.cgi?query=| HTTP/1.1 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=17 span[url]="/test.cgi?query=|" off=22 url complete off=27 len=3 span[version]="1.1" off=30 version complete off=34 headers complete method=1 v=1/1 flags=0 content_length=0 off=34 message complete ``` ## `host:port` terminated by a space <!-- meta={"type": "request"} --> ```http GET http://hypnotoad.org:1234 HTTP/1.1 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=25 span[url]="http://hypnotoad.org:1234" off=30 url complete off=35 len=3 span[version]="1.1" off=38 version complete off=42 headers complete method=1 v=1/1 flags=0 content_length=0 off=42 message complete ``` ## Disallow UTF-8 in URI path in strict mode <!-- meta={"type": "request", "noScan": true} --> ```http GET /δ¶/δt/pope?q=1#narf HTTP/1.1 Host: github.com ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=5 error code=7 reason="Invalid char in url path" ``` ## Fragment in URI <!-- meta={"type": "request"} --> ```http GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=40 span[url]="/forums/1/topics/2375?page=1#posts-17408" off=45 url complete off=50 len=3 span[version]="1.1" off=53 version complete off=57 headers complete method=1 v=1/1 flags=0 content_length=0 off=57 message complete ``` ## Underscore in hostname <!-- meta={"type": "request"} --> ```http CONNECT home_0.netscape.com:443 HTTP/1.0 User-agent: Mozilla/1.1N Proxy-authorization: basic aGVsbG86d29ybGQ= ``` ```log off=0 message begin off=0 len=7 span[method]="CONNECT" off=7 method complete off=8 len=23 span[url]="home_0.netscape.com:443" off=32 url complete off=37 len=3 span[version]="1.0" off=40 version complete off=42 len=10 span[header_field]="User-agent" off=53 header_field complete off=54 len=12 span[header_value]="Mozilla/1.1N" off=68 header_value complete off=68 len=19 span[header_field]="Proxy-authorization" off=88 header_field complete off=89 len=22 span[header_value]="basic aGVsbG86d29ybGQ=" off=113 header_value complete off=115 headers complete method=5 v=1/0 flags=0 content_length=0 off=115 message complete off=115 error code=22 reason="Pause on CONNECT/Upgrade" ``` ## `host:port` and basic auth <!-- meta={"type": "request"} --> ```http GET http://a%12:b!&*$@hypnotoad.org:1234/toto HTTP/1.1 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=41 span[url]="http://a%12:b!&*$@hypnotoad.org:1234/toto" off=46 url complete off=51 len=3 span[version]="1.1" off=54 version complete off=58 headers complete method=1 v=1/1 flags=0 content_length=0 off=58 message complete ``` ## Space in URI <!-- meta={"type": "request", "noScan": true} --> ```http GET /foo bar/ HTTP/1.1 ``` ```log off=0 message begin off=0 len=3 span[method]="GET" off=3 method complete off=4 len=4 span[url]="/foo" off=9 url complete off=9 error code=8 reason="Expected HTTP/" ``` ���������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000033�00000000000�010211� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������27 mtime=1713285830.559115 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/response/����������������������������������������������������������0000755�0001751�0000177�00000000000�14607525307�020237� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/response/connection.md���������������������������������������������0000644�0001751�0000177�00000037515�14607525267�022740� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Connection header ================= ## Proxy-Connection <!-- meta={"type": "response"} --> ```http HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Content-Length: 11 Proxy-Connection: close Date: Thu, 31 Dec 2009 20:55:48 +0000 hello world ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=12 span[header_field]="Content-Type" off=30 header_field complete off=31 len=24 span[header_value]="text/html; charset=UTF-8" off=57 header_value complete off=57 len=14 span[header_field]="Content-Length" off=72 header_field complete off=73 len=2 span[header_value]="11" off=77 header_value complete off=77 len=16 span[header_field]="Proxy-Connection" off=94 header_field complete off=95 len=5 span[header_value]="close" off=102 header_value complete off=102 len=4 span[header_field]="Date" off=107 header_field complete off=108 len=31 span[header_value]="Thu, 31 Dec 2009 20:55:48 +0000" off=141 header_value complete off=143 headers complete status=200 v=1/1 flags=22 content_length=11 off=143 len=11 span[body]="hello world" off=154 message complete ``` ## HTTP/1.0 with keep-alive and EOF-terminated 200 status There is no `Content-Length` in this response, so even though the `keep-alive` is on - it should read until EOF. <!-- meta={"type": "response"} --> ```http HTTP/1.0 200 OK Connection: keep-alive HTTP/1.0 200 OK ``` ```log off=0 message begin off=5 len=3 span[version]="1.0" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=10 span[header_field]="Connection" off=28 header_field complete off=29 len=10 span[header_value]="keep-alive" off=41 header_value complete off=43 headers complete status=200 v=1/0 flags=1 content_length=0 off=43 len=15 span[body]="HTTP/1.0 200 OK" ``` ## HTTP/1.0 with keep-alive and 204 status Responses with `204` status cannot have a body. <!-- meta={"type": "response"} --> ```http HTTP/1.0 204 No content Connection: keep-alive HTTP/1.0 200 OK ``` ```log off=0 message begin off=5 len=3 span[version]="1.0" off=8 version complete off=13 len=10 span[status]="No content" off=25 status complete off=25 len=10 span[header_field]="Connection" off=36 header_field complete off=37 len=10 span[header_value]="keep-alive" off=49 header_value complete off=51 headers complete status=204 v=1/0 flags=1 content_length=0 off=51 message complete off=51 reset off=51 message begin off=56 len=3 span[version]="1.0" off=59 version complete off=64 len=2 span[status]="OK" ``` ## HTTP/1.1 with EOF-terminated 200 status There is no `Content-Length` in this response, so even though the `keep-alive` is on (implicitly in HTTP 1.1) - it should read until EOF. <!-- meta={"type": "response"} --> ```http HTTP/1.1 200 OK HTTP/1.1 200 OK ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=19 headers complete status=200 v=1/1 flags=0 content_length=0 off=19 len=15 span[body]="HTTP/1.1 200 OK" ``` ## HTTP/1.1 with 204 status Responses with `204` status cannot have a body. <!-- meta={"type": "response"} --> ```http HTTP/1.1 204 No content HTTP/1.1 200 OK ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=10 span[status]="No content" off=25 status complete off=27 headers complete status=204 v=1/1 flags=0 content_length=0 off=27 message complete off=27 reset off=27 message begin off=32 len=3 span[version]="1.1" off=35 version complete off=40 len=2 span[status]="OK" ``` ## HTTP/1.1 with keep-alive disabled and 204 status <!-- meta={"type": "response" } --> ```http HTTP/1.1 204 No content Connection: close HTTP/1.1 200 OK ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=10 span[status]="No content" off=25 status complete off=25 len=10 span[header_field]="Connection" off=36 header_field complete off=37 len=5 span[header_value]="close" off=44 header_value complete off=46 headers complete status=204 v=1/1 flags=2 content_length=0 off=46 message complete off=47 error code=5 reason="Data after `Connection: close`" ``` ## HTTP/1.1 with keep-alive disabled, content-length (lenient) Parser should discard extra request in lenient mode. <!-- meta={"type": "response-lenient-data-after-close" } --> ```http HTTP/1.1 200 No content Content-Length: 5 Connection: close 2ad731e3-4dcd-4f70-b871-0ad284b29ffc ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=10 span[status]="No content" off=25 status complete off=25 len=14 span[header_field]="Content-Length" off=40 header_field complete off=41 len=1 span[header_value]="5" off=44 header_value complete off=44 len=10 span[header_field]="Connection" off=55 header_field complete off=56 len=5 span[header_value]="close" off=63 header_value complete off=65 headers complete status=200 v=1/1 flags=22 content_length=5 off=65 len=5 span[body]="2ad73" off=70 message complete ``` ## HTTP/1.1 with keep-alive disabled, content-length Parser should discard extra request in strict mode. <!-- meta={"type": "response" } --> ```http HTTP/1.1 200 No content Content-Length: 5 Connection: close 2ad731e3-4dcd-4f70-b871-0ad284b29ffc ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=10 span[status]="No content" off=25 status complete off=25 len=14 span[header_field]="Content-Length" off=40 header_field complete off=41 len=1 span[header_value]="5" off=44 header_value complete off=44 len=10 span[header_field]="Connection" off=55 header_field complete off=56 len=5 span[header_value]="close" off=63 header_value complete off=65 headers complete status=200 v=1/1 flags=22 content_length=5 off=65 len=5 span[body]="2ad73" off=70 message complete off=71 error code=5 reason="Data after `Connection: close`" ``` ## HTTP/1.1 with keep-alive disabled and 204 status (lenient) <!-- meta={"type": "response-lenient-keep-alive"} --> ```http HTTP/1.1 204 No content Connection: close HTTP/1.1 200 OK ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=10 span[status]="No content" off=25 status complete off=25 len=10 span[header_field]="Connection" off=36 header_field complete off=37 len=5 span[header_value]="close" off=44 header_value complete off=46 headers complete status=204 v=1/1 flags=2 content_length=0 off=46 message complete off=46 reset off=46 message begin off=51 len=3 span[version]="1.1" off=54 version complete off=59 len=2 span[status]="OK" ``` ## HTTP 101 response with Upgrade and Content-Length header <!-- meta={"type": "response"} --> ```http HTTP/1.1 101 Switching Protocols Connection: upgrade Upgrade: h2c Content-Length: 4 body\ proto ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=19 span[status]="Switching Protocols" off=34 status complete off=34 len=10 span[header_field]="Connection" off=45 header_field complete off=46 len=7 span[header_value]="upgrade" off=55 header_value complete off=55 len=7 span[header_field]="Upgrade" off=63 header_field complete off=64 len=3 span[header_value]="h2c" off=69 header_value complete off=69 len=14 span[header_field]="Content-Length" off=84 header_field complete off=85 len=1 span[header_value]="4" off=88 header_value complete off=90 headers complete status=101 v=1/1 flags=34 content_length=4 off=90 message complete off=90 error code=22 reason="Pause on CONNECT/Upgrade" ``` ## HTTP 101 response with Upgrade and Transfer-Encoding header <!-- meta={"type": "response"} --> ```http HTTP/1.1 101 Switching Protocols Connection: upgrade Upgrade: h2c Transfer-Encoding: chunked 2 bo 2 dy 0 proto ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=19 span[status]="Switching Protocols" off=34 status complete off=34 len=10 span[header_field]="Connection" off=45 header_field complete off=46 len=7 span[header_value]="upgrade" off=55 header_value complete off=55 len=7 span[header_field]="Upgrade" off=63 header_field complete off=64 len=3 span[header_value]="h2c" off=69 header_value complete off=69 len=17 span[header_field]="Transfer-Encoding" off=87 header_field complete off=88 len=7 span[header_value]="chunked" off=97 header_value complete off=99 headers complete status=101 v=1/1 flags=21c content_length=0 off=99 message complete off=99 error code=22 reason="Pause on CONNECT/Upgrade" ``` ## HTTP 200 response with Upgrade header <!-- meta={"type": "response"} --> ```http HTTP/1.1 200 OK Connection: upgrade Upgrade: h2c body ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=10 span[header_field]="Connection" off=28 header_field complete off=29 len=7 span[header_value]="upgrade" off=38 header_value complete off=38 len=7 span[header_field]="Upgrade" off=46 header_field complete off=47 len=3 span[header_value]="h2c" off=52 header_value complete off=54 headers complete status=200 v=1/1 flags=14 content_length=0 off=54 len=4 span[body]="body" ``` ## HTTP 200 response with Upgrade header and Content-Length <!-- meta={"type": "response"} --> ```http HTTP/1.1 200 OK Connection: upgrade Upgrade: h2c Content-Length: 4 body ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=10 span[header_field]="Connection" off=28 header_field complete off=29 len=7 span[header_value]="upgrade" off=38 header_value complete off=38 len=7 span[header_field]="Upgrade" off=46 header_field complete off=47 len=3 span[header_value]="h2c" off=52 header_value complete off=52 len=14 span[header_field]="Content-Length" off=67 header_field complete off=68 len=1 span[header_value]="4" off=71 header_value complete off=73 headers complete status=200 v=1/1 flags=34 content_length=4 off=73 len=4 span[body]="body" off=77 message complete ``` ## HTTP 200 response with Upgrade header and Transfer-Encoding <!-- meta={"type": "response"} --> ```http HTTP/1.1 200 OK Connection: upgrade Upgrade: h2c Transfer-Encoding: chunked 2 bo 2 dy 0 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=10 span[header_field]="Connection" off=28 header_field complete off=29 len=7 span[header_value]="upgrade" off=38 header_value complete off=38 len=7 span[header_field]="Upgrade" off=46 header_field complete off=47 len=3 span[header_value]="h2c" off=52 header_value complete off=52 len=17 span[header_field]="Transfer-Encoding" off=70 header_field complete off=71 len=7 span[header_value]="chunked" off=80 header_value complete off=82 headers complete status=200 v=1/1 flags=21c content_length=0 off=85 chunk header len=2 off=85 len=2 span[body]="bo" off=89 chunk complete off=92 chunk header len=2 off=92 len=2 span[body]="dy" off=96 chunk complete off=99 chunk header len=0 off=101 chunk complete off=101 message complete ``` ## HTTP 304 with Content-Length <!-- meta={"type": "response"} --> ```http HTTP/1.1 304 Not Modified Content-Length: 10 HTTP/1.1 200 OK Content-Length: 5 hello ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=12 span[status]="Not Modified" off=27 status complete off=27 len=14 span[header_field]="Content-Length" off=42 header_field complete off=43 len=2 span[header_value]="10" off=47 header_value complete off=49 headers complete status=304 v=1/1 flags=20 content_length=10 off=49 message complete off=51 reset off=51 message begin off=56 len=3 span[version]="1.1" off=59 version complete off=64 len=2 span[status]="OK" off=68 status complete off=68 len=14 span[header_field]="Content-Length" off=83 header_field complete off=84 len=1 span[header_value]="5" off=87 header_value complete off=89 headers complete status=200 v=1/1 flags=20 content_length=5 off=89 len=5 span[body]="hello" off=94 message complete ``` ## HTTP 304 with Transfer-Encoding <!-- meta={"type": "response"} --> ```http HTTP/1.1 304 Not Modified Transfer-Encoding: chunked HTTP/1.1 200 OK Transfer-Encoding: chunked 5 hello 0 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=12 span[status]="Not Modified" off=27 status complete off=27 len=17 span[header_field]="Transfer-Encoding" off=45 header_field complete off=46 len=7 span[header_value]="chunked" off=55 header_value complete off=57 headers complete status=304 v=1/1 flags=208 content_length=0 off=57 message complete off=57 reset off=57 message begin off=62 len=3 span[version]="1.1" off=65 version complete off=70 len=2 span[status]="OK" off=74 status complete off=74 len=17 span[header_field]="Transfer-Encoding" off=92 header_field complete off=93 len=7 span[header_value]="chunked" off=102 header_value complete off=104 headers complete status=200 v=1/1 flags=208 content_length=0 off=107 chunk header len=5 off=107 len=5 span[body]="hello" off=114 chunk complete off=117 chunk header len=0 ``` ## HTTP 100 first, then 400 <!-- meta={"type": "response"} --> ```http HTTP/1.1 100 Continue HTTP/1.1 404 Not Found Content-Type: text/plain; charset=utf-8 Content-Length: 14 Date: Fri, 15 Sep 2023 19:47:23 GMT Server: Python/3.10 aiohttp/4.0.0a2.dev0 404: Not Found ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=8 span[status]="Continue" off=23 status complete off=25 headers complete status=100 v=1/1 flags=0 content_length=0 off=25 message complete off=27 reset off=27 message begin off=32 len=3 span[version]="1.1" off=35 version complete off=40 len=9 span[status]="Not Found" off=51 status complete off=51 len=12 span[header_field]="Content-Type" off=64 header_field complete off=65 len=25 span[header_value]="text/plain; charset=utf-8" off=92 header_value complete off=92 len=14 span[header_field]="Content-Length" off=107 header_field complete off=108 len=2 span[header_value]="14" off=112 header_value complete off=112 len=4 span[header_field]="Date" off=117 header_field complete off=118 len=29 span[header_value]="Fri, 15 Sep 2023 19:47:23 GMT" off=149 header_value complete off=149 len=6 span[header_field]="Server" off=156 header_field complete off=157 len=32 span[header_value]="Python/3.10 aiohttp/4.0.0a2.dev0" off=191 header_value complete off=193 headers complete status=404 v=1/1 flags=20 content_length=14 off=193 len=14 span[body]="404: Not Found" off=207 message complete ``` ## HTTP 103 first, then 200 <!-- meta={"type": "response"} --> ```http HTTP/1.1 103 Early Hints Link: </styles.css>; rel=preload; as=style HTTP/1.1 200 OK Date: Wed, 13 Sep 2023 11:09:41 GMT Connection: keep-alive Keep-Alive: timeout=5 Content-Length: 17 response content ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=11 span[status]="Early Hints" off=26 status complete off=26 len=4 span[header_field]="Link" off=31 header_field complete off=32 len=36 span[header_value]="</styles.css>; rel=preload; as=style" off=70 header_value complete off=72 headers complete status=103 v=1/1 flags=0 content_length=0 off=72 message complete off=72 reset off=72 message begin off=77 len=3 span[version]="1.1" off=80 version complete off=85 len=2 span[status]="OK" off=89 status complete off=89 len=4 span[header_field]="Date" off=94 header_field complete off=95 len=29 span[header_value]="Wed, 13 Sep 2023 11:09:41 GMT" off=126 header_value complete off=126 len=10 span[header_field]="Connection" off=137 header_field complete off=138 len=10 span[header_value]="keep-alive" off=150 header_value complete off=150 len=10 span[header_field]="Keep-Alive" off=161 header_field complete off=162 len=9 span[header_value]="timeout=5" off=173 header_value complete off=173 len=14 span[header_field]="Content-Length" off=188 header_field complete off=189 len=2 span[header_value]="17" off=193 header_value complete off=195 headers complete status=200 v=1/1 flags=21 content_length=17 off=195 len=16 span[body]="response content" ```�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/response/content-length.md�����������������������������������������0000644�0001751�0000177�00000010625�14607525267�023523� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Content-Length header ===================== ## Response without `Content-Length`, but with body The client should wait for the server's EOF. That is, when `Content-Length` is not specified, and `Connection: close`, the end of body is specified by the EOF. _(Compare with APACHEBENCH_GET)_ <!-- meta={"type": "response"} --> ```http HTTP/1.1 200 OK Date: Tue, 04 Aug 2009 07:59:32 GMT Server: Apache X-Powered-By: Servlet/2.5 JSP/2.1 Content-Type: text/xml; charset=utf-8 Connection: close <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\ <SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n\ <SOAP-ENV:Body>\n\ <SOAP-ENV:Fault>\n\ <faultcode>SOAP-ENV:Client</faultcode>\n\ <faultstring>Client Error</faultstring>\n\ </SOAP-ENV:Fault>\n\ </SOAP-ENV:Body>\n\ </SOAP-ENV:Envelope> ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=4 span[header_field]="Date" off=22 header_field complete off=23 len=29 span[header_value]="Tue, 04 Aug 2009 07:59:32 GMT" off=54 header_value complete off=54 len=6 span[header_field]="Server" off=61 header_field complete off=62 len=6 span[header_value]="Apache" off=70 header_value complete off=70 len=12 span[header_field]="X-Powered-By" off=83 header_field complete off=84 len=19 span[header_value]="Servlet/2.5 JSP/2.1" off=105 header_value complete off=105 len=12 span[header_field]="Content-Type" off=118 header_field complete off=119 len=23 span[header_value]="text/xml; charset=utf-8" off=144 header_value complete off=144 len=10 span[header_field]="Connection" off=155 header_field complete off=156 len=5 span[header_value]="close" off=163 header_value complete off=165 headers complete status=200 v=1/1 flags=2 content_length=0 off=165 len=42 span[body]="<?xml version=\"1.0\" encoding=\"UTF-8\"?>" off=207 len=1 span[body]=lf off=208 len=80 span[body]="<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" off=288 len=1 span[body]=lf off=289 len=17 span[body]=" <SOAP-ENV:Body>" off=306 len=1 span[body]=lf off=307 len=20 span[body]=" <SOAP-ENV:Fault>" off=327 len=1 span[body]=lf off=328 len=45 span[body]=" <faultcode>SOAP-ENV:Client</faultcode>" off=373 len=1 span[body]=lf off=374 len=46 span[body]=" <faultstring>Client Error</faultstring>" off=420 len=1 span[body]=lf off=421 len=21 span[body]=" </SOAP-ENV:Fault>" off=442 len=1 span[body]=lf off=443 len=18 span[body]=" </SOAP-ENV:Body>" off=461 len=1 span[body]=lf off=462 len=20 span[body]="</SOAP-ENV:Envelope>" ``` ## Content-Length-X The header that starts with `Content-Length*` should not be treated as `Content-Length`. <!-- meta={"type": "response"} --> ```http HTTP/1.1 200 OK Content-Length-X: 0 Transfer-Encoding: chunked 2 OK 0 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=16 span[header_field]="Content-Length-X" off=34 header_field complete off=35 len=1 span[header_value]="0" off=38 header_value complete off=38 len=17 span[header_field]="Transfer-Encoding" off=56 header_field complete off=57 len=7 span[header_value]="chunked" off=66 header_value complete off=68 headers complete status=200 v=1/1 flags=208 content_length=0 off=71 chunk header len=2 off=71 len=2 span[body]="OK" off=75 chunk complete off=78 chunk header len=0 off=80 chunk complete off=80 message complete ``` ## Content-Length reset when no body is received <!-- meta={"type": "response", "skipBody": true} --> ```http HTTP/1.1 200 OK Content-Length: 123 HTTP/1.1 200 OK Content-Length: 456 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=3 span[header_value]="123" off=38 header_value complete off=40 headers complete status=200 v=1/1 flags=20 content_length=123 off=40 skip body off=40 message complete off=40 reset off=40 message begin off=45 len=3 span[version]="1.1" off=48 version complete off=53 len=2 span[status]="OK" off=57 status complete off=57 len=14 span[header_field]="Content-Length" off=72 header_field complete off=73 len=3 span[header_value]="456" off=78 header_value complete off=80 headers complete status=200 v=1/1 flags=20 content_length=456 off=80 skip body off=80 message complete ``` �����������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/response/finish.md�������������������������������������������������0000644�0001751�0000177�00000000706�14607525267�022051� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Finish ====== Those tests check the return codes and the behavior of `llhttp_finish()` C API. ## It should be safe to finish with cb after empty response <!-- meta={"type": "response-finish"} --> ```http HTTP/1.1 200 OK ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=19 headers complete status=200 v=1/1 flags=0 content_length=0 off=NULL finish=1 ``` ����������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/response/invalid.md������������������������������������������������0000644�0001751�0000177�00000011566�14607525267�022225� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Invalid responses ================= ### Incomplete HTTP protocol <!-- meta={"type": "response"} --> ```http HTP/1.1 200 OK ``` ```log off=0 message begin off=2 error code=8 reason="Expected HTTP/" ``` ### Extra digit in HTTP major version <!-- meta={"type": "response"} --> ```http HTTP/01.1 200 OK ``` ```log off=0 message begin off=5 len=1 span[version]="0" off=6 error code=9 reason="Expected dot" ``` ### Extra digit in HTTP major version #2 <!-- meta={"type": "response"} --> ```http HTTP/11.1 200 OK ``` ```log off=0 message begin off=5 len=1 span[version]="1" off=6 error code=9 reason="Expected dot" ``` ### Extra digit in HTTP minor version <!-- meta={"type": "response"} --> ```http HTTP/1.01 200 OK ``` ```log off=0 message begin off=5 len=3 span[version]="1.0" off=8 version complete off=8 error code=9 reason="Expected space after version" ``` --> ### Tab after HTTP version <!-- meta={"type": "response"} --> ```http HTTP/1.1\t200 OK ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=8 error code=9 reason="Expected space after version" ``` ### CR before response and tab after HTTP version <!-- meta={"type": "response"} --> ```http \rHTTP/1.1\t200 OK ``` ```log off=1 message begin off=6 len=3 span[version]="1.1" off=9 version complete off=9 error code=9 reason="Expected space after version" ``` ### Headers separated by CR <!-- meta={"type": "response"} --> ```http HTTP/1.1 200 OK Foo: 1\rBar: 2 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=3 span[header_field]="Foo" off=21 header_field complete off=22 len=1 span[header_value]="1" off=24 error code=3 reason="Missing expected LF after header value" ``` ### Invalid HTTP version <!-- meta={"type": "response"} --> ```http HTTP/5.6 200 OK ``` ```log off=0 message begin off=5 len=3 span[version]="5.6" off=8 error code=9 reason="Invalid HTTP version" ``` ## Invalid space after start line <!-- meta={"type": "response"} --> ```http HTTP/1.1 200 OK Host: foo ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=18 error code=30 reason="Unexpected space after start line" ``` ### Extra space between HTTP version and status code <!-- meta={"type": "response"} --> ```http HTTP/1.1 200 OK ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=9 error code=13 reason="Invalid status code" ``` ### Extra space between status code and reason <!-- meta={"type": "response"} --> ```http HTTP/1.1 200 OK ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=3 span[status]=" OK" off=18 status complete off=20 headers complete status=200 v=1/1 flags=0 content_length=0 ``` ### One-digit status code <!-- meta={"type": "response"} --> ```http HTTP/1.1 2 OK ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=10 error code=13 reason="Invalid status code" ``` ### Only LFs present and no body <!-- meta={"type": "response"} --> ```http HTTP/1.1 200 OK\nContent-Length: 0\n\n ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=16 error code=25 reason="Missing expected CR after response line" ``` ### Only LFs present and no body (lenient) <!-- meta={"type": "response-lenient-all"} --> ```http HTTP/1.1 200 OK\nContent-Length: 0\n\n ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=16 status complete off=16 len=14 span[header_field]="Content-Length" off=31 header_field complete off=32 len=1 span[header_value]="0" off=34 header_value complete off=35 headers complete status=200 v=1/1 flags=20 content_length=0 off=35 message complete ``` ### Only LFs present <!-- meta={"type": "response"} --> ```http HTTP/1.1 200 OK\n\ Foo: abc\n\ Bar: def\n\ \n\ BODY\n\ ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=16 error code=25 reason="Missing expected CR after response line" ``` ### Only LFs present (lenient) <!-- meta={"type": "response-lenient-all"} --> ```http HTTP/1.1 200 OK\n\ Foo: abc\n\ Bar: def\n\ \n\ BODY\n\ ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=16 status complete off=16 len=3 span[header_field]="Foo" off=20 header_field complete off=21 len=3 span[header_value]="abc" off=25 header_value complete off=25 len=3 span[header_field]="Bar" off=29 header_field complete off=30 len=3 span[header_value]="def" off=34 header_value complete off=35 headers complete status=200 v=1/1 flags=0 content_length=0 off=35 len=4 span[body]="BODY" off=39 len=1 span[body]=lf off=40 len=1 span[body]="\" ```������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/response/lenient-version.md����������������������������������������0000644�0001751�0000177�00000000577�14607525267�023720� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Lenient HTTP version parsing ============================ ### Invalid HTTP version (lenient) <!-- meta={"type": "response-lenient-version"} --> ```http HTTP/5.6 200 OK ``` ```log off=0 message begin off=5 len=3 span[version]="5.6" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=19 headers complete status=200 v=5/6 flags=0 content_length=0 ``` ���������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/response/pausing.md������������������������������������������������0000644�0001751�0000177�00000015757�14607525267�022253� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Pausing ======= ### on_message_begin <!-- meta={"type": "response", "pause": "on_message_begin"} --> ```http HTTP/1.1 200 OK Content-Length: 3 abc ``` ```log off=0 message begin off=0 pause off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=1 span[header_value]="3" off=36 header_value complete off=38 headers complete status=200 v=1/1 flags=20 content_length=3 off=38 len=3 span[body]="abc" off=41 message complete ``` ### on_message_complete <!-- meta={"type": "response", "pause": "on_message_complete"} --> ```http HTTP/1.1 200 OK Content-Length: 3 abc ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=1 span[header_value]="3" off=36 header_value complete off=38 headers complete status=200 v=1/1 flags=20 content_length=3 off=38 len=3 span[body]="abc" off=41 message complete off=41 pause ``` ### on_version_complete <!-- meta={"type": "response", "pause": "on_version_complete"} --> ```http HTTP/1.1 200 OK Content-Length: 3 abc ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=8 pause off=13 len=2 span[status]="OK" off=17 status complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=1 span[header_value]="3" off=36 header_value complete off=38 headers complete status=200 v=1/1 flags=20 content_length=3 off=38 len=3 span[body]="abc" off=41 message complete ``` ### on_status_complete <!-- meta={"type": "response", "pause": "on_status_complete"} --> ```http HTTP/1.1 200 OK Content-Length: 3 abc ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 pause off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=1 span[header_value]="3" off=36 header_value complete off=38 headers complete status=200 v=1/1 flags=20 content_length=3 off=38 len=3 span[body]="abc" off=41 message complete ``` ### on_header_field_complete <!-- meta={"type": "response", "pause": "on_header_field_complete"} --> ```http HTTP/1.1 200 OK Content-Length: 3 abc ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=32 pause off=33 len=1 span[header_value]="3" off=36 header_value complete off=38 headers complete status=200 v=1/1 flags=20 content_length=3 off=38 len=3 span[body]="abc" off=41 message complete ``` ### on_header_value_complete <!-- meta={"type": "response", "pause": "on_header_value_complete"} --> ```http HTTP/1.1 200 OK Content-Length: 3 abc ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=1 span[header_value]="3" off=36 header_value complete off=36 pause off=38 headers complete status=200 v=1/1 flags=20 content_length=3 off=38 len=3 span[body]="abc" off=41 message complete ``` ### on_headers_complete <!-- meta={"type": "response", "pause": "on_headers_complete"} --> ```http HTTP/1.1 200 OK Content-Length: 3 abc ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=1 span[header_value]="3" off=36 header_value complete off=38 headers complete status=200 v=1/1 flags=20 content_length=3 off=38 pause off=38 len=3 span[body]="abc" off=41 message complete ``` ### on_chunk_header <!-- meta={"type": "response", "pause": "on_chunk_header"} --> ```http HTTP/1.1 200 OK Transfer-Encoding: chunked a 0123456789 0 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=17 span[header_field]="Transfer-Encoding" off=35 header_field complete off=36 len=7 span[header_value]="chunked" off=45 header_value complete off=47 headers complete status=200 v=1/1 flags=208 content_length=0 off=50 chunk header len=10 off=50 pause off=50 len=10 span[body]="0123456789" off=62 chunk complete off=65 chunk header len=0 off=65 pause off=67 chunk complete off=67 message complete ``` ### on_chunk_extension_name <!-- meta={"type": "response", "pause": "on_chunk_extension_name"} --> ```http HTTP/1.1 200 OK Transfer-Encoding: chunked a;foo=bar 0123456789 0 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=17 span[header_field]="Transfer-Encoding" off=35 header_field complete off=36 len=7 span[header_value]="chunked" off=45 header_value complete off=47 headers complete status=200 v=1/1 flags=208 content_length=0 off=49 len=3 span[chunk_extension_name]="foo" off=53 chunk_extension_name complete off=53 pause off=53 len=3 span[chunk_extension_value]="bar" off=57 chunk_extension_value complete off=58 chunk header len=10 off=58 len=10 span[body]="0123456789" off=70 chunk complete off=73 chunk header len=0 off=75 chunk complete off=75 message complete ``` ### on_chunk_extension_value <!-- meta={"type": "response", "pause": "on_chunk_extension_value"} --> ```http HTTP/1.1 200 OK Transfer-Encoding: chunked a;foo=bar 0123456789 0 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=17 span[header_field]="Transfer-Encoding" off=35 header_field complete off=36 len=7 span[header_value]="chunked" off=45 header_value complete off=47 headers complete status=200 v=1/1 flags=208 content_length=0 off=49 len=3 span[chunk_extension_name]="foo" off=53 chunk_extension_name complete off=53 len=3 span[chunk_extension_value]="bar" off=57 chunk_extension_value complete off=57 pause off=58 chunk header len=10 off=58 len=10 span[body]="0123456789" off=70 chunk complete off=73 chunk header len=0 off=75 chunk complete off=75 message complete ``` ### on_chunk_complete <!-- meta={"type": "response", "pause": "on_chunk_complete"} --> ```http HTTP/1.1 200 OK Transfer-Encoding: chunked a 0123456789 0 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=17 span[header_field]="Transfer-Encoding" off=35 header_field complete off=36 len=7 span[header_value]="chunked" off=45 header_value complete off=47 headers complete status=200 v=1/1 flags=208 content_length=0 off=50 chunk header len=10 off=50 len=10 span[body]="0123456789" off=62 chunk complete off=62 pause off=65 chunk header len=0 off=67 chunk complete off=67 pause off=67 message complete ``` �����������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/response/pipelining.md���������������������������������������������0000644�0001751�0000177�00000002660�14607525267�022730� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Pipelining ========== ## Should parse multiple events <!-- meta={"type": "response"} --> ```http HTTP/1.1 200 OK Content-Length: 3 AAA HTTP/1.1 201 Created Content-Length: 4 BBBB HTTP/1.1 202 Accepted Content-Length: 5 CCCC ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=1 span[header_value]="3" off=36 header_value complete off=38 headers complete status=200 v=1/1 flags=20 content_length=3 off=38 len=3 span[body]="AAA" off=41 message complete off=43 reset off=43 message begin off=48 len=3 span[version]="1.1" off=51 version complete off=56 len=7 span[status]="Created" off=65 status complete off=65 len=14 span[header_field]="Content-Length" off=80 header_field complete off=81 len=1 span[header_value]="4" off=84 header_value complete off=86 headers complete status=201 v=1/1 flags=20 content_length=4 off=86 len=4 span[body]="BBBB" off=90 message complete off=92 reset off=92 message begin off=97 len=3 span[version]="1.1" off=100 version complete off=105 len=8 span[status]="Accepted" off=115 status complete off=115 len=14 span[header_field]="Content-Length" off=130 header_field complete off=131 len=1 span[header_value]="5" off=134 header_value complete off=136 headers complete status=202 v=1/1 flags=20 content_length=5 off=136 len=4 span[body]="CCCC" ```��������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1713285815.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aiohttp-3.9.5/vendor/llhttp/test/response/sample.md�������������������������������������������������0000644�0001751�0000177�00000044060�14607525267�022053� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Sample responses ================ ## Simple response <!-- meta={"type": "response"} --> ```http HTTP/1.1 200 OK Header1: Value1 Header2:\t Value2 Content-Length: 0 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=7 span[header_field]="Header1" off=25 header_field complete off=26 len=6 span[header_value]="Value1" off=34 header_value complete off=34 len=7 span[header_field]="Header2" off=42 header_field complete off=44 len=6 span[header_value]="Value2" off=52 header_value complete off=52 len=14 span[header_field]="Content-Length" off=67 header_field complete off=68 len=1 span[header_value]="0" off=71 header_value complete off=73 headers complete status=200 v=1/1 flags=20 content_length=0 off=73 message complete ``` ## Error on invalid response start Every response must start with `HTTP/`. <!-- meta={"type": "response"} --> ```http HTTPER/1.1 200 OK ``` ```log off=0 message begin off=4 error code=8 reason="Expected HTTP/" ``` ## Empty body should not trigger spurious span callbacks <!-- meta={"type": "response"} --> ```http HTTP/1.1 200 OK ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=19 headers complete status=200 v=1/1 flags=0 content_length=0 ``` ## Google 301 <!-- meta={"type": "response"} --> ```http HTTP/1.1 301 Moved Permanently Location: http://www.google.com/ Content-Type: text/html; charset=UTF-8 Date: Sun, 26 Apr 2009 11:11:49 GMT Expires: Tue, 26 May 2009 11:11:49 GMT X-$PrototypeBI-Version: 1.6.0.3 Cache-Control: public, max-age=2592000 Server: gws Content-Length: 219 <HTML><HEAD><meta http-equiv=content-type content=text/html;charset=utf-8>\n\ <TITLE>301 Moved\n\

    301 Moved

    \n\ The document has moved\n\ here. ``` _(Note the `$` char in header field)_ ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=17 span[status]="Moved Permanently" off=32 status complete off=32 len=8 span[header_field]="Location" off=41 header_field complete off=42 len=22 span[header_value]="http://www.google.com/" off=66 header_value complete off=66 len=12 span[header_field]="Content-Type" off=79 header_field complete off=80 len=24 span[header_value]="text/html; charset=UTF-8" off=106 header_value complete off=106 len=4 span[header_field]="Date" off=111 header_field complete off=112 len=29 span[header_value]="Sun, 26 Apr 2009 11:11:49 GMT" off=143 header_value complete off=143 len=7 span[header_field]="Expires" off=151 header_field complete off=152 len=29 span[header_value]="Tue, 26 May 2009 11:11:49 GMT" off=183 header_value complete off=183 len=22 span[header_field]="X-$PrototypeBI-Version" off=206 header_field complete off=207 len=7 span[header_value]="1.6.0.3" off=216 header_value complete off=216 len=13 span[header_field]="Cache-Control" off=230 header_field complete off=231 len=23 span[header_value]="public, max-age=2592000" off=256 header_value complete off=256 len=6 span[header_field]="Server" off=263 header_field complete off=264 len=3 span[header_value]="gws" off=269 header_value complete off=269 len=14 span[header_field]="Content-Length" off=284 header_field complete off=286 len=5 span[header_value]="219 " off=293 header_value complete off=295 headers complete status=301 v=1/1 flags=20 content_length=219 off=295 len=74 span[body]="" off=369 len=1 span[body]=lf off=370 len=37 span[body]="301 Moved" off=407 len=1 span[body]=lf off=408 len=18 span[body]="

    301 Moved

    " off=426 len=1 span[body]=lf off=427 len=22 span[body]="The document has moved" off=449 len=1 span[body]=lf off=450 len=42 span[body]="here." off=492 len=1 span[body]=cr off=493 len=1 span[body]=lf off=494 len=14 span[body]="" ``` ## amazon.com ```http HTTP/1.1 301 MovedPermanently Date: Wed, 15 May 2013 17:06:33 GMT Server: Server x-amz-id-1: 0GPHKXSJQ826RK7GZEB2 p3p: policyref="http://www.amazon.com/w3c/p3p.xml",CP="CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC " x-amz-id-2: STN69VZxIFSz9YJLbz1GDbxpbjG6Qjmmq5E3DxRhOUw+Et0p4hr7c/Q8qNcx4oAD Location: http://www.amazon.com/Dan-Brown/e/B000AP9DSU/ref=s9_pop_gw_al1?_encoding=UTF8&refinementId=618073011&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=0SHYY5BZXN3KR20BNFAY&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846 Vary: Accept-Encoding,User-Agent Content-Type: text/html; charset=ISO-8859-1 Transfer-Encoding: chunked 1 \n 0 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=16 span[status]="MovedPermanently" off=31 status complete off=31 len=4 span[header_field]="Date" off=36 header_field complete off=37 len=29 span[header_value]="Wed, 15 May 2013 17:06:33 GMT" off=68 header_value complete off=68 len=6 span[header_field]="Server" off=75 header_field complete off=76 len=6 span[header_value]="Server" off=84 header_value complete off=84 len=10 span[header_field]="x-amz-id-1" off=95 header_field complete off=96 len=20 span[header_value]="0GPHKXSJQ826RK7GZEB2" off=118 header_value complete off=118 len=3 span[header_field]="p3p" off=122 header_field complete off=123 len=178 span[header_value]="policyref="http://www.amazon.com/w3c/p3p.xml",CP="CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC "" off=303 header_value complete off=303 len=10 span[header_field]="x-amz-id-2" off=314 header_field complete off=315 len=64 span[header_value]="STN69VZxIFSz9YJLbz1GDbxpbjG6Qjmmq5E3DxRhOUw+Et0p4hr7c/Q8qNcx4oAD" off=381 header_value complete off=381 len=8 span[header_field]="Location" off=390 header_field complete off=391 len=214 span[header_value]="http://www.amazon.com/Dan-Brown/e/B000AP9DSU/ref=s9_pop_gw_al1?_encoding=UTF8&refinementId=618073011&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=0SHYY5BZXN3KR20BNFAY&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846" off=607 header_value complete off=607 len=4 span[header_field]="Vary" off=612 header_field complete off=613 len=26 span[header_value]="Accept-Encoding,User-Agent" off=641 header_value complete off=641 len=12 span[header_field]="Content-Type" off=654 header_field complete off=655 len=29 span[header_value]="text/html; charset=ISO-8859-1" off=686 header_value complete off=686 len=17 span[header_field]="Transfer-Encoding" off=704 header_field complete off=705 len=7 span[header_value]="chunked" off=714 header_value complete off=716 headers complete status=301 v=1/1 flags=208 content_length=0 off=719 chunk header len=1 off=719 len=1 span[body]=lf off=722 chunk complete off=725 chunk header len=0 off=727 chunk complete off=727 message complete ``` ## No headers and no body ```http HTTP/1.1 404 Not Found ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=9 span[status]="Not Found" off=24 status complete off=26 headers complete status=404 v=1/1 flags=0 content_length=0 ``` ## No reason phrase ```http HTTP/1.1 301 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=14 status complete off=16 headers complete status=301 v=1/1 flags=0 content_length=0 ``` ## Empty reason phrase after space ```http HTTP/1.1 200 \r\n\ ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=0 span[status]="" off=15 status complete off=17 headers complete status=200 v=1/1 flags=0 content_length=0 ``` ## No carriage ret ```http HTTP/1.1 200 OK\n\ Content-Type: text/html; charset=utf-8\n\ Connection: close\n\ \n\ these headers are from http://news.ycombinator.com/ ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=16 error code=25 reason="Missing expected CR after response line" ``` ## No carriage ret (lenient) ```http HTTP/1.1 200 OK\n\ Content-Type: text/html; charset=utf-8\n\ Connection: close\n\ \n\ these headers are from http://news.ycombinator.com/ ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=16 status complete off=16 len=12 span[header_field]="Content-Type" off=29 header_field complete off=30 len=24 span[header_value]="text/html; charset=utf-8" off=55 header_value complete off=55 len=10 span[header_field]="Connection" off=66 header_field complete off=67 len=5 span[header_value]="close" off=73 header_value complete off=74 headers complete status=200 v=1/1 flags=2 content_length=0 off=74 len=51 span[body]="these headers are from http://news.ycombinator.com/" ``` ## Underscore in header key Shown by: `curl -o /dev/null -v "http://ad.doubleclick.net/pfadx/DARTSHELLCONFIGXML;dcmt=text/xml;"` ```http HTTP/1.1 200 OK Server: DCLK-AdSvr Content-Type: text/xml Content-Length: 0 DCLK_imp: v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=6 span[header_field]="Server" off=24 header_field complete off=25 len=10 span[header_value]="DCLK-AdSvr" off=37 header_value complete off=37 len=12 span[header_field]="Content-Type" off=50 header_field complete off=51 len=8 span[header_value]="text/xml" off=61 header_value complete off=61 len=14 span[header_field]="Content-Length" off=76 header_field complete off=77 len=1 span[header_value]="0" off=80 header_value complete off=80 len=8 span[header_field]="DCLK_imp" off=89 header_field complete off=90 len=81 span[header_value]="v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o" off=173 header_value complete off=175 headers complete status=200 v=1/1 flags=20 content_length=0 off=175 message complete ``` ## bonjourmadame.fr The client should not merge two headers fields when the first one doesn't have a value. ```http HTTP/1.0 301 Moved Permanently Date: Thu, 03 Jun 2010 09:56:32 GMT Server: Apache/2.2.3 (Red Hat) Cache-Control: public Pragma: \r\n\ Location: http://www.bonjourmadame.fr/ Vary: Accept-Encoding Content-Length: 0 Content-Type: text/html; charset=UTF-8 Connection: keep-alive ``` ```log off=0 message begin off=5 len=3 span[version]="1.0" off=8 version complete off=13 len=17 span[status]="Moved Permanently" off=32 status complete off=32 len=4 span[header_field]="Date" off=37 header_field complete off=38 len=29 span[header_value]="Thu, 03 Jun 2010 09:56:32 GMT" off=69 header_value complete off=69 len=6 span[header_field]="Server" off=76 header_field complete off=77 len=22 span[header_value]="Apache/2.2.3 (Red Hat)" off=101 header_value complete off=101 len=13 span[header_field]="Cache-Control" off=115 header_field complete off=116 len=6 span[header_value]="public" off=124 header_value complete off=124 len=6 span[header_field]="Pragma" off=131 header_field complete off=134 len=0 span[header_value]="" off=134 header_value complete off=134 len=8 span[header_field]="Location" off=143 header_field complete off=144 len=28 span[header_value]="http://www.bonjourmadame.fr/" off=174 header_value complete off=174 len=4 span[header_field]="Vary" off=179 header_field complete off=180 len=15 span[header_value]="Accept-Encoding" off=197 header_value complete off=197 len=14 span[header_field]="Content-Length" off=212 header_field complete off=213 len=1 span[header_value]="0" off=216 header_value complete off=216 len=12 span[header_field]="Content-Type" off=229 header_field complete off=230 len=24 span[header_value]="text/html; charset=UTF-8" off=256 header_value complete off=256 len=10 span[header_field]="Connection" off=267 header_field complete off=268 len=10 span[header_value]="keep-alive" off=280 header_value complete off=282 headers complete status=301 v=1/0 flags=21 content_length=0 off=282 message complete ``` ## Spaces in header value ```http HTTP/1.1 200 OK Date: Tue, 28 Sep 2010 01:14:13 GMT Server: Apache Cache-Control: no-cache, must-revalidate Expires: Mon, 26 Jul 1997 05:00:00 GMT .et-Cookie: PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com Vary: Accept-Encoding _eep-Alive: timeout=45 _onnection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html Connection: close 0 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=4 span[header_field]="Date" off=22 header_field complete off=23 len=29 span[header_value]="Tue, 28 Sep 2010 01:14:13 GMT" off=54 header_value complete off=54 len=6 span[header_field]="Server" off=61 header_field complete off=62 len=6 span[header_value]="Apache" off=70 header_value complete off=70 len=13 span[header_field]="Cache-Control" off=84 header_field complete off=85 len=25 span[header_value]="no-cache, must-revalidate" off=112 header_value complete off=112 len=7 span[header_field]="Expires" off=120 header_field complete off=121 len=29 span[header_value]="Mon, 26 Jul 1997 05:00:00 GMT" off=152 header_value complete off=152 len=10 span[header_field]=".et-Cookie" off=163 header_field complete off=164 len=54 span[header_value]="PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com" off=220 header_value complete off=220 len=4 span[header_field]="Vary" off=225 header_field complete off=226 len=15 span[header_value]="Accept-Encoding" off=243 header_value complete off=243 len=10 span[header_field]="_eep-Alive" off=254 header_field complete off=255 len=10 span[header_value]="timeout=45" off=267 header_value complete off=267 len=10 span[header_field]="_onnection" off=278 header_field complete off=279 len=10 span[header_value]="Keep-Alive" off=291 header_value complete off=291 len=17 span[header_field]="Transfer-Encoding" off=309 header_field complete off=310 len=7 span[header_value]="chunked" off=319 header_value complete off=319 len=12 span[header_field]="Content-Type" off=332 header_field complete off=333 len=9 span[header_value]="text/html" off=344 header_value complete off=344 len=10 span[header_field]="Connection" off=355 header_field complete off=356 len=5 span[header_value]="close" off=363 header_value complete off=365 headers complete status=200 v=1/1 flags=20a content_length=0 off=368 chunk header len=0 off=370 chunk complete off=370 message complete ``` ## Spaces in header name ```http HTTP/1.1 200 OK Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET en-US Content-Type: text/xml Content-Type: text/xml Content-Length: 16 Date: Fri, 23 Jul 2010 18:45:38 GMT Connection: keep-alive hello ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=6 span[header_field]="Server" off=24 header_field complete off=25 len=17 span[header_value]="Microsoft-IIS/6.0" off=44 header_value complete off=44 len=12 span[header_field]="X-Powered-By" off=57 header_field complete off=58 len=7 span[header_value]="ASP.NET" off=67 header_value complete off=72 error code=10 reason="Invalid header token" ``` ## Non ASCII in status line ```http HTTP/1.1 500 Oriëntatieprobleem Date: Fri, 5 Nov 2010 23:07:12 GMT+2 Content-Length: 0 Connection: close ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=19 span[status]="Oriëntatieprobleem" off=34 status complete off=34 len=4 span[header_field]="Date" off=39 header_field complete off=40 len=30 span[header_value]="Fri, 5 Nov 2010 23:07:12 GMT+2" off=72 header_value complete off=72 len=14 span[header_field]="Content-Length" off=87 header_field complete off=88 len=1 span[header_value]="0" off=91 header_value complete off=91 len=10 span[header_field]="Connection" off=102 header_field complete off=103 len=5 span[header_value]="close" off=110 header_value complete off=112 headers complete status=500 v=1/1 flags=22 content_length=0 off=112 message complete ``` ## HTTP version 0.9 ```http HTTP/0.9 200 OK ``` ```log off=0 message begin off=5 len=3 span[version]="0.9" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=19 headers complete status=200 v=0/9 flags=0 content_length=0 ``` ## No Content-Length, no Transfer-Encoding The client should wait for the server's EOF. That is, when neither content-length nor transfer-encoding is specified, the end of body is specified by the EOF. ```http HTTP/1.1 200 OK Content-Type: text/plain hello world ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=12 span[header_field]="Content-Type" off=30 header_field complete off=31 len=10 span[header_value]="text/plain" off=43 header_value complete off=45 headers complete status=200 v=1/1 flags=0 content_length=0 off=45 len=11 span[body]="hello world" ``` ## Response starting with CRLF ```http \r\nHTTP/1.1 200 OK Header1: Value1 Header2:\t Value2 Content-Length: 0 ``` ```log off=2 message begin off=7 len=3 span[version]="1.1" off=10 version complete off=15 len=2 span[status]="OK" off=19 status complete off=19 len=7 span[header_field]="Header1" off=27 header_field complete off=28 len=6 span[header_value]="Value1" off=36 header_value complete off=36 len=7 span[header_field]="Header2" off=44 header_field complete off=46 len=6 span[header_value]="Value2" off=54 header_value complete off=54 len=14 span[header_field]="Content-Length" off=69 header_field complete off=70 len=1 span[header_value]="0" off=73 header_value complete off=75 headers complete status=200 v=1/1 flags=20 content_length=0 off=75 message complete ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285815.0 aiohttp-3.9.5/vendor/llhttp/test/response/transfer-encoding.md0000644000175100001770000002376314607525267024211 0ustar00runnerdockerTransfer-Encoding header ======================== ## Trailing space on chunked body ```http HTTP/1.1 200 OK Content-Type: text/plain Transfer-Encoding: chunked 25 \r\n\ This is the data in the first chunk 1C and this is the second one 0 \r\n\ ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=12 span[header_field]="Content-Type" off=30 header_field complete off=31 len=10 span[header_value]="text/plain" off=43 header_value complete off=43 len=17 span[header_field]="Transfer-Encoding" off=61 header_field complete off=62 len=7 span[header_value]="chunked" off=71 header_value complete off=73 headers complete status=200 v=1/1 flags=208 content_length=0 off=76 error code=12 reason="Invalid character in chunk size" ``` ## `chunked` before other transfer-encoding ```http HTTP/1.1 200 OK Accept: */* Transfer-Encoding: chunked, deflate World ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=6 span[header_field]="Accept" off=24 header_field complete off=25 len=3 span[header_value]="*/*" off=30 header_value complete off=30 len=17 span[header_field]="Transfer-Encoding" off=48 header_field complete off=49 len=16 span[header_value]="chunked, deflate" off=67 header_value complete off=69 headers complete status=200 v=1/1 flags=200 content_length=0 off=69 len=5 span[body]="World" ``` ## multiple transfer-encoding where chunked is not the last one ```http HTTP/1.1 200 OK Accept: */* Transfer-Encoding: chunked Transfer-Encoding: identity World ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=6 span[header_field]="Accept" off=24 header_field complete off=25 len=3 span[header_value]="*/*" off=30 header_value complete off=30 len=17 span[header_field]="Transfer-Encoding" off=48 header_field complete off=49 len=7 span[header_value]="chunked" off=58 header_value complete off=58 len=17 span[header_field]="Transfer-Encoding" off=76 header_field complete off=77 len=8 span[header_value]="identity" off=87 header_value complete off=89 headers complete status=200 v=1/1 flags=200 content_length=0 off=89 len=5 span[body]="World" ``` ## `chunkedchunked` transfer-encoding does not enable chunked enconding This check that the word `chunked` repeat more than once (with or without spaces) does not mistakenly enables chunked encoding. ```http HTTP/1.1 200 OK Accept: */* Transfer-Encoding: chunkedchunked 2 OK 0 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=6 span[header_field]="Accept" off=24 header_field complete off=25 len=3 span[header_value]="*/*" off=30 header_value complete off=30 len=17 span[header_field]="Transfer-Encoding" off=48 header_field complete off=49 len=14 span[header_value]="chunkedchunked" off=65 header_value complete off=67 headers complete status=200 v=1/1 flags=200 content_length=0 off=67 len=1 span[body]="2" off=68 len=1 span[body]=cr off=69 len=1 span[body]=lf off=70 len=2 span[body]="OK" off=72 len=1 span[body]=cr off=73 len=1 span[body]=lf off=74 len=1 span[body]="0" off=75 len=1 span[body]=cr off=76 len=1 span[body]=lf off=77 len=1 span[body]=cr off=78 len=1 span[body]=lf ``` ## Chunk extensions ```http HTTP/1.1 200 OK Host: localhost Transfer-encoding: chunked 5;ilovew3;somuchlove=aretheseparametersfor hello 6;blahblah;blah world 0 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=4 span[header_field]="Host" off=22 header_field complete off=23 len=9 span[header_value]="localhost" off=34 header_value complete off=34 len=17 span[header_field]="Transfer-encoding" off=52 header_field complete off=53 len=7 span[header_value]="chunked" off=62 header_value complete off=64 headers complete status=200 v=1/1 flags=208 content_length=0 off=66 len=7 span[chunk_extension_name]="ilovew3" off=74 chunk_extension_name complete off=74 len=10 span[chunk_extension_name]="somuchlove" off=85 chunk_extension_name complete off=85 len=21 span[chunk_extension_value]="aretheseparametersfor" off=107 chunk_extension_value complete off=108 chunk header len=5 off=108 len=5 span[body]="hello" off=115 chunk complete off=117 len=8 span[chunk_extension_name]="blahblah" off=126 chunk_extension_name complete off=126 len=4 span[chunk_extension_name]="blah" off=131 chunk_extension_name complete off=132 chunk header len=6 off=132 len=6 span[body]=" world" off=140 chunk complete off=143 chunk header len=0 off=145 chunk complete off=145 message complete ``` ## No semicolon before chunk extensions ```http HTTP/1.1 200 OK Host: localhost Transfer-encoding: chunked 2 erfrferferf aa 0 rrrr ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=4 span[header_field]="Host" off=22 header_field complete off=23 len=9 span[header_value]="localhost" off=34 header_value complete off=34 len=17 span[header_field]="Transfer-encoding" off=52 header_field complete off=53 len=7 span[header_value]="chunked" off=62 header_value complete off=64 headers complete status=200 v=1/1 flags=208 content_length=0 off=66 error code=12 reason="Invalid character in chunk size" ``` ## No extension after semicolon ```http HTTP/1.1 200 OK Host: localhost Transfer-encoding: chunked 2; aa 0 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=4 span[header_field]="Host" off=22 header_field complete off=23 len=9 span[header_value]="localhost" off=34 header_value complete off=34 len=17 span[header_field]="Transfer-encoding" off=52 header_field complete off=53 len=7 span[header_value]="chunked" off=62 header_value complete off=64 headers complete status=200 v=1/1 flags=208 content_length=0 off=67 error code=2 reason="Invalid character in chunk extensions" ``` ## Chunk extensions quoting ```http HTTP/1.1 200 OK Host: localhost Transfer-Encoding: chunked 5;ilovew3="I love; extensions";somuchlove="aretheseparametersfor";blah;foo=bar hello 6;blahblah;blah world 0 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=4 span[header_field]="Host" off=22 header_field complete off=23 len=9 span[header_value]="localhost" off=34 header_value complete off=34 len=17 span[header_field]="Transfer-Encoding" off=52 header_field complete off=53 len=7 span[header_value]="chunked" off=62 header_value complete off=64 headers complete status=200 v=1/1 flags=208 content_length=0 off=66 len=7 span[chunk_extension_name]="ilovew3" off=74 chunk_extension_name complete off=74 len=20 span[chunk_extension_value]=""I love; extensions"" off=94 chunk_extension_value complete off=95 len=10 span[chunk_extension_name]="somuchlove" off=106 chunk_extension_name complete off=106 len=23 span[chunk_extension_value]=""aretheseparametersfor"" off=129 chunk_extension_value complete off=130 len=4 span[chunk_extension_name]="blah" off=135 chunk_extension_name complete off=135 len=3 span[chunk_extension_name]="foo" off=139 chunk_extension_name complete off=139 len=3 span[chunk_extension_value]="bar" off=143 chunk_extension_value complete off=144 chunk header len=5 off=144 len=5 span[body]="hello" off=151 chunk complete off=153 len=8 span[chunk_extension_name]="blahblah" off=162 chunk_extension_name complete off=162 len=4 span[chunk_extension_name]="blah" off=167 chunk_extension_name complete off=168 chunk header len=6 off=168 len=6 span[body]=" world" off=176 chunk complete off=179 chunk header len=0 ``` ## Unbalanced chunk extensions quoting ```http HTTP/1.1 200 OK Host: localhost Transfer-Encoding: chunked 5;ilovew3="abc";somuchlove="def; ghi hello 6;blahblah;blah world 0 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=4 span[header_field]="Host" off=22 header_field complete off=23 len=9 span[header_value]="localhost" off=34 header_value complete off=34 len=17 span[header_field]="Transfer-Encoding" off=52 header_field complete off=53 len=7 span[header_value]="chunked" off=62 header_value complete off=64 headers complete status=200 v=1/1 flags=208 content_length=0 off=66 len=7 span[chunk_extension_name]="ilovew3" off=74 chunk_extension_name complete off=74 len=5 span[chunk_extension_value]=""abc"" off=79 chunk_extension_value complete off=80 len=10 span[chunk_extension_name]="somuchlove" off=91 chunk_extension_name complete off=91 len=9 span[chunk_extension_value]=""def; ghi" off=101 error code=2 reason="Invalid character in chunk extensions quoted value" ``` ## Invalid OBS fold after chunked value ```http HTTP/1.1 200 OK Transfer-Encoding: chunked abc 5 World 0 ``` ```log off=0 message begin off=5 len=3 span[version]="1.1" off=8 version complete off=13 len=2 span[status]="OK" off=17 status complete off=17 len=17 span[header_field]="Transfer-Encoding" off=35 header_field complete off=36 len=7 span[header_value]="chunked" off=45 len=5 span[header_value]=" abc" off=52 header_value complete off=54 headers complete status=200 v=1/1 flags=200 content_length=0 off=54 len=1 span[body]="5" off=55 len=1 span[body]=cr off=56 len=1 span[body]=lf off=57 len=5 span[body]="World" off=62 len=1 span[body]=cr off=63 len=1 span[body]=lf off=64 len=1 span[body]="0" off=65 len=1 span[body]=cr off=66 len=1 span[body]=lf off=67 len=1 span[body]=cr off=68 len=1 span[body]=lf ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285815.0 aiohttp-3.9.5/vendor/llhttp/test/url.md0000644000175100001770000001152714607525267017540 0ustar00runnerdocker# URL tests ## Absolute URL ```url http://example.com/path?query=value#schema ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=11 span[url.host]="example.com" off=18 len=5 span[url.path]="/path" off=24 len=11 span[url.query]="query=value" off=36 len=6 span[url.fragment]="schema" ``` ## Relative URL ```url /path?query=value#schema ``` ```log off=0 len=5 span[url.path]="/path" off=6 len=11 span[url.query]="query=value" off=18 len=6 span[url.fragment]="schema" ``` ## Failing on broken schema ```url schema:/path?query=value#schema ``` ```log off=0 len=6 span[url.schema]="schema" off=8 error code=7 reason="Unexpected char in url schema" ``` ## Proxy request ```url http://hostname/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=8 span[url.host]="hostname" off=15 len=1 span[url.path]="/" ``` ## Proxy request with port ```url http://hostname:444/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=12 span[url.host]="hostname:444" off=19 len=1 span[url.path]="/" ``` ## Proxy IPv6 request ```url http://[1:2::3:4]/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=10 span[url.host]="[1:2::3:4]" off=17 len=1 span[url.path]="/" ``` ## Proxy IPv6 request with port ```url http://[1:2::3:4]:67/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=13 span[url.host]="[1:2::3:4]:67" off=20 len=1 span[url.path]="/" ``` ## IPv4 in IPv6 address ```url http://[2001:0000:0000:0000:0000:0000:1.9.1.1]/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=39 span[url.host]="[2001:0000:0000:0000:0000:0000:1.9.1.1]" off=46 len=1 span[url.path]="/" ``` ## Extra `?` in query string ```url http://a.tbcdn.cn/p/fp/2010c/??fp-header-min.css,fp-base-min.css,\ fp-channel-min.css,fp-product-min.css,fp-mall-min.css,fp-category-min.css,\ fp-sub-min.css,fp-gdp4p-min.css,fp-css3-min.css,fp-misc-min.css?t=20101022.css ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=10 span[url.host]="a.tbcdn.cn" off=17 len=12 span[url.path]="/p/fp/2010c/" off=30 len=187 span[url.query]="?fp-header-min.css,fp-base-min.css,fp-channel-min.css,fp-product-min.css,fp-mall-min.css,fp-category-min.css,fp-sub-min.css,fp-gdp4p-min.css,fp-css3-min.css,fp-misc-min.css?t=20101022.css" ``` ## URL encoded space ```url /toto.html?toto=a%20b ``` ```log off=0 len=10 span[url.path]="/toto.html" off=11 len=10 span[url.query]="toto=a%20b" ``` ## URL fragment ```url /toto.html#titi ``` ```log off=0 len=10 span[url.path]="/toto.html" off=11 len=4 span[url.fragment]="titi" ``` ## Complex URL fragment ```url http://www.webmasterworld.com/r.cgi?f=21&d=8405&url=\ http://www.example.com/index.html?foo=bar&hello=world#midpage ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=22 span[url.host]="www.webmasterworld.com" off=29 len=6 span[url.path]="/r.cgi" off=36 len=69 span[url.query]="f=21&d=8405&url=http://www.example.com/index.html?foo=bar&hello=world" off=106 len=7 span[url.fragment]="midpage" ``` ## Complex URL from node.js url parser doc ```url http://host.com:8080/p/a/t/h?query=string#hash ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=13 span[url.host]="host.com:8080" off=20 len=8 span[url.path]="/p/a/t/h" off=29 len=12 span[url.query]="query=string" off=42 len=4 span[url.fragment]="hash" ``` ## Complex URL with basic auth from node.js url parser doc ```url http://a:b@host.com:8080/p/a/t/h?query=string#hash ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=17 span[url.host]="a:b@host.com:8080" off=24 len=8 span[url.path]="/p/a/t/h" off=33 len=12 span[url.query]="query=string" off=46 len=4 span[url.fragment]="hash" ``` ## Double `@` ```url http://a:b@@hostname:443/ ``` ```log off=0 len=4 span[url.schema]="http" off=12 error code=7 reason="Double @ in url" ``` ## Proxy basic auth with url encoded space ```url http://a%20:b@host.com/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=15 span[url.host]="a%20:b@host.com" off=22 len=1 span[url.path]="/" ``` ## Proxy basic auth with unreserved chars ```url http://a!;-_!=+$@host.com/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=18 span[url.host]="a!;-_!=+$@host.com" off=25 len=1 span[url.path]="/" ``` ## IPv6 address with Zone ID ```url http://[fe80::a%25eth0]/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=16 span[url.host]="[fe80::a%25eth0]" off=23 len=1 span[url.path]="/" ``` ## IPv6 address with Zone ID, but `%` is not percent-encoded ```url http://[fe80::a%eth0]/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=14 span[url.host]="[fe80::a%eth0]" off=21 len=1 span[url.path]="/" ``` ## Disallow tab in URL ```url /foo\tbar/ ``` ```log off=5 error code=7 reason="Invalid characters in url" ``` ## Disallow form-feed in URL ```url /foo\fbar/ ``` ```log off=5 error code=7 reason="Invalid characters in url" ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285815.0 aiohttp-3.9.5/vendor/llhttp/tsconfig.base.json0000644000175100001770000000033714607525267021052 0ustar00runnerdocker{ "compilerOptions": { "strict": true, "target": "es2017", "module": "commonjs", "moduleResolution": "node", "outDir": "./lib", "declaration": true, "pretty": true, "sourceMap": true } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285815.0 aiohttp-3.9.5/vendor/llhttp/tsconfig.eslint.json0000644000175100001770000000011214607525267021425 0ustar00runnerdocker{ "extends": "./tsconfig.base.json", "include": [ "**/*.ts" ] } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713285815.0 aiohttp-3.9.5/vendor/llhttp/tsconfig.json0000644000175100001770000000011614607525267020134 0ustar00runnerdocker{ "extends": "./tsconfig.base.json", "include": [ "src/**/*.ts" ] }